X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2Fworld.cpp;h=738fa4ad9b06bb7256f66886bfeca86bd5e3bd2c;hb=1bc2f230105ad6e1ee8d999ddc079cd85d244bf9;hp=51c060c1c5bf411c183e01da278f2ab12422e451;hpb=4727825186798902f68df5b99a6a32f0ef618454;p=blank.git diff --git a/src/world/world.cpp b/src/world/world.cpp index 51c060c..738fa4a 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) @@ -339,7 +340,20 @@ World::World(const BlockTypeRegistry &types, const Config &config) } World::~World() { - + for (Entity &e : entities) { + e.Kill(); + } + std::size_t removed = 0; + do { + removed = 0; + for (auto e = entities.begin(), end = entities.end(); e != end; ++e) { + if (e->CanRemove()) { + e = RemoveEntity(e); + end = entities.end(); + ++removed; + } + } + } while (removed > 0 && !entities.empty()); } @@ -458,7 +472,6 @@ std::vector candidates; bool World::Intersection( const Ray &ray, - const glm::mat4 &M, const ExactLocation::Coarse &reference, WorldCollision &coll ) { @@ -466,7 +479,7 @@ bool World::Intersection( for (Chunk &cur_chunk : chunks) { float cur_dist; - if (cur_chunk.Intersection(ray, M * cur_chunk.Transform(reference), cur_dist)) { + if (cur_chunk.Intersection(ray, reference, cur_dist)) { candidates.push_back({ &cur_chunk, cur_dist }); } } @@ -482,7 +495,7 @@ bool World::Intersection( for (Candidate &cand : candidates) { if (cand.dist > coll.depth) continue; WorldCollision cur_coll; - if (cand.chunk->Intersection(ray, M * cand.chunk->Transform(reference), cur_coll)) { + if (cand.chunk->Intersection(ray, reference, cur_coll)) { if (cur_coll.depth < coll.depth) { coll = cur_coll; } @@ -494,7 +507,6 @@ bool World::Intersection( bool World::Intersection( const Ray &ray, - const glm::mat4 &M, const Entity &reference, EntityCollision &coll ) { @@ -506,7 +518,7 @@ bool World::Intersection( } float cur_dist; glm::vec3 cur_normal; - if (blank::Intersection(ray, cur_entity.Bounds(), M * cur_entity.Transform(reference.ChunkCoords()), &cur_dist, &cur_normal)) { + if (blank::Intersection(ray, cur_entity.Bounds(), cur_entity.Transform(reference.ChunkCoords()), &cur_dist, &cur_normal)) { // TODO: fine grained check goes here? maybe? if (cur_dist < coll.depth) { coll.entity = &cur_entity; @@ -520,10 +532,26 @@ 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); + + ExactLocation::Coarse begin(reference - 1); + ExactLocation::Coarse end(reference + 2); + + bool any = false; + for (ExactLocation::Coarse pos(begin); pos.z < end.y; ++pos.z) { + for (pos.y = begin.y; pos.y < end.y; ++pos.y) { + for (pos.x = begin.x; pos.x < end.x; ++pos.x) { + Chunk *chunk = chunks.Get(pos); + if (chunk && chunk->Intersection(e, M, chunk->Transform(reference), col)) { + any = true; + } + } + } + } + return any; } bool World::Intersection(