[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54205] trunk/blender/intern/cycles: Cycles material preview: fix for generated/packed/movie files

Sergey Sharybin sergey.vfx at gmail.com
Wed Jan 30 14:42:17 CET 2013


Revision: 54205
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54205
Author:   nazgul
Date:     2013-01-30 13:42:12 +0000 (Wed, 30 Jan 2013)
Log Message:
-----------
Cycles material preview: fix for generated/packed/movie files

Issue was caused by cycles trying to find builtin images in a main
database and in case of preview render images are not in database,
they're just referenced by shader node tree.

Now builtin images in cycles have got void* pointer to store data
needed to load builtin images.

In case ob blender session, this pointer will store pointer from
PointerRNA for image datablock and used later to construct Image
class based on this pointer.

This also saves database lookup for final render which is nice :)

Reviewed by Brecht.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_session.cpp
    trunk/blender/intern/cycles/blender/blender_session.h
    trunk/blender/intern/cycles/blender/blender_shader.cpp
    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_session.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_session.cpp	2013-01-30 12:22:02 UTC (rev 54204)
+++ trunk/blender/intern/cycles/blender/blender_session.cpp	2013-01-30 13:42:12 UTC (rev 54205)
@@ -111,9 +111,9 @@
 	b_engine.use_highlight_tiles(session_params.progressive_refine == false);
 
 	/* setup callbacks for builtin image support */
-	scene->image_manager->builtin_image_info_cb = function_bind(&BlenderSession::builtin_image_info, this, _1, _2, _3, _4, _5);
-	scene->image_manager->builtin_image_pixels_cb = function_bind(&BlenderSession::builtin_image_pixels, this, _1, _2);
-	scene->image_manager->builtin_image_float_pixels_cb = function_bind(&BlenderSession::builtin_image_float_pixels, this, _1, _2);
+	scene->image_manager->builtin_image_info_cb = function_bind(&BlenderSession::builtin_image_info, this, _1, _2, _3, _4, _5, _6);
+	scene->image_manager->builtin_image_pixels_cb = function_bind(&BlenderSession::builtin_image_pixels, this, _1, _2, _3);
+	scene->image_manager->builtin_image_float_pixels_cb = function_bind(&BlenderSession::builtin_image_float_pixels, this, _1, _2, _3);
 }
 
 void BlenderSession::reset_session(BL::BlendData b_data_, BL::Scene b_scene_)
@@ -622,24 +622,20 @@
 /* builtin image file name is actually an image datablock name with
  * absolute sequence frame number concatenated via '@' character
  *
- * this function splits image id name and frame number from a
- * builtin image name
+ * this function splits frame from builtin name
  */
-void BlenderSession::builtin_name_split(const string &builtin_name, string &name, int &frame)
+int BlenderSession::builtin_image_frame(const string &builtin_name)
 {
 	int last = builtin_name.find_last_of('@');
-	name = builtin_name.substr(0, last);
-	frame = atoi(builtin_name.substr(last + 1, builtin_name.size() - last - 1).c_str());
+	return atoi(builtin_name.substr(last + 1, builtin_name.size() - last - 1).c_str());
 }
 
-void BlenderSession::builtin_image_info(const string &builtin_name, bool &is_float, int &width, int &height, int &channels)
+void BlenderSession::builtin_image_info(const string &builtin_name, void *builtin_data, bool &is_float, int &width, int &height, int &channels)
 {
-	string name;
-	int frame;
-	builtin_name_split(builtin_name, name, frame);
+	PointerRNA ptr;
+	RNA_id_pointer_create((ID*)builtin_data, &ptr);
+	BL::Image b_image(ptr);
 
-	BL::Image b_image = b_data.images[name];
-
 	if(b_image) {
 		is_float = b_image.is_float();
 		width = b_image.size()[0];
@@ -654,13 +650,13 @@
 	}
 }
 
