X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld.cpp;h=675c29ffbb97a284737974053ae61c86cc22fa2c;hb=1b022dd17364c9e3344afd86572f2ead14973cde;hp=5244d152bbe1326e190d2819120c1e54d7b3729f;hpb=30d36f3d545617faef76f90c4121d6ed118ba272;p=blank.git diff --git a/src/world.cpp b/src/world.cpp index 5244d15..675c29f 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -91,6 +91,17 @@ World::World() } +namespace { + +struct Candidate { + Chunk *chunk; + float dist; +}; + +std::vector candidates; + +} + bool World::Intersection( const Ray &ray, const glm::mat4 &M, @@ -98,18 +109,30 @@ bool World::Intersection( int *blkid, float *dist, glm::vec3 *normal) { + candidates.clear(); + + for (Chunk &cur_chunk : chunks.Loaded()) { + float cur_dist; + if (cur_chunk.Intersection(ray, M * cur_chunk.Transform(player.ChunkCoords()), cur_dist)) { + candidates.push_back({ &cur_chunk, cur_dist }); + } + } + + if (candidates.empty()) return false; + Chunk *closest_chunk = nullptr; - int closest_blkid = -1; float closest_dist = std::numeric_limits::infinity(); + int closest_blkid = -1; glm::vec3 closest_normal; - for (Chunk &cur_chunk : chunks.Loaded()) { + for (Candidate &cand : candidates) { + if (cand.dist > closest_dist) continue; int cur_blkid; float cur_dist; glm::vec3 cur_normal; - if (cur_chunk.Intersection(ray, M * cur_chunk.Transform(player.ChunkCoords()), &cur_blkid, &cur_dist, &cur_normal)) { + if (cand.chunk->Intersection(ray, M * cand.chunk->Transform(player.ChunkCoords()), cur_blkid, cur_dist, cur_normal)) { if (cur_dist < closest_dist) { - closest_chunk = &cur_chunk; + closest_chunk = cand.chunk; closest_blkid = cur_blkid; closest_dist = cur_dist; closest_normal = cur_normal;