Revision: 20824
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20824
Author:   aligorith
Date:     2009-06-12 04:49:21 +0200 (Fri, 12 Jun 2009)

Log Message:
-----------
NLA SoC: Fixes for crashes when selecting keyframes in object channels in 
DopeSheet

Modified Paths:
--------------
    branches/soc-2009-aligorith/source/blender/editors/animation/anim_filter.c
    
branches/soc-2009-aligorith/source/blender/editors/animation/keyframes_edit.c
    
branches/soc-2009-aligorith/source/blender/editors/space_action/action_select.c

Modified: 
branches/soc-2009-aligorith/source/blender/editors/animation/anim_filter.c
===================================================================
--- branches/soc-2009-aligorith/source/blender/editors/animation/anim_filter.c  
2009-06-12 02:29:38 UTC (rev 20823)
+++ branches/soc-2009-aligorith/source/blender/editors/animation/anim_filter.c  
2009-06-12 02:49:21 UTC (rev 20824)
@@ -1095,17 +1095,6 @@
                ANIMDATA_FILTER_CASES(ob,
                        { /* AnimData blocks - do nothing... */ },
                        { /* nla */
-#if 0
-                               /* include nla-expand widget? */
-                               if ((filter_mode & ANIMFILTER_CHANNELS) && 
!(filter_mode & ANIMFILTER_NLATRACKS)) {
-                                       ale= make_new_animlistelem(adt->action, 
ANIMTYPE_FILLNLA, base, ANIMTYPE_OBJECT, (ID *)ob);
-                                       if (ale) {
-                                               BLI_addtail(anim_data, ale);
-                                               items++;
-                                       }
-                               }
-#endif
-                               
                                /* add NLA tracks */
                                items += animdata_filter_nla(anim_data, adt, 
filter_mode, ob, ANIMTYPE_OBJECT, (ID *)ob);
                        },
@@ -1141,7 +1130,7 @@
                                        items += 
animdata_filter_action(anim_data, adt->action, filter_mode, ob, 
ANIMTYPE_OBJECT, (ID *)ob); 
                                }
                        }
-               )
+               );
        }
        
        
@@ -1151,17 +1140,6 @@
                ANIMDATA_FILTER_CASES(key,
                        { /* AnimData blocks - do nothing... */ },
                        { /* nla */
-#if 0
-                               /* include nla-expand widget? */
-                               if ((filter_mode & ANIMFILTER_CHANNELS) && 
!(filter_mode & ANIMFILTER_NLATRACKS)) {
-                                       ale= make_new_animlistelem(adt->action, 
ANIMTYPE_FILLNLA, base, ANIMTYPE_OBJECT, (ID *)ob);
-                                       if (ale) {
-                                               BLI_addtail(anim_data, ale);
-                                               items++;
-                                       }
-                               }
-#endif
-                               
                                /* add NLA tracks */
                                items += animdata_filter_nla(anim_data, adt, 
filter_mode, ob, ANIMTYPE_OBJECT, (ID *)ob);
                        },
@@ -1195,7 +1173,7 @@
                                        items += 
animdata_filter_shapekey(anim_data, key, filter_mode, ob, ANIMTYPE_OBJECT, (ID 
*)ob);
                                }
                        }
-               )
+               );
        }
 
        /* Materials? */
