diff --git a/tools/editor/editor_ui.cpp b/tools/editor/editor_ui.cpp index 25d20768..77c4a58f 100644 --- a/tools/editor/editor_ui.cpp +++ b/tools/editor/editor_ui.cpp @@ -479,8 +479,12 @@ void EditorUI::renderBrushPanel(EditorApp& app) { app.getTerrainEditor().scaleHeights(hScale); app.showToast("Heights scaled"); } + if (ImGui::Button("Reset to Flat", ImVec2(-1, 0))) { + app.getTerrainEditor().resetToFlat(); + app.showToast("Terrain reset to flat"); + } ImGui::TextColored(ImVec4(0.6f, 0.6f, 0.6f, 1), - "Exaggerate (>1) or flatten (<1) terrain relief"); + "Scale: exaggerate (>1) or flatten (<1) relief"); } ImGui::Separator(); diff --git a/tools/editor/terrain_editor.cpp b/tools/editor/terrain_editor.cpp index 90ca2b17..557ae608 100644 --- a/tools/editor/terrain_editor.cpp +++ b/tools/editor/terrain_editor.cpp @@ -652,6 +652,18 @@ void TerrainEditor::smoothEntireTile(int iterations) { dirty_ = true; } +void TerrainEditor::resetToFlat() { + if (!terrain_) return; + for (int ci = 0; ci < 256; ci++) { + auto& chunk = terrain_->chunks[ci]; + if (!chunk.hasHeightMap()) continue; + chunk.heightMap.heights.fill(0.0f); + dirtyChunks_.push_back(ci); + } + for (int ci = 0; ci < 256; ci++) stitchEdges(ci); + dirty_ = true; +} + void TerrainEditor::scaleHeights(float factor) { if (!terrain_) return; for (int ci = 0; ci < 256; ci++) { diff --git a/tools/editor/terrain_editor.hpp b/tools/editor/terrain_editor.hpp index 8f37263e..f35cf6e5 100644 --- a/tools/editor/terrain_editor.hpp +++ b/tools/editor/terrain_editor.hpp @@ -60,6 +60,9 @@ public: // Clamp all heights to a min/max range void clampHeights(float minH, float maxH); + // Reset all heights to zero (flat terrain) + void resetToFlat(); + // Scale all heights by a factor (useful for exaggerating or flattening) void scaleHeights(float factor);