#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"
}
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) {
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());
}
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);
, client_ctrl(cc)
, fwd(0)
, rev(0)
-, slot(0)
, num_slots(10)
, locked(false) {
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:
}
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);
}
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);
}
{ "toggle_video", Keymap::TOGGLE_VIDEO },
{ "toggle_hud", Keymap::TOGGLE_HUD },
{ "toggle_debug", Keymap::TOGGLE_DEBUG },
+ { "camera_next", Keymap::CAMERA_NEXT },
{ "exit", Keymap::EXIT },
};