From 97e72570d11c6669e4c5a3a1627008128c85112c Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Sun, 11 May 2008 13:07:40 +0000 Subject: [PATCH] NLA Transform Bugfixes: * Scaling NLA-strips now resets their scale setting correctly at all times * Added safe-guards against negative scaling being created through the use of the transform tools. Note: at scale 0 or thereabouts, there will still be a little blip, when keyframes are scaled as if scale were 1.0f. It's quite harmless. --- source/blender/src/transform_conversions.c | 6 ++-- source/blender/src/transform_generics.c | 41 ++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/source/blender/src/transform_conversions.c b/source/blender/src/transform_conversions.c index 8859194ff9c..9a9a454ef3d 100644 --- a/source/blender/src/transform_conversions.c +++ b/source/blender/src/transform_conversions.c @@ -2726,9 +2726,10 @@ static void createTransNlaData(TransInfo *t) if (base->object->action) { /* exclude if strip is selected too */ for (strip=base->object->nlastrips.first; strip; strip=strip->next) { - if (strip->flag & ACTSTRIP_SELECT) + if (strip->flag & ACTSTRIP_SELECT) { if (strip->act == base->object->action) break; + } } if (strip==NULL) { cfra = get_action_frame(base->object, CFRA); @@ -2790,9 +2791,10 @@ static void createTransNlaData(TransInfo *t) if (base->object->action) { /* exclude if strip that active action belongs to is selected too */ for (strip=base->object->nlastrips.first; strip; strip=strip->next) { - if (strip->flag & ACTSTRIP_SELECT) + if (strip->flag & ACTSTRIP_SELECT) { if (strip->act == base->object->action) break; + } } /* can include if no strip found */ diff --git a/source/blender/src/transform_generics.c b/source/blender/src/transform_generics.c index 1a803bf00a8..a0dde01ba8e 100644 --- a/source/blender/src/transform_generics.c +++ b/source/blender/src/transform_generics.c @@ -39,6 +39,7 @@ #include "DNA_lattice_types.h" #include "DNA_mesh_types.h" #include "DNA_modifier_types.h" +#include "DNA_nla_types.h" #include "DNA_object_types.h" #include "DNA_object_force.h" #include "DNA_particle_types.h" @@ -303,10 +304,50 @@ void recalcData(TransInfo *t) if (base->object->recalc) base->object->ctime= -1234567.0f; // eveil! + + /* recalculate scale of selected nla-strips */ + if (base->object->nlastrips.first) { + Object *bob= base->object; + bActionStrip *strip; + + for (strip= bob->nlastrips.first; strip; strip= strip->next) { + if (strip->flag & ACTSTRIP_SELECT) { + float actlen= strip->actend - strip->actstart; + float len= strip->end - strip->start; + + strip->scale= len / (actlen * strip->repeat); + } + } + } } DAG_scene_flush_update(G.scene, screen_view3d_layers(), 0); } + else { + for (base=G.scene->base.first; base; base=base->next) { + /* recalculate scale of selected nla-strips */ + if (base->object->nlastrips.first) { + Object *bob= base->object; + bActionStrip *strip; + + for (strip= bob->nlastrips.first; strip; strip= strip->next) { + if (strip->flag & ACTSTRIP_SELECT) { + float actlen= strip->actend - strip->actstart; + float len= strip->end - strip->start; + + /* prevent 'negative' scaling */ + if (len < 0) { + SWAP(float, strip->start, strip->end); + len= fabs(len); + } + + /* calculate new scale */ + strip->scale= len / (actlen * strip->repeat); + } + } + } + } + } } else if (t->spacetype == SPACE_IPO) { EditIpo *ei;