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 | Шрифт. При отсутствии используется основной | "" | Доступные форматы отображения: diff --git a/src/graphics/core/Font.cpp b/src/graphics/core/Font.cpp index 7aaa67e80..4843387e4 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) { @@ -194,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 / 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..8c3afb6e3 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(); @@ -76,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; } @@ -118,6 +124,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;