diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-01-25 16:02:59 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-01-25 16:02:59 +0300 |
commit | ced20b74e58f3dd33840f2a62f6f1f19714b35d7 (patch) | |
tree | 5f97a618b28c9a88635d511178d63c59d8fcc186 /intern | |
parent | e29a6f739de36f4d33cd37181a946345bd26503d (diff) |
Fix T50032: Wrong render result when same image is used with and without alpha
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/blender/blender_shader.cpp | 9 | ||||
-rw-r--r-- | intern/cycles/render/image.cpp | 21 | ||||
-rw-r--r-- | intern/cycles/render/image.h | 6 | ||||
-rw-r--r-- | intern/cycles/render/nodes.cpp | 9 |
4 files changed, 30 insertions, 15 deletions
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp index f63f94ab37a..f6ec015e1b8 100644 --- a/intern/cycles/blender/blender_shader.cpp +++ b/intern/cycles/blender/blender_shader.cpp @@ -640,7 +640,8 @@ static ShaderNode *add_node(Scene *scene, image->filename.string(), image->builtin_data, get_image_interpolation(b_image_node), - get_image_extension(b_image_node)); + get_image_extension(b_image_node), + image->use_alpha); } } image->color_space = (NodeImageColorSpace)b_image_node.color_space(); @@ -686,7 +687,8 @@ static ShaderNode *add_node(Scene *scene, env->filename.string(), env->builtin_data, get_image_interpolation(b_env_node), - EXTENSION_REPEAT); + EXTENSION_REPEAT, + env->use_alpha); } } env->color_space = (NodeImageColorSpace)b_env_node.color_space(); @@ -823,7 +825,8 @@ static ShaderNode *add_node(Scene *scene, point_density->filename.string(), point_density->builtin_data, point_density->interpolation, - EXTENSION_CLIP); + EXTENSION_CLIP, + true); } node = point_density; diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp index ab830b19c57..fd8a1262208 100644 --- a/intern/cycles/render/image.cpp +++ b/intern/cycles/render/image.cpp @@ -258,12 +258,14 @@ static bool image_equals(ImageManager::Image *image, const string& filename, void *builtin_data, InterpolationType interpolation, - ExtensionType extension) + ExtensionType extension, + bool use_alpha) { return image->filename == filename && image->builtin_data == builtin_data && image->interpolation == interpolation && - image->extension == extension; + image->extension == extension && + image->use_alpha == use_alpha; } int ImageManager::add_image(const string& filename, @@ -305,7 +307,8 @@ int ImageManager::add_image(const string& filename, filename, builtin_data, interpolation, - extension)) + extension, + use_alpha)) { if(img->frame != frame) { img->frame = frame; @@ -377,7 +380,8 @@ void ImageManager::remove_image(int flat_slot) void ImageManager::remove_image(const string& filename, void *builtin_data, InterpolationType interpolation, - ExtensionType extension) + ExtensionType extension, + bool use_alpha) { size_t slot; @@ -387,7 +391,8 @@ void ImageManager::remove_image(const string& filename, filename, builtin_data, interpolation, - extension)) + extension, + use_alpha)) { remove_image(type_index_to_flattened_slot(slot, (ImageDataType)type)); return; @@ -403,7 +408,8 @@ void ImageManager::remove_image(const string& filename, void ImageManager::tag_reload_image(const string& filename, void *builtin_data, InterpolationType interpolation, - ExtensionType extension) + ExtensionType extension, + bool use_alpha) { for(size_t type = 0; type < IMAGE_DATA_NUM_TYPES; type++) { for(size_t slot = 0; slot < images[type].size(); slot++) { @@ -411,7 +417,8 @@ void ImageManager::tag_reload_image(const string& filename, filename, builtin_data, interpolation, - extension)) + extension, + use_alpha)) { images[type][slot]->need_load = true; break; diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h index 47bbd92347c..494c74f0cdd 100644 --- a/intern/cycles/render/image.h +++ b/intern/cycles/render/image.h @@ -61,11 +61,13 @@ public: void remove_image(const string& filename, void *builtin_data, InterpolationType interpolation, - ExtensionType extension); + ExtensionType extension, + bool use_alpha); void tag_reload_image(const string& filename, void *builtin_data, InterpolationType interpolation, - ExtensionType extension); + ExtensionType extension, + bool use_alpha); ImageDataType get_image_metadata(const string& filename, void *builtin_data, bool& is_linear); void device_update(Device *device, diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 1e4a9fd300c..13b149eddfa 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -263,7 +263,8 @@ ImageTextureNode::~ImageTextureNode() image_manager->remove_image(filename.string(), builtin_data, interpolation, - extension); + extension, + use_alpha); } } @@ -462,7 +463,8 @@ EnvironmentTextureNode::~EnvironmentTextureNode() image_manager->remove_image(filename.string(), builtin_data, interpolation, - EXTENSION_REPEAT); + EXTENSION_REPEAT, + use_alpha); } } @@ -1381,7 +1383,8 @@ PointDensityTextureNode::~PointDensityTextureNode() image_manager->remove_image(filename.string(), builtin_data, interpolation, - EXTENSION_CLIP); + EXTENSION_CLIP, + true); } } |