From f484b742dbdc71af955b26311bbd46da01fcd4da Mon Sep 17 00:00:00 2001 From: Kelsi Date: Wed, 6 May 2026 07:39:35 -0700 Subject: [PATCH] fix(editor): NaN guards on flattenAroundSelected and createHill Same NaN-comparison short-circuit pattern: dist >= radius is false when dist is NaN, so the loop body would run for every vertex and write garbage heights / bend the terrain unbounded. --- tools/editor/editor_app.cpp | 3 +++ tools/editor/terrain_editor.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/tools/editor/editor_app.cpp b/tools/editor/editor_app.cpp index 66817109..b2b7059a 100644 --- a/tools/editor/editor_app.cpp +++ b/tools/editor/editor_app.cpp @@ -1703,6 +1703,9 @@ void EditorApp::snapSelectedToGround() { void EditorApp::flattenAroundSelected(float radius) { auto* sel = objectPlacer_.getSelected(); if (!sel || !terrain_.isLoaded()) return; + if (!std::isfinite(radius) || radius <= 0.0f || + !std::isfinite(sel->position.x) || !std::isfinite(sel->position.y) || + !std::isfinite(sel->position.z)) return; terrainEditor_.beginGeneratorUndo(); float targetHeight = sel->position.z; diff --git a/tools/editor/terrain_editor.cpp b/tools/editor/terrain_editor.cpp index 88518a14..a5f57fcd 100644 --- a/tools/editor/terrain_editor.cpp +++ b/tools/editor/terrain_editor.cpp @@ -905,6 +905,9 @@ void TerrainEditor::createMesa(const glm::vec3& center, float radius, float heig void TerrainEditor::createHill(const glm::vec3& center, float radius, float height) { if (!terrain_) return; + if (!std::isfinite(center.x) || !std::isfinite(center.y) || + !std::isfinite(radius) || radius <= 0.0f || + !std::isfinite(height)) return; recordGeneratorUndo(); for (int ci = 0; ci < 256; ci++) { auto& chunk = terrain_->chunks[ci];