Revision: 41612
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41612
Author:   aligorith
Date:     2011-11-07 13:25:17 +0000 (Mon, 07 Nov 2011)
Log Message:
-----------
Bugfix [#29064] armature with curve contraint - crash

Spline IK and Auto-IK working together on the same bone chain could
crash due to the somewhat hacky way that they were sharing the same
list for the "iktree" forest. Resolved by doing what I should have
done from the beginning, and made Spline-IK save its ik chains off
into a separate list.

While this fixes the crash, it might be worth investigating outright
disabling this from working in this case, since it can be a bit
confusing to have it appear to not work.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/armature.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/ikplugin/intern/iksolver_plugin.c
    trunk/blender/source/blender/makesdna/DNA_action_types.h

Modified: trunk/blender/source/blender/blenkernel/intern/armature.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/armature.c   2011-11-07 
12:56:05 UTC (rev 41611)
+++ trunk/blender/source/blender/blenkernel/intern/armature.c   2011-11-07 
13:25:17 UTC (rev 41612)
@@ -1818,7 +1818,7 @@
                tree->ikData= ikData;
                
                /* AND! link the tree to the root */
-               BLI_addtail(&pchanRoot->iktree, tree);
+               BLI_addtail(&pchanRoot->siktree, tree);
        }
        
        /* mark root channel having an IK tree */
@@ -2045,27 +2045,24 @@
        tSplineIK_Tree *tree;
        
        /* for each pose-tree, execute it if it is spline, otherwise just free 
it */
-       for (tree= pchan_root->iktree.first; tree; tree= 
pchan_root->iktree.first) {
-               /* only evaluate if tagged for Spline IK */
-               if (tree->type == CONSTRAINT_TYPE_SPLINEIK) {
-                       int i;
-                       
-                       /* walk over each bone in the chain, calculating the 
effects of spline IK
-                        *      - the chain is traversed in the opposite order 
to storage order (i.e. parent to children)
-                        *        so that dependencies are correct
-                        */
-                       for (i= tree->chainlen-1; i >= 0; i--) {
-                               bPoseChannel *pchan= tree->chain[i];
-                               splineik_evaluate_bone(tree, scene, ob, pchan, 
i, ctime);
-                       }
-                       
-                       /* free the tree info specific to SplineIK trees now */
-                       if (tree->chain) MEM_freeN(tree->chain);
-                       if (tree->free_points) MEM_freeN(tree->points);
+       while ((tree = pchan_root->siktree.first) != NULL) {
+               int i;
+               
+               /* walk over each bone in the chain, calculating the effects of 
spline IK
+                *      - the chain is traversed in the opposite order to 
storage order (i.e. parent to children)
+                *        so that dependencies are correct
+                */
+               for (i= tree->chainlen-1; i >= 0; i--) {
+                       bPoseChannel *pchan= tree->chain[i];
+                       splineik_evaluate_bone(tree, scene, ob, pchan, i, 
ctime);
                }
                
+               /* free the tree info specific to SplineIK trees now */
+               if (tree->chain) MEM_freeN(tree->chain);
+               if (tree->free_points) MEM_freeN(tree->points);
+               
                /* free this tree */
-               BLI_freelinkN(&pchan_root->iktree, tree);
+               BLI_freelinkN(&pchan_root->siktree, tree);
        }
 }
 

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c   2011-11-07 
12:56:05 UTC (rev 41611)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c   2011-11-07 
13:25:17 UTC (rev 41612)
@@ -4064,6 +4064,7 @@
                        direct_link_motionpath(fd, pchan->mpath);
                
                pchan->iktree.first= pchan->iktree.last= NULL;
+               pchan->siktree.first= pchan->siktree.last= NULL;
                
                /* incase this value changes in future, clamp else we get 
undefined behavior */
                CLAMP(pchan->rotmode, ROT_MODE_MIN, ROT_MODE_MAX);

Modified: trunk/blender/source/blender/ikplugin/intern/iksolver_plugin.c
===================================================================
--- trunk/blender/source/blender/ikplugin/intern/iksolver_plugin.c      
2011-11-07 12:56:05 UTC (rev 41611)
+++ trunk/blender/source/blender/ikplugin/intern/iksolver_plugin.c      
2011-11-07 13:25:17 UTC (rev 41612)
@@ -526,12 +526,14 @@
                
                /* 6. apply the differences to the channels, 
                          we need to calculate the original differences first */
-               for(a=0; a<tree->totchannel; a++)
+               for(a=0; a<tree->totchannel; a++) {
                        make_dmats(tree->pchan[a]);
+               }
                
-               for(a=0; a<tree->totchannel; a++)
+               for(a=0; a<tree->totchannel; a++) {
                        /* sets POSE_DONE */
                        where_is_ik_bone(tree->pchan[a], tree->basis_change[a]);
+               }
                
                /* 7. and free */
                BLI_remlink(&pchan->iktree, tree);

Modified: trunk/blender/source/blender/makesdna/DNA_action_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_action_types.h    2011-11-07 
12:56:05 UTC (rev 41611)
+++ trunk/blender/source/blender/makesdna/DNA_action_types.h    2011-11-07 
13:25:17 UTC (rev 41612)
@@ -198,8 +198,10 @@
        struct Bone                     *bone;          /* set on read file or 
rebuild pose */
        struct bPoseChannel *parent;    /* set on read file or rebuild pose */
        struct bPoseChannel *child;             /* set on read file or rebuild 
pose, the 'ik' child, for b-bones */
-       struct ListBase          iktree;                /* only while 
evaluating pose */
        
+       struct ListBase          iktree;                /* "IK trees" - only 
while evaluating pose */
+       struct ListBase         siktree;                /* Spline-IK "trees" - 
only while evaluating pose */
+       
        bMotionPath *mpath;                             /* motion path cache 
for this bone */
        struct Object *custom;                  /* draws custom object instead 
of default bone shape */
        struct bPoseChannel *custom_tx; /* odd feature, display with another 
bones transform. needed in rare cases for advanced rigs, since the alternative 
is highly complicated - campbell */

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

Reply via email to