paint: add mesh_skins to project
This commit is contained in:
@@ -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";
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user