parser_logic.ts 6.6 KB

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