[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14545] trunk/blender: added sequencer paths to bpath iterator, This needed to use get/ set filename callbacks internally because the sequencer stores dir/ file separately.

Campbell Barton ideasman42 at gmail.com
Fri Apr 25 18:09:17 CEST 2008


Revision: 14545
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14545
Author:   campbellbarton
Date:     2008-04-25 18:09:16 +0200 (Fri, 25 Apr 2008)

Log Message:
-----------
added sequencer paths to bpath iterator, This needed to use get/set filename callbacks internally because the sequencer stores dir/file separately.
This means when moving large projects with many images/videos/sounds is possible with 'File, External Data, Find Missing Files'.
- needed so we can put peach animatic, glrenders & testrenders on the dvd.
also datatoc.c - brecht's fixes from apricot.

Modified Paths:
--------------
    trunk/blender/release/datafiles/datatoc.c
    trunk/blender/source/blender/blenlib/BLI_bpath.h
    trunk/blender/source/blender/blenlib/intern/bpath.c
    trunk/blender/source/blender/include/BSE_sequence.h
    trunk/blender/source/blender/python/api2_2x/Blender.c
    trunk/blender/source/blender/src/buttons_scene.c

Modified: trunk/blender/release/datafiles/datatoc.c
===================================================================
--- trunk/blender/release/datafiles/datatoc.c	2008-04-25 13:46:14 UTC (rev 14544)
+++ trunk/blender/release/datafiles/datatoc.c	2008-04-25 16:09:16 UTC (rev 14545)
@@ -62,7 +62,7 @@
 		if (argv[1][i]=='.') argv[1][i]='_';
 
 	sprintf(sizest, "%d", (int)size);
-	printf ("Input filesize is %d, Output size should be %d\n", size, ((int)size)*4 + strlen("/* DataToC output of file <> */\n\n") + strlen("char datatoc_[]= {\"") + strlen ("\"};\n") + (strlen(argv[1])*3) + strlen(sizest) + strlen("int datatoc__size= ;\n") +(((int)(size/256)+1)*5));
+	printf ("Input filesize is %ld, Output size should be %ld\n", size, ((int)size)*4 + strlen("/* DataToC output of file <> */\n\n") + strlen("char datatoc_[]= {\"") + strlen ("\"};\n") + (strlen(argv[1])*3) + strlen(sizest) + strlen("int datatoc__size= ;\n") +(((int)(size/256)+1)*5));
 	
 	fpout= fopen(cname, "w");
 	if (!fpout) {
@@ -93,9 +93,9 @@
 		/* fprintf (fpout, "\\x%02x", getc(fpin)); */
 		fprintf (fpout, "%3d,", getc(fpin));
 	}
+	/* null terminate for the case it is a string */
+	fprintf (fpout, "\n  0};\n\n");
 	
-	fprintf (fpout, "\n};\n\n");
-	
 	fclose(fpin);
 	fclose(fpout);
 	return 0;

Modified: trunk/blender/source/blender/blenlib/BLI_bpath.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_bpath.h	2008-04-25 13:46:14 UTC (rev 14544)
+++ trunk/blender/source/blender/blenlib/BLI_bpath.h	2008-04-25 16:09:16 UTC (rev 14545)
@@ -29,6 +29,12 @@
 /* Based on ghash, difference is ghash is not a fixed size,
  * so for BPath we dont need to malloc  */
 
+struct BPathIteratorSeqData {
+	int totseq;
+	int seq;
+	struct Sequence **seqar; /* Sequence */
+};
+
 struct BPathIterator {
 	char*	path;
 	char*	lib;
@@ -36,17 +42,25 @@
 	void*	data;
 	int		len;
 	int		type;
+	
+	void (*setpath_callback)(struct BPathIterator *, char *);
+	void (*getpath_callback)(struct BPathIterator *, char *);
+	
+	/* only for seq data */
+	struct BPathIteratorSeqData seqdata;
 };
 
-void			BLI_bpathIterator_init		(struct BPathIterator *bpi);
-char*			BLI_bpathIterator_getPath	(struct BPathIterator *bpi);
-char*			BLI_bpathIterator_getLib	(struct BPathIterator *bpi);
-char*			BLI_bpathIterator_getName	(struct BPathIterator *bpi);
-int				BLI_bpathIterator_getType	(struct BPathIterator *bpi);
-int				BLI_bpathIterator_getPathMaxLen(struct BPathIterator *bpi);
-void			BLI_bpathIterator_step		(struct BPathIterator *bpi);
-int				BLI_bpathIterator_isDone	(struct BPathIterator *bpi);
-void			BLI_bpathIterator_copyPathExpanded( struct BPathIterator *bpi, char *path_expanded);
+void			BLI_bpathIterator_init				(struct BPathIterator *bpi);
+void			BLI_bpathIterator_free				(struct BPathIterator *bpi);
+char*			BLI_bpathIterator_getLib			(struct BPathIterator *bpi);
+char*			BLI_bpathIterator_getName			(struct BPathIterator *bpi);
+int				BLI_bpathIterator_getType			(struct BPathIterator *bpi);
+int				BLI_bpathIterator_getPathMaxLen		(struct BPathIterator *bpi);
+void			BLI_bpathIterator_step				(struct BPathIterator *bpi);
+int				BLI_bpathIterator_isDone			(struct BPathIterator *bpi);
+void			BLI_bpathIterator_getPath			(struct BPathIterator *bpi, char *path);
+void			BLI_bpathIterator_getPathExpanded	(struct BPathIterator *bpi, char *path_expanded);
+void			BLI_bpathIterator_setPath			(struct BPathIterator *bpi, char *path);
 
 /* high level funcs */
 