@@ -1280,17 +1258,6 @@
                ANIMDATA_FILTER_CASES(sce,
                        { /* AnimData blocks - do nothing... */ },
                        { /* nla */
-#if 0
-                               /* include nla-expand widget? */
-                               if ((filter_mode & ANIMFILTER_CHANNELS) && 
!(filter_mode & ANIMFILTER_NLATRACKS)) {
-                                       ale= make_new_animlistelem(adt->action, 
ANIMTYPE_FILLNLA, base, ANIMTYPE_SCENE (ID *)sce);
-                                       if (ale) {
-                                               BLI_addtail(anim_data, ale);
-                                               items++;
-                                       }
-                               }
-#endif
-                               
                                /* add NLA tracks */
                                items += animdata_filter_nla(anim_data, adt, 
filter_mode, sce, ANIMTYPE_SCENE, (ID *)sce);
                        },
@@ -1334,17 +1301,6 @@
                ANIMDATA_FILTER_CASES(wo,
                        { /* AnimData blocks - do nothing... */ },
                        { /* nla */
-#if 0
-                               /* include nla-expand widget? */
-                               if ((filter_mode & ANIMFILTER_CHANNELS) && 
!(filter_mode & ANIMFILTER_NLATRACKS)) {
-                                       ale= make_new_animlistelem(adt->action, 
ANIMTYPE_FILLNLA, base, ANIMTYPE_DSWOR (ID *)wo);
-                                       if (ale) {
-                                               BLI_addtail(anim_data, ale);
-                                               items++;
-                                       }
-                               }
-#endif
-                               
                                /* add NLA tracks */
                                items += animdata_filter_nla(anim_data, adt, 
filter_mode, wo, ANIMTYPE_DSWOR, (ID *)wo);
                        },

Modified: 
branches/soc-2009-aligorith/source/blender/editors/animation/keyframes_edit.c
===================================================================
--- 
branches/soc-2009-aligorith/source/blender/editors/animation/keyframes_edit.c   
    2009-06-12 02:29:38 UTC (rev 20823)
+++ 
branches/soc-2009-aligorith/source/blender/editors/animation/keyframes_edit.c   
    2009-06-12 02:49:21 UTC (rev 20824)
@@ -128,6 +128,10 @@
 {
        FCurve *fcu;
        
+       /* sanity check */
+       if (agrp == NULL)
+               return 0;
+       
        /* only iterate over the F-Curves that are in this group */
        for (fcu= agrp->channels.first; fcu && fcu->grp==agrp; fcu= fcu->next) {
                if (ANIM_fcurve_keys_bezier_loop(bed, fcu, bezt_ok, bezt_cb, 
fcu_cb))
@@ -142,6 +146,10 @@
 {
        FCurve *fcu;
        
+       /* sanity check */
+       if (act == NULL)
+               return 0;
+       
        /* just loop through all F-Curves */
        for (fcu= act->curves.first; fcu; fcu= fcu->next) {
                if (ANIM_fcurve_keys_bezier_loop(bed, fcu, bezt_ok, bezt_cb, 
fcu_cb))
@@ -154,6 +162,10 @@
 /* This function is used to loop over the keyframe data of an AnimData block */
 static short adt_keys_bezier_loop(BeztEditData *bed, AnimData *adt, 
BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb, int filterflag)
 {
+       /* sanity check */
+       if (adt == NULL)
+               return 0;
+       
        /* drivers or actions? */
        if (filterflag & ADS_FILTER_ONLYDRIVERS) {
                FCurve *fcu;
@@ -178,6 +190,10 @@
 {
        Key *key= ob_get_key(ob);
        
+       /* sanity check */
+       if (ob == NULL)
+               return 0;
+       
        /* firstly, Object's own AnimData */
        if (ob->adt) 
                adt_keys_bezier_loop(bed, ob->adt, bezt_ok, bezt_cb, fcu_cb, 
filterflag);
@@ -194,8 +210,12 @@
 /* This function is used to loop over the keyframe data in a Scene */
 static short scene_keys_bezier_loop(BeztEditData *bed, Scene *sce, 
BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb, int filterflag)
 {
-       World *wo= sce->world;
+       World *wo= (sce) ? sce->world : NULL;
        
+       /* sanity check */
+       if (sce == NULL)
+               return 0;
+       
        /* Scene's own animation */
        if (sce->adt)
                adt_keys_bezier_loop(bed, sce->adt, bezt_ok, bezt_cb, fcu_cb, 
filterflag);
@@ -231,7 +251,7 @@
                        return act_keys_bezier_loop(bed, (bAction *)ale->data, 
bezt_ok, bezt_cb, fcu_cb);
                        
                case ALE_OB: /* object */
-                       return ob_keys_bezier_loop(bed, (Object *)ale->data, 
bezt_ok, bezt_cb, fcu_cb, filterflag);
+                       return ob_keys_bezier_loop(bed, (Object 
*)ale->key_data, bezt_ok, bezt_cb, fcu_cb, filterflag);
                case ALE_SCE: /* scene */
                        return scene_keys_bezier_loop(bed, (Scene *)ale->data, 
bezt_ok, bezt_cb, fcu_cb, filterflag);
        }

Modified: 
branches/soc-2009-aligorith/source/blender/editors/space_action/action_select.c
===================================================================
--- 
branches/soc-2009-aligorith/source/blender/editors/space_action/action_select.c 
    2009-06-12 02:29:38 UTC (rev 20823)
+++ 
branches/soc-2009-aligorith/source/blender/editors/space_action/action_select.c 
    2009-06-12 02:49:21 UTC (rev 20824)
@@ -858,17 +858,19 @@
                        ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, 
ACHANNEL_SETFLAG_CLEAR);
                        
                        /* Highlight Action-Group or F-Curve? */
-                       if (ale->type == ANIMTYPE_GROUP) {
-                               bActionGroup *agrp= ale->data;
-                               
-                               agrp->flag |= AGRP_SELECTED;
-                               ANIM_set_active_channel(ac, ac->data, 
ac->datatype, filter, agrp, ANIMTYPE_GROUP);
-                       }       
-                       else if (ale->type == ANIMTYPE_FCURVE) {
-                               FCurve *fcu= ale->data;
-                               
-                               fcu->flag |= FCURVE_SELECTED;
-                               ANIM_set_active_channel(ac, ac->data, 
ac->datatype, filter, fcu, ANIMTYPE_FCURVE);
+                       if (ale && ale->data) {
+                               if (ale->type == ANIMTYPE_GROUP) {
+                                       bActionGroup *agrp= ale->data;
+                                       
+                                       agrp->flag |= AGRP_SELECTED;
+                                       ANIM_set_active_channel(ac, ac->data, 
ac->datatype, filter, agrp, ANIMTYPE_GROUP);
+                               }       
+                               else if (ale->type == ANIMTYPE_FCURVE) {
+                                       FCurve *fcu= ale->data;
+                                       
+                                       fcu->flag |= FCURVE_SELECTED;
+                                       ANIM_set_active_channel(ac, ac->data, 
ac->datatype, filter, fcu, ANIMTYPE_FCURVE);
+                               }
                        }
                }
                else if (ac->datatype == ANIMCONT_GPENCIL) {
@@ -881,7 +883,7 @@
        }
        
        /* only select keyframes if we clicked on a valid channel and hit 
something */
-       if (ale) {
+       if (ale && found) {
                /* apply selection to keyframes */
                if (/*gpl*/0) {
                        /* grease pencil */


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

Reply via email to