diff --git a/tools/editor/editor_ui.cpp b/tools/editor/editor_ui.cpp index 98b93443..49b18823 100644 --- a/tools/editor/editor_ui.cpp +++ b/tools/editor/editor_ui.cpp @@ -404,8 +404,15 @@ void EditorUI::renderBrushPanel(EditorApp& app) { app.getTerrainEditor().clampHeights(clampMin, clampMax); app.showToast("Heights clamped"); } + ImGui::Separator(); + static float hScale = 1.5f; + ImGui::SliderFloat("Height Scale", &hScale, 0.1f, 5.0f, "%.2f"); + if (ImGui::Button("Scale Heights", ImVec2(-1, 0))) { + app.getTerrainEditor().scaleHeights(hScale); + app.showToast("Heights scaled"); + } ImGui::TextColored(ImVec4(0.6f, 0.6f, 0.6f, 1), - "Generate, smooth, then clamp for controlled range"); + "Exaggerate (>1) or flatten (<1) terrain relief"); } ImGui::Separator(); diff --git a/tools/editor/terrain_editor.cpp b/tools/editor/terrain_editor.cpp index 06aaf134..c7e4c374 100644 --- a/tools/editor/terrain_editor.cpp +++ b/tools/editor/terrain_editor.cpp @@ -652,6 +652,20 @@ void TerrainEditor::smoothEntireTile(int iterations) { dirty_ = true; } +void TerrainEditor::scaleHeights(float factor) { + if (!terrain_) return; + for (int ci = 0; ci < 256; ci++) { + auto& chunk = terrain_->chunks[ci]; + if (!chunk.hasHeightMap()) continue; + for (int v = 0; v < 145; v++) + chunk.heightMap.heights[v] *= factor; + dirtyChunks_.push_back(ci); + } + // Re-stitch all edges after scaling + for (int ci = 0; ci < 256; ci++) stitchEdges(ci); + dirty_ = true; +} + void TerrainEditor::clampHeights(float minH, float maxH) { 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 ed80bee8..8bb1d5a5 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); + // Scale all heights by a factor (useful for exaggerating or flattening) + void scaleHeights(float factor); + // Import/export heightmap (raw 16-bit grayscale, 129x129) bool importHeightmap(const std::string& path, float heightScale); bool exportHeightmap(const std::string& path, float heightScale);