: world(world)
, player(player)
, move_dir(0.0f)
-, pitch(0.0f)
-, yaw(0.0f)
, dirty(true)
, aim_world()
, aim_entity() {
-
+ player.GetEntity().SetController(*this);
}
void PlayerController::SetMovement(const glm::vec3 &m) noexcept {
Invalidate();
}
+glm::vec3 PlayerController::ControlForce(const EntityState &s) const {
+ glm::vec3 target(rotateY(move_dir * player.GetEntity().MaxVelocity(), s.yaw) - s.velocity);
+ return target * player.GetEntity().MaxControlForce();
+}
+
void PlayerController::TurnHead(float dp, float dy) noexcept {
- pitch += dp;
- if (pitch > PI / 2) {
- pitch = PI / 2;
- } else if (pitch < -PI / 2) {
- pitch = -PI / 2;
- }
- yaw += dy;
- if (yaw > PI) {
- yaw -= PI * 2;
- } else if (yaw < -PI) {
- yaw += PI * 2;
- }
- Invalidate();
+ player.GetEntity().TurnHead(dp, dy);
+}
+
+float PlayerController::GetPitch() const noexcept {
+ return player.GetEntity().Pitch();
+}
+
+float PlayerController::GetYaw() const noexcept {
+ return player.GetEntity().Yaw();
}
void PlayerController::SelectInventory(int i) noexcept {
}
void PlayerController::UpdatePlayer() noexcept {
- constexpr float max_vel = 5.0f; // in m/s
if (dirty) {
- player.GetEntity().Orientation(glm::quat(glm::vec3(0.0f, yaw, 0.0f)));
- player.GetEntity().GetModel().EyesState().orientation = glm::quat(glm::vec3(pitch, 0.0f, 0.0f));
- player.GetEntity().TargetVelocity(glm::rotateY(move_dir * max_vel, yaw));
-
Ray aim = player.Aim();
if (!world.Intersection(aim, glm::mat4(1.0f), player.GetEntity().ChunkCoords(), aim_world)) {
aim_world = WorldCollision();
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();
, 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;
}
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);