]> git.localhorst.tv Git - blank.git/blobdiff - src/world/world.cpp
tentative optimization of chunk intersection test
[blank.git] / src / world / world.cpp
index 51c060c1c5bf411c183e01da278f2ab12422e451..3a1aac251f0bbb71cb9cd1414b9e55533ce9bd86 100644 (file)
@@ -33,6 +33,7 @@ Entity::Entity() noexcept
 , id(-1)
 , name("anonymous")
 , bounds()
+, radius(0.0f)
 , state()
 , heading(0.0f, 0.0f, -1.0f)
 , max_vel(5.0f)
@@ -520,10 +521,24 @@ bool World::Intersection(
 }
 
 bool World::Intersection(const Entity &e, const EntityState &s, std::vector<WorldCollision> &col) {
+       // TODO: make special case for entities here and in Chunk::Intersection so entity's bounding radius
+       //       doesn't have to be calculated over and over again (sqrt)
        AABB box = e.Bounds();
        glm::ivec3 reference = s.pos.chunk;
        glm::mat4 M = s.Transform(reference);
-       return Intersection(box, M, reference, col);
+
+       bool any = false;
+       for (Chunk &cur_chunk : chunks) {
+               if (manhattan_radius(cur_chunk.Position() - reference) > 1) {
+                       // chunk is not one of the 3x3x3 surrounding the entity
+                       // since there's no entity which can extent over 16 blocks, they can be skipped
+                       continue;
+               }
+               if (cur_chunk.Intersection(box, M, cur_chunk.Transform(reference), col)) {
+                       any = true;
+               }
+       }
+       return any;
 }
 
 bool World::Intersection(