X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2FEntity.hpp;h=0117fa9cb0d0801deb53750c54b0b93c2d236cc1;hb=b94a7dc7daad9ae9be90a39d723e332dae375325;hp=2a4ef89093ff848556841669839c95965f7614e3;hpb=4727825186798902f68df5b99a6a32f0ef618454;p=blank.git diff --git a/src/world/Entity.hpp b/src/world/Entity.hpp index 2a4ef89..0117fa9 100644 --- a/src/world/Entity.hpp +++ b/src/world/Entity.hpp @@ -2,6 +2,7 @@ #define BLANK_WORLD_ENTITY_HPP_ #include "Chunk.hpp" +#include "EntityDerivative.hpp" #include "EntityState.hpp" #include "../geometry/primitive.hpp" #include "../model/Instance.hpp" @@ -17,6 +18,7 @@ namespace blank { class DirectionalLighting; class EntityController; class Shape; +class World; class Entity { @@ -49,7 +51,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; } @@ -77,6 +81,7 @@ public: } /// orientation of local coordinate system + void Orientation(const glm::quat &o) noexcept { state.orient = o; } const glm::quat &Orientation() const noexcept { return state.orient; } /// orientation of head within local coordinate system, in radians @@ -111,13 +116,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; @@ -127,6 +133,14 @@ public: private: void OrientHead(float dt) noexcept; + EntityDerivative CalculateStep( + World &, + const EntityState &cur, + float dt, + const EntityDerivative &prev + ) const; + + private: EntityController *ctrl; Instance model; @@ -135,6 +149,7 @@ private: std::string name; AABB bounds; + float radius; EntityState state; /// chunk to model space @@ -148,6 +163,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;