From 69db654236dd467c5aaa0ac80314b07a9451a79a Mon Sep 17 00:00:00 2001 From: luboslenco Date: Fri, 1 May 2026 19:20:57 +0200 Subject: [PATCH] paint: export mesh_transforms --- paint/sources/export_arm.c | 8 ++++++++ paint/sources/globals.h | 2 +- paint/sources/import_arm.c | 5 +++++ paint/sources/import_legacy.c | 24 +++++++++++++++++++----- paint/sources/types.h | 7 +++++++ paint/sources/util_encode.c | 27 +++++++++++++++++++++++++-- 6 files changed, 65 insertions(+), 8 deletions(-) diff --git a/paint/sources/export_arm.c b/paint/sources/export_arm.c index 2d2165f5..bdc07387 100644 --- a/paint/sources/export_arm.c +++ b/paint/sources/export_arm.c @@ -234,6 +234,14 @@ void export_arm_run_project() { } } + f32_array_t_array_t *mesh_transforms = any_array_create_from_raw((void *[]){}, 0); + for (i32 i = 0; i < project_paint_objects->length; ++i) { + mesh_object_t *p = project_paint_objects->buffer[i]; + f32_array_t *ar = f32_array_create_from_raw(p->base->transform->local.m, 16); + any_array_push(mesh_transforms, ar); + } + g_project->mesh_transforms = mesh_transforms; + g_project->material_nodes = mnodes; g_project->brush_nodes = bnodes; g_project->layer_datas = ld; diff --git a/paint/sources/globals.h b/paint/sources/globals.h index 0c66d4ff..8d548e56 100644 --- a/paint/sources/globals.h +++ b/paint/sources/globals.h @@ -7,7 +7,7 @@ char *manifest_title = "ArmorPaint"; char *manifest_version = "1.0 alpha"; -char *manifest_version_project = "5"; +char *manifest_version_project = "6"; char *manifest_version_config = "1"; char *manifest_url = "https://armorpaint.org"; char *manifest_url_android = "https://play.google.com/store/apps/details?id=org.armorpaint"; diff --git a/paint/sources/import_arm.c b/paint/sources/import_arm.c index a1a7c8a8..078491a2 100644 --- a/paint/sources/import_arm.c +++ b/paint/sources/import_arm.c @@ -379,6 +379,11 @@ void import_arm_run_project(char *path) { any_array_push(project_paint_objects, object); } + for (i32 i = 0; i < project->mesh_datas->length; ++i) { + mesh_object_t *o = project_paint_objects->buffer[i]; + transform_set_matrix(o->base->transform, mat4_from_f32_array(project->mesh_transforms->buffer[i], 0)); + } + if (project->mesh_assets != NULL && project->mesh_assets->length > 0) { char *file = project->mesh_assets->buffer[0]; char *abs = data_is_abs(file) ? file : string("%s%s", base, file); diff --git a/paint/sources/import_legacy.c b/paint/sources/import_legacy.c index 61741fdf..cd1fa109 100644 --- a/paint/sources/import_legacy.c +++ b/paint/sources/import_legacy.c @@ -206,14 +206,25 @@ project_t *import_arm_from_map_to_arm(any_map_t *old) { } } - project->mesh_assets = any_map_get(old, "mesh_assets"); - project->mesh_icons = any_map_get(old, "mesh_icons"); - project->atlas_objects = any_map_get(old, "atlas_objects"); - project->atlas_names = any_map_get(old, "atlas_names"); + project->mesh_assets = any_map_get(old, "mesh_assets"); + project->mesh_icons = any_map_get(old, "mesh_icons"); + project->mesh_transforms = any_map_get(old, "mesh_transforms"); + project->atlas_objects = any_map_get(old, "atlas_objects"); + project->atlas_names = any_map_get(old, "atlas_names"); return project; } +project_t *import_arm_from_version_5(any_map_t *old) { + any_array_t *mds = any_map_get(old, "mesh_datas"); + any_array_t *mts = any_array_create_from_raw((void *[]){}, 0); + for (i32 i = 0; i < mds->length; ++i) { + any_array_push(mts, mat4_to_f32_array(mat4_identity())); + } + any_map_set(old, "mesh_transforms", mts); + return import_arm_from_map_to_arm(old); +} + project_t *import_arm_from_version_4(any_map_t *old) { f32_array_t *camera_world = any_map_get(old, "camera_world"); if (camera_world != NULL) { @@ -222,7 +233,7 @@ project_t *import_arm_from_version_4(any_map_t *old) { camera_world = mat4_to_f32_array(m); any_map_set(old, "camera_world", camera_world); } - return import_arm_from_map_to_arm(old); + return import_arm_from_version_5(old); } project_t *import_arm_from_version_3(any_map_t *old) { @@ -244,6 +255,9 @@ project_t *import_arm_from_version_2(any_map_t *old) { project_t *import_arm_from_old(buffer_t *b) { any_map_t *old = armpack_decode_to_map(b); + if (import_arm_is_version(b, '5')) { + return import_arm_from_version_5(old); + } if (import_arm_is_version(b, '4')) { return import_arm_from_version_4(old); } diff --git a/paint/sources/types.h b/paint/sources/types.h index 1b0659cc..462a042f 100644 --- a/paint/sources/types.h +++ b/paint/sources/types.h @@ -509,6 +509,7 @@ typedef struct project_format { struct mesh_data_t_array *mesh_datas; struct string_array *mesh_assets; struct buffer_t_array *mesh_icons; + struct f32_array_t_array *mesh_transforms; struct i32_array *atlas_objects; struct string_array *atlas_names; struct string_array *script_datas; @@ -716,6 +717,12 @@ typedef struct buffer_t_array { int capacity; } buffer_t_array_t; +typedef struct f32_array_t_array { + f32_array_t **buffer; + int length; + int capacity; +} f32_array_t_array_t; + typedef struct slot_material_t_array { slot_material_t **buffer; int length; diff --git a/paint/sources/util_encode.c b/paint/sources/util_encode.c index ab1908d3..7dee6a48 100644 --- a/paint/sources/util_encode.c +++ b/paint/sources/util_encode.c @@ -106,6 +106,17 @@ i32 util_encode_buffers_size(buffer_t_array_t *buffers) { return size; } +i32 util_encode_f32_arrays_size(f32_array_t_array_t *arrays) { + if (arrays == NULL) { + return 0; + } + i32 size = 0; + for (i32 i = 0; i < arrays->length; ++i) { + size += arrays->buffer[i]->length * 4; + } + return size; +} + i32 util_encode_layer_data_size(layer_data_t_array_t *datas) { if (datas == NULL) { return 0; @@ -133,11 +144,11 @@ i32 util_encode_layer_data_size(layer_data_t_array_t *datas) { buffer_t *util_encode_project(project_t *raw) { i32 size = 32 * 1024 * 1024 + util_encode_layer_data_size(raw->layer_datas) + util_encode_mesh_data_size(raw->mesh_datas) + util_encode_packed_assets_size(raw->packed_assets) + util_encode_buffers_size(raw->brush_icons) + util_encode_buffers_size(raw->material_icons) + - util_encode_buffers_size(raw->mesh_icons); + util_encode_buffers_size(raw->mesh_icons) + util_encode_f32_arrays_size(raw->mesh_transforms); buffer_t *encoded = buffer_create(size); armpack_encode_start(encoded->buffer); - armpack_encode_map(25); + armpack_encode_map(26); armpack_encode_string("version"); armpack_encode_string(raw->version); @@ -342,6 +353,18 @@ buffer_t *util_encode_project(project_t *raw) { else { armpack_encode_null(); } + + armpack_encode_string("mesh_transforms"); + if (raw->mesh_transforms != NULL) { + armpack_encode_array(raw->mesh_transforms->length); + for (i32 i = 0; i < raw->mesh_transforms->length; ++i) { + armpack_encode_array_f32(raw->mesh_transforms->buffer[i]); + } + } + else { + armpack_encode_null(); + } + armpack_encode_string("atlas_objects"); armpack_encode_array_i32(raw->atlas_objects); armpack_encode_string("atlas_names");