From dc29f65fa83c5a4fd16d069b73d98bbd9950e1dd Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 15 Apr 2026 23:26:08 +0300 Subject: [PATCH 1/3] add entity to TextNote --- src/graphics/render/TextNote.cpp | 8 ++++++++ src/graphics/render/TextNote.hpp | 4 ++++ src/graphics/render/TextsRenderer.cpp | 17 +++++++++++++++-- src/graphics/render/TextsRenderer.hpp | 9 ++++++++- src/graphics/render/WorldRenderer.cpp | 6 ++++-- 5 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/graphics/render/TextNote.cpp b/src/graphics/render/TextNote.cpp index 127414c37..7c4797fd3 100644 --- a/src/graphics/render/TextNote.cpp +++ b/src/graphics/render/TextNote.cpp @@ -10,6 +10,14 @@ void TextNote::setText(std::wstring_view text) { this->text = text; } +void TextNote::setEntity(entityid_t eid) { + this->entity = eid; +} + +entityid_t TextNote::getEntity() const { + return entity; +} + const std::wstring& TextNote::getText() const { return text; } diff --git a/src/graphics/render/TextNote.hpp b/src/graphics/render/TextNote.hpp index 65a26ac17..0fc8f4afd 100644 --- a/src/graphics/render/TextNote.hpp +++ b/src/graphics/render/TextNote.hpp @@ -1,5 +1,6 @@ #pragma once +#include "constants.hpp" #include "presets/NotePreset.hpp" /// @brief 3D text instance @@ -7,6 +8,7 @@ class TextNote { std::wstring text; NotePreset preset; glm::vec3 position; + entityid_t entity = ENTITY_NONE; glm::vec3 xAxis {1, 0, 0}; glm::vec3 yAxis {0, 1, 0}; @@ -14,6 +16,8 @@ public: TextNote(std::wstring text, NotePreset preset, glm::vec3 position); void setText(std::wstring_view text); + void setEntity(entityid_t eid); + entityid_t getEntity() const; const std::wstring& getText() const; diff --git a/src/graphics/render/TextsRenderer.cpp b/src/graphics/render/TextsRenderer.cpp index ed822fc9f..ac93d1e43 100644 --- a/src/graphics/render/TextsRenderer.cpp +++ b/src/graphics/render/TextsRenderer.cpp @@ -10,12 +10,18 @@ #include "graphics/core/Shader.hpp" #include "graphics/core/DrawContext.hpp" #include "presets/NotePreset.hpp" +#include "world/Level.hpp" +#include "objects/Entities.hpp" +#include "objects/Entity.hpp" #include "constants.hpp" TextsRenderer::TextsRenderer( - Batch3D& batch, const Assets& assets, const Frustum& frustum + const Level& level, + Batch3D& batch, + const Assets& assets, + const Frustum& frustum ) - : batch(batch), assets(assets), frustum(frustum) { + : level(level), batch(batch), assets(assets), frustum(frustum) { } void TextsRenderer::renderNote( @@ -31,6 +37,13 @@ void TextsRenderer::renderNote( const auto& preset = note.getPreset(); auto pos = note.getPosition(); + entityid_t eid = note.getEntity(); + if (eid != ENTITY_NONE) { + if (auto entity = level.entities->get(eid)) { + pos += entity->getTransform().displayPos; + } + } + if (util::distance2(pos, camera.position) > util::sqr(preset.renderDistance / camera.zoom)) { return; diff --git a/src/graphics/render/TextsRenderer.hpp b/src/graphics/render/TextsRenderer.hpp index 629bc3cd2..77af2581a 100644 --- a/src/graphics/render/TextsRenderer.hpp +++ b/src/graphics/render/TextsRenderer.hpp @@ -12,8 +12,10 @@ class Batch3D; class Frustum; class TextNote; struct EngineSettings; +class Level; class TextsRenderer { + const Level& level; Batch3D& batch; const Assets& assets; const Frustum& frustum; @@ -31,7 +33,12 @@ class TextsRenderer { bool projected ); public: - TextsRenderer(Batch3D& batch, const Assets& assets, const Frustum& frustum); + TextsRenderer( + const Level& level, + Batch3D& batch, + const Assets& assets, + const Frustum& frustum + ); void render( const DrawContext& context, diff --git a/src/graphics/render/WorldRenderer.cpp b/src/graphics/render/WorldRenderer.cpp index 9f173eb38..2e150e1f7 100644 --- a/src/graphics/render/WorldRenderer.cpp +++ b/src/graphics/render/WorldRenderer.cpp @@ -91,9 +91,11 @@ WorldRenderer::WorldRenderer( assets, level, *player.chunks, &engine.getSettings().graphics )), particles(std::make_unique( - assets, level, *player.chunks, engine.getSettings().graphics + assets, level, *player.chunks, engine.getSettings().graphics + )), + texts(std::make_unique( + level, *batch3d, assets, *frustumCulling )), - texts(std::make_unique(*batch3d, assets, *frustumCulling)), blockWraps(std::make_unique( assets, level.content, *player.chunks )) { From 6426fff26e7a6269a0ef10a0e836ed6ad2a2a844 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 15 Apr 2026 23:29:36 +0300 Subject: [PATCH 2/3] add gfx.text3d.get_entity, set_entity --- src/logic/scripting/lua/libs/libtext3d.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/logic/scripting/lua/libs/libtext3d.cpp b/src/logic/scripting/lua/libs/libtext3d.cpp index 310f5d78e..0c3957cce 100644 --- a/src/logic/scripting/lua/libs/libtext3d.cpp +++ b/src/logic/scripting/lua/libs/libtext3d.cpp @@ -95,6 +95,20 @@ static int l_set_rotation(lua::State* L) { return 0; } +static int l_get_entity(lua::State* L) { + if (auto note = renderer->texts->get(lua::tointeger(L, 1))) { + return lua::pushinteger(L, note->getEntity()); + } + return 0; +} + +static int l_set_entity(lua::State* L) { + if (auto note = renderer->texts->get(lua::tointeger(L, 1))) { + note->setEntity(lua::touinteger(L, 2)); + } + return 0; +} + const luaL_Reg text3dlib[] = { {"show", wrap_hud}, {"hide", wrap_hud}, @@ -108,5 +122,7 @@ const luaL_Reg text3dlib[] = { {"set_axis_y", wrap_hud}, {"set_rotation", wrap_hud}, {"update_settings", wrap_hud}, + {"get_entity", wrap_hud}, + {"set_entity", wrap_hud}, {nullptr, nullptr} }; From 25cc16fdb9f8c9d3e4afc7d51a6e09d24273c89c Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 15 Apr 2026 23:38:41 +0300 Subject: [PATCH 3/3] update doc/*/3d-text.md --- doc/en/3d-text.md | 8 ++++++++ doc/ru/3d-text.md | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/doc/en/3d-text.md b/doc/en/3d-text.md index 6e957a37e..b0c9fd1f6 100644 --- a/doc/en/3d-text.md +++ b/doc/en/3d-text.md @@ -79,6 +79,14 @@ gfx.text3d.set_rotation(id: int, rotation: mat4) Sets the text rotation (Sets the rotated vectors X,Y). +```lua +gfx.text3d.get_entity(id: int) -> int +gfx.text3d.set_entity(id: int, entity: int) +``` + +Getter and setter for the entity to which the 3D text position is bound. +The position set via `gfx.text3d.set_pos` is then relative to the entity's position. + ```lua gfx.text3d.update_settings(id: int, preset: table) ``` diff --git a/doc/ru/3d-text.md b/doc/ru/3d-text.md index a53075ca2..c2d209434 100644 --- a/doc/ru/3d-text.md +++ b/doc/ru/3d-text.md @@ -79,6 +79,14 @@ gfx.text3d.set_rotation(id: int, rotation: mat4) Устанавливает вращение текста (Устанавливает повернутые вектора X,Y). +```lua +gfx.text3d.get_entity(id: int) -> int +gfx.text3d.set_entity(id: int, entity: int) +``` + +Геттер и сеттер сущности, к позиции которой привязан 3D текст. +Позиция, устанавливаемая через `gfx.text3d.set_pos`, в таком случае, относительна позиции сущности. + ```lua gfx.text3d.update_settings(id: int, preset: table) ```