[Bf-blender-cvs] [7440807beb9] cycles-x: Cycles X: refactor passes to work like other nodes in the scene
Brecht Van Lommel
noreply at git.blender.org
Thu Aug 5 17:17:16 CEST 2021
Commit: 7440807beb9eb1e65b9285fd005ae11a6a4ecf71
Author: Brecht Van Lommel
Date: Thu Jul 29 17:56:34 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB7440807beb9eb1e65b9285fd005ae11a6a4ecf71
Cycles X: refactor passes to work like other nodes in the scene
* Alloc through create_node<Pass>() instead of Pass::add().
* Handle auto adding of passes, duplicate removal and other validation
in update_pass(), afterwards.
* Centralize pass logic from scene.cpp and pass.cpp into film.cpp.
* Move logic for which passes are read/written or noisy/denoised out
of Blender sync.
* Eliminate or change DENOISED to NOISY passes when denoising is
disabled, rather than using is_written().
This makes some upcoming changes easier, and is also a step towards
a better Cycles public API.
Differential Revision: https://developer.blender.org/D12118
===================================================================
M intern/cycles/blender/blender_session.cpp
M intern/cycles/blender/blender_sync.cpp
M intern/cycles/graph/node.cpp
M intern/cycles/graph/node.h
M intern/cycles/integrator/pass_accessor.cpp
M intern/cycles/integrator/pass_accessor.h
M intern/cycles/render/bake.cpp
M intern/cycles/render/bake.h
M intern/cycles/render/buffers.cpp
M intern/cycles/render/buffers.h
M intern/cycles/render/film.cpp
M intern/cycles/render/film.h
M intern/cycles/render/pass.cpp
M intern/cycles/render/pass.h
M intern/cycles/render/scene.cpp
M intern/cycles/render/scene.h
M intern/cycles/render/session.cpp
===================================================================
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index c44812b436f..99236f20464 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -631,7 +631,9 @@ void BlenderSession::bake(BL::Depsgraph &b_depsgraph_,
/* Add render pass that we want to bake, and name it Combined so that it is
* used as that on the Blender side. */
const PassType pass_type = bake_type_to_pass(bake_type, bake_filter);
- Pass::add(scene->passes, pass_type, "Combined");
+ Pass *pass = scene->create_node<Pass>();
+ pass->type = pass_type;
+ pass->name = "Combined";
session->read_render_tile_cb = [&]() { read_render_tile(); };
session->write_render_tile_cb = [&]() { write_render_tile(); };
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 83aa3c1a79f..9d3daf6fb2e 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -495,29 +495,18 @@ void BlenderSync::sync_images()
/* Passes */
-class BlenderPassInfo {
- public:
- explicit BlenderPassInfo(PassType type = PASS_NONE, PassMode mode = PassMode::NOISY)
- : type(type), mode(mode)
- {
- }
-
- PassType type = PASS_NONE;
- PassMode mode = PassMode::NOISY;
-};
-
-static BlenderPassInfo get_blender_pass_info(BL::RenderPass &b_pass)
+static PassType get_blender_pass_type(BL::RenderPass &b_pass)
{
string name = b_pass.name();
-#define MAP_PASS(passname, ...) \
+#define MAP_PASS(passname, passtype) \
if (name == passname) { \
- return BlenderPassInfo(__VA_ARGS__); \
+ return passtype; \
} \
((void)0)
/* NOTE: Keep in sync with defined names from DNA_scene_types.h */
- MAP_PASS("Combined", PASS_COMBINED, PassMode::DENOISED);
+ MAP_PASS("Combined", PASS_COMBINED);
MAP_PASS("Noisy Image", PASS_COMBINED);
MAP_PASS("Depth", PASS_DEPTH);
@@ -553,7 +542,7 @@ static BlenderPassInfo get_blender_pass_info(BL::RenderPass &b_pass)
MAP_PASS("Denoising Normal", PASS_DENOISING_NORMAL);
MAP_PASS("Denoising Albedo", PASS_DENOISING_ALBEDO);
- MAP_PASS("Shadow Catcher", PASS_SHADOW_CATCHER, PassMode::DENOISED);
+ MAP_PASS("Shadow Catcher", PASS_SHADOW_CATCHER);
MAP_PASS("Noisy Shadow Catcher", PASS_SHADOW_CATCHER);
MAP_PASS("Debug Render Time", PASS_RENDER_TIME);
@@ -562,12 +551,26 @@ static BlenderPassInfo get_blender_pass_info(BL::RenderPass &b_pass)
MAP_PASS("Debug Sample Count", PASS_SAMPLE_COUNT);
if (string_startswith(name, cryptomatte_prefix)) {
- return BlenderPassInfo(PASS_CRYPTOMATTE);
+ return PASS_CRYPTOMATTE;
}
#undef MAP_PASS
- return BlenderPassInfo(PASS_NONE);
+ return PASS_NONE;
+}
+
+static Pass *pass_add(Scene *scene,
+ PassType type,
+ const char *name,
+ PassMode mode = PassMode::DENOISED)
+{
+ Pass *pass = scene->create_node<Pass>();
+
+ pass->type = type;
+ pass->name = name;
+ pass->mode = mode;
+
+ return pass;
}
void BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, BL::ViewLayer &b_view_layer)
@@ -576,28 +579,28 @@ void BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, BL::ViewLayer &b_v
bool add_denoised_passes = false;
- vector<Pass> passes;
+ /* Delete all existing passes. */
+ set<Pass *> clear_passes(scene->passes.begin(), scene->passes.end());
+ scene->delete_nodes(clear_passes);
+
+ /* Always add combined pass. */
+ pass_add(scene, PASS_COMBINED, "Combined");
/* loop over passes */
for (BL::RenderPass &b_pass : b_rlay.passes) {
- const BlenderPassInfo pass_info = get_blender_pass_info(b_pass);
+ const PassType pass_type = get_blender_pass_type(b_pass);
- if (pass_info.type == PASS_NONE) {
+ if (pass_type == PASS_NONE) {
LOG(ERROR) << "Unknown pass " << b_pass.name();
continue;
}
- if (pass_info.type == PASS_MOTION &&
+ if (pass_type == PASS_MOTION &&
(b_view_layer.use_motion_blur() && b_scene.render().use_motion_blur())) {
continue;
}
- if (pass_info.mode == PassMode::DENOISED) {
- Pass::add_denoising_read(passes, pass_info.type, b_pass.name().c_str());
- }
- else {
- Pass::add(passes, pass_info.type, b_pass.name().c_str());
- }
+ pass_add(scene, pass_type, b_pass.name().c_str());
}
PointerRNA crl = RNA_pointer_get(&b_view_layer.ptr, "cycles");
@@ -606,45 +609,45 @@ void BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, BL::ViewLayer &b_v
add_denoised_passes = true;
b_engine.add_pass("Noisy Image", 4, "RGBA", b_view_layer.name().c_str());
- Pass::add(passes, PASS_COMBINED, "Noisy Image");
+ pass_add(scene, PASS_COMBINED, "Noisy Image", PassMode::NOISY);
b_engine.add_pass("Denoising Normal", 3, "XYZ", b_view_layer.name().c_str());
- Pass::add(passes, PASS_DENOISING_NORMAL, "Denoising Normal");
+ pass_add(scene, PASS_DENOISING_NORMAL, "Denoising Normal", PassMode::NOISY);
b_engine.add_pass("Denoising Albedo", 3, "RGB", b_view_layer.name().c_str());
- Pass::add(passes, PASS_DENOISING_ALBEDO, "Denoising Albedo");
+ pass_add(scene, PASS_DENOISING_ALBEDO, "Denoising Albedo", PassMode::NOISY);
}
else if (get_boolean(cscene, "use_denoising")) {
add_denoised_passes = true;
b_engine.add_pass("Noisy Image", 4, "RGBA", b_view_layer.name().c_str());
- Pass::add(passes, PASS_COMBINED, "Noisy Image");
+ pass_add(scene, PASS_COMBINED, "Noisy Image", PassMode::NOISY);
}
if (get_boolean(crl, "pass_debug_render_time")) {
b_engine.add_pass("Debug Render Time", 1, "X", b_view_layer.name().c_str());
- Pass::add(passes, PASS_RENDER_TIME, "Debug Render Time");
+ pass_add(scene, PASS_RENDER_TIME, "Debug Render Time");
}
if (get_boolean(crl, "pass_debug_sample_count")) {
b_engine.add_pass("Debug Sample Count", 1, "X", b_view_layer.name().c_str());
- Pass::add(passes, PASS_SAMPLE_COUNT, "Debug Sample Count");
+ pass_add(scene, PASS_SAMPLE_COUNT, "Debug Sample Count");
}
if (get_boolean(crl, "use_pass_volume_direct")) {
b_engine.add_pass("VolumeDir", 3, "RGB", b_view_layer.name().c_str());
- Pass::add(passes, PASS_VOLUME_DIRECT, "VolumeDir");
+ pass_add(scene, PASS_VOLUME_DIRECT, "VolumeDir");
}
if (get_boolean(crl, "use_pass_volume_indirect")) {
b_engine.add_pass("VolumeInd", 3, "RGB", b_view_layer.name().c_str());
- Pass::add(passes, PASS_VOLUME_INDIRECT, "VolumeInd");
+ pass_add(scene, PASS_VOLUME_INDIRECT, "VolumeInd");
}
if (get_boolean(crl, "use_pass_shadow_catcher")) {
b_engine.add_pass("Shadow Catcher", 3, "RGB", b_view_layer.name().c_str());
- Pass::add_denoising_read(passes, PASS_SHADOW_CATCHER, "Shadow Catcher");
+ pass_add(scene, PASS_SHADOW_CATCHER, "Shadow Catcher");
if (add_denoised_passes) {
b_engine.add_pass("Noisy Shadow Catcher", 3, "RGB", b_view_layer.name().c_str());
- Pass::add(passes, PASS_SHADOW_CATCHER, "Noisy Shadow Catcher");
+ pass_add(scene, PASS_SHADOW_CATCHER, "Noisy Shadow Catcher", PassMode::NOISY);
}
}
@@ -657,7 +660,7 @@ void BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, BL::ViewLayer &b_v
for (int i = 0; i < crypto_depth; i++) {
string passname = cryptomatte_prefix + string_printf("Object%02d", i);
b_engine.add_pass(passname.c_str(), 4, "RGBA", b_view_layer.name().c_str());
- Pass::add(passes, PASS_CRYPTOMATTE, passname.c_str());
+ pass_add(scene, PASS_CRYPTOMATTE, passname.c_str());
}
cryptomatte_passes = (CryptomatteType)(cryptomatte_passes | CRYPT_OBJECT);
}
@@ -665,7 +668,7 @@ void BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, BL::ViewLayer &b_v
for (int i = 0; i < crypto_depth; i++) {
string passname = cryptomatte_prefix + string_printf("Material%02d", i);
b_engine.add_pass(passname.c_str(), 4, "RGBA", b_view_layer.name().c_str());
- Pass::add(passes, PASS_CRYPTOMATTE, passname.c_str());
+ pass_add(scene, PASS_CRYPTOMATTE, passname.c_str());
}
cryptomatte_passes = (CryptomatteType)(cryptomatte_passes | CRYPT_MATERIAL);
}
@@ -673,7 +676,7 @@ void BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, BL::ViewLayer &b_v
for (int i = 0; i < crypto_depth; i++) {
string passname = cryptomatte_prefix + string_printf("Asset%02d", i);
b_engine.add_pass(passname.c_str(), 4, "RGBA", b_view_layer.name().c_str());
- Pass::add(passes, PASS_CRYPTOMATTE, passname.c_str());
+ pass_add(scene, PASS_CRYPTOMATTE, passname.c_str());
}
cryptomatte_passes = (CryptomatteType)(cryptomatte_passes | CRYPT_ASSET);
}
@@ -694,17 +697,15 @@ void BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, BL::ViewLayer &b_v
if (is_color) {
b_engine.add_pass(name.c_str(), 4, "RGBA", b_view_layer.name().c_str());
- Pass::add(passes, PASS_AOV_COLOR, name.c_str());
+ pass_add(scene, PASS_AOV_COLOR, name.c_str());
}
else {
b_engine.add_pass(name.c_str(), 1, "X", b_view_layer.name().c_str());
- Pass::add(passes, PASS_AOV_VALUE, name.c_str());
+ pass_add(scene, PASS_AOV_VALUE, name.c_str());
}
}
scene->film->set_pass_alpha_threshold(b_view_layer.pass_alpha_threshold());
- scene->film->assign_and_tag_passes_update(scene, passes);
- scene->integrator->tag_update(scene, Integrator::UPDATE_ALL);
}
void BlenderSync::free_data_after_sync(BL::Depsgraph &b_depsgraph)
diff --git a/intern/cycles/graph/node.cpp b/intern/cycles/graph/node.cpp
index 57f25283f85..8294e716ebe 100644
--- a/intern/cycles/graph/node.cpp
+++ b/intern/cycles/graph/node.cpp
@@ -814,7 +814,7 @@ bool Node::socket_is_modified(const SocketType &input) const
return (socket_modified & input.modified_flag_bit) != 0;
}
-bool Node::is_modified()
+bool Node::is_modified() const
{
return socket_modified != 0;
}
diff --git a/intern/cycles/graph/node.h b/intern/cycles/graph/node.h
index aa365baeccd..b2dc1a65006 100644
--- a/intern/cycles/graph/node.h
+++ b/intern/cycles/graph/node.h
@@ -164,7 +164,7 @@ struct Node {
bool socket_is_modified(const SocketType &input) const;
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list