Overlay-Next: Xray Fade

Straight-forward port.

Rel #102179

Pull Request: https://projects.blender.org/blender/blender/pulls/126967
This commit is contained in:
Clément Foucault
2024-08-30 17:33:28 +02:00
committed by Clément Foucault
parent 3386761411
commit e22b931cfb
5 changed files with 71 additions and 2 deletions

View File

@@ -312,6 +312,7 @@ set(SRC
engines/overlay/overlay_next_relation.hh
engines/overlay/overlay_next_speaker.hh
engines/overlay/overlay_next_wireframe.hh
engines/overlay/overlay_next_xray_fade.hh
engines/overlay/overlay_private.hh
engines/select/select_defines.hh
engines/select/select_engine.hh

View File

@@ -113,6 +113,7 @@ void Instance::begin_sync()
grid.begin_sync(resources, state, view);
anti_aliasing.begin_sync(resources);
xray_fade.begin_sync(resources, state);
}
void Instance::object_sync(ObjectRef &ob_ref, Manager &manager)
@@ -261,7 +262,7 @@ void Instance::draw(Manager &manager)
if (state.xray_enabled) {
/* For X-ray we render the scene to a separate depth buffer. */
resources.xray_depth_tx.acquire(render_size, GPU_DEPTH_COMPONENT24);
resources.xray_depth_tx.acquire(render_size, GPU_DEPTH24_STENCIL8);
resources.depth_target_tx.wrap(resources.xray_depth_tx);
}
else {
@@ -270,7 +271,7 @@ void Instance::draw(Manager &manager)
/* TODO(fclem): Remove mandatory allocation. */
if (!resources.depth_in_front_tx.is_valid()) {
resources.depth_in_front_alloc_tx.acquire(render_size, GPU_DEPTH_COMPONENT24);
resources.depth_in_front_alloc_tx.acquire(render_size, GPU_DEPTH24_STENCIL8);
resources.depth_in_front_tx.wrap(resources.depth_in_front_alloc_tx);
}
@@ -356,6 +357,8 @@ void Instance::draw(Manager &manager)
draw_layer(regular, resources.overlay_line_fb);
xray_fade.draw(manager);
auto draw_layer_color_only = [&](OverlayLayer &layer, Framebuffer &framebuffer) {
layer.light_probes.draw_color_only(framebuffer, manager, view);
layer.meshes.draw_color_only(framebuffer, manager, view);

View File

@@ -31,6 +31,7 @@
#include "overlay_next_relation.hh"
#include "overlay_next_speaker.hh"
#include "overlay_next_wireframe.hh"
#include "overlay_next_xray_fade.hh"
namespace blender::draw::overlay {
@@ -80,6 +81,7 @@ class Instance {
Grid grid;
AntiAliasing anti_aliasing;
XrayFade xray_fade;
Instance(const SelectionType selection_type) : selection_type_(selection_type){};

View File

@@ -194,6 +194,7 @@ class ShaderModule {
ShaderPtr outline_prepass_pointcloud;
ShaderPtr outline_prepass_gpencil;
ShaderPtr outline_detect = shader("overlay_outline_detect");
ShaderPtr xray_fade = shader("overlay_xray_fade");
/** Selectable Shaders */
ShaderPtr armature_sphere_outline;

View File

@@ -0,0 +1,62 @@
/* SPDX-FileCopyrightText: 2019 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup draw_engine
*
* Overlay Xray Fade:
*
* Full-screen pass that dim overlays that are behind scene geometry.
* This allows to have a nice transition between opaque (or 100% xray) and wire-frame only mode.
* This is only available if Xray mode is enabled or in wire-frame mode.
*/
#pragma once
#include "overlay_next_private.hh"
namespace blender::draw::overlay {
class XrayFade {
private:
PassSimple xray_fade_ps_ = {"XrayFade"};
bool enabled_ = false;
public:
void begin_sync(Resources &res, State &state)
{
enabled_ = state.xray_enabled && (state.xray_opacity > 0.0f) &&
(res.selection_type == SelectionType::DISABLED);
if (!enabled_) {
return;
}
{
PassSimple &pass = xray_fade_ps_;
pass.init();
pass.state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_MUL);
pass.framebuffer_set(&res.overlay_color_only_fb);
pass.shader_set(res.shaders.xray_fade.get());
/* TODO(fclem): Confusing. The meaning of xray depth texture changed between legacy engine
* and overlay next. To be renamed after shaders are not shared anymore. */
pass.bind_texture("depthTex", &res.xray_depth_tx);
pass.bind_texture("xrayDepthTex", &res.depth_tx);
pass.push_constant("opacity", 1.0f - state.xray_opacity);
pass.draw_procedural(GPU_PRIM_TRIS, 1, 3);
}
}
void draw(Manager &manager)
{
if (!enabled_) {
return;
}
manager.submit(xray_fade_ps_);
}
};
} // namespace blender::draw::overlay