]> git.localhorst.tv Git - blank.git/commitdiff
reference count entities for safer removal
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Thu, 27 Aug 2015 14:13:41 +0000 (16:13 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Thu, 27 Aug 2015 14:13:41 +0000 (16:13 +0200)
src/ai/Spawner.cpp
src/ai/ai.cpp
src/app/FPSController.cpp
src/app/FPSController.hpp
src/world/Entity.cpp
src/world/Entity.hpp

index 6d5549faf6eaffb7afdaa0d0b88ae385ef0f8e53..5b54c3eb56cd03dbb827f20bc754db5dbfb55a26 100644 (file)
@@ -68,9 +68,14 @@ void Spawner::CheckDespawn() noexcept {
        const Entity &reference = world.Player();
        for (auto iter = controllers.begin(), end = controllers.end(); iter != end;) {
                Entity &e = (*iter)->Controlled();
+               if (e.Dead()) {
+                       delete *iter;
+                       iter = controllers.erase(iter);
+                       continue;
+               }
                glm::vec3 diff(reference.AbsoluteDifference(e));
                if (dot(diff, diff) > despawn_range) {
-                       e.Remove();
+                       e.Kill();
                        delete *iter;
                        iter = controllers.erase(iter);
                } else {
index fd03ebb4fec74e0cf3309f41e9ba44bee6546f1c..e0fb9555adc0430d5f32daeeaa137b3771064588 100644 (file)
@@ -20,11 +20,11 @@ Chaser::Chaser(World &world, Entity &ctrl, Entity &tgt) noexcept
 , flee_speed(-0.005f)
 , stop_dist(10)
 , flee_dist(5) {
-
+       tgt.Ref();
 }
 
 Chaser::~Chaser() {
-
+       tgt.UnRef();
 }
 
 void Chaser::Update(int dt) {
@@ -53,11 +53,11 @@ void Chaser::Update(int dt) {
 
 Controller::Controller(Entity &e) noexcept
 : entity(e) {
-
+       entity.Ref();
 }
 
 Controller::~Controller() {
-
+       entity.UnRef();
 }
 
 
index 7f8c2c197b955c40e437b40f8911c69dd2b89158..87591aa254b6d4764c3be09127e192af8234fad3 100644 (file)
@@ -10,7 +10,11 @@ FPSController::FPSController(Entity &entity) noexcept
 : entity(entity)
 , pitch(0)
 , yaw(0) {
+       entity.Ref();
+}
 
+FPSController::~FPSController() {
+       entity.UnRef();
 }
 
 
index a7b11a417eff960fb31a6504e12c592439a48b1f..ee10691ec3660cf78f8eb2b21b4927feadee4176 100644 (file)
@@ -17,6 +17,7 @@ class FPSController {
 
 public:
        explicit FPSController(Entity &) noexcept;
+       ~FPSController();
 
        Entity &Controlled() noexcept { return entity; }
        const Entity &Controlled() const noexcept { return entity; }
index fb62f2757d545757f35fcff11132295e4b33e6fd..f116153e640a467eec61b434860e118e1369e150 100644 (file)
@@ -21,8 +21,9 @@ Entity::Entity() noexcept
 , velocity(0, 0, 0)
 , chunk(0, 0, 0)
 , angular_velocity(0.0f)
+, ref_count(0)
 , world_collision(false)
-, remove(false) {
+, dead(false) {
 
 }
 
index ae14297bb0baf282a3ddef142285a262a95c11b6..ef5e4e32eb92ce4667e233d85f3b485a3aeffcf6 100644 (file)
@@ -61,8 +61,12 @@ public:
        glm::mat4 Transform(const Chunk::Pos &chunk_offset) const noexcept;
        Ray Aim(const Chunk::Pos &chunk_offset) const noexcept;
 
-       void Remove() noexcept { remove = true; }
-       bool CanRemove() const noexcept { return remove; }
+       void Ref() noexcept { ++ref_count; }
+       void UnRef() noexcept { --ref_count; }
+       void Kill() noexcept { dead = true; }
+       bool Referenced() const noexcept { return ref_count > 0; }
+       bool Dead() const noexcept { return dead; }
+       bool CanRemove() const noexcept { return dead && ref_count <= 0; }
 
        void Update(int dt) noexcept;
 
@@ -82,8 +86,10 @@ private:
 
        glm::vec3 angular_velocity;
 
+       int ref_count;
+
        bool world_collision;
-       bool remove;
+       bool dead;
 
 };