]> git.localhorst.tv Git - blank.git/blobdiff - src/graphics/render.cpp
"streamlined" model/VAO handling
[blank.git] / src / graphics / render.cpp
index 7e048408b5091239ca10e35e89a8dfe2fcec4035..f78f9cb6f77fc2b92f1e5e7ad3b137cda65c4aed 100644 (file)
@@ -1,6 +1,11 @@
+#include "BlendedSprite.hpp"
+#include "FixedText.hpp"
 #include "Font.hpp"
 #include "Format.hpp"
+#include "MessageBox.hpp"
+#include "Text.hpp"
 #include "Texture.hpp"
+#include "Viewport.hpp"
 
 #include <algorithm>
 #include <cstring>
@@ -107,13 +112,14 @@ glm::tvec2<int> Font::TextSize(const char *text) const {
        return size;
 }
 
-Texture Font::Render(const char *text, SDL_Color color) const {
+Texture Font::Render(const char *text) const {
        Texture tex;
+       Render(text, tex);
        return tex;
 }
 
-void Font::Render(const char *text, SDL_Color color, Texture &tex) const {
-       SDL_Surface *srf = TTF_RenderUTF8_Blended(handle, text, color);
+void Font::Render(const char *text, Texture &tex) const {
+       SDL_Surface *srf = TTF_RenderUTF8_Blended(handle, text, { 0xFF, 0xFF, 0xFF, 0xFF });
        if (!srf) {
                throw std::runtime_error(TTF_GetError());
        }
@@ -154,6 +160,111 @@ void Format::ReadPixelFormat(const SDL_PixelFormat &fmt) {
 }
 
 
+MessageBox::MessageBox(const Font &f)
+: font(f)
+, lines()
+, max_lines(10)
+, pos(0.0f)
+, adv(0.0f, font.LineSkip(), 0.0f)
+, bg(1.0f, 1.0f, 1.0f, 0.0f)
+, fg(1.0f, 1.0f, 1.0f, 1.0f)
+, grav(Gravity::NORTH_WEST) {
+
+}
+
+void MessageBox::Position(const glm::vec3 &p, Gravity g) noexcept {
+       pos = p;
+       grav = g;
+       if (get_y(g) == Align::END) {
+               adv.y = -font.LineSkip();
+       } else {
+               adv.y = font.LineSkip();
+       }
+       for (Text &txt : lines) {
+               txt.Pivot(g);
+       }
+}
+
+void MessageBox::PushLine(const char *text) {
+       lines.emplace_front();
+       Text &txt = lines.front();
+       txt.Set(font, text);
+       txt.Pivot(grav);
+
+       while (lines.size() > max_lines) {
+               lines.pop_back();
+       }
+}
+
+void MessageBox::Render(Viewport &viewport) noexcept {
+       BlendedSprite &prog = viewport.SpriteProgram();
+       prog.SetBG(bg);
+       prog.SetFG(fg);
+       viewport.SetCursor(pos, grav);
+       for (Text &txt : lines) {
+               prog.SetM(viewport.Cursor());
+               txt.Render(viewport);
+               viewport.MoveCursor(adv);
+       }
+}
+
+
+Text::Text() noexcept
+: tex()
+, sprite()
+, size(0.0f)
+, pivot(Gravity::NORTH_WEST)
+, dirty(false) {
+
+}
+
+FixedText::FixedText() noexcept
+: Text()
+, bg(1.0f, 1.0f, 1.0f, 0.0f)
+, fg(1.0f, 1.0f, 1.0f, 1.0f)
+, pos(0.0f)
+, grav(Gravity::NORTH_WEST)
+, visible(false) {
+
+}
+
+void Text::Set(const Font &font, const char *text) {
+       font.Render(text, tex);
+       size = font.TextSize(text);
+       dirty = true;
+}
+
+namespace {
+
+SpriteModel::Buffer sprite_buf;
+
+}
+
+void Text::Update() {
+       sprite_buf.LoadRect(size.x, size.y, align(pivot, size));
+       sprite.Update(sprite_buf);
+       dirty = false;
+}
+
+void FixedText::Render(Viewport &viewport) noexcept {
+       BlendedSprite &prog = viewport.SpriteProgram();
+       viewport.SetCursor(pos, grav);
+       prog.SetM(viewport.Cursor());
+       prog.SetBG(bg);
+       prog.SetFG(fg);
+       Text::Render(viewport);
+}
+
+void Text::Render(Viewport &viewport) noexcept {
+       if (dirty) {
+               Update();
+       }
+       BlendedSprite &prog = viewport.SpriteProgram();
+       prog.SetTexture(tex);
+       sprite.Draw();
+}
+
+
 Texture::Texture()
 : handle(0)
 , width(0)