[Bf-blender-cvs] [2eb94be7503] master: Code cleanup: refactor Cycles image metadata retrieval to use a struct.

Brecht Van Lommel noreply at git.blender.org
Tue Feb 27 23:49:48 CET 2018


Commit: 2eb94be7503f0931d02a65243ae116d7879faa9c
Author: Brecht Van Lommel
Date:   Tue Feb 27 22:16:45 2018 +0100
Branches: master
https://developer.blender.org/rB2eb94be7503f0931d02a65243ae116d7879faa9c

Code cleanup: refactor Cycles image metadata retrieval to use a struct.

===================================================================

M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_session.h
M	intern/cycles/render/image.cpp
M	intern/cycles/render/image.h
M	intern/cycles/render/nodes.cpp

===================================================================

diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index c87329711e7..42ceb4d5c8e 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -337,8 +337,9 @@ static void create_mesh_volume_attribute(BL::Object& b_ob,
 
 	Attribute *attr = mesh->attributes.add(std);
 	VoxelAttribute *volume_data = attr->data_voxel();
-	bool is_float, is_linear;
+	ImageMetaData metadata;
 	bool animated = false;
+	bool use_alpha = true;
 
 	volume_data->manager = image_manager;
 	volume_data->slot = image_manager->add_image(
@@ -346,11 +347,10 @@ static void create_mesh_volume_attribute(BL::Object& b_ob,
 	        b_ob.ptr.data,
 	        animated,
 	        frame,
-	        is_float,
-	        is_linear,
 	        INTERPOLATION_LINEAR,
 	        EXTENSION_CLIP,
-	        true);
+	        use_alpha,
+	        metadata);
 }
 
 static void create_mesh_volume_attributes(Scene *scene,
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 679221fc18b..9d1e87b763c 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -135,7 +135,7 @@ void BlenderSession::create_session()
 	scene = new Scene(scene_params, session->device);
 
 	/* 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, _6, _7, _8);
+	scene->image_manager->builtin_image_info_cb = function_bind(&BlenderSession::builtin_image_info, this, _1, _2, _3);
 	scene->image_manager->builtin_image_pixels_cb = function_bind(&BlenderSession::builtin_image_pixels, this, _1, _2, _3, _4, _5);
 	scene->image_manager->builtin_image_float_pixels_cb = function_bind(&BlenderSession::builtin_image_float_pixels, this, _1, _2, _3, _4, _5);
 
@@ -1018,20 +1018,11 @@ int BlenderSession::builtin_image_frame(const string &builtin_name)
 
 void BlenderSession::builtin_image_info(const string &builtin_name,
                                         void *builtin_data,
-                                        bool &is_float,
-                                        int &width,
-                                        int &height,
-                                        int &depth,
-                                        int &channels,
-                                        bool& free_cache)
+                                        ImageMetaData& metadata)
 {
 	/* empty image */
-	is_float = false;
-	width = 1;
-	height = 1;
-	depth = 0;
-	channels = 0;
-	free_cache = false;
+	metadata.width = 1;
+	metadata.height = 1;
 
 	if(!builtin_data)
 		return;
@@ -1045,21 +1036,21 @@ void BlenderSession::builtin_image_info(const string &builtin_name,
 		/* image data */
 		BL::Image b_image(b_id);
 
-		free_cache = !b_image.has_data();
-		is_float = b_image.is_float();
-		width = b_image.size()[0];
-		height = b_image.size()[1];
-		depth = 1;
-		channels = b_image.channels();
+		metadata.builtin_free_cache = !b_image.has_data();
+		metadata.is_float = b_image.is_float();
+		metadata.width = b_image.size()[0];
+		metadata.height = b_image.size()[1];
+		metadata.depth = 1;
+		metadata.channels = b_image.channels();
 	}
 	else if(b_id.is_a(&RNA_Object)) {
 		/* smoke volume data */
 		BL::Object b_ob(b_id);
 		BL::SmokeDomainSettings b_domain = object_smoke_domain_find(b_ob);
 
-		is_float = true;
-		depth = 1;
-		channels = 1;
+		metadata.is_float = true;
+		metadata.depth = 1;
+		metadata.channels = 1;
 
 		if(!b_domain)
 			return;
@@ -1068,11 +1059,11 @@ void BlenderSession::builtin_image_info(const string &builtin_name,
 		   builtin_name == Attribute::standard_name(ATTR_STD_VOLUME_FLAME) ||
 		   builtin_name == Attribute::standard_name(ATTR_STD_VOLUME_HEAT) ||
 		   builtin_name == Attribute::standard_name(ATTR_STD_VOLUME_TEMPERATURE))
-			channels = 1;
+			metadata.channels = 1;
 		else if(builtin_name == Attribute::standard_name(ATTR_STD_VOLUME_COLOR))
-			channels = 4;
+			metadata.channels = 4;
 		else if(builtin_name == Attribute::standard_name(ATTR_STD_VOLUME_VELOCITY))
-			channels = 3;
+			metadata.channels = 3;
 		else
 			return;
 
@@ -1086,9 +1077,9 @@ void BlenderSession::builtin_image_info(const string &builtin_name,
 			amplify = 1;
 		}
 
-		width = resolution.x * amplify;
-		height = resolution.y * amplify;
-		depth = resolution.z * amplify;
+		metadata.width = resolution.x * amplify;
+		metadata.height = resolution.y * amplify;
+		metadata.depth = resolution.z * amplify;
 	}
 	else {
 		/* TODO(sergey): Check we're indeed in shader node tree. */
@@ -1097,9 +1088,11 @@ void BlenderSession::builtin_image_info(const string &builtin_name,
 		BL::Node b_node(ptr);
 		if(b_node.is_a(&RNA_ShaderNodeTexPointDensity)) {
 			BL::ShaderNodeTexPointDensity b_point_density_node(b_node);
-			channels = 4;
-			width = height = depth = b_point_density_node.resolution();
-			is_float = true;
+			metadata.channels = 4;
+			metadata.width = b_point_density_node.resolution();
+			metadata.height = metadata.width;
+			metadata.depth = metadata.width;
+			metadata.is_float = true;
 		}
 	}
 }
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index cbd2303d282..3804e07cffc 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -26,6 +26,7 @@
 
 CCL_NAMESPACE_BEGIN
 
+class ImageMetaData;
 class Scene;
 class Session;
 class RenderBuffers;
@@ -152,12 +153,7 @@ protected:
 	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 &depth,
-	                        int &channels,
-	                        bool &free_cache);
+	                        ImageMetaData& metadata);
 	bool builtin_image_pixels(const string &builtin_name,
 	                          void *builtin_data,
 	                          unsigned char *pixels,
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index dbe15a67b9e..de46599e1db 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -84,99 +84,109 @@ bool ImageManager::set_animation_frame_update(int frame)
 	return false;
 }
 
