Commit: 3f8720031e66c7c05dfeba426a9edb5fad48109d Author: Sergey Sharybin Date: Tue Jul 6 12:15:42 2021 +0200 Branches: cycles-x https://developer.blender.org/rB3f8720031e66c7c05dfeba426a9edb5fad48109d
Cycles X: Make pass definition more robust to changes Previously adding, removing, or even changing order of passes in the kernel_types.h would likely to break display pass enum. This was because the python enum was relying on an exact match of enum item values. Now we do an identifier-based lookup via `Pass::get_type_enum`, which allows to more safely change passes in kernel without risk of breaking display passes. Additionally, conversion of pass to string now also happens via the `Pass::get_type_enum`. All in all, it is the pass type enum which s the source of truth with this change. Differential Revision: https://developer.blender.org/D11823 =================================================================== M intern/cycles/blender/addon/properties.py M intern/cycles/blender/blender_viewport.cpp M intern/cycles/kernel/kernel_types.h M intern/cycles/render/pass.cpp M intern/cycles/util/util_string.cpp M intern/cycles/util/util_string.h =================================================================== diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index 6866bd86e78..d297c7eedc2 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -124,43 +124,44 @@ enum_texture_limit = ( ('4096', "4096", "Limit texture size to 4096 pixels", 6), ('8192', "8192", "Limit texture size to 8192 pixels", 7), ) - + +# NOTE: Identifiers are expected to be an upper case version of identifiers from `Pass::get_type_enum()` enum_view3d_shading_render_pass = ( ('', "General", ""), - ('COMBINED', "Combined", "Show the Combined Render pass", 1), - ('EMISSION', "Emission", "Show the Emission render pass", 2), - ('BACKGROUND', "Background", "Show the Background render pass", 3), - ('AO', "Ambient Occlusion", "Show the Ambient Occlusion render pass", 4), - ('SHADOW_CATCHER', "Shadow Catcher", "Show the Shadow Catcher render pass", 52), + ('COMBINED', "Combined", "Show the Combined Render pass"), + ('EMISSION', "Emission", "Show the Emission render pass"), + ('BACKGROUND', "Background", "Show the Background render pass"), + ('AO', "Ambient Occlusion", "Show the Ambient Occlusion render pass"), + ('SHADOW_CATCHER', "Shadow Catcher", "Show the Shadow Catcher render pass"), ('', "Light", ""), - ('DIFFUSE_DIRECT', "Diffuse Direct", "Show the Diffuse Direct render pass", 6), - ('DIFFUSE_INDIRECT', "Diffuse Indirect", "Show the Diffuse Indirect render pass", 7), - ('DIFFUSE_COLOR', "Diffuse Color", "Show the Diffuse Color render pass", 46), + ('DIFFUSE_DIRECT', "Diffuse Direct", "Show the Diffuse Direct render pass"), + ('DIFFUSE_INDIRECT', "Diffuse Indirect", "Show the Diffuse Indirect render pass"), + ('DIFFUSE_COLOR', "Diffuse Color", "Show the Diffuse Color render pass"), - ('GLOSSY_DIRECT', "Glossy Direct", "Show the Glossy Direct render pass", 8), - ('GLOSSY_INDIRECT', "Glossy Indirect", "Show the Glossy Indirect render pass", 9), - ('GLOSSY_COLOR', "Glossy Color", "Show the Glossy Color render pass", 47), + ('GLOSSY_DIRECT', "Glossy Direct", "Show the Glossy Direct render pass"), + ('GLOSSY_INDIRECT', "Glossy Indirect", "Show the Glossy Indirect render pass"), + ('GLOSSY_COLOR', "Glossy Color", "Show the Glossy Color render pass"), ('', "", ""), - ('TRANSMISSION_DIRECT', "Transmission Direct", "Show the Transmission Direct render pass", 10), - ('TRANSMISSION_INDIRECT', "Transmission Indirect", "Show the Transmission Indirect render pass", 11), - ('TRANSMISSION_COLOR', "Transmission Color", "Show the Transmission Color render pass", 48), + ('TRANSMISSION_DIRECT', "Transmission Direct", "Show the Transmission Direct render pass"), + ('TRANSMISSION_INDIRECT', "Transmission Indirect", "Show the Transmission Indirect render pass"), + ('TRANSMISSION_COLOR', "Transmission Color", "Show the Transmission Color render pass"), - ('VOLUME_DIRECT', "Volume Direct", "Show the Volume Direct render pass", 12), - ('VOLUME_INDIRECT', "Volume Indirect", "Show the Volume Indirect render pass", 13), + ('VOLUME_DIRECT', "Volume Direct", "Show the Volume Direct render pass"), + ('VOLUME_INDIRECT', "Volume Indirect", "Show the Volume Indirect render pass"), ('', "Data", ""), - ('NORMAL', "Normal", "Show the Normal render pass", 33), - ('UV', "UV", "Show the UV render pass", 35), - ('MIST', "Mist", "Show the Mist render pass", 49), - ('DENOISING_ALBEDO', "Denoising Albedo", "Albedo pass used by denoiser", 51), - ('DENOISING_NORMAL', "Denoising Normal", "Normal pass used by denoiser", 50), - ('SAMPLE_COUNT', "Sample Count", "Per-pixel number of samples", 45), + ('NORMAL', "Normal", "Show the Normal render pass"), + ('UV', "UV", "Show the UV render pass"), + ('MIST', "Mist", "Show the Mist render pass"), + ('DENOISING_ALBEDO', "Denoising Albedo", "Albedo pass used by denoiser"), + ('DENOISING_NORMAL', "Denoising Normal", "Normal pass used by denoiser"), + ('SAMPLE_COUNT', "Sample Count", "Per-pixel number of samples"), ) diff --git a/intern/cycles/blender/blender_viewport.cpp b/intern/cycles/blender/blender_viewport.cpp index afe45001eab..1f5cd56cf31 100644 --- a/intern/cycles/blender/blender_viewport.cpp +++ b/intern/cycles/blender/blender_viewport.cpp @@ -17,6 +17,8 @@ #include "blender_viewport.h" #include "blender_util.h" +#include "render/pass.h" +#include "util/util_logging.h" CCL_NAMESPACE_BEGIN @@ -56,7 +58,22 @@ BlenderViewportParameters::BlenderViewportParameters(BL::SpaceView3D &b_v3d, boo } /* Film. */ - display_pass = (PassType)get_enum(cshading, "render_pass", -1, -1); + + /* Lookup display pass based on the enum identifier. + * This is because integer values of python enum are not aligned with the passes definition in + * the kernel. */ + + display_pass = PASS_COMBINED; + + const string display_pass_identifier = get_enum_identifier(cshading, "render_pass"); + if (!display_pass_identifier.empty()) { + const ustring pass_type_identifier(string_to_lower(display_pass_identifier)); + const NodeEnum *pass_type_enum = Pass::get_type_enum(); + if (pass_type_enum->exists(pass_type_identifier)) { + display_pass = static_cast<PassType>((*pass_type_enum)[pass_type_identifier]); + } + } + if (use_developer_ui) { show_active_pixels = get_boolean(cshading, "show_active_pixels"); } diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 041c2e7c5c5..7f37c41695e 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -343,6 +343,7 @@ typedef enum ClosureLabel { #define PASS_NAME_JOIN(a, b) a##_##b #define PASSMASK(pass) (1 << ((PASS_NAME_JOIN(PASS, pass)) % 32)) +// NOTE: Keep in sync with `Pass::get_type_enum()`. typedef enum PassType { PASS_NONE = 0, diff --git a/intern/cycles/render/pass.cpp b/intern/cycles/render/pass.cpp index 64f51799b43..e14259e01fe 100644 --- a/intern/cycles/render/pass.cpp +++ b/intern/cycles/render/pass.cpp @@ -21,104 +21,18 @@ CCL_NAMESPACE_BEGIN -/* TODO(sergey): Should be able to de-duplicate with `Pass::get_type_enum` somehow. - * The latter one should also help with solving fragile nature of - * `enum_view3d_shading_render_pass`. */ const char *pass_type_as_string(const PassType type) { - switch (type) { - case PASS_NONE: - return "NONE"; + const int type_int = static_cast<int>(type); - case PASS_COMBINED: - return "COMBINED"; - case PASS_EMISSION: - return "EMISSION"; - case PASS_BACKGROUND: - return "BACKGROUND"; - case PASS_AO: - return "AO"; - case PASS_SHADOW: - return "SHADOW"; - case PASS_DIFFUSE_DIRECT: - return "DIFFUSE_DIRECT"; - case PASS_DIFFUSE_INDIRECT: - return "DIFFUSE_INDIRECT"; - case PASS_GLOSSY_DIRECT: - return "GLOSSY_DIRECT"; - case PASS_GLOSSY_INDIRECT: - return "GLOSSY_INDIRECT"; - case PASS_TRANSMISSION_DIRECT: - return "TRANSMISSION_DIRECT"; - case PASS_TRANSMISSION_INDIRECT: - return "TRANSMISSION_INDIRECT"; - case PASS_VOLUME_DIRECT: - return "VOLUME_DIRECT"; - case PASS_VOLUME_INDIRECT: - return "VOLUME_INDIRECT"; - - case PASS_DEPTH: - return "DEPTH"; - case PASS_NORMAL: - return "NORMAL"; - case PASS_ROUGHNESS: - return "ROUGHNESS"; - case PASS_UV: - return "UV"; - case PASS_OBJECT_ID: - return "OBJECT_ID"; - case PASS_MATERIAL_ID: - return "MATERIAL_ID"; - case PASS_MOTION: - return "MOTION"; - case PASS_MOTION_WEIGHT: - return "MOTION_WEIGHT"; - case PASS_RENDER_TIME: - return "RENDER_TIME"; - case PASS_CRYPTOMATTE: - return "CRYPTOMATTE"; - case PASS_AOV_COLOR: - return "AOV_COLOR"; - case PASS_AOV_VALUE: - return "AOV_VALUE"; - case PASS_ADAPTIVE_AUX_BUFFER: - return "ADAPTIVE_AUX_BUFFER"; - case PASS_SAMPLE_COUNT: - return "SAMPLE_COUNT"; - case PASS_DIFFUSE_COLOR: - return "DIFFUSE_COLOR"; - case PASS_GLOSSY_COLOR: - return "GLOSSY_COLOR"; - case PASS_TRANSMISSION_COLOR: - return "TRANSMISSION_COLOR"; - case PASS_MIST: - return "MIST"; - case PASS_DENOISING_NORMAL: - return "DENOISING_NORMAL"; - case PASS_DENOISING_ALBEDO: - return "DENOISING_ALBEDO"; - case PASS_SHADOW_CATCHER: - return "SHADOW_CATCHER"; - case PASS_SHADOW_CATCHER_MATTE: - return "SHADOW_CATCHER_MATTE"; + const NodeEnum *type_enum = Pass::get_type_enum(); - case PASS_BAKE_PRIMITIVE: - return "BAKE_PRIMITIVE"; - case PASS_BAKE_DIFFERENTIAL: - return "BAKE_DIFFERENTIAL"; - - case PASS_CATEGORY_LIGHT_END: - case PASS_CATEGORY_DATA_END: - case PASS_CATEGORY_BAKE_END: - case PASS_NUM: - LOG(DFATAL) << "Invalid value for the pass type " << static_cast<int>(type) - << " (value is reserved for an internal use only)."; - return "UNKNOWN"; + if (!type_enum->exists(type_int)) { + LOG(DFATAL) << "Unhandled pass type " << static_cast<int>(type) << ", not supposed to happen."; + return "UNKNOWN"; } - LOG(DFATAL) << "Unhandled pass type " << static_cast<int>(type) << ", not supposed to happen."; - - return "UNKNOWN"; + return (*type_enum)[type_int].c_str(); } const char *pass_mode_as_string(PassMode mode) @@ -157,7 +71,23 @@ const NodeEnum *Pass::get_type_enum() static NodeEnum pass_type_enum; if (pass_type_enum.empty()) { + + /* Light Passes. */ pass_type_enum.insert("combined", PASS_COMBINED); + pass_type_enum.insert("emission", PASS_EMISSION); + pass_type_enum.insert("background", PASS_BACKGROUND); + pass_type_enum.insert("ao", PASS_AO); + pass_type_enum.insert("shadow", PASS_SHADOW); + pass_type_enum.insert("diffuse_direct", PASS_DIFFUSE_DIRECT); + pass_type_enum.insert("diffuse_indirect", PASS_DIFFUSE_INDIRECT); + pass_type_enum.insert("glossy_direct", PASS_GLOSSY_DIRECT); + pass_type_enum.insert("glossy_indirect", PASS_GLOSSY_INDIRECT); + pass_type_enum.insert("transmission_direct", PASS_TRANSMISSION_DIRECT); + pass_type_enum.insert("trans @@ 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
