@babylonjs/loaders 9.26.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 (72) 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/USD/usdCommandProtocol.d.ts +20 -4
  66. package/USD/usdCommandProtocol.js +25 -3
  67. package/USD/usdCommandProtocol.js.map +1 -1
  68. package/USD/usdFileLoader.pure.js +2 -0
  69. package/USD/usdFileLoader.pure.js.map +1 -1
  70. package/USD/usdSceneMaterializer.js +430 -92
  71. package/USD/usdSceneMaterializer.js.map +1 -1
  72. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"animation.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/FBX/interpreter/animation.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\r\nimport { type FBXNode, findChildByName, getPropertyValue, cleanFBXName } from \"../types/fbxTypes\";\r\n\r\nimport { type FBXObjectMap, getChildren } from \"./connections\";\r\n\r\n/** FBX time units: 46186158000 ticks per second */\r\nconst FBX_TIME_UNIT = 46186158000;\r\nconst KEY_ATTR_DATA_STRIDE = 4;\r\nconst SAMPLED_CURVE_MIN_KEY_COUNT = 8;\r\nconst SAMPLED_CURVE_MAX_INTERVAL_SECONDS = 1 / 23;\r\nconst SAMPLED_CURVE_UNIFORM_TOLERANCE_RATIO = 0.05;\r\nconst SAMPLED_CURVE_LINEAR_DEVIATION_RATIO = 0.01;\r\nconst SAMPLED_CURVE_LINEAR_DEVIATION_ABSOLUTE = 1e-4;\r\nconst SAMPLED_CURVE_DEGENERATE_SLOPE_ABSOLUTE = 1e-5;\r\nconst SAMPLED_CURVE_COMMON_FPS = [24, 25, 30, 48, 50, 60, 100, 120];\r\n\r\nexport type FBXInterpolationType = \"constant\" | \"linear\" | \"cubic\";\r\n\r\n/** A single keyframe */\r\nexport interface FBXKeyframe {\r\n /** Time in seconds */\r\n time: number;\r\n /** Value at this keyframe */\r\n value: number;\r\n /** Interpolation used from this key to the next key */\r\n interpolation: FBXInterpolationType;\r\n /** Constant interpolation variant */\r\n constantMode?: \"standard\" | \"next\";\r\n /** Cubic outgoing slope in value units per second */\r\n rightSlope?: number;\r\n /** Cubic incoming slope for the next key, in value units per second */\r\n nextLeftSlope?: number;\r\n}\r\n\r\n/** An animation curve (one axis of one property) */\r\nexport interface FBXCurveData {\r\n /** Channel: \"d|X\", \"d|Y\", \"d|Z\" */\r\n channel: string;\r\n /** Keyframes */\r\n keys: FBXKeyframe[];\r\n /** True for baked sample curves that should be connected as linear samples */\r\n isSampled?: boolean;\r\n}\r\n\r\n/** An animation curve node (T/R/S for one bone) */\r\nexport interface FBXCurveNodeData {\r\n /** Property type: \"T\" (translation), \"R\" (rotation), \"S\" (scale) */\r\n type: string;\r\n /** Target model (bone) ID */\r\n targetModelId: number;\r\n /** Curves for each axis */\r\n curves: FBXCurveData[];\r\n}\r\n\r\n/** Unsupported animation curve node preserved for diagnostics and future support. */\r\nexport interface FBXUnsupportedCurveNodeData {\r\n /** Raw AnimationCurveNode property type/name */\r\n type: string;\r\n /** CurveNode object ID */\r\n id: number;\r\n /** Target object ID if the curve node is connected to an object/property */\r\n targetId: number | null;\r\n /** OP connection property name on the target, e.g. Visibility */\r\n propertyName?: string;\r\n /** Number of connected animation curves that were ignored */\r\n curveCount: number;\r\n /** Connected curves preserved for diagnostics and future runtime support */\r\n curves: FBXCurveData[];\r\n /** Local default values stored on the unsupported curve node */\r\n defaultValues: Record<string, number>;\r\n}\r\n\r\n/** Recoverable animation import issue. */\r\nexport interface FBXAnimationDiagnostic {\r\n /** Diagnostic category. */\r\n type: \"multiple-animation-layers\" | \"unsupported-layer-blend-mode\" | \"partial-layer-weight\" | \"unsupported-curve-node\";\r\n /** Human-readable diagnostic message. */\r\n message: string;\r\n /** Animation layer name associated with the diagnostic, if applicable. */\r\n layerName?: string;\r\n /** AnimationCurveNode object ID associated with the diagnostic, if applicable. */\r\n curveNodeId?: number;\r\n /** AnimationCurveNode type/name associated with the diagnostic, if applicable. */\r\n curveNodeType?: string;\r\n /** Target object ID associated with the diagnostic, if applicable. */\r\n targetId?: number | null;\r\n /** Target property name associated with the diagnostic, if applicable. */\r\n propertyName?: string;\r\n}\r\n\r\n/** Animation layer with blend mode info */\r\nexport interface FBXAnimationLayerData {\r\n /** Layer name */\r\n name: string;\r\n /** Layer weight (0-100, default 100) */\r\n weight: number;\r\n /** Layer weight normalized to 0-1 */\r\n normalizedWeight: number;\r\n /** Blend mode: 0=Additive, 1=Override, 2=OverridePassthrough */\r\n blendMode: number;\r\n /** Curve nodes in this layer */\r\n curveNodes: FBXCurveNodeData[];\r\n /** Unsupported/non-TRS curve nodes preserved for diagnostics */\r\n unsupportedCurveNodes: FBXUnsupportedCurveNodeData[];\r\n /** Recoverable layer diagnostics */\r\n diagnostics: FBXAnimationDiagnostic[];\r\n}\r\n\r\n/** One animation clip (AnimationStack) */\r\nexport interface FBXAnimationStackData {\r\n /** Animation name */\r\n name: string;\r\n /** Clip start in seconds after any keyframe rebasing */\r\n startTime: number;\r\n /** Clip stop in seconds after any keyframe rebasing */\r\n stopTime: number;\r\n /** Duration in seconds */\r\n duration: number;\r\n /** Per-bone curve nodes (flattened from all layers for backward compat) */\r\n curveNodes: FBXCurveNodeData[];\r\n /** Animation layers (preserves blend mode info) */\r\n layers: FBXAnimationLayerData[];\r\n /** Unsupported/non-TRS curve nodes preserved for diagnostics */\r\n unsupportedCurveNodes: FBXUnsupportedCurveNodeData[];\r\n /** Recoverable animation diagnostics */\r\n diagnostics: FBXAnimationDiagnostic[];\r\n}\r\n\r\n/**\r\n * Extract all animation stacks from the FBX scene.\r\n */\r\nexport function extractAnimations(objectMap: FBXObjectMap): FBXAnimationStackData[] {\r\n const stacks: FBXAnimationStackData[] = [];\r\n\r\n for (const [id, node] of Array.from(objectMap.objects)) {\r\n if (node.name === \"AnimationStack\") {\r\n const stack = extractAnimStack(id, node, objectMap);\r\n if (stack) {\r\n stacks.push(stack);\r\n }\r\n }\r\n }\r\n\r\n return stacks;\r\n}\r\n\r\nfunction extractAnimStack(stackId: number, stackNode: FBXNode, objectMap: FBXObjectMap): FBXAnimationStackData | null {\r\n const name = cleanFBXName(getPropertyValue<string>(stackNode, 1) ?? \"Animation\");\r\n const declaredTimeSpan = extractAnimationStackTimeSpan(stackNode);\r\n\r\n // Find AnimationLayer children of this stack\r\n const layerEntries = getChildren(objectMap, stackId, \"AnimationLayer\");\r\n if (layerEntries.length === 0) {\r\n return null;\r\n }\r\n\r\n // Collect all CurveNodes from all layers\r\n const allCurveNodes: FBXCurveNodeData[] = [];\r\n const allUnsupportedCurveNodes: FBXUnsupportedCurveNodeData[] = [];\r\n const layers: FBXAnimationLayerData[] = [];\r\n const diagnostics: FBXAnimationDiagnostic[] = [];\r\n let minTime = Infinity;\r\n let maxTime = 0;\r\n\r\n for (const { id: layerId, node: layerNode } of layerEntries) {\r\n // Extract layer properties\r\n const layerName = cleanFBXName(getPropertyValue<string>(layerNode, 1) ?? \"Layer\");\r\n let weight = 100;\r\n let blendMode = 0;\r\n\r\n const props70 = findChildByName(layerNode, \"Properties70\");\r\n if (props70) {\r\n for (const p of props70.children) {\r\n if (p.name !== \"P\") {\r\n continue;\r\n }\r\n const pName = getPropertyValue<string>(p, 0);\r\n if (pName === \"Weight\") {\r\n const v = p.properties[4]?.value;\r\n if (typeof v === \"number\") {\r\n weight = v;\r\n }\r\n } else if (pName === \"BlendMode\") {\r\n const v = p.properties[4]?.value;\r\n if (typeof v === \"number\") {\r\n blendMode = v;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // AnimationCurveNodes are children of the layer\r\n const curveNodeEntries = getChildren(objectMap, layerId, \"AnimationCurveNode\");\r\n const layerCurveNodes: FBXCurveNodeData[] = [];\r\n const layerUnsupportedCurveNodes: FBXUnsupportedCurveNodeData[] = [];\r\n const layerDiagnostics: FBXAnimationDiagnostic[] = [];\r\n\r\n for (const { id: curveNodeId, node: curveNodeNode } of curveNodeEntries) {\r\n const curveNodeData = extractCurveNode(curveNodeId, curveNodeNode, objectMap);\r\n if (!curveNodeData) {\r\n const unsupported = extractUnsupportedCurveNode(curveNodeId, curveNodeNode, objectMap);\r\n if (unsupported) {\r\n scanCurveTimes(unsupported.curves, (time) => {\r\n if (time < minTime) {\r\n minTime = time;\r\n }\r\n if (time > maxTime) {\r\n maxTime = time;\r\n }\r\n });\r\n layerUnsupportedCurveNodes.push(unsupported);\r\n allUnsupportedCurveNodes.push(unsupported);\r\n const diagnostic: FBXAnimationDiagnostic = {\r\n type: \"unsupported-curve-node\",\r\n message: `AnimationCurveNode '${unsupported.type}' is preserved as diagnostic data but not evaluated at runtime.`,\r\n layerName,\r\n curveNodeId,\r\n curveNodeType: unsupported.type,\r\n targetId: unsupported.targetId,\r\n propertyName: unsupported.propertyName,\r\n };\r\n layerDiagnostics.push(diagnostic);\r\n diagnostics.push(diagnostic);\r\n }\r\n continue;\r\n }\r\n\r\n for (const curve of curveNodeData.curves) {\r\n for (const key of curve.keys) {\r\n if (key.time < minTime) {\r\n minTime = key.time;\r\n }\r\n if (key.time > maxTime) {\r\n maxTime = key.time;\r\n }\r\n }\r\n }\r\n\r\n layerCurveNodes.push(curveNodeData);\r\n allCurveNodes.push(curveNodeData);\r\n }\r\n\r\n layers.push({\r\n name: layerName,\r\n weight,\r\n normalizedWeight: weight / 100,\r\n blendMode,\r\n curveNodes: layerCurveNodes,\r\n unsupportedCurveNodes: layerUnsupportedCurveNodes,\r\n diagnostics: layerDiagnostics,\r\n });\r\n }\r\n\r\n if (allCurveNodes.length === 0 && allUnsupportedCurveNodes.length === 0) {\r\n return null;\r\n }\r\n\r\n if (layers.length > 1) {\r\n diagnostics.push({\r\n type: \"multiple-animation-layers\",\r\n message: \"Multiple animation layers are preserved, but runtime blending is not yet evaluated.\",\r\n });\r\n }\r\n for (const layer of layers) {\r\n if (layer.blendMode !== 0) {\r\n const diagnostic: FBXAnimationDiagnostic = {\r\n type: \"unsupported-layer-blend-mode\",\r\n message: `Animation layer blend mode ${layer.blendMode} is preserved but not yet blended at runtime.`,\r\n layerName: layer.name,\r\n };\r\n layer.diagnostics.push(diagnostic);\r\n diagnostics.push(diagnostic);\r\n }\r\n if (layer.weight !== 100) {\r\n const diagnostic: FBXAnimationDiagnostic = {\r\n type: \"partial-layer-weight\",\r\n message: `Animation layer weight ${layer.weight} is preserved but not yet applied at runtime.`,\r\n layerName: layer.name,\r\n };\r\n layer.diagnostics.push(diagnostic);\r\n diagnostics.push(diagnostic);\r\n }\r\n }\r\n\r\n const timeOffset = minTime > 0 && isFinite(minTime) ? minTime : 0;\r\n\r\n // Rebase all keyframe times so the animation starts at 0\r\n if (timeOffset > 0) {\r\n for (const cn of allCurveNodes) {\r\n for (const curve of cn.curves) {\r\n for (const key of curve.keys) {\r\n key.time -= timeOffset;\r\n }\r\n }\r\n }\r\n for (const cn of allUnsupportedCurveNodes) {\r\n for (const curve of cn.curves) {\r\n for (const key of curve.keys) {\r\n key.time -= timeOffset;\r\n }\r\n }\r\n }\r\n maxTime -= timeOffset;\r\n }\r\n\r\n const declaredStart = declaredTimeSpan ? Math.max(declaredTimeSpan.start - timeOffset, 0) : 0;\r\n const declaredStop = declaredTimeSpan ? Math.max(declaredTimeSpan.stop - timeOffset, declaredStart) : 0;\r\n const hasDeclaredDuration = declaredStop > declaredStart;\r\n const startTime = hasDeclaredDuration ? declaredStart : 0;\r\n const stopTime = hasDeclaredDuration ? declaredStop : maxTime;\r\n\r\n return {\r\n name,\r\n startTime,\r\n stopTime,\r\n duration: Math.max(stopTime - startTime, 0),\r\n curveNodes: allCurveNodes,\r\n layers,\r\n unsupportedCurveNodes: allUnsupportedCurveNodes,\r\n diagnostics,\r\n };\r\n}\r\n\r\nfunction extractAnimationStackTimeSpan(stackNode: FBXNode): { start: number; stop: number } | null {\r\n const props70 = findChildByName(stackNode, \"Properties70\");\r\n if (!props70) {\r\n return null;\r\n }\r\n\r\n let start = 0;\r\n let stop: number | null = null;\r\n\r\n for (const p of props70.children) {\r\n if (p.name !== \"P\") {\r\n continue;\r\n }\r\n const pName = getPropertyValue<string>(p, 0);\r\n if (pName === \"LocalStart\" || pName === \"ReferenceStart\") {\r\n start = fbxTimeToSeconds(p.properties[4]?.value) ?? start;\r\n } else if (pName === \"LocalStop\" || pName === \"ReferenceStop\") {\r\n stop = fbxTimeToSeconds(p.properties[4]?.value) ?? stop;\r\n }\r\n }\r\n\r\n return stop !== null ? { start, stop } : null;\r\n}\r\n\r\nfunction extractCurveNode(curveNodeId: number, curveNodeNode: FBXNode, objectMap: FBXObjectMap): FBXCurveNodeData | null {\r\n const typeName = cleanFBXName(getPropertyValue<string>(curveNodeNode, 1) ?? \"\");\r\n\r\n // Handle T (translation), R (rotation), S (scale) targeting Models\r\n if (typeName === \"T\" || typeName === \"R\" || typeName === \"S\") {\r\n const targetModelId = findCurveNodeTarget(curveNodeId, objectMap);\r\n if (targetModelId === null) {\r\n return null;\r\n }\r\n\r\n const curves = extractCurves(curveNodeId, objectMap);\r\n if (curves.length === 0) {\r\n return null;\r\n }\r\n\r\n return {\r\n type: typeName,\r\n targetModelId,\r\n curves,\r\n };\r\n }\r\n\r\n // Handle DeformPercent targeting BlendShapeChannels\r\n if (typeName === \"DeformPercent\") {\r\n const targetId = findCurveNodeBlendShapeTarget(curveNodeId, objectMap);\r\n if (targetId === null) {\r\n return null;\r\n }\r\n\r\n const curves = extractCurves(curveNodeId, objectMap);\r\n if (curves.length === 0) {\r\n return null;\r\n }\r\n\r\n return {\r\n type: \"DeformPercent\",\r\n targetModelId: targetId,\r\n curves,\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction extractUnsupportedCurveNode(curveNodeId: number, curveNodeNode: FBXNode, objectMap: FBXObjectMap): FBXUnsupportedCurveNodeData | null {\r\n const typeName = cleanFBXName(getPropertyValue<string>(curveNodeNode, 1) ?? \"\");\r\n const curves = extractCurves(curveNodeId, objectMap);\r\n const defaultValues = extractCurveNodeDefaultValues(curveNodeNode);\r\n if (curves.length === 0 && Object.keys(defaultValues).length === 0) {\r\n return null;\r\n }\r\n\r\n let targetId: number | null = null;\r\n let propertyName: string | undefined;\r\n for (const conn of objectMap.connections) {\r\n if (conn.childId === curveNodeId && conn.type === \"OP\") {\r\n targetId = conn.parentId;\r\n propertyName = conn.propertyName;\r\n break;\r\n }\r\n }\r\n\r\n return {\r\n type: typeName,\r\n id: curveNodeId,\r\n targetId,\r\n propertyName,\r\n curveCount: curves.length,\r\n curves,\r\n defaultValues,\r\n };\r\n}\r\n\r\nfunction scanCurveTimes(curves: FBXCurveData[], visit: (time: number) => void): void {\r\n for (const curve of curves) {\r\n for (const key of curve.keys) {\r\n visit(key.time);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Find the Model that an AnimationCurveNode targets.\r\n * The CurveNode connects to the Model via OP connection with a property name.\r\n */\r\nfunction findCurveNodeTarget(curveNodeId: number, objectMap: FBXObjectMap): number | null {\r\n // Look for connections where this curveNode is a child (going up to parent)\r\n // The OP connection from curveNode → Model has the property name (e.g. \"Lcl Translation\")\r\n for (const conn of objectMap.connections) {\r\n if (conn.childId === curveNodeId && conn.type === \"OP\") {\r\n const parentNode = objectMap.objects.get(conn.parentId);\r\n if (parentNode && parentNode.name === \"Model\") {\r\n return conn.parentId;\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Find the BlendShapeChannel that a DeformPercent AnimationCurveNode targets.\r\n */\r\nfunction findCurveNodeBlendShapeTarget(curveNodeId: number, objectMap: FBXObjectMap): number | null {\r\n for (const conn of objectMap.connections) {\r\n if (conn.childId === curveNodeId && conn.type === \"OP\") {\r\n const parentNode = objectMap.objects.get(conn.parentId);\r\n if (parentNode && parentNode.name === \"Deformer\") {\r\n const subType = getPropertyValue<string>(parentNode, 2);\r\n if (subType === \"BlendShapeChannel\") {\r\n return conn.parentId;\r\n }\r\n }\r\n }\r\n }\r\n // Also check OO connections\r\n for (const conn of objectMap.connections) {\r\n if (conn.childId === curveNodeId && conn.type === \"OO\") {\r\n const parentNode = objectMap.objects.get(conn.parentId);\r\n if (parentNode && parentNode.name === \"Deformer\") {\r\n const subType = getPropertyValue<string>(parentNode, 2);\r\n if (subType === \"BlendShapeChannel\") {\r\n return conn.parentId;\r\n }\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Extract AnimationCurves connected to a CurveNode.\r\n * Each curve connects via OP with channel \"d|X\", \"d|Y\", or \"d|Z\".\r\n */\r\nfunction extractCurves(curveNodeId: number, objectMap: FBXObjectMap): FBXCurveData[] {\r\n const curves: FBXCurveData[] = [];\r\n\r\n // Find AnimationCurve children of this CurveNode\r\n for (const conn of objectMap.connections) {\r\n if (conn.parentId === curveNodeId && conn.type === \"OP\") {\r\n const curveNode = objectMap.objects.get(conn.childId);\r\n if (!curveNode || curveNode.name !== \"AnimationCurve\") {\r\n continue;\r\n }\r\n\r\n const channel = conn.propertyName ?? \"d|X\";\r\n const keys = extractKeyframes(curveNode);\r\n if (keys.length > 0) {\r\n const isSampled = isSampledAnimationCurve(curveNode, keys);\r\n curves.push({ channel, keys: isSampled ? makeLinearSampleKeys(keys) : keys, isSampled });\r\n }\r\n }\r\n }\r\n\r\n // Also check OO connections (some exporters use OO for curve→curveNode)\r\n if (curves.length === 0) {\r\n const ooChildren = getChildren(objectMap, curveNodeId, \"AnimationCurve\");\r\n // For OO connections, infer channel from order (X, Y, Z)\r\n const channelNames = [\"d|X\", \"d|Y\", \"d|Z\"];\r\n for (let i = 0; i < ooChildren.length && i < 3; i++) {\r\n const keys = extractKeyframes(ooChildren[i].node);\r\n if (keys.length > 0) {\r\n const isSampled = isSampledAnimationCurve(ooChildren[i].node, keys);\r\n curves.push({ channel: channelNames[i], keys: isSampled ? makeLinearSampleKeys(keys) : keys, isSampled });\r\n }\r\n }\r\n }\r\n\r\n return curves;\r\n}\r\n\r\nfunction extractCurveNodeDefaultValues(curveNodeNode: FBXNode): Record<string, number> {\r\n const defaults: Record<string, number> = {};\r\n const props70 = findChildByName(curveNodeNode, \"Properties70\");\r\n for (const p of props70?.children ?? []) {\r\n if (p.name !== \"P\") {\r\n continue;\r\n }\r\n const propName = getPropertyValue<string>(p, 0);\r\n if (!propName?.startsWith(\"d|\")) {\r\n continue;\r\n }\r\n const value = toNumber(p.properties[4]?.value);\r\n if (value !== null) {\r\n defaults[propName] = value;\r\n }\r\n }\r\n return defaults;\r\n}\r\n\r\n/**\r\n * Extract keyframes from an AnimationCurve node.\r\n */\r\nfunction extractKeyframes(curveNode: FBXNode): FBXKeyframe[] {\r\n const keyTimeNode = findChildByName(curveNode, \"KeyTime\");\r\n const keyValueNode = findChildByName(curveNode, \"KeyValueFloat\");\r\n\r\n if (!keyTimeNode || !keyValueNode) {\r\n return [];\r\n }\r\n\r\n const keyTimes = toInt64Array(keyTimeNode.properties[0]?.value);\r\n const keyValues = toFloat32Array(keyValueNode.properties[0]?.value);\r\n const keyAttrFlags = toInt32Array(findChildByName(curveNode, \"KeyAttrFlags\")?.properties[0]?.value);\r\n const keyAttrData = toFloat32Array(findChildByName(curveNode, \"KeyAttrDataFloat\")?.properties[0]?.value);\r\n const keyAttrRefCount = toInt32Array(findChildByName(curveNode, \"KeyAttrRefCount\")?.properties[0]?.value);\r\n\r\n if (!keyTimes || !keyValues) {\r\n return [];\r\n }\r\n if (keyTimes.length !== keyValues.length) {\r\n return [];\r\n }\r\n\r\n const keyAttributeIndices = buildKeyAttributeIndices(keyTimes.length, keyAttrFlags, keyAttrRefCount);\r\n\r\n const keys: FBXKeyframe[] = [];\r\n for (let i = 0; i < keyTimes.length; i++) {\r\n const attrIndex = keyAttributeIndices[i];\r\n const flag = attrIndex >= 0 ? (keyAttrFlags?.[attrIndex] ?? 0) : 0;\r\n const dataOffset = attrIndex * KEY_ATTR_DATA_STRIDE;\r\n\r\n keys.push({\r\n time: Number(keyTimes[i]) / FBX_TIME_UNIT,\r\n value: keyValues[i],\r\n interpolation: getInterpolationType(flag),\r\n constantMode: (flag & 0x00000100) !== 0 ? \"next\" : \"standard\",\r\n rightSlope: getFiniteKeyAttrData(keyAttrData, dataOffset),\r\n nextLeftSlope: getFiniteKeyAttrData(keyAttrData, dataOffset + 1),\r\n });\r\n }\r\n\r\n return keys;\r\n}\r\n\r\nfunction isSampledAnimationCurve(curveNode: FBXNode, keys: readonly FBXKeyframe[]): boolean {\r\n const rawName = getPropertyValue<string>(curveNode, 1) ?? \"\";\r\n return cleanFBXName(rawName) === \"FbxMayaSample Curve\" || isFrameBakedSampledCurve(keys);\r\n}\r\n\r\n/**\r\n * Determines whether a key sequence appears to be a uniformly frame-baked sampled curve.\r\n * @param keys - Keyframes to inspect\r\n * @returns true if the keys look like sampled frame data rather than authored interpolation\r\n */\r\nexport function isFrameBakedSampledCurve(keys: readonly FBXKeyframe[]): boolean {\r\n if (keys.length < SAMPLED_CURVE_MIN_KEY_COUNT) {\r\n return false;\r\n }\r\n\r\n const deltas: number[] = [];\r\n for (let i = 1; i < keys.length; i++) {\r\n const delta = keys[i].time - keys[i - 1].time;\r\n if (!(delta > 0)) {\r\n return false;\r\n }\r\n deltas.push(delta);\r\n }\r\n\r\n const averageDelta = deltas.reduce((sum, delta) => sum + delta, 0) / deltas.length;\r\n if (averageDelta > SAMPLED_CURVE_MAX_INTERVAL_SECONDS) {\r\n return false;\r\n }\r\n\r\n const uniformTolerance = Math.max(1e-6, averageDelta * SAMPLED_CURVE_UNIFORM_TOLERANCE_RATIO);\r\n if (deltas.some((delta) => Math.abs(delta - averageDelta) > uniformTolerance)) {\r\n return false;\r\n }\r\n\r\n const sampledFps = 1 / averageDelta;\r\n const matchesCommonFps = SAMPLED_CURVE_COMMON_FPS.some((fps) => Math.abs(sampledFps - fps) <= Math.max(0.25, fps * 0.02));\r\n if (!matchesCommonFps) {\r\n return false;\r\n }\r\n\r\n return !hasMeaningfulCubicTangents(keys);\r\n}\r\n\r\nfunction makeLinearSampleKeys(keys: FBXKeyframe[]): FBXKeyframe[] {\r\n return keys.map((key) => ({\r\n time: key.time,\r\n value: key.value,\r\n interpolation: \"linear\",\r\n }));\r\n}\r\n\r\nfunction hasMeaningfulCubicTangents(keys: readonly FBXKeyframe[]): boolean {\r\n let hasCubicSegment = false;\r\n let hasCompleteTangents = true;\r\n let allSlopesDegenerate = true;\r\n let minValue = Number.POSITIVE_INFINITY;\r\n let maxValue = Number.NEGATIVE_INFINITY;\r\n let maxLinearDeviation = 0;\r\n\r\n for (const key of keys) {\r\n minValue = Math.min(minValue, key.value);\r\n maxValue = Math.max(maxValue, key.value);\r\n }\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n const nextKey = keys[i + 1];\r\n if (key.interpolation !== \"cubic\") {\r\n continue;\r\n }\r\n\r\n hasCubicSegment = true;\r\n const segmentDuration = nextKey.time - key.time;\r\n if (!(segmentDuration > 0)) {\r\n continue;\r\n }\r\n\r\n const linearSlope = (nextKey.value - key.value) / segmentDuration;\r\n const rightSlope = key.rightSlope;\r\n const nextLeftSlope = key.nextLeftSlope;\r\n if (rightSlope === undefined || nextLeftSlope === undefined) {\r\n hasCompleteTangents = false;\r\n continue;\r\n }\r\n\r\n if (Math.abs(rightSlope) > SAMPLED_CURVE_DEGENERATE_SLOPE_ABSOLUTE || Math.abs(nextLeftSlope) > SAMPLED_CURVE_DEGENERATE_SLOPE_ABSOLUTE) {\r\n allSlopesDegenerate = false;\r\n }\r\n\r\n for (const t of [0.25, 0.5, 0.75]) {\r\n const cubic = cubicHermite(key.value, nextKey.value, rightSlope, nextLeftSlope, segmentDuration, t);\r\n const linear = key.value + t * segmentDuration * linearSlope;\r\n maxLinearDeviation = Math.max(maxLinearDeviation, Math.abs(cubic - linear));\r\n }\r\n }\r\n\r\n if (!hasCubicSegment || !hasCompleteTangents || allSlopesDegenerate) {\r\n return false;\r\n }\r\n\r\n const range = maxValue - minValue;\r\n const deviationTolerance = Math.max(SAMPLED_CURVE_LINEAR_DEVIATION_ABSOLUTE, range * SAMPLED_CURVE_LINEAR_DEVIATION_RATIO);\r\n return maxLinearDeviation > deviationTolerance;\r\n}\r\n\r\n/**\r\n * Samples an FBX animation curve at a specific time.\r\n * @param curveData - Curve data to sample\r\n * @param time - Time in seconds\r\n * @returns The sampled value, or null when the curve has no keys\r\n */\r\nexport function sampleFBXCurveAtTime(curveData: FBXCurveData | undefined, time: number): number | null {\r\n if (!curveData || curveData.keys.length === 0) {\r\n return null;\r\n }\r\n\r\n const keys = curveData.keys;\r\n\r\n if (time <= keys[0].time) {\r\n return keys[0].value;\r\n }\r\n if (time >= keys[keys.length - 1].time) {\r\n return keys[keys.length - 1].value;\r\n }\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n const nextKey = keys[i + 1];\r\n if (time < key.time || time > nextKey.time) {\r\n continue;\r\n }\r\n\r\n if (nextKey.time === key.time) {\r\n return key.value;\r\n }\r\n if (key.interpolation === \"constant\") {\r\n return key.constantMode === \"next\" ? nextKey.value : key.value;\r\n }\r\n\r\n const segmentDuration = nextKey.time - key.time;\r\n const t = (time - key.time) / segmentDuration;\r\n\r\n if (key.interpolation === \"cubic\" && !curveData.isSampled) {\r\n const linearSlope = (nextKey.value - key.value) / segmentDuration;\r\n const rightSlope = key.rightSlope ?? linearSlope;\r\n const nextLeftSlope = key.nextLeftSlope ?? linearSlope;\r\n return cubicHermite(key.value, nextKey.value, rightSlope, nextLeftSlope, segmentDuration, t);\r\n }\r\n\r\n return key.value + t * (nextKey.value - key.value);\r\n }\r\n\r\n return keys[keys.length - 1].value;\r\n}\r\n\r\n// ── Utilities ──────────────────────────────────────────────────────────────────\r\n\r\nfunction toInt64Array(value: unknown): Float64Array | null {\r\n if (value instanceof Float64Array) {\r\n return value;\r\n }\r\n return null;\r\n}\r\n\r\nfunction toInt32Array(value: unknown): Int32Array | null {\r\n if (value instanceof Int32Array) {\r\n return value;\r\n }\r\n if (value instanceof Float32Array || value instanceof Float64Array) {\r\n const result = new Int32Array(value.length);\r\n for (let i = 0; i < value.length; i++) {\r\n result[i] = value[i];\r\n }\r\n return result;\r\n }\r\n return null;\r\n}\r\n\r\nfunction fbxTimeToSeconds(value: unknown): number | null {\r\n if (typeof value === \"number\") {\r\n return value / FBX_TIME_UNIT;\r\n }\r\n return null;\r\n}\r\n\r\nfunction toNumber(value: unknown): number | null {\r\n if (typeof value === \"number\") {\r\n return value;\r\n }\r\n return null;\r\n}\r\n\r\nfunction toFloat32Array(value: unknown): Float32Array | null {\r\n if (value instanceof Float32Array) {\r\n return value;\r\n }\r\n if (value instanceof Float64Array) {\r\n const result = new Float32Array(value.length);\r\n for (let i = 0; i < value.length; i++) {\r\n result[i] = value[i];\r\n }\r\n return result;\r\n }\r\n return null;\r\n}\r\n\r\nfunction buildKeyAttributeIndices(keyCount: number, keyAttrFlags: Int32Array | null, keyAttrRefCount: Int32Array | null): number[] {\r\n if (!keyAttrFlags || keyAttrFlags.length === 0) {\r\n return new Array(keyCount).fill(-1);\r\n }\r\n\r\n if (keyAttrRefCount && keyAttrRefCount.length > 0) {\r\n let total = 0;\r\n for (const count of keyAttrRefCount) {\r\n total += count;\r\n }\r\n\r\n if (total === keyCount) {\r\n const indices: number[] = [];\r\n for (let attrIndex = 0; attrIndex < keyAttrRefCount.length; attrIndex++) {\r\n const count = keyAttrRefCount[attrIndex];\r\n for (let i = 0; i < count; i++) {\r\n indices.push(attrIndex);\r\n }\r\n }\r\n return indices;\r\n }\r\n }\r\n\r\n if (keyAttrFlags.length === keyCount) {\r\n return Array.from({ length: keyCount }, (_, i) => i);\r\n }\r\n\r\n if (keyAttrFlags.length === 1) {\r\n return new Array(keyCount).fill(0);\r\n }\r\n\r\n return Array.from({ length: keyCount }, (_, i) => Math.min(i, keyAttrFlags.length - 1));\r\n}\r\n\r\nfunction getInterpolationType(flag: number): FBXInterpolationType {\r\n if ((flag & 0x00000008) !== 0) {\r\n return \"cubic\";\r\n }\r\n if ((flag & 0x00000004) !== 0) {\r\n return \"linear\";\r\n }\r\n if ((flag & 0x00000002) !== 0) {\r\n return \"constant\";\r\n }\r\n return \"linear\";\r\n}\r\n\r\nfunction getFiniteKeyAttrData(keyAttrData: Float32Array | null, index: number): number | undefined {\r\n if (!keyAttrData || index < 0 || index >= keyAttrData.length) {\r\n return undefined;\r\n }\r\n const value = keyAttrData[index];\r\n return Number.isFinite(value) ? value : undefined;\r\n}\r\n\r\nfunction cubicHermite(value0: number, value1: number, slope0: number, slope1: number, segmentDuration: number, t: number): number {\r\n const t2 = t * t;\r\n const t3 = t2 * t;\r\n const h00 = 2 * t3 - 3 * t2 + 1;\r\n const h10 = t3 - 2 * t2 + t;\r\n const h01 = -2 * t3 + 3 * t2;\r\n const h11 = t3 - t2;\r\n\r\n return h00 * value0 + h10 * segmentDuration * slope0 + h01 * value1 + h11 * segmentDuration * slope1;\r\n}\r\n"]}
1
+ {"version":3,"file":"animation.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/FBX/interpreter/animation.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\nimport { type FBXDocument, type FBXNode, findChildByName, findDocumentNode, getNodeArray, getPropertyValue, cleanFBXName } from \"../types/fbxTypes\";\n\nimport { type FBXObjectMap, getChildren } from \"./connections\";\nimport { getPropertyEntries } from \"./propertyTemplates\";\nimport {\n FBX_TIME_UNIT,\n buildKeyframes,\n evaluateCurve,\n keyframesFromSlopes,\n parseExtrapolation,\n combineLayerValue,\n type FBXCurveData,\n type FBXInterpolationType,\n type FBXKeyframe,\n type FBXLayerBlend,\n} from \"./animationCurve\";\n\nexport { FBX_TIME_UNIT } from \"./animationCurve\";\nexport type { FBXCurveData, FBXExtrapolation, FBXExtrapolationMode, FBXInterpolationType, FBXKeyframe, FBXLayerBlend } from \"./animationCurve\";\nexport { combineLayerValue, evaluateCurve, eulerToQuat, quatToEuler } from \"./animationCurve\";\n\nconst KEY_ATTR_DATA_STRIDE = 4;\n\n/** An animation curve node (T/R/S for one bone) */\nexport interface FBXCurveNodeData {\n /** Property type: \"T\" (translation), \"R\" (rotation), \"S\" (scale) */\n type: string;\n /** Target model (bone) ID */\n targetModelId: number;\n /** Curves for each axis */\n curves: FBXCurveData[];\n /** Index of the owning layer within the stack's layer list */\n layerIndex: number;\n /** Default channel values (`d|X`, `d|Y`, `d|Z`) used for channels without a curve */\n defaultValues?: [number, number, number];\n}\n\n/** Non-transform animation curve node (property animation), evaluated by the loader when a Babylon mapping exists. */\nexport interface FBXUnsupportedCurveNodeData {\n /** Raw AnimationCurveNode property type/name */\n type: string;\n /** CurveNode object ID */\n id: number;\n /** Index of the owning layer within the stack's layer list */\n layerIndex: number;\n /** Target object ID if the curve node is connected to an object/property */\n targetId: number | null;\n /** OP connection property name on the target, e.g. Visibility */\n propertyName?: string;\n /** Number of connected animation curves that were ignored */\n curveCount: number;\n /** Connected curves preserved for diagnostics and future runtime support */\n curves: FBXCurveData[];\n /** Local default values stored on the unsupported curve node */\n defaultValues: Record<string, number>;\n}\n\n/** Recoverable animation import issue. */\nexport interface FBXAnimationDiagnostic {\n /** Diagnostic category. */\n type: \"multiple-animation-layers\" | \"unsupported-layer-blend-mode\" | \"partial-layer-weight\" | \"unsupported-curve-node\";\n /** Human-readable diagnostic message. */\n message: string;\n /** Animation layer name associated with the diagnostic, if applicable. */\n layerName?: string;\n /** AnimationCurveNode object ID associated with the diagnostic, if applicable. */\n curveNodeId?: number;\n /** AnimationCurveNode type/name associated with the diagnostic, if applicable. */\n curveNodeType?: string;\n /** Target object ID associated with the diagnostic, if applicable. */\n targetId?: number | null;\n /** Target property name associated with the diagnostic, if applicable. */\n propertyName?: string;\n}\n\n/** Animation layer with blend mode info */\nexport interface FBXAnimationLayerData {\n /** Layer name */\n name: string;\n /** Layer weight (0-100, default 100) */\n weight: number;\n /** Layer weight normalized to 0-1 */\n normalizedWeight: number;\n /** Blend mode: 0=Additive, 1=Override, 2=OverridePassthrough */\n blendMode: number;\n /** Resolved blend semantics used by the evaluator */\n blend: FBXLayerBlend;\n /** Animated layer weight (0-100), when the Weight property carries a curve */\n weightCurve?: FBXCurveData;\n /** Curve nodes in this layer */\n curveNodes: FBXCurveNodeData[];\n /** Unsupported/non-TRS curve nodes preserved for diagnostics */\n unsupportedCurveNodes: FBXUnsupportedCurveNodeData[];\n /** Recoverable layer diagnostics */\n diagnostics: FBXAnimationDiagnostic[];\n}\n\n/** Options for animation extraction. */\nexport interface FBXAnimationExtractOptions {\n /**\n * Shift each clip so its first key sits at time 0 (default true). False keeps the times authored in the file, so\n * clips of one file stay aligned with each other and with the declared stack range.\n */\n rebaseKeyframes?: boolean;\n}\n\n/** One animation clip (AnimationStack) */\nexport interface FBXAnimationStackData {\n /** Animation name */\n name: string;\n /** Clip start in seconds after any keyframe rebasing */\n startTime: number;\n /** Clip stop in seconds after any keyframe rebasing */\n stopTime: number;\n /** Duration in seconds */\n duration: number;\n /** Per-bone curve nodes (flattened from all layers for backward compat) */\n curveNodes: FBXCurveNodeData[];\n /** Animation layers (preserves blend mode info) */\n layers: FBXAnimationLayerData[];\n /** Unsupported/non-TRS curve nodes preserved for diagnostics */\n unsupportedCurveNodes: FBXUnsupportedCurveNodeData[];\n /** Recoverable animation diagnostics */\n diagnostics: FBXAnimationDiagnostic[];\n}\n\n/**\n * Extract all animation stacks from the FBX scene.\n */\nexport function extractAnimations(objectMap: FBXObjectMap, doc?: FBXDocument, options: FBXAnimationExtractOptions = {}): FBXAnimationStackData[] {\n const stacks: FBXAnimationStackData[] = [];\n const rebaseKeyframes = options.rebaseKeyframes ?? true;\n\n for (const [id, node] of Array.from(objectMap.objects)) {\n if (node.name === \"AnimationStack\") {\n const stack = extractAnimStack(id, node, objectMap, rebaseKeyframes);\n if (stack) {\n stacks.push(stack);\n }\n }\n }\n\n // Pre-7000 files have no AnimationStack objects; their animation lives in the top-level Takes block.\n if (stacks.length === 0 && doc) {\n stacks.push(...extractLegacyTakes(doc, objectMap, rebaseKeyframes));\n }\n\n return stacks;\n}\n\nfunction extractAnimStack(stackId: number, stackNode: FBXNode, objectMap: FBXObjectMap, rebaseKeyframes: boolean): FBXAnimationStackData | null {\n const name = cleanFBXName(getPropertyValue<string>(stackNode, 1) ?? \"Animation\");\n const declaredTimeSpan = extractAnimationStackTimeSpan(stackNode);\n\n // Find AnimationLayer children of this stack\n const layerEntries = getChildren(objectMap, stackId, \"AnimationLayer\");\n if (layerEntries.length === 0) {\n return null;\n }\n\n // Collect all CurveNodes from all layers\n const allCurveNodes: FBXCurveNodeData[] = [];\n const allUnsupportedCurveNodes: FBXUnsupportedCurveNodeData[] = [];\n const layers: FBXAnimationLayerData[] = [];\n const diagnostics: FBXAnimationDiagnostic[] = [];\n let minTime = Infinity;\n let maxTime = -Infinity;\n\n for (const { id: layerId, node: layerNode } of layerEntries) {\n // Extract layer properties\n const layerName = cleanFBXName(getPropertyValue<string>(layerNode, 1) ?? \"Layer\");\n let weight = 100;\n let blendMode = 0;\n let rotationAccumulationMode = 0;\n let scaleAccumulationMode = 0;\n\n for (const entry of getPropertyEntries(layerNode)) {\n const v = entry.values[0];\n if (typeof v !== \"number\") {\n continue;\n }\n if (entry.name === \"Weight\") {\n weight = v;\n } else if (entry.name === \"BlendMode\") {\n blendMode = v;\n } else if (entry.name === \"RotationAccumulationMode\") {\n rotationAccumulationMode = v;\n } else if (entry.name === \"ScaleAccumulationMode\") {\n scaleAccumulationMode = v;\n }\n }\n const layerIndex = layers.length;\n\n // AnimationCurveNodes are children of the layer\n const curveNodeEntries = getChildren(objectMap, layerId, \"AnimationCurveNode\");\n const layerCurveNodes: FBXCurveNodeData[] = [];\n const layerUnsupportedCurveNodes: FBXUnsupportedCurveNodeData[] = [];\n const layerDiagnostics: FBXAnimationDiagnostic[] = [];\n let layerWeightCurve: FBXCurveData | undefined;\n\n for (const { id: curveNodeId, node: curveNodeNode } of curveNodeEntries) {\n const curveNodeData = extractCurveNode(curveNodeId, curveNodeNode, objectMap, layerIndex);\n if (!curveNodeData) {\n const unsupported = extractUnsupportedCurveNode(curveNodeId, curveNodeNode, objectMap, layerIndex);\n if (unsupported) {\n // The layer's own Weight property can be animated; it drives blending rather than a target.\n if (unsupported.targetId === layerId && unsupported.propertyName === \"Weight\" && unsupported.curves.length > 0) {\n layerWeightCurve = unsupported.curves[0];\n continue;\n }\n scanCurveTimes(unsupported.curves, (time) => {\n if (time < minTime) {\n minTime = time;\n }\n if (time > maxTime) {\n maxTime = time;\n }\n });\n layerUnsupportedCurveNodes.push(unsupported);\n allUnsupportedCurveNodes.push(unsupported);\n const diagnostic: FBXAnimationDiagnostic = {\n type: \"unsupported-curve-node\",\n message: `AnimationCurveNode '${unsupported.type}' is preserved as diagnostic data but not evaluated at runtime.`,\n layerName,\n curveNodeId,\n curveNodeType: unsupported.type,\n targetId: unsupported.targetId,\n propertyName: unsupported.propertyName,\n };\n layerDiagnostics.push(diagnostic);\n diagnostics.push(diagnostic);\n }\n continue;\n }\n\n for (const curve of curveNodeData.curves) {\n for (const key of curve.keys) {\n if (key.time < minTime) {\n minTime = key.time;\n }\n if (key.time > maxTime) {\n maxTime = key.time;\n }\n }\n }\n\n layerCurveNodes.push(curveNodeData);\n allCurveNodes.push(curveNodeData);\n }\n\n layers.push({\n name: layerName,\n weight,\n normalizedWeight: weight / 100,\n blendMode,\n blend: makeLayerBlend(blendMode, weight, rotationAccumulationMode, scaleAccumulationMode),\n weightCurve: layerWeightCurve,\n curveNodes: layerCurveNodes,\n unsupportedCurveNodes: layerUnsupportedCurveNodes,\n diagnostics: layerDiagnostics,\n });\n }\n\n if (allCurveNodes.length === 0 && allUnsupportedCurveNodes.length === 0) {\n return null;\n }\n\n return finalizeAnimStack(name, layers, allCurveNodes, allUnsupportedCurveNodes, diagnostics, minTime, maxTime, declaredTimeSpan, rebaseKeyframes);\n}\n\n/**\n * Resolves the clip span from the declared time span or the key range and, when requested, rebases key times so\n * the first key sits at zero.\n */\nfunction finalizeAnimStack(\n name: string,\n layers: FBXAnimationLayerData[],\n allCurveNodes: FBXCurveNodeData[],\n allUnsupportedCurveNodes: FBXUnsupportedCurveNodeData[],\n diagnostics: FBXAnimationDiagnostic[],\n minTime: number,\n maxTime: number,\n declaredTimeSpan: { start: number; stop: number } | null,\n rebaseKeyframes: boolean\n): FBXAnimationStackData {\n const hasKeys = isFinite(minTime) && isFinite(maxTime);\n const timeOffset = rebaseKeyframes && hasKeys && minTime > 0 ? minTime : 0;\n\n // Rebase all keyframe times so the animation starts at 0\n if (timeOffset > 0) {\n for (const cn of allCurveNodes) {\n for (const curve of cn.curves) {\n for (const key of curve.keys) {\n key.time -= timeOffset;\n }\n }\n }\n for (const cn of allUnsupportedCurveNodes) {\n for (const curve of cn.curves) {\n for (const key of curve.keys) {\n key.time -= timeOffset;\n }\n }\n }\n maxTime -= timeOffset;\n }\n\n const declaredStart = declaredTimeSpan ? (rebaseKeyframes ? Math.max(declaredTimeSpan.start - timeOffset, 0) : declaredTimeSpan.start) : 0;\n const declaredStop = declaredTimeSpan ? Math.max(declaredTimeSpan.stop - timeOffset, declaredStart) : 0;\n const hasDeclaredDuration = declaredStop > declaredStart;\n // Without a declared span the clip covers its keys (a clip whose keys are all negative ends before zero).\n const keyStart = hasKeys ? minTime - timeOffset : 0;\n const keyStop = hasKeys ? maxTime : 0;\n const startTime = hasDeclaredDuration ? declaredStart : rebaseKeyframes ? Math.min(0, keyStart) : keyStart;\n const stopTime = hasDeclaredDuration ? declaredStop : Math.max(keyStop, startTime);\n\n return {\n name,\n startTime,\n stopTime,\n duration: Math.max(stopTime - startTime, 0),\n curveNodes: allCurveNodes,\n layers,\n unsupportedCurveNodes: allUnsupportedCurveNodes,\n diagnostics,\n };\n}\n\nfunction extractAnimationStackTimeSpan(stackNode: FBXNode): { start: number; stop: number } | null {\n const props70 = findChildByName(stackNode, \"Properties70\");\n if (!props70) {\n return null;\n }\n\n let start = 0;\n let stop: number | null = null;\n\n for (const p of props70.children) {\n if (p.name !== \"P\") {\n continue;\n }\n const pName = getPropertyValue<string>(p, 0);\n if (pName === \"LocalStart\" || pName === \"ReferenceStart\") {\n start = fbxTimeToSeconds(p.properties[4]?.value) ?? start;\n } else if (pName === \"LocalStop\" || pName === \"ReferenceStop\") {\n stop = fbxTimeToSeconds(p.properties[4]?.value) ?? stop;\n }\n }\n\n return stop !== null ? { start, stop } : null;\n}\n\nfunction extractCurveNode(curveNodeId: number, curveNodeNode: FBXNode, objectMap: FBXObjectMap, layerIndex: number): FBXCurveNodeData | null {\n const typeName = cleanFBXName(getPropertyValue<string>(curveNodeNode, 1) ?? \"\");\n const rawDefaults = extractCurveNodeDefaultValues(curveNodeNode);\n const defaultValues: [number, number, number] | undefined =\n \"d|X\" in rawDefaults || \"d|Y\" in rawDefaults || \"d|Z\" in rawDefaults ? [rawDefaults[\"d|X\"] ?? 0, rawDefaults[\"d|Y\"] ?? 0, rawDefaults[\"d|Z\"] ?? 0] : undefined;\n\n // Handle T (translation), R (rotation), S (scale) targeting Models\n if (typeName === \"T\" || typeName === \"R\" || typeName === \"S\") {\n const targetModelId = findCurveNodeTarget(curveNodeId, objectMap);\n if (targetModelId === null) {\n return null;\n }\n\n // A curve node without curves still contributes its default values to layer blending (Maya writes such\n // nodes on the base layer when only additive layers animate a property).\n const curves = extractCurves(curveNodeId, objectMap);\n if (curves.length === 0 && !defaultValues) {\n return null;\n }\n\n return {\n type: typeName,\n targetModelId,\n curves,\n layerIndex,\n defaultValues,\n };\n }\n\n // FBX 7.1 writes blend shape weight curves against the geometry, named after the shape channel\n const geometryChannelId = findCurveNodeGeometryShapeChannel(curveNodeId, objectMap);\n if (geometryChannelId !== null) {\n const curves = extractCurves(curveNodeId, objectMap);\n if (curves.length === 0) {\n return null;\n }\n return { type: \"DeformPercent\", targetModelId: geometryChannelId, curves, layerIndex, defaultValues };\n }\n\n // Handle DeformPercent targeting BlendShapeChannels\n if (typeName === \"DeformPercent\") {\n const targetId = findCurveNodeBlendShapeTarget(curveNodeId, objectMap);\n if (targetId === null) {\n return null;\n }\n\n const curves = extractCurves(curveNodeId, objectMap);\n if (curves.length === 0) {\n return null;\n }\n\n return {\n type: \"DeformPercent\",\n targetModelId: targetId,\n curves,\n layerIndex,\n defaultValues,\n };\n }\n\n return null;\n}\n\nfunction extractUnsupportedCurveNode(curveNodeId: number, curveNodeNode: FBXNode, objectMap: FBXObjectMap, layerIndex: number): FBXUnsupportedCurveNodeData | null {\n const typeName = cleanFBXName(getPropertyValue<string>(curveNodeNode, 1) ?? \"\");\n const curves = extractCurves(curveNodeId, objectMap);\n const defaultValues = extractCurveNodeDefaultValues(curveNodeNode);\n if (curves.length === 0 && Object.keys(defaultValues).length === 0) {\n return null;\n }\n\n let targetId: number | null = null;\n let propertyName: string | undefined;\n for (const conn of objectMap.connections) {\n if (conn.childId === curveNodeId && conn.type === \"OP\") {\n targetId = conn.parentId;\n propertyName = conn.propertyName;\n break;\n }\n }\n\n return {\n type: typeName,\n id: curveNodeId,\n layerIndex,\n targetId,\n propertyName,\n curveCount: curves.length,\n curves,\n defaultValues,\n };\n}\n\nfunction scanCurveTimes(curves: FBXCurveData[], visit: (time: number) => void): void {\n for (const curve of curves) {\n for (const key of curve.keys) {\n visit(key.time);\n }\n }\n}\n\n/**\n * Find the Model that an AnimationCurveNode targets.\n * The CurveNode connects to the Model via OP connection with a property name.\n */\nfunction findCurveNodeTarget(curveNodeId: number, objectMap: FBXObjectMap): number | null {\n // Look for connections where this curveNode is a child (going up to parent)\n // The OP connection from curveNode → Model has the property name (e.g. \"Lcl Translation\")\n for (const conn of objectMap.connections) {\n if (conn.childId === curveNodeId && conn.type === \"OP\") {\n const parentNode = objectMap.objects.get(conn.parentId);\n if (parentNode && parentNode.name === \"Model\") {\n return conn.parentId;\n }\n }\n }\n return null;\n}\n\n/** When a curve node is connected to a Geometry through a property named like one of its blend shape channels. */\nfunction findCurveNodeGeometryShapeChannel(curveNodeId: number, objectMap: FBXObjectMap): number | null {\n for (const conn of objectMap.connections) {\n if (conn.childId !== curveNodeId || conn.type !== \"OP\" || !conn.propertyName) {\n continue;\n }\n const parentNode = objectMap.objects.get(conn.parentId);\n if (!parentNode || parentNode.name !== \"Geometry\") {\n continue;\n }\n for (const deformer of getChildren(objectMap, conn.parentId, \"Deformer\")) {\n if (getPropertyValue<string>(deformer.node, 2) !== \"BlendShape\") {\n continue;\n }\n for (const channel of getChildren(objectMap, deformer.id, \"Deformer\")) {\n if (getPropertyValue<string>(channel.node, 2) === \"BlendShapeChannel\" && cleanFBXName(getPropertyValue<string>(channel.node, 1) ?? \"\") === conn.propertyName) {\n return channel.id;\n }\n }\n }\n }\n return null;\n}\n\n/**\n * Find the BlendShapeChannel that a DeformPercent AnimationCurveNode targets.\n */\nfunction findCurveNodeBlendShapeTarget(curveNodeId: number, objectMap: FBXObjectMap): number | null {\n for (const conn of objectMap.connections) {\n if (conn.childId === curveNodeId && conn.type === \"OP\") {\n const parentNode = objectMap.objects.get(conn.parentId);\n if (parentNode && parentNode.name === \"Deformer\") {\n const subType = getPropertyValue<string>(parentNode, 2);\n if (subType === \"BlendShapeChannel\") {\n return conn.parentId;\n }\n }\n }\n }\n // Also check OO connections\n for (const conn of objectMap.connections) {\n if (conn.childId === curveNodeId && conn.type === \"OO\") {\n const parentNode = objectMap.objects.get(conn.parentId);\n if (parentNode && parentNode.name === \"Deformer\") {\n const subType = getPropertyValue<string>(parentNode, 2);\n if (subType === \"BlendShapeChannel\") {\n return conn.parentId;\n }\n }\n }\n }\n return null;\n}\n\n/**\n * Extract AnimationCurves connected to a CurveNode.\n * Each curve connects via OP with channel \"d|X\", \"d|Y\", or \"d|Z\".\n */\nfunction extractCurves(curveNodeId: number, objectMap: FBXObjectMap): FBXCurveData[] {\n const curves: FBXCurveData[] = [];\n\n // Find AnimationCurve children of this CurveNode\n for (const conn of objectMap.connections) {\n if (conn.parentId === curveNodeId && conn.type === \"OP\") {\n const curveNode = objectMap.objects.get(conn.childId);\n if (!curveNode || curveNode.name !== \"AnimationCurve\") {\n continue;\n }\n\n const channel = conn.propertyName ?? \"d|X\";\n const keys = extractKeyframes(curveNode);\n if (keys.length > 0) {\n curves.push({ channel, keys, ...extractCurveExtrapolation(curveNode) });\n }\n }\n }\n\n // Also check OO connections (some exporters use OO for curve→curveNode)\n if (curves.length === 0) {\n const ooChildren = getChildren(objectMap, curveNodeId, \"AnimationCurve\");\n // For OO connections, infer channel from order (X, Y, Z)\n const channelNames = [\"d|X\", \"d|Y\", \"d|Z\"];\n for (let i = 0; i < ooChildren.length && i < 3; i++) {\n const keys = extractKeyframes(ooChildren[i].node);\n if (keys.length > 0) {\n curves.push({ channel: channelNames[i], keys, ...extractCurveExtrapolation(ooChildren[i].node) });\n }\n }\n }\n\n return curves;\n}\n\nfunction extractCurveNodeDefaultValues(curveNodeNode: FBXNode): Record<string, number> {\n const defaults: Record<string, number> = {};\n const props70 = findChildByName(curveNodeNode, \"Properties70\");\n for (const p of props70?.children ?? []) {\n if (p.name !== \"P\") {\n continue;\n }\n const propName = getPropertyValue<string>(p, 0);\n if (!propName?.startsWith(\"d|\")) {\n continue;\n }\n const value = toNumber(p.properties[4]?.value);\n if (value !== null) {\n defaults[propName] = value;\n }\n }\n return defaults;\n}\n\n/**\n * Extract keyframes from an AnimationCurve node.\n */\nfunction extractKeyframes(curveNode: FBXNode): FBXKeyframe[] {\n const keyTimeNode = findChildByName(curveNode, \"KeyTime\");\n const keyValueNode = findChildByName(curveNode, \"KeyValueFloat\");\n\n if (!keyTimeNode || !keyValueNode) {\n return [];\n }\n\n const keyTimes = toInt64Array(getNodeArray(keyTimeNode));\n const keyValues = toFloat32Array(getNodeArray(keyValueNode));\n const keyAttrFlags = toInt32Array(getNodeArray(findChildByName(curveNode, \"KeyAttrFlags\")));\n const keyAttrData = toFloat32Array(getNodeArray(findChildByName(curveNode, \"KeyAttrDataFloat\")));\n const keyAttrRefCount = toInt32Array(getNodeArray(findChildByName(curveNode, \"KeyAttrRefCount\")));\n\n if (!keyTimes || !keyValues) {\n return [];\n }\n if (keyTimes.length !== keyValues.length) {\n return [];\n }\n\n const keyAttributeIndices = buildKeyAttributeIndices(keyTimes.length, keyAttrFlags, keyAttrRefCount);\n return buildKeyframes(keyTimes, keyValues, (i) => {\n const attrIndex = keyAttributeIndices[i];\n const flag = attrIndex >= 0 ? (keyAttrFlags?.[attrIndex] ?? 0) : 0;\n const dataOffset = attrIndex * KEY_ATTR_DATA_STRIDE;\n return {\n flags: flag,\n data: [\n getFiniteKeyAttrData(keyAttrData, dataOffset) ?? 0,\n getFiniteKeyAttrData(keyAttrData, dataOffset + 1) ?? 0,\n getFiniteKeyAttrData(keyAttrData, dataOffset + 2) ?? 0,\n getFiniteKeyAttrData(keyAttrData, dataOffset + 3) ?? 0,\n ],\n };\n });\n}\n\nfunction extractCurveExtrapolation(curveNode: FBXNode): { preExtrapolation: FBXExtrapolationLike; postExtrapolation: FBXExtrapolationLike } {\n const read = (name: string) => {\n const node = findChildByName(curveNode, name);\n return parseExtrapolation(findChildByName(node ?? curveNode, \"Type\")?.properties[0]?.value, findChildByName(node ?? curveNode, \"Repetition\")?.properties[0]?.value);\n };\n return { preExtrapolation: read(\"Pre-Extrapolation\"), postExtrapolation: read(\"Post-Extrapolation\") };\n}\ntype FBXExtrapolationLike = ReturnType<typeof parseExtrapolation>;\n\nfunction makeLayerBlend(blendMode: number, weight: number, rotationAccumulationMode: number, scaleAccumulationMode: number): FBXLayerBlend {\n let blended = false;\n let additive = false;\n switch (blendMode) {\n case 0:\n blended = true;\n additive = true;\n break;\n case 2:\n blended = true;\n break;\n default:\n break;\n }\n let w = weight / 100;\n if (w < 0) {\n w = 0;\n }\n if (w > 0.99999) {\n w = 1;\n }\n return { blended, additive, composeRotation: rotationAccumulationMode === 0, composeScale: scaleAccumulationMode === 0, weight: w };\n}\n\n/**\n * Samples an FBX animation curve at a specific time.\n * @param curveData - Curve data to sample\n * @param time - Time in seconds\n * @returns The sampled value, or null when the curve has no keys\n */\nexport function sampleFBXCurveAtTime(curveData: FBXCurveData | undefined, time: number): number | null {\n if (!curveData || curveData.keys.length === 0) {\n return null;\n }\n return evaluateCurve(curveData, time, curveData.keys[0].value);\n}\n\n// ── Utilities ──────────────────────────────────────────────────────────────────\n\nfunction toInt64Array(value: unknown): Float64Array | null {\n if (value instanceof Float64Array) {\n return value;\n }\n return null;\n}\n\nfunction toInt32Array(value: unknown): Int32Array | null {\n if (value instanceof Int32Array) {\n return value;\n }\n if (value instanceof Float32Array || value instanceof Float64Array) {\n const result = new Int32Array(value.length);\n for (let i = 0; i < value.length; i++) {\n result[i] = value[i];\n }\n return result;\n }\n return null;\n}\n\nfunction fbxTimeToSeconds(value: unknown): number | null {\n if (typeof value === \"number\") {\n return value / FBX_TIME_UNIT;\n }\n return null;\n}\n\nfunction toNumber(value: unknown): number | null {\n if (typeof value === \"number\") {\n return value;\n }\n return null;\n}\n\nfunction toFloat32Array(value: unknown): Float32Array | null {\n if (value instanceof Float32Array) {\n return value;\n }\n if (value instanceof Float64Array) {\n const result = new Float32Array(value.length);\n for (let i = 0; i < value.length; i++) {\n result[i] = value[i];\n }\n return result;\n }\n return null;\n}\n\nfunction buildKeyAttributeIndices(keyCount: number, keyAttrFlags: Int32Array | null, keyAttrRefCount: Int32Array | null): number[] {\n if (!keyAttrFlags || keyAttrFlags.length === 0) {\n return new Array(keyCount).fill(-1);\n }\n\n if (keyAttrRefCount && keyAttrRefCount.length > 0) {\n let total = 0;\n for (const count of keyAttrRefCount) {\n total += count;\n }\n\n if (total === keyCount) {\n const indices: number[] = [];\n for (let attrIndex = 0; attrIndex < keyAttrRefCount.length; attrIndex++) {\n const count = keyAttrRefCount[attrIndex];\n for (let i = 0; i < count; i++) {\n indices.push(attrIndex);\n }\n }\n return indices;\n }\n }\n\n if (keyAttrFlags.length === keyCount) {\n return Array.from({ length: keyCount }, (_, i) => i);\n }\n\n if (keyAttrFlags.length === 1) {\n return new Array(keyCount).fill(0);\n }\n\n return Array.from({ length: keyCount }, (_, i) => Math.min(i, keyAttrFlags.length - 1));\n}\n\nfunction getFiniteKeyAttrData(keyAttrData: Float32Array | null, index: number): number | undefined {\n if (!keyAttrData || index < 0 || index >= keyAttrData.length) {\n return undefined;\n }\n const value = keyAttrData[index];\n return Number.isFinite(value) ? value : undefined;\n}\n\n// ── Legacy Takes (FBX 5.x / 6.x) ───────────────────────────────────────────────\n\n/**\n * Pre-7000 files store animation in a top-level `Takes` block instead of AnimationStack/Layer/CurveNode objects:\n *\n * Takes: { Take: \"name\" { LocalTime: start, stop\n * Model: \"Model::joint1\" { Channel: \"Transform\" { Channel: \"T\" { Channel: \"X\" { Default, KeyVer, KeyCount, Key } } } } } }\n *\n * Each take becomes one animation stack with a single layer. Models are matched through the same legacy string ids\n * that the connection resolver synthesizes for 6.x objects.\n */\nexport function extractLegacyTakes(doc: FBXDocument, objectMap: FBXObjectMap, rebaseKeyframes = true): FBXAnimationStackData[] {\n const takesNode = findDocumentNode(doc, \"Takes\");\n if (!takesNode) {\n return [];\n }\n\n // Take entries name models by their full \"Class::Name\" string; older writers may use the bare name.\n const legacyIds = new Map<string, number>();\n const legacyIdsByCleanName = new Map<string, number>();\n for (const entry of objectMap.objectEntries) {\n if (entry.legacyName !== undefined && !entry.synthetic && !legacyIds.has(entry.legacyName)) {\n legacyIds.set(entry.legacyName, entry.id);\n const clean = cleanFBXName(entry.legacyName);\n if (!legacyIdsByCleanName.has(clean)) {\n legacyIdsByCleanName.set(clean, entry.id);\n }\n }\n }\n\n const stacks: FBXAnimationStackData[] = [];\n let syntheticId = -1000000;\n\n for (const take of takesNode.children) {\n if (take.name !== \"Take\") {\n continue;\n }\n const name = cleanFBXName(getPropertyValue<string>(take, 0) ?? \"Take\");\n const timeSpan = readLegacyTimeSpan(findChildByName(take, \"LocalTime\")) ?? readLegacyTimeSpan(findChildByName(take, \"ReferenceTime\"));\n\n const curveNodes: FBXCurveNodeData[] = [];\n const unsupportedCurveNodes: FBXUnsupportedCurveNodeData[] = [];\n let minTime = Infinity;\n let maxTime = -Infinity;\n const track = (curves: FBXCurveData[]) => {\n for (const curve of curves) {\n for (const key of curve.keys) {\n if (key.time < minTime) {\n minTime = key.time;\n }\n if (key.time > maxTime) {\n maxTime = key.time;\n }\n }\n }\n };\n\n for (const model of take.children) {\n if (model.name !== \"Model\") {\n continue;\n }\n const rawModelName = getPropertyValue<string>(model, 0) ?? \"\";\n const targetModelId = legacyIds.get(rawModelName) ?? legacyIdsByCleanName.get(cleanFBXName(rawModelName));\n if (targetModelId === undefined) {\n continue;\n }\n\n for (const channel of model.children) {\n if (channel.name !== \"Channel\") {\n continue;\n }\n const channelName = getPropertyValue<string>(channel, 0) ?? \"\";\n if (channelName === \"Transform\") {\n for (const sub of channel.children) {\n if (sub.name !== \"Channel\") {\n continue;\n }\n const subName = getPropertyValue<string>(sub, 0);\n if (subName !== \"T\" && subName !== \"R\" && subName !== \"S\") {\n continue;\n }\n const curves = readLegacyCompoundChannel(sub, doc.version);\n if (curves.length > 0) {\n track(curves);\n curveNodes.push({ type: subName, targetModelId, curves, layerIndex: 0 });\n }\n }\n } else {\n const curves = readLegacyCompoundChannel(channel, doc.version);\n if (curves.length > 0) {\n track(curves);\n // Blend shape weights are channels named after the shape (\"name (Shape)\" before 6.0).\n const shapeChannelId = findLegacyShapeChannel(objectMap, targetModelId, channelName);\n if (shapeChannelId !== undefined) {\n curveNodes.push({ type: \"DeformPercent\", targetModelId: shapeChannelId, curves, layerIndex: 0 });\n continue;\n }\n // Light and camera properties live on the synthesized node attribute.\n const attributeId = LEGACY_ATTRIBUTE_CHANNELS.has(channelName) ? getChildren(objectMap, targetModelId, \"NodeAttribute\")[0]?.id : undefined;\n unsupportedCurveNodes.push({\n type: channelName,\n id: syntheticId--,\n layerIndex: 0,\n targetId: attributeId ?? targetModelId,\n propertyName: channelName,\n curveCount: curves.length,\n curves,\n defaultValues: {},\n });\n }\n }\n }\n }\n\n if (curveNodes.length === 0 && unsupportedCurveNodes.length === 0) {\n continue;\n }\n\n const layer: FBXAnimationLayerData = {\n name: \"BaseLayer\",\n weight: 100,\n normalizedWeight: 1,\n blendMode: 0,\n blend: makeLayerBlend(0, 100, 0, 0),\n curveNodes,\n unsupportedCurveNodes,\n diagnostics: [],\n };\n stacks.push(finalizeAnimStack(name, [layer], curveNodes, unsupportedCurveNodes, [], minTime, maxTime, timeSpan, rebaseKeyframes));\n }\n\n return stacks;\n}\n\n/** Take channel names that animate light or camera attribute properties rather than the model itself. */\nconst LEGACY_ATTRIBUTE_CHANNELS = new Set([\n \"Color\",\n \"Intensity\",\n \"OuterAngle\",\n \"InnerAngle\",\n \"ConeAngle\",\n \"HotSpot\",\n \"FieldOfView\",\n \"FieldOfViewX\",\n \"FieldOfViewY\",\n \"FocalLength\",\n \"NearPlane\",\n \"FarPlane\",\n \"OrthoZoom\",\n \"Roll\",\n \"FilmWidth\",\n \"FilmHeight\",\n]);\n\n/** Finds the synthesized BlendShapeChannel of a legacy model whose shape is named like the take channel. */\nfunction findLegacyShapeChannel(objectMap: FBXObjectMap, modelId: number, channelName: string): number | undefined {\n const suffix = \" (Shape)\";\n const name = channelName.endsWith(suffix) ? channelName.slice(0, -suffix.length) : channelName;\n for (const geometry of getChildren(objectMap, modelId, \"Geometry\")) {\n for (const deformer of getChildren(objectMap, geometry.id, \"Deformer\")) {\n if (getPropertyValue<string>(deformer.node, 2) !== \"BlendShape\") {\n continue;\n }\n for (const channel of getChildren(objectMap, deformer.id, \"Deformer\")) {\n if (getPropertyValue<string>(channel.node, 2) === \"BlendShapeChannel\" && cleanFBXName(getPropertyValue<string>(channel.node, 1) ?? \"\") === name) {\n return channel.id;\n }\n }\n }\n }\n return undefined;\n}\n\nfunction readLegacyTimeSpan(node: FBXNode | undefined): { start: number; stop: number } | null {\n if (!node) {\n return null;\n }\n const start = fbxTimeToSeconds(node.properties[0]?.value);\n const stop = fbxTimeToSeconds(node.properties[1]?.value);\n return start !== null && stop !== null ? { start, stop } : null;\n}\n\n/** A channel either holds keys directly (scalar property) or has X/Y/Z child channels (vector property). */\nfunction readLegacyCompoundChannel(node: FBXNode, version: number): FBXCurveData[] {\n const hasKeys = (n: FBXNode) => n.children.some((c) => c.name === \"Key\" || c.name === \"Default\");\n if (hasKeys(node)) {\n const keys = decodeLegacyKeys(node, version);\n return keys.length > 0 ? [{ channel: \"d|X\", keys, ...extractCurveExtrapolation(node) }] : [];\n }\n const curves: FBXCurveData[] = [];\n for (const child of node.children) {\n if (child.name !== \"Channel\" || !hasKeys(child)) {\n continue;\n }\n const axis = getPropertyValue<string>(child, 0) ?? \"X\";\n const keys = decodeLegacyKeys(child, version);\n if (keys.length > 0) {\n curves.push({ channel: `d|${axis}`, keys, ...extractCurveExtrapolation(child) });\n }\n if (curves.length === 3) {\n break;\n }\n }\n return curves;\n}\n\n/**\n * Decodes the heterogeneous legacy `Key:` list (int64 times, double values and bare mode characters).\n * The layout per key is `time, value, mode[, params...]`, mirroring the FBX SDK's pre-7000 key encoding.\n */\nfunction decodeLegacyKeys(channel: FBXNode, version: number): FBXKeyframe[] {\n const keyNode = findChildByName(channel, \"Key\");\n if (!keyNode) {\n return [];\n }\n const vals = keyNode.properties.map((p) => p.value);\n const num = (v: unknown): number => (typeof v === \"number\" ? v : typeof v === \"boolean\" ? (v ? 1 : 0) : NaN);\n const chr = (v: unknown): string => (typeof v === \"string\" ? v : typeof v === \"number\" ? String.fromCharCode(v) : typeof v === \"boolean\" ? (v ? \"\\x01\" : \"\\0\") : \"?\");\n\n let keyVer = toNumber(findChildByName(channel, \"KeyVer\")?.properties[0]?.value) ?? 0;\n if (keyVer <= 0) {\n keyVer = version < 5000 ? 4003 : version < 6000 ? 4004 : 4005;\n }\n const keyCount = toNumber(findChildByName(channel, \"KeyCount\")?.properties[0]?.value) ?? 0;\n\n const times: number[] = [];\n const values: number[] = [];\n const interp: FBXInterpolationType[] = [];\n const constNext: boolean[] = [];\n const leftSlope: number[] = [];\n const rightSlope: number[] = [];\n const leftWeight: number[] = [];\n const rightWeight: number[] = [];\n const autoFlag: boolean[] = [];\n let pendingLeft = 0;\n let pendingLeftWeight = 1 / 3;\n let p = 0;\n\n for (let i = 0; i < keyCount; i++) {\n if (p + 3 > vals.length) {\n break;\n }\n const time = num(vals[p]) / FBX_TIME_UNIT;\n const value = num(vals[p + 1]);\n const mode = chr(vals[p + 2]);\n p += 3;\n\n let right = 0;\n let nextLeft = 0;\n let weightRight = 1 / 3;\n let nextWeightLeft = 1 / 3;\n let auto = false;\n let kind: FBXInterpolationType = \"cubic\";\n let isNext = false;\n\n if (mode === \"U\") {\n const slopeMode = chr(vals[p]);\n p += 1;\n let numWeights = 1;\n if (slopeMode === \"s\" || slopeMode === \"b\") {\n right = num(vals[p]);\n nextLeft = num(vals[p + 1]);\n p += 2;\n if (keyVer === 4003) {\n numWeights = 0;\n }\n } else if (slopeMode === \"a\") {\n auto = true;\n if (keyVer <= 4004) {\n numWeights = 0;\n }\n } else if (slopeMode === \"p\" || slopeMode === \"q\") {\n auto = true;\n p += 2;\n numWeights = keyVer <= 4004 ? 1 : 2;\n } else if (slopeMode === \"t\") {\n auto = true;\n p += 3;\n numWeights = 0;\n } else if (slopeMode === \"d\") {\n auto = true;\n p += 1;\n } else {\n break;\n }\n for (; numWeights > 0; numWeights--) {\n const weightMode = chr(vals[p]);\n p += 1;\n if (weightMode === \"n\" || weightMode === \"c\") {\n // automatic weights\n } else if (weightMode === \"a\") {\n weightRight = num(vals[p]);\n nextWeightLeft = num(vals[p + 1]);\n p += 2;\n } else if (weightMode === \"l\") {\n nextWeightLeft = num(vals[p]);\n p += 1;\n } else if (weightMode === \"r\") {\n weightRight = num(vals[p]);\n p += 1;\n } else {\n p = vals.length;\n break;\n }\n }\n } else if (mode === \"L\") {\n kind = \"linear\";\n } else if (mode === \"C\") {\n kind = \"constant\";\n if (keyVer >= 4004) {\n isNext = chr(vals[p]) === \"n\";\n p += 1;\n }\n } else {\n break;\n }\n\n times.push(time);\n values.push(value);\n interp.push(kind);\n constNext.push(isNext);\n leftSlope.push(pendingLeft);\n rightSlope.push(right);\n leftWeight.push(pendingLeftWeight);\n rightWeight.push(weightRight);\n autoFlag.push(auto);\n pendingLeft = nextLeft;\n pendingLeftWeight = nextWeightLeft;\n }\n\n // Resolve automatic and linear tangents now that neighbouring keys are known.\n for (let i = 0; i < times.length; i++) {\n if (autoFlag[i]) {\n const s =\n i > 0 && i + 1 < times.length\n ? solveLegacyAutoTangent(times[i - 1], times[i], times[i + 1], values[i - 1], values[i], values[i + 1], leftWeight[i], rightWeight[i])\n : 0;\n leftSlope[i] = s;\n rightSlope[i] = s;\n }\n if (interp[i] === \"linear\" && i + 1 < times.length) {\n const dt = times[i + 1] - times[i];\n const s = dt > 0 ? (values[i + 1] - values[i]) / dt : 0;\n rightSlope[i] = s;\n if (!autoFlag[i + 1]) {\n leftSlope[i + 1] = s;\n }\n }\n }\n\n return keyframesFromSlopes(times, values, interp, constNext, leftSlope, rightSlope, leftWeight, rightWeight);\n}\n\n/** Time-independent auto tangent with progressive clamping and 1/3 weights, as the SDK computes legacy 'a' keys. */\nfunction solveLegacyAutoTangent(t0: number, t1: number, t2: number, v0: number, v1: number, v2: number, weightLeft: number, weightRight: number): number {\n if (!(t2 > t0)) {\n return 0;\n }\n const slope = (v2 - v0) / (t2 - t0);\n const sign = slope >= 0 ? 1 : -1;\n let abs = sign * slope;\n const rangeLeft = weightLeft * (t1 - t0);\n const rangeRight = weightRight * (t2 - t1);\n let maxLeft = rangeLeft > 0 ? (sign * (v1 - v0)) / rangeLeft : 0;\n let maxRight = rangeRight > 0 ? (sign * (v2 - v1)) / rangeRight : 0;\n if (!(maxLeft > 0)) {\n maxLeft = 0;\n }\n if (!(maxRight > 0)) {\n maxRight = 0;\n }\n abs = Math.min(abs, maxLeft, maxRight);\n return sign * abs;\n}\n\n// ── Layered evaluation ─────────────────────────────────────────────────────────\n\n/**\n * Evaluates one transform channel (T, R or S) of a target at `time`, blending every animation layer of the stack the\n * way the FBX SDK does: the first layer animating the channel replaces the static value, later layers are combined\n * according to their blend mode, weight and accumulation modes.\n * @param curveNodes - Curve nodes targeting this model (any layers, any types)\n * @param layers - Stack layers, in order\n * @param type - Channel to evaluate\n * @param staticValue - Value when nothing animates the channel\n * @param rotationOrder - Rotation order of the target (for rotation composition)\n * @param time - Time in seconds\n */\nexport function evaluateLayeredChannel(\n curveNodes: readonly FBXCurveNodeData[],\n layers: readonly FBXAnimationLayerData[],\n type: \"T\" | \"R\" | \"S\",\n staticValue: readonly [number, number, number],\n rotationOrder: number,\n time: number\n): [number, number, number] {\n let result: [number, number, number] = [staticValue[0], staticValue[1], staticValue[2]];\n for (let layerIndex = 0; layerIndex < Math.max(layers.length, 1); layerIndex++) {\n const node = curveNodes.find((cn) => cn.type === type && cn.layerIndex === layerIndex);\n if (!node) {\n continue;\n }\n const defaults = node.defaultValues ?? result;\n const value: [number, number, number] = [\n evaluateCurve(\n node.curves.find((c) => c.channel === \"d|X\"),\n time,\n defaults[0]\n ),\n evaluateCurve(\n node.curves.find((c) => c.channel === \"d|Y\"),\n time,\n defaults[1]\n ),\n evaluateCurve(\n node.curves.find((c) => c.channel === \"d|Z\"),\n time,\n defaults[2]\n ),\n ];\n const layer = layers[layerIndex];\n // The base layer replaces the static value; every other layer blends onto the running result, even when the\n // base layer does not animate this channel (then it blends with the static value), as in the SDK.\n if (layerIndex === 0 || !layer) {\n result = value;\n } else {\n let blend = layer.blend;\n if (layer.weightCurve && blend.blended) {\n let w = evaluateCurve(layer.weightCurve, time, layer.weight) / 100;\n w = w < 0 ? 0 : w > 0.99999 ? 1 : w;\n blend = { ...blend, weight: w };\n }\n result = combineLayerValue(result, value, blend, type, rotationOrder);\n }\n }\n return result;\n}\n\n/** Curves of one animated property (or blend shape weight) contributed by one animation layer. */\nexport interface FBXLayeredPropertySource {\n /** Index of the owning layer within the stack's layer list */\n layerIndex: number;\n /** Curves of the property, keyed by channel name (`d|X`, `d|DeformPercent`, ...) */\n curves: readonly FBXCurveData[];\n /** Default channel values stored on the curve node */\n defaultValues?: Record<string, number>;\n}\n\n/**\n * Evaluates an animated property through the animation layers: the base layer replaces the static value, every\n * further layer blends onto the running result according to its blend mode and (possibly animated) weight, like\n * `evaluateLayeredChannel` does for transforms.\n * @param sources - Per-layer curves of the property\n * @param layers - Stack layers, in order\n * @param channels - Channel names to evaluate, in output order\n * @param staticValue - Value per channel when nothing animates it\n * @param time - Time in seconds\n * @returns One value per channel\n */\nexport function evaluateLayeredProperty(\n sources: readonly FBXLayeredPropertySource[],\n layers: readonly FBXAnimationLayerData[],\n channels: readonly string[],\n staticValue: readonly number[],\n time: number\n): number[] {\n const result = channels.map((_, i) => staticValue[i] ?? 0);\n for (let layerIndex = 0; layerIndex < Math.max(layers.length, 1); layerIndex++) {\n const source = sources.find((s) => s.layerIndex === layerIndex);\n if (!source) {\n continue;\n }\n const value = channels.map((channel, i) =>\n evaluateCurve(\n source.curves.find((c) => c.channel === channel),\n time,\n source.defaultValues?.[channel] ?? result[i]\n )\n );\n const layer = layers[layerIndex];\n if (layerIndex === 0 || !layer) {\n for (let i = 0; i < result.length; i++) {\n result[i] = value[i];\n }\n continue;\n }\n let blend = layer.blend;\n if (layer.weightCurve && blend.blended) {\n let w = evaluateCurve(layer.weightCurve, time, layer.weight) / 100;\n w = w < 0 ? 0 : w > 0.99999 ? 1 : w;\n blend = { ...blend, weight: w };\n }\n for (let i = 0; i < result.length; i++) {\n result[i] = combineLayerValue([result[i], 0, 0], [value[i], 0, 0], blend, \"other\", 0)[0];\n }\n }\n return result;\n}\n\n/**\n * True when every curve of the given channel is inside a constant (stepped) segment at `time`, so a baked key at\n * that time should hold its value instead of interpolating towards the next sample.\n */\nexport function isChannelSteppedAt(curveNodes: readonly FBXCurveNodeData[], type: \"T\" | \"R\" | \"S\", time: number): boolean {\n let sawCurve = false;\n for (const node of curveNodes) {\n if (node.type !== type) {\n continue;\n }\n for (const curve of node.curves) {\n const keys = curve.keys;\n if (keys.length < 2) {\n continue;\n }\n sawCurve = true;\n // Outside the key range the curve extrapolates continuously; only interior constant segments step.\n if (time < keys[0].time || time >= keys[keys.length - 1].time) {\n return false;\n }\n let i = 0;\n while (i + 1 < keys.length && keys[i + 1].time <= time) {\n i++;\n }\n if (keys[i].interpolation !== \"constant\") {\n return false;\n }\n }\n }\n return sawCurve;\n}\n"]}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * FBX animation curve model and evaluator.
3
+ *
4
+ * Keys carry cubic Bezier tangents expressed the way the FBX SDK stores them: a left and right tangent with a time
5
+ * extent (dx, as a fraction of the segment scaled by the tangent weight) and a value extent (dy). Linear and constant
6
+ * segments are represented the same way so that a single evaluator handles every case, including the weighted
7
+ * tangents Maya and MotionBuilder write, TCB keys, and the pre/post extrapolation modes.
8
+ */
9
+ /** FBX time units: 46186158000 ticks per second */
10
+ export declare const FBX_TIME_UNIT = 46186158000;
11
+ export type FBXInterpolationType = "constant" | "linear" | "cubic";
12
+ export type FBXExtrapolationMode = "constant" | "repeat" | "mirror" | "slope" | "repeatRelative";
13
+ export interface FBXExtrapolation {
14
+ mode: FBXExtrapolationMode;
15
+ /** Number of repetitions, or -1 for infinite */
16
+ repeatCount: number;
17
+ }
18
+ /** A single keyframe */
19
+ export interface FBXKeyframe {
20
+ /** Time in seconds */
21
+ time: number;
22
+ /** Value at this keyframe */
23
+ value: number;
24
+ /** Interpolation used from this key to the next key */
25
+ interpolation: FBXInterpolationType;
26
+ /** Constant interpolation variant */
27
+ constantMode?: "standard" | "next";
28
+ /** Left (incoming) tangent: time extent in seconds and value extent */
29
+ leftDx: number;
30
+ leftDy: number;
31
+ /** Right (outgoing) tangent: time extent in seconds and value extent */
32
+ rightDx: number;
33
+ rightDy: number;
34
+ /** Cubic outgoing slope in value units per second (derived, kept for consumers that export hermite keys) */
35
+ rightSlope?: number;
36
+ /** Cubic incoming slope for the next key, in value units per second (derived) */
37
+ nextLeftSlope?: number;
38
+ }
39
+ /** An animation curve (one axis of one property) */
40
+ export interface FBXCurveData {
41
+ /** Channel: "d|X", "d|Y", "d|Z" */
42
+ channel: string;
43
+ /** Keyframes */
44
+ keys: FBXKeyframe[];
45
+ /** True for baked sample curves that should be connected as linear samples */
46
+ isSampled?: boolean;
47
+ preExtrapolation?: FBXExtrapolation;
48
+ postExtrapolation?: FBXExtrapolation;
49
+ }
50
+ /** Raw key attribute data for one key, after run-length decoding. */
51
+ export interface FBXKeyAttributes {
52
+ flags: number;
53
+ data: [number, number, number, number];
54
+ }
55
+ /**
56
+ * Builds keyframes from parallel time/value arrays and their (run-length encoded) attributes, resolving every
57
+ * tangent mode the FBX SDK writes: user, broken, auto (with clamp / progressive clamp / time-independent flags and
58
+ * auto bias), TCB, weighted, linear and constant.
59
+ */
60
+ export declare function buildKeyframes(times: ArrayLike<number>, values: ArrayLike<number>, attributes: (index: number) => FBXKeyAttributes): FBXKeyframe[];
61
+ /** Auto tangent as the FBX SDK computes it, including clamping and auto bias. */
62
+ export declare function solveAutoTangent(prevTime: number, time: number, nextTime: number, prevValue: number, value: number, nextValue: number, weightLeft: number, weightRight: number, autoBias: number, flags: number): number;
63
+ /** Builds a keyframe list from explicit per-key slopes (legacy Takes and synthetic curves). */
64
+ export declare function keyframesFromSlopes(times: number[], values: number[], interpolation: FBXInterpolationType[], constantNext: boolean[], leftSlope: number[], rightSlope: number[], leftWeight?: number[], rightWeight?: number[]): FBXKeyframe[];
65
+ /** Reads a `Pre-Extrapolation` / `Post-Extrapolation` block: `Type` is a character code, `Repetition` a count. */
66
+ export declare function parseExtrapolation(typeValue: unknown, repetitionValue: unknown): FBXExtrapolation;
67
+ export declare function evaluateCurve(curve: FBXCurveData | undefined, time: number, defaultValue: number, noExtrapolation?: boolean): number;
68
+ export type Vec3 = [number, number, number];
69
+ export type Quat = [number, number, number, number];
70
+ /** Euler angles in degrees with an FBX rotation order (0=XYZ ... 5=ZYX; spheric falls back to XYZ) to a quaternion. */
71
+ export declare function eulerToQuat(v: Vec3, order: number): Quat;
72
+ /** Quaternion to Euler angles in degrees for an FBX rotation order (inverse of eulerToQuat). */
73
+ export declare function quatToEuler(q: Quat, order: number): Vec3;
74
+ /** Blend semantics of an animation layer, derived from its BlendMode and accumulation modes. */
75
+ export interface FBXLayerBlend {
76
+ /** Layer participates in blending (BlendMode Additive or Override Passthrough) */
77
+ blended: boolean;
78
+ /** Layer adds onto the result instead of replacing it (BlendMode Additive) */
79
+ additive: boolean;
80
+ /** Rotations compose as quaternions (RotationAccumulationMode ByLayer) */
81
+ composeRotation: boolean;
82
+ /** Scales compose multiplicatively (ScaleAccumulationMode Multiply) */
83
+ composeScale: boolean;
84
+ /** Layer weight in [0, 1] */
85
+ weight: number;
86
+ }
87
+ /**
88
+ * Combines one animation layer's value into the running result, exactly as the FBX SDK evaluator does.
89
+ * `kind` selects the accumulation rule: "R" rotations (degrees, rotation order given), "S" scales, anything else linear.
90
+ */
91
+ export declare function combineLayerValue(result: Vec3, value: Vec3, layer: FBXLayerBlend, kind: "T" | "R" | "S" | "other", rotationOrder: number): Vec3;