From db565d23a799814df2f0df786660342ec9a99d63 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 13 Nov 2024 11:46:39 +0300 Subject: [PATCH] add TextNote --- src/graphics/render/TextNote.cpp | 19 +++++++ src/graphics/render/TextNote.hpp | 18 ++++++ src/graphics/render/WorldRenderer.cpp | 80 ++++++++++++++++++++------- src/graphics/render/WorldRenderer.hpp | 10 ++++ 4 files changed, 108 insertions(+), 19 deletions(-) create mode 100644 src/graphics/render/TextNote.cpp create mode 100644 src/graphics/render/TextNote.hpp diff --git a/src/graphics/render/TextNote.cpp b/src/graphics/render/TextNote.cpp new file mode 100644 index 00000000..f8f424cf --- /dev/null +++ b/src/graphics/render/TextNote.cpp @@ -0,0 +1,19 @@ +#include "TextNote.hpp" + +TextNote::TextNote(std::wstring text, NotePreset preset, glm::vec3 position) + : text(std::move(text)), + preset(std::move(preset)), + position(std::move(position)) { +} + +const std::wstring& TextNote::getText() const { + return text; +} + +const NotePreset& TextNote::getPreset() const { + return preset; +} + +const glm::vec3& TextNote::getPosition() const { + return position; +} diff --git a/src/graphics/render/TextNote.hpp b/src/graphics/render/TextNote.hpp new file mode 100644 index 00000000..a5822005 --- /dev/null +++ b/src/graphics/render/TextNote.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "presets/NotePreset.hpp" + +/// @brief 3D text instance +class TextNote { + std::wstring text; + NotePreset preset; + glm::vec3 position; +public: + TextNote(std::wstring text, NotePreset preset, glm::vec3 position); + + const std::wstring& getText() const; + + const NotePreset& getPreset() const; + + const glm::vec3& getPosition() const; +}; diff --git a/src/graphics/render/WorldRenderer.cpp b/src/graphics/render/WorldRenderer.cpp index 1f5864bc..76df02d6 100644 --- a/src/graphics/render/WorldRenderer.cpp +++ b/src/graphics/render/WorldRenderer.cpp @@ -32,6 +32,7 @@ #include "world/Level.hpp" #include "world/LevelEvents.hpp" #include "world/World.hpp" +#include "presets/NotePreset.hpp" #include "graphics/commons/Model.hpp" #include "graphics/core/Atlas.hpp" #include "graphics/core/Batch3D.hpp" @@ -47,6 +48,7 @@ #include "ModelBatch.hpp" #include "Skybox.hpp" #include "Emitter.hpp" +#include "TextNote.hpp" bool WorldRenderer::showChunkBorders = false; bool WorldRenderer::showEntitiesDebug = false; @@ -162,9 +164,14 @@ void WorldRenderer::drawChunks( if (culling) { frustumCulling->update(camera.getProjView()); } + chunks->visible = 0; - for (size_t i = 0; i < indices.size(); i++) { - chunks->visible += drawChunk(indices[i].index, camera, shader, culling); + if (GLEW_ARB_multi_draw_indirect && false) { + // TODO: implement Multi Draw Indirect chunks draw + } else { + for (size_t i = 0; i < indices.size(); i++) { + chunks->visible += drawChunk(indices[i].index, camera, shader, culling); + } } } @@ -412,36 +419,71 @@ void WorldRenderer::renderHands( skybox->unbind(); } +void WorldRenderer::renderText( + const TextNote& note, + const DrawContext& context, + const Assets& assets, + const Camera& camera, + const EngineSettings& settings, + bool hudVisible +) { + auto& font = assets.require("normal"); + + const auto& text = note.getText(); + const auto& preset = note.getPreset(); + const auto& pos = note.getPosition(); + + glm::vec3 xvec {1, 0, 0}; + glm::vec3 yvec {0, 1, 0}; + + if (preset.displayMode == NoteDisplayMode::Y_FREE_BILLBOARD || + preset.displayMode == NoteDisplayMode::XY_FREE_BILLBOARD) { + xvec = camera.position - pos; + xvec.y = 0; + std::swap(xvec.x, xvec.z); + xvec.z *= -1; + xvec = glm::normalize(xvec); + if (preset.displayMode == NoteDisplayMode::XY_FREE_BILLBOARD) { + yvec = camera.up; + } + } + + float ppbx = 100; + float ppby = 100; + font.draw( + *batch3d, + text, + pos - xvec * (font.calcWidth(text, text.length()) * 0.5f) / ppbx, + xvec / ppbx, + yvec / ppby + ); +} + void WorldRenderer::renderTexts( const DrawContext& context, const Camera& camera, const EngineSettings& settings, bool hudVisible ) { + NotePreset preset; + preset.displayMode = NoteDisplayMode::Y_FREE_BILLBOARD; + + TextNote note( + L"Segmentation fault (core dumped)", + std::move(preset), + glm::vec3(0, 100, 0) + ); + const auto& assets = *engine->getAssets(); auto& shader = assets.require("ui3d"); - auto& font = assets.require("normal"); + shader.use(); shader.uniformMatrix("u_projview", camera.getProjView()); shader.uniformMatrix("u_apply", glm::mat4(1.0f)); batch3d->begin(); - std::wstring string = L"Segmentation fault (core dumped)"; - glm::vec3 pos(0, 100, 0); - auto zvec = camera.position - pos; - zvec.y = 0; - std::swap(zvec.x, zvec.z); - zvec.z *= -1; - zvec = glm::normalize(zvec); + + renderText(note, context, assets, camera, settings, hudVisible); - float ppbx = 100; - float ppby = 100; - font.draw( - *batch3d, - string, - pos - zvec * (font.calcWidth(string, string.length()) * 0.5f) / ppbx, - zvec / ppbx, - camera.up / ppby - ); batch3d->flush(); } diff --git a/src/graphics/render/WorldRenderer.hpp b/src/graphics/render/WorldRenderer.hpp index 7799e457..0b0eb171 100644 --- a/src/graphics/render/WorldRenderer.hpp +++ b/src/graphics/render/WorldRenderer.hpp @@ -28,6 +28,7 @@ class DrawContext; class ModelBatch; class Assets; class Emitter; +class TextNote; struct EngineSettings; namespace model { @@ -92,6 +93,15 @@ class WorldRenderer { float fogFactor ); + void renderText( + const TextNote& note, + const DrawContext& context, + const Assets& assets, + const Camera& camera, + const EngineSettings& settings, + bool hudVisible + ); + void renderTexts( const DrawContext& context, const Camera& camera,