@haiyue/extensions 0.1.0 → 0.2.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.
Files changed (269) hide show
  1. package/README.md +25 -0
  2. package/dist/animation/Animation2DComponent.d.ts +18 -0
  3. package/dist/animation/Animation2DExtensionRegistry.d.ts +7 -0
  4. package/dist/animation/Animation2DRenderSystem.d.ts +6 -0
  5. package/dist/animation/Animation2DRuntime.d.ts +6 -2
  6. package/dist/animation/AnimationTextRasterizer.d.ts +4 -0
  7. package/dist/animation/AnimationVisual2D.d.ts +58 -2
  8. package/dist/animation/interaction/InteractionRuntime.d.ts +83 -0
  9. package/dist/animation/interaction/runtime-types.d.ts +257 -0
  10. package/dist/animation.d.ts +3 -1
  11. package/dist/animation.js +551 -59
  12. package/dist/animation3d.js +1 -1
  13. package/dist/canvas-text.js +1 -1
  14. package/dist/chunks/2d-ui-animation-2d.generated-FpziAeGJ.js +4 -0
  15. package/dist/chunks/2d-ui-indexed-sprite.generated-DmKR0CC3.js +4 -0
  16. package/dist/chunks/Animation2DStateMachine-BHcA6Cu3.js +18212 -0
  17. package/dist/chunks/{AnimationStateMachineController-BIcAh-sT.js → AnimationStateMachineController-4sKaqh9E.js} +2 -2
  18. package/dist/chunks/AnimationVisual2D-8y3qp0_U.js +230 -0
  19. package/dist/chunks/{RenderSystem2DBase-DDT61dAu.js → RenderSystem2DBase-CF2s00vg.js} +2 -2
  20. package/dist/controls/VirtualJoystickControls.d.ts +46 -0
  21. package/dist/controls/contracts.d.ts +91 -0
  22. package/dist/controls.d.ts +2 -0
  23. package/dist/controls.js +358 -0
  24. package/dist/deformable-animation/runtime/DeformableMesh2DRuntimeExtension.d.ts +11 -0
  25. package/dist/deformable-animation/runtime/DeformableMesh2DSampler.d.ts +11 -0
  26. package/dist/deformable-animation.d.ts +5 -0
  27. package/dist/deformable-animation.js +316 -0
  28. package/dist/experimental-indexed-sprite.d.ts +5 -0
  29. package/dist/experimental-indexed-sprite.js +482 -0
  30. package/dist/gltf-worker-runtime.js +9 -9
  31. package/dist/hya-state-machine.js +3 -2
  32. package/dist/index.js +1 -1
  33. package/dist/indexed-sprite/AtlasLayout.d.ts +2 -0
  34. package/dist/indexed-sprite/IndexedSpriteRenderer.d.ts +23 -0
  35. package/dist/indexed-sprite/contracts.d.ts +89 -0
  36. package/dist/internal/2d-ui-shader-artifact.js +232 -23
  37. package/dist/ray-tracing/acceleration/bvh.d.ts +37 -0
  38. package/dist/ray-tracing/acceleration/index.d.ts +6 -0
  39. package/dist/ray-tracing/acceleration/pack.d.ts +152 -0
  40. package/dist/ray-tracing/acceleration/query.d.ts +4 -0
  41. package/dist/ray-tracing/acceleration/runtime.d.ts +30 -0
  42. package/dist/ray-tracing/acceleration/tlas.d.ts +4 -0
  43. package/dist/ray-tracing/acceleration/types.d.ts +165 -0
  44. package/dist/ray-tracing/denoise/index.d.ts +3 -0
  45. package/dist/ray-tracing/denoise/layout.d.ts +9 -0
  46. package/dist/ray-tracing/denoise/runtime.d.ts +23 -0
  47. package/dist/ray-tracing/denoise/types.d.ts +28 -0
  48. package/dist/ray-tracing/hybrid/contract.d.ts +2 -0
  49. package/dist/ray-tracing/hybrid/index.d.ts +5 -0
  50. package/dist/ray-tracing/hybrid/layout.d.ts +17 -0
  51. package/dist/ray-tracing/hybrid/plan.d.ts +2 -0
  52. package/dist/ray-tracing/hybrid/runtime.d.ts +31 -0
  53. package/dist/ray-tracing/hybrid/shaders/hybrid-artifact.generated.d.ts +625 -0
  54. package/dist/ray-tracing/hybrid/types.d.ts +144 -0
  55. package/dist/ray-tracing/lifecycle/device-recovery.d.ts +31 -0
  56. package/dist/ray-tracing/lifecycle/index.d.ts +2 -0
  57. package/dist/ray-tracing/lifecycle/types.d.ts +37 -0
  58. package/dist/ray-tracing/material/index.d.ts +2 -0
  59. package/dist/ray-tracing/material/pack.d.ts +5 -0
  60. package/dist/ray-tracing/material/types.d.ts +63 -0
  61. package/dist/ray-tracing/reference/index.d.ts +122 -0
  62. package/dist/ray-tracing/renderer/index.d.ts +7 -0
  63. package/dist/ray-tracing/renderer/layout.d.ts +20 -0
  64. package/dist/ray-tracing/renderer/plan.d.ts +2 -0
  65. package/dist/ray-tracing/renderer/reference.d.ts +17 -0
  66. package/dist/ray-tracing/renderer/runtime.d.ts +39 -0
  67. package/dist/ray-tracing/renderer/scene.d.ts +4 -0
  68. package/dist/ray-tracing/renderer/types.d.ts +115 -0
  69. package/dist/ray-tracing/sampling/index.d.ts +8 -0
  70. package/dist/ray-tracing/sampling/layout.d.ts +12 -0
  71. package/dist/ray-tracing/sampling/plan.d.ts +5 -0
  72. package/dist/ray-tracing/sampling/revision.d.ts +15 -0
  73. package/dist/ray-tracing/sampling/runtime.d.ts +44 -0
  74. package/dist/ray-tracing/sampling/sequence.d.ts +2 -0
  75. package/dist/ray-tracing/sampling/types.d.ts +96 -0
  76. package/dist/ray-tracing/scene/index.d.ts +41 -0
  77. package/dist/ray-tracing/traversal/index.d.ts +4 -0
  78. package/dist/ray-tracing/traversal/layout.d.ts +16 -0
  79. package/dist/ray-tracing/traversal/plan.d.ts +2 -0
  80. package/dist/ray-tracing/traversal/runtime.d.ts +25 -0
  81. package/dist/ray-tracing/traversal/types.d.ts +79 -0
  82. package/dist/ray-tracing/worker/client.d.ts +25 -0
  83. package/dist/ray-tracing/worker/index.d.ts +5 -0
  84. package/dist/ray-tracing/worker/runtime.d.ts +11 -0
  85. package/dist/ray-tracing/worker/serialization.d.ts +16 -0
  86. package/dist/ray-tracing/worker/source.d.ts +1 -0
  87. package/dist/ray-tracing/worker/types.d.ts +91 -0
  88. package/dist/ray-tracing.d.ts +17 -0
  89. package/dist/ray-tracing.js +7666 -0
  90. package/dist/spine.js +1 -1
  91. package/dist/tilemap.js +1 -1
  92. package/package.json +26 -23
  93. package/dist/animation/Animation2DStateMachineVisualRuntime.d.ts +0 -27
  94. package/dist/animation/Particle2DDescriptorAdapter.d.ts +0 -5
  95. package/dist/animation3d/Animation3DResource.d.ts +0 -28
  96. package/dist/animation3d/hya/HyaAnimation3DStateMachineRuntime.d.ts +0 -65
  97. package/dist/animation3d/hya/index.d.ts +0 -4
  98. package/dist/animation3d/runtime/integration/Animation3DStateMachineMixerAdapter.d.ts +0 -81
  99. package/dist/animation3d/runtime/integration/Animation3DStateMachineMixerIntegration.d.ts +0 -39
  100. package/dist/animation3d/runtime/integration/index.d.ts +0 -2
  101. package/dist/animation3d/runtime/mixer/Action.d.ts +0 -150
  102. package/dist/animation3d/runtime/mixer/Animation3DMixerRuntimeStore.d.ts +0 -6
  103. package/dist/animation3d/runtime/mixer/Mixer.d.ts +0 -59
  104. package/dist/animation3d/runtime/mixer/PoseBuffer.d.ts +0 -1
  105. package/dist/animation3d/runtime/mixer/TrackSampler.d.ts +0 -24
  106. package/dist/animation3d/runtime/mixer/index.d.ts +0 -4
  107. package/dist/animation3d/runtime/state-machine/Animation3DBlendTreeWeights.d.ts +0 -1
  108. package/dist/animation3d/runtime/state-machine/Animation3DStateMachineCompiler.d.ts +0 -1
  109. package/dist/animation3d/runtime/state-machine/Animation3DStateMachineController.d.ts +0 -1
  110. package/dist/animation3d/runtime/state-machine/Animation3DStateMachineMixerPort.d.ts +0 -1
  111. package/dist/animation3d/runtime/state-machine/index.d.ts +0 -6
  112. package/dist/benchmark.d.ts +0 -30
  113. package/dist/chunks/2d-ui-animation-2d.generated-D4aHzFU2.js +0 -4
  114. package/dist/chunks/Animation2DStateMachine-9IonguNa.js +0 -3245
  115. package/dist/gltf/GltfAccessorReader.d.ts +0 -7
  116. package/dist/gltf/GltfDracoDecoder.d.ts +0 -4
  117. package/dist/gltf/GltfLoaderErrors.d.ts +0 -4
  118. package/dist/gltf/GltfMaterialDescriptor.d.ts +0 -23
  119. package/dist/gltf/GltfMaterialLoader.d.ts +0 -6
  120. package/dist/gltf-worker-runtime.d.ts +0 -7
  121. package/dist/plugins/pluginUtils.d.ts +0 -20
  122. package/dist/plugins.d.ts +0 -6
  123. package/dist/shaders/generated/2d-ui-artifact.generated.d.ts +0 -658
  124. package/dist/spine/Spine2DGpuRenderer.d.ts +0 -65
  125. package/dist/spine/Spine2DRuntime.d.ts +0 -103
  126. package/dist/spine/SpineAnimationBoneTimelines.d.ts +0 -8
  127. package/dist/spine/SpineFloatBuilder.d.ts +0 -15
  128. package/dist/spine/SpinePathConstraintSolver.d.ts +0 -32
  129. package/dist/spine/SpineSkeletonRuntime.d.ts +0 -185
  130. package/dist/spine/SpineSlotAnimation.d.ts +0 -17
  131. package/dist/spine/SpineTimelineRuntime.d.ts +0 -25
  132. package/dist/spine/SpineVertexBuilder.d.ts +0 -61
  133. package/dist/tilemap/Tilemap2DRenderer.d.ts +0 -24
  134. package/dist/utils/arrayAccess.d.ts +0 -4
  135. package/dist/utils/camera2d.d.ts +0 -12
  136. package/src/animation/Animation2DComponent.ts +0 -135
  137. package/src/animation/Animation2DExtensionRegistry.ts +0 -52
  138. package/src/animation/Animation2DRenderSystem.ts +0 -1026
  139. package/src/animation/Animation2DRuntime.ts +0 -1326
  140. package/src/animation/Animation2DStateMachine.ts +0 -39
  141. package/src/animation/Animation2DStateMachineComponent.ts +0 -228
  142. package/src/animation/Animation2DStateMachineRuntime.ts +0 -141
  143. package/src/animation/Animation2DStateMachineSystem.ts +0 -60
  144. package/src/animation/Animation2DStateMachineVisualRuntime.ts +0 -282
  145. package/src/animation/Animation2DSystem.ts +0 -72
  146. package/src/animation/AnimationAssetLoader.ts +0 -84
  147. package/src/animation/AnimationAudioClip.ts +0 -140
  148. package/src/animation/AnimationPathTessellator.ts +0 -691
  149. package/src/animation/AnimationTextRasterizer.ts +0 -340
  150. package/src/animation/AnimationVisual2D.ts +0 -153
  151. package/src/animation/HyaAnimation2DClipAdapter.ts +0 -845
  152. package/src/animation/Particle2DDescriptorAdapter.ts +0 -35
  153. package/src/animation/runtime/mixer/Action.ts +0 -876
  154. package/src/animation/runtime/mixer/Mixer.ts +0 -505
  155. package/src/animation/runtime/mixer/PoseBuffer.ts +0 -105
  156. package/src/animation/runtime/mixer/Sampler.ts +0 -252
  157. package/src/animation/runtime/mixer/Types.ts +0 -138
  158. package/src/animation/runtime/mixer/index.ts +0 -31
  159. package/src/animation-state-machine/AnimationStateMachine.ts +0 -146
  160. package/src/animation-state-machine/AnimationStateMachineChannels.ts +0 -116
  161. package/src/animation-state-machine/runtime/Animation2DStateMachineMixerAdapter.ts +0 -197
  162. package/src/animation-state-machine/runtime/AnimationStateMachineBlendTreeWeights.ts +0 -503
  163. package/src/animation-state-machine/runtime/AnimationStateMachineCompiler.ts +0 -763
  164. package/src/animation-state-machine/runtime/AnimationStateMachineController.ts +0 -987
  165. package/src/animation-state-machine/runtime/AnimationStateMachineMixerPort.ts +0 -54
  166. package/src/animation-state-machine/runtime/index.ts +0 -47
  167. package/src/animation.ts +0 -33
  168. package/src/animation3d/Animation3DAction.ts +0 -73
  169. package/src/animation3d/Animation3DBinding.ts +0 -116
  170. package/src/animation3d/Animation3DClip.ts +0 -22
  171. package/src/animation3d/Animation3DError.ts +0 -34
  172. package/src/animation3d/Animation3DMixer.ts +0 -82
  173. package/src/animation3d/Animation3DPose.ts +0 -100
  174. package/src/animation3d/Animation3DPoseBuffer.ts +0 -85
  175. package/src/animation3d/Animation3DResource.ts +0 -49
  176. package/src/animation3d/Animation3DStateMachine.ts +0 -126
  177. package/src/animation3d/Animation3DStateMachineRuntime.ts +0 -191
  178. package/src/animation3d/Animation3DTrack.ts +0 -29
  179. package/src/animation3d/hya/HyaAnimation3DRuntime.ts +0 -756
  180. package/src/animation3d/hya/HyaAnimation3DStateMachineRuntime.ts +0 -618
  181. package/src/animation3d/hya/HyaAnimation3DTypes.ts +0 -168
  182. package/src/animation3d/hya/index.ts +0 -10
  183. package/src/animation3d/index.ts +0 -76
  184. package/src/animation3d/runtime/integration/Animation3DStateMachineMixerAdapter.ts +0 -325
  185. package/src/animation3d/runtime/integration/Animation3DStateMachineMixerIntegration.ts +0 -158
  186. package/src/animation3d/runtime/integration/index.ts +0 -9
  187. package/src/animation3d/runtime/mixer/Action.ts +0 -833
  188. package/src/animation3d/runtime/mixer/Animation3DMixerRuntimeStore.ts +0 -26
  189. package/src/animation3d/runtime/mixer/Mixer.ts +0 -562
  190. package/src/animation3d/runtime/mixer/PoseBuffer.ts +0 -1
  191. package/src/animation3d/runtime/mixer/TrackSampler.ts +0 -399
  192. package/src/animation3d/runtime/mixer/index.ts +0 -8
  193. package/src/animation3d/runtime/state-machine/Animation3DBlendTreeWeights.ts +0 -4
  194. package/src/animation3d/runtime/state-machine/Animation3DStateMachineCompiler.ts +0 -1
  195. package/src/animation3d/runtime/state-machine/Animation3DStateMachineController.ts +0 -1
  196. package/src/animation3d/runtime/state-machine/Animation3DStateMachineMixerPort.ts +0 -1
  197. package/src/animation3d/runtime/state-machine/index.ts +0 -45
  198. package/src/animation3d.ts +0 -5
  199. package/src/benchmark.ts +0 -168
  200. package/src/canvas-text/CanvasText2DRenderSystem.ts +0 -292
  201. package/src/canvas-text/CanvasTextComponent.ts +0 -47
  202. package/src/canvas-text.ts +0 -4
  203. package/src/experimental-gltf-worker.ts +0 -18
  204. package/src/experimental-spine-worker.ts +0 -9
  205. package/src/gltf/GltfAccessorReader.ts +0 -271
  206. package/src/gltf/GltfAnimation3DAdapter.ts +0 -680
  207. package/src/gltf/GltfAnimationRuntime.ts +0 -392
  208. package/src/gltf/GltfAssetWorkerClient.ts +0 -136
  209. package/src/gltf/GltfCompatibilityReport.ts +0 -214
  210. package/src/gltf/GltfConservativeBounds.ts +0 -219
  211. package/src/gltf/GltfDracoDecoder.ts +0 -251
  212. package/src/gltf/GltfExtensionAdapter.ts +0 -340
  213. package/src/gltf/GltfLoaderContract.ts +0 -333
  214. package/src/gltf/GltfLoaderErrors.ts +0 -59
  215. package/src/gltf/GltfMaterialDescriptor.ts +0 -134
  216. package/src/gltf/GltfMaterialEncoder.ts +0 -173
  217. package/src/gltf/GltfMaterialLoader.ts +0 -293
  218. package/src/gltf/GltfModelComponent.ts +0 -115
  219. package/src/gltf/GltfModelSystem.ts +0 -208
  220. package/src/gltf/GltfPlugin.ts +0 -84
  221. package/src/gltf/GltfSchema.ts +0 -229
  222. package/src/gltf/GltfUvSemanticPlanner.ts +0 -166
  223. package/src/gltf/gltfLoader.ts +0 -910
  224. package/src/gltf-animation3d.ts +0 -10
  225. package/src/gltf-worker-runtime.ts +0 -10
  226. package/src/gltf.ts +0 -56
  227. package/src/grid/Grid2DComponent.ts +0 -69
  228. package/src/grid.ts +0 -2
  229. package/src/hya-state-machine.ts +0 -19
  230. package/src/index.ts +0 -2
  231. package/src/plugins/pluginUtils.ts +0 -50
  232. package/src/plugins.ts +0 -6
  233. package/src/shaders/generated/2d-ui-animation-2d.generated.wgsl +0 -242
  234. package/src/shaders/generated/2d-ui-artifact.generated.ts +0 -867
  235. package/src/shaders/generated/2d-ui-canvas-text-2d.generated.wgsl +0 -38
  236. package/src/shaders/generated/2d-ui-spine2d.generated.wgsl +0 -41
  237. package/src/shaders/generated/2d-ui-tilemap2d.generated.wgsl +0 -36
  238. package/src/spine/Spine2DComponent.ts +0 -168
  239. package/src/spine/Spine2DGpuRenderer.ts +0 -449
  240. package/src/spine/Spine2DRenderSystem.ts +0 -199
  241. package/src/spine/Spine2DRuntime.ts +0 -1529
  242. package/src/spine/SpineAnimationBoneTimelines.ts +0 -30
  243. package/src/spine/SpineAssetParser.ts +0 -20
  244. package/src/spine/SpineAssetWorkerClient.ts +0 -112
  245. package/src/spine/SpineAssetWorkerContract.ts +0 -4
  246. package/src/spine/SpineAtlasParser.ts +0 -127
  247. package/src/spine/SpineFloatBuilder.ts +0 -66
  248. package/src/spine/SpinePathConstraintSolver.ts +0 -582
  249. package/src/spine/SpinePlugin.ts +0 -76
  250. package/src/spine/SpineSkeletonRuntime.ts +0 -521
  251. package/src/spine/SpineSlotAnimation.ts +0 -195
  252. package/src/spine/SpineTimelineRuntime.ts +0 -453
  253. package/src/spine/SpineVertexBuilder.ts +0 -686
  254. package/src/spine.ts +0 -7
  255. package/src/tilemap/Tilemap2DComponent.ts +0 -232
  256. package/src/tilemap/Tilemap2DRenderSystem.ts +0 -58
  257. package/src/tilemap/Tilemap2DRenderer.ts +0 -289
  258. package/src/tilemap/TilemapPlugin.ts +0 -75
  259. package/src/tilemap.ts +0 -6
  260. package/src/tween/Tween2DComponent.ts +0 -83
  261. package/src/tween/Tween2DSystem.ts +0 -78
  262. package/src/tween.ts +0 -4
  263. package/src/types/earcut.d.ts +0 -7
  264. package/src/types/wgsl.d.ts +0 -4
  265. package/src/utils/RenderSystem2DBase.ts +0 -164
  266. package/src/utils/arrayAccess.ts +0 -17
  267. package/src/utils/camera2d.ts +0 -68
  268. package/src/utils/render2dGpu.ts +0 -132
  269. package/test/fixtures/gltf/animation-characterization.gltf +0 -344
