X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2Fworld.cpp;h=3a1aac251f0bbb71cb9cd1414b9e55533ce9bd86;hb=ee920127d653b8a3cfbee1efefde909ffa177662;hp=51c060c1c5bf411c183e01da278f2ab12422e451;hpb=4727825186798902f68df5b99a6a32f0ef618454;p=blank.git diff --git a/src/world/world.cpp b/src/world/world.cpp index 51c060c..3a1aac2 100644 --- a/src/world/world.cpp +++ b/src/world/world.cpp @@ -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 &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(