Added a VGroup input to the Armature modifier. This allows the user to specify

a vertex group which will modulate the influence of all bones in the armature.

This commit also tidies up the height of the modifier panels; they should all
have the same size margin now.
This commit is contained in:
Ben Batt 2006-08-28 21:56:58 +00:00
parent dd8c56e077
commit 12a732fc20
6 changed files with 45 additions and 24 deletions

@ -59,7 +59,8 @@ void lattice_deform_verts(struct Object *laOb, struct Object *target,
int numVerts, char *vgroup); int numVerts, char *vgroup);
void armature_deform_verts(struct Object *armOb, struct Object *target, void armature_deform_verts(struct Object *armOb, struct Object *target,
struct DerivedMesh *dm, float (*vertexCos)[3], struct DerivedMesh *dm, float (*vertexCos)[3],
int numVerts, int deformflag); int numVerts, int deformflag,
const char *defgrp_name);
float (*lattice_getVertexCos(struct Object *ob, int *numVerts_r))[3]; float (*lattice_getVertexCos(struct Object *ob, int *numVerts_r))[3];
void lattice_applyVertexCos(struct Object *ob, float (*vertexCos)[3]); void lattice_applyVertexCos(struct Object *ob, float (*vertexCos)[3]);
void lattice_calc_modifiers(struct Object *ob); void lattice_calc_modifiers(struct Object *ob);

