X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fui%2Fui.cpp;h=8563f7ded08409344be3957f7620640268ca7e3f;hb=b4e5dad2ed5c7e77573de413f3bf5be88577856d;hp=048aed1ac81559e21e2eee740d90a195bf5df22b;hpb=33b37e7242e4cbfa76e4a0d6e5bb54223b541162;p=blank.git diff --git a/src/ui/ui.cpp b/src/ui/ui.cpp index 048aed1..8563f7d 100644 --- a/src/ui/ui.cpp +++ b/src/ui/ui.cpp @@ -17,6 +17,7 @@ #include "../graphics/Viewport.hpp" #include "../io/TokenStreamReader.hpp" #include "../model/bounds.hpp" +#include "../net/CongestionControl.hpp" #include "../world/BlockLookup.hpp" #include "../world/World.hpp" #include "../world/WorldManipulator.hpp" @@ -40,7 +41,13 @@ PlayerController::PlayerController(World &world, Player &player) , dirty(true) , aim_world() , aim_entity() { + player.GetEntity().SetController(*this); +} +PlayerController::~PlayerController() { + if (&player.GetEntity().GetController() == this) { + player.GetEntity().UnsetController(); + } } void PlayerController::SetMovement(const glm::vec3 &m) noexcept { @@ -52,6 +59,10 @@ void PlayerController::SetMovement(const glm::vec3 &m) noexcept { Invalidate(); } +glm::vec3 PlayerController::ControlForce(const Entity &e, const EntityState &s) const { + return TargetVelocity(rotateY(move_dir * e.MaxVelocity(), s.yaw), s, 5.0f); +} + void PlayerController::TurnHead(float dp, float dy) noexcept { player.GetEntity().TurnHead(dp, dy); } @@ -77,10 +88,7 @@ void PlayerController::Invalidate() noexcept { } void PlayerController::UpdatePlayer() noexcept { - constexpr float max_vel = 5.0f; // in m/s if (dirty) { - player.GetEntity().TargetVelocity(glm::rotateY(move_dir * max_vel, player.GetEntity().Yaw())); - Ray aim = player.Aim(); if (!world.Intersection(aim, glm::mat4(1.0f), player.GetEntity().ChunkCoords(), aim_world)) { aim_world = WorldCollision(); @@ -104,12 +112,12 @@ void PlayerController::UpdatePlayer() noexcept { DirectInput::DirectInput(World &world, Player &player, WorldManipulator &manip) : PlayerController(world, player) , manip(manip) -, place_timer(256) -, remove_timer(256) { +, place_timer(0.25f) +, remove_timer(0.25f) { } -void DirectInput::Update(int dt) { +void DirectInput::Update(Entity &, float dt) { Invalidate(); // world has changed in the meantime UpdatePlayer(); @@ -201,6 +209,11 @@ HUD::HUD(Environment &env, Config &config, const Player &player) , block_text() , show_block(false) , show_entity(false) +// net stats +, bandwidth_text() +, rtt_text() +, packet_loss_text() +, show_net(false) // message box , messages(env.assets.small_ui_font) , msg_timer(5000) @@ -241,6 +254,20 @@ HUD::HUD(Environment &env, Config &config, const Player &player) entity_text.Background(glm::vec4(0.5f)); entity_text.Set(env.assets.small_ui_font, "Entity: none"); + // net stats + bandwidth_text.Position(glm::vec3(-25.0f, 25.0f + 6 * ls, 0.0f), Gravity::NORTH_EAST); + bandwidth_text.Foreground(glm::vec4(1.0f)); + bandwidth_text.Background(glm::vec4(0.5f)); + bandwidth_text.Set(env.assets.small_ui_font, "TX: 0.0KB/s RX: 0.0KB/s"); + rtt_text.Position(glm::vec3(-25.0f, 25.0f + 7 * ls, 0.0f), Gravity::NORTH_EAST); + rtt_text.Foreground(glm::vec4(1.0f)); + rtt_text.Background(glm::vec4(0.5f)); + rtt_text.Set(env.assets.small_ui_font, "RTT: unavailable"); + packet_loss_text.Position(glm::vec3(-25.0f, 25.0f + 8 * ls, 0.0f), Gravity::NORTH_EAST); + packet_loss_text.Foreground(glm::vec4(1.0f)); + packet_loss_text.Background(glm::vec4(0.5f)); + packet_loss_text.Set(env.assets.small_ui_font, "Packet loss: 0.0%"); + // message box messages.Position(glm::vec3(25.0f, -25.0f - 2 * ls, 0.0f), Gravity::SOUTH_WEST); messages.Foreground(glm::vec4(1.0f)); @@ -340,10 +367,10 @@ void HUD::UpdatePosition() { } void HUD::UpdateOrientation() { - //std::stringstream s; - //s << std::setprecision(3) << "pitch: " << rad2deg(ctrl.Pitch()) - // << ", yaw: " << rad2deg(ctrl.Yaw()); - //orientation_text.Set(env.assets.small_ui_font, s.str()); + std::stringstream s; + s << std::setprecision(3) << "pitch: " << rad2deg(player.GetEntity().Pitch()) + << ", yaw: " << rad2deg(player.GetEntity().Yaw()); + orientation_text.Set(env.assets.small_ui_font, s.str()); } void HUD::PostMessage(const char *msg) { @@ -354,6 +381,27 @@ void HUD::PostMessage(const char *msg) { } +void HUD::UpdateNetStats(const CongestionControl &stat) { + if (!config.video.debug) return; + + std::stringstream s; + s << std::fixed << std::setprecision(1) + << "TX: " << stat.Upstream() + << "KB/s, RX: " << stat.Downstream() << "KB/s"; + bandwidth_text.Set(env.assets.small_ui_font, s.str()); + + s.str(""); + s << "RTT: " << stat.RoundTripTime() << "ms"; + rtt_text.Set(env.assets.small_ui_font, s.str()); + + s.str(""); + s << "Packet loss: " << (stat.PacketLoss() * 100.0f) << "%"; + packet_loss_text.Set(env.assets.small_ui_font, s.str()); + + show_net = true; +} + + void HUD::Update(int dt) { msg_timer.Update(dt); if (msg_timer.HitOnce()) { @@ -385,6 +433,8 @@ void HUD::Render(Viewport &viewport) noexcept { if (block_visible) { DirectionalLighting &world_prog = viewport.HUDProgram(); world_prog.SetLightDirection({ 1.0f, 3.0f, 5.0f }); + world_prog.SetLightColor({ 1.0f, 1.0f, 1.0f }); + world_prog.SetAmbientColor({ 0.1f, 0.1f, 0.1f }); // disable distance fog world_prog.SetFogDensity(0.0f); @@ -417,6 +467,11 @@ void HUD::Render(Viewport &viewport) noexcept { } else if (show_entity) { entity_text.Render(viewport); } + if (show_net) { + bandwidth_text.Render(viewport); + rtt_text.Render(viewport); + packet_loss_text.Render(viewport); + } } } @@ -457,10 +512,20 @@ Interface::Interface( , fwd(0) , rev(0) , slot(0) -, num_slots(10) { +, num_slots(10) +, locked(false) { } +void Interface::Lock() { + fwd = glm::ivec3(0); + rev = glm::ivec3(0); + locked = true; +} + +void Interface::Unlock() { + locked = false; +} void Interface::HandlePress(const SDL_KeyboardEvent &event) { if (!config.input.keyboard) return; @@ -592,7 +657,7 @@ void Interface::HandleRelease(const SDL_KeyboardEvent &event) { } void Interface::Handle(const SDL_MouseMotionEvent &event) { - if (!config.input.mouse) return; + if (locked || !config.input.mouse) return; player_ctrl.TurnHead( event.yrel * config.input.pitch_sensitivity, event.xrel * config.input.yaw_sensitivity);