Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/modifiers/intern/MOD_array.c')
-rw-r--r--source/blender/modifiers/intern/MOD_array.c55
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,