[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47432] trunk/blender: Cycles: support for image sequences in image/environment texture node.

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Jun 4 21:38:34 CEST 2012


Revision: 47432
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47432
Author:   blendix
Date:     2012-06-04 19:38:33 +0000 (Mon, 04 Jun 2012)
Log Message:
-----------
Cycles: support for image sequences in image/environment texture node.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_shader.cpp
    trunk/blender/intern/cycles/blender/blender_util.h
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenkernel/BKE_image.h
    trunk/blender/source/blender/blenkernel/intern/image.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/space_node/drawnode.c
    trunk/blender/source/blender/makesdna/DNA_node_types.h
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_environment.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_image.c

Modified: trunk/blender/intern/cycles/blender/blender_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_shader.cpp	2012-06-04 19:38:10 UTC (rev 47431)
+++ trunk/blender/intern/cycles/blender/blender_shader.cpp	2012-06-04 19:38:33 UTC (rev 47432)
@@ -106,7 +106,7 @@
 		mapping->max = get_float3(b_mapping.max());
 }
 
-static ShaderNode *add_node(BL::BlendData b_data, ShaderGraph *graph, BL::ShaderNode b_node)
+static ShaderNode *add_node(BL::BlendData b_data, BL::Scene b_scene, ShaderGraph *graph, BL::ShaderNode b_node)
 {
 	ShaderNode *node = NULL;
 
@@ -343,7 +343,7 @@
 			ImageTextureNode *image = new ImageTextureNode();
 			/* todo: handle generated/builtin images */
 			if(b_image)
-				image->filename = blender_absolute_path(b_data, b_image, b_image.filepath());
+				image->filename = image_user_file_path(b_image_node.image_user(), b_image, b_scene.frame_current());
 			image->color_space = ImageTextureNode::color_space_enum[(int)b_image_node.color_space()];
 			get_tex_mapping(&image->tex_mapping, b_image_node.texture_mapping());
 			node = image;
@@ -354,7 +354,7 @@
 			BL::Image b_image(b_env_node.image());
 			EnvironmentTextureNode *env = new EnvironmentTextureNode();
 			if(b_image)
-				env->filename = blender_absolute_path(b_data, b_image, b_image.filepath());
+				env->filename = image_user_file_path(b_env_node.image_user(), b_image, b_scene.frame_current());
 			env->color_space = EnvironmentTextureNode::color_space_enum[(int)b_env_node.color_space()];
 			env->projection = EnvironmentTextureNode::projection_enum[(int)b_env_node.projection()];
 			get_tex_mapping(&env->tex_mapping, b_env_node.texture_mapping());
@@ -530,7 +530,7 @@
 	}
 }
 
-static void add_nodes(BL::BlendData b_data, ShaderGraph *graph, BL::ShaderNodeTree b_ntree, PtrSockMap& sockets_map)
+static void add_nodes(BL::BlendData b_data, BL::Scene b_scene, ShaderGraph *graph, BL::ShaderNodeTree b_ntree, PtrSockMap& sockets_map)
 {
 	/* add nodes */
 	BL::ShaderNodeTree::nodes_iterator b_node;
@@ -578,10 +578,10 @@
 				set_default_value(proxy->inputs[0], b_output->group_socket());
 			}
 			
