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
path: root/source
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2007-11-01 15:55:47 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2007-11-01 15:55:47 +0300
commit0ca5c98f2383b38bb3aa49e37be3f76074b0ca34 (patch)
tree472b9a17aa09d8795e70c85a6abaf544a41ccf12 /source
parentc5d2be76d771ed4ddf68a3f10b1b87bbeeb3d296 (diff)
Hinge Bone Transform
==================== This changes the way hinge bones are transformed when their parent bones are also selected. Before it just disabled transform for these, now they are rotated and scaled as well, but without influencing the transform center, which gives behaviour as if they were regular bones.
Diffstat (limited to 'source')
-rw-r--r--source/blender/include/transform.h1
-rw-r--r--source/blender/makesdna/DNA_armature_types.h2
-rw-r--r--source/blender/src/transform_conversions.c16
-rw-r--r--source/blender/src/transform_generics.c6
4 files changed, 20 insertions, 5 deletions
diff --git a/source/blender/include/transform.h b/source/blender/include/transform.h
index 5ee4f9e84fe..a01bf92c871 100644
--- a/source/blender/include/transform.h
+++ b/source/blender/include/transform.h
@@ -269,6 +269,7 @@ typedef struct TransInfo {
#define TD_VERSE_VERT 64
#endif
#define TD_TIMEONLY 128
+#define TD_NOCENTER 256
/* transsnap->status */
#define SNAP_ON 1
diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h
index 1fc50f4eec4..9f64a31c90c 100644
--- a/source/blender/makesdna/DNA_armature_types.h
+++ b/source/blender/makesdna/DNA_armature_types.h
@@ -148,5 +148,7 @@ typedef struct bArmature {
#define BONE_NO_DEFORM 4096
/* set to prevent destruction of its unkeyframed pose (after transform) */
#define BONE_UNKEYED 8192
+ /* set to prevent hinge child bones from influencing the transform center */
+#define BONE_HINGE_CHILD_TRANSFORM 16384
#endif
diff --git a/source/blender/src/transform_conversions.c b/source/blender/src/transform_conversions.c
index 1b644b8342e..b0e2d8144e8 100644
--- a/source/blender/src/transform_conversions.c
+++ b/source/blender/src/transform_conversions.c
@@ -529,6 +529,8 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
td->ob = ob;
td->flag= TD_SELECTED|TD_USEQUAT;
+ if(bone->flag & BONE_HINGE_CHILD_TRANSFORM)
+ td->flag |= TD_NOCENTER;
td->protectflag= pchan->protectflag;
td->loc = pchan->loc;
@@ -617,7 +619,11 @@ static void bone_children_clear_transflag(ListBase *lb)
Bone *bone= lb->first;
for(;bone;bone= bone->next) {
- bone->flag &= ~BONE_TRANSFORM;
+ if(bone->flag & BONE_HINGE)
+ bone->flag |= BONE_HINGE_CHILD_TRANSFORM;
+ else
+ bone->flag &= ~BONE_TRANSFORM;
+
bone_children_clear_transflag(&bone->childbase);
}
}
@@ -638,6 +644,8 @@ static void set_pose_transflags(TransInfo *t, Object *ob)
bone->flag |= BONE_TRANSFORM;
else
bone->flag &= ~BONE_TRANSFORM;
+
+ bone->flag &= ~BONE_HINGE_CHILD_TRANSFORM;
}
}
@@ -658,8 +666,10 @@ static void set_pose_transflags(TransInfo *t, Object *ob)
if(t->mode==TFM_TRANSLATION) {
if( has_targetless_ik(pchan)==NULL ) {
- if(pchan->parent && (pchan->bone->flag & BONE_CONNECTED))
- t->mode= TFM_ROTATION;
+ if(pchan->parent && (pchan->bone->flag & BONE_CONNECTED)) {
+ if(!(pchan->bone->flag & BONE_HINGE_CHILD_TRANSFORM))
+ t->mode= TFM_ROTATION;
+ }
else if((pchan->protectflag & OB_LOCK_LOC)==OB_LOCK_LOC)
t->mode= TFM_ROTATION;
}
diff --git a/source/blender/src/transform_generics.c b/source/blender/src/transform_generics.c
index 744933088c8..bf9de8d4e3f 100644
--- a/source/blender/src/transform_generics.c
+++ b/source/blender/src/transform_generics.c
@@ -782,7 +782,8 @@ void calculateCenterMedian(TransInfo *t)
for(i = 0; i < t->total; i++) {
if (t->data[i].flag & TD_SELECTED) {
- VecAddf(partial, partial, t->data[i].center);
+ if (!(t->data[i].flag & TD_NOCENTER))
+ VecAddf(partial, partial, t->data[i].center);
}
else {
/*
@@ -807,7 +808,8 @@ void calculateCenterBound(TransInfo *t)
for(i = 0; i < t->total; i++) {
if (i) {
if (t->data[i].flag & TD_SELECTED) {
- MinMax3(min, max, t->data[i].center);
+ if (!(t->data[i].flag & TD_NOCENTER))
+ MinMax3(min, max, t->data[i].center);
}
else {
/*