summaryrefslogtreecommitdiff
path: root/src/World
diff options
context:
space:
mode:
Diffstat (limited to 'src/World')
-rw-r--r--src/World/Chunk.cpp2
-rw-r--r--src/World/Chunk.hpp2
-rw-r--r--src/World/ChunkIndex.hpp4
-rw-r--r--src/World/Generation/ChunkMeshing.cpp10
-rw-r--r--src/World/Generation/ChunkMeshing.hpp2
-rw-r--r--src/World/Generation/Generator.cpp15
-rw-r--r--src/World/Generation/Generator.hpp5
-rw-r--r--src/World/World.cpp10
-rw-r--r--src/World/World.hpp4
9 files changed, 25 insertions, 29 deletions
diff --git a/src/World/Chunk.cpp b/src/World/Chunk.cpp
index b75516f..079575a 100644
--- a/src/World/Chunk.cpp
+++ b/src/World/Chunk.cpp
@@ -15,7 +15,7 @@ bool Chunk::is_empty(uint32_t x, uint32_t y, uint32_t z) const {
return get(x, y, z).empty();
}
-Vector<3> Chunk::position() {
+Vector<3> Chunk::position() const {
return m_position;
}
diff --git a/src/World/Chunk.hpp b/src/World/Chunk.hpp
index 8780700..b3eb06f 100644
--- a/src/World/Chunk.hpp
+++ b/src/World/Chunk.hpp
@@ -39,7 +39,7 @@ public:
void set_details(const Details& details) { m_details = details; }
Details& details(){ return m_details; }
- Vector<3> position();
+ Vector<3> position() const;
static bool is_valid_position(uint32_t x, uint32_t y, uint32_t z);
private:
diff --git a/src/World/ChunkIndex.hpp b/src/World/ChunkIndex.hpp
index 4701581..ef61f24 100644
--- a/src/World/ChunkIndex.hpp
+++ b/src/World/ChunkIndex.hpp
@@ -1,8 +1,6 @@
#pragma once
#include <cstdint>
-#include <cstdlib>
-#include <functional>
namespace MC::World {
@@ -27,6 +25,6 @@ template<> struct std::equal_to<MC::World::ChunkIndex> {
template<> struct std::hash<MC::World::ChunkIndex> {
size_t operator()(const MC::World::ChunkIndex& i) const noexcept {
- return ((int64_t)i.x << 32) | i.y;
+ return (int64_t)i.x << 32 | i.y;
}
}; \ No newline at end of file
diff --git a/src/World/Generation/ChunkMeshing.cpp b/src/World/Generation/ChunkMeshing.cpp
index 54abc85..0494da4 100644
--- a/src/World/Generation/ChunkMeshing.cpp
+++ b/src/World/Generation/ChunkMeshing.cpp
@@ -83,7 +83,7 @@ std::array<Vector<3>, 4> face_normals(BlockSide side) {
return {normal, normal, normal, normal};
}
-bool is_face_visible(Chunk& chunk, ChunkMeshing::ChunkNeighbors neighbors, uint32_t x, uint32_t y, uint32_t z, BlockSide side) {
+bool is_face_visible(Chunk& chunk, const ChunkMeshing::ChunkNeighbors& neighbors, uint32_t x, uint32_t y, uint32_t z, BlockSide side) {
Vector<3, int32_t> offset{};
switch (side) {
case BlockSide::Front:
@@ -128,15 +128,15 @@ bool is_face_visible(Chunk& chunk, ChunkMeshing::ChunkNeighbors neighbors, uint3
chunk_to_ask = &chunk;
}
- auto neighbor = chunk_to_ask->get(neighbor_pos.x(), neighbor_pos.y(), neighbor_pos.z());
- if (neighbor.type == BlockType::Air) {
+ auto [neighbor] = chunk_to_ask->get(neighbor_pos.x(), neighbor_pos.y(), neighbor_pos.z());
+ if (neighbor == BlockType::Air) {
return true;
}
return false;
}
-GFX::Mesh ChunkMeshing::create_mesh_for_chunk(Chunk& chunk, ChunkMeshing::ChunkNeighbors neighbors) {
+GFX::Mesh ChunkMeshing::create_mesh_for_chunk(Chunk& chunk, const ChunkNeighbors& neighbors) {
std::vector<Vector<3>> positions{};
std::vector<Vector<3>> normals{};
std::vector<Vector<2>> tex_coords{};
@@ -174,7 +174,7 @@ GFX::Mesh ChunkMeshing::create_mesh_for_chunk(Chunk& chunk, ChunkMeshing::ChunkN
}
}
- return {
+ return GFX::Mesh{
{positions, normals, tex_coords},
indices,
};
diff --git a/src/World/Generation/ChunkMeshing.hpp b/src/World/Generation/ChunkMeshing.hpp
index a4fed25..6ec77af 100644
--- a/src/World/Generation/ChunkMeshing.hpp
+++ b/src/World/Generation/ChunkMeshing.hpp
@@ -6,6 +6,6 @@
namespace MC::World::Generation::ChunkMeshing {
struct ChunkNeighbors { Chunk &north, &east, &south, &west; };
-GFX::Mesh create_mesh_for_chunk(Chunk& chunk, ChunkNeighbors neighbors);
+GFX::Mesh create_mesh_for_chunk(Chunk& chunk, const ChunkNeighbors& neighbors);
}
diff --git a/src/World/Generation/Generator.cpp b/src/World/Generation/Generator.cpp
index af3c54d..19a3dc8 100644
--- a/src/World/Generation/Generator.cpp
+++ b/src/World/Generation/Generator.cpp
@@ -9,11 +9,11 @@ Chunk Generator::generate(int64_t chunk_x, int64_t chunk_y) {
auto landmass_map = generate_landmass_map(chunk_x, chunk_y);
auto hill_map = generate_hill_map(chunk_x, chunk_y);
- auto height_map = generate_height_map(landmass_map, hill_map, chunk_x, chunk_y);
+ auto height_map = generate_height_map(landmass_map, hill_map);
auto temperature_map = generate_temperature_map(chunk_x, chunk_y);
auto humidity_map = generate_humidity_map(chunk_x, chunk_y);
- auto biome_map = generate_biome_map(landmass_map, hill_map, temperature_map, humidity_map, chunk_x, chunk_y);
+ auto biome_map = generate_biome_map(landmass_map, hill_map, temperature_map, humidity_map);
auto terrain_map = generate_terrain(height_map, chunk_x, chunk_y);
decorate_soil(chunk, biome_map, terrain_map);
@@ -38,7 +38,7 @@ Generator::Map2D<float> Generator::name(int64_t chunk_x, int64_t chunk_y) {
SIMPLE_MAP_GENERATOR(generate_landmass_map, get_landmass)
SIMPLE_MAP_GENERATOR(generate_hill_map, get_hill)
-Generator::Map2D<float> Generator::generate_height_map(Map2D<float>& landmass_map, Map2D<float>& hill_map, int64_t chunk_x, int64_t chunk_y) {
+Generator::Map2D<float> Generator::generate_height_map(Map2D<float>& landmass_map, Map2D<float>& hill_map) {
Map2D<float> height_map{};
for (uint x = 0; x < Chunk::Width; x++) {
@@ -63,8 +63,7 @@ SIMPLE_MAP_GENERATOR(generate_humidity_map, get_humidity)
Generator::Map2D<BiomeType> Generator::generate_biome_map(
Map2D<float>& landmass_map, Map2D<float>& hill_map,
- Map2D<float>& temperature_map, Map2D<float>& humidity_map,
- int64_t chunk_x, int64_t chunk_y
+ Map2D<float>& temperature_map, Map2D<float>& humidity_map
) {
Map2D<BiomeType> biome_map{};
@@ -187,9 +186,9 @@ void Generator::decorate_soil(Chunk& chunk, Map2D<BiomeType>& biome_map, Map3D<b
}
}
-#define CURVE_START(y) constexpr auto lerp = Math::linear_interpolation; float _py = y; float _px = 0.0f;
-#define CURVE_POINT(x, y) if (v < x) return lerp({_py, y}, _px, x, v); _py = y; _px = x
-#define CURVE_END(y) return lerp({_py, y}, _px, 1.0f, v);
+#define CURVE_START(y) constexpr auto lerp = Math::linear_interpolation; float _py = (y); float _px = 0.0f;
+#define CURVE_POINT(x, y) if (v < (x)) return lerp({_py, (y)}, _px, (x), v); _py = y; _px = (x)
+#define CURVE_END(y) return lerp({_py, (y)}, _px, 1.0f, v);
float Generator::get_landmass(Vector<2> pos) const {
auto v = m_landmass_noise.at(pos);
diff --git a/src/World/Generation/Generator.hpp b/src/World/Generation/Generator.hpp
index 464e36f..c18de45 100644
--- a/src/World/Generation/Generator.hpp
+++ b/src/World/Generation/Generator.hpp
@@ -20,15 +20,14 @@ private:
Map2D<float> generate_landmass_map(int64_t chunk_x, int64_t chunk_y);
Map2D<float> generate_hill_map(int64_t chunk_x, int64_t chunk_y);
- Map2D<float> generate_height_map(Map2D<float>& landmass_map, Map2D<float>& hill_map, int64_t chunk_x, int64_t chunk_y);
+ Map2D<float> generate_height_map(Map2D<float>& landmass_map, Map2D<float>& hill_map);
Map2D<float> generate_temperature_map(int64_t chunk_x, int64_t chunk_y);
Map2D<float> generate_humidity_map(int64_t chunk_x, int64_t chunk_y);
Map2D<BiomeType> generate_biome_map(
Map2D<float>& landmass_map, Map2D<float>& hill_map,
- Map2D<float>& temperature_map, Map2D<float>& humidity_map,
- int64_t chunk_x, int64_t chunk_y
+ Map2D<float>& temperature_map, Map2D<float>& humidity_map
);
Map3D<bool> generate_terrain(Map2D<float>& height_map, int64_t chunk_x, int64_t chunk_y);
diff --git a/src/World/World.cpp b/src/World/World.cpp
index 6e8489a..7570d8c 100644
--- a/src/World/World.cpp
+++ b/src/World/World.cpp
@@ -45,7 +45,7 @@ Chunk* World::get_chunk_for_position(Vector<3> position) {
return nullptr;
}
-void World::process_chunk_visibility_updates(std::unordered_set<ChunkIndex>& new_chunks, Vector<3> player) {
+void World::process_chunk_visibility_updates(const std::unordered_set<ChunkIndex>& new_chunks, const Vector<3> player) {
for (auto new_index: new_chunks) {
auto& data = get(new_index);
if (data.status == ChunkStatus::Empty) {
@@ -55,7 +55,7 @@ void World::process_chunk_visibility_updates(std::unordered_set<ChunkIndex>& new
}
}
-std::unordered_set<ChunkIndex> World::get_visible_chunk_indices(Vector<3> position) const {
+std::unordered_set<ChunkIndex> World::get_visible_chunk_indices(const Vector<3> position) const {
int32_t center_x = std::round(position.x() / Chunk::Width);
int32_t center_y = std::round(position.z() / Chunk::Width);
@@ -119,8 +119,8 @@ void World::try_to_create_mesh_for_chunk(ChunkData& data) {
auto south = get({index.x, index.y + 1});
auto west = get({index.x - 1, index.y});
- auto no_terrain = [](ChunkData& data){
- return !data.chunk.has_value();
+ auto no_terrain = [](const ChunkData& d){
+ return !d.chunk.has_value();
};
if (no_terrain(north) || no_terrain(east) || no_terrain(south) || no_terrain(west)) {
@@ -140,7 +140,7 @@ void World::log_chunk_time(uint64_t chunk_time_ms) {
m_statistics.average_chunk_time_ms += ((float)chunk_time_ms - m_statistics.average_chunk_time_ms) / m_statistics.chunk_time_sample_count;
}
-float World::get_average_chunk_time() {
+float World::get_average_chunk_time() const {
return m_statistics.average_chunk_time_ms;
}
diff --git a/src/World/World.hpp b/src/World/World.hpp
index ae8b37f..bc008b3 100644
--- a/src/World/World.hpp
+++ b/src/World/World.hpp
@@ -32,11 +32,11 @@ public:
std::vector<ChunkData*> get_visible_chunks(Vector<3> position);
Chunk* get_chunk_for_position(Vector<3> position);
- float get_average_chunk_time();
+ float get_average_chunk_time() const;
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, Vector<3> player);
+ void process_chunk_visibility_updates(const std::unordered_set<ChunkIndex>& new_chunks, Vector<3> player);
void request_generation(ChunkIndex index, float priority);
void try_to_create_mesh_for_chunk(ChunkData& data);