-			add_nodes(b_data, graph, b_group_ntree, group_sockmap);
+			add_nodes(b_data, b_scene, graph, b_group_ntree, group_sockmap);
 		}
 		else {
-			ShaderNode *node = add_node(b_data, graph, BL::ShaderNode(*b_node));
+			ShaderNode *node = add_node(b_data, b_scene, graph, BL::ShaderNode(*b_node));
 			
 			if(node) {
 				BL::Node::inputs_iterator b_input;
@@ -671,7 +671,7 @@
 				PtrSockMap sock_to_node;
 				BL::ShaderNodeTree b_ntree(b_mat->node_tree());
 
-				add_nodes(b_data, graph, b_ntree, sock_to_node);
+				add_nodes(b_data, b_scene, graph, b_ntree, sock_to_node);
 			}
 			else {
 				ShaderNode *closure, *out;
@@ -712,7 +712,7 @@
 			PtrSockMap sock_to_node;
 			BL::ShaderNodeTree b_ntree(b_world.node_tree());
 
-			add_nodes(b_data, graph, b_ntree, sock_to_node);
+			add_nodes(b_data, b_scene, graph, b_ntree, sock_to_node);
 		}
 		else if(b_world) {
 			ShaderNode *closure, *out;
@@ -771,7 +771,7 @@
 				PtrSockMap sock_to_node;
 				BL::ShaderNodeTree b_ntree(b_lamp->node_tree());
 
-				add_nodes(b_data, graph, b_ntree, sock_to_node);
+				add_nodes(b_data, b_scene, graph, b_ntree, sock_to_node);
 			}
 			else {
 				ShaderNode *closure, *out;

Modified: trunk/blender/intern/cycles/blender/blender_util.h
===================================================================
--- trunk/blender/intern/cycles/blender/blender_util.h	2012-06-04 19:38:10 UTC (rev 47431)
+++ trunk/blender/intern/cycles/blender/blender_util.h	2012-06-04 19:38:33 UTC (rev 47432)
@@ -53,6 +53,7 @@
 void BLI_timestr(double _time, char *str);
 void rna_ColorRamp_eval(void *coba, float position, float color[4]);
 void rna_Scene_frame_set(void *scene, int frame, float subframe);
+void BKE_image_user_file_path(void *iuser, void *ima, int cfra, char *path);
 
 }
 
@@ -101,6 +102,13 @@
 	return rna_Object_is_deform_modified(self.ptr.data, scene.ptr.data, (preview)? (1<<0): (1<<1))? true: false;
 }
 
+static inline string image_user_file_path(BL::ImageUser iuser, BL::Image ima, int cfra)
+{
+	char filepath[1024];
+	BKE_image_user_file_path(iuser.ptr.data, ima.ptr.data, cfra, filepath);
+	return string(filepath);
+}
+
 static inline void scene_frame_set(BL::Scene scene, int frame)
 {
 	rna_Scene_frame_set(scene.ptr.data, frame, 0.0f);

Modified: trunk/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_blender.h	2012-06-04 19:38:10 UTC (rev 47431)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h	2012-06-04 19:38:33 UTC (rev 47432)
@@ -42,7 +42,7 @@
  * and keep comment above the defines.
  * Use STRINGIFY() rather than defining with quotes */
 #define BLENDER_VERSION         263
-#define BLENDER_SUBVERSION      8
+#define BLENDER_SUBVERSION      9
 
 #define BLENDER_MINVERSION      250
 #define BLENDER_MINSUBVERSION   0

Modified: trunk/blender/source/blender/blenkernel/BKE_image.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_image.h	2012-06-04 19:38:10 UTC (rev 47431)
+++ trunk/blender/source/blender/blenkernel/BKE_image.h	2012-06-04 19:38:33 UTC (rev 47432)
@@ -157,6 +157,7 @@
 void BKE_image_user_frame_calc(struct ImageUser *iuser, int cfra, int fieldnr);
 void BKE_image_user_check_frame_calc(struct ImageUser *iuser, int cfra, int fieldnr);
 int  BKE_image_user_frame_get(const struct ImageUser *iuser, int cfra, int fieldnr);
+void BKE_image_user_file_path(struct ImageUser *iuser, struct Image *ima, int cfra, char *path); 
 
 /* sets index offset for multilayer files */
 struct RenderPass *BKE_image_multilayer_index(struct RenderResult *rr, struct ImageUser *iuser);

Modified: trunk/blender/source/blender/blenkernel/intern/image.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/image.c	2012-06-04 19:38:10 UTC (rev 47431)
+++ trunk/blender/source/blender/blenkernel/intern/image.c	2012-06-04 19:38:33 UTC (rev 47432)
@@ -2084,8 +2084,7 @@
 static ImBuf *image_load_sequence_file(Image *ima, ImageUser *iuser, int frame)
 {
 	struct ImBuf *ibuf;
-	unsigned short numlen;
-	char name[FILE_MAX], head[FILE_MAX], tail[FILE_MAX];
+	char name[FILE_MAX];
 	int flag;
 	
 	/* XXX temp stuff? */
@@ -2093,11 +2092,7 @@
 		ima->tpageflag |= IMA_TPAGE_REFRESH;
 
 	ima->lastframe = frame;
-	BLI_strncpy(name, ima->name, sizeof(name));
-	BLI_stringdec(name, head, tail, &numlen);
-	BLI_stringenc(name, head, tail, numlen, frame);
-
-	BLI_path_abs(name, ID_BLEND_PATH(G.main, &ima->id));
+	BKE_image_user_file_path(iuser, ima, frame, name);
 	
 	flag = IB_rect | IB_multilayer;
 	if (ima->flag & IMA_DO_PREMUL)
@@ -2209,8 +2204,7 @@
 	if (ima->anim == NULL) {
 		char str[FILE_MAX];
 		
-		BLI_strncpy(str, ima->name, FILE_MAX);
-		BLI_path_abs(str, ID_BLEND_PATH(G.main, &ima->id));
+		BKE_image_user_file_path(iuser, ima, frame, str);
 
 		/* FIXME: make several stream accessible in image editor, too*/
 		ima->anim = openanim(str, IB_rect, 0);
@@ -2273,8 +2267,7 @@
 			flag |= IB_premul;
 			
 		/* get the right string */
-		BLI_strncpy(str, ima->name, sizeof(str));
-		BLI_path_abs(str, ID_BLEND_PATH(G.main, &ima->id));
+		BKE_image_user_file_path(iuser, ima, cfra, str);
 		
 		/* read ibuf */
 		ibuf = IMB_loadiffname(str, flag);
@@ -2748,6 +2741,29 @@
 	}
 }
 
+void BKE_image_user_file_path(ImageUser *iuser, Image *ima, int cfra, char *filepath)
+{
+	BLI_strncpy(filepath, ima->name, FILE_MAX);
+
+	if (ima->source == IMA_SRC_SEQUENCE) {
+		char head[FILE_MAX], tail[FILE_MAX];
+		unsigned short numlen;
+		int frame;
+
+		if(iuser) {
+			BKE_image_user_frame_calc(iuser, cfra, 0);
+			frame = iuser->framenr;
+		}
+		else {
+		}
+
+		BLI_stringdec(filepath, head, tail, &numlen);
+		BLI_stringenc(filepath, head, tail, numlen, frame);
+	}
+
+	BLI_path_abs(filepath, ID_BLEND_PATH(G.main, &ima->id));
+}
+
 int BKE_image_has_alpha(struct Image *image)
 {
 	ImBuf *ibuf;

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2012-06-04 19:38:10 UTC (rev 47431)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2012-06-04 19:38:33 UTC (rev 47432)
@@ -6897,6 +6897,22 @@
 	}
 }
 
