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:
authorBen Batt <benbatt@gmail.com>2007-05-04 20:36:39 +0400
committerBen Batt <benbatt@gmail.com>2007-05-04 20:36:39 +0400
commitde2fc6d687df727318bfe3102f2eb5a61e592d4a (patch)
treeb701268335c761b99947b5d8701f8ac8e75f610d /source/blender/blenkernel
parent6bd765e1253177b04daf5c5114f9d2578473b252 (diff)
Fix for bug #6629 - modifiers and vertex-parenting
I have changed the vertex parenting code to use the derivedFinal mesh rather than derivedDeform; this gives the result after all modifiers have been applied, rather than the result up to the first non-deforming modifier as it did before. Since the derivedFinal mesh can have more than one vertex corresponding to a single vertex in the base mesh, the average of all such vertices is used.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/intern/object.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index e93be045dac..767d2d8537c 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1332,15 +1332,26 @@ static void give_parvert(Object *par, int nr, float *vec)
}
}
else {
- /* maybe this is against the derivedmesh philosphy, but where_is_object is called
- by code that is called by build_mesh... (when ob->sf!=0.0) so it can cycle eternally */
- DerivedMesh *dm = par->derivedDeform; //mesh_get_derived_deform(par, &needsFree);
+ DerivedMesh *dm = par->derivedFinal;
if(dm) {
- int tot= dm->getNumVerts(dm);
- if(tot) {
- if(nr >= tot) nr= 0;
- dm->getVertCo(dm, nr, vec);
+ int i, count = 0, numVerts = dm->getNumVerts(dm);
+ int *index = (int *)dm->getVertDataArray(dm, CD_ORIGINDEX);
+ float co[3];
+
+ /* get the average of all verts with (original index == nr) */
+ for(i = 0; i < numVerts; ++i, ++index) {
+ if(*index == nr) {
+ dm->getVertCo(dm, i, co);
+ VecAddf(vec, vec, co);
+ count++;
+ }
+ }
+
+ if(count > 0) {
+ VecMulf(vec, 1.0f / count);
+ } else {
+ dm->getVertCo(dm, 0, vec);
}
}
}