paint: save sculpt
This commit is contained in:
@@ -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";
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user