diff options
| author | Mel <einebeere@gmail.com> | 2023-07-07 21:39:42 +0200 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2023-07-07 21:39:42 +0200 |
| commit | f1fc192ddc4c739fa8b4b376c759b7d3218a34eb (patch) | |
| tree | 9e9afb9a21ba3ca27d1f25d46230aa9d27f8be39 /src/World/Generation/Generator.hpp | |
| parent | 24b8124469350d1c80d0553cf3f4bf58cdb1489b (diff) | |
| download | meowcraft-f1fc192ddc4c739fa8b4b376c759b7d3218a34eb.tar.zst meowcraft-f1fc192ddc4c739fa8b4b376c759b7d3218a34eb.zip | |
Chunk-bound tree decoration
Diffstat (limited to 'src/World/Generation/Generator.hpp')
| -rw-r--r-- | src/World/Generation/Generator.hpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/World/Generation/Generator.hpp b/src/World/Generation/Generator.hpp new file mode 100644 index 0000000..464e36f --- /dev/null +++ b/src/World/Generation/Generator.hpp @@ -0,0 +1,76 @@ +#pragma once + +#include <cstdint> + +#include "Decoration.hpp" +#include "../Chunk.hpp" +#include "../BiomeType.hpp" +#include "../../Math/Perlin.hpp" +#include "../../Math/Tensor.hpp" + +namespace MC::World::Generation { + +class Generator { +public: + Generator() = default; + Chunk generate(int64_t chunk_x, int64_t chunk_y); +private: + template <typename V> using Map2D = Matrix<Chunk::Width, Chunk::Width, V>; + template <typename V> using Map3D = Tensor<3, V, Chunk::Width, Chunk::Height, Chunk::Width>; + + 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_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 + ); + + Map3D<bool> generate_terrain(Map2D<float>& height_map, int64_t chunk_x, int64_t chunk_y); + + void decorate_soil(Chunk& chunk, Map2D<BiomeType>& biome_map, Map3D<bool>& terrain_map); + + [[nodiscard]] float get_landmass(Vector<2> pos) const; + [[nodiscard]] float get_hill(Vector<2> pos) const; + + [[nodiscard]] float get_humidity(Vector<2> pos) const; + [[nodiscard]] float get_temperature(Vector<2> pos) const; + + [[nodiscard]] float get_density(Vector<3> pos) const; + + static Vector<2> chunk_position_to_world_vector(int64_t chunk_x, int64_t chunk_y, uint x, uint y); + + static inline std::vector<Decorator*> s_decorators = { + new TreeDecorator(), + }; + + Math::Perlin::Noise<2> m_landmass_noise{.scale=800.0f, .octaves=4, .persistence=0.3f, .lacunarity=3.5f}; + Math::Perlin::Noise<2> m_hill_noise{.scale=400.0f, .octaves=3, .persistence=0.5f, .lacunarity=2.0f}; + + Math::Perlin::Noise<2> m_temperature_noise{.scale=700.0f, .octaves=4, .persistence=0.4f, .lacunarity=3.0f}; + Math::Perlin::Noise<2> m_humidity_noise{.scale=400.0f, .octaves=2, .persistence=0.4f, .lacunarity=3.0f}; + + Math::Perlin::Noise<3> m_density_noise{.scale=30.0f, .octaves=2, .persistence=0.7f, .lacunarity=2.0f}; + + enum class HillSlice { Mountain, Middle, Valley }; + enum class LandmassSlice { Land, Beach, Ocean }; + enum class TemperatureZone { Hot, Fair, Cold }; + enum class HumidityZone { Wet, Lush, Temperate, Dry }; + static constexpr uint HillSliceSize = (uint)HillSlice::Valley + 1; + static constexpr uint LandmassSliceSize = (uint)LandmassSlice::Ocean + 1; + static constexpr uint TemperatureZoneSize = (uint)TemperatureZone::Cold + 1; + static constexpr uint HumidityZoneSize = (uint)HumidityZone::Dry + 1; + + static constexpr size_t biome_lookup_table_size = (size_t)HillSliceSize * (size_t)LandmassSliceSize * (size_t)TemperatureZoneSize * (size_t)HumidityZoneSize; + static std::array<BiomeType, biome_lookup_table_size> create_biome_lookup_table(); + static size_t biome_lookup_table_index(HillSlice hill_slice, LandmassSlice landmass_slice, TemperatureZone temperature_zone, HumidityZone humidity_zone); + static BiomeType lookup_biome(HillSlice hill_slice, LandmassSlice landmass_slice, TemperatureZone temperature_zone, HumidityZone humidity_zone); + static inline std::array<BiomeType, biome_lookup_table_size> biome_lookup_table = create_biome_lookup_table(); +}; + +} |
