diff options
Diffstat (limited to 'intern/cycles/blender')
-rw-r--r-- | intern/cycles/blender/addon/engine.py | 8 | ||||
-rw-r--r-- | intern/cycles/blender/addon/presets.py | 3 | ||||
-rw-r--r-- | intern/cycles/blender/addon/properties.py | 13 | ||||
-rw-r--r-- | intern/cycles/blender/addon/ui.py | 59 | ||||
-rw-r--r-- | intern/cycles/blender/addon/version_update.py | 12 | ||||
-rw-r--r-- | intern/cycles/blender/blender_camera.cpp | 27 | ||||
-rw-r--r-- | intern/cycles/blender/blender_image.cpp | 4 | ||||
-rw-r--r-- | intern/cycles/blender/blender_image.h | 4 | ||||
-rw-r--r-- | intern/cycles/blender/blender_light.cpp | 10 | ||||
-rw-r--r-- | intern/cycles/blender/blender_object.cpp | 100 | ||||
-rw-r--r-- | intern/cycles/blender/blender_python.cpp | 12 | ||||
-rw-r--r-- | intern/cycles/blender/blender_session.cpp | 54 | ||||
-rw-r--r-- | intern/cycles/blender/blender_shader.cpp | 16 | ||||
-rw-r--r-- | intern/cycles/blender/blender_sync.cpp | 73 | ||||
-rw-r--r-- | intern/cycles/blender/blender_sync.h | 15 | ||||
-rw-r--r-- | intern/cycles/blender/blender_viewport.cpp | 55 | ||||
-rw-r--r-- | intern/cycles/blender/blender_viewport.h | 28 | ||||
-rw-r--r-- | intern/cycles/blender/blender_volume.cpp | 6 |
18 files changed, 305 insertions, 194 deletions
diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py index dfa696714fb..dc53c4db48f 100644 --- a/intern/cycles/blender/addon/engine.py +++ b/intern/cycles/blender/addon/engine.py @@ -19,16 +19,16 @@ from __future__ import annotations def _is_using_buggy_driver(): - import bgl + import gpu # We need to be conservative here because in multi-GPU systems display card # might be quite old, but others one might be just good. # # So We shouldn't disable possible good dedicated cards just because display # card seems weak. And instead we only blacklist configurations which are # proven to cause problems. - if bgl.glGetString(bgl.GL_VENDOR) == "ATI Technologies Inc.": + if gpu.platform.vendor_get() == "ATI Technologies Inc.": import re - version = bgl.glGetString(bgl.GL_VERSION) + version = gpu.platform.version_get() if version.endswith("Compatibility Profile Context"): # Old HD 4xxx and 5xxx series drivers did not have driver version # in the version string, but those cards do not quite work and @@ -132,7 +132,7 @@ def init(): _workaround_buggy_drivers() path = os.path.dirname(__file__) - user_path = os.path.dirname(os.path.abspath(bpy.utils.user_resource('CONFIG', ''))) + user_path = os.path.dirname(os.path.abspath(bpy.utils.user_resource('CONFIG', path=''))) _cycles.init(path, user_path, bpy.app.background) _parse_command_line() diff --git a/intern/cycles/blender/addon/presets.py b/intern/cycles/blender/addon/presets.py index 04b18b38927..bf33e5dc010 100644 --- a/intern/cycles/blender/addon/presets.py +++ b/intern/cycles/blender/addon/presets.py @@ -41,6 +41,9 @@ class AddPresetIntegrator(AddPresetBase, Operator): "cycles.caustics_reflective", "cycles.caustics_refractive", "cycles.blur_glossy" + "cycles.use_fast_gi" + "cycles.ao_bounces" + "cycles.ao_bounces_render" ] preset_subdir = "cycles/integrator" diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index dc4437bdc52..cda1355eb2d 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -801,17 +801,22 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): items=enum_texture_limit ) + use_fast_gi: BoolProperty( + name="Fast GI Approximation", + description="Approximate diffuse indirect light with background tinted ambient occlusion. This provides fast alternative to full global illumination, for interactive viewport rendering or final renders with reduced quality", + default=False, + ) ao_bounces: IntProperty( name="AO Bounces", - default=0, - description="Approximate indirect light with background tinted ambient occlusion at the specified bounce, 0 disables this feature", + default=1, + description="After this number of light bounces, use approximate global illumination. 0 disables this feature", min=0, max=1024, ) ao_bounces_render: IntProperty( name="AO Bounces Render", - default=0, - description="Approximate indirect light with background tinted ambient occlusion at the specified bounce, 0 disables this feature", + default=1, + description="After this number of light bounces, use approximate global illumination. 0 disables this feature", min=0, max=1024, ) diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index c9b4dc25cf2..ce93bd96bd5 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -526,6 +526,37 @@ class CYCLES_RENDER_PT_light_paths_caustics(CyclesButtonsPanel, Panel): col.prop(cscene, "caustics_refractive", text="Refractive") +class CYCLES_RENDER_PT_light_paths_fast_gi(CyclesButtonsPanel, Panel): + bl_label = "Fast GI Approximation" + bl_options = {'DEFAULT_CLOSED'} + bl_parent_id = "CYCLES_RENDER_PT_light_paths" + + def draw_header(self, context): + scene = context.scene + cscene = scene.cycles + + self.layout.prop(cscene, "use_fast_gi", text="") + + def draw(self, context): + scene = context.scene + cscene = scene.cycles + world = scene.world + + layout = self.layout + layout.use_property_split = True + layout.use_property_decorate = False + + col = layout.column(align=True) + col.prop(cscene, "ao_bounces", text="Viewport Bounces") + col.prop(cscene, "ao_bounces_render", text="Render Bounces") + + if world: + light = world.light_settings + col = layout.column(align=True) + col.prop(light, "ao_factor", text="AO Factor") + col.prop(light, "distance", text="AO Distance") + + class CYCLES_RENDER_PT_motion_blur(CyclesButtonsPanel, Panel): bl_label = "Motion Blur" bl_options = {'DEFAULT_CLOSED'} @@ -694,7 +725,7 @@ class CYCLES_RENDER_PT_performance_tiles(CyclesButtonsPanel, Panel): col.prop(cscene, "tile_order", text="Order") sub = col.column() - sub.active = not rd.use_save_buffers + sub.active = not rd.use_save_buffers and not cscene.use_adaptive_sampling sub.prop(cscene, "use_progressive_refine") @@ -746,7 +777,7 @@ class CYCLES_RENDER_PT_performance_final_render(CyclesButtonsPanel, Panel): col = layout.column() col.prop(rd, "use_save_buffers") - col.prop(rd, "use_persistent_data", text="Persistent Images") + col.prop(rd, "use_persistent_data", text="Persistent Data") class CYCLES_RENDER_PT_performance_viewport(CyclesButtonsPanel, Panel): @@ -1409,15 +1440,15 @@ class CYCLES_LIGHT_PT_nodes(CyclesButtonsPanel, Panel): panel_node_draw(layout, light, 'OUTPUT_LIGHT', 'Surface') -class CYCLES_LIGHT_PT_spot(CyclesButtonsPanel, Panel): - bl_label = "Spot Shape" +class CYCLES_LIGHT_PT_beam_shape(CyclesButtonsPanel, Panel): + bl_label = "Beam Shape" bl_parent_id = "CYCLES_LIGHT_PT_light" bl_context = "data" @classmethod def poll(cls, context): - light = context.light - return (light and light.type == 'SPOT') and CyclesButtonsPanel.poll(context) + if context.light.type in {'SPOT', 'AREA'}: + return context.light and CyclesButtonsPanel.poll(context) def draw(self, context): layout = self.layout @@ -1425,9 +1456,12 @@ class CYCLES_LIGHT_PT_spot(CyclesButtonsPanel, Panel): layout.use_property_split = True col = layout.column() - col.prop(light, "spot_size", text="Size") - col.prop(light, "spot_blend", text="Blend", slider=True) - col.prop(light, "show_cone") + if light.type == 'SPOT': + col.prop(light, "spot_size", text="Spot Size") + col.prop(light, "spot_blend", text="Blend", slider=True) + col.prop(light, "show_cone") + elif light.type == 'AREA': + col.prop(light, "spread", text="Spread") class CYCLES_WORLD_PT_preview(CyclesButtonsPanel, Panel): @@ -2038,7 +2072,6 @@ class CYCLES_RENDER_PT_simplify_viewport(CyclesButtonsPanel, Panel): col.prop(rd, "simplify_subdivision", text="Max Subdivision") col.prop(rd, "simplify_child_particles", text="Child Particles") col.prop(cscene, "texture_limit", text="Texture Limit") - col.prop(cscene, "ao_bounces", text="AO Bounces") col.prop(rd, "simplify_volumes", text="Volume Resolution") @@ -2064,7 +2097,6 @@ class CYCLES_RENDER_PT_simplify_render(CyclesButtonsPanel, Panel): col.prop(rd, "simplify_subdivision_render", text="Max Subdivision") col.prop(rd, "simplify_child_particles_render", text="Child Particles") col.prop(cscene, "texture_limit_render", text="Texture Limit") - col.prop(cscene, "ao_bounces_render", text="AO Bounces") class CYCLES_RENDER_PT_simplify_culling(CyclesButtonsPanel, Panel): @@ -2242,6 +2274,7 @@ classes = ( CYCLES_RENDER_PT_light_paths_max_bounces, CYCLES_RENDER_PT_light_paths_clamping, CYCLES_RENDER_PT_light_paths_caustics, + CYCLES_RENDER_PT_light_paths_fast_gi, CYCLES_RENDER_PT_volumes, CYCLES_RENDER_PT_subdivision, CYCLES_RENDER_PT_hair, @@ -2284,7 +2317,7 @@ classes = ( CYCLES_LIGHT_PT_preview, CYCLES_LIGHT_PT_light, CYCLES_LIGHT_PT_nodes, - CYCLES_LIGHT_PT_spot, + CYCLES_LIGHT_PT_beam_shape, CYCLES_WORLD_PT_preview, CYCLES_WORLD_PT_surface, CYCLES_WORLD_PT_volume, @@ -2314,7 +2347,7 @@ classes = ( node_panel(CYCLES_WORLD_PT_settings_surface), node_panel(CYCLES_WORLD_PT_settings_volume), node_panel(CYCLES_LIGHT_PT_light), - node_panel(CYCLES_LIGHT_PT_spot), + node_panel(CYCLES_LIGHT_PT_beam_shape) ) diff --git a/intern/cycles/blender/addon/version_update.py b/intern/cycles/blender/addon/version_update.py index aeecc265399..827f84b9873 100644 --- a/intern/cycles/blender/addon/version_update.py +++ b/intern/cycles/blender/addon/version_update.py @@ -217,6 +217,18 @@ def do_versions(self): baov.name = caov.get("name", "AOV") baov.type = "COLOR" if caov.get("type", 1) == 1 else "VALUE" + if version <= (2, 93, 16): + cscene = scene.cycles + ao_bounces = cscene.get("ao_bounces", 0) + ao_bounces_render = cscene.get("ao_bounces_render", 0) + if scene.render.use_simplify and (ao_bounces or ao_bounces_render): + cscene.use_fast_gi = True + cscene.ao_bounces = ao_bounces + cscene.ao_bounces_render = ao_bounces_render + else: + cscene.ao_bounces = 1 + cscene.ao_bounces_render = 1 + # Lamps for light in bpy.data.lights: if light.library not in libraries: diff --git a/intern/cycles/blender/blender_camera.cpp b/intern/cycles/blender/blender_camera.cpp index b31841801d8..6954c5c2f26 100644 --- a/intern/cycles/blender/blender_camera.cpp +++ b/intern/cycles/blender/blender_camera.cpp @@ -83,6 +83,8 @@ struct BlenderCamera { BoundBox2D pano_viewplane; BoundBox2D viewport_camera_border; + float passepartout_alpha; + Transform matrix; float offscreen_dicing_scale; @@ -125,6 +127,7 @@ static void blender_camera_init(BlenderCamera *bcam, BL::RenderSettings &b_rende bcam->pano_viewplane.top = 1.0f; bcam->viewport_camera_border.right = 1.0f; bcam->viewport_camera_border.top = 1.0f; + bcam->passepartout_alpha = 0.5f; bcam->offscreen_dicing_scale = 1.0f; bcam->matrix = transform_identity(); @@ -212,6 +215,8 @@ static void blender_camera_from_object(BlenderCamera *bcam, bcam->lens = b_camera.lens(); + bcam->passepartout_alpha = b_camera.show_passepartout() ? b_camera.passepartout_alpha() : 0.0f; + if (b_camera.dof().use_dof()) { /* allow f/stop number to change aperture_size but still * give manual control over aperture radius */ @@ -834,15 +839,19 @@ static void blender_camera_border(BlenderCamera *bcam, full_border, &bcam->viewport_camera_border); - if (!b_render.use_border()) { + if (b_render.use_border()) { + bcam->border.left = b_render.border_min_x(); + bcam->border.right = b_render.border_max_x(); + bcam->border.bottom = b_render.border_min_y(); + bcam->border.top = b_render.border_max_y(); + } + else if (bcam->passepartout_alpha == 1.0f) { + bcam->border = full_border; + } + else { return; } - bcam->border.left = b_render.border_min_x(); - bcam->border.right = b_render.border_max_x(); - bcam->border.bottom = b_render.border_min_y(); - bcam->border.top = b_render.border_max_y(); - /* Determine viewport subset matching camera border. */ blender_camera_border_subset(b_engine, b_render, @@ -885,8 +894,7 @@ void BlenderSync::sync_view(BL::SpaceView3D &b_v3d, } } -BufferParams BlenderSync::get_buffer_params(BL::RenderSettings &b_render, - BL::SpaceView3D &b_v3d, +BufferParams BlenderSync::get_buffer_params(BL::SpaceView3D &b_v3d, BL::RegionView3D &b_rv3d, Camera *cam, int width, @@ -902,7 +910,8 @@ BufferParams BlenderSync::get_buffer_params(BL::RenderSettings &b_render, if (b_v3d && b_rv3d && b_rv3d.view_perspective() != BL::RegionView3D::view_perspective_CAMERA) use_border = b_v3d.use_render_border(); else - use_border = b_render.use_border(); + /* the camera can always have a passepartout */ + use_border = true; if (use_border) { /* border render */ diff --git a/intern/cycles/blender/blender_image.cpp b/intern/cycles/blender/blender_image.cpp index 459dc1779fb..3a9d159e461 100644 --- a/intern/cycles/blender/blender_image.cpp +++ b/intern/cycles/blender/blender_image.cpp @@ -29,7 +29,7 @@ BlenderImageLoader::BlenderImageLoader(BL::Image b_image, int frame) { } -bool BlenderImageLoader::load_metadata(ImageMetaData &metadata) +bool BlenderImageLoader::load_metadata(const ImageDeviceFeatures &, ImageMetaData &metadata) { metadata.width = b_image.size()[0]; metadata.height = b_image.size()[1]; @@ -171,7 +171,7 @@ BlenderPointDensityLoader::BlenderPointDensityLoader(BL::Depsgraph b_depsgraph, { } -bool BlenderPointDensityLoader::load_metadata(ImageMetaData &metadata) +bool BlenderPointDensityLoader::load_metadata(const ImageDeviceFeatures &, ImageMetaData &metadata) { metadata.channels = 4; metadata.width = b_node.resolution(); diff --git a/intern/cycles/blender/blender_image.h b/intern/cycles/blender/blender_image.h index b58a159a6ba..fddbbfd9c37 100644 --- a/intern/cycles/blender/blender_image.h +++ b/intern/cycles/blender/blender_image.h @@ -27,7 +27,7 @@ class BlenderImageLoader : public ImageLoader { public: BlenderImageLoader(BL::Image b_image, int frame); - bool load_metadata(ImageMetaData &metadata) override; + bool load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata) override; bool load_pixels(const ImageMetaData &metadata, void *pixels, const size_t pixels_size, @@ -44,7 +44,7 @@ class BlenderPointDensityLoader : public ImageLoader { public: BlenderPointDensityLoader(BL::Depsgraph depsgraph, BL::ShaderNodeTexPointDensity b_node); - bool load_metadata(ImageMetaData &metadata) override; + bool load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata) override; bool load_pixels(const ImageMetaData &metadata, void *pixels, const size_t pixels_size, diff --git a/intern/cycles/blender/blender_light.cpp b/intern/cycles/blender/blender_light.cpp index ff4ecc5a3f9..ae353b32633 100644 --- a/intern/cycles/blender/blender_light.cpp +++ b/intern/cycles/blender/blender_light.cpp @@ -34,12 +34,17 @@ void BlenderSync::sync_light(BL::Object &b_parent, bool *use_portal) { /* test if we need to sync */ - Light *light; ObjectKey key(b_parent, persistent_id, b_ob_instance, false); BL::Light b_light(b_ob.data()); + Light *light = light_map.find(key); + + /* Check if the transform was modified, in case a linked collection is moved we do not get a + * specific depsgraph update (T88515). This also mimics the behavior for Objects. */ + const bool tfm_updated = (light && light->get_tfm() != tfm); + /* Update if either object or light data changed. */ - if (!light_map.add_or_update(&light, b_ob, b_parent, key)) { + if (!tfm_updated && !light_map.add_or_update(&light, b_ob, b_parent, key)) { Shader *shader; if (!shader_map.add_or_update(&shader, b_light)) { if (light->get_is_portal()) @@ -82,6 +87,7 @@ void BlenderSync::sync_light(BL::Object &b_parent, light->set_axisu(transform_get_column(&tfm, 0)); light->set_axisv(transform_get_column(&tfm, 1)); light->set_sizeu(b_area_light.size()); + light->set_spread(b_area_light.spread()); switch (b_area_light.shape()) { case BL::AreaLight::shape_SQUARE: light->set_sizev(light->get_sizeu()); diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp index 54128cf82fc..cb84013c551 100644 --- a/intern/cycles/blender/blender_object.cpp +++ b/intern/cycles/blender/blender_object.cpp @@ -96,7 +96,49 @@ bool BlenderSync::object_is_light(BL::Object &b_ob) return (b_ob_data && b_ob_data.is_a(&RNA_Light)); } -/* Object */ +void BlenderSync::sync_object_motion_init(BL::Object &b_parent, BL::Object &b_ob, Object *object) +{ + /* Initialize motion blur for object, detecting if it's enabled and creating motion + * steps array if so. */ + array<Transform> motion; + object->set_motion(motion); + + Scene::MotionType need_motion = scene->need_motion(); + if (need_motion == Scene::MOTION_NONE || !object->get_geometry()) { + return; + } + + Geometry *geom = object->get_geometry(); + geom->set_use_motion_blur(false); + geom->set_motion_steps(0); + + uint motion_steps; + + if (need_motion == Scene::MOTION_BLUR) { + motion_steps = object_motion_steps(b_parent, b_ob, Object::MAX_MOTION_STEPS); + geom->set_motion_steps(motion_steps); + if (motion_steps && object_use_deform_motion(b_parent, b_ob)) { + geom->set_use_motion_blur(true); + } + } + else { + motion_steps = 3; + geom->set_motion_steps(motion_steps); + } + + motion.resize(motion_steps, transform_empty()); + + if (motion_steps) { + motion[motion_steps / 2] = object->get_tfm(); + + /* update motion socket before trying to access object->motion_time */ + object->set_motion(motion); + + for (size_t step = 0; step < motion_steps; step++) { + motion_times.insert(object->motion_time(step)); + } + } +} Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph, BL::ViewLayer &b_view_layer, @@ -219,10 +261,8 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph, } /* test if we need to sync */ - bool object_updated = false; - - if (object_map.add_or_update(&object, b_ob, b_parent, key)) - object_updated = true; + bool object_updated = object_map.add_or_update(&object, b_ob, b_parent, key) || + (tfm != object->get_tfm()); /* mesh sync */ /* b_ob is owned by the iterator and will go out of scope at the end of the block. @@ -271,49 +311,11 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph, * transform comparison should not be needed, but duplis don't work perfect * in the depsgraph and may not signal changes, so this is a workaround */ if (object->is_modified() || object_updated || - (object->get_geometry() && object->get_geometry()->is_modified()) || - tfm != object->get_tfm()) { + (object->get_geometry() && object->get_geometry()->is_modified())) { object->name = b_ob.name().c_str(); object->set_pass_id(b_ob.pass_index()); object->set_color(get_float3(b_ob.color())); object->set_tfm(tfm); - array<Transform> motion; - object->set_motion(motion); - - /* motion blur */ - Scene::MotionType need_motion = scene->need_motion(); - if (need_motion != Scene::MOTION_NONE && object->get_geometry()) { - Geometry *geom = object->get_geometry(); - geom->set_use_motion_blur(false); - geom->set_motion_steps(0); - - uint motion_steps; - - if (need_motion == Scene::MOTION_BLUR) { - motion_steps = object_motion_steps(b_parent, b_ob, Object::MAX_MOTION_STEPS); - geom->set_motion_steps(motion_steps); - if (motion_steps && object_use_deform_motion(b_parent, b_ob)) { - geom->set_use_motion_blur(true); - } - } - else { - motion_steps = 3; - geom->set_motion_steps(motion_steps); - } - - motion.resize(motion_steps, transform_empty()); - - if (motion_steps) { - motion[motion_steps / 2] = tfm; - - /* update motion socket before trying to access object->motion_time */ - object->set_motion(motion); - - for (size_t step = 0; step < motion_steps; step++) { - motion_times.insert(object->motion_time(step)); - } - } - } /* dupli texture coordinates and random_id */ if (is_instance) { @@ -331,6 +333,8 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph, object->tag_update(scene); } + sync_object_motion_init(b_parent, b_ob, object); + if (is_instance) { /* Sync possible particle data. */ sync_dupli_particle(b_parent, b_instance, object); @@ -560,10 +564,12 @@ void BlenderSync::sync_objects(BL::Depsgraph &b_depsgraph, if (!cancel && !motion) { sync_background_light(b_v3d, use_portal); - /* handle removed data and modified pointers */ + /* Handle removed data and modified pointers, as this may free memory, delete Nodes in the + * right order to ensure that dependent data is freed after their users. Objects should be + * freed before particle systems and geometries. */ light_map.post_sync(); - geometry_map.post_sync(); object_map.post_sync(); + geometry_map.post_sync(); particle_system_map.post_sync(); } @@ -611,7 +617,7 @@ void BlenderSync::sync_motion(BL::RenderSettings &b_render, if (b_cam) { sync_camera_motion(b_render, b_cam, width, height, 0.0f); } - sync_objects(b_depsgraph, b_v3d, 0.0f); + sync_objects(b_depsgraph, b_v3d); } /* Insert motion times from camera. Motion times from other objects diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp index 0daad310543..785ca6b4e01 100644 --- a/intern/cycles/blender/blender_python.cpp +++ b/intern/cycles/blender/blender_python.cpp @@ -35,6 +35,7 @@ #include "util/util_path.h" #include "util/util_string.h" #include "util/util_task.h" +#include "util/util_tbb.h" #include "util/util_types.h" #ifdef WITH_OSL @@ -288,9 +289,11 @@ static PyObject *render_func(PyObject * /*self*/, PyObject *args) RNA_pointer_create(NULL, &RNA_Depsgraph, (ID *)PyLong_AsVoidPtr(pydepsgraph), &depsgraphptr); BL::Depsgraph b_depsgraph(depsgraphptr); + /* Allow Blender to execute other Python scripts, and isolate TBB tasks so we + * don't get deadlocks with Blender threads accessing shared data like images. */ python_thread_state_save(&session->python_thread_state); - session->render(b_depsgraph); + tbb::this_task_arena::isolate([&] { session->render(b_depsgraph); }); python_thread_state_restore(&session->python_thread_state); @@ -327,7 +330,8 @@ static PyObject *bake_func(PyObject * /*self*/, PyObject *args) python_thread_state_save(&session->python_thread_state); - session->bake(b_depsgraph, b_object, pass_type, pass_filter, width, height); + tbb::this_task_arena::isolate( + [&] { session->bake(b_depsgraph, b_object, pass_type, pass_filter, width, height); }); python_thread_state_restore(&session->python_thread_state); @@ -373,7 +377,7 @@ static PyObject *reset_func(PyObject * /*self*/, PyObject *args) python_thread_state_save(&session->python_thread_state); - session->reset_session(b_data, b_depsgraph); + tbb::this_task_arena::isolate([&] { session->reset_session(b_data, b_depsgraph); }); python_thread_state_restore(&session->python_thread_state); @@ -395,7 +399,7 @@ static PyObject *sync_func(PyObject * /*self*/, PyObject *args) python_thread_state_save(&session->python_thread_state); - session->synchronize(b_depsgraph); + tbb::this_task_arena::isolate([&] { session->synchronize(b_depsgraph); }); python_thread_state_restore(&session->python_thread_state); diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index ae13310789e..29de886e4ff 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -143,12 +143,6 @@ void BlenderSession::create_session() session->scene = scene; - /* There is no single depsgraph to use for the entire render. - * So we need to handle this differently. - * - * We could loop over the final render result render layers in pipeline and keep Cycles unaware - * of multiple layers, or perhaps move syncing further down in the pipeline. - */ /* create sync */ sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress); BL::Object b_camera_override(b_engine.camera_override()); @@ -161,7 +155,7 @@ void BlenderSession::create_session() /* set buffer parameters */ BufferParams buffer_params = BlenderSync::get_buffer_params( - b_render, b_v3d, b_rv3d, scene->camera, width, height, session_params.denoising.use); + b_v3d, b_rv3d, scene->camera, width, height, session_params.denoising.use); session->reset(buffer_params, session_params.samples); b_engine.use_highlight_tiles(session_params.progressive_refine == false); @@ -213,7 +207,7 @@ void BlenderSession::reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsg SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background); if (scene->params.modified(scene_params) || session->params.modified(session_params) || - !scene_params.persistent_data) { + !this->b_render.use_persistent_data()) { /* if scene or session parameters changed, it's easier to simply re-create * them rather than trying to distinguish which settings need to be updated */ @@ -225,7 +219,6 @@ void BlenderSession::reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsg } session->progress.reset(); - scene->reset(); session->tile_manager.set_tile_order(session_params.tile_order); @@ -234,17 +227,22 @@ void BlenderSession::reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsg */ session->stats.mem_peak = session->stats.mem_used; - /* There is no single depsgraph to use for the entire render. - * See note on create_session(). - */ - /* sync object should be re-created */ - delete sync; - sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress); + if (is_new_session) { + /* Sync object should be re-created for new scene. */ + delete sync; + sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress); + } + else { + /* Sync recalculations to do just the required updates. */ + sync->sync_recalc(b_depsgraph, b_v3d); + } + + BL::Object b_camera_override(b_engine.camera_override()); + sync->sync_camera(b_render, b_camera_override, width, height, ""); BL::SpaceView3D b_null_space_view3d(PointerRNA_NULL); BL::RegionView3D b_null_region_view3d(PointerRNA_NULL); - BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, - b_null_space_view3d, + BufferParams buffer_params = BlenderSync::get_buffer_params(b_null_space_view3d, b_null_region_view3d, scene->camera, width, @@ -487,7 +485,7 @@ void BlenderSession::render(BL::Depsgraph &b_depsgraph_) SessionParams session_params = BlenderSync::get_session_params( b_engine, b_userpref, b_scene, background, b_view_layer); BufferParams buffer_params = BlenderSync::get_buffer_params( - b_render, b_v3d, b_rv3d, scene->camera, width, height, session_params.denoising.use); + b_v3d, b_rv3d, scene->camera, width, height, session_params.denoising.use); /* temporary render result to find needed passes and views */ BL::RenderResult b_rr = begin_render_result( @@ -502,7 +500,7 @@ void BlenderSession::render(BL::Depsgraph &b_depsgraph_) /* Compute render passes and film settings. */ vector<Pass> passes = sync->sync_render_passes( - b_rlay, b_view_layer, session_params.adaptive_sampling, session_params.denoising); + b_scene, b_rlay, b_view_layer, session_params.adaptive_sampling, session_params.denoising); /* Set buffer params, using film settings from sync_render_passes. */ buffer_params.passes = passes; @@ -598,18 +596,6 @@ void BlenderSession::render(BL::Depsgraph &b_depsgraph_) /* clear callback */ session->write_render_tile_cb = function_null; session->update_render_tile_cb = function_null; - - /* TODO: find a way to clear this data for persistent data render */ -#if 0 - /* free all memory used (host and device), so we wouldn't leave render - * engine with extra memory allocated - */ - - session->device_free(); - - delete sync; - sync = NULL; -#endif } static int bake_pass_filter_get(const int pass_filter) @@ -823,7 +809,7 @@ void BlenderSession::synchronize(BL::Depsgraph &b_depsgraph_) /* get buffer parameters */ BufferParams buffer_params = BlenderSync::get_buffer_params( - b_render, b_v3d, b_rv3d, scene->camera, width, height, session_params.denoising.use); + b_v3d, b_rv3d, scene->camera, width, height, session_params.denoising.use); if (!buffer_params.denoising_data_pass) { session_params.denoising.use = false; @@ -902,7 +888,7 @@ bool BlenderSession::draw(int w, int h) SessionParams session_params = BlenderSync::get_session_params( b_engine, b_userpref, b_scene, background); BufferParams buffer_params = BlenderSync::get_buffer_params( - b_render, b_v3d, b_rv3d, scene->camera, width, height, session_params.denoising.use); + b_v3d, b_rv3d, scene->camera, width, height, session_params.denoising.use); bool session_pause = BlenderSync::get_session_pause(b_scene, background); if (session_pause == false) { @@ -920,7 +906,7 @@ bool BlenderSession::draw(int w, int h) /* draw */ BufferParams buffer_params = BlenderSync::get_buffer_params( - b_render, b_v3d, b_rv3d, scene->camera, width, height, session->params.denoising.use); + b_v3d, b_rv3d, scene->camera, width, height, session->params.denoising.use); DeviceDrawParams draw_params; if (session->params.display_buffer_linear) { diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp index 72328333732..7f129310736 100644 --- a/intern/cycles/blender/blender_shader.cpp +++ b/intern/cycles/blender/blender_shader.cpp @@ -1373,7 +1373,7 @@ void BlenderSync::sync_world(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d, BlenderViewportParameters new_viewport_parameters(b_v3d); if (world_recalc || update_all || b_world.ptr.data != world_map || - viewport_parameters.modified(new_viewport_parameters)) { + viewport_parameters.shader_modified(new_viewport_parameters)) { Shader *shader = scene->default_background; ShaderGraph *graph = new ShaderGraph(); @@ -1501,8 +1501,8 @@ void BlenderSync::sync_world(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d, background->set_transparent_roughness_threshold(0.0f); } - background->set_use_shader(view_layer.use_background_shader | - viewport_parameters.custom_viewport_parameters()); + background->set_use_shader(view_layer.use_background_shader || + viewport_parameters.use_custom_shader()); background->set_use_ao(background->get_use_ao() && view_layer.use_background_ao); background->tag_update(scene); @@ -1553,13 +1553,9 @@ void BlenderSync::sync_lights(BL::Depsgraph &b_depsgraph, bool update_all) void BlenderSync::sync_shaders(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d) { /* for auto refresh images */ - bool auto_refresh_update = false; - - if (preview) { - ImageManager *image_manager = scene->image_manager; - int frame = b_scene.frame_current(); - auto_refresh_update = image_manager->set_animation_frame_update(frame); - } + ImageManager *image_manager = scene->image_manager; + const int frame = b_scene.frame_current(); + const bool auto_refresh_update = image_manager->set_animation_frame_update(frame); shader_map.pre_sync(); diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp index 0e61f4f2615..82b3abd4432 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -69,7 +69,8 @@ BlenderSync::BlenderSync(BL::RenderEngine &b_engine, experimental(false), dicing_rate(1.0f), max_subdivisions(12), - progress(progress) + progress(progress), + has_updates_(true) { PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles"); dicing_rate = preview ? RNA_float_get(&cscene, "preview_dicing_rate") : @@ -84,7 +85,9 @@ BlenderSync::~BlenderSync() void BlenderSync::reset(BL::BlendData &b_data, BL::Scene &b_scene) { /* Update data and scene pointers in case they change in session reset, - * for example after undo. */ + * for example after undo. + * Note that we do not modify the `has_updates_` flag here because the sync + * reset is also used during viewport navigation. */ this->b_data = b_data; this->b_scene = b_scene; } @@ -117,6 +120,8 @@ void BlenderSync::sync_recalc(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d } if (dicing_prop_changed) { + has_updates_ = true; + for (const pair<const GeometryKey, Geometry *> &iter : geometry_map.key_to_scene_data()) { Geometry *geom = iter.second; if (geom->is_mesh()) { @@ -133,6 +138,12 @@ void BlenderSync::sync_recalc(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d /* Iterate over all IDs in this depsgraph. */ for (BL::DepsgraphUpdate &b_update : b_depsgraph.updates) { + /* TODO(sergey): Can do more selective filter here. For example, ignore changes made to + * screen datablock. Note that sync_data() needs to be called after object deletion, and + * currently this is ensured by the scene ID tagged for update, which sets the `has_updates_` + * flag. */ + has_updates_ = true; + BL::ID b_id(b_update.id()); /* Material */ @@ -211,9 +222,15 @@ void BlenderSync::sync_recalc(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d } } - BlenderViewportParameters new_viewport_parameters(b_v3d); - if (viewport_parameters.modified(new_viewport_parameters)) { - world_recalc = true; + if (b_v3d) { + BlenderViewportParameters new_viewport_parameters(b_v3d); + + if (viewport_parameters.shader_modified(new_viewport_parameters)) { + world_recalc = true; + has_updates_ = true; + } + + has_updates_ |= viewport_parameters.modified(new_viewport_parameters); } } @@ -225,11 +242,15 @@ void BlenderSync::sync_data(BL::RenderSettings &b_render, int height, void **python_thread_state) { + if (!has_updates_) { + return; + } + scoped_timer timer; BL::ViewLayer b_view_layer = b_depsgraph.view_layer_eval(); - sync_view_layer(b_v3d, b_view_layer); + sync_view_layer(b_view_layer); sync_integrator(); sync_film(b_v3d); sync_shaders(b_depsgraph, b_v3d); @@ -252,6 +273,8 @@ void BlenderSync::sync_data(BL::RenderSettings &b_render, free_data_after_sync(b_depsgraph); VLOG(1) << "Total time spent synchronizing data: " << timer.get_time(); + + has_updates_ = false; } /* Integrator */ @@ -358,7 +381,7 @@ void BlenderSync::sync_integrator() integrator->set_adaptive_min_samples(adaptive_min_samples); - if (b_scene.render().use_simplify()) { + if (get_boolean(cscene, "use_fast_gi")) { if (preview) { integrator->set_ao_bounces(get_int(cscene, "ao_bounces")); } @@ -422,7 +445,7 @@ void BlenderSync::sync_film(BL::SpaceView3D &b_v3d) /* Render Layer */ -void BlenderSync::sync_view_layer(BL::SpaceView3D & /*b_v3d*/, BL::ViewLayer &b_view_layer) +void BlenderSync::sync_view_layer(BL::ViewLayer &b_view_layer) { view_layer.name = b_view_layer.name(); @@ -567,7 +590,8 @@ int BlenderSync::get_denoising_pass(BL::RenderPass &b_pass) return -1; } -vector<Pass> BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, +vector<Pass> BlenderSync::sync_render_passes(BL::Scene &b_scene, + BL::RenderLayer &b_rlay, BL::ViewLayer &b_view_layer, bool adaptive_sampling, const DenoiseParams &denoising) @@ -578,7 +602,7 @@ vector<Pass> BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, for (BL::RenderPass &b_pass : b_rlay.passes) { PassType pass_type = get_pass_type(b_pass); - if (pass_type == PASS_MOTION && scene->integrator->get_motion_blur()) + if (pass_type == PASS_MOTION && b_scene.render().use_motion_blur()) continue; if (pass_type != PASS_NONE) Pass::add(pass_type, passes, b_pass.name().c_str()); @@ -736,12 +760,18 @@ void BlenderSync::free_data_after_sync(BL::Depsgraph &b_depsgraph) * caches to be releases from blender side in order to reduce peak memory * footprint during synchronization process. */ + const bool is_interface_locked = b_engine.render() && b_engine.render().use_lock_interface(); - const bool can_free_caches = (BlenderSession::headless || is_interface_locked) && - /* Baking re-uses the depsgraph multiple times, clearing crashes - * reading un-evaluated mesh data which isn't aligned with the - * geometry we're baking, see T71012. */ - !scene->bake_manager->get_baking(); + const bool is_persistent_data = b_engine.render() && b_engine.render().use_persistent_data(); + const bool can_free_caches = + (BlenderSession::headless || is_interface_locked) && + /* Baking re-uses the depsgraph multiple times, clearing crashes + * reading un-evaluated mesh data which isn't aligned with the + * geometry we're baking, see T71012. */ + !scene->bake_manager->get_baking() && + /* Persistent data must main caches for performance and correctness. */ + !is_persistent_data; + if (!can_free_caches) { return; } @@ -757,7 +787,6 @@ void BlenderSync::free_data_after_sync(BL::Depsgraph &b_depsgraph) SceneParams BlenderSync::get_scene_params(BL::Scene &b_scene, bool background) { - BL::RenderSettings r = b_scene.render(); SceneParams params; PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles"); const bool shadingsystem = RNA_boolean_get(&cscene, "shading_system"); @@ -781,11 +810,6 @@ SceneParams BlenderSync::get_scene_params(BL::Scene &b_scene, bool background) params.hair_shape = (CurveShapeType)get_enum( csscene, "shape", CURVE_NUM_SHAPE_TYPES, CURVE_THICK); - if (background && params.shadingsystem != SHADINGSYSTEM_OSL) - params.persistent_data = r.use_persistent_data(); - else - params.persistent_data = false; - int texture_limit; if (background) { texture_limit = RNA_enum_get(&cscene, "texture_limit_render"); @@ -872,6 +896,9 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine &b_engine, /* Clamp samples. */ params.samples = min(params.samples, Integrator::MAX_SAMPLES); + /* Adaptive sampling. */ + params.adaptive_sampling = RNA_boolean_get(&cscene, "use_adaptive_sampling"); + /* tiles */ const bool is_cpu = (params.device.type == DEVICE_CPU); if (!is_cpu && !background) { @@ -924,7 +951,7 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine &b_engine, BL::RenderSettings b_r = b_scene.render(); params.progressive_refine = b_engine.is_preview() || get_boolean(cscene, "use_progressive_refine"); - if (b_r.use_save_buffers()) + if (b_r.use_save_buffers() || params.adaptive_sampling) params.progressive_refine = false; if (background) { @@ -960,8 +987,6 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine &b_engine, params.use_profiling = params.device.has_profiling && !b_engine.is_preview() && background && BlenderSession::print_render_stats; - params.adaptive_sampling = RNA_boolean_get(&cscene, "use_adaptive_sampling"); - return params; } diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h index 1c43522a57e..1c98e529190 100644 --- a/intern/cycles/blender/blender_sync.h +++ b/intern/cycles/blender/blender_sync.h @@ -73,8 +73,9 @@ class BlenderSync { int width, int height, void **python_thread_state); - void sync_view_layer(BL::SpaceView3D &b_v3d, BL::ViewLayer &b_view_layer); - vector<Pass> sync_render_passes(BL::RenderLayer &b_render_layer, + void sync_view_layer(BL::ViewLayer &b_view_layer); + vector<Pass> sync_render_passes(BL::Scene &b_scene, + BL::RenderLayer &b_render_layer, BL::ViewLayer &b_view_layer, bool adaptive_sampling, const DenoiseParams &denoising); @@ -103,8 +104,7 @@ class BlenderSync { bool background, BL::ViewLayer b_view_layer = BL::ViewLayer(PointerRNA_NULL)); static bool get_session_pause(BL::Scene &b_scene, bool background); - static BufferParams get_buffer_params(BL::RenderSettings &b_render, - BL::SpaceView3D &b_v3d, + static BufferParams get_buffer_params(BL::SpaceView3D &b_v3d, BL::RegionView3D &b_rv3d, Camera *cam, int width, @@ -149,6 +149,7 @@ class BlenderSync { BlenderObjectCulling &culling, bool *use_portal, TaskPool *geom_task_pool); + void sync_object_motion_init(BL::Object &b_parent, BL::Object &b_ob, Object *object); bool sync_object_attributes(BL::DepsgraphObjectInstance &b_instance, Object *object); @@ -262,6 +263,12 @@ class BlenderSync { } view_layer; Progress &progress; + + protected: + /* Indicates that `sync_recalc()` detected changes in the scene. + * If this flag is false then the data is considered to be up-to-date and will not be + * synchronized at all. */ + bool has_updates_ = true; }; CCL_NAMESPACE_END diff --git a/intern/cycles/blender/blender_viewport.cpp b/intern/cycles/blender/blender_viewport.cpp index 73ef5f94720..07408fee218 100644 --- a/intern/cycles/blender/blender_viewport.cpp +++ b/intern/cycles/blender/blender_viewport.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + #include "blender_viewport.h" #include "blender_util.h" @@ -25,29 +26,39 @@ BlenderViewportParameters::BlenderViewportParameters() studiolight_rotate_z(0.0f), studiolight_intensity(1.0f), studiolight_background_alpha(1.0f), - studiolight_path(ustring()) + display_pass(PASS_COMBINED) { } BlenderViewportParameters::BlenderViewportParameters(BL::SpaceView3D &b_v3d) : BlenderViewportParameters() { - /* We only copy the parameters if we are in look dev mode. otherwise + if (!b_v3d) { + return; + } + + BL::View3DShading shading = b_v3d.shading(); + PointerRNA cshading = RNA_pointer_get(&shading.ptr, "cycles"); + + /* We only copy the shading parameters if we are in look dev mode. otherwise * defaults are being used. These defaults mimic normal render settings */ - if (b_v3d && b_v3d.shading().type() == BL::View3DShading::type_RENDERED) { - use_scene_world = b_v3d.shading().use_scene_world_render(); - use_scene_lights = b_v3d.shading().use_scene_lights_render(); + if (shading.type() == BL::View3DShading::type_RENDERED) { + use_scene_world = shading.use_scene_world_render(); + use_scene_lights = shading.use_scene_lights_render(); + if (!use_scene_world) { - studiolight_rotate_z = b_v3d.shading().studiolight_rotate_z(); - studiolight_intensity = b_v3d.shading().studiolight_intensity(); - studiolight_background_alpha = b_v3d.shading().studiolight_background_alpha(); - studiolight_path = b_v3d.shading().selected_studio_light().path(); + studiolight_rotate_z = shading.studiolight_rotate_z(); + studiolight_intensity = shading.studiolight_intensity(); + studiolight_background_alpha = shading.studiolight_background_alpha(); + studiolight_path = shading.selected_studio_light().path(); } } + + /* Film. */ + display_pass = (PassType)get_enum(cshading, "render_pass", -1, -1); } -/* Check if two instances are different. */ -const bool BlenderViewportParameters::modified(const BlenderViewportParameters &other) const +bool BlenderViewportParameters::shader_modified(const BlenderViewportParameters &other) const { return use_scene_world != other.use_scene_world || use_scene_lights != other.use_scene_lights || studiolight_rotate_z != other.studiolight_rotate_z || @@ -56,26 +67,26 @@ const bool BlenderViewportParameters::modified(const BlenderViewportParameters & studiolight_path != other.studiolight_path; } -const bool BlenderViewportParameters::custom_viewport_parameters() const +bool BlenderViewportParameters::film_modified(const BlenderViewportParameters &other) const { - return !(use_scene_world && use_scene_lights); + return display_pass != other.display_pass; } -PassType BlenderViewportParameters::get_viewport_display_render_pass(BL::SpaceView3D &b_v3d) +bool BlenderViewportParameters::modified(const BlenderViewportParameters &other) const { - PassType display_pass = PASS_NONE; - if (b_v3d) { - BL::View3DShading b_view3dshading = b_v3d.shading(); - PointerRNA cshading = RNA_pointer_get(&b_view3dshading.ptr, "cycles"); - display_pass = (PassType)get_enum(cshading, "render_pass", -1, -1); - } - return display_pass; + return shader_modified(other) || film_modified(other); +} + +bool BlenderViewportParameters::use_custom_shader() const +{ + return !(use_scene_world && use_scene_lights); } PassType update_viewport_display_passes(BL::SpaceView3D &b_v3d, vector<Pass> &passes) { if (b_v3d) { - PassType display_pass = BlenderViewportParameters::get_viewport_display_render_pass(b_v3d); + const BlenderViewportParameters viewport_parameters(b_v3d); + const PassType display_pass = viewport_parameters.display_pass; passes.clear(); Pass::add(display_pass, passes); diff --git a/intern/cycles/blender/blender_viewport.h b/intern/cycles/blender/blender_viewport.h index 7c6c9c4d274..d6518597053 100644 --- a/intern/cycles/blender/blender_viewport.h +++ b/intern/cycles/blender/blender_viewport.h @@ -18,17 +18,18 @@ #define __BLENDER_VIEWPORT_H__ #include "MEM_guardedalloc.h" + #include "RNA_access.h" #include "RNA_blender_cpp.h" #include "RNA_types.h" #include "render/film.h" -#include "util/util_param.h" CCL_NAMESPACE_BEGIN class BlenderViewportParameters { - private: + public: + /* Shader. */ bool use_scene_world; bool use_scene_lights; float studiolight_rotate_z; @@ -36,17 +37,24 @@ class BlenderViewportParameters { float studiolight_background_alpha; ustring studiolight_path; + /* Film. */ + PassType display_pass; + BlenderViewportParameters(); - BlenderViewportParameters(BL::SpaceView3D &b_v3d); + explicit BlenderViewportParameters(BL::SpaceView3D &b_v3d); - const bool modified(const BlenderViewportParameters &other) const; - const bool custom_viewport_parameters() const; - friend class BlenderSync; + /* Check whether any of shading related settings are different from the given parameters. */ + bool shader_modified(const BlenderViewportParameters &other) const; - public: - /* Retrieve the render pass that needs to be displayed on the given `SpaceView3D` - * When the `b_v3d` parameter is not given `PASS_NONE` will be returned. */ - static PassType get_viewport_display_render_pass(BL::SpaceView3D &b_v3d); + /* Check whether any of film related settings are different from the given parameters. */ + bool film_modified(const BlenderViewportParameters &other) const; + + /* Check whether any of settings are different from the given parameters. */ + bool modified(const BlenderViewportParameters &other) const; + + /* Returns truth when a custom shader defined by the viewport is to be used instead of the + * regular background shader or scene light. */ + bool use_custom_shader() const; }; PassType update_viewport_display_passes(BL::SpaceView3D &b_v3d, vector<Pass> &passes); diff --git a/intern/cycles/blender/blender_volume.cpp b/intern/cycles/blender/blender_volume.cpp index 410f7a72cf5..772ab9f5c8a 100644 --- a/intern/cycles/blender/blender_volume.cpp +++ b/intern/cycles/blender/blender_volume.cpp @@ -26,7 +26,7 @@ #ifdef WITH_OPENVDB # include <openvdb/openvdb.h> openvdb::GridBase::ConstPtr BKE_volume_grid_openvdb_for_read(const struct Volume *volume, - struct VolumeGrid *grid); + const struct VolumeGrid *grid); #endif CCL_NAMESPACE_BEGIN @@ -41,7 +41,7 @@ class BlenderSmokeLoader : public ImageLoader { mesh_texture_space(b_mesh, texspace_loc, texspace_size); } - bool load_metadata(ImageMetaData &metadata) override + bool load_metadata(const ImageDeviceFeatures &, ImageMetaData &metadata) override { if (!b_domain) { return false; @@ -227,7 +227,7 @@ class BlenderVolumeLoader : public VDBImageLoader { const bool unload = !b_volume_grid.is_loaded(); ::Volume *volume = (::Volume *)b_volume.ptr.data; - VolumeGrid *volume_grid = (VolumeGrid *)b_volume_grid.ptr.data; + const VolumeGrid *volume_grid = (VolumeGrid *)b_volume_grid.ptr.data; grid = BKE_volume_grid_openvdb_for_read(volume, volume_grid); if (unload) { |