diff options
Diffstat (limited to 'src/World')
| -rw-r--r-- | src/World/Chunk.cpp | 2 | ||||
| -rw-r--r-- | src/World/Chunk.hpp | 2 | ||||
| -rw-r--r-- | src/World/ChunkIndex.hpp | 4 | ||||
| -rw-r--r-- | src/World/Generation/ChunkMeshing.cpp | 10 | ||||
| -rw-r--r-- | src/World/Generation/ChunkMeshing.hpp | 2 | ||||
| -rw-r--r-- | src/World/Generation/Generator.cpp | 15 | ||||
| -rw-r--r-- | src/World/Generation/Generator.hpp | 5 | ||||
| -rw-r--r-- | src/World/World.cpp | 10 | ||||
| -rw-r--r-- | src/World/World.hpp | 4 |
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); |
