[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12954] trunk/blender/source/blender: Render-farm and file utils for dealing with external data.

Campbell Barton ideasman42 at gmail.com
Thu Dec 20 11:27:13 CET 2007


Revision: 12954
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12954
Author:   campbellbarton
Date:     2007-12-20 11:27:13 +0100 (Thu, 20 Dec 2007)

Log Message:
-----------
Render-farm and file utils for dealing with external data.
Useful to use before sending blend files to the renderfarm.

* Make all Paths Relative - makes any absolute paths relative.
* Report Missing Files - creates a textblock listing all missing files.
* Find Missing Files - searches a directory recursively for filenames that dont exist at their current path.

Added a path looper type and functions that currently loop on image, sound, font and external library paths.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_boxpack2d.h
    trunk/blender/source/blender/src/header_info.c

Added Paths:
-----------
    trunk/blender/source/blender/blenlib/BLI_bpath.h
    trunk/blender/source/blender/blenlib/intern/bpath.c

Modified: trunk/blender/source/blender/blenlib/BLI_boxpack2d.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_boxpack2d.h	2007-12-20 09:15:43 UTC (rev 12953)
+++ trunk/blender/source/blender/blenlib/BLI_boxpack2d.h	2007-12-20 10:27:13 UTC (rev 12954)
@@ -28,10 +28,7 @@
  * Contributor(s): Campbell Barton
  *
  * ***** END GPL/BL DUAL LICENSE BLOCK *****
- *
- * The old math stuff from Ton. These will slowly phase out in favour
- * of MTC calls. (or even MoTO :) )
- * */
+ */
 
 /* Box Packer */
 

Added: trunk/blender/source/blender/blenlib/BLI_bpath.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_bpath.h	                        (rev 0)
+++ trunk/blender/source/blender/blenlib/BLI_bpath.h	2007-12-20 10:27:13 UTC (rev 12954)
@@ -0,0 +1,59 @@
+/**
+ *
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License.  See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+/* Based on ghash, difference is ghash is not a fixed size,
+ * so for BPath we dont need to malloc  */
+
+struct BPathIterator {
+	char*	path;
+	char*	lib;
+	char*	name;
+	void*	data;
+	int		len;
+	int		type;
+};
+
+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);
+
+/* high level funcs */
+
+/* creates a text file with missing files if there are any */
+struct Text * checkMissingFiles(void);
+void makeFilesRelative(int *tot, int *changed, int *failed, int *linked);
+void findMissingFiles(char *str);

