visual_shader.cpp 65 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626
  1. /*************************************************************************/
  2. /* visual_shader.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #include "visual_shader.h"
  31. #include "core/vmap.h"
  32. #include "servers/visual/shader_types.h"
  33. void VisualShaderNode::set_output_port_for_preview(int p_index) {
  34. port_preview = p_index;
  35. }
  36. int VisualShaderNode::get_output_port_for_preview() const {
  37. return port_preview;
  38. }
  39. void VisualShaderNode::set_input_port_default_value(int p_port, const Variant &p_value) {
  40. default_input_values[p_port] = p_value;
  41. emit_changed();
  42. }
  43. Variant VisualShaderNode::get_input_port_default_value(int p_port) const {
  44. if (default_input_values.has(p_port)) {
  45. return default_input_values[p_port];
  46. }
  47. return Variant();
  48. }
  49. bool VisualShaderNode::is_port_separator(int p_index) const {
  50. return false;
  51. }
  52. Vector<VisualShader::DefaultTextureParam> VisualShaderNode::get_default_texture_parameters(VisualShader::Type p_type, int p_id) const {
  53. return Vector<VisualShader::DefaultTextureParam>();
  54. }
  55. String VisualShaderNode::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
  56. return String();
  57. }
  58. Vector<StringName> VisualShaderNode::get_editable_properties() const {
  59. return Vector<StringName>();
  60. }
  61. Array VisualShaderNode::_get_default_input_values() const {
  62. Array ret;
  63. for (Map<int, Variant>::Element *E = default_input_values.front(); E; E = E->next()) {
  64. ret.push_back(E->key());
  65. ret.push_back(E->get());
  66. }
  67. return ret;
  68. }
  69. void VisualShaderNode::_set_default_input_values(const Array &p_values) {
  70. if (p_values.size() % 2 == 0) {
  71. for (int i = 0; i < p_values.size(); i += 2) {
  72. default_input_values[p_values[i + 0]] = p_values[i + 1];
  73. }
  74. }
  75. emit_changed();
  76. }
  77. String VisualShaderNode::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const {
  78. return String();
  79. }
  80. void VisualShaderNode::_bind_methods() {
  81. ClassDB::bind_method(D_METHOD("set_output_port_for_preview", "port"), &VisualShaderNode::set_output_port_for_preview);
  82. ClassDB::bind_method(D_METHOD("get_output_port_for_preview"), &VisualShaderNode::get_output_port_for_preview);
  83. ClassDB::bind_method(D_METHOD("set_input_port_default_value", "port", "value"), &VisualShaderNode::set_input_port_default_value);
  84. ClassDB::bind_method(D_METHOD("get_input_port_default_value", "port"), &VisualShaderNode::get_input_port_default_value);
  85. ClassDB::bind_method(D_METHOD("_set_default_input_values", "values"), &VisualShaderNode::_set_default_input_values);
  86. ClassDB::bind_method(D_METHOD("_get_default_input_values"), &VisualShaderNode::_get_default_input_values);
  87. ADD_PROPERTY(PropertyInfo(Variant::INT, "output_port_for_preview"), "set_output_port_for_preview", "get_output_port_for_preview");
  88. ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "default_input_values", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_default_input_values", "_get_default_input_values");
  89. ADD_SIGNAL(MethodInfo("editor_refresh_request"));
  90. }
  91. VisualShaderNode::VisualShaderNode() {
  92. port_preview = -1;
  93. }
  94. /////////////////////////////////////////////////////////
  95. void VisualShader::add_node(Type p_type, const Ref<VisualShaderNode> &p_node, const Vector2 &p_position, int p_id) {
  96. ERR_FAIL_COND(p_node.is_null());
  97. ERR_FAIL_COND(p_id < 2);
  98. ERR_FAIL_INDEX(p_type, TYPE_MAX);
  99. Graph *g = &graph[p_type];
  100. ERR_FAIL_COND(g->nodes.has(p_id));
  101. Node n;
  102. n.node = p_node;
  103. n.position = p_position;
  104. Ref<VisualShaderNodeUniform> uniform = n.node;
  105. if (uniform.is_valid()) {
  106. String valid_name = validate_uniform_name(uniform->get_uniform_name(), uniform);
  107. uniform->set_uniform_name(valid_name);
  108. }
  109. Ref<VisualShaderNodeInput> input = n.node;
  110. if (input.is_valid()) {
  111. input->shader_mode = shader_mode;
  112. input->shader_type = p_type;
  113. input->connect("input_type_changed", this, "_input_type_changed", varray(p_type, p_id));
  114. }
  115. n.node->connect("changed", this, "_queue_update");
  116. g->nodes[p_id] = n;
  117. _queue_update();
  118. }
  119. void VisualShader::set_node_position(Type p_type, int p_id, const Vector2 &p_position) {
  120. ERR_FAIL_INDEX(p_type, TYPE_MAX);
  121. Graph *g = &graph[p_type];
  122. ERR_FAIL_COND(!g->nodes.has(p_id));
  123. g->nodes[p_id].position = p_position;
  124. }
  125. Vector2 VisualShader::get_node_position(Type p_type, int p_id) const {
  126. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, Vector2());
  127. const Graph *g = &graph[p_type];
  128. ERR_FAIL_COND_V(!g->nodes.has(p_id), Vector2());
  129. return g->nodes[p_id].position;
  130. }
  131. Ref<VisualShaderNode> VisualShader::get_node(Type p_type, int p_id) const {
  132. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, Ref<VisualShaderNode>());
  133. const Graph *g = &graph[p_type];
  134. ERR_FAIL_COND_V(!g->nodes.has(p_id), Ref<VisualShaderNode>());
  135. return g->nodes[p_id].node;
  136. }
  137. Vector<int> VisualShader::get_node_list(Type p_type) const {
  138. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, Vector<int>());
  139. const Graph *g = &graph[p_type];
  140. Vector<int> ret;
  141. for (Map<int, Node>::Element *E = g->nodes.front(); E; E = E->next()) {
  142. ret.push_back(E->key());
  143. }
  144. return ret;
  145. }
  146. int VisualShader::get_valid_node_id(Type p_type) const {
  147. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, NODE_ID_INVALID);
  148. const Graph *g = &graph[p_type];
  149. return g->nodes.size() ? MAX(2, g->nodes.back()->key() + 1) : 2;
  150. }
  151. int VisualShader::find_node_id(Type p_type, const Ref<VisualShaderNode> &p_node) const {
  152. for (const Map<int, Node>::Element *E = graph[p_type].nodes.front(); E; E = E->next()) {
  153. if (E->get().node == p_node)
  154. return E->key();
  155. }
  156. return NODE_ID_INVALID;
  157. }
  158. void VisualShader::remove_node(Type p_type, int p_id) {
  159. ERR_FAIL_INDEX(p_type, TYPE_MAX);
  160. ERR_FAIL_COND(p_id < 2);
  161. Graph *g = &graph[p_type];
  162. ERR_FAIL_COND(!g->nodes.has(p_id));
  163. Ref<VisualShaderNodeInput> input = g->nodes[p_id].node;
  164. if (input.is_valid()) {
  165. input->disconnect("input_type_changed", this, "_input_type_changed");
  166. }
  167. g->nodes[p_id].node->disconnect("changed", this, "_queue_update");
  168. g->nodes.erase(p_id);
  169. for (List<Connection>::Element *E = g->connections.front(); E;) {
  170. List<Connection>::Element *N = E->next();
  171. if (E->get().from_node == p_id || E->get().to_node == p_id) {
  172. g->connections.erase(E);
  173. }
  174. E = N;
  175. }
  176. _queue_update();
  177. }
  178. bool VisualShader::is_node_connection(Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) const {
  179. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, false);
  180. const Graph *g = &graph[p_type];
  181. for (const List<Connection>::Element *E = g->connections.front(); E; E = E->next()) {
  182. if (E->get().from_node == p_from_node && E->get().from_port == p_from_port && E->get().to_node == p_to_node && E->get().to_port == p_to_port) {
  183. return true;
  184. }
  185. }
  186. return false;
  187. }
  188. bool VisualShader::can_connect_nodes(Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) const {
  189. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, false);
  190. const Graph *g = &graph[p_type];
  191. if (!g->nodes.has(p_from_node))
  192. return false;
  193. if (p_from_port < 0 || p_from_port >= g->nodes[p_from_node].node->get_output_port_count())
  194. return false;
  195. if (!g->nodes.has(p_to_node))
  196. return false;
  197. if (p_to_port < 0 || p_to_port >= g->nodes[p_to_node].node->get_input_port_count())
  198. return false;
  199. VisualShaderNode::PortType from_port_type = g->nodes[p_from_node].node->get_output_port_type(p_from_port);
  200. VisualShaderNode::PortType to_port_type = g->nodes[p_to_node].node->get_input_port_type(p_to_port);
  201. if (MAX(0, from_port_type - 2) != (MAX(0, to_port_type - 2))) {
  202. return false;
  203. }
  204. for (const List<Connection>::Element *E = g->connections.front(); E; E = E->next()) {
  205. if (E->get().from_node == p_from_node && E->get().from_port == p_from_port && E->get().to_node == p_to_node && E->get().to_port == p_to_port) {
  206. return false;
  207. }
  208. }
  209. return true;
  210. }
  211. Error VisualShader::connect_nodes(Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) {
  212. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, ERR_CANT_CONNECT);
  213. Graph *g = &graph[p_type];
  214. ERR_FAIL_COND_V(!g->nodes.has(p_from_node), ERR_INVALID_PARAMETER);
  215. ERR_FAIL_INDEX_V(p_from_port, g->nodes[p_from_node].node->get_output_port_count(), ERR_INVALID_PARAMETER);
  216. ERR_FAIL_COND_V(!g->nodes.has(p_to_node), ERR_INVALID_PARAMETER);
  217. ERR_FAIL_INDEX_V(p_to_port, g->nodes[p_to_node].node->get_input_port_count(), ERR_INVALID_PARAMETER);
  218. VisualShaderNode::PortType from_port_type = g->nodes[p_from_node].node->get_output_port_type(p_from_port);
  219. VisualShaderNode::PortType to_port_type = g->nodes[p_to_node].node->get_input_port_type(p_to_port);
  220. if (MAX(0, from_port_type - 2) != (MAX(0, to_port_type - 2))) {
  221. ERR_EXPLAIN("Incompatible port types (scalar/vec/bool with transform");
  222. ERR_FAIL_V(ERR_INVALID_PARAMETER)
  223. return ERR_INVALID_PARAMETER;
  224. }
  225. for (List<Connection>::Element *E = g->connections.front(); E; E = E->next()) {
  226. if (E->get().from_node == p_from_node && E->get().from_port == p_from_port && E->get().to_node == p_to_node && E->get().to_port == p_to_port) {
  227. ERR_FAIL_V(ERR_ALREADY_EXISTS);
  228. }
  229. }
  230. Connection c;
  231. c.from_node = p_from_node;
  232. c.from_port = p_from_port;
  233. c.to_node = p_to_node;
  234. c.to_port = p_to_port;
  235. g->connections.push_back(c);
  236. _queue_update();
  237. return OK;
  238. }
  239. void VisualShader::disconnect_nodes(Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) {
  240. ERR_FAIL_INDEX(p_type, TYPE_MAX);
  241. Graph *g = &graph[p_type];
  242. for (List<Connection>::Element *E = g->connections.front(); E; E = E->next()) {
  243. if (E->get().from_node == p_from_node && E->get().from_port == p_from_port && E->get().to_node == p_to_node && E->get().to_port == p_to_port) {
  244. g->connections.erase(E);
  245. _queue_update();
  246. return;
  247. }
  248. }
  249. }
  250. Array VisualShader::_get_node_connections(Type p_type) const {
  251. ERR_FAIL_INDEX_V(p_type, TYPE_MAX, Array());
  252. const Graph *g = &graph[p_type];
  253. Array ret;
  254. for (const List<Connection>::Element *E = g->connections.front(); E; E = E->next()) {
  255. Dictionary d;
  256. d["from_node"] = E->get().from_node;
  257. d["from_port"] = E->get().from_port;
  258. d["to_node"] = E->get().to_node;
  259. d["to_port"] = E->get().to_port;
  260. ret.push_back(d);
  261. }
  262. return ret;
  263. }
  264. void VisualShader::get_node_connections(Type p_type, List<Connection> *r_connections) const {
  265. ERR_FAIL_INDEX(p_type, TYPE_MAX);
  266. const Graph *g = &graph[p_type];
  267. for (const List<Connection>::Element *E = g->connections.front(); E; E = E->next()) {
  268. r_connections->push_back(E->get());
  269. }
  270. }
  271. void VisualShader::set_mode(Mode p_mode) {
  272. if (shader_mode == p_mode) {
  273. return;
  274. }
  275. //erase input/output connections
  276. modes.clear();
  277. flags.clear();
  278. shader_mode = p_mode;
  279. for (int i = 0; i < TYPE_MAX; i++) {
  280. for (Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) {
  281. Ref<VisualShaderNodeInput> input = E->get().node;
  282. if (input.is_valid()) {
  283. input->shader_mode = shader_mode;
  284. //input->input_index = 0;
  285. }
  286. }
  287. Ref<VisualShaderNodeOutput> output = graph[i].nodes[NODE_ID_OUTPUT].node;
  288. output->shader_mode = shader_mode;
  289. // clear connections since they are no longer valid
  290. for (List<Connection>::Element *E = graph[i].connections.front(); E;) {
  291. bool keep = true;
  292. List<Connection>::Element *N = E->next();
  293. int from = E->get().from_node;
  294. int to = E->get().to_node;
  295. if (!graph[i].nodes.has(from)) {
  296. keep = false;
  297. } else {
  298. Ref<VisualShaderNode> from_node = graph[i].nodes[from].node;
  299. if (from_node->is_class("VisualShaderNodeOutput") || from_node->is_class("VisualShaderNodeInput")) {
  300. keep = false;
  301. }
  302. }
  303. if (!graph[i].nodes.has(to)) {
  304. keep = false;
  305. } else {
  306. Ref<VisualShaderNode> to_node = graph[i].nodes[to].node;
  307. if (to_node->is_class("VisualShaderNodeOutput") || to_node->is_class("VisualShaderNodeInput")) {
  308. keep = false;
  309. }
  310. }
  311. if (!keep) {
  312. graph[i].connections.erase(E);
  313. }
  314. E = N;
  315. }
  316. }
  317. _queue_update();
  318. _change_notify();
  319. }
  320. void VisualShader::set_graph_offset(const Vector2 &p_offset) {
  321. graph_offset = p_offset;
  322. }
  323. Vector2 VisualShader::get_graph_offset() const {
  324. return graph_offset;
  325. }
  326. Shader::Mode VisualShader::get_mode() const {
  327. return shader_mode;
  328. }
  329. bool VisualShader::is_text_shader() const {
  330. return false;
  331. }
  332. String VisualShader::generate_preview_shader(Type p_type, int p_node, int p_port, Vector<DefaultTextureParam> &default_tex_params) const {
  333. Ref<VisualShaderNode> node = get_node(p_type, p_node);
  334. ERR_FAIL_COND_V(!node.is_valid(), String());
  335. ERR_FAIL_COND_V(p_port < 0 || p_port >= node->get_output_port_count(), String());
  336. ERR_FAIL_COND_V(node->get_output_port_type(p_port) == VisualShaderNode::PORT_TYPE_TRANSFORM, String());
  337. StringBuilder global_code;
  338. StringBuilder code;
  339. global_code += String() + "shader_type canvas_item;\n";
  340. //make it faster to go around through shader
  341. VMap<ConnectionKey, const List<Connection>::Element *> input_connections;
  342. VMap<ConnectionKey, const List<Connection>::Element *> output_connections;
  343. for (const List<Connection>::Element *E = graph[p_type].connections.front(); E; E = E->next()) {
  344. ConnectionKey from_key;
  345. from_key.node = E->get().from_node;
  346. from_key.port = E->get().from_port;
  347. output_connections.insert(from_key, E);
  348. ConnectionKey to_key;
  349. to_key.node = E->get().to_node;
  350. to_key.port = E->get().to_port;
  351. input_connections.insert(to_key, E);
  352. }
  353. code += "\nvoid fragment() {\n";
  354. Set<int> processed;
  355. Error err = _write_node(p_type, global_code, code, default_tex_params, input_connections, output_connections, p_node, processed, true);
  356. ERR_FAIL_COND_V(err != OK, String());
  357. if (node->get_output_port_type(p_port) == VisualShaderNode::PORT_TYPE_SCALAR) {
  358. code += "\tCOLOR.rgb = vec3( n_out" + itos(p_node) + "p" + itos(p_port) + " );\n";
  359. } else if (node->get_output_port_type(p_port) == VisualShaderNode::PORT_TYPE_BOOLEAN) {
  360. code += "\tCOLOR.rgb = vec3( n_out" + itos(p_node) + "p" + itos(p_port) + " ? 1.0 : 0.0 );\n";
  361. } else {
  362. code += "\tCOLOR.rgb = n_out" + itos(p_node) + "p" + itos(p_port) + ";\n";
  363. }
  364. code += "}\n";
  365. //set code secretly
  366. global_code += "\n\n";
  367. String final_code = global_code;
  368. final_code += code;
  369. return final_code;
  370. }
  371. #define IS_INITIAL_CHAR(m_d) (((m_d) >= 'a' && (m_d) <= 'z') || ((m_d) >= 'A' && (m_d) <= 'Z'))
  372. #define IS_SYMBOL_CHAR(m_d) (((m_d) >= 'a' && (m_d) <= 'z') || ((m_d) >= 'A' && (m_d) <= 'Z') || ((m_d) >= '0' && (m_d) <= '9') || (m_d) == '_')
  373. String VisualShader::validate_uniform_name(const String &p_name, const Ref<VisualShaderNodeUniform> &p_uniform) const {
  374. String name = p_name; //validate name first
  375. while (name.length() && !IS_INITIAL_CHAR(name[0])) {
  376. name = name.substr(1, name.length() - 1);
  377. }
  378. if (name != String()) {
  379. String valid_name;
  380. for (int i = 0; i < name.length(); i++) {
  381. if (IS_SYMBOL_CHAR(name[i])) {
  382. valid_name += String::chr(name[i]);
  383. } else if (name[i] == ' ') {
  384. valid_name += "_";
  385. }
  386. }
  387. name = valid_name;
  388. }
  389. if (name == String()) {
  390. name = p_uniform->get_caption();
  391. }
  392. int attempt = 1;
  393. while (true) {
  394. bool exists = false;
  395. for (int i = 0; i < TYPE_MAX; i++) {
  396. for (const Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) {
  397. Ref<VisualShaderNodeUniform> node = E->get().node;
  398. if (node == p_uniform) { //do not test on self
  399. continue;
  400. }
  401. if (node.is_valid() && node->get_uniform_name() == name) {
  402. exists = true;
  403. break;
  404. }
  405. }
  406. if (exists) {
  407. break;
  408. }
  409. }
  410. if (exists) {
  411. //remove numbers, put new and try again
  412. attempt++;
  413. while (name.length() && name[name.length() - 1] >= '0' && name[name.length() - 1] <= '9') {
  414. name = name.substr(0, name.length() - 1);
  415. }
  416. ERR_FAIL_COND_V(name == String(), String());
  417. name += itos(attempt);
  418. } else {
  419. break;
  420. }
  421. }
  422. return name;
  423. }
  424. VisualShader::RenderModeEnums VisualShader::render_mode_enums[] = {
  425. { Shader::MODE_SPATIAL, "blend" },
  426. { Shader::MODE_SPATIAL, "depth_draw" },
  427. { Shader::MODE_SPATIAL, "cull" },
  428. { Shader::MODE_SPATIAL, "diffuse" },
  429. { Shader::MODE_SPATIAL, "specular" },
  430. { Shader::MODE_CANVAS_ITEM, "blend" },
  431. { Shader::MODE_CANVAS_ITEM, NULL }
  432. };
  433. static const char *type_string[VisualShader::TYPE_MAX] = {
  434. "vertex",
  435. "fragment",
  436. "light"
  437. };
  438. bool VisualShader::_set(const StringName &p_name, const Variant &p_value) {
  439. String name = p_name;
  440. if (name == "mode") {
  441. set_mode(Shader::Mode(int(p_value)));
  442. return true;
  443. } else if (name.begins_with("flags/")) {
  444. StringName flag = name.get_slicec('/', 1);
  445. bool enable = p_value;
  446. if (enable) {
  447. flags.insert(flag);
  448. } else {
  449. flags.erase(flag);
  450. }
  451. _queue_update();
  452. return true;
  453. } else if (name.begins_with("modes/")) {
  454. String mode = name.get_slicec('/', 1);
  455. int value = p_value;
  456. if (value == 0) {
  457. modes.erase(mode); //means it's default anyway, so don't store it
  458. } else {
  459. modes[mode] = value;
  460. }
  461. _queue_update();
  462. return true;
  463. } else if (name.begins_with("nodes/")) {
  464. String typestr = name.get_slicec('/', 1);
  465. Type type = TYPE_VERTEX;
  466. for (int i = 0; i < TYPE_MAX; i++) {
  467. if (typestr == type_string[i]) {
  468. type = Type(i);
  469. break;
  470. }
  471. }
  472. String index = name.get_slicec('/', 2);
  473. if (index == "connections") {
  474. Vector<int> conns = p_value;
  475. if (conns.size() % 4 == 0) {
  476. for (int i = 0; i < conns.size(); i += 4) {
  477. connect_nodes(type, conns[i + 0], conns[i + 1], conns[i + 2], conns[i + 3]);
  478. }
  479. }
  480. return true;
  481. }
  482. int id = index.to_int();
  483. String what = name.get_slicec('/', 3);
  484. if (what == "node") {
  485. add_node(type, p_value, Vector2(), id);
  486. return true;
  487. } else if (what == "position") {
  488. set_node_position(type, id, p_value);
  489. return true;
  490. }
  491. }
  492. return false;
  493. }
  494. bool VisualShader::_get(const StringName &p_name, Variant &r_ret) const {
  495. String name = p_name;
  496. if (name == "mode") {
  497. r_ret = get_mode();
  498. return true;
  499. } else if (name.begins_with("flags/")) {
  500. StringName flag = name.get_slicec('/', 1);
  501. r_ret = flags.has(flag);
  502. return true;
  503. } else if (name.begins_with("modes/")) {
  504. String mode = name.get_slicec('/', 1);
  505. if (modes.has(mode)) {
  506. r_ret = modes[mode];
  507. } else {
  508. r_ret = 0;
  509. }
  510. return true;
  511. } else if (name.begins_with("nodes/")) {
  512. String typestr = name.get_slicec('/', 1);
  513. Type type = TYPE_VERTEX;
  514. for (int i = 0; i < TYPE_MAX; i++) {
  515. if (typestr == type_string[i]) {
  516. type = Type(i);
  517. break;
  518. }
  519. }
  520. String index = name.get_slicec('/', 2);
  521. if (index == "connections") {
  522. Vector<int> conns;
  523. for (const List<Connection>::Element *E = graph[type].connections.front(); E; E = E->next()) {
  524. conns.push_back(E->get().from_node);
  525. conns.push_back(E->get().from_port);
  526. conns.push_back(E->get().to_node);
  527. conns.push_back(E->get().to_port);
  528. }
  529. r_ret = conns;
  530. return true;
  531. }
  532. int id = index.to_int();
  533. String what = name.get_slicec('/', 3);
  534. if (what == "node") {
  535. r_ret = get_node(type, id);
  536. return true;
  537. } else if (what == "position") {
  538. r_ret = get_node_position(type, id);
  539. return true;
  540. }
  541. }
  542. return false;
  543. }
  544. void VisualShader::_get_property_list(List<PropertyInfo> *p_list) const {
  545. //mode
  546. p_list->push_back(PropertyInfo(Variant::INT, "mode", PROPERTY_HINT_ENUM, "Spatial,CanvasItem,Particles"));
  547. //render modes
  548. Map<String, String> blend_mode_enums;
  549. Set<String> toggles;
  550. for (int i = 0; i < ShaderTypes::get_singleton()->get_modes(VisualServer::ShaderMode(shader_mode)).size(); i++) {
  551. String mode = ShaderTypes::get_singleton()->get_modes(VisualServer::ShaderMode(shader_mode))[i];
  552. int idx = 0;
  553. bool in_enum = false;
  554. while (render_mode_enums[idx].string) {
  555. if (mode.begins_with(render_mode_enums[idx].string)) {
  556. String begin = render_mode_enums[idx].string;
  557. String option = mode.replace_first(begin + "_", "");
  558. if (!blend_mode_enums.has(begin)) {
  559. blend_mode_enums[begin] = option;
  560. } else {
  561. blend_mode_enums[begin] += "," + option;
  562. }
  563. in_enum = true;
  564. break;
  565. }
  566. idx++;
  567. }
  568. if (!in_enum) {
  569. toggles.insert(mode);
  570. }
  571. }
  572. for (Map<String, String>::Element *E = blend_mode_enums.front(); E; E = E->next()) {
  573. p_list->push_back(PropertyInfo(Variant::INT, "modes/" + E->key(), PROPERTY_HINT_ENUM, E->get()));
  574. }
  575. for (Set<String>::Element *E = toggles.front(); E; E = E->next()) {
  576. p_list->push_back(PropertyInfo(Variant::BOOL, "flags/" + E->get()));
  577. }
  578. for (int i = 0; i < TYPE_MAX; i++) {
  579. for (Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) {
  580. String prop_name = "nodes/";
  581. prop_name += type_string[i];
  582. prop_name += "/" + itos(E->key());
  583. if (E->key() != NODE_ID_OUTPUT) {
  584. p_list->push_back(PropertyInfo(Variant::OBJECT, prop_name + "/node", PROPERTY_HINT_RESOURCE_TYPE, "VisualShaderNode", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_DO_NOT_SHARE_ON_DUPLICATE));
  585. }
  586. p_list->push_back(PropertyInfo(Variant::VECTOR2, prop_name + "/position", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR));
  587. }
  588. p_list->push_back(PropertyInfo(Variant::POOL_INT_ARRAY, "nodes/" + String(type_string[i]) + "/connections", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR));
  589. }
  590. }
  591. Error VisualShader::_write_node(Type type, StringBuilder &global_code, StringBuilder &code, Vector<VisualShader::DefaultTextureParam> &def_tex_params, const VMap<ConnectionKey, const List<Connection>::Element *> &input_connections, const VMap<ConnectionKey, const List<Connection>::Element *> &output_connections, int node, Set<int> &processed, bool for_preview) const {
  592. const Ref<VisualShaderNode> vsnode = graph[type].nodes[node].node;
  593. //check inputs recursively first
  594. int input_count = vsnode->get_input_port_count();
  595. for (int i = 0; i < input_count; i++) {
  596. ConnectionKey ck;
  597. ck.node = node;
  598. ck.port = i;
  599. if (input_connections.has(ck)) {
  600. int from_node = input_connections[ck]->get().from_node;
  601. if (processed.has(from_node)) {
  602. continue;
  603. }
  604. Error err = _write_node(type, global_code, code, def_tex_params, input_connections, output_connections, from_node, processed, for_preview);
  605. if (err)
  606. return err;
  607. }
  608. }
  609. // then this node
  610. code += "// " + vsnode->get_caption() + ":" + itos(node) + "\n";
  611. Vector<String> input_vars;
  612. input_vars.resize(vsnode->get_input_port_count());
  613. String *inputs = input_vars.ptrw();
  614. for (int i = 0; i < input_count; i++) {
  615. ConnectionKey ck;
  616. ck.node = node;
  617. ck.port = i;
  618. if (input_connections.has(ck)) {
  619. //connected to something, use that output
  620. int from_node = input_connections[ck]->get().from_node;
  621. int from_port = input_connections[ck]->get().from_port;
  622. VisualShaderNode::PortType in_type = vsnode->get_input_port_type(i);
  623. VisualShaderNode::PortType out_type = graph[type].nodes[from_node].node->get_output_port_type(from_port);
  624. String src_var = "n_out" + itos(from_node) + "p" + itos(from_port);
  625. if (in_type == out_type) {
  626. inputs[i] = src_var;
  627. } else if (in_type == VisualShaderNode::PORT_TYPE_SCALAR && out_type == VisualShaderNode::PORT_TYPE_VECTOR) {
  628. inputs[i] = "dot(" + src_var + ",vec3(0.333333,0.333333,0.333333))";
  629. } else if (in_type == VisualShaderNode::PORT_TYPE_VECTOR && out_type == VisualShaderNode::PORT_TYPE_SCALAR) {
  630. inputs[i] = "vec3(" + src_var + ")";
  631. } else if (in_type == VisualShaderNode::PORT_TYPE_BOOLEAN && out_type == VisualShaderNode::PORT_TYPE_VECTOR) {
  632. inputs[i] = "all(" + src_var + ")";
  633. } else if (in_type == VisualShaderNode::PORT_TYPE_BOOLEAN && out_type == VisualShaderNode::PORT_TYPE_SCALAR) {
  634. inputs[i] = src_var + ">0.0?true:false";
  635. } else if (in_type == VisualShaderNode::PORT_TYPE_SCALAR && out_type == VisualShaderNode::PORT_TYPE_BOOLEAN) {
  636. inputs[i] = src_var + "?1.0:0.0";
  637. } else if (in_type == VisualShaderNode::PORT_TYPE_VECTOR && out_type == VisualShaderNode::PORT_TYPE_BOOLEAN) {
  638. inputs[i] = "vec3(" + src_var + "?1.0:0.0)";
  639. }
  640. } else {
  641. Variant defval = vsnode->get_input_port_default_value(i);
  642. if (defval.get_type() == Variant::REAL || defval.get_type() == Variant::INT) {
  643. float val = defval;
  644. inputs[i] = "n_in" + itos(node) + "p" + itos(i);
  645. code += "\tfloat " + inputs[i] + " = " + vformat("%.5f", val) + ";\n";
  646. } else if (defval.get_type() == Variant::BOOL) {
  647. bool val = defval;
  648. inputs[i] = "n_in" + itos(node) + "p" + itos(i);
  649. code += "\nbool " + inputs[i] + " = " + (val ? "true" : "false") + ";\n";
  650. } else if (defval.get_type() == Variant::VECTOR3) {
  651. Vector3 val = defval;
  652. inputs[i] = "n_in" + itos(node) + "p" + itos(i);
  653. code += "\tvec3 " + inputs[i] + " = " + vformat("vec3(%.5f,%.5f,%.5f);\n", val.x, val.y, val.z);
  654. } else if (defval.get_type() == Variant::TRANSFORM) {
  655. Transform val = defval;
  656. val.basis.transpose();
  657. inputs[i] = "n_in" + itos(node) + "p" + itos(i);
  658. Array values;
  659. for (int j = 0; j < 3; j++) {
  660. values.push_back(val.basis[j].x);
  661. values.push_back(val.basis[j].y);
  662. values.push_back(val.basis[j].z);
  663. }
  664. values.push_back(val.origin.x);
  665. values.push_back(val.origin.y);
  666. values.push_back(val.origin.z);
  667. bool err = false;
  668. code += "\tmat4 " + inputs[i] + " = " + String("mat4( vec4(%.5f,%.5f,%.5f,0.0),vec4(%.5f,%.5f,%.5f,0.0),vec4(%.5f,%.5f,%.5f,0.0),vec4(%.5f,%.5f,%.5f,1.0) );\n").sprintf(values, &err);
  669. } else {
  670. //will go empty, node is expected to know what it is doing at this point and handle it
  671. }
  672. }
  673. }
  674. int output_count = vsnode->get_output_port_count();
  675. Vector<String> output_vars;
  676. output_vars.resize(vsnode->get_output_port_count());
  677. String *outputs = output_vars.ptrw();
  678. for (int i = 0; i < output_count; i++) {
  679. outputs[i] = "n_out" + itos(node) + "p" + itos(i);
  680. switch (vsnode->get_output_port_type(i)) {
  681. case VisualShaderNode::PORT_TYPE_SCALAR: code += String() + "\tfloat " + outputs[i] + ";\n"; break;
  682. case VisualShaderNode::PORT_TYPE_VECTOR: code += String() + "\tvec3 " + outputs[i] + ";\n"; break;
  683. case VisualShaderNode::PORT_TYPE_BOOLEAN: code += String() + "\tbool " + outputs[i] + ";\n"; break;
  684. case VisualShaderNode::PORT_TYPE_TRANSFORM: code += String() + "\tmat4 " + outputs[i] + ";\n"; break;
  685. default: {
  686. }
  687. }
  688. }
  689. Vector<VisualShader::DefaultTextureParam> params = vsnode->get_default_texture_parameters(type, node);
  690. for (int i = 0; i < params.size(); i++) {
  691. def_tex_params.push_back(params[i]);
  692. }
  693. Ref<VisualShaderNodeInput> input = vsnode;
  694. bool skip_global = input.is_valid() && for_preview;
  695. if (!skip_global) {
  696. global_code += vsnode->generate_global(get_mode(), type, node);
  697. }
  698. //handle normally
  699. code += vsnode->generate_code(get_mode(), type, node, inputs, outputs, for_preview);
  700. code += "\n"; //
  701. processed.insert(node);
  702. return OK;
  703. }
  704. void VisualShader::_update_shader() const {
  705. if (!dirty)
  706. return;
  707. dirty = false;
  708. StringBuilder global_code;
  709. StringBuilder code;
  710. Vector<VisualShader::DefaultTextureParam> default_tex_params;
  711. static const char *shader_mode_str[Shader::MODE_MAX] = { "spatial", "canvas_item", "particles" };
  712. global_code += String() + "shader_type " + shader_mode_str[shader_mode] + ";\n";
  713. String render_mode;
  714. {
  715. //fill render mode enums
  716. int idx = 0;
  717. while (render_mode_enums[idx].string) {
  718. if (shader_mode == render_mode_enums[idx].mode) {
  719. if (modes.has(render_mode_enums[idx].string)) {
  720. int which = modes[render_mode_enums[idx].string];
  721. int count = 0;
  722. for (int i = 0; i < ShaderTypes::get_singleton()->get_modes(VisualServer::ShaderMode(shader_mode)).size(); i++) {
  723. String mode = ShaderTypes::get_singleton()->get_modes(VisualServer::ShaderMode(shader_mode))[i];
  724. if (mode.begins_with(render_mode_enums[idx].string)) {
  725. if (count == which) {
  726. if (render_mode != String()) {
  727. render_mode += ", ";
  728. }
  729. render_mode += mode;
  730. break;
  731. }
  732. count++;
  733. }
  734. }
  735. }
  736. }
  737. idx++;
  738. }
  739. //fill render mode flags
  740. for (int i = 0; i < ShaderTypes::get_singleton()->get_modes(VisualServer::ShaderMode(shader_mode)).size(); i++) {
  741. String mode = ShaderTypes::get_singleton()->get_modes(VisualServer::ShaderMode(shader_mode))[i];
  742. if (flags.has(mode)) {
  743. if (render_mode != String()) {
  744. render_mode += ", ";
  745. }
  746. render_mode += mode;
  747. }
  748. }
  749. }
  750. if (render_mode != String()) {
  751. global_code += "render_mode " + render_mode + ";\n\n";
  752. }
  753. static const char *func_name[TYPE_MAX] = { "vertex", "fragment", "light" };
  754. for (int i = 0; i < TYPE_MAX; i++) {
  755. //make it faster to go around through shader
  756. VMap<ConnectionKey, const List<Connection>::Element *> input_connections;
  757. VMap<ConnectionKey, const List<Connection>::Element *> output_connections;
  758. for (const List<Connection>::Element *E = graph[i].connections.front(); E; E = E->next()) {
  759. ConnectionKey from_key;
  760. from_key.node = E->get().from_node;
  761. from_key.port = E->get().from_port;
  762. output_connections.insert(from_key, E);
  763. ConnectionKey to_key;
  764. to_key.node = E->get().to_node;
  765. to_key.port = E->get().to_port;
  766. input_connections.insert(to_key, E);
  767. }
  768. code += "\nvoid " + String(func_name[i]) + "() {\n";
  769. Set<int> processed;
  770. Error err = _write_node(Type(i), global_code, code, default_tex_params, input_connections, output_connections, NODE_ID_OUTPUT, processed, false);
  771. ERR_FAIL_COND(err != OK);
  772. code += "}\n";
  773. }
  774. //set code secretly
  775. global_code += "\n\n";
  776. String final_code = global_code;
  777. final_code += code;
  778. const_cast<VisualShader *>(this)->set_code(final_code);
  779. for (int i = 0; i < default_tex_params.size(); i++) {
  780. const_cast<VisualShader *>(this)->set_default_texture_param(default_tex_params[i].name, default_tex_params[i].param);
  781. }
  782. }
  783. void VisualShader::_queue_update() {
  784. if (dirty) {
  785. return;
  786. }
  787. dirty = true;
  788. call_deferred("_update_shader");
  789. }
  790. void VisualShader::_input_type_changed(Type p_type, int p_id) {
  791. //erase connections using this input, as type changed
  792. Graph *g = &graph[p_type];
  793. for (List<Connection>::Element *E = g->connections.front(); E;) {
  794. List<Connection>::Element *N = E->next();
  795. if (E->get().from_node == p_id) {
  796. g->connections.erase(E);
  797. }
  798. E = N;
  799. }
  800. }
  801. void VisualShader::_bind_methods() {
  802. ClassDB::bind_method(D_METHOD("set_mode", "mode"), &VisualShader::set_mode);
  803. ClassDB::bind_method(D_METHOD("add_node", "type", "node", "position", "id"), &VisualShader::add_node);
  804. ClassDB::bind_method(D_METHOD("set_node_position", "type", "id", "position"), &VisualShader::set_node_position);
  805. ClassDB::bind_method(D_METHOD("get_node", "type", "id"), &VisualShader::get_node);
  806. ClassDB::bind_method(D_METHOD("get_node_position", "type", "id"), &VisualShader::get_node_position);
  807. ClassDB::bind_method(D_METHOD("get_node_list", "type"), &VisualShader::get_node_list);
  808. ClassDB::bind_method(D_METHOD("get_valid_node_id", "type"), &VisualShader::get_valid_node_id);
  809. ClassDB::bind_method(D_METHOD("remove_node", "type", "id"), &VisualShader::remove_node);
  810. ClassDB::bind_method(D_METHOD("is_node_connection", "type", "from_node", "from_port", "to_node", "to_port"), &VisualShader::is_node_connection);
  811. ClassDB::bind_method(D_METHOD("can_connect_nodes", "type", "from_node", "from_port", "to_node", "to_port"), &VisualShader::is_node_connection);
  812. ClassDB::bind_method(D_METHOD("connect_nodes", "type", "from_node", "from_port", "to_node", "to_port"), &VisualShader::connect_nodes);
  813. ClassDB::bind_method(D_METHOD("disconnect_nodes", "type", "from_node", "from_port", "to_node", "to_port"), &VisualShader::disconnect_nodes);
  814. ClassDB::bind_method(D_METHOD("get_node_connections", "type"), &VisualShader::_get_node_connections);
  815. ClassDB::bind_method(D_METHOD("set_graph_offset", "offset"), &VisualShader::set_graph_offset);
  816. ClassDB::bind_method(D_METHOD("get_graph_offset"), &VisualShader::get_graph_offset);
  817. ClassDB::bind_method(D_METHOD("_queue_update"), &VisualShader::_queue_update);
  818. ClassDB::bind_method(D_METHOD("_update_shader"), &VisualShader::_update_shader);
  819. ClassDB::bind_method(D_METHOD("_input_type_changed"), &VisualShader::_input_type_changed);
  820. ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "graph_offset", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_graph_offset", "get_graph_offset");
  821. BIND_ENUM_CONSTANT(TYPE_VERTEX);
  822. BIND_ENUM_CONSTANT(TYPE_FRAGMENT);
  823. BIND_ENUM_CONSTANT(TYPE_LIGHT);
  824. BIND_ENUM_CONSTANT(TYPE_MAX);
  825. BIND_CONSTANT(NODE_ID_INVALID);
  826. BIND_CONSTANT(NODE_ID_OUTPUT);
  827. }
  828. VisualShader::VisualShader() {
  829. shader_mode = Shader::MODE_SPATIAL;
  830. for (int i = 0; i < TYPE_MAX; i++) {
  831. Ref<VisualShaderNodeOutput> output;
  832. output.instance();
  833. output->shader_type = Type(i);
  834. output->shader_mode = shader_mode;
  835. graph[i].nodes[NODE_ID_OUTPUT].node = output;
  836. graph[i].nodes[NODE_ID_OUTPUT].position = Vector2(400, 150);
  837. }
  838. dirty = true;
  839. }
  840. ///////////////////////////////////////////////////////////
  841. const VisualShaderNodeInput::Port VisualShaderNodeInput::ports[] = {
  842. // Spatial, Vertex
  843. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "vertex", "VERTEX" },
  844. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "NORMAL" },
  845. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "tangent", "TANGENT" },
  846. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "binormal", "BINORMAL" },
  847. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV,0.0)" },
  848. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "uv2", "vec3(UV2,0.0)" },
  849. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  850. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  851. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "point_size", "POINT_SIZE" },
  852. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "world", "WORLD_MATRIX" },
  853. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "modelview", "MODELVIEW_MATRIX" },
  854. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "camera", "CAMERA_MATRIX" },
  855. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "inv_camera", "INV_CAMERA_MATRIX" },
  856. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "projection", "PROJECTION_MATRIX" },
  857. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "inv_projection", "INV_PROJECTION_MATRIX" },
  858. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  859. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "viewport_size", "vec3(VIEWPORT_SIZE, 0)" },
  860. // Spatial, Fragment
  861. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "fragcoord", "FRAGCOORD.xyz" },
  862. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "vertex", "VERTEX" },
  863. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "NORMAL" },
  864. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "tangent", "TANGENT" },
  865. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "binormal", "BINORMAL" },
  866. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "view", "VIEW" },
  867. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV,0.0)" },
  868. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "uv2", "vec3(UV2,0.0)" },
  869. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  870. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  871. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "point_coord", "vec3(POINT_COORD,0.0)" },
  872. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_uv", "vec3(SCREEN_UV,0.0)" },
  873. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "side", "float(FRONT_FACING ? 1.0 : 0.0)" },
  874. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_TRANSFORM, "world", "WORLD_MATRIX" },
  875. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_TRANSFORM, "inv_camera", "INV_CAMERA_MATRIX" },
  876. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_TRANSFORM, "camera", "CAMERA_MATRIX" },
  877. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_TRANSFORM, "projection", "PROJECTION_MATRIX" },
  878. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_TRANSFORM, "inv_projection", "INV_PROJECTION_MATRIX" },
  879. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  880. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "viewport_size", "vec3(VIEWPORT_SIZE, 0.0)" },
  881. // Spatial, Light
  882. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "fragcoord", "FRAGCOORD.xyz" },
  883. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "NORMAL" },
  884. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "view", "VIEW" },
  885. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light", "LIGHT" },
  886. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_color", "LIGHT_COLOR" },
  887. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "attenuation", "ATTENUATION" },
  888. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "albedo", "ALBEDO" },
  889. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "transmission", "TRANSMISSION" },
  890. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "diffuse", "DIFFUSE_LIGHT" },
  891. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "specular", "SPECULAR_LIGHT" },
  892. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "roughness", "ROUGHNESS" },
  893. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_TRANSFORM, "world", "WORLD_MATRIX" },
  894. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_TRANSFORM, "inv_camera", "INV_CAMERA_MATRIX" },
  895. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_TRANSFORM, "camera", "CAMERA_MATRIX" },
  896. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_TRANSFORM, "projection", "PROJECTION_MATRIX" },
  897. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_TRANSFORM, "inv_projection", "INV_PROJECTION_MATRIX" },
  898. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  899. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "viewport_size", "vec3(VIEWPORT_SIZE, 0.0)" },
  900. // Canvas Item, Vertex
  901. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "vertex", "vec3(VERTEX,0.0)" },
  902. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV,0.0)" },
  903. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  904. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  905. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "point_size", "POINT_SIZE" },
  906. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "texture_pixel_size", "vec3(TEXTURE_PIXEL_SIZE, 1.0)" },
  907. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "world", "WORLD_MATRIX" },
  908. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "projection", "PROJECTION_MATRIX" },
  909. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "extra", "EXTRA_MATRIX" },
  910. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  911. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "light_pass", "float(AT_LIGHT_PASS ? 1.0 : 0.0)" },
  912. // Canvas Item, Fragment
  913. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "fragcoord", "FRAGCOORD.xyz" },
  914. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV,0.0)" },
  915. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  916. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  917. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_uv", "vec3(SCREEN_UV,0.0)" },
  918. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "texture_pixel_size", "vec3(TEXTURE_PIXEL_SIZE, 1.0)" },
  919. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_pixel_size", "vec3(SCREEN_PIXEL_SIZE, 1.0)" },
  920. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "point_coord", "vec3(POINT_COORD,0.0)" },
  921. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  922. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "light_pass", "float(AT_LIGHT_PASS ? 1.0 : 0.0)" },
  923. // Canvas Item, Light
  924. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "fragcoord", "FRAGCOORD.xyz" },
  925. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV,0.0)" },
  926. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "NORMAL" },
  927. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  928. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  929. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_vec", "vec3(LIGHT_VEC,0.0)" },
  930. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "light_height", "LIGHT_HEIGHT" },
  931. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_color", "LIGHT_COLOR.rgb" },
  932. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_alpha", "LIGHT_COLOR.a" },
  933. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_uv", "vec3(LIGHT_UV,0.0)" },
  934. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "shadow_color", "SHADOW_COLOR.rgb" },
  935. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_uv", "vec3(SCREEN_UV,0.0)" },
  936. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "texture_pixel_size", "vec3(TEXTURE_PIXEL_SIZE, 1.0)" },
  937. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "point_coord", "vec3(POINT_COORD,0.0)" },
  938. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  939. // Particles, Vertex
  940. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  941. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  942. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "velocity", "VELOCITY" },
  943. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "restart", "float(RESTART ? 1.0 : 0.0)" },
  944. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "active", "float(ACTIVE ? 1.0 : 0.0)" },
  945. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "custom", "CUSTOM.rgb" },
  946. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "custom_alpha", "CUSTOM.a" },
  947. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "transform", "TRANSFORM" },
  948. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "delta", "DELTA" },
  949. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "lifetime", "LIFETIME" },
  950. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "index", "float(INDEX)" },
  951. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "emission_transform", "EMISSION_TRANSFORM" },
  952. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  953. { Shader::MODE_MAX, VisualShader::TYPE_MAX, VisualShaderNode::PORT_TYPE_TRANSFORM, NULL, NULL },
  954. };
  955. const VisualShaderNodeInput::Port VisualShaderNodeInput::preview_ports[] = {
  956. // Spatial, Fragment
  957. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "vec3(0.0,0.0,1.0)" },
  958. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "tangent", "vec3(0.0,1.0,0.0)" },
  959. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "binormal", "vec3(1.0,0.0,0.0)" },
  960. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV,0.0)" },
  961. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "uv2", "vec3(UV,0.0)" },
  962. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "color", "vec3(1.0)" },
  963. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "1.0" },
  964. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_uv", "vec3(SCREEN_UV,0.0)" },
  965. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "side", "1.0" },
  966. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  967. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "viewport_size", "vec3(1.0,1.0, 0.0)" },
  968. // Spatial, Light
  969. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "vec3(0.0,0.0,1.0)" },
  970. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  971. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "viewport_size", "vec3(1.0, 1.0, 0.0)" },
  972. // Canvas Item, Vertex
  973. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "vertex", "vec3(VERTEX,0.0)" },
  974. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV,0.0)" },
  975. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "color", "vec3(1.0)" },
  976. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "1.0" },
  977. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  978. // Canvas Item, Fragment
  979. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV,0.0)" },
  980. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "color", "vec3(1.0)" },
  981. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "1.0" },
  982. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_uv", "vec3(SCREEN_UV,0.0)" },
  983. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  984. // Canvas Item, Light
  985. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "vec3(UV,0.0)" },
  986. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "vec3(0.0,0.0,1.0)" },
  987. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "color", "vec3(1.0)" },
  988. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "1.0" },
  989. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_uv", "vec3(SCREEN_UV,0.0)" },
  990. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  991. // Particles, Vertex
  992. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "color", "vec3(1.0)" },
  993. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "1.0" },
  994. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "velocity", "vec3(0.0,0.0,1.0)" },
  995. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "time", "TIME" },
  996. { Shader::MODE_MAX, VisualShader::TYPE_MAX, VisualShaderNode::PORT_TYPE_TRANSFORM, NULL, NULL },
  997. };
  998. int VisualShaderNodeInput::get_input_port_count() const {
  999. return 0;
  1000. }
  1001. VisualShaderNodeInput::PortType VisualShaderNodeInput::get_input_port_type(int p_port) const {
  1002. return PORT_TYPE_SCALAR;
  1003. }
  1004. String VisualShaderNodeInput::get_input_port_name(int p_port) const {
  1005. return "";
  1006. }
  1007. int VisualShaderNodeInput::get_output_port_count() const {
  1008. return 1;
  1009. }
  1010. VisualShaderNodeInput::PortType VisualShaderNodeInput::get_output_port_type(int p_port) const {
  1011. return get_input_type_by_name(input_name);
  1012. }
  1013. String VisualShaderNodeInput::get_output_port_name(int p_port) const {
  1014. return "";
  1015. }
  1016. String VisualShaderNodeInput::get_caption() const {
  1017. return TTR("Input");
  1018. }
  1019. String VisualShaderNodeInput::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1020. if (p_for_preview) {
  1021. int idx = 0;
  1022. String code;
  1023. while (preview_ports[idx].mode != Shader::MODE_MAX) {
  1024. if (preview_ports[idx].mode == shader_mode && preview_ports[idx].shader_type == shader_type && preview_ports[idx].name == input_name) {
  1025. code = "\t" + p_output_vars[0] + " = " + preview_ports[idx].string + ";\n";
  1026. break;
  1027. }
  1028. idx++;
  1029. }
  1030. if (code == String()) {
  1031. switch (get_output_port_type(0)) {
  1032. case PORT_TYPE_SCALAR: {
  1033. code = "\t" + p_output_vars[0] + " = 0.0;\n";
  1034. } break; //default (none found) is scalar
  1035. case PORT_TYPE_VECTOR: {
  1036. code = "\t" + p_output_vars[0] + " = vec3(0.0);\n";
  1037. } break; //default (none found) is scalar
  1038. case PORT_TYPE_TRANSFORM: {
  1039. code = "\t" + p_output_vars[0] + " = mat4( vec4(1.0,0.0,0.0,0.0), vec4(0.0,1.0,0.0,0.0), vec4(0.0,0.0,1.0,0.0), vec4(0.0,0.0,0.0,1.0) );\n";
  1040. } break; //default (none found) is scalar
  1041. case PORT_TYPE_BOOLEAN: {
  1042. code = "\t" + p_output_vars[0] + " = false;\n";
  1043. } break;
  1044. default:
  1045. break;
  1046. }
  1047. }
  1048. return code;
  1049. } else {
  1050. int idx = 0;
  1051. String code;
  1052. while (ports[idx].mode != Shader::MODE_MAX) {
  1053. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type && ports[idx].name == input_name) {
  1054. code = "\t" + p_output_vars[0] + " = " + ports[idx].string + ";\n";
  1055. break;
  1056. }
  1057. idx++;
  1058. }
  1059. if (code == String()) {
  1060. code = "\t" + p_output_vars[0] + " = 0.0;\n"; //default (none found) is scalar
  1061. }
  1062. return code;
  1063. }
  1064. }
  1065. void VisualShaderNodeInput::set_input_name(String p_name) {
  1066. PortType prev_type = get_input_type_by_name(input_name);
  1067. input_name = p_name;
  1068. emit_changed();
  1069. if (get_input_type_by_name(input_name) != prev_type) {
  1070. emit_signal("input_type_changed");
  1071. }
  1072. }
  1073. String VisualShaderNodeInput::get_input_name() const {
  1074. return input_name;
  1075. }
  1076. VisualShaderNodeInput::PortType VisualShaderNodeInput::get_input_type_by_name(String p_name) const {
  1077. int idx = 0;
  1078. while (ports[idx].mode != Shader::MODE_MAX) {
  1079. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type && ports[idx].name == p_name) {
  1080. return ports[idx].type;
  1081. }
  1082. idx++;
  1083. }
  1084. return PORT_TYPE_SCALAR;
  1085. }
  1086. int VisualShaderNodeInput::get_input_index_count() const {
  1087. int idx = 0;
  1088. int count = 0;
  1089. while (ports[idx].mode != Shader::MODE_MAX) {
  1090. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  1091. count++;
  1092. }
  1093. idx++;
  1094. }
  1095. return count;
  1096. }
  1097. VisualShaderNodeInput::PortType VisualShaderNodeInput::get_input_index_type(int p_index) const {
  1098. int idx = 0;
  1099. int count = 0;
  1100. while (ports[idx].mode != Shader::MODE_MAX) {
  1101. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  1102. if (count == p_index) {
  1103. return ports[idx].type;
  1104. }
  1105. count++;
  1106. }
  1107. idx++;
  1108. }
  1109. return PORT_TYPE_SCALAR;
  1110. }
  1111. String VisualShaderNodeInput::get_input_index_name(int p_index) const {
  1112. int idx = 0;
  1113. int count = 0;
  1114. while (ports[idx].mode != Shader::MODE_MAX) {
  1115. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  1116. if (count == p_index) {
  1117. return ports[idx].name;
  1118. }
  1119. count++;
  1120. }
  1121. idx++;
  1122. }
  1123. return "";
  1124. }
  1125. void VisualShaderNodeInput::_validate_property(PropertyInfo &property) const {
  1126. if (property.name == "input_name") {
  1127. String port_list;
  1128. int idx = 0;
  1129. while (ports[idx].mode != Shader::MODE_MAX) {
  1130. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  1131. if (port_list != String()) {
  1132. port_list += ",";
  1133. }
  1134. port_list += ports[idx].name;
  1135. }
  1136. idx++;
  1137. }
  1138. if (port_list == "") {
  1139. port_list = TTR("None");
  1140. }
  1141. property.hint_string = port_list;
  1142. }
  1143. }
  1144. Vector<StringName> VisualShaderNodeInput::get_editable_properties() const {
  1145. Vector<StringName> props;
  1146. props.push_back("input_name");
  1147. return props;
  1148. }
  1149. void VisualShaderNodeInput::_bind_methods() {
  1150. ClassDB::bind_method(D_METHOD("set_input_name", "name"), &VisualShaderNodeInput::set_input_name);
  1151. ClassDB::bind_method(D_METHOD("get_input_name"), &VisualShaderNodeInput::get_input_name);
  1152. ADD_PROPERTY(PropertyInfo(Variant::STRING, "input_name", PROPERTY_HINT_ENUM, ""), "set_input_name", "get_input_name");
  1153. ADD_SIGNAL(MethodInfo("input_type_changed"));
  1154. }
  1155. VisualShaderNodeInput::VisualShaderNodeInput() {
  1156. input_name = "[None]";
  1157. // changed when set
  1158. shader_type = VisualShader::TYPE_MAX;
  1159. shader_mode = Shader::MODE_MAX;
  1160. }
  1161. ////////////////////////////////////////////
  1162. const VisualShaderNodeOutput::Port VisualShaderNodeOutput::ports[] = {
  1163. // Spatial, Vertex
  1164. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "vertex", "VERTEX" },
  1165. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "NORMAL" },
  1166. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "tangent", "TANGENT" },
  1167. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "binormal", "BINORMAL" },
  1168. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "UV:xy" },
  1169. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "uv2", "UV2:xy" },
  1170. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  1171. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  1172. { Shader::MODE_SPATIAL, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "roughness", "ROUGHNESS" },
  1173. // Spatial, Fragment
  1174. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "albedo", "ALBEDO" },
  1175. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "ALPHA" },
  1176. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "metallic", "METALLIC" },
  1177. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "roughness", "ROUGHNESS" },
  1178. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "specular", "SPECULAR" },
  1179. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "emission", "EMISSION" },
  1180. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "ao", "AO" },
  1181. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "NORMAL" },
  1182. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "normalmap", "NORMALMAP" },
  1183. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "normalmap_depth", "NORMALMAP_DEPTH" },
  1184. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "rim", "RIM" },
  1185. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "rim_tint", "RIM_TINT" },
  1186. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "clearcoat", "CLEARCOAT" },
  1187. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "clearcoat_gloss", "CLEARCOAT_GLOSS" },
  1188. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "anisotropy", "ANISOTROPY" },
  1189. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "anisotropy_flow", "ANISOTROPY_FLOW:xy" },
  1190. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "subsurf_scatter", "SSS_STRENGTH" },
  1191. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "transmission", "TRANSMISSION" },
  1192. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha_scissor", "ALPHA_SCISSOR" },
  1193. { Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "ao_light_affect", "AO_LIGHT_AFFECT" },
  1194. // Spatial, Light
  1195. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "diffuse", "DIFFUSE_LIGHT" },
  1196. { Shader::MODE_SPATIAL, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "specular", "SPECULAR_LIGHT" },
  1197. // Canvas Item, Vertex
  1198. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "vertex", "VERTEX:xy" },
  1199. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "uv", "UV:xy" },
  1200. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  1201. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  1202. // Canvas Item, Fragment
  1203. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  1204. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  1205. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "normal", "NORMAL" },
  1206. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR, "normalmap", "NORMALMAP" },
  1207. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "normalmap_depth", "NORMALMAP_DEPTH" },
  1208. // Canvas Item, Light
  1209. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light", "LIGHT.rgb" },
  1210. { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "light_alpha", "LIGHT.rgb" },
  1211. // Particles, Vertex
  1212. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "color", "COLOR.rgb" },
  1213. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "alpha", "COLOR.a" },
  1214. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "velocity", "VELOCITY" },
  1215. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_VECTOR, "custom", "CUSTOM.rgb" },
  1216. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_SCALAR, "custom_alpha", "CUSTOM.a" },
  1217. { Shader::MODE_PARTICLES, VisualShader::TYPE_VERTEX, VisualShaderNode::PORT_TYPE_TRANSFORM, "transform", "TRANSFORM" },
  1218. { Shader::MODE_MAX, VisualShader::TYPE_MAX, VisualShaderNode::PORT_TYPE_TRANSFORM, NULL, NULL },
  1219. };
  1220. int VisualShaderNodeOutput::get_input_port_count() const {
  1221. int idx = 0;
  1222. int count = 0;
  1223. while (ports[idx].mode != Shader::MODE_MAX) {
  1224. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  1225. count++;
  1226. }
  1227. idx++;
  1228. }
  1229. return count;
  1230. }
  1231. VisualShaderNodeOutput::PortType VisualShaderNodeOutput::get_input_port_type(int p_port) const {
  1232. int idx = 0;
  1233. int count = 0;
  1234. while (ports[idx].mode != Shader::MODE_MAX) {
  1235. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  1236. if (count == p_port) {
  1237. return ports[idx].type;
  1238. }
  1239. count++;
  1240. }
  1241. idx++;
  1242. }
  1243. return PORT_TYPE_SCALAR;
  1244. }
  1245. String VisualShaderNodeOutput::get_input_port_name(int p_port) const {
  1246. int idx = 0;
  1247. int count = 0;
  1248. while (ports[idx].mode != Shader::MODE_MAX) {
  1249. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  1250. if (count == p_port) {
  1251. return String(ports[idx].name).capitalize();
  1252. }
  1253. count++;
  1254. }
  1255. idx++;
  1256. }
  1257. return String();
  1258. }
  1259. Variant VisualShaderNodeOutput::get_input_port_default_value(int p_port) const {
  1260. return Variant();
  1261. }
  1262. int VisualShaderNodeOutput::get_output_port_count() const {
  1263. return 0;
  1264. }
  1265. VisualShaderNodeOutput::PortType VisualShaderNodeOutput::get_output_port_type(int p_port) const {
  1266. return PORT_TYPE_SCALAR;
  1267. }
  1268. String VisualShaderNodeOutput::get_output_port_name(int p_port) const {
  1269. return String();
  1270. }
  1271. bool VisualShaderNodeOutput::is_port_separator(int p_index) const {
  1272. if (shader_mode == Shader::MODE_SPATIAL && shader_type == VisualShader::TYPE_FRAGMENT) {
  1273. String name = get_input_port_name(p_index);
  1274. return (name == "Normal" || name == "Rim" || name == "Alpha Scissor");
  1275. }
  1276. return false;
  1277. }
  1278. String VisualShaderNodeOutput::get_caption() const {
  1279. return TTR("Output");
  1280. }
  1281. String VisualShaderNodeOutput::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
  1282. int idx = 0;
  1283. int count = 0;
  1284. String code;
  1285. while (ports[idx].mode != Shader::MODE_MAX) {
  1286. if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) {
  1287. if (p_input_vars[count] != String()) {
  1288. String s = ports[idx].string;
  1289. if (s.find(":") != -1) {
  1290. code += "\t" + s.get_slicec(':', 0) + " = " + p_input_vars[count] + "." + s.get_slicec(':', 1) + ";\n";
  1291. } else {
  1292. code += "\t" + s + " = " + p_input_vars[count] + ";\n";
  1293. }
  1294. }
  1295. count++;
  1296. }
  1297. idx++;
  1298. }
  1299. return code;
  1300. }
  1301. VisualShaderNodeOutput::VisualShaderNodeOutput() {
  1302. }
  1303. ///////////////////////////
  1304. void VisualShaderNodeUniform::set_uniform_name(const String &p_name) {
  1305. uniform_name = p_name;
  1306. emit_signal("name_changed");
  1307. emit_changed();
  1308. }
  1309. String VisualShaderNodeUniform::get_uniform_name() const {
  1310. return uniform_name;
  1311. }
  1312. void VisualShaderNodeUniform::_bind_methods() {
  1313. ClassDB::bind_method(D_METHOD("set_uniform_name", "name"), &VisualShaderNodeUniform::set_uniform_name);
  1314. ClassDB::bind_method(D_METHOD("get_uniform_name"), &VisualShaderNodeUniform::get_uniform_name);
  1315. ADD_PROPERTY(PropertyInfo(Variant::STRING, "uniform_name"), "set_uniform_name", "get_uniform_name");
  1316. }
  1317. VisualShaderNodeUniform::VisualShaderNodeUniform() {
  1318. }