diff --git a/res/content/base/scripts/hud.lua b/res/content/base/scripts/hud.lua index c33cba60..b53dbbd7 100644 --- a/res/content/base/scripts/hud.lua +++ b/res/content/base/scripts/hud.lua @@ -1,6 +1,8 @@ local DROP_FORCE = 8 local DROP_INIT_VEL = {0, 3, 0} +local textid + function on_hud_open() input.add_callback("player.drop", function () if hud.is_paused() or hud.is_inventory_open() then @@ -25,9 +27,14 @@ function on_hud_open() drop.rigidbody:set_vel(velocity) end) - gfx.text3d.show({0.5, 99.5, 0.0015}, "Segmentation fault", { + textid = gfx.text3d.show({0.5, 99.5, 0.0015}, "Segmentation fault", { scale=0.005, color={0, 0, 0, 1}, displayMode="static_billboard" }) end + +function on_hud_render() + local pos = gfx.text3d.get_pos(textid) + gfx.text3d.set_pos(textid, {pos[1], pos[2]+time.delta(), pos[3]}) +end diff --git a/src/graphics/render/TextNote.cpp b/src/graphics/render/TextNote.cpp index f8f424cf..cdce1549 100644 --- a/src/graphics/render/TextNote.cpp +++ b/src/graphics/render/TextNote.cpp @@ -6,6 +6,10 @@ TextNote::TextNote(std::wstring text, NotePreset preset, glm::vec3 position) position(std::move(position)) { } +void TextNote::setText(std::wstring_view text) { + this->text = text; +} + const std::wstring& TextNote::getText() const { return text; } @@ -14,6 +18,10 @@ const NotePreset& TextNote::getPreset() const { return preset; } +void TextNote::setPosition(const glm::vec3& position) { + this->position = position; +} + const glm::vec3& TextNote::getPosition() const { return position; } diff --git a/src/graphics/render/TextNote.hpp b/src/graphics/render/TextNote.hpp index a5822005..d7982fce 100644 --- a/src/graphics/render/TextNote.hpp +++ b/src/graphics/render/TextNote.hpp @@ -10,9 +10,13 @@ class TextNote { public: TextNote(std::wstring text, NotePreset preset, glm::vec3 position); + void setText(std::wstring_view text); + const std::wstring& getText() const; const NotePreset& getPreset() const; + void setPosition(const glm::vec3& position); + const glm::vec3& getPosition() const; }; diff --git a/src/graphics/render/TextsRenderer.cpp b/src/graphics/render/TextsRenderer.cpp index bc6d449a..95966560 100644 --- a/src/graphics/render/TextsRenderer.cpp +++ b/src/graphics/render/TextsRenderer.cpp @@ -96,6 +96,14 @@ u64id_t TextsRenderer::add(std::unique_ptr note) { return uid; } +TextNote* TextsRenderer::get(u64id_t id) const { + const auto& found = notes.find(id); + if (found == notes.end()) { + return nullptr; + } + return found->second.get(); +} + void TextsRenderer::remove(u64id_t id) { notes.erase(id); } diff --git a/src/graphics/render/TextsRenderer.hpp b/src/graphics/render/TextsRenderer.hpp index 66b11264..5faf7e9d 100644 --- a/src/graphics/render/TextsRenderer.hpp +++ b/src/graphics/render/TextsRenderer.hpp @@ -41,5 +41,7 @@ public: u64id_t add(std::unique_ptr note); + TextNote* get(u64id_t id) const; + void remove(u64id_t id); }; diff --git a/src/logic/scripting/lua/libs/libtext3d.cpp b/src/logic/scripting/lua/libs/libtext3d.cpp index 355cbc54..e29f4e5b 100644 --- a/src/logic/scripting/lua/libs/libtext3d.cpp +++ b/src/logic/scripting/lua/libs/libtext3d.cpp @@ -28,8 +28,40 @@ static int l_hide(lua::State* L) { return 0; } +static int l_get_text(lua::State* L) { + if (auto note = renderer->texts->get(lua::tointeger(L, 1))) { + return lua::pushwstring(L, note->getText()); + } + return 0; +} + +static int l_set_text(lua::State* L) { + if (auto note = renderer->texts->get(lua::tointeger(L, 1))) { + note->setText(lua::require_wstring(L, 2)); + } + return 0; +} + +static int l_get_pos(lua::State* L) { + if (auto note = renderer->texts->get(lua::tointeger(L, 1))) { + return lua::pushvec(L, note->getPosition()); + } + return 0; +} + +static int l_set_pos(lua::State* L) { + if (auto note = renderer->texts->get(lua::tointeger(L, 1))) { + note->setPosition(lua::tovec3(L, 2)); + } + return 0; +} + const luaL_Reg text3dlib[] = { {"show", lua::wrap}, {"hide", lua::wrap}, + {"get_text", lua::wrap}, + {"set_text", lua::wrap}, + {"get_pos", lua::wrap}, + {"set_pos", lua::wrap}, {NULL, NULL} };