diff --git a/paint/sources/export_arm.c b/paint/sources/export_arm.c index 74b95d58..03d02a54 100644 --- a/paint/sources/export_arm.c +++ b/paint/sources/export_arm.c @@ -155,6 +155,27 @@ void export_arm_run_project() { } } + material_data2_t_array_t *mdata2 = NULL; + if (project_materials->length > 0) { + mdata2 = any_array_create_from_raw((void *[]){}, 0); + for (i32 i = 0; i < project_materials->length; ++i) { + slot_material_t *m = project_materials->buffer[i]; + material_data2_t *d = GC_ALLOC_INIT(material_data2_t, { + .paint_base = m->paint_base, + .paint_opac = m->paint_opac, + .paint_occ = m->paint_occ, + .paint_rough = m->paint_rough, + .paint_met = m->paint_met, + .paint_nor = m->paint_nor, + .paint_height = m->paint_height, + .paint_emis = m->paint_emis, + .paint_subs = m->paint_subs, + .opac_mode = m->paint_opac_mode, + }); + any_array_push(mdata2, d); + } + } + mesh_data_t_array_t *md = 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]; @@ -219,6 +240,7 @@ void export_arm_run_project() { g_project->version = string_copy(manifest_version_project); g_project->material_groups = mgroups; + g_project->material_datas = mdata2; g_project->assets = texture_files; g_project->packed_assets = packed_assets; g_project->swatches = g_project->swatches; @@ -376,12 +398,29 @@ void export_arm_run_material(char *path) { }, 1); + material_data2_t_array_t *mdata2 = any_array_create_from_raw((void *[]){}, 0); + material_data2_t *md2 = GC_ALLOC_INIT(material_data2_t, { + .paint_base = m->paint_base, + .paint_opac = m->paint_opac, + .paint_occ = m->paint_occ, + .paint_rough = m->paint_rough, + .paint_met = m->paint_met, + .paint_nor = m->paint_nor, + .paint_height = m->paint_height, + .paint_emis = m->paint_emis, + .paint_subs = m->paint_subs, + .opac_mode = m->paint_opac_mode, + }); + any_array_push(mdata2, md2); + project_t *raw = GC_ALLOC_INIT(project_t, {.version = manifest_version_project, .material_nodes = mnodes, .material_groups = mgroups, .material_icons = micons, + .material_datas = mdata2, .assets = texture_files, .packed_assets = packed_assets}); + if (g_context->write_icon_on_export) { // Separate icon files buffer_t *buf = export_arm_rgba64_to_rgba32(gpu_get_texture_pixels(m->image)); #ifdef IRON_BGRA diff --git a/paint/sources/import_arm.c b/paint/sources/import_arm.c index 97b3090f..796a7572 100644 --- a/paint/sources/import_arm.c +++ b/paint/sources/import_arm.c @@ -563,6 +563,19 @@ void import_arm_run_project(char *path) { ui_node_canvas_t *n = project->material_nodes->buffer[i]; import_arm_init_nodes(n->nodes); g_context->material = slot_material_create(m0, n); + + material_data2_t *md = project->material_datas->buffer[i]; + g_context->material->paint_base = md->paint_base; + g_context->material->paint_opac = md->paint_opac; + g_context->material->paint_occ = md->paint_occ; + g_context->material->paint_rough = md->paint_rough; + g_context->material->paint_met = md->paint_met; + g_context->material->paint_nor = md->paint_nor; + g_context->material->paint_height = md->paint_height; + g_context->material->paint_emis = md->paint_emis; + g_context->material->paint_subs = md->paint_subs; + g_context->material->paint_opac_mode = md->opac_mode; + any_array_push(project_materials, g_context->material); } diff --git a/paint/sources/import_legacy.c b/paint/sources/import_legacy.c index e749fbc7..40b33f33 100644 --- a/paint/sources/import_legacy.c +++ b/paint/sources/import_legacy.c @@ -142,7 +142,28 @@ project_t *import_arm_from_map_to_arm(any_map_t *old) { project->material_groups = import_arm_get_node_canvas_array(old, "material_groups"); } project->material_icons = any_map_get(old, "material_icons"); - project->font_assets = any_map_get(old, "font_assets"); + + any_array_t *mds = any_map_get(old, "material_datas"); + if (mds != NULL) { + project->material_datas = any_array_create_from_raw((void *[]){}, 0); + for (i32 i = 0; i < mds->length; ++i) { + any_map_t *old = mds->buffer[i]; + material_data2_t *md = GC_ALLOC_INIT(layer_data_t, {0}); + md->paint_base = armpack_map_get_i32(old, "paint_base") > 0; + md->paint_opac = armpack_map_get_i32(old, "paint_opac") > 0; + md->paint_occ = armpack_map_get_i32(old, "paint_occ") > 0; + md->paint_rough = armpack_map_get_i32(old, "paint_rough") > 0; + md->paint_met = armpack_map_get_i32(old, "paint_met") > 0; + md->paint_nor = armpack_map_get_i32(old, "paint_nor") > 0; + md->paint_height = armpack_map_get_i32(old, "paint_height") > 0; + md->paint_emis = armpack_map_get_i32(old, "paint_emis") > 0; + md->paint_subs = armpack_map_get_i32(old, "paint_subs") > 0; + md->opac_mode = armpack_map_get_i32(old, "opac_mode"); + any_array_push(project->material_datas, md); + } + } + + project->font_assets = any_map_get(old, "font_assets"); any_array_t *lds = any_map_get(old, "layer_datas"); if (lds != NULL) { @@ -230,6 +251,25 @@ project_t *import_arm_from_version_6(any_map_t *old) { armpack_map_set_i32(ld, "path_material", -1); } } + + any_array_t *mds = any_array_create_from_raw((void *[]){}, 0); + any_array_t *mns = any_map_get(old, "material_nodes"); + for (i32 i = 0; i < mns->length; ++i) { + any_map_t *m = any_map_create(); + armpack_map_set_i32(m, "paint_base", 1); + armpack_map_set_i32(m, "paint_opac", 1); + armpack_map_set_i32(m, "paint_occ", 1); + armpack_map_set_i32(m, "paint_rough", 1); + armpack_map_set_i32(m, "paint_met", 1); + armpack_map_set_i32(m, "paint_nor", 1); + armpack_map_set_i32(m, "paint_height", 1); + armpack_map_set_i32(m, "paint_emis", 1); + armpack_map_set_i32(m, "paint_subs", 1); + armpack_map_set_i32(m, "opac_mode", 0); + any_array_push(mds, m); + } + any_map_set(old, "material_datas", mds); + return import_arm_from_map_to_arm(old); } diff --git a/paint/sources/types.h b/paint/sources/types.h index ac14e03c..bec0729f 100644 --- a/paint/sources/types.h +++ b/paint/sources/types.h @@ -537,6 +537,7 @@ typedef struct project_format { struct ui_node_canvas_t_array *material_nodes; struct ui_node_canvas_t_array *material_groups; struct buffer_t_array *material_icons; + struct material_data2_t_array *material_datas; struct string_array *font_assets; struct layer_data_t_array *layer_datas; struct mesh_data_t_array *mesh_datas; @@ -931,6 +932,25 @@ typedef struct layer_data_t_array { int capacity; } layer_data_t_array_t; +typedef struct material_data2 { + bool paint_base; + bool paint_opac; + bool paint_occ; + bool paint_rough; + bool paint_met; + bool paint_nor; + bool paint_height; + bool paint_emis; + bool paint_subs; + int opac_mode; +} material_data2_t; + +typedef struct material_data2_t_array { + material_data2_t **buffer; + int length; + int capacity; +} material_data2_t_array_t; + typedef struct ui_node_t_array { ui_node_t **buffer; int length; diff --git a/paint/sources/util_encode.c b/paint/sources/util_encode.c index 15863857..61e547b6 100644 --- a/paint/sources/util_encode.c +++ b/paint/sources/util_encode.c @@ -148,7 +148,7 @@ buffer_t *util_encode_project(project_t *raw) { buffer_t *encoded = buffer_create(size); armpack_encode_start(encoded->buffer); - armpack_encode_map(26); + armpack_encode_map(27); armpack_encode_string("version"); armpack_encode_string(raw->version); @@ -268,6 +268,37 @@ buffer_t *util_encode_project(project_t *raw) { armpack_encode_null(); } + armpack_encode_string("material_datas"); + if (raw->material_datas != NULL) { + armpack_encode_array(raw->material_datas->length); + for (i32 i = 0; i < raw->material_datas->length; ++i) { + armpack_encode_map(10); + armpack_encode_string("paint_base"); + armpack_encode_bool(raw->material_datas->buffer[i]->paint_base); + armpack_encode_string("paint_opac"); + armpack_encode_bool(raw->material_datas->buffer[i]->paint_opac); + armpack_encode_string("paint_occ"); + armpack_encode_bool(raw->material_datas->buffer[i]->paint_occ); + armpack_encode_string("paint_rough"); + armpack_encode_bool(raw->material_datas->buffer[i]->paint_rough); + armpack_encode_string("paint_met"); + armpack_encode_bool(raw->material_datas->buffer[i]->paint_met); + armpack_encode_string("paint_nor"); + armpack_encode_bool(raw->material_datas->buffer[i]->paint_nor); + armpack_encode_string("paint_height"); + armpack_encode_bool(raw->material_datas->buffer[i]->paint_height); + armpack_encode_string("paint_emis"); + armpack_encode_bool(raw->material_datas->buffer[i]->paint_emis); + armpack_encode_string("paint_subs"); + armpack_encode_bool(raw->material_datas->buffer[i]->paint_subs); + armpack_encode_string("opac_mode"); + armpack_encode_i32(raw->material_datas->buffer[i]->opac_mode); + } + } + else { + armpack_encode_null(); + } + armpack_encode_string("font_assets"); armpack_encode_array_string(raw->font_assets);