Commit: 9c3b42a18829387c0fe8c2a197b564ebae82ebee
Author: Omar Emara
Date:   Wed Nov 17 21:45:58 2021 +0200
Branches: viewport-compositor
https://developer.blender.org/rB9c3b42a18829387c0fe8c2a197b564ebae82ebee

Viewport Compositor: Port Distance Key node

This patch ports the Distance Key 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_distance_matte.glsl
M       source/blender/nodes/composite/nodes/node_composite_distanceMatte.cc

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

diff --git a/source/blender/gpu/CMakeLists.txt 
b/source/blender/gpu/CMakeLists.txt
index 3dfedf13d8e..8a66dddda53 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_color_spill.glsl SRC)
 
data_to_c_simple(shaders/composite/gpu_shader_composite_color_to_luminance.glsl 
SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_composite.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_difference_matte.glsl 
SRC)
+data_to_c_simple(shaders/composite/gpu_shader_composite_distance_matte.glsl 
SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_ellipse_mask.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_exposure.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_gamma.glsl SRC)
diff --git a/source/blender/gpu/intern/gpu_material_library.c 
b/source/blender/gpu/intern/gpu_material_library.c
index b553b62b77f..c0d16b3f480 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_color_spill_glsl[];
 extern char datatoc_gpu_shader_composite_color_to_luminance_glsl[];
 extern char datatoc_gpu_shader_composite_composite_glsl[];
 extern char datatoc_gpu_shader_composite_difference_matte_glsl[];
+extern char datatoc_gpu_shader_composite_distance_matte_glsl[];
 extern char datatoc_gpu_shader_composite_ellipse_mask_glsl[];
 extern char datatoc_gpu_shader_composite_exposure_glsl[];
 extern char datatoc_gpu_shader_composite_gamma_glsl[];
@@ -261,6 +262,11 @@ static GPUMaterialLibrary 
gpu_shader_composite_difference_matte_library = {
     .dependencies = {NULL},
 };
 
+static GPUMaterialLibrary gpu_shader_composite_distance_matte_library = {
+    .code = datatoc_gpu_shader_composite_distance_matte_glsl,
+    .dependencies = {&gpu_shader_common_color_util_library, NULL},
+};
+
 static GPUMaterialLibrary gpu_shader_composite_ellipse_mask_library = {
     .code = datatoc_gpu_shader_composite_ellipse_mask_glsl,
     .dependencies = {NULL},
@@ -838,6 +844,7 @@ static GPUMaterialLibrary *gpu_material_libraries[] = {
     &gpu_shader_composite_color_to_luminance_library,
     &gpu_shader_composite_composite_library,
     &gpu_shader_composite_difference_matte_library,
+    &gpu_shader_composite_distance_matte_library,
     &gpu_shader_composite_ellipse_mask_library,
     &gpu_shader_composite_exposure_library,
     &gpu_shader_composite_gamma_library,
diff --git 
a/source/blender/gpu/shaders/composite/gpu_shader_composite_distance_matte.glsl 
b/source/blender/gpu/shaders/composite/gpu_shader_composite_distance_matte.glsl
new file mode 100644
index 00000000000..4c5c543c90e
--- /dev/null
+++ 
b/source/blender/gpu/shaders/composite/gpu_shader_composite_distance_matte.glsl
@@ -0,0 +1,24 @@
+void node_composite_distance_matte_rgba(
+    vec4 color, vec4 key, float tolerance, float falloff, out vec4 result, out 
float matte)
+{
+  float difference = distance(color.rgb, key.rgb);
+  bool is_opaque = difference > tolerance + falloff;
+  float alpha = is_opaque ? color.a : max(0.0, difference - tolerance) / 
falloff;
+  matte = min(alpha, color.a);
+  result = color * matte;
+}
+
+void node_composite_distance_matte_ycca(
+    vec4 color, vec4 key, float tolerance, float falloff, out vec4 result, out 
float matte)
+{
+  vec4 color_ycca;
+  rgba_to_ycca_itu_709(color, color_ycca);
+  vec4 key_ycca;
+  rgba_to_ycca_itu_709(key, key_ycca);
+
+  float difference = distance(color_ycca.yz, key_ycca.yz);
+  bool is_opaque = difference > tolerance + falloff;
+  float alpha = is_opaque ? color.a : max(0.0, difference - tolerance) / 
falloff;
+  matte = min(alpha, color.a);
+  result = color * matte;
+}
diff --git 
a/source/blender/nodes/composite/nodes/node_composite_distanceMatte.cc 
b/source/blender/nodes/composite/nodes/node_composite_distanceMatte.cc
index 3f8767ecd08..2422199daa4 100644
--- a/source/blender/nodes/composite/nodes/node_composite_distanceMatte.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_distanceMatte.cc
@@ -45,6 +45,34 @@ static void node_composit_init_distance_matte(bNodeTree 
*UNUSED(ntree), bNode *n
   c->t2 = 0.1f;
 }
 
+static int node_composite_gpu_distance_matte(GPUMaterial *mat,
+                                             bNode *node,
+                                             bNodeExecData *UNUSED(execdata),
+                                             GPUNodeStack *in,
+                                             GPUNodeStack *out)
+{
+  const NodeChroma *data = (NodeChroma *)node->storage;
+
+  if (data->channel == 1) {
+    return GPU_stack_link(mat,
+                          node,
+                          "node_composite_distance_matte_rgba",
+                          in,
+                          out,
+                          GPU_uniform(&data->t1),
+                          GPU_uniform(&data->t2));
+  }
+  else {
+    return GPU_stack_link(mat,
+                          node,
+                          "node_composite_distance_matte_ycca",
+                          in,
+                          out,
+                          GPU_uniform(&data->t1),
+                          GPU_uniform(&data->t2));
+  }
+}
+
 void register_node_type_cmp_distance_matte(void)
 {
   static bNodeType ntype;
@@ -53,6 +81,7 @@ void register_node_type_cmp_distance_matte(void)
   node_type_socket_templates(&ntype, cmp_node_distance_matte_in, 
cmp_node_distance_matte_out);
   node_type_init(&ntype, node_composit_init_distance_matte);
   node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, 
node_copy_standard_storage);
+  node_type_gpu(&ntype, node_composite_gpu_distance_matte);
 
   nodeRegisterType(&ntype);
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to