From 8c9735d18ab00cbfa3172f1c4746c33aa0eab237 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Wed, 29 Apr 2026 23:49:34 +0200 Subject: [PATCH] Add test case for terrain LoD stability using hysteresis --- tests/geometry/terrain-mesh.test.ts | 50 ++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/tests/geometry/terrain-mesh.test.ts b/tests/geometry/terrain-mesh.test.ts index 9fad64cc..12d86d85 100644 --- a/tests/geometry/terrain-mesh.test.ts +++ b/tests/geometry/terrain-mesh.test.ts @@ -4,7 +4,8 @@ import { createTerrain } from "../../src/document/terrains"; import { buildTerrainDerivedMeshData, buildTerrainLodMeshData, - resolveTerrainLodLevelIndex + resolveTerrainLodLevelIndex, + resolveTerrainLodLevelIndexWithHysteresis } from "../../src/geometry/terrain-mesh"; describe("terrain mesh generation", () => { @@ -263,4 +264,51 @@ describe("terrain mesh generation", () => { }) ).toBe(4); }); + + it("keeps terrain LoD stable near distance thresholds", () => { + const levelCount = 5; + const chunkDiagonal = 100; + const chunkWorldCenter = { x: 0, y: 0, z: 0 }; + + expect( + resolveTerrainLodLevelIndexWithHysteresis({ + levelCount, + activeLevelIndex: 0, + chunkDiagonal, + chunkWorldCenter, + cameraPosition: { x: 0, y: 0, z: 80 }, + perspective: true + }) + ).toBe(0); + expect( + resolveTerrainLodLevelIndexWithHysteresis({ + levelCount, + activeLevelIndex: 0, + chunkDiagonal, + chunkWorldCenter, + cameraPosition: { x: 0, y: 0, z: 90 }, + perspective: true + }) + ).toBe(1); + expect( + resolveTerrainLodLevelIndexWithHysteresis({ + levelCount, + activeLevelIndex: 1, + chunkDiagonal, + chunkWorldCenter, + cameraPosition: { x: 0, y: 0, z: 132 }, + perspective: true + }) + ).toBe(1); + expect( + resolveTerrainLodLevelIndexWithHysteresis({ + levelCount, + activeLevelIndex: 1, + chunkDiagonal, + chunkWorldCenter, + cameraPosition: { x: 0, y: 0, z: 60 }, + perspective: true + }) + ).toBe(0); + }); });