#include "Generator.hpp"
#include "WorldCollision.hpp"
-#include "WorldSave.hpp"
+#include "../io/WorldSave.hpp"
#include <algorithm>
#include <limits>
++next;
// unlink neighbors so they won't reference a dead chunk
chunk->ClearNeighbors();
+ // if it should be saved, do it now
+ if (chunk->ShouldUpdateSave()) {
+ save.Write(*chunk);
+ }
// and move it from loaded to free list
to_free.splice(to_free.end(), loaded, chunk);
return next;
}
void ChunkLoader::Update(int dt) {
- // check if a chunk generation is scheduled for this frame
- // and if there's a chunk waiting to be generated
+ // check if a chunk load is scheduled for this frame
+ // and if there's chunks waiting to be loaded
gen_timer.Update(dt);
if (gen_timer.Hit()) {
- LoadOne();
+ // we may
+ // load until one of load or generation limits was hit
+ constexpr int max_load = 10;
+ constexpr int max_gen = 1;
+ int loaded = 0;
+ int generated = 0;
+ while (!to_load.empty() && loaded < max_load && generated < max_gen) {
+ if (LoadOne()) {
+ ++generated;
+ } else {
+ ++loaded;
+ }
+ }
}
constexpr int max_save = 10;
}
}
-void ChunkLoader::LoadOne() {
- if (to_load.empty()) return;
+bool ChunkLoader::LoadOne() {
+ if (to_load.empty()) return false;
// take position of next chunk in queue
Chunk::Pos pos(to_load.front());
if (iter->Position() == pos) {
loaded.splice(loaded.end(), to_free, iter);
Insert(loaded.back());
- return;
+ return false;
}
}
loaded.splice(loaded.end(), to_free, to_free.begin());
}
+ bool generated = false;
Chunk &chunk = loaded.back();
chunk.Position(pos);
if (save.Exists(pos)) {
save.Read(chunk);
} else {
gen(chunk);
+ generated = true;
}
Insert(chunk);
+ return generated;
}
}