From 107394ba3a252837401c6920f95cfc1419740c78 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Tue, 2 Sep 2025 19:32:15 +0200 Subject: [PATCH] Cleanup --- base/sources/ts/mesh_object.ts | 32 ++++++-------- base/sources/ts/render_path.ts | 2 +- base/sources/ts/scene.ts | 27 +++++------- base/sources/ts/uniforms.ts | 4 +- base/tests/cube/sources/main.ts | 2 +- base/tests/fall/sources/main.ts | 4 +- base/tools/io_export_arm.py | 2 +- paint/assets/Scene.arm | Bin 149834 -> 149755 bytes paint/assets/meshes/box.arm | Bin 1284 -> 1283 bytes paint/assets/meshes/box_bevel.arm | Bin 9156 -> 9155 bytes paint/assets/meshes/box_bevel_shared_uvs.arm | Bin 19716 -> 19715 bytes paint/assets/meshes/box_shared_uvs.arm | Bin 1284 -> 1283 bytes paint/assets/meshes/cone.arm | Bin 6367 -> 6366 bytes paint/assets/meshes/cylinder.arm | Bin 9939 -> 9938 bytes paint/assets/meshes/torus.arm | Bin 27162 -> 27161 bytes paint/sources/import_arm.ts | 4 +- paint/sources/import_mesh.ts | 2 +- paint/sources/project.ts | 43 ++++++++----------- paint/sources/render_path_paint.ts | 4 +- paint/sources/sim.ts | 2 +- paint/sources/tab_meshes.ts | 4 +- paint/sources/util_clone.ts | 2 +- paint/sources/util_mesh.ts | 2 +- paint/sources/util_particle.ts | 2 +- paint/sources/util_render.ts | 2 +- 25 files changed, 60 insertions(+), 80 deletions(-) diff --git a/base/sources/ts/mesh_object.ts b/base/sources/ts/mesh_object.ts index 5af9ec05..759638ef 100644 --- a/base/sources/ts/mesh_object.ts +++ b/base/sources/ts/mesh_object.ts @@ -2,7 +2,7 @@ type mesh_object_t = { base?: object_t; data?: mesh_data_t; - materials?: material_data_t[]; + material?: material_data_t; camera_dist?: f32; frustum_culling?: bool; skip_context?: string; // Do not draw this context @@ -11,14 +11,14 @@ type mesh_object_t = { let _mesh_object_last_pipeline: gpu_pipeline_t = null; -function mesh_object_create(data: mesh_data_t, materials: material_data_t[]): mesh_object_t { +function mesh_object_create(data: mesh_data_t, material: material_data_t): mesh_object_t { let raw: mesh_object_t = {}; raw.frustum_culling = true; raw.base = object_create(false); raw.base.ext = raw; raw.base.ext_type = "mesh_object_t"; - raw.materials = materials; + raw.material = material; mesh_object_set_data(raw, data); array_push(scene_meshes, raw); return raw; @@ -43,7 +43,7 @@ function mesh_object_setup_animation(raw: mesh_object_t, oactions: scene_t[] = n function mesh_object_cull_material(raw: mesh_object_t, context: string): bool { // Skip render if material does not contain current context - if (!mesh_object_valid_context(raw, raw.materials, context)) { + if (!mesh_object_valid_context(raw, raw.material, context)) { raw.base.culled = true; return true; } @@ -89,14 +89,12 @@ function mesh_object_render(raw: mesh_object_t, context: string, bind_params: st let scontext: shader_context_t = null; let mcontext: material_context_t = null; - for (let i: i32 = 0; i < raw.materials.length; ++i) { - let mat: material_data_t = raw.materials[i]; - for (let j: i32 = 0; j < mat.contexts.length; ++j) { - if (mat.contexts[j].name == context) { - scontext = shader_data_get_context(mat._.shader, context); - mcontext = mat.contexts[j]; - break; - } + let mat: material_data_t = raw.material; + for (let j: i32 = 0; j < mat.contexts.length; ++j) { + if (mat.contexts[j].name == context) { + scontext = shader_data_get_context(mat._.shader, context); + mcontext = mat.contexts[j]; + break; } } @@ -112,14 +110,8 @@ function mesh_object_render(raw: mesh_object_t, context: string, bind_params: st gpu_draw(); } -function mesh_object_valid_context(raw: mesh_object_t, mats: material_data_t[], context: string): bool { - for (let i: i32 = 0; i < mats.length; ++i) { - let mat: material_data_t = mats[i]; - if (material_data_get_context(mat, context) != null) { - return true; - } - } - return false; +function mesh_object_valid_context(raw: mesh_object_t, mat: material_data_t, context: string): bool { + return material_data_get_context(mat, context) != null; } function mesh_object_compute_camera_dist(raw: mesh_object_t, cam_x: f32, cam_y: f32, cam_z: f32) { diff --git a/base/sources/ts/render_path.ts b/base/sources/ts/render_path.ts index b22254a5..ee8245bb 100644 --- a/base/sources/ts/render_path.ts +++ b/base/sources/ts/render_path.ts @@ -116,7 +116,7 @@ function render_path_sort_meshes_dist(meshes: mesh_object_t[]) { function _render_path_sort_shader(a: any_ptr, b: any_ptr): i32 { let ma: mesh_object_t = DEREFERENCE(a); let mb: mesh_object_t = DEREFERENCE(b); - return strcmp(ma.materials[0].name, mb.materials[0].name); + return strcmp(ma.material.name, mb.material.name); } function render_path_sort_meshes_shader(meshes: mesh_object_t[]) { diff --git a/base/sources/ts/scene.ts b/base/sources/ts/scene.ts index ddbe18a3..d376bced 100644 --- a/base/sources/ts/scene.ts +++ b/base/sources/ts/scene.ts @@ -156,8 +156,8 @@ function scene_get_empty(name: string): object_t { return null; } -function scene_add_mesh_object(data: mesh_data_t, materials: material_data_t[], parent: object_t = null): mesh_object_t { - let object: mesh_object_t = mesh_object_create(data, materials); +function scene_add_mesh_object(data: mesh_data_t, material: material_data_t, parent: object_t = null): mesh_object_t { + let object: mesh_object_t = mesh_object_create(data, material); parent != null ? object_set_parent(object.base, parent) : object_set_parent(object.base, _scene_root); return object; } @@ -269,18 +269,13 @@ function scene_create_object(o: obj_t, format: scene_t, parent: object_t): objec return scene_return_object(object.base, o); } else if (o.type == "mesh_object") { - if (o.material_refs == null || o.material_refs.length == 0) { + if (o.material_ref == null) { return scene_create_mesh_object(o, format, parent, null); } else { - // Materials - let materials: material_data_t[] = []; - for (let i: i32 = 0; i < o.material_refs.length; ++i) { - let ref: string = o.material_refs[i]; - let mat: material_data_t = data_get_material(scene_name, ref); - array_push(materials, mat); - } - return scene_create_mesh_object(o, format, parent, materials); + let ref: string = o.material_ref; + let mat: material_data_t = data_get_material(scene_name, ref); + return scene_create_mesh_object(o, format, parent, mat); } } ///if arm_audio @@ -298,7 +293,7 @@ function scene_create_object(o: obj_t, format: scene_t, parent: object_t): objec } } -function scene_create_mesh_object(o: obj_t, format: scene_t, parent: object_t, materials: material_data_t[]): object_t { +function scene_create_mesh_object(o: obj_t, format: scene_t, parent: object_t, material: material_data_t): object_t { // Mesh reference let ref: string[] = string_split(o.data_ref, "/"); let object_file: string = ""; @@ -313,12 +308,12 @@ function scene_create_mesh_object(o: obj_t, format: scene_t, parent: object_t, m data_ref = o.data_ref; } - return scene_return_mesh_object(object_file, data_ref, materials, parent, o); + return scene_return_mesh_object(object_file, data_ref, material, parent, o); } -function scene_return_mesh_object(object_file: string, data_ref: string, materials: material_data_t[], parent: object_t, o: obj_t): object_t { +function scene_return_mesh_object(object_file: string, data_ref: string, material: material_data_t, parent: object_t, o: obj_t): object_t { let mesh: mesh_data_t = data_get_mesh(object_file, data_ref); - let object: mesh_object_t = scene_add_mesh_object(mesh, materials, parent); + let object: mesh_object_t = scene_add_mesh_object(mesh, material, parent); return scene_return_object(object.base, o); } @@ -563,7 +558,7 @@ type obj_t = { visible?: bool; spawn?: bool; // Auto add object when creating scene anim?: anim_t; // Object animation - material_refs?: string[]; + material_ref?: string; children?: obj_t[]; _?: obj_runtime_t; }; diff --git a/base/sources/ts/uniforms.ts b/base/sources/ts/uniforms.ts index da9ba399..9724f076 100644 --- a/base/sources/ts/uniforms.ts +++ b/base/sources/ts/uniforms.ts @@ -580,9 +580,7 @@ function uniforms_set_material_consts(context: shader_context_t, material_contex function current_material(object: object_t): material_data_t { if (object != null && object.ext != null) { let mo: mesh_object_t = object.ext; - if (mo.materials != null) { - return mo.materials[0]; - } + return mo.material; } return null; } diff --git a/base/tests/cube/sources/main.ts b/base/tests/cube/sources/main.ts index 7b9cd6b0..0b369a79 100644 --- a/base/tests/cube/sources/main.ts +++ b/base/tests/cube/sources/main.ts @@ -32,7 +32,7 @@ function ready() { name: "Cube", type: "mesh_object", data_ref: "cube.arm/Cube", - material_refs: ["MyMaterial"], + material_ref: "MyMaterial", visible: true, spawn: true }, diff --git a/base/tests/fall/sources/main.ts b/base/tests/fall/sources/main.ts index b5cfd62e..5d587253 100644 --- a/base/tests/fall/sources/main.ts +++ b/base/tests/fall/sources/main.ts @@ -36,7 +36,7 @@ function ready() { name: "Cube", type: "mesh_object", data_ref: "cube.arm/Cube", - material_refs: ["MyMaterial"], + material_ref: "MyMaterial", visible: true, spawn: true }, @@ -44,7 +44,7 @@ function ready() { name: "Sphere", type: "mesh_object", data_ref: "sphere.arm/Sphere", - material_refs: ["MyMaterial"], + material_ref: "MyMaterial", visible: true, spawn: true }, diff --git a/base/tools/io_export_arm.py b/base/tools/io_export_arm.py index 39a23add..66c83468 100644 --- a/base/tools/io_export_arm.py +++ b/base/tools/io_export_arm.py @@ -125,7 +125,7 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper): o["visible"] = True o["spawn"] = True o["anim"] = None - o["material_refs"] = None + o["material_ref"] = None o["children"] = None if bobjectRef["objectType"] == NodeTypeMesh: diff --git a/paint/assets/Scene.arm b/paint/assets/Scene.arm index 12a6f6738375ffa9da2e02f12f1b222de1ab7416..05f9b8c50afc57beedffaca3051504536a3822be 100644 GIT binary patch delta 402 zcmX>#iSzeF&JFyG0z3>147rIVsYRKIIq^lQX_HkMe`5%4He+JOqO_4!XL8MR-pL)z zr!cfk21&}i;+@RIsWy2XGxy{YZso~$m<1-YvZi4u-rUH_h}C?v$>-QkV<-ojZ8rHS zJ5~vu$p+kflQ_>~(*%~AEYF2g@-B8={yawn(ZlJ$WCKQ}$?m-8Fts@FOHZE1Dmt0} f9~;>B_gUE{_wvofP}uCi-|oQAxZQ!DiOUKAH+p_% delta 471 zcmex8k@M6f&JFyGV!R9t47rIVsYRKIIq^lQX~lOLfg+RT8GqxJl9=qo^ct7+LvEeP zy3cthmocBhr{wHQ-pQRTc$F+*W1H#=Sv-hShoe1YRUK2zR) z6PWy(^DKTPe3O~D@tE>K5F?-`Kjis{%gm2_(v$yj^G{yD#y0uDU$)5-d?#@zZT`sD O{*jMy`$s+|E-L`7!JYO1 diff --git a/paint/assets/meshes/box.arm b/paint/assets/meshes/box.arm index 3422e8c09fdcc9b3345b92f53988cd7f7af30bf2..b049225bc99f23aaceeebee0fb9722729659d2dd 100644 GIT binary patch delta 29 kcmZqSYUbL&$|%6Yz`&53SdvLm{7aRV!(ATI+0LvCV8YEfolPJB^nTJdI4#&_NTo}~(M diff --git a/paint/assets/meshes/box_shared_uvs.arm b/paint/assets/meshes/box_shared_uvs.arm index 3a3c83051a107d657907e7d1f9fce3c9e5d447e3..80a086f61fa1d33ff01748b5d97c1e5b7dce710e 100644 GIT binary patch delta 29 kcmZqSYUbL&$|%6Yz`&53SdvmK;#toc|0z3>147rIVsYRKIIq^lQX^W*8GXa{@3B~{b delta 31 mcmbPvg>lvu#toc|g1ih247rIVsYRKIIq^lQX~l~r88ZQ;)(ScR diff --git a/paint/sources/import_arm.ts b/paint/sources/import_arm.ts index 99ba4b1c..934cbbdb 100644 --- a/paint/sources/import_arm.ts +++ b/paint/sources/import_arm.ts @@ -138,7 +138,7 @@ function import_arm_run_project(path: string) { for (let i: i32 = 1; i < project.mesh_datas.length; ++i) { let raw: mesh_data_t = project.mesh_datas[i]; let md: mesh_data_t = mesh_data_create(raw); - let object: mesh_object_t = scene_add_mesh_object(md, context_raw.paint_object.materials, context_raw.paint_object.base); + let object: mesh_object_t = scene_add_mesh_object(md, context_raw.paint_object.material, context_raw.paint_object.base); object.base.name = md.name; object.skip_context = "paint"; array_push(project_paint_objects, object); @@ -358,7 +358,7 @@ function import_arm_run_mesh(raw: project_format_t) { object = context_raw.paint_object; } else { - object = scene_add_mesh_object(md, context_raw.paint_object.materials, context_raw.paint_object.base); + object = scene_add_mesh_object(md, context_raw.paint_object.material, context_raw.paint_object.base); object.base.name = md.name; object.skip_context = "paint"; md._.handle = md.name; diff --git a/paint/sources/import_mesh.ts b/paint/sources/import_mesh.ts index 167f8d70..3cb4c773 100644 --- a/paint/sources/import_mesh.ts +++ b/paint/sources/import_mesh.ts @@ -206,7 +206,7 @@ function _import_mesh_add_mesh(mesh: raw_mesh_t) { let md: mesh_data_t = mesh_data_create(raw); - let object: mesh_object_t = scene_add_mesh_object(md, context_raw.paint_object.materials, context_raw.paint_object.base); + let object: mesh_object_t = scene_add_mesh_object(md, context_raw.paint_object.material, context_raw.paint_object.base); object.base.name = mesh.name; object.skip_context = "paint"; diff --git a/paint/sources/project.ts b/paint/sources/project.ts index 275133df..9d0ac7a6 100644 --- a/paint/sources/project.ts +++ b/paint/sources/project.ts @@ -192,41 +192,35 @@ function project_new(reset_layers: bool = true) { project_mesh_assets = []; let raw: mesh_data_t = null; - // if (context_raw.project_type == project_model_t.SPHERE || context_raw.project_type == project_model_t.TESSELLATED_PLANE) { - // let mesh: raw_mesh_t = context_raw.project_type == project_model_t.SPHERE ? - // geom_make_uv_sphere(1, 512, 256) : - // geom_make_plane(1, 1, 512, 512); - // mesh.name = "Tessellated"; - // raw = import_mesh_raw_mesh(mesh); - // } - // else { - if (project_mesh_list == null) { - project_mesh_list = ["box_bevel"]; - } + let mesh_name: string = project_mesh_list == null ? "box_bevel" : project_mesh_list[context_raw.project_type]; - let b: buffer_t = data_get_blob("meshes/" + project_mesh_list[context_raw.project_type] + ".arm"); + if (mesh_name == "sphere") { + let mesh: raw_mesh_t = geom_make_uv_sphere(1, 512, 256); + mesh.name = "Tessellated"; + raw = import_mesh_raw_mesh(mesh); + } + else if (mesh_name == "plane") { + let mesh: raw_mesh_t = geom_make_plane(1, 1, 512, 512); + mesh.name = "Tessellated"; + raw = import_mesh_raw_mesh(mesh); + viewport_set_view(0, 0, 0.75, 0, 0, 0); // Top + } + else { + let b: buffer_t = data_get_blob("meshes/" + mesh_name + ".arm"); _project_scene_mesh_gc = armpack_decode(b); raw = _project_scene_mesh_gc.mesh_datas[0]; - // } + } let md: mesh_data_t = mesh_data_create(raw); map_set(data_cached_meshes, "SceneTessellated", md); - // if (context_raw.project_type == project_model_t.TESSELLATED_PLANE) { - // viewport_set_view(0, 0, 0.75, 0, 0, 0); // Top - // } - - let n: string = "Tessellated"; - // let md: mesh_data_t = data_get_mesh("Scene", n); - let current: gpu_texture_t = _draw_current; let in_use: bool = gpu_in_use; if (in_use) draw_end(); let m: material_data_t = data_get_material("Scene", "Material"); if (context_raw.paint_object == null) { - let ms: material_data_t[] = [m]; - context_raw.paint_object = mesh_object_create(md, ms); + context_raw.paint_object = mesh_object_create(md, m); context_raw.paint_object.base.name = "paint_object"; } else { @@ -239,7 +233,7 @@ function project_new(reset_layers: bool = true) { context_raw.paint_object.base.transform.scale = vec4_create(1, 1, 1); transform_build_matrix(context_raw.paint_object.base.transform); - context_raw.paint_object.base.name = n; + context_raw.paint_object.base.name = "Tessellated"; project_paint_objects = [context_raw.paint_object]; while (project_materials.length > 0) { slot_material_unload(array_pop(project_materials)); @@ -274,7 +268,8 @@ function project_new(reset_layers: bool = true) { ui_base_hwnds[tab_area_t.SIDEBAR1].redraws = 2; if (reset_layers) { - let aspect_ratio_changed: bool = project_layers[0].texpaint.width != config_get_texture_res_x() || project_layers[0].texpaint.height != config_get_texture_res_y(); + let aspect_ratio_changed: bool = project_layers[0].texpaint.width != config_get_texture_res_x() || + project_layers[0].texpaint.height != config_get_texture_res_y(); while (project_layers.length > 0) { slot_layer_unload(array_pop(project_layers)); } diff --git a/paint/sources/render_path_paint.ts b/paint/sources/render_path_paint.ts index 75e4c6cb..e7634ec7 100644 --- a/paint/sources/render_path_paint.ts +++ b/paint/sources/render_path_paint.ts @@ -760,8 +760,8 @@ function render_path_paint_set_plane_mesh() { }; let md: mesh_data_t = mesh_data_create(raw); let mo: mesh_object_t = scene_get_child(".Plane").ext; - let materials: material_data_t[] = mo.materials; - let o: mesh_object_t = scene_add_mesh_object(md, materials); + let material: material_data_t = mo.material; + let o: mesh_object_t = scene_add_mesh_object(md, material); o.base.name = ".PlaneTiled"; } diff --git a/paint/sources/sim.ts b/paint/sources/sim.ts index f9aae8b1..4e9546b8 100644 --- a/paint/sources/sim.ts +++ b/paint/sources/sim.ts @@ -103,7 +103,7 @@ function sim_remove_body(uid: i32) { function sim_duplicate() { // Mesh let so: mesh_object_t = context_raw.selected_object.ext; - let dup: mesh_object_t = scene_add_mesh_object(so.data, so.materials, so.base.parent); + let dup: mesh_object_t = scene_add_mesh_object(so.data, so.material, so.base.parent); transform_set_matrix(dup.base.transform, so.base.transform.local); array_push(project_paint_objects, dup); dup.base.name = so.base.name; diff --git a/paint/sources/tab_meshes.ts b/paint/sources/tab_meshes.ts index 5d2bceff..2911d783 100644 --- a/paint/sources/tab_meshes.ts +++ b/paint/sources/tab_meshes.ts @@ -350,7 +350,7 @@ function tab_meshes_set_default_mesh(name: string) { scale_tex: mesh.scale_tex }; let md: mesh_data_t = mesh_data_create(raw); - mo = mesh_object_create(md, context_raw.paint_object.materials); + mo = mesh_object_create(md, context_raw.paint_object.material); array_remove(scene_meshes, mo); mo.base.name = "Tessellated"; } @@ -505,7 +505,7 @@ function tab_scene_new_object(mesh_name: string) { util_mesh_ext_pack_uvs(raw.mesh_datas[0].vertex_arrays[2].values); let md: mesh_data_t = mesh_data_create(raw.mesh_datas[0]); md._.handle = md.name; - let mo: mesh_object_t = scene_add_mesh_object(md, project_paint_objects[0].materials); + let mo: mesh_object_t = scene_add_mesh_object(md, project_paint_objects[0].material); mo.base.name = md.name; let o: obj_t = {}; o._ = { _gc: raw }; diff --git a/paint/sources/util_clone.ts b/paint/sources/util_clone.ts index 467f462f..a8f177c9 100644 --- a/paint/sources/util_clone.ts +++ b/paint/sources/util_clone.ts @@ -327,7 +327,7 @@ function util_clone_obj(o: obj_t): obj_t { r.visible = o.visible; r.spawn = o.spawn; r.anim = util_clone_anim(o.anim); - r.material_refs = util_clone_string_array(o.material_refs); + r.material_ref = o.material_ref; if (o.children != null) { r.children = []; for (let i: i32 = 0; i < o.children.length; ++i) { diff --git a/paint/sources/util_mesh.ts b/paint/sources/util_mesh.ts index c5c3a8aa..b595bfd3 100644 --- a/paint/sources/util_mesh.ts +++ b/paint/sources/util_mesh.ts @@ -114,7 +114,7 @@ function util_mesh_merge(paint_objects: mesh_object_t[] = null) { util_mesh_remove_merged(); let md: mesh_data_t = mesh_data_create(raw); - context_raw.merged_object = mesh_object_create(md, context_raw.paint_object.materials); + context_raw.merged_object = mesh_object_create(md, context_raw.paint_object.material); context_raw.merged_object.base.name = context_raw.paint_object.base.name + "_merged"; context_raw.merged_object.force_context = "paint"; object_set_parent(context_raw.merged_object.base, context_main_object().base); diff --git a/paint/sources/util_particle.ts b/paint/sources/util_particle.ts index 5f074670..5bd46512 100644 --- a/paint/sources/util_particle.ts +++ b/paint/sources/util_particle.ts @@ -32,7 +32,7 @@ function util_particle_init() { if (obj.name == ".Sphere") { let particle: obj_t = util_clone_obj(obj); particle.name = ".Particle"; - particle.material_refs = ["MaterialParticle"]; + particle.material_ref = "MaterialParticle"; array_push(_scene_raw.objects, particle); for (let i: i32 = 0; i < 16; ++i) { particle.transform[i] *= 0.01; diff --git a/paint/sources/util_render.ts b/paint/sources/util_render.ts index feb7fbea..28197c5d 100644 --- a/paint/sources/util_render.ts +++ b/paint/sources/util_render.ts @@ -16,7 +16,7 @@ function util_render_make_material_preview() { let painto: mesh_object_t = context_raw.paint_object; context_raw.paint_object = sphere; - sphere.materials[0] = project_materials[0].data; + sphere.material = project_materials[0].data; context_raw.material.preview_ready = true; context_raw.saved_camera = mat4_clone(scene_camera.base.transform.local);