X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fui%2Fwidgets.cpp;h=533703fd84da47dea5e8d12f5c3df12d5c0e450f;hb=b49cc8c88caf7d69b35b50e23a40528e71306ade;hp=b19dbcf62de2cc4e76275b57e5b8c4b087e45af2;hpb=3542823a1af7f5063d7cc8da84efa248eb889b8a;p=blank.git diff --git a/src/ui/widgets.cpp b/src/ui/widgets.cpp index b19dbcf..533703f 100644 --- a/src/ui/widgets.cpp +++ b/src/ui/widgets.cpp @@ -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::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);