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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to