-ImageDataType ImageManager::get_image_metadata(const string& filename,
-                                               void *builtin_data,
-                                               bool& is_linear,
-                                               bool& builtin_free_cache)
+bool ImageManager::get_image_metadata(const string& filename,
+                                      void *builtin_data,
+                                      ImageMetaData& metadata)
 {
-	bool is_float = false, is_half = false;
-	is_linear = false;
-	builtin_free_cache = false;
-	int channels = 4;
+	memset(&metadata, 0, sizeof(metadata));
 
 	if(builtin_data) {
 		if(builtin_image_info_cb) {
-			int width, height, depth;
-			builtin_image_info_cb(filename, builtin_data, is_float, width, height, depth, channels, builtin_free_cache);
+			builtin_image_info_cb(filename, builtin_data, metadata);
+		}
+		else {
+			return false;
 		}
 
-		if(is_float) {
-			is_linear = true;
-			return (channels > 1) ? IMAGE_DATA_TYPE_FLOAT4 : IMAGE_DATA_TYPE_FLOAT;
+		if(metadata.is_float) {
+			metadata.is_linear = true;
+			metadata.type = (metadata.channels > 1) ? IMAGE_DATA_TYPE_FLOAT4 : IMAGE_DATA_TYPE_FLOAT;
 		}
 		else {
-			return (channels > 1) ? IMAGE_DATA_TYPE_BYTE4 : IMAGE_DATA_TYPE_BYTE;
+			metadata.type = (metadata.channels > 1) ? IMAGE_DATA_TYPE_BYTE4 : IMAGE_DATA_TYPE_BYTE;
 		}
+
+		return true;
 	}
 
 	/* Perform preliminary checks, with meaningful logging. */
 	if(!path_exists(filename)) {
 		VLOG(1) << "File '" << filename << "' does not exist.";
-		return IMAGE_DATA_TYPE_BYTE4;
+		return false;
 	}
 	if(path_is_directory(filename)) {
 		VLOG(1) << "File '" << filename << "' is a directory, can't use as image.";
-		return IMAGE_DATA_TYPE_BYTE4;
+		return false;
 	}
 
 	ImageInput *in = ImageInput::create(filename);
 
-	if(in) {
-		ImageSpec spec;
-
-		if(in->open(filename, spec)) {
-			/* check the main format, and channel formats;
-			 * if any take up more than one byte, we'll need a float texture slot */
-			if(spec.format.basesize() > 1) {
-				is_float = true;
-				is_linear = true;
-			}
+	if(!in) {
+		return false;
+	}
 
-			for(size_t channel = 0; channel < spec.channelformats.size(); channel++) {
-				if(spec.channelformats[channel].basesize() > 1) {
-					is_float = true;
-					is_linear = true;
-				}
-			}
+	ImageSpec spec;
+	if(!in->open(filename, spec)) {
+		delete in;
+		return false;
+	}
 
-			/* check if it's half float */
-			if(spec.format == TypeDesc::HALF)
-				is_half = true;
+	metadata.width = spec.width;
+	metadata.height = spec.height;
+	metadata.depth = spec.depth;
 
-			channels = spec.nchannels;
+	/* check the main format, and channel formats;
+	 * if any take up more than one byte, we'll need a float texture slot */
+	if(spec.format.basesize() > 1) {
+		metadata.is_float = true;
+		metadata.is_linear = true;
+	}
 
-			/* basic color space detection, not great but better than nothing
-			 * before we do OpenColorIO integration */
-			if(is_float) {
-				string colorspace = spec.get_string_attribute("oiio:ColorSpace");
+	for(size_t channel = 0; channel < spec.channelformats.size(); channel++) {
+		if(spec.channelformats[channel].basesize() > 1) {
+			metadata.is_float = true;
+			metadata.is_linear = true;
+		}
+	}
 
-				is_linear = !(colorspace == "sRGB" ||
-				              colorspace == "GammaCorrected" ||
-				              (colorspace == "" &&
-				                  (strcmp(in->format_name(), "png") == 0 ||
-				                   strcmp(in->format_name(), "tiff") == 0 ||
-				                   strcmp(in->format_name(), "dpx") == 0 ||
-				                   strcmp(in->format_name(), "jpeg2000") == 0)));
-			}
-			else {
-				is_linear = false;
-			}
+	/* check if it's half float */
+	if(spec.format == TypeD

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list