diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-06-03 07:47:41 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-06-03 07:47:41 +0400 |
commit | f658124ca58169905820032f0845e9852ab25fe5 (patch) | |
tree | 3a07418428a79abd6250195dab4b88ffe93bbf93 /source/blender | |
parent | 2a195b78257efdbe4901ec2bdc9fc457b6a28934 (diff) |
fix [#35477] Clicking "Connect Hair" button translates a mesh by it's object location.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/physics/particle_object.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c index ed7f9a4c1f2..61392341ce3 100644 --- a/source/blender/editors/physics/particle_object.c +++ b/source/blender/editors/physics/particle_object.c @@ -633,7 +633,8 @@ static int connect_hair(Scene *scene, Object *ob, ParticleSystem *psys) HairKey *key; BVHTreeFromMesh bvhtree= {NULL}; BVHTreeNearest nearest; - MFace *mface; + MFace *mface, *mf; + MVert *mvert; DerivedMesh *dm = NULL; int numverts; int i, k; @@ -646,21 +647,27 @@ static int connect_hair(Scene *scene, Object *ob, ParticleSystem *psys) edit= psys->edit; point= edit ? edit->points : NULL; - if (psmd->dm->deformedOnly) + if (psmd->dm->deformedOnly) { /* we don't want to mess up psmd->dm when converting to global coordinates below */ - dm= CDDM_copy(psmd->dm); - else - dm= mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH); + dm = psmd->dm; + } + else { + dm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH); + } + /* don't modify the original vertices */ + dm = CDDM_copy(dm); /* BMESH_ONLY, deform dm may not have tessface */ DM_ensure_tessface(dm); - numverts = dm->getNumVerts(dm); + mvert = dm->getVertArray(dm); + mface = dm->getTessFaceArray(dm); + /* convert to global coordinates */ for (i=0; i<numverts; i++) - mul_m4_v3(ob->obmat, CDDM_get_vert(dm, i)->co); + mul_m4_v3(ob->obmat, mvert[i].co); bvhtree_from_mesh_faces(&bvhtree, dm, 0.0, 2, 6); @@ -678,13 +685,13 @@ static int connect_hair(Scene *scene, Object *ob, ParticleSystem *psys) continue; } - mface = CDDM_get_tessface(dm, nearest.index); + mf = &mface[nearest.index]; - copy_v3_v3(v[0], CDDM_get_vert(dm, mface->v1)->co); - copy_v3_v3(v[1], CDDM_get_vert(dm, mface->v2)->co); - copy_v3_v3(v[2], CDDM_get_vert(dm, mface->v3)->co); - if (mface->v4) { - copy_v3_v3(v[3], CDDM_get_vert(dm, mface->v4)->co); + copy_v3_v3(v[0], mvert[mf->v1].co); + copy_v3_v3(v[1], mvert[mf->v2].co); + copy_v3_v3(v[2], mvert[mf->v3].co); + if (mf->v4) { + copy_v3_v3(v[3], mvert[mf->v4].co); interp_weights_poly_v3(pa->fuv, v, 4, nearest.co); } else |