@@ -1,197 +0,0 @@
1
- import {
2
- Animation2DActionRuntime,
3
- type Animation2DActionSynchronizedState,
4
- } from '../../animation/runtime/mixer/Action.js';
5
- import { Animation2DMixerRuntime } from '../../animation/runtime/mixer/Mixer.js';
6
- import type {
7
- AnimationStateMachineActionOptions,
8
- AnimationStateMachineMixerPort,
9
- } from './AnimationStateMachineMixerPort.js';
10
-
11
- export class Animation2DStateMachineActionRuntimeHandle {
12
- readonly duration: number;
13
- readonly clipId: string;
14
- readonly action: Animation2DActionRuntime;
15
-
16
- targetTime = 0;
17
- playing = false;
18
- destroyed = false;
19
- pendingDestroy = false;
20
-
21
- private readonly _checkpoint: Animation2DActionSynchronizedState;
22
- private _checkpointTargetTime = 0;
23
- private _checkpointPlaying = false;
24
-
25
- constructor(clipId: string, action: Animation2DActionRuntime) {
26
- this.duration = action.duration;
27
- this.clipId = clipId;
28
- this.action = action;
29
- this._checkpoint = action.createSynchronizedState();
30
- }
31
-
32
- captureTransactionState(): void {
33
- this._checkpointTargetTime = this.targetTime;
34
- this._checkpointPlaying = this.playing;
35
- this.action.captureSynchronizedState(this._checkpoint);
36
- }
37
-
38
- restoreTransactionState(): void {
39
- this.targetTime = this._checkpointTargetTime;
40
- this.playing = this._checkpointPlaying;
41
- this.pendingDestroy = false;
42
- this.action.restoreSynchronizedState(this._checkpoint);
43
- }
44
- }
45
-
46
- /**
47
- * Transactional state-machine owner for the existing 2D mixer. It never
48
- * samples tracks itself: absolute controller playheads are synchronized into
49
- * the mixer actions, and the caller evaluates the ordinary shared pose buffer.
50
- */
51
- export class Animation2DStateMachineMixerAdapter implements
52
- AnimationStateMachineMixerPort<Animation2DStateMachineActionRuntimeHandle> {
53
- private readonly _handles = new Set<Animation2DStateMachineActionRuntimeHandle>();
54
- private readonly _transactionHandles: Animation2DStateMachineActionRuntimeHandle[] = [];
55
- private readonly _transactionCreated: Animation2DStateMachineActionRuntimeHandle[] = [];
56
- private readonly _transactionPendingDestroy: Animation2DStateMachineActionRuntimeHandle[] = [];
57
- private _transactionActive = false;
58
- private _destroyed = false;
59
-
60
- constructor(readonly mixer: Animation2DMixerRuntime) {}
61
-
62
- get liveActionCount(): number { return this._handles.size; }
63
- get liveBindingCount(): number { return this.mixer.liveBindingCount; }
64
-
65
- createAction(
66
- clipId: string,
67
- options: AnimationStateMachineActionOptions,
68
- ): Animation2DStateMachineActionRuntimeHandle {
69
- this._requireActive();
70
- const handle = new Animation2DStateMachineActionRuntimeHandle(
71
- clipId,
72
- this.mixer.createAction(clipId, options),
73
- );
74
- this._handles.add(handle);
75
- if (this._transactionActive) this._transactionCreated.push(handle);
76
- return handle;
77
- }
78
-
79
- play(handle: Animation2DStateMachineActionRuntimeHandle): void {
80
- this._requireHandle(handle);
81
- this.mixer.play(handle.action);
82
- handle.playing = true;
83
- }
84
-
85
- stop(handle: Animation2DStateMachineActionRuntimeHandle): void {
86
- this._requireHandle(handle);
87
- this.mixer.stop(handle.action);
88
- handle.playing = false;
89
- }
90
-
91
- fade(
92
- handle: Animation2DStateMachineActionRuntimeHandle,
93
- _targetWeight: number,
94
- _durationSeconds: number,
95
- ): void {
96
- this._requireHandle(handle);
97
- // The controller is the unique transition clock and applies exact weights.
98
- }
99
-
100
- setWeight(handle: Animation2DStateMachineActionRuntimeHandle, weight: number): void {
101
- this._requireHandle(handle);
102
- this.mixer.setWeight(handle.action, weight);
103
- }
104
-
105
- setTime(handle: Animation2DStateMachineActionRuntimeHandle, timeSeconds: number): void {
106
- this._requireHandle(handle);
107
- handle.targetTime = timeSeconds;
108
- this.mixer.setTime(handle.action, timeSeconds);
109
- }
110
-
111
- setTimeScale(handle: Animation2DStateMachineActionRuntimeHandle, timeScale: number): void {
112
- this._requireHandle(handle);
113
- this.mixer.setTimeScale(handle.action, timeScale);
114
- }
115
-
116
- destroyAction(handle: Animation2DStateMachineActionRuntimeHandle): void {
117
- if (handle.destroyed) return;
118
- this._requireHandle(handle);
119
- if (this._transactionActive) {
120
- if (!handle.pendingDestroy) {
121
- handle.pendingDestroy = true;
122
- this._transactionPendingDestroy.push(handle);
123
- }
124
- return;
125
- }
126
- this._destroyHandleNow(handle);
127
- }
128
-
129
- beginControllerTransaction(): void {
130
- this._requireActive();
131
- if (this._transactionActive) {
132
- throw new Error('Animation2D state-machine adapter transaction is already active.');
133
- }
134
- this._transactionActive = true;
135
- this._transactionHandles.length = 0;
136
- this._transactionCreated.length = 0;
137
- this._transactionPendingDestroy.length = 0;
138
- for (const handle of this._handles) {
139
- handle.captureTransactionState();
140
- this._transactionHandles.push(handle);
141
- }
142
- }
143
-
144
- commitControllerTransaction(): void {
145
- if (!this._transactionActive) {
146
- throw new Error('Animation2D state-machine adapter has no active transaction.');
147
- }
148
- this._transactionActive = false;
149
- for (const handle of this._transactionPendingDestroy) this._destroyHandleNow(handle);
150
- this._clearTransaction();
151
- }
152
-
153
- rollbackControllerTransaction(): void {
154
- if (!this._transactionActive) return;
155
- this._transactionActive = false;
156
- for (let index = this._transactionCreated.length - 1; index >= 0; index--) {
157
- this._destroyHandleNow(this._transactionCreated[index]!);
158
- }
159
- for (const handle of this._transactionHandles) {
160
- if (!handle.destroyed) handle.restoreTransactionState();
161
- }
162
- this._clearTransaction();
163
- }
164
-
165
- destroy(): void {
166
- if (this._destroyed) return;
167
- this.rollbackControllerTransaction();
168
- for (const handle of [...this._handles]) this._destroyHandleNow(handle);
169
- this._destroyed = true;
170
- }
171
-
172
- private _destroyHandleNow(handle: Animation2DStateMachineActionRuntimeHandle): void {
173
- if (handle.destroyed) return;
174
- this.mixer.removeAction(handle.action);
175
- handle.playing = false;
176
- handle.pendingDestroy = false;
177
- handle.destroyed = true;
178
- this._handles.delete(handle);
179
- }
180
-
181
- private _clearTransaction(): void {
182
- this._transactionHandles.length = 0;
183
- this._transactionCreated.length = 0;
184
- this._transactionPendingDestroy.length = 0;
185
- }
186
-
187
- private _requireHandle(handle: Animation2DStateMachineActionRuntimeHandle): void {
188
- this._requireActive();
189
- if (handle.destroyed || !this._handles.has(handle)) {
190
- throw new Error('Animation2D state-machine action belongs to another adapter or was destroyed.');
191
- }
192
- }
193
-
194
- private _requireActive(): void {
195
- if (this._destroyed) throw new Error('Animation2D state-machine adapter has been destroyed.');
196
- }
197
- }
@@ -1,503 +0,0 @@
1
- import type {
2
- CompiledAnimation3DBlend1DMotion,
3
- CompiledAnimation3DBlend2DMotion,
4
- } from './AnimationStateMachineCompiler.js';
5
-
6
- const EPSILON = 1e-9;
7
- const TWO_PI = Math.PI * 2;
8
-
9
- /**
10
- * Evaluates direct child weights for a compiled 1D blend tree. Values outside
11
- * the authored threshold range clamp to the nearest endpoint.
12
- */
13
- export function evaluateAnimation3DBlend1DWeights(
14
- motion: CompiledAnimation3DBlend1DMotion,
15
- value: number,
16
- out: Float64Array = new Float64Array(motion.children.length),
17
- ): Float64Array {
18
- requireOutputSize(out, motion.children.length);
19
- out.fill(0);
20
- const children = motion.children;
21
- if (children.length === 1 || value <= children[0]!.threshold) {
22
- out[0] = 1;
23
- return out;
24
- }
25
- const lastIndex = children.length - 1;
26
- if (value >= children[lastIndex]!.threshold) {
27
- out[lastIndex] = 1;
28
- return out;
29
- }
30
- let low = 0;
31
- let high = lastIndex;
32
- while (low + 1 < high) {
33
- const middle = (low + high) >>> 1;
34
- if (value < children[middle]!.threshold) high = middle;
35
- else low = middle;
36
- }
37
- const start = children[low]!.threshold;
38
- const end = children[high]!.threshold;
39
- const alpha = (value - start) / (end - start);
40
- out[low] = 1 - alpha;
41
- out[high] = alpha;
42
- return out;
43
- }
44
-
45
- /**
46
- * Evaluates direct child weights for a compiled 2D blend tree.
47
- *
48
- * Cartesian trees use a deterministic containing simplex after projecting
49
- * outside samples to the convex hull. Directional trees interpolate the two
50
- * surrounding authored directions and then interpolate/clamp radially.
51
- */
52
- export function evaluateAnimation3DBlend2DWeights(
53
- motion: CompiledAnimation3DBlend2DMotion,
54
- x: number,
55
- y: number,
56
- out: Float64Array = new Float64Array(motion.children.length),
57
- ): Float64Array {
58
- requireOutputSize(out, motion.children.length);
59
- out.fill(0);
60
- if (motion.children.length === 1) {
61
- out[0] = 1;
62
- return out;
63
- }
64
- return motion.algorithm === 'directional'
65
- ? evaluateDirectional(motion, x, y, out)
66
- : evaluateCartesian(motion, x, y, out);
67
- }
68
-
69
- function evaluateCartesian(
70
- motion: CompiledAnimation3DBlend2DMotion,
71
- x: number,
72
- y: number,
73
- out: Float64Array,
74
- ): Float64Array {
75
- const children = motion.children;
76
- const exact = findExactPoint(motion, x, y);
77
- if (exact >= 0) {
78
- out[exact] = 1;
79
- return out;
80
- }
81
-
82
- const hull = convexHull(motion);
83
- const point = clampToHull(motion, hull, x, y);
84
- const clampedExact = findExactPoint(motion, point[0], point[1]);
85
- if (clampedExact >= 0) {
86
- out[clampedExact] = 1;
87
- return out;
88
- }
89
-
90
- let bestArea = Infinity;
91
- let bestIndices: readonly [number, number, number] | null = null;
92
- let bestWeights: readonly [number, number, number] | null = null;
93
- for (let first = 0; first < children.length - 2; first++) {
94
- for (let second = first + 1; second < children.length - 1; second++) {
95
- for (let third = second + 1; third < children.length; third++) {
96
- const a = children[first]!.position;
97
- const b = children[second]!.position;
98
- const c = children[third]!.position;
99
- const signedDoubleArea = cross(a, b, c);
100
- const area = Math.abs(signedDoubleArea);
101
- if (area <= EPSILON) continue;
102
- const weights = barycentric(point, a, b, c, signedDoubleArea);
103
- if (
104
- weights[0] < -EPSILON
105
- || weights[1] < -EPSILON
106
- || weights[2] < -EPSILON
107
- ) continue;
108
- if (
109
- area < bestArea - EPSILON
110
- || (
111
- Math.abs(area - bestArea) <= EPSILON
112
- && lexicographicallyBefore(
113
- [first, second, third],
114
- bestIndices,
115
- )
116
- )
117
- ) {
118
- bestArea = area;
119
- bestIndices = [first, second, third];
120
- bestWeights = weights;
121
- }
122
- }
123
- }
124
- }
125
- if (bestIndices && bestWeights) {
126
- out[bestIndices[0]] = clamp01(bestWeights[0]);
127
- out[bestIndices[1]] = clamp01(bestWeights[1]);
128
- out[bestIndices[2]] = clamp01(bestWeights[2]);
129
- normalize(out);
130
- return out;
131
- }
132
-
133
- // Collinear input (or a numerically degenerate hull): clamp to the closest
134
- // authored segment with declaration order as the final tie breaker.
135
- let bestDistance = Infinity;
136
- let bestLength = Infinity;
137
- let bestFirst = 0;
138
- let bestSecond = 1;
139
- let bestAlpha = 0;
140
- for (let first = 0; first < children.length - 1; first++) {
141
- for (let second = first + 1; second < children.length; second++) {
142
- const projection = closestPointOnSegment(
143
- point[0],
144
- point[1],
145
- children[first]!.position,
146
- children[second]!.position,
147
- );
148
- const dx = projection[0] - point[0];
149
- const dy = projection[1] - point[1];
150
- const distance = dx * dx + dy * dy;
151
- const segmentDx =
152
- children[second]!.position[0] - children[first]!.position[0];
153
- const segmentDy =
154
- children[second]!.position[1] - children[first]!.position[1];
155
- const length = segmentDx * segmentDx + segmentDy * segmentDy;
156
- if (
157
- distance < bestDistance - EPSILON
158
- || (
159
- Math.abs(distance - bestDistance) <= EPSILON
160
- && length < bestLength - EPSILON
161
- )
162
- ) {
163
- bestDistance = distance;
164
- bestLength = length;
165
- bestFirst = first;
166
- bestSecond = second;
167
- bestAlpha = projection[2];
168
- }
169
- }
170
- }
171
- out[bestFirst] = 1 - bestAlpha;
172
- out[bestSecond] = bestAlpha;
173
- return out;
174
- }
175
-
176
- interface DirectionGroup {
177
- readonly angle: number;
178
- readonly entries: readonly {
179
- readonly index: number;
180
- readonly radius: number;
181
- }[];
182
- }
183
-
184
- function evaluateDirectional(
185
- motion: CompiledAnimation3DBlend2DMotion,
186
- x: number,
187
- y: number,
188
- out: Float64Array,
189
- ): Float64Array {
190
- const exact = findExactPoint(motion, x, y);
191
- if (exact >= 0) {
192
- out[exact] = 1;
193
- return out;
194
- }
195
- const radius = Math.hypot(x, y);
196
- const originIndices: number[] = [];
197
- const directionalEntries: {
198
- angle: number;
199
- radius: number;
200
- index: number;
201
- }[] = [];
202
- motion.children.forEach((child, index) => {
203
- const childRadius = Math.hypot(child.position[0], child.position[1]);
204
- if (childRadius <= EPSILON) {
205
- originIndices.push(index);
206
- } else {
207
- directionalEntries.push({
208
- angle: normalizeAngle(Math.atan2(child.position[1], child.position[0])),
209
- radius: childRadius,
210
- index,
211
- });
212
- }
213
- });
214
- if (radius <= EPSILON) {
215
- out[originIndices[0] ?? directionalEntries[0]!.index] = 1;
216
- return out;
217
- }
218
- if (directionalEntries.length === 0) {
219
- out[originIndices[0]!] = 1;
220
- return out;
221
- }
222
- directionalEntries.sort((left, right) =>
223
- left.angle - right.angle
224
- || left.radius - right.radius
225
- || left.index - right.index);
226
- const groups: DirectionGroup[] = [];
227
- directionalEntries.forEach(entry => {
228
- const previous = groups[groups.length - 1];
229
- if (previous && Math.abs(previous.angle - entry.angle) <= EPSILON) {
230
- groups[groups.length - 1] = {
231
- angle: previous.angle,
232
- entries: Object.freeze([...previous.entries, {
233
- index: entry.index,
234
- radius: entry.radius,
235
- }]),
236
- };
237
- } else {
238
- groups.push({
239
- angle: entry.angle,
240
- entries: Object.freeze([{
241
- index: entry.index,
242
- radius: entry.radius,
243
- }]),
244
- });
245
- }
246
- });
247
-
248
- const queryAngle = normalizeAngle(Math.atan2(y, x));
249
- let leftGroupIndex = groups.length - 1;
250
- let rightGroupIndex = 0;
251
- let angularAlpha = 0;
252
- for (let index = 0; index < groups.length; index++) {
253
- const left = groups[index]!;
254
- const rightIndex = (index + 1) % groups.length;
255
- const right = groups[rightIndex]!;
256
- const leftAngle = left.angle;
257
- const rightAngle = rightIndex === 0 ? right.angle + TWO_PI : right.angle;
258
- const adjustedQuery = queryAngle < leftAngle ? queryAngle + TWO_PI : queryAngle;
259
- if (adjustedQuery >= leftAngle - EPSILON && adjustedQuery <= rightAngle + EPSILON) {
260
- leftGroupIndex = index;
261
- rightGroupIndex = rightIndex;
262
- angularAlpha = groups.length === 1
263
- ? 0
264
- : clamp01((adjustedQuery - leftAngle) / (rightAngle - leftAngle));
265
- break;
266
- }
267
- }
268
-
269
- const originIndex = originIndices[0] ?? -1;
270
- accumulateRadial(
271
- groups[leftGroupIndex]!,
272
- radius,
273
- 1 - angularAlpha,
274
- originIndex,
275
- out,
276
- );
277
- if (rightGroupIndex !== leftGroupIndex) {
278
- accumulateRadial(
279
- groups[rightGroupIndex]!,
280
- radius,
281
- angularAlpha,
282
- originIndex,
283
- out,
284
- );
285
- }
286
- normalize(out);
287
- return out;
288
- }
289
-
290
- function accumulateRadial(
291
- group: DirectionGroup,
292
- radius: number,
293
- angularWeight: number,
294
- originIndex: number,
295
- out: Float64Array,
296
- ): void {
297
- if (angularWeight <= EPSILON) return;
298
- const entries = group.entries;
299
- const first = entries[0]!;
300
- if (radius <= first.radius) {
301
- if (originIndex >= 0) {
302
- const alpha = clamp01(radius / first.radius);
303
- out[originIndex] = (out[originIndex] ?? 0) + angularWeight * (1 - alpha);
304
- out[first.index] = (out[first.index] ?? 0) + angularWeight * alpha;
305
- } else {
306
- out[first.index] = (out[first.index] ?? 0) + angularWeight;
307
- }
308
- return;
309
- }
310
- const last = entries[entries.length - 1]!;
311
- if (radius >= last.radius) {
312
- out[last.index] = (out[last.index] ?? 0) + angularWeight;
313
- return;
314
- }
315
- for (let index = 0; index < entries.length - 1; index++) {
316
- const start = entries[index]!;
317
- const end = entries[index + 1]!;
318
- if (radius <= end.radius) {
319
- const alpha = (radius - start.radius) / (end.radius - start.radius);
320
- out[start.index] = (out[start.index] ?? 0) + angularWeight * (1 - alpha);
321
- out[end.index] = (out[end.index] ?? 0) + angularWeight * alpha;
322
- return;
323
- }
324
- }
325
- }
326
-
327
- function convexHull(motion: CompiledAnimation3DBlend2DMotion): readonly number[] {
328
- const sorted = motion.children.map((child, index) => ({
329
- index,
330
- x: child.position[0],
331
- y: child.position[1],
332
- })).sort((left, right) =>
333
- left.x - right.x || left.y - right.y || left.index - right.index);
334
- if (sorted.length <= 2) return sorted.map(entry => entry.index);
335
- const lower: typeof sorted = [];
336
- for (const entry of sorted) {
337
- while (
338
- lower.length >= 2
339
- && crossEntries(lower[lower.length - 2]!, lower[lower.length - 1]!, entry) <= EPSILON
340
- ) lower.pop();
341
- lower.push(entry);
342
- }
343
- const upper: typeof sorted = [];
344
- for (let index = sorted.length - 1; index >= 0; index--) {
345
- const entry = sorted[index]!;
346
- while (
347
- upper.length >= 2
348
- && crossEntries(upper[upper.length - 2]!, upper[upper.length - 1]!, entry) <= EPSILON
349
- ) upper.pop();
350
- upper.push(entry);
351
- }
352
- lower.pop();
353
- upper.pop();
354
- const result = [...lower, ...upper].map(entry => entry.index);
355
- return result.length === 0 ? [sorted[0]!.index] : result;
356
- }
357
-
358
- function clampToHull(
359
- motion: CompiledAnimation3DBlend2DMotion,
360
- hull: readonly number[],
361
- x: number,
362
- y: number,
363
- ): readonly [number, number] {
364
- if (hull.length === 1) return motion.children[hull[0]!]!.position;
365
- if (hull.length === 2) {
366
- const projection = closestPointOnSegment(
367
- x,
368
- y,
369
- motion.children[hull[0]!]!.position,
370
- motion.children[hull[1]!]!.position,
371
- );
372
- return [projection[0], projection[1]];
373
- }
374
- let inside = true;
375
- for (let index = 0; index < hull.length; index++) {
376
- const start = motion.children[hull[index]!]!.position;
377
- const end = motion.children[hull[(index + 1) % hull.length]!]!.position;
378
- if ((end[0] - start[0]) * (y - start[1]) - (end[1] - start[1]) * (x - start[0]) < -EPSILON) {
379
- inside = false;
380
- break;
381
- }
382
- }
383
- if (inside) return [x, y];
384
-
385
- let bestX = x;
386
- let bestY = y;
387
- let bestDistance = Infinity;
388
- for (let index = 0; index < hull.length; index++) {
389
- const projection = closestPointOnSegment(
390
- x,
391
- y,
392
- motion.children[hull[index]!]!.position,
393
- motion.children[hull[(index + 1) % hull.length]!]!.position,
394
- );
395
- const dx = projection[0] - x;
396
- const dy = projection[1] - y;
397
- const distance = dx * dx + dy * dy;
398
- if (distance < bestDistance - EPSILON) {
399
- bestDistance = distance;
400
- bestX = projection[0];
401
- bestY = projection[1];
402
- }
403
- }
404
- return [bestX, bestY];
405
- }
406
-
407
- function closestPointOnSegment(
408
- x: number,
409
- y: number,
410
- start: readonly [number, number],
411
- end: readonly [number, number],
412
- ): readonly [number, number, number] {
413
- const dx = end[0] - start[0];
414
- const dy = end[1] - start[1];
415
- const denominator = dx * dx + dy * dy;
416
- const alpha = denominator <= EPSILON
417
- ? 0
418
- : clamp01(((x - start[0]) * dx + (y - start[1]) * dy) / denominator);
419
- return [start[0] + dx * alpha, start[1] + dy * alpha, alpha];
420
- }
421
-
422
- function barycentric(
423
- point: readonly [number, number],
424
- a: readonly [number, number],
425
- b: readonly [number, number],
426
- c: readonly [number, number],
427
- signedDoubleArea: number,
428
- ): readonly [number, number, number] {
429
- const first = (
430
- (b[0] - point[0]) * (c[1] - point[1])
431
- - (b[1] - point[1]) * (c[0] - point[0])
432
- ) / signedDoubleArea;
433
- const second = (
434
- (c[0] - point[0]) * (a[1] - point[1])
435
- - (c[1] - point[1]) * (a[0] - point[0])
436
- ) / signedDoubleArea;
437
- return [first, second, 1 - first - second];
438
- }
439
-
440
- function findExactPoint(
441
- motion: CompiledAnimation3DBlend2DMotion,
442
- x: number,
443
- y: number,
444
- ): number {
445
- for (let index = 0; index < motion.children.length; index++) {
446
- const position = motion.children[index]!.position;
447
- if (Math.abs(position[0] - x) <= EPSILON && Math.abs(position[1] - y) <= EPSILON) {
448
- return index;
449
- }
450
- }
451
- return -1;
452
- }
453
-
454
- function cross(
455
- a: readonly [number, number],
456
- b: readonly [number, number],
457
- c: readonly [number, number],
458
- ): number {
459
- return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
460
- }
461
-
462
- function crossEntries(
463
- a: { readonly x: number; readonly y: number },
464
- b: { readonly x: number; readonly y: number },
465
- c: { readonly x: number; readonly y: number },
466
- ): number {
467
- return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
468
- }
469
-
470
- function lexicographicallyBefore(
471
- candidate: readonly [number, number, number],
472
- current: readonly [number, number, number] | null,
473
- ): boolean {
474
- if (!current) return true;
475
- return candidate[0] < current[0]
476
- || (candidate[0] === current[0] && candidate[1] < current[1])
477
- || (
478
- candidate[0] === current[0]
479
- && candidate[1] === current[1]
480
- && candidate[2] < current[2]
481
- );
482
- }
483
-
484
- function normalize(out: Float64Array): void {
485
- let total = 0;
486
- for (const value of out) total += value;
487
- if (total <= EPSILON) return;
488
- for (let index = 0; index < out.length; index++) out[index] = out[index]! / total;
489
- }
490
-
491
- function normalizeAngle(angle: number): number {
492
- return angle < 0 ? angle + TWO_PI : angle;
493
- }
494
-
495
- function clamp01(value: number): number {
496
- return Math.max(0, Math.min(1, value));
497
- }
498
-
499
- function requireOutputSize(out: Float64Array, size: number): void {
500
- if (out.length < size) {
501
- throw new RangeError(`Blend weight output requires ${size} entries; received ${out.length}.`);
502
- }
503
- }