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/blenkernel/intern/object_dupli.cc')
-rw-r--r--source/blender/blenkernel/intern/object_dupli.cc34
1 files changed, 22 insertions, 12 deletions
diff --git a/source/blender/blenkernel/intern/object_dupli.cc b/source/blender/blenkernel/intern/object_dupli.cc
index 5efd44c620b..e69849cdbff 100644
--- a/source/blender/blenkernel/intern/object_dupli.cc
+++ b/source/blender/blenkernel/intern/object_dupli.cc
@@ -515,7 +515,7 @@ struct VertexDupliData_Mesh {
VertexDupliData_Params params;
int totvert;
- const MVert *mvert;
+ Span<float3> positions;
const float (*vert_normals)[3];
const float (*orco)[3];
@@ -606,7 +606,6 @@ static void make_child_duplis_verts_from_mesh(const DupliContext *ctx,
VertexDupliData_Mesh *vdd = (VertexDupliData_Mesh *)userdata;
const bool use_rotation = vdd->params.use_rotation;
- const MVert *mvert = vdd->mvert;
const int totvert = vdd->totvert;
invert_m4_m4(inst_ob->world_to_object, inst_ob->object_to_world);
@@ -615,8 +614,13 @@ static void make_child_duplis_verts_from_mesh(const DupliContext *ctx,
mul_m4_m4m4(child_imat, inst_ob->world_to_object, ctx->object->object_to_world);
for (int i = 0; i < totvert; i++) {
- DupliObject *dob = vertex_dupli(
- vdd->params.ctx, inst_ob, child_imat, i, mvert[i].co, vdd->vert_normals[i], use_rotation);
+ DupliObject *dob = vertex_dupli(vdd->params.ctx,
+ inst_ob,
+ child_imat,
+ i,
+ vdd->positions[i],
+ vdd->vert_normals[i],
+ use_rotation);
if (vdd->orco) {
copy_v3_v3(dob->orco, vdd->orco[i]);
}
@@ -692,7 +696,7 @@ static void make_duplis_verts(const DupliContext *ctx)
VertexDupliData_Mesh vdd{};
vdd.params = vdd_params;
vdd.totvert = me_eval->totvert;
- vdd.mvert = me_eval->verts().data();
+ vdd.positions = me_eval->positions();
vdd.vert_normals = BKE_mesh_vertex_normals_ensure(me_eval);
vdd.orco = (const float(*)[3])CustomData_get_layer(&me_eval->vdata, CD_ORCO);
@@ -1018,7 +1022,7 @@ struct FaceDupliData_Mesh {
int totface;
const MPoly *mpoly;
const MLoop *mloop;
- const MVert *mvert;
+ Span<float3> positions;
const float (*orco)[3];
const MLoopUV *mloopuv;
};
@@ -1117,14 +1121,14 @@ static DupliObject *face_dupli_from_mesh(const DupliContext *ctx,
/* Mesh variables. */
const MPoly *mpoly,
const MLoop *mloopstart,
- const MVert *mvert)
+ const Span<float3> positions)
{
const int coords_len = mpoly->totloop;
Array<float3, 64> coords(coords_len);
const MLoop *ml = mloopstart;
for (int i = 0; i < coords_len; i++, ml++) {
- coords[i] = float3(mvert[ml->v].co);
+ coords[i] = positions[ml->v];
}
return face_dupli(ctx, inst_ob, child_imat, index, use_scale, scale_fac, coords);
@@ -1168,7 +1172,6 @@ static void make_child_duplis_faces_from_mesh(const DupliContext *ctx,
FaceDupliData_Mesh *fdd = (FaceDupliData_Mesh *)userdata;
const MPoly *mpoly = fdd->mpoly, *mp;
const MLoop *mloop = fdd->mloop;
- const MVert *mvert = fdd->mvert;
const float(*orco)[3] = fdd->orco;
const MLoopUV *mloopuv = fdd->mloopuv;
const int totface = fdd->totface;
@@ -1184,8 +1187,15 @@ static void make_child_duplis_faces_from_mesh(const DupliContext *ctx,
for (a = 0, mp = mpoly; a < totface; a++, mp++) {
const MLoop *loopstart = mloop + mp->loopstart;
- DupliObject *dob = face_dupli_from_mesh(
- fdd->params.ctx, inst_ob, child_imat, a, use_scale, scale_fac, mp, loopstart, mvert);
+ DupliObject *dob = face_dupli_from_mesh(fdd->params.ctx,
+ inst_ob,
+ child_imat,
+ a,
+ use_scale,
+ scale_fac,
+ mp,
+ loopstart,
+ fdd->positions);
const float w = 1.0f / float(mp->totloop);
if (orco) {
@@ -1274,7 +1284,7 @@ static void make_duplis_faces(const DupliContext *ctx)
fdd.totface = me_eval->totpoly;
fdd.mpoly = me_eval->polys().data();
fdd.mloop = me_eval->loops().data();
- fdd.mvert = me_eval->verts().data();
+ fdd.positions = me_eval->positions();
fdd.mloopuv = (uv_idx != -1) ? (const MLoopUV *)CustomData_get_layer_n(
&me_eval->ldata, CD_MLOOPUV, uv_idx) :
nullptr;