AnimFiltering Code Cleanups - Part 2
authorJoshua Leung <aligorith@gmail.com>
Tue, 21 Jun 2011 04:01:51 +0000 (04:01 +0000)
committerJoshua Leung <aligorith@gmail.com>
Tue, 21 Jun 2011 04:01:51 +0000 (04:01 +0000)
* Changed all int's to size_t's, where the int's were used for size of
channel list returned
* Object vs Base is now passed to filtering functions - was relic from
old owner/ownertype code which required access to bases
* Found bug in NLA code where filter was being overwritten and then
used again as input for some other function unintentionally
* Found bug where trying to select a NLA strip would crash if lamp
data was around

source/blender/editors/animation/anim_filter.c
source/blender/editors/include/ED_anim_api.h
source/blender/editors/space_action/action_draw.c
source/blender/editors/space_graph/graph_draw.c
source/blender/editors/space_graph/graph_utils.c
source/blender/editors/space_graph/space_graph.c
source/blender/editors/space_nla/nla_channels.c
source/blender/editors/space_nla/nla_draw.c
source/blender/editors/space_nla/nla_edit.c

index b42fc47b14c2655331890a40bb567ebaecba02ed..2343c73921c88c90f55b5468358b3f7b8c29740d 100644 (file)
@@ -349,7 +349,7 @@ short ANIM_animdata_get_context (const bContext *C, bAnimContext *ac)
  *     - ListBase anim_data;
  *     - bDopeSheet *ads;
  *     - bAnimListElem *ale;
- *     - int items;
+ *     - size_t items;
  *
  *     - id: ID block which should have an AnimData pointer following it immediately, to use
  *     - adtOk: line or block of code to execute for AnimData-blocks case (usually ANIMDATA_ADD_ANIMDATA)
