diff --git a/res/content/base/scripts/hud.lua b/res/content/base/scripts/hud.lua index 296fcc65..b1c4b130 100644 --- a/res/content/base/scripts/hud.lua +++ b/res/content/base/scripts/hud.lua @@ -29,7 +29,9 @@ function on_hud_open() note = gfx.text3d.new({0.5, 99.5, 0.0015}, "Segmentation fault", { color={0, 0, 0, 1}, - display="projected" + display="projected", + perspective=1.0, + scale=2.0 }) end diff --git a/src/graphics/render/TextsRenderer.cpp b/src/graphics/render/TextsRenderer.cpp index 1fd4f727..ad2ac987 100644 --- a/src/graphics/render/TextsRenderer.cpp +++ b/src/graphics/render/TextsRenderer.cpp @@ -68,12 +68,24 @@ void TextsRenderer::renderNote( return; } } else { + float scale = 1.0f; + if (glm::abs(preset.perspective) > 0.0001f) { + float scale2 = scale / + (glm::distance(camera.position, pos) * + util::sqr(camera.zoom) * + glm::sqrt(glm::tan(camera.getFov() * 0.5f))); + scale = scale2 * preset.perspective + + scale * (1.0f - preset.perspective); + } auto projpos = camera.getProjView() * glm::vec4(pos, 1.0f); pos = projpos; + if (pos.z < 0.0f) { + return; + } pos /= pos.z; pos.z = 0; - xvec = {2.0f/Window::width, 0, 0}; - yvec = {0, 2.0f/Window::height, 0}; + xvec = {2.0f/Window::width*scale, 0, 0}; + yvec = {0, 2.0f/Window::height*scale, 0}; } auto color = preset.color; batch.setColor(glm::vec4(color.r, color.g, color.b, color.a * opacity)); diff --git a/src/presets/NotePreset.cpp b/src/presets/NotePreset.cpp index 22217bb0..e03fd741 100644 --- a/src/presets/NotePreset.cpp +++ b/src/presets/NotePreset.cpp @@ -36,6 +36,7 @@ dv::value NotePreset::serialize() const { {"scale", scale}, {"render_distance", renderDistance}, {"xray_opacity", xrayOpacity}, + {"perspective", perspective}, }); } @@ -49,4 +50,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); + src.at("perspective").get(perspective); } diff --git a/src/presets/NotePreset.hpp b/src/presets/NotePreset.hpp index b204fc3b..c2a1a88b 100644 --- a/src/presets/NotePreset.hpp +++ b/src/presets/NotePreset.hpp @@ -22,6 +22,7 @@ struct NotePreset : public Serializable { float scale = 1.0f; float renderDistance = 10.0f; float xrayOpacity = 0.0f; + float perspective = 0.0f; dv::value serialize() const override; void deserialize(const dv::value& src) override; diff --git a/src/window/Camera.cpp b/src/window/Camera.cpp index def9ff7c..f3780d0f 100644 --- a/src/window/Camera.cpp +++ b/src/window/Camera.cpp @@ -66,3 +66,7 @@ void Camera::setFov(float fov) { float Camera::getFov() const { return fov; } + +float Camera::getAspectRatio() const { + return aspect; +} diff --git a/src/window/Camera.hpp b/src/window/Camera.hpp index 1c2ecd60..7d80cf8f 100644 --- a/src/window/Camera.hpp +++ b/src/window/Camera.hpp @@ -35,4 +35,6 @@ public: void setFov(float fov); float getFov() const; + + float getAspectRatio() const; };