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:
authorTon Roosendaal <ton@blender.org>2005-07-28 14:01:10 +0400
committerTon Roosendaal <ton@blender.org>2005-07-28 14:01:10 +0400
commit4cc96528b8bb8df6e81efe4654048f4730f2b34e (patch)
treeb792dcacff427f0c752ee046af24c1cde9a3b7a1 /source/blender
parenta2c4044b2763447379e29b36d7daee0bc68c6850 (diff)
Nice time saver for Armatures: Introduced Bone type "Hinge", which doesn't
inherit pose rotation/scale from its parent pose-channel. Button is available in Editing Buttons for PoseMode as well as EditMode. Aim is to reduce overhead of Constraint usage (copy location). (in object.c I removed old code for IK)
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/intern/armature.c23
-rw-r--r--source/blender/blenkernel/intern/object.c13
-rw-r--r--source/blender/makesdna/DNA_armature_types.h2
-rw-r--r--source/blender/src/buttons_editing.c64
4 files changed, 47 insertions, 55 deletions
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 914bce67c52..b545cbedb56 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -1007,7 +1007,21 @@ static void where_is_pose_bone(Object *ob, bPoseChannel *pchan)
offs_bone[3][1]+= parbone->length;
/* Compose the matrix for this bone */
- Mat4MulSerie(pchan->pose_mat, parchan->pose_mat, offs_bone, pchan->chan_mat, NULL, NULL, NULL, NULL, NULL);
+ if(bone->flag & BONE_HINGE) { // uses restposition rotation, but actual position
+ float tmat[4][4];
+
+ /* the rotation of the parent restposition */
+ Mat4CpyMat4(tmat, parbone->arm_mat);
+
+ /* the location of actual parent transform */
+ VECCOPY(tmat[3], offs_bone[3]);
+ offs_bone[3][0]= offs_bone[3][1]= offs_bone[3][2]= 0.0f;
+ Mat4MulVecfl(parchan->pose_mat, tmat[3]);
+
+ Mat4MulSerie(pchan->pose_mat, tmat, offs_bone, pchan->chan_mat, NULL, NULL, NULL, NULL, NULL);
+ }
+ else
+ Mat4MulSerie(pchan->pose_mat, parchan->pose_mat, offs_bone, pchan->chan_mat, NULL, NULL, NULL, NULL, NULL);
}
else
Mat4MulMat4(pchan->pose_mat, pchan->chan_mat, bone->arm_mat);
@@ -1017,7 +1031,6 @@ static void where_is_pose_bone(Object *ob, bPoseChannel *pchan)
if(pchan->constraints.first) {
static Object conOb;
static int initialized= 0;
- float vec[3];
VECCOPY(vec, pchan->pose_mat[3]);
@@ -1067,7 +1080,7 @@ void where_is_pose (Object *ob)
{
bArmature *arm;
Bone *bone;
- bPoseChannel *pchan, *next;
+ bPoseChannel *pchan;
float imat[4][4];
arm = get_armature(ob);
@@ -1132,9 +1145,7 @@ void where_is_pose (Object *ob)
}
/* calculating deform matrices */
- for(pchan= ob->pose->chanbase.first; pchan; pchan= next) {
- next= pchan->next;
-
+ for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
if(pchan->bone) {
Mat4Invert(imat, pchan->bone->arm_mat);
Mat4MulMat4(pchan->chan_mat, imat, pchan->pose_mat);
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 2b8b14429ef..46dc90ec3b4 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1645,7 +1645,6 @@ void solve_constraints (Object *ob, short obtype, void *obdata, float ctime)
float delta[4][4];
float imat[4][4];
float identity[4][4];
- float worldmat[4][4];
if (con->type!=CONSTRAINT_TYPE_KINEMATIC) {
/* If we're not an IK constraint, solve the constraint then blend it to the previous one */
@@ -1664,18 +1663,6 @@ void solve_constraints (Object *ob, short obtype, void *obdata, float ctime)
Mat4MulMat4 (ob->obmat, delta, oldmat);
}
- else{
- /* Interpolate the target between the chain's unconstrained endpoint and the effector loc */
- if (obtype==TARGET_BONE) {
- get_objectspace_bone_matrix(obdata, oldmat, 1, 1);
-
- Mat4MulMat4(worldmat, oldmat, ob->parent->obmat);
-
- Mat4BlendMat4(focusmat, worldmat, lastmat, a);
-
- evaluate_constraint(con, ob, obtype, obdata, focusmat);
- }
- }
}
}
}
diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h
index c1f64abd8db..cda8751a30b 100644
--- a/source/blender/makesdna/DNA_armature_types.h
+++ b/source/blender/makesdna/DNA_armature_types.h
@@ -120,6 +120,8 @@ typedef struct bArmature {
#define BONE_DONE 128
/* active is on mouse clicks only */
#define BONE_ACTIVE 256
+ /* No parent rotation or scale */
+#define BONE_HINGE 512
/* bone->flag bits */
#define BONE_IK_TOPARENTBIT 4
diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c
index d22071e0e11..bfedf5218a9 100644
--- a/source/blender/src/buttons_editing.c
+++ b/source/blender/src/buttons_editing.c
@@ -1527,9 +1527,9 @@ static void validate_posebonebutton_cb(void *bonev, void *namev)
allqueue(REDRAWALL, 0);
}
-static void armature_rest_pos_func(void *pointer1, void *pointer2)
+static void armature_recalc_func(void *obp, void *pointer2)
{
- Object *ob= pointer1;
+ Object *ob= obp;
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
}
@@ -1545,7 +1545,7 @@ static void editing_panel_armature_type(Object *ob, bArmature *arm)
uiBlockBeginAlign(block);
but = uiDefButI(block, TOG|BIT|ARM_RESTPOSBIT,REDRAWVIEW3D,
"Rest Position", 10,180,150,20, &arm->flag, 0, 0, 0, 0, "Disable all animation for this object");
- uiButSetFunc(but, armature_rest_pos_func, ob, arm);
+ uiButSetFunc(but, armature_recalc_func, ob, NULL);
uiDefButI(block, TOG|BIT|ARM_DELAYBIT,REDRAWVIEW3D, "Delay Deform", 160, 180,150,20, &arm->flag, 0, 0, 0, 0, "Don't deform children when manipulating bones in pose mode");
uiBlockBeginAlign(block);
@@ -1583,9 +1583,6 @@ static void editing_panel_armature_bones(Object *ob, bArmature *arm)
for (curBone=G.edbo.first, index=0; curBone; curBone=curBone->next, index++){
if (curBone->flag & (BONE_SELECTED)) {
- /* Hide in posemode flag */
- uiDefButI(block, TOG|BIT|BONE_HIDDENBIT, REDRAWVIEW3D, "Hide", bx-55,by,45,18, &curBone->flag, 0, 0, 0, 0, "Toggles display of this bone in posemode");
-
/* Bone naming button */
but=uiDefBut(block, TEX, REDRAWVIEW3D, "BO:", bx-10,by,117,18, &curBone->name, 0, 24, 0, 0, "Change the bone name");
uiButSetFunc(but, validate_editbonebutton_cb, curBone, NULL);
@@ -1604,26 +1601,24 @@ static void editing_panel_armature_bones(Object *ob, bArmature *arm)
/* IK to parent flag */
if (curBone->parent){
- but=uiDefButI(block, TOG|BIT|BONE_IK_TOPARENTBIT, REDRAWVIEW3D, "IK", bx+300,by,32,18, &curBone->flag, 0.0, 0.0, 0.0, 0.0, "IK link to parent");
+ but=uiDefButBitI(block, TOG, BONE_IK_TOPARENT, REDRAWVIEW3D, "IK", bx+300,by,32,18, &curBone->flag, 0.0, 0.0, 0.0, 0.0, "IK link to parent");
uiButSetFunc(but, attach_bone_to_parent_cb, curBone, NULL);
}
- /* Dist and weight buttons */
+ /* Segment, dist and weight buttons */
uiBlockBeginAlign(block);
- uiDefButS(block, NUM, REDRAWVIEW3D, "Segm: ",
- bx-10,by-19,117,18, &curBone->segments, 1.0, 32.0, 0.0, 0.0,
- "Subdivisions for B-bones");
-
- /* Dist and weight buttons */
- uiDefButF(block, NUM,REDRAWVIEW3D, "Dist:", bx+110, by-19,
- 105, 18, &curBone->dist, 0.0, 1000.0, 10.0, 0.0,
- "Bone deformation distance");
- uiDefButF(block, NUM,REDRAWVIEW3D, "Weight:", bx+223, by-19,
- 110, 18, &curBone->weight, 0.0F, 1000.0F,
- 10.0F, 0.0F, "Bone deformation weight");
-
+ uiDefButS(block, NUM, REDRAWVIEW3D, "Segm: ", bx-10,by-19,117,18, &curBone->segments, 1.0, 32.0, 0.0, 0.0, "Subdivisions for B-bones");
+ uiDefButF(block, NUM,REDRAWVIEW3D, "Dist:", bx+110, by-19, 105, 18, &curBone->dist, 0.0, 1000.0, 10.0, 0.0, "Bone deformation distance");
+ uiDefButF(block, NUM,REDRAWVIEW3D, "Weight:", bx+223, by-19,110, 18, &curBone->weight, 0.0F, 1000.0F, 10.0F, 0.0F, "Bone deformation weight");
+
+ /* bone types */
+ uiDefButBitI(block, TOG, BONE_HINGE, REDRAWVIEW3D, "Hinge", bx-10,by-38,117,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Don't inherit rotation or scale from parent Bone");
+ uiDefButS(block, TOGN|BIT|0,REDRAWVIEW3D, "Skinnable", bx+110, by-38, 105, 18, &curBone->boneclass, 0.0, 0.0, 0.0, 0.0, "Indicate if Bone is included in automatic creation of vertex groups");
+ /* Hide in posemode flag */
+ uiDefButBitI(block, TOG, BONE_HIDDEN, REDRAWVIEW3D, "Hide", bx+223,by-38,110,18, &curBone->flag, 0, 0, 0, 0, "Toggles display of this bone in posemode");
+
uiBlockEndAlign(block);
- by-=42;
+ by-=60;
if(by < -200) break; // for time being... extreme long panels are very slow
}
@@ -1659,31 +1654,28 @@ static void editing_panel_pose_bones(Object *ob, bArmature *arm)
curBone= pchan->bone;
if (curBone->flag & (BONE_SELECTED)) {
- /* Hide in posemode flag */
- uiDefButI(block, TOG|BIT|BONE_HIDDENBIT, REDRAWVIEW3D, "Hide", bx-55,by,45,18, &curBone->flag, 0, 0, 0, 0, "Toggles display of this bone in posemode");
-
/* Bone naming button */
uiBlockBeginAlign(block);
but=uiDefBut(block, TEX, REDRAWVIEW3D, "BO:", bx-10,by,117,18, &curBone->name, 0, 24, 0, 0, "Change the bone name");
uiButSetFunc(but, validate_posebonebutton_cb, curBone, NULL);
/* Dist and weight buttons */
- uiDefButF(block, NUM,REDRAWVIEW3D, "Dist:", bx+107, by,
- 105, 18, &curBone->dist, 0.0, 1000.0, 10.0, 0.0,
- "Bone deformation distance");
- uiDefButF(block, NUM,REDRAWVIEW3D, "Weight:", bx+220, by,
- 110, 18, &curBone->weight, 0.0F, 1000.0F,
- 10.0F, 0.0F, "Bone deformation weight");
+ uiDefButF(block, NUM,REDRAWVIEW3D, "Dist:", bx+107, by, 105, 18, &curBone->dist, 0.0, 1000.0, 10.0, 0.0, "Bone deformation distance");
+ uiDefButF(block, NUM,REDRAWVIEW3D, "Weight:", bx+220, by, 110, 18, &curBone->weight, 0.0F, 1000.0F, 10.0F, 0.0F, "Bone deformation weight");
/* Segment, ease in/out buttons */
uiBlockBeginAlign(block);
- uiDefButS(block, NUM, REDRAWVIEW3D, "Segm: ",
- bx-10,by-19,117,19, &curBone->segments, 1.0, 32.0, 0.0, 0.0, "Subdivisions for B-bones");
- uiDefButF(block, NUM,REDRAWVIEW3D, "In:",
- bx+107, by-19,105, 19, &curBone->ease1, 0.0, 2.0, 10.0, 0.0, "First length of Bezier handle");
- uiDefButF(block, NUM,REDRAWVIEW3D, "Out:",
- bx+220, by-19, 110, 19, &curBone->ease2, 0.0, 2.0, 10.0, 0.0, "Second length of Bezier handle");
+ uiDefButS(block, NUM, REDRAWVIEW3D, "Segm: ", bx-10,by-19,117,19, &curBone->segments, 1.0, 32.0, 0.0, 0.0, "Subdivisions for B-bones");
+ uiDefButF(block, NUM,REDRAWVIEW3D, "In:", bx+107, by-19,105, 19, &curBone->ease1, 0.0, 2.0, 10.0, 0.0, "First length of Bezier handle");
+ uiDefButF(block, NUM,REDRAWVIEW3D, "Out:", bx+220, by-19, 110, 19, &curBone->ease2, 0.0, 2.0, 10.0, 0.0, "Second length of Bezier handle");
+
+ /* bone types */
+ but= uiDefButBitI(block, TOG, BONE_HINGE, REDRAWVIEW3D, "Hinge", bx-10,by-38,117,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Don't inherit rotation or scale from parent Bone");
+ uiButSetFunc(but, armature_recalc_func, ob, NULL);
+ uiDefButS(block, TOGN|BIT|0,REDRAWVIEW3D, "Skinnable", bx+110, by-38, 105, 18, &curBone->boneclass, 0.0, 0.0, 0.0, 0.0, "Indicate if Bone is included in automatic creation of vertex groups");
+ /* Hide in posemode flag */
+ uiDefButBitI(block, TOG, BONE_HIDDEN, REDRAWVIEW3D, "Hide", bx+223,by-38,110,18, &curBone->flag, 0, 0, 0, 0, "Toggles display of this bone in posemode");
uiBlockEndAlign(block);