Add terrain support in runtime scene building

This commit is contained in:
2026-04-18 19:53:41 +02:00
parent 27b6e804c5
commit bd0df136d6

View File

@@ -724,6 +724,19 @@ function buildRuntimeCollider(brush: Brush): RuntimeBrushTriMeshCollider {
};
}
function buildRuntimeTerrain(terrain: Terrain): RuntimeTerrain {
return {
id: terrain.id,
name: terrain.name,
visible: terrain.visible,
position: cloneVec3(terrain.position),
sampleCountX: terrain.sampleCountX,
sampleCountZ: terrain.sampleCountZ,
cellSize: terrain.cellSize,
heights: [...terrain.heights]
};
}
function buildRuntimeModelInstance(
modelInstance: SceneDocument["modelInstances"][string]
): RuntimeModelInstance {
@@ -950,6 +963,72 @@ function combineColliderBounds(
};
}
function getRuntimeTerrainSceneBounds(terrain: RuntimeTerrain): RuntimeSceneBounds {
const bounds = getTerrainBounds({
...terrain,
kind: "terrain"
});
const min = cloneVec3(bounds.min);
const max = cloneVec3(bounds.max);
return {
min,
max,
center: {
x: (min.x + max.x) * 0.5,
y: (min.y + max.y) * 0.5,
z: (min.z + max.z) * 0.5
},
size: {
x: max.x - min.x,
y: max.y - min.y,
z: max.z - min.z
}
};
}
function combineSceneBounds(
colliderBounds: RuntimeSceneBounds | null,
terrains: RuntimeTerrain[]
): RuntimeSceneBounds | null {
const terrainBounds = terrains.map(getRuntimeTerrainSceneBounds);
if (colliderBounds === null && terrainBounds.length === 0) {
return null;
}
const min = colliderBounds?.min
? cloneVec3(colliderBounds.min)
: cloneVec3(terrainBounds[0]!.min);
const max = colliderBounds?.max
? cloneVec3(colliderBounds.max)
: cloneVec3(terrainBounds[0]!.max);
for (const bounds of terrainBounds) {
min.x = Math.min(min.x, bounds.min.x);
min.y = Math.min(min.y, bounds.min.y);
min.z = Math.min(min.z, bounds.min.z);
max.x = Math.max(max.x, bounds.max.x);
max.y = Math.max(max.y, bounds.max.y);
max.z = Math.max(max.z, bounds.max.z);
}
return {
min,
max,
center: {
x: (min.x + max.x) * 0.5,
y: (min.y + max.y) * 0.5,
z: (min.z + max.z) * 0.5
},
size: {
x: max.x - min.x,
y: max.y - min.y,
z: max.z - min.z
}
};
}
function buildFallbackSpawn(
sceneBounds: RuntimeSceneBounds | null
): RuntimeSpawnPoint {