@ -663,7 +663,8 @@ static void pchan_bone_deform(bPoseChannel *pchan, float weight, float *vec, flo
} }
void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm, void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
float (*vertexCos)[3], int numVerts, int deformflag) float (*vertexCos)[3], int numVerts, int deformflag,
const char *defgrp_name)
{ {
bPoseChannel *pchan, **defnrToPC = NULL; bPoseChannel *pchan, **defnrToPC = NULL;
MDeformVert *dverts = NULL; MDeformVert *dverts = NULL;
@ -672,6 +673,8 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
int numGroups = 0; /* safety for vertexgroup index overflow too */ int numGroups = 0; /* safety for vertexgroup index overflow too */
int i; int i;
int use_dverts = 0; int use_dverts = 0;
int armature_def_nr = -1;
bDeformGroup *dg;
if(armOb == G.obedit) return; if(armOb == G.obedit) return;
@ -690,11 +693,14 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
pchan_b_bone_defmats(pchan); pchan_b_bone_defmats(pchan);
} }
/* get the def_nr for the overall armature vertex group if present */
for(i = 0, dg = target->defbase.first; dg; i++, dg = dg->next)
if(defgrp_name && strcmp(defgrp_name, dg->name) == 0)
armature_def_nr = i;
/* get a vertex-deform-index to posechannel array */ /* get a vertex-deform-index to posechannel array */
if(deformflag & ARM_DEF_VGROUP) { if(deformflag & ARM_DEF_VGROUP) {
if(target->type == OB_MESH){ if(target->type == OB_MESH){
bDeformGroup *dg;
numGroups = BLI_countlist(&target->defbase); numGroups = BLI_countlist(&target->defbase);
dverts = ((Mesh*)target->data)->dvert; dverts = ((Mesh*)target->data)->dvert;
@ -727,19 +733,33 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
float vec[3]; float vec[3];
float contrib = 0.0; float contrib = 0.0;
int j; int j;
float armature_weight = 1; /* default to 1 if no overall def group */
vec[0] = vec[1] = vec[2] = 0; vec[0] = vec[1] = vec[2] = 0;
/* Apply the object's matrix */ /* Apply the object's matrix */
Mat4MulVecfl(premat, co); Mat4MulVecfl(premat, co);
if(use_dverts) { if(use_dverts || armature_def_nr >= 0) {
if(dm) dvert = dm->getVertData(dm, i, LAYERTYPE_MDEFORMVERT); if(dm) dvert = dm->getVertData(dm, i, LAYERTYPE_MDEFORMVERT);
else if(i < ((Mesh*)target->data)->totvert) dvert = dverts + i; else if(i < ((Mesh*)target->data)->totvert) dvert = dverts + i;
} else } else
dvert = NULL; dvert = NULL;
if(dvert && dvert->totweight) { // use weight groups ? if(armature_def_nr >= 0 && dvert) {
armature_weight = 0; /* a def group was given, so default to 0 */
for(j = 0; j < dvert->totweight; j++) {
if(dvert->dw[j].def_nr == armature_def_nr) {
armature_weight = dvert->dw[j].weight;
break;
}
}
}
/* check if there's any point in calculating for this vert */
if(armature_weight == 0) continue;
if(use_dverts && dvert && dvert->totweight) { // use weight groups ?
int deformed = 0; int deformed = 0;
for(j = 0; j < dvert->totweight; j++){ for(j = 0; j < dvert->totweight; j++){
@ -780,11 +800,8 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
} }
} }
if(contrib > 0.0){ if(contrib > 0.0)
vec[0] /= contrib; VecMulf(vec, armature_weight / contrib);
vec[1] /= contrib;
vec[2] /= contrib;
}
VecAddf(co, vec, co); VecAddf(co, vec, co);
Mat4MulVecfl(postmat, co); Mat4MulVecfl(postmat, co);

@ -2976,7 +2976,7 @@ static void armatureModifier_deformVerts(
ArmatureModifierData *amd = (ArmatureModifierData*) md; ArmatureModifierData *amd = (ArmatureModifierData*) md;
armature_deform_verts(amd->object, ob, derivedData, vertexCos, numVerts, armature_deform_verts(amd->object, ob, derivedData, vertexCos, numVerts,
amd->deformflag); amd->deformflag, amd->defgrp_name);
} }
static void armatureModifier_deformVertsEM( static void armatureModifier_deformVertsEM(
@ -2989,7 +2989,7 @@ static void armatureModifier_deformVertsEM(
if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
armature_deform_verts(amd->object, ob, dm, vertexCos, numVerts, armature_deform_verts(amd->object, ob, dm, vertexCos, numVerts,
amd->deformflag); amd->deformflag, amd->defgrp_name);
if(!derivedData) dm->release(dm); if(!derivedData) dm->release(dm);
} }

@ -226,6 +226,7 @@ typedef struct ArmatureModifierData {
short deformflag, pad1; /* deformflag replaces armature->deformflag */ short deformflag, pad1; /* deformflag replaces armature->deformflag */
int pad2; int pad2;
struct Object *object; struct Object *object;
char defgrp_name[32];
} ArmatureModifierData; } ArmatureModifierData;
typedef struct HookModifierData { typedef struct HookModifierData {

@ -1310,29 +1310,29 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
int lx = x + width - 60 - 15; int lx = x + width - 60 - 15;
if (md->type==eModifierType_Subsurf) { if (md->type==eModifierType_Subsurf) {
height = 106; height = 105;
} else if (md->type==eModifierType_Lattice) { } else if (md->type==eModifierType_Lattice) {
height = 46; height = 48;
} else if (md->type==eModifierType_Curve) { } else if (md->type==eModifierType_Curve) {
height = 46; height = 48;
} else if (md->type==eModifierType_Build) { } else if (md->type==eModifierType_Build) {
height = 86; height = 86;
} else if (md->type==eModifierType_Mirror) { } else if (md->type==eModifierType_Mirror) {
height = 46; height = 48;
} else if (md->type==eModifierType_EdgeSplit) { } else if (md->type==eModifierType_EdgeSplit) {
height = 46; height = 48;
} else if (md->type==eModifierType_Displace) { } else if (md->type==eModifierType_Displace) {
DisplaceModifierData *dmd = (DisplaceModifierData *)md; DisplaceModifierData *dmd = (DisplaceModifierData *)md;
height = 134; height = 124;
if(dmd->texmapping == MOD_DISP_MAP_OBJECT) height += 19; if(dmd->texmapping == MOD_DISP_MAP_OBJECT) height += 19;
} else if (md->type==eModifierType_UVProject) { } else if (md->type==eModifierType_UVProject) {
height = 67 + ((UVProjectModifierData *)md)->num_projectors * 19; height = 67 + ((UVProjectModifierData *)md)->num_projectors * 19;
} else if (md->type==eModifierType_Decimate) { } else if (md->type==eModifierType_Decimate) {
height = 46; height = 48;
} else if (md->type==eModifierType_Wave) { } else if (md->type==eModifierType_Wave) {
height = 200; height = 200;
} else if (md->type==eModifierType_Armature) { } else if (md->type==eModifierType_Armature) {
height = 46; height = 67;
} else if (md->type==eModifierType_Hook) { } else if (md->type==eModifierType_Hook) {
HookModifierData *hmd = (HookModifierData*) md; HookModifierData *hmd = (HookModifierData*) md;
height = 86; height = 86;
@ -1343,9 +1343,9 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
} else if (md->type==eModifierType_Softbody) { } else if (md->type==eModifierType_Softbody) {
height = 26; height = 26;
} else if (md->type==eModifierType_Boolean) { } else if (md->type==eModifierType_Boolean) {
height = 46; height = 48;
} else if (md->type==eModifierType_Array) { } else if (md->type==eModifierType_Array) {
height = 186; height = 182;
} }
/* roundbox 4 free variables: corner-rounding, nop, roundbox type, shade */ /* roundbox 4 free variables: corner-rounding, nop, roundbox type, shade */
@ -1512,6 +1512,8 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
ArmatureModifierData *amd = (ArmatureModifierData*) md; ArmatureModifierData *amd = (ArmatureModifierData*) md;
uiDefIDPoinBut(block, modifier_testArmatureObj, ID_OB, B_CHANGEDEP, "Ob: ", lx, (cy-=19), buttonWidth,19, &amd->object, "Armature object to deform with"); uiDefIDPoinBut(block, modifier_testArmatureObj, ID_OB, B_CHANGEDEP, "Ob: ", lx, (cy-=19), buttonWidth,19, &amd->object, "Armature object to deform with");
but=uiDefBut(block, TEX, B_MODIFIER_RECALC, "VGroup: ", lx, (cy-=19), buttonWidth,19, &amd->defgrp_name, 0.0, 31.0, 0, 0, "Vertex Group name to control overall armature influence");
uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)ob);
uiDefButBitS(block, TOG, ARM_DEF_VGROUP, B_ARM_RECALCDATA, "Vert.Groups", lx,cy-=19,buttonWidth/2,20, &amd->deformflag, 0, 0, 0, 0, "Enable VertexGroups defining deform"); uiDefButBitS(block, TOG, ARM_DEF_VGROUP, B_ARM_RECALCDATA, "Vert.Groups", lx,cy-=19,buttonWidth/2,20, &amd->deformflag, 0, 0, 0, 0, "Enable VertexGroups defining deform");
uiDefButBitS(block, TOG, ARM_DEF_ENVELOPE, B_ARM_RECALCDATA, "Envelopes", lx+buttonWidth/2,cy,(buttonWidth + 1)/2,20, &amd->deformflag, 0, 0, 0, 0, "Enable Bone Envelopes defining deform"); uiDefButBitS(block, TOG, ARM_DEF_ENVELOPE, B_ARM_RECALCDATA, "Envelopes", lx+buttonWidth/2,cy,(buttonWidth + 1)/2,20, &amd->deformflag, 0, 0, 0, 0, "Enable Bone Envelopes defining deform");

@ -175,7 +175,7 @@ void BL_SkinDeformer::Update(void)
for (int v =0; v<m_bmesh->totvert; v++) for (int v =0; v<m_bmesh->totvert; v++)
VECCOPY(m_transverts[v], m_bmesh->mvert[v].co); VECCOPY(m_transverts[v], m_bmesh->mvert[v].co);
armature_deform_verts( par_arma, m_objMesh, NULL, m_transverts, m_bmesh->totvert, ARM_DEF_VGROUP ); armature_deform_verts( par_arma, m_objMesh, NULL, m_transverts, m_bmesh->totvert, ARM_DEF_VGROUP, NULL );
RecalcNormals(); RecalcNormals();
/* Update the current frame */ /* Update the current frame */