164 lines
4.9 KiB
TypeScript
164 lines
4.9 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import {
|
|
createConeBrush,
|
|
createRadialPrismBrush,
|
|
createTorusBrush,
|
|
createWedgeBrush,
|
|
deriveBrushSizeFromGeometry
|
|
} from "../../src/document/brushes";
|
|
import { buildBoxBrushDerivedMeshData, validateBoxBrushGeometry } from "../../src/geometry/box-brush-mesh";
|
|
import {
|
|
getBrushEdgeIds,
|
|
getBrushFaceIds,
|
|
getBrushVertexIds
|
|
} from "../../src/geometry/whitebox-topology";
|
|
|
|
describe("whitebox primitives", () => {
|
|
it("builds deterministic wedge topology and finite derived mesh data", () => {
|
|
const brush = createWedgeBrush({
|
|
id: "brush-wedge-test",
|
|
size: {
|
|
x: 4,
|
|
y: 2,
|
|
z: 6
|
|
}
|
|
});
|
|
const derivedMesh = buildBoxBrushDerivedMeshData(brush);
|
|
|
|
expect(brush.rotationDegrees).toEqual({
|
|
x: 0,
|
|
y: 0,
|
|
z: 180
|
|
});
|
|
expect(getBrushFaceIds(brush)).toEqual([
|
|
"bottom",
|
|
"back",
|
|
"slope",
|
|
"left",
|
|
"right"
|
|
]);
|
|
expect(getBrushEdgeIds(brush)).toEqual([
|
|
"bottomBack",
|
|
"bottomFront",
|
|
"bottomLeft",
|
|
"bottomRight",
|
|
"topBack",
|
|
"leftBack",
|
|
"rightBack",
|
|
"leftSlope",
|
|
"rightSlope"
|
|
]);
|
|
expect(getBrushVertexIds(brush)).toEqual([
|
|
"negX_negY_negZ",
|
|
"posX_negY_negZ",
|
|
"negX_negY_posZ",
|
|
"posX_negY_posZ",
|
|
"negX_posY_negZ",
|
|
"posX_posY_negZ"
|
|
]);
|
|
expect(validateBoxBrushGeometry(brush)).toEqual([]);
|
|
expect(derivedMesh.faceIdsInOrder).toEqual(getBrushFaceIds(brush));
|
|
expect(Array.from(derivedMesh.colliderVertices).every(Number.isFinite)).toBe(
|
|
true
|
|
);
|
|
expect(Array.from(derivedMesh.colliderIndices).every(Number.isFinite)).toBe(
|
|
true
|
|
);
|
|
expect(deriveBrushSizeFromGeometry(brush.geometry)).toEqual(brush.size);
|
|
});
|
|
|
|
it("builds deterministic cylinder topology and finite collider buffers", () => {
|
|
const brush = createRadialPrismBrush({
|
|
id: "brush-cylinder-test",
|
|
sideCount: 12,
|
|
size: {
|
|
x: 4,
|
|
y: 3,
|
|
z: 4
|
|
}
|
|
});
|
|
const derivedMesh = buildBoxBrushDerivedMeshData(brush);
|
|
|
|
expect(getBrushFaceIds(brush)).toEqual([
|
|
"top",
|
|
"bottom",
|
|
...Array.from({ length: 12 }, (_, index) => `side-${index}`)
|
|
]);
|
|
expect(getBrushEdgeIds(brush)).toHaveLength(36);
|
|
expect(getBrushVertexIds(brush)).toHaveLength(24);
|
|
expect(validateBoxBrushGeometry(brush)).toEqual([]);
|
|
expect(derivedMesh.faceIdsInOrder).toEqual(getBrushFaceIds(brush));
|
|
expect(
|
|
derivedMesh.faceSurfaces.find((surface) => surface.faceId === "top")?.normal
|
|
.y
|
|
).toBeGreaterThan(0.99);
|
|
expect(
|
|
derivedMesh.faceSurfaces.find((surface) => surface.faceId === "bottom")?.normal
|
|
.y
|
|
).toBeLessThan(-0.99);
|
|
expect(Array.from(derivedMesh.colliderVertices).every(Number.isFinite)).toBe(
|
|
true
|
|
);
|
|
expect(Array.from(derivedMesh.colliderIndices).every(Number.isFinite)).toBe(
|
|
true
|
|
);
|
|
expect(deriveBrushSizeFromGeometry(brush.geometry)).toEqual(brush.size);
|
|
});
|
|
|
|
it("builds deterministic cone topology and finite collider buffers", () => {
|
|
const brush = createConeBrush({
|
|
id: "brush-cone-test",
|
|
sideCount: 12,
|
|
size: {
|
|
x: 4,
|
|
y: 3,
|
|
z: 4
|
|
}
|
|
});
|
|
const derivedMesh = buildBoxBrushDerivedMeshData(brush);
|
|
|
|
expect(getBrushFaceIds(brush)).toEqual([
|
|
"bottom",
|
|
...Array.from({ length: 12 }, (_, index) => `side-${index}`)
|
|
]);
|
|
expect(getBrushEdgeIds(brush)).toHaveLength(24);
|
|
expect(getBrushVertexIds(brush)).toHaveLength(13);
|
|
expect(validateBoxBrushGeometry(brush)).toEqual([]);
|
|
expect(derivedMesh.faceIdsInOrder).toEqual(getBrushFaceIds(brush));
|
|
expect(
|
|
derivedMesh.faceSurfaces.find((surface) => surface.faceId === "bottom")?.normal
|
|
.y
|
|
).toBeLessThan(-0.99);
|
|
expect(Array.from(derivedMesh.colliderVertices).every(Number.isFinite)).toBe(
|
|
true
|
|
);
|
|
expect(Array.from(derivedMesh.colliderIndices).every(Number.isFinite)).toBe(
|
|
true
|
|
);
|
|
expect(deriveBrushSizeFromGeometry(brush.geometry)).toEqual(brush.size);
|
|
});
|
|
|
|
it("builds deterministic torus topology and finite collider buffers", () => {
|
|
const brush = createTorusBrush({
|
|
id: "brush-torus-test",
|
|
majorSegmentCount: 16,
|
|
tubeSegmentCount: 8
|
|
});
|
|
const derivedMesh = buildBoxBrushDerivedMeshData(brush);
|
|
|
|
expect(getBrushFaceIds(brush)).toHaveLength(128);
|
|
expect(getBrushEdgeIds(brush)).toHaveLength(256);
|
|
expect(getBrushVertexIds(brush)).toHaveLength(128);
|
|
expect(validateBoxBrushGeometry(brush)).toEqual([]);
|
|
expect(derivedMesh.faceIdsInOrder).toEqual(getBrushFaceIds(brush));
|
|
expect(Array.from(derivedMesh.colliderVertices).every(Number.isFinite)).toBe(
|
|
true
|
|
);
|
|
expect(Array.from(derivedMesh.colliderIndices).every(Number.isFinite)).toBe(
|
|
true
|
|
);
|
|
expect(deriveBrushSizeFromGeometry(brush.geometry)).toEqual(brush.size);
|
|
});
|
|
});
|