@@ -756,7 +756,7 @@ static bAnimListElem *make_new_animlistelem (void *data, short datatype, ID *own
 /* 'Only Selected' selected data filtering
  * NOTE: when this function returns true, the F-Curve is to be skipped 
  */
-static int skip_fcurve_selected_data (bDopeSheet *ads, FCurve *fcu, ID *owner_id, int filter_mode)
+static size_t skip_fcurve_selected_data (bDopeSheet *ads, FCurve *fcu, ID *owner_id, int filter_mode)
 {
        if (GS(owner_id->name) == ID_OB) {
                Object *ob= (Object *)owner_id;
@@ -906,10 +906,10 @@ static FCurve *animdata_filter_fcurve_next (bDopeSheet *ads, FCurve *first, bAct
        return NULL;
 }
 
-static int animdata_filter_fcurves (ListBase *anim_data, bDopeSheet *ads, FCurve *first, bActionGroup *grp, int filter_mode, ID *owner_id)
+static size_t animdata_filter_fcurves (ListBase *anim_data, bDopeSheet *ads, FCurve *first, bActionGroup *grp, int filter_mode, ID *owner_id)
 {
        FCurve *fcu;
-       int items = 0;
+       size_t items = 0;
        
        /* loop over every F-Curve able to be included 
         *      - this for-loop works like this: 
@@ -934,12 +934,12 @@ static int animdata_filter_fcurves (ListBase *anim_data, bDopeSheet *ads, FCurve
        return items;
 }
 
-static int animdata_filter_action (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, bAction *act, int filter_mode, ID *owner_id)
+static size_t animdata_filter_action (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, bAction *act, int filter_mode, ID *owner_id)
 {
        bAnimListElem *ale=NULL;
        bActionGroup *agrp;
        FCurve *lastchan=NULL;
-       int items = 0;
+       size_t items = 0;
        
        /* don't include anything from this action if it is linked in from another file,
         * and we're getting stuff for editing...
@@ -1061,12 +1061,12 @@ static int animdata_filter_action (bAnimContext *ac, ListBase *anim_data, bDopeS
  *     - for normal filtering (i.e. for editing), we only need the NLA-tracks but they can be in 'normal' evaluation
  *       order, i.e. first to last. Otherwise, some tools may get screwed up.
  */
-static int animdata_filter_nla (bAnimContext *UNUSED(ac), ListBase *anim_data, bDopeSheet *UNUSED(ads), AnimData *adt, int filter_mode, ID *owner_id)
+static size_t animdata_filter_nla (bAnimContext *UNUSED(ac), ListBase *anim_data, bDopeSheet *UNUSED(ads), AnimData *adt, int filter_mode, ID *owner_id)
 {
        bAnimListElem *ale;
        NlaTrack *nlt;
        NlaTrack *first=NULL, *next=NULL;
-       int items = 0;
+       size_t items = 0;
        
        /* if showing channels, include active action */
        if (filter_mode & ANIMFILTER_CHANNELS) {
@@ -1131,10 +1131,10 @@ static int animdata_filter_nla (bAnimContext *UNUSED(ac), ListBase *anim_data, b
 }
 
 /* Include ShapeKey Data for ShapeKey Editor */
-static int animdata_filter_shapekey (bAnimContext *ac, ListBase *anim_data, Key *key, int filter_mode)
+static size_t animdata_filter_shapekey (bAnimContext *ac, ListBase *anim_data, Key *key, int filter_mode)
 {
        bAnimListElem *ale;
-       int items = 0;
+       size_t items = 0;
        
        /* check if channels or only F-Curves */
        if ((filter_mode & ANIMFILTER_CURVESONLY) == 0) {
@@ -1180,12 +1180,12 @@ static int animdata_filter_shapekey (bAnimContext *ac, ListBase *anim_data, Key
 
 /* Grab all Grase Pencil datablocks in file */
 // TODO: should this be amalgamated with the dopesheet filtering code?
-static int animdata_filter_gpencil (ListBase *anim_data, void *UNUSED(data), int filter_mode)
+static size_t animdata_filter_gpencil (ListBase *anim_data, void *UNUSED(data), int filter_mode)
 {
        bAnimListElem *ale;
        bGPdata *gpd;
        bGPDlayer *gpl;
-       int items = 0;
+       size_t items = 0;
        
        /* check if filtering types are appropriate */
        if (!(filter_mode & (ANIMFILTER_ACTGROUPED|ANIMFILTER_CURVESONLY)))
@@ -1232,12 +1232,12 @@ static int animdata_filter_gpencil (ListBase *anim_data, void *UNUSED(data), int
 }
 
 /* NOTE: owner_id is either material, lamp, or world block, which is the direct owner of the texture stack in question */
-static int animdata_filter_dopesheet_texs (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, ID *owner_id, int filter_mode)
+static size_t animdata_filter_dopesheet_texs (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, ID *owner_id, int filter_mode)
 {
-       MTex **mtex = NULL;
-       
        bAnimListElem *ale=NULL;
-       int items=0, a=0;
+       MTex **mtex = NULL;
+       size_t items=0;
+       int a=0;
        
        /* get datatype specific data first */
        if (owner_id == NULL)
@@ -1317,11 +1317,11 @@ static int animdata_filter_dopesheet_texs (bAnimContext *ac, ListBase *anim_data
        return items;
 }
 
-static int animdata_filter_dopesheet_mats (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, Base *base, int filter_mode)
+static size_t animdata_filter_dopesheet_mats (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, Object *ob, int filter_mode)
 {
        bAnimListElem *ale=NULL;
-       Object *ob= base->object;
-       int items=0, a=0;
+       size_t items=0;
+       int a=0;
        
        /* firstly check that we actuallly have some materials, by gathering all materials in a temp list */
        for (a=1; a <= ob->totcol; a++) {
@@ -1392,12 +1392,11 @@ static int animdata_filter_dopesheet_mats (bAnimContext *ac, ListBase *anim_data
        return items;
 }
 
-static int animdata_filter_dopesheet_particles (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, Base *base, int filter_mode)
+static size_t animdata_filter_dopesheet_particles (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, Object *ob, int filter_mode)
 {
        bAnimListElem *ale=NULL;
-       Object *ob= base->object;
        ParticleSystem *psys = ob->particlesystem.first;
-       int items= 0;
+       size_t items= 0;
 
        for(; psys; psys=psys->next) {
                short ok = 0;
@@ -1437,14 +1436,13 @@ static int animdata_filter_dopesheet_particles (bAnimContext *ac, ListBase *anim
        return items;
 }
 
-static int animdata_filter_dopesheet_obdata (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, Base *base, int filter_mode)
+static size_t animdata_filter_dopesheet_obdata (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, Object *ob, int filter_mode)
 {
        bAnimListElem *ale=NULL;
-       Object *ob= base->object;
        IdAdtTemplate *iat= ob->data;
        AnimData *adt= iat->adt;
        short type=0, expanded=0;
-       int items= 0;
+       size_t items= 0;
        
        /* get settings based on data type */
        switch (ob->type) {
@@ -1509,7 +1507,7 @@ static int animdata_filter_dopesheet_obdata (bAnimContext *ac, ListBase *anim_da
        }
        
        /* include data-expand widget? */
-       if ((filter_mode & ANIMFILTER_CURVESONLY) == 0) {       
+       if ((filter_mode & (ANIMFILTER_CURVESONLY|ANIMFILTER_NLATRACKS)) == 0) {        
                /* check if filtering by active status */
                if ANIMCHANNEL_ACTIVEOK(iat) {
                        ale= make_new_animlistelem(iat, type, (ID *)iat);
@@ -1542,14 +1540,14 @@ static int animdata_filter_dopesheet_obdata (bAnimContext *ac, ListBase *anim_da
        return items;
 }
 
-static int animdata_filter_dopesheet_ob (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, Base *base, int filter_mode)
+static size_t animdata_filter_dopesheet_ob (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, Base *base, int filter_mode)
 {
        bAnimListElem *ale=NULL;
        AnimData *adt = NULL;
        Object *ob= base->object;
        Key *key= ob_get_key(ob);
        short obdata_ok = 0;
-       int items = 0;
+       size_t items = 0;
        
        /* add this object as a channel first */
        if ((filter_mode & (ANIMFILTER_CURVESONLY|ANIMFILTER_NLATRACKS)) == 0) {
@@ -1674,7 +1672,7 @@ static int animdata_filter_dopesheet_ob (bAnimContext *ac, ListBase *anim_data,
 
        /* Materials? */
        if ((ob->totcol) && !(ads->filterflag & ADS_FILTER_NOMAT))
-               items += animdata_filter_dopesheet_mats(ac, anim_data, ads, base, filter_mode);
+               items += animdata_filter_dopesheet_mats(ac, anim_data, ads, ob, filter_mode);
        
        /* Object Data */
        switch (ob->type) {
@@ -1773,23 +1771,23 @@ static int animdata_filter_dopesheet_ob (bAnimContext *ac, ListBase *anim_data,
                        break;
        }
        if (obdata_ok) 
-               items += animdata_filter_dopesheet_obdata(ac, anim_data, ads, base, filter_mode);
+               items += animdata_filter_dopesheet_obdata(ac, anim_data, ads, ob, filter_mode);
 
        /* particles */
        if (ob->particlesystem.first && !(ads->filterflag & ADS_FILTER_NOPART))
-               items += animdata_filter_dopesheet_particles(ac, anim_data, ads, base, filter_mode);
+               items += animdata_filter_dopesheet_particles(ac, anim_data, ads, ob, filter_mode);
        
        /* return the number of items added to the list */
        return items;
 }      
 
-static int animdata_filter_dopesheet_scene (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, Scene *sce, int filter_mode)
+static size_t animdata_filter_dopesheet_scene (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, Scene *sce, int filter_mode)
 {
        World *wo= sce->world;
        bNodeTree *ntree= sce->nodetree;
        AnimData *adt= NULL;
        bAnimListElem *ale;
-       int items = 0;
+       size_t items = 0;
        
        /* add scene as a channel first (even if we aren't showing scenes we still need to show the scene's sub-data */
        if ((filter_mode & (ANIMFILTER_CURVESONLY|ANIMFILTER_NLATRACKS)) == 0) {
@@ -1951,12 +1949,12 @@ static int animdata_filter_dopesheet_scene (bAnimContext *ac, ListBase *anim_dat
 }
 
 // TODO: implement pinning... (if and when pinning is done, what we need to do is to provide freeing mechanisms - to protect against data that was deleted)
-static int animdata_filter_dopesheet (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, int filter_mode)
+static size_t animdata_filter_dopesheet (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, int filter_mode)
 {
        Scene *sce= (Scene *)ads->source;
        Base *base;
        bAnimListElem *ale;
-       int items = 0;
+       size_t items = 0;
        
        /* check that we do indeed have a scene */
        if ((ads->source == NULL) || (GS(ads->source->name)!=ID_SCE)) {
@@ -2348,7 +2346,7 @@ static int animdata_filter_dopesheet (bAnimContext *ac, ListBase *anim_data, bDo
 /* Summary track for DopeSheet/Action Editor 
  *     - return code is whether the summary lets the other channels get drawn
  */
-static short animdata_filter_dopesheet_summary (bAnimContext *ac, ListBase *anim_data, int filter_mode, int *items)
+static short animdata_filter_dopesheet_summary (bAnimContext *ac, ListBase *anim_data, int filter_mode, size_t *items)
 {
        bDopeSheet *ads = NULL;
        
@@ -2392,10 +2390,10 @@ static short animdata_filter_dopesheet_summary (bAnimContext *ac, ListBase *anim
 /* ----------- Cleanup API --------------- */
 
 /* Remove entries with invalid types in animation channel list */
-static int animdata_filter_remove_invalid (ListBase *anim_data)
+static size_t animdata_filter_remove_invalid (ListBase *anim_data)
 {
        bAnimListElem *ale, *next;
-       int items = 0;
+       size_t items = 0;
        
        /* only keep entries with valid types */
        for (ale= anim_data->first; ale; ale= next) {
@@ -2411,11 +2409,11 @@ static int animdata_filter_remove_invalid (ListBase *anim_data)
 }
 
 /* Remove duplicate entries in animation channel list */
-static int animdata_filter_remove_duplis (ListBase *anim_data)
+static size_t animdata_filter_remove_duplis (ListBase *anim_data)
 {
        bAnimListElem *ale, *next;
        GHash *gh;
-       int items = 0;
+       size_t items = 0;
        
        /* build new hashtable to efficiently store and retrieve which entries have been 
         * encountered already while searching
@@ -2457,9 +2455,9 @@ static int animdata_filter_remove_duplis (ListBase *anim_data)
  *             will be placed for use.
  *     filter_mode: how should the data be filtered - bitmapping accessed flags
  */
-int ANIM_animdata_filter (bAnimContext *ac, ListBase *anim_data, int filter_mode, void *data, short datatype)
+size_t ANIM_animdata_filter (bAnimContext *ac, ListBase *anim_data, int filter_mode, void *data, short datatype)
 {
-       int items = 0;
+       size_t items = 0;
        
        /* only filter data if there's somewhere to put it */
        if (data && anim_data) {
index a8836458fad9f82a1d39aeffb35d01900f499f74..be46c237e802ce39fa0fdcf54f5dec348c4a5794 100644 (file)
@@ -299,7 +299,7 @@ typedef enum eAnimFilter_Flags {
 /* Obtain list of filtered Animation channels to operate on.
  * Returns the number of channels in the list
  */
-int ANIM_animdata_filter(bAnimContext *ac, ListBase *anim_data, int filter_mode, void *data, short datatype);
+size_t ANIM_animdata_filter(bAnimContext *ac, ListBase *anim_data, int filter_mode, void *data, short datatype);
 
 /* Obtain current anim-data context from Blender Context info.
  * Returns whether the operation was successful. 
index 1b8a1778707e6760e0c32ade9155fb0665ec711e..760db5dd133dbb23a8dda872428bba7fe1ab0458 100644 (file)
@@ -77,7 +77,8 @@ void draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
        
        View2D *v2d= &ar->v2d;
        float y= 0.0f;
-       int items, height;
+       size_t items;
+       int height;
        
        /* build list of channels to draw */
        filter= (ANIMFILTER_VISIBLE|ANIMFILTER_CHANNELS);
@@ -166,7 +167,8 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
        AnimData *adt= NULL;
        
        float act_start, act_end, y;
-       int height, items;
+       size_t items;
+       int height;
        
        unsigned char col1[3], col2[3];
        unsigned char col1a[3], col2a[3];
index 382bb71a5926060e1050dddd0c0b61fd03076158..73ecea8e31efbd8f28e0bfcc5d3bf794665ae2ec 100644 (file)
@@ -964,7 +964,8 @@ void graph_draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
        
        View2D *v2d= &ar->v2d;
        float y= 0.0f, height;
-       int items, i=0;
+       size_t items;
+       int i=0;
        
        /* build list of channels to draw */
        filter= (ANIMFILTER_VISIBLE|ANIMFILTER_CHANNELS);
index e4509a29a91910ecf40a49f4332aa133a96747df..e20b4593fa9d528f492a0fdba62a1ed776c7691a 100644 (file)
@@ -70,7 +70,7 @@ bAnimListElem *get_active_fcurve_channel (bAnimContext *ac)
 {
        ListBase anim_data = {NULL, NULL};
        int filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_ACTIVE | ANIMFILTER_CURVESONLY);
-       int items = ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+       size_t items = ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
        
        /* We take the first F-Curve only, since some other ones may have had 'active' flag set
         * if they were from linked data.
@@ -99,7 +99,8 @@ int graphop_visible_keyframes_poll (bContext *C)
        bAnimListElem *ale;
        ListBase anim_data = {NULL, NULL};
        ScrArea *sa= CTX_wm_area(C);
-       int filter, items;
+       size_t items;
+       int filter;
        short found = 0;
        
        /* firstly, check if in Graph Editor */
@@ -147,7 +148,8 @@ int graphop_editable_keyframes_poll (bContext *C)
        bAnimListElem *ale;
        ListBase anim_data = {NULL, NULL};
        ScrArea *sa= CTX_wm_area(C);
-       int filter, items;
+       size_t items;
+       int filter;
        short found = 0;
        
        /* firstly, check if in Graph Editor */
@@ -230,7 +232,8 @@ int graphop_selected_fcurve_poll (bContext *C)
        bAnimContext ac;
        ListBase anim_data = {NULL, NULL};
        ScrArea *sa= CTX_wm_area(C);
-       int filter, items;
+       size_t items;
+       int filter;
        
        /* firstly, check if in Graph Editor */
        // TODO: also check for region?
index 883b476f3721e5c44bc525624d963fc089ef10cf..24e196749a85d8180316ef8d130cc29ba97a818e 100644 (file)
@@ -513,8 +513,9 @@ static void graph_refresh(const bContext *C, ScrArea *sa)
        if (ANIM_animdata_get_context(C, &ac)) {
                ListBase anim_data = {NULL, NULL};
                bAnimListElem *ale;
+               size_t items;
                int filter;
-               int items, i;
+               int i;
                
                /* build list of F-Curves which will be visible as channels in channel-region
                 *      - we don't include ANIMFILTER_CURVEVISIBLE filter, as that will result in a 
index 38f680fff07f07feffb0dcdd067469636bde0f9b..be050dded458189a85f1b1f4b51be8228b01b3c5 100644 (file)
@@ -81,13 +81,14 @@ static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, sho
        ListBase anim_data = {NULL, NULL};
        bAnimListElem *ale;
        int filter;
+       
        View2D *v2d= &ac->ar->v2d;
        int notifierFlags = 0;
        
        /* get the channel that was clicked on */
                /* filter channels */
        filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS);
-       filter= ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+       ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
        
                /* get channel from index */
        ale= BLI_findlink(&anim_data, channel_index);
index c4a3a2324b422ae972462be48591aedd58bd068a..c53eac78b197dc67b1aac633599a956896d5fb53 100644 (file)
@@ -470,7 +470,8 @@ void draw_nla_main_data (bAnimContext *ac, SpaceNla *snla, ARegion *ar)
        
        View2D *v2d= &ar->v2d;
        float y= 0.0f;
-       int items, height;
+       size_t items;
+       int height;
        
        /* build list of channels to draw */
        filter= (ANIMFILTER_VISIBLE|ANIMFILTER_CHANNELS);
@@ -828,7 +829,8 @@ void draw_nla_channel_list (bContext *C, bAnimContext *ac, ARegion *ar)
        
        View2D *v2d= &ar->v2d;
        float y= 0.0f;
-       int items, height;
+       size_t items;
+       int height;
        
        /* build list of channels to draw */
        filter= (ANIMFILTER_VISIBLE|ANIMFILTER_CHANNELS);
index 77c91b28a634215718df8bed19cd293598b453d1..08607e6183b24531afd61da592cc9d46a5b4cadb 100644 (file)
@@ -250,7 +250,8 @@ static int nlaedit_add_actionclip_exec (bContext *C, wmOperator *op)
        
        ListBase anim_data = {NULL, NULL};
        bAnimListElem *ale;
-       int filter, items;
+       size_t items;
+       int filter;
 
        bAction *act;