Modified: trunk/blender/source/blender/blenlib/intern/bpath.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/bpath.c	2008-04-25 13:46:14 UTC (rev 14544)
+++ trunk/blender/source/blender/blenlib/intern/bpath.c	2008-04-25 16:09:16 UTC (rev 14545)
@@ -28,11 +28,13 @@
 
 #include "BLI_bpath.h"
 #include "BKE_global.h"
+#include "BIF_screen.h" /* only for wait cursor */
 #include "DNA_ID.h" /* Library */
 #include "DNA_vfont_types.h"
 #include "DNA_image_types.h"
 #include "DNA_sound_types.h"
 #include "DNA_scene_types.h" /* to get the current frame */
+#include "DNA_sequence_types.h"
 #include <stdlib.h>
 #include <string.h>
 
@@ -41,7 +43,11 @@
 
 #include "blendef.h"
 #include "BKE_utildefines.h"
+#include "MEM_guardedalloc.h"
 
+/* for sequence */
+#include "BSE_sequence.h"
+
 /* for writing to a textblock */
 #include "BKE_text.h" 
 #include "BLI_blenlib.h"
@@ -67,35 +73,60 @@
 
 #define FILE_MAX			240
 
-
 /* TODO - BPATH_PLUGIN, BPATH_SEQ */
 enum BPathTypes {
 	BPATH_IMAGE = 0,
 	BPATH_SOUND,
 	BPATH_FONT,
 	BPATH_LIB,
+	BPATH_SEQ,
 
  	BPATH_DONE
 };
 
-
 void BLI_bpathIterator_init( struct BPathIterator *bpi ) {
 	bpi->type = BPATH_IMAGE;
 	bpi->data = NULL;
+	
+	bpi->getpath_callback = NULL;
+	bpi->setpath_callback = NULL;
+	
+	/* Sequencer spesific */
+	bpi->seqdata.totseq = 0;
+	bpi->seqdata.seq = 0;
+	bpi->seqdata.seqar = NULL;
+	
 	BLI_bpathIterator_step(bpi);
 }
 
