void lattice_deform_verts(Object *laOb, Object *target, DerivedMesh *dm, float (*vertexCos)[3], int numVerts, const char *vgroup, float fac) { LatticeDeformData *lattice_deform_data; int a; int 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 */ 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); } } 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); } } } else { for (a = 0; a < numVerts; a++) { calc_latt_deform(lattice_deform_data, vertexCos[a], fac); } } end_latt_deform(lattice_deform_data); }
void lattice_deform_verts(Object *laOb, Object *target, DerivedMesh *dm, float (*vertexCos)[3], int numVerts, char *vgroup) { int a; int use_vgroups; if(laOb->type != OB_LATTICE) return; 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 */ if(target && target->type==OB_MESH) { /* if there's derived data without deformverts, don't use vgroups */ if(dm && !dm->getVertData(dm, 0, CD_MDEFORMVERT)) use_vgroups = 0; else use_vgroups = 1; } else use_vgroups = 0; if(vgroup && vgroup[0] && use_vgroups) { Mesh *me = target->data; int index = defgroup_name_index(target, vgroup); float weight; if(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, index); if(weight > 0.0f) calc_latt_deform(laOb, vertexCos[a], weight); } } } else { for(a = 0; a < numVerts; a++) { calc_latt_deform(laOb, vertexCos[a], 1.0f); } } end_latt_deform(laOb); }