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. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
