From ef644ca56d5affe45c2dbe1c4d1233a3e6b5d1d5 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 15 Nov 2024 00:38:41 +0300 Subject: [PATCH] add 'xray_opacity' NotePreset property --- res/content/base/scripts/hud.lua | 3 ++- src/graphics/render/TextsRenderer.cpp | 24 +++++++++++++++--------- src/graphics/render/TextsRenderer.hpp | 7 ++++--- src/graphics/render/WorldRenderer.cpp | 6 +++++- src/presets/NotePreset.cpp | 4 +++- src/presets/NotePreset.hpp | 1 + 6 files changed, 30 insertions(+), 15 deletions(-) diff --git a/res/content/base/scripts/hud.lua b/res/content/base/scripts/hud.lua index f00fa120..b8e4ef1f 100644 --- a/res/content/base/scripts/hud.lua +++ b/res/content/base/scripts/hud.lua @@ -30,7 +30,8 @@ function on_hud_open() note = gfx.text3d.new({0.5, 99.5, 0.0015}, "Segmentation fault", { scale=0.005, color={0, 0, 0, 1}, - displayMode="static_billboard" + display_mode="static_billboard", + xray_opacity=0.2 }) end diff --git a/src/graphics/render/TextsRenderer.cpp b/src/graphics/render/TextsRenderer.cpp index 95966560..1a331938 100644 --- a/src/graphics/render/TextsRenderer.cpp +++ b/src/graphics/render/TextsRenderer.cpp @@ -16,12 +16,13 @@ TextsRenderer::TextsRenderer( : batch(batch), assets(assets), frustum(frustum) { } -void TextsRenderer::renderText( +void TextsRenderer::renderNote( const TextNote& note, const DrawContext& context, const Camera& camera, const EngineSettings& settings, - bool hudVisible + bool hudVisible, + bool frontLayer ) { const auto& text = note.getText(); const auto& preset = note.getPreset(); @@ -31,12 +32,18 @@ void TextsRenderer::renderText( util::sqr(preset.renderDistance / camera.zoom)) { return; } - // Projected notes are displayed on the front layer only if (preset.displayMode == NoteDisplayMode::PROJECTED) { return; } - auto& font = assets.require("normal"); + float opacity = 1.0f; + if (frontLayer) { + if (preset.xrayOpacity <= 0.0001f) { + return; + } + opacity = preset.xrayOpacity; + } + const auto& font = assets.require("normal"); glm::vec3 xvec {1, 0, 0}; glm::vec3 yvec {0, 1, 0}; @@ -53,15 +60,14 @@ void TextsRenderer::renderText( yvec = camera.up; } } - if (preset.displayMode != NoteDisplayMode::PROJECTED) { if (!frustum.isBoxVisible(pos - xvec * (width * 0.5f), pos + xvec * (width * 0.5f))) { return; } } - - batch.setColor(preset.color); + auto color = preset.color; + batch.setColor(glm::vec4(color.r, color.g, color.b, color.a * opacity)); font.draw( batch, text, @@ -71,7 +77,7 @@ void TextsRenderer::renderText( ); } -void TextsRenderer::renderTexts( +void TextsRenderer::render( const DrawContext& context, const Camera& camera, const EngineSettings& settings, @@ -85,7 +91,7 @@ void TextsRenderer::renderTexts( shader.uniformMatrix("u_apply", glm::mat4(1.0f)); batch.begin(); for (const auto& [id, note] : notes) { - renderText(*note, context, camera, settings, hudVisible); + renderNote(*note, context, camera, settings, hudVisible, frontLayer); } batch.flush(); } diff --git a/src/graphics/render/TextsRenderer.hpp b/src/graphics/render/TextsRenderer.hpp index 5faf7e9d..f5579dda 100644 --- a/src/graphics/render/TextsRenderer.hpp +++ b/src/graphics/render/TextsRenderer.hpp @@ -21,17 +21,18 @@ class TextsRenderer { std::unordered_map> notes; u64id_t nextNote = 1; - void renderText( + void renderNote( const TextNote& note, const DrawContext& context, const Camera& camera, const EngineSettings& settings, - bool hudVisible + bool hudVisible, + bool frontLayer ); public: TextsRenderer(Batch3D& batch, const Assets& assets, const Frustum& frustum); - void renderTexts( + void render( const DrawContext& context, const Camera& camera, const EngineSettings& settings, diff --git a/src/graphics/render/WorldRenderer.cpp b/src/graphics/render/WorldRenderer.cpp index bf0f13d7..1ad16a62 100644 --- a/src/graphics/render/WorldRenderer.cpp +++ b/src/graphics/render/WorldRenderer.cpp @@ -139,7 +139,7 @@ void WorldRenderer::renderLevel( bool pause, bool hudVisible ) { - texts->renderTexts(ctx, camera, settings, hudVisible, false); + texts->render(ctx, camera, settings, hudVisible, false); bool culling = engine->getSettings().graphics.frustumCulling.get(); float fogFactor = @@ -332,6 +332,10 @@ void WorldRenderer::draw( } } } + { + DrawContext ctx = wctx.sub(); + texts->render(ctx, camera, settings, hudVisible, true); + } renderBlockOverlay(wctx); } diff --git a/src/presets/NotePreset.cpp b/src/presets/NotePreset.cpp index 58cffcd1..22217bb0 100644 --- a/src/presets/NotePreset.cpp +++ b/src/presets/NotePreset.cpp @@ -34,7 +34,8 @@ dv::value NotePreset::serialize() const { {"display", to_string(displayMode)}, {"color", dv::to_value(color)}, {"scale", scale}, - {"render_distance", renderDistance} + {"render_distance", renderDistance}, + {"xray_opacity", xrayOpacity}, }); } @@ -47,4 +48,5 @@ void NotePreset::deserialize(const dv::value& src) { } src.at("scale").get(scale); src.at("render_distance").get(renderDistance); + src.at("xray_opacity").get(xrayOpacity); } diff --git a/src/presets/NotePreset.hpp b/src/presets/NotePreset.hpp index 4ae78b5c..b204fc3b 100644 --- a/src/presets/NotePreset.hpp +++ b/src/presets/NotePreset.hpp @@ -21,6 +21,7 @@ struct NotePreset : public Serializable { glm::vec4 color {1.0f}; float scale = 1.0f; float renderDistance = 10.0f; + float xrayOpacity = 0.0f; dv::value serialize() const override; void deserialize(const dv::value& src) override;