auto-git:
[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
This commit is contained in:
@@ -132,4 +132,54 @@ describe("Terrain foundation", () => {
|
||||
).toBeInTheDocument();
|
||||
expect(screen.getByText(/9 x 9 samples/)).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("updates selected terrain grid settings and collision from the inspector", async () => {
|
||||
const store = createEditorStore();
|
||||
|
||||
render(<App store={store} />);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(viewportHostInstances.length).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
fireEvent.click(screen.getByRole("button", { name: "Add" }));
|
||||
fireEvent.click(await screen.findByTestId("add-menu-terrain"));
|
||||
|
||||
await waitFor(() => {
|
||||
expect(Object.keys(store.getState().document.terrains)).toHaveLength(1);
|
||||
});
|
||||
|
||||
const createdTerrain = Object.values(store.getState().document.terrains)[0];
|
||||
|
||||
if (createdTerrain === undefined) {
|
||||
throw new Error("Expected the created terrain to exist.");
|
||||
}
|
||||
|
||||
fireEvent.change(screen.getByTestId("terrain-grid-sample-count-x"), {
|
||||
target: { value: "5" }
|
||||
});
|
||||
fireEvent.change(screen.getByTestId("terrain-grid-sample-count-z"), {
|
||||
target: { value: "7" }
|
||||
});
|
||||
fireEvent.change(screen.getByTestId("terrain-grid-cell-size"), {
|
||||
target: { value: "2" }
|
||||
});
|
||||
fireEvent.click(screen.getByTestId("terrain-grid-apply"));
|
||||
|
||||
await waitFor(() => {
|
||||
const updatedTerrain = store.getState().document.terrains[createdTerrain.id];
|
||||
|
||||
expect(updatedTerrain?.sampleCountX).toBe(5);
|
||||
expect(updatedTerrain?.sampleCountZ).toBe(7);
|
||||
expect(updatedTerrain?.cellSize).toBe(2);
|
||||
});
|
||||
|
||||
fireEvent.click(screen.getByTestId("terrain-collision-enabled"));
|
||||
|
||||
await waitFor(() => {
|
||||
expect(
|
||||
store.getState().document.terrains[createdTerrain.id]?.collisionEnabled
|
||||
).toBe(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -428,4 +428,58 @@ describe("ViewportCanvas", () => {
|
||||
screen.getByTestId("viewport-terrain-brush-preview-topLeft")
|
||||
).toHaveTextContent("terrain · smooth");
|
||||
});
|
||||
|
||||
it("shows the active terrain paint layer in the viewport overlay", () => {
|
||||
const sceneDocument = createEmptySceneDocument();
|
||||
const terrainBrushState: ArmedTerrainBrushState = {
|
||||
terrainId: "terrain-selected",
|
||||
tool: "paint",
|
||||
layerIndex: 2,
|
||||
radius: 2.5,
|
||||
strength: 0.4,
|
||||
falloff: 0.7
|
||||
};
|
||||
|
||||
render(
|
||||
<ViewportCanvas
|
||||
panelId="topLeft"
|
||||
world={sceneDocument.world}
|
||||
sceneDocument={sceneDocument}
|
||||
editorSimulationScene={null}
|
||||
editorSimulationClock={null}
|
||||
projectAssets={sceneDocument.assets}
|
||||
loadedModelAssets={{}}
|
||||
loadedImageAssets={{}}
|
||||
whiteboxSelectionMode="object"
|
||||
whiteboxSnapEnabled
|
||||
whiteboxSnapStep={1}
|
||||
viewportGridVisible={true}
|
||||
selection={{ kind: "terrains", ids: [terrainBrushState.terrainId] }}
|
||||
activeSelectionId={terrainBrushState.terrainId}
|
||||
terrainBrushState={terrainBrushState}
|
||||
toolMode="select"
|
||||
toolPreview={{ kind: "none" }}
|
||||
transformSession={createInactiveTransformSession()}
|
||||
cameraState={createDefaultViewportPanelCameraState()}
|
||||
viewMode="perspective"
|
||||
displayMode="normal"
|
||||
layoutMode="single"
|
||||
isActivePanel
|
||||
focusRequestId={0}
|
||||
focusSelection={{ kind: "none" }}
|
||||
onSelectionChange={vi.fn()}
|
||||
onTerrainBrushCommit={vi.fn(() => true)}
|
||||
onCommitCreation={vi.fn(() => true)}
|
||||
onCameraStateChange={vi.fn()}
|
||||
onToolPreviewChange={vi.fn()}
|
||||
onTransformSessionChange={vi.fn()}
|
||||
onTransformCommit={vi.fn()}
|
||||
onTransformCancel={vi.fn()}
|
||||
/>
|
||||
);
|
||||
|
||||
expect(
|
||||
screen.getByTestId("viewport-terrain-brush-preview-topLeft")
|
||||
).toHaveTextContent("terrain · paint · layer 3");
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user