Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Batt <benbatt@gmail.com>2006-08-29 01:56:58 +0400
committerBen Batt <benbatt@gmail.com>2006-08-29 01:56:58 +0400
commit12a732fc209182a8e798fbe25a28c9456610bfb4 (patch)
tree06c53af1b5f67657484e69ca39fe2e46855fa1b4 /source/blender/blenkernel
parentdd8c56e0774c6212390a43f208515b879d5156a0 (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.h3
-rw-r--r--source/blender/blenkernel/intern/armature.c37
-rw-r--r--source/blender/blenkernel/intern/modifier.c4
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);
}