shader_graph.cpp 92 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649
  1. /*************************************************************************/
  2. /* shader_graph.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* http://www.godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2015 Juan Linietsky, Ariel Manzur. */
  9. /* */
  10. /* Permission is hereby granted, free of charge, to any person obtaining */
  11. /* a copy of this software and associated documentation files (the */
  12. /* "Software"), to deal in the Software without restriction, including */
  13. /* without limitation the rights to use, copy, modify, merge, publish, */
  14. /* distribute, sublicense, and/or sell copies of the Software, and to */
  15. /* permit persons to whom the Software is furnished to do so, subject to */
  16. /* the following conditions: */
  17. /* */
  18. /* The above copyright notice and this permission notice shall be */
  19. /* included in all copies or substantial portions of the Software. */
  20. /* */
  21. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  22. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  23. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  24. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  25. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  26. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  27. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  28. /*************************************************************************/
  29. #include "shader_graph.h"
  30. #include "scene/scene_string_names.h"
  31. Array ShaderGraph::_get_node_list(ShaderType p_type) const {
  32. List<int> nodes;
  33. get_node_list(p_type,&nodes);
  34. Array arr(true);
  35. for (List<int>::Element *E=nodes.front();E;E=E->next())
  36. arr.push_back(E->get());
  37. return arr;
  38. }
  39. Array ShaderGraph::_get_connections(ShaderType p_type) const {
  40. List<Connection> connections;
  41. get_node_connections(p_type,&connections);
  42. Array arr(true);
  43. for (List<Connection>::Element *E=connections.front();E;E=E->next()) {
  44. Dictionary d(true);
  45. d["src_id"]=E->get().src_id;
  46. d["src_slot"]=E->get().src_slot;
  47. d["dst_id"]=E->get().dst_id;
  48. d["dst_slot"]=E->get().dst_slot;
  49. arr.push_back(d);
  50. }
  51. return arr;
  52. }
  53. void ShaderGraph::_set_data(const Dictionary &p_data) {
  54. Dictionary d=p_data;
  55. ERR_FAIL_COND(!d.has("shaders"));
  56. Array sh=d["shaders"];
  57. ERR_FAIL_COND(sh.size()!=3);
  58. for(int t=0;t<3;t++) {
  59. Array data=sh[t];
  60. ERR_FAIL_COND((data.size()%6)!=0);
  61. shader[t].node_map.clear();
  62. for(int i=0;i<data.size();i+=6) {
  63. Node n;
  64. n.id=data[i+0];
  65. n.type=NodeType(int(data[i+1]));
  66. n.pos=data[i+2];
  67. n.param1=data[i+3];
  68. n.param2=data[i+4];
  69. Array conns=data[i+5];
  70. ERR_FAIL_COND((conns.size()%3)!=0);
  71. for(int j=0;j<conns.size();j+=3) {
  72. SourceSlot ss;
  73. int ls=conns[j+0];
  74. if (ls == SLOT_DEFAULT_VALUE) {
  75. n.defaults[conns[j+1]]=conns[j+2];
  76. } else {
  77. ss.id=conns[j+1];
  78. ss.slot=conns[j+2];
  79. n.connections[ls]=ss;
  80. }
  81. }
  82. shader[t].node_map[n.id]=n;
  83. }
  84. }
  85. _pending_update_shader=true;
  86. _update_shader();
  87. }
  88. Dictionary ShaderGraph::_get_data() const {
  89. Array sh;
  90. for(int i=0;i<3;i++) {
  91. Array data;
  92. int ec = shader[i].node_map.size();
  93. data.resize(ec*6);
  94. int idx=0;
  95. for (Map<int,Node>::Element*E=shader[i].node_map.front();E;E=E->next()) {
  96. data[idx+0]=E->key();
  97. data[idx+1]=E->get().type;
  98. data[idx+2]=E->get().pos;
  99. data[idx+3]=E->get().param1;
  100. data[idx+4]=E->get().param2;
  101. Array conns;
  102. conns.resize(E->get().connections.size()*3+E->get().defaults.size()*3);
  103. int idx2=0;
  104. for(Map<int,SourceSlot>::Element*F=E->get().connections.front();F;F=F->next()) {
  105. conns[idx2+0]=F->key();
  106. conns[idx2+1]=F->get().id;
  107. conns[idx2+2]=F->get().slot;
  108. idx2+=3;
  109. }
  110. for(Map<int,Variant>::Element*F=E->get().defaults.front();F;F=F->next()) {
  111. conns[idx2+0]=SLOT_DEFAULT_VALUE;
  112. conns[idx2+1]=F->key();
  113. conns[idx2+2]=F->get();
  114. idx2+=3;
  115. }
  116. data[idx+5]=conns;
  117. idx+=6;
  118. }
  119. sh.push_back(data);
  120. }
  121. Dictionary data;
  122. data["shaders"]=sh;
  123. return data;
  124. }
  125. ShaderGraph::GraphError ShaderGraph::get_graph_error(ShaderType p_type) const {
  126. ERR_FAIL_INDEX_V(p_type,3,GRAPH_OK);
  127. return shader[p_type].error;
  128. }
  129. int ShaderGraph::node_count(ShaderType p_which, int p_type)
  130. {
  131. int count=0;
  132. for (Map<int,Node>::Element *E=shader[p_which].node_map.front();E;E=E->next())
  133. if (E->get().type==p_type)
  134. count++;
  135. return count;
  136. }
  137. void ShaderGraph::_bind_methods() {
  138. ObjectTypeDB::bind_method(_MD("_update_shader"),&ShaderGraph::_update_shader);
  139. ObjectTypeDB::bind_method(_MD("node_add","shader_type","node_type","id"),&ShaderGraph::node_add);
  140. ObjectTypeDB::bind_method(_MD("node_remove","shader_type","id"),&ShaderGraph::node_remove);
  141. ObjectTypeDB::bind_method(_MD("node_set_pos","shader_type","id","pos"),&ShaderGraph::node_set_pos);
  142. ObjectTypeDB::bind_method(_MD("node_get_pos","shader_type","id"),&ShaderGraph::node_get_pos);
  143. ObjectTypeDB::bind_method(_MD("node_get_type","shader_type","id"),&ShaderGraph::node_get_type);
  144. ObjectTypeDB::bind_method(_MD("get_node_list","shader_type"),&ShaderGraph::_get_node_list);
  145. ObjectTypeDB::bind_method(_MD("default_set_value","shader_type","id","param_id","value"), &ShaderGraph::default_set_value);
  146. ObjectTypeDB::bind_method(_MD("default_get_value","shader_type","id","param_id"), &ShaderGraph::default_get_value);
  147. ObjectTypeDB::bind_method(_MD("scalar_const_node_set_value","shader_type","id","value"),&ShaderGraph::scalar_const_node_set_value);
  148. ObjectTypeDB::bind_method(_MD("scalar_const_node_get_value","shader_type","id"),&ShaderGraph::scalar_const_node_get_value);
  149. ObjectTypeDB::bind_method(_MD("vec_const_node_set_value","shader_type","id","value"),&ShaderGraph::vec_const_node_set_value);
  150. ObjectTypeDB::bind_method(_MD("vec_const_node_get_value","shader_type","id"),&ShaderGraph::vec_const_node_get_value);
  151. ObjectTypeDB::bind_method(_MD("rgb_const_node_set_value","shader_type","id","value"),&ShaderGraph::rgb_const_node_set_value);
  152. ObjectTypeDB::bind_method(_MD("rgb_const_node_get_value","shader_type","id"),&ShaderGraph::rgb_const_node_get_value);
  153. ObjectTypeDB::bind_method(_MD("xform_const_node_set_value","shader_type","id","value"),&ShaderGraph::xform_const_node_set_value);
  154. ObjectTypeDB::bind_method(_MD("xform_const_node_get_value","shader_type","id"),&ShaderGraph::xform_const_node_get_value);
  155. // void get_node_list(ShaderType p_which,List<int> *p_node_list) const;
  156. ObjectTypeDB::bind_method(_MD("texture_node_set_filter_size","shader_type","id","filter_size"),&ShaderGraph::texture_node_set_filter_size);
  157. ObjectTypeDB::bind_method(_MD("texture_node_get_filter_size","shader_type","id"),&ShaderGraph::texture_node_get_filter_size);
  158. ObjectTypeDB::bind_method(_MD("texture_node_set_filter_strength","shader_type","id","filter_strength"),&ShaderGraph::texture_node_set_filter_strength);
  159. ObjectTypeDB::bind_method(_MD("texture_node_get_filter_strength","shader_type","id"),&ShaderGraph::texture_node_get_filter_strength);
  160. ObjectTypeDB::bind_method(_MD("scalar_op_node_set_op","shader_type","id","op"),&ShaderGraph::scalar_op_node_set_op);
  161. ObjectTypeDB::bind_method(_MD("scalar_op_node_get_op","shader_type","id"),&ShaderGraph::scalar_op_node_get_op);
  162. ObjectTypeDB::bind_method(_MD("vec_op_node_set_op","shader_type","id","op"),&ShaderGraph::vec_op_node_set_op);
  163. ObjectTypeDB::bind_method(_MD("vec_op_node_get_op","shader_type","id"),&ShaderGraph::vec_op_node_get_op);
  164. ObjectTypeDB::bind_method(_MD("vec_scalar_op_node_set_op","shader_type","id","op"),&ShaderGraph::vec_scalar_op_node_set_op);
  165. ObjectTypeDB::bind_method(_MD("vec_scalar_op_node_get_op","shader_type","id"),&ShaderGraph::vec_scalar_op_node_get_op);
  166. ObjectTypeDB::bind_method(_MD("rgb_op_node_set_op","shader_type","id","op"),&ShaderGraph::rgb_op_node_set_op);
  167. ObjectTypeDB::bind_method(_MD("rgb_op_node_get_op","shader_type","id"),&ShaderGraph::rgb_op_node_get_op);
  168. ObjectTypeDB::bind_method(_MD("xform_vec_mult_node_set_no_translation","shader_type","id","disable"),&ShaderGraph::xform_vec_mult_node_set_no_translation);
  169. ObjectTypeDB::bind_method(_MD("xform_vec_mult_node_get_no_translation","shader_type","id"),&ShaderGraph::xform_vec_mult_node_get_no_translation);
  170. ObjectTypeDB::bind_method(_MD("scalar_func_node_set_function","shader_type","id","func"),&ShaderGraph::scalar_func_node_set_function);
  171. ObjectTypeDB::bind_method(_MD("scalar_func_node_get_function","shader_type","id"),&ShaderGraph::scalar_func_node_get_function);
  172. ObjectTypeDB::bind_method(_MD("vec_func_node_set_function","shader_type","id","func"),&ShaderGraph::vec_func_node_set_function);
  173. ObjectTypeDB::bind_method(_MD("vec_func_node_get_function","shader_type","id"),&ShaderGraph::vec_func_node_get_function);
  174. ObjectTypeDB::bind_method(_MD("input_node_set_name","shader_type","id","name"),&ShaderGraph::input_node_set_name);
  175. ObjectTypeDB::bind_method(_MD("input_node_get_name","shader_type","id"),&ShaderGraph::input_node_get_name);
  176. ObjectTypeDB::bind_method(_MD("scalar_input_node_set_value","shader_type","id","value"),&ShaderGraph::scalar_input_node_set_value);
  177. ObjectTypeDB::bind_method(_MD("scalar_input_node_get_value","shader_type","id"),&ShaderGraph::scalar_input_node_get_value);
  178. ObjectTypeDB::bind_method(_MD("vec_input_node_set_value","shader_type","id","value"),&ShaderGraph::vec_input_node_set_value);
  179. ObjectTypeDB::bind_method(_MD("vec_input_node_get_value","shader_type","id"),&ShaderGraph::vec_input_node_get_value);
  180. ObjectTypeDB::bind_method(_MD("rgb_input_node_set_value","shader_type","id","value"),&ShaderGraph::rgb_input_node_set_value);
  181. ObjectTypeDB::bind_method(_MD("rgb_input_node_get_value","shader_type","id"),&ShaderGraph::rgb_input_node_get_value);
  182. ObjectTypeDB::bind_method(_MD("xform_input_node_set_value","shader_type","id","value"),&ShaderGraph::xform_input_node_set_value);
  183. ObjectTypeDB::bind_method(_MD("xform_input_node_get_value","shader_type","id"),&ShaderGraph::xform_input_node_get_value);
  184. ObjectTypeDB::bind_method(_MD("texture_input_node_set_value","shader_type","id","value:Texture"),&ShaderGraph::texture_input_node_set_value);
  185. ObjectTypeDB::bind_method(_MD("texture_input_node_get_value:Texture","shader_type","id"),&ShaderGraph::texture_input_node_get_value);
  186. ObjectTypeDB::bind_method(_MD("cubemap_input_node_set_value","shader_type","id","value:CubeMap"),&ShaderGraph::cubemap_input_node_set_value);
  187. ObjectTypeDB::bind_method(_MD("cubemap_input_node_get_value:CubeMap","shader_type","id"),&ShaderGraph::cubemap_input_node_get_value);
  188. ObjectTypeDB::bind_method(_MD("comment_node_set_text","shader_type","id","text"),&ShaderGraph::comment_node_set_text);
  189. ObjectTypeDB::bind_method(_MD("comment_node_get_text","shader_type","id"),&ShaderGraph::comment_node_get_text);
  190. ObjectTypeDB::bind_method(_MD("color_ramp_node_set_ramp","shader_type","id","colors","offsets"),&ShaderGraph::color_ramp_node_set_ramp);
  191. ObjectTypeDB::bind_method(_MD("color_ramp_node_get_colors","shader_type","id"),&ShaderGraph::color_ramp_node_get_colors);
  192. ObjectTypeDB::bind_method(_MD("color_ramp_node_get_offsets","shader_type","id"),&ShaderGraph::color_ramp_node_get_offsets);
  193. ObjectTypeDB::bind_method(_MD("curve_map_node_set_points","shader_type","id","points"),&ShaderGraph::curve_map_node_set_points);
  194. ObjectTypeDB::bind_method(_MD("curve_map_node_get_points","shader_type","id"),&ShaderGraph::curve_map_node_get_points);
  195. ObjectTypeDB::bind_method(_MD("connect_node:Error","shader_type","src_id","src_slot","dst_id","dst_slot"),&ShaderGraph::connect_node);
  196. ObjectTypeDB::bind_method(_MD("is_node_connected","shader_type","src_id","src_slot","dst_id","dst_slot"),&ShaderGraph::is_node_connected);
  197. ObjectTypeDB::bind_method(_MD("disconnect_node","shader_type","src_id","src_slot","dst_id","dst_slot"),&ShaderGraph::disconnect_node);
  198. ObjectTypeDB::bind_method(_MD("get_node_connections","shader_type"),&ShaderGraph::_get_connections);
  199. ObjectTypeDB::bind_method(_MD("clear","shader_type"),&ShaderGraph::clear);
  200. ObjectTypeDB::bind_method(_MD("node_set_state","shader_type","id","state"),&ShaderGraph::node_set_state);
  201. ObjectTypeDB::bind_method(_MD("node_get_state:Variant","shader_type","id"),&ShaderGraph::node_get_state);
  202. ObjectTypeDB::bind_method(_MD("_set_data"),&ShaderGraph::_set_data);
  203. ObjectTypeDB::bind_method(_MD("_get_data"),&ShaderGraph::_get_data);
  204. ADD_PROPERTY( PropertyInfo(Variant::DICTIONARY,"_data",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR), _SCS("_set_data"),_SCS("_get_data"));
  205. //void get_connections(ShaderType p_which,List<Connection> *p_connections) const;
  206. BIND_CONSTANT( NODE_INPUT ); // all inputs (shader type dependent)
  207. BIND_CONSTANT( NODE_SCALAR_CONST ); //scalar constant
  208. BIND_CONSTANT( NODE_VEC_CONST ); //vec3 constant
  209. BIND_CONSTANT( NODE_RGB_CONST ); //rgb constant (shows a color picker instead)
  210. BIND_CONSTANT( NODE_XFORM_CONST ); // 4x4 matrix constant
  211. BIND_CONSTANT( NODE_TIME ); // time in seconds
  212. BIND_CONSTANT( NODE_SCREEN_TEX ); // screen texture sampler (takes UV) (only usable in fragment shader)
  213. BIND_CONSTANT( NODE_SCALAR_OP ); // scalar vs scalar op (mul ); add ); div ); etc)
  214. BIND_CONSTANT( NODE_VEC_OP ); // vec3 vs vec3 op (mul );ad );div );crossprod );etc)
  215. BIND_CONSTANT( NODE_VEC_SCALAR_OP ); // vec3 vs scalar op (mul ); add ); div ); etc)
  216. BIND_CONSTANT( NODE_RGB_OP ); // vec3 vs vec3 rgb op (with scalar amount) ); like brighten ); darken ); burn ); dodge ); multiply ); etc.
  217. BIND_CONSTANT( NODE_XFORM_MULT ); // mat4 x mat4
  218. BIND_CONSTANT( NODE_XFORM_VEC_MULT ); // mat4 x vec3 mult (with no-translation option)
  219. BIND_CONSTANT( NODE_XFORM_VEC_INV_MULT ); // mat4 x vec3 inverse mult (with no-translation option)
  220. BIND_CONSTANT( NODE_SCALAR_FUNC ); // scalar function (sin ); cos ); etc)
  221. BIND_CONSTANT( NODE_VEC_FUNC ); // vector function (normalize ); negate ); reciprocal ); rgb2hsv ); hsv2rgb ); etc ); etc)
  222. BIND_CONSTANT( NODE_VEC_LEN ); // vec3 length
  223. BIND_CONSTANT( NODE_DOT_PROD ); // vec3 . vec3 (dot product -> scalar output)
  224. BIND_CONSTANT( NODE_VEC_TO_SCALAR ); // 1 vec3 input ); 3 scalar outputs
  225. BIND_CONSTANT( NODE_SCALAR_TO_VEC ); // 3 scalar input ); 1 vec3 output
  226. BIND_CONSTANT( NODE_VEC_TO_XFORM ); // 3 vec input ); 1 xform output
  227. BIND_CONSTANT( NODE_XFORM_TO_VEC ); // 3 vec input ); 1 xform output
  228. BIND_CONSTANT( NODE_SCALAR_INTERP ); // scalar interpolation (with optional curve)
  229. BIND_CONSTANT( NODE_VEC_INTERP ); // vec3 interpolation (with optional curve)
  230. BIND_CONSTANT( NODE_COLOR_RAMP );
  231. BIND_CONSTANT( NODE_CURVE_MAP );
  232. BIND_CONSTANT( NODE_SCALAR_INPUT ); // scalar uniform (assignable in material)
  233. BIND_CONSTANT( NODE_VEC_INPUT ); // vec3 uniform (assignable in material)
  234. BIND_CONSTANT( NODE_RGB_INPUT ); // color uniform (assignable in material)
  235. BIND_CONSTANT( NODE_XFORM_INPUT ); // mat4 uniform (assignable in material)
  236. BIND_CONSTANT( NODE_TEXTURE_INPUT ); // texture input (assignable in material)
  237. BIND_CONSTANT( NODE_CUBEMAP_INPUT ); // cubemap input (assignable in material)
  238. BIND_CONSTANT( NODE_DEFAULT_TEXTURE );
  239. BIND_CONSTANT( NODE_OUTPUT ); // output (shader type dependent)
  240. BIND_CONSTANT( NODE_COMMENT ); // comment
  241. BIND_CONSTANT( NODE_TYPE_MAX );
  242. BIND_CONSTANT( SLOT_TYPE_SCALAR );
  243. BIND_CONSTANT( SLOT_TYPE_VEC );
  244. BIND_CONSTANT( SLOT_TYPE_XFORM );
  245. BIND_CONSTANT( SLOT_TYPE_TEXTURE );
  246. BIND_CONSTANT( SLOT_MAX );
  247. BIND_CONSTANT( SHADER_TYPE_VERTEX );
  248. BIND_CONSTANT( SHADER_TYPE_FRAGMENT );
  249. BIND_CONSTANT( SHADER_TYPE_LIGHT );
  250. BIND_CONSTANT( SHADER_TYPE_MAX );
  251. BIND_CONSTANT( SLOT_IN );
  252. BIND_CONSTANT( SLOT_OUT );
  253. BIND_CONSTANT( GRAPH_OK );
  254. BIND_CONSTANT( GRAPH_ERROR_CYCLIC );
  255. BIND_CONSTANT( GRAPH_ERROR_MISSING_CONNECTIONS );
  256. BIND_CONSTANT( SCALAR_OP_ADD );
  257. BIND_CONSTANT( SCALAR_OP_SUB );
  258. BIND_CONSTANT( SCALAR_OP_MUL );
  259. BIND_CONSTANT( SCALAR_OP_DIV );
  260. BIND_CONSTANT( SCALAR_OP_MOD );
  261. BIND_CONSTANT( SCALAR_OP_POW );
  262. BIND_CONSTANT( SCALAR_OP_MAX );
  263. BIND_CONSTANT( SCALAR_OP_MIN );
  264. BIND_CONSTANT( SCALAR_OP_ATAN2 );
  265. BIND_CONSTANT( SCALAR_MAX_OP );
  266. BIND_CONSTANT( VEC_OP_ADD );
  267. BIND_CONSTANT( VEC_OP_SUB );
  268. BIND_CONSTANT( VEC_OP_MUL );
  269. BIND_CONSTANT( VEC_OP_DIV );
  270. BIND_CONSTANT( VEC_OP_MOD );
  271. BIND_CONSTANT( VEC_OP_POW );
  272. BIND_CONSTANT( VEC_OP_MAX );
  273. BIND_CONSTANT( VEC_OP_MIN );
  274. BIND_CONSTANT( VEC_OP_CROSS );
  275. BIND_CONSTANT( VEC_MAX_OP );
  276. BIND_CONSTANT( VEC_SCALAR_OP_MUL );
  277. BIND_CONSTANT( VEC_SCALAR_OP_DIV );
  278. BIND_CONSTANT( VEC_SCALAR_OP_POW );
  279. BIND_CONSTANT( VEC_SCALAR_MAX_OP );
  280. BIND_CONSTANT( RGB_OP_SCREEN );
  281. BIND_CONSTANT( RGB_OP_DIFFERENCE );
  282. BIND_CONSTANT( RGB_OP_DARKEN );
  283. BIND_CONSTANT( RGB_OP_LIGHTEN );
  284. BIND_CONSTANT( RGB_OP_OVERLAY );
  285. BIND_CONSTANT( RGB_OP_DODGE );
  286. BIND_CONSTANT( RGB_OP_BURN );
  287. BIND_CONSTANT( RGB_OP_SOFT_LIGHT );
  288. BIND_CONSTANT( RGB_OP_HARD_LIGHT );
  289. BIND_CONSTANT( RGB_MAX_OP );
  290. BIND_CONSTANT( SCALAR_FUNC_SIN );
  291. BIND_CONSTANT( SCALAR_FUNC_COS );
  292. BIND_CONSTANT( SCALAR_FUNC_TAN );
  293. BIND_CONSTANT( SCALAR_FUNC_ASIN );
  294. BIND_CONSTANT( SCALAR_FUNC_ACOS );
  295. BIND_CONSTANT( SCALAR_FUNC_ATAN );
  296. BIND_CONSTANT( SCALAR_FUNC_SINH );
  297. BIND_CONSTANT( SCALAR_FUNC_COSH );
  298. BIND_CONSTANT( SCALAR_FUNC_TANH );
  299. BIND_CONSTANT( SCALAR_FUNC_LOG );
  300. BIND_CONSTANT( SCALAR_FUNC_EXP );
  301. BIND_CONSTANT( SCALAR_FUNC_SQRT );
  302. BIND_CONSTANT( SCALAR_FUNC_ABS );
  303. BIND_CONSTANT( SCALAR_FUNC_SIGN );
  304. BIND_CONSTANT( SCALAR_FUNC_FLOOR );
  305. BIND_CONSTANT( SCALAR_FUNC_ROUND );
  306. BIND_CONSTANT( SCALAR_FUNC_CEIL );
  307. BIND_CONSTANT( SCALAR_FUNC_FRAC );
  308. BIND_CONSTANT( SCALAR_FUNC_SATURATE );
  309. BIND_CONSTANT( SCALAR_FUNC_NEGATE );
  310. BIND_CONSTANT( SCALAR_MAX_FUNC );
  311. BIND_CONSTANT( VEC_FUNC_NORMALIZE );
  312. BIND_CONSTANT( VEC_FUNC_SATURATE );
  313. BIND_CONSTANT( VEC_FUNC_NEGATE );
  314. BIND_CONSTANT( VEC_FUNC_RECIPROCAL );
  315. BIND_CONSTANT( VEC_FUNC_RGB2HSV );
  316. BIND_CONSTANT( VEC_FUNC_HSV2RGB );
  317. BIND_CONSTANT( VEC_MAX_FUNC );
  318. ADD_SIGNAL(MethodInfo("updated"));
  319. #if 0
  320. ObjectTypeDB::bind_method(_MD("node_add"),&ShaderGraph::node_add );
  321. ObjectTypeDB::bind_method(_MD("node_remove"),&ShaderGraph::node_remove );
  322. ObjectTypeDB::bind_method(_MD("node_set_param"),&ShaderGraph::node_set_param );
  323. ObjectTypeDB::bind_method(_MD("node_set_pos"),&ShaderGraph::node_set_pos );
  324. ObjectTypeDB::bind_method(_MD("node_get_pos"),&ShaderGraph::node_get_pos );
  325. ObjectTypeDB::bind_method(_MD("node_get_param"),&ShaderGraph::node_get_param);
  326. ObjectTypeDB::bind_method(_MD("node_get_type"),&ShaderGraph::node_get_type);
  327. ObjectTypeDB::bind_method(_MD("connect"),&ShaderGraph::connect );
  328. ObjectTypeDB::bind_method(_MD("disconnect"),&ShaderGraph::disconnect );
  329. ObjectTypeDB::bind_method(_MD("get_connections"),&ShaderGraph::_get_connections_helper );
  330. ObjectTypeDB::bind_method(_MD("clear"),&ShaderGraph::clear );
  331. BIND_CONSTANT( NODE_IN ); ///< param 0: name
  332. BIND_CONSTANT( NODE_OUT ); ///< param 0: name
  333. BIND_CONSTANT( NODE_CONSTANT ); ///< param 0: value
  334. BIND_CONSTANT( NODE_PARAMETER ); ///< param 0: name
  335. BIND_CONSTANT( NODE_ADD );
  336. BIND_CONSTANT( NODE_SUB );
  337. BIND_CONSTANT( NODE_MUL );
  338. BIND_CONSTANT( NODE_DIV );
  339. BIND_CONSTANT( NODE_MOD );
  340. BIND_CONSTANT( NODE_SIN );
  341. BIND_CONSTANT( NODE_COS );
  342. BIND_CONSTANT( NODE_TAN );
  343. BIND_CONSTANT( NODE_ARCSIN );
  344. BIND_CONSTANT( NODE_ARCCOS );
  345. BIND_CONSTANT( NODE_ARCTAN );
  346. BIND_CONSTANT( NODE_POW );
  347. BIND_CONSTANT( NODE_LOG );
  348. BIND_CONSTANT( NODE_MAX );
  349. BIND_CONSTANT( NODE_MIN );
  350. BIND_CONSTANT( NODE_COMPARE );
  351. BIND_CONSTANT( NODE_TEXTURE ); ///< param 0: texture
  352. BIND_CONSTANT( NODE_TIME ); ///< param 0: interval length
  353. BIND_CONSTANT( NODE_NOISE );
  354. BIND_CONSTANT( NODE_PASS );
  355. BIND_CONSTANT( NODE_VEC_IN ); ///< param 0: name
  356. BIND_CONSTANT( NODE_VEC_OUT ); ///< param 0: name
  357. BIND_CONSTANT( NODE_VEC_CONSTANT ); ///< param 0: value
  358. BIND_CONSTANT( NODE_VEC_PARAMETER ); ///< param 0: name
  359. BIND_CONSTANT( NODE_VEC_ADD );
  360. BIND_CONSTANT( NODE_VEC_SUB );
  361. BIND_CONSTANT( NODE_VEC_MUL );
  362. BIND_CONSTANT( NODE_VEC_DIV );
  363. BIND_CONSTANT( NODE_VEC_MOD );
  364. BIND_CONSTANT( NODE_VEC_CROSS );
  365. BIND_CONSTANT( NODE_VEC_DOT );
  366. BIND_CONSTANT( NODE_VEC_POW );
  367. BIND_CONSTANT( NODE_VEC_NORMALIZE );
  368. BIND_CONSTANT( NODE_VEC_TRANSFORM3 );
  369. BIND_CONSTANT( NODE_VEC_TRANSFORM4 );
  370. BIND_CONSTANT( NODE_VEC_COMPARE );
  371. BIND_CONSTANT( NODE_VEC_TEXTURE_2D );
  372. BIND_CONSTANT( NODE_VEC_TEXTURE_CUBE );
  373. BIND_CONSTANT( NODE_VEC_NOISE );
  374. BIND_CONSTANT( NODE_VEC_0 );
  375. BIND_CONSTANT( NODE_VEC_1 );
  376. BIND_CONSTANT( NODE_VEC_2 );
  377. BIND_CONSTANT( NODE_VEC_BUILD );
  378. BIND_CONSTANT( NODE_VEC_PASS );
  379. BIND_CONSTANT( NODE_COLOR_CONSTANT );
  380. BIND_CONSTANT( NODE_COLOR_PARAMETER );
  381. BIND_CONSTANT( NODE_TEXTURE_PARAMETER );
  382. BIND_CONSTANT( NODE_TEXTURE_2D_PARAMETER );
  383. BIND_CONSTANT( NODE_TEXTURE_CUBE_PARAMETER );
  384. BIND_CONSTANT( NODE_TYPE_MAX );
  385. #endif
  386. }
  387. String ShaderGraph::_find_unique_name(const String& p_base) {
  388. int idx=1;
  389. while(true) {
  390. String tocmp=p_base;
  391. if (idx>1) {
  392. tocmp+="_"+itos(idx);
  393. }
  394. bool valid=true;
  395. for(int i=0;i<3;i++) {
  396. if (!valid)
  397. break;
  398. for (Map<int,Node>::Element *E=shader[i].node_map.front();E;E=E->next()) {
  399. if (E->get().type!=NODE_SCALAR_INPUT && E->get().type!=NODE_VEC_INPUT && E->get().type==NODE_RGB_INPUT && E->get().type==NODE_XFORM_INPUT && E->get().type==NODE_TEXTURE_INPUT && E->get().type==NODE_CUBEMAP_INPUT)
  400. continue;
  401. String name = E->get().param1;
  402. if (name==tocmp) {
  403. valid=false;
  404. break;
  405. }
  406. }
  407. }
  408. if (!valid) {
  409. idx++;
  410. continue;
  411. }
  412. return tocmp;
  413. }
  414. return String();
  415. }
  416. void ShaderGraph::node_add(ShaderType p_type, NodeType p_node_type,int p_id) {
  417. ERR_FAIL_INDEX(p_type,3);
  418. ERR_FAIL_COND(p_id==0);
  419. ERR_FAIL_COND(p_node_type==NODE_OUTPUT); //can't create output
  420. ERR_FAIL_COND( shader[p_type].node_map.has(p_id ) );
  421. ERR_FAIL_INDEX( p_node_type, NODE_TYPE_MAX );
  422. Node node;
  423. if (p_node_type==NODE_INPUT) {
  424. //see if it already exists
  425. for(Map<int,Node>::Element *E=shader[p_type].node_map.front();E;E=E->next()) {
  426. if (E->get().type==NODE_INPUT) {
  427. ERR_EXPLAIN("Only one input node can be added to the graph.");
  428. ERR_FAIL_COND(E->get().type==NODE_INPUT);
  429. }
  430. }
  431. }
  432. node.type=p_node_type;
  433. node.id=p_id;
  434. switch(p_node_type) {
  435. case NODE_INPUT: {} break; // all inputs (shader type dependent)
  436. case NODE_SCALAR_CONST: { node.param1=0;} break; //scalar constant
  437. case NODE_VEC_CONST: {node.param1=Vector3();} break; //vec3 constant
  438. case NODE_RGB_CONST: {node.param1=Color();} break; //rgb constant (shows a color picker instead)
  439. case NODE_XFORM_CONST: {node.param1=Transform();} break; // 4x4 matrix constant
  440. case NODE_TIME: {} break; // time in seconds
  441. case NODE_SCREEN_TEX: {Array arr; arr.push_back(0); arr.push_back(0); node.param2=arr;} break; // screen texture sampler (takes UV) (only usable in fragment shader)
  442. case NODE_SCALAR_OP: {node.param1=SCALAR_OP_ADD;} break; // scalar vs scalar op (mul: {} break; add: {} break; div: {} break; etc)
  443. case NODE_VEC_OP: {node.param1=VEC_OP_ADD;} break; // vec3 vs vec3 op (mul: {} break;ad: {} break;div: {} break;crossprod: {} break;etc)
  444. case NODE_VEC_SCALAR_OP: {node.param1=VEC_SCALAR_OP_MUL;} break; // vec3 vs scalar op (mul: {} break; add: {} break; div: {} break; etc)
  445. case NODE_RGB_OP: {node.param1=RGB_OP_SCREEN;} break; // vec3 vs vec3 rgb op (with scalar amount): {} break; like brighten: {} break; darken: {} break; burn: {} break; dodge: {} break; multiply: {} break; etc.
  446. case NODE_XFORM_MULT: {} break; // mat4 x mat4
  447. case NODE_XFORM_VEC_MULT: {} break; // mat4 x vec3 mult (with no-translation option)
  448. case NODE_XFORM_VEC_INV_MULT: {} break; // mat4 x vec3 inverse mult (with no-translation option)
  449. case NODE_SCALAR_FUNC: {node.param1=SCALAR_FUNC_SIN;} break; // scalar function (sin: {} break; cos: {} break; etc)
  450. case NODE_VEC_FUNC: {node.param1=VEC_FUNC_NORMALIZE;} break; // vector function (normalize: {} break; negate: {} break; reciprocal: {} break; rgb2hsv: {} break; hsv2rgb: {} break; etc: {} break; etc)
  451. case NODE_VEC_LEN: {} break; // vec3 length
  452. case NODE_DOT_PROD: {} break; // vec3 . vec3 (dot product -> scalar output)
  453. case NODE_VEC_TO_SCALAR: {} break; // 1 vec3 input: {} break; 3 scalar outputs
  454. case NODE_SCALAR_TO_VEC: {} break; // 3 scalar input: {} break; 1 vec3 output
  455. case NODE_VEC_TO_XFORM: {} break; // 3 scalar input: {} break; 1 vec3 output
  456. case NODE_XFORM_TO_VEC: {} break; // 3 scalar input: {} break; 1 vec3 output
  457. case NODE_SCALAR_INTERP: {} break; // scalar interpolation (with optional curve)
  458. case NODE_VEC_INTERP: {} break; // vec3 interpolation (with optional curve)
  459. case NODE_COLOR_RAMP: { node.param1=DVector<Color>(); node.param2=DVector<real_t>();} break; // vec3 interpolation (with optional curve)
  460. case NODE_CURVE_MAP: { node.param1=DVector<Vector2>();} break; // vec3 interpolation (with optional curve)
  461. case NODE_SCALAR_INPUT: {node.param1=_find_unique_name("Scalar"); node.param2=0;} break; // scalar uniform (assignable in material)
  462. case NODE_VEC_INPUT: {node.param1=_find_unique_name("Vec3");node.param2=Vector3();} break; // vec3 uniform (assignable in material)
  463. case NODE_RGB_INPUT: {node.param1=_find_unique_name("Color");node.param2=Color();} break; // color uniform (assignable in material)
  464. case NODE_XFORM_INPUT: {node.param1=_find_unique_name("XForm"); node.param2=Transform();} break; // mat4 uniform (assignable in material)
  465. case NODE_TEXTURE_INPUT: {node.param1=_find_unique_name("Tex"); } break; // texture input (assignable in material)
  466. case NODE_CUBEMAP_INPUT: {node.param1=_find_unique_name("Cube"); } break; // cubemap input (assignable in material)
  467. case NODE_DEFAULT_TEXTURE: {}; break;
  468. case NODE_OUTPUT: {} break; // output (shader type dependent)
  469. case NODE_COMMENT: {} break; // comment
  470. case NODE_TYPE_MAX: {};
  471. }
  472. shader[p_type].node_map[p_id]=node;
  473. _request_update();
  474. }
  475. void ShaderGraph::node_set_pos(ShaderType p_type,int p_id, const Vector2& p_pos) {
  476. ERR_FAIL_INDEX(p_type,3);
  477. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  478. shader[p_type].node_map[p_id].pos=p_pos;
  479. _request_update();
  480. }
  481. Vector2 ShaderGraph::node_get_pos(ShaderType p_type,int p_id) const {
  482. ERR_FAIL_INDEX_V(p_type,3,Vector2());
  483. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),Vector2());
  484. return shader[p_type].node_map[p_id].pos;
  485. }
  486. void ShaderGraph::node_remove(ShaderType p_type,int p_id) {
  487. ERR_FAIL_COND(p_id==0);
  488. ERR_FAIL_INDEX(p_type,3);
  489. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  490. //erase connections associated with node
  491. for(Map<int,Node>::Element *E=shader[p_type].node_map.front();E;E=E->next()) {
  492. if (E->key()==p_id)
  493. continue; //no self
  494. for (Map<int,SourceSlot>::Element *F=E->get().connections.front();F;) {
  495. Map<int,SourceSlot>::Element *N=F->next();
  496. if (F->get().id==p_id) {
  497. E->get().connections.erase(F);
  498. }
  499. F=N;
  500. }
  501. }
  502. shader[p_type].node_map.erase(p_id);
  503. _request_update();
  504. }
  505. void ShaderGraph::get_node_list(ShaderType p_type,List<int> *p_node_list) const {
  506. ERR_FAIL_INDEX(p_type,3);
  507. Map<int,Node>::Element *E = shader[p_type].node_map.front();
  508. while(E) {
  509. p_node_list->push_back(E->key());
  510. E=E->next();
  511. }
  512. }
  513. ShaderGraph::NodeType ShaderGraph::node_get_type(ShaderType p_type,int p_id) const {
  514. ERR_FAIL_INDEX_V(p_type,3,NODE_TYPE_MAX);
  515. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),NODE_TYPE_MAX);
  516. return shader[p_type].node_map[p_id].type;
  517. }
  518. Error ShaderGraph::connect_node(ShaderType p_type,int p_src_id,int p_src_slot, int p_dst_id,int p_dst_slot) {
  519. ERR_FAIL_INDEX_V(p_type,3,ERR_INVALID_PARAMETER);
  520. ERR_FAIL_COND_V(p_src_id==p_dst_id, ERR_INVALID_PARAMETER);
  521. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_src_id), ERR_INVALID_PARAMETER);
  522. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_dst_id), ERR_INVALID_PARAMETER);
  523. NodeType type_src=shader[p_type].node_map[p_src_id].type;
  524. NodeType type_dst=shader[p_type].node_map[p_dst_id].type;
  525. ERR_FAIL_INDEX_V( p_src_slot, get_node_output_slot_count(get_mode(),p_type,type_src), ERR_INVALID_PARAMETER );
  526. ERR_FAIL_INDEX_V( p_dst_slot, get_node_input_slot_count(get_mode(),p_type,type_dst), ERR_INVALID_PARAMETER );
  527. ERR_FAIL_COND_V(get_node_output_slot_type(get_mode(),p_type,type_src,p_src_slot) != get_node_input_slot_type(get_mode(),p_type,type_dst,p_dst_slot), ERR_INVALID_PARAMETER );
  528. SourceSlot ts;
  529. ts.id=p_src_id;
  530. ts.slot=p_src_slot;
  531. shader[p_type].node_map[p_dst_id].connections[p_dst_slot]=ts;
  532. _request_update();
  533. return OK;
  534. }
  535. bool ShaderGraph::is_node_connected(ShaderType p_type,int p_src_id,int p_src_slot, int p_dst_id,int p_dst_slot) const {
  536. ERR_FAIL_INDEX_V(p_type,3,false);
  537. SourceSlot ts;
  538. ts.id=p_src_id;
  539. ts.slot=p_src_slot;
  540. return shader[p_type].node_map.has(p_dst_id) && shader[p_type].node_map[p_dst_id].connections.has(p_dst_slot) &&
  541. shader[p_type].node_map[p_dst_id].connections[p_dst_slot]==ts;
  542. }
  543. void ShaderGraph::disconnect_node(ShaderType p_type,int p_src_id,int p_src_slot, int p_dst_id,int p_dst_slot) {
  544. ERR_FAIL_INDEX(p_type,3);
  545. SourceSlot ts;
  546. ts.id=p_src_id;
  547. ts.slot=p_src_slot;
  548. if (shader[p_type].node_map.has(p_dst_id) && shader[p_type].node_map[p_dst_id].connections.has(p_dst_slot) &&
  549. shader[p_type].node_map[p_dst_id].connections[p_dst_slot]==ts) {
  550. shader[p_type].node_map[p_dst_id].connections.erase(p_dst_slot);
  551. }
  552. _request_update();
  553. }
  554. void ShaderGraph::get_node_connections(ShaderType p_type,List<Connection> *p_connections) const {
  555. ERR_FAIL_INDEX(p_type,3);
  556. for(const Map<int,Node>::Element *E=shader[p_type].node_map.front();E;E=E->next()) {
  557. for (const Map<int,SourceSlot>::Element *F=E->get().connections.front();F;F=F->next()) {
  558. Connection c;
  559. c.dst_id=E->key();
  560. c.dst_slot=F->key();
  561. c.src_id=F->get().id;
  562. c.src_slot=F->get().slot;
  563. p_connections->push_back(c);
  564. }
  565. }
  566. }
  567. bool ShaderGraph::is_slot_connected(ShaderGraph::ShaderType p_type, int p_dst_id, int slot_id)
  568. {
  569. for(const Map<int,Node>::Element *E=shader[p_type].node_map.front();E;E=E->next()) {
  570. for (const Map<int,SourceSlot>::Element *F=E->get().connections.front();F;F=F->next()) {
  571. if (p_dst_id == E->key() && slot_id==F->key())
  572. return true;
  573. }
  574. }
  575. return false;
  576. }
  577. void ShaderGraph::clear(ShaderType p_type) {
  578. ERR_FAIL_INDEX(p_type,3);
  579. shader[p_type].node_map.clear();
  580. Node out;
  581. out.pos=Vector2(300,300);
  582. out.type=NODE_OUTPUT;
  583. shader[p_type].node_map.insert(0,out);
  584. _request_update();
  585. }
  586. void ShaderGraph::scalar_const_node_set_value(ShaderType p_type,int p_id,float p_value) {
  587. ERR_FAIL_INDEX(p_type,3);
  588. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  589. Node& n = shader[p_type].node_map[p_id];
  590. ERR_FAIL_COND(n.type!=NODE_SCALAR_CONST);
  591. n.param1=p_value;
  592. _request_update();
  593. }
  594. float ShaderGraph::scalar_const_node_get_value(ShaderType p_type,int p_id) const{
  595. ERR_FAIL_INDEX_V(p_type,3,0);
  596. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),0);
  597. const Node& n = shader[p_type].node_map[p_id];
  598. ERR_FAIL_COND_V(n.type!=NODE_SCALAR_CONST,0);
  599. return n.param1;
  600. }
  601. void ShaderGraph::vec_const_node_set_value(ShaderType p_type,int p_id,const Vector3& p_value){
  602. ERR_FAIL_INDEX(p_type,3);
  603. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  604. Node& n = shader[p_type].node_map[p_id];
  605. ERR_FAIL_COND(n.type!=NODE_VEC_CONST);
  606. n.param1=p_value;
  607. _request_update();
  608. }
  609. Vector3 ShaderGraph::vec_const_node_get_value(ShaderType p_type,int p_id) const{
  610. ERR_FAIL_INDEX_V(p_type,3,Vector3());
  611. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),Vector3());
  612. const Node& n = shader[p_type].node_map[p_id];
  613. ERR_FAIL_COND_V(n.type!=NODE_VEC_CONST,Vector3());
  614. return n.param1;
  615. }
  616. void ShaderGraph::rgb_const_node_set_value(ShaderType p_type,int p_id,const Color& p_value){
  617. ERR_FAIL_INDEX(p_type,3);
  618. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  619. Node& n = shader[p_type].node_map[p_id];
  620. ERR_FAIL_COND(n.type!=NODE_RGB_CONST);
  621. n.param1=p_value;
  622. _request_update();
  623. }
  624. Color ShaderGraph::rgb_const_node_get_value(ShaderType p_type,int p_id) const{
  625. ERR_FAIL_INDEX_V(p_type,3,Color());
  626. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),Color());
  627. const Node& n = shader[p_type].node_map[p_id];
  628. ERR_FAIL_COND_V(n.type!=NODE_RGB_CONST,Color());
  629. return n.param1;
  630. }
  631. void ShaderGraph::xform_const_node_set_value(ShaderType p_type,int p_id,const Transform& p_value){
  632. ERR_FAIL_INDEX(p_type,3);
  633. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  634. Node& n = shader[p_type].node_map[p_id];
  635. ERR_FAIL_COND(n.type!=NODE_XFORM_CONST);
  636. n.param1=p_value;
  637. _request_update();
  638. }
  639. Transform ShaderGraph::xform_const_node_get_value(ShaderType p_type,int p_id) const{
  640. ERR_FAIL_INDEX_V(p_type,3,Transform());
  641. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),Transform());
  642. const Node& n = shader[p_type].node_map[p_id];
  643. ERR_FAIL_COND_V(n.type!=NODE_XFORM_CONST,Transform());
  644. return n.param1;
  645. }
  646. void ShaderGraph::texture_node_set_filter_size(ShaderType p_type,int p_id,int p_size){
  647. ERR_FAIL_INDEX(p_type,3);
  648. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  649. Node& n = shader[p_type].node_map[p_id];
  650. ERR_FAIL_COND(n.type!=NODE_TEXTURE_INPUT && n.type!=NODE_SCREEN_TEX);
  651. Array arr = n.param2;
  652. arr[0]=p_size;
  653. n.param2=arr;
  654. _request_update();
  655. }
  656. int ShaderGraph::texture_node_get_filter_size(ShaderType p_type,int p_id) const{
  657. ERR_FAIL_INDEX_V(p_type,3,0);
  658. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),0);
  659. const Node& n = shader[p_type].node_map[p_id];
  660. ERR_FAIL_COND_V(n.type!=NODE_TEXTURE_INPUT && n.type!=NODE_SCREEN_TEX,0);
  661. Array arr = n.param2;
  662. return arr[0];
  663. }
  664. void ShaderGraph::texture_node_set_filter_strength(ShaderType p_type,float p_id,float p_strength){
  665. ERR_FAIL_INDEX(p_type,3);
  666. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  667. Node& n = shader[p_type].node_map[p_id];
  668. ERR_FAIL_COND(n.type!=NODE_TEXTURE_INPUT && n.type!=NODE_SCREEN_TEX);
  669. Array arr = n.param2;
  670. arr[1]=p_strength;
  671. n.param2=arr;
  672. _request_update();
  673. }
  674. float ShaderGraph::texture_node_get_filter_strength(ShaderType p_type,float p_id) const{
  675. ERR_FAIL_INDEX_V(p_type,3,0);
  676. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),0);
  677. const Node& n = shader[p_type].node_map[p_id];
  678. ERR_FAIL_COND_V(n.type!=NODE_TEXTURE_INPUT && n.type!=NODE_SCREEN_TEX,0);
  679. Array arr = n.param2;
  680. return arr[1];
  681. }
  682. void ShaderGraph::duplicate_nodes(ShaderType p_which, List<int> &p_nodes)
  683. {
  684. //Create new node IDs
  685. Map<int,int> duplicates = Map<int,int>();
  686. int i=1;
  687. for(List<int>::Element *E=p_nodes.front();E; E=E->next()) {
  688. while (shader[p_which].node_map.has(i))
  689. i++;
  690. duplicates.insert(E->get(), i);
  691. i++;
  692. }
  693. for(List<int>::Element *E = p_nodes.front();E; E=E->next()) {
  694. const Node &n=shader[p_which].node_map[E->get()];
  695. Node nn=n;
  696. nn.id=duplicates.find(n.id)->get();
  697. nn.pos += Vector2(0,100);
  698. for (Map<int,SourceSlot>::Element *C=nn.connections.front();C;C=C->next()) {
  699. SourceSlot &c=C->get();
  700. if (p_nodes.find(c.id))
  701. c.id=duplicates.find(c.id)->get();
  702. }
  703. shader[p_which].node_map[nn.id]=nn;
  704. }
  705. _request_update();
  706. }
  707. List<int> ShaderGraph::generate_ids(ShaderType p_type, int count)
  708. {
  709. List<int> ids = List<int>();
  710. int i=1;
  711. while (ids.size() < count) {
  712. while (shader[p_type].node_map.has(i))
  713. i++;
  714. ids.push_back(i);
  715. i++;
  716. }
  717. return ids;
  718. }
  719. void ShaderGraph::scalar_op_node_set_op(ShaderType p_type,float p_id,ScalarOp p_op){
  720. ERR_FAIL_INDEX(p_type,3);
  721. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  722. Node& n = shader[p_type].node_map[p_id];
  723. ERR_FAIL_COND(n.type!=NODE_SCALAR_OP);
  724. n.param1=p_op;
  725. _request_update();
  726. }
  727. ShaderGraph::ScalarOp ShaderGraph::scalar_op_node_get_op(ShaderType p_type,float p_id) const{
  728. ERR_FAIL_INDEX_V(p_type,3,SCALAR_MAX_OP);
  729. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),SCALAR_MAX_OP);
  730. const Node& n = shader[p_type].node_map[p_id];
  731. ERR_FAIL_COND_V(n.type!=NODE_SCALAR_OP,SCALAR_MAX_OP);
  732. int op = n.param1;
  733. return ScalarOp(op);
  734. }
  735. void ShaderGraph::vec_op_node_set_op(ShaderType p_type,float p_id,VecOp p_op){
  736. ERR_FAIL_INDEX(p_type,3);
  737. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  738. Node& n = shader[p_type].node_map[p_id];
  739. ERR_FAIL_COND(n.type!=NODE_VEC_OP);
  740. n.param1=p_op;
  741. _request_update();
  742. }
  743. ShaderGraph::VecOp ShaderGraph::vec_op_node_get_op(ShaderType p_type,float p_id) const{
  744. ERR_FAIL_INDEX_V(p_type,3,VEC_MAX_OP);
  745. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),VEC_MAX_OP);
  746. const Node& n = shader[p_type].node_map[p_id];
  747. ERR_FAIL_COND_V(n.type!=NODE_VEC_OP,VEC_MAX_OP);
  748. int op = n.param1;
  749. return VecOp(op);
  750. }
  751. void ShaderGraph::vec_scalar_op_node_set_op(ShaderType p_type,float p_id,VecScalarOp p_op){
  752. ERR_FAIL_INDEX(p_type,3);
  753. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  754. Node& n = shader[p_type].node_map[p_id];
  755. ERR_FAIL_COND(n.type!=NODE_VEC_SCALAR_OP);
  756. n.param1=p_op;
  757. _request_update();
  758. }
  759. ShaderGraph::VecScalarOp ShaderGraph::vec_scalar_op_node_get_op(ShaderType p_type,float p_id) const{
  760. ERR_FAIL_INDEX_V(p_type,3,VEC_SCALAR_MAX_OP);
  761. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),VEC_SCALAR_MAX_OP);
  762. const Node& n = shader[p_type].node_map[p_id];
  763. ERR_FAIL_COND_V(n.type!=NODE_VEC_SCALAR_OP,VEC_SCALAR_MAX_OP);
  764. int op = n.param1;
  765. return VecScalarOp(op);
  766. }
  767. void ShaderGraph::rgb_op_node_set_op(ShaderType p_type,float p_id,RGBOp p_op){
  768. ERR_FAIL_INDEX(p_type,3);
  769. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  770. Node& n = shader[p_type].node_map[p_id];
  771. ERR_FAIL_COND(n.type!=NODE_RGB_OP);
  772. n.param1=p_op;
  773. _request_update();
  774. }
  775. ShaderGraph::RGBOp ShaderGraph::rgb_op_node_get_op(ShaderType p_type,float p_id) const{
  776. ERR_FAIL_INDEX_V(p_type,3,RGB_MAX_OP);
  777. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),RGB_MAX_OP);
  778. const Node& n = shader[p_type].node_map[p_id];
  779. ERR_FAIL_COND_V(n.type!=NODE_RGB_OP,RGB_MAX_OP);
  780. int op = n.param1;
  781. return RGBOp(op);
  782. }
  783. void ShaderGraph::xform_vec_mult_node_set_no_translation(ShaderType p_type,int p_id,bool p_no_translation){
  784. ERR_FAIL_INDEX(p_type,3);
  785. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  786. Node& n = shader[p_type].node_map[p_id];
  787. ERR_FAIL_COND(n.type!=NODE_XFORM_VEC_MULT && n.type!=NODE_XFORM_VEC_INV_MULT);
  788. n.param1=p_no_translation;
  789. _request_update();
  790. }
  791. bool ShaderGraph::xform_vec_mult_node_get_no_translation(ShaderType p_type,int p_id) const{
  792. ERR_FAIL_INDEX_V(p_type,3,false);
  793. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),false);
  794. const Node& n = shader[p_type].node_map[p_id];
  795. ERR_FAIL_COND_V(n.type!=NODE_XFORM_VEC_MULT && n.type!=NODE_XFORM_VEC_INV_MULT,false);
  796. return n.param1;
  797. }
  798. void ShaderGraph::scalar_func_node_set_function(ShaderType p_type,int p_id,ScalarFunc p_func){
  799. ERR_FAIL_INDEX(p_type,3);
  800. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  801. Node& n = shader[p_type].node_map[p_id];
  802. ERR_FAIL_COND(n.type!=NODE_SCALAR_FUNC);
  803. int func = p_func;
  804. ERR_FAIL_INDEX(func,SCALAR_MAX_FUNC);
  805. n.param1=func;
  806. _request_update();
  807. }
  808. ShaderGraph::ScalarFunc ShaderGraph::scalar_func_node_get_function(ShaderType p_type,int p_id) const{
  809. ERR_FAIL_INDEX_V(p_type,3,SCALAR_MAX_FUNC);
  810. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),SCALAR_MAX_FUNC);
  811. const Node& n = shader[p_type].node_map[p_id];
  812. ERR_FAIL_COND_V(n.type!=NODE_SCALAR_FUNC,SCALAR_MAX_FUNC);
  813. int func = n.param1;
  814. return ScalarFunc(func);
  815. }
  816. void ShaderGraph::default_set_value(ShaderGraph::ShaderType p_which, int p_id, int p_param, const Variant &p_value)
  817. {
  818. ERR_FAIL_INDEX(p_which,3);
  819. ERR_FAIL_COND(!shader[p_which].node_map.has(p_id));
  820. Node& n = shader[p_which].node_map[p_id];
  821. if(p_value.get_type()==Variant::NIL)
  822. n.defaults.erase(n.defaults.find(p_param));
  823. else
  824. n.defaults[p_param]=p_value;
  825. _request_update();
  826. }
  827. Variant ShaderGraph::default_get_value(ShaderGraph::ShaderType p_which, int p_id, int p_param)
  828. {
  829. ERR_FAIL_INDEX_V(p_which,3,Variant());
  830. ERR_FAIL_COND_V(!shader[p_which].node_map.has(p_id),Variant());
  831. const Node& n = shader[p_which].node_map[p_id];
  832. if (!n.defaults.has(p_param))
  833. return Variant();
  834. return n.defaults[p_param];
  835. }
  836. void ShaderGraph::vec_func_node_set_function(ShaderType p_type,int p_id,VecFunc p_func){
  837. ERR_FAIL_INDEX(p_type,3);
  838. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  839. Node& n = shader[p_type].node_map[p_id];
  840. ERR_FAIL_COND(n.type!=NODE_VEC_FUNC);
  841. int func = p_func;
  842. ERR_FAIL_INDEX(func,VEC_MAX_FUNC);
  843. n.param1=func;
  844. _request_update();
  845. }
  846. ShaderGraph::VecFunc ShaderGraph::vec_func_node_get_function(ShaderType p_type, int p_id) const{
  847. ERR_FAIL_INDEX_V(p_type,3,VEC_MAX_FUNC);
  848. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),VEC_MAX_FUNC);
  849. const Node& n = shader[p_type].node_map[p_id];
  850. ERR_FAIL_COND_V(n.type!=NODE_VEC_FUNC,VEC_MAX_FUNC);
  851. int func = n.param1;
  852. return VecFunc(func);
  853. }
  854. void ShaderGraph::color_ramp_node_set_ramp(ShaderType p_type,int p_id,const DVector<Color>& p_colors, const DVector<real_t>& p_offsets){
  855. ERR_FAIL_INDEX(p_type,3);
  856. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  857. ERR_FAIL_COND(p_colors.size()!=p_offsets.size());
  858. Node& n = shader[p_type].node_map[p_id];
  859. n.param1=p_colors;
  860. n.param2=p_offsets;
  861. _request_update();
  862. }
  863. DVector<Color> ShaderGraph::color_ramp_node_get_colors(ShaderType p_type,int p_id) const{
  864. ERR_FAIL_INDEX_V(p_type,3,DVector<Color>());
  865. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),DVector<Color>());
  866. const Node& n = shader[p_type].node_map[p_id];
  867. return n.param1;
  868. }
  869. DVector<real_t> ShaderGraph::color_ramp_node_get_offsets(ShaderType p_type,int p_id) const{
  870. ERR_FAIL_INDEX_V(p_type,3,DVector<real_t>());
  871. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),DVector<real_t>());
  872. const Node& n = shader[p_type].node_map[p_id];
  873. return n.param2;
  874. }
  875. void ShaderGraph::curve_map_node_set_points(ShaderType p_type,int p_id,const DVector<Vector2>& p_points) {
  876. ERR_FAIL_INDEX(p_type,3);
  877. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  878. Node& n = shader[p_type].node_map[p_id];
  879. n.param1=p_points;
  880. _request_update();
  881. }
  882. DVector<Vector2> ShaderGraph::curve_map_node_get_points(ShaderType p_type,int p_id) const{
  883. ERR_FAIL_INDEX_V(p_type,3,DVector<Vector2>());
  884. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),DVector<Vector2>());
  885. const Node& n = shader[p_type].node_map[p_id];
  886. return n.param1;
  887. }
  888. void ShaderGraph::input_node_set_name(ShaderType p_type,int p_id,const String& p_name){
  889. ERR_FAIL_INDEX(p_type,3);
  890. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  891. ERR_FAIL_COND(!p_name.is_valid_identifier());
  892. Node& n = shader[p_type].node_map[p_id];
  893. ERR_FAIL_COND(n.type!=NODE_SCALAR_INPUT && n.type!=NODE_VEC_INPUT && n.type==NODE_RGB_INPUT && n.type==NODE_XFORM_INPUT && n.type==NODE_TEXTURE_INPUT && n.type==NODE_CUBEMAP_INPUT);
  894. n.param1="";
  895. n.param1=_find_unique_name(p_name);
  896. _request_update();
  897. }
  898. String ShaderGraph::input_node_get_name(ShaderType p_type,int p_id){
  899. ERR_FAIL_INDEX_V(p_type,3,String());
  900. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),String());
  901. const Node& n = shader[p_type].node_map[p_id];
  902. ERR_FAIL_COND_V(n.type!=NODE_SCALAR_INPUT && n.type!=NODE_VEC_INPUT && n.type==NODE_RGB_INPUT && n.type==NODE_XFORM_INPUT && n.type==NODE_TEXTURE_INPUT && n.type==NODE_CUBEMAP_INPUT,String());
  903. return n.param1;
  904. }
  905. void ShaderGraph::scalar_input_node_set_value(ShaderType p_type,int p_id,float p_value) {
  906. ERR_FAIL_INDEX(p_type,3);
  907. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  908. Node& n = shader[p_type].node_map[p_id];
  909. ERR_FAIL_COND(n.type!=NODE_SCALAR_INPUT);
  910. n.param2=p_value;
  911. _request_update();
  912. }
  913. float ShaderGraph::scalar_input_node_get_value(ShaderType p_type,int p_id) const{
  914. ERR_FAIL_INDEX_V(p_type,3,0);
  915. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),0);
  916. const Node& n = shader[p_type].node_map[p_id];
  917. ERR_FAIL_COND_V(n.type!=NODE_SCALAR_INPUT,0);
  918. return n.param2;
  919. }
  920. void ShaderGraph::vec_input_node_set_value(ShaderType p_type,int p_id,const Vector3& p_value){
  921. ERR_FAIL_INDEX(p_type,3);
  922. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  923. Node& n = shader[p_type].node_map[p_id];
  924. ERR_FAIL_COND(n.type!=NODE_VEC_INPUT);
  925. n.param2=p_value;
  926. _request_update();
  927. }
  928. Vector3 ShaderGraph::vec_input_node_get_value(ShaderType p_type,int p_id) const{
  929. ERR_FAIL_INDEX_V(p_type,3,Vector3());
  930. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),Vector3());
  931. const Node& n = shader[p_type].node_map[p_id];
  932. ERR_FAIL_COND_V(n.type!=NODE_VEC_INPUT,Vector3());
  933. return n.param2;
  934. }
  935. void ShaderGraph::rgb_input_node_set_value(ShaderType p_type,int p_id,const Color& p_value){
  936. ERR_FAIL_INDEX(p_type,3);
  937. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  938. Node& n = shader[p_type].node_map[p_id];
  939. ERR_FAIL_COND(n.type!=NODE_RGB_INPUT);
  940. n.param2=p_value;
  941. _request_update();
  942. }
  943. Color ShaderGraph::rgb_input_node_get_value(ShaderType p_type,int p_id) const{
  944. ERR_FAIL_INDEX_V(p_type,3,Color());
  945. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),Color());
  946. const Node& n = shader[p_type].node_map[p_id];
  947. ERR_FAIL_COND_V(n.type!=NODE_RGB_INPUT,Color());
  948. return n.param2;
  949. }
  950. void ShaderGraph::xform_input_node_set_value(ShaderType p_type,int p_id,const Transform& p_value){
  951. ERR_FAIL_INDEX(p_type,3);
  952. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  953. Node& n = shader[p_type].node_map[p_id];
  954. ERR_FAIL_COND(n.type!=NODE_XFORM_INPUT);
  955. n.param2=p_value;
  956. _request_update();
  957. }
  958. Transform ShaderGraph::xform_input_node_get_value(ShaderType p_type,int p_id) const{
  959. ERR_FAIL_INDEX_V(p_type,3,Transform());
  960. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),Transform());
  961. const Node& n = shader[p_type].node_map[p_id];
  962. ERR_FAIL_COND_V(n.type!=NODE_XFORM_INPUT,Transform());
  963. return n.param2;
  964. }
  965. void ShaderGraph::texture_input_node_set_value(ShaderType p_type,int p_id,const Ref<Texture>& p_texture) {
  966. ERR_FAIL_INDEX(p_type,3);
  967. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  968. Node& n = shader[p_type].node_map[p_id];
  969. ERR_FAIL_COND(n.type!=NODE_TEXTURE_INPUT);
  970. n.param2=p_texture;
  971. _request_update();
  972. }
  973. Ref<Texture> ShaderGraph::texture_input_node_get_value(ShaderType p_type,int p_id) const{
  974. ERR_FAIL_INDEX_V(p_type,3,Ref<Texture>());
  975. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),Ref<Texture>());
  976. const Node& n = shader[p_type].node_map[p_id];
  977. ERR_FAIL_COND_V(n.type!=NODE_TEXTURE_INPUT,Ref<Texture>());
  978. return n.param2;
  979. }
  980. void ShaderGraph::cubemap_input_node_set_value(ShaderType p_type,int p_id,const Ref<CubeMap>& p_cubemap){
  981. ERR_FAIL_INDEX(p_type,3);
  982. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  983. Node& n = shader[p_type].node_map[p_id];
  984. ERR_FAIL_COND(n.type!=NODE_CUBEMAP_INPUT);
  985. n.param2=p_cubemap;
  986. _request_update();
  987. }
  988. Ref<CubeMap> ShaderGraph::cubemap_input_node_get_value(ShaderType p_type,int p_id) const{
  989. ERR_FAIL_INDEX_V(p_type,3,Ref<CubeMap>());
  990. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),Ref<CubeMap>());
  991. const Node& n = shader[p_type].node_map[p_id];
  992. ERR_FAIL_COND_V(n.type!=NODE_CUBEMAP_INPUT,Ref<CubeMap>());
  993. return n.param2;
  994. }
  995. void ShaderGraph::comment_node_set_text(ShaderType p_type,int p_id,const String& p_comment) {
  996. ERR_FAIL_INDEX(p_type,3);
  997. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  998. Node& n = shader[p_type].node_map[p_id];
  999. ERR_FAIL_COND(n.type!=NODE_COMMENT);
  1000. n.param1=p_comment;
  1001. }
  1002. String ShaderGraph::comment_node_get_text(ShaderType p_type,int p_id) const{
  1003. ERR_FAIL_INDEX_V(p_type,3,String());
  1004. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),String());
  1005. const Node& n = shader[p_type].node_map[p_id];
  1006. ERR_FAIL_COND_V(n.type!=NODE_COMMENT,String());
  1007. return n.param1;
  1008. }
  1009. void ShaderGraph::_request_update() {
  1010. if (_pending_update_shader)
  1011. return;
  1012. _pending_update_shader=true;
  1013. call_deferred("_update_shader");
  1014. }
  1015. Variant ShaderGraph::node_get_state(ShaderType p_type,int p_id) const {
  1016. ERR_FAIL_INDEX_V(p_type,3,Variant());
  1017. ERR_FAIL_COND_V(!shader[p_type].node_map.has(p_id),Variant());
  1018. const Node& n = shader[p_type].node_map[p_id];
  1019. Dictionary s;
  1020. s["pos"]=n.pos;
  1021. s["param1"]=n.param1;
  1022. s["param2"]=n.param2;
  1023. Array keys;
  1024. for (Map<int,Variant>::Element *E=n.defaults.front();E;E=E->next()) {
  1025. keys.append(E->key());
  1026. s[E->key()]=E->get();
  1027. }
  1028. s["default_keys"]=keys;
  1029. return s;
  1030. }
  1031. void ShaderGraph::node_set_state(ShaderType p_type,int p_id,const Variant& p_state) {
  1032. ERR_FAIL_INDEX(p_type,3);
  1033. ERR_FAIL_COND(!shader[p_type].node_map.has(p_id));
  1034. Node& n = shader[p_type].node_map[p_id];
  1035. Dictionary d = p_state;
  1036. ERR_FAIL_COND(!d.has("pos"));
  1037. ERR_FAIL_COND(!d.has("param1"));
  1038. ERR_FAIL_COND(!d.has("param2"));
  1039. ERR_FAIL_COND(!d.has("default_keys"));
  1040. n.pos=d["pos"];
  1041. n.param1=d["param1"];
  1042. n.param2=d["param2"];
  1043. Array keys = d["default_keys"];
  1044. for(int i=0;i<keys.size();i++) {
  1045. n.defaults[keys[i]]=d[keys[i]];
  1046. }
  1047. }
  1048. ShaderGraph::ShaderGraph(Mode p_mode) : Shader(p_mode) {
  1049. //shader = VisualServer::get_singleton()->shader_create();
  1050. _pending_update_shader=false;
  1051. Node out;
  1052. out.id=0;
  1053. out.pos=Vector2(250,20);
  1054. out.type=NODE_OUTPUT;
  1055. for(int i=0;i<3;i++) {
  1056. shader[i].node_map.insert(0,out);
  1057. }
  1058. }
  1059. ShaderGraph::~ShaderGraph() {
  1060. //VisualServer::get_singleton()->free(shader);
  1061. }
  1062. const ShaderGraph::InOutParamInfo ShaderGraph::inout_param_info[]={
  1063. //material vertex in
  1064. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Vertex","SRC_VERTEX","",SLOT_TYPE_VEC,SLOT_IN},
  1065. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Normal","SRC_NORMAL","",SLOT_TYPE_VEC,SLOT_IN},
  1066. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Tangent","SRC_TANGENT","",SLOT_TYPE_VEC,SLOT_IN},
  1067. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"BinormalF","SRC_BINORMALF","",SLOT_TYPE_SCALAR,SLOT_IN},
  1068. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Color","SRC_COLOR","",SLOT_TYPE_VEC,SLOT_IN},
  1069. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Alpha","SRC_ALPHA","",SLOT_TYPE_SCALAR,SLOT_IN},
  1070. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"UV","SRC_UV","",SLOT_TYPE_VEC,SLOT_IN},
  1071. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"UV2","SRC_UV2","",SLOT_TYPE_VEC,SLOT_IN},
  1072. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"WorldMatrix","WORLD_MATRIX","",SLOT_TYPE_XFORM,SLOT_IN},
  1073. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"InvCameraMatrix","INV_CAMERA_MATRIX","",SLOT_TYPE_XFORM,SLOT_IN},
  1074. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"ProjectionMatrix","PROJECTION_MATRIX","",SLOT_TYPE_XFORM,SLOT_IN},
  1075. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"ModelviewMatrix","MODELVIEW_MATRIX","",SLOT_TYPE_XFORM,SLOT_IN},
  1076. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"InstanceID","INSTANCE_ID","",SLOT_TYPE_SCALAR,SLOT_IN},
  1077. //material vertex out
  1078. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Vertex","VERTEX","",SLOT_TYPE_VEC,SLOT_OUT},
  1079. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Normal","NORMAL","",SLOT_TYPE_VEC,SLOT_OUT},
  1080. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Tangent","TANGENT","",SLOT_TYPE_VEC,SLOT_OUT},
  1081. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Binormal","BINORMAL","",SLOT_TYPE_VEC,SLOT_OUT},
  1082. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"UV","UV",".xy",SLOT_TYPE_VEC,SLOT_OUT},
  1083. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"UV2","UV2",".xy",SLOT_TYPE_VEC,SLOT_OUT},
  1084. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Color","COLOR.rgb","",SLOT_TYPE_VEC,SLOT_OUT},
  1085. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Alpha","COLOR.a","",SLOT_TYPE_SCALAR,SLOT_OUT},
  1086. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Var1","VAR1.rgb","",SLOT_TYPE_VEC,SLOT_OUT},
  1087. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"Var2","VAR2.rgb","",SLOT_TYPE_VEC,SLOT_OUT},
  1088. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"SpecExp","SPEC_EXP","",SLOT_TYPE_SCALAR,SLOT_OUT},
  1089. {MODE_MATERIAL,SHADER_TYPE_VERTEX,"PointSize","POINT_SIZE","",SLOT_TYPE_SCALAR,SLOT_OUT},
  1090. //pixel vertex in
  1091. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Vertex","VERTEX","",SLOT_TYPE_VEC,SLOT_IN},
  1092. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Position","POSITION.xyz","",SLOT_TYPE_VEC,SLOT_IN},
  1093. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Normal","IN_NORMAL","",SLOT_TYPE_VEC,SLOT_IN},
  1094. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Tangent","TANGENT","",SLOT_TYPE_VEC,SLOT_IN},
  1095. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Binormal","BINORMAL","",SLOT_TYPE_VEC,SLOT_IN},
  1096. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"UV","vec3(UV,0)","",SLOT_TYPE_VEC,SLOT_IN},
  1097. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"UV2","vec3(UV2,0)","",SLOT_TYPE_VEC,SLOT_IN},
  1098. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"UVScreen","vec3(SCREEN_UV,0)","",SLOT_TYPE_VEC,SLOT_IN},
  1099. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"PointCoord","POINT_COORD","",SLOT_TYPE_VEC,SLOT_IN},
  1100. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Color","COLOR.rgb","",SLOT_TYPE_VEC,SLOT_IN},
  1101. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Alpha","COLOR.a","",SLOT_TYPE_SCALAR,SLOT_IN},
  1102. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"InvCameraMatrix","INV_CAMERA_MATRIX","",SLOT_TYPE_XFORM,SLOT_IN},
  1103. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Var1","VAR1.rgb","",SLOT_TYPE_VEC,SLOT_IN},
  1104. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Var2","VAR2.rgb","",SLOT_TYPE_VEC,SLOT_IN},
  1105. //pixel vertex out
  1106. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Diffuse","DIFFUSE_OUT","",SLOT_TYPE_VEC,SLOT_OUT},
  1107. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"DiffuseAlpha","ALPHA_OUT","",SLOT_TYPE_SCALAR,SLOT_OUT},
  1108. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Specular","SPECULAR","",SLOT_TYPE_VEC,SLOT_OUT},
  1109. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"SpecularExp","SPEC_EXP","",SLOT_TYPE_SCALAR,SLOT_OUT},
  1110. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Emission","EMISSION","",SLOT_TYPE_VEC,SLOT_OUT},
  1111. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Glow","GLOW","",SLOT_TYPE_SCALAR,SLOT_OUT},
  1112. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"ShadeParam","SHADE_PARAM","",SLOT_TYPE_SCALAR,SLOT_OUT},
  1113. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Normal","NORMAL","",SLOT_TYPE_VEC,SLOT_OUT},
  1114. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"NormalMap","NORMALMAP","",SLOT_TYPE_VEC,SLOT_OUT},
  1115. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"NormalMapDepth","NORMALMAP_DEPTH","",SLOT_TYPE_SCALAR,SLOT_OUT},
  1116. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,"Discard","DISCARD",">0.5",SLOT_TYPE_SCALAR,SLOT_OUT},
  1117. //light in
  1118. {MODE_MATERIAL,SHADER_TYPE_LIGHT,"Normal","NORMAL","",SLOT_TYPE_VEC,SLOT_IN},
  1119. {MODE_MATERIAL,SHADER_TYPE_LIGHT,"LightDir","LIGHT_DIR","",SLOT_TYPE_VEC,SLOT_IN},
  1120. {MODE_MATERIAL,SHADER_TYPE_LIGHT,"LightDiffuse","LIGHT_DIFFUSE","",SLOT_TYPE_VEC,SLOT_IN},
  1121. {MODE_MATERIAL,SHADER_TYPE_LIGHT,"LightSpecular","LIGHT_SPECULAR","",SLOT_TYPE_VEC,SLOT_IN},
  1122. {MODE_MATERIAL,SHADER_TYPE_LIGHT,"EyeVec","EYE_VEC","",SLOT_TYPE_VEC,SLOT_IN},
  1123. {MODE_MATERIAL,SHADER_TYPE_LIGHT,"Diffuse","DIFFUSE","",SLOT_TYPE_VEC,SLOT_IN},
  1124. {MODE_MATERIAL,SHADER_TYPE_LIGHT,"Specular","SPECULAR","",SLOT_TYPE_VEC,SLOT_IN},
  1125. {MODE_MATERIAL,SHADER_TYPE_LIGHT,"SpecExp","SPECULAR_EXP","",SLOT_TYPE_SCALAR,SLOT_IN},
  1126. {MODE_MATERIAL,SHADER_TYPE_LIGHT,"ShadeParam","SHADE_PARAM","",SLOT_TYPE_SCALAR,SLOT_IN},
  1127. //light out
  1128. {MODE_MATERIAL,SHADER_TYPE_LIGHT,"Light","LIGHT","",SLOT_TYPE_VEC,SLOT_OUT},
  1129. {MODE_MATERIAL,SHADER_TYPE_LIGHT,"Shadow", "SHADOW", "",SLOT_TYPE_VEC, SLOT_OUT },
  1130. //canvas item vertex in
  1131. {MODE_CANVAS_ITEM,SHADER_TYPE_VERTEX,"Vertex","vec3(SRC_VERTEX,0)","",SLOT_TYPE_VEC,SLOT_IN},
  1132. {MODE_CANVAS_ITEM,SHADER_TYPE_VERTEX,"UV","SRC_UV","",SLOT_TYPE_VEC,SLOT_IN},
  1133. {MODE_CANVAS_ITEM,SHADER_TYPE_VERTEX,"Color","SRC_COLOR.rgb","",SLOT_TYPE_VEC,SLOT_IN},
  1134. {MODE_CANVAS_ITEM,SHADER_TYPE_VERTEX,"Alpha","SRC_COLOR.a","",SLOT_TYPE_SCALAR,SLOT_IN},
  1135. {MODE_CANVAS_ITEM,SHADER_TYPE_VERTEX,"WorldMatrix","WORLD_MATRIX","",SLOT_TYPE_XFORM,SLOT_IN},
  1136. {MODE_CANVAS_ITEM,SHADER_TYPE_VERTEX,"ExtraMatrix","EXTRA_MATRIX","",SLOT_TYPE_XFORM,SLOT_IN},
  1137. {MODE_CANVAS_ITEM,SHADER_TYPE_VERTEX,"ProjectionMatrix","PROJECTION_MATRIX","",SLOT_TYPE_XFORM,SLOT_IN},
  1138. //canvas item vertex out
  1139. {MODE_CANVAS_ITEM,SHADER_TYPE_VERTEX,"Vertex","VERTEX",".xy",SLOT_TYPE_VEC,SLOT_OUT},
  1140. {MODE_CANVAS_ITEM,SHADER_TYPE_VERTEX,"UV","UV",".xy",SLOT_TYPE_VEC,SLOT_OUT},
  1141. {MODE_CANVAS_ITEM,SHADER_TYPE_VERTEX,"Color","COLOR.rgb","",SLOT_TYPE_VEC,SLOT_OUT},
  1142. {MODE_CANVAS_ITEM,SHADER_TYPE_VERTEX,"Alpha","COLOR.a","",SLOT_TYPE_SCALAR,SLOT_OUT},
  1143. {MODE_CANVAS_ITEM,SHADER_TYPE_VERTEX,"Var1","VAR1.rgb","",SLOT_TYPE_VEC,SLOT_OUT},
  1144. {MODE_CANVAS_ITEM,SHADER_TYPE_VERTEX,"Var2","VAR2.rgb","",SLOT_TYPE_VEC,SLOT_OUT},
  1145. {MODE_CANVAS_ITEM,SHADER_TYPE_VERTEX,"PointSize","POINT_SIZE","",SLOT_TYPE_SCALAR,SLOT_OUT},
  1146. //canvas item fragment in
  1147. {MODE_CANVAS_ITEM,SHADER_TYPE_FRAGMENT,"Color","SRC_COLOR.rgb","",SLOT_TYPE_VEC,SLOT_IN},
  1148. {MODE_CANVAS_ITEM,SHADER_TYPE_FRAGMENT,"Alpha","SRC_COLOR.a","",SLOT_TYPE_SCALAR,SLOT_IN},
  1149. {MODE_CANVAS_ITEM,SHADER_TYPE_FRAGMENT,"UV","vec3(UV,0)","",SLOT_TYPE_VEC,SLOT_IN},
  1150. {MODE_CANVAS_ITEM,SHADER_TYPE_FRAGMENT,"UVScreen","vec3(SCREEN_UV,0)","",SLOT_TYPE_VEC,SLOT_IN},
  1151. {MODE_CANVAS_ITEM,SHADER_TYPE_FRAGMENT,"TexPixelSize","vec3(TEXTURE_PIXEL_SIZE,0)","",SLOT_TYPE_VEC,SLOT_IN},
  1152. {MODE_CANVAS_ITEM,SHADER_TYPE_FRAGMENT,"Var1","VAR1.rgb","",SLOT_TYPE_VEC,SLOT_IN},
  1153. {MODE_CANVAS_ITEM,SHADER_TYPE_FRAGMENT,"Var2","VAR2.rgb","",SLOT_TYPE_VEC,SLOT_IN},
  1154. {MODE_CANVAS_ITEM,SHADER_TYPE_FRAGMENT,"PointCoord","POINT_COORD","",SLOT_TYPE_VEC,SLOT_IN},
  1155. //canvas item fragment out
  1156. {MODE_CANVAS_ITEM,SHADER_TYPE_FRAGMENT,"Color","COLOR.rgb","",SLOT_TYPE_VEC,SLOT_OUT},
  1157. {MODE_CANVAS_ITEM,SHADER_TYPE_FRAGMENT,"Alpha","COLOR.a","",SLOT_TYPE_SCALAR,SLOT_OUT},
  1158. {MODE_CANVAS_ITEM,SHADER_TYPE_FRAGMENT,"Normal","NORMAL","",SLOT_TYPE_VEC,SLOT_OUT},
  1159. {MODE_CANVAS_ITEM,SHADER_TYPE_FRAGMENT,"NormalMap","NORMALMAP","",SLOT_TYPE_VEC,SLOT_OUT},
  1160. {MODE_CANVAS_ITEM,SHADER_TYPE_FRAGMENT,"NormalMapDepth","NORMALMAP_DEPTH","",SLOT_TYPE_SCALAR,SLOT_OUT},
  1161. //canvas item light in
  1162. {MODE_CANVAS_ITEM,SHADER_TYPE_LIGHT,"Color","COLOR.rgb","",SLOT_TYPE_VEC,SLOT_IN},
  1163. {MODE_CANVAS_ITEM,SHADER_TYPE_LIGHT,"Alpha","COLOR.a","",SLOT_TYPE_SCALAR,SLOT_IN},
  1164. {MODE_CANVAS_ITEM,SHADER_TYPE_LIGHT,"Normal","NORMAL","",SLOT_TYPE_VEC,SLOT_IN},
  1165. {MODE_CANVAS_ITEM,SHADER_TYPE_LIGHT,"UV","vec3(UV,0)","",SLOT_TYPE_VEC,SLOT_IN},
  1166. {MODE_CANVAS_ITEM,SHADER_TYPE_LIGHT,"LightColor","LIGHT_COLOR.rgb","",SLOT_TYPE_VEC,SLOT_IN},
  1167. {MODE_CANVAS_ITEM,SHADER_TYPE_LIGHT,"LightAlpha","LIGHT_COLOR.a","",SLOT_TYPE_SCALAR,SLOT_IN},
  1168. {MODE_CANVAS_ITEM,SHADER_TYPE_LIGHT,"LightHeight","LIGHT_HEIGHT","",SLOT_TYPE_SCALAR,SLOT_IN},
  1169. {MODE_CANVAS_ITEM,SHADER_TYPE_LIGHT,"TexPixelSize","vec3(TEXTURE_PIXEL_SIZE,0)","",SLOT_TYPE_VEC,SLOT_IN},
  1170. {MODE_CANVAS_ITEM,SHADER_TYPE_LIGHT,"Var1","VAR1.rgb","",SLOT_TYPE_VEC,SLOT_IN},
  1171. {MODE_CANVAS_ITEM,SHADER_TYPE_LIGHT,"Var2","VAR2.rgb","",SLOT_TYPE_VEC,SLOT_IN},
  1172. {MODE_CANVAS_ITEM,SHADER_TYPE_LIGHT,"PointCoord","POINT_COORD","",SLOT_TYPE_VEC,SLOT_IN},
  1173. //canvas item light out
  1174. {MODE_CANVAS_ITEM,SHADER_TYPE_LIGHT,"LightColor","LIGHT.rgb","",SLOT_TYPE_VEC,SLOT_OUT},
  1175. {MODE_CANVAS_ITEM,SHADER_TYPE_LIGHT,"LightAlpha","LIGHT.a","",SLOT_TYPE_SCALAR,SLOT_OUT},
  1176. //end
  1177. {MODE_MATERIAL,SHADER_TYPE_FRAGMENT,NULL,NULL,NULL,SLOT_TYPE_SCALAR,SLOT_OUT},
  1178. };
  1179. void ShaderGraph::get_input_output_node_slot_info(Mode p_mode, ShaderType p_type, List<SlotInfo> *r_slots) {
  1180. const InOutParamInfo* iop = &inout_param_info[0];
  1181. while(iop->name) {
  1182. if (p_mode==iop->shader_mode && p_type==iop->shader_type) {
  1183. SlotInfo si;
  1184. si.dir=iop->dir;
  1185. si.name=iop->name;
  1186. si.type=iop->slot_type;
  1187. r_slots->push_back(si);
  1188. }
  1189. iop++;
  1190. }
  1191. }
  1192. const ShaderGraph::NodeSlotInfo ShaderGraph::node_slot_info[]= {
  1193. {NODE_SCALAR_CONST,{SLOT_MAX},{SLOT_TYPE_SCALAR,SLOT_MAX}}, //scalar constant
  1194. {NODE_VEC_CONST,{SLOT_MAX},{SLOT_TYPE_VEC,SLOT_MAX}}, //vec3 constant
  1195. {NODE_RGB_CONST,{SLOT_MAX},{SLOT_TYPE_VEC,SLOT_TYPE_SCALAR,SLOT_MAX}}, //rgb constant (shows a color picker instead)
  1196. {NODE_XFORM_CONST,{SLOT_MAX},{SLOT_TYPE_XFORM,SLOT_MAX}}, // 4x4 matrix constant
  1197. {NODE_TIME,{SLOT_MAX},{SLOT_TYPE_SCALAR,SLOT_MAX}}, // time in seconds
  1198. {NODE_SCREEN_TEX,{SLOT_TYPE_VEC,SLOT_MAX},{SLOT_TYPE_VEC,SLOT_MAX}}, // screen texture sampler (takes UV) (only usable in fragment shader)
  1199. {NODE_SCALAR_OP,{SLOT_TYPE_SCALAR,SLOT_TYPE_SCALAR,SLOT_MAX},{SLOT_TYPE_SCALAR,SLOT_MAX}}, // scalar vs scalar op (mul,{SLOT_MAX},{SLOT_MAX}}, add,{SLOT_MAX},{SLOT_MAX}}, div,{SLOT_MAX},{SLOT_MAX}}, etc)
  1200. {NODE_VEC_OP,{SLOT_TYPE_VEC,SLOT_TYPE_VEC,SLOT_MAX},{SLOT_TYPE_VEC,SLOT_MAX}}, // scalar vs scalar op (mul,{SLOT_MAX},{SLOT_MAX}}, add,{SLOT_MAX},{SLOT_MAX}}, div,{SLOT_MAX},{SLOT_MAX}}, etc)
  1201. {NODE_VEC_SCALAR_OP,{SLOT_TYPE_VEC,SLOT_TYPE_SCALAR,SLOT_MAX},{SLOT_TYPE_VEC,SLOT_MAX}}, // vec3 vs scalar op (mul,{SLOT_MAX},{SLOT_MAX}}, add,{SLOT_MAX},{SLOT_MAX}}, div,{SLOT_MAX},{SLOT_MAX}}, etc)
  1202. {NODE_RGB_OP,{SLOT_TYPE_VEC,SLOT_TYPE_VEC,SLOT_MAX},{SLOT_TYPE_VEC,SLOT_MAX}}, // vec3 vs scalar op (mul,{SLOT_MAX},{SLOT_MAX}}, add,{SLOT_MAX},{SLOT_MAX}}, div,{SLOT_MAX},{SLOT_MAX}}, etc)
  1203. {NODE_XFORM_MULT,{SLOT_TYPE_XFORM,SLOT_TYPE_XFORM,SLOT_MAX},{SLOT_TYPE_XFORM,SLOT_MAX}}, // mat4 x mat4
  1204. {NODE_XFORM_VEC_MULT,{SLOT_TYPE_XFORM,SLOT_TYPE_VEC,SLOT_MAX},{SLOT_TYPE_VEC,SLOT_MAX}}, // mat4 x vec3 mult (with no-translation option)
  1205. {NODE_XFORM_VEC_INV_MULT,{SLOT_TYPE_VEC,SLOT_TYPE_XFORM,SLOT_MAX},{SLOT_TYPE_VEC,SLOT_MAX}}, // mat4 x vec3 inverse mult (with no-translation option)
  1206. {NODE_SCALAR_FUNC,{SLOT_TYPE_SCALAR,SLOT_MAX},{SLOT_TYPE_SCALAR,SLOT_MAX}}, // scalar function (sin,{SLOT_MAX},{SLOT_MAX}}, cos,{SLOT_MAX},{SLOT_MAX}}, etc)
  1207. {NODE_VEC_FUNC,{SLOT_TYPE_VEC,SLOT_MAX},{SLOT_TYPE_VEC,SLOT_MAX}}, // vector function (normalize,{SLOT_MAX},{SLOT_MAX}}, negate,{SLOT_MAX},{SLOT_MAX}}, reciprocal,{SLOT_MAX},{SLOT_MAX}}, rgb2hsv,{SLOT_MAX},{SLOT_MAX}}, hsv2rgb,{SLOT_MAX},{SLOT_MAX}}, etc,{SLOT_MAX},{SLOT_MAX}}, etc)
  1208. {NODE_VEC_LEN,{SLOT_TYPE_VEC,SLOT_MAX},{SLOT_TYPE_SCALAR,SLOT_MAX}}, // vec3 length
  1209. {NODE_DOT_PROD,{SLOT_TYPE_VEC,SLOT_TYPE_VEC,SLOT_MAX},{SLOT_TYPE_SCALAR,SLOT_MAX}}, // vec3 . vec3 (dot product -> scalar output)
  1210. {NODE_VEC_TO_SCALAR,{SLOT_TYPE_VEC,SLOT_MAX},{SLOT_TYPE_SCALAR,SLOT_TYPE_SCALAR,SLOT_TYPE_SCALAR}}, // 1 vec3 input,{SLOT_MAX},{SLOT_MAX}}, 3 scalar outputs
  1211. {NODE_SCALAR_TO_VEC,{SLOT_TYPE_SCALAR,SLOT_TYPE_SCALAR,SLOT_TYPE_SCALAR},{SLOT_TYPE_VEC,SLOT_MAX}}, // 3 scalar input,{SLOT_MAX},{SLOT_MAX}}, 1 vec3 output
  1212. {NODE_SCALAR_INTERP,{SLOT_TYPE_SCALAR,SLOT_TYPE_SCALAR,SLOT_TYPE_SCALAR},{SLOT_TYPE_SCALAR,SLOT_MAX}}, // scalar interpolation (with optional curve)
  1213. {NODE_VEC_INTERP,{SLOT_TYPE_VEC,SLOT_TYPE_VEC,SLOT_TYPE_SCALAR},{SLOT_TYPE_VEC,SLOT_MAX}}, // vec3 interpolation (with optional curve)
  1214. {NODE_COLOR_RAMP,{SLOT_TYPE_SCALAR,SLOT_MAX},{SLOT_TYPE_VEC,SLOT_TYPE_SCALAR,SLOT_MAX}}, // vec3 interpolation (with optional curve)
  1215. {NODE_CURVE_MAP,{SLOT_TYPE_SCALAR,SLOT_MAX},{SLOT_TYPE_SCALAR,SLOT_MAX}}, // vec3 interpolation (with optional curve)
  1216. {NODE_SCALAR_INPUT,{SLOT_MAX},{SLOT_TYPE_SCALAR,SLOT_MAX}}, // scalar uniform (assignable in material)
  1217. {NODE_VEC_INPUT,{SLOT_MAX},{SLOT_TYPE_VEC,SLOT_MAX}}, // vec3 uniform (assignable in material)
  1218. {NODE_RGB_INPUT,{SLOT_MAX},{SLOT_TYPE_VEC,SLOT_MAX}}, // color uniform (assignable in material)
  1219. {NODE_XFORM_INPUT,{SLOT_MAX},{SLOT_TYPE_XFORM,SLOT_MAX}}, // mat4 uniform (assignable in material)
  1220. {NODE_TEXTURE_INPUT,{SLOT_TYPE_VEC,SLOT_MAX},{SLOT_TYPE_VEC,SLOT_TYPE_SCALAR,SLOT_MAX}}, // texture input (assignable in material)
  1221. {NODE_CUBEMAP_INPUT,{SLOT_TYPE_VEC,SLOT_MAX},{SLOT_TYPE_VEC,SLOT_TYPE_SCALAR,SLOT_MAX}}, // cubemap input (assignable in material)
  1222. {NODE_DEFAULT_TEXTURE,{SLOT_TYPE_VEC,SLOT_MAX},{SLOT_TYPE_VEC,SLOT_TYPE_SCALAR,SLOT_MAX}}, // cubemap input (assignable in material)
  1223. {NODE_COMMENT,{SLOT_MAX},{SLOT_MAX}}, // comment
  1224. {NODE_TYPE_MAX,{SLOT_MAX},{SLOT_MAX}}
  1225. };
  1226. int ShaderGraph::get_node_input_slot_count(Mode p_mode, ShaderType p_shader_type,NodeType p_type) {
  1227. if (p_type==NODE_INPUT || p_type==NODE_OUTPUT) {
  1228. const InOutParamInfo* iop = &inout_param_info[0];
  1229. int pc=0;
  1230. while(iop->name) {
  1231. if (p_mode==iop->shader_mode && p_shader_type==iop->shader_type) {
  1232. if (iop->dir==SLOT_OUT)
  1233. pc++;
  1234. }
  1235. iop++;
  1236. }
  1237. return pc;
  1238. } else if (p_type==NODE_VEC_TO_XFORM){
  1239. return 4;
  1240. } else if (p_type==NODE_XFORM_TO_VEC){
  1241. return 1;
  1242. } else {
  1243. const NodeSlotInfo*nsi=&node_slot_info[0];
  1244. while(nsi->type!=NODE_TYPE_MAX) {
  1245. if (nsi->type==p_type) {
  1246. int pc=0;
  1247. for(int i=0;i<NodeSlotInfo::MAX_INS;i++) {
  1248. if (nsi->ins[i]==SLOT_MAX)
  1249. break;
  1250. pc++;
  1251. }
  1252. return pc;
  1253. }
  1254. nsi++;
  1255. }
  1256. return 0;
  1257. }
  1258. }
  1259. int ShaderGraph::get_node_output_slot_count(Mode p_mode, ShaderType p_shader_type,NodeType p_type){
  1260. if (p_type==NODE_INPUT || p_type==NODE_OUTPUT) {
  1261. const InOutParamInfo* iop = &inout_param_info[0];
  1262. int pc=0;
  1263. while(iop->name) {
  1264. if (p_mode==iop->shader_mode && p_shader_type==iop->shader_type) {
  1265. if (iop->dir==SLOT_IN)
  1266. pc++;
  1267. }
  1268. iop++;
  1269. }
  1270. return pc;
  1271. } else if (p_type==NODE_VEC_TO_XFORM){
  1272. return 1;
  1273. } else if (p_type==NODE_XFORM_TO_VEC){
  1274. return 4;
  1275. } else {
  1276. const NodeSlotInfo*nsi=&node_slot_info[0];
  1277. while(nsi->type!=NODE_TYPE_MAX) {
  1278. if (nsi->type==p_type) {
  1279. int pc=0;
  1280. for(int i=0;i<NodeSlotInfo::MAX_OUTS;i++) {
  1281. if (nsi->outs[i]==SLOT_MAX)
  1282. break;
  1283. pc++;
  1284. }
  1285. return pc;
  1286. }
  1287. nsi++;
  1288. }
  1289. return 0;
  1290. }
  1291. }
  1292. ShaderGraph::SlotType ShaderGraph::get_node_input_slot_type(Mode p_mode, ShaderType p_shader_type,NodeType p_type,int p_idx){
  1293. if (p_type==NODE_INPUT || p_type==NODE_OUTPUT) {
  1294. const InOutParamInfo* iop = &inout_param_info[0];
  1295. int pc=0;
  1296. while(iop->name) {
  1297. if (p_mode==iop->shader_mode && p_shader_type==iop->shader_type) {
  1298. if (iop->dir==SLOT_OUT) {
  1299. if (pc==p_idx)
  1300. return iop->slot_type;
  1301. pc++;
  1302. }
  1303. }
  1304. iop++;
  1305. }
  1306. ERR_FAIL_V(SLOT_MAX);
  1307. } else if (p_type==NODE_VEC_TO_XFORM){
  1308. return SLOT_TYPE_VEC;
  1309. } else if (p_type==NODE_XFORM_TO_VEC){
  1310. return SLOT_TYPE_XFORM;
  1311. } else {
  1312. const NodeSlotInfo*nsi=&node_slot_info[0];
  1313. while(nsi->type!=NODE_TYPE_MAX) {
  1314. if (nsi->type==p_type) {
  1315. for(int i=0;i<NodeSlotInfo::MAX_INS;i++) {
  1316. if (nsi->ins[i]==SLOT_MAX)
  1317. break;
  1318. if (i==p_idx)
  1319. return nsi->ins[i];
  1320. }
  1321. }
  1322. nsi++;
  1323. }
  1324. ERR_FAIL_V(SLOT_MAX);
  1325. }
  1326. }
  1327. ShaderGraph::SlotType ShaderGraph::get_node_output_slot_type(Mode p_mode, ShaderType p_shader_type,NodeType p_type,int p_idx){
  1328. if (p_type==NODE_INPUT || p_type==NODE_OUTPUT) {
  1329. const InOutParamInfo* iop = &inout_param_info[0];
  1330. int pc=0;
  1331. while(iop->name) {
  1332. if (p_mode==iop->shader_mode && p_shader_type==iop->shader_type) {
  1333. if (iop->dir==SLOT_IN) {
  1334. if (pc==p_idx)
  1335. return iop->slot_type;
  1336. pc++;
  1337. }
  1338. }
  1339. iop++;
  1340. }
  1341. ERR_FAIL_V(SLOT_MAX);
  1342. } else if (p_type==NODE_VEC_TO_XFORM){
  1343. return SLOT_TYPE_XFORM;
  1344. } else if (p_type==NODE_XFORM_TO_VEC){
  1345. return SLOT_TYPE_VEC;
  1346. } else {
  1347. const NodeSlotInfo*nsi=&node_slot_info[0];
  1348. while(nsi->type!=NODE_TYPE_MAX) {
  1349. if (nsi->type==p_type) {
  1350. for(int i=0;i<NodeSlotInfo::MAX_OUTS;i++) {
  1351. if (nsi->outs[i]==SLOT_MAX)
  1352. break;
  1353. if (i==p_idx)
  1354. return nsi->outs[i];
  1355. }
  1356. }
  1357. nsi++;
  1358. }
  1359. ERR_FAIL_V(SLOT_MAX);
  1360. }
  1361. }
  1362. void ShaderGraph::_update_shader() {
  1363. String code[3];
  1364. List<StringName> names;
  1365. get_default_texture_param_list(&names);
  1366. for (List<StringName>::Element *E=names.front();E;E=E->next()) {
  1367. set_default_texture_param(E->get(),Ref<Texture>());
  1368. }
  1369. for(int i=0;i<3;i++) {
  1370. int idx=0;
  1371. for (Map<int,Node>::Element *E=shader[i].node_map.front();E;E=E->next()) {
  1372. E->get().sort_order=idx++;
  1373. }
  1374. //simple method for graph solving using bubblesort derived algorithm
  1375. int iters=0;
  1376. int iter_max=shader[i].node_map.size()*shader[i].node_map.size();
  1377. while(true) {
  1378. if (iters>iter_max)
  1379. break;
  1380. int swaps=0;
  1381. for (Map<int,Node>::Element *E=shader[i].node_map.front();E;E=E->next()) {
  1382. for(Map<int,SourceSlot>::Element *F=E->get().connections.front();F;F=F->next()) {
  1383. //this is kinda slow, could be sped up
  1384. Map<int,Node>::Element *G = shader[i].node_map.find(F->get().id);
  1385. ERR_FAIL_COND(!G);
  1386. if (G->get().sort_order > E->get().sort_order) {
  1387. SWAP(G->get().sort_order,E->get().sort_order);
  1388. swaps++;
  1389. }
  1390. }
  1391. }
  1392. iters++;
  1393. if (swaps==0) {
  1394. iters=0;
  1395. break;
  1396. }
  1397. }
  1398. if (iters>0) {
  1399. shader[i].error=GRAPH_ERROR_CYCLIC;
  1400. continue;
  1401. }
  1402. Vector<Node*> order;
  1403. order.resize(shader[i].node_map.size());
  1404. for (Map<int,Node>::Element *E=shader[i].node_map.front();E;E=E->next()) {
  1405. order[E->get().sort_order]=&E->get();
  1406. }
  1407. //generate code for the ordered graph
  1408. bool failed=false;
  1409. if (i==SHADER_TYPE_FRAGMENT && get_mode()==MODE_MATERIAL) {
  1410. code[i]+="vec3 DIFFUSE_OUT=vec3(0,0,0);\n";
  1411. code[i]+="float ALPHA_OUT=0;\n";
  1412. }
  1413. Map<String,String> inputs_xlate;
  1414. Map<String,String> input_names_xlate;
  1415. Set<String> inputs_used;
  1416. for(int j=0;j<order.size();j++) {
  1417. Node *n=order[j];
  1418. if (n->type==NODE_INPUT) {
  1419. const InOutParamInfo* iop = &inout_param_info[0];
  1420. int idx=0;
  1421. while(iop->name) {
  1422. if (get_mode()==iop->shader_mode && i==iop->shader_type && SLOT_IN==iop->dir) {
  1423. const char *typestr[4]={"float","vec3","mat4","texture"};
  1424. String vname=("nd"+itos(n->id)+"sl"+itos(idx));
  1425. inputs_xlate[vname]=String(typestr[iop->slot_type])+" "+vname+"="+iop->variable+";\n";
  1426. input_names_xlate[vname]=iop->variable;
  1427. idx++;
  1428. }
  1429. iop++;
  1430. }
  1431. } else if (n->type==NODE_OUTPUT) {
  1432. bool use_alpha=false;
  1433. const InOutParamInfo* iop = &inout_param_info[0];
  1434. int idx=0;
  1435. while(iop->name) {
  1436. if (get_mode()==iop->shader_mode && i==iop->shader_type && SLOT_OUT==iop->dir) {
  1437. if (n->connections.has(idx)) {
  1438. String iname=("nd"+itos(n->connections[idx].id)+"sl"+itos(n->connections[idx].slot));
  1439. if (node_get_type(ShaderType(i),n->connections[idx].id)==NODE_INPUT)
  1440. inputs_used.insert(iname);
  1441. code[i]+=String(iop->variable)+"="+iname+String(iop->postfix)+";\n";
  1442. if (i==SHADER_TYPE_FRAGMENT && get_mode()==MODE_MATERIAL && String(iop->name)=="DiffuseAlpha")
  1443. use_alpha=true;
  1444. }
  1445. idx++;
  1446. }
  1447. iop++;
  1448. }
  1449. if (i==SHADER_TYPE_FRAGMENT && get_mode()==MODE_MATERIAL) {
  1450. if (use_alpha) {
  1451. code[i]+="DIFFUSE_ALPHA=vec4(DIFFUSE_OUT,ALPHA_OUT);\n";
  1452. } else {
  1453. code[i]+="DIFFUSE=DIFFUSE_OUT;\n";
  1454. }
  1455. }
  1456. } else {
  1457. Vector<String> inputs;
  1458. int max = get_node_input_slot_count(get_mode(),ShaderType(i),n->type);
  1459. for(int k=0;k<max;k++) {
  1460. String iname;
  1461. if (!n->connections.has(k)) {
  1462. iname="nd"+itos(n->id)+"sl"+itos(k)+"def";
  1463. } else {
  1464. iname="nd"+itos(n->connections[k].id)+"sl"+itos(n->connections[k].slot);
  1465. if (node_get_type(ShaderType(i),n->connections[k].id)==NODE_INPUT) {
  1466. inputs_used.insert(iname);
  1467. }
  1468. }
  1469. inputs.push_back(iname);
  1470. }
  1471. if (failed)
  1472. break;
  1473. if (n->type==NODE_TEXTURE_INPUT || n->type==NODE_CUBEMAP_INPUT) {
  1474. set_default_texture_param(n->param1,n->param2);
  1475. }
  1476. _add_node_code(ShaderType(i),n,inputs,code[i]);
  1477. }
  1478. }
  1479. if (failed)
  1480. continue;
  1481. for(Set<String>::Element *E=inputs_used.front();E;E=E->next()) {
  1482. ERR_CONTINUE( !inputs_xlate.has(E->get()));
  1483. code[i]=inputs_xlate[E->get()]+code[i];
  1484. String name=input_names_xlate[E->get()];
  1485. if (i==SHADER_TYPE_VERTEX && get_mode()==MODE_MATERIAL) {
  1486. if (name==("SRC_COLOR"))
  1487. code[i]="vec3 SRC_COLOR=COLOR.rgb;\n"+code[i];
  1488. if (name==("SRC_ALPHA"))
  1489. code[i]="float SRC_ALPHA=COLOR.a;\n"+code[i];
  1490. if (name==("SRC_UV"))
  1491. code[i]="vec3 SRC_UV=vec3(UV,0);\n"+code[i];
  1492. if (name==("SRC_UV2"))
  1493. code[i]="float SRC_UV2=vec3(UV2,0);\n"+code[i];
  1494. } else if (i==SHADER_TYPE_FRAGMENT && get_mode()==MODE_MATERIAL) {
  1495. if (name==("IN_NORMAL"))
  1496. code[i]="vec3 IN_NORMAL=NORMAL;\n"+code[i];
  1497. } else if (i==SHADER_TYPE_VERTEX && get_mode()==MODE_CANVAS_ITEM) {
  1498. if (name==("SRC_COLOR"))
  1499. code[i]="vec3 SRC_COLOR=COLOR.rgb;\n"+code[i];
  1500. if (name==("SRC_UV"))
  1501. code[i]="vec3 SRC_UV=vec3(UV,0);\n"+code[i];
  1502. }
  1503. }
  1504. shader[i].error=GRAPH_OK;
  1505. }
  1506. bool all_ok=true;
  1507. for(int i=0;i<3;i++) {
  1508. if (shader[i].error!=GRAPH_OK)
  1509. all_ok=false;
  1510. }
  1511. /*print_line("VERTEX: \n"+code[0]);
  1512. print_line("FRAGMENT: \n"+code[1]);
  1513. print_line("LIGHT: \n"+code[2]);*/
  1514. if (all_ok) {
  1515. set_code(code[0],code[1],code[2]);
  1516. }
  1517. //do shader here
  1518. _pending_update_shader=false;
  1519. emit_signal(SceneStringNames::get_singleton()->updated);
  1520. }
  1521. void ShaderGraph::_plot_curve(const Vector2& p_a,const Vector2& p_b,const Vector2& p_c,const Vector2& p_d,uint8_t* p_heights,bool *p_useds) {
  1522. float geometry[4][4];
  1523. float tmp1[4][4];
  1524. float tmp2[4][4];
  1525. float deltas[4][4];
  1526. double x, dx, dx2, dx3;
  1527. double y, dy, dy2, dy3;
  1528. double d, d2, d3;
  1529. int lastx, lasty;
  1530. int newx, newy;
  1531. int ntimes;
  1532. int i,j;
  1533. int xmax=255;
  1534. int ymax=255;
  1535. /* construct the geometry matrix from the segment */
  1536. for (i = 0; i < 4; i++) {
  1537. geometry[i][2] = 0;
  1538. geometry[i][3] = 0;
  1539. }
  1540. geometry[0][0] = (p_a[0] * xmax);
  1541. geometry[1][0] = (p_b[0] * xmax);
  1542. geometry[2][0] = (p_c[0] * xmax);
  1543. geometry[3][0] = (p_d[0] * xmax);
  1544. geometry[0][1] = (p_a[1] * ymax);
  1545. geometry[1][1] = (p_b[1] * ymax);
  1546. geometry[2][1] = (p_c[1] * ymax);
  1547. geometry[3][1] = (p_d[1] * ymax);
  1548. /* subdivide the curve ntimes (1000) times */
  1549. ntimes = 4 * xmax;
  1550. /* ntimes can be adjusted to give a finer or coarser curve */
  1551. d = 1.0 / ntimes;
  1552. d2 = d * d;
  1553. d3 = d * d * d;
  1554. /* construct a temporary matrix for determining the forward differencing deltas */
  1555. tmp2[0][0] = 0; tmp2[0][1] = 0; tmp2[0][2] = 0; tmp2[0][3] = 1;
  1556. tmp2[1][0] = d3; tmp2[1][1] = d2; tmp2[1][2] = d; tmp2[1][3] = 0;
  1557. tmp2[2][0] = 6*d3; tmp2[2][1] = 2*d2; tmp2[2][2] = 0; tmp2[2][3] = 0;
  1558. tmp2[3][0] = 6*d3; tmp2[3][1] = 0; tmp2[3][2] = 0; tmp2[3][3] = 0;
  1559. /* compose the basis and geometry matrices */
  1560. static const float CR_basis[4][4] =
  1561. {
  1562. { -0.5, 1.5, -1.5, 0.5 },
  1563. { 1.0, -2.5, 2.0, -0.5 },
  1564. { -0.5, 0.0, 0.5, 0.0 },
  1565. { 0.0, 1.0, 0.0, 0.0 },
  1566. };
  1567. for (i = 0; i < 4; i++)
  1568. {
  1569. for (j = 0; j < 4; j++)
  1570. {
  1571. tmp1[i][j] = (CR_basis[i][0] * geometry[0][j] +
  1572. CR_basis[i][1] * geometry[1][j] +
  1573. CR_basis[i][2] * geometry[2][j] +
  1574. CR_basis[i][3] * geometry[3][j]);
  1575. }
  1576. }
  1577. /* compose the above results to get the deltas matrix */
  1578. for (i = 0; i < 4; i++)
  1579. {
  1580. for (j = 0; j < 4; j++)
  1581. {
  1582. deltas[i][j] = (tmp2[i][0] * tmp1[0][j] +
  1583. tmp2[i][1] * tmp1[1][j] +
  1584. tmp2[i][2] * tmp1[2][j] +
  1585. tmp2[i][3] * tmp1[3][j]);
  1586. }
  1587. }
  1588. /* extract the x deltas */
  1589. x = deltas[0][0];
  1590. dx = deltas[1][0];
  1591. dx2 = deltas[2][0];
  1592. dx3 = deltas[3][0];
  1593. /* extract the y deltas */
  1594. y = deltas[0][1];
  1595. dy = deltas[1][1];
  1596. dy2 = deltas[2][1];
  1597. dy3 = deltas[3][1];
  1598. lastx = CLAMP (x, 0, xmax);
  1599. lasty = CLAMP (y, 0, ymax);
  1600. p_heights[lastx] = lasty;
  1601. p_useds[lastx] = true;
  1602. /* loop over the curve */
  1603. for (i = 0; i < ntimes; i++)
  1604. {
  1605. /* increment the x values */
  1606. x += dx;
  1607. dx += dx2;
  1608. dx2 += dx3;
  1609. /* increment the y values */
  1610. y += dy;
  1611. dy += dy2;
  1612. dy2 += dy3;
  1613. newx = CLAMP ((Math::round (x)), 0, xmax);
  1614. newy = CLAMP ((Math::round (y)), 0, ymax);
  1615. /* if this point is different than the last one...then draw it */
  1616. if ((lastx != newx) || (lasty != newy))
  1617. {
  1618. p_useds[newx]=true;
  1619. p_heights[newx]=newy;
  1620. }
  1621. lastx = newx;
  1622. lasty = newy;
  1623. }
  1624. }
  1625. void ShaderGraph::_add_node_code(ShaderType p_type,Node *p_node,const Vector<String>& p_inputs,String& code) {
  1626. const char *typestr[4]={"float","vec3","mat4","texture"};
  1627. #define OUTNAME(id,slot) (String(typestr[get_node_output_slot_type(get_mode(),p_type,p_node->type,slot)])+" "+("nd"+itos(id)+"sl"+itos(slot)))
  1628. #define OUTVAR(id,slot) ("nd"+itos(id)+"sl"+itos(slot))
  1629. #define DEF_VEC(slot)\
  1630. if (p_inputs[slot].ends_with("def")){\
  1631. Vector3 v = p_node->defaults[slot];\
  1632. code+=String(typestr[1])+" "+p_inputs[slot]+"=vec3("+v+");\n";\
  1633. }
  1634. #define DEF_SCALAR(slot)\
  1635. if (p_inputs[slot].ends_with("def")){\
  1636. double v = p_node->defaults[slot];\
  1637. code+=String(typestr[0])+" "+p_inputs[slot]+"="+rtos(v)+";\n";\
  1638. }
  1639. #define DEF_COLOR(slot)\
  1640. if (p_inputs[slot].ends_with("def")){\
  1641. Color col = p_node->defaults[slot];\
  1642. code+=String(typestr[1])+" "+p_inputs[slot]+"=vec3("+rtos(col.r)+","+rtos(col.g)+","+rtos(col.b)+");\n";\
  1643. }
  1644. #define DEF_MATRIX(slot) \
  1645. if (p_inputs[slot].ends_with("def")){\
  1646. Transform xf = p_node->defaults[slot]; \
  1647. code+=String(typestr[2])+" "+p_inputs[slot]+"=mat4(\n";\
  1648. code+="\tvec4(vec3("+rtos(xf.basis.get_axis(0).x)+","+rtos(xf.basis.get_axis(0).y)+","+rtos(xf.basis.get_axis(0).z)+"),0),\n";\
  1649. code+="\tvec4(vec3("+rtos(xf.basis.get_axis(1).x)+","+rtos(xf.basis.get_axis(1).y)+","+rtos(xf.basis.get_axis(1).z)+"),0),\n";\
  1650. code+="\tvec4(vec3("+rtos(xf.basis.get_axis(2).x)+","+rtos(xf.basis.get_axis(2).y)+","+rtos(xf.basis.get_axis(2).z)+"),0),\n";\
  1651. code+="\tvec4(vec3("+rtos(xf.origin.x)+","+rtos(xf.origin.y)+","+rtos(xf.origin.z)+"),1)\n";\
  1652. code+=");\n";\
  1653. }
  1654. switch(p_node->type) {
  1655. case NODE_INPUT: {
  1656. }break;
  1657. case NODE_SCALAR_CONST: {
  1658. double scalar = p_node->param1;
  1659. code+=OUTNAME(p_node->id,0)+"="+rtos(scalar)+";\n";
  1660. }break;
  1661. case NODE_VEC_CONST: {
  1662. Vector3 vec = p_node->param1;
  1663. code+=OUTNAME(p_node->id,0)+"=vec3("+rtos(vec.x)+","+rtos(vec.y)+","+rtos(vec.z)+");\n";
  1664. }break;
  1665. case NODE_RGB_CONST: {
  1666. Color col = p_node->param1;
  1667. code+=OUTNAME(p_node->id,0)+"=vec3("+rtos(col.r)+","+rtos(col.g)+","+rtos(col.b)+");\n";
  1668. code+=OUTNAME(p_node->id,1)+"="+rtos(col.a)+";\n";
  1669. }break;
  1670. case NODE_XFORM_CONST: {
  1671. Transform xf = p_node->param1;
  1672. code+=OUTNAME(p_node->id,0)+"=mat4(\n";
  1673. code+="\tvec4(vec3("+rtos(xf.basis.get_axis(0).x)+","+rtos(xf.basis.get_axis(0).y)+","+rtos(xf.basis.get_axis(0).z)+"),0),\n";
  1674. code+="\tvec4(vec3("+rtos(xf.basis.get_axis(1).x)+","+rtos(xf.basis.get_axis(1).y)+","+rtos(xf.basis.get_axis(1).z)+"),0),\n";
  1675. code+="\tvec4(vec3("+rtos(xf.basis.get_axis(2).x)+","+rtos(xf.basis.get_axis(2).y)+","+rtos(xf.basis.get_axis(2).z)+"),0),\n";
  1676. code+="\tvec4(vec3("+rtos(xf.origin.x)+","+rtos(xf.origin.y)+","+rtos(xf.origin.z)+"),1)\n";
  1677. code+=");";
  1678. }break;
  1679. case NODE_TIME: {
  1680. code+=OUTNAME(p_node->id,0)+"=TIME;\n";
  1681. }break;
  1682. case NODE_SCREEN_TEX: {
  1683. DEF_VEC(0);
  1684. code+=OUTNAME(p_node->id,0)+"=texscreen("+p_inputs[0]+".xy);\n";
  1685. }break;
  1686. case NODE_SCALAR_OP: {
  1687. DEF_SCALAR(0);
  1688. DEF_SCALAR(1);
  1689. int op = p_node->param1;
  1690. String optxt;
  1691. switch(op) {
  1692. case SCALAR_OP_ADD: optxt = p_inputs[0]+"+"+p_inputs[1]+";"; break;
  1693. case SCALAR_OP_SUB: optxt = p_inputs[0]+"-"+p_inputs[1]+";"; break;
  1694. case SCALAR_OP_MUL: optxt = p_inputs[0]+"*"+p_inputs[1]+";"; break;
  1695. case SCALAR_OP_DIV: optxt = p_inputs[0]+"/"+p_inputs[1]+";"; break;
  1696. case SCALAR_OP_MOD: optxt = "mod("+p_inputs[0]+","+p_inputs[1]+");"; break;
  1697. case SCALAR_OP_POW: optxt = "pow("+p_inputs[0]+","+p_inputs[1]+");"; break;
  1698. case SCALAR_OP_MAX: optxt = "max("+p_inputs[0]+","+p_inputs[1]+");"; break;
  1699. case SCALAR_OP_MIN: optxt = "min("+p_inputs[0]+","+p_inputs[1]+");"; break;
  1700. case SCALAR_OP_ATAN2: optxt = "atan2("+p_inputs[0]+","+p_inputs[1]+");"; break;
  1701. }
  1702. code+=OUTNAME(p_node->id,0)+"="+optxt+"\n";;
  1703. }break;
  1704. case NODE_VEC_OP: {
  1705. DEF_VEC(0);
  1706. DEF_VEC(1);
  1707. int op = p_node->param1;
  1708. String optxt;
  1709. switch(op) {
  1710. case VEC_OP_ADD: optxt = p_inputs[0]+"+"+p_inputs[1]+";"; break;
  1711. case VEC_OP_SUB: optxt = p_inputs[0]+"-"+p_inputs[1]+";"; break;
  1712. case VEC_OP_MUL: optxt = p_inputs[0]+"*"+p_inputs[1]+";"; break;
  1713. case VEC_OP_DIV: optxt = p_inputs[0]+"/"+p_inputs[1]+";"; break;
  1714. case VEC_OP_MOD: optxt = "mod("+p_inputs[0]+","+p_inputs[1]+");"; break;
  1715. case VEC_OP_POW: optxt = "pow("+p_inputs[0]+","+p_inputs[1]+");"; break;
  1716. case VEC_OP_MAX: optxt = "max("+p_inputs[0]+","+p_inputs[1]+");"; break;
  1717. case VEC_OP_MIN: optxt = "min("+p_inputs[0]+","+p_inputs[1]+");"; break;
  1718. case VEC_OP_CROSS: optxt = "cross("+p_inputs[0]+","+p_inputs[1]+");"; break;
  1719. }
  1720. code+=OUTNAME(p_node->id,0)+"="+optxt+"\n";
  1721. }break;
  1722. case NODE_VEC_SCALAR_OP: {
  1723. DEF_VEC(0);
  1724. DEF_SCALAR(1);
  1725. int op = p_node->param1;
  1726. String optxt;
  1727. switch(op) {
  1728. case VEC_SCALAR_OP_MUL: optxt = p_inputs[0]+"*"+p_inputs[1]+";"; break;
  1729. case VEC_SCALAR_OP_DIV: optxt = p_inputs[0]+"/"+p_inputs[1]+";"; break;
  1730. case VEC_SCALAR_OP_POW: optxt = "pow("+p_inputs[0]+","+p_inputs[1]+");"; break;
  1731. }
  1732. code+=OUTNAME(p_node->id,0)+"="+optxt+"\n";
  1733. }break;
  1734. case NODE_RGB_OP: {
  1735. DEF_COLOR(0);
  1736. DEF_COLOR(1);
  1737. int op = p_node->param1;
  1738. static const char*axisn[3]={"x","y","z"};
  1739. switch(op) {
  1740. case RGB_OP_SCREEN: {
  1741. code += OUTNAME(p_node->id,0)+"=vec3(1.0)-(vec3(1.0)-"+p_inputs[0]+")*(vec3(1.0)-"+p_inputs[1]+");\n";
  1742. } break;
  1743. case RGB_OP_DIFFERENCE: {
  1744. code += OUTNAME(p_node->id,0)+"=abs("+p_inputs[0]+"-"+p_inputs[1]+");\n";
  1745. } break;
  1746. case RGB_OP_DARKEN: {
  1747. code += OUTNAME(p_node->id,0)+"=min("+p_inputs[0]+","+p_inputs[1]+");\n";
  1748. } break;
  1749. case RGB_OP_LIGHTEN: {
  1750. code += OUTNAME(p_node->id,0)+"=max("+p_inputs[0]+","+p_inputs[1]+");\n";
  1751. } break;
  1752. case RGB_OP_OVERLAY: {
  1753. code += OUTNAME(p_node->id,0)+";\n";
  1754. for(int i=0;i<3;i++) {
  1755. code += "{\n";
  1756. code += "\tfloat base="+p_inputs[0]+"."+axisn[i]+";\n";
  1757. code += "\tfloat blend="+p_inputs[1]+"."+axisn[i]+";\n";
  1758. code += "\tif (base < 0.5) {\n";
  1759. code += "\t\t"+OUTVAR(p_node->id,0)+"."+axisn[i]+" = 2.0 * base * blend;\n";
  1760. code += "\t} else {\n";
  1761. code += "\t\t"+OUTVAR(p_node->id,0)+"."+axisn[i]+" = 1.0 - 2.0 * (1.0 - blend) * (1.0 - base);\n";
  1762. code += "\t}\n";
  1763. code += "}\n";
  1764. }
  1765. } break;
  1766. case RGB_OP_DODGE: {
  1767. code += OUTNAME(p_node->id,0)+"=("+p_inputs[0]+")/(vec3(1.0)-"+p_inputs[1]+");\n";
  1768. } break;
  1769. case RGB_OP_BURN: {
  1770. code += OUTNAME(p_node->id,0)+"=vec3(1.0)-(vec3(1.0)-"+p_inputs[0]+")/("+p_inputs[1]+");\n";
  1771. } break;
  1772. case RGB_OP_SOFT_LIGHT: {
  1773. code += OUTNAME(p_node->id,0)+";\n";
  1774. for(int i=0;i<3;i++) {
  1775. code += "{\n";
  1776. code += "\tfloat base="+p_inputs[0]+"."+axisn[i]+";\n";
  1777. code += "\tfloat blend="+p_inputs[1]+"."+axisn[i]+";\n";
  1778. code += "\tif (base < 0.5) {\n";
  1779. code += "\t\t"+OUTVAR(p_node->id,0)+"."+axisn[i]+" = (base * (blend+0.5));\n";
  1780. code += "\t} else {\n";
  1781. code += "\t\t"+OUTVAR(p_node->id,0)+"."+axisn[i]+" = (1 - (1-base) * (1-(blend-0.5)));\n";
  1782. code += "\t}\n";
  1783. code += "}\n";
  1784. }
  1785. } break;
  1786. case RGB_OP_HARD_LIGHT: {
  1787. code += OUTNAME(p_node->id,0)+";\n";
  1788. for(int i=0;i<3;i++) {
  1789. code += "{\n";
  1790. code += "\tfloat base="+p_inputs[0]+"."+axisn[i]+";\n";
  1791. code += "\tfloat blend="+p_inputs[1]+"."+axisn[i]+";\n";
  1792. code += "\tif (base < 0.5) {\n";
  1793. code += "\t\t"+OUTVAR(p_node->id,0)+"."+axisn[i]+" = (base * (2*blend));\n";
  1794. code += "\t} else {\n";
  1795. code += "\t\t"+OUTVAR(p_node->id,0)+"."+axisn[i]+" = (1 - (1-base) * (1-2*(blend-0.5)));\n";
  1796. code += "\t}\n";
  1797. code += "}\n";
  1798. }
  1799. } break;
  1800. }
  1801. }break;
  1802. case NODE_XFORM_MULT: {
  1803. DEF_MATRIX(0);
  1804. DEF_MATRIX(1);
  1805. code += OUTNAME(p_node->id,0)+"="+p_inputs[0]+"*"+p_inputs[1]+";\n";
  1806. }break;
  1807. case NODE_XFORM_VEC_MULT: {
  1808. DEF_MATRIX(0);
  1809. DEF_VEC(1);
  1810. bool no_translation = p_node->param1;
  1811. if (no_translation) {
  1812. code += OUTNAME(p_node->id,0)+"=("+p_inputs[0]+"*vec4("+p_inputs[1]+",0)).xyz;\n";
  1813. } else {
  1814. code += OUTNAME(p_node->id,0)+"=("+p_inputs[0]+"*vec4("+p_inputs[1]+",1)).xyz;\n";
  1815. }
  1816. }break;
  1817. case NODE_XFORM_VEC_INV_MULT: {
  1818. DEF_VEC(0);
  1819. DEF_MATRIX(1);
  1820. bool no_translation = p_node->param1;
  1821. if (no_translation) {
  1822. code += OUTNAME(p_node->id,0)+"=("+p_inputs[1]+"*vec4("+p_inputs[0]+",0)).xyz;\n";
  1823. } else {
  1824. code += OUTNAME(p_node->id,0)+"=("+p_inputs[1]+"*vec4("+p_inputs[0]+",1)).xyz;\n";
  1825. }
  1826. }break;
  1827. case NODE_SCALAR_FUNC: {
  1828. DEF_SCALAR(0);
  1829. static const char*scalar_func_id[SCALAR_MAX_FUNC]={
  1830. "sin($)",
  1831. "cos($)",
  1832. "tan($)",
  1833. "asin($)",
  1834. "acos($)",
  1835. "atan($)",
  1836. "sinh($)",
  1837. "cosh($)",
  1838. "tanh($)",
  1839. "log($)",
  1840. "exp($)",
  1841. "sqrt($)",
  1842. "abs($)",
  1843. "sign($)",
  1844. "floor($)",
  1845. "round($)",
  1846. "ceil($)",
  1847. "fract($)",
  1848. "min(max($,0),1)",
  1849. "-($)",
  1850. };
  1851. int func = p_node->param1;
  1852. ERR_FAIL_INDEX(func,SCALAR_MAX_FUNC);
  1853. code += OUTNAME(p_node->id,0)+"="+String(scalar_func_id[func]).replace("$",p_inputs[0])+";\n";
  1854. } break;
  1855. case NODE_VEC_FUNC: {
  1856. DEF_VEC(0);
  1857. static const char*vec_func_id[VEC_MAX_FUNC]={
  1858. "normalize($)",
  1859. "max(min($,vec3(1,1,1)),vec3(0,0,0))",
  1860. "-($)",
  1861. "1.0/($)",
  1862. "",
  1863. "",
  1864. };
  1865. int func = p_node->param1;
  1866. ERR_FAIL_INDEX(func,VEC_MAX_FUNC);
  1867. if (func==VEC_FUNC_RGB2HSV) {
  1868. code += OUTNAME(p_node->id,0)+";\n";
  1869. code+="{\n";
  1870. code+="\tvec3 c = "+p_inputs[0]+";\n";
  1871. code+="\tvec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n";
  1872. code+="\tvec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n";
  1873. code+="\tvec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n";
  1874. code+="\tfloat d = q.x - min(q.w, q.y);\n";
  1875. code+="\tfloat e = 1.0e-10;\n";
  1876. code+="\t"+OUTVAR(p_node->id,0)+"=vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n";
  1877. code+="}\n";
  1878. } else if (func==VEC_FUNC_HSV2RGB) {
  1879. code += OUTNAME(p_node->id,0)+";\n";;
  1880. code+="{\n";
  1881. code+="\tvec3 c = "+p_inputs[0]+";\n";
  1882. code+="\tvec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n";
  1883. code+="\tvec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n";
  1884. code+="\t"+OUTVAR(p_node->id,0)+"=c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n";
  1885. code+="}\n";
  1886. } else {
  1887. code += OUTNAME(p_node->id,0)+"="+String(vec_func_id[func]).replace("$",p_inputs[0])+";\n";
  1888. }
  1889. }break;
  1890. case NODE_VEC_LEN: {
  1891. DEF_VEC(0);
  1892. code += OUTNAME(p_node->id,0)+"=length("+p_inputs[0]+");\n";
  1893. }break;
  1894. case NODE_DOT_PROD: {
  1895. DEF_VEC(0);
  1896. DEF_VEC(1);
  1897. code += OUTNAME(p_node->id,0)+"=dot("+p_inputs[1]+","+p_inputs[0]+");\n";
  1898. }break;
  1899. case NODE_VEC_TO_SCALAR: {
  1900. DEF_VEC(0);
  1901. code += OUTNAME(p_node->id,0)+"="+p_inputs[0]+".x;\n";
  1902. code += OUTNAME(p_node->id,1)+"="+p_inputs[0]+".y;\n";
  1903. code += OUTNAME(p_node->id,2)+"="+p_inputs[0]+".z;\n";
  1904. }break;
  1905. case NODE_SCALAR_TO_VEC: {
  1906. DEF_SCALAR(0);
  1907. DEF_SCALAR(1);
  1908. DEF_SCALAR(2);
  1909. code += OUTNAME(p_node->id,0)+"=vec3("+p_inputs[0]+","+p_inputs[1]+","+p_inputs[2]+""+");\n";
  1910. }break;
  1911. case NODE_VEC_TO_XFORM: {
  1912. DEF_VEC(0);
  1913. DEF_VEC(1);
  1914. DEF_VEC(2);
  1915. DEF_VEC(3);
  1916. code += OUTNAME(p_node->id, 0) + "=mat4(" +
  1917. "vec4(" + p_inputs[0] + ".x," + p_inputs[0] + ".y," + p_inputs[0] + ".z, 0.0),"
  1918. "vec4(" + p_inputs[1] + ".x," + p_inputs[1] + ".y," + p_inputs[1] + ".z, 0.0),"
  1919. "vec4(" + p_inputs[2] + ".x," + p_inputs[2] + ".y," + p_inputs[2] + ".z, 0.0),"
  1920. "vec4(" + p_inputs[3] + ".x," + p_inputs[3] + ".y," + p_inputs[3] + ".z, 1.0));\n";
  1921. }break;
  1922. case NODE_XFORM_TO_VEC: {
  1923. DEF_MATRIX(0);
  1924. code += OUTNAME(p_node->id, 0) + ";\n";
  1925. code += OUTNAME(p_node->id, 1) + ";\n";
  1926. code += OUTNAME(p_node->id, 2) + ";\n";
  1927. code += OUTNAME(p_node->id, 3) + ";\n";
  1928. code += "{\n";
  1929. code += "\tvec4 xform_row_01=" + p_inputs[0] + ".x;\n";
  1930. code += "\tvec4 xform_row_02=" + p_inputs[0] + ".y;\n";
  1931. code += "\tvec4 xform_row_03=" + p_inputs[0] + ".z;\n";
  1932. code += "\tvec4 xform_row_04=" + p_inputs[0] + ".w;\n";
  1933. code += "\t" + OUTVAR(p_node->id, 0) + "=vec3(xform_row_01.x, xform_row_01.y, xform_row_01.z);\n";
  1934. code += "\t" + OUTVAR(p_node->id, 1) + "=vec3(xform_row_02.x, xform_row_02.y, xform_row_02.z);\n";
  1935. code += "\t" + OUTVAR(p_node->id, 2) + "=vec3(xform_row_03.x, xform_row_03.y, xform_row_03.z);\n";
  1936. code += "\t" + OUTVAR(p_node->id, 3) + "=vec3(xform_row_04.x, xform_row_04.y, xform_row_04.z);\n";
  1937. code += "}\n";
  1938. }break;
  1939. case NODE_SCALAR_INTERP: {
  1940. DEF_SCALAR(0);
  1941. DEF_SCALAR(1);
  1942. DEF_SCALAR(2);
  1943. code += OUTNAME(p_node->id,0)+"=mix("+p_inputs[0]+","+p_inputs[1]+","+p_inputs[2]+");\n";
  1944. }break;
  1945. case NODE_VEC_INTERP: {
  1946. DEF_VEC(0);
  1947. DEF_VEC(1);
  1948. DEF_SCALAR(2);
  1949. code += OUTNAME(p_node->id,0)+"=mix("+p_inputs[0]+","+p_inputs[1]+","+p_inputs[2]+");\n";
  1950. }break;
  1951. case NODE_COLOR_RAMP: {
  1952. DEF_SCALAR(0);
  1953. static const int color_ramp_len=512;
  1954. DVector<uint8_t> cramp;
  1955. cramp.resize(color_ramp_len*4);
  1956. {
  1957. DVector<Color> colors=p_node->param1;
  1958. DVector<real_t> offsets=p_node->param2;
  1959. int cc =colors.size();
  1960. DVector<uint8_t>::Write crw = cramp.write();
  1961. DVector<Color>::Read cr = colors.read();
  1962. DVector<real_t>::Read ofr = offsets.read();
  1963. int at=0;
  1964. Color color_at(0,0,0,1);
  1965. for(int i=0;i<=cc;i++) {
  1966. int pos;
  1967. Color to;
  1968. if (i==cc) {
  1969. if (at==color_ramp_len)
  1970. break;
  1971. pos=color_ramp_len;
  1972. to=Color(1,1,1,1);
  1973. } else {
  1974. to=cr[i];
  1975. pos= MIN(ofr[i]*color_ramp_len,color_ramp_len);
  1976. }
  1977. for(int j=at;j<pos;j++) {
  1978. float t = (j-at)/float(pos-at);
  1979. Color c = color_at.linear_interpolate(to,t);
  1980. crw[j*4+0]=Math::fast_ftoi( CLAMP(c.r*255.0,0,255) );
  1981. crw[j*4+1]=Math::fast_ftoi( CLAMP(c.g*255.0,0,255) );
  1982. crw[j*4+2]=Math::fast_ftoi( CLAMP(c.b*255.0,0,255) );
  1983. crw[j*4+3]=Math::fast_ftoi( CLAMP(c.a*255.0,0,255) );
  1984. }
  1985. at=pos;
  1986. color_at=to;
  1987. }
  1988. }
  1989. Image gradient(color_ramp_len,1,0,Image::FORMAT_RGBA,cramp);
  1990. Ref<ImageTexture> it = memnew( ImageTexture );
  1991. it->create_from_image(gradient,Texture::FLAG_FILTER|Texture::FLAG_MIPMAPS);
  1992. String crampname= "cramp_"+itos(p_node->id);
  1993. set_default_texture_param(crampname,it);
  1994. code +="uniform texture "+crampname+";\n";
  1995. code +="vec4 "+crampname+"_r=tex("+crampname+",vec2("+p_inputs[0]+",0));\n";
  1996. code += OUTNAME(p_node->id,0)+"="+crampname+"_r.rgb;\n";
  1997. code += OUTNAME(p_node->id,1)+"="+crampname+"_r.a;\n";
  1998. }break;
  1999. case NODE_CURVE_MAP: {
  2000. DEF_SCALAR(0);
  2001. static const int curve_map_len=256;
  2002. bool mapped[256];
  2003. zeromem(mapped,sizeof(mapped));
  2004. DVector<uint8_t> cmap;
  2005. cmap.resize(curve_map_len);
  2006. {
  2007. DVector<Point2> points=p_node->param1;
  2008. int pc =points.size();
  2009. DVector<uint8_t>::Write cmw = cmap.write();
  2010. DVector<Point2>::Read pr = points.read();
  2011. Vector2 prev=Vector2(0,0);
  2012. Vector2 prev2=Vector2(0,0);
  2013. for(int i=-1;i<pc;i++) {
  2014. Vector2 next;
  2015. Vector2 next2;
  2016. if (i+1>=pc) {
  2017. next=Vector2(1,1);
  2018. } else {
  2019. next=Vector2(pr[i+1].x,pr[i+1].y);
  2020. }
  2021. if (i+2>=pc) {
  2022. next2=Vector2(1,1);
  2023. } else {
  2024. next2=Vector2(pr[i+2].x,pr[i+2].y);
  2025. }
  2026. /*if (i==-1 && prev.offset==next.offset) {
  2027. prev=next;
  2028. continue;
  2029. }*/
  2030. _plot_curve(prev2,prev,next,next2,cmw.ptr(),mapped);
  2031. prev2=prev;
  2032. prev=next;
  2033. }
  2034. uint8_t pp=0;
  2035. for(int i=0;i<curve_map_len;i++) {
  2036. if (!mapped[i]) {
  2037. cmw[i]=pp;
  2038. } else {
  2039. pp=cmw[i];
  2040. }
  2041. }
  2042. }
  2043. Image gradient(curve_map_len,1,0,Image::FORMAT_GRAYSCALE,cmap);
  2044. Ref<ImageTexture> it = memnew( ImageTexture );
  2045. it->create_from_image(gradient,Texture::FLAG_FILTER|Texture::FLAG_MIPMAPS);
  2046. String cmapname= "cmap_"+itos(p_node->id);
  2047. set_default_texture_param(cmapname,it);
  2048. code +="uniform texture "+cmapname+";\n";
  2049. code += OUTNAME(p_node->id,0)+"=tex("+cmapname+",vec2("+p_inputs[0]+",0)).r;\n";
  2050. }break;
  2051. case NODE_SCALAR_INPUT: {
  2052. String name = p_node->param1;
  2053. float dv=p_node->param2;
  2054. code +="uniform float "+name+"="+rtos(dv)+";\n";
  2055. code += OUTNAME(p_node->id,0)+"="+name+";\n";
  2056. }break;
  2057. case NODE_VEC_INPUT: {
  2058. String name = p_node->param1;
  2059. Vector3 dv=p_node->param2;
  2060. code +="uniform vec3 "+name+"=vec3("+rtos(dv.x)+","+rtos(dv.y)+","+rtos(dv.z)+");\n";
  2061. code += OUTNAME(p_node->id,0)+"="+name+";\n";
  2062. }break;
  2063. case NODE_RGB_INPUT: {
  2064. String name = p_node->param1;
  2065. Color dv= p_node->param2;
  2066. code +="uniform color "+name+"=vec4("+rtos(dv.r)+","+rtos(dv.g)+","+rtos(dv.g)+","+rtos(dv.a)+");\n";
  2067. code += OUTNAME(p_node->id,0)+"="+name+".rgb;\n";
  2068. }break;
  2069. case NODE_XFORM_INPUT: {
  2070. String name = p_node->param1;
  2071. Transform dv= p_node->param2;
  2072. code +="uniform mat4 "+name+"=mat4(\n";
  2073. code+="\tvec4(vec3("+rtos(dv.basis.get_axis(0).x)+","+rtos(dv.basis.get_axis(0).y)+","+rtos(dv.basis.get_axis(0).z)+"),0),\n";
  2074. code+="\tvec4(vec3("+rtos(dv.basis.get_axis(1).x)+","+rtos(dv.basis.get_axis(1).y)+","+rtos(dv.basis.get_axis(1).z)+"),0),\n";
  2075. code+="\tvec4(vec3("+rtos(dv.basis.get_axis(2).x)+","+rtos(dv.basis.get_axis(2).y)+","+rtos(dv.basis.get_axis(2).z)+"),0),\n";
  2076. code+="\tvec4(vec3("+rtos(dv.origin.x)+","+rtos(dv.origin.y)+","+rtos(dv.origin.z)+"),1)\n";
  2077. code+=");";
  2078. code += OUTNAME(p_node->id,0)+"="+name+";\n";
  2079. }break;
  2080. case NODE_TEXTURE_INPUT: {
  2081. DEF_VEC(0);
  2082. String name = p_node->param1;
  2083. String rname="rt_read_tex"+itos(p_node->id);
  2084. code +="uniform texture "+name+";";
  2085. code +="vec4 "+rname+"=tex("+name+","+p_inputs[0]+".xy);\n";
  2086. code += OUTNAME(p_node->id,0)+"="+rname+".rgb;\n";
  2087. code += OUTNAME(p_node->id,1)+"="+rname+".a;\n";
  2088. }break;
  2089. case NODE_CUBEMAP_INPUT: {
  2090. DEF_VEC(0);
  2091. String name = p_node->param1;
  2092. code +="uniform cubemap "+name+";";
  2093. String rname="rt_read_tex"+itos(p_node->id);
  2094. code +="vec4 "+rname+"=texcube("+name+","+p_inputs[0]+".xy);\n";
  2095. code += OUTNAME(p_node->id,0)+"="+rname+".rgb;\n";
  2096. code += OUTNAME(p_node->id,1)+"="+rname+".a;\n";
  2097. }break;
  2098. case NODE_DEFAULT_TEXTURE: {
  2099. DEF_VEC(0);
  2100. if (get_mode()==MODE_CANVAS_ITEM && p_type==SHADER_TYPE_FRAGMENT) {
  2101. String rname="rt_default_tex"+itos(p_node->id);
  2102. code +="vec4 "+rname+"=tex(TEXTURE,"+p_inputs[0]+".xy);\n";
  2103. code += OUTNAME(p_node->id,0)+"="+rname+".rgb;\n";
  2104. code += OUTNAME(p_node->id,1)+"="+rname+".a;\n";
  2105. } else {
  2106. //not supported
  2107. code += OUTNAME(p_node->id,0)+"=vec3(0,0,0);\n";
  2108. code += OUTNAME(p_node->id,1)+"=1.0;\n";
  2109. }
  2110. } break;
  2111. case NODE_OUTPUT: {
  2112. }break;
  2113. case NODE_COMMENT: {
  2114. }break;
  2115. case NODE_TYPE_MAX: {
  2116. }
  2117. }
  2118. #undef DEF_SCALAR
  2119. #undef DEF_COLOR
  2120. #undef DEF_MATRIX
  2121. #undef DEF_VEC
  2122. }