NLA Transform Bugfixes:
authorJoshua Leung <aligorith@gmail.com>
Sun, 11 May 2008 13:07:40 +0000 (13:07 +0000)
committerJoshua Leung <aligorith@gmail.com>
Sun, 11 May 2008 13:07:40 +0000 (13:07 +0000)
* 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
source/blender/src/transform_generics.c

index 8859194ff9c65552066196ad39d6a5edbb25c70b..9a9a454ef3dbd760132e83ef7fe5eb9df44c0f88 100644 (file)
@@ -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 */
index 1a803bf00a81d2e7ab3f9f730067303d51f2b0df..a0dde01ba8e551bf58165723b1b5478e8b137dd9 100644 (file)
@@ -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;