From 118226d8d656e6f57744685096a7f3e973e70f98 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Tue, 12 May 2026 23:32:04 +0200 Subject: [PATCH] Add functions to sample terrain height at local and world positions --- src/document/terrains.ts | 43 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/document/terrains.ts b/src/document/terrains.ts index bba39e56..80d0a6b0 100644 --- a/src/document/terrains.ts +++ b/src/document/terrains.ts @@ -945,6 +945,49 @@ function sampleTerrainHeightAtGridCoordinate( ); } +export function sampleTerrainHeightAtLocalPosition( + terrain: Terrain, + localX: number, + localZ: number, + clampToBounds = false +): number | null { + const sampleSpaceX = localX / terrain.cellSize; + const sampleSpaceZ = localZ / terrain.cellSize; + const maxSampleX = terrain.sampleCountX - 1; + const maxSampleZ = terrain.sampleCountZ - 1; + + if (!clampToBounds) { + if ( + sampleSpaceX < 0 || + sampleSpaceX > maxSampleX || + sampleSpaceZ < 0 || + sampleSpaceZ > maxSampleZ + ) { + return null; + } + } + + return sampleTerrainHeightAtGridCoordinate( + terrain, + sampleSpaceX, + sampleSpaceZ + ); +} + +export function sampleTerrainHeightAtWorldPosition( + terrain: Terrain, + worldX: number, + worldZ: number, + clampToBounds = false +): number | null { + return sampleTerrainHeightAtLocalPosition( + terrain, + worldX - terrain.position.x, + worldZ - terrain.position.z, + clampToBounds + ); +} + function getStoredTerrainPaintWeightAtSample( terrain: Terrain, sampleX: number,