[Bf-blender-cvs] [9fd51e16edb] tmp-workbench-rewrite2: Move the outline pass to its own class and file

Miguel Pozo noreply at git.blender.org
Wed Nov 2 23:43:27 CET 2022


Commit: 9fd51e16edbd481dd055e5849fa22cb179d0bc32
Author: Miguel Pozo
Date:   Wed Nov 2 13:11:14 2022 +0100
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rB9fd51e16edbd481dd055e5849fa22cb179d0bc32

Move the outline pass to its own class and file

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

M	source/blender/draw/CMakeLists.txt
A	source/blender/draw/engines/workbench/workbench_effect_outline.cc
M	source/blender/draw/engines/workbench/workbench_engine.cc
M	source/blender/draw/engines/workbench/workbench_private.hh

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 4fef6a72076..4d17e6cbdd1 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -161,6 +161,7 @@ set(SRC
   engines/workbench/workbench_effect_dof.c
   engines/workbench/workbench_effect_dof.cc
   engines/workbench/workbench_effect_outline.c
+  engines/workbench/workbench_effect_outline.cc
   engines/workbench/workbench_engine.c
   engines/workbench/workbench_engine.cc
   engines/workbench/workbench_materials.c
diff --git a/source/blender/draw/engines/workbench/workbench_effect_outline.cc b/source/blender/draw/engines/workbench/workbench_effect_outline.cc
new file mode 100644
index 00000000000..4a060153618
--- /dev/null
+++ b/source/blender/draw/engines/workbench/workbench_effect_outline.cc
@@ -0,0 +1,53 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright 2020 Blender Foundation. */
+
+/** \file
+ * \ingroup draw_engine
+ *
+ * Outline Effect:
+ *
+ * Simple effect that just samples an object id buffer to detect objects outlines.
+ */
+
+#include "workbench_private.hh"
+
+namespace blender::workbench {
+
+void OutlinePass::init(const SceneState &scene_state)
+{
+  enabled_ = scene_state.draw_outline;
+  if (!enabled_) {
+    return;
+  }
+
+  if (sh_ == nullptr) {
+    sh_ = GPU_shader_create_from_info_name("workbench_effect_outline");
+  }
+}
+
+void OutlinePass::sync(SceneResources &resources)
+{
+  if (!enabled_) {
+    return;
+  }
+
+  ps_.init();
+  ps_.state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_PREMUL);
+  ps_.shader_set(sh_);
+  ps_.bind_ubo("world_data", resources.world_buf);
+  ps_.bind_texture("objectIdBuffer", &resources.object_id_tx);
+  ps_.draw_procedural(GPU_PRIM_TRIS, 1, 3);
+}
+
+void OutlinePass::draw(Manager &manager, View &view, SceneResources &resources, int2 resolution)
+{
+  if (!enabled_) {
+    return;
+  }
+
+  fb_.ensure(GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(resources.color_tx));
+  fb_.bind();
+  manager.submit(ps_);
+}
+
+}  // namespace blender::workbench
diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc
index fe4df3465c9..6f5b7e3b6e5 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.cc
+++ b/source/blender/draw/engines/workbench/workbench_engine.cc
@@ -31,6 +31,7 @@ class Instance {
   TransparentPass transparent_ps;
   TransparentDepthPass transparent_depth_ps;
 
+  OutlinePass outline_ps;
   DofPass dof_ps;
   AntiAliasingPass anti_aliasing_ps;
 
@@ -38,6 +39,8 @@ class Instance {
   {
     scene_state.init();
     resources.init(scene_state);
+
+    outline_ps.init(scene_state);
     dof_ps.init(scene_state);
     anti_aliasing_ps.init(scene_state);
   }
@@ -48,6 +51,7 @@ class Instance {
     transparent_ps.sync(scene_state, resources);
     transparent_depth_ps.sync(scene_state, resources);
 
+    outline_ps.sync(resources);
     dof_ps.sync(resources);
     anti_aliasing_ps.sync(resources, scene_state.resolution);
   }
@@ -320,24 +324,9 @@ class Instance {
     transparent_ps.draw(manager, view, resources, resolution);
     transparent_depth_ps.draw(manager, view, resources, resolution);
 
-    if (scene_state.draw_outline) {
-      PassSimple outline_ps = PassSimple("Workbench.Outline");
-      outline_ps.state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_PREMUL);
-      static GPUShader *outline_shader = GPU_shader_create_from_info_name(
-          "workbench_effect_outline");
-      outline_ps.shader_set(outline_shader);
-      outline_ps.bind_ubo("world_data", resources.world_buf);
-      outline_ps.bind_texture("objectIdBuffer", &resources.object_id_tx);
-      outline_ps.draw_procedural(GPU_PRIM_TRIS, 1, 3);
-
-      Framebuffer fb = Framebuffer("Workbench.Outline");
-      fb.ensure(GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(resources.color_tx));
-      fb.bind();
-      manager.submit(outline_ps);
-    }
-
     // volume_ps.draw_prepass(manager, view, resources.depth_tx);
 
+    outline_ps.draw(manager, view, resources, resolution);
     dof_ps.draw(manager, view, resources, resolution);
     anti_aliasing_ps.draw(manager, view, resources, resolution, depth_tx, color_tx);
 
diff --git a/source/blender/draw/engines/workbench/workbench_private.hh b/source/blender/draw/engines/workbench/workbench_private.hh
index 74d3afac1de..fca158b4eec 100644
--- a/source/blender/draw/engines/workbench/workbench_private.hh
+++ b/source/blender/draw/engines/workbench/workbench_private.hh
@@ -236,8 +236,21 @@ class TransparentDepthPass {
   bool is_empty() const;
 };
 
+class OutlinePass {
+  bool enabled_;
+
+  PassSimple ps_ = PassSimple("Workbench.Outline");
+  GPUShader *sh_;
+  Framebuffer fb_ = Framebuffer("Workbench.Outline");
+
+ public:
+  void init(const SceneState &scene_state);
+  void sync(SceneResources &resources);
+  void draw(Manager &manager, View &view, SceneResources &resources, int2 resolution);
+};
+
 class DofPass {
-  bool enabled_ = false;
+  bool enabled_;
 
   static const int kernel_radius_ = 3;
   static const int samples_len_ = (kernel_radius_ * 2 + 1) * (kernel_radius_ * 2 + 1);



More information about the Bf-blender-cvs mailing list