diff options
Diffstat (limited to 'source/blender/modifiers')
25 files changed, 243 insertions, 321 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, diff --git a/source/blender/modifiers/intern/MOD_boolean.cc b/source/blender/modifiers/intern/MOD_boolean.cc index 21f05158e8b..9924968ea88 100644 --- a/source/blender/modifiers/intern/MOD_boolean.cc +++ b/source/blender/modifiers/intern/MOD_boolean.cc @@ -62,6 +62,7 @@ #endif using blender::Array; +using blender::float3; using blender::float4x4; using blender::IndexRange; using blender::MutableSpan; @@ -142,9 +143,9 @@ static Mesh *get_quick_mesh( invert_m4_m4(imat, ob_self->object_to_world); mul_m4_m4m4(omat, imat, ob_operand_ob->object_to_world); - MutableSpan<MVert> verts = result->verts_for_write(); - for (const int i : verts.index_range()) { - mul_m4_v3(omat, verts[i].co); + MutableSpan<float3> positions = result->positions_for_write(); + for (const int i : positions.index_range()) { + mul_m4_v3(omat, positions[i]); } BKE_mesh_tag_coords_changed(result); diff --git a/source/blender/modifiers/intern/MOD_build.c b/source/blender/modifiers/intern/MOD_build.c index 78724d6a2a1..c6bda4a707b 100644 --- a/source/blender/modifiers/intern/MOD_build.c +++ b/source/blender/modifiers/intern/MOD_build.c @@ -75,7 +75,6 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, struct const int vert_src_num = mesh->totvert; const int edge_src_num = mesh->totedge; const int poly_src_num = mesh->totpoly; - const MVert *mvert_src = BKE_mesh_verts(mesh); const MEdge *medge_src = BKE_mesh_edges(mesh); const MPoly *mpoly_src = BKE_mesh_polys(mesh); const MLoop *mloop_src = BKE_mesh_loops(mesh); @@ -202,23 +201,15 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, struct /* now we know the number of verts, edges and faces, we can create the mesh. */ result = BKE_mesh_new_nomain_from_template( mesh, BLI_ghash_len(vertHash), BLI_ghash_len(edgeHash), 0, loops_dst_num, faces_dst_num); - MVert *result_verts = BKE_mesh_verts_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); /* copy the vertices across */ GHASH_ITER (gh_iter, vertHash) { - MVert source; - MVert *dest; int oldIndex = POINTER_AS_INT(BLI_ghashIterator_getKey(&gh_iter)); int newIndex = POINTER_AS_INT(BLI_ghashIterator_getValue(&gh_iter)); - - source = mvert_src[oldIndex]; - dest = &result_verts[newIndex]; - CustomData_copy_data(&mesh->vdata, &result->vdata, oldIndex, newIndex, 1); - *dest = source; } /* copy the edges across, remapping indices */ diff --git a/source/blender/modifiers/intern/MOD_collision.c b/source/blender/modifiers/intern/MOD_collision.c index 82faf08b349..c98c5ce6c65 100644 --- a/source/blender/modifiers/intern/MOD_collision.c +++ b/source/blender/modifiers/intern/MOD_collision.c @@ -93,7 +93,6 @@ static void deformVerts(ModifierData *md, { CollisionModifierData *collmd = (CollisionModifierData *)md; Mesh *mesh_src; - MVert *tempVert = NULL; Object *ob = ctx->object; /* If collision is disabled, free the stale data and exit. */ @@ -145,11 +144,11 @@ static void deformVerts(ModifierData *md, if (collmd->time_xnew == -1000) { /* first time */ - collmd->x = MEM_dupallocN(BKE_mesh_verts(mesh_src)); /* frame start position */ + collmd->x = MEM_dupallocN(BKE_mesh_positions(mesh_src)); /* frame start position */ for (uint i = 0; i < mvert_num; i++) { /* we save global positions */ - mul_m4_v3(ob->object_to_world, collmd->x[i].co); + mul_m4_v3(ob->object_to_world, collmd->x[i]); } collmd->xnew = MEM_dupallocN(collmd->x); /* Frame end position. */ @@ -177,25 +176,25 @@ static void deformVerts(ModifierData *md, } else if (mvert_num == collmd->mvert_num) { /* put positions to old positions */ - tempVert = collmd->x; + float(*temp)[3] = collmd->x; collmd->x = collmd->xnew; - collmd->xnew = tempVert; + collmd->xnew = temp; collmd->time_x = collmd->time_xnew; - memcpy(collmd->xnew, BKE_mesh_verts(mesh_src), mvert_num * sizeof(MVert)); + memcpy(collmd->xnew, BKE_mesh_positions(mesh_src), mvert_num * sizeof(float[3])); bool is_static = true; for (uint i = 0; i < mvert_num; i++) { /* we save global positions */ - mul_m4_v3(ob->object_to_world, collmd->xnew[i].co); + mul_m4_v3(ob->object_to_world, collmd->xnew[i]); /* detect motion */ - is_static = is_static && equals_v3v3(collmd->x[i].co, collmd->xnew[i].co); + is_static = is_static && equals_v3v3(collmd->x[i], collmd->xnew[i]); } - memcpy(collmd->current_xnew, collmd->x, mvert_num * sizeof(MVert)); - memcpy(collmd->current_x, collmd->x, mvert_num * sizeof(MVert)); + memcpy(collmd->current_xnew, collmd->x, mvert_num * sizeof(float[3])); + memcpy(collmd->current_x, collmd->x, mvert_num * sizeof(float[3])); /* check if GUI setting has changed for bvh */ if (collmd->bvhtree) { @@ -265,9 +264,9 @@ static void blendRead(BlendDataReader *UNUSED(reader), ModifierData *md) collmd->xnew = newdataadr(fd, collmd->xnew); collmd->mfaces = newdataadr(fd, collmd->mfaces); - collmd->current_x = MEM_calloc_arrayN(collmd->mvert_num, sizeof(MVert), "current_x"); - collmd->current_xnew = MEM_calloc_arrayN(collmd->mvert_num, sizeof(MVert), "current_xnew"); - collmd->current_v = MEM_calloc_arrayN(collmd->mvert_num, sizeof(MVert), "current_v"); + collmd->current_x = MEM_calloc_arrayN(collmd->mvert_num, sizeof(float[3]), "current_x"); + collmd->current_xnew = MEM_calloc_arrayN(collmd->mvert_num, sizeof(float[3]), "current_xnew"); + collmd->current_v = MEM_calloc_arrayN(collmd->mvert_num, sizeof(float[3]), "current_v"); #endif collmd->x = NULL; diff --git a/source/blender/modifiers/intern/MOD_datatransfer.cc b/source/blender/modifiers/intern/MOD_datatransfer.cc index 25e8eb8fa20..494ea23d7e2 100644 --- a/source/blender/modifiers/intern/MOD_datatransfer.cc +++ b/source/blender/modifiers/intern/MOD_datatransfer.cc @@ -175,12 +175,12 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * BLI_SPACE_TRANSFORM_SETUP(space_transform, ctx->object, ob_source); } - const MVert *me_verts = BKE_mesh_verts(me); + const float(*me_positions)[3] = BKE_mesh_positions(me); const MEdge *me_edges = BKE_mesh_edges(me); - const MVert *result_verts = BKE_mesh_verts(result); + const float(*result_positions)[3] = BKE_mesh_positions(result); const MEdge *result_edges = BKE_mesh_edges(result); - if (((result == me) || (me_verts == result_verts) || (me_edges == result_edges)) && + if (((result == me) || (me_positions == result_positions) || (me_edges == result_edges)) && (dtmd->data_types & DT_TYPES_AFFECT_MESH)) { /* We need to duplicate data here, otherwise setting custom normals, edges' sharpness, etc., * could modify org mesh, see T43671. */ diff --git a/source/blender/modifiers/intern/MOD_displace.c b/source/blender/modifiers/intern/MOD_displace.c index fc12a9c2aad..6436bf29bdc 100644 --- a/source/blender/modifiers/intern/MOD_displace.c +++ b/source/blender/modifiers/intern/MOD_displace.c @@ -157,7 +157,6 @@ typedef struct DisplaceUserdata { float (*tex_co)[3]; float (*vertexCos)[3]; float local_mat[4][4]; - MVert *mvert; const float (*vert_normals)[3]; float (*vert_clnors)[3]; } DisplaceUserdata; @@ -267,7 +266,6 @@ static void displaceModifier_do(DisplaceModifierData *dmd, const int verts_num) { Object *ob = ctx->object; - MVert *mvert; const MDeformVert *dvert; int direction = dmd->direction; int defgrp_index; @@ -284,7 +282,6 @@ static void displaceModifier_do(DisplaceModifierData *dmd, return; } - mvert = BKE_mesh_verts_for_write(mesh); MOD_get_vgroup(ob, mesh, dmd->defgrp_name, &dvert, &defgrp_index); if (defgrp_index >= 0 && dvert == NULL) { @@ -337,7 +334,6 @@ static void displaceModifier_do(DisplaceModifierData *dmd, data.tex_co = tex_co; data.vertexCos = vertexCos; copy_m4_m4(data.local_mat, local_mat); - data.mvert = mvert; if (direction == MOD_DISP_DIR_NOR) { data.vert_normals = BKE_mesh_vertex_normals_ensure(mesh); } diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c index b0806fed91c..7d2bf5f65bb 100644 --- a/source/blender/modifiers/intern/MOD_explode.c +++ b/source/blender/modifiers/intern/MOD_explode.c @@ -91,7 +91,6 @@ static void createFacepa(ExplodeModifierData *emd, ParticleSystemModifierData *p { ParticleSystem *psys = psmd->psys; MFace *fa = NULL, *mface = NULL; - MVert *mvert = NULL; ParticleData *pa; KDTree_3d *tree; RNG *rng; @@ -100,7 +99,7 @@ static void createFacepa(ExplodeModifierData *emd, ParticleSystemModifierData *p int i, p, v1, v2, v3, v4 = 0; const bool invert_vgroup = (emd->flag & eExplodeFlag_INVERT_VGROUP) != 0; - mvert = BKE_mesh_verts_for_write(mesh); + float(*positions)[3] = BKE_mesh_positions_for_write(mesh); mface = (MFace *)CustomData_get_layer(&mesh->fdata, CD_MFACE); totvert = mesh->totvert; totface = mesh->totface; @@ -160,10 +159,10 @@ static void createFacepa(ExplodeModifierData *emd, ParticleSystemModifierData *p /* set face-particle-indexes to nearest particle to face center */ for (i = 0, fa = mface; i < totface; i++, fa++) { - add_v3_v3v3(center, mvert[fa->v1].co, mvert[fa->v2].co); - add_v3_v3(center, mvert[fa->v3].co); + add_v3_v3v3(center, positions[fa->v1], positions[fa->v2]); + add_v3_v3(center, positions[fa->v3]); if (fa->v4) { - add_v3_v3(center, mvert[fa->v4].co); + add_v3_v3(center, positions[fa->v4]); mul_v3_fl(center, 0.25); } else { @@ -641,7 +640,7 @@ static Mesh *cutEdges(ExplodeModifierData *emd, Mesh *mesh) Mesh *split_m; MFace *mf = NULL, *df1 = NULL; MFace *mface = CustomData_get_layer(&mesh->fdata, CD_MFACE); - MVert *dupve, *mv; + float *dupve; EdgeHash *edgehash; EdgeHashIterator *ehi; int totvert = mesh->totvert; @@ -730,18 +729,11 @@ static Mesh *cutEdges(ExplodeModifierData *emd, Mesh *mesh) layers_num = CustomData_number_of_layers(&split_m->fdata, CD_MTFACE); - const MVert *mesh_verts = BKE_mesh_verts(mesh); - MVert *split_m_verts = BKE_mesh_verts_for_write(split_m); + float(*split_m_positions)[3] = BKE_mesh_positions_for_write(split_m); /* copy new faces & verts (is it really this painful with custom data??) */ for (i = 0; i < totvert; i++) { - MVert source; - MVert *dest; - source = mesh_verts[i]; - dest = &split_m_verts[i]; - CustomData_copy_data(&mesh->vdata, &split_m->vdata, i, i, 1); - *dest = source; } /* override original facepa (original pointer is saved in caller function) */ @@ -759,16 +751,13 @@ static Mesh *cutEdges(ExplodeModifierData *emd, Mesh *mesh) for (; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { BLI_edgehashIterator_getKey(ehi, &ed_v1, &ed_v2); esplit = POINTER_AS_INT(BLI_edgehashIterator_getValue(ehi)); - mv = &split_m_verts[ed_v2]; - dupve = &split_m_verts[esplit]; CustomData_copy_data(&split_m->vdata, &split_m->vdata, ed_v2, esplit, 1); - *dupve = *mv; - - mv = &split_m_verts[ed_v1]; + dupve = split_m_positions[esplit]; + copy_v3_v3(dupve, split_m_positions[ed_v2]); - mid_v3_v3v3(dupve->co, dupve->co, mv->co); + mid_v3_v3v3(dupve, dupve, split_m_positions[ed_v1]); } BLI_edgehashIterator_free(ehi); @@ -989,26 +978,23 @@ static Mesh *explodeMesh(ExplodeModifierData *emd, psys_sim_data_init(&sim); - const MVert *mesh_verts = BKE_mesh_verts(mesh); - MVert *explode_verts = BKE_mesh_verts_for_write(explode); + const float(*positions)[3] = BKE_mesh_positions(mesh); + float(*explode_positions)[3] = BKE_mesh_positions_for_write(explode); /* duplicate & displace vertices */ ehi = BLI_edgehashIterator_new(vertpahash); for (; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { - MVert source; - MVert *dest; /* get particle + vertex from hash */ BLI_edgehashIterator_getKey(ehi, &ed_v1, &ed_v2); ed_v2 -= totvert; v = POINTER_AS_INT(BLI_edgehashIterator_getValue(ehi)); - source = mesh_verts[ed_v1]; - dest = &explode_verts[v]; + copy_v3_v3(explode_positions[v], positions[ed_v1]); CustomData_copy_data(&mesh->vdata, &explode->vdata, ed_v1, v, 1); - *dest = source; + copy_v3_v3(explode_positions[v], positions[ed_v1]); if (ed_v2 != totpart) { /* get particle */ @@ -1019,7 +1005,7 @@ static Mesh *explodeMesh(ExplodeModifierData *emd, state.time = ctime; psys_get_particle_state(&sim, ed_v2, &state, 1); - vertco = explode_verts[v].co; + vertco = explode_positions[v]; mul_m4_v3(ctx->object->object_to_world, vertco); sub_v3_v3(vertco, birth.co); diff --git a/source/blender/modifiers/intern/MOD_mask.cc b/source/blender/modifiers/intern/MOD_mask.cc index 659a1625079..3ae300d22cf 100644 --- a/source/blender/modifiers/intern/MOD_mask.cc +++ b/source/blender/modifiers/intern/MOD_mask.cc @@ -49,6 +49,7 @@ #include "BLI_vector.hh" using blender::Array; +using blender::float3; using blender::IndexRange; using blender::ListBaseWrapper; using blender::MutableSpan; @@ -336,19 +337,12 @@ static void copy_masked_verts_to_new_mesh(const Mesh &src_mesh, Span<int> vertex_map) { BLI_assert(src_mesh.totvert == vertex_map.size()); - const Span<MVert> src_verts = src_mesh.verts(); - MutableSpan<MVert> dst_verts = dst_mesh.verts_for_write(); - for (const int i_src : vertex_map.index_range()) { const int i_dst = vertex_map[i_src]; if (i_dst == -1) { continue; } - const MVert &v_src = src_verts[i_src]; - MVert &v_dst = dst_verts[i_dst]; - - v_dst = v_src; CustomData_copy_data(&src_mesh.vdata, &dst_mesh.vdata, i_src, i_dst, 1); } } @@ -374,11 +368,10 @@ static void add_interp_verts_copy_edges_to_new_mesh(const Mesh &src_mesh, uint verts_add_num, MutableSpan<int> r_edge_map) { + using namespace blender; BLI_assert(src_mesh.totvert == vertex_mask.size()); BLI_assert(src_mesh.totedge == r_edge_map.size()); - const Span<MVert> src_verts = src_mesh.verts(); const Span<MEdge> src_edges = src_mesh.edges(); - MutableSpan<MVert> dst_verts = dst_mesh.verts_for_write(); MutableSpan<MEdge> dst_edges = dst_mesh.edges_for_write(); uint vert_index = dst_mesh.totvert - verts_add_num; @@ -418,11 +411,6 @@ static void add_interp_verts_copy_edges_to_new_mesh(const Mesh &src_mesh, float weights[2] = {1.0f - fac, fac}; CustomData_interp( &src_mesh.vdata, &dst_mesh.vdata, (int *)&e_src.v1, weights, nullptr, 2, vert_index); - MVert &v = dst_verts[vert_index]; - const MVert &v1 = src_verts[e_src.v1]; - const MVert &v2 = src_verts[e_src.v2]; - - interp_v3_v3v3(v.co, v1.co, v2.co, fac); vert_index++; } } diff --git a/source/blender/modifiers/intern/MOD_meshcache.c b/source/blender/modifiers/intern/MOD_meshcache.c index 822da40edb7..43757c0e95d 100644 --- a/source/blender/modifiers/intern/MOD_meshcache.c +++ b/source/blender/modifiers/intern/MOD_meshcache.c @@ -176,17 +176,8 @@ static void meshcache_do(MeshCacheModifierData *mcmd, BKE_modifier_set_error(ob, &mcmd->modifier, "'Integrate' requires faces"); } else { - /* the moons align! */ - int i; - - float(*vertexCos_Source)[3] = MEM_malloc_arrayN( - verts_num, sizeof(*vertexCos_Source), __func__); float(*vertexCos_New)[3] = MEM_malloc_arrayN(verts_num, sizeof(*vertexCos_New), __func__); - const MVert *mv = BKE_mesh_verts(me); - - for (i = 0; i < verts_num; i++, mv++) { - copy_v3_v3(vertexCos_Source[i], mv->co); - } + const float(*positions)[3] = BKE_mesh_positions(me); BKE_mesh_calc_relative_deform( BKE_mesh_polys(me), @@ -194,8 +185,8 @@ static void meshcache_do(MeshCacheModifierData *mcmd, BKE_mesh_loops(me), me->totvert, - (const float(*)[3])vertexCos_Source, /* From the original Mesh. */ - (const float(*)[3])vertexCos_Real, /* the input we've been given (shape keys!) */ + (const float(*)[3])positions, /* From the original Mesh. */ + (const float(*)[3])vertexCos_Real, /* the input we've been given (shape keys!) */ (const float(*)[3])vertexCos, /* The result of this modifier. */ vertexCos_New /* The result of this function. */ @@ -204,7 +195,6 @@ static void meshcache_do(MeshCacheModifierData *mcmd, /* write the corrected locations back into the result */ memcpy(vertexCos, vertexCos_New, sizeof(*vertexCos) * verts_num); - MEM_freeN(vertexCos_Source); MEM_freeN(vertexCos_New); } } diff --git a/source/blender/modifiers/intern/MOD_meshsequencecache.cc b/source/blender/modifiers/intern/MOD_meshsequencecache.cc index 13931179b35..6da6dd46507 100644 --- a/source/blender/modifiers/intern/MOD_meshsequencecache.cc +++ b/source/blender/modifiers/intern/MOD_meshsequencecache.cc @@ -60,6 +60,7 @@ # include "usd.h" #endif +using blender::float3; using blender::Span; static void initData(ModifierData *md) @@ -176,17 +177,17 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * } if (me != nullptr) { - const Span<MVert> mesh_verts = mesh->verts(); + const Span<float3> mesh_positions = mesh->positions(); const Span<MEdge> mesh_edges = mesh->edges(); const Span<MPoly> mesh_polys = mesh->polys(); - const Span<MVert> me_verts = me->verts(); + const Span<float3> me_positions = me->positions(); const Span<MEdge> me_edges = me->edges(); const Span<MPoly> me_polys = me->polys(); /* TODO(sybren+bastien): possibly check relevant custom data layers (UV/color depending on * flags) and duplicate those too. * XXX(Hans): This probably isn't true anymore with various CoW improvements, etc. */ - if ((me_verts.data() == mesh_verts.data()) || (me_edges.data() == mesh_edges.data()) || + if ((me_positions.data() == mesh_positions.data()) || (me_edges.data() == mesh_edges.data()) || (me_polys.data() == mesh_polys.data())) { /* We need to duplicate data here, otherwise we'll modify org mesh, see T51701. */ mesh = reinterpret_cast<Mesh *>( diff --git a/source/blender/modifiers/intern/MOD_multires.cc b/source/blender/modifiers/intern/MOD_multires.cc index 2bc3763c46b..8c594b061fa 100644 --- a/source/blender/modifiers/intern/MOD_multires.cc +++ b/source/blender/modifiers/intern/MOD_multires.cc @@ -219,7 +219,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * mesh->flag & ME_AUTOSMOOTH && CustomData_has_layer(&mesh->ldata, CD_CUSTOMLOOPNORMAL); /* NOTE: Orco needs final coordinates on CPU side, which are expected to be - * accessible via MVert. For this reason we do not evaluate multires to + * accessible via mesh vertices. For this reason we do not evaluate multires to * grids when orco is requested. */ const bool for_orco = (ctx->flag & MOD_APPLY_ORCO) != 0; /* Needed when rendering or baking will in sculpt mode. */ @@ -244,7 +244,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * sculpt_session->multires.level = mmd->sculptlvl; sculpt_session->totvert = mesh->totvert; sculpt_session->totpoly = mesh->totpoly; - sculpt_session->mvert = nullptr; + sculpt_session->positions = nullptr; sculpt_session->mpoly = nullptr; sculpt_session->mloop = nullptr; } diff --git a/source/blender/modifiers/intern/MOD_normal_edit.cc b/source/blender/modifiers/intern/MOD_normal_edit.cc index 7d422826cf8..9a1a10f086c 100644 --- a/source/blender/modifiers/intern/MOD_normal_edit.cc +++ b/source/blender/modifiers/intern/MOD_normal_edit.cc @@ -47,16 +47,17 @@ static void generate_vert_coordinates(Mesh *mesh, float (*r_cos)[3], float r_size[3]) { + using namespace blender; float min_co[3], max_co[3]; float diff[3]; bool do_diff = false; INIT_MINMAX(min_co, max_co); - const MVert *mv = BKE_mesh_verts(mesh); - for (int i = 0; i < mesh->totvert; i++, mv++) { - copy_v3_v3(r_cos[i], mv->co); - if (r_size != nullptr && ob_center == nullptr) { + const Span<float3> positions = mesh->positions(); + for (int i = 0; i < mesh->totvert; i++) { + copy_v3_v3(r_cos[i], positions[i]); + if (r_size != NULL && ob_center == NULL) { minmax_v3v3_v3(min_co, max_co, r_cos[i]); } } @@ -221,7 +222,7 @@ static void normalEditModifier_do_radial(NormalEditModifierData *enmd, const MDeformVert *dvert, const int defgrp_index, const bool use_invert_vgroup, - const MVert *mvert, + const float (*positions)[3], const int verts_num, MEdge *medge, const int edges_num, @@ -329,7 +330,7 @@ static void normalEditModifier_do_radial(NormalEditModifierData *enmd, BKE_mesh_normals_tag_dirty(mesh); } - BKE_mesh_normals_loop_custom_set(mvert, + BKE_mesh_normals_loop_custom_set(positions, BKE_mesh_vertex_normals_ensure(mesh), verts_num, medge, @@ -360,7 +361,7 @@ static void normalEditModifier_do_directional(NormalEditModifierData *enmd, const MDeformVert *dvert, const int defgrp_index, const bool use_invert_vgroup, - const MVert *mvert, + const float (*positions)[3], const int verts_num, MEdge *medge, const int edges_num, @@ -445,7 +446,7 @@ static void normalEditModifier_do_directional(NormalEditModifierData *enmd, BKE_mesh_normals_tag_dirty(mesh); } - BKE_mesh_normals_loop_custom_set(mvert, + BKE_mesh_normals_loop_custom_set(positions, BKE_mesh_vertex_normals_ensure(mesh), verts_num, medge, @@ -527,7 +528,7 @@ static Mesh *normalEditModifier_do(NormalEditModifierData *enmd, const int edges_num = result->totedge; const int loops_num = result->totloop; const int polys_num = result->totpoly; - const MVert *verts = BKE_mesh_verts(result); + const float(*positions)[3] = BKE_mesh_positions(result); MEdge *edges = BKE_mesh_edges_for_write(result); const MPoly *polys = BKE_mesh_polys(result); MLoop *loops = BKE_mesh_loops_for_write(result); @@ -549,7 +550,7 @@ static Mesh *normalEditModifier_do(NormalEditModifierData *enmd, loopnors = static_cast<float(*)[3]>( MEM_malloc_arrayN(size_t(loops_num), sizeof(*loopnors), __func__)); - BKE_mesh_normals_loop_split(verts, + BKE_mesh_normals_loop_split(positions, vert_normals, verts_num, edges, @@ -588,7 +589,7 @@ static Mesh *normalEditModifier_do(NormalEditModifierData *enmd, dvert, defgrp_index, use_invert_vgroup, - verts, + positions, verts_num, edges, edges_num, @@ -611,7 +612,7 @@ static Mesh *normalEditModifier_do(NormalEditModifierData *enmd, dvert, defgrp_index, use_invert_vgroup, - verts, + positions, verts_num, edges, edges_num, diff --git a/source/blender/modifiers/intern/MOD_ocean.c b/source/blender/modifiers/intern/MOD_ocean.c index bee1bd7795a..c4531f13fe3 100644 --- a/source/blender/modifiers/intern/MOD_ocean.c +++ b/source/blender/modifiers/intern/MOD_ocean.c @@ -154,7 +154,7 @@ static bool dependsOnNormals(ModifierData *md) #ifdef WITH_OCEANSIM typedef struct GenerateOceanGeometryData { - MVert *mverts; + float (*positions)[3]; MPoly *mpolys; MLoop *mloops; MLoopUV *mloopuvs; @@ -175,7 +175,7 @@ static void generate_ocean_geometry_verts(void *__restrict userdata, for (x = 0; x <= gogd->res_x; x++) { const int i = y * (gogd->res_x + 1) + x; - float *co = gogd->mverts[i].co; + float *co = gogd->positions[i]; co[0] = gogd->ox + (x * gogd->sx); co[1] = gogd->oy + (y * gogd->sy); co[2] = 0.0f; @@ -270,7 +270,7 @@ static Mesh *generate_ocean_geometry(OceanModifierData *omd, Mesh *mesh_orig, co result = BKE_mesh_new_nomain(verts_num, 0, 0, polys_num * 4, polys_num); BKE_mesh_copy_parameters_for_eval(result, mesh_orig); - gogd.mverts = BKE_mesh_verts_for_write(result); + gogd.positions = BKE_mesh_positions_for_write(result); gogd.mpolys = BKE_mesh_polys_for_write(result); gogd.mloops = BKE_mesh_loops_for_write(result); @@ -363,15 +363,15 @@ static Mesh *doOcean(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mes CLAMP(cfra_for_cache, omd->bakestart, omd->bakeend); cfra_for_cache -= omd->bakestart; /* shift to 0 based */ - MVert *verts = BKE_mesh_verts_for_write(result); - MPoly *polys = BKE_mesh_polys_for_write(result); + float(*positions)[3] = BKE_mesh_positions_for_write(result); + const MPoly *polys = BKE_mesh_polys(result); /* add vcols before displacement - allows lookup based on position */ if (omd->flag & MOD_OCEAN_GENERATE_FOAM) { const int polys_num = result->totpoly; const int loops_num = result->totloop; - MLoop *mloops = BKE_mesh_loops_for_write(result); + const MLoop *mloops = BKE_mesh_loops(result); MLoopCol *mloopcols = CustomData_add_layer_named( &result->ldata, CD_PROP_BYTE_COLOR, CD_SET_DEFAULT, NULL, loops_num, omd->foamlayername); @@ -386,10 +386,10 @@ static Mesh *doOcean(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mes } if (mloopcols) { /* unlikely to fail */ - MPoly *mp; + const MPoly *mp; for (i = 0, mp = polys; i < polys_num; i++, mp++) { - MLoop *ml = &mloops[mp->loopstart]; + const MLoop *ml = &mloops[mp->loopstart]; MLoopCol *mlcol = &mloopcols[mp->loopstart]; MLoopCol *mlcolspray = NULL; @@ -398,7 +398,7 @@ static Mesh *doOcean(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mes } for (j = mp->totloop; j--; ml++, mlcol++) { - const float *vco = verts[ml->v].co; + const float *vco = positions[ml->v]; const float u = OCEAN_CO(size_co_inv, vco[0]); const float v = OCEAN_CO(size_co_inv, vco[1]); float foam; @@ -446,7 +446,7 @@ static Mesh *doOcean(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mes const int verts_num = result->totvert; for (i = 0; i < verts_num; i++) { - float *vco = verts[i].co; + float *vco = positions[i]; const float u = OCEAN_CO(size_co_inv, vco[0]); const float v = OCEAN_CO(size_co_inv, vco[1]); diff --git a/source/blender/modifiers/intern/MOD_particleinstance.c b/source/blender/modifiers/intern/MOD_particleinstance.c index 46e14dd6bfb..349c850b145 100644 --- a/source/blender/modifiers/intern/MOD_particleinstance.c +++ b/source/blender/modifiers/intern/MOD_particleinstance.c @@ -315,10 +315,9 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * result = BKE_mesh_new_nomain_from_template(mesh, maxvert, maxedge, 0, maxloop, maxpoly); - const MVert *orig_mvert = BKE_mesh_verts(mesh); const MPoly *orig_mpoly = BKE_mesh_polys(mesh); const MLoop *orig_mloop = BKE_mesh_loops(mesh); - MVert *mvert = BKE_mesh_verts_for_write(result); + float(*positions)[3] = BKE_mesh_positions_for_write(result); MEdge *edges = BKE_mesh_edges_for_write(result); MPoly *mpoly = BKE_mesh_polys_for_write(result); MLoop *mloop = BKE_mesh_loops_for_write(result); @@ -349,13 +348,9 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * /* set vertices coordinates */ for (k = 0; k < totvert; k++) { ParticleKey state; - const MVert *inMV; int vindex = p_skip * totvert + k; - MVert *mv = mvert + vindex; - inMV = orig_mvert + k; - CustomData_copy_data(&mesh->vdata, &result->vdata, k, p_skip * totvert + k, 1); - *mv = *inMV; + CustomData_copy_data(&mesh->vdata, &result->vdata, k, vindex, 1); if (vert_part_index != NULL) { vert_part_index[vindex] = p; @@ -365,10 +360,10 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * } /* Change orientation based on object trackflag. */ - copy_v3_v3(temp_co, mv->co); - mv->co[axis] = temp_co[track]; - mv->co[(axis + 1) % 3] = temp_co[(track + 1) % 3]; - mv->co[(axis + 2) % 3] = temp_co[(track + 2) % 3]; + copy_v3_v3(temp_co, positions[vindex]); + positions[vindex][axis] = temp_co[track]; + positions[vindex][(axis + 1) % 3] = temp_co[(track + 1) % 3]; + positions[vindex][(axis + 2) % 3] = temp_co[(track + 2) % 3]; /* get particle state */ if ((psys->flag & (PSYS_HAIR_DONE | PSYS_KEYED) || psys->pointcache->flag & PTCACHE_BAKED) && @@ -382,13 +377,14 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * state.time = pimd->position * (1.0f - ran); } else { - state.time = (mv->co[axis] - min_co) / (max_co - min_co) * pimd->position * (1.0f - ran); + state.time = (positions[vindex][axis] - min_co) / (max_co - min_co) * pimd->position * + (1.0f - ran); if (trackneg) { state.time = 1.0f - state.time; } - mv->co[axis] = 0.0; + positions[vindex][axis] = 0.0; } psys_get_particle_on_path(&sim, p, &state, 1); @@ -462,13 +458,13 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * psys_get_particle_state(&sim, p, &state, 1); } - mul_qt_v3(state.rot, mv->co); + mul_qt_v3(state.rot, positions[vindex]); if (pimd->flag & eParticleInstanceFlag_UseSize) { - mul_v3_fl(mv->co, size[p]); + mul_v3_fl(positions[vindex], size[p]); } - add_v3_v3(mv->co, state.co); + add_v3_v3(positions[vindex], state.co); - mul_m4_v3(spacemat, mv->co); + mul_m4_v3(spacemat, positions[vindex]); } /* Create edges and adjust edge vertex indices. */ diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c index d6241fcb290..20da79897c9 100644 --- a/source/blender/modifiers/intern/MOD_remesh.c +++ b/source/blender/modifiers/intern/MOD_remesh.c @@ -60,8 +60,8 @@ static void init_dualcon_mesh(DualConInput *input, Mesh *mesh) { memset(input, 0, sizeof(DualConInput)); - input->co = (void *)BKE_mesh_verts(mesh); - input->co_stride = sizeof(MVert); + input->co = (void *)BKE_mesh_positions(mesh); + input->co_stride = sizeof(float[3]); input->totco = mesh->totvert; input->mloop = (void *)BKE_mesh_loops(mesh); @@ -79,7 +79,7 @@ static void init_dualcon_mesh(DualConInput *input, Mesh *mesh) * keep track of the current elements */ typedef struct { Mesh *mesh; - MVert *verts; + float (*positions)[3]; MPoly *polys; MLoop *loops; int curvert, curface; @@ -95,7 +95,7 @@ static void *dualcon_alloc_output(int totvert, int totquad) } output->mesh = BKE_mesh_new_nomain(totvert, 0, 0, 4 * totquad, totquad); - output->verts = BKE_mesh_verts_for_write(output->mesh); + output->positions = BKE_mesh_positions_for_write(output->mesh); output->polys = BKE_mesh_polys_for_write(output->mesh); output->loops = BKE_mesh_loops_for_write(output->mesh); @@ -108,7 +108,7 @@ static void dualcon_add_vert(void *output_v, const float co[3]) BLI_assert(output->curvert < output->mesh->totvert); - copy_v3_v3(output->verts[output->curvert].co, co); + copy_v3_v3(output->positions[output->curvert], co); output->curvert++; } diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c index 4ba274dbd8a..14cf79bb06e 100644 --- a/source/blender/modifiers/intern/MOD_screw.c +++ b/source/blender/modifiers/intern/MOD_screw.c @@ -116,7 +116,7 @@ static void screwvert_iter_step(ScrewVertIter *iter) } static Mesh *mesh_remove_doubles_on_axis(Mesh *result, - MVert *mvert_new, + float (*positions_new)[3], const uint totvert, const uint step_tot, const float axis_vec[3], @@ -132,18 +132,18 @@ static Mesh *mesh_remove_doubles_on_axis(Mesh *result, float axis_co[3]; if (use_offset) { float offset_co[3]; - sub_v3_v3v3(offset_co, mvert_new[i].co, axis_offset); + sub_v3_v3v3(offset_co, positions_new[i], axis_offset); project_v3_v3v3_normalized(axis_co, offset_co, axis_vec); add_v3_v3(axis_co, axis_offset); } else { - project_v3_v3v3_normalized(axis_co, mvert_new[i].co, axis_vec); + project_v3_v3v3_normalized(axis_co, positions_new[i], axis_vec); } - const float dist_sq = len_squared_v3v3(axis_co, mvert_new[i].co); + const float dist_sq = len_squared_v3v3(axis_co, positions_new[i]); if (dist_sq <= merge_threshold_sq) { BLI_BITMAP_ENABLE(vert_tag, i); tot_doubles += 1; - copy_v3_v3(mvert_new[i].co, axis_co); + copy_v3_v3(positions_new[i], axis_co); } } @@ -242,8 +242,6 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * MPoly *mp_new; MLoop *ml_new; MEdge *med_new, *med_new_firstloop; - MVert *mv_new, *mv_new_base; - const MVert *mv_orig; Object *ob_axis = ltmd->ob_axis; ScrewVertConnect *vc, *vc_tmp, *vert_connect = NULL; @@ -383,12 +381,12 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * result = BKE_mesh_new_nomain_from_template( mesh, (int)maxVerts, (int)maxEdges, 0, (int)maxPolys * 4, (int)maxPolys); - const MVert *mvert_orig = BKE_mesh_verts(mesh); + const float(*positions_orig)[3] = BKE_mesh_positions(mesh); const MEdge *medge_orig = BKE_mesh_edges(mesh); const MPoly *mpoly_orig = BKE_mesh_polys(mesh); const MLoop *mloop_orig = BKE_mesh_loops(mesh); - MVert *mvert_new = BKE_mesh_verts_for_write(result); + float(*positions_new)[3] = BKE_mesh_positions_for_write(result); MEdge *medge_new = BKE_mesh_edges_for_write(result); MPoly *mpoly_new = BKE_mesh_polys_for_write(result); MLoop *mloop_new = BKE_mesh_loops_for_write(result); @@ -413,8 +411,8 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * } if (ltmd->flag & MOD_SCREW_UV_STRETCH_V) { - for (i = 0, mv_orig = mvert_orig; i < totvert; i++, mv_orig++) { - const float v = dist_signed_squared_to_plane_v3(mv_orig->co, uv_axis_plane); + for (i = 0; i < totvert; i++) { + const float v = dist_signed_squared_to_plane_v3(positions_orig[i], uv_axis_plane); uv_v_minmax[0] = min_ff(v, uv_v_minmax[0]); uv_v_minmax[1] = max_ff(v, uv_v_minmax[1]); } @@ -428,9 +426,6 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * /* Set the locations of the first set of verts */ - mv_new = mvert_new; - mv_orig = mvert_orig; - BLI_bitmap *vert_tag = BLI_BITMAP_NEW(totvert, __func__); /* Copy the first set of edges */ @@ -441,7 +436,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * med_new->v2 = med_orig->v2; med_new->flag = med_orig->flag & ~ME_LOOSEEDGE; - /* Tag #MVert as not loose. */ + /* Tag vertex as not loose. */ BLI_BITMAP_ENABLE(vert_tag, med_orig->v1); BLI_BITMAP_ENABLE(vert_tag, med_orig->v2); } @@ -506,14 +501,13 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * // printf("\n\n\n\n\nStarting Modifier\n"); /* set edge users */ med_new = medge_new; - mv_new = mvert_new; if (ob_axis != NULL) { /* `mtx_tx` is initialized early on. */ - for (i = 0; i < totvert; i++, mv_new++, mv_orig++, vc++) { - vc->co[0] = mv_new->co[0] = mv_orig->co[0]; - vc->co[1] = mv_new->co[1] = mv_orig->co[1]; - vc->co[2] = mv_new->co[2] = mv_orig->co[2]; + for (i = 0; i < totvert; i++, vc++) { + vc->co[0] = positions_new[i][0] = positions_orig[i][0]; + vc->co[1] = positions_new[i][1] = positions_orig[i][1]; + vc->co[2] = positions_new[i][2] = positions_orig[i][2]; vc->flag = 0; vc->e[0] = vc->e[1] = NULL; @@ -528,10 +522,10 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * } } else { - for (i = 0; i < totvert; i++, mv_new++, mv_orig++, vc++) { - vc->co[0] = mv_new->co[0] = mv_orig->co[0]; - vc->co[1] = mv_new->co[1] = mv_orig->co[1]; - vc->co[2] = mv_new->co[2] = mv_orig->co[2]; + for (i = 0; i < totvert; i++, vc++) { + vc->co[0] = positions_new[i][0] = positions_orig[i][0]; + vc->co[1] = positions_new[i][1] = positions_orig[i][1]; + vc->co[2] = positions_new[i][2] = positions_orig[i][2]; vc->flag = 0; vc->e[0] = vc->e[1] = NULL; @@ -758,11 +752,8 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * } } else { - mv_orig = mvert_orig; - mv_new = mvert_new; - - for (i = 0; i < totvert; i++, mv_new++, mv_orig++) { - copy_v3_v3(mv_new->co, mv_orig->co); + for (i = 0; i < totvert; i++) { + copy_v3_v3(positions_new[i], positions_orig[i]); } } /* done with edge connectivity based normal flipping */ @@ -790,25 +781,24 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * /* copy a slice */ CustomData_copy_data(&mesh->vdata, &result->vdata, 0, (int)varray_stride, (int)totvert); - mv_new_base = mvert_new; - mv_new = &mvert_new[varray_stride]; /* advance to the next slice */ + for (j = 0; j < totvert; j++) { + const int vert_index_new = (int)varray_stride + (int)j; - for (j = 0; j < totvert; j++, mv_new_base++, mv_new++) { /* set location */ - copy_v3_v3(mv_new->co, mv_new_base->co); + copy_v3_v3(positions_new[vert_index_new], positions_new[j]); /* only need to set these if using non cleared memory */ // mv_new->mat_nr = mv_new->flag = 0; if (ob_axis != NULL) { - sub_v3_v3(mv_new->co, mtx_tx[3]); + sub_v3_v3(positions_new[vert_index_new], mtx_tx[3]); - mul_m4_v3(mat, mv_new->co); + mul_m4_v3(mat, positions_new[vert_index_new]); - add_v3_v3(mv_new->co, mtx_tx[3]); + add_v3_v3(positions_new[vert_index_new], mtx_tx[3]); } else { - mul_m4_v3(mat, mv_new->co); + mul_m4_v3(mat, positions_new[vert_index_new]); } /* add the new edge */ @@ -879,8 +869,8 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * } if (has_mloop_orig == false && mloopuv_layers_tot) { - uv_v_offset_a = dist_signed_to_plane_v3(mvert_new[medge_new[i].v1].co, uv_axis_plane); - uv_v_offset_b = dist_signed_to_plane_v3(mvert_new[medge_new[i].v2].co, uv_axis_plane); + uv_v_offset_a = dist_signed_to_plane_v3(positions_new[medge_new[i].v1], uv_axis_plane); + uv_v_offset_b = dist_signed_to_plane_v3(positions_new[medge_new[i].v2], uv_axis_plane); if (ltmd->flag & MOD_SCREW_UV_STRETCH_V) { uv_v_offset_a = (uv_v_offset_a - uv_v_minmax[0]) * uv_v_range_inv; @@ -1037,7 +1027,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * if (do_remove_doubles) { result = mesh_remove_doubles_on_axis(result, - mvert_new, + positions_new, totvert, step_tot, axis_vec, diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.c b/source/blender/modifiers/intern/MOD_shrinkwrap.c index df8b9d53a2f..b5e66a1af79 100644 --- a/source/blender/modifiers/intern/MOD_shrinkwrap.c +++ b/source/blender/modifiers/intern/MOD_shrinkwrap.c @@ -56,12 +56,6 @@ static void requiredDataMask(ModifierData *md, CustomData_MeshMasks *r_cddata_ma if (smd->vgroup_name[0] != '\0') { r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT; } - - if ((smd->shrinkType == MOD_SHRINKWRAP_PROJECT) && - (smd->projAxis == MOD_SHRINKWRAP_PROJECT_OVER_NORMAL)) { - /* XXX Really? These should always be present, always... */ - r_cddata_masks->vmask |= CD_MASK_MVERT; - } } static bool isDisabled(const struct Scene *UNUSED(scene), diff --git a/source/blender/modifiers/intern/MOD_skin.c b/source/blender/modifiers/intern/MOD_skin.c index 897a25711cd..992035c5cc1 100644 --- a/source/blender/modifiers/intern/MOD_skin.c +++ b/source/blender/modifiers/intern/MOD_skin.c @@ -132,12 +132,12 @@ typedef enum { } SkinNodeFlag; typedef struct Frame { - /* Index in the MVert array */ + /* Index in the vertex array */ BMVert *verts[4]; /* Location of each corner */ float co[4][3]; /* Indicates which corners have been merged with another - * frame's corner (so they share an MVert index) */ + * frame's corner (so they share a vertex index) */ struct { /* Merge to target frame/corner (no merge if frame is null) */ struct Frame *frame; @@ -520,7 +520,7 @@ static float half_v2(const float v[2]) static void end_node_frames(int v, SkinNode *skin_nodes, - const MVert *mvert, + const float (*positions)[3], const MVertSkin *nodes, const MeshElemMap *emap, EMat *emat) @@ -540,8 +540,8 @@ static void end_node_frames(int v, mat[0][2] = mat[1][0] = mat[2][1] = 1; /* Caps */ - create_frame(&skin_nodes[v].frames[0], mvert[v].co, rad, mat, avg); - create_frame(&skin_nodes[v].frames[1], mvert[v].co, rad, mat, -avg); + create_frame(&skin_nodes[v].frames[0], positions[v], rad, mat, avg); + create_frame(&skin_nodes[v].frames[1], positions[v], rad, mat, -avg); } else { /* For nodes with an incoming edge, create a single (capped) frame */ @@ -557,7 +557,7 @@ static void end_node_frames(int v, Frame *frame = &skin_nodes[v].frames[0]; /* End frame */ - create_frame(frame, mvert[v].co, rad, mat, 0); + create_frame(frame, positions[v], rad, mat, 0); /* The caps might need to have their normals inverted. So check if they * need to be flipped when creating faces. */ @@ -605,7 +605,7 @@ static int connection_node_mat(float mat[3][3], int v, const MeshElemMap *emap, static void connection_node_frames(int v, SkinNode *skin_nodes, - const MVert *mvert, + const float (*positions)[3], const MVertSkin *nodes, const MeshElemMap *emap, EMat *emat) @@ -630,14 +630,14 @@ static void connection_node_frames(int v, if (e1->origin != v) { negate_v3(mat[0]); } - create_frame(&skin_nodes[v].frames[0], mvert[v].co, rad, mat, avg); + create_frame(&skin_nodes[v].frames[0], positions[v], rad, mat, avg); skin_nodes[v].seam_edges[0] = emap[v].indices[0]; copy_m3_m3(mat, e2->mat); if (e2->origin != v) { negate_v3(mat[0]); } - create_frame(&skin_nodes[v].frames[1], mvert[v].co, rad, mat, avg); + create_frame(&skin_nodes[v].frames[1], positions[v], rad, mat, avg); skin_nodes[v].seam_edges[1] = emap[v].indices[1]; return; @@ -645,11 +645,14 @@ static void connection_node_frames(int v, /* Build regular frame */ node_frames_init(&skin_nodes[v], 1); - create_frame(&skin_nodes[v].frames[0], mvert[v].co, rad, mat, 0); + create_frame(&skin_nodes[v].frames[0], positions[v], rad, mat, 0); } -static SkinNode *build_frames( - const MVert *mvert, int verts_num, const MVertSkin *nodes, const MeshElemMap *emap, EMat *emat) +static SkinNode *build_frames(const float (*positions)[3], + int verts_num, + const MVertSkin *nodes, + const MeshElemMap *emap, + EMat *emat) { SkinNode *skin_nodes; int v; @@ -658,10 +661,10 @@ static SkinNode *build_frames( for (v = 0; v < verts_num; v++) { if (emap[v].count <= 1) { - end_node_frames(v, skin_nodes, mvert, nodes, emap, emat); + end_node_frames(v, skin_nodes, positions, nodes, emap, emat); } else if (emap[v].count == 2) { - connection_node_frames(v, skin_nodes, mvert, nodes, emap, emat); + connection_node_frames(v, skin_nodes, positions, nodes, emap, emat); } else { /* Branch node generates no frames */ @@ -714,7 +717,7 @@ static void build_emats_stack(BLI_Stack *stack, const MeshElemMap *emap, const MEdge *medge, const MVertSkin *vs, - const MVert *mvert) + const float (*positions)[3]) { EdgeStackElem stack_elem; float axis[3], angle; @@ -741,11 +744,11 @@ static void build_emats_stack(BLI_Stack *stack, /* If parent is a branch node, start a new edge chain */ if (parent_is_branch) { - calc_edge_mat(emat[e].mat, mvert[parent_v].co, mvert[v].co); + calc_edge_mat(emat[e].mat, positions[parent_v], positions[v]); } else { /* Build edge matrix guided by parent matrix */ - sub_v3_v3v3(emat[e].mat[0], mvert[v].co, mvert[parent_v].co); + sub_v3_v3v3(emat[e].mat[0], positions[v], positions[parent_v]); normalize_v3(emat[e].mat[0]); angle = angle_normalized_v3v3(stack_elem.mat[0], emat[e].mat[0]); cross_v3_v3v3(axis, stack_elem.mat[0], emat[e].mat[0]); @@ -765,7 +768,7 @@ static void build_emats_stack(BLI_Stack *stack, } static EMat *build_edge_mats(const MVertSkin *vs, - const MVert *mvert, + const float (*positions)[3], const int verts_num, const MEdge *medge, const MeshElemMap *emap, @@ -789,7 +792,7 @@ static EMat *build_edge_mats(const MVertSkin *vs, if (vs[v].flag & MVERT_SKIN_ROOT) { if (emap[v].count >= 1) { const MEdge *e = &medge[emap[v].indices[0]]; - calc_edge_mat(stack_elem.mat, mvert[v].co, mvert[BKE_mesh_edge_other_vert(e, v)].co); + calc_edge_mat(stack_elem.mat, positions[v], positions[BKE_mesh_edge_other_vert(e, v)]); stack_elem.parent_v = v; /* Add adjacent edges to stack */ @@ -809,7 +812,7 @@ static EMat *build_edge_mats(const MVertSkin *vs, } while (!BLI_stack_is_empty(stack)) { - build_emats_stack(stack, visited_e, emat, emap, medge, vs, mvert); + build_emats_stack(stack, visited_e, emat, emap, medge, vs, positions); } MEM_freeN(visited_e); @@ -825,7 +828,7 @@ static EMat *build_edge_mats(const MVertSkin *vs, * nodes, at least two intermediate frames are required. (This avoids * having any special cases for dealing with sharing a frame between * two hulls.) */ -static int calc_edge_subdivisions(const MVert *mvert, +static int calc_edge_subdivisions(const float (*positions)[3], const MVertSkin *nodes, const MEdge *e, const int *degree) @@ -855,7 +858,7 @@ static int calc_edge_subdivisions(const MVert *mvert, if (avg_radius != 0.0f) { /* possible (but unlikely) that we overflow INT_MAX */ float subdivisions_num_fl; - const float edge_len = len_v3v3(mvert[e->v1].co, mvert[e->v2].co); + const float edge_len = len_v3v3(positions[e->v1], positions[e->v2]); subdivisions_num_fl = (edge_len / avg_radius); if (subdivisions_num_fl < NUM_SUBDIVISIONS_MAX) { subdivisions_num = (int)subdivisions_num_fl; @@ -889,7 +892,7 @@ static Mesh *subdivide_base(const Mesh *orig) float radrat; const MVertSkin *orignode = CustomData_get_layer(&orig->vdata, CD_MVERT_SKIN); - const MVert *origvert = BKE_mesh_verts(orig); + const float(*orig_positions)[3] = BKE_mesh_positions(orig); const MEdge *origedge = BKE_mesh_edges(orig); const MDeformVert *origdvert = BKE_mesh_deform_verts(orig); int orig_vert_num = orig->totvert; @@ -905,7 +908,7 @@ static Mesh *subdivide_base(const Mesh *orig) /* Per edge, store how many subdivisions are needed */ int *edge_subd = MEM_calloc_arrayN((uint)orig_edge_num, sizeof(int), "edge_subd"); for (i = 0, subd_num = 0; i < orig_edge_num; i++) { - edge_subd[i] += calc_edge_subdivisions(origvert, orignode, &origedge[i], degree); + edge_subd[i] += calc_edge_subdivisions(orig_positions, orignode, &origedge[i], degree); BLI_assert(edge_subd[i] >= 0); subd_num += edge_subd[i]; } @@ -916,7 +919,7 @@ static Mesh *subdivide_base(const Mesh *orig) Mesh *result = BKE_mesh_new_nomain_from_template( orig, orig_vert_num + subd_num, orig_edge_num + subd_num, 0, 0, 0); - MVert *outvert = BKE_mesh_verts_for_write(result); + float(*out_positions)[3] = BKE_mesh_positions_for_write(result); MEdge *outedge = BKE_mesh_edges_for_write(result); MVertSkin *outnode = CustomData_get_layer(&result->vdata, CD_MVERT_SKIN); MDeformVert *outdvert = NULL; @@ -978,7 +981,7 @@ static Mesh *subdivide_base(const Mesh *orig) float t = powf(r, radrat); /* Interpolate vertex coord */ - interp_v3_v3v3(outvert[v].co, outvert[e->v1].co, outvert[e->v2].co, t); + interp_v3_v3v3(out_positions[v], out_positions[e->v1], out_positions[e->v2], t); /* Interpolate skin radii */ interp_v3_v3v3(outnode[v].radius, orignode[e->v1].radius, orignode[e->v2].radius, t); @@ -1910,7 +1913,6 @@ static Mesh *base_skin(Mesh *origmesh, SkinModifierData *smd, eSkinErrorFlag *r_ SkinNode *skin_nodes; MeshElemMap *emap; int *emapmem; - const MVert *mvert; const MEdge *medge; const MDeformVert *dvert; int verts_num, edges_num; @@ -1918,7 +1920,7 @@ static Mesh *base_skin(Mesh *origmesh, SkinModifierData *smd, eSkinErrorFlag *r_ nodes = CustomData_get_layer(&origmesh->vdata, CD_MVERT_SKIN); - mvert = BKE_mesh_verts(origmesh); + const float(*positions)[3] = BKE_mesh_positions(origmesh); dvert = BKE_mesh_deform_verts(origmesh); medge = BKE_mesh_edges(origmesh); verts_num = origmesh->totvert; @@ -1926,8 +1928,8 @@ static Mesh *base_skin(Mesh *origmesh, SkinModifierData *smd, eSkinErrorFlag *r_ BKE_mesh_vert_edge_map_create(&emap, &emapmem, medge, verts_num, edges_num); - emat = build_edge_mats(nodes, mvert, verts_num, medge, emap, edges_num, &has_valid_root); - skin_nodes = build_frames(mvert, verts_num, nodes, emap, emat); + emat = build_edge_mats(nodes, positions, verts_num, medge, emap, edges_num, &has_valid_root); + skin_nodes = build_frames(positions, verts_num, nodes, emap, emat); MEM_freeN(emat); emat = NULL; diff --git a/source/blender/modifiers/intern/MOD_solidify_extrude.c b/source/blender/modifiers/intern/MOD_solidify_extrude.c index 08e9569bd95..5908a13e93c 100644 --- a/source/blender/modifiers/intern/MOD_solidify_extrude.c +++ b/source/blender/modifiers/intern/MOD_solidify_extrude.c @@ -215,7 +215,7 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex MOD_get_vgroup(ctx->object, mesh, smd->defgrp_name, &dvert, &defgrp_index); - const MVert *orig_mvert = BKE_mesh_verts(mesh); + const float(*orig_positions)[3] = BKE_mesh_positions(mesh); const MEdge *orig_medge = BKE_mesh_edges(mesh); const MPoly *orig_mpoly = BKE_mesh_polys(mesh); const MLoop *orig_mloop = BKE_mesh_loops(mesh); @@ -335,7 +335,7 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex (int)((loops_num * stride) + newLoops), (int)((polys_num * stride) + newPolys)); - MVert *mvert = BKE_mesh_verts_for_write(result); + float(*positions)[3] = BKE_mesh_positions_for_write(result); MEdge *medge = BKE_mesh_edges_for_write(result); MPoly *mpoly = BKE_mesh_polys_for_write(result); MLoop *mloop = BKE_mesh_loops_for_write(result); @@ -398,7 +398,7 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex if (((ofs_new >= ofs_orig) == do_flip) == test) { \ i_end = verts_num; \ do_shell_align = true; \ - mv = mvert; \ + vert_index = 0; \ } \ else { \ if (do_shell) { \ @@ -409,7 +409,7 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex i_end = newVerts; \ do_shell_align = false; \ } \ - mv = &mvert[verts_num]; \ + vert_index = verts_num; \ } \ (void)0 @@ -495,7 +495,7 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex vert_lens = MEM_malloc_arrayN(verts_num, sizeof(float), "vert_lens"); copy_vn_fl(vert_lens, (int)verts_num, FLT_MAX); for (uint i = 0; i < edges_num; i++) { - const float ed_len_sq = len_squared_v3v3(mvert[medge[i].v1].co, mvert[medge[i].v2].co); + const float ed_len_sq = len_squared_v3v3(positions[medge[i].v1], positions[medge[i].v2]); vert_lens[medge[i].v1] = min_ff(vert_lens[medge[i].v1], ed_len_sq); vert_lens[medge[i].v2] = min_ff(vert_lens[medge[i].v2], ed_len_sq); } @@ -547,7 +547,7 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex !ELEM(edge_user_pairs[i][1], INVALID_UNUSED, INVALID_PAIR)) { const float *n0 = poly_nors[edge_user_pairs[i][0]]; const float *n1 = poly_nors[edge_user_pairs[i][1]]; - sub_v3_v3v3(e, orig_mvert[ed->v1].co, orig_mvert[ed->v2].co); + sub_v3_v3v3(e, orig_positions[ed->v1], orig_positions[ed->v2]); normalize_v3(e); const float angle = angle_signed_on_axis_v3v3_v3(n0, n1, e); if (do_angle_clamp) { @@ -571,10 +571,10 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex ofs_new_vgroup = ofs_new; - MVert *mv; + uint vert_index; INIT_VERT_ARRAY_OFFSETS(false); - for (i_orig = 0; i_orig < i_end; i_orig++, mv++) { + for (i_orig = 0; i_orig < i_end; i_orig++, vert_index++) { const uint i = do_shell_align ? i_orig : new_vert_arr[i_orig]; if (dvert) { const MDeformVert *dv = &dvert[i]; @@ -608,10 +608,10 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex } } if (vert_nors) { - madd_v3_v3fl(mv->co, vert_nors[i], ofs_new_vgroup); + madd_v3_v3fl(positions[vert_index], vert_nors[i], ofs_new_vgroup); } else { - madd_v3_v3fl(mv->co, mesh_vert_normals[i], ofs_new_vgroup); + madd_v3_v3fl(positions[vert_index], mesh_vert_normals[i], ofs_new_vgroup); } } } @@ -623,10 +623,10 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex ofs_new_vgroup = ofs_orig; /* as above but swapped */ - MVert *mv; + uint vert_index; INIT_VERT_ARRAY_OFFSETS(true); - for (i_orig = 0; i_orig < i_end; i_orig++, mv++) { + for (i_orig = 0; i_orig < i_end; i_orig++, vert_index++) { const uint i = do_shell_align ? i_orig : new_vert_arr[i_orig]; if (dvert) { const MDeformVert *dv = &dvert[i]; @@ -660,10 +660,10 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex } } if (vert_nors) { - madd_v3_v3fl(mv->co, vert_nors[i], ofs_new_vgroup); + madd_v3_v3fl(positions[vert_index], vert_nors[i], ofs_new_vgroup); } else { - madd_v3_v3fl(mv->co, mesh_vert_normals[i], ofs_new_vgroup); + madd_v3_v3fl(positions[vert_index], mesh_vert_normals[i], ofs_new_vgroup); } } } @@ -713,8 +713,7 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex if (vert_nors == NULL) { vert_nors = MEM_malloc_arrayN(verts_num, sizeof(float[3]), "mod_solid_vno"); - const MVert *mv; - for (i = 0, mv = mvert; i < verts_num; i++, mv++) { + for (i = 0; i < verts_num; i++) { copy_v3_v3(vert_nors[i], mesh_vert_normals[i]); } } @@ -730,12 +729,12 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex const MLoop *ml = &mloop[mp->loopstart]; - sub_v3_v3v3(nor_prev, mvert[ml[i_curr - 1].v].co, mvert[ml[i_curr].v].co); + sub_v3_v3v3(nor_prev, positions[ml[i_curr - 1].v], positions[ml[i_curr].v]); normalize_v3(nor_prev); while (i_next < mp->totloop) { float angle; - sub_v3_v3v3(nor_next, mvert[ml[i_curr].v].co, mvert[ml[i_next].v].co); + sub_v3_v3v3(nor_next, positions[ml[i_curr].v], positions[ml[i_next].v]); normalize_v3(nor_next); angle = angle_normalized_v3v3(nor_prev, nor_next); @@ -847,7 +846,7 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex vert_angs[ed->v2] = max_ff(vert_angs[ed->v2], angle); } if (do_bevel_convex) { - sub_v3_v3v3(e, orig_mvert[ed->v1].co, orig_mvert[ed->v2].co); + sub_v3_v3v3(e, orig_positions[ed->v1], orig_positions[ed->v2]); normalize_v3(e); edge_angs[i] = angle_signed_on_axis_v3v3_v3(n0, n1, e); if (!do_rim) { @@ -867,7 +866,7 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex const float offset_sq = offset * offset; copy_vn_fl(vert_lens_sq, (int)verts_num, FLT_MAX); for (i = 0; i < edges_num; i++) { - const float ed_len = len_squared_v3v3(mvert[medge[i].v1].co, mvert[medge[i].v2].co); + const float ed_len = len_squared_v3v3(positions[medge[i].v1], positions[medge[i].v2]); vert_lens_sq[medge[i].v1] = min_ff(vert_lens_sq[medge[i].v1], ed_len); vert_lens_sq[medge[i].v2] = min_ff(vert_lens_sq[medge[i].v2], ed_len); } @@ -926,14 +925,15 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex uint i_orig, i_end; bool do_shell_align; - MVert *mv; + uint vert_index; INIT_VERT_ARRAY_OFFSETS(false); - for (i_orig = 0; i_orig < i_end; i_orig++, mv++) { + for (i_orig = 0; i_orig < i_end; i_orig++, vert_index++) { const uint i_other = do_shell_align ? i_orig : new_vert_arr[i_orig]; if (vert_accum[i_other]) { /* zero if unselected */ - madd_v3_v3fl( - mv->co, vert_nors[i_other], ofs_new * (vert_angles[i_other] / vert_accum[i_other])); + madd_v3_v3fl(positions[vert_index], + vert_nors[i_other], + ofs_new * (vert_angles[i_other] / vert_accum[i_other])); } } } @@ -943,14 +943,15 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex bool do_shell_align; /* same as above but swapped, intentional use of 'ofs_new' */ - MVert *mv; + uint vert_index; INIT_VERT_ARRAY_OFFSETS(true); - for (i_orig = 0; i_orig < i_end; i_orig++, mv++) { + for (i_orig = 0; i_orig < i_end; i_orig++, vert_index++) { const uint i_other = do_shell_align ? i_orig : new_vert_arr[i_orig]; if (vert_accum[i_other]) { /* zero if unselected */ - madd_v3_v3fl( - mv->co, vert_nors[i_other], ofs_orig * (vert_angles[i_other] / vert_accum[i_other])); + madd_v3_v3fl(positions[vert_index], + vert_nors[i_other], + ofs_orig * (vert_angles[i_other] / vert_accum[i_other])); } } } @@ -1157,10 +1158,10 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex #ifdef SOLIDIFY_SIDE_NORMALS if (do_side_normals) { normal_quad_v3(nor, - mvert[ml[j - 4].v].co, - mvert[ml[j - 3].v].co, - mvert[ml[j - 2].v].co, - mvert[ml[j - 1].v].co); + positions[ml[j - 4].v], + positions[ml[j - 3].v], + positions[ml[j - 2].v], + positions[ml[j - 1].v]); add_v3_v3(edge_vert_nos[ed->v1], nor); add_v3_v3(edge_vert_nos[ed->v2], nor); diff --git a/source/blender/modifiers/intern/MOD_solidify_nonmanifold.c b/source/blender/modifiers/intern/MOD_solidify_nonmanifold.c index 9d0b5c30b5e..9c96de884cb 100644 --- a/source/blender/modifiers/intern/MOD_solidify_nonmanifold.c +++ b/source/blender/modifiers/intern/MOD_solidify_nonmanifold.c @@ -184,7 +184,7 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, const bool do_flat_faces = dvert && (smd->flag & MOD_SOLIDIFY_NONMANIFOLD_FLAT_FACES); - const MVert *orig_mvert = BKE_mesh_verts(mesh); + const float(*orig_positions)[3] = BKE_mesh_positions(mesh); const MEdge *orig_medge = BKE_mesh_edges(mesh); const MPoly *orig_mpoly = BKE_mesh_polys(mesh); const MLoop *orig_mloop = BKE_mesh_loops(mesh); @@ -220,7 +220,7 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, if (len_squared_v3(poly_nors[i]) < 0.5f) { const MEdge *e = orig_medge + orig_mloop[mp->loopstart].e; float edgedir[3]; - sub_v3_v3v3(edgedir, orig_mvert[e->v2].co, orig_mvert[e->v1].co); + sub_v3_v3v3(edgedir, orig_positions[e->v2], orig_positions[e->v1]); if (fabsf(edgedir[2]) < fabsf(edgedir[1])) { poly_nors[i][2] = 1.0f; } @@ -293,9 +293,9 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, verts_num, sizeof(*orig_mvert_co), "orig_mvert_co in solidify"); /* Fill in the original vertex positions. */ for (uint i = 0; i < verts_num; i++) { - orig_mvert_co[i][0] = orig_mvert[i].co[0]; - orig_mvert_co[i][1] = orig_mvert[i].co[1]; - orig_mvert_co[i][2] = orig_mvert[i].co[2]; + orig_mvert_co[i][0] = orig_positions[i][0]; + orig_mvert_co[i][1] = orig_positions[i][1]; + orig_mvert_co[i][2] = orig_positions[i][2]; } /* Create edge to #NewEdgeRef map. */ @@ -1398,9 +1398,8 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, } } - const MVert *mv = orig_mvert; gs_ptr = orig_vert_groups_arr; - for (uint i = 0; i < verts_num; i++, mv++, gs_ptr++) { + for (uint i = 0; i < verts_num; i++, gs_ptr++) { if (*gs_ptr) { EdgeGroup *g = *gs_ptr; for (uint j = 0; g->valid; j++, g++) { @@ -1962,7 +1961,7 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, (int)(new_loops_num), (int)(new_polys_num)); - MVert *mvert = BKE_mesh_verts_for_write(result); + float(*positions)[3] = BKE_mesh_positions_for_write(result); MEdge *medge = BKE_mesh_edges_for_write(result); MPoly *mpoly = BKE_mesh_polys_for_write(result); MLoop *mloop = BKE_mesh_loops_for_write(result); @@ -2005,7 +2004,7 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, for (uint j = 0; g->valid; j++, g++) { if (g->new_vert != MOD_SOLIDIFY_EMPTY_TAG) { CustomData_copy_data(&mesh->vdata, &result->vdata, (int)i, (int)g->new_vert, 1); - copy_v3_v3(mvert[g->new_vert].co, g->co); + copy_v3_v3(positions[g->new_vert], g->co); } } } @@ -2115,8 +2114,7 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, /* Make boundary edges/faces. */ { gs_ptr = orig_vert_groups_arr; - const MVert *mv = orig_mvert; - for (uint i = 0; i < verts_num; i++, gs_ptr++, mv++) { + for (uint i = 0; i < verts_num; i++, gs_ptr++) { EdgeGroup *gs = *gs_ptr; if (gs) { EdgeGroup *g = gs; diff --git a/source/blender/modifiers/intern/MOD_surface.c b/source/blender/modifiers/intern/MOD_surface.c index a34d66f394b..98f2715d5e4 100644 --- a/source/blender/modifiers/intern/MOD_surface.c +++ b/source/blender/modifiers/intern/MOD_surface.c @@ -125,7 +125,6 @@ static void deformVerts(ModifierData *md, if (surmd->mesh) { uint mesh_verts_num = 0, i = 0; int init = 0; - MVert *x, *v; BKE_mesh_vert_coords_apply(surmd->mesh, vertexCos); @@ -142,8 +141,8 @@ static void deformVerts(ModifierData *md, surmd->v = NULL; } - surmd->x = MEM_calloc_arrayN(mesh_verts_num, sizeof(MVert), "MVert"); - surmd->v = MEM_calloc_arrayN(mesh_verts_num, sizeof(MVert), "MVert"); + surmd->x = MEM_calloc_arrayN(mesh_verts_num, sizeof(float[3]), __func__); + surmd->v = MEM_calloc_arrayN(mesh_verts_num, sizeof(float[3]), __func__); surmd->verts_num = mesh_verts_num; @@ -151,19 +150,19 @@ static void deformVerts(ModifierData *md, } /* convert to global coordinates and calculate velocity */ - MVert *verts = BKE_mesh_verts_for_write(surmd->mesh); - for (i = 0, x = surmd->x, v = surmd->v; i < mesh_verts_num; i++, x++, v++) { - float *vec = verts[i].co; + float(*positions)[3] = BKE_mesh_positions_for_write(surmd->mesh); + for (i = 0; i < mesh_verts_num; i++) { + float *vec = positions[i]; mul_m4_v3(ctx->object->object_to_world, vec); if (init) { - v->co[0] = v->co[1] = v->co[2] = 0.0f; + surmd->v[i][0] = surmd->v[i][1] = surmd->v[i][2] = 0.0f; } else { - sub_v3_v3v3(v->co, vec, x->co); + sub_v3_v3v3(surmd->v[i], vec, surmd->x[i]); } - copy_v3_v3(x->co, vec); + copy_v3_v3(surmd->x[i], vec); } surmd->cfra = cfra; diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c index 6a9321a78a2..7dd84375519 100644 --- a/source/blender/modifiers/intern/MOD_surfacedeform.c +++ b/source/blender/modifiers/intern/MOD_surfacedeform.c @@ -1169,7 +1169,7 @@ static bool surfacedeformBind(Object *ob, Mesh *mesh) { BVHTreeFromMesh treeData = {NULL}; - const MVert *mvert = BKE_mesh_verts(target); + const float(*positions)[3] = BKE_mesh_positions(target); const MPoly *mpoly = BKE_mesh_polys(target); const MEdge *medge = BKE_mesh_edges(target); const MLoop *mloop = BKE_mesh_loops(target); @@ -1268,7 +1268,7 @@ static bool surfacedeformBind(Object *ob, invert_m4_m4(data.imat, smd_orig->mat); for (int i = 0; i < target_verts_num; i++) { - mul_v3_m4v3(data.targetCos[i], smd_orig->mat, mvert[i].co); + mul_v3_m4v3(data.targetCos[i], smd_orig->mat, positions[i]); } TaskParallelSettings settings; diff --git a/source/blender/modifiers/intern/MOD_util.cc b/source/blender/modifiers/intern/MOD_util.cc index a94fc6732a0..b72bd32b54e 100644 --- a/source/blender/modifiers/intern/MOD_util.cc +++ b/source/blender/modifiers/intern/MOD_util.cc @@ -131,17 +131,17 @@ void MOD_get_texture_coords(MappingInfoModifierData *dmd, texmapping = MOD_DISP_MAP_LOCAL; } - const MVert *mv = BKE_mesh_verts(mesh); - for (i = 0; i < verts_num; i++, mv++, r_texco++) { + const float(*positions)[3] = BKE_mesh_positions(mesh); + for (i = 0; i < verts_num; i++, r_texco++) { switch (texmapping) { case MOD_DISP_MAP_LOCAL: - copy_v3_v3(*r_texco, cos != nullptr ? *cos : mv->co); + copy_v3_v3(*r_texco, cos != nullptr ? *cos : positions[i]); break; case MOD_DISP_MAP_GLOBAL: - mul_v3_m4v3(*r_texco, ob->object_to_world, cos != nullptr ? *cos : mv->co); + mul_v3_m4v3(*r_texco, ob->object_to_world, cos != nullptr ? *cos : positions[i]); break; case MOD_DISP_MAP_OBJECT: - mul_v3_m4v3(*r_texco, ob->object_to_world, cos != nullptr ? *cos : mv->co); + mul_v3_m4v3(*r_texco, ob->object_to_world, cos != nullptr ? *cos : positions[i]); mul_m4_v3(mapref_imat, *r_texco); break; } diff --git a/source/blender/modifiers/intern/MOD_weighted_normal.cc b/source/blender/modifiers/intern/MOD_weighted_normal.cc index 1ebd5423d39..d9beb83b327 100644 --- a/source/blender/modifiers/intern/MOD_weighted_normal.cc +++ b/source/blender/modifiers/intern/MOD_weighted_normal.cc @@ -71,7 +71,7 @@ struct WeightedNormalData { int loops_num; int polys_num; - const MVert *mvert; + const float (*positions)[3]; const float (*vert_normals)[3]; MEdge *medge; @@ -186,7 +186,7 @@ static void apply_weights_vertex_normal(WeightedNormalModifierData *wnmd, const int loops_num = wn_data->loops_num; const int polys_num = wn_data->polys_num; - const MVert *mvert = wn_data->mvert; + const float(*positions)[3] = wn_data->positions; MEdge *medge = wn_data->medge; const MLoop *mloop = wn_data->mloop; @@ -222,7 +222,7 @@ static void apply_weights_vertex_normal(WeightedNormalModifierData *wnmd, * we do not actually care about computed loop_normals for now... */ loop_normals = static_cast<float(*)[3]>( MEM_calloc_arrayN(size_t(loops_num), sizeof(*loop_normals), __func__)); - BKE_mesh_normals_loop_split(mvert, + BKE_mesh_normals_loop_split(positions, wn_data->vert_normals, verts_num, medge, @@ -356,7 +356,7 @@ static void apply_weights_vertex_normal(WeightedNormalModifierData *wnmd, } } - BKE_mesh_normals_loop_custom_set(mvert, + BKE_mesh_normals_loop_custom_set(positions, wn_data->vert_normals, verts_num, medge, @@ -387,7 +387,7 @@ static void apply_weights_vertex_normal(WeightedNormalModifierData *wnmd, copy_v3_v3(vert_normals[mv_index], items_data[mv_index].normal); } - BKE_mesh_normals_loop_custom_from_verts_set(mvert, + BKE_mesh_normals_loop_custom_from_verts_set(positions, wn_data->vert_normals, vert_normals, verts_num, @@ -406,7 +406,7 @@ static void apply_weights_vertex_normal(WeightedNormalModifierData *wnmd, loop_normals = static_cast<float(*)[3]>( MEM_calloc_arrayN(size_t(loops_num), sizeof(*loop_normals), __func__)); - BKE_mesh_normals_loop_split(mvert, + BKE_mesh_normals_loop_split(positions, wn_data->vert_normals, verts_num, medge, @@ -430,7 +430,7 @@ static void apply_weights_vertex_normal(WeightedNormalModifierData *wnmd, } } - BKE_mesh_normals_loop_custom_set(mvert, + BKE_mesh_normals_loop_custom_set(positions, wn_data->vert_normals, verts_num, medge, @@ -455,7 +455,7 @@ static void wn_face_area(WeightedNormalModifierData *wnmd, WeightedNormalData *w { const int polys_num = wn_data->polys_num; - const MVert *mvert = wn_data->mvert; + const float(*positions)[3] = wn_data->positions; const MLoop *mloop = wn_data->mloop; const MPoly *mpoly = wn_data->mpoly; @@ -467,7 +467,7 @@ static void wn_face_area(WeightedNormalModifierData *wnmd, WeightedNormalData *w ModePair *f_area = face_area; for (mp_index = 0, mp = mpoly; mp_index < polys_num; mp_index++, mp++, f_area++) { - f_area->val = BKE_mesh_calc_poly_area(mp, &mloop[mp->loopstart], mvert); + f_area->val = BKE_mesh_calc_poly_area(mp, &mloop[mp->loopstart], positions); f_area->index = mp_index; } @@ -482,7 +482,7 @@ static void wn_corner_angle(WeightedNormalModifierData *wnmd, WeightedNormalData const int loops_num = wn_data->loops_num; const int polys_num = wn_data->polys_num; - const MVert *mvert = wn_data->mvert; + const float(*positions)[3] = wn_data->positions; const MLoop *mloop = wn_data->mloop; const MPoly *mpoly = wn_data->mpoly; @@ -500,7 +500,7 @@ static void wn_corner_angle(WeightedNormalModifierData *wnmd, WeightedNormalData float *index_angle = static_cast<float *>( MEM_malloc_arrayN(size_t(mp->totloop), sizeof(*index_angle), __func__)); - BKE_mesh_calc_poly_angles(mp, ml_start, mvert, index_angle); + BKE_mesh_calc_poly_angles(mp, ml_start, positions, index_angle); ModePair *c_angl = &corner_angle[mp->loopstart]; float *angl = index_angle; @@ -526,7 +526,7 @@ static void wn_face_with_angle(WeightedNormalModifierData *wnmd, WeightedNormalD const int loops_num = wn_data->loops_num; const int polys_num = wn_data->polys_num; - const MVert *mvert = wn_data->mvert; + const float(*positions)[3] = wn_data->positions; const MLoop *mloop = wn_data->mloop; const MPoly *mpoly = wn_data->mpoly; @@ -542,10 +542,10 @@ static void wn_face_with_angle(WeightedNormalModifierData *wnmd, WeightedNormalD for (mp_index = 0, mp = mpoly; mp_index < polys_num; mp_index++, mp++) { const MLoop *ml_start = &mloop[mp->loopstart]; - float face_area = BKE_mesh_calc_poly_area(mp, ml_start, mvert); + float face_area = BKE_mesh_calc_poly_area(mp, ml_start, positions); float *index_angle = static_cast<float *>( MEM_malloc_arrayN(size_t(mp->totloop), sizeof(*index_angle), __func__)); - BKE_mesh_calc_poly_angles(mp, ml_start, mvert, index_angle); + BKE_mesh_calc_poly_angles(mp, ml_start, positions, index_angle); ModePair *cmbnd = &combined[mp->loopstart]; float *angl = index_angle; @@ -595,7 +595,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * const int edges_num = result->totedge; const int loops_num = result->totloop; const int polys_num = result->totpoly; - const MVert *mvert = BKE_mesh_verts(result); + const float(*positions)[3] = BKE_mesh_positions(result); MEdge *medge = BKE_mesh_edges_for_write(result); const MPoly *mpoly = BKE_mesh_polys(result); const MLoop *mloop = BKE_mesh_loops(result); @@ -639,7 +639,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * wn_data.loops_num = loops_num; wn_data.polys_num = polys_num; - wn_data.mvert = mvert; + wn_data.positions = positions; wn_data.vert_normals = BKE_mesh_vertex_normals_ensure(result); wn_data.medge = medge; diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index 3302384568b..b15b9cf75f1 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -140,7 +140,7 @@ void weightvg_do_mask(const ModifierEvalContext *ctx, /* Use new generic get_texture_coords, but do not modify our DNA struct for it... * XXX Why use a ModifierData stuff here ? Why not a simple, generic struct for parameters? * What e.g. if a modifier wants to use several textures? - * Why use only v_co, and not MVert (or both)? + * Why use only v_co, and not mesh positions (or both)? */ t_map.texture = texture; t_map.map_object = tex_map_object; |