[Bf-blender-cvs] [578ecba599c] cycles_procedural_api: add an option to only rebuild the BVH every N frame
Kévin Dietrich
noreply at git.blender.org
Fri Oct 9 17:56:03 CEST 2020
Commit: 578ecba599c48edd9f30f6e105309cbc7e1a0d06
Author: Kévin Dietrich
Date: Wed Oct 7 08:42:47 2020 +0200
Branches: cycles_procedural_api
https://developer.blender.org/rB578ecba599c48edd9f30f6e105309cbc7e1a0d06
add an option to only rebuild the BVH every N frame
===================================================================
M intern/cycles/blender/addon/properties.py
M intern/cycles/blender/addon/ui.py
M intern/cycles/blender/blender_session.cpp
M intern/cycles/blender/blender_sync.cpp
M intern/cycles/render/geometry.cpp
M intern/cycles/render/scene.h
===================================================================
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index d29f709263e..3cc5c10c9d5 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -675,6 +675,12 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
items=enum_bvh_types,
default='DYNAMIC_BVH',
)
+ bvh_rebuild_rate: IntProperty(
+ name="BVH Rebuild Rate",
+ description="Only rebuild the BVH every N frame, for faster updates on frame change in the viewport",
+ default=1,
+ min=1,
+ )
debug_use_spatial_splits: BoolProperty(
name="Use Spatial Splits",
description="Use BVH spatial splits: longer builder time, faster render",
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index 72d98e78c4d..d4289393a1f 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -722,6 +722,8 @@ class CYCLES_RENDER_PT_performance_acceleration_structure(CyclesButtonsPanel, Pa
sub = col.column()
sub.active = not cscene.debug_use_spatial_splits and not use_embree
sub.prop(cscene, "debug_bvh_time_steps")
+ sub = col.column()
+ sub.prop(cscene, "bvh_rebuild_rate")
class CYCLES_RENDER_PT_performance_final_render(CyclesButtonsPanel, Panel):
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 4b7d2265092..101190f643d 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -212,7 +212,7 @@ void BlenderSession::reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsg
b_engine, b_userpref, b_scene, background);
SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background);
- if (scene->params.modified(scene_params) || session->params.modified(session_params) ||
+ if (scene->params.update_params(scene_params) || session->params.modified(session_params) ||
!scene_params.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
@@ -783,7 +783,7 @@ void BlenderSession::synchronize(BL::Depsgraph &b_depsgraph_)
SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background);
bool session_pause = BlenderSync::get_session_pause(b_scene, background);
- if (session->params.modified(session_params) || scene->params.modified(scene_params)) {
+ if (session->params.modified(session_params) || scene->params.update_params(scene_params)) {
free_session();
create_session();
}
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 12acff70662..4fe968a6175 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -774,6 +774,14 @@ SceneParams BlenderSync::get_scene_params(BL::Scene &b_scene, bool background)
params.use_bvh_unaligned_nodes = RNA_boolean_get(&cscene, "debug_use_hair_bvh");
params.num_bvh_time_steps = RNA_int_get(&cscene, "debug_bvh_time_steps");
+ int bvh_rebuild_rate = RNA_int_get(&cscene, "bvh_rebuild_rate");
+ if (bvh_rebuild_rate < 1) {
+ bvh_rebuild_rate = 1;
+ }
+
+ int frame_delta = b_scene.frame_current() - b_scene.frame_start();
+ params.use_bvh_refit = (frame_delta % bvh_rebuild_rate) != 0;
+
PointerRNA csscene = RNA_pointer_get(&b_scene.ptr, "cycles_curves");
params.hair_subdivisions = get_int(csscene, "subdivisions");
params.hair_shape = (CurveShapeType)get_enum(
diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp
index b08982dd4c1..12f2e16ca54 100644
--- a/intern/cycles/render/geometry.cpp
+++ b/intern/cycles/render/geometry.cpp
@@ -198,7 +198,7 @@ void Geometry::compute_bvh(
vector<Object *> objects;
objects.push_back(&object);
- if (bvh && !need_update_rebuild) {
+ if (bvh && (!need_update_rebuild || params->use_bvh_refit)) {
progress->set_status(msg, "Refitting BVH");
bvh->geometry = geometry;
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index 33f6378b7cf..d2efe5f7445 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -179,6 +179,7 @@ class SceneParams {
CurveShapeType hair_shape;
bool persistent_data;
int texture_limit;
+ bool use_bvh_refit;
bool background;
@@ -195,6 +196,7 @@ class SceneParams {
persistent_data = false;
texture_limit = 0;
background = true;
+ use_bvh_refit = false;
}
bool modified(const SceneParams ¶ms)
@@ -208,6 +210,13 @@ class SceneParams {
persistent_data == params.persistent_data && texture_limit == params.texture_limit);
}
+ bool update_params(const SceneParams ¶ms)
+ {
+ /* We do not want to include use_bvh_refit in the modified detection as this will recreate the entire scene. */
+ use_bvh_refit = params.use_bvh_refit;
+ return modified(params);
+ }
+
int curve_subdivisions()
{
/* Matching the tesselation rate limit in Embree. */
More information about the Bf-blender-cvs
mailing list