, id(-1)
, name("anonymous")
, bounds()
+, radius(0.0f)
, state()
, heading(0.0f, 0.0f, -1.0f)
, max_vel(5.0f)
}
bool World::Intersection(const Entity &e, const EntityState &s, std::vector<WorldCollision> &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(