]> git.localhorst.tv Git - blank.git/blobdiff - src/ui/widgets.cpp
uniform background for message box
[blank.git] / src / ui / widgets.cpp
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);