Overlay-Next: Xray Fade
Straight-forward port. Rel #102179 Pull Request: https://projects.blender.org/blender/blender/pulls/126967
This commit is contained in:
committed by
Clément Foucault
parent
3386761411
commit
e22b931cfb
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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){};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user