diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2020-03-08 16:21:29 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2020-03-11 22:45:39 +0300 |
commit | 6cf4861c3ac09fd65a765e8f8e3584713cc5303b (patch) | |
tree | b2b104fbda65b67c56dd2a39ad812c89bc5b1ee2 /intern/cycles/blender/blender_shader.cpp | |
parent | d8aa613d94caf6a3d82a8f4e9e90b9b8f5c61a7d (diff) |
Cleanup: refactor image loading to use abstract ImageLoader base class
Rather than passing around void pointers, various Blender image sources now
subclass this. OIIO is also just another type of image loader.
Also fixes T67718: Cycles viewport render crash editing point density settings
Diffstat (limited to 'intern/cycles/blender/blender_shader.cpp')
-rw-r--r-- | intern/cycles/blender/blender_shader.cpp | 53 |
1 files changed, 26 insertions, 27 deletions
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp index 64367d5fcd0..dc226805664 100644 --- a/intern/cycles/blender/blender_shader.cpp +++ b/intern/cycles/blender/blender_shader.cpp @@ -23,6 +23,7 @@ #include "render/scene.h" #include "render/shader.h" +#include "blender/blender_image.h" #include "blender/blender_texture.h" #include "blender/blender_sync.h" #include "blender/blender_util.h" @@ -650,6 +651,18 @@ static ShaderNode *add_node(Scene *scene, get_tex_mapping(&image->tex_mapping, b_texture_mapping); if (b_image) { + PointerRNA colorspace_ptr = b_image.colorspace_settings().ptr; + image->colorspace = get_enum_identifier(colorspace_ptr, "name"); + + image->animated = b_image_node.image_user().use_auto_refresh(); + image->alpha_type = get_image_alpha_type(b_image); + + image->tiles.clear(); + BL::Image::tiles_iterator b_iter; + for (b_image.tiles.begin(b_iter); b_iter != b_image.tiles.end(); ++b_iter) { + image->tiles.push_back(b_iter->number()); + } + /* builtin images will use callback-based reading because * they could only be loaded correct from blender side */ @@ -666,25 +679,12 @@ static ShaderNode *add_node(Scene *scene, */ int scene_frame = b_scene.frame_current(); int image_frame = image_user_frame_number(b_image_user, scene_frame); - image->filename = b_image.name() + "@" + string_printf("%d", image_frame); - image->builtin_data = b_image.ptr.data; + image->handle = scene->image_manager->add_image( + new BlenderImageLoader(b_image, image_frame), image->image_params()); } else { image->filename = image_user_file_path( b_image_user, b_image, b_scene.frame_current(), true); - image->builtin_data = NULL; - } - - PointerRNA colorspace_ptr = b_image.colorspace_settings().ptr; - image->colorspace = get_enum_identifier(colorspace_ptr, "name"); - - image->animated = b_image_node.image_user().use_auto_refresh(); - image->alpha_type = get_image_alpha_type(b_image); - - image->tiles.clear(); - BL::Image::tiles_iterator b_iter; - for (b_image.tiles.begin(b_iter); b_iter != b_image.tiles.end(); ++b_iter) { - image->tiles.push_back(b_iter->number()); } } node = image; @@ -701,6 +701,12 @@ static ShaderNode *add_node(Scene *scene, get_tex_mapping(&env->tex_mapping, b_texture_mapping); if (b_image) { + PointerRNA colorspace_ptr = b_image.colorspace_settings().ptr; + env->colorspace = get_enum_identifier(colorspace_ptr, "name"); + + env->animated = b_env_node.image_user().use_auto_refresh(); + env->alpha_type = get_image_alpha_type(b_image); + bool is_builtin = b_image.packed_file() || b_image.source() == BL::Image::source_GENERATED || b_image.source() == BL::Image::source_MOVIE || (b_engine.is_preview() && b_image.source() != BL::Image::source_SEQUENCE); @@ -708,20 +714,13 @@ static ShaderNode *add_node(Scene *scene, if (is_builtin) { int scene_frame = b_scene.frame_current(); int image_frame = image_user_frame_number(b_image_user, scene_frame); - env->filename = b_image.name() + "@" + string_printf("%d", image_frame); - env->builtin_data = b_image.ptr.data; + env->handle = scene->image_manager->add_image(new BlenderImageLoader(b_image, image_frame), + env->image_params()); } else { env->filename = image_user_file_path( b_image_user, b_image, b_scene.frame_current(), false); - env->builtin_data = NULL; } - - PointerRNA colorspace_ptr = b_image.colorspace_settings().ptr; - env->colorspace = get_enum_identifier(colorspace_ptr, "name"); - - env->animated = b_env_node.image_user().use_auto_refresh(); - env->alpha_type = get_image_alpha_type(b_image); } node = env; } @@ -865,12 +864,12 @@ static ShaderNode *add_node(Scene *scene, else if (b_node.is_a(&RNA_ShaderNodeTexPointDensity)) { BL::ShaderNodeTexPointDensity b_point_density_node(b_node); PointDensityTextureNode *point_density = new PointDensityTextureNode(); - point_density->filename = b_point_density_node.name(); point_density->space = (NodeTexVoxelSpace)b_point_density_node.space(); point_density->interpolation = get_image_interpolation(b_point_density_node); - point_density->builtin_data = b_point_density_node.ptr.data; + point_density->handle = scene->image_manager->add_image( + new BlenderPointDensityLoader(b_depsgraph, b_point_density_node), + point_density->image_params()); - point_density->add_image(scene->image_manager); b_point_density_node.cache_point_density(b_depsgraph); node = point_density; |