[add] src/rendering/terrain-layer-material.ts [add] tests/domain/terrains.test.ts [change] src/app/App.tsx [change] src/core/terrain-brush.ts [change] src/document/migrate-scene-document.ts [change] src/document/scene-document-validation.ts [change] src/document/scene-document.ts [change] src/document/terrains.ts [change] src/geometry/terrain-brush.ts [change] src/geometry/terrain-mesh.ts [change] src/runtime-three/rapier-collision-world.ts [change] src/runtime-three/runtime-host.ts [change] src/runtime-three/runtime-scene-build.ts [change] src/viewport-three/ViewportCanvas.tsx [change] src/viewport-three/ViewportPanel.tsx [change] src/viewport-three/viewport-host.ts [change] tests/domain/build-runtime-scene.test.ts [change] tests/domain/rapier-collision-world.test.ts [change] tests/domain/terrain.command.test.ts [change] tests/domain/water-material.test.ts [change] tests/geometry/terrain-brush.test.ts [change] tests/geometry/terrain-mesh.test.ts [change] tests/serialization/scene-document-json.test.ts [change] tests/unit/terrain-foundation.integration.test.tsx [change] tests/unit/viewport-canvas.test.tsx
64 lines
1.5 KiB
TypeScript
64 lines
1.5 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import {
|
|
getTerrainPaintWeightSampleOffset,
|
|
resizeTerrainGrid,
|
|
createTerrain
|
|
} from "../../src/document/terrains";
|
|
|
|
describe("terrain grid resizing", () => {
|
|
it("keeps terrain centered while bilinearly resampling heights and paint weights", () => {
|
|
const terrain = createTerrain({
|
|
id: "terrain-resample-main",
|
|
position: {
|
|
x: 0,
|
|
y: 1,
|
|
z: 0
|
|
},
|
|
sampleCountX: 2,
|
|
sampleCountZ: 2,
|
|
cellSize: 1,
|
|
heights: [0, 2, 4, 6],
|
|
paintWeights: [
|
|
0,
|
|
0,
|
|
0,
|
|
0.6,
|
|
0,
|
|
0,
|
|
0,
|
|
0.5,
|
|
0,
|
|
0,
|
|
0,
|
|
0.25
|
|
]
|
|
});
|
|
|
|
const resizedTerrain = resizeTerrainGrid(terrain, {
|
|
sampleCountX: 3,
|
|
sampleCountZ: 3,
|
|
cellSize: 1
|
|
});
|
|
const centerOffset = getTerrainPaintWeightSampleOffset(resizedTerrain, 1, 1);
|
|
|
|
expect(resizedTerrain.position).toEqual({
|
|
x: -0.5,
|
|
y: 1,
|
|
z: -0.5
|
|
});
|
|
expect(resizedTerrain.sampleCountX).toBe(3);
|
|
expect(resizedTerrain.sampleCountZ).toBe(3);
|
|
expect(resizedTerrain.heights[4]).toBeCloseTo(3);
|
|
expect(resizedTerrain.paintWeights[centerOffset]).toBeCloseTo(0.15);
|
|
expect(resizedTerrain.paintWeights[centerOffset + 1]).toBeCloseTo(0.125);
|
|
expect(resizedTerrain.paintWeights[centerOffset + 2]).toBeCloseTo(0.0625);
|
|
expect(terrain.position).toEqual({
|
|
x: 0,
|
|
y: 1,
|
|
z: 0
|
|
});
|
|
expect(terrain.heights).toEqual([0, 2, 4, 6]);
|
|
});
|
|
});
|