[Bf-blender-cvs] [78cf05c7e81] temp-viewport-compositor-merge: Realtime Compositor: Add Separate Combine color node

Omar Emara noreply at git.blender.org
Tue Jun 28 13:07:11 CEST 2022


Commit: 78cf05c7e81be071fdc217d972eff1ae56f18976
Author: Omar Emara
Date:   Fri Jun 17 10:31:47 2022 +0200
Branches: temp-viewport-compositor-merge
https://developer.blender.org/rB78cf05c7e81be071fdc217d972eff1ae56f18976

Realtime Compositor: Add Separate Combine color node

===================================================================

M	source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_separate_combine.glsl
M	source/blender/nodes/composite/nodes/node_composite_sepcomb_color.cc

===================================================================

diff --git a/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_separate_combine.glsl b/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_separate_combine.glsl
index e8585f9eed3..d72d2260394 100644
--- a/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_separate_combine.glsl
+++ b/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_separate_combine.glsl
@@ -46,6 +46,23 @@ void node_composite_separate_hsva(vec4 color, out float h, out float s, out floa
   a = hsva.a;
 }
 
+/* ** Combine/Separate HSLA ** */
+
+void node_composite_combine_hsla(float h, float s, float l, float a, out vec4 color)
+{
+  hsl_to_rgb(vec4(h, s, l, a), color);
+}
+
+void node_composite_separate_hsla(vec4 color, out float h, out float s, out float l, out float a)
+{
+  vec4 hsla;
+  rgb_to_hsl(color, hsla);
+  h = hsla.x;
+  s = hsla.y;
+  l = hsla.z;
+  a = hsla.a;
+}
+
 /* ** Combine/Separate YCCA ** */
 
 void node_composite_combine_ycca_itu_601(float y, float cb, float cr, float a, out vec4 color)
diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcomb_color.cc b/source/blender/nodes/composite/nodes/node_composite_sepcomb_color.cc
index b253656a628..d49439c4af5 100644
--- a/source/blender/nodes/composite/nodes/node_composite_sepcomb_color.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcomb_color.cc
@@ -1,5 +1,11 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later */
 
+#include "BLI_assert.h"
+
+#include "GPU_material.h"
+
+#include "COM_shader_node.hh"
+
 #include "node_composite_util.hh"
 
 static void node_cmp_combsep_color_init(bNodeTree *UNUSED(ntree), bNode *node)
@@ -58,7 +64,9 @@ namespace blender::nodes::node_composite_separate_color_cc {
 
 static void cmp_node_separate_color_declare(NodeDeclarationBuilder &b)
 {
-  b.add_input<decl::Color>(N_("Image")).default_value({1.0f, 1.0f, 1.0f, 1.0f});
+  b.add_input<decl::Color>(N_("Image"))
+      .default_value({1.0f, 1.0f, 1.0f, 1.0f})
+      .compositor_domain_priority(0);
   b.add_output<decl::Float>(N_("Red"));
   b.add_output<decl::Float>(N_("Green"));
   b.add_output<decl::Float>(N_("Blue"));
@@ -71,6 +79,57 @@ static void cmp_node_separate_color_update(bNodeTree *UNUSED(ntree), bNode *node
   node_cmp_combsep_color_label(&node->outputs, (CMPNodeCombSepColorMode)storage->mode);
 }
 
+using namespace blender::realtime_compositor;
+
+class SeparateColorShaderNode : public ShaderNode {
+ public:
+  using ShaderNode::ShaderNode;
+
+  void compile(GPUMaterial *material) override
+  {
+    GPUNodeStack *inputs = get_inputs_array();
+    GPUNodeStack *outputs = get_outputs_array();
+
+    GPU_stack_link(material, &bnode(), get_shader_function_name(), inputs, outputs);
+  }
+
+  NodeCMPCombSepColor *get_data()
+  {
+    return static_cast<NodeCMPCombSepColor *>(bnode().storage);
+  }
+
+  const char *get_shader_function_name()
+  {
+    switch (get_data()->mode) {
+      case CMP_NODE_COMBSEP_COLOR_RGB:
+        return "node_composite_separate_rgba";
+      case CMP_NODE_COMBSEP_COLOR_HSV:
+        return "node_composite_separate_hsva";
+      case CMP_NODE_COMBSEP_COLOR_HSL:
+        return "node_composite_separate_hsla";
+      case CMP_NODE_COMBSEP_COLOR_YUV:
+        return "node_composite_separate_yuva_itu_709";
+      case CMP_NODE_COMBSEP_COLOR_YCC:
+        switch (get_data()->ycc_mode) {
+          case BLI_YCC_ITU_BT601:
+            return "node_composite_separate_ycca_itu_601";
+          case BLI_YCC_ITU_BT709:
+            return "node_composite_separate_ycca_itu_709";
+          case BLI_YCC_JFIF_0_255:
+            return "node_composite_separate_ycca_jpeg";
+        }
+    }
+
+    BLI_assert_unreachable();
+    return nullptr;
+  }
+};
+
+static ShaderNode *get_compositor_shader_node(DNode node)
+{
+  return new SeparateColorShaderNode(node);
+}
+
 }  // namespace blender::nodes::node_composite_separate_color_cc
 
 void register_node_type_cmp_separate_color()
@@ -85,6 +144,7 @@ void register_node_type_cmp_separate_color()
   node_type_storage(
       &ntype, "NodeCMPCombSepColor", node_free_standard_storage, node_copy_standard_storage);
   node_type_update(&ntype, file_ns::cmp_node_separate_color_update);
+  ntype.get_compositor_shader_node = file_ns::get_compositor_shader_node;
 
   nodeRegisterType(&ntype);
 }
@@ -95,22 +155,30 @@ namespace blender::nodes::node_composite_combine_color_cc {
 
 static void cmp_node_combine_color_declare(NodeDeclarationBuilder &b)
 {
-  b.add_input<decl::Float>(N_("Red")).default_value(0.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
+  b.add_input<decl::Float>(N_("Red"))
+      .default_value(0.0f)
+      .min(0.0f)
+      .max(1.0f)
+      .subtype(PROP_FACTOR)
+      .compositor_domain_priority(0);
   b.add_input<decl::Float>(N_("Green"))
       .default_value(0.0f)
       .min(0.0f)
       .max(1.0f)
-      .subtype(PROP_FACTOR);
+      .subtype(PROP_FACTOR)
+      .compositor_domain_priority(1);
   b.add_input<decl::Float>(N_("Blue"))
       .default_value(0.0f)
       .min(0.0f)
       .max(1.0f)
-      .subtype(PROP_FACTOR);
+      .subtype(PROP_FACTOR)
+      .compositor_domain_priority(2);
   b.add_input<decl::Float>(N_("Alpha"))
       .default_value(1.0f)
       .min(0.0f)
       .max(1.0f)
-      .subtype(PROP_FACTOR);
+      .subtype(PROP_FACTOR)
+      .compositor_domain_priority(3);
   b.add_output<decl::Color>(N_("Image"));
 }
 
@@ -120,6 +188,57 @@ static void cmp_node_combine_color_update(bNodeTree *UNUSED(ntree), bNode *node)
   node_cmp_combsep_color_label(&node->inputs, (CMPNodeCombSepColorMode)storage->mode);
 }
 
+using namespace blender::realtime_compositor;
+
+class CombineColorShaderNode : public ShaderNode {
+ public:
+  using ShaderNode::ShaderNode;
+
+  void compile(GPUMaterial *material) override
+  {
+    GPUNodeStack *inputs = get_inputs_array();
+    GPUNodeStack *outputs = get_outputs_array();
+
+    GPU_stack_link(material, &bnode(), get_shader_function_name(), inputs, outputs);
+  }
+
+  NodeCMPCombSepColor *get_data()
+  {
+    return static_cast<NodeCMPCombSepColor *>(bnode().storage);
+  }
+
+  const char *get_shader_function_name()
+  {
+    switch (get_data()->mode) {
+      case CMP_NODE_COMBSEP_COLOR_RGB:
+        return "node_composite_combine_rgba";
+      case CMP_NODE_COMBSEP_COLOR_HSV:
+        return "node_composite_combine_hsva";
+      case CMP_NODE_COMBSEP_COLOR_HSL:
+        return "node_composite_combine_hsla";
+      case CMP_NODE_COMBSEP_COLOR_YUV:
+        return "node_composite_combine_yuva_itu_709";
+      case CMP_NODE_COMBSEP_COLOR_YCC:
+        switch (get_data()->ycc_mode) {
+          case BLI_YCC_ITU_BT601:
+            return "node_composite_combine_ycca_itu_601";
+          case BLI_YCC_ITU_BT709:
+            return "node_composite_combine_ycca_itu_709";
+          case BLI_YCC_JFIF_0_255:
+            return "node_composite_combine_ycca_jpeg";
+        }
+    }
+
+    BLI_assert_unreachable();
+    return nullptr;
+  }
+};
+
+static ShaderNode *get_compositor_shader_node(DNode node)
+{
+  return new CombineColorShaderNode(node);
+}
+
 }  // namespace blender::nodes::node_composite_combine_color_cc
 
 void register_node_type_cmp_combine_color()
@@ -134,6 +253,7 @@ void register_node_type_cmp_combine_color()
   node_type_storage(
       &ntype, "NodeCMPCombSepColor", node_free_standard_storage, node_copy_standard_storage);
   node_type_update(&ntype, file_ns::cmp_node_combine_color_update);
+  ntype.get_compositor_shader_node = file_ns::get_compositor_shader_node;
 
   nodeRegisterType(&ntype);
 }



More information about the Bf-blender-cvs mailing list