]> git.localhorst.tv Git - blank.git/blobdiff - src/ui/ui.cpp
try to cleanly destruct world
[blank.git] / src / ui / ui.cpp
index 618aff44742117f4965adeaaaa3a4240e7f2055f..02f2781c5e8f9cdb2326c1933092fd9105569ff1 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/CongestionControl.hpp"
 #include "../world/BlockLookup.hpp"
 #include "../world/World.hpp"
 #include "../world/WorldManipulator.hpp"
@@ -59,7 +61,13 @@ void PlayerController::SetMovement(const glm::vec3 &m) noexcept {
 }
 
 glm::vec3 PlayerController::ControlForce(const Entity &e, const EntityState &s) const {
-       return TargetVelocity(rotateY(move_dir * e.MaxVelocity(), s.yaw), s, 5.0f);
+       if (!iszero(move_dir)) {
+               // scale input by max velocity, apply yaw, and transform to world space
+               return TargetVelocity(glm::vec3(glm::vec4(rotateY(move_dir * e.MaxVelocity(), s.yaw), 0.0f) * transpose(e.Transform())), s, 5.0f);
+       } else {
+               // target velocity of 0 is the same as halt
+               return Halt(s, 5.0f);
+       }
 }
 
 void PlayerController::TurnHead(float dp, float dy) noexcept {
@@ -89,10 +97,10 @@ 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)) {
+               if (!world.Intersection(aim, player.GetEntity().ChunkCoords(), aim_world)) {
                        aim_world = WorldCollision();
                }
-               if (!world.Intersection(aim, glm::mat4(1.0f), player.GetEntity(), aim_entity)) {
+               if (!world.Intersection(aim, player.GetEntity(), aim_entity)) {
                        aim_entity = EntityCollision();
                }
                if (aim_world && aim_entity) {
@@ -208,6 +216,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)
@@ -248,6 +261,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));
@@ -348,8 +375,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());
 }
 
@@ -361,6 +388,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()) {
@@ -392,6 +440,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);
 
@@ -424,6 +474,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);
+               }
        }
 }
 
@@ -463,7 +518,6 @@ Interface::Interface(
 , client_ctrl(cc)
 , fwd(0)
 , rev(0)
-, slot(0)
 , num_slots(10)
 , locked(false) {
 
@@ -663,7 +717,7 @@ void Interface::UpdateMovement() {
 }
 
 void Interface::InvAbs(int s) {
-       slot = s % num_slots;
+       int slot = s % num_slots;
        while (slot < 0) {
                slot += num_slots;
        }
@@ -671,7 +725,7 @@ void Interface::InvAbs(int s) {
 }
 
 void Interface::InvRel(int delta) {
-       InvAbs(slot + delta);
+       InvAbs(player_ctrl.GetPlayer().GetInventorySlot() + delta);
 }