@@ -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+
112156static 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 )) {
0 commit comments