]> git.localhorst.tv Git - blank.git/blob - src/app/FPSController.hpp
ee10691ec3660cf78f8eb2b21b4927feadee4176
[blank.git] / src / app / FPSController.hpp
1 #ifndef BLANK_APP_FPSCONTROLLER_HPP_
2 #define BLANK_APP_FPSCONTROLLER_HPP_
3
4 #include "../model/geometry.hpp"
5 #include "../world/Entity.hpp"
6
7 #include <glm/glm.hpp>
8
9
10 namespace blank {
11
12 /// Sets entity rotation and velocity according to stored velocity
13 /// and pitch/yaw components.
14 /// Rotation is applied in yaw,pitch order (YX). Velocity is relative
15 /// to yaw only (Y axis).
16 class FPSController {
17
18 public:
19         explicit FPSController(Entity &) noexcept;
20         ~FPSController();
21
22         Entity &Controlled() noexcept { return entity; }
23         const Entity &Controlled() const noexcept { return entity; }
24
25         /// get position and face direction of controlled entity
26         Ray Aim() const noexcept { return entity.Aim(entity.ChunkCoords()); }
27
28         /// velocity, relative to heading (yaw only)
29         const glm::vec3 &Velocity() const noexcept { return velocity; }
30         void Velocity(const glm::vec3 &vel) noexcept { velocity = vel; }
31
32         // all angles in radians (full circle = 2π)
33         float Pitch() const noexcept { return pitch; }
34         void Pitch(float p) noexcept;
35         void RotatePitch(float delta) noexcept;
36         float Yaw() const noexcept { return yaw; }
37         void Yaw(float y) noexcept;
38         void RotateYaw(float delta) noexcept;
39
40         void Update(int dt) noexcept;
41
42 private:
43         Entity &entity;
44
45         glm::vec3 velocity;
46
47         float pitch;
48         float yaw;
49
50 };
51
52 }
53
54 #endif