X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fui%2Fui.cpp;h=e3ddf1020a26bbde6cde0a2499c8c9c60008e810;hb=50f35affb16c78bd3d0b420f5ba37d74fcac391f;hp=4775999310d1bb6b2bdd44998725597a6011539e;hpb=2c2c02796e9df82d0cda12b59aad638d40b4e8b4;p=blank.git diff --git a/src/ui/ui.cpp b/src/ui/ui.cpp index 4775999..e3ddf10 100644 --- a/src/ui/ui.cpp +++ b/src/ui/ui.cpp @@ -2,16 +2,17 @@ #include "Interface.hpp" #include "../app/Assets.hpp" +#include "../app/FrameCounter.hpp" #include "../app/init.hpp" -#include "../graphics/BlendedSprite.hpp" -#include "../graphics/DirectionalLighting.hpp" #include "../graphics/Font.hpp" +#include "../graphics/Viewport.hpp" #include "../model/shapes.hpp" #include "../world/World.hpp" #include #include #include +#include #include #include @@ -25,16 +26,8 @@ HUD::HUD(const BlockTypeRegistry &types, const Font &font) , block_buf() , block_transform(1.0f) , block_label() -, label_sprite() -, label_transform(1.0f) -, label_color{0xFF, 0xFF, 0xFF, 0xFF} , block_visible(false) -, crosshair() -, crosshair_transform(1.0f) -, near(100.0f) -, far(-100.0f) -, projection(glm::ortho(0.0f, 1.0f, 1.0f, 0.0f, near, far)) -, view(1.0f) { +, crosshair() { block_transform = glm::translate(block_transform, glm::vec3(50.0f, 50.0f, 0.0f)); block_transform = glm::scale(block_transform, glm::vec3(50.0f)); block_transform = glm::rotate(block_transform, 3.5f, glm::vec3(1.0f, 0.0f, 0.0f)); @@ -49,16 +42,14 @@ HUD::HUD(const BlockTypeRegistry &types, const Font &font) }); crosshair.colors.resize(4, { 10.0f, 10.0f, 10.0f }); crosshair.Invalidate(); -} - -void HUD::Viewport(float width, float height) noexcept { - Viewport(0, 0, width, height); -} - -void HUD::Viewport(float x, float y, float width, float height) noexcept { - projection = glm::ortho(x, width, height, y, near, far); - crosshair_transform = glm::translate(glm::vec3(width * 0.5f, height * 0.5f, 0.0f)); + block_label.Position( + glm::vec3(50.0f, 85.0f, 0.0f), + Gravity::NORTH_WEST, + Gravity::NORTH + ); + block_label.Foreground(glm::vec4(1.0f)); + block_label.Background(glm::vec4(0.5f)); } @@ -69,45 +60,41 @@ void HUD::Display(const Block &b) { type.FillModel(block_buf, b.Transform()); block.Update(block_buf); - font.Render(type.label.c_str(), label_color, block_label); - glm::vec2 size(font.TextSize(type.label.c_str())); - label_sprite.LoadRect(size.x, size.y); - label_transform = glm::translate(glm::vec3( - std::max(5.0f, 50.0f - std::round(size.x * 0.5f)), - 70.0f + size.y, - 0.75f - )); + block_label.Set(font, type.label); block_visible = type.visible; } -void HUD::Render(DirectionalLighting &world_prog, BlendedSprite &sprite_prog) noexcept { - world_prog.Activate(); +void HUD::Render(Viewport &viewport) noexcept { + viewport.ClearDepth(); + + DirectionalLighting &world_prog = viewport.HUDProgram(); world_prog.SetLightDirection({ 1.0f, 3.0f, 5.0f }); // disable distance fog world_prog.SetFogDensity(0.0f); - GLContext::ClearDepthBuffer(); - GLContext::EnableInvertBlending(); - world_prog.SetMVP(crosshair_transform, view, projection); + viewport.EnableInvertBlending(); + viewport.SetCursor(glm::vec3(0.0f), Gravity::CENTER); + world_prog.SetM(viewport.Cursor()); crosshair.Draw(); if (block_visible) { - GLContext::DisableBlending(); + viewport.DisableBlending(); world_prog.SetM(block_transform); block.Draw(); - - sprite_prog.Activate(); - sprite_prog.SetMVP(label_transform, view, projection); - sprite_prog.SetTexture(block_label); - label_sprite.Draw(); + block_label.Render(viewport); } } -Interface::Interface(const Config &config, const Assets &assets, World &world) -: world(world) +Interface::Interface( + const Config &config, + const Assets &assets, + const FrameCounter &counter, + World &world) +: counter(counter) +, world(world) , ctrl(world.Player()) , font(assets.LoadFont("DejaVuSans", 16)) , hud(world.BlockTypes(), font) @@ -117,6 +104,7 @@ Interface::Interface(const Config &config, const Assets &assets, World &world) , aim_normal() , outline() , outline_transform(1.0f) +, counter_text() , config(config) , place_timer(256) , remove_timer(256) @@ -124,7 +112,10 @@ Interface::Interface(const Config &config, const Assets &assets, World &world) , selection(1) , fwd(0) , rev(0) { - hud.Viewport(960, 600); + counter_text.Hide(); + counter_text.Position(glm::vec3(-25.0f, 25.0f, 0.0f), Gravity::NORTH_EAST); + counter_text.Foreground(glm::vec4(1.0f)); + counter_text.Background(glm::vec4(0.5f)); hud.Display(selection); } @@ -175,6 +166,10 @@ void Interface::HandlePress(const SDL_KeyboardEvent &event) { case SDLK_p: PrintSelectionInfo(); break; + + case SDLK_F3: + ToggleCounter(); + break; } } @@ -284,6 +279,20 @@ void Interface::Print(const Block &block) { << std::endl; } +void Interface::ToggleCounter() { + counter_text.Toggle(); + if (counter_text.Visible()) { + UpdateCounter(); + } +} + +void Interface::UpdateCounter() { + std::stringstream s; + s << std::setprecision(3) << counter.AvgRunning() << "ms"; + std::string text = s.str(); + counter_text.Set(font, text); +} + void Interface::Handle(const SDL_MouseMotionEvent &event) { if (config.mouse_disabled) return; @@ -366,12 +375,6 @@ void Interface::SelectPrevious() { hud.Display(selection); } -void Interface::Handle(const SDL_WindowEvent &event) noexcept { - if (event.event == SDL_WINDOWEVENT_RESIZED) { - hud.Viewport(event.data1, event.data2); - } -} - void Interface::Update(int dt) { ctrl.Velocity(glm::vec3(fwd - rev) * config.move_velocity); @@ -392,6 +395,10 @@ void Interface::Update(int dt) { PlaceBlock(); CheckAim(); } + + if (counter_text.Visible() && counter.Changed()) { + UpdateCounter(); + } } void Interface::CheckAim() { @@ -408,16 +415,20 @@ void Interface::CheckAim() { } -void Interface::Render(DirectionalLighting &world_prog, BlendedSprite &sprite_prog) noexcept { +void Interface::Render(Viewport &viewport) noexcept { if (config.visual_disabled) return; if (aim_chunk) { - world_prog.Activate(); + DirectionalLighting &world_prog = viewport.EntityProgram(); world_prog.SetM(outline_transform); outline.Draw(); } - hud.Render(world_prog, sprite_prog); + if (counter_text.Visible()) { + counter_text.Render(viewport); + } + + hud.Render(viewport); } }