Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorJoshua Leung <aligorith@gmail.com>2009-07-07 06:12:50 +0400
committerJoshua Leung <aligorith@gmail.com>2009-07-07 06:12:50 +0400
commit905b1380054f42fe30b19fb37861057af4760e32 (patch)
tree878b56d7ef97e56e4af8f6c46e710479441c81b0 /source
parentf98c3ed70b86d12945078c288c2bd3288a297841 (diff)
NLA SoC: Start of integration of Meta-strips in Transform
* Chains of selected strips are now converted to meta-strips before transforms begin, and converted back afterwards. This simplifies the transform code needed in later stages... * Transform-flushing code for Meta-Strips should now work. There seems to be a little bit of numeric inaccuracy problems somewhere, as two strips which met at the same frame can get separated when scaling. * Meta-strips now draw with proper text identification * Snapping strips now properly clears meta-strips if a moved strip needs to be moved into a new track to be accomodated. * Fixed a filter used by a selection-operator.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/nla.c45
-rw-r--r--source/blender/editors/space_nla/nla_draw.c12
-rw-r--r--source/blender/editors/space_nla/nla_edit.c3
-rw-r--r--source/blender/editors/space_nla/nla_select.c2
-rw-r--r--source/blender/editors/transform/transform_conversions.c23
-rw-r--r--source/blender/editors/transform/transform_generics.c15
6 files changed, 89 insertions, 11 deletions
diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c
index a83fa0abe1e..851a0d7b549 100644
--- a/source/blender/blenkernel/intern/nla.c
+++ b/source/blender/blenkernel/intern/nla.c
@@ -781,6 +781,8 @@ void BKE_nlameta_flush_transforms (NlaStrip *mstrip)
{
NlaStrip *strip;
float oStart, oEnd, offset;
+ float oLen, nLen;
+ short scaleChanged= 0;
/* sanity checks
* - strip must exist
@@ -806,16 +808,43 @@ void BKE_nlameta_flush_transforms (NlaStrip *mstrip)
if (IS_EQ(oStart, mstrip->start) && IS_EQ(oEnd, mstrip->end))
return;
+ /* check if scale changed */
+ oLen = oEnd - oStart;
+ nLen = mstrip->end - mstrip->start;
+ if (IS_EQ(nLen, oLen) == 0)
+ scaleChanged= 1;
+
/* for each child-strip, calculate new start/end points based on this new info */
for (strip= mstrip->strips.first; strip; strip= strip->next) {
- //PointerRNA strip_ptr;
-
- /* firstly, just apply the changes in offset to both ends of the strip */
- strip->start += offset;
- strip->end += offset;
-
- /* now, we need to fix the endpoint to take into account scaling */
- // TODO..
+ if (scaleChanged) {
+ PointerRNA ptr;
+ float p1, p2, nStart, nEnd;
+
+ /* compute positions of endpoints relative to old extents of strip */
+ p1= (strip->start - oStart) / oLen;
+ p2= (strip->end - oStart) / oLen;
+
+ /* compute the new strip endpoints using the proportions */
+ nStart= (p1 * nLen) + mstrip->start;
+ nEnd= (p2 * nLen) + mstrip->start;
+
+ /* firstly, apply the new positions manually, then apply using RNA
+ * - first time is to make sure no truncation errors from one endpoint not being
+ * set yet occur
+ * - second time is to make sure scale is computed properly...
+ */
+ strip->start= nStart;
+ strip->end= nEnd;
+
+ RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &ptr);
+ RNA_float_set(&ptr, "start_frame", nStart);
+ RNA_float_set(&ptr, "end_frame", nEnd);
+ }
+ else {
+ /* just apply the changes in offset to both ends of the strip */
+ strip->start += offset;
+ strip->end += offset;
+ }
/* finally, make sure the strip's children (if it is a meta-itself), get updated */
BKE_nlameta_flush_transforms(strip);
diff --git a/source/blender/editors/space_nla/nla_draw.c b/source/blender/editors/space_nla/nla_draw.c
index e31aebf0155..7b9f2faf08a 100644
--- a/source/blender/editors/space_nla/nla_draw.c
+++ b/source/blender/editors/space_nla/nla_draw.c
@@ -366,13 +366,21 @@ static void nla_draw_strip_text (NlaTrack *nlt, NlaStrip *strip, int index, View
/* for now, just init the string with fixed-formats */
switch (strip->type) {
case NLASTRIP_TYPE_TRANSITION: /* Transition */
- sprintf(str, "%d | Transition | %.2f %s %.2f", index, strip->start, dir, strip->end);
+ sprintf(str, "%d | Transition | %.2f %s %.2f",
+ index, strip->start, dir, strip->end);
+ break;
+
+ case NLASTRIP_TYPE_META: /* Meta */
+ sprintf(str, "%d | %sMeta | %.2f %s %.2f",
+ index, ((strip->flag & NLASTRIP_FLAG_TEMP_META)?"Temp-":""),
+ strip->start, dir, strip->end);
break;
case NLASTRIP_TYPE_CLIP: /* Action-Clip (default) */
default:
if (strip->act)
- sprintf(str, "%d | Act: %s | %.2f %s %.2f", index, strip->act->id.name+2, strip->start, dir, strip->end);
+ sprintf(str, "%d | Act: %s | %.2f %s %.2f",
+ index, strip->act->id.name+2, strip->start, dir, strip->end);
else
sprintf(str, "%d | Act: <NONE>", index); // xxx... need a better format?
break;
diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c
index 676d0aac1b1..d663b76d5fe 100644
--- a/source/blender/editors/space_nla/nla_edit.c
+++ b/source/blender/editors/space_nla/nla_edit.c
@@ -1264,6 +1264,9 @@ static int nlaedit_snap_exec (bContext *C, wmOperator *op)
/* need to add a new track above the current one */
track= add_nlatrack(adt, nlt);
BKE_nlatrack_add_strip(track, strip);
+
+ /* clear temp meta-strips on this new track, as we may not be able to get back to it */
+ BKE_nlastrips_clear_metas(&track->strips, 0, 1);
}
}
diff --git a/source/blender/editors/space_nla/nla_select.c b/source/blender/editors/space_nla/nla_select.c
index c238818dd1e..ca186dcf702 100644
--- a/source/blender/editors/space_nla/nla_select.c
+++ b/source/blender/editors/space_nla/nla_select.c
@@ -513,7 +513,7 @@ static void nlaedit_mselect_leftright (bContext *C, bAnimContext *ac, short left
/* filter data */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY);
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NLATRACKS);
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* select strips on the side where most data occurs */
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index b2afaac23de..758be545fd0 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -2617,6 +2617,9 @@ static void createTransNlaData(bContext *C, TransInfo *t)
NlaTrack *nlt= (NlaTrack *)ale->data;
NlaStrip *strip;
+ /* make some meta-strips for chains of selected strips */
+ BKE_nlastrips_make_metas(&nlt->strips, 1);
+
/* only consider selected strips */
for (strip= nlt->strips.first; strip; strip= strip->next) {
// TODO: we can make strips have handles later on...
@@ -4754,6 +4757,26 @@ void special_aftertrans_update(TransInfo *t)
if (ANIM_animdata_context_getdata(&ac) == 0)
return;
+ if (ac.datatype)
+ {
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ short filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NLATRACKS);
+
+ /* get channels to work on */
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+
+ /* remove the temp metas */
+ BKE_nlastrips_clear_metas(&nlt->strips, 0, 1);
+ }
+
+ /* free temp memory */
+ BLI_freelistN(&anim_data);
+ }
+
// XXX check on the calls below... we need some of these sanity checks
//synchronize_action_strips();
//ANIM_editkeyframes_refresh(&ac);
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index 1474a30fbed..e228dc2b13a 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -82,6 +82,7 @@
#include "BKE_key.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_nla.h"
#include "BKE_object.h"
#include "BKE_utildefines.h"
#include "BKE_context.h"
@@ -388,6 +389,20 @@ void recalcData(TransInfo *t)
}
}
}
+
+ /* loop over the TransDataNla again, flushing the transforms (since we use Metas to make transforms easier) */
+ td= t->data;
+ for (i = 0; i < t->total; i++, td++)
+ {
+ if (td->extra)
+ {
+ TransDataNla *tdn= td->extra;
+ NlaStrip *strip= tdn->strip;
+
+ // TODO: this may flush some things twice, but that's fine as there's no impact from that
+ BKE_nlameta_flush_transforms(strip);
+ }
+ }
}
else if (t->obedit) {
if ELEM(t->obedit->type, OB_CURVE, OB_SURF) {