X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2Fworld.cpp;h=e77192b277b46c8a592c9049f00601c59be1a08f;hb=150d065f431d665326fd8028748c48a74ad956bb;hp=a852038664a05410292a2e7bdd58ecfb0183f2de;hpb=80a9a59d71a7b144c12f64cbef4644751bd54745;p=blank.git diff --git a/src/world/world.cpp b/src/world/world.cpp index a852038..e77192b 100644 --- a/src/world/world.cpp +++ b/src/world/world.cpp @@ -1,4 +1,5 @@ #include "Entity.hpp" +#include "EntityController.hpp" #include "EntityDerivative.hpp" #include "EntityState.hpp" #include "Player.hpp" @@ -23,18 +24,68 @@ namespace blank { Entity::Entity() noexcept -: model() +: ctrl(nullptr) +, model() , id(-1) , name("anonymous") , bounds() , state() -, tgt_vel(0.0f) +, max_vel(5.0f) +, max_force(25.0f) , ref_count(0) , world_collision(false) -, dead(false) { +, dead(false) +, owns_controller(false) { } +Entity::~Entity() noexcept { + UnsetController(); +} + +Entity::Entity(const Entity &other) noexcept +: ctrl(other.ctrl) +, model(other.model) +, id(-1) +, name(other.name) +, bounds(other.bounds) +, state(other.state) +, max_vel(other.max_vel) +, max_force(other.max_force) +, ref_count(0) +, world_collision(other.world_collision) +, dead(other.dead) +, owns_controller(false) { + +} + +void Entity::SetController(EntityController *c) noexcept { + UnsetController(); + ctrl = c; + owns_controller = true; +} + +void Entity::SetController(EntityController &c) noexcept { + UnsetController(); + ctrl = &c; + owns_controller = false; +} + +void Entity::UnsetController() noexcept { + if (ctrl && owns_controller) { + delete ctrl; + } + ctrl = nullptr; +} + +glm::vec3 Entity::ControlForce(const EntityState &s) const noexcept { + if (HasController()) { + return GetController().ControlForce(s); + } else { + return -s.velocity; + } +} + void Entity::Position(const glm::ivec3 &c, const glm::vec3 &b) noexcept { state.chunk_pos = c; state.block_pos = b; @@ -91,6 +142,17 @@ void Entity::UpdateModel() noexcept { } } +void Entity::Update(float dt) { + if (HasController()) { + GetController().Update(*this, dt); + } +} + + +EntityController::~EntityController() { + +} + EntityState::EntityState() : chunk_pos(0) @@ -396,6 +458,9 @@ bool World::Intersection(const Entity &e, const EntityState &s, std::vector