visual_shader_nodes.cpp 98 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087
  1. /*************************************************************************/
  2. /* visual_shader_nodes.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #include "visual_shader_nodes.h"
  31. ////////////// Scalar
  32. String VisualShaderNodeScalarConstant::get_caption() const {
  33. return "Scalar";
  34. }
  35. int VisualShaderNodeScalarConstant::get_input_port_count() const {
  36. return 0;
  37. }
  38. VisualShaderNodeScalarConstant::PortType VisualShaderNodeScalarConstant::get_input_port_type(int p_port) const {
  39. return PORT_TYPE_SCALAR;
  40. }
  41. String VisualShaderNodeScalarConstant::get_input_port_name(int p_port) const {
  42. return String();
  43. }
  44. int VisualShaderNodeScalarConstant::get_output_port_count() const {
  45. return 1;
  46. }
  47. VisualShaderNodeScalarConstant::PortType VisualShaderNodeScalarConstant::get_output_port_type(int p_port) const {
  48. return PORT_TYPE_SCALAR;
  49. }
  50. String VisualShaderNodeScalarConstant::get_output_port_name(int p_port) const {
  51. return ""; //no output port means the editor will be used as port
  52. }
  53. String VisualShaderNodeScalarConstant::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  54. return "\t" + p_output_vars[0] + " = " + vformat("%.6f", constant) + ";\n";
  55. }
  56. void VisualShaderNodeScalarConstant::set_constant(float p_value) {
  57. constant = p_value;
  58. emit_changed();
  59. }
  60. float VisualShaderNodeScalarConstant::get_constant() const {
  61. return constant;
  62. }
  63. Vector<StringName> VisualShaderNodeScalarConstant::get_editable_properties() const {
  64. Vector<StringName> props;
  65. props.push_back("constant");
  66. return props;
  67. }
  68. void VisualShaderNodeScalarConstant::_bind_methods() {
  69. ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeScalarConstant::set_constant);
  70. ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeScalarConstant::get_constant);
  71. ADD_PROPERTY(PropertyInfo(Variant::REAL, "constant"), "set_constant", "get_constant");
  72. }
  73. VisualShaderNodeScalarConstant::VisualShaderNodeScalarConstant() {
  74. constant = 0;
  75. }
  76. ////////////// Boolean
  77. String VisualShaderNodeBooleanConstant::get_caption() const {
  78. return "Boolean";
  79. }
  80. int VisualShaderNodeBooleanConstant::get_input_port_count() const {
  81. return 0;
  82. }
  83. VisualShaderNodeBooleanConstant::PortType VisualShaderNodeBooleanConstant::get_input_port_type(int p_port) const {
  84. return PORT_TYPE_BOOLEAN;
  85. }
  86. String VisualShaderNodeBooleanConstant::get_input_port_name(int p_port) const {
  87. return String();
  88. }
  89. int VisualShaderNodeBooleanConstant::get_output_port_count() const {
  90. return 1;
  91. }
  92. VisualShaderNodeBooleanConstant::PortType VisualShaderNodeBooleanConstant::get_output_port_type(int p_port) const {
  93. return PORT_TYPE_BOOLEAN;
  94. }
  95. String VisualShaderNodeBooleanConstant::get_output_port_name(int p_port) const {
  96. return ""; //no output port means the editor will be used as port
  97. }
  98. String VisualShaderNodeBooleanConstant::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  99. return "\t" + p_output_vars[0] + " = " + (constant ? "true" : "false") + ";\n";
  100. }
  101. void VisualShaderNodeBooleanConstant::set_constant(bool p_value) {
  102. constant = p_value;
  103. emit_changed();
  104. }
  105. bool VisualShaderNodeBooleanConstant::get_constant() const {
  106. return constant;
  107. }
  108. Vector<StringName> VisualShaderNodeBooleanConstant::get_editable_properties() const {
  109. Vector<StringName> props;
  110. props.push_back("constant");
  111. return props;
  112. }
  113. void VisualShaderNodeBooleanConstant::_bind_methods() {
  114. ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeBooleanConstant::set_constant);
  115. ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeBooleanConstant::get_constant);
  116. ADD_PROPERTY(PropertyInfo(Variant::BOOL, "constant"), "set_constant", "get_constant");
  117. }
  118. VisualShaderNodeBooleanConstant::VisualShaderNodeBooleanConstant() {
  119. constant = false;
  120. }
  121. ////////////// Color
  122. String VisualShaderNodeColorConstant::get_caption() const {
  123. return "Color";
  124. }
  125. int VisualShaderNodeColorConstant::get_input_port_count() const {
  126. return 0;
  127. }
  128. VisualShaderNodeColorConstant::PortType VisualShaderNodeColorConstant::get_input_port_type(int p_port) const {
  129. return PORT_TYPE_VECTOR;
  130. }
  131. String VisualShaderNodeColorConstant::get_input_port_name(int p_port) const {
  132. return String();
  133. }
  134. int VisualShaderNodeColorConstant::get_output_port_count() const {
  135. return 2;
  136. }
  137. VisualShaderNodeColorConstant::PortType VisualShaderNodeColorConstant::get_output_port_type(int p_port) const {
  138. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  139. }
  140. String VisualShaderNodeColorConstant::get_output_port_name(int p_port) const {
  141. return p_port == 0 ? "" : "alpha"; //no output port means the editor will be used as port
  142. }
  143. String VisualShaderNodeColorConstant::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  144. String code;
  145. code += "\t" + p_output_vars[0] + " = " + vformat("vec3(%.6f,%.6f,%.6f)", constant.r, constant.g, constant.b) + ";\n";
  146. code += "\t" + p_output_vars[1] + " = " + vformat("%.6f", constant.a) + ";\n";
  147. return code;
  148. }
  149. void VisualShaderNodeColorConstant::set_constant(Color p_value) {
  150. constant = p_value;
  151. emit_changed();
  152. }
  153. Color VisualShaderNodeColorConstant::get_constant() const {
  154. return constant;
  155. }
  156. Vector<StringName> VisualShaderNodeColorConstant::get_editable_properties() const {
  157. Vector<StringName> props;
  158. props.push_back("constant");
  159. return props;
  160. }
  161. void VisualShaderNodeColorConstant::_bind_methods() {
  162. ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeColorConstant::set_constant);
  163. ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeColorConstant::get_constant);
  164. ADD_PROPERTY(PropertyInfo(Variant::COLOR, "constant"), "set_constant", "get_constant");
  165. }
  166. VisualShaderNodeColorConstant::VisualShaderNodeColorConstant() {
  167. constant = Color(1, 1, 1, 1);
  168. }
  169. ////////////// Vector
  170. String VisualShaderNodeVec3Constant::get_caption() const {
  171. return "Vector";
  172. }
  173. int VisualShaderNodeVec3Constant::get_input_port_count() const {
  174. return 0;
  175. }
  176. VisualShaderNodeVec3Constant::PortType VisualShaderNodeVec3Constant::get_input_port_type(int p_port) const {
  177. return PORT_TYPE_VECTOR;
  178. }
  179. String VisualShaderNodeVec3Constant::get_input_port_name(int p_port) const {
  180. return String();
  181. }
  182. int VisualShaderNodeVec3Constant::get_output_port_count() const {
  183. return 1;
  184. }
  185. VisualShaderNodeVec3Constant::PortType VisualShaderNodeVec3Constant::get_output_port_type(int p_port) const {
  186. return PORT_TYPE_VECTOR;
  187. }
  188. String VisualShaderNodeVec3Constant::get_output_port_name(int p_port) const {
  189. return ""; //no output port means the editor will be used as port
  190. }
  191. String VisualShaderNodeVec3Constant::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  192. return "\t" + p_output_vars[0] + " = " + vformat("vec3(%.6f,%.6f,%.6f)", constant.x, constant.y, constant.z) + ";\n";
  193. }
  194. void VisualShaderNodeVec3Constant::set_constant(Vector3 p_value) {
  195. constant = p_value;
  196. emit_changed();
  197. }
  198. Vector3 VisualShaderNodeVec3Constant::get_constant() const {
  199. return constant;
  200. }
  201. Vector<StringName> VisualShaderNodeVec3Constant::get_editable_properties() const {
  202. Vector<StringName> props;
  203. props.push_back("constant");
  204. return props;
  205. }
  206. void VisualShaderNodeVec3Constant::_bind_methods() {
  207. ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeVec3Constant::set_constant);
  208. ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeVec3Constant::get_constant);
  209. ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "constant"), "set_constant", "get_constant");
  210. }
  211. VisualShaderNodeVec3Constant::VisualShaderNodeVec3Constant() {
  212. }
  213. ////////////// Transform
  214. String VisualShaderNodeTransformConstant::get_caption() const {
  215. return "Transform";
  216. }
  217. int VisualShaderNodeTransformConstant::get_input_port_count() const {
  218. return 0;
  219. }
  220. VisualShaderNodeTransformConstant::PortType VisualShaderNodeTransformConstant::get_input_port_type(int p_port) const {
  221. return PORT_TYPE_VECTOR;
  222. }
  223. String VisualShaderNodeTransformConstant::get_input_port_name(int p_port) const {
  224. return String();
  225. }
  226. int VisualShaderNodeTransformConstant::get_output_port_count() const {
  227. return 1;
  228. }
  229. VisualShaderNodeTransformConstant::PortType VisualShaderNodeTransformConstant::get_output_port_type(int p_port) const {
  230. return PORT_TYPE_TRANSFORM;
  231. }
  232. String VisualShaderNodeTransformConstant::get_output_port_name(int p_port) const {
  233. return ""; //no output port means the editor will be used as port
  234. }
  235. String VisualShaderNodeTransformConstant::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  236. Transform t = constant;
  237. t.basis.transpose();
  238. String code = "\t" + p_output_vars[0] + " = mat4(";
  239. code += vformat("vec4(%.6f,%.6f,%.6f,0.0),", t.basis[0].x, t.basis[0].y, t.basis[0].z);
  240. code += vformat("vec4(%.6f,%.6f,%.6f,0.0),", t.basis[1].x, t.basis[1].y, t.basis[1].z);
  241. code += vformat("vec4(%.6f,%.6f,%.6f,0.0),", t.basis[2].x, t.basis[2].y, t.basis[2].z);
  242. code += vformat("vec4(%.6f,%.6f,%.6f,1.0) );\n", t.origin.x, t.origin.y, t.origin.z);
  243. return code;
  244. }
  245. void VisualShaderNodeTransformConstant::set_constant(Transform p_value) {
  246. constant = p_value;
  247. emit_changed();
  248. }
  249. Transform VisualShaderNodeTransformConstant::get_constant() const {
  250. return constant;
  251. }
  252. Vector<StringName> VisualShaderNodeTransformConstant::get_editable_properties() const {
  253. Vector<StringName> props;
  254. props.push_back("constant");
  255. return props;
  256. }
  257. void VisualShaderNodeTransformConstant::_bind_methods() {
  258. ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeTransformConstant::set_constant);
  259. ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeTransformConstant::get_constant);
  260. ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM, "constant"), "set_constant", "get_constant");
  261. }
  262. VisualShaderNodeTransformConstant::VisualShaderNodeTransformConstant() {
  263. }
  264. ////////////// Texture
  265. String VisualShaderNodeTexture::get_caption() const {
  266. return "Texture";
  267. }
  268. int VisualShaderNodeTexture::get_input_port_count() const {
  269. return 2;
  270. }
  271. VisualShaderNodeTexture::PortType VisualShaderNodeTexture::get_input_port_type(int p_port) const {
  272. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  273. }
  274. String VisualShaderNodeTexture::get_input_port_name(int p_port) const {
  275. return p_port == 0 ? "uv" : "lod";
  276. }
  277. int VisualShaderNodeTexture::get_output_port_count() const {
  278. return 2;
  279. }
  280. VisualShaderNodeTexture::PortType VisualShaderNodeTexture::get_output_port_type(int p_port) const {
  281. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  282. }
  283. String VisualShaderNodeTexture::get_output_port_name(int p_port) const {
  284. return p_port == 0 ? "rgb" : "alpha";
  285. }
  286. static String make_unique_id(VisualShader::Type p_type, int p_id, const String &p_name) {
  287. static const char *typepf[VisualShader::TYPE_MAX] = { "vtx", "frg", "lgt" };
  288. return p_name + "_" + String(typepf[p_type]) + "_" + itos(p_id);
  289. }
  290. Vector<VisualShader::DefaultTextureParam> VisualShaderNodeTexture::get_default_texture_parameters(VisualShader::Type p_type, int p_id) const {
  291. VisualShader::DefaultTextureParam dtp;
  292. dtp.name = make_unique_id(p_type, p_id, "tex");
  293. dtp.param = texture;
  294. Vector<VisualShader::DefaultTextureParam> ret;
  295. ret.push_back(dtp);
  296. return ret;
  297. }
  298. String VisualShaderNodeTexture::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  299. if (source == SOURCE_TEXTURE) {
  300. String u = "uniform sampler2D " + make_unique_id(p_type, p_id, "tex");
  301. switch (texture_type) {
  302. case TYPE_DATA: break;
  303. case TYPE_COLOR: u += " : hint_albedo"; break;
  304. case TYPE_NORMALMAP: u += " : hint_normal"; break;
  305. }
  306. return u + ";";
  307. }
  308. return String();
  309. }
  310. String VisualShaderNodeTexture::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  311. if (source == SOURCE_TEXTURE) {
  312. String id = make_unique_id(p_type, p_id, "tex");
  313. String code;
  314. if (p_input_vars[0] == String()) { //none bound, do nothing
  315. code += "\tvec4 " + id + "_read = vec4(0.0);\n";
  316. } else if (p_input_vars[1] == String()) {
  317. //no lod
  318. code += "\tvec4 " + id + "_read = texture( " + id + " , " + p_input_vars[0] + ".xy );\n";
  319. } else {
  320. code += "\tvec4 " + id + "_read = textureLod( " + id + " , " + p_input_vars[0] + ".xy , " + p_input_vars[1] + " );\n";
  321. }
  322. code += "\t" + p_output_vars[0] + " = " + id + "_read.rgb;\n";
  323. code += "\t" + p_output_vars[1] + " = " + id + "_read.a;\n";
  324. return code;
  325. }
  326. if (source == SOURCE_SCREEN && (p_mode == Shader::MODE_SPATIAL || p_mode == Shader::MODE_CANVAS_ITEM) && p_type == VisualShader::TYPE_FRAGMENT) {
  327. String code = "\t{\n";
  328. if (p_input_vars[0] == String() || p_for_preview) { //none bound, do nothing
  329. code += "\t\tvec4 _tex_read = vec4(0.0);\n";
  330. } else if (p_input_vars[1] == String()) {
  331. //no lod
  332. code += "\t\tvec4 _tex_read = textureLod( SCREEN_TEXTURE , " + p_input_vars[0] + ".xy, 0.0 );\n";
  333. } else {
  334. code += "\t\tvec4 _tex_read = textureLod( SCREEN_TEXTURE , " + p_input_vars[0] + ".xy , " + p_input_vars[1] + " );\n";
  335. }
  336. code += "\t\t" + p_output_vars[0] + " = _tex_read.rgb;\n";
  337. code += "\t\t" + p_output_vars[1] + " = _tex_read.a;\n";
  338. code += "\t}\n";
  339. return code;
  340. }
  341. if (source == SOURCE_2D_TEXTURE && p_mode == Shader::MODE_CANVAS_ITEM && p_type == VisualShader::TYPE_FRAGMENT) {
  342. String code = "\t{\n";
  343. if (p_input_vars[0] == String()) { //none bound, do nothing
  344. code += "\t\tvec4 _tex_read = vec4(0.0);\n";
  345. } else if (p_input_vars[1] == String()) {
  346. //no lod
  347. code += "\t\tvec4 _tex_read = texture( TEXTURE , " + p_input_vars[0] + ".xy );\n";
  348. } else {
  349. code += "\t\tvec4 _tex_read = textureLod( TEXTURE , " + p_input_vars[0] + ".xy , " + p_input_vars[1] + " );\n";
  350. }
  351. code += "\t\t" + p_output_vars[0] + " = _tex_read.rgb;\n";
  352. code += "\t\t" + p_output_vars[1] + " = _tex_read.a;\n";
  353. code += "\t}\n";
  354. return code;
  355. }
  356. if (source == SOURCE_2D_NORMAL && p_mode == Shader::MODE_CANVAS_ITEM && p_type == VisualShader::TYPE_FRAGMENT) {
  357. String code = "\t{\n";
  358. if (p_input_vars[0] == String()) { //none bound, do nothing
  359. code += "\t\tvec4 _tex_read = vec4(0.0);\n";
  360. } else if (p_input_vars[1] == String()) {
  361. //no lod
  362. code += "\t\tvec4 _tex_read = texture( NORMAL_TEXTURE , " + p_input_vars[0] + ".xy );\n";
  363. } else {
  364. code += "\t\tvec4 _tex_read = textureLod( NORMAL_TEXTURE , " + p_input_vars[0] + ".xy , " + p_input_vars[1] + " );\n";
  365. }
  366. code += "\t\t" + p_output_vars[0] + " = _tex_read.rgb;\n";
  367. code += "\t\t" + p_output_vars[1] + " = _tex_read.a;\n";
  368. code += "\t}\n";
  369. return code;
  370. }
  371. //none
  372. String code;
  373. code += "\t" + p_output_vars[0] + " = vec3(0.0);\n";
  374. code += "\t" + p_output_vars[1] + " = 1.0;\n";
  375. return code;
  376. }
  377. void VisualShaderNodeTexture::set_source(Source p_source) {
  378. source = p_source;
  379. emit_changed();
  380. emit_signal("editor_refresh_request");
  381. }
  382. VisualShaderNodeTexture::Source VisualShaderNodeTexture::get_source() const {
  383. return source;
  384. }
  385. void VisualShaderNodeTexture::set_texture(Ref<Texture> p_value) {
  386. texture = p_value;
  387. emit_changed();
  388. }
  389. Ref<Texture> VisualShaderNodeTexture::get_texture() const {
  390. return texture;
  391. }
  392. void VisualShaderNodeTexture::set_texture_type(TextureType p_type) {
  393. texture_type = p_type;
  394. emit_changed();
  395. }
  396. VisualShaderNodeTexture::TextureType VisualShaderNodeTexture::get_texture_type() const {
  397. return texture_type;
  398. }
  399. Vector<StringName> VisualShaderNodeTexture::get_editable_properties() const {
  400. Vector<StringName> props;
  401. props.push_back("source");
  402. if (source == SOURCE_TEXTURE) {
  403. props.push_back("texture");
  404. props.push_back("texture_type");
  405. }
  406. return props;
  407. }
  408. String VisualShaderNodeTexture::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const {
  409. if (source == SOURCE_TEXTURE) {
  410. return String(); // all good
  411. }
  412. if (source == SOURCE_SCREEN && (p_mode == Shader::MODE_SPATIAL || p_mode == Shader::MODE_CANVAS_ITEM) && p_type == VisualShader::TYPE_FRAGMENT) {
  413. return String(); // all good
  414. }
  415. if (source == SOURCE_2D_TEXTURE && p_mode == Shader::MODE_CANVAS_ITEM && p_type == VisualShader::TYPE_FRAGMENT) {
  416. return String(); // all good
  417. }
  418. if (source == SOURCE_2D_NORMAL && p_mode == Shader::MODE_CANVAS_ITEM) {
  419. return String(); // all good
  420. }
  421. return TTR("Invalid source for shader.");
  422. }
  423. void VisualShaderNodeTexture::_bind_methods() {
  424. ClassDB::bind_method(D_METHOD("set_source", "value"), &VisualShaderNodeTexture::set_source);
  425. ClassDB::bind_method(D_METHOD("get_source"), &VisualShaderNodeTexture::get_source);
  426. ClassDB::bind_method(D_METHOD("set_texture", "value"), &VisualShaderNodeTexture::set_texture);
  427. ClassDB::bind_method(D_METHOD("get_texture"), &VisualShaderNodeTexture::get_texture);
  428. ClassDB::bind_method(D_METHOD("set_texture_type", "value"), &VisualShaderNodeTexture::set_texture_type);
  429. ClassDB::bind_method(D_METHOD("get_texture_type"), &VisualShaderNodeTexture::get_texture_type);
  430. ADD_PROPERTY(PropertyInfo(Variant::INT, "source", PROPERTY_HINT_ENUM, "Texture,Screen,Texture2D,NormalMap2D"), "set_source", "get_source");
  431. ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture");
  432. ADD_PROPERTY(PropertyInfo(Variant::INT, "texture_type", PROPERTY_HINT_ENUM, "Data,Color,Normalmap"), "set_texture_type", "get_texture_type");
  433. BIND_ENUM_CONSTANT(SOURCE_TEXTURE);
  434. BIND_ENUM_CONSTANT(SOURCE_SCREEN);
  435. BIND_ENUM_CONSTANT(SOURCE_2D_TEXTURE);
  436. BIND_ENUM_CONSTANT(SOURCE_2D_NORMAL);
  437. BIND_ENUM_CONSTANT(TYPE_DATA);
  438. BIND_ENUM_CONSTANT(TYPE_COLOR);
  439. BIND_ENUM_CONSTANT(TYPE_NORMALMAP);
  440. }
  441. VisualShaderNodeTexture::VisualShaderNodeTexture() {
  442. texture_type = TYPE_DATA;
  443. source = SOURCE_TEXTURE;
  444. }
  445. ////////////// CubeMap
  446. String VisualShaderNodeCubeMap::get_caption() const {
  447. return "CubeMap";
  448. }
  449. int VisualShaderNodeCubeMap::get_input_port_count() const {
  450. return 2;
  451. }
  452. VisualShaderNodeCubeMap::PortType VisualShaderNodeCubeMap::get_input_port_type(int p_port) const {
  453. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  454. }
  455. String VisualShaderNodeCubeMap::get_input_port_name(int p_port) const {
  456. return p_port == 0 ? "uv" : "lod";
  457. }
  458. int VisualShaderNodeCubeMap::get_output_port_count() const {
  459. return 2;
  460. }
  461. VisualShaderNodeCubeMap::PortType VisualShaderNodeCubeMap::get_output_port_type(int p_port) const {
  462. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  463. }
  464. String VisualShaderNodeCubeMap::get_output_port_name(int p_port) const {
  465. return p_port == 0 ? "rgb" : "alpha";
  466. }
  467. Vector<VisualShader::DefaultTextureParam> VisualShaderNodeCubeMap::get_default_texture_parameters(VisualShader::Type p_type, int p_id) const {
  468. VisualShader::DefaultTextureParam dtp;
  469. dtp.name = make_unique_id(p_type, p_id, "cube");
  470. dtp.param = cube_map;
  471. Vector<VisualShader::DefaultTextureParam> ret;
  472. ret.push_back(dtp);
  473. return ret;
  474. }
  475. String VisualShaderNodeCubeMap::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  476. String u = "uniform sampler2DCube " + make_unique_id(p_type, p_id, "cube");
  477. switch (texture_type) {
  478. case TYPE_DATA: break;
  479. case TYPE_COLOR: u += " : hint_albedo"; break;
  480. case TYPE_NORMALMAP: u += " : hint_normal"; break;
  481. }
  482. return u + ";";
  483. }
  484. String VisualShaderNodeCubeMap::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  485. String id = make_unique_id(p_type, p_id, "cube");
  486. String code;
  487. if (p_input_vars[0] == String()) { //none bound, do nothing
  488. code += "\tvec4 " + id + "_read = vec4(0.0);\n";
  489. } else if (p_input_vars[1] == String()) {
  490. //no lod
  491. code += "\tvec4 " + id + "_read = texture( " + id + " , " + p_input_vars[0] + " );\n";
  492. } else {
  493. code += "\tvec4 " + id + "_read = textureLod( " + id + " , " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n";
  494. }
  495. code += "\t" + p_output_vars[0] + " = " + id + "_read.rgb;\n";
  496. code += "\t" + p_output_vars[1] + " = " + id + "_read.a;\n";
  497. return code;
  498. }
  499. void VisualShaderNodeCubeMap::set_cube_map(Ref<CubeMap> p_value) {
  500. cube_map = p_value;
  501. emit_changed();
  502. }
  503. Ref<CubeMap> VisualShaderNodeCubeMap::get_cube_map() const {
  504. return cube_map;
  505. }
  506. void VisualShaderNodeCubeMap::set_texture_type(TextureType p_type) {
  507. texture_type = p_type;
  508. emit_changed();
  509. }
  510. VisualShaderNodeCubeMap::TextureType VisualShaderNodeCubeMap::get_texture_type() const {
  511. return texture_type;
  512. }
  513. Vector<StringName> VisualShaderNodeCubeMap::get_editable_properties() const {
  514. Vector<StringName> props;
  515. props.push_back("cube_map");
  516. props.push_back("texture_type");
  517. return props;
  518. }
  519. void VisualShaderNodeCubeMap::_bind_methods() {
  520. ClassDB::bind_method(D_METHOD("set_cube_map", "value"), &VisualShaderNodeCubeMap::set_cube_map);
  521. ClassDB::bind_method(D_METHOD("get_cube_map"), &VisualShaderNodeCubeMap::get_cube_map);
  522. ClassDB::bind_method(D_METHOD("set_texture_type", "value"), &VisualShaderNodeCubeMap::set_texture_type);
  523. ClassDB::bind_method(D_METHOD("get_texture_type"), &VisualShaderNodeCubeMap::get_texture_type);
  524. ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "cube_map", PROPERTY_HINT_RESOURCE_TYPE, "CubeMap"), "set_cube_map", "get_cube_map");
  525. ADD_PROPERTY(PropertyInfo(Variant::INT, "texture_type", PROPERTY_HINT_ENUM, "Data,Color,Normalmap"), "set_texture_type", "get_texture_type");
  526. BIND_ENUM_CONSTANT(TYPE_DATA);
  527. BIND_ENUM_CONSTANT(TYPE_COLOR);
  528. BIND_ENUM_CONSTANT(TYPE_NORMALMAP);
  529. }
  530. VisualShaderNodeCubeMap::VisualShaderNodeCubeMap() {
  531. texture_type = TYPE_DATA;
  532. }
  533. ////////////// Scalar Op
  534. String VisualShaderNodeScalarOp::get_caption() const {
  535. return "ScalarOp";
  536. }
  537. int VisualShaderNodeScalarOp::get_input_port_count() const {
  538. return 2;
  539. }
  540. VisualShaderNodeScalarOp::PortType VisualShaderNodeScalarOp::get_input_port_type(int p_port) const {
  541. return PORT_TYPE_SCALAR;
  542. }
  543. String VisualShaderNodeScalarOp::get_input_port_name(int p_port) const {
  544. return p_port == 0 ? "a" : "b";
  545. }
  546. int VisualShaderNodeScalarOp::get_output_port_count() const {
  547. return 1;
  548. }
  549. VisualShaderNodeScalarOp::PortType VisualShaderNodeScalarOp::get_output_port_type(int p_port) const {
  550. return PORT_TYPE_SCALAR;
  551. }
  552. String VisualShaderNodeScalarOp::get_output_port_name(int p_port) const {
  553. return "op"; //no output port means the editor will be used as port
  554. }
  555. String VisualShaderNodeScalarOp::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  556. String code = "\t" + p_output_vars[0] + " = ";
  557. switch (op) {
  558. case OP_ADD: code += p_input_vars[0] + " + " + p_input_vars[1] + ";\n"; break;
  559. case OP_SUB: code += p_input_vars[0] + " - " + p_input_vars[1] + ";\n"; break;
  560. case OP_MUL: code += p_input_vars[0] + " * " + p_input_vars[1] + ";\n"; break;
  561. case OP_DIV: code += p_input_vars[0] + " / " + p_input_vars[1] + ";\n"; break;
  562. case OP_MOD: code += "mod( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n"; break;
  563. case OP_POW: code += "pow( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n"; break;
  564. case OP_MAX: code += "max( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n"; break;
  565. case OP_MIN: code += "min( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n"; break;
  566. case OP_ATAN2: code += "atan( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n"; break;
  567. case OP_STEP: code += "step( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n"; break;
  568. }
  569. return code;
  570. }
  571. void VisualShaderNodeScalarOp::set_operator(Operator p_op) {
  572. op = p_op;
  573. emit_changed();
  574. }
  575. VisualShaderNodeScalarOp::Operator VisualShaderNodeScalarOp::get_operator() const {
  576. return op;
  577. }
  578. Vector<StringName> VisualShaderNodeScalarOp::get_editable_properties() const {
  579. Vector<StringName> props;
  580. props.push_back("operator");
  581. return props;
  582. }
  583. void VisualShaderNodeScalarOp::_bind_methods() {
  584. ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeScalarOp::set_operator);
  585. ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeScalarOp::get_operator);
  586. ADD_PROPERTY(PropertyInfo(Variant::INT, "operator", PROPERTY_HINT_ENUM, "Add,Sub,Multiply,Divide,Remainder,Power,Max,Min,Atan2,Step"), "set_operator", "get_operator");
  587. BIND_ENUM_CONSTANT(OP_ADD);
  588. BIND_ENUM_CONSTANT(OP_SUB);
  589. BIND_ENUM_CONSTANT(OP_MUL);
  590. BIND_ENUM_CONSTANT(OP_DIV);
  591. BIND_ENUM_CONSTANT(OP_MOD);
  592. BIND_ENUM_CONSTANT(OP_POW);
  593. BIND_ENUM_CONSTANT(OP_MAX);
  594. BIND_ENUM_CONSTANT(OP_MIN);
  595. BIND_ENUM_CONSTANT(OP_ATAN2);
  596. BIND_ENUM_CONSTANT(OP_STEP);
  597. }
  598. VisualShaderNodeScalarOp::VisualShaderNodeScalarOp() {
  599. op = OP_ADD;
  600. set_input_port_default_value(0, 0.0);
  601. set_input_port_default_value(1, 0.0);
  602. }
  603. ////////////// Vector Op
  604. String VisualShaderNodeVectorOp::get_caption() const {
  605. return "VectorOp";
  606. }
  607. int VisualShaderNodeVectorOp::get_input_port_count() const {
  608. return 2;
  609. }
  610. VisualShaderNodeVectorOp::PortType VisualShaderNodeVectorOp::get_input_port_type(int p_port) const {
  611. return PORT_TYPE_VECTOR;
  612. }
  613. String VisualShaderNodeVectorOp::get_input_port_name(int p_port) const {
  614. return p_port == 0 ? "a" : "b";
  615. }
  616. int VisualShaderNodeVectorOp::get_output_port_count() const {
  617. return 1;
  618. }
  619. VisualShaderNodeVectorOp::PortType VisualShaderNodeVectorOp::get_output_port_type(int p_port) const {
  620. return PORT_TYPE_VECTOR;
  621. }
  622. String VisualShaderNodeVectorOp::get_output_port_name(int p_port) const {
  623. return "op"; //no output port means the editor will be used as port
  624. }
  625. String VisualShaderNodeVectorOp::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  626. String code = "\t" + p_output_vars[0] + " = ";
  627. switch (op) {
  628. case OP_ADD: code += p_input_vars[0] + " + " + p_input_vars[1] + ";\n"; break;
  629. case OP_SUB: code += p_input_vars[0] + " - " + p_input_vars[1] + ";\n"; break;
  630. case OP_MUL: code += p_input_vars[0] + " * " + p_input_vars[1] + ";\n"; break;
  631. case OP_DIV: code += p_input_vars[0] + " / " + p_input_vars[1] + ";\n"; break;
  632. case OP_MOD: code += "mod( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n"; break;
  633. case OP_POW: code += "pow( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n"; break;
  634. case OP_MAX: code += "max( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n"; break;
  635. case OP_MIN: code += "min( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n"; break;
  636. case OP_CROSS: code += "cross( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n"; break;
  637. case OP_ATAN2: code += "atan( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n"; break;
  638. case OP_REFLECT: code += "reflect( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n"; break;
  639. case OP_STEP: code += "step( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n"; break;
  640. }
  641. return code;
  642. }
  643. void VisualShaderNodeVectorOp::set_operator(Operator p_op) {
  644. op = p_op;
  645. emit_changed();
  646. }
  647. VisualShaderNodeVectorOp::Operator VisualShaderNodeVectorOp::get_operator() const {
  648. return op;
  649. }
  650. Vector<StringName> VisualShaderNodeVectorOp::get_editable_properties() const {
  651. Vector<StringName> props;
  652. props.push_back("operator");
  653. return props;
  654. }
  655. void VisualShaderNodeVectorOp::_bind_methods() {
  656. ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeVectorOp::set_operator);
  657. ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeVectorOp::get_operator);
  658. ADD_PROPERTY(PropertyInfo(Variant::INT, "operator", PROPERTY_HINT_ENUM, "Add,Sub,Multiply,Divide,Remainder,Power,Max,Min,Cross,Atan2,Reflect,Step"), "set_operator", "get_operator");
  659. BIND_ENUM_CONSTANT(OP_ADD);
  660. BIND_ENUM_CONSTANT(OP_SUB);
  661. BIND_ENUM_CONSTANT(OP_MUL);
  662. BIND_ENUM_CONSTANT(OP_DIV);
  663. BIND_ENUM_CONSTANT(OP_MOD);
  664. BIND_ENUM_CONSTANT(OP_POW);
  665. BIND_ENUM_CONSTANT(OP_MAX);
  666. BIND_ENUM_CONSTANT(OP_MIN);
  667. BIND_ENUM_CONSTANT(OP_CROSS);
  668. BIND_ENUM_CONSTANT(OP_ATAN2);
  669. BIND_ENUM_CONSTANT(OP_REFLECT);
  670. BIND_ENUM_CONSTANT(OP_STEP);
  671. }
  672. VisualShaderNodeVectorOp::VisualShaderNodeVectorOp() {
  673. op = OP_ADD;
  674. set_input_port_default_value(0, Vector3());
  675. set_input_port_default_value(1, Vector3());
  676. }
  677. ////////////// Color Op
  678. String VisualShaderNodeColorOp::get_caption() const {
  679. return "ColorOp";
  680. }
  681. int VisualShaderNodeColorOp::get_input_port_count() const {
  682. return 2;
  683. }
  684. VisualShaderNodeColorOp::PortType VisualShaderNodeColorOp::get_input_port_type(int p_port) const {
  685. return PORT_TYPE_VECTOR;
  686. }
  687. String VisualShaderNodeColorOp::get_input_port_name(int p_port) const {
  688. return p_port == 0 ? "a" : "b";
  689. }
  690. int VisualShaderNodeColorOp::get_output_port_count() const {
  691. return 1;
  692. }
  693. VisualShaderNodeColorOp::PortType VisualShaderNodeColorOp::get_output_port_type(int p_port) const {
  694. return PORT_TYPE_VECTOR;
  695. }
  696. String VisualShaderNodeColorOp::get_output_port_name(int p_port) const {
  697. return "op"; //no output port means the editor will be used as port
  698. }
  699. String VisualShaderNodeColorOp::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  700. String code;
  701. static const char *axisn[3] = { "x", "y", "z" };
  702. switch (op) {
  703. case OP_SCREEN: {
  704. code += "\t" + p_output_vars[0] + "=vec3(1.0)-(vec3(1.0)-" + p_input_vars[0] + ")*(vec3(1.0)-" + p_input_vars[1] + ");\n";
  705. } break;
  706. case OP_DIFFERENCE: {
  707. code += "\t" + p_output_vars[0] + "=abs(" + p_input_vars[0] + "-" + p_input_vars[1] + ");\n";
  708. } break;
  709. case OP_DARKEN: {
  710. code += "\t" + p_output_vars[0] + "=min(" + p_input_vars[0] + "," + p_input_vars[1] + ");\n";
  711. } break;
  712. case OP_LIGHTEN: {
  713. code += "\t" + p_output_vars[0] + "=max(" + p_input_vars[0] + "," + p_input_vars[1] + ");\n";
  714. } break;
  715. case OP_OVERLAY: {
  716. for (int i = 0; i < 3; i++) {
  717. code += "\t{\n";
  718. code += "\t\tfloat base=" + p_input_vars[0] + "." + axisn[i] + ";\n";
  719. code += "\t\tfloat blend=" + p_input_vars[1] + "." + axisn[i] + ";\n";
  720. code += "\t\tif (base < 0.5) {\n";
  721. code += "\t\t\t" + p_output_vars[0] + "." + axisn[i] + " = 2.0 * base * blend;\n";
  722. code += "\t\t} else {\n";
  723. code += "\t\t\t" + p_output_vars[0] + "." + axisn[i] + " = 1.0 - 2.0 * (1.0 - blend) * (1.0 - base);\n";
  724. code += "\t\t}\n";
  725. code += "\t}\n";
  726. }
  727. } break;
  728. case OP_DODGE: {
  729. code += "\t" + p_output_vars[0] + "=(" + p_input_vars[0] + ")/(vec3(1.0)-" + p_input_vars[1] + ");\n";
  730. } break;
  731. case OP_BURN: {
  732. code += "\t" + p_output_vars[0] + "=vec3(1.0)-(vec3(1.0)-" + p_input_vars[0] + ")/(" + p_input_vars[1] + ");\n";
  733. } break;
  734. case OP_SOFT_LIGHT: {
  735. for (int i = 0; i < 3; i++) {
  736. code += "\t{\n";
  737. code += "\t\tfloat base=" + p_input_vars[0] + "." + axisn[i] + ";\n";
  738. code += "\t\tfloat blend=" + p_input_vars[1] + "." + axisn[i] + ";\n";
  739. code += "\t\tif (base < 0.5) {\n";
  740. code += "\t\t\t" + p_output_vars[0] + "." + axisn[i] + " = (base * (blend+0.5));\n";
  741. code += "\t\t} else {\n";
  742. code += "\t\t\t" + p_output_vars[0] + "." + axisn[i] + " = (1.0 - (1.0-base) * (1.0-(blend-0.5)));\n";
  743. code += "\t\t}\n";
  744. code += "\t}\n";
  745. }
  746. } break;
  747. case OP_HARD_LIGHT: {
  748. for (int i = 0; i < 3; i++) {
  749. code += "\t{\n";
  750. code += "\t\tfloat base=" + p_input_vars[0] + "." + axisn[i] + ";\n";
  751. code += "\t\tfloat blend=" + p_input_vars[1] + "." + axisn[i] + ";\n";
  752. code += "\t\tif (base < 0.5) {\n";
  753. code += "\t\t\t" + p_output_vars[0] + "." + axisn[i] + " = (base * (2.0*blend));\n";
  754. code += "\t\t} else {\n";
  755. code += "\t\t\t" + p_output_vars[0] + "." + axisn[i] + " = (1.0 - (1.0-base) * (1.0-2.0*(blend-0.5)));\n";
  756. code += "\t\t}\n";
  757. code += "\t}\n";
  758. }
  759. } break;
  760. }
  761. return code;
  762. }
  763. void VisualShaderNodeColorOp::set_operator(Operator p_op) {
  764. op = p_op;
  765. emit_changed();
  766. }
  767. VisualShaderNodeColorOp::Operator VisualShaderNodeColorOp::get_operator() const {
  768. return op;
  769. }
  770. Vector<StringName> VisualShaderNodeColorOp::get_editable_properties() const {
  771. Vector<StringName> props;
  772. props.push_back("operator");
  773. return props;
  774. }
  775. void VisualShaderNodeColorOp::_bind_methods() {
  776. ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeColorOp::set_operator);
  777. ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeColorOp::get_operator);
  778. ADD_PROPERTY(PropertyInfo(Variant::INT, "operator", PROPERTY_HINT_ENUM, "Screen,Difference,Darken,Lighten,Overlay,Dodge,Burn,SoftLight,HardLight"), "set_operator", "get_operator");
  779. BIND_ENUM_CONSTANT(OP_SCREEN);
  780. BIND_ENUM_CONSTANT(OP_DIFFERENCE);
  781. BIND_ENUM_CONSTANT(OP_DARKEN);
  782. BIND_ENUM_CONSTANT(OP_LIGHTEN);
  783. BIND_ENUM_CONSTANT(OP_OVERLAY);
  784. BIND_ENUM_CONSTANT(OP_DODGE);
  785. BIND_ENUM_CONSTANT(OP_BURN);
  786. BIND_ENUM_CONSTANT(OP_SOFT_LIGHT);
  787. BIND_ENUM_CONSTANT(OP_HARD_LIGHT);
  788. }
  789. VisualShaderNodeColorOp::VisualShaderNodeColorOp() {
  790. op = OP_SCREEN;
  791. set_input_port_default_value(0, Vector3());
  792. set_input_port_default_value(1, Vector3());
  793. }
  794. ////////////// Transform Mult
  795. String VisualShaderNodeTransformMult::get_caption() const {
  796. return "TransformMult";
  797. }
  798. int VisualShaderNodeTransformMult::get_input_port_count() const {
  799. return 2;
  800. }
  801. VisualShaderNodeTransformMult::PortType VisualShaderNodeTransformMult::get_input_port_type(int p_port) const {
  802. return PORT_TYPE_TRANSFORM;
  803. }
  804. String VisualShaderNodeTransformMult::get_input_port_name(int p_port) const {
  805. return p_port == 0 ? "a" : "b";
  806. }
  807. int VisualShaderNodeTransformMult::get_output_port_count() const {
  808. return 1;
  809. }
  810. VisualShaderNodeTransformMult::PortType VisualShaderNodeTransformMult::get_output_port_type(int p_port) const {
  811. return PORT_TYPE_TRANSFORM;
  812. }
  813. String VisualShaderNodeTransformMult::get_output_port_name(int p_port) const {
  814. return "mult"; //no output port means the editor will be used as port
  815. }
  816. String VisualShaderNodeTransformMult::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  817. if (op == OP_AxB) {
  818. return "\t" + p_output_vars[0] + " = " + p_input_vars[0] + " * " + p_input_vars[1] + ";\n";
  819. } else if (op == OP_BxA) {
  820. return "\t" + p_output_vars[0] + " = " + p_input_vars[1] + " * " + p_input_vars[0] + ";\n";
  821. } else if (op == OP_AxB_COMP) {
  822. return "\t" + p_output_vars[0] + " = matrixCompMult( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n";
  823. } else {
  824. return "\t" + p_output_vars[0] + " = matrixCompMult( " + p_input_vars[1] + " , " + p_input_vars[0] + " );\n";
  825. }
  826. }
  827. void VisualShaderNodeTransformMult::set_operator(Operator p_op) {
  828. op = p_op;
  829. emit_changed();
  830. }
  831. VisualShaderNodeTransformMult::Operator VisualShaderNodeTransformMult::get_operator() const {
  832. return op;
  833. }
  834. Vector<StringName> VisualShaderNodeTransformMult::get_editable_properties() const {
  835. Vector<StringName> props;
  836. props.push_back("operator");
  837. return props;
  838. }
  839. void VisualShaderNodeTransformMult::_bind_methods() {
  840. ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeTransformMult::set_operator);
  841. ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeTransformMult::get_operator);
  842. ADD_PROPERTY(PropertyInfo(Variant::INT, "operator", PROPERTY_HINT_ENUM, "A x B,B x A,A x B(per component),B x A(per component)"), "set_operator", "get_operator");
  843. BIND_ENUM_CONSTANT(OP_AxB);
  844. BIND_ENUM_CONSTANT(OP_BxA);
  845. BIND_ENUM_CONSTANT(OP_AxB_COMP);
  846. BIND_ENUM_CONSTANT(OP_BxA_COMP);
  847. }
  848. VisualShaderNodeTransformMult::VisualShaderNodeTransformMult() {
  849. op = OP_AxB;
  850. set_input_port_default_value(0, Transform());
  851. set_input_port_default_value(1, Transform());
  852. }
  853. ////////////// TransformVec Mult
  854. String VisualShaderNodeTransformVecMult::get_caption() const {
  855. return "TransformVectorMult";
  856. }
  857. int VisualShaderNodeTransformVecMult::get_input_port_count() const {
  858. return 2;
  859. }
  860. VisualShaderNodeTransformVecMult::PortType VisualShaderNodeTransformVecMult::get_input_port_type(int p_port) const {
  861. return p_port == 0 ? PORT_TYPE_TRANSFORM : PORT_TYPE_VECTOR;
  862. }
  863. String VisualShaderNodeTransformVecMult::get_input_port_name(int p_port) const {
  864. return p_port == 0 ? "a" : "b";
  865. }
  866. int VisualShaderNodeTransformVecMult::get_output_port_count() const {
  867. return 1;
  868. }
  869. VisualShaderNodeTransformVecMult::PortType VisualShaderNodeTransformVecMult::get_output_port_type(int p_port) const {
  870. return PORT_TYPE_VECTOR;
  871. }
  872. String VisualShaderNodeTransformVecMult::get_output_port_name(int p_port) const {
  873. return ""; //no output port means the editor will be used as port
  874. }
  875. String VisualShaderNodeTransformVecMult::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  876. if (op == OP_AxB) {
  877. return "\t" + p_output_vars[0] + " = ( " + p_input_vars[0] + " * vec4(" + p_input_vars[1] + ", 1.0) ).xyz;\n";
  878. } else if (op == OP_BxA) {
  879. return "\t" + p_output_vars[0] + " = ( vec4(" + p_input_vars[1] + ", 1.0) * " + p_input_vars[0] + " ).xyz;\n";
  880. } else if (op == OP_3x3_AxB) {
  881. return "\t" + p_output_vars[0] + " = ( " + p_input_vars[0] + " * vec4(" + p_input_vars[1] + ", 0.0) ).xyz;\n";
  882. } else {
  883. return "\t" + p_output_vars[0] + " = ( vec4(" + p_input_vars[1] + ", 0.0) * " + p_input_vars[0] + " ).xyz;\n";
  884. }
  885. }
  886. void VisualShaderNodeTransformVecMult::set_operator(Operator p_op) {
  887. op = p_op;
  888. emit_changed();
  889. }
  890. VisualShaderNodeTransformVecMult::Operator VisualShaderNodeTransformVecMult::get_operator() const {
  891. return op;
  892. }
  893. Vector<StringName> VisualShaderNodeTransformVecMult::get_editable_properties() const {
  894. Vector<StringName> props;
  895. props.push_back("operator");
  896. return props;
  897. }
  898. void VisualShaderNodeTransformVecMult::_bind_methods() {
  899. ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeTransformVecMult::set_operator);
  900. ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeTransformVecMult::get_operator);
  901. ADD_PROPERTY(PropertyInfo(Variant::INT, "operator", PROPERTY_HINT_ENUM, "A x B,B x A,A x B (3x3),B x A (3x3)"), "set_operator", "get_operator");
  902. BIND_ENUM_CONSTANT(OP_AxB);
  903. BIND_ENUM_CONSTANT(OP_BxA);
  904. BIND_ENUM_CONSTANT(OP_3x3_AxB);
  905. BIND_ENUM_CONSTANT(OP_3x3_BxA);
  906. }
  907. VisualShaderNodeTransformVecMult::VisualShaderNodeTransformVecMult() {
  908. op = OP_AxB;
  909. set_input_port_default_value(0, Transform());
  910. set_input_port_default_value(1, Vector3());
  911. }
  912. ////////////// Scalar Func
  913. String VisualShaderNodeScalarFunc::get_caption() const {
  914. return "ScalarFunc";
  915. }
  916. int VisualShaderNodeScalarFunc::get_input_port_count() const {
  917. return 1;
  918. }
  919. VisualShaderNodeScalarFunc::PortType VisualShaderNodeScalarFunc::get_input_port_type(int p_port) const {
  920. return PORT_TYPE_SCALAR;
  921. }
  922. String VisualShaderNodeScalarFunc::get_input_port_name(int p_port) const {
  923. return "";
  924. }
  925. int VisualShaderNodeScalarFunc::get_output_port_count() const {
  926. return 1;
  927. }
  928. VisualShaderNodeScalarFunc::PortType VisualShaderNodeScalarFunc::get_output_port_type(int p_port) const {
  929. return PORT_TYPE_SCALAR;
  930. }
  931. String VisualShaderNodeScalarFunc::get_output_port_name(int p_port) const {
  932. return ""; //no output port means the editor will be used as port
  933. }
  934. String VisualShaderNodeScalarFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  935. static const char *scalar_func_id[FUNC_TRUNC + 1] = {
  936. "sin($)",
  937. "cos($)",
  938. "tan($)",
  939. "asin($)",
  940. "acos($)",
  941. "atan($)",
  942. "sinh($)",
  943. "cosh($)",
  944. "tanh($)",
  945. "log($)",
  946. "exp($)",
  947. "sqrt($)",
  948. "abs($)",
  949. "sign($)",
  950. "floor($)",
  951. "round($)",
  952. "ceil($)",
  953. "fract($)",
  954. "min(max($,0.0),1.0)",
  955. "-($)",
  956. "acosh($)",
  957. "asinh($)",
  958. "atanh($)",
  959. "degrees($)",
  960. "exp2($)",
  961. "inversesqrt($)",
  962. "log2($)",
  963. "radians($)",
  964. "1.0/($)",
  965. "roundEven($)",
  966. "trunc($)"
  967. };
  968. return "\t" + p_output_vars[0] + " = " + String(scalar_func_id[func]).replace("$", p_input_vars[0]) + ";\n";
  969. }
  970. void VisualShaderNodeScalarFunc::set_function(Function p_func) {
  971. func = p_func;
  972. emit_changed();
  973. }
  974. VisualShaderNodeScalarFunc::Function VisualShaderNodeScalarFunc::get_function() const {
  975. return func;
  976. }
  977. Vector<StringName> VisualShaderNodeScalarFunc::get_editable_properties() const {
  978. Vector<StringName> props;
  979. props.push_back("function");
  980. return props;
  981. }
  982. void VisualShaderNodeScalarFunc::_bind_methods() {
  983. ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeScalarFunc::set_function);
  984. ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeScalarFunc::get_function);
  985. ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Sin,Cos,Tan,ASin,ACos,ATan,SinH,CosH,TanH,Log,Exp,Sqrt,Abs,Sign,Floor,Round,Ceil,Frac,Saturate,Negate,ACosH,ASinH,ATanH,Degrees,Exp2,InverseSqrt,Log2,Radians,Reciprocal,RoundEven,Trunc"), "set_function", "get_function");
  986. BIND_ENUM_CONSTANT(FUNC_SIN);
  987. BIND_ENUM_CONSTANT(FUNC_COS);
  988. BIND_ENUM_CONSTANT(FUNC_TAN);
  989. BIND_ENUM_CONSTANT(FUNC_ASIN);
  990. BIND_ENUM_CONSTANT(FUNC_ACOS);
  991. BIND_ENUM_CONSTANT(FUNC_ATAN);
  992. BIND_ENUM_CONSTANT(FUNC_SINH);
  993. BIND_ENUM_CONSTANT(FUNC_COSH);
  994. BIND_ENUM_CONSTANT(FUNC_TANH);
  995. BIND_ENUM_CONSTANT(FUNC_LOG);
  996. BIND_ENUM_CONSTANT(FUNC_EXP);
  997. BIND_ENUM_CONSTANT(FUNC_SQRT);
  998. BIND_ENUM_CONSTANT(FUNC_ABS);
  999. BIND_ENUM_CONSTANT(FUNC_SIGN);
  1000. BIND_ENUM_CONSTANT(FUNC_FLOOR);
  1001. BIND_ENUM_CONSTANT(FUNC_ROUND);
  1002. BIND_ENUM_CONSTANT(FUNC_CEIL);
  1003. BIND_ENUM_CONSTANT(FUNC_FRAC);
  1004. BIND_ENUM_CONSTANT(FUNC_SATURATE);
  1005. BIND_ENUM_CONSTANT(FUNC_NEGATE);
  1006. BIND_ENUM_CONSTANT(FUNC_ACOSH);
  1007. BIND_ENUM_CONSTANT(FUNC_ASINH);
  1008. BIND_ENUM_CONSTANT(FUNC_ATANH);
  1009. BIND_ENUM_CONSTANT(FUNC_DEGREES);
  1010. BIND_ENUM_CONSTANT(FUNC_EXP2);
  1011. BIND_ENUM_CONSTANT(FUNC_INVERSE_SQRT);
  1012. BIND_ENUM_CONSTANT(FUNC_LOG2);
  1013. BIND_ENUM_CONSTANT(FUNC_RADIANS);
  1014. BIND_ENUM_CONSTANT(FUNC_RECIPROCAL);
  1015. BIND_ENUM_CONSTANT(FUNC_ROUNDEVEN);
  1016. BIND_ENUM_CONSTANT(FUNC_TRUNC);
  1017. }
  1018. VisualShaderNodeScalarFunc::VisualShaderNodeScalarFunc() {
  1019. func = FUNC_SIGN;
  1020. set_input_port_default_value(0, 0.0);
  1021. }
  1022. ////////////// Vector Func
  1023. String VisualShaderNodeVectorFunc::get_caption() const {
  1024. return "VectorFunc";
  1025. }
  1026. int VisualShaderNodeVectorFunc::get_input_port_count() const {
  1027. return 1;
  1028. }
  1029. VisualShaderNodeVectorFunc::PortType VisualShaderNodeVectorFunc::get_input_port_type(int p_port) const {
  1030. return PORT_TYPE_VECTOR;
  1031. }
  1032. String VisualShaderNodeVectorFunc::get_input_port_name(int p_port) const {
  1033. return "";
  1034. }
  1035. int VisualShaderNodeVectorFunc::get_output_port_count() const {
  1036. return 1;
  1037. }
  1038. VisualShaderNodeVectorFunc::PortType VisualShaderNodeVectorFunc::get_output_port_type(int p_port) const {
  1039. return PORT_TYPE_VECTOR;
  1040. }
  1041. String VisualShaderNodeVectorFunc::get_output_port_name(int p_port) const {
  1042. return ""; //no output port means the editor will be used as port
  1043. }
  1044. String VisualShaderNodeVectorFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1045. static const char *vec_func_id[FUNC_TRUNC + 1] = {
  1046. "normalize($)",
  1047. "max(min($,vec3(1.0)),vec3(0.0))",
  1048. "-($)",
  1049. "1.0/($)",
  1050. "",
  1051. "",
  1052. "abs($)",
  1053. "acos($)",
  1054. "acosh($)",
  1055. "asin($)",
  1056. "asinh($)",
  1057. "atan($)",
  1058. "atanh($)",
  1059. "ceil($)",
  1060. "cos($)",
  1061. "cosh($)",
  1062. "degrees($)",
  1063. "exp($)",
  1064. "exp2($)",
  1065. "floor($)",
  1066. "fract($)",
  1067. "inversesqrt($)",
  1068. "log($)",
  1069. "log2($)",
  1070. "radians($)",
  1071. "round($)",
  1072. "roundEven($)",
  1073. "sign($)",
  1074. "sin($)",
  1075. "sinh($)",
  1076. "sqrt($)",
  1077. "tan($)",
  1078. "tanh($)",
  1079. "trunc($)"
  1080. };
  1081. String code;
  1082. if (func == FUNC_RGB2HSV) {
  1083. code += "\t{\n";
  1084. code += "\t\tvec3 c = " + p_input_vars[0] + ";\n";
  1085. code += "\t\tvec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n";
  1086. code += "\t\tvec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n";
  1087. code += "\t\tvec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n";
  1088. code += "\t\tfloat d = q.x - min(q.w, q.y);\n";
  1089. code += "\t\tfloat e = 1.0e-10;\n";
  1090. code += "\t\t" + p_output_vars[0] + "=vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n";
  1091. code += "\t}\n";
  1092. } else if (func == FUNC_HSV2RGB) {
  1093. code += "\t{\n";
  1094. code += "\t\tvec3 c = " + p_input_vars[0] + ";\n";
  1095. code += "\t\tvec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n";
  1096. code += "\t\tvec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n";
  1097. code += "\t\t" + p_output_vars[0] + "=c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n";
  1098. code += "\t}\n";
  1099. } else {
  1100. code += "\t" + p_output_vars[0] + "=" + String(vec_func_id[func]).replace("$", p_input_vars[0]) + ";\n";
  1101. }
  1102. return code;
  1103. }
  1104. void VisualShaderNodeVectorFunc::set_function(Function p_func) {
  1105. func = p_func;
  1106. emit_changed();
  1107. }
  1108. VisualShaderNodeVectorFunc::Function VisualShaderNodeVectorFunc::get_function() const {
  1109. return func;
  1110. }
  1111. Vector<StringName> VisualShaderNodeVectorFunc::get_editable_properties() const {
  1112. Vector<StringName> props;
  1113. props.push_back("function");
  1114. return props;
  1115. }
  1116. void VisualShaderNodeVectorFunc::_bind_methods() {
  1117. ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeVectorFunc::set_function);
  1118. ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeVectorFunc::get_function);
  1119. ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Normalize,Saturate,Negate,Reciprocal,RGB2HSV,HSV2RGB,Abs,ACos,ACosH,ASin,ASinH,ATan,ATanH,Ceil,Cos,CosH,Degrees,Exp,Exp2,Floor,Frac,InverseSqrt,Log,Log2,Radians,Round,RoundEven,Sign,Sin,SinH,Sqrt,Tan,TanH,Trunc"), "set_function", "get_function");
  1120. BIND_ENUM_CONSTANT(FUNC_NORMALIZE);
  1121. BIND_ENUM_CONSTANT(FUNC_SATURATE);
  1122. BIND_ENUM_CONSTANT(FUNC_NEGATE);
  1123. BIND_ENUM_CONSTANT(FUNC_RECIPROCAL);
  1124. BIND_ENUM_CONSTANT(FUNC_RGB2HSV);
  1125. BIND_ENUM_CONSTANT(FUNC_HSV2RGB);
  1126. BIND_ENUM_CONSTANT(FUNC_ABS);
  1127. BIND_ENUM_CONSTANT(FUNC_ACOS);
  1128. BIND_ENUM_CONSTANT(FUNC_ACOSH);
  1129. BIND_ENUM_CONSTANT(FUNC_ASIN);
  1130. BIND_ENUM_CONSTANT(FUNC_ASINH);
  1131. BIND_ENUM_CONSTANT(FUNC_ATAN);
  1132. BIND_ENUM_CONSTANT(FUNC_ATANH);
  1133. BIND_ENUM_CONSTANT(FUNC_CEIL);
  1134. BIND_ENUM_CONSTANT(FUNC_COS);
  1135. BIND_ENUM_CONSTANT(FUNC_COSH);
  1136. BIND_ENUM_CONSTANT(FUNC_DEGREES);
  1137. BIND_ENUM_CONSTANT(FUNC_EXP);
  1138. BIND_ENUM_CONSTANT(FUNC_EXP2);
  1139. BIND_ENUM_CONSTANT(FUNC_FLOOR);
  1140. BIND_ENUM_CONSTANT(FUNC_FRAC);
  1141. BIND_ENUM_CONSTANT(FUNC_INVERSE_SQRT);
  1142. BIND_ENUM_CONSTANT(FUNC_LOG);
  1143. BIND_ENUM_CONSTANT(FUNC_LOG2);
  1144. BIND_ENUM_CONSTANT(FUNC_RADIANS);
  1145. BIND_ENUM_CONSTANT(FUNC_ROUND);
  1146. BIND_ENUM_CONSTANT(FUNC_ROUNDEVEN);
  1147. BIND_ENUM_CONSTANT(FUNC_SIGN);
  1148. BIND_ENUM_CONSTANT(FUNC_SIN);
  1149. BIND_ENUM_CONSTANT(FUNC_SINH);
  1150. BIND_ENUM_CONSTANT(FUNC_SQRT);
  1151. BIND_ENUM_CONSTANT(FUNC_TAN);
  1152. BIND_ENUM_CONSTANT(FUNC_TANH);
  1153. BIND_ENUM_CONSTANT(FUNC_TRUNC);
  1154. }
  1155. VisualShaderNodeVectorFunc::VisualShaderNodeVectorFunc() {
  1156. func = FUNC_NORMALIZE;
  1157. set_input_port_default_value(0, Vector3());
  1158. }
  1159. ////////////// ColorFunc
  1160. String VisualShaderNodeColorFunc::get_caption() const {
  1161. return "ColorFunc";
  1162. }
  1163. int VisualShaderNodeColorFunc::get_input_port_count() const {
  1164. return 1;
  1165. }
  1166. VisualShaderNodeColorFunc::PortType VisualShaderNodeColorFunc::get_input_port_type(int p_port) const {
  1167. return PORT_TYPE_VECTOR;
  1168. }
  1169. String VisualShaderNodeColorFunc::get_input_port_name(int p_port) const {
  1170. return "";
  1171. }
  1172. int VisualShaderNodeColorFunc::get_output_port_count() const {
  1173. return 1;
  1174. }
  1175. VisualShaderNodeColorFunc::PortType VisualShaderNodeColorFunc::get_output_port_type(int p_port) const {
  1176. return PORT_TYPE_VECTOR;
  1177. }
  1178. String VisualShaderNodeColorFunc::get_output_port_name(int p_port) const {
  1179. return "";
  1180. }
  1181. String VisualShaderNodeColorFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1182. String code;
  1183. switch (func) {
  1184. case FUNC_GRAYSCALE:
  1185. code += "\t{\n";
  1186. code += "\t\tvec3 c = " + p_input_vars[0] + ";\n";
  1187. code += "\t\tfloat max1 = max(c.r, c.g);\n";
  1188. code += "\t\tfloat max2 = max(max1, c.b);\n";
  1189. code += "\t\tfloat max3 = max(max1, max2);\n";
  1190. code += "\t\t" + p_output_vars[0] + " = vec3(max3, max3, max3);\n";
  1191. code += "\t}\n";
  1192. break;
  1193. case FUNC_SEPIA:
  1194. code += "\t{\n";
  1195. code += "\t\tvec3 c = " + p_input_vars[0] + ";\n";
  1196. code += "\t\tfloat r = (c.r * .393) + (c.g *.769) + (c.b * .189);\n";
  1197. code += "\t\tfloat g = (c.r * .349) + (c.g *.686) + (c.b * .168);\n";
  1198. code += "\t\tfloat b = (c.r * .272) + (c.g *.534) + (c.b * .131);\n";
  1199. code += "\t\t" + p_output_vars[0] + " = vec3(r, g, b);\n";
  1200. code += "\t}\n";
  1201. break;
  1202. }
  1203. return code;
  1204. }
  1205. void VisualShaderNodeColorFunc::set_function(Function p_func) {
  1206. func = p_func;
  1207. emit_changed();
  1208. }
  1209. VisualShaderNodeColorFunc::Function VisualShaderNodeColorFunc::get_function() const {
  1210. return func;
  1211. }
  1212. Vector<StringName> VisualShaderNodeColorFunc::get_editable_properties() const {
  1213. Vector<StringName> props;
  1214. props.push_back("function");
  1215. return props;
  1216. }
  1217. void VisualShaderNodeColorFunc::_bind_methods() {
  1218. ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeColorFunc::set_function);
  1219. ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeColorFunc::get_function);
  1220. ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Grayscale,Sepia"), "set_function", "get_function");
  1221. BIND_ENUM_CONSTANT(FUNC_GRAYSCALE);
  1222. BIND_ENUM_CONSTANT(FUNC_SEPIA);
  1223. }
  1224. VisualShaderNodeColorFunc::VisualShaderNodeColorFunc() {
  1225. func = FUNC_GRAYSCALE;
  1226. set_input_port_default_value(0, Vector3());
  1227. }
  1228. ////////////// Transform Func
  1229. String VisualShaderNodeTransformFunc::get_caption() const {
  1230. return "TransformFunc";
  1231. }
  1232. int VisualShaderNodeTransformFunc::get_input_port_count() const {
  1233. return 1;
  1234. }
  1235. VisualShaderNodeTransformFunc::PortType VisualShaderNodeTransformFunc::get_input_port_type(int p_port) const {
  1236. return PORT_TYPE_TRANSFORM;
  1237. }
  1238. String VisualShaderNodeTransformFunc::get_input_port_name(int p_port) const {
  1239. return "";
  1240. }
  1241. int VisualShaderNodeTransformFunc::get_output_port_count() const {
  1242. return 1;
  1243. }
  1244. VisualShaderNodeTransformFunc::PortType VisualShaderNodeTransformFunc::get_output_port_type(int p_port) const {
  1245. return PORT_TYPE_TRANSFORM;
  1246. }
  1247. String VisualShaderNodeTransformFunc::get_output_port_name(int p_port) const {
  1248. return "";
  1249. }
  1250. String VisualShaderNodeTransformFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1251. static const char *funcs[FUNC_TRANSPOSE + 1] = {
  1252. "inverse($)",
  1253. "transpose($)"
  1254. };
  1255. String code;
  1256. code += "\t" + p_output_vars[0] + "=" + String(funcs[func]).replace("$", p_input_vars[0]) + ";\n";
  1257. return code;
  1258. }
  1259. void VisualShaderNodeTransformFunc::set_function(Function p_func) {
  1260. func = p_func;
  1261. emit_changed();
  1262. }
  1263. VisualShaderNodeTransformFunc::Function VisualShaderNodeTransformFunc::get_function() const {
  1264. return func;
  1265. }
  1266. Vector<StringName> VisualShaderNodeTransformFunc::get_editable_properties() const {
  1267. Vector<StringName> props;
  1268. props.push_back("function");
  1269. return props;
  1270. }
  1271. void VisualShaderNodeTransformFunc::_bind_methods() {
  1272. ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeTransformFunc::set_function);
  1273. ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeTransformFunc::get_function);
  1274. ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Inverse,Transpose"), "set_function", "get_function");
  1275. BIND_ENUM_CONSTANT(FUNC_INVERSE);
  1276. BIND_ENUM_CONSTANT(FUNC_TRANSPOSE);
  1277. }
  1278. VisualShaderNodeTransformFunc::VisualShaderNodeTransformFunc() {
  1279. func = FUNC_INVERSE;
  1280. set_input_port_default_value(0, Transform());
  1281. }
  1282. ////////////// Dot Product
  1283. String VisualShaderNodeDotProduct::get_caption() const {
  1284. return "DotProduct";
  1285. }
  1286. int VisualShaderNodeDotProduct::get_input_port_count() const {
  1287. return 2;
  1288. }
  1289. VisualShaderNodeDotProduct::PortType VisualShaderNodeDotProduct::get_input_port_type(int p_port) const {
  1290. return PORT_TYPE_VECTOR;
  1291. }
  1292. String VisualShaderNodeDotProduct::get_input_port_name(int p_port) const {
  1293. return p_port == 0 ? "a" : "b";
  1294. }
  1295. int VisualShaderNodeDotProduct::get_output_port_count() const {
  1296. return 1;
  1297. }
  1298. VisualShaderNodeDotProduct::PortType VisualShaderNodeDotProduct::get_output_port_type(int p_port) const {
  1299. return PORT_TYPE_SCALAR;
  1300. }
  1301. String VisualShaderNodeDotProduct::get_output_port_name(int p_port) const {
  1302. return "dot";
  1303. }
  1304. String VisualShaderNodeDotProduct::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1305. return "\t" + p_output_vars[0] + " = dot( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n";
  1306. }
  1307. VisualShaderNodeDotProduct::VisualShaderNodeDotProduct() {
  1308. set_input_port_default_value(0, Vector3());
  1309. set_input_port_default_value(1, Vector3());
  1310. }
  1311. ////////////// Vector Len
  1312. String VisualShaderNodeVectorLen::get_caption() const {
  1313. return "VectorLen";
  1314. }
  1315. int VisualShaderNodeVectorLen::get_input_port_count() const {
  1316. return 1;
  1317. }
  1318. VisualShaderNodeVectorLen::PortType VisualShaderNodeVectorLen::get_input_port_type(int p_port) const {
  1319. return PORT_TYPE_VECTOR;
  1320. }
  1321. String VisualShaderNodeVectorLen::get_input_port_name(int p_port) const {
  1322. return "";
  1323. }
  1324. int VisualShaderNodeVectorLen::get_output_port_count() const {
  1325. return 1;
  1326. }
  1327. VisualShaderNodeVectorLen::PortType VisualShaderNodeVectorLen::get_output_port_type(int p_port) const {
  1328. return PORT_TYPE_SCALAR;
  1329. }
  1330. String VisualShaderNodeVectorLen::get_output_port_name(int p_port) const {
  1331. return "length";
  1332. }
  1333. String VisualShaderNodeVectorLen::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1334. return "\t" + p_output_vars[0] + " = length( " + p_input_vars[0] + " );\n";
  1335. }
  1336. VisualShaderNodeVectorLen::VisualShaderNodeVectorLen() {
  1337. set_input_port_default_value(0, Vector3());
  1338. }
  1339. ////////////// Determinant
  1340. String VisualShaderNodeDeterminant::get_caption() const {
  1341. return "Determinant";
  1342. }
  1343. int VisualShaderNodeDeterminant::get_input_port_count() const {
  1344. return 1;
  1345. }
  1346. VisualShaderNodeScalarClamp::PortType VisualShaderNodeDeterminant::get_input_port_type(int p_port) const {
  1347. return PORT_TYPE_TRANSFORM;
  1348. }
  1349. String VisualShaderNodeDeterminant::get_input_port_name(int p_port) const {
  1350. return "";
  1351. }
  1352. int VisualShaderNodeDeterminant::get_output_port_count() const {
  1353. return 1;
  1354. }
  1355. VisualShaderNodeDeterminant::PortType VisualShaderNodeDeterminant::get_output_port_type(int p_port) const {
  1356. return PORT_TYPE_SCALAR;
  1357. }
  1358. String VisualShaderNodeDeterminant::get_output_port_name(int p_port) const {
  1359. return "";
  1360. }
  1361. String VisualShaderNodeDeterminant::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1362. return "\t" + p_output_vars[0] + " = determinant( " + p_input_vars[0] + " );\n";
  1363. }
  1364. VisualShaderNodeDeterminant::VisualShaderNodeDeterminant() {
  1365. set_input_port_default_value(0, Transform());
  1366. }
  1367. ////////////// Scalar Derivative Function
  1368. String VisualShaderNodeScalarDerivativeFunc::get_caption() const {
  1369. return "ScalarDerivativeFunc";
  1370. }
  1371. int VisualShaderNodeScalarDerivativeFunc::get_input_port_count() const {
  1372. return 1;
  1373. }
  1374. VisualShaderNodeScalarDerivativeFunc::PortType VisualShaderNodeScalarDerivativeFunc::get_input_port_type(int p_port) const {
  1375. return PORT_TYPE_SCALAR;
  1376. }
  1377. String VisualShaderNodeScalarDerivativeFunc::get_input_port_name(int p_port) const {
  1378. return "";
  1379. }
  1380. int VisualShaderNodeScalarDerivativeFunc::get_output_port_count() const {
  1381. return 1;
  1382. }
  1383. VisualShaderNodeScalarDerivativeFunc::PortType VisualShaderNodeScalarDerivativeFunc::get_output_port_type(int p_port) const {
  1384. return PORT_TYPE_SCALAR;
  1385. }
  1386. String VisualShaderNodeScalarDerivativeFunc::get_output_port_name(int p_port) const {
  1387. return "";
  1388. }
  1389. String VisualShaderNodeScalarDerivativeFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1390. static const char *funcs[FUNC_Y + 1] = {
  1391. "fwidth($)",
  1392. "dFdx($)",
  1393. "dFdy($)"
  1394. };
  1395. String code;
  1396. code += "\t" + p_output_vars[0] + "=" + String(funcs[func]).replace("$", p_input_vars[0]) + ";\n";
  1397. return code;
  1398. }
  1399. void VisualShaderNodeScalarDerivativeFunc::set_function(Function p_func) {
  1400. func = p_func;
  1401. emit_changed();
  1402. }
  1403. VisualShaderNodeScalarDerivativeFunc::Function VisualShaderNodeScalarDerivativeFunc::get_function() const {
  1404. return func;
  1405. }
  1406. Vector<StringName> VisualShaderNodeScalarDerivativeFunc::get_editable_properties() const {
  1407. Vector<StringName> props;
  1408. props.push_back("function");
  1409. return props;
  1410. }
  1411. void VisualShaderNodeScalarDerivativeFunc::_bind_methods() {
  1412. ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeScalarDerivativeFunc::set_function);
  1413. ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeScalarDerivativeFunc::get_function);
  1414. ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Sum,X,Y"), "set_function", "get_function");
  1415. BIND_ENUM_CONSTANT(FUNC_SUM);
  1416. BIND_ENUM_CONSTANT(FUNC_X);
  1417. BIND_ENUM_CONSTANT(FUNC_Y);
  1418. }
  1419. VisualShaderNodeScalarDerivativeFunc::VisualShaderNodeScalarDerivativeFunc() {
  1420. func = FUNC_SUM;
  1421. set_input_port_default_value(0, 0.0);
  1422. }
  1423. ////////////// Vector Derivative Function
  1424. String VisualShaderNodeVectorDerivativeFunc::get_caption() const {
  1425. return "VectorDerivativeFunc";
  1426. }
  1427. int VisualShaderNodeVectorDerivativeFunc::get_input_port_count() const {
  1428. return 1;
  1429. }
  1430. VisualShaderNodeVectorDerivativeFunc::PortType VisualShaderNodeVectorDerivativeFunc::get_input_port_type(int p_port) const {
  1431. return PORT_TYPE_VECTOR;
  1432. }
  1433. String VisualShaderNodeVectorDerivativeFunc::get_input_port_name(int p_port) const {
  1434. return "";
  1435. }
  1436. int VisualShaderNodeVectorDerivativeFunc::get_output_port_count() const {
  1437. return 1;
  1438. }
  1439. VisualShaderNodeScalarDerivativeFunc::PortType VisualShaderNodeVectorDerivativeFunc::get_output_port_type(int p_port) const {
  1440. return PORT_TYPE_VECTOR;
  1441. }
  1442. String VisualShaderNodeVectorDerivativeFunc::get_output_port_name(int p_port) const {
  1443. return "";
  1444. }
  1445. String VisualShaderNodeVectorDerivativeFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1446. static const char *funcs[FUNC_Y + 1] = {
  1447. "fwidth($)",
  1448. "dFdx($)",
  1449. "dFdy($)"
  1450. };
  1451. String code;
  1452. code += "\t" + p_output_vars[0] + "=" + String(funcs[func]).replace("$", p_input_vars[0]) + ";\n";
  1453. return code;
  1454. }
  1455. void VisualShaderNodeVectorDerivativeFunc::set_function(Function p_func) {
  1456. func = p_func;
  1457. emit_changed();
  1458. }
  1459. VisualShaderNodeVectorDerivativeFunc::Function VisualShaderNodeVectorDerivativeFunc::get_function() const {
  1460. return func;
  1461. }
  1462. Vector<StringName> VisualShaderNodeVectorDerivativeFunc::get_editable_properties() const {
  1463. Vector<StringName> props;
  1464. props.push_back("function");
  1465. return props;
  1466. }
  1467. void VisualShaderNodeVectorDerivativeFunc::_bind_methods() {
  1468. ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeVectorDerivativeFunc::set_function);
  1469. ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeVectorDerivativeFunc::get_function);
  1470. ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Sum,X,Y"), "set_function", "get_function");
  1471. BIND_ENUM_CONSTANT(FUNC_SUM);
  1472. BIND_ENUM_CONSTANT(FUNC_X);
  1473. BIND_ENUM_CONSTANT(FUNC_Y);
  1474. }
  1475. VisualShaderNodeVectorDerivativeFunc::VisualShaderNodeVectorDerivativeFunc() {
  1476. func = FUNC_SUM;
  1477. set_input_port_default_value(0, Vector3());
  1478. }
  1479. ////////////// Scalar Clamp
  1480. String VisualShaderNodeScalarClamp::get_caption() const {
  1481. return "ScalarClamp";
  1482. }
  1483. int VisualShaderNodeScalarClamp::get_input_port_count() const {
  1484. return 3;
  1485. }
  1486. VisualShaderNodeScalarClamp::PortType VisualShaderNodeScalarClamp::get_input_port_type(int p_port) const {
  1487. return PORT_TYPE_SCALAR;
  1488. }
  1489. String VisualShaderNodeScalarClamp::get_input_port_name(int p_port) const {
  1490. if (p_port == 0)
  1491. return "";
  1492. else if (p_port == 1)
  1493. return "min";
  1494. else if (p_port == 2)
  1495. return "max";
  1496. return "";
  1497. }
  1498. int VisualShaderNodeScalarClamp::get_output_port_count() const {
  1499. return 1;
  1500. }
  1501. VisualShaderNodeScalarClamp::PortType VisualShaderNodeScalarClamp::get_output_port_type(int p_port) const {
  1502. return PORT_TYPE_SCALAR;
  1503. }
  1504. String VisualShaderNodeScalarClamp::get_output_port_name(int p_port) const {
  1505. return "";
  1506. }
  1507. String VisualShaderNodeScalarClamp::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1508. return "\t" + p_output_vars[0] + " = clamp( " + p_input_vars[0] + ", " + p_input_vars[1] + ", " + p_input_vars[2] + " );\n";
  1509. }
  1510. VisualShaderNodeScalarClamp::VisualShaderNodeScalarClamp() {
  1511. set_input_port_default_value(0, 0.0);
  1512. set_input_port_default_value(1, 0.0);
  1513. set_input_port_default_value(2, 1.0);
  1514. }
  1515. ////////////// Vector Clamp
  1516. String VisualShaderNodeVectorClamp::get_caption() const {
  1517. return "VectorClamp";
  1518. }
  1519. int VisualShaderNodeVectorClamp::get_input_port_count() const {
  1520. return 3;
  1521. }
  1522. VisualShaderNodeVectorClamp::PortType VisualShaderNodeVectorClamp::get_input_port_type(int p_port) const {
  1523. return PORT_TYPE_VECTOR;
  1524. }
  1525. String VisualShaderNodeVectorClamp::get_input_port_name(int p_port) const {
  1526. if (p_port == 0)
  1527. return "";
  1528. else if (p_port == 1)
  1529. return "min";
  1530. else if (p_port == 2)
  1531. return "max";
  1532. return "";
  1533. }
  1534. int VisualShaderNodeVectorClamp::get_output_port_count() const {
  1535. return 1;
  1536. }
  1537. VisualShaderNodeVectorClamp::PortType VisualShaderNodeVectorClamp::get_output_port_type(int p_port) const {
  1538. return PORT_TYPE_VECTOR;
  1539. }
  1540. String VisualShaderNodeVectorClamp::get_output_port_name(int p_port) const {
  1541. return "";
  1542. }
  1543. String VisualShaderNodeVectorClamp::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1544. return "\t" + p_output_vars[0] + " = clamp( " + p_input_vars[0] + ", " + p_input_vars[1] + ", " + p_input_vars[2] + " );\n";
  1545. }
  1546. VisualShaderNodeVectorClamp::VisualShaderNodeVectorClamp() {
  1547. set_input_port_default_value(0, Vector3(0, 0, 0));
  1548. set_input_port_default_value(1, Vector3(0, 0, 0));
  1549. set_input_port_default_value(2, Vector3(1, 1, 1));
  1550. }
  1551. ////////////// FaceForward
  1552. String VisualShaderNodeFaceForward::get_caption() const {
  1553. return "FaceForward";
  1554. }
  1555. int VisualShaderNodeFaceForward::get_input_port_count() const {
  1556. return 3;
  1557. }
  1558. VisualShaderNodeFaceForward::PortType VisualShaderNodeFaceForward::get_input_port_type(int p_port) const {
  1559. return PORT_TYPE_VECTOR;
  1560. }
  1561. String VisualShaderNodeFaceForward::get_input_port_name(int p_port) const {
  1562. switch (p_port) {
  1563. case 0:
  1564. return "N";
  1565. case 1:
  1566. return "I";
  1567. case 2:
  1568. return "Nref";
  1569. default:
  1570. return "";
  1571. }
  1572. }
  1573. int VisualShaderNodeFaceForward::get_output_port_count() const {
  1574. return 1;
  1575. }
  1576. VisualShaderNodeFaceForward::PortType VisualShaderNodeFaceForward::get_output_port_type(int p_port) const {
  1577. return PORT_TYPE_VECTOR;
  1578. }
  1579. String VisualShaderNodeFaceForward::get_output_port_name(int p_port) const {
  1580. return "";
  1581. }
  1582. String VisualShaderNodeFaceForward::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1583. return "\t" + p_output_vars[0] + " = faceforward( " + p_input_vars[0] + ", " + p_input_vars[1] + ", " + p_input_vars[2] + " );\n";
  1584. }
  1585. VisualShaderNodeFaceForward::VisualShaderNodeFaceForward() {
  1586. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0));
  1587. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
  1588. set_input_port_default_value(2, Vector3(0.0, 0.0, 0.0));
  1589. }
  1590. ////////////// Outer Product
  1591. String VisualShaderNodeOuterProduct::get_caption() const {
  1592. return "OuterProduct";
  1593. }
  1594. int VisualShaderNodeOuterProduct::get_input_port_count() const {
  1595. return 2;
  1596. }
  1597. VisualShaderNodeFaceForward::PortType VisualShaderNodeOuterProduct::get_input_port_type(int p_port) const {
  1598. return PORT_TYPE_VECTOR;
  1599. }
  1600. String VisualShaderNodeOuterProduct::get_input_port_name(int p_port) const {
  1601. switch (p_port) {
  1602. case 0:
  1603. return "c";
  1604. case 1:
  1605. return "r";
  1606. default:
  1607. return "";
  1608. }
  1609. }
  1610. int VisualShaderNodeOuterProduct::get_output_port_count() const {
  1611. return 1;
  1612. }
  1613. VisualShaderNodeOuterProduct::PortType VisualShaderNodeOuterProduct::get_output_port_type(int p_port) const {
  1614. return PORT_TYPE_TRANSFORM;
  1615. }
  1616. String VisualShaderNodeOuterProduct::get_output_port_name(int p_port) const {
  1617. return "";
  1618. }
  1619. String VisualShaderNodeOuterProduct::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1620. return "\t" + p_output_vars[0] + " = outerProduct( " + p_input_vars[0] + ", " + p_input_vars[1] + " );\n";
  1621. }
  1622. VisualShaderNodeOuterProduct::VisualShaderNodeOuterProduct() {
  1623. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0));
  1624. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
  1625. }
  1626. ////////////// Vector-Scalar Step
  1627. String VisualShaderNodeVectorScalarStep::get_caption() const {
  1628. return "VectorScalarStep";
  1629. }
  1630. int VisualShaderNodeVectorScalarStep::get_input_port_count() const {
  1631. return 2;
  1632. }
  1633. VisualShaderNodeVectorScalarStep::PortType VisualShaderNodeVectorScalarStep::get_input_port_type(int p_port) const {
  1634. if (p_port == 0) {
  1635. return PORT_TYPE_SCALAR;
  1636. }
  1637. return PORT_TYPE_VECTOR;
  1638. }
  1639. String VisualShaderNodeVectorScalarStep::get_input_port_name(int p_port) const {
  1640. if (p_port == 0)
  1641. return "edge";
  1642. else if (p_port == 1)
  1643. return "x";
  1644. return "";
  1645. }
  1646. int VisualShaderNodeVectorScalarStep::get_output_port_count() const {
  1647. return 1;
  1648. }
  1649. VisualShaderNodeVectorClamp::PortType VisualShaderNodeVectorScalarStep::get_output_port_type(int p_port) const {
  1650. return PORT_TYPE_VECTOR;
  1651. }
  1652. String VisualShaderNodeVectorScalarStep::get_output_port_name(int p_port) const {
  1653. return "";
  1654. }
  1655. String VisualShaderNodeVectorScalarStep::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1656. return "\t" + p_output_vars[0] + " = step( " + p_input_vars[0] + ", " + p_input_vars[1] + " );\n";
  1657. }
  1658. VisualShaderNodeVectorScalarStep::VisualShaderNodeVectorScalarStep() {
  1659. set_input_port_default_value(0, 0.0);
  1660. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
  1661. }
  1662. ////////////// Scalar SmoothStep
  1663. String VisualShaderNodeScalarSmoothStep::get_caption() const {
  1664. return "ScalarSmoothStep";
  1665. }
  1666. int VisualShaderNodeScalarSmoothStep::get_input_port_count() const {
  1667. return 3;
  1668. }
  1669. VisualShaderNodeScalarSmoothStep::PortType VisualShaderNodeScalarSmoothStep::get_input_port_type(int p_port) const {
  1670. return PORT_TYPE_SCALAR;
  1671. }
  1672. String VisualShaderNodeScalarSmoothStep::get_input_port_name(int p_port) const {
  1673. if (p_port == 0)
  1674. return "edge0";
  1675. else if (p_port == 1)
  1676. return "edge1";
  1677. else if (p_port == 2)
  1678. return "x";
  1679. return "";
  1680. }
  1681. int VisualShaderNodeScalarSmoothStep::get_output_port_count() const {
  1682. return 1;
  1683. }
  1684. VisualShaderNodeScalarSmoothStep::PortType VisualShaderNodeScalarSmoothStep::get_output_port_type(int p_port) const {
  1685. return PORT_TYPE_SCALAR;
  1686. }
  1687. String VisualShaderNodeScalarSmoothStep::get_output_port_name(int p_port) const {
  1688. return "";
  1689. }
  1690. String VisualShaderNodeScalarSmoothStep::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1691. return "\t" + p_output_vars[0] + " = smoothstep( " + p_input_vars[0] + ", " + p_input_vars[1] + ", " + p_input_vars[2] + " );\n";
  1692. }
  1693. VisualShaderNodeScalarSmoothStep::VisualShaderNodeScalarSmoothStep() {
  1694. set_input_port_default_value(0, 0.0);
  1695. set_input_port_default_value(1, 0.0);
  1696. set_input_port_default_value(2, 0.0);
  1697. }
  1698. ////////////// Vector SmoothStep
  1699. String VisualShaderNodeVectorSmoothStep::get_caption() const {
  1700. return "VectorSmoothStep";
  1701. }
  1702. int VisualShaderNodeVectorSmoothStep::get_input_port_count() const {
  1703. return 3;
  1704. }
  1705. VisualShaderNodeVectorSmoothStep::PortType VisualShaderNodeVectorSmoothStep::get_input_port_type(int p_port) const {
  1706. return PORT_TYPE_VECTOR;
  1707. }
  1708. String VisualShaderNodeVectorSmoothStep::get_input_port_name(int p_port) const {
  1709. if (p_port == 0)
  1710. return "edge0";
  1711. else if (p_port == 1)
  1712. return "edge1";
  1713. else if (p_port == 2)
  1714. return "x";
  1715. return "";
  1716. }
  1717. int VisualShaderNodeVectorSmoothStep::get_output_port_count() const {
  1718. return 1;
  1719. }
  1720. VisualShaderNodeVectorClamp::PortType VisualShaderNodeVectorSmoothStep::get_output_port_type(int p_port) const {
  1721. return PORT_TYPE_VECTOR;
  1722. }
  1723. String VisualShaderNodeVectorSmoothStep::get_output_port_name(int p_port) const {
  1724. return "";
  1725. }
  1726. String VisualShaderNodeVectorSmoothStep::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1727. return "\t" + p_output_vars[0] + " = smoothstep( " + p_input_vars[0] + ", " + p_input_vars[1] + ", " + p_input_vars[2] + " );\n";
  1728. }
  1729. VisualShaderNodeVectorSmoothStep::VisualShaderNodeVectorSmoothStep() {
  1730. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0));
  1731. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
  1732. set_input_port_default_value(2, Vector3(0.0, 0.0, 0.0));
  1733. }
  1734. ////////////// Vector-Scalar SmoothStep
  1735. String VisualShaderNodeVectorScalarSmoothStep::get_caption() const {
  1736. return "VectorScalarSmoothStep";
  1737. }
  1738. int VisualShaderNodeVectorScalarSmoothStep::get_input_port_count() const {
  1739. return 3;
  1740. }
  1741. VisualShaderNodeVectorScalarSmoothStep::PortType VisualShaderNodeVectorScalarSmoothStep::get_input_port_type(int p_port) const {
  1742. if (p_port == 0) {
  1743. return PORT_TYPE_SCALAR;
  1744. } else if (p_port == 1) {
  1745. return PORT_TYPE_SCALAR;
  1746. }
  1747. return PORT_TYPE_VECTOR;
  1748. }
  1749. String VisualShaderNodeVectorScalarSmoothStep::get_input_port_name(int p_port) const {
  1750. if (p_port == 0)
  1751. return "edge0";
  1752. else if (p_port == 1)
  1753. return "edge1";
  1754. else if (p_port == 2)
  1755. return "x";
  1756. return "";
  1757. }
  1758. int VisualShaderNodeVectorScalarSmoothStep::get_output_port_count() const {
  1759. return 1;
  1760. }
  1761. VisualShaderNodeVectorClamp::PortType VisualShaderNodeVectorScalarSmoothStep::get_output_port_type(int p_port) const {
  1762. return PORT_TYPE_VECTOR;
  1763. }
  1764. String VisualShaderNodeVectorScalarSmoothStep::get_output_port_name(int p_port) const {
  1765. return "";
  1766. }
  1767. String VisualShaderNodeVectorScalarSmoothStep::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1768. return "\t" + p_output_vars[0] + " = smoothstep( " + p_input_vars[0] + ", " + p_input_vars[1] + ", " + p_input_vars[2] + " );\n";
  1769. }
  1770. VisualShaderNodeVectorScalarSmoothStep::VisualShaderNodeVectorScalarSmoothStep() {
  1771. set_input_port_default_value(0, 0.0);
  1772. set_input_port_default_value(1, 0.0);
  1773. set_input_port_default_value(2, Vector3(0.0, 0.0, 0.0));
  1774. }
  1775. ////////////// Distance
  1776. String VisualShaderNodeVectorDistance::get_caption() const {
  1777. return "Distance";
  1778. }
  1779. int VisualShaderNodeVectorDistance::get_input_port_count() const {
  1780. return 2;
  1781. }
  1782. VisualShaderNodeVectorDistance::PortType VisualShaderNodeVectorDistance::get_input_port_type(int p_port) const {
  1783. return PORT_TYPE_VECTOR;
  1784. }
  1785. String VisualShaderNodeVectorDistance::get_input_port_name(int p_port) const {
  1786. if (p_port == 0) {
  1787. return "p0";
  1788. } else if (p_port == 1) {
  1789. return "p1";
  1790. }
  1791. return "";
  1792. }
  1793. int VisualShaderNodeVectorDistance::get_output_port_count() const {
  1794. return 1;
  1795. }
  1796. VisualShaderNodeVectorDistance::PortType VisualShaderNodeVectorDistance::get_output_port_type(int p_port) const {
  1797. return PORT_TYPE_SCALAR;
  1798. }
  1799. String VisualShaderNodeVectorDistance::get_output_port_name(int p_port) const {
  1800. return "";
  1801. }
  1802. String VisualShaderNodeVectorDistance::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1803. return "\t" + p_output_vars[0] + " = distance( " + p_input_vars[0] + " , " + p_input_vars[1] + " );\n";
  1804. }
  1805. VisualShaderNodeVectorDistance::VisualShaderNodeVectorDistance() {
  1806. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0));
  1807. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
  1808. }
  1809. ////////////// Refract Vector
  1810. String VisualShaderNodeVectorRefract::get_caption() const {
  1811. return "Refract";
  1812. }
  1813. int VisualShaderNodeVectorRefract::get_input_port_count() const {
  1814. return 3;
  1815. }
  1816. VisualShaderNodeVectorRefract::PortType VisualShaderNodeVectorRefract::get_input_port_type(int p_port) const {
  1817. if (p_port == 2) {
  1818. return PORT_TYPE_SCALAR;
  1819. }
  1820. return PORT_TYPE_VECTOR;
  1821. }
  1822. String VisualShaderNodeVectorRefract::get_input_port_name(int p_port) const {
  1823. if (p_port == 0) {
  1824. return "I";
  1825. } else if (p_port == 1) {
  1826. return "N";
  1827. } else if (p_port == 2) {
  1828. return "eta";
  1829. }
  1830. return "";
  1831. }
  1832. int VisualShaderNodeVectorRefract::get_output_port_count() const {
  1833. return 1;
  1834. }
  1835. VisualShaderNodeVectorRefract::PortType VisualShaderNodeVectorRefract::get_output_port_type(int p_port) const {
  1836. return PORT_TYPE_VECTOR;
  1837. }
  1838. String VisualShaderNodeVectorRefract::get_output_port_name(int p_port) const {
  1839. return "";
  1840. }
  1841. String VisualShaderNodeVectorRefract::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1842. return "\t" + p_output_vars[0] + " = refract( " + p_input_vars[0] + ", " + p_input_vars[1] + ", " + p_input_vars[2] + " );\n";
  1843. }
  1844. VisualShaderNodeVectorRefract::VisualShaderNodeVectorRefract() {
  1845. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0));
  1846. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
  1847. set_input_port_default_value(2, 0.0);
  1848. }
  1849. ////////////// Scalar Interp
  1850. String VisualShaderNodeScalarInterp::get_caption() const {
  1851. return "Mix";
  1852. }
  1853. int VisualShaderNodeScalarInterp::get_input_port_count() const {
  1854. return 3;
  1855. }
  1856. VisualShaderNodeScalarInterp::PortType VisualShaderNodeScalarInterp::get_input_port_type(int p_port) const {
  1857. return PORT_TYPE_SCALAR;
  1858. }
  1859. String VisualShaderNodeScalarInterp::get_input_port_name(int p_port) const {
  1860. if (p_port == 0) {
  1861. return "a";
  1862. } else if (p_port == 1) {
  1863. return "b";
  1864. } else {
  1865. return "c";
  1866. }
  1867. }
  1868. int VisualShaderNodeScalarInterp::get_output_port_count() const {
  1869. return 1;
  1870. }
  1871. VisualShaderNodeScalarInterp::PortType VisualShaderNodeScalarInterp::get_output_port_type(int p_port) const {
  1872. return PORT_TYPE_SCALAR;
  1873. }
  1874. String VisualShaderNodeScalarInterp::get_output_port_name(int p_port) const {
  1875. return "mix";
  1876. }
  1877. String VisualShaderNodeScalarInterp::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1878. return "\t" + p_output_vars[0] + " = mix( " + p_input_vars[0] + " , " + p_input_vars[1] + " , " + p_input_vars[2] + " );\n";
  1879. }
  1880. VisualShaderNodeScalarInterp::VisualShaderNodeScalarInterp() {
  1881. set_input_port_default_value(0, 0.0);
  1882. set_input_port_default_value(1, 0.0);
  1883. set_input_port_default_value(2, 0.0);
  1884. }
  1885. ////////////// Vector Interp
  1886. String VisualShaderNodeVectorInterp::get_caption() const {
  1887. return "Mix";
  1888. }
  1889. int VisualShaderNodeVectorInterp::get_input_port_count() const {
  1890. return 3;
  1891. }
  1892. VisualShaderNodeVectorInterp::PortType VisualShaderNodeVectorInterp::get_input_port_type(int p_port) const {
  1893. return PORT_TYPE_VECTOR;
  1894. }
  1895. String VisualShaderNodeVectorInterp::get_input_port_name(int p_port) const {
  1896. if (p_port == 0) {
  1897. return "a";
  1898. } else if (p_port == 1) {
  1899. return "b";
  1900. } else {
  1901. return "c";
  1902. }
  1903. }
  1904. int VisualShaderNodeVectorInterp::get_output_port_count() const {
  1905. return 1;
  1906. }
  1907. VisualShaderNodeVectorInterp::PortType VisualShaderNodeVectorInterp::get_output_port_type(int p_port) const {
  1908. return PORT_TYPE_VECTOR;
  1909. }
  1910. String VisualShaderNodeVectorInterp::get_output_port_name(int p_port) const {
  1911. return "mix";
  1912. }
  1913. String VisualShaderNodeVectorInterp::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1914. return "\t" + p_output_vars[0] + " = mix( " + p_input_vars[0] + " , " + p_input_vars[1] + " , " + p_input_vars[2] + " );\n";
  1915. }
  1916. VisualShaderNodeVectorInterp::VisualShaderNodeVectorInterp() {
  1917. set_input_port_default_value(0, Vector3());
  1918. set_input_port_default_value(1, Vector3());
  1919. set_input_port_default_value(2, Vector3());
  1920. }
  1921. ////////////// Vector Compose
  1922. String VisualShaderNodeVectorCompose::get_caption() const {
  1923. return "VectorCompose";
  1924. }
  1925. int VisualShaderNodeVectorCompose::get_input_port_count() const {
  1926. return 3;
  1927. }
  1928. VisualShaderNodeVectorCompose::PortType VisualShaderNodeVectorCompose::get_input_port_type(int p_port) const {
  1929. return PORT_TYPE_SCALAR;
  1930. }
  1931. String VisualShaderNodeVectorCompose::get_input_port_name(int p_port) const {
  1932. if (p_port == 0) {
  1933. return "x";
  1934. } else if (p_port == 1) {
  1935. return "y";
  1936. } else {
  1937. return "z";
  1938. }
  1939. }
  1940. int VisualShaderNodeVectorCompose::get_output_port_count() const {
  1941. return 1;
  1942. }
  1943. VisualShaderNodeVectorCompose::PortType VisualShaderNodeVectorCompose::get_output_port_type(int p_port) const {
  1944. return PORT_TYPE_VECTOR;
  1945. }
  1946. String VisualShaderNodeVectorCompose::get_output_port_name(int p_port) const {
  1947. return "vec";
  1948. }
  1949. String VisualShaderNodeVectorCompose::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1950. return "\t" + p_output_vars[0] + " = vec3( " + p_input_vars[0] + " , " + p_input_vars[1] + " , " + p_input_vars[2] + " );\n";
  1951. }
  1952. VisualShaderNodeVectorCompose::VisualShaderNodeVectorCompose() {
  1953. set_input_port_default_value(0, 0.0);
  1954. set_input_port_default_value(1, 0.0);
  1955. set_input_port_default_value(2, 0.0);
  1956. }
  1957. ////////////// Transform Compose
  1958. String VisualShaderNodeTransformCompose::get_caption() const {
  1959. return "TransformCompose";
  1960. }
  1961. int VisualShaderNodeTransformCompose::get_input_port_count() const {
  1962. return 4;
  1963. }
  1964. VisualShaderNodeTransformCompose::PortType VisualShaderNodeTransformCompose::get_input_port_type(int p_port) const {
  1965. return PORT_TYPE_VECTOR;
  1966. }
  1967. String VisualShaderNodeTransformCompose::get_input_port_name(int p_port) const {
  1968. if (p_port == 0) {
  1969. return "x";
  1970. } else if (p_port == 1) {
  1971. return "y";
  1972. } else if (p_port == 2) {
  1973. return "z";
  1974. } else {
  1975. return "origin";
  1976. }
  1977. }
  1978. int VisualShaderNodeTransformCompose::get_output_port_count() const {
  1979. return 1;
  1980. }
  1981. VisualShaderNodeTransformCompose::PortType VisualShaderNodeTransformCompose::get_output_port_type(int p_port) const {
  1982. return PORT_TYPE_TRANSFORM;
  1983. }
  1984. String VisualShaderNodeTransformCompose::get_output_port_name(int p_port) const {
  1985. return "xform";
  1986. }
  1987. String VisualShaderNodeTransformCompose::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1988. return "\t" + p_output_vars[0] + " = mat4( vec4(" + p_input_vars[0] + ", 0.0) , vec4(" + p_input_vars[1] + ", 0.0) , vec4(" + p_input_vars[2] + ",0.0), vec4(" + p_input_vars[3] + ",1.0) );\n";
  1989. }
  1990. VisualShaderNodeTransformCompose::VisualShaderNodeTransformCompose() {
  1991. set_input_port_default_value(0, Vector3());
  1992. set_input_port_default_value(1, Vector3());
  1993. set_input_port_default_value(2, Vector3());
  1994. set_input_port_default_value(3, Vector3());
  1995. }
  1996. ////////////// Vector Decompose
  1997. String VisualShaderNodeVectorDecompose::get_caption() const {
  1998. return "VectorDecompose";
  1999. }
  2000. int VisualShaderNodeVectorDecompose::get_input_port_count() const {
  2001. return 1;
  2002. }
  2003. VisualShaderNodeVectorDecompose::PortType VisualShaderNodeVectorDecompose::get_input_port_type(int p_port) const {
  2004. return PORT_TYPE_VECTOR;
  2005. }
  2006. String VisualShaderNodeVectorDecompose::get_input_port_name(int p_port) const {
  2007. return "vec";
  2008. }
  2009. int VisualShaderNodeVectorDecompose::get_output_port_count() const {
  2010. return 3;
  2011. }
  2012. VisualShaderNodeVectorDecompose::PortType VisualShaderNodeVectorDecompose::get_output_port_type(int p_port) const {
  2013. return PORT_TYPE_SCALAR;
  2014. }
  2015. String VisualShaderNodeVectorDecompose::get_output_port_name(int p_port) const {
  2016. if (p_port == 0) {
  2017. return "x";
  2018. } else if (p_port == 1) {
  2019. return "y";
  2020. } else {
  2021. return "z";
  2022. }
  2023. }
  2024. String VisualShaderNodeVectorDecompose::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2025. String code;
  2026. code += "\t" + p_output_vars[0] + " = " + p_input_vars[0] + ".x;\n";
  2027. code += "\t" + p_output_vars[1] + " = " + p_input_vars[0] + ".y;\n";
  2028. code += "\t" + p_output_vars[2] + " = " + p_input_vars[0] + ".z;\n";
  2029. return code;
  2030. }
  2031. VisualShaderNodeVectorDecompose::VisualShaderNodeVectorDecompose() {
  2032. set_input_port_default_value(0, Vector3());
  2033. }
  2034. ////////////// Transform Decompose
  2035. String VisualShaderNodeTransformDecompose::get_caption() const {
  2036. return "TransformDecompose";
  2037. }
  2038. int VisualShaderNodeTransformDecompose::get_input_port_count() const {
  2039. return 1;
  2040. }
  2041. VisualShaderNodeTransformDecompose::PortType VisualShaderNodeTransformDecompose::get_input_port_type(int p_port) const {
  2042. return PORT_TYPE_TRANSFORM;
  2043. }
  2044. String VisualShaderNodeTransformDecompose::get_input_port_name(int p_port) const {
  2045. return "xform";
  2046. }
  2047. int VisualShaderNodeTransformDecompose::get_output_port_count() const {
  2048. return 4;
  2049. }
  2050. VisualShaderNodeTransformDecompose::PortType VisualShaderNodeTransformDecompose::get_output_port_type(int p_port) const {
  2051. return PORT_TYPE_VECTOR;
  2052. }
  2053. String VisualShaderNodeTransformDecompose::get_output_port_name(int p_port) const {
  2054. if (p_port == 0) {
  2055. return "x";
  2056. } else if (p_port == 1) {
  2057. return "y";
  2058. } else if (p_port == 2) {
  2059. return "z";
  2060. } else {
  2061. return "origin";
  2062. }
  2063. }
  2064. String VisualShaderNodeTransformDecompose::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2065. String code;
  2066. code += "\t" + p_output_vars[0] + " = " + p_input_vars[0] + "[0].xyz;\n";
  2067. code += "\t" + p_output_vars[1] + " = " + p_input_vars[0] + "[1].xyz;\n";
  2068. code += "\t" + p_output_vars[2] + " = " + p_input_vars[0] + "[2].xyz;\n";
  2069. code += "\t" + p_output_vars[3] + " = " + p_input_vars[0] + "[3].xyz;\n";
  2070. return code;
  2071. }
  2072. VisualShaderNodeTransformDecompose::VisualShaderNodeTransformDecompose() {
  2073. set_input_port_default_value(0, Transform());
  2074. }
  2075. ////////////// Scalar Uniform
  2076. String VisualShaderNodeScalarUniform::get_caption() const {
  2077. return "ScalarUniform";
  2078. }
  2079. int VisualShaderNodeScalarUniform::get_input_port_count() const {
  2080. return 0;
  2081. }
  2082. VisualShaderNodeScalarUniform::PortType VisualShaderNodeScalarUniform::get_input_port_type(int p_port) const {
  2083. return PORT_TYPE_SCALAR;
  2084. }
  2085. String VisualShaderNodeScalarUniform::get_input_port_name(int p_port) const {
  2086. return String();
  2087. }
  2088. int VisualShaderNodeScalarUniform::get_output_port_count() const {
  2089. return 1;
  2090. }
  2091. VisualShaderNodeScalarUniform::PortType VisualShaderNodeScalarUniform::get_output_port_type(int p_port) const {
  2092. return PORT_TYPE_SCALAR;
  2093. }
  2094. String VisualShaderNodeScalarUniform::get_output_port_name(int p_port) const {
  2095. return ""; //no output port means the editor will be used as port
  2096. }
  2097. String VisualShaderNodeScalarUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  2098. return "uniform float " + get_uniform_name() + ";\n";
  2099. }
  2100. String VisualShaderNodeScalarUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2101. return "\t" + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
  2102. }
  2103. VisualShaderNodeScalarUniform::VisualShaderNodeScalarUniform() {
  2104. }
  2105. ////////////// Boolean Uniform
  2106. String VisualShaderNodeBooleanUniform::get_caption() const {
  2107. return "BooleanUniform";
  2108. }
  2109. int VisualShaderNodeBooleanUniform::get_input_port_count() const {
  2110. return 0;
  2111. }
  2112. VisualShaderNodeBooleanUniform::PortType VisualShaderNodeBooleanUniform::get_input_port_type(int p_port) const {
  2113. return PORT_TYPE_BOOLEAN;
  2114. }
  2115. String VisualShaderNodeBooleanUniform::get_input_port_name(int p_port) const {
  2116. return String();
  2117. }
  2118. int VisualShaderNodeBooleanUniform::get_output_port_count() const {
  2119. return 1;
  2120. }
  2121. VisualShaderNodeBooleanUniform::PortType VisualShaderNodeBooleanUniform::get_output_port_type(int p_port) const {
  2122. return PORT_TYPE_BOOLEAN;
  2123. }
  2124. String VisualShaderNodeBooleanUniform::get_output_port_name(int p_port) const {
  2125. return ""; //no output port means the editor will be used as port
  2126. }
  2127. String VisualShaderNodeBooleanUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  2128. return "uniform bool " + get_uniform_name() + ";\n";
  2129. }
  2130. String VisualShaderNodeBooleanUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2131. return "\t" + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
  2132. }
  2133. VisualShaderNodeBooleanUniform::VisualShaderNodeBooleanUniform() {
  2134. }
  2135. ////////////// Color Uniform
  2136. String VisualShaderNodeColorUniform::get_caption() const {
  2137. return "ColorUniform";
  2138. }
  2139. int VisualShaderNodeColorUniform::get_input_port_count() const {
  2140. return 0;
  2141. }
  2142. VisualShaderNodeColorUniform::PortType VisualShaderNodeColorUniform::get_input_port_type(int p_port) const {
  2143. return PORT_TYPE_VECTOR;
  2144. }
  2145. String VisualShaderNodeColorUniform::get_input_port_name(int p_port) const {
  2146. return String();
  2147. }
  2148. int VisualShaderNodeColorUniform::get_output_port_count() const {
  2149. return 2;
  2150. }
  2151. VisualShaderNodeColorUniform::PortType VisualShaderNodeColorUniform::get_output_port_type(int p_port) const {
  2152. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  2153. }
  2154. String VisualShaderNodeColorUniform::get_output_port_name(int p_port) const {
  2155. return p_port == 0 ? "color" : "alpha"; //no output port means the editor will be used as port
  2156. }
  2157. String VisualShaderNodeColorUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  2158. return "uniform vec4 " + get_uniform_name() + " : hint_color;\n";
  2159. }
  2160. String VisualShaderNodeColorUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2161. String code = "\t" + p_output_vars[0] + " = " + get_uniform_name() + ".rgb;\n";
  2162. code += "\t" + p_output_vars[1] + " = " + get_uniform_name() + ".a;\n";
  2163. return code;
  2164. }
  2165. VisualShaderNodeColorUniform::VisualShaderNodeColorUniform() {
  2166. }
  2167. ////////////// Vector Uniform
  2168. String VisualShaderNodeVec3Uniform::get_caption() const {
  2169. return "VectorUniform";
  2170. }
  2171. int VisualShaderNodeVec3Uniform::get_input_port_count() const {
  2172. return 0;
  2173. }
  2174. VisualShaderNodeVec3Uniform::PortType VisualShaderNodeVec3Uniform::get_input_port_type(int p_port) const {
  2175. return PORT_TYPE_VECTOR;
  2176. }
  2177. String VisualShaderNodeVec3Uniform::get_input_port_name(int p_port) const {
  2178. return String();
  2179. }
  2180. int VisualShaderNodeVec3Uniform::get_output_port_count() const {
  2181. return 1;
  2182. }
  2183. VisualShaderNodeVec3Uniform::PortType VisualShaderNodeVec3Uniform::get_output_port_type(int p_port) const {
  2184. return PORT_TYPE_VECTOR;
  2185. }
  2186. String VisualShaderNodeVec3Uniform::get_output_port_name(int p_port) const {
  2187. return ""; //no output port means the editor will be used as port
  2188. }
  2189. String VisualShaderNodeVec3Uniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  2190. return "uniform vec3 " + get_uniform_name() + ";\n";
  2191. }
  2192. String VisualShaderNodeVec3Uniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2193. return "\t" + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
  2194. }
  2195. VisualShaderNodeVec3Uniform::VisualShaderNodeVec3Uniform() {
  2196. }
  2197. ////////////// Transform Uniform
  2198. String VisualShaderNodeTransformUniform::get_caption() const {
  2199. return "TransformUniform";
  2200. }
  2201. int VisualShaderNodeTransformUniform::get_input_port_count() const {
  2202. return 0;
  2203. }
  2204. VisualShaderNodeTransformUniform::PortType VisualShaderNodeTransformUniform::get_input_port_type(int p_port) const {
  2205. return PORT_TYPE_VECTOR;
  2206. }
  2207. String VisualShaderNodeTransformUniform::get_input_port_name(int p_port) const {
  2208. return String();
  2209. }
  2210. int VisualShaderNodeTransformUniform::get_output_port_count() const {
  2211. return 1;
  2212. }
  2213. VisualShaderNodeTransformUniform::PortType VisualShaderNodeTransformUniform::get_output_port_type(int p_port) const {
  2214. return PORT_TYPE_TRANSFORM;
  2215. }
  2216. String VisualShaderNodeTransformUniform::get_output_port_name(int p_port) const {
  2217. return ""; //no output port means the editor will be used as port
  2218. }
  2219. String VisualShaderNodeTransformUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  2220. return "uniform mat4 " + get_uniform_name() + ";\n";
  2221. }
  2222. String VisualShaderNodeTransformUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2223. return "\t" + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
  2224. }
  2225. VisualShaderNodeTransformUniform::VisualShaderNodeTransformUniform() {
  2226. }
  2227. ////////////// Texture Uniform
  2228. String VisualShaderNodeTextureUniform::get_caption() const {
  2229. return "TextureUniform";
  2230. }
  2231. int VisualShaderNodeTextureUniform::get_input_port_count() const {
  2232. return 2;
  2233. }
  2234. VisualShaderNodeTextureUniform::PortType VisualShaderNodeTextureUniform::get_input_port_type(int p_port) const {
  2235. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  2236. }
  2237. String VisualShaderNodeTextureUniform::get_input_port_name(int p_port) const {
  2238. return p_port == 0 ? "uv" : "lod";
  2239. }
  2240. int VisualShaderNodeTextureUniform::get_output_port_count() const {
  2241. return 2;
  2242. }
  2243. VisualShaderNodeTextureUniform::PortType VisualShaderNodeTextureUniform::get_output_port_type(int p_port) const {
  2244. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  2245. }
  2246. String VisualShaderNodeTextureUniform::get_output_port_name(int p_port) const {
  2247. return p_port == 0 ? "rgb" : "alpha";
  2248. }
  2249. String VisualShaderNodeTextureUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  2250. String code = "uniform sampler2D " + get_uniform_name();
  2251. switch (texture_type) {
  2252. case TYPE_DATA:
  2253. if (color_default == COLOR_DEFAULT_BLACK)
  2254. code += " : hint_black;\n";
  2255. else
  2256. code += ";\n";
  2257. break;
  2258. case TYPE_COLOR:
  2259. if (color_default == COLOR_DEFAULT_BLACK)
  2260. code += " : hint_black_albedo;\n";
  2261. else
  2262. code += " : hint_albedo;\n";
  2263. break;
  2264. case TYPE_NORMALMAP: code += " : hint_normal;\n"; break;
  2265. case TYPE_ANISO: code += " : hint_aniso;\n"; break;
  2266. }
  2267. return code;
  2268. }
  2269. String VisualShaderNodeTextureUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2270. String id = get_uniform_name();
  2271. String code = "\t{\n";
  2272. if (p_input_vars[0] == String()) { //none bound, do nothing
  2273. code += "\t\tvec4 n_tex_read = vec4(0.0);\n";
  2274. } else if (p_input_vars[1] == String()) {
  2275. //no lod
  2276. code += "\t\tvec4 n_tex_read = texture( " + id + " , " + p_input_vars[0] + ".xy );\n";
  2277. } else {
  2278. code += "\t\tvec4 n_tex_read = textureLod( " + id + " , " + p_input_vars[0] + ".xy , " + p_input_vars[1] + " );\n";
  2279. }
  2280. code += "\t\t" + p_output_vars[0] + " = n_tex_read.rgb;\n";
  2281. code += "\t\t" + p_output_vars[1] + " = n_tex_read.a;\n";
  2282. code += "\t}\n";
  2283. return code;
  2284. }
  2285. void VisualShaderNodeTextureUniform::set_texture_type(TextureType p_type) {
  2286. texture_type = p_type;
  2287. emit_changed();
  2288. }
  2289. VisualShaderNodeTextureUniform::TextureType VisualShaderNodeTextureUniform::get_texture_type() const {
  2290. return texture_type;
  2291. }
  2292. void VisualShaderNodeTextureUniform::set_color_default(ColorDefault p_default) {
  2293. color_default = p_default;
  2294. emit_changed();
  2295. }
  2296. VisualShaderNodeTextureUniform::ColorDefault VisualShaderNodeTextureUniform::get_color_default() const {
  2297. return color_default;
  2298. }
  2299. Vector<StringName> VisualShaderNodeTextureUniform::get_editable_properties() const {
  2300. Vector<StringName> props;
  2301. props.push_back("texture_type");
  2302. props.push_back("color_default");
  2303. return props;
  2304. }
  2305. void VisualShaderNodeTextureUniform::_bind_methods() {
  2306. ClassDB::bind_method(D_METHOD("set_texture_type", "type"), &VisualShaderNodeTextureUniform::set_texture_type);
  2307. ClassDB::bind_method(D_METHOD("get_texture_type"), &VisualShaderNodeTextureUniform::get_texture_type);
  2308. ClassDB::bind_method(D_METHOD("set_color_default", "type"), &VisualShaderNodeTextureUniform::set_color_default);
  2309. ClassDB::bind_method(D_METHOD("get_color_default"), &VisualShaderNodeTextureUniform::get_color_default);
  2310. ADD_PROPERTY(PropertyInfo(Variant::INT, "texture_type", PROPERTY_HINT_ENUM, "Data,Color,Normalmap,Aniso"), "set_texture_type", "get_texture_type");
  2311. ADD_PROPERTY(PropertyInfo(Variant::INT, "color_default", PROPERTY_HINT_ENUM, "White Default,Black Default"), "set_color_default", "get_color_default");
  2312. BIND_ENUM_CONSTANT(TYPE_DATA);
  2313. BIND_ENUM_CONSTANT(TYPE_COLOR);
  2314. BIND_ENUM_CONSTANT(TYPE_NORMALMAP);
  2315. BIND_ENUM_CONSTANT(TYPE_ANISO);
  2316. BIND_ENUM_CONSTANT(COLOR_DEFAULT_WHITE);
  2317. BIND_ENUM_CONSTANT(COLOR_DEFAULT_BLACK);
  2318. }
  2319. VisualShaderNodeTextureUniform::VisualShaderNodeTextureUniform() {
  2320. texture_type = TYPE_DATA;
  2321. color_default = COLOR_DEFAULT_WHITE;
  2322. }
  2323. ////////////// CubeMap Uniform
  2324. String VisualShaderNodeCubeMapUniform::get_caption() const {
  2325. return "CubeMapUniform";
  2326. }
  2327. int VisualShaderNodeCubeMapUniform::get_input_port_count() const {
  2328. return 2;
  2329. }
  2330. VisualShaderNodeCubeMapUniform::PortType VisualShaderNodeCubeMapUniform::get_input_port_type(int p_port) const {
  2331. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  2332. }
  2333. String VisualShaderNodeCubeMapUniform::get_input_port_name(int p_port) const {
  2334. return p_port == 0 ? "normal" : "lod";
  2335. }
  2336. int VisualShaderNodeCubeMapUniform::get_output_port_count() const {
  2337. return 2;
  2338. }
  2339. VisualShaderNodeCubeMapUniform::PortType VisualShaderNodeCubeMapUniform::get_output_port_type(int p_port) const {
  2340. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  2341. }
  2342. String VisualShaderNodeCubeMapUniform::get_output_port_name(int p_port) const {
  2343. return p_port == 0 ? "rgb" : "alpha";
  2344. }
  2345. String VisualShaderNodeCubeMapUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2346. return String();
  2347. }
  2348. VisualShaderNodeCubeMapUniform::VisualShaderNodeCubeMapUniform() {
  2349. }
  2350. ////////////// If
  2351. String VisualShaderNodeIf::get_caption() const {
  2352. return "If";
  2353. }
  2354. int VisualShaderNodeIf::get_input_port_count() const {
  2355. return 6;
  2356. }
  2357. VisualShaderNodeIf::PortType VisualShaderNodeIf::get_input_port_type(int p_port) const {
  2358. if (p_port == 0 || p_port == 1 || p_port == 2) {
  2359. return PORT_TYPE_SCALAR;
  2360. }
  2361. return PORT_TYPE_VECTOR;
  2362. }
  2363. String VisualShaderNodeIf::get_input_port_name(int p_port) const {
  2364. switch (p_port) {
  2365. case 0:
  2366. return "a";
  2367. case 1:
  2368. return "b";
  2369. case 2:
  2370. return "tolerance";
  2371. case 3:
  2372. return "a == b";
  2373. case 4:
  2374. return "a > b";
  2375. case 5:
  2376. return "a < b";
  2377. default:
  2378. return "";
  2379. }
  2380. }
  2381. int VisualShaderNodeIf::get_output_port_count() const {
  2382. return 1;
  2383. }
  2384. VisualShaderNodeIf::PortType VisualShaderNodeIf::get_output_port_type(int p_port) const {
  2385. return PORT_TYPE_VECTOR;
  2386. }
  2387. String VisualShaderNodeIf::get_output_port_name(int p_port) const {
  2388. return "result";
  2389. }
  2390. String VisualShaderNodeIf::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2391. String code;
  2392. code += "\tif(abs(" + p_input_vars[0] + "-" + p_input_vars[1] + ")<" + p_input_vars[2] + ")\n"; // abs(a - b) < tolerance eg. a == b
  2393. code += "\t{\n";
  2394. code += "\t\t" + p_output_vars[0] + "=" + p_input_vars[3] + ";\n";
  2395. code += "\t}\n";
  2396. code += "\telse if(" + p_input_vars[0] + "<" + p_input_vars[1] + ")\n"; // a < b
  2397. code += "\t{\n";
  2398. code += "\t\t" + p_output_vars[0] + "=" + p_input_vars[5] + ";\n";
  2399. code += "\t}\n";
  2400. code += "\telse\n"; // a > b (or a >= b if abs(a - b) < tolerance is false)
  2401. code += "\t{\n";
  2402. code += "\t\t" + p_output_vars[0] + "=" + p_input_vars[4] + ";\n";
  2403. code += "\t}\n";
  2404. return code;
  2405. }
  2406. VisualShaderNodeIf::VisualShaderNodeIf() {
  2407. set_input_port_default_value(0, 0.0);
  2408. set_input_port_default_value(1, 0.0);
  2409. set_input_port_default_value(2, CMP_EPSILON);
  2410. set_input_port_default_value(3, Vector3(0.0, 0.0, 0.0));
  2411. set_input_port_default_value(4, Vector3(0.0, 0.0, 0.0));
  2412. set_input_port_default_value(5, Vector3(0.0, 0.0, 0.0));
  2413. }
  2414. ////////////// Switch
  2415. String VisualShaderNodeSwitch::get_caption() const {
  2416. return "Switch";
  2417. }
  2418. int VisualShaderNodeSwitch::get_input_port_count() const {
  2419. return 3;
  2420. }
  2421. VisualShaderNodeSwitch::PortType VisualShaderNodeSwitch::get_input_port_type(int p_port) const {
  2422. if (p_port == 0) {
  2423. return PORT_TYPE_BOOLEAN;
  2424. }
  2425. return PORT_TYPE_VECTOR;
  2426. }
  2427. String VisualShaderNodeSwitch::get_input_port_name(int p_port) const {
  2428. switch (p_port) {
  2429. case 0:
  2430. return "value";
  2431. case 1:
  2432. return "true";
  2433. case 2:
  2434. return "false";
  2435. default:
  2436. return "";
  2437. }
  2438. }
  2439. int VisualShaderNodeSwitch::get_output_port_count() const {
  2440. return 1;
  2441. }
  2442. VisualShaderNodeSwitch::PortType VisualShaderNodeSwitch::get_output_port_type(int p_port) const {
  2443. return PORT_TYPE_VECTOR;
  2444. }
  2445. String VisualShaderNodeSwitch::get_output_port_name(int p_port) const {
  2446. return "result";
  2447. }
  2448. String VisualShaderNodeSwitch::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2449. String code;
  2450. code += "\tif(" + p_input_vars[0] + ")\n";
  2451. code += "\t{\n";
  2452. code += "\t\t" + p_output_vars[0] + "=" + p_input_vars[1] + ";\n";
  2453. code += "\t}\n";
  2454. code += "\telse\n";
  2455. code += "\t{\n";
  2456. code += "\t\t" + p_output_vars[0] + "=" + p_input_vars[2] + ";\n";
  2457. code += "\t}\n";
  2458. return code;
  2459. }
  2460. VisualShaderNodeSwitch::VisualShaderNodeSwitch() {
  2461. set_input_port_default_value(0, false);
  2462. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
  2463. set_input_port_default_value(2, Vector3(0.0, 0.0, 0.0));
  2464. }