summaryrefslogtreecommitdiff
path: root/src/World
diff options
context:
space:
mode:
Diffstat (limited to 'src/World')
-rw-r--r--src/World/ChunkIndex.hpp4
-rw-r--r--src/World/World.cpp23
-rw-r--r--src/World/World.hpp8
3 files changed, 18 insertions, 17 deletions
diff --git a/src/World/ChunkIndex.hpp b/src/World/ChunkIndex.hpp
index bdb49b3..4701581 100644
--- a/src/World/ChunkIndex.hpp
+++ b/src/World/ChunkIndex.hpp
@@ -10,6 +10,10 @@ struct ChunkIndex {
ChunkIndex() : x(0), y(0) {}
ChunkIndex(int32_t x, int32_t y) : x(x), y(y) {}
+ Vector<3> middle() const {
+ return {(x + 0.5f) * Chunk::Width, Chunk::Height / 2.0f, (y + 0.5f) * Chunk::Width};
+ }
+
int32_t x, y;
};
diff --git a/src/World/World.cpp b/src/World/World.cpp
index 1782fd4..9d88af3 100644
--- a/src/World/World.cpp
+++ b/src/World/World.cpp
@@ -15,7 +15,7 @@ std::vector<World::ChunkData> World::get_visible_chunks(Vector<3> position) {
}
if (!updates.empty()) {
- process_chunk_visibility_updates(updates);
+ process_chunk_visibility_updates(updates, position);
m_visible_chunks = visible_chunks;
}
@@ -31,22 +31,19 @@ std::vector<World::ChunkData> World::get_visible_chunks(Vector<3> position) {
return chunks;
}
-void World::process_chunk_visibility_updates(std::unordered_set<ChunkIndex>& new_chunks) {
+void World::process_chunk_visibility_updates(std::unordered_set<ChunkIndex>& new_chunks, Vector<3> player) {
for (auto new_index: new_chunks) {
auto& data = get(new_index);
switch (data.status) {
case ChunkStatus::Empty:
- request_generation(new_index);
- data.status = ChunkStatus::InFlight;
- break;
- case ChunkStatus::InFlight:
- // Continue waiting...
+ request_generation(new_index, player.distance(new_index.middle()));
+ data.status = ChunkStatus::WaitingForGeneration;
break;
case ChunkStatus::Done:
- if (!data.mesh.has_value()) {
- auto mesh = data.chunk.value().mesh();
- data.mesh = GFX::Binder::load(mesh);
- }
+ data.mesh = GFX::Binder::load(data.chunk.value().mesh());
+ data.status = ChunkStatus::Done;
+ break;
+ case ChunkStatus::WaitingForGeneration:
break;
}
}
@@ -82,8 +79,8 @@ std::unordered_set<ChunkIndex> World::load_finished_chunks_from_queue() {
return indices;
}
-void World::request_generation(ChunkIndex index) {
- m_queue.add(index, [=]() {
+void World::request_generation(ChunkIndex index, float priority) {
+ m_queue.add(index, priority, [=]() {
return m_generator.generate(index.x, index.y);
});
}
diff --git a/src/World/World.hpp b/src/World/World.hpp
index dc8f8a7..d842600 100644
--- a/src/World/World.hpp
+++ b/src/World/World.hpp
@@ -12,11 +12,11 @@ namespace MC::World {
class World {
public:
- World() : m_queue(2), m_chunks(), m_visible_chunks() {}
+ World() : m_queue(8), m_chunks(), m_visible_chunks() {}
enum class ChunkStatus {
Empty,
- InFlight,
+ WaitingForGeneration,
Done
};
@@ -31,8 +31,8 @@ public:
private:
std::unordered_set<ChunkIndex> get_visible_chunk_indices(Vector<3> position) const;
std::unordered_set<ChunkIndex> load_finished_chunks_from_queue();
- void process_chunk_visibility_updates(std::unordered_set<ChunkIndex>& new_chunks);
- void request_generation(ChunkIndex index);
+ void process_chunk_visibility_updates(std::unordered_set<ChunkIndex>& new_chunks, Vector<3> player);
+ void request_generation(ChunkIndex index, float priority);
ChunkData& get(ChunkIndex index);