@babylonjs/loaders 9.11.0 → 9.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/FBX/fbxFileLoader.d.ts +194 -0
  2. package/FBX/fbxFileLoader.js +2440 -0
  3. package/FBX/fbxFileLoader.js.map +1 -0
  4. package/FBX/fbxFileLoader.metadata.d.ts +11 -0
  5. package/FBX/fbxFileLoader.metadata.js +11 -0
  6. package/FBX/fbxFileLoader.metadata.js.map +1 -0
  7. package/FBX/index.d.ts +3 -0
  8. package/FBX/index.js +3 -0
  9. package/FBX/index.js.map +1 -0
  10. package/FBX/interpreter/animation.d.ts +122 -0
  11. package/FBX/interpreter/animation.js +648 -0
  12. package/FBX/interpreter/animation.js.map +1 -0
  13. package/FBX/interpreter/blendShapes.d.ts +44 -0
  14. package/FBX/interpreter/blendShapes.js +192 -0
  15. package/FBX/interpreter/blendShapes.js.map +1 -0
  16. package/FBX/interpreter/connections.d.ts +95 -0
  17. package/FBX/interpreter/connections.js +233 -0
  18. package/FBX/interpreter/connections.js.map +1 -0
  19. package/FBX/interpreter/fbxInterpreter.d.ts +149 -0
  20. package/FBX/interpreter/fbxInterpreter.js +496 -0
  21. package/FBX/interpreter/fbxInterpreter.js.map +1 -0
  22. package/FBX/interpreter/geometry.d.ts +55 -0
  23. package/FBX/interpreter/geometry.js +573 -0
  24. package/FBX/interpreter/geometry.js.map +1 -0
  25. package/FBX/interpreter/materials.d.ts +50 -0
  26. package/FBX/interpreter/materials.js +144 -0
  27. package/FBX/interpreter/materials.js.map +1 -0
  28. package/FBX/interpreter/propertyTemplates.d.ts +22 -0
  29. package/FBX/interpreter/propertyTemplates.js +125 -0
  30. package/FBX/interpreter/propertyTemplates.js.map +1 -0
  31. package/FBX/interpreter/rig.d.ts +20 -0
  32. package/FBX/interpreter/rig.js +259 -0
  33. package/FBX/interpreter/rig.js.map +1 -0
  34. package/FBX/interpreter/sceneDiagnostics.d.ts +14 -0
  35. package/FBX/interpreter/sceneDiagnostics.js +55 -0
  36. package/FBX/interpreter/sceneDiagnostics.js.map +1 -0
  37. package/FBX/interpreter/skeleton.d.ts +93 -0
  38. package/FBX/interpreter/skeleton.js +515 -0
  39. package/FBX/interpreter/skeleton.js.map +1 -0
  40. package/FBX/interpreter/transform.d.ts +21 -0
  41. package/FBX/interpreter/transform.js +92 -0
  42. package/FBX/interpreter/transform.js.map +1 -0
  43. package/FBX/parsers/fbxAsciiParser.d.ts +5 -0
  44. package/FBX/parsers/fbxAsciiParser.js +330 -0
  45. package/FBX/parsers/fbxAsciiParser.js.map +1 -0
  46. package/FBX/parsers/fbxBinaryParser.d.ts +6 -0
  47. package/FBX/parsers/fbxBinaryParser.js +255 -0
  48. package/FBX/parsers/fbxBinaryParser.js.map +1 -0
  49. package/FBX/parsers/zlibInflate.d.ts +7 -0
  50. package/FBX/parsers/zlibInflate.js +350 -0
  51. package/FBX/parsers/zlibInflate.js.map +1 -0
  52. package/FBX/types/fbxTypes.d.ts +54 -0
  53. package/FBX/types/fbxTypes.js +66 -0
  54. package/FBX/types/fbxTypes.js.map +1 -0
  55. package/SPLAT/gaussianSplattingStream.d.ts +341 -0
  56. package/SPLAT/gaussianSplattingStream.js +976 -0
  57. package/SPLAT/gaussianSplattingStream.js.map +1 -0
  58. package/SPLAT/gaussianSplattingWorkBuffer.d.ts +51 -0
  59. package/SPLAT/gaussianSplattingWorkBuffer.js +159 -0
  60. package/SPLAT/gaussianSplattingWorkBuffer.js.map +1 -0
  61. package/SPLAT/gaussianSplattingWorkBufferShaders.d.ts +25 -0
  62. package/SPLAT/gaussianSplattingWorkBufferShaders.js +255 -0
  63. package/SPLAT/gaussianSplattingWorkBufferShaders.js.map +1 -0
  64. package/SPLAT/index.d.ts +1 -0
  65. package/SPLAT/index.js +1 -0
  66. package/SPLAT/index.js.map +1 -1
  67. package/SPLAT/sog.js +18 -16
  68. package/SPLAT/sog.js.map +1 -1
  69. package/SPLAT/splatFileLoader.d.ts +8 -0
  70. package/SPLAT/splatFileLoader.js +49 -0
  71. package/SPLAT/splatFileLoader.js.map +1 -1
  72. package/dynamic.js +9 -0
  73. package/dynamic.js.map +1 -1
  74. package/index.d.ts +1 -0
  75. package/index.js +1 -0
  76. package/index.js.map +1 -1
  77. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fbxFileLoader.js","sourceRoot":"","sources":["../../../../dev/loaders/src/FBX/fbxFileLoader.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\r\nimport {\r\n type ISceneLoaderPluginAsync,\r\n type ISceneLoaderPluginFactory,\r\n type ISceneLoaderAsyncResult,\r\n type ISceneLoaderProgressEvent,\r\n type SceneLoaderPluginOptions,\r\n RegisterSceneLoaderPlugin,\r\n} from \"core/Loading/sceneLoader\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type FloatArray, type Nullable } from \"core/types\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { SubMesh } from \"core/Meshes/subMesh\";\r\nimport { VertexData } from \"core/Meshes/mesh.vertexData\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { Material } from \"core/Materials/material\";\r\nimport { MultiMaterial } from \"core/Materials/multiMaterial\";\r\nimport { type ITextureCreationOptions, Texture } from \"core/Materials/Textures/texture\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Vector3, Quaternion, Matrix } from \"core/Maths/math.vector\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Skeleton } from \"core/Bones/skeleton\";\r\nimport { Bone } from \"core/Bones/bone\";\r\nimport { Animation } from \"core/Animations/animation\";\r\nimport { AnimationGroup } from \"core/Animations/animationGroup\";\r\nimport { AnimationKeyInterpolation, type IAnimationKey } from \"core/Animations/animationKey\";\r\nimport { MorphTarget } from \"core/Morph/morphTarget\";\r\nimport { MorphTargetManager } from \"core/Morph/morphTargetManager\";\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { FreeCamera } from \"core/Cameras/freeCamera\";\r\nimport { PointLight } from \"core/Lights/pointLight\";\r\nimport { DirectionalLight } from \"core/Lights/directionalLight\";\r\nimport { SpotLight } from \"core/Lights/spotLight\";\r\nimport { AssetContainer } from \"core/assetContainer\";\r\nimport { GetMimeType } from \"core/Misc/fileTools\";\r\n\r\nimport { parseBinaryFBX } from \"./parsers/fbxBinaryParser\";\r\nimport { parseAsciiFBX } from \"./parsers/fbxAsciiParser\";\r\nimport { interpretFBX, type FBXModelData, type FBXSceneData, type FBXCameraData, type FBXLightData } from \"./interpreter/fbxInterpreter\";\r\nimport { type FBXDocument } from \"./types/fbxTypes\";\r\nimport { type FBXGeometryData } from \"./interpreter/geometry\";\r\nimport { type FBXMaterialData, type FBXTextureRef } from \"./interpreter/materials\";\r\nimport { type FBXSkinData, type FBXBoneData } from \"./interpreter/skeleton\";\r\nimport { type FBXRigData, type FBXSkinBindingData } from \"./interpreter/rig\";\r\nimport { type FBXBlendShapeData, type FBXShapeData } from \"./interpreter/blendShapes\";\r\nimport { sampleFBXCurveAtTime, type FBXAnimationStackData, type FBXCurveData, type FBXCurveNodeData } from \"./interpreter/animation\";\r\nimport { computeFBXGeometricDeltaMatrix, computeFBXGeometricMatrix, computeFBXGeometricNormalMatrix, computeFBXLocalMatrix } from \"./interpreter/transform\";\r\nimport { FBXFileLoaderMetadata } from \"./fbxFileLoader.metadata\";\r\n\r\nconst FBX_ASCII_MAGIC = \"; FBX\";\r\nconst FBX_BINARY_MAGIC = \"Kaydara FBX Binary\";\r\nconst BIND_REST_SCALE_RATIO_THRESHOLD = 10;\r\n\r\n/**\r\n * Source convention for tangent-space normal maps loaded from FBX normal-map slots.\r\n */\r\nexport type FBXNormalMapCoordinateSystem = \"y-up\" | \"y-down\";\r\n\r\n/**\r\n * Defines options for the FBX loader.\r\n */\r\nexport interface FBXFileLoaderOptions {\r\n /**\r\n * Source convention for tangent-space normal maps connected through FBX normal-map slots.\r\n * FBX does not standardize this convention, so the loader defaults to the glTF/USD-style Y-up convention.\r\n * Set to \"y-down\" for assets authored with inverted green/Y normal maps.\r\n */\r\n normalMapCoordinateSystem?: FBXNormalMapCoordinateSystem;\r\n}\r\n\r\ndeclare module \"core/Loading/sceneLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface SceneLoaderPluginOptions {\r\n /**\r\n * Defines options for the FBX loader.\r\n */\r\n [FBXFileLoaderMetadata.name]: FBXFileLoaderOptions;\r\n }\r\n}\r\n\r\ninterface IFBXSceneLoaderAsyncResult extends ISceneLoaderAsyncResult {\r\n materials: Material[];\r\n textures: BaseTexture[];\r\n cameras: Camera[];\r\n}\r\n\r\n/**\r\n * FBX file loader plugin for Babylon.js.\r\n * Pure TypeScript implementation — no Autodesk FBX SDK dependency.\r\n */\r\nexport class FBXFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPluginFactory {\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public readonly name = FBXFileLoaderMetadata.name;\r\n\r\n /**\r\n * Defines the extension the plugin is able to load.\r\n */\r\n public readonly extensions = FBXFileLoaderMetadata.extensions;\r\n\r\n private readonly _options: Required<FBXFileLoaderOptions>;\r\n private readonly _bindRestBones = new WeakSet<Bone>();\r\n private readonly _sourceBonesBySkeleton = new WeakMap<Skeleton, Bone[]>();\r\n private readonly _scaleCompensationHelpersBySkeleton = new WeakMap<Skeleton, Map<number, Bone>>();\r\n\r\n /**\r\n * Creates a new FBX loader.\r\n * @param options - Options controlling FBX loading behavior\r\n */\r\n public constructor(options: FBXFileLoaderOptions = {}) {\r\n this._options = {\r\n normalMapCoordinateSystem: options.normalMapCoordinateSystem ?? \"y-up\",\r\n };\r\n }\r\n\r\n /**\r\n * Creates an FBX loader plugin instance with options from SceneLoader.\r\n * @param options - Scene loader plugin options\r\n * @returns The configured FBX loader\r\n */\r\n public createPlugin(options: SceneLoaderPluginOptions): ISceneLoaderPluginAsync {\r\n return new FBXFileLoader(options[FBXFileLoaderMetadata.name]);\r\n }\r\n\r\n /**\r\n * Imports meshes from an FBX file and adds them to the scene.\r\n * @param meshesNames - A string or array of mesh names to import, or null/undefined to import all meshes\r\n * @param scene - The scene to add imported meshes to\r\n * @param data - The FBX data to load\r\n * @param rootUrl - Root URL used to resolve external resources\r\n * @param _onProgress - Callback called while the file is loading\r\n * @param _fileName - Name of the file being loaded\r\n * @returns A promise containing the loaded meshes, particle systems, skeletons, animation groups, transform nodes, geometries, and lights\r\n */\r\n public async importMeshAsync(\r\n meshesNames: string | readonly string[] | null | undefined,\r\n scene: Scene,\r\n data: unknown,\r\n rootUrl: string,\r\n _onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n _fileName?: string\r\n ): Promise<ISceneLoaderAsyncResult> {\r\n const doc = this._parse(data);\r\n const fbxScene = interpretFBX(doc);\r\n return this._buildScene(fbxScene, scene, rootUrl, meshesNames);\r\n }\r\n\r\n /**\r\n * Loads all FBX content into the scene.\r\n * @param scene - The scene to load the FBX content into\r\n * @param data - The FBX data to load\r\n * @param rootUrl - Root URL used to resolve external resources\r\n * @param _onProgress - Callback called while the file is loading\r\n * @param _fileName - Name of the file being loaded\r\n * @returns A promise that resolves when loading is complete\r\n */\r\n public async loadAsync(scene: Scene, data: unknown, rootUrl: string, _onProgress?: (event: ISceneLoaderProgressEvent) => void, _fileName?: string): Promise<void> {\r\n const doc = this._parse(data);\r\n const fbxScene = interpretFBX(doc);\r\n this._buildScene(fbxScene, scene, rootUrl, null);\r\n }\r\n\r\n /**\r\n * Loads all FBX content into an asset container.\r\n * @param scene - The scene used to create the asset container\r\n * @param data - The FBX data to load\r\n * @param rootUrl - Root URL used to resolve external resources\r\n * @param _onProgress - Callback called while the file is loading\r\n * @param _fileName - Name of the file being loaded\r\n * @returns A promise containing the loaded asset container\r\n */\r\n public async loadAssetContainerAsync(\r\n scene: Scene,\r\n data: unknown,\r\n rootUrl: string,\r\n _onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n _fileName?: string\r\n ): Promise<AssetContainer> {\r\n const doc = this._parse(data);\r\n const fbxScene = interpretFBX(doc);\r\n\r\n const container = new AssetContainer(scene);\r\n\r\n // Build the scene into a temporary holder, then move results to container\r\n const result = this._buildScene(fbxScene, scene, rootUrl, null);\r\n\r\n for (const mesh of result.meshes) {\r\n container.meshes.push(mesh);\r\n }\r\n for (const skeleton of result.skeletons) {\r\n container.skeletons.push(skeleton);\r\n }\r\n for (const ag of result.animationGroups) {\r\n container.animationGroups.push(ag);\r\n }\r\n for (const tn of result.transformNodes) {\r\n container.transformNodes.push(tn);\r\n }\r\n for (const light of result.lights) {\r\n container.lights.push(light);\r\n }\r\n for (const camera of result.cameras) {\r\n container.cameras.push(camera);\r\n }\r\n for (const material of result.materials) {\r\n this._addMaterialToContainer(material, container);\r\n }\r\n for (const texture of result.textures) {\r\n this._addTextureToContainer(texture, container);\r\n }\r\n for (const mesh of result.meshes) {\r\n this._addMaterialToContainer(mesh.material, container);\r\n }\r\n\r\n // Remove all added objects from the scene (container owns them)\r\n this._setAssetContainer(container);\r\n container.removeAllFromScene();\r\n\r\n return container;\r\n }\r\n\r\n // ── Parsing ────────────────────────────────────────────────────────────\r\n\r\n private _parse(data: unknown): FBXDocument {\r\n if (data instanceof ArrayBuffer) {\r\n return this._parseFromArrayBuffer(data);\r\n }\r\n if (ArrayBuffer.isView(data)) {\r\n const view = data as ArrayBufferView;\r\n const buffer = view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength) as ArrayBuffer;\r\n return this._parseFromArrayBuffer(buffer);\r\n }\r\n if (typeof data === \"string\") {\r\n return parseAsciiFBX(data);\r\n }\r\n throw new Error(\"FBXFileLoader: unsupported data type\");\r\n }\r\n\r\n private _parseFromArrayBuffer(buffer: ArrayBuffer): FBXDocument {\r\n // Check magic bytes to determine binary vs ASCII\r\n const headerBytes = new Uint8Array(buffer, 0, Math.min(21, buffer.byteLength));\r\n const header = String.fromCharCode(...headerBytes);\r\n\r\n if (header.startsWith(FBX_BINARY_MAGIC)) {\r\n return parseBinaryFBX(buffer);\r\n }\r\n\r\n // Try ASCII\r\n const text = new TextDecoder(\"utf-8\").decode(buffer);\r\n if (text.trimStart().startsWith(FBX_ASCII_MAGIC)) {\r\n return parseAsciiFBX(text);\r\n }\r\n\r\n throw new Error(\"FBXFileLoader: unrecognized FBX format\");\r\n }\r\n\r\n // ── Scene Building ─────────────────────────────────────────────────────\r\n\r\n private _buildScene(fbxScene: FBXSceneData, scene: Scene, rootUrl: string, meshesNames: string | readonly string[] | null | undefined): IFBXSceneLoaderAsyncResult {\r\n const nameFilter = this._buildNameFilter(meshesNames);\r\n\r\n // Create materials\r\n const materialCache = new Map<number, StandardMaterial>();\r\n for (const matData of fbxScene.materials) {\r\n const material = this._createMaterial(matData, scene, rootUrl);\r\n materialCache.set(matData.id, material);\r\n }\r\n\r\n // Create one Babylon skeleton per resolved deformation rig.\r\n const skeletons: Skeleton[] = [];\r\n const skeletonByRigId = new Map<string, Skeleton>();\r\n const skeletonByGeometryId = new Map<number, Skeleton>();\r\n const skinByGeometryId = new Map<number, FBXSkinData>();\r\n const skinBindingByGeometryId = new Map<number, FBXSkinBindingData>();\r\n const skinById = new Map<number, FBXSkinData>();\r\n\r\n for (const skin of fbxScene.skins) {\r\n skinById.set(skin.id, skin);\r\n }\r\n\r\n for (const rig of fbxScene.rigs) {\r\n const skeleton = this._createSkeleton(rig.id, rig.bones, scene);\r\n skeletons.push(skeleton);\r\n skeletonByRigId.set(rig.id, skeleton);\r\n\r\n for (const binding of rig.skinBindings) {\r\n const skin = skinById.get(binding.skinId);\r\n if (!skin) {\r\n continue;\r\n }\r\n\r\n skeletonByGeometryId.set(binding.geometryId, skeleton);\r\n skinByGeometryId.set(binding.geometryId, skin);\r\n skinBindingByGeometryId.set(binding.geometryId, binding);\r\n }\r\n }\r\n\r\n // Collect model data for animation sampling.\r\n const modelIdToData = new Map<number, FBXModelData>();\r\n const collectModelData = (models: FBXModelData[]) => {\r\n for (const m of models) {\r\n modelIdToData.set(m.id, m);\r\n collectModelData(m.children);\r\n }\r\n };\r\n collectModelData(fbxScene.rootModels);\r\n const cullingConflictMaterialIds = FBXFileLoader._collectCullingConflictMaterialIds(fbxScene.rootModels);\r\n const cullingMaterialCloneCache = new Map<StandardMaterial, StandardMaterial>();\r\n\r\n // Build the FBX hierarchy under the same handedness conversion root that\r\n // Babylon's glTF loader uses when loading right-handed assets into a\r\n // left-handed scene. If the FBX file declares a non-Y-up scene basis,\r\n // add a child axis-conversion root so model/bind math stays in FBX space.\r\n const rootNode = new TransformNode(\"__fbx_root__\", scene);\r\n if (!scene.useRightHandedSystem) {\r\n rootNode.rotation.y = Math.PI;\r\n rootNode.scaling.z = -1;\r\n }\r\n\r\n const meshes: Mesh[] = [];\r\n const transformNodes: TransformNode[] = [rootNode];\r\n let assetRoot = rootNode;\r\n const axisConversion = FBXFileLoader._computeFBXAxisConversionMatrix(fbxScene);\r\n if (!axisConversion.equals(Matrix.Identity())) {\r\n assetRoot = new TransformNode(\"__fbx_axis_conversion__\", scene);\r\n assetRoot.parent = rootNode;\r\n FBXFileLoader._applyMatrixToTransform(assetRoot, axisConversion);\r\n transformNodes.push(assetRoot);\r\n }\r\n const modelIdToNode = new Map<number, TransformNode>();\r\n const fbxWorldIdentity = Matrix.Identity();\r\n\r\n for (const model of fbxScene.rootModels) {\r\n this._buildModel(\r\n model,\r\n scene,\r\n assetRoot,\r\n assetRoot,\r\n fbxWorldIdentity,\r\n materialCache,\r\n nameFilter,\r\n meshes,\r\n transformNodes,\r\n skeletonByGeometryId,\r\n skinByGeometryId,\r\n skinBindingByGeometryId,\r\n modelIdToNode,\r\n cullingConflictMaterialIds,\r\n cullingMaterialCloneCache\r\n );\r\n }\r\n\r\n // Link non-skinned child meshes/nodes to their parent bones so they\r\n // follow skeletal animation. Preserve their current world matrix when\r\n // switching from the FBX model hierarchy to Babylon's bone parent.\r\n for (const rig of fbxScene.rigs) {\r\n const skeleton = skeletonByRigId.get(rig.id);\r\n if (!skeleton) {\r\n continue;\r\n }\r\n\r\n const boneModelIds = new Set(rig.bones.map((b) => b.modelId));\r\n const skinnedMesh = meshes.find((m) => m.skeleton === skeleton) ?? null;\r\n const boneReferenceNode = skinnedMesh ?? rootNode;\r\n\r\n for (const boneData of rig.bones) {\r\n if (!boneData.isCluster) {\r\n continue;\r\n }\r\n\r\n const boneNode = modelIdToNode.get(boneData.modelId);\r\n const bone = this._getSourceBone(skeleton, boneData.index);\r\n if (!boneNode || !bone) {\r\n continue;\r\n }\r\n\r\n // Find direct children of this bone's TransformNode that aren't bones themselves\r\n for (const child of [...boneNode.getChildren()]) {\r\n const childTransform = child as TransformNode;\r\n // Check if this child is itself a bone — if so, skip it\r\n let childIsBone = false;\r\n for (const [modelId, node] of Array.from(modelIdToNode)) {\r\n if (node === childTransform && boneModelIds.has(modelId)) {\r\n childIsBone = true;\r\n break;\r\n }\r\n }\r\n if (!childIsBone) {\r\n const childWorld = childTransform.computeWorldMatrix(true).clone();\r\n const boneReferenceWorld = FBXFileLoader._getBoneReferenceWorldMatrix(skeleton, bone, boneReferenceNode, skinnedMesh);\r\n const boneReferenceWorldInv = new Matrix();\r\n boneReferenceWorld.invertToRef(boneReferenceWorldInv);\r\n const childLocalToBone = childWorld.multiply(boneReferenceWorldInv);\r\n\r\n childTransform.parent = null;\r\n childTransform.attachToBone(bone, boneReferenceNode);\r\n FBXFileLoader._applyMatrixToTransform(childTransform, childLocalToBone);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Apply blend shapes (morph targets) to meshes\r\n if (fbxScene.blendShapes.length > 0) {\r\n this._applyBlendShapes(fbxScene.blendShapes, meshes, scene);\r\n }\r\n\r\n // Create animation groups\r\n const animationGroups: AnimationGroup[] = [];\r\n for (const animStack of fbxScene.animations) {\r\n const group = this._createAnimationGroup(animStack, fbxScene.rigs, skeletonByRigId, scene, modelIdToNode, modelIdToData, meshes);\r\n if (group) {\r\n animationGroups.push(group);\r\n }\r\n }\r\n\r\n // Create cameras\r\n const cameras: FreeCamera[] = [];\r\n for (const camData of fbxScene.cameras) {\r\n const cam = this._createCamera(camData, modelIdToNode, scene);\r\n if (cam) {\r\n cameras.push(cam);\r\n }\r\n }\r\n\r\n // Create lights\r\n const sceneLights: (PointLight | DirectionalLight | SpotLight)[] = [];\r\n for (const lightData of fbxScene.lights) {\r\n const light = this._createLight(lightData, modelIdToNode, scene);\r\n if (light) {\r\n sceneLights.push(light);\r\n }\r\n }\r\n\r\n return {\r\n meshes,\r\n particleSystems: [],\r\n skeletons,\r\n animationGroups,\r\n transformNodes,\r\n geometries: [],\r\n lights: sceneLights,\r\n spriteManagers: [],\r\n materials: Array.from(materialCache.values()),\r\n textures: Array.from(new Set(Array.from(materialCache.values()).flatMap((material) => material.getActiveTextures()))),\r\n cameras,\r\n };\r\n }\r\n\r\n private _addMaterialToContainer(material: Nullable<Material>, container: AssetContainer): void {\r\n if (!material) {\r\n return;\r\n }\r\n\r\n if (material instanceof MultiMaterial) {\r\n if (!container.multiMaterials.includes(material)) {\r\n container.multiMaterials.push(material);\r\n }\r\n for (const subMaterial of material.subMaterials) {\r\n this._addMaterialToContainer(subMaterial, container);\r\n }\r\n } else if (!container.materials.includes(material)) {\r\n container.materials.push(material);\r\n }\r\n\r\n for (const texture of material.getActiveTextures()) {\r\n this._addTextureToContainer(texture, container);\r\n }\r\n }\r\n\r\n private _addTextureToContainer(texture: BaseTexture, container: AssetContainer): void {\r\n if (!container.textures.includes(texture)) {\r\n container.textures.push(texture);\r\n }\r\n }\r\n\r\n private _setAssetContainer(container: AssetContainer): void {\r\n for (const asset of container.meshes) {\r\n asset._parentContainer = container;\r\n }\r\n for (const asset of container.transformNodes) {\r\n asset._parentContainer = container;\r\n }\r\n for (const asset of container.skeletons) {\r\n asset._parentContainer = container;\r\n }\r\n for (const asset of container.animationGroups) {\r\n asset._parentContainer = container;\r\n }\r\n for (const asset of container.lights) {\r\n asset._parentContainer = container;\r\n }\r\n for (const asset of container.cameras) {\r\n asset._parentContainer = container;\r\n }\r\n for (const asset of container.materials) {\r\n asset._parentContainer = container;\r\n }\r\n for (const asset of container.multiMaterials) {\r\n asset._parentContainer = container;\r\n }\r\n for (const asset of container.textures) {\r\n asset._parentContainer = container;\r\n }\r\n }\r\n\r\n private static _computeFBXAxisConversionMatrix(fbxScene: FBXSceneData): Matrix {\r\n const basisRows: [number, number, number][] = [\r\n [0, 0, 0],\r\n [0, 0, 0],\r\n [0, 0, 0],\r\n ];\r\n\r\n const assignAxis = (sourceAxis: number, sourceSign: number, targetAxis: number): void => {\r\n if (sourceAxis < 0 || sourceAxis > 2) {\r\n return;\r\n }\r\n const row: [number, number, number] = [0, 0, 0];\r\n row[targetAxis] = sourceSign >= 0 ? 1 : -1;\r\n basisRows[sourceAxis] = row;\r\n };\r\n\r\n assignAxis(fbxScene.coordAxis, fbxScene.coordAxisSign, 0);\r\n assignAxis(fbxScene.upAxis, fbxScene.upAxisSign, 1);\r\n assignAxis(fbxScene.frontAxis, fbxScene.frontAxisSign, 2);\r\n\r\n if (basisRows.some((row) => row.every((value) => value === 0))) {\r\n return Matrix.Identity();\r\n }\r\n\r\n return Matrix.FromValues(\r\n basisRows[0][0],\r\n basisRows[0][1],\r\n basisRows[0][2],\r\n 0,\r\n basisRows[1][0],\r\n basisRows[1][1],\r\n basisRows[1][2],\r\n 0,\r\n basisRows[2][0],\r\n basisRows[2][1],\r\n basisRows[2][2],\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n 1\r\n );\r\n }\r\n\r\n private _buildModel(\r\n model: FBXModelData,\r\n scene: Scene,\r\n parent: Nullable<TransformNode>,\r\n assetRoot: TransformNode,\r\n parentFBXWorldMatrix: Matrix,\r\n materialCache: Map<number, StandardMaterial>,\r\n nameFilter: ((name: string) => boolean) | null,\r\n meshes: Mesh[],\r\n transformNodes: TransformNode[],\r\n skeletonByGeometryId: Map<number, Skeleton>,\r\n skinByGeometryId: Map<number, FBXSkinData>,\r\n skinBindingByGeometryId: Map<number, FBXSkinBindingData>,\r\n modelIdToNode: Map<number, TransformNode>,\r\n cullingConflictMaterialIds: Set<number>,\r\n cullingMaterialCloneCache: Map<StandardMaterial, StandardMaterial>\r\n ): void {\r\n const localMatrix = FBXFileLoader._computeFBXModelLocalMatrix(model);\r\n const fbxWorldMatrix = localMatrix.multiply(parentFBXWorldMatrix);\r\n\r\n if (model.geometry && model.subType === \"Mesh\" && (!nameFilter || nameFilter(model.name))) {\r\n // Create mesh\r\n const skeleton = skeletonByGeometryId.get(model.geometry.id);\r\n const skin = skinByGeometryId.get(model.geometry.id);\r\n const skinBinding = skinBindingByGeometryId.get(model.geometry.id);\r\n\r\n if (skeleton && skin) {\r\n skeleton.needInitialSkinMatrix = true;\r\n }\r\n\r\n const mesh = this._createMesh(model, model.geometry, scene, skeleton, skin, skinBinding);\r\n\r\n // For skinned meshes: keep bind/pose math in FBX space, but parent\r\n // the rendered mesh under the same conversion root as non-skinned\r\n // meshes. The pose matrix cancels the real FBX mesh transform only;\r\n // the root handedness conversion remains applied once at render time.\r\n if (skeleton && skin) {\r\n const meshBindMatrix = skin.meshBindPoseMatrix ? Matrix.FromArray(skin.meshBindPoseMatrix) : fbxWorldMatrix;\r\n mesh.parent = assetRoot;\r\n FBXFileLoader._applyMatrixToTransform(mesh, meshBindMatrix);\r\n mesh.computeWorldMatrix(true);\r\n mesh.updatePoseMatrix(Matrix.Invert(meshBindMatrix));\r\n mesh.alwaysSelectAsActiveMesh = true;\r\n } else {\r\n if (parent) {\r\n mesh.parent = parent;\r\n }\r\n FBXFileLoader._applyFBXTransform(mesh, model);\r\n }\r\n\r\n // Apply material(s)\r\n if (model.materials.length > 1 && model.geometry?.materialIndices) {\r\n // Multi-material: create sub-meshes for each material\r\n this._applyMultiMaterial(mesh, model, materialCache, scene, cullingConflictMaterialIds, cullingMaterialCloneCache);\r\n } else if (model.materials.length > 0) {\r\n const mat = materialCache.get(model.materials[0].id);\r\n if (mat) {\r\n mesh.material = FBXFileLoader._getModelMaterial(mat, model, cullingMaterialCloneCache, cullingConflictMaterialIds.has(model.materials[0].id));\r\n }\r\n }\r\n\r\n if (model.geometry?.colors) {\r\n this._useUnmodulatedVertexColorMaterials(mesh, scene);\r\n }\r\n this._applyMaterialUVSetCoordinates(mesh.material, model.geometry);\r\n\r\n meshes.push(mesh);\r\n modelIdToNode.set(model.id, mesh);\r\n\r\n FBXFileLoader._applyModelMetadata(mesh, model);\r\n\r\n // Recurse children\r\n for (const child of model.children) {\r\n this._buildModel(\r\n child,\r\n scene,\r\n mesh,\r\n assetRoot,\r\n fbxWorldMatrix,\r\n materialCache,\r\n nameFilter,\r\n meshes,\r\n transformNodes,\r\n skeletonByGeometryId,\r\n skinByGeometryId,\r\n skinBindingByGeometryId,\r\n modelIdToNode,\r\n cullingConflictMaterialIds,\r\n cullingMaterialCloneCache\r\n );\r\n }\r\n } else {\r\n if (model.geometry && model.subType === \"Mesh\" && nameFilter && !FBXFileLoader._modelSubtreeMatchesNameFilter(model, nameFilter)) {\r\n return;\r\n }\r\n\r\n // Transform node (Null type or no geometry)\r\n const transformNode = new TransformNode(model.name, scene);\r\n if (parent) {\r\n transformNode.parent = parent;\r\n }\r\n\r\n // Apply full FBX transform chain\r\n FBXFileLoader._applyFBXTransform(transformNode, model);\r\n\r\n transformNodes.push(transformNode);\r\n modelIdToNode.set(model.id, transformNode);\r\n\r\n FBXFileLoader._applyModelMetadata(transformNode, model);\r\n\r\n // Recurse children\r\n for (const child of model.children) {\r\n this._buildModel(\r\n child,\r\n scene,\r\n transformNode,\r\n assetRoot,\r\n fbxWorldMatrix,\r\n materialCache,\r\n nameFilter,\r\n meshes,\r\n transformNodes,\r\n skeletonByGeometryId,\r\n skinByGeometryId,\r\n skinBindingByGeometryId,\r\n modelIdToNode,\r\n cullingConflictMaterialIds,\r\n cullingMaterialCloneCache\r\n );\r\n }\r\n }\r\n }\r\n\r\n private static _modelSubtreeMatchesNameFilter(model: FBXModelData, nameFilter: (name: string) => boolean): boolean {\r\n for (const child of model.children) {\r\n if (child.geometry && child.subType === \"Mesh\" && nameFilter(child.name)) {\r\n return true;\r\n }\r\n if (FBXFileLoader._modelSubtreeMatchesNameFilter(child, nameFilter)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private static _applyModelMetadata(node: TransformNode | Mesh, model: FBXModelData): void {\r\n if (!model.customProperties && model.diagnostics.length === 0) {\r\n return;\r\n }\r\n\r\n node.metadata = {\r\n ...((node.metadata as object) ?? {}),\r\n ...(model.customProperties ? { fbxCustomProperties: model.customProperties } : {}),\r\n ...(model.diagnostics.length > 0 ? { fbxDiagnostics: model.diagnostics } : {}),\r\n };\r\n }\r\n\r\n private _createMesh(model: FBXModelData, geomData: FBXGeometryData, scene: Scene, skeleton?: Skeleton, skin?: FBXSkinData, skinBinding?: FBXSkinBindingData): Mesh {\r\n const mesh = new Mesh(model.name, scene);\r\n mesh.sideOrientation = scene.useRightHandedSystem ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;\r\n const vertexData = new VertexData();\r\n\r\n // Convert Float64Array to Float32Array for Babylon\r\n const positions = float64To32(geomData.positions);\r\n\r\n const gt = model.geometricTranslation;\r\n const gr = model.geometricRotation;\r\n const gs = model.geometricScaling;\r\n\r\n // Geometric transforms affect only this mesh's geometry, not children.\r\n // Blender composes them as T * R * S; Babylon's row-vector equivalent is S * R * T.\r\n const geometricPositionMatrix = FBXFileLoader._computeFBXGeometricMatrix(gt, gr, gs);\r\n const geometricDeltaMatrix = FBXFileLoader._computeFBXGeometricDeltaMatrix(gr, gs);\r\n const geometricNormalMatrix = FBXFileLoader._computeFBXGeometricNormalMatrix(gr, gs);\r\n const hasGeometricPositionTransform = !geometricPositionMatrix.equals(Matrix.Identity());\r\n const hasGeometricDeltaTransform = !geometricDeltaMatrix.equals(Matrix.Identity());\r\n const hasGeometricNormalTransform = !geometricNormalMatrix.equals(Matrix.Identity());\r\n\r\n if (hasGeometricPositionTransform) {\r\n for (let i = 0; i < positions.length; i += 3) {\r\n const v = Vector3.TransformCoordinates(new Vector3(positions[i], positions[i + 1], positions[i + 2]), geometricPositionMatrix);\r\n positions[i] = v.x;\r\n positions[i + 1] = v.y;\r\n positions[i + 2] = v.z;\r\n }\r\n }\r\n\r\n // For skinned meshes: do NOT bake mesh local transform into vertices.\r\n // Vertices remain in their original mesh-local space, keeping the mesh data\r\n // clean for retargeting. The mesh node carries its FBX transform as an\r\n // initial pose, while TransformLink bind matrices handle skinning.\r\n\r\n vertexData.positions = positions;\r\n vertexData.indices = Array.from(geomData.indices);\r\n\r\n let normals: Float32Array | undefined;\r\n if (geomData.normals) {\r\n normals = float64To32(geomData.normals);\r\n if (hasGeometricNormalTransform) {\r\n for (let i = 0; i < normals.length; i += 3) {\r\n const n = Vector3.TransformNormal(new Vector3(normals[i], normals[i + 1], normals[i + 2]), geometricNormalMatrix);\r\n if (n.lengthSquared() > 0) {\r\n n.normalize();\r\n }\r\n normals[i] = n.x;\r\n normals[i + 1] = n.y;\r\n normals[i + 2] = n.z;\r\n }\r\n }\r\n vertexData.normals = normals;\r\n }\r\n\r\n if (geomData.uvs) {\r\n vertexData.uvs = float64To32(geomData.uvs);\r\n }\r\n if (geomData.uvSets.length > 1) {\r\n vertexData.uvs2 = float64To32(geomData.uvSets[1].data);\r\n }\r\n if (geomData.uvSets.length > 2) {\r\n vertexData.uvs3 = float64To32(geomData.uvSets[2].data);\r\n }\r\n if (geomData.uvSets.length > 3) {\r\n vertexData.uvs4 = float64To32(geomData.uvSets[3].data);\r\n }\r\n if (geomData.uvSets.length > 4) {\r\n vertexData.uvs5 = float64To32(geomData.uvSets[4].data);\r\n }\r\n if (geomData.uvSets.length > 5) {\r\n vertexData.uvs6 = float64To32(geomData.uvSets[5].data);\r\n }\r\n\r\n if (geomData.tangents) {\r\n const tangents = float64To32(geomData.tangents);\r\n if (hasGeometricNormalTransform) {\r\n for (let i = 0; i < tangents.length; i += 4) {\r\n const t = Vector3.TransformNormal(new Vector3(tangents[i], tangents[i + 1], tangents[i + 2]), geometricNormalMatrix);\r\n if (t.lengthSquared() > 0) {\r\n t.normalize();\r\n }\r\n tangents[i] = t.x;\r\n tangents[i + 1] = t.y;\r\n tangents[i + 2] = t.z;\r\n }\r\n }\r\n applyTangentHandednessScale(tangents, this._getNormalMapTangentHandednessScale());\r\n vertexData.tangents = tangents;\r\n } else if (normals && vertexData.uvs) {\r\n vertexData.tangents = generateTangents(\r\n positions,\r\n normals,\r\n vertexData.uvs,\r\n geomData.indices,\r\n this._getNormalMapTangentHandednessScale(),\r\n geomData.controlPointIndices,\r\n geomData.materialIndices\r\n );\r\n }\r\n\r\n if (geomData.colors) {\r\n // Force alpha to 1.0 — FBX vertex color alpha is often unreliable\r\n // (e.g. zeroed out by exporters) and would cause transparency sorting issues.\r\n const colors = new Float32Array(geomData.colors.length);\r\n for (let i = 0; i < colors.length; i += 4) {\r\n colors[i] = geomData.colors[i];\r\n colors[i + 1] = geomData.colors[i + 1];\r\n colors[i + 2] = geomData.colors[i + 2];\r\n colors[i + 3] = 1.0;\r\n }\r\n vertexData.colors = colors;\r\n mesh.hasVertexAlpha = false;\r\n }\r\n\r\n // Apply bone weights if we have a skin\r\n if (skeleton && skin) {\r\n const { matricesIndices, matricesWeights, matricesIndicesExtra, matricesWeightsExtra, numBoneInfluencers } = this._buildSkinningData(geomData, skin, skinBinding);\r\n vertexData.matricesIndices = matricesIndices;\r\n vertexData.matricesWeights = matricesWeights;\r\n if (matricesIndicesExtra && matricesWeightsExtra) {\r\n vertexData.matricesIndicesExtra = matricesIndicesExtra;\r\n vertexData.matricesWeightsExtra = matricesWeightsExtra;\r\n }\r\n mesh.numBoneInfluencers = numBoneInfluencers;\r\n }\r\n\r\n vertexData.applyToMesh(mesh);\r\n\r\n // Store geometry metadata for blend shape matching\r\n mesh.metadata = {\r\n ...((mesh.metadata as object) ?? {}),\r\n fbxGeometryId: geomData.id,\r\n fbxControlPointIndices: geomData.controlPointIndices,\r\n fbxGeometryDeltaMatrix: hasGeometricDeltaTransform ? geometricDeltaMatrix : null,\r\n fbxGeometryNormalMatrix: hasGeometricNormalTransform ? geometricNormalMatrix : null,\r\n // Back-compat for existing morph delta handling metadata.\r\n fbxPreRotMatrix: hasGeometricDeltaTransform ? geometricDeltaMatrix : null,\r\n };\r\n\r\n if (skeleton) {\r\n mesh.skeleton = skeleton;\r\n }\r\n\r\n return mesh;\r\n }\r\n\r\n /**\r\n * Apply multi-material to a mesh by creating sub-meshes grouped by material index.\r\n * Reorders the index buffer so that triangles sharing the same material are contiguous.\r\n */\r\n private _applyMultiMaterial(\r\n mesh: Mesh,\r\n model: FBXModelData,\r\n materialCache: Map<number, StandardMaterial>,\r\n scene: Scene,\r\n cullingConflictMaterialIds: Set<number>,\r\n cullingMaterialCloneCache: Map<StandardMaterial, StandardMaterial>\r\n ): void {\r\n const matIndices = model.geometry!.materialIndices!;\r\n const indices = mesh.getIndices();\r\n if (!indices) {\r\n return;\r\n }\r\n\r\n const triCount = indices.length / 3;\r\n\r\n // Group triangles by material index\r\n const groups = new Map<number, number[]>(); // matIdx -> triangle indices\r\n for (let ti = 0; ti < triCount; ti++) {\r\n const matIdx = ti < matIndices.length ? matIndices[ti] : 0;\r\n let group = groups.get(matIdx);\r\n if (!group) {\r\n group = [];\r\n groups.set(matIdx, group);\r\n }\r\n group.push(ti);\r\n }\r\n\r\n // Sort group keys to ensure consistent ordering\r\n const sortedMatIndices = Array.from(groups.keys()).sort((a, b) => a - b);\r\n\r\n // Reorder index buffer so triangles are grouped by material\r\n const newIndices: number[] = [];\r\n const subMeshRanges: { start: number; count: number; matIdx: number }[] = [];\r\n\r\n for (const matIdx of sortedMatIndices) {\r\n const tris = groups.get(matIdx)!;\r\n const start = newIndices.length;\r\n for (const ti of tris) {\r\n newIndices.push(indices[ti * 3], indices[ti * 3 + 1], indices[ti * 3 + 2]);\r\n }\r\n subMeshRanges.push({ start, count: tris.length * 3, matIdx });\r\n }\r\n\r\n // Update the mesh's index buffer\r\n mesh.setIndices(newIndices);\r\n\r\n // Create MultiMaterial\r\n const multiMat = new MultiMaterial(model.name + \"_multi\", scene);\r\n for (const range of subMeshRanges) {\r\n const fbxMat = model.materials[range.matIdx];\r\n if (fbxMat) {\r\n const mat = materialCache.get(fbxMat.id);\r\n if (mat) {\r\n multiMat.subMaterials.push(FBXFileLoader._getModelMaterial(mat, model, cullingMaterialCloneCache, cullingConflictMaterialIds.has(fbxMat.id)));\r\n } else {\r\n multiMat.subMaterials.push(null);\r\n }\r\n } else {\r\n multiMat.subMaterials.push(null);\r\n }\r\n }\r\n\r\n mesh.material = multiMat;\r\n\r\n // Clear existing sub-meshes and create new ones\r\n mesh.subMeshes = [];\r\n const vertexCount = mesh.getTotalVertices();\r\n for (let i = 0; i < subMeshRanges.length; i++) {\r\n const range = subMeshRanges[i];\r\n new SubMesh(i, 0, vertexCount, range.start, range.count, mesh);\r\n }\r\n }\r\n\r\n private static _collectCullingConflictMaterialIds(models: FBXModelData[]): Set<number> {\r\n // Deliberately scan the full scene, not just name-filtered models. This\r\n // can over-clone for filtered imports, but avoids shared culling state.\r\n const usage = new Map<number, { cullingOff: boolean; cullingOn: boolean }>();\r\n const collect = (model: FBXModelData): void => {\r\n for (const material of model.materials) {\r\n const state = usage.get(material.id) ?? { cullingOff: false, cullingOn: false };\r\n if (model.cullingOff) {\r\n state.cullingOff = true;\r\n } else {\r\n state.cullingOn = true;\r\n }\r\n usage.set(material.id, state);\r\n }\r\n for (const child of model.children) {\r\n collect(child);\r\n }\r\n };\r\n for (const model of models) {\r\n collect(model);\r\n }\r\n\r\n const conflicts = new Set<number>();\r\n for (const [materialId, state] of Array.from(usage)) {\r\n if (state.cullingOff && state.cullingOn) {\r\n conflicts.add(materialId);\r\n }\r\n }\r\n return conflicts;\r\n }\r\n\r\n private static _getModelMaterial(\r\n material: StandardMaterial,\r\n model: FBXModelData,\r\n cullingCloneCache?: Map<StandardMaterial, StandardMaterial>,\r\n cloneCullingOffMaterial = true\r\n ): StandardMaterial {\r\n if (!model.cullingOff || !material.backFaceCulling) {\r\n return material;\r\n }\r\n if (!cloneCullingOffMaterial) {\r\n material.backFaceCulling = false;\r\n return material;\r\n }\r\n\r\n const cached = cullingCloneCache?.get(material);\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n const clone = material.clone(`${material.name}_CullingOff`);\r\n clone.backFaceCulling = false;\r\n cullingCloneCache?.set(material, clone);\r\n return clone;\r\n }\r\n\r\n private _applyMaterialUVSetCoordinates(material: unknown, geometry: FBXGeometryData): void {\r\n if (!material) {\r\n return;\r\n }\r\n if (material instanceof MultiMaterial) {\r\n for (const subMaterial of material.subMaterials) {\r\n if (subMaterial instanceof StandardMaterial) {\r\n this._applyStandardMaterialUVSetCoordinates(subMaterial, geometry);\r\n }\r\n }\r\n return;\r\n }\r\n if (material instanceof StandardMaterial) {\r\n this._applyStandardMaterialUVSetCoordinates(material, geometry);\r\n }\r\n }\r\n\r\n private _applyStandardMaterialUVSetCoordinates(material: StandardMaterial, geometry: FBXGeometryData): void {\r\n for (const texture of [\r\n material.diffuseTexture,\r\n material.bumpTexture,\r\n material.emissiveTexture,\r\n material.ambientTexture,\r\n material.specularTexture,\r\n material.opacityTexture,\r\n material.reflectionTexture,\r\n ]) {\r\n if (!texture) {\r\n continue;\r\n }\r\n\r\n const uvSetName = (texture.metadata as { fbxUVSetName?: string } | null | undefined)?.fbxUVSetName;\r\n if (!uvSetName) {\r\n continue;\r\n }\r\n\r\n const uvSetIndex = geometry.uvSets.findIndex((uvSet) => uvSet.name === uvSetName);\r\n if (uvSetIndex >= 0) {\r\n texture.coordinatesIndex = uvSetIndex;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Babylon multiplies vertex colors by material diffuse color. Use per-mesh\r\n * material clones so vertex-colored geometry can render unmodulated without\r\n * changing shared materials used by non-vertex-colored meshes.\r\n */\r\n private _useUnmodulatedVertexColorMaterials(mesh: Mesh, scene: Scene): void {\r\n const assignedMat = mesh.material;\r\n if (!assignedMat) {\r\n return;\r\n }\r\n\r\n if (assignedMat instanceof StandardMaterial) {\r\n if (!assignedMat.diffuseTexture) {\r\n const clone = assignedMat.clone(`${assignedMat.name}_VertexColor`);\r\n clone.diffuseColor = new Color3(1, 1, 1);\r\n mesh.material = clone;\r\n }\r\n return;\r\n }\r\n\r\n if (assignedMat instanceof MultiMaterial) {\r\n const multiMat = new MultiMaterial(`${assignedMat.name}_VertexColor`, scene);\r\n multiMat.subMaterials = assignedMat.subMaterials.map((sub) => {\r\n if (sub instanceof StandardMaterial && !sub.diffuseTexture) {\r\n const clone = sub.clone(`${sub.name}_VertexColor`);\r\n clone.diffuseColor = new Color3(1, 1, 1);\r\n return clone;\r\n }\r\n return sub;\r\n });\r\n mesh.material = multiMat;\r\n }\r\n }\r\n\r\n /**\r\n * Build per-polygon-vertex bone indices and weights from the control-point-based skin data.\r\n * The geometry expands control points to per-polygon-vertex, so we need to look up\r\n * each polygon-vertex's control point index.\r\n */\r\n private _buildSkinningData(\r\n geomData: FBXGeometryData,\r\n skin: FBXSkinData,\r\n skinBinding?: FBXSkinBindingData\r\n ): {\r\n matricesIndices: Float32Array;\r\n matricesWeights: Float32Array;\r\n matricesIndicesExtra: Float32Array | null;\r\n matricesWeightsExtra: Float32Array | null;\r\n numBoneInfluencers: number;\r\n } {\r\n // The positions array is per-polygon-vertex (already expanded).\r\n // We need to figure out the control point index for each polygon vertex.\r\n // The geometry stores positions per polygon-vertex, so geomData.positions.length/3\r\n // = number of polygon vertices. We stored control point indices during expansion,\r\n // but they aren't exported. Instead, we can use the fact that skin data is indexed\r\n // by control point, and the geometry's _controlPointIndices stores this mapping.\r\n //\r\n // Since we don't have direct access to the control point mapping from FBXGeometryData,\r\n // we'll use the vertex positions to build the skinning buffer. But actually,\r\n // we should extend geometry to export control point indices per polygon-vertex.\r\n //\r\n // For now, use the approach of matching positions to control points.\r\n // Actually, let's look at this differently - the indices/weights in the skin\r\n // are per control point. The geometry already expanded to per polygon-vertex\r\n // with positions copied from control points. We need to know which control point\r\n // each polygon-vertex came from.\r\n //\r\n // We'll use geomData.controlPointIndices if available.\r\n const vertexCount = geomData.positions.length / 3;\r\n const matricesIndices = new Float32Array(vertexCount * 4);\r\n const matricesWeights = new Float32Array(vertexCount * 4);\r\n let matricesIndicesExtra: Float32Array | null = null;\r\n let matricesWeightsExtra: Float32Array | null = null;\r\n let numBoneInfluencers = 0;\r\n\r\n if (geomData.controlPointIndices) {\r\n for (let i = 0; i < vertexCount; i++) {\r\n const cpIdx = geomData.controlPointIndices[i];\r\n const boneIdx = skin.boneIndices[cpIdx] ?? [];\r\n numBoneInfluencers = Math.max(numBoneInfluencers, Math.min(boneIdx.length, 8));\r\n }\r\n\r\n if (numBoneInfluencers > 4) {\r\n matricesIndicesExtra = new Float32Array(vertexCount * 4);\r\n matricesWeightsExtra = new Float32Array(vertexCount * 4);\r\n }\r\n\r\n for (let i = 0; i < vertexCount; i++) {\r\n const cpIdx = geomData.controlPointIndices[i];\r\n const boneIdx = skin.boneIndices[cpIdx] ?? [];\r\n const boneWts = skin.boneWeights[cpIdx] ?? [];\r\n\r\n for (let j = 0; j < 8; j++) {\r\n const indicesBuffer = j < 4 ? matricesIndices : matricesIndicesExtra;\r\n const weightsBuffer = j < 4 ? matricesWeights : matricesWeightsExtra;\r\n if (!indicesBuffer || !weightsBuffer) {\r\n continue;\r\n }\r\n\r\n const bufferIndex = i * 4 + (j % 4);\r\n if (j < boneIdx.length) {\r\n const skinBoneIndex = boneIdx[j];\r\n const rigBoneIndex = skinBinding ? skinBinding.skinBoneIndexToRigBoneIndex[skinBoneIndex] : skinBoneIndex;\r\n if (rigBoneIndex === undefined || rigBoneIndex < 0) {\r\n throw new Error(`FBXFileLoader: missing rig bone mapping for skin bone index ${skinBoneIndex}`);\r\n }\r\n indicesBuffer[bufferIndex] = rigBoneIndex;\r\n } else {\r\n indicesBuffer[bufferIndex] = 0;\r\n }\r\n weightsBuffer[bufferIndex] = j < boneWts.length ? boneWts[j] : 0;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n matricesIndices,\r\n matricesWeights,\r\n matricesIndicesExtra,\r\n matricesWeightsExtra,\r\n numBoneInfluencers: Math.max(numBoneInfluencers, 1),\r\n };\r\n }\r\n\r\n private _createMaterial(matData: FBXMaterialData, scene: Scene, rootUrl: string): StandardMaterial {\r\n const material = new StandardMaterial(matData.name, scene);\r\n\r\n const props = matData.properties;\r\n const hasTexture = (...slots: string[]): boolean => matData.textures.some((texture) => slots.includes(texture.propertyName));\r\n\r\n if (matData.type === \"Lambert\") {\r\n material.specularColor = Color3.Black();\r\n }\r\n\r\n if (props.diffuseColor) {\r\n const diffuseFactor = hasTexture(\"DiffuseColor\", \"Diffuse\") ? 1 : (props.diffuseFactor ?? 1);\r\n material.diffuseColor = new Color3(props.diffuseColor[0] * diffuseFactor, props.diffuseColor[1] * diffuseFactor, props.diffuseColor[2] * diffuseFactor);\r\n }\r\n\r\n if (props.ambientColor) {\r\n const ambientFactor = hasTexture(\"AmbientColor\", \"Ambient\") ? 1 : (props.ambientFactor ?? 1);\r\n material.ambientColor = new Color3(props.ambientColor[0] * ambientFactor, props.ambientColor[1] * ambientFactor, props.ambientColor[2] * ambientFactor);\r\n }\r\n\r\n if (matData.type === \"Phong\" && props.specularColor) {\r\n const specularFactor = hasTexture(\"SpecularColor\", \"Specular\", \"Shininess\", \"ShininessExponent\") ? 1 : (props.specularFactor ?? 1);\r\n material.specularColor = new Color3(props.specularColor[0] * specularFactor, props.specularColor[1] * specularFactor, props.specularColor[2] * specularFactor);\r\n }\r\n\r\n if (props.emissiveColor) {\r\n const emissiveFactor = hasTexture(\"EmissiveColor\", \"Emissive\") ? 1 : (props.emissiveFactor ?? 1);\r\n material.emissiveColor = new Color3(props.emissiveColor[0] * emissiveFactor, props.emissiveColor[1] * emissiveFactor, props.emissiveColor[2] * emissiveFactor);\r\n }\r\n\r\n if (props.opacity !== undefined) {\r\n material.alpha = props.opacity;\r\n } else if (props.transparencyFactor !== undefined) {\r\n material.alpha = 1 - props.transparencyFactor;\r\n }\r\n\r\n if (material.alpha < 1) {\r\n material.transparencyMode = Material.MATERIAL_ALPHABLEND;\r\n }\r\n\r\n if (props.shininess !== undefined) {\r\n material.specularPower = props.shininess;\r\n }\r\n\r\n // Apply textures\r\n for (const tex of matData.textures) {\r\n if (!FBXFileLoader._isSupportedMaterialTextureSlot(tex.propertyName)) {\r\n continue;\r\n }\r\n\r\n const texture = FBXFileLoader._createTexture(tex, scene, rootUrl, FBXFileLoader._isNormalMapTextureSlot(tex.propertyName));\r\n if (!texture) {\r\n continue;\r\n }\r\n\r\n switch (tex.propertyName) {\r\n case \"DiffuseColor\":\r\n material.diffuseTexture = texture;\r\n // In FBX, a connected diffuse texture provides the color.\r\n // Set diffuseColor to white so the texture isn't darkened by\r\n // the material's base color (many FBX exports set it near-black).\r\n material.diffuseColor = new Color3(1, 1, 1);\r\n break;\r\n case \"NormalMap\":\r\n case \"NormalMapTexture\":\r\n case \"normalCamera\":\r\n material.bumpTexture = texture;\r\n this._configureNormalTexture(texture, material);\r\n break;\r\n case \"Bump\":\r\n case \"BumpFactor\":\r\n material.bumpTexture = texture;\r\n this._configureNormalTexture(texture, material);\r\n break;\r\n case \"EmissiveColor\":\r\n material.emissiveTexture = texture;\r\n break;\r\n case \"AmbientColor\":\r\n material.ambientTexture = texture;\r\n break;\r\n case \"SpecularColor\":\r\n material.specularTexture = texture;\r\n break;\r\n case \"TransparencyFactor\":\r\n case \"TransparentColor\":\r\n material.opacityTexture = texture;\r\n material.transparencyMode = Material.MATERIAL_ALPHATESTANDBLEND;\r\n break;\r\n case \"ReflectionColor\":\r\n case \"ReflectionFactor\":\r\n material.reflectionTexture = texture;\r\n break;\r\n case \"DisplacementColor\":\r\n case \"Displacement\":\r\n case \"DisplacementFactor\":\r\n // StandardMaterial doesn't have a displacement slot natively;\r\n // store for potential PBR conversion use\r\n break;\r\n case \"ShininessExponent\":\r\n case \"Shininess\":\r\n // Shininess map — no direct StandardMaterial slot\r\n break;\r\n }\r\n\r\n // Apply UV transforms\r\n if (tex.uvTranslation) {\r\n texture.uOffset = tex.uvTranslation[0];\r\n texture.vOffset = tex.uvTranslation[1];\r\n }\r\n if (tex.uvScaling) {\r\n texture.uScale = tex.uvScaling[0];\r\n texture.vScale = tex.uvScaling[1];\r\n }\r\n if (tex.uvRotation !== undefined) {\r\n texture.wAng = tex.uvRotation * (Math.PI / 180);\r\n }\r\n if (tex.uvSetIndex !== undefined) {\r\n texture.coordinatesIndex = tex.uvSetIndex;\r\n }\r\n if (tex.uvSetName) {\r\n texture.metadata = {\r\n ...((texture.metadata as object) ?? {}),\r\n fbxUVSetName: tex.uvSetName,\r\n };\r\n }\r\n }\r\n\r\n return material;\r\n }\r\n\r\n private _configureNormalTexture(texture: Texture, material: StandardMaterial): void {\r\n texture.gammaSpace = false;\r\n material.invertNormalMapX = false;\r\n material.invertNormalMapY = this._options.normalMapCoordinateSystem === \"y-down\";\r\n }\r\n\r\n private _getNormalMapTangentHandednessScale(): 1 | -1 {\r\n return this._options.normalMapCoordinateSystem === \"y-down\" ? -1 : 1;\r\n }\r\n\r\n private static _isSupportedMaterialTextureSlot(propertyName: string): boolean {\r\n switch (propertyName) {\r\n case \"DiffuseColor\":\r\n case \"NormalMap\":\r\n case \"NormalMapTexture\":\r\n case \"normalCamera\":\r\n case \"Bump\":\r\n case \"BumpFactor\":\r\n case \"EmissiveColor\":\r\n case \"AmbientColor\":\r\n case \"SpecularColor\":\r\n case \"TransparencyFactor\":\r\n case \"TransparentColor\":\r\n case \"ReflectionColor\":\r\n case \"ReflectionFactor\":\r\n case \"DisplacementColor\":\r\n case \"Displacement\":\r\n case \"DisplacementFactor\":\r\n case \"ShininessExponent\":\r\n case \"Shininess\":\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private static _isNormalMapTextureSlot(propertyName: string): boolean {\r\n switch (propertyName) {\r\n case \"NormalMap\":\r\n case \"NormalMapTexture\":\r\n case \"normalCamera\":\r\n case \"Bump\":\r\n case \"BumpFactor\":\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private static _createTexture(tex: FBXTextureRef, scene: Scene, rootUrl: string, isDataTexture: boolean): Nullable<Texture> {\r\n const sourceName = FBXFileLoader._getTextureSourceName(tex);\r\n const creationOptions = FBXFileLoader._getTextureCreationOptions(sourceName, isDataTexture, tex.embeddedData);\r\n\r\n if (tex.embeddedData) {\r\n const texture = new Texture(null, scene, creationOptions);\r\n const embeddedTextureName = sourceName ?? `embeddedTexture_${tex.id.toString()}`;\r\n texture.updateURL(`data:fbx-embedded-texture/${encodeURIComponent(embeddedTextureName)}`, new Uint8Array(tex.embeddedData), undefined, creationOptions.forcedExtension);\r\n texture.name = embeddedTextureName;\r\n return texture;\r\n }\r\n\r\n const textureUrls = FBXFileLoader._getExternalTextureUrls(tex, rootUrl);\r\n const textureUrl = textureUrls.shift();\r\n if (!textureUrl) {\r\n return null;\r\n }\r\n\r\n return FBXFileLoader._createExternalTexture(textureUrl, textureUrls, scene, creationOptions);\r\n }\r\n\r\n private static _createExternalTexture(texturePath: string, fallbackUrls: string[], scene: Scene, creationOptions: ITextureCreationOptions): Texture {\r\n fallbackUrls.push(...FBXFileLoader._buildTextureFallbackUrls(texturePath));\r\n let fallbackIndex = 0;\r\n const texture = new Texture(texturePath, scene, {\r\n ...creationOptions,\r\n onError: () => {\r\n const fallbackUrl = fallbackUrls[fallbackIndex++];\r\n if (fallbackUrl && texture.getScene()) {\r\n texture.updateURL(fallbackUrl, null, undefined, FBXFileLoader._getForcedExtension(fallbackUrl));\r\n }\r\n },\r\n });\r\n return texture;\r\n }\r\n\r\n private static _buildTextureFallbackUrls(texturePath: string): string[] {\r\n const slashIndex = Math.max(texturePath.lastIndexOf(\"/\"), texturePath.lastIndexOf(\"\\\\\"));\r\n const dotIndex = texturePath.lastIndexOf(\".\");\r\n if (dotIndex <= slashIndex) {\r\n return [];\r\n }\r\n\r\n const basePath = texturePath.slice(0, dotIndex);\r\n const currentExtension = texturePath.slice(dotIndex + 1).toLowerCase();\r\n const extensionFallbacks = [\"png\", \"jpg\", \"jpeg\", \"webp\", \"bmp\", \"tga\"];\r\n return extensionFallbacks.filter((extension) => extension !== currentExtension).map((extension) => `${basePath}.${extension}`);\r\n }\r\n\r\n private static _getTextureCreationOptions(sourceName: Nullable<string>, isDataTexture: boolean, embeddedData: Nullable<Uint8Array>): ITextureCreationOptions {\r\n const mimeType = embeddedData ? (sourceName ? FBXFileLoader._getMimeType(sourceName) : \"image/png\") : undefined;\r\n return {\r\n buffer: embeddedData ? new Uint8Array(embeddedData) : undefined,\r\n forcedExtension: sourceName ? FBXFileLoader._getForcedExtension(sourceName, mimeType) : embeddedData ? \".png\" : undefined,\r\n gammaSpace: !isDataTexture,\r\n mimeType,\r\n };\r\n }\r\n\r\n private static _getExternalTextureUrls(tex: FBXTextureRef, rootUrl: string): string[] {\r\n const textureNames = [tex.relativeFileName, tex.fileName].filter((name): name is string => !!name);\r\n const urls: string[] = [];\r\n\r\n for (const textureName of textureNames) {\r\n const normalized = textureName.replace(/\\\\/g, \"/\");\r\n if (FBXFileLoader._isSafeRelativeTexturePath(normalized)) {\r\n urls.push(rootUrl + normalized);\r\n }\r\n\r\n const basename = FBXFileLoader._getTextureSourceNameFromPath(normalized);\r\n if (basename) {\r\n urls.push(rootUrl + basename);\r\n }\r\n }\r\n\r\n return Array.from(new Set(urls));\r\n }\r\n\r\n private static _getTextureSourceName(tex: FBXTextureRef): Nullable<string> {\r\n const textureName = tex.relativeFileName || tex.fileName;\r\n if (!textureName) {\r\n return null;\r\n }\r\n const normalized = textureName.replace(/\\\\/g, \"/\");\r\n return FBXFileLoader._getTextureSourceNameFromPath(normalized);\r\n }\r\n\r\n private static _getTextureSourceNameFromPath(texturePath: string): Nullable<string> {\r\n return texturePath.split(\"/\").pop() ?? texturePath;\r\n }\r\n\r\n private static _isSafeRelativeTexturePath(texturePath: string): boolean {\r\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(texturePath) || texturePath.startsWith(\"/\") || texturePath.startsWith(\"//\")) {\r\n return false;\r\n }\r\n\r\n return !texturePath.split(\"/\").some((part) => part === \"..\");\r\n }\r\n\r\n private static _getForcedExtension(fileName: string, mimeType?: string): string | undefined {\r\n const slashIndex = Math.max(fileName.lastIndexOf(\"/\"), fileName.lastIndexOf(\"\\\\\"));\r\n const dotIndex = fileName.lastIndexOf(\".\");\r\n if (dotIndex > slashIndex) {\r\n return fileName.slice(dotIndex).toLowerCase();\r\n }\r\n\r\n switch (mimeType) {\r\n case \"image/png\":\r\n return \".png\";\r\n case \"image/jpeg\":\r\n return \".jpg\";\r\n case \"image/webp\":\r\n return \".webp\";\r\n case \"image/bmp\":\r\n return \".bmp\";\r\n case \"image/gif\":\r\n return \".gif\";\r\n case \"image/x-tga\":\r\n return \".tga\";\r\n default:\r\n return undefined;\r\n }\r\n }\r\n\r\n private static _getMimeType(fileName: string): string {\r\n const mimeType = GetMimeType(fileName);\r\n if (mimeType) {\r\n return mimeType;\r\n }\r\n\r\n const extension = FBXFileLoader._getForcedExtension(fileName);\r\n switch (extension) {\r\n case \".tga\":\r\n return \"image/x-tga\";\r\n case \".bmp\":\r\n return \"image/bmp\";\r\n case \".gif\":\r\n return \"image/gif\";\r\n default:\r\n return \"image/png\";\r\n }\r\n }\r\n\r\n /**\r\n * Apply blend shape (morph target) deformers to meshes.\r\n * FBX Shape vertices are stored as absolute positions for sparse control points.\r\n * We compute deltas relative to the base mesh positions.\r\n */\r\n private _applyBlendShapes(blendShapes: FBXBlendShapeData[], meshes: Mesh[], scene: Scene): void {\r\n // Build a map from geometry ID to mesh (using the mesh metadata we'll need to store)\r\n // The mesh's geometry ID is tracked through the model hierarchy during _buildModel.\r\n // We need to match blendShape.geometryId to the correct mesh.\r\n // Strategy: match by examining which meshes have positions matching the geometry.\r\n\r\n for (const bs of blendShapes) {\r\n // Find the mesh that uses this geometry\r\n const mesh = meshes.find((m) => {\r\n const geomId = (m.metadata as { fbxGeometryId?: number } | undefined)?.fbxGeometryId;\r\n return geomId === bs.geometryId;\r\n });\r\n if (!mesh) {\r\n continue;\r\n }\r\n\r\n const morphTargetManager = new MorphTargetManager(scene);\r\n morphTargetManager.optimizeInfluencers = false;\r\n // Get preRotation matrix if the mesh had its positions baked\r\n const deltaMatrix =\r\n (mesh.metadata as { fbxGeometryDeltaMatrix?: Matrix | null; fbxPreRotMatrix?: Matrix | null } | undefined)?.fbxGeometryDeltaMatrix ??\r\n (mesh.metadata as { fbxPreRotMatrix?: Matrix | null } | undefined)?.fbxPreRotMatrix ??\r\n null;\r\n const normalMatrix = (mesh.metadata as { fbxGeometryNormalMatrix?: Matrix | null } | undefined)?.fbxGeometryNormalMatrix ?? deltaMatrix;\r\n\r\n for (const channel of bs.channels) {\r\n // Get the control point indices for this mesh (stored as metadata)\r\n const cpIndices = (mesh.metadata as { fbxControlPointIndices?: Uint32Array } | undefined)?.fbxControlPointIndices;\r\n if (!cpIndices) {\r\n continue;\r\n }\r\n\r\n const basePositions = mesh.getVerticesData(\"position\");\r\n const baseNormals = mesh.getVerticesData(\"normal\");\r\n if (!basePositions) {\r\n continue;\r\n }\r\n\r\n const initialInfluences = calculateBlendShapeInfluences(channel.deformPercent, channel.fullWeights, channel.shapes.length);\r\n const targetIndices: number[] = [];\r\n for (let shapeIndex = 0; shapeIndex < channel.shapes.length; shapeIndex++) {\r\n const shape = channel.shapes[shapeIndex];\r\n if (!shape) {\r\n continue;\r\n }\r\n const targetData = buildMorphTargetData(shape, cpIndices, basePositions, baseNormals, deltaMatrix, normalMatrix);\r\n if (!targetData) {\r\n continue;\r\n }\r\n\r\n const targetName = channel.fullWeights && channel.shapes.length > 1 ? `${channel.name}_${channel.fullWeights[shapeIndex]}` : channel.name;\r\n const morphTarget = new MorphTarget(targetName, initialInfluences[shapeIndex] ?? 0, scene);\r\n morphTarget.setPositions(targetData.positions);\r\n if (targetData.normals) {\r\n morphTarget.setNormals(targetData.normals);\r\n }\r\n\r\n targetIndices.push(morphTargetManager.numTargets);\r\n morphTargetManager.addTarget(morphTarget);\r\n }\r\n\r\n if (targetIndices.length === 0) {\r\n continue;\r\n }\r\n\r\n // Store channel ID mapping on the mesh for animation targeting.\r\n // Keep the legacy single-target map for existing consumers and add\r\n // richer in-between metadata for FullWeights-aware animation baking.\r\n if (!mesh.metadata) {\r\n mesh.metadata = {};\r\n }\r\n if (!(mesh.metadata as Record<string, unknown>).fbxBlendShapeChannelIds) {\r\n (mesh.metadata as Record<string, unknown>).fbxBlendShapeChannelIds = new Map<number, number>();\r\n }\r\n ((mesh.metadata as Record<string, unknown>).fbxBlendShapeChannelIds as Map<number, number>).set(channel.id, targetIndices[0]);\r\n if (!(mesh.metadata as Record<string, unknown>).fbxBlendShapeChannelTargets) {\r\n (mesh.metadata as Record<string, unknown>).fbxBlendShapeChannelTargets = new Map<number, { targetIndices: number[]; fullWeights: number[] | null }>();\r\n }\r\n ((mesh.metadata as Record<string, unknown>).fbxBlendShapeChannelTargets as Map<number, { targetIndices: number[]; fullWeights: number[] | null }>).set(channel.id, {\r\n targetIndices,\r\n fullWeights: channel.fullWeights,\r\n });\r\n }\r\n\r\n if (morphTargetManager.numTargets > 0) {\r\n morphTargetManager.numMaxInfluencers = morphTargetManager.numTargets;\r\n mesh.morphTargetManager = morphTargetManager;\r\n }\r\n }\r\n }\r\n\r\n private _createCamera(camData: FBXCameraData, modelIdToNode: Map<number, TransformNode>, scene: Scene): FreeCamera | null {\r\n const parentNode = modelIdToNode.get(camData.modelId);\r\n const worldMatrix = parentNode ? parentNode.computeWorldMatrix(true) : Matrix.Identity();\r\n const position = Vector3.TransformCoordinates(Vector3.Zero(), worldMatrix);\r\n\r\n const camera = new FreeCamera(camData.name, position, scene);\r\n camera.fov = camData.fieldOfView * (Math.PI / 180);\r\n camera.minZ = camData.nearPlane;\r\n camera.maxZ = camData.farPlane;\r\n camera.metadata = {\r\n ...((camera.metadata as object) ?? {}),\r\n fbxCamera: {\r\n projectionType: camData.projectionType,\r\n focalLength: camData.focalLength,\r\n filmWidth: camData.filmWidth,\r\n filmHeight: camData.filmHeight,\r\n orthoZoom: camData.orthoZoom,\r\n roll: camData.roll,\r\n aspectRatio: camData.aspectRatio,\r\n unknownProperties: camData.unknownProperties,\r\n diagnostics: camData.diagnostics,\r\n },\r\n };\r\n\r\n if (camData.projectionType === \"orthographic\") {\r\n const orthoHeight = camData.orthoZoom && camData.orthoZoom > 0 ? camData.orthoZoom : 1;\r\n const aspect = camData.aspectRatio > 0 ? camData.aspectRatio : 1;\r\n camera.mode = Camera.ORTHOGRAPHIC_CAMERA;\r\n camera.orthoTop = orthoHeight / 2;\r\n camera.orthoBottom = -orthoHeight / 2;\r\n camera.orthoRight = (orthoHeight * aspect) / 2;\r\n camera.orthoLeft = -(orthoHeight * aspect) / 2;\r\n }\r\n\r\n // FBX cameras look down their local +X axis. Derive the world-space look-at target from the\r\n // node's world matrix using point transforms so the file's handedness conversion (the\r\n // left-handed root applies scaling.z = -1) is reproduced correctly. Transforming a direction\r\n // with the rotation alone would mirror it under that reflection and aim the camera wrongly.\r\n const target = Vector3.TransformCoordinates(new Vector3(1, 0, 0), worldMatrix);\r\n camera.setTarget(target);\r\n\r\n return camera;\r\n }\r\n\r\n private _createLight(lightData: FBXLightData, modelIdToNode: Map<number, TransformNode>, scene: Scene): PointLight | DirectionalLight | SpotLight | null {\r\n const parentNode = modelIdToNode.get(lightData.modelId);\r\n const worldMatrix = parentNode ? parentNode.computeWorldMatrix(true) : Matrix.Identity();\r\n const position = Vector3.TransformCoordinates(Vector3.Zero(), worldMatrix);\r\n const color = new Color3(lightData.color[0], lightData.color[1], lightData.color[2]);\r\n\r\n // FBX lights point down their local -Z axis. Derive the world-space direction from two points\r\n // transformed by the node's world matrix so the handedness conversion (the left-handed root\r\n // applies scaling.z = -1) is reproduced correctly; transforming the direction as a normal\r\n // would mirror it under that reflection and point the light the wrong way.\r\n const forwardPoint = Vector3.TransformCoordinates(new Vector3(0, 0, -1), worldMatrix);\r\n const direction = forwardPoint.subtract(position).normalize();\r\n\r\n let light: PointLight | DirectionalLight | SpotLight;\r\n\r\n switch (lightData.lightType) {\r\n case 1: // Directional\r\n light = new DirectionalLight(lightData.name, direction, scene);\r\n light.diffuse = color;\r\n light.intensity = lightData.intensity;\r\n break;\r\n case 2: {\r\n // Spot\r\n const angle = lightData.coneAngle * (Math.PI / 180);\r\n light = new SpotLight(lightData.name, position, direction, angle, 2, scene);\r\n light.diffuse = color;\r\n light.intensity = lightData.intensity;\r\n break;\r\n }\r\n default: // Point (0)\r\n light = new PointLight(lightData.name, position, scene);\r\n light.diffuse = color;\r\n light.intensity = lightData.intensity;\r\n break;\r\n }\r\n\r\n light.metadata = {\r\n ...((light.metadata as object) ?? {}),\r\n fbxLight: {\r\n lightType: lightData.lightType,\r\n decayType: lightData.decayType,\r\n decayStart: lightData.decayStart,\r\n innerAngle: lightData.innerAngle,\r\n outerAngle: lightData.outerAngle,\r\n enableNearAttenuation: lightData.enableNearAttenuation,\r\n enableFarAttenuation: lightData.enableFarAttenuation,\r\n castShadows: lightData.castShadows,\r\n unknownProperties: lightData.unknownProperties,\r\n diagnostics: lightData.diagnostics,\r\n },\r\n };\r\n\r\n return light;\r\n }\r\n\r\n private _createSkeleton(skeletonId: string, bones: FBXBoneData[], scene: Scene): Skeleton {\r\n const skeleton = new Skeleton(\"Skeleton\", `skeleton_${skeletonId}`, scene);\r\n const sourceBones: Bone[] = [];\r\n const scaleCompensationHelpers = new Map<number, Bone>();\r\n const authoredLocalMatrices: Matrix[] = [];\r\n const authoredAbsoluteMatrices: Matrix[] = [];\r\n const authoredRuntimeLocalMatrices: Matrix[] = [];\r\n\r\n // Compute authored Lcl matrices for bones that do not carry FBX bind data.\r\n for (let i = 0; i < bones.length; i++) {\r\n const boneData = bones[i];\r\n const authoredLocal = FBXFileLoader._computeFBXLocalMatrix(\r\n boneData.translation,\r\n boneData.rotation,\r\n boneData.scale,\r\n boneData.preRotation,\r\n boneData.postRotation,\r\n boneData.rotationPivot,\r\n boneData.scalingPivot,\r\n boneData.rotationOffset,\r\n boneData.scalingOffset,\r\n boneData.rotationOrder\r\n );\r\n authoredLocalMatrices[i] = authoredLocal;\r\n authoredRuntimeLocalMatrices[i] = FBXFileLoader._computeFBXRuntimeLocalMatrix(bones, authoredLocal, i);\r\n }\r\n authoredAbsoluteMatrices.push(...FBXFileLoader._computeFBXAbsoluteMatrices(bones, authoredRuntimeLocalMatrices));\r\n\r\n const absoluteBindMatrices = bones.map((boneData, index) =>\r\n boneData.transformLinkMatrix\r\n ? Matrix.FromArray(boneData.transformLinkMatrix)\r\n : boneData.modelBindPoseMatrix\r\n ? Matrix.FromArray(boneData.modelBindPoseMatrix)\r\n : authoredAbsoluteMatrices[index]\r\n );\r\n\r\n const localBindMatrices = absoluteBindMatrices.map((absoluteBind, index) => {\r\n const parentIndex = bones[index].parentIndex;\r\n if (parentIndex < 0) {\r\n return absoluteBind;\r\n }\r\n\r\n const parentAbsoluteBindInv = new Matrix();\r\n absoluteBindMatrices[parentIndex].invertToRef(parentAbsoluteBindInv);\r\n return absoluteBind.multiply(parentAbsoluteBindInv);\r\n });\r\n const useBindAsRest = FBXFileLoader._shouldUseBindMatricesAsRest(bones, authoredLocalMatrices, localBindMatrices);\r\n\r\n // Most animation curves naturally target authored Lcl transforms. Use\r\n // bind matrices as live rest pose only for rigs with severe bind/local\r\n // scale disagreement, which otherwise produce invalid skin matrices.\r\n // Only bones with that scale disagreement need their animation curves\r\n // remapped into bind-rest space; ordinary child curves are already in\r\n // the expected local animation space.\r\n for (let i = 0; i < bones.length; i++) {\r\n let localMatrix = useBindAsRest ? localBindMatrices[i] : authoredRuntimeLocalMatrices[i];\r\n let parentBone = bones[i].parentIndex >= 0 ? sourceBones[bones[i].parentIndex] : null;\r\n if (!useBindAsRest && bones[i].inheritType === 2 && bones[i].parentIndex >= 0 && parentBone) {\r\n const split = FBXFileLoader._splitParentScaleCompensatedLocalMatrix(authoredLocalMatrices[i], bones[bones[i].parentIndex].scale);\r\n const helper = new Bone(\r\n `${bones[i].name}__fbx_scaleCompensation`,\r\n skeleton,\r\n parentBone,\r\n split.helperLocalMatrix,\r\n split.helperLocalMatrix.clone(),\r\n Matrix.Identity(),\r\n -1\r\n );\r\n helper.metadata = {\r\n ...((helper.metadata as object) ?? {}),\r\n fbxScaleCompensationForBoneIndex: i,\r\n fbxScaleCompensationForBoneName: bones[i].name,\r\n };\r\n scaleCompensationHelpers.set(i, helper);\r\n parentBone = helper;\r\n localMatrix = split.boneLocalMatrix;\r\n }\r\n const bone = new Bone(bones[i].name, skeleton, parentBone, localMatrix, useBindAsRest ? localMatrix.clone() : null, useBindAsRest ? localMatrix.clone() : null, i);\r\n if (useBindAsRest && bones[i].isCluster && FBXFileLoader._getMaxScaleRatio(authoredLocalMatrices[i], localBindMatrices[i]) >= BIND_REST_SCALE_RATIO_THRESHOLD) {\r\n this._bindRestBones.add(bone);\r\n }\r\n sourceBones.push(bone);\r\n }\r\n this._sourceBonesBySkeleton.set(skeleton, sourceBones);\r\n this._scaleCompensationHelpersBySkeleton.set(skeleton, scaleCompensationHelpers);\r\n\r\n if (!useBindAsRest) {\r\n for (let i = 0; i < bones.length; i++) {\r\n const bone = sourceBones[i];\r\n bone.updateMatrix(localBindMatrices[i], false, false);\r\n }\r\n for (const helper of Array.from(scaleCompensationHelpers.values())) {\r\n helper.updateMatrix(Matrix.Identity(), false, false);\r\n }\r\n for (const bone of skeleton.bones) {\r\n if (!bone.getParent()) {\r\n bone._updateAbsoluteBindMatrices(undefined, true);\r\n }\r\n }\r\n }\r\n\r\n return skeleton;\r\n }\r\n\r\n private _getSourceBone(skeleton: Skeleton, sourceIndex: number): Bone | undefined {\r\n return this._sourceBonesBySkeleton.get(skeleton)?.[sourceIndex] ?? skeleton.bones[sourceIndex];\r\n }\r\n\r\n private _getScaleCompensationHelper(skeleton: Skeleton, sourceIndex: number): Bone | undefined {\r\n return this._scaleCompensationHelpersBySkeleton.get(skeleton)?.get(sourceIndex);\r\n }\r\n\r\n private static _computeFBXAbsoluteMatrices(bones: FBXBoneData[], localMatrices: Matrix[]): Matrix[] {\r\n const absoluteMatrices: Matrix[] = [];\r\n for (let i = 0; i < bones.length; i++) {\r\n const parentIndex = bones[i].parentIndex;\r\n if (parentIndex < 0) {\r\n absoluteMatrices[i] = localMatrices[i].clone();\r\n continue;\r\n }\r\n\r\n absoluteMatrices[i] = localMatrices[i].multiply(absoluteMatrices[parentIndex]);\r\n }\r\n return absoluteMatrices;\r\n }\r\n\r\n private static _computeFBXRuntimeLocalMatrix(bones: FBXBoneData[], localMatrix: Matrix, index: number, parentScaleOverride?: [number, number, number]): Matrix {\r\n const parentIndex = bones[index].parentIndex;\r\n if (bones[index].inheritType !== 2 || parentIndex < 0) {\r\n return localMatrix;\r\n }\r\n\r\n const parentScale = parentScaleOverride ?? bones[parentIndex].scale;\r\n return FBXFileLoader._applyParentScaleCompensation(localMatrix, parentScale);\r\n }\r\n\r\n private static _applyParentScaleCompensation(localMatrix: Matrix, parentScale: [number, number, number]): Matrix {\r\n const split = FBXFileLoader._splitParentScaleCompensatedLocalMatrix(localMatrix, parentScale);\r\n return split.boneLocalMatrix.multiply(split.helperLocalMatrix);\r\n }\r\n\r\n private static _splitParentScaleCompensatedLocalMatrix(localMatrix: Matrix, parentScale: [number, number, number]): { boneLocalMatrix: Matrix; helperLocalMatrix: Matrix } {\r\n const translation = localMatrix.getTranslation();\r\n const boneLocalMatrix = localMatrix.clone();\r\n boneLocalMatrix.setTranslation(Vector3.Zero());\r\n const helperLocalMatrix = Matrix.Compose(FBXFileLoader._getInverseScaleVector(parentScale), Quaternion.Identity(), translation);\r\n return { boneLocalMatrix, helperLocalMatrix };\r\n }\r\n\r\n private static _safeInverseScale(value: number): number {\r\n return Math.abs(value) > 1e-8 ? 1 / value : 1;\r\n }\r\n\r\n private static _getInverseScaleVector(scale: [number, number, number]): Vector3 {\r\n return new Vector3(FBXFileLoader._safeInverseScale(scale[0]), FBXFileLoader._safeInverseScale(scale[1]), FBXFileLoader._safeInverseScale(scale[2]));\r\n }\r\n\r\n private static _shouldUseBindMatricesAsRest(bones: FBXBoneData[], authoredLocalMatrices: Matrix[], localBindMatrices: Matrix[]): boolean {\r\n return bones.some((bone, index) => {\r\n if (!bone.isCluster) {\r\n return false;\r\n }\r\n return FBXFileLoader._getMaxScaleRatio(authoredLocalMatrices[index], localBindMatrices[index]) >= BIND_REST_SCALE_RATIO_THRESHOLD;\r\n });\r\n }\r\n\r\n private static _getMaxScaleRatio(a: Matrix, b: Matrix): number {\r\n const scaleA = new Vector3();\r\n const rotationA = new Quaternion();\r\n const translationA = new Vector3();\r\n const scaleB = new Vector3();\r\n const rotationB = new Quaternion();\r\n const translationB = new Vector3();\r\n a.decompose(scaleA, rotationA, translationA);\r\n b.decompose(scaleB, rotationB, translationB);\r\n\r\n return Math.max(FBXFileLoader._getScaleRatio(scaleA.x, scaleB.x), FBXFileLoader._getScaleRatio(scaleA.y, scaleB.y), FBXFileLoader._getScaleRatio(scaleA.z, scaleB.z));\r\n }\r\n\r\n private static _getScaleRatio(a: number, b: number): number {\r\n const absA = Math.abs(a);\r\n const absB = Math.abs(b);\r\n if (absA < 1e-6 || absB < 1e-6) {\r\n return absA < 1e-6 && absB < 1e-6 ? 1 : Number.POSITIVE_INFINITY;\r\n }\r\n return Math.max(absA / absB, absB / absA);\r\n }\r\n\r\n private static _computeFBXGeometricMatrix(translation: [number, number, number], rotation: [number, number, number], scale: [number, number, number]): Matrix {\r\n return computeFBXGeometricMatrix(translation, rotation, scale);\r\n }\r\n\r\n private static _computeFBXGeometricDeltaMatrix(rotation: [number, number, number], scale: [number, number, number]): Matrix {\r\n return computeFBXGeometricDeltaMatrix(rotation, scale);\r\n }\r\n\r\n private static _computeFBXGeometricNormalMatrix(rotation: [number, number, number], scale: [number, number, number]): Matrix {\r\n return computeFBXGeometricNormalMatrix(rotation, scale);\r\n }\r\n\r\n /**\r\n * Compute the full FBX local transform matrix:\r\n * M = T * Roff * Rp * Rpre * R * Rpost^-1 * Rp^-1 * Soff * Sp * S * Sp^-1\r\n *\r\n * In row-vector convention: v' = v * M\r\n */\r\n private static _computeFBXLocalMatrix(\r\n translation: [number, number, number],\r\n rotation: [number, number, number],\r\n scale: [number, number, number],\r\n preRotation: [number, number, number],\r\n postRotation: [number, number, number],\r\n rotationPivot: [number, number, number],\r\n scalingPivot: [number, number, number],\r\n rotationOffset: [number, number, number],\r\n scalingOffset: [number, number, number],\r\n rotationOrder: number = 0\r\n ): Matrix {\r\n return computeFBXLocalMatrix({\r\n translation,\r\n rotation,\r\n scale,\r\n preRotation,\r\n postRotation,\r\n rotationPivot,\r\n scalingPivot,\r\n rotationOffset,\r\n scalingOffset,\r\n rotationOrder,\r\n });\r\n }\r\n\r\n /**\r\n * Apply the FBX transform chain to a Babylon TransformNode or Mesh.\r\n * Decomposes the full local matrix into position/rotation/scale.\r\n */\r\n private static _applyFBXTransform(node: TransformNode | Mesh, model: FBXModelData): void {\r\n const localMatrix = FBXFileLoader._computeFBXModelLocalMatrix(model);\r\n\r\n // Decompose into TRS\r\n const s = new Vector3();\r\n const r = new Quaternion();\r\n const t = new Vector3();\r\n localMatrix.decompose(s, r, t);\r\n\r\n node.position = t;\r\n node.rotationQuaternion = r;\r\n node.scaling = s;\r\n }\r\n\r\n private static _computeFBXModelLocalMatrix(model: FBXModelData): Matrix {\r\n return FBXFileLoader._computeFBXLocalMatrix(\r\n model.translation,\r\n model.rotation,\r\n model.scale,\r\n model.preRotation,\r\n model.postRotation,\r\n model.rotationPivot,\r\n model.scalingPivot,\r\n model.rotationOffset,\r\n model.scalingOffset,\r\n model.rotationOrder\r\n );\r\n }\r\n\r\n private static _getBoneReferenceWorldMatrix(skeleton: Skeleton, bone: Bone, referenceNode: TransformNode, skinnedMesh: Mesh | null): Matrix {\r\n if (skinnedMesh) {\r\n skeleton.getTransformMatrices(skinnedMesh);\r\n } else {\r\n skeleton.prepare(true);\r\n }\r\n referenceNode.computeWorldMatrix(true);\r\n return bone.getFinalMatrix().multiply(referenceNode.getWorldMatrix());\r\n }\r\n\r\n private static _applyMatrixToTransform(node: TransformNode, matrix: Matrix): void {\r\n const s = new Vector3();\r\n const r = new Quaternion();\r\n const t = new Vector3();\r\n matrix.decompose(s, r, t);\r\n\r\n node.position = t;\r\n node.rotationQuaternion = r;\r\n node.scaling = s;\r\n }\r\n\r\n private _createAnimationGroup(\r\n animStack: FBXAnimationStackData,\r\n rigs: FBXRigData[],\r\n skeletonByRigId: Map<string, Skeleton>,\r\n scene: Scene,\r\n modelIdToNode: Map<number, TransformNode>,\r\n modelIdToData: Map<number, FBXModelData>,\r\n meshes: Mesh[]\r\n ): AnimationGroup | null {\r\n if (animStack.curveNodes.length === 0) {\r\n return null;\r\n }\r\n\r\n const animGroup = new AnimationGroup(animStack.name, scene);\r\n\r\n // Build a map from model ID to resolved rig bones. A single FBX model ID\r\n // should only appear once per resolved rig, but keeping an array preserves\r\n // the previous animation fan-out behavior for any future duplicate rigs.\r\n const modelIdToBones = new Map<number, Bone[]>();\r\n for (const rig of rigs) {\r\n const skeleton = skeletonByRigId.get(rig.id);\r\n if (!skeleton) {\r\n continue;\r\n }\r\n\r\n for (const boneData of rig.bones) {\r\n const bone = this._getSourceBone(skeleton, boneData.index);\r\n if (!bone) {\r\n continue;\r\n }\r\n\r\n const bones = modelIdToBones.get(boneData.modelId);\r\n if (bones) {\r\n bones.push(bone);\r\n } else {\r\n modelIdToBones.set(boneData.modelId, [bone]);\r\n }\r\n }\r\n }\r\n\r\n // Group curve nodes by target\r\n const boneCurves = new Map<number, FBXCurveNodeData[]>();\r\n const nonBoneCurves = new Map<number, FBXCurveNodeData[]>();\r\n const blendShapeCurves: FBXCurveNodeData[] = [];\r\n\r\n for (const curveNode of animStack.curveNodes) {\r\n if (curveNode.type === \"DeformPercent\") {\r\n blendShapeCurves.push(curveNode);\r\n continue;\r\n }\r\n\r\n if (modelIdToBones.has(curveNode.targetModelId)) {\r\n if (!boneCurves.has(curveNode.targetModelId)) {\r\n boneCurves.set(curveNode.targetModelId, []);\r\n }\r\n boneCurves.get(curveNode.targetModelId)!.push(curveNode);\r\n } else {\r\n if (!nonBoneCurves.has(curveNode.targetModelId)) {\r\n nonBoneCurves.set(curveNode.targetModelId, []);\r\n }\r\n nonBoneCurves.get(curveNode.targetModelId)!.push(curveNode);\r\n }\r\n }\r\n\r\n // Process bone targets: compute full FBX local matrix per frame, decompose to TRS.\r\n // For bind-rest rigs, only the bones recorded in _bindRestBones need their\r\n // authored Lcl curves remapped onto the bind-rest local space.\r\n const inheritedRigModelIds = new Set<number>();\r\n for (const rig of rigs) {\r\n const inheritType2ModelIds = new Set(rig.bones.filter((bone) => bone.inheritType === 2).map((bone) => bone.modelId));\r\n if (inheritType2ModelIds.size === 0) {\r\n continue;\r\n }\r\n\r\n const skeleton = skeletonByRigId.get(rig.id);\r\n if (!skeleton) {\r\n continue;\r\n }\r\n\r\n if (skeleton.bones.some((bone) => this._bindRestBones.has(bone))) {\r\n continue;\r\n }\r\n\r\n for (const modelId of Array.from(inheritType2ModelIds)) {\r\n inheritedRigModelIds.add(modelId);\r\n }\r\n for (const { bone, animations } of this._buildInheritedRigBoneAnimations(\r\n rig,\r\n skeleton,\r\n boneCurves,\r\n modelIdToData,\r\n inheritType2ModelIds,\r\n animStack.startTime,\r\n animStack.stopTime\r\n )) {\r\n for (const animation of animations) {\r\n animGroup.addTargetedAnimation(animation, bone);\r\n }\r\n }\r\n }\r\n\r\n for (const [targetId, curveNodes] of Array.from(boneCurves)) {\r\n if (inheritedRigModelIds.has(targetId)) {\r\n continue;\r\n }\r\n\r\n const bones = modelIdToBones.get(targetId);\r\n const modelData = modelIdToData.get(targetId);\r\n if (!bones || bones.length === 0 || !modelData) {\r\n continue;\r\n }\r\n\r\n for (const bone of bones) {\r\n const animations = this._buildBoneAnimations(\r\n curveNodes,\r\n bone.name,\r\n modelData,\r\n animStack.startTime,\r\n animStack.stopTime,\r\n this._bindRestBones.has(bone) ? bone.getBindMatrix() : undefined\r\n );\r\n for (const animation of animations) {\r\n animGroup.addTargetedAnimation(animation, bone);\r\n }\r\n }\r\n }\r\n\r\n // Process non-bone targets: bake full transform matrix per frame\r\n for (const [targetId, curveNodes] of Array.from(nonBoneCurves)) {\r\n const node = modelIdToNode.get(targetId);\r\n if (!node) {\r\n continue;\r\n }\r\n\r\n const modelData = modelIdToData.get(targetId);\r\n if (!modelData) {\r\n continue;\r\n }\r\n\r\n const animations = this._buildNodeAnimations(curveNodes, node.name, modelData, animStack.startTime, animStack.stopTime);\r\n for (const animation of animations) {\r\n animGroup.addTargetedAnimation(animation, node);\r\n }\r\n }\r\n\r\n // Process blend shape (morph target) animations\r\n for (const curveNode of blendShapeCurves) {\r\n const targetChannelId = curveNode.targetModelId;\r\n\r\n // Find the morph target with matching channel ID across all meshes\r\n let targetFound = false;\r\n for (const mesh of meshes) {\r\n if (!mesh.morphTargetManager || targetFound) {\r\n continue;\r\n }\r\n const metadata = mesh.metadata as Record<string, unknown> | undefined;\r\n const channelTargets = metadata?.fbxBlendShapeChannelTargets as Map<number, { targetIndices: number[]; fullWeights: number[] | null }> | undefined;\r\n const targetInfo = channelTargets?.get(targetChannelId);\r\n if (targetInfo && curveNode.curves.length > 0) {\r\n const fps = 30;\r\n for (let shapeIndex = 0; shapeIndex < targetInfo.targetIndices.length; shapeIndex++) {\r\n const target = mesh.morphTargetManager.getTarget(targetInfo.targetIndices[shapeIndex]);\r\n if (!target) {\r\n continue;\r\n }\r\n const anim = new Animation(`${target.name}_influence`, \"influence\", fps, Animation.ANIMATIONTYPE_FLOAT, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n const keys = buildScalarAnimationKeys(\r\n curveNode.curves[0],\r\n fps,\r\n animStack.startTime,\r\n animStack.stopTime,\r\n (value) => calculateBlendShapeInfluences(value, targetInfo.fullWeights, targetInfo.targetIndices.length)[shapeIndex] ?? 0\r\n );\r\n anim.setKeys(keys);\r\n animGroup.addTargetedAnimation(anim, target);\r\n }\r\n targetFound = true;\r\n continue;\r\n }\r\n\r\n const channelMap = metadata?.fbxBlendShapeChannelIds as Map<number, number> | undefined;\r\n if (!channelMap) {\r\n continue;\r\n }\r\n const targetIndex = channelMap.get(targetChannelId);\r\n if (targetIndex === undefined) {\r\n continue;\r\n }\r\n\r\n const target = mesh.morphTargetManager.getTarget(targetIndex);\r\n if (target && curveNode.curves.length > 0) {\r\n const fps = 30;\r\n const anim = new Animation(`${target.name}_influence`, \"influence\", fps, Animation.ANIMATIONTYPE_FLOAT, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n const keys = buildScalarAnimationKeys(curveNode.curves[0], fps, animStack.startTime, animStack.stopTime, (value) => value / 100);\r\n anim.setKeys(keys);\r\n animGroup.addTargetedAnimation(anim, target);\r\n targetFound = true;\r\n }\r\n }\r\n }\r\n\r\n // Normalize the animation group\r\n if (animGroup.targetedAnimations.length > 0) {\r\n animGroup.normalize(animStack.startTime * 30, animStack.stopTime * 30);\r\n return animGroup;\r\n }\r\n\r\n animGroup.dispose();\r\n return null;\r\n }\r\n\r\n private _buildInheritedRigBoneAnimations(\r\n rig: FBXRigData,\r\n skeleton: Skeleton,\r\n boneCurves: Map<number, FBXCurveNodeData[]>,\r\n modelIdToData: Map<number, FBXModelData>,\r\n compensatedModelIds: Set<number>,\r\n startTime: number,\r\n stopTime: number\r\n ): { bone: Bone; animations: Animation[] }[] {\r\n const fps = 30;\r\n const sampledModelIds = new Set<number>();\r\n for (let i = 0; i < rig.bones.length; i++) {\r\n if (!compensatedModelIds.has(rig.bones[i].modelId)) {\r\n continue;\r\n }\r\n\r\n for (let parentIndex = i; parentIndex >= 0; parentIndex = rig.bones[parentIndex].parentIndex) {\r\n sampledModelIds.add(rig.bones[parentIndex].modelId);\r\n }\r\n }\r\n const rigCurveNodes = rig.bones.filter((bone) => sampledModelIds.has(bone.modelId)).flatMap((bone) => boneCurves.get(bone.modelId) ?? []);\r\n const times = collectAnimationSampleTimes(rigCurveNodes, fps, startTime, stopTime);\r\n if (times.length === 0) {\r\n return [];\r\n }\r\n\r\n const keysByBone = rig.bones.map(() => ({\r\n posKeys: [] as { frame: number; value: Vector3 }[],\r\n rotKeys: [] as { frame: number; value: Quaternion }[],\r\n sclKeys: [] as { frame: number; value: Vector3 }[],\r\n prevQuat: null as Quaternion | null,\r\n }));\r\n const keysByHelper = rig.bones.map(() => ({\r\n posKeys: [] as { frame: number; value: Vector3 }[],\r\n rotKeys: [] as { frame: number; value: Quaternion }[],\r\n sclKeys: [] as { frame: number; value: Vector3 }[],\r\n prevQuat: null as Quaternion | null,\r\n }));\r\n const restLocalInverses = rig.bones.map((boneData, index) => {\r\n const bone = this._getSourceBone(skeleton, index);\r\n const modelData = modelIdToData.get(boneData.modelId);\r\n if (!bone || !modelData || !this._bindRestBones.has(bone)) {\r\n return null;\r\n }\r\n\r\n const restLocalMatrix = FBXFileLoader._computeFBXModelLocalMatrix(modelData);\r\n const restLocalInverse = new Matrix();\r\n restLocalMatrix.invertToRef(restLocalInverse);\r\n return restLocalInverse;\r\n });\r\n\r\n for (const time of times) {\r\n const localMatrices = rig.bones.map((boneData, index) => {\r\n const modelData = modelIdToData.get(boneData.modelId);\r\n const curveNodes = boneCurves.get(boneData.modelId) ?? [];\r\n let localMatrix = modelData ? this._sampleModelLocalMatrix(modelData, curveNodes, time) : Matrix.Identity();\r\n\r\n const restLocalInverse = restLocalInverses[index];\r\n if (restLocalInverse) {\r\n const sourceBone = this._getSourceBone(skeleton, index);\r\n localMatrix = (sourceBone?.getBindMatrix() ?? Matrix.Identity()).multiply(restLocalInverse).multiply(localMatrix);\r\n }\r\n return localMatrix;\r\n });\r\n const sampledScales = rig.bones.map((boneData) => {\r\n const modelData = modelIdToData.get(boneData.modelId);\r\n const curveNodes = boneCurves.get(boneData.modelId) ?? [];\r\n return modelData ? this._sampleModelScale(modelData, curveNodes, time) : boneData.scale;\r\n });\r\n const frame = time * fps;\r\n\r\n for (let i = 0; i < localMatrices.length; i++) {\r\n if (!compensatedModelIds.has(rig.bones[i].modelId)) {\r\n continue;\r\n }\r\n\r\n const parentIndex = rig.bones[i].parentIndex;\r\n const parentScale = parentIndex >= 0 ? sampledScales[parentIndex] : rig.bones[i].scale;\r\n const split = FBXFileLoader._splitParentScaleCompensatedLocalMatrix(localMatrices[i], parentScale);\r\n FBXFileLoader._pushMatrixKeys(keysByBone[i], frame, split.boneLocalMatrix);\r\n FBXFileLoader._pushMatrixKeys(keysByHelper[i], frame, split.helperLocalMatrix);\r\n }\r\n }\r\n\r\n const result: { bone: Bone; animations: Animation[] }[] = [];\r\n for (let i = 0; i < rig.bones.length; i++) {\r\n if (!compensatedModelIds.has(rig.bones[i].modelId)) {\r\n continue;\r\n }\r\n\r\n const bone = this._getSourceBone(skeleton, i);\r\n if (!bone) {\r\n continue;\r\n }\r\n\r\n const { posKeys, rotKeys, sclKeys } = keysByBone[i];\r\n const animations: Animation[] = [];\r\n if (!this._isVector3KeysConstant(posKeys)) {\r\n const posAnim = new Animation(`${bone.name}_position`, \"position\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n posAnim.setKeys(posKeys);\r\n animations.push(posAnim);\r\n }\r\n if (!areQuaternionKeysConstant(rotKeys)) {\r\n const rotAnim = new Animation(`${bone.name}_rotation`, \"rotationQuaternion\", fps, Animation.ANIMATIONTYPE_QUATERNION, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n rotAnim.setKeys(rotKeys);\r\n animations.push(rotAnim);\r\n }\r\n if (!this._isVector3KeysConstant(sclKeys)) {\r\n const sclAnim = new Animation(`${bone.name}_scaling`, \"scaling\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n sclAnim.setKeys(sclKeys);\r\n animations.push(sclAnim);\r\n }\r\n if (animations.length > 0) {\r\n result.push({ bone, animations });\r\n }\r\n\r\n const helper = this._getScaleCompensationHelper(skeleton, i);\r\n if (!helper) {\r\n continue;\r\n }\r\n\r\n const helperAnimations: Animation[] = [];\r\n const { posKeys: helperPosKeys, rotKeys: helperRotKeys, sclKeys: helperSclKeys } = keysByHelper[i];\r\n if (!this._isVector3KeysConstant(helperPosKeys)) {\r\n const posAnim = new Animation(`${helper.name}_position`, \"position\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n posAnim.setKeys(helperPosKeys);\r\n helperAnimations.push(posAnim);\r\n }\r\n if (!areQuaternionKeysConstant(helperRotKeys)) {\r\n const rotAnim = new Animation(`${helper.name}_rotation`, \"rotationQuaternion\", fps, Animation.ANIMATIONTYPE_QUATERNION, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n rotAnim.setKeys(helperRotKeys);\r\n helperAnimations.push(rotAnim);\r\n }\r\n if (!this._isVector3KeysConstant(helperSclKeys)) {\r\n const sclAnim = new Animation(`${helper.name}_scaling`, \"scaling\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n sclAnim.setKeys(helperSclKeys);\r\n helperAnimations.push(sclAnim);\r\n }\r\n if (helperAnimations.length > 0) {\r\n result.push({ bone: helper, animations: helperAnimations });\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private static _pushMatrixKeys(\r\n keySet: {\r\n posKeys: { frame: number; value: Vector3 }[];\r\n rotKeys: { frame: number; value: Quaternion }[];\r\n sclKeys: { frame: number; value: Vector3 }[];\r\n prevQuat: Quaternion | null;\r\n },\r\n frame: number,\r\n matrix: Matrix\r\n ): void {\r\n const s = new Vector3();\r\n const r = new Quaternion();\r\n const t = new Vector3();\r\n matrix.decompose(s, r, t);\r\n\r\n if (keySet.prevQuat && Quaternion.Dot(keySet.prevQuat, r) < 0) {\r\n r.scaleInPlace(-1);\r\n }\r\n keySet.prevQuat = r;\r\n\r\n keySet.posKeys.push({ frame, value: t });\r\n keySet.rotKeys.push({ frame, value: r });\r\n keySet.sclKeys.push({ frame, value: s });\r\n }\r\n\r\n /**\r\n * Build animations for a non-bone node, correctly handling pivots.\r\n * Computes the full FBX transform matrix at each keyframe and decomposes into TRS.\r\n */\r\n private _buildNodeAnimations(curveNodes: FBXCurveNodeData[], nodeName: string, modelData: FBXModelData, startTime: number, stopTime: number): Animation[] {\r\n const fps = 30;\r\n\r\n // Separate curves by type\r\n const tNode = curveNodes.find((cn) => cn.type === \"T\");\r\n const rNode = curveNodes.find((cn) => cn.type === \"R\");\r\n const sNode = curveNodes.find((cn) => cn.type === \"S\");\r\n\r\n const times = collectAnimationSampleTimes(curveNodes, fps, startTime, stopTime);\r\n if (times.length === 0) {\r\n return [];\r\n }\r\n\r\n // Get curve accessors\r\n const txCurve = tNode?.curves.find((c) => c.channel === \"d|X\");\r\n const tyCurve = tNode?.curves.find((c) => c.channel === \"d|Y\");\r\n const tzCurve = tNode?.curves.find((c) => c.channel === \"d|Z\");\r\n const rxCurve = rNode?.curves.find((c) => c.channel === \"d|X\");\r\n const ryCurve = rNode?.curves.find((c) => c.channel === \"d|Y\");\r\n const rzCurve = rNode?.curves.find((c) => c.channel === \"d|Z\");\r\n const sxCurve = sNode?.curves.find((c) => c.channel === \"d|X\");\r\n const syCurve = sNode?.curves.find((c) => c.channel === \"d|Y\");\r\n const szCurve = sNode?.curves.find((c) => c.channel === \"d|Z\");\r\n\r\n // Build keyframes by computing the full matrix at each time\r\n const posKeys: { frame: number; value: Vector3 }[] = [];\r\n const rotKeys: { frame: number; value: Quaternion }[] = [];\r\n const sclKeys: { frame: number; value: Vector3 }[] = [];\r\n let prevQuat: Quaternion | null = null;\r\n\r\n for (const time of times) {\r\n const frame = time * fps;\r\n\r\n // Sample animated values, falling back to model's base values\r\n const tx = sampleFBXCurveAtTime(txCurve, time) ?? modelData.translation[0];\r\n const ty = sampleFBXCurveAtTime(tyCurve, time) ?? modelData.translation[1];\r\n const tz = sampleFBXCurveAtTime(tzCurve, time) ?? modelData.translation[2];\r\n const rx = sampleFBXCurveAtTime(rxCurve, time) ?? modelData.rotation[0];\r\n const ry = sampleFBXCurveAtTime(ryCurve, time) ?? modelData.rotation[1];\r\n const rz = sampleFBXCurveAtTime(rzCurve, time) ?? modelData.rotation[2];\r\n const sx = sampleFBXCurveAtTime(sxCurve, time) ?? modelData.scale[0];\r\n const sy = sampleFBXCurveAtTime(syCurve, time) ?? modelData.scale[1];\r\n const sz = sampleFBXCurveAtTime(szCurve, time) ?? modelData.scale[2];\r\n\r\n // Compute the full FBX local transform matrix with pivots\r\n const localMatrix = FBXFileLoader._computeFBXLocalMatrix(\r\n [tx, ty, tz],\r\n [rx, ry, rz],\r\n [sx, sy, sz],\r\n modelData.preRotation,\r\n modelData.postRotation,\r\n modelData.rotationPivot,\r\n modelData.scalingPivot,\r\n modelData.rotationOffset,\r\n modelData.scalingOffset,\r\n modelData.rotationOrder\r\n );\r\n\r\n // Decompose into TRS\r\n const s = new Vector3();\r\n const r = new Quaternion();\r\n const t = new Vector3();\r\n localMatrix.decompose(s, r, t);\r\n\r\n // Ensure quaternion continuity\r\n if (prevQuat && Quaternion.Dot(prevQuat, r) < 0) {\r\n r.scaleInPlace(-1);\r\n }\r\n prevQuat = r;\r\n\r\n posKeys.push({ frame, value: t });\r\n rotKeys.push({ frame, value: r });\r\n sclKeys.push({ frame, value: s });\r\n }\r\n\r\n const animations: Animation[] = [];\r\n\r\n // Only create position animation if it's not constant\r\n if (!this._isVector3KeysConstant(posKeys)) {\r\n const posAnim = new Animation(`${nodeName}_position`, \"position\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n posAnim.setKeys(posKeys);\r\n animations.push(posAnim);\r\n }\r\n\r\n // Always create rotation animation (if there are rotation curves)\r\n if (rNode) {\r\n const rotAnim = new Animation(`${nodeName}_rotation`, \"rotationQuaternion\", fps, Animation.ANIMATIONTYPE_QUATERNION, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n rotAnim.setKeys(rotKeys);\r\n animations.push(rotAnim);\r\n }\r\n\r\n // Only create scale animation if it's not constant\r\n if (!this._isVector3KeysConstant(sclKeys)) {\r\n const sclAnim = new Animation(`${nodeName}_scaling`, \"scaling\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n sclAnim.setKeys(sclKeys);\r\n animations.push(sclAnim);\r\n }\r\n\r\n return animations;\r\n }\r\n\r\n private _isVector3KeysConstant(keys: { frame: number; value: Vector3 }[]): boolean {\r\n if (keys.length < 2) {\r\n return true;\r\n }\r\n const first = keys[0].value;\r\n for (let i = 1; i < keys.length; i++) {\r\n const v = keys[i].value;\r\n if (Math.abs(v.x - first.x) > 0.0001 || Math.abs(v.y - first.y) > 0.0001 || Math.abs(v.z - first.z) > 0.0001) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n private _sampleModelLocalMatrix(modelData: FBXModelData, curveNodes: FBXCurveNodeData[], time: number, scaleOverride?: [number, number, number]): Matrix {\r\n const tNode = curveNodes.find((cn) => cn.type === \"T\");\r\n const rNode = curveNodes.find((cn) => cn.type === \"R\");\r\n const sNode = curveNodes.find((cn) => cn.type === \"S\");\r\n\r\n const txCurve = tNode?.curves.find((c) => c.channel === \"d|X\");\r\n const tyCurve = tNode?.curves.find((c) => c.channel === \"d|Y\");\r\n const tzCurve = tNode?.curves.find((c) => c.channel === \"d|Z\");\r\n const rxCurve = rNode?.curves.find((c) => c.channel === \"d|X\");\r\n const ryCurve = rNode?.curves.find((c) => c.channel === \"d|Y\");\r\n const rzCurve = rNode?.curves.find((c) => c.channel === \"d|Z\");\r\n const sxCurve = sNode?.curves.find((c) => c.channel === \"d|X\");\r\n const syCurve = sNode?.curves.find((c) => c.channel === \"d|Y\");\r\n const szCurve = sNode?.curves.find((c) => c.channel === \"d|Z\");\r\n\r\n return FBXFileLoader._computeFBXLocalMatrix(\r\n [\r\n sampleFBXCurveAtTime(txCurve, time) ?? modelData.translation[0],\r\n sampleFBXCurveAtTime(tyCurve, time) ?? modelData.translation[1],\r\n sampleFBXCurveAtTime(tzCurve, time) ?? modelData.translation[2],\r\n ],\r\n [\r\n sampleFBXCurveAtTime(rxCurve, time) ?? modelData.rotation[0],\r\n sampleFBXCurveAtTime(ryCurve, time) ?? modelData.rotation[1],\r\n sampleFBXCurveAtTime(rzCurve, time) ?? modelData.rotation[2],\r\n ],\r\n scaleOverride ?? [\r\n sampleFBXCurveAtTime(sxCurve, time) ?? modelData.scale[0],\r\n sampleFBXCurveAtTime(syCurve, time) ?? modelData.scale[1],\r\n sampleFBXCurveAtTime(szCurve, time) ?? modelData.scale[2],\r\n ],\r\n modelData.preRotation,\r\n modelData.postRotation,\r\n modelData.rotationPivot,\r\n modelData.scalingPivot,\r\n modelData.rotationOffset,\r\n modelData.scalingOffset,\r\n modelData.rotationOrder\r\n );\r\n }\r\n\r\n private _sampleModelScale(modelData: FBXModelData, curveNodes: FBXCurveNodeData[], time: number): [number, number, number] {\r\n const sNode = curveNodes.find((cn) => cn.type === \"S\");\r\n const sxCurve = sNode?.curves.find((c) => c.channel === \"d|X\");\r\n const syCurve = sNode?.curves.find((c) => c.channel === \"d|Y\");\r\n const szCurve = sNode?.curves.find((c) => c.channel === \"d|Z\");\r\n return [\r\n sampleFBXCurveAtTime(sxCurve, time) ?? modelData.scale[0],\r\n sampleFBXCurveAtTime(syCurve, time) ?? modelData.scale[1],\r\n sampleFBXCurveAtTime(szCurve, time) ?? modelData.scale[2],\r\n ];\r\n }\r\n\r\n /**\r\n * Build matrix-baked bone animation from full FBX local transforms.\r\n * The bind matrix carries the skinning offset, so animation curves drive\r\n * the same FBX local transform chain as the source skeleton.\r\n */\r\n private _buildBoneAnimations(\r\n curveNodes: FBXCurveNodeData[],\r\n boneName: string,\r\n modelData: FBXModelData,\r\n startTime: number,\r\n stopTime: number,\r\n bindLocalMatrix?: Matrix\r\n ): Animation[] {\r\n const fps = 30;\r\n\r\n // Separate curves by type\r\n const tNode = curveNodes.find((cn) => cn.type === \"T\");\r\n const rNode = curveNodes.find((cn) => cn.type === \"R\");\r\n const sNode = curveNodes.find((cn) => cn.type === \"S\");\r\n\r\n const times = collectAnimationSampleTimes(curveNodes, fps, startTime, stopTime);\r\n if (times.length === 0) {\r\n return [];\r\n }\r\n\r\n // Get curve accessors\r\n const txCurve = tNode?.curves.find((c) => c.channel === \"d|X\");\r\n const tyCurve = tNode?.curves.find((c) => c.channel === \"d|Y\");\r\n const tzCurve = tNode?.curves.find((c) => c.channel === \"d|Z\");\r\n const rxCurve = rNode?.curves.find((c) => c.channel === \"d|X\");\r\n const ryCurve = rNode?.curves.find((c) => c.channel === \"d|Y\");\r\n const rzCurve = rNode?.curves.find((c) => c.channel === \"d|Z\");\r\n const sxCurve = sNode?.curves.find((c) => c.channel === \"d|X\");\r\n const syCurve = sNode?.curves.find((c) => c.channel === \"d|Y\");\r\n const szCurve = sNode?.curves.find((c) => c.channel === \"d|Z\");\r\n\r\n const posKeys: { frame: number; value: Vector3 }[] = [];\r\n const rotKeys: { frame: number; value: Quaternion }[] = [];\r\n const sclKeys: { frame: number; value: Vector3 }[] = [];\r\n let prevQuat: Quaternion | null = null;\r\n let restLocalInverse: Matrix | null = null;\r\n if (bindLocalMatrix) {\r\n const restLocalMatrix = FBXFileLoader._computeFBXLocalMatrix(\r\n modelData.translation,\r\n modelData.rotation,\r\n modelData.scale,\r\n modelData.preRotation,\r\n modelData.postRotation,\r\n modelData.rotationPivot,\r\n modelData.scalingPivot,\r\n modelData.rotationOffset,\r\n modelData.scalingOffset,\r\n modelData.rotationOrder\r\n );\r\n restLocalInverse = new Matrix();\r\n restLocalMatrix.invertToRef(restLocalInverse);\r\n }\r\n\r\n for (const time of times) {\r\n const frame = time * fps;\r\n\r\n // Sample animated values, falling back to model's base values\r\n const tx = sampleFBXCurveAtTime(txCurve, time) ?? modelData.translation[0];\r\n const ty = sampleFBXCurveAtTime(tyCurve, time) ?? modelData.translation[1];\r\n const tz = sampleFBXCurveAtTime(tzCurve, time) ?? modelData.translation[2];\r\n const rx = sampleFBXCurveAtTime(rxCurve, time) ?? modelData.rotation[0];\r\n const ry = sampleFBXCurveAtTime(ryCurve, time) ?? modelData.rotation[1];\r\n const rz = sampleFBXCurveAtTime(rzCurve, time) ?? modelData.rotation[2];\r\n const sx = sampleFBXCurveAtTime(sxCurve, time) ?? modelData.scale[0];\r\n const sy = sampleFBXCurveAtTime(syCurve, time) ?? modelData.scale[1];\r\n const sz = sampleFBXCurveAtTime(szCurve, time) ?? modelData.scale[2];\r\n\r\n // Compute the full FBX local matrix from animated Lcl values\r\n const localMatrix = FBXFileLoader._computeFBXLocalMatrix(\r\n [tx, ty, tz],\r\n [rx, ry, rz],\r\n [sx, sy, sz],\r\n modelData.preRotation,\r\n modelData.postRotation,\r\n modelData.rotationPivot,\r\n modelData.scalingPivot,\r\n modelData.rotationOffset,\r\n modelData.scalingOffset,\r\n modelData.rotationOrder\r\n );\r\n\r\n const correctedLocalMatrix = restLocalInverse && bindLocalMatrix ? bindLocalMatrix.multiply(restLocalInverse).multiply(localMatrix) : localMatrix;\r\n\r\n const s = new Vector3();\r\n const r = new Quaternion();\r\n const t = new Vector3();\r\n correctedLocalMatrix.decompose(s, r, t);\r\n\r\n if (prevQuat && Quaternion.Dot(prevQuat, r) < 0) {\r\n r.scaleInPlace(-1);\r\n }\r\n prevQuat = r;\r\n\r\n posKeys.push({ frame, value: t });\r\n rotKeys.push({ frame, value: r });\r\n sclKeys.push({ frame, value: s });\r\n }\r\n\r\n const animations: Animation[] = [];\r\n\r\n if (!this._isVector3KeysConstant(posKeys)) {\r\n const posAnim = new Animation(`${boneName}_position`, \"position\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n posAnim.setKeys(posKeys);\r\n animations.push(posAnim);\r\n }\r\n\r\n if (rNode) {\r\n const rotAnim = new Animation(`${boneName}_rotation`, \"rotationQuaternion\", fps, Animation.ANIMATIONTYPE_QUATERNION, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n rotAnim.setKeys(rotKeys);\r\n animations.push(rotAnim);\r\n }\r\n\r\n if (!this._isVector3KeysConstant(sclKeys)) {\r\n const sclAnim = new Animation(`${boneName}_scaling`, \"scaling\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n sclAnim.setKeys(sclKeys);\r\n animations.push(sclAnim);\r\n }\r\n\r\n return animations;\r\n }\r\n\r\n private _buildNameFilter(meshesNames: string | readonly string[] | null | undefined): ((name: string) => boolean) | null {\r\n if (!meshesNames) {\r\n return null;\r\n }\r\n if (typeof meshesNames === \"string\") {\r\n if (meshesNames === \"\") {\r\n return null;\r\n }\r\n return (name: string) => name === meshesNames;\r\n }\r\n if (meshesNames.length === 0) {\r\n return null;\r\n }\r\n const nameSet = new Set(meshesNames);\r\n return (name: string) => nameSet.has(name);\r\n }\r\n}\r\n\r\nfunction float64To32(arr: Float64Array): Float32Array {\r\n const result = new Float32Array(arr.length);\r\n for (let i = 0; i < arr.length; i++) {\r\n result[i] = arr[i];\r\n }\r\n return result;\r\n}\r\n\r\nfunction applyTangentHandednessScale(tangents: Float32Array, scale: 1 | -1): void {\r\n if (scale === 1) {\r\n return;\r\n }\r\n for (let i = 3; i < tangents.length; i += 4) {\r\n tangents[i] *= scale;\r\n }\r\n}\r\n\r\nfunction generateTangents(\r\n positions: ArrayLike<number>,\r\n normals: ArrayLike<number>,\r\n uvs: ArrayLike<number>,\r\n indices: ArrayLike<number>,\r\n normalMapTangentHandednessScale: 1 | -1 = 1,\r\n controlPointIndices: ArrayLike<number> | null = null,\r\n materialIndices: ArrayLike<number> | null = null\r\n): Float32Array {\r\n const vertexCount = positions.length / 3;\r\n const groups = new Map<string, TangentGroup>();\r\n const vertexGroupKeys = new Array<string | null>(vertexCount).fill(null);\r\n\r\n for (let i = 0; i + 2 < indices.length; i += 3) {\r\n const materialIndex = materialIndices ? materialIndices[i / 3] : 0;\r\n const i1 = indices[i];\r\n const i2 = indices[i + 1];\r\n const i3 = indices[i + 2];\r\n\r\n const p1 = i1 * 3;\r\n const p2 = i2 * 3;\r\n const p3 = i3 * 3;\r\n const uv1 = i1 * 2;\r\n const uv2 = i2 * 2;\r\n const uv3 = i3 * 2;\r\n\r\n const x1 = positions[p2] - positions[p1];\r\n const x2 = positions[p3] - positions[p1];\r\n const y1 = positions[p2 + 1] - positions[p1 + 1];\r\n const y2 = positions[p3 + 1] - positions[p1 + 1];\r\n const z1 = positions[p2 + 2] - positions[p1 + 2];\r\n const z2 = positions[p3 + 2] - positions[p1 + 2];\r\n\r\n const s1 = uvs[uv2] - uvs[uv1];\r\n const s2 = uvs[uv3] - uvs[uv1];\r\n const t1 = uvs[uv2 + 1] - uvs[uv1 + 1];\r\n const t2 = uvs[uv3 + 1] - uvs[uv1 + 1];\r\n const denominator = s1 * t2 - s2 * t1;\r\n if (Math.abs(denominator) < 1e-8) {\r\n continue;\r\n }\r\n\r\n const r = 1 / denominator;\r\n const sx = (t2 * x1 - t1 * x2) * r;\r\n const sy = (t2 * y1 - t1 * y2) * r;\r\n const sz = (t2 * z1 - t1 * z2) * r;\r\n const bx = (s1 * x2 - s2 * x1) * r;\r\n const by = (s1 * y2 - s2 * y1) * r;\r\n const bz = (s1 * z2 - s2 * z1) * r;\r\n\r\n accumulateTangentContribution(i1, i2, i3, sx, sy, sz, bx, by, bz, positions, normals, uvs, controlPointIndices, materialIndex, groups, vertexGroupKeys);\r\n accumulateTangentContribution(i2, i3, i1, sx, sy, sz, bx, by, bz, positions, normals, uvs, controlPointIndices, materialIndex, groups, vertexGroupKeys);\r\n accumulateTangentContribution(i3, i1, i2, sx, sy, sz, bx, by, bz, positions, normals, uvs, controlPointIndices, materialIndex, groups, vertexGroupKeys);\r\n }\r\n\r\n const tangents = new Float32Array(vertexCount * 4);\r\n for (let i = 0; i < vertexCount; i++) {\r\n const no = i * 3;\r\n const to = i * 4;\r\n const [nx, ny, nz] = normalizeVector(normals[no], normals[no + 1], normals[no + 2]);\r\n const group = vertexGroupKeys[i] ? groups.get(vertexGroupKeys[i]!) : undefined;\r\n const tx = group?.tx ?? 0;\r\n const ty = group?.ty ?? 0;\r\n const tz = group?.tz ?? 0;\r\n const normalDotTangent = nx * tx + ny * ty + nz * tz;\r\n\r\n let ox = tx - nx * normalDotTangent;\r\n let oy = ty - ny * normalDotTangent;\r\n let oz = tz - nz * normalDotTangent;\r\n const tangentLength = Math.hypot(ox, oy, oz);\r\n if (tangentLength > 1e-8) {\r\n ox /= tangentLength;\r\n oy /= tangentLength;\r\n oz /= tangentLength;\r\n } else {\r\n [ox, oy, oz] = buildFallbackTangent(nx, ny, nz);\r\n }\r\n\r\n const bx = group?.bx ?? 0;\r\n const by = group?.by ?? 0;\r\n const bz = group?.bz ?? 0;\r\n const cx = ny * oz - nz * oy;\r\n const cy = nz * ox - nx * oz;\r\n const cz = nx * oy - ny * ox;\r\n const bitangentLength = Math.hypot(bx, by, bz);\r\n const handedness = bitangentLength > 1e-8 && cx * bx + cy * by + cz * bz < 0 ? -1 : 1;\r\n\r\n tangents[to] = ox;\r\n tangents[to + 1] = oy;\r\n tangents[to + 2] = oz;\r\n tangents[to + 3] = handedness * normalMapTangentHandednessScale;\r\n }\r\n\r\n return tangents;\r\n}\r\n\r\ninterface TangentGroup {\r\n tx: number;\r\n ty: number;\r\n tz: number;\r\n bx: number;\r\n by: number;\r\n bz: number;\r\n}\r\n\r\nfunction accumulateTangentContribution(\r\n vertexIndex: number,\r\n nextIndex: number,\r\n prevIndex: number,\r\n tx: number,\r\n ty: number,\r\n tz: number,\r\n bx: number,\r\n by: number,\r\n bz: number,\r\n positions: ArrayLike<number>,\r\n normals: ArrayLike<number>,\r\n uvs: ArrayLike<number>,\r\n controlPointIndices: ArrayLike<number> | null,\r\n materialIndex: number,\r\n groups: Map<string, TangentGroup>,\r\n vertexGroupKeys: Array<string | null>\r\n): void {\r\n const weight = computeCornerAngle(positions, vertexIndex, nextIndex, prevIndex);\r\n if (weight <= 1e-8) {\r\n return;\r\n }\r\n\r\n const key = buildTangentGroupKey(vertexIndex, tx, ty, tz, bx, by, bz, positions, normals, uvs, controlPointIndices, materialIndex);\r\n let group = groups.get(key);\r\n if (!group) {\r\n group = { tx: 0, ty: 0, tz: 0, bx: 0, by: 0, bz: 0 };\r\n groups.set(key, group);\r\n }\r\n\r\n group.tx += tx * weight;\r\n group.ty += ty * weight;\r\n group.tz += tz * weight;\r\n group.bx += bx * weight;\r\n group.by += by * weight;\r\n group.bz += bz * weight;\r\n vertexGroupKeys[vertexIndex] ??= key;\r\n}\r\n\r\nfunction buildTangentGroupKey(\r\n vertexIndex: number,\r\n tx: number,\r\n ty: number,\r\n tz: number,\r\n bx: number,\r\n by: number,\r\n bz: number,\r\n positions: ArrayLike<number>,\r\n normals: ArrayLike<number>,\r\n uvs: ArrayLike<number>,\r\n controlPointIndices: ArrayLike<number> | null,\r\n materialIndex: number\r\n): string {\r\n const po = vertexIndex * 3;\r\n const no = vertexIndex * 3;\r\n const uo = vertexIndex * 2;\r\n const [nx, ny, nz] = normalizeVector(normals[no], normals[no + 1], normals[no + 2]);\r\n const handedness = computeTangentHandedness(nx, ny, nz, tx, ty, tz, bx, by, bz);\r\n const positionKey = controlPointIndices\r\n ? `cp:${controlPointIndices[vertexIndex]}`\r\n : `p:${quantizeTangentKey(positions[po])},${quantizeTangentKey(positions[po + 1])},${quantizeTangentKey(positions[po + 2])}`;\r\n return [\r\n positionKey,\r\n quantizeTangentKey(nx),\r\n quantizeTangentKey(ny),\r\n quantizeTangentKey(nz),\r\n quantizeTangentKey(uvs[uo]),\r\n quantizeTangentKey(uvs[uo + 1]),\r\n handedness,\r\n materialIndex,\r\n ].join(\"|\");\r\n}\r\n\r\nfunction computeTangentHandedness(nx: number, ny: number, nz: number, tx: number, ty: number, tz: number, bx: number, by: number, bz: number): 1 | -1 {\r\n const cx = ny * tz - nz * ty;\r\n const cy = nz * tx - nx * tz;\r\n const cz = nx * ty - ny * tx;\r\n return cx * bx + cy * by + cz * bz < 0 ? -1 : 1;\r\n}\r\n\r\nfunction computeCornerAngle(positions: ArrayLike<number>, vertexIndex: number, nextIndex: number, prevIndex: number): number {\r\n const vo = vertexIndex * 3;\r\n const no = nextIndex * 3;\r\n const po = prevIndex * 3;\r\n const ax = positions[no] - positions[vo];\r\n const ay = positions[no + 1] - positions[vo + 1];\r\n const az = positions[no + 2] - positions[vo + 2];\r\n const bx = positions[po] - positions[vo];\r\n const by = positions[po + 1] - positions[vo + 1];\r\n const bz = positions[po + 2] - positions[vo + 2];\r\n const aLength = Math.hypot(ax, ay, az);\r\n const bLength = Math.hypot(bx, by, bz);\r\n if (aLength <= 1e-8 || bLength <= 1e-8) {\r\n return 0;\r\n }\r\n const dot = (ax * bx + ay * by + az * bz) / (aLength * bLength);\r\n return Math.acos(Math.max(-1, Math.min(1, dot)));\r\n}\r\n\r\nfunction normalizeVector(x: number, y: number, z: number): [number, number, number] {\r\n const length = Math.hypot(x, y, z);\r\n return length > 1e-8 ? [x / length, y / length, z / length] : [0, 0, 1];\r\n}\r\n\r\nfunction quantizeTangentKey(value: number): number {\r\n const quantized = Math.round(value * 1e6);\r\n return Object.is(quantized, -0) ? 0 : quantized;\r\n}\r\n\r\nfunction buildFallbackTangent(nx: number, ny: number, nz: number): [number, number, number] {\r\n const ax = Math.abs(nx) < 0.9 ? 1 : 0;\r\n const ay = ax === 1 ? 0 : 1;\r\n const dot = nx * ax + ny * ay;\r\n let tx = ax - nx * dot;\r\n let ty = ay - ny * dot;\r\n let tz = -nz * dot;\r\n const length = Math.hypot(tx, ty, tz);\r\n if (length <= 1e-8) {\r\n return [1, 0, 0];\r\n }\r\n tx /= length;\r\n ty /= length;\r\n tz /= length;\r\n return [tx, ty, tz];\r\n}\r\n\r\nfunction buildMorphTargetData(\r\n shape: FBXShapeData,\r\n cpIndices: Uint32Array,\r\n basePositions: FloatArray,\r\n baseNormals: FloatArray | null,\r\n deltaMatrix: Matrix | null,\r\n normalMatrix: Matrix | null\r\n): { positions: Float32Array; normals: Float32Array | null } | null {\r\n const vertexCount = basePositions.length / 3;\r\n const targetPositions = new Float32Array(vertexCount * 3);\r\n const hasNormals = shape.normals !== null && baseNormals !== null;\r\n const targetNormals = hasNormals ? new Float32Array(vertexCount * 3) : null;\r\n\r\n for (let i = 0; i < targetPositions.length; i++) {\r\n targetPositions[i] = basePositions[i];\r\n }\r\n if (targetNormals && baseNormals) {\r\n for (let i = 0; i < targetNormals.length; i++) {\r\n targetNormals[i] = baseNormals[i];\r\n }\r\n }\r\n\r\n const cpToShapeIdx = new Map<number, number>();\r\n for (let i = 0; i < shape.indices.length; i++) {\r\n cpToShapeIdx.set(shape.indices[i], i);\r\n }\r\n\r\n for (let vi = 0; vi < vertexCount; vi++) {\r\n const cpIdx = cpIndices[vi];\r\n const shapeIdx = cpToShapeIdx.get(cpIdx);\r\n if (shapeIdx === undefined) {\r\n continue;\r\n }\r\n\r\n let dx = shape.vertices[shapeIdx * 3];\r\n let dy = shape.vertices[shapeIdx * 3 + 1];\r\n let dz = shape.vertices[shapeIdx * 3 + 2];\r\n\r\n if (deltaMatrix) {\r\n const rv = Vector3.TransformNormal(new Vector3(dx, dy, dz), deltaMatrix);\r\n dx = rv.x;\r\n dy = rv.y;\r\n dz = rv.z;\r\n }\r\n\r\n targetPositions[vi * 3] += dx;\r\n targetPositions[vi * 3 + 1] += dy;\r\n targetPositions[vi * 3 + 2] += dz;\r\n\r\n if (targetNormals && shape.normals) {\r\n let nx = shape.normals[shapeIdx * 3];\r\n let ny = shape.normals[shapeIdx * 3 + 1];\r\n let nz = shape.normals[shapeIdx * 3 + 2];\r\n if (normalMatrix) {\r\n const rn = Vector3.TransformNormal(new Vector3(nx, ny, nz), normalMatrix);\r\n if (rn.lengthSquared() > 0) {\r\n rn.normalize();\r\n }\r\n nx = rn.x;\r\n ny = rn.y;\r\n nz = rn.z;\r\n }\r\n targetNormals[vi * 3] += nx;\r\n targetNormals[vi * 3 + 1] += ny;\r\n targetNormals[vi * 3 + 2] += nz;\r\n }\r\n }\r\n\r\n return { positions: targetPositions, normals: targetNormals };\r\n}\r\n\r\nfunction calculateBlendShapeInfluences(deformPercent: number, fullWeights: number[] | null, shapeCount: number): number[] {\r\n if (shapeCount <= 0) {\r\n return [];\r\n }\r\n if (!fullWeights || fullWeights.length !== shapeCount || shapeCount === 1) {\r\n const denominator = fullWeights?.[0] && fullWeights[0] !== 0 ? fullWeights[0] : 100;\r\n return [clamp01(deformPercent / denominator)];\r\n }\r\n\r\n const influences = new Array<number>(shapeCount).fill(0);\r\n if (deformPercent <= fullWeights[0]) {\r\n influences[0] = fullWeights[0] === 0 ? (deformPercent <= 0 ? 1 : 0) : clamp01(deformPercent / fullWeights[0]);\r\n return influences;\r\n }\r\n\r\n for (let i = 1; i < fullWeights.length; i++) {\r\n const previousWeight = fullWeights[i - 1];\r\n const nextWeight = fullWeights[i];\r\n if (deformPercent > nextWeight) {\r\n continue;\r\n }\r\n\r\n const range = nextWeight - previousWeight;\r\n if (Math.abs(range) < 1e-6) {\r\n influences[i] = 1;\r\n return influences;\r\n }\r\n\r\n const t = clamp01((deformPercent - previousWeight) / range);\r\n influences[i - 1] = 1 - t;\r\n influences[i] = t;\r\n return influences;\r\n }\r\n\r\n influences[shapeCount - 1] = 1;\r\n return influences;\r\n}\r\n\r\nfunction clamp01(value: number): number {\r\n return Math.max(0, Math.min(1, value));\r\n}\r\n\r\nfunction collectAnimationSampleTimes(curveNodes: FBXCurveNodeData[], fps: number, startTime: number, stopTime: number): number[] {\r\n let minTime = Number.POSITIVE_INFINITY;\r\n let maxTime = Number.NEGATIVE_INFINITY;\r\n const sourceTimes = new Set<number>();\r\n\r\n for (const curveNode of curveNodes) {\r\n for (const curve of curveNode.curves) {\r\n for (const key of curve.keys) {\r\n minTime = Math.min(minTime, key.time);\r\n maxTime = Math.max(maxTime, key.time);\r\n if (key.time >= startTime && key.time <= stopTime) {\r\n sourceTimes.add(key.time);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!Number.isFinite(minTime) || !Number.isFinite(maxTime)) {\r\n return [];\r\n }\r\n\r\n const rangeStart = stopTime > startTime ? startTime : minTime;\r\n const rangeStop = stopTime > startTime ? stopTime : maxTime;\r\n const times = new Set<number>([rangeStart, rangeStop, ...Array.from(sourceTimes)]);\r\n const startFrame = Math.ceil(rangeStart * fps);\r\n const stopFrame = Math.floor(rangeStop * fps);\r\n\r\n for (let frame = startFrame; frame <= stopFrame; frame++) {\r\n times.add(frame / fps);\r\n }\r\n\r\n return Array.from(times).sort((a, b) => a - b);\r\n}\r\n\r\nfunction areQuaternionKeysConstant(keys: { frame: number; value: Quaternion }[]): boolean {\r\n if (keys.length < 2) {\r\n return true;\r\n }\r\n const first = keys[0].value;\r\n for (let i = 1; i < keys.length; i++) {\r\n const value = keys[i].value;\r\n if (Math.abs(value.x - first.x) > 0.0001 || Math.abs(value.y - first.y) > 0.0001 || Math.abs(value.z - first.z) > 0.0001 || Math.abs(value.w - first.w) > 0.0001) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nRegisterSceneLoaderPlugin(new FBXFileLoader());\r\n\r\nfunction buildScalarAnimationKeys(curve: FBXCurveData, fps: number, startTime: number, stopTime: number, mapValue: (value: number) => number): IAnimationKey[] {\r\n const range = getCurveSampleRange(curve, startTime, stopTime);\r\n const keys = curve.keys\r\n .filter((key) => key.time >= range.start && key.time <= range.stop)\r\n .map((key) => ({\r\n source: key,\r\n frame: key.time * fps,\r\n value: mapValue(key.value),\r\n }));\r\n\r\n if (!keys.some((key) => Math.abs(key.source.time - range.start) < 1e-6)) {\r\n keys.unshift({\r\n source: {\r\n time: range.start,\r\n value: sampleFBXCurveAtTime(curve, range.start) ?? 0,\r\n interpolation: \"linear\",\r\n },\r\n frame: range.start * fps,\r\n value: mapValue(sampleFBXCurveAtTime(curve, range.start) ?? 0),\r\n });\r\n }\r\n\r\n if (!keys.some((key) => Math.abs(key.source.time - range.stop) < 1e-6)) {\r\n keys.push({\r\n source: {\r\n time: range.stop,\r\n value: sampleFBXCurveAtTime(curve, range.stop) ?? 0,\r\n interpolation: \"linear\",\r\n },\r\n frame: range.stop * fps,\r\n value: mapValue(sampleFBXCurveAtTime(curve, range.stop) ?? 0),\r\n });\r\n }\r\n\r\n const animationKeys: IAnimationKey[] = keys.map((key) => ({\r\n frame: key.frame,\r\n value: key.value,\r\n }));\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i].source;\r\n const nextAnimationKey = animationKeys[i + 1];\r\n\r\n if (key.interpolation === \"constant\") {\r\n animationKeys[i].interpolation = AnimationKeyInterpolation.STEP;\r\n continue;\r\n }\r\n\r\n if (key.interpolation !== \"cubic\") {\r\n continue;\r\n }\r\n\r\n const nextKey = keys[i + 1].source;\r\n const duration = Math.max(nextKey.time - key.time, 1e-6);\r\n const linearSlope = (nextKey.value - key.value) / duration;\r\n animationKeys[i].outTangent = mapSlope(key.rightSlope ?? linearSlope, mapValue) / fps;\r\n nextAnimationKey.inTangent = mapSlope(key.nextLeftSlope ?? linearSlope, mapValue) / fps;\r\n }\r\n\r\n return animationKeys;\r\n}\r\n\r\nfunction mapSlope(slope: number, mapValue: (value: number) => number): number {\r\n return mapValue(slope) - mapValue(0);\r\n}\r\n\r\nfunction getCurveSampleRange(curve: FBXCurveData, startTime: number, stopTime: number): { start: number; stop: number } {\r\n if (stopTime > startTime) {\r\n return { start: startTime, stop: stopTime };\r\n }\r\n\r\n return {\r\n start: curve.keys[0]?.time ?? 0,\r\n stop: curve.keys[curve.keys.length - 1]?.time ?? 0,\r\n };\r\n}\r\n"]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Defines the FBX loader plugin metadata.
3
+ */
4
+ export declare const FBXFileLoaderMetadata: {
5
+ readonly name: "fbx";
6
+ readonly extensions: {
7
+ readonly ".fbx": {
8
+ readonly isBinary: true;
9
+ };
10
+ };
11
+ };