@babylonjs/serializers 6.6.0 → 6.7.0
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/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.d.ts +2 -2
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_lights_punctual.d.ts +1 -1
- package/glTF/2.0/Extensions/KHR_lights_punctual.js +48 -72
- package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -1
- package/glTF/2.0/glTFAnimation.d.ts +4 -16
- package/glTF/2.0/glTFAnimation.js +38 -132
- package/glTF/2.0/glTFAnimation.js.map +1 -1
- package/glTF/2.0/glTFExporter.d.ts +6 -50
- package/glTF/2.0/glTFExporter.js +135 -212
- package/glTF/2.0/glTFExporter.js.map +1 -1
- package/glTF/2.0/glTFExporterExtension.d.ts +2 -2
- package/glTF/2.0/glTFExporterExtension.js.map +1 -1
- package/glTF/2.0/glTFSerializer.d.ts +9 -4
- package/glTF/2.0/glTFSerializer.js.map +1 -1
- package/glTF/2.0/glTFUtilities.d.ts +2 -56
- package/glTF/2.0/glTFUtilities.js +1 -81
- package/glTF/2.0/glTFUtilities.js.map +1 -1
- package/package.json +3 -3
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"glTFAnimation.js","sourceRoot":"","sources":["../../../../../lts/serializers/generated/glTF/2.0/glTFAnimation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IAnimation, INode, IBufferView, IAccessor, IAnimationSampler, IAnimationChannel } from \"babylonjs-gltf2interface\";\r\nimport { AnimationSamplerInterpolation, AnimationChannelTargetPath, AccessorType, AccessorComponentType } from \"babylonjs-gltf2interface\";\r\nimport type { Node } from \"core/node\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { Vector3, Quaternion } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { Animation } from \"core/Animations/animation\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { Scene } from \"core/scene\";\r\nimport { MorphTarget } from \"core/Morph/morphTarget\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\n\r\nimport type { _BinaryWriter } from \"./glTFExporter\";\r\nimport { _GLTFUtilities } from \"./glTFUtilities\";\r\nimport type { IAnimationKey } from \"core/Animations/animationKey\";\r\nimport { AnimationKeyInterpolation } from \"core/Animations/animationKey\";\r\n\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { Light } from \"core/Lights/light\";\r\n\r\n/**\r\n * @internal\r\n * Interface to store animation data.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface _IAnimationData {\r\n /**\r\n * Keyframe data.\r\n */\r\n inputs: number[];\r\n /**\r\n * Value data.\r\n */\r\n outputs: number[][];\r\n /**\r\n * Animation interpolation data.\r\n */\r\n samplerInterpolation: AnimationSamplerInterpolation;\r\n /**\r\n * Minimum keyframe value.\r\n */\r\n inputsMin: number;\r\n /**\r\n * Maximum keyframe value.\r\n */\r\n inputsMax: number;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface _IAnimationInfo {\r\n /**\r\n * The target channel for the animation\r\n */\r\n animationChannelTargetPath: AnimationChannelTargetPath;\r\n /**\r\n * The glTF accessor type for the data.\r\n */\r\n dataAccessorType: AccessorType.VEC3 | AccessorType.VEC4 | AccessorType.SCALAR;\r\n /**\r\n * Specifies if quaternions should be used.\r\n */\r\n useQuaternion: boolean;\r\n}\r\n\r\n/**\r\n * @internal\r\n * Enum for handling in tangent and out tangent.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nenum _TangentType {\r\n /**\r\n * Specifies that input tangents are used.\r\n */\r\n INTANGENT,\r\n /**\r\n * Specifies that output tangents are used.\r\n */\r\n OUTTANGENT,\r\n}\r\n\r\n/**\r\n * @internal\r\n * Utility class for generating glTF animation data from BabylonJS.\r\n */\r\nexport class _GLTFAnimation {\r\n /**\r\n * Determine if a node is transformable - ie has properties it should be part of animation of transformation.\r\n * @param babylonNode the node to test\r\n * @returns true if can be animated, false otherwise. False if the parameter is null or undefined.\r\n */\r\n private static _IsTransformable(babylonNode: Node): boolean {\r\n return babylonNode && (babylonNode instanceof TransformNode || babylonNode instanceof Camera || babylonNode instanceof Light);\r\n }\r\n\r\n /**\r\n * @ignore\r\n *\r\n * Creates glTF channel animation from BabylonJS animation.\r\n * @param babylonTransformNode - BabylonJS mesh.\r\n * @param animation - animation.\r\n * @param animationChannelTargetPath - The target animation channel.\r\n * @param convertToRightHandedSystem - Specifies if the values should be converted to right-handed.\r\n * @param useQuaternion - Specifies if quaternions are used.\r\n * @returns nullable IAnimationData\r\n */\r\n public static _CreateNodeAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean,\r\n animationSampleRate: number\r\n ): Nullable<_IAnimationData> {\r\n if (this._IsTransformable(babylonTransformNode)) {\r\n const inputs: number[] = [];\r\n const outputs: number[][] = [];\r\n const keyFrames = animation.getKeys();\r\n const minMaxKeyFrames = _GLTFAnimation._CalculateMinMaxKeyFrames(keyFrames);\r\n const interpolationOrBake = _GLTFAnimation._DeduceInterpolation(keyFrames, animationChannelTargetPath, useQuaternion);\r\n const frameDelta = minMaxKeyFrames.max - minMaxKeyFrames.min;\r\n\r\n const interpolation = interpolationOrBake.interpolationType;\r\n const shouldBakeAnimation = interpolationOrBake.shouldBakeAnimation;\r\n\r\n if (shouldBakeAnimation) {\r\n _GLTFAnimation._CreateBakedAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n minMaxKeyFrames.min,\r\n minMaxKeyFrames.max,\r\n animation.framePerSecond,\r\n animationSampleRate,\r\n inputs,\r\n outputs,\r\n minMaxKeyFrames,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\r\n } else {\r\n if (interpolation === AnimationSamplerInterpolation.LINEAR || interpolation === AnimationSamplerInterpolation.STEP) {\r\n _GLTFAnimation._CreateLinearOrStepAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n frameDelta,\r\n inputs,\r\n outputs,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\r\n } else if (interpolation === AnimationSamplerInterpolation.CUBICSPLINE) {\r\n _GLTFAnimation._CreateCubicSplineAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n frameDelta,\r\n inputs,\r\n outputs,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\r\n } else {\r\n _GLTFAnimation._CreateBakedAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n minMaxKeyFrames.min,\r\n minMaxKeyFrames.max,\r\n animation.framePerSecond,\r\n animationSampleRate,\r\n inputs,\r\n outputs,\r\n minMaxKeyFrames,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\r\n }\r\n }\r\n\r\n if (inputs.length && outputs.length) {\r\n const result: _IAnimationData = {\r\n inputs: inputs,\r\n outputs: outputs,\r\n samplerInterpolation: interpolation,\r\n inputsMin: shouldBakeAnimation ? minMaxKeyFrames.min : Tools.FloatRound(minMaxKeyFrames.min / animation.framePerSecond),\r\n inputsMax: shouldBakeAnimation ? minMaxKeyFrames.max : Tools.FloatRound(minMaxKeyFrames.max / animation.framePerSecond),\r\n };\r\n\r\n return result;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private static _DeduceAnimationInfo(animation: Animation): Nullable<_IAnimationInfo> {\r\n let animationChannelTargetPath: Nullable<AnimationChannelTargetPath> = null;\r\n let dataAccessorType = AccessorType.VEC3;\r\n let useQuaternion: boolean = false;\r\n const property = animation.targetProperty.split(\".\");\r\n switch (property[0]) {\r\n case \"scaling\": {\r\n animationChannelTargetPath = AnimationChannelTargetPath.SCALE;\r\n break;\r\n }\r\n case \"position\": {\r\n animationChannelTargetPath = AnimationChannelTargetPath.TRANSLATION;\r\n break;\r\n }\r\n case \"rotation\": {\r\n dataAccessorType = AccessorType.VEC4;\r\n animationChannelTargetPath = AnimationChannelTargetPath.ROTATION;\r\n break;\r\n }\r\n case \"rotationQuaternion\": {\r\n dataAccessorType = AccessorType.VEC4;\r\n useQuaternion = true;\r\n animationChannelTargetPath = AnimationChannelTargetPath.ROTATION;\r\n break;\r\n }\r\n case \"influence\": {\r\n dataAccessorType = AccessorType.SCALAR;\r\n animationChannelTargetPath = AnimationChannelTargetPath.WEIGHTS;\r\n break;\r\n }\r\n default: {\r\n Tools.Error(`Unsupported animatable property ${property[0]}`);\r\n }\r\n }\r\n if (animationChannelTargetPath) {\r\n return { animationChannelTargetPath: animationChannelTargetPath, dataAccessorType: dataAccessorType, useQuaternion: useQuaternion };\r\n } else {\r\n Tools.Error(\"animation channel target path and data accessor type could be deduced\");\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * @ignore\r\n * Create node animations from the transform node animations\r\n * @param babylonNode\r\n * @param runtimeGLTFAnimation\r\n * @param idleGLTFAnimations\r\n * @param nodeMap\r\n * @param nodes\r\n * @param binaryWriter\r\n * @param bufferViews\r\n * @param accessors\r\n * @param convertToRightHandedSystem\r\n * @param animationSampleRate\r\n */\r\n public static _CreateNodeAnimationFromNodeAnimations(\r\n babylonNode: Node,\r\n runtimeGLTFAnimation: IAnimation,\r\n idleGLTFAnimations: IAnimation[],\r\n nodeMap: { [key: number]: number },\r\n nodes: INode[],\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n convertToRightHandedSystem: boolean,\r\n animationSampleRate: number,\r\n shouldExportAnimation?: (animation: Animation) => boolean\r\n ) {\r\n let glTFAnimation: IAnimation;\r\n if (_GLTFAnimation._IsTransformable(babylonNode)) {\r\n if (babylonNode.animations) {\r\n for (const animation of babylonNode.animations) {\r\n if (shouldExportAnimation && !shouldExportAnimation(animation)) {\r\n continue;\r\n }\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(animation);\r\n if (animationInfo) {\r\n glTFAnimation = {\r\n name: animation.name,\r\n samplers: [],\r\n channels: [],\r\n };\r\n _GLTFAnimation._AddAnimation(\r\n `${animation.name}`,\r\n animation.hasRunningRuntimeAnimations ? runtimeGLTFAnimation : glTFAnimation,\r\n babylonNode,\r\n animation,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n binaryWriter,\r\n bufferViews,\r\n accessors,\r\n convertToRightHandedSystem,\r\n animationInfo.useQuaternion,\r\n animationSampleRate\r\n );\r\n if (glTFAnimation.samplers.length && glTFAnimation.channels.length) {\r\n idleGLTFAnimations.push(glTFAnimation);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @ignore\r\n * Create individual morph animations from the mesh's morph target animation tracks\r\n * @param babylonNode\r\n * @param runtimeGLTFAnimation\r\n * @param idleGLTFAnimations\r\n * @param nodeMap\r\n * @param nodes\r\n * @param binaryWriter\r\n * @param bufferViews\r\n * @param accessors\r\n * @param convertToRightHandedSystem\r\n * @param animationSampleRate\r\n */\r\n public static _CreateMorphTargetAnimationFromMorphTargetAnimations(\r\n babylonNode: Node,\r\n runtimeGLTFAnimation: IAnimation,\r\n idleGLTFAnimations: IAnimation[],\r\n nodeMap: { [key: number]: number },\r\n nodes: INode[],\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n convertToRightHandedSystem: boolean,\r\n animationSampleRate: number,\r\n shouldExportAnimation?: (animation: Animation) => boolean\r\n ) {\r\n let glTFAnimation: IAnimation;\r\n if (babylonNode instanceof Mesh) {\r\n const morphTargetManager = babylonNode.morphTargetManager;\r\n if (morphTargetManager) {\r\n for (let i = 0; i < morphTargetManager.numTargets; ++i) {\r\n const morphTarget = morphTargetManager.getTarget(i);\r\n for (const animation of morphTarget.animations) {\r\n if (shouldExportAnimation && !shouldExportAnimation(animation)) {\r\n continue;\r\n }\r\n const combinedAnimation = new Animation(\r\n `${animation.name}`,\r\n \"influence\",\r\n animation.framePerSecond,\r\n animation.dataType,\r\n animation.loopMode,\r\n animation.enableBlending\r\n );\r\n const combinedAnimationKeys: IAnimationKey[] = [];\r\n const animationKeys = animation.getKeys();\r\n\r\n for (let j = 0; j < animationKeys.length; ++j) {\r\n const animationKey = animationKeys[j];\r\n for (let k = 0; k < morphTargetManager.numTargets; ++k) {\r\n if (k == i) {\r\n combinedAnimationKeys.push(animationKey);\r\n } else {\r\n combinedAnimationKeys.push({ frame: animationKey.frame, value: 0 });\r\n }\r\n }\r\n }\r\n combinedAnimation.setKeys(combinedAnimationKeys);\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(combinedAnimation);\r\n if (animationInfo) {\r\n glTFAnimation = {\r\n name: combinedAnimation.name,\r\n samplers: [],\r\n channels: [],\r\n };\r\n _GLTFAnimation._AddAnimation(\r\n animation.name,\r\n animation.hasRunningRuntimeAnimations ? runtimeGLTFAnimation : glTFAnimation,\r\n babylonNode,\r\n combinedAnimation,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n binaryWriter,\r\n bufferViews,\r\n accessors,\r\n convertToRightHandedSystem,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\r\n morphTargetManager.numTargets\r\n );\r\n if (glTFAnimation.samplers.length && glTFAnimation.channels.length) {\r\n idleGLTFAnimations.push(glTFAnimation);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @ignore\r\n * Create node and morph animations from the animation groups\r\n * @param babylonScene\r\n * @param glTFAnimations\r\n * @param nodeMap\r\n * @param nodes\r\n * @param binaryWriter\r\n * @param bufferViews\r\n * @param accessors\r\n * @param convertToRightHandedSystemMap\r\n * @param animationSampleRate\r\n */\r\n public static _CreateNodeAndMorphAnimationFromAnimationGroups(\r\n babylonScene: Scene,\r\n glTFAnimations: IAnimation[],\r\n nodeMap: { [key: number]: number },\r\n nodes: INode[],\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n convertToRightHandedSystemMap: { [nodeId: number]: boolean },\r\n animationSampleRate: number,\r\n shouldExportAnimation?: (animation: Animation) => boolean\r\n ) {\r\n let glTFAnimation: IAnimation;\r\n if (babylonScene.animationGroups) {\r\n const animationGroups = babylonScene.animationGroups;\r\n for (const animationGroup of animationGroups) {\r\n const morphAnimations: Map<Mesh, Map<MorphTarget, Animation>> = new Map();\r\n const sampleAnimations: Map<Mesh, Animation> = new Map();\r\n const morphAnimationMeshes: Set<Mesh> = new Set();\r\n const animationGroupFrameDiff = animationGroup.to - animationGroup.from;\r\n glTFAnimation = {\r\n name: animationGroup.name,\r\n channels: [],\r\n samplers: [],\r\n };\r\n for (let i = 0; i < animationGroup.targetedAnimations.length; ++i) {\r\n const targetAnimation = animationGroup.targetedAnimations[i];\r\n const target = targetAnimation.target;\r\n const animation = targetAnimation.animation;\r\n if (shouldExportAnimation && !shouldExportAnimation(animation)) {\r\n continue;\r\n }\r\n if (this._IsTransformable(target) || (target.length === 1 && this._IsTransformable(target[0]))) {\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(targetAnimation.animation);\r\n if (animationInfo) {\r\n const babylonTransformNode = this._IsTransformable(target) ? target : this._IsTransformable(target[0]) ? target[0] : null;\r\n if (babylonTransformNode) {\r\n const convertToRightHandedSystem = convertToRightHandedSystemMap[babylonTransformNode.uniqueId];\r\n _GLTFAnimation._AddAnimation(\r\n `${animation.name}`,\r\n glTFAnimation,\r\n babylonTransformNode,\r\n animation,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n binaryWriter,\r\n bufferViews,\r\n accessors,\r\n convertToRightHandedSystem,\r\n animationInfo.useQuaternion,\r\n animationSampleRate\r\n );\r\n }\r\n }\r\n } else if (target instanceof MorphTarget || (target.length === 1 && target[0] instanceof MorphTarget)) {\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(targetAnimation.animation);\r\n if (animationInfo) {\r\n const babylonMorphTarget = target instanceof MorphTarget ? (target as MorphTarget) : (target[0] as MorphTarget);\r\n if (babylonMorphTarget) {\r\n const babylonMorphTargetManager = babylonScene.morphTargetManagers.find((morphTargetManager) => {\r\n for (let j = 0; j < morphTargetManager.numTargets; ++j) {\r\n if (morphTargetManager.getTarget(j) === babylonMorphTarget) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n if (babylonMorphTargetManager) {\r\n const babylonMesh = babylonScene.meshes.find((mesh) => {\r\n return (mesh as Mesh).morphTargetManager === babylonMorphTargetManager;\r\n }) as Mesh;\r\n if (babylonMesh) {\r\n if (!morphAnimations.has(babylonMesh)) {\r\n morphAnimations.set(babylonMesh, new Map());\r\n }\r\n morphAnimations.get(babylonMesh)?.set(babylonMorphTarget, animation);\r\n morphAnimationMeshes.add(babylonMesh);\r\n sampleAnimations.set(babylonMesh, animation);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // this is the place for the KHR_animation_pointer.\r\n }\r\n }\r\n morphAnimationMeshes.forEach((mesh) => {\r\n const morphTargetManager = mesh.morphTargetManager!;\r\n let combinedAnimationGroup: Nullable<Animation> = null;\r\n const animationKeys: IAnimationKey[] = [];\r\n const sampleAnimation = sampleAnimations.get(mesh)!;\r\n const sampleAnimationKeys = sampleAnimation.getKeys();\r\n const numAnimationKeys = sampleAnimationKeys.length;\r\n /*\r\n Due to how glTF expects morph target animation data to be formatted, we need to rearrange the individual morph target animation tracks,\r\n such that we have a single animation, where a given keyframe input value has successive output values for each morph target belonging to the manager.\r\n See: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\r\n\r\n We do this via constructing a new Animation track, and interleaving the frames of each morph target animation track in the current Animation Group\r\n We reuse the Babylon Animation data structure for ease of handling export of cubic spline animation keys, and to reuse the\r\n existing _GLTFAnimation.AddAnimation codepath with minimal modification, however the constructed Babylon Animation is NOT intended for use in-engine.\r\n */\r\n for (let i = 0; i < numAnimationKeys; ++i) {\r\n for (let j = 0; j < morphTargetManager.numTargets; ++j) {\r\n const morphTarget = morphTargetManager.getTarget(j);\r\n const animationsByMorphTarget = morphAnimations.get(mesh);\r\n if (animationsByMorphTarget) {\r\n const morphTargetAnimation = animationsByMorphTarget.get(morphTarget);\r\n if (morphTargetAnimation) {\r\n if (!combinedAnimationGroup) {\r\n combinedAnimationGroup = new Animation(\r\n `${animationGroup.name}_${mesh.name}_MorphWeightAnimation`,\r\n \"influence\",\r\n morphTargetAnimation.framePerSecond,\r\n Animation.ANIMATIONTYPE_FLOAT,\r\n morphTargetAnimation.loopMode,\r\n morphTargetAnimation.enableBlending\r\n );\r\n }\r\n animationKeys.push(morphTargetAnimation.getKeys()[i]);\r\n } else {\r\n animationKeys.push({\r\n frame: animationGroup.from + (animationGroupFrameDiff / numAnimationKeys) * i,\r\n value: morphTarget.influence,\r\n inTangent: sampleAnimationKeys[0].inTangent ? 0 : undefined,\r\n outTangent: sampleAnimationKeys[0].outTangent ? 0 : undefined,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n combinedAnimationGroup!.setKeys(animationKeys);\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(combinedAnimationGroup!);\r\n if (animationInfo) {\r\n _GLTFAnimation._AddAnimation(\r\n `${animationGroup.name}_${mesh.name}_MorphWeightAnimation`,\r\n glTFAnimation,\r\n mesh,\r\n combinedAnimationGroup!,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n binaryWriter,\r\n bufferViews,\r\n accessors,\r\n false,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\r\n morphTargetManager?.numTargets\r\n );\r\n }\r\n });\r\n if (glTFAnimation.channels.length && glTFAnimation.samplers.length) {\r\n glTFAnimations.push(glTFAnimation);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private static _AddAnimation(\r\n name: string,\r\n glTFAnimation: IAnimation,\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n dataAccessorType: AccessorType,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n nodeMap: { [key: number]: number },\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean,\r\n animationSampleRate: number,\r\n morphAnimationChannels?: number\r\n ) {\r\n const animationData = _GLTFAnimation._CreateNodeAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n convertToRightHandedSystem,\r\n useQuaternion,\r\n animationSampleRate\r\n );\r\n let bufferView: IBufferView;\r\n let accessor: IAccessor;\r\n let keyframeAccessorIndex: number;\r\n let dataAccessorIndex: number;\r\n let outputLength: number;\r\n let animationSampler: IAnimationSampler;\r\n let animationChannel: IAnimationChannel;\r\n\r\n if (animationData) {\r\n /*\r\n * Now that we have the glTF converted morph target animation data,\r\n * we can remove redundant input data so that we have n input frames,\r\n * and morphAnimationChannels * n output frames\r\n */\r\n if (morphAnimationChannels) {\r\n let index = 0;\r\n let currentInput: number = 0;\r\n const newInputs: number[] = [];\r\n while (animationData.inputs.length > 0) {\r\n currentInput = animationData.inputs.shift()!;\r\n if (index % morphAnimationChannels == 0) {\r\n newInputs.push(currentInput);\r\n }\r\n index++;\r\n }\r\n animationData.inputs = newInputs;\r\n }\r\n\r\n const nodeIndex = nodeMap[babylonTransformNode.uniqueId];\r\n\r\n // Creates buffer view and accessor for key frames.\r\n let byteLength = animationData.inputs.length * 4;\r\n bufferView = _GLTFUtilities._CreateBufferView(0, binaryWriter.getByteOffset(), byteLength, undefined, `${name} keyframe data view`);\r\n bufferViews.push(bufferView);\r\n animationData.inputs.forEach(function (input) {\r\n binaryWriter.setFloat32(input);\r\n });\r\n\r\n accessor = _GLTFUtilities._CreateAccessor(\r\n bufferViews.length - 1,\r\n `${name} keyframes`,\r\n AccessorType.SCALAR,\r\n AccessorComponentType.FLOAT,\r\n animationData.inputs.length,\r\n null,\r\n [animationData.inputsMin],\r\n [animationData.inputsMax]\r\n );\r\n accessors.push(accessor);\r\n keyframeAccessorIndex = accessors.length - 1;\r\n\r\n // create bufferview and accessor for keyed values.\r\n outputLength = animationData.outputs.length;\r\n byteLength = _GLTFUtilities._GetDataAccessorElementCount(dataAccessorType) * 4 * animationData.outputs.length;\r\n\r\n // check for in and out tangents\r\n bufferView = _GLTFUtilities._CreateBufferView(0, binaryWriter.getByteOffset(), byteLength, undefined, `${name} data view`);\r\n bufferViews.push(bufferView);\r\n\r\n animationData.outputs.forEach(function (output) {\r\n output.forEach(function (entry) {\r\n binaryWriter.setFloat32(entry);\r\n });\r\n });\r\n\r\n accessor = _GLTFUtilities._CreateAccessor(bufferViews.length - 1, `${name} data`, dataAccessorType, AccessorComponentType.FLOAT, outputLength, null, null, null);\r\n accessors.push(accessor);\r\n dataAccessorIndex = accessors.length - 1;\r\n\r\n // create sampler\r\n animationSampler = {\r\n interpolation: animationData.samplerInterpolation,\r\n input: keyframeAccessorIndex,\r\n output: dataAccessorIndex,\r\n };\r\n glTFAnimation.samplers.push(animationSampler);\r\n\r\n // create channel\r\n animationChannel = {\r\n sampler: glTFAnimation.samplers.length - 1,\r\n target: {\r\n node: nodeIndex,\r\n path: animationChannelTargetPath,\r\n },\r\n };\r\n glTFAnimation.channels.push(animationChannel);\r\n }\r\n }\r\n\r\n /**\r\n * Create a baked animation\r\n * @param babylonTransformNode BabylonJS mesh\r\n * @param animation BabylonJS animation corresponding to the BabylonJS mesh\r\n * @param animationChannelTargetPath animation target channel\r\n * @param minFrame minimum animation frame\r\n * @param maxFrame maximum animation frame\r\n * @param fps frames per second of the animation\r\n * @param sampleRate\r\n * @param inputs input key frames of the animation\r\n * @param outputs output key frame data of the animation\r\n * @param minMaxFrames\r\n * @param minMaxFrames.min\r\n * @param minMaxFrames.max\r\n * @param convertToRightHandedSystem converts the values to right-handed\r\n * @param useQuaternion specifies if quaternions should be used\r\n */\r\n private static _CreateBakedAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n minFrame: number,\r\n maxFrame: number,\r\n fps: number,\r\n sampleRate: number,\r\n inputs: number[],\r\n outputs: number[][],\r\n minMaxFrames: { min: number; max: number },\r\n convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean\r\n ) {\r\n let value: number | Vector3 | Quaternion;\r\n const quaternionCache: Quaternion = Quaternion.Identity();\r\n let previousTime: Nullable<number> = null;\r\n let time: number;\r\n let maxUsedFrame: Nullable<number> = null;\r\n let currKeyFrame: Nullable<IAnimationKey> = null;\r\n let nextKeyFrame: Nullable<IAnimationKey> = null;\r\n let prevKeyFrame: Nullable<IAnimationKey> = null;\r\n let endFrame: Nullable<number> = null;\r\n minMaxFrames.min = Tools.FloatRound(minFrame / fps);\r\n\r\n const keyFrames = animation.getKeys();\r\n\r\n for (let i = 0, length = keyFrames.length; i < length; ++i) {\r\n endFrame = null;\r\n currKeyFrame = keyFrames[i];\r\n\r\n if (i + 1 < length) {\r\n nextKeyFrame = keyFrames[i + 1];\r\n if ((currKeyFrame.value.equals && currKeyFrame.value.equals(nextKeyFrame.value)) || currKeyFrame.value === nextKeyFrame.value) {\r\n if (i === 0) {\r\n // set the first frame to itself\r\n endFrame = currKeyFrame.frame;\r\n } else {\r\n continue;\r\n }\r\n } else {\r\n endFrame = nextKeyFrame.frame;\r\n }\r\n } else {\r\n // at the last key frame\r\n prevKeyFrame = keyFrames[i - 1];\r\n if ((currKeyFrame.value.equals && currKeyFrame.value.equals(prevKeyFrame.value)) || currKeyFrame.value === prevKeyFrame.value) {\r\n continue;\r\n } else {\r\n endFrame = maxFrame;\r\n }\r\n }\r\n if (endFrame) {\r\n for (let f = currKeyFrame.frame; f <= endFrame; f += sampleRate) {\r\n time = Tools.FloatRound(f / fps);\r\n if (time === previousTime) {\r\n continue;\r\n }\r\n previousTime = time;\r\n maxUsedFrame = time;\r\n const state = {\r\n key: 0,\r\n repeatCount: 0,\r\n loopMode: animation.loopMode,\r\n };\r\n value = animation._interpolate(f, state);\r\n\r\n _GLTFAnimation._SetInterpolatedValue(\r\n babylonTransformNode,\r\n value,\r\n time,\r\n animation,\r\n animationChannelTargetPath,\r\n quaternionCache,\r\n inputs,\r\n outputs,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\r\n }\r\n }\r\n }\r\n if (maxUsedFrame) {\r\n minMaxFrames.max = maxUsedFrame;\r\n }\r\n }\r\n\r\n private static _ConvertFactorToVector3OrQuaternion(\r\n factor: number,\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean\r\n ): Vector3 | Quaternion {\r\n const basePositionRotationOrScale = _GLTFAnimation._GetBasePositionRotationOrScale(\r\n babylonTransformNode,\r\n animationChannelTargetPath,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\r\n // handles single component x, y, z or w component animation by using a base property and animating over a component.\r\n const property = animation.targetProperty.split(\".\");\r\n const componentName = property ? property[1] : \"\"; // x, y, or z component\r\n const value = useQuaternion ? Quaternion.FromArray(basePositionRotationOrScale).normalize() : Vector3.FromArray(basePositionRotationOrScale);\r\n\r\n switch (componentName) {\r\n case \"x\": {\r\n value[componentName] = convertToRightHandedSystem && useQuaternion && animationChannelTargetPath !== AnimationChannelTargetPath.SCALE ? -factor : factor;\r\n break;\r\n }\r\n case \"y\": {\r\n value[componentName] = convertToRightHandedSystem && useQuaternion && animationChannelTargetPath !== AnimationChannelTargetPath.SCALE ? -factor : factor;\r\n break;\r\n }\r\n case \"z\": {\r\n value[componentName] = convertToRightHandedSystem && !useQuaternion && animationChannelTargetPath !== AnimationChannelTargetPath.SCALE ? -factor : factor;\r\n break;\r\n }\r\n case \"w\": {\r\n (value as Quaternion).w = factor;\r\n break;\r\n }\r\n default: {\r\n Tools.Error(`glTFAnimation: Unsupported component name \"${componentName}\"!`);\r\n }\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private static _SetInterpolatedValue(\r\n babylonTransformNode: Node,\r\n value: number | Vector3 | Quaternion,\r\n time: number,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n quaternionCache: Quaternion,\r\n inputs: number[],\r\n outputs: number[][],\r\n convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean\r\n ) {\r\n let cacheValue: Vector3 | Quaternion | number;\r\n inputs.push(time);\r\n\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.WEIGHTS) {\r\n outputs.push([value as number]);\r\n return;\r\n }\r\n\r\n if (animation.dataType === Animation.ANIMATIONTYPE_FLOAT) {\r\n value = this._ConvertFactorToVector3OrQuaternion(\r\n value as number,\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\r\n }\r\n\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n if (useQuaternion) {\r\n quaternionCache = value as Quaternion;\r\n } else {\r\n cacheValue = value as Vector3;\r\n Quaternion.RotationYawPitchRollToRef(cacheValue.y, cacheValue.x, cacheValue.z, quaternionCache);\r\n }\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionFromRef(quaternionCache);\r\n\r\n if (!babylonTransformNode.parent) {\r\n quaternionCache = Quaternion.FromArray([0, 1, 0, 0]).multiply(quaternionCache);\r\n }\r\n }\r\n outputs.push(quaternionCache.asArray());\r\n } else {\r\n // scaling and position animation\r\n cacheValue = value as Vector3;\r\n if (convertToRightHandedSystem && animationChannelTargetPath !== AnimationChannelTargetPath.SCALE) {\r\n _GLTFUtilities._GetRightHandedPositionVector3FromRef(cacheValue);\r\n if (!babylonTransformNode.parent) {\r\n cacheValue.x *= -1;\r\n cacheValue.z *= -1;\r\n }\r\n }\r\n\r\n outputs.push(cacheValue.asArray());\r\n }\r\n }\r\n\r\n /**\r\n * Creates linear animation from the animation key frames\r\n * @param babylonTransformNode BabylonJS mesh\r\n * @param animation BabylonJS animation\r\n * @param animationChannelTargetPath The target animation channel\r\n * @param frameDelta The difference between the last and first frame of the animation\r\n * @param inputs Array to store the key frame times\r\n * @param outputs Array to store the key frame data\r\n * @param convertToRightHandedSystem Specifies if the position data should be converted to right handed\r\n * @param useQuaternion Specifies if quaternions are used in the animation\r\n */\r\n private static _CreateLinearOrStepAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n frameDelta: number,\r\n inputs: number[],\r\n outputs: number[][],\r\n convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean\r\n ) {\r\n for (const keyFrame of animation.getKeys()) {\r\n inputs.push(keyFrame.frame / animation.framePerSecond); // keyframes in seconds.\r\n _GLTFAnimation._AddKeyframeValue(keyFrame, animation, outputs, animationChannelTargetPath, babylonTransformNode, convertToRightHandedSystem, useQuaternion);\r\n }\r\n }\r\n\r\n /**\r\n * Creates cubic spline animation from the animation key frames\r\n * @param babylonTransformNode BabylonJS mesh\r\n * @param animation BabylonJS animation\r\n * @param animationChannelTargetPath The target animation channel\r\n * @param frameDelta The difference between the last and first frame of the animation\r\n * @param inputs Array to store the key frame times\r\n * @param outputs Array to store the key frame data\r\n * @param convertToRightHandedSystem Specifies if the position data should be converted to right handed\r\n * @param useQuaternion Specifies if quaternions are used in the animation\r\n */\r\n private static _CreateCubicSplineAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n frameDelta: number,\r\n inputs: number[],\r\n outputs: number[][],\r\n convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean\r\n ) {\r\n animation.getKeys().forEach(function (keyFrame) {\r\n inputs.push(keyFrame.frame / animation.framePerSecond); // keyframes in seconds.\r\n _GLTFAnimation._AddSplineTangent(\r\n babylonTransformNode,\r\n _TangentType.INTANGENT,\r\n outputs,\r\n animationChannelTargetPath,\r\n AnimationSamplerInterpolation.CUBICSPLINE,\r\n keyFrame,\r\n frameDelta,\r\n useQuaternion,\r\n convertToRightHandedSystem\r\n );\r\n _GLTFAnimation._AddKeyframeValue(keyFrame, animation, outputs, animationChannelTargetPath, babylonTransformNode, convertToRightHandedSystem, useQuaternion);\r\n\r\n _GLTFAnimation._AddSplineTangent(\r\n babylonTransformNode,\r\n _TangentType.OUTTANGENT,\r\n outputs,\r\n animationChannelTargetPath,\r\n AnimationSamplerInterpolation.CUBICSPLINE,\r\n keyFrame,\r\n frameDelta,\r\n useQuaternion,\r\n convertToRightHandedSystem\r\n );\r\n });\r\n }\r\n\r\n private static _GetBasePositionRotationOrScale(\r\n babylonTransformNode: Node,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean\r\n ) {\r\n let basePositionRotationOrScale: number[];\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n if (useQuaternion) {\r\n const q = (babylonTransformNode as TransformNode).rotationQuaternion;\r\n basePositionRotationOrScale = (q ?? Quaternion.Identity()).asArray();\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionArrayFromRef(basePositionRotationOrScale);\r\n if (!babylonTransformNode.parent) {\r\n basePositionRotationOrScale = Quaternion.FromArray([0, 1, 0, 0]).multiply(Quaternion.FromArray(basePositionRotationOrScale)).asArray();\r\n }\r\n }\r\n } else {\r\n const r: Vector3 = (babylonTransformNode as TransformNode).rotation;\r\n basePositionRotationOrScale = (r ?? Vector3.Zero()).asArray();\r\n _GLTFUtilities._GetRightHandedNormalArray3FromRef(basePositionRotationOrScale);\r\n }\r\n } else if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {\r\n const p: Vector3 = (babylonTransformNode as TransformNode).position;\r\n basePositionRotationOrScale = (p ?? Vector3.Zero()).asArray();\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedPositionArray3FromRef(basePositionRotationOrScale);\r\n }\r\n } else {\r\n // scale\r\n const s: Vector3 = (babylonTransformNode as TransformNode).scaling;\r\n basePositionRotationOrScale = (s ?? Vector3.One()).asArray();\r\n }\r\n return basePositionRotationOrScale;\r\n }\r\n\r\n /**\r\n * Adds a key frame value\r\n * @param keyFrame\r\n * @param animation\r\n * @param outputs\r\n * @param animationChannelTargetPath\r\n * @param babylonTransformNode\r\n * @param convertToRightHandedSystem\r\n * @param useQuaternion\r\n */\r\n private static _AddKeyframeValue(\r\n keyFrame: IAnimationKey,\r\n animation: Animation,\r\n outputs: number[][],\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n babylonTransformNode: Node,\r\n convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean\r\n ) {\r\n let value: number[];\r\n let newPositionRotationOrScale: Nullable<Vector3 | Quaternion | number>;\r\n const animationType = animation.dataType;\r\n if (animationType === Animation.ANIMATIONTYPE_VECTOR3) {\r\n value = keyFrame.value.asArray();\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n const array = Vector3.FromArray(value);\r\n let rotationQuaternion = Quaternion.RotationYawPitchRoll(array.y, array.x, array.z);\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionFromRef(rotationQuaternion);\r\n\r\n if (!babylonTransformNode.parent) {\r\n rotationQuaternion = Quaternion.FromArray([0, 1, 0, 0]).multiply(rotationQuaternion);\r\n }\r\n }\r\n value = rotationQuaternion.asArray();\r\n } else if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedNormalArray3FromRef(value);\r\n if (!babylonTransformNode.parent) {\r\n value[0] *= -1;\r\n value[2] *= -1;\r\n }\r\n }\r\n }\r\n outputs.push(value); // scale vector.\r\n } else if (animationType === Animation.ANIMATIONTYPE_FLOAT) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.WEIGHTS) {\r\n outputs.push([keyFrame.value]);\r\n } else {\r\n // handles single component x, y, z or w component animation by using a base property and animating over a component.\r\n newPositionRotationOrScale = this._ConvertFactorToVector3OrQuaternion(\r\n keyFrame.value as number,\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\r\n if (newPositionRotationOrScale) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n let posRotScale = useQuaternion\r\n ? (newPositionRotationOrScale as Quaternion)\r\n : Quaternion.RotationYawPitchRoll(newPositionRotationOrScale.y, newPositionRotationOrScale.x, newPositionRotationOrScale.z).normalize();\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionFromRef(posRotScale);\r\n\r\n if (!babylonTransformNode.parent) {\r\n posRotScale = Quaternion.FromArray([0, 1, 0, 0]).multiply(posRotScale);\r\n }\r\n }\r\n outputs.push(posRotScale.asArray());\r\n } else if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedNormalVector3FromRef(newPositionRotationOrScale as Vector3);\r\n\r\n if (!babylonTransformNode.parent) {\r\n newPositionRotationOrScale.x *= -1;\r\n newPositionRotationOrScale.z *= -1;\r\n }\r\n }\r\n }\r\n outputs.push(newPositionRotationOrScale.asArray());\r\n }\r\n }\r\n } else if (animationType === Animation.ANIMATIONTYPE_QUATERNION) {\r\n value = (keyFrame.value as Quaternion).normalize().asArray();\r\n\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionArrayFromRef(value);\r\n\r\n if (!babylonTransformNode.parent) {\r\n value = Quaternion.FromArray([0, 1, 0, 0]).multiply(Quaternion.FromArray(value)).asArray();\r\n }\r\n }\r\n\r\n outputs.push(value);\r\n } else {\r\n Tools.Error(\"glTFAnimation: Unsupported key frame values for animation!\");\r\n }\r\n }\r\n\r\n /**\r\n * Determine the interpolation based on the key frames\r\n * @param keyFrames\r\n * @param animationChannelTargetPath\r\n * @param useQuaternion\r\n */\r\n private static _DeduceInterpolation(\r\n keyFrames: IAnimationKey[],\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n useQuaternion: boolean\r\n ): { interpolationType: AnimationSamplerInterpolation; shouldBakeAnimation: boolean } {\r\n let interpolationType: AnimationSamplerInterpolation | undefined;\r\n let shouldBakeAnimation = false;\r\n let key: IAnimationKey;\r\n\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION && !useQuaternion) {\r\n return { interpolationType: AnimationSamplerInterpolation.LINEAR, shouldBakeAnimation: true };\r\n }\r\n\r\n for (let i = 0, length = keyFrames.length; i < length; ++i) {\r\n key = keyFrames[i];\r\n if (key.inTangent || key.outTangent) {\r\n if (interpolationType) {\r\n if (interpolationType !== AnimationSamplerInterpolation.CUBICSPLINE) {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n shouldBakeAnimation = true;\r\n break;\r\n }\r\n } else {\r\n interpolationType = AnimationSamplerInterpolation.CUBICSPLINE;\r\n }\r\n } else {\r\n if (interpolationType) {\r\n if (\r\n interpolationType === AnimationSamplerInterpolation.CUBICSPLINE ||\r\n (key.interpolation && key.interpolation === AnimationKeyInterpolation.STEP && interpolationType !== AnimationSamplerInterpolation.STEP)\r\n ) {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n shouldBakeAnimation = true;\r\n break;\r\n }\r\n } else {\r\n if (key.interpolation && key.interpolation === AnimationKeyInterpolation.STEP) {\r\n interpolationType = AnimationSamplerInterpolation.STEP;\r\n } else {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n }\r\n }\r\n }\r\n }\r\n if (!interpolationType) {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n }\r\n\r\n return { interpolationType: interpolationType, shouldBakeAnimation: shouldBakeAnimation };\r\n }\r\n\r\n /**\r\n * Adds an input tangent or output tangent to the output data\r\n * If an input tangent or output tangent is missing, it uses the zero vector or zero quaternion\r\n * @param babylonTransformNode\r\n * @param tangentType Specifies which type of tangent to handle (inTangent or outTangent)\r\n * @param outputs The animation data by keyframe\r\n * @param animationChannelTargetPath The target animation channel\r\n * @param interpolation The interpolation type\r\n * @param keyFrame The key frame with the animation data\r\n * @param frameDelta Time difference between two frames used to scale the tangent by the frame delta\r\n * @param useQuaternion Specifies if quaternions are used\r\n * @param convertToRightHandedSystem Specifies if the values should be converted to right-handed\r\n */\r\n private static _AddSplineTangent(\r\n babylonTransformNode: Node,\r\n tangentType: _TangentType,\r\n outputs: number[][],\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n interpolation: AnimationSamplerInterpolation,\r\n keyFrame: IAnimationKey,\r\n frameDelta: number,\r\n useQuaternion: boolean,\r\n convertToRightHandedSystem: boolean\r\n ) {\r\n let tangent: number[];\r\n const tangentValue: Vector3 | Quaternion | number = tangentType === _TangentType.INTANGENT ? keyFrame.inTangent : keyFrame.outTangent;\r\n if (interpolation === AnimationSamplerInterpolation.CUBICSPLINE) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n if (tangentValue) {\r\n if (useQuaternion) {\r\n tangent = (tangentValue as Quaternion).asArray();\r\n } else {\r\n const array = tangentValue as Vector3;\r\n tangent = Quaternion.RotationYawPitchRoll(array.y, array.x, array.z).asArray();\r\n }\r\n\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionArrayFromRef(tangent);\r\n if (!babylonTransformNode.parent) {\r\n tangent = Quaternion.FromArray([0, 1, 0, 0]).multiply(Quaternion.FromArray(tangent)).asArray();\r\n }\r\n }\r\n } else {\r\n tangent = [0, 0, 0, 0];\r\n }\r\n } else if (animationChannelTargetPath === AnimationChannelTargetPath.WEIGHTS) {\r\n if (tangentValue) {\r\n tangent = [tangentValue as number];\r\n } else {\r\n tangent = [0];\r\n }\r\n } else {\r\n if (tangentValue) {\r\n tangent = (tangentValue as Vector3).asArray();\r\n if (convertToRightHandedSystem) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {\r\n _GLTFUtilities._GetRightHandedPositionArray3FromRef(tangent);\r\n if (!babylonTransformNode.parent) {\r\n tangent[0] *= -1; // x\r\n tangent[2] *= -1; // z\r\n }\r\n }\r\n }\r\n } else {\r\n tangent = [0, 0, 0];\r\n }\r\n }\r\n\r\n outputs.push(tangent);\r\n }\r\n }\r\n\r\n /**\r\n * Get the minimum and maximum key frames' frame values\r\n * @param keyFrames animation key frames\r\n * @returns the minimum and maximum key frame value\r\n */\r\n private static _CalculateMinMaxKeyFrames(keyFrames: IAnimationKey[]): { min: number; max: number } {\r\n let min: number = Infinity;\r\n let max: number = -Infinity;\r\n keyFrames.forEach(function (keyFrame) {\r\n min = Math.min(min, keyFrame.frame);\r\n max = Math.max(max, keyFrame.frame);\r\n });\r\n\r\n return { min: min, max: max };\r\n }\r\n}\r\n"]}
|
1
|
+
{"version":3,"file":"glTFAnimation.js","sourceRoot":"","sources":["../../../../../lts/serializers/generated/glTF/2.0/glTFAnimation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IAnimation, INode, IBufferView, IAccessor, IAnimationSampler, IAnimationChannel } from \"babylonjs-gltf2interface\";\r\nimport { AnimationSamplerInterpolation, AnimationChannelTargetPath, AccessorType, AccessorComponentType } from \"babylonjs-gltf2interface\";\r\nimport type { Node } from \"core/node\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { Vector3, Quaternion } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { Animation } from \"core/Animations/animation\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { Scene } from \"core/scene\";\r\nimport { MorphTarget } from \"core/Morph/morphTarget\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\n\r\nimport type { _BinaryWriter } from \"./glTFExporter\";\r\nimport { _GLTFUtilities } from \"./glTFUtilities\";\r\nimport type { IAnimationKey } from \"core/Animations/animationKey\";\r\nimport { AnimationKeyInterpolation } from \"core/Animations/animationKey\";\r\n\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { Light } from \"core/Lights/light\";\r\n\r\n/**\r\n * @internal\r\n * Interface to store animation data.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface _IAnimationData {\r\n /**\r\n * Keyframe data.\r\n */\r\n inputs: number[];\r\n /**\r\n * Value data.\r\n */\r\n outputs: number[][];\r\n /**\r\n * Animation interpolation data.\r\n */\r\n samplerInterpolation: AnimationSamplerInterpolation;\r\n /**\r\n * Minimum keyframe value.\r\n */\r\n inputsMin: number;\r\n /**\r\n * Maximum keyframe value.\r\n */\r\n inputsMax: number;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface _IAnimationInfo {\r\n /**\r\n * The target channel for the animation\r\n */\r\n animationChannelTargetPath: AnimationChannelTargetPath;\r\n /**\r\n * The glTF accessor type for the data.\r\n */\r\n dataAccessorType: AccessorType.VEC3 | AccessorType.VEC4 | AccessorType.SCALAR;\r\n /**\r\n * Specifies if quaternions should be used.\r\n */\r\n useQuaternion: boolean;\r\n}\r\n\r\n/**\r\n * @internal\r\n * Enum for handling in tangent and out tangent.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nenum _TangentType {\r\n /**\r\n * Specifies that input tangents are used.\r\n */\r\n INTANGENT,\r\n /**\r\n * Specifies that output tangents are used.\r\n */\r\n OUTTANGENT,\r\n}\r\n\r\n/**\r\n * @internal\r\n * Utility class for generating glTF animation data from BabylonJS.\r\n */\r\nexport class _GLTFAnimation {\r\n /**\r\n * Determine if a node is transformable - ie has properties it should be part of animation of transformation.\r\n * @param babylonNode the node to test\r\n * @returns true if can be animated, false otherwise. False if the parameter is null or undefined.\r\n */\r\n private static _IsTransformable(babylonNode: Node): boolean {\r\n return babylonNode && (babylonNode instanceof TransformNode || babylonNode instanceof Camera || babylonNode instanceof Light);\r\n }\r\n\r\n /**\r\n * @ignore\r\n *\r\n * Creates glTF channel animation from BabylonJS animation.\r\n * @param babylonTransformNode - BabylonJS mesh.\r\n * @param animation - animation.\r\n * @param animationChannelTargetPath - The target animation channel.\r\n * @param useQuaternion - Specifies if quaternions are used.\r\n * @returns nullable IAnimationData\r\n */\r\n public static _CreateNodeAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n useQuaternion: boolean,\r\n animationSampleRate: number\r\n ): Nullable<_IAnimationData> {\r\n if (this._IsTransformable(babylonTransformNode)) {\r\n const inputs: number[] = [];\r\n const outputs: number[][] = [];\r\n const keyFrames = animation.getKeys();\r\n const minMaxKeyFrames = _GLTFAnimation._CalculateMinMaxKeyFrames(keyFrames);\r\n const interpolationOrBake = _GLTFAnimation._DeduceInterpolation(keyFrames, animationChannelTargetPath, useQuaternion);\r\n\r\n const interpolation = interpolationOrBake.interpolationType;\r\n const shouldBakeAnimation = interpolationOrBake.shouldBakeAnimation;\r\n\r\n if (shouldBakeAnimation) {\r\n _GLTFAnimation._CreateBakedAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n minMaxKeyFrames.min,\r\n minMaxKeyFrames.max,\r\n animation.framePerSecond,\r\n animationSampleRate,\r\n inputs,\r\n outputs,\r\n minMaxKeyFrames,\r\n useQuaternion\r\n );\r\n } else {\r\n if (interpolation === AnimationSamplerInterpolation.LINEAR || interpolation === AnimationSamplerInterpolation.STEP) {\r\n _GLTFAnimation._CreateLinearOrStepAnimation(babylonTransformNode, animation, animationChannelTargetPath, inputs, outputs, useQuaternion);\r\n } else if (interpolation === AnimationSamplerInterpolation.CUBICSPLINE) {\r\n _GLTFAnimation._CreateCubicSplineAnimation(babylonTransformNode, animation, animationChannelTargetPath, inputs, outputs, useQuaternion);\r\n } else {\r\n _GLTFAnimation._CreateBakedAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n minMaxKeyFrames.min,\r\n minMaxKeyFrames.max,\r\n animation.framePerSecond,\r\n animationSampleRate,\r\n inputs,\r\n outputs,\r\n minMaxKeyFrames,\r\n useQuaternion\r\n );\r\n }\r\n }\r\n\r\n if (inputs.length && outputs.length) {\r\n const result: _IAnimationData = {\r\n inputs: inputs,\r\n outputs: outputs,\r\n samplerInterpolation: interpolation,\r\n inputsMin: shouldBakeAnimation ? minMaxKeyFrames.min : Tools.FloatRound(minMaxKeyFrames.min / animation.framePerSecond),\r\n inputsMax: shouldBakeAnimation ? minMaxKeyFrames.max : Tools.FloatRound(minMaxKeyFrames.max / animation.framePerSecond),\r\n };\r\n\r\n return result;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private static _DeduceAnimationInfo(animation: Animation): Nullable<_IAnimationInfo> {\r\n let animationChannelTargetPath: Nullable<AnimationChannelTargetPath> = null;\r\n let dataAccessorType = AccessorType.VEC3;\r\n let useQuaternion: boolean = false;\r\n const property = animation.targetProperty.split(\".\");\r\n switch (property[0]) {\r\n case \"scaling\": {\r\n animationChannelTargetPath = AnimationChannelTargetPath.SCALE;\r\n break;\r\n }\r\n case \"position\": {\r\n animationChannelTargetPath = AnimationChannelTargetPath.TRANSLATION;\r\n break;\r\n }\r\n case \"rotation\": {\r\n dataAccessorType = AccessorType.VEC4;\r\n animationChannelTargetPath = AnimationChannelTargetPath.ROTATION;\r\n break;\r\n }\r\n case \"rotationQuaternion\": {\r\n dataAccessorType = AccessorType.VEC4;\r\n useQuaternion = true;\r\n animationChannelTargetPath = AnimationChannelTargetPath.ROTATION;\r\n break;\r\n }\r\n case \"influence\": {\r\n dataAccessorType = AccessorType.SCALAR;\r\n animationChannelTargetPath = AnimationChannelTargetPath.WEIGHTS;\r\n break;\r\n }\r\n default: {\r\n Tools.Error(`Unsupported animatable property ${property[0]}`);\r\n }\r\n }\r\n if (animationChannelTargetPath) {\r\n return { animationChannelTargetPath: animationChannelTargetPath, dataAccessorType: dataAccessorType, useQuaternion: useQuaternion };\r\n } else {\r\n Tools.Error(\"animation channel target path and data accessor type could be deduced\");\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * @ignore\r\n * Create node animations from the transform node animations\r\n * @param babylonNode\r\n * @param runtimeGLTFAnimation\r\n * @param idleGLTFAnimations\r\n * @param nodeMap\r\n * @param nodes\r\n * @param binaryWriter\r\n * @param bufferViews\r\n * @param accessors\r\n * @param animationSampleRate\r\n */\r\n public static _CreateNodeAnimationFromNodeAnimations(\r\n babylonNode: Node,\r\n runtimeGLTFAnimation: IAnimation,\r\n idleGLTFAnimations: IAnimation[],\r\n nodeMap: { [key: number]: number },\r\n nodes: INode[],\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n animationSampleRate: number,\r\n shouldExportAnimation?: (animation: Animation) => boolean\r\n ) {\r\n let glTFAnimation: IAnimation;\r\n if (_GLTFAnimation._IsTransformable(babylonNode)) {\r\n if (babylonNode.animations) {\r\n for (const animation of babylonNode.animations) {\r\n if (shouldExportAnimation && !shouldExportAnimation(animation)) {\r\n continue;\r\n }\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(animation);\r\n if (animationInfo) {\r\n glTFAnimation = {\r\n name: animation.name,\r\n samplers: [],\r\n channels: [],\r\n };\r\n _GLTFAnimation._AddAnimation(\r\n `${animation.name}`,\r\n animation.hasRunningRuntimeAnimations ? runtimeGLTFAnimation : glTFAnimation,\r\n babylonNode,\r\n animation,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n binaryWriter,\r\n bufferViews,\r\n accessors,\r\n animationInfo.useQuaternion,\r\n animationSampleRate\r\n );\r\n if (glTFAnimation.samplers.length && glTFAnimation.channels.length) {\r\n idleGLTFAnimations.push(glTFAnimation);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @ignore\r\n * Create individual morph animations from the mesh's morph target animation tracks\r\n * @param babylonNode\r\n * @param runtimeGLTFAnimation\r\n * @param idleGLTFAnimations\r\n * @param nodeMap\r\n * @param nodes\r\n * @param binaryWriter\r\n * @param bufferViews\r\n * @param accessors\r\n * @param animationSampleRate\r\n */\r\n public static _CreateMorphTargetAnimationFromMorphTargetAnimations(\r\n babylonNode: Node,\r\n runtimeGLTFAnimation: IAnimation,\r\n idleGLTFAnimations: IAnimation[],\r\n nodeMap: { [key: number]: number },\r\n nodes: INode[],\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n animationSampleRate: number,\r\n shouldExportAnimation?: (animation: Animation) => boolean\r\n ) {\r\n let glTFAnimation: IAnimation;\r\n if (babylonNode instanceof Mesh) {\r\n const morphTargetManager = babylonNode.morphTargetManager;\r\n if (morphTargetManager) {\r\n for (let i = 0; i < morphTargetManager.numTargets; ++i) {\r\n const morphTarget = morphTargetManager.getTarget(i);\r\n for (const animation of morphTarget.animations) {\r\n if (shouldExportAnimation && !shouldExportAnimation(animation)) {\r\n continue;\r\n }\r\n const combinedAnimation = new Animation(\r\n `${animation.name}`,\r\n \"influence\",\r\n animation.framePerSecond,\r\n animation.dataType,\r\n animation.loopMode,\r\n animation.enableBlending\r\n );\r\n const combinedAnimationKeys: IAnimationKey[] = [];\r\n const animationKeys = animation.getKeys();\r\n\r\n for (let j = 0; j < animationKeys.length; ++j) {\r\n const animationKey = animationKeys[j];\r\n for (let k = 0; k < morphTargetManager.numTargets; ++k) {\r\n if (k == i) {\r\n combinedAnimationKeys.push(animationKey);\r\n } else {\r\n combinedAnimationKeys.push({ frame: animationKey.frame, value: 0 });\r\n }\r\n }\r\n }\r\n combinedAnimation.setKeys(combinedAnimationKeys);\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(combinedAnimation);\r\n if (animationInfo) {\r\n glTFAnimation = {\r\n name: combinedAnimation.name,\r\n samplers: [],\r\n channels: [],\r\n };\r\n _GLTFAnimation._AddAnimation(\r\n animation.name,\r\n animation.hasRunningRuntimeAnimations ? runtimeGLTFAnimation : glTFAnimation,\r\n babylonNode,\r\n combinedAnimation,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n binaryWriter,\r\n bufferViews,\r\n accessors,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\r\n morphTargetManager.numTargets\r\n );\r\n if (glTFAnimation.samplers.length && glTFAnimation.channels.length) {\r\n idleGLTFAnimations.push(glTFAnimation);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @ignore\r\n * Create node and morph animations from the animation groups\r\n * @param babylonScene\r\n * @param glTFAnimations\r\n * @param nodeMap\r\n * @param nodes\r\n * @param binaryWriter\r\n * @param bufferViews\r\n * @param accessors\r\n * @param animationSampleRate\r\n */\r\n public static _CreateNodeAndMorphAnimationFromAnimationGroups(\r\n babylonScene: Scene,\r\n glTFAnimations: IAnimation[],\r\n nodeMap: { [key: number]: number },\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n animationSampleRate: number,\r\n shouldExportAnimation?: (animation: Animation) => boolean\r\n ) {\r\n let glTFAnimation: IAnimation;\r\n if (babylonScene.animationGroups) {\r\n const animationGroups = babylonScene.animationGroups;\r\n for (const animationGroup of animationGroups) {\r\n const morphAnimations: Map<Mesh, Map<MorphTarget, Animation>> = new Map();\r\n const sampleAnimations: Map<Mesh, Animation> = new Map();\r\n const morphAnimationMeshes: Set<Mesh> = new Set();\r\n const animationGroupFrameDiff = animationGroup.to - animationGroup.from;\r\n glTFAnimation = {\r\n name: animationGroup.name,\r\n channels: [],\r\n samplers: [],\r\n };\r\n for (let i = 0; i < animationGroup.targetedAnimations.length; ++i) {\r\n const targetAnimation = animationGroup.targetedAnimations[i];\r\n const target = targetAnimation.target;\r\n const animation = targetAnimation.animation;\r\n if (shouldExportAnimation && !shouldExportAnimation(animation)) {\r\n continue;\r\n }\r\n if (this._IsTransformable(target) || (target.length === 1 && this._IsTransformable(target[0]))) {\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(targetAnimation.animation);\r\n if (animationInfo) {\r\n const babylonTransformNode = this._IsTransformable(target) ? target : this._IsTransformable(target[0]) ? target[0] : null;\r\n if (babylonTransformNode) {\r\n _GLTFAnimation._AddAnimation(\r\n `${animation.name}`,\r\n glTFAnimation,\r\n babylonTransformNode,\r\n animation,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n binaryWriter,\r\n bufferViews,\r\n accessors,\r\n animationInfo.useQuaternion,\r\n animationSampleRate\r\n );\r\n }\r\n }\r\n } else if (target instanceof MorphTarget || (target.length === 1 && target[0] instanceof MorphTarget)) {\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(targetAnimation.animation);\r\n if (animationInfo) {\r\n const babylonMorphTarget = target instanceof MorphTarget ? (target as MorphTarget) : (target[0] as MorphTarget);\r\n if (babylonMorphTarget) {\r\n const babylonMorphTargetManager = babylonScene.morphTargetManagers.find((morphTargetManager) => {\r\n for (let j = 0; j < morphTargetManager.numTargets; ++j) {\r\n if (morphTargetManager.getTarget(j) === babylonMorphTarget) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n if (babylonMorphTargetManager) {\r\n const babylonMesh = babylonScene.meshes.find((mesh) => {\r\n return (mesh as Mesh).morphTargetManager === babylonMorphTargetManager;\r\n }) as Mesh;\r\n if (babylonMesh) {\r\n if (!morphAnimations.has(babylonMesh)) {\r\n morphAnimations.set(babylonMesh, new Map());\r\n }\r\n morphAnimations.get(babylonMesh)?.set(babylonMorphTarget, animation);\r\n morphAnimationMeshes.add(babylonMesh);\r\n sampleAnimations.set(babylonMesh, animation);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // this is the place for the KHR_animation_pointer.\r\n }\r\n }\r\n morphAnimationMeshes.forEach((mesh) => {\r\n const morphTargetManager = mesh.morphTargetManager!;\r\n let combinedAnimationGroup: Nullable<Animation> = null;\r\n const animationKeys: IAnimationKey[] = [];\r\n const sampleAnimation = sampleAnimations.get(mesh)!;\r\n const sampleAnimationKeys = sampleAnimation.getKeys();\r\n const numAnimationKeys = sampleAnimationKeys.length;\r\n /*\r\n Due to how glTF expects morph target animation data to be formatted, we need to rearrange the individual morph target animation tracks,\r\n such that we have a single animation, where a given keyframe input value has successive output values for each morph target belonging to the manager.\r\n See: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\r\n\r\n We do this via constructing a new Animation track, and interleaving the frames of each morph target animation track in the current Animation Group\r\n We reuse the Babylon Animation data structure for ease of handling export of cubic spline animation keys, and to reuse the\r\n existing _GLTFAnimation.AddAnimation codepath with minimal modification, however the constructed Babylon Animation is NOT intended for use in-engine.\r\n */\r\n for (let i = 0; i < numAnimationKeys; ++i) {\r\n for (let j = 0; j < morphTargetManager.numTargets; ++j) {\r\n const morphTarget = morphTargetManager.getTarget(j);\r\n const animationsByMorphTarget = morphAnimations.get(mesh);\r\n if (animationsByMorphTarget) {\r\n const morphTargetAnimation = animationsByMorphTarget.get(morphTarget);\r\n if (morphTargetAnimation) {\r\n if (!combinedAnimationGroup) {\r\n combinedAnimationGroup = new Animation(\r\n `${animationGroup.name}_${mesh.name}_MorphWeightAnimation`,\r\n \"influence\",\r\n morphTargetAnimation.framePerSecond,\r\n Animation.ANIMATIONTYPE_FLOAT,\r\n morphTargetAnimation.loopMode,\r\n morphTargetAnimation.enableBlending\r\n );\r\n }\r\n animationKeys.push(morphTargetAnimation.getKeys()[i]);\r\n } else {\r\n animationKeys.push({\r\n frame: animationGroup.from + (animationGroupFrameDiff / numAnimationKeys) * i,\r\n value: morphTarget.influence,\r\n inTangent: sampleAnimationKeys[0].inTangent ? 0 : undefined,\r\n outTangent: sampleAnimationKeys[0].outTangent ? 0 : undefined,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n combinedAnimationGroup!.setKeys(animationKeys);\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(combinedAnimationGroup!);\r\n if (animationInfo) {\r\n _GLTFAnimation._AddAnimation(\r\n `${animationGroup.name}_${mesh.name}_MorphWeightAnimation`,\r\n glTFAnimation,\r\n mesh,\r\n combinedAnimationGroup!,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n binaryWriter,\r\n bufferViews,\r\n accessors,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\r\n morphTargetManager?.numTargets\r\n );\r\n }\r\n });\r\n if (glTFAnimation.channels.length && glTFAnimation.samplers.length) {\r\n glTFAnimations.push(glTFAnimation);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private static _AddAnimation(\r\n name: string,\r\n glTFAnimation: IAnimation,\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n dataAccessorType: AccessorType,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n nodeMap: { [key: number]: number },\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n useQuaternion: boolean,\r\n animationSampleRate: number,\r\n morphAnimationChannels?: number\r\n ) {\r\n const animationData = _GLTFAnimation._CreateNodeAnimation(babylonTransformNode, animation, animationChannelTargetPath, useQuaternion, animationSampleRate);\r\n let bufferView: IBufferView;\r\n let accessor: IAccessor;\r\n let keyframeAccessorIndex: number;\r\n let dataAccessorIndex: number;\r\n let outputLength: number;\r\n let animationSampler: IAnimationSampler;\r\n let animationChannel: IAnimationChannel;\r\n\r\n if (animationData) {\r\n /*\r\n * Now that we have the glTF converted morph target animation data,\r\n * we can remove redundant input data so that we have n input frames,\r\n * and morphAnimationChannels * n output frames\r\n */\r\n if (morphAnimationChannels) {\r\n let index = 0;\r\n let currentInput: number = 0;\r\n const newInputs: number[] = [];\r\n while (animationData.inputs.length > 0) {\r\n currentInput = animationData.inputs.shift()!;\r\n if (index % morphAnimationChannels == 0) {\r\n newInputs.push(currentInput);\r\n }\r\n index++;\r\n }\r\n animationData.inputs = newInputs;\r\n }\r\n\r\n const nodeIndex = nodeMap[babylonTransformNode.uniqueId];\r\n\r\n // Creates buffer view and accessor for key frames.\r\n let byteLength = animationData.inputs.length * 4;\r\n bufferView = _GLTFUtilities._CreateBufferView(0, binaryWriter.getByteOffset(), byteLength, undefined, `${name} keyframe data view`);\r\n bufferViews.push(bufferView);\r\n animationData.inputs.forEach(function (input) {\r\n binaryWriter.setFloat32(input);\r\n });\r\n\r\n accessor = _GLTFUtilities._CreateAccessor(\r\n bufferViews.length - 1,\r\n `${name} keyframes`,\r\n AccessorType.SCALAR,\r\n AccessorComponentType.FLOAT,\r\n animationData.inputs.length,\r\n null,\r\n [animationData.inputsMin],\r\n [animationData.inputsMax]\r\n );\r\n accessors.push(accessor);\r\n keyframeAccessorIndex = accessors.length - 1;\r\n\r\n // create bufferview and accessor for keyed values.\r\n outputLength = animationData.outputs.length;\r\n byteLength = _GLTFUtilities._GetDataAccessorElementCount(dataAccessorType) * 4 * animationData.outputs.length;\r\n\r\n // check for in and out tangents\r\n bufferView = _GLTFUtilities._CreateBufferView(0, binaryWriter.getByteOffset(), byteLength, undefined, `${name} data view`);\r\n bufferViews.push(bufferView);\r\n\r\n animationData.outputs.forEach(function (output) {\r\n output.forEach(function (entry) {\r\n binaryWriter.setFloat32(entry);\r\n });\r\n });\r\n\r\n accessor = _GLTFUtilities._CreateAccessor(bufferViews.length - 1, `${name} data`, dataAccessorType, AccessorComponentType.FLOAT, outputLength, null, null, null);\r\n accessors.push(accessor);\r\n dataAccessorIndex = accessors.length - 1;\r\n\r\n // create sampler\r\n animationSampler = {\r\n interpolation: animationData.samplerInterpolation,\r\n input: keyframeAccessorIndex,\r\n output: dataAccessorIndex,\r\n };\r\n glTFAnimation.samplers.push(animationSampler);\r\n\r\n // create channel\r\n animationChannel = {\r\n sampler: glTFAnimation.samplers.length - 1,\r\n target: {\r\n node: nodeIndex,\r\n path: animationChannelTargetPath,\r\n },\r\n };\r\n glTFAnimation.channels.push(animationChannel);\r\n }\r\n }\r\n\r\n /**\r\n * Create a baked animation\r\n * @param babylonTransformNode BabylonJS mesh\r\n * @param animation BabylonJS animation corresponding to the BabylonJS mesh\r\n * @param animationChannelTargetPath animation target channel\r\n * @param minFrame minimum animation frame\r\n * @param maxFrame maximum animation frame\r\n * @param fps frames per second of the animation\r\n * @param sampleRate\r\n * @param inputs input key frames of the animation\r\n * @param outputs output key frame data of the animation\r\n * @param minMaxFrames\r\n * @param minMaxFrames.min\r\n * @param minMaxFrames.max\r\n * @param useQuaternion specifies if quaternions should be used\r\n */\r\n private static _CreateBakedAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n minFrame: number,\r\n maxFrame: number,\r\n fps: number,\r\n sampleRate: number,\r\n inputs: number[],\r\n outputs: number[][],\r\n minMaxFrames: { min: number; max: number },\r\n useQuaternion: boolean\r\n ) {\r\n let value: number | Vector3 | Quaternion;\r\n const quaternionCache: Quaternion = Quaternion.Identity();\r\n let previousTime: Nullable<number> = null;\r\n let time: number;\r\n let maxUsedFrame: Nullable<number> = null;\r\n let currKeyFrame: Nullable<IAnimationKey> = null;\r\n let nextKeyFrame: Nullable<IAnimationKey> = null;\r\n let prevKeyFrame: Nullable<IAnimationKey> = null;\r\n let endFrame: Nullable<number> = null;\r\n minMaxFrames.min = Tools.FloatRound(minFrame / fps);\r\n\r\n const keyFrames = animation.getKeys();\r\n\r\n for (let i = 0, length = keyFrames.length; i < length; ++i) {\r\n endFrame = null;\r\n currKeyFrame = keyFrames[i];\r\n\r\n if (i + 1 < length) {\r\n nextKeyFrame = keyFrames[i + 1];\r\n if ((currKeyFrame.value.equals && currKeyFrame.value.equals(nextKeyFrame.value)) || currKeyFrame.value === nextKeyFrame.value) {\r\n if (i === 0) {\r\n // set the first frame to itself\r\n endFrame = currKeyFrame.frame;\r\n } else {\r\n continue;\r\n }\r\n } else {\r\n endFrame = nextKeyFrame.frame;\r\n }\r\n } else {\r\n // at the last key frame\r\n prevKeyFrame = keyFrames[i - 1];\r\n if ((currKeyFrame.value.equals && currKeyFrame.value.equals(prevKeyFrame.value)) || currKeyFrame.value === prevKeyFrame.value) {\r\n continue;\r\n } else {\r\n endFrame = maxFrame;\r\n }\r\n }\r\n if (endFrame) {\r\n for (let f = currKeyFrame.frame; f <= endFrame; f += sampleRate) {\r\n time = Tools.FloatRound(f / fps);\r\n if (time === previousTime) {\r\n continue;\r\n }\r\n previousTime = time;\r\n maxUsedFrame = time;\r\n const state = {\r\n key: 0,\r\n repeatCount: 0,\r\n loopMode: animation.loopMode,\r\n };\r\n value = animation._interpolate(f, state);\r\n\r\n _GLTFAnimation._SetInterpolatedValue(babylonTransformNode, value, time, animation, animationChannelTargetPath, quaternionCache, inputs, outputs, useQuaternion);\r\n }\r\n }\r\n }\r\n if (maxUsedFrame) {\r\n minMaxFrames.max = maxUsedFrame;\r\n }\r\n }\r\n\r\n private static _ConvertFactorToVector3OrQuaternion(\r\n factor: number,\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n useQuaternion: boolean\r\n ): Vector3 | Quaternion {\r\n const basePositionRotationOrScale = _GLTFAnimation._GetBasePositionRotationOrScale(babylonTransformNode, animationChannelTargetPath, useQuaternion);\r\n // handles single component x, y, z or w component animation by using a base property and animating over a component.\r\n const property = animation.targetProperty.split(\".\");\r\n const componentName = property ? property[1] : \"\"; // x, y, z, or w component\r\n const value = useQuaternion ? Quaternion.FromArray(basePositionRotationOrScale).normalize() : Vector3.FromArray(basePositionRotationOrScale);\r\n\r\n switch (componentName) {\r\n case \"x\":\r\n case \"y\":\r\n case \"z\": {\r\n value[componentName] = factor;\r\n break;\r\n }\r\n case \"w\": {\r\n (value as Quaternion).w = factor;\r\n break;\r\n }\r\n default: {\r\n Tools.Error(`glTFAnimation: Unsupported component name \"${componentName}\"!`);\r\n }\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private static _SetInterpolatedValue(\r\n babylonTransformNode: Node,\r\n value: number | Vector3 | Quaternion,\r\n time: number,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n quaternionCache: Quaternion,\r\n inputs: number[],\r\n outputs: number[][],\r\n useQuaternion: boolean\r\n ) {\r\n let cacheValue: Vector3 | Quaternion | number;\r\n inputs.push(time);\r\n\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.WEIGHTS) {\r\n outputs.push([value as number]);\r\n return;\r\n }\r\n\r\n if (animation.dataType === Animation.ANIMATIONTYPE_FLOAT) {\r\n value = this._ConvertFactorToVector3OrQuaternion(value as number, babylonTransformNode, animation, animationChannelTargetPath, useQuaternion);\r\n }\r\n\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n if (useQuaternion) {\r\n quaternionCache = value as Quaternion;\r\n } else {\r\n cacheValue = value as Vector3;\r\n Quaternion.RotationYawPitchRollToRef(cacheValue.y, cacheValue.x, cacheValue.z, quaternionCache);\r\n }\r\n outputs.push(quaternionCache.asArray());\r\n } else {\r\n // scaling and position animation\r\n cacheValue = value as Vector3;\r\n outputs.push(cacheValue.asArray());\r\n }\r\n }\r\n\r\n /**\r\n * Creates linear animation from the animation key frames\r\n * @param babylonTransformNode BabylonJS mesh\r\n * @param animation BabylonJS animation\r\n * @param animationChannelTargetPath The target animation channel\r\n * @param inputs Array to store the key frame times\r\n * @param outputs Array to store the key frame data\r\n * @param useQuaternion Specifies if quaternions are used in the animation\r\n */\r\n private static _CreateLinearOrStepAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n inputs: number[],\r\n outputs: number[][],\r\n useQuaternion: boolean\r\n ) {\r\n for (const keyFrame of animation.getKeys()) {\r\n inputs.push(keyFrame.frame / animation.framePerSecond); // keyframes in seconds.\r\n _GLTFAnimation._AddKeyframeValue(keyFrame, animation, outputs, animationChannelTargetPath, babylonTransformNode, useQuaternion);\r\n }\r\n }\r\n\r\n /**\r\n * Creates cubic spline animation from the animation key frames\r\n * @param babylonTransformNode BabylonJS mesh\r\n * @param animation BabylonJS animation\r\n * @param animationChannelTargetPath The target animation channel\r\n * @param frameDelta The difference between the last and first frame of the animation\r\n * @param inputs Array to store the key frame times\r\n * @param outputs Array to store the key frame data\r\n * @param useQuaternion Specifies if quaternions are used in the animation\r\n */\r\n private static _CreateCubicSplineAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n inputs: number[],\r\n outputs: number[][],\r\n useQuaternion: boolean\r\n ) {\r\n animation.getKeys().forEach(function (keyFrame) {\r\n inputs.push(keyFrame.frame / animation.framePerSecond); // keyframes in seconds.\r\n _GLTFAnimation._AddSplineTangent(_TangentType.INTANGENT, outputs, animationChannelTargetPath, AnimationSamplerInterpolation.CUBICSPLINE, keyFrame, useQuaternion);\r\n _GLTFAnimation._AddKeyframeValue(keyFrame, animation, outputs, animationChannelTargetPath, babylonTransformNode, useQuaternion);\r\n\r\n _GLTFAnimation._AddSplineTangent(_TangentType.OUTTANGENT, outputs, animationChannelTargetPath, AnimationSamplerInterpolation.CUBICSPLINE, keyFrame, useQuaternion);\r\n });\r\n }\r\n\r\n private static _GetBasePositionRotationOrScale(babylonTransformNode: Node, animationChannelTargetPath: AnimationChannelTargetPath, useQuaternion: boolean) {\r\n let basePositionRotationOrScale: number[];\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n if (useQuaternion) {\r\n const q = (babylonTransformNode as TransformNode).rotationQuaternion;\r\n basePositionRotationOrScale = (q ?? Quaternion.Identity()).asArray();\r\n } else {\r\n const r: Vector3 = (babylonTransformNode as TransformNode).rotation;\r\n basePositionRotationOrScale = (r ?? Vector3.Zero()).asArray();\r\n }\r\n } else if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {\r\n const p: Vector3 = (babylonTransformNode as TransformNode).position;\r\n basePositionRotationOrScale = (p ?? Vector3.Zero()).asArray();\r\n } else {\r\n // scale\r\n const s: Vector3 = (babylonTransformNode as TransformNode).scaling;\r\n basePositionRotationOrScale = (s ?? Vector3.One()).asArray();\r\n }\r\n return basePositionRotationOrScale;\r\n }\r\n\r\n /**\r\n * Adds a key frame value\r\n * @param keyFrame\r\n * @param animation\r\n * @param outputs\r\n * @param animationChannelTargetPath\r\n * @param babylonTransformNode\r\n * @param useQuaternion\r\n */\r\n private static _AddKeyframeValue(\r\n keyFrame: IAnimationKey,\r\n animation: Animation,\r\n outputs: number[][],\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n babylonTransformNode: Node,\r\n useQuaternion: boolean\r\n ) {\r\n let newPositionRotationOrScale: Nullable<Vector3 | Quaternion | number>;\r\n const animationType = animation.dataType;\r\n if (animationType === Animation.ANIMATIONTYPE_VECTOR3) {\r\n let value = keyFrame.value.asArray();\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n const array = Vector3.FromArray(value);\r\n const rotationQuaternion = Quaternion.RotationYawPitchRoll(array.y, array.x, array.z);\r\n value = rotationQuaternion.asArray();\r\n }\r\n outputs.push(value); // scale vector.\r\n } else if (animationType === Animation.ANIMATIONTYPE_FLOAT) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.WEIGHTS) {\r\n outputs.push([keyFrame.value]);\r\n } else {\r\n // handles single component x, y, z or w component animation by using a base property and animating over a component.\r\n newPositionRotationOrScale = this._ConvertFactorToVector3OrQuaternion(\r\n keyFrame.value as number,\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n useQuaternion\r\n );\r\n if (newPositionRotationOrScale) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n const posRotScale = useQuaternion\r\n ? (newPositionRotationOrScale as Quaternion)\r\n : Quaternion.RotationYawPitchRoll(newPositionRotationOrScale.y, newPositionRotationOrScale.x, newPositionRotationOrScale.z).normalize();\r\n outputs.push(posRotScale.asArray());\r\n }\r\n outputs.push(newPositionRotationOrScale.asArray());\r\n }\r\n }\r\n } else if (animationType === Animation.ANIMATIONTYPE_QUATERNION) {\r\n outputs.push((keyFrame.value as Quaternion).normalize().asArray());\r\n } else {\r\n Tools.Error(\"glTFAnimation: Unsupported key frame values for animation!\");\r\n }\r\n }\r\n\r\n /**\r\n * Determine the interpolation based on the key frames\r\n * @param keyFrames\r\n * @param animationChannelTargetPath\r\n * @param useQuaternion\r\n */\r\n private static _DeduceInterpolation(\r\n keyFrames: IAnimationKey[],\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n useQuaternion: boolean\r\n ): { interpolationType: AnimationSamplerInterpolation; shouldBakeAnimation: boolean } {\r\n let interpolationType: AnimationSamplerInterpolation | undefined;\r\n let shouldBakeAnimation = false;\r\n let key: IAnimationKey;\r\n\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION && !useQuaternion) {\r\n return { interpolationType: AnimationSamplerInterpolation.LINEAR, shouldBakeAnimation: true };\r\n }\r\n\r\n for (let i = 0, length = keyFrames.length; i < length; ++i) {\r\n key = keyFrames[i];\r\n if (key.inTangent || key.outTangent) {\r\n if (interpolationType) {\r\n if (interpolationType !== AnimationSamplerInterpolation.CUBICSPLINE) {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n shouldBakeAnimation = true;\r\n break;\r\n }\r\n } else {\r\n interpolationType = AnimationSamplerInterpolation.CUBICSPLINE;\r\n }\r\n } else {\r\n if (interpolationType) {\r\n if (\r\n interpolationType === AnimationSamplerInterpolation.CUBICSPLINE ||\r\n (key.interpolation && key.interpolation === AnimationKeyInterpolation.STEP && interpolationType !== AnimationSamplerInterpolation.STEP)\r\n ) {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n shouldBakeAnimation = true;\r\n break;\r\n }\r\n } else {\r\n if (key.interpolation && key.interpolation === AnimationKeyInterpolation.STEP) {\r\n interpolationType = AnimationSamplerInterpolation.STEP;\r\n } else {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n }\r\n }\r\n }\r\n }\r\n if (!interpolationType) {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n }\r\n\r\n return { interpolationType: interpolationType, shouldBakeAnimation: shouldBakeAnimation };\r\n }\r\n\r\n /**\r\n * Adds an input tangent or output tangent to the output data\r\n * If an input tangent or output tangent is missing, it uses the zero vector or zero quaternion\r\n * @param babylonTransformNode\r\n * @param tangentType Specifies which type of tangent to handle (inTangent or outTangent)\r\n * @param outputs The animation data by keyframe\r\n * @param animationChannelTargetPath The target animation channel\r\n * @param interpolation The interpolation type\r\n * @param keyFrame The key frame with the animation data\r\n * @param frameDelta Time difference between two frames used to scale the tangent by the frame delta\r\n * @param useQuaternion Specifies if quaternions are used\r\n */\r\n private static _AddSplineTangent(\r\n tangentType: _TangentType,\r\n outputs: number[][],\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n interpolation: AnimationSamplerInterpolation,\r\n keyFrame: IAnimationKey,\r\n useQuaternion: boolean\r\n ) {\r\n let tangent: number[];\r\n const tangentValue: Vector3 | Quaternion | number = tangentType === _TangentType.INTANGENT ? keyFrame.inTangent : keyFrame.outTangent;\r\n if (interpolation === AnimationSamplerInterpolation.CUBICSPLINE) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n if (tangentValue) {\r\n if (useQuaternion) {\r\n tangent = (tangentValue as Quaternion).asArray();\r\n } else {\r\n const array = tangentValue as Vector3;\r\n tangent = Quaternion.RotationYawPitchRoll(array.y, array.x, array.z).asArray();\r\n }\r\n } else {\r\n tangent = [0, 0, 0, 0];\r\n }\r\n } else if (animationChannelTargetPath === AnimationChannelTargetPath.WEIGHTS) {\r\n if (tangentValue) {\r\n tangent = [tangentValue as number];\r\n } else {\r\n tangent = [0];\r\n }\r\n } else {\r\n if (tangentValue) {\r\n tangent = (tangentValue as Vector3).asArray();\r\n } else {\r\n tangent = [0, 0, 0];\r\n }\r\n }\r\n\r\n outputs.push(tangent);\r\n }\r\n }\r\n\r\n /**\r\n * Get the minimum and maximum key frames' frame values\r\n * @param keyFrames animation key frames\r\n * @returns the minimum and maximum key frame value\r\n */\r\n private static _CalculateMinMaxKeyFrames(keyFrames: IAnimationKey[]): { min: number; max: number } {\r\n let min: number = Infinity;\r\n let max: number = -Infinity;\r\n keyFrames.forEach(function (keyFrame) {\r\n min = Math.min(min, keyFrame.frame);\r\n max = Math.max(max, keyFrame.frame);\r\n });\r\n\r\n return { min: min, max: max };\r\n }\r\n}\r\n"]}
|
@@ -5,7 +5,6 @@ import { Vector3, Vector4 } from "@babylonjs/core/Maths/math.vector.js";
|
|
5
5
|
import type { Node } from "@babylonjs/core/node.js";
|
6
6
|
import { TransformNode } from "@babylonjs/core/Meshes/transformNode.js";
|
7
7
|
import type { SubMesh } from "@babylonjs/core/Meshes/subMesh.js";
|
8
|
-
import type { MorphTarget } from "@babylonjs/core/Morph/morphTarget.js";
|
9
8
|
import type { BaseTexture } from "@babylonjs/core/Materials/Textures/baseTexture.js";
|
10
9
|
import type { Texture } from "@babylonjs/core/Materials/Textures/texture.js";
|
11
10
|
import { Material } from "@babylonjs/core/Materials/material.js";
|
@@ -95,27 +94,11 @@ export declare class _Exporter {
|
|
95
94
|
mimeType: ImageMimeType;
|
96
95
|
};
|
97
96
|
};
|
98
|
-
|
99
|
-
data: ArrayBuffer;
|
100
|
-
mimeType: ImageMimeType;
|
101
|
-
}>;
|
97
|
+
private _orderedImageData;
|
102
98
|
/**
|
103
99
|
* Stores a map of the unique id of a node to its index in the node array
|
104
100
|
*/
|
105
|
-
_nodeMap
|
106
|
-
[key: number]: number;
|
107
|
-
};
|
108
|
-
/**
|
109
|
-
* Specifies if the source Babylon scene was left handed, and needed conversion.
|
110
|
-
*/
|
111
|
-
_convertToRightHandedSystem: boolean;
|
112
|
-
/**
|
113
|
-
* Specifies if a Babylon node should be converted to right-handed on export
|
114
|
-
*/
|
115
|
-
_convertToRightHandedSystemMap: {
|
116
|
-
[nodeId: number]: boolean;
|
117
|
-
};
|
118
|
-
_includeCoordinateSystemConversionNodes: boolean;
|
101
|
+
private _nodeMap;
|
119
102
|
/**
|
120
103
|
* Baked animation sample rate
|
121
104
|
*/
|
@@ -130,9 +113,9 @@ export declare class _Exporter {
|
|
130
113
|
private _applyExtensions;
|
131
114
|
_extensionsPreExportTextureAsync(context: string, babylonTexture: Nullable<Texture>, mimeType: ImageMimeType): Promise<Nullable<BaseTexture>>;
|
132
115
|
_extensionsPostExportMeshPrimitiveAsync(context: string, meshPrimitive: IMeshPrimitive, babylonSubMesh: SubMesh, binaryWriter: _BinaryWriter): Promise<Nullable<IMeshPrimitive>>;
|
133
|
-
_extensionsPostExportNodeAsync(context: string, node: Nullable<INode>, babylonNode: Node, nodeMap
|
116
|
+
_extensionsPostExportNodeAsync(context: string, node: Nullable<INode>, babylonNode: Node, nodeMap: {
|
134
117
|
[key: number]: number;
|
135
|
-
}, binaryWriter
|
118
|
+
}, binaryWriter: _BinaryWriter): Promise<Nullable<INode>>;
|
136
119
|
_extensionsPostExportMaterialAsync(context: string, material: Nullable<IMaterial>, babylonMaterial: Material): Promise<Nullable<IMaterial>>;
|
137
120
|
_extensionsPostExportMaterialAdditionalTextures(context: string, material: IMaterial, babylonMaterial: Material): BaseTexture[];
|
138
121
|
_extensionsPostExportTextures(context: string, textureInfo: ITextureInfo, babylonTexture: BaseTexture): void;
|
@@ -168,51 +151,40 @@ export declare class _Exporter {
|
|
168
151
|
* clock-wise during export to glTF
|
169
152
|
* @param submesh BabylonJS submesh
|
170
153
|
* @param primitiveMode Primitive mode of the mesh
|
171
|
-
* @param sideOrientation the winding order of the submesh
|
172
154
|
* @param vertexBufferKind The type of vertex attribute
|
173
155
|
* @param meshAttributeArray The vertex attribute data
|
174
156
|
* @param byteOffset The offset to the binary data
|
175
157
|
* @param binaryWriter The binary data for the glTF file
|
176
|
-
* @param convertToRightHandedSystem Converts the values to right-handed
|
177
158
|
*/
|
178
159
|
private _reorderVertexAttributeDataBasedOnPrimitiveMode;
|
179
160
|
/**
|
180
161
|
* Reorders the vertex attributes in the correct triangle mode order . This is necessary when indices are not available and the winding order is
|
181
162
|
* clock-wise during export to glTF
|
182
163
|
* @param submesh BabylonJS submesh
|
183
|
-
* @param primitiveMode Primitive mode of the mesh
|
184
|
-
* @param sideOrientation the winding order of the submesh
|
185
164
|
* @param vertexBufferKind The type of vertex attribute
|
186
165
|
* @param meshAttributeArray The vertex attribute data
|
187
166
|
* @param byteOffset The offset to the binary data
|
188
167
|
* @param binaryWriter The binary data for the glTF file
|
189
|
-
* @param convertToRightHandedSystem Converts the values to right-handed
|
190
168
|
*/
|
191
169
|
private _reorderTriangleFillMode;
|
192
170
|
/**
|
193
171
|
* Reorders the vertex attributes in the correct triangle strip order. This is necessary when indices are not available and the winding order is
|
194
172
|
* clock-wise during export to glTF
|
195
173
|
* @param submesh BabylonJS submesh
|
196
|
-
* @param primitiveMode Primitive mode of the mesh
|
197
|
-
* @param sideOrientation the winding order of the submesh
|
198
174
|
* @param vertexBufferKind The type of vertex attribute
|
199
175
|
* @param meshAttributeArray The vertex attribute data
|
200
176
|
* @param byteOffset The offset to the binary data
|
201
177
|
* @param binaryWriter The binary data for the glTF file
|
202
|
-
* @param convertToRightHandedSystem Converts the values to right-handed
|
203
178
|
*/
|
204
179
|
private _reorderTriangleStripDrawMode;
|
205
180
|
/**
|
206
181
|
* Reorders the vertex attributes in the correct triangle fan order. This is necessary when indices are not available and the winding order is
|
207
182
|
* clock-wise during export to glTF
|
208
183
|
* @param submesh BabylonJS submesh
|
209
|
-
* @param primitiveMode Primitive mode of the mesh
|
210
|
-
* @param sideOrientation the winding order of the submesh
|
211
184
|
* @param vertexBufferKind The type of vertex attribute
|
212
185
|
* @param meshAttributeArray The vertex attribute data
|
213
186
|
* @param byteOffset The offset to the binary data
|
214
187
|
* @param binaryWriter The binary data for the glTF file
|
215
|
-
* @param convertToRightHandedSystem Converts the values to right-handed
|
216
188
|
*/
|
217
189
|
private _reorderTriangleFanMode;
|
218
190
|
/**
|
@@ -220,9 +192,7 @@ export declare class _Exporter {
|
|
220
192
|
* @param vertices The vertices to write to the binary writer
|
221
193
|
* @param byteOffset The offset into the binary writer to overwrite binary data
|
222
194
|
* @param vertexAttributeKind The vertex attribute type
|
223
|
-
* @param meshAttributeArray The vertex attribute data
|
224
195
|
* @param binaryWriter The writer containing the binary data
|
225
|
-
* @param convertToRightHandedSystem Converts the values to right-handed
|
226
196
|
*/
|
227
197
|
private _writeVertexAttributeData;
|
228
198
|
/**
|
@@ -233,10 +203,9 @@ export declare class _Exporter {
|
|
233
203
|
* @param meshAttributeArray Array containing the attribute data
|
234
204
|
* @param stride Specifies the space between data
|
235
205
|
* @param binaryWriter The buffer to write the binary data to
|
236
|
-
* @param convertToRightHandedSystem Converts the values to right-handed
|
237
206
|
* @param babylonTransformNode
|
238
207
|
*/
|
239
|
-
_writeAttributeData(vertexBufferKind: string, attributeComponentKind: AccessorComponentType, meshAttributeArray: FloatArray, stride: number, binaryWriter: _BinaryWriter,
|
208
|
+
_writeAttributeData(vertexBufferKind: string, attributeComponentKind: AccessorComponentType, meshAttributeArray: FloatArray, stride: number, binaryWriter: _BinaryWriter, babylonTransformNode: TransformNode): void;
|
240
209
|
/**
|
241
210
|
* Writes mesh attribute data to a data buffer
|
242
211
|
* Returns the bytelength of the data
|
@@ -248,10 +217,9 @@ export declare class _Exporter {
|
|
248
217
|
* @param morphTargetAttributeArray
|
249
218
|
* @param stride Specifies the space between data
|
250
219
|
* @param binaryWriter The buffer to write the binary data to
|
251
|
-
* @param convertToRightHandedSystem Converts the values to right-handed
|
252
220
|
* @param minMax
|
253
221
|
*/
|
254
|
-
writeMorphTargetAttributeData(vertexBufferKind: string, attributeComponentKind: AccessorComponentType, meshPrimitive: SubMesh,
|
222
|
+
writeMorphTargetAttributeData(vertexBufferKind: string, attributeComponentKind: AccessorComponentType, meshPrimitive: SubMesh, meshAttributeArray: FloatArray, morphTargetAttributeArray: FloatArray, stride: number, binaryWriter: _BinaryWriter, minMax?: any): void;
|
255
223
|
/**
|
256
224
|
* Generates glTF json data
|
257
225
|
* @param shouldUseGlb Indicates whether the json should be written for a glb file
|
@@ -286,7 +254,6 @@ export declare class _Exporter {
|
|
286
254
|
* Sets the TRS for each node
|
287
255
|
* @param node glTF Node for storing the transformation data
|
288
256
|
* @param babylonTransformNode Babylon mesh used as the source for the transformation data
|
289
|
-
* @param convertToRightHandedSystem Converts the values to right-handed
|
290
257
|
*/
|
291
258
|
private _setNodeTransformation;
|
292
259
|
private _setCameraTransformation;
|
@@ -298,7 +265,6 @@ export declare class _Exporter {
|
|
298
265
|
* @param babylonTransformNode The Babylon mesh to get the vertices data from
|
299
266
|
* @param binaryWriter The buffer to write the bufferview data to
|
300
267
|
* @param byteStride
|
301
|
-
* @param convertToRightHandedSystem Converts the values to right-handed
|
302
268
|
*/
|
303
269
|
private _createBufferViewKind;
|
304
270
|
/**
|
@@ -307,7 +273,6 @@ export declare class _Exporter {
|
|
307
273
|
* @param meshPrimitive
|
308
274
|
* @param babylonMorphTarget the morph target to be exported
|
309
275
|
* @param binaryWriter The buffer to write the bufferview data to
|
310
|
-
* @param convertToRightHandedSystem Converts the values to right-handed
|
311
276
|
*/
|
312
277
|
private _setMorphTargetAttributes;
|
313
278
|
/**
|
@@ -333,15 +298,8 @@ export declare class _Exporter {
|
|
333
298
|
* @param mesh glTF Mesh object to store the primitive attribute information
|
334
299
|
* @param babylonTransformNode Babylon mesh to get the primitive attribute data from
|
335
300
|
* @param binaryWriter Buffer to write the attribute data to
|
336
|
-
* @param convertToRightHandedSystem Converts the values to right-handed
|
337
301
|
*/
|
338
302
|
private _setPrimitiveAttributesAsync;
|
339
|
-
/**
|
340
|
-
* Check if the node is used to convert its descendants from a right handed coordinate system to the Babylon scene's coordinate system.
|
341
|
-
* @param node The node to check
|
342
|
-
* @returns True if the node is used to convert its descendants from right-handed to left-handed. False otherwise
|
343
|
-
*/
|
344
|
-
private _isBabylonCoordinateSystemConvertingNode;
|
345
303
|
/**
|
346
304
|
* Creates a glTF scene based on the array of meshes
|
347
305
|
* Returns the the total byte offset
|
@@ -358,7 +316,6 @@ export declare class _Exporter {
|
|
358
316
|
private _getExportNodes;
|
359
317
|
/**
|
360
318
|
* Creates a mapping of Node unique id to node index and handles animations
|
361
|
-
* @param babylonScene Babylon Scene
|
362
319
|
* @param nodes Babylon transform nodes
|
363
320
|
* @param binaryWriter Buffer to write binary data to
|
364
321
|
* @returns Node mapping of unique id to index
|
@@ -368,7 +325,6 @@ export declare class _Exporter {
|
|
368
325
|
* Creates a glTF node from a Babylon mesh
|
369
326
|
* @param babylonNode Source Babylon mesh
|
370
327
|
* @param binaryWriter Buffer for storing geometry data
|
371
|
-
* @param convertToRightHandedSystem Converts the values to right-handed
|
372
328
|
* @returns glTF node
|
373
329
|
*/
|
374
330
|
private _createNodeAsync;
|