visual_shader.cpp 148 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892
  1. /*************************************************************************/
  2. /* visual_shader.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2021 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.h"
  31. #include "core/templates/vmap.h"
  32. #include "servers/rendering/shader_types.h"
  33. #include "visual_shader_nodes.h"
  34. #include "visual_shader_particle_nodes.h"
  35. #include "visual_shader_sdf_nodes.h"
  36. bool VisualShaderNode::is_simple_decl() const {
  37. return simple_decl;
  38. }
  39. void VisualShaderNode::set_output_port_for_preview(int p_index) {
  40. port_preview = p_index;
  41. }
  42. int VisualShaderNode::get_output_port_for_preview() const {
  43. return port_preview;
  44. }
  45. void VisualShaderNode::set_input_port_default_value(int p_port, const Variant &p_value) {
  46. default_input_values[p_port] = p_value;
  47. emit_changed();
  48. }
  49. Variant VisualShaderNode::get_input_port_default_value(int p_port) const {
  50. if (default_input_values.has(p_port)) {
  51. return default_input_values[p_port];
  52. }
  53. return Variant();
  54. }
  55. void VisualShaderNode::remove_input_port_default_value(int p_port) {
  56. if (default_input_values.has(p_port)) {
  57. default_input_values.erase(p_port);
  58. emit_changed();
  59. }
  60. }
  61. void VisualShaderNode::clear_default_input_values() {
  62. if (!default_input_values.is_empty()) {
  63. default_input_values.clear();
  64. emit_changed();
  65. }
  66. }
  67. bool VisualShaderNode::is_port_separator(int p_index) const {
  68. return false;
  69. }
  70. bool VisualShaderNode::is_output_port_connected(int p_port) const {
  71. if (connected_output_ports.has(p_port)) {
  72. return connected_output_ports[p_port] > 0;
  73. }
  74. return false;
  75. }
  76. void VisualShaderNode::set_output_port_connected(int p_port, bool p_connected) {
  77. if (p_connected) {
  78. connected_output_ports[p_port]++;
  79. } else {
  80. connected_output_ports[p_port]--;
  81. }
  82. }
  83. bool VisualShaderNode::is_input_port_connected(int p_port) const {
  84. if (connected_input_ports.has(p_port)) {
  85. return connected_input_ports[p_port];
  86. }
  87. return false;
  88. }
  89. void VisualShaderNode::set_input_port_connected(int p_port, bool p_connected) {
  90. connected_input_ports[p_port] = p_connected;
  91. }
  92. bool VisualShaderNode::is_generate_input_var(int p_port) const {
  93. return true;
  94. }
  95. bool VisualShaderNode::is_output_port_expandable(int p_port) const {
  96. return false;
  97. }
  98. void VisualShaderNode::_set_output_ports_expanded(const Array &p_values) {
  99. for (int i = 0; i < p_values.size(); i++) {
  100. expanded_output_ports[p_values[i]] = true;
  101. }
  102. emit_changed();
  103. }
  104. Array VisualShaderNode::_get_output_ports_expanded() const {
  105. Array arr;
  106. for (int i = 0; i < get_output_port_count(); i++) {
  107. if (_is_output_port_expanded(i)) {
  108. arr.push_back(i);
  109. }
  110. }
  111. return arr;
  112. }
  113. void VisualShaderNode::_set_output_port_expanded(int p_port, bool p_expanded) {
  114. expanded_output_ports[p_port] = p_expanded;
  115. emit_changed();
  116. }
  117. bool VisualShaderNode::_is_output_port_expanded(int p_port) const {
  118. if (expanded_output_ports.has(p_port)) {
  119. return expanded_output_ports[p_port];
  120. }
  121. return false;
  122. }
  123. int VisualShaderNode::get_expanded_output_port_count() const {
  124. int count = get_output_port_count();
  125. int count2 = count;
  126. for (int i = 0; i < count; i++) {
  127. if (is_output_port_expandable(i) && _is_output_port_expanded(i)) {
  128. if (get_output_port_type(i) == PORT_TYPE_VECTOR) {
  129. count2 += 3;
  130. }
  131. }
  132. }
  133. return count2;
  134. }
  135. bool VisualShaderNode::is_code_generated() const {
  136. return true;
  137. }
  138. bool VisualShaderNode::is_show_prop_names() const {
  139. return false;
  140. }
  141. bool VisualShaderNode::is_use_prop_slots() const {
  142. return false;
  143. }
  144. bool VisualShaderNode::is_disabled() const {
  145. return disabled;
  146. }
  147. void VisualShaderNode::set_disabled(bool p_disabled) {
  148. disabled = p_disabled;
  149. }
  150. Vector<VisualShader::DefaultTextureParam> VisualShaderNode::get_default_texture_parameters(VisualShader::Type p_type, int p_id) const {
  151. return Vector<VisualShader::DefaultTextureParam>();
  152. }
  153. String VisualShaderNode::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  154. return String();
  155. }
  156. String VisualShaderNode::generate_global_per_node(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  157. return String();
  158. }
  159. String VisualShaderNode::generate_global_per_func(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  160. return String();
  161. }
  162. Vector<StringName> VisualShaderNode::get_editable_properties() const {
  163. return Vector<StringName>();
  164. }
  165. Array VisualShaderNode::get_default_input_values() const {
  166. Array ret;
  167. for (Map<int, Variant>::Element *E = default_input_values.front(); E; E = E->next()) {
  168. ret.push_back(E->key());
  169. ret.push_back(E->get());
  170. }
  171. return ret;
  172. }
  173. void VisualShaderNode::set_default_input_values(const Array &p_values) {
  174. if (p_values.size() % 2 == 0) {
  175. for (int i = 0; i < p_values.size(); i += 2) {
  176. default_input_values[p_values[i + 0]] = p_values[i + 1];
  177. }
  178. }
  179. emit_changed();
  180. }
  181. String VisualShaderNode::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const {
  182. return String();
  183. }
  184. String VisualShaderNode::get_input_port_default_hint(int p_port) const {
  185. return "";
  186. }
  187. void VisualShaderNode::_bind_methods() {
  188. ClassDB::bind_method(D_METHOD("set_output_port_for_preview", "port"), &VisualShaderNode::set_output_port_for_preview);
  189. ClassDB::bind_method(D_METHOD("get_output_port_for_preview"), &VisualShaderNode::get_output_port_for_preview);
  190. ClassDB::bind_method(D_METHOD("_set_output_port_expanded", "port"), &VisualShaderNode::_set_output_port_expanded);
  191. ClassDB::bind_method(D_METHOD("_is_output_port_expanded"), &VisualShaderNode::_is_output_port_expanded);
  192. ClassDB::bind_method(D_METHOD("_set_output_ports_expanded", "values"), &VisualShaderNode::_set_output_ports_expanded);
  193. ClassDB::bind_method(D_METHOD("_get_output_ports_expanded"), &VisualShaderNode::_get_output_ports_expanded);
  194. ClassDB::bind_method(D_METHOD("set_input_port_default_value", "port", "value"), &VisualShaderNode::set_input_port_default_value);
  195. ClassDB::bind_method(D_METHOD("get_input_port_default_value", "port"), &VisualShaderNode::get_input_port_default_value);
  196. ClassDB::bind_method(D_METHOD("remove_input_port_default_value", "port"), &VisualShaderNode::remove_input_port_default_value);
  197. ClassDB::bind_method(D_METHOD("clear_default_input_values"), &VisualShaderNode::clear_default_input_values);
  198. ClassDB::bind_method(D_METHOD("set_default_input_values", "values"), &VisualShaderNode::set_default_input_values);
  199. ClassDB::bind_method(D_METHOD("get_default_input_values"), &VisualShaderNode::get_default_input_values);
  200. ADD_PROPERTY(PropertyInfo(Variant::INT, "output_port_for_preview"), "set_output_port_for_preview", "get_output_port_for_preview");
  201. ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "default_input_values", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "set_default_input_values", "get_default_input_values");
  202. ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "expanded_output_ports", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "_set_output_ports_expanded", "_get_output_ports_expanded");
  203. ADD_SIGNAL(MethodInfo("editor_refresh_request"));
  204. BIND_ENUM_CONSTANT(PORT_TYPE_SCALAR);
  205. BIND_ENUM_CONSTANT(PORT_TYPE_SCALAR_INT);
  206. BIND_ENUM_CONSTANT(PORT_TYPE_VECTOR);
  207. BIND_ENUM_CONSTANT(PORT_TYPE_BOOLEAN);
  208. BIND_ENUM_CONSTANT(PORT_TYPE_TRANSFORM);
  209. BIND_ENUM_CONSTANT(PORT_TYPE_SAMPLER);
  210. BIND_ENUM_CONSTANT(PORT_TYPE_MAX);
  211. }
  212. VisualShaderNode::VisualShaderNode() {
  213. }
  214. /////////////////////////////////////////////////////////
  215. void VisualShaderNodeCustom::update_ports() {
  216. ERR_FAIL_COND(!get_script_instance());
  217. input_ports.clear();
  218. if (get_script_instance()->has_method("_get_input_port_count")) {
  219. int input_port_count = (int)get_script_instance()->call("_get_input_port_count");
  220. bool has_name = get_script_instance()->has_method("_get_input_port_name");
  221. bool has_type = get_script_instance()->has_method("_get_input_port_type");
  222. for (int i = 0; i < input_port_count; i++) {
  223. Port port;
  224. if (has_name) {
  225. port.name = (String)get_script_instance()->call("_get_input_port_name", i);
  226. } else {
  227. port.name = "in" + itos(i);
  228. }
  229. if (has_type) {
  230. port.type = (int)get_script_instance()->call("_get_input_port_type", i);
  231. } else {
  232. port.type = (int)PortType::PORT_TYPE_SCALAR;
  233. }
  234. input_ports.push_back(port);
  235. }
  236. }
  237. output_ports.clear();
  238. if (get_script_instance()->has_method("_get_output_port_count")) {
  239. int output_port_count = (int)get_script_instance()->call("_get_output_port_count");
  240. bool has_name = get_script_instance()->has_method("_get_output_port_name");
  241. bool has_type = get_script_instance()->has_method("_get_output_port_type");
  242. for (int i = 0; i < output_port_count; i++) {
  243. Port port;
  244. if (has_name) {
  245. port.name = (String)get_script_instance()->call("_get_output_port_name", i);
  246. } else {
  247. port.name = "out" + itos(i);
  248. }
  249. if (has_type) {
  250. port.type = (int)get_script_instance()->call("_get_output_port_type", i);
  251. } else {
  252. port.type = (int)PortType::PORT_TYPE_SCALAR;
  253. }
  254. output_ports.push_back(port);
  255. }
  256. }
  257. }
  258. String VisualShaderNodeCustom::get_caption() const {
  259. ERR_FAIL_COND_V(!get_script_instance(), "");
  260. if (get_script_instance()->has_method("_get_name")) {
  261. return (String)get_script_instance()->call("_get_name");
  262. }
  263. return "Unnamed";
  264. }
  265. int VisualShaderNodeCustom::get_input_port_count() const {
  266. return input_ports.size();
  267. }
  268. VisualShaderNodeCustom::PortType VisualShaderNodeCustom::get_input_port_type(int p_port) const {
  269. ERR_FAIL_INDEX_V(p_port, input_ports.size(), PORT_TYPE_SCALAR);
  270. return (PortType)input_ports[p_port].type;
  271. }
  272. String VisualShaderNodeCustom::get_input_port_name(int p_port) const {
  273. ERR_FAIL_INDEX_V(p_port, input_ports.size(), "");
  274. return input_ports[p_port].name;
  275. }
  276. int VisualShaderNodeCustom::get_output_port_count() const {
  277. return output_ports.size();
  278. }
  279. VisualShaderNodeCustom::PortType VisualShaderNodeCustom::get_output_port_type(int p_port) const {
  280. ERR_FAIL_INDEX_V(p_port, output_ports.size(), PORT_TYPE_SCALAR);
  281. return (PortType)output_ports[p_port].type;
  282. }
  283. String VisualShaderNodeCustom::get_output_port_name(int p_port) const {
  284. ERR_FAIL_INDEX_V(p_port, output_ports.size(), "");
  285. return output_ports[p_port].name;
  286. }
  287. String VisualShaderNodeCustom::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 {
  288. ERR_FAIL_COND_V(!get_script_instance(), "");
  289. ERR_FAIL_COND_V(!get_script_instance()->has_method("_get_code"), "");
  290. Array input_vars;
  291. for (int i = 0; i < get_input_port_count(); i++) {
  292. input_vars.push_back(p_input_vars[i]);
  293. }
  294. Array output_vars;
  295. for (int i = 0; i < get_output_port_count(); i++) {
  296. output_vars.push_back(p_output_vars[i]);
  297. }
  298. String code = " {\n";
  299. String _code = (String)get_script_instance()->call("_get_code", input_vars, output_vars, (int)p_mode, (int)p_type);
  300. bool nend = _code.ends_with("\n");
  301. _code = _code.insert(0, " ");
  302. _code = _code.replace("\n", "\n ");
  303. code += _code;
  304. if (!nend) {
  305. code += "\n }";
  306. } else {
  307. code.remove(code.size() - 1);
  308. code += "}";
  309. }
  310. code += "\n";
  311. return code;
  312. }
  313. String VisualShaderNodeCustom::generate_global_per_node(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  314. ERR_FAIL_COND_V(!get_script_instance(), "");
  315. if (get_script_instance()->has_method("_get_global_code")) {
  316. String code = "// " + get_caption() + "\n";
  317. code += (String)get_script_instance()->call("_get_global_code", (int)p_mode);
  318. code += "\n";
  319. return code;
  320. }
  321. return "";
  322. }
  323. void VisualShaderNodeCustom::set_input_port_default_value(int p_port, const Variant &p_value) {
  324. if (!is_initialized) {
  325. VisualShaderNode::set_input_port_default_value(p_port, p_value);
  326. }
  327. }
  328. void VisualShaderNodeCustom::set_default_input_values(const Array &p_values) {
  329. if (!is_initialized) {
  330. VisualShaderNode::set_default_input_values(p_values);
  331. }
  332. }
  333. void VisualShaderNodeCustom::remove_input_port_default_value(int p_port) {
  334. if (!is_initialized) {
  335. VisualShaderNode::remove_input_port_default_value(p_port);
  336. }
  337. }
  338. void VisualShaderNodeCustom::clear_default_input_values() {
  339. if (!is_initialized) {
  340. VisualShaderNode::clear_default_input_values();
  341. }
  342. }
  343. void VisualShaderNodeCustom::_set_input_port_default_value(int p_port, const Variant &p_value) {
  344. VisualShaderNode::set_input_port_default_value(p_port, p_value);
  345. }
  346. bool VisualShaderNodeCustom::_is_initialized() {
  347. return is_initialized;
  348. }
  349. void VisualShaderNodeCustom::_set_initialized(bool p_enabled) {
  350. is_initialized = p_enabled;
  351. }
  352. void VisualShaderNodeCustom::_bind_methods() {
  353. BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_name"));
  354. BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_description"));
  355. BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_category"));
  356. BIND_VMETHOD(MethodInfo(Variant::INT, "_get_return_icon_type"));
  357. BIND_VMETHOD(MethodInfo(Variant::INT, "_get_input_port_count"));
  358. BIND_VMETHOD(MethodInfo(Variant::INT, "_get_input_port_type", PropertyInfo(Variant::INT, "port")));
  359. BIND_VMETHOD(MethodInfo(Variant::STRING_NAME, "_get_input_port_name", PropertyInfo(Variant::INT, "port")));
  360. BIND_VMETHOD(MethodInfo(Variant::INT, "_get_output_port_count"));
  361. BIND_VMETHOD(MethodInfo(Variant::INT, "_get_output_port_type", PropertyInfo(Variant::INT, "port")));
  362. BIND_VMETHOD(MethodInfo(Variant::STRING_NAME, "_get_output_port_name", PropertyInfo(Variant::INT, "port")));
  363. BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_code", PropertyInfo(Variant::ARRAY, "input_vars"), PropertyInfo(Variant::ARRAY, "output_vars"), PropertyInfo(Variant::INT, "mode"), PropertyInfo(Variant::INT, "type")));
  364. BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_global_code", PropertyInfo(Variant::INT, "mode")));
  365. BIND_VMETHOD(MethodInfo(Variant::BOOL, "_is_highend"));
  366. ClassDB::bind_method(D_METHOD("_set_initialized", "enabled"), &VisualShaderNodeCustom::_set_initialized);
  367. ClassDB::bind_method(D_METHOD("_is_initialized"), &VisualShaderNodeCustom::_is_initialized);
  368. ClassDB::bind_method(D_METHOD("_set_input_port_default_value", "port", "value"), &VisualShaderNodeCustom::_set_input_port_default_value);
  369. ADD_PROPERTY(PropertyInfo(Variant::BOOL, "initialized", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "_set_initialized", "_is_initialized");
  370. }
  371. VisualShaderNodeCustom::VisualShaderNodeCustom() {
  372. simple_decl = false;
  373. }
  374. /////////////////////////////////////////////////////////
  375. void VisualShader::set_shader_type(Type p_type) {
  376. current_type = p_type;
  377. }
  378. VisualShader::Type VisualShader::get_shader_type() const {
  379. return current_type;
  380. }
  381. void VisualShader::set_engine_version(const Dictionary &p_engine_version) {
  382. ERR_FAIL_COND(!p_engine_version.has("major"));
  383. ERR_FAIL_COND(!p_engine_version.has("minor"));
  384. engine_version["major"] = p_engine_version["major"];
  385. engine_version["minor"] = p_engine_version["minor"];
  386. }
  387. Dictionary VisualShader::get_engine_version() const {
  388. return engine_version;
  389. }
  390. #ifndef DISABLE_DEPRECATED
  391. void VisualShader::update_engine_version(const Dictionary &p_new_version) {
  392. if (engine_version.is_empty()) { // before 4.0
  393. for (int i = 0; i < TYPE_MAX; i++) {
  394. for (Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) {
  395. Ref<VisualShaderNodeInput> input = Object::cast_to<VisualShaderNodeInput>(E->get().node.ptr());
  396. if (input.is_valid()) {
  397. if (input->get_input_name() == "side") {
  398. input->set_input_name("front_facing");
  399. }
  400. }
  401. Ref<VisualShaderNodeExpression> expression = Object::cast_to<VisualShaderNodeExpression>(E->get().node.ptr());
  402. if (expression.is_valid()) {
  403. for (int j = 0; j < expression->get_input_port_count(); j++) {
  404. int type = expression->get_input_port_type(j);
  405. if (type > 0) { // + PORT_TYPE_SCALAR_INT
  406. type += 1;
  407. }
  408. expression->set_input_port_type(j, type);
  409. }
  410. for (int j = 0; j < expression->get_output_port_count(); j++) {
  411. int type = expression->get_output_port_type(j);
  412. if (type > 0) { // + PORT_TYPE_SCALAR_INT
  413. type += 1;
  414. }
  415. expression->set_output_port_type(j, type);
  416. }
  417. }
  418. Ref<VisualShaderNodeCompare> compare = Object::cast_to<VisualShaderNodeCompare>(E->get().node.ptr());
  419. if (compare.is_valid()) {
  420. int ctype = int(compare->get_comparison_type());
  421. if (int(ctype) > 0) { // + PORT_TYPE_SCALAR_INT
  422. ctype += 1;
  423. }
  424. compare->set_comparison_type(VisualShaderNodeCompare::ComparisonType(ctype));
  425. }
  426. }
  427. }
  428. }
  429. set_engine_version(p_new_version);
  430. }
  431. #endif /* DISABLE_DEPRECATED */
  432. void VisualShader::add_node(Type p_type, const Ref<VisualShaderNode> &p_node, const Vector2 &p_position, int p_id) {
  433. ERR_FAIL_COND(p_node.is_null());
  434. ERR_FAIL_COND(p_id < 2);
  435. ERR_FAIL_INDEX(p_type, TYPE_MAX);
  436. Graph *g = &graph[p_type];
  437. ERR_FAIL_COND(g->nodes.has(p_id));
  438. Node n;
  439. n.node = p_node;
  440. n.position = p_position;
  441. Ref<VisualShaderNodeUniform> uniform = n.node;
  442. if (uniform.is_valid()) {
  443. String valid_name = validate_uniform_name(uniform->get_uniform_name(), uniform);
  444. uniform->set_uniform_name(valid_name);
  445. }
  446. Ref<VisualShaderNodeInput> input = n.node;
  447. if (input.is_valid()) {
  448. input->shader_mode = shader_mode;
  449. input->shader_type = p_type;
  450. input->connect("input_type_changed", callable_mp(this, &VisualShader::_input_type_changed), varray(p_type, p_id));
  451. }
  452. n.node->connect("changed", callable_mp(this, &VisualShader::_queue_update));
  453. Ref<VisualShaderNodeCustom> custom = n.node;
  454. if (custom.is_valid()) {
  455. custom->update_ports();
  456. }
  457. g->nodes[p_id] = n;
  458. _queue_update();
  459. }
  460. void VisualShader::set_node_position(Type p_type, int p_id, const Vector2 &p_position) {
  461. ERR_FAIL_INDEX(p_type, TYPE_MAX);
  462. Graph *g = &graph[p_type];
  463. ERR_FAIL_COND(!g->nodes.has(p_id));
  464. g->nodes[p_id].position = p_position;
  465. }
  466. Vector2 VisualShader::get_node_position(Type p_type, int p_id) const {
  467. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, Vector2());
  468. const Graph *g = &graph[p_type];
  469. ERR_FAIL_COND_V(!g->nodes.has(p_id), Vector2());
  470. return g->nodes[p_id].position;
  471. }
  472. Ref<VisualShaderNode> VisualShader::get_node(Type p_type, int p_id) const {
  473. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, Ref<VisualShaderNode>());
  474. const Graph *g = &graph[p_type];
  475. ERR_FAIL_COND_V(!g->nodes.has(p_id), Ref<VisualShaderNode>());
  476. return g->nodes[p_id].node;
  477. }
  478. Vector<int> VisualShader::get_node_list(Type p_type) const {
  479. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, Vector<int>());
  480. const Graph *g = &graph[p_type];
  481. Vector<int> ret;
  482. for (Map<int, Node>::Element *E = g->nodes.front(); E; E = E->next()) {
  483. ret.push_back(E->key());
  484. }
  485. return ret;
  486. }
  487. int VisualShader::get_valid_node_id(Type p_type) const {
  488. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, NODE_ID_INVALID);
  489. const Graph *g = &graph[p_type];
  490. return g->nodes.size() ? MAX(2, g->nodes.back()->key() + 1) : 2;
  491. }
  492. int VisualShader::find_node_id(Type p_type, const Ref<VisualShaderNode> &p_node) const {
  493. for (const Map<int, Node>::Element *E = graph[p_type].nodes.front(); E; E = E->next()) {
  494. if (E->get().node == p_node) {
  495. return E->key();
  496. }
  497. }
  498. return NODE_ID_INVALID;
  499. }
  500. void VisualShader::remove_node(Type p_type, int p_id) {
  501. ERR_FAIL_INDEX(p_type, TYPE_MAX);
  502. ERR_FAIL_COND(p_id < 2);
  503. Graph *g = &graph[p_type];
  504. ERR_FAIL_COND(!g->nodes.has(p_id));
  505. Ref<VisualShaderNodeInput> input = g->nodes[p_id].node;
  506. if (input.is_valid()) {
  507. input->disconnect("input_type_changed", callable_mp(this, &VisualShader::_input_type_changed));
  508. }
  509. g->nodes[p_id].node->disconnect("changed", callable_mp(this, &VisualShader::_queue_update));
  510. g->nodes.erase(p_id);
  511. for (List<Connection>::Element *E = g->connections.front(); E;) {
  512. List<Connection>::Element *N = E->next();
  513. if (E->get().from_node == p_id || E->get().to_node == p_id) {
  514. g->connections.erase(E);
  515. if (E->get().from_node == p_id) {
  516. g->nodes[E->get().to_node].prev_connected_nodes.erase(p_id);
  517. g->nodes[E->get().to_node].node->set_input_port_connected(E->get().to_port, false);
  518. }
  519. }
  520. E = N;
  521. }
  522. _queue_update();
  523. }
  524. void VisualShader::replace_node(Type p_type, int p_id, const StringName &p_new_class) {
  525. ERR_FAIL_INDEX(p_type, TYPE_MAX);
  526. ERR_FAIL_COND(p_id < 2);
  527. Graph *g = &graph[p_type];
  528. ERR_FAIL_COND(!g->nodes.has(p_id));
  529. if (g->nodes[p_id].node->get_class_name() == p_new_class) {
  530. return;
  531. }
  532. VisualShaderNode *vsn = Object::cast_to<VisualShaderNode>(ClassDB::instantiate(p_new_class));
  533. vsn->connect("changed", callable_mp(this, &VisualShader::_queue_update));
  534. g->nodes[p_id].node = Ref<VisualShaderNode>(vsn);
  535. _queue_update();
  536. }
  537. bool VisualShader::is_node_connection(Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) const {
  538. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, false);
  539. const Graph *g = &graph[p_type];
  540. for (const Connection &E : g->connections) {
  541. if (E.from_node == p_from_node && E.from_port == p_from_port && E.to_node == p_to_node && E.to_port == p_to_port) {
  542. return true;
  543. }
  544. }
  545. return false;
  546. }
  547. bool VisualShader::is_nodes_connected_relatively(const Graph *p_graph, int p_node, int p_target) const {
  548. bool result = false;
  549. const VisualShader::Node &node = p_graph->nodes[p_node];
  550. for (const int &E : node.prev_connected_nodes) {
  551. if (E == p_target) {
  552. return true;
  553. }
  554. result = is_nodes_connected_relatively(p_graph, E, p_target);
  555. if (result) {
  556. break;
  557. }
  558. }
  559. return result;
  560. }
  561. bool VisualShader::can_connect_nodes(Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) const {
  562. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, false);
  563. const Graph *g = &graph[p_type];
  564. if (!g->nodes.has(p_from_node)) {
  565. return false;
  566. }
  567. if (p_from_node == p_to_node) {
  568. return false;
  569. }
  570. if (p_from_port < 0 || p_from_port >= g->nodes[p_from_node].node->get_expanded_output_port_count()) {
  571. return false;
  572. }
  573. if (!g->nodes.has(p_to_node)) {
  574. return false;
  575. }
  576. if (p_to_port < 0 || p_to_port >= g->nodes[p_to_node].node->get_input_port_count()) {
  577. return false;
  578. }
  579. VisualShaderNode::PortType from_port_type = g->nodes[p_from_node].node->get_output_port_type(p_from_port);
  580. VisualShaderNode::PortType to_port_type = g->nodes[p_to_node].node->get_input_port_type(p_to_port);
  581. if (!is_port_types_compatible(from_port_type, to_port_type)) {
  582. return false;
  583. }
  584. for (const Connection &E : g->connections) {
  585. if (E.from_node == p_from_node && E.from_port == p_from_port && E.to_node == p_to_node && E.to_port == p_to_port) {
  586. return false;
  587. }
  588. }
  589. if (is_nodes_connected_relatively(g, p_from_node, p_to_node)) {
  590. return false;
  591. }
  592. return true;
  593. }
  594. bool VisualShader::is_port_types_compatible(int p_a, int p_b) const {
  595. return MAX(0, p_a - 3) == (MAX(0, p_b - 3));
  596. }
  597. void VisualShader::connect_nodes_forced(Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) {
  598. ERR_FAIL_INDEX(p_type, TYPE_MAX);
  599. Graph *g = &graph[p_type];
  600. ERR_FAIL_COND(!g->nodes.has(p_from_node));
  601. ERR_FAIL_INDEX(p_from_port, g->nodes[p_from_node].node->get_expanded_output_port_count());
  602. ERR_FAIL_COND(!g->nodes.has(p_to_node));
  603. ERR_FAIL_INDEX(p_to_port, g->nodes[p_to_node].node->get_input_port_count());
  604. Connection c;
  605. c.from_node = p_from_node;
  606. c.from_port = p_from_port;
  607. c.to_node = p_to_node;
  608. c.to_port = p_to_port;
  609. g->connections.push_back(c);
  610. g->nodes[p_to_node].prev_connected_nodes.push_back(p_from_node);
  611. g->nodes[p_from_node].node->set_output_port_connected(p_from_port, true);
  612. g->nodes[p_to_node].node->set_input_port_connected(p_to_port, true);
  613. _queue_update();
  614. }
  615. Error VisualShader::connect_nodes(Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) {
  616. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, ERR_CANT_CONNECT);
  617. Graph *g = &graph[p_type];
  618. ERR_FAIL_COND_V(!g->nodes.has(p_from_node), ERR_INVALID_PARAMETER);
  619. ERR_FAIL_INDEX_V(p_from_port, g->nodes[p_from_node].node->get_expanded_output_port_count(), ERR_INVALID_PARAMETER);
  620. ERR_FAIL_COND_V(!g->nodes.has(p_to_node), ERR_INVALID_PARAMETER);
  621. ERR_FAIL_INDEX_V(p_to_port, g->nodes[p_to_node].node->get_input_port_count(), ERR_INVALID_PARAMETER);
  622. VisualShaderNode::PortType from_port_type = g->nodes[p_from_node].node->get_output_port_type(p_from_port);
  623. VisualShaderNode::PortType to_port_type = g->nodes[p_to_node].node->get_input_port_type(p_to_port);
  624. ERR_FAIL_COND_V_MSG(!is_port_types_compatible(from_port_type, to_port_type), ERR_INVALID_PARAMETER, "Incompatible port types (scalar/vec/bool) with transform.");
  625. for (const Connection &E : g->connections) {
  626. if (E.from_node == p_from_node && E.from_port == p_from_port && E.to_node == p_to_node && E.to_port == p_to_port) {
  627. ERR_FAIL_V(ERR_ALREADY_EXISTS);
  628. }
  629. }
  630. Connection c;
  631. c.from_node = p_from_node;
  632. c.from_port = p_from_port;
  633. c.to_node = p_to_node;
  634. c.to_port = p_to_port;
  635. g->connections.push_back(c);
  636. g->nodes[p_to_node].prev_connected_nodes.push_back(p_from_node);
  637. g->nodes[p_from_node].node->set_output_port_connected(p_from_port, true);
  638. g->nodes[p_to_node].node->set_input_port_connected(p_to_port, true);
  639. _queue_update();
  640. return OK;
  641. }
  642. void VisualShader::disconnect_nodes(Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) {
  643. ERR_FAIL_INDEX(p_type, TYPE_MAX);
  644. Graph *g = &graph[p_type];
  645. for (const List<Connection>::Element *E = g->connections.front(); E; E = E->next()) {
  646. if (E->get().from_node == p_from_node && E->get().from_port == p_from_port && E->get().to_node == p_to_node && E->get().to_port == p_to_port) {
  647. g->connections.erase(E);
  648. g->nodes[p_to_node].prev_connected_nodes.erase(p_from_node);
  649. g->nodes[p_from_node].node->set_output_port_connected(p_from_port, false);
  650. g->nodes[p_to_node].node->set_input_port_connected(p_to_port, false);
  651. _queue_update();
  652. return;
  653. }
  654. }
  655. }
  656. Array VisualShader::_get_node_connections(Type p_type) const {
  657. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, Array());
  658. const Graph *g = &graph[p_type];
  659. Array ret;
  660. for (const Connection &E : g->connections) {
  661. Dictionary d;
  662. d["from_node"] = E.from_node;
  663. d["from_port"] = E.from_port;
  664. d["to_node"] = E.to_node;
  665. d["to_port"] = E.to_port;
  666. ret.push_back(d);
  667. }
  668. return ret;
  669. }
  670. void VisualShader::get_node_connections(Type p_type, List<Connection> *r_connections) const {
  671. ERR_FAIL_INDEX(p_type, TYPE_MAX);
  672. const Graph *g = &graph[p_type];
  673. for (const Connection &E : g->connections) {
  674. r_connections->push_back(E);
  675. }
  676. }
  677. void VisualShader::set_mode(Mode p_mode) {
  678. ERR_FAIL_INDEX_MSG(p_mode, Mode::MODE_MAX, vformat("Invalid shader mode: %d.", p_mode));
  679. if (shader_mode == p_mode) {
  680. return;
  681. }
  682. //erase input/output connections
  683. modes.clear();
  684. flags.clear();
  685. shader_mode = p_mode;
  686. for (int i = 0; i < TYPE_MAX; i++) {
  687. for (Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) {
  688. Ref<VisualShaderNodeInput> input = E->get().node;
  689. if (input.is_valid()) {
  690. input->shader_mode = shader_mode;
  691. //input->input_index = 0;
  692. }
  693. }
  694. Ref<VisualShaderNodeOutput> output = graph[i].nodes[NODE_ID_OUTPUT].node;
  695. output->shader_mode = shader_mode;
  696. // clear connections since they are no longer valid
  697. for (List<Connection>::Element *E = graph[i].connections.front(); E;) {
  698. bool keep = true;
  699. List<Connection>::Element *N = E->next();
  700. int from = E->get().from_node;
  701. int to = E->get().to_node;
  702. if (!graph[i].nodes.has(from)) {
  703. keep = false;
  704. } else {
  705. Ref<VisualShaderNode> from_node = graph[i].nodes[from].node;
  706. if (from_node->is_class("VisualShaderNodeOutput") || from_node->is_class("VisualShaderNodeInput")) {
  707. keep = false;
  708. }
  709. }
  710. if (!graph[i].nodes.has(to)) {
  711. keep = false;
  712. } else {
  713. Ref<VisualShaderNode> to_node = graph[i].nodes[to].node;
  714. if (to_node->is_class("VisualShaderNodeOutput") || to_node->is_class("VisualShaderNodeInput")) {
  715. keep = false;
  716. }
  717. }
  718. if (!keep) {
  719. graph[i].connections.erase(E);
  720. }
  721. E = N;
  722. }
  723. }
  724. _queue_update();
  725. notify_property_list_changed();
  726. }
  727. void VisualShader::set_graph_offset(const Vector2 &p_offset) {
  728. graph_offset = p_offset;
  729. }
  730. Vector2 VisualShader::get_graph_offset() const {
  731. return graph_offset;
  732. }
  733. Shader::Mode VisualShader::get_mode() const {
  734. return shader_mode;
  735. }
  736. bool VisualShader::is_text_shader() const {
  737. return false;
  738. }
  739. String VisualShader::generate_preview_shader(Type p_type, int p_node, int p_port, Vector<DefaultTextureParam> &default_tex_params) const {
  740. Ref<VisualShaderNode> node = get_node(p_type, p_node);
  741. ERR_FAIL_COND_V(!node.is_valid(), String());
  742. ERR_FAIL_COND_V(p_port < 0 || p_port >= node->get_expanded_output_port_count(), String());
  743. ERR_FAIL_COND_V(node->get_output_port_type(p_port) == VisualShaderNode::PORT_TYPE_TRANSFORM, String());
  744. StringBuilder global_code;
  745. StringBuilder global_code_per_node;
  746. Map<Type, StringBuilder> global_code_per_func;
  747. StringBuilder code;
  748. Set<StringName> classes;
  749. global_code += String() + "shader_type canvas_item;\n";
  750. String global_expressions;
  751. for (int i = 0, index = 0; i < TYPE_MAX; i++) {
  752. for (Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) {
  753. Ref<VisualShaderNodeGlobalExpression> global_expression = Object::cast_to<VisualShaderNodeGlobalExpression>(E->get().node.ptr());
  754. if (global_expression.is_valid()) {
  755. String expr = "";
  756. expr += "// " + global_expression->get_caption() + ":" + itos(index++) + "\n";
  757. expr += global_expression->generate_global(get_mode(), Type(i), -1);
  758. expr = expr.replace("\n", "\n ");
  759. expr += "\n";
  760. global_expressions += expr;
  761. }
  762. }
  763. }
  764. global_code += "\n";
  765. global_code += global_expressions;
  766. //make it faster to go around through shader
  767. VMap<ConnectionKey, const List<Connection>::Element *> input_connections;
  768. VMap<ConnectionKey, const List<Connection>::Element *> output_connections;
  769. for (const List<Connection>::Element *E = graph[p_type].connections.front(); E; E = E->next()) {
  770. ConnectionKey from_key;
  771. from_key.node = E->get().from_node;
  772. from_key.port = E->get().from_port;
  773. output_connections.insert(from_key, E);
  774. ConnectionKey to_key;
  775. to_key.node = E->get().to_node;
  776. to_key.port = E->get().to_port;
  777. input_connections.insert(to_key, E);
  778. }
  779. code += "\nvoid fragment() {\n";
  780. Set<int> processed;
  781. Error err = _write_node(p_type, global_code, global_code_per_node, global_code_per_func, code, default_tex_params, input_connections, output_connections, p_node, processed, true, classes);
  782. ERR_FAIL_COND_V(err != OK, String());
  783. if (node->get_output_port_type(p_port) == VisualShaderNode::PORT_TYPE_SCALAR) {
  784. code += " COLOR.rgb = vec3(n_out" + itos(p_node) + "p" + itos(p_port) + " );\n";
  785. } else if (node->get_output_port_type(p_port) == VisualShaderNode::PORT_TYPE_SCALAR_INT) {
  786. code += " COLOR.rgb = vec3(float(n_out" + itos(p_node) + "p" + itos(p_port) + "));\n";
  787. } else if (node->get_output_port_type(p_port) == VisualShaderNode::PORT_TYPE_BOOLEAN) {
  788. code += " COLOR.rgb = vec3(n_out" + itos(p_node) + "p" + itos(p_port) + " ? 1.0 : 0.0);\n";
  789. } else {
  790. code += " COLOR.rgb = n_out" + itos(p_node) + "p" + itos(p_port) + ";\n";
  791. }
  792. code += "}\n";
  793. //set code secretly
  794. global_code += "\n\n";
  795. String final_code = global_code;
  796. final_code += global_code_per_node;
  797. final_code += code;
  798. return final_code;
  799. }
  800. #define IS_INITIAL_CHAR(m_d) (((m_d) >= 'a' && (m_d) <= 'z') || ((m_d) >= 'A' && (m_d) <= 'Z'))
  801. #define IS_SYMBOL_CHAR(m_d) (((m_d) >= 'a' && (m_d) <= 'z') || ((m_d) >= 'A' && (m_d) <= 'Z') || ((m_d) >= '0' && (m_d) <= '9') || (m_d) == '_')
  802. String VisualShader::validate_port_name(const String &p_port_name, VisualShaderNode *p_node, int p_port_id, bool p_output) const {
  803. String name = p_port_name;
  804. if (name == String()) {
  805. return String();
  806. }
  807. while (name.length() && !IS_INITIAL_CHAR(name[0])) {
  808. name = name.substr(1, name.length() - 1);
  809. }
  810. if (name != String()) {
  811. String valid_name;
  812. for (int i = 0; i < name.length(); i++) {
  813. if (IS_SYMBOL_CHAR(name[i])) {
  814. valid_name += String::chr(name[i]);
  815. } else if (name[i] == ' ') {
  816. valid_name += "_";
  817. }
  818. }
  819. name = valid_name;
  820. } else {
  821. return String();
  822. }
  823. List<String> input_names;
  824. List<String> output_names;
  825. for (int i = 0; i < p_node->get_input_port_count(); i++) {
  826. if (!p_output && i == p_port_id) {
  827. continue;
  828. }
  829. if (name == p_node->get_input_port_name(i)) {
  830. return String();
  831. }
  832. }
  833. for (int i = 0; i < p_node->get_output_port_count(); i++) {
  834. if (p_output && i == p_port_id) {
  835. continue;
  836. }
  837. if (name == p_node->get_output_port_name(i)) {
  838. return String();
  839. }
  840. }
  841. return name;
  842. }
  843. String VisualShader::validate_uniform_name(const String &p_name, const Ref<VisualShaderNodeUniform> &p_uniform) const {
  844. String name = p_name; //validate name first
  845. while (name.length() && !IS_INITIAL_CHAR(name[0])) {
  846. name = name.substr(1, name.length() - 1);
  847. }
  848. if (name != String()) {
  849. String valid_name;
  850. for (int i = 0; i < name.length(); i++) {
  851. if (IS_SYMBOL_CHAR(name[i])) {
  852. valid_name += String::chr(name[i]);
  853. } else if (name[i] == ' ') {
  854. valid_name += "_";
  855. }
  856. }
  857. name = valid_name;
  858. }
  859. if (name == String()) {
  860. name = p_uniform->get_caption();
  861. }
  862. int attempt = 1;
  863. while (true) {
  864. bool exists = false;
  865. for (int i = 0; i < TYPE_MAX; i++) {
  866. for (const Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) {
  867. Ref<VisualShaderNodeUniform> node = E->get().node;
  868. if (node == p_uniform) { //do not test on self
  869. continue;
  870. }
  871. if (node.is_valid() && node->get_uniform_name() == name) {
  872. exists = true;
  873. break;
  874. }
  875. }
  876. if (exists) {
  877. break;
  878. }
  879. }
  880. if (exists) {
  881. //remove numbers, put new and try again
  882. attempt++;
  883. while (name.length() && name[name.length() - 1] >= '0' && name[name.length() - 1] <= '9') {
  884. name = name.substr(0, name.length() - 1);
  885. }
  886. ERR_FAIL_COND_V(name == String(), String());
  887. name += itos(attempt);
  888. } else {
  889. break;
  890. }
  891. }
  892. return name;
  893. }
  894. VisualShader::RenderModeEnums VisualShader::render_mode_enums[] = {
  895. { Shader::MODE_SPATIAL, "blend" },
  896. { Shader::MODE_SPATIAL, "depth_draw" },
  897. { Shader::MODE_SPATIAL, "cull" },
  898. { Shader::MODE_SPATIAL, "diffuse" },
  899. { Shader::MODE_SPATIAL, "specular" },
  900. { Shader::MODE_CANVAS_ITEM, "blend" },
  901. { Shader::MODE_CANVAS_ITEM, nullptr }
  902. };
  903. static const char *type_string[VisualShader::TYPE_MAX] = {
  904. "vertex",
  905. "fragment",
  906. "light",
  907. "start",
  908. "process",
  909. "collide",
  910. "start_custom",
  911. "process_custom",
  912. "sky",
  913. };
  914. bool VisualShader::_set(const StringName &p_name, const Variant &p_value) {
  915. String name = p_name;
  916. if (name == "mode") {
  917. set_mode(Shader::Mode(int(p_value)));
  918. return true;
  919. } else if (name.begins_with("flags/")) {
  920. StringName flag = name.get_slicec('/', 1);
  921. bool enable = p_value;
  922. if (enable) {
  923. flags.insert(flag);
  924. } else {
  925. flags.erase(flag);
  926. }
  927. _queue_update();
  928. return true;
  929. } else if (name.begins_with("modes/")) {
  930. String mode = name.get_slicec('/', 1);
  931. int value = p_value;
  932. if (value == 0) {
  933. modes.erase(mode); //means it's default anyway, so don't store it
  934. } else {
  935. modes[mode] = value;
  936. }
  937. _queue_update();
  938. return true;
  939. } else if (name.begins_with("nodes/")) {
  940. String typestr = name.get_slicec('/', 1);
  941. Type type = TYPE_VERTEX;
  942. for (int i = 0; i < TYPE_MAX; i++) {
  943. if (typestr == type_string[i]) {
  944. type = Type(i);
  945. break;
  946. }
  947. }
  948. String index = name.get_slicec('/', 2);
  949. if (index == "connections") {
  950. Vector<int> conns = p_value;
  951. if (conns.size() % 4 == 0) {
  952. for (int i = 0; i < conns.size(); i += 4) {
  953. connect_nodes_forced(type, conns[i + 0], conns[i + 1], conns[i + 2], conns[i + 3]);
  954. }
  955. }
  956. return true;
  957. }
  958. int id = index.to_int();
  959. String what = name.get_slicec('/', 3);
  960. if (what == "node") {
  961. add_node(type, p_value, Vector2(), id);
  962. return true;
  963. } else if (what == "position") {
  964. set_node_position(type, id, p_value);
  965. return true;
  966. } else if (what == "size") {
  967. ((VisualShaderNodeResizableBase *)get_node(type, id).ptr())->set_size(p_value);
  968. return true;
  969. } else if (what == "input_ports") {
  970. ((VisualShaderNodeGroupBase *)get_node(type, id).ptr())->set_inputs(p_value);
  971. return true;
  972. } else if (what == "output_ports") {
  973. ((VisualShaderNodeGroupBase *)get_node(type, id).ptr())->set_outputs(p_value);
  974. return true;
  975. } else if (what == "expression") {
  976. ((VisualShaderNodeExpression *)get_node(type, id).ptr())->set_expression(p_value);
  977. return true;
  978. }
  979. }
  980. return false;
  981. }
  982. bool VisualShader::_get(const StringName &p_name, Variant &r_ret) const {
  983. String name = p_name;
  984. if (name == "mode") {
  985. r_ret = get_mode();
  986. return true;
  987. } else if (name.begins_with("flags/")) {
  988. StringName flag = name.get_slicec('/', 1);
  989. r_ret = flags.has(flag);
  990. return true;
  991. } else if (name.begins_with("modes/")) {
  992. String mode = name.get_slicec('/', 1);
  993. if (modes.has(mode)) {
  994. r_ret = modes[mode];
  995. } else {
  996. r_ret = 0;
  997. }
  998. return true;
  999. } else if (name.begins_with("nodes/")) {
  1000. String typestr = name.get_slicec('/', 1);
  1001. Type type = TYPE_VERTEX;
  1002. for (int i = 0; i < TYPE_MAX; i++) {
  1003. if (typestr == type_string[i]) {
  1004. type = Type(i);
  1005. break;
  1006. }
  1007. }
  1008. String index = name.get_slicec('/', 2);
  1009. if (index == "connections") {
  1010. Vector<int> conns;
  1011. for (const Connection &E : graph[type].connections) {
  1012. conns.push_back(E.from_node);
  1013. conns.push_back(E.from_port);
  1014. conns.push_back(E.to_node);
  1015. conns.push_back(E.to_port);
  1016. }
  1017. r_ret = conns;
  1018. return true;
  1019. }
  1020. int id = index.to_int();
  1021. String what = name.get_slicec('/', 3);
  1022. if (what == "node") {
  1023. r_ret = get_node(type, id);
  1024. return true;
  1025. } else if (what == "position") {
  1026. r_ret = get_node_position(type, id);
  1027. return true;
  1028. } else if (what == "size") {
  1029. r_ret = ((VisualShaderNodeResizableBase *)get_node(type, id).ptr())->get_size();
  1030. return true;
  1031. } else if (what == "input_ports") {
  1032. r_ret = ((VisualShaderNodeGroupBase *)get_node(type, id).ptr())->get_inputs();
  1033. return true;
  1034. } else if (what == "output_ports") {
  1035. r_ret = ((VisualShaderNodeGroupBase *)get_node(type, id).ptr())->get_outputs();
  1036. return true;
  1037. } else if (what == "expression") {
  1038. r_ret = ((VisualShaderNodeExpression *)get_node(type, id).ptr())->get_expression();
  1039. return true;
  1040. }
  1041. }
  1042. return false;
  1043. }
  1044. void VisualShader::reset_state() {
  1045. #ifndef _MSC_VER
  1046. #warning everything needs to be cleared here
  1047. #endif
  1048. emit_changed();
  1049. }
  1050. void VisualShader::_get_property_list(List<PropertyInfo> *p_list) const {
  1051. //mode
  1052. p_list->push_back(PropertyInfo(Variant::INT, "mode", PROPERTY_HINT_ENUM, "Node3D,CanvasItem,Particles,Sky"));
  1053. //render modes
  1054. Map<String, String> blend_mode_enums;
  1055. Set<String> toggles;
  1056. for (int i = 0; i < ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader_mode)).size(); i++) {
  1057. String mode = ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader_mode))[i];
  1058. int idx = 0;
  1059. bool in_enum = false;
  1060. while (render_mode_enums[idx].string) {
  1061. if (mode.begins_with(render_mode_enums[idx].string)) {
  1062. String begin = render_mode_enums[idx].string;
  1063. String option = mode.replace_first(begin + "_", "");
  1064. if (!blend_mode_enums.has(begin)) {
  1065. blend_mode_enums[begin] = option;
  1066. } else {
  1067. blend_mode_enums[begin] += "," + option;
  1068. }
  1069. in_enum = true;
  1070. break;
  1071. }
  1072. idx++;
  1073. }
  1074. if (!in_enum) {
  1075. toggles.insert(mode);
  1076. }
  1077. }
  1078. for (Map<String, String>::Element *E = blend_mode_enums.front(); E; E = E->next()) {
  1079. p_list->push_back(PropertyInfo(Variant::INT, "modes/" + E->key(), PROPERTY_HINT_ENUM, E->get()));
  1080. }
  1081. for (Set<String>::Element *E = toggles.front(); E; E = E->next()) {
  1082. p_list->push_back(PropertyInfo(Variant::BOOL, "flags/" + E->get()));
  1083. }
  1084. for (int i = 0; i < TYPE_MAX; i++) {
  1085. for (Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) {
  1086. String prop_name = "nodes/";
  1087. prop_name += type_string[i];
  1088. prop_name += "/" + itos(E->key());
  1089. if (E->key() != NODE_ID_OUTPUT) {
  1090. p_list->push_back(PropertyInfo(Variant::OBJECT, prop_name + "/node", PROPERTY_HINT_RESOURCE_TYPE, "VisualShaderNode", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_DO_NOT_SHARE_ON_DUPLICATE));
  1091. }
  1092. p_list->push_back(PropertyInfo(Variant::VECTOR2, prop_name + "/position", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR));
  1093. if (Object::cast_to<VisualShaderNodeGroupBase>(E->get().node.ptr()) != nullptr) {
  1094. p_list->push_back(PropertyInfo(Variant::VECTOR2, prop_name + "/size", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR));
  1095. p_list->push_back(PropertyInfo(Variant::STRING, prop_name + "/input_ports", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR));
  1096. p_list->push_back(PropertyInfo(Variant::STRING, prop_name + "/output_ports", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR));
  1097. }
  1098. if (Object::cast_to<VisualShaderNodeExpression>(E->get().node.ptr()) != nullptr) {
  1099. p_list->push_back(PropertyInfo(Variant::STRING, prop_name + "/expression", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR));
  1100. }
  1101. }
  1102. p_list->push_back(PropertyInfo(Variant::PACKED_INT32_ARRAY, "nodes/" + String(type_string[i]) + "/connections", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR));
  1103. }
  1104. }
  1105. Error VisualShader::_write_node(Type type, StringBuilder &global_code, StringBuilder &global_code_per_node, Map<Type, StringBuilder> &global_code_per_func, StringBuilder &code, Vector<VisualShader::DefaultTextureParam> &def_tex_params, const VMap<ConnectionKey, const List<Connection>::Element *> &input_connections, const VMap<ConnectionKey, const List<Connection>::Element *> &output_connections, int node, Set<int> &processed, bool for_preview, Set<StringName> &r_classes) const {
  1106. const Ref<VisualShaderNode> vsnode = graph[type].nodes[node].node;
  1107. if (vsnode->is_disabled()) {
  1108. code += "// " + vsnode->get_caption() + ":" + itos(node) + "\n";
  1109. code += " // Node is disabled and code is not generated.\n";
  1110. return OK;
  1111. }
  1112. //check inputs recursively first
  1113. int input_count = vsnode->get_input_port_count();
  1114. for (int i = 0; i < input_count; i++) {
  1115. ConnectionKey ck;
  1116. ck.node = node;
  1117. ck.port = i;
  1118. if (input_connections.has(ck)) {
  1119. int from_node = input_connections[ck]->get().from_node;
  1120. if (processed.has(from_node)) {
  1121. continue;
  1122. }
  1123. Error err = _write_node(type, global_code, global_code_per_node, global_code_per_func, code, def_tex_params, input_connections, output_connections, from_node, processed, for_preview, r_classes);
  1124. if (err) {
  1125. return err;
  1126. }
  1127. }
  1128. }
  1129. // then this node
  1130. Vector<VisualShader::DefaultTextureParam> params = vsnode->get_default_texture_parameters(type, node);
  1131. for (int i = 0; i < params.size(); i++) {
  1132. def_tex_params.push_back(params[i]);
  1133. }
  1134. Ref<VisualShaderNodeInput> input = vsnode;
  1135. bool skip_global = input.is_valid() && for_preview;
  1136. if (!skip_global) {
  1137. Ref<VisualShaderNodeUniform> uniform = vsnode;
  1138. if (!uniform.is_valid() || !uniform->is_global_code_generated()) {
  1139. global_code += vsnode->generate_global(get_mode(), type, node);
  1140. }
  1141. String class_name = vsnode->get_class_name();
  1142. if (class_name == "VisualShaderNodeCustom") {
  1143. class_name = vsnode->get_script_instance()->get_script()->get_path();
  1144. }
  1145. if (!r_classes.has(class_name)) {
  1146. global_code_per_node += vsnode->generate_global_per_node(get_mode(), type, node);
  1147. for (int i = 0; i < TYPE_MAX; i++) {
  1148. global_code_per_func[Type(i)] += vsnode->generate_global_per_func(get_mode(), Type(i), node);
  1149. }
  1150. r_classes.insert(class_name);
  1151. }
  1152. }
  1153. if (!vsnode->is_code_generated()) { // just generate globals and ignore locals
  1154. processed.insert(node);
  1155. return OK;
  1156. }
  1157. String node_name = "// " + vsnode->get_caption() + ":" + itos(node) + "\n";
  1158. String node_code;
  1159. Vector<String> input_vars;
  1160. input_vars.resize(vsnode->get_input_port_count());
  1161. String *inputs = input_vars.ptrw();
  1162. for (int i = 0; i < input_count; i++) {
  1163. ConnectionKey ck;
  1164. ck.node = node;
  1165. ck.port = i;
  1166. if (input_connections.has(ck)) {
  1167. //connected to something, use that output
  1168. int from_node = input_connections[ck]->get().from_node;
  1169. if (graph[type].nodes[from_node].node->is_disabled()) {
  1170. continue;
  1171. }
  1172. int from_port = input_connections[ck]->get().from_port;
  1173. VisualShaderNode::PortType in_type = vsnode->get_input_port_type(i);
  1174. VisualShaderNode::PortType out_type = graph[type].nodes[from_node].node->get_output_port_type(from_port);
  1175. String src_var = "n_out" + itos(from_node) + "p" + itos(from_port);
  1176. if (in_type == VisualShaderNode::PORT_TYPE_SAMPLER && out_type == VisualShaderNode::PORT_TYPE_SAMPLER) {
  1177. VisualShaderNode *ptr = const_cast<VisualShaderNode *>(graph[type].nodes[from_node].node.ptr());
  1178. if (ptr->has_method("get_input_real_name")) {
  1179. inputs[i] = ptr->call("get_input_real_name");
  1180. } else if (ptr->has_method("get_uniform_name")) {
  1181. inputs[i] = ptr->call("get_uniform_name");
  1182. } else {
  1183. inputs[i] = "";
  1184. }
  1185. } else if (in_type == out_type) {
  1186. inputs[i] = src_var;
  1187. } else if (in_type == VisualShaderNode::PORT_TYPE_SCALAR && out_type == VisualShaderNode::PORT_TYPE_VECTOR) {
  1188. inputs[i] = "dot(" + src_var + ", vec3(0.333333, 0.333333, 0.333333))";
  1189. } else if (in_type == VisualShaderNode::PORT_TYPE_SCALAR_INT && out_type == VisualShaderNode::PORT_TYPE_VECTOR) {
  1190. inputs[i] = "dot(float(" + src_var + "), vec3(0.333333, 0.333333, 0.333333))";
  1191. } else if (in_type == VisualShaderNode::PORT_TYPE_VECTOR && out_type == VisualShaderNode::PORT_TYPE_SCALAR) {
  1192. inputs[i] = "vec3(" + src_var + ")";
  1193. } else if (in_type == VisualShaderNode::PORT_TYPE_VECTOR && out_type == VisualShaderNode::PORT_TYPE_SCALAR_INT) {
  1194. inputs[i] = "vec3(float(" + src_var + "))";
  1195. } else if (in_type == VisualShaderNode::PORT_TYPE_BOOLEAN && out_type == VisualShaderNode::PORT_TYPE_VECTOR) {
  1196. inputs[i] = "all(bvec3(" + src_var + "))";
  1197. } else if (in_type == VisualShaderNode::PORT_TYPE_BOOLEAN && out_type == VisualShaderNode::PORT_TYPE_SCALAR) {
  1198. inputs[i] = src_var + " > 0.0 ? true : false";
  1199. } else if (in_type == VisualShaderNode::PORT_TYPE_BOOLEAN && out_type == VisualShaderNode::PORT_TYPE_SCALAR_INT) {
  1200. inputs[i] = src_var + " > 0 ? true : false";
  1201. } else if (in_type == VisualShaderNode::PORT_TYPE_SCALAR && out_type == VisualShaderNode::PORT_TYPE_BOOLEAN) {
  1202. inputs[i] = "(" + src_var + " ? 1.0 : 0.0)";
  1203. } else if (in_type == VisualShaderNode::PORT_TYPE_SCALAR_INT && out_type == VisualShaderNode::PORT_TYPE_BOOLEAN) {
  1204. inputs[i] = "(" + src_var + " ? 1 : 0)";
  1205. } else if (in_type == VisualShaderNode::PORT_TYPE_VECTOR && out_type == VisualShaderNode::PORT_TYPE_BOOLEAN) {
  1206. inputs[i] = "vec3(" + src_var + " ? 1.0 : 0.0)";
  1207. } else if (in_type == VisualShaderNode::PORT_TYPE_SCALAR && out_type == VisualShaderNode::PORT_TYPE_SCALAR_INT) {
  1208. inputs[i] = "float(" + src_var + ")";
  1209. } else if (in_type == VisualShaderNode::PORT_TYPE_SCALAR_INT && out_type == VisualShaderNode::PORT_TYPE_SCALAR) {
  1210. inputs[i] = "int(" + src_var + ")";
  1211. }
  1212. } else {
  1213. if (!vsnode->is_generate_input_var(i)) {
  1214. continue;
  1215. }
  1216. Variant defval = vsnode->get_input_port_default_value(i);
  1217. if (defval.get_type() == Variant::FLOAT) {
  1218. float val = defval;
  1219. inputs[i] = "n_in" + itos(node) + "p" + itos(i);
  1220. node_code += " float " + inputs[i] + " = " + vformat("%.5f", val) + ";\n";
  1221. } else if (defval.get_type() == Variant::INT) {
  1222. int val = defval;
  1223. inputs[i] = "n_in" + itos(node) + "p" + itos(i);
  1224. node_code += " int " + inputs[i] + " = " + itos(val) + ";\n";
  1225. } else if (defval.get_type() == Variant::BOOL) {
  1226. bool val = defval;
  1227. inputs[i] = "n_in" + itos(node) + "p" + itos(i);
  1228. node_code += " bool " + inputs[i] + " = " + (val ? "true" : "false") + ";\n";
  1229. } else if (defval.get_type() == Variant::VECTOR3) {
  1230. Vector3 val = defval;
  1231. inputs[i] = "n_in" + itos(node) + "p" + itos(i);
  1232. node_code += " vec3 " + inputs[i] + " = " + vformat("vec3(%.5f, %.5f, %.5f);\n", val.x, val.y, val.z);
  1233. } else if (defval.get_type() == Variant::TRANSFORM3D) {
  1234. Transform3D val = defval;
  1235. val.basis.transpose();
  1236. inputs[i] = "n_in" + itos(node) + "p" + itos(i);
  1237. Array values;
  1238. for (int j = 0; j < 3; j++) {
  1239. values.push_back(val.basis[j].x);
  1240. values.push_back(val.basis[j].y);
  1241. values.push_back(val.basis[j].z);
  1242. }
  1243. values.push_back(val.origin.x);
  1244. values.push_back(val.origin.y);
  1245. values.push_back(val.origin.z);
  1246. bool err = false;
  1247. node_code += " mat4 " + inputs[i] + " = " + String("mat4(vec4(%.5f, %.5f, %.5f, 0.0), vec4(%.5f, %.5f, %.5f, 0.0), vec4(%.5f, %.5f, %.5f, 0.0), vec4(%.5f, %.5f, %.5f, 1.0));\n").sprintf(values, &err);
  1248. } else {
  1249. //will go empty, node is expected to know what it is doing at this point and handle it
  1250. }
  1251. }
  1252. }
  1253. int output_count = vsnode->get_output_port_count();
  1254. int initial_output_count = output_count;
  1255. Map<int, bool> expanded_output_ports;
  1256. for (int i = 0; i < initial_output_count; i++) {
  1257. bool expanded = false;
  1258. if (vsnode->is_output_port_expandable(i) && vsnode->_is_output_port_expanded(i)) {
  1259. expanded = true;
  1260. if (vsnode->get_output_port_type(i) == VisualShaderNode::PORT_TYPE_VECTOR) {
  1261. output_count += 3;
  1262. }
  1263. }
  1264. expanded_output_ports.insert(i, expanded);
  1265. }
  1266. Vector<String> output_vars;
  1267. output_vars.resize(output_count);
  1268. String *outputs = output_vars.ptrw();
  1269. if (vsnode->is_simple_decl()) { // less code to generate for some simple_decl nodes
  1270. for (int i = 0, j = 0; i < initial_output_count; i++, j++) {
  1271. String var_name = "n_out" + itos(node) + "p" + itos(j);
  1272. switch (vsnode->get_output_port_type(i)) {
  1273. case VisualShaderNode::PORT_TYPE_SCALAR:
  1274. outputs[i] = "float " + var_name;
  1275. break;
  1276. case VisualShaderNode::PORT_TYPE_SCALAR_INT:
  1277. outputs[i] = "int " + var_name;
  1278. break;
  1279. case VisualShaderNode::PORT_TYPE_VECTOR:
  1280. outputs[i] = "vec3 " + var_name;
  1281. break;
  1282. case VisualShaderNode::PORT_TYPE_BOOLEAN:
  1283. outputs[i] = "bool " + var_name;
  1284. break;
  1285. case VisualShaderNode::PORT_TYPE_TRANSFORM:
  1286. outputs[i] = "mat4 " + var_name;
  1287. break;
  1288. default: {
  1289. }
  1290. }
  1291. if (expanded_output_ports[i]) {
  1292. if (vsnode->get_output_port_type(i) == VisualShaderNode::PORT_TYPE_VECTOR) {
  1293. j += 3;
  1294. }
  1295. }
  1296. }
  1297. } else {
  1298. for (int i = 0, j = 0; i < initial_output_count; i++, j++) {
  1299. outputs[i] = "n_out" + itos(node) + "p" + itos(j);
  1300. switch (vsnode->get_output_port_type(i)) {
  1301. case VisualShaderNode::PORT_TYPE_SCALAR:
  1302. code += " float " + outputs[i] + ";\n";
  1303. break;
  1304. case VisualShaderNode::PORT_TYPE_SCALAR_INT:
  1305. code += " int " + outputs[i] + ";\n";
  1306. break;
  1307. case VisualShaderNode::PORT_TYPE_VECTOR:
  1308. code += " vec3 " + outputs[i] + ";\n";
  1309. break;
  1310. case VisualShaderNode::PORT_TYPE_BOOLEAN:
  1311. code += " bool " + outputs[i] + ";\n";
  1312. break;
  1313. case VisualShaderNode::PORT_TYPE_TRANSFORM:
  1314. code += " mat4 " + outputs[i] + ";\n";
  1315. break;
  1316. default: {
  1317. }
  1318. }
  1319. if (expanded_output_ports[i]) {
  1320. if (vsnode->get_output_port_type(i) == VisualShaderNode::PORT_TYPE_VECTOR) {
  1321. j += 3;
  1322. }
  1323. }
  1324. }
  1325. }
  1326. node_code += vsnode->generate_code(get_mode(), type, node, inputs, outputs, for_preview);
  1327. if (node_code != String()) {
  1328. code += node_name;
  1329. code += node_code;
  1330. code += "\n";
  1331. }
  1332. for (int i = 0; i < output_count; i++) {
  1333. bool new_line_inserted = false;
  1334. if (expanded_output_ports[i]) {
  1335. if (vsnode->get_output_port_type(i) == VisualShaderNode::PORT_TYPE_VECTOR) {
  1336. if (vsnode->is_output_port_connected(i + 1) || (for_preview && vsnode->get_output_port_for_preview() == (i + 1))) { // red-component
  1337. if (!new_line_inserted) {
  1338. code += "\n";
  1339. new_line_inserted = true;
  1340. }
  1341. String r = "n_out" + itos(node) + "p" + itos(i + 1);
  1342. code += " float " + r + " = n_out" + itos(node) + "p" + itos(i) + ".r;\n";
  1343. outputs[i + 1] = r;
  1344. }
  1345. if (vsnode->is_output_port_connected(i + 2) || (for_preview && vsnode->get_output_port_for_preview() == (i + 2))) { // green-component
  1346. if (!new_line_inserted) {
  1347. code += "\n";
  1348. new_line_inserted = true;
  1349. }
  1350. String g = "n_out" + itos(node) + "p" + itos(i + 2);
  1351. code += " float " + g + " = n_out" + itos(node) + "p" + itos(i) + ".g;\n";
  1352. outputs[i + 2] = g;
  1353. }
  1354. if (vsnode->is_output_port_connected(i + 3) || (for_preview && vsnode->get_output_port_for_preview() == (i + 3))) { // blue-component
  1355. if (!new_line_inserted) {
  1356. code += "\n";
  1357. new_line_inserted = true;
  1358. }
  1359. String b = "n_out" + itos(node) + "p" + itos(i + 3);
  1360. code += " float " + b + " = n_out" + itos(node) + "p" + itos(i) + ".b;\n";
  1361. outputs[i + 3] = b;
  1362. }
  1363. i += 3;
  1364. }
  1365. }
  1366. }
  1367. code += "\n"; //
  1368. processed.insert(node);
  1369. return OK;
  1370. }
  1371. bool VisualShader::has_func_name(RenderingServer::ShaderMode p_mode, const String &p_func_name) const {
  1372. if (!ShaderTypes::get_singleton()->get_functions(p_mode).has(p_func_name)) {
  1373. if (p_mode == RenderingServer::ShaderMode::SHADER_PARTICLES) {
  1374. if (p_func_name == "start_custom" || p_func_name == "process_custom" || p_func_name == "collide") {
  1375. return true;
  1376. }
  1377. }
  1378. return false;
  1379. }
  1380. return true;
  1381. }
  1382. void VisualShader::_update_shader() const {
  1383. if (!dirty.is_set()) {
  1384. return;
  1385. }
  1386. dirty.clear();
  1387. StringBuilder global_code;
  1388. StringBuilder global_code_per_node;
  1389. Map<Type, StringBuilder> global_code_per_func;
  1390. StringBuilder code;
  1391. Vector<VisualShader::DefaultTextureParam> default_tex_params;
  1392. Set<StringName> classes;
  1393. Map<int, int> insertion_pos;
  1394. static const char *shader_mode_str[Shader::MODE_MAX] = { "spatial", "canvas_item", "particles", "sky" };
  1395. global_code += String() + "shader_type " + shader_mode_str[shader_mode] + ";\n";
  1396. String render_mode;
  1397. {
  1398. //fill render mode enums
  1399. int idx = 0;
  1400. while (render_mode_enums[idx].string) {
  1401. if (shader_mode == render_mode_enums[idx].mode) {
  1402. if (modes.has(render_mode_enums[idx].string)) {
  1403. int which = modes[render_mode_enums[idx].string];
  1404. int count = 0;
  1405. for (int i = 0; i < ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader_mode)).size(); i++) {
  1406. String mode = ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader_mode))[i];
  1407. if (mode.begins_with(render_mode_enums[idx].string)) {
  1408. if (count == which) {
  1409. if (render_mode != String()) {
  1410. render_mode += ", ";
  1411. }
  1412. render_mode += mode;
  1413. break;
  1414. }
  1415. count++;
  1416. }
  1417. }
  1418. }
  1419. }
  1420. idx++;
  1421. }
  1422. //fill render mode flags
  1423. for (int i = 0; i < ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader_mode)).size(); i++) {
  1424. String mode = ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader_mode))[i];
  1425. if (flags.has(mode)) {
  1426. if (render_mode != String()) {
  1427. render_mode += ", ";
  1428. }
  1429. render_mode += mode;
  1430. }
  1431. }
  1432. }
  1433. if (render_mode != String()) {
  1434. global_code += "render_mode " + render_mode + ";\n\n";
  1435. }
  1436. static const char *func_name[TYPE_MAX] = { "vertex", "fragment", "light", "start", "process", "collide", "start_custom", "process_custom", "sky" };
  1437. String global_expressions;
  1438. Set<String> used_uniform_names;
  1439. List<VisualShaderNodeUniform *> uniforms;
  1440. Map<int, List<int>> emitters;
  1441. for (int i = 0, index = 0; i < TYPE_MAX; i++) {
  1442. if (!has_func_name(RenderingServer::ShaderMode(shader_mode), func_name[i])) {
  1443. continue;
  1444. }
  1445. for (Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) {
  1446. Ref<VisualShaderNodeGlobalExpression> global_expression = Object::cast_to<VisualShaderNodeGlobalExpression>(E->get().node.ptr());
  1447. if (global_expression.is_valid()) {
  1448. String expr = "";
  1449. expr += "// " + global_expression->get_caption() + ":" + itos(index++) + "\n";
  1450. expr += global_expression->generate_global(get_mode(), Type(i), -1);
  1451. expr = expr.replace("\n", "\n ");
  1452. expr += "\n";
  1453. global_expressions += expr;
  1454. }
  1455. Ref<VisualShaderNodeUniformRef> uniform_ref = Object::cast_to<VisualShaderNodeUniformRef>(E->get().node.ptr());
  1456. if (uniform_ref.is_valid()) {
  1457. used_uniform_names.insert(uniform_ref->get_uniform_name());
  1458. }
  1459. Ref<VisualShaderNodeUniform> uniform = Object::cast_to<VisualShaderNodeUniform>(E->get().node.ptr());
  1460. if (uniform.is_valid()) {
  1461. uniforms.push_back(uniform.ptr());
  1462. }
  1463. Ref<VisualShaderNodeParticleEmit> emit_particle = Object::cast_to<VisualShaderNodeParticleEmit>(E->get().node.ptr());
  1464. if (emit_particle.is_valid()) {
  1465. if (!emitters.has(i)) {
  1466. emitters.insert(i, List<int>());
  1467. }
  1468. for (Map<int, Node>::Element *M = graph[i].nodes.front(); M; M = M->next()) {
  1469. if (M->get().node == emit_particle.ptr()) {
  1470. emitters[i].push_back(M->key());
  1471. break;
  1472. }
  1473. }
  1474. }
  1475. }
  1476. }
  1477. for (int i = 0; i < uniforms.size(); i++) {
  1478. VisualShaderNodeUniform *uniform = uniforms[i];
  1479. if (used_uniform_names.has(uniform->get_uniform_name())) {
  1480. global_code += uniform->generate_global(get_mode(), Type(i), -1);
  1481. const_cast<VisualShaderNodeUniform *>(uniform)->set_global_code_generated(true);
  1482. } else {
  1483. const_cast<VisualShaderNodeUniform *>(uniform)->set_global_code_generated(false);
  1484. }
  1485. }
  1486. Map<int, String> code_map;
  1487. Set<int> empty_funcs;
  1488. for (int i = 0; i < TYPE_MAX; i++) {
  1489. if (!has_func_name(RenderingServer::ShaderMode(shader_mode), func_name[i])) {
  1490. continue;
  1491. }
  1492. //make it faster to go around through shader
  1493. VMap<ConnectionKey, const List<Connection>::Element *> input_connections;
  1494. VMap<ConnectionKey, const List<Connection>::Element *> output_connections;
  1495. StringBuilder func_code;
  1496. bool is_empty_func = false;
  1497. if (shader_mode != Shader::MODE_PARTICLES && shader_mode != Shader::MODE_SKY) {
  1498. is_empty_func = true;
  1499. }
  1500. for (const List<Connection>::Element *E = graph[i].connections.front(); E; E = E->next()) {
  1501. ConnectionKey from_key;
  1502. from_key.node = E->get().from_node;
  1503. from_key.port = E->get().from_port;
  1504. output_connections.insert(from_key, E);
  1505. ConnectionKey to_key;
  1506. to_key.node = E->get().to_node;
  1507. to_key.port = E->get().to_port;
  1508. input_connections.insert(to_key, E);
  1509. if (is_empty_func && to_key.node == NODE_ID_OUTPUT) {
  1510. is_empty_func = false;
  1511. }
  1512. }
  1513. if (is_empty_func) {
  1514. empty_funcs.insert(i);
  1515. continue;
  1516. }
  1517. if (shader_mode != Shader::MODE_PARTICLES) {
  1518. func_code += "\nvoid " + String(func_name[i]) + "() {\n";
  1519. }
  1520. insertion_pos.insert(i, code.get_string_length() + func_code.get_string_length());
  1521. Set<int> processed;
  1522. Error err = _write_node(Type(i), global_code, global_code_per_node, global_code_per_func, func_code, default_tex_params, input_connections, output_connections, NODE_ID_OUTPUT, processed, false, classes);
  1523. ERR_FAIL_COND(err != OK);
  1524. if (emitters.has(i)) {
  1525. for (int &E : emitters[i]) {
  1526. err = _write_node(Type(i), global_code, global_code_per_node, global_code_per_func, func_code, default_tex_params, input_connections, output_connections, E, processed, false, classes);
  1527. ERR_FAIL_COND(err != OK);
  1528. }
  1529. }
  1530. if (shader_mode == Shader::MODE_PARTICLES) {
  1531. code_map.insert(i, func_code);
  1532. } else {
  1533. func_code += "}\n";
  1534. code += func_code;
  1535. }
  1536. }
  1537. String global_compute_code;
  1538. if (shader_mode == Shader::MODE_PARTICLES) {
  1539. bool has_start = !code_map[TYPE_START].is_empty();
  1540. bool has_start_custom = !code_map[TYPE_START_CUSTOM].is_empty();
  1541. bool has_process = !code_map[TYPE_PROCESS].is_empty();
  1542. bool has_process_custom = !code_map[TYPE_PROCESS_CUSTOM].is_empty();
  1543. bool has_collide = !code_map[TYPE_COLLIDE].is_empty();
  1544. code += "void start() {\n";
  1545. if (has_start || has_start_custom) {
  1546. code += " uint __seed = __hash(NUMBER + uint(1) + RANDOM_SEED);\n";
  1547. code += " vec3 __diff = TRANSFORM[3].xyz - EMISSION_TRANSFORM[3].xyz;\n";
  1548. code += " float __radians;\n";
  1549. code += " vec3 __vec3_buff1;\n";
  1550. code += " vec3 __vec3_buff2;\n";
  1551. code += " float __scalar_buff1;\n";
  1552. code += " float __scalar_buff2;\n";
  1553. code += " vec3 __ndiff = normalize(__diff);\n\n";
  1554. }
  1555. if (has_start) {
  1556. code += " {\n";
  1557. code += code_map[TYPE_START].replace("\n ", "\n ");
  1558. code += " }\n";
  1559. if (has_start_custom) {
  1560. code += " \n";
  1561. }
  1562. }
  1563. if (has_start_custom) {
  1564. code += " {\n";
  1565. code += code_map[TYPE_START_CUSTOM].replace("\n ", "\n ");
  1566. code += " }\n";
  1567. }
  1568. code += "}\n\n";
  1569. code += "void process() {\n";
  1570. if (has_process || has_process_custom || has_collide) {
  1571. code += " uint __seed = __hash(NUMBER + uint(1) + RANDOM_SEED);\n";
  1572. code += " vec3 __vec3_buff1;\n";
  1573. code += " vec3 __diff = TRANSFORM[3].xyz - EMISSION_TRANSFORM[3].xyz;\n";
  1574. code += " vec3 __ndiff = normalize(__diff);\n\n";
  1575. }
  1576. code += " {\n";
  1577. String tab = " ";
  1578. if (has_collide) {
  1579. code += " if (COLLIDED) {\n\n";
  1580. code += code_map[TYPE_COLLIDE].replace("\n ", "\n ");
  1581. if (has_process) {
  1582. code += " } else {\n\n";
  1583. tab += " ";
  1584. }
  1585. }
  1586. if (has_process) {
  1587. code += code_map[TYPE_PROCESS].replace("\n ", "\n " + tab);
  1588. }
  1589. if (has_collide) {
  1590. code += " }\n";
  1591. }
  1592. code += " }\n";
  1593. if (has_process_custom) {
  1594. code += " {\n\n";
  1595. code += code_map[TYPE_PROCESS_CUSTOM].replace("\n ", "\n ");
  1596. code += " }\n";
  1597. }
  1598. code += "}\n\n";
  1599. global_compute_code += "float __rand_from_seed(inout uint seed) {\n";
  1600. global_compute_code += " int k;\n";
  1601. global_compute_code += " int s = int(seed);\n";
  1602. global_compute_code += " if (s == 0)\n";
  1603. global_compute_code += " s = 305420679;\n";
  1604. global_compute_code += " k = s / 127773;\n";
  1605. global_compute_code += " s = 16807 * (s - k * 127773) - 2836 * k;\n";
  1606. global_compute_code += " if (s < 0)\n";
  1607. global_compute_code += " s += 2147483647;\n";
  1608. global_compute_code += " seed = uint(s);\n";
  1609. global_compute_code += " return float(seed % uint(65536)) / 65535.0;\n";
  1610. global_compute_code += "}\n\n";
  1611. global_compute_code += "float __rand_from_seed_m1_p1(inout uint seed) {\n";
  1612. global_compute_code += " return __rand_from_seed(seed) * 2.0 - 1.0;\n";
  1613. global_compute_code += "}\n\n";
  1614. global_compute_code += "float __randf_range(inout uint seed, float from, float to) {\n";
  1615. global_compute_code += " return __rand_from_seed(seed) * (to - from) + from;\n";
  1616. global_compute_code += "}\n\n";
  1617. global_compute_code += "vec3 __randv_range(inout uint seed, vec3 from, vec3 to) {\n";
  1618. global_compute_code += " return vec3(__randf_range(seed, from.x, to.x), __randf_range(seed, from.y, to.y), __randf_range(seed, from.z, to.z));\n";
  1619. global_compute_code += "}\n\n";
  1620. global_compute_code += "uint __hash(uint x) {\n";
  1621. global_compute_code += " x = ((x >> uint(16)) ^ x) * uint(73244475);\n";
  1622. global_compute_code += " x = ((x >> uint(16)) ^ x) * uint(73244475);\n";
  1623. global_compute_code += " x = (x >> uint(16)) ^ x;\n";
  1624. global_compute_code += " return x;\n";
  1625. global_compute_code += "}\n\n";
  1626. global_compute_code += "mat3 __build_rotation_mat3(vec3 axis, float angle) {\n";
  1627. global_compute_code += " axis = normalize(axis);\n";
  1628. global_compute_code += " float s = sin(angle);\n";
  1629. global_compute_code += " float c = cos(angle);\n";
  1630. global_compute_code += " float oc = 1.0 - c;\n";
  1631. global_compute_code += " return mat3(vec3(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s), vec3(oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s), vec3(oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c));\n";
  1632. global_compute_code += "}\n\n";
  1633. global_compute_code += "mat4 __build_rotation_mat4(vec3 axis, float angle) {\n";
  1634. global_compute_code += " axis = normalize(axis);\n";
  1635. global_compute_code += " float s = sin(angle);\n";
  1636. global_compute_code += " float c = cos(angle);\n";
  1637. global_compute_code += " float oc = 1.0 - c;\n";
  1638. global_compute_code += " return mat4(vec4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0), vec4(oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0), vec4(oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0), vec4(0, 0, 0, 1));\n";
  1639. global_compute_code += "}\n\n";
  1640. global_compute_code += "vec3 __get_random_unit_vec3(inout uint seed) {\n";
  1641. global_compute_code += " return normalize(vec3(__rand_from_seed_m1_p1(seed), __rand_from_seed_m1_p1(seed), __rand_from_seed_m1_p1(seed)));\n";
  1642. global_compute_code += "}\n\n";
  1643. }
  1644. //set code secretly
  1645. global_code += "\n\n";
  1646. String final_code = global_code;
  1647. final_code += global_compute_code;
  1648. final_code += global_code_per_node;
  1649. final_code += global_expressions;
  1650. String tcode = code;
  1651. for (int i = 0; i < TYPE_MAX; i++) {
  1652. if (!has_func_name(RenderingServer::ShaderMode(shader_mode), func_name[i])) {
  1653. continue;
  1654. }
  1655. String func_code = global_code_per_func[Type(i)].as_string();
  1656. if (empty_funcs.has(Type(i)) && !func_code.is_empty()) {
  1657. func_code = vformat("%s%s%s", String("\nvoid " + String(func_name[i]) + "() {\n"), func_code, "}\n");
  1658. }
  1659. tcode = tcode.insert(insertion_pos[i], func_code);
  1660. }
  1661. final_code += tcode;
  1662. const_cast<VisualShader *>(this)->set_code(final_code);
  1663. for (int i = 0; i < default_tex_params.size(); i++) {
  1664. const_cast<VisualShader *>(this)->set_default_texture_param(default_tex_params[i].name, default_tex_params[i].param);
  1665. }
  1666. if (previous_code != final_code) {
  1667. const_cast<VisualShader *>(this)->emit_signal(SNAME("changed"));
  1668. }
  1669. previous_code = final_code;
  1670. }
  1671. void VisualShader::_queue_update() {
  1672. if (dirty.is_set()) {
  1673. return;
  1674. }
  1675. dirty.set();
  1676. call_deferred(SNAME("_update_shader"));
  1677. }
  1678. void VisualShader::_input_type_changed(Type p_type, int p_id) {
  1679. ERR_FAIL_INDEX(p_type, TYPE_MAX);
  1680. //erase connections using this input, as type changed
  1681. Graph *g = &graph[p_type];
  1682. for (List<Connection>::Element *E = g->connections.front(); E;) {
  1683. List<Connection>::Element *N = E->next();
  1684. if (E->get().from_node == p_id) {
  1685. g->connections.erase(E);
  1686. g->nodes[E->get().to_node].prev_connected_nodes.erase(p_id);
  1687. }
  1688. E = N;
  1689. }
  1690. }
  1691. void VisualShader::rebuild() {
  1692. dirty.set();
  1693. _update_shader();
  1694. }
  1695. void VisualShader::_bind_methods() {
  1696. ClassDB::bind_method(D_METHOD("set_mode", "mode"), &VisualShader::set_mode);
  1697. ClassDB::bind_method(D_METHOD("add_node", "type", "node", "position", "id"), &VisualShader::add_node);
  1698. ClassDB::bind_method(D_METHOD("get_node", "type", "id"), &VisualShader::get_node);
  1699. ClassDB::bind_method(D_METHOD("set_node_position", "type", "id", "position"), &VisualShader::set_node_position);
  1700. ClassDB::bind_method(D_METHOD("get_node_position", "type", "id"), &VisualShader::get_node_position);
  1701. ClassDB::bind_method(D_METHOD("get_node_list", "type"), &VisualShader::get_node_list);
  1702. ClassDB::bind_method(D_METHOD("get_valid_node_id", "type"), &VisualShader::get_valid_node_id);
  1703. ClassDB::bind_method(D_METHOD("remove_node", "type", "id"), &VisualShader::remove_node);
  1704. ClassDB::bind_method(D_METHOD("replace_node", "type", "id", "new_class"), &VisualShader::replace_node);
  1705. ClassDB::bind_method(D_METHOD("is_node_connection", "type", "from_node", "from_port", "to_node", "to_port"), &VisualShader::is_node_connection);
  1706. ClassDB::bind_method(D_METHOD("can_connect_nodes", "type", "from_node", "from_port", "to_node", "to_port"), &VisualShader::can_connect_nodes);
  1707. ClassDB::bind_method(D_METHOD("connect_nodes", "type", "from_node", "from_port", "to_node", "to_port"), &VisualShader::connect_nodes);
  1708. ClassDB::bind_method(D_METHOD("disconnect_nodes", "type", "from_node", "from_port", "to_node", "to_port"), &VisualShader::disconnect_nodes);
  1709. ClassDB::bind_method(D_METHOD("connect_nodes_forced", "type", "from_node", "from_port", "to_node", "to_port"), &VisualShader::connect_nodes_forced);
  1710. ClassDB::bind_method(D_METHOD("get_node_connections", "type"), &VisualShader::_get_node_connections);
  1711. ClassDB::bind_method(D_METHOD("set_engine_version", "version"), &VisualShader::set_engine_version);
  1712. ClassDB::bind_method(D_METHOD("get_engine_version"), &VisualShader::get_engine_version);
  1713. ClassDB::bind_method(D_METHOD("set_graph_offset", "offset"), &VisualShader::set_graph_offset);
  1714. ClassDB::bind_method(D_METHOD("get_graph_offset"), &VisualShader::get_graph_offset);
  1715. ClassDB::bind_method(D_METHOD("_update_shader"), &VisualShader::_update_shader);
  1716. ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "graph_offset", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_graph_offset", "get_graph_offset");
  1717. ADD_PROPERTY(PropertyInfo(Variant::STRING, "engine_version", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_engine_version", "get_engine_version");
  1718. ADD_PROPERTY_DEFAULT("code", ""); // Inherited from Shader, prevents showing default code as override in docs.
  1719. BIND_ENUM_CONSTANT(TYPE_VERTEX);
  1720. BIND_ENUM_CONSTANT(TYPE_FRAGMENT);
  1721. BIND_ENUM_CONSTANT(TYPE_LIGHT);
  1722. BIND_ENUM_CONSTANT(TYPE_START);
  1723. BIND_ENUM_CONSTANT(TYPE_PROCESS);
  1724. BIND_ENUM_CONSTANT(TYPE_COLLIDE);
  1725. BIND_ENUM_CONSTANT(TYPE_START_CUSTOM);
  1726. BIND_ENUM_CONSTANT(TYPE_PROCESS_CUSTOM);
  1727. BIND_ENUM_CONSTANT(TYPE_SKY);
  1728. BIND_ENUM_CONSTANT(TYPE_MAX);
  1729. BIND_CONSTANT(NODE_ID_INVALID);
  1730. BIND_CONSTANT(NODE_ID_OUTPUT);
  1731. }
  1732. VisualShader::VisualShader() {
  1733. dirty.set();
  1734. for (int i = 0; i < TYPE_MAX; i++) {
  1735. if (i > (int)TYPE_LIGHT && i < (int)TYPE_SKY) {
  1736. Ref<VisualShaderNodeParticleOutput> output;
  1737. output.instantiate();
  1738. output->shader_type = Type(i);
  1739. output->shader_mode = shader_mode;
  1740. graph[i].nodes[NODE_ID_OUTPUT].node = output;
  1741. } else {
  1742. Ref<VisualShaderNodeOutput> output;
  1743. output.instantiate();
  1744. output->shader_type = Type(i);
  1745. output->shader_mode = shader_mode;
  1746. graph[i].nodes[NODE_ID_OUTPUT].node = output;
  1747. }
  1748. graph[i].nodes[NODE_ID_OUTPUT].position = Vector2(400, 150);
  1749. }
  1750. }
  1751. ///////////////////////////////////////////////////////////
  1752. const VisualShaderNodeInput::Port VisualShaderNodeInput::ports[] = {
  1753. // Node3D
  1754. // Node3D, Vertex
  1755. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "vertex", "VERTEX" },
  1756. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "NORMAL" },
  1757. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "tangent", "TANGENT" },
  1758. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "binormal", "BINORMAL" },
  1759. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV, 0.0)" },
  1760. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "uv2", "vec3(UV2, 0.0)" },
  1761. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  1762. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  1763. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "point_size", "POINT_SIZE" },
  1764. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR_INT, "instance_id", "INSTANCE_ID" },
  1765. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "instance_custom", "INSTANCE_CUSTOM.rgb" },
  1766. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "instance_custom_alpha", "INSTANCE_CUSTOM.a" },
  1767. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "roughness", "ROUGHNESS" },
  1768. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "world", "WORLD_MATRIX" },
  1769. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "modelview", "MODELVIEW_MATRIX" },
  1770. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "camera", "CAMERA_MATRIX" },
  1771. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "inv_camera", "INV_CAMERA_MATRIX" },
  1772. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "projection", "PROJECTION_MATRIX" },
  1773. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "inv_projection", "INV_PROJECTION_MATRIX" },
  1774. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  1775. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "viewport_size", "vec3(VIEWPORT_SIZE, 0)" },
  1776. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_BOOLEAN, "output_is_srgb", "OUTPUT_IS_SRGB" },
  1777. // Node3D, Fragment
  1778. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "fragcoord", "FRAGCOORD.xyz" },
  1779. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "vertex", "VERTEX" },
  1780. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "NORMAL" },
  1781. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "tangent", "TANGENT" },
  1782. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "binormal", "BINORMAL" },
  1783. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "view", "VIEW" },
  1784. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV, 0.0)" },
  1785. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "uv2", "vec3(UV2, 0.0)" },
  1786. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  1787. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  1788. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "point_coord", "vec3(POINT_COORD, 0.0)" },
  1789. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_uv", "vec3(SCREEN_UV, 0.0)" },
  1790. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_TRANSFORM, "world", "WORLD_MATRIX" },
  1791. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_TRANSFORM, "inv_camera", "INV_CAMERA_MATRIX" },
  1792. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_TRANSFORM, "camera", "CAMERA_MATRIX" },
  1793. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_TRANSFORM, "projection", "PROJECTION_MATRIX" },
  1794. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_TRANSFORM, "inv_projection", "INV_PROJECTION_MATRIX" },
  1795. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  1796. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "viewport_size", "vec3(VIEWPORT_SIZE, 0.0)" },
  1797. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_BOOLEAN, "output_is_srgb", "OUTPUT_IS_SRGB" },
  1798. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_BOOLEAN, "front_facing", "FRONT_FACING" },
  1799. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SAMPLER, "screen_texture", "SCREEN_TEXTURE" },
  1800. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SAMPLER, "normal_roughness_texture", "NORMAL_ROUGHNESS_TEXTURE" },
  1801. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SAMPLER, "depth_texture", "DEPTH_TEXTURE" },
  1802. // Node3D, Light
  1803. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "fragcoord", "FRAGCOORD.xyz" },
  1804. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "NORMAL" },
  1805. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV, 0.0)" },
  1806. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "uv2", "vec3(UV2, 0.0)" },
  1807. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "view", "VIEW" },
  1808. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light", "LIGHT" },
  1809. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_color", "LIGHT_COLOR" },
  1810. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "attenuation", "ATTENUATION" },
  1811. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "albedo", "ALBEDO" },
  1812. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "backlight", "BACKLIGHT" },
  1813. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "diffuse", "DIFFUSE_LIGHT" },
  1814. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "specular", "SPECULAR_LIGHT" },
  1815. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "roughness", "ROUGHNESS" },
  1816. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "metallic", "METALLIC" },
  1817. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_TRANSFORM, "world", "WORLD_MATRIX" },
  1818. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_TRANSFORM, "inv_camera", "INV_CAMERA_MATRIX" },
  1819. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_TRANSFORM, "camera", "CAMERA_MATRIX" },
  1820. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_TRANSFORM, "projection", "PROJECTION_MATRIX" },
  1821. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_TRANSFORM, "inv_projection", "INV_PROJECTION_MATRIX" },
  1822. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  1823. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "viewport_size", "vec3(VIEWPORT_SIZE, 0.0)" },
  1824. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_BOOLEAN, "output_is_srgb", "OUTPUT_IS_SRGB" },
  1825. // Canvas Item
  1826. // Canvas Item, Vertex
  1827. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "vertex", "vec3(VERTEX, 0.0)" },
  1828. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV, 0.0)" },
  1829. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  1830. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  1831. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "point_size", "POINT_SIZE" },
  1832. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "texture_pixel_size", "vec3(TEXTURE_PIXEL_SIZE, 1.0)" },
  1833. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "world", "WORLD_MATRIX" },
  1834. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "canvas", "CANVAS_MATRIX" },
  1835. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "screen", "SCREEN_MATRIX" },
  1836. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  1837. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_BOOLEAN, "at_light_pass", "AT_LIGHT_PASS" },
  1838. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "instance_custom", "INSTANCE_CUSTOM.rgb" },
  1839. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "instance_custom_alpha", "INSTANCE_CUSTOM.a" },
  1840. // Canvas Item, Fragment
  1841. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "fragcoord", "FRAGCOORD.xyz" },
  1842. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV, 0.0)" },
  1843. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  1844. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  1845. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_uv", "vec3(SCREEN_UV, 0.0)" },
  1846. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "texture_pixel_size", "vec3(TEXTURE_PIXEL_SIZE, 1.0)" },
  1847. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_pixel_size", "vec3(SCREEN_PIXEL_SIZE, 1.0)" },
  1848. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "point_coord", "vec3(POINT_COORD, 0.0)" },
  1849. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  1850. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_BOOLEAN, "at_light_pass", "AT_LIGHT_PASS" },
  1851. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SAMPLER, "texture", "TEXTURE" },
  1852. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SAMPLER, "normal_texture", "NORMAL_TEXTURE" },
  1853. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SAMPLER, "screen_texture", "SCREEN_TEXTURE" },
  1854. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "specular_shininess", "SPECULAR_SHININESS.rgb" },
  1855. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "specular_shininess_alpha", "SPECULAR_SHININESS.a" },
  1856. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SAMPLER, "specular_shininess_texture", "SPECULAR_SHININESS_TEXTURE" },
  1857. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "vertex", "vec3(VERTEX, 0.0)" },
  1858. // Canvas Item, Light
  1859. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "fragcoord", "FRAGCOORD.xyz" },
  1860. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV, 0.0)" },
  1861. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "NORMAL" },
  1862. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  1863. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  1864. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light", "LIGHT.rgb" },
  1865. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "light_alpha", "LIGHT.a" },
  1866. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_color", "LIGHT_COLOR.rgb" },
  1867. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "light_color_alpha", "LIGHT_COLOR.a" },
  1868. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_position", "LIGHT_POSITION" },
  1869. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_vertex", "LIGHT_VERTEX" },
  1870. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "shadow", "SHADOW_MODULATE.rgb" },
  1871. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "shadow_alpha", "SHADOW_MODULATE.a" },
  1872. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_uv", "vec3(SCREEN_UV, 0.0)" },
  1873. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "texture_pixel_size", "vec3(TEXTURE_PIXEL_SIZE, 1.0)" },
  1874. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "point_coord", "vec3(POINT_COORD, 0.0)" },
  1875. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  1876. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SAMPLER, "texture", "TEXTURE" },
  1877. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "specular_shininess", "SPECULAR_SHININESS.rgb" },
  1878. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "specular_shininess_alpha", "SPECULAR_SHININESS.a" },
  1879. // Particles, Start
  1880. { Shader::MODE_PARTICLES, VisualShader::TYPE_START, VisualShaderNode::PORT_TYPE_VECTOR, "attractor_force", "ATTRACTOR_FORCE" },
  1881. { Shader::MODE_PARTICLES, VisualShader::TYPE_START, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  1882. { Shader::MODE_PARTICLES, VisualShader::TYPE_START, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  1883. { Shader::MODE_PARTICLES, VisualShader::TYPE_START, VisualShaderNode::PORT_TYPE_VECTOR, "velocity", "VELOCITY" },
  1884. { Shader::MODE_PARTICLES, VisualShader::TYPE_START, VisualShaderNode::PORT_TYPE_BOOLEAN, "restart", "RESTART" },
  1885. { Shader::MODE_PARTICLES, VisualShader::TYPE_START, VisualShaderNode::PORT_TYPE_BOOLEAN, "active", "ACTIVE" },
  1886. { Shader::MODE_PARTICLES, VisualShader::TYPE_START, VisualShaderNode::PORT_TYPE_VECTOR, "custom", "CUSTOM.rgb" },
  1887. { Shader::MODE_PARTICLES, VisualShader::TYPE_START, VisualShaderNode::PORT_TYPE_SCALAR, "custom_alpha", "CUSTOM.a" },
  1888. { Shader::MODE_PARTICLES, VisualShader::TYPE_START, VisualShaderNode::PORT_TYPE_TRANSFORM, "transform", "TRANSFORM" },
  1889. { Shader::MODE_PARTICLES, VisualShader::TYPE_START, VisualShaderNode::PORT_TYPE_SCALAR, "delta", "DELTA" },
  1890. { Shader::MODE_PARTICLES, VisualShader::TYPE_START, VisualShaderNode::PORT_TYPE_SCALAR, "lifetime", "LIFETIME" },
  1891. { Shader::MODE_PARTICLES, VisualShader::TYPE_START, VisualShaderNode::PORT_TYPE_SCALAR_INT, "index", "INDEX" },
  1892. { Shader::MODE_PARTICLES, VisualShader::TYPE_START, VisualShaderNode::PORT_TYPE_TRANSFORM, "emission_transform", "EMISSION_TRANSFORM" },
  1893. { Shader::MODE_PARTICLES, VisualShader::TYPE_START, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  1894. // Particles, Start (Custom)
  1895. { Shader::MODE_PARTICLES, VisualShader::TYPE_START_CUSTOM, VisualShaderNode::PORT_TYPE_VECTOR, "attractor_force", "ATTRACTOR_FORCE" },
  1896. { Shader::MODE_PARTICLES, VisualShader::TYPE_START_CUSTOM, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  1897. { Shader::MODE_PARTICLES, VisualShader::TYPE_START_CUSTOM, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  1898. { Shader::MODE_PARTICLES, VisualShader::TYPE_START_CUSTOM, VisualShaderNode::PORT_TYPE_VECTOR, "velocity", "VELOCITY" },
  1899. { Shader::MODE_PARTICLES, VisualShader::TYPE_START_CUSTOM, VisualShaderNode::PORT_TYPE_BOOLEAN, "restart", "RESTART" },
  1900. { Shader::MODE_PARTICLES, VisualShader::TYPE_START_CUSTOM, VisualShaderNode::PORT_TYPE_BOOLEAN, "active", "ACTIVE" },
  1901. { Shader::MODE_PARTICLES, VisualShader::TYPE_START_CUSTOM, VisualShaderNode::PORT_TYPE_VECTOR, "custom", "CUSTOM.rgb" },
  1902. { Shader::MODE_PARTICLES, VisualShader::TYPE_START_CUSTOM, VisualShaderNode::PORT_TYPE_SCALAR, "custom_alpha", "CUSTOM.a" },
  1903. { Shader::MODE_PARTICLES, VisualShader::TYPE_START_CUSTOM, VisualShaderNode::PORT_TYPE_TRANSFORM, "transform", "TRANSFORM" },
  1904. { Shader::MODE_PARTICLES, VisualShader::TYPE_START_CUSTOM, VisualShaderNode::PORT_TYPE_SCALAR, "delta", "DELTA" },
  1905. { Shader::MODE_PARTICLES, VisualShader::TYPE_START_CUSTOM, VisualShaderNode::PORT_TYPE_SCALAR, "lifetime", "LIFETIME" },
  1906. { Shader::MODE_PARTICLES, VisualShader::TYPE_START_CUSTOM, VisualShaderNode::PORT_TYPE_SCALAR_INT, "index", "INDEX" },
  1907. { Shader::MODE_PARTICLES, VisualShader::TYPE_START_CUSTOM, VisualShaderNode::PORT_TYPE_TRANSFORM, "emission_transform", "EMISSION_TRANSFORM" },
  1908. { Shader::MODE_PARTICLES, VisualShader::TYPE_START_CUSTOM, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  1909. // Particles, Process
  1910. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS, VisualShaderNode::PORT_TYPE_VECTOR, "attractor_force", "ATTRACTOR_FORCE" },
  1911. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  1912. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  1913. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS, VisualShaderNode::PORT_TYPE_VECTOR, "velocity", "VELOCITY" },
  1914. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS, VisualShaderNode::PORT_TYPE_BOOLEAN, "restart", "RESTART" },
  1915. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS, VisualShaderNode::PORT_TYPE_BOOLEAN, "active", "ACTIVE" },
  1916. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS, VisualShaderNode::PORT_TYPE_VECTOR, "custom", "CUSTOM.rgb" },
  1917. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS, VisualShaderNode::PORT_TYPE_SCALAR, "custom_alpha", "CUSTOM.a" },
  1918. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS, VisualShaderNode::PORT_TYPE_TRANSFORM, "transform", "TRANSFORM" },
  1919. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS, VisualShaderNode::PORT_TYPE_SCALAR, "delta", "DELTA" },
  1920. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS, VisualShaderNode::PORT_TYPE_SCALAR, "lifetime", "LIFETIME" },
  1921. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS, VisualShaderNode::PORT_TYPE_SCALAR_INT, "index", "INDEX" },
  1922. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS, VisualShaderNode::PORT_TYPE_TRANSFORM, "emission_transform", "EMISSION_TRANSFORM" },
  1923. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  1924. // Particles, Process (Custom)
  1925. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS_CUSTOM, VisualShaderNode::PORT_TYPE_VECTOR, "attractor_force", "ATTRACTOR_FORCE" },
  1926. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS_CUSTOM, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  1927. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS_CUSTOM, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  1928. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS_CUSTOM, VisualShaderNode::PORT_TYPE_VECTOR, "velocity", "VELOCITY" },
  1929. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS_CUSTOM, VisualShaderNode::PORT_TYPE_BOOLEAN, "restart", "RESTART" },
  1930. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS_CUSTOM, VisualShaderNode::PORT_TYPE_BOOLEAN, "active", "ACTIVE" },
  1931. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS_CUSTOM, VisualShaderNode::PORT_TYPE_VECTOR, "custom", "CUSTOM.rgb" },
  1932. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS_CUSTOM, VisualShaderNode::PORT_TYPE_SCALAR, "custom_alpha", "CUSTOM.a" },
  1933. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS_CUSTOM, VisualShaderNode::PORT_TYPE_TRANSFORM, "transform", "TRANSFORM" },
  1934. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS_CUSTOM, VisualShaderNode::PORT_TYPE_SCALAR, "delta", "DELTA" },
  1935. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS_CUSTOM, VisualShaderNode::PORT_TYPE_SCALAR, "lifetime", "LIFETIME" },
  1936. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS_CUSTOM, VisualShaderNode::PORT_TYPE_SCALAR_INT, "index", "INDEX" },
  1937. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS_CUSTOM, VisualShaderNode::PORT_TYPE_TRANSFORM, "emission_transform", "EMISSION_TRANSFORM" },
  1938. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS_CUSTOM, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  1939. // Particles, Collide
  1940. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_VECTOR, "attractor_force", "ATTRACTOR_FORCE" },
  1941. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_SCALAR, "collision_depth", "COLLISION_DEPTH" },
  1942. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_VECTOR, "collision_normal", "COLLISION_NORMAL" },
  1943. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  1944. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  1945. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_VECTOR, "velocity", "VELOCITY" },
  1946. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_BOOLEAN, "restart", "RESTART" },
  1947. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_BOOLEAN, "active", "ACTIVE" },
  1948. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_VECTOR, "custom", "CUSTOM.rgb" },
  1949. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_SCALAR, "custom_alpha", "CUSTOM.a" },
  1950. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_TRANSFORM, "transform", "TRANSFORM" },
  1951. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_SCALAR, "delta", "DELTA" },
  1952. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_SCALAR, "lifetime", "LIFETIME" },
  1953. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_SCALAR_INT, "index", "INDEX" },
  1954. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_TRANSFORM, "emission_transform", "EMISSION_TRANSFORM" },
  1955. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  1956. // Sky, Sky
  1957. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_BOOLEAN, "at_cubemap_pass", "AT_CUBEMAP_PASS" },
  1958. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_BOOLEAN, "at_half_res_pass", "AT_HALF_RES_PASS" },
  1959. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_BOOLEAN, "at_quarter_res_pass", "AT_QUARTER_RES_PASS" },
  1960. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "eyedir", "EYEDIR" },
  1961. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "half_res_color", "HALF_RES_COLOR.rgb" },
  1962. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_SCALAR, "half_res_alpha", "HALF_RES_COLOR.a" },
  1963. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "light0_color", "LIGHT0_COLOR" },
  1964. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "light0_direction", "LIGHT0_DIRECTION" },
  1965. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_BOOLEAN, "light0_enabled", "LIGHT0_ENABLED" },
  1966. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_SCALAR, "light0_energy", "LIGHT0_ENERGY" },
  1967. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "light1_color", "LIGHT1_COLOR" },
  1968. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "light1_direction", "LIGHT1_DIRECTION" },
  1969. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_BOOLEAN, "light1_enabled", "LIGHT1_ENABLED" },
  1970. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_SCALAR, "light1_energy", "LIGHT1_ENERGY" },
  1971. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "light2_color", "LIGHT2_COLOR" },
  1972. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "light2_direction", "LIGHT2_DIRECTION" },
  1973. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_BOOLEAN, "light2_enabled", "LIGHT2_ENABLED" },
  1974. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_SCALAR, "light2_energy", "LIGHT2_ENERGY" },
  1975. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "light3_color", "LIGHT3_COLOR" },
  1976. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "light3_direction", "LIGHT3_DIRECTION" },
  1977. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_BOOLEAN, "light3_enabled", "LIGHT3_ENABLED" },
  1978. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_SCALAR, "light3_energy", "LIGHT3_ENERGY" },
  1979. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "position", "POSITION" },
  1980. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "quarter_res_color", "QUARTER_RES_COLOR.rgb" },
  1981. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_SCALAR, "quarter_res_alpha", "QUARTER_RES_COLOR.a" },
  1982. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_SAMPLER, "radiance", "RADIANCE" },
  1983. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "screen_uv", "vec3(SCREEN_UV, 0.0)" },
  1984. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "sky_coords", "vec3(SKY_COORDS, 0.0)" },
  1985. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  1986. { Shader::MODE_MAX, VisualShader::TYPE_MAX, VisualShaderNode::PORT_TYPE_TRANSFORM, nullptr, nullptr },
  1987. };
  1988. const VisualShaderNodeInput::Port VisualShaderNodeInput::preview_ports[] = {
  1989. // Spatial, Fragment
  1990. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "vec3(0.0, 0.0, 1.0)" },
  1991. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "tangent", "vec3(0.0, 1.0, 0.0)" },
  1992. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "binormal", "vec3(1.0, 0.0, 0.0)" },
  1993. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV, 0.0)" },
  1994. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "uv2", "vec3(UV, 0.0)" },
  1995. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "color", "vec3(1.0)" },
  1996. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "1.0" },
  1997. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_uv", "vec3(SCREEN_UV, 0.0)" },
  1998. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "side", "1.0" },
  1999. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  2000. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "viewport_size", "vec3(1.0, 1.0, 0.0)" },
  2001. // Spatial, Light
  2002. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "vec3(0.0, 0.0, 1.0)" },
  2003. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  2004. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "viewport_size", "vec3(1.0, 1.0, 0.0)" },
  2005. // Canvas Item, Vertex
  2006. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "vertex", "vec3(VERTEX, 0.0)" },
  2007. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV, 0.0)" },
  2008. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "color", "vec3(1.0)" },
  2009. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "1.0" },
  2010. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  2011. // Canvas Item, Fragment
  2012. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV, 0.0)" },
  2013. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "color", "vec3(1.0)" },
  2014. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "1.0" },
  2015. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_uv", "vec3(SCREEN_UV, 0.0)" },
  2016. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  2017. // Canvas Item, Light
  2018. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV, 0.0)" },
  2019. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "vec3(0.0, 0.0, 1.0)" },
  2020. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "color", "vec3(1.0)" },
  2021. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "1.0" },
  2022. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_uv", "vec3(SCREEN_UV, 0.0)" },
  2023. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  2024. // Particles
  2025. { Shader::MODE_PARTICLES, VisualShader::TYPE_START, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  2026. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  2027. { Shader::MODE_PARTICLES, VisualShader::TYPE_COLLIDE, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  2028. { Shader::MODE_PARTICLES, VisualShader::TYPE_START_CUSTOM, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  2029. { Shader::MODE_PARTICLES, VisualShader::TYPE_PROCESS_CUSTOM, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  2030. { Shader::MODE_MAX, VisualShader::TYPE_MAX, VisualShaderNode::PORT_TYPE_TRANSFORM, nullptr, nullptr },
  2031. };
  2032. int VisualShaderNodeInput::get_input_port_count() const {
  2033. return 0;
  2034. }
  2035. VisualShaderNodeInput::PortType VisualShaderNodeInput::get_input_port_type(int p_port) const {
  2036. return PORT_TYPE_SCALAR;
  2037. }
  2038. String VisualShaderNodeInput::get_input_port_name(int p_port) const {
  2039. return "";
  2040. }
  2041. int VisualShaderNodeInput::get_output_port_count() const {
  2042. return 1;
  2043. }
  2044. VisualShaderNodeInput::PortType VisualShaderNodeInput::get_output_port_type(int p_port) const {
  2045. return get_input_type_by_name(input_name);
  2046. }
  2047. String VisualShaderNodeInput::get_output_port_name(int p_port) const {
  2048. return "";
  2049. }
  2050. String VisualShaderNodeInput::get_caption() const {
  2051. return "Input";
  2052. }
  2053. String VisualShaderNodeInput::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 {
  2054. if (get_output_port_type(0) == PORT_TYPE_SAMPLER) {
  2055. return "";
  2056. }
  2057. if (p_for_preview) {
  2058. int idx = 0;
  2059. String code;
  2060. while (preview_ports[idx].mode != Shader::MODE_MAX) {
  2061. if (preview_ports[idx].mode == shader_mode && preview_ports[idx].shader_type == shader_type && preview_ports[idx].name == input_name) {
  2062. code = " " + p_output_vars[0] + " = " + preview_ports[idx].string + ";\n";
  2063. break;
  2064. }
  2065. idx++;
  2066. }
  2067. if (code == String()) {
  2068. switch (get_output_port_type(0)) {
  2069. case PORT_TYPE_SCALAR: {
  2070. code = " " + p_output_vars[0] + " = 0.0;\n";
  2071. } break;
  2072. case PORT_TYPE_SCALAR_INT: {
  2073. code = " " + p_output_vars[0] + " = 0;\n";
  2074. } break;
  2075. case PORT_TYPE_VECTOR: {
  2076. code = " " + p_output_vars[0] + " = vec3(0.0);\n";
  2077. } break;
  2078. case PORT_TYPE_TRANSFORM: {
  2079. code = " " + p_output_vars[0] + " = mat4(vec4(1.0, 0.0, 0.0, 0.0), vec4(0.0, 1.0, 0.0, 0.0), vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0));\n";
  2080. } break;
  2081. case PORT_TYPE_BOOLEAN: {
  2082. code = " " + p_output_vars[0] + " = false;\n";
  2083. } break;
  2084. default: //default (none found) is scalar
  2085. break;
  2086. }
  2087. }
  2088. return code;
  2089. } else {
  2090. int idx = 0;
  2091. String code;
  2092. while (ports[idx].mode != Shader::MODE_MAX) {
  2093. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type && ports[idx].name == input_name) {
  2094. code = " " + p_output_vars[0] + " = " + ports[idx].string + ";\n";
  2095. break;
  2096. }
  2097. idx++;
  2098. }
  2099. if (code == String()) {
  2100. code = " " + p_output_vars[0] + " = 0.0;\n"; //default (none found) is scalar
  2101. }
  2102. return code;
  2103. }
  2104. }
  2105. void VisualShaderNodeInput::set_input_name(String p_name) {
  2106. PortType prev_type = get_input_type_by_name(input_name);
  2107. input_name = p_name;
  2108. emit_changed();
  2109. if (get_input_type_by_name(input_name) != prev_type) {
  2110. emit_signal(SNAME("input_type_changed"));
  2111. }
  2112. }
  2113. String VisualShaderNodeInput::get_input_name() const {
  2114. return input_name;
  2115. }
  2116. String VisualShaderNodeInput::get_input_real_name() const {
  2117. int idx = 0;
  2118. while (ports[idx].mode != Shader::MODE_MAX) {
  2119. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type && ports[idx].name == input_name) {
  2120. return String(ports[idx].string);
  2121. }
  2122. idx++;
  2123. }
  2124. return "";
  2125. }
  2126. VisualShaderNodeInput::PortType VisualShaderNodeInput::get_input_type_by_name(String p_name) const {
  2127. int idx = 0;
  2128. while (ports[idx].mode != Shader::MODE_MAX) {
  2129. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type && ports[idx].name == p_name) {
  2130. return ports[idx].type;
  2131. }
  2132. idx++;
  2133. }
  2134. return PORT_TYPE_SCALAR;
  2135. }
  2136. int VisualShaderNodeInput::get_input_index_count() const {
  2137. int idx = 0;
  2138. int count = 0;
  2139. while (ports[idx].mode != Shader::MODE_MAX) {
  2140. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  2141. count++;
  2142. }
  2143. idx++;
  2144. }
  2145. return count;
  2146. }
  2147. VisualShaderNodeInput::PortType VisualShaderNodeInput::get_input_index_type(int p_index) const {
  2148. int idx = 0;
  2149. int count = 0;
  2150. while (ports[idx].mode != Shader::MODE_MAX) {
  2151. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  2152. if (count == p_index) {
  2153. return ports[idx].type;
  2154. }
  2155. count++;
  2156. }
  2157. idx++;
  2158. }
  2159. return PORT_TYPE_SCALAR;
  2160. }
  2161. String VisualShaderNodeInput::get_input_index_name(int p_index) const {
  2162. int idx = 0;
  2163. int count = 0;
  2164. while (ports[idx].mode != Shader::MODE_MAX) {
  2165. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  2166. if (count == p_index) {
  2167. return ports[idx].name;
  2168. }
  2169. count++;
  2170. }
  2171. idx++;
  2172. }
  2173. return "";
  2174. }
  2175. void VisualShaderNodeInput::_validate_property(PropertyInfo &property) const {
  2176. if (property.name == "input_name") {
  2177. String port_list;
  2178. int idx = 0;
  2179. while (ports[idx].mode != Shader::MODE_MAX) {
  2180. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  2181. if (port_list != String()) {
  2182. port_list += ",";
  2183. }
  2184. port_list += ports[idx].name;
  2185. }
  2186. idx++;
  2187. }
  2188. if (port_list == "") {
  2189. port_list = TTR("None");
  2190. }
  2191. property.hint_string = port_list;
  2192. }
  2193. }
  2194. Vector<StringName> VisualShaderNodeInput::get_editable_properties() const {
  2195. Vector<StringName> props;
  2196. props.push_back("input_name");
  2197. return props;
  2198. }
  2199. void VisualShaderNodeInput::set_shader_type(VisualShader::Type p_shader_type) {
  2200. shader_type = p_shader_type;
  2201. }
  2202. void VisualShaderNodeInput::set_shader_mode(Shader::Mode p_shader_mode) {
  2203. shader_mode = p_shader_mode;
  2204. }
  2205. void VisualShaderNodeInput::_bind_methods() {
  2206. ClassDB::bind_method(D_METHOD("set_input_name", "name"), &VisualShaderNodeInput::set_input_name);
  2207. ClassDB::bind_method(D_METHOD("get_input_name"), &VisualShaderNodeInput::get_input_name);
  2208. ClassDB::bind_method(D_METHOD("get_input_real_name"), &VisualShaderNodeInput::get_input_real_name);
  2209. ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "input_name", PROPERTY_HINT_ENUM, ""), "set_input_name", "get_input_name");
  2210. ADD_SIGNAL(MethodInfo("input_type_changed"));
  2211. }
  2212. VisualShaderNodeInput::VisualShaderNodeInput() {
  2213. }
  2214. ////////////// UniformRef
  2215. List<VisualShaderNodeUniformRef::Uniform> uniforms;
  2216. void VisualShaderNodeUniformRef::add_uniform(const String &p_name, UniformType p_type) {
  2217. uniforms.push_back({ p_name, p_type });
  2218. }
  2219. void VisualShaderNodeUniformRef::clear_uniforms() {
  2220. uniforms.clear();
  2221. }
  2222. bool VisualShaderNodeUniformRef::has_uniform(const String &p_name) {
  2223. for (const VisualShaderNodeUniformRef::Uniform &E : uniforms) {
  2224. if (E.name == p_name) {
  2225. return true;
  2226. }
  2227. }
  2228. return false;
  2229. }
  2230. String VisualShaderNodeUniformRef::get_caption() const {
  2231. return "UniformRef";
  2232. }
  2233. int VisualShaderNodeUniformRef::get_input_port_count() const {
  2234. return 0;
  2235. }
  2236. VisualShaderNodeUniformRef::PortType VisualShaderNodeUniformRef::get_input_port_type(int p_port) const {
  2237. return PortType::PORT_TYPE_SCALAR;
  2238. }
  2239. String VisualShaderNodeUniformRef::get_input_port_name(int p_port) const {
  2240. return "";
  2241. }
  2242. int VisualShaderNodeUniformRef::get_output_port_count() const {
  2243. switch (uniform_type) {
  2244. case UniformType::UNIFORM_TYPE_FLOAT:
  2245. return 1;
  2246. case UniformType::UNIFORM_TYPE_INT:
  2247. return 1;
  2248. case UniformType::UNIFORM_TYPE_BOOLEAN:
  2249. return 1;
  2250. case UniformType::UNIFORM_TYPE_VECTOR:
  2251. return 1;
  2252. case UniformType::UNIFORM_TYPE_TRANSFORM:
  2253. return 1;
  2254. case UniformType::UNIFORM_TYPE_COLOR:
  2255. return 2;
  2256. case UniformType::UNIFORM_TYPE_SAMPLER:
  2257. return 1;
  2258. default:
  2259. break;
  2260. }
  2261. return 1;
  2262. }
  2263. VisualShaderNodeUniformRef::PortType VisualShaderNodeUniformRef::get_output_port_type(int p_port) const {
  2264. switch (uniform_type) {
  2265. case UniformType::UNIFORM_TYPE_FLOAT:
  2266. return PortType::PORT_TYPE_SCALAR;
  2267. case UniformType::UNIFORM_TYPE_INT:
  2268. return PortType::PORT_TYPE_SCALAR_INT;
  2269. case UniformType::UNIFORM_TYPE_BOOLEAN:
  2270. return PortType::PORT_TYPE_BOOLEAN;
  2271. case UniformType::UNIFORM_TYPE_VECTOR:
  2272. return PortType::PORT_TYPE_VECTOR;
  2273. case UniformType::UNIFORM_TYPE_TRANSFORM:
  2274. return PortType::PORT_TYPE_TRANSFORM;
  2275. case UniformType::UNIFORM_TYPE_COLOR:
  2276. if (p_port == 0) {
  2277. return PortType::PORT_TYPE_VECTOR;
  2278. } else if (p_port == 1) {
  2279. return PORT_TYPE_SCALAR;
  2280. }
  2281. break;
  2282. case UniformType::UNIFORM_TYPE_SAMPLER:
  2283. return PortType::PORT_TYPE_SAMPLER;
  2284. default:
  2285. break;
  2286. }
  2287. return PORT_TYPE_SCALAR;
  2288. }
  2289. String VisualShaderNodeUniformRef::get_output_port_name(int p_port) const {
  2290. switch (uniform_type) {
  2291. case UniformType::UNIFORM_TYPE_FLOAT:
  2292. return "";
  2293. case UniformType::UNIFORM_TYPE_INT:
  2294. return "";
  2295. case UniformType::UNIFORM_TYPE_BOOLEAN:
  2296. return "";
  2297. case UniformType::UNIFORM_TYPE_VECTOR:
  2298. return "";
  2299. case UniformType::UNIFORM_TYPE_TRANSFORM:
  2300. return "";
  2301. case UniformType::UNIFORM_TYPE_COLOR:
  2302. if (p_port == 0) {
  2303. return "rgb";
  2304. } else if (p_port == 1) {
  2305. return "alpha";
  2306. }
  2307. break;
  2308. case UniformType::UNIFORM_TYPE_SAMPLER:
  2309. return "";
  2310. break;
  2311. default:
  2312. break;
  2313. }
  2314. return "";
  2315. }
  2316. void VisualShaderNodeUniformRef::set_uniform_name(const String &p_name) {
  2317. uniform_name = p_name;
  2318. if (uniform_name != "[None]") {
  2319. uniform_type = get_uniform_type_by_name(uniform_name);
  2320. } else {
  2321. uniform_type = UniformType::UNIFORM_TYPE_FLOAT;
  2322. }
  2323. emit_changed();
  2324. }
  2325. String VisualShaderNodeUniformRef::get_uniform_name() const {
  2326. return uniform_name;
  2327. }
  2328. int VisualShaderNodeUniformRef::get_uniforms_count() const {
  2329. return uniforms.size();
  2330. }
  2331. String VisualShaderNodeUniformRef::get_uniform_name_by_index(int p_idx) const {
  2332. if (p_idx >= 0 && p_idx < uniforms.size()) {
  2333. return uniforms[p_idx].name;
  2334. }
  2335. return "";
  2336. }
  2337. VisualShaderNodeUniformRef::UniformType VisualShaderNodeUniformRef::get_uniform_type_by_name(const String &p_name) const {
  2338. for (int i = 0; i < uniforms.size(); i++) {
  2339. if (uniforms[i].name == p_name) {
  2340. return uniforms[i].type;
  2341. }
  2342. }
  2343. return UniformType::UNIFORM_TYPE_FLOAT;
  2344. }
  2345. VisualShaderNodeUniformRef::UniformType VisualShaderNodeUniformRef::get_uniform_type_by_index(int p_idx) const {
  2346. if (p_idx >= 0 && p_idx < uniforms.size()) {
  2347. return uniforms[p_idx].type;
  2348. }
  2349. return UniformType::UNIFORM_TYPE_FLOAT;
  2350. }
  2351. VisualShaderNodeUniformRef::PortType VisualShaderNodeUniformRef::get_port_type_by_index(int p_idx) const {
  2352. if (p_idx >= 0 && p_idx < uniforms.size()) {
  2353. switch (uniforms[p_idx].type) {
  2354. case UniformType::UNIFORM_TYPE_FLOAT:
  2355. return PORT_TYPE_SCALAR;
  2356. case UniformType::UNIFORM_TYPE_INT:
  2357. return PORT_TYPE_SCALAR_INT;
  2358. case UniformType::UNIFORM_TYPE_SAMPLER:
  2359. return PORT_TYPE_SAMPLER;
  2360. case UniformType::UNIFORM_TYPE_VECTOR:
  2361. return PORT_TYPE_VECTOR;
  2362. case UniformType::UNIFORM_TYPE_TRANSFORM:
  2363. return PORT_TYPE_TRANSFORM;
  2364. case UniformType::UNIFORM_TYPE_COLOR:
  2365. return PORT_TYPE_VECTOR;
  2366. default:
  2367. break;
  2368. }
  2369. }
  2370. return PORT_TYPE_SCALAR;
  2371. }
  2372. String VisualShaderNodeUniformRef::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 {
  2373. switch (uniform_type) {
  2374. case UniformType::UNIFORM_TYPE_FLOAT:
  2375. if (uniform_name == "[None]") {
  2376. return " " + p_output_vars[0] + " = 0.0;\n";
  2377. }
  2378. return " " + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
  2379. case UniformType::UNIFORM_TYPE_INT:
  2380. return " " + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
  2381. case UniformType::UNIFORM_TYPE_BOOLEAN:
  2382. return " " + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
  2383. case UniformType::UNIFORM_TYPE_VECTOR:
  2384. return " " + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
  2385. case UniformType::UNIFORM_TYPE_TRANSFORM:
  2386. return " " + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
  2387. case UniformType::UNIFORM_TYPE_COLOR: {
  2388. String code = " " + p_output_vars[0] + " = " + get_uniform_name() + ".rgb;\n";
  2389. code += " " + p_output_vars[1] + " = " + get_uniform_name() + ".a;\n";
  2390. return code;
  2391. } break;
  2392. case UniformType::UNIFORM_TYPE_SAMPLER:
  2393. break;
  2394. default:
  2395. break;
  2396. }
  2397. return "";
  2398. }
  2399. void VisualShaderNodeUniformRef::_set_uniform_type(int p_uniform_type) {
  2400. uniform_type = (UniformType)p_uniform_type;
  2401. }
  2402. int VisualShaderNodeUniformRef::_get_uniform_type() const {
  2403. return (int)uniform_type;
  2404. }
  2405. void VisualShaderNodeUniformRef::_bind_methods() {
  2406. ClassDB::bind_method(D_METHOD("set_uniform_name", "name"), &VisualShaderNodeUniformRef::set_uniform_name);
  2407. ClassDB::bind_method(D_METHOD("get_uniform_name"), &VisualShaderNodeUniformRef::get_uniform_name);
  2408. ClassDB::bind_method(D_METHOD("_set_uniform_type", "type"), &VisualShaderNodeUniformRef::_set_uniform_type);
  2409. ClassDB::bind_method(D_METHOD("_get_uniform_type"), &VisualShaderNodeUniformRef::_get_uniform_type);
  2410. ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "uniform_name", PROPERTY_HINT_ENUM, ""), "set_uniform_name", "get_uniform_name");
  2411. ADD_PROPERTY(PropertyInfo(Variant::INT, "uniform_type", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "_set_uniform_type", "_get_uniform_type");
  2412. }
  2413. Vector<StringName> VisualShaderNodeUniformRef::get_editable_properties() const {
  2414. Vector<StringName> props;
  2415. props.push_back("uniform_name");
  2416. props.push_back("uniform_type");
  2417. return props;
  2418. }
  2419. VisualShaderNodeUniformRef::VisualShaderNodeUniformRef() {
  2420. }
  2421. ////////////////////////////////////////////
  2422. const VisualShaderNodeOutput::Port VisualShaderNodeOutput::ports[] = {
  2423. ////////////////////////////////////////////////////////////////////////
  2424. // Node3D.
  2425. ////////////////////////////////////////////////////////////////////////
  2426. // Node3D, Vertex.
  2427. ////////////////////////////////////////////////////////////////////////
  2428. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "vertex", "VERTEX" },
  2429. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "NORMAL" },
  2430. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "tangent", "TANGENT" },
  2431. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "binormal", "BINORMAL" },
  2432. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "UV:xy" },
  2433. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "uv2", "UV2:xy" },
  2434. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  2435. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  2436. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "roughness", "ROUGHNESS" },
  2437. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "model_view_matrix", "MODELVIEW_MATRIX" },
  2438. ////////////////////////////////////////////////////////////////////////
  2439. // Node3D, Fragment.
  2440. ////////////////////////////////////////////////////////////////////////
  2441. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "albedo", "ALBEDO" },
  2442. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "ALPHA" },
  2443. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "metallic", "METALLIC" },
  2444. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "roughness", "ROUGHNESS" },
  2445. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "specular", "SPECULAR" },
  2446. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "emission", "EMISSION" },
  2447. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "ao", "AO" },
  2448. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "NORMAL" },
  2449. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "normal_map", "NORMAL_MAP" },
  2450. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "normal_map_depth", "NORMAL_MAP_DEPTH" },
  2451. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "rim", "RIM" },
  2452. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "rim_tint", "RIM_TINT" },
  2453. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "clearcoat", "CLEARCOAT" },
  2454. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "clearcoat_gloss", "CLEARCOAT_GLOSS" },
  2455. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "anisotropy", "ANISOTROPY" },
  2456. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "anisotropy_flow", "ANISOTROPY_FLOW:xy" },
  2457. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "subsurf_scatter", "SSS_STRENGTH" },
  2458. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "backlight", "BACKLIGHT" },
  2459. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha_scissor_threshold", "ALPHA_SCISSOR_THRESHOLD" },
  2460. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "ao_light_affect", "AO_LIGHT_AFFECT" },
  2461. ////////////////////////////////////////////////////////////////////////
  2462. // Node3D, Light.
  2463. ////////////////////////////////////////////////////////////////////////
  2464. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "diffuse", "DIFFUSE_LIGHT" },
  2465. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "specular", "SPECULAR_LIGHT" },
  2466. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "ALPHA" },
  2467. ////////////////////////////////////////////////////////////////////////
  2468. // Canvas Item.
  2469. ////////////////////////////////////////////////////////////////////////
  2470. // Canvas Item, Vertex.
  2471. ////////////////////////////////////////////////////////////////////////
  2472. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "vertex", "VERTEX:xy" },
  2473. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "UV:xy" },
  2474. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  2475. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  2476. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "point_size", "POINT_SIZE" },
  2477. ////////////////////////////////////////////////////////////////////////
  2478. // Canvas Item, Fragment.
  2479. ////////////////////////////////////////////////////////////////////////
  2480. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  2481. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  2482. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "NORMAL" },
  2483. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "normal_map", "NORMAL_MAP" },
  2484. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "normal_map_depth", "NORMAL_MAP_DEPTH" },
  2485. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "light_vertex", "LIGHT_VERTEX" },
  2486. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "shadow_vertex", "SHADOW_VERTEX:xy" },
  2487. ////////////////////////////////////////////////////////////////////////
  2488. // Canvas Item, Light.
  2489. ////////////////////////////////////////////////////////////////////////
  2490. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light", "LIGHT.rgb" },
  2491. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "light_alpha", "LIGHT.a" },
  2492. ////////////////////////////////////////////////////////////////////////
  2493. // Sky, Sky.
  2494. ////////////////////////////////////////////////////////////////////////
  2495. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR" },
  2496. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "ALPHA" },
  2497. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_VECTOR, "fog", "FOG.rgb" },
  2498. { Shader::MODE_SKY, VisualShader::TYPE_SKY, VisualShaderNode::PORT_TYPE_SCALAR, "fog_alpha", "FOG.a" },
  2499. ////////////////////////////////////////////////////////////////////////
  2500. { Shader::MODE_MAX, VisualShader::TYPE_MAX, VisualShaderNode::PORT_TYPE_TRANSFORM, nullptr, nullptr },
  2501. };
  2502. int VisualShaderNodeOutput::get_input_port_count() const {
  2503. int idx = 0;
  2504. int count = 0;
  2505. while (ports[idx].mode != Shader::MODE_MAX) {
  2506. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  2507. count++;
  2508. }
  2509. idx++;
  2510. }
  2511. return count;
  2512. }
  2513. VisualShaderNodeOutput::PortType VisualShaderNodeOutput::get_input_port_type(int p_port) const {
  2514. int idx = 0;
  2515. int count = 0;
  2516. while (ports[idx].mode != Shader::MODE_MAX) {
  2517. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  2518. if (count == p_port) {
  2519. return ports[idx].type;
  2520. }
  2521. count++;
  2522. }
  2523. idx++;
  2524. }
  2525. return PORT_TYPE_SCALAR;
  2526. }
  2527. String VisualShaderNodeOutput::get_input_port_name(int p_port) const {
  2528. int idx = 0;
  2529. int count = 0;
  2530. while (ports[idx].mode != Shader::MODE_MAX) {
  2531. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  2532. if (count == p_port) {
  2533. return String(ports[idx].name).capitalize();
  2534. }
  2535. count++;
  2536. }
  2537. idx++;
  2538. }
  2539. return String();
  2540. }
  2541. Variant VisualShaderNodeOutput::get_input_port_default_value(int p_port) const {
  2542. return Variant();
  2543. }
  2544. int VisualShaderNodeOutput::get_output_port_count() const {
  2545. return 0;
  2546. }
  2547. VisualShaderNodeOutput::PortType VisualShaderNodeOutput::get_output_port_type(int p_port) const {
  2548. return PORT_TYPE_SCALAR;
  2549. }
  2550. String VisualShaderNodeOutput::get_output_port_name(int p_port) const {
  2551. return String();
  2552. }
  2553. bool VisualShaderNodeOutput::is_port_separator(int p_index) const {
  2554. if (shader_mode == Shader::MODE_SPATIAL && shader_type == VisualShader::TYPE_VERTEX) {
  2555. String name = get_input_port_name(p_index);
  2556. return bool(name == "Model View Matrix");
  2557. }
  2558. if (shader_mode == Shader::MODE_SPATIAL && shader_type == VisualShader::TYPE_FRAGMENT) {
  2559. String name = get_input_port_name(p_index);
  2560. return bool(name == "Normal" || name == "Rim" || name == "Alpha Scissor Threshold");
  2561. }
  2562. return false;
  2563. }
  2564. String VisualShaderNodeOutput::get_caption() const {
  2565. return "Output";
  2566. }
  2567. String VisualShaderNodeOutput::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 {
  2568. int idx = 0;
  2569. int count = 0;
  2570. String code;
  2571. while (ports[idx].mode != Shader::MODE_MAX) {
  2572. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  2573. if (p_input_vars[count] != String()) {
  2574. String s = ports[idx].string;
  2575. if (s.find(":") != -1) {
  2576. code += " " + s.get_slicec(':', 0) + " = " + p_input_vars[count] + "." + s.get_slicec(':', 1) + ";\n";
  2577. } else {
  2578. code += " " + s + " = " + p_input_vars[count] + ";\n";
  2579. }
  2580. }
  2581. count++;
  2582. }
  2583. idx++;
  2584. }
  2585. return code;
  2586. }
  2587. VisualShaderNodeOutput::VisualShaderNodeOutput() {
  2588. }
  2589. ///////////////////////////
  2590. void VisualShaderNodeUniform::set_uniform_name(const String &p_name) {
  2591. uniform_name = p_name;
  2592. emit_signal(SNAME("name_changed"));
  2593. emit_changed();
  2594. }
  2595. String VisualShaderNodeUniform::get_uniform_name() const {
  2596. return uniform_name;
  2597. }
  2598. void VisualShaderNodeUniform::set_qualifier(VisualShaderNodeUniform::Qualifier p_qual) {
  2599. ERR_FAIL_INDEX(int(p_qual), int(QUAL_MAX));
  2600. if (qualifier == p_qual) {
  2601. return;
  2602. }
  2603. qualifier = p_qual;
  2604. emit_changed();
  2605. }
  2606. VisualShaderNodeUniform::Qualifier VisualShaderNodeUniform::get_qualifier() const {
  2607. return qualifier;
  2608. }
  2609. void VisualShaderNodeUniform::set_global_code_generated(bool p_enabled) {
  2610. global_code_generated = p_enabled;
  2611. }
  2612. bool VisualShaderNodeUniform::is_global_code_generated() const {
  2613. return global_code_generated;
  2614. }
  2615. void VisualShaderNodeUniform::_bind_methods() {
  2616. ClassDB::bind_method(D_METHOD("set_uniform_name", "name"), &VisualShaderNodeUniform::set_uniform_name);
  2617. ClassDB::bind_method(D_METHOD("get_uniform_name"), &VisualShaderNodeUniform::get_uniform_name);
  2618. ClassDB::bind_method(D_METHOD("set_qualifier", "qualifier"), &VisualShaderNodeUniform::set_qualifier);
  2619. ClassDB::bind_method(D_METHOD("get_qualifier"), &VisualShaderNodeUniform::get_qualifier);
  2620. ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "uniform_name"), "set_uniform_name", "get_uniform_name");
  2621. ADD_PROPERTY(PropertyInfo(Variant::INT, "qualifier", PROPERTY_HINT_ENUM, "None,Global,Instance"), "set_qualifier", "get_qualifier");
  2622. BIND_ENUM_CONSTANT(QUAL_NONE);
  2623. BIND_ENUM_CONSTANT(QUAL_GLOBAL);
  2624. BIND_ENUM_CONSTANT(QUAL_INSTANCE);
  2625. BIND_ENUM_CONSTANT(QUAL_MAX);
  2626. }
  2627. String VisualShaderNodeUniform::_get_qual_str() const {
  2628. if (is_qualifier_supported(qualifier)) {
  2629. switch (qualifier) {
  2630. case QUAL_NONE:
  2631. break;
  2632. case QUAL_GLOBAL:
  2633. return "global ";
  2634. case QUAL_INSTANCE:
  2635. return "instance ";
  2636. default:
  2637. break;
  2638. }
  2639. }
  2640. return String();
  2641. }
  2642. String VisualShaderNodeUniform::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const {
  2643. List<String> keyword_list;
  2644. ShaderLanguage::get_keyword_list(&keyword_list);
  2645. if (keyword_list.find(uniform_name)) {
  2646. return TTR("Shader keywords cannot be used as uniform names.\nChoose another name.");
  2647. }
  2648. if (!is_qualifier_supported(qualifier)) {
  2649. String qualifier_str;
  2650. switch (qualifier) {
  2651. case QUAL_NONE:
  2652. break;
  2653. case QUAL_GLOBAL:
  2654. qualifier_str = "global";
  2655. break;
  2656. case QUAL_INSTANCE:
  2657. qualifier_str = "instance";
  2658. break;
  2659. default:
  2660. break;
  2661. }
  2662. return vformat(TTR("This uniform type does not support the '%s' qualifier."), qualifier_str);
  2663. } else if (qualifier == Qualifier::QUAL_GLOBAL) {
  2664. RS::GlobalVariableType gvt = RS::get_singleton()->global_variable_get_type(uniform_name);
  2665. if (gvt == RS::GLOBAL_VAR_TYPE_MAX) {
  2666. return vformat(TTR("Global uniform '%s' does not exist.\nCreate it in the Project Settings."), uniform_name);
  2667. }
  2668. bool incompatible_type = false;
  2669. switch (gvt) {
  2670. case RS::GLOBAL_VAR_TYPE_FLOAT: {
  2671. if (!Object::cast_to<VisualShaderNodeFloatUniform>(this)) {
  2672. incompatible_type = true;
  2673. }
  2674. } break;
  2675. case RS::GLOBAL_VAR_TYPE_INT: {
  2676. if (!Object::cast_to<VisualShaderNodeIntUniform>(this)) {
  2677. incompatible_type = true;
  2678. }
  2679. } break;
  2680. case RS::GLOBAL_VAR_TYPE_BOOL: {
  2681. if (!Object::cast_to<VisualShaderNodeBooleanUniform>(this)) {
  2682. incompatible_type = true;
  2683. }
  2684. } break;
  2685. case RS::GLOBAL_VAR_TYPE_COLOR: {
  2686. if (!Object::cast_to<VisualShaderNodeColorUniform>(this)) {
  2687. incompatible_type = true;
  2688. }
  2689. } break;
  2690. case RS::GLOBAL_VAR_TYPE_VEC3: {
  2691. if (!Object::cast_to<VisualShaderNodeVec3Uniform>(this)) {
  2692. incompatible_type = true;
  2693. }
  2694. } break;
  2695. case RS::GLOBAL_VAR_TYPE_TRANSFORM: {
  2696. if (!Object::cast_to<VisualShaderNodeTransformUniform>(this)) {
  2697. incompatible_type = true;
  2698. }
  2699. } break;
  2700. case RS::GLOBAL_VAR_TYPE_SAMPLER2D: {
  2701. if (!Object::cast_to<VisualShaderNodeTextureUniform>(this)) {
  2702. incompatible_type = true;
  2703. }
  2704. } break;
  2705. case RS::GLOBAL_VAR_TYPE_SAMPLER3D: {
  2706. if (!Object::cast_to<VisualShaderNodeTexture3DUniform>(this)) {
  2707. incompatible_type = true;
  2708. }
  2709. } break;
  2710. case RS::GLOBAL_VAR_TYPE_SAMPLER2DARRAY: {
  2711. if (!Object::cast_to<VisualShaderNodeTexture2DArrayUniform>(this)) {
  2712. incompatible_type = true;
  2713. }
  2714. } break;
  2715. case RS::GLOBAL_VAR_TYPE_SAMPLERCUBE: {
  2716. if (!Object::cast_to<VisualShaderNodeCubemapUniform>(this)) {
  2717. incompatible_type = true;
  2718. }
  2719. } break;
  2720. default:
  2721. break;
  2722. }
  2723. if (incompatible_type) {
  2724. return vformat(TTR("Global uniform '%s' has an incompatible type for this kind of node.\nChange it in the Project Settings."), uniform_name);
  2725. }
  2726. }
  2727. return String();
  2728. }
  2729. Vector<StringName> VisualShaderNodeUniform::get_editable_properties() const {
  2730. Vector<StringName> props;
  2731. props.push_back("qualifier");
  2732. return props;
  2733. }
  2734. VisualShaderNodeUniform::VisualShaderNodeUniform() {
  2735. }
  2736. ////////////// ResizeableBase
  2737. void VisualShaderNodeResizableBase::set_size(const Vector2 &p_size) {
  2738. size = p_size;
  2739. }
  2740. Vector2 VisualShaderNodeResizableBase::get_size() const {
  2741. return size;
  2742. }
  2743. void VisualShaderNodeResizableBase::set_allow_v_resize(bool p_enabled) {
  2744. allow_v_resize = p_enabled;
  2745. }
  2746. bool VisualShaderNodeResizableBase::is_allow_v_resize() const {
  2747. return allow_v_resize;
  2748. }
  2749. void VisualShaderNodeResizableBase::_bind_methods() {
  2750. ClassDB::bind_method(D_METHOD("set_size", "size"), &VisualShaderNodeResizableBase::set_size);
  2751. ClassDB::bind_method(D_METHOD("get_size"), &VisualShaderNodeResizableBase::get_size);
  2752. ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "size"), "set_size", "get_size");
  2753. }
  2754. VisualShaderNodeResizableBase::VisualShaderNodeResizableBase() {
  2755. set_allow_v_resize(true);
  2756. }
  2757. ////////////// Comment
  2758. String VisualShaderNodeComment::get_caption() const {
  2759. return title;
  2760. }
  2761. int VisualShaderNodeComment::get_input_port_count() const {
  2762. return 0;
  2763. }
  2764. VisualShaderNodeComment::PortType VisualShaderNodeComment::get_input_port_type(int p_port) const {
  2765. return PortType::PORT_TYPE_SCALAR;
  2766. }
  2767. String VisualShaderNodeComment::get_input_port_name(int p_port) const {
  2768. return String();
  2769. }
  2770. int VisualShaderNodeComment::get_output_port_count() const {
  2771. return 0;
  2772. }
  2773. VisualShaderNodeComment::PortType VisualShaderNodeComment::get_output_port_type(int p_port) const {
  2774. return PortType::PORT_TYPE_SCALAR;
  2775. }
  2776. String VisualShaderNodeComment::get_output_port_name(int p_port) const {
  2777. return String();
  2778. }
  2779. void VisualShaderNodeComment::set_title(const String &p_title) {
  2780. title = p_title;
  2781. }
  2782. String VisualShaderNodeComment::get_title() const {
  2783. return title;
  2784. }
  2785. void VisualShaderNodeComment::set_description(const String &p_description) {
  2786. description = p_description;
  2787. }
  2788. String VisualShaderNodeComment::get_description() const {
  2789. return description;
  2790. }
  2791. String VisualShaderNodeComment::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 {
  2792. return String();
  2793. }
  2794. void VisualShaderNodeComment::_bind_methods() {
  2795. ClassDB::bind_method(D_METHOD("set_title", "title"), &VisualShaderNodeComment::set_title);
  2796. ClassDB::bind_method(D_METHOD("get_title"), &VisualShaderNodeComment::get_title);
  2797. ClassDB::bind_method(D_METHOD("set_description", "description"), &VisualShaderNodeComment::set_description);
  2798. ClassDB::bind_method(D_METHOD("get_description"), &VisualShaderNodeComment::get_description);
  2799. ADD_PROPERTY(PropertyInfo(Variant::STRING, "title"), "set_title", "get_title");
  2800. ADD_PROPERTY(PropertyInfo(Variant::STRING, "description"), "set_description", "get_description");
  2801. }
  2802. VisualShaderNodeComment::VisualShaderNodeComment() {
  2803. }
  2804. ////////////// GroupBase
  2805. void VisualShaderNodeGroupBase::set_inputs(const String &p_inputs) {
  2806. if (inputs == p_inputs) {
  2807. return;
  2808. }
  2809. clear_input_ports();
  2810. inputs = p_inputs;
  2811. Vector<String> input_strings = inputs.split(";", false);
  2812. int input_port_count = input_strings.size();
  2813. for (int i = 0; i < input_port_count; i++) {
  2814. Vector<String> arr = input_strings[i].split(",");
  2815. ERR_FAIL_COND(arr.size() != 3);
  2816. int port_idx = arr[0].to_int();
  2817. int port_type = arr[1].to_int();
  2818. String port_name = arr[2];
  2819. Port port;
  2820. port.type = (PortType)port_type;
  2821. port.name = port_name;
  2822. input_ports[port_idx] = port;
  2823. }
  2824. }
  2825. String VisualShaderNodeGroupBase::get_inputs() const {
  2826. return inputs;
  2827. }
  2828. void VisualShaderNodeGroupBase::set_outputs(const String &p_outputs) {
  2829. if (outputs == p_outputs) {
  2830. return;
  2831. }
  2832. clear_output_ports();
  2833. outputs = p_outputs;
  2834. Vector<String> output_strings = outputs.split(";", false);
  2835. int output_port_count = output_strings.size();
  2836. for (int i = 0; i < output_port_count; i++) {
  2837. Vector<String> arr = output_strings[i].split(",");
  2838. ERR_FAIL_COND(arr.size() != 3);
  2839. int port_idx = arr[0].to_int();
  2840. int port_type = arr[1].to_int();
  2841. String port_name = arr[2];
  2842. Port port;
  2843. port.type = (PortType)port_type;
  2844. port.name = port_name;
  2845. output_ports[port_idx] = port;
  2846. }
  2847. }
  2848. String VisualShaderNodeGroupBase::get_outputs() const {
  2849. return outputs;
  2850. }
  2851. bool VisualShaderNodeGroupBase::is_valid_port_name(const String &p_name) const {
  2852. if (!p_name.is_valid_identifier()) {
  2853. return false;
  2854. }
  2855. for (int i = 0; i < get_input_port_count(); i++) {
  2856. if (get_input_port_name(i) == p_name) {
  2857. return false;
  2858. }
  2859. }
  2860. for (int i = 0; i < get_output_port_count(); i++) {
  2861. if (get_output_port_name(i) == p_name) {
  2862. return false;
  2863. }
  2864. }
  2865. return true;
  2866. }
  2867. void VisualShaderNodeGroupBase::add_input_port(int p_id, int p_type, const String &p_name) {
  2868. ERR_FAIL_COND(has_input_port(p_id));
  2869. ERR_FAIL_INDEX(p_type, int(PORT_TYPE_MAX));
  2870. ERR_FAIL_COND(!is_valid_port_name(p_name));
  2871. String str = itos(p_id) + "," + itos(p_type) + "," + p_name + ";";
  2872. Vector<String> inputs_strings = inputs.split(";", false);
  2873. int index = 0;
  2874. if (p_id < inputs_strings.size()) {
  2875. for (int i = 0; i < inputs_strings.size(); i++) {
  2876. if (i == p_id) {
  2877. inputs = inputs.insert(index, str);
  2878. break;
  2879. }
  2880. index += inputs_strings[i].size();
  2881. }
  2882. } else {
  2883. inputs += str;
  2884. }
  2885. inputs_strings = inputs.split(";", false);
  2886. index = 0;
  2887. for (int i = 0; i < inputs_strings.size(); i++) {
  2888. int count = 0;
  2889. for (int j = 0; j < inputs_strings[i].size(); j++) {
  2890. if (inputs_strings[i][j] == ',') {
  2891. break;
  2892. }
  2893. count++;
  2894. }
  2895. inputs.erase(index, count);
  2896. inputs = inputs.insert(index, itos(i));
  2897. index += inputs_strings[i].size();
  2898. }
  2899. _apply_port_changes();
  2900. emit_changed();
  2901. }
  2902. void VisualShaderNodeGroupBase::remove_input_port(int p_id) {
  2903. ERR_FAIL_COND(!has_input_port(p_id));
  2904. Vector<String> inputs_strings = inputs.split(";", false);
  2905. int count = 0;
  2906. int index = 0;
  2907. for (int i = 0; i < inputs_strings.size(); i++) {
  2908. Vector<String> arr = inputs_strings[i].split(",");
  2909. if (arr[0].to_int() == p_id) {
  2910. count = inputs_strings[i].size();
  2911. break;
  2912. }
  2913. index += inputs_strings[i].size();
  2914. }
  2915. inputs.erase(index, count);
  2916. inputs_strings = inputs.split(";", false);
  2917. inputs = inputs.substr(0, index);
  2918. for (int i = p_id; i < inputs_strings.size(); i++) {
  2919. inputs += inputs_strings[i].replace_first(inputs_strings[i].split(",")[0], itos(i)) + ";";
  2920. }
  2921. _apply_port_changes();
  2922. emit_changed();
  2923. }
  2924. int VisualShaderNodeGroupBase::get_input_port_count() const {
  2925. return input_ports.size();
  2926. }
  2927. bool VisualShaderNodeGroupBase::has_input_port(int p_id) const {
  2928. return input_ports.has(p_id);
  2929. }
  2930. void VisualShaderNodeGroupBase::add_output_port(int p_id, int p_type, const String &p_name) {
  2931. ERR_FAIL_COND(has_output_port(p_id));
  2932. ERR_FAIL_INDEX(p_type, int(PORT_TYPE_MAX));
  2933. ERR_FAIL_COND(!is_valid_port_name(p_name));
  2934. String str = itos(p_id) + "," + itos(p_type) + "," + p_name + ";";
  2935. Vector<String> outputs_strings = outputs.split(";", false);
  2936. int index = 0;
  2937. if (p_id < outputs_strings.size()) {
  2938. for (int i = 0; i < outputs_strings.size(); i++) {
  2939. if (i == p_id) {
  2940. outputs = outputs.insert(index, str);
  2941. break;
  2942. }
  2943. index += outputs_strings[i].size();
  2944. }
  2945. } else {
  2946. outputs += str;
  2947. }
  2948. outputs_strings = outputs.split(";", false);
  2949. index = 0;
  2950. for (int i = 0; i < outputs_strings.size(); i++) {
  2951. int count = 0;
  2952. for (int j = 0; j < outputs_strings[i].size(); j++) {
  2953. if (outputs_strings[i][j] == ',') {
  2954. break;
  2955. }
  2956. count++;
  2957. }
  2958. outputs.erase(index, count);
  2959. outputs = outputs.insert(index, itos(i));
  2960. index += outputs_strings[i].size();
  2961. }
  2962. _apply_port_changes();
  2963. emit_changed();
  2964. }
  2965. void VisualShaderNodeGroupBase::remove_output_port(int p_id) {
  2966. ERR_FAIL_COND(!has_output_port(p_id));
  2967. Vector<String> outputs_strings = outputs.split(";", false);
  2968. int count = 0;
  2969. int index = 0;
  2970. for (int i = 0; i < outputs_strings.size(); i++) {
  2971. Vector<String> arr = outputs_strings[i].split(",");
  2972. if (arr[0].to_int() == p_id) {
  2973. count = outputs_strings[i].size();
  2974. break;
  2975. }
  2976. index += outputs_strings[i].size();
  2977. }
  2978. outputs.erase(index, count);
  2979. outputs_strings = outputs.split(";", false);
  2980. outputs = outputs.substr(0, index);
  2981. for (int i = p_id; i < outputs_strings.size(); i++) {
  2982. outputs += outputs_strings[i].replace_first(outputs_strings[i].split(",")[0], itos(i)) + ";";
  2983. }
  2984. _apply_port_changes();
  2985. emit_changed();
  2986. }
  2987. int VisualShaderNodeGroupBase::get_output_port_count() const {
  2988. return output_ports.size();
  2989. }
  2990. bool VisualShaderNodeGroupBase::has_output_port(int p_id) const {
  2991. return output_ports.has(p_id);
  2992. }
  2993. void VisualShaderNodeGroupBase::clear_input_ports() {
  2994. input_ports.clear();
  2995. }
  2996. void VisualShaderNodeGroupBase::clear_output_ports() {
  2997. output_ports.clear();
  2998. }
  2999. void VisualShaderNodeGroupBase::set_input_port_type(int p_id, int p_type) {
  3000. ERR_FAIL_COND(!has_input_port(p_id));
  3001. ERR_FAIL_INDEX(p_type, int(PORT_TYPE_MAX));
  3002. if (input_ports[p_id].type == p_type) {
  3003. return;
  3004. }
  3005. Vector<String> inputs_strings = inputs.split(";", false);
  3006. int count = 0;
  3007. int index = 0;
  3008. for (int i = 0; i < inputs_strings.size(); i++) {
  3009. Vector<String> arr = inputs_strings[i].split(",");
  3010. ERR_FAIL_COND(arr.size() != 3);
  3011. if (arr[0].to_int() == p_id) {
  3012. index += arr[0].size();
  3013. count = arr[1].size() - 1;
  3014. break;
  3015. }
  3016. index += inputs_strings[i].size();
  3017. }
  3018. inputs.erase(index, count);
  3019. inputs = inputs.insert(index, itos(p_type));
  3020. _apply_port_changes();
  3021. emit_changed();
  3022. }
  3023. VisualShaderNodeGroupBase::PortType VisualShaderNodeGroupBase::get_input_port_type(int p_id) const {
  3024. ERR_FAIL_COND_V(!input_ports.has(p_id), (PortType)0);
  3025. return input_ports[p_id].type;
  3026. }
  3027. void VisualShaderNodeGroupBase::set_input_port_name(int p_id, const String &p_name) {
  3028. ERR_FAIL_COND(!has_input_port(p_id));
  3029. ERR_FAIL_COND(!is_valid_port_name(p_name));
  3030. if (input_ports[p_id].name == p_name) {
  3031. return;
  3032. }
  3033. Vector<String> inputs_strings = inputs.split(";", false);
  3034. int count = 0;
  3035. int index = 0;
  3036. for (int i = 0; i < inputs_strings.size(); i++) {
  3037. Vector<String> arr = inputs_strings[i].split(",");
  3038. ERR_FAIL_COND(arr.size() != 3);
  3039. if (arr[0].to_int() == p_id) {
  3040. index += arr[0].size() + arr[1].size();
  3041. count = arr[2].size() - 1;
  3042. break;
  3043. }
  3044. index += inputs_strings[i].size();
  3045. }
  3046. inputs.erase(index, count);
  3047. inputs = inputs.insert(index, p_name);
  3048. _apply_port_changes();
  3049. emit_changed();
  3050. }
  3051. String VisualShaderNodeGroupBase::get_input_port_name(int p_id) const {
  3052. ERR_FAIL_COND_V(!input_ports.has(p_id), "");
  3053. return input_ports[p_id].name;
  3054. }
  3055. void VisualShaderNodeGroupBase::set_output_port_type(int p_id, int p_type) {
  3056. ERR_FAIL_COND(!has_output_port(p_id));
  3057. ERR_FAIL_INDEX(p_type, int(PORT_TYPE_MAX));
  3058. if (output_ports[p_id].type == p_type) {
  3059. return;
  3060. }
  3061. Vector<String> output_strings = outputs.split(";", false);
  3062. int count = 0;
  3063. int index = 0;
  3064. for (int i = 0; i < output_strings.size(); i++) {
  3065. Vector<String> arr = output_strings[i].split(",");
  3066. ERR_FAIL_COND(arr.size() != 3);
  3067. if (arr[0].to_int() == p_id) {
  3068. index += arr[0].size();
  3069. count = arr[1].size() - 1;
  3070. break;
  3071. }
  3072. index += output_strings[i].size();
  3073. }
  3074. outputs.erase(index, count);
  3075. outputs = outputs.insert(index, itos(p_type));
  3076. _apply_port_changes();
  3077. emit_changed();
  3078. }
  3079. VisualShaderNodeGroupBase::PortType VisualShaderNodeGroupBase::get_output_port_type(int p_id) const {
  3080. ERR_FAIL_COND_V(!output_ports.has(p_id), (PortType)0);
  3081. return output_ports[p_id].type;
  3082. }
  3083. void VisualShaderNodeGroupBase::set_output_port_name(int p_id, const String &p_name) {
  3084. ERR_FAIL_COND(!has_output_port(p_id));
  3085. ERR_FAIL_COND(!is_valid_port_name(p_name));
  3086. if (output_ports[p_id].name == p_name) {
  3087. return;
  3088. }
  3089. Vector<String> output_strings = outputs.split(";", false);
  3090. int count = 0;
  3091. int index = 0;
  3092. for (int i = 0; i < output_strings.size(); i++) {
  3093. Vector<String> arr = output_strings[i].split(",");
  3094. ERR_FAIL_COND(arr.size() != 3);
  3095. if (arr[0].to_int() == p_id) {
  3096. index += arr[0].size() + arr[1].size();
  3097. count = arr[2].size() - 1;
  3098. break;
  3099. }
  3100. index += output_strings[i].size();
  3101. }
  3102. outputs.erase(index, count);
  3103. outputs = outputs.insert(index, p_name);
  3104. _apply_port_changes();
  3105. emit_changed();
  3106. }
  3107. String VisualShaderNodeGroupBase::get_output_port_name(int p_id) const {
  3108. ERR_FAIL_COND_V(!output_ports.has(p_id), "");
  3109. return output_ports[p_id].name;
  3110. }
  3111. int VisualShaderNodeGroupBase::get_free_input_port_id() const {
  3112. return input_ports.size();
  3113. }
  3114. int VisualShaderNodeGroupBase::get_free_output_port_id() const {
  3115. return output_ports.size();
  3116. }
  3117. void VisualShaderNodeGroupBase::set_ctrl_pressed(Control *p_control, int p_index) {
  3118. controls[p_index] = p_control;
  3119. }
  3120. Control *VisualShaderNodeGroupBase::is_ctrl_pressed(int p_index) {
  3121. ERR_FAIL_COND_V(!controls.has(p_index), nullptr);
  3122. return controls[p_index];
  3123. }
  3124. void VisualShaderNodeGroupBase::_apply_port_changes() {
  3125. Vector<String> inputs_strings = inputs.split(";", false);
  3126. Vector<String> outputs_strings = outputs.split(";", false);
  3127. clear_input_ports();
  3128. clear_output_ports();
  3129. for (int i = 0; i < inputs_strings.size(); i++) {
  3130. Vector<String> arr = inputs_strings[i].split(",");
  3131. ERR_FAIL_COND(arr.size() != 3);
  3132. Port port;
  3133. port.type = (PortType)arr[1].to_int();
  3134. port.name = arr[2];
  3135. input_ports[i] = port;
  3136. }
  3137. for (int i = 0; i < outputs_strings.size(); i++) {
  3138. Vector<String> arr = outputs_strings[i].split(",");
  3139. ERR_FAIL_COND(arr.size() != 3);
  3140. Port port;
  3141. port.type = (PortType)arr[1].to_int();
  3142. port.name = arr[2];
  3143. output_ports[i] = port;
  3144. }
  3145. }
  3146. void VisualShaderNodeGroupBase::set_editable(bool p_enabled) {
  3147. editable = p_enabled;
  3148. }
  3149. bool VisualShaderNodeGroupBase::is_editable() const {
  3150. return editable;
  3151. }
  3152. void VisualShaderNodeGroupBase::_bind_methods() {
  3153. ClassDB::bind_method(D_METHOD("set_inputs", "inputs"), &VisualShaderNodeGroupBase::set_inputs);
  3154. ClassDB::bind_method(D_METHOD("get_inputs"), &VisualShaderNodeGroupBase::get_inputs);
  3155. ClassDB::bind_method(D_METHOD("set_outputs", "outputs"), &VisualShaderNodeGroupBase::set_outputs);
  3156. ClassDB::bind_method(D_METHOD("get_outputs"), &VisualShaderNodeGroupBase::get_outputs);
  3157. ClassDB::bind_method(D_METHOD("is_valid_port_name", "name"), &VisualShaderNodeGroupBase::is_valid_port_name);
  3158. ClassDB::bind_method(D_METHOD("add_input_port", "id", "type", "name"), &VisualShaderNodeGroupBase::add_input_port);
  3159. ClassDB::bind_method(D_METHOD("remove_input_port", "id"), &VisualShaderNodeGroupBase::remove_input_port);
  3160. ClassDB::bind_method(D_METHOD("get_input_port_count"), &VisualShaderNodeGroupBase::get_input_port_count);
  3161. ClassDB::bind_method(D_METHOD("has_input_port", "id"), &VisualShaderNodeGroupBase::has_input_port);
  3162. ClassDB::bind_method(D_METHOD("clear_input_ports"), &VisualShaderNodeGroupBase::clear_input_ports);
  3163. ClassDB::bind_method(D_METHOD("add_output_port", "id", "type", "name"), &VisualShaderNodeGroupBase::add_output_port);
  3164. ClassDB::bind_method(D_METHOD("remove_output_port", "id"), &VisualShaderNodeGroupBase::remove_output_port);
  3165. ClassDB::bind_method(D_METHOD("get_output_port_count"), &VisualShaderNodeGroupBase::get_output_port_count);
  3166. ClassDB::bind_method(D_METHOD("has_output_port", "id"), &VisualShaderNodeGroupBase::has_output_port);
  3167. ClassDB::bind_method(D_METHOD("clear_output_ports"), &VisualShaderNodeGroupBase::clear_output_ports);
  3168. ClassDB::bind_method(D_METHOD("set_input_port_name", "id", "name"), &VisualShaderNodeGroupBase::set_input_port_name);
  3169. ClassDB::bind_method(D_METHOD("set_input_port_type", "id", "type"), &VisualShaderNodeGroupBase::set_input_port_type);
  3170. ClassDB::bind_method(D_METHOD("set_output_port_name", "id", "name"), &VisualShaderNodeGroupBase::set_output_port_name);
  3171. ClassDB::bind_method(D_METHOD("set_output_port_type", "id", "type"), &VisualShaderNodeGroupBase::set_output_port_type);
  3172. ClassDB::bind_method(D_METHOD("get_free_input_port_id"), &VisualShaderNodeGroupBase::get_free_input_port_id);
  3173. ClassDB::bind_method(D_METHOD("get_free_output_port_id"), &VisualShaderNodeGroupBase::get_free_output_port_id);
  3174. }
  3175. String VisualShaderNodeGroupBase::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 {
  3176. return "";
  3177. }
  3178. VisualShaderNodeGroupBase::VisualShaderNodeGroupBase() {
  3179. simple_decl = false;
  3180. }
  3181. ////////////// Expression
  3182. String VisualShaderNodeExpression::get_caption() const {
  3183. return "Expression";
  3184. }
  3185. void VisualShaderNodeExpression::set_expression(const String &p_expression) {
  3186. expression = p_expression;
  3187. emit_changed();
  3188. }
  3189. String VisualShaderNodeExpression::get_expression() const {
  3190. return expression;
  3191. }
  3192. String VisualShaderNodeExpression::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 {
  3193. String _expression = expression;
  3194. _expression = _expression.insert(0, "\n");
  3195. _expression = _expression.replace("\n", "\n ");
  3196. static Vector<String> pre_symbols;
  3197. if (pre_symbols.is_empty()) {
  3198. pre_symbols.push_back(" ");
  3199. pre_symbols.push_back(",");
  3200. pre_symbols.push_back(";");
  3201. pre_symbols.push_back("{");
  3202. pre_symbols.push_back("[");
  3203. pre_symbols.push_back("]");
  3204. pre_symbols.push_back("(");
  3205. pre_symbols.push_back(" ");
  3206. pre_symbols.push_back("-");
  3207. pre_symbols.push_back("*");
  3208. pre_symbols.push_back("/");
  3209. pre_symbols.push_back("+");
  3210. pre_symbols.push_back("=");
  3211. pre_symbols.push_back("&");
  3212. pre_symbols.push_back("|");
  3213. pre_symbols.push_back("!");
  3214. }
  3215. static Vector<String> post_symbols;
  3216. if (post_symbols.is_empty()) {
  3217. post_symbols.push_back(" ");
  3218. post_symbols.push_back("\n");
  3219. post_symbols.push_back(",");
  3220. post_symbols.push_back(";");
  3221. post_symbols.push_back("}");
  3222. post_symbols.push_back("[");
  3223. post_symbols.push_back("]");
  3224. post_symbols.push_back(")");
  3225. post_symbols.push_back(" ");
  3226. post_symbols.push_back(".");
  3227. post_symbols.push_back("-");
  3228. post_symbols.push_back("*");
  3229. post_symbols.push_back("/");
  3230. post_symbols.push_back("+");
  3231. post_symbols.push_back("=");
  3232. post_symbols.push_back("&");
  3233. post_symbols.push_back("|");
  3234. post_symbols.push_back("!");
  3235. }
  3236. for (int i = 0; i < get_input_port_count(); i++) {
  3237. for (int j = 0; j < pre_symbols.size(); j++) {
  3238. for (int k = 0; k < post_symbols.size(); k++) {
  3239. _expression = _expression.replace(pre_symbols[j] + get_input_port_name(i) + post_symbols[k], pre_symbols[j] + p_input_vars[i] + post_symbols[k]);
  3240. }
  3241. }
  3242. }
  3243. for (int i = 0; i < get_output_port_count(); i++) {
  3244. for (int j = 0; j < pre_symbols.size(); j++) {
  3245. for (int k = 0; k < post_symbols.size(); k++) {
  3246. _expression = _expression.replace(pre_symbols[j] + get_output_port_name(i) + post_symbols[k], pre_symbols[j] + p_output_vars[i] + post_symbols[k]);
  3247. }
  3248. }
  3249. }
  3250. String output_initializer;
  3251. for (int i = 0; i < get_output_port_count(); i++) {
  3252. int port_type = get_output_port_type(i);
  3253. String tk = "";
  3254. switch (port_type) {
  3255. case PORT_TYPE_SCALAR:
  3256. tk = "0.0";
  3257. break;
  3258. case PORT_TYPE_SCALAR_INT:
  3259. tk = "0";
  3260. break;
  3261. case PORT_TYPE_VECTOR:
  3262. tk = "vec3(0.0, 0.0, 0.0)";
  3263. break;
  3264. case PORT_TYPE_BOOLEAN:
  3265. tk = "false";
  3266. break;
  3267. case PORT_TYPE_TRANSFORM:
  3268. tk = "mat4(1.0)";
  3269. break;
  3270. default:
  3271. continue;
  3272. }
  3273. output_initializer += " " + p_output_vars[i] + " = " + tk + ";\n";
  3274. }
  3275. String code;
  3276. code += output_initializer;
  3277. code += " {";
  3278. code += _expression;
  3279. code += "\n }\n";
  3280. return code;
  3281. }
  3282. void VisualShaderNodeExpression::_bind_methods() {
  3283. ClassDB::bind_method(D_METHOD("set_expression", "expression"), &VisualShaderNodeExpression::set_expression);
  3284. ClassDB::bind_method(D_METHOD("get_expression"), &VisualShaderNodeExpression::get_expression);
  3285. ADD_PROPERTY(PropertyInfo(Variant::STRING, "expression"), "set_expression", "get_expression");
  3286. }
  3287. VisualShaderNodeExpression::VisualShaderNodeExpression() {
  3288. set_editable(true);
  3289. }
  3290. ////////////// Global Expression
  3291. String VisualShaderNodeGlobalExpression::get_caption() const {
  3292. return "GlobalExpression";
  3293. }
  3294. String VisualShaderNodeGlobalExpression::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  3295. return expression;
  3296. }
  3297. VisualShaderNodeGlobalExpression::VisualShaderNodeGlobalExpression() {
  3298. set_editable(false);
  3299. }