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:
Diffstat (limited to 'source/blender/ikplugin/intern/iksolver_plugin.c')
-rw-r--r--source/blender/ikplugin/intern/iksolver_plugin.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/source/blender/ikplugin/intern/iksolver_plugin.c b/source/blender/ikplugin/intern/iksolver_plugin.c
index b3c83bffb3f..6ea311b2c7b 100644
--- a/source/blender/ikplugin/intern/iksolver_plugin.c
+++ b/source/blender/ikplugin/intern/iksolver_plugin.c
@@ -50,6 +50,8 @@
#include <string.h> /* memcpy */
+#define USE_NONUNIFORM_SCALE
+
/* ********************** THE IK SOLVER ******************* */
/* allocates PoseTree, and links that to root bone/channel */
@@ -525,10 +527,10 @@ void iksolver_initialize_tree(struct Scene *UNUSED(scene), struct Object *ob, fl
ob->pose->flag &= ~POSE_WAS_REBUILT;
}
-void iksolver_execute_tree(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime)
+void iksolver_execute_tree(struct Scene *scene, Object *ob, bPoseChannel *pchan_root, float ctime)
{
- while (pchan->iktree.first) {
- PoseTree *tree = pchan->iktree.first;
+ while (pchan_root->iktree.first) {
+ PoseTree *tree = pchan_root->iktree.first;
int a;
/* stop on the first tree that isn't a standard IK chain */
@@ -542,6 +544,19 @@ void iksolver_execute_tree(struct Scene *scene, struct Object *ob, struct bPose
/* tell blender that this channel was controlled by IK, it's cleared on each BKE_pose_where_is() */
tree->pchan[a]->flag |= POSE_CHAIN;
}
+
+#ifdef USE_NONUNIFORM_SCALE
+ float (*pchan_scale_data)[3] = MEM_mallocN(sizeof(float[3]) * tree->totchannel, __func__);
+
+ for (a = 0; a < tree->totchannel; a++) {
+ mat4_to_size(pchan_scale_data[a], tree->pchan[a]->pose_mat);
+
+ /* make uniform at y scale since this controls the length */
+ normalize_v3_length(tree->pchan[a]->pose_mat[0], pchan_scale_data[a][1]);
+ normalize_v3_length(tree->pchan[a]->pose_mat[2], pchan_scale_data[a][1]);
+ }
+#endif
+
/* 5. execute the IK solver */
execute_posetree(scene, ob, tree);
@@ -556,8 +571,16 @@ void iksolver_execute_tree(struct Scene *scene, struct Object *ob, struct bPose
where_is_ik_bone(tree->pchan[a], tree->basis_change[a]);
}
+#ifdef USE_NONUNIFORM_SCALE
+ for (a = 0; a < tree->totchannel; a++) {
+ normalize_v3_length(tree->pchan[a]->pose_mat[0], pchan_scale_data[a][0]);
+ normalize_v3_length(tree->pchan[a]->pose_mat[2], pchan_scale_data[a][2]);
+ }
+ MEM_freeN(pchan_scale_data);
+#endif
+
/* 7. and free */
- BLI_remlink(&pchan->iktree, tree);
+ BLI_remlink(&pchan_root->iktree, tree);
free_posetree(tree);
}
}