From fec0e9ced1265c86c4092d25fbbc3a963d2018a5 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Wed, 24 Jul 2024 00:17:08 +0200 Subject: [PATCH] minits fixes --- armorforge/sources/tab_objects.ts | 4 +- base/sources/box_export.ts | 16 +- base/sources/box_preferences.ts | 17 +- base/sources/config.ts | 10 +- base/sources/export_arm.ts | 10 +- base/sources/history.ts | 91 +------ base/sources/nodes_material.ts | 2 +- base/sources/tab_brushes.ts | 2 +- base/sources/tab_materials.ts | 2 +- base/sources/ui_nodes.ts | 6 +- base/sources/util_clone.ts | 382 ++++++++++++++++++++++++++++++ base/sources/util_particle.ts | 6 +- 12 files changed, 440 insertions(+), 108 deletions(-) create mode 100644 base/sources/util_clone.ts diff --git a/armorforge/sources/tab_objects.ts b/armorforge/sources/tab_objects.ts index 6198cf80..fcd19c30 100644 --- a/armorforge/sources/tab_objects.ts +++ b/armorforge/sources/tab_objects.ts @@ -19,7 +19,7 @@ function tab_objects_draw_menu(ui: zui_t) { for (let i: i32 = 0; i < _scene_raw.shader_datas.length; ++i) { let sh: shader_data_t = _scene_raw.shader_datas[i]; if (sh.name == "Material_data") { - let s: shader_data_t = json_parse(json_stringify(sh)); + let s: shader_data_t = util_clone_shader_data(sh); s.name = "TempMaterial_data" + tab_objects_material_id; array_push(_scene_raw.shader_datas, s); break; @@ -29,7 +29,7 @@ function tab_objects_draw_menu(ui: zui_t) { for (let i: i32 = 0; i < _scene_raw.material_datas.length; ++i) { let mat: material_data_t = _scene_raw.material_datas[i]; if (mat.name == "Material") { - let m: material_data_t = json_parse(json_stringify(mat)); + let m: material_data_t = util_clone_material_data(mat); m.name = "TempMaterial" + tab_objects_material_id; m.shader = "TempMaterial_data" + tab_objects_material_id; array_push(_scene_raw.material_datas, m); diff --git a/base/sources/box_export.ts b/base/sources/box_export.ts index d76fb23a..f14cecfd 100644 --- a/base/sources/box_export.ts +++ b/base/sources/box_export.ts @@ -556,6 +556,20 @@ function box_export_save_preset() { return; // generic is const } let path: string = path_data() + path_sep + "export_presets" + path_sep + name + ".json"; - krom_file_save_bytes(path, sys_string_to_buffer(json_stringify(box_export_preset)), 0); + krom_file_save_bytes(path, sys_string_to_buffer(box_export_preset_to_json(box_export_preset)), 0); +} + +function box_export_preset_to_json(p: export_preset_t): string { + json_encode_begin(); + json_encode_begin_array("textures"); + for (let i: i32 = 0; i < p.textures.length; ++i) { + json_encode_begin_object(); + json_encode_string("name", p.textures[i].name); + json_encode_string_array("channels", p.textures[i].channels); + json_encode_string("color_space", p.textures[i].color_space); + json_encode_end_object(); + } + json_encode_end_array(); + return json_encode_end(); } ///end diff --git a/base/sources/box_preferences.ts b/base/sources/box_preferences.ts index 66b49064..b9a981da 100644 --- a/base/sources/box_preferences.ts +++ b/base/sources/box_preferences.ts @@ -207,7 +207,7 @@ function box_preferences_show() { } let theme_name: string = zui_text_input(h, tr("Name")); if (zui_button(tr("OK")) || ui.is_return_down) { - let template: string = json_stringify(base_theme); + let template: string = box_preferences_theme_to_json(base_theme); if (!ends_with(theme_name, ".json")) { theme_name += ".json"; } @@ -237,7 +237,7 @@ function box_preferences_show() { if (!ends_with(path, ".json")) { path += ".json"; } - krom_file_save_bytes(path, sys_string_to_buffer(json_stringify(base_theme)), 0); + krom_file_save_bytes(path, sys_string_to_buffer(box_preferences_theme_to_json(base_theme)), 0); }); } @@ -762,7 +762,7 @@ function box_preferences_show() { } let keymap_name: string = zui_text_input(h, tr("Name")); if (zui_button(tr("OK")) || ui.is_return_down) { - let template: string = json_stringify(base_get_default_keymap()); + let template: string = config_keymap_to_json(base_get_default_keymap()); if (!ends_with(keymap_name, ".json")) { keymap_name += ".json"; } @@ -974,3 +974,14 @@ function box_preferences_set_scale() { ui_toolbar_w = math_floor(ui_toolbar_default_w * scale); ///end } + +function box_preferences_theme_to_json(theme: zui_theme_t): string { + json_encode_begin(); + let u32_theme: u32_ptr = theme; + for (let i: i32 = 0; i < zui_theme_keys.length; ++i) { + let key: string = zui_theme_keys[i]; + let val: u32 = DEREFERENCE(u32_theme + i); + json_encode_i32(key, val); + } + return json_encode_end(); +} diff --git a/base/sources/config.ts b/base/sources/config.ts index d87d06ea..baff59f6 100644 --- a/base/sources/config.ts +++ b/base/sources/config.ts @@ -39,7 +39,7 @@ function config_save() { } path += "config.json"; - json_encode_start(); + json_encode_begin(); json_encode_string("locale", config_raw.locale); json_encode_i32("window_mode", config_raw.window_mode); json_encode_i32("window_w", config_raw.window_w); @@ -278,10 +278,16 @@ function config_save_keymap() { return; } let path: string = data_path() + "keymap_presets/" + config_raw.keymap; - let buffer: buffer_t = sys_string_to_buffer(json_stringify(config_keymap)); + let buffer: buffer_t = sys_string_to_buffer(config_keymap_to_json(config_keymap)); krom_file_save_bytes(path, buffer, 0); } +function config_keymap_to_json(keymap: map_t): string { + json_encode_begin(); + json_encode_map(keymap); + return json_encode_end(); +} + function config_get_super_sample_quality(f: f32): i32 { return f == 0.25 ? 0 : f == 0.5 ? 1 : diff --git a/base/sources/export_arm.ts b/base/sources/export_arm.ts index bb7b42b4..b683673b 100644 --- a/base/sources/export_arm.ts +++ b/base/sources/export_arm.ts @@ -48,7 +48,7 @@ function export_arm_run_project() { let mnodes: zui_node_canvas_t[] = []; for (let i: i32 = 0; i < project_materials.length; ++i) { let m: slot_material_t = project_materials[i]; - let c: zui_node_canvas_t = json_parse(json_stringify(m.canvas)); + let c: zui_node_canvas_t = util_clone_canvas(m.canvas); for (let i: i32 = 0; i < c.nodes.length; ++i) { let n: zui_node_t = c.nodes[i]; export_arm_export_node(n); @@ -64,7 +64,7 @@ function export_arm_run_project() { ///end ///if is_lab - let c: zui_node_canvas_t = json_parse(json_stringify(project_canvas)); + let c: zui_node_canvas_t = util_clone_canvas(project_canvas); for (let i: i32 = 0; i < c.nodes.length; ++i) { let n: zui_node_t = c.nodes[i]; export_arm_export_node(n); @@ -76,7 +76,7 @@ function export_arm_run_project() { mgroups = []; for (let i: i32 = 0; i < project_material_groups.length; ++i) { let g: node_group_t = project_material_groups[i]; - let c: zui_node_canvas_t = json_parse(json_stringify(g.canvas)); + let c: zui_node_canvas_t = util_clone_canvas(g.canvas); for (let i: i32 = 0; i < c.nodes.length; ++i) { let n: zui_node_t = c.nodes[i]; export_arm_export_node(n); @@ -293,7 +293,7 @@ function export_arm_run_material(path: string) { let mnodes: zui_node_canvas_t[] = []; let mgroups: zui_node_canvas_t[] = null; let m: slot_material_t = context_raw.material; - let c: zui_node_canvas_t = json_parse(json_stringify(m.canvas)); + let c: zui_node_canvas_t = util_clone_canvas(m.canvas); let assets: asset_t[] = []; if (ui_nodes_has_group(c)) { mgroups = []; @@ -375,7 +375,7 @@ function export_arm_run_brush(path: string) { } let bnodes: zui_node_canvas_t[] = []; let b: slot_brush_t = context_raw.brush; - let c: zui_node_canvas_t = json_parse(json_stringify(b.canvas)); + let c: zui_node_canvas_t = util_clone_canvas(b.canvas); let assets: asset_t[] = []; for (let i: i32 = 0; i < c.nodes.length; ++i) { let n: zui_node_t = c.nodes[i]; diff --git a/base/sources/history.ts b/base/sources/history.ts index f3a8417a..a5f2c28c 100644 --- a/base/sources/history.ts +++ b/base/sources/history.ts @@ -476,7 +476,7 @@ function history_edit_nodes(canvas: zui_node_canvas_t, canvas_group: i32 = -1) { ///if (is_paint || is_sculpt) step.canvas_type = canvas_type; ///end - step.canvas = history_clone_canvas(canvas); + step.canvas = util_clone_canvas(canvas); } ///if (is_paint || is_sculpt) @@ -599,26 +599,26 @@ function history_layer_blending() { function history_new_material() { let step: step_t = history_push(tr("New Material")); step.canvas_type = 0; - step.canvas = history_clone_canvas(context_raw.material.canvas); + step.canvas = util_clone_canvas(context_raw.material.canvas); } function history_delete_material() { let step: step_t = history_push(tr("Delete Material")); step.canvas_type = 0; - step.canvas = history_clone_canvas(context_raw.material.canvas); + step.canvas = util_clone_canvas(context_raw.material.canvas); } function history_duplicate_material() { let step: step_t = history_push(tr("Duplicate Material")); step.canvas_type = 0; - step.canvas = history_clone_canvas(context_raw.material.canvas); + step.canvas = util_clone_canvas(context_raw.material.canvas); } function history_delete_material_group(group: node_group_t) { let step: step_t = history_push(tr("Delete Node Group")); step.canvas_type = canvas_type_t.MATERIAL; step.canvas_group = array_index_of(project_material_groups, group); - step.canvas = history_clone_canvas(group.canvas); + step.canvas = util_clone_canvas(group.canvas); } ///end @@ -781,87 +781,6 @@ function history_swap_canvas(step: step_t) { ui_nodes_hwnd.redraws = 2; } -function history_clone_canvas_sockets(sockets: zui_node_socket_t[]): zui_node_socket_t[] { - let r: zui_node_socket_t[] = []; - for (let i: i32 = 0; i < sockets.length; ++i) { - let s: zui_node_socket_t = {}; - s.id = sockets[i].id;; - s.node_id = sockets[i].node_id; - s.name = sockets[i].name; - s.type = sockets[i].type; - s.color = sockets[i].color; - let f32a: f32_array_t = sockets[i].default_value; - s.default_value = f32a != null ? f32_array_create_from_array(f32a) : null; - s.min = sockets[i].min; - s.max = sockets[i].max; - s.precision = sockets[i].precision; - s.display = sockets[i].display; - array_push(r, s); - } - return r; -} - -function history_clone_canvas_buttons(buttons: zui_node_button_t[]): zui_node_button_t[] { - let r: zui_node_button_t[] = []; - for (let i: i32 = 0; i < buttons.length; ++i) { - let b: zui_node_button_t = {}; - b.name = buttons[i].name; - b.type = buttons[i].type; - b.output = buttons[i].output; - let f32a: f32_array_t = buttons[i].default_value; - b.default_value = f32a != null ? f32_array_create_from_array(f32a) : null; - let u8a: u8_array_t = buttons[i].data; - b.data = u8a != null ? u8_array_create_from_array(u8a) : null; - b.min = buttons[i].min; - b.max = buttons[i].max; - b.precision = buttons[i].precision; - b.height = buttons[i].height; - array_push(r, b); - } - return r; -} - -function history_clone_canvas_nodes(nodes: zui_node_t[]): zui_node_t[] { - let r: zui_node_t[] = []; - for (let i: i32 = 0; i < nodes.length; ++i) { - let n: zui_node_t = {}; - n.id = nodes[i].id; - n.name = nodes[i].name; - n.type = nodes[i].type; - n.x = nodes[i].x; - n.y = nodes[i].y; - n.color = nodes[i].color; - n.inputs = history_clone_canvas_sockets(nodes[i].inputs); - n.outputs = history_clone_canvas_sockets(nodes[i].outputs); - n.buttons = history_clone_canvas_buttons(nodes[i].buttons); - n.width = nodes[i].width; - array_push(r, n); - } - return r; -} - -function history_clone_canvas_links(links: zui_node_link_t[]): zui_node_link_t[] { - let r: zui_node_link_t[] = []; - for (let i: i32 = 0; i < links.length; ++i) { - let l: zui_node_link_t = {}; - l.id = links[i].id; - l.from_id = links[i].from_id; - l.from_socket = links[i].from_socket; - l.to_id = links[i].to_id; - l.to_socket = links[i].to_socket; - array_push(r, l); - } - return r; -} - -function history_clone_canvas(c: zui_node_canvas_t): zui_node_canvas_t { - let r: zui_node_canvas_t = {}; - r.name = c.name; - r.nodes = history_clone_canvas_nodes(c.nodes); - r.links = history_clone_canvas_links(c.links); - return r; -} - type step_t = { name?: string; canvas?: zui_node_canvas_t; // Node history diff --git a/base/sources/nodes_material.ts b/base/sources/nodes_material.ts index 548b90ac..59f6df23 100644 --- a/base/sources/nodes_material.ts +++ b/base/sources/nodes_material.ts @@ -4100,7 +4100,7 @@ function nodes_material_sync_group_sockets(canvas: zui_node_canvas_t, group_name if (n.type == "GROUP" && n.name == group_name) { let is_inputs: bool = node.name == "Group Input"; let old_sockets: zui_node_socket_t[] = is_inputs ? n.inputs : n.outputs; - let sockets: zui_node_socket_t[] = json_parse(json_stringify(is_inputs ? node.outputs : node.inputs)); + let sockets: zui_node_socket_t[] = util_clone_canvas_sockets(is_inputs ? node.outputs : node.inputs); if (is_inputs) { n.inputs = sockets; } diff --git a/base/sources/tab_brushes.ts b/base/sources/tab_brushes.ts index 13045c7b..125ddb70 100644 --- a/base/sources/tab_brushes.ts +++ b/base/sources/tab_brushes.ts @@ -105,7 +105,7 @@ function tab_brushes_draw(htab: zui_handle_t) { context_raw.brush = slot_brush_create(); array_push(project_brushes, context_raw.brush); - let cloned: any = json_parse(json_stringify(project_brushes[i].canvas)); + let cloned: any = util_clone_canvas(project_brushes[i].canvas); context_raw.brush.canvas = cloned; context_set_brush(context_raw.brush); util_render_make_brush_preview(); diff --git a/base/sources/tab_materials.ts b/base/sources/tab_materials.ts index 7582bad8..96b9d50e 100644 --- a/base/sources/tab_materials.ts +++ b/base/sources/tab_materials.ts @@ -183,7 +183,7 @@ function tab_materials_draw_slots(mini: bool) { context_raw.material = slot_material_create(project_materials[0].data); array_push(project_materials, context_raw.material); - let cloned: zui_node_canvas_t = json_parse(json_stringify(project_materials[i].canvas)); + let cloned: zui_node_canvas_t = util_clone_canvas(project_materials[i].canvas); context_raw.material.canvas = cloned; tab_materials_update_material(); history_duplicate_material(); diff --git a/base/sources/ui_nodes.ts b/base/sources/ui_nodes.ts index 0580d782..13c15da5 100644 --- a/base/sources/ui_nodes.ts +++ b/base/sources/ui_nodes.ts @@ -871,7 +871,7 @@ function ui_nodes_render() { // Undo if (ui_nodes_ui.input_started || ui_nodes_ui.is_key_pressed) { - // ui_nodes_last_canvas = json_parse(json_stringify(ui_nodes_get_canvas(true))); + ui_nodes_last_canvas = util_clone_canvas(ui_nodes_get_canvas(true)); } // Nodes @@ -1449,7 +1449,7 @@ function ui_nodes_make_node(n: zui_node_t, nodes: zui_nodes_t, canvas: zui_node_ function ui_nodes_make_group_node(group_canvas: zui_node_canvas_t, nodes: zui_nodes_t, canvas: zui_node_canvas_t): zui_node_t { let category: zui_node_t[] = nodes_material_list[5]; let n: zui_node_t = category[0]; - let node: zui_node_t = json_parse(json_stringify(n)); + let node: zui_node_t = util_clone_canvas_node(n); node.name = group_canvas.name; node.id = zui_next_node_id(canvas.nodes); node.x = ui_nodes_get_node_x(); @@ -1538,7 +1538,7 @@ function ui_nodes_traverse_group(mgroups: zui_node_canvas_t[], c: zui_node_canva array_push(canvases, g.canvas); } let group: zui_node_canvas_t = ui_nodes_get_group(canvases, n.name); - array_push(mgroups, json_parse(json_stringify(group))); + array_push(mgroups, util_clone_canvas(group)); ui_nodes_traverse_group(mgroups, group); } } diff --git a/base/sources/util_clone.ts b/base/sources/util_clone.ts new file mode 100644 index 00000000..321f9cef --- /dev/null +++ b/base/sources/util_clone.ts @@ -0,0 +1,382 @@ + +function util_clone_f32_array(f32a: f32_array_t): f32_array_t { + if (f32a == null) { + return null; + } + return f32_array_create_from_array(f32a); +} + +function util_clone_u32_array(u32a: u32_array_t): u32_array_t { + if (u32a == null) { + return null; + } + return u32_array_create_from_array(u32a); +} + +function util_clone_u8_array(u8a: u8_array_t): u8_array_t { + if (u8a == null) { + return null; + } + return u8_array_create_from_array(u8a); +} + +function util_clone_string_array(a: string[]): string[] { + if (a == null) { + return null; + } + let r: string[] = []; + for (let i: i32 = 0; i < a.length; ++i) { + let s: string = a[i]; + array_push(r, s); + } + return r; +} + +function util_clone_bool_array(a: bool[]): bool[] { + if (a == null) { + return null; + } + let r: bool[] = []; + for (let i: i32 = 0; i < a.length; ++i) { + let s: bool = a[i]; + array_push(r, s); + } + return r; +} + +function util_clone_canvas_sockets(sockets: zui_node_socket_t[]): zui_node_socket_t[] { + if (sockets == null) { + return null; + } + let r: zui_node_socket_t[] = []; + for (let i: i32 = 0; i < sockets.length; ++i) { + let s: zui_node_socket_t = {}; + s.id = sockets[i].id;; + s.node_id = sockets[i].node_id; + s.name = sockets[i].name; + s.type = sockets[i].type; + s.color = sockets[i].color; + s.default_value = util_clone_f32_array(sockets[i].default_value); + s.min = sockets[i].min; + s.max = sockets[i].max; + s.precision = sockets[i].precision; + s.display = sockets[i].display; + array_push(r, s); + } + return r; +} + +function util_clone_canvas_buttons(buttons: zui_node_button_t[]): zui_node_button_t[] { + if (buttons == null) { + return null; + } + let r: zui_node_button_t[] = []; + for (let i: i32 = 0; i < buttons.length; ++i) { + let b: zui_node_button_t = {}; + b.name = buttons[i].name; + b.type = buttons[i].type; + b.output = buttons[i].output; + b.default_value = util_clone_f32_array(buttons[i].default_value); + b.data = util_clone_u8_array(buttons[i].data); + b.min = buttons[i].min; + b.max = buttons[i].max; + b.precision = buttons[i].precision; + b.height = buttons[i].height; + array_push(r, b); + } + return r; +} + +function util_clone_canvas_node(n: zui_node_t): zui_node_t { + if (n == null) { + return null; + } + let r: zui_node_t = {}; + r.id = n.id; + r.name = n.name; + r.type = n.type; + r.x = n.x; + r.y = n.y; + r.color = n.color; + r.inputs = util_clone_canvas_sockets(n.inputs); + r.outputs = util_clone_canvas_sockets(n.outputs); + r.buttons = util_clone_canvas_buttons(n.buttons); + r.width = n.width; + return r; +} + +function util_clone_canvas_nodes(nodes: zui_node_t[]): zui_node_t[] { + if (nodes == null) { + return null; + } + let r: zui_node_t[] = []; + for (let i: i32 = 0; i < nodes.length; ++i) { + let n: zui_node_t = util_clone_canvas_node(nodes[i]); + array_push(r, n); + } + return r; +} + +function util_clone_canvas_links(links: zui_node_link_t[]): zui_node_link_t[] { + if (links == null) { + return null; + } + let r: zui_node_link_t[] = []; + for (let i: i32 = 0; i < links.length; ++i) { + let l: zui_node_link_t = {}; + l.id = links[i].id; + l.from_id = links[i].from_id; + l.from_socket = links[i].from_socket; + l.to_id = links[i].to_id; + l.to_socket = links[i].to_socket; + array_push(r, l); + } + return r; +} + +function util_clone_canvas(c: zui_node_canvas_t): zui_node_canvas_t { + if (c == null) { + return null; + } + let r: zui_node_canvas_t = {}; + r.name = c.name; + r.nodes = util_clone_canvas_nodes(c.nodes); + r.links = util_clone_canvas_links(c.links); + return r; +} + +function util_clone_vertex_elements(elems: vertex_element_t[]): vertex_element_t[] { + if (elems == null) { + return null; + } + let r: vertex_element_t[] = []; + for (let i: i32 = 0; i < elems.length; ++i) { + let e: vertex_element_t = {}; + e.name = elems[i].name; + e.data = elems[i].data; + array_push(r, e); + } + return r; +} + +function util_clone_shader_consts(consts: shader_const_t[]): shader_const_t[] { + if (consts == null) { + return null; + } + let r: shader_const_t[] = []; + for (let i: i32 = 0; i < consts.length; ++i) { + let s: shader_const_t = {}; + s.name = consts[i].name; + s.type = consts[i].type; + s.link = consts[i].link; + array_push(r, s); + } + return r; +} + +function util_clone_tex_units(units: tex_unit_t[]): tex_unit_t[] { + if (units == null) { + return null; + } + let r: tex_unit_t[] = []; + for (let i: i32 = 0; i < units.length; ++i) { + let u: tex_unit_t = {}; + u.name = units[i].name; + u.link = units[i].link; + u.image_uniform = units[i].image_uniform; + array_push(r, u); + } + return r; +} + +function util_clone_shader_contexts(contexts: shader_context_t[]): shader_context_t[] { + if (contexts == null) { + return null; + } + let r: shader_context_t[] = []; + for (let i: i32 = 0; i < contexts.length; ++i) { + let c: shader_context_t = {}; + c.name = contexts[i].name; + c.depth_write = contexts[i].depth_write; + c.compare_mode = contexts[i].compare_mode; + c.cull_mode = contexts[i].cull_mode; + c.vertex_shader = contexts[i].vertex_shader; + c.fragment_shader = contexts[i].fragment_shader; + c.geometry_shader = contexts[i].geometry_shader; + c.shader_from_source = contexts[i].shader_from_source; + c.blend_source = contexts[i].blend_source; + c.blend_destination = contexts[i].blend_destination; + c.blend_operation = contexts[i].blend_operation; + c.alpha_blend_source = contexts[i].alpha_blend_source; + c.alpha_blend_destination = contexts[i].alpha_blend_destination; + c.alpha_blend_operation = contexts[i].alpha_blend_operation; + c.color_writes_red = util_clone_bool_array(contexts[i].color_writes_red); + c.color_writes_green = util_clone_bool_array(contexts[i].color_writes_green); + c.color_writes_blue = util_clone_bool_array(contexts[i].color_writes_blue); + c.color_writes_alpha = util_clone_bool_array(contexts[i].color_writes_alpha); + c.color_attachments = util_clone_string_array(contexts[i].color_attachments); + c.depth_attachment = contexts[i].depth_attachment; + c.vertex_elements = util_clone_vertex_elements(contexts[i].vertex_elements); + c.constants = util_clone_shader_consts(contexts[i].constants); + c.texture_units = util_clone_tex_units(contexts[i].texture_units); + array_push(r, c); + } + return r; +} + +function util_clone_shader_data(s: shader_data_t): shader_data_t { + if (s == null) { + return null; + } + let r: shader_data_t = {}; + r.name = s.name; + r.contexts = util_clone_shader_contexts(s.contexts); + return r; +} + +function util_clone_bind_constants(consts: bind_const_t[]): bind_const_t[] { + if (consts == null) { + return null; + } + let r: bind_const_t[] = []; + for (let i: i32 = 0; i < consts.length; ++i) { + let c: bind_const_t = {}; + c.name = consts[i].name; + c.vec = util_clone_f32_array(consts[i].vec); + array_push(r, c); + } + return r; +} + +function util_clone_bind_textures(texs: bind_tex_t[]): bind_tex_t[] { + if (texs == null) { + return null; + } + let r: bind_tex_t[] = []; + for (let i: i32 = 0; i < texs.length; ++i) { + let t: bind_tex_t = {}; + t.name = texs[i].name; + t.file = texs[i].file; + t.u_addressing = texs[i].u_addressing; + t.v_addressing = texs[i].v_addressing; + t.min_filter = texs[i].min_filter; + t.mag_filter = texs[i].mag_filter; + t.mipmap_filter = texs[i].mipmap_filter; + t.generate_mipmaps = texs[i].generate_mipmaps; + t.mipmaps = util_clone_string_array(texs[i].mipmaps); + array_push(r, t); + } + return r; +} + +function util_clone_material_contexts(contexts: material_context_t[]): material_context_t[] { + if (contexts == null) { + return null; + } + let r: material_context_t[] = []; + for (let i: i32 = 0; i < contexts.length; ++i) { + let c: material_context_t = {}; + c.name = contexts[i].name; + c.bind_constants = util_clone_bind_constants(contexts[i].bind_constants); + c.bind_textures = util_clone_bind_textures(contexts[i].bind_textures); + array_push(r, c); + } + return r; +} + +function util_clone_material_data(m: material_data_t): material_data_t { + if (m == null) { + return null; + } + let r: material_data_t = {}; + r.name = m.name; + r.shader = m.shader; + r.contexts = util_clone_material_contexts(m.contexts); + return r; +} + +function util_clone_particle_refs(parts: particle_ref_t[]): particle_ref_t[] { + if (parts == null) { + return null; + } + let r: particle_ref_t[] = []; + for (let i: i32 = 0; i < parts.length; ++i) { + let p: particle_ref_t = {}; + p.name = parts[i].name; + p.particle = parts[i].particle; + p.seed = parts[i].seed; + array_push(r, p); + } + return r; +} + +function util_clone_particles(p: particles_t): particles_t { + if (p == null) { + return null; + } + let r: particles_t = {}; + r.refs = util_clone_particle_refs(p.refs); + r.render_emitter = p.render_emitter; + r.is_particle = p.is_particle; + return r; +} + +function util_clone_tracks(tracks: track_t[]): track_t[] { + if (tracks == null) { + return null; + } + let r: track_t[] = []; + for (let i: i32 = 0; i < tracks.length; ++i) { + let t: track_t = {}; + t.target = tracks[i].target; + t.frames = util_clone_u32_array(tracks[i].frames); + t.values = util_clone_f32_array(tracks[i].values); + array_push(r, t); + } + return r; +} + +function util_clone_anim(a: anim_t): anim_t { + if (a == null) { + return null; + } + let r: anim_t = {}; + r.object_actions = util_clone_string_array(a.object_actions); + r.bone_actions = util_clone_string_array(a.bone_actions); + r.parent_bone = a.parent_bone; + r.parent_bone_tail = util_clone_f32_array(a.parent_bone_tail); + r.parent_bone_tail_pose = util_clone_f32_array(a.parent_bone_tail_pose); + r.parent_bone_connected = a.parent_bone_connected; + r.tracks = util_clone_tracks(a.tracks); + r.begin = a.begin; + r.end = a.end; + r.has_delta = a.has_delta; + r.marker_frames = util_clone_u32_array(a.marker_frames); + r.marker_names = util_clone_string_array(a.marker_names); + return r; +} + +function util_clone_obj(o: obj_t): obj_t { + if (o == null) { + return null; + } + let r: obj_t = {}; + r.name = o.name; + r.type = o.type; + r.data_ref = o.data_ref; + r.transform = util_clone_f32_array(o.transform); + r.dimensions = util_clone_f32_array(o.dimensions); + r.visible = o.visible; + r.spawn = o.spawn; + r.particles = util_clone_particles(o.particles); + r.anim = util_clone_anim(o.anim); + r.material_refs = util_clone_string_array(o.material_refs); + if (o.children != null) { + r.children = []; + for (let i: i32 = 0; i < o.children.length; ++i) { + let c: obj_t = util_clone_obj(o.children[i]); + array_push(r.children, c); + } + } + return r; +} diff --git a/base/sources/util_particle.ts b/base/sources/util_particle.ts index e23720b5..f6de4f7f 100644 --- a/base/sources/util_particle.ts +++ b/base/sources/util_particle.ts @@ -45,7 +45,7 @@ function util_particle_init() { for (let i: i32 = 0; i < _scene_raw.material_datas.length; ++i) { let mat: material_data_t = _scene_raw.material_datas[i]; if (mat.name == "Material2") { - let m: material_data_t = json_parse(json_stringify(mat)); + let m: material_data_t = util_clone_material_data(mat); m.name = "MaterialParticle"; array_push(_scene_raw.material_datas, m); break; @@ -58,7 +58,7 @@ function util_particle_init() { for (let i: i32 = 0; i < _scene_raw.objects.length; ++i) { let obj: obj_t = _scene_raw.objects[i]; if (obj.name == ".Sphere") { - let particle: obj_t = json_parse(json_stringify(obj)); + let particle: obj_t = util_clone_obj(obj); particle.name = ".Particle"; if (particle.particles == null) { particle.particles = {}; @@ -76,7 +76,7 @@ function util_particle_init() { let o: object_t = scene_spawn_object(".Sphere"); let mo: mesh_object_t = o.ext; mo.base.name = ".ParticleEmitter"; - mo.base.raw = json_parse(json_stringify(mo.base.raw)); + mo.base.raw = util_clone_obj(mo.base.raw); mo.base.raw.particles.refs = particle_refs; ///if arm_particles mesh_object_setup_particle_system(mo, "Scene", particle_refs[0]);