Files
armorpaint/paint/sources/parser_logic.ts
T

226 lines
6.7 KiB
TypeScript
Raw Normal View History

2024-03-13 23:50:11 +01:00
let parser_logic_custom_nodes: map_t<any, any> = map_create();
2024-09-03 15:52:05 +02:00
let parser_logic_nodes: ui_node_t[];
let parser_logic_links: ui_node_link_t[];
2024-03-13 23:50:11 +01:00
let parser_logic_parsed_nodes: string[] = null;
2024-05-10 14:20:57 +02:00
let parser_logic_node_map: map_t<string, logic_node_ext_t>;
2024-03-13 23:50:11 +01:00
2024-09-03 15:52:05 +02:00
function parser_logic_get_logic_node(node: ui_node_t): logic_node_ext_t {
2024-03-20 16:13:54 +01:00
return map_get(parser_logic_node_map, parser_logic_node_name(node));
2024-03-13 23:50:11 +01:00
}
2024-09-03 15:52:05 +02:00
function parser_logic_get_node(id: i32): ui_node_t {
2024-03-21 21:06:41 +01:00
for (let i: i32 = 0; i < parser_logic_nodes.length; ++i) {
2024-09-03 15:52:05 +02:00
let n: ui_node_t = parser_logic_nodes[i];
2024-03-20 16:13:54 +01:00
if (n.id == id) {
return n;
}
}
2024-03-13 23:50:11 +01:00
return null;
}
2024-09-03 15:52:05 +02:00
function parser_logic_get_link(id: i32): ui_node_link_t {
2024-03-21 21:06:41 +01:00
for (let i: i32 = 0; i < parser_logic_links.length; ++i) {
2024-09-03 15:52:05 +02:00
let l: ui_node_link_t = parser_logic_links[i];
2024-03-20 16:13:54 +01:00
if (l.id == id) {
return l;
}
}
2024-03-13 23:50:11 +01:00
return null;
}
2024-09-03 15:52:05 +02:00
function parser_logic_get_input_link(inp: ui_node_socket_t): ui_node_link_t {
2024-03-21 21:06:41 +01:00
for (let i: i32 = 0; i < parser_logic_links.length; ++i) {
2024-09-03 15:52:05 +02:00
let l: ui_node_link_t = parser_logic_links[i];
2024-03-13 23:50:11 +01:00
if (l.to_id == inp.node_id) {
2024-09-03 15:52:05 +02:00
let node: ui_node_t = parser_logic_get_node(inp.node_id);
2024-03-20 16:13:54 +01:00
if (node.inputs.length <= l.to_socket) {
return null;
}
if (node.inputs[l.to_socket] == inp) {
return l;
}
2024-03-13 23:50:11 +01:00
}
}
return null;
}
2024-09-03 15:52:05 +02:00
function parser_logic_get_output_links(out: ui_node_socket_t): ui_node_link_t[] {
let res: ui_node_link_t[] = [];
2024-03-21 21:06:41 +01:00
for (let i: i32 = 0; i < parser_logic_links.length; ++i) {
2024-09-03 15:52:05 +02:00
let l: ui_node_link_t = parser_logic_links[i];
2024-03-13 23:50:11 +01:00
if (l.from_id == out.node_id) {
2024-09-03 15:52:05 +02:00
let node: ui_node_t = parser_logic_get_node(out.node_id);
2024-03-20 16:13:54 +01:00
if (node.outputs.length <= l.from_socket) {
continue;
}
if (node.outputs[l.from_socket] == out) {
array_push(res, l);
}
2024-03-13 23:50:11 +01:00
}
}
return res;
}
function parser_logic_safe_src(s: string): string {
return string_replace_all(s, " ", "");
}
2024-09-03 15:52:05 +02:00
function parser_logic_node_name(node: ui_node_t): string {
2024-05-08 21:17:02 +02:00
let safe: string = parser_logic_safe_src(node.name);
2025-10-15 18:39:55 +02:00
let nid: i32 = node.id;
let s: string = safe + nid;
2024-03-13 23:50:11 +01:00
return s;
}
2024-09-03 15:52:05 +02:00
function parser_logic_parse(canvas: ui_node_canvas_t) {
2024-03-13 23:50:11 +01:00
parser_logic_nodes = canvas.nodes;
parser_logic_links = canvas.links;
2025-10-15 18:39:55 +02:00
parser_logic_parsed_nodes = [];
parser_logic_node_map = map_create();
2024-09-03 15:52:05 +02:00
let root_nodes: ui_node_t[] = parser_logic_get_root_nodes(canvas);
2024-03-13 23:50:11 +01:00
2024-03-21 21:06:41 +01:00
for (let i: i32 = 0; i < root_nodes.length; ++i) {
2024-09-03 15:52:05 +02:00
let node: ui_node_t = root_nodes[i];
2024-03-20 16:13:54 +01:00
parser_logic_build_node(node);
}
2024-03-13 23:50:11 +01:00
}
2024-09-03 15:52:05 +02:00
function parser_logic_build_node(node: ui_node_t): string {
2024-03-13 23:50:11 +01:00
// Get node name
let name: string = parser_logic_node_name(node);
// Check if node already exists
2024-03-20 16:13:54 +01:00
if (array_index_of(parser_logic_parsed_nodes, name) != -1) {
2024-03-13 23:50:11 +01:00
return name;
}
2024-03-20 16:13:54 +01:00
array_push(parser_logic_parsed_nodes, name);
2024-03-13 23:50:11 +01:00
// Create node
2024-09-24 16:50:54 +02:00
let v: logic_node_ext_t = parser_logic_create_node_instance(node.type, node, null);
2024-03-20 16:13:54 +01:00
map_set(parser_logic_node_map, name, v);
2024-03-13 23:50:11 +01:00
// Create inputs
2024-05-10 14:20:57 +02:00
let inp_node: logic_node_ext_t = null;
2025-10-15 18:39:55 +02:00
let inp_from: i32 = 0;
2024-03-13 23:50:11 +01:00
for (let i: i32 = 0; i < node.inputs.length; ++i) {
2024-09-03 15:52:05 +02:00
let inp: ui_node_socket_t = node.inputs[i];
2024-03-13 23:50:11 +01:00
// Is linked - find node
2024-09-03 15:52:05 +02:00
let l: ui_node_link_t = parser_logic_get_input_link(inp);
2024-03-13 23:50:11 +01:00
if (l != null) {
2024-09-03 15:52:05 +02:00
let n: ui_node_t = parser_logic_get_node(l.from_id);
2025-10-15 18:39:55 +02:00
let s: string = parser_logic_build_node(n);
inp_node = map_get(parser_logic_node_map, s);
inp_from = l.from_socket;
2024-03-13 23:50:11 +01:00
}
// Not linked - create node with default values
else {
inp_node = parser_logic_build_default_node(inp);
inp_from = 0;
}
// Add input
2024-03-14 23:58:24 +01:00
logic_node_add_input(v.base, inp_node, inp_from);
2024-03-13 23:50:11 +01:00
}
// Create outputss
2024-03-21 21:06:41 +01:00
for (let i: i32 = 0; i < node.outputs.length; ++i) {
2025-10-15 18:39:55 +02:00
let out: ui_node_socket_t = node.outputs[i];
2024-03-14 23:58:24 +01:00
let out_nodes: logic_node_t[] = [];
2025-10-15 18:39:55 +02:00
let ls: ui_node_link_t[] = parser_logic_get_output_links(out);
2024-03-13 23:50:11 +01:00
if (ls != null && ls.length > 0) {
2024-03-21 21:06:41 +01:00
for (let i: i32 = 0; i < ls.length; ++i) {
2024-09-03 15:52:05 +02:00
let l: ui_node_link_t = ls[i];
2025-10-15 18:39:55 +02:00
let n: ui_node_t = parser_logic_get_node(l.to_id);
let out_name: string = parser_logic_build_node(n);
2024-03-20 16:13:54 +01:00
array_push(out_nodes, map_get(parser_logic_node_map, out_name));
2024-03-13 23:50:11 +01:00
}
}
// Not linked - create node with default values
else {
2024-03-20 16:13:54 +01:00
array_push(out_nodes, parser_logic_build_default_node(out));
2024-03-13 23:50:11 +01:00
}
// Add outputs
2024-03-14 23:58:24 +01:00
logic_node_add_outputs(v.base, out_nodes);
2024-03-13 23:50:11 +01:00
}
return name;
}
2024-09-03 15:52:05 +02:00
function parser_logic_get_root_nodes(node_group: ui_node_canvas_t): ui_node_t[] {
let roots: ui_node_t[] = [];
2024-03-21 21:06:41 +01:00
for (let i: i32 = 0; i < node_group.nodes.length; ++i) {
2024-09-03 15:52:05 +02:00
let node: ui_node_t = node_group.nodes[i];
2025-10-15 18:39:55 +02:00
let linked: bool = false;
2024-03-21 21:06:41 +01:00
for (let i: i32 = 0; i < node.outputs.length; ++i) {
2024-09-03 15:52:05 +02:00
let out: ui_node_socket_t = node.outputs[i];
2025-10-15 18:39:55 +02:00
let ls: ui_node_link_t[] = parser_logic_get_output_links(out);
2024-03-13 23:50:11 +01:00
if (ls != null && ls.length > 0) {
linked = true;
break;
}
}
if (!linked) { // Assume node with no connected outputs as roots
2024-03-20 16:13:54 +01:00
array_push(roots, node);
2024-03-13 23:50:11 +01:00
}
}
return roots;
}
2024-09-03 15:52:05 +02:00
function parser_logic_build_default_node(inp: ui_node_socket_t): logic_node_ext_t {
2024-05-10 14:20:57 +02:00
let v: logic_node_ext_t = null;
2024-03-13 23:50:11 +01:00
if (inp.type == "VECTOR") {
2024-03-20 16:13:54 +01:00
if (inp.default_value == null) {
2024-04-24 12:14:47 +02:00
inp.default_value = f32_array_create_xyz(0, 0, 0);
2024-03-20 16:13:54 +01:00
}
2024-09-24 16:50:54 +02:00
v = parser_logic_create_node_instance("vector_node", null, inp.default_value);
2024-03-13 23:50:11 +01:00
}
else if (inp.type == "RGBA") {
2024-03-20 16:13:54 +01:00
if (inp.default_value == null) {
2024-04-24 12:14:47 +02:00
inp.default_value = f32_array_create_xyzw(0, 0, 0, 0);
2024-03-20 16:13:54 +01:00
}
2024-09-24 16:50:54 +02:00
v = parser_logic_create_node_instance("color_node", null, inp.default_value);
2024-03-13 23:50:11 +01:00
}
else if (inp.type == "RGB") {
2024-03-20 16:13:54 +01:00
if (inp.default_value == null) {
2024-04-24 12:14:47 +02:00
inp.default_value = f32_array_create_xyzw(0, 0, 0, 0);
2024-03-20 16:13:54 +01:00
}
2024-09-24 16:50:54 +02:00
v = parser_logic_create_node_instance("color_node", null, inp.default_value);
2024-03-13 23:50:11 +01:00
}
else if (inp.type == "VALUE") {
2024-09-24 16:50:54 +02:00
v = parser_logic_create_node_instance("float_node", null, inp.default_value);
2024-03-13 23:50:11 +01:00
}
else if (inp.type == "INT") {
2024-09-24 16:50:54 +02:00
v = parser_logic_create_node_instance("integer_node", null, inp.default_value);
2024-03-13 23:50:11 +01:00
}
else if (inp.type == "BOOLEAN") {
2024-09-24 16:50:54 +02:00
v = parser_logic_create_node_instance("boolean_node", null, inp.default_value);
2024-03-13 23:50:11 +01:00
}
else if (inp.type == "STRING") {
2024-09-24 16:50:54 +02:00
v = parser_logic_create_node_instance("string_node", null, inp.default_value);
2024-03-13 23:50:11 +01:00
}
else {
2024-09-24 16:50:54 +02:00
v = parser_logic_create_node_instance("null_node", null, null);
2024-03-13 23:50:11 +01:00
}
return v;
}
2024-09-24 16:50:54 +02:00
function parser_logic_create_node_instance(node_type: string, raw: ui_node_t, args: f32_array_t): logic_node_ext_t {
2024-03-20 16:13:54 +01:00
if (map_get(parser_logic_custom_nodes, node_type) != null) {
2024-10-21 19:28:43 +02:00
let node: logic_node_t = logic_node_create(null);
2025-10-15 18:39:55 +02:00
node.get = map_get(parser_logic_custom_nodes, node_type);
node.ext = {base : node};
2024-10-21 19:28:43 +02:00
return node.ext;
2024-03-13 23:50:11 +01:00
}
2024-03-14 23:58:24 +01:00
2024-03-21 21:06:41 +01:00
if (nodes_brush_creates == null) {
nodes_brush_init();
2024-03-14 23:58:24 +01:00
}
2025-10-15 18:39:55 +02:00
let create: (raw: ui_node_t, args: f32_array_t) => logic_node_ext_t = map_get(nodes_brush_creates, node_type);
2024-09-24 16:50:54 +02:00
return create(raw, args);
2024-03-13 23:50:11 +01:00
}