X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2FEntity.hpp;h=b140a08d95d7b21db850ef1966f841ffccf938f3;hb=3e7901a804ef85eea01adfb60274218748c0337b;hp=3bcc21f65f2573a456d094bb3a0656c1b1001e99;hpb=ec40d74319e24480c00f63cb6cfdbd6e1c454f3d;p=blank.git diff --git a/src/world/Entity.hpp b/src/world/Entity.hpp index 3bcc21f..b140a08 100644 --- a/src/world/Entity.hpp +++ b/src/world/Entity.hpp @@ -2,7 +2,9 @@ #define BLANK_WORLD_ENTITY_HPP_ #include "Chunk.hpp" +#include "EntityDerivative.hpp" #include "EntityState.hpp" +#include "Steering.hpp" #include "../geometry/primitive.hpp" #include "../model/Instance.hpp" @@ -17,6 +19,7 @@ namespace blank { class DirectionalLighting; class EntityController; class Shape; +class World; class Entity { @@ -30,6 +33,9 @@ public: Entity(const Entity &) noexcept; Entity &operator =(const Entity &) = delete; + Steering &GetSteering() noexcept { return steering; } + const Steering &GetSteering() const noexcept { return steering; } + bool HasController() const noexcept { return ctrl; } // entity takes over ownership of controller void SetController(EntityController *c) noexcept; @@ -49,7 +55,9 @@ public: void Name(const std::string &n) { name = n; } const AABB &Bounds() const noexcept { return bounds; } - void Bounds(const AABB &b) noexcept { bounds = b; } + // get distance between local origin and farthest vertex + float Radius() const noexcept { return radius; } + void Bounds(const AABB &b) noexcept { bounds = b; radius = b.OriginRadius(); } bool WorldCollidable() const noexcept { return world_collision; } void WorldCollidable(bool b) noexcept { world_collision = b; } @@ -87,7 +95,9 @@ public: void SetHead(float pitch, float yaw) noexcept; /// get a transform for this entity's coordinate space - const glm::mat4 Transform() const noexcept { return model_transform; } + const glm::mat4 &Transform() const noexcept { return model_transform; } + /// get the entity's local up vector + const glm::vec4 &Up() const noexcept { return model_transform[1]; } /// get a transform for this entity's coordinate space relative to reference chunk glm::mat4 Transform(const glm::ivec3 &reference) const noexcept; /// get a transform for this entity's view space relative to reference chunk @@ -112,13 +122,14 @@ public: bool Dead() const noexcept { return dead; } bool CanRemove() const noexcept { return dead && ref_count <= 0; } - void Update(float dt); + void Update(World &, float dt); void Render(const glm::mat4 &M, DirectionalLighting &prog) noexcept { if (model) model.Render(M, prog); } private: + void UpdatePhysics(World &, float dt); void UpdateTransforms() noexcept; void UpdateHeading() noexcept; void UpdateModel(float dt) noexcept; @@ -128,7 +139,16 @@ public: private: void OrientHead(float dt) noexcept; + EntityDerivative CalculateStep( + World &, + const EntityState &cur, + float dt, + const EntityDerivative &prev + ) const; + + private: + Steering steering; EntityController *ctrl; Instance model; @@ -136,6 +156,7 @@ private: std::string name; AABB bounds; + float radius; EntityState state; /// chunk to model space @@ -149,6 +170,9 @@ private: // TODO: I'd prefer a drag solution float max_vel; + // TODO: split max_force into (local) axes? + // e.g. players may want to disable vertical thrust under certain + // conditions (e.g. "walking" ^^) float max_force; int ref_count;