Skip to content

Commit f33b945

Browse files
committed
paint: arm append fixes
1 parent 4e1465a commit f33b945

3 files changed

Lines changed: 119 additions & 9 deletions

File tree

paint/sources/functions.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,8 @@ void import_arm_run_material(char *path);
393393
void import_arm_run_mesh_append(char *path);
394394
project_t *import_arm_decode_project(buffer_t *b);
395395
void import_arm_append(project_t *project, char *path, i32_array_t *mesh_selected, i32_array_t *material_selected);
396+
bool import_arm_object_name_exists(char *name);
397+
i32 import_arm_material_name_index(char *name);
396398
void import_arm_run_brush(char *path);
397399
void import_arm_run_brush_from_project(project_t *project, char *path);
398400
void import_arm_run_swatches(char *path, bool replace_existing);

paint/sources/io/import_arm.c

Lines changed: 70 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,50 @@ static bool import_arm_has_selected(i32_array_t *selected) {
109109
return false;
110110
}
111111

112+
bool import_arm_object_name_exists(char *name) {
113+
if (name == NULL || g_project->_->paint_objects == NULL) {
114+
return false;
115+
}
116+
for (i32 i = 0; i < g_project->_->paint_objects->length; ++i) {
117+
mesh_object_t *o = g_project->_->paint_objects->buffer[i];
118+
if (o->base->name != NULL && string_equals(o->base->name, name)) {
119+
return true;
120+
}
121+
}
122+
return false;
123+
}
124+
125+
i32 import_arm_material_name_index(char *name) {
126+
if (name == NULL) {
127+
return -1;
128+
}
129+
for (i32 i = 0; i < g_project->_->materials->length; ++i) {
130+
slot_material_t *m = g_project->_->materials->buffer[i];
131+
if (m->canvas->name != NULL && string_equals(m->canvas->name, name)) {
132+
return i;
133+
}
134+
}
135+
return -1;
136+
}
137+
138+
static i32 import_arm_mesh_parent_index(project_t *project, i32 mesh_i) {
139+
if (project->mesh_parents != NULL && mesh_i < project->mesh_parents->length) {
140+
return project->mesh_parents->buffer[mesh_i];
141+
}
142+
return mesh_i > 0 ? 0 : -1;
143+
}
144+
145+
static mat4_t import_arm_mesh_world_matrix(project_t *project, i32 mesh_i) {
146+
f32_array_t_array_t *transforms = project->mesh_transforms;
147+
mat4_t m = mat4_from_f32_array(transforms->buffer[mesh_i], 0);
148+
i32 parent = import_arm_mesh_parent_index(project, mesh_i);
149+
for (i32 guard = 0; guard < transforms->length && parent >= 0 && parent < transforms->length; ++guard) {
150+
m = mat4_mult_mat3x4(m, mat4_from_f32_array(transforms->buffer[parent], 0));
151+
parent = import_arm_mesh_parent_index(project, parent);
152+
}
153+
return m;
154+
}
155+
112156
static i32 import_arm_mesh_material_index(project_t *project, i32 mesh_i) {
113157
if (project->mesh_materials == NULL || mesh_i < 0 || mesh_i >= project->mesh_materials->length) {
114158
return -1;
@@ -130,15 +174,23 @@ static void import_arm_run_mesh_append_from_project(project_t *project, i32_arra
130174
if (!import_arm_is_selected(selected, i)) {
131175
continue;
132176
}
177+
if (import_arm_object_name_exists(mesh_names->buffer[i])) {
178+
continue;
179+
}
133180
mesh_data_t *md = mesh_datas->buffer[i];
134181
mesh_object_t *object = scene_add_mesh_object(md, g_context->paint_object->material, NULL);
135182
object->skip_context = "paint";
136183
object->base->name = mesh_names->buffer[i];
137184
md->_->handle = md->name;
138185
any_map_set(data_cached_meshes, md->_->handle, md);
139186

140-
object->base->transform->scale = (vec4_t){1, 1, 1, 1.0};
141-
transform_build_matrix(object->base->transform);
187+
if (project->mesh_transforms != NULL && i < project->mesh_transforms->length) {
188+
transform_set_matrix(object->base->transform, import_arm_mesh_world_matrix(project, i));
189+
}
190+
else {
191+
object->base->transform->scale = (vec4_t){1, 1, 1, 1.0};
192+
transform_build_matrix(object->base->transform);
193+
}
142194

143195
any_array_push(g_project->_->paint_objects, object);
144196
tab_stages_add_object(object->base->name);
@@ -378,18 +430,29 @@ void import_arm_append(project_t *project, char *path, i32_array_t *mesh_selecte
378430
i32_array_t *src_to_dest_mat = NULL;
379431
i32 mat_base = g_project->_->materials->length;
380432

381-
if (project->material_nodes != NULL && import_arm_has_selected(material_selected)) {
382-
import_arm_import_materials(project, path, material_selected, false);
383-
src_to_dest_mat = i32_array_create(project->material_nodes->length);
384-
i32 dest = mat_base;
433+
if (project->material_nodes != NULL && project->material_nodes->length > 0) {
434+
i32_array_t *to_import = i32_array_create(project->material_nodes->length);
435+
src_to_dest_mat = i32_array_create(project->material_nodes->length);
436+
i32 dest = mat_base;
385437
for (i32 i = 0; i < src_to_dest_mat->length; ++i) {
386-
if (import_arm_is_selected(material_selected, i)) {
438+
ui_node_canvas_t *c = project->material_nodes->buffer[i];
439+
i32 existing = import_arm_material_name_index(c != NULL ? c->name : NULL);
440+
if (existing >= 0) {
441+
to_import->buffer[i] = 0;
442+
src_to_dest_mat->buffer[i] = existing;
443+
}
444+
else if (import_arm_is_selected(material_selected, i)) {
445+
to_import->buffer[i] = 1;
387446
src_to_dest_mat->buffer[i] = dest++;
388447
}
389448
else {
449+
to_import->buffer[i] = 0;
390450
src_to_dest_mat->buffer[i] = -1;
391451
}
392452
}
453+
if (import_arm_has_selected(to_import)) {
454+
import_arm_import_materials(project, path, to_import, false);
455+
}
393456
}
394457

395458
if (project->mesh_datas != NULL && import_arm_has_selected(mesh_selected)) {

paint/sources/ui/box_append.c

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,22 @@ static bool box_append_has_selection() {
3232
return false;
3333
}
3434

35+
static bool box_append_mesh_exists(i32 i) {
36+
mesh_data_t *raw = box_append_project->mesh_datas->buffer[i];
37+
if (raw == NULL || raw->name == NULL || string_equals(raw->name, "")) {
38+
return false;
39+
}
40+
i32 source_index;
41+
char *object_name;
42+
char *name = (i > 0 && util_mesh_link_parse(raw->name, &source_index, &object_name)) ? object_name : raw->name;
43+
return import_arm_object_name_exists(name);
44+
}
45+
46+
static bool box_append_material_exists(i32 i) {
47+
ui_node_canvas_t *c = box_append_project->material_nodes->buffer[i];
48+
return c != NULL && import_arm_material_name_index(c->name) >= 0;
49+
}
50+
3551
static i32 box_append_mesh_material_index(i32 mesh_i) {
3652
if (box_append_project == NULL || box_append_project->mesh_materials == NULL) {
3753
return -1;
@@ -47,6 +63,9 @@ static void box_append_select_mesh_material(i32 mesh_i) {
4763
if (mat_i < 0 || box_append_material_selected == NULL || mat_i >= box_append_material_selected->length) {
4864
return;
4965
}
66+
if (box_append_material_exists(mat_i)) {
67+
return;
68+
}
5069
box_append_material_selected->buffer[mat_i] = 1;
5170
}
5271

@@ -88,10 +107,16 @@ void box_append_draw() {
88107
ui_text(tr("Meshes"), UI_ALIGN_LEFT, 0);
89108
ui_handle_t *hmeshes = ui_handle(__ID__);
90109
for (i32 i = 0; i < box_append_mesh_selected->length; ++i) {
110+
bool exists = box_append_mesh_exists(i);
111+
if (exists) {
112+
box_append_mesh_selected->buffer[i] = 0;
113+
}
91114
ui_handle_t *h = ui_nest(hmeshes, i);
92115
h->b = box_append_mesh_selected->buffer[i] != 0;
116+
g_ui->enabled = !exists;
93117
ui_check(h, box_append_mesh_name(box_append_project->mesh_datas->buffer[i], i), "");
94-
if (h->changed) {
118+
g_ui->enabled = true;
119+
if (!exists && h->changed) {
95120
box_append_mesh_selected->buffer[i] = h->b ? 1 : 0;
96121
if (h->b) {
97122
box_append_select_mesh_material(i);
@@ -104,10 +129,16 @@ void box_append_draw() {
104129
ui_text(tr("Materials"), UI_ALIGN_LEFT, 0);
105130
ui_handle_t *hmats = ui_handle(__ID__);
106131
for (i32 i = 0; i < box_append_material_selected->length; ++i) {
132+
bool exists = box_append_material_exists(i);
133+
if (exists) {
134+
box_append_material_selected->buffer[i] = 0;
135+
}
107136
ui_handle_t *h = ui_nest(hmats, i);
108137
h->b = box_append_material_selected->buffer[i] != 0;
138+
g_ui->enabled = !exists;
109139
ui_check(h, box_append_material_name(box_append_project->material_nodes->buffer[i], i), "");
110-
if (h->changed) {
140+
g_ui->enabled = true;
141+
if (!exists && h->changed) {
111142
box_append_material_selected->buffer[i] = h->b ? 1 : 0;
112143
}
113144
}
@@ -127,7 +158,21 @@ void box_append_draw() {
127158
g_ui->enabled = true;
128159
}
129160

161+
static void box_append_show_on_cache_cloud_done(char *abs) {
162+
box_append_show(string_copy(abs));
163+
}
164+
130165
void box_append_show(char *path) {
166+
if (starts_with(path, "cloud")) {
167+
#ifdef IRON_ANDROID
168+
console_toast(tr("Downloading"));
169+
#else
170+
console_info(tr("Downloading"));
171+
#endif
172+
file_cache_cloud(path, &box_append_show_on_cache_cloud_done, g_config->server);
173+
return;
174+
}
175+
131176
box_append_path = string_copy(path);
132177
buffer_t *b = data_get_blob(path);
133178
box_append_project = import_arm_decode_project(b);

0 commit comments

Comments
 (0)