diff options
author | Joshua Leung <aligorith@gmail.com> | 2009-05-30 16:40:07 +0400 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2009-05-30 16:40:07 +0400 |
commit | 2e85686fe379f99c27944e3e4b5842d89e620f3b (patch) | |
tree | 3fdd912259c00df30c88b88efc57f783d3cf2be8 /source | |
parent | aa4d64d7ff17d4557acd74540914de872a32ba81 (diff) |
NLA SoC: Fixes (UI, evaluation?)
* Fixed some bugs which meant that NLA-strips weren't getting drawn
* Removed some debugging code
* Fixed bug with Action-line disappearing after 'pushing down' actions
* Fixed bug where Objects with no animation data showed up in NLA
* Tried fixing a bug where NLA-strips were evaluated erratically. I have a feeling that there are some rounding errors I'll need to pay more attention to somewhere :/
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/anim_sys.c | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/nla.c | 3 | ||||
-rw-r--r-- | source/blender/editors/animation/anim_filter.c | 12 | ||||
-rw-r--r-- | source/blender/editors/space_nla/nla_draw.c | 63 |
4 files changed, 47 insertions, 37 deletions
diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index f21fed416cc..652f733d553 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -627,14 +627,14 @@ static float nlastrip_get_influence (NlaStrip *strip, float cframe) strip->blendout= (float)fabs(strip->blendout); /* result depends on where frame is in respect to blendin/out values */ - // TODO: are the fabs() tests needed here? + // the +0.0001 factors are to combat rounding errors if (IS_EQ(strip->blendin, 0)==0 && (cframe <= (strip->start + strip->blendin))) { /* there is some blend-in */ - return (float)fabs(cframe - strip->start) / (strip->blendin); + return (float)(fabs(cframe - strip->start) + 0.0001) / (strip->blendin); } else if (IS_EQ(strip->blendout, 0)==0 && (cframe >= (strip->end - strip->blendout))) { /* there is some blend-out */ - return (float)fabs(strip->end - cframe) / (strip->blendout); + return (float)(fabs(strip->end - cframe) + 0.0001) / (strip->blendout); } else { /* in the middle of the strip, we should be full strength */ diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c index 3356f599c59..62500af85ff 100644 --- a/source/blender/blenkernel/intern/nla.c +++ b/source/blender/blenkernel/intern/nla.c @@ -452,9 +452,6 @@ void BKE_nla_action_pushdown (AnimData *adt) adt->action= NULL; } - // TEMP DEBUG... - printf("BKE_nla_action_pushdown(): NLA strip added.. done \n"); - // TODO: set any other flags necessary here... } diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c index f1f2a31b9b1..ed526bd99a0 100644 --- a/source/blender/editors/animation/anim_filter.c +++ b/source/blender/editors/animation/anim_filter.c @@ -722,8 +722,12 @@ static int animdata_filter_nla (ListBase *anim_data, AnimData *adt, int filter_m /* there isn't really anything editable here, so skip if need editable */ // TODO: currently, selection isn't checked since it doesn't matter if ((filter_mode & ANIMFILTER_FOREDIT) == 0) { - /* just add the action track now */ - ale= make_new_animlistelem(adt->action, ANIMTYPE_NLAACTION, owner, ownertype, owner_id); + /* just add the action track now (this MUST appear for drawing) + * - as AnimData may not have an action, we pass a dummy pointer just to get the list elem created, then + * overwrite this with the real value - REVIEW THIS... + */ + ale= make_new_animlistelem((void *)(&adt->action), ANIMTYPE_NLAACTION, owner, ownertype, owner_id); + ale->data= (adt->action) ? adt->action : NULL; if (ale) { BLI_addtail(anim_data, ale); @@ -1388,6 +1392,8 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int /* check filters for datatypes */ /* object */ + actOk= 0; + keyOk= 0; ANIMDATA_FILTER_CASES(ob, actOk= 1;, actOk= 1;, @@ -1427,6 +1433,7 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int case OB_CAMERA: /* ------- Camera ------------ */ { Camera *ca= (Camera *)ob->data; + dataOk= 0; ANIMDATA_FILTER_CASES(ca, dataOk= !(ads->filterflag & ADS_FILTER_NOCAM);, dataOk= !(ads->filterflag & ADS_FILTER_NOCAM);, @@ -1436,6 +1443,7 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int case OB_LAMP: /* ---------- Lamp ----------- */ { Lamp *la= (Lamp *)ob->data; + dataOk= 0; ANIMDATA_FILTER_CASES(la, dataOk= !(ads->filterflag & ADS_FILTER_NOLAM);, dataOk= !(ads->filterflag & ADS_FILTER_NOLAM);, diff --git a/source/blender/editors/space_nla/nla_draw.c b/source/blender/editors/space_nla/nla_draw.c index 8ff9522358c..28572704302 100644 --- a/source/blender/editors/space_nla/nla_draw.c +++ b/source/blender/editors/space_nla/nla_draw.c @@ -81,14 +81,13 @@ /* XXX */ extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad); +extern void gl_round_box_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown); /* *********************************************** */ /* Strips */ -static void nla_draw_strip (NlaTrack *nlt, NlaStrip *strip, int index, View2D *v2d, float yminc, float ymaxc) +static void nla_draw_strip (NlaTrack *nlt, NlaStrip *strip, View2D *v2d, float yminc, float ymaxc) { - char name[128]; - /* draw extrapolation info first (as backdrop) */ // TODO... @@ -115,7 +114,7 @@ static void nla_draw_strip (NlaTrack *nlt, NlaStrip *strip, int index, View2D *v UI_ThemeColor(TH_STRIP); } uiSetRoundBox(15); /* all corners rounded */ - gl_round_box(GL_POLYGON, strip->start, yminc, strip->end, ymaxc, 9); + gl_round_box_shade(GL_POLYGON, strip->start, yminc, strip->end, ymaxc, 0.0, 0.5, 0.1); /* draw strip outline */ if (strip->flag & NLASTRIP_FLAG_ACTIVE) { @@ -126,16 +125,7 @@ static void nla_draw_strip (NlaTrack *nlt, NlaStrip *strip, int index, View2D *v /* strip should appear to stand out, so draw a dark border around it */ glColor3f(0.0f, 0.0f, 0.0f); } - gl_round_box(GL_LINES, strip->start, yminc, strip->end, ymaxc, 9); - - /* draw some identifying info on the strip (index and name of action if there's room) */ - // XXX for now, just the index - if (strip->flag & NLASTRIP_FLAG_SELECT) - UI_ThemeColor(TH_TEXT_HI); - else - UI_ThemeColor(TH_TEXT); - sprintf(name, "%d |", index); - UI_DrawString(strip->start, yminc+8, name); + gl_round_box_shade(GL_LINE_LOOP, strip->start, yminc, strip->end, ymaxc, 0.0, 0.0, 0.1); } /* ---------------------- */ @@ -147,6 +137,7 @@ void draw_nla_main_data (bAnimContext *ac, SpaceNla *snla, ARegion *ar) int filter; View2D *v2d= &ar->v2d; + float viewWidth = v2d->cur.xmax - v2d->cur.xmin; float y= 0.0f; int items, height; @@ -185,19 +176,33 @@ void draw_nla_main_data (bAnimContext *ac, SpaceNla *snla, ARegion *ar) { NlaTrack *nlt= (NlaTrack *)ale->data; NlaStrip *strip; - int index; /* draw backdrop? */ // TODO... /* draw each strip in the track */ - for (strip=nlt->strips.first, index=1; strip; strip= strip->next, index++) { - /* only draw if at least part of the strip is within view */ - if ( IN_RANGE(v2d->cur.xmin, strip->start, strip->end) || - IN_RANGE(v2d->cur.xmax, strip->start, strip->end) ) + for (strip=nlt->strips.first; strip; strip= strip->next) { + float stripLen= strip->end - strip->start; + + /* only draw if at least part of the strip is within view + * - first 2 cases cover when the strip length is less than the viewable area + * - second 2 cases cover when the strip length is greater than the viewable area + */ + if ( (stripLen < viewWidth) && + !(IN_RANGE(strip->start, v2d->cur.xmin, v2d->cur.xmax) || + IN_RANGE(strip->end, v2d->cur.xmin, v2d->cur.xmax)) ) { - nla_draw_strip(nlt, strip, index, v2d, yminc, ymaxc); + continue; } + if ( (stripLen > viewWidth) && + !(IN_RANGE(v2d->cur.xmin, strip->start, strip->end) || + IN_RANGE(v2d->cur.xmax, strip->start, strip->end)) ) + { + continue; + } + + /* we're still here, so ok... */ + nla_draw_strip(nlt, strip, v2d, yminc, ymaxc); } } break; @@ -521,7 +526,7 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) /* object channel - darker */ UI_ThemeColor(TH_DOPESHEET_CHANNELOB); uiSetRoundBox((expand == ICON_TRIA_UP)? (8):(1|8)); - gl_round_box(GL_POLYGON, x+offset, yminc, (float)NLACHANNEL_NAMEWIDTH, ymaxc, 8); + gl_round_box(GL_POLYGON, x+offset, yminc, (float)NLACHANNEL_NAMEWIDTH, ymaxc, 10); } else { /* sub-object folders - lighter */ @@ -547,7 +552,7 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) glColor3f(0.6f, 0.5f, 0.5f); // greyish-red color - hardcoded for now offset += 7 * indent; - uiSetRoundBox(15); + uiSetRoundBox((1|2)); // only on top two corners, to show that this channel sits on top of the preceeding ones gl_round_box(GL_POLYGON, x+offset, yminc, (float)NLACHANNEL_NAMEWIDTH, ymaxc, 8); /* clear group value, otherwise we cause errors... */ @@ -610,16 +615,16 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) UI_icon_draw((float)(NLACHANNEL_NAMEWIDTH-offset), ydatac, mute); } - /* draw action 'push-down' */ - if (ale->type == ANIMTYPE_NLAACTION) { + /* draw action 'push-down' - only for NLA-Action lines, and only when there's an action */ + if ((ale->type == ANIMTYPE_NLAACTION) && (ale->data)) { offset += 16; /* XXX firstly draw a little rect to help identify that it's different from the toggles */ - glBegin(GL_LINES); - glVertex2f((float)NLACHANNEL_NAMEWIDTH-offset-1, y-7); - glVertex2f((float)NLACHANNEL_NAMEWIDTH-offset-1, y+7); - glVertex2f((float)NLACHANNEL_NAMEWIDTH-1, y-7); - glVertex2f((float)NLACHANNEL_NAMEWIDTH-1, y+7); + glBegin(GL_LINE_LOOP); + glVertex2f((float)NLACHANNEL_NAMEWIDTH-offset-1, y-8); + glVertex2f((float)NLACHANNEL_NAMEWIDTH-offset-1, y+8); + glVertex2f((float)NLACHANNEL_NAMEWIDTH-1, y-8); + glVertex2f((float)NLACHANNEL_NAMEWIDTH-1, y+8); glEnd(); // GL_LINES /* now draw the icon */ |