diff options
author | Ben Batt <benbatt@gmail.com> | 2006-08-29 01:56:58 +0400 |
---|---|---|
committer | Ben Batt <benbatt@gmail.com> | 2006-08-29 01:56:58 +0400 |
commit | 12a732fc209182a8e798fbe25a28c9456610bfb4 (patch) | |
tree | 06c53af1b5f67657484e69ca39fe2e46855fa1b4 /source/blender | |
parent | dd8c56e0774c6212390a43f208515b879d5156a0 (diff) |
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.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_lattice.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/armature.c | 37 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/modifier.c | 4 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_modifier_types.h | 1 | ||||
-rw-r--r-- | source/blender/src/buttons_editing.c | 22 |
5 files changed, 44 insertions, 23 deletions
diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h index a7533a614eb..f422d00d857 100644 --- a/source/blender/blenkernel/BKE_lattice.h +++ b/source/blender/blenkernel/BKE_lattice.h @@ -59,7 +59,8 @@ void lattice_deform_verts(struct Object *laOb, struct Object *target, int numVerts, char *vgroup); void armature_deform_verts(struct Object *armOb, struct Object *target, 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]; void lattice_applyVertexCos(struct Object *ob, float (*vertexCos)[3]); void lattice_calc_modifiers(struct Object *ob); diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index 545efdf10e6..cab7bf30908 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -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, - float (*vertexCos)[3], int numVerts, int deformflag) + float (*vertexCos)[3], int numVerts, int deformflag, + const char *defgrp_name) { bPoseChannel *pchan, **defnrToPC = 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 i; int use_dverts = 0; + int armature_def_nr = -1; + bDeformGroup *dg; if(armOb == G.obedit) return; @@ -690,11 +693,14 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm, 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 */ if(deformflag & ARM_DEF_VGROUP) { if(target->type == OB_MESH){ - bDeformGroup *dg; - numGroups = BLI_countlist(&target->defbase); dverts = ((Mesh*)target->data)->dvert; @@ -727,19 +733,33 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm, float vec[3]; float contrib = 0.0; int j; + float armature_weight = 1; /* default to 1 if no overall def group */ vec[0] = vec[1] = vec[2] = 0; /* Apply the object's matrix */ Mat4MulVecfl(premat, co); - if(use_dverts) { + if(use_dverts || armature_def_nr >= 0) { if(dm) dvert = dm->getVertData(dm, i, LAYERTYPE_MDEFORMVERT); else if(i < ((Mesh*)target->data)->totvert) dvert = dverts + i; } else dvert = NULL; + + 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(dvert && dvert->totweight) { // use weight groups ? + if(use_dverts && dvert && dvert->totweight) { // use weight groups ? int deformed = 0; 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){ - vec[0] /= contrib; - vec[1] /= contrib; - vec[2] /= contrib; - } + if(contrib > 0.0) + VecMulf(vec, armature_weight / contrib); VecAddf(co, vec, co); Mat4MulVecfl(postmat, co); diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 9e43e30fa7c..e2bf8040292 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -2976,7 +2976,7 @@ static void armatureModifier_deformVerts( ArmatureModifierData *amd = (ArmatureModifierData*) md; armature_deform_verts(amd->object, ob, derivedData, vertexCos, numVerts, - amd->deformflag); + amd->deformflag, amd->defgrp_name); } static void armatureModifier_deformVertsEM( @@ -2989,7 +2989,7 @@ static void armatureModifier_deformVertsEM( if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); armature_deform_verts(amd->object, ob, dm, vertexCos, numVerts, - amd->deformflag); + amd->deformflag, amd->defgrp_name); if(!derivedData) dm->release(dm); } diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 522d25c9d90..dee183ec353 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -226,6 +226,7 @@ typedef struct ArmatureModifierData { short deformflag, pad1; /* deformflag replaces armature->deformflag */ int pad2; struct Object *object; + char defgrp_name[32]; } ArmatureModifierData; typedef struct HookModifierData { diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c index ad066544442..3c46dbda0ea 100644 --- a/source/blender/src/buttons_editing.c +++ b/source/blender/src/buttons_editing.c @@ -1310,29 +1310,29 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco int lx = x + width - 60 - 15; if (md->type==eModifierType_Subsurf) { - height = 106; + height = 105; } else if (md->type==eModifierType_Lattice) { - height = 46; + height = 48; } else if (md->type==eModifierType_Curve) { - height = 46; + height = 48; } else if (md->type==eModifierType_Build) { height = 86; } else if (md->type==eModifierType_Mirror) { - height = 46; + height = 48; } else if (md->type==eModifierType_EdgeSplit) { - height = 46; + height = 48; } else if (md->type==eModifierType_Displace) { DisplaceModifierData *dmd = (DisplaceModifierData *)md; - height = 134; + height = 124; if(dmd->texmapping == MOD_DISP_MAP_OBJECT) height += 19; } else if (md->type==eModifierType_UVProject) { height = 67 + ((UVProjectModifierData *)md)->num_projectors * 19; } else if (md->type==eModifierType_Decimate) { - height = 46; + height = 48; } else if (md->type==eModifierType_Wave) { height = 200; } else if (md->type==eModifierType_Armature) { - height = 46; + height = 67; } else if (md->type==eModifierType_Hook) { HookModifierData *hmd = (HookModifierData*) md; height = 86; @@ -1343,9 +1343,9 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco } else if (md->type==eModifierType_Softbody) { height = 26; } else if (md->type==eModifierType_Boolean) { - height = 46; + height = 48; } else if (md->type==eModifierType_Array) { - height = 186; + height = 182; } /* 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; 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_ENVELOPE, B_ARM_RECALCDATA, "Envelopes", lx+buttonWidth/2,cy,(buttonWidth + 1)/2,20, &amd->deformflag, 0, 0, 0, 0, "Enable Bone Envelopes defining deform"); |