-bool BlenderSession::builtin_image_pixels(const string &builtin_name, unsigned char *pixels)
+bool BlenderSession::builtin_image_pixels(const string &builtin_name, void *builtin_data, unsigned char *pixels)
 {
-	string name;
-	int frame;
-	builtin_name_split(builtin_name, name, frame);
+	int frame = builtin_image_frame(builtin_name);
 
-	BL::Image b_image = b_data.images[name];
+	PointerRNA ptr;
+	RNA_id_pointer_create((ID*)builtin_data, &ptr);
+	BL::Image b_image(ptr);
 
 	if(b_image) {
 		int width = b_image.size()[0];
@@ -696,13 +692,13 @@
 	return false;
 }
 
-bool BlenderSession::builtin_image_float_pixels(const string &builtin_name, float *pixels)
+bool BlenderSession::builtin_image_float_pixels(const string &builtin_name, void *builtin_data, float *pixels)
 {
-	string name;
-	int frame;
-	builtin_name_split(builtin_name, name, frame);
+	int frame = builtin_image_frame(builtin_name);
 
-	BL::Image b_image = b_data.images[name];
+	PointerRNA ptr;
+	RNA_id_pointer_create((ID*)builtin_data, &ptr);
+	BL::Image b_image(ptr);
 
 	if(b_image) {
 		int width = b_image.size()[0];

Modified: trunk/blender/intern/cycles/blender/blender_session.h
===================================================================
--- trunk/blender/intern/cycles/blender/blender_session.h	2013-01-30 12:22:02 UTC (rev 54204)
+++ trunk/blender/intern/cycles/blender/blender_session.h	2013-01-30 13:42:12 UTC (rev 54205)
@@ -94,10 +94,10 @@
 	void do_write_update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile, bool do_update_only);
 	void do_write_update_render_tile(RenderTile& rtile, bool do_update_only);
 
-	void builtin_name_split(const string &builtin_name, string &name, int &frame);
-	void builtin_image_info(const string &builtin_name, bool &is_float, int &width, int &height, int &channels);
-	bool builtin_image_pixels(const string &builtin_name, unsigned char *pixels);
-	bool builtin_image_float_pixels(const string &builtin_name, float *pixels);
+	int builtin_image_frame(const string &builtin_name);
+	void builtin_image_info(const string &builtin_name, void *builtin_data, bool &is_float, int &width, int &height, int &channels);
+	bool builtin_image_pixels(const string &builtin_name, void *builtin_data, unsigned char *pixels);
+	bool builtin_image_float_pixels(const string &builtin_name, void *builtin_data, float *pixels);
 };
 
 CCL_NAMESPACE_END

Modified: trunk/blender/intern/cycles/blender/blender_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_shader.cpp	2013-01-30 12:22:02 UTC (rev 54204)
+++ trunk/blender/intern/cycles/blender/blender_shader.cpp	2013-01-30 13:42:12 UTC (rev 54205)
@@ -529,11 +529,11 @@
 					int scene_frame = b_scene.frame_current();
 					int image_frame = image_user_frame_number(b_image_node.image_user(), scene_frame);
 					image->filename = b_image.name() + "@" + string_printf("%d", image_frame);
-					image->is_builtin = true;
+					image->builtin_data = b_image.ptr.data;
 				}
 				else {
 					image->filename = image_user_file_path(b_image_node.image_user(), b_image, b_scene.frame_current());
-					image->is_builtin = false;
+					image->builtin_data = NULL;
 				}
 
 				image->animated = b_image_node.image_user().use_auto_refresh();
@@ -558,11 +558,12 @@
 					int scene_frame = b_scene.frame_current();
 					int image_frame = image_user_frame_number(b_env_node.image_user(), scene_frame);
 					env->filename = b_image.name() + "@" + string_printf("%d", image_frame);
-					env->is_builtin = true;
+					env->builtin_data = b_image.ptr.data;
 				}
 				else {
 					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->builtin_data = NULL;
 				}
 			}
 			env->color_space = EnvironmentTextureNode::color_space_enum[(int)b_env_node.color_space()];

Modified: trunk/blender/intern/cycles/render/image.cpp
===================================================================
--- trunk/blender/intern/cycles/render/image.cpp	2013-01-30 12:22:02 UTC (rev 54204)
+++ trunk/blender/intern/cycles/render/image.cpp	2013-01-30 13:42:12 UTC (rev 54205)
@@ -85,14 +85,14 @@
 	return false;
 }
 
