import { describe, expect, it } from "vitest"; import { createValidModelDocument } from "../../model-import/canonical/model-document-test-support"; import { applyToolcraftModelDisplayFitToPoint, createToolcraftModelDisplayFit, } from "./model-display-fit"; describe("Toolcraft model display fit", () => { it("centers and uniformly contains source bounds without mutating geometry", () => { const document = createValidModelDocument({ bounds: { max: [4, 2, 1], min: [-2, -2, -1] }, }); const positionsBefore = [...document.primitives[0]!.positions]; const nodeMatrixBefore = [...document.nodes[0]!.localMatrix]; const fit = createToolcraftModelDisplayFit(document.bounds, { height: 200, width: 400, }); const fittedMin = applyToolcraftModelDisplayFitToPoint( fit, document.bounds.min, ); const fittedMax = applyToolcraftModelDisplayFitToPoint( fit, document.bounds.max, ); expect(fittedMin[0] + fittedMax[0]).toBeCloseTo(0); expect(fittedMin[1] + fittedMax[1]).toBeCloseTo(0); expect(fittedMin[2] + fittedMax[2]).toBeCloseTo(0); expect(Math.max(Math.abs(fittedMin[0]), Math.abs(fittedMax[0]))) .toBeLessThanOrEqual(1.8); expect(Math.max(Math.abs(fittedMin[1]), Math.abs(fittedMax[1]))) .toBeLessThanOrEqual(0.9); expect(Math.max(Math.abs(fittedMin[2]), Math.abs(fittedMax[2]))) .toBeLessThanOrEqual(0.9); expect(document.primitives[0]!.positions).toEqual( new Float32Array(positionsBefore), ); expect(document.nodes[0]!.localMatrix).toEqual(nodeMatrixBefore); }); it("honors a narrow viewport while retaining one source-preserving scale", () => { const fit = createToolcraftModelDisplayFit( { max: [8, 2, 1], min: [-8, -2, -1] }, { height: 400, width: 200 }, ); const fittedMin = applyToolcraftModelDisplayFitToPoint(fit, [-8, -2, -1]); const fittedMax = applyToolcraftModelDisplayFitToPoint(fit, [8, 2, 1]); expect(fittedMax[0]).toBeCloseTo(0.45); expect(fittedMin[0]).toBeCloseTo(-0.45); expect(fit.matrix[0]).toBe(fit.matrix[5]); expect(fit.matrix[5]).toBe(fit.matrix[10]); }); });