[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52439] trunk/blender/intern/cycles: Fix #32796: cycles did not support image auto refresh option.

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Nov 21 14:00:52 CET 2012


Revision: 52439
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52439
Author:   blendix
Date:     2012-11-21 13:00:51 +0000 (Wed, 21 Nov 2012)
Log Message:
-----------
Fix #32796: cycles did not support image auto refresh option.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_shader.cpp
    trunk/blender/intern/cycles/blender/blender_sync.h
    trunk/blender/intern/cycles/render/image.cpp
    trunk/blender/intern/cycles/render/image.h
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/intern/cycles/render/nodes.h

Modified: trunk/blender/intern/cycles/blender/blender_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_shader.cpp	2012-11-21 11:57:35 UTC (rev 52438)
+++ trunk/blender/intern/cycles/blender/blender_shader.cpp	2012-11-21 13:00:51 UTC (rev 52439)
@@ -500,8 +500,10 @@
 			BL::Image b_image(b_image_node.image());
 			ImageTextureNode *image = new ImageTextureNode();
 			/* todo: handle generated/builtin images */
-			if(b_image && b_image.source() != BL::Image::source_MOVIE)
+			if(b_image && b_image.source() != BL::Image::source_MOVIE) {
 				image->filename = image_user_file_path(b_image_node.image_user(), b_image, b_scene.frame_current());
+				image->animated = b_image_node.image_user().use_auto_refresh();
+			}
 			image->color_space = ImageTextureNode::color_space_enum[(int)b_image_node.color_space()];
 			image->projection = ImageTextureNode::projection_enum[(int)b_image_node.projection()];
 			image->projection_blend = b_image_node.projection_blend();
@@ -513,8 +515,10 @@
 			BL::ShaderNodeTexEnvironment b_env_node(b_node);
 			BL::Image b_image(b_env_node.image());
 			EnvironmentTextureNode *env = new EnvironmentTextureNode();
-			if(b_image && b_image.source() != BL::Image::source_MOVIE)
+			if(b_image && b_image.source() != BL::Image::source_MOVIE) {
 				env->filename = image_user_file_path(b_env_node.image_user(), b_image, b_scene.frame_current());
+				env->animated = b_env_node.image_user().use_auto_refresh();
+			}
 			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());
@@ -821,7 +825,7 @@
 
 /* Sync Materials */
 
