From 2efb5c9342edef18fc949184d3ecdce2a1096ade Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Fri, 12 Jun 2026 10:38:21 +0800 Subject: [PATCH] refactor(generation): move ocean water build to later phase --- include/Cubed/gameplay/builders/biome_builder.hpp | 2 +- include/Cubed/gameplay/chunk_generator.hpp | 1 + src/gameplay/builders/desert_builder.cpp | 1 - src/gameplay/builders/forest_builder.cpp | 1 - src/gameplay/builders/mountain_builder.cpp | 1 - src/gameplay/builders/ocean_builder.cpp | 1 - src/gameplay/builders/plain_builder.cpp | 1 - src/gameplay/builders/snowy_plain_builder.cpp | 1 - src/gameplay/chunk.cpp | 7 +++++-- src/gameplay/chunk_generator.cpp | 2 ++ 10 files changed, 9 insertions(+), 9 deletions(-) diff --git a/include/Cubed/gameplay/builders/biome_builder.hpp b/include/Cubed/gameplay/builders/biome_builder.hpp index 5597fd9..b4756d5 100644 --- a/include/Cubed/gameplay/builders/biome_builder.hpp +++ b/include/Cubed/gameplay/builders/biome_builder.hpp @@ -9,10 +9,10 @@ public: virtual ChunkGenerator& get_chunk_generator() = 0; virtual void build_biome() = 0; virtual void build_vegetation() = 0; + void ocean_water_build(); protected: void build_bottom(); void place_grass(); - void ocean_water_build(); }; } // namespace Cubed \ No newline at end of file diff --git a/include/Cubed/gameplay/chunk_generator.hpp b/include/Cubed/gameplay/chunk_generator.hpp index 396b6f8..2cf5d04 100644 --- a/include/Cubed/gameplay/chunk_generator.hpp +++ b/include/Cubed/gameplay/chunk_generator.hpp @@ -45,6 +45,7 @@ public: Chunk& chunk(); Random& random(); const std::array& neighbor_biome() const; + void ocean_build(); void generate_cave(); void generate_river(); diff --git a/src/gameplay/builders/desert_builder.cpp b/src/gameplay/builders/desert_builder.cpp index b05fde5..2b60cfa 100644 --- a/src/gameplay/builders/desert_builder.cpp +++ b/src/gameplay/builders/desert_builder.cpp @@ -27,7 +27,6 @@ void DesertBuilder::build_blocks() { } } } - ocean_water_build(); } void DesertBuilder::build_vegetation() {} diff --git a/src/gameplay/builders/forest_builder.cpp b/src/gameplay/builders/forest_builder.cpp index 92656c0..8607b02 100644 --- a/src/gameplay/builders/forest_builder.cpp +++ b/src/gameplay/builders/forest_builder.cpp @@ -32,7 +32,6 @@ void ForestBuilder::build_blocks() { m_blocks[Chunk::index(x, height, z)] = 1; } } - ocean_water_build(); } void ForestBuilder::build_vegetation() { diff --git a/src/gameplay/builders/mountain_builder.cpp b/src/gameplay/builders/mountain_builder.cpp index 1cb873a..0c8c379 100644 --- a/src/gameplay/builders/mountain_builder.cpp +++ b/src/gameplay/builders/mountain_builder.cpp @@ -23,7 +23,6 @@ void MountainBuilder::build_blocks() { } } } - ocean_water_build(); } void MountainBuilder::build_vegetation() {} diff --git a/src/gameplay/builders/ocean_builder.cpp b/src/gameplay/builders/ocean_builder.cpp index cf95d9d..123461e 100644 --- a/src/gameplay/builders/ocean_builder.cpp +++ b/src/gameplay/builders/ocean_builder.cpp @@ -23,7 +23,6 @@ void OceanBuilder::build_blocks() { } } } - ocean_water_build(); } void OceanBuilder::build_vegetation() {} diff --git a/src/gameplay/builders/plain_builder.cpp b/src/gameplay/builders/plain_builder.cpp index 65ec47b..a900905 100644 --- a/src/gameplay/builders/plain_builder.cpp +++ b/src/gameplay/builders/plain_builder.cpp @@ -27,7 +27,6 @@ void PlainBuilder::build_blocks() { m_blocks[Chunk::index(x, height, z)] = 1; } } - ocean_water_build(); } void PlainBuilder::build_vegetation() { place_grass(); } diff --git a/src/gameplay/builders/snowy_plain_builder.cpp b/src/gameplay/builders/snowy_plain_builder.cpp index 0e765c3..189ce46 100644 --- a/src/gameplay/builders/snowy_plain_builder.cpp +++ b/src/gameplay/builders/snowy_plain_builder.cpp @@ -27,7 +27,6 @@ void SnowyPlainBuilder::build_blocks() { m_blocks[Chunk::index(x, height, z)] = 8; } } - ocean_water_build(); } void SnowyPlainBuilder::build_vegetation() {} diff --git a/src/gameplay/chunk.cpp b/src/gameplay/chunk.cpp index 430fd85..60df97f 100644 --- a/src/gameplay/chunk.cpp +++ b/src/gameplay/chunk.cpp @@ -199,9 +199,8 @@ void Chunk::gen_phase_six( Logger::error("ChunkGenerator is Nullptr"); return; } + // This must be fully completed before any other operations can proceed! m_generator->blend_surface_blocks_borders(neighbor_block); - m_generator->generate_cave(); - m_generator->generate_river(); } void Chunk::gen_phase_seven() { @@ -209,6 +208,10 @@ void Chunk::gen_phase_seven() { Logger::error("ChunkGenerator is Nullptr"); return; } + m_generator->ocean_build(); + m_generator->generate_river(); + m_generator->generate_cave(); + m_generator->generate_vegetation(); mark_dirty(); m_generator = nullptr; diff --git a/src/gameplay/chunk_generator.cpp b/src/gameplay/chunk_generator.cpp index f57cbe5..aa4f427 100644 --- a/src/gameplay/chunk_generator.cpp +++ b/src/gameplay/chunk_generator.cpp @@ -635,6 +635,8 @@ void ChunkGenerator::make_biome_builder() { } } +void ChunkGenerator::ocean_build() { m_biome_builder->ocean_water_build(); } + void ChunkGenerator::generate_cave() { auto& cave_carver = m_chunk.world().cave_carcer(); auto& paths = cave_carver.paths();