diff options
Diffstat (limited to 'source/blender/modifiers/intern/MOD_array.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_array.c | 55 |
1 files changed, 22 insertions, 33 deletions
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c index 2d725af7fe4..a09756b03aa 100644 --- a/source/blender/modifiers/intern/MOD_array.c +++ b/source/blender/modifiers/intern/MOD_array.c @@ -125,15 +125,15 @@ static int svert_sum_cmp(const void *e1, const void *e2) } static void svert_from_mvert(SortVertsElem *sv, - const MVert *mv, + const float (*positions)[3], const int i_begin, const int i_end) { int i; - for (i = i_begin; i < i_end; i++, sv++, mv++) { + for (i = i_begin; i < i_end; i++, sv++) { sv->vertex_num = i; - copy_v3_v3(sv->co, mv->co); - sv->sum_co = sum_v3(mv->co); + copy_v3_v3(sv->co, positions[i]); + sv->sum_co = sum_v3(positions[i]); } } @@ -145,7 +145,7 @@ static void svert_from_mvert(SortVertsElem *sv, * The `int doubles_map[verts_source_num]` array must have been allocated by caller. */ static void dm_mvert_map_doubles(int *doubles_map, - const MVert *mverts, + const float (*positions)[3], const int target_start, const int target_verts_num, const int source_start, @@ -166,10 +166,10 @@ static void dm_mvert_map_doubles(int *doubles_map, sorted_verts_source = MEM_malloc_arrayN(source_verts_num, sizeof(SortVertsElem), __func__); /* Copy target vertices index and cos into SortVertsElem array */ - svert_from_mvert(sorted_verts_target, mverts + target_start, target_start, target_end); + svert_from_mvert(sorted_verts_target, positions, target_start, target_end); /* Copy source vertices index and cos into SortVertsElem array */ - svert_from_mvert(sorted_verts_source, mverts + source_start, source_start, source_end); + svert_from_mvert(sorted_verts_source, positions, source_start, source_end); /* sort arrays according to sum of vertex coordinates (sumco) */ qsort(sorted_verts_target, target_verts_num, sizeof(SortVertsElem), svert_sum_cmp); @@ -237,8 +237,8 @@ static void dm_mvert_map_doubles(int *doubles_map, * then there will be no mapping at all for this source. */ while (best_target_vertex != -1 && !ELEM(doubles_map[best_target_vertex], -1, best_target_vertex)) { - if (compare_len_v3v3(mverts[sve_source->vertex_num].co, - mverts[doubles_map[best_target_vertex]].co, + if (compare_len_v3v3(positions[sve_source->vertex_num], + positions[doubles_map[best_target_vertex]], dist)) { best_target_vertex = doubles_map[best_target_vertex]; } @@ -275,11 +275,10 @@ static void mesh_merge_transform(Mesh *result, { int *index_orig; int i; - MVert *mv; MEdge *me; MLoop *ml; MPoly *mp; - MVert *result_verts = BKE_mesh_verts_for_write(result); + float(*result_positions)[3] = BKE_mesh_positions_for_write(result); MEdge *result_edges = BKE_mesh_edges_for_write(result); MPoly *result_polys = BKE_mesh_polys_for_write(result); MLoop *result_loops = BKE_mesh_loops_for_write(result); @@ -289,10 +288,8 @@ static void mesh_merge_transform(Mesh *result, CustomData_copy_data(&cap_mesh->ldata, &result->ldata, 0, cap_loops_index, cap_nloops); CustomData_copy_data(&cap_mesh->pdata, &result->pdata, 0, cap_polys_index, cap_npolys); - mv = result_verts + cap_verts_index; - - for (i = 0; i < cap_nverts; i++, mv++) { - mul_m4_v3(cap_offset, mv->co); + for (i = 0; i < cap_nverts; i++) { + mul_m4_v3(cap_offset, result_positions[cap_verts_index + i]); } /* We have to correct normals too, if we do not tag them as dirty later! */ @@ -428,7 +425,6 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd, /* Build up offset array, accumulating all settings options. */ unit_m4(offset); - const MVert *src_verts = BKE_mesh_verts(mesh); const MEdge *src_edges = BKE_mesh_edges(mesh); const MPoly *src_polys = BKE_mesh_polys(mesh); const MLoop *src_loops = BKE_mesh_loops(mesh); @@ -439,12 +435,8 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd, if (amd->offset_type & MOD_ARR_OFF_RELATIVE) { float min[3], max[3]; - const MVert *src_mv; - INIT_MINMAX(min, max); - for (src_mv = src_verts, j = chunk_nverts; j--; src_mv++) { - minmax_v3v3_v3(min, max, src_mv->co); - } + BKE_mesh_minmax(mesh, min, max); for (j = 3; j--;) { offset[3][j] += amd->scale[j] * (max[j] - min[j]); @@ -541,7 +533,7 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd, /* Initialize a result dm */ result = BKE_mesh_new_nomain_from_template( mesh, result_nverts, result_nedges, 0, result_nloops, result_npolys); - MVert *result_verts = BKE_mesh_verts_for_write(result); + float(*result_positions)[3] = BKE_mesh_positions_for_write(result); MEdge *result_edges = BKE_mesh_edges_for_write(result); MPoly *result_polys = BKE_mesh_polys_for_write(result); MLoop *result_loops = BKE_mesh_loops_for_write(result); @@ -559,10 +551,7 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd, CustomData_copy_data(&mesh->pdata, &result->pdata, 0, 0, chunk_npolys); /* Subdivision-surface for eg won't have mesh data in the custom-data arrays. - * Now add #MVert/#MEdge/#MPoly layers. */ - if (!CustomData_has_layer(&mesh->vdata, CD_MVERT)) { - memcpy(result_verts, src_verts, sizeof(MVert) * mesh->totvert); - } + * Now add #position/#MEdge/#MPoly layers. */ if (!CustomData_has_layer(&mesh->edata, CD_MEDGE)) { memcpy(result_edges, src_edges, sizeof(MEdge) * mesh->totedge); } @@ -599,7 +588,7 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd, /* apply offset to all new verts */ for (i = 0; i < chunk_nverts; i++) { const int i_dst = vert_offset + i; - mul_m4_v3(current_offset, result_verts[i_dst].co); + mul_m4_v3(current_offset, result_positions[i_dst]); /* We have to correct normals too, if we do not tag them as dirty! */ if (!use_recalc_normals) { @@ -643,8 +632,8 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd, while (target != -1 && !ELEM(full_doubles_map[target], -1, target)) { /* If target is already mapped, we only follow that mapping if final target remains * close enough from current vert (otherwise no mapping at all). */ - if (compare_len_v3v3(result_verts[this_chunk_index].co, - result_verts[full_doubles_map[target]].co, + if (compare_len_v3v3(result_positions[this_chunk_index], + result_positions[full_doubles_map[target]], amd->merge_dist)) { target = full_doubles_map[target]; } @@ -658,7 +647,7 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd, } else { dm_mvert_map_doubles(full_doubles_map, - result_verts, + result_positions, (c - 1) * chunk_nverts, chunk_nverts, c * chunk_nverts, @@ -696,7 +685,7 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd, if (use_merge && (amd->flags & MOD_ARR_MERGEFINAL) && (count > 1)) { /* Merge first and last copies */ dm_mvert_map_doubles(full_doubles_map, - result_verts, + result_positions, last_chunk_start, last_chunk_nverts, first_chunk_start, @@ -726,7 +715,7 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd, /* Identify doubles with first chunk */ if (use_merge) { dm_mvert_map_doubles(full_doubles_map, - result_verts, + result_positions, first_chunk_start, first_chunk_nverts, start_cap_start, @@ -756,7 +745,7 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd, /* Identify doubles with last chunk */ if (use_merge) { dm_mvert_map_doubles(full_doubles_map, - result_verts, + result_positions, last_chunk_start, last_chunk_nverts, end_cap_start, |