[Bf-blender-cvs] [6f119700ff2] viewport-compositor: Viewport Compositor: Port Map Range node

Omar Emara noreply at git.blender.org
Tue Dec 28 20:02:44 CET 2021


Commit: 6f119700ff2fa91fd5eb6d4cf1b35b0faf806dd5
Author: Omar Emara
Date:   Sat Nov 13 19:48:54 2021 +0200
Branches: viewport-compositor
https://developer.blender.org/rB6f119700ff2fa91fd5eb6d4cf1b35b0faf806dd5

Viewport Compositor: Port Map Range node

This patch ports the Map Range node to the viewport compositor. The
shader is a straightforward port of the compositor code.

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

M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/intern/gpu_material_library.c
A	source/blender/gpu/shaders/composite/gpu_shader_composite_map_value.glsl
M	source/blender/nodes/composite/nodes/node_composite_mapRange.cc

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

diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 2a8312fc201..87bba8f8e86 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -295,6 +295,7 @@ data_to_c_simple(shaders/composite/gpu_shader_composite_hue_correct.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_hue_saturation_value.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_image.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_invert.glsl SRC)
+data_to_c_simple(shaders/composite/gpu_shader_composite_map_value.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_posterize.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_separate_combine.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_set_alpha.glsl SRC)
diff --git a/source/blender/gpu/intern/gpu_material_library.c b/source/blender/gpu/intern/gpu_material_library.c
index eac7c8060d5..04c79393ef8 100644
--- a/source/blender/gpu/intern/gpu_material_library.c
+++ b/source/blender/gpu/intern/gpu_material_library.c
@@ -61,6 +61,7 @@ extern char datatoc_gpu_shader_composite_hue_correct_glsl[];
 extern char datatoc_gpu_shader_composite_hue_saturation_value_glsl[];
 extern char datatoc_gpu_shader_composite_image_glsl[];
 extern char datatoc_gpu_shader_composite_invert_glsl[];
+extern char datatoc_gpu_shader_composite_map_value_glsl[];
 extern char datatoc_gpu_shader_composite_posterize_glsl[];
 extern char datatoc_gpu_shader_composite_separate_combine_glsl[];
 extern char datatoc_gpu_shader_composite_set_alpha_glsl[];
@@ -249,6 +250,11 @@ static GPUMaterialLibrary gpu_shader_composite_invert_library = {
     .dependencies = {NULL},
 };
 
+static GPUMaterialLibrary gpu_shader_composite_map_value_library = {
+    .code = datatoc_gpu_shader_composite_map_value_glsl,
+    .dependencies = {NULL},
+};
+
 static GPUMaterialLibrary gpu_shader_composite_posterize_library = {
     .code = datatoc_gpu_shader_composite_posterize_glsl,
     .dependencies = {NULL},
@@ -776,6 +782,7 @@ static GPUMaterialLibrary *gpu_material_libraries[] = {
     &gpu_shader_composite_hue_saturation_value_library,
     &gpu_shader_composite_image_library,
     &gpu_shader_composite_invert_library,
+    &gpu_shader_composite_map_value_library,
     &gpu_shader_composite_posterize_library,
     &gpu_shader_composite_separate_combined_library,
     &gpu_shader_composite_set_alpha_library,
diff --git a/source/blender/gpu/shaders/composite/gpu_shader_composite_map_value.glsl b/source/blender/gpu/shaders/composite/gpu_shader_composite_map_value.glsl
new file mode 100644
index 00000000000..3f8d269339d
--- /dev/null
+++ b/source/blender/gpu/shaders/composite/gpu_shader_composite_map_value.glsl
@@ -0,0 +1,35 @@
+#define BLENDER_ZMAX 10000.0
+
+void node_composite_map_range(float value,
+                              float from_min,
+                              float from_max,
+                              float to_min,
+                              float to_max,
+                              const float should_clamp,
+                              out float result)
+{
+  if (abs(from_max - from_min) < 1e-6) {
+    result = 0.0;
+  }
+  else {
+    if (value >= -BLENDER_ZMAX && value <= BLENDER_ZMAX) {
+      result = (value - from_min) / (from_max - from_min);
+      result = to_min + result * (to_max - to_min);
+    }
+    else if (value > BLENDER_ZMAX) {
+      result = to_max;
+    }
+    else {
+      result = to_min;
+    }
+
+    if (should_clamp != 0.0) {
+      if (to_max > to_min) {
+        result = clamp(result, to_min, to_max);
+      }
+      else {
+        result = clamp(result, to_max, to_min);
+      }
+    }
+  }
+}
diff --git a/source/blender/nodes/composite/nodes/node_composite_mapRange.cc b/source/blender/nodes/composite/nodes/node_composite_mapRange.cc
index 808ad538e55..399edf3a659 100644
--- a/source/blender/nodes/composite/nodes/node_composite_mapRange.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_mapRange.cc
@@ -37,12 +37,25 @@ static bNodeSocketTemplate cmp_node_map_range_out[] = {
     {-1, ""},
 };
 
+static int node_composite_gpu_map_range(GPUMaterial *mat,
+                                        bNode *node,
+                                        bNodeExecData *UNUSED(execdata),
+                                        GPUNodeStack *in,
+                                        GPUNodeStack *out)
+{
+  const float should_clamp = node->custom1 ? 1.0f : 0.0f;
+
+  return GPU_stack_link(
+      mat, node, "node_composite_map_range", in, out, GPU_constant(&should_clamp));
+}
+
 void register_node_type_cmp_map_range(void)
 {
   static bNodeType ntype;
 
   cmp_node_type_base(&ntype, CMP_NODE_MAP_RANGE, "Map Range", NODE_CLASS_OP_VECTOR, 0);
   node_type_socket_templates(&ntype, cmp_node_map_range_in, cmp_node_map_range_out);
+  node_type_gpu(&ntype, node_composite_gpu_map_range);
 
   nodeRegisterType(&ntype);
 }



More information about the Bf-blender-cvs mailing list