#pragma once #include "../Common/FlexArray.hpp" #include "../Time.hpp" #include "../Transform.hpp" #include "../GFX/Camera.hpp" #include "../World/World.hpp" #include "../GFX/Window.hpp" #include "../Math/AABB.hpp" #include "../Math/Rotation.hpp" #include "../World/Position.hpp" namespace MC::Entities { class Player { public: explicit Player(Position::World position) : m_transform(position) {} void update(const Time& time, GFX::Window& window, GFX::Camera& camera, World::World& world); void move(Position::WorldOffset by); void move_to(Position::World to); void rotate(Rotation by); void rotate_to(Rotation to); AABB bounds() const; private: void update_camera_position(GFX::Camera& camera); static constexpr UInt MaxCollidingTerrain = 34; static std::vector terrain_collision_domain(Position::World from, Position::World to, World::World& world); // Creates a bounding box where `position` is at the center of the bottom face. static AABB bounding_box_for_position(Position::World position); // Returns position of the center of the bottom face of `box`. static Position::World position_for_bounding_box(AABB box); static Position::World collision_reposition(Position::World from, Position::World to, AABB colliding); Transform m_transform; static inline AABB s_bounds{{0.35, 1.8, 0.35}}; }; }