X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;ds=sidebyside;f=src%2Fworld%2Fworld.cpp;h=c43747a8c89f60089e560d54dbb49b01ce97a930;hb=e20be973f6ef23164ae54398088e1b14d9bac3ab;hp=51c060c1c5bf411c183e01da278f2ab12422e451;hpb=4727825186798902f68df5b99a6a32f0ef618454;p=blank.git diff --git a/src/world/world.cpp b/src/world/world.cpp index 51c060c..c43747a 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,23 @@ bool World::Intersection( } bool World::Intersection(const Entity &e, const EntityState &s, std::vector &col) { - AABB box = e.Bounds(); + // 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) 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(e, M, cur_chunk.Transform(reference), col)) { + any = true; + } + } + return any; } bool World::Intersection(