paint: save sculpt

This commit is contained in:
luboslenco
2026-06-15 08:46:12 +02:00
parent dc9b3fe910
commit cbb7596011
6 changed files with 73 additions and 29 deletions
+1 -1
View File
@@ -7,7 +7,7 @@
char *manifest_title = "ArmorPaint"; char *manifest_title = "ArmorPaint";
char *manifest_version = "1.0 alpha"; char *manifest_version = "1.0 alpha";
char *manifest_version_project = "9"; char *manifest_version_project = "10";
char *manifest_version_config = "1"; char *manifest_version_config = "1";
char *manifest_url = "https://armorpaint.org"; char *manifest_url = "https://armorpaint.org";
char *manifest_url_android = "https://play.google.com/store/apps/details?id=org.armorpaint"; char *manifest_url_android = "https://play.google.com/store/apps/details?id=org.armorpaint";
+1
View File
@@ -198,6 +198,7 @@ void export_arm_run_project() {
.visible = l->visible, .visible = l->visible,
.texpaint_nor = l->texpaint_nor != NULL ? lz4_encode(gpu_get_texture_pixels(l->texpaint_nor)) : NULL, .texpaint_nor = l->texpaint_nor != NULL ? lz4_encode(gpu_get_texture_pixels(l->texpaint_nor)) : NULL,
.texpaint_pack = l->texpaint_pack != NULL ? lz4_encode(gpu_get_texture_pixels(l->texpaint_pack)) : NULL, .texpaint_pack = l->texpaint_pack != NULL ? lz4_encode(gpu_get_texture_pixels(l->texpaint_pack)) : NULL,
.texpaint_sculpt = l->texpaint_sculpt != NULL ? lz4_encode(gpu_get_texture_pixels(l->texpaint_sculpt)) : NULL,
.paint_base = l->paint_base, .paint_base = l->paint_base,
.paint_opac = l->paint_opac, .paint_opac = l->paint_opac,
.paint_occ = l->paint_occ, .paint_occ = l->paint_occ,
+18
View File
@@ -483,6 +483,24 @@ void import_arm_run_project(char *path) {
draw_image(_texpaint_pack, 0, 0); draw_image(_texpaint_pack, 0, 0);
draw_set_pipeline(NULL); draw_set_pipeline(NULL);
draw_end(); draw_end();
if (ld->texpaint_sculpt != NULL) {
render_target_t *t = render_target_create();
t->name = string("texpaint_sculpt%s", l->ext);
t->width = ld->res;
t->height = ld->res;
t->format = "RGBA128";
l->texpaint_sculpt = render_path_create_render_target(t)->_image;
gpu_texture_t *_texpaint_sculpt =
gpu_create_texture_from_bytes(lz4_decode(ld->texpaint_sculpt, ld->res * ld->res * 4 * 4), ld->res, ld->res, GPU_TEXTURE_FORMAT_RGBA128);
draw_begin(l->texpaint_sculpt, false, 0);
draw_set_pipeline(pipes_copy128);
draw_image(_texpaint_sculpt, 0, 0);
draw_set_pipeline(NULL);
draw_end();
gpu_delete_texture(_texpaint_sculpt);
}
} }
l->scale = ld->uv_scale; l->scale = ld->uv_scale;
+42 -25
View File
@@ -82,14 +82,23 @@ ui_node_canvas_t_array_t *import_arm_get_node_canvas_array(any_map_t *map, char
return ar; return ar;
} }
bool import_arm_is_version(buffer_t *b, char n) { bool import_arm_is_version(buffer_t *b, char *n) {
bool has_v = b->buffer[10] == 118; // 'v' // 0xdf map, i32 count, 0xdb string, i32 len, "version", 0xdb string, i32 len, version value
bool has_n = b->buffer[22] == n; // '4' if (b->buffer[10] != 'v') {
return has_v && has_n; return false;
}
uint32_t len = *(uint32_t *)(b->buffer + 18); // version value length
char *v = (char *)(b->buffer + 22); // version value
for (uint32_t i = 0; i < len; ++i) {
if (n[i] == '\0' || v[i] != n[i]) {
return false;
}
}
return n[len] == '\0';
} }
bool import_arm_is_old(buffer_t *b) { bool import_arm_is_old(buffer_t *b) {
return !import_arm_is_version(b, manifest_version_project[0]); return !import_arm_is_version(b, manifest_version_project);
} }
project_t *import_arm_from_map_to_arm(any_map_t *old) { project_t *import_arm_from_map_to_arm(any_map_t *old) {
@@ -187,6 +196,7 @@ project_t *import_arm_from_map_to_arm(any_map_t *old) {
ld->visible = armpack_map_get_i32(old, "visible") > 0; ld->visible = armpack_map_get_i32(old, "visible") > 0;
ld->texpaint_nor = any_map_get(old, "texpaint_nor"); ld->texpaint_nor = any_map_get(old, "texpaint_nor");
ld->texpaint_pack = any_map_get(old, "texpaint_pack"); ld->texpaint_pack = any_map_get(old, "texpaint_pack");
ld->texpaint_sculpt = any_map_get(old, "texpaint_sculpt");
ld->paint_base = armpack_map_get_i32(old, "paint_base") > 0; ld->paint_base = armpack_map_get_i32(old, "paint_base") > 0;
ld->paint_opac = armpack_map_get_i32(old, "paint_opac") > 0; ld->paint_opac = armpack_map_get_i32(old, "paint_opac") > 0;
ld->paint_occ = armpack_map_get_i32(old, "paint_occ") > 0; ld->paint_occ = armpack_map_get_i32(old, "paint_occ") > 0;
@@ -289,12 +299,23 @@ project_t *import_arm_from_map_to_arm(any_map_t *old) {
return project; return project;
} }
project_t *import_arm_from_version_9(any_map_t *old) {
any_array_t *lds = any_map_get(old, "layer_datas");
if (lds != NULL) {
for (i32 i = 0; i < lds->length; ++i) {
any_map_t *ld = lds->buffer[i];
any_map_set(ld, "texpaint_sculpt", NULL);
}
}
return import_arm_from_map_to_arm(old);
}
project_t *import_arm_from_version_8(any_map_t *old) { project_t *import_arm_from_version_8(any_map_t *old) {
any_map_set(old, "mesh_materials", NULL); any_map_set(old, "mesh_materials", NULL);
any_map_set(old, "mesh_parents", NULL); any_map_set(old, "mesh_parents", NULL);
any_map_set(old, "script_names", NULL); any_map_set(old, "script_names", NULL);
any_map_set(old, "stages", NULL); any_map_set(old, "stages", NULL);
return import_arm_from_map_to_arm(old); return import_arm_from_version_9(old);
} }
project_t *import_arm_from_version_7(any_map_t *old) { project_t *import_arm_from_version_7(any_map_t *old) {
@@ -380,28 +401,24 @@ project_t *import_arm_from_version_2(any_map_t *old) {
return import_arm_from_version_3(old); return import_arm_from_version_3(old);
} }
project_t *import_arm_from_version_1(any_map_t *old) {
return import_arm_from_version_2(old);
}
project_t *import_arm_from_version_0(any_map_t *old) {
return import_arm_from_version_1(old);
}
project_t *import_arm_from_old(buffer_t *b) { project_t *import_arm_from_old(buffer_t *b) {
any_map_t *old = armpack_decode_to_map(b); any_map_t *old = armpack_decode_to_map(b);
if (import_arm_is_version(b, '8')) { project_t *(*fns[])(any_map_t *) = {
return import_arm_from_version_8(old); 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,
};
for (i32 v = sizeof(fns) / sizeof(fns[0]) - 1; v >= 0; --v) {
if (import_arm_is_version(b, i32_to_string(v))) {
return fns[v](old);
} }
if (import_arm_is_version(b, '7')) {
return import_arm_from_version_7(old);
}
if (import_arm_is_version(b, '6')) {
return import_arm_from_version_6(old);
}
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);
}
if (import_arm_is_version(b, '3')) {
return import_arm_from_version_3(old);
}
if (import_arm_is_version(b, '2')) {
return import_arm_from_version_2(old);
} }
return NULL; return NULL;
} }
+1
View File
@@ -619,6 +619,7 @@ typedef struct layer_data {
bool visible; bool visible;
struct buffer *texpaint_nor; struct buffer *texpaint_nor;
struct buffer *texpaint_pack; struct buffer *texpaint_pack;
struct buffer *texpaint_sculpt;
bool paint_base; bool paint_base;
bool paint_opac; bool paint_opac;
bool paint_occ; bool paint_occ;
+8 -1
View File
@@ -137,6 +137,11 @@ i32 util_encode_layer_data_size(layer_data_t_array_t *datas) {
if (tp_pack != NULL) { if (tp_pack != NULL) {
size += tp_pack->length; size += tp_pack->length;
} }
buffer_t *tp_sculpt = datas->buffer[i]->texpaint_sculpt;
if (tp_sculpt != NULL) {
size += tp_sculpt->length;
}
} }
return size; return size;
} }
@@ -359,7 +364,7 @@ buffer_t *util_encode_project(project_t *raw) {
if (raw->layer_datas != NULL) { if (raw->layer_datas != NULL) {
armpack_encode_array(raw->layer_datas->length); armpack_encode_array(raw->layer_datas->length);
for (i32 i = 0; i < raw->layer_datas->length; ++i) { for (i32 i = 0; i < raw->layer_datas->length; ++i) {
armpack_encode_map(35); armpack_encode_map(36);
armpack_encode_string("name"); armpack_encode_string("name");
armpack_encode_string(raw->layer_datas->buffer[i]->name); armpack_encode_string(raw->layer_datas->buffer[i]->name);
armpack_encode_string("res"); armpack_encode_string("res");
@@ -392,6 +397,8 @@ buffer_t *util_encode_project(project_t *raw) {
armpack_encode_array_u8(raw->layer_datas->buffer[i]->texpaint_nor); armpack_encode_array_u8(raw->layer_datas->buffer[i]->texpaint_nor);
armpack_encode_string("texpaint_pack"); armpack_encode_string("texpaint_pack");
armpack_encode_array_u8(raw->layer_datas->buffer[i]->texpaint_pack); armpack_encode_array_u8(raw->layer_datas->buffer[i]->texpaint_pack);
armpack_encode_string("texpaint_sculpt");
armpack_encode_array_u8(raw->layer_datas->buffer[i]->texpaint_sculpt);
armpack_encode_string("paint_base"); armpack_encode_string("paint_base");
armpack_encode_bool(raw->layer_datas->buffer[i]->paint_base); armpack_encode_bool(raw->layer_datas->buffer[i]->paint_base);
armpack_encode_string("paint_opac"); armpack_encode_string("paint_opac");