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:
authorCampbell Barton <ideasman42@gmail.com>2013-06-03 07:47:41 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-06-03 07:47:41 +0400
commitf658124ca58169905820032f0845e9852ab25fe5 (patch)
tree3a07418428a79abd6250195dab4b88ffe93bbf93 /source/blender/editors/physics
parent2a195b78257efdbe4901ec2bdc9fc457b6a28934 (diff)
fix [#35477] Clicking "Connect Hair" button translates a mesh by it's object location.
Diffstat (limited to 'source/blender/editors/physics')
-rw-r--r--source/blender/editors/physics/particle_object.c33
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