-char* BLI_bpathIterator_getPath( struct BPathIterator *bpi) {
-	return bpi->path;
+void BLI_bpathIterator_free( struct BPathIterator *bpi ) {
+	if (bpi->seqdata.seqar)
+		MEM_freeN((void *)bpi->seqdata.seqar);
+	bpi->seqdata.seqar = NULL;
 }
-void BLI_bpathIterator_copyPathExpanded( struct BPathIterator *bpi, char *path_expanded) {
-	char *filepath, *libpath;
+
+void BLI_bpathIterator_getPath( struct BPathIterator *bpi, char *path) {
+	if (bpi->getpath_callback) {
+		bpi->getpath_callback( bpi, path );
+	} else {
+		strcpy(path, bpi->path); /* warning, we assume 'path' are long enough */
+	}
+}
+
+void BLI_bpathIterator_setPath( struct BPathIterator *bpi, char *path) {
+	if (bpi->setpath_callback) {
+		bpi->setpath_callback( bpi, path );
+	} else {
+		strcpy(bpi->path, path); /* warning, we assume 'path' are long enough */
+	}
+}
+
+void BLI_bpathIterator_getPathExpanded( struct BPathIterator *bpi, char *path_expanded) {
+	char *libpath;
 	
-	filepath = BLI_bpathIterator_getPath(bpi);
+	BLI_bpathIterator_getPath(bpi, path_expanded);
 	libpath = BLI_bpathIterator_getLib(bpi);
 	
-	BLI_strncpy(path_expanded, filepath, FILE_MAXDIR*2);
-	
 	if (libpath) { /* check the files location relative to its library path */
 		BLI_convertstringcode(path_expanded, libpath, G.scene->r.cfra);
 	} else { /* local data, use the blend files path */
@@ -116,7 +147,7 @@
 }
 
 /* gets the first or the next image that has a path - not a viewer node or generated image */
-static struct Image *ima_getpath__internal(struct Image *ima, int step_next) {
+static struct Image *ima_stepdata__internal(struct Image *ima, int step_next) {
 	if (ima==NULL)
 		return NULL;
 	
@@ -132,7 +163,7 @@
 	return ima;
 }
 
-static struct VFont *vf_getpath__internal(struct VFont *vf, int step_next) {
+static struct VFont *vf_stepdata__internal(struct VFont *vf, int step_next) {
 	if (vf==NULL)
 		return NULL;
 	
@@ -150,7 +181,7 @@
 	return vf;
 }
 
-static struct bSound *snd_getpath__internal(struct bSound *snd, int step_next) {
+static struct bSound *snd_stepdata__internal(struct bSound *snd, int step_next) {
 	if (snd==NULL)
 		return NULL;
 	
@@ -168,13 +199,105 @@
 	return snd;
 }
 
+static struct Sequence *seq_stepdata__internal(struct BPathIterator *bpi, int step_next) {
+	Sequence *seq;
+	
+	if (G.scene->ed==NULL) {
+		return NULL;
+	}
+	
+	if (bpi->seqdata.seqar == NULL) {
+		/* allocate the sequencer array */
+		build_seqar( &(((Editing *)G.scene->ed)->seqbase), &bpi->seqdata.seqar, &bpi->seqdata.totseq);		
+		bpi->seqdata.seq = 0;
+	}
+	
+	if (step_next) {
+		bpi->seqdata.seq++;
+	}
+	
+	if (bpi->seqdata.seq >= bpi->seqdata.totseq) {
+		seq = NULL;
+	} else {
+		seq = bpi->seqdata.seqar[bpi->seqdata.seq];
+		while (!SEQ_HAS_PATH(seq)) {
+			bpi->seqdata.seq++;
+			if (bpi->seqdata.seq >= bpi->seqdata.totseq) {
+				seq = NULL;
+				break;
+			}
+			seq = bpi->seqdata.seqar[bpi->seqdata.seq];
+		}
+	}
+	return seq ;
+}
+
+void seq_getpath(struct BPathIterator *bpi, char *path) {
+	Sequence *seq = (Sequence *)bpi->data;
+
+	
+	path[0] = '\0'; /* incase we cant get the path */
+	if (seq==NULL) return;
+	if (SEQ_HAS_PATH(seq)) {
+		if (seq->type == SEQ_IMAGE || seq->type == SEQ_MOVIE) {
+			BLI_strncpy(path, seq->strip->dir, FILE_MAX);
+			BLI_add_slash(path); /* incase its missing */
+			if (seq->strip->stripdata) { /* should always be true! */
+				/* Using the first image is weak for image sequences */
+				strcat(path, seq->strip->stripdata->name);
+			} 
+		} else {
+			/* simple case */
+			BLI_strncpy(seq->strip->dir, path, sizeof(seq->strip->dir));
+		}
+	}
+}
+
+void seq_setpath(struct BPathIterator *bpi, char *path) {
+	Sequence *seq = (Sequence *)bpi->data;
+	if (seq==NULL) return; 
+	
+	if (SEQ_HAS_PATH(seq)) {
+		if (seq->type == SEQ_IMAGE || seq->type == SEQ_MOVIE) {
+			char file[FILE_MAX];
+			BLI_split_dirfile(path, seq->strip->dir, file);
+			BLI_add_slash(seq->strip->dir); /* incase its missing */
+			
+			/* now append the filename */
+			if (seq->strip->stripdata) { /* should always be true! */
+				BLI_strncpy(seq->strip->stripdata->name, file, sizeof(seq->strip->stripdata->name));
+			}
+			
+		} else {
+			/* simple case */
+			BLI_strncpy(seq->strip->dir, path, sizeof(seq->strip->dir));
+		}
+	}
+}
+
+static void bpi_type_step__internal( struct BPathIterator *bpi) {
+	bpi->type++; /* advance to the next type */
+	bpi->data = NULL;
+	
+	switch (bpi->type) {
+	case BPATH_SEQ:
+		bpi->getpath_callback = seq_getpath;
+		bpi->setpath_callback = seq_setpath;
+		break;
+	default:
+		bpi->getpath_callback = NULL;
+		bpi->setpath_callback = NULL;
+		break;
+	}
+}
+
 void BLI_bpathIterator_step( struct BPathIterator *bpi) {
 	while (bpi->type != BPATH_DONE) {
 		
 		if  ((bpi->type) == BPATH_IMAGE) {
 			/*if (bpi->data)	bpi->data = ((ID *)bpi->data)->next;*/
-			if (bpi->data)	bpi->data = ima_getpath__internal( (Image *)bpi->data, 1 ); /* must skip images that have no path */
-			else 			bpi->data = ima_getpath__internal(G.main->image.first, 0);
+			if (bpi->data)	bpi->data = ima_stepdata__internal( (Image *)bpi->data, 1 ); /* must skip images that have no path */
+			else 			bpi->data = ima_stepdata__internal(G.main->image.first, 0);
 			
 			if (bpi->data) {
 				/* get the path info from this datatype */
@@ -189,13 +312,13 @@
 				break;
 				
 			} else {
-				bpi->type+=1; /* advance to the next type */
+				bpi_type_step__internal(bpi);
 			}
 			
 			
 		} else if  ((bpi->type) == BPATH_SOUND) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list