[Bf-blender-cvs] [fea726180d6] viewport-compositor: Viewport Compositor: Port Split Viewer node

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


Commit: fea726180d61e914c523f0f574de3d9c0bb08e0e
Author: Omar Emara
Date:   Sun Nov 14 13:53:20 2021 +0200
Branches: viewport-compositor
https://developer.blender.org/rBfea726180d61e914c523f0f574de3d9c0bb08e0e

Viewport Compositor: Port Split Viewer node

This patch ports the Split Viewer node to the viewport compositor.

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

M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/intern/gpu_material_library.c
A	source/blender/gpu/shaders/composite/gpu_shader_composite_split_viewer.glsl
M	source/blender/nodes/composite/node_composite_tree.cc
M	source/blender/nodes/composite/nodes/node_composite_splitViewer.cc

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

diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index b7a57f85f52..976f8c78dd0 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -300,6 +300,7 @@ data_to_c_simple(shaders/composite/gpu_shader_composite_normal.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)
+data_to_c_simple(shaders/composite/gpu_shader_composite_split_viewer.glsl SRC)
 
 data_to_c_simple(shaders/material/gpu_shader_material_add_shader.glsl SRC)
 data_to_c_simple(shaders/material/gpu_shader_material_ambient_occlusion.glsl SRC)
diff --git a/source/blender/gpu/intern/gpu_material_library.c b/source/blender/gpu/intern/gpu_material_library.c
index dd061934a4a..ec51c003741 100644
--- a/source/blender/gpu/intern/gpu_material_library.c
+++ b/source/blender/gpu/intern/gpu_material_library.c
@@ -66,6 +66,7 @@ extern char datatoc_gpu_shader_composite_normal_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[];
+extern char datatoc_gpu_shader_composite_split_viewer_glsl[];
 
 extern char datatoc_gpu_shader_material_add_shader_glsl[];
 extern char datatoc_gpu_shader_material_ambient_occlusion_glsl[];
@@ -276,6 +277,11 @@ static GPUMaterialLibrary gpu_shader_composite_set_alpha_library = {
     .dependencies = {NULL},
 };
 
+static GPUMaterialLibrary gpu_shader_composite_split_viewer_library = {
+    .code = datatoc_gpu_shader_composite_split_viewer_glsl,
+    .dependencies = {NULL},
+};
+
 static GPUMaterialLibrary gpu_shader_material_noise_library = {
     .code = datatoc_gpu_shader_material_noise_glsl,
     .dependencies = {&gpu_shader_common_hash_library, NULL},
@@ -793,6 +799,7 @@ static GPUMaterialLibrary *gpu_material_libraries[] = {
     &gpu_shader_composite_posterize_library,
     &gpu_shader_composite_separate_combined_library,
     &gpu_shader_composite_set_alpha_library,
+    &gpu_shader_composite_split_viewer_library,
     NULL};
 
 /* GLSL code parsing for finding function definitions.
diff --git a/source/blender/gpu/shaders/composite/gpu_shader_composite_split_viewer.glsl b/source/blender/gpu/shaders/composite/gpu_shader_composite_split_viewer.glsl
new file mode 100644
index 00000000000..34b90d8bf8f
--- /dev/null
+++ b/source/blender/gpu/shaders/composite/gpu_shader_composite_split_viewer.glsl
@@ -0,0 +1,15 @@
+void node_composite_split_viewer_x(vec4 first_color,
+                                   vec4 second_color,
+                                   float split_factor,
+                                   out vec4 result)
+{
+  result = g_data.uv_render_layer.x > split_factor ? first_color : second_color;
+}
+
+void node_composite_split_viewer_y(vec4 first_color,
+                                   vec4 second_color,
+                                   float split_factor,
+                                   out vec4 result)
+{
+  result = g_data.uv_render_layer.y > split_factor ? first_color : second_color;
+}
diff --git a/source/blender/nodes/composite/node_composite_tree.cc b/source/blender/nodes/composite/node_composite_tree.cc
index 73e13027c07..3e4fd941234 100644
--- a/source/blender/nodes/composite/node_composite_tree.cc
+++ b/source/blender/nodes/composite/node_composite_tree.cc
@@ -421,7 +421,7 @@ static bNode *ntreeCompositeViewportOutputNode(bNodeTree *ntree)
   bNode *output_node = NULL;
 
   LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
-    if (!ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_COMPOSITE)) {
+    if (!ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER, CMP_NODE_COMPOSITE)) {
       continue;
     }
 
diff --git a/source/blender/nodes/composite/nodes/node_composite_splitViewer.cc b/source/blender/nodes/composite/nodes/node_composite_splitViewer.cc
index 27fbb0fafd4..143caa7089c 100644
--- a/source/blender/nodes/composite/nodes/node_composite_splitViewer.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_splitViewer.cc
@@ -49,6 +49,22 @@ static void node_composit_init_splitviewer(bNodeTree *UNUSED(ntree), bNode *node
   node->id = (ID *)BKE_image_ensure_viewer(G.main, IMA_TYPE_COMPOSITE, "Viewer Node");
 }
 
+static int node_composit_gpu_splitviewer(GPUMaterial *mat,
+                                         bNode *node,
+                                         bNodeExecData *UNUSED(execdata),
+                                         GPUNodeStack *in,
+                                         GPUNodeStack *out)
+{
+  const float split_factor = node->custom1 / 100.0f;
+  const char *function_name = node->custom2 ? "node_composite_split_viewer_y" :
+                                              "node_composite_split_viewer_x";
+  GPUNodeLink *out_link;
+  GPU_stack_link(mat, node, function_name, in, out, GPU_uniform(&split_factor), &out_link);
+  GPU_material_output_surface(mat, out_link);
+
+  return true;
+}
+
 void register_node_type_cmp_splitviewer(void)
 {
   static bNodeType ntype;
@@ -58,6 +74,7 @@ void register_node_type_cmp_splitviewer(void)
   ntype.declare = blender::nodes::cmp_node_splitviewer_declare;
   node_type_init(&ntype, node_composit_init_splitviewer);
   node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
+  node_type_gpu(&ntype, node_composit_gpu_splitviewer);
 
   /* Do not allow muting for this node. */
   node_type_internal_links(&ntype, nullptr);



More information about the Bf-blender-cvs mailing list