-
- CheckChunkGeneration();
-}
-
-void World::CheckChunkGeneration() {
- if (player.ChunkCoords() != player_chunk) {
- player_chunk = player.ChunkCoords();
-
- constexpr int max_dist = 8;
- // unload far away chunks
- for (auto iter(loaded.begin()), end(loaded.end()); iter != end;) {
- if (std::abs(player_chunk.x - iter->Position().x) > max_dist
- || std::abs(player_chunk.y - iter->Position().y) > max_dist
- || std::abs(player_chunk.z - iter->Position().z) > max_dist) {
- auto saved = iter;
- ++iter;
- to_free.splice(to_free.end(), loaded, saved);
- } else {
- ++iter;
- }
- }
- // abort far away queued chunks
- for (auto iter(to_generate.begin()), end(to_generate.end()); iter != end;) {
- if (std::abs(player_chunk.x - iter->Position().x) > max_dist
- || std::abs(player_chunk.y - iter->Position().y) > max_dist
- || std::abs(player_chunk.z - iter->Position().z) > max_dist) {
- iter = to_generate.erase(iter);
- } else {
- ++iter;
- }
- }
- // add missing new chunks
- const Chunk::Pos offset(max_dist, max_dist, max_dist);
- Generate(player_chunk - offset, player_chunk + offset);
- }
-
- if (!to_generate.empty()) {
- generate(to_generate.front());
- loaded.splice(loaded.end(), to_generate, to_generate.begin());
- }
-
- if (!to_free.empty()) {
- to_free.pop_front();
- }