-void BlenderSync::sync_materials()
+void BlenderSync::sync_materials(bool update_all)
 {
 	shader_map.set_default(scene->shaders[scene->default_surface]);
 
@@ -832,7 +836,7 @@
 		Shader *shader;
 		
 		/* test if we need to sync */
-		if(shader_map.sync(&shader, *b_mat)) {
+		if(shader_map.sync(&shader, *b_mat) || update_all) {
 			ShaderGraph *graph = new ShaderGraph();
 
 			shader->name = b_mat->name().c_str();
@@ -868,14 +872,14 @@
 
 /* Sync World */
 
-void BlenderSync::sync_world()
+void BlenderSync::sync_world(bool update_all)
 {
 	Background *background = scene->background;
 	Background prevbackground = *background;
 
 	BL::World b_world = b_scene.world();
 
-	if(world_recalc || b_world.ptr.data != world_map) {
+	if(world_recalc || update_all || b_world.ptr.data != world_map) {
 		Shader *shader = scene->shaders[scene->default_background];
 		ShaderGraph *graph = new ShaderGraph();
 
@@ -922,7 +926,7 @@
 
 /* Sync Lamps */
 
-void BlenderSync::sync_lamps()
+void BlenderSync::sync_lamps(bool update_all)
 {
 	shader_map.set_default(scene->shaders[scene->default_light]);
 
@@ -933,7 +937,7 @@
 		Shader *shader;
 		
 		/* test if we need to sync */
-		if(shader_map.sync(&shader, *b_lamp)) {
+		if(shader_map.sync(&shader, *b_lamp) || update_all) {
 			ShaderGraph *graph = new ShaderGraph();
 
 			/* create nodes */
@@ -972,11 +976,20 @@
 
 void BlenderSync::sync_shaders()
 {
+	/* for auto refresh images */
+	bool auto_refresh_update = false;
+
+	if(preview) {
+		ImageManager *image_manager = scene->image_manager;
+		int frame = b_scene.frame_current();
+		auto_refresh_update = image_manager->set_animation_frame_update(frame);
+	}
+
 	shader_map.pre_sync();
 
-	sync_world();
-	sync_lamps();
-	sync_materials();
+	sync_world(auto_refresh_update);
+	sync_lamps(auto_refresh_update);
+	sync_materials(auto_refresh_update);
 
 	/* false = don't delete unused shaders, not supported */
 	shader_map.post_sync(false);

Modified: trunk/blender/intern/cycles/blender/blender_sync.h
===================================================================
--- trunk/blender/intern/cycles/blender/blender_sync.h	2012-11-21 11:57:35 UTC (rev 52438)
+++ trunk/blender/intern/cycles/blender/blender_sync.h	2012-11-21 13:00:51 UTC (rev 52439)
@@ -68,14 +68,14 @@
 
 private:
 	/* sync */
-	void sync_lamps();
-	void sync_materials();
+	void sync_lamps(bool update_all);
+	void sync_materials(bool update_all);
 	void sync_objects(BL::SpaceView3D b_v3d, int motion = 0);
 	void sync_motion(BL::SpaceView3D b_v3d, BL::Object b_override);
 	void sync_film();
 	void sync_integrator();
 	void sync_view();
-	void sync_world();
+	void sync_world(bool update_all);
 	void sync_render_layers(BL::SpaceView3D b_v3d, const char *layer);
 	void sync_shaders();
 

Modified: trunk/blender/intern/cycles/render/image.cpp
===================================================================
--- trunk/blender/intern/cycles/render/image.cpp	2012-11-21 11:57:35 UTC (rev 52438)
+++ trunk/blender/intern/cycles/render/image.cpp	2012-11-21 13:00:51 UTC (rev 52439)
@@ -36,6 +36,7 @@
 	need_update = true;
 	pack_images = false;
 	osl_texture_system = NULL;
+	animation_frame = 0;
 
 	tex_num_images = TEX_NUM_IMAGES;
 	tex_num_float_images = TEX_NUM_FLOAT_IMAGES;
@@ -67,6 +68,23 @@
 	tex_image_byte_start = TEX_EXTENDED_IMAGE_BYTE_START;
 }
 
+bool ImageManager::set_animation_frame_update(int frame)
+{
+	if(frame != animation_frame) {
+		animation_frame = frame;
+
+		for(size_t slot = 0; slot < images.size(); slot++)
+			if(images[slot] && images[slot]->animated)
+				return true;
+
+		for(size_t slot = 0; slot < float_images.size(); slot++)
+			if(float_images[slot] && float_images[slot]->animated)
+				return true;
+	}
+	
+	return false;
+}
+
 bool ImageManager::is_float_image(const string& filename)
 {
 	ImageInput *in = ImageInput::create(filename);
@@ -95,7 +113,7 @@
 	return is_float;
 }
 
-int ImageManager::add_image(const string& filename, bool& is_float)
+int ImageManager::add_image(const string& filename, bool animated, bool& is_float)
 {
 	Image *img;
 	size_t slot;
@@ -133,6 +151,7 @@
 		img = new Image();
 		img->filename = filename;
 		img->need_load = true;
+		img->animated = animated;
 		img->users = 1;
 
 		float_images[slot] = img;
@@ -166,6 +185,7 @@
 		img = new Image();
 		img->filename = filename;
 		img->need_load = true;
+		img->animated = animated;
 		img->users = 1;
 
 		images[slot] = img;

Modified: trunk/blender/intern/cycles/render/image.h
===================================================================
--- trunk/blender/intern/cycles/render/image.h	2012-11-21 11:57:35 UTC (rev 52438)
+++ trunk/blender/intern/cycles/render/image.h	2012-11-21 13:00:51 UTC (rev 52439)
@@ -51,7 +51,7 @@
 	ImageManager();
 	~ImageManager();
 
-	int add_image(const string& filename, bool& is_float);
+	int add_image(const string& filename, bool animated, bool& is_float);
 	void remove_image(const string& filename);
 	bool is_float_image(const string& filename);
 
@@ -60,8 +60,8 @@
 
 	void set_osl_texture_system(void *texture_system);
 	void set_pack_images(bool pack_images_);
-
 	void set_extended_image_limits(void);
+	bool set_animation_frame_update(int frame);
 
 	bool need_update;
 
@@ -70,11 +70,13 @@
 	int tex_num_float_images;
 	int tex_image_byte_start;
 	thread_mutex device_mutex;
+	int animation_frame;
 
 	struct Image {
 		string filename;
 
 		bool need_load;
+		bool animated;
 		int users;
 	};
 

Modified: trunk/blender/intern/cycles/render/nodes.cpp
===================================================================
--- trunk/blender/intern/cycles/render/nodes.cpp	2012-11-21 11:57:35 UTC (rev 52438)
+++ trunk/blender/intern/cycles/render/nodes.cpp	2012-11-21 13:00:51 UTC (rev 52439)
@@ -145,6 +145,7 @@
 	color_space = ustring("Color");
 	projection = ustring("Flat");;
 	projection_blend = 0.0f;
+	animated = false;
 
 	add_input("Vector", SHADER_SOCKET_POINT, ShaderInput::TEXTURE_UV);
 	add_output("Color", SHADER_SOCKET_COLOR);
@@ -175,7 +176,7 @@
 	image_manager = compiler.image_manager;
 	if(is_float == -1) {
 		bool is_float_bool;
-		slot = image_manager->add_image(filename, is_float_bool);
+		slot = image_manager->add_image(filename, animated, is_float_bool);
 		is_float = (int)is_float_bool;
 	}
 
@@ -272,6 +273,7 @@
 	filename = "";
 	color_space = ustring("Color");
 	projection = ustring("Equirectangular");
+	animated = false;
 
 	add_input("Vector", SHADER_SOCKET_VECTOR, ShaderInput::POSITION);
 	add_output("Color", SHADER_SOCKET_COLOR);
@@ -302,7 +304,7 @@
 	image_manager = compiler.image_manager;
 	if(slot == -1) {
 		bool is_float_bool;
-		slot = image_manager->add_image(filename, is_float_bool);
+		slot = image_manager->add_image(filename, animated, is_float_bool);
 		is_float = (int)is_float_bool;
 	}
 

Modified: trunk/blender/intern/cycles/render/nodes.h
===================================================================
--- trunk/blender/intern/cycles/render/nodes.h	2012-11-21 11:57:35 UTC (rev 52438)
+++ trunk/blender/intern/cycles/render/nodes.h	2012-11-21 13:00:51 UTC (rev 52439)
@@ -73,6 +73,7 @@
 	ustring color_space;
 	ustring projection;
 	float projection_blend;
+	bool animated;
 
 	static ShaderEnum color_space_enum;
 	static ShaderEnum projection_enum;
@@ -90,6 +91,7 @@
 	string filename;
 	ustring color_space;
 	ustring projection;
+	bool animated;
 
 	static ShaderEnum color_space_enum;
 	static ShaderEnum projection_enum;




More information about the Bf-blender-cvs mailing list