#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"
}
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 {
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) {
, 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)
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));
}
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: " << glm::degrees(player.GetEntity().Pitch())
+ << ", yaw: " << glm::degrees(player.GetEntity().Yaw());
+ orientation_text.Set(env.assets.small_ui_font, s.str());
}
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()) {
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);
} else if (show_entity) {
entity_text.Render(viewport);
}
+ if (show_net) {
+ bandwidth_text.Render(viewport);
+ rtt_text.Render(viewport);
+ packet_loss_text.Render(viewport);
+ }
}
}
, client_ctrl(cc)
, fwd(0)
, rev(0)
-, slot(0)
, num_slots(10)
, locked(false) {
}
void Interface::InvAbs(int s) {
- slot = s % num_slots;
+ int slot = s % num_slots;
while (slot < 0) {
slot += num_slots;
}
}
void Interface::InvRel(int delta) {
- InvAbs(slot + delta);
+ InvAbs(player_ctrl.GetPlayer().GetInventorySlot() + delta);
}