diff --git a/docs/usage.md b/docs/usage.md index 538a07a..ac7cfe7 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -36,9 +36,9 @@ Named by noun. - Behavior: Uses the Babylon scene loader to load an STL using NullEngine. - `DracoEncoderBlock` - Input: none - - Output: output (DracoEncoder) + - Output: output (GltfMeshCompressionOptions) - Resources: Babylon default DracoEncoder - - Behavior: Attaches to `GltfOutputBlock`'s geometryCompression port. When present, sets the glTF export's `meshCompressionMethod` option to "Draco". + - Behavior: Prepares Babylon's default Draco encoder and provides `{ meshCompressionMethod: "Draco" }` as the per-export glTF mesh compression options that enable it. Connect its output to `GltfOutputBlock`'s `geometryCompressionOptions` port. # Transforms @@ -55,10 +55,10 @@ Named by verb. Named by noun. - `GltfOutputBlock` - - Inputs: input (BabylonScene), geometryCompressor (DracoEncoder, optional) + - Inputs: input (BabylonScene), geometryCompressionOptions (GltfMeshCompressionOptions, optional) - Output: `File` which is a GLB - Resources: Babylon glTF exporter - - Behavior: Uses GLBExport to export scene to GLB. Grabs GLB file from return of the GLBExport function. If geometryCompressor is truthy, sets meshCompressionMethod export option to "Draco". + - Behavior: Uses GLBExport to export the scene to GLB and passes through any supplied mesh compression options. If `geometryCompressionOptions` is not connected, the export remains uncompressed. # Example: Hello, pipeline! @@ -90,7 +90,7 @@ const destination = new GltfOutputBlock(); source.output.connectTo(compressTextures.input); compressTextures.output.connectTo(destination.input); -dracoEncoder.output.connectTo(destination.geometryCompressor); +dracoEncoder.output.connectTo(destination.geometryCompressionOptions); const asset = new NodeAsset({ name: "gltf-roundtrip", diff --git a/src/block/connectionPointType.ts b/src/block/connectionPointType.ts deleted file mode 100644 index ffeef62..0000000 --- a/src/block/connectionPointType.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { DracoEncoder } from "@babylonjs/core/Meshes/Compression/dracoEncoder.js"; -import type { Scene as BabylonScene } from "@babylonjs/core/scene.js"; - -declare const connectionPointData: unique symbol; - -export interface ConnectionPointType { - readonly id: string; - readonly [connectionPointData]: Payload; - is(value: unknown): value is Payload; -} - -export type ConnectionPointValue> = C extends ConnectionPointType ? TData : never; - -export function defineConnectionPointType

(id: string, isData: (value: unknown) => value is P): ConnectionPointType

{ - return Object.freeze({ id, is: isData }) as ConnectionPointType

; -} - -// Definitions - -export const UrlType = /* @__PURE__ */ defineConnectionPointType("url", (value): value is string => typeof value === "string"); - -export const FileType = /* @__PURE__ */ defineConnectionPointType("file", (value): value is File => value instanceof File); - -export const DracoEncoderType = /* @__PURE__ */ defineConnectionPointType( - "draco-encoder", - (value): value is DracoEncoder => typeof value === "object" && value !== null && "encodeMeshAsync" in value && typeof value.encodeMeshAsync === "function" -); - -export const BabylonSceneType = /* @__PURE__ */ defineConnectionPointType( - "babylon-scene", - (value): value is BabylonScene => - typeof value === "object" && value !== null && "getEngine" in value && typeof value.getEngine === "function" && "dispose" in value && typeof value.dispose === "function" -); diff --git a/src/block/block.ts b/src/blocks/block.ts similarity index 99% rename from src/block/block.ts rename to src/blocks/block.ts index 661e089..83b0e48 100644 --- a/src/block/block.ts +++ b/src/blocks/block.ts @@ -1,4 +1,4 @@ -import type { ConnectionPointType, ConnectionPointValue } from "./connectionPointType"; +import type { ConnectionPointType, ConnectionPointValue } from "../connectionPoints/connectionPoint"; import type { _AnyBlockDefinition, AuxiliaryInputDefinition, ConfigDefinition, ConfigValues } from "./blockDefinition"; /** @internal */ diff --git a/src/block/blockDefinition.ts b/src/blocks/blockDefinition.ts similarity index 99% rename from src/block/blockDefinition.ts rename to src/blocks/blockDefinition.ts index 1650f3c..427123e 100644 --- a/src/block/blockDefinition.ts +++ b/src/blocks/blockDefinition.ts @@ -1,4 +1,4 @@ -import type { ConnectionPointType, ConnectionPointValue } from "./connectionPointType"; +import type { ConnectionPointType, ConnectionPointValue } from "../connectionPoints/connectionPoint"; import type { ResourceDependencies, ResourceValues } from "../resources/resource"; declare const configType: unique symbol; diff --git a/src/blocks/compressTexturesBlock.ts b/src/blocks/compressTexturesBlock.ts index 04aa5cb..13a1a52 100644 --- a/src/blocks/compressTexturesBlock.ts +++ b/src/blocks/compressTexturesBlock.ts @@ -4,9 +4,9 @@ import type { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial.js"; import type { Scene as BabylonScene } from "@babylonjs/core/scene.js"; import type sharpFactory from "sharp"; -import { Block } from "../block/block"; -import { defineBlock } from "../block/blockDefinition"; -import { BabylonSceneType } from "../block/connectionPointType"; +import { Block } from "./block"; +import { defineBlock } from "./blockDefinition"; +import { BabylonSceneType } from "../connectionPoints/babylonScene"; type CompressTexturesBlockDefinition = ReturnType; diff --git a/src/blocks/dracoEncoderBlock.ts b/src/blocks/dracoEncoderBlock.ts index d1e30dd..cc69697 100644 --- a/src/blocks/dracoEncoderBlock.ts +++ b/src/blocks/dracoEncoderBlock.ts @@ -1,25 +1,24 @@ import type { IDracoCodecConfiguration } from "@babylonjs/core/Meshes/Compression/dracoCodec.js"; -import type { DracoEncoder as BabylonDracoEncoder } from "@babylonjs/core/Meshes/Compression/dracoEncoder.js"; -import { Block, type BlockOptions } from "../block/block"; -import { defineSourceBlock } from "../block/blockDefinition"; -import { DracoEncoderType } from "../block/connectionPointType"; +import { createGltfMeshCompressionOptions, GltfMeshCompressionOptionsType, type GltfMeshCompressionOptions } from "../connectionPoints/gltfMeshCompressionOptions"; +import { Block, type BlockOptions } from "./block"; +import { defineSourceBlock } from "./blockDefinition"; const DracoEncoderBlockDefinition = /* @__PURE__ */ defineSourceBlock({ type: "input.draco-encoder", - output: DracoEncoderType, - runAsync: async () => { + output: GltfMeshCompressionOptionsType, + runAsync: async (): Promise => { const [{ DracoEncoder }, { RegisterKHR_draco_mesh_compression }] = await Promise.all([ import("@babylonjs/core/Meshes/Compression/dracoEncoder.js"), import("@babylonjs/serializers/glTF/2.0/Extensions/KHR_draco_mesh_compression.pure.js"), ]); await prepareDefaultEncoderForNodeAsync(DracoEncoder); RegisterKHR_draco_mesh_compression(); - return DracoEncoder.Default; + return createGltfMeshCompressionOptions({ meshCompressionMethod: "Draco" }); }, }); -/** Provides Babylon.js's default Draco encoder for glTF geometry compression. */ +/** Prepares Babylon.js's default Draco encoder and provides glTF mesh compression options that enable it. */ export class DracoEncoderBlock extends Block { public constructor(options?: BlockOptions) { super(DracoEncoderBlockDefinition, options); @@ -28,7 +27,6 @@ export class DracoEncoderBlock extends Block interface DracoEncoderConstructor { DefaultConfiguration: IDracoCodecConfiguration; - readonly Default: BabylonDracoEncoder; ResetDefault(skipDispose?: boolean): void; } diff --git a/src/blocks/fbxInputBlock.ts b/src/blocks/fbxInputBlock.ts index d317634..6241444 100644 --- a/src/blocks/fbxInputBlock.ts +++ b/src/blocks/fbxInputBlock.ts @@ -1,7 +1,8 @@ -import { Block, type BlockOptions } from "../block/block"; -import { defineBlock } from "../block/blockDefinition"; -import { BabylonSceneType, UrlType } from "../block/connectionPointType"; +import { BabylonSceneType } from "../connectionPoints/babylonScene"; +import { UrlType } from "../connectionPoints/url"; import { NullEngineResource } from "../resources/nullEngineResource"; +import { Block, type BlockOptions } from "./block"; +import { defineBlock } from "./blockDefinition"; import { loadSingleFileSceneWithPluginAsync } from "../helpers/loadSceneWithPlugin"; const FbxInputBlockDefinition = /* @__PURE__ */ defineBlock({ diff --git a/src/blocks/gltfInputBlock.ts b/src/blocks/gltfInputBlock.ts index 41b5d9b..96a7e1b 100644 --- a/src/blocks/gltfInputBlock.ts +++ b/src/blocks/gltfInputBlock.ts @@ -1,7 +1,8 @@ -import { Block, type BlockOptions } from "../block/block"; -import { defineBlock } from "../block/blockDefinition"; -import { BabylonSceneType, UrlType } from "../block/connectionPointType"; +import { BabylonSceneType } from "../connectionPoints/babylonScene"; +import { UrlType } from "../connectionPoints/url"; import { NullEngineResource } from "../resources/nullEngineResource"; +import { Block, type BlockOptions } from "./block"; +import { defineBlock } from "./blockDefinition"; import { fetchAsDataUriAsync, loadSingleFileSceneWithPluginAsync } from "../helpers/loadSceneWithPlugin"; const GltfInputBlockDefinition = /* @__PURE__ */ defineBlock({ diff --git a/src/blocks/gltfOutputBlock.ts b/src/blocks/gltfOutputBlock.ts index 3089703..6a999be 100644 --- a/src/blocks/gltfOutputBlock.ts +++ b/src/blocks/gltfOutputBlock.ts @@ -1,18 +1,20 @@ import type { BaseTexture } from "@babylonjs/core/Materials/Textures/baseTexture.js"; import type { Scene as BabylonScene } from "@babylonjs/core/scene.js"; -import { Block, type BlockOptions, type InputPort } from "../block/block"; -import { defineBlock } from "../block/blockDefinition"; -import { BabylonSceneType, DracoEncoderType, FileType } from "../block/connectionPointType"; +import { BabylonSceneType } from "../connectionPoints/babylonScene"; +import { FileType } from "../connectionPoints/file"; +import { GltfMeshCompressionOptionsType, type GltfMeshCompressionOptions } from "../connectionPoints/gltfMeshCompressionOptions"; +import { Block, type BlockOptions, type InputPort } from "./block"; +import { defineBlock } from "./blockDefinition"; const GltfOutputBlockDefinition = /* @__PURE__ */ defineBlock({ type: "output.gltf", input: BabylonSceneType, auxiliaryInputs: { - geometryCompressor: DracoEncoderType, + geometryCompressionOptions: GltfMeshCompressionOptionsType, }, output: FileType, - runAsync: (scene, _config, _resources, { geometryCompressor }) => serializeGlbAsync(scene, geometryCompressor === undefined ? undefined : "Draco"), + runAsync: (scene, _config, _resources, { geometryCompressionOptions }) => serializeGlbAsync(scene, geometryCompressionOptions), }); /** Options for naming the block or supplying its initial scene input. */ @@ -20,27 +22,22 @@ export type GltfOutputBlockOptions = BlockOptions { - public readonly geometryCompressor: InputPort; + public readonly geometryCompressionOptions: InputPort; public constructor(options?: GltfOutputBlockOptions) { super(GltfOutputBlockDefinition, options); - this.geometryCompressor = this.auxiliaryInputs.geometryCompressor; + this.geometryCompressionOptions = this.auxiliaryInputs.geometryCompressionOptions; } } -async function serializeGlbAsync(scene: BabylonScene, meshCompressionMethod: "Draco" | undefined): Promise { +async function serializeGlbAsync(scene: BabylonScene, geometryCompressionOptions: GltfMeshCompressionOptions | undefined): Promise { if (scene.textures.some(requiresTextureTransform)) { const { RegisterKHR_texture_transform } = await import("@babylonjs/serializers/glTF/2.0/Extensions/KHR_texture_transform.pure.js"); RegisterKHR_texture_transform(); } const { GLTF2Export } = await import("@babylonjs/serializers/glTF/2.0/glTFSerializer.js"); const fileName = "scene.glb"; - const result = - meshCompressionMethod === undefined - ? await GLTF2Export.GLBAsync(scene, fileName) - : await GLTF2Export.GLBAsync(scene, fileName, { - meshCompressionMethod, - }); + const result = await GLTF2Export.GLBAsync(scene, fileName, geometryCompressionOptions); const root = result.files[fileName]; if (!(root instanceof Blob)) { throw new Error(`The Babylon glTF serializer did not produce "${fileName}".`); diff --git a/src/blocks/objInputBlock.ts b/src/blocks/objInputBlock.ts index c46ac9e..617542f 100644 --- a/src/blocks/objInputBlock.ts +++ b/src/blocks/objInputBlock.ts @@ -1,11 +1,12 @@ import type { BaseTexture } from "@babylonjs/core/Materials/Textures/baseTexture.js"; import type { Scene as BabylonScene } from "@babylonjs/core/scene.js"; -import { Block, type BlockOptions } from "../block/block"; -import { defineBlock } from "../block/blockDefinition"; -import { BabylonSceneType, UrlType } from "../block/connectionPointType"; +import { BabylonSceneType } from "../connectionPoints/babylonScene"; +import { UrlType } from "../connectionPoints/url"; import { createDataUri, fetchOrThrowAsync, isHttpUrl, loadSceneWithPluginAsync } from "../helpers/loadSceneWithPlugin"; import { NullEngineResource } from "../resources/nullEngineResource"; +import { Block, type BlockOptions } from "./block"; +import { defineBlock } from "./blockDefinition"; const MaximumConcurrentTextureFetches = 8; diff --git a/src/blocks/stlInputBlock.ts b/src/blocks/stlInputBlock.ts index 845810b..8c1c5f6 100644 --- a/src/blocks/stlInputBlock.ts +++ b/src/blocks/stlInputBlock.ts @@ -1,7 +1,8 @@ -import { Block, type BlockOptions } from "../block/block"; -import { defineBlock } from "../block/blockDefinition"; -import { BabylonSceneType, UrlType } from "../block/connectionPointType"; +import { BabylonSceneType } from "../connectionPoints/babylonScene"; +import { UrlType } from "../connectionPoints/url"; import { NullEngineResource } from "../resources/nullEngineResource"; +import { Block, type BlockOptions } from "./block"; +import { defineBlock } from "./blockDefinition"; import { loadSingleFileSceneWithPluginAsync } from "../helpers/loadSceneWithPlugin"; const StlInputBlockDefinition = /* @__PURE__ */ defineBlock({ diff --git a/src/connectionPoints/babylonScene.ts b/src/connectionPoints/babylonScene.ts new file mode 100644 index 0000000..0a530b0 --- /dev/null +++ b/src/connectionPoints/babylonScene.ts @@ -0,0 +1,9 @@ +import type { Scene as BabylonScene } from "@babylonjs/core/scene.js"; + +import { defineConnectionPointType } from "./connectionPoint"; + +export const BabylonSceneType = /* @__PURE__ */ defineConnectionPointType( + "babylon-scene", + (value): value is BabylonScene => + typeof value === "object" && value !== null && "getEngine" in value && typeof value.getEngine === "function" && "dispose" in value && typeof value.dispose === "function" +); diff --git a/src/connectionPoints/connectionPoint.ts b/src/connectionPoints/connectionPoint.ts new file mode 100644 index 0000000..f028249 --- /dev/null +++ b/src/connectionPoints/connectionPoint.ts @@ -0,0 +1,13 @@ +declare const connectionPointData: unique symbol; + +export interface ConnectionPointType { + readonly id: string; + readonly [connectionPointData]: Payload; + is(value: unknown): value is Payload; +} + +export type ConnectionPointValue> = C extends ConnectionPointType ? TData : never; + +export function defineConnectionPointType

(id: string, isData: (value: unknown) => value is P): ConnectionPointType

{ + return Object.freeze({ id, is: isData }) as ConnectionPointType

; +} diff --git a/src/connectionPoints/file.ts b/src/connectionPoints/file.ts new file mode 100644 index 0000000..56d1743 --- /dev/null +++ b/src/connectionPoints/file.ts @@ -0,0 +1,3 @@ +import { defineConnectionPointType } from "./connectionPoint"; + +export const FileType = /* @__PURE__ */ defineConnectionPointType("file", (value): value is File => value instanceof File); diff --git a/src/connectionPoints/gltfMeshCompressionOptions.ts b/src/connectionPoints/gltfMeshCompressionOptions.ts new file mode 100644 index 0000000..d54f113 --- /dev/null +++ b/src/connectionPoints/gltfMeshCompressionOptions.ts @@ -0,0 +1,16 @@ +import type { IExportOptions } from "@babylonjs/serializers/glTF/2.0/glTFSerializer.js"; + +import { defineConnectionPointType } from "./connectionPoint"; + +export type GltfMeshCompressionOptions = Required>; + +const gltfMeshCompressionOptions = /* @__PURE__ */ Symbol("gltf-mesh-compression-options"); + +export function createGltfMeshCompressionOptions(options: GltfMeshCompressionOptions): GltfMeshCompressionOptions { + return Object.freeze(Object.defineProperty({ ...options }, gltfMeshCompressionOptions, { value: true })); +} + +export const GltfMeshCompressionOptionsType = /* @__PURE__ */ defineConnectionPointType( + "gltf-mesh-compression-options", + (value): value is GltfMeshCompressionOptions => typeof value === "object" && value !== null && gltfMeshCompressionOptions in value +); diff --git a/src/connectionPoints/url.ts b/src/connectionPoints/url.ts new file mode 100644 index 0000000..487c3e5 --- /dev/null +++ b/src/connectionPoints/url.ts @@ -0,0 +1,3 @@ +import { defineConnectionPointType } from "./connectionPoint"; + +export const UrlType = /* @__PURE__ */ defineConnectionPointType("url", (value): value is string => typeof value === "string"); diff --git a/src/index.ts b/src/index.ts index af1d651..370418c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,5 +5,6 @@ export { GltfInputBlock } from "./blocks/gltfInputBlock"; export { GltfOutputBlock, type GltfOutputBlockOptions } from "./blocks/gltfOutputBlock"; export { ObjInputBlock } from "./blocks/objInputBlock"; export { StlInputBlock } from "./blocks/stlInputBlock"; -export { NodeAsset } from "./nodeAsset/nodeAsset"; -export { NodeAssetContext } from "./nodeAsset/nodeAssetContext"; +export type { GltfMeshCompressionOptions } from "./connectionPoints/gltfMeshCompressionOptions"; +export { NodeAsset } from "./nodeAsset"; +export { NodeAssetContext } from "./nodeAssetContext"; diff --git a/src/nodeAsset/nodeAsset.ts b/src/nodeAsset.ts similarity index 97% rename from src/nodeAsset/nodeAsset.ts rename to src/nodeAsset.ts index 3318ff9..a5305c0 100644 --- a/src/nodeAsset/nodeAsset.ts +++ b/src/nodeAsset.ts @@ -1,7 +1,7 @@ -import type { _BlockRuntime } from "../block/block"; -import type { ConnectionPointValue } from "../block/connectionPointType"; +import type { _BlockRuntime } from "./blocks/block"; +import type { ConnectionPointValue } from "./connectionPoints/connectionPoint"; import type { NodeAssetContext } from "./nodeAssetContext"; -import { ResourceScope } from "../resources/resourceScope"; +import { ResourceScope } from "./resources/resourceScope"; type AnyBlock = _BlockRuntime; diff --git a/src/nodeAsset/nodeAssetContext.ts b/src/nodeAssetContext.ts similarity index 87% rename from src/nodeAsset/nodeAssetContext.ts rename to src/nodeAssetContext.ts index 8918006..ca6d054 100644 --- a/src/nodeAsset/nodeAssetContext.ts +++ b/src/nodeAssetContext.ts @@ -1,6 +1,6 @@ -import type { _BlockRuntime, Block } from "../block/block"; -import type { _InputBlockDefinition } from "../block/blockDefinition"; -import type { ConnectionPointValue } from "../block/connectionPointType"; +import type { _BlockRuntime, Block } from "./blocks/block"; +import type { _InputBlockDefinition } from "./blocks/blockDefinition"; +import type { ConnectionPointValue } from "./connectionPoints/connectionPoint"; import type { NodeAsset } from "./nodeAsset"; type AnyBlock = _BlockRuntime; diff --git a/tests/helpers/numberBlocks.ts b/tests/helpers/numberBlocks.ts index 68d0af3..1240c68 100644 --- a/tests/helpers/numberBlocks.ts +++ b/tests/helpers/numberBlocks.ts @@ -1,5 +1,5 @@ -import { defineBlock, enumValue } from "../../src/block/blockDefinition"; -import { defineConnectionPointType } from "../../src/block/connectionPointType"; +import { defineBlock, enumValue } from "../../src/blocks/blockDefinition"; +import { defineConnectionPointType } from "../../src/connectionPoints/connectionPoint"; export const NumberType = defineConnectionPointType("number", (value): value is number => typeof value === "number"); export const OtherNumberType = defineConnectionPointType("number", (value): value is number => typeof value === "number"); diff --git a/tests/integration/compressedGlbPipeline.test.ts b/tests/integration/compressedGlbPipeline.test.ts index 34c16f9..4c1ed8c 100644 --- a/tests/integration/compressedGlbPipeline.test.ts +++ b/tests/integration/compressedGlbPipeline.test.ts @@ -13,7 +13,7 @@ describe("compressed GLB pipeline", () => { source.output.connectTo(compressTextures.input); compressTextures.output.connectTo(destination.input); - dracoEncoder.output.connectTo(destination.geometryCompressor); + dracoEncoder.output.connectTo(destination.geometryCompressionOptions); const asset = new NodeAsset({ name: "gltf-roundtrip", outputBlock: destination }); const result = await asset.executeAsync(); diff --git a/tests/integration/dracoCompression.test.ts b/tests/integration/dracoCompression.test.ts index 57d64ef..eeeafc4 100644 --- a/tests/integration/dracoCompression.test.ts +++ b/tests/integration/dracoCompression.test.ts @@ -1,8 +1,6 @@ -import type { DracoEncoder as BabylonDracoEncoder } from "@babylonjs/core/Meshes/Compression/dracoEncoder.js"; - import { describe, expect, expectTypeOf, it } from "vitest"; -import { DracoEncoderBlock, GltfInputBlock, GltfOutputBlock, NodeAsset } from "../../src/index"; +import { DracoEncoderBlock, GltfInputBlock, GltfOutputBlock, NodeAsset, type GltfMeshCompressionOptions } from "../../src/index"; import { parseGlbAsync } from "../helpers/glb"; import { generateGltfDataUri } from "../helpers/gltf"; @@ -25,7 +23,7 @@ describe("Draco compression", () => { const encoder = new DracoEncoderBlock(); const destination = new GltfOutputBlock(); source.output.connectTo(destination.input); - encoder.output.connectTo(destination.geometryCompressor); + encoder.output.connectTo(destination.geometryCompressionOptions); return new NodeAsset({ name: `draco-compressed-${name}-glb`, outputBlock: destination }); }); @@ -37,12 +35,31 @@ describe("Draco compression", () => { } }); - it("provides Babylon's default Draco encoder", async () => { + it("provides per-export glTF mesh compression options", async () => { const encoderBlock = new DracoEncoderBlock(); const result = await new NodeAsset({ name: "draco-encoder", outputBlock: encoderBlock }).executeAsync(); - const { DracoEncoder } = await import("@babylonjs/core/Meshes/Compression/dracoEncoder.js"); - expectTypeOf(result).toEqualTypeOf(); - expect(result).toBe(DracoEncoder.Default); + expectTypeOf(result).toEqualTypeOf(); + expect(result).toEqual({ meshCompressionMethod: "Draco" }); + }); + + it("leaves a later unconnected glTF output uncompressed", async () => { + const compressedSource = new GltfInputBlock({ input: generateGltfDataUri() }); + const encoder = new DracoEncoderBlock(); + const compressedDestination = new GltfOutputBlock(); + compressedSource.output.connectTo(compressedDestination.input); + encoder.output.connectTo(compressedDestination.geometryCompressionOptions); + + await new NodeAsset({ name: "draco-compressed-glb", outputBlock: compressedDestination }).executeAsync(); + + const uncompressedSource = new GltfInputBlock({ input: generateGltfDataUri() }); + const uncompressedDestination = new GltfOutputBlock(); + uncompressedSource.output.connectTo(uncompressedDestination.input); + + const result = await new NodeAsset({ name: "uncompressed-glb", outputBlock: uncompressedDestination }).executeAsync(); + const { json } = await parseGlbAsync(result); + + expect(json.extensionsUsed ?? []).not.toContain("KHR_draco_mesh_compression"); + expect(json.meshes?.[0]?.primitives[0]?.extensions?.KHR_draco_mesh_compression).toBeUndefined(); }); }); diff --git a/tests/integration/gltfOutput.test.ts b/tests/integration/gltfOutput.test.ts index 31e4a46..7399bb9 100644 --- a/tests/integration/gltfOutput.test.ts +++ b/tests/integration/gltfOutput.test.ts @@ -3,9 +3,9 @@ import type { Texture } from "@babylonjs/core/Materials/Textures/texture.js"; import { describe, expect, it } from "vitest"; -import { Block } from "../../src/block/block"; -import { defineBlock } from "../../src/block/blockDefinition"; -import { BabylonSceneType } from "../../src/block/connectionPointType"; +import { Block } from "../../src/blocks/block"; +import { defineBlock } from "../../src/blocks/blockDefinition"; +import { BabylonSceneType } from "../../src/connectionPoints/babylonScene"; import { GltfInputBlock, GltfOutputBlock, NodeAsset } from "../../src/index"; import { parseGlbAsync } from "../helpers/glb"; import { generateGltfDataUri, generateTexturedGltfDataUri } from "../helpers/gltf"; diff --git a/tests/unit/block.test.ts b/tests/unit/block.test.ts index 1cfcc90..c554b97 100644 --- a/tests/unit/block.test.ts +++ b/tests/unit/block.test.ts @@ -1,8 +1,8 @@ import { describe, expect, it } from "vitest"; -import { Block } from "../../src/block/block"; -import { defineBlock, value } from "../../src/block/blockDefinition"; -import { NodeAsset } from "../../src/nodeAsset/nodeAsset"; +import { Block } from "../../src/blocks/block"; +import { defineBlock, value } from "../../src/blocks/blockDefinition"; +import { NodeAsset } from "../../src/nodeAsset"; import { ScaleDefinition, NumberDefinition, OtherNumberDefinition, NumberType } from "../helpers/numberBlocks"; describe("Block class", () => { diff --git a/tests/unit/nodeAsset.test.ts b/tests/unit/nodeAsset.test.ts index 747a212..df03c48 100644 --- a/tests/unit/nodeAsset.test.ts +++ b/tests/unit/nodeAsset.test.ts @@ -1,7 +1,7 @@ import { describe, expect, expectTypeOf, it } from "vitest"; -import { Block } from "../../src/block/block"; -import { defineBlock, defineSourceBlock } from "../../src/block/blockDefinition"; +import { Block } from "../../src/blocks/block"; +import { defineBlock, defineSourceBlock } from "../../src/blocks/blockDefinition"; import { NodeAsset, NodeAssetContext } from "../../src/index"; import type { Resource } from "../../src/resources/resource"; import { ScaleDefinition, NumberDefinition } from "../helpers/numberBlocks";