Fix #30531: mirror modifier with vertex groups did not add both the left and

right groups to merged vertices, only one. This made the result asymmetric,
now merged vertices will be part of both groups with half weight.
This commit is contained in:
Brecht Van Lommel
2012-03-19 21:09:16 +00:00
parent 82979d5ab5
commit f18dab65ad
3 changed files with 30 additions and 2 deletions

View File

@@ -64,6 +64,7 @@ void defvert_sync_mapped(struct MDeformVert *dvert_dst, const struct MDeformVert
const int *flip_map, const int flip_map_len, const int use_verify);
void defvert_remap (struct MDeformVert *dvert, int *map, const int map_len);
void defvert_flip(struct MDeformVert *dvert, const int *flip_map, const int flip_map_len);
void defvert_flip_merged(struct MDeformVert *dvert, const int *flip_map, const int flip_map_len);
void defvert_normalize(struct MDeformVert *dvert);
void defvert_normalize_lock(struct MDeformVert *dvert, const int def_nr_lock);

View File

@@ -260,6 +260,29 @@ void defvert_flip(MDeformVert *dvert, const int *flip_map, const int flip_map_le
}
}
void defvert_flip_merged(MDeformVert *dvert, const int *flip_map, const int flip_map_len)
{
MDeformWeight *dw, *copydw;
float weight;
int i, totweight = dvert->totweight;
/* copy weights */
for (dw= dvert->dw, i=0; i<totweight; dw++, i++) {
if (dw->def_nr < flip_map_len) {
if (flip_map[dw->def_nr] >= 0) {
copydw= defvert_verify_index(dvert, flip_map[dw->def_nr]);
dw= &dvert->dw[i]; /* in case array got realloced */
/* distribute weights: if only one of the vertex groups was
assigned this will halve the weights, otherwise it gets
evened out. this keeps it proportional to other groups */
weight = 0.5f*(copydw->weight + dw->weight);
copydw->weight= weight;
dw->weight= weight;
}
}
}
}
bDeformGroup *defgroup_find_name(Object *ob, const char *name)
{

View File

@@ -272,7 +272,11 @@ static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
flip_map= defgroup_flip_map(ob, &flip_map_len, FALSE);
if (flip_map) {
for (i = maxVerts; i-- > 0; dvert++) {
for (i = 0; i < maxVerts; dvert++, i++) {
/* merged vertices get both groups, others get flipped */
if(do_vtargetmap && (vtargetmap[i] != -1))
defvert_flip_merged(dvert, flip_map, flip_map_len);
else
defvert_flip(dvert, flip_map, flip_map_len);
}