diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2016-07-12 01:01:38 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2016-07-12 01:07:44 +0300 |
commit | cfbd605567f48229a923df382baf6db98fbafc61 (patch) | |
tree | d4218c49672047d6c3b37517034660b3b5dcd966 /source/blender/ikplugin/intern/iksolver_plugin.c | |
parent | 71a57a37b2eebbed53b5335019287b4df9c30519 (diff) | |
parent | 7212ebd09f9720883581221be923ae5e97ff5d76 (diff) |
Merge branch 'master' into blender2.8
Conflicts:
intern/cycles/blender/addon/ui.py
source/blender/blenkernel/BKE_particle.h
source/blender/blenkernel/intern/dynamicpaint.c
source/blender/blenkernel/intern/library.c
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/particle.c
source/blender/blenkernel/intern/particle_distribute.c
source/blender/blenkernel/intern/texture.c
source/blender/editors/object/object_add.c
source/blender/editors/object/object_relations.c
source/blender/editors/physics/particle_edit.c
source/blender/editors/physics/particle_object.c
source/blender/editors/transform/transform_snap_object.c
Diffstat (limited to 'source/blender/ikplugin/intern/iksolver_plugin.c')
-rw-r--r-- | source/blender/ikplugin/intern/iksolver_plugin.c | 31 |
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); } } |