parser_logic.ts 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. let parser_logic_custom_nodes: map_t<any, any> = map_create();
  2. let parser_logic_nodes: zui_node_t[];
  3. let parser_logic_links: zui_node_link_t[];
  4. let parser_logic_parsed_nodes: string[] = null;
  5. let parser_logic_parsed_labels: map_t<string, string> = null;
  6. let parser_logic_node_map: map_t<string, logic_node_t>;
  7. let parser_logic_raw_map: map_t<logic_node_t, zui_node_t>;
  8. function parser_logic_get_logic_node(node: zui_node_t): logic_node_t {
  9. return map_get(parser_logic_node_map, parser_logic_node_name(node));
  10. }
  11. function parser_logic_get_raw_node(node: logic_node_t): zui_node_t {
  12. return map_get(parser_logic_raw_map, node);
  13. }
  14. function parser_logic_get_node(id: i32): zui_node_t {
  15. for (let i: i32 = 0; i < parser_logic_nodes.length; ++i) {
  16. let n: zui_node_t = parser_logic_nodes[i];
  17. if (n.id == id) {
  18. return n;
  19. }
  20. }
  21. return null;
  22. }
  23. function parser_logic_get_link(id: i32): zui_node_link_t {
  24. for (let i: i32 = 0; i < parser_logic_links.length; ++i) {
  25. let l: zui_node_link_t = parser_logic_links[i];
  26. if (l.id == id) {
  27. return l;
  28. }
  29. }
  30. return null;
  31. }
  32. function parser_logic_get_input_link(inp: zui_node_socket_t): zui_node_link_t {
  33. for (let i: i32 = 0; i < parser_logic_links.length; ++i) {
  34. let l: zui_node_link_t = parser_logic_links[i];
  35. if (l.to_id == inp.node_id) {
  36. let node: zui_node_t = parser_logic_get_node(inp.node_id);
  37. if (node.inputs.length <= l.to_socket) {
  38. return null;
  39. }
  40. if (node.inputs[l.to_socket] == inp) {
  41. return l;
  42. }
  43. }
  44. }
  45. return null;
  46. }
  47. function parser_logic_get_output_links(out: zui_node_socket_t): zui_node_link_t[] {
  48. let res: zui_node_link_t[] = [];
  49. for (let i: i32 = 0; i < parser_logic_links.length; ++i) {
  50. let l: zui_node_link_t = parser_logic_links[i];
  51. if (l.from_id == out.node_id) {
  52. let node: zui_node_t = parser_logic_get_node(out.node_id);
  53. if (node.outputs.length <= l.from_socket) {
  54. continue;
  55. }
  56. if (node.outputs[l.from_socket] == out) {
  57. array_push(res, l);
  58. }
  59. }
  60. }
  61. return res;
  62. }
  63. function parser_logic_safe_src(s: string): string {
  64. return string_replace_all(s, " ", "");
  65. }
  66. function parser_logic_node_name(node: zui_node_t): string {
  67. let s: string = parser_logic_safe_src(node.name) + node.id;
  68. return s;
  69. }
  70. function parser_logic_parse(canvas: zui_node_canvas_t) {
  71. parser_logic_nodes = canvas.nodes;
  72. parser_logic_links = canvas.links;
  73. parser_logic_parsed_nodes = [];
  74. parser_logic_parsed_labels = map_create();
  75. parser_logic_node_map = map_create();
  76. parser_logic_raw_map = map_create();
  77. let root_nodes: zui_node_t[] = parser_logic_get_root_nodes(canvas);
  78. for (let i: i32 = 0; i < root_nodes.length; ++i) {
  79. let node: zui_node_t = root_nodes[i];
  80. parser_logic_build_node(node);
  81. }
  82. }
  83. function parser_logic_build_node(node: zui_node_t): string {
  84. // Get node name
  85. let name: string = parser_logic_node_name(node);
  86. // Check if node already exists
  87. if (array_index_of(parser_logic_parsed_nodes, name) != -1) {
  88. return name;
  89. }
  90. array_push(parser_logic_parsed_nodes, name);
  91. // Create node
  92. let v: any = parser_logic_create_node_instance(node.type, null);
  93. map_set(parser_logic_node_map, name, v);
  94. map_set(parser_logic_raw_map, v, node);
  95. // Expose button values in node
  96. // for (let i: i32 = 0; i < node.buttons.length; ++i) {
  97. // let b: zui_node_button_t = node.buttons[i];
  98. // if (b.type == "ENUM") {
  99. // let array_data: bool = b.data.length > 1;
  100. // let texts: string[] = array_data ? b.data : zui_enum_texts_js(node.type);
  101. // v[b.name] = texts[b.default_value];
  102. // }
  103. // else {
  104. // v[b.name] = b.default_value;
  105. // }
  106. // }
  107. // Create inputs
  108. let inp_node: logic_node_t = null;
  109. let inp_from: i32 = 0;
  110. for (let i: i32 = 0; i < node.inputs.length; ++i) {
  111. let inp: zui_node_socket_t = node.inputs[i];
  112. // Is linked - find node
  113. let l: zui_node_link_t = parser_logic_get_input_link(inp);
  114. if (l != null) {
  115. inp_node = map_get(parser_logic_node_map, parser_logic_build_node(parser_logic_get_node(l.from_id)));
  116. inp_from = l.from_socket;
  117. }
  118. // Not linked - create node with default values
  119. else {
  120. inp_node = parser_logic_build_default_node(inp);
  121. inp_from = 0;
  122. }
  123. // Add input
  124. logic_node_add_input(v.base, inp_node, inp_from);
  125. }
  126. // Create outputss
  127. for (let i: i32 = 0; i < node.outputs.length; ++i) {
  128. let out: zui_node_socket_t = node.outputs[i];
  129. let out_nodes: logic_node_t[] = [];
  130. let ls: zui_node_link_t[] = parser_logic_get_output_links(out);
  131. if (ls != null && ls.length > 0) {
  132. for (let i: i32 = 0; i < ls.length; ++i) {
  133. let l: zui_node_link_t = ls[i];
  134. let n: zui_node_t = parser_logic_get_node(l.to_id);
  135. let out_name: string = parser_logic_build_node(n);
  136. array_push(out_nodes, map_get(parser_logic_node_map, out_name));
  137. }
  138. }
  139. // Not linked - create node with default values
  140. else {
  141. array_push(out_nodes, parser_logic_build_default_node(out));
  142. }
  143. // Add outputs
  144. logic_node_add_outputs(v.base, out_nodes);
  145. }
  146. return name;
  147. }
  148. function parser_logic_get_root_nodes(node_group: zui_node_canvas_t): zui_node_t[] {
  149. let roots: zui_node_t[] = [];
  150. for (let i: i32 = 0; i < node_group.nodes.length; ++i) {
  151. let node: zui_node_t = node_group.nodes[i];
  152. let linked: bool = false;
  153. for (let i: i32 = 0; i < node.outputs.length; ++i) {
  154. let out: zui_node_socket_t = node.outputs[i];
  155. let ls: zui_node_link_t[] = parser_logic_get_output_links(out);
  156. if (ls != null && ls.length > 0) {
  157. linked = true;
  158. break;
  159. }
  160. }
  161. if (!linked) { // Assume node with no connected outputs as roots
  162. array_push(roots, node);
  163. }
  164. }
  165. return roots;
  166. }
  167. function parser_logic_build_default_node(inp: zui_node_socket_t): logic_node_t {
  168. let v: logic_node_t = null;
  169. if (inp.type == "VECTOR") {
  170. if (inp.default_value == null) {
  171. inp.default_value = f32_array_create_xyz(0, 0, 0);
  172. }
  173. v = parser_logic_create_node_instance("vector_node", inp.default_value);
  174. }
  175. else if (inp.type == "RGBA") {
  176. if (inp.default_value == null) {
  177. inp.default_value = f32_array_create_xyzw(0, 0, 0, 0);
  178. }
  179. v = parser_logic_create_node_instance("color_node", inp.default_value);
  180. }
  181. else if (inp.type == "RGB") {
  182. if (inp.default_value == null) {
  183. inp.default_value = f32_array_create_xyzw(0, 0, 0, 0);
  184. }
  185. v = parser_logic_create_node_instance("color_node", inp.default_value);
  186. }
  187. else if (inp.type == "VALUE") {
  188. v = parser_logic_create_node_instance("float_node", inp.default_value);
  189. }
  190. else if (inp.type == "INT") {
  191. v = parser_logic_create_node_instance("integer_node", inp.default_value);
  192. }
  193. else if (inp.type == "BOOLEAN") {
  194. v = parser_logic_create_node_instance("boolean_node", inp.default_value);
  195. }
  196. else if (inp.type == "STRING") {
  197. v = parser_logic_create_node_instance("string_node", inp.default_value);
  198. }
  199. else {
  200. v = parser_logic_create_node_instance("null_node", null);
  201. }
  202. return v;
  203. }
  204. function parser_logic_create_node_instance(node_type: string, args: any): any {
  205. if (map_get(parser_logic_custom_nodes, node_type) != null) {
  206. let node: logic_node_t = logic_node_create();
  207. node.get = map_get(parser_logic_custom_nodes, node_type);
  208. return node;
  209. }
  210. if (nodes_brush_creates == null) {
  211. nodes_brush_init();
  212. }
  213. let create: any = map_get(nodes_brush_creates, node_type);
  214. return create(args);
  215. }