Added: trunk/blender/source/blender/blenlib/intern/bpath.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/bpath.c	                        (rev 0)
+++ trunk/blender/source/blender/blenlib/intern/bpath.c	2007-12-20 10:27:13 UTC (rev 12954)
@@ -0,0 +1,485 @@
+/**
+ *
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License.  See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Campbell barton
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#include "BLI_bpath.h"
+#include "BKE_global.h"
+#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 <stdlib.h>
+#include <string.h>
+
+#include "BKE_main.h" /* so we can access G.main->*.first */
+#include "BKE_image.h" /* so we can check the image's type */
+
+#include "blendef.h"
+#include "BKE_utildefines.h"
+
+/* for writing to a textblock */
+#include "BKE_text.h" 
+#include "BLI_blenlib.h"
+#include "DNA_text_types.h"
+
+/* path/file handeling stuff */
+#ifndef WIN32
+  #include <dirent.h>
+#else
+  #include "BLI_winstuff.h"
+#endif
+
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <math.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define FILE_MAX			240
+
+
+/* TODO - BPATH_PLUGIN, BPATH_SEQ */
+enum BPathTypes {
+	BPATH_IMAGE = 0,
+	BPATH_SOUND,
+	BPATH_FONT,
+	BPATH_LIB,
+
+ 	BPATH_DONE
+};
+
+
+void BLI_bpathIterator_init( struct BPathIterator *bpi ) {
+	bpi->type = BPATH_IMAGE;
+	bpi->data = NULL;
+	BLI_bpathIterator_step(bpi);
+}
+
+char* BLI_bpathIterator_getPath( struct BPathIterator *bpi) {
+	return bpi->path;
+}
+void BLI_bpathIterator_copyPathExpanded( struct BPathIterator *bpi, char *path_expanded) {
+	char *filepath, *libpath;
+	
+	filepath = BLI_bpathIterator_getPath(bpi);
+	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 */
+		BLI_convertstringcode(path_expanded, G.sce, G.scene->r.cfra);
+	}
+}
+char* BLI_bpathIterator_getLib( struct BPathIterator *bpi) {
+	return bpi->lib;
+}
+char* BLI_bpathIterator_getName( struct BPathIterator *bpi) {
+	return bpi->name;
+}
+int	BLI_bpathIterator_getType( struct BPathIterator *bpi) {
+	return bpi->type;
+}
+int	BLI_bpathIterator_getPathMaxLen( struct BPathIterator *bpi) {
+	return bpi->len;
+}
+
+/* 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) {
+	if (ima==NULL)
+		return NULL;
+	
+	if (step_next)
+		ima = ima->id.next;
+	
+	while (ima) {
+		if (ima->packedfile==NULL && ELEM3(ima->source, IMA_SRC_FILE, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE))
+			break;
+		/* image is not a image with a path, skip it */
+		ima = ima->id.next;
+	}	
+	return ima;
+}
+
+static struct VFont *vf_getpath__internal(struct VFont *vf, int step_next) {
+	if (vf==NULL)
+		return NULL;
+	
+	if (step_next)
+		vf = vf->id.next;
+	
+	while (vf) {
+		if (vf->packedfile==NULL && BLI_streq(vf->name, "<builtin>")==0) {
+			break;
+		}
+		
+		/* font with no path, skip it */
+		vf = vf->id.next;
+	}	
+	return vf;
+}
+
+static struct bSound *snd_getpath__internal(struct bSound *snd, int step_next) {
+	if (snd==NULL)
+		return NULL;
+	
+	if (step_next)
+		snd = snd->id.next;
+	
+	while (snd) {
+		if (snd->packedfile==NULL) {
+			break;
+		}
+		
+		/* font with no path, skip it */
+		snd = snd->id.next;
+	}	
+	return snd;
+}
+
+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) {
+				/* get the path info from this datatype */
+				Image *ima = (Image *)bpi->data;
+				
+				bpi->lib = ima->id.lib ? ima->id.lib->filename : NULL;
+				bpi->path = ima->name;
+				bpi->name = ima->id.name+2;
+				bpi->len = sizeof(ima->name);
+				
+				/* we are done, advancing to the next item, this type worked fine */
+				break;
+				
+			} else {
+				bpi->type+=1; /* advance to the next type */
+			}
+			
+			
+		} else if  ((bpi->type) == BPATH_SOUND) {
+			if (bpi->data)	bpi->data = snd_getpath__internal( (bSound *)bpi->data, 1 ); /* must skip images that have no path */
+			else 			bpi->data = snd_getpath__internal(G.main->sound.first, 0);
+			
+			if (bpi->data) {
+				/* get the path info from this datatype */
+				bSound *snd = (bSound *)bpi->data;
+				
+				bpi->lib = snd->id.lib ? snd->id.lib->filename : NULL;
+				bpi->path = snd->sample->name;
+				bpi->name = snd->id.name+2;
+				bpi->len = sizeof(snd->sample->name);
+				
+				/* we are done, advancing to the next item, this type worked fine */
+				break;
+			} else {
+				bpi->type+=1; /* advance to the next type */
+			}
+			
+			
+		} else if  ((bpi->type) == BPATH_FONT) {
+			
+			if (bpi->data)	bpi->data = vf_getpath__internal( (VFont *)bpi->data, 1 );
+			else 			bpi->data = vf_getpath__internal( G.main->vfont.first, 0 );
+			
+			if (bpi->data) {
+				/* get the path info from this datatype */
+				VFont *vf = (VFont *)bpi->data;
+				
+				bpi->lib = vf->id.lib ? vf->id.lib->filename : NULL;
+				bpi->path = vf->name;
+				bpi->name = vf->id.name+2;
+				bpi->len = sizeof(vf->name);
+				
+				/* we are done, advancing to the next item, this type worked fine */
+				break;
+			} else {
+				bpi->type+=1; /* advance to the next type */
+			}
+			
+			
+		} else if  ((bpi->type) == BPATH_LIB) {
+			
+			if (bpi->data)	bpi->data = ((ID *)bpi->data)->next;
+			else 			bpi->data = G.main->library.first;
+			
+			if (bpi->data) {
+				/* get the path info from this datatype */
+				Library *lib = (Library *)bpi->data;
+				
+				bpi->lib = NULL;
+				bpi->path = lib->name;
+				bpi->name = NULL;
+				bpi->len = sizeof(lib->name);
+				

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list