mirror of
https://github.com/NoelFB/blah.git
synced 2025-02-20 13:48:27 +08:00
fixed to batch text rendering
This commit is contained in:
parent
f736cb78f9
commit
7bb52d1345
@ -835,50 +835,62 @@ void Batch::str(const SpriteFont& font, const String& text, const Vec2& pos, Tex
|
|||||||
push_matrix(
|
push_matrix(
|
||||||
Mat3x2::create_scale(size / font.size) *
|
Mat3x2::create_scale(size / font.size) *
|
||||||
Mat3x2::create_translation(pos)
|
Mat3x2::create_translation(pos)
|
||||||
);
|
);
|
||||||
|
|
||||||
Vec2 offset;
|
Vec2 offset;
|
||||||
|
|
||||||
if ((align & TextAlign::Left) == TextAlign::Left)
|
if ((align & TextAlign::Left) == TextAlign::Left)
|
||||||
offset.x = 0;
|
offset.x = 0;
|
||||||
else if ((align & TextAlign::Right) == TextAlign::Right)
|
else if ((align & TextAlign::Right) == TextAlign::Right)
|
||||||
offset.x -= font.width_of_line(text);
|
offset.x -= font.width_of_line(text);
|
||||||
else
|
else
|
||||||
offset.x -= (int)(font.width_of_line(text) * 0.5f);
|
offset.x -= font.width_of_line(text) * 0.5f;
|
||||||
|
|
||||||
if ((align & TextAlign::Top) == TextAlign::Top)
|
if ((align & TextAlign::Top) == TextAlign::Top)
|
||||||
offset.y = font.ascent + font.descent;
|
offset.y = font.ascent + font.descent;
|
||||||
else if ((align & TextAlign::Bottom) == TextAlign::Bottom)
|
else if ((align & TextAlign::Bottom) == TextAlign::Bottom)
|
||||||
offset.y = font.ascent + font.descent - font.height_of(text);
|
offset.y = font.height() - font.height_of(text);
|
||||||
else
|
else
|
||||||
offset.y = font.ascent + font.descent - (int)(font.height_of(text) * 0.5f);
|
offset.y = (font.ascent + font.descent + font.height() - font.height_of(text)) * 0.5f;
|
||||||
|
|
||||||
Vec2 at;
|
|
||||||
for (int i = 0, l = text.length(); i < l; i++)
|
for (int i = 0, l = text.length(); i < l; i++)
|
||||||
{
|
{
|
||||||
if (text[i] == '\n')
|
if (text[i] == '\n')
|
||||||
{
|
{
|
||||||
at.x = 0;
|
// increment y
|
||||||
at.y += font.line_height();
|
offset.y += font.line_height();
|
||||||
|
|
||||||
|
// re-align X for this line
|
||||||
|
if ((align & TextAlign::Left) == TextAlign::Left)
|
||||||
|
offset.x = 0;
|
||||||
|
else if ((align & TextAlign::Right) == TextAlign::Right)
|
||||||
|
offset.x = -font.width_of_line(text, i + 1);
|
||||||
|
else
|
||||||
|
offset.x = -font.width_of_line(text, i + 1) * 0.5f;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
// This doesn't parse Unicode!
|
// This doesn't parse Unicode!
|
||||||
// It will assume it's a 1-byte ASCII char which is incorrect
|
// It will assume it's a 1-byte ASCII char which is incorrect
|
||||||
auto ch = font[text[i]];
|
const auto& ch = font[text[i]];
|
||||||
|
|
||||||
if (ch.subtexture.texture && ch.subtexture.texture->is_valid())
|
if (ch.subtexture.texture)
|
||||||
{
|
{
|
||||||
if (i > 0)
|
Vec2 at = offset + ch.offset;
|
||||||
|
|
||||||
|
if (i > 0 && text[i - 1] != '\n')
|
||||||
{
|
{
|
||||||
// TODO:
|
// TODO:
|
||||||
// This doesn't parse Unicode!
|
// This doesn't parse Unicode!
|
||||||
at.x += font.get_kerning(text[i - 1], text[i]);
|
at.x += font.get_kerning(text[i - 1], text[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
tex(ch.subtexture, at + offset + ch.offset, color);
|
tex(ch.subtexture, at, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
at.x += ch.advance;
|
offset.x += ch.advance;
|
||||||
}
|
}
|
||||||
|
|
||||||
pop_matrix();
|
pop_matrix();
|
||||||
|
Loading…
Reference in New Issue
Block a user