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/blenkernel | |
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/blenkernel')
-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 |
3 files changed, 31 insertions, 13 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); } |