[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