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:
@@ -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;
|
||||||
|
Reference in New Issue
Block a user