Merge pull request #888 from MihailRis/3d-text-font-property

3d text font property
This commit is contained in:
MihailRis 2026-07-26 18:11:06 +03:00 • committed by GitHub
commit 6b580d23c6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 39 additions and 12 deletions

View file

@ -4,14 +4,15 @@
The appearance of 3D text, is configured via a table, like [particles](particles.md). All fields are optional. The appearance of 3D text, is configured via a table, like [particles](particles.md). All fields are optional.
| Field | Description | Default | | Field | Description | Default |
| --------------- | ---------------------------- | ---------------- | | --------------- | ---------------------------------------- | ---------------- |
| display | Display format | static_billboard | | display | Display format | static_billboard |
| color | Text color | {1, 1, 1, 1} | | color | Text color | {1, 1, 1, 1} |
| scale | Text scale | 1 | | scale | Text scale | 1 |
| render_distance | Text rendering distance | 32 | | render_distance | Text rendering distance | 32 |
| xray_opacity | Visibility through obstacles | 0 | | xray_opacity | Visibility through obstacles | 0 |
| perspective | Perspective coefficient | 1 | | perspective | Perspective coefficient | 1 |
| font | Font. If absent, the default one is used | "" |
Available display formats: Available display formats:

View file

@ -12,6 +12,7 @@
| render_distance | Дистанция отрисовки текста | 32 | | render_distance | Дистанция отрисовки текста | 32 |
| xray_opacity | Коэффициент видимости через препятствия (просвечивание) | 0 | | xray_opacity | Коэффициент видимости через препятствия (просвечивание) | 0 |
| perspective | Коэффициент перспективы | 1 | | perspective | Коэффициент перспективы | 1 |
| font | Шрифт. При отсутствии используется основной | "" |
Доступные форматы отображения: Доступные форматы отображения:

View file

@ -162,6 +162,8 @@ static inline void draw_text(
const FontStylesScheme* styles, const FontStylesScheme* styles,
size_t styleMapOffset size_t styleMapOffset
) { ) {
bool is3d = std::is_same<Batch, Batch3D>();
static FontStylesScheme defStyles {{{}}, {0}}; static FontStylesScheme defStyles {{{}}, {0}};
if (styles == nullptr) { if (styles == nullptr) {
@ -194,13 +196,26 @@ static inline void draw_text(
float advance = baseAdvance; float advance = baseAdvance;
if (auto glyph = font.getGlyph(c)) { if (auto glyph = font.getGlyph(c)) {
yOffset = glyph->yOffset; yOffset = glyph->yOffset;
advance = glyph->xAdvance; advance = glyph->xAdvance /
static_cast<float>(font.getLineHeight()) * 2.0f *
baseAdvance;
} }
uint charpage = c >> 8; uint charpage = c >> 8;
if (charpage == page){ if (charpage == page){
batch.texture(font.getPage(charpage)); batch.texture(font.getPage(charpage));
draw_glyph( draw_glyph(
batch, pos, glm::vec2(x, y - yOffset / static_cast<float>(font.getLineHeight())), c, right, up, interval, style batch,
pos,
glm::vec2(
x,
y - yOffset * (is3d ? -1 : 1) /
static_cast<float>(font.getLineHeight())
),
c,
right,
up,
interval,
style
); );
} }
else if (charpage > page && charpage < next){ else if (charpage > page && charpage < next){

View file

@ -58,7 +58,10 @@ void TextsRenderer::renderNote(
} }
opacity = preset.xrayOpacity; opacity = preset.xrayOpacity;
} }
auto& font = assets.require<Font>(FONT_DEFAULT);
auto specifiedFont = assets.get<Font>(preset.font);
auto& font =
specifiedFont ? *specifiedFont : assets.require<Font>(FONT_DEFAULT);
glm::vec3 xvec = note.getAxisX(); glm::vec3 xvec = note.getAxisX();
glm::vec3 yvec = note.getAxisY(); glm::vec3 yvec = note.getAxisY();
@ -76,7 +79,10 @@ void TextsRenderer::renderNote(
yvec = camera.up; yvec = camera.up;
} }
float scale = 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; xvec *= 1.0f + scale;
yvec *= 1.0f + scale; yvec *= 1.0f + scale;
} }
@ -118,6 +124,7 @@ void TextsRenderer::renderNote(
} }
auto color = preset.color; auto color = preset.color;
batch.setColor(glm::vec4(color.r, color.g, color.b, color.a * opacity)); batch.setColor(glm::vec4(color.r, color.g, color.b, color.a * opacity));
font.draw( font.draw(
batch, batch,
text, text,

View file

@ -13,6 +13,7 @@ dv::value NotePreset::serialize() const {
{"render_distance", renderDistance}, {"render_distance", renderDistance},
{"xray_opacity", xrayOpacity}, {"xray_opacity", xrayOpacity},
{"perspective", perspective}, {"perspective", perspective},
{"font", font},
}); });
} }
@ -27,4 +28,5 @@ void NotePreset::deserialize(const dv::value& src) {
src.at("render_distance").get(renderDistance); src.at("render_distance").get(renderDistance);
src.at("xray_opacity").get(xrayOpacity); src.at("xray_opacity").get(xrayOpacity);
src.at("perspective").get(perspective); src.at("perspective").get(perspective);
src.at("font").get(font);
} }

View file

@ -28,6 +28,7 @@ struct NotePreset : public Serializable {
float renderDistance = 32.0f; float renderDistance = 32.0f;
float xrayOpacity = 0.0f; float xrayOpacity = 0.0f;
float perspective = 1.0f; float perspective = 1.0f;
std::string font {};
dv::value serialize() const override; dv::value serialize() const override;
void deserialize(const dv::value& src) override; void deserialize(const dv::value& src) override;