From e2eaf269350d972daec1f19ae5aa5ee7fbad4685 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 25 Aug 2009 01:46:05 +0000 Subject: 2.5 - NLA Bugfixes: * F-Modifiers on F-Curves can now taken into account when calculating the extents of actions. This is used when there are some NLA strips and some action with some F-Modifiers is being played back on top of those. * The toggles in the NLA channels list now respect the width of the list instead of using a hardcoded position. This means that clicking on these toggles when the list is resized works again. --- source/blender/blenkernel/BKE_action.h | 2 +- source/blender/blenkernel/intern/action.c | 50 +++++++++++++++++++++++++++-- source/blender/blenkernel/intern/anim_sys.c | 1 - source/blender/blenkernel/intern/nla.c | 2 +- 4 files changed, 49 insertions(+), 6 deletions(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h index d35acb5447a..4724ee19aaa 100644 --- a/source/blender/blenkernel/BKE_action.h +++ b/source/blender/blenkernel/BKE_action.h @@ -66,7 +66,7 @@ void free_action(struct bAction *act); void make_local_action(struct bAction *act); /* Some kind of bounding box operation on the action */ -void calc_action_range(const struct bAction *act, float *start, float *end, int incl_hidden); +void calc_action_range(const struct bAction *act, float *start, float *end, short incl_modifiers); /* Does action have any motion data at all? */ short action_has_motion(const struct bAction *act); diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index 6a39139d250..47de044ea25 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -838,14 +838,15 @@ short action_has_motion(const bAction *act) } /* Calculate the extents of given action */ -void calc_action_range(const bAction *act, float *start, float *end, int incl_hidden) +void calc_action_range(const bAction *act, float *start, float *end, short incl_modifiers) { FCurve *fcu; float min=999999999.0f, max=-999999999.0f; - short foundvert=0; + short foundvert=0, foundmod=0; if (act) { for (fcu= act->curves.first; fcu; fcu= fcu->next) { + /* if curve has keyframes, consider them first */ if (fcu->totvert) { float nmin, nmax; @@ -858,10 +859,53 @@ void calc_action_range(const bAction *act, float *start, float *end, int incl_hi foundvert= 1; } + + /* if incl_modifiers is enabled, need to consider modifiers too + * - only really care about the last modifier + */ + if ((incl_modifiers) && (fcu->modifiers.last)) { + FModifier *fcm= fcu->modifiers.last; + + /* only use the maximum sensible limits of the modifiers if they are more extreme */ + switch (fcm->type) { + case FMODIFIER_TYPE_LIMITS: /* Limits F-Modifier */ + { + FMod_Limits *fmd= (FMod_Limits *)fcm->data; + + if (fmd->flag & FCM_LIMIT_XMIN) { + min= MIN2(min, fmd->rect.xmin); + } + if (fmd->flag & FCM_LIMIT_XMAX) { + max= MAX2(max, fmd->rect.xmax); + } + } + break; + + case FMODIFIER_TYPE_CYCLES: /* Cycles F-Modifier */ + { + FMod_Cycles *fmd= (FMod_Cycles *)fcm->data; + + if (fmd->before_mode != FCM_EXTRAPOLATE_NONE) + min= MINAFRAMEF; + if (fmd->after_mode != FCM_EXTRAPOLATE_NONE) + max= MAXFRAMEF; + } + break; + + // TODO: function modifier may need some special limits + + default: /* all other standard modifiers are on the infinite range... */ + min= MINAFRAMEF; + max= MAXFRAMEF; + break; + } + + foundmod= 1; + } } } - if (foundvert) { + if (foundvert || foundmod) { if(min==max) max+= 1.0f; *start= min; *end= max; diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index 5eaf2133515..8daaaab62d4 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -1263,7 +1263,6 @@ static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime) dummy_strip.act= adt->action; dummy_strip.remap= adt->remap; - // FIXME: what happens when we want to included F-Modifier access? calc_action_range(dummy_strip.act, &dummy_strip.actstart, &dummy_strip.actend, 1); dummy_strip.start = dummy_strip.actstart; dummy_strip.end = (IS_EQ(dummy_strip.actstart, dummy_strip.actend)) ? (dummy_strip.actstart + 1.0f): (dummy_strip.actend); diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c index c41c4ae78e4..480c79fbc1a 100644 --- a/source/blender/blenkernel/intern/nla.c +++ b/source/blender/blenkernel/intern/nla.c @@ -291,7 +291,7 @@ NlaStrip *add_nlastrip (bAction *act) /* determine initial range * - strip length cannot be 0... ever... */ - calc_action_range(strip->act, &strip->actstart, &strip->actend, 1); + calc_action_range(strip->act, &strip->actstart, &strip->actend, 0); strip->start = strip->actstart; strip->end = (IS_EQ(strip->actstart, strip->actend)) ? (strip->actstart + 1.0f): (strip->actend); -- cgit v1.2.3