]> git.localhorst.tv Git - blank.git/commitdiff
uniform background for message box
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Tue, 20 Oct 2015 10:11:13 +0000 (12:11 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Tue, 20 Oct 2015 10:11:13 +0000 (12:11 +0200)
src/ui/MessageBox.hpp
src/ui/Text.hpp
src/ui/widgets.cpp

index 2191627b039aab23f9a8410521476991ca631d01..b5a82c8b0a7b21f65be52587ee42b0c81dbd30e3 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "Text.hpp"
 #include "../graphics/align.hpp"
+#include "../graphics/PrimitiveMesh.hpp"
 
 #include <deque>
 #include <string>
@@ -22,7 +23,7 @@ public:
        void Position(const glm::vec3 &, Gravity) noexcept;
 
        void Foreground(const glm::vec4 &col) noexcept { fg = col; }
-       void Background(const glm::vec4 &col) noexcept { bg = col; }
+       void Background(const glm::vec4 &col) noexcept { bg = col; dirty = true; }
 
        void PushLine(const char *);
        void PushLine(const std::string &l) {
@@ -31,6 +32,9 @@ public:
 
        void Render(Viewport &) noexcept;
 
+private:
+       void Recalc();
+
 private:
        const Font &font;
        std::deque<Text> lines;
@@ -38,11 +42,15 @@ private:
 
        glm::vec3 pos;
        glm::vec3 adv;
+       glm::vec2 size;
 
        glm::vec4 bg;
        glm::vec4 fg;
 
+       PrimitiveMesh bg_mesh;
+
        Gravity grav;
+       bool dirty;
 
 };
 
index bdeb304daff1b79659486ce608733bf51f8a8dd3..84a6190999f89f4d2d340dd6ba4b64d1e1eb70b3 100644 (file)
@@ -29,6 +29,8 @@ public:
                dirty = true;
        }
 
+       const glm::vec2 &Size() const noexcept { return size; }
+
        void Render(Viewport &) noexcept;
 
 private:
index b19dbcf62de2cc4e76275b57e5b8c4b087e45af2..533703fd84da47dea5e8d12f5c3df12d5c0e450f 100644 (file)
@@ -19,7 +19,8 @@ MessageBox::MessageBox(const Font &f)
 , 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) {
+, grav(Gravity::NORTH_WEST)
+, dirty(true) {
 
 }
 
@@ -34,6 +35,7 @@ void MessageBox::Position(const glm::vec3 &p, Gravity g) noexcept {
        for (Text &txt : lines) {
                txt.Pivot(g);
        }
+       dirty = true;
 }
 
 void MessageBox::PushLine(const char *text) {
@@ -45,13 +47,41 @@ void MessageBox::PushLine(const char *text) {
        while (lines.size() > max_lines) {
                lines.pop_back();
        }
+       dirty = true;
+}
+
+namespace {
+
+PrimitiveMesh::Buffer bg_buf;
+
+}
+
+void MessageBox::Recalc() {
+       size = glm::vec2(0.0f, 0.0f);
+       for (const Text &line : lines) {
+               size.x = std::max(size.x, line.Size().x);
+               size.y += line.Size().y;
+       }
+       bg_buf.FillRect(size.x, size.y, bg, align(grav, size));
+       bg_mesh.Update(bg_buf);
+       bg_buf.Clear();
+       dirty = false;
 }
 
 void MessageBox::Render(Viewport &viewport) noexcept {
+       viewport.SetCursor(pos, grav);
+       if (bg.a > std::numeric_limits<float>::epsilon()) {
+               if (dirty) {
+                       Recalc();
+               }
+               PlainColor &prog = viewport.HUDColorProgram();
+               prog.SetM(viewport.Cursor());
+               bg_mesh.DrawTriangles();
+               viewport.MoveCursor(glm::vec3(0.0f, 0.0f, -1.0f));
+       }
        BlendedSprite &prog = viewport.SpriteProgram();
-       prog.SetBG(bg);
+       prog.SetBG(glm::vec4(0.0f));
        prog.SetFG(fg);
-       viewport.SetCursor(pos, grav);
        for (Text &txt : lines) {
                prog.SetM(viewport.Cursor());
                txt.Render(viewport);