X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fui%2FPlayerController.hpp;h=9cf0bca465eb3550af7c009dfd4049f73b1c2679;hb=f5de855fbd4bf5b0df1cad950cbe9069e41369ca;hp=8d9e5a37247c3ca0622b70dd11cdb5cc0218a4ad;hpb=b066e776622f96e906600a0c4a08de392bd03676;p=blank.git diff --git a/src/ui/PlayerController.hpp b/src/ui/PlayerController.hpp index 8d9e5a3..9cf0bca 100644 --- a/src/ui/PlayerController.hpp +++ b/src/ui/PlayerController.hpp @@ -3,16 +3,47 @@ #include +#include "../world/EntityCollision.hpp" +#include "../world/EntityController.hpp" +#include "../world/WorldCollision.hpp" + namespace blank { -struct PlayerController { +class Player; +class World; + +class PlayerController +: public EntityController { + +public: + PlayerController(World &, Player &); + ~PlayerController(); + + World &GetWorld() noexcept { return world; } + const World &GetWorld() const noexcept { return world; } + Player &GetPlayer() noexcept { return player; } + const Player &GetPlayer() const noexcept { return player; } + + WorldCollision &BlockFocus() noexcept { return aim_world; } + const WorldCollision &BlockFocus() const noexcept { return aim_world; } + EntityCollision &EntityFocus() noexcept { return aim_entity; } + const EntityCollision &EntityFocus() const noexcept { return aim_entity; } /// set desired direction of movement /// the magnitude (clamped to [0..1]) can be used to attenuate target velocity - virtual void SetMovement(const glm::vec3 &) = 0; + void SetMovement(const glm::vec3 &) noexcept; + const glm::vec3 &GetMovement() const noexcept { return move_dir; } + + glm::vec3 ControlForce(const Entity &, const EntityState &) const override; + /// turn the controlled entity's head by given pitch and yaw deltas - virtual void TurnHead(float pitch, float yaw) = 0; + void TurnHead(float pitch, float yaw) noexcept; + + /// get player pitch in radians, normalized to [-PI/2,PI/2] + float GetPitch() const noexcept; + /// get player yaw in radians, normalized to [-PI,PI] + float GetYaw() const noexcept; /// start doing primary action /// what exactly this means depends on the active item @@ -26,7 +57,21 @@ struct PlayerController { virtual void StopTertiaryAction() = 0; /// set the item at given inventory slot as active - virtual void SelectInventory(int) = 0; + void SelectInventory(int) noexcept; + int InventorySlot() const noexcept; + +protected: + void Invalidate() noexcept; + void UpdatePlayer() noexcept; + +private: + World &world; + Player &player; + glm::vec3 move_dir; + bool dirty; + + WorldCollision aim_world; + EntityCollision aim_entity; };