Fix T54992: Lattice modifier on another Lattice object does not take the

Influence vertexgroup into account
This commit is contained in:
Philipp Oeser 2018-05-08 11:05:42 +02:00
parent 34c474e695
commit 69f2305415
Notes: blender-bot 2023-02-14 05:53:42 +01:00
Referenced by issue #54992, “Lattice-modifier” on another “Lattice-object” does not take the vertex group into account.
1 changed files with 24 additions and 31 deletions

View File

@ -859,47 +859,40 @@ void lattice_deform_verts(Object *laOb, Object *target, DerivedMesh *dm,
float (*vertexCos)[3], int numVerts, const char *vgroup, float fac)
{
LatticeDeformData *lattice_deform_data;
MDeformVert *dvert = NULL;
int defgrp_index = -1;
int a;
bool use_vgroups;
if (laOb->type != OB_LATTICE)
return;
lattice_deform_data = init_latt_deform(laOb, target);
/* check whether to use vertex groups (only possible if target is a Mesh)
* we want either a Mesh with no derived data, or derived data with
* deformverts
/* Check whether to use vertex groups (only possible if target is a Mesh or Lattice).
* We want either a Mesh/Lattice with no derived data, or derived data with deformverts.
*/
if (target && target->type == OB_MESH) {
/* if there's derived data without deformverts, don't use vgroups */
if (dm) {
use_vgroups = (dm->getVertDataArray(dm, CD_MDEFORMVERT) != NULL);
}
else {
Mesh *me = target->data;
use_vgroups = (me->dvert != NULL);
if (vgroup && vgroup[0] && target && ELEM(target->type, OB_MESH, OB_LATTICE)) {
defgrp_index = defgroup_name_index(target, vgroup);
if (defgrp_index != -1) {
/* if there's derived data without deformverts, don't use vgroups */
if (dm) {
dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
}
else if (target->type == OB_LATTICE) {
dvert = ((Lattice *)target->data)->dvert;
}
else {
dvert = ((Mesh *)target->data)->dvert;
}
}
}
else {
use_vgroups = false;
}
if (vgroup && vgroup[0] && use_vgroups) {
Mesh *me = target->data;
const int defgrp_index = defgroup_name_index(target, vgroup);
float weight;
if (defgrp_index >= 0 && (me->dvert || dm)) {
MDeformVert *dvert = me->dvert;
for (a = 0; a < numVerts; a++, dvert++) {
if (dm) dvert = dm->getVertData(dm, a, CD_MDEFORMVERT);
weight = defvert_find_weight(dvert, defgrp_index);
if (weight > 0.0f)
calc_latt_deform(lattice_deform_data, vertexCos[a], weight * fac);
if (dvert) {
MDeformVert *dvert_iter;
for (a = 0, dvert_iter = dvert; a < numVerts; a++, dvert_iter++) {
const float weight = defvert_find_weight(dvert_iter, defgrp_index);
if (weight > 0.0f) {
calc_latt_deform(lattice_deform_data, vertexCos[a], weight * fac);
}
}
}