Fix #23071: making vertex parent not correct with subsurf modifier, now it

also uses the final derivedmesh for the coordinates in edit mode.
This commit is contained in:
Brecht Van Lommel
2010-07-28 16:47:12 +00:00
parent 2c8d7921bc
commit c8b6533dda

View File

@@ -1837,47 +1837,38 @@ static void give_parvert(Object *par, int nr, float *vec)
if(par->type==OB_MESH) { if(par->type==OB_MESH) {
Mesh *me= par->data; Mesh *me= par->data;
DerivedMesh *dm;
em = BKE_mesh_get_editmesh(me); em = BKE_mesh_get_editmesh(me);
dm = (em)? em->derivedFinal: par->derivedFinal;
if(em) {
EditVert *eve;
for(eve= em->verts.first; eve; eve= eve->next) { if(dm) {
if(eve->keyindex==nr) { MVert *mvert= dm->getVertArray(dm);
memcpy(vec, eve->co, sizeof(float)*3); int *index = (int *)dm->getVertDataArray(dm, CD_ORIGINDEX);
break; int i, count = 0, vindex, numVerts = dm->getNumVerts(dm);
/* get the average of all verts with (original index == nr) */
for(i = 0; i < numVerts; i++) {
vindex= (index)? index[i]: i;
if(vindex == nr) {
add_v3_v3(vec, mvert[i].co);
count++;
} }
} }
if (count==0) {
/* keep as 0,0,0 */
} else if(count > 0) {
mul_v3_fl(vec, 1.0f / count);
} else {
/* use first index if its out of range */
dm->getVertCo(dm, 0, vec);
}
}
if(em)
BKE_mesh_end_editmesh(me, em); BKE_mesh_end_editmesh(me, em);
}
else {
DerivedMesh *dm = par->derivedFinal;
if(dm) {
MVert *mvert= dm->getVertArray(dm);
int *index = (int *)dm->getVertDataArray(dm, CD_ORIGINDEX);
int i, count = 0, vindex, numVerts = dm->getNumVerts(dm);
/* get the average of all verts with (original index == nr) */
for(i = 0; i < numVerts; i++) {
vindex= (index)? index[i]: i;
if(vindex == nr) {
add_v3_v3(vec, mvert[i].co);
count++;
}
}
if (count==0) {
/* keep as 0,0,0 */
} else if(count > 0) {
mul_v3_fl(vec, 1.0f / count);
} else {
/* use first index if its out of range */
dm->getVertCo(dm, 0, vec);
}
}
}
} }
else if (ELEM(par->type, OB_CURVE, OB_SURF)) { else if (ELEM(par->type, OB_CURVE, OB_SURF)) {
Nurb *nu; Nurb *nu;