shader_compiler_gles3.cpp 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326
  1. /**************************************************************************/
  2. /* shader_compiler_gles3.cpp */
  3. /**************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /**************************************************************************/
  8. /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
  9. /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /**************************************************************************/
  30. #include "shader_compiler_gles3.h"
  31. #include "core/os/os.h"
  32. #include "core/project_settings.h"
  33. #define SL ShaderLanguage
  34. static String _mktab(int p_level) {
  35. String tb;
  36. for (int i = 0; i < p_level; i++) {
  37. tb += "\t";
  38. }
  39. return tb;
  40. }
  41. static String _typestr(SL::DataType p_type) {
  42. return ShaderLanguage::get_datatype_name(p_type);
  43. }
  44. static int _get_datatype_size(SL::DataType p_type) {
  45. switch (p_type) {
  46. case SL::TYPE_VOID:
  47. return 0;
  48. case SL::TYPE_BOOL:
  49. return 4;
  50. case SL::TYPE_BVEC2:
  51. return 8;
  52. case SL::TYPE_BVEC3:
  53. return 12;
  54. case SL::TYPE_BVEC4:
  55. return 16;
  56. case SL::TYPE_INT:
  57. return 4;
  58. case SL::TYPE_IVEC2:
  59. return 8;
  60. case SL::TYPE_IVEC3:
  61. return 12;
  62. case SL::TYPE_IVEC4:
  63. return 16;
  64. case SL::TYPE_UINT:
  65. return 4;
  66. case SL::TYPE_UVEC2:
  67. return 8;
  68. case SL::TYPE_UVEC3:
  69. return 12;
  70. case SL::TYPE_UVEC4:
  71. return 16;
  72. case SL::TYPE_FLOAT:
  73. return 4;
  74. case SL::TYPE_VEC2:
  75. return 8;
  76. case SL::TYPE_VEC3:
  77. return 12;
  78. case SL::TYPE_VEC4:
  79. return 16;
  80. case SL::TYPE_MAT2:
  81. return 32; //4 * 4 + 4 * 4
  82. case SL::TYPE_MAT3:
  83. return 48; // 4 * 4 + 4 * 4 + 4 * 4
  84. case SL::TYPE_MAT4:
  85. return 64;
  86. case SL::TYPE_SAMPLER2D:
  87. return 16;
  88. case SL::TYPE_ISAMPLER2D:
  89. return 16;
  90. case SL::TYPE_USAMPLER2D:
  91. return 16;
  92. case SL::TYPE_SAMPLER2DARRAY:
  93. return 16;
  94. case SL::TYPE_ISAMPLER2DARRAY:
  95. return 16;
  96. case SL::TYPE_USAMPLER2DARRAY:
  97. return 16;
  98. case SL::TYPE_SAMPLER3D:
  99. return 16;
  100. case SL::TYPE_ISAMPLER3D:
  101. return 16;
  102. case SL::TYPE_USAMPLER3D:
  103. return 16;
  104. case SL::TYPE_SAMPLERCUBE:
  105. return 16;
  106. case SL::TYPE_SAMPLEREXT:
  107. return 16;
  108. case SL::TYPE_STRUCT:
  109. return 0;
  110. default: {
  111. }
  112. }
  113. ERR_FAIL_V(0);
  114. }
  115. static int _get_datatype_alignment(SL::DataType p_type) {
  116. switch (p_type) {
  117. case SL::TYPE_VOID:
  118. return 0;
  119. case SL::TYPE_BOOL:
  120. return 4;
  121. case SL::TYPE_BVEC2:
  122. return 8;
  123. case SL::TYPE_BVEC3:
  124. return 16;
  125. case SL::TYPE_BVEC4:
  126. return 16;
  127. case SL::TYPE_INT:
  128. return 4;
  129. case SL::TYPE_IVEC2:
  130. return 8;
  131. case SL::TYPE_IVEC3:
  132. return 16;
  133. case SL::TYPE_IVEC4:
  134. return 16;
  135. case SL::TYPE_UINT:
  136. return 4;
  137. case SL::TYPE_UVEC2:
  138. return 8;
  139. case SL::TYPE_UVEC3:
  140. return 16;
  141. case SL::TYPE_UVEC4:
  142. return 16;
  143. case SL::TYPE_FLOAT:
  144. return 4;
  145. case SL::TYPE_VEC2:
  146. return 8;
  147. case SL::TYPE_VEC3:
  148. return 16;
  149. case SL::TYPE_VEC4:
  150. return 16;
  151. case SL::TYPE_MAT2:
  152. return 16;
  153. case SL::TYPE_MAT3:
  154. return 16;
  155. case SL::TYPE_MAT4:
  156. return 16;
  157. case SL::TYPE_SAMPLER2D:
  158. return 16;
  159. case SL::TYPE_ISAMPLER2D:
  160. return 16;
  161. case SL::TYPE_USAMPLER2D:
  162. return 16;
  163. case SL::TYPE_SAMPLER2DARRAY:
  164. return 16;
  165. case SL::TYPE_ISAMPLER2DARRAY:
  166. return 16;
  167. case SL::TYPE_USAMPLER2DARRAY:
  168. return 16;
  169. case SL::TYPE_SAMPLER3D:
  170. return 16;
  171. case SL::TYPE_ISAMPLER3D:
  172. return 16;
  173. case SL::TYPE_USAMPLER3D:
  174. return 16;
  175. case SL::TYPE_SAMPLERCUBE:
  176. return 16;
  177. case SL::TYPE_SAMPLEREXT:
  178. return 16;
  179. case SL::TYPE_STRUCT:
  180. return 0;
  181. default: {
  182. }
  183. }
  184. ERR_FAIL_V(0);
  185. }
  186. static String _interpstr(SL::DataInterpolation p_interp) {
  187. switch (p_interp) {
  188. case SL::INTERPOLATION_FLAT:
  189. return "flat ";
  190. case SL::INTERPOLATION_SMOOTH:
  191. return "";
  192. }
  193. return "";
  194. }
  195. static String _prestr(SL::DataPrecision p_pres) {
  196. switch (p_pres) {
  197. case SL::PRECISION_LOWP:
  198. return "lowp ";
  199. case SL::PRECISION_MEDIUMP:
  200. return "mediump ";
  201. case SL::PRECISION_HIGHP:
  202. return "highp ";
  203. case SL::PRECISION_DEFAULT:
  204. return "";
  205. }
  206. return "";
  207. }
  208. static String _constr(bool p_is_const) {
  209. if (p_is_const) {
  210. return "const ";
  211. }
  212. return "";
  213. }
  214. static String _qualstr(SL::ArgumentQualifier p_qual) {
  215. switch (p_qual) {
  216. case SL::ARGUMENT_QUALIFIER_IN:
  217. return "";
  218. case SL::ARGUMENT_QUALIFIER_OUT:
  219. return "out ";
  220. case SL::ARGUMENT_QUALIFIER_INOUT:
  221. return "inout ";
  222. }
  223. return "";
  224. }
  225. static String _opstr(SL::Operator p_op) {
  226. return SL::get_operator_text(p_op);
  227. }
  228. static String _mkid(const String &p_id) {
  229. String id = "m_" + p_id.replace("__", "_dus_");
  230. return id.replace("__", "_dus_"); //doubleunderscore is reserved in glsl
  231. }
  232. static String f2sp0(float p_float) {
  233. String num = rtoss(p_float);
  234. if (num.find(".") == -1 && num.find("e") == -1) {
  235. num += ".0";
  236. }
  237. return num;
  238. }
  239. static String get_constant_text(SL::DataType p_type, const Vector<SL::ConstantNode::Value> &p_values) {
  240. switch (p_type) {
  241. case SL::TYPE_BOOL:
  242. return p_values[0].boolean ? "true" : "false";
  243. case SL::TYPE_BVEC2:
  244. case SL::TYPE_BVEC3:
  245. case SL::TYPE_BVEC4: {
  246. String text = "bvec" + itos(p_type - SL::TYPE_BOOL + 1) + "(";
  247. for (int i = 0; i < p_values.size(); i++) {
  248. if (i > 0) {
  249. text += ",";
  250. }
  251. text += p_values[i].boolean ? "true" : "false";
  252. }
  253. text += ")";
  254. return text;
  255. }
  256. case SL::TYPE_INT:
  257. return itos(p_values[0].sint);
  258. case SL::TYPE_IVEC2:
  259. case SL::TYPE_IVEC3:
  260. case SL::TYPE_IVEC4: {
  261. String text = "ivec" + itos(p_type - SL::TYPE_INT + 1) + "(";
  262. for (int i = 0; i < p_values.size(); i++) {
  263. if (i > 0) {
  264. text += ",";
  265. }
  266. text += itos(p_values[i].sint);
  267. }
  268. text += ")";
  269. return text;
  270. } break;
  271. case SL::TYPE_UINT:
  272. return itos(p_values[0].uint) + "u";
  273. case SL::TYPE_UVEC2:
  274. case SL::TYPE_UVEC3:
  275. case SL::TYPE_UVEC4: {
  276. String text = "uvec" + itos(p_type - SL::TYPE_UINT + 1) + "(";
  277. for (int i = 0; i < p_values.size(); i++) {
  278. if (i > 0) {
  279. text += ",";
  280. }
  281. text += itos(p_values[i].uint) + "u";
  282. }
  283. text += ")";
  284. return text;
  285. } break;
  286. case SL::TYPE_FLOAT:
  287. return f2sp0(p_values[0].real);
  288. case SL::TYPE_VEC2:
  289. case SL::TYPE_VEC3:
  290. case SL::TYPE_VEC4: {
  291. String text = "vec" + itos(p_type - SL::TYPE_FLOAT + 1) + "(";
  292. for (int i = 0; i < p_values.size(); i++) {
  293. if (i > 0) {
  294. text += ",";
  295. }
  296. text += f2sp0(p_values[i].real);
  297. }
  298. text += ")";
  299. return text;
  300. } break;
  301. case SL::TYPE_MAT2:
  302. case SL::TYPE_MAT3:
  303. case SL::TYPE_MAT4: {
  304. String text = "mat" + itos(p_type - SL::TYPE_MAT2 + 2) + "(";
  305. for (int i = 0; i < p_values.size(); i++) {
  306. if (i > 0) {
  307. text += ",";
  308. }
  309. text += f2sp0(p_values[i].real);
  310. }
  311. text += ")";
  312. return text;
  313. } break;
  314. default:
  315. ERR_FAIL_V(String());
  316. }
  317. }
  318. void ShaderCompilerGLES3::_dump_function_deps(const SL::ShaderNode *p_node, const StringName &p_for_func, const Map<StringName, String> &p_func_code, String &r_to_add, Set<StringName> &added) {
  319. int fidx = -1;
  320. for (int i = 0; i < p_node->functions.size(); i++) {
  321. if (p_node->functions[i].name == p_for_func) {
  322. fidx = i;
  323. break;
  324. }
  325. }
  326. ERR_FAIL_COND(fidx == -1);
  327. for (Set<StringName>::Element *E = p_node->functions[fidx].uses_function.front(); E; E = E->next()) {
  328. if (added.has(E->get())) {
  329. continue; //was added already
  330. }
  331. _dump_function_deps(p_node, E->get(), p_func_code, r_to_add, added);
  332. SL::FunctionNode *fnode = nullptr;
  333. for (int i = 0; i < p_node->functions.size(); i++) {
  334. if (p_node->functions[i].name == E->get()) {
  335. fnode = p_node->functions[i].function;
  336. break;
  337. }
  338. }
  339. ERR_FAIL_COND(!fnode);
  340. r_to_add += "\n";
  341. String header;
  342. if (fnode->return_type == SL::TYPE_STRUCT) {
  343. header = _mkid(fnode->return_struct_name) + " " + _mkid(fnode->name) + "(";
  344. } else {
  345. header = _typestr(fnode->return_type) + " " + _mkid(fnode->name) + "(";
  346. }
  347. for (int i = 0; i < fnode->arguments.size(); i++) {
  348. if (i > 0) {
  349. header += ", ";
  350. }
  351. header += _constr(fnode->arguments[i].is_const);
  352. if (fnode->arguments[i].type == SL::TYPE_STRUCT) {
  353. header += _qualstr(fnode->arguments[i].qualifier) + _mkid(fnode->arguments[i].type_str) + " " + _mkid(fnode->arguments[i].name);
  354. } else {
  355. header += _qualstr(fnode->arguments[i].qualifier) + _prestr(fnode->arguments[i].precision) + _typestr(fnode->arguments[i].type) + " " + _mkid(fnode->arguments[i].name);
  356. }
  357. }
  358. header += ")\n";
  359. r_to_add += header;
  360. r_to_add += p_func_code[E->get()];
  361. added.insert(E->get());
  362. }
  363. }
  364. String ShaderCompilerGLES3::_dump_node_code(const SL::Node *p_node, int p_level, GeneratedCode &r_gen_code, IdentifierActions &p_actions, const DefaultIdentifierActions &p_default_actions, bool p_assigning, bool p_use_scope) {
  365. String code;
  366. switch (p_node->type) {
  367. case SL::Node::TYPE_SHADER: {
  368. SL::ShaderNode *pnode = (SL::ShaderNode *)p_node;
  369. for (int i = 0; i < pnode->render_modes.size(); i++) {
  370. if (p_default_actions.render_mode_defines.has(pnode->render_modes[i]) && !used_rmode_defines.has(pnode->render_modes[i])) {
  371. r_gen_code.defines.push_back(p_default_actions.render_mode_defines[pnode->render_modes[i]].utf8());
  372. used_rmode_defines.insert(pnode->render_modes[i]);
  373. }
  374. if (p_actions.render_mode_flags.has(pnode->render_modes[i])) {
  375. *p_actions.render_mode_flags[pnode->render_modes[i]] = true;
  376. }
  377. if (p_actions.render_mode_values.has(pnode->render_modes[i])) {
  378. Pair<int *, int> &p = p_actions.render_mode_values[pnode->render_modes[i]];
  379. *p.first = p.second;
  380. }
  381. }
  382. // structs
  383. for (int i = 0; i < pnode->vstructs.size(); i++) {
  384. SL::StructNode *st = pnode->vstructs[i].shader_struct;
  385. String struct_code;
  386. struct_code += "struct ";
  387. struct_code += _mkid(pnode->vstructs[i].name);
  388. struct_code += " ";
  389. struct_code += "{\n";
  390. for (int j = 0; j < st->members.size(); j++) {
  391. SL::MemberNode *m = st->members[j];
  392. if (m->datatype == SL::TYPE_STRUCT) {
  393. struct_code += _mkid(m->struct_name);
  394. } else {
  395. struct_code += _prestr(m->precision);
  396. struct_code += _typestr(m->datatype);
  397. }
  398. struct_code += " ";
  399. struct_code += m->name;
  400. if (m->array_size > 0) {
  401. struct_code += "[";
  402. struct_code += itos(m->array_size);
  403. struct_code += "]";
  404. }
  405. struct_code += ";\n";
  406. }
  407. struct_code += "}";
  408. struct_code += ";\n";
  409. r_gen_code.vertex_global += struct_code;
  410. r_gen_code.fragment_global += struct_code;
  411. }
  412. int max_texture_uniforms = 0;
  413. int max_uniforms = 0;
  414. for (OrderedHashMap<StringName, SL::ShaderNode::Uniform>::Element E = pnode->uniforms.front(); E; E = E.next()) {
  415. if (SL::is_sampler_type(E.get().type)) {
  416. max_texture_uniforms++;
  417. } else {
  418. max_uniforms++;
  419. }
  420. }
  421. r_gen_code.texture_uniforms.resize(max_texture_uniforms);
  422. r_gen_code.texture_hints.resize(max_texture_uniforms);
  423. r_gen_code.texture_types.resize(max_texture_uniforms);
  424. Vector<int> uniform_sizes;
  425. Vector<int> uniform_alignments;
  426. Vector<StringName> uniform_defines;
  427. uniform_sizes.resize(max_uniforms);
  428. uniform_alignments.resize(max_uniforms);
  429. uniform_defines.resize(max_uniforms);
  430. bool uses_uniforms = false;
  431. for (OrderedHashMap<StringName, SL::ShaderNode::Uniform>::Element E = pnode->uniforms.front(); E; E = E.next()) {
  432. String ucode;
  433. if (SL::is_sampler_type(E.get().type)) {
  434. ucode = "uniform ";
  435. }
  436. ucode += _prestr(E.get().precision);
  437. ucode += _typestr(E.get().type);
  438. ucode += " " + _mkid(E.key());
  439. ucode += ";\n";
  440. if (SL::is_sampler_type(E.get().type)) {
  441. r_gen_code.vertex_global += ucode;
  442. r_gen_code.fragment_global += ucode;
  443. r_gen_code.texture_uniforms.write[E.get().texture_order] = _mkid(E.key());
  444. r_gen_code.texture_hints.write[E.get().texture_order] = E.get().hint;
  445. r_gen_code.texture_types.write[E.get().texture_order] = E.get().type;
  446. } else {
  447. if (!uses_uniforms) {
  448. r_gen_code.defines.push_back(String("#define USE_MATERIAL\n").ascii());
  449. uses_uniforms = true;
  450. }
  451. uniform_defines.write[E.get().order] = ucode;
  452. uniform_sizes.write[E.get().order] = _get_datatype_size(E.get().type);
  453. uniform_alignments.write[E.get().order] = _get_datatype_alignment(E.get().type);
  454. }
  455. p_actions.uniforms->insert(E.key(), E.get());
  456. }
  457. for (int i = 0; i < max_uniforms; i++) {
  458. r_gen_code.uniforms += uniform_defines[i];
  459. }
  460. // add up
  461. int offset = 0;
  462. for (int i = 0; i < uniform_sizes.size(); i++) {
  463. int align = offset % uniform_alignments[i];
  464. if (align != 0) {
  465. offset += uniform_alignments[i] - align;
  466. }
  467. r_gen_code.uniform_offsets.push_back(offset);
  468. offset += uniform_sizes[i];
  469. }
  470. r_gen_code.uniform_total_size = offset;
  471. if (r_gen_code.uniform_total_size % 16 != 0) { //UBO sizes must be multiples of 16
  472. r_gen_code.uniform_total_size += r_gen_code.uniform_total_size % 16;
  473. }
  474. List<Pair<StringName, SL::ShaderNode::Varying>> var_frag_to_light;
  475. for (OrderedHashMap<StringName, SL::ShaderNode::Varying>::Element E = pnode->varyings.front(); E; E = E.next()) {
  476. if (E.get().stage == SL::ShaderNode::Varying::STAGE_FRAGMENT_TO_LIGHT || E.get().stage == SL::ShaderNode::Varying::STAGE_FRAGMENT) {
  477. var_frag_to_light.push_back(Pair<StringName, SL::ShaderNode::Varying>(E.key(), E.get()));
  478. fragment_varyings.insert(E.key());
  479. continue;
  480. }
  481. String vcode;
  482. String interp_mode = _interpstr(E.get().interpolation);
  483. vcode += _prestr(E.get().precision);
  484. vcode += _typestr(E.get().type);
  485. vcode += " " + _mkid(E.key());
  486. if (E.get().array_size > 0) {
  487. vcode += "[";
  488. vcode += itos(E.get().array_size);
  489. vcode += "]";
  490. }
  491. vcode += ";\n";
  492. r_gen_code.vertex_global += interp_mode + "out " + vcode;
  493. r_gen_code.fragment_global += interp_mode + "in " + vcode;
  494. }
  495. if (var_frag_to_light.size() > 0) {
  496. String gcode = "\n\nstruct {\n";
  497. for (List<Pair<StringName, SL::ShaderNode::Varying>>::Element *E = var_frag_to_light.front(); E; E = E->next()) {
  498. gcode += "\t" + _prestr(E->get().second.precision) + _typestr(E->get().second.type) + " " + _mkid(E->get().first);
  499. if (E->get().second.array_size > 0) {
  500. gcode += "[";
  501. gcode += itos(E->get().second.array_size);
  502. gcode += "]";
  503. }
  504. gcode += ";\n";
  505. }
  506. gcode += "} frag_to_light;\n";
  507. r_gen_code.fragment_global += gcode;
  508. }
  509. for (int i = 0; i < pnode->vconstants.size(); i++) {
  510. const SL::ShaderNode::Constant &cnode = pnode->vconstants[i];
  511. String gcode;
  512. gcode += _constr(true);
  513. if (pnode->vconstants[i].type == SL::TYPE_STRUCT) {
  514. gcode += _mkid(cnode.type_str);
  515. } else {
  516. gcode += _prestr(cnode.precision);
  517. gcode += _typestr(cnode.type);
  518. }
  519. gcode += " " + _mkid(String(cnode.name));
  520. if (cnode.array_size > 0) {
  521. gcode += "[";
  522. gcode += itos(cnode.array_size);
  523. gcode += "]";
  524. }
  525. gcode += "=";
  526. gcode += _dump_node_code(cnode.initializer, p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  527. gcode += ";\n";
  528. r_gen_code.vertex_global += gcode;
  529. r_gen_code.fragment_global += gcode;
  530. }
  531. Map<StringName, String> function_code;
  532. //code for functions
  533. for (int i = 0; i < pnode->functions.size(); i++) {
  534. SL::FunctionNode *fnode = pnode->functions[i].function;
  535. function = fnode;
  536. current_func_name = fnode->name;
  537. function_code[fnode->name] = _dump_node_code(fnode->body, p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
  538. function = nullptr;
  539. }
  540. //place functions in actual code
  541. Set<StringName> added_vtx;
  542. Set<StringName> added_fragment; //share for light
  543. for (int i = 0; i < pnode->functions.size(); i++) {
  544. SL::FunctionNode *fnode = pnode->functions[i].function;
  545. function = fnode;
  546. current_func_name = fnode->name;
  547. if (fnode->name == vertex_name) {
  548. _dump_function_deps(pnode, fnode->name, function_code, r_gen_code.vertex_global, added_vtx);
  549. r_gen_code.vertex = function_code[vertex_name];
  550. }
  551. if (fnode->name == fragment_name) {
  552. _dump_function_deps(pnode, fnode->name, function_code, r_gen_code.fragment_global, added_fragment);
  553. r_gen_code.fragment = function_code[fragment_name];
  554. }
  555. if (fnode->name == light_name) {
  556. _dump_function_deps(pnode, fnode->name, function_code, r_gen_code.fragment_global, added_fragment);
  557. r_gen_code.light = function_code[light_name];
  558. }
  559. function = nullptr;
  560. }
  561. //code+=dump_node_code(pnode->body,p_level);
  562. } break;
  563. case SL::Node::TYPE_STRUCT: {
  564. } break;
  565. case SL::Node::TYPE_FUNCTION: {
  566. } break;
  567. case SL::Node::TYPE_BLOCK: {
  568. SL::BlockNode *bnode = (SL::BlockNode *)p_node;
  569. //variables
  570. if (!bnode->single_statement) {
  571. code += _mktab(p_level - 1) + "{\n";
  572. }
  573. for (int i = 0; i < bnode->statements.size(); i++) {
  574. String scode = _dump_node_code(bnode->statements[i], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  575. if (bnode->statements[i]->type == SL::Node::TYPE_CONTROL_FLOW || bnode->single_statement) {
  576. code += scode; //use directly
  577. } else {
  578. code += _mktab(p_level) + scode + ";\n";
  579. }
  580. }
  581. if (!bnode->single_statement) {
  582. code += _mktab(p_level - 1) + "}\n";
  583. }
  584. } break;
  585. case SL::Node::TYPE_VARIABLE_DECLARATION: {
  586. SL::VariableDeclarationNode *vdnode = (SL::VariableDeclarationNode *)p_node;
  587. String declaration;
  588. declaration += _constr(vdnode->is_const);
  589. if (vdnode->datatype == SL::TYPE_STRUCT) {
  590. declaration += _mkid(vdnode->struct_name);
  591. } else {
  592. declaration += _prestr(vdnode->precision);
  593. declaration += _typestr(vdnode->datatype);
  594. }
  595. for (int i = 0; i < vdnode->declarations.size(); i++) {
  596. if (i > 0) {
  597. declaration += ",";
  598. } else {
  599. declaration += " ";
  600. }
  601. declaration += _mkid(vdnode->declarations[i].name);
  602. if (vdnode->declarations[i].initializer) {
  603. declaration += "=";
  604. declaration += _dump_node_code(vdnode->declarations[i].initializer, p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  605. }
  606. }
  607. code += declaration;
  608. } break;
  609. case SL::Node::TYPE_VARIABLE: {
  610. SL::VariableNode *vnode = (SL::VariableNode *)p_node;
  611. bool use_fragment_varying = false;
  612. if (!vnode->is_local && current_func_name != vertex_name) {
  613. if (p_assigning) {
  614. if (shader->varyings.has(vnode->name)) {
  615. use_fragment_varying = true;
  616. }
  617. } else {
  618. if (fragment_varyings.has(vnode->name)) {
  619. use_fragment_varying = true;
  620. }
  621. }
  622. }
  623. if (p_assigning && p_actions.write_flag_pointers.has(vnode->name)) {
  624. *p_actions.write_flag_pointers[vnode->name] = true;
  625. }
  626. if (p_default_actions.usage_defines.has(vnode->name) && !used_name_defines.has(vnode->name)) {
  627. String define = p_default_actions.usage_defines[vnode->name];
  628. if (define.begins_with("@")) {
  629. define = p_default_actions.usage_defines[define.substr(1, define.length())];
  630. }
  631. r_gen_code.defines.push_back(define.utf8());
  632. used_name_defines.insert(vnode->name);
  633. }
  634. if (p_actions.usage_flag_pointers.has(vnode->name) && !used_flag_pointers.has(vnode->name)) {
  635. *p_actions.usage_flag_pointers[vnode->name] = true;
  636. used_flag_pointers.insert(vnode->name);
  637. }
  638. if (p_default_actions.renames.has(vnode->name)) {
  639. code = p_default_actions.renames[vnode->name];
  640. } else if (use_fragment_varying) {
  641. code = "frag_to_light." + _mkid(vnode->name);
  642. } else {
  643. code = _mkid(vnode->name);
  644. }
  645. if (vnode->name == time_name) {
  646. if (current_func_name == vertex_name) {
  647. r_gen_code.uses_vertex_time = true;
  648. }
  649. if (current_func_name == fragment_name || current_func_name == light_name) {
  650. r_gen_code.uses_fragment_time = true;
  651. }
  652. }
  653. } break;
  654. case SL::Node::TYPE_ARRAY_CONSTRUCT: {
  655. SL::ArrayConstructNode *acnode = (SL::ArrayConstructNode *)p_node;
  656. int sz = acnode->initializer.size();
  657. if (acnode->datatype == SL::TYPE_STRUCT) {
  658. code += _mkid(acnode->struct_name);
  659. } else {
  660. code += _typestr(acnode->datatype);
  661. }
  662. code += "[";
  663. code += itos(acnode->initializer.size());
  664. code += "]";
  665. code += "(";
  666. for (int i = 0; i < sz; i++) {
  667. code += _dump_node_code(acnode->initializer[i], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  668. if (i != sz - 1) {
  669. code += ", ";
  670. }
  671. }
  672. code += ")";
  673. } break;
  674. case SL::Node::TYPE_ARRAY_DECLARATION: {
  675. SL::ArrayDeclarationNode *adnode = (SL::ArrayDeclarationNode *)p_node;
  676. String declaration;
  677. if (adnode->is_const) {
  678. declaration += "const ";
  679. }
  680. if (adnode->datatype == SL::TYPE_STRUCT) {
  681. declaration += _mkid(adnode->struct_name);
  682. } else {
  683. declaration += _prestr(adnode->precision);
  684. declaration += _typestr(adnode->datatype);
  685. }
  686. for (int i = 0; i < adnode->declarations.size(); i++) {
  687. if (i > 0) {
  688. declaration += ",";
  689. } else {
  690. declaration += " ";
  691. }
  692. declaration += _mkid(adnode->declarations[i].name);
  693. declaration += "[";
  694. declaration += itos(adnode->declarations[i].size);
  695. declaration += "]";
  696. int sz = adnode->declarations[i].initializer.size();
  697. if (sz > 0) {
  698. declaration += "=";
  699. if (adnode->datatype == SL::TYPE_STRUCT) {
  700. declaration += _mkid(adnode->struct_name);
  701. } else {
  702. declaration += _typestr(adnode->datatype);
  703. }
  704. declaration += "[";
  705. declaration += itos(sz);
  706. declaration += "]";
  707. declaration += "(";
  708. for (int j = 0; j < sz; j++) {
  709. declaration += _dump_node_code(adnode->declarations[i].initializer[j], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  710. if (j != sz - 1) {
  711. declaration += ", ";
  712. }
  713. }
  714. declaration += ")";
  715. }
  716. }
  717. code += declaration;
  718. } break;
  719. case SL::Node::TYPE_ARRAY: {
  720. SL::ArrayNode *anode = (SL::ArrayNode *)p_node;
  721. bool use_fragment_varying = false;
  722. if (!anode->is_local && current_func_name != vertex_name) {
  723. if (anode->assign_expression != nullptr) {
  724. use_fragment_varying = true;
  725. } else {
  726. if (p_assigning) {
  727. if (shader->varyings.has(anode->name)) {
  728. use_fragment_varying = true;
  729. }
  730. } else {
  731. if (fragment_varyings.has(anode->name)) {
  732. use_fragment_varying = true;
  733. }
  734. }
  735. }
  736. }
  737. if (p_assigning && p_actions.write_flag_pointers.has(anode->name)) {
  738. *p_actions.write_flag_pointers[anode->name] = true;
  739. }
  740. if (p_default_actions.usage_defines.has(anode->name) && !used_name_defines.has(anode->name)) {
  741. String define = p_default_actions.usage_defines[anode->name];
  742. if (define.begins_with("@")) {
  743. define = p_default_actions.usage_defines[define.substr(1, define.length())];
  744. }
  745. r_gen_code.defines.push_back(define.utf8());
  746. used_name_defines.insert(anode->name);
  747. }
  748. if (p_actions.usage_flag_pointers.has(anode->name) && !used_flag_pointers.has(anode->name)) {
  749. *p_actions.usage_flag_pointers[anode->name] = true;
  750. used_flag_pointers.insert(anode->name);
  751. }
  752. if (p_default_actions.renames.has(anode->name)) {
  753. code = p_default_actions.renames[anode->name];
  754. } else if (use_fragment_varying) {
  755. code = "frag_to_light." + _mkid(anode->name);
  756. } else {
  757. code = _mkid(anode->name);
  758. }
  759. if (anode->call_expression != nullptr) {
  760. code += ".";
  761. code += _dump_node_code(anode->call_expression, p_level, r_gen_code, p_actions, p_default_actions, p_assigning, false);
  762. } else if (anode->index_expression != nullptr) {
  763. code += "[";
  764. code += _dump_node_code(anode->index_expression, p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  765. code += "]";
  766. } else if (anode->assign_expression != nullptr) {
  767. code += "=";
  768. code += _dump_node_code(anode->assign_expression, p_level, r_gen_code, p_actions, p_default_actions, true, false);
  769. }
  770. if (anode->name == time_name) {
  771. if (current_func_name == vertex_name) {
  772. r_gen_code.uses_vertex_time = true;
  773. }
  774. if (current_func_name == fragment_name || current_func_name == light_name) {
  775. r_gen_code.uses_fragment_time = true;
  776. }
  777. }
  778. } break;
  779. case SL::Node::TYPE_CONSTANT: {
  780. SL::ConstantNode *cnode = (SL::ConstantNode *)p_node;
  781. if (cnode->array_size == 0) {
  782. return get_constant_text(cnode->datatype, cnode->values);
  783. } else {
  784. if (cnode->get_datatype() == SL::TYPE_STRUCT) {
  785. code += _mkid(cnode->struct_name);
  786. } else {
  787. code += _typestr(cnode->datatype);
  788. }
  789. code += "[";
  790. code += itos(cnode->array_size);
  791. code += "]";
  792. code += "(";
  793. for (int i = 0; i < cnode->array_size; i++) {
  794. if (i > 0) {
  795. code += ",";
  796. } else {
  797. code += "";
  798. }
  799. code += _dump_node_code(cnode->array_declarations[0].initializer[i], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  800. }
  801. code += ")";
  802. }
  803. } break;
  804. case SL::Node::TYPE_OPERATOR: {
  805. SL::OperatorNode *onode = (SL::OperatorNode *)p_node;
  806. switch (onode->op) {
  807. case SL::OP_ASSIGN:
  808. case SL::OP_ASSIGN_ADD:
  809. case SL::OP_ASSIGN_SUB:
  810. case SL::OP_ASSIGN_MUL:
  811. case SL::OP_ASSIGN_DIV:
  812. case SL::OP_ASSIGN_SHIFT_LEFT:
  813. case SL::OP_ASSIGN_SHIFT_RIGHT:
  814. case SL::OP_ASSIGN_MOD:
  815. case SL::OP_ASSIGN_BIT_AND:
  816. case SL::OP_ASSIGN_BIT_OR:
  817. case SL::OP_ASSIGN_BIT_XOR:
  818. code = _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, true) + _opstr(onode->op) + _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  819. break;
  820. case SL::OP_BIT_INVERT:
  821. case SL::OP_NEGATE:
  822. case SL::OP_NOT:
  823. case SL::OP_DECREMENT:
  824. case SL::OP_INCREMENT:
  825. code = _opstr(onode->op) + _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  826. break;
  827. case SL::OP_POST_DECREMENT:
  828. case SL::OP_POST_INCREMENT:
  829. code = _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + _opstr(onode->op);
  830. break;
  831. case SL::OP_CALL:
  832. case SL::OP_STRUCT:
  833. case SL::OP_CONSTRUCT: {
  834. ERR_FAIL_COND_V(onode->arguments[0]->type != SL::Node::TYPE_VARIABLE, String());
  835. SL::VariableNode *vnode = (SL::VariableNode *)onode->arguments[0];
  836. if (onode->op == SL::OP_STRUCT) {
  837. code += _mkid(vnode->name);
  838. } else if (onode->op == SL::OP_CONSTRUCT) {
  839. code += String(vnode->name);
  840. } else {
  841. if (internal_functions.has(vnode->name)) {
  842. code += vnode->name;
  843. } else if (p_default_actions.renames.has(vnode->name)) {
  844. code += p_default_actions.renames[vnode->name];
  845. } else {
  846. code += _mkid(vnode->name);
  847. }
  848. }
  849. code += "(";
  850. for (int i = 1; i < onode->arguments.size(); i++) {
  851. if (i > 1) {
  852. code += ", ";
  853. }
  854. code += _dump_node_code(onode->arguments[i], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  855. }
  856. code += ")";
  857. } break;
  858. case SL::OP_INDEX: {
  859. code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  860. code += "[";
  861. code += _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  862. code += "]";
  863. } break;
  864. case SL::OP_SELECT_IF: {
  865. code += "(";
  866. code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  867. code += "?";
  868. code += _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  869. code += ":";
  870. code += _dump_node_code(onode->arguments[2], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  871. code += ")";
  872. } break;
  873. default: {
  874. if (p_use_scope) {
  875. code += "(";
  876. }
  877. code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + _opstr(onode->op) + _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  878. if (p_use_scope) {
  879. code += ")";
  880. }
  881. break;
  882. }
  883. }
  884. } break;
  885. case SL::Node::TYPE_CONTROL_FLOW: {
  886. SL::ControlFlowNode *cfnode = (SL::ControlFlowNode *)p_node;
  887. if (cfnode->flow_op == SL::FLOW_OP_IF) {
  888. code += _mktab(p_level) + "if (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ")\n";
  889. code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
  890. if (cfnode->blocks.size() == 2) {
  891. code += _mktab(p_level) + "else\n";
  892. code += _dump_node_code(cfnode->blocks[1], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
  893. }
  894. } else if (cfnode->flow_op == SL::FLOW_OP_SWITCH) {
  895. code += _mktab(p_level) + "switch (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ")\n";
  896. code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
  897. } else if (cfnode->flow_op == SL::FLOW_OP_CASE) {
  898. code += _mktab(p_level) + "case " + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ":\n";
  899. code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
  900. } else if (cfnode->flow_op == SL::FLOW_OP_DEFAULT) {
  901. code += _mktab(p_level) + "default:\n";
  902. code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
  903. } else if (cfnode->flow_op == SL::FLOW_OP_DO) {
  904. code += _mktab(p_level) + "do";
  905. code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
  906. code += _mktab(p_level) + "while (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ");";
  907. } else if (cfnode->flow_op == SL::FLOW_OP_WHILE) {
  908. code += _mktab(p_level) + "while (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ")\n";
  909. code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
  910. } else if (cfnode->flow_op == SL::FLOW_OP_FOR) {
  911. String left = _dump_node_code(cfnode->blocks[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  912. String middle = _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  913. String right = _dump_node_code(cfnode->expressions[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  914. code += _mktab(p_level) + "for (" + left + ";" + middle + ";" + right + ")\n";
  915. code += _dump_node_code(cfnode->blocks[1], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
  916. } else if (cfnode->flow_op == SL::FLOW_OP_RETURN) {
  917. if (cfnode->expressions.size()) {
  918. code = "return " + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ";";
  919. } else {
  920. code = "return;";
  921. }
  922. } else if (cfnode->flow_op == SL::FLOW_OP_DISCARD) {
  923. if (p_actions.usage_flag_pointers.has("DISCARD") && !used_flag_pointers.has("DISCARD")) {
  924. *p_actions.usage_flag_pointers["DISCARD"] = true;
  925. used_flag_pointers.insert("DISCARD");
  926. }
  927. code = "discard;";
  928. } else if (cfnode->flow_op == SL::FLOW_OP_CONTINUE) {
  929. code = "continue;";
  930. } else if (cfnode->flow_op == SL::FLOW_OP_BREAK) {
  931. code = "break;";
  932. }
  933. } break;
  934. case SL::Node::TYPE_MEMBER: {
  935. SL::MemberNode *mnode = (SL::MemberNode *)p_node;
  936. code = _dump_node_code(mnode->owner, p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + "." + mnode->name;
  937. if (mnode->index_expression != nullptr) {
  938. code += "[";
  939. code += _dump_node_code(mnode->index_expression, p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
  940. code += "]";
  941. } else if (mnode->assign_expression != nullptr) {
  942. code += "=";
  943. code += _dump_node_code(mnode->assign_expression, p_level, r_gen_code, p_actions, p_default_actions, true, false);
  944. }
  945. } break;
  946. }
  947. return code;
  948. }
  949. Error ShaderCompilerGLES3::compile(VS::ShaderMode p_mode, const String &p_code, IdentifierActions *p_actions, const String &p_path, GeneratedCode &r_gen_code) {
  950. Error err = parser.compile(p_code, ShaderTypes::get_singleton()->get_functions(p_mode), ShaderTypes::get_singleton()->get_modes(p_mode), ShaderTypes::get_singleton()->get_types());
  951. if (err != OK) {
  952. Vector<String> shader = p_code.split("\n");
  953. for (int i = 0; i < shader.size(); i++) {
  954. if (i + 1 == parser.get_error_line()) {
  955. // Mark the error line to be visible without having to look at
  956. // the trace at the end.
  957. print_line(vformat("E%4d-> %s", i + 1, shader[i]));
  958. } else {
  959. print_line(vformat("%5d | %s", i + 1, shader[i]));
  960. }
  961. }
  962. _err_print_error(nullptr, p_path.utf8().get_data(), parser.get_error_line(), parser.get_error_text().utf8().get_data(), ERR_HANDLER_SHADER);
  963. return err;
  964. }
  965. r_gen_code.defines.clear();
  966. r_gen_code.vertex = String();
  967. r_gen_code.vertex_global = String();
  968. r_gen_code.fragment = String();
  969. r_gen_code.fragment_global = String();
  970. r_gen_code.light = String();
  971. r_gen_code.uses_fragment_time = false;
  972. r_gen_code.uses_vertex_time = false;
  973. used_name_defines.clear();
  974. used_rmode_defines.clear();
  975. used_flag_pointers.clear();
  976. fragment_varyings.clear();
  977. shader = parser.get_shader();
  978. function = nullptr;
  979. _dump_node_code(shader, 1, r_gen_code, *p_actions, actions[p_mode], false);
  980. if (r_gen_code.uniform_total_size) { //uniforms used?
  981. int md = sizeof(float) * 4;
  982. if (r_gen_code.uniform_total_size % md) {
  983. r_gen_code.uniform_total_size += md - (r_gen_code.uniform_total_size % md);
  984. }
  985. r_gen_code.uniform_total_size += md; //pad just in case
  986. }
  987. return OK;
  988. }
  989. ShaderCompilerGLES3::ShaderCompilerGLES3() {
  990. /** CANVAS ITEM SHADER **/
  991. actions[VS::SHADER_CANVAS_ITEM].renames["VERTEX"] = "outvec.xy";
  992. actions[VS::SHADER_CANVAS_ITEM].renames["UV"] = "uv";
  993. actions[VS::SHADER_CANVAS_ITEM].renames["POINT_SIZE"] = "point_size";
  994. actions[VS::SHADER_CANVAS_ITEM].renames["WORLD_MATRIX"] = "modelview_matrix";
  995. actions[VS::SHADER_CANVAS_ITEM].renames["PROJECTION_MATRIX"] = "projection_matrix";
  996. actions[VS::SHADER_CANVAS_ITEM].renames["EXTRA_MATRIX"] = "extra_matrix";
  997. actions[VS::SHADER_CANVAS_ITEM].renames["TIME"] = "time";
  998. actions[VS::SHADER_CANVAS_ITEM].renames["AT_LIGHT_PASS"] = "at_light_pass";
  999. actions[VS::SHADER_CANVAS_ITEM].renames["INSTANCE_CUSTOM"] = "instance_custom";
  1000. actions[VS::SHADER_CANVAS_ITEM].renames["COLOR"] = "color";
  1001. actions[VS::SHADER_CANVAS_ITEM].renames["MODULATE"] = "final_modulate_alias";
  1002. actions[VS::SHADER_CANVAS_ITEM].renames["NORMAL"] = "normal";
  1003. actions[VS::SHADER_CANVAS_ITEM].renames["NORMALMAP"] = "normal_map";
  1004. actions[VS::SHADER_CANVAS_ITEM].renames["NORMALMAP_DEPTH"] = "normal_depth";
  1005. actions[VS::SHADER_CANVAS_ITEM].renames["TEXTURE"] = "color_texture";
  1006. actions[VS::SHADER_CANVAS_ITEM].renames["TEXTURE_PIXEL_SIZE"] = "color_texpixel_size";
  1007. actions[VS::SHADER_CANVAS_ITEM].renames["NORMAL_TEXTURE"] = "normal_texture";
  1008. actions[VS::SHADER_CANVAS_ITEM].renames["SCREEN_UV"] = "screen_uv";
  1009. actions[VS::SHADER_CANVAS_ITEM].renames["SCREEN_TEXTURE"] = "screen_texture";
  1010. actions[VS::SHADER_CANVAS_ITEM].renames["SCREEN_PIXEL_SIZE"] = "screen_pixel_size";
  1011. actions[VS::SHADER_CANVAS_ITEM].renames["FRAGCOORD"] = "gl_FragCoord";
  1012. actions[VS::SHADER_CANVAS_ITEM].renames["POINT_COORD"] = "gl_PointCoord";
  1013. actions[VS::SHADER_CANVAS_ITEM].renames["INSTANCE_ID"] = "gl_InstanceID";
  1014. actions[VS::SHADER_CANVAS_ITEM].renames["VERTEX_ID"] = "gl_VertexID";
  1015. actions[VS::SHADER_CANVAS_ITEM].renames["LIGHT_VEC"] = "light_vec";
  1016. actions[VS::SHADER_CANVAS_ITEM].renames["LIGHT_HEIGHT"] = "light_height";
  1017. actions[VS::SHADER_CANVAS_ITEM].renames["LIGHT_COLOR"] = "light_color";
  1018. actions[VS::SHADER_CANVAS_ITEM].renames["LIGHT_UV"] = "light_uv";
  1019. actions[VS::SHADER_CANVAS_ITEM].renames["LIGHT"] = "light";
  1020. actions[VS::SHADER_CANVAS_ITEM].renames["SHADOW_COLOR"] = "shadow_color";
  1021. actions[VS::SHADER_CANVAS_ITEM].renames["SHADOW_VEC"] = "shadow_vec";
  1022. actions[VS::SHADER_CANVAS_ITEM].usage_defines["COLOR"] = "#define COLOR_USED\n";
  1023. actions[VS::SHADER_CANVAS_ITEM].usage_defines["MODULATE"] = "#define MODULATE_USED\n";
  1024. actions[VS::SHADER_CANVAS_ITEM].usage_defines["SCREEN_TEXTURE"] = "#define SCREEN_TEXTURE_USED\n";
  1025. actions[VS::SHADER_CANVAS_ITEM].usage_defines["SCREEN_UV"] = "#define SCREEN_UV_USED\n";
  1026. actions[VS::SHADER_CANVAS_ITEM].usage_defines["SCREEN_PIXEL_SIZE"] = "@SCREEN_UV";
  1027. actions[VS::SHADER_CANVAS_ITEM].usage_defines["NORMAL"] = "#define NORMAL_USED\n";
  1028. actions[VS::SHADER_CANVAS_ITEM].usage_defines["NORMALMAP"] = "#define NORMALMAP_USED\n";
  1029. actions[VS::SHADER_CANVAS_ITEM].usage_defines["LIGHT"] = "#define USE_LIGHT_SHADER_CODE\n";
  1030. actions[VS::SHADER_CANVAS_ITEM].usage_defines["SHADOW_VEC"] = "#define SHADOW_VEC_USED\n";
  1031. actions[VS::SHADER_CANVAS_ITEM].render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n";
  1032. /** SPATIAL SHADER **/
  1033. actions[VS::SHADER_SPATIAL].renames["WORLD_MATRIX"] = "world_transform";
  1034. actions[VS::SHADER_SPATIAL].renames["INV_CAMERA_MATRIX"] = "camera_inverse_matrix";
  1035. actions[VS::SHADER_SPATIAL].renames["CAMERA_MATRIX"] = "camera_matrix";
  1036. actions[VS::SHADER_SPATIAL].renames["PROJECTION_MATRIX"] = "projection_matrix";
  1037. actions[VS::SHADER_SPATIAL].renames["INV_PROJECTION_MATRIX"] = "inv_projection_matrix";
  1038. actions[VS::SHADER_SPATIAL].renames["MODELVIEW_MATRIX"] = "modelview";
  1039. actions[VS::SHADER_SPATIAL].renames["VIEW_INDEX"] = "view_index";
  1040. actions[VS::SHADER_SPATIAL].renames["VIEW_MONO_LEFT"] = "0";
  1041. actions[VS::SHADER_SPATIAL].renames["VIEW_RIGHT"] = "1";
  1042. actions[VS::SHADER_SPATIAL].renames["VERTEX"] = "vertex.xyz";
  1043. actions[VS::SHADER_SPATIAL].renames["NORMAL"] = "normal";
  1044. actions[VS::SHADER_SPATIAL].renames["TANGENT"] = "tangent";
  1045. actions[VS::SHADER_SPATIAL].renames["BINORMAL"] = "binormal";
  1046. actions[VS::SHADER_SPATIAL].renames["POSITION"] = "position";
  1047. actions[VS::SHADER_SPATIAL].renames["UV"] = "uv_interp";
  1048. actions[VS::SHADER_SPATIAL].renames["UV2"] = "uv2_interp";
  1049. actions[VS::SHADER_SPATIAL].renames["COLOR"] = "color_interp";
  1050. actions[VS::SHADER_SPATIAL].renames["POINT_SIZE"] = "point_size";
  1051. actions[VS::SHADER_SPATIAL].renames["INSTANCE_ID"] = "gl_InstanceID";
  1052. actions[VS::SHADER_SPATIAL].renames["VERTEX_ID"] = "gl_VertexID";
  1053. //builtins
  1054. actions[VS::SHADER_SPATIAL].renames["TIME"] = "time";
  1055. actions[VS::SHADER_SPATIAL].renames["VIEWPORT_SIZE"] = "viewport_size";
  1056. actions[VS::SHADER_SPATIAL].renames["FRAGCOORD"] = "gl_FragCoord";
  1057. actions[VS::SHADER_SPATIAL].renames["FRONT_FACING"] = "gl_FrontFacing";
  1058. actions[VS::SHADER_SPATIAL].renames["NORMALMAP"] = "normalmap";
  1059. actions[VS::SHADER_SPATIAL].renames["NORMALMAP_DEPTH"] = "normaldepth";
  1060. actions[VS::SHADER_SPATIAL].renames["ALBEDO"] = "albedo";
  1061. actions[VS::SHADER_SPATIAL].renames["ALPHA"] = "alpha";
  1062. actions[VS::SHADER_SPATIAL].renames["METALLIC"] = "metallic";
  1063. actions[VS::SHADER_SPATIAL].renames["SPECULAR"] = "specular";
  1064. actions[VS::SHADER_SPATIAL].renames["ROUGHNESS"] = "roughness";
  1065. actions[VS::SHADER_SPATIAL].renames["RIM"] = "rim";
  1066. actions[VS::SHADER_SPATIAL].renames["RIM_TINT"] = "rim_tint";
  1067. actions[VS::SHADER_SPATIAL].renames["CLEARCOAT"] = "clearcoat";
  1068. actions[VS::SHADER_SPATIAL].renames["CLEARCOAT_GLOSS"] = "clearcoat_gloss";
  1069. actions[VS::SHADER_SPATIAL].renames["ANISOTROPY"] = "anisotropy";
  1070. actions[VS::SHADER_SPATIAL].renames["ANISOTROPY_FLOW"] = "anisotropy_flow";
  1071. actions[VS::SHADER_SPATIAL].renames["SSS_STRENGTH"] = "sss_strength";
  1072. actions[VS::SHADER_SPATIAL].renames["TRANSMISSION"] = "transmission";
  1073. actions[VS::SHADER_SPATIAL].renames["AO"] = "ao";
  1074. actions[VS::SHADER_SPATIAL].renames["AO_LIGHT_AFFECT"] = "ao_light_affect";
  1075. actions[VS::SHADER_SPATIAL].renames["EMISSION"] = "emission";
  1076. actions[VS::SHADER_SPATIAL].renames["POINT_COORD"] = "gl_PointCoord";
  1077. actions[VS::SHADER_SPATIAL].renames["INSTANCE_CUSTOM"] = "instance_custom";
  1078. actions[VS::SHADER_SPATIAL].renames["SCREEN_UV"] = "screen_uv";
  1079. actions[VS::SHADER_SPATIAL].renames["SCREEN_TEXTURE"] = "screen_texture";
  1080. actions[VS::SHADER_SPATIAL].renames["DEPTH_TEXTURE"] = "depth_buffer";
  1081. actions[VS::SHADER_SPATIAL].renames["DEPTH"] = "gl_FragDepth";
  1082. actions[VS::SHADER_SPATIAL].renames["ALPHA_SCISSOR"] = "alpha_scissor";
  1083. actions[VS::SHADER_SPATIAL].renames["OUTPUT_IS_SRGB"] = "SHADER_IS_SRGB";
  1084. //for light
  1085. actions[VS::SHADER_SPATIAL].renames["VIEW"] = "view";
  1086. actions[VS::SHADER_SPATIAL].renames["LIGHT_COLOR"] = "light_color";
  1087. actions[VS::SHADER_SPATIAL].renames["LIGHT"] = "light";
  1088. actions[VS::SHADER_SPATIAL].renames["ATTENUATION"] = "attenuation";
  1089. actions[VS::SHADER_SPATIAL].renames["DIFFUSE_LIGHT"] = "diffuse_light";
  1090. actions[VS::SHADER_SPATIAL].renames["SPECULAR_LIGHT"] = "specular_light";
  1091. actions[VS::SHADER_SPATIAL].usage_defines["TANGENT"] = "#define ENABLE_TANGENT_INTERP\n";
  1092. actions[VS::SHADER_SPATIAL].usage_defines["BINORMAL"] = "@TANGENT";
  1093. actions[VS::SHADER_SPATIAL].usage_defines["RIM"] = "#define LIGHT_USE_RIM\n";
  1094. actions[VS::SHADER_SPATIAL].usage_defines["RIM_TINT"] = "@RIM";
  1095. actions[VS::SHADER_SPATIAL].usage_defines["CLEARCOAT"] = "#define LIGHT_USE_CLEARCOAT\n";
  1096. actions[VS::SHADER_SPATIAL].usage_defines["CLEARCOAT_GLOSS"] = "@CLEARCOAT";
  1097. actions[VS::SHADER_SPATIAL].usage_defines["ANISOTROPY"] = "#define LIGHT_USE_ANISOTROPY\n";
  1098. actions[VS::SHADER_SPATIAL].usage_defines["ANISOTROPY_FLOW"] = "@ANISOTROPY";
  1099. actions[VS::SHADER_SPATIAL].usage_defines["AO"] = "#define ENABLE_AO\n";
  1100. actions[VS::SHADER_SPATIAL].usage_defines["AO_LIGHT_AFFECT"] = "#define ENABLE_AO\n";
  1101. actions[VS::SHADER_SPATIAL].usage_defines["UV"] = "#define ENABLE_UV_INTERP\n";
  1102. actions[VS::SHADER_SPATIAL].usage_defines["UV2"] = "#define ENABLE_UV2_INTERP\n";
  1103. actions[VS::SHADER_SPATIAL].usage_defines["NORMALMAP"] = "#define ENABLE_NORMALMAP\n";
  1104. actions[VS::SHADER_SPATIAL].usage_defines["NORMALMAP_DEPTH"] = "@NORMALMAP";
  1105. actions[VS::SHADER_SPATIAL].usage_defines["COLOR"] = "#define ENABLE_COLOR_INTERP\n";
  1106. actions[VS::SHADER_SPATIAL].usage_defines["INSTANCE_CUSTOM"] = "#define ENABLE_INSTANCE_CUSTOM\n";
  1107. actions[VS::SHADER_SPATIAL].usage_defines["ALPHA_SCISSOR"] = "#define ALPHA_SCISSOR_USED\n";
  1108. actions[VS::SHADER_SPATIAL].usage_defines["POSITION"] = "#define OVERRIDE_POSITION\n";
  1109. actions[VS::SHADER_SPATIAL].usage_defines["SSS_STRENGTH"] = "#define ENABLE_SSS\n";
  1110. actions[VS::SHADER_SPATIAL].usage_defines["TRANSMISSION"] = "#define TRANSMISSION_USED\n";
  1111. actions[VS::SHADER_SPATIAL].usage_defines["SCREEN_TEXTURE"] = "#define SCREEN_TEXTURE_USED\n";
  1112. actions[VS::SHADER_SPATIAL].usage_defines["SCREEN_UV"] = "#define SCREEN_UV_USED\n";
  1113. actions[VS::SHADER_SPATIAL].usage_defines["DIFFUSE_LIGHT"] = "#define USE_LIGHT_SHADER_CODE\n";
  1114. actions[VS::SHADER_SPATIAL].usage_defines["SPECULAR_LIGHT"] = "#define USE_LIGHT_SHADER_CODE\n";
  1115. actions[VS::SHADER_SPATIAL].render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n";
  1116. actions[VS::SHADER_SPATIAL].render_mode_defines["world_vertex_coords"] = "#define VERTEX_WORLD_COORDS_USED\n";
  1117. actions[VS::SHADER_SPATIAL].render_mode_defines["ensure_correct_normals"] = "#define ENSURE_CORRECT_NORMALS\n";
  1118. actions[VS::SHADER_SPATIAL].render_mode_defines["cull_front"] = "#define DO_SIDE_CHECK\n";
  1119. actions[VS::SHADER_SPATIAL].render_mode_defines["cull_disabled"] = "#define DO_SIDE_CHECK\n";
  1120. bool force_lambert = GLOBAL_GET("rendering/quality/shading/force_lambert_over_burley");
  1121. if (!force_lambert) {
  1122. actions[VS::SHADER_SPATIAL].render_mode_defines["diffuse_burley"] = "#define DIFFUSE_BURLEY\n";
  1123. }
  1124. actions[VS::SHADER_SPATIAL].render_mode_defines["diffuse_oren_nayar"] = "#define DIFFUSE_OREN_NAYAR\n";
  1125. actions[VS::SHADER_SPATIAL].render_mode_defines["diffuse_lambert_wrap"] = "#define DIFFUSE_LAMBERT_WRAP\n";
  1126. actions[VS::SHADER_SPATIAL].render_mode_defines["diffuse_toon"] = "#define DIFFUSE_TOON\n";
  1127. bool force_blinn = GLOBAL_GET("rendering/quality/shading/force_blinn_over_ggx");
  1128. if (!force_blinn) {
  1129. actions[VS::SHADER_SPATIAL].render_mode_defines["specular_schlick_ggx"] = "#define SPECULAR_SCHLICK_GGX\n";
  1130. } else {
  1131. actions[VS::SHADER_SPATIAL].render_mode_defines["specular_schlick_ggx"] = "#define SPECULAR_BLINN\n";
  1132. }
  1133. actions[VS::SHADER_SPATIAL].render_mode_defines["specular_blinn"] = "#define SPECULAR_BLINN\n";
  1134. actions[VS::SHADER_SPATIAL].render_mode_defines["specular_phong"] = "#define SPECULAR_PHONG\n";
  1135. actions[VS::SHADER_SPATIAL].render_mode_defines["specular_toon"] = "#define SPECULAR_TOON\n";
  1136. actions[VS::SHADER_SPATIAL].render_mode_defines["specular_disabled"] = "#define SPECULAR_DISABLED\n";
  1137. actions[VS::SHADER_SPATIAL].render_mode_defines["shadows_disabled"] = "#define SHADOWS_DISABLED\n";
  1138. actions[VS::SHADER_SPATIAL].render_mode_defines["ambient_light_disabled"] = "#define AMBIENT_LIGHT_DISABLED\n";
  1139. actions[VS::SHADER_SPATIAL].render_mode_defines["shadow_to_opacity"] = "#define USE_SHADOW_TO_OPACITY\n";
  1140. /* PARTICLES SHADER */
  1141. actions[VS::SHADER_PARTICLES].renames["COLOR"] = "out_color";
  1142. actions[VS::SHADER_PARTICLES].renames["VELOCITY"] = "out_velocity_active.xyz";
  1143. actions[VS::SHADER_PARTICLES].renames["MASS"] = "mass";
  1144. actions[VS::SHADER_PARTICLES].renames["ACTIVE"] = "shader_active";
  1145. actions[VS::SHADER_PARTICLES].renames["RESTART"] = "restart";
  1146. actions[VS::SHADER_PARTICLES].renames["CUSTOM"] = "out_custom";
  1147. actions[VS::SHADER_PARTICLES].renames["TRANSFORM"] = "xform";
  1148. actions[VS::SHADER_PARTICLES].renames["TIME"] = "time";
  1149. actions[VS::SHADER_PARTICLES].renames["LIFETIME"] = "lifetime";
  1150. actions[VS::SHADER_PARTICLES].renames["DELTA"] = "local_delta";
  1151. actions[VS::SHADER_PARTICLES].renames["NUMBER"] = "particle_number";
  1152. actions[VS::SHADER_PARTICLES].renames["INDEX"] = "index";
  1153. actions[VS::SHADER_PARTICLES].renames["GRAVITY"] = "current_gravity";
  1154. actions[VS::SHADER_PARTICLES].renames["EMISSION_TRANSFORM"] = "emission_transform";
  1155. actions[VS::SHADER_PARTICLES].renames["RANDOM_SEED"] = "random_seed";
  1156. actions[VS::SHADER_PARTICLES].render_mode_defines["disable_force"] = "#define DISABLE_FORCE\n";
  1157. actions[VS::SHADER_PARTICLES].render_mode_defines["disable_velocity"] = "#define DISABLE_VELOCITY\n";
  1158. actions[VS::SHADER_PARTICLES].render_mode_defines["keep_data"] = "#define ENABLE_KEEP_DATA\n";
  1159. vertex_name = "vertex";
  1160. fragment_name = "fragment";
  1161. light_name = "light";
  1162. time_name = "TIME";
  1163. List<String> func_list;
  1164. ShaderLanguage::get_builtin_funcs(&func_list);
  1165. for (List<String>::Element *E = func_list.front(); E; E = E->next()) {
  1166. internal_functions.insert(E->get());
  1167. }
  1168. }