X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fui%2Fui.cpp;h=8e48f143b5c006f7aea3db4db9563b3c9cc05058;hb=46b18a88fdda816f3c2c547aba68b0a5ea7970f7;hp=410072da681ed292042949fb88247bd409160068;hpb=b7d09e1e35ef90282c97509e0020b20db3c7ea9f;p=blank.git diff --git a/src/ui/ui.cpp b/src/ui/ui.cpp index 410072d..8e48f14 100644 --- a/src/ui/ui.cpp +++ b/src/ui/ui.cpp @@ -1,11 +1,16 @@ #include "HUD.hpp" #include "Interface.hpp" +#include "../app/Assets.hpp" #include "../app/init.hpp" +#include "../graphics/BlendedSprite.hpp" #include "../graphics/DirectionalLighting.hpp" +#include "../graphics/Font.hpp" #include "../model/shapes.hpp" #include "../world/World.hpp" +#include +#include #include #include #include @@ -13,18 +18,23 @@ namespace blank { -HUD::HUD(const BlockTypeRegistry &types) +HUD::HUD(const BlockTypeRegistry &types, const Font &font) : types(types) +, font(font) , block() , 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(glm::translate(glm::mat4(1.0f), glm::vec3(-0.5f, -0.5f, 0))) { +, view(1.0f) { 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)); @@ -48,7 +58,7 @@ void HUD::Viewport(float width, float height) noexcept { 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::mat4(1.0f), glm::vec3(width * 0.5f, height * 0.5f, 0.0f)); + crosshair_transform = glm::translate(glm::vec3(width * 0.5f, height * 0.5f, 0.0f)); } @@ -58,28 +68,47 @@ void HUD::Display(const Block &b) { block_buf.Clear(); 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_visible = type.visible; } -void HUD::Render(DirectionalLighting &program) noexcept { +void HUD::Render(DirectionalLighting &world_prog, BlendedSprite &sprite_prog) noexcept { + world_prog.Activate(); + world_prog.SetLightDirection({ 1.0f, 3.0f, 5.0f }); + // disable distance fog + world_prog.SetFogDensity(0.0f); + GLContext::ClearDepthBuffer(); + + world_prog.SetMVP(crosshair_transform, view, projection); + crosshair.Draw(); + if (block_visible) { - program.SetLightDirection({ 1.0f, 3.0f, 5.0f }); - // disable distance fog - program.SetFogDensity(0.0f); - GLContext::ClearDepthBuffer(); - program.SetMVP(block_transform, view, projection); + world_prog.SetM(block_transform); block.Draw(); - program.SetM(crosshair_transform); - crosshair.Draw(); + + sprite_prog.Activate(); + sprite_prog.SetMVP(label_transform, view, projection); + sprite_prog.SetTexture(block_label); + label_sprite.Draw(); } } -Interface::Interface(const Config &config, World &world) +Interface::Interface(const Config &config, const Assets &assets, World &world) : world(world) , ctrl(world.Player()) -, hud(world.BlockTypes()) +, font(assets.LoadFont("DejaVuSans", 16)) +, hud(world.BlockTypes(), font) , aim{{ 0, 0, 0 }, { 0, 0, -1 }} , aim_chunk(nullptr) , aim_block(0) @@ -128,6 +157,10 @@ void Interface::HandlePress(const SDL_KeyboardEvent &event) { TurnBlock(); break; + case SDLK_n: + ToggleCollision(); + break; + case SDLK_b: PrintBlockInfo(); break; @@ -178,6 +211,11 @@ void Interface::TurnBlock() { hud.Display(selection); } +void Interface::ToggleCollision() { + ctrl.Controlled().WorldCollidable(!ctrl.Controlled().WorldCollidable()); + std::cout << "collision " << (ctrl.Controlled().WorldCollidable() ? "on" : "off") << std::endl; +} + void Interface::PrintBlockInfo() { std::cout << std::endl; if (!aim_chunk) { @@ -356,7 +394,7 @@ void Interface::Update(int dt) { void Interface::CheckAim() { float dist; - if (world.Intersection(aim, glm::mat4(1.0f), &aim_chunk, &aim_block, &dist, &aim_normal)) { + if (world.Intersection(aim, glm::mat4(1.0f), aim_chunk, aim_block, dist, aim_normal)) { outline.Clear(); aim_chunk->Type(aim_chunk->BlockAt(aim_block)).FillOutlineModel(outline); outline_transform = glm::scale(glm::vec3(1.0002f)); @@ -368,15 +406,16 @@ void Interface::CheckAim() { } -void Interface::Render(DirectionalLighting &program) noexcept { +void Interface::Render(DirectionalLighting &world_prog, BlendedSprite &sprite_prog) noexcept { if (config.visual_disabled) return; if (aim_chunk) { - program.SetM(outline_transform); + world_prog.Activate(); + world_prog.SetM(outline_transform); outline.Draw(); } - hud.Render(program); + hud.Render(world_prog, sprite_prog); } }