X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld.cpp;h=675c29ffbb97a284737974053ae61c86cc22fa2c;hb=1b022dd17364c9e3344afd86572f2ead14973cde;hp=46abf711facdfc85ea497bd8ee8f555f44dc767e;hpb=a58c4558e7d4934f4d0ee621520acfe1c8258c93;p=blank.git diff --git a/src/world.cpp b/src/world.cpp index 46abf71..675c29f 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -15,8 +15,8 @@ World::World() , chunks(blockType, generate) , player() { BlockType::Faces block_fill = { true, true, true, true, true, true }; - BlockType::Faces slab_fill = { false, false, false, true, false, false }; - BlockType::Faces stair_fill = { true, false, false, true, false, false }; + BlockType::Faces slab_fill = { false, true, false, false, false, false }; + BlockType::Faces stair_fill = { false, true, false, false, false, true }; { // white block BlockType type(true, { 1.0f, 1.0f, 1.0f }, &blockShape); @@ -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;