[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20748] branches/soc-2009-aligorith/source /blender: NLA SoC: Transform tools for NLA

Joshua Leung aligorith at gmail.com
Tue Jun 9 13:26:45 CEST 2009


Revision: 20748
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20748
Author:   aligorith
Date:     2009-06-09 13:26:45 +0200 (Tue, 09 Jun 2009)

Log Message:
-----------
NLA SoC: Transform tools for NLA 

This commit restores transform support for NLA. Grab, scale, 'extend', and tweak (i.e. grab by just click+dragging) are implemented. 

Notes:
- As soon as one end of a strip touches another adjacent strip (within the same track), that end stops moving. This has been done to avoid the situation where overlapping strips within the same track (which is not allowed) might be caused by transforms.
- Made some changes to the RNA setters for the strip extents so that the validation above could take place (and other necessary changes on a per-strip basis could also occur).

TODO's ?
- Strips cannot be transferred from track to track using transforms. I've yet to decide whether this needs to be done, or whether a separate operator will suffice.
- What happens to the range of Actions used when the strips change sizes unexpectedly (i.e. the no-overlap condition above)? Currently range stays the same, but this doesn't always seem desirable?

Modified Paths:
--------------
    branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_ops.c
    branches/soc-2009-aligorith/source/blender/editors/transform/transform.c
    branches/soc-2009-aligorith/source/blender/editors/transform/transform.h
    branches/soc-2009-aligorith/source/blender/editors/transform/transform_conversions.c
    branches/soc-2009-aligorith/source/blender/editors/transform/transform_generics.c
    branches/soc-2009-aligorith/source/blender/editors/transform/transform_ops.c
    branches/soc-2009-aligorith/source/blender/makesrna/intern/rna_nla.c

Modified: branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_ops.c
===================================================================
--- branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_ops.c	2009-06-09 10:30:16 UTC (rev 20747)
+++ branches/soc-2009-aligorith/source/blender/editors/space_nla/nla_ops.c	2009-06-09 11:26:45 UTC (rev 20748)
@@ -54,6 +54,8 @@
 #include "ED_space_api.h"
 #include "ED_screen.h"
 
+#include "BIF_transform.h"
+
 #include "WM_api.h"
 #include "WM_types.h"
 
@@ -191,7 +193,7 @@
 	WM_keymap_add_item(keymap, "NLAEDIT_OT_tweakmode_exit", TABKEY, KM_PRESS, 0, 0);
 	
 	/* transform system */
-	//transform_keymap_for_space(wm, keymap, SPACE_NLA);
+	transform_keymap_for_space(wm, keymap, SPACE_NLA);
 }
 
 /* --------------- */

Modified: branches/soc-2009-aligorith/source/blender/editors/transform/transform.c
===================================================================
--- branches/soc-2009-aligorith/source/blender/editors/transform/transform.c	2009-06-09 10:30:16 UTC (rev 20747)
+++ branches/soc-2009-aligorith/source/blender/editors/transform/transform.c	2009-06-09 11:26:45 UTC (rev 20748)
@@ -319,6 +319,9 @@
 		else 
 			ED_area_tag_redraw(t->sa);
 	}
+	else if (t->spacetype == SPACE_NLA) {
+		ED_area_tag_redraw(t->sa); // XXX this should use a notifier instead!
+	}
 	else if(t->spacetype == SPACE_NODE)
 	{
 		//ED_area_tag_redraw(t->sa);

Modified: branches/soc-2009-aligorith/source/blender/editors/transform/transform.h
===================================================================
--- branches/soc-2009-aligorith/source/blender/editors/transform/transform.h	2009-06-09 10:30:16 UTC (rev 20747)
+++ branches/soc-2009-aligorith/source/blender/editors/transform/transform.h	2009-06-09 11:26:45 UTC (rev 20748)
@@ -161,6 +161,13 @@
 	
 } TransDataSeq;
 
+/* for NLA transform (stored in td->extra pointer) */
+typedef struct TransDataNla {
+	struct NlaStrip *strip;		/* NLA-strip that handle belongs to */
+	float val;					/* value for the handle that the transform tools write to */
+	int handle;					/* handle-index, 0 for start, 1 for end */
+} TransDataNla;
+
 typedef struct TransData {
 	float  dist;         /* Distance needed to affect element (for Proportionnal Editing)                  */
 	float  rdist;        /* Distance to the nearest element (for Proportionnal Editing)                    */

Modified: branches/soc-2009-aligorith/source/blender/editors/transform/transform_conversions.c
===================================================================
--- branches/soc-2009-aligorith/source/blender/editors/transform/transform_conversions.c	2009-06-09 10:30:16 UTC (rev 20747)
+++ branches/soc-2009-aligorith/source/blender/editors/transform/transform_conversions.c	2009-06-09 11:26:45 UTC (rev 20748)
@@ -2559,8 +2559,160 @@
 	return (clipx || clipy);
 }
 
-/* ********************* ACTION/NLA EDITOR ****************** */
+/* ********************* ANIMATION EDITORS (GENERAL) ************************* */
 
+/* This function tests if a point is on the "mouse" side of the cursor/frame-marking */
+static short FrameOnMouseSide(char side, float frame, float cframe)
+{
+	/* both sides, so it doesn't matter */
+	if (side == 'B') return 1;
+	
+	/* only on the named side */
+	if (side == 'R')
+		return (frame >= cframe) ? 1 : 0;
+	else
+		return (frame <= cframe) ? 1 : 0;
+}
+
+/* ********************* NLA EDITOR ************************* */
+
+static void createTransNlaData(bContext *C, TransInfo *t)
+{
+	Scene *scene= CTX_data_scene(C);
+	TransData *td = NULL;
+	TransDataNla *tdn = NULL;
+	
+	bAnimContext ac;
+	ListBase anim_data = {NULL, NULL};
+	bAnimListElem *ale;
+	int filter;
+	
+	int count=0;
+	char side;
+	
+	/* determine what type of data we are operating on */
+	if (ANIM_animdata_get_context(C, &ac) == 0)
+		return;
+	
+	/* filter data */
+	filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT);
+	ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+		
+	/* which side of the current frame should be allowed */
+	if (t->mode == TFM_TIME_EXTEND) {
+		/* only side on which mouse is gets transformed */
+		float xmouse, ymouse;
+		
+		UI_view2d_region_to_view(&ac.ar->v2d, t->imval[0], t->imval[1], &xmouse, &ymouse);
+		side = (xmouse > CFRA) ? 'R' : 'L'; // XXX use t->frame_side
+	}
+	else {
+		/* normal transform - both sides of current frame are considered */
+		side = 'B';
+	}
+	
+	/* loop 1: count how many strips are selected (consider each strip as 2 points) */
+	for (ale= anim_data.first; ale; ale= ale->next) {
+		/* only if a real NLA-track */
+		if (ale->type == ANIMTYPE_NLATRACK) {
+			NlaTrack *nlt= (NlaTrack *)ale->data;
+			NlaStrip *strip;
+			
+			/* only consider selected strips */
+			for (strip= nlt->strips.first; strip; strip= strip->next) {
+				// TODO: we can make strips have handles later on...
+				if (strip->flag & NLASTRIP_FLAG_SELECT) {
+					if (FrameOnMouseSide(side, strip->start, (float)CFRA)) count++;
+					if (FrameOnMouseSide(side, strip->end, (float)CFRA)) count++;
+				}
+			}
+		}
+	}
+	
+	/* stop if trying to build list if nothing selected */
+	if (count == 0) {
+		/* cleanup temp list */
+		BLI_freelistN(&anim_data);
+		return;
+	}
+	
+	/* allocate memory for data */
+	t->total= count;
+	
+	t->data= MEM_callocN(t->total*sizeof(TransData), "TransData(NLA Editor)");
+	td= t->data;
+	t->customData= MEM_callocN(t->total*sizeof(TransDataNla), "TransDataNla (NLA Editor)");
+	tdn= t->customData;
+	
+	/* loop 2: build transdata array */
+	for (ale= anim_data.first; ale; ale= ale->next) {
+		/* only if a real NLA-track */
+		if (ale->type == ANIMTYPE_NLATRACK) {
+			NlaTrack *nlt= (NlaTrack *)ale->data;
+			NlaStrip *strip;
+			
+			/* only consider selected strips */
+			for (strip= nlt->strips.first; strip; strip= strip->next) {
+				// TODO: we can make strips have handles later on...
+				if (strip->flag & NLASTRIP_FLAG_SELECT) {
+					if (FrameOnMouseSide(side, strip->start, (float)CFRA)) 
+					{
+						/* init the 'extra' data for NLA strip handles first */
+						tdn->strip= strip;
+						tdn->val= strip->start;
+						tdn->handle= 0;
+						
+						/* now, link the transform data up to this data */
+						td->val= &tdn->val;
+						td->ival= tdn->val;
+						td->extra= tdn;
+						td++;
+						tdn++;
+					}
+					if (FrameOnMouseSide(side, strip->end, (float)CFRA)) 
+					{	
+						/* init the 'extra' data for NLA strip handles first */
+						tdn->strip= strip;
+						tdn->val= strip->end;
+						tdn->handle= 1;
+						
+						/* now, link the transform data up to this data */
+						td->val= &tdn->val;
+						td->ival= tdn->val;
+						td->extra= tdn;
+						td++;
+						tdn++;
+					}
+				}
+			}
+		}
+	}
+	
+	/* check if we're supposed to be setting minx/maxx for TimeSlide */
+	if (t->mode == TFM_TIME_SLIDE) {
+		float min=999999999.0f, max=-999999999.0f;
+		int i;
+		
+		td= (t->data + 1);
+		for (i=1; i < count; i+=3, td+=3) {
+			if (min > *(td->val)) min= *(td->val);
+			if (max < *(td->val)) max= *(td->val);
+		}
+		
+		/* minx/maxx values used by TimeSlide are stored as a 
+		 * calloced 2-float array in t->customData. This gets freed
+		 * in postTrans (T_FREE_CUSTOMDATA). 
+		 */
+		*((float *)(t->customData)) = min;
+		*((float *)(t->customData) + 1) = max;
+	}
+	
+	/* cleanup temp list */
+	BLI_freelistN(&anim_data);
+}
+
+/* ********************* ACTION EDITOR ****************** */
+
 /* Called by special_aftertrans_update to make sure selected gp-frames replace
  * any other gp-frames which may reside on that frame (that are not selected).
  * It also makes sure gp-frames are still stored in chronological order after
@@ -2744,19 +2896,6 @@
 
 /* ----------------------------- */
 
-/* This function tests if a point is on the "mouse" side of the cursor/frame-marking */
-static short FrameOnMouseSide(char side, float frame, float cframe)
-{
-	/* both sides, so it doesn't matter */
-	if (side == 'B') return 1;
-	
-	/* only on the named side */
-	if (side == 'R')
-		return (frame >= cframe) ? 1 : 0;
-	else
-		return (frame <= cframe) ? 1 : 0;
-}
-
 /* fully select selected beztriples, but only include if it's on the right side of cfra */
 static int count_fcurve_keys(FCurve *fcu, char side, float cfra)
 {
@@ -3044,8 +3183,6 @@
 
 /* ********************* GRAPH EDITOR ************************* */
 
-
-
 /* Helper function for createTransGraphEditData, which is reponsible for associating
  * source data with transform data
  */
@@ -3502,7 +3639,6 @@
 	}
 }
 
-
 /* **************** IpoKey stuff, for Object TransData ********** */
 
 /* while transforming */
@@ -4604,6 +4740,29 @@
 		/* make sure all F-Curves are set correctly */
 		ANIM_editkeyframes_refresh(&ac);
 	}
+	else if (t->spacetype == SPACE_NLA) {
+		SpaceNla *snla= (SpaceNla *)t->sa->spacedata.first;
+		Scene *scene;
+		bAnimContext ac;
+		
+		/* initialise relevant anim-context 'context' data from TransInfo data */
+		/* NOTE: sync this with the code in ANIM_animdata_get_context() */
+		memset(&ac, 0, sizeof(bAnimContext));
+		
+		scene= ac.scene= t->scene;
+		ob= ac.obact= OBACT;
+		ac.sa= t->sa;
+		ac.ar= t->ar;
+		ac.spacetype= (t->sa)? t->sa->spacetype : 0;
+		ac.regiontype= (t->ar)? t->ar->regiontype : 0;
+		
+		if (ANIM_animdata_context_getdata(&ac) == 0)
+			return;
+		
+		// XXX check on the calls below... we need some of these sanity checks
+		//synchronize_action_strips();
+		//ANIM_editkeyframes_refresh(&ac);
+	}
 	else if (t->obedit) {
 		// TRANSFORM_FIX_ME
 //		if (t->mode==TFM_BONESIZE || t->mode==TFM_BONE_ENVELOPE)
@@ -4682,24 +4841,6 @@
 		}
 	}
 	
-#if 0 // TRANSFORM_FIX_ME
-	else if (t->spacetype == SPACE_NLA) {
-		recalc_all_ipos();	// bad
-		synchronize_action_strips();
-		
-		/* cleanup */
-		for (base=t->scene->base.first; base; base=base->next)
-			base->flag &= ~(BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA);
-		
-		/* after transform, remove duplicate keyframes on a frame that resulted from transform */
-		if ( (G.snla->flag & SNLA_NOTRANSKEYCULL)==0 && 
-			 ((cancelled == 0) || (duplicate)) )
-		{
-			posttrans_nla_clean(t);
-		}
-	}
-#endif
-	
 	clear_trans_object_base_flags(t);
 
 #if 0 // TRANSFORM_FIX_ME
@@ -4932,8 +5073,7 @@
 	}
 	else if (t->spacetype == SPACE_NLA) {
 		t->flag |= T_POINTS|T_2D_EDIT;
-		// TRANSFORM_FIX_ME
-		//createTransNlaData(C, t);
+		createTransNlaData(C, t);
 	}
 	else if (t->spacetype == SPACE_SEQ) {
 		t->flag |= T_POINTS|T_2D_EDIT;

Modified: branches/soc-2009-aligorith/source/blender/editors/transform/transform_generics.c

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list