From 7e48658ab16204efeb1f573f06b693f9b5ec72ec Mon Sep 17 00:00:00 2001 From: Kelsi Date: Wed, 6 May 2026 07:40:29 -0700 Subject: [PATCH] fix(terrain): NaN guards on createCrater and createMesa MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same defensive pattern as createHill — NaN center/radius would short-circuit dist comparisons and apply the height delta to every vertex on every chunk. Reject upfront. --- tools/editor/terrain_editor.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/editor/terrain_editor.cpp b/tools/editor/terrain_editor.cpp index a5f57fcd..2a684807 100644 --- a/tools/editor/terrain_editor.cpp +++ b/tools/editor/terrain_editor.cpp @@ -826,6 +826,9 @@ void TerrainEditor::carveRiver(const glm::vec3& start, const glm::vec3& end, void TerrainEditor::createCrater(const glm::vec3& center, float radius, float depth, float rimHeight) { if (!terrain_) return; + if (!std::isfinite(center.x) || !std::isfinite(center.y) || + !std::isfinite(radius) || radius <= 0.0f || + !std::isfinite(depth) || !std::isfinite(rimHeight)) return; recordGeneratorUndo(); for (int ci = 0; ci < 256; ci++) { @@ -869,6 +872,9 @@ void TerrainEditor::createCrater(const glm::vec3& center, float radius, float de void TerrainEditor::createMesa(const glm::vec3& center, float radius, float height, float edgeSteepness) { if (!terrain_) return; + if (!std::isfinite(center.x) || !std::isfinite(center.y) || + !std::isfinite(radius) || radius <= 0.0f || + !std::isfinite(height) || !std::isfinite(edgeSteepness)) return; recordGeneratorUndo(); for (int ci = 0; ci < 256; ci++) { auto& chunk = terrain_->chunks[ci];