paint: save material data

This commit is contained in:
luboslenco
2026-05-14 16:33:49 +02:00
parent 37bd431de7
commit 680db5626e
5 changed files with 145 additions and 2 deletions
+39
View File
@@ -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
+13
View File
@@ -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);
}
+41 -1
View File
@@ -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);
}
+20
View File
@@ -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;
+32 -1
View File
@@ -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);