From e4f4ebcf83a8d87d919ad668a5aa7d8d10eb8377 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Sat, 23 Nov 2024 22:16:56 +0100 Subject: [PATCH] gc fixes --- base/sources/export_arm.ts | 73 ++++++++++++++++++----------------- base/sources/import_arm.ts | 2 +- base/sources/project.ts | 5 ++- base/sources/slot_brush.ts | 4 +- base/sources/slot_material.ts | 3 +- base/sources/util_clone.ts | 14 +++++++ 6 files changed, 61 insertions(+), 40 deletions(-) diff --git a/base/sources/export_arm.ts b/base/sources/export_arm.ts index 48d1e636..c5f0593e 100644 --- a/base/sources/export_arm.ts +++ b/base/sources/export_arm.ts @@ -125,44 +125,47 @@ function export_arm_run_project() { let same_drive: bool = project_raw.envmap != null ? char_at(project_filepath, 0) == char_at(project_raw.envmap, 0) : true; ///end - project_raw = { - version: manifest_version, - material_groups: mgroups, - assets: texture_files, - packed_assets: packed_assets, - swatches: project_raw.swatches, - envmap: project_raw.envmap != null ? - (same_drive ? - path_to_relative(project_filepath, project_raw.envmap) : - project_raw.envmap) : - null, - envmap_strength: scene_world.strength, - camera_world: mat4_to_f32_array(scene_camera.base.transform.local), - camera_origin: export_arm_vec3f32(camera_origins[0].v), - camera_fov: scene_camera.data.fov, + project_raw.version = manifest_version; + project_raw.material_groups = mgroups; + project_raw.assets = texture_files; + project_raw.packed_assets = packed_assets; + project_raw.swatches = project_raw.swatches; + project_raw.envmap = project_raw.envmap != null ? + (same_drive ? + path_to_relative(project_filepath, project_raw.envmap) : + project_raw.envmap) : + null; + project_raw.envmap_strength = scene_world.strength; + project_raw.camera_world = mat4_to_f32_array(scene_camera.base.transform.local); + project_raw.camera_origin = export_arm_vec3f32(camera_origins[0].v); + project_raw.camera_fov = scene_camera.data.fov; - ///if (is_paint || is_sculpt) - mesh_datas: md, - material_nodes: mnodes, - brush_nodes: bnodes, - layer_datas: ld, - font_assets: font_files, - mesh_assets: mesh_files, - atlas_objects: project_atlas_objects, - atlas_names: project_atlas_names, - ///end + ///if (is_paint || is_sculpt) + // project_raw.mesh_datas = md; // TODO: fix GC ref + project_raw.mesh_datas.length = 0; + for (let i: i32 = 0; i < md.length; ++i) { + array_push(project_raw.mesh_datas, md[i]); + } - ///if is_lab - mesh_data: md, - material: c, - ///end + project_raw.material_nodes = mnodes; + project_raw.brush_nodes = bnodes; + project_raw.layer_datas = ld; + project_raw.font_assets = font_files; + project_raw.mesh_assets = mesh_files; + project_raw.atlas_objects = project_atlas_objects; + project_raw.atlas_names = project_atlas_names; + ///end - ///if (arm_metal || arm_vulkan) - is_bgra: true - ///else - is_bgra: false - ///end - }; + ///if is_lab + project_raw.mesh_data = md; + project_raw.material = c; + ///end + + ///if (arm_metal || arm_vulkan) + project_raw.is_bgra = true; + ///else + project_raw.is_bgra = false; + ///end ///if (arm_android || arm_ios) let rt: render_target_t = map_get(render_path_render_targets, context_raw.render_mode == render_mode_t.FORWARD ? "buf" : "tex"); diff --git a/base/sources/import_arm.ts b/base/sources/import_arm.ts index 8f405a13..e65d5c45 100644 --- a/base/sources/import_arm.ts +++ b/base/sources/import_arm.ts @@ -615,7 +615,7 @@ function import_arm_run_swatches_from_project(project: project_format_t, path: s if (project.swatches != null) { for (let i: i32 = 0; i < project.swatches.length; ++i) { - let s: swatch_color_t = project.swatches[i]; + let s: swatch_color_t = util_clone_swatch_color(project.swatches[i]); array_push(project_raw.swatches, s); } } diff --git a/base/sources/project.ts b/base/sources/project.ts index bf1b06c9..fcc5564a 100644 --- a/base/sources/project.ts +++ b/base/sources/project.ts @@ -36,6 +36,7 @@ let _project_unwrap_mesh_box_skip_ui: bool; let _project_import_asset_hdr_as_envmap: bool; let _project_import_swatches_replace_existing: bool; let _project_reimport_texture_asset: asset_t; +let _project_scene_mesh_gc: scene_t; function project_open() { ui_files_show("arm", false, false, function (path: string) { @@ -209,8 +210,8 @@ function project_new(reset_layers: bool = true) { } else { let b: buffer_t = data_get_blob("meshes/" + project_mesh_list[context_raw.project_type] + ".arm"); - let scene: scene_t = armpack_decode(b); - raw = scene.mesh_datas[0]; + _project_scene_mesh_gc = armpack_decode(b); + raw = _project_scene_mesh_gc.mesh_datas[0]; } let md: mesh_data_t = mesh_data_create(raw); diff --git a/base/sources/slot_brush.ts b/base/sources/slot_brush.ts index bd51fd69..0415dfa5 100644 --- a/base/sources/slot_brush.ts +++ b/base/sources/slot_brush.ts @@ -29,11 +29,13 @@ function slot_brush_create(c: ui_node_canvas_t = null): slot_brush_t { slot_brush_default_canvas = b; } raw.canvas = armpack_decode(slot_brush_default_canvas); + raw.canvas = util_clone_canvas(raw.canvas); // Clone to create GC references + let id: i32 = (raw.id + 1); raw.canvas.name = "Brush " + id; } else { - raw.canvas = c; + raw.canvas = util_clone_canvas(c); } return raw; diff --git a/base/sources/slot_material.ts b/base/sources/slot_material.ts index 57b96141..663b3401 100644 --- a/base/sources/slot_material.ts +++ b/base/sources/slot_material.ts @@ -54,11 +54,12 @@ function slot_material_create(m: material_data_t = null, c: ui_node_canvas_t = n slot_material_default_canvas = b; } raw.canvas = armpack_decode(slot_material_default_canvas); + raw.canvas = util_clone_canvas(raw.canvas); // Clone to create GC references let id: i32 = (raw.id + 1); raw.canvas.name = "Material " + id; } else { - raw.canvas = c; + raw.canvas = util_clone_canvas(c); } ///if (arm_android || arm_ios) diff --git a/base/sources/util_clone.ts b/base/sources/util_clone.ts index 647a6609..14d7b006 100644 --- a/base/sources/util_clone.ts +++ b/base/sources/util_clone.ts @@ -380,3 +380,17 @@ function util_clone_obj(o: obj_t): obj_t { } return r; } + +function util_clone_swatch_color(s: swatch_color_t): swatch_color_t { + let r: swatch_color_t = {}; + r.base = s.base; + r.opacity = s.opacity; + r.occlusion = s.occlusion; + r.roughness = s.roughness; + r.metallic = s.metallic; + r.normal = s.normal; + r.emission = s.emission; + r.height = s.height; + r.subsurface = s.subsurface; + return r; +}