paint: add mesh_skins to project

This commit is contained in:
luboslenco
2026-08-11 14:57:57 +02:00
parent a83d6ff9d4
commit b7f39b0923
7 changed files with 64 additions and 16 deletions
+1 -1
View File
@@ -7,7 +7,7 @@
char *manifest_title = "ArmorPaint";
char *manifest_version = "1.0 rc2";
char *manifest_version_project = "12";
char *manifest_version_project = "13";
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";
+11
View File
@@ -282,6 +282,17 @@ void export_arm_run_project() {
}
g_project->mesh_transforms = mesh_transforms;
// Source mesh bytes
// Meshes with no skin data store an empty buffer
buffer_t_array_t *mesh_skins = any_array_create_from_raw((void *[]){}, 0);
bool has_skins = false;
for (i32 i = 0; i < g_project->_->paint_objects->length; ++i) {
buffer_t *blob = g_project->_->paint_objects->buffer[i]->data->_->skin_blob;
any_array_push(mesh_skins, blob != NULL ? blob : buffer_create(0));
has_skins = has_skins || blob != NULL;
}
g_project->mesh_skins = has_skins ? mesh_skins : NULL;
if (g_project->mesh_materials != NULL) {
g_project->mesh_materials = i32_array_create(g_project->_->paint_objects->length);
for (i32 i = 0; i < g_project->mesh_materials->length; ++i) {
+11 -1
View File
@@ -17,6 +17,14 @@ void import_arm_run_mesh_on_next_frame(void *_) {
layers_init();
}
static buffer_t *import_arm_get_mesh_skin(i32 i) {
if (g_project->mesh_skins == NULL || i >= g_project->mesh_skins->length) {
return NULL;
}
buffer_t *blob = g_project->mesh_skins->buffer[i];
return (blob != NULL && blob->length > 0) ? blob : NULL; // Empty buffer = no skin
}
void import_arm_run_mesh(project_t *raw) {
g_project->_->paint_objects = any_array_create_from_raw((void *[]){}, 0);
for (i32 i = 0; i < raw->mesh_datas->length; ++i) {
@@ -379,7 +387,8 @@ void import_arm_run_project(char *path) {
}
}
mesh_data_t *md = mesh_data_create(g_project->mesh_datas->buffer[0]);
mesh_data_t *md = mesh_data_create(g_project->mesh_datas->buffer[0]);
md->_->skin_blob = import_arm_get_mesh_skin(0);
mesh_object_set_data(g_context->paint_object, md);
g_context->paint_object->base->transform->scale = (vec4_t){1, 1, 1, 1.0};
@@ -394,6 +403,7 @@ void import_arm_run_project(char *path) {
for (i32 i = 1; i < g_project->mesh_datas->length; ++i) {
mesh_data_t *raw = g_project->mesh_datas->buffer[i];
mesh_data_t *md = mesh_data_create(raw);
md->_->skin_blob = import_arm_get_mesh_skin(i);
mesh_object_t *object = scene_add_mesh_object(md, g_context->paint_object->material, g_context->paint_object->base);
object->base->name = md->name;
object->skip_context = "paint";
+8 -1
View File
@@ -245,6 +245,7 @@ project_t *import_arm_from_map_to_arm(any_map_t *old) {
project->mesh_parents = any_map_get(old, "mesh_parents");
project->mesh_physics_shapes = any_map_get(old, "mesh_physics_shapes");
project->mesh_physics_masses = any_map_get(old, "mesh_physics_masses");
project->mesh_skins = any_map_get(old, "mesh_skins");
project->atlas_objects = any_map_get(old, "atlas_objects");
project->atlas_names = any_map_get(old, "atlas_names");
project->script_datas = any_map_get(old, "script_datas");
@@ -302,10 +303,15 @@ project_t *import_arm_from_map_to_arm(any_map_t *old) {
return project;
}
project_t *import_arm_from_version_12(any_map_t *old) {
any_map_set(old, "mesh_skins", NULL);
return import_arm_from_map_to_arm(old);
}
project_t *import_arm_from_version_11(any_map_t *old) {
any_map_set(old, "mesh_physics_shapes", NULL);
any_map_set(old, "mesh_physics_masses", NULL);
return import_arm_from_map_to_arm(old);
return import_arm_from_version_12(old);
}
project_t *import_arm_from_version_10(any_map_t *old) {
@@ -429,6 +435,7 @@ project_t *import_arm_from_old(buffer_t *b) {
import_arm_from_version_0, import_arm_from_version_1, import_arm_from_version_2, import_arm_from_version_3,
import_arm_from_version_4, import_arm_from_version_5, import_arm_from_version_6, import_arm_from_version_7,
import_arm_from_version_8, import_arm_from_version_9, import_arm_from_version_10, import_arm_from_version_11,
import_arm_from_version_12,
};
for (i32 v = sizeof(fns) / sizeof(fns[0]) - 1; v >= 0; --v) {
if (import_arm_is_version(b, i32_to_string(v))) {
+19 -11
View File
@@ -378,20 +378,28 @@ void project_reimport_mesh() {
bool project_reskin_mesh(int frame) {
#ifdef WITH_PLUGINS
mesh_data_t *md = context_main_object()->data;
if (md->_->skin_blob == NULL) {
bool any = false;
for (i32 i = 0; i < g_project->_->paint_objects->length; ++i) {
mesh_data_t *md = ((mesh_object_t *)g_project->_->paint_objects->buffer[i])->data;
if (md->_->skin_blob == NULL) {
continue;
}
vertex_array_t *pos = mesh_data_get_vertex_array(md, "pos");
vertex_array_t *nor = mesh_data_get_vertex_array(md, "nor");
if (!plugins_skin_data_apply(md->_->skin_blob, frame, pos->values, nor->values, &md->scale_pos)) {
continue;
}
mesh_data_build_vertices(md->_->vertex_buffer, md->vertex_arrays);
any = true;
}
if (!any) {
return false;
}
vertex_array_t *pos = mesh_data_get_vertex_array(md, "pos");
vertex_array_t *nor = mesh_data_get_vertex_array(md, "nor");
if (!plugins_skin_data_apply(md->_->skin_blob, frame, pos->values, nor->values, &md->scale_pos)) {
return false;
}
mesh_data_build_vertices(md->_->vertex_buffer, md->vertex_arrays);
if (g_context->merged_object != NULL) {
if (g_context->merged_object != NULL && g_config->workspace != WORKSPACE_PLAYER) {
util_mesh_merge(NULL);
}
g_context->ddirty = 4;
+1
View File
@@ -571,6 +571,7 @@ typedef struct project {
struct i32_array *mesh_parents;
struct i32_array *mesh_physics_shapes; // -1 = no physics
struct f32_array *mesh_physics_masses;
struct buffer_t_array *mesh_skins; // NULL = no skin
struct i32_array *atlas_objects;
struct string_array *atlas_names;
struct string_array *script_datas;
+13 -2
View File
@@ -201,12 +201,12 @@ i32 util_encode_timeline_meshes_size(timeline_mesh_keyframe_data_t_array_t *data
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_f32_arrays_size(raw->mesh_transforms) +
util_encode_buffers_size(raw->mesh_icons) + util_encode_buffers_size(raw->mesh_skins) + util_encode_f32_arrays_size(raw->mesh_transforms) +
util_encode_timeline_layers_size(raw->timeline_layers) + util_encode_timeline_meshes_size(raw->timeline_meshes);
buffer_t *encoded = buffer_create(size);
armpack_encode_start(encoded->buffer);
armpack_encode_map(38);
armpack_encode_map(39);
armpack_encode_string("version");
armpack_encode_string(raw->version);
@@ -484,6 +484,17 @@ buffer_t *util_encode_project(project_t *raw) {
armpack_encode_string("mesh_physics_masses");
armpack_encode_array_f32(raw->mesh_physics_masses);
armpack_encode_string("mesh_skins");
if (raw->mesh_skins != NULL) {
armpack_encode_array(raw->mesh_skins->length);
for (i32 i = 0; i < raw->mesh_skins->length; ++i) {
armpack_encode_array_u8(raw->mesh_skins->buffer[i]);
}
}
else {
armpack_encode_null();
}
armpack_encode_string("atlas_objects");
armpack_encode_array_i32(raw->atlas_objects);
armpack_encode_string("atlas_names");