@aura3d/engine 1.1.0 → 1.3.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/README.md +49 -44
- package/dist/animation/AnimationClipEvents.d.ts +55 -0
- package/dist/animation/AnimationClipEvents.d.ts.map +1 -1
- package/dist/animation/AnimationClipEvents.js +136 -0
- package/dist/animation/AnimationClipEvents.js.map +1 -1
- package/dist/animation/AnimationClipRegistry.d.ts +9 -3
- package/dist/animation/AnimationClipRegistry.d.ts.map +1 -1
- package/dist/animation/AnimationClipRegistry.js +52 -5
- package/dist/animation/AnimationClipRegistry.js.map +1 -1
- package/dist/animation/AnimationController.d.ts +6 -6
- package/dist/animation/AnimationController.d.ts.map +1 -1
- package/dist/animation/AnimationController.js +3 -3
- package/dist/animation/AnimationController.js.map +1 -1
- package/dist/animation/AnimationMixer.d.ts +10 -0
- package/dist/animation/AnimationMixer.d.ts.map +1 -1
- package/dist/animation/AnimationMixer.js +35 -0
- package/dist/animation/AnimationMixer.js.map +1 -1
- package/dist/animation/AnimationStateGraph.d.ts +14 -5
- package/dist/animation/AnimationStateGraph.d.ts.map +1 -1
- package/dist/animation/AnimationStateGraph.js +25 -2
- package/dist/animation/AnimationStateGraph.js.map +1 -1
- package/dist/animation/AnimationStateMachine.d.ts +26 -0
- package/dist/animation/AnimationStateMachine.d.ts.map +1 -1
- package/dist/animation/AnimationStateMachine.js +32 -0
- package/dist/animation/AnimationStateMachine.js.map +1 -1
- package/dist/animation/Bone.d.ts +4 -0
- package/dist/animation/Bone.d.ts.map +1 -1
- package/dist/animation/Bone.js +3 -0
- package/dist/animation/Bone.js.map +1 -1
- package/dist/animation/FighterAnimationAdapter.d.ts +49 -0
- package/dist/animation/FighterAnimationAdapter.d.ts.map +1 -0
- package/dist/animation/FighterAnimationAdapter.js +71 -0
- package/dist/animation/FighterAnimationAdapter.js.map +1 -0
- package/dist/animation/FootIk.d.ts +77 -0
- package/dist/animation/FootIk.d.ts.map +1 -0
- package/dist/animation/FootIk.js +153 -0
- package/dist/animation/FootIk.js.map +1 -0
- package/dist/animation/HumanoidBoneInference.d.ts +61 -0
- package/dist/animation/HumanoidBoneInference.d.ts.map +1 -0
- package/dist/animation/HumanoidBoneInference.js +239 -0
- package/dist/animation/HumanoidBoneInference.js.map +1 -0
- package/dist/animation/HumanoidRetargeting.d.ts +48 -4
- package/dist/animation/HumanoidRetargeting.d.ts.map +1 -1
- package/dist/animation/HumanoidRetargeting.js +149 -14
- package/dist/animation/HumanoidRetargeting.js.map +1 -1
- package/dist/animation/IK.d.ts +5 -0
- package/dist/animation/IK.d.ts.map +1 -1
- package/dist/animation/IK.js +9 -0
- package/dist/animation/IK.js.map +1 -1
- package/dist/animation/Inertialization.d.ts +65 -0
- package/dist/animation/Inertialization.d.ts.map +1 -0
- package/dist/animation/Inertialization.js +211 -0
- package/dist/animation/Inertialization.js.map +1 -0
- package/dist/animation/LocomotionController.d.ts +5 -0
- package/dist/animation/LocomotionController.d.ts.map +1 -1
- package/dist/animation/LocomotionController.js +3 -0
- package/dist/animation/LocomotionController.js.map +1 -1
- package/dist/animation/LocomotionKit.d.ts +52 -0
- package/dist/animation/LocomotionKit.d.ts.map +1 -0
- package/dist/animation/LocomotionKit.js +38 -0
- package/dist/animation/LocomotionKit.js.map +1 -0
- package/dist/animation/MotionQuality.d.ts +3 -3
- package/dist/animation/MotionQuality.d.ts.map +1 -1
- package/dist/animation/MotionQuality.js +2 -2
- package/dist/animation/MotionQuality.js.map +1 -1
- package/dist/animation/RigQuality.d.ts +31 -0
- package/dist/animation/RigQuality.d.ts.map +1 -0
- package/dist/animation/RigQuality.js +70 -0
- package/dist/animation/RigQuality.js.map +1 -0
- package/dist/animation/SecondaryAnimationFixtures.d.ts.map +1 -1
- package/dist/animation/SecondaryAnimationFixtures.js +1 -3
- package/dist/animation/SecondaryAnimationFixtures.js.map +1 -1
- package/dist/animation/Skeleton.d.ts +16 -1
- package/dist/animation/Skeleton.d.ts.map +1 -1
- package/dist/animation/Skeleton.js +42 -0
- package/dist/animation/Skeleton.js.map +1 -1
- package/dist/animation/SpringBones.d.ts +60 -0
- package/dist/animation/SpringBones.d.ts.map +1 -0
- package/dist/animation/SpringBones.js +173 -0
- package/dist/animation/SpringBones.js.map +1 -0
- package/dist/animation/browser-index.d.ts +12 -3
- package/dist/animation/browser-index.d.ts.map +1 -1
- package/dist/animation/browser-index.js +11 -2
- package/dist/animation/browser-index.js.map +1 -1
- package/dist/animation/index.d.ts +11 -3
- package/dist/animation/index.d.ts.map +1 -1
- package/dist/animation/index.js +10 -2
- package/dist/animation/index.js.map +1 -1
- package/dist/animation/library/performanceStateGraph.d.ts +42 -0
- package/dist/animation/library/performanceStateGraph.d.ts.map +1 -0
- package/dist/animation/library/performanceStateGraph.js +101 -0
- package/dist/animation/library/performanceStateGraph.js.map +1 -0
- package/dist/animation/library/standardHumanoidClips.d.ts +27 -0
- package/dist/animation/library/standardHumanoidClips.d.ts.map +1 -0
- package/dist/animation/library/standardHumanoidClips.js +357 -0
- package/dist/animation/library/standardHumanoidClips.js.map +1 -0
- package/dist/assets/GLTFAnimationRuntime.d.ts +85 -0
- package/dist/assets/GLTFAnimationRuntime.d.ts.map +1 -1
- package/dist/assets/GLTFAnimationRuntime.js +143 -0
- package/dist/assets/GLTFAnimationRuntime.js.map +1 -1
- package/dist/assets/GLTFAutoFit.d.ts +61 -0
- package/dist/assets/GLTFAutoFit.d.ts.map +1 -0
- package/dist/assets/GLTFAutoFit.js +77 -0
- package/dist/assets/GLTFAutoFit.js.map +1 -0
- package/dist/assets/GLTFLoader.d.ts +21 -0
- package/dist/assets/GLTFLoader.d.ts.map +1 -1
- package/dist/assets/GLTFLoader.js +60 -15
- package/dist/assets/GLTFLoader.js.map +1 -1
- package/dist/assets/GLTFRenderResources.d.ts +9 -1
- package/dist/assets/GLTFRenderResources.d.ts.map +1 -1
- package/dist/assets/GLTFRenderResources.js +93 -4
- package/dist/assets/GLTFRenderResources.js.map +1 -1
- package/dist/assets/browser-index.d.ts +6 -4
- package/dist/assets/browser-index.d.ts.map +1 -1
- package/dist/assets/browser-index.js +3 -2
- package/dist/assets/browser-index.js.map +1 -1
- package/dist/assets/index.d.ts +7 -5
- package/dist/assets/index.d.ts.map +1 -1
- package/dist/assets/index.js +4 -3
- package/dist/assets/index.js.map +1 -1
- package/dist/audio/AudioMixer.d.ts +3 -3
- package/dist/audio/AudioMixer.d.ts.map +1 -1
- package/dist/audio/AudioMixer.js +1 -1
- package/dist/audio/AudioMixer.js.map +1 -1
- package/dist/audio/index.d.ts +2 -2
- package/dist/audio/index.d.ts.map +1 -1
- package/dist/audio/index.js +1 -1
- package/dist/audio/index.js.map +1 -1
- package/dist/aura3d-cli/animation-asset-profiles.d.ts +15 -0
- package/dist/aura3d-cli/animation-asset-profiles.d.ts.map +1 -0
- package/dist/aura3d-cli/animation-asset-profiles.js +46 -0
- package/dist/aura3d-cli/animation-asset-profiles.js.map +1 -0
- package/dist/aura3d-cli/animation-asset-validator.d.ts +22 -0
- package/dist/aura3d-cli/animation-asset-validator.d.ts.map +1 -0
- package/dist/aura3d-cli/animation-asset-validator.js +49 -0
- package/dist/aura3d-cli/animation-asset-validator.js.map +1 -0
- package/dist/aura3d-cli/cli.js +40 -17
- package/dist/aura3d-cli/cli.js.map +1 -1
- package/dist/aura3d-cli/game-asset-validator.d.ts +4 -4
- package/dist/aura3d-cli/game-asset-validator.d.ts.map +1 -1
- package/dist/aura3d-cli/game-asset-validator.js +2 -2
- package/dist/aura3d-cli/game-asset-validator.js.map +1 -1
- package/dist/aura3d-cli/index.d.ts +32 -19
- package/dist/aura3d-cli/index.d.ts.map +1 -1
- package/dist/aura3d-cli/index.js +101 -68
- package/dist/aura3d-cli/index.js.map +1 -1
- package/dist/aura3d-cli/pull-bridge.d.ts +30 -4
- package/dist/aura3d-cli/pull-bridge.d.ts.map +1 -1
- package/dist/aura3d-cli/pull-bridge.js +320 -51
- package/dist/aura3d-cli/pull-bridge.js.map +1 -1
- package/dist/create-aura3d/index.d.ts +1 -1
- package/dist/create-aura3d/index.d.ts.map +1 -1
- package/dist/create-aura3d/index.js +6 -4
- package/dist/create-aura3d/index.js.map +1 -1
- package/dist/editor-runtime/AnimationSceneEditor.d.ts +111 -0
- package/dist/editor-runtime/AnimationSceneEditor.d.ts.map +1 -0
- package/dist/editor-runtime/AnimationSceneEditor.js +285 -0
- package/dist/editor-runtime/AnimationSceneEditor.js.map +1 -0
- package/dist/editor-runtime/AssetDropZone.d.ts +9 -9
- package/dist/editor-runtime/AssetDropZone.d.ts.map +1 -1
- package/dist/editor-runtime/AssetDropZone.js +4 -4
- package/dist/editor-runtime/AssetDropZone.js.map +1 -1
- package/dist/editor-runtime/EventTrackEditor.d.ts +54 -0
- package/dist/editor-runtime/EventTrackEditor.d.ts.map +1 -0
- package/dist/editor-runtime/EventTrackEditor.js +124 -0
- package/dist/editor-runtime/EventTrackEditor.js.map +1 -0
- package/dist/editor-runtime/SceneOutliner.d.ts +3 -3
- package/dist/editor-runtime/SceneOutliner.d.ts.map +1 -1
- package/dist/editor-runtime/SceneOutliner.js.map +1 -1
- package/dist/editor-runtime/index.d.ts +5 -3
- package/dist/editor-runtime/index.d.ts.map +1 -1
- package/dist/editor-runtime/index.js +2 -1
- package/dist/editor-runtime/index.js.map +1 -1
- package/dist/engine/agent-api/AnimationAssetManifest.d.ts +50 -0
- package/dist/engine/agent-api/AnimationAssetManifest.d.ts.map +1 -0
- package/dist/engine/agent-api/AnimationAssetManifest.js +65 -0
- package/dist/engine/agent-api/AnimationAssetManifest.js.map +1 -0
- package/dist/engine/agent-api/AnimationDirector.d.ts +120 -0
- package/dist/engine/agent-api/AnimationDirector.d.ts.map +1 -0
- package/dist/engine/agent-api/AnimationDirector.js +432 -0
- package/dist/engine/agent-api/AnimationDirector.js.map +1 -0
- package/dist/engine/agent-api/AnimationEpisodePackage.d.ts +51 -0
- package/dist/engine/agent-api/AnimationEpisodePackage.d.ts.map +1 -0
- package/dist/engine/agent-api/AnimationEpisodePackage.js +79 -0
- package/dist/engine/agent-api/AnimationEpisodePackage.js.map +1 -0
- package/dist/engine/agent-api/AnimationMotionQuality.d.ts +83 -0
- package/dist/engine/agent-api/AnimationMotionQuality.d.ts.map +1 -0
- package/dist/engine/agent-api/AnimationMotionQuality.js +128 -0
- package/dist/engine/agent-api/AnimationMotionQuality.js.map +1 -0
- package/dist/engine/agent-api/AnimationPerformance.d.ts +150 -0
- package/dist/engine/agent-api/AnimationPerformance.d.ts.map +1 -0
- package/dist/engine/agent-api/AnimationPerformance.js +345 -0
- package/dist/engine/agent-api/AnimationPerformance.js.map +1 -0
- package/dist/engine/agent-api/AnimationRenderQueue.d.ts +143 -0
- package/dist/engine/agent-api/AnimationRenderQueue.d.ts.map +1 -0
- package/dist/engine/agent-api/AnimationRenderQueue.js +410 -0
- package/dist/engine/agent-api/AnimationRenderQueue.js.map +1 -0
- package/dist/engine/agent-api/AnimationRouteProof.d.ts +112 -0
- package/dist/engine/agent-api/AnimationRouteProof.d.ts.map +1 -0
- package/dist/engine/agent-api/AnimationRouteProof.js +127 -0
- package/dist/engine/agent-api/AnimationRouteProof.js.map +1 -0
- package/dist/engine/agent-api/AssetLibraryBrowser.d.ts +6 -6
- package/dist/engine/agent-api/AssetLibraryBrowser.d.ts.map +1 -1
- package/dist/engine/agent-api/AssetLibraryBrowser.js +6 -6
- package/dist/engine/agent-api/AssetLibraryBrowser.js.map +1 -1
- package/dist/engine/agent-api/AuraVoiceBridge.d.ts +7 -7
- package/dist/engine/agent-api/AuraVoiceBridge.d.ts.map +1 -1
- package/dist/engine/agent-api/AuraVoiceBridge.js +5 -5
- package/dist/engine/agent-api/AuraVoiceBridge.js.map +1 -1
- package/dist/engine/agent-api/BatchEpisodeRenderer.d.ts +5 -5
- package/dist/engine/agent-api/BatchEpisodeRenderer.d.ts.map +1 -1
- package/dist/engine/agent-api/BatchEpisodeRenderer.js.map +1 -1
- package/dist/engine/agent-api/BodyLanguageLibrary.d.ts +3 -3
- package/dist/engine/agent-api/BodyLanguageLibrary.d.ts.map +1 -1
- package/dist/engine/agent-api/BodyLanguageLibrary.js.map +1 -1
- package/dist/engine/agent-api/BrowserFrameCaptureAdapter.d.ts +4 -4
- package/dist/engine/agent-api/BrowserFrameCaptureAdapter.d.ts.map +1 -1
- package/dist/engine/agent-api/BrowserFrameCaptureAdapter.js +2 -2
- package/dist/engine/agent-api/BrowserFrameCaptureAdapter.js.map +1 -1
- package/dist/engine/agent-api/CharacterAssembly.d.ts +2 -2
- package/dist/engine/agent-api/CharacterAssembly.d.ts.map +1 -1
- package/dist/engine/agent-api/CloudRenderAdapter.d.ts +4 -4
- package/dist/engine/agent-api/CloudRenderAdapter.d.ts.map +1 -1
- package/dist/engine/agent-api/FfmpegFrameEncoder.d.ts +129 -0
- package/dist/engine/agent-api/FfmpegFrameEncoder.d.ts.map +1 -0
- package/dist/engine/agent-api/FfmpegFrameEncoder.js +306 -0
- package/dist/engine/agent-api/FfmpegFrameEncoder.js.map +1 -0
- package/dist/engine/agent-api/FrameEncoder.d.ts +5 -5
- package/dist/engine/agent-api/FrameEncoder.d.ts.map +1 -1
- package/dist/engine/agent-api/GameAssetValidation.d.ts +1 -1
- package/dist/engine/agent-api/GameAssetValidation.d.ts.map +1 -1
- package/dist/engine/agent-api/MediaRecorderFrameEncoder.d.ts.map +1 -1
- package/dist/engine/agent-api/MediaRecorderFrameEncoder.js +7 -2
- package/dist/engine/agent-api/MediaRecorderFrameEncoder.js.map +1 -1
- package/dist/engine/agent-api/PerformanceBlender.d.ts +5 -5
- package/dist/engine/agent-api/PerformanceBlender.d.ts.map +1 -1
- package/dist/engine/agent-api/PerformanceBlender.js.map +1 -1
- package/dist/engine/agent-api/PerformanceCaptureSession.d.ts +5 -5
- package/dist/engine/agent-api/PerformanceCaptureSession.d.ts.map +1 -1
- package/dist/engine/agent-api/PerformanceCaptureSession.js +2 -2
- package/dist/engine/agent-api/PerformanceCaptureSession.js.map +1 -1
- package/dist/engine/agent-api/PerformancePoseEditor.d.ts +8 -8
- package/dist/engine/agent-api/PerformancePoseEditor.d.ts.map +1 -1
- package/dist/engine/agent-api/PerformancePoseEditor.js.map +1 -1
- package/dist/engine/agent-api/PngSequenceEncoder.d.ts +4 -4
- package/dist/engine/agent-api/PngSequenceEncoder.d.ts.map +1 -1
- package/dist/engine/agent-api/PromptAnimationContract.d.ts +2 -2
- package/dist/engine/agent-api/PromptAnimationContract.d.ts.map +1 -1
- package/dist/engine/agent-api/PromptAnimationEvidence.d.ts +2 -2
- package/dist/engine/agent-api/PromptAnimationEvidence.d.ts.map +1 -1
- package/dist/engine/agent-api/PublishingPipeline.d.ts +3 -3
- package/dist/engine/agent-api/PublishingPipeline.d.ts.map +1 -1
- package/dist/engine/agent-api/RuntimeNodeHandle.d.ts +2 -0
- package/dist/engine/agent-api/RuntimeNodeHandle.d.ts.map +1 -1
- package/dist/engine/agent-api/RuntimeNodeHandle.js.map +1 -1
- package/dist/engine/agent-api/SceneGroundingUtils.d.ts +73 -0
- package/dist/engine/agent-api/SceneGroundingUtils.d.ts.map +1 -0
- package/dist/engine/agent-api/SceneGroundingUtils.js +74 -0
- package/dist/engine/agent-api/SceneGroundingUtils.js.map +1 -0
- package/dist/engine/agent-api/ShotTimeline.d.ts +3 -3
- package/dist/engine/agent-api/ShotTimeline.d.ts.map +1 -1
- package/dist/engine/agent-api/ShotTimeline.js.map +1 -1
- package/dist/engine/agent-api/ThumbnailGenerator.d.ts +4 -4
- package/dist/engine/agent-api/ThumbnailGenerator.d.ts.map +1 -1
- package/dist/engine/agent-api/ThumbnailGenerator.js.map +1 -1
- package/dist/engine/agent-api/VideoExportPipeline.d.ts +9 -9
- package/dist/engine/agent-api/VideoExportPipeline.d.ts.map +1 -1
- package/dist/engine/agent-api/VideoExportPipeline.js.map +1 -1
- package/dist/engine/agent-api/VisemeController.d.ts +12 -0
- package/dist/engine/agent-api/VisemeController.d.ts.map +1 -1
- package/dist/engine/agent-api/VisemeController.js +23 -0
- package/dist/engine/agent-api/VisemeController.js.map +1 -1
- package/dist/engine/agent-api/YouTubeMetadataGenerator.d.ts +2 -2
- package/dist/engine/agent-api/YouTubeMetadataGenerator.d.ts.map +1 -1
- package/dist/engine/agent-api/YouTubeMetadataGenerator.js +1 -1
- package/dist/engine/agent-api/YouTubeMetadataGenerator.js.map +1 -1
- package/dist/engine/agent-api/humanoid-walk-runtime.d.ts +1 -1
- package/dist/engine/agent-api/index.d.ts +43 -38
- package/dist/engine/agent-api/index.d.ts.map +1 -1
- package/dist/engine/agent-api/index.js +42 -28
- package/dist/engine/agent-api/index.js.map +1 -1
- package/dist/engine/agent-api/product-viewer-runtime.d.ts.map +1 -1
- package/dist/engine/animation-studio/animation-episode-validator.d.ts +24 -0
- package/dist/engine/animation-studio/animation-episode-validator.d.ts.map +1 -0
- package/dist/engine/animation-studio/animation-episode-validator.js +74 -0
- package/dist/engine/animation-studio/animation-episode-validator.js.map +1 -0
- package/dist/engine/animation-studio/director-heuristics.d.ts +73 -0
- package/dist/engine/animation-studio/director-heuristics.d.ts.map +1 -0
- package/dist/engine/animation-studio/director-heuristics.js +149 -0
- package/dist/engine/animation-studio/director-heuristics.js.map +1 -0
- package/dist/engine/animation-studio/episode-document.d.ts +214 -0
- package/dist/engine/animation-studio/episode-document.d.ts.map +1 -0
- package/dist/engine/animation-studio/episode-document.js +143 -0
- package/dist/engine/animation-studio/episode-document.js.map +1 -0
- package/dist/engine/animation-studio/index.d.ts +20 -0
- package/dist/engine/animation-studio/index.d.ts.map +1 -0
- package/dist/engine/animation-studio/index.js +20 -0
- package/dist/engine/animation-studio/index.js.map +1 -0
- package/dist/engine/animation-studio/scene-tools.d.ts +34 -0
- package/dist/engine/animation-studio/scene-tools.d.ts.map +1 -0
- package/dist/engine/animation-studio/scene-tools.js +95 -0
- package/dist/engine/animation-studio/scene-tools.js.map +1 -0
- package/dist/engine/index.d.ts +2 -2
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +1 -1
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/production-runtime/TypedGLBActor.d.ts +13 -1
- package/dist/engine/production-runtime/TypedGLBActor.d.ts.map +1 -1
- package/dist/engine/production-runtime/TypedGLBActor.js +8 -0
- package/dist/engine/production-runtime/TypedGLBActor.js.map +1 -1
- package/dist/physics/Raycast.d.ts +17 -0
- package/dist/physics/Raycast.d.ts.map +1 -1
- package/dist/physics/Raycast.js +16 -0
- package/dist/physics/Raycast.js.map +1 -1
- package/dist/rendering/ForwardPass.js +18 -13
- package/dist/rendering/ForwardPass.js.map +1 -1
- package/dist/rendering/MorphTargetPlan.d.ts +42 -0
- package/dist/rendering/MorphTargetPlan.d.ts.map +1 -0
- package/dist/rendering/MorphTargetPlan.js +129 -0
- package/dist/rendering/MorphTargetPlan.js.map +1 -0
- package/dist/rendering/MorphUnlitMaterial.d.ts.map +1 -1
- package/dist/rendering/MorphUnlitMaterial.js +7 -1
- package/dist/rendering/MorphUnlitMaterial.js.map +1 -1
- package/dist/rendering/ShaderLibrary.d.ts.map +1 -1
- package/dist/rendering/ShaderLibrary.js +34 -6
- package/dist/rendering/ShaderLibrary.js.map +1 -1
- package/dist/rendering/WebGPUDevice.d.ts +2 -0
- package/dist/rendering/WebGPUDevice.d.ts.map +1 -1
- package/dist/rendering/WebGPUDevice.js +69 -12
- package/dist/rendering/WebGPUDevice.js.map +1 -1
- package/dist/rendering/animation/AnimationMaterialStyle.d.ts +19 -0
- package/dist/rendering/animation/AnimationMaterialStyle.d.ts.map +1 -0
- package/dist/rendering/animation/AnimationMaterialStyle.js +13 -0
- package/dist/rendering/animation/AnimationMaterialStyle.js.map +1 -0
- package/dist/rendering/animation/AnimationRenderPreset.d.ts +36 -0
- package/dist/rendering/animation/AnimationRenderPreset.d.ts.map +1 -0
- package/dist/rendering/animation/AnimationRenderPreset.js +23 -0
- package/dist/rendering/animation/AnimationRenderPreset.js.map +1 -0
- package/dist/rendering/animation/AnimationToonMaterial.d.ts +130 -0
- package/dist/rendering/animation/AnimationToonMaterial.d.ts.map +1 -0
- package/dist/rendering/animation/AnimationToonMaterial.js +303 -0
- package/dist/rendering/animation/AnimationToonMaterial.js.map +1 -0
- package/dist/rendering/animation/AnimationVisualQuality.d.ts +28 -0
- package/dist/rendering/animation/AnimationVisualQuality.d.ts.map +1 -0
- package/dist/rendering/animation/AnimationVisualQuality.js +39 -0
- package/dist/rendering/animation/AnimationVisualQuality.js.map +1 -0
- package/dist/rendering/animation/applyAnimationRenderPreset.d.ts +79 -0
- package/dist/rendering/animation/applyAnimationRenderPreset.d.ts.map +1 -0
- package/dist/rendering/animation/applyAnimationRenderPreset.js +88 -0
- package/dist/rendering/animation/applyAnimationRenderPreset.js.map +1 -0
- package/dist/rendering/animation/index.d.ts +6 -0
- package/dist/rendering/animation/index.d.ts.map +1 -0
- package/dist/rendering/animation/index.js +6 -0
- package/dist/rendering/animation/index.js.map +1 -0
- package/dist/rendering/cartoon/CartoonToonMaterial.d.ts +130 -0
- package/dist/rendering/cartoon/CartoonToonMaterial.d.ts.map +1 -0
- package/dist/rendering/cartoon/CartoonToonMaterial.js +303 -0
- package/dist/rendering/cartoon/CartoonToonMaterial.js.map +1 -0
- package/dist/rendering/cartoon/applyCartoonRenderPreset.d.ts +79 -0
- package/dist/rendering/cartoon/applyCartoonRenderPreset.d.ts.map +1 -0
- package/dist/rendering/cartoon/applyCartoonRenderPreset.js +88 -0
- package/dist/rendering/cartoon/applyCartoonRenderPreset.js.map +1 -0
- package/dist/rendering/cartoon/index.d.ts +2 -0
- package/dist/rendering/cartoon/index.d.ts.map +1 -1
- package/dist/rendering/cartoon/index.js +2 -0
- package/dist/rendering/cartoon/index.js.map +1 -1
- package/dist/rendering/index.d.ts +4 -2
- package/dist/rendering/index.d.ts.map +1 -1
- package/dist/rendering/index.js +3 -2
- package/dist/rendering/index.js.map +1 -1
- package/dist/scripting/AnimationNodeCategories.d.ts +3 -0
- package/dist/scripting/AnimationNodeCategories.d.ts.map +1 -0
- package/dist/scripting/AnimationNodeCategories.js +9 -0
- package/dist/scripting/AnimationNodeCategories.js.map +1 -0
- package/dist/scripting/AnimationVisualNodes.d.ts +3 -0
- package/dist/scripting/AnimationVisualNodes.d.ts.map +1 -0
- package/dist/scripting/AnimationVisualNodes.js +41 -0
- package/dist/scripting/AnimationVisualNodes.js.map +1 -0
- package/dist/scripting/VisualGraphExecutor.js +24 -24
- package/dist/scripting/VisualGraphExecutor.js.map +1 -1
- package/dist/scripting/VisualNodeCatalog.js +2 -2
- package/dist/scripting/VisualNodeCatalog.js.map +1 -1
- package/dist/scripting/index.d.ts +3 -3
- package/dist/scripting/index.d.ts.map +1 -1
- package/dist/scripting/index.js +2 -2
- package/dist/scripting/index.js.map +1 -1
- package/package.json +150 -126
|
@@ -42,13 +42,39 @@ export type AnimationStateMachineGraphSnapshot = {
|
|
|
42
42
|
readonly states: readonly AnimationStateMachineGraphState[];
|
|
43
43
|
readonly transitions: readonly AnimationStateMachineGraphTransition[];
|
|
44
44
|
};
|
|
45
|
+
/** Inertialized blend between the previously-active state and the current state. */
|
|
46
|
+
export type AnimationStateBlend = {
|
|
47
|
+
/** State exited at the last transition (equals `to` when no transition is in flight). */
|
|
48
|
+
readonly from: string;
|
|
49
|
+
/** Currently-active state. */
|
|
50
|
+
readonly to: string;
|
|
51
|
+
/** [fromWeight, toWeight], summing to 1; fromWeight decays critically-damped after a switch. */
|
|
52
|
+
readonly weights: readonly [number, number];
|
|
53
|
+
/** Seconds since the last state change. */
|
|
54
|
+
readonly elapsed: number;
|
|
55
|
+
/** True once the previous state has effectively faded out. */
|
|
56
|
+
readonly done: boolean;
|
|
57
|
+
};
|
|
45
58
|
export declare class AnimationStateMachine {
|
|
46
59
|
readonly states: Map<string, AnimationState>;
|
|
47
60
|
readonly parameters: Record<string, number | boolean | string>;
|
|
48
61
|
currentState: string;
|
|
49
62
|
stateTime: number;
|
|
63
|
+
/** State active immediately before the most recent transition (for inertialized blending). */
|
|
64
|
+
previousState: string;
|
|
65
|
+
/** Seconds since the most recent state change. */
|
|
66
|
+
transitionElapsed: number;
|
|
67
|
+
/** Half-life (seconds) of the inertialized state-transition blend. */
|
|
68
|
+
transitionHalfLife: number;
|
|
50
69
|
constructor(states: readonly AnimationState[], initialState: string);
|
|
51
70
|
setParameter(name: string, value: number | boolean | string): void;
|
|
71
|
+
/**
|
|
72
|
+
* Inertialized blend between {@link previousState} and {@link currentState}. The previous
|
|
73
|
+
* state's weight decays critically-damped (zero initial slope, momentum-preserving) over
|
|
74
|
+
* {@link transitionHalfLife}; consumers crossfade the two states' clips by these weights instead
|
|
75
|
+
* of snapping or linearly ramping. Deterministic given the elapsed transition time.
|
|
76
|
+
*/
|
|
77
|
+
stateBlend(halfLife?: number): AnimationStateBlend;
|
|
52
78
|
update(delta?: number): string;
|
|
53
79
|
graphSnapshot(): AnimationStateMachineGraphSnapshot;
|
|
54
80
|
debugGraph(): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnimationStateMachine.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationStateMachine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AnimationStateMachine.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationStateMachine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
+
import { DEFAULT_INERTIALIZATION_HALF_LIFE, inertializedTransitionWeight } from "./Inertialization.js";
|
|
1
2
|
export class AnimationStateMachine {
|
|
2
3
|
states = new Map();
|
|
3
4
|
parameters = {};
|
|
4
5
|
currentState;
|
|
5
6
|
stateTime = 0;
|
|
7
|
+
/** State active immediately before the most recent transition (for inertialized blending). */
|
|
8
|
+
previousState;
|
|
9
|
+
/** Seconds since the most recent state change. */
|
|
10
|
+
transitionElapsed = Number.POSITIVE_INFINITY;
|
|
11
|
+
/** Half-life (seconds) of the inertialized state-transition blend. */
|
|
12
|
+
transitionHalfLife = DEFAULT_INERTIALIZATION_HALF_LIFE;
|
|
6
13
|
constructor(states, initialState) {
|
|
7
14
|
for (const state of states) {
|
|
8
15
|
if (state.duration !== undefined && (!Number.isFinite(state.duration) || state.duration < 0)) {
|
|
@@ -24,16 +31,39 @@ export class AnimationStateMachine {
|
|
|
24
31
|
}
|
|
25
32
|
}
|
|
26
33
|
this.currentState = initialState;
|
|
34
|
+
this.previousState = initialState;
|
|
27
35
|
this.resetParametersForState(this.requireState(initialState));
|
|
28
36
|
}
|
|
29
37
|
setParameter(name, value) {
|
|
30
38
|
this.parameters[name] = value;
|
|
31
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Inertialized blend between {@link previousState} and {@link currentState}. The previous
|
|
42
|
+
* state's weight decays critically-damped (zero initial slope, momentum-preserving) over
|
|
43
|
+
* {@link transitionHalfLife}; consumers crossfade the two states' clips by these weights instead
|
|
44
|
+
* of snapping or linearly ramping. Deterministic given the elapsed transition time.
|
|
45
|
+
*/
|
|
46
|
+
stateBlend(halfLife = this.transitionHalfLife) {
|
|
47
|
+
const elapsed = this.transitionElapsed;
|
|
48
|
+
if (this.previousState === this.currentState || !Number.isFinite(elapsed)) {
|
|
49
|
+
return { from: this.currentState, to: this.currentState, weights: [0, 1], elapsed: Number.isFinite(elapsed) ? elapsed : 0, done: true };
|
|
50
|
+
}
|
|
51
|
+
const fromWeight = inertializedTransitionWeight(elapsed, halfLife);
|
|
52
|
+
const done = fromWeight <= 1e-3;
|
|
53
|
+
return {
|
|
54
|
+
from: this.previousState,
|
|
55
|
+
to: this.currentState,
|
|
56
|
+
weights: [done ? 0 : fromWeight, done ? 1 : 1 - fromWeight],
|
|
57
|
+
elapsed,
|
|
58
|
+
done
|
|
59
|
+
};
|
|
60
|
+
}
|
|
32
61
|
update(delta = 0) {
|
|
33
62
|
if (!Number.isFinite(delta) || delta < 0) {
|
|
34
63
|
throw new Error("AnimationStateMachine delta must be finite and non-negative.");
|
|
35
64
|
}
|
|
36
65
|
this.stateTime += delta;
|
|
66
|
+
this.transitionElapsed += delta;
|
|
37
67
|
const state = this.requireState(this.currentState);
|
|
38
68
|
if (isStateComplete(state, this.stateTime)) {
|
|
39
69
|
if (state.completedParameter) {
|
|
@@ -123,8 +153,10 @@ export class AnimationStateMachine {
|
|
|
123
153
|
}
|
|
124
154
|
transitionTo(name) {
|
|
125
155
|
const state = this.requireState(name);
|
|
156
|
+
this.previousState = this.currentState;
|
|
126
157
|
this.currentState = name;
|
|
127
158
|
this.stateTime = 0;
|
|
159
|
+
this.transitionElapsed = this.previousState === name ? Number.POSITIVE_INFINITY : 0;
|
|
128
160
|
this.resetParametersForState(state);
|
|
129
161
|
}
|
|
130
162
|
resetParametersForState(state) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnimationStateMachine.js","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationStateMachine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AnimationStateMachine.js","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationStateMachine.ts"],"names":[],"mappings":"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"}
|
package/dist/animation/Bone.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ export type BoneDescriptor = {
|
|
|
6
6
|
readonly rotation?: Quat;
|
|
7
7
|
readonly scale?: Vec3;
|
|
8
8
|
readonly inverseBindMatrix?: Mat4;
|
|
9
|
+
/** Tag this bone as the start (or a member) of a spring-bone chain (secondary dynamics). */
|
|
10
|
+
readonly springChain?: boolean;
|
|
9
11
|
};
|
|
10
12
|
export declare class Bone {
|
|
11
13
|
readonly name: string;
|
|
@@ -14,6 +16,8 @@ export declare class Bone {
|
|
|
14
16
|
rotation: Quat;
|
|
15
17
|
scale: Vec3;
|
|
16
18
|
inverseBindMatrix: Mat4;
|
|
19
|
+
/** True when this bone participates in a spring-bone chain solved by `createSpringChain`. */
|
|
20
|
+
springChain: boolean;
|
|
17
21
|
constructor(descriptor: BoneDescriptor);
|
|
18
22
|
localMatrix(): Mat4;
|
|
19
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bone.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/Bone.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAE3F,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"Bone.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/Bone.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAE3F,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;IAClC,4FAA4F;IAC5F,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAEF,qBAAa,IAAI;IACf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,IAAI,CAAC;IAClB,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,EAAE,IAAI,CAAC;IACZ,iBAAiB,EAAE,IAAI,CAAC;IACxB,6FAA6F;IAC7F,WAAW,EAAE,OAAO,CAAC;gBAET,UAAU,EAAE,cAAc;IAatC,WAAW,IAAI,IAAI;CAGpB"}
|
package/dist/animation/Bone.js
CHANGED
|
@@ -6,6 +6,8 @@ export class Bone {
|
|
|
6
6
|
rotation;
|
|
7
7
|
scale;
|
|
8
8
|
inverseBindMatrix;
|
|
9
|
+
/** True when this bone participates in a spring-bone chain solved by `createSpringChain`. */
|
|
10
|
+
springChain;
|
|
9
11
|
constructor(descriptor) {
|
|
10
12
|
if (descriptor.name.trim().length === 0) {
|
|
11
13
|
throw new Error("Bone name cannot be empty.");
|
|
@@ -16,6 +18,7 @@ export class Bone {
|
|
|
16
18
|
this.rotation = descriptor.rotation ?? [0, 0, 0, 1];
|
|
17
19
|
this.scale = descriptor.scale ?? [1, 1, 1];
|
|
18
20
|
this.inverseBindMatrix = descriptor.inverseBindMatrix ?? identityMat4();
|
|
21
|
+
this.springChain = descriptor.springChain ?? false;
|
|
19
22
|
}
|
|
20
23
|
localMatrix() {
|
|
21
24
|
return composeMat4(this.translation, this.rotation, this.scale);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bone.js","sourceRoot":"","sources":["../../../../packages/animation/src/Bone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAmC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"Bone.js","sourceRoot":"","sources":["../../../../packages/animation/src/Bone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAmC,MAAM,eAAe,CAAC;AAa3F,MAAM,OAAO,IAAI;IACN,IAAI,CAAS;IACb,WAAW,CAAS;IAC7B,WAAW,CAAO;IAClB,QAAQ,CAAO;IACf,KAAK,CAAO;IACZ,iBAAiB,CAAO;IACxB,6FAA6F;IAC7F,WAAW,CAAU;IAErB,YAAY,UAA0B;QACpC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,IAAI,YAAY,EAAE,CAAC;QACxE,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,KAAK,CAAC;IACrD,CAAC;IAED,WAAW;QACT,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;CACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { DEFAULT_INERTIALIZATION_HALF_LIFE } from "./Inertialization.js";
|
|
2
|
+
export type FighterClipKey = "idle" | "walk" | "run" | "air" | "down" | "guard" | "hurt" | "ko" | "light" | "heavy" | "special";
|
|
3
|
+
export interface FighterAnimationStateInput {
|
|
4
|
+
/** High-level action label from the combat sim. */
|
|
5
|
+
readonly action: string;
|
|
6
|
+
/** Whether the fighter is on the ground (airborne overrides locomotion). */
|
|
7
|
+
readonly grounded: boolean;
|
|
8
|
+
/** Active attack clip key, if mid-attack (overrides everything except KO). */
|
|
9
|
+
readonly attackClipKey?: FighterClipKey | undefined;
|
|
10
|
+
/** KO takes precedence over all other states. */
|
|
11
|
+
readonly knockedOut?: boolean | undefined;
|
|
12
|
+
}
|
|
13
|
+
export interface FighterClipResolution {
|
|
14
|
+
readonly clipKey: FighterClipKey;
|
|
15
|
+
readonly speed: number;
|
|
16
|
+
}
|
|
17
|
+
export interface FighterAnimationSpeedTable {
|
|
18
|
+
readonly light?: number;
|
|
19
|
+
readonly heavy?: number;
|
|
20
|
+
readonly special?: number;
|
|
21
|
+
readonly run?: number;
|
|
22
|
+
}
|
|
23
|
+
/** Resolve the clip key + speed for a fighter state. Mirrors the Aura Clash arena cascade. */
|
|
24
|
+
export declare function resolveFighterClip(input: FighterAnimationStateInput, speeds?: FighterAnimationSpeedTable): FighterClipResolution;
|
|
25
|
+
export interface FighterCrossfade<TClip extends string = string> {
|
|
26
|
+
readonly from: TClip;
|
|
27
|
+
readonly to: TClip;
|
|
28
|
+
readonly weights: readonly [number, number];
|
|
29
|
+
readonly done: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Deterministic crossfade weights from a previous clip to the current clip over a transition
|
|
33
|
+
* window. `elapsed`/`duration` are in seconds. Returns clamped [fromWeight, toWeight] summing to 1.
|
|
34
|
+
* Generic over clip identifier so callers using clip keys OR raw clip names can both use it.
|
|
35
|
+
*/
|
|
36
|
+
export declare function fighterCrossfadeWeights<TClip extends string = string>(from: TClip, to: TClip, elapsed: number, duration: number): FighterCrossfade<TClip>;
|
|
37
|
+
/**
|
|
38
|
+
* Inertialized transition weights from a previous clip to the current clip. This is the **default**
|
|
39
|
+
* fighter transition: the source weight follows a critically-damped decay (zero initial slope,
|
|
40
|
+
* momentum-preserving) instead of the straight linear ramp of {@link fighterCrossfadeWeights}, so
|
|
41
|
+
* move swaps carry through smoothly rather than dissolving. Weights still sum to 1, output is
|
|
42
|
+
* deterministic (pure function of `elapsed`/`duration`/`halfLife`), so deterministic combat replay
|
|
43
|
+
* is unaffected. `halfLife` defaults to ~40% of the transition window so the source has effectively
|
|
44
|
+
* faded by the time the window closes; the linear path remains available as a fallback.
|
|
45
|
+
*/
|
|
46
|
+
export declare function fighterInertializedWeights<TClip extends string = string>(from: TClip, to: TClip, elapsed: number, duration: number, halfLife?: number): FighterCrossfade<TClip>;
|
|
47
|
+
/** Default transition half-life re-exported for callers that want to align their own timing. */
|
|
48
|
+
export { DEFAULT_INERTIALIZATION_HALF_LIFE };
|
|
49
|
+
//# sourceMappingURL=FighterAnimationAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FighterAnimationAdapter.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/FighterAnimationAdapter.ts"],"names":[],"mappings":"AAMA,OAAO,EAAgC,iCAAiC,EAAE,MAAM,sBAAsB,CAAC;AAEvG,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,MAAM,GACN,KAAK,GACL,KAAK,GACL,MAAM,GACN,OAAO,GACP,MAAM,GACN,IAAI,GACJ,OAAO,GACP,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,WAAW,0BAA0B;IACzC,mDAAmD;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACpD,iDAAiD;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAiBD,8FAA8F;AAC9F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,EAAE,MAAM,GAAE,0BAA+B,GAAG,qBAAqB,CAYpI;AAED,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM;IAC7D,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAMzJ;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,EACtE,IAAI,EAAE,KAAK,EACX,EAAE,EAAE,KAAK,EACT,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,gBAAgB,CAAC,KAAK,CAAC,CAWzB;AAED,gGAAgG;AAChG,OAAO,EAAE,iCAAiC,EAAE,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Shared fighter animation adapter: maps a combat state to a clip key + playback speed, and
|
|
2
|
+
// computes deterministic transition weights on state change. Pure (no engine/render import) so both
|
|
3
|
+
// the Aura Clash arena and the fighting-game template can reuse the same mapping instead of each
|
|
4
|
+
// re-deriving it inline. Transitions default to the inertialized (critically-damped) weight curve;
|
|
5
|
+
// the linear crossfade is retained as an explicit fallback.
|
|
6
|
+
import { inertializedTransitionWeight, DEFAULT_INERTIALIZATION_HALF_LIFE } from "./Inertialization.js";
|
|
7
|
+
const defaultSpeeds = { light: 1.45, heavy: 1.06, special: 0.94, run: 1.18 };
|
|
8
|
+
const locomotionByAction = {
|
|
9
|
+
idle: "idle",
|
|
10
|
+
walk: "walk",
|
|
11
|
+
run: "run",
|
|
12
|
+
dash: "run",
|
|
13
|
+
guard: "guard",
|
|
14
|
+
block: "guard",
|
|
15
|
+
down: "down",
|
|
16
|
+
crouch: "down",
|
|
17
|
+
hurt: "hurt",
|
|
18
|
+
hit: "hurt"
|
|
19
|
+
};
|
|
20
|
+
/** Resolve the clip key + speed for a fighter state. Mirrors the Aura Clash arena cascade. */
|
|
21
|
+
export function resolveFighterClip(input, speeds = {}) {
|
|
22
|
+
const table = { ...defaultSpeeds, ...speeds };
|
|
23
|
+
if (input.knockedOut)
|
|
24
|
+
return { clipKey: "ko", speed: 1 };
|
|
25
|
+
if (input.attackClipKey) {
|
|
26
|
+
const speed = input.attackClipKey === "light" ? table.light : input.attackClipKey === "heavy" ? table.heavy : input.attackClipKey === "special" ? table.special : 1;
|
|
27
|
+
return { clipKey: input.attackClipKey, speed };
|
|
28
|
+
}
|
|
29
|
+
if (!input.grounded)
|
|
30
|
+
return { clipKey: "air", speed: 1 };
|
|
31
|
+
const action = input.action.toLowerCase();
|
|
32
|
+
const clipKey = locomotionByAction[action] ?? "idle";
|
|
33
|
+
const speed = clipKey === "run" ? table.run : 1;
|
|
34
|
+
return { clipKey, speed };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Deterministic crossfade weights from a previous clip to the current clip over a transition
|
|
38
|
+
* window. `elapsed`/`duration` are in seconds. Returns clamped [fromWeight, toWeight] summing to 1.
|
|
39
|
+
* Generic over clip identifier so callers using clip keys OR raw clip names can both use it.
|
|
40
|
+
*/
|
|
41
|
+
export function fighterCrossfadeWeights(from, to, elapsed, duration) {
|
|
42
|
+
if (from === to || duration <= 0) {
|
|
43
|
+
return { from, to, weights: [0, 1], done: true };
|
|
44
|
+
}
|
|
45
|
+
const t = Math.max(0, Math.min(1, elapsed / duration));
|
|
46
|
+
return { from, to, weights: [1 - t, t], done: t >= 1 };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Inertialized transition weights from a previous clip to the current clip. This is the **default**
|
|
50
|
+
* fighter transition: the source weight follows a critically-damped decay (zero initial slope,
|
|
51
|
+
* momentum-preserving) instead of the straight linear ramp of {@link fighterCrossfadeWeights}, so
|
|
52
|
+
* move swaps carry through smoothly rather than dissolving. Weights still sum to 1, output is
|
|
53
|
+
* deterministic (pure function of `elapsed`/`duration`/`halfLife`), so deterministic combat replay
|
|
54
|
+
* is unaffected. `halfLife` defaults to ~40% of the transition window so the source has effectively
|
|
55
|
+
* faded by the time the window closes; the linear path remains available as a fallback.
|
|
56
|
+
*/
|
|
57
|
+
export function fighterInertializedWeights(from, to, elapsed, duration, halfLife) {
|
|
58
|
+
if (from === to || duration <= 0) {
|
|
59
|
+
return { from, to, weights: [0, 1], done: true };
|
|
60
|
+
}
|
|
61
|
+
const done = elapsed >= duration;
|
|
62
|
+
if (done) {
|
|
63
|
+
return { from, to, weights: [0, 1], done: true };
|
|
64
|
+
}
|
|
65
|
+
const life = halfLife ?? Math.max(1e-4, duration * 0.4);
|
|
66
|
+
const fromWeight = inertializedTransitionWeight(Math.max(0, elapsed), life);
|
|
67
|
+
return { from, to, weights: [fromWeight, 1 - fromWeight], done: false };
|
|
68
|
+
}
|
|
69
|
+
/** Default transition half-life re-exported for callers that want to align their own timing. */
|
|
70
|
+
export { DEFAULT_INERTIALIZATION_HALF_LIFE };
|
|
71
|
+
//# sourceMappingURL=FighterAnimationAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FighterAnimationAdapter.js","sourceRoot":"","sources":["../../../../packages/animation/src/FighterAnimationAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { Vec3 } from "./Keyframe.js";
|
|
2
|
+
import type { FootIkSample } from "./SecondaryAnimationFixtures.js";
|
|
3
|
+
/** Result of a downward ground query: where the ground is and its surface normal. */
|
|
4
|
+
export interface GroundSample {
|
|
5
|
+
readonly point: Vec3;
|
|
6
|
+
readonly normal: Vec3;
|
|
7
|
+
readonly distance: number;
|
|
8
|
+
}
|
|
9
|
+
/** Minimal ground query the rig needs: cast a downward ray and report the first ground hit. */
|
|
10
|
+
export interface GroundRaycaster {
|
|
11
|
+
raycastDown(origin: Vec3, maxDistance: number): GroundSample | undefined;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Analytic ground query from a height function — deterministic and physics-free, ideal for tests
|
|
15
|
+
* and procedural terrain. `heightAt` returns the ground height (and optional normal) at an (x, z).
|
|
16
|
+
*/
|
|
17
|
+
export declare function createHeightFieldGround(heightAt: (x: number, z: number) => {
|
|
18
|
+
height: number;
|
|
19
|
+
normal?: Vec3;
|
|
20
|
+
}): GroundRaycaster;
|
|
21
|
+
/** One leg: the hip (root), knee (mid), ankle (end), and an optional pole/knee hint. */
|
|
22
|
+
export interface FootLegInput {
|
|
23
|
+
readonly side: "left" | "right";
|
|
24
|
+
readonly hip: Vec3;
|
|
25
|
+
readonly knee: Vec3;
|
|
26
|
+
readonly ankle: Vec3;
|
|
27
|
+
readonly pole?: Vec3;
|
|
28
|
+
}
|
|
29
|
+
export interface FootIkRigOptions {
|
|
30
|
+
readonly legs: readonly FootLegInput[];
|
|
31
|
+
readonly raycaster: GroundRaycaster;
|
|
32
|
+
/** Height the ankle joint sits above the ground contact point (default 0.035). */
|
|
33
|
+
readonly ankleHeight?: number;
|
|
34
|
+
/** How far above the ankle to start the downward ray (default 0.6). */
|
|
35
|
+
readonly rayStartHeight?: number;
|
|
36
|
+
/** Max ray distance (default 2). */
|
|
37
|
+
readonly maxRayDistance?: number;
|
|
38
|
+
/** Foot is in stance (locks) when its height above the ground target is ≤ this (default 0.02). */
|
|
39
|
+
readonly plantThreshold?: number;
|
|
40
|
+
/** Hip-drop factor applied to the deepest required correction (default 0.72, matches fixture). */
|
|
41
|
+
readonly hipDropFactor?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface SolvedLeg {
|
|
44
|
+
readonly side: "left" | "right";
|
|
45
|
+
readonly sample: FootIkSample;
|
|
46
|
+
/** Solved joint chain (write these back onto the skeleton). */
|
|
47
|
+
readonly hip: Vec3;
|
|
48
|
+
readonly knee: Vec3;
|
|
49
|
+
readonly ankle: Vec3;
|
|
50
|
+
/** True while the foot is locked to a world position (stance). */
|
|
51
|
+
readonly locked: boolean;
|
|
52
|
+
readonly reached: boolean;
|
|
53
|
+
}
|
|
54
|
+
export interface FootIkSolveResult {
|
|
55
|
+
readonly feet: readonly SolvedLeg[];
|
|
56
|
+
/** Vertical hip offset (≤ 0) so the lower planted foot can reach the ground. */
|
|
57
|
+
readonly hipOffset: number;
|
|
58
|
+
readonly groundedFeet: number;
|
|
59
|
+
readonly averageTargetError: number;
|
|
60
|
+
}
|
|
61
|
+
export interface FootIkRig {
|
|
62
|
+
/**
|
|
63
|
+
* Solve foot placement for the current pose. Pass updated leg transforms (e.g. sampled from the
|
|
64
|
+
* animation) via `pose.legs`, or omit to reuse the legs the rig was created with. Optionally
|
|
65
|
+
* override the ground query for this frame.
|
|
66
|
+
*/
|
|
67
|
+
solveFootPlacement(pose?: {
|
|
68
|
+
legs?: readonly FootLegInput[];
|
|
69
|
+
}, groundQuery?: GroundRaycaster): FootIkSolveResult;
|
|
70
|
+
/** Whether a given side is currently foot-locked. */
|
|
71
|
+
isLocked(side: "left" | "right"): boolean;
|
|
72
|
+
/** Clear all foot-lock state (e.g. on teleport / respawn). */
|
|
73
|
+
reset(): void;
|
|
74
|
+
}
|
|
75
|
+
/** Create a foot-IK rig. Foot-lock state persists across `solveFootPlacement` calls. */
|
|
76
|
+
export declare function createFootIkRig(options: FootIkRigOptions): FootIkRig;
|
|
77
|
+
//# sourceMappingURL=FootIk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FootIk.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/FootIk.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE,qFAAqF;AACrF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,+FAA+F;AAC/F,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;CAC1E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,IAAI,CAAA;CAAE,GAAG,eAAe,CAS9H;AAED,wFAAwF;AACxF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,kFAAkF;IAClF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,oCAAoC;IACpC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,kGAAkG;IAClG,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,kGAAkG;IAClG,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACrB,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;IACpC,gFAAgF;IAChF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAOD,MAAM,WAAW,SAAS;IACxB;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;KAAE,EAAE,WAAW,CAAC,EAAE,eAAe,GAAG,iBAAiB,CAAC;IAChH,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAC1C,8DAA8D;IAC9D,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CA4CpE"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// Runtime foot IK + foot-lock, built on the existing two-bone solver (`solveTwoBoneIk`) plus a
|
|
2
|
+
// ground query (a downward ray). This is "wire up what we already have" — no new solver. It removes
|
|
3
|
+
// foot sliding (foot-lock holds a planted foot in world space during stance and releases it on
|
|
4
|
+
// lift) and grounds characters on uneven terrain (each ankle is pulled to the ground height under
|
|
5
|
+
// it, the hip drops so the lower foot can reach).
|
|
6
|
+
//
|
|
7
|
+
// The animation package stays dependency-free of @aura3d/physics: callers inject a `GroundRaycaster`
|
|
8
|
+
// (the physics package's `groundHeightRaycaster` adapter satisfies this interface, or use the
|
|
9
|
+
// analytic `createHeightFieldGround` here). Pure and deterministic: given the same pose stream and
|
|
10
|
+
// ground, the solved feet and lock state are identical every run.
|
|
11
|
+
import { solveTwoBoneIk } from "./IK.js";
|
|
12
|
+
/**
|
|
13
|
+
* Analytic ground query from a height function — deterministic and physics-free, ideal for tests
|
|
14
|
+
* and procedural terrain. `heightAt` returns the ground height (and optional normal) at an (x, z).
|
|
15
|
+
*/
|
|
16
|
+
export function createHeightFieldGround(heightAt) {
|
|
17
|
+
return {
|
|
18
|
+
raycastDown(origin, maxDistance) {
|
|
19
|
+
const { height, normal } = heightAt(origin[0], origin[2]);
|
|
20
|
+
const distance = origin[1] - height;
|
|
21
|
+
if (distance < 0 || distance > maxDistance)
|
|
22
|
+
return undefined;
|
|
23
|
+
return { point: [origin[0], height, origin[2]], normal: normal ?? [0, 1, 0], distance };
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** Create a foot-IK rig. Foot-lock state persists across `solveFootPlacement` calls. */
|
|
28
|
+
export function createFootIkRig(options) {
|
|
29
|
+
const ankleHeight = options.ankleHeight ?? 0.035;
|
|
30
|
+
const rayStartHeight = options.rayStartHeight ?? 0.6;
|
|
31
|
+
const maxRayDistance = options.maxRayDistance ?? 2;
|
|
32
|
+
const plantThreshold = options.plantThreshold ?? 0.02;
|
|
33
|
+
const hipDropFactor = options.hipDropFactor ?? 0.72;
|
|
34
|
+
let legs = options.legs;
|
|
35
|
+
const locks = new Map();
|
|
36
|
+
function lockFor(side) {
|
|
37
|
+
let state = locks.get(side);
|
|
38
|
+
if (!state) {
|
|
39
|
+
state = { locked: false, lockedPosition: [0, 0, 0] };
|
|
40
|
+
locks.set(side, state);
|
|
41
|
+
}
|
|
42
|
+
return state;
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
solveFootPlacement(pose, groundQuery) {
|
|
46
|
+
const raycaster = groundQuery ?? options.raycaster;
|
|
47
|
+
if (pose?.legs)
|
|
48
|
+
legs = pose.legs;
|
|
49
|
+
const solved = [];
|
|
50
|
+
let deepestCorrection = 0;
|
|
51
|
+
for (const leg of legs) {
|
|
52
|
+
const lock = lockFor(leg.side);
|
|
53
|
+
const result = solveLeg(leg, lock, raycaster, { ankleHeight, rayStartHeight, maxRayDistance, plantThreshold });
|
|
54
|
+
solved.push(result);
|
|
55
|
+
deepestCorrection = Math.max(deepestCorrection, Math.max(0, result.sample.verticalCorrection));
|
|
56
|
+
}
|
|
57
|
+
const hipOffset = round(-deepestCorrection * hipDropFactor);
|
|
58
|
+
const groundedFeet = solved.filter((leg) => leg.sample.grounded).length;
|
|
59
|
+
const averageTargetError = solved.length === 0
|
|
60
|
+
? 0
|
|
61
|
+
: round(solved.reduce((sum, leg) => sum + leg.sample.targetError, 0) / solved.length);
|
|
62
|
+
return { feet: solved, hipOffset, groundedFeet, averageTargetError };
|
|
63
|
+
},
|
|
64
|
+
isLocked(side) {
|
|
65
|
+
return locks.get(side)?.locked ?? false;
|
|
66
|
+
},
|
|
67
|
+
reset() {
|
|
68
|
+
locks.clear();
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function solveLeg(leg, lock, raycaster, params) {
|
|
73
|
+
const sourceAnkle = leg.ankle;
|
|
74
|
+
const ground = raycaster.raycastDown([sourceAnkle[0], sourceAnkle[1] + params.rayStartHeight, sourceAnkle[2]], params.rayStartHeight + params.maxRayDistance);
|
|
75
|
+
if (!ground) {
|
|
76
|
+
// No ground under the foot (airborne / off the edge): release the lock and pass the pose through.
|
|
77
|
+
lock.locked = false;
|
|
78
|
+
return {
|
|
79
|
+
side: leg.side,
|
|
80
|
+
sample: {
|
|
81
|
+
side: leg.side,
|
|
82
|
+
sourceFoot: sourceAnkle,
|
|
83
|
+
plantedFoot: sourceAnkle,
|
|
84
|
+
groundNormal: [0, 1, 0],
|
|
85
|
+
grounded: false,
|
|
86
|
+
verticalCorrection: 0,
|
|
87
|
+
targetError: 0
|
|
88
|
+
},
|
|
89
|
+
hip: leg.hip,
|
|
90
|
+
knee: leg.knee,
|
|
91
|
+
ankle: sourceAnkle,
|
|
92
|
+
locked: false,
|
|
93
|
+
reached: true
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const groundTargetY = ground.point[1] + params.ankleHeight;
|
|
97
|
+
const heightAboveGround = sourceAnkle[1] - groundTargetY;
|
|
98
|
+
const inStance = heightAboveGround <= params.plantThreshold;
|
|
99
|
+
let target;
|
|
100
|
+
if (inStance) {
|
|
101
|
+
if (!lock.locked) {
|
|
102
|
+
// Just entered stance: plant the foot at the ground point under it.
|
|
103
|
+
lock.locked = true;
|
|
104
|
+
lock.lockedPosition = [sourceAnkle[0], groundTargetY, sourceAnkle[2]];
|
|
105
|
+
}
|
|
106
|
+
// Hold the locked world position so the foot does not slide while it should be stationary.
|
|
107
|
+
target = lock.lockedPosition;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// Swing phase: release the lock; the foot follows above the ground under it.
|
|
111
|
+
lock.locked = false;
|
|
112
|
+
target = [sourceAnkle[0], Math.max(sourceAnkle[1], groundTargetY), sourceAnkle[2]];
|
|
113
|
+
}
|
|
114
|
+
// Blend IK in fully during stance, fade out across the swing so the leg returns to the clip pose.
|
|
115
|
+
const weight = inStance ? 1 : clamp(1 - heightAboveGround / 0.25, 0, 1);
|
|
116
|
+
const solved = solveTwoBoneIk({
|
|
117
|
+
root: leg.hip,
|
|
118
|
+
mid: leg.knee,
|
|
119
|
+
end: leg.ankle,
|
|
120
|
+
target,
|
|
121
|
+
pole: leg.pole,
|
|
122
|
+
weight
|
|
123
|
+
});
|
|
124
|
+
const verticalCorrection = round(sourceAnkle[1] - target[1]);
|
|
125
|
+
const targetError = round(solved.endDistanceToTarget);
|
|
126
|
+
return {
|
|
127
|
+
side: leg.side,
|
|
128
|
+
sample: {
|
|
129
|
+
side: leg.side,
|
|
130
|
+
sourceFoot: roundVec(sourceAnkle),
|
|
131
|
+
plantedFoot: roundVec(target),
|
|
132
|
+
groundNormal: roundVec(ground.normal),
|
|
133
|
+
grounded: inStance,
|
|
134
|
+
verticalCorrection,
|
|
135
|
+
targetError
|
|
136
|
+
},
|
|
137
|
+
hip: leg.hip,
|
|
138
|
+
knee: roundVec(solved.mid),
|
|
139
|
+
ankle: roundVec(solved.end),
|
|
140
|
+
locked: lock.locked,
|
|
141
|
+
reached: solved.reached
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function clamp(value, min, max) {
|
|
145
|
+
return Math.max(min, Math.min(max, value));
|
|
146
|
+
}
|
|
147
|
+
function round(value) {
|
|
148
|
+
return Number(value.toFixed(4));
|
|
149
|
+
}
|
|
150
|
+
function roundVec(value) {
|
|
151
|
+
return [round(value[0]), round(value[1]), round(value[2])];
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=FootIk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FootIk.js","sourceRoot":"","sources":["../../../../packages/animation/src/FootIk.ts"],"names":[],"mappings":"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"}
|