[Bf-blender-cvs] [3f8720031e6] cycles-x: Cycles X: Make pass definition more robust to changes

Sergey Sharybin noreply at git.blender.org
Tue Jul 6 12:44:01 CEST 2021


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. @@



More information about the Bf-blender-cvs mailing list