diff --git a/tools/editor/editor_ui.cpp b/tools/editor/editor_ui.cpp index 606206c9..deb2142c 100644 --- a/tools/editor/editor_ui.cpp +++ b/tools/editor/editor_ui.cpp @@ -546,6 +546,13 @@ void EditorUI::renderBrushPanel(EditorApp& app) { app.getTerrainEditor().invertHeights(); app.showToast("Heights inverted"); } + static float offsetAmt = 10.0f; + ImGui::SliderFloat("Offset##ht", &offsetAmt, -100.0f, 100.0f, "%.0f"); + ImGui::SameLine(); + if (ImGui::SmallButton("Apply##off")) { + app.getTerrainEditor().offsetHeights(offsetAmt); + app.showToast("Heights offset"); + } ImGui::TextColored(ImVec4(0.6f, 0.6f, 0.6f, 1), "Scale: exaggerate (>1) or flatten (<1) relief"); } diff --git a/tools/editor/terrain_editor.cpp b/tools/editor/terrain_editor.cpp index 3c5e80dd..bd9f64a7 100644 --- a/tools/editor/terrain_editor.cpp +++ b/tools/editor/terrain_editor.cpp @@ -860,6 +860,18 @@ void TerrainEditor::createHill(const glm::vec3& center, float radius, float heig dirty_ = true; } +void TerrainEditor::offsetHeights(float amount) { + 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] += amount; + dirtyChunks_.push_back(ci); + } + dirty_ = true; +} + void TerrainEditor::invertHeights() { if (!terrain_) return; // Find midpoint diff --git a/tools/editor/terrain_editor.hpp b/tools/editor/terrain_editor.hpp index 291552e0..16f8f148 100644 --- a/tools/editor/terrain_editor.hpp +++ b/tools/editor/terrain_editor.hpp @@ -108,6 +108,9 @@ public: // Invert terrain (flip heights around midpoint) void invertHeights(); + // Offset all heights by a constant + void offsetHeights(float amount); + // Fill entire tile with water at a height void fillWater(float height, uint16_t liquidType);