+static void do_version_ntree_image_user_264(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree)
+{
+	bNode *node;
+
+	for (node = ntree->nodes.first; node; node = node->next) {
+		if (ELEM(node->type, SH_NODE_TEX_IMAGE, SH_NODE_TEX_ENVIRONMENT)) {
+			NodeTexImage *tex = node->storage;
+
+			tex->iuser.frames= 1;
+			tex->iuser.sfra= 1;
+			tex->iuser.fie_ima= 2;
+			tex->iuser.ok= 1;
+		}
+	}
+}
+
 static void do_versions(FileData *fd, Library *lib, Main *main)
 {
 	/* WATCH IT!!!: pointers from libdata have not been converted */
@@ -7608,6 +7624,13 @@
 		}
 	}
 
+	if (main->versionfile < 263 || (main->versionfile == 263 && main->subversionfile < 9)) {
+		bNodeTreeType *ntreetype = ntreeGetType(NTREE_SHADER);
+		
+		if (ntreetype && ntreetype->foreach_nodetree)
+			ntreetype->foreach_nodetree(main, NULL, do_version_ntree_image_user_264);
+	}
+
 	/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
 	/* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */
 	{

Modified: trunk/blender/source/blender/editors/space_node/drawnode.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/drawnode.c	2012-06-04 19:38:10 UTC (rev 47431)
+++ trunk/blender/source/blender/editors/space_node/drawnode.c	2012-06-04 19:38:33 UTC (rev 47432)
@@ -1188,6 +1188,47 @@
 }
 
 /* ****************** BUTTON CALLBACKS FOR SHADER NODES ***************** */
+
+static void node_buts_image_user(uiLayout *layout, bContext *C, PointerRNA *imaptr, PointerRNA *iuserptr)
+{
+	uiLayout *col;
+	int source;
+
+	if(!imaptr->data)
+		return;
+
+	col = uiLayoutColumn(layout, 0);
+	
+	uiItemR(col, imaptr, "source", 0, "", ICON_NONE);
+	
+	source = RNA_enum_get(imaptr, "source");
+
+	if (source == IMA_SRC_SEQUENCE) {
+		/* don't use iuser->framenr directly because it may not be updated if auto-refresh is off */
+		Scene *scene = CTX_data_scene(C);
+		ImageUser *iuser = iuserptr->data;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list