From 3de2a41092de93b27559c34f5199720a4fe5d989 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 26 Jul 2026 16:39:54 +0300 Subject: [PATCH 1/3] add 3d text 'font' property --- src/graphics/core/Font.cpp | 4 +++- src/graphics/render/TextsRenderer.cpp | 6 +++++- src/presets/NotePreset.cpp | 2 ++ src/presets/NotePreset.hpp | 1 + 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/graphics/core/Font.cpp b/src/graphics/core/Font.cpp index 7aaa67e80..9f1f0a434 100644 --- a/src/graphics/core/Font.cpp +++ b/src/graphics/core/Font.cpp @@ -162,6 +162,8 @@ static inline void draw_text( const FontStylesScheme* styles, size_t styleMapOffset ) { + bool is3d = std::is_same(); + static FontStylesScheme defStyles {{{}}, {0}}; if (styles == nullptr) { @@ -200,7 +202,7 @@ static inline void draw_text( if (charpage == page){ batch.texture(font.getPage(charpage)); draw_glyph( - batch, pos, glm::vec2(x, y - yOffset / static_cast(font.getLineHeight())), c, right, up, interval, style + batch, pos, glm::vec2(x, y - yOffset * (is3d ? -1 : 1) / static_cast(font.getLineHeight())), c, right, up, interval, style ); } else if (charpage > page && charpage < next){ diff --git a/src/graphics/render/TextsRenderer.cpp b/src/graphics/render/TextsRenderer.cpp index ac93d1e43..b5965dcc4 100644 --- a/src/graphics/render/TextsRenderer.cpp +++ b/src/graphics/render/TextsRenderer.cpp @@ -58,7 +58,10 @@ void TextsRenderer::renderNote( } opacity = preset.xrayOpacity; } - auto& font = assets.require(FONT_DEFAULT); + + auto specifiedFont = assets.get(preset.font); + auto& font = + specifiedFont ? *specifiedFont : assets.require(FONT_DEFAULT); glm::vec3 xvec = note.getAxisX(); glm::vec3 yvec = note.getAxisY(); @@ -118,6 +121,7 @@ void TextsRenderer::renderNote( } auto color = preset.color; batch.setColor(glm::vec4(color.r, color.g, color.b, color.a * opacity)); + font.draw( batch, text, diff --git a/src/presets/NotePreset.cpp b/src/presets/NotePreset.cpp index 59865e80a..a1d68994d 100644 --- a/src/presets/NotePreset.cpp +++ b/src/presets/NotePreset.cpp @@ -13,6 +13,7 @@ dv::value NotePreset::serialize() const { {"render_distance", renderDistance}, {"xray_opacity", xrayOpacity}, {"perspective", perspective}, + {"font", font}, }); } @@ -27,4 +28,5 @@ void NotePreset::deserialize(const dv::value& src) { src.at("render_distance").get(renderDistance); src.at("xray_opacity").get(xrayOpacity); src.at("perspective").get(perspective); + src.at("font").get(font); } diff --git a/src/presets/NotePreset.hpp b/src/presets/NotePreset.hpp index fecdaf18d..e8d030c78 100644 --- a/src/presets/NotePreset.hpp +++ b/src/presets/NotePreset.hpp @@ -28,6 +28,7 @@ struct NotePreset : public Serializable { float renderDistance = 32.0f; float xrayOpacity = 0.0f; float perspective = 1.0f; + std::string font {}; dv::value serialize() const override; void deserialize(const dv::value& src) override; From 4837e1de027e738bd59c4ba9c91b654e5d866f9a Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 26 Jul 2026 17:46:48 +0300 Subject: [PATCH 2/3] fix projected 3d text for non-monospace fonts --- src/graphics/core/Font.cpp | 17 +++++++++++++++-- src/graphics/render/TextsRenderer.cpp | 5 ++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/graphics/core/Font.cpp b/src/graphics/core/Font.cpp index 9f1f0a434..4843387e4 100644 --- a/src/graphics/core/Font.cpp +++ b/src/graphics/core/Font.cpp @@ -196,13 +196,26 @@ static inline void draw_text( float advance = baseAdvance; if (auto glyph = font.getGlyph(c)) { yOffset = glyph->yOffset; - advance = glyph->xAdvance; + advance = glyph->xAdvance / + static_cast(font.getLineHeight()) * 2.0f * + baseAdvance; } uint charpage = c >> 8; if (charpage == page){ batch.texture(font.getPage(charpage)); draw_glyph( - batch, pos, glm::vec2(x, y - yOffset * (is3d ? -1 : 1) / static_cast(font.getLineHeight())), c, right, up, interval, style + batch, + pos, + glm::vec2( + x, + y - yOffset * (is3d ? -1 : 1) / + static_cast(font.getLineHeight()) + ), + c, + right, + up, + interval, + style ); } else if (charpage > page && charpage < next){ diff --git a/src/graphics/render/TextsRenderer.cpp b/src/graphics/render/TextsRenderer.cpp index b5965dcc4..8c3afb6e3 100644 --- a/src/graphics/render/TextsRenderer.cpp +++ b/src/graphics/render/TextsRenderer.cpp @@ -79,7 +79,10 @@ void TextsRenderer::renderNote( yvec = camera.up; } float scale = - (1.0f - preset.perspective) * glm::pow(glm::distance(camera.position, pos), 1.0f-preset.perspective); + (1.0f - preset.perspective) * + glm::pow( + glm::distance(camera.position, pos), 1.0f - preset.perspective + ); xvec *= 1.0f + scale; yvec *= 1.0f + scale; } From 135f351374965a4ebffab9221d9fc195157daa82 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 26 Jul 2026 17:54:29 +0300 Subject: [PATCH 3/3] update doc/*/3d-text.md --- doc/en/3d-text.md | 17 +++++++++-------- doc/ru/3d-text.md | 1 + 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/doc/en/3d-text.md b/doc/en/3d-text.md index b0c9fd1f6..be4a2757f 100644 --- a/doc/en/3d-text.md +++ b/doc/en/3d-text.md @@ -4,14 +4,15 @@ The appearance of 3D text, is configured via a table, like [particles](particles.md). All fields are optional. -| Field | Description | Default | -| --------------- | ---------------------------- | ---------------- | -| display | Display format | static_billboard | -| color | Text color | {1, 1, 1, 1} | -| scale | Text scale | 1 | -| render_distance | Text rendering distance | 32 | -| xray_opacity | Visibility through obstacles | 0 | -| perspective | Perspective coefficient | 1 | +| Field | Description | Default | +| --------------- | ---------------------------------------- | ---------------- | +| display | Display format | static_billboard | +| color | Text color | {1, 1, 1, 1} | +| scale | Text scale | 1 | +| render_distance | Text rendering distance | 32 | +| xray_opacity | Visibility through obstacles | 0 | +| perspective | Perspective coefficient | 1 | +| font | Font. If absent, the default one is used | "" | Available display formats: diff --git a/doc/ru/3d-text.md b/doc/ru/3d-text.md index c2d209434..548289701 100644 --- a/doc/ru/3d-text.md +++ b/doc/ru/3d-text.md @@ -12,6 +12,7 @@ | render_distance | Дистанция отрисовки текста | 32 | | xray_opacity | Коэффициент видимости через препятствия (просвечивание) | 0 | | perspective | Коэффициент перспективы | 1 | +| font | Шрифт. При отсутствии используется основной | "" | Доступные форматы отображения: