diff --git a/src/graphics/Font.cpp b/src/graphics/Font.cpp index 1e627538..b501c206 100644 --- a/src/graphics/Font.cpp +++ b/src/graphics/Font.cpp @@ -43,35 +43,67 @@ bool Font::isPrintableChar(int c) { #define RES 16 void Font::draw(Batch2D* batch, std::wstring text, int x, int y) { - for (unsigned c : text){ - if (isPrintableChar(c)){ - batch->texture(pages[c >> 8]); - batch->sprite(x, y, RES, RES, 16, c, vec4(1.0f)); + int page = 0; + int next = 10000; + int init_x = x; + do { + for (unsigned c : text){ + if (isPrintableChar(c)){ + int charpage = c >> 8; + if (charpage == page){ + Texture* texture = pages[charpage]; + if (texture == nullptr){ + texture = pages[0]; + } + batch->texture(pages[charpage]); + batch->sprite(x, y, RES, RES, 16, c, vec4(1.0f)); + } + else if (charpage > page && charpage < next){ + next = charpage; + } + } + x += getGlyphWidth(c); } - x += getGlyphWidth(c); - } + page = next; + next = 10000; + x = init_x; + } while (page < 10000); } -void Font::drawWithShadow(Batch2D* batch, std::wstring text, int x, int y) { - for (unsigned c : text){ - if (isPrintableChar(c)){ - Texture* texture = pages[c >> 8]; - if (texture == nullptr){ - texture = pages[0]; - } - batch->texture(texture); - batch->sprite(x+1, y+1, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); - batch->sprite(x+1, y-1, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); - batch->sprite(x-1, y, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); - batch->sprite(x+1, y, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); +void Font::drawWithOutline(Batch2D* batch, std::wstring text, int x, int y) { + int page = 0; + int next = 10000; + int init_x = x; + do { + for (unsigned c : text){ + if (isPrintableChar(c)){ + int charpage = c >> 8; + if (charpage == page){ + Texture* texture = pages[charpage]; + if (texture == nullptr){ + texture = pages[0]; + } + batch->texture(pages[charpage]); + batch->sprite(x+1, y+1, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); + batch->sprite(x+1, y-1, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); + batch->sprite(x-1, y, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); + batch->sprite(x+1, y, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); - batch->sprite(x-1, y-1, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); - batch->sprite(x+1, y-1, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); - batch->sprite(x+1, y+1, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); - batch->sprite(x-1, y+1, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); + batch->sprite(x-1, y-1, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); + batch->sprite(x+1, y-1, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); + batch->sprite(x+1, y+1, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); + batch->sprite(x-1, y+1, RES, RES, 16, c, vec4(0.0f, 0.0f, 0.0f, 1.0f)); - batch->sprite(x, y, RES, RES, 16, c, vec4(1.0f)); + batch->sprite(x, y, RES, RES, 16, c, vec4(1.0f)); + } + else if (charpage > page && charpage < next){ + next = charpage; + } + } + x += getGlyphWidth(c); } - x += getGlyphWidth(c); - } + page = next; + next = 10000; + x = init_x; + } while (page < 10000); } diff --git a/src/graphics/Font.h b/src/graphics/Font.h index 61976903..c2f15b87 100644 --- a/src/graphics/Font.h +++ b/src/graphics/Font.h @@ -16,7 +16,7 @@ public: int getGlyphWidth(char c); bool isPrintableChar(int c); void draw(Batch2D* batch, std::wstring text, int x, int y); - void drawWithShadow(Batch2D* batch, std::wstring text, int x, int y); + void drawWithOutline(Batch2D* batch, std::wstring text, int x, int y); }; #endif /* GRAPHICS_FONT_H_ */ diff --git a/src/world_render.h b/src/world_render.h index fb876138..bf304540 100644 --- a/src/world_render.h +++ b/src/world_render.h @@ -128,12 +128,12 @@ void draw_hud(World* world, Level* level, Assets* assets, bool devdata, int fps) Font* font = assets->getFont("normal"); batch->begin(); if (devdata){ - font->drawWithShadow(batch, L"рандом chunks: "+std::to_wstring(chunks->chunksCount), 16, 16); - font->drawWithShadow(batch, std::to_wstring((int)player->camera->position.x), 10, 30); - font->drawWithShadow(batch, std::to_wstring((int)player->camera->position.y), 50, 30); - font->drawWithShadow(batch, std::to_wstring((int)player->camera->position.z), 90, 30); - font->drawWithShadow(batch, L"fps:", 16, 42); - font->drawWithShadow(batch, std::to_wstring(fps), 40, 42); + font->drawWithOutline(batch, L"chunks: "+std::to_wstring(chunks->chunksCount), 16, 16); + font->drawWithOutline(batch, std::to_wstring((int)player->camera->position.x), 10, 30); + font->drawWithOutline(batch, std::to_wstring((int)player->camera->position.y), 50, 30); + font->drawWithOutline(batch, std::to_wstring((int)player->camera->position.z), 90, 30); + font->drawWithOutline(batch, L"fps:", 16, 42); + font->drawWithOutline(batch, std::to_wstring(fps), 40, 42); } batch->render();