visual_shader_nodes.cpp 167 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553
  1. /*************************************************************************/
  2. /* visual_shader_nodes.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-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_nodes.h"
  31. ////////////// Constants Base
  32. VisualShaderNodeConstant::VisualShaderNodeConstant() {
  33. }
  34. ////////////// Scalar(Float)
  35. String VisualShaderNodeFloatConstant::get_caption() const {
  36. return "ScalarFloat";
  37. }
  38. int VisualShaderNodeFloatConstant::get_input_port_count() const {
  39. return 0;
  40. }
  41. VisualShaderNodeFloatConstant::PortType VisualShaderNodeFloatConstant::get_input_port_type(int p_port) const {
  42. return PORT_TYPE_SCALAR;
  43. }
  44. String VisualShaderNodeFloatConstant::get_input_port_name(int p_port) const {
  45. return String();
  46. }
  47. int VisualShaderNodeFloatConstant::get_output_port_count() const {
  48. return 1;
  49. }
  50. VisualShaderNodeFloatConstant::PortType VisualShaderNodeFloatConstant::get_output_port_type(int p_port) const {
  51. return PORT_TYPE_SCALAR;
  52. }
  53. String VisualShaderNodeFloatConstant::get_output_port_name(int p_port) const {
  54. return ""; //no output port means the editor will be used as port
  55. }
  56. String VisualShaderNodeFloatConstant::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 {
  57. return "\t" + p_output_vars[0] + " = " + vformat("%.6f", constant) + ";\n";
  58. }
  59. void VisualShaderNodeFloatConstant::set_constant(float p_value) {
  60. constant = p_value;
  61. emit_changed();
  62. }
  63. float VisualShaderNodeFloatConstant::get_constant() const {
  64. return constant;
  65. }
  66. Vector<StringName> VisualShaderNodeFloatConstant::get_editable_properties() const {
  67. Vector<StringName> props;
  68. props.push_back("constant");
  69. return props;
  70. }
  71. void VisualShaderNodeFloatConstant::_bind_methods() {
  72. ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeFloatConstant::set_constant);
  73. ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeFloatConstant::get_constant);
  74. ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "constant"), "set_constant", "get_constant");
  75. }
  76. VisualShaderNodeFloatConstant::VisualShaderNodeFloatConstant() {
  77. }
  78. ////////////// Scalar(Int)
  79. String VisualShaderNodeIntConstant::get_caption() const {
  80. return "ScalarInt";
  81. }
  82. int VisualShaderNodeIntConstant::get_input_port_count() const {
  83. return 0;
  84. }
  85. VisualShaderNodeIntConstant::PortType VisualShaderNodeIntConstant::get_input_port_type(int p_port) const {
  86. return PORT_TYPE_SCALAR_INT;
  87. }
  88. String VisualShaderNodeIntConstant::get_input_port_name(int p_port) const {
  89. return String();
  90. }
  91. int VisualShaderNodeIntConstant::get_output_port_count() const {
  92. return 1;
  93. }
  94. VisualShaderNodeIntConstant::PortType VisualShaderNodeIntConstant::get_output_port_type(int p_port) const {
  95. return PORT_TYPE_SCALAR_INT;
  96. }
  97. String VisualShaderNodeIntConstant::get_output_port_name(int p_port) const {
  98. return ""; //no output port means the editor will be used as port
  99. }
  100. String VisualShaderNodeIntConstant::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 {
  101. return "\t" + p_output_vars[0] + " = " + itos(constant) + ";\n";
  102. }
  103. void VisualShaderNodeIntConstant::set_constant(int p_value) {
  104. constant = p_value;
  105. emit_changed();
  106. }
  107. int VisualShaderNodeIntConstant::get_constant() const {
  108. return constant;
  109. }
  110. Vector<StringName> VisualShaderNodeIntConstant::get_editable_properties() const {
  111. Vector<StringName> props;
  112. props.push_back("constant");
  113. return props;
  114. }
  115. void VisualShaderNodeIntConstant::_bind_methods() {
  116. ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeIntConstant::set_constant);
  117. ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeIntConstant::get_constant);
  118. ADD_PROPERTY(PropertyInfo(Variant::INT, "constant"), "set_constant", "get_constant");
  119. }
  120. VisualShaderNodeIntConstant::VisualShaderNodeIntConstant() {
  121. }
  122. ////////////// Boolean
  123. String VisualShaderNodeBooleanConstant::get_caption() const {
  124. return "Boolean";
  125. }
  126. int VisualShaderNodeBooleanConstant::get_input_port_count() const {
  127. return 0;
  128. }
  129. VisualShaderNodeBooleanConstant::PortType VisualShaderNodeBooleanConstant::get_input_port_type(int p_port) const {
  130. return PORT_TYPE_BOOLEAN;
  131. }
  132. String VisualShaderNodeBooleanConstant::get_input_port_name(int p_port) const {
  133. return String();
  134. }
  135. int VisualShaderNodeBooleanConstant::get_output_port_count() const {
  136. return 1;
  137. }
  138. VisualShaderNodeBooleanConstant::PortType VisualShaderNodeBooleanConstant::get_output_port_type(int p_port) const {
  139. return PORT_TYPE_BOOLEAN;
  140. }
  141. String VisualShaderNodeBooleanConstant::get_output_port_name(int p_port) const {
  142. return ""; //no output port means the editor will be used as port
  143. }
  144. String VisualShaderNodeBooleanConstant::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  145. return "\t" + p_output_vars[0] + " = " + (constant ? "true" : "false") + ";\n";
  146. }
  147. void VisualShaderNodeBooleanConstant::set_constant(bool p_value) {
  148. constant = p_value;
  149. emit_changed();
  150. }
  151. bool VisualShaderNodeBooleanConstant::get_constant() const {
  152. return constant;
  153. }
  154. Vector<StringName> VisualShaderNodeBooleanConstant::get_editable_properties() const {
  155. Vector<StringName> props;
  156. props.push_back("constant");
  157. return props;
  158. }
  159. void VisualShaderNodeBooleanConstant::_bind_methods() {
  160. ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeBooleanConstant::set_constant);
  161. ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeBooleanConstant::get_constant);
  162. ADD_PROPERTY(PropertyInfo(Variant::BOOL, "constant"), "set_constant", "get_constant");
  163. }
  164. VisualShaderNodeBooleanConstant::VisualShaderNodeBooleanConstant() {
  165. }
  166. ////////////// Color
  167. String VisualShaderNodeColorConstant::get_caption() const {
  168. return "Color";
  169. }
  170. int VisualShaderNodeColorConstant::get_input_port_count() const {
  171. return 0;
  172. }
  173. VisualShaderNodeColorConstant::PortType VisualShaderNodeColorConstant::get_input_port_type(int p_port) const {
  174. return PORT_TYPE_VECTOR;
  175. }
  176. String VisualShaderNodeColorConstant::get_input_port_name(int p_port) const {
  177. return String();
  178. }
  179. int VisualShaderNodeColorConstant::get_output_port_count() const {
  180. return 2;
  181. }
  182. VisualShaderNodeColorConstant::PortType VisualShaderNodeColorConstant::get_output_port_type(int p_port) const {
  183. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  184. }
  185. String VisualShaderNodeColorConstant::get_output_port_name(int p_port) const {
  186. return p_port == 0 ? "" : "alpha"; //no output port means the editor will be used as port
  187. }
  188. String VisualShaderNodeColorConstant::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  189. String code;
  190. code += "\t" + p_output_vars[0] + " = " + vformat("vec3(%.6f, %.6f, %.6f)", constant.r, constant.g, constant.b) + ";\n";
  191. code += "\t" + p_output_vars[1] + " = " + vformat("%.6f", constant.a) + ";\n";
  192. return code;
  193. }
  194. void VisualShaderNodeColorConstant::set_constant(Color p_value) {
  195. constant = p_value;
  196. emit_changed();
  197. }
  198. Color VisualShaderNodeColorConstant::get_constant() const {
  199. return constant;
  200. }
  201. Vector<StringName> VisualShaderNodeColorConstant::get_editable_properties() const {
  202. Vector<StringName> props;
  203. props.push_back("constant");
  204. return props;
  205. }
  206. void VisualShaderNodeColorConstant::_bind_methods() {
  207. ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeColorConstant::set_constant);
  208. ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeColorConstant::get_constant);
  209. ADD_PROPERTY(PropertyInfo(Variant::COLOR, "constant"), "set_constant", "get_constant");
  210. }
  211. VisualShaderNodeColorConstant::VisualShaderNodeColorConstant() {
  212. }
  213. ////////////// Vector
  214. String VisualShaderNodeVec3Constant::get_caption() const {
  215. return "Vector";
  216. }
  217. int VisualShaderNodeVec3Constant::get_input_port_count() const {
  218. return 0;
  219. }
  220. VisualShaderNodeVec3Constant::PortType VisualShaderNodeVec3Constant::get_input_port_type(int p_port) const {
  221. return PORT_TYPE_VECTOR;
  222. }
  223. String VisualShaderNodeVec3Constant::get_input_port_name(int p_port) const {
  224. return String();
  225. }
  226. int VisualShaderNodeVec3Constant::get_output_port_count() const {
  227. return 1;
  228. }
  229. VisualShaderNodeVec3Constant::PortType VisualShaderNodeVec3Constant::get_output_port_type(int p_port) const {
  230. return PORT_TYPE_VECTOR;
  231. }
  232. String VisualShaderNodeVec3Constant::get_output_port_name(int p_port) const {
  233. return ""; //no output port means the editor will be used as port
  234. }
  235. String VisualShaderNodeVec3Constant::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  236. return "\t" + p_output_vars[0] + " = " + vformat("vec3(%.6f, %.6f, %.6f)", constant.x, constant.y, constant.z) + ";\n";
  237. }
  238. void VisualShaderNodeVec3Constant::set_constant(Vector3 p_value) {
  239. constant = p_value;
  240. emit_changed();
  241. }
  242. Vector3 VisualShaderNodeVec3Constant::get_constant() const {
  243. return constant;
  244. }
  245. Vector<StringName> VisualShaderNodeVec3Constant::get_editable_properties() const {
  246. Vector<StringName> props;
  247. props.push_back("constant");
  248. return props;
  249. }
  250. void VisualShaderNodeVec3Constant::_bind_methods() {
  251. ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeVec3Constant::set_constant);
  252. ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeVec3Constant::get_constant);
  253. ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "constant"), "set_constant", "get_constant");
  254. }
  255. VisualShaderNodeVec3Constant::VisualShaderNodeVec3Constant() {
  256. }
  257. ////////////// Transform
  258. String VisualShaderNodeTransformConstant::get_caption() const {
  259. return "Transform";
  260. }
  261. int VisualShaderNodeTransformConstant::get_input_port_count() const {
  262. return 0;
  263. }
  264. VisualShaderNodeTransformConstant::PortType VisualShaderNodeTransformConstant::get_input_port_type(int p_port) const {
  265. return PORT_TYPE_VECTOR;
  266. }
  267. String VisualShaderNodeTransformConstant::get_input_port_name(int p_port) const {
  268. return String();
  269. }
  270. int VisualShaderNodeTransformConstant::get_output_port_count() const {
  271. return 1;
  272. }
  273. VisualShaderNodeTransformConstant::PortType VisualShaderNodeTransformConstant::get_output_port_type(int p_port) const {
  274. return PORT_TYPE_TRANSFORM;
  275. }
  276. String VisualShaderNodeTransformConstant::get_output_port_name(int p_port) const {
  277. return ""; //no output port means the editor will be used as port
  278. }
  279. String VisualShaderNodeTransformConstant::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  280. Transform t = constant;
  281. t.basis.transpose();
  282. String code = "\t" + p_output_vars[0] + " = mat4(";
  283. code += vformat("vec4(%.6f, %.6f, %.6f, 0.0), ", t.basis[0].x, t.basis[0].y, t.basis[0].z);
  284. code += vformat("vec4(%.6f, %.6f, %.6f, 0.0), ", t.basis[1].x, t.basis[1].y, t.basis[1].z);
  285. code += vformat("vec4(%.6f, %.6f, %.6f, 0.0), ", t.basis[2].x, t.basis[2].y, t.basis[2].z);
  286. code += vformat("vec4(%.6f, %.6f, %.6f, 1.0));\n", t.origin.x, t.origin.y, t.origin.z);
  287. return code;
  288. }
  289. void VisualShaderNodeTransformConstant::set_constant(Transform p_value) {
  290. constant = p_value;
  291. emit_changed();
  292. }
  293. Transform VisualShaderNodeTransformConstant::get_constant() const {
  294. return constant;
  295. }
  296. Vector<StringName> VisualShaderNodeTransformConstant::get_editable_properties() const {
  297. Vector<StringName> props;
  298. props.push_back("constant");
  299. return props;
  300. }
  301. void VisualShaderNodeTransformConstant::_bind_methods() {
  302. ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeTransformConstant::set_constant);
  303. ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeTransformConstant::get_constant);
  304. ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM, "constant"), "set_constant", "get_constant");
  305. }
  306. VisualShaderNodeTransformConstant::VisualShaderNodeTransformConstant() {
  307. }
  308. ////////////// Texture
  309. String VisualShaderNodeTexture::get_caption() const {
  310. return "Texture2D";
  311. }
  312. int VisualShaderNodeTexture::get_input_port_count() const {
  313. return 3;
  314. }
  315. VisualShaderNodeTexture::PortType VisualShaderNodeTexture::get_input_port_type(int p_port) const {
  316. switch (p_port) {
  317. case 0:
  318. return PORT_TYPE_VECTOR;
  319. case 1:
  320. return PORT_TYPE_SCALAR;
  321. case 2:
  322. return PORT_TYPE_SAMPLER;
  323. default:
  324. return PORT_TYPE_SCALAR;
  325. }
  326. }
  327. String VisualShaderNodeTexture::get_input_port_name(int p_port) const {
  328. switch (p_port) {
  329. case 0:
  330. return "uv";
  331. case 1:
  332. return "lod";
  333. case 2:
  334. return "sampler2D";
  335. default:
  336. return "";
  337. }
  338. }
  339. int VisualShaderNodeTexture::get_output_port_count() const {
  340. return 2;
  341. }
  342. VisualShaderNodeTexture::PortType VisualShaderNodeTexture::get_output_port_type(int p_port) const {
  343. if (p_port == 0 && source == SOURCE_DEPTH) {
  344. return PORT_TYPE_SCALAR;
  345. }
  346. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  347. }
  348. String VisualShaderNodeTexture::get_output_port_name(int p_port) const {
  349. if (p_port == 0 && source == SOURCE_DEPTH) {
  350. return "depth";
  351. }
  352. return p_port == 0 ? "rgb" : "alpha";
  353. }
  354. String VisualShaderNodeTexture::get_input_port_default_hint(int p_port) const {
  355. if (p_port == 0) {
  356. return "default";
  357. }
  358. return "";
  359. }
  360. static String make_unique_id(VisualShader::Type p_type, int p_id, const String &p_name) {
  361. static const char *typepf[VisualShader::TYPE_MAX] = { "vtx", "frg", "lgt" };
  362. return p_name + "_" + String(typepf[p_type]) + "_" + itos(p_id);
  363. }
  364. Vector<VisualShader::DefaultTextureParam> VisualShaderNodeTexture::get_default_texture_parameters(VisualShader::Type p_type, int p_id) const {
  365. VisualShader::DefaultTextureParam dtp;
  366. dtp.name = make_unique_id(p_type, p_id, "tex");
  367. dtp.param = texture;
  368. Vector<VisualShader::DefaultTextureParam> ret;
  369. ret.push_back(dtp);
  370. return ret;
  371. }
  372. String VisualShaderNodeTexture::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  373. if (source == SOURCE_TEXTURE) {
  374. String u = "uniform sampler2D " + make_unique_id(p_type, p_id, "tex");
  375. switch (texture_type) {
  376. case TYPE_DATA:
  377. break;
  378. case TYPE_COLOR:
  379. u += " : hint_albedo";
  380. break;
  381. case TYPE_NORMAL_MAP:
  382. u += " : hint_normal";
  383. break;
  384. }
  385. return u + ";\n";
  386. }
  387. return String();
  388. }
  389. String VisualShaderNodeTexture::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  390. String default_uv;
  391. if (p_mode != Shader::MODE_PARTICLES && p_mode != Shader::MODE_SKY) {
  392. default_uv = "UV.xy";
  393. } else {
  394. default_uv = "vec2(0.0)";
  395. }
  396. if (source == SOURCE_TEXTURE) {
  397. String id = make_unique_id(p_type, p_id, "tex");
  398. String code;
  399. if (p_input_vars[0] == String()) { // Use UV by default.
  400. if (p_input_vars[1] == String()) {
  401. code += "\tvec4 " + id + "_read = texture(" + id + ", " + default_uv + ");\n";
  402. } else {
  403. code += "\tvec4 " + id + "_read = textureLod(" + id + ", " + default_uv + ", " + p_input_vars[1] + ");\n";
  404. }
  405. } else if (p_input_vars[1] == String()) {
  406. //no lod
  407. code += "\tvec4 " + id + "_read = texture(" + id + ", " + p_input_vars[0] + ".xy);\n";
  408. } else {
  409. code += "\tvec4 " + id + "_read = textureLod(" + id + ", " + p_input_vars[0] + ".xy, " + p_input_vars[1] + ");\n";
  410. }
  411. code += "\t" + p_output_vars[0] + " = " + id + "_read.rgb;\n";
  412. code += "\t" + p_output_vars[1] + " = " + id + "_read.a;\n";
  413. return code;
  414. }
  415. if (source == SOURCE_PORT) {
  416. String id = p_input_vars[2];
  417. String code;
  418. code += "\t{\n";
  419. if (id == String()) {
  420. code += "\t\tvec4 " + id + "_tex_read = vec4(0.0);\n";
  421. } else {
  422. if (p_input_vars[0] == String()) { // Use UV by default.
  423. if (p_input_vars[1] == String()) {
  424. code += "\t\tvec4 " + id + "_tex_read = texture(" + id + ", " + default_uv + ");\n";
  425. } else {
  426. code += "\t\tvec4 " + id + "_tex_read = textureLod(" + id + ", " + default_uv + ", " + p_input_vars[1] + ");\n";
  427. }
  428. } else if (p_input_vars[1] == String()) {
  429. //no lod
  430. code += "\t\tvec4 " + id + "_tex_read = texture(" + id + ", " + p_input_vars[0] + ".xy);\n";
  431. } else {
  432. code += "\t\tvec4 " + id + "_tex_read = textureLod(" + id + ", " + p_input_vars[0] + ".xy, " + p_input_vars[1] + ");\n";
  433. }
  434. code += "\t\t" + p_output_vars[0] + " = " + id + "_tex_read.rgb;\n";
  435. code += "\t\t" + p_output_vars[1] + " = " + id + "_tex_read.a;\n";
  436. }
  437. code += "\t}\n";
  438. return code;
  439. }
  440. if (source == SOURCE_SCREEN && (p_mode == Shader::MODE_SPATIAL || p_mode == Shader::MODE_CANVAS_ITEM) && p_type == VisualShader::TYPE_FRAGMENT) {
  441. String code = "\t{\n";
  442. if (p_input_vars[0] == String() || p_for_preview) { // Use UV by default.
  443. if (p_input_vars[1] == String()) {
  444. code += "\t\tvec4 _tex_read = textureLod(SCREEN_TEXTURE, " + default_uv + ", 0.0 );\n";
  445. } else {
  446. code += "\t\tvec4 _tex_read = textureLod(SCREEN_TEXTURE, " + default_uv + ", " + p_input_vars[1] + ");\n";
  447. }
  448. } else if (p_input_vars[1] == String()) {
  449. //no lod
  450. code += "\t\tvec4 _tex_read = textureLod(SCREEN_TEXTURE, " + p_input_vars[0] + ".xy, 0.0);\n";
  451. } else {
  452. code += "\t\tvec4 _tex_read = textureLod(SCREEN_TEXTURE, " + p_input_vars[0] + ".xy, " + p_input_vars[1] + ");\n";
  453. }
  454. code += "\t\t" + p_output_vars[0] + " = _tex_read.rgb;\n";
  455. code += "\t\t" + p_output_vars[1] + " = _tex_read.a;\n";
  456. code += "\t}\n";
  457. return code;
  458. }
  459. if (source == SOURCE_2D_TEXTURE && p_mode == Shader::MODE_CANVAS_ITEM && p_type == VisualShader::TYPE_FRAGMENT) {
  460. String code = "\t{\n";
  461. if (p_input_vars[0] == String()) { // Use UV by default.
  462. if (p_input_vars[1] == String()) {
  463. code += "\t\tvec4 _tex_read = texture(TEXTURE, " + default_uv + ");\n";
  464. } else {
  465. code += "\t\tvec4 _tex_read = textureLod(TEXTURE, " + default_uv + ", " + p_input_vars[1] + ");\n";
  466. }
  467. } else if (p_input_vars[1] == String()) {
  468. //no lod
  469. code += "\t\tvec4 _tex_read = texture(TEXTURE, " + p_input_vars[0] + ".xy);\n";
  470. } else {
  471. code += "\t\tvec4 _tex_read = textureLod(TEXTURE, " + p_input_vars[0] + ".xy, " + p_input_vars[1] + ");\n";
  472. }
  473. code += "\t\t" + p_output_vars[0] + " = _tex_read.rgb;\n";
  474. code += "\t\t" + p_output_vars[1] + " = _tex_read.a;\n";
  475. code += "\t}\n";
  476. return code;
  477. }
  478. if (source == SOURCE_2D_NORMAL && p_mode == Shader::MODE_CANVAS_ITEM && p_type == VisualShader::TYPE_FRAGMENT) {
  479. String code = "\t{\n";
  480. if (p_input_vars[0] == String()) { // Use UV by default.
  481. if (p_input_vars[1] == String()) {
  482. code += "\t\tvec4 _tex_read = texture(NORMAL_TEXTURE, " + default_uv + ");\n";
  483. } else {
  484. code += "\t\tvec4 _tex_read = textureLod(NORMAL_TEXTURE, " + default_uv + ", " + p_input_vars[1] + ");\n";
  485. }
  486. } else if (p_input_vars[1] == String()) {
  487. //no lod
  488. code += "\t\tvec4 _tex_read = texture(NORMAL_TEXTURE, " + p_input_vars[0] + ".xy);\n";
  489. } else {
  490. code += "\t\tvec4 _tex_read = textureLod(NORMAL_TEXTURE, " + p_input_vars[0] + ".xy, " + p_input_vars[1] + ");\n";
  491. }
  492. code += "\t\t" + p_output_vars[0] + " = _tex_read.rgb;\n";
  493. code += "\t\t" + p_output_vars[1] + " = _tex_read.a;\n";
  494. code += "\t}\n";
  495. return code;
  496. }
  497. if (p_for_preview) // DEPTH_TEXTURE is not supported in preview(canvas_item) shader
  498. {
  499. if (source == SOURCE_DEPTH) {
  500. String code;
  501. code += "\t" + p_output_vars[0] + " = 0.0;\n";
  502. code += "\t" + p_output_vars[1] + " = 1.0;\n";
  503. return code;
  504. }
  505. }
  506. if (source == SOURCE_DEPTH && p_mode == Shader::MODE_SPATIAL && p_type == VisualShader::TYPE_FRAGMENT) {
  507. String code = "\t{\n";
  508. if (p_input_vars[0] == String()) { // Use UV by default.
  509. if (p_input_vars[1] == String()) {
  510. code += "\t\tfloat _depth = texture(DEPTH_TEXTURE, " + default_uv + ").r;\n";
  511. } else {
  512. code += "\t\tfloat _depth = textureLod(DEPTH_TEXTURE, " + default_uv + ", " + p_input_vars[1] + ").r;\n";
  513. }
  514. } else if (p_input_vars[1] == String()) {
  515. //no lod
  516. code += "\t\tfloat _depth = texture(DEPTH_TEXTURE, " + p_input_vars[0] + ".xy).r;\n";
  517. } else {
  518. code += "\t\tfloat _depth = textureLod(DEPTH_TEXTURE, " + p_input_vars[0] + ".xy, " + p_input_vars[1] + ").r;\n";
  519. }
  520. code += "\t\t" + p_output_vars[0] + " = _depth;\n";
  521. code += "\t\t" + p_output_vars[1] + " = 1.0;\n";
  522. code += "\t}\n";
  523. return code;
  524. } else if (source == SOURCE_DEPTH) {
  525. String code;
  526. code += "\t" + p_output_vars[0] + " = 0.0;\n";
  527. code += "\t" + p_output_vars[1] + " = 1.0;\n";
  528. return code;
  529. }
  530. //none
  531. String code;
  532. code += "\t" + p_output_vars[0] + " = vec3(0.0);\n";
  533. code += "\t" + p_output_vars[1] + " = 1.0;\n";
  534. return code;
  535. }
  536. void VisualShaderNodeTexture::set_source(Source p_source) {
  537. source = p_source;
  538. switch (source) {
  539. case SOURCE_TEXTURE:
  540. simple_decl = true;
  541. break;
  542. case SOURCE_SCREEN:
  543. simple_decl = false;
  544. break;
  545. case SOURCE_2D_TEXTURE:
  546. simple_decl = false;
  547. break;
  548. case SOURCE_2D_NORMAL:
  549. simple_decl = false;
  550. break;
  551. case SOURCE_DEPTH:
  552. simple_decl = false;
  553. break;
  554. case SOURCE_PORT:
  555. simple_decl = false;
  556. break;
  557. }
  558. emit_changed();
  559. emit_signal("editor_refresh_request");
  560. }
  561. VisualShaderNodeTexture::Source VisualShaderNodeTexture::get_source() const {
  562. return source;
  563. }
  564. void VisualShaderNodeTexture::set_texture(Ref<Texture2D> p_value) {
  565. texture = p_value;
  566. emit_changed();
  567. }
  568. Ref<Texture2D> VisualShaderNodeTexture::get_texture() const {
  569. return texture;
  570. }
  571. void VisualShaderNodeTexture::set_texture_type(TextureType p_type) {
  572. texture_type = p_type;
  573. emit_changed();
  574. }
  575. VisualShaderNodeTexture::TextureType VisualShaderNodeTexture::get_texture_type() const {
  576. return texture_type;
  577. }
  578. Vector<StringName> VisualShaderNodeTexture::get_editable_properties() const {
  579. Vector<StringName> props;
  580. props.push_back("source");
  581. if (source == SOURCE_TEXTURE) {
  582. props.push_back("texture");
  583. props.push_back("texture_type");
  584. }
  585. return props;
  586. }
  587. String VisualShaderNodeTexture::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const {
  588. if (is_input_port_connected(2) && source != SOURCE_PORT) {
  589. return TTR("The sampler port is connected but not used. Consider changing the source to 'SamplerPort'.");
  590. }
  591. if (source == SOURCE_TEXTURE) {
  592. return String(); // all good
  593. }
  594. if (source == SOURCE_PORT) {
  595. return String(); // all good
  596. }
  597. if (source == SOURCE_SCREEN && (p_mode == Shader::MODE_SPATIAL || p_mode == Shader::MODE_CANVAS_ITEM) && p_type == VisualShader::TYPE_FRAGMENT) {
  598. return String(); // all good
  599. }
  600. if (source == SOURCE_2D_TEXTURE && p_mode == Shader::MODE_CANVAS_ITEM && p_type == VisualShader::TYPE_FRAGMENT) {
  601. return String(); // all good
  602. }
  603. if (source == SOURCE_2D_NORMAL && p_mode == Shader::MODE_CANVAS_ITEM) {
  604. return String(); // all good
  605. }
  606. if (source == SOURCE_DEPTH && p_mode == Shader::MODE_SPATIAL && p_type == VisualShader::TYPE_FRAGMENT) {
  607. if (get_output_port_for_preview() == 0) { // DEPTH_TEXTURE is not supported in preview(canvas_item) shader
  608. return TTR("Invalid source for preview.");
  609. }
  610. return String(); // all good
  611. }
  612. return TTR("Invalid source for shader.");
  613. }
  614. void VisualShaderNodeTexture::_bind_methods() {
  615. ClassDB::bind_method(D_METHOD("set_source", "value"), &VisualShaderNodeTexture::set_source);
  616. ClassDB::bind_method(D_METHOD("get_source"), &VisualShaderNodeTexture::get_source);
  617. ClassDB::bind_method(D_METHOD("set_texture", "value"), &VisualShaderNodeTexture::set_texture);
  618. ClassDB::bind_method(D_METHOD("get_texture"), &VisualShaderNodeTexture::get_texture);
  619. ClassDB::bind_method(D_METHOD("set_texture_type", "value"), &VisualShaderNodeTexture::set_texture_type);
  620. ClassDB::bind_method(D_METHOD("get_texture_type"), &VisualShaderNodeTexture::get_texture_type);
  621. ADD_PROPERTY(PropertyInfo(Variant::INT, "source", PROPERTY_HINT_ENUM, "Texture,Screen,Texture2D,NormalMap2D,Depth,SamplerPort"), "set_source", "get_source");
  622. ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_texture", "get_texture");
  623. ADD_PROPERTY(PropertyInfo(Variant::INT, "texture_type", PROPERTY_HINT_ENUM, "Data,Color,Normalmap"), "set_texture_type", "get_texture_type");
  624. BIND_ENUM_CONSTANT(SOURCE_TEXTURE);
  625. BIND_ENUM_CONSTANT(SOURCE_SCREEN);
  626. BIND_ENUM_CONSTANT(SOURCE_2D_TEXTURE);
  627. BIND_ENUM_CONSTANT(SOURCE_2D_NORMAL);
  628. BIND_ENUM_CONSTANT(SOURCE_DEPTH);
  629. BIND_ENUM_CONSTANT(SOURCE_PORT);
  630. BIND_ENUM_CONSTANT(TYPE_DATA);
  631. BIND_ENUM_CONSTANT(TYPE_COLOR);
  632. BIND_ENUM_CONSTANT(TYPE_NORMAL_MAP);
  633. }
  634. VisualShaderNodeTexture::VisualShaderNodeTexture() {
  635. }
  636. ////////////// Curve
  637. String VisualShaderNodeCurveTexture::get_caption() const {
  638. return "CurveTexture";
  639. }
  640. int VisualShaderNodeCurveTexture::get_input_port_count() const {
  641. return 1;
  642. }
  643. VisualShaderNodeCurveTexture::PortType VisualShaderNodeCurveTexture::get_input_port_type(int p_port) const {
  644. return PORT_TYPE_SCALAR;
  645. }
  646. String VisualShaderNodeCurveTexture::get_input_port_name(int p_port) const {
  647. return String();
  648. }
  649. int VisualShaderNodeCurveTexture::get_output_port_count() const {
  650. return 1;
  651. }
  652. VisualShaderNodeCurveTexture::PortType VisualShaderNodeCurveTexture::get_output_port_type(int p_port) const {
  653. return PORT_TYPE_SCALAR;
  654. }
  655. String VisualShaderNodeCurveTexture::get_output_port_name(int p_port) const {
  656. return String();
  657. }
  658. void VisualShaderNodeCurveTexture::set_texture(Ref<CurveTexture> p_texture) {
  659. texture = p_texture;
  660. emit_changed();
  661. }
  662. Ref<CurveTexture> VisualShaderNodeCurveTexture::get_texture() const {
  663. return texture;
  664. }
  665. Vector<StringName> VisualShaderNodeCurveTexture::get_editable_properties() const {
  666. Vector<StringName> props;
  667. props.push_back("texture");
  668. return props;
  669. }
  670. String VisualShaderNodeCurveTexture::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  671. return "uniform sampler2D " + make_unique_id(p_type, p_id, "curve") + ";\n";
  672. }
  673. String VisualShaderNodeCurveTexture::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 {
  674. if (p_input_vars[0] == String()) {
  675. return "\t" + p_output_vars[0] + " = 0.0;\n";
  676. }
  677. String id = make_unique_id(p_type, p_id, "curve");
  678. String code;
  679. code += "\t" + p_output_vars[0] + " = texture(" + id + ", vec2(" + p_input_vars[0] + ", 0.0)).r;\n";
  680. return code;
  681. }
  682. Vector<VisualShader::DefaultTextureParam> VisualShaderNodeCurveTexture::get_default_texture_parameters(VisualShader::Type p_type, int p_id) const {
  683. VisualShader::DefaultTextureParam dtp;
  684. dtp.name = make_unique_id(p_type, p_id, "curve");
  685. dtp.param = texture;
  686. Vector<VisualShader::DefaultTextureParam> ret;
  687. ret.push_back(dtp);
  688. return ret;
  689. }
  690. void VisualShaderNodeCurveTexture::_bind_methods() {
  691. ClassDB::bind_method(D_METHOD("set_texture", "texture"), &VisualShaderNodeCurveTexture::set_texture);
  692. ClassDB::bind_method(D_METHOD("get_texture"), &VisualShaderNodeCurveTexture::get_texture);
  693. ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "CurveTexture"), "set_texture", "get_texture");
  694. }
  695. bool VisualShaderNodeCurveTexture::is_use_prop_slots() const {
  696. return true;
  697. }
  698. VisualShaderNodeCurveTexture::VisualShaderNodeCurveTexture() {
  699. simple_decl = true;
  700. allow_v_resize = false;
  701. }
  702. ////////////// Sample3D
  703. int VisualShaderNodeSample3D::get_input_port_count() const {
  704. return 3;
  705. }
  706. VisualShaderNodeSample3D::PortType VisualShaderNodeSample3D::get_input_port_type(int p_port) const {
  707. switch (p_port) {
  708. case 0:
  709. return PORT_TYPE_VECTOR;
  710. case 1:
  711. return PORT_TYPE_SCALAR;
  712. case 2:
  713. return PORT_TYPE_SAMPLER;
  714. default:
  715. return PORT_TYPE_SCALAR;
  716. }
  717. }
  718. String VisualShaderNodeSample3D::get_input_port_name(int p_port) const {
  719. switch (p_port) {
  720. case 0:
  721. return "uvw";
  722. case 1:
  723. return "lod";
  724. default:
  725. return "";
  726. }
  727. }
  728. int VisualShaderNodeSample3D::get_output_port_count() const {
  729. return 2;
  730. }
  731. VisualShaderNodeSample3D::PortType VisualShaderNodeSample3D::get_output_port_type(int p_port) const {
  732. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  733. }
  734. String VisualShaderNodeSample3D::get_output_port_name(int p_port) const {
  735. return p_port == 0 ? "rgb" : "alpha";
  736. }
  737. String VisualShaderNodeSample3D::get_input_port_default_hint(int p_port) const {
  738. if (p_port == 0) {
  739. return "default";
  740. }
  741. return "";
  742. }
  743. String VisualShaderNodeSample3D::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 {
  744. String default_uv;
  745. if (p_mode != Shader::MODE_PARTICLES && p_mode != Shader::MODE_SKY) {
  746. default_uv = "vec3(UV, 0.0)";
  747. } else {
  748. default_uv = "vec3(0.0)";
  749. }
  750. String code;
  751. if (source == SOURCE_TEXTURE || source == SOURCE_PORT) {
  752. String id;
  753. code += "\t{\n";
  754. if (source == SOURCE_TEXTURE) {
  755. id = make_unique_id(p_type, p_id, "tex3d");
  756. } else {
  757. id = p_input_vars[2];
  758. }
  759. if (id != String()) {
  760. if (p_input_vars[0] == String()) { // Use UV by default.
  761. if (p_input_vars[1] == String()) {
  762. code += "\t\tvec4 " + id + "_tex_read = texture(" + id + ", " + default_uv + ");\n";
  763. } else {
  764. code += "\t\tvec4 " + id + "_tex_read = textureLod(" + id + ", " + default_uv + ", " + p_input_vars[1] + ");\n";
  765. }
  766. } else if (p_input_vars[1] == String()) {
  767. //no lod
  768. code += "\t\tvec4 " + id + "_tex_read = texture(" + id + ", " + p_input_vars[0] + ");\n";
  769. } else {
  770. code += "\t\tvec4 " + id + "_tex_read = textureLod(" + id + ", " + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  771. }
  772. } else {
  773. code += "\t\tvec4 " + id + "_tex_read = vec4(0.0);\n";
  774. }
  775. code += "\t\t" + p_output_vars[0] + " = " + id + "_tex_read.rgb;\n";
  776. code += "\t\t" + p_output_vars[1] + " = " + id + "_tex_read.a;\n";
  777. code += "\t}\n";
  778. return code;
  779. }
  780. code += "\t" + p_output_vars[0] + " = vec3(0.0);\n";
  781. code += "\t" + p_output_vars[1] + " = 1.0;\n";
  782. return code;
  783. }
  784. void VisualShaderNodeSample3D::set_source(Source p_source) {
  785. source = p_source;
  786. emit_changed();
  787. emit_signal("editor_refresh_request");
  788. }
  789. VisualShaderNodeSample3D::Source VisualShaderNodeSample3D::get_source() const {
  790. return source;
  791. }
  792. void VisualShaderNodeSample3D::_bind_methods() {
  793. ClassDB::bind_method(D_METHOD("set_source", "value"), &VisualShaderNodeSample3D::set_source);
  794. ClassDB::bind_method(D_METHOD("get_source"), &VisualShaderNodeSample3D::get_source);
  795. ADD_PROPERTY(PropertyInfo(Variant::INT, "source", PROPERTY_HINT_ENUM, "Texture,SamplerPort"), "set_source", "get_source");
  796. BIND_ENUM_CONSTANT(SOURCE_TEXTURE);
  797. BIND_ENUM_CONSTANT(SOURCE_PORT);
  798. }
  799. String VisualShaderNodeSample3D::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const {
  800. if (is_input_port_connected(2) && source != SOURCE_PORT) {
  801. return TTR("The sampler port is connected but not used. Consider changing the source to 'SamplerPort'.");
  802. }
  803. if (source == SOURCE_TEXTURE) {
  804. return String(); // all good
  805. }
  806. if (source == SOURCE_PORT) {
  807. return String(); // all good
  808. }
  809. return TTR("Invalid source for shader.");
  810. }
  811. VisualShaderNodeSample3D::VisualShaderNodeSample3D() {
  812. simple_decl = false;
  813. }
  814. ////////////// Texture2DArray
  815. String VisualShaderNodeTexture2DArray::get_caption() const {
  816. return "Texture2DArray";
  817. }
  818. String VisualShaderNodeTexture2DArray::get_input_port_name(int p_port) const {
  819. if (p_port == 2) {
  820. return "sampler2DArray";
  821. }
  822. return VisualShaderNodeSample3D::get_input_port_name(p_port);
  823. }
  824. Vector<VisualShader::DefaultTextureParam> VisualShaderNodeTexture2DArray::get_default_texture_parameters(VisualShader::Type p_type, int p_id) const {
  825. VisualShader::DefaultTextureParam dtp;
  826. dtp.name = make_unique_id(p_type, p_id, "tex3d");
  827. dtp.param = texture;
  828. Vector<VisualShader::DefaultTextureParam> ret;
  829. ret.push_back(dtp);
  830. return ret;
  831. }
  832. String VisualShaderNodeTexture2DArray::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  833. if (source == SOURCE_TEXTURE) {
  834. return "uniform sampler2DArray " + make_unique_id(p_type, p_id, "tex3d") + ";\n";
  835. }
  836. return String();
  837. }
  838. void VisualShaderNodeTexture2DArray::set_texture_array(Ref<Texture2DArray> p_value) {
  839. texture = p_value;
  840. emit_changed();
  841. }
  842. Ref<Texture2DArray> VisualShaderNodeTexture2DArray::get_texture_array() const {
  843. return texture;
  844. }
  845. Vector<StringName> VisualShaderNodeTexture2DArray::get_editable_properties() const {
  846. Vector<StringName> props;
  847. props.push_back("source");
  848. if (source == SOURCE_TEXTURE) {
  849. props.push_back("texture_array");
  850. }
  851. return props;
  852. }
  853. void VisualShaderNodeTexture2DArray::_bind_methods() {
  854. ClassDB::bind_method(D_METHOD("set_texture_array", "value"), &VisualShaderNodeTexture2DArray::set_texture_array);
  855. ClassDB::bind_method(D_METHOD("get_texture_array"), &VisualShaderNodeTexture2DArray::get_texture_array);
  856. ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture_array", PROPERTY_HINT_RESOURCE_TYPE, "Texture2DArray"), "set_texture_array", "get_texture_array");
  857. }
  858. VisualShaderNodeTexture2DArray::VisualShaderNodeTexture2DArray() {
  859. }
  860. ////////////// Texture3D
  861. String VisualShaderNodeTexture3D::get_caption() const {
  862. return "Texture3D";
  863. }
  864. String VisualShaderNodeTexture3D::get_input_port_name(int p_port) const {
  865. if (p_port == 2) {
  866. return "sampler3D";
  867. }
  868. return VisualShaderNodeSample3D::get_input_port_name(p_port);
  869. }
  870. Vector<VisualShader::DefaultTextureParam> VisualShaderNodeTexture3D::get_default_texture_parameters(VisualShader::Type p_type, int p_id) const {
  871. VisualShader::DefaultTextureParam dtp;
  872. dtp.name = make_unique_id(p_type, p_id, "tex3d");
  873. dtp.param = texture;
  874. Vector<VisualShader::DefaultTextureParam> ret;
  875. ret.push_back(dtp);
  876. return ret;
  877. }
  878. String VisualShaderNodeTexture3D::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  879. if (source == SOURCE_TEXTURE) {
  880. return "uniform sampler3D " + make_unique_id(p_type, p_id, "tex3d") + ";\n";
  881. }
  882. return String();
  883. }
  884. void VisualShaderNodeTexture3D::set_texture(Ref<Texture3D> p_value) {
  885. texture = p_value;
  886. emit_changed();
  887. }
  888. Ref<Texture3D> VisualShaderNodeTexture3D::get_texture() const {
  889. return texture;
  890. }
  891. Vector<StringName> VisualShaderNodeTexture3D::get_editable_properties() const {
  892. Vector<StringName> props;
  893. props.push_back("source");
  894. if (source == SOURCE_TEXTURE) {
  895. props.push_back("texture");
  896. }
  897. return props;
  898. }
  899. void VisualShaderNodeTexture3D::_bind_methods() {
  900. ClassDB::bind_method(D_METHOD("set_texture", "value"), &VisualShaderNodeTexture3D::set_texture);
  901. ClassDB::bind_method(D_METHOD("get_texture"), &VisualShaderNodeTexture3D::get_texture);
  902. ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture3D"), "set_texture", "get_texture");
  903. }
  904. VisualShaderNodeTexture3D::VisualShaderNodeTexture3D() {
  905. }
  906. ////////////// Cubemap
  907. String VisualShaderNodeCubemap::get_caption() const {
  908. return "Cubemap";
  909. }
  910. int VisualShaderNodeCubemap::get_input_port_count() const {
  911. return 3;
  912. }
  913. VisualShaderNodeCubemap::PortType VisualShaderNodeCubemap::get_input_port_type(int p_port) const {
  914. switch (p_port) {
  915. case 0:
  916. return PORT_TYPE_VECTOR;
  917. case 1:
  918. return PORT_TYPE_SCALAR;
  919. case 2:
  920. return PORT_TYPE_SAMPLER;
  921. default:
  922. return PORT_TYPE_SCALAR;
  923. }
  924. }
  925. String VisualShaderNodeCubemap::get_input_port_name(int p_port) const {
  926. switch (p_port) {
  927. case 0:
  928. return "uv";
  929. case 1:
  930. return "lod";
  931. case 2:
  932. return "samplerCube";
  933. default:
  934. return "";
  935. }
  936. }
  937. int VisualShaderNodeCubemap::get_output_port_count() const {
  938. return 2;
  939. }
  940. VisualShaderNodeCubemap::PortType VisualShaderNodeCubemap::get_output_port_type(int p_port) const {
  941. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  942. }
  943. String VisualShaderNodeCubemap::get_output_port_name(int p_port) const {
  944. return p_port == 0 ? "rgb" : "alpha";
  945. }
  946. Vector<VisualShader::DefaultTextureParam> VisualShaderNodeCubemap::get_default_texture_parameters(VisualShader::Type p_type, int p_id) const {
  947. VisualShader::DefaultTextureParam dtp;
  948. dtp.name = make_unique_id(p_type, p_id, "cube");
  949. dtp.param = cube_map;
  950. Vector<VisualShader::DefaultTextureParam> ret;
  951. ret.push_back(dtp);
  952. return ret;
  953. }
  954. String VisualShaderNodeCubemap::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  955. if (source == SOURCE_TEXTURE) {
  956. String u = "uniform samplerCube " + make_unique_id(p_type, p_id, "cube");
  957. switch (texture_type) {
  958. case TYPE_DATA:
  959. break;
  960. case TYPE_COLOR:
  961. u += " : hint_albedo";
  962. break;
  963. case TYPE_NORMAL_MAP:
  964. u += " : hint_normal";
  965. break;
  966. }
  967. return u + ";\n";
  968. }
  969. return String();
  970. }
  971. String VisualShaderNodeCubemap::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  972. String default_uv;
  973. if (p_mode != Shader::MODE_PARTICLES && p_mode != Shader::MODE_SKY) {
  974. default_uv = "vec3(UV, 0.0)";
  975. } else {
  976. default_uv = "vec3(0.0)";
  977. }
  978. String code;
  979. String id;
  980. if (source == SOURCE_TEXTURE) {
  981. id = make_unique_id(p_type, p_id, "cube");
  982. } else if (source == SOURCE_PORT) {
  983. id = p_input_vars[2];
  984. } else {
  985. return String();
  986. }
  987. code += "\t{\n";
  988. if (id == String()) {
  989. code += "\t\tvec4 " + id + "_read = vec4(0.0);\n";
  990. code += "\t\t" + p_output_vars[0] + " = " + id + "_read.rgb;\n";
  991. code += "\t\t" + p_output_vars[1] + " = " + id + "_read.a;\n";
  992. code += "\t}\n";
  993. return code;
  994. }
  995. if (p_input_vars[0] == String()) { // Use UV by default.
  996. if (p_input_vars[1] == String()) {
  997. code += "\t\tvec4 " + id + "_read = texture(" + id + ", " + default_uv + ");\n";
  998. } else {
  999. code += "\t\tvec4 " + id + "_read = textureLod(" + id + ", " + default_uv + ", " + p_input_vars[1] + " );\n";
  1000. }
  1001. } else if (p_input_vars[1] == String()) {
  1002. //no lod
  1003. code += "\t\tvec4 " + id + "_read = texture(" + id + ", " + p_input_vars[0] + ");\n";
  1004. } else {
  1005. code += "\t\tvec4 " + id + "_read = textureLod(" + id + ", " + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1006. }
  1007. code += "\t\t" + p_output_vars[0] + " = " + id + "_read.rgb;\n";
  1008. code += "\t\t" + p_output_vars[1] + " = " + id + "_read.a;\n";
  1009. code += "\t}\n";
  1010. return code;
  1011. }
  1012. String VisualShaderNodeCubemap::get_input_port_default_hint(int p_port) const {
  1013. if (p_port == 0) {
  1014. return "default";
  1015. }
  1016. return "";
  1017. }
  1018. void VisualShaderNodeCubemap::set_source(Source p_source) {
  1019. source = p_source;
  1020. emit_changed();
  1021. emit_signal("editor_refresh_request");
  1022. }
  1023. VisualShaderNodeCubemap::Source VisualShaderNodeCubemap::get_source() const {
  1024. return source;
  1025. }
  1026. void VisualShaderNodeCubemap::set_cube_map(Ref<Cubemap> p_value) {
  1027. cube_map = p_value;
  1028. emit_changed();
  1029. }
  1030. Ref<Cubemap> VisualShaderNodeCubemap::get_cube_map() const {
  1031. return cube_map;
  1032. }
  1033. void VisualShaderNodeCubemap::set_texture_type(TextureType p_type) {
  1034. texture_type = p_type;
  1035. emit_changed();
  1036. }
  1037. VisualShaderNodeCubemap::TextureType VisualShaderNodeCubemap::get_texture_type() const {
  1038. return texture_type;
  1039. }
  1040. Vector<StringName> VisualShaderNodeCubemap::get_editable_properties() const {
  1041. Vector<StringName> props;
  1042. props.push_back("source");
  1043. if (source == SOURCE_TEXTURE) {
  1044. props.push_back("cube_map");
  1045. props.push_back("texture_type");
  1046. }
  1047. return props;
  1048. }
  1049. String VisualShaderNodeCubemap::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const {
  1050. if (is_input_port_connected(2) && source != SOURCE_PORT) {
  1051. return TTR("The sampler port is connected but not used. Consider changing the source to 'SamplerPort'.");
  1052. }
  1053. return String();
  1054. }
  1055. void VisualShaderNodeCubemap::_bind_methods() {
  1056. ClassDB::bind_method(D_METHOD("set_source", "value"), &VisualShaderNodeCubemap::set_source);
  1057. ClassDB::bind_method(D_METHOD("get_source"), &VisualShaderNodeCubemap::get_source);
  1058. ClassDB::bind_method(D_METHOD("set_cube_map", "value"), &VisualShaderNodeCubemap::set_cube_map);
  1059. ClassDB::bind_method(D_METHOD("get_cube_map"), &VisualShaderNodeCubemap::get_cube_map);
  1060. ClassDB::bind_method(D_METHOD("set_texture_type", "value"), &VisualShaderNodeCubemap::set_texture_type);
  1061. ClassDB::bind_method(D_METHOD("get_texture_type"), &VisualShaderNodeCubemap::get_texture_type);
  1062. ADD_PROPERTY(PropertyInfo(Variant::INT, "source", PROPERTY_HINT_ENUM, "Texture,SamplerPort"), "set_source", "get_source");
  1063. ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "cube_map", PROPERTY_HINT_RESOURCE_TYPE, "Cubemap"), "set_cube_map", "get_cube_map");
  1064. ADD_PROPERTY(PropertyInfo(Variant::INT, "texture_type", PROPERTY_HINT_ENUM, "Data,Color,Normalmap"), "set_texture_type", "get_texture_type");
  1065. BIND_ENUM_CONSTANT(SOURCE_TEXTURE);
  1066. BIND_ENUM_CONSTANT(SOURCE_PORT);
  1067. BIND_ENUM_CONSTANT(TYPE_DATA);
  1068. BIND_ENUM_CONSTANT(TYPE_COLOR);
  1069. BIND_ENUM_CONSTANT(TYPE_NORMAL_MAP);
  1070. }
  1071. VisualShaderNodeCubemap::VisualShaderNodeCubemap() {
  1072. simple_decl = false;
  1073. }
  1074. ////////////// Float Op
  1075. String VisualShaderNodeFloatOp::get_caption() const {
  1076. return "FloatOp";
  1077. }
  1078. int VisualShaderNodeFloatOp::get_input_port_count() const {
  1079. return 2;
  1080. }
  1081. VisualShaderNodeFloatOp::PortType VisualShaderNodeFloatOp::get_input_port_type(int p_port) const {
  1082. return PORT_TYPE_SCALAR;
  1083. }
  1084. String VisualShaderNodeFloatOp::get_input_port_name(int p_port) const {
  1085. return p_port == 0 ? "a" : "b";
  1086. }
  1087. int VisualShaderNodeFloatOp::get_output_port_count() const {
  1088. return 1;
  1089. }
  1090. VisualShaderNodeFloatOp::PortType VisualShaderNodeFloatOp::get_output_port_type(int p_port) const {
  1091. return PORT_TYPE_SCALAR;
  1092. }
  1093. String VisualShaderNodeFloatOp::get_output_port_name(int p_port) const {
  1094. return "op"; //no output port means the editor will be used as port
  1095. }
  1096. String VisualShaderNodeFloatOp::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 {
  1097. String code = "\t" + p_output_vars[0] + " = ";
  1098. switch (op) {
  1099. case OP_ADD:
  1100. code += p_input_vars[0] + " + " + p_input_vars[1] + ";\n";
  1101. break;
  1102. case OP_SUB:
  1103. code += p_input_vars[0] + " - " + p_input_vars[1] + ";\n";
  1104. break;
  1105. case OP_MUL:
  1106. code += p_input_vars[0] + " * " + p_input_vars[1] + ";\n";
  1107. break;
  1108. case OP_DIV:
  1109. code += p_input_vars[0] + " / " + p_input_vars[1] + ";\n";
  1110. break;
  1111. case OP_MOD:
  1112. code += "mod(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1113. break;
  1114. case OP_POW:
  1115. code += "pow(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1116. break;
  1117. case OP_MAX:
  1118. code += "max(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1119. break;
  1120. case OP_MIN:
  1121. code += "min(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1122. break;
  1123. case OP_ATAN2:
  1124. code += "atan(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1125. break;
  1126. case OP_STEP:
  1127. code += "step(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1128. break;
  1129. }
  1130. return code;
  1131. }
  1132. void VisualShaderNodeFloatOp::set_operator(Operator p_op) {
  1133. op = p_op;
  1134. emit_changed();
  1135. }
  1136. VisualShaderNodeFloatOp::Operator VisualShaderNodeFloatOp::get_operator() const {
  1137. return op;
  1138. }
  1139. Vector<StringName> VisualShaderNodeFloatOp::get_editable_properties() const {
  1140. Vector<StringName> props;
  1141. props.push_back("operator");
  1142. return props;
  1143. }
  1144. void VisualShaderNodeFloatOp::_bind_methods() {
  1145. ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeFloatOp::set_operator);
  1146. ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeFloatOp::get_operator);
  1147. ADD_PROPERTY(PropertyInfo(Variant::INT, "operator", PROPERTY_HINT_ENUM, "Add,Sub,Multiply,Divide,Remainder,Power,Max,Min,Atan2,Step"), "set_operator", "get_operator");
  1148. BIND_ENUM_CONSTANT(OP_ADD);
  1149. BIND_ENUM_CONSTANT(OP_SUB);
  1150. BIND_ENUM_CONSTANT(OP_MUL);
  1151. BIND_ENUM_CONSTANT(OP_DIV);
  1152. BIND_ENUM_CONSTANT(OP_MOD);
  1153. BIND_ENUM_CONSTANT(OP_POW);
  1154. BIND_ENUM_CONSTANT(OP_MAX);
  1155. BIND_ENUM_CONSTANT(OP_MIN);
  1156. BIND_ENUM_CONSTANT(OP_ATAN2);
  1157. BIND_ENUM_CONSTANT(OP_STEP);
  1158. }
  1159. VisualShaderNodeFloatOp::VisualShaderNodeFloatOp() {
  1160. set_input_port_default_value(0, 0.0);
  1161. set_input_port_default_value(1, 0.0);
  1162. }
  1163. ////////////// Integer Op
  1164. String VisualShaderNodeIntOp::get_caption() const {
  1165. return "IntOp";
  1166. }
  1167. int VisualShaderNodeIntOp::get_input_port_count() const {
  1168. return 2;
  1169. }
  1170. VisualShaderNodeIntOp::PortType VisualShaderNodeIntOp::get_input_port_type(int p_port) const {
  1171. return PORT_TYPE_SCALAR_INT;
  1172. }
  1173. String VisualShaderNodeIntOp::get_input_port_name(int p_port) const {
  1174. return p_port == 0 ? "a" : "b";
  1175. }
  1176. int VisualShaderNodeIntOp::get_output_port_count() const {
  1177. return 1;
  1178. }
  1179. VisualShaderNodeIntOp::PortType VisualShaderNodeIntOp::get_output_port_type(int p_port) const {
  1180. return PORT_TYPE_SCALAR_INT;
  1181. }
  1182. String VisualShaderNodeIntOp::get_output_port_name(int p_port) const {
  1183. return "op"; //no output port means the editor will be used as port
  1184. }
  1185. String VisualShaderNodeIntOp::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 {
  1186. String code = "\t" + p_output_vars[0] + " = ";
  1187. switch (op) {
  1188. case OP_ADD:
  1189. code += p_input_vars[0] + " + " + p_input_vars[1] + ";\n";
  1190. break;
  1191. case OP_SUB:
  1192. code += p_input_vars[0] + " - " + p_input_vars[1] + ";\n";
  1193. break;
  1194. case OP_MUL:
  1195. code += p_input_vars[0] + " * " + p_input_vars[1] + ";\n";
  1196. break;
  1197. case OP_DIV:
  1198. code += p_input_vars[0] + " / " + p_input_vars[1] + ";\n";
  1199. break;
  1200. case OP_MOD:
  1201. code += p_input_vars[0] + " % " + p_input_vars[1] + ";\n";
  1202. break;
  1203. case OP_MAX:
  1204. code += "max(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1205. break;
  1206. case OP_MIN:
  1207. code += "min(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1208. break;
  1209. }
  1210. return code;
  1211. }
  1212. void VisualShaderNodeIntOp::set_operator(Operator p_op) {
  1213. op = p_op;
  1214. emit_changed();
  1215. }
  1216. VisualShaderNodeIntOp::Operator VisualShaderNodeIntOp::get_operator() const {
  1217. return op;
  1218. }
  1219. Vector<StringName> VisualShaderNodeIntOp::get_editable_properties() const {
  1220. Vector<StringName> props;
  1221. props.push_back("operator");
  1222. return props;
  1223. }
  1224. void VisualShaderNodeIntOp::_bind_methods() {
  1225. ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeIntOp::set_operator);
  1226. ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeIntOp::get_operator);
  1227. ADD_PROPERTY(PropertyInfo(Variant::INT, "operator", PROPERTY_HINT_ENUM, "Add,Sub,Multiply,Divide,Remainder,Max,Min"), "set_operator", "get_operator");
  1228. BIND_ENUM_CONSTANT(OP_ADD);
  1229. BIND_ENUM_CONSTANT(OP_SUB);
  1230. BIND_ENUM_CONSTANT(OP_MUL);
  1231. BIND_ENUM_CONSTANT(OP_DIV);
  1232. BIND_ENUM_CONSTANT(OP_MOD);
  1233. BIND_ENUM_CONSTANT(OP_MAX);
  1234. BIND_ENUM_CONSTANT(OP_MIN);
  1235. }
  1236. VisualShaderNodeIntOp::VisualShaderNodeIntOp() {
  1237. set_input_port_default_value(0, 0);
  1238. set_input_port_default_value(1, 0);
  1239. }
  1240. ////////////// Vector Op
  1241. String VisualShaderNodeVectorOp::get_caption() const {
  1242. return "VectorOp";
  1243. }
  1244. int VisualShaderNodeVectorOp::get_input_port_count() const {
  1245. return 2;
  1246. }
  1247. VisualShaderNodeVectorOp::PortType VisualShaderNodeVectorOp::get_input_port_type(int p_port) const {
  1248. return PORT_TYPE_VECTOR;
  1249. }
  1250. String VisualShaderNodeVectorOp::get_input_port_name(int p_port) const {
  1251. return p_port == 0 ? "a" : "b";
  1252. }
  1253. int VisualShaderNodeVectorOp::get_output_port_count() const {
  1254. return 1;
  1255. }
  1256. VisualShaderNodeVectorOp::PortType VisualShaderNodeVectorOp::get_output_port_type(int p_port) const {
  1257. return PORT_TYPE_VECTOR;
  1258. }
  1259. String VisualShaderNodeVectorOp::get_output_port_name(int p_port) const {
  1260. return "op"; //no output port means the editor will be used as port
  1261. }
  1262. String VisualShaderNodeVectorOp::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1263. String code = "\t" + p_output_vars[0] + " = ";
  1264. switch (op) {
  1265. case OP_ADD:
  1266. code += p_input_vars[0] + " + " + p_input_vars[1] + ";\n";
  1267. break;
  1268. case OP_SUB:
  1269. code += p_input_vars[0] + " - " + p_input_vars[1] + ";\n";
  1270. break;
  1271. case OP_MUL:
  1272. code += p_input_vars[0] + " * " + p_input_vars[1] + ";\n";
  1273. break;
  1274. case OP_DIV:
  1275. code += p_input_vars[0] + " / " + p_input_vars[1] + ";\n";
  1276. break;
  1277. case OP_MOD:
  1278. code += "mod(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1279. break;
  1280. case OP_POW:
  1281. code += "pow(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1282. break;
  1283. case OP_MAX:
  1284. code += "max(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1285. break;
  1286. case OP_MIN:
  1287. code += "min(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1288. break;
  1289. case OP_CROSS:
  1290. code += "cross(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1291. break;
  1292. case OP_ATAN2:
  1293. code += "atan(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1294. break;
  1295. case OP_REFLECT:
  1296. code += "reflect(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1297. break;
  1298. case OP_STEP:
  1299. code += "step(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1300. break;
  1301. }
  1302. return code;
  1303. }
  1304. void VisualShaderNodeVectorOp::set_operator(Operator p_op) {
  1305. op = p_op;
  1306. emit_changed();
  1307. }
  1308. VisualShaderNodeVectorOp::Operator VisualShaderNodeVectorOp::get_operator() const {
  1309. return op;
  1310. }
  1311. Vector<StringName> VisualShaderNodeVectorOp::get_editable_properties() const {
  1312. Vector<StringName> props;
  1313. props.push_back("operator");
  1314. return props;
  1315. }
  1316. void VisualShaderNodeVectorOp::_bind_methods() {
  1317. ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeVectorOp::set_operator);
  1318. ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeVectorOp::get_operator);
  1319. ADD_PROPERTY(PropertyInfo(Variant::INT, "operator", PROPERTY_HINT_ENUM, "Add,Sub,Multiply,Divide,Remainder,Power,Max,Min,Cross,Atan2,Reflect,Step"), "set_operator", "get_operator");
  1320. BIND_ENUM_CONSTANT(OP_ADD);
  1321. BIND_ENUM_CONSTANT(OP_SUB);
  1322. BIND_ENUM_CONSTANT(OP_MUL);
  1323. BIND_ENUM_CONSTANT(OP_DIV);
  1324. BIND_ENUM_CONSTANT(OP_MOD);
  1325. BIND_ENUM_CONSTANT(OP_POW);
  1326. BIND_ENUM_CONSTANT(OP_MAX);
  1327. BIND_ENUM_CONSTANT(OP_MIN);
  1328. BIND_ENUM_CONSTANT(OP_CROSS);
  1329. BIND_ENUM_CONSTANT(OP_ATAN2);
  1330. BIND_ENUM_CONSTANT(OP_REFLECT);
  1331. BIND_ENUM_CONSTANT(OP_STEP);
  1332. }
  1333. VisualShaderNodeVectorOp::VisualShaderNodeVectorOp() {
  1334. set_input_port_default_value(0, Vector3());
  1335. set_input_port_default_value(1, Vector3());
  1336. }
  1337. ////////////// Color Op
  1338. String VisualShaderNodeColorOp::get_caption() const {
  1339. return "ColorOp";
  1340. }
  1341. int VisualShaderNodeColorOp::get_input_port_count() const {
  1342. return 2;
  1343. }
  1344. VisualShaderNodeColorOp::PortType VisualShaderNodeColorOp::get_input_port_type(int p_port) const {
  1345. return PORT_TYPE_VECTOR;
  1346. }
  1347. String VisualShaderNodeColorOp::get_input_port_name(int p_port) const {
  1348. return p_port == 0 ? "a" : "b";
  1349. }
  1350. int VisualShaderNodeColorOp::get_output_port_count() const {
  1351. return 1;
  1352. }
  1353. VisualShaderNodeColorOp::PortType VisualShaderNodeColorOp::get_output_port_type(int p_port) const {
  1354. return PORT_TYPE_VECTOR;
  1355. }
  1356. String VisualShaderNodeColorOp::get_output_port_name(int p_port) const {
  1357. return "op"; //no output port means the editor will be used as port
  1358. }
  1359. String VisualShaderNodeColorOp::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1360. String code;
  1361. static const char *axisn[3] = { "x", "y", "z" };
  1362. switch (op) {
  1363. case OP_SCREEN: {
  1364. code += "\t" + p_output_vars[0] + " = vec3(1.0) - (vec3(1.0) - " + p_input_vars[0] + ") * (vec3(1.0) - " + p_input_vars[1] + ");\n";
  1365. } break;
  1366. case OP_DIFFERENCE: {
  1367. code += "\t" + p_output_vars[0] + " = abs(" + p_input_vars[0] + " - " + p_input_vars[1] + ");\n";
  1368. } break;
  1369. case OP_DARKEN: {
  1370. code += "\t" + p_output_vars[0] + " = min(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1371. } break;
  1372. case OP_LIGHTEN: {
  1373. code += "\t" + p_output_vars[0] + " = max(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1374. } break;
  1375. case OP_OVERLAY: {
  1376. for (int i = 0; i < 3; i++) {
  1377. code += "\t{\n";
  1378. code += "\t\tfloat base = " + p_input_vars[0] + "." + axisn[i] + ";\n";
  1379. code += "\t\tfloat blend = " + p_input_vars[1] + "." + axisn[i] + ";\n";
  1380. code += "\t\tif (base < 0.5) {\n";
  1381. code += "\t\t\t" + p_output_vars[0] + "." + axisn[i] + " = 2.0 * base * blend;\n";
  1382. code += "\t\t} else {\n";
  1383. code += "\t\t\t" + p_output_vars[0] + "." + axisn[i] + " = 1.0 - 2.0 * (1.0 - blend) * (1.0 - base);\n";
  1384. code += "\t\t}\n";
  1385. code += "\t}\n";
  1386. }
  1387. } break;
  1388. case OP_DODGE: {
  1389. code += "\t" + p_output_vars[0] + " = (" + p_input_vars[0] + ") / (vec3(1.0) - " + p_input_vars[1] + ");\n";
  1390. } break;
  1391. case OP_BURN: {
  1392. code += "\t" + p_output_vars[0] + " = vec3(1.0) - (vec3(1.0) - " + p_input_vars[0] + ") / (" + p_input_vars[1] + ");\n";
  1393. } break;
  1394. case OP_SOFT_LIGHT: {
  1395. for (int i = 0; i < 3; i++) {
  1396. code += "\t{\n";
  1397. code += "\t\tfloat base = " + p_input_vars[0] + "." + axisn[i] + ";\n";
  1398. code += "\t\tfloat blend = " + p_input_vars[1] + "." + axisn[i] + ";\n";
  1399. code += "\t\tif (base < 0.5) {\n";
  1400. code += "\t\t\t" + p_output_vars[0] + "." + axisn[i] + " = (base * (blend + 0.5));\n";
  1401. code += "\t\t} else {\n";
  1402. code += "\t\t\t" + p_output_vars[0] + "." + axisn[i] + " = (1.0 - (1.0 - base) * (1.0 - (blend - 0.5)));\n";
  1403. code += "\t\t}\n";
  1404. code += "\t}\n";
  1405. }
  1406. } break;
  1407. case OP_HARD_LIGHT: {
  1408. for (int i = 0; i < 3; i++) {
  1409. code += "\t{\n";
  1410. code += "\t\tfloat base = " + p_input_vars[0] + "." + axisn[i] + ";\n";
  1411. code += "\t\tfloat blend = " + p_input_vars[1] + "." + axisn[i] + ";\n";
  1412. code += "\t\tif (base < 0.5) {\n";
  1413. code += "\t\t\t" + p_output_vars[0] + "." + axisn[i] + " = (base * (2.0 * blend));\n";
  1414. code += "\t\t} else {\n";
  1415. code += "\t\t\t" + p_output_vars[0] + "." + axisn[i] + " = (1.0 - (1.0 - base) * (1.0 - 2.0 * (blend - 0.5)));\n";
  1416. code += "\t\t}\n";
  1417. code += "\t}\n";
  1418. }
  1419. } break;
  1420. }
  1421. return code;
  1422. }
  1423. void VisualShaderNodeColorOp::set_operator(Operator p_op) {
  1424. op = p_op;
  1425. switch (op) {
  1426. case OP_SCREEN:
  1427. simple_decl = true;
  1428. break;
  1429. case OP_DIFFERENCE:
  1430. simple_decl = true;
  1431. break;
  1432. case OP_DARKEN:
  1433. simple_decl = true;
  1434. break;
  1435. case OP_LIGHTEN:
  1436. simple_decl = true;
  1437. break;
  1438. case OP_OVERLAY:
  1439. simple_decl = false;
  1440. break;
  1441. case OP_DODGE:
  1442. simple_decl = true;
  1443. break;
  1444. case OP_BURN:
  1445. simple_decl = true;
  1446. break;
  1447. case OP_SOFT_LIGHT:
  1448. simple_decl = false;
  1449. break;
  1450. case OP_HARD_LIGHT:
  1451. simple_decl = false;
  1452. break;
  1453. }
  1454. emit_changed();
  1455. }
  1456. VisualShaderNodeColorOp::Operator VisualShaderNodeColorOp::get_operator() const {
  1457. return op;
  1458. }
  1459. Vector<StringName> VisualShaderNodeColorOp::get_editable_properties() const {
  1460. Vector<StringName> props;
  1461. props.push_back("operator");
  1462. return props;
  1463. }
  1464. void VisualShaderNodeColorOp::_bind_methods() {
  1465. ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeColorOp::set_operator);
  1466. ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeColorOp::get_operator);
  1467. ADD_PROPERTY(PropertyInfo(Variant::INT, "operator", PROPERTY_HINT_ENUM, "Screen,Difference,Darken,Lighten,Overlay,Dodge,Burn,SoftLight,HardLight"), "set_operator", "get_operator");
  1468. BIND_ENUM_CONSTANT(OP_SCREEN);
  1469. BIND_ENUM_CONSTANT(OP_DIFFERENCE);
  1470. BIND_ENUM_CONSTANT(OP_DARKEN);
  1471. BIND_ENUM_CONSTANT(OP_LIGHTEN);
  1472. BIND_ENUM_CONSTANT(OP_OVERLAY);
  1473. BIND_ENUM_CONSTANT(OP_DODGE);
  1474. BIND_ENUM_CONSTANT(OP_BURN);
  1475. BIND_ENUM_CONSTANT(OP_SOFT_LIGHT);
  1476. BIND_ENUM_CONSTANT(OP_HARD_LIGHT);
  1477. }
  1478. VisualShaderNodeColorOp::VisualShaderNodeColorOp() {
  1479. set_input_port_default_value(0, Vector3());
  1480. set_input_port_default_value(1, Vector3());
  1481. }
  1482. ////////////// Transform Mult
  1483. String VisualShaderNodeTransformMult::get_caption() const {
  1484. return "TransformMult";
  1485. }
  1486. int VisualShaderNodeTransformMult::get_input_port_count() const {
  1487. return 2;
  1488. }
  1489. VisualShaderNodeTransformMult::PortType VisualShaderNodeTransformMult::get_input_port_type(int p_port) const {
  1490. return PORT_TYPE_TRANSFORM;
  1491. }
  1492. String VisualShaderNodeTransformMult::get_input_port_name(int p_port) const {
  1493. return p_port == 0 ? "a" : "b";
  1494. }
  1495. int VisualShaderNodeTransformMult::get_output_port_count() const {
  1496. return 1;
  1497. }
  1498. VisualShaderNodeTransformMult::PortType VisualShaderNodeTransformMult::get_output_port_type(int p_port) const {
  1499. return PORT_TYPE_TRANSFORM;
  1500. }
  1501. String VisualShaderNodeTransformMult::get_output_port_name(int p_port) const {
  1502. return "mult"; //no output port means the editor will be used as port
  1503. }
  1504. String VisualShaderNodeTransformMult::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1505. if (op == OP_AxB) {
  1506. return "\t" + p_output_vars[0] + " = " + p_input_vars[0] + " * " + p_input_vars[1] + ";\n";
  1507. } else if (op == OP_BxA) {
  1508. return "\t" + p_output_vars[0] + " = " + p_input_vars[1] + " * " + p_input_vars[0] + ";\n";
  1509. } else if (op == OP_AxB_COMP) {
  1510. return "\t" + p_output_vars[0] + " = matrixCompMult(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  1511. } else {
  1512. return "\t" + p_output_vars[0] + " = matrixCompMult(" + p_input_vars[1] + ", " + p_input_vars[0] + ");\n";
  1513. }
  1514. }
  1515. void VisualShaderNodeTransformMult::set_operator(Operator p_op) {
  1516. op = p_op;
  1517. emit_changed();
  1518. }
  1519. VisualShaderNodeTransformMult::Operator VisualShaderNodeTransformMult::get_operator() const {
  1520. return op;
  1521. }
  1522. Vector<StringName> VisualShaderNodeTransformMult::get_editable_properties() const {
  1523. Vector<StringName> props;
  1524. props.push_back("operator");
  1525. return props;
  1526. }
  1527. void VisualShaderNodeTransformMult::_bind_methods() {
  1528. ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeTransformMult::set_operator);
  1529. ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeTransformMult::get_operator);
  1530. ADD_PROPERTY(PropertyInfo(Variant::INT, "operator", PROPERTY_HINT_ENUM, "A x B,B x A,A x B(per component),B x A(per component)"), "set_operator", "get_operator");
  1531. BIND_ENUM_CONSTANT(OP_AxB);
  1532. BIND_ENUM_CONSTANT(OP_BxA);
  1533. BIND_ENUM_CONSTANT(OP_AxB_COMP);
  1534. BIND_ENUM_CONSTANT(OP_BxA_COMP);
  1535. }
  1536. VisualShaderNodeTransformMult::VisualShaderNodeTransformMult() {
  1537. set_input_port_default_value(0, Transform());
  1538. set_input_port_default_value(1, Transform());
  1539. }
  1540. ////////////// TransformVec Mult
  1541. String VisualShaderNodeTransformVecMult::get_caption() const {
  1542. return "TransformVectorMult";
  1543. }
  1544. int VisualShaderNodeTransformVecMult::get_input_port_count() const {
  1545. return 2;
  1546. }
  1547. VisualShaderNodeTransformVecMult::PortType VisualShaderNodeTransformVecMult::get_input_port_type(int p_port) const {
  1548. return p_port == 0 ? PORT_TYPE_TRANSFORM : PORT_TYPE_VECTOR;
  1549. }
  1550. String VisualShaderNodeTransformVecMult::get_input_port_name(int p_port) const {
  1551. return p_port == 0 ? "a" : "b";
  1552. }
  1553. int VisualShaderNodeTransformVecMult::get_output_port_count() const {
  1554. return 1;
  1555. }
  1556. VisualShaderNodeTransformVecMult::PortType VisualShaderNodeTransformVecMult::get_output_port_type(int p_port) const {
  1557. return PORT_TYPE_VECTOR;
  1558. }
  1559. String VisualShaderNodeTransformVecMult::get_output_port_name(int p_port) const {
  1560. return ""; //no output port means the editor will be used as port
  1561. }
  1562. String VisualShaderNodeTransformVecMult::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1563. if (op == OP_AxB) {
  1564. return "\t" + p_output_vars[0] + " = (" + p_input_vars[0] + " * vec4(" + p_input_vars[1] + ", 1.0)).xyz;\n";
  1565. } else if (op == OP_BxA) {
  1566. return "\t" + p_output_vars[0] + " = (vec4(" + p_input_vars[1] + ", 1.0) * " + p_input_vars[0] + ").xyz;\n";
  1567. } else if (op == OP_3x3_AxB) {
  1568. return "\t" + p_output_vars[0] + " = (" + p_input_vars[0] + " * vec4(" + p_input_vars[1] + ", 0.0)).xyz;\n";
  1569. } else {
  1570. return "\t" + p_output_vars[0] + " = (vec4(" + p_input_vars[1] + ", 0.0) * " + p_input_vars[0] + ").xyz;\n";
  1571. }
  1572. }
  1573. void VisualShaderNodeTransformVecMult::set_operator(Operator p_op) {
  1574. op = p_op;
  1575. emit_changed();
  1576. }
  1577. VisualShaderNodeTransformVecMult::Operator VisualShaderNodeTransformVecMult::get_operator() const {
  1578. return op;
  1579. }
  1580. Vector<StringName> VisualShaderNodeTransformVecMult::get_editable_properties() const {
  1581. Vector<StringName> props;
  1582. props.push_back("operator");
  1583. return props;
  1584. }
  1585. void VisualShaderNodeTransformVecMult::_bind_methods() {
  1586. ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeTransformVecMult::set_operator);
  1587. ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeTransformVecMult::get_operator);
  1588. ADD_PROPERTY(PropertyInfo(Variant::INT, "operator", PROPERTY_HINT_ENUM, "A x B,B x A,A x B (3x3),B x A (3x3)"), "set_operator", "get_operator");
  1589. BIND_ENUM_CONSTANT(OP_AxB);
  1590. BIND_ENUM_CONSTANT(OP_BxA);
  1591. BIND_ENUM_CONSTANT(OP_3x3_AxB);
  1592. BIND_ENUM_CONSTANT(OP_3x3_BxA);
  1593. }
  1594. VisualShaderNodeTransformVecMult::VisualShaderNodeTransformVecMult() {
  1595. set_input_port_default_value(0, Transform());
  1596. set_input_port_default_value(1, Vector3());
  1597. }
  1598. ////////////// Float Func
  1599. String VisualShaderNodeFloatFunc::get_caption() const {
  1600. return "FloatFunc";
  1601. }
  1602. int VisualShaderNodeFloatFunc::get_input_port_count() const {
  1603. return 1;
  1604. }
  1605. VisualShaderNodeFloatFunc::PortType VisualShaderNodeFloatFunc::get_input_port_type(int p_port) const {
  1606. return PORT_TYPE_SCALAR;
  1607. }
  1608. String VisualShaderNodeFloatFunc::get_input_port_name(int p_port) const {
  1609. return "";
  1610. }
  1611. int VisualShaderNodeFloatFunc::get_output_port_count() const {
  1612. return 1;
  1613. }
  1614. VisualShaderNodeFloatFunc::PortType VisualShaderNodeFloatFunc::get_output_port_type(int p_port) const {
  1615. return PORT_TYPE_SCALAR;
  1616. }
  1617. String VisualShaderNodeFloatFunc::get_output_port_name(int p_port) const {
  1618. return ""; //no output port means the editor will be used as port
  1619. }
  1620. String VisualShaderNodeFloatFunc::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 {
  1621. static const char *scalar_func_id[FUNC_ONEMINUS + 1] = {
  1622. "sin($)",
  1623. "cos($)",
  1624. "tan($)",
  1625. "asin($)",
  1626. "acos($)",
  1627. "atan($)",
  1628. "sinh($)",
  1629. "cosh($)",
  1630. "tanh($)",
  1631. "log($)",
  1632. "exp($)",
  1633. "sqrt($)",
  1634. "abs($)",
  1635. "sign($)",
  1636. "floor($)",
  1637. "round($)",
  1638. "ceil($)",
  1639. "fract($)",
  1640. "min(max($, 0.0), 1.0)",
  1641. "-($)",
  1642. "acosh($)",
  1643. "asinh($)",
  1644. "atanh($)",
  1645. "degrees($)",
  1646. "exp2($)",
  1647. "inversesqrt($)",
  1648. "log2($)",
  1649. "radians($)",
  1650. "1.0 / ($)",
  1651. "roundEven($)",
  1652. "trunc($)",
  1653. "1.0 - $"
  1654. };
  1655. return "\t" + p_output_vars[0] + " = " + String(scalar_func_id[func]).replace("$", p_input_vars[0]) + ";\n";
  1656. }
  1657. void VisualShaderNodeFloatFunc::set_function(Function p_func) {
  1658. func = p_func;
  1659. emit_changed();
  1660. }
  1661. VisualShaderNodeFloatFunc::Function VisualShaderNodeFloatFunc::get_function() const {
  1662. return func;
  1663. }
  1664. Vector<StringName> VisualShaderNodeFloatFunc::get_editable_properties() const {
  1665. Vector<StringName> props;
  1666. props.push_back("function");
  1667. return props;
  1668. }
  1669. void VisualShaderNodeFloatFunc::_bind_methods() {
  1670. ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeFloatFunc::set_function);
  1671. ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeFloatFunc::get_function);
  1672. ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Sin,Cos,Tan,ASin,ACos,ATan,SinH,CosH,TanH,Log,Exp,Sqrt,Abs,Sign,Floor,Round,Ceil,Frac,Saturate,Negate,ACosH,ASinH,ATanH,Degrees,Exp2,InverseSqrt,Log2,Radians,Reciprocal,RoundEven,Trunc,OneMinus"), "set_function", "get_function");
  1673. BIND_ENUM_CONSTANT(FUNC_SIN);
  1674. BIND_ENUM_CONSTANT(FUNC_COS);
  1675. BIND_ENUM_CONSTANT(FUNC_TAN);
  1676. BIND_ENUM_CONSTANT(FUNC_ASIN);
  1677. BIND_ENUM_CONSTANT(FUNC_ACOS);
  1678. BIND_ENUM_CONSTANT(FUNC_ATAN);
  1679. BIND_ENUM_CONSTANT(FUNC_SINH);
  1680. BIND_ENUM_CONSTANT(FUNC_COSH);
  1681. BIND_ENUM_CONSTANT(FUNC_TANH);
  1682. BIND_ENUM_CONSTANT(FUNC_LOG);
  1683. BIND_ENUM_CONSTANT(FUNC_EXP);
  1684. BIND_ENUM_CONSTANT(FUNC_SQRT);
  1685. BIND_ENUM_CONSTANT(FUNC_ABS);
  1686. BIND_ENUM_CONSTANT(FUNC_SIGN);
  1687. BIND_ENUM_CONSTANT(FUNC_FLOOR);
  1688. BIND_ENUM_CONSTANT(FUNC_ROUND);
  1689. BIND_ENUM_CONSTANT(FUNC_CEIL);
  1690. BIND_ENUM_CONSTANT(FUNC_FRAC);
  1691. BIND_ENUM_CONSTANT(FUNC_SATURATE);
  1692. BIND_ENUM_CONSTANT(FUNC_NEGATE);
  1693. BIND_ENUM_CONSTANT(FUNC_ACOSH);
  1694. BIND_ENUM_CONSTANT(FUNC_ASINH);
  1695. BIND_ENUM_CONSTANT(FUNC_ATANH);
  1696. BIND_ENUM_CONSTANT(FUNC_DEGREES);
  1697. BIND_ENUM_CONSTANT(FUNC_EXP2);
  1698. BIND_ENUM_CONSTANT(FUNC_INVERSE_SQRT);
  1699. BIND_ENUM_CONSTANT(FUNC_LOG2);
  1700. BIND_ENUM_CONSTANT(FUNC_RADIANS);
  1701. BIND_ENUM_CONSTANT(FUNC_RECIPROCAL);
  1702. BIND_ENUM_CONSTANT(FUNC_ROUNDEVEN);
  1703. BIND_ENUM_CONSTANT(FUNC_TRUNC);
  1704. BIND_ENUM_CONSTANT(FUNC_ONEMINUS);
  1705. }
  1706. VisualShaderNodeFloatFunc::VisualShaderNodeFloatFunc() {
  1707. set_input_port_default_value(0, 0.0);
  1708. }
  1709. ////////////// Int Func
  1710. String VisualShaderNodeIntFunc::get_caption() const {
  1711. return "IntFunc";
  1712. }
  1713. int VisualShaderNodeIntFunc::get_input_port_count() const {
  1714. return 1;
  1715. }
  1716. VisualShaderNodeIntFunc::PortType VisualShaderNodeIntFunc::get_input_port_type(int p_port) const {
  1717. return PORT_TYPE_SCALAR_INT;
  1718. }
  1719. String VisualShaderNodeIntFunc::get_input_port_name(int p_port) const {
  1720. return "";
  1721. }
  1722. int VisualShaderNodeIntFunc::get_output_port_count() const {
  1723. return 1;
  1724. }
  1725. VisualShaderNodeIntFunc::PortType VisualShaderNodeIntFunc::get_output_port_type(int p_port) const {
  1726. return PORT_TYPE_SCALAR_INT;
  1727. }
  1728. String VisualShaderNodeIntFunc::get_output_port_name(int p_port) const {
  1729. return ""; //no output port means the editor will be used as port
  1730. }
  1731. String VisualShaderNodeIntFunc::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 {
  1732. static const char *int_func_id[FUNC_SIGN + 1] = {
  1733. "abs($)",
  1734. "-($)",
  1735. "sign($)"
  1736. };
  1737. return "\t" + p_output_vars[0] + " = " + String(int_func_id[func]).replace("$", p_input_vars[0]) + ";\n";
  1738. }
  1739. void VisualShaderNodeIntFunc::set_function(Function p_func) {
  1740. func = p_func;
  1741. emit_changed();
  1742. }
  1743. VisualShaderNodeIntFunc::Function VisualShaderNodeIntFunc::get_function() const {
  1744. return func;
  1745. }
  1746. Vector<StringName> VisualShaderNodeIntFunc::get_editable_properties() const {
  1747. Vector<StringName> props;
  1748. props.push_back("function");
  1749. return props;
  1750. }
  1751. void VisualShaderNodeIntFunc::_bind_methods() {
  1752. ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeIntFunc::set_function);
  1753. ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeIntFunc::get_function);
  1754. ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Abs,Negate,Sign"), "set_function", "get_function");
  1755. BIND_ENUM_CONSTANT(FUNC_ABS);
  1756. BIND_ENUM_CONSTANT(FUNC_NEGATE);
  1757. BIND_ENUM_CONSTANT(FUNC_SIGN);
  1758. }
  1759. VisualShaderNodeIntFunc::VisualShaderNodeIntFunc() {
  1760. set_input_port_default_value(0, 0);
  1761. }
  1762. ////////////// Vector Func
  1763. String VisualShaderNodeVectorFunc::get_caption() const {
  1764. return "VectorFunc";
  1765. }
  1766. int VisualShaderNodeVectorFunc::get_input_port_count() const {
  1767. return 1;
  1768. }
  1769. VisualShaderNodeVectorFunc::PortType VisualShaderNodeVectorFunc::get_input_port_type(int p_port) const {
  1770. return PORT_TYPE_VECTOR;
  1771. }
  1772. String VisualShaderNodeVectorFunc::get_input_port_name(int p_port) const {
  1773. return "";
  1774. }
  1775. int VisualShaderNodeVectorFunc::get_output_port_count() const {
  1776. return 1;
  1777. }
  1778. VisualShaderNodeVectorFunc::PortType VisualShaderNodeVectorFunc::get_output_port_type(int p_port) const {
  1779. return PORT_TYPE_VECTOR;
  1780. }
  1781. String VisualShaderNodeVectorFunc::get_output_port_name(int p_port) const {
  1782. return ""; //no output port means the editor will be used as port
  1783. }
  1784. String VisualShaderNodeVectorFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1785. static const char *vec_func_id[FUNC_ONEMINUS + 1] = {
  1786. "normalize($)",
  1787. "max(min($, vec3(1.0)), vec3(0.0))",
  1788. "-($)",
  1789. "1.0 / ($)",
  1790. "",
  1791. "",
  1792. "abs($)",
  1793. "acos($)",
  1794. "acosh($)",
  1795. "asin($)",
  1796. "asinh($)",
  1797. "atan($)",
  1798. "atanh($)",
  1799. "ceil($)",
  1800. "cos($)",
  1801. "cosh($)",
  1802. "degrees($)",
  1803. "exp($)",
  1804. "exp2($)",
  1805. "floor($)",
  1806. "fract($)",
  1807. "inversesqrt($)",
  1808. "log($)",
  1809. "log2($)",
  1810. "radians($)",
  1811. "round($)",
  1812. "roundEven($)",
  1813. "sign($)",
  1814. "sin($)",
  1815. "sinh($)",
  1816. "sqrt($)",
  1817. "tan($)",
  1818. "tanh($)",
  1819. "trunc($)",
  1820. "vec3(1.0, 1.0, 1.0) - $"
  1821. };
  1822. String code;
  1823. if (func == FUNC_RGB2HSV) {
  1824. code += "\t{\n";
  1825. code += "\t\tvec3 c = " + p_input_vars[0] + ";\n";
  1826. code += "\t\tvec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n";
  1827. code += "\t\tvec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n";
  1828. code += "\t\tvec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n";
  1829. code += "\t\tfloat d = q.x - min(q.w, q.y);\n";
  1830. code += "\t\tfloat e = 1.0e-10;\n";
  1831. code += "\t\t" + p_output_vars[0] + " = vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n";
  1832. code += "\t}\n";
  1833. } else if (func == FUNC_HSV2RGB) {
  1834. code += "\t{\n";
  1835. code += "\t\tvec3 c = " + p_input_vars[0] + ";\n";
  1836. code += "\t\tvec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n";
  1837. code += "\t\tvec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n";
  1838. code += "\t\t" + p_output_vars[0] + " = c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n";
  1839. code += "\t}\n";
  1840. } else {
  1841. code += "\t" + p_output_vars[0] + " = " + String(vec_func_id[func]).replace("$", p_input_vars[0]) + ";\n";
  1842. }
  1843. return code;
  1844. }
  1845. void VisualShaderNodeVectorFunc::set_function(Function p_func) {
  1846. func = p_func;
  1847. if (func == FUNC_RGB2HSV) {
  1848. simple_decl = false;
  1849. } else if (func == FUNC_HSV2RGB) {
  1850. simple_decl = false;
  1851. } else {
  1852. simple_decl = true;
  1853. }
  1854. emit_changed();
  1855. }
  1856. VisualShaderNodeVectorFunc::Function VisualShaderNodeVectorFunc::get_function() const {
  1857. return func;
  1858. }
  1859. Vector<StringName> VisualShaderNodeVectorFunc::get_editable_properties() const {
  1860. Vector<StringName> props;
  1861. props.push_back("function");
  1862. return props;
  1863. }
  1864. void VisualShaderNodeVectorFunc::_bind_methods() {
  1865. ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeVectorFunc::set_function);
  1866. ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeVectorFunc::get_function);
  1867. ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Normalize,Saturate,Negate,Reciprocal,RGB2HSV,HSV2RGB,Abs,ACos,ACosH,ASin,ASinH,ATan,ATanH,Ceil,Cos,CosH,Degrees,Exp,Exp2,Floor,Frac,InverseSqrt,Log,Log2,Radians,Round,RoundEven,Sign,Sin,SinH,Sqrt,Tan,TanH,Trunc,OneMinus"), "set_function", "get_function");
  1868. BIND_ENUM_CONSTANT(FUNC_NORMALIZE);
  1869. BIND_ENUM_CONSTANT(FUNC_SATURATE);
  1870. BIND_ENUM_CONSTANT(FUNC_NEGATE);
  1871. BIND_ENUM_CONSTANT(FUNC_RECIPROCAL);
  1872. BIND_ENUM_CONSTANT(FUNC_RGB2HSV);
  1873. BIND_ENUM_CONSTANT(FUNC_HSV2RGB);
  1874. BIND_ENUM_CONSTANT(FUNC_ABS);
  1875. BIND_ENUM_CONSTANT(FUNC_ACOS);
  1876. BIND_ENUM_CONSTANT(FUNC_ACOSH);
  1877. BIND_ENUM_CONSTANT(FUNC_ASIN);
  1878. BIND_ENUM_CONSTANT(FUNC_ASINH);
  1879. BIND_ENUM_CONSTANT(FUNC_ATAN);
  1880. BIND_ENUM_CONSTANT(FUNC_ATANH);
  1881. BIND_ENUM_CONSTANT(FUNC_CEIL);
  1882. BIND_ENUM_CONSTANT(FUNC_COS);
  1883. BIND_ENUM_CONSTANT(FUNC_COSH);
  1884. BIND_ENUM_CONSTANT(FUNC_DEGREES);
  1885. BIND_ENUM_CONSTANT(FUNC_EXP);
  1886. BIND_ENUM_CONSTANT(FUNC_EXP2);
  1887. BIND_ENUM_CONSTANT(FUNC_FLOOR);
  1888. BIND_ENUM_CONSTANT(FUNC_FRAC);
  1889. BIND_ENUM_CONSTANT(FUNC_INVERSE_SQRT);
  1890. BIND_ENUM_CONSTANT(FUNC_LOG);
  1891. BIND_ENUM_CONSTANT(FUNC_LOG2);
  1892. BIND_ENUM_CONSTANT(FUNC_RADIANS);
  1893. BIND_ENUM_CONSTANT(FUNC_ROUND);
  1894. BIND_ENUM_CONSTANT(FUNC_ROUNDEVEN);
  1895. BIND_ENUM_CONSTANT(FUNC_SIGN);
  1896. BIND_ENUM_CONSTANT(FUNC_SIN);
  1897. BIND_ENUM_CONSTANT(FUNC_SINH);
  1898. BIND_ENUM_CONSTANT(FUNC_SQRT);
  1899. BIND_ENUM_CONSTANT(FUNC_TAN);
  1900. BIND_ENUM_CONSTANT(FUNC_TANH);
  1901. BIND_ENUM_CONSTANT(FUNC_TRUNC);
  1902. BIND_ENUM_CONSTANT(FUNC_ONEMINUS);
  1903. }
  1904. VisualShaderNodeVectorFunc::VisualShaderNodeVectorFunc() {
  1905. set_input_port_default_value(0, Vector3());
  1906. }
  1907. ////////////// ColorFunc
  1908. String VisualShaderNodeColorFunc::get_caption() const {
  1909. return "ColorFunc";
  1910. }
  1911. int VisualShaderNodeColorFunc::get_input_port_count() const {
  1912. return 1;
  1913. }
  1914. VisualShaderNodeColorFunc::PortType VisualShaderNodeColorFunc::get_input_port_type(int p_port) const {
  1915. return PORT_TYPE_VECTOR;
  1916. }
  1917. String VisualShaderNodeColorFunc::get_input_port_name(int p_port) const {
  1918. return "";
  1919. }
  1920. int VisualShaderNodeColorFunc::get_output_port_count() const {
  1921. return 1;
  1922. }
  1923. VisualShaderNodeColorFunc::PortType VisualShaderNodeColorFunc::get_output_port_type(int p_port) const {
  1924. return PORT_TYPE_VECTOR;
  1925. }
  1926. String VisualShaderNodeColorFunc::get_output_port_name(int p_port) const {
  1927. return "";
  1928. }
  1929. String VisualShaderNodeColorFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1930. String code;
  1931. switch (func) {
  1932. case FUNC_GRAYSCALE:
  1933. code += "\t{\n";
  1934. code += "\t\tvec3 c = " + p_input_vars[0] + ";\n";
  1935. code += "\t\tfloat max1 = max(c.r, c.g);\n";
  1936. code += "\t\tfloat max2 = max(max1, c.b);\n";
  1937. code += "\t\tfloat max3 = max(max1, max2);\n";
  1938. code += "\t\t" + p_output_vars[0] + " = vec3(max3, max3, max3);\n";
  1939. code += "\t}\n";
  1940. break;
  1941. case FUNC_SEPIA:
  1942. code += "\t{\n";
  1943. code += "\t\tvec3 c = " + p_input_vars[0] + ";\n";
  1944. code += "\t\tfloat r = (c.r * .393) + (c.g *.769) + (c.b * .189);\n";
  1945. code += "\t\tfloat g = (c.r * .349) + (c.g *.686) + (c.b * .168);\n";
  1946. code += "\t\tfloat b = (c.r * .272) + (c.g *.534) + (c.b * .131);\n";
  1947. code += "\t\t" + p_output_vars[0] + " = vec3(r, g, b);\n";
  1948. code += "\t}\n";
  1949. break;
  1950. }
  1951. return code;
  1952. }
  1953. void VisualShaderNodeColorFunc::set_function(Function p_func) {
  1954. func = p_func;
  1955. emit_changed();
  1956. }
  1957. VisualShaderNodeColorFunc::Function VisualShaderNodeColorFunc::get_function() const {
  1958. return func;
  1959. }
  1960. Vector<StringName> VisualShaderNodeColorFunc::get_editable_properties() const {
  1961. Vector<StringName> props;
  1962. props.push_back("function");
  1963. return props;
  1964. }
  1965. void VisualShaderNodeColorFunc::_bind_methods() {
  1966. ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeColorFunc::set_function);
  1967. ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeColorFunc::get_function);
  1968. ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Grayscale,Sepia"), "set_function", "get_function");
  1969. BIND_ENUM_CONSTANT(FUNC_GRAYSCALE);
  1970. BIND_ENUM_CONSTANT(FUNC_SEPIA);
  1971. }
  1972. VisualShaderNodeColorFunc::VisualShaderNodeColorFunc() {
  1973. simple_decl = false;
  1974. set_input_port_default_value(0, Vector3());
  1975. }
  1976. ////////////// Transform Func
  1977. String VisualShaderNodeTransformFunc::get_caption() const {
  1978. return "TransformFunc";
  1979. }
  1980. int VisualShaderNodeTransformFunc::get_input_port_count() const {
  1981. return 1;
  1982. }
  1983. VisualShaderNodeTransformFunc::PortType VisualShaderNodeTransformFunc::get_input_port_type(int p_port) const {
  1984. return PORT_TYPE_TRANSFORM;
  1985. }
  1986. String VisualShaderNodeTransformFunc::get_input_port_name(int p_port) const {
  1987. return "";
  1988. }
  1989. int VisualShaderNodeTransformFunc::get_output_port_count() const {
  1990. return 1;
  1991. }
  1992. VisualShaderNodeTransformFunc::PortType VisualShaderNodeTransformFunc::get_output_port_type(int p_port) const {
  1993. return PORT_TYPE_TRANSFORM;
  1994. }
  1995. String VisualShaderNodeTransformFunc::get_output_port_name(int p_port) const {
  1996. return "";
  1997. }
  1998. String VisualShaderNodeTransformFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1999. static const char *funcs[FUNC_TRANSPOSE + 1] = {
  2000. "inverse($)",
  2001. "transpose($)"
  2002. };
  2003. String code;
  2004. code += "\t" + p_output_vars[0] + " = " + String(funcs[func]).replace("$", p_input_vars[0]) + ";\n";
  2005. return code;
  2006. }
  2007. void VisualShaderNodeTransformFunc::set_function(Function p_func) {
  2008. func = p_func;
  2009. emit_changed();
  2010. }
  2011. VisualShaderNodeTransformFunc::Function VisualShaderNodeTransformFunc::get_function() const {
  2012. return func;
  2013. }
  2014. Vector<StringName> VisualShaderNodeTransformFunc::get_editable_properties() const {
  2015. Vector<StringName> props;
  2016. props.push_back("function");
  2017. return props;
  2018. }
  2019. void VisualShaderNodeTransformFunc::_bind_methods() {
  2020. ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeTransformFunc::set_function);
  2021. ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeTransformFunc::get_function);
  2022. ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Inverse,Transpose"), "set_function", "get_function");
  2023. BIND_ENUM_CONSTANT(FUNC_INVERSE);
  2024. BIND_ENUM_CONSTANT(FUNC_TRANSPOSE);
  2025. }
  2026. VisualShaderNodeTransformFunc::VisualShaderNodeTransformFunc() {
  2027. set_input_port_default_value(0, Transform());
  2028. }
  2029. ////////////// Dot Product
  2030. String VisualShaderNodeDotProduct::get_caption() const {
  2031. return "DotProduct";
  2032. }
  2033. int VisualShaderNodeDotProduct::get_input_port_count() const {
  2034. return 2;
  2035. }
  2036. VisualShaderNodeDotProduct::PortType VisualShaderNodeDotProduct::get_input_port_type(int p_port) const {
  2037. return PORT_TYPE_VECTOR;
  2038. }
  2039. String VisualShaderNodeDotProduct::get_input_port_name(int p_port) const {
  2040. return p_port == 0 ? "a" : "b";
  2041. }
  2042. int VisualShaderNodeDotProduct::get_output_port_count() const {
  2043. return 1;
  2044. }
  2045. VisualShaderNodeDotProduct::PortType VisualShaderNodeDotProduct::get_output_port_type(int p_port) const {
  2046. return PORT_TYPE_SCALAR;
  2047. }
  2048. String VisualShaderNodeDotProduct::get_output_port_name(int p_port) const {
  2049. return "dot";
  2050. }
  2051. String VisualShaderNodeDotProduct::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2052. return "\t" + p_output_vars[0] + " = dot(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  2053. }
  2054. VisualShaderNodeDotProduct::VisualShaderNodeDotProduct() {
  2055. set_input_port_default_value(0, Vector3());
  2056. set_input_port_default_value(1, Vector3());
  2057. }
  2058. ////////////// Vector Len
  2059. String VisualShaderNodeVectorLen::get_caption() const {
  2060. return "VectorLen";
  2061. }
  2062. int VisualShaderNodeVectorLen::get_input_port_count() const {
  2063. return 1;
  2064. }
  2065. VisualShaderNodeVectorLen::PortType VisualShaderNodeVectorLen::get_input_port_type(int p_port) const {
  2066. return PORT_TYPE_VECTOR;
  2067. }
  2068. String VisualShaderNodeVectorLen::get_input_port_name(int p_port) const {
  2069. return "";
  2070. }
  2071. int VisualShaderNodeVectorLen::get_output_port_count() const {
  2072. return 1;
  2073. }
  2074. VisualShaderNodeVectorLen::PortType VisualShaderNodeVectorLen::get_output_port_type(int p_port) const {
  2075. return PORT_TYPE_SCALAR;
  2076. }
  2077. String VisualShaderNodeVectorLen::get_output_port_name(int p_port) const {
  2078. return "length";
  2079. }
  2080. String VisualShaderNodeVectorLen::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2081. return "\t" + p_output_vars[0] + " = length(" + p_input_vars[0] + ");\n";
  2082. }
  2083. VisualShaderNodeVectorLen::VisualShaderNodeVectorLen() {
  2084. set_input_port_default_value(0, Vector3());
  2085. }
  2086. ////////////// Determinant
  2087. String VisualShaderNodeDeterminant::get_caption() const {
  2088. return "Determinant";
  2089. }
  2090. int VisualShaderNodeDeterminant::get_input_port_count() const {
  2091. return 1;
  2092. }
  2093. VisualShaderNodeDeterminant::PortType VisualShaderNodeDeterminant::get_input_port_type(int p_port) const {
  2094. return PORT_TYPE_TRANSFORM;
  2095. }
  2096. String VisualShaderNodeDeterminant::get_input_port_name(int p_port) const {
  2097. return "";
  2098. }
  2099. int VisualShaderNodeDeterminant::get_output_port_count() const {
  2100. return 1;
  2101. }
  2102. VisualShaderNodeDeterminant::PortType VisualShaderNodeDeterminant::get_output_port_type(int p_port) const {
  2103. return PORT_TYPE_SCALAR;
  2104. }
  2105. String VisualShaderNodeDeterminant::get_output_port_name(int p_port) const {
  2106. return "";
  2107. }
  2108. String VisualShaderNodeDeterminant::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2109. return "\t" + p_output_vars[0] + " = determinant(" + p_input_vars[0] + ");\n";
  2110. }
  2111. VisualShaderNodeDeterminant::VisualShaderNodeDeterminant() {
  2112. set_input_port_default_value(0, Transform());
  2113. }
  2114. ////////////// Scalar Derivative Function
  2115. String VisualShaderNodeScalarDerivativeFunc::get_caption() const {
  2116. return "ScalarDerivativeFunc";
  2117. }
  2118. int VisualShaderNodeScalarDerivativeFunc::get_input_port_count() const {
  2119. return 1;
  2120. }
  2121. VisualShaderNodeScalarDerivativeFunc::PortType VisualShaderNodeScalarDerivativeFunc::get_input_port_type(int p_port) const {
  2122. return PORT_TYPE_SCALAR;
  2123. }
  2124. String VisualShaderNodeScalarDerivativeFunc::get_input_port_name(int p_port) const {
  2125. return "";
  2126. }
  2127. int VisualShaderNodeScalarDerivativeFunc::get_output_port_count() const {
  2128. return 1;
  2129. }
  2130. VisualShaderNodeScalarDerivativeFunc::PortType VisualShaderNodeScalarDerivativeFunc::get_output_port_type(int p_port) const {
  2131. return PORT_TYPE_SCALAR;
  2132. }
  2133. String VisualShaderNodeScalarDerivativeFunc::get_output_port_name(int p_port) const {
  2134. return "";
  2135. }
  2136. String VisualShaderNodeScalarDerivativeFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2137. static const char *funcs[FUNC_Y + 1] = {
  2138. "fwidth($)",
  2139. "dFdx($)",
  2140. "dFdy($)"
  2141. };
  2142. String code;
  2143. code += "\t" + p_output_vars[0] + " = " + String(funcs[func]).replace("$", p_input_vars[0]) + ";\n";
  2144. return code;
  2145. }
  2146. void VisualShaderNodeScalarDerivativeFunc::set_function(Function p_func) {
  2147. func = p_func;
  2148. emit_changed();
  2149. }
  2150. VisualShaderNodeScalarDerivativeFunc::Function VisualShaderNodeScalarDerivativeFunc::get_function() const {
  2151. return func;
  2152. }
  2153. Vector<StringName> VisualShaderNodeScalarDerivativeFunc::get_editable_properties() const {
  2154. Vector<StringName> props;
  2155. props.push_back("function");
  2156. return props;
  2157. }
  2158. void VisualShaderNodeScalarDerivativeFunc::_bind_methods() {
  2159. ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeScalarDerivativeFunc::set_function);
  2160. ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeScalarDerivativeFunc::get_function);
  2161. ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Sum,X,Y"), "set_function", "get_function");
  2162. BIND_ENUM_CONSTANT(FUNC_SUM);
  2163. BIND_ENUM_CONSTANT(FUNC_X);
  2164. BIND_ENUM_CONSTANT(FUNC_Y);
  2165. }
  2166. VisualShaderNodeScalarDerivativeFunc::VisualShaderNodeScalarDerivativeFunc() {
  2167. set_input_port_default_value(0, 0.0);
  2168. }
  2169. ////////////// Vector Derivative Function
  2170. String VisualShaderNodeVectorDerivativeFunc::get_caption() const {
  2171. return "VectorDerivativeFunc";
  2172. }
  2173. int VisualShaderNodeVectorDerivativeFunc::get_input_port_count() const {
  2174. return 1;
  2175. }
  2176. VisualShaderNodeVectorDerivativeFunc::PortType VisualShaderNodeVectorDerivativeFunc::get_input_port_type(int p_port) const {
  2177. return PORT_TYPE_VECTOR;
  2178. }
  2179. String VisualShaderNodeVectorDerivativeFunc::get_input_port_name(int p_port) const {
  2180. return "";
  2181. }
  2182. int VisualShaderNodeVectorDerivativeFunc::get_output_port_count() const {
  2183. return 1;
  2184. }
  2185. VisualShaderNodeVectorDerivativeFunc::PortType VisualShaderNodeVectorDerivativeFunc::get_output_port_type(int p_port) const {
  2186. return PORT_TYPE_VECTOR;
  2187. }
  2188. String VisualShaderNodeVectorDerivativeFunc::get_output_port_name(int p_port) const {
  2189. return "";
  2190. }
  2191. String VisualShaderNodeVectorDerivativeFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2192. static const char *funcs[FUNC_Y + 1] = {
  2193. "fwidth($)",
  2194. "dFdx($)",
  2195. "dFdy($)"
  2196. };
  2197. String code;
  2198. code += "\t" + p_output_vars[0] + " = " + String(funcs[func]).replace("$", p_input_vars[0]) + ";\n";
  2199. return code;
  2200. }
  2201. void VisualShaderNodeVectorDerivativeFunc::set_function(Function p_func) {
  2202. func = p_func;
  2203. emit_changed();
  2204. }
  2205. VisualShaderNodeVectorDerivativeFunc::Function VisualShaderNodeVectorDerivativeFunc::get_function() const {
  2206. return func;
  2207. }
  2208. Vector<StringName> VisualShaderNodeVectorDerivativeFunc::get_editable_properties() const {
  2209. Vector<StringName> props;
  2210. props.push_back("function");
  2211. return props;
  2212. }
  2213. void VisualShaderNodeVectorDerivativeFunc::_bind_methods() {
  2214. ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeVectorDerivativeFunc::set_function);
  2215. ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeVectorDerivativeFunc::get_function);
  2216. ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Sum,X,Y"), "set_function", "get_function");
  2217. BIND_ENUM_CONSTANT(FUNC_SUM);
  2218. BIND_ENUM_CONSTANT(FUNC_X);
  2219. BIND_ENUM_CONSTANT(FUNC_Y);
  2220. }
  2221. VisualShaderNodeVectorDerivativeFunc::VisualShaderNodeVectorDerivativeFunc() {
  2222. set_input_port_default_value(0, Vector3());
  2223. }
  2224. ////////////// Clamp
  2225. String VisualShaderNodeClamp::get_caption() const {
  2226. return "Clamp";
  2227. }
  2228. int VisualShaderNodeClamp::get_input_port_count() const {
  2229. return 3;
  2230. }
  2231. VisualShaderNodeClamp::PortType VisualShaderNodeClamp::get_input_port_type(int p_port) const {
  2232. switch (op_type) {
  2233. case OP_TYPE_INT:
  2234. return PORT_TYPE_SCALAR_INT;
  2235. case OP_TYPE_VECTOR:
  2236. return PORT_TYPE_VECTOR;
  2237. default:
  2238. break;
  2239. }
  2240. return PORT_TYPE_SCALAR;
  2241. }
  2242. String VisualShaderNodeClamp::get_input_port_name(int p_port) const {
  2243. if (p_port == 0) {
  2244. return "";
  2245. } else if (p_port == 1) {
  2246. return "min";
  2247. } else if (p_port == 2) {
  2248. return "max";
  2249. }
  2250. return "";
  2251. }
  2252. int VisualShaderNodeClamp::get_output_port_count() const {
  2253. return 1;
  2254. }
  2255. VisualShaderNodeClamp::PortType VisualShaderNodeClamp::get_output_port_type(int p_port) const {
  2256. switch (op_type) {
  2257. case OP_TYPE_INT:
  2258. return PORT_TYPE_SCALAR_INT;
  2259. case OP_TYPE_VECTOR:
  2260. return PORT_TYPE_VECTOR;
  2261. default:
  2262. break;
  2263. }
  2264. return PORT_TYPE_SCALAR;
  2265. }
  2266. String VisualShaderNodeClamp::get_output_port_name(int p_port) const {
  2267. return "";
  2268. }
  2269. String VisualShaderNodeClamp::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2270. return "\t" + p_output_vars[0] + " = clamp(" + p_input_vars[0] + ", " + p_input_vars[1] + ", " + p_input_vars[2] + ");\n";
  2271. }
  2272. void VisualShaderNodeClamp::set_op_type(OpType p_op_type) {
  2273. ERR_FAIL_INDEX((int)p_op_type, OP_TYPE_MAX);
  2274. if (op_type == p_op_type) {
  2275. return;
  2276. }
  2277. switch (p_op_type) {
  2278. case OP_TYPE_FLOAT:
  2279. set_input_port_default_value(0, 0.0);
  2280. set_input_port_default_value(1, 0.0);
  2281. set_input_port_default_value(2, 0.0);
  2282. break;
  2283. case OP_TYPE_INT:
  2284. set_input_port_default_value(0, 0);
  2285. set_input_port_default_value(1, 0);
  2286. set_input_port_default_value(2, 0);
  2287. break;
  2288. case OP_TYPE_VECTOR:
  2289. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0));
  2290. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
  2291. set_input_port_default_value(2, Vector3(0.0, 0.0, 0.0));
  2292. break;
  2293. default:
  2294. break;
  2295. }
  2296. op_type = p_op_type;
  2297. emit_changed();
  2298. }
  2299. VisualShaderNodeClamp::OpType VisualShaderNodeClamp::get_op_type() const {
  2300. return op_type;
  2301. }
  2302. Vector<StringName> VisualShaderNodeClamp::get_editable_properties() const {
  2303. Vector<StringName> props;
  2304. props.push_back("op_type");
  2305. return props;
  2306. }
  2307. void VisualShaderNodeClamp::_bind_methods() {
  2308. ClassDB::bind_method(D_METHOD("set_op_type", "type"), &VisualShaderNodeClamp::set_op_type);
  2309. ClassDB::bind_method(D_METHOD("get_op_type"), &VisualShaderNodeClamp::get_op_type);
  2310. ADD_PROPERTY(PropertyInfo(Variant::INT, "op_type", PROPERTY_HINT_ENUM, "Float,Int,Vector"), "set_op_type", "get_op_type");
  2311. BIND_ENUM_CONSTANT(OP_TYPE_FLOAT);
  2312. BIND_ENUM_CONSTANT(OP_TYPE_INT);
  2313. BIND_ENUM_CONSTANT(OP_TYPE_VECTOR);
  2314. BIND_ENUM_CONSTANT(OP_TYPE_MAX);
  2315. }
  2316. VisualShaderNodeClamp::VisualShaderNodeClamp() {
  2317. set_input_port_default_value(0, 0.0);
  2318. set_input_port_default_value(1, 0.0);
  2319. set_input_port_default_value(2, 1.0);
  2320. }
  2321. ////////////// FaceForward
  2322. String VisualShaderNodeFaceForward::get_caption() const {
  2323. return "FaceForward";
  2324. }
  2325. int VisualShaderNodeFaceForward::get_input_port_count() const {
  2326. return 3;
  2327. }
  2328. VisualShaderNodeFaceForward::PortType VisualShaderNodeFaceForward::get_input_port_type(int p_port) const {
  2329. return PORT_TYPE_VECTOR;
  2330. }
  2331. String VisualShaderNodeFaceForward::get_input_port_name(int p_port) const {
  2332. switch (p_port) {
  2333. case 0:
  2334. return "N";
  2335. case 1:
  2336. return "I";
  2337. case 2:
  2338. return "Nref";
  2339. default:
  2340. return "";
  2341. }
  2342. }
  2343. int VisualShaderNodeFaceForward::get_output_port_count() const {
  2344. return 1;
  2345. }
  2346. VisualShaderNodeFaceForward::PortType VisualShaderNodeFaceForward::get_output_port_type(int p_port) const {
  2347. return PORT_TYPE_VECTOR;
  2348. }
  2349. String VisualShaderNodeFaceForward::get_output_port_name(int p_port) const {
  2350. return "";
  2351. }
  2352. String VisualShaderNodeFaceForward::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2353. return "\t" + p_output_vars[0] + " = faceforward(" + p_input_vars[0] + ", " + p_input_vars[1] + ", " + p_input_vars[2] + ");\n";
  2354. }
  2355. VisualShaderNodeFaceForward::VisualShaderNodeFaceForward() {
  2356. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0));
  2357. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
  2358. set_input_port_default_value(2, Vector3(0.0, 0.0, 0.0));
  2359. }
  2360. ////////////// Outer Product
  2361. String VisualShaderNodeOuterProduct::get_caption() const {
  2362. return "OuterProduct";
  2363. }
  2364. int VisualShaderNodeOuterProduct::get_input_port_count() const {
  2365. return 2;
  2366. }
  2367. VisualShaderNodeOuterProduct::PortType VisualShaderNodeOuterProduct::get_input_port_type(int p_port) const {
  2368. return PORT_TYPE_VECTOR;
  2369. }
  2370. String VisualShaderNodeOuterProduct::get_input_port_name(int p_port) const {
  2371. switch (p_port) {
  2372. case 0:
  2373. return "c";
  2374. case 1:
  2375. return "r";
  2376. default:
  2377. return "";
  2378. }
  2379. }
  2380. int VisualShaderNodeOuterProduct::get_output_port_count() const {
  2381. return 1;
  2382. }
  2383. VisualShaderNodeOuterProduct::PortType VisualShaderNodeOuterProduct::get_output_port_type(int p_port) const {
  2384. return PORT_TYPE_TRANSFORM;
  2385. }
  2386. String VisualShaderNodeOuterProduct::get_output_port_name(int p_port) const {
  2387. return "";
  2388. }
  2389. String VisualShaderNodeOuterProduct::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2390. return "\t" + p_output_vars[0] + " = outerProduct(vec4(" + p_input_vars[0] + ", 0.0), vec4(" + p_input_vars[1] + ", 0.0));\n";
  2391. }
  2392. VisualShaderNodeOuterProduct::VisualShaderNodeOuterProduct() {
  2393. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0));
  2394. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
  2395. }
  2396. ////////////// Step
  2397. String VisualShaderNodeStep::get_caption() const {
  2398. return "Step";
  2399. }
  2400. int VisualShaderNodeStep::get_input_port_count() const {
  2401. return 2;
  2402. }
  2403. VisualShaderNodeStep::PortType VisualShaderNodeStep::get_input_port_type(int p_port) const {
  2404. switch (op_type) {
  2405. case OP_TYPE_VECTOR:
  2406. return PORT_TYPE_VECTOR;
  2407. case OP_TYPE_VECTOR_SCALAR:
  2408. if (p_port == 1) {
  2409. return PORT_TYPE_VECTOR;
  2410. }
  2411. break;
  2412. default:
  2413. break;
  2414. }
  2415. return PORT_TYPE_SCALAR;
  2416. }
  2417. String VisualShaderNodeStep::get_input_port_name(int p_port) const {
  2418. if (p_port == 0) {
  2419. return "edge";
  2420. } else if (p_port == 1) {
  2421. return "x";
  2422. }
  2423. return "";
  2424. }
  2425. int VisualShaderNodeStep::get_output_port_count() const {
  2426. return 1;
  2427. }
  2428. VisualShaderNodeStep::PortType VisualShaderNodeStep::get_output_port_type(int p_port) const {
  2429. switch (op_type) {
  2430. case OP_TYPE_VECTOR:
  2431. return PORT_TYPE_VECTOR;
  2432. case OP_TYPE_VECTOR_SCALAR:
  2433. return PORT_TYPE_VECTOR;
  2434. default:
  2435. break;
  2436. }
  2437. return PORT_TYPE_SCALAR;
  2438. }
  2439. String VisualShaderNodeStep::get_output_port_name(int p_port) const {
  2440. return "";
  2441. }
  2442. void VisualShaderNodeStep::set_op_type(OpType p_op_type) {
  2443. ERR_FAIL_INDEX((int)p_op_type, OP_TYPE_MAX);
  2444. if (op_type == p_op_type) {
  2445. return;
  2446. }
  2447. switch (p_op_type) {
  2448. case OP_TYPE_SCALAR:
  2449. if (op_type == OP_TYPE_VECTOR) {
  2450. set_input_port_default_value(0, 0.0); // edge
  2451. }
  2452. if (op_type == OP_TYPE_VECTOR || op_type == OP_TYPE_VECTOR_SCALAR) {
  2453. set_input_port_default_value(1, 0.0); // x
  2454. }
  2455. break;
  2456. case OP_TYPE_VECTOR:
  2457. if (op_type == OP_TYPE_SCALAR || op_type == OP_TYPE_VECTOR_SCALAR) {
  2458. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0)); // edge
  2459. }
  2460. if (op_type == OP_TYPE_SCALAR) {
  2461. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0)); // x
  2462. }
  2463. break;
  2464. case OP_TYPE_VECTOR_SCALAR:
  2465. if (op_type == OP_TYPE_VECTOR) {
  2466. set_input_port_default_value(0, 0.0); // edge
  2467. }
  2468. if (op_type == OP_TYPE_SCALAR) {
  2469. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0)); // x
  2470. }
  2471. break;
  2472. default:
  2473. break;
  2474. }
  2475. op_type = p_op_type;
  2476. emit_changed();
  2477. }
  2478. VisualShaderNodeStep::OpType VisualShaderNodeStep::get_op_type() const {
  2479. return op_type;
  2480. }
  2481. String VisualShaderNodeStep::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 {
  2482. return "\t" + p_output_vars[0] + " = step(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  2483. }
  2484. Vector<StringName> VisualShaderNodeStep::get_editable_properties() const {
  2485. Vector<StringName> props;
  2486. props.push_back("op_type");
  2487. return props;
  2488. }
  2489. void VisualShaderNodeStep::_bind_methods() {
  2490. ClassDB::bind_method(D_METHOD("set_op_type", "type"), &VisualShaderNodeStep::set_op_type);
  2491. ClassDB::bind_method(D_METHOD("get_op_type"), &VisualShaderNodeStep::get_op_type);
  2492. ADD_PROPERTY(PropertyInfo(Variant::INT, "op_type", PROPERTY_HINT_ENUM, "Scalar,Vector,VectorScalar"), "set_op_type", "get_op_type");
  2493. BIND_ENUM_CONSTANT(OP_TYPE_SCALAR);
  2494. BIND_ENUM_CONSTANT(OP_TYPE_VECTOR);
  2495. BIND_ENUM_CONSTANT(OP_TYPE_VECTOR_SCALAR);
  2496. BIND_ENUM_CONSTANT(OP_TYPE_MAX);
  2497. }
  2498. VisualShaderNodeStep::VisualShaderNodeStep() {
  2499. set_input_port_default_value(0, 0.0);
  2500. set_input_port_default_value(1, 0.0);
  2501. }
  2502. ////////////// SmoothStep
  2503. String VisualShaderNodeSmoothStep::get_caption() const {
  2504. return "SmoothStep";
  2505. }
  2506. int VisualShaderNodeSmoothStep::get_input_port_count() const {
  2507. return 3;
  2508. }
  2509. VisualShaderNodeSmoothStep::PortType VisualShaderNodeSmoothStep::get_input_port_type(int p_port) const {
  2510. switch (op_type) {
  2511. case OP_TYPE_VECTOR:
  2512. return PORT_TYPE_VECTOR;
  2513. case OP_TYPE_VECTOR_SCALAR:
  2514. if (p_port == 2) {
  2515. return PORT_TYPE_VECTOR; // x
  2516. }
  2517. break;
  2518. default:
  2519. break;
  2520. }
  2521. return PORT_TYPE_SCALAR;
  2522. }
  2523. String VisualShaderNodeSmoothStep::get_input_port_name(int p_port) const {
  2524. if (p_port == 0) {
  2525. return "edge0";
  2526. } else if (p_port == 1) {
  2527. return "edge1";
  2528. } else if (p_port == 2) {
  2529. return "x";
  2530. }
  2531. return "";
  2532. }
  2533. int VisualShaderNodeSmoothStep::get_output_port_count() const {
  2534. return 1;
  2535. }
  2536. VisualShaderNodeSmoothStep::PortType VisualShaderNodeSmoothStep::get_output_port_type(int p_port) const {
  2537. switch (op_type) {
  2538. case OP_TYPE_VECTOR:
  2539. return PORT_TYPE_VECTOR;
  2540. case OP_TYPE_VECTOR_SCALAR:
  2541. return PORT_TYPE_VECTOR;
  2542. default:
  2543. break;
  2544. }
  2545. return PORT_TYPE_SCALAR;
  2546. }
  2547. String VisualShaderNodeSmoothStep::get_output_port_name(int p_port) const {
  2548. return "";
  2549. }
  2550. void VisualShaderNodeSmoothStep::set_op_type(OpType p_op_type) {
  2551. ERR_FAIL_INDEX((int)p_op_type, OP_TYPE_MAX);
  2552. if (op_type == p_op_type) {
  2553. return;
  2554. }
  2555. switch (p_op_type) {
  2556. case OP_TYPE_SCALAR:
  2557. if (op_type == OP_TYPE_VECTOR) {
  2558. set_input_port_default_value(0, 0.0); // edge0
  2559. set_input_port_default_value(1, 0.0); // edge1
  2560. }
  2561. if (op_type == OP_TYPE_VECTOR || op_type == OP_TYPE_VECTOR_SCALAR) {
  2562. set_input_port_default_value(2, 0.0); // x
  2563. }
  2564. break;
  2565. case OP_TYPE_VECTOR:
  2566. if (op_type == OP_TYPE_SCALAR || op_type == OP_TYPE_VECTOR_SCALAR) {
  2567. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0)); // edge0
  2568. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0)); // edge1
  2569. }
  2570. if (op_type == OP_TYPE_SCALAR) {
  2571. set_input_port_default_value(2, Vector3(0.0, 0.0, 0.0)); // x
  2572. }
  2573. break;
  2574. case OP_TYPE_VECTOR_SCALAR:
  2575. if (op_type == OP_TYPE_VECTOR) {
  2576. set_input_port_default_value(0, 0.0); // edge0
  2577. set_input_port_default_value(1, 0.0); // edge1
  2578. }
  2579. if (op_type == OP_TYPE_SCALAR) {
  2580. set_input_port_default_value(2, Vector3(0.0, 0.0, 0.0)); // x
  2581. }
  2582. break;
  2583. default:
  2584. break;
  2585. }
  2586. op_type = p_op_type;
  2587. emit_changed();
  2588. }
  2589. VisualShaderNodeSmoothStep::OpType VisualShaderNodeSmoothStep::get_op_type() const {
  2590. return op_type;
  2591. }
  2592. String VisualShaderNodeSmoothStep::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 {
  2593. return "\t" + p_output_vars[0] + " = smoothstep(" + p_input_vars[0] + ", " + p_input_vars[1] + ", " + p_input_vars[2] + ");\n";
  2594. }
  2595. Vector<StringName> VisualShaderNodeSmoothStep::get_editable_properties() const {
  2596. Vector<StringName> props;
  2597. props.push_back("op_type");
  2598. return props;
  2599. }
  2600. void VisualShaderNodeSmoothStep::_bind_methods() {
  2601. ClassDB::bind_method(D_METHOD("set_op_type", "type"), &VisualShaderNodeSmoothStep::set_op_type);
  2602. ClassDB::bind_method(D_METHOD("get_op_type"), &VisualShaderNodeSmoothStep::get_op_type);
  2603. ADD_PROPERTY(PropertyInfo(Variant::INT, "op_type", PROPERTY_HINT_ENUM, "Scalar,Vector,VectorScalar"), "set_op_type", "get_op_type");
  2604. BIND_ENUM_CONSTANT(OP_TYPE_SCALAR);
  2605. BIND_ENUM_CONSTANT(OP_TYPE_VECTOR);
  2606. BIND_ENUM_CONSTANT(OP_TYPE_VECTOR_SCALAR);
  2607. BIND_ENUM_CONSTANT(OP_TYPE_MAX);
  2608. }
  2609. VisualShaderNodeSmoothStep::VisualShaderNodeSmoothStep() {
  2610. set_input_port_default_value(0, 0.0);
  2611. set_input_port_default_value(1, 0.0);
  2612. set_input_port_default_value(2, 0.0);
  2613. }
  2614. ////////////// Distance
  2615. String VisualShaderNodeVectorDistance::get_caption() const {
  2616. return "Distance";
  2617. }
  2618. int VisualShaderNodeVectorDistance::get_input_port_count() const {
  2619. return 2;
  2620. }
  2621. VisualShaderNodeVectorDistance::PortType VisualShaderNodeVectorDistance::get_input_port_type(int p_port) const {
  2622. return PORT_TYPE_VECTOR;
  2623. }
  2624. String VisualShaderNodeVectorDistance::get_input_port_name(int p_port) const {
  2625. if (p_port == 0) {
  2626. return "p0";
  2627. } else if (p_port == 1) {
  2628. return "p1";
  2629. }
  2630. return "";
  2631. }
  2632. int VisualShaderNodeVectorDistance::get_output_port_count() const {
  2633. return 1;
  2634. }
  2635. VisualShaderNodeVectorDistance::PortType VisualShaderNodeVectorDistance::get_output_port_type(int p_port) const {
  2636. return PORT_TYPE_SCALAR;
  2637. }
  2638. String VisualShaderNodeVectorDistance::get_output_port_name(int p_port) const {
  2639. return "";
  2640. }
  2641. String VisualShaderNodeVectorDistance::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2642. return "\t" + p_output_vars[0] + " = distance(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  2643. }
  2644. VisualShaderNodeVectorDistance::VisualShaderNodeVectorDistance() {
  2645. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0));
  2646. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
  2647. }
  2648. ////////////// Refract Vector
  2649. String VisualShaderNodeVectorRefract::get_caption() const {
  2650. return "Refract";
  2651. }
  2652. int VisualShaderNodeVectorRefract::get_input_port_count() const {
  2653. return 3;
  2654. }
  2655. VisualShaderNodeVectorRefract::PortType VisualShaderNodeVectorRefract::get_input_port_type(int p_port) const {
  2656. if (p_port == 2) {
  2657. return PORT_TYPE_SCALAR;
  2658. }
  2659. return PORT_TYPE_VECTOR;
  2660. }
  2661. String VisualShaderNodeVectorRefract::get_input_port_name(int p_port) const {
  2662. if (p_port == 0) {
  2663. return "I";
  2664. } else if (p_port == 1) {
  2665. return "N";
  2666. } else if (p_port == 2) {
  2667. return "eta";
  2668. }
  2669. return "";
  2670. }
  2671. int VisualShaderNodeVectorRefract::get_output_port_count() const {
  2672. return 1;
  2673. }
  2674. VisualShaderNodeVectorRefract::PortType VisualShaderNodeVectorRefract::get_output_port_type(int p_port) const {
  2675. return PORT_TYPE_VECTOR;
  2676. }
  2677. String VisualShaderNodeVectorRefract::get_output_port_name(int p_port) const {
  2678. return "";
  2679. }
  2680. String VisualShaderNodeVectorRefract::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2681. return "\t" + p_output_vars[0] + " = refract(" + p_input_vars[0] + ", " + p_input_vars[1] + ", " + p_input_vars[2] + ");\n";
  2682. }
  2683. VisualShaderNodeVectorRefract::VisualShaderNodeVectorRefract() {
  2684. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0));
  2685. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
  2686. set_input_port_default_value(2, 0.0);
  2687. }
  2688. ////////////// Mix
  2689. String VisualShaderNodeMix::get_caption() const {
  2690. return "Mix";
  2691. }
  2692. int VisualShaderNodeMix::get_input_port_count() const {
  2693. return 3;
  2694. }
  2695. VisualShaderNodeMix::PortType VisualShaderNodeMix::get_input_port_type(int p_port) const {
  2696. switch (op_type) {
  2697. case OP_TYPE_VECTOR:
  2698. return PORT_TYPE_VECTOR;
  2699. case OP_TYPE_VECTOR_SCALAR:
  2700. if (p_port == 2) {
  2701. break;
  2702. }
  2703. return PORT_TYPE_VECTOR;
  2704. default:
  2705. break;
  2706. }
  2707. return PORT_TYPE_SCALAR;
  2708. }
  2709. String VisualShaderNodeMix::get_input_port_name(int p_port) const {
  2710. if (p_port == 0) {
  2711. return "a";
  2712. } else if (p_port == 1) {
  2713. return "b";
  2714. } else {
  2715. return "weight";
  2716. }
  2717. }
  2718. int VisualShaderNodeMix::get_output_port_count() const {
  2719. return 1;
  2720. }
  2721. VisualShaderNodeMix::PortType VisualShaderNodeMix::get_output_port_type(int p_port) const {
  2722. switch (op_type) {
  2723. case OP_TYPE_VECTOR:
  2724. return PORT_TYPE_VECTOR;
  2725. case OP_TYPE_VECTOR_SCALAR:
  2726. return PORT_TYPE_VECTOR;
  2727. default:
  2728. break;
  2729. }
  2730. return PORT_TYPE_SCALAR;
  2731. }
  2732. String VisualShaderNodeMix::get_output_port_name(int p_port) const {
  2733. return "mix";
  2734. }
  2735. void VisualShaderNodeMix::set_op_type(OpType p_op_type) {
  2736. ERR_FAIL_INDEX((int)p_op_type, OP_TYPE_MAX);
  2737. if (op_type == p_op_type) {
  2738. return;
  2739. }
  2740. switch (p_op_type) {
  2741. case OP_TYPE_SCALAR:
  2742. set_input_port_default_value(0, 0.0); // a
  2743. set_input_port_default_value(1, 1.0); // b
  2744. if (op_type == OP_TYPE_VECTOR) {
  2745. set_input_port_default_value(2, 0.5); // weight
  2746. }
  2747. break;
  2748. case OP_TYPE_VECTOR:
  2749. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0)); // a
  2750. set_input_port_default_value(1, Vector3(1.0, 1.0, 1.0)); // b
  2751. if (op_type == OP_TYPE_SCALAR || op_type == OP_TYPE_VECTOR_SCALAR) {
  2752. set_input_port_default_value(2, Vector3(0.5, 0.5, 0.5)); // weight
  2753. }
  2754. break;
  2755. case OP_TYPE_VECTOR_SCALAR:
  2756. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0)); // a
  2757. set_input_port_default_value(1, Vector3(1.0, 1.0, 1.0)); // b
  2758. if (op_type == OP_TYPE_VECTOR) {
  2759. set_input_port_default_value(2, 0.5); // weight
  2760. }
  2761. break;
  2762. default:
  2763. break;
  2764. }
  2765. op_type = p_op_type;
  2766. emit_changed();
  2767. }
  2768. VisualShaderNodeMix::OpType VisualShaderNodeMix::get_op_type() const {
  2769. return op_type;
  2770. }
  2771. String VisualShaderNodeMix::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 {
  2772. return "\t" + p_output_vars[0] + " = mix(" + p_input_vars[0] + ", " + p_input_vars[1] + ", " + p_input_vars[2] + ");\n";
  2773. }
  2774. Vector<StringName> VisualShaderNodeMix::get_editable_properties() const {
  2775. Vector<StringName> props;
  2776. props.push_back("op_type");
  2777. return props;
  2778. }
  2779. void VisualShaderNodeMix::_bind_methods() {
  2780. ClassDB::bind_method(D_METHOD("set_op_type", "type"), &VisualShaderNodeMix::set_op_type);
  2781. ClassDB::bind_method(D_METHOD("get_op_type"), &VisualShaderNodeMix::get_op_type);
  2782. ADD_PROPERTY(PropertyInfo(Variant::INT, "op_type", PROPERTY_HINT_ENUM, "Scalar,Vector,VectorScalar"), "set_op_type", "get_op_type");
  2783. BIND_ENUM_CONSTANT(OP_TYPE_SCALAR);
  2784. BIND_ENUM_CONSTANT(OP_TYPE_VECTOR);
  2785. BIND_ENUM_CONSTANT(OP_TYPE_VECTOR_SCALAR);
  2786. BIND_ENUM_CONSTANT(OP_TYPE_MAX);
  2787. }
  2788. VisualShaderNodeMix::VisualShaderNodeMix() {
  2789. set_input_port_default_value(0, 0.0); // a
  2790. set_input_port_default_value(1, 1.0); // b
  2791. set_input_port_default_value(2, 0.5); // weight
  2792. }
  2793. ////////////// Vector Compose
  2794. String VisualShaderNodeVectorCompose::get_caption() const {
  2795. return "VectorCompose";
  2796. }
  2797. int VisualShaderNodeVectorCompose::get_input_port_count() const {
  2798. return 3;
  2799. }
  2800. VisualShaderNodeVectorCompose::PortType VisualShaderNodeVectorCompose::get_input_port_type(int p_port) const {
  2801. return PORT_TYPE_SCALAR;
  2802. }
  2803. String VisualShaderNodeVectorCompose::get_input_port_name(int p_port) const {
  2804. if (p_port == 0) {
  2805. return "x";
  2806. } else if (p_port == 1) {
  2807. return "y";
  2808. } else {
  2809. return "z";
  2810. }
  2811. }
  2812. int VisualShaderNodeVectorCompose::get_output_port_count() const {
  2813. return 1;
  2814. }
  2815. VisualShaderNodeVectorCompose::PortType VisualShaderNodeVectorCompose::get_output_port_type(int p_port) const {
  2816. return PORT_TYPE_VECTOR;
  2817. }
  2818. String VisualShaderNodeVectorCompose::get_output_port_name(int p_port) const {
  2819. return "vec";
  2820. }
  2821. String VisualShaderNodeVectorCompose::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2822. return "\t" + p_output_vars[0] + " = vec3(" + p_input_vars[0] + ", " + p_input_vars[1] + ", " + p_input_vars[2] + ");\n";
  2823. }
  2824. VisualShaderNodeVectorCompose::VisualShaderNodeVectorCompose() {
  2825. set_input_port_default_value(0, 0.0);
  2826. set_input_port_default_value(1, 0.0);
  2827. set_input_port_default_value(2, 0.0);
  2828. }
  2829. ////////////// Transform Compose
  2830. String VisualShaderNodeTransformCompose::get_caption() const {
  2831. return "TransformCompose";
  2832. }
  2833. int VisualShaderNodeTransformCompose::get_input_port_count() const {
  2834. return 4;
  2835. }
  2836. VisualShaderNodeTransformCompose::PortType VisualShaderNodeTransformCompose::get_input_port_type(int p_port) const {
  2837. return PORT_TYPE_VECTOR;
  2838. }
  2839. String VisualShaderNodeTransformCompose::get_input_port_name(int p_port) const {
  2840. if (p_port == 0) {
  2841. return "x";
  2842. } else if (p_port == 1) {
  2843. return "y";
  2844. } else if (p_port == 2) {
  2845. return "z";
  2846. } else {
  2847. return "origin";
  2848. }
  2849. }
  2850. int VisualShaderNodeTransformCompose::get_output_port_count() const {
  2851. return 1;
  2852. }
  2853. VisualShaderNodeTransformCompose::PortType VisualShaderNodeTransformCompose::get_output_port_type(int p_port) const {
  2854. return PORT_TYPE_TRANSFORM;
  2855. }
  2856. String VisualShaderNodeTransformCompose::get_output_port_name(int p_port) const {
  2857. return "xform";
  2858. }
  2859. String VisualShaderNodeTransformCompose::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2860. return "\t" + p_output_vars[0] + " = mat4(vec4(" + p_input_vars[0] + ", 0.0), vec4(" + p_input_vars[1] + ", 0.0), vec4(" + p_input_vars[2] + ", 0.0), vec4(" + p_input_vars[3] + ", 1.0));\n";
  2861. }
  2862. VisualShaderNodeTransformCompose::VisualShaderNodeTransformCompose() {
  2863. set_input_port_default_value(0, Vector3());
  2864. set_input_port_default_value(1, Vector3());
  2865. set_input_port_default_value(2, Vector3());
  2866. set_input_port_default_value(3, Vector3());
  2867. }
  2868. ////////////// Vector Decompose
  2869. String VisualShaderNodeVectorDecompose::get_caption() const {
  2870. return "VectorDecompose";
  2871. }
  2872. int VisualShaderNodeVectorDecompose::get_input_port_count() const {
  2873. return 1;
  2874. }
  2875. VisualShaderNodeVectorDecompose::PortType VisualShaderNodeVectorDecompose::get_input_port_type(int p_port) const {
  2876. return PORT_TYPE_VECTOR;
  2877. }
  2878. String VisualShaderNodeVectorDecompose::get_input_port_name(int p_port) const {
  2879. return "vec";
  2880. }
  2881. int VisualShaderNodeVectorDecompose::get_output_port_count() const {
  2882. return 3;
  2883. }
  2884. VisualShaderNodeVectorDecompose::PortType VisualShaderNodeVectorDecompose::get_output_port_type(int p_port) const {
  2885. return PORT_TYPE_SCALAR;
  2886. }
  2887. String VisualShaderNodeVectorDecompose::get_output_port_name(int p_port) const {
  2888. if (p_port == 0) {
  2889. return "x";
  2890. } else if (p_port == 1) {
  2891. return "y";
  2892. } else {
  2893. return "z";
  2894. }
  2895. }
  2896. String VisualShaderNodeVectorDecompose::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2897. String code;
  2898. code += "\t" + p_output_vars[0] + " = " + p_input_vars[0] + ".x;\n";
  2899. code += "\t" + p_output_vars[1] + " = " + p_input_vars[0] + ".y;\n";
  2900. code += "\t" + p_output_vars[2] + " = " + p_input_vars[0] + ".z;\n";
  2901. return code;
  2902. }
  2903. VisualShaderNodeVectorDecompose::VisualShaderNodeVectorDecompose() {
  2904. set_input_port_default_value(0, Vector3());
  2905. }
  2906. ////////////// Transform Decompose
  2907. String VisualShaderNodeTransformDecompose::get_caption() const {
  2908. return "TransformDecompose";
  2909. }
  2910. int VisualShaderNodeTransformDecompose::get_input_port_count() const {
  2911. return 1;
  2912. }
  2913. VisualShaderNodeTransformDecompose::PortType VisualShaderNodeTransformDecompose::get_input_port_type(int p_port) const {
  2914. return PORT_TYPE_TRANSFORM;
  2915. }
  2916. String VisualShaderNodeTransformDecompose::get_input_port_name(int p_port) const {
  2917. return "xform";
  2918. }
  2919. int VisualShaderNodeTransformDecompose::get_output_port_count() const {
  2920. return 4;
  2921. }
  2922. VisualShaderNodeTransformDecompose::PortType VisualShaderNodeTransformDecompose::get_output_port_type(int p_port) const {
  2923. return PORT_TYPE_VECTOR;
  2924. }
  2925. String VisualShaderNodeTransformDecompose::get_output_port_name(int p_port) const {
  2926. if (p_port == 0) {
  2927. return "x";
  2928. } else if (p_port == 1) {
  2929. return "y";
  2930. } else if (p_port == 2) {
  2931. return "z";
  2932. } else {
  2933. return "origin";
  2934. }
  2935. }
  2936. String VisualShaderNodeTransformDecompose::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  2937. String code;
  2938. code += "\t" + p_output_vars[0] + " = " + p_input_vars[0] + "[0].xyz;\n";
  2939. code += "\t" + p_output_vars[1] + " = " + p_input_vars[0] + "[1].xyz;\n";
  2940. code += "\t" + p_output_vars[2] + " = " + p_input_vars[0] + "[2].xyz;\n";
  2941. code += "\t" + p_output_vars[3] + " = " + p_input_vars[0] + "[3].xyz;\n";
  2942. return code;
  2943. }
  2944. VisualShaderNodeTransformDecompose::VisualShaderNodeTransformDecompose() {
  2945. set_input_port_default_value(0, Transform());
  2946. }
  2947. ////////////// Float Uniform
  2948. String VisualShaderNodeFloatUniform::get_caption() const {
  2949. return "FloatUniform";
  2950. }
  2951. int VisualShaderNodeFloatUniform::get_input_port_count() const {
  2952. return 0;
  2953. }
  2954. VisualShaderNodeFloatUniform::PortType VisualShaderNodeFloatUniform::get_input_port_type(int p_port) const {
  2955. return PORT_TYPE_SCALAR;
  2956. }
  2957. String VisualShaderNodeFloatUniform::get_input_port_name(int p_port) const {
  2958. return String();
  2959. }
  2960. int VisualShaderNodeFloatUniform::get_output_port_count() const {
  2961. return 1;
  2962. }
  2963. VisualShaderNodeFloatUniform::PortType VisualShaderNodeFloatUniform::get_output_port_type(int p_port) const {
  2964. return PORT_TYPE_SCALAR;
  2965. }
  2966. String VisualShaderNodeFloatUniform::get_output_port_name(int p_port) const {
  2967. return ""; //no output port means the editor will be used as port
  2968. }
  2969. String VisualShaderNodeFloatUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  2970. String code = "";
  2971. if (hint == HINT_RANGE) {
  2972. code += _get_qual_str() + "uniform float " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ")";
  2973. } else if (hint == HINT_RANGE_STEP) {
  2974. code += _get_qual_str() + "uniform float " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ", " + rtos(hint_range_step) + ")";
  2975. } else {
  2976. code += _get_qual_str() + "uniform float " + get_uniform_name();
  2977. }
  2978. if (default_value_enabled) {
  2979. code += " = " + rtos(default_value);
  2980. }
  2981. code += ";\n";
  2982. return code;
  2983. }
  2984. String VisualShaderNodeFloatUniform::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 {
  2985. return "\t" + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
  2986. }
  2987. bool VisualShaderNodeFloatUniform::is_show_prop_names() const {
  2988. return true;
  2989. }
  2990. bool VisualShaderNodeFloatUniform::is_use_prop_slots() const {
  2991. return true;
  2992. }
  2993. void VisualShaderNodeFloatUniform::set_hint(Hint p_hint) {
  2994. hint = p_hint;
  2995. emit_changed();
  2996. }
  2997. VisualShaderNodeFloatUniform::Hint VisualShaderNodeFloatUniform::get_hint() const {
  2998. return hint;
  2999. }
  3000. void VisualShaderNodeFloatUniform::set_min(float p_value) {
  3001. hint_range_min = p_value;
  3002. emit_changed();
  3003. }
  3004. float VisualShaderNodeFloatUniform::get_min() const {
  3005. return hint_range_min;
  3006. }
  3007. void VisualShaderNodeFloatUniform::set_max(float p_value) {
  3008. hint_range_max = p_value;
  3009. emit_changed();
  3010. }
  3011. float VisualShaderNodeFloatUniform::get_max() const {
  3012. return hint_range_max;
  3013. }
  3014. void VisualShaderNodeFloatUniform::set_step(float p_value) {
  3015. hint_range_step = p_value;
  3016. emit_changed();
  3017. }
  3018. float VisualShaderNodeFloatUniform::get_step() const {
  3019. return hint_range_step;
  3020. }
  3021. void VisualShaderNodeFloatUniform::set_default_value_enabled(bool p_enabled) {
  3022. default_value_enabled = p_enabled;
  3023. emit_changed();
  3024. }
  3025. bool VisualShaderNodeFloatUniform::is_default_value_enabled() const {
  3026. return default_value_enabled;
  3027. }
  3028. void VisualShaderNodeFloatUniform::set_default_value(float p_value) {
  3029. default_value = p_value;
  3030. emit_changed();
  3031. }
  3032. float VisualShaderNodeFloatUniform::get_default_value() const {
  3033. return default_value;
  3034. }
  3035. void VisualShaderNodeFloatUniform::_bind_methods() {
  3036. ClassDB::bind_method(D_METHOD("set_hint", "hint"), &VisualShaderNodeFloatUniform::set_hint);
  3037. ClassDB::bind_method(D_METHOD("get_hint"), &VisualShaderNodeFloatUniform::get_hint);
  3038. ClassDB::bind_method(D_METHOD("set_min", "value"), &VisualShaderNodeFloatUniform::set_min);
  3039. ClassDB::bind_method(D_METHOD("get_min"), &VisualShaderNodeFloatUniform::get_min);
  3040. ClassDB::bind_method(D_METHOD("set_max", "value"), &VisualShaderNodeFloatUniform::set_max);
  3041. ClassDB::bind_method(D_METHOD("get_max"), &VisualShaderNodeFloatUniform::get_max);
  3042. ClassDB::bind_method(D_METHOD("set_step", "value"), &VisualShaderNodeFloatUniform::set_step);
  3043. ClassDB::bind_method(D_METHOD("get_step"), &VisualShaderNodeFloatUniform::get_step);
  3044. ClassDB::bind_method(D_METHOD("set_default_value_enabled", "enabled"), &VisualShaderNodeFloatUniform::set_default_value_enabled);
  3045. ClassDB::bind_method(D_METHOD("is_default_value_enabled"), &VisualShaderNodeFloatUniform::is_default_value_enabled);
  3046. ClassDB::bind_method(D_METHOD("set_default_value", "value"), &VisualShaderNodeFloatUniform::set_default_value);
  3047. ClassDB::bind_method(D_METHOD("get_default_value"), &VisualShaderNodeFloatUniform::get_default_value);
  3048. ADD_PROPERTY(PropertyInfo(Variant::INT, "hint", PROPERTY_HINT_ENUM, "None,Range,Range+Step"), "set_hint", "get_hint");
  3049. ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "min"), "set_min", "get_min");
  3050. ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "max"), "set_max", "get_max");
  3051. ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "step"), "set_step", "get_step");
  3052. ADD_PROPERTY(PropertyInfo(Variant::BOOL, "default_value_enabled"), "set_default_value_enabled", "is_default_value_enabled");
  3053. ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "default_value"), "set_default_value", "get_default_value");
  3054. BIND_ENUM_CONSTANT(HINT_NONE);
  3055. BIND_ENUM_CONSTANT(HINT_RANGE);
  3056. BIND_ENUM_CONSTANT(HINT_RANGE_STEP);
  3057. }
  3058. bool VisualShaderNodeFloatUniform::is_qualifier_supported(Qualifier p_qual) const {
  3059. return true; // all qualifiers are supported
  3060. }
  3061. bool VisualShaderNodeFloatUniform::is_convertible_to_constant() const {
  3062. return true; // conversion is allowed
  3063. }
  3064. Vector<StringName> VisualShaderNodeFloatUniform::get_editable_properties() const {
  3065. Vector<StringName> props = VisualShaderNodeUniform::get_editable_properties();
  3066. props.push_back("hint");
  3067. if (hint == HINT_RANGE || hint == HINT_RANGE_STEP) {
  3068. props.push_back("min");
  3069. props.push_back("max");
  3070. }
  3071. if (hint == HINT_RANGE_STEP) {
  3072. props.push_back("step");
  3073. }
  3074. props.push_back("default_value_enabled");
  3075. if (default_value_enabled) {
  3076. props.push_back("default_value");
  3077. }
  3078. return props;
  3079. }
  3080. VisualShaderNodeFloatUniform::VisualShaderNodeFloatUniform() {
  3081. }
  3082. ////////////// Integer Uniform
  3083. String VisualShaderNodeIntUniform::get_caption() const {
  3084. return "IntUniform";
  3085. }
  3086. int VisualShaderNodeIntUniform::get_input_port_count() const {
  3087. return 0;
  3088. }
  3089. VisualShaderNodeIntUniform::PortType VisualShaderNodeIntUniform::get_input_port_type(int p_port) const {
  3090. return PORT_TYPE_SCALAR_INT;
  3091. }
  3092. String VisualShaderNodeIntUniform::get_input_port_name(int p_port) const {
  3093. return String();
  3094. }
  3095. int VisualShaderNodeIntUniform::get_output_port_count() const {
  3096. return 1;
  3097. }
  3098. VisualShaderNodeIntUniform::PortType VisualShaderNodeIntUniform::get_output_port_type(int p_port) const {
  3099. return PORT_TYPE_SCALAR_INT;
  3100. }
  3101. String VisualShaderNodeIntUniform::get_output_port_name(int p_port) const {
  3102. return ""; //no output port means the editor will be used as port
  3103. }
  3104. String VisualShaderNodeIntUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  3105. String code = "";
  3106. if (hint == HINT_RANGE) {
  3107. code += _get_qual_str() + "uniform int " + get_uniform_name() + " : hint_range(" + itos(hint_range_min) + ", " + itos(hint_range_max) + ")";
  3108. } else if (hint == HINT_RANGE_STEP) {
  3109. code += _get_qual_str() + "uniform int " + get_uniform_name() + " : hint_range(" + itos(hint_range_min) + ", " + itos(hint_range_max) + ", " + itos(hint_range_step) + ")";
  3110. } else {
  3111. code += _get_qual_str() + "uniform int " + get_uniform_name();
  3112. }
  3113. if (default_value_enabled) {
  3114. code += " = " + itos(default_value);
  3115. }
  3116. code += ";\n";
  3117. return code;
  3118. }
  3119. String VisualShaderNodeIntUniform::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 {
  3120. return "\t" + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
  3121. }
  3122. bool VisualShaderNodeIntUniform::is_show_prop_names() const {
  3123. return true;
  3124. }
  3125. bool VisualShaderNodeIntUniform::is_use_prop_slots() const {
  3126. return true;
  3127. }
  3128. void VisualShaderNodeIntUniform::set_hint(Hint p_hint) {
  3129. hint = p_hint;
  3130. emit_changed();
  3131. }
  3132. VisualShaderNodeIntUniform::Hint VisualShaderNodeIntUniform::get_hint() const {
  3133. return hint;
  3134. }
  3135. void VisualShaderNodeIntUniform::set_min(int p_value) {
  3136. hint_range_min = p_value;
  3137. emit_changed();
  3138. }
  3139. int VisualShaderNodeIntUniform::get_min() const {
  3140. return hint_range_min;
  3141. }
  3142. void VisualShaderNodeIntUniform::set_max(int p_value) {
  3143. hint_range_max = p_value;
  3144. emit_changed();
  3145. }
  3146. int VisualShaderNodeIntUniform::get_max() const {
  3147. return hint_range_max;
  3148. }
  3149. void VisualShaderNodeIntUniform::set_step(int p_value) {
  3150. hint_range_step = p_value;
  3151. emit_changed();
  3152. }
  3153. int VisualShaderNodeIntUniform::get_step() const {
  3154. return hint_range_step;
  3155. }
  3156. void VisualShaderNodeIntUniform::set_default_value_enabled(bool p_enabled) {
  3157. default_value_enabled = p_enabled;
  3158. emit_changed();
  3159. }
  3160. bool VisualShaderNodeIntUniform::is_default_value_enabled() const {
  3161. return default_value_enabled;
  3162. }
  3163. void VisualShaderNodeIntUniform::set_default_value(int p_value) {
  3164. default_value = p_value;
  3165. emit_changed();
  3166. }
  3167. int VisualShaderNodeIntUniform::get_default_value() const {
  3168. return default_value;
  3169. }
  3170. void VisualShaderNodeIntUniform::_bind_methods() {
  3171. ClassDB::bind_method(D_METHOD("set_hint", "hint"), &VisualShaderNodeIntUniform::set_hint);
  3172. ClassDB::bind_method(D_METHOD("get_hint"), &VisualShaderNodeIntUniform::get_hint);
  3173. ClassDB::bind_method(D_METHOD("set_min", "value"), &VisualShaderNodeIntUniform::set_min);
  3174. ClassDB::bind_method(D_METHOD("get_min"), &VisualShaderNodeIntUniform::get_min);
  3175. ClassDB::bind_method(D_METHOD("set_max", "value"), &VisualShaderNodeIntUniform::set_max);
  3176. ClassDB::bind_method(D_METHOD("get_max"), &VisualShaderNodeIntUniform::get_max);
  3177. ClassDB::bind_method(D_METHOD("set_step", "value"), &VisualShaderNodeIntUniform::set_step);
  3178. ClassDB::bind_method(D_METHOD("get_step"), &VisualShaderNodeIntUniform::get_step);
  3179. ClassDB::bind_method(D_METHOD("set_default_value_enabled", "enabled"), &VisualShaderNodeIntUniform::set_default_value_enabled);
  3180. ClassDB::bind_method(D_METHOD("is_default_value_enabled"), &VisualShaderNodeIntUniform::is_default_value_enabled);
  3181. ClassDB::bind_method(D_METHOD("set_default_value", "value"), &VisualShaderNodeIntUniform::set_default_value);
  3182. ClassDB::bind_method(D_METHOD("get_default_value"), &VisualShaderNodeIntUniform::get_default_value);
  3183. ADD_PROPERTY(PropertyInfo(Variant::INT, "hint", PROPERTY_HINT_ENUM, "None,Range,Range+Step"), "set_hint", "get_hint");
  3184. ADD_PROPERTY(PropertyInfo(Variant::INT, "min"), "set_min", "get_min");
  3185. ADD_PROPERTY(PropertyInfo(Variant::INT, "max"), "set_max", "get_max");
  3186. ADD_PROPERTY(PropertyInfo(Variant::INT, "step"), "set_step", "get_step");
  3187. ADD_PROPERTY(PropertyInfo(Variant::BOOL, "default_value_enabled"), "set_default_value_enabled", "is_default_value_enabled");
  3188. ADD_PROPERTY(PropertyInfo(Variant::INT, "default_value"), "set_default_value", "get_default_value");
  3189. BIND_ENUM_CONSTANT(HINT_NONE);
  3190. BIND_ENUM_CONSTANT(HINT_RANGE);
  3191. BIND_ENUM_CONSTANT(HINT_RANGE_STEP);
  3192. }
  3193. bool VisualShaderNodeIntUniform::is_qualifier_supported(Qualifier p_qual) const {
  3194. return true; // all qualifiers are supported
  3195. }
  3196. bool VisualShaderNodeIntUniform::is_convertible_to_constant() const {
  3197. return true; // conversion is allowed
  3198. }
  3199. Vector<StringName> VisualShaderNodeIntUniform::get_editable_properties() const {
  3200. Vector<StringName> props = VisualShaderNodeUniform::get_editable_properties();
  3201. props.push_back("hint");
  3202. if (hint == HINT_RANGE || hint == HINT_RANGE_STEP) {
  3203. props.push_back("min");
  3204. props.push_back("max");
  3205. }
  3206. if (hint == HINT_RANGE_STEP) {
  3207. props.push_back("step");
  3208. }
  3209. props.push_back("default_value_enabled");
  3210. if (default_value_enabled) {
  3211. props.push_back("default_value");
  3212. }
  3213. return props;
  3214. }
  3215. VisualShaderNodeIntUniform::VisualShaderNodeIntUniform() {
  3216. }
  3217. ////////////// Boolean Uniform
  3218. String VisualShaderNodeBooleanUniform::get_caption() const {
  3219. return "BooleanUniform";
  3220. }
  3221. int VisualShaderNodeBooleanUniform::get_input_port_count() const {
  3222. return 0;
  3223. }
  3224. VisualShaderNodeBooleanUniform::PortType VisualShaderNodeBooleanUniform::get_input_port_type(int p_port) const {
  3225. return PORT_TYPE_BOOLEAN;
  3226. }
  3227. String VisualShaderNodeBooleanUniform::get_input_port_name(int p_port) const {
  3228. return String();
  3229. }
  3230. int VisualShaderNodeBooleanUniform::get_output_port_count() const {
  3231. return 1;
  3232. }
  3233. VisualShaderNodeBooleanUniform::PortType VisualShaderNodeBooleanUniform::get_output_port_type(int p_port) const {
  3234. return PORT_TYPE_BOOLEAN;
  3235. }
  3236. String VisualShaderNodeBooleanUniform::get_output_port_name(int p_port) const {
  3237. return ""; //no output port means the editor will be used as port
  3238. }
  3239. void VisualShaderNodeBooleanUniform::set_default_value_enabled(bool p_enabled) {
  3240. default_value_enabled = p_enabled;
  3241. emit_changed();
  3242. }
  3243. bool VisualShaderNodeBooleanUniform::is_default_value_enabled() const {
  3244. return default_value_enabled;
  3245. }
  3246. void VisualShaderNodeBooleanUniform::set_default_value(bool p_value) {
  3247. default_value = p_value;
  3248. emit_changed();
  3249. }
  3250. bool VisualShaderNodeBooleanUniform::get_default_value() const {
  3251. return default_value;
  3252. }
  3253. String VisualShaderNodeBooleanUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  3254. String code = _get_qual_str() + "uniform bool " + get_uniform_name();
  3255. if (default_value_enabled) {
  3256. if (default_value) {
  3257. code += " = true";
  3258. } else {
  3259. code += " = false";
  3260. }
  3261. }
  3262. code += ";\n";
  3263. return code;
  3264. }
  3265. String VisualShaderNodeBooleanUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  3266. return "\t" + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
  3267. }
  3268. bool VisualShaderNodeBooleanUniform::is_show_prop_names() const {
  3269. return true;
  3270. }
  3271. bool VisualShaderNodeBooleanUniform::is_use_prop_slots() const {
  3272. return true;
  3273. }
  3274. void VisualShaderNodeBooleanUniform::_bind_methods() {
  3275. ClassDB::bind_method(D_METHOD("set_default_value_enabled", "enabled"), &VisualShaderNodeBooleanUniform::set_default_value_enabled);
  3276. ClassDB::bind_method(D_METHOD("is_default_value_enabled"), &VisualShaderNodeBooleanUniform::is_default_value_enabled);
  3277. ClassDB::bind_method(D_METHOD("set_default_value", "value"), &VisualShaderNodeBooleanUniform::set_default_value);
  3278. ClassDB::bind_method(D_METHOD("get_default_value"), &VisualShaderNodeBooleanUniform::get_default_value);
  3279. ADD_PROPERTY(PropertyInfo(Variant::BOOL, "default_value_enabled"), "set_default_value_enabled", "is_default_value_enabled");
  3280. ADD_PROPERTY(PropertyInfo(Variant::BOOL, "default_value"), "set_default_value", "get_default_value");
  3281. }
  3282. bool VisualShaderNodeBooleanUniform::is_qualifier_supported(Qualifier p_qual) const {
  3283. return true; // all qualifiers are supported
  3284. }
  3285. bool VisualShaderNodeBooleanUniform::is_convertible_to_constant() const {
  3286. return true; // conversion is allowed
  3287. }
  3288. Vector<StringName> VisualShaderNodeBooleanUniform::get_editable_properties() const {
  3289. Vector<StringName> props = VisualShaderNodeUniform::get_editable_properties();
  3290. props.push_back("default_value_enabled");
  3291. if (default_value_enabled) {
  3292. props.push_back("default_value");
  3293. }
  3294. return props;
  3295. }
  3296. VisualShaderNodeBooleanUniform::VisualShaderNodeBooleanUniform() {
  3297. }
  3298. ////////////// Color Uniform
  3299. String VisualShaderNodeColorUniform::get_caption() const {
  3300. return "ColorUniform";
  3301. }
  3302. int VisualShaderNodeColorUniform::get_input_port_count() const {
  3303. return 0;
  3304. }
  3305. VisualShaderNodeColorUniform::PortType VisualShaderNodeColorUniform::get_input_port_type(int p_port) const {
  3306. return PORT_TYPE_VECTOR;
  3307. }
  3308. String VisualShaderNodeColorUniform::get_input_port_name(int p_port) const {
  3309. return String();
  3310. }
  3311. int VisualShaderNodeColorUniform::get_output_port_count() const {
  3312. return 2;
  3313. }
  3314. VisualShaderNodeColorUniform::PortType VisualShaderNodeColorUniform::get_output_port_type(int p_port) const {
  3315. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  3316. }
  3317. String VisualShaderNodeColorUniform::get_output_port_name(int p_port) const {
  3318. return p_port == 0 ? "color" : "alpha"; //no output port means the editor will be used as port
  3319. }
  3320. void VisualShaderNodeColorUniform::set_default_value_enabled(bool p_enabled) {
  3321. default_value_enabled = p_enabled;
  3322. emit_changed();
  3323. }
  3324. bool VisualShaderNodeColorUniform::is_default_value_enabled() const {
  3325. return default_value_enabled;
  3326. }
  3327. void VisualShaderNodeColorUniform::set_default_value(const Color &p_value) {
  3328. default_value = p_value;
  3329. emit_changed();
  3330. }
  3331. Color VisualShaderNodeColorUniform::get_default_value() const {
  3332. return default_value;
  3333. }
  3334. String VisualShaderNodeColorUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  3335. String code = _get_qual_str() + "uniform vec4 " + get_uniform_name() + " : hint_color";
  3336. if (default_value_enabled) {
  3337. code += vformat(" = vec4(%.6f, %.6f, %.6f, %.6f)", default_value.r, default_value.g, default_value.b, default_value.a);
  3338. }
  3339. code += ";\n";
  3340. return code;
  3341. }
  3342. String VisualShaderNodeColorUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  3343. String code = "\t" + p_output_vars[0] + " = " + get_uniform_name() + ".rgb;\n";
  3344. code += "\t" + p_output_vars[1] + " = " + get_uniform_name() + ".a;\n";
  3345. return code;
  3346. }
  3347. bool VisualShaderNodeColorUniform::is_show_prop_names() const {
  3348. return true;
  3349. }
  3350. void VisualShaderNodeColorUniform::_bind_methods() {
  3351. ClassDB::bind_method(D_METHOD("set_default_value_enabled", "enabled"), &VisualShaderNodeColorUniform::set_default_value_enabled);
  3352. ClassDB::bind_method(D_METHOD("is_default_value_enabled"), &VisualShaderNodeColorUniform::is_default_value_enabled);
  3353. ClassDB::bind_method(D_METHOD("set_default_value", "value"), &VisualShaderNodeColorUniform::set_default_value);
  3354. ClassDB::bind_method(D_METHOD("get_default_value"), &VisualShaderNodeColorUniform::get_default_value);
  3355. ADD_PROPERTY(PropertyInfo(Variant::BOOL, "default_value_enabled"), "set_default_value_enabled", "is_default_value_enabled");
  3356. ADD_PROPERTY(PropertyInfo(Variant::COLOR, "default_value"), "set_default_value", "get_default_value");
  3357. }
  3358. bool VisualShaderNodeColorUniform::is_qualifier_supported(Qualifier p_qual) const {
  3359. return true; // all qualifiers are supported
  3360. }
  3361. bool VisualShaderNodeColorUniform::is_convertible_to_constant() const {
  3362. return true; // conversion is allowed
  3363. }
  3364. Vector<StringName> VisualShaderNodeColorUniform::get_editable_properties() const {
  3365. Vector<StringName> props = VisualShaderNodeUniform::get_editable_properties();
  3366. props.push_back("default_value_enabled");
  3367. if (default_value_enabled) {
  3368. props.push_back("default_value");
  3369. }
  3370. return props;
  3371. }
  3372. VisualShaderNodeColorUniform::VisualShaderNodeColorUniform() {
  3373. }
  3374. ////////////// Vector Uniform
  3375. String VisualShaderNodeVec3Uniform::get_caption() const {
  3376. return "VectorUniform";
  3377. }
  3378. int VisualShaderNodeVec3Uniform::get_input_port_count() const {
  3379. return 0;
  3380. }
  3381. VisualShaderNodeVec3Uniform::PortType VisualShaderNodeVec3Uniform::get_input_port_type(int p_port) const {
  3382. return PORT_TYPE_VECTOR;
  3383. }
  3384. String VisualShaderNodeVec3Uniform::get_input_port_name(int p_port) const {
  3385. return String();
  3386. }
  3387. int VisualShaderNodeVec3Uniform::get_output_port_count() const {
  3388. return 1;
  3389. }
  3390. VisualShaderNodeVec3Uniform::PortType VisualShaderNodeVec3Uniform::get_output_port_type(int p_port) const {
  3391. return PORT_TYPE_VECTOR;
  3392. }
  3393. String VisualShaderNodeVec3Uniform::get_output_port_name(int p_port) const {
  3394. return ""; //no output port means the editor will be used as port
  3395. }
  3396. void VisualShaderNodeVec3Uniform::set_default_value_enabled(bool p_enabled) {
  3397. default_value_enabled = p_enabled;
  3398. emit_changed();
  3399. }
  3400. bool VisualShaderNodeVec3Uniform::is_default_value_enabled() const {
  3401. return default_value_enabled;
  3402. }
  3403. void VisualShaderNodeVec3Uniform::set_default_value(const Vector3 &p_value) {
  3404. default_value = p_value;
  3405. emit_changed();
  3406. }
  3407. Vector3 VisualShaderNodeVec3Uniform::get_default_value() const {
  3408. return default_value;
  3409. }
  3410. String VisualShaderNodeVec3Uniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  3411. String code = _get_qual_str() + "uniform vec3 " + get_uniform_name();
  3412. if (default_value_enabled) {
  3413. code += vformat(" = vec3(%.6f, %.6f, %.6f)", default_value.x, default_value.y, default_value.z);
  3414. }
  3415. code += ";\n";
  3416. return code;
  3417. }
  3418. String VisualShaderNodeVec3Uniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  3419. return "\t" + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
  3420. }
  3421. void VisualShaderNodeVec3Uniform::_bind_methods() {
  3422. ClassDB::bind_method(D_METHOD("set_default_value_enabled", "enabled"), &VisualShaderNodeVec3Uniform::set_default_value_enabled);
  3423. ClassDB::bind_method(D_METHOD("is_default_value_enabled"), &VisualShaderNodeVec3Uniform::is_default_value_enabled);
  3424. ClassDB::bind_method(D_METHOD("set_default_value", "value"), &VisualShaderNodeVec3Uniform::set_default_value);
  3425. ClassDB::bind_method(D_METHOD("get_default_value"), &VisualShaderNodeVec3Uniform::get_default_value);
  3426. ADD_PROPERTY(PropertyInfo(Variant::BOOL, "default_value_enabled"), "set_default_value_enabled", "is_default_value_enabled");
  3427. ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "default_value"), "set_default_value", "get_default_value");
  3428. }
  3429. bool VisualShaderNodeVec3Uniform::is_show_prop_names() const {
  3430. return true;
  3431. }
  3432. bool VisualShaderNodeVec3Uniform::is_use_prop_slots() const {
  3433. return true;
  3434. }
  3435. bool VisualShaderNodeVec3Uniform::is_qualifier_supported(Qualifier p_qual) const {
  3436. return true; // all qualifiers are supported
  3437. }
  3438. bool VisualShaderNodeVec3Uniform::is_convertible_to_constant() const {
  3439. return true; // conversion is allowed
  3440. }
  3441. Vector<StringName> VisualShaderNodeVec3Uniform::get_editable_properties() const {
  3442. Vector<StringName> props = VisualShaderNodeUniform::get_editable_properties();
  3443. props.push_back("default_value_enabled");
  3444. if (default_value_enabled) {
  3445. props.push_back("default_value");
  3446. }
  3447. return props;
  3448. }
  3449. VisualShaderNodeVec3Uniform::VisualShaderNodeVec3Uniform() {
  3450. }
  3451. ////////////// Transform Uniform
  3452. String VisualShaderNodeTransformUniform::get_caption() const {
  3453. return "TransformUniform";
  3454. }
  3455. int VisualShaderNodeTransformUniform::get_input_port_count() const {
  3456. return 0;
  3457. }
  3458. VisualShaderNodeTransformUniform::PortType VisualShaderNodeTransformUniform::get_input_port_type(int p_port) const {
  3459. return PORT_TYPE_VECTOR;
  3460. }
  3461. String VisualShaderNodeTransformUniform::get_input_port_name(int p_port) const {
  3462. return String();
  3463. }
  3464. int VisualShaderNodeTransformUniform::get_output_port_count() const {
  3465. return 1;
  3466. }
  3467. VisualShaderNodeTransformUniform::PortType VisualShaderNodeTransformUniform::get_output_port_type(int p_port) const {
  3468. return PORT_TYPE_TRANSFORM;
  3469. }
  3470. String VisualShaderNodeTransformUniform::get_output_port_name(int p_port) const {
  3471. return ""; //no output port means the editor will be used as port
  3472. }
  3473. void VisualShaderNodeTransformUniform::set_default_value_enabled(bool p_enabled) {
  3474. default_value_enabled = p_enabled;
  3475. emit_changed();
  3476. }
  3477. bool VisualShaderNodeTransformUniform::is_default_value_enabled() const {
  3478. return default_value_enabled;
  3479. }
  3480. void VisualShaderNodeTransformUniform::set_default_value(const Transform &p_value) {
  3481. default_value = p_value;
  3482. emit_changed();
  3483. }
  3484. Transform VisualShaderNodeTransformUniform::get_default_value() const {
  3485. return default_value;
  3486. }
  3487. String VisualShaderNodeTransformUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  3488. String code = _get_qual_str() + "uniform mat4 " + get_uniform_name();
  3489. if (default_value_enabled) {
  3490. Vector3 row0 = default_value.basis.get_row(0);
  3491. Vector3 row1 = default_value.basis.get_row(1);
  3492. Vector3 row2 = default_value.basis.get_row(2);
  3493. Vector3 origin = default_value.origin;
  3494. code += " = mat4(" + vformat("vec4(%.6f, %.6f, %.6f, 0.0)", row0.x, row0.y, row0.z) + vformat(", vec4(%.6f, %.6f, %.6f, 0.0)", row1.x, row1.y, row1.z) + vformat(", vec4(%.6f, %.6f, %.6f, 0.0)", row2.x, row2.y, row2.z) + vformat(", vec4(%.6f, %.6f, %.6f, 1.0)", origin.x, origin.y, origin.z) + ")";
  3495. }
  3496. code += ";\n";
  3497. return code;
  3498. }
  3499. String VisualShaderNodeTransformUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  3500. return "\t" + p_output_vars[0] + " = " + get_uniform_name() + ";\n";
  3501. }
  3502. void VisualShaderNodeTransformUniform::_bind_methods() {
  3503. ClassDB::bind_method(D_METHOD("set_default_value_enabled", "enabled"), &VisualShaderNodeTransformUniform::set_default_value_enabled);
  3504. ClassDB::bind_method(D_METHOD("is_default_value_enabled"), &VisualShaderNodeTransformUniform::is_default_value_enabled);
  3505. ClassDB::bind_method(D_METHOD("set_default_value", "value"), &VisualShaderNodeTransformUniform::set_default_value);
  3506. ClassDB::bind_method(D_METHOD("get_default_value"), &VisualShaderNodeTransformUniform::get_default_value);
  3507. ADD_PROPERTY(PropertyInfo(Variant::BOOL, "default_value_enabled"), "set_default_value_enabled", "is_default_value_enabled");
  3508. ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM, "default_value"), "set_default_value", "get_default_value");
  3509. }
  3510. bool VisualShaderNodeTransformUniform::is_show_prop_names() const {
  3511. return true;
  3512. }
  3513. bool VisualShaderNodeTransformUniform::is_use_prop_slots() const {
  3514. return true;
  3515. }
  3516. bool VisualShaderNodeTransformUniform::is_qualifier_supported(Qualifier p_qual) const {
  3517. return true; // all qualifiers are supported
  3518. }
  3519. bool VisualShaderNodeTransformUniform::is_convertible_to_constant() const {
  3520. return true; // conversion is allowed
  3521. }
  3522. Vector<StringName> VisualShaderNodeTransformUniform::get_editable_properties() const {
  3523. Vector<StringName> props = VisualShaderNodeUniform::get_editable_properties();
  3524. props.push_back("default_value_enabled");
  3525. if (default_value_enabled) {
  3526. props.push_back("default_value");
  3527. }
  3528. return props;
  3529. }
  3530. VisualShaderNodeTransformUniform::VisualShaderNodeTransformUniform() {
  3531. }
  3532. ////////////// Texture Uniform
  3533. String VisualShaderNodeTextureUniform::get_caption() const {
  3534. return "TextureUniform";
  3535. }
  3536. int VisualShaderNodeTextureUniform::get_input_port_count() const {
  3537. return 2;
  3538. }
  3539. VisualShaderNodeTextureUniform::PortType VisualShaderNodeTextureUniform::get_input_port_type(int p_port) const {
  3540. return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
  3541. }
  3542. String VisualShaderNodeTextureUniform::get_input_port_name(int p_port) const {
  3543. return p_port == 0 ? "uv" : "lod";
  3544. }
  3545. int VisualShaderNodeTextureUniform::get_output_port_count() const {
  3546. return 3;
  3547. }
  3548. VisualShaderNodeTextureUniform::PortType VisualShaderNodeTextureUniform::get_output_port_type(int p_port) const {
  3549. switch (p_port) {
  3550. case 0:
  3551. return PORT_TYPE_VECTOR;
  3552. case 1:
  3553. return PORT_TYPE_SCALAR;
  3554. case 2:
  3555. return PORT_TYPE_SAMPLER;
  3556. default:
  3557. return PORT_TYPE_SCALAR;
  3558. }
  3559. }
  3560. String VisualShaderNodeTextureUniform::get_output_port_name(int p_port) const {
  3561. switch (p_port) {
  3562. case 0:
  3563. return "rgb";
  3564. case 1:
  3565. return "alpha";
  3566. case 2:
  3567. return "sampler2D";
  3568. default:
  3569. return "";
  3570. }
  3571. }
  3572. String VisualShaderNodeTextureUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  3573. String code = _get_qual_str() + "uniform sampler2D " + get_uniform_name();
  3574. switch (texture_type) {
  3575. case TYPE_DATA:
  3576. if (color_default == COLOR_DEFAULT_BLACK) {
  3577. code += " : hint_black;\n";
  3578. } else {
  3579. code += ";\n";
  3580. }
  3581. break;
  3582. case TYPE_COLOR:
  3583. if (color_default == COLOR_DEFAULT_BLACK) {
  3584. code += " : hint_black_albedo;\n";
  3585. } else {
  3586. code += " : hint_albedo;\n";
  3587. }
  3588. break;
  3589. case TYPE_NORMAL_MAP:
  3590. code += " : hint_normal;\n";
  3591. break;
  3592. case TYPE_ANISO:
  3593. code += " : hint_aniso;\n";
  3594. break;
  3595. }
  3596. return code;
  3597. }
  3598. bool VisualShaderNodeTextureUniform::is_code_generated() const {
  3599. return is_output_port_connected(0) || is_output_port_connected(1); // rgb or alpha
  3600. }
  3601. String VisualShaderNodeTextureUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  3602. String default_uv;
  3603. if (p_mode != Shader::MODE_PARTICLES && p_mode != Shader::MODE_SKY) {
  3604. default_uv = "UV.xy";
  3605. } else {
  3606. default_uv = "vec2(0.0)";
  3607. }
  3608. String id = get_uniform_name();
  3609. String code = "\t{\n";
  3610. if (p_input_vars[0] == String()) { // Use UV by default.
  3611. if (p_input_vars[1] == String()) {
  3612. code += "\t\tvec4 n_tex_read = texture(" + id + ", " + default_uv + ");\n";
  3613. } else {
  3614. code += "\t\tvec4 n_tex_read = textureLod(" + id + ", " + default_uv + ", " + p_input_vars[1] + ");\n";
  3615. }
  3616. } else if (p_input_vars[1] == String()) {
  3617. //no lod
  3618. code += "\t\tvec4 n_tex_read = texture(" + id + ", " + p_input_vars[0] + ".xy);\n";
  3619. } else {
  3620. code += "\t\tvec4 n_tex_read = textureLod(" + id + ", " + p_input_vars[0] + ".xy, " + p_input_vars[1] + ");\n";
  3621. }
  3622. code += "\t\t" + p_output_vars[0] + " = n_tex_read.rgb;\n";
  3623. code += "\t\t" + p_output_vars[1] + " = n_tex_read.a;\n";
  3624. code += "\t}\n";
  3625. return code;
  3626. }
  3627. void VisualShaderNodeTextureUniform::set_texture_type(TextureType p_type) {
  3628. texture_type = p_type;
  3629. emit_changed();
  3630. }
  3631. VisualShaderNodeTextureUniform::TextureType VisualShaderNodeTextureUniform::get_texture_type() const {
  3632. return texture_type;
  3633. }
  3634. void VisualShaderNodeTextureUniform::set_color_default(ColorDefault p_default) {
  3635. color_default = p_default;
  3636. emit_changed();
  3637. }
  3638. VisualShaderNodeTextureUniform::ColorDefault VisualShaderNodeTextureUniform::get_color_default() const {
  3639. return color_default;
  3640. }
  3641. Vector<StringName> VisualShaderNodeTextureUniform::get_editable_properties() const {
  3642. Vector<StringName> props = VisualShaderNodeUniform::get_editable_properties();
  3643. props.push_back("texture_type");
  3644. props.push_back("color_default");
  3645. return props;
  3646. }
  3647. void VisualShaderNodeTextureUniform::_bind_methods() {
  3648. ClassDB::bind_method(D_METHOD("set_texture_type", "type"), &VisualShaderNodeTextureUniform::set_texture_type);
  3649. ClassDB::bind_method(D_METHOD("get_texture_type"), &VisualShaderNodeTextureUniform::get_texture_type);
  3650. ClassDB::bind_method(D_METHOD("set_color_default", "type"), &VisualShaderNodeTextureUniform::set_color_default);
  3651. ClassDB::bind_method(D_METHOD("get_color_default"), &VisualShaderNodeTextureUniform::get_color_default);
  3652. ADD_PROPERTY(PropertyInfo(Variant::INT, "texture_type", PROPERTY_HINT_ENUM, "Data,Color,Normalmap,Aniso"), "set_texture_type", "get_texture_type");
  3653. ADD_PROPERTY(PropertyInfo(Variant::INT, "color_default", PROPERTY_HINT_ENUM, "White Default,Black Default"), "set_color_default", "get_color_default");
  3654. BIND_ENUM_CONSTANT(TYPE_DATA);
  3655. BIND_ENUM_CONSTANT(TYPE_COLOR);
  3656. BIND_ENUM_CONSTANT(TYPE_NORMAL_MAP);
  3657. BIND_ENUM_CONSTANT(TYPE_ANISO);
  3658. BIND_ENUM_CONSTANT(COLOR_DEFAULT_WHITE);
  3659. BIND_ENUM_CONSTANT(COLOR_DEFAULT_BLACK);
  3660. }
  3661. String VisualShaderNodeTextureUniform::get_input_port_default_hint(int p_port) const {
  3662. if (p_port == 0) {
  3663. return "default";
  3664. }
  3665. return "";
  3666. }
  3667. bool VisualShaderNodeTextureUniform::is_qualifier_supported(Qualifier p_qual) const {
  3668. switch (p_qual) {
  3669. case Qualifier::QUAL_NONE:
  3670. return true;
  3671. case Qualifier::QUAL_GLOBAL:
  3672. return true;
  3673. case Qualifier::QUAL_INSTANCE:
  3674. return false;
  3675. }
  3676. return false;
  3677. }
  3678. bool VisualShaderNodeTextureUniform::is_convertible_to_constant() const {
  3679. return false; // conversion is not allowed
  3680. }
  3681. VisualShaderNodeTextureUniform::VisualShaderNodeTextureUniform() {
  3682. simple_decl = false;
  3683. }
  3684. ////////////// Texture Uniform (Triplanar)
  3685. String VisualShaderNodeTextureUniformTriplanar::get_caption() const {
  3686. return "TextureUniformTriplanar";
  3687. }
  3688. int VisualShaderNodeTextureUniformTriplanar::get_input_port_count() const {
  3689. return 2;
  3690. }
  3691. VisualShaderNodeTextureUniform::PortType VisualShaderNodeTextureUniformTriplanar::get_input_port_type(int p_port) const {
  3692. if (p_port == 0 || p_port == 1) {
  3693. return PORT_TYPE_VECTOR;
  3694. }
  3695. return PORT_TYPE_SCALAR;
  3696. }
  3697. String VisualShaderNodeTextureUniformTriplanar::get_input_port_name(int p_port) const {
  3698. if (p_port == 0) {
  3699. return "weights";
  3700. } else if (p_port == 1) {
  3701. return "pos";
  3702. }
  3703. return "";
  3704. }
  3705. String VisualShaderNodeTextureUniformTriplanar::generate_global_per_node(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  3706. String code;
  3707. code += "// TRIPLANAR FUNCTION GLOBAL CODE\n";
  3708. code += "\tvec4 triplanar_texture(sampler2D p_sampler, vec3 p_weights, vec3 p_triplanar_pos) {\n";
  3709. code += "\t\tvec4 samp = vec4(0.0);\n";
  3710. code += "\t\tsamp += texture(p_sampler, p_triplanar_pos.xy) * p_weights.z;\n";
  3711. code += "\t\tsamp += texture(p_sampler, p_triplanar_pos.xz) * p_weights.y;\n";
  3712. code += "\t\tsamp += texture(p_sampler, p_triplanar_pos.zy * vec2(-1.0, 1.0)) * p_weights.x;\n";
  3713. code += "\t\treturn samp;\n";
  3714. code += "\t}\n";
  3715. code += "\n";
  3716. code += "\tuniform vec3 triplanar_scale = vec3(1.0, 1.0, 1.0);\n";
  3717. code += "\tuniform vec3 triplanar_offset;\n";
  3718. code += "\tuniform float triplanar_sharpness = 0.5;\n";
  3719. code += "\n";
  3720. code += "\tvarying vec3 triplanar_power_normal;\n";
  3721. code += "\tvarying vec3 triplanar_pos;\n";
  3722. return code;
  3723. }
  3724. String VisualShaderNodeTextureUniformTriplanar::generate_global_per_func(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  3725. String code;
  3726. if (p_type == VisualShader::TYPE_VERTEX) {
  3727. code += "\t// TRIPLANAR FUNCTION VERTEX CODE\n";
  3728. code += "\t\ttriplanar_power_normal = pow(abs(NORMAL), vec3(triplanar_sharpness));\n";
  3729. code += "\t\ttriplanar_power_normal /= dot(triplanar_power_normal, vec3(1.0));\n";
  3730. code += "\t\ttriplanar_pos = VERTEX * triplanar_scale + triplanar_offset;\n";
  3731. code += "\t\ttriplanar_pos *= vec3(1.0, -1.0, 1.0);\n";
  3732. }
  3733. return code;
  3734. }
  3735. String VisualShaderNodeTextureUniformTriplanar::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 {
  3736. String id = get_uniform_name();
  3737. String code = "\t{\n";
  3738. if (p_input_vars[0] == String() && p_input_vars[1] == String()) {
  3739. code += "\t\tvec4 n_tex_read = triplanar_texture(" + id + ", triplanar_power_normal, triplanar_pos);\n";
  3740. } else if (p_input_vars[0] != String() && p_input_vars[1] == String()) {
  3741. code += "\t\tvec4 n_tex_read = triplanar_texture(" + id + ", " + p_input_vars[0] + ", triplanar_pos);\n";
  3742. } else if (p_input_vars[0] == String() && p_input_vars[1] != String()) {
  3743. code += "\t\tvec4 n_tex_read = triplanar_texture(" + id + ", triplanar_power_normal, " + p_input_vars[1] + ");\n";
  3744. } else {
  3745. code += "\t\tvec4 n_tex_read = triplanar_texture(" + id + ", " + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
  3746. }
  3747. code += "\t\t" + p_output_vars[0] + " = n_tex_read.rgb;\n";
  3748. code += "\t\t" + p_output_vars[1] + " = n_tex_read.a;\n";
  3749. code += "\t}\n";
  3750. return code;
  3751. }
  3752. String VisualShaderNodeTextureUniformTriplanar::get_input_port_default_hint(int p_port) const {
  3753. if (p_port == 0) {
  3754. return "default";
  3755. } else if (p_port == 1) {
  3756. return "default";
  3757. }
  3758. return "";
  3759. }
  3760. VisualShaderNodeTextureUniformTriplanar::VisualShaderNodeTextureUniformTriplanar() {
  3761. }
  3762. ////////////// Texture2DArray Uniform
  3763. String VisualShaderNodeTexture2DArrayUniform::get_caption() const {
  3764. return "Texture2DArrayUniform";
  3765. }
  3766. int VisualShaderNodeTexture2DArrayUniform::get_output_port_count() const {
  3767. return 1;
  3768. }
  3769. VisualShaderNodeTexture2DArrayUniform::PortType VisualShaderNodeTexture2DArrayUniform::get_output_port_type(int p_port) const {
  3770. return PORT_TYPE_SAMPLER;
  3771. }
  3772. String VisualShaderNodeTexture2DArrayUniform::get_output_port_name(int p_port) const {
  3773. return "sampler2DArray";
  3774. }
  3775. int VisualShaderNodeTexture2DArrayUniform::get_input_port_count() const {
  3776. return 0;
  3777. }
  3778. VisualShaderNodeTexture2DArrayUniform::PortType VisualShaderNodeTexture2DArrayUniform::get_input_port_type(int p_port) const {
  3779. return PORT_TYPE_SCALAR;
  3780. }
  3781. String VisualShaderNodeTexture2DArrayUniform::get_input_port_name(int p_port) const {
  3782. return "";
  3783. }
  3784. String VisualShaderNodeTexture2DArrayUniform::get_input_port_default_hint(int p_port) const {
  3785. return "";
  3786. }
  3787. String VisualShaderNodeTexture2DArrayUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  3788. String code = _get_qual_str() + "uniform sampler2DArray " + get_uniform_name();
  3789. switch (texture_type) {
  3790. case TYPE_DATA:
  3791. if (color_default == COLOR_DEFAULT_BLACK) {
  3792. code += " : hint_black;\n";
  3793. } else {
  3794. code += ";\n";
  3795. }
  3796. break;
  3797. case TYPE_COLOR:
  3798. if (color_default == COLOR_DEFAULT_BLACK) {
  3799. code += " : hint_black_albedo;\n";
  3800. } else {
  3801. code += " : hint_albedo;\n";
  3802. }
  3803. break;
  3804. case TYPE_NORMAL_MAP:
  3805. code += " : hint_normal;\n";
  3806. break;
  3807. case TYPE_ANISO:
  3808. code += " : hint_aniso;\n";
  3809. break;
  3810. }
  3811. return code;
  3812. }
  3813. String VisualShaderNodeTexture2DArrayUniform::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 {
  3814. return String();
  3815. }
  3816. VisualShaderNodeTexture2DArrayUniform::VisualShaderNodeTexture2DArrayUniform() {
  3817. }
  3818. ////////////// Texture3D Uniform
  3819. String VisualShaderNodeTexture3DUniform::get_caption() const {
  3820. return "Texture3DUniform";
  3821. }
  3822. int VisualShaderNodeTexture3DUniform::get_output_port_count() const {
  3823. return 1;
  3824. }
  3825. VisualShaderNodeTexture3DUniform::PortType VisualShaderNodeTexture3DUniform::get_output_port_type(int p_port) const {
  3826. return PORT_TYPE_SAMPLER;
  3827. }
  3828. String VisualShaderNodeTexture3DUniform::get_output_port_name(int p_port) const {
  3829. return "sampler3D";
  3830. }
  3831. int VisualShaderNodeTexture3DUniform::get_input_port_count() const {
  3832. return 0;
  3833. }
  3834. VisualShaderNodeTexture3DUniform::PortType VisualShaderNodeTexture3DUniform::get_input_port_type(int p_port) const {
  3835. return PORT_TYPE_SCALAR;
  3836. }
  3837. String VisualShaderNodeTexture3DUniform::get_input_port_name(int p_port) const {
  3838. return "";
  3839. }
  3840. String VisualShaderNodeTexture3DUniform::get_input_port_default_hint(int p_port) const {
  3841. return "";
  3842. }
  3843. String VisualShaderNodeTexture3DUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  3844. String code = _get_qual_str() + "uniform sampler3D " + get_uniform_name();
  3845. switch (texture_type) {
  3846. case TYPE_DATA:
  3847. if (color_default == COLOR_DEFAULT_BLACK) {
  3848. code += " : hint_black;\n";
  3849. } else {
  3850. code += ";\n";
  3851. }
  3852. break;
  3853. case TYPE_COLOR:
  3854. if (color_default == COLOR_DEFAULT_BLACK) {
  3855. code += " : hint_black_albedo;\n";
  3856. } else {
  3857. code += " : hint_albedo;\n";
  3858. }
  3859. break;
  3860. case TYPE_NORMAL_MAP:
  3861. code += " : hint_normal;\n";
  3862. break;
  3863. case TYPE_ANISO:
  3864. code += " : hint_aniso;\n";
  3865. break;
  3866. }
  3867. return code;
  3868. }
  3869. String VisualShaderNodeTexture3DUniform::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 {
  3870. return String();
  3871. }
  3872. VisualShaderNodeTexture3DUniform::VisualShaderNodeTexture3DUniform() {
  3873. }
  3874. ////////////// Cubemap Uniform
  3875. String VisualShaderNodeCubemapUniform::get_caption() const {
  3876. return "CubemapUniform";
  3877. }
  3878. int VisualShaderNodeCubemapUniform::get_output_port_count() const {
  3879. return 1;
  3880. }
  3881. VisualShaderNodeCubemapUniform::PortType VisualShaderNodeCubemapUniform::get_output_port_type(int p_port) const {
  3882. return PORT_TYPE_SAMPLER;
  3883. }
  3884. String VisualShaderNodeCubemapUniform::get_output_port_name(int p_port) const {
  3885. return "samplerCube";
  3886. }
  3887. int VisualShaderNodeCubemapUniform::get_input_port_count() const {
  3888. return 0;
  3889. }
  3890. VisualShaderNodeCubemapUniform::PortType VisualShaderNodeCubemapUniform::get_input_port_type(int p_port) const {
  3891. return PORT_TYPE_SCALAR;
  3892. }
  3893. String VisualShaderNodeCubemapUniform::get_input_port_name(int p_port) const {
  3894. return "";
  3895. }
  3896. String VisualShaderNodeCubemapUniform::get_input_port_default_hint(int p_port) const {
  3897. return "";
  3898. }
  3899. String VisualShaderNodeCubemapUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  3900. String code = _get_qual_str() + "uniform samplerCube " + get_uniform_name();
  3901. switch (texture_type) {
  3902. case TYPE_DATA:
  3903. if (color_default == COLOR_DEFAULT_BLACK) {
  3904. code += " : hint_black;\n";
  3905. } else {
  3906. code += ";\n";
  3907. }
  3908. break;
  3909. case TYPE_COLOR:
  3910. if (color_default == COLOR_DEFAULT_BLACK) {
  3911. code += " : hint_black_albedo;\n";
  3912. } else {
  3913. code += " : hint_albedo;\n";
  3914. }
  3915. break;
  3916. case TYPE_NORMAL_MAP:
  3917. code += " : hint_normal;\n";
  3918. break;
  3919. case TYPE_ANISO:
  3920. code += " : hint_aniso;\n";
  3921. break;
  3922. }
  3923. return code;
  3924. }
  3925. String VisualShaderNodeCubemapUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  3926. return String();
  3927. }
  3928. VisualShaderNodeCubemapUniform::VisualShaderNodeCubemapUniform() {
  3929. }
  3930. ////////////// If
  3931. String VisualShaderNodeIf::get_caption() const {
  3932. return "If";
  3933. }
  3934. int VisualShaderNodeIf::get_input_port_count() const {
  3935. return 6;
  3936. }
  3937. VisualShaderNodeIf::PortType VisualShaderNodeIf::get_input_port_type(int p_port) const {
  3938. if (p_port == 0 || p_port == 1 || p_port == 2) {
  3939. return PORT_TYPE_SCALAR;
  3940. }
  3941. return PORT_TYPE_VECTOR;
  3942. }
  3943. String VisualShaderNodeIf::get_input_port_name(int p_port) const {
  3944. switch (p_port) {
  3945. case 0:
  3946. return "a";
  3947. case 1:
  3948. return "b";
  3949. case 2:
  3950. return "tolerance";
  3951. case 3:
  3952. return "a == b";
  3953. case 4:
  3954. return "a > b";
  3955. case 5:
  3956. return "a < b";
  3957. default:
  3958. return "";
  3959. }
  3960. }
  3961. int VisualShaderNodeIf::get_output_port_count() const {
  3962. return 1;
  3963. }
  3964. VisualShaderNodeIf::PortType VisualShaderNodeIf::get_output_port_type(int p_port) const {
  3965. return PORT_TYPE_VECTOR;
  3966. }
  3967. String VisualShaderNodeIf::get_output_port_name(int p_port) const {
  3968. return "result";
  3969. }
  3970. String VisualShaderNodeIf::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  3971. String code;
  3972. code += "\tif(abs(" + p_input_vars[0] + " - " + p_input_vars[1] + ") < " + p_input_vars[2] + ")\n"; // abs(a - b) < tolerance eg. a == b
  3973. code += "\t{\n";
  3974. code += "\t\t" + p_output_vars[0] + " = " + p_input_vars[3] + ";\n";
  3975. code += "\t}\n";
  3976. code += "\telse if(" + p_input_vars[0] + " < " + p_input_vars[1] + ")\n"; // a < b
  3977. code += "\t{\n";
  3978. code += "\t\t" + p_output_vars[0] + " = " + p_input_vars[5] + ";\n";
  3979. code += "\t}\n";
  3980. code += "\telse\n"; // a > b (or a >= b if abs(a - b) < tolerance is false)
  3981. code += "\t{\n";
  3982. code += "\t\t" + p_output_vars[0] + " = " + p_input_vars[4] + ";\n";
  3983. code += "\t}\n";
  3984. return code;
  3985. }
  3986. VisualShaderNodeIf::VisualShaderNodeIf() {
  3987. simple_decl = false;
  3988. set_input_port_default_value(0, 0.0);
  3989. set_input_port_default_value(1, 0.0);
  3990. set_input_port_default_value(2, CMP_EPSILON);
  3991. set_input_port_default_value(3, Vector3(0.0, 0.0, 0.0));
  3992. set_input_port_default_value(4, Vector3(0.0, 0.0, 0.0));
  3993. set_input_port_default_value(5, Vector3(0.0, 0.0, 0.0));
  3994. }
  3995. ////////////// Switch
  3996. String VisualShaderNodeSwitch::get_caption() const {
  3997. return "Switch";
  3998. }
  3999. int VisualShaderNodeSwitch::get_input_port_count() const {
  4000. return 3;
  4001. }
  4002. VisualShaderNodeSwitch::PortType VisualShaderNodeSwitch::get_input_port_type(int p_port) const {
  4003. if (p_port == 0) {
  4004. return PORT_TYPE_BOOLEAN;
  4005. }
  4006. if (p_port == 1 || p_port == 2) {
  4007. switch (op_type) {
  4008. case OP_TYPE_INT:
  4009. return PORT_TYPE_SCALAR_INT;
  4010. case OP_TYPE_VECTOR:
  4011. return PORT_TYPE_VECTOR;
  4012. case OP_TYPE_BOOLEAN:
  4013. return PORT_TYPE_BOOLEAN;
  4014. case OP_TYPE_TRANSFORM:
  4015. return PORT_TYPE_TRANSFORM;
  4016. default:
  4017. break;
  4018. }
  4019. }
  4020. return PORT_TYPE_SCALAR;
  4021. }
  4022. String VisualShaderNodeSwitch::get_input_port_name(int p_port) const {
  4023. switch (p_port) {
  4024. case 0:
  4025. return "value";
  4026. case 1:
  4027. return "true";
  4028. case 2:
  4029. return "false";
  4030. default:
  4031. return "";
  4032. }
  4033. }
  4034. int VisualShaderNodeSwitch::get_output_port_count() const {
  4035. return 1;
  4036. }
  4037. VisualShaderNodeSwitch::PortType VisualShaderNodeSwitch::get_output_port_type(int p_port) const {
  4038. switch (op_type) {
  4039. case OP_TYPE_INT:
  4040. return PORT_TYPE_SCALAR_INT;
  4041. case OP_TYPE_VECTOR:
  4042. return PORT_TYPE_VECTOR;
  4043. case OP_TYPE_BOOLEAN:
  4044. return PORT_TYPE_BOOLEAN;
  4045. case OP_TYPE_TRANSFORM:
  4046. return PORT_TYPE_TRANSFORM;
  4047. default:
  4048. break;
  4049. }
  4050. return PORT_TYPE_SCALAR;
  4051. }
  4052. String VisualShaderNodeSwitch::get_output_port_name(int p_port) const {
  4053. return "result";
  4054. }
  4055. void VisualShaderNodeSwitch::set_op_type(OpType p_op_type) {
  4056. ERR_FAIL_INDEX((int)p_op_type, OP_TYPE_MAX);
  4057. if (op_type == p_op_type) {
  4058. return;
  4059. }
  4060. switch (p_op_type) {
  4061. case OP_TYPE_FLOAT:
  4062. set_input_port_default_value(1, 1.0);
  4063. set_input_port_default_value(2, 0.0);
  4064. break;
  4065. case OP_TYPE_INT:
  4066. set_input_port_default_value(1, 1);
  4067. set_input_port_default_value(2, 0);
  4068. break;
  4069. case OP_TYPE_VECTOR:
  4070. set_input_port_default_value(1, Vector3(1.0, 1.0, 1.0));
  4071. set_input_port_default_value(2, Vector3(0.0, 0.0, 0.0));
  4072. break;
  4073. case OP_TYPE_BOOLEAN:
  4074. set_input_port_default_value(1, true);
  4075. set_input_port_default_value(2, false);
  4076. break;
  4077. case OP_TYPE_TRANSFORM:
  4078. set_input_port_default_value(1, Transform());
  4079. set_input_port_default_value(2, Transform());
  4080. break;
  4081. default:
  4082. break;
  4083. }
  4084. op_type = p_op_type;
  4085. emit_changed();
  4086. }
  4087. VisualShaderNodeSwitch::OpType VisualShaderNodeSwitch::get_op_type() const {
  4088. return op_type;
  4089. }
  4090. Vector<StringName> VisualShaderNodeSwitch::get_editable_properties() const {
  4091. Vector<StringName> props;
  4092. props.push_back("op_type");
  4093. return props;
  4094. }
  4095. void VisualShaderNodeSwitch::_bind_methods() { // static
  4096. ClassDB::bind_method(D_METHOD("set_op_type", "type"), &VisualShaderNodeSwitch::set_op_type);
  4097. ClassDB::bind_method(D_METHOD("get_op_type"), &VisualShaderNodeSwitch::get_op_type);
  4098. ADD_PROPERTY(PropertyInfo(Variant::INT, "op_type", PROPERTY_HINT_ENUM, "Float,Int,Vector,Boolean,Transform"), "set_op_type", "get_op_type");
  4099. BIND_ENUM_CONSTANT(OP_TYPE_FLOAT);
  4100. BIND_ENUM_CONSTANT(OP_TYPE_INT);
  4101. BIND_ENUM_CONSTANT(OP_TYPE_VECTOR);
  4102. BIND_ENUM_CONSTANT(OP_TYPE_BOOLEAN);
  4103. BIND_ENUM_CONSTANT(OP_TYPE_TRANSFORM);
  4104. BIND_ENUM_CONSTANT(OP_TYPE_MAX);
  4105. }
  4106. String VisualShaderNodeSwitch::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  4107. String code;
  4108. code += "\tif(" + p_input_vars[0] + ")\n";
  4109. code += "\t{\n";
  4110. code += "\t\t" + p_output_vars[0] + " = " + p_input_vars[1] + ";\n";
  4111. code += "\t}\n";
  4112. code += "\telse\n";
  4113. code += "\t{\n";
  4114. code += "\t\t" + p_output_vars[0] + " = " + p_input_vars[2] + ";\n";
  4115. code += "\t}\n";
  4116. return code;
  4117. }
  4118. VisualShaderNodeSwitch::VisualShaderNodeSwitch() {
  4119. simple_decl = false;
  4120. set_input_port_default_value(0, false);
  4121. set_input_port_default_value(1, 1.0);
  4122. set_input_port_default_value(2, 0.0);
  4123. }
  4124. ////////////// Fresnel
  4125. String VisualShaderNodeFresnel::get_caption() const {
  4126. return "Fresnel";
  4127. }
  4128. int VisualShaderNodeFresnel::get_input_port_count() const {
  4129. return 4;
  4130. }
  4131. VisualShaderNodeFresnel::PortType VisualShaderNodeFresnel::get_input_port_type(int p_port) const {
  4132. switch (p_port) {
  4133. case 0:
  4134. return PORT_TYPE_VECTOR;
  4135. case 1:
  4136. return PORT_TYPE_VECTOR;
  4137. case 2:
  4138. return PORT_TYPE_BOOLEAN;
  4139. case 3:
  4140. return PORT_TYPE_SCALAR;
  4141. default:
  4142. return PORT_TYPE_VECTOR;
  4143. }
  4144. }
  4145. String VisualShaderNodeFresnel::get_input_port_name(int p_port) const {
  4146. switch (p_port) {
  4147. case 0:
  4148. return "normal";
  4149. case 1:
  4150. return "view";
  4151. case 2:
  4152. return "invert";
  4153. case 3:
  4154. return "power";
  4155. default:
  4156. return "";
  4157. }
  4158. }
  4159. int VisualShaderNodeFresnel::get_output_port_count() const {
  4160. return 1;
  4161. }
  4162. VisualShaderNodeFresnel::PortType VisualShaderNodeFresnel::get_output_port_type(int p_port) const {
  4163. return PORT_TYPE_SCALAR;
  4164. }
  4165. String VisualShaderNodeFresnel::get_output_port_name(int p_port) const {
  4166. return "result";
  4167. }
  4168. bool VisualShaderNodeFresnel::is_generate_input_var(int p_port) const {
  4169. if (p_port == 2) {
  4170. return false;
  4171. }
  4172. return true;
  4173. }
  4174. String VisualShaderNodeFresnel::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 {
  4175. String normal;
  4176. String view;
  4177. if (p_input_vars[0] == String()) {
  4178. normal = "NORMAL";
  4179. } else {
  4180. normal = p_input_vars[0];
  4181. }
  4182. if (p_input_vars[1] == String()) {
  4183. view = "VIEW";
  4184. } else {
  4185. view = p_input_vars[1];
  4186. }
  4187. if (is_input_port_connected(2)) {
  4188. return "\t" + p_output_vars[0] + " = " + p_input_vars[2] + " ? (pow(clamp(dot(" + normal + ", " + view + "), 0.0, 1.0), " + p_input_vars[3] + ")) : (pow(1.0 - clamp(dot(" + normal + ", " + view + "), 0.0, 1.0), " + p_input_vars[3] + "));\n";
  4189. } else {
  4190. if (get_input_port_default_value(2)) {
  4191. return "\t" + p_output_vars[0] + " = pow(clamp(dot(" + normal + ", " + view + "), 0.0, 1.0), " + p_input_vars[3] + ");\n";
  4192. } else {
  4193. return "\t" + p_output_vars[0] + " = pow(1.0 - clamp(dot(" + normal + ", " + view + "), 0.0, 1.0), " + p_input_vars[3] + ");\n";
  4194. }
  4195. }
  4196. }
  4197. String VisualShaderNodeFresnel::get_input_port_default_hint(int p_port) const {
  4198. if (p_port == 0) {
  4199. return "default";
  4200. } else if (p_port == 1) {
  4201. return "default";
  4202. }
  4203. return "";
  4204. }
  4205. VisualShaderNodeFresnel::VisualShaderNodeFresnel() {
  4206. set_input_port_default_value(2, false);
  4207. set_input_port_default_value(3, 1.0);
  4208. }
  4209. ////////////// Is
  4210. String VisualShaderNodeIs::get_caption() const {
  4211. return "Is";
  4212. }
  4213. int VisualShaderNodeIs::get_input_port_count() const {
  4214. return 1;
  4215. }
  4216. VisualShaderNodeIs::PortType VisualShaderNodeIs::get_input_port_type(int p_port) const {
  4217. return PORT_TYPE_SCALAR;
  4218. }
  4219. String VisualShaderNodeIs::get_input_port_name(int p_port) const {
  4220. return "";
  4221. }
  4222. int VisualShaderNodeIs::get_output_port_count() const {
  4223. return 1;
  4224. }
  4225. VisualShaderNodeIs::PortType VisualShaderNodeIs::get_output_port_type(int p_port) const {
  4226. return PORT_TYPE_BOOLEAN;
  4227. }
  4228. String VisualShaderNodeIs::get_output_port_name(int p_port) const {
  4229. return "";
  4230. }
  4231. String VisualShaderNodeIs::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 {
  4232. static const char *funcs[FUNC_IS_NAN + 1] = {
  4233. "isinf($)",
  4234. "isnan($)"
  4235. };
  4236. String code;
  4237. code += "\t" + p_output_vars[0] + " = " + String(funcs[func]).replace("$", p_input_vars[0]) + ";\n";
  4238. return code;
  4239. }
  4240. void VisualShaderNodeIs::set_function(Function p_func) {
  4241. func = p_func;
  4242. emit_changed();
  4243. }
  4244. VisualShaderNodeIs::Function VisualShaderNodeIs::get_function() const {
  4245. return func;
  4246. }
  4247. Vector<StringName> VisualShaderNodeIs::get_editable_properties() const {
  4248. Vector<StringName> props;
  4249. props.push_back("function");
  4250. return props;
  4251. }
  4252. void VisualShaderNodeIs::_bind_methods() {
  4253. ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeIs::set_function);
  4254. ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeIs::get_function);
  4255. ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Inf,NaN"), "set_function", "get_function");
  4256. BIND_ENUM_CONSTANT(FUNC_IS_INF);
  4257. BIND_ENUM_CONSTANT(FUNC_IS_NAN);
  4258. }
  4259. VisualShaderNodeIs::VisualShaderNodeIs() {
  4260. set_input_port_default_value(0, 0.0);
  4261. }
  4262. ////////////// Compare
  4263. String VisualShaderNodeCompare::get_caption() const {
  4264. return "Compare";
  4265. }
  4266. int VisualShaderNodeCompare::get_input_port_count() const {
  4267. if (ctype == CTYPE_SCALAR && (func == FUNC_EQUAL || func == FUNC_NOT_EQUAL)) {
  4268. return 3;
  4269. }
  4270. return 2;
  4271. }
  4272. VisualShaderNodeCompare::PortType VisualShaderNodeCompare::get_input_port_type(int p_port) const {
  4273. switch (ctype) {
  4274. case CTYPE_SCALAR:
  4275. return PORT_TYPE_SCALAR;
  4276. case CTYPE_SCALAR_INT:
  4277. return PORT_TYPE_SCALAR_INT;
  4278. case CTYPE_VECTOR:
  4279. return PORT_TYPE_VECTOR;
  4280. case CTYPE_BOOLEAN:
  4281. return PORT_TYPE_BOOLEAN;
  4282. case CTYPE_TRANSFORM:
  4283. return PORT_TYPE_TRANSFORM;
  4284. default:
  4285. return PORT_TYPE_SCALAR;
  4286. }
  4287. }
  4288. String VisualShaderNodeCompare::get_input_port_name(int p_port) const {
  4289. if (p_port == 0) {
  4290. return "a";
  4291. } else if (p_port == 1) {
  4292. return "b";
  4293. } else if (p_port == 2) {
  4294. return "tolerance";
  4295. }
  4296. return "";
  4297. }
  4298. int VisualShaderNodeCompare::get_output_port_count() const {
  4299. return 1;
  4300. }
  4301. VisualShaderNodeCompare::PortType VisualShaderNodeCompare::get_output_port_type(int p_port) const {
  4302. return PORT_TYPE_BOOLEAN;
  4303. }
  4304. String VisualShaderNodeCompare::get_output_port_name(int p_port) const {
  4305. if (p_port == 0) {
  4306. return "result";
  4307. }
  4308. return "";
  4309. }
  4310. String VisualShaderNodeCompare::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const {
  4311. if (ctype == CTYPE_BOOLEAN || ctype == CTYPE_TRANSFORM) {
  4312. if (func > FUNC_NOT_EQUAL) {
  4313. return TTR("Invalid comparison function for that type.");
  4314. }
  4315. }
  4316. return "";
  4317. }
  4318. String VisualShaderNodeCompare::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 {
  4319. static const char *ops[FUNC_LESS_THAN_EQUAL + 1] = {
  4320. "==",
  4321. "!=",
  4322. ">",
  4323. ">=",
  4324. "<",
  4325. "<=",
  4326. };
  4327. static const char *funcs[FUNC_LESS_THAN_EQUAL + 1] = {
  4328. "equal($)",
  4329. "notEqual($)",
  4330. "greaterThan($)",
  4331. "greaterThanEqual($)",
  4332. "lessThan($)",
  4333. "lessThanEqual($)",
  4334. };
  4335. static const char *conds[COND_ANY + 1] = {
  4336. "all($)",
  4337. "any($)",
  4338. };
  4339. String code;
  4340. switch (ctype) {
  4341. case CTYPE_SCALAR:
  4342. if (func == FUNC_EQUAL) {
  4343. code += "\t" + p_output_vars[0] + " = (abs(" + p_input_vars[0] + " - " + p_input_vars[1] + ") < " + p_input_vars[2] + ");";
  4344. } else if (func == FUNC_NOT_EQUAL) {
  4345. code += "\t" + p_output_vars[0] + " = !(abs(" + p_input_vars[0] + " - " + p_input_vars[1] + ") < " + p_input_vars[2] + ");";
  4346. } else {
  4347. code += "\t" + p_output_vars[0] + " = " + (p_input_vars[0] + " $ " + p_input_vars[1]).replace("$", ops[func]) + ";\n";
  4348. }
  4349. break;
  4350. case CTYPE_SCALAR_INT:
  4351. code += "\t" + p_output_vars[0] + " = " + (p_input_vars[0] + " $ " + p_input_vars[1]).replace("$", ops[func]) + ";\n";
  4352. break;
  4353. case CTYPE_VECTOR:
  4354. code += "\t{\n";
  4355. code += "\t\tbvec3 _bv = " + String(funcs[func]).replace("$", p_input_vars[0] + ", " + p_input_vars[1]) + ";\n";
  4356. code += "\t\t" + p_output_vars[0] + " = " + String(conds[condition]).replace("$", "_bv") + ";\n";
  4357. code += "\t}\n";
  4358. break;
  4359. case CTYPE_BOOLEAN:
  4360. if (func > FUNC_NOT_EQUAL) {
  4361. return "\t" + p_output_vars[0] + " = false;\n";
  4362. }
  4363. code += "\t" + p_output_vars[0] + " = " + (p_input_vars[0] + " $ " + p_input_vars[1]).replace("$", ops[func]) + ";\n";
  4364. break;
  4365. case CTYPE_TRANSFORM:
  4366. if (func > FUNC_NOT_EQUAL) {
  4367. return "\t" + p_output_vars[0] + " = false;\n";
  4368. }
  4369. code += "\t" + p_output_vars[0] + " = " + (p_input_vars[0] + " $ " + p_input_vars[1]).replace("$", ops[func]) + ";\n";
  4370. break;
  4371. default:
  4372. break;
  4373. }
  4374. return code;
  4375. }
  4376. void VisualShaderNodeCompare::set_comparison_type(ComparisonType p_type) {
  4377. ctype = p_type;
  4378. switch (ctype) {
  4379. case CTYPE_SCALAR:
  4380. set_input_port_default_value(0, 0.0);
  4381. set_input_port_default_value(1, 0.0);
  4382. simple_decl = true;
  4383. break;
  4384. case CTYPE_SCALAR_INT:
  4385. set_input_port_default_value(0, 0);
  4386. set_input_port_default_value(1, 0);
  4387. simple_decl = true;
  4388. break;
  4389. case CTYPE_VECTOR:
  4390. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0));
  4391. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
  4392. simple_decl = false;
  4393. break;
  4394. case CTYPE_BOOLEAN:
  4395. set_input_port_default_value(0, false);
  4396. set_input_port_default_value(1, false);
  4397. simple_decl = true;
  4398. break;
  4399. case CTYPE_TRANSFORM:
  4400. set_input_port_default_value(0, Transform());
  4401. set_input_port_default_value(1, Transform());
  4402. simple_decl = true;
  4403. break;
  4404. }
  4405. emit_changed();
  4406. }
  4407. VisualShaderNodeCompare::ComparisonType VisualShaderNodeCompare::get_comparison_type() const {
  4408. return ctype;
  4409. }
  4410. void VisualShaderNodeCompare::set_function(Function p_func) {
  4411. func = p_func;
  4412. emit_changed();
  4413. }
  4414. VisualShaderNodeCompare::Function VisualShaderNodeCompare::get_function() const {
  4415. return func;
  4416. }
  4417. void VisualShaderNodeCompare::set_condition(Condition p_cond) {
  4418. condition = p_cond;
  4419. emit_changed();
  4420. }
  4421. VisualShaderNodeCompare::Condition VisualShaderNodeCompare::get_condition() const {
  4422. return condition;
  4423. }
  4424. Vector<StringName> VisualShaderNodeCompare::get_editable_properties() const {
  4425. Vector<StringName> props;
  4426. props.push_back("type");
  4427. props.push_back("function");
  4428. if (ctype == CTYPE_VECTOR) {
  4429. props.push_back("condition");
  4430. }
  4431. return props;
  4432. }
  4433. void VisualShaderNodeCompare::_bind_methods() {
  4434. ClassDB::bind_method(D_METHOD("set_comparison_type", "type"), &VisualShaderNodeCompare::set_comparison_type);
  4435. ClassDB::bind_method(D_METHOD("get_comparison_type"), &VisualShaderNodeCompare::get_comparison_type);
  4436. ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeCompare::set_function);
  4437. ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeCompare::get_function);
  4438. ClassDB::bind_method(D_METHOD("set_condition", "condition"), &VisualShaderNodeCompare::set_condition);
  4439. ClassDB::bind_method(D_METHOD("get_condition"), &VisualShaderNodeCompare::get_condition);
  4440. ADD_PROPERTY(PropertyInfo(Variant::INT, "type", PROPERTY_HINT_ENUM, "Float,Int,Vector,Boolean,Transform"), "set_comparison_type", "get_comparison_type");
  4441. ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "a == b,a != b,a > b,a >= b,a < b,a <= b"), "set_function", "get_function");
  4442. ADD_PROPERTY(PropertyInfo(Variant::INT, "condition", PROPERTY_HINT_ENUM, "All,Any"), "set_condition", "get_condition");
  4443. BIND_ENUM_CONSTANT(CTYPE_SCALAR);
  4444. BIND_ENUM_CONSTANT(CTYPE_SCALAR_INT);
  4445. BIND_ENUM_CONSTANT(CTYPE_VECTOR);
  4446. BIND_ENUM_CONSTANT(CTYPE_BOOLEAN);
  4447. BIND_ENUM_CONSTANT(CTYPE_TRANSFORM);
  4448. BIND_ENUM_CONSTANT(FUNC_EQUAL);
  4449. BIND_ENUM_CONSTANT(FUNC_NOT_EQUAL);
  4450. BIND_ENUM_CONSTANT(FUNC_GREATER_THAN);
  4451. BIND_ENUM_CONSTANT(FUNC_GREATER_THAN_EQUAL);
  4452. BIND_ENUM_CONSTANT(FUNC_LESS_THAN);
  4453. BIND_ENUM_CONSTANT(FUNC_LESS_THAN_EQUAL);
  4454. BIND_ENUM_CONSTANT(COND_ALL);
  4455. BIND_ENUM_CONSTANT(COND_ANY);
  4456. }
  4457. VisualShaderNodeCompare::VisualShaderNodeCompare() {
  4458. set_input_port_default_value(0, 0.0);
  4459. set_input_port_default_value(1, 0.0);
  4460. set_input_port_default_value(2, CMP_EPSILON);
  4461. }
  4462. ////////////// Fma
  4463. String VisualShaderNodeMultiplyAdd::get_caption() const {
  4464. return "MultiplyAdd";
  4465. }
  4466. int VisualShaderNodeMultiplyAdd::get_input_port_count() const {
  4467. return 3;
  4468. }
  4469. VisualShaderNodeMultiplyAdd::PortType VisualShaderNodeMultiplyAdd::get_input_port_type(int p_port) const {
  4470. if (op_type == OP_TYPE_VECTOR) {
  4471. return PORT_TYPE_VECTOR;
  4472. }
  4473. return PORT_TYPE_SCALAR;
  4474. }
  4475. String VisualShaderNodeMultiplyAdd::get_input_port_name(int p_port) const {
  4476. if (p_port == 0) {
  4477. return "a";
  4478. } else if (p_port == 1) {
  4479. return "b(*)";
  4480. } else if (p_port == 2) {
  4481. return "c(+)";
  4482. }
  4483. return "";
  4484. }
  4485. int VisualShaderNodeMultiplyAdd::get_output_port_count() const {
  4486. return 1;
  4487. }
  4488. VisualShaderNodeMultiplyAdd::PortType VisualShaderNodeMultiplyAdd::get_output_port_type(int p_port) const {
  4489. if (op_type == OP_TYPE_SCALAR) {
  4490. return PORT_TYPE_SCALAR;
  4491. } else {
  4492. return PORT_TYPE_VECTOR;
  4493. }
  4494. }
  4495. String VisualShaderNodeMultiplyAdd::get_output_port_name(int p_port) const {
  4496. return "";
  4497. }
  4498. String VisualShaderNodeMultiplyAdd::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 {
  4499. return "\t" + p_output_vars[0] + " = fma(" + p_input_vars[0] + ", " + p_input_vars[1] + ", " + p_input_vars[2] + ");\n";
  4500. }
  4501. void VisualShaderNodeMultiplyAdd::set_op_type(OpType p_op_type) {
  4502. ERR_FAIL_INDEX((int)p_op_type, OP_TYPE_MAX);
  4503. if (op_type == p_op_type) {
  4504. return;
  4505. }
  4506. switch (p_op_type) {
  4507. case OP_TYPE_SCALAR:
  4508. set_input_port_default_value(0, 0.0);
  4509. set_input_port_default_value(1, 0.0);
  4510. set_input_port_default_value(2, 0.0);
  4511. break;
  4512. case OP_TYPE_VECTOR:
  4513. set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0));
  4514. set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0));
  4515. set_input_port_default_value(2, Vector3(0.0, 0.0, 0.0));
  4516. break;
  4517. default:
  4518. break;
  4519. }
  4520. op_type = p_op_type;
  4521. emit_changed();
  4522. }
  4523. VisualShaderNodeMultiplyAdd::OpType VisualShaderNodeMultiplyAdd::get_op_type() const {
  4524. return op_type;
  4525. }
  4526. Vector<StringName> VisualShaderNodeMultiplyAdd::get_editable_properties() const {
  4527. Vector<StringName> props;
  4528. props.push_back("op_type");
  4529. return props;
  4530. }
  4531. void VisualShaderNodeMultiplyAdd::_bind_methods() {
  4532. ClassDB::bind_method(D_METHOD("set_op_type", "type"), &VisualShaderNodeMultiplyAdd::set_op_type);
  4533. ClassDB::bind_method(D_METHOD("get_op_type"), &VisualShaderNodeMultiplyAdd::get_op_type);
  4534. ADD_PROPERTY(PropertyInfo(Variant::INT, "op_type", PROPERTY_HINT_ENUM, "Scalar,Vector"), "set_op_type", "get_op_type");
  4535. BIND_ENUM_CONSTANT(OP_TYPE_SCALAR);
  4536. BIND_ENUM_CONSTANT(OP_TYPE_VECTOR);
  4537. BIND_ENUM_CONSTANT(OP_TYPE_MAX);
  4538. }
  4539. VisualShaderNodeMultiplyAdd::VisualShaderNodeMultiplyAdd() {
  4540. set_input_port_default_value(0, 0.0);
  4541. set_input_port_default_value(1, 0.0);
  4542. set_input_port_default_value(2, 0.0);
  4543. }