-bool ImageManager::is_float_image(const string& filename, bool is_builtin)
+bool ImageManager::is_float_image(const string& filename, void *builtin_data)
 {
 	bool is_float = false;
 
-	if(is_builtin) {
+	if(builtin_data) {
 		if(builtin_image_info_cb) {
 			int width, height, channels;
-			builtin_image_info_cb(filename, is_float, width, height, channels);
+			builtin_image_info_cb(filename, builtin_data, is_float, width, height, channels);
 		}
 
 		return is_float;
@@ -123,13 +123,13 @@
 	return is_float;
 }
 
-int ImageManager::add_image(const string& filename, bool is_builtin, bool animated, bool& is_float)
+int ImageManager::add_image(const string& filename, void *builtin_data, bool animated, bool& is_float)
 {
 	Image *img;
 	size_t slot;
 
 	/* load image info and find out if we need a float texture */
-	is_float = (pack_images)? false: is_float_image(filename, is_builtin);
+	is_float = (pack_images)? false: is_float_image(filename, builtin_data);
 
 	if(is_float) {
 		/* find existing image */
@@ -160,7 +160,7 @@
 		/* add new image */
 		img = new Image();
 		img->filename = filename;
-		img->is_builtin = is_builtin;
+		img->builtin_data = builtin_data;
 		img->need_load = true;
 		img->animated = animated;
 		img->users = 1;
@@ -195,7 +195,7 @@
 		/* add new image */
 		img = new Image();
 		img->filename = filename;
-		img->is_builtin = is_builtin;
+		img->builtin_data = builtin_data;
 		img->need_load = true;
 		img->animated = animated;
 		img->users = 1;
@@ -209,12 +209,12 @@
 	return slot;
 }
 
-void ImageManager::remove_image(const string& filename, bool is_builtin)
+void ImageManager::remove_image(const string& filename, void *builtin_data)
 {
 	size_t slot;
 
 	for(slot = 0; slot < images.size(); slot++) {
-		if(images[slot] && images[slot]->filename == filename && images[slot]->is_builtin == is_builtin) {
+		if(images[slot] && images[slot]->filename == filename && images[slot]->builtin_data == builtin_data) {
 			/* decrement user count */
 			images[slot]->users--;
 			assert(images[slot]->users >= 0);
@@ -232,7 +232,7 @@
 	if(slot == images.size()) {
 		/* see if it's in a float texture slot */
 		for(slot = 0; slot < float_images.size(); slot++) {
-			if(float_images[slot] && float_images[slot]->filename == filename && float_images[slot]->is_builtin == is_builtin) {
+			if(float_images[slot] && float_images[slot]->filename == filename && float_images[slot]->builtin_data == builtin_data) {
 				/* decrement user count */
 				float_images[slot]->users--;
 				assert(float_images[slot]->users >= 0);
@@ -257,7 +257,7 @@
 	ImageInput *in = NULL;
 	int width, height, components;
 
-	if(!img->is_builtin) {
+	if(!img->builtin_data) {
 		/* load image from file through OIIO */
 		in = ImageInput::create(img->filename);
 
@@ -281,7 +281,7 @@
 			return false;
 
 		bool is_float;
-		builtin_image_info_cb(img->filename, is_float, width, height, components);
+		builtin_image_info_cb(img->filename, img->builtin_data, is_float, width, height, components);
 	}
 
 	/* we only handle certain number of components */
@@ -309,7 +309,7 @@
 		delete in;
 	}
 	else {
-		builtin_image_pixels_cb(img->filename, pixels);
+		builtin_image_pixels_cb(img->filename, img->builtin_data, pixels);
 	}
 
 	if(components == 3) {
@@ -340,7 +340,7 @@
 	ImageInput *in = NULL;
 	int width, height, components;
 
-	if(!img->is_builtin) {
+	if(!img->builtin_data) {
 		/* load image from file through OIIO */
 		in = ImageInput::create(img->filename);
 
@@ -365,7 +365,7 @@
 			return false;
 
 		bool is_float;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list