shader_graph.cpp 85 KB

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