shader_language.cpp 102 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904
  1. /*************************************************************************/
  2. /* shader_language.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* http://www.godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
  9. /* */
  10. /* Permission is hereby granted, free of charge, to any person obtaining */
  11. /* a copy of this software and associated documentation files (the */
  12. /* "Software"), to deal in the Software without restriction, including */
  13. /* without limitation the rights to use, copy, modify, merge, publish, */
  14. /* distribute, sublicense, and/or sell copies of the Software, and to */
  15. /* permit persons to whom the Software is furnished to do so, subject to */
  16. /* the following conditions: */
  17. /* */
  18. /* The above copyright notice and this permission notice shall be */
  19. /* included in all copies or substantial portions of the Software. */
  20. /* */
  21. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  22. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  23. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  24. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  25. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  26. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  27. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  28. /*************************************************************************/
  29. #include "shader_language.h"
  30. #include "print_string.h"
  31. #include "os/os.h"
  32. static bool _is_text_char(CharType c) {
  33. return (c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='_';
  34. }
  35. static bool _is_number(CharType c) {
  36. return (c>='0' && c<='9');
  37. }
  38. static bool _is_hex(CharType c) {
  39. return (c>='0' && c<='9') || (c>='a' && c<='f') || (c>='A' && c<='F');
  40. }
  41. String ShaderLanguage::get_operator_text(Operator p_op) {
  42. static const char* op_names[OP_MAX]={"==",
  43. "!=",
  44. "<",
  45. "<=",
  46. ">",
  47. ">=",
  48. "&&",
  49. "||",
  50. "!",
  51. "-",
  52. "+",
  53. "-",
  54. "*",
  55. "/",
  56. "%",
  57. "<<",
  58. ">>",
  59. "=",
  60. "+=",
  61. "-=",
  62. "*=",
  63. "/=",
  64. "%=",
  65. "<<=",
  66. ">>=",
  67. "&=",
  68. "|=",
  69. "^=",
  70. "&",
  71. "|",
  72. "^",
  73. "~",
  74. "++"
  75. "--",
  76. "()",
  77. "construct"};
  78. return op_names[p_op];
  79. }
  80. const char * ShaderLanguage::token_names[TK_MAX]={
  81. "EMPTY",
  82. "IDENTIFIER",
  83. "TRUE",
  84. "FALSE",
  85. "REAL_CONSTANT",
  86. "INT_CONSTANT",
  87. "TYPE_VOID",
  88. "TYPE_BOOL",
  89. "TYPE_BVEC2",
  90. "TYPE_BVEC3",
  91. "TYPE_BVEC4",
  92. "TYPE_INT",
  93. "TYPE_IVEC2",
  94. "TYPE_IVEC3",
  95. "TYPE_IVEC4",
  96. "TYPE_UINT",
  97. "TYPE_UVEC2",
  98. "TYPE_UVEC3",
  99. "TYPE_UVEC4",
  100. "TYPE_FLOAT",
  101. "TYPE_VEC2",
  102. "TYPE_VEC3",
  103. "TYPE_VEC4",
  104. "TYPE_MAT2",
  105. "TYPE_MAT3",
  106. "TYPE_MAT4",
  107. "TYPE_SAMPLER2D",
  108. "TYPE_ISAMPLER2D",
  109. "TYPE_USAMPLER2D",
  110. "TYPE_SAMPLERCUBE",
  111. "PRECISION_LOW",
  112. "PRECISION_MID",
  113. "PRECISION_HIGH",
  114. "OP_EQUAL",
  115. "OP_NOT_EQUAL",
  116. "OP_LESS",
  117. "OP_LESS_EQUAL",
  118. "OP_GREATER",
  119. "OP_GREATER_EQUAL",
  120. "OP_AND",
  121. "OP_OR",
  122. "OP_NOT",
  123. "OP_ADD",
  124. "OP_SUB",
  125. "OP_MUL",
  126. "OP_DIV",
  127. "OP_MOD",
  128. "OP_SHIFT_LEFT",
  129. "OP_SHIFT_RIGHT",
  130. "OP_ASSIGN",
  131. "OP_ASSIGN_ADD",
  132. "OP_ASSIGN_SUB",
  133. "OP_ASSIGN_MUL",
  134. "OP_ASSIGN_DIV",
  135. "OP_ASSIGN_MOD",
  136. "OP_ASSIGN_SHIFT_LEFT",
  137. "OP_ASSIGN_SHIFT_RIGHT",
  138. "OP_ASSIGN_BIT_AND",
  139. "OP_ASSIGN_BIT_OR",
  140. "OP_ASSIGN_BIT_XOR",
  141. "OP_BIT_AND",
  142. "OP_BIT_OR",
  143. "OP_BIT_XOR",
  144. "OP_BIT_INVERT",
  145. "OP_INCREMENT",
  146. "OP_DECREMENT",
  147. "CF_IF",
  148. "CF_ELSE",
  149. "CF_FOR",
  150. "CF_WHILE",
  151. "CF_DO",
  152. "CF_SWITCH",
  153. "CF_CASE",
  154. "CF_BREAK",
  155. "CF_CONTINUE",
  156. "CF_RETURN",
  157. "BRACKET_OPEN",
  158. "BRACKET_CLOSE",
  159. "CURLY_BRACKET_OPEN",
  160. "CURLY_BRACKET_CLOSE",
  161. "PARENTHESIS_OPEN",
  162. "PARENTHESIS_CLOSE",
  163. "QUESTION",
  164. "COMMA",
  165. "COLON",
  166. "SEMICOLON",
  167. "PERIOD",
  168. "UNIFORM",
  169. "VARYING",
  170. "RENDER_MODE",
  171. "HINT_WHITE_TEXTURE",
  172. "HINT_BLACK_TEXTURE",
  173. "HINT_NORMAL_TEXTURE",
  174. "HINT_ANISO_TEXTURE",
  175. "HINT_ALBEDO_TEXTURE",
  176. "HINT_BLACK_ALBEDO_TEXTURE",
  177. "HINT_COLOR",
  178. "HINT_RANGE",
  179. "CURSOR",
  180. "ERROR",
  181. "EOF",
  182. };
  183. String ShaderLanguage::get_token_text(Token p_token) {
  184. String name=token_names[p_token.type];
  185. if (p_token.type==TK_INT_CONSTANT || p_token.type==TK_REAL_CONSTANT) {
  186. name+="("+rtos(p_token.constant)+")";
  187. } else if (p_token.type==TK_IDENTIFIER) {
  188. name+="("+String(p_token.text)+")";
  189. } else if (p_token.type==TK_ERROR) {
  190. name+="("+String(p_token.text)+")";
  191. }
  192. return name;
  193. }
  194. ShaderLanguage::Token ShaderLanguage::_make_token(TokenType p_type,const StringName& p_text) {
  195. Token tk;
  196. tk.type=p_type;
  197. tk.text=p_text;
  198. tk.line=tk_line;
  199. if (tk.type==TK_ERROR) {
  200. _set_error(p_text);
  201. }
  202. return tk;
  203. }
  204. const ShaderLanguage::KeyWord ShaderLanguage::keyword_list[]={
  205. {TK_TRUE,"true"},
  206. {TK_FALSE,"false"},
  207. {TK_TYPE_VOID,"void"},
  208. {TK_TYPE_BOOL,"bool"},
  209. {TK_TYPE_BVEC2,"bvec2"},
  210. {TK_TYPE_BVEC3,"bvec3"},
  211. {TK_TYPE_BVEC4,"bvec4"},
  212. {TK_TYPE_INT,"int"},
  213. {TK_TYPE_IVEC2,"ivec2"},
  214. {TK_TYPE_IVEC3,"ivec3"},
  215. {TK_TYPE_IVEC4,"ivec4"},
  216. {TK_TYPE_UINT,"uint"},
  217. {TK_TYPE_UVEC2,"uvec2"},
  218. {TK_TYPE_UVEC3,"uvec3"},
  219. {TK_TYPE_UVEC4,"uvec4"},
  220. {TK_TYPE_FLOAT,"float"},
  221. {TK_TYPE_VEC2,"vec2"},
  222. {TK_TYPE_VEC3,"vec3"},
  223. {TK_TYPE_VEC4,"vec4"},
  224. {TK_TYPE_MAT2,"mat2"},
  225. {TK_TYPE_MAT3,"mat3"},
  226. {TK_TYPE_MAT4,"mat4"},
  227. {TK_TYPE_SAMPLER2D,"sampler2D"},
  228. {TK_TYPE_ISAMPLER2D,"isampler2D"},
  229. {TK_TYPE_USAMPLER2D,"usampler2D"},
  230. {TK_TYPE_SAMPLERCUBE,"samplerCube"},
  231. {TK_PRECISION_LOW,"lowp"},
  232. {TK_PRECISION_MID,"mediump"},
  233. {TK_PRECISION_HIGH,"highp"},
  234. {TK_CF_IF,"if"},
  235. {TK_CF_ELSE,"else"},
  236. {TK_CF_FOR,"for"},
  237. {TK_CF_WHILE,"while"},
  238. {TK_CF_DO,"do"},
  239. {TK_CF_SWITCH,"switch"},
  240. {TK_CF_CASE,"case"},
  241. {TK_CF_BREAK,"break"},
  242. {TK_CF_CONTINUE,"continue"},
  243. {TK_CF_RETURN,"return"},
  244. {TK_UNIFORM,"uniform"},
  245. {TK_VARYING,"varying"},
  246. {TK_RENDER_MODE,"render_mode"},
  247. {TK_HINT_WHITE_TEXTURE,"hint_white"},
  248. {TK_HINT_BLACK_TEXTURE,"hint_black"},
  249. {TK_HINT_NORMAL_TEXTURE,"hint_normal"},
  250. {TK_HINT_ANISO_TEXTURE,"hint_aniso"},
  251. {TK_HINT_ALBEDO_TEXTURE,"hint_albedo"},
  252. {TK_HINT_BLACK_ALBEDO_TEXTURE,"hint_black_albedo"},
  253. {TK_HINT_COLOR,"hint_color"},
  254. {TK_HINT_RANGE,"hint_range"},
  255. {TK_ERROR,NULL}
  256. };
  257. ShaderLanguage::Token ShaderLanguage::_get_token() {
  258. #define GETCHAR(m_idx) (((char_idx+m_idx)<code.length())?code[char_idx+m_idx]:CharType(0))
  259. while(true) {
  260. char_idx++;
  261. switch(GETCHAR(-1)) {
  262. case 0:
  263. return _make_token(TK_EOF);
  264. case 0xFFFF:
  265. return _make_token(TK_CURSOR); //for completion
  266. case '\t':
  267. case '\r':
  268. case ' ':
  269. continue;
  270. case '\n':
  271. tk_line++;
  272. continue;
  273. case '/': {
  274. switch(GETCHAR(0)) {
  275. case '*': { // block comment
  276. char_idx++;
  277. while(true) {
  278. if (GETCHAR(0)==0) {
  279. return _make_token(TK_EOF);
  280. } if (GETCHAR(0)=='*' && GETCHAR(1)=='/') {
  281. char_idx+=2;
  282. break;
  283. } else if (GETCHAR(0)=='\n') {
  284. tk_line++;
  285. }
  286. char_idx++;
  287. }
  288. } break;
  289. case '/': { // line comment skip
  290. while(true) {
  291. if (GETCHAR(0)=='\n') {
  292. char_idx++;
  293. break;
  294. }
  295. if (GETCHAR(0)==0) {
  296. return _make_token(TK_EOF);
  297. }
  298. char_idx++;
  299. }
  300. } break;
  301. case '=': { // diveq
  302. char_idx++;
  303. return _make_token(TK_OP_ASSIGN_DIV);
  304. } break;
  305. default:
  306. return _make_token(TK_OP_DIV);
  307. }
  308. continue; //a comment, continue to next token
  309. } break;
  310. case '=': {
  311. if (GETCHAR(0)=='=') {
  312. char_idx++;
  313. return _make_token(TK_OP_EQUAL);
  314. }
  315. return _make_token(TK_OP_ASSIGN);
  316. } break;
  317. case '<': {
  318. if (GETCHAR(0)=='=') {
  319. char_idx++;
  320. return _make_token(TK_OP_LESS_EQUAL);
  321. } else if (GETCHAR(0)=='<') {
  322. char_idx++;
  323. if (GETCHAR(0)=='=') {
  324. char_idx++;
  325. return _make_token(TK_OP_ASSIGN_SHIFT_LEFT);
  326. }
  327. return _make_token(TK_OP_SHIFT_LEFT);
  328. }
  329. return _make_token(TK_OP_LESS);
  330. } break;
  331. case '>': {
  332. if (GETCHAR(0)=='=') {
  333. char_idx++;
  334. return _make_token(TK_OP_GREATER_EQUAL);
  335. } else if (GETCHAR(0)=='<') {
  336. char_idx++;
  337. if (GETCHAR(0)=='=') {
  338. char_idx++;
  339. return _make_token(TK_OP_ASSIGN_SHIFT_RIGHT);
  340. }
  341. return _make_token(TK_OP_SHIFT_RIGHT);
  342. }
  343. return _make_token(TK_OP_GREATER);
  344. } break;
  345. case '!': {
  346. if (GETCHAR(0)=='=') {
  347. char_idx++;
  348. return _make_token(TK_OP_NOT_EQUAL);
  349. }
  350. return _make_token(TK_OP_NOT);
  351. } break;
  352. //case '"' //string - no strings in shader
  353. //case '\'' //string - no strings in shader
  354. case '{':
  355. return _make_token(TK_CURLY_BRACKET_OPEN);
  356. case '}':
  357. return _make_token(TK_CURLY_BRACKET_CLOSE);
  358. case '[':
  359. return _make_token(TK_BRACKET_OPEN);
  360. case ']':
  361. return _make_token(TK_BRACKET_CLOSE);
  362. case '(':
  363. return _make_token(TK_PARENTHESIS_OPEN);
  364. case ')':
  365. return _make_token(TK_PARENTHESIS_CLOSE);
  366. case ',':
  367. return _make_token(TK_COMMA);
  368. case ';':
  369. return _make_token(TK_SEMICOLON);
  370. case '?':
  371. return _make_token(TK_QUESTION);
  372. case ':':
  373. return _make_token(TK_COLON);
  374. case '^':
  375. return _make_token(TK_OP_BIT_XOR);
  376. case '~':
  377. return _make_token(TK_OP_BIT_INVERT);
  378. case '&': {
  379. if (GETCHAR(0)=='=') {
  380. char_idx++;
  381. return _make_token(TK_OP_ASSIGN_BIT_AND);
  382. } else if (GETCHAR(0)=='&') {
  383. char_idx++;
  384. return _make_token(TK_OP_AND);
  385. }
  386. return _make_token(TK_OP_BIT_AND);
  387. } break;
  388. case '|': {
  389. if (GETCHAR(0)=='=') {
  390. char_idx++;
  391. return _make_token(TK_OP_ASSIGN_BIT_OR);
  392. } else if (GETCHAR(0)=='|') {
  393. char_idx++;
  394. return _make_token(TK_OP_OR);
  395. }
  396. return _make_token(TK_OP_BIT_OR);
  397. } break;
  398. case '*': {
  399. if (GETCHAR(0)=='=') {
  400. char_idx++;
  401. return _make_token(TK_OP_ASSIGN_MUL);
  402. }
  403. return _make_token(TK_OP_MUL);
  404. } break;
  405. case '+': {
  406. if (GETCHAR(0)=='=') {
  407. char_idx++;
  408. return _make_token(TK_OP_ASSIGN_ADD);
  409. } else if (GETCHAR(0)=='+') {
  410. char_idx++;
  411. return _make_token(TK_OP_INCREMENT);
  412. }
  413. return _make_token(TK_OP_ADD);
  414. } break;
  415. case '-': {
  416. if (GETCHAR(0)=='=') {
  417. char_idx++;
  418. return _make_token(TK_OP_ASSIGN_SUB);
  419. }else if (GETCHAR(0)=='-') {
  420. char_idx++;
  421. return _make_token(TK_OP_DECREMENT);
  422. }
  423. return _make_token(TK_OP_SUB);
  424. } break;
  425. case '%': {
  426. if (GETCHAR(0)=='=') {
  427. char_idx++;
  428. return _make_token(TK_OP_ASSIGN_MOD);
  429. }
  430. return _make_token(TK_OP_MOD);
  431. } break;
  432. default: {
  433. char_idx--; //go back one, since we have no idea what this is
  434. if (_is_number(GETCHAR(0)) || (GETCHAR(0)=='.' && _is_number(GETCHAR(1)))) {
  435. // parse number
  436. bool period_found=false;
  437. bool exponent_found=false;
  438. bool hexa_found=false;
  439. bool sign_found=false;
  440. bool minus_exponent_found=false;
  441. String str;
  442. int i=0;
  443. while(true) {
  444. if (GETCHAR(i)=='.') {
  445. if (period_found || exponent_found)
  446. return _make_token(TK_ERROR,"Invalid numeric constant");
  447. period_found=true;
  448. } else if (GETCHAR(i)=='x') {
  449. if (hexa_found || str.length()!=1 || str[0]!='0')
  450. return _make_token(TK_ERROR,"Invalid numeric constant");
  451. hexa_found=true;
  452. } else if (GETCHAR(i)=='e') {
  453. if (hexa_found || exponent_found)
  454. return _make_token(TK_ERROR,"Invalid numeric constant");
  455. exponent_found=true;
  456. } else if (_is_number(GETCHAR(i))) {
  457. //all ok
  458. } else if (hexa_found && _is_hex(GETCHAR(i))) {
  459. } else if ((GETCHAR(i)=='-' || GETCHAR(i)=='+') && exponent_found) {
  460. if (sign_found)
  461. return _make_token(TK_ERROR,"Invalid numeric constant");
  462. sign_found=true;
  463. if (GETCHAR(i)=='-')
  464. minus_exponent_found=true;
  465. } else
  466. break;
  467. str+=CharType(GETCHAR(i));
  468. i++;
  469. }
  470. if (!_is_number(str[str.length()-1]))
  471. return _make_token(TK_ERROR,"Invalid numeric constant");
  472. char_idx+=str.length();
  473. Token tk;
  474. if (period_found || minus_exponent_found)
  475. tk.type=TK_REAL_CONSTANT;
  476. else
  477. tk.type=TK_INT_CONSTANT;
  478. if (!str.is_valid_float()) {
  479. return _make_token(TK_ERROR,"Invalid numeric constant");
  480. }
  481. tk.constant=str.to_double();
  482. tk.line=tk_line;
  483. return tk;
  484. }
  485. if (GETCHAR(0)=='.') {
  486. //parse period
  487. char_idx++;
  488. return _make_token(TK_PERIOD);
  489. }
  490. if (_is_text_char(GETCHAR(0))) {
  491. // parse identifier
  492. String str;
  493. while(_is_text_char(GETCHAR(0))) {
  494. str+=CharType(GETCHAR(0));
  495. char_idx++;
  496. }
  497. //see if keyword
  498. //should be converted to a static map
  499. int idx=0;
  500. while(keyword_list[idx].text) {
  501. if (str==keyword_list[idx].text) {
  502. return _make_token(keyword_list[idx].token);
  503. }
  504. idx++;
  505. }
  506. return _make_token(TK_IDENTIFIER,str);
  507. }
  508. if (GETCHAR(0)>32)
  509. return _make_token(TK_ERROR,"Tokenizer: Unknown character #"+itos(GETCHAR(0))+": '"+String::chr(GETCHAR(0))+"'");
  510. else
  511. return _make_token(TK_ERROR,"Tokenizer: Unknown character #"+itos(GETCHAR(0)));
  512. } break;
  513. }
  514. }
  515. ERR_PRINT("BUG");
  516. return Token();
  517. }
  518. String ShaderLanguage::token_debug(const String& p_code) {
  519. clear();
  520. code=p_code;
  521. String output;
  522. Token tk = _get_token();
  523. while(tk.type!=TK_EOF && tk.type!=TK_ERROR) {
  524. output+=itos(tk_line)+": "+get_token_text(tk)+"\n";
  525. tk = _get_token();
  526. }
  527. return output;
  528. }
  529. bool ShaderLanguage::is_token_datatype(TokenType p_type) {
  530. return (
  531. p_type==TK_TYPE_VOID ||
  532. p_type==TK_TYPE_BOOL ||
  533. p_type==TK_TYPE_BVEC2 ||
  534. p_type==TK_TYPE_BVEC3 ||
  535. p_type==TK_TYPE_BVEC4 ||
  536. p_type==TK_TYPE_INT ||
  537. p_type==TK_TYPE_IVEC2 ||
  538. p_type==TK_TYPE_IVEC3 ||
  539. p_type==TK_TYPE_IVEC4 ||
  540. p_type==TK_TYPE_UINT ||
  541. p_type==TK_TYPE_UVEC2 ||
  542. p_type==TK_TYPE_UVEC3 ||
  543. p_type==TK_TYPE_UVEC4 ||
  544. p_type==TK_TYPE_FLOAT ||
  545. p_type==TK_TYPE_VEC2 ||
  546. p_type==TK_TYPE_VEC3 ||
  547. p_type==TK_TYPE_VEC4 ||
  548. p_type==TK_TYPE_MAT2 ||
  549. p_type==TK_TYPE_MAT3 ||
  550. p_type==TK_TYPE_MAT4 ||
  551. p_type==TK_TYPE_SAMPLER2D ||
  552. p_type==TK_TYPE_ISAMPLER2D ||
  553. p_type==TK_TYPE_USAMPLER2D ||
  554. p_type==TK_TYPE_SAMPLERCUBE );
  555. }
  556. ShaderLanguage::DataType ShaderLanguage::get_token_datatype(TokenType p_type) {
  557. return DataType(p_type-TK_TYPE_VOID);
  558. }
  559. bool ShaderLanguage::is_token_precision(TokenType p_type) {
  560. return (
  561. p_type==TK_PRECISION_LOW ||
  562. p_type==TK_PRECISION_MID ||
  563. p_type==TK_PRECISION_HIGH );
  564. }
  565. ShaderLanguage::DataPrecision ShaderLanguage::get_token_precision(TokenType p_type) {
  566. if (p_type==TK_PRECISION_LOW)
  567. return PRECISION_LOWP;
  568. else if (p_type==TK_PRECISION_HIGH)
  569. return PRECISION_HIGHP;
  570. else
  571. return PRECISION_MEDIUMP;
  572. }
  573. String ShaderLanguage::get_datatype_name(DataType p_type) {
  574. switch(p_type) {
  575. case TYPE_VOID: return "void";
  576. case TYPE_BOOL: return "bool";
  577. case TYPE_BVEC2: return "bvec2";
  578. case TYPE_BVEC3: return "bvec3";
  579. case TYPE_BVEC4: return "bvec4";
  580. case TYPE_INT: return "int";
  581. case TYPE_IVEC2: return "ivec2";
  582. case TYPE_IVEC3: return "ivec3";
  583. case TYPE_IVEC4: return "ivec4";
  584. case TYPE_UINT: return "uint";
  585. case TYPE_UVEC2: return "uvec2";
  586. case TYPE_UVEC3: return "uvec3";
  587. case TYPE_UVEC4: return "uvec4";
  588. case TYPE_FLOAT: return "float";
  589. case TYPE_VEC2: return "vec2";
  590. case TYPE_VEC3: return "vec3";
  591. case TYPE_VEC4: return "vec4";
  592. case TYPE_MAT2: return "mat2";
  593. case TYPE_MAT3: return "mat3";
  594. case TYPE_MAT4: return "mat4";
  595. case TYPE_SAMPLER2D: return "sampler2D";
  596. case TYPE_ISAMPLER2D: return "isampler2D";
  597. case TYPE_USAMPLER2D: return "usampler2D";
  598. case TYPE_SAMPLERCUBE: return "samplerCube";
  599. }
  600. return "";
  601. }
  602. bool ShaderLanguage::is_token_nonvoid_datatype(TokenType p_type) {
  603. return is_token_datatype(p_type) && p_type!=TK_TYPE_VOID;
  604. }
  605. void ShaderLanguage::clear() {
  606. current_function=StringName();
  607. completion_type=COMPLETION_NONE;
  608. completion_block=NULL;
  609. completion_function=StringName();
  610. error_line=0;
  611. tk_line=1;
  612. char_idx=0;
  613. error_set=false;
  614. error_str="";
  615. while(nodes) {
  616. Node *n = nodes;
  617. nodes=nodes->next;
  618. memdelete(n);
  619. }
  620. }
  621. bool ShaderLanguage::_find_identifier(const BlockNode* p_block,const Map<StringName, DataType> &p_builtin_types,const StringName& p_identifier, DataType *r_data_type, IdentifierType *r_type) {
  622. if (p_builtin_types.has(p_identifier)) {
  623. if (r_data_type) {
  624. *r_data_type=p_builtin_types[p_identifier];
  625. }
  626. if (r_type) {
  627. *r_type=IDENTIFIER_BUILTIN_VAR;
  628. }
  629. return true;
  630. }
  631. FunctionNode *function=NULL;
  632. while(p_block) {
  633. if (p_block->variables.has(p_identifier)) {
  634. if (r_data_type) {
  635. *r_data_type=p_block->variables[p_identifier].type;
  636. }
  637. if (r_type) {
  638. *r_type=IDENTIFIER_LOCAL_VAR;
  639. }
  640. return true;
  641. }
  642. if (p_block->parent_function) {
  643. function=p_block->parent_function;
  644. break;
  645. } else {
  646. ERR_FAIL_COND_V(!p_block->parent_block,false);
  647. p_block=p_block->parent_block;
  648. }
  649. }
  650. if (function) {
  651. for(int i=0;i<function->arguments.size();i++) {
  652. if (function->arguments[i].name==p_identifier) {
  653. if (r_data_type) {
  654. *r_data_type=function->arguments[i].type;
  655. }
  656. if (r_type) {
  657. *r_type=IDENTIFIER_FUNCTION_ARGUMENT;
  658. }
  659. return true;
  660. }
  661. }
  662. }
  663. if (shader->varyings.has(p_identifier)) {
  664. if (r_data_type) {
  665. *r_data_type=shader->varyings[p_identifier].type;
  666. }
  667. if (r_type) {
  668. *r_type=IDENTIFIER_VARYING;
  669. }
  670. return true;
  671. }
  672. if (shader->uniforms.has(p_identifier)) {
  673. if (r_data_type) {
  674. *r_data_type=shader->uniforms[p_identifier].type;
  675. }
  676. if (r_type) {
  677. *r_type=IDENTIFIER_UNIFORM;
  678. }
  679. return true;
  680. }
  681. for(int i=0;i<shader->functions.size();i++) {
  682. if (!shader->functions[i].callable)
  683. continue;
  684. if (shader->functions[i].name==p_identifier) {
  685. if (r_data_type) {
  686. *r_data_type=shader->functions[i].function->return_type;
  687. }
  688. if (r_type) {
  689. *r_type=IDENTIFIER_FUNCTION;
  690. }
  691. }
  692. }
  693. return false;
  694. }
  695. bool ShaderLanguage::_validate_operator(OperatorNode *p_op,DataType *r_ret_type) {
  696. bool valid=false;
  697. DataType ret_type;
  698. switch(p_op->op) {
  699. case OP_EQUAL:
  700. case OP_NOT_EQUAL: {
  701. DataType na = p_op->arguments[0]->get_datatype();
  702. DataType nb = p_op->arguments[1]->get_datatype();
  703. valid=na==nb;
  704. ret_type=TYPE_BOOL;
  705. } break;
  706. case OP_LESS:
  707. case OP_LESS_EQUAL:
  708. case OP_GREATER:
  709. case OP_GREATER_EQUAL: {
  710. DataType na = p_op->arguments[0]->get_datatype();
  711. DataType nb = p_op->arguments[1]->get_datatype();
  712. valid = na==nb && (na==TYPE_UINT || na==TYPE_INT || na==TYPE_FLOAT);
  713. ret_type=TYPE_BOOL;
  714. } break;
  715. case OP_AND:
  716. case OP_OR: {
  717. DataType na = p_op->arguments[0]->get_datatype();
  718. DataType nb = p_op->arguments[1]->get_datatype();
  719. valid = na==nb && na==TYPE_BOOL;
  720. ret_type=TYPE_BOOL;
  721. } break;
  722. case OP_NOT: {
  723. DataType na = p_op->arguments[0]->get_datatype();
  724. valid = na==TYPE_BOOL;
  725. ret_type=TYPE_BOOL;
  726. } break;
  727. case OP_INCREMENT:
  728. case OP_DECREMENT:
  729. case OP_POST_INCREMENT:
  730. case OP_POST_DECREMENT:
  731. case OP_NEGATE: {
  732. DataType na = p_op->arguments[0]->get_datatype();
  733. valid = na>TYPE_BOOL && na<TYPE_MAT2;
  734. ret_type=na;
  735. } break;
  736. case OP_ADD:
  737. case OP_SUB:
  738. case OP_MUL:
  739. case OP_DIV: {
  740. DataType na = p_op->arguments[0]->get_datatype();
  741. DataType nb = p_op->arguments[1]->get_datatype();
  742. if (na>nb) {
  743. //make things easier;
  744. SWAP(na,nb);
  745. }
  746. if (na==nb) {
  747. valid = (na>TYPE_BOOL && na<TYPE_MAT2) || (p_op->op==OP_MUL && na>=TYPE_MAT2 && na<=TYPE_MAT4);
  748. ret_type=na;
  749. } else if (na==TYPE_INT && nb==TYPE_IVEC2) {
  750. valid=true;
  751. ret_type=TYPE_IVEC2;
  752. } else if (na==TYPE_INT && nb==TYPE_IVEC3) {
  753. valid=true;
  754. ret_type=TYPE_IVEC3;
  755. } else if (na==TYPE_INT && nb==TYPE_IVEC4) {
  756. valid=true;
  757. ret_type=TYPE_IVEC4;
  758. } else if (na==TYPE_UINT && nb==TYPE_UVEC2) {
  759. valid=true;
  760. ret_type=TYPE_UVEC2;
  761. } else if (na==TYPE_UINT && nb==TYPE_UVEC3) {
  762. valid=true;
  763. ret_type=TYPE_UVEC3;
  764. } else if (na==TYPE_UINT && nb==TYPE_UVEC4) {
  765. valid=true;
  766. ret_type=TYPE_UVEC4;
  767. } else if (na==TYPE_FLOAT && nb==TYPE_VEC2) {
  768. valid=true;
  769. ret_type=TYPE_VEC2;
  770. } else if (na==TYPE_FLOAT && nb==TYPE_VEC3) {
  771. valid=true;
  772. ret_type=TYPE_VEC3;
  773. } else if (na==TYPE_FLOAT && nb==TYPE_VEC4) {
  774. valid=true;
  775. ret_type=TYPE_VEC4;
  776. } else if (p_op->op==OP_MUL && na==TYPE_VEC2 && nb==TYPE_MAT2) {
  777. valid=true;
  778. ret_type=TYPE_MAT2;
  779. } else if (p_op->op==OP_MUL && na==TYPE_VEC3 && nb==TYPE_MAT3) {
  780. valid=true;
  781. ret_type=TYPE_MAT3;
  782. } else if (p_op->op==OP_MUL && na==TYPE_VEC4 && nb==TYPE_MAT4) {
  783. valid=true;
  784. ret_type=TYPE_MAT4;
  785. }
  786. } break;
  787. case OP_ASSIGN_MOD:
  788. case OP_MOD: {
  789. /*
  790. * The operator modulus (%) operates on signed or unsigned integers or integer vectors. The operand
  791. * types must both be signed or both be unsigned. The operands cannot be vectors of differing size. If
  792. * one operand is a scalar and the other vector, then the scalar is applied component-wise to the vector,
  793. * resulting in the same type as the vector. If both are vectors of the same size, the result is computed
  794. * component-wise.
  795. */
  796. DataType na = p_op->arguments[0]->get_datatype();
  797. DataType nb = p_op->arguments[1]->get_datatype();
  798. if (na==TYPE_INT && nb==TYPE_INT) {
  799. valid=true;
  800. ret_type=TYPE_INT;
  801. } else if (na==TYPE_IVEC2 && nb==TYPE_INT) {
  802. valid=true;
  803. ret_type=TYPE_IVEC2;
  804. } else if (na==TYPE_IVEC3 && nb==TYPE_INT) {
  805. valid=true;
  806. ret_type=TYPE_IVEC3;
  807. } else if (na==TYPE_IVEC4 && nb==TYPE_INT) {
  808. valid=true;
  809. ret_type=TYPE_IVEC4;
  810. } else if (na==TYPE_IVEC2 && nb==TYPE_IVEC2) {
  811. valid=true;
  812. ret_type=TYPE_IVEC2;
  813. } else if (na==TYPE_IVEC3 && nb==TYPE_IVEC3) {
  814. valid=true;
  815. ret_type=TYPE_IVEC3;
  816. } else if (na==TYPE_IVEC4 && nb==TYPE_IVEC4) {
  817. valid=true;
  818. ret_type=TYPE_IVEC4;
  819. /////
  820. } else if (na==TYPE_UINT && nb==TYPE_UINT) {
  821. valid=true;
  822. ret_type=TYPE_UINT;
  823. } else if (na==TYPE_UVEC2 && nb==TYPE_UINT) {
  824. valid=true;
  825. ret_type=TYPE_UVEC2;
  826. } else if (na==TYPE_UVEC3 && nb==TYPE_UINT) {
  827. valid=true;
  828. ret_type=TYPE_UVEC3;
  829. } else if (na==TYPE_UVEC4 && nb==TYPE_UINT) {
  830. valid=true;
  831. ret_type=TYPE_UVEC4;
  832. } else if (na==TYPE_UVEC2 && nb==TYPE_UVEC2) {
  833. valid=true;
  834. ret_type=TYPE_UVEC2;
  835. } else if (na==TYPE_UVEC3 && nb==TYPE_UVEC3) {
  836. valid=true;
  837. ret_type=TYPE_UVEC3;
  838. } else if (na==TYPE_UVEC4 && nb==TYPE_UVEC4) {
  839. valid=true;
  840. ret_type=TYPE_UVEC4;
  841. }
  842. } break;
  843. case OP_ASSIGN_SHIFT_LEFT:
  844. case OP_ASSIGN_SHIFT_RIGHT:
  845. case OP_SHIFT_LEFT:
  846. case OP_SHIFT_RIGHT: {
  847. DataType na = p_op->arguments[0]->get_datatype();
  848. DataType nb = p_op->arguments[1]->get_datatype();
  849. if (na>=TYPE_UINT && na<=TYPE_UVEC4) {
  850. na=DataType(na-4);
  851. }
  852. if (nb>=TYPE_UINT && nb<=TYPE_UVEC4) {
  853. nb=DataType(nb-4);
  854. }
  855. if (na==TYPE_INT && nb==TYPE_INT) {
  856. valid=true;
  857. ret_type=TYPE_INT;
  858. } else if (na==TYPE_IVEC2 && nb==TYPE_INT) {
  859. valid=true;
  860. ret_type=TYPE_IVEC2;
  861. } else if (na==TYPE_IVEC3 && nb==TYPE_INT) {
  862. valid=true;
  863. ret_type=TYPE_IVEC3;
  864. } else if (na==TYPE_IVEC4 && nb==TYPE_INT) {
  865. valid=true;
  866. ret_type=TYPE_IVEC4;
  867. } else if (na==TYPE_IVEC2 && nb==TYPE_IVEC2) {
  868. valid=true;
  869. ret_type=TYPE_IVEC2;
  870. } else if (na==TYPE_IVEC3 && nb==TYPE_IVEC3) {
  871. valid=true;
  872. ret_type=TYPE_IVEC3;
  873. } else if (na==TYPE_IVEC4 && nb==TYPE_IVEC4) {
  874. valid=true;
  875. ret_type=TYPE_IVEC4;
  876. }
  877. } break;
  878. case OP_ASSIGN: {
  879. DataType na = p_op->arguments[0]->get_datatype();
  880. DataType nb = p_op->arguments[1]->get_datatype();
  881. valid=na==nb;
  882. ret_type=na;
  883. } break;
  884. case OP_ASSIGN_ADD:
  885. case OP_ASSIGN_SUB:
  886. case OP_ASSIGN_MUL:
  887. case OP_ASSIGN_DIV: {
  888. DataType na = p_op->arguments[0]->get_datatype();
  889. DataType nb = p_op->arguments[1]->get_datatype();
  890. if (na==nb) {
  891. valid = (na>TYPE_BOOL && na<TYPE_MAT2) || (p_op->op==OP_ASSIGN_MUL && na>=TYPE_MAT2 && na<=TYPE_MAT4);
  892. ret_type=na;
  893. } else if (na==TYPE_IVEC2 && nb==TYPE_INT) {
  894. valid=true;
  895. ret_type=TYPE_IVEC2;
  896. } else if (na==TYPE_IVEC3 && nb==TYPE_INT) {
  897. valid=true;
  898. ret_type=TYPE_IVEC3;
  899. } else if (na==TYPE_IVEC4 && nb==TYPE_INT ) {
  900. valid=true;
  901. ret_type=TYPE_IVEC4;
  902. } else if (na==TYPE_UVEC2 && nb==TYPE_UINT) {
  903. valid=true;
  904. ret_type=TYPE_UVEC2;
  905. } else if (na==TYPE_UVEC3 && nb==TYPE_UINT) {
  906. valid=true;
  907. ret_type=TYPE_UVEC3;
  908. } else if (na==TYPE_UVEC4 && nb==TYPE_UINT) {
  909. valid=true;
  910. ret_type=TYPE_UVEC4;
  911. } else if (na==TYPE_VEC2 && nb==TYPE_FLOAT ) {
  912. valid=true;
  913. ret_type=TYPE_VEC2;
  914. } else if (na==TYPE_VEC3 && nb==TYPE_FLOAT) {
  915. valid=true;
  916. ret_type=TYPE_VEC3;
  917. } else if (na==TYPE_VEC4 && nb==TYPE_FLOAT) {
  918. valid=true;
  919. ret_type=TYPE_VEC4;
  920. } else if (p_op->op==OP_ASSIGN_MUL && na==TYPE_MAT2 && nb==TYPE_VEC2) {
  921. valid=true;
  922. ret_type=TYPE_MAT2;
  923. } else if (p_op->op==OP_ASSIGN_MUL && na==TYPE_MAT3 && nb==TYPE_VEC3) {
  924. valid=true;
  925. ret_type=TYPE_MAT3;
  926. } else if (p_op->op==OP_ASSIGN_MUL && na==TYPE_MAT4 && nb==TYPE_VEC4) {
  927. valid=true;
  928. ret_type=TYPE_MAT4;
  929. }
  930. } break;
  931. case OP_ASSIGN_BIT_AND:
  932. case OP_ASSIGN_BIT_OR:
  933. case OP_ASSIGN_BIT_XOR:
  934. case OP_BIT_AND:
  935. case OP_BIT_OR:
  936. case OP_BIT_XOR: {
  937. /*
  938. * The bitwise operators and (&), exclusive-or (^), and inclusive-or (|). The operands must be of type
  939. * signed or unsigned integers or integer vectors. The operands cannot be vectors of differing size. If
  940. * one operand is a scalar and the other a vector, the scalar is applied component-wise to the vector,
  941. * resulting in the same type as the vector. The fundamental types of the operands (signed or unsigned)
  942. * must match.
  943. */
  944. DataType na = p_op->arguments[0]->get_datatype();
  945. DataType nb = p_op->arguments[1]->get_datatype();
  946. if (na>nb && p_op->op>=OP_BIT_AND) {
  947. //can swap for non assign
  948. SWAP(na,nb);
  949. }
  950. if (na==TYPE_INT && nb==TYPE_INT) {
  951. valid=true;
  952. ret_type=TYPE_INT;
  953. } else if (na==TYPE_IVEC2 && nb==TYPE_INT) {
  954. valid=true;
  955. ret_type=TYPE_IVEC2;
  956. } else if (na==TYPE_IVEC3 && nb==TYPE_INT) {
  957. valid=true;
  958. ret_type=TYPE_IVEC3;
  959. } else if (na==TYPE_IVEC4 && nb==TYPE_INT) {
  960. valid=true;
  961. ret_type=TYPE_IVEC4;
  962. } else if (na==TYPE_IVEC2 && nb==TYPE_IVEC2) {
  963. valid=true;
  964. ret_type=TYPE_IVEC2;
  965. } else if (na==TYPE_IVEC3 && nb==TYPE_IVEC3) {
  966. valid=true;
  967. ret_type=TYPE_IVEC3;
  968. } else if (na==TYPE_IVEC4 && nb==TYPE_IVEC4) {
  969. valid=true;
  970. ret_type=TYPE_IVEC4;
  971. /////
  972. } else if (na==TYPE_UINT && nb==TYPE_UINT) {
  973. valid=true;
  974. ret_type=TYPE_UINT;
  975. } else if (na==TYPE_UVEC2 && nb==TYPE_UINT) {
  976. valid=true;
  977. ret_type=TYPE_UVEC2;
  978. } else if (na==TYPE_UVEC3 && nb==TYPE_UINT) {
  979. valid=true;
  980. ret_type=TYPE_UVEC3;
  981. } else if (na==TYPE_UVEC4 && nb==TYPE_UINT) {
  982. valid=true;
  983. ret_type=TYPE_UVEC4;
  984. } else if (na==TYPE_UVEC2 && nb==TYPE_UVEC2) {
  985. valid=true;
  986. ret_type=TYPE_UVEC2;
  987. } else if (na==TYPE_UVEC3 && nb==TYPE_UVEC3) {
  988. valid=true;
  989. ret_type=TYPE_UVEC3;
  990. } else if (na==TYPE_UVEC4 && nb==TYPE_UVEC4) {
  991. valid=true;
  992. ret_type=TYPE_UVEC4;
  993. }
  994. } break;
  995. case OP_BIT_INVERT: { //unaries
  996. DataType na = p_op->arguments[0]->get_datatype();
  997. valid = na>=TYPE_INT && na<TYPE_FLOAT;
  998. ret_type=na;
  999. } break;
  1000. case OP_SELECT_IF: {
  1001. DataType na = p_op->arguments[0]->get_datatype();
  1002. DataType nb = p_op->arguments[1]->get_datatype();
  1003. DataType nc = p_op->arguments[2]->get_datatype();
  1004. valid = na==TYPE_BOOL && (nb==nc);
  1005. ret_type=nb;
  1006. } break;
  1007. default: {
  1008. ERR_FAIL_V(false);
  1009. }
  1010. }
  1011. if (r_ret_type)
  1012. *r_ret_type=ret_type;
  1013. return valid;
  1014. }
  1015. const ShaderLanguage::BuiltinFuncDef ShaderLanguage::builtin_func_defs[]={
  1016. //constructors
  1017. {"bool",TYPE_BOOL,{TYPE_BOOL,TYPE_VOID}},
  1018. {"bvec2",TYPE_BVEC2,{TYPE_BOOL,TYPE_VOID}},
  1019. {"bvec2",TYPE_BVEC2,{TYPE_BOOL,TYPE_BOOL,TYPE_VOID}},
  1020. {"bvec3",TYPE_BVEC3,{TYPE_BOOL,TYPE_VOID}},
  1021. {"bvec3",TYPE_BVEC3,{TYPE_BOOL,TYPE_BOOL,TYPE_BOOL,TYPE_VOID}},
  1022. {"bvec3",TYPE_BVEC3,{TYPE_BVEC2,TYPE_BOOL,TYPE_VOID}},
  1023. {"bvec3",TYPE_BVEC3,{TYPE_BOOL,TYPE_BVEC2,TYPE_VOID}},
  1024. {"bvec4",TYPE_BVEC4,{TYPE_BOOL,TYPE_VOID}},
  1025. {"bvec4",TYPE_BVEC4,{TYPE_BOOL,TYPE_BOOL,TYPE_BOOL,TYPE_BOOL,TYPE_VOID}},
  1026. {"bvec4",TYPE_BVEC4,{TYPE_BOOL,TYPE_BVEC2,TYPE_BOOL,TYPE_VOID}},
  1027. {"bvec4",TYPE_BVEC4,{TYPE_BVEC2,TYPE_BOOL,TYPE_BOOL,TYPE_VOID}},
  1028. {"bvec4",TYPE_BVEC4,{TYPE_BOOL,TYPE_BOOL,TYPE_BVEC2,TYPE_VOID}},
  1029. {"bvec4",TYPE_BVEC4,{TYPE_BOOL,TYPE_BVEC3,TYPE_VOID}},
  1030. {"bvec4",TYPE_BVEC4,{TYPE_BVEC3,TYPE_BOOL,TYPE_VOID}},
  1031. {"bvec4",TYPE_BVEC4,{TYPE_BVEC2,TYPE_BVEC2,TYPE_VOID}},
  1032. {"float",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1033. {"vec2",TYPE_VEC2,{TYPE_FLOAT,TYPE_VOID}},
  1034. {"vec2",TYPE_VEC2,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1035. {"vec3",TYPE_VEC3,{TYPE_FLOAT,TYPE_VOID}},
  1036. {"vec3",TYPE_VEC3,{TYPE_FLOAT,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1037. {"vec3",TYPE_VEC3,{TYPE_VEC2,TYPE_FLOAT,TYPE_VOID}},
  1038. {"vec3",TYPE_VEC3,{TYPE_FLOAT,TYPE_VEC2,TYPE_VOID}},
  1039. {"vec4",TYPE_VEC4,{TYPE_FLOAT,TYPE_VOID}},
  1040. {"vec4",TYPE_VEC4,{TYPE_FLOAT,TYPE_FLOAT,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1041. {"vec4",TYPE_VEC4,{TYPE_FLOAT,TYPE_VEC2,TYPE_FLOAT,TYPE_VOID}},
  1042. {"vec4",TYPE_VEC4,{TYPE_VEC2,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1043. {"vec4",TYPE_VEC4,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VEC2,TYPE_VOID}},
  1044. {"vec4",TYPE_VEC4,{TYPE_FLOAT,TYPE_VEC3,TYPE_VOID}},
  1045. {"vec4",TYPE_VEC4,{TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1046. {"vec4",TYPE_VEC4,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1047. {"int",TYPE_INT,{TYPE_INT,TYPE_VOID}},
  1048. {"ivec2",TYPE_IVEC2,{TYPE_INT,TYPE_VOID}},
  1049. {"ivec2",TYPE_IVEC2,{TYPE_INT,TYPE_INT,TYPE_VOID}},
  1050. {"ivec3",TYPE_IVEC3,{TYPE_INT,TYPE_VOID}},
  1051. {"ivec3",TYPE_IVEC3,{TYPE_INT,TYPE_INT,TYPE_INT,TYPE_VOID}},
  1052. {"ivec3",TYPE_IVEC3,{TYPE_IVEC2,TYPE_INT,TYPE_VOID}},
  1053. {"ivec3",TYPE_IVEC3,{TYPE_INT,TYPE_IVEC2,TYPE_VOID}},
  1054. {"ivec4",TYPE_IVEC4,{TYPE_INT,TYPE_VOID}},
  1055. {"ivec4",TYPE_IVEC4,{TYPE_INT,TYPE_INT,TYPE_INT,TYPE_INT,TYPE_VOID}},
  1056. {"ivec4",TYPE_IVEC4,{TYPE_INT,TYPE_IVEC2,TYPE_INT,TYPE_VOID}},
  1057. {"ivec4",TYPE_IVEC4,{TYPE_IVEC2,TYPE_INT,TYPE_INT,TYPE_VOID}},
  1058. {"ivec4",TYPE_IVEC4,{TYPE_INT,TYPE_INT,TYPE_IVEC2,TYPE_VOID}},
  1059. {"ivec4",TYPE_IVEC4,{TYPE_INT,TYPE_IVEC3,TYPE_VOID}},
  1060. {"ivec4",TYPE_IVEC4,{TYPE_IVEC3,TYPE_INT,TYPE_VOID}},
  1061. {"ivec4",TYPE_IVEC4,{TYPE_IVEC2,TYPE_IVEC2,TYPE_VOID}},
  1062. {"uint",TYPE_UINT,{TYPE_UINT,TYPE_VOID}},
  1063. {"uvec2",TYPE_UVEC2,{TYPE_UINT,TYPE_VOID}},
  1064. {"uvec2",TYPE_UVEC2,{TYPE_UINT,TYPE_UINT,TYPE_VOID}},
  1065. {"uvec3",TYPE_UVEC3,{TYPE_UINT,TYPE_VOID}},
  1066. {"uvec3",TYPE_UVEC3,{TYPE_UINT,TYPE_UINT,TYPE_UINT,TYPE_VOID}},
  1067. {"uvec3",TYPE_UVEC3,{TYPE_UVEC2,TYPE_UINT,TYPE_VOID}},
  1068. {"uvec3",TYPE_UVEC3,{TYPE_UINT,TYPE_UVEC2,TYPE_VOID}},
  1069. {"uvec4",TYPE_UVEC4,{TYPE_UINT,TYPE_VOID}},
  1070. {"uvec4",TYPE_UVEC4,{TYPE_UINT,TYPE_UINT,TYPE_UINT,TYPE_UINT,TYPE_VOID}},
  1071. {"uvec4",TYPE_UVEC4,{TYPE_UINT,TYPE_UVEC2,TYPE_UINT,TYPE_VOID}},
  1072. {"uvec4",TYPE_UVEC4,{TYPE_UVEC2,TYPE_UINT,TYPE_UINT,TYPE_VOID}},
  1073. {"uvec4",TYPE_UVEC4,{TYPE_UINT,TYPE_UINT,TYPE_UVEC2,TYPE_VOID}},
  1074. {"uvec4",TYPE_UVEC4,{TYPE_UINT,TYPE_UVEC3,TYPE_VOID}},
  1075. {"uvec4",TYPE_UVEC4,{TYPE_UVEC3,TYPE_UINT,TYPE_VOID}},
  1076. {"uvec4",TYPE_UVEC4,{TYPE_UVEC2,TYPE_UVEC2,TYPE_VOID}},
  1077. {"mat2",TYPE_MAT2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1078. {"mat3",TYPE_MAT3,{TYPE_VEC3,TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1079. {"mat4",TYPE_MAT4,{TYPE_VEC4,TYPE_VEC4,TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1080. {"mat2",TYPE_MAT2,{TYPE_FLOAT,TYPE_VOID}},
  1081. {"mat3",TYPE_MAT3,{TYPE_FLOAT,TYPE_VOID}},
  1082. {"mat4",TYPE_MAT4,{TYPE_FLOAT,TYPE_VOID}},
  1083. //conversion scalars
  1084. {"int",TYPE_INT,{TYPE_BOOL,TYPE_VOID}},
  1085. {"int",TYPE_INT,{TYPE_INT,TYPE_VOID}},
  1086. {"int",TYPE_INT,{TYPE_UINT,TYPE_VOID}},
  1087. {"int",TYPE_INT,{TYPE_FLOAT,TYPE_VOID}},
  1088. {"float",TYPE_FLOAT,{TYPE_BOOL,TYPE_VOID}},
  1089. {"float",TYPE_FLOAT,{TYPE_INT,TYPE_VOID}},
  1090. {"float",TYPE_FLOAT,{TYPE_UINT,TYPE_VOID}},
  1091. {"float",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1092. {"uint",TYPE_UINT,{TYPE_BOOL,TYPE_VOID}},
  1093. {"uint",TYPE_UINT,{TYPE_INT,TYPE_VOID}},
  1094. {"uint",TYPE_UINT,{TYPE_UINT,TYPE_VOID}},
  1095. {"uint",TYPE_UINT,{TYPE_FLOAT,TYPE_VOID}},
  1096. {"bool",TYPE_BOOL,{TYPE_BOOL,TYPE_VOID}},
  1097. {"bool",TYPE_BOOL,{TYPE_INT,TYPE_VOID}},
  1098. {"bool",TYPE_BOOL,{TYPE_UINT,TYPE_VOID}},
  1099. {"bool",TYPE_BOOL,{TYPE_FLOAT,TYPE_VOID}},
  1100. //conversion vectors
  1101. {"ivec2",TYPE_IVEC2,{TYPE_BVEC2,TYPE_VOID}},
  1102. {"ivec2",TYPE_IVEC2,{TYPE_IVEC2,TYPE_VOID}},
  1103. {"ivec2",TYPE_IVEC2,{TYPE_UVEC2,TYPE_VOID}},
  1104. {"ivec2",TYPE_IVEC2,{TYPE_VEC2,TYPE_VOID}},
  1105. {"vec2",TYPE_VEC2,{TYPE_BVEC2,TYPE_VOID}},
  1106. {"vec2",TYPE_VEC2,{TYPE_IVEC2,TYPE_VOID}},
  1107. {"vec2",TYPE_VEC2,{TYPE_UVEC2,TYPE_VOID}},
  1108. {"vec2",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
  1109. {"uvec2",TYPE_UVEC2,{TYPE_BVEC2,TYPE_VOID}},
  1110. {"uvec2",TYPE_UVEC2,{TYPE_IVEC2,TYPE_VOID}},
  1111. {"uvec2",TYPE_UVEC2,{TYPE_UVEC2,TYPE_VOID}},
  1112. {"uvec2",TYPE_UVEC2,{TYPE_VEC2,TYPE_VOID}},
  1113. {"bvec2",TYPE_BVEC2,{TYPE_BVEC2,TYPE_VOID}},
  1114. {"bvec2",TYPE_BVEC2,{TYPE_IVEC2,TYPE_VOID}},
  1115. {"bvec2",TYPE_BVEC2,{TYPE_UVEC2,TYPE_VOID}},
  1116. {"bvec2",TYPE_BVEC2,{TYPE_VEC2,TYPE_VOID}},
  1117. {"ivec3",TYPE_IVEC3,{TYPE_BVEC3,TYPE_VOID}},
  1118. {"ivec3",TYPE_IVEC3,{TYPE_IVEC3,TYPE_VOID}},
  1119. {"ivec3",TYPE_IVEC3,{TYPE_UVEC3,TYPE_VOID}},
  1120. {"ivec3",TYPE_IVEC3,{TYPE_VEC3,TYPE_VOID}},
  1121. {"vec3",TYPE_VEC3,{TYPE_BVEC3,TYPE_VOID}},
  1122. {"vec3",TYPE_VEC3,{TYPE_IVEC3,TYPE_VOID}},
  1123. {"vec3",TYPE_VEC3,{TYPE_UVEC3,TYPE_VOID}},
  1124. {"vec3",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
  1125. {"uvec3",TYPE_UVEC3,{TYPE_BVEC3,TYPE_VOID}},
  1126. {"uvec3",TYPE_UVEC3,{TYPE_IVEC3,TYPE_VOID}},
  1127. {"uvec3",TYPE_UVEC3,{TYPE_UVEC3,TYPE_VOID}},
  1128. {"uvec3",TYPE_UVEC3,{TYPE_VEC3,TYPE_VOID}},
  1129. {"bvec3",TYPE_BVEC3,{TYPE_BVEC3,TYPE_VOID}},
  1130. {"bvec3",TYPE_BVEC3,{TYPE_IVEC3,TYPE_VOID}},
  1131. {"bvec3",TYPE_BVEC3,{TYPE_UVEC3,TYPE_VOID}},
  1132. {"bvec3",TYPE_BVEC3,{TYPE_VEC3,TYPE_VOID}},
  1133. {"ivec4",TYPE_IVEC4,{TYPE_BVEC4,TYPE_VOID}},
  1134. {"ivec4",TYPE_IVEC4,{TYPE_IVEC4,TYPE_VOID}},
  1135. {"ivec4",TYPE_IVEC4,{TYPE_UVEC4,TYPE_VOID}},
  1136. {"ivec4",TYPE_IVEC4,{TYPE_VEC4,TYPE_VOID}},
  1137. {"vec4",TYPE_VEC4,{TYPE_BVEC4,TYPE_VOID}},
  1138. {"vec4",TYPE_VEC4,{TYPE_IVEC4,TYPE_VOID}},
  1139. {"vec4",TYPE_VEC4,{TYPE_UVEC4,TYPE_VOID}},
  1140. {"vec4",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
  1141. {"uvec4",TYPE_UVEC4,{TYPE_BVEC4,TYPE_VOID}},
  1142. {"uvec4",TYPE_UVEC4,{TYPE_IVEC4,TYPE_VOID}},
  1143. {"uvec4",TYPE_UVEC4,{TYPE_UVEC4,TYPE_VOID}},
  1144. {"uvec4",TYPE_UVEC4,{TYPE_VEC4,TYPE_VOID}},
  1145. {"bvec4",TYPE_BVEC4,{TYPE_BVEC4,TYPE_VOID}},
  1146. {"bvec4",TYPE_BVEC4,{TYPE_IVEC4,TYPE_VOID}},
  1147. {"bvec4",TYPE_BVEC4,{TYPE_UVEC4,TYPE_VOID}},
  1148. {"bvec4",TYPE_BVEC4,{TYPE_VEC4,TYPE_VOID}},
  1149. //builtins - trigonometry
  1150. {"sin",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1151. {"cos",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1152. {"tan",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1153. {"asin",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1154. {"acos",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1155. {"atan",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1156. {"atan2",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1157. {"sinh",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1158. {"cosh",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1159. {"tanh",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1160. //builtins - exponential
  1161. {"pow",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1162. {"pow",TYPE_VEC2,{TYPE_VEC2,TYPE_FLOAT,TYPE_VOID}},
  1163. {"pow",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1164. {"pow",TYPE_VEC3,{TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1165. {"pow",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1166. {"pow",TYPE_VEC4,{TYPE_VEC4,TYPE_FLOAT,TYPE_VOID}},
  1167. {"pow",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1168. {"exp",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1169. {"exp",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
  1170. {"exp",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
  1171. {"exp",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
  1172. {"log",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1173. {"log",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
  1174. {"log",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
  1175. {"log",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
  1176. {"sqrt",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1177. {"sqrt",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
  1178. {"sqrt",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
  1179. {"sqrt",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
  1180. //builtins - common
  1181. {"abs",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1182. {"abs",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
  1183. {"abs",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
  1184. {"abs",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
  1185. {"abs",TYPE_INT,{TYPE_INT,TYPE_VOID}},
  1186. {"abs",TYPE_IVEC2,{TYPE_IVEC2,TYPE_VOID}},
  1187. {"abs",TYPE_IVEC3,{TYPE_IVEC3,TYPE_VOID}},
  1188. {"abs",TYPE_IVEC4,{TYPE_IVEC4,TYPE_VOID}},
  1189. {"abs",TYPE_UINT,{TYPE_UINT,TYPE_VOID}},
  1190. {"abs",TYPE_UVEC2,{TYPE_UVEC2,TYPE_VOID}},
  1191. {"abs",TYPE_UVEC3,{TYPE_UVEC3,TYPE_VOID}},
  1192. {"abs",TYPE_UVEC4,{TYPE_UVEC4,TYPE_VOID}},
  1193. {"sign",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1194. {"sign",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
  1195. {"sign",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
  1196. {"sign",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
  1197. {"sign",TYPE_INT,{TYPE_INT,TYPE_VOID}},
  1198. {"sign",TYPE_IVEC2,{TYPE_IVEC2,TYPE_VOID}},
  1199. {"sign",TYPE_IVEC3,{TYPE_IVEC3,TYPE_VOID}},
  1200. {"sign",TYPE_IVEC4,{TYPE_IVEC4,TYPE_VOID}},
  1201. {"floor",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1202. {"floor",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
  1203. {"floor",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
  1204. {"floor",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
  1205. {"trunc",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1206. {"trunc",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
  1207. {"trunc",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
  1208. {"trunc",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
  1209. {"round",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1210. {"round",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
  1211. {"round",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
  1212. {"round",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
  1213. {"ceil",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1214. {"ceil",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
  1215. {"ceil",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
  1216. {"ceil",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
  1217. {"fract",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1218. {"fract",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
  1219. {"fract",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
  1220. {"fract",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
  1221. {"mod",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1222. {"mod",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1223. {"mod",TYPE_VEC2,{TYPE_VEC2,TYPE_FLOAT,TYPE_VOID}},
  1224. {"mod",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1225. {"mod",TYPE_VEC3,{TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1226. {"mod",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1227. {"mod",TYPE_VEC4,{TYPE_VEC4,TYPE_FLOAT,TYPE_VOID}},
  1228. {"modf",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1229. {"modf",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1230. {"modf",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1231. {"modf",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1232. {"min",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1233. {"min",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1234. {"min",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1235. {"min",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1236. {"min",TYPE_INT,{TYPE_INT,TYPE_INT,TYPE_VOID}},
  1237. {"min",TYPE_IVEC2,{TYPE_IVEC2,TYPE_IVEC2,TYPE_VOID}},
  1238. {"min",TYPE_IVEC3,{TYPE_IVEC3,TYPE_IVEC3,TYPE_VOID}},
  1239. {"min",TYPE_IVEC4,{TYPE_IVEC4,TYPE_IVEC4,TYPE_VOID}},
  1240. {"min",TYPE_UINT,{TYPE_UINT,TYPE_UINT,TYPE_VOID}},
  1241. {"min",TYPE_UVEC2,{TYPE_UVEC2,TYPE_UVEC2,TYPE_VOID}},
  1242. {"min",TYPE_UVEC3,{TYPE_UVEC3,TYPE_UVEC3,TYPE_VOID}},
  1243. {"min",TYPE_UVEC4,{TYPE_UVEC4,TYPE_UVEC4,TYPE_VOID}},
  1244. {"max",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1245. {"max",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1246. {"max",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1247. {"max",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1248. {"max",TYPE_INT,{TYPE_INT,TYPE_INT,TYPE_VOID}},
  1249. {"max",TYPE_IVEC2,{TYPE_IVEC2,TYPE_IVEC2,TYPE_VOID}},
  1250. {"max",TYPE_IVEC3,{TYPE_IVEC3,TYPE_IVEC3,TYPE_VOID}},
  1251. {"max",TYPE_IVEC4,{TYPE_IVEC4,TYPE_IVEC4,TYPE_VOID}},
  1252. {"max",TYPE_UINT,{TYPE_UINT,TYPE_UINT,TYPE_VOID}},
  1253. {"max",TYPE_UVEC2,{TYPE_UVEC2,TYPE_UVEC2,TYPE_VOID}},
  1254. {"max",TYPE_UVEC3,{TYPE_UVEC3,TYPE_UVEC3,TYPE_VOID}},
  1255. {"max",TYPE_UVEC4,{TYPE_UVEC4,TYPE_UVEC4,TYPE_VOID}},
  1256. {"clamp",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1257. {"clamp",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1258. {"clamp",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1259. {"clamp",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1260. {"clamp",TYPE_VEC2,{TYPE_VEC2,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1261. {"clamp",TYPE_VEC3,{TYPE_VEC3,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1262. {"clamp",TYPE_VEC4,{TYPE_VEC4,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1263. {"clamp",TYPE_INT,{TYPE_INT,TYPE_INT,TYPE_INT,TYPE_VOID}},
  1264. {"clamp",TYPE_IVEC2,{TYPE_IVEC2,TYPE_IVEC2,TYPE_IVEC2,TYPE_VOID}},
  1265. {"clamp",TYPE_IVEC3,{TYPE_IVEC3,TYPE_IVEC3,TYPE_IVEC3,TYPE_VOID}},
  1266. {"clamp",TYPE_IVEC4,{TYPE_IVEC4,TYPE_IVEC4,TYPE_IVEC4,TYPE_VOID}},
  1267. {"clamp",TYPE_IVEC2,{TYPE_IVEC2,TYPE_INT,TYPE_INT,TYPE_VOID}},
  1268. {"clamp",TYPE_IVEC3,{TYPE_IVEC3,TYPE_INT,TYPE_INT,TYPE_VOID}},
  1269. {"clamp",TYPE_IVEC4,{TYPE_IVEC4,TYPE_INT,TYPE_INT,TYPE_VOID}},
  1270. {"clamp",TYPE_UINT,{TYPE_UINT,TYPE_UINT,TYPE_UINT,TYPE_VOID}},
  1271. {"clamp",TYPE_UVEC2,{TYPE_UVEC2,TYPE_UVEC2,TYPE_UVEC2,TYPE_VOID}},
  1272. {"clamp",TYPE_UVEC3,{TYPE_UVEC3,TYPE_UVEC3,TYPE_UVEC3,TYPE_VOID}},
  1273. {"clamp",TYPE_UVEC4,{TYPE_UVEC4,TYPE_UVEC4,TYPE_UVEC4,TYPE_VOID}},
  1274. {"clamp",TYPE_UVEC2,{TYPE_UVEC2,TYPE_UINT,TYPE_UINT,TYPE_VOID}},
  1275. {"clamp",TYPE_UVEC3,{TYPE_UVEC3,TYPE_UINT,TYPE_UINT,TYPE_VOID}},
  1276. {"clamp",TYPE_UVEC4,{TYPE_UVEC4,TYPE_UINT,TYPE_UINT,TYPE_VOID}},
  1277. {"mix",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1278. {"mix",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_BOOL,TYPE_VOID}},
  1279. {"mix",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_FLOAT,TYPE_VOID}},
  1280. {"mix",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_BOOL,TYPE_VOID}},
  1281. {"mix",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_BVEC2,TYPE_VOID}},
  1282. {"mix",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1283. {"mix",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1284. {"mix",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_BOOL,TYPE_VOID}},
  1285. {"mix",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_BVEC3,TYPE_VOID}},
  1286. {"mix",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1287. {"mix",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_FLOAT,TYPE_VOID}},
  1288. {"mix",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_BOOL,TYPE_VOID}},
  1289. {"mix",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_BVEC3,TYPE_VOID}},
  1290. {"mix",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1291. {"step",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1292. {"step",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1293. {"step",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1294. {"step",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1295. {"step",TYPE_VEC2,{TYPE_FLOAT,TYPE_VEC2,TYPE_VOID}},
  1296. {"step",TYPE_VEC3,{TYPE_FLOAT,TYPE_VEC3,TYPE_VOID}},
  1297. {"step",TYPE_VEC4,{TYPE_FLOAT,TYPE_VEC4,TYPE_VOID}},
  1298. {"smoothstep",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
  1299. {"smoothstep",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1300. {"smoothstep",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1301. {"smoothstep",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1302. {"smoothstep",TYPE_VEC2,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VEC2,TYPE_VOID}},
  1303. {"smoothstep",TYPE_VEC3,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VEC3,TYPE_VOID}},
  1304. {"smoothstep",TYPE_VEC4,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VEC4,TYPE_VOID}},
  1305. {"isnan",TYPE_BOOL,{TYPE_FLOAT,TYPE_VOID}},
  1306. {"isnan",TYPE_BOOL,{TYPE_VEC2,TYPE_VOID}},
  1307. {"isnan",TYPE_BOOL,{TYPE_VEC3,TYPE_VOID}},
  1308. {"isnan",TYPE_BOOL,{TYPE_VEC4,TYPE_VOID}},
  1309. {"isinf",TYPE_BOOL,{TYPE_FLOAT,TYPE_VOID}},
  1310. {"isinf",TYPE_BOOL,{TYPE_VEC2,TYPE_VOID}},
  1311. {"isinf",TYPE_BOOL,{TYPE_VEC3,TYPE_VOID}},
  1312. {"isinf",TYPE_BOOL,{TYPE_VEC4,TYPE_VOID}},
  1313. {"floatBitsToInt",TYPE_INT,{TYPE_FLOAT,TYPE_VOID}},
  1314. {"floatBitsToInt",TYPE_IVEC2,{TYPE_VEC2,TYPE_VOID}},
  1315. {"floatBitsToInt",TYPE_IVEC3,{TYPE_VEC3,TYPE_VOID}},
  1316. {"floatBitsToInt",TYPE_IVEC4,{TYPE_VEC4,TYPE_VOID}},
  1317. {"floatBitsToUInt",TYPE_UINT,{TYPE_FLOAT,TYPE_VOID}},
  1318. {"floatBitsToUInt",TYPE_UVEC2,{TYPE_VEC2,TYPE_VOID}},
  1319. {"floatBitsToUInt",TYPE_UVEC3,{TYPE_VEC3,TYPE_VOID}},
  1320. {"floatBitsToUInt",TYPE_UVEC4,{TYPE_VEC4,TYPE_VOID}},
  1321. {"intBitsToFloat",TYPE_FLOAT,{TYPE_INT,TYPE_VOID}},
  1322. {"intBitsToFloat",TYPE_VEC2,{TYPE_IVEC2,TYPE_VOID}},
  1323. {"intBitsToFloat",TYPE_VEC3,{TYPE_IVEC3,TYPE_VOID}},
  1324. {"intBitsToFloat",TYPE_VEC4,{TYPE_IVEC4,TYPE_VOID}},
  1325. {"uintBitsToFloat",TYPE_FLOAT,{TYPE_UINT,TYPE_VOID}},
  1326. {"uintBitsToFloat",TYPE_VEC2,{TYPE_UVEC2,TYPE_VOID}},
  1327. {"uintBitsToFloat",TYPE_VEC3,{TYPE_UVEC3,TYPE_VOID}},
  1328. {"uintBitsToFloat",TYPE_VEC4,{TYPE_UVEC4,TYPE_VOID}},
  1329. //builtins - geometric
  1330. {"length",TYPE_FLOAT,{TYPE_VEC2,TYPE_VOID}},
  1331. {"length",TYPE_FLOAT,{TYPE_VEC3,TYPE_VOID}},
  1332. {"length",TYPE_FLOAT,{TYPE_VEC4,TYPE_VOID}},
  1333. {"distance",TYPE_FLOAT,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1334. {"distance",TYPE_FLOAT,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1335. {"distance",TYPE_FLOAT,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1336. {"dot",TYPE_FLOAT,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1337. {"dot",TYPE_FLOAT,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1338. {"dot",TYPE_FLOAT,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1339. {"cross",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1340. {"normalize",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
  1341. {"normalize",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
  1342. {"normalize",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
  1343. {"reflect",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1344. {"refract",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1345. {"facefordward",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1346. {"facefordward",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1347. {"facefordward",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1348. {"matrixCompMult",TYPE_MAT2,{TYPE_MAT2,TYPE_MAT2,TYPE_VOID}},
  1349. {"matrixCompMult",TYPE_MAT3,{TYPE_MAT3,TYPE_MAT3,TYPE_VOID}},
  1350. {"matrixCompMult",TYPE_MAT4,{TYPE_MAT4,TYPE_MAT4,TYPE_VOID}},
  1351. {"outerProduct",TYPE_MAT2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1352. {"outerProduct",TYPE_MAT3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1353. {"outerProduct",TYPE_MAT4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1354. {"transpose",TYPE_MAT2,{TYPE_MAT2,TYPE_VOID}},
  1355. {"transpose",TYPE_MAT3,{TYPE_MAT3,TYPE_VOID}},
  1356. {"transpose",TYPE_MAT4,{TYPE_MAT4,TYPE_VOID}},
  1357. {"determinant",TYPE_FLOAT,{TYPE_MAT2,TYPE_VOID}},
  1358. {"determinant",TYPE_FLOAT,{TYPE_MAT3,TYPE_VOID}},
  1359. {"determinant",TYPE_FLOAT,{TYPE_MAT4,TYPE_VOID}},
  1360. {"inverse",TYPE_MAT2,{TYPE_MAT2,TYPE_VOID}},
  1361. {"inverse",TYPE_MAT3,{TYPE_MAT3,TYPE_VOID}},
  1362. {"inverse",TYPE_MAT4,{TYPE_MAT4,TYPE_VOID}},
  1363. {"lessThan",TYPE_BVEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1364. {"lessThan",TYPE_BVEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1365. {"lessThan",TYPE_BVEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1366. {"lessThan",TYPE_BVEC2,{TYPE_IVEC2,TYPE_IVEC2,TYPE_VOID}},
  1367. {"lessThan",TYPE_BVEC3,{TYPE_IVEC3,TYPE_IVEC3,TYPE_VOID}},
  1368. {"lessThan",TYPE_BVEC4,{TYPE_IVEC4,TYPE_IVEC4,TYPE_VOID}},
  1369. {"lessThan",TYPE_BVEC2,{TYPE_UVEC2,TYPE_UVEC2,TYPE_VOID}},
  1370. {"lessThan",TYPE_BVEC3,{TYPE_UVEC3,TYPE_UVEC3,TYPE_VOID}},
  1371. {"lessThan",TYPE_BVEC4,{TYPE_UVEC4,TYPE_UVEC4,TYPE_VOID}},
  1372. {"greaterThan",TYPE_BVEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1373. {"greaterThan",TYPE_BVEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1374. {"greaterThan",TYPE_BVEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1375. {"greaterThan",TYPE_BVEC2,{TYPE_IVEC2,TYPE_IVEC2,TYPE_VOID}},
  1376. {"greaterThan",TYPE_BVEC3,{TYPE_IVEC3,TYPE_IVEC3,TYPE_VOID}},
  1377. {"greaterThan",TYPE_BVEC4,{TYPE_IVEC4,TYPE_IVEC4,TYPE_VOID}},
  1378. {"greaterThan",TYPE_BVEC2,{TYPE_UVEC2,TYPE_UVEC2,TYPE_VOID}},
  1379. {"greaterThan",TYPE_BVEC3,{TYPE_UVEC3,TYPE_UVEC3,TYPE_VOID}},
  1380. {"greaterThan",TYPE_BVEC4,{TYPE_UVEC4,TYPE_UVEC4,TYPE_VOID}},
  1381. {"lessThanEqual",TYPE_BVEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1382. {"lessThanEqual",TYPE_BVEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1383. {"lessThanEqual",TYPE_BVEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1384. {"lessThanEqual",TYPE_BVEC2,{TYPE_IVEC2,TYPE_IVEC2,TYPE_VOID}},
  1385. {"lessThanEqual",TYPE_BVEC3,{TYPE_IVEC3,TYPE_IVEC3,TYPE_VOID}},
  1386. {"lessThanEqual",TYPE_BVEC4,{TYPE_IVEC4,TYPE_IVEC4,TYPE_VOID}},
  1387. {"lessThanEqual",TYPE_BVEC2,{TYPE_UVEC2,TYPE_UVEC2,TYPE_VOID}},
  1388. {"lessThanEqual",TYPE_BVEC3,{TYPE_UVEC3,TYPE_UVEC3,TYPE_VOID}},
  1389. {"lessThanEqual",TYPE_BVEC4,{TYPE_UVEC4,TYPE_UVEC4,TYPE_VOID}},
  1390. {"greaterThanEqual",TYPE_BVEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1391. {"greaterThanEqual",TYPE_BVEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1392. {"greaterThanEqual",TYPE_BVEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1393. {"greaterThanEqual",TYPE_BVEC2,{TYPE_IVEC2,TYPE_IVEC2,TYPE_VOID}},
  1394. {"greaterThanEqual",TYPE_BVEC3,{TYPE_IVEC3,TYPE_IVEC3,TYPE_VOID}},
  1395. {"greaterThanEqual",TYPE_BVEC4,{TYPE_IVEC4,TYPE_IVEC4,TYPE_VOID}},
  1396. {"greaterThanEqual",TYPE_BVEC2,{TYPE_UVEC2,TYPE_UVEC2,TYPE_VOID}},
  1397. {"greaterThanEqual",TYPE_BVEC3,{TYPE_UVEC3,TYPE_UVEC3,TYPE_VOID}},
  1398. {"greaterThanEqual",TYPE_BVEC4,{TYPE_UVEC4,TYPE_UVEC4,TYPE_VOID}},
  1399. {"equal",TYPE_BVEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1400. {"equal",TYPE_BVEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1401. {"equal",TYPE_BVEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1402. {"equal",TYPE_BVEC2,{TYPE_IVEC2,TYPE_IVEC2,TYPE_VOID}},
  1403. {"equal",TYPE_BVEC3,{TYPE_IVEC3,TYPE_IVEC3,TYPE_VOID}},
  1404. {"equal",TYPE_BVEC4,{TYPE_IVEC4,TYPE_IVEC4,TYPE_VOID}},
  1405. {"equal",TYPE_BVEC2,{TYPE_UVEC2,TYPE_UVEC2,TYPE_VOID}},
  1406. {"equal",TYPE_BVEC3,{TYPE_UVEC3,TYPE_UVEC3,TYPE_VOID}},
  1407. {"equal",TYPE_BVEC4,{TYPE_UVEC4,TYPE_UVEC4,TYPE_VOID}},
  1408. {"equal",TYPE_BVEC2,{TYPE_BVEC2,TYPE_BVEC2,TYPE_VOID}},
  1409. {"equal",TYPE_BVEC3,{TYPE_BVEC3,TYPE_BVEC3,TYPE_VOID}},
  1410. {"equal",TYPE_BVEC4,{TYPE_BVEC4,TYPE_BVEC4,TYPE_VOID}},
  1411. {"notEqual",TYPE_BVEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1412. {"notEqual",TYPE_BVEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1413. {"notEqual",TYPE_BVEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
  1414. {"notEqual",TYPE_BVEC2,{TYPE_IVEC2,TYPE_IVEC2,TYPE_VOID}},
  1415. {"notEqual",TYPE_BVEC3,{TYPE_IVEC3,TYPE_IVEC3,TYPE_VOID}},
  1416. {"notEqual",TYPE_BVEC4,{TYPE_IVEC4,TYPE_IVEC4,TYPE_VOID}},
  1417. {"notEqual",TYPE_BVEC2,{TYPE_UVEC2,TYPE_UVEC2,TYPE_VOID}},
  1418. {"notEqual",TYPE_BVEC3,{TYPE_UVEC3,TYPE_UVEC3,TYPE_VOID}},
  1419. {"notEqual",TYPE_BVEC4,{TYPE_UVEC4,TYPE_UVEC4,TYPE_VOID}},
  1420. {"notEqual",TYPE_BVEC2,{TYPE_BVEC2,TYPE_BVEC2,TYPE_VOID}},
  1421. {"notEqual",TYPE_BVEC3,{TYPE_BVEC3,TYPE_BVEC3,TYPE_VOID}},
  1422. {"notEqual",TYPE_BVEC4,{TYPE_BVEC4,TYPE_BVEC4,TYPE_VOID}},
  1423. {"any",TYPE_BOOL,{TYPE_BVEC2,TYPE_VOID}},
  1424. {"any",TYPE_BOOL,{TYPE_BVEC3,TYPE_VOID}},
  1425. {"any",TYPE_BOOL,{TYPE_BVEC4,TYPE_VOID}},
  1426. {"all",TYPE_BOOL,{TYPE_BVEC2,TYPE_VOID}},
  1427. {"all",TYPE_BOOL,{TYPE_BVEC3,TYPE_VOID}},
  1428. {"all",TYPE_BOOL,{TYPE_BVEC4,TYPE_VOID}},
  1429. {"not",TYPE_BOOL,{TYPE_BVEC2,TYPE_VOID}},
  1430. {"not",TYPE_BOOL,{TYPE_BVEC3,TYPE_VOID}},
  1431. {"not",TYPE_BOOL,{TYPE_BVEC4,TYPE_VOID}},
  1432. //builtins - texture
  1433. {"textureSize",TYPE_VEC2,{TYPE_SAMPLER2D,TYPE_INT,TYPE_VOID}},
  1434. {"textureSize",TYPE_VEC2,{TYPE_ISAMPLER2D,TYPE_INT,TYPE_VOID}},
  1435. {"textureSize",TYPE_VEC2,{TYPE_USAMPLER2D,TYPE_INT,TYPE_VOID}},
  1436. {"textureSize",TYPE_VEC2,{TYPE_SAMPLERCUBE,TYPE_INT,TYPE_VOID}},
  1437. {"texture",TYPE_VEC4,{TYPE_SAMPLER2D,TYPE_VEC2,TYPE_VOID}},
  1438. {"texture",TYPE_VEC4,{TYPE_SAMPLER2D,TYPE_VEC3,TYPE_VOID}},
  1439. {"texture",TYPE_VEC4,{TYPE_SAMPLER2D,TYPE_VEC2,TYPE_FLOAT,TYPE_VOID}},
  1440. {"texture",TYPE_VEC4,{TYPE_SAMPLER2D,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1441. {"texture",TYPE_UVEC4,{TYPE_USAMPLER2D,TYPE_VEC2,TYPE_VOID}},
  1442. {"texture",TYPE_UVEC4,{TYPE_USAMPLER2D,TYPE_VEC3,TYPE_VOID}},
  1443. {"texture",TYPE_UVEC4,{TYPE_USAMPLER2D,TYPE_VEC2,TYPE_FLOAT,TYPE_VOID}},
  1444. {"texture",TYPE_UVEC4,{TYPE_USAMPLER2D,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1445. {"texture",TYPE_IVEC4,{TYPE_ISAMPLER2D,TYPE_VEC2,TYPE_VOID}},
  1446. {"texture",TYPE_IVEC4,{TYPE_ISAMPLER2D,TYPE_VEC3,TYPE_VOID}},
  1447. {"texture",TYPE_IVEC4,{TYPE_ISAMPLER2D,TYPE_VEC2,TYPE_FLOAT,TYPE_VOID}},
  1448. {"texture",TYPE_IVEC4,{TYPE_ISAMPLER2D,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1449. {"texture",TYPE_VEC4,{TYPE_SAMPLERCUBE,TYPE_VEC3,TYPE_VOID}},
  1450. {"texture",TYPE_VEC4,{TYPE_SAMPLERCUBE,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1451. {"textureProj",TYPE_VEC4,{TYPE_SAMPLER2D,TYPE_VEC3,TYPE_VOID}},
  1452. {"textureProj",TYPE_VEC4,{TYPE_SAMPLER2D,TYPE_VEC4,TYPE_VOID}},
  1453. {"textureProj",TYPE_VEC4,{TYPE_SAMPLER2D,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1454. {"textureProj",TYPE_VEC4,{TYPE_SAMPLER2D,TYPE_VEC4,TYPE_FLOAT,TYPE_VOID}},
  1455. {"textureProj",TYPE_IVEC4,{TYPE_ISAMPLER2D,TYPE_VEC3,TYPE_VOID}},
  1456. {"textureProj",TYPE_IVEC4,{TYPE_ISAMPLER2D,TYPE_VEC4,TYPE_VOID}},
  1457. {"textureProj",TYPE_IVEC4,{TYPE_ISAMPLER2D,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1458. {"textureProj",TYPE_IVEC4,{TYPE_ISAMPLER2D,TYPE_VEC4,TYPE_FLOAT,TYPE_VOID}},
  1459. {"textureProj",TYPE_UVEC4,{TYPE_USAMPLER2D,TYPE_VEC3,TYPE_VOID}},
  1460. {"textureProj",TYPE_UVEC4,{TYPE_USAMPLER2D,TYPE_VEC4,TYPE_VOID}},
  1461. {"textureProj",TYPE_UVEC4,{TYPE_USAMPLER2D,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1462. {"textureProj",TYPE_UVEC4,{TYPE_USAMPLER2D,TYPE_VEC4,TYPE_FLOAT,TYPE_VOID}},
  1463. {"textureLod",TYPE_VEC4,{TYPE_SAMPLER2D,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1464. {"textureLod",TYPE_IVEC4,{TYPE_ISAMPLER2D,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1465. {"textureLod",TYPE_UVEC4,{TYPE_USAMPLER2D,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1466. {"textureLod",TYPE_VEC4,{TYPE_SAMPLERCUBE,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1467. {"texelFetch",TYPE_VEC4,{TYPE_SAMPLER2D,TYPE_IVEC2,TYPE_INT,TYPE_VOID}},
  1468. {"texelFetch",TYPE_IVEC4,{TYPE_ISAMPLER2D,TYPE_IVEC2,TYPE_INT,TYPE_VOID}},
  1469. {"texelFetch",TYPE_UVEC4,{TYPE_USAMPLER2D,TYPE_IVEC2,TYPE_INT,TYPE_VOID}},
  1470. {"textureProjLod",TYPE_VEC4,{TYPE_SAMPLER2D,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1471. {"textureProjLod",TYPE_VEC4,{TYPE_SAMPLER2D,TYPE_VEC4,TYPE_FLOAT,TYPE_VOID}},
  1472. {"textureProjLod",TYPE_IVEC4,{TYPE_ISAMPLER2D,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1473. {"textureProjLod",TYPE_IVEC4,{TYPE_ISAMPLER2D,TYPE_VEC4,TYPE_FLOAT,TYPE_VOID}},
  1474. {"textureProjLod",TYPE_UVEC4,{TYPE_USAMPLER2D,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
  1475. {"textureProjLod",TYPE_UVEC4,{TYPE_USAMPLER2D,TYPE_VEC4,TYPE_FLOAT,TYPE_VOID}},
  1476. {"textureGrad",TYPE_VEC4,{TYPE_SAMPLER2D,TYPE_VEC2,TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1477. {"textureGrad",TYPE_IVEC4,{TYPE_ISAMPLER2D,TYPE_VEC2,TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1478. {"textureGrad",TYPE_UVEC4,{TYPE_USAMPLER2D,TYPE_VEC2,TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
  1479. {"textureGrad",TYPE_VEC4,{TYPE_SAMPLERCUBE,TYPE_VEC3,TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
  1480. {"textureScreen",TYPE_VEC4,{TYPE_VEC2,TYPE_VOID}},
  1481. {"dFdx",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1482. {"dFdx",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
  1483. {"dFdx",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
  1484. {"dFdx",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
  1485. {"dFdy",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1486. {"dFdy",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
  1487. {"dFdy",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
  1488. {"dFdy",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
  1489. {"fwidth",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
  1490. {"fwidth",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
  1491. {"fwidth",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
  1492. {"fwidth",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
  1493. {NULL,TYPE_VOID,{TYPE_VOID}}
  1494. };
  1495. bool ShaderLanguage::_validate_function_call(BlockNode* p_block, OperatorNode *p_func,DataType *r_ret_type) {
  1496. ERR_FAIL_COND_V(p_func->op!=OP_CALL && p_func->op!=OP_CONSTRUCT,NULL);
  1497. Vector<DataType> args;
  1498. ERR_FAIL_COND_V( p_func->arguments[0]->type!=Node::TYPE_VARIABLE, NULL );
  1499. StringName name = static_cast<VariableNode*>(p_func->arguments[0])->name.operator String();
  1500. bool all_const=true;
  1501. for(int i=1;i<p_func->arguments.size();i++) {
  1502. if (p_func->arguments[i]->type!=Node::TYPE_CONSTANT)
  1503. all_const=false;
  1504. args.push_back(p_func->arguments[i]->get_datatype());
  1505. }
  1506. int argcount=args.size();
  1507. bool failed_builtin=false;
  1508. if (argcount<=4) {
  1509. // test builtins
  1510. int idx=0;
  1511. while (builtin_func_defs[idx].name) {
  1512. if (name==builtin_func_defs[idx].name) {
  1513. failed_builtin=true;
  1514. bool fail=false;
  1515. for(int i=0;i<argcount;i++) {
  1516. if (get_scalar_type(args[i])==args[i] && p_func->arguments[i+1]->type==Node::TYPE_CONSTANT && convert_constant(static_cast<ConstantNode*>(p_func->arguments[i+1]),builtin_func_defs[idx].args[i])) {
  1517. //all good
  1518. } else if (args[i]!=builtin_func_defs[idx].args[i]) {
  1519. fail=true;
  1520. break;
  1521. }
  1522. }
  1523. if (!fail && argcount<4 && builtin_func_defs[idx].args[argcount]!=TYPE_VOID)
  1524. fail=true; //make sure the number of arguments matches
  1525. if (!fail) {
  1526. if (r_ret_type)
  1527. *r_ret_type=builtin_func_defs[idx].rettype;
  1528. return true;
  1529. }
  1530. }
  1531. idx++;
  1532. }
  1533. }
  1534. if (failed_builtin) {
  1535. String err ="Invalid arguments for built-in function: "+String(name)+"(";
  1536. for(int i=0;i<argcount;i++) {
  1537. if (i>0)
  1538. err+=",";
  1539. if (p_func->arguments[i+1]->type==Node::TYPE_CONSTANT && p_func->arguments[i+1]->get_datatype()==TYPE_INT && static_cast<ConstantNode*>(p_func->arguments[i+1])->values[0].sint<0) {
  1540. err+="-";
  1541. }
  1542. err+=get_datatype_name(args[i]);
  1543. }
  1544. err+=")";
  1545. _set_error(err);
  1546. return false;
  1547. }
  1548. #if 0
  1549. if (found_builtin) {
  1550. if (p_func->op==OP_CONSTRUCT && all_const) {
  1551. Vector<float> cdata;
  1552. for(int i=0;i<argcount;i++) {
  1553. Variant v = static_cast<ConstantNode*>(p_func->arguments[i+1])->value;
  1554. switch(v.get_type()) {
  1555. case Variant::REAL: cdata.push_back(v); break;
  1556. case Variant::INT: cdata.push_back(v); break;
  1557. case Variant::VECTOR2: { Vector2 v2=v; cdata.push_back(v2.x); cdata.push_back(v2.y); } break;
  1558. case Variant::VECTOR3: { Vector3 v3=v; cdata.push_back(v3.x); cdata.push_back(v3.y); cdata.push_back(v3.z);} break;
  1559. case Variant::PLANE: { Plane v4=v; cdata.push_back(v4.normal.x); cdata.push_back(v4.normal.y); cdata.push_back(v4.normal.z); cdata.push_back(v4.d); } break;
  1560. default: ERR_FAIL_V(NULL);
  1561. }
  1562. }
  1563. ConstantNode *cn = parser.create_node<ConstantNode>(p_func->parent);
  1564. Variant data;
  1565. switch(p_func->return_cache) {
  1566. case TYPE_FLOAT: data = cdata[0]; break;
  1567. case TYPE_VEC2:
  1568. if (cdata.size()==1)
  1569. data = Vector2(cdata[0],cdata[0]);
  1570. else
  1571. data = Vector2(cdata[0],cdata[1]);
  1572. break;
  1573. case TYPE_VEC3:
  1574. if (cdata.size()==1)
  1575. data = Vector3(cdata[0],cdata[0],cdata[0]);
  1576. else
  1577. data = Vector3(cdata[0],cdata[1],cdata[2]);
  1578. break;
  1579. case TYPE_VEC4:
  1580. if (cdata.size()==1)
  1581. data = Plane(cdata[0],cdata[0],cdata[0],cdata[0]);
  1582. else
  1583. data = Plane(cdata[0],cdata[1],cdata[2],cdata[3]);
  1584. break;
  1585. }
  1586. cn->datatype=p_func->return_cache;
  1587. cn->value=data;
  1588. return cn;
  1589. }
  1590. return p_func;
  1591. }
  1592. #endif
  1593. // try existing functions..
  1594. StringName exclude_function;
  1595. BlockNode *block = p_block;
  1596. while(block) {
  1597. if (block->parent_function) {
  1598. exclude_function=block->parent_function->name;
  1599. }
  1600. block=block->parent_block;
  1601. }
  1602. if (name==exclude_function) {
  1603. _set_error("Recursion is not allowed");
  1604. return false;
  1605. }
  1606. for(int i=0;i<shader->functions.size();i++) {
  1607. if (name != shader->functions[i].name)
  1608. continue;
  1609. if (!shader->functions[i].callable) {
  1610. _set_error("Function '"+String(name)+" can't be called from source code.");
  1611. return false;
  1612. }
  1613. FunctionNode *pfunc = shader->functions[i].function;
  1614. if (pfunc->arguments.size()!=args.size())
  1615. continue;
  1616. bool fail=false;
  1617. for(int i=0;i<args.size();i++) {
  1618. if (get_scalar_type(args[i])==args[i] && p_func->arguments[i+1]->type==Node::TYPE_CONSTANT && convert_constant(static_cast<ConstantNode*>(p_func->arguments[i+1]),pfunc->arguments[i].type)) {
  1619. //all good
  1620. } else if (args[i]!=pfunc->arguments[i].type) {
  1621. fail=true;
  1622. break;
  1623. }
  1624. }
  1625. if (!fail) {
  1626. p_func->return_cache=pfunc->return_type;
  1627. return true;
  1628. }
  1629. }
  1630. return false;
  1631. }
  1632. bool ShaderLanguage::_parse_function_arguments(BlockNode* p_block,const Map<StringName,DataType> &p_builtin_types,OperatorNode* p_func,int *r_complete_arg) {
  1633. TkPos pos = _get_tkpos();
  1634. Token tk = _get_token();
  1635. if (tk.type==TK_PARENTHESIS_CLOSE) {
  1636. return true;
  1637. }
  1638. _set_tkpos(pos);
  1639. while(true) {
  1640. if (r_complete_arg) {
  1641. pos = _get_tkpos();
  1642. tk = _get_token();
  1643. if (tk.type==TK_CURSOR) {
  1644. *r_complete_arg=p_func->arguments.size()-1;
  1645. } else {
  1646. _set_tkpos(pos);
  1647. }
  1648. }
  1649. Node *arg= _parse_and_reduce_expression(p_block,p_builtin_types);
  1650. if (!arg) {
  1651. return false;
  1652. }
  1653. p_func->arguments.push_back(arg);
  1654. tk = _get_token();
  1655. if (tk.type==TK_PARENTHESIS_CLOSE) {
  1656. return true;
  1657. } else if (tk.type!=TK_COMMA) {
  1658. // something is broken
  1659. _set_error("Expected ',' or ')' after argument");
  1660. return false;
  1661. }
  1662. }
  1663. return true;
  1664. }
  1665. bool ShaderLanguage::is_token_operator(TokenType p_type) {
  1666. return (p_type==TK_OP_EQUAL ||
  1667. p_type==TK_OP_NOT_EQUAL ||
  1668. p_type==TK_OP_LESS ||
  1669. p_type==TK_OP_LESS_EQUAL ||
  1670. p_type==TK_OP_GREATER ||
  1671. p_type==TK_OP_GREATER_EQUAL ||
  1672. p_type==TK_OP_AND ||
  1673. p_type==TK_OP_OR ||
  1674. p_type==TK_OP_NOT ||
  1675. p_type==TK_OP_ADD ||
  1676. p_type==TK_OP_SUB ||
  1677. p_type==TK_OP_MUL ||
  1678. p_type==TK_OP_DIV ||
  1679. p_type==TK_OP_MOD ||
  1680. p_type==TK_OP_SHIFT_LEFT ||
  1681. p_type==TK_OP_SHIFT_RIGHT ||
  1682. p_type==TK_OP_ASSIGN ||
  1683. p_type==TK_OP_ASSIGN_ADD ||
  1684. p_type==TK_OP_ASSIGN_SUB ||
  1685. p_type==TK_OP_ASSIGN_MUL ||
  1686. p_type==TK_OP_ASSIGN_DIV ||
  1687. p_type==TK_OP_ASSIGN_MOD ||
  1688. p_type==TK_OP_ASSIGN_SHIFT_LEFT ||
  1689. p_type==TK_OP_ASSIGN_SHIFT_RIGHT ||
  1690. p_type==TK_OP_ASSIGN_BIT_AND ||
  1691. p_type==TK_OP_ASSIGN_BIT_OR ||
  1692. p_type==TK_OP_ASSIGN_BIT_XOR ||
  1693. p_type==TK_OP_BIT_AND ||
  1694. p_type==TK_OP_BIT_OR ||
  1695. p_type==TK_OP_BIT_XOR ||
  1696. p_type==TK_OP_BIT_INVERT ||
  1697. p_type==TK_OP_INCREMENT ||
  1698. p_type==TK_OP_DECREMENT ||
  1699. p_type==TK_QUESTION ||
  1700. p_type==TK_COLON );
  1701. }
  1702. bool ShaderLanguage::convert_constant(ConstantNode* p_constant, DataType p_to_type,ConstantNode::Value *p_value) {
  1703. if (p_constant->datatype==p_to_type) {
  1704. if (p_value) {
  1705. for(int i=0;i<p_constant->values.size();i++) {
  1706. p_value[i]=p_constant->values[i];
  1707. }
  1708. }
  1709. return true;
  1710. } else if (p_constant->datatype==TYPE_INT && p_to_type==TYPE_FLOAT) {
  1711. if (p_value) {
  1712. p_value->real=p_constant->values[0].sint;
  1713. }
  1714. return true;
  1715. } else if (p_constant->datatype==TYPE_UINT && p_to_type==TYPE_FLOAT) {
  1716. if (p_value) {
  1717. p_value->real=p_constant->values[0].uint;
  1718. }
  1719. return true;
  1720. } else if (p_constant->datatype==TYPE_INT && p_to_type==TYPE_UINT) {
  1721. if (p_constant->values[0].sint<0) {
  1722. return false;
  1723. }
  1724. if (p_value) {
  1725. p_value->uint=p_constant->values[0].sint;
  1726. }
  1727. return true;
  1728. } else if (p_constant->datatype==TYPE_UINT && p_to_type==TYPE_INT) {
  1729. if (p_constant->values[0].uint>0x7FFFFFFF) {
  1730. return false;
  1731. }
  1732. if (p_value) {
  1733. p_value->sint=p_constant->values[0].uint;
  1734. }
  1735. return true;
  1736. } else
  1737. return false;
  1738. }
  1739. bool ShaderLanguage::is_scalar_type(DataType p_type) {
  1740. return p_type==TYPE_BOOL || p_type==TYPE_INT || p_type==TYPE_UINT || p_type==TYPE_FLOAT;
  1741. }
  1742. bool ShaderLanguage::is_sampler_type(DataType p_type) {
  1743. return p_type==TYPE_SAMPLER2D || p_type==TYPE_ISAMPLER2D || p_type==TYPE_USAMPLER2D || p_type==TYPE_SAMPLERCUBE;
  1744. }
  1745. void ShaderLanguage::get_keyword_list(List<String> *r_keywords) {
  1746. Set<String> kws;
  1747. int idx=0;
  1748. while(keyword_list[idx].text) {
  1749. kws.insert(keyword_list[idx].text);
  1750. idx++;
  1751. }
  1752. idx=0;
  1753. while (builtin_func_defs[idx].name) {
  1754. kws.insert(builtin_func_defs[idx].name);
  1755. idx++;
  1756. }
  1757. for(Set<String>::Element *E=kws.front();E;E=E->next()) {
  1758. r_keywords->push_back(E->get());
  1759. }
  1760. }
  1761. void ShaderLanguage::get_builtin_funcs(List<String> *r_keywords) {
  1762. Set<String> kws;
  1763. int idx=0;
  1764. while (builtin_func_defs[idx].name) {
  1765. kws.insert(builtin_func_defs[idx].name);
  1766. idx++;
  1767. }
  1768. for(Set<String>::Element *E=kws.front();E;E=E->next()) {
  1769. r_keywords->push_back(E->get());
  1770. }
  1771. }
  1772. ShaderLanguage::DataType ShaderLanguage::get_scalar_type(DataType p_type) {
  1773. static const DataType scalar_types[]={
  1774. TYPE_VOID,
  1775. TYPE_BOOL,
  1776. TYPE_BOOL,
  1777. TYPE_BOOL,
  1778. TYPE_BOOL,
  1779. TYPE_INT,
  1780. TYPE_INT,
  1781. TYPE_INT,
  1782. TYPE_INT,
  1783. TYPE_UINT,
  1784. TYPE_UINT,
  1785. TYPE_UINT,
  1786. TYPE_UINT,
  1787. TYPE_FLOAT,
  1788. TYPE_FLOAT,
  1789. TYPE_FLOAT,
  1790. TYPE_FLOAT,
  1791. TYPE_FLOAT,
  1792. TYPE_FLOAT,
  1793. TYPE_FLOAT,
  1794. TYPE_FLOAT,
  1795. TYPE_INT,
  1796. TYPE_UINT,
  1797. TYPE_FLOAT,
  1798. };
  1799. return scalar_types[p_type];
  1800. }
  1801. bool ShaderLanguage::_get_completable_identifier(BlockNode *p_block,CompletionType p_type,StringName& identifier) {
  1802. identifier=StringName();
  1803. TkPos pos;
  1804. Token tk = _get_token();
  1805. if (tk.type==TK_IDENTIFIER) {
  1806. identifier=tk.text;
  1807. pos = _get_tkpos();
  1808. tk = _get_token();
  1809. }
  1810. if (tk.type==TK_CURSOR) {
  1811. completion_type=p_type;
  1812. completion_line=tk_line;
  1813. completion_block=p_block;
  1814. pos = _get_tkpos();
  1815. tk = _get_token();
  1816. if (tk.type==TK_IDENTIFIER) {
  1817. identifier=identifier.operator String() + tk.text.operator String();
  1818. } else {
  1819. _set_tkpos(pos);
  1820. }
  1821. return true;
  1822. } else if (identifier!=StringName()){
  1823. _set_tkpos(pos);
  1824. }
  1825. return false;
  1826. }
  1827. ShaderLanguage::Node* ShaderLanguage::_parse_expression(BlockNode* p_block,const Map<StringName,DataType> &p_builtin_types) {
  1828. Vector<Expression> expression;
  1829. //Vector<TokenType> operators;
  1830. while(true) {
  1831. Node *expr=NULL;
  1832. TkPos prepos = _get_tkpos();
  1833. Token tk = _get_token();
  1834. TkPos pos = _get_tkpos();
  1835. if (tk.type==TK_PARENTHESIS_OPEN) {
  1836. //handle subexpression
  1837. expr = _parse_and_reduce_expression(p_block,p_builtin_types);
  1838. if (!expr)
  1839. return NULL;
  1840. tk = _get_token();
  1841. if (tk.type!=TK_PARENTHESIS_CLOSE) {
  1842. _set_error("Expected ')' in expression");
  1843. return NULL;
  1844. }
  1845. } else if (tk.type==TK_REAL_CONSTANT) {
  1846. ConstantNode *constant = alloc_node<ConstantNode>();
  1847. ConstantNode::Value v;
  1848. v.real=tk.constant;
  1849. constant->values.push_back(v);
  1850. constant->datatype=TYPE_FLOAT;
  1851. expr=constant;
  1852. } else if (tk.type==TK_INT_CONSTANT) {
  1853. ConstantNode *constant = alloc_node<ConstantNode>();
  1854. ConstantNode::Value v;
  1855. v.sint=tk.constant;
  1856. constant->values.push_back(v);
  1857. constant->datatype=TYPE_INT;
  1858. expr=constant;
  1859. } else if (tk.type==TK_TRUE) {
  1860. //print_line("found true");
  1861. //handle true constant
  1862. ConstantNode *constant = alloc_node<ConstantNode>();
  1863. ConstantNode::Value v;
  1864. v.boolean=true;
  1865. constant->values.push_back(v);
  1866. constant->datatype=TYPE_BOOL;
  1867. expr=constant;
  1868. } else if (tk.type==TK_FALSE) {
  1869. //handle false constant
  1870. ConstantNode *constant = alloc_node<ConstantNode>();
  1871. ConstantNode::Value v;
  1872. v.boolean=false;
  1873. constant->values.push_back(v);
  1874. constant->datatype=TYPE_BOOL;
  1875. expr=constant;
  1876. } else if (tk.type==TK_TYPE_VOID) {
  1877. //make sure void is not used in expression
  1878. _set_error("Void value not allowed in Expression");
  1879. return NULL;
  1880. } else if (is_token_nonvoid_datatype(tk.type)) {
  1881. //basic type constructor
  1882. OperatorNode *func = alloc_node<OperatorNode>();
  1883. func->op=OP_CONSTRUCT;
  1884. if (is_token_precision(tk.type)) {
  1885. func->return_precision_cache=get_token_precision(tk.type);
  1886. tk=_get_token();
  1887. }
  1888. VariableNode *funcname = alloc_node<VariableNode>();
  1889. funcname->name=get_datatype_name(get_token_datatype(tk.type));
  1890. func->arguments.push_back(funcname);
  1891. tk=_get_token();
  1892. if (tk.type!=TK_PARENTHESIS_OPEN) {
  1893. _set_error("Expected '(' after type name");
  1894. return NULL;
  1895. }
  1896. int carg=-1;
  1897. bool ok = _parse_function_arguments(p_block,p_builtin_types,func,&carg);
  1898. if (carg>=0) {
  1899. completion_type=COMPLETION_CALL_ARGUMENTS;
  1900. completion_line=tk_line;
  1901. completion_block=p_block;
  1902. completion_function=funcname->name;
  1903. completion_argument=carg;
  1904. }
  1905. if (!ok)
  1906. return NULL;
  1907. if (!_validate_function_call(p_block,func,&func->return_cache)) {
  1908. _set_error("No matching constructor found for: '"+String(funcname->name)+"'");
  1909. return NULL;
  1910. }
  1911. //validate_Function_call()
  1912. expr=_reduce_expression(p_block,func);
  1913. } else if (tk.type==TK_IDENTIFIER) {
  1914. _set_tkpos(prepos);
  1915. StringName identifier;
  1916. _get_completable_identifier(p_block,COMPLETION_IDENTIFIER,identifier);
  1917. tk=_get_token();
  1918. if (tk.type==TK_PARENTHESIS_OPEN) {
  1919. //a function
  1920. StringName name = identifier;
  1921. OperatorNode *func = alloc_node<OperatorNode>();
  1922. func->op=OP_CALL;
  1923. VariableNode *funcname = alloc_node<VariableNode>();
  1924. funcname->name=name;
  1925. func->arguments.push_back(funcname);
  1926. int carg=-1;
  1927. bool ok =_parse_function_arguments(p_block,p_builtin_types,func,&carg);
  1928. for(int i=0;i<shader->functions.size();i++) {
  1929. if (shader->functions[i].name==name) {
  1930. shader->functions[i].uses_function.insert(name);
  1931. }
  1932. }
  1933. if (carg>=0) {
  1934. completion_type=COMPLETION_CALL_ARGUMENTS;
  1935. completion_line=tk_line;
  1936. completion_block=p_block;
  1937. completion_function=funcname->name;
  1938. completion_argument=carg;
  1939. }
  1940. if (!ok)
  1941. return NULL;
  1942. if (!_validate_function_call(p_block,func,&func->return_cache)) {
  1943. _set_error("No matching function found for: '"+String(funcname->name)+"'");
  1944. return NULL;
  1945. }
  1946. expr=func;
  1947. } else {
  1948. //an identifier
  1949. _set_tkpos(pos);
  1950. DataType data_type;
  1951. IdentifierType ident_type;
  1952. if (!_find_identifier(p_block,p_builtin_types,identifier,&data_type,&ident_type)) {
  1953. _set_error("Unknown identifier in expression: "+String(identifier));
  1954. return NULL;
  1955. }
  1956. if (ident_type==IDENTIFIER_FUNCTION) {
  1957. _set_error("Can't use function as identifier: "+String(identifier));
  1958. return NULL;
  1959. }
  1960. VariableNode *varname = alloc_node<VariableNode>();
  1961. varname->name=identifier;
  1962. varname->datatype_cache=data_type;
  1963. expr=varname;
  1964. }
  1965. } else if (tk.type==TK_OP_ADD) {
  1966. continue; //this one does nothing
  1967. } else if (tk.type==TK_OP_SUB || tk.type==TK_OP_NOT || tk.type==TK_OP_BIT_INVERT || tk.type==TK_OP_INCREMENT || tk.type==TK_OP_DECREMENT) {
  1968. Expression e;
  1969. e.is_op=true;
  1970. switch(tk.type) {
  1971. case TK_OP_SUB: e.op=OP_NEGATE; break;
  1972. case TK_OP_NOT: e.op=OP_NOT; break;
  1973. case TK_OP_BIT_INVERT: e.op=OP_BIT_INVERT; break;
  1974. case TK_OP_INCREMENT: e.op=OP_INCREMENT; break;
  1975. case TK_OP_DECREMENT: e.op=OP_DECREMENT; break;
  1976. default: ERR_FAIL_V(NULL);
  1977. }
  1978. expression.push_back(e);
  1979. continue;
  1980. } else {
  1981. _set_error("Expected expression, found: "+get_token_text(tk));
  1982. return NULL;
  1983. //nothing
  1984. }
  1985. ERR_FAIL_COND_V(!expr,NULL);
  1986. /* OK now see what's NEXT to the operator.. */
  1987. /* OK now see what's NEXT to the operator.. */
  1988. /* OK now see what's NEXT to the operator.. */
  1989. while(true) {
  1990. TkPos pos = _get_tkpos();
  1991. tk=_get_token();
  1992. if (tk.type==TK_PERIOD) {
  1993. StringName identifier;
  1994. if (_get_completable_identifier(p_block,COMPLETION_INDEX,identifier)) {
  1995. completion_base=expr->get_datatype();
  1996. }
  1997. if (identifier==StringName()) {
  1998. _set_error("Expected identifier as member");
  1999. return NULL;
  2000. }
  2001. DataType dt = expr->get_datatype();
  2002. String ident = identifier;
  2003. bool ok=true;
  2004. DataType member_type;
  2005. switch(dt) {
  2006. case TYPE_BVEC2:
  2007. case TYPE_IVEC2:
  2008. case TYPE_UVEC2:
  2009. case TYPE_VEC2: {
  2010. int l = ident.length();
  2011. if (l==1) {
  2012. member_type=DataType(dt-1);
  2013. } else if (l==2) {
  2014. member_type=dt;
  2015. } else {
  2016. ok=false;
  2017. break;
  2018. }
  2019. const CharType *c=ident.ptr();
  2020. for(int i=0;i<l;i++) {
  2021. switch(c[i]) {
  2022. case 'r':
  2023. case 'g':
  2024. case 'x':
  2025. case 'y':
  2026. break;
  2027. default:
  2028. ok=false;
  2029. break;
  2030. }
  2031. }
  2032. } break;
  2033. case TYPE_BVEC3:
  2034. case TYPE_IVEC3:
  2035. case TYPE_UVEC3:
  2036. case TYPE_VEC3: {
  2037. int l = ident.length();
  2038. if (l==1) {
  2039. member_type=DataType(dt-2);
  2040. } else if (l==2) {
  2041. member_type=DataType(dt-1);
  2042. } else if (l==3) {
  2043. member_type=dt;
  2044. } else {
  2045. ok=false;
  2046. break;
  2047. }
  2048. const CharType *c=ident.ptr();
  2049. for(int i=0;i<l;i++) {
  2050. switch(c[i]) {
  2051. case 'r':
  2052. case 'g':
  2053. case 'b':
  2054. case 'x':
  2055. case 'y':
  2056. case 'z':
  2057. break;
  2058. default:
  2059. ok=false;
  2060. break;
  2061. }
  2062. }
  2063. } break;
  2064. case TYPE_BVEC4:
  2065. case TYPE_IVEC4:
  2066. case TYPE_UVEC4:
  2067. case TYPE_VEC4: {
  2068. int l = ident.length();
  2069. if (l==1) {
  2070. member_type=DataType(dt-3);
  2071. } else if (l==2) {
  2072. member_type=DataType(dt-2);
  2073. } else if (l==3) {
  2074. member_type=DataType(dt-1);
  2075. } else if (l==4) {
  2076. member_type=dt;
  2077. } else {
  2078. ok=false;
  2079. break;
  2080. }
  2081. const CharType *c=ident.ptr();
  2082. for(int i=0;i<l;i++) {
  2083. switch(c[i]) {
  2084. case 'r':
  2085. case 'g':
  2086. case 'b':
  2087. case 'a':
  2088. case 'x':
  2089. case 'y':
  2090. case 'z':
  2091. case 'w':
  2092. break;
  2093. default:
  2094. ok=false;
  2095. break;
  2096. }
  2097. }
  2098. } break;
  2099. case TYPE_MAT2: ok=(ident=="x" || ident=="y"); member_type=TYPE_VEC2; break;
  2100. case TYPE_MAT3: ok=(ident=="x" || ident=="y" || ident=="z" ); member_type=TYPE_VEC3; break;
  2101. case TYPE_MAT4: ok=(ident=="x" || ident=="y" || ident=="z" || ident=="w"); member_type=TYPE_VEC4; break;
  2102. default: {}
  2103. }
  2104. if (!ok) {
  2105. _set_error("Invalid member for expression: ."+ident);
  2106. return NULL;
  2107. }
  2108. MemberNode *mn = alloc_node<MemberNode>();
  2109. mn->basetype=dt;
  2110. mn->datatype=member_type;
  2111. mn->name=ident;
  2112. mn->owner=expr;
  2113. expr=mn;
  2114. //todo
  2115. //member (period) has priority over any operator
  2116. //creates a subindexing expression in place
  2117. /*} else if (tk.type==TK_BRACKET_OPEN) {
  2118. //todo
  2119. //subindexing has priority over any operator
  2120. //creates a subindexing expression in place
  2121. */
  2122. } else if (tk.type==TK_OP_INCREMENT || tk.type==TK_OP_DECREMENT) {
  2123. OperatorNode *op = alloc_node<OperatorNode>();
  2124. op->op=tk.type==TK_OP_DECREMENT ? OP_POST_DECREMENT : OP_POST_INCREMENT;
  2125. op->arguments.push_back(expr);
  2126. if (!_validate_operator(op,&op->return_cache)) {
  2127. _set_error("Invalid base type for increment/decrement operator");
  2128. return NULL;
  2129. }
  2130. expr=op;
  2131. } else {
  2132. _set_tkpos(pos);
  2133. break;
  2134. }
  2135. }
  2136. Expression e;
  2137. e.is_op=false;
  2138. e.node=expr;
  2139. expression.push_back(e);
  2140. pos = _get_tkpos();
  2141. tk = _get_token();
  2142. if (is_token_operator(tk.type)) {
  2143. Expression o;
  2144. o.is_op=true;
  2145. switch(tk.type) {
  2146. case TK_OP_EQUAL: o.op = OP_EQUAL; break;
  2147. case TK_OP_NOT_EQUAL: o.op = OP_NOT_EQUAL; break;
  2148. case TK_OP_LESS: o.op = OP_LESS; break;
  2149. case TK_OP_LESS_EQUAL: o.op = OP_LESS_EQUAL; break;
  2150. case TK_OP_GREATER: o.op = OP_GREATER; break;
  2151. case TK_OP_GREATER_EQUAL: o.op = OP_GREATER_EQUAL; break;
  2152. case TK_OP_AND: o.op = OP_AND; break;
  2153. case TK_OP_OR: o.op = OP_OR; break;
  2154. case TK_OP_ADD: o.op = OP_ADD; break;
  2155. case TK_OP_SUB: o.op = OP_SUB; break;
  2156. case TK_OP_MUL: o.op = OP_MUL; break;
  2157. case TK_OP_DIV: o.op = OP_DIV; break;
  2158. case TK_OP_MOD: o.op = OP_MOD; break;
  2159. case TK_OP_SHIFT_LEFT: o.op = OP_SHIFT_LEFT; break;
  2160. case TK_OP_SHIFT_RIGHT: o.op = OP_SHIFT_RIGHT; break;
  2161. case TK_OP_ASSIGN: o.op = OP_ASSIGN; break;
  2162. case TK_OP_ASSIGN_ADD: o.op = OP_ASSIGN_ADD; break;
  2163. case TK_OP_ASSIGN_SUB: o.op = OP_ASSIGN_SUB; break;
  2164. case TK_OP_ASSIGN_MUL: o.op = OP_ASSIGN_MUL; break;
  2165. case TK_OP_ASSIGN_DIV: o.op = OP_ASSIGN_DIV; break;
  2166. case TK_OP_ASSIGN_MOD: o.op = OP_ASSIGN_MOD; break;
  2167. case TK_OP_ASSIGN_SHIFT_LEFT: o.op = OP_ASSIGN_SHIFT_LEFT; break;
  2168. case TK_OP_ASSIGN_SHIFT_RIGHT: o.op = OP_ASSIGN_SHIFT_RIGHT; break;
  2169. case TK_OP_ASSIGN_BIT_AND: o.op = OP_ASSIGN_BIT_AND; break;
  2170. case TK_OP_ASSIGN_BIT_OR: o.op = OP_ASSIGN_BIT_OR; break;
  2171. case TK_OP_ASSIGN_BIT_XOR: o.op = OP_ASSIGN_BIT_XOR; break;
  2172. case TK_OP_BIT_AND: o.op = OP_BIT_AND; break;
  2173. case TK_OP_BIT_OR: o.op = OP_BIT_OR ; break;
  2174. case TK_OP_BIT_XOR: o.op = OP_BIT_XOR; break;
  2175. case TK_QUESTION: o.op = OP_SELECT_IF; break;
  2176. case TK_COLON: o.op = OP_SELECT_ELSE; break;
  2177. default: {
  2178. _set_error("Invalid token for operator: "+get_token_text(tk));
  2179. return NULL;
  2180. }
  2181. }
  2182. expression.push_back(o);
  2183. } else {
  2184. _set_tkpos(pos); //something else, so rollback and end
  2185. break;
  2186. }
  2187. }
  2188. /* Reduce the set set of expressions and place them in an operator tree, respecting precedence */
  2189. while(expression.size()>1) {
  2190. int next_op=-1;
  2191. int min_priority=0xFFFFF;
  2192. bool is_unary=false;
  2193. bool is_ternary=false;
  2194. for(int i=0;i<expression.size();i++) {
  2195. if (!expression[i].is_op) {
  2196. continue;
  2197. }
  2198. bool unary=false;
  2199. bool ternary=false;
  2200. int priority;
  2201. switch(expression[i].op) {
  2202. case OP_EQUAL: priority=8; break;
  2203. case OP_NOT_EQUAL: priority=8; break;
  2204. case OP_LESS: priority=7; break;
  2205. case OP_LESS_EQUAL: priority=7; break;
  2206. case OP_GREATER: priority=7; break;
  2207. case OP_GREATER_EQUAL: priority=7; break;
  2208. case OP_AND: priority=12; break;
  2209. case OP_OR: priority=14; break;
  2210. case OP_NOT: priority=3; unary=true; break;
  2211. case OP_NEGATE: priority=3; unary=true; break;
  2212. case OP_ADD: priority=5; break;
  2213. case OP_SUB: priority=5; break;
  2214. case OP_MUL: priority=4; break;
  2215. case OP_DIV: priority=4; break;
  2216. case OP_MOD: priority=4; break;
  2217. case OP_SHIFT_LEFT: priority=6; break;
  2218. case OP_SHIFT_RIGHT: priority=6; break;
  2219. case OP_ASSIGN: priority=16; break;
  2220. case OP_ASSIGN_ADD: priority=16; break;
  2221. case OP_ASSIGN_SUB: priority=16; break;
  2222. case OP_ASSIGN_MUL: priority=16; break;
  2223. case OP_ASSIGN_DIV: priority=16; break;
  2224. case OP_ASSIGN_MOD: priority=16; break;
  2225. case OP_ASSIGN_SHIFT_LEFT: priority=16; break;
  2226. case OP_ASSIGN_SHIFT_RIGHT: priority=16; break;
  2227. case OP_ASSIGN_BIT_AND: priority=16; break;
  2228. case OP_ASSIGN_BIT_OR: priority=16; break;
  2229. case OP_ASSIGN_BIT_XOR: priority=16; break;
  2230. case OP_BIT_AND: priority=9; break;
  2231. case OP_BIT_OR: priority=11; break;
  2232. case OP_BIT_XOR: priority=10; break;
  2233. case OP_BIT_INVERT: priority=3; unary=true; break;
  2234. case OP_INCREMENT: priority=3; unary=true; break;
  2235. case OP_DECREMENT: priority=3; unary=true; break;
  2236. case OP_SELECT_IF: priority=15; ternary=true; break;
  2237. case OP_SELECT_ELSE: priority=15; ternary=true; break;
  2238. default: ERR_FAIL_V(NULL); //unexpected operator
  2239. }
  2240. if (priority<min_priority) {
  2241. // < is used for left to right (default)
  2242. // <= is used for right to left
  2243. next_op=i;
  2244. min_priority=priority;
  2245. is_unary=unary;
  2246. is_ternary=ternary;
  2247. }
  2248. }
  2249. ERR_FAIL_COND_V(next_op==-1,NULL);
  2250. // OK! create operator..
  2251. // OK! create operator..
  2252. if (is_unary) {
  2253. int expr_pos=next_op;
  2254. while(expression[expr_pos].is_op) {
  2255. expr_pos++;
  2256. if (expr_pos==expression.size()) {
  2257. //can happen..
  2258. _set_error("Unexpected end of expression..");
  2259. return NULL;
  2260. }
  2261. }
  2262. //consecutively do unary opeators
  2263. for(int i=expr_pos-1;i>=next_op;i--) {
  2264. OperatorNode *op = alloc_node<OperatorNode>();
  2265. op->op=expression[i].op;
  2266. op->arguments.push_back(expression[i+1].node);
  2267. expression[i].is_op=false;
  2268. expression[i].node=op;
  2269. if (!_validate_operator(op,&op->return_cache)) {
  2270. String at;
  2271. for(int i=0;i<op->arguments.size();i++) {
  2272. if (i>0)
  2273. at+=" and ";
  2274. at+=get_datatype_name(op->arguments[i]->get_datatype());
  2275. }
  2276. _set_error("Invalid arguments to unary operator '"+get_operator_text(op->op)+"' :" +at);
  2277. return NULL;
  2278. }
  2279. expression.remove(i+1);
  2280. }
  2281. } else if (is_ternary) {
  2282. if (next_op <1 || next_op>=(expression.size()-1)) {
  2283. _set_error("Parser bug..");
  2284. ERR_FAIL_V(NULL);
  2285. }
  2286. if (next_op+2 >= expression.size() || !expression[next_op+2].is_op || expression[next_op+2].op!=OP_SELECT_ELSE) {
  2287. _set_error("Mising matching ':' for select operator");
  2288. return NULL;
  2289. }
  2290. OperatorNode *op = alloc_node<OperatorNode>();
  2291. op->op=expression[next_op].op;
  2292. op->arguments.push_back(expression[next_op-1].node);
  2293. op->arguments.push_back(expression[next_op+1].node);
  2294. op->arguments.push_back(expression[next_op+3].node);
  2295. expression[next_op-1].is_op=false;
  2296. expression[next_op-1].node=op;
  2297. if (!_validate_operator(op,&op->return_cache)) {
  2298. String at;
  2299. for(int i=0;i<op->arguments.size();i++) {
  2300. if (i>0)
  2301. at+=" and ";
  2302. at+=get_datatype_name(op->arguments[i]->get_datatype());
  2303. }
  2304. _set_error("Invalid argument to ternary ?: operator: "+at);
  2305. return NULL;
  2306. }
  2307. for(int i=0;i<4;i++) {
  2308. expression.remove(next_op);
  2309. }
  2310. } else {
  2311. if (next_op <1 || next_op>=(expression.size()-1)) {
  2312. _set_error("Parser bug..");
  2313. ERR_FAIL_V(NULL);
  2314. }
  2315. OperatorNode *op = alloc_node<OperatorNode>();
  2316. op->op=expression[next_op].op;
  2317. if (expression[next_op-1].is_op) {
  2318. _set_error("Parser bug..");
  2319. ERR_FAIL_V(NULL);
  2320. }
  2321. if (expression[next_op+1].is_op) {
  2322. // this is not invalid and can really appear
  2323. // but it becomes invalid anyway because no binary op
  2324. // can be followed by an unary op in a valid combination,
  2325. // due to how precedence works, unaries will always dissapear first
  2326. _set_error("Parser bug..");
  2327. }
  2328. op->arguments.push_back(expression[next_op-1].node); //expression goes as left
  2329. op->arguments.push_back(expression[next_op+1].node); //next expression goes as right
  2330. expression[next_op-1].node=op;
  2331. //replace all 3 nodes by this operator and make it an expression
  2332. if (!_validate_operator(op,&op->return_cache)) {
  2333. String at;
  2334. for(int i=0;i<op->arguments.size();i++) {
  2335. if (i>0)
  2336. at+=" and ";
  2337. at+=get_datatype_name(op->arguments[i]->get_datatype());
  2338. }
  2339. _set_error("Invalid arguments to operator '"+get_operator_text(op->op)+"' :" +at);
  2340. return NULL;
  2341. }
  2342. expression.remove(next_op);
  2343. expression.remove(next_op);
  2344. }
  2345. }
  2346. return expression[0].node;
  2347. }
  2348. ShaderLanguage::Node* ShaderLanguage::_reduce_expression(BlockNode *p_block, ShaderLanguage::Node *p_node) {
  2349. if (p_node->type!=Node::TYPE_OPERATOR)
  2350. return p_node;
  2351. //for now only reduce simple constructors
  2352. OperatorNode *op=static_cast<OperatorNode*>(p_node);
  2353. if (op->op==OP_CONSTRUCT) {
  2354. ERR_FAIL_COND_V(op->arguments[0]->type!=Node::TYPE_VARIABLE,p_node);
  2355. VariableNode *vn = static_cast<VariableNode*>(op->arguments[0]);
  2356. //StringName name=vn->name;
  2357. DataType base=get_scalar_type(op->get_datatype());
  2358. Vector<ConstantNode::Value> values;
  2359. for(int i=1;i<op->arguments.size();i++) {
  2360. op->arguments[i]=_reduce_expression(p_block,op->arguments[i]);
  2361. if (op->arguments[i]->type==Node::TYPE_CONSTANT) {
  2362. ConstantNode *cn = static_cast<ConstantNode*>(op->arguments[i]);
  2363. if (get_scalar_type(cn->datatype)==base) {
  2364. for(int j=0;j<cn->values.size();j++) {
  2365. values.push_back(cn->values[j]);
  2366. }
  2367. } else if (get_scalar_type(cn->datatype)==cn->datatype) {
  2368. ConstantNode::Value v;
  2369. if (!convert_constant(cn,base,&v)) {
  2370. return p_node;
  2371. }
  2372. values.push_back(v);
  2373. } else {
  2374. return p_node;
  2375. }
  2376. } else {
  2377. return p_node;
  2378. }
  2379. }
  2380. ConstantNode *cn=alloc_node<ConstantNode>();
  2381. cn->datatype=op->get_datatype();
  2382. cn->values=values;
  2383. return cn;
  2384. } else if (op->op==OP_NEGATE) {
  2385. op->arguments[0]=_reduce_expression(p_block,op->arguments[0]);
  2386. if (op->arguments[0]->type==Node::TYPE_CONSTANT) {
  2387. ConstantNode *cn = static_cast<ConstantNode*>(op->arguments[0]);
  2388. DataType base=get_scalar_type(cn->datatype);
  2389. Vector<ConstantNode::Value> values;
  2390. for(int i=0;i<cn->values.size();i++) {
  2391. ConstantNode::Value nv;
  2392. switch(base) {
  2393. case TYPE_BOOL: {
  2394. nv.boolean=!cn->values[i].boolean;
  2395. } break;
  2396. case TYPE_INT: {
  2397. nv.sint=-cn->values[i].sint;
  2398. } break;
  2399. case TYPE_UINT: {
  2400. nv.uint=-cn->values[i].uint;
  2401. } break;
  2402. case TYPE_FLOAT: {
  2403. nv.real=-cn->values[i].real;
  2404. } break;
  2405. default: {}
  2406. }
  2407. values.push_back(nv);
  2408. }
  2409. cn->values=values;
  2410. return cn;
  2411. }
  2412. }
  2413. return p_node;
  2414. }
  2415. ShaderLanguage::Node* ShaderLanguage::_parse_and_reduce_expression(BlockNode *p_block, const Map<StringName,DataType> &p_builtin_types) {
  2416. ShaderLanguage::Node* expr = _parse_expression(p_block,p_builtin_types);
  2417. if (!expr) //errored
  2418. return NULL;
  2419. expr = _reduce_expression(p_block,expr);
  2420. return expr;
  2421. }
  2422. Error ShaderLanguage::_parse_block(BlockNode* p_block,const Map<StringName,DataType> &p_builtin_types,bool p_just_one,bool p_can_break,bool p_can_continue) {
  2423. while(true) {
  2424. TkPos pos = _get_tkpos();
  2425. Token tk = _get_token();
  2426. if (tk.type==TK_CURLY_BRACKET_CLOSE) { //end of block
  2427. if (p_just_one) {
  2428. _set_error("Unexpected '}'");
  2429. return ERR_PARSE_ERROR;
  2430. }
  2431. return OK;
  2432. } else if (is_token_precision(tk.type) || is_token_nonvoid_datatype(tk.type)) {
  2433. DataPrecision precision=PRECISION_DEFAULT;
  2434. if (is_token_precision(tk.type)) {
  2435. precision=get_token_precision(tk.type);
  2436. tk = _get_token();
  2437. if (!is_token_nonvoid_datatype(tk.type)) {
  2438. _set_error("Expected datatype after precission");
  2439. return ERR_PARSE_ERROR;
  2440. }
  2441. }
  2442. DataType type = get_token_datatype(tk.type);
  2443. tk = _get_token();
  2444. while(true) {
  2445. if (tk.type!=TK_IDENTIFIER) {
  2446. _set_error("Expected identifier after type");
  2447. return ERR_PARSE_ERROR;
  2448. }
  2449. StringName name = tk.text;
  2450. if (_find_identifier(p_block,p_builtin_types,name)) {
  2451. _set_error("Redefinition of '"+String(name)+"'");
  2452. return ERR_PARSE_ERROR;
  2453. }
  2454. BlockNode::Variable var;
  2455. var.type=type;
  2456. var.precision=precision;
  2457. var.line=tk_line;
  2458. p_block->variables[name]=var;
  2459. tk = _get_token();
  2460. if (tk.type==TK_OP_ASSIGN) {
  2461. //variable creted with assignment! must parse an expression
  2462. Node* n = _parse_and_reduce_expression(p_block,p_builtin_types);
  2463. if (!n)
  2464. return ERR_PARSE_ERROR;
  2465. OperatorNode *assign = alloc_node<OperatorNode>();
  2466. VariableNode *vnode = alloc_node<VariableNode>();
  2467. vnode->name=name;
  2468. vnode->datatype_cache=type;
  2469. assign->arguments.push_back(vnode);
  2470. assign->arguments.push_back(n);
  2471. assign->op=OP_ASSIGN;
  2472. p_block->statements.push_back(assign);
  2473. tk = _get_token();
  2474. }
  2475. if (tk.type==TK_COMMA) {
  2476. tk = _get_token();
  2477. //another variable
  2478. } else if (tk.type==TK_SEMICOLON) {
  2479. break;
  2480. } else {
  2481. _set_error("Expected ',' or ';' after variable");
  2482. return ERR_PARSE_ERROR;
  2483. }
  2484. }
  2485. } else if (tk.type==TK_CURLY_BRACKET_OPEN) {
  2486. //a sub block, just because..
  2487. BlockNode* block = alloc_node<BlockNode>();
  2488. block->parent_block=p_block;
  2489. _parse_block(block,p_builtin_types,false,p_can_break,p_can_continue);
  2490. p_block->statements.push_back(block);
  2491. } else if (tk.type==TK_CF_IF) {
  2492. //if () {}
  2493. tk = _get_token();
  2494. if (tk.type!=TK_PARENTHESIS_OPEN) {
  2495. _set_error("Expected '(' after if");
  2496. return ERR_PARSE_ERROR;
  2497. }
  2498. ControlFlowNode *cf = alloc_node<ControlFlowNode>();
  2499. cf->flow_op=FLOW_OP_IF;
  2500. Node* n = _parse_and_reduce_expression(p_block,p_builtin_types);
  2501. if (!n)
  2502. return ERR_PARSE_ERROR;
  2503. tk = _get_token();
  2504. if (tk.type!=TK_PARENTHESIS_CLOSE) {
  2505. _set_error("Expected '(' after expression");
  2506. return ERR_PARSE_ERROR;
  2507. }
  2508. BlockNode* block = alloc_node<BlockNode>();
  2509. block->parent_block=p_block;
  2510. cf->expressions.push_back(n);
  2511. cf->blocks.push_back(block);
  2512. p_block->statements.push_back(cf);
  2513. Error err=_parse_block(block,p_builtin_types,true,p_can_break,p_can_continue);
  2514. pos=_get_tkpos();
  2515. tk = _get_token();
  2516. if (tk.type==TK_CF_ELSE) {
  2517. block = alloc_node<BlockNode>();
  2518. block->parent_block=p_block;
  2519. cf->blocks.push_back(block);
  2520. err=_parse_block(block,p_builtin_types,true,p_can_break,p_can_continue);
  2521. } else {
  2522. _set_tkpos(pos); //rollback
  2523. }
  2524. } else {
  2525. //nothng else, so expression
  2526. _set_tkpos(pos); //rollback
  2527. Node*expr = _parse_and_reduce_expression(p_block,p_builtin_types);
  2528. if (!expr)
  2529. return ERR_PARSE_ERROR;
  2530. p_block->statements.push_back(expr);
  2531. tk = _get_token();
  2532. if (tk.type!=TK_SEMICOLON) {
  2533. _set_error("Expected ';' after statement");
  2534. return ERR_PARSE_ERROR;
  2535. }
  2536. }
  2537. if (p_just_one)
  2538. break;
  2539. }
  2540. return OK;
  2541. }
  2542. Error ShaderLanguage::_parse_shader(const Map< StringName, Map<StringName,DataType> > &p_functions, const Set<String> &p_render_modes) {
  2543. Token tk = _get_token();
  2544. int texture_uniforms = 0;
  2545. int uniforms =0;
  2546. while(tk.type!=TK_EOF) {
  2547. switch(tk.type) {
  2548. case TK_RENDER_MODE: {
  2549. while(true) {
  2550. StringName mode;
  2551. _get_completable_identifier(NULL,COMPLETION_RENDER_MODE,mode);
  2552. if (mode==StringName()) {
  2553. _set_error("Expected identifier for render mode");
  2554. return ERR_PARSE_ERROR;
  2555. }
  2556. if (!p_render_modes.has(mode)) {
  2557. _set_error("Invalid render mode: '"+String(mode)+"'");
  2558. return ERR_PARSE_ERROR;
  2559. }
  2560. if (shader->render_modes.find(mode)!=-1) {
  2561. _set_error("Duplicate render mode: '"+String(mode)+"'");
  2562. return ERR_PARSE_ERROR;
  2563. }
  2564. shader->render_modes.push_back(mode);
  2565. tk = _get_token();
  2566. if (tk.type==TK_COMMA) {
  2567. //all good, do nothing
  2568. } else if (tk.type==TK_SEMICOLON) {
  2569. break; //done
  2570. } else {
  2571. _set_error("Unexpected token: "+get_token_text(tk));
  2572. return ERR_PARSE_ERROR;
  2573. }
  2574. }
  2575. } break;
  2576. case TK_UNIFORM:
  2577. case TK_VARYING: {
  2578. bool uniform = tk.type==TK_UNIFORM;
  2579. DataPrecision precision = PRECISION_DEFAULT;
  2580. DataType type;
  2581. StringName name;
  2582. tk = _get_token();
  2583. if (is_token_precision(tk.type)) {
  2584. precision=get_token_precision(tk.type);
  2585. tk = _get_token();
  2586. }
  2587. if (!is_token_datatype(tk.type)) {
  2588. _set_error("Expected datatype. ");
  2589. return ERR_PARSE_ERROR;
  2590. }
  2591. type = get_token_datatype(tk.type);
  2592. if (type==TYPE_VOID) {
  2593. _set_error("void datatype not allowed here");
  2594. return ERR_PARSE_ERROR;
  2595. }
  2596. if (!uniform && type<TYPE_FLOAT && type>TYPE_VEC4) { // FIXME: always false! should it be || instead?
  2597. _set_error("Invalid type for varying, only float,vec2,vec3,vec4 allowed.");
  2598. return ERR_PARSE_ERROR;
  2599. }
  2600. tk = _get_token();
  2601. if (tk.type!=TK_IDENTIFIER) {
  2602. _set_error("Expected identifier!");
  2603. return ERR_PARSE_ERROR;
  2604. }
  2605. name=tk.text;
  2606. if (_find_identifier(NULL,Map<StringName,DataType>(),name)) {
  2607. _set_error("Redefinition of '"+String(name)+"'");
  2608. return ERR_PARSE_ERROR;
  2609. }
  2610. if (uniform) {
  2611. ShaderNode::Uniform uniform;
  2612. if (is_sampler_type(type)) {
  2613. uniform.texture_order=texture_uniforms++;
  2614. uniform.order=-1;
  2615. } else {
  2616. uniform.texture_order=-1;
  2617. uniform.order=uniforms++;
  2618. }
  2619. uniform.type=type;
  2620. uniform.precission=precision;
  2621. //todo parse default value
  2622. tk = _get_token();
  2623. if (tk.type==TK_OP_ASSIGN) {
  2624. Node* expr = _parse_and_reduce_expression(NULL,Map<StringName,DataType>());
  2625. if (!expr)
  2626. return ERR_PARSE_ERROR;
  2627. if (expr->type!=Node::TYPE_CONSTANT) {
  2628. _set_error("Expected constant expression after '='");
  2629. return ERR_PARSE_ERROR;
  2630. }
  2631. ConstantNode* cn = static_cast<ConstantNode*>(expr);
  2632. uniform.default_value.resize(cn->values.size());
  2633. if (!convert_constant(cn,uniform.type,uniform.default_value.ptr())) {
  2634. _set_error("Can't convert constant to "+get_datatype_name(uniform.type));
  2635. return ERR_PARSE_ERROR;
  2636. }
  2637. tk = _get_token();
  2638. }
  2639. if (tk.type==TK_COLON) {
  2640. //hint
  2641. tk = _get_token();
  2642. if (tk.type==TK_HINT_WHITE_TEXTURE) {
  2643. uniform.hint=ShaderNode::Uniform::HINT_WHITE;
  2644. } else if (tk.type==TK_HINT_BLACK_TEXTURE) {
  2645. uniform.hint=ShaderNode::Uniform::HINT_BLACK;
  2646. } else if (tk.type==TK_HINT_NORMAL_TEXTURE) {
  2647. uniform.hint=ShaderNode::Uniform::HINT_NORMAL;
  2648. } else if (tk.type==TK_HINT_ANISO_TEXTURE) {
  2649. uniform.hint=ShaderNode::Uniform::HINT_ANISO;
  2650. } else if (tk.type==TK_HINT_ALBEDO_TEXTURE) {
  2651. uniform.hint=ShaderNode::Uniform::HINT_ALBEDO;
  2652. } else if (tk.type==TK_HINT_BLACK_ALBEDO_TEXTURE) {
  2653. uniform.hint=ShaderNode::Uniform::HINT_BLACK_ALBEDO;
  2654. } else if (tk.type==TK_HINT_COLOR) {
  2655. if (type!=TYPE_VEC4) {
  2656. _set_error("Color hint is for vec4 only");
  2657. return ERR_PARSE_ERROR;
  2658. }
  2659. uniform.hint=ShaderNode::Uniform::HINT_COLOR;
  2660. } else if (tk.type==TK_HINT_RANGE) {
  2661. uniform.hint=ShaderNode::Uniform::HINT_RANGE;
  2662. if (type!=TYPE_FLOAT && type!=TYPE_INT) {
  2663. _set_error("Range hint is for float and int only");
  2664. return ERR_PARSE_ERROR;
  2665. }
  2666. tk = _get_token();
  2667. if (tk.type!=TK_PARENTHESIS_OPEN) {
  2668. _set_error("Expected '(' after hint_range");
  2669. return ERR_PARSE_ERROR;
  2670. }
  2671. tk = _get_token();
  2672. float sign=1.0;
  2673. if (tk.type==TK_OP_SUB) {
  2674. sign=-1.0;
  2675. tk = _get_token();
  2676. }
  2677. if (tk.type!=TK_REAL_CONSTANT && tk.type!=TK_INT_CONSTANT) {
  2678. _set_error("Expected integer constant");
  2679. return ERR_PARSE_ERROR;
  2680. }
  2681. uniform.hint_range[0]=tk.constant;
  2682. uniform.hint_range[0]*=sign;
  2683. tk = _get_token();
  2684. if (tk.type!=TK_COMMA) {
  2685. _set_error("Expected ',' after integer constant");
  2686. return ERR_PARSE_ERROR;
  2687. }
  2688. tk = _get_token();
  2689. sign=1.0;
  2690. if (tk.type==TK_OP_SUB) {
  2691. sign=-1.0;
  2692. tk = _get_token();
  2693. }
  2694. if (tk.type!=TK_REAL_CONSTANT && tk.type!=TK_INT_CONSTANT) {
  2695. _set_error("Expected integer constant after ','");
  2696. return ERR_PARSE_ERROR;
  2697. }
  2698. uniform.hint_range[1]=tk.constant;
  2699. uniform.hint_range[1]*=sign;
  2700. tk = _get_token();
  2701. if (tk.type==TK_COMMA) {
  2702. tk = _get_token();
  2703. if (tk.type!=TK_REAL_CONSTANT && tk.type!=TK_INT_CONSTANT) {
  2704. _set_error("Expected integer constant after ','");
  2705. return ERR_PARSE_ERROR;
  2706. }
  2707. uniform.hint_range[2]=tk.constant;
  2708. tk = _get_token();
  2709. } else {
  2710. if (type==TYPE_INT) {
  2711. uniform.hint_range[2]=1;
  2712. } else {
  2713. uniform.hint_range[2]=0.001;
  2714. }
  2715. }
  2716. if (tk.type!=TK_PARENTHESIS_CLOSE) {
  2717. _set_error("Expected ','");
  2718. return ERR_PARSE_ERROR;
  2719. }
  2720. } else {
  2721. _set_error("Expected valid type hint after ':'.");
  2722. }
  2723. if (uniform.hint!=ShaderNode::Uniform::HINT_RANGE && uniform.hint!=ShaderNode::Uniform::HINT_NONE && uniform.hint!=ShaderNode::Uniform::HINT_COLOR && type <=TYPE_MAT4) {
  2724. _set_error("This hint is only for sampler types");
  2725. return ERR_PARSE_ERROR;
  2726. }
  2727. tk = _get_token();
  2728. }
  2729. shader->uniforms[name]=uniform;
  2730. if (tk.type!=TK_SEMICOLON) {
  2731. _set_error("Expected ';'");
  2732. return ERR_PARSE_ERROR;
  2733. }
  2734. } else {
  2735. ShaderNode::Varying varying;
  2736. varying.type=type;
  2737. varying.precission=precision;
  2738. shader->varyings[name]=varying;
  2739. tk = _get_token();
  2740. if (tk.type!=TK_SEMICOLON) {
  2741. _set_error("Expected ';'");
  2742. return ERR_PARSE_ERROR;
  2743. }
  2744. }
  2745. } break;
  2746. default: {
  2747. //function
  2748. DataPrecision precision = PRECISION_DEFAULT;
  2749. DataType type;
  2750. StringName name;
  2751. if (is_token_precision(tk.type)) {
  2752. precision=get_token_precision(tk.type);
  2753. tk = _get_token();
  2754. }
  2755. if (!is_token_datatype(tk.type)) {
  2756. _set_error("Expected funtion, uniform or varying ");
  2757. return ERR_PARSE_ERROR;
  2758. }
  2759. type = get_token_datatype(tk.type);
  2760. _get_completable_identifier(NULL,COMPLETION_MAIN_FUNCTION,name);
  2761. if (name==StringName()) {
  2762. _set_error("Expected function name after datatype");
  2763. return ERR_PARSE_ERROR;
  2764. }
  2765. if (_find_identifier(NULL,Map<StringName,DataType>(),name)) {
  2766. _set_error("Redefinition of '"+String(name)+"'");
  2767. return ERR_PARSE_ERROR;
  2768. }
  2769. tk = _get_token();
  2770. if (tk.type!=TK_PARENTHESIS_OPEN) {
  2771. _set_error("Expected '(' after identifier");
  2772. return ERR_PARSE_ERROR;
  2773. }
  2774. Map<StringName,DataType> builtin_types;
  2775. if (p_functions.has(name)) {
  2776. builtin_types=p_functions[name];
  2777. }
  2778. ShaderNode::Function function;
  2779. function.callable=!p_functions.has(name);
  2780. function.name=name;
  2781. FunctionNode* func_node=alloc_node<FunctionNode>();
  2782. function.function=func_node;
  2783. shader->functions.push_back(function);
  2784. func_node->name=name;
  2785. func_node->return_type=type;
  2786. func_node->return_precision=precision;
  2787. func_node->body = alloc_node<BlockNode>();
  2788. func_node->body->parent_function=func_node;
  2789. tk = _get_token();
  2790. while(true) {
  2791. if (tk.type==TK_PARENTHESIS_CLOSE) {
  2792. break;
  2793. }
  2794. DataType ptype;
  2795. StringName pname;
  2796. DataPrecision pprecision = PRECISION_DEFAULT;
  2797. if (is_token_precision(tk.type)) {
  2798. pprecision=get_token_precision(tk.type);
  2799. tk = _get_token();
  2800. }
  2801. if (!is_token_datatype(tk.type)) {
  2802. _set_error("Expected a valid datatype for argument");
  2803. return ERR_PARSE_ERROR;
  2804. }
  2805. ptype=get_token_datatype(tk.type);
  2806. if (ptype==TYPE_VOID) {
  2807. _set_error("void not allowed in argument");
  2808. return ERR_PARSE_ERROR;
  2809. }
  2810. tk = _get_token();
  2811. if (tk.type!=TK_IDENTIFIER) {
  2812. _set_error("Expected identifier for argument name");
  2813. return ERR_PARSE_ERROR;
  2814. }
  2815. pname = tk.text;
  2816. if (_find_identifier(func_node->body,builtin_types,pname)) {
  2817. _set_error("Redefinition of '"+String(pname)+"'");
  2818. return ERR_PARSE_ERROR;
  2819. }
  2820. FunctionNode::Argument arg;
  2821. arg.type=ptype;
  2822. arg.name=pname;
  2823. arg.precision=pprecision;
  2824. func_node->arguments.push_back(arg);
  2825. tk = _get_token();
  2826. if (tk.type==TK_COMMA) {
  2827. tk = _get_token();
  2828. //do none and go on
  2829. } else if (tk.type!=TK_PARENTHESIS_CLOSE) {
  2830. _set_error("Expected ',' or ')' after identifier");
  2831. return ERR_PARSE_ERROR;
  2832. }
  2833. }
  2834. if (p_functions.has(name)) {
  2835. //if one of the core functions, make sure they are of the correct form
  2836. if (func_node->arguments.size() > 0) {
  2837. _set_error("Function '"+String(name)+"' expects no arguments.");
  2838. return ERR_PARSE_ERROR;
  2839. }
  2840. if (func_node->return_type!=TYPE_VOID) {
  2841. _set_error("Function '"+String(name)+"' must be of void return type.");
  2842. return ERR_PARSE_ERROR;
  2843. }
  2844. }
  2845. //all good let's parse inside the fucntion!
  2846. tk = _get_token();
  2847. if (tk.type!=TK_CURLY_BRACKET_OPEN) {
  2848. _set_error("Expected '{' to begin function");
  2849. return ERR_PARSE_ERROR;
  2850. }
  2851. current_function = name;
  2852. Error err = _parse_block(func_node->body,builtin_types);
  2853. if (err)
  2854. return err;
  2855. current_function=StringName();
  2856. }
  2857. }
  2858. tk = _get_token();
  2859. }
  2860. return OK;
  2861. }
  2862. Error ShaderLanguage::compile(const String& p_code, const Map< StringName, Map<StringName,DataType> > &p_functions, const Set<String> &p_render_modes) {
  2863. clear();
  2864. code=p_code;
  2865. nodes=NULL;
  2866. shader = alloc_node<ShaderNode>();
  2867. Error err = _parse_shader(p_functions,p_render_modes);
  2868. if (err!=OK) {
  2869. return err;
  2870. }
  2871. return OK;
  2872. }
  2873. Error ShaderLanguage::complete(const String& p_code,const Map< StringName, Map<StringName,DataType> > &p_functions,const Set<String>& p_render_modes,List<String>* r_options,String& r_call_hint) {
  2874. clear();
  2875. code=p_code;
  2876. nodes=NULL;
  2877. shader = alloc_node<ShaderNode>();
  2878. Error err = _parse_shader(p_functions,p_render_modes);
  2879. switch(completion_type) {
  2880. case COMPLETION_NONE: {
  2881. //do none
  2882. return ERR_PARSE_ERROR;
  2883. } break;
  2884. case COMPLETION_RENDER_MODE: {
  2885. for(const Set<String>::Element *E=p_render_modes.front();E;E=E->next()) {
  2886. r_options->push_back(E->get());
  2887. }
  2888. return OK;
  2889. } break;
  2890. case COMPLETION_MAIN_FUNCTION: {
  2891. for(const Map< StringName, Map<StringName,DataType> >::Element *E=p_functions.front();E;E=E->next()) {
  2892. r_options->push_back(E->key());
  2893. }
  2894. return OK;
  2895. } break;
  2896. case COMPLETION_IDENTIFIER:
  2897. case COMPLETION_FUNCTION_CALL: {
  2898. bool comp_ident=completion_type==COMPLETION_IDENTIFIER;
  2899. Set<String> matches;
  2900. StringName skip_function;
  2901. BlockNode *block=completion_block;
  2902. while(block) {
  2903. if (comp_ident) {
  2904. for (const Map<StringName,BlockNode::Variable>::Element *E=block->variables.front();E;E=E->next()) {
  2905. if (E->get().line<completion_line) {
  2906. matches.insert(E->key());
  2907. }
  2908. }
  2909. }
  2910. if (block->parent_function) {
  2911. if (comp_ident) {
  2912. for(int i=0;i<block->parent_function->arguments.size();i++) {
  2913. matches.insert(block->parent_function->arguments[i].name);
  2914. }
  2915. }
  2916. skip_function=block->parent_function->name;
  2917. }
  2918. block=block->parent_block;
  2919. }
  2920. if (comp_ident && skip_function!=StringName() && p_functions.has(skip_function)) {
  2921. for (Map<StringName,DataType>::Element *E=p_functions[skip_function].front();E;E=E->next()) {
  2922. matches.insert(E->key());
  2923. }
  2924. }
  2925. if (comp_ident) {
  2926. for (const Map<StringName,ShaderNode::Varying>::Element *E=shader->varyings.front();E;E=E->next()) {
  2927. matches.insert(E->key());
  2928. }
  2929. for (const Map<StringName,ShaderNode::Uniform>::Element *E=shader->uniforms.front();E;E=E->next()) {
  2930. matches.insert(E->key());
  2931. }
  2932. }
  2933. for(int i=0;i<shader->functions.size();i++) {
  2934. if (!shader->functions[i].callable || shader->functions[i].name==skip_function)
  2935. continue;
  2936. matches.insert(String(shader->functions[i].name)+"(");
  2937. }
  2938. int idx=0;
  2939. while (builtin_func_defs[idx].name) {
  2940. matches.insert(String(builtin_func_defs[idx].name)+"(");
  2941. idx++;
  2942. }
  2943. for(Set<String>::Element *E=matches.front();E;E=E->next()) {
  2944. r_options->push_back(E->get());
  2945. }
  2946. return OK;
  2947. } break;
  2948. case COMPLETION_CALL_ARGUMENTS: {
  2949. for(int i=0;i<shader->functions.size();i++) {
  2950. if (!shader->functions[i].callable)
  2951. continue;
  2952. if (shader->functions[i].name==completion_function) {
  2953. String calltip;
  2954. calltip+=get_datatype_name( shader->functions[i].function->return_type );
  2955. calltip+=" ";
  2956. calltip+=shader->functions[i].name;
  2957. calltip+="(";
  2958. for(int j=0;j<shader->functions[i].function->arguments.size();j++) {
  2959. if (j>0)
  2960. calltip+=", ";
  2961. else
  2962. calltip+=" ";
  2963. if (j==completion_argument) {
  2964. calltip+=CharType(0xFFFF);
  2965. }
  2966. calltip+=get_datatype_name(shader->functions[i].function->arguments[j].type);
  2967. calltip+=" ";
  2968. calltip+=shader->functions[i].function->arguments[j].name;
  2969. if (j==completion_argument) {
  2970. calltip+=CharType(0xFFFF);
  2971. }
  2972. }
  2973. if (shader->functions[i].function->arguments.size())
  2974. calltip+=" ";
  2975. calltip+=")";
  2976. r_call_hint=calltip;
  2977. return OK;
  2978. }
  2979. }
  2980. int idx=0;
  2981. String calltip;
  2982. while (builtin_func_defs[idx].name) {
  2983. if (completion_function==builtin_func_defs[idx].name) {
  2984. if (calltip.length())
  2985. calltip+="\n";
  2986. calltip+=get_datatype_name( builtin_func_defs[idx].rettype );
  2987. calltip+=" ";
  2988. calltip+=builtin_func_defs[idx].name;
  2989. calltip+="(";
  2990. bool found_arg=false;
  2991. for(int i=0;i<4;i++) {
  2992. if (builtin_func_defs[idx].args[i]==TYPE_VOID)
  2993. break;
  2994. if (i>0)
  2995. calltip+=", ";
  2996. else
  2997. calltip+=" ";
  2998. if (i==completion_argument) {
  2999. calltip+=CharType(0xFFFF);
  3000. }
  3001. calltip+=get_datatype_name(builtin_func_defs[idx].args[i]);
  3002. if (i==completion_argument) {
  3003. calltip+=CharType(0xFFFF);
  3004. }
  3005. found_arg=true;
  3006. }
  3007. if (found_arg)
  3008. calltip+=" ";
  3009. calltip+=")";
  3010. }
  3011. idx++;
  3012. }
  3013. r_call_hint=calltip;
  3014. return OK;
  3015. } break;
  3016. case COMPLETION_INDEX: {
  3017. const char colv[4]={'r','g','b','a'};
  3018. const char coordv[4]={'x','y','z','w'};
  3019. int limit=0;
  3020. switch(completion_base) {
  3021. case TYPE_BVEC2:
  3022. case TYPE_IVEC2:
  3023. case TYPE_UVEC2:
  3024. case TYPE_VEC2: {
  3025. limit=2;
  3026. } break;
  3027. case TYPE_BVEC3:
  3028. case TYPE_IVEC3:
  3029. case TYPE_UVEC3:
  3030. case TYPE_VEC3: {
  3031. limit=3;
  3032. } break;
  3033. case TYPE_BVEC4:
  3034. case TYPE_IVEC4:
  3035. case TYPE_UVEC4:
  3036. case TYPE_VEC4: {
  3037. limit=4;
  3038. } break;
  3039. case TYPE_MAT2: limit=2; break;
  3040. case TYPE_MAT3: limit=3; break;
  3041. case TYPE_MAT4: limit=4; break;
  3042. default: {}
  3043. }
  3044. for(int i=0;i<limit;i++) {
  3045. r_options->push_back(String::chr(colv[i]));
  3046. r_options->push_back(String::chr(coordv[i]));
  3047. }
  3048. } break;
  3049. }
  3050. return ERR_PARSE_ERROR;
  3051. }
  3052. String ShaderLanguage::get_error_text() {
  3053. return error_str;
  3054. }
  3055. int ShaderLanguage::get_error_line() {
  3056. return error_line;
  3057. }
  3058. ShaderLanguage::ShaderNode *ShaderLanguage::get_shader() {
  3059. return shader;
  3060. }
  3061. ShaderLanguage::ShaderLanguage() {
  3062. nodes=NULL;
  3063. }
  3064. ShaderLanguage::~ShaderLanguage() {
  3065. clear();
  3066. }