@babylonjs/loaders 9.25.0 → 9.26.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 (106) hide show
  1. package/FBX/fbxConstraintBehavior.d.ts +188 -0
  2. package/FBX/fbxConstraintBehavior.js +532 -0
  3. package/FBX/fbxConstraintBehavior.js.map +1 -0
  4. package/FBX/fbxFileLoader.pure.d.ts +175 -6
  5. package/FBX/fbxFileLoader.pure.js +1521 -286
  6. package/FBX/fbxFileLoader.pure.js.map +1 -1
  7. package/FBX/index.d.ts +4 -1
  8. package/FBX/index.js +1 -0
  9. package/FBX/index.js.map +1 -1
  10. package/FBX/interpreter/animation.d.ts +73 -33
  11. package/FBX/interpreter/animation.js +620 -223
  12. package/FBX/interpreter/animation.js.map +1 -1
  13. package/FBX/interpreter/animationCurve.d.ts +91 -0
  14. package/FBX/interpreter/animationCurve.js +623 -0
  15. package/FBX/interpreter/animationCurve.js.map +1 -0
  16. package/FBX/interpreter/blendShapes.js +9 -18
  17. package/FBX/interpreter/blendShapes.js.map +1 -1
  18. package/FBX/interpreter/connections.d.ts +1 -1
  19. package/FBX/interpreter/connections.js +173 -34
  20. package/FBX/interpreter/connections.js.map +1 -1
  21. package/FBX/interpreter/constraints.d.ts +68 -0
  22. package/FBX/interpreter/constraints.js +143 -0
  23. package/FBX/interpreter/constraints.js.map +1 -0
  24. package/FBX/interpreter/fbxInterpreter.d.ts +89 -4
  25. package/FBX/interpreter/fbxInterpreter.js +474 -122
  26. package/FBX/interpreter/fbxInterpreter.js.map +1 -1
  27. package/FBX/interpreter/geometry.d.ts +1 -1
  28. package/FBX/interpreter/geometry.js +150 -92
  29. package/FBX/interpreter/geometry.js.map +1 -1
  30. package/FBX/interpreter/legacyDocument.d.ts +11 -0
  31. package/FBX/interpreter/legacyDocument.js +425 -0
  32. package/FBX/interpreter/legacyDocument.js.map +1 -0
  33. package/FBX/interpreter/materialModel.d.ts +71 -0
  34. package/FBX/interpreter/materialModel.js +622 -0
  35. package/FBX/interpreter/materialModel.js.map +1 -0
  36. package/FBX/interpreter/materials.d.ts +13 -1
  37. package/FBX/interpreter/materials.js +88 -5
  38. package/FBX/interpreter/materials.js.map +1 -1
  39. package/FBX/interpreter/nodeTransform.d.ts +32 -0
  40. package/FBX/interpreter/nodeTransform.js +54 -0
  41. package/FBX/interpreter/nodeTransform.js.map +1 -0
  42. package/FBX/interpreter/nurbs.d.ts +99 -0
  43. package/FBX/interpreter/nurbs.js +627 -0
  44. package/FBX/interpreter/nurbs.js.map +1 -0
  45. package/FBX/interpreter/propertyTemplates.d.ts +23 -0
  46. package/FBX/interpreter/propertyTemplates.js +109 -2
  47. package/FBX/interpreter/propertyTemplates.js.map +1 -1
  48. package/FBX/interpreter/rig.js +16 -0
  49. package/FBX/interpreter/rig.js.map +1 -1
  50. package/FBX/interpreter/sceneDiagnostics.js +28 -3
  51. package/FBX/interpreter/sceneDiagnostics.js.map +1 -1
  52. package/FBX/interpreter/skeleton.d.ts +4 -18
  53. package/FBX/interpreter/skeleton.js +16 -94
  54. package/FBX/interpreter/skeleton.js.map +1 -1
  55. package/FBX/parsers/fbxAsciiParser.js +119 -9
  56. package/FBX/parsers/fbxAsciiParser.js.map +1 -1
  57. package/FBX/parsers/fbxBinaryParser.js +74 -22
  58. package/FBX/parsers/fbxBinaryParser.js.map +1 -1
  59. package/FBX/pure.d.ts +1 -0
  60. package/FBX/pure.js +1 -0
  61. package/FBX/pure.js.map +1 -1
  62. package/FBX/types/fbxTypes.d.ts +18 -2
  63. package/FBX/types/fbxTypes.js +40 -12
  64. package/FBX/types/fbxTypes.js.map +1 -1
  65. package/SPLAT/gaussianSplattingStream.d.ts +31 -0
  66. package/SPLAT/gaussianSplattingStream.js +49 -0
  67. package/SPLAT/gaussianSplattingStream.js.map +1 -1
  68. package/USD/index.d.ts +2 -0
  69. package/USD/index.js +4 -0
  70. package/USD/index.js.map +1 -0
  71. package/USD/pure.d.ts +3 -0
  72. package/USD/pure.js +5 -0
  73. package/USD/pure.js.map +1 -0
  74. package/USD/usdCommandProtocol.d.ts +83 -0
  75. package/USD/usdCommandProtocol.js +173 -0
  76. package/USD/usdCommandProtocol.js.map +1 -0
  77. package/USD/usdFileLoader.d.ts +6 -0
  78. package/USD/usdFileLoader.js +9 -0
  79. package/USD/usdFileLoader.js.map +1 -0
  80. package/USD/usdFileLoader.metadata.d.ts +20 -0
  81. package/USD/usdFileLoader.metadata.js +18 -0
  82. package/USD/usdFileLoader.metadata.js.map +1 -0
  83. package/USD/usdFileLoader.pure.d.ts +102 -0
  84. package/USD/usdFileLoader.pure.js +341 -0
  85. package/USD/usdFileLoader.pure.js.map +1 -0
  86. package/USD/usdFileLoader.types.d.ts +11 -0
  87. package/USD/usdFileLoader.types.js +2 -0
  88. package/USD/usdFileLoader.types.js.map +1 -0
  89. package/USD/usdLoadingOptions.d.ts +123 -0
  90. package/USD/usdLoadingOptions.js +3 -0
  91. package/USD/usdLoadingOptions.js.map +1 -0
  92. package/USD/usdSceneMaterializer.d.ts +9 -0
  93. package/USD/usdSceneMaterializer.js +982 -0
  94. package/USD/usdSceneMaterializer.js.map +1 -0
  95. package/USD/usdWorkerMessages.d.ts +57 -0
  96. package/USD/usdWorkerMessages.js +3 -0
  97. package/USD/usdWorkerMessages.js.map +1 -0
  98. package/dynamic.js +10 -0
  99. package/dynamic.js.map +1 -1
  100. package/index.d.ts +1 -0
  101. package/index.js +1 -0
  102. package/index.js.map +1 -1
  103. package/package.json +4 -3
  104. package/pure.d.ts +1 -0
  105. package/pure.js +1 -0
  106. package/pure.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"fbxFileLoader.pure.js","sourceRoot":"","sources":["../../../../dev/loaders/src/FBX/fbxFileLoader.pure.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.pure\";\r\nimport { SubMesh } from \"core/Meshes/subMesh\";\r\nimport { VertexData } from \"core/Meshes/mesh.vertexData\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial.pure\";\r\nimport { Material } from \"core/Materials/material\";\r\nimport { MultiMaterial } from \"core/Materials/multiMaterial.pure\";\r\nimport { type ITextureCreationOptions, Texture } from \"core/Materials/Textures/texture.pure\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Color3 } from \"core/Maths/math.color.pure\";\r\nimport { Vector3, Quaternion, Matrix } from \"core/Maths/math.vector.pure\";\r\nimport { TransformNode } from \"core/Meshes/transformNode.pure\";\r\nimport { Skeleton } from \"core/Bones/skeleton\";\r\nimport { Bone } from \"core/Bones/bone\";\r\nimport { Animation } from \"core/Animations/animation.pure\";\r\nimport { AnimationGroup } from \"core/Animations/animationGroup.pure\";\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.pure\";\r\nimport { FreeCamera } from \"core/Cameras/freeCamera.pure\";\r\nimport { PointLight } from \"core/Lights/pointLight.pure\";\r\nimport { DirectionalLight } from \"core/Lights/directionalLight.pure\";\r\nimport { SpotLight } from \"core/Lights/spotLight.pure\";\r\nimport { AssetContainer } from \"core/assetContainer\";\r\nimport { GetMimeType } from \"core/Misc/fileTools.pure\";\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\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 this._linkSkeletonsToTransformNodes(fbxScene.rigs, skeletonByRigId, modelIdToNode, transformNodes, scene);\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 skinnedMesh = meshes.find((m) => m.skeleton === skeleton) ?? null;\r\n const boneReferenceNode = skinnedMesh ?? rootNode;\r\n const boneTransformNodes = new Set<TransformNode>();\r\n for (const skeletonBone of skeleton.bones) {\r\n const transformNode = skeletonBone.getTransformNode();\r\n if (transformNode) {\r\n boneTransformNodes.add(transformNode);\r\n }\r\n }\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 if (!boneTransformNodes.has(childTransform)) {\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 _linkSkeletonsToTransformNodes(\r\n rigs: FBXRigData[],\r\n skeletonByRigId: Map<string, Skeleton>,\r\n modelIdToNode: Map<number, TransformNode>,\r\n transformNodes: TransformNode[],\r\n scene: Scene\r\n ): void {\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 const boneNode = modelIdToNode.get(boneData.modelId);\r\n if (!bone || !boneNode) {\r\n continue;\r\n }\r\n\r\n const scaleCompensationHelper = this._getScaleCompensationHelper(skeleton, boneData.index);\r\n if (scaleCompensationHelper) {\r\n const helperNode = new TransformNode(scaleCompensationHelper.name, scene);\r\n helperNode.parent = boneNode.parent;\r\n boneNode.parent = helperNode;\r\n FBXFileLoader._applyMatrixToTransform(helperNode, scaleCompensationHelper.getLocalMatrix());\r\n FBXFileLoader._applyMatrixToTransform(boneNode, bone.getLocalMatrix());\r\n scaleCompensationHelper.linkTransformNode(helperNode);\r\n transformNodes.push(helperNode);\r\n } else {\r\n FBXFileLoader._applyMatrixToTransform(boneNode, bone.getLocalMatrix());\r\n }\r\n\r\n bone.linkTransformNode(boneNode);\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 const animatedBoneTargetProperties = new Map<Bone | TransformNode, Set<string>>();\r\n const addBoneAnimation = (animation: Animation, bone: Bone): void => {\r\n const target = bone.getTransformNode() ?? bone;\r\n let targetProperties = animatedBoneTargetProperties.get(target);\r\n if (!targetProperties) {\r\n targetProperties = new Set<string>();\r\n animatedBoneTargetProperties.set(target, targetProperties);\r\n } else if (targetProperties.has(animation.targetProperty)) {\r\n return;\r\n }\r\n\r\n targetProperties.add(animation.targetProperty);\r\n animGroup.addTargetedAnimation(animation, target);\r\n };\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 addBoneAnimation(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 addBoneAnimation(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\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\r\nlet _Registered = false;\r\n/**\r\n * Registers the FBXFileLoader scene loader plugin.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterFBXFileLoader(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterSceneLoaderPlugin(new FBXFileLoader());\r\n}\r\n"]}
1
+ {"version":3,"file":"fbxFileLoader.pure.js","sourceRoot":"","sources":["../../../../dev/loaders/src/FBX/fbxFileLoader.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\nimport {\n type ISceneLoaderPluginAsync,\n type ISceneLoaderPluginFactory,\n type ISceneLoaderAsyncResult,\n type ISceneLoaderProgressEvent,\n type SceneLoaderPluginOptions,\n RegisterSceneLoaderPlugin,\n} from \"core/Loading/sceneLoader\";\nimport { type Scene } from \"core/scene\";\nimport { type FloatArray, type Nullable } from \"core/types\";\nimport { Mesh } from \"core/Meshes/mesh.pure\";\nimport { LinesMesh } from \"core/Meshes/linesMesh.pure\";\nimport { SubMesh } from \"core/Meshes/subMesh\";\nimport { VertexData } from \"core/Meshes/mesh.vertexData\";\nimport { StandardMaterial } from \"core/Materials/standardMaterial.pure\";\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial.pure\";\nimport { Material } from \"core/Materials/material\";\nimport { MultiMaterial } from \"core/Materials/multiMaterial.pure\";\nimport { type ITextureCreationOptions, Texture } from \"core/Materials/Textures/texture.pure\";\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\nimport { Color3 } from \"core/Maths/math.color.pure\";\nimport { Vector3, Quaternion, Matrix } from \"core/Maths/math.vector.pure\";\nimport { TransformNode } from \"core/Meshes/transformNode.pure\";\nimport { Skeleton } from \"core/Bones/skeleton\";\nimport { Bone } from \"core/Bones/bone\";\nimport { Animation } from \"core/Animations/animation.pure\";\nimport { AnimationGroup } from \"core/Animations/animationGroup.pure\";\nimport { AnimationKeyInterpolation, type IAnimationKey } from \"core/Animations/animationKey\";\nimport { MorphTarget } from \"core/Morph/morphTarget\";\nimport { MorphTargetManager } from \"core/Morph/morphTargetManager\";\nimport { Camera } from \"core/Cameras/camera.pure\";\nimport { FreeCamera } from \"core/Cameras/freeCamera.pure\";\nimport { PointLight } from \"core/Lights/pointLight.pure\";\nimport { DirectionalLight } from \"core/Lights/directionalLight.pure\";\nimport { SpotLight } from \"core/Lights/spotLight.pure\";\nimport { type Light } from \"core/Lights/light\";\nimport { AssetContainer } from \"core/assetContainer\";\nimport { GetMimeType } from \"core/Misc/fileTools.pure\";\n\nimport { parseBinaryFBX } from \"./parsers/fbxBinaryParser\";\nimport { parseAsciiFBX } from \"./parsers/fbxAsciiParser\";\nimport { interpretFBX, type FBXModelData, type FBXSceneData, type FBXCameraData, type FBXLightData } from \"./interpreter/fbxInterpreter\";\nimport { type FBXDocument } from \"./types/fbxTypes\";\nimport { type FBXGeometryData } from \"./interpreter/geometry\";\nimport { type FBXCurveGeometryData } from \"./interpreter/nurbs\";\nimport { FBXConstraintBehavior, type FBXConstraintBehaviorTarget } from \"./fbxConstraintBehavior\";\nimport { type FBXMaterialData, type FBXTextureRef } from \"./interpreter/materials\";\nimport { isPbrShaderType, mapColor, mapScalar } from \"./interpreter/materialModel\";\nimport { type FBXSkinData, type FBXBoneData } from \"./interpreter/skeleton\";\nimport { type FBXRigData, type FBXSkinBindingData } from \"./interpreter/rig\";\nimport { type FBXBlendShapeData, type FBXShapeData } from \"./interpreter/blendShapes\";\nimport {\n evaluateLayeredChannel,\n evaluateLayeredProperty,\n isChannelSteppedAt,\n sampleFBXCurveAtTime,\n type FBXAnimationLayerData,\n type FBXAnimationStackData,\n type FBXCurveData,\n type FBXCurveNodeData,\n type FBXLayeredPropertySource,\n type FBXUnsupportedCurveNodeData,\n} from \"./interpreter/animation\";\nimport {\n computeFBXGeometricDeltaMatrix,\n computeFBXGeometricMatrix,\n computeFBXGeometricNormalMatrix,\n computeFBXLocalMatrix,\n eulerToMatrix,\n eulerToMatrixXYZ,\n} from \"./interpreter/transform\";\nimport { FBXFileLoaderMetadata } from \"./fbxFileLoader.metadata\";\n\nconst FBX_ASCII_MAGIC = \"; FBX\";\nconst FBX_BINARY_MAGIC = \"Kaydara FBX Binary\";\nconst BIND_REST_SCALE_RATIO_THRESHOLD = 10;\n\n/**\n * Source convention for tangent-space normal maps loaded from FBX normal-map slots.\n */\nexport type FBXNormalMapCoordinateSystem = \"y-up\" | \"y-down\";\n\n/**\n * Defines options for the FBX loader.\n */\nexport interface FBXFileLoaderOptions {\n /**\n * Bundle of defaults for the options that change what the loaded scene looks like.\n * - \"compatible\" (default): the behaviour of the loader as first shipped: StandardMaterial for every material,\n * one Babylon geometry per model, curve geometry skipped, constraints recorded as metadata only, clips rebased\n * to start at frame 0, cameras and lights placed in world space.\n * - \"full\": everything the loader can do: PBRMaterial for physically based shaders, geometry shared between\n * instances, curves as lines meshes, constraints solved at runtime, authored clip times, cameras and lights\n * parented to their nodes so they animate.\n * An option set explicitly always wins over the preset.\n */\n preset?: \"compatible\" | \"full\";\n /**\n * Source convention for tangent-space normal maps connected through FBX normal-map slots.\n * FBX does not standardize this convention, so the loader defaults to the glTF/USD-style Y-up convention.\n * Set to \"y-down\" for assets authored with inverted green/Y normal maps.\n */\n normalMapCoordinateSystem?: FBXNormalMapCoordinateSystem;\n /**\n * Which Babylon material to build.\n * - \"standard\" (default, \"full\" preset: \"auto\"): always StandardMaterial (PBR parameters are approximated).\n * - \"auto\": PBRMaterial for physically based FBX materials (Standard Surface, Arnold, 3ds Max Physical,\n * 3ds Max PBR, glTF, OpenPBR, Stingray PBS) and StandardMaterial for classic Lambert/Phong materials.\n * - \"pbr\": always PBRMaterial (Lambert/Phong parameters are converted).\n */\n materials?: \"auto\" | \"standard\" | \"pbr\";\n /**\n * Unit conversion applied at the root of the loaded hierarchy.\n * - \"preserve\" (default): keep the file's units (1 Babylon unit = 1 FBX unit).\n * - \"meters\": scale so that 1 Babylon unit is 1 meter, using the file's UnitScaleFactor.\n * - a number: centimeters per Babylon unit (100 = meters, 1 = centimeters, 2.54 = inches).\n */\n unitScale?: \"preserve\" | \"meters\" | number;\n /**\n * Share vertex data between models that reference the same FBX geometry (default false, \"full\" preset: true).\n * Skinned meshes are never shared.\n */\n shareGeometry?: boolean;\n /**\n * Called for every recoverable issue found while loading (unsupported features, malformed data that was\n * skipped, approximations). The same list is stored on the root node's metadata as `fbxDiagnostics`.\n */\n onWarning?: (warning: FBXLoaderWarning) => void;\n /**\n * Segments per knot span when tessellating NURBS surfaces. Zero or undefined uses the subdivision stored in\n * the file (usually 4), capped at 16.\n */\n nurbsSubdivision?: number;\n /** How curve geometry (Line, NurbsCurve) is imported: skipped (default) or as lines meshes (\"full\" preset). */\n curves?: \"lines\" | \"skip\";\n /**\n * Constraints (aim, parent, position, rotation, scale): \"metadata\" (default) only records them on the nodes,\n * \"apply\" (\"full\" preset) attaches an `FBXConstraintBehavior` to each constrained node so it is solved before\n * every render. IK chains are always metadata only.\n */\n constraints?: \"apply\" | \"metadata\";\n /**\n * Shift every clip so its first keyframe sits at frame 0 (default true). With false (\"full\" preset) keys keep\n * the times authored in the file, so clips of one file stay aligned with each other and with their declared\n * ranges.\n */\n rebaseAnimations?: boolean;\n /**\n * Parent cameras and lights to their FBX node so they follow its animation (default false, \"full\" preset:\n * true). Otherwise they are created at the node's world position and orientation, unparented.\n */\n attachCamerasAndLights?: boolean;\n}\n\n/** A recoverable issue reported while loading an FBX file. */\nexport interface FBXLoaderWarning {\n /** Which part of the loader reported the issue */\n source: \"scene\" | \"model\" | \"geometry\" | \"skin\" | \"rig\" | \"animation\" | \"blendShape\" | \"camera\" | \"light\";\n /** Human readable description */\n message: string;\n /** Name of the affected object, when known */\n objectName?: string;\n /** Structured details from the interpreter, when any */\n details?: unknown;\n}\n\ninterface IFBXSceneLoaderAsyncResult extends ISceneLoaderAsyncResult {\n materials: Material[];\n textures: BaseTexture[];\n cameras: Camera[];\n}\n\n/**\n * FBX file loader plugin for Babylon.js.\n * Pure TypeScript implementation — no Autodesk FBX SDK dependency.\n */\nexport class FBXFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPluginFactory {\n /**\n * Defines the name of the plugin.\n */\n public readonly name = FBXFileLoaderMetadata.name;\n\n /**\n * Defines the extension the plugin is able to load.\n */\n public readonly extensions = FBXFileLoaderMetadata.extensions;\n\n private readonly _options: Required<FBXFileLoaderOptions>;\n private readonly _bindRestBones = new WeakSet<Bone>();\n private readonly _sourceBonesBySkeleton = new WeakMap<Skeleton, Bone[]>();\n private readonly _scaleCompensationHelpersBySkeleton = new WeakMap<Skeleton, Map<number, Bone>>();\n /** Frame rate of the file being loaded (GlobalSettings TimeMode); animation is baked at this rate. */\n private _frameRate = 30;\n /** Layers of the animation stack currently being converted; used by the transform samplers. */\n private _activeLayers: readonly FBXAnimationLayerData[] = [];\n /** Parent model per model id, for inherit-mode aware sampling. */\n private _parentModelById = new Map<number, FBXModelData>();\n /** Curve nodes per model id for the stack currently being converted. */\n private _curveNodesByModelId = new Map<number, FBXCurveNodeData[]>();\n /** Helper nodes inserted above models whose InheritType is not RSrs. */\n private _inheritScaleHelpers = new Map<number, TransformNode>();\n /** First mesh built per (geometry, geometric transform), for geometry sharing between instances. */\n private _meshByGeometryKey = new Map<string, Mesh>();\n /** Instance mesh -> source mesh whose geometry it shares. */\n private _instanceSource = new Map<Mesh, Mesh>();\n /** Property curve nodes that were mapped onto Babylon animations; their \"not evaluated\" diagnostics are dropped. */\n private _evaluatedCurveNodeIds = new Set<number>();\n\n /**\n * Creates a new FBX loader.\n * @param options - Options controlling FBX loading behavior\n */\n public constructor(options: FBXFileLoaderOptions = {}) {\n const full = options.preset === \"full\";\n this._options = {\n preset: full ? \"full\" : \"compatible\",\n normalMapCoordinateSystem: options.normalMapCoordinateSystem ?? \"y-up\",\n materials: options.materials ?? (full ? \"auto\" : \"standard\"),\n unitScale: options.unitScale ?? \"preserve\",\n shareGeometry: options.shareGeometry ?? full,\n onWarning: options.onWarning ?? (() => {}),\n nurbsSubdivision: options.nurbsSubdivision ?? 0,\n curves: options.curves ?? (full ? \"lines\" : \"skip\"),\n constraints: options.constraints ?? (full ? \"apply\" : \"metadata\"),\n rebaseAnimations: options.rebaseAnimations ?? !full,\n attachCamerasAndLights: options.attachCamerasAndLights ?? full,\n };\n }\n\n /**\n * Creates an FBX loader plugin instance with options from SceneLoader.\n * @param options - Scene loader plugin options\n * @returns The configured FBX loader\n */\n public createPlugin(options: SceneLoaderPluginOptions): ISceneLoaderPluginAsync {\n return new FBXFileLoader(options[FBXFileLoaderMetadata.name]);\n }\n\n /**\n * Imports meshes from an FBX file and adds them to the scene.\n * @param meshesNames - A string or array of mesh names to import, or null/undefined to import all meshes\n * @param scene - The scene to add imported meshes to\n * @param data - The FBX data to load\n * @param rootUrl - Root URL used to resolve external resources\n * @param _onProgress - Callback called while the file is loading\n * @param _fileName - Name of the file being loaded\n * @returns A promise containing the loaded meshes, particle systems, skeletons, animation groups, transform nodes, geometries, and lights\n */\n public async importMeshAsync(\n meshesNames: string | readonly string[] | null | undefined,\n scene: Scene,\n data: unknown,\n rootUrl: string,\n _onProgress?: (event: ISceneLoaderProgressEvent) => void,\n _fileName?: string\n ): Promise<ISceneLoaderAsyncResult> {\n const fbxScene = this._parseAndInterpret(data);\n const result = this._buildScene(fbxScene, scene, rootUrl, meshesNames);\n return result;\n }\n\n /**\n * Loads all FBX content into the scene.\n * @param scene - The scene to load the FBX content into\n * @param data - The FBX data to load\n * @param rootUrl - Root URL used to resolve external resources\n * @param _onProgress - Callback called while the file is loading\n * @param _fileName - Name of the file being loaded\n * @returns A promise that resolves when loading is complete\n */\n public async loadAsync(scene: Scene, data: unknown, rootUrl: string, _onProgress?: (event: ISceneLoaderProgressEvent) => void, _fileName?: string): Promise<void> {\n const fbxScene = this._parseAndInterpret(data);\n this._buildScene(fbxScene, scene, rootUrl, null);\n }\n\n /**\n * Loads all FBX content into an asset container.\n * @param scene - The scene used to create the asset container\n * @param data - The FBX data to load\n * @param rootUrl - Root URL used to resolve external resources\n * @param _onProgress - Callback called while the file is loading\n * @param _fileName - Name of the file being loaded\n * @returns A promise containing the loaded asset container\n */\n public async loadAssetContainerAsync(\n scene: Scene,\n data: unknown,\n rootUrl: string,\n _onProgress?: (event: ISceneLoaderProgressEvent) => void,\n _fileName?: string\n ): Promise<AssetContainer> {\n const fbxScene = this._parseAndInterpret(data);\n\n const container = new AssetContainer(scene);\n\n // Build the scene into a temporary holder, then move results to container\n const result = this._buildScene(fbxScene, scene, rootUrl, null);\n\n for (const mesh of result.meshes) {\n container.meshes.push(mesh);\n }\n for (const skeleton of result.skeletons) {\n container.skeletons.push(skeleton);\n }\n for (const ag of result.animationGroups) {\n container.animationGroups.push(ag);\n }\n for (const tn of result.transformNodes) {\n container.transformNodes.push(tn);\n }\n for (const light of result.lights) {\n container.lights.push(light);\n }\n for (const camera of result.cameras) {\n container.cameras.push(camera);\n }\n for (const material of result.materials) {\n this._addMaterialToContainer(material, container);\n }\n for (const texture of result.textures) {\n this._addTextureToContainer(texture, container);\n }\n for (const mesh of result.meshes) {\n // Lines meshes own an internal colour shader; it is not an asset of the file.\n if (mesh instanceof LinesMesh) {\n continue;\n }\n this._addMaterialToContainer(mesh.material, container);\n }\n\n // Remove all added objects from the scene (container owns them)\n this._setAssetContainer(container);\n container.removeAllFromScene();\n\n return container;\n }\n\n // ── Parsing ────────────────────────────────────────────────────────────\n\n /**\n * Parses and interprets the file. Parsing is synchronous, so no progress events are emitted: the scene loader's\n * progress callback reports download bytes and must not be fed synthetic counts.\n */\n private _parseAndInterpret(data: unknown): FBXSceneData {\n const doc = this._parse(data);\n return interpretFBX(doc, {\n nurbsSubdivision: this._options.nurbsSubdivision > 0 ? this._options.nurbsSubdivision : undefined,\n rebaseKeyframes: this._options.rebaseAnimations,\n });\n }\n\n private _parse(data: unknown): FBXDocument {\n if (data instanceof ArrayBuffer) {\n return this._parseFromArrayBuffer(data);\n }\n if (ArrayBuffer.isView(data)) {\n const view = data as ArrayBufferView;\n const buffer = view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength) as ArrayBuffer;\n return this._parseFromArrayBuffer(buffer);\n }\n if (typeof data === \"string\") {\n return parseAsciiFBX(data);\n }\n throw new Error(\"FBXFileLoader: unsupported data type\");\n }\n\n private _parseFromArrayBuffer(buffer: ArrayBuffer): FBXDocument {\n // Check magic bytes to determine binary vs ASCII\n const headerBytes = new Uint8Array(buffer, 0, Math.min(21, buffer.byteLength));\n const header = String.fromCharCode(...headerBytes);\n\n if (header.startsWith(FBX_BINARY_MAGIC)) {\n return parseBinaryFBX(buffer);\n }\n\n // Try ASCII. Most files start with \"; FBX x.y.z project file\", but the header comment is optional:\n // some exporters start straight at FBXHeaderExtension or even at Objects.\n const text = new TextDecoder(\"utf-8\").decode(buffer);\n const head = text.substring(0, 4096);\n if (head.trimStart().startsWith(FBX_ASCII_MAGIC) || /^\\s*(?:;[^\\n]*\\n\\s*)*(?:FBXHeaderExtension|Definitions|Objects|Connections)\\s*:/.test(head)) {\n return parseAsciiFBX(text);\n }\n\n throw new Error(\"FBXFileLoader: unrecognized FBX format\");\n }\n\n // ── Scene Building ─────────────────────────────────────────────────────\n\n private _buildScene(fbxScene: FBXSceneData, scene: Scene, rootUrl: string, meshesNames: string | readonly string[] | null | undefined): IFBXSceneLoaderAsyncResult {\n const nameFilter = this._buildNameFilter(meshesNames);\n this._frameRate = fbxScene.frameRate > 0 ? fbxScene.frameRate : 30;\n this._inheritScaleHelpers = new Map();\n\n // Create materials\n const materialCache = new Map<number, Material>();\n for (const matData of fbxScene.materials) {\n const material = this._createMaterial(matData, scene, rootUrl);\n materialCache.set(matData.id, material);\n }\n\n // Create one Babylon skeleton per resolved deformation rig.\n const skeletons: Skeleton[] = [];\n const skeletonByRigId = new Map<string, Skeleton>();\n const skeletonByGeometryId = new Map<number, Skeleton>();\n const skinByGeometryId = new Map<number, FBXSkinData>();\n const skinBindingByGeometryId = new Map<number, FBXSkinBindingData>();\n const skinById = new Map<number, FBXSkinData>();\n\n for (const skin of fbxScene.skins) {\n skinById.set(skin.id, skin);\n }\n\n this._rigBoneModelIds = new Set();\n for (const rig of fbxScene.rigs) {\n for (const bone of rig.bones) {\n this._rigBoneModelIds.add(bone.modelId);\n }\n }\n for (const rig of fbxScene.rigs) {\n const skeleton = this._createSkeleton(rig.id, rig.bones, scene);\n skeletons.push(skeleton);\n skeletonByRigId.set(rig.id, skeleton);\n\n for (const binding of rig.skinBindings) {\n const skin = skinById.get(binding.skinId);\n if (!skin) {\n continue;\n }\n\n skeletonByGeometryId.set(binding.geometryId, skeleton);\n skinByGeometryId.set(binding.geometryId, skin);\n skinBindingByGeometryId.set(binding.geometryId, binding);\n }\n }\n\n // Collect model data for animation sampling.\n const modelIdToData = new Map<number, FBXModelData>();\n this._parentModelById = new Map();\n const collectModelData = (models: FBXModelData[], parent: FBXModelData | null) => {\n for (const m of models) {\n modelIdToData.set(m.id, m);\n if (parent) {\n this._parentModelById.set(m.id, parent);\n }\n collectModelData(m.children, m);\n }\n };\n collectModelData(fbxScene.rootModels, null);\n const cullingConflictMaterialIds = FBXFileLoader._collectCullingConflictMaterialIds(fbxScene.rootModels);\n const cullingMaterialCloneCache = new Map<Material, Material>();\n\n // Build the FBX hierarchy under the same handedness conversion root that\n // Babylon's glTF loader uses when loading right-handed assets into a\n // left-handed scene. If the FBX file declares a non-Y-up scene basis,\n // add a child axis-conversion root so model/bind math stays in FBX space.\n const rootNode = new TransformNode(\"__fbx_root__\", scene);\n if (!scene.useRightHandedSystem) {\n rootNode.rotation.y = Math.PI;\n rootNode.scaling.z = -1;\n }\n // FBX units: one file unit is UnitScaleFactor centimeters.\n const unitScale = this._options.unitScale;\n const cmPerTargetUnit = unitScale === \"preserve\" ? 0 : unitScale === \"meters\" ? 100 : unitScale;\n if (cmPerTargetUnit > 0 && fbxScene.unitScaleFactor > 0) {\n const factor = fbxScene.unitScaleFactor / cmPerTargetUnit;\n rootNode.scaling.scaleInPlace(factor);\n }\n rootNode.metadata = { ...((rootNode.metadata as object) ?? {}), fbxUnitScaleFactor: fbxScene.unitScaleFactor, fbxFrameRate: fbxScene.frameRate };\n this._meshByGeometryKey = new Map();\n this._instanceSource = new Map();\n this._evaluatedCurveNodeIds = new Set();\n\n const meshes: Mesh[] = [];\n const transformNodes: TransformNode[] = [rootNode];\n let assetRoot = rootNode;\n const axisConversion = FBXFileLoader._computeFBXAxisConversionMatrix(fbxScene);\n if (!axisConversion.equals(Matrix.Identity())) {\n assetRoot = new TransformNode(\"__fbx_axis_conversion__\", scene);\n assetRoot.parent = rootNode;\n FBXFileLoader._applyMatrixToTransform(assetRoot, axisConversion);\n transformNodes.push(assetRoot);\n }\n const modelIdToNode = new Map<number, TransformNode>();\n const fbxWorldIdentity = Matrix.Identity();\n\n for (const model of fbxScene.rootModels) {\n this._buildModel(\n model,\n scene,\n assetRoot,\n assetRoot,\n fbxWorldIdentity,\n materialCache,\n nameFilter,\n meshes,\n transformNodes,\n skeletonByGeometryId,\n skinByGeometryId,\n skinBindingByGeometryId,\n modelIdToNode,\n cullingConflictMaterialIds,\n cullingMaterialCloneCache\n );\n }\n this._linkSkeletonsToTransformNodes(fbxScene.rigs, skeletonByRigId, modelIdToNode, transformNodes, scene);\n\n // Link non-skinned child meshes/nodes to their parent bones so they\n // follow skeletal animation. Preserve their current world matrix when\n // switching from the FBX model hierarchy to Babylon's bone parent.\n for (const rig of fbxScene.rigs) {\n const skeleton = skeletonByRigId.get(rig.id);\n if (!skeleton) {\n continue;\n }\n\n const skinnedMesh = meshes.find((m) => m.skeleton === skeleton) ?? null;\n const boneReferenceNode = skinnedMesh ?? rootNode;\n const boneTransformNodes = new Set<TransformNode>();\n for (const skeletonBone of skeleton.bones) {\n const transformNode = skeletonBone.getTransformNode();\n if (transformNode) {\n boneTransformNodes.add(transformNode);\n }\n }\n\n // Children of joints (props, end effectors, meshes) stay parented to the joint's TransformNode. Bones are\n // linked to those nodes, so the hierarchy already follows the animation; attaching to the bone's skinning\n // matrix would move them into the skinned mesh's space instead of the node's.\n void boneTransformNodes;\n void boneReferenceNode;\n }\n\n // Apply blend shapes (morph targets) to meshes\n if (fbxScene.blendShapes.length > 0) {\n this._applyBlendShapes(fbxScene.blendShapes, meshes, scene);\n for (const [instance, source] of Array.from(this._instanceSource)) {\n if (source.morphTargetManager && !instance.morphTargetManager) {\n instance.morphTargetManager = source.morphTargetManager;\n }\n }\n }\n\n // Create cameras\n const cameras: FreeCamera[] = [];\n const cameraByAttributeId = new Map<number, FreeCamera>();\n for (const camData of fbxScene.cameras) {\n const cam = this._createCamera(camData, modelIdToNode, scene);\n if (cam) {\n cameras.push(cam);\n cameraByAttributeId.set(camData.attributeId, cam);\n }\n }\n\n // Create lights\n const sceneLights: (PointLight | DirectionalLight | SpotLight)[] = [];\n const lightByAttributeId = new Map<number, Light>();\n for (const lightData of fbxScene.lights) {\n const light = this._createLight(lightData, modelIdToNode, scene);\n if (light) {\n sceneLights.push(light);\n lightByAttributeId.set(lightData.attributeId, light);\n }\n }\n\n this._applyConstraints(fbxScene, modelIdToNode, rootNode, scene);\n\n // Create animation groups\n const animationGroups: AnimationGroup[] = [];\n for (const animStack of fbxScene.animations) {\n const group = this._createAnimationGroup(animStack, fbxScene.rigs, skeletonByRigId, scene, modelIdToNode, modelIdToData, meshes, {\n cameraByAttributeId,\n lightByAttributeId,\n materialCache,\n });\n if (group) {\n animationGroups.push(group);\n }\n }\n\n // Reported last so that property curves the animation groups picked up are not flagged as unevaluated.\n this._reportDiagnostics(fbxScene, rootNode, modelIdToNode);\n\n return {\n meshes,\n particleSystems: [],\n skeletons,\n animationGroups,\n transformNodes,\n geometries: [],\n lights: sceneLights,\n spriteManagers: [],\n materials: Array.from(materialCache.values()),\n textures: Array.from(new Set(Array.from(materialCache.values()).flatMap((material) => material.getActiveTextures()))),\n cameras,\n };\n }\n\n private _addMaterialToContainer(material: Nullable<Material>, container: AssetContainer): void {\n if (!material) {\n return;\n }\n\n if (material instanceof MultiMaterial) {\n if (!container.multiMaterials.includes(material)) {\n container.multiMaterials.push(material);\n }\n for (const subMaterial of material.subMaterials) {\n this._addMaterialToContainer(subMaterial, container);\n }\n } else if (!container.materials.includes(material)) {\n container.materials.push(material);\n }\n\n for (const texture of material.getActiveTextures()) {\n this._addTextureToContainer(texture, container);\n }\n }\n\n private _addTextureToContainer(texture: BaseTexture, container: AssetContainer): void {\n if (!container.textures.includes(texture)) {\n container.textures.push(texture);\n }\n }\n\n private _setAssetContainer(container: AssetContainer): void {\n for (const asset of container.meshes) {\n asset._parentContainer = container;\n }\n for (const asset of container.transformNodes) {\n asset._parentContainer = container;\n }\n for (const asset of container.skeletons) {\n asset._parentContainer = container;\n }\n for (const asset of container.animationGroups) {\n asset._parentContainer = container;\n }\n for (const asset of container.lights) {\n asset._parentContainer = container;\n }\n for (const asset of container.cameras) {\n asset._parentContainer = container;\n }\n for (const asset of container.materials) {\n asset._parentContainer = container;\n }\n for (const asset of container.multiMaterials) {\n asset._parentContainer = container;\n }\n for (const asset of container.textures) {\n asset._parentContainer = container;\n }\n }\n\n private static _computeFBXAxisConversionMatrix(fbxScene: FBXSceneData): Matrix {\n const basisRows: [number, number, number][] = [\n [0, 0, 0],\n [0, 0, 0],\n [0, 0, 0],\n ];\n\n const assignAxis = (sourceAxis: number, sourceSign: number, targetAxis: number): void => {\n if (sourceAxis < 0 || sourceAxis > 2) {\n return;\n }\n const row: [number, number, number] = [0, 0, 0];\n row[targetAxis] = sourceSign >= 0 ? 1 : -1;\n basisRows[sourceAxis] = row;\n };\n\n assignAxis(fbxScene.coordAxis, fbxScene.coordAxisSign, 0);\n assignAxis(fbxScene.upAxis, fbxScene.upAxisSign, 1);\n assignAxis(fbxScene.frontAxis, fbxScene.frontAxisSign, 2);\n\n if (basisRows.some((row) => row.every((value) => value === 0))) {\n return Matrix.Identity();\n }\n\n return Matrix.FromValues(\n basisRows[0][0],\n basisRows[0][1],\n basisRows[0][2],\n 0,\n basisRows[1][0],\n basisRows[1][1],\n basisRows[1][2],\n 0,\n basisRows[2][0],\n basisRows[2][1],\n basisRows[2][2],\n 0,\n 0,\n 0,\n 0,\n 1\n );\n }\n\n private _buildModel(\n model: FBXModelData,\n scene: Scene,\n parentNode: Nullable<TransformNode>,\n assetRoot: TransformNode,\n parentFBXWorldMatrix: Matrix,\n materialCache: Map<number, Material>,\n nameFilter: ((name: string) => boolean) | null,\n meshes: Mesh[],\n transformNodes: TransformNode[],\n skeletonByGeometryId: Map<number, Skeleton>,\n skinByGeometryId: Map<number, FBXSkinData>,\n skinBindingByGeometryId: Map<number, FBXSkinBindingData>,\n modelIdToNode: Map<number, TransformNode>,\n cullingConflictMaterialIds: Set<number>,\n cullingMaterialCloneCache: Map<Material, Material>\n ): void {\n let parent = parentNode;\n const localMatrix = FBXFileLoader._computeFBXModelLocalMatrix(model);\n const fbxWorldMatrix = localMatrix.multiply(parentFBXWorldMatrix);\n\n // Nodes with RrSs / Rrs inheritance do not inherit their parent's scale the normal way. Insert a helper that\n // cancels the parent scale and re-express the local transform in that unscaled frame (see ufbx's\n // inherit-mode evaluation). Skeleton bones with Rrs are handled by the rig code instead.\n const parentModel = this._parentModelById.get(model.id);\n const parentModelNode = parentModel ? modelIdToNode.get(parentModel.id) : undefined;\n if (\n parent &&\n parentModel &&\n parentModelNode &&\n parent === parentModelNode &&\n model.inheritType !== 1 &&\n !this._isRigBone(model.id) &&\n !this._isRigBone(parentModel.id) &&\n !(parentModel.geometry && skinByGeometryId.has(parentModel.geometry.id))\n ) {\n // The helper sits beside the parent and carries the parent's rotation and translation with unit scale,\n // i.e. the parent's \"unscaled\" frame. This avoids inverting the parent scale (which may be zero).\n const helper = new TransformNode(`${model.name}__fbx_inheritScale`, scene);\n helper.parent = parentModelNode.parent;\n helper.position.copyFrom(parentModelNode.position);\n helper.rotationQuaternion = parentModelNode.rotationQuaternion ? parentModelNode.rotationQuaternion.clone() : Quaternion.FromEulerVector(parentModelNode.rotation);\n helper.scaling.set(1, 1, 1);\n transformNodes.push(helper);\n this._inheritScaleHelpers.set(model.id, helper);\n parent = helper;\n }\n\n if (model.geometry && model.geometry.indices.length > 0 && (!nameFilter || nameFilter(model.name))) {\n // Create mesh. Tessellated NURBS carry no control point mapping, so their deformers are not applied\n // (the interpreter reports them).\n const deformable = model.geometry.controlPointIndices !== null;\n const skeleton = deformable ? skeletonByGeometryId.get(model.geometry.id) : undefined;\n const skin = deformable ? skinByGeometryId.get(model.geometry.id) : undefined;\n const skinBinding = deformable ? skinBindingByGeometryId.get(model.geometry.id) : undefined;\n\n if (skeleton && skin) {\n skeleton.needInitialSkinMatrix = true;\n }\n\n // Models referencing the same geometry (with the same geometric transform) share one Babylon geometry.\n const geometryKey = `${model.geometry.id}|${model.geometricTranslation.join(\",\")}|${model.geometricRotation.join(\",\")}|${model.geometricScaling.join(\",\")}`;\n const source = !skeleton && this._options.shareGeometry ? this._meshByGeometryKey.get(geometryKey) : undefined;\n let mesh: Mesh;\n if (source) {\n mesh = source.clone(model.name, null, true);\n mesh.sideOrientation = source.sideOrientation;\n mesh.metadata = { ...((source.metadata as object) ?? {}), fbxInstanceOf: source.name };\n this._instanceSource.set(mesh, source);\n } else {\n mesh = this._createMesh(model, model.geometry, scene, skeleton, skin, skinBinding);\n if (!skeleton) {\n this._meshByGeometryKey.set(geometryKey, mesh);\n }\n }\n\n // For skinned meshes: keep bind/pose math in FBX space, but parent\n // the rendered mesh under the same conversion root as non-skinned\n // meshes. The pose matrix cancels the real FBX mesh transform only;\n // the root handedness conversion remains applied once at render time.\n if (skeleton && skin) {\n const meshBindMatrix = skin.meshBindPoseMatrix ? Matrix.FromArray(skin.meshBindPoseMatrix) : fbxWorldMatrix;\n mesh.parent = assetRoot;\n FBXFileLoader._applyMatrixToTransform(mesh, meshBindMatrix);\n mesh.computeWorldMatrix(true);\n mesh.updatePoseMatrix(Matrix.Invert(meshBindMatrix));\n mesh.alwaysSelectAsActiveMesh = true;\n } else {\n if (parent) {\n mesh.parent = parent;\n }\n this._applyRestTRS(mesh, model);\n }\n\n // Apply material(s)\n if (model.materials.length > 1 && model.geometry?.materialIndices) {\n // Multi-material: create sub-meshes for each material\n this._applyMultiMaterial(mesh, model, materialCache, scene, cullingConflictMaterialIds, cullingMaterialCloneCache);\n } else if (model.materials.length > 0) {\n const mat = materialCache.get(model.materials[0].id);\n if (mat) {\n mesh.material = FBXFileLoader._getModelMaterial(mat, model, cullingMaterialCloneCache, cullingConflictMaterialIds.has(model.materials[0].id));\n }\n }\n\n if (model.geometry?.colors) {\n this._useUnmodulatedVertexColorMaterials(mesh, scene);\n }\n this._applyMaterialUVSetCoordinates(mesh.material, model.geometry);\n\n meshes.push(mesh);\n modelIdToNode.set(model.id, mesh);\n\n FBXFileLoader._applyModelMetadata(mesh, model);\n\n // Recurse children\n for (const child of model.children) {\n this._buildModel(\n child,\n scene,\n mesh,\n assetRoot,\n fbxWorldMatrix,\n materialCache,\n nameFilter,\n meshes,\n transformNodes,\n skeletonByGeometryId,\n skinByGeometryId,\n skinBindingByGeometryId,\n modelIdToNode,\n cullingConflictMaterialIds,\n cullingMaterialCloneCache\n );\n }\n } else if (model.curve && this._options.curves !== \"skip\" && model.curve.polylines.length > 0 && (!nameFilter || nameFilter(model.name))) {\n const lines = this._createLinesMesh(model, model.curve, scene);\n if (parent) {\n lines.parent = parent;\n }\n this._applyRestTRS(lines, model);\n meshes.push(lines);\n modelIdToNode.set(model.id, lines);\n FBXFileLoader._applyModelMetadata(lines, model);\n\n for (const child of model.children) {\n this._buildModel(\n child,\n scene,\n lines,\n assetRoot,\n fbxWorldMatrix,\n materialCache,\n nameFilter,\n meshes,\n transformNodes,\n skeletonByGeometryId,\n skinByGeometryId,\n skinBindingByGeometryId,\n modelIdToNode,\n cullingConflictMaterialIds,\n cullingMaterialCloneCache\n );\n }\n } else {\n if ((model.geometry || model.curve) && nameFilter && !FBXFileLoader._modelSubtreeMatchesNameFilter(model, nameFilter)) {\n return;\n }\n\n // Transform node (Null type or no geometry)\n const transformNode = new TransformNode(model.name, scene);\n if (parent) {\n transformNode.parent = parent;\n }\n\n // Apply full FBX transform chain\n this._applyRestTRS(transformNode, model);\n\n transformNodes.push(transformNode);\n modelIdToNode.set(model.id, transformNode);\n\n FBXFileLoader._applyModelMetadata(transformNode, model);\n\n // Recurse children\n for (const child of model.children) {\n this._buildModel(\n child,\n scene,\n transformNode,\n assetRoot,\n fbxWorldMatrix,\n materialCache,\n nameFilter,\n meshes,\n transformNodes,\n skeletonByGeometryId,\n skinByGeometryId,\n skinBindingByGeometryId,\n modelIdToNode,\n cullingConflictMaterialIds,\n cullingMaterialCloneCache\n );\n }\n FBXFileLoader._applyLodGroup(model, modelIdToNode);\n }\n }\n\n private _linkSkeletonsToTransformNodes(\n rigs: FBXRigData[],\n skeletonByRigId: Map<string, Skeleton>,\n modelIdToNode: Map<number, TransformNode>,\n transformNodes: TransformNode[],\n scene: Scene\n ): void {\n for (const rig of rigs) {\n const skeleton = skeletonByRigId.get(rig.id);\n if (!skeleton) {\n continue;\n }\n\n for (const boneData of rig.bones) {\n const bone = this._getSourceBone(skeleton, boneData.index);\n const boneNode = modelIdToNode.get(boneData.modelId);\n if (!bone || !boneNode) {\n continue;\n }\n\n const scaleCompensationHelper = this._getScaleCompensationHelper(skeleton, boneData.index);\n if (scaleCompensationHelper) {\n const helperNode = new TransformNode(scaleCompensationHelper.name, scene);\n helperNode.parent = boneNode.parent;\n boneNode.parent = helperNode;\n FBXFileLoader._applyMatrixToTransform(helperNode, scaleCompensationHelper.getLocalMatrix());\n FBXFileLoader._applyMatrixToTransform(boneNode, bone.getLocalMatrix());\n scaleCompensationHelper.linkTransformNode(helperNode);\n transformNodes.push(helperNode);\n } else {\n FBXFileLoader._applyMatrixToTransform(boneNode, bone.getLocalMatrix());\n }\n\n bone.linkTransformNode(boneNode);\n }\n }\n }\n\n private static _modelSubtreeMatchesNameFilter(model: FBXModelData, nameFilter: (name: string) => boolean): boolean {\n for (const child of model.children) {\n if (child.geometry && child.subType === \"Mesh\" && nameFilter(child.name)) {\n return true;\n }\n if (FBXFileLoader._modelSubtreeMatchesNameFilter(child, nameFilter)) {\n return true;\n }\n }\n return false;\n }\n\n private static _applyModelMetadata(node: TransformNode | Mesh, model: FBXModelData): void {\n if (!model.customProperties && model.diagnostics.length === 0 && !model.displayLayer && !model.lodGroup) {\n return;\n }\n\n node.metadata = {\n ...((node.metadata as object) ?? {}),\n ...(model.customProperties ? { fbxCustomProperties: model.customProperties, fbxUserProperties: model.customProperties } : {}),\n ...(model.diagnostics.length > 0 ? { fbxDiagnostics: model.diagnostics } : {}),\n ...(model.displayLayer\n ? { fbxDisplayLayer: { name: model.displayLayer.name, show: model.displayLayer.show, freeze: model.displayLayer.freeze, color: model.displayLayer.color } }\n : {}),\n ...(model.lodGroup ? { fbxLodGroup: model.lodGroup } : {}),\n };\n // Hidden display layers hide their members, as in the authoring application.\n if (model.displayLayer && !model.displayLayer.show) {\n node.setEnabled(false);\n }\n }\n\n /**\n * Wires a LodGroup's children as Babylon LOD levels: the first child holds the highest detail; every further\n * child replaces it beyond the group's threshold distance (or screen coverage when thresholds are percentages).\n * Each child's display mode is honoured first: level 1 (show) stays visible outside the LOD chain, level 2\n * (hide) is disabled, and only level 0 (use LOD) children take part in the distance switching.\n */\n private static _applyLodGroup(model: FBXModelData, modelIdToNode: Map<number, TransformNode>): void {\n const lod = model.lodGroup;\n if (!lod) {\n return;\n }\n const lodChildren: { child: FBXModelData; level: number }[] = [];\n for (let level = 0; level < model.children.length; level++) {\n const child = model.children[level];\n const display = lod.displayLevels[level] ?? 0;\n if (display === 2) {\n modelIdToNode.get(child.id)?.setEnabled(false);\n } else if (display === 0) {\n lodChildren.push({ child, level });\n }\n }\n if (lodChildren.length < 2) {\n return;\n }\n const meshesOf = (child: FBXModelData): Mesh[] => {\n const node = modelIdToNode.get(child.id);\n if (!node) {\n return [];\n }\n const meshes: Mesh[] = node instanceof Mesh ? [node] : [];\n for (const m of node.getChildMeshes(false)) {\n if (m instanceof Mesh) {\n meshes.push(m);\n }\n }\n return meshes;\n };\n const base = meshesOf(lodChildren[0].child);\n for (let i = 1; i < lodChildren.length; i++) {\n const level = lodChildren[i].level;\n const levelMeshes = meshesOf(lodChildren[i].child);\n const threshold = lod.thresholds[level - 1] ?? lod.thresholds[lod.thresholds.length - 1] ?? 0;\n for (let i = 0; i < base.length; i++) {\n const target = levelMeshes[i] ?? null;\n if (lod.relative) {\n base[i].useLODScreenCoverage = true;\n base[i].addLODLevel(threshold / 100, target);\n } else {\n base[i].addLODLevel(threshold, target);\n }\n if (target) {\n target.metadata = { ...((target.metadata as object) ?? {}), fbxLodLevel: level };\n }\n }\n }\n }\n\n /** Builds a lines mesh from Line or tessellated NurbsCurve geometry, applying the model's geometric transform. */\n private _createLinesMesh(model: FBXModelData, curve: FBXCurveGeometryData, scene: Scene): LinesMesh {\n const lines = new LinesMesh(model.name, scene);\n const positions: number[] = [];\n const indices: number[] = [];\n for (const polyline of curve.polylines) {\n const count = polyline.length / 3;\n if (count < 2) {\n continue;\n }\n const base = positions.length / 3;\n for (let i = 0; i < polyline.length; i++) {\n positions.push(polyline[i]);\n }\n for (let i = 0; i < count - 1; i++) {\n indices.push(base + i, base + i + 1);\n }\n }\n const geometricMatrix = FBXFileLoader._computeFBXGeometricMatrix(model.geometricTranslation, model.geometricRotation, model.geometricScaling);\n if (!geometricMatrix.equals(Matrix.Identity())) {\n for (let i = 0; i < positions.length; i += 3) {\n const v = Vector3.TransformCoordinates(new Vector3(positions[i], positions[i + 1], positions[i + 2]), geometricMatrix);\n positions[i] = v.x;\n positions[i + 1] = v.y;\n positions[i + 2] = v.z;\n }\n }\n const vertexData = new VertexData();\n vertexData.positions = positions;\n vertexData.indices = indices;\n vertexData.applyToMesh(lines);\n if (curve.color) {\n lines.color = new Color3(curve.color[0], curve.color[1], curve.color[2]);\n }\n lines.metadata = { ...((lines.metadata as object) ?? {}), fbxCurveType: curve.kind, fbxCurveSegments: curve.polylines.length };\n return lines;\n }\n\n private _createMesh(model: FBXModelData, geomData: FBXGeometryData, scene: Scene, skeleton?: Skeleton, skin?: FBXSkinData, skinBinding?: FBXSkinBindingData): Mesh {\n const mesh = new Mesh(model.name, scene);\n mesh.sideOrientation = scene.useRightHandedSystem ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;\n const vertexData = new VertexData();\n\n // Convert Float64Array to Float32Array for Babylon\n const positions = float64To32(geomData.positions);\n\n const gt = model.geometricTranslation;\n const gr = model.geometricRotation;\n const gs = model.geometricScaling;\n\n // Geometric transforms affect only this mesh's geometry, not children.\n // Blender composes them as T * R * S; Babylon's row-vector equivalent is S * R * T.\n const geometricPositionMatrix = FBXFileLoader._computeFBXGeometricMatrix(gt, gr, gs);\n const geometricDeltaMatrix = FBXFileLoader._computeFBXGeometricDeltaMatrix(gr, gs);\n const geometricNormalMatrix = FBXFileLoader._computeFBXGeometricNormalMatrix(gr, gs);\n const hasGeometricPositionTransform = !geometricPositionMatrix.equals(Matrix.Identity());\n const hasGeometricDeltaTransform = !geometricDeltaMatrix.equals(Matrix.Identity());\n const hasGeometricNormalTransform = !geometricNormalMatrix.equals(Matrix.Identity());\n\n if (hasGeometricPositionTransform) {\n for (let i = 0; i < positions.length; i += 3) {\n const v = Vector3.TransformCoordinates(new Vector3(positions[i], positions[i + 1], positions[i + 2]), geometricPositionMatrix);\n positions[i] = v.x;\n positions[i + 1] = v.y;\n positions[i + 2] = v.z;\n }\n }\n\n // For skinned meshes: do NOT bake mesh local transform into vertices.\n // Vertices remain in their original mesh-local space, keeping the mesh data\n // clean for retargeting. The mesh node carries its FBX transform as an\n // initial pose, while TransformLink bind matrices handle skinning.\n\n vertexData.positions = positions;\n vertexData.indices = Array.from(geomData.indices);\n\n let normals: Float32Array | undefined;\n if (geomData.normals) {\n normals = float64To32(geomData.normals);\n if (hasGeometricNormalTransform) {\n for (let i = 0; i < normals.length; i += 3) {\n const n = Vector3.TransformNormal(new Vector3(normals[i], normals[i + 1], normals[i + 2]), geometricNormalMatrix);\n if (n.lengthSquared() > 0) {\n n.normalize();\n }\n normals[i] = n.x;\n normals[i + 1] = n.y;\n normals[i + 2] = n.z;\n }\n }\n vertexData.normals = normals;\n }\n\n if (geomData.uvs) {\n vertexData.uvs = float64To32(geomData.uvs);\n }\n if (geomData.uvSets.length > 1) {\n vertexData.uvs2 = float64To32(geomData.uvSets[1].data);\n }\n if (geomData.uvSets.length > 2) {\n vertexData.uvs3 = float64To32(geomData.uvSets[2].data);\n }\n if (geomData.uvSets.length > 3) {\n vertexData.uvs4 = float64To32(geomData.uvSets[3].data);\n }\n if (geomData.uvSets.length > 4) {\n vertexData.uvs5 = float64To32(geomData.uvSets[4].data);\n }\n if (geomData.uvSets.length > 5) {\n vertexData.uvs6 = float64To32(geomData.uvSets[5].data);\n }\n\n if (geomData.tangents) {\n const tangents = float64To32(geomData.tangents);\n if (hasGeometricNormalTransform) {\n for (let i = 0; i < tangents.length; i += 4) {\n const t = Vector3.TransformNormal(new Vector3(tangents[i], tangents[i + 1], tangents[i + 2]), geometricNormalMatrix);\n if (t.lengthSquared() > 0) {\n t.normalize();\n }\n tangents[i] = t.x;\n tangents[i + 1] = t.y;\n tangents[i + 2] = t.z;\n }\n }\n applyTangentHandednessScale(tangents, this._getNormalMapTangentHandednessScale());\n vertexData.tangents = tangents;\n } else if (normals && vertexData.uvs) {\n vertexData.tangents = generateTangents(\n positions,\n normals,\n vertexData.uvs,\n geomData.indices,\n this._getNormalMapTangentHandednessScale(),\n geomData.controlPointIndices,\n geomData.materialIndices\n );\n }\n\n if (geomData.colors) {\n // Force alpha to 1.0 — FBX vertex color alpha is often unreliable\n // (e.g. zeroed out by exporters) and would cause transparency sorting issues.\n const colors = new Float32Array(geomData.colors.length);\n for (let i = 0; i < colors.length; i += 4) {\n colors[i] = geomData.colors[i];\n colors[i + 1] = geomData.colors[i + 1];\n colors[i + 2] = geomData.colors[i + 2];\n colors[i + 3] = 1.0;\n }\n vertexData.colors = colors;\n mesh.hasVertexAlpha = false;\n }\n\n // Apply bone weights if we have a skin\n if (skeleton && skin) {\n const { matricesIndices, matricesWeights, matricesIndicesExtra, matricesWeightsExtra, numBoneInfluencers } = this._buildSkinningData(geomData, skin, skinBinding);\n vertexData.matricesIndices = matricesIndices;\n vertexData.matricesWeights = matricesWeights;\n if (matricesIndicesExtra && matricesWeightsExtra) {\n vertexData.matricesIndicesExtra = matricesIndicesExtra;\n vertexData.matricesWeightsExtra = matricesWeightsExtra;\n }\n mesh.numBoneInfluencers = numBoneInfluencers;\n }\n\n vertexData.applyToMesh(mesh);\n\n // Store geometry metadata for blend shape matching\n mesh.metadata = {\n ...((mesh.metadata as object) ?? {}),\n fbxGeometryId: geomData.id,\n fbxControlPointIndices: geomData.controlPointIndices,\n fbxGeometryDeltaMatrix: hasGeometricDeltaTransform ? geometricDeltaMatrix : null,\n fbxGeometryNormalMatrix: hasGeometricNormalTransform ? geometricNormalMatrix : null,\n // Back-compat for existing morph delta handling metadata.\n fbxPreRotMatrix: hasGeometricDeltaTransform ? geometricDeltaMatrix : null,\n };\n\n if (skeleton) {\n mesh.skeleton = skeleton;\n }\n\n return mesh;\n }\n\n /**\n * Apply multi-material to a mesh by creating sub-meshes grouped by material index.\n * Reorders the index buffer so that triangles sharing the same material are contiguous.\n */\n private _applyMultiMaterial(\n mesh: Mesh,\n model: FBXModelData,\n materialCache: Map<number, Material>,\n scene: Scene,\n cullingConflictMaterialIds: Set<number>,\n cullingMaterialCloneCache: Map<Material, Material>\n ): void {\n const matIndices = model.geometry!.materialIndices!;\n const recorded = (mesh.metadata as { fbxSubMeshMaterialIndices?: number[] } | undefined)?.fbxSubMeshMaterialIndices;\n if (recorded) {\n // Instance of an already split mesh: the index buffer and sub-meshes are shared; only the materials differ.\n const multiMat = new MultiMaterial(model.name + \"_multi\", scene);\n for (const matIdx of recorded) {\n const fbxMat = model.materials[matIdx];\n const mat = fbxMat ? materialCache.get(fbxMat.id) : undefined;\n multiMat.subMaterials.push(mat ? FBXFileLoader._getModelMaterial(mat, model, cullingMaterialCloneCache, cullingConflictMaterialIds.has(fbxMat!.id)) : null);\n }\n mesh.material = multiMat;\n return;\n }\n const indices = mesh.getIndices();\n if (!indices) {\n return;\n }\n\n const triCount = indices.length / 3;\n\n // Group triangles by material index\n const groups = new Map<number, number[]>(); // matIdx -> triangle indices\n for (let ti = 0; ti < triCount; ti++) {\n const matIdx = ti < matIndices.length ? matIndices[ti] : 0;\n let group = groups.get(matIdx);\n if (!group) {\n group = [];\n groups.set(matIdx, group);\n }\n group.push(ti);\n }\n\n // Sort group keys to ensure consistent ordering\n const sortedMatIndices = Array.from(groups.keys()).sort((a, b) => a - b);\n\n // Reorder index buffer so triangles are grouped by material\n const newIndices: number[] = [];\n const subMeshRanges: { start: number; count: number; matIdx: number }[] = [];\n\n for (const matIdx of sortedMatIndices) {\n const tris = groups.get(matIdx)!;\n const start = newIndices.length;\n for (const ti of tris) {\n newIndices.push(indices[ti * 3], indices[ti * 3 + 1], indices[ti * 3 + 2]);\n }\n subMeshRanges.push({ start, count: tris.length * 3, matIdx });\n }\n\n // Update the mesh's index buffer\n mesh.setIndices(newIndices);\n\n // Create MultiMaterial\n const multiMat = new MultiMaterial(model.name + \"_multi\", scene);\n for (const range of subMeshRanges) {\n const fbxMat = model.materials[range.matIdx];\n if (fbxMat) {\n const mat = materialCache.get(fbxMat.id);\n if (mat) {\n multiMat.subMaterials.push(FBXFileLoader._getModelMaterial(mat, model, cullingMaterialCloneCache, cullingConflictMaterialIds.has(fbxMat.id)));\n } else {\n multiMat.subMaterials.push(null);\n }\n } else {\n multiMat.subMaterials.push(null);\n }\n }\n\n mesh.material = multiMat;\n\n // Clear existing sub-meshes and create new ones\n mesh.subMeshes = [];\n const vertexCount = mesh.getTotalVertices();\n for (let i = 0; i < subMeshRanges.length; i++) {\n const range = subMeshRanges[i];\n new SubMesh(i, 0, vertexCount, range.start, range.count, mesh);\n }\n mesh.metadata = { ...((mesh.metadata as object) ?? {}), fbxSubMeshMaterialIndices: sortedMatIndices };\n }\n\n private static _collectCullingConflictMaterialIds(models: FBXModelData[]): Set<number> {\n // Deliberately scan the full scene, not just name-filtered models. This\n // can over-clone for filtered imports, but avoids shared culling state.\n const usage = new Map<number, { cullingOff: boolean; cullingOn: boolean }>();\n const collect = (model: FBXModelData): void => {\n for (const material of model.materials) {\n const state = usage.get(material.id) ?? { cullingOff: false, cullingOn: false };\n if (model.cullingOff) {\n state.cullingOff = true;\n } else {\n state.cullingOn = true;\n }\n usage.set(material.id, state);\n }\n for (const child of model.children) {\n collect(child);\n }\n };\n for (const model of models) {\n collect(model);\n }\n\n const conflicts = new Set<number>();\n for (const [materialId, state] of Array.from(usage)) {\n if (state.cullingOff && state.cullingOn) {\n conflicts.add(materialId);\n }\n }\n return conflicts;\n }\n\n private static _getModelMaterial(material: Material, model: FBXModelData, cullingCloneCache?: Map<Material, Material>, cloneCullingOffMaterial = true): Material {\n if (!model.cullingOff || !material.backFaceCulling) {\n return material;\n }\n if (!cloneCullingOffMaterial) {\n material.backFaceCulling = false;\n return material;\n }\n\n const cached = cullingCloneCache?.get(material);\n if (cached) {\n return cached;\n }\n\n const clone = material.clone(`${material.name}_CullingOff`) ?? material;\n clone.backFaceCulling = false;\n cullingCloneCache?.set(material, clone);\n return clone;\n }\n\n private _applyMaterialUVSetCoordinates(material: unknown, geometry: FBXGeometryData): void {\n if (!material) {\n return;\n }\n if (material instanceof MultiMaterial) {\n for (const subMaterial of material.subMaterials) {\n if (subMaterial instanceof StandardMaterial || subMaterial instanceof PBRMaterial) {\n this._applyStandardMaterialUVSetCoordinates(subMaterial, geometry);\n }\n }\n return;\n }\n if (material instanceof StandardMaterial || material instanceof PBRMaterial) {\n this._applyStandardMaterialUVSetCoordinates(material, geometry);\n }\n }\n\n private _applyStandardMaterialUVSetCoordinates(material: StandardMaterial | PBRMaterial, geometry: FBXGeometryData): void {\n for (const texture of material instanceof PBRMaterial\n ? [\n material.albedoTexture,\n material.bumpTexture,\n material.emissiveTexture,\n material.ambientTexture,\n material.metallicTexture,\n material.reflectivityTexture,\n material.microSurfaceTexture,\n material.opacityTexture,\n material.clearCoat.texture,\n material.clearCoat.bumpTexture,\n material.sheen.texture,\n ]\n : [\n material.diffuseTexture,\n material.bumpTexture,\n material.emissiveTexture,\n material.ambientTexture,\n material.specularTexture,\n material.opacityTexture,\n material.reflectionTexture,\n ]) {\n if (!texture) {\n continue;\n }\n\n const uvSetName = (texture.metadata as { fbxUVSetName?: string } | null | undefined)?.fbxUVSetName;\n if (!uvSetName) {\n continue;\n }\n\n const uvSetIndex = geometry.uvSets.findIndex((uvSet) => uvSet.name === uvSetName);\n if (uvSetIndex >= 0) {\n texture.coordinatesIndex = uvSetIndex;\n }\n }\n }\n\n /**\n * Babylon multiplies vertex colors by material diffuse color. Use per-mesh\n * material clones so vertex-colored geometry can render unmodulated without\n * changing shared materials used by non-vertex-colored meshes.\n */\n private _useUnmodulatedVertexColorMaterials(mesh: Mesh, scene: Scene): void {\n const assignedMat = mesh.material;\n if (!assignedMat) {\n return;\n }\n\n const unmodulated = (mat: Material): Material => {\n if (mat instanceof StandardMaterial && !mat.diffuseTexture) {\n const clone = mat.clone(`${mat.name}_VertexColor`);\n clone.diffuseColor = new Color3(1, 1, 1);\n return clone;\n }\n if (mat instanceof PBRMaterial && !mat.albedoTexture) {\n const clone = mat.clone(`${mat.name}_VertexColor`);\n clone.albedoColor = new Color3(1, 1, 1);\n return clone;\n }\n return mat;\n };\n\n if (assignedMat instanceof MultiMaterial) {\n const multiMat = new MultiMaterial(`${assignedMat.name}_VertexColor`, scene);\n multiMat.subMaterials = assignedMat.subMaterials.map((sub) => (sub ? unmodulated(sub) : sub));\n mesh.material = multiMat;\n return;\n }\n mesh.material = unmodulated(assignedMat);\n }\n\n /**\n * Build per-polygon-vertex bone indices and weights from the control-point-based skin data.\n * The geometry expands control points to per-polygon-vertex, so we need to look up\n * each polygon-vertex's control point index.\n */\n private _buildSkinningData(\n geomData: FBXGeometryData,\n skin: FBXSkinData,\n skinBinding?: FBXSkinBindingData\n ): {\n matricesIndices: Float32Array;\n matricesWeights: Float32Array;\n matricesIndicesExtra: Float32Array | null;\n matricesWeightsExtra: Float32Array | null;\n numBoneInfluencers: number;\n } {\n // The positions array is per-polygon-vertex (already expanded).\n // We need to figure out the control point index for each polygon vertex.\n // The geometry stores positions per polygon-vertex, so geomData.positions.length/3\n // = number of polygon vertices. We stored control point indices during expansion,\n // but they aren't exported. Instead, we can use the fact that skin data is indexed\n // by control point, and the geometry's _controlPointIndices stores this mapping.\n //\n // Since we don't have direct access to the control point mapping from FBXGeometryData,\n // we'll use the vertex positions to build the skinning buffer. But actually,\n // we should extend geometry to export control point indices per polygon-vertex.\n //\n // For now, use the approach of matching positions to control points.\n // Actually, let's look at this differently - the indices/weights in the skin\n // are per control point. The geometry already expanded to per polygon-vertex\n // with positions copied from control points. We need to know which control point\n // each polygon-vertex came from.\n //\n // We'll use geomData.controlPointIndices if available.\n const vertexCount = geomData.positions.length / 3;\n const matricesIndices = new Float32Array(vertexCount * 4);\n const matricesWeights = new Float32Array(vertexCount * 4);\n let matricesIndicesExtra: Float32Array | null = null;\n let matricesWeightsExtra: Float32Array | null = null;\n let numBoneInfluencers = 0;\n\n if (geomData.controlPointIndices) {\n for (let i = 0; i < vertexCount; i++) {\n const cpIdx = geomData.controlPointIndices[i];\n const boneIdx = skin.boneIndices[cpIdx] ?? [];\n numBoneInfluencers = Math.max(numBoneInfluencers, Math.min(boneIdx.length, 8));\n }\n\n if (numBoneInfluencers > 4) {\n matricesIndicesExtra = new Float32Array(vertexCount * 4);\n matricesWeightsExtra = new Float32Array(vertexCount * 4);\n }\n\n for (let i = 0; i < vertexCount; i++) {\n const cpIdx = geomData.controlPointIndices[i];\n const boneIdx = skin.boneIndices[cpIdx] ?? [];\n const boneWts = skin.boneWeights[cpIdx] ?? [];\n\n for (let j = 0; j < 8; j++) {\n const indicesBuffer = j < 4 ? matricesIndices : matricesIndicesExtra;\n const weightsBuffer = j < 4 ? matricesWeights : matricesWeightsExtra;\n if (!indicesBuffer || !weightsBuffer) {\n continue;\n }\n\n const bufferIndex = i * 4 + (j % 4);\n if (j < boneIdx.length) {\n const skinBoneIndex = boneIdx[j];\n const rigBoneIndex = skinBinding ? skinBinding.skinBoneIndexToRigBoneIndex[skinBoneIndex] : skinBoneIndex;\n if (rigBoneIndex === undefined || rigBoneIndex < 0) {\n throw new Error(`FBXFileLoader: missing rig bone mapping for skin bone index ${skinBoneIndex}`);\n }\n indicesBuffer[bufferIndex] = rigBoneIndex;\n } else {\n indicesBuffer[bufferIndex] = 0;\n }\n weightsBuffer[bufferIndex] = j < boneWts.length ? boneWts[j] : 0;\n }\n }\n }\n\n return {\n matricesIndices,\n matricesWeights,\n matricesIndicesExtra,\n matricesWeightsExtra,\n numBoneInfluencers: Math.max(numBoneInfluencers, 1),\n };\n }\n\n private _createMaterial(matData: FBXMaterialData, scene: Scene, rootUrl: string): Material {\n const mode = this._options.materials;\n const usePbr = mode === \"pbr\" || (mode === \"auto\" && isPbrShaderType(matData.model.shaderType));\n const material = usePbr ? this._createPbrMaterial(matData, scene, rootUrl) : this._createStandardMaterial(matData, scene, rootUrl);\n material.metadata = {\n ...((material.metadata as object) ?? {}),\n ...(matData.userProperties ? { fbxUserProperties: matData.userProperties } : {}),\n fbxShaderType: matData.model.shaderType,\n fbxFeatures: Object.fromEntries(Object.entries(matData.model.features).map(([k, v]) => [k, v?.enabled ?? false])),\n };\n return material;\n }\n\n private _createPbrMaterial(matData: FBXMaterialData, scene: Scene, rootUrl: string): PBRMaterial {\n const material = new PBRMaterial(matData.name, scene);\n const pbr = matData.model.pbr;\n const features = matData.model.features;\n const enabled = (name: keyof typeof features) => features[name]?.enabled ?? false;\n const specGloss = matData.model.shaderType === \"3dsMaxPbrSpecGloss\";\n\n const scaleColor = (c: [number, number, number] | undefined, f: number | undefined): Color3 | undefined =>\n c ? new Color3(c[0] * (f ?? 1), c[1] * (f ?? 1), c[2] * (f ?? 1)) : undefined;\n\n // Base colour\n const baseColor = mapColor(pbr.baseColor);\n material.albedoColor = scaleColor(baseColor, pbr.baseColor?.texture ? 1 : mapScalar(pbr.baseFactor)) ?? Color3.White();\n\n // Metal / rough or spec / gloss workflow\n if (specGloss) {\n material.metallic = null;\n material.roughness = null;\n material.reflectivityColor = scaleColor(mapColor(pbr.specularColor), 1) ?? Color3.White();\n material.microSurface = mapScalar(pbr.glossiness) ?? 1 - (mapScalar(pbr.roughness) ?? 0.5);\n } else {\n material.metallic = enabled(\"metalness\") ? (mapScalar(pbr.metalness) ?? 0) : 0;\n material.roughness = mapScalar(pbr.roughness) ?? (pbr.glossiness?.value ? 1 - pbr.glossiness.value[0] : 0.5);\n if (enabled(\"specular\") && pbr.specularFactor?.value) {\n material.metallicF0Factor = mapScalar(pbr.specularFactor) ?? 1;\n }\n if (enabled(\"specular\")) {\n const specularColor = mapColor(pbr.specularColor);\n if (specularColor) {\n material.metallicReflectanceColor = new Color3(specularColor[0], specularColor[1], specularColor[2]);\n }\n }\n }\n\n // Emission\n const emission = scaleColor(mapColor(pbr.emissionColor), pbr.emissionColor?.texture ? 1 : mapScalar(pbr.emissionFactor));\n if (emission && enabled(\"emission\")) {\n material.emissiveColor = emission;\n } else if (emission && (emission.r > 0 || emission.g > 0 || emission.b > 0)) {\n material.emissiveColor = emission;\n }\n\n // Opacity / transparency\n const opacity = mapColor(pbr.opacity);\n if (opacity && enabled(\"opacity\")) {\n material.alpha = (opacity[0] + opacity[1] + opacity[2]) / 3;\n } else if (!isPbrShaderType(matData.model.shaderType)) {\n material.alpha = FBXFileLoader._alphaFromClassicTransparency(matData);\n }\n if (material.alpha < 1) {\n material.transparencyMode = Material.MATERIAL_ALPHABLEND;\n }\n\n // Transmission (refraction)\n const transmission = mapScalar(pbr.transmissionFactor) ?? 0;\n if (enabled(\"transmission\") && isPbrShaderType(matData.model.shaderType) && transmission > 0) {\n material.subSurface.isRefractionEnabled = true;\n material.subSurface.refractionIntensity = transmission;\n const tint = mapColor(pbr.transmissionColor);\n if (tint) {\n material.subSurface.tintColor = new Color3(tint[0], tint[1], tint[2]);\n }\n const ior = mapScalar(pbr.specularIor);\n if (ior && enabled(\"ior\")) {\n material.subSurface.indexOfRefraction = ior;\n }\n } else {\n const ior = mapScalar(pbr.specularIor);\n if (ior && enabled(\"ior\") && ior > 1) {\n material.indexOfRefraction = ior;\n }\n }\n\n // Clear coat\n const coat = mapScalar(pbr.coatFactor) ?? 0;\n if ((enabled(\"coat\") && coat > 0) || pbr.coatFactor?.texture) {\n material.clearCoat.isEnabled = true;\n material.clearCoat.intensity = coat;\n const coatRough = mapScalar(pbr.coatRoughness);\n if (coatRough !== undefined) {\n material.clearCoat.roughness = coatRough;\n }\n const coatIor = mapScalar(pbr.coatIor);\n if (coatIor !== undefined && coatIor > 1) {\n material.clearCoat.indexOfRefraction = coatIor;\n }\n const coatColor = mapColor(pbr.coatColor);\n if (coatColor && (coatColor[0] !== 1 || coatColor[1] !== 1 || coatColor[2] !== 1)) {\n material.clearCoat.isTintEnabled = true;\n material.clearCoat.tintColor = new Color3(coatColor[0], coatColor[1], coatColor[2]);\n }\n }\n\n // Sheen\n const sheen = mapScalar(pbr.sheenFactor) ?? 0;\n if ((enabled(\"sheen\") && sheen > 0) || pbr.sheenColor?.texture) {\n material.sheen.isEnabled = true;\n material.sheen.intensity = sheen;\n const sheenColor = mapColor(pbr.sheenColor);\n if (sheenColor) {\n material.sheen.color = new Color3(sheenColor[0], sheenColor[1], sheenColor[2]);\n }\n const sheenRough = mapScalar(pbr.sheenRoughness);\n if (sheenRough !== undefined) {\n material.sheen.roughness = sheenRough;\n }\n }\n\n if (enabled(\"unlit\")) {\n material.unlit = true;\n }\n if (enabled(\"doubleSided\")) {\n material.backFaceCulling = false;\n }\n\n // Textures\n const textureFor = (map: { texture?: FBXTextureRef; textureEnabled: boolean } | undefined, isNormal = false): Nullable<Texture> => {\n if (!map?.texture || !map.textureEnabled) {\n return null;\n }\n const texture = FBXFileLoader._createTexture(map.texture, scene, rootUrl, isNormal);\n if (texture) {\n FBXFileLoader._applyTextureSettings(texture, map.texture);\n }\n return texture;\n };\n\n const albedo = textureFor(pbr.baseColor);\n if (albedo) {\n material.albedoTexture = albedo;\n }\n const normal = textureFor(pbr.normalMap, true);\n if (normal) {\n material.bumpTexture = normal;\n this._configureNormalTexture(normal, material);\n }\n const emissiveTex = textureFor(pbr.emissionColor);\n if (emissiveTex) {\n material.emissiveTexture = emissiveTex;\n if (!emission || (emission.r === 0 && emission.g === 0 && emission.b === 0)) {\n material.emissiveColor = Color3.White();\n }\n }\n const ao = textureFor(pbr.ambientOcclusion);\n if (ao) {\n material.ambientTexture = ao;\n material.useAmbientInGrayScale = true;\n }\n if (specGloss) {\n const spec = textureFor(pbr.specularColor);\n if (spec) {\n material.reflectivityTexture = spec;\n }\n const gloss = textureFor(pbr.glossiness) ?? textureFor(pbr.roughness);\n if (gloss) {\n material.microSurfaceTexture = gloss;\n }\n } else {\n // Babylon reads metalness and roughness from one texture (B = metal, G = rough). Grayscale maps have\n // identical channels, so either map works alone; two different maps cannot both be honoured. The choice\n // is made on the references so that only the texture actually used is created.\n const metalRef = pbr.metalness?.textureEnabled ? pbr.metalness.texture : undefined;\n const roughSource =\n pbr.roughness?.textureEnabled && pbr.roughness.texture ? pbr.roughness : pbr.glossiness?.textureEnabled && pbr.glossiness.texture ? pbr.glossiness : undefined;\n const roughRef = roughSource?.texture;\n const sameTexture = !!metalRef && !!roughRef && metalRef.id === roughRef.id;\n let usesMetalTexture = false;\n if (metalRef && (sameTexture || !roughRef)) {\n const metalTex = textureFor(pbr.metalness);\n if (metalTex) {\n usesMetalTexture = true;\n material.metallicTexture = metalTex;\n material.useMetallnessFromMetallicTextureBlue = true;\n material.useRoughnessFromMetallicTextureGreen = sameTexture;\n material.useRoughnessFromMetallicTextureAlpha = false;\n }\n } else if (roughRef) {\n const roughTex = textureFor(roughSource);\n if (roughTex) {\n material.metallicTexture = roughTex;\n material.useMetallnessFromMetallicTextureBlue = false;\n material.useRoughnessFromMetallicTextureGreen = true;\n material.useRoughnessFromMetallicTextureAlpha = false;\n if (metalRef) {\n material.metadata = { ...((material.metadata as object) ?? {}), fbxDroppedMetalnessTexture: metalRef.relativeFileName };\n }\n }\n }\n // A roughness-only texture keeps the scalar metalness; a metalness texture needs metallic = 1 to show.\n if (usesMetalTexture && material.metallic === 0) {\n material.metallic = 1;\n }\n }\n if (pbr.opacity?.texture && pbr.opacity.textureEnabled) {\n if (albedo && pbr.opacity.texture.id === pbr.baseColor?.texture?.id) {\n material.useAlphaFromAlbedoTexture = true;\n material.transparencyMode = Material.MATERIAL_ALPHATESTANDBLEND;\n } else {\n const opacityTex = textureFor(pbr.opacity);\n if (opacityTex) {\n material.opacityTexture = opacityTex;\n material.transparencyMode = Material.MATERIAL_ALPHATESTANDBLEND;\n }\n }\n }\n if (material.clearCoat.isEnabled) {\n const coatTex = textureFor(pbr.coatFactor);\n if (coatTex) {\n material.clearCoat.texture = coatTex;\n }\n const coatNormal = textureFor(pbr.coatNormal, true);\n if (coatNormal) {\n material.clearCoat.bumpTexture = coatNormal;\n }\n }\n if (material.sheen.isEnabled) {\n const sheenTex = textureFor(pbr.sheenColor);\n if (sheenTex) {\n material.sheen.texture = sheenTex;\n }\n }\n\n return material;\n }\n\n /** Alpha of a classic Lambert/Phong material: Opacity when present, otherwise 1 - TransparentColor * TransparencyFactor. */\n private static _alphaFromClassicTransparency(matData: FBXMaterialData): number {\n const props = matData.properties;\n if (props.opacity !== undefined) {\n return props.opacity;\n }\n const factor = mapScalar(matData.model.fbx.transparencyFactor);\n if (factor === undefined) {\n return 1;\n }\n const color = mapColor(matData.model.fbx.transparencyColor);\n const amount = color ? (color[0] + color[1] + color[2]) / 3 : 1;\n return Math.min(1, Math.max(0, 1 - amount * factor));\n }\n\n private static _applyTextureSettings(texture: Texture, tex: FBXTextureRef): void {\n if (tex.uvTranslation) {\n texture.uOffset = tex.uvTranslation[0];\n texture.vOffset = tex.uvTranslation[1];\n }\n if (tex.uvScaling) {\n texture.uScale = tex.uvScaling[0];\n texture.vScale = tex.uvScaling[1];\n }\n if (tex.uvRotation !== undefined) {\n texture.wAng = tex.uvRotation * (Math.PI / 180);\n }\n if (tex.uvSetIndex !== undefined) {\n texture.coordinatesIndex = tex.uvSetIndex;\n }\n if (tex.wrapU !== undefined) {\n texture.wrapU = tex.wrapU === 1 ? Texture.CLAMP_ADDRESSMODE : Texture.WRAP_ADDRESSMODE;\n }\n if (tex.wrapV !== undefined) {\n texture.wrapV = tex.wrapV === 1 ? Texture.CLAMP_ADDRESSMODE : Texture.WRAP_ADDRESSMODE;\n }\n if (tex.uvSetName || tex.layeredTextureId !== undefined) {\n texture.metadata = {\n ...((texture.metadata as object) ?? {}),\n ...(tex.uvSetName ? { fbxUVSetName: tex.uvSetName } : {}),\n ...(tex.layeredTextureId !== undefined ? { fbxLayeredTextureId: tex.layeredTextureId } : {}),\n };\n }\n }\n\n private _createStandardMaterial(matData: FBXMaterialData, scene: Scene, rootUrl: string): StandardMaterial {\n const material = new StandardMaterial(matData.name, scene);\n\n const props = matData.properties;\n const hasTexture = (...slots: string[]): boolean => matData.textures.some((texture) => slots.includes(texture.propertyName));\n\n if (matData.type === \"Lambert\") {\n material.specularColor = Color3.Black();\n }\n\n if (props.diffuseColor) {\n const diffuseFactor = hasTexture(\"DiffuseColor\", \"Diffuse\") ? 1 : (props.diffuseFactor ?? 1);\n material.diffuseColor = new Color3(props.diffuseColor[0] * diffuseFactor, props.diffuseColor[1] * diffuseFactor, props.diffuseColor[2] * diffuseFactor);\n }\n\n if (props.ambientColor) {\n const ambientFactor = hasTexture(\"AmbientColor\", \"Ambient\") ? 1 : (props.ambientFactor ?? 1);\n material.ambientColor = new Color3(props.ambientColor[0] * ambientFactor, props.ambientColor[1] * ambientFactor, props.ambientColor[2] * ambientFactor);\n }\n\n if (matData.type === \"Phong\" && props.specularColor) {\n const specularFactor = hasTexture(\"SpecularColor\", \"Specular\", \"Shininess\", \"ShininessExponent\") ? 1 : (props.specularFactor ?? 1);\n material.specularColor = new Color3(props.specularColor[0] * specularFactor, props.specularColor[1] * specularFactor, props.specularColor[2] * specularFactor);\n }\n\n if (props.emissiveColor) {\n const emissiveFactor = hasTexture(\"EmissiveColor\", \"Emissive\") ? 1 : (props.emissiveFactor ?? 1);\n material.emissiveColor = new Color3(props.emissiveColor[0] * emissiveFactor, props.emissiveColor[1] * emissiveFactor, props.emissiveColor[2] * emissiveFactor);\n }\n\n material.alpha = FBXFileLoader._alphaFromClassicTransparency(matData);\n\n if (material.alpha < 1) {\n material.transparencyMode = Material.MATERIAL_ALPHABLEND;\n }\n\n if (props.shininess !== undefined) {\n material.specularPower = props.shininess;\n }\n\n // Apply textures\n for (const tex of matData.textures) {\n if (!FBXFileLoader._isSupportedMaterialTextureSlot(tex.propertyName)) {\n continue;\n }\n\n const texture = FBXFileLoader._createTexture(tex, scene, rootUrl, FBXFileLoader._isNormalMapTextureSlot(tex.propertyName));\n if (!texture) {\n continue;\n }\n\n switch (tex.propertyName) {\n case \"DiffuseColor\":\n material.diffuseTexture = texture;\n // In FBX, a connected diffuse texture provides the color.\n // Set diffuseColor to white so the texture isn't darkened by\n // the material's base color (many FBX exports set it near-black).\n material.diffuseColor = new Color3(1, 1, 1);\n break;\n case \"NormalMap\":\n case \"NormalMapTexture\":\n case \"normalCamera\":\n material.bumpTexture = texture;\n this._configureNormalTexture(texture, material);\n break;\n case \"Bump\":\n case \"BumpFactor\":\n material.bumpTexture = texture;\n this._configureNormalTexture(texture, material);\n break;\n case \"EmissiveColor\":\n material.emissiveTexture = texture;\n break;\n case \"AmbientColor\":\n material.ambientTexture = texture;\n break;\n case \"SpecularColor\":\n material.specularTexture = texture;\n break;\n case \"TransparencyFactor\":\n case \"TransparentColor\":\n material.opacityTexture = texture;\n material.transparencyMode = Material.MATERIAL_ALPHATESTANDBLEND;\n break;\n case \"ReflectionColor\":\n case \"ReflectionFactor\":\n material.reflectionTexture = texture;\n break;\n case \"DisplacementColor\":\n case \"Displacement\":\n case \"DisplacementFactor\":\n // StandardMaterial doesn't have a displacement slot natively;\n // store for potential PBR conversion use\n break;\n case \"ShininessExponent\":\n case \"Shininess\":\n // Shininess map — no direct StandardMaterial slot\n break;\n }\n\n FBXFileLoader._applyTextureSettings(texture, tex);\n }\n\n return material;\n }\n\n private _configureNormalTexture(texture: Texture, material: StandardMaterial | PBRMaterial): void {\n texture.gammaSpace = false;\n material.invertNormalMapX = false;\n material.invertNormalMapY = this._options.normalMapCoordinateSystem === \"y-down\";\n }\n\n private _getNormalMapTangentHandednessScale(): 1 | -1 {\n return this._options.normalMapCoordinateSystem === \"y-down\" ? -1 : 1;\n }\n\n private static _isSupportedMaterialTextureSlot(propertyName: string): boolean {\n switch (propertyName) {\n case \"DiffuseColor\":\n case \"NormalMap\":\n case \"NormalMapTexture\":\n case \"normalCamera\":\n case \"Bump\":\n case \"BumpFactor\":\n case \"EmissiveColor\":\n case \"AmbientColor\":\n case \"SpecularColor\":\n case \"TransparencyFactor\":\n case \"TransparentColor\":\n case \"ReflectionColor\":\n case \"ReflectionFactor\":\n case \"DisplacementColor\":\n case \"Displacement\":\n case \"DisplacementFactor\":\n case \"ShininessExponent\":\n case \"Shininess\":\n return true;\n default:\n return false;\n }\n }\n\n private static _isNormalMapTextureSlot(propertyName: string): boolean {\n switch (propertyName) {\n case \"NormalMap\":\n case \"NormalMapTexture\":\n case \"normalCamera\":\n case \"Bump\":\n case \"BumpFactor\":\n return true;\n default:\n return false;\n }\n }\n\n private static _createTexture(tex: FBXTextureRef, scene: Scene, rootUrl: string, isDataTexture: boolean): Nullable<Texture> {\n const sourceName = FBXFileLoader._getTextureSourceName(tex);\n const creationOptions = FBXFileLoader._getTextureCreationOptions(sourceName, isDataTexture, tex.embeddedData);\n\n if (tex.embeddedData) {\n const texture = new Texture(null, scene, creationOptions);\n const embeddedTextureName = sourceName ?? `embeddedTexture_${tex.id.toString()}`;\n texture.updateURL(`data:fbx-embedded-texture/${encodeURIComponent(embeddedTextureName)}`, new Uint8Array(tex.embeddedData), undefined, creationOptions.forcedExtension);\n texture.name = embeddedTextureName;\n return texture;\n }\n\n const textureUrls = FBXFileLoader._getExternalTextureUrls(tex, rootUrl);\n const textureUrl = textureUrls.shift();\n if (!textureUrl) {\n return null;\n }\n\n return FBXFileLoader._createExternalTexture(textureUrl, textureUrls, scene, creationOptions);\n }\n\n private static _createExternalTexture(texturePath: string, fallbackUrls: string[], scene: Scene, creationOptions: ITextureCreationOptions): Texture {\n fallbackUrls.push(...FBXFileLoader._buildTextureFallbackUrls(texturePath));\n let fallbackIndex = 0;\n const texture = new Texture(texturePath, scene, {\n ...creationOptions,\n onError: () => {\n const fallbackUrl = fallbackUrls[fallbackIndex++];\n if (fallbackUrl && texture.getScene()) {\n texture.updateURL(fallbackUrl, null, undefined, FBXFileLoader._getForcedExtension(fallbackUrl));\n }\n },\n });\n return texture;\n }\n\n private static _buildTextureFallbackUrls(texturePath: string): string[] {\n const slashIndex = Math.max(texturePath.lastIndexOf(\"/\"), texturePath.lastIndexOf(\"\\\\\"));\n const dotIndex = texturePath.lastIndexOf(\".\");\n if (dotIndex <= slashIndex) {\n return [];\n }\n\n const basePath = texturePath.slice(0, dotIndex);\n const currentExtension = texturePath.slice(dotIndex + 1).toLowerCase();\n const extensionFallbacks = [\"png\", \"jpg\", \"jpeg\", \"webp\", \"bmp\", \"tga\"];\n return extensionFallbacks.filter((extension) => extension !== currentExtension).map((extension) => `${basePath}.${extension}`);\n }\n\n private static _getTextureCreationOptions(sourceName: Nullable<string>, isDataTexture: boolean, embeddedData: Nullable<Uint8Array>): ITextureCreationOptions {\n const mimeType = embeddedData ? (sourceName ? FBXFileLoader._getMimeType(sourceName) : \"image/png\") : undefined;\n return {\n buffer: embeddedData ? new Uint8Array(embeddedData) : undefined,\n forcedExtension: sourceName ? FBXFileLoader._getForcedExtension(sourceName, mimeType) : embeddedData ? \".png\" : undefined,\n gammaSpace: !isDataTexture,\n mimeType,\n };\n }\n\n private static _getExternalTextureUrls(tex: FBXTextureRef, rootUrl: string): string[] {\n const textureNames = [tex.relativeFileName, tex.fileName].filter((name): name is string => !!name);\n const urls: string[] = [];\n\n for (const textureName of textureNames) {\n const normalized = textureName.replace(/\\\\/g, \"/\");\n if (FBXFileLoader._isSafeRelativeTexturePath(normalized)) {\n urls.push(rootUrl + normalized);\n }\n\n const basename = FBXFileLoader._getTextureSourceNameFromPath(normalized);\n if (basename) {\n urls.push(rootUrl + basename);\n }\n }\n\n return Array.from(new Set(urls));\n }\n\n private static _getTextureSourceName(tex: FBXTextureRef): Nullable<string> {\n const textureName = tex.relativeFileName || tex.fileName;\n if (!textureName) {\n return null;\n }\n const normalized = textureName.replace(/\\\\/g, \"/\");\n return FBXFileLoader._getTextureSourceNameFromPath(normalized);\n }\n\n private static _getTextureSourceNameFromPath(texturePath: string): Nullable<string> {\n return texturePath.split(\"/\").pop() ?? texturePath;\n }\n\n private static _isSafeRelativeTexturePath(texturePath: string): boolean {\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(texturePath) || texturePath.startsWith(\"/\") || texturePath.startsWith(\"//\")) {\n return false;\n }\n\n return !texturePath.split(\"/\").some((part) => part === \"..\");\n }\n\n private static _getForcedExtension(fileName: string, mimeType?: string): string | undefined {\n const slashIndex = Math.max(fileName.lastIndexOf(\"/\"), fileName.lastIndexOf(\"\\\\\"));\n const dotIndex = fileName.lastIndexOf(\".\");\n if (dotIndex > slashIndex) {\n return fileName.slice(dotIndex).toLowerCase();\n }\n\n switch (mimeType) {\n case \"image/png\":\n return \".png\";\n case \"image/jpeg\":\n return \".jpg\";\n case \"image/webp\":\n return \".webp\";\n case \"image/bmp\":\n return \".bmp\";\n case \"image/gif\":\n return \".gif\";\n case \"image/x-tga\":\n return \".tga\";\n default:\n return undefined;\n }\n }\n\n private static _getMimeType(fileName: string): string {\n const mimeType = GetMimeType(fileName);\n if (mimeType) {\n return mimeType;\n }\n\n const extension = FBXFileLoader._getForcedExtension(fileName);\n switch (extension) {\n case \".tga\":\n return \"image/x-tga\";\n case \".bmp\":\n return \"image/bmp\";\n case \".gif\":\n return \"image/gif\";\n default:\n return \"image/png\";\n }\n }\n\n /**\n * Apply blend shape (morph target) deformers to meshes.\n * FBX Shape vertices are stored as absolute positions for sparse control points.\n * We compute deltas relative to the base mesh positions.\n */\n private _applyBlendShapes(blendShapes: FBXBlendShapeData[], meshes: Mesh[], scene: Scene): void {\n // Build a map from geometry ID to mesh (using the mesh metadata we'll need to store)\n // The mesh's geometry ID is tracked through the model hierarchy during _buildModel.\n // We need to match blendShape.geometryId to the correct mesh.\n // Strategy: match by examining which meshes have positions matching the geometry.\n\n for (const bs of blendShapes) {\n // Find the mesh that uses this geometry\n const mesh = meshes.find((m) => {\n const geomId = (m.metadata as { fbxGeometryId?: number } | undefined)?.fbxGeometryId;\n return geomId === bs.geometryId;\n });\n if (!mesh) {\n continue;\n }\n\n const morphTargetManager = new MorphTargetManager(scene);\n morphTargetManager.optimizeInfluencers = false;\n // Get preRotation matrix if the mesh had its positions baked\n const deltaMatrix =\n (mesh.metadata as { fbxGeometryDeltaMatrix?: Matrix | null; fbxPreRotMatrix?: Matrix | null } | undefined)?.fbxGeometryDeltaMatrix ??\n (mesh.metadata as { fbxPreRotMatrix?: Matrix | null } | undefined)?.fbxPreRotMatrix ??\n null;\n const normalMatrix = (mesh.metadata as { fbxGeometryNormalMatrix?: Matrix | null } | undefined)?.fbxGeometryNormalMatrix ?? deltaMatrix;\n\n for (const channel of bs.channels) {\n // Get the control point indices for this mesh (stored as metadata)\n const cpIndices = (mesh.metadata as { fbxControlPointIndices?: Uint32Array } | undefined)?.fbxControlPointIndices;\n if (!cpIndices) {\n continue;\n }\n\n const basePositions = mesh.getVerticesData(\"position\");\n const baseNormals = mesh.getVerticesData(\"normal\");\n if (!basePositions) {\n continue;\n }\n\n const initialInfluences = calculateBlendShapeInfluences(channel.deformPercent, channel.fullWeights, channel.shapes.length);\n const targetIndices: number[] = [];\n for (let shapeIndex = 0; shapeIndex < channel.shapes.length; shapeIndex++) {\n const shape = channel.shapes[shapeIndex];\n if (!shape) {\n continue;\n }\n const targetData = buildMorphTargetData(shape, cpIndices, basePositions, baseNormals, deltaMatrix, normalMatrix);\n if (!targetData) {\n continue;\n }\n\n const targetName = channel.fullWeights && channel.shapes.length > 1 ? `${channel.name}_${channel.fullWeights[shapeIndex]}` : channel.name;\n const morphTarget = new MorphTarget(targetName, initialInfluences[shapeIndex] ?? 0, scene);\n morphTarget.setPositions(targetData.positions);\n if (targetData.normals) {\n morphTarget.setNormals(targetData.normals);\n }\n\n targetIndices.push(morphTargetManager.numTargets);\n morphTargetManager.addTarget(morphTarget);\n }\n\n if (targetIndices.length === 0) {\n continue;\n }\n\n // Store channel ID mapping on the mesh for animation targeting.\n // Keep the legacy single-target map for existing consumers and add\n // richer in-between metadata for FullWeights-aware animation baking.\n if (!mesh.metadata) {\n mesh.metadata = {};\n }\n if (!(mesh.metadata as Record<string, unknown>).fbxBlendShapeChannelIds) {\n (mesh.metadata as Record<string, unknown>).fbxBlendShapeChannelIds = new Map<number, number>();\n }\n ((mesh.metadata as Record<string, unknown>).fbxBlendShapeChannelIds as Map<number, number>).set(channel.id, targetIndices[0]);\n if (!(mesh.metadata as Record<string, unknown>).fbxBlendShapeChannelTargets) {\n (mesh.metadata as Record<string, unknown>).fbxBlendShapeChannelTargets = new Map<number, { targetIndices: number[]; fullWeights: number[] | null }>();\n }\n ((mesh.metadata as Record<string, unknown>).fbxBlendShapeChannelTargets as Map<number, { targetIndices: number[]; fullWeights: number[] | null }>).set(channel.id, {\n targetIndices,\n fullWeights: channel.fullWeights,\n });\n }\n\n if (morphTargetManager.numTargets > 0) {\n morphTargetManager.numMaxInfluencers = morphTargetManager.numTargets;\n mesh.morphTargetManager = morphTargetManager;\n }\n }\n }\n\n private _createCamera(camData: FBXCameraData, modelIdToNode: Map<number, TransformNode>, scene: Scene): FreeCamera | null {\n const parentNode = modelIdToNode.get(camData.modelId);\n const worldMatrix = parentNode ? parentNode.computeWorldMatrix(true) : Matrix.Identity();\n const position = Vector3.TransformCoordinates(Vector3.Zero(), worldMatrix);\n\n const camera = new FreeCamera(camData.name, position, scene);\n camera.fov = camData.fieldOfView * (Math.PI / 180);\n camera.fovMode = Camera.FOVMODE_VERTICAL_FIXED;\n void position;\n camera.minZ = camData.nearPlane;\n camera.maxZ = camData.farPlane;\n camera.metadata = {\n ...((camera.metadata as object) ?? {}),\n fbxCamera: {\n projectionType: camData.projectionType,\n focalLength: camData.focalLength,\n filmWidth: camData.filmWidth,\n filmHeight: camData.filmHeight,\n orthoZoom: camData.orthoZoom,\n roll: camData.roll,\n aspectRatio: camData.aspectRatio,\n fieldOfViewX: camData.fieldOfViewX,\n apertureMode: camData.apertureMode,\n apertureSizeInch: camData.apertureSizeInch,\n userProperties: camData.userProperties,\n unknownProperties: camData.unknownProperties,\n diagnostics: camData.diagnostics,\n },\n };\n\n if (camData.projectionType === \"orthographic\") {\n camera.mode = Camera.ORTHOGRAPHIC_CAMERA;\n camera.orthoTop = camData.orthographicSize[1] / 2;\n camera.orthoBottom = -camData.orthographicSize[1] / 2;\n camera.orthoRight = camData.orthographicSize[0] / 2;\n camera.orthoLeft = -camData.orthographicSize[0] / 2;\n }\n\n // FBX cameras look down their local +X axis. When attached, the camera is parented to its node so it follows\n // the node's animation, and oriented with a fixed local rotation (camera forward +Z -> node +X), with the FBX\n // Roll applied around the view axis first. Otherwise it is placed in world space, unparented.\n if (parentNode && this._options.attachCamerasAndLights) {\n // The handedness conversion at the root mirrors every node's world matrix. A camera cannot render through\n // a mirrored parent (its view matrix would flip the image and the winding), so when the node's world\n // determinant is negative the camera hangs from a pivot whose own mirror cancels it.\n let cameraParent: TransformNode = parentNode;\n if (worldMatrix.determinant() < 0) {\n const pivot = new TransformNode(`${camData.name}__fbx_cameraPivot`, scene);\n pivot.parent = parentNode;\n pivot.scaling.set(1, 1, -1);\n cameraParent = pivot;\n }\n camera.parent = cameraParent;\n camera.position.set(0, 0, 0);\n const roll = ((camData.roll ?? 0) * Math.PI) / 180;\n camera.rotationQuaternion = Quaternion.FromRotationMatrix(Matrix.RotationZ(roll).multiply(Matrix.RotationY(Math.PI / 2)));\n } else {\n const target = Vector3.TransformCoordinates(new Vector3(1, 0, 0), worldMatrix);\n camera.setTarget(target);\n }\n\n return camera;\n }\n\n private _createLight(lightData: FBXLightData, modelIdToNode: Map<number, TransformNode>, scene: Scene): PointLight | DirectionalLight | SpotLight | null {\n const parentNode = modelIdToNode.get(lightData.modelId);\n const worldMatrix = parentNode ? parentNode.computeWorldMatrix(true) : Matrix.Identity();\n const position = Vector3.TransformCoordinates(Vector3.Zero(), worldMatrix);\n const color = new Color3(lightData.color[0], lightData.color[1], lightData.color[2]);\n\n // FBX lights point down their local -Z axis. Derive the world-space direction from two points\n // transformed by the node's world matrix so the handedness conversion (the left-handed root\n // applies scaling.z = -1) is reproduced correctly; transforming the direction as a normal\n // would mirror it under that reflection and point the light the wrong way.\n const forwardPoint = Vector3.TransformCoordinates(new Vector3(0, 0, -1), worldMatrix);\n const direction = forwardPoint.subtract(position).normalize();\n\n let light: PointLight | DirectionalLight | SpotLight;\n\n // When attached, the light is parented to its node (so it follows animation) and its position and direction\n // are expressed in node-local space: origin and local -Z. Otherwise it is placed in world space, unparented.\n const attach = !!parentNode && this._options.attachCamerasAndLights;\n const localPosition = attach ? Vector3.Zero() : position;\n const localDirection = attach ? new Vector3(0, 0, -1) : direction;\n\n switch (lightData.lightType) {\n case 1: // Directional\n light = new DirectionalLight(lightData.name, localDirection, scene);\n light.diffuse = color;\n light.intensity = lightData.intensity;\n break;\n case 2: {\n // Spot\n const angle = lightData.coneAngle * (Math.PI / 180);\n light = new SpotLight(lightData.name, localPosition, localDirection, angle, 2, scene);\n light.diffuse = color;\n light.intensity = lightData.intensity;\n if (lightData.innerAngle !== undefined) {\n light.innerAngle = Math.min(angle, (lightData.innerAngle * Math.PI) / 180);\n }\n break;\n }\n default: // Point (0), Area (3) and Volume (4) approximated as point lights\n light = new PointLight(lightData.name, localPosition, scene);\n light.diffuse = color;\n light.intensity = lightData.intensity;\n break;\n }\n if (attach && parentNode) {\n light.parent = parentNode;\n // Babylon only resolves a parented light's world position and direction during rendering; do it now\n // so getAbsolutePosition() and transformedDirection are usable straight after loading.\n light.computeTransformedInformation();\n }\n light.specular = color;\n if (lightData.enableFarAttenuation && lightData.farAttenuationEnd !== undefined && lightData.farAttenuationEnd > 0) {\n light.range = lightData.farAttenuationEnd;\n }\n\n light.metadata = {\n ...((light.metadata as object) ?? {}),\n fbxLight: {\n lightType: lightData.lightType,\n decayType: lightData.decayType,\n decayStart: lightData.decayStart,\n innerAngle: lightData.innerAngle,\n outerAngle: lightData.outerAngle,\n enableNearAttenuation: lightData.enableNearAttenuation,\n enableFarAttenuation: lightData.enableFarAttenuation,\n castShadows: lightData.castShadows,\n farAttenuationStart: lightData.farAttenuationStart,\n farAttenuationEnd: lightData.farAttenuationEnd,\n areaLightShape: lightData.areaLightShape,\n userProperties: lightData.userProperties,\n unknownProperties: lightData.unknownProperties,\n diagnostics: lightData.diagnostics,\n },\n };\n\n return light;\n }\n\n private _createSkeleton(skeletonId: string, bones: FBXBoneData[], scene: Scene): Skeleton {\n const skeleton = new Skeleton(\"Skeleton\", `skeleton_${skeletonId}`, scene);\n const sourceBones: Bone[] = [];\n const scaleCompensationHelpers = new Map<number, Bone>();\n const authoredLocalMatrices: Matrix[] = [];\n const authoredAbsoluteMatrices: Matrix[] = [];\n const authoredRuntimeLocalMatrices: Matrix[] = [];\n\n // Compute authored Lcl matrices for bones that do not carry FBX bind data.\n const authoredInheritScales = FBXFileLoader._computeBoneInheritScales(\n bones,\n bones.map((b) => b.scale)\n );\n for (let i = 0; i < bones.length; i++) {\n const boneData = bones[i];\n const authoredLocal = FBXFileLoader._computeFBXLocalMatrix(\n boneData.translation,\n boneData.rotation,\n boneData.scale,\n boneData.preRotation,\n boneData.postRotation,\n boneData.rotationPivot,\n boneData.scalingPivot,\n boneData.rotationOffset,\n boneData.scalingOffset,\n boneData.rotationOrder\n );\n authoredLocalMatrices[i] = authoredLocal;\n authoredRuntimeLocalMatrices[i] = FBXFileLoader._computeFBXRuntimeLocalMatrix(bones, authoredLocal, i, authoredInheritScales);\n }\n authoredAbsoluteMatrices.push(...FBXFileLoader._computeFBXAbsoluteMatrices(bones, authoredRuntimeLocalMatrices));\n\n const absoluteBindMatrices = bones.map((boneData, index) =>\n boneData.transformLinkMatrix\n ? Matrix.FromArray(boneData.transformLinkMatrix)\n : boneData.modelBindPoseMatrix\n ? Matrix.FromArray(boneData.modelBindPoseMatrix)\n : authoredAbsoluteMatrices[index]\n );\n\n const localBindMatrices = absoluteBindMatrices.map((absoluteBind, index) => {\n const parentIndex = bones[index].parentIndex;\n if (parentIndex < 0) {\n return absoluteBind;\n }\n\n const parentAbsoluteBindInv = new Matrix();\n absoluteBindMatrices[parentIndex].invertToRef(parentAbsoluteBindInv);\n return absoluteBind.multiply(parentAbsoluteBindInv);\n });\n const useBindAsRest = FBXFileLoader._shouldUseBindMatricesAsRest(bones, authoredLocalMatrices, localBindMatrices);\n\n // Most animation curves naturally target authored Lcl transforms. Use\n // bind matrices as live rest pose only for rigs with severe bind/local\n // scale disagreement, which otherwise produce invalid skin matrices.\n // Only bones with that scale disagreement need their animation curves\n // remapped into bind-rest space; ordinary child curves are already in\n // the expected local animation space.\n const restInheritScales = FBXFileLoader._computeBoneInheritScales(\n bones,\n bones.map((b) => b.scale)\n );\n for (let i = 0; i < bones.length; i++) {\n let localMatrix = useBindAsRest ? localBindMatrices[i] : authoredRuntimeLocalMatrices[i];\n let parentBone = bones[i].parentIndex >= 0 ? sourceBones[bones[i].parentIndex] : null;\n if (!useBindAsRest && bones[i].inheritType !== 1 && bones[i].parentIndex >= 0 && parentBone) {\n const split = FBXFileLoader._splitParentScaleCompensatedLocalMatrix(\n authoredLocalMatrices[i],\n restInheritScales[bones[i].parentIndex],\n FBXFileLoader._getBoneInheritedScale(bones, i, restInheritScales)\n );\n const helper = new Bone(\n `${bones[i].name}__fbx_scaleCompensation`,\n skeleton,\n parentBone,\n split.helperLocalMatrix,\n split.helperLocalMatrix.clone(),\n Matrix.Identity(),\n -1\n );\n helper.metadata = {\n ...((helper.metadata as object) ?? {}),\n fbxScaleCompensationForBoneIndex: i,\n fbxScaleCompensationForBoneName: bones[i].name,\n };\n scaleCompensationHelpers.set(i, helper);\n parentBone = helper;\n localMatrix = split.boneLocalMatrix;\n }\n const bone = new Bone(bones[i].name, skeleton, parentBone, localMatrix, useBindAsRest ? localMatrix.clone() : null, useBindAsRest ? localMatrix.clone() : null, i);\n if (useBindAsRest && bones[i].isCluster && FBXFileLoader._getMaxScaleRatio(authoredLocalMatrices[i], localBindMatrices[i]) >= BIND_REST_SCALE_RATIO_THRESHOLD) {\n this._bindRestBones.add(bone);\n }\n sourceBones.push(bone);\n }\n this._sourceBonesBySkeleton.set(skeleton, sourceBones);\n this._scaleCompensationHelpersBySkeleton.set(skeleton, scaleCompensationHelpers);\n\n if (!useBindAsRest) {\n for (let i = 0; i < bones.length; i++) {\n const bone = sourceBones[i];\n bone.updateMatrix(localBindMatrices[i], false, false);\n }\n for (const helper of Array.from(scaleCompensationHelpers.values())) {\n helper.updateMatrix(Matrix.Identity(), false, false);\n }\n for (const bone of skeleton.bones) {\n if (!bone.getParent()) {\n bone._updateAbsoluteBindMatrices(undefined, true);\n }\n }\n }\n\n return skeleton;\n }\n\n private _rigBoneModelIds = new Set<number>();\n\n private _isRigBone(modelId: number): boolean {\n return this._rigBoneModelIds.has(modelId);\n }\n\n private _getSourceBone(skeleton: Skeleton, sourceIndex: number): Bone | undefined {\n return this._sourceBonesBySkeleton.get(skeleton)?.[sourceIndex] ?? skeleton.bones[sourceIndex];\n }\n\n private _getScaleCompensationHelper(skeleton: Skeleton, sourceIndex: number): Bone | undefined {\n return this._scaleCompensationHelpersBySkeleton.get(skeleton)?.get(sourceIndex);\n }\n\n private static _computeFBXAbsoluteMatrices(bones: FBXBoneData[], localMatrices: Matrix[]): Matrix[] {\n const absoluteMatrices: Matrix[] = [];\n for (let i = 0; i < bones.length; i++) {\n const parentIndex = bones[i].parentIndex;\n if (parentIndex < 0) {\n absoluteMatrices[i] = localMatrices[i].clone();\n continue;\n }\n\n absoluteMatrices[i] = localMatrices[i].multiply(absoluteMatrices[parentIndex]);\n }\n return absoluteMatrices;\n }\n\n /**\n * Effective (\"inherit\") scale of every bone, following the FBX SDK: the local scale for RSrs bones, and for\n * RrSs / Rrs bones the local scale multiplied by the scale of the bone's inherit-scale node (the parent for RrSs,\n * the parent's inherit-scale node for Rrs). Bones are ordered parents first.\n */\n private static _computeBoneInheritScales(bones: FBXBoneData[], ownScales: [number, number, number][]): [number, number, number][] {\n const result: [number, number, number][] = [];\n for (let i = 0; i < bones.length; i++) {\n const own = ownScales[i];\n const inheritedFrom = FBXFileLoader._getBoneInheritScaleNode(bones, i);\n if (inheritedFrom < 0 || inheritedFrom >= i) {\n result[i] = [own[0], own[1], own[2]];\n } else {\n const p = result[inheritedFrom];\n result[i] = [own[0] * p[0], own[1] * p[1], own[2] * p[2]];\n }\n }\n return result;\n }\n\n private static _getBoneInheritScaleNode(bones: FBXBoneData[], index: number): number {\n const parentIndex = bones[index].parentIndex;\n if (parentIndex < 0) {\n return -1;\n }\n if (bones[index].inheritType === 0) {\n return parentIndex;\n }\n if (bones[index].inheritType === 2) {\n return FBXFileLoader._getBoneInheritScaleNode(bones, parentIndex);\n }\n return -1;\n }\n\n /** Scale a bone inherits into its own scale (RrSs chains), or unit scale. */\n private static _getBoneInheritedScale(bones: FBXBoneData[], index: number, inheritScales: [number, number, number][]): [number, number, number] {\n const node = FBXFileLoader._getBoneInheritScaleNode(bones, index);\n return node >= 0 ? inheritScales[node] : [1, 1, 1];\n }\n\n private static _computeFBXRuntimeLocalMatrix(bones: FBXBoneData[], localMatrix: Matrix, index: number, inheritScales?: [number, number, number][]): Matrix {\n const parentIndex = bones[index].parentIndex;\n if (bones[index].inheritType === 1 || parentIndex < 0) {\n return localMatrix;\n }\n\n const scales =\n inheritScales ??\n FBXFileLoader._computeBoneInheritScales(\n bones,\n bones.map((b) => b.scale)\n );\n return FBXFileLoader._applyParentScaleCompensation(localMatrix, scales[parentIndex], FBXFileLoader._getBoneInheritedScale(bones, index, scales));\n }\n\n private static _applyParentScaleCompensation(localMatrix: Matrix, parentScale: [number, number, number], inheritedScale?: [number, number, number]): Matrix {\n const split = FBXFileLoader._splitParentScaleCompensatedLocalMatrix(localMatrix, parentScale, inheritedScale);\n return split.boneLocalMatrix.multiply(split.helperLocalMatrix);\n }\n\n /**\n * Splits a bone's FBX local matrix into a helper (which cancels the parent scale and carries the translation,\n * so the translation still follows the parent scale as the SDK does) and the bone's own rotation/scale. For RrSs\n * bones the inherited scale is folded into the bone scale.\n */\n private static _splitParentScaleCompensatedLocalMatrix(\n localMatrix: Matrix,\n parentScale: [number, number, number],\n inheritedScale?: [number, number, number]\n ): { boneLocalMatrix: Matrix; helperLocalMatrix: Matrix } {\n const translation = localMatrix.getTranslation();\n let boneLocalMatrix = localMatrix.clone();\n boneLocalMatrix.setTranslation(Vector3.Zero());\n if (inheritedScale && (inheritedScale[0] !== 1 || inheritedScale[1] !== 1 || inheritedScale[2] !== 1)) {\n boneLocalMatrix = Matrix.Scaling(inheritedScale[0], inheritedScale[1], inheritedScale[2]).multiply(boneLocalMatrix);\n }\n const helperLocalMatrix = Matrix.Compose(FBXFileLoader._getInverseScaleVector(parentScale), Quaternion.Identity(), translation);\n return { boneLocalMatrix, helperLocalMatrix };\n }\n\n private static _safeInverseScale(value: number): number {\n return Math.abs(value) > 1e-8 ? 1 / value : 1;\n }\n\n private static _getInverseScaleVector(scale: [number, number, number]): Vector3 {\n return new Vector3(FBXFileLoader._safeInverseScale(scale[0]), FBXFileLoader._safeInverseScale(scale[1]), FBXFileLoader._safeInverseScale(scale[2]));\n }\n\n private static _shouldUseBindMatricesAsRest(bones: FBXBoneData[], authoredLocalMatrices: Matrix[], localBindMatrices: Matrix[]): boolean {\n return bones.some((bone, index) => {\n if (!bone.isCluster) {\n return false;\n }\n return FBXFileLoader._getMaxScaleRatio(authoredLocalMatrices[index], localBindMatrices[index]) >= BIND_REST_SCALE_RATIO_THRESHOLD;\n });\n }\n\n private static _getMaxScaleRatio(a: Matrix, b: Matrix): number {\n const scaleA = new Vector3();\n const rotationA = new Quaternion();\n const translationA = new Vector3();\n const scaleB = new Vector3();\n const rotationB = new Quaternion();\n const translationB = new Vector3();\n a.decompose(scaleA, rotationA, translationA);\n b.decompose(scaleB, rotationB, translationB);\n\n return Math.max(FBXFileLoader._getScaleRatio(scaleA.x, scaleB.x), FBXFileLoader._getScaleRatio(scaleA.y, scaleB.y), FBXFileLoader._getScaleRatio(scaleA.z, scaleB.z));\n }\n\n private static _getScaleRatio(a: number, b: number): number {\n const absA = Math.abs(a);\n const absB = Math.abs(b);\n if (absA < 1e-6 || absB < 1e-6) {\n return absA < 1e-6 && absB < 1e-6 ? 1 : Number.POSITIVE_INFINITY;\n }\n return Math.max(absA / absB, absB / absA);\n }\n\n private static _computeFBXGeometricMatrix(translation: [number, number, number], rotation: [number, number, number], scale: [number, number, number]): Matrix {\n return computeFBXGeometricMatrix(translation, rotation, scale);\n }\n\n private static _computeFBXGeometricDeltaMatrix(rotation: [number, number, number], scale: [number, number, number]): Matrix {\n return computeFBXGeometricDeltaMatrix(rotation, scale);\n }\n\n private static _computeFBXGeometricNormalMatrix(rotation: [number, number, number], scale: [number, number, number]): Matrix {\n return computeFBXGeometricNormalMatrix(rotation, scale);\n }\n\n /**\n * Compute the full FBX local transform matrix:\n * M = T * Roff * Rp * Rpre * R * Rpost^-1 * Rp^-1 * Soff * Sp * S * Sp^-1\n *\n * In row-vector convention: v' = v * M\n */\n private static _computeFBXLocalMatrix(\n translation: [number, number, number],\n rotation: [number, number, number],\n scale: [number, number, number],\n preRotation: [number, number, number],\n postRotation: [number, number, number],\n rotationPivot: [number, number, number],\n scalingPivot: [number, number, number],\n rotationOffset: [number, number, number],\n scalingOffset: [number, number, number],\n rotationOrder: number = 0\n ): Matrix {\n return computeFBXLocalMatrix({\n translation,\n rotation,\n scale,\n preRotation,\n postRotation,\n rotationPivot,\n scalingPivot,\n rotationOffset,\n scalingOffset,\n rotationOrder,\n });\n }\n\n private _applyRestTRS(node: TransformNode, model: FBXModelData): void {\n const trs = FBXFileLoader._computeLocalTRS(model, model.translation, model.rotation, model.scale);\n this._adjustTRSForInheritMode(model, trs, undefined);\n node.position = trs.position;\n node.rotationQuaternion = trs.rotationQuaternion;\n node.scaling = trs.scaling;\n }\n\n private static _computeFBXModelLocalMatrix(model: FBXModelData): Matrix {\n return FBXFileLoader._computeFBXLocalMatrix(\n model.translation,\n model.rotation,\n model.scale,\n model.preRotation,\n model.postRotation,\n model.rotationPivot,\n model.scalingPivot,\n model.rotationOffset,\n model.scalingOffset,\n model.rotationOrder\n );\n }\n\n private static _applyMatrixToTransform(node: TransformNode, matrix: Matrix): void {\n const s = new Vector3();\n const r = new Quaternion();\n const t = new Vector3();\n matrix.decompose(s, r, t);\n\n node.position = t;\n node.rotationQuaternion = r;\n node.scaling = s;\n }\n\n private _createAnimationGroup(\n animStack: FBXAnimationStackData,\n rigs: FBXRigData[],\n skeletonByRigId: Map<string, Skeleton>,\n scene: Scene,\n modelIdToNode: Map<number, TransformNode>,\n modelIdToData: Map<number, FBXModelData>,\n meshes: Mesh[],\n propertyTargets: { cameraByAttributeId: Map<number, FreeCamera>; lightByAttributeId: Map<number, Light>; materialCache: Map<number, Material> }\n ): AnimationGroup | null {\n // Stacks may animate only properties (visibility, light colour...) without any transform curve.\n if (animStack.curveNodes.length === 0 && !animStack.unsupportedCurveNodes.some((c) => c.targetId !== null && c.curves.length > 0)) {\n return null;\n }\n this._activeLayers = animStack.layers;\n this._curveNodesByModelId = new Map();\n for (const curveNode of animStack.curveNodes) {\n if (curveNode.type === \"DeformPercent\") {\n continue;\n }\n const list = this._curveNodesByModelId.get(curveNode.targetModelId);\n if (list) {\n list.push(curveNode);\n } else {\n this._curveNodesByModelId.set(curveNode.targetModelId, [curveNode]);\n }\n }\n\n const animGroup = new AnimationGroup(animStack.name, scene);\n const animatedBoneTargetProperties = new Map<Bone | TransformNode, Set<string>>();\n const addBoneAnimation = (animation: Animation, bone: Bone): void => {\n const target = bone.getTransformNode() ?? bone;\n let targetProperties = animatedBoneTargetProperties.get(target);\n if (!targetProperties) {\n targetProperties = new Set<string>();\n animatedBoneTargetProperties.set(target, targetProperties);\n } else if (targetProperties.has(animation.targetProperty)) {\n return;\n }\n\n targetProperties.add(animation.targetProperty);\n animGroup.addTargetedAnimation(animation, target);\n };\n\n // Build a map from model ID to resolved rig bones. A single FBX model ID\n // should only appear once per resolved rig, but keeping an array preserves\n // the previous animation fan-out behavior for any future duplicate rigs.\n const modelIdToBones = new Map<number, Bone[]>();\n for (const rig of rigs) {\n const skeleton = skeletonByRigId.get(rig.id);\n if (!skeleton) {\n continue;\n }\n\n for (const boneData of rig.bones) {\n const bone = this._getSourceBone(skeleton, boneData.index);\n if (!bone) {\n continue;\n }\n\n const bones = modelIdToBones.get(boneData.modelId);\n if (bones) {\n bones.push(bone);\n } else {\n modelIdToBones.set(boneData.modelId, [bone]);\n }\n }\n }\n\n // Group curve nodes by target\n const boneCurves = new Map<number, FBXCurveNodeData[]>();\n const nonBoneCurves = new Map<number, FBXCurveNodeData[]>();\n const blendShapeCurves: FBXCurveNodeData[] = [];\n\n for (const curveNode of animStack.curveNodes) {\n if (curveNode.type === \"DeformPercent\") {\n blendShapeCurves.push(curveNode);\n continue;\n }\n\n if (modelIdToBones.has(curveNode.targetModelId)) {\n if (!boneCurves.has(curveNode.targetModelId)) {\n boneCurves.set(curveNode.targetModelId, []);\n }\n boneCurves.get(curveNode.targetModelId)!.push(curveNode);\n } else {\n if (!nonBoneCurves.has(curveNode.targetModelId)) {\n nonBoneCurves.set(curveNode.targetModelId, []);\n }\n nonBoneCurves.get(curveNode.targetModelId)!.push(curveNode);\n }\n }\n\n // Process bone targets: compute full FBX local matrix per frame, decompose to TRS.\n // For bind-rest rigs, only the bones recorded in _bindRestBones need their\n // authored Lcl curves remapped onto the bind-rest local space.\n const inheritedRigModelIds = new Set<number>();\n for (const rig of rigs) {\n const inheritType2ModelIds = new Set(rig.bones.filter((bone) => bone.inheritType !== 1 && bone.parentIndex >= 0).map((bone) => bone.modelId));\n if (inheritType2ModelIds.size === 0) {\n continue;\n }\n\n const skeleton = skeletonByRigId.get(rig.id);\n if (!skeleton) {\n continue;\n }\n\n if (skeleton.bones.some((bone) => this._bindRestBones.has(bone))) {\n continue;\n }\n\n for (const modelId of Array.from(inheritType2ModelIds)) {\n inheritedRigModelIds.add(modelId);\n }\n for (const { bone, animations } of this._buildInheritedRigBoneAnimations(\n rig,\n skeleton,\n boneCurves,\n modelIdToData,\n inheritType2ModelIds,\n animStack.startTime,\n animStack.stopTime\n )) {\n for (const animation of animations) {\n addBoneAnimation(animation, bone);\n }\n }\n }\n\n for (const [targetId, curveNodes] of Array.from(boneCurves)) {\n if (inheritedRigModelIds.has(targetId)) {\n continue;\n }\n\n const bones = modelIdToBones.get(targetId);\n const modelData = modelIdToData.get(targetId);\n if (!bones || bones.length === 0 || !modelData) {\n continue;\n }\n\n for (const bone of bones) {\n const animations = this._buildBoneAnimations(\n curveNodes,\n bone.name,\n modelData,\n animStack.startTime,\n animStack.stopTime,\n this._bindRestBones.has(bone) ? bone.getBindMatrix() : undefined\n );\n for (const animation of animations) {\n addBoneAnimation(animation, bone);\n }\n }\n }\n\n // Process non-bone targets: bake full transform matrix per frame\n for (const [targetId, curveNodes] of Array.from(nonBoneCurves)) {\n const node = modelIdToNode.get(targetId);\n if (!node) {\n continue;\n }\n\n const modelData = modelIdToData.get(targetId);\n if (!modelData) {\n continue;\n }\n\n const animations = this._buildNodeAnimations(curveNodes, node.name, modelData, animStack.startTime, animStack.stopTime);\n for (const animation of animations) {\n animGroup.addTargetedAnimation(animation, node);\n }\n }\n\n // Inherit-scale helpers follow the inverse of their parent's (possibly animated) scale. Children of animated\n // parents also need re-sampling even when they carry no curves of their own, since their local transform\n // depends on the parent scale.\n for (const [modelId, helper] of Array.from(this._inheritScaleHelpers)) {\n const modelData = modelIdToData.get(modelId);\n const parentModel = modelData ? this._parentModelById.get(modelId) : undefined;\n if (!modelData || !parentModel) {\n continue;\n }\n const fps = this._frameRate;\n // The helper mirrors the parent's animated rotation/translation (its own curves plus any inherited scale\n // that feeds its translation), with unit scale.\n const parentCurves = [\n ...(this._curveNodesByModelId.get(parentModel.id) ?? []),\n ...this._collectInheritScaleCurves(parentModel).filter((cn) => cn.targetModelId !== parentModel.id),\n ];\n if (parentCurves.length > 0) {\n const baseTimes = collectAnimationSampleTimes(parentCurves, fps, animStack.startTime, animStack.stopTime);\n const sampleParent = (time: number) =>\n this._computeInheritAwareLocalMatrix(parentModel, this._sampleModelLocalMatrix(parentModel, this._curveNodesByModelId.get(parentModel.id) ?? [], time), time);\n const times = FBXFileLoader._refineSampleTimes(baseTimes, sampleParent);\n const posKeys: { frame: number; value: Vector3 }[] = [];\n const rotKeys: { frame: number; value: Quaternion }[] = [];\n let prevQuat: Quaternion | null = null;\n for (const time of times) {\n const sc = new Vector3();\n const rq = new Quaternion();\n const tr = new Vector3();\n sampleParent(time).decompose(sc, rq, tr);\n if (prevQuat && Quaternion.Dot(prevQuat, rq) < 0) {\n rq.scaleInPlace(-1);\n }\n prevQuat = rq;\n posKeys.push({ frame: time * fps, value: tr });\n rotKeys.push({ frame: time * fps, value: rq });\n }\n if (!this._isVector3KeysConstant(posKeys)) {\n const anim = new Animation(`${helper.name}_position`, \"position\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\n anim.setKeys(posKeys);\n animGroup.addTargetedAnimation(anim, helper);\n }\n if (!areQuaternionKeysConstant(rotKeys)) {\n const anim = new Animation(`${helper.name}_rotation`, \"rotationQuaternion\", fps, Animation.ANIMATIONTYPE_QUATERNION, Animation.ANIMATIONLOOPMODE_CYCLE);\n anim.setKeys(rotKeys);\n animGroup.addTargetedAnimation(anim, helper);\n }\n }\n // The child's own local transform depends on the parent scale; re-sample it when that scale animates.\n const scaleCurves = this._collectInheritScaleCurves(parentModel);\n const node = modelIdToNode.get(modelId);\n if (node && scaleCurves.length > 0 && !nonBoneCurves.has(modelId) && !boneCurves.has(modelId)) {\n for (const animation of this._buildNodeAnimations([], node.name, modelData, animStack.startTime, animStack.stopTime, scaleCurves)) {\n animGroup.addTargetedAnimation(animation, node);\n }\n }\n }\n\n // Process blend shape (morph target) animations. Every layer animating a channel contributes to one\n // influence animation evaluated through the layer stack.\n const blendShapeGroups = new Map<number, FBXCurveNodeData[]>();\n for (const curveNode of blendShapeCurves) {\n const group = blendShapeGroups.get(curveNode.targetModelId);\n if (group) {\n group.push(curveNode);\n } else {\n blendShapeGroups.set(curveNode.targetModelId, [curveNode]);\n }\n }\n for (const [targetChannelId, group] of Array.from(blendShapeGroups)) {\n group.sort((a, b) => a.layerIndex - b.layerIndex);\n const sources: FBXLayeredPropertySource[] = group.filter((cn) => cn.curves.length > 0).map((cn) => ({ layerIndex: cn.layerIndex, curves: cn.curves }));\n if (sources.length === 0) {\n continue;\n }\n\n // Find the morph target with matching channel ID across all meshes\n let targetFound = false;\n for (const mesh of meshes) {\n if (!mesh.morphTargetManager || targetFound) {\n continue;\n }\n const metadata = mesh.metadata as Record<string, unknown> | undefined;\n const channelTargets = metadata?.fbxBlendShapeChannelTargets as Map<number, { targetIndices: number[]; fullWeights: number[] | null }> | undefined;\n const targetInfo = channelTargets?.get(targetChannelId);\n if (targetInfo) {\n const fps = this._frameRate;\n for (let shapeIndex = 0; shapeIndex < targetInfo.targetIndices.length; shapeIndex++) {\n const target = mesh.morphTargetManager.getTarget(targetInfo.targetIndices[shapeIndex]);\n if (!target) {\n continue;\n }\n const anim = new Animation(`${target.name}_influence`, \"influence\", fps, Animation.ANIMATIONTYPE_FLOAT, Animation.ANIMATIONLOOPMODE_CYCLE);\n const keys = this._layeredScalarKeys(\n sources,\n animStack,\n (value) => calculateBlendShapeInfluences(value, targetInfo.fullWeights, targetInfo.targetIndices.length)[shapeIndex] ?? 0\n );\n anim.setKeys(keys);\n animGroup.addTargetedAnimation(anim, target);\n }\n targetFound = true;\n continue;\n }\n\n const channelMap = metadata?.fbxBlendShapeChannelIds as Map<number, number> | undefined;\n if (!channelMap) {\n continue;\n }\n const targetIndex = channelMap.get(targetChannelId);\n if (targetIndex === undefined) {\n continue;\n }\n\n const target = mesh.morphTargetManager.getTarget(targetIndex);\n if (target) {\n const fps = this._frameRate;\n const anim = new Animation(`${target.name}_influence`, \"influence\", fps, Animation.ANIMATIONTYPE_FLOAT, Animation.ANIMATIONLOOPMODE_CYCLE);\n anim.setKeys(this._layeredScalarKeys(sources, animStack, (value) => value / 100));\n animGroup.addTargetedAnimation(anim, target);\n targetFound = true;\n }\n }\n }\n\n // Animated non-transform properties: visibility, camera, light and material parameters. Curve nodes of\n // several layers that animate the same property are evaluated together through the layer stack.\n const propertyGroups = new Map<string, FBXUnsupportedCurveNodeData[]>();\n for (const curveNode of animStack.unsupportedCurveNodes) {\n if (curveNode.targetId === null || curveNode.curves.length === 0) {\n continue;\n }\n const key = `${curveNode.targetId}|${curveNode.propertyName ?? curveNode.type}`;\n const group = propertyGroups.get(key);\n if (group) {\n group.push(curveNode);\n } else {\n propertyGroups.set(key, [curveNode]);\n }\n }\n for (const group of Array.from(propertyGroups.values())) {\n group.sort((a, b) => a.layerIndex - b.layerIndex);\n const built = this._buildPropertyAnimations(group, animStack, modelIdToNode, propertyTargets);\n if (built.length > 0) {\n for (const curveNode of group) {\n this._evaluatedCurveNodeIds.add(curveNode.id);\n }\n }\n for (const { animation, target } of built) {\n animGroup.addTargetedAnimation(animation, target);\n }\n }\n\n // Normalize the animation group\n if (animGroup.targetedAnimations.length > 0) {\n animGroup.normalize(animStack.startTime * this._frameRate, animStack.stopTime * this._frameRate);\n return animGroup;\n }\n\n animGroup.dispose();\n return null;\n }\n\n private _buildInheritedRigBoneAnimations(\n rig: FBXRigData,\n skeleton: Skeleton,\n boneCurves: Map<number, FBXCurveNodeData[]>,\n modelIdToData: Map<number, FBXModelData>,\n compensatedModelIds: Set<number>,\n startTime: number,\n stopTime: number\n ): { bone: Bone; animations: Animation[] }[] {\n const fps = this._frameRate;\n const sampledModelIds = new Set<number>();\n for (let i = 0; i < rig.bones.length; i++) {\n if (!compensatedModelIds.has(rig.bones[i].modelId)) {\n continue;\n }\n\n for (let parentIndex = i; parentIndex >= 0; parentIndex = rig.bones[parentIndex].parentIndex) {\n sampledModelIds.add(rig.bones[parentIndex].modelId);\n }\n }\n const rigCurveNodes = rig.bones.filter((bone) => sampledModelIds.has(bone.modelId)).flatMap((bone) => boneCurves.get(bone.modelId) ?? []);\n let times = collectAnimationSampleTimes(rigCurveNodes, fps, startTime, stopTime);\n if (times.length === 0) {\n return [];\n }\n for (const boneData of rig.bones) {\n const md = modelIdToData.get(boneData.modelId);\n const cn = boneCurves.get(boneData.modelId) ?? [];\n if (!sampledModelIds.has(boneData.modelId) || !md || cn.length === 0) {\n continue;\n }\n times = FBXFileLoader._refineSampleTimes(times, (time) => this._sampleModelLocalMatrix(md, cn, time));\n }\n\n const keysByBone = rig.bones.map(() => ({\n posKeys: [] as { frame: number; value: Vector3 }[],\n rotKeys: [] as { frame: number; value: Quaternion }[],\n sclKeys: [] as { frame: number; value: Vector3 }[],\n prevQuat: null as Quaternion | null,\n }));\n const keysByHelper = rig.bones.map(() => ({\n posKeys: [] as { frame: number; value: Vector3 }[],\n rotKeys: [] as { frame: number; value: Quaternion }[],\n sclKeys: [] as { frame: number; value: Vector3 }[],\n prevQuat: null as Quaternion | null,\n }));\n const restLocalInverses = rig.bones.map((boneData, index) => {\n const bone = this._getSourceBone(skeleton, index);\n const modelData = modelIdToData.get(boneData.modelId);\n if (!bone || !modelData || !this._bindRestBones.has(bone)) {\n return null;\n }\n\n const restLocalMatrix = FBXFileLoader._computeFBXModelLocalMatrix(modelData);\n const restLocalInverse = new Matrix();\n restLocalMatrix.invertToRef(restLocalInverse);\n return restLocalInverse;\n });\n\n for (const time of times) {\n const localMatrices = rig.bones.map((boneData, index) => {\n const modelData = modelIdToData.get(boneData.modelId);\n const curveNodes = boneCurves.get(boneData.modelId) ?? [];\n let localMatrix = modelData ? this._sampleModelLocalMatrix(modelData, curveNodes, time) : Matrix.Identity();\n\n const restLocalInverse = restLocalInverses[index];\n if (restLocalInverse) {\n const sourceBone = this._getSourceBone(skeleton, index);\n localMatrix = (sourceBone?.getBindMatrix() ?? Matrix.Identity()).multiply(restLocalInverse).multiply(localMatrix);\n }\n return localMatrix;\n });\n const sampledScales = rig.bones.map((boneData) => {\n const modelData = modelIdToData.get(boneData.modelId);\n const curveNodes = boneCurves.get(boneData.modelId) ?? [];\n return modelData ? this._sampleModelScale(modelData, curveNodes, time) : boneData.scale;\n });\n const sampledInheritScales = FBXFileLoader._computeBoneInheritScales(rig.bones, sampledScales);\n const frame = time * fps;\n\n for (let i = 0; i < localMatrices.length; i++) {\n if (!compensatedModelIds.has(rig.bones[i].modelId)) {\n continue;\n }\n\n const parentIndex = rig.bones[i].parentIndex;\n const parentScale = parentIndex >= 0 ? sampledInheritScales[parentIndex] : rig.bones[i].scale;\n const split = FBXFileLoader._splitParentScaleCompensatedLocalMatrix(\n localMatrices[i],\n parentScale,\n FBXFileLoader._getBoneInheritedScale(rig.bones, i, sampledInheritScales)\n );\n FBXFileLoader._pushMatrixKeys(keysByBone[i], frame, split.boneLocalMatrix);\n FBXFileLoader._pushMatrixKeys(keysByHelper[i], frame, split.helperLocalMatrix);\n }\n }\n\n const result: { bone: Bone; animations: Animation[] }[] = [];\n for (let i = 0; i < rig.bones.length; i++) {\n if (!compensatedModelIds.has(rig.bones[i].modelId)) {\n continue;\n }\n\n const bone = this._getSourceBone(skeleton, i);\n if (!bone) {\n continue;\n }\n\n const { posKeys, rotKeys, sclKeys } = keysByBone[i];\n const animations: Animation[] = [];\n if (!this._isVector3KeysConstant(posKeys)) {\n const posAnim = new Animation(`${bone.name}_position`, \"position\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\n posAnim.setKeys(posKeys);\n animations.push(posAnim);\n }\n if (!areQuaternionKeysConstant(rotKeys)) {\n const rotAnim = new Animation(`${bone.name}_rotation`, \"rotationQuaternion\", fps, Animation.ANIMATIONTYPE_QUATERNION, Animation.ANIMATIONLOOPMODE_CYCLE);\n rotAnim.setKeys(rotKeys);\n animations.push(rotAnim);\n }\n if (!this._isVector3KeysConstant(sclKeys)) {\n const sclAnim = new Animation(`${bone.name}_scaling`, \"scaling\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\n sclAnim.setKeys(sclKeys);\n animations.push(sclAnim);\n }\n if (animations.length > 0) {\n result.push({ bone, animations });\n }\n\n const helper = this._getScaleCompensationHelper(skeleton, i);\n if (!helper) {\n continue;\n }\n\n const helperAnimations: Animation[] = [];\n const { posKeys: helperPosKeys, rotKeys: helperRotKeys, sclKeys: helperSclKeys } = keysByHelper[i];\n if (!this._isVector3KeysConstant(helperPosKeys)) {\n const posAnim = new Animation(`${helper.name}_position`, \"position\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\n posAnim.setKeys(helperPosKeys);\n helperAnimations.push(posAnim);\n }\n if (!areQuaternionKeysConstant(helperRotKeys)) {\n const rotAnim = new Animation(`${helper.name}_rotation`, \"rotationQuaternion\", fps, Animation.ANIMATIONTYPE_QUATERNION, Animation.ANIMATIONLOOPMODE_CYCLE);\n rotAnim.setKeys(helperRotKeys);\n helperAnimations.push(rotAnim);\n }\n if (!this._isVector3KeysConstant(helperSclKeys)) {\n const sclAnim = new Animation(`${helper.name}_scaling`, \"scaling\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\n sclAnim.setKeys(helperSclKeys);\n helperAnimations.push(sclAnim);\n }\n if (helperAnimations.length > 0) {\n result.push({ bone: helper, animations: helperAnimations });\n }\n }\n\n return result;\n }\n\n private static _pushMatrixKeys(\n keySet: {\n posKeys: { frame: number; value: Vector3 }[];\n rotKeys: { frame: number; value: Quaternion }[];\n sclKeys: { frame: number; value: Vector3 }[];\n prevQuat: Quaternion | null;\n },\n frame: number,\n matrix: Matrix\n ): void {\n const s = new Vector3();\n const r = new Quaternion();\n const t = new Vector3();\n matrix.decompose(s, r, t);\n\n if (keySet.prevQuat && Quaternion.Dot(keySet.prevQuat, r) < 0) {\n r.scaleInPlace(-1);\n }\n keySet.prevQuat = r;\n\n keySet.posKeys.push({ frame, value: t });\n keySet.rotKeys.push({ frame, value: r });\n keySet.sclKeys.push({ frame, value: s });\n }\n\n /**\n * Build animations for a non-bone node, correctly handling pivots.\n * Computes the full FBX transform matrix at each keyframe and decomposes into TRS.\n */\n private _buildNodeAnimations(\n curveNodes: FBXCurveNodeData[],\n nodeName: string,\n modelData: FBXModelData,\n startTime: number,\n stopTime: number,\n extraTimeCurves: FBXCurveNodeData[] = []\n ): Animation[] {\n const fps = this._frameRate;\n\n // Separate curves by type\n const rNode = curveNodes.find((cn) => cn.type === \"R\");\n\n const baseTimes = collectAnimationSampleTimes([...curveNodes, ...extraTimeCurves], fps, startTime, stopTime);\n if (baseTimes.length === 0) {\n return [];\n }\n const sampleTRS = (time: number) => {\n const sampled = this._sampleModelTRS(modelData, curveNodes, time);\n const trs = FBXFileLoader._computeLocalTRS(modelData, sampled.translation, sampled.rotation, sampled.scale);\n this._adjustTRSForInheritMode(modelData, trs, time);\n return trs;\n };\n const times = FBXFileLoader._refineSampleTimes(baseTimes, (time) => {\n const trs = sampleTRS(time);\n return Matrix.Compose(trs.scaling, trs.rotationQuaternion, trs.position);\n });\n\n // Build keyframes by computing the local transform at each time\n const posKeys: { frame: number; value: Vector3; interpolation?: AnimationKeyInterpolation }[] = [];\n const rotKeys: { frame: number; value: Quaternion; interpolation?: AnimationKeyInterpolation }[] = [];\n const sclKeys: { frame: number; value: Vector3; interpolation?: AnimationKeyInterpolation }[] = [];\n let prevQuat: Quaternion | null = null;\n\n for (const time of times) {\n const frame = time * fps;\n\n const trs = sampleTRS(time);\n const s = trs.scaling;\n const r = trs.rotationQuaternion;\n const t = trs.position;\n const stepT = isChannelSteppedAt(curveNodes, \"T\", time);\n const stepR = isChannelSteppedAt(curveNodes, \"R\", time);\n const stepS = isChannelSteppedAt(curveNodes, \"S\", time);\n\n // Ensure quaternion continuity\n if (prevQuat && Quaternion.Dot(prevQuat, r) < 0) {\n r.scaleInPlace(-1);\n }\n prevQuat = r;\n\n posKeys.push(stepT ? { frame, value: t, interpolation: AnimationKeyInterpolation.STEP } : { frame, value: t });\n rotKeys.push(stepR ? { frame, value: r, interpolation: AnimationKeyInterpolation.STEP } : { frame, value: r });\n sclKeys.push(stepS ? { frame, value: s, interpolation: AnimationKeyInterpolation.STEP } : { frame, value: s });\n }\n\n const animations: Animation[] = [];\n\n // Only create position animation if it's not constant\n if (!this._isVector3KeysConstant(posKeys)) {\n const posAnim = new Animation(`${nodeName}_position`, \"position\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\n posAnim.setKeys(posKeys);\n animations.push(posAnim);\n }\n\n // Always create rotation animation (if there are rotation curves)\n if (rNode) {\n const rotAnim = new Animation(`${nodeName}_rotation`, \"rotationQuaternion\", fps, Animation.ANIMATIONTYPE_QUATERNION, Animation.ANIMATIONLOOPMODE_CYCLE);\n rotAnim.setKeys(rotKeys);\n animations.push(rotAnim);\n }\n\n // Only create scale animation if it's not constant\n if (!this._isVector3KeysConstant(sclKeys)) {\n const sclAnim = new Animation(`${nodeName}_scaling`, \"scaling\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\n sclAnim.setKeys(sclKeys);\n animations.push(sclAnim);\n }\n\n return animations;\n }\n\n /**\n * Baked keys are interpolated linearly by Babylon. Between two frames an FBX cubic segment can deviate from that\n * line, so sample times are refined (midpoints inserted, up to two levels) wherever the interpolated transform\n * differs noticeably from the curve. Flat and linear segments stay at frame resolution.\n */\n private static _refineSampleTimes(times: number[], sample: (time: number) => Matrix, maxDepth = 2): number[] {\n const decompose = (time: number) => {\n const s = new Vector3();\n const r = new Quaternion();\n const t = new Vector3();\n sample(time).decompose(s, r, t);\n return { s, r, t };\n };\n const out: number[] = [];\n const refine = (t0: number, t1: number, d0: ReturnType<typeof decompose>, d1: ReturnType<typeof decompose>, depth: number) => {\n if (depth >= maxDepth) {\n return;\n }\n const tm = (t0 + t1) * 0.5;\n if (!(tm > t0 && tm < t1)) {\n return;\n }\n const dm = decompose(tm);\n const lerpT = Vector3.Lerp(d0.t, d1.t, 0.5);\n const lerpS = Vector3.Lerp(d0.s, d1.s, 0.5);\n const slerpR = Quaternion.Slerp(d0.r, d1.r, 0.5);\n const posErr = Vector3.Distance(lerpT, dm.t);\n const sclErr = Vector3.Distance(lerpS, dm.s);\n const dot = Math.min(1, Math.abs(Quaternion.Dot(slerpR, dm.r)));\n const angErr = 2 * Math.acos(dot);\n const posTol = 1e-4 * (1 + Math.max(Math.abs(dm.t.x), Math.abs(dm.t.y), Math.abs(dm.t.z)));\n const sclTol = 1e-4 * (1 + Math.max(Math.abs(dm.s.x), Math.abs(dm.s.y), Math.abs(dm.s.z)));\n if (posErr > posTol || sclErr > sclTol || angErr > 0.0005) {\n refine(t0, tm, d0, dm, depth + 1);\n out.push(tm);\n refine(tm, t1, dm, d1, depth + 1);\n }\n };\n let prev = times.length > 0 ? decompose(times[0]) : null;\n for (let i = 0; i < times.length; i++) {\n out.push(times[i]);\n if (i + 1 < times.length && prev) {\n const next = decompose(times[i + 1]);\n refine(times[i], times[i + 1], prev, next, 0);\n prev = next;\n }\n }\n return out;\n }\n\n /**\n * Keys of a scalar property animated by one or more layers: the authored keys when a single layer drives it,\n * otherwise the frame grid evaluated through the layer stack.\n * @param sources - Per-layer curves of the property (each with at least one curve)\n * @param animStack - Stack being converted\n * @param mapValue - Conversion from the FBX value to the Babylon property value\n * @returns Animation keys\n */\n private _layeredScalarKeys(sources: readonly FBXLayeredPropertySource[], animStack: FBXAnimationStackData, mapValue: (value: number) => number): IAnimationKey[] {\n const fps = this._frameRate;\n if (sources.length === 0) {\n return [];\n }\n if (sources.length === 1) {\n return buildScalarAnimationKeys(sources[0].curves[0], fps, animStack.startTime, animStack.stopTime, mapValue);\n }\n const channel = sources[0].curves[0].channel;\n const times = collectAnimationSampleTimes(\n sources.map((source) => ({ type: \"other\", targetModelId: 0, curves: Array.from(source.curves), layerIndex: source.layerIndex })),\n fps,\n animStack.startTime,\n animStack.stopTime\n );\n return times.map((time) => ({ frame: time * fps, value: mapValue(evaluateLayeredProperty(sources, animStack.layers, [channel], [0], time)[0]) }));\n }\n\n /**\n * Maps an animated FBX property (anything other than node transforms and blend shape weights) onto the Babylon\n * property that carries it: mesh visibility, camera field of view and clip planes, light intensity, colour and\n * cone angles, and material colours, alpha, roughness and metalness. `group` holds the curve nodes of every\n * layer animating that property, in layer order; several layers are evaluated through the layer stack.\n */\n private _buildPropertyAnimations(\n group: readonly FBXUnsupportedCurveNodeData[],\n animStack: FBXAnimationStackData,\n modelIdToNode: Map<number, TransformNode>,\n targets: { cameraByAttributeId: Map<number, FreeCamera>; lightByAttributeId: Map<number, Light>; materialCache: Map<number, Material> }\n ): { animation: Animation; target: unknown }[] {\n const fps = this._frameRate;\n const curveNode = group[0];\n const prop = curveNode.propertyName ?? curveNode.type;\n const targetId = curveNode.targetId!;\n const out: { animation: Animation; target: unknown }[] = [];\n const scalarCurve = curveNode.curves.find((c) => c.channel === \"d|X\") ?? curveNode.curves[0];\n const defaults = curveNode.defaultValues;\n const layered = group.length > 1;\n const sources: FBXLayeredPropertySource[] = group.map((cn) => ({ layerIndex: cn.layerIndex, curves: cn.curves, defaultValues: cn.defaultValues }));\n const sampleTimes = (): number[] =>\n collectAnimationSampleTimes(\n group.map((cn) => ({ type: \"other\", targetModelId: targetId, curves: cn.curves, layerIndex: cn.layerIndex })),\n fps,\n animStack.startTime,\n animStack.stopTime\n );\n const vectorSamples = (staticValue: [number, number, number]): { frame: number; values: number[] }[] => {\n const cx = curveNode.curves.find((c) => c.channel === \"d|X\");\n const cy = curveNode.curves.find((c) => c.channel === \"d|Y\");\n const cz = curveNode.curves.find((c) => c.channel === \"d|Z\");\n return sampleTimes().map((time) => ({\n frame: time * fps,\n values: layered\n ? evaluateLayeredProperty(sources, animStack.layers, [\"d|X\", \"d|Y\", \"d|Z\"], staticValue, time)\n : [sampleFBXCurveAtTime(cx, time) ?? staticValue[0], sampleFBXCurveAtTime(cy, time) ?? staticValue[1], sampleFBXCurveAtTime(cz, time) ?? staticValue[2]],\n }));\n };\n const scalarKeys = (map: (v: number) => number, step = false): IAnimationKey[] => {\n const keys: IAnimationKey[] = layered\n ? sampleTimes().map((time) => ({\n frame: time * fps,\n value: map(evaluateLayeredProperty(sources, animStack.layers, [scalarCurve.channel], [defaults[scalarCurve.channel] ?? 0], time)[0]),\n }))\n : buildScalarAnimationKeys(scalarCurve, fps, animStack.startTime, animStack.stopTime, map);\n if (step) {\n for (const key of keys) {\n key.interpolation = AnimationKeyInterpolation.STEP;\n delete key.inTangent;\n delete key.outTangent;\n }\n }\n return keys;\n };\n const colorKeys = (): IAnimationKey[] =>\n vectorSamples([defaults[\"d|X\"] ?? 1, defaults[\"d|Y\"] ?? 1, defaults[\"d|Z\"] ?? 1]).map(({ frame, values }) => ({\n frame,\n value: new Color3(values[0], values[1], values[2]),\n }));\n const add = (target: unknown, property: string, type: number, keys: IAnimationKey[], name: string) => {\n if (keys.length === 0) {\n return;\n }\n const animation = new Animation(`${name}_${property}`, property, fps, type, Animation.ANIMATIONLOOPMODE_CYCLE);\n animation.setKeys(keys);\n out.push({ animation, target });\n };\n\n const node = modelIdToNode.get(targetId);\n if (node) {\n if (prop === \"Visibility\" && node instanceof Mesh) {\n add(\n node,\n \"visibility\",\n Animation.ANIMATIONTYPE_FLOAT,\n scalarKeys((v) => Math.min(1, Math.max(0, v)), true),\n node.name\n );\n return out;\n }\n // Animated user properties drive the value stored in the node's metadata.\n const userProperties = (node.metadata as { fbxUserProperties?: Record<string, unknown> } | undefined)?.fbxUserProperties;\n if (userProperties && prop in userProperties) {\n const hasVector = curveNode.curves.some((c) => c.channel === \"d|Y\" || c.channel === \"d|Z\");\n if (hasVector) {\n const current = userProperties[prop];\n const base = Array.isArray(current) ? (current as number[]) : [0, 0, 0];\n userProperties[prop] = new Vector3(base[0] ?? 0, base[1] ?? 0, base[2] ?? 0);\n const keys = vectorSamples([base[0] ?? 0, base[1] ?? 0, base[2] ?? 0]).map(({ frame, values }) => ({\n frame,\n value: new Vector3(values[0], values[1], values[2]),\n }));\n add(node, `metadata.fbxUserProperties.${prop}`, Animation.ANIMATIONTYPE_VECTOR3, keys, node.name);\n } else {\n if (typeof userProperties[prop] === \"boolean\") {\n userProperties[prop] = userProperties[prop] ? 1 : 0;\n }\n add(\n node,\n `metadata.fbxUserProperties.${prop}`,\n Animation.ANIMATIONTYPE_FLOAT,\n scalarKeys((v) => v),\n node.name\n );\n }\n }\n return out;\n }\n\n const camera = targets.cameraByAttributeId.get(targetId);\n if (camera) {\n const meta = (camera.metadata as { fbxCamera?: { aspectRatio?: number; apertureMode?: number; apertureSizeInch?: [number, number] } } | undefined)?.fbxCamera;\n const aspect = meta?.aspectRatio || 1;\n const apertureMode = meta?.apertureMode ?? 2;\n switch (prop) {\n case \"FieldOfView\":\n // Vertical unless the camera's aperture mode declares FieldOfView as horizontal.\n add(\n camera,\n \"fov\",\n Animation.ANIMATIONTYPE_FLOAT,\n scalarKeys((v) => (apertureMode === 1 ? 2 * Math.atan(Math.tan((v * Math.PI) / 360) / aspect) : (v * Math.PI) / 180)),\n camera.name\n );\n break;\n case \"FieldOfViewY\":\n add(\n camera,\n \"fov\",\n Animation.ANIMATIONTYPE_FLOAT,\n scalarKeys((v) => (v * Math.PI) / 180),\n camera.name\n );\n break;\n case \"FieldOfViewX\":\n if (apertureMode !== 0) {\n add(\n camera,\n \"fov\",\n Animation.ANIMATIONTYPE_FLOAT,\n scalarKeys((v) => 2 * Math.atan(Math.tan((v * Math.PI) / 360) / aspect)),\n camera.name\n );\n }\n break;\n case \"FocalLength\": {\n const apertureY = meta?.apertureSizeInch?.[1];\n if (apertureY && apertureMode === 3) {\n add(\n camera,\n \"fov\",\n Animation.ANIMATIONTYPE_FLOAT,\n scalarKeys((v) => 2 * Math.atan((apertureY / Math.max(v / 25.4, 1e-6)) * 0.5)),\n camera.name\n );\n }\n break;\n }\n case \"NearPlane\":\n add(\n camera,\n \"minZ\",\n Animation.ANIMATIONTYPE_FLOAT,\n scalarKeys((v) => v),\n camera.name\n );\n break;\n case \"FarPlane\":\n add(\n camera,\n \"maxZ\",\n Animation.ANIMATIONTYPE_FLOAT,\n scalarKeys((v) => v),\n camera.name\n );\n break;\n default:\n break;\n }\n return out;\n }\n\n const light = targets.lightByAttributeId.get(targetId);\n if (light) {\n switch (prop) {\n case \"Intensity\":\n add(\n light,\n \"intensity\",\n Animation.ANIMATIONTYPE_FLOAT,\n scalarKeys((v) => v / 100),\n light.name\n );\n break;\n case \"Color\":\n add(light, \"diffuse\", Animation.ANIMATIONTYPE_COLOR3, colorKeys(), light.name);\n break;\n case \"OuterAngle\":\n case \"ConeAngle\":\n if (light instanceof SpotLight) {\n add(\n light,\n \"angle\",\n Animation.ANIMATIONTYPE_FLOAT,\n scalarKeys((v) => (v * Math.PI) / 180),\n light.name\n );\n }\n break;\n case \"InnerAngle\":\n if (light instanceof SpotLight) {\n add(\n light,\n \"innerAngle\",\n Animation.ANIMATIONTYPE_FLOAT,\n scalarKeys((v) => (v * Math.PI) / 180),\n light.name\n );\n }\n break;\n default:\n break;\n }\n return out;\n }\n\n const material = targets.materialCache.get(targetId);\n if (material) {\n const isPbr = material instanceof PBRMaterial;\n const short = prop.substring(prop.lastIndexOf(\"|\") + 1);\n if (prop === \"DiffuseColor\" || prop === \"Diffuse\" || short === \"baseColor\" || short === \"base_color\" || short === \"color\") {\n add(material, isPbr ? \"albedoColor\" : \"diffuseColor\", Animation.ANIMATIONTYPE_COLOR3, colorKeys(), material.name);\n } else if (\n prop === \"EmissiveColor\" ||\n prop === \"Emissive\" ||\n short === \"emissionColor\" ||\n short === \"emission_color\" ||\n short === \"emissive\" ||\n short === \"emit_color\"\n ) {\n add(material, \"emissiveColor\", Animation.ANIMATIONTYPE_COLOR3, colorKeys(), material.name);\n } else if (prop === \"Opacity\") {\n add(\n material,\n \"alpha\",\n Animation.ANIMATIONTYPE_FLOAT,\n scalarKeys((v) => v),\n material.name\n );\n } else if (prop === \"TransparencyFactor\" || prop === \"TransparentFactor\") {\n add(\n material,\n \"alpha\",\n Animation.ANIMATIONTYPE_FLOAT,\n scalarKeys((v) => 1 - v),\n material.name\n );\n } else if (isPbr && (short === \"roughness\" || short === \"specular_roughness\" || short === \"specularRoughness\")) {\n add(\n material,\n \"roughness\",\n Animation.ANIMATIONTYPE_FLOAT,\n scalarKeys((v) => v),\n material.name\n );\n } else if (isPbr && (short === \"metalness\" || short === \"metallic\" || short === \"base_metalness\")) {\n add(\n material,\n \"metallic\",\n Animation.ANIMATIONTYPE_FLOAT,\n scalarKeys((v) => v),\n material.name\n );\n } else if (!isPbr && prop === \"SpecularColor\") {\n add(material, \"specularColor\", Animation.ANIMATIONTYPE_COLOR3, colorKeys(), material.name);\n }\n return out;\n }\n\n return out;\n }\n\n /** Records constraints on their nodes and, unless disabled, attaches the runtime behavior that solves them. */\n private _applyConstraints(fbxScene: FBXSceneData, modelIdToNode: Map<number, TransformNode>, rootNode: TransformNode, scene: Scene): void {\n const nodeName = (id: number | undefined) => (id === undefined ? undefined : modelIdToNode.get(id)?.name);\n const upSign = fbxScene.upAxisSign >= 0 ? 1 : -1;\n const sceneUp = new Vector3(fbxScene.upAxis === 0 ? upSign : 0, fbxScene.upAxis === 1 ? upSign : 0, fbxScene.upAxis === 2 ? upSign : 0);\n const summaries: unknown[] = [];\n for (const c of fbxScene.constraints) {\n const summary = {\n name: c.name,\n type: c.type,\n node: nodeName(c.nodeId),\n targets: c.targets.map((t) => ({ node: nodeName(t.modelId), weight: t.weight })),\n weight: c.weight,\n active: c.active,\n ...(c.type === \"singleChainIK\" ? { firstJoint: nodeName(c.ikFirstJointId), endJoint: nodeName(c.ikEndJointId), effector: nodeName(c.ikEffectorId) } : {}),\n };\n summaries.push(summary);\n const node = c.nodeId !== undefined ? modelIdToNode.get(c.nodeId) : undefined;\n if (!node) {\n continue;\n }\n const existing = ((node.metadata as { fbxConstraints?: unknown[] } | undefined)?.fbxConstraints ?? []) as unknown[];\n node.metadata = { ...((node.metadata as object) ?? {}), fbxConstraints: [...existing, summary] };\n if (this._options.constraints !== \"apply\" || c.type === \"singleChainIK\" || c.type === \"unknown\") {\n continue;\n }\n const targets: FBXConstraintBehaviorTarget[] = [];\n for (const t of c.targets) {\n const targetNode = modelIdToNode.get(t.modelId);\n if (!targetNode) {\n continue;\n }\n const d2r = Math.PI / 180;\n const offset =\n c.type === \"parent\"\n ? Matrix.Compose(\n new Vector3(...t.offsetScale),\n Quaternion.FromRotationMatrix(eulerToMatrixXYZ(t.offsetRotation[0] * d2r, t.offsetRotation[1] * d2r, t.offsetRotation[2] * d2r)),\n new Vector3(...t.offsetTranslation)\n )\n : Matrix.Identity();\n targets.push({ node: targetNode, weight: t.weight, offset });\n }\n if (targets.length === 0) {\n continue;\n }\n const upNode = c.worldUpNodeId !== undefined ? (modelIdToNode.get(c.worldUpNodeId) ?? null) : null;\n node.addBehavior(new FBXConstraintBehavior(c, { root: rootNode, targets, upNode, sceneUp }));\n }\n if (summaries.length > 0) {\n rootNode.metadata = { ...((rootNode.metadata as object) ?? {}), fbxConstraints: summaries };\n }\n }\n\n /** Collects every recoverable issue the interpreter recorded, stores it on the root node and notifies the caller. */\n private _reportDiagnostics(fbxScene: FBXSceneData, rootNode: TransformNode, modelIdToNode: Map<number, TransformNode>): void {\n const warnings: FBXLoaderWarning[] = [];\n const push = (source: FBXLoaderWarning[\"source\"], d: unknown, objectName?: string) => {\n const message = typeof d === \"string\" ? d : ((d as { message?: string })?.message ?? JSON.stringify(d));\n warnings.push({ source, message, objectName, details: typeof d === \"string\" ? undefined : d });\n };\n for (const d of fbxScene.diagnostics) {\n // Objects with several parents (shared materials, textures, instanced geometry) are normal in FBX.\n if (d.subType === \"duplicate-parent\") {\n continue;\n }\n push(\"scene\", d, d.objectName ?? d.nodeName);\n }\n for (const g of fbxScene.geometries) {\n for (const d of g.diagnostics) {\n push(\"geometry\", d, g.name);\n }\n }\n for (const c of fbxScene.curves) {\n for (const d of c.diagnostics) {\n push(\"geometry\", d, c.name);\n }\n }\n for (const skin of fbxScene.skins) {\n for (const d of skin.diagnostics) {\n push(\"skin\", d);\n }\n for (const bone of skin.bones) {\n for (const d of bone.diagnostics) {\n push(\"skin\", d, bone.name);\n }\n }\n }\n for (const rig of fbxScene.rigs) {\n for (const w of rig.warnings) {\n push(\"rig\", w);\n }\n }\n for (const stack of fbxScene.animations) {\n for (const d of stack.diagnostics) {\n if (d.type === \"unsupported-curve-node\" && d.curveNodeId !== undefined && this._evaluatedCurveNodeIds.has(d.curveNodeId)) {\n continue;\n }\n push(\"animation\", d, stack.name);\n }\n }\n for (const cam of fbxScene.cameras) {\n for (const d of cam.diagnostics) {\n push(\"camera\", d, cam.name);\n }\n }\n for (const light of fbxScene.lights) {\n for (const d of light.diagnostics) {\n push(\"light\", d, light.name);\n }\n }\n const walk = (models: FBXModelData[]) => {\n for (const m of models) {\n for (const d of m.diagnostics) {\n push(\"model\", d, m.name);\n }\n walk(m.children);\n }\n };\n walk(fbxScene.rootModels);\n\n rootNode.metadata = {\n ...((rootNode.metadata as object) ?? {}),\n fbxDiagnostics: warnings,\n fbxDisplayLayers: fbxScene.displayLayers.map((l) => ({ name: l.name, show: l.show, freeze: l.freeze, color: l.color })),\n fbxSelectionSets: fbxScene.selectionSets.map((set) => ({\n name: set.name,\n members: set.members.map((m) => ({\n node: modelIdToNode.get(m.modelId)?.name ?? String(m.modelId),\n includeNode: m.includeNode,\n ...(m.vertices ? { vertices: m.vertices } : {}),\n ...(m.edges ? { edges: m.edges } : {}),\n ...(m.faces ? { faces: m.faces } : {}),\n })),\n })),\n };\n for (const warning of warnings) {\n this._options.onWarning(warning);\n }\n }\n\n /** Curve nodes affecting the inherit scale of a model: its own scale curves and those of its inherit-scale chain. */\n private _collectInheritScaleCurves(modelData: FBXModelData): FBXCurveNodeData[] {\n const result: FBXCurveNodeData[] = [];\n let current: FBXModelData | undefined = modelData;\n const seen = new Set<number>();\n while (current && !seen.has(current.id)) {\n seen.add(current.id);\n for (const cn of this._curveNodesByModelId.get(current.id) ?? []) {\n if (cn.type === \"S\") {\n result.push(cn);\n }\n }\n current = this._getInheritScaleNode(current);\n }\n return result;\n }\n\n private _isVector3KeysConstant(keys: { frame: number; value: Vector3 }[]): boolean {\n if (keys.length < 2) {\n return true;\n }\n const first = keys[0].value;\n for (let i = 1; i < keys.length; i++) {\n const v = keys[i].value;\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) {\n return false;\n }\n }\n return true;\n }\n\n /** Samples the animated Lcl Translation / Rotation / Scaling of a model, blending all layers of the active stack. */\n private _sampleModelTRS(\n modelData: FBXModelData,\n curveNodes: readonly FBXCurveNodeData[],\n time: number\n ): { translation: [number, number, number]; rotation: [number, number, number]; scale: [number, number, number] } {\n const layers = this._activeLayers;\n return {\n translation: evaluateLayeredChannel(curveNodes, layers, \"T\", modelData.translation, modelData.rotationOrder, time),\n rotation: evaluateLayeredChannel(curveNodes, layers, \"R\", modelData.rotation, modelData.rotationOrder, time),\n scale: evaluateLayeredChannel(curveNodes, layers, \"S\", modelData.scale, modelData.rotationOrder, time),\n };\n }\n\n /**\n * Local position/rotation/scale of a model from FBX Lcl values. Without pivots and offsets the components map\n * directly (rotation = pre * lcl * post⁻¹), which keeps zero and negative scales exact. With pivots the full\n * matrix is built and decomposed.\n */\n private static _computeLocalTRS(\n modelData: FBXModelData,\n translation: [number, number, number],\n rotation: [number, number, number],\n scale: [number, number, number]\n ): { position: Vector3; rotationQuaternion: Quaternion; scaling: Vector3 } {\n const nz = (v: [number, number, number]) => v[0] !== 0 || v[1] !== 0 || v[2] !== 0;\n const d2r = Math.PI / 180;\n let rotM = eulerToMatrix(rotation[0] * d2r, rotation[1] * d2r, rotation[2] * d2r, modelData.rotationOrder);\n if (nz(modelData.preRotation)) {\n rotM = rotM.multiply(eulerToMatrixXYZ(modelData.preRotation[0] * d2r, modelData.preRotation[1] * d2r, modelData.preRotation[2] * d2r));\n }\n if (nz(modelData.postRotation)) {\n const post = eulerToMatrixXYZ(modelData.postRotation[0] * d2r, modelData.postRotation[1] * d2r, modelData.postRotation[2] * d2r);\n const postInv = new Matrix();\n post.invertToRef(postInv);\n rotM = postInv.multiply(rotM);\n }\n let position = new Vector3(translation[0], translation[1], translation[2]);\n if (nz(modelData.rotationPivot) || nz(modelData.scalingPivot) || nz(modelData.rotationOffset) || nz(modelData.scalingOffset)) {\n // Pivots and offsets only move the translation: the linear part of the FBX local matrix is always S·R.\n position = FBXFileLoader._computeFBXLocalMatrix(\n translation,\n rotation,\n scale,\n modelData.preRotation,\n modelData.postRotation,\n modelData.rotationPivot,\n modelData.scalingPivot,\n modelData.rotationOffset,\n modelData.scalingOffset,\n modelData.rotationOrder\n ).getTranslation();\n }\n return {\n position,\n rotationQuaternion: Quaternion.FromRotationMatrix(rotM),\n scaling: new Vector3(scale[0], scale[1], scale[2]),\n };\n }\n\n /** Applies inherit-mode adjustments to a local TRS (see _computeInheritAwareLocalMatrix). */\n private _adjustTRSForInheritMode(modelData: FBXModelData, trs: { position: Vector3; rotationQuaternion: Quaternion; scaling: Vector3 }, time: number | undefined): void {\n const parent = this._parentModelById.get(modelData.id);\n if (modelData.inheritType === 1 || !parent) {\n return;\n }\n const parentScale = this._getInheritScale(parent, time);\n trs.position.x *= parentScale[0];\n trs.position.y *= parentScale[1];\n trs.position.z *= parentScale[2];\n const inheritNode = this._getInheritScaleNode(modelData);\n if (inheritNode) {\n const inherited = this._getInheritScale(inheritNode, time);\n trs.scaling.x *= inherited[0];\n trs.scaling.y *= inherited[1];\n trs.scaling.z *= inherited[2];\n }\n }\n\n private _sampleModelLocalMatrix(modelData: FBXModelData, curveNodes: FBXCurveNodeData[], time: number, scaleOverride?: [number, number, number]): Matrix {\n const trs = this._sampleModelTRS(modelData, curveNodes, time);\n return FBXFileLoader._computeFBXLocalMatrix(\n trs.translation,\n trs.rotation,\n scaleOverride ?? trs.scale,\n modelData.preRotation,\n modelData.postRotation,\n modelData.rotationPivot,\n modelData.scalingPivot,\n modelData.rotationOffset,\n modelData.scalingOffset,\n modelData.rotationOrder\n );\n }\n\n private _sampleModelScale(modelData: FBXModelData, curveNodes: FBXCurveNodeData[], time: number): [number, number, number] {\n return evaluateLayeredChannel(curveNodes, this._activeLayers, \"S\", modelData.scale, modelData.rotationOrder, time);\n }\n\n /**\n * Effective scale of a model for inherit-mode math (`inherit_scale` in ufbx terms): its own local scale, multiplied\n * componentwise by the inherited scale when the model uses RrSs inheritance. `time` samples animation; undefined\n * uses the rest pose.\n */\n private _getInheritScale(modelData: FBXModelData | undefined, time: number | undefined): [number, number, number] {\n if (!modelData) {\n return [1, 1, 1];\n }\n const own = time === undefined ? modelData.scale : this._sampleModelScale(modelData, this._curveNodesByModelId.get(modelData.id) ?? [], time);\n const inheritNode = this._getInheritScaleNode(modelData);\n if (!inheritNode) {\n return [own[0], own[1], own[2]];\n }\n const parentScale = this._getInheritScale(inheritNode, time);\n return [own[0] * parentScale[0], own[1] * parentScale[1], own[2] * parentScale[2]];\n }\n\n /** RrSs nodes inherit scale from their parent; Rrs nodes skip their immediate parent (chaining through Rrs parents). */\n private _getInheritScaleNode(modelData: FBXModelData): FBXModelData | undefined {\n const parent = this._parentModelById.get(modelData.id);\n if (!parent) {\n return undefined;\n }\n if (modelData.inheritType === 0) {\n return parent;\n }\n if (modelData.inheritType === 2) {\n return this._getInheritScaleNode(parent);\n }\n return undefined;\n }\n\n /**\n * Local matrix of a model relative to its Babylon parent frame, accounting for inherit modes. For RSrs (the\n * default) this is the FBX local matrix. For RrSs / Rrs the node sits under a helper that removes the parent's\n * scale, so translation is pre-scaled by the parent scale and (for RrSs) scale accumulates componentwise.\n */\n private _computeInheritAwareLocalMatrix(modelData: FBXModelData, localMatrix: Matrix, time: number | undefined): Matrix {\n const parent = this._parentModelById.get(modelData.id);\n if (modelData.inheritType === 1 || !parent) {\n return localMatrix;\n }\n const s = new Vector3();\n const r = new Quaternion();\n const t = new Vector3();\n localMatrix.decompose(s, r, t);\n const parentScale = this._getInheritScale(parent, time);\n t.x *= parentScale[0];\n t.y *= parentScale[1];\n t.z *= parentScale[2];\n const inheritNode = this._getInheritScaleNode(modelData);\n if (inheritNode) {\n const inherited = this._getInheritScale(inheritNode, time);\n s.x *= inherited[0];\n s.y *= inherited[1];\n s.z *= inherited[2];\n }\n return Matrix.Compose(s, r, t);\n }\n\n /**\n * Build matrix-baked bone animation from full FBX local transforms.\n * The bind matrix carries the skinning offset, so animation curves drive\n * the same FBX local transform chain as the source skeleton.\n */\n private _buildBoneAnimations(\n curveNodes: FBXCurveNodeData[],\n boneName: string,\n modelData: FBXModelData,\n startTime: number,\n stopTime: number,\n bindLocalMatrix?: Matrix\n ): Animation[] {\n const fps = this._frameRate;\n\n const rNode = curveNodes.find((cn) => cn.type === \"R\");\n\n const baseTimes = collectAnimationSampleTimes(curveNodes, fps, startTime, stopTime);\n if (baseTimes.length === 0) {\n return [];\n }\n const times = FBXFileLoader._refineSampleTimes(baseTimes, (time) => this._sampleModelLocalMatrix(modelData, curveNodes, time));\n\n const posKeys: { frame: number; value: Vector3 }[] = [];\n const rotKeys: { frame: number; value: Quaternion }[] = [];\n const sclKeys: { frame: number; value: Vector3 }[] = [];\n let prevQuat: Quaternion | null = null;\n let restLocalInverse: Matrix | null = null;\n if (bindLocalMatrix) {\n const restLocalMatrix = FBXFileLoader._computeFBXLocalMatrix(\n modelData.translation,\n modelData.rotation,\n modelData.scale,\n modelData.preRotation,\n modelData.postRotation,\n modelData.rotationPivot,\n modelData.scalingPivot,\n modelData.rotationOffset,\n modelData.scalingOffset,\n modelData.rotationOrder\n );\n restLocalInverse = new Matrix();\n restLocalMatrix.invertToRef(restLocalInverse);\n }\n\n for (const time of times) {\n const frame = time * fps;\n\n // Compute the full FBX local matrix from animated Lcl values, blending all layers\n const localMatrix = this._sampleModelLocalMatrix(modelData, curveNodes, time);\n\n const correctedLocalMatrix = restLocalInverse && bindLocalMatrix ? bindLocalMatrix.multiply(restLocalInverse).multiply(localMatrix) : localMatrix;\n\n const s = new Vector3();\n const r = new Quaternion();\n const t = new Vector3();\n correctedLocalMatrix.decompose(s, r, t);\n\n if (prevQuat && Quaternion.Dot(prevQuat, r) < 0) {\n r.scaleInPlace(-1);\n }\n prevQuat = r;\n\n posKeys.push({ frame, value: t });\n rotKeys.push({ frame, value: r });\n sclKeys.push({ frame, value: s });\n }\n\n const animations: Animation[] = [];\n\n if (!this._isVector3KeysConstant(posKeys)) {\n const posAnim = new Animation(`${boneName}_position`, \"position\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\n posAnim.setKeys(posKeys);\n animations.push(posAnim);\n }\n\n if (rNode) {\n const rotAnim = new Animation(`${boneName}_rotation`, \"rotationQuaternion\", fps, Animation.ANIMATIONTYPE_QUATERNION, Animation.ANIMATIONLOOPMODE_CYCLE);\n rotAnim.setKeys(rotKeys);\n animations.push(rotAnim);\n }\n\n if (!this._isVector3KeysConstant(sclKeys)) {\n const sclAnim = new Animation(`${boneName}_scaling`, \"scaling\", fps, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CYCLE);\n sclAnim.setKeys(sclKeys);\n animations.push(sclAnim);\n }\n\n return animations;\n }\n\n private _buildNameFilter(meshesNames: string | readonly string[] | null | undefined): ((name: string) => boolean) | null {\n if (!meshesNames) {\n return null;\n }\n if (typeof meshesNames === \"string\") {\n if (meshesNames === \"\") {\n return null;\n }\n return (name: string) => name === meshesNames;\n }\n if (meshesNames.length === 0) {\n return null;\n }\n const nameSet = new Set(meshesNames);\n return (name: string) => nameSet.has(name);\n }\n}\n\nfunction float64To32(arr: Float64Array): Float32Array {\n const result = new Float32Array(arr.length);\n for (let i = 0; i < arr.length; i++) {\n result[i] = arr[i];\n }\n return result;\n}\n\nfunction applyTangentHandednessScale(tangents: Float32Array, scale: 1 | -1): void {\n if (scale === 1) {\n return;\n }\n for (let i = 3; i < tangents.length; i += 4) {\n tangents[i] *= scale;\n }\n}\n\nfunction generateTangents(\n positions: ArrayLike<number>,\n normals: ArrayLike<number>,\n uvs: ArrayLike<number>,\n indices: ArrayLike<number>,\n normalMapTangentHandednessScale: 1 | -1 = 1,\n controlPointIndices: ArrayLike<number> | null = null,\n materialIndices: ArrayLike<number> | null = null\n): Float32Array {\n const vertexCount = positions.length / 3;\n const groups = new Map<string, TangentGroup>();\n const vertexGroupKeys = new Array<string | null>(vertexCount).fill(null);\n\n for (let i = 0; i + 2 < indices.length; i += 3) {\n const materialIndex = materialIndices ? materialIndices[i / 3] : 0;\n const i1 = indices[i];\n const i2 = indices[i + 1];\n const i3 = indices[i + 2];\n\n const p1 = i1 * 3;\n const p2 = i2 * 3;\n const p3 = i3 * 3;\n const uv1 = i1 * 2;\n const uv2 = i2 * 2;\n const uv3 = i3 * 2;\n\n const x1 = positions[p2] - positions[p1];\n const x2 = positions[p3] - positions[p1];\n const y1 = positions[p2 + 1] - positions[p1 + 1];\n const y2 = positions[p3 + 1] - positions[p1 + 1];\n const z1 = positions[p2 + 2] - positions[p1 + 2];\n const z2 = positions[p3 + 2] - positions[p1 + 2];\n\n const s1 = uvs[uv2] - uvs[uv1];\n const s2 = uvs[uv3] - uvs[uv1];\n const t1 = uvs[uv2 + 1] - uvs[uv1 + 1];\n const t2 = uvs[uv3 + 1] - uvs[uv1 + 1];\n const denominator = s1 * t2 - s2 * t1;\n if (Math.abs(denominator) < 1e-8) {\n continue;\n }\n\n const r = 1 / denominator;\n const sx = (t2 * x1 - t1 * x2) * r;\n const sy = (t2 * y1 - t1 * y2) * r;\n const sz = (t2 * z1 - t1 * z2) * r;\n const bx = (s1 * x2 - s2 * x1) * r;\n const by = (s1 * y2 - s2 * y1) * r;\n const bz = (s1 * z2 - s2 * z1) * r;\n\n accumulateTangentContribution(i1, i2, i3, sx, sy, sz, bx, by, bz, positions, normals, uvs, controlPointIndices, materialIndex, groups, vertexGroupKeys);\n accumulateTangentContribution(i2, i3, i1, sx, sy, sz, bx, by, bz, positions, normals, uvs, controlPointIndices, materialIndex, groups, vertexGroupKeys);\n accumulateTangentContribution(i3, i1, i2, sx, sy, sz, bx, by, bz, positions, normals, uvs, controlPointIndices, materialIndex, groups, vertexGroupKeys);\n }\n\n const tangents = new Float32Array(vertexCount * 4);\n for (let i = 0; i < vertexCount; i++) {\n const no = i * 3;\n const to = i * 4;\n const [nx, ny, nz] = normalizeVector(normals[no], normals[no + 1], normals[no + 2]);\n const group = vertexGroupKeys[i] ? groups.get(vertexGroupKeys[i]!) : undefined;\n const tx = group?.tx ?? 0;\n const ty = group?.ty ?? 0;\n const tz = group?.tz ?? 0;\n const normalDotTangent = nx * tx + ny * ty + nz * tz;\n\n let ox = tx - nx * normalDotTangent;\n let oy = ty - ny * normalDotTangent;\n let oz = tz - nz * normalDotTangent;\n const tangentLength = Math.hypot(ox, oy, oz);\n if (tangentLength > 1e-8) {\n ox /= tangentLength;\n oy /= tangentLength;\n oz /= tangentLength;\n } else {\n [ox, oy, oz] = buildFallbackTangent(nx, ny, nz);\n }\n\n const bx = group?.bx ?? 0;\n const by = group?.by ?? 0;\n const bz = group?.bz ?? 0;\n const cx = ny * oz - nz * oy;\n const cy = nz * ox - nx * oz;\n const cz = nx * oy - ny * ox;\n const bitangentLength = Math.hypot(bx, by, bz);\n const handedness = bitangentLength > 1e-8 && cx * bx + cy * by + cz * bz < 0 ? -1 : 1;\n\n tangents[to] = ox;\n tangents[to + 1] = oy;\n tangents[to + 2] = oz;\n tangents[to + 3] = handedness * normalMapTangentHandednessScale;\n }\n\n return tangents;\n}\n\ninterface TangentGroup {\n tx: number;\n ty: number;\n tz: number;\n bx: number;\n by: number;\n bz: number;\n}\n\nfunction accumulateTangentContribution(\n vertexIndex: number,\n nextIndex: number,\n prevIndex: number,\n tx: number,\n ty: number,\n tz: number,\n bx: number,\n by: number,\n bz: number,\n positions: ArrayLike<number>,\n normals: ArrayLike<number>,\n uvs: ArrayLike<number>,\n controlPointIndices: ArrayLike<number> | null,\n materialIndex: number,\n groups: Map<string, TangentGroup>,\n vertexGroupKeys: Array<string | null>\n): void {\n const weight = computeCornerAngle(positions, vertexIndex, nextIndex, prevIndex);\n if (weight <= 1e-8) {\n return;\n }\n\n const key = buildTangentGroupKey(vertexIndex, tx, ty, tz, bx, by, bz, positions, normals, uvs, controlPointIndices, materialIndex);\n let group = groups.get(key);\n if (!group) {\n group = { tx: 0, ty: 0, tz: 0, bx: 0, by: 0, bz: 0 };\n groups.set(key, group);\n }\n\n group.tx += tx * weight;\n group.ty += ty * weight;\n group.tz += tz * weight;\n group.bx += bx * weight;\n group.by += by * weight;\n group.bz += bz * weight;\n vertexGroupKeys[vertexIndex] ??= key;\n}\n\nfunction buildTangentGroupKey(\n vertexIndex: number,\n tx: number,\n ty: number,\n tz: number,\n bx: number,\n by: number,\n bz: number,\n positions: ArrayLike<number>,\n normals: ArrayLike<number>,\n uvs: ArrayLike<number>,\n controlPointIndices: ArrayLike<number> | null,\n materialIndex: number\n): string {\n const po = vertexIndex * 3;\n const no = vertexIndex * 3;\n const uo = vertexIndex * 2;\n const [nx, ny, nz] = normalizeVector(normals[no], normals[no + 1], normals[no + 2]);\n const handedness = computeTangentHandedness(nx, ny, nz, tx, ty, tz, bx, by, bz);\n const positionKey = controlPointIndices\n ? `cp:${controlPointIndices[vertexIndex]}`\n : `p:${quantizeTangentKey(positions[po])},${quantizeTangentKey(positions[po + 1])},${quantizeTangentKey(positions[po + 2])}`;\n return [\n positionKey,\n quantizeTangentKey(nx),\n quantizeTangentKey(ny),\n quantizeTangentKey(nz),\n quantizeTangentKey(uvs[uo]),\n quantizeTangentKey(uvs[uo + 1]),\n handedness,\n materialIndex,\n ].join(\"|\");\n}\n\nfunction computeTangentHandedness(nx: number, ny: number, nz: number, tx: number, ty: number, tz: number, bx: number, by: number, bz: number): 1 | -1 {\n const cx = ny * tz - nz * ty;\n const cy = nz * tx - nx * tz;\n const cz = nx * ty - ny * tx;\n return cx * bx + cy * by + cz * bz < 0 ? -1 : 1;\n}\n\nfunction computeCornerAngle(positions: ArrayLike<number>, vertexIndex: number, nextIndex: number, prevIndex: number): number {\n const vo = vertexIndex * 3;\n const no = nextIndex * 3;\n const po = prevIndex * 3;\n const ax = positions[no] - positions[vo];\n const ay = positions[no + 1] - positions[vo + 1];\n const az = positions[no + 2] - positions[vo + 2];\n const bx = positions[po] - positions[vo];\n const by = positions[po + 1] - positions[vo + 1];\n const bz = positions[po + 2] - positions[vo + 2];\n const aLength = Math.hypot(ax, ay, az);\n const bLength = Math.hypot(bx, by, bz);\n if (aLength <= 1e-8 || bLength <= 1e-8) {\n return 0;\n }\n const dot = (ax * bx + ay * by + az * bz) / (aLength * bLength);\n return Math.acos(Math.max(-1, Math.min(1, dot)));\n}\n\nfunction normalizeVector(x: number, y: number, z: number): [number, number, number] {\n const length = Math.hypot(x, y, z);\n return length > 1e-8 ? [x / length, y / length, z / length] : [0, 0, 1];\n}\n\nfunction quantizeTangentKey(value: number): number {\n const quantized = Math.round(value * 1e6);\n return Object.is(quantized, -0) ? 0 : quantized;\n}\n\nfunction buildFallbackTangent(nx: number, ny: number, nz: number): [number, number, number] {\n const ax = Math.abs(nx) < 0.9 ? 1 : 0;\n const ay = ax === 1 ? 0 : 1;\n const dot = nx * ax + ny * ay;\n let tx = ax - nx * dot;\n let ty = ay - ny * dot;\n let tz = -nz * dot;\n const length = Math.hypot(tx, ty, tz);\n if (length <= 1e-8) {\n return [1, 0, 0];\n }\n tx /= length;\n ty /= length;\n tz /= length;\n return [tx, ty, tz];\n}\n\nfunction buildMorphTargetData(\n shape: FBXShapeData,\n cpIndices: Uint32Array,\n basePositions: FloatArray,\n baseNormals: FloatArray | null,\n deltaMatrix: Matrix | null,\n normalMatrix: Matrix | null\n): { positions: Float32Array; normals: Float32Array | null } | null {\n const vertexCount = basePositions.length / 3;\n const targetPositions = new Float32Array(vertexCount * 3);\n const hasNormals = shape.normals !== null && baseNormals !== null;\n const targetNormals = hasNormals ? new Float32Array(vertexCount * 3) : null;\n\n for (let i = 0; i < targetPositions.length; i++) {\n targetPositions[i] = basePositions[i];\n }\n if (targetNormals && baseNormals) {\n for (let i = 0; i < targetNormals.length; i++) {\n targetNormals[i] = baseNormals[i];\n }\n }\n\n const cpToShapeIdx = new Map<number, number>();\n for (let i = 0; i < shape.indices.length; i++) {\n cpToShapeIdx.set(shape.indices[i], i);\n }\n\n for (let vi = 0; vi < vertexCount; vi++) {\n const cpIdx = cpIndices[vi];\n const shapeIdx = cpToShapeIdx.get(cpIdx);\n if (shapeIdx === undefined) {\n continue;\n }\n\n let dx = shape.vertices[shapeIdx * 3];\n let dy = shape.vertices[shapeIdx * 3 + 1];\n let dz = shape.vertices[shapeIdx * 3 + 2];\n\n if (deltaMatrix) {\n const rv = Vector3.TransformNormal(new Vector3(dx, dy, dz), deltaMatrix);\n dx = rv.x;\n dy = rv.y;\n dz = rv.z;\n }\n\n targetPositions[vi * 3] += dx;\n targetPositions[vi * 3 + 1] += dy;\n targetPositions[vi * 3 + 2] += dz;\n\n if (targetNormals && shape.normals) {\n let nx = shape.normals[shapeIdx * 3];\n let ny = shape.normals[shapeIdx * 3 + 1];\n let nz = shape.normals[shapeIdx * 3 + 2];\n if (normalMatrix) {\n const rn = Vector3.TransformNormal(new Vector3(nx, ny, nz), normalMatrix);\n if (rn.lengthSquared() > 0) {\n rn.normalize();\n }\n nx = rn.x;\n ny = rn.y;\n nz = rn.z;\n }\n targetNormals[vi * 3] += nx;\n targetNormals[vi * 3 + 1] += ny;\n targetNormals[vi * 3 + 2] += nz;\n }\n }\n\n return { positions: targetPositions, normals: targetNormals };\n}\n\nfunction calculateBlendShapeInfluences(deformPercent: number, fullWeights: number[] | null, shapeCount: number): number[] {\n if (shapeCount <= 0) {\n return [];\n }\n if (!fullWeights || fullWeights.length !== shapeCount || shapeCount === 1) {\n const denominator = fullWeights?.[0] && fullWeights[0] !== 0 ? fullWeights[0] : 100;\n return [clamp01(deformPercent / denominator)];\n }\n\n const influences = new Array<number>(shapeCount).fill(0);\n if (deformPercent <= fullWeights[0]) {\n influences[0] = fullWeights[0] === 0 ? (deformPercent <= 0 ? 1 : 0) : clamp01(deformPercent / fullWeights[0]);\n return influences;\n }\n\n for (let i = 1; i < fullWeights.length; i++) {\n const previousWeight = fullWeights[i - 1];\n const nextWeight = fullWeights[i];\n if (deformPercent > nextWeight) {\n continue;\n }\n\n const range = nextWeight - previousWeight;\n if (Math.abs(range) < 1e-6) {\n influences[i] = 1;\n return influences;\n }\n\n const t = clamp01((deformPercent - previousWeight) / range);\n influences[i - 1] = 1 - t;\n influences[i] = t;\n return influences;\n }\n\n influences[shapeCount - 1] = 1;\n return influences;\n}\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\n/** Interior frames kept between two keys when the segment is cubic or extrapolated. */\nconst MAX_DENSE_SEGMENT_SAMPLES = 512;\n/** Interior frames kept between two keys when every curve is linear or constant there. */\nconst MAX_LINEAR_SEGMENT_SAMPLES = 32;\n/** Upper bound on samples per animated node, beyond which the frame stride grows. */\nconst MAX_SAMPLES_PER_TARGET = 100000;\n\n/**\n * Times at which the animation is baked: every key time plus the frame grid between keys. Segments where every\n * curve is linear or constant only get a few interior frames (Babylon interpolates linearly between the baked\n * keys), cubic or extrapolated segments get the full frame grid up to a cap, so day-long clips with a handful of\n * keys do not explode into millions of samples.\n */\nfunction collectAnimationSampleTimes(curveNodes: FBXCurveNodeData[], fps: number, startTime: number, stopTime: number): number[] {\n let minTime = Number.POSITIVE_INFINITY;\n let maxTime = Number.NEGATIVE_INFINITY;\n const anchorSet = new Set<number>();\n const curves: FBXCurveData[] = [];\n\n for (const curveNode of curveNodes) {\n for (const curve of curveNode.curves) {\n curves.push(curve);\n for (const key of curve.keys) {\n minTime = Math.min(minTime, key.time);\n maxTime = Math.max(maxTime, key.time);\n if (key.time >= startTime && key.time <= stopTime) {\n anchorSet.add(key.time);\n }\n }\n }\n }\n\n if (!Number.isFinite(minTime) || !Number.isFinite(maxTime)) {\n return [];\n }\n\n const rangeStart = stopTime > startTime ? startTime : minTime;\n const rangeStop = stopTime > startTime ? stopTime : maxTime;\n anchorSet.add(rangeStart);\n anchorSet.add(rangeStop);\n const anchors = Array.from(anchorSet)\n .filter((t) => t >= rangeStart && t <= rangeStop)\n .sort((a, b) => a - b);\n\n // A segment needs the dense grid when any curve is cubic there or extrapolates a non-constant pattern.\n const segmentIsDense = (t0: number): boolean => {\n for (const curve of curves) {\n const keys = curve.keys;\n if (keys.length === 0) {\n continue;\n }\n if (t0 < keys[0].time) {\n if (curve.preExtrapolation && curve.preExtrapolation.mode !== \"constant\") {\n return true;\n }\n continue;\n }\n if (t0 >= keys[keys.length - 1].time) {\n if (curve.postExtrapolation && curve.postExtrapolation.mode !== \"constant\") {\n return true;\n }\n continue;\n }\n let lo = 0;\n let hi = keys.length - 1;\n while (hi - lo > 1) {\n const mid = (lo + hi) >> 1;\n if (keys[mid].time <= t0) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n if (keys[lo].interpolation === \"cubic\") {\n return true;\n }\n }\n return false;\n };\n\n const times: number[] = [];\n const totalFrames = Math.floor(rangeStop * fps) - Math.ceil(rangeStart * fps) + 1;\n const stride = Math.max(1, Math.ceil(totalFrames / MAX_SAMPLES_PER_TARGET));\n for (let i = 0; i < anchors.length; i++) {\n const t0 = anchors[i];\n times.push(t0);\n if (i + 1 >= anchors.length) {\n break;\n }\n const t1 = anchors[i + 1];\n const firstFrame = Math.floor(t0 * fps) + 1;\n const lastFrame = Math.ceil(t1 * fps) - 1;\n const interior = lastFrame - firstFrame + 1;\n if (interior <= 0) {\n continue;\n }\n const cap = segmentIsDense(t0) ? MAX_DENSE_SEGMENT_SAMPLES : MAX_LINEAR_SEGMENT_SAMPLES;\n const step = Math.max(stride, Math.ceil(interior / cap));\n for (let frame = firstFrame; frame <= lastFrame; frame += step) {\n times.push(frame / fps);\n }\n }\n\n const sorted = times.sort((a, b) => a - b);\n // Key times and frame times can differ by floating point noise; keep one sample per instant.\n const deduped: number[] = [];\n for (const t of sorted) {\n if (t < rangeStart - 1e-9 || t > rangeStop + 1e-9) {\n continue;\n }\n if (deduped.length === 0 || t - deduped[deduped.length - 1] > 1e-9) {\n deduped.push(t);\n }\n }\n return deduped;\n}\n\nfunction areQuaternionKeysConstant(keys: { frame: number; value: Quaternion }[]): boolean {\n if (keys.length < 2) {\n return true;\n }\n const first = keys[0].value;\n for (let i = 1; i < keys.length; i++) {\n const value = keys[i].value;\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) {\n return false;\n }\n }\n return true;\n}\n\nfunction buildScalarAnimationKeys(curve: FBXCurveData, fps: number, startTime: number, stopTime: number, mapValue: (value: number) => number): IAnimationKey[] {\n const range = getCurveSampleRange(curve, startTime, stopTime);\n const keys = curve.keys\n .filter((key) => key.time >= range.start && key.time <= range.stop)\n .map((key) => ({\n source: key,\n frame: key.time * fps,\n value: mapValue(key.value),\n }));\n\n if (!keys.some((key) => Math.abs(key.source.time - range.start) < 1e-6)) {\n keys.unshift({\n source: {\n time: range.start,\n value: sampleFBXCurveAtTime(curve, range.start) ?? 0,\n interpolation: \"linear\",\n leftDx: 0,\n leftDy: 0,\n rightDx: 0,\n rightDy: 0,\n },\n frame: range.start * fps,\n value: mapValue(sampleFBXCurveAtTime(curve, range.start) ?? 0),\n });\n }\n\n if (!keys.some((key) => Math.abs(key.source.time - range.stop) < 1e-6)) {\n keys.push({\n source: {\n time: range.stop,\n value: sampleFBXCurveAtTime(curve, range.stop) ?? 0,\n interpolation: \"linear\",\n leftDx: 0,\n leftDy: 0,\n rightDx: 0,\n rightDy: 0,\n },\n frame: range.stop * fps,\n value: mapValue(sampleFBXCurveAtTime(curve, range.stop) ?? 0),\n });\n }\n\n const animationKeys: IAnimationKey[] = keys.map((key) => ({\n frame: key.frame,\n value: key.value,\n }));\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i].source;\n const nextAnimationKey = animationKeys[i + 1];\n\n if (key.interpolation === \"constant\") {\n animationKeys[i].interpolation = AnimationKeyInterpolation.STEP;\n continue;\n }\n\n if (key.interpolation !== \"cubic\") {\n continue;\n }\n\n const nextKey = keys[i + 1].source;\n const duration = Math.max(nextKey.time - key.time, 1e-6);\n const linearSlope = (nextKey.value - key.value) / duration;\n animationKeys[i].outTangent = mapSlope(key.rightSlope ?? linearSlope, mapValue) / fps;\n nextAnimationKey.inTangent = mapSlope(key.nextLeftSlope ?? linearSlope, mapValue) / fps;\n }\n\n return animationKeys;\n}\n\nfunction mapSlope(slope: number, mapValue: (value: number) => number): number {\n return mapValue(slope) - mapValue(0);\n}\n\nfunction getCurveSampleRange(curve: FBXCurveData, startTime: number, stopTime: number): { start: number; stop: number } {\n if (stopTime > startTime) {\n return { start: startTime, stop: stopTime };\n }\n\n return {\n start: curve.keys[0]?.time ?? 0,\n stop: curve.keys[curve.keys.length - 1]?.time ?? 0,\n };\n}\n\nlet _Registered = false;\n/**\n * Registers the FBXFileLoader scene loader plugin.\n * Safe to call multiple times; only the first call has an effect.\n */\nexport function RegisterFBXFileLoader(): void {\n if (_Registered) {\n return;\n }\n _Registered = true;\n\n RegisterSceneLoaderPlugin(new FBXFileLoader());\n}\n"]}