[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23935] trunk/blender/source/blender/ editors/transform: Give sequencer its own transform freeing function.

Campbell Barton ideasman42 at gmail.com
Mon Oct 19 10:01:30 CEST 2009


Revision: 23935
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23935
Author:   campbellbarton
Date:     2009-10-19 10:01:30 +0200 (Mon, 19 Oct 2009)

Log Message:
-----------
Give sequencer its own transform freeing function.
Updating the sequencer after transform could not use special_aftertrans_update because it relies on data that is freed

theeth: moved the customFree function to run before freeing t->data, t->data2d in postTrans(), checked that customData is not needed.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/transform/transform_generics.c

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2009-10-19 04:56:19 UTC (rev 23934)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2009-10-19 08:01:30 UTC (rev 23935)
@@ -4012,6 +4012,53 @@
 }
 
 
+static void freeSeqData(TransInfo *t)
+{
+	Editing *ed= seq_give_editing(t->scene, FALSE);
+	if (ed && !(t->state == TRANS_CANCEL)) {
+		ListBase *seqbasep= ed->seqbasep;
+		Sequence *seq;
+
+		int a;
+		TransData *td= t->data;
+
+		/* prevent updating the same seq twice
+		 * if the transdata order is changed this will mess up
+		 * but so will TransDataSeq */
+		Sequence *seq_prev= NULL;
+
+		/* flush to 2d vector from internally used 3d vector */
+		for(a=0; a<t->total; a++, td++) {
+			seq= ((TransDataSeq *)td->extra)->seq;
+			if ((seq != seq_prev) && (seq->depth==0) && (seq->flag & SEQ_OVERLAP)) {
+				shuffle_seq(seqbasep, seq);
+			}
+
+			seq_prev= seq;
+		}
+
+		for(seq= seqbasep->first; seq; seq= seq->next) {
+			/* We might want to build a list of effects that need to be updated during transform */
+			if(seq->type & SEQ_EFFECT) {
+				if		(seq->seq1 && seq->seq1->flag & SELECT) calc_sequence(seq);
+				else if	(seq->seq2 && seq->seq2->flag & SELECT) calc_sequence(seq);
+				else if	(seq->seq3 && seq->seq3->flag & SELECT) calc_sequence(seq);
+			}
+		}
+
+		sort_seq(t->scene);
+	}
+
+	if (t->customData) {
+		MEM_freeN(t->customData);
+		t->customData= NULL;
+	}
+	if (t->data) {
+		MEM_freeN(t->data); // XXX postTrans usually does this
+		t->data= NULL;
+	}
+}
+
 static void createTransSeqData(bContext *C, TransInfo *t)
 {
 
@@ -4029,6 +4076,8 @@
 		return;
 	}
 
+	t->customFree= freeSeqData;
+
 	/* which side of the current frame should be allowed */
 	if (t->mode == TFM_TIME_EXTEND) {
 		/* only side on which mouse is gets transformed */
@@ -4480,6 +4529,7 @@
 /* inserting keys, refresh ipo-keys, pointcache, redraw events... (ton) */
 /* note: transdata has been freed already! */
 /* note: this runs even when createTransData exits early because  (t->total==0), is this correct?... (campbell) */
+/* note: sequencer freeing has its own function now because of a conflict with transform's order of freeing (campbell)*/
 void special_aftertrans_update(TransInfo *t)
 {
 	Object *ob;
@@ -4494,68 +4544,6 @@
 			}
 		}
 	}
-
-	if (t->spacetype == SPACE_SEQ) {
-		Editing *ed= seq_give_editing(t->scene, FALSE);
-		if (ed && !cancelled) {
-			ListBase *seqbasep= ed->seqbasep;
-			Sequence *seq;
-#if 0		// TRANSFORM_FIX_ME, Would prefer to use this since the array takes into
-			// account what where transforming (with extend, locked strips etc)
-			// But at the moment t->data is freed in postTrans so for now re-shuffeling selected strips works ok. - Campbell
-
-			int a;
-			TransData *td= t->data;
-
-			/* prevent updating the same seq twice
-			 * if the transdata order is changed this will mess up
-			 * but so will TransDataSeq */
-			Sequence *seq_prev= NULL;
-
-			/* flush to 2d vector from internally used 3d vector */
-			for(a=0; a<t->total; a++, td++) {
-				seq= ((TransDataSeq *)td->extra)->seq;
-				if ((seq != seq_prev) && (seq->depth==0) && (seq->flag & SEQ_OVERLAP)) {
-					shuffle_seq(seqbasep, seq);
-				}
-
-				seq_prev= seq;
-			}
-#else		// while t->data is not available...
-			int machine, max_machine = 0;
-
-			/* update in order so we always move bottom strips first */
-			for(seq= seqbasep->first; seq; seq= seq->next) {
-				max_machine = MAX2(max_machine, seq->machine);
-			}
-
-			for (machine = 0; machine <= max_machine; machine++)
-			{
-				for(seq= seqbasep->first; seq; seq= seq->next) {
-					if (seq->machine == machine && seq->depth == 0 && (seq->flag & (SELECT|SEQ_LEFTSEL|SEQ_RIGHTSEL)) != 0 && (seq->flag & SEQ_OVERLAP)) {
-						shuffle_seq(seqbasep, seq);
-					}
-				}
-			}
-#endif
-
-			for(seq= seqbasep->first; seq; seq= seq->next) {
-				/* We might want to build a list of effects that need to be updated during transform */
-				if(seq->type & SEQ_EFFECT) {
-					if		(seq->seq1 && seq->seq1->flag & SELECT) calc_sequence(seq);
-					else if	(seq->seq2 && seq->seq2->flag & SELECT) calc_sequence(seq);
-					else if	(seq->seq3 && seq->seq3->flag & SELECT) calc_sequence(seq);
-				}
-			}
-
-			sort_seq(t->scene);
-		}
-
-		if (t->customData)
-			MEM_freeN(t->customData);
-		if (t->data)
-			MEM_freeN(t->data); // XXX postTrans usually does this
-	}
 	else if (t->spacetype == SPACE_ACTION) {
 		SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
 		Scene *scene;

Modified: trunk/blender/source/blender/editors/transform/transform_generics.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_generics.c	2009-10-19 04:56:19 UTC (rev 23934)
+++ trunk/blender/source/blender/editors/transform/transform_generics.c	2009-10-19 08:01:30 UTC (rev 23935)
@@ -1052,6 +1052,15 @@
 		ED_region_draw_cb_exit(t->ar->type, t->draw_handle);
 	}
 	
+
+	if (t->customFree) {
+		/* Can take over freeing t->data and data2d etc... */
+		t->customFree(t);
+	}
+	else if (t->customData) {
+		MEM_freeN(t->customData);
+	}
+
 	/* postTrans can be called when nothing is selected, so data is NULL already */
 	if (t->data) {
 		int a;
@@ -1080,13 +1089,6 @@
 	{
 		MEM_freeN(t->mouse.data);
 	}
-	
-	if (t->customFree) {
-		t->customFree(t);
-	}
-	else if (t->customData) {
-		MEM_freeN(t->customData);
-	}
 }
 
 void applyTransObjects(TransInfo *t)





More information about the Bf-blender-cvs mailing list