[Bf-blender-cvs] [82df48227bb] master: Nodes: Add general Combine/Separate Color nodes

Hallam Roberts noreply at git.blender.org
Wed May 4 18:44:39 CEST 2022


Commit: 82df48227bb7742466d429a5b465e0ada95d959d
Author: Hallam Roberts
Date:   Wed May 4 18:44:03 2022 +0200
Branches: master
https://developer.blender.org/rB82df48227bb7742466d429a5b465e0ada95d959d

Nodes: Add general Combine/Separate Color nodes

Inspired by D12936 and D12929, this patch adds general purpose
"Combine Color" and "Separate Color" nodes to Geometry, Compositor,
Shader and Texture nodes.
- Within Geometry Nodes, it replaces the existing "Combine RGB" and
  "Separate RGB" nodes.
- Within Compositor Nodes, it replaces the existing
  "Combine RGBA/HSVA/YCbCrA/YUVA" and "Separate RGBA/HSVA/YCbCrA/YUVA"
  nodes.
- Within Texture Nodes, it replaces the existing "Combine RGBA" and
  "Separate RGBA" nodes.
- Within Shader Nodes, it replaces the existing "Combine RGB/HSV" and
  "Separate RGB/HSV" nodes.

Python addons have not been updated to the new nodes yet.

**New shader code**
In node_color.h, color.h and gpu_shader_material_color_util.glsl,
missing methods hsl_to_rgb and rgb_to_hsl are added by directly
converting existing C code. They always produce the same result.

**Old code**
As requested by T96219, old nodes still exist but are not displayed in
the add menu. This means Python scripts can still create them as usual.
Otherwise, versioning replaces the old nodes with the new nodes when
opening .blend files.

Differential Revision: https://developer.blender.org/D14034

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

M	intern/cycles/blender/shader.cpp
M	intern/cycles/kernel/CMakeLists.txt
M	intern/cycles/kernel/osl/shaders/CMakeLists.txt
M	intern/cycles/kernel/osl/shaders/node_color.h
A	intern/cycles/kernel/osl/shaders/node_combine_color.osl
A	intern/cycles/kernel/osl/shaders/node_separate_color.osl
M	intern/cycles/kernel/svm/color_util.h
A	intern/cycles/kernel/svm/sepcomb_color.h
M	intern/cycles/kernel/svm/svm.h
M	intern/cycles/kernel/svm/types.h
M	intern/cycles/scene/shader_nodes.cpp
M	intern/cycles/scene/shader_nodes.h
M	intern/cycles/util/color.h
M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/node.cc
M	source/blender/blenlib/intern/math_color.c
M	source/blender/blenloader/intern/versioning_300.c
M	source/blender/compositor/CMakeLists.txt
M	source/blender/compositor/intern/COM_Converter.cc
M	source/blender/compositor/nodes/COM_CombineColorNode.cc
M	source/blender/compositor/nodes/COM_CombineColorNode.h
A	source/blender/compositor/nodes/COM_CombineColorNodeLegacy.cc
A	source/blender/compositor/nodes/COM_CombineColorNodeLegacy.h
M	source/blender/compositor/nodes/COM_SeparateColorNode.cc
M	source/blender/compositor/nodes/COM_SeparateColorNode.h
A	source/blender/compositor/nodes/COM_SeparateColorNodeLegacy.cc
A	source/blender/compositor/nodes/COM_SeparateColorNodeLegacy.h
M	source/blender/compositor/operations/COM_ConvertOperation.cc
M	source/blender/compositor/operations/COM_ConvertOperation.h
M	source/blender/editors/space_node/drawnode.cc
M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/shaders/material/gpu_shader_material_color_util.glsl
A	source/blender/gpu/shaders/material/gpu_shader_material_combine_color.glsl
A	source/blender/gpu/shaders/material/gpu_shader_material_separate_color.glsl
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/nodes/NOD_composite.h
M	source/blender/nodes/NOD_function.h
M	source/blender/nodes/NOD_shader.h
M	source/blender/nodes/NOD_static_types.h
M	source/blender/nodes/NOD_texture.h
M	source/blender/nodes/composite/CMakeLists.txt
A	source/blender/nodes/composite/nodes/node_composite_sepcomb_color.cc
M	source/blender/nodes/composite/nodes/node_composite_sepcomb_hsva.cc
M	source/blender/nodes/composite/nodes/node_composite_sepcomb_rgba.cc
M	source/blender/nodes/composite/nodes/node_composite_sepcomb_ycca.cc
M	source/blender/nodes/composite/nodes/node_composite_sepcomb_yuva.cc
M	source/blender/nodes/function/CMakeLists.txt
A	source/blender/nodes/function/nodes/node_fn_combine_color.cc
A	source/blender/nodes/function/nodes/node_fn_separate_color.cc
M	source/blender/nodes/intern/node_util.c
M	source/blender/nodes/intern/node_util.h
M	source/blender/nodes/shader/CMakeLists.txt
A	source/blender/nodes/shader/nodes/node_shader_sepcomb_color.cc
M	source/blender/nodes/shader/nodes/node_shader_sepcomb_hsv.cc
M	source/blender/nodes/shader/nodes/node_shader_sepcomb_rgb.cc
M	source/blender/nodes/texture/CMakeLists.txt
A	source/blender/nodes/texture/nodes/node_texture_combine_color.c
M	source/blender/nodes/texture/nodes/node_texture_compose.c
M	source/blender/nodes/texture/nodes/node_texture_decompose.c
A	source/blender/nodes/texture/nodes/node_texture_separate_color.c

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

diff --git a/intern/cycles/blender/shader.cpp b/intern/cycles/blender/shader.cpp
index d3527567b96..35c98a71558 100644
--- a/intern/cycles/blender/shader.cpp
+++ b/intern/cycles/blender/shader.cpp
@@ -355,6 +355,18 @@ static ShaderNode *add_node(Scene *scene,
   else if (b_node.is_a(&RNA_ShaderNodeCombineHSV)) {
     node = graph->create_node<CombineHSVNode>();
   }
+  else if (b_node.is_a(&RNA_ShaderNodeSeparateColor)) {
+    BL::ShaderNodeSeparateColor b_separate_node(b_node);
+    SeparateColorNode *separate_node = graph->create_node<SeparateColorNode>();
+    separate_node->set_color_type((NodeCombSepColorType)b_separate_node.mode());
+    node = separate_node;
+  }
+  else if (b_node.is_a(&RNA_ShaderNodeCombineColor)) {
+    BL::ShaderNodeCombineColor b_combine_node(b_node);
+    CombineColorNode *combine_node = graph->create_node<CombineColorNode>();
+    combine_node->set_color_type((NodeCombSepColorType)b_combine_node.mode());
+    node = combine_node;
+  }
   else if (b_node.is_a(&RNA_ShaderNodeSeparateXYZ)) {
     node = graph->create_node<SeparateXYZNode>();
   }
diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt
index d97854a52d0..473bdb67920 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -145,6 +145,7 @@ set(SRC_KERNEL_SVM_HEADERS
   svm/normal.h
   svm/ramp.h
   svm/ramp_util.h
+  svm/sepcomb_color.h
   svm/sepcomb_hsv.h
   svm/sepcomb_vector.h
   svm/sky.h
diff --git a/intern/cycles/kernel/osl/shaders/CMakeLists.txt b/intern/cycles/kernel/osl/shaders/CMakeLists.txt
index 7ced21c5670..741bce7c399 100644
--- a/intern/cycles/kernel/osl/shaders/CMakeLists.txt
+++ b/intern/cycles/kernel/osl/shaders/CMakeLists.txt
@@ -16,6 +16,7 @@ set(SRC_OSL
   node_camera.osl
   node_checker_texture.osl
   node_clamp.osl
+  node_combine_color.osl
   node_combine_rgb.osl
   node_combine_hsv.osl
   node_combine_xyz.osl
@@ -68,6 +69,7 @@ set(SRC_OSL
   node_refraction_bsdf.osl
   node_rgb_curves.osl
   node_rgb_ramp.osl
+  node_separate_color.osl
   node_separate_rgb.osl
   node_separate_hsv.osl
   node_separate_xyz.osl
diff --git a/intern/cycles/kernel/osl/shaders/node_color.h b/intern/cycles/kernel/osl/shaders/node_color.h
index 388dd114e9a..06735f5b03d 100644
--- a/intern/cycles/kernel/osl/shaders/node_color.h
+++ b/intern/cycles/kernel/osl/shaders/node_color.h
@@ -148,3 +148,53 @@ color hsv_to_rgb(color hsv)
 
   return rgb;
 }
+
+color rgb_to_hsl(color rgb)
+{
+  float cmax, cmin, h, s, l;
+
+  cmax = max(rgb[0], max(rgb[1], rgb[2]));
+  cmin = min(rgb[0], min(rgb[1], rgb[2]));
+  l = min(1.0, (cmax + cmin) / 2.0);
+
+  if (cmax == cmin) {
+    h = s = 0.0; /* achromatic */
+  }
+  else {
+    float cdelta = cmax - cmin;
+    s = l > 0.5 ? cdelta / (2.0 - cmax - cmin) : cdelta / (cmax + cmin);
+    if (cmax == rgb[0]) {
+      h = (rgb[1] - rgb[2]) / cdelta + (rgb[1] < rgb[2] ? 6.0 : 0.0);
+    }
+    else if (cmax == rgb[1]) {
+      h = (rgb[2] - rgb[0]) / cdelta + 2.0;
+    }
+    else {
+      h = (rgb[0] - rgb[1]) / cdelta + 4.0;
+    }
+  }
+  h /= 6.0;
+
+  return color(h, s, l);
+}
+
+color hsl_to_rgb(color hsl)
+{
+  float nr, ng, nb, chroma, h, s, l;
+
+  h = hsl[0];
+  s = hsl[1];
+  l = hsl[2];
+
+  nr = abs(h * 6.0 - 3.0) - 1.0;
+  ng = 2.0 - abs(h * 6.0 - 2.0);
+  nb = 2.0 - abs(h * 6.0 - 4.0);
+
+  nr = clamp(nr, 0.0, 1.0);
+  nb = clamp(nb, 0.0, 1.0);
+  ng = clamp(ng, 0.0, 1.0);
+
+  chroma = (1.0 - abs(2.0 * l - 1.0)) * s;
+
+  return color((nr - 0.5) * chroma + l, (ng - 0.5) * chroma + l, (nb - 0.5) * chroma + l);
+}
diff --git a/intern/cycles/kernel/osl/shaders/node_combine_color.osl b/intern/cycles/kernel/osl/shaders/node_combine_color.osl
new file mode 100644
index 00000000000..94d624d82ad
--- /dev/null
+++ b/intern/cycles/kernel/osl/shaders/node_combine_color.osl
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: Apache-2.0
+ * Copyright 2011-2022 Blender Foundation */
+
+#include "stdcycles.h"
+
+shader node_combine_color(string color_type = "rgb", float Red = 0.0, float Green = 0.0, float Blue = 0.0, output color Color = 0.8)
+{
+  if (color_type == "rgb" || color_type == "hsv" || color_type == "hsl")
+    Color = color(color_type, Red, Green, Blue);
+  else
+    warning("%s", "Unknown color space!");
+}
diff --git a/intern/cycles/kernel/osl/shaders/node_separate_color.osl b/intern/cycles/kernel/osl/shaders/node_separate_color.osl
new file mode 100644
index 00000000000..cba2d85da05
--- /dev/null
+++ b/intern/cycles/kernel/osl/shaders/node_separate_color.osl
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: Apache-2.0
+ * Copyright 2011-2022 Blender Foundation */
+
+#include "node_color.h"
+#include "stdcycles.h"
+
+shader node_separate_color(string color_type = "rgb",
+                         color Color = 0.8,
+                         output float Red = 0.0,
+                         output float Green = 0.0,
+                         output float Blue = 0.0)
+{
+  color col;
+  if (color_type == "rgb")
+    col = Color;
+  else if (color_type == "hsv")
+    col = rgb_to_hsv(Color);
+  else if (color_type == "hsl")
+    col = rgb_to_hsl(Color);
+  else
+    warning("%s", "Unknown color space!");
+
+  Red = col[0];
+  Green = col[1];
+  Blue = col[2];
+}
diff --git a/intern/cycles/kernel/svm/color_util.h b/intern/cycles/kernel/svm/color_util.h
index b439721383c..fa22d4bc8c2 100644
--- a/intern/cycles/kernel/svm/color_util.h
+++ b/intern/cycles/kernel/svm/color_util.h
@@ -307,4 +307,30 @@ ccl_device_inline float3 svm_brightness_contrast(float3 color, float brightness,
   return color;
 }
 
+ccl_device float3 svm_combine_color(NodeCombSepColorType type, float3 color)
+{
+  switch (type) {
+    case NODE_COMBSEP_COLOR_HSV:
+      return hsv_to_rgb(color);
+    case NODE_COMBSEP_COLOR_HSL:
+      return hsl_to_rgb(color);
+    case NODE_COMBSEP_COLOR_RGB:
+    default:
+      return color;
+  }
+}
+
+ccl_device float3 svm_separate_color(NodeCombSepColorType type, float3 color)
+{
+  switch (type) {
+    case NODE_COMBSEP_COLOR_HSV:
+      return rgb_to_hsv(color);
+    case NODE_COMBSEP_COLOR_HSL:
+      return rgb_to_hsl(color);
+    case NODE_COMBSEP_COLOR_RGB:
+    default:
+      return color;
+  }
+}
+
 CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/svm/sepcomb_color.h b/intern/cycles/kernel/svm/sepcomb_color.h
new file mode 100644
index 00000000000..a1a8cdfd9b0
--- /dev/null
+++ b/intern/cycles/kernel/svm/sepcomb_color.h
@@ -0,0 +1,53 @@
+/* SPDX-License-Identifier: Apache-2.0
+ * Copyright 2011-2022 Blender Foundation */
+
+#pragma once
+
+CCL_NAMESPACE_BEGIN
+
+ccl_device_noinline void svm_node_combine_color(KernelGlobals kg,
+                                             ccl_private ShaderData *sd,
+                                             ccl_private float *stack,
+                                             uint color_type,
+                                             uint inputs_stack_offsets,
+                                             uint result_stack_offset)
+{
+  uint red_stack_offset, green_stack_offset, blue_stack_offset;
+  svm_unpack_node_uchar3(inputs_stack_offsets, &red_stack_offset, &green_stack_offset, &blue_stack_offset);
+
+  float r = stack_load_float(stack, red_stack_offset);
+  float g = stack_load_float(stack, green_stack_offset);
+  float b = stack_load_float(stack, blue_stack_offset);
+
+  /* Combine, and convert back to RGB */
+  float3 color = svm_combine_color((NodeCombSepColorType)color_type, make_float3(r, g, b));
+
+  if (stack_valid(result_stack_offset))
+    stack_store_float3(stack, result_stack_offset, color);
+}
+
+ccl_device_noinline void svm_node_separate_color(KernelGlobals kg,
+                                                ccl_private ShaderData *sd,
+                                                ccl_private float *stack,
+                                                uint color_type,
+                                                uint input_stack_offset,
+                                                uint results_stack_offsets)
+{
+  float3 color = stack_load_float3(stack, input_stack_offset);
+
+  /* Convert color space */
+  color = svm_separate_color((NodeCombSepColorType)color_type, color);
+
+  uint red_stack_offset, green_stack_offset, blue_stack_offset;
+  svm_unpack_node_uchar3(
+      results_stack_offsets, &red_stack_offset, &green_stack_offset, &blue_stack_offset);
+
+  if (stack_valid(red_stack_offset))
+    stack_store_float(stack, red_stack_offset, color.x);
+  if (stack_valid(green_stack_offset))
+    stack_store_float(stack, green_stack_offset, color.y);
+  if (stack_valid(blue_stack_offset))
+    stack_store_float(stack, blue_stack_offset, color.z);
+}
+
+CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index 6b969da7e52..293501946c4 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -181,6 +181,7 @@ CCL_NAMESPACE_END
 #include "kernel/svm/noisetex.h"
 #include "kernel/svm/normal.h"
 #include "kernel/svm/ramp.h"
+#include "kernel/svm/sepcomb_color.h"
 #include "kernel/svm/sepcomb_hsv.h"
 #include "kernel/svm/sepcomb_vector.h"
 #include "kernel/svm/sky.h"
@@ -520,6 +521,12 @@ ccl_device void svm_eval_nodes(KernelGlobals kg,
       case NODE_MIX:
         offset = svm_node_mix(kg, sd, stack, node.y, node.z, node.w, offset);
         break;
+      case NODE_SEPARATE_COLOR:
+        svm_node_separate_color(kg, sd, stack, node.y, node.z, node.w);
+        break;
+      case NODE_COMBINE_COLOR:
+        svm_node_combine_color(kg, sd, stack, node.y, node.z, node.w);
+        break;
       case NODE_SEPARATE_VECTOR:
         svm_node_separate_vector(sd, stack, node.y, node.z, node.w);
         break;
diff --git a/intern/cycles/kernel/svm/types.h b/intern/cycles/kernel/svm/types.h
index bede58f7a54..82109ec4c4f 100644
--- a/intern/cycles/kernel/svm/types.h
+++ b/intern/cycles/kernel/svm/types.h
@@ -92,6 +92,8 @@ typedef enum ShaderNodeType {
   NODE_NORMAL_MAP,
   NODE_INVERT,
   NODE_MIX,
+  NODE_SEPARATE_COLOR,
+  NODE_COMBINE_COLOR,
   NODE_SEPARATE_VECTOR,
   NODE_COMBINE_VECTOR,
   NODE_SEPARATE_HSV,
@@ -487,6 +489,12 @@ typedef enum NodePrincipledHairParametrization {
   NODE_PRINCIPLED_HAIR

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list