]> git.localhorst.tv Git - blank.git/blobdiff - src/ui/ui.cpp
save a little bandwidth
[blank.git] / src / ui / ui.cpp
index 6c7ab6aa49ff53163b734c271e5fc0b92cf4bff9..5f60d4401d056e116422b72941965217cd26edce 100644 (file)
 #include "../app/init.hpp"
 #include "../audio/Audio.hpp"
 #include "../audio/SoundBank.hpp"
+#include "../geometry/distance.hpp"
 #include "../graphics/Font.hpp"
 #include "../graphics/Viewport.hpp"
 #include "../io/TokenStreamReader.hpp"
 #include "../model/bounds.hpp"
-#include "../net/ConnectionHandler.hpp"
+#include "../net/CongestionControl.hpp"
 #include "../world/BlockLookup.hpp"
 #include "../world/World.hpp"
 #include "../world/WorldManipulator.hpp"
@@ -42,6 +43,7 @@ PlayerController::PlayerController(World &world, Player &player)
 , aim_world()
 , aim_entity() {
        player.GetEntity().SetController(*this);
+       player.GetEntity().GetSteering().SetAcceleration(5.0f);
 }
 
 PlayerController::~PlayerController() {
@@ -59,10 +61,6 @@ 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);
 }
@@ -90,10 +88,11 @@ void PlayerController::Invalidate() noexcept {
 void PlayerController::UpdatePlayer() noexcept {
        if (dirty) {
                Ray aim = player.Aim();
-               if (!world.Intersection(aim, glm::mat4(1.0f), player.GetEntity().ChunkCoords(), aim_world)) {
+               Entity &entity = player.GetEntity();
+               if (!world.Intersection(aim, entity.ChunkCoords(), aim_world)) {
                        aim_world = WorldCollision();
                }
-               if (!world.Intersection(aim, glm::mat4(1.0f), player.GetEntity(), aim_entity)) {
+               if (!world.Intersection(aim, entity, aim_entity)) {
                        aim_entity = EntityCollision();
                }
                if (aim_world && aim_entity) {
@@ -104,6 +103,20 @@ void PlayerController::UpdatePlayer() noexcept {
                                aim_world = WorldCollision();
                        }
                }
+               Steering &steering = entity.GetSteering();
+               if (!iszero(move_dir)) {
+                       // scale input by max velocity, apply yaw, and transform to world space
+                       steering.SetTargetVelocity(glm::vec3(
+                               glm::vec4(rotateY(move_dir * entity.MaxVelocity(), entity.Yaw()), 0.0f)
+                               * transpose(entity.Transform())
+                       ));
+                       steering.Enable(Steering::TARGET_VELOCITY);
+                       steering.Disable(Steering::HALT);
+               } else {
+                       // target velocity of 0 is the same as halt
+                       steering.Enable(Steering::HALT);
+                       steering.Disable(Steering::TARGET_VELOCITY);
+               }
                dirty = false;
        }
 }
@@ -282,7 +295,7 @@ HUD::HUD(Environment &env, Config &config, const Player &player)
        buf.indices = std::vector<PrimitiveMesh::Index>({
                0, 1, 2, 3
        });
-       buf.colors.resize(4, { 10.0f, 10.0f, 10.0f, 1.0f });
+       buf.colors.resize(4, { 255, 255, 255, 255 });
        crosshair.Update(buf);
 }
 
@@ -368,8 +381,8 @@ void HUD::UpdatePosition() {
 
 void HUD::UpdateOrientation() {
        std::stringstream s;
-       s << std::setprecision(3) << "pitch: " << rad2deg(player.GetEntity().Pitch())
-               << ", yaw: " << rad2deg(player.GetEntity().Yaw());
+       s << std::setprecision(3) << "pitch: " << glm::degrees(player.GetEntity().Pitch())
+               << ", yaw: " << glm::degrees(player.GetEntity().Yaw());
        orientation_text.Set(env.assets.small_ui_font, s.str());
 }
 
@@ -381,19 +394,21 @@ void HUD::PostMessage(const char *msg) {
 }
 
 
-void HUD::UpdateNetStats(const ConnectionHandler &conn) {
+void HUD::UpdateNetStats(const CongestionControl &stat) {
+       if (!config.video.debug) return;
+
        std::stringstream s;
        s << std::fixed << std::setprecision(1)
-               << "TX: " << conn.Upstream()
-               << "KB/s, RX: " << conn.Downstream() << "KB/s";
+               << "TX: " << stat.Upstream()
+               << "KB/s, RX: " << stat.Downstream() << "KB/s";
        bandwidth_text.Set(env.assets.small_ui_font, s.str());
 
        s.str("");
-       s << "RTT: " << conn.RoundTripTime() << "ms";
+       s << "RTT: " << stat.RoundTripTime() << "ms";
        rtt_text.Set(env.assets.small_ui_font, s.str());
 
        s.str("");
-       s << "Packet loss: " << (conn.PacketLoss() * 100.0f) << "%";
+       s << "Packet loss: " << (stat.PacketLoss() * 100.0f) << "%";
        packet_loss_text.Set(env.assets.small_ui_font, s.str());
 
        show_net = true;
@@ -431,6 +446,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);
 
@@ -507,7 +524,6 @@ Interface::Interface(
 , client_ctrl(cc)
 , fwd(0)
 , rev(0)
-, slot(0)
 , num_slots(10)
 , locked(false) {
 
@@ -587,20 +603,19 @@ void Interface::HandlePress(const SDL_KeyboardEvent &event) {
                        break;
 
                case Keymap::TOGGLE_AUDIO:
-                       config.audio.enabled = !config.audio.enabled;
-                       client_ctrl.SetAudio(config.audio.enabled);
+                       client_ctrl.SetAudio(!config.audio.enabled);
                        break;
                case Keymap::TOGGLE_VIDEO:
-                       config.video.world = !config.video.world;
-                       client_ctrl.SetVideo(config.video.world);
+                       client_ctrl.SetVideo(!config.video.world);
                        break;
                case Keymap::TOGGLE_HUD:
-                       config.video.hud = !config.video.hud;
-                       client_ctrl.SetHUD(config.video.hud);
+                       client_ctrl.SetHUD(!config.video.hud);
                        break;
                case Keymap::TOGGLE_DEBUG:
-                       config.video.debug = !config.video.debug;
-                       client_ctrl.SetDebug(config.video.debug);
+                       client_ctrl.SetDebug(!config.video.debug);
+                       break;
+               case Keymap::CAMERA_NEXT:
+                       client_ctrl.NextCamera();
                        break;
 
                default:
@@ -707,7 +722,7 @@ void Interface::UpdateMovement() {
 }
 
 void Interface::InvAbs(int s) {
-       slot = s % num_slots;
+       int slot = s % num_slots;
        while (slot < 0) {
                slot += num_slots;
        }
@@ -715,7 +730,7 @@ void Interface::InvAbs(int s) {
 }
 
 void Interface::InvRel(int delta) {
-       InvAbs(slot + delta);
+       InvAbs(player_ctrl.GetPlayer().GetInventorySlot() + delta);
 }
 
 
@@ -770,7 +785,6 @@ void Keymap::LoadDefault() {
        Map(SDL_SCANCODE_0, INV_10);
 
        Map(SDL_SCANCODE_INSERT, SECONDARY);
-       Map(SDL_SCANCODE_RETURN, SECONDARY);
        Map(SDL_SCANCODE_MENU, TERTIARY);
        Map(SDL_SCANCODE_DELETE, PRIMARY);
        Map(SDL_SCANCODE_BACKSPACE, PRIMARY);
@@ -779,6 +793,7 @@ void Keymap::LoadDefault() {
        Map(SDL_SCANCODE_F2, TOGGLE_VIDEO);
        Map(SDL_SCANCODE_F3, TOGGLE_DEBUG);
        Map(SDL_SCANCODE_F4, TOGGLE_AUDIO);
+       Map(SDL_SCANCODE_F5, CAMERA_NEXT);
 
        Map(SDL_SCANCODE_ESCAPE, EXIT);
 }
@@ -864,6 +879,7 @@ std::map<std::string, Keymap::Action> action_map = {
        { "toggle_video", Keymap::TOGGLE_VIDEO },
        { "toggle_hud", Keymap::TOGGLE_HUD },
        { "toggle_debug", Keymap::TOGGLE_DEBUG },
+       { "camera_next", Keymap::CAMERA_NEXT },
 
        { "exit", Keymap::EXIT },
 };