Small World Engine API Reference - v0.78.00
    Preparing search index...

    Interface GltfExtensionPlugin

    A single glTF vendor/community extension's read+write behavior, registered via registerGltfExtension() (see GltfExtensionRegistry.ts) instead of being hardcoded as an if/else branch inside GltfLoader/WorldWriter -- see ADR 0017. All hooks are optional; a plugin implements only the ones its extension actually needs (e.g. SW_prefab_instance only ever sets a plain field, so it has no prepareRead/finalizeWrite).

    interface GltfExtensionPlugin {
        name: string;
        applyNode?(
            obj: Object3D,
            nodeDef: {
                children?: number[];
                extensions?: {
                    KHR_lights_punctual?: { light: number };
                    SW_prefab_instance?: { source: string };
                    SW_stage_zone?: {
                        displayName?: string;
                        points: { scale?: number; u: number; v: number }[];
                    };
                    [key: string]: unknown;
                };
                matrix?: number[];
                mesh?: number;
                name?: string;
                rotation?: number[];
                scale?: number[];
                skin?: number;
                translation?: number[];
            },
            ctx: GltfReadContext,
        ): void;
        decodeGeometry?(
            primitive: {
                attributes: { [key: string]: number };
                extensions?: {
                    KHR_draco_mesh_compression?: {
                        attributes: { [name: string]: number };
                        bufferView: number;
                    };
                    KHR_materials_variants?: {
                        mappings?: { material: number; variants: number[] }[];
                    };
                    [key: string]: unknown;
                };
                indices?: number;
                material?: number;
            },
            ctx: GltfReadContext,
            buffers: ArrayBuffer[],
        ):
            | GeometryDataInterface
            | Promise<GeometryDataInterface | null | undefined>
            | null
            | undefined;
        finalizeWrite?(ctx: GltfWriteContext): void;
        prepareRead?(ctx: GltfReadContext): void;
        readNode?(
            nodeIndex: number,
            nodeDef: {
                children?: number[];
                extensions?: {
                    KHR_lights_punctual?: { light: number };
                    SW_prefab_instance?: { source: string };
                    SW_stage_zone?: {
                        displayName?: string;
                        points: { scale?: number; u: number; v: number }[];
                    };
                    [key: string]: unknown;
                };
                matrix?: number[];
                mesh?: number;
                name?: string;
                rotation?: number[];
                scale?: number[];
                skin?: number;
                translation?: number[];
            },
            name: string,
            ctx: GltfReadContext,
        ): Object3D | undefined;
        resolveTexture?(
            textureDef: {
                extensions?: {
                    KHR_texture_basisu?: { source: number };
                    [key: string]: unknown;
                };
                sampler?: number;
                source?: number;
            },
            ctx: GltfReadContext,
            folderPath: string,
            buffers: ArrayBuffer[],
            assetManager: AssetManager,
        ): Texture | Promise<Texture | null | undefined> | null | undefined;
        writeNode?(obj: Object3D, node: GltfNodeJson, ctx: GltfWriteState): void;
    }
    Index
    name: string

    The glTF extension name this plugin handles, e.g. "KHR_lights_punctual". Also written into the document's extensionsUsed array when this plugin's writeNode actually emits something for at least one node.

    • Apply this extension's data as plain fields onto an already-constructed node (e.g. SW_prefab_instance setting obj.prefabSource) -- called for every node, after its class has already been decided.

      Parameters

      • obj: Object3D
      • nodeDef: {
            children?: number[];
            extensions?: {
                KHR_lights_punctual?: { light: number };
                SW_prefab_instance?: { source: string };
                SW_stage_zone?: {
                    displayName?: string;
                    points: { scale?: number; u: number; v: number }[];
                };
                [key: string]: unknown;
            };
            matrix?: number[];
            mesh?: number;
            name?: string;
            rotation?: number[];
            scale?: number[];
            skin?: number;
            translation?: number[];
        }
      • ctx: GltfReadContext

      Returns void

    • Optional hook to decode geometry for a mesh primitive (e.g. KHR_draco_mesh_compression). Return decoded GeometryDataInterface or undefined / null to defer to the next plugin or the default accessor parser.

      Parameters

      • primitive: {
            attributes: { [key: string]: number };
            extensions?: {
                KHR_draco_mesh_compression?: {
                    attributes: { [name: string]: number };
                    bufferView: number;
                };
                KHR_materials_variants?: {
                    mappings?: { material: number; variants: number[] }[];
                };
                [key: string]: unknown;
            };
            indices?: number;
            material?: number;
        }
      • ctx: GltfReadContext
      • buffers: ArrayBuffer[]

      Returns
          | GeometryDataInterface
          | Promise<GeometryDataInterface | null | undefined>
          | null
          | undefined

    • Optional root-level pre-pass over the whole document, run once before any node is constructed -- e.g. indexing KHR_lights_punctual.lights[] by node so readNode doesn't need to re-scan the root extension data for every node.

      Parameters

      Returns void

    • Decide the concrete Object3D subclass for a node from this extension's data, e.g. a PointLight for KHR_lights_punctual or a StageZoneMarker for SW_stage_zone. Return undefined to defer to the next plugin (or the plain Object3D fallback) -- plugins are tried in registration order and the first non-undefined result wins.

      Parameters

      • nodeIndex: number
      • nodeDef: {
            children?: number[];
            extensions?: {
                KHR_lights_punctual?: { light: number };
                SW_prefab_instance?: { source: string };
                SW_stage_zone?: {
                    displayName?: string;
                    points: { scale?: number; u: number; v: number }[];
                };
                [key: string]: unknown;
            };
            matrix?: number[];
            mesh?: number;
            name?: string;
            rotation?: number[];
            scale?: number[];
            skin?: number;
            translation?: number[];
        }
      • name: string
      • ctx: GltfReadContext

      Returns Object3D | undefined

    • Optional hook to resolve a texture definition into a Small World Texture (e.g. KHR_texture_basisu). Return resolved Texture or undefined / null to defer to standard texture resolution.

      Parameters

      • textureDef: {
            extensions?: {
                KHR_texture_basisu?: { source: number };
                [key: string]: unknown;
            };
            sampler?: number;
            source?: number;
        }
      • ctx: GltfReadContext
      • folderPath: string
      • buffers: ArrayBuffer[]
      • assetManager: AssetManager

      Returns Texture | Promise<Texture | null | undefined> | null | undefined