import type { ToolcraftModelBounds, ToolcraftModelDocument, ToolcraftModelDocumentV1, ToolcraftModelDocumentV2, ToolcraftModelMaterial, ToolcraftModelNode, ToolcraftModelPrimitive, ToolcraftModelPrimitiveV2, ToolcraftModelTexture, } from "./model-document"; import { createToolcraftModelAppearanceResourceRef } from "./model-appearance-resource"; export const IDENTITY_MODEL_MATRIX = [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, ] as const; export function createModelBounds( min: readonly [number, number, number] = [0, 0, 0], max: readonly [number, number, number] = [2, 3, 0], ): ToolcraftModelBounds { return { max: [...max], min: [...min] }; } export function createModelPrimitive( overrides: Partial = {}, ): ToolcraftModelPrimitive { return { bounds: createModelBounds(), id: "primitive-1", indices: new Uint32Array([0, 1, 2]), normals: new Float32Array([ 0, 0, 1, 0, 0, 1, 0, 0, 1, ]), positions: new Float32Array([ 0, 0, 0, 2, 0, 0, 0, 3, 0, ]), ...overrides, }; } export function createModelNode( overrides: Partial = {}, ): ToolcraftModelNode { return { children: [], id: "node-1", localMatrix: [...IDENTITY_MODEL_MATRIX], name: "Root", primitiveIds: ["primitive-1"], ...overrides, }; } export function createValidModelDocument( overrides: Partial = {}, ): ToolcraftModelDocumentV1 { return { bounds: createModelBounds(), nodes: [createModelNode()], primitives: [createModelPrimitive()], provenance: { adapterVersion: "gltf-adapter@1", canonicalSchemaVersion: 1, operations: [], sourceFormat: "glb", }, rootNodeIds: ["node-1"], version: 1, ...overrides, }; } export function createModelTexture( overrides: Partial = {}, ): ToolcraftModelTexture { const contentDigest = `sha256:${"1".repeat(64)}`; return { colorSpace: "srgb", contentDigest, height: 2, id: "texture-1", mimeType: "image/png", resourceRef: createToolcraftModelAppearanceResourceRef(contentDigest), sampler: { magFilter: "linear", minFilter: "linear-mipmap-linear", wrapS: "repeat", wrapT: "repeat", }, width: 2, ...overrides, }; } export function createModelMaterial( overrides: Partial = {}, ): ToolcraftModelMaterial { return { alphaCutoff: 0.5, alphaMode: "opaque", baseColor: [0.8, 0.7, 0.6], baseColorTexture: { texCoord: 0, textureId: "texture-1" }, doubleSided: false, emissive: [0, 0, 0], id: "material-1", metallic: 0, opacity: 1, roughness: 0.5, usesVertexColor: true, ...overrides, }; } export function createModelPrimitiveV2( overrides: Partial = {}, ): ToolcraftModelPrimitiveV2 { return { ...createModelPrimitive(), colors: { components: 4, values: new Float32Array([ 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, ]), }, materialId: "material-1", textureCoordinates: [{ set: 0, values: new Float32Array([0, 0, 1, 0, 0, 1]), }], ...overrides, }; } export function createValidModelDocumentV2( overrides: Partial = {}, ): ToolcraftModelDocumentV2 { return { bounds: createModelBounds(), materials: [createModelMaterial()], nodes: [createModelNode()], primitives: [createModelPrimitiveV2()], provenance: { adapterVersion: "gltf-adapter@2", canonicalSchemaVersion: 2, operations: [], sourceFormat: "glb", }, rootNodeIds: ["node-1"], textures: [createModelTexture()], version: 2, ...overrides, }; }