Revision: 28368
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28368
Author:   aligorith
Date:     2010-04-23 07:14:00 +0200 (Fri, 23 Apr 2010)

Log Message:
-----------
Spline IK - Influence Control

Made the 'Influence' slider work for Spline IK too, and made that setting 
visible now that it works. 

Note that there is still some popping that can occur when going to/from 
influence = 0.0. I'm not sure exactly what's causing this yet, but hopefully it 
won't be too noticeable in practice.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/properties_object_constraint.py
    trunk/blender/source/blender/blenkernel/intern/armature.c

Modified: trunk/blender/release/scripts/ui/properties_object_constraint.py
===================================================================
--- trunk/blender/release/scripts/ui/properties_object_constraint.py    
2010-04-23 04:16:08 UTC (rev 28367)
+++ trunk/blender/release/scripts/ui/properties_object_constraint.py    
2010-04-23 05:14:00 UTC (rev 28368)
@@ -37,7 +37,7 @@
             # match enum type to our functions, avoids a lookup table.
             getattr(self, con.type)(context, box, con, wide_ui)
 
-            if con.type not in ('RIGID_BODY_JOINT', 'SPLINE_IK', 'NULL'):
+            if con.type not in ('RIGID_BODY_JOINT', 'NULL'):
                 box.prop(con, "influence")
 
     def space_template(self, layout, con, wide_ui, target=True, owner=True):

Modified: trunk/blender/source/blender/blenkernel/intern/armature.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/armature.c   2010-04-23 
04:16:08 UTC (rev 28367)
+++ trunk/blender/source/blender/blenkernel/intern/armature.c   2010-04-23 
05:14:00 UTC (rev 28368)
@@ -2006,6 +2006,11 @@
                rangle= dot_v3v3(rmat[1], splineVec);
                rangle= acos( MAX2(-1.0f, MIN2(1.0f, rangle)) );
                
+               /* multiply the magnitude of the angle by the influence of the 
constraint to 
+                * control the influence of the SplineIK effect 
+                */
+               rangle *= tree->con->enforce;
+               
                /* construct rotation matrix from the axis-angle rotation found 
above 
                 *      - this call takes care to make sure that the axis 
provided is a unit vector first
                 */
@@ -2073,13 +2078,26 @@
                }
        }
        
-       /* step 5: set the location of the bone in the matrix 
-        *      - when the 'no-root' option is affected, the chain can retain
-        *        the shape but be moved elsewhere
-        */
+       /* step 5: set the location of the bone in the matrix */
        if (ikData->flag & CONSTRAINT_SPLINEIK_NO_ROOT) {
+               /* when the 'no-root' option is affected, the chain can retain
+                * the shape but be moved elsewhere
+                */
                VECCOPY(poseHead, pchan->pose_head);
        }
+       else if (tree->con->enforce < 1.0f) {
+               /* when the influence is too low
+                *      - blend the positions for the 'root' bone
+                *      - stick to the parent for any other
+                */
+               if (pchan->parent) {
+                       VECCOPY(poseHead, pchan->pose_head);
+               }
+               else {
+                       // FIXME: this introduces popping artifacts when we 
reach 0.0
+                       interp_v3_v3v3(poseHead, pchan->pose_head, poseHead, 
tree->con->enforce);
+               }
+       }
        VECCOPY(poseMat[3], poseHead);
        
        /* finally, store the new transform */


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to