@babylonjs/loaders 9.26.0 → 9.26.2
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.
- package/FBX/fbxConstraintBehavior.d.ts +188 -0
- package/FBX/fbxConstraintBehavior.js +532 -0
- package/FBX/fbxConstraintBehavior.js.map +1 -0
- package/FBX/fbxFileLoader.pure.d.ts +175 -6
- package/FBX/fbxFileLoader.pure.js +1521 -286
- package/FBX/fbxFileLoader.pure.js.map +1 -1
- package/FBX/index.d.ts +4 -1
- package/FBX/index.js +1 -0
- package/FBX/index.js.map +1 -1
- package/FBX/interpreter/animation.d.ts +73 -33
- package/FBX/interpreter/animation.js +620 -223
- package/FBX/interpreter/animation.js.map +1 -1
- package/FBX/interpreter/animationCurve.d.ts +91 -0
- package/FBX/interpreter/animationCurve.js +623 -0
- package/FBX/interpreter/animationCurve.js.map +1 -0
- package/FBX/interpreter/blendShapes.js +9 -18
- package/FBX/interpreter/blendShapes.js.map +1 -1
- package/FBX/interpreter/connections.d.ts +1 -1
- package/FBX/interpreter/connections.js +173 -34
- package/FBX/interpreter/connections.js.map +1 -1
- package/FBX/interpreter/constraints.d.ts +68 -0
- package/FBX/interpreter/constraints.js +143 -0
- package/FBX/interpreter/constraints.js.map +1 -0
- package/FBX/interpreter/fbxInterpreter.d.ts +89 -4
- package/FBX/interpreter/fbxInterpreter.js +474 -122
- package/FBX/interpreter/fbxInterpreter.js.map +1 -1
- package/FBX/interpreter/geometry.d.ts +1 -1
- package/FBX/interpreter/geometry.js +150 -92
- package/FBX/interpreter/geometry.js.map +1 -1
- package/FBX/interpreter/legacyDocument.d.ts +11 -0
- package/FBX/interpreter/legacyDocument.js +425 -0
- package/FBX/interpreter/legacyDocument.js.map +1 -0
- package/FBX/interpreter/materialModel.d.ts +71 -0
- package/FBX/interpreter/materialModel.js +622 -0
- package/FBX/interpreter/materialModel.js.map +1 -0
- package/FBX/interpreter/materials.d.ts +13 -1
- package/FBX/interpreter/materials.js +88 -5
- package/FBX/interpreter/materials.js.map +1 -1
- package/FBX/interpreter/nodeTransform.d.ts +32 -0
- package/FBX/interpreter/nodeTransform.js +54 -0
- package/FBX/interpreter/nodeTransform.js.map +1 -0
- package/FBX/interpreter/nurbs.d.ts +99 -0
- package/FBX/interpreter/nurbs.js +627 -0
- package/FBX/interpreter/nurbs.js.map +1 -0
- package/FBX/interpreter/propertyTemplates.d.ts +23 -0
- package/FBX/interpreter/propertyTemplates.js +109 -2
- package/FBX/interpreter/propertyTemplates.js.map +1 -1
- package/FBX/interpreter/rig.js +16 -0
- package/FBX/interpreter/rig.js.map +1 -1
- package/FBX/interpreter/sceneDiagnostics.js +28 -3
- package/FBX/interpreter/sceneDiagnostics.js.map +1 -1
- package/FBX/interpreter/skeleton.d.ts +4 -18
- package/FBX/interpreter/skeleton.js +16 -94
- package/FBX/interpreter/skeleton.js.map +1 -1
- package/FBX/parsers/fbxAsciiParser.js +119 -9
- package/FBX/parsers/fbxAsciiParser.js.map +1 -1
- package/FBX/parsers/fbxBinaryParser.js +74 -22
- package/FBX/parsers/fbxBinaryParser.js.map +1 -1
- package/FBX/pure.d.ts +1 -0
- package/FBX/pure.js +1 -0
- package/FBX/pure.js.map +1 -1
- package/FBX/types/fbxTypes.d.ts +18 -2
- package/FBX/types/fbxTypes.js +40 -12
- package/FBX/types/fbxTypes.js.map +1 -1
- package/SPLAT/gaussianSplattingStream.d.ts +79 -25
- package/SPLAT/gaussianSplattingStream.js +320 -95
- package/SPLAT/gaussianSplattingStream.js.map +1 -1
- package/USD/usdCommandProtocol.d.ts +20 -4
- package/USD/usdCommandProtocol.js +25 -3
- package/USD/usdCommandProtocol.js.map +1 -1
- package/USD/usdFileLoader.pure.js +2 -0
- package/USD/usdFileLoader.pure.js.map +1 -1
- package/USD/usdSceneMaterializer.js +430 -92
- package/USD/usdSceneMaterializer.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.d.ts +110 -3
- package/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.js +468 -74
- package/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphEventReferenceBlock.d.ts +47 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphEventReferenceBlock.js +68 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphEventReferenceBlock.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphGLTFDataProvider.d.ts +2 -2
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphGLTFDataProvider.js +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphGLTFDataProvider.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphObjectReferenceBlock.d.ts +24 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphObjectReferenceBlock.js +38 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphObjectReferenceBlock.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphUnsupportedInteractivityBlock.d.ts +41 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphUnsupportedInteractivityBlock.js +63 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphUnsupportedInteractivityBlock.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity/index.d.ts +5 -0
- package/glTF/2.0/Extensions/KHR_interactivity/index.js +5 -0
- package/glTF/2.0/Extensions/KHR_interactivity/index.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphModel.d.ts +112 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphModel.js +773 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphModel.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.d.ts +18 -10
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.js +299 -54
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityHostResolver.d.ts +2 -1
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityHostResolver.js +7 -2
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityHostResolver.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityNodeState.d.ts +24 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityNodeState.js +89 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityNodeState.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity/pure.d.ts +5 -0
- package/glTF/2.0/Extensions/KHR_interactivity/pure.js +5 -0
- package/glTF/2.0/Extensions/KHR_interactivity/pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity.pure.d.ts +55 -1
- package/glTF/2.0/Extensions/KHR_interactivity.pure.js +124 -76
- package/glTF/2.0/Extensions/KHR_interactivity.pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity.types.d.ts +18 -1
- package/glTF/2.0/Extensions/KHR_interactivity.types.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_node_hoverability.pure.d.ts +2 -0
- package/glTF/2.0/Extensions/KHR_node_hoverability.pure.js +114 -56
- package/glTF/2.0/Extensions/KHR_node_hoverability.pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_node_selectability.pure.d.ts +2 -0
- package/glTF/2.0/Extensions/KHR_node_selectability.pure.js +80 -35
- package/glTF/2.0/Extensions/KHR_node_selectability.pure.js.map +1 -1
- package/glTF/2.0/Extensions/interactivityRefPathToObjectConverter.js +3 -2
- package/glTF/2.0/Extensions/interactivityRefPathToObjectConverter.js.map +1 -1
- package/glTF/2.0/Extensions/objectModelMapping.d.ts +4 -2
- package/glTF/2.0/Extensions/objectModelMapping.js +33 -4
- package/glTF/2.0/Extensions/objectModelMapping.js.map +1 -1
- package/glTF/2.0/glTFLoader.pure.d.ts +1 -1
- package/glTF/2.0/glTFLoader.pure.js +9 -4
- package/glTF/2.0/glTFLoader.pure.js.map +1 -1
- package/glTF/2.0/glTFLoaderExtension.d.ts +2 -1
- package/glTF/2.0/glTFLoaderExtension.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fbxInterpreter.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/FBX/interpreter/fbxInterpreter.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\r\nimport { type FBXDocument, type FBXNode, findDocumentNode, findChildByName, getPropertyValue, cleanFBXName } from \"../types/fbxTypes\";\r\n\r\nimport { resolveConnections, getChildren, type FBXObjectMap } from \"./connections\";\r\nimport { extractGeometry, type FBXGeometryData } from \"./geometry\";\r\nimport { extractMaterial, type FBXMaterialData } from \"./materials\";\r\nimport { extractSkins, type FBXSkinData } from \"./skeleton\";\r\nimport { resolveRigs, type FBXRigData } from \"./rig\";\r\nimport { extractAnimations, type FBXAnimationStackData } from \"./animation\";\r\nimport { extractBlendShapes, type FBXBlendShapeData } from \"./blendShapes\";\r\nimport { extractSceneDiagnostics, type FBXSceneDiagnostic } from \"./sceneDiagnostics\";\r\nimport {\r\n extractPropertyTemplates,\r\n getPropertyTemplate,\r\n resolveNumberProperty,\r\n resolvePropertyValue,\r\n resolveVector3Property,\r\n type FBXPropertyTemplate,\r\n type FBXPropertyTemplateMap,\r\n} from \"./propertyTemplates\";\r\n\r\n/** Represents a model (transform node) in the FBX scene */\r\nexport interface FBXModelData {\r\n id: number;\r\n name: string;\r\n subType: string;\r\n /** Geometry attached to this model (if it's a Mesh type) */\r\n geometry?: FBXGeometryData;\r\n /** Materials assigned to this model */\r\n materials: FBXMaterialData[];\r\n /** Child models */\r\n children: FBXModelData[];\r\n /** Transform properties */\r\n translation: [number, number, number];\r\n rotation: [number, number, number];\r\n scale: [number, number, number];\r\n /** PreRotation (applied before Lcl Rotation, in degrees) */\r\n preRotation: [number, number, number];\r\n /** PostRotation (applied after Lcl Rotation, inverted, in degrees) */\r\n postRotation: [number, number, number];\r\n /** RotationPivot — point around which rotation occurs */\r\n rotationPivot: [number, number, number];\r\n /** ScalingPivot — point around which scaling occurs */\r\n scalingPivot: [number, number, number];\r\n /** RotationOffset — translation after rotation pivot */\r\n rotationOffset: [number, number, number];\r\n /** ScalingOffset — translation after scaling pivot */\r\n scalingOffset: [number, number, number];\r\n /** Geometric transforms — applied to geometry only, do not affect children */\r\n geometricTranslation: [number, number, number];\r\n geometricRotation: [number, number, number];\r\n geometricScaling: [number, number, number];\r\n /** Rotation order: 0=XYZ, 1=XZY, 2=YZX, 3=YXZ, 4=ZXY, 5=ZYX */\r\n rotationOrder: number;\r\n /** FBX transform inheritance mode. 0=RrSs, 1=RSrs, 2=Rrs */\r\n inheritType: number;\r\n /** Whether backface culling is disabled (\"CullingOff\") */\r\n cullingOff: boolean;\r\n /** User-defined custom properties from Properties70 */\r\n customProperties?: Record<string, string | number | boolean>;\r\n /** Recoverable model import diagnostics */\r\n diagnostics: string[];\r\n}\r\n\r\n/** Camera data extracted from FBX */\r\nexport interface FBXCameraData {\r\n /** Model ID this camera is attached to */\r\n modelId: number;\r\n /** Camera name */\r\n name: string;\r\n /** Field of view in degrees */\r\n fieldOfView: number;\r\n /** Near clip plane */\r\n nearPlane: number;\r\n /** Far clip plane */\r\n farPlane: number;\r\n /** Aspect ratio (width/height), 0 = use viewport */\r\n aspectRatio: number;\r\n /** Projection type */\r\n projectionType: \"perspective\" | \"orthographic\";\r\n /** Focal length in millimeters when present */\r\n focalLength?: number;\r\n /** Filmback width in inches when present */\r\n filmWidth?: number;\r\n /** Filmback height in inches when present */\r\n filmHeight?: number;\r\n /** Orthographic zoom/height when present */\r\n orthoZoom?: number;\r\n /** Camera roll in degrees when present */\r\n roll?: number;\r\n /** Known unsupported or unrecognized camera properties */\r\n unknownProperties: string[];\r\n /** Recoverable camera import diagnostics */\r\n diagnostics: string[];\r\n}\r\n\r\n/** Light data extracted from FBX */\r\nexport interface FBXLightData {\r\n /** Model ID this light is attached to */\r\n modelId: number;\r\n /** Light name */\r\n name: string;\r\n /** Light type: 0=Point, 1=Directional, 2=Spot */\r\n lightType: number;\r\n /** Color [r,g,b] 0-1 */\r\n color: [number, number, number];\r\n /** Intensity multiplier */\r\n intensity: number;\r\n /** Cone angle in degrees (for spot lights) */\r\n coneAngle: number;\r\n /** Decay type: 0=None, 1=Linear, 2=Quadratic */\r\n decayType: number;\r\n /** Inner cone angle in degrees for spot lights */\r\n innerAngle?: number;\r\n /** Outer cone angle in degrees for spot lights */\r\n outerAngle?: number;\r\n /** Distance at which FBX attenuation starts; preserved as metadata */\r\n decayStart?: number;\r\n /** Whether FBX near attenuation is enabled */\r\n enableNearAttenuation?: boolean;\r\n /** Whether FBX far attenuation is enabled */\r\n enableFarAttenuation?: boolean;\r\n /** Whether the source light requested shadow casting */\r\n castShadows?: boolean;\r\n /** Known unsupported or unrecognized light properties */\r\n unknownProperties: string[];\r\n /** Recoverable light import diagnostics */\r\n diagnostics: string[];\r\n}\r\n\r\n/** Result of interpreting an FBX document */\r\nexport interface FBXSceneData {\r\n /** All root-level models */\r\n rootModels: FBXModelData[];\r\n /** All geometries in the scene */\r\n geometries: FBXGeometryData[];\r\n /** All materials in the scene */\r\n materials: FBXMaterialData[];\r\n /** Skin deformers (skeletons + vertex weights) */\r\n skins: FBXSkinData[];\r\n /** Resolved deformation rigs shared by one or more skins */\r\n rigs: FBXRigData[];\r\n /** Blend shape deformers (morph targets) */\r\n blendShapes: FBXBlendShapeData[];\r\n /** Animation stacks (clips) */\r\n animations: FBXAnimationStackData[];\r\n /** Cameras */\r\n cameras: FBXCameraData[];\r\n /** Lights */\r\n lights: FBXLightData[];\r\n /** Scene-level unsupported feature diagnostics */\r\n diagnostics: FBXSceneDiagnostic[];\r\n /** Global settings */\r\n upAxis: number;\r\n upAxisSign: number;\r\n frontAxis: number;\r\n frontAxisSign: number;\r\n coordAxis: number;\r\n coordAxisSign: number;\r\n unitScaleFactor: number;\r\n}\r\n\r\n/**\r\n * Interpret a parsed FBX document into scene data.\r\n */\r\nexport function interpretFBX(doc: FBXDocument): FBXSceneData {\r\n const objectMap = resolveConnections(doc);\r\n const propertyTemplates = extractPropertyTemplates(doc);\r\n\r\n // Extract global settings\r\n const globalSettings = extractGlobalSettings(doc);\r\n\r\n // Extract all materials\r\n const materials: FBXMaterialData[] = [];\r\n for (const [id, node] of Array.from(objectMap.objects)) {\r\n if (node.name === \"Material\") {\r\n materials.push(extractMaterial(node, id, objectMap, propertyTemplates));\r\n }\r\n }\r\n\r\n // Extract all geometries\r\n const geometries: FBXGeometryData[] = [];\r\n for (const [id, node] of Array.from(objectMap.objects)) {\r\n if (node.name === \"Geometry\") {\r\n const subType = getPropertyValue<string>(node, 2);\r\n if (subType === \"Mesh\") {\r\n geometries.push(extractGeometry(node, id));\r\n }\r\n }\r\n }\r\n\r\n // Extract skeleton/skinning data\r\n const skins = extractSkins(objectMap);\r\n const rigs = resolveRigs(objectMap, skins);\r\n\r\n // Extract blend shape data\r\n const blendShapes = extractBlendShapes(objectMap);\r\n\r\n // Extract animation data\r\n const animations = extractAnimations(objectMap);\r\n\r\n // Extract cameras and lights from NodeAttribute objects\r\n const cameras = extractCameras(objectMap, propertyTemplates);\r\n const lights = extractLights(objectMap, propertyTemplates);\r\n const diagnostics = extractSceneDiagnostics(objectMap);\r\n\r\n // Build model hierarchy\r\n const rootModels = buildModelHierarchy(objectMap, geometries, materials, propertyTemplates);\r\n\r\n return {\r\n rootModels,\r\n geometries,\r\n materials,\r\n skins,\r\n rigs,\r\n blendShapes,\r\n animations,\r\n cameras,\r\n lights,\r\n diagnostics,\r\n ...globalSettings,\r\n };\r\n}\r\n\r\n// ── Model Hierarchy ────────────────────────────────────────────────────────────\r\n\r\nfunction buildModelHierarchy(objectMap: FBXObjectMap, geometries: FBXGeometryData[], materials: FBXMaterialData[], propertyTemplates: FBXPropertyTemplateMap): FBXModelData[] {\r\n const geometryMap = new Map<number, FBXGeometryData>();\r\n for (const g of geometries) {\r\n geometryMap.set(g.id, g);\r\n }\r\n\r\n const materialMap = new Map<number, FBXMaterialData>();\r\n for (const m of materials) {\r\n materialMap.set(m.id, m);\r\n }\r\n\r\n // Find root models (those connected to ID 0, which is the scene root)\r\n const rootChildren = objectMap.childrenOf.get(0) ?? [];\r\n const rootModels: FBXModelData[] = [];\r\n\r\n for (const { id } of rootChildren) {\r\n const node = objectMap.objects.get(id);\r\n if (node && node.name === \"Model\") {\r\n rootModels.push(buildModel(id, node, objectMap, geometryMap, materialMap, propertyTemplates));\r\n }\r\n }\r\n\r\n return rootModels;\r\n}\r\n\r\nfunction buildModel(\r\n modelId: number,\r\n modelNode: FBXNode,\r\n objectMap: FBXObjectMap,\r\n geometryMap: Map<number, FBXGeometryData>,\r\n materialMap: Map<number, FBXMaterialData>,\r\n propertyTemplates: FBXPropertyTemplateMap\r\n): FBXModelData {\r\n const name = cleanFBXName(getPropertyValue<string>(modelNode, 1) ?? \"Model\");\r\n const subType = getPropertyValue<string>(modelNode, 2) ?? \"Null\";\r\n\r\n // Find attached geometry\r\n const geomChildren = getChildren(objectMap, modelId, \"Geometry\");\r\n const geometry = geomChildren.length > 0 ? geometryMap.get(geomChildren[0].id) : undefined;\r\n\r\n // Find attached materials\r\n const matChildren = getChildren(objectMap, modelId, \"Material\");\r\n const modelMaterials: FBXMaterialData[] = [];\r\n for (const { id } of matChildren) {\r\n const mat = materialMap.get(id);\r\n if (mat) {\r\n modelMaterials.push(mat);\r\n }\r\n }\r\n\r\n // Extract transform\r\n const transform = extractTransform(modelNode, getPropertyTemplate(propertyTemplates, \"Model\", \"FbxNode\") ?? getPropertyTemplate(propertyTemplates, \"Model\"));\r\n\r\n // Recursively build child models\r\n const childModelNodes = getChildren(objectMap, modelId, \"Model\");\r\n const children: FBXModelData[] = [];\r\n for (const { id, node } of childModelNodes) {\r\n children.push(buildModel(id, node, objectMap, geometryMap, materialMap, propertyTemplates));\r\n }\r\n\r\n // Extract culling\r\n const cullingNode = modelNode.children.find((c) => c.name === \"Culling\");\r\n const cullingOff = cullingNode ? getPropertyValue<string>(cullingNode, 0) === \"CullingOff\" : false;\r\n\r\n // Extract user-defined custom properties\r\n const customProperties = extractCustomProperties(modelNode);\r\n\r\n return {\r\n id: modelId,\r\n name,\r\n subType,\r\n geometry,\r\n materials: modelMaterials,\r\n children,\r\n cullingOff,\r\n customProperties,\r\n ...transform,\r\n };\r\n}\r\n\r\nfunction extractTransform(\r\n modelNode: FBXNode,\r\n template?: FBXPropertyTemplate\r\n): {\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 geometricTranslation: [number, number, number];\r\n geometricRotation: [number, number, number];\r\n geometricScaling: [number, number, number];\r\n rotationOrder: number;\r\n inheritType: number;\r\n diagnostics: string[];\r\n} {\r\n const translation = resolveVector3Property(modelNode, template, \"Lcl Translation\", [0, 0, 0]);\r\n const rotation = resolveVector3Property(modelNode, template, \"Lcl Rotation\", [0, 0, 0]);\r\n const scale = resolveVector3Property(modelNode, template, \"Lcl Scaling\", [1, 1, 1]);\r\n const preRotation = resolveVector3Property(modelNode, template, \"PreRotation\", [0, 0, 0]);\r\n const postRotation = resolveVector3Property(modelNode, template, \"PostRotation\", [0, 0, 0]);\r\n const rotationPivot = resolveVector3Property(modelNode, template, \"RotationPivot\", [0, 0, 0]);\r\n const scalingPivot = resolveVector3Property(modelNode, template, \"ScalingPivot\", [0, 0, 0]);\r\n const rotationOffset = resolveVector3Property(modelNode, template, \"RotationOffset\", [0, 0, 0]);\r\n const scalingOffset = resolveVector3Property(modelNode, template, \"ScalingOffset\", [0, 0, 0]);\r\n const geometricTranslation = resolveVector3Property(modelNode, template, \"GeometricTranslation\", [0, 0, 0]);\r\n const geometricRotation = resolveVector3Property(modelNode, template, \"GeometricRotation\", [0, 0, 0]);\r\n const geometricScaling = resolveVector3Property(modelNode, template, \"GeometricScaling\", [1, 1, 1]);\r\n const rotationOrder = resolveNumberProperty(modelNode, template, \"RotationOrder\", 0);\r\n const inheritType = resolveNumberProperty(modelNode, template, \"InheritType\", 1);\r\n const diagnostics =\r\n inheritType !== 1 && inheritType !== 2\r\n ? [\r\n `InheritType ${inheritType} is parsed and preserved; runtime parent-scale inheritance remains gated to avoid changing existing visual behavior without a fixture-specific baseline.`,\r\n ]\r\n : [];\r\n\r\n return {\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 geometricTranslation,\r\n geometricRotation,\r\n geometricScaling,\r\n rotationOrder,\r\n inheritType,\r\n diagnostics,\r\n };\r\n}\r\n\r\n// ── Global Settings ────────────────────────────────────────────────────────────\r\n\r\ninterface GlobalSettings {\r\n upAxis: number;\r\n upAxisSign: number;\r\n frontAxis: number;\r\n frontAxisSign: number;\r\n coordAxis: number;\r\n coordAxisSign: number;\r\n unitScaleFactor: number;\r\n}\r\n\r\nfunction extractGlobalSettings(doc: FBXDocument): GlobalSettings {\r\n const defaults: GlobalSettings = {\r\n upAxis: 1,\r\n upAxisSign: 1,\r\n frontAxis: 2,\r\n frontAxisSign: 1,\r\n coordAxis: 0,\r\n coordAxisSign: 1,\r\n unitScaleFactor: 1,\r\n };\r\n\r\n const gsNode = findDocumentNode(doc, \"GlobalSettings\");\r\n if (!gsNode) {\r\n return defaults;\r\n }\r\n\r\n const props70 = gsNode.children.find((c) => c.name === \"Properties70\");\r\n if (!props70) {\r\n return defaults;\r\n }\r\n\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 const value = toNumber(p.properties[4]?.value);\r\n if (propName && value !== undefined) {\r\n switch (propName) {\r\n case \"UpAxis\":\r\n defaults.upAxis = value;\r\n break;\r\n case \"UpAxisSign\":\r\n defaults.upAxisSign = value;\r\n break;\r\n case \"FrontAxis\":\r\n defaults.frontAxis = value;\r\n break;\r\n case \"FrontAxisSign\":\r\n defaults.frontAxisSign = value;\r\n break;\r\n case \"CoordAxis\":\r\n defaults.coordAxis = value;\r\n break;\r\n case \"CoordAxisSign\":\r\n defaults.coordAxisSign = value;\r\n break;\r\n case \"UnitScaleFactor\":\r\n defaults.unitScaleFactor = value;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return defaults;\r\n}\r\n\r\n// ── Cameras & Lights ──────────────────────────────────────────────────────────\r\n\r\nconst SYSTEM_PROPERTIES = new Set([\r\n \"Lcl Translation\",\r\n \"Lcl Rotation\",\r\n \"Lcl Scaling\",\r\n \"PreRotation\",\r\n \"PostRotation\",\r\n \"RotationPivot\",\r\n \"ScalingPivot\",\r\n \"RotationOffset\",\r\n \"ScalingOffset\",\r\n \"RotationOrder\",\r\n \"GeometricTranslation\",\r\n \"GeometricRotation\",\r\n \"GeometricScaling\",\r\n \"Visibility\",\r\n \"InheritType\",\r\n \"ScalingMax\",\r\n \"DefaultAttributeIndex\",\r\n \"currentUVSet\",\r\n \"lockInfluenceWeights\",\r\n]);\r\n\r\nfunction extractCustomProperties(modelNode: FBXNode): Record<string, string | number | boolean> | undefined {\r\n const props70 = findChildByName(modelNode, \"Properties70\");\r\n if (!props70) {\r\n return undefined;\r\n }\r\n\r\n const custom: Record<string, string | number | boolean> = {};\r\n let hasAny = false;\r\n\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 || SYSTEM_PROPERTIES.has(propName)) {\r\n continue;\r\n }\r\n\r\n // Accept user-defined properties (type starts with something other than standard types)\r\n // Standard FBX types: \"KString\", \"Number\", \"double\", \"int\", \"bool\", \"Lcl\"...\r\n // User properties often have types like \"KString\", but are in the UDP (User Defined Properties) section\r\n // Heuristic: if not in SYSTEM_PROPERTIES set, it's user-defined\r\n const val = p.properties[4]?.value;\r\n if (val === undefined) {\r\n continue;\r\n }\r\n\r\n if (typeof val === \"string\") {\r\n custom[propName] = val;\r\n hasAny = true;\r\n } else if (typeof val === \"number\") {\r\n custom[propName] = val;\r\n hasAny = true;\r\n } else if (typeof val === \"boolean\") {\r\n custom[propName] = val;\r\n hasAny = true;\r\n }\r\n }\r\n\r\n return hasAny ? custom : undefined;\r\n}\r\n\r\nconst CAMERA_PROPERTIES = new Set([\r\n \"FieldOfView\",\r\n \"FieldOfViewX\",\r\n \"FieldOfViewY\",\r\n \"NearPlane\",\r\n \"FarPlane\",\r\n \"AspectWidth\",\r\n \"AspectHeight\",\r\n \"FilmAspectRatio\",\r\n \"FocalLength\",\r\n \"FilmWidth\",\r\n \"FilmHeight\",\r\n \"ApertureWidth\",\r\n \"ApertureHeight\",\r\n \"CameraProjectionType\",\r\n \"ProjectionType\",\r\n \"OrthoZoom\",\r\n \"Roll\",\r\n \"ApertureMode\",\r\n]);\r\n\r\nconst LIGHT_PROPERTIES = new Set([\r\n \"LightType\",\r\n \"Color\",\r\n \"Intensity\",\r\n \"InnerAngle\",\r\n \"OuterAngle\",\r\n \"ConeAngle\",\r\n \"DecayType\",\r\n \"DecayStart\",\r\n \"EnableNearAttenuation\",\r\n \"EnableFarAttenuation\",\r\n \"CastShadow\",\r\n \"Shadow\",\r\n]);\r\n\r\nfunction extractCameras(objectMap: FBXObjectMap, templates: FBXPropertyTemplateMap): FBXCameraData[] {\r\n const cameras: FBXCameraData[] = [];\r\n const cameraTemplate = getPropertyTemplate(templates, \"NodeAttribute\", \"FbxCamera\") ?? getPropertyTemplate(templates, \"NodeAttribute\");\r\n\r\n for (const [id, node] of Array.from(objectMap.objects)) {\r\n if (node.name !== \"NodeAttribute\") {\r\n continue;\r\n }\r\n const subType = getPropertyValue<string>(node, 2);\r\n if (subType !== \"Camera\") {\r\n continue;\r\n }\r\n\r\n // Find the model this camera is attached to (parent)\r\n const parent = objectMap.parentOf.get(id);\r\n if (!parent) {\r\n continue;\r\n }\r\n const parentNode = objectMap.objects.get(parent.id);\r\n if (!parentNode || parentNode.name !== \"Model\") {\r\n continue;\r\n }\r\n\r\n const name = cleanFBXName(getPropertyValue<string>(parentNode, 1) ?? \"Camera\");\r\n\r\n const nearPlane = resolveNumberProperty(node, cameraTemplate, \"NearPlane\", 0.1);\r\n const farPlane = resolveNumberProperty(node, cameraTemplate, \"FarPlane\", 10000);\r\n const aspectRatio = resolveCameraAspectRatio(node, cameraTemplate);\r\n const projectionType =\r\n resolveNumberProperty(node, cameraTemplate, \"CameraProjectionType\", 0) === 1 || resolveNumberProperty(node, cameraTemplate, \"ProjectionType\", 0) === 1\r\n ? \"orthographic\"\r\n : \"perspective\";\r\n const focalLength = toNumber(resolvePropertyValue(node, cameraTemplate, \"FocalLength\"));\r\n const filmWidth = toNumber(resolvePropertyValue(node, cameraTemplate, \"FilmWidth\")) ?? toNumber(resolvePropertyValue(node, cameraTemplate, \"ApertureWidth\"));\r\n const filmHeight = toNumber(resolvePropertyValue(node, cameraTemplate, \"FilmHeight\")) ?? toNumber(resolvePropertyValue(node, cameraTemplate, \"ApertureHeight\"));\r\n const orthoZoom = toNumber(resolvePropertyValue(node, cameraTemplate, \"OrthoZoom\"));\r\n const roll = toNumber(resolvePropertyValue(node, cameraTemplate, \"Roll\"));\r\n const fieldOfView = resolveCameraFieldOfView(node, cameraTemplate, aspectRatio, focalLength, filmHeight);\r\n const diagnostics: string[] = [];\r\n if (projectionType === \"orthographic\" && orthoZoom === undefined) {\r\n diagnostics.push(\"Orthographic camera has no OrthoZoom; runtime orthographic bounds use a fallback.\");\r\n }\r\n if (focalLength !== undefined && filmHeight === undefined && resolvePropertyValue(node, cameraTemplate, \"FieldOfView\") === undefined) {\r\n diagnostics.push(\"FocalLength is present without FilmHeight; default field of view fallback may be used.\");\r\n }\r\n\r\n cameras.push({\r\n modelId: parent.id,\r\n name,\r\n fieldOfView,\r\n nearPlane,\r\n farPlane,\r\n aspectRatio,\r\n projectionType,\r\n focalLength,\r\n filmWidth,\r\n filmHeight,\r\n orthoZoom,\r\n roll,\r\n unknownProperties: collectUnknownLocalProperties(node, CAMERA_PROPERTIES),\r\n diagnostics,\r\n });\r\n }\r\n\r\n return cameras;\r\n}\r\n\r\nfunction extractLights(objectMap: FBXObjectMap, templates: FBXPropertyTemplateMap): FBXLightData[] {\r\n const lights: FBXLightData[] = [];\r\n const lightTemplate = getPropertyTemplate(templates, \"NodeAttribute\", \"FbxLight\") ?? getPropertyTemplate(templates, \"NodeAttribute\");\r\n\r\n for (const [id, node] of Array.from(objectMap.objects)) {\r\n if (node.name !== \"NodeAttribute\") {\r\n continue;\r\n }\r\n const subType = getPropertyValue<string>(node, 2);\r\n if (subType !== \"Light\") {\r\n continue;\r\n }\r\n\r\n // Find the model this light is attached to\r\n const parent = objectMap.parentOf.get(id);\r\n if (!parent) {\r\n continue;\r\n }\r\n const parentNode = objectMap.objects.get(parent.id);\r\n if (!parentNode || parentNode.name !== \"Model\") {\r\n continue;\r\n }\r\n\r\n const name = cleanFBXName(getPropertyValue<string>(parentNode, 1) ?? \"Light\");\r\n\r\n const lightType = resolveNumberProperty(node, lightTemplate, \"LightType\", 0);\r\n const color = resolveVector3Property(node, lightTemplate, \"Color\", [1, 1, 1]);\r\n const intensity = resolveNumberProperty(node, lightTemplate, \"Intensity\", 100) / 100;\r\n const outerAngle = toNumber(resolvePropertyValue(node, lightTemplate, \"OuterAngle\")) ?? toNumber(resolvePropertyValue(node, lightTemplate, \"ConeAngle\"));\r\n const innerAngle = toNumber(resolvePropertyValue(node, lightTemplate, \"InnerAngle\"));\r\n const coneAngle = outerAngle ?? 45;\r\n const decayType = resolveNumberProperty(node, lightTemplate, \"DecayType\", 2);\r\n const decayStart = toNumber(resolvePropertyValue(node, lightTemplate, \"DecayStart\"));\r\n const enableNearAttenuation = toBoolean(resolvePropertyValue(node, lightTemplate, \"EnableNearAttenuation\"));\r\n const enableFarAttenuation = toBoolean(resolvePropertyValue(node, lightTemplate, \"EnableFarAttenuation\"));\r\n const castShadows =\r\n toBoolean(resolvePropertyValue(node, lightTemplate, \"CastShadow\")) ??\r\n toBoolean(resolvePropertyValue(parentNode, undefined, \"CastShadow\")) ??\r\n toBoolean(resolvePropertyValue(parentNode, undefined, \"Shadow\"));\r\n const diagnostics: string[] = [];\r\n if (decayType !== 2) {\r\n diagnostics.push(`DecayType ${decayType} is preserved as metadata; Babylon falloff is not remapped in this pass.`);\r\n }\r\n if (decayStart !== undefined) {\r\n diagnostics.push(\"DecayStart is preserved as metadata and is not mapped to Babylon light range.\");\r\n }\r\n\r\n lights.push({\r\n modelId: parent.id,\r\n name,\r\n lightType,\r\n color,\r\n intensity,\r\n coneAngle,\r\n decayType,\r\n innerAngle,\r\n outerAngle,\r\n decayStart,\r\n enableNearAttenuation,\r\n enableFarAttenuation,\r\n castShadows,\r\n unknownProperties: collectUnknownLocalProperties(node, LIGHT_PROPERTIES),\r\n diagnostics,\r\n });\r\n }\r\n\r\n return lights;\r\n}\r\n\r\n// ── Utilities ──────────────────────────────────────────────────────────────────\r\n\r\nfunction toNumber(value: unknown): number | undefined {\r\n if (typeof value === \"number\") {\r\n return value;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction toBoolean(value: unknown): boolean | undefined {\r\n if (typeof value === \"boolean\") {\r\n return value;\r\n }\r\n if (typeof value === \"number\") {\r\n return value !== 0;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction resolveCameraAspectRatio(node: FBXNode, template?: FBXPropertyTemplate): number {\r\n const filmAspectRatio = toNumber(resolvePropertyValue(node, template, \"FilmAspectRatio\"));\r\n if (filmAspectRatio !== undefined && filmAspectRatio > 0) {\r\n return filmAspectRatio;\r\n }\r\n\r\n const aspectWidth = toNumber(resolvePropertyValue(node, template, \"AspectWidth\"));\r\n const aspectHeight = toNumber(resolvePropertyValue(node, template, \"AspectHeight\"));\r\n if (aspectWidth !== undefined && aspectHeight !== undefined && aspectWidth > 0 && aspectHeight > 0) {\r\n return aspectWidth / aspectHeight;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\nfunction resolveCameraFieldOfView(\r\n node: FBXNode,\r\n template: FBXPropertyTemplate | undefined,\r\n aspectRatio: number,\r\n focalLength: number | undefined,\r\n filmHeight: number | undefined\r\n): number {\r\n const verticalFov = toNumber(resolvePropertyValue(node, template, \"FieldOfViewY\")) ?? toNumber(resolvePropertyValue(node, template, \"FieldOfView\"));\r\n if (verticalFov !== undefined) {\r\n return verticalFov;\r\n }\r\n\r\n const horizontalFov = toNumber(resolvePropertyValue(node, template, \"FieldOfViewX\"));\r\n if (horizontalFov !== undefined) {\r\n if (aspectRatio > 0) {\r\n return radiansToDegrees(2 * Math.atan(Math.tan(degreesToRadians(horizontalFov) / 2) / aspectRatio));\r\n }\r\n return horizontalFov;\r\n }\r\n\r\n if (focalLength !== undefined && focalLength > 0 && filmHeight !== undefined && filmHeight > 0) {\r\n return radiansToDegrees(2 * Math.atan((filmHeight * 25.4) / (2 * focalLength)));\r\n }\r\n\r\n return 45;\r\n}\r\n\r\nfunction collectUnknownLocalProperties(node: FBXNode, known: Set<string>): string[] {\r\n const unknown = new Set<string>();\r\n for (const containerName of [\"Properties70\", \"Properties60\"]) {\r\n const container = findChildByName(node, containerName);\r\n for (const propertyNode of container?.children ?? []) {\r\n if (propertyNode.name !== \"P\" && propertyNode.name !== \"Property\") {\r\n continue;\r\n }\r\n const propertyName = getPropertyValue<string>(propertyNode, 0);\r\n if (propertyName && !known.has(propertyName)) {\r\n unknown.add(propertyName);\r\n }\r\n }\r\n }\r\n return Array.from(unknown).sort();\r\n}\r\n\r\nfunction degreesToRadians(degrees: number): number {\r\n return (degrees * Math.PI) / 180;\r\n}\r\n\r\nfunction radiansToDegrees(radians: number): number {\r\n return (radians * 180) / Math.PI;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"fbxInterpreter.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/FBX/interpreter/fbxInterpreter.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\nimport { extractNodeTransform } from \"./nodeTransform\";\nimport {\n extractUserProperties,\n getPropertyEntries,\n type FBXUserPropertyValue,\n extractPropertyTemplates,\n getPropertyTemplate,\n resolveNumberProperty,\n resolvePropertyValue,\n resolveVector3Property,\n type FBXPropertyTemplate,\n type FBXPropertyTemplateMap,\n} from \"./propertyTemplates\";\nimport { type FBXDocument, type FBXNode, findDocumentNode, findChildByName, getPropertyValue, cleanFBXName, getNodeArray } from \"../types/fbxTypes\";\n\nimport { resolveConnections, getChildren, type FBXObjectMap } from \"./connections\";\nimport { extractGeometry, type FBXGeometryData } from \"./geometry\";\nimport { extractLineGeometry, extractNurbsCurveGeometry, nurbsSurfaceToGeometry, type FBXCurveGeometryData } from \"./nurbs\";\nimport { isLegacyDocument, upgradeLegacyDocument } from \"./legacyDocument\";\nimport { extractConstraints, type FBXConstraintData } from \"./constraints\";\nimport { extractMaterial, extractTextureRef, type FBXMaterialData } from \"./materials\";\nimport { extractSkins, type FBXSkinData } from \"./skeleton\";\nimport { resolveRigs, type FBXRigData } from \"./rig\";\nimport { extractAnimations, type FBXAnimationStackData } from \"./animation\";\nimport { extractBlendShapes, type FBXBlendShapeData } from \"./blendShapes\";\nimport { extractSceneDiagnostics, type FBXSceneDiagnostic } from \"./sceneDiagnostics\";\n\n/** Represents a model (transform node) in the FBX scene */\nexport interface FBXModelData {\n id: number;\n name: string;\n subType: string;\n /** Geometry attached to this model (meshes and tessellated NURBS surfaces) */\n geometry?: FBXGeometryData;\n /** Curve geometry attached to this model (Line and NurbsCurve) */\n curve?: FBXCurveGeometryData;\n /** Materials assigned to this model */\n materials: FBXMaterialData[];\n /** Child models */\n children: FBXModelData[];\n /** Transform properties */\n translation: [number, number, number];\n rotation: [number, number, number];\n scale: [number, number, number];\n /** PreRotation (applied before Lcl Rotation, in degrees) */\n preRotation: [number, number, number];\n /** PostRotation (applied after Lcl Rotation, inverted, in degrees) */\n postRotation: [number, number, number];\n /** RotationPivot — point around which rotation occurs */\n rotationPivot: [number, number, number];\n /** ScalingPivot — point around which scaling occurs */\n scalingPivot: [number, number, number];\n /** RotationOffset — translation after rotation pivot */\n rotationOffset: [number, number, number];\n /** ScalingOffset — translation after scaling pivot */\n scalingOffset: [number, number, number];\n /** Geometric transforms — applied to geometry only, do not affect children */\n geometricTranslation: [number, number, number];\n geometricRotation: [number, number, number];\n geometricScaling: [number, number, number];\n /** Rotation order: 0=XYZ, 1=XZY, 2=YZX, 3=YXZ, 4=ZXY, 5=ZYX */\n rotationOrder: number;\n /** FBX transform inheritance mode. 0=RrSs, 1=RSrs, 2=Rrs */\n inheritType: number;\n /** Whether backface culling is disabled (\"CullingOff\") */\n cullingOff: boolean;\n /** User-defined custom properties from Properties70 */\n customProperties?: Record<string, FBXUserPropertyValue>;\n /** LOD group settings when this model is a LodGroup; children are the levels in order */\n lodGroup?: FBXLodGroupData;\n /** Display layer (CollectionExclusive) the model belongs to */\n displayLayer?: FBXDisplayLayerData;\n /** Recoverable model import diagnostics */\n diagnostics: string[];\n}\n\n/** LOD group settings (NodeAttribute \"LodGroup\") */\nexport interface FBXLodGroupData {\n /** Switch distance for level i+1 (level 0 has none). In scene units, or percent of screen when `relative`. */\n thresholds: number[];\n /** ThresholdsUsedAsPercentage */\n relative: boolean;\n /** DisplayLevels|LevelN: 0 use LOD, 1 show, 2 hide */\n displayLevels: number[];\n}\n\n/** Display layer (CollectionExclusive \"DisplayLayer\") */\nexport interface FBXDisplayLayerData {\n id: number;\n name: string;\n show: boolean;\n freeze: boolean;\n color: [number, number, number];\n modelIds: number[];\n}\n\n/** One member of a selection set: a model, optionally with a component selection on its mesh */\nexport interface FBXSelectionNodeData {\n modelId: number;\n /** IsTheNodeInSet: the whole node is selected (as opposed to only components) */\n includeNode: boolean;\n /** Selected control point indices (VertexIndexArray) */\n vertices?: number[];\n /** Selected edge indices (EdgeIndexArray) */\n edges?: number[];\n /** Selected polygon indices (PolygonIndexArray) */\n faces?: number[];\n}\n\n/** Selection set (Collection \"SelectionSet\") */\nexport interface FBXSelectionSetData {\n id: number;\n name: string;\n members: FBXSelectionNodeData[];\n}\n\n/** Camera data extracted from FBX */\nexport interface FBXCameraData {\n /** Model ID this camera is attached to */\n modelId: number;\n /** NodeAttribute object ID (animation curves target this) */\n attributeId: number;\n /** Camera name */\n name: string;\n /** Vertical field of view in degrees */\n fieldOfView: number;\n /** Horizontal field of view in degrees */\n fieldOfViewX: number;\n /** ApertureMode: 0 horizontal and vertical, 1 horizontal, 2 vertical, 3 focal length */\n apertureMode: number;\n /** Aperture (film gate after gate fit) size in inches */\n apertureSizeInch: [number, number];\n /** Orthographic view size (width, height) in scene units */\n orthographicSize: [number, number];\n /** Near clip plane */\n nearPlane: number;\n /** Far clip plane */\n farPlane: number;\n /** Aspect ratio (width/height), 0 = use viewport */\n aspectRatio: number;\n /** Projection type */\n projectionType: \"perspective\" | \"orthographic\";\n /** Focal length in millimeters when present */\n focalLength?: number;\n /** Filmback width in inches when present */\n filmWidth?: number;\n /** Filmback height in inches when present */\n filmHeight?: number;\n /** Orthographic zoom/height when present */\n orthoZoom?: number;\n /** Camera roll in degrees when present */\n roll?: number;\n /** User-defined properties on the camera attribute */\n userProperties?: Record<string, FBXUserPropertyValue>;\n /** Known unsupported or unrecognized camera properties */\n unknownProperties: string[];\n /** Recoverable camera import diagnostics */\n diagnostics: string[];\n}\n\n/** Light data extracted from FBX */\nexport interface FBXLightData {\n /** Model ID this light is attached to */\n modelId: number;\n /** NodeAttribute object ID (animation curves target this) */\n attributeId: number;\n /** Light name */\n name: string;\n /** Light type: 0=Point, 1=Directional, 2=Spot */\n lightType: number;\n /** Color [r,g,b] 0-1 */\n color: [number, number, number];\n /** Intensity multiplier */\n intensity: number;\n /** Cone angle in degrees (for spot lights) */\n coneAngle: number;\n /** Decay type: 0=None, 1=Linear, 2=Quadratic */\n decayType: number;\n /** Inner cone angle in degrees for spot lights */\n innerAngle?: number;\n /** Outer cone angle in degrees for spot lights */\n outerAngle?: number;\n /** Distance at which FBX attenuation starts; preserved as metadata */\n decayStart?: number;\n /** Whether FBX near attenuation is enabled */\n enableNearAttenuation?: boolean;\n /** Whether FBX far attenuation is enabled */\n enableFarAttenuation?: boolean;\n /** Whether the source light requested shadow casting */\n castShadows?: boolean;\n /** Near/far attenuation ranges in scene units (when enabled) */\n nearAttenuationStart?: number;\n nearAttenuationEnd?: number;\n farAttenuationStart?: number;\n farAttenuationEnd?: number;\n /** Area light shape: 0 rectangle, 1 sphere */\n areaLightShape?: number;\n /** User-defined properties on the light attribute */\n userProperties?: Record<string, FBXUserPropertyValue>;\n /** Known unsupported or unrecognized light properties */\n unknownProperties: string[];\n /** Recoverable light import diagnostics */\n diagnostics: string[];\n}\n\n/** Result of interpreting an FBX document */\nexport interface FBXSceneData {\n /** All root-level models */\n rootModels: FBXModelData[];\n /** All geometries in the scene */\n geometries: FBXGeometryData[];\n /** All curve geometries (lines and tessellated NURBS curves) */\n curves: FBXCurveGeometryData[];\n /** All materials in the scene */\n materials: FBXMaterialData[];\n /** Skin deformers (skeletons + vertex weights) */\n skins: FBXSkinData[];\n /** Resolved deformation rigs shared by one or more skins */\n rigs: FBXRigData[];\n /** Blend shape deformers (morph targets) */\n blendShapes: FBXBlendShapeData[];\n /** Animation stacks (clips) */\n animations: FBXAnimationStackData[];\n /** Cameras */\n cameras: FBXCameraData[];\n /** Lights */\n lights: FBXLightData[];\n /** Scene-level unsupported feature diagnostics */\n diagnostics: FBXSceneDiagnostic[];\n /** Constraints (aim, parent, position, rotation, scale, IK) */\n constraints: FBXConstraintData[];\n /** Display layers */\n displayLayers: FBXDisplayLayerData[];\n /** Selection sets */\n selectionSets: FBXSelectionSetData[];\n /** Global settings */\n upAxis: number;\n upAxisSign: number;\n frontAxis: number;\n frontAxisSign: number;\n coordAxis: number;\n coordAxisSign: number;\n unitScaleFactor: number;\n /** Scene frame rate derived from GlobalSettings TimeMode / CustomFrameRate */\n frameRate: number;\n}\n\n/**\n * Interpret a parsed FBX document into scene data.\n */\n/** Options controlling how the document is interpreted. */\nexport interface FBXInterpretOptions {\n /** Segments per knot span when tessellating NURBS surfaces; defaults to the Step stored in the file */\n nurbsSubdivision?: number;\n /** Shift every clip so its first key sits at time 0 (default true); false keeps the authored times */\n rebaseKeyframes?: boolean;\n}\n\n/**\n * Tessellated NURBS vertices carry no control point mapping, so skin clusters and blend shapes bound to the surface\n * cannot be applied; they are reported and the surface is imported undeformed.\n */\nfunction flagNurbsDeformers(objectMap: FBXObjectMap, geometryId: number, geometry: FBXGeometryData): void {\n const kinds = getChildren(objectMap, geometryId, \"Deformer\")\n .map((d) => getPropertyValue<string>(d.node, 2) ?? \"\")\n .filter((kind) => kind === \"Skin\" || kind === \"BlendShape\");\n if (kinds.length === 0) {\n return;\n }\n geometry.diagnostics.push({\n type: \"nurbs-deformer-ignored\",\n message: `${Array.from(new Set(kinds)).join(\" and \")} deformer on NURBS surface '${geometry.name}' is ignored: the tessellated mesh has no control point mapping.`,\n });\n}\n\nexport function interpretFBX(doc: FBXDocument, options: FBXInterpretOptions = {}): FBXSceneData {\n if (isLegacyDocument(doc)) {\n doc = upgradeLegacyDocument(doc);\n }\n const objectMap = resolveConnections(doc);\n const propertyTemplates = extractPropertyTemplates(doc);\n\n // Extract global settings\n const globalSettings = extractGlobalSettings(doc);\n\n // Extract all materials\n const materials: FBXMaterialData[] = [];\n for (const [id, node] of Array.from(objectMap.objects)) {\n if (node.name === \"Material\") {\n materials.push(extractMaterial(node, id, objectMap, propertyTemplates));\n }\n }\n\n attachLegacyLayerTextures(objectMap, materials, propertyTemplates);\n\n // Extract all geometries\n const geometries: FBXGeometryData[] = [];\n const curves: FBXCurveGeometryData[] = [];\n for (const [id, node] of Array.from(objectMap.objects)) {\n if (node.name === \"Geometry\") {\n const subType = getPropertyValue<string>(node, 2);\n if (subType === \"Mesh\") {\n const geometry = extractGeometry(node, id);\n // Edge-only or empty meshes have nothing to render; keep the node but drop the mesh.\n if (geometry.positions.length > 0 && geometry.indices.length > 0) {\n geometries.push(geometry);\n }\n } else if (subType === \"NurbsSurface\") {\n const geometry = nurbsSurfaceToGeometry(node, id, options.nurbsSubdivision);\n if (geometry) {\n flagNurbsDeformers(objectMap, id, geometry);\n geometries.push(geometry);\n }\n } else if (subType === \"TrimNurbsSurface\") {\n // The trimmed surface is rendered untrimmed: the underlying NurbsSurface is a child of the trim.\n const surfaceChild = getChildren(objectMap, id, \"Geometry\").find((child) => getPropertyValue<string>(child.node, 2) === \"NurbsSurface\");\n const geometry = surfaceChild ? nurbsSurfaceToGeometry(surfaceChild.node, id, options.nurbsSubdivision) : null;\n if (geometry) {\n flagNurbsDeformers(objectMap, id, geometry);\n geometry.diagnostics.push({\n type: \"nurbs-trim-ignored\",\n message: `Trim curves of NURBS surface '${geometry.name}' are ignored; the surface is rendered untrimmed.`,\n });\n geometries.push(geometry);\n }\n } else if (subType === \"NurbsCurve\") {\n curves.push(extractNurbsCurveGeometry(node, id));\n } else if (subType === \"Line\") {\n curves.push(extractLineGeometry(node, id));\n }\n }\n }\n\n // Extract skeleton/skinning data\n const skins = extractSkins(objectMap, propertyTemplates);\n const rigs = resolveRigs(objectMap, skins);\n\n // Extract blend shape data\n const blendShapes = extractBlendShapes(objectMap);\n\n // Extract animation data\n const animations = extractAnimations(objectMap, doc, { rebaseKeyframes: options.rebaseKeyframes ?? true });\n\n // Extract cameras and lights from NodeAttribute objects\n const cameras = extractCameras(objectMap, propertyTemplates);\n const lights = extractLights(objectMap, propertyTemplates);\n const diagnostics = extractSceneDiagnostics(objectMap);\n const constraints = extractConstraints(objectMap);\n\n // Build model hierarchy\n const rootModels = buildModelHierarchy(objectMap, geometries, curves, materials, propertyTemplates);\n const { displayLayers, selectionSets } = extractCollections(objectMap, rootModels);\n\n return {\n rootModels,\n displayLayers,\n selectionSets,\n constraints,\n geometries,\n curves,\n materials,\n skins,\n rigs,\n blendShapes,\n animations,\n cameras,\n lights,\n diagnostics,\n ...globalSettings,\n };\n}\n\n// ── Legacy textures ────────────────────────────────────────────────────────────\n\n/**\n * Pre-7000 files connect textures to the Model and select them per polygon through the mesh's LayerElementTexture\n * (TextureId indexes the model's textures), instead of connecting textures to material properties. Assign those\n * textures to the diffuse slot of the material used by the same polygons.\n */\nfunction attachLegacyLayerTextures(objectMap: FBXObjectMap, materials: FBXMaterialData[], templates: FBXPropertyTemplateMap): void {\n const materialById = new Map(materials.map((m) => [m.id, m] as const));\n const textureTemplate = getPropertyTemplate(templates, \"Texture\", \"FbxFileTexture\") ?? getPropertyTemplate(templates, \"Texture\");\n for (const [modelId, modelNode] of Array.from(objectMap.objects)) {\n if (modelNode.name !== \"Model\") {\n continue;\n }\n const textureChildren = getChildren(objectMap, modelId, \"Texture\");\n if (textureChildren.length === 0) {\n continue;\n }\n const modelMaterials = getChildren(objectMap, modelId, \"Material\")\n .filter((c) => !c.propertyName)\n .map((c) => materialById.get(c.id))\n .filter((m): m is FBXMaterialData => m !== undefined);\n if (modelMaterials.length === 0) {\n continue;\n }\n const geometryNode = getChildren(objectMap, modelId, \"Geometry\")[0]?.node ?? modelNode;\n const materialLayer = findChildByName(geometryNode, \"LayerElementMaterial\");\n const materialIds = materialLayer ? getNodeArray(findChildByName(materialLayer, \"Materials\")) : null;\n\n // Each texture kind has its own layer element: LayerElementTexture (diffuse), LayerElementEmissiveTextures,\n // LayerElementSpecularTextures, LayerElementBumpTextures, ...\n const slotForElement = (elementName: string): { prop: string; fbx: keyof FBXMaterialData[\"model\"][\"fbx\"]; pbr: keyof FBXMaterialData[\"model\"][\"pbr\"] } | null => {\n const kind = elementName.replace(/^LayerElement/, \"\").replace(/Textures?$/, \"\");\n switch (kind) {\n case \"\":\n case \"Diffuse\":\n return { prop: \"DiffuseColor\", fbx: \"diffuseColor\", pbr: \"baseColor\" };\n case \"Emissive\":\n return { prop: \"EmissiveColor\", fbx: \"emissionColor\", pbr: \"emissionColor\" };\n case \"Specular\":\n return { prop: \"SpecularColor\", fbx: \"specularColor\", pbr: \"specularColor\" };\n case \"Ambient\":\n return { prop: \"AmbientColor\", fbx: \"ambientColor\", pbr: \"ambientOcclusion\" };\n case \"Bump\":\n case \"NormalMap\":\n return { prop: \"NormalMap\", fbx: \"normalMap\", pbr: \"normalMap\" };\n case \"Transparent\":\n return { prop: \"TransparentColor\", fbx: \"transparencyColor\", pbr: \"opacity\" };\n case \"Reflection\":\n return { prop: \"ReflectionColor\", fbx: \"reflectionColor\", pbr: \"specularColor\" };\n case \"Shininess\":\n return { prop: \"ShininessExponent\", fbx: \"specularExponent\", pbr: \"roughness\" };\n case \"Displacement\":\n return { prop: \"DisplacementColor\", fbx: \"displacement\", pbr: \"displacementMap\" };\n default:\n return null;\n }\n };\n\n const layerElements = geometryNode.children.filter((c) => /^LayerElement\\w*Textures?$/.test(c.name));\n const textureRefs = textureChildren.map(({ id, node }) => extractTextureRef(id, node, undefined, objectMap, textureTemplate));\n const assign = (materialIndex: number, textureIndex: number, slot: NonNullable<ReturnType<typeof slotForElement>>) => {\n const material = modelMaterials[materialIndex];\n const source = textureRefs[textureIndex];\n if (!material || !source || material.textures.some((t) => t.propertyName === slot.prop)) {\n return;\n }\n const ref = { ...source, propertyName: slot.prop };\n material.textures.push(ref);\n const fbxMap = (material.model.fbx[slot.fbx] ??= { valueComponents: 0, textureEnabled: false });\n fbxMap.texture = ref;\n fbxMap.textureEnabled = true;\n const pbrMap = (material.model.pbr[slot.pbr] ??= { valueComponents: 0, textureEnabled: false });\n pbrMap.texture = ref;\n pbrMap.textureEnabled = true;\n };\n\n if (layerElements.length === 0) {\n // No layer element: a single texture on a single-material model is the diffuse map.\n if (modelMaterials.length === 1 && textureRefs.length === 1) {\n assign(0, 0, slotForElement(\"LayerElementTexture\")!);\n }\n continue;\n }\n for (const element of layerElements) {\n const slot = slotForElement(element.name);\n const textureIds = getNodeArray(findChildByName(element, \"TextureId\"));\n if (!slot || !textureIds || textureIds.length === 0) {\n continue;\n }\n const polygonCount = Math.max(textureIds.length, materialIds?.length ?? 0);\n for (let poly = 0; poly < polygonCount; poly++) {\n const texIndex = textureIds[Math.min(poly, textureIds.length - 1)];\n const matIndex = materialIds && materialIds.length > 0 ? materialIds[Math.min(poly, materialIds.length - 1)] : 0;\n if (texIndex >= 0) {\n assign(matIndex, texIndex, slot);\n }\n }\n }\n }\n}\n\n// ── Model Hierarchy ────────────────────────────────────────────────────────────\n\nconst MAX_MODEL_DEPTH = 512;\n\nfunction buildModelHierarchy(\n objectMap: FBXObjectMap,\n geometries: FBXGeometryData[],\n curves: FBXCurveGeometryData[],\n materials: FBXMaterialData[],\n propertyTemplates: FBXPropertyTemplateMap\n): FBXModelData[] {\n const geometryMap = new Map<number, FBXGeometryData>();\n for (const g of geometries) {\n geometryMap.set(g.id, g);\n }\n const curveMap = new Map<number, FBXCurveGeometryData>();\n for (const c of curves) {\n curveMap.set(c.id, c);\n }\n\n const materialMap = new Map<number, FBXMaterialData>();\n for (const m of materials) {\n materialMap.set(m.id, m);\n }\n\n // Find root models (those connected to ID 0, which is the scene root)\n const rootChildren = objectMap.childrenOf.get(0) ?? [];\n const rootModels: FBXModelData[] = [];\n const rootIds = new Set<number>();\n const buildStack = new Set<number>();\n\n for (const { id } of rootChildren) {\n const node = objectMap.objects.get(id);\n if (node && node.name === \"Model\" && !rootIds.has(id)) {\n rootIds.add(id);\n rootModels.push(buildModel(id, node, objectMap, geometryMap, curveMap, materialMap, propertyTemplates, buildStack));\n }\n }\n\n // Models without any Model (or scene root) parent connection also live at the root, as in the FBX SDK.\n // Typical examples are the default \"Producer\" cameras and the camera switcher written by Maya, MotionBuilder\n // and Blender in 6.x files, which are never connected.\n const hasModelParent = new Set<number>();\n for (const conn of objectMap.connections) {\n if (conn.type !== \"OO\") {\n continue;\n }\n const parentNode = objectMap.objects.get(conn.parentId);\n if (conn.parentId === 0 || parentNode?.name === \"Model\") {\n hasModelParent.add(conn.childId);\n }\n }\n for (const [id, node] of Array.from(objectMap.objects)) {\n if (node.name === \"Model\" && !hasModelParent.has(id) && !rootIds.has(id)) {\n rootIds.add(id);\n rootModels.push(buildModel(id, node, objectMap, geometryMap, curveMap, materialMap, propertyTemplates, buildStack));\n }\n }\n\n return rootModels;\n}\n\nfunction buildModel(\n modelId: number,\n modelNode: FBXNode,\n objectMap: FBXObjectMap,\n geometryMap: Map<number, FBXGeometryData>,\n curveMap: Map<number, FBXCurveGeometryData>,\n materialMap: Map<number, FBXMaterialData>,\n propertyTemplates: FBXPropertyTemplateMap,\n buildStack: Set<number>\n): FBXModelData {\n const name = cleanFBXName(getPropertyValue<string>(modelNode, 1) ?? \"Model\");\n buildStack.add(modelId);\n const subType = getPropertyValue<string>(modelNode, 2) ?? \"Null\";\n\n // Find attached geometry\n const geomChildren = getChildren(objectMap, modelId, \"Geometry\");\n const geometry = geomChildren.map((child) => geometryMap.get(child.id)).find((g) => g !== undefined);\n const curve = geomChildren.map((child) => curveMap.get(child.id)).find((c) => c !== undefined);\n\n // Find attached materials\n const matChildren = getChildren(objectMap, modelId, \"Material\");\n const modelMaterials: FBXMaterialData[] = [];\n for (const { id } of matChildren) {\n const mat = materialMap.get(id);\n if (mat) {\n modelMaterials.push(mat);\n }\n }\n\n // Extract transform\n const transform = extractTransform(modelNode, getPropertyTemplate(propertyTemplates, \"Model\", \"FbxNode\") ?? getPropertyTemplate(propertyTemplates, \"Model\"));\n\n // Recursively build child models\n // Only object-object connections express parenting; OP connections (look-at targets, constraint sources) do not.\n const childModelNodes = getChildren(objectMap, modelId, \"Model\").filter((child) => !child.propertyName);\n const children: FBXModelData[] = [];\n const cycleDiagnostics: string[] = [];\n for (const { id, node } of childModelNodes) {\n if (buildStack.size > MAX_MODEL_DEPTH) {\n cycleDiagnostics.push(`Model hierarchy deeper than ${MAX_MODEL_DEPTH} levels; deeper children were skipped.`);\n break;\n }\n if (buildStack.has(id)) {\n // Malformed files (duplicate ids, recursive connections) can make a model its own ancestor.\n cycleDiagnostics.push(`Model connection cycle detected at '${cleanFBXName(getPropertyValue<string>(node, 1) ?? \"\")}'; the recursive child was skipped.`);\n continue;\n }\n children.push(buildModel(id, node, objectMap, geometryMap, curveMap, materialMap, propertyTemplates, buildStack));\n }\n buildStack.delete(modelId);\n\n // Extract culling\n const cullingNode = modelNode.children.find((c) => c.name === \"Culling\");\n const cullingOff = cullingNode ? getPropertyValue<string>(cullingNode, 0) === \"CullingOff\" : false;\n\n // Extract user-defined custom properties\n const customProperties = extractCustomProperties(modelNode);\n\n // LOD groups carry their thresholds on the LodGroup node attribute\n let lodGroup: FBXLodGroupData | undefined;\n if (subType === \"LodGroup\") {\n const attribute = getChildren(objectMap, modelId, \"NodeAttribute\").find((a) => getPropertyValue<string>(a.node, 2) === \"LodGroup\");\n const entries = attribute ? getPropertyEntries(attribute.node) : [];\n const thresholds: number[] = [];\n const displayLevels: number[] = [];\n for (let i = 0; ; i++) {\n const entry = entries.find((e) => e.name === `Thresholds|Level${i}`);\n if (!entry) {\n break;\n }\n thresholds.push(typeof entry.values[0] === \"number\" ? entry.values[0] : 0);\n }\n for (let i = 0; ; i++) {\n const entry = entries.find((e) => e.name === `DisplayLevels|Level${i}`);\n if (!entry) {\n break;\n }\n displayLevels.push(typeof entry.values[0] === \"number\" ? entry.values[0] : 0);\n }\n const relativeEntry = entries.find((e) => e.name === \"ThresholdsUsedAsPercentage\");\n lodGroup = { thresholds, relative: !!relativeEntry && relativeEntry.values[0] !== 0 && relativeEntry.values[0] !== false, displayLevels };\n }\n\n return {\n id: modelId,\n name,\n subType,\n geometry,\n materials: modelMaterials,\n children,\n cullingOff,\n customProperties,\n lodGroup,\n curve,\n ...transform,\n diagnostics: [...transform.diagnostics, ...cycleDiagnostics],\n };\n}\n\n/** Display layers and selection sets: which models belong to which collection. */\nfunction extractCollections(objectMap: FBXObjectMap, rootModels: FBXModelData[]): { displayLayers: FBXDisplayLayerData[]; selectionSets: FBXSelectionSetData[] } {\n const modelById = new Map<number, FBXModelData>();\n const walk = (models: FBXModelData[]) => {\n for (const m of models) {\n modelById.set(m.id, m);\n walk(m.children);\n }\n };\n walk(rootModels);\n\n const displayLayers: FBXDisplayLayerData[] = [];\n const selectionSets: FBXSelectionSetData[] = [];\n for (const [id, node] of Array.from(objectMap.objects)) {\n if (node.name === \"CollectionExclusive\") {\n const entries = getPropertyEntries(node);\n const num = (name: string, fallback: number) => {\n const v = entries.find((e) => e.name === name)?.values[0];\n return typeof v === \"number\" ? v : typeof v === \"boolean\" ? (v ? 1 : 0) : fallback;\n };\n const colorValues = entries.find((e) => e.name === \"Color\")?.values;\n const color: [number, number, number] =\n colorValues && typeof colorValues[0] === \"number\" && typeof colorValues[1] === \"number\" && typeof colorValues[2] === \"number\"\n ? [colorValues[0], colorValues[1], colorValues[2]]\n : [0.8, 0.8, 0.8];\n const layer: FBXDisplayLayerData = {\n id,\n name: cleanFBXName(getPropertyValue<string>(node, 1) ?? \"DisplayLayer\"),\n show: num(\"Show\", 1) !== 0,\n freeze: num(\"Freeze\", 0) !== 0,\n color,\n modelIds: getChildren(objectMap, id, \"Model\").map((c) => c.id),\n };\n displayLayers.push(layer);\n for (const modelId of layer.modelIds) {\n const model = modelById.get(modelId);\n if (model) {\n model.displayLayer = layer;\n }\n }\n } else if (node.name === \"SelectionSet\" || (node.name === \"Collection\" && getPropertyValue<string>(node, 2) === \"SelectionSet\")) {\n const members: FBXSelectionNodeData[] = [];\n for (const child of getChildren(objectMap, id)) {\n if (child.node.name === \"Model\") {\n members.push({ modelId: child.id, includeNode: true });\n } else if (child.node.name === \"SelectionNode\") {\n const indices = (name: string): number[] | undefined => {\n const arrayNode = findChildByName(child.node, name);\n if (!arrayNode) {\n return undefined;\n }\n return Array.from(getNodeArray(arrayNode) as ArrayLike<number>);\n };\n const inSet = findChildByName(child.node, \"IsTheNodeInSet\")?.properties[0]?.value;\n for (const target of getChildren(objectMap, child.id, \"Model\")) {\n members.push({\n modelId: target.id,\n includeNode: inSet === undefined || inSet === 1 || inSet === true,\n vertices: indices(\"VertexIndexArray\"),\n edges: indices(\"EdgeIndexArray\"),\n faces: indices(\"PolygonIndexArray\"),\n });\n }\n }\n }\n selectionSets.push({ id, name: cleanFBXName(getPropertyValue<string>(node, 1) ?? \"SelectionSet\"), members });\n }\n }\n return { displayLayers, selectionSets };\n}\n\nfunction extractTransform(\n modelNode: FBXNode,\n template?: FBXPropertyTemplate\n): {\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 geometricTranslation: [number, number, number];\n geometricRotation: [number, number, number];\n geometricScaling: [number, number, number];\n rotationOrder: number;\n inheritType: number;\n diagnostics: string[];\n} {\n return extractNodeTransform(modelNode, template);\n}\n\n// ── Global Settings ────────────────────────────────────────────────────────────\n\ninterface GlobalSettings {\n upAxis: number;\n upAxisSign: number;\n frontAxis: number;\n frontAxisSign: number;\n coordAxis: number;\n coordAxisSign: number;\n unitScaleFactor: number;\n frameRate: number;\n}\n\n// Frame rates per FBX TimeMode enum value (eDefaultMode, eFrames120, ... eFrames59dot94).\nconst TIME_MODE_FPS = [30, 120, 100, 60, 50, 48, 30, 30, 29.97, 29.97, 25, 24, 1000, 23.976, 24, 96, 72, 59.94];\n\nfunction extractGlobalSettings(doc: FBXDocument): GlobalSettings {\n const defaults: GlobalSettings = {\n upAxis: 1,\n upAxisSign: 1,\n frontAxis: 2,\n frontAxisSign: 1,\n coordAxis: 0,\n coordAxisSign: 1,\n unitScaleFactor: 1,\n frameRate: 30,\n };\n\n const gsNode = findDocumentNode(doc, \"GlobalSettings\");\n if (!gsNode) {\n return defaults;\n }\n\n let timeMode = 0;\n let customFrameRate = 24;\n\n for (const { name: propName, values } of getPropertyEntries(gsNode)) {\n const value = toNumber(values[0]);\n if (propName && value !== undefined) {\n switch (propName) {\n case \"UpAxis\":\n defaults.upAxis = value;\n break;\n case \"UpAxisSign\":\n defaults.upAxisSign = value;\n break;\n case \"FrontAxis\":\n defaults.frontAxis = value;\n break;\n case \"FrontAxisSign\":\n defaults.frontAxisSign = value;\n break;\n case \"CoordAxis\":\n defaults.coordAxis = value;\n break;\n case \"CoordAxisSign\":\n defaults.coordAxisSign = value;\n break;\n case \"UnitScaleFactor\":\n defaults.unitScaleFactor = value;\n break;\n case \"TimeMode\":\n timeMode = value;\n break;\n case \"CustomFrameRate\":\n customFrameRate = value;\n break;\n }\n }\n }\n\n if (timeMode === 14) {\n defaults.frameRate = customFrameRate > 0 ? customFrameRate : 24;\n } else {\n defaults.frameRate = TIME_MODE_FPS[timeMode] ?? 30;\n }\n\n return defaults;\n}\n\n// ── Cameras & Lights ──────────────────────────────────────────────────────────\n\nconst SYSTEM_PROPERTIES = new Set([\n \"Lcl Translation\",\n \"Lcl Rotation\",\n \"Lcl Scaling\",\n \"PreRotation\",\n \"PostRotation\",\n \"RotationPivot\",\n \"ScalingPivot\",\n \"RotationOffset\",\n \"ScalingOffset\",\n \"RotationOrder\",\n \"GeometricTranslation\",\n \"GeometricRotation\",\n \"GeometricScaling\",\n \"Visibility\",\n \"InheritType\",\n \"ScalingMax\",\n \"DefaultAttributeIndex\",\n \"currentUVSet\",\n \"lockInfluenceWeights\",\n]);\n\nfunction extractCustomProperties(modelNode: FBXNode): Record<string, FBXUserPropertyValue> | undefined {\n // Properties flagged \"U\" are user-defined. Some writers (MotionBuilder) flag their own template properties\n // as user properties too, so the well-known node properties are filtered out again.\n const flagged = extractUserProperties(modelNode);\n if (!flagged) {\n return undefined;\n }\n let hasAny = false;\n const custom: Record<string, FBXUserPropertyValue> = {};\n for (const name of Object.keys(flagged)) {\n if (!SYSTEM_PROPERTIES.has(name)) {\n custom[name] = flagged[name];\n hasAny = true;\n }\n }\n return hasAny ? custom : undefined;\n}\n\nconst CAMERA_PROPERTIES = new Set([\n \"FieldOfView\",\n \"FieldOfViewX\",\n \"FieldOfViewY\",\n \"NearPlane\",\n \"FarPlane\",\n \"AspectWidth\",\n \"AspectHeight\",\n \"FilmAspectRatio\",\n \"FocalLength\",\n \"FilmWidth\",\n \"FilmHeight\",\n \"ApertureWidth\",\n \"ApertureHeight\",\n \"CameraProjectionType\",\n \"ProjectionType\",\n \"OrthoZoom\",\n \"Roll\",\n \"ApertureMode\",\n]);\n\nconst LIGHT_PROPERTIES = new Set([\n \"LightType\",\n \"Color\",\n \"Intensity\",\n \"InnerAngle\",\n \"OuterAngle\",\n \"ConeAngle\",\n \"DecayType\",\n \"DecayStart\",\n \"EnableNearAttenuation\",\n \"EnableFarAttenuation\",\n \"CastShadow\",\n \"Shadow\",\n]);\n\nfunction extractCameras(objectMap: FBXObjectMap, templates: FBXPropertyTemplateMap): FBXCameraData[] {\n const cameras: FBXCameraData[] = [];\n const cameraTemplate = getPropertyTemplate(templates, \"NodeAttribute\", \"FbxCamera\") ?? getPropertyTemplate(templates, \"NodeAttribute\");\n\n for (const [id, node] of Array.from(objectMap.objects)) {\n if (node.name !== \"NodeAttribute\") {\n continue;\n }\n const subType = getPropertyValue<string>(node, 2);\n if (subType !== \"Camera\") {\n continue;\n }\n\n // Find the model this camera is attached to (parent)\n const parent = objectMap.parentOf.get(id);\n if (!parent) {\n continue;\n }\n const parentNode = objectMap.objects.get(parent.id);\n if (!parentNode || parentNode.name !== \"Model\") {\n continue;\n }\n\n const name = cleanFBXName(getPropertyValue<string>(parentNode, 1) ?? \"Camera\");\n\n const nearPlane = resolveNumberProperty(node, cameraTemplate, \"NearPlane\", 0.1);\n const farPlane = resolveNumberProperty(node, cameraTemplate, \"FarPlane\", 10000);\n const projectionType =\n resolveNumberProperty(node, cameraTemplate, \"CameraProjectionType\", 0) === 1 || resolveNumberProperty(node, cameraTemplate, \"ProjectionType\", 0) === 1\n ? \"orthographic\"\n : \"perspective\";\n const focalLength = toNumber(resolvePropertyValue(node, cameraTemplate, \"FocalLength\"));\n const filmWidth = toNumber(resolvePropertyValue(node, cameraTemplate, \"FilmWidth\")) ?? toNumber(resolvePropertyValue(node, cameraTemplate, \"ApertureWidth\"));\n const filmHeight = toNumber(resolvePropertyValue(node, cameraTemplate, \"FilmHeight\")) ?? toNumber(resolvePropertyValue(node, cameraTemplate, \"ApertureHeight\"));\n const orthoZoom = toNumber(resolvePropertyValue(node, cameraTemplate, \"OrthoZoom\"));\n const roll = toNumber(resolvePropertyValue(node, cameraTemplate, \"Roll\"));\n const resolved = resolveCameraParameters(node, cameraTemplate);\n const aspectRatio = resolved.aspectRatio;\n const fieldOfView = resolved.fovDegY;\n const diagnostics: string[] = [];\n if (projectionType === \"orthographic\" && orthoZoom === undefined) {\n diagnostics.push(\"Orthographic camera has no OrthoZoom; runtime orthographic bounds use a fallback.\");\n }\n if (focalLength !== undefined && filmHeight === undefined && resolvePropertyValue(node, cameraTemplate, \"FieldOfView\") === undefined) {\n diagnostics.push(\"FocalLength is present without FilmHeight; default field of view fallback may be used.\");\n }\n\n cameras.push({\n modelId: parent.id,\n attributeId: id,\n userProperties: extractUserProperties(node),\n name,\n fieldOfView,\n fieldOfViewX: resolved.fovDegX,\n apertureMode: resolved.apertureMode,\n apertureSizeInch: resolved.apertureSizeInch,\n orthographicSize: resolved.orthographicSize,\n nearPlane,\n farPlane,\n aspectRatio,\n projectionType,\n focalLength,\n filmWidth,\n filmHeight,\n orthoZoom,\n roll,\n unknownProperties: collectUnknownLocalProperties(node, CAMERA_PROPERTIES),\n diagnostics,\n });\n }\n\n return cameras;\n}\n\nfunction extractLights(objectMap: FBXObjectMap, templates: FBXPropertyTemplateMap): FBXLightData[] {\n const lights: FBXLightData[] = [];\n const lightTemplate = getPropertyTemplate(templates, \"NodeAttribute\", \"FbxLight\") ?? getPropertyTemplate(templates, \"NodeAttribute\");\n\n for (const [id, node] of Array.from(objectMap.objects)) {\n if (node.name !== \"NodeAttribute\") {\n continue;\n }\n const subType = getPropertyValue<string>(node, 2);\n if (subType !== \"Light\") {\n continue;\n }\n\n // Find the model this light is attached to\n const parent = objectMap.parentOf.get(id);\n if (!parent) {\n continue;\n }\n const parentNode = objectMap.objects.get(parent.id);\n if (!parentNode || parentNode.name !== \"Model\") {\n continue;\n }\n\n const name = cleanFBXName(getPropertyValue<string>(parentNode, 1) ?? \"Light\");\n\n const lightType = resolveNumberProperty(node, lightTemplate, \"LightType\", 0);\n const color = resolveVector3Property(node, lightTemplate, \"Color\", [1, 1, 1]);\n const intensity = resolveNumberProperty(node, lightTemplate, \"Intensity\", 100) / 100;\n const outerAngle = toNumber(resolvePropertyValue(node, lightTemplate, \"OuterAngle\")) ?? toNumber(resolvePropertyValue(node, lightTemplate, \"ConeAngle\"));\n const innerAngle = toNumber(resolvePropertyValue(node, lightTemplate, \"InnerAngle\"));\n const coneAngle = outerAngle ?? 45;\n const decayType = resolveNumberProperty(node, lightTemplate, \"DecayType\", 2);\n const decayStart = toNumber(resolvePropertyValue(node, lightTemplate, \"DecayStart\"));\n const enableNearAttenuation = toBoolean(resolvePropertyValue(node, lightTemplate, \"EnableNearAttenuation\"));\n const enableFarAttenuation = toBoolean(resolvePropertyValue(node, lightTemplate, \"EnableFarAttenuation\"));\n const castShadows =\n toBoolean(resolvePropertyValue(node, lightTemplate, \"CastShadow\")) ??\n toBoolean(resolvePropertyValue(parentNode, undefined, \"CastShadow\")) ??\n toBoolean(resolvePropertyValue(parentNode, undefined, \"Shadow\"));\n const diagnostics: string[] = [];\n if (decayType !== 2) {\n diagnostics.push(`DecayType ${decayType} is preserved as metadata; Babylon falloff is not remapped in this pass.`);\n }\n if (decayStart !== undefined) {\n diagnostics.push(\"DecayStart is preserved as metadata and is not mapped to Babylon light range.\");\n }\n\n lights.push({\n modelId: parent.id,\n attributeId: id,\n userProperties: extractUserProperties(node),\n nearAttenuationStart: toNumber(resolvePropertyValue(node, lightTemplate, \"NearAttenuationStart\")),\n nearAttenuationEnd: toNumber(resolvePropertyValue(node, lightTemplate, \"NearAttenuationEnd\")),\n farAttenuationStart: toNumber(resolvePropertyValue(node, lightTemplate, \"FarAttenuationStart\")),\n farAttenuationEnd: toNumber(resolvePropertyValue(node, lightTemplate, \"FarAttenuationEnd\")),\n areaLightShape: toNumber(resolvePropertyValue(node, lightTemplate, \"AreaLightShape\")),\n name,\n lightType,\n color,\n intensity,\n coneAngle,\n decayType,\n innerAngle,\n outerAngle,\n decayStart,\n enableNearAttenuation,\n enableFarAttenuation,\n castShadows,\n unknownProperties: collectUnknownLocalProperties(node, LIGHT_PROPERTIES),\n diagnostics,\n });\n }\n\n return lights;\n}\n\n// ── Utilities ──────────────────────────────────────────────────────────────────\n\nfunction toNumber(value: unknown): number | undefined {\n if (typeof value === \"number\") {\n return value;\n }\n return undefined;\n}\n\nfunction toBoolean(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value !== 0;\n }\n return undefined;\n}\n\n/** Film back sizes in thousandths of an inch per FBX ApertureFormat enum value. */\nconst APERTURE_FORMATS: [number, number][] = [\n [1000, 1000],\n [404, 295],\n [493, 292],\n [864, 630],\n [816, 612],\n [980, 735],\n [825, 446],\n [864, 732],\n [2066, 906],\n [1485, 991],\n [2080, 1480],\n [2772, 2072],\n];\n\n/**\n * Resolves the camera's projection parameters the way the FBX SDK does: aspect ratio from AspectWidth/Height and\n * the aspect mode, aperture (film gate) from the film size, squeeze ratio and gate fit, and the horizontal and\n * vertical field of view from the aperture mode (horizontal, vertical, both, or focal length).\n */\nfunction resolveCameraParameters(\n node: FBXNode,\n template?: FBXPropertyTemplate\n): { fovDegX: number; fovDegY: number; aspectRatio: number; apertureMode: number; apertureSizeInch: [number, number]; orthographicSize: [number, number] } {\n const num = (name: string, fallback: number) => toNumber(resolvePropertyValue(node, template, name)) ?? fallback;\n const aspectMode = num(\"AspectRatioMode\", 0);\n const apertureMode = num(\"ApertureMode\", 2);\n const apertureFormat = Math.max(0, Math.min(APERTURE_FORMATS.length - 1, Math.round(num(\"ApertureFormat\", 0))));\n const gateFit = num(\"GateFit\", 0);\n let aspectX = num(\"AspectW\", 0);\n let aspectY = num(\"AspectH\", 0);\n aspectX = num(\"AspectWidth\", aspectX);\n aspectY = num(\"AspectHeight\", aspectY);\n const fov = num(\"FieldOfView\", 0);\n const fovX = num(\"FieldOfViewX\", 0);\n const fovY = num(\"FieldOfViewY\", 0);\n const focalLength = num(\"FocalLength\", 0);\n const orthoExtent = 30 * num(\"OrthoZoom\", 1);\n const format = APERTURE_FORMATS[apertureFormat];\n let filmX = num(\"FilmWidth\", format[0] * 0.001);\n let filmY = num(\"FilmHeight\", format[1] * 0.001);\n const squeeze = num(\"FilmSqueezeRatio\", apertureFormat === 7 ? 2 : 1);\n\n if (aspectX <= 0 && aspectY <= 0) {\n aspectX = filmX > 0 ? filmX : 1;\n aspectY = filmY > 0 ? filmY : 1;\n } else if (aspectX <= 0) {\n aspectX = filmX > 0 && filmY > 0 ? (aspectY / filmY) * filmX : aspectY;\n } else if (aspectY <= 0) {\n aspectY = filmX > 0 && filmY > 0 ? (aspectX / filmX) * filmY : aspectX;\n }\n filmY *= squeeze;\n\n let resX = aspectX;\n let resY = aspectY;\n switch (aspectMode) {\n case 3: // fixed width\n resX = aspectX;\n resY = aspectX * aspectY;\n break;\n case 4: // fixed height\n resX = aspectY * aspectX;\n resY = aspectY;\n break;\n default:\n break;\n }\n const aspectRatio = resY !== 0 ? resX / resY : 1;\n const filmRatio = filmY !== 0 ? filmX / filmY : 1;\n\n let effectiveFit = gateFit;\n if (effectiveFit === 3) {\n effectiveFit = aspectRatio > filmRatio ? 2 : 1;\n } else if (effectiveFit === 4) {\n effectiveFit = aspectRatio < filmRatio ? 2 : 1;\n }\n let apertureX = filmX;\n let apertureY = filmY;\n let orthoX = orthoExtent;\n let orthoY = orthoExtent;\n switch (effectiveFit) {\n case 1: // vertical\n apertureX = filmY * aspectRatio;\n apertureY = filmY;\n orthoX = orthoExtent * aspectRatio;\n break;\n case 2: // horizontal\n apertureX = filmX;\n apertureY = filmX / aspectRatio;\n orthoY = orthoExtent / aspectRatio;\n break;\n default:\n break;\n }\n filmX = apertureX;\n void filmX;\n\n const d2r = Math.PI / 180;\n const r2d = 180 / Math.PI;\n let tanX: number;\n let tanY: number;\n switch (apertureMode) {\n case 0:\n tanX = Math.tan(fovX * d2r * 0.5);\n tanY = Math.tan(fovY * d2r * 0.5);\n break;\n case 1:\n tanX = Math.tan(fov * d2r * 0.5);\n tanY = tanX / aspectRatio;\n break;\n case 3: {\n const focalInch = focalLength / 25.4;\n tanX = focalInch > 0 ? (apertureX / focalInch) * 0.5 : Math.tan(fov * d2r * 0.5) * aspectRatio;\n tanY = focalInch > 0 ? (apertureY / focalInch) * 0.5 : Math.tan(fov * d2r * 0.5);\n break;\n }\n default:\n tanY = Math.tan(fov * d2r * 0.5);\n tanX = tanY * aspectRatio;\n break;\n }\n return {\n fovDegX: Math.atan(tanX) * r2d * 2,\n fovDegY: Math.atan(tanY) * r2d * 2,\n aspectRatio,\n apertureMode,\n apertureSizeInch: [apertureX, apertureY],\n orthographicSize: [orthoX, orthoY],\n };\n}\n\nfunction collectUnknownLocalProperties(node: FBXNode, known: Set<string>): string[] {\n const unknown = new Set<string>();\n for (const containerName of [\"Properties70\", \"Properties60\"]) {\n const container = findChildByName(node, containerName);\n for (const propertyNode of container?.children ?? []) {\n if (propertyNode.name !== \"P\" && propertyNode.name !== \"Property\") {\n continue;\n }\n const propertyName = getPropertyValue<string>(propertyNode, 0);\n if (propertyName && !known.has(propertyName)) {\n unknown.add(propertyName);\n }\n }\n }\n return Array.from(unknown).sort();\n}\n"]}
|
|
@@ -9,7 +9,7 @@ export interface FBXUVSet {
|
|
|
9
9
|
/** Recoverable geometry import issue. */
|
|
10
10
|
export interface FBXGeometryDiagnostic {
|
|
11
11
|
/** Diagnostic category. */
|
|
12
|
-
type: "degenerate-polygon" | "triangulation-fallback" | "layer-index-out-of-bounds" | "layer-data-too-short";
|
|
12
|
+
type: "degenerate-polygon" | "triangulation-fallback" | "layer-index-out-of-bounds" | "layer-data-too-short" | "nurbs-invalid" | "nurbs-trim-ignored" | "nurbs-deformer-ignored";
|
|
13
13
|
/** Human-readable diagnostic message. */
|
|
14
14
|
message: string;
|
|
15
15
|
/** Polygon index associated with the diagnostic, if applicable. */
|