@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,453 +0,0 @@
1
- const CURVE_LINEAR = 0;
2
- const CURVE_STEPPED = 1;
3
- const CURVE_BEZIER = 2;
4
-
5
- interface CompiledNumericChannel {
6
- readonly values: Float32Array;
7
- readonly curveKinds: Uint8Array;
8
- readonly curves: Float32Array;
9
- }
10
-
11
- interface CompiledColorChannel {
12
- readonly values: Float32Array;
13
- readonly curveKinds: Uint8Array;
14
- readonly curves: Float32Array;
15
- }
16
-
17
- interface CompiledFrameTimeline {
18
- readonly times: Float64Array;
19
- readonly numericChannels: Map<string, CompiledNumericChannel>;
20
- readonly color: CompiledColorChannel | null;
21
- }
22
-
23
- interface SpineTimelineCursor {
24
- intervalCursor: number;
25
- intervalTime: number;
26
- discreteCursor: number;
27
- discreteTime: number;
28
- }
29
-
30
- /** Runtime-local playback cursors; compiled timeline TypedArrays remain immutable and shareable. */
31
- export interface SpineTimelineSamplerState {
32
- readonly cursors: WeakMap<object, SpineTimelineCursor>;
33
- cursorMisses: number;
34
- }
35
-
36
- export interface SpineTimelineCompileStats {
37
- readonly timelineCount: number;
38
- readonly frameCount: number;
39
- readonly numericChannelCount: number;
40
- }
41
-
42
- const compiledFrames = new WeakMap<object, CompiledFrameTimeline>();
43
- const animationDurations = new WeakMap<object, number>();
44
-
45
- export function createSpineTimelineSamplerState(): SpineTimelineSamplerState {
46
- return { cursors: new WeakMap(), cursorMisses: 0 };
47
- }
48
-
49
- /** Eagerly compiles every frame array reachable from the animation tree. */
50
- export function compileSpineTimelines(
51
- animations: Record<string, unknown>,
52
- samplerState?: SpineTimelineSamplerState,
53
- ): SpineTimelineCompileStats {
54
- let timelineCount = 0;
55
- let frameCount = 0;
56
- let numericChannelCount = 0;
57
- for (const animation of Object.values(animations)) {
58
- let duration = 0;
59
- const visit = (value: unknown): void => {
60
- if (Array.isArray(value)) {
61
- const compiled = compileFrameArray(value);
62
- if (compiled) {
63
- getTimelineCursor(value, samplerState);
64
- timelineCount++;
65
- frameCount += compiled.times.length;
66
- numericChannelCount += compiled.numericChannels.size;
67
- const lastTime = compiled.times[compiled.times.length - 1];
68
- if (lastTime !== undefined && lastTime > duration) duration = lastTime;
69
- } else {
70
- for (const child of value) visit(child);
71
- }
72
- return;
73
- }
74
- if (!value || typeof value !== 'object') return;
75
- for (const child of Object.values(value)) visit(child);
76
- };
77
- visit(animation);
78
- if (animation && typeof animation === 'object') animationDurations.set(animation, duration);
79
- }
80
- return { timelineCount, frameCount, numericChannelCount };
81
- }
82
-
83
- export function getCompiledAnimationDuration(animation: unknown): number {
84
- if (!animation || typeof animation !== 'object') return 0;
85
- const cached = animationDurations.get(animation);
86
- if (cached !== undefined) return cached;
87
- let duration = 0;
88
- const visit = (value: unknown): void => {
89
- if (Array.isArray(value)) {
90
- const compiled = getOrCompileFrames(value);
91
- if (compiled) {
92
- const lastTime = compiled.times[compiled.times.length - 1];
93
- if (lastTime !== undefined && lastTime > duration) duration = lastTime;
94
- } else {
95
- for (const child of value) visit(child);
96
- }
97
- return;
98
- }
99
- if (!value || typeof value !== 'object') return;
100
- for (const child of Object.values(value)) visit(child);
101
- };
102
- visit(animation);
103
- animationDurations.set(animation, duration);
104
- return duration;
105
- }
106
-
107
- export function sampleCompiledTimeline(
108
- frames: unknown[],
109
- time: number,
110
- key: string,
111
- fallback: number,
112
- _duration = 0,
113
- _loop = false,
114
- samplerState?: SpineTimelineSamplerState,
115
- ): number {
116
- const timeline = getOrCompileFrames(frames);
117
- if (!timeline || timeline.times.length === 0) return fallback;
118
- const channel = timeline.numericChannels.get(key) ?? timeline.numericChannels.get('value');
119
- if (!channel) return fallback;
120
- const lastIndex = timeline.times.length - 1;
121
- const firstTime = timeline.times[0] ?? 0;
122
- if (time < firstTime) return fallback;
123
- const lastTime = timeline.times[lastIndex] ?? 0;
124
- if (time >= lastTime) return finiteOrFallback(channel.values[lastIndex], fallback);
125
- const previousIndex = findIntervalIndex(timeline, time, getTimelineCursor(frames, samplerState));
126
- const nextIndex = Math.min(lastIndex, previousIndex + 1);
127
- const start = finiteOrFallback(channel.values[previousIndex], fallback);
128
- const end = finiteOrFallback(channel.values[nextIndex], fallback);
129
- const previousTime = timeline.times[previousIndex] ?? 0;
130
- const nextTime = timeline.times[nextIndex] ?? previousTime;
131
- if (nextIndex === previousIndex || nextTime === previousTime) return start;
132
- const curveKind = channel.curveKinds[previousIndex] ?? CURVE_LINEAR;
133
- if (curveKind === CURVE_STEPPED) return start;
134
- if (curveKind === CURVE_BEZIER) {
135
- return sampleBezierChannel(time, previousTime, start, channel.curves, previousIndex * 4, nextTime, end);
136
- }
137
- const alpha = clampUnit((time - previousTime) / (nextTime - previousTime));
138
- return start + (end - start) * alpha;
139
- }
140
-
141
- /** Returns the last frame whose time is <= sample time, or -1 before the first frame. */
142
- export function findCompiledFrameIndex(
143
- frames: unknown[] | undefined,
144
- time: number,
145
- samplerState?: SpineTimelineSamplerState,
146
- ): number {
147
- const timeline = getOrCompileFrames(frames);
148
- if (!timeline || timeline.times.length === 0 || time < (timeline.times[0] ?? 0)) return -1;
149
- const lastIndex = timeline.times.length - 1;
150
- if (time >= (timeline.times[lastIndex] ?? 0)) {
151
- const state = getTimelineCursor(frames, samplerState);
152
- if (state) {
153
- state.discreteCursor = lastIndex;
154
- state.discreteTime = time;
155
- }
156
- return lastIndex;
157
- }
158
- const state = getTimelineCursor(frames, samplerState);
159
- let cursor = state?.discreteCursor ?? 0;
160
- if (
161
- state
162
- && time >= state.discreteTime
163
- && cursor >= 0
164
- && cursor < lastIndex
165
- && time >= (timeline.times[cursor] ?? 0)
166
- ) {
167
- while (cursor < lastIndex && (timeline.times[cursor + 1] ?? Infinity) <= time) cursor++;
168
- } else {
169
- cursor = upperBound(timeline.times, time) - 1;
170
- }
171
- if (state) {
172
- state.discreteCursor = Math.max(0, cursor);
173
- state.discreteTime = time;
174
- }
175
- return cursor;
176
- }
177
-
178
- export function sampleCompiledColor(
179
- frames: unknown[],
180
- time: number,
181
- fallback: ArrayLike<number>,
182
- out: [number, number, number, number],
183
- samplerState?: SpineTimelineSamplerState,
184
- ): [number, number, number, number] {
185
- const timeline = getOrCompileFrames(frames);
186
- if (!timeline?.color || timeline.times.length === 0) return copyColor(fallback, out);
187
- const channel = timeline.color;
188
- const lastIndex = timeline.times.length - 1;
189
- const firstTime = timeline.times[0] ?? 0;
190
- if (time < firstTime) return copyColor(fallback, out);
191
- const lastTime = timeline.times[lastIndex] ?? 0;
192
- if (time >= lastTime) return copyCompiledColor(channel, lastIndex, fallback, out);
193
- const previousIndex = findIntervalIndex(timeline, time, getTimelineCursor(frames, samplerState));
194
- const nextIndex = Math.min(lastIndex, previousIndex + 1);
195
- const previousTime = timeline.times[previousIndex] ?? 0;
196
- const nextTime = timeline.times[nextIndex] ?? previousTime;
197
- for (let colorChannel = 0; colorChannel < 4; colorChannel++) {
198
- const start = finiteOrFallback(channel.values[previousIndex * 4 + colorChannel], fallback[colorChannel] ?? 1);
199
- const end = finiteOrFallback(channel.values[nextIndex * 4 + colorChannel], fallback[colorChannel] ?? 1);
200
- if (nextIndex === previousIndex || nextTime === previousTime) {
201
- out[colorChannel] = start;
202
- continue;
203
- }
204
- const curveIndex = previousIndex * 4 + colorChannel;
205
- const curveKind = channel.curveKinds[curveIndex] ?? CURVE_LINEAR;
206
- if (curveKind === CURVE_STEPPED) out[colorChannel] = start;
207
- else if (curveKind === CURVE_BEZIER) {
208
- out[colorChannel] = sampleBezierChannel(
209
- time,
210
- previousTime,
211
- start,
212
- channel.curves,
213
- curveIndex * 4,
214
- nextTime,
215
- end,
216
- );
217
- } else {
218
- const alpha = clampUnit((time - previousTime) / (nextTime - previousTime));
219
- out[colorChannel] = start + (end - start) * alpha;
220
- }
221
- }
222
- return out;
223
- }
224
-
225
- function compileFrameArray(frames: unknown[]): CompiledFrameTimeline | null {
226
- if (frames.length === 0 || compiledFrames.has(frames)) return compiledFrames.get(frames) ?? null;
227
- for (const frame of frames) {
228
- if (!frame || typeof frame !== 'object' || Array.isArray(frame)) return null;
229
- }
230
- const records = frames as Array<Record<string, unknown>>;
231
- const times = new Float64Array(records.length);
232
- const numericKeys = new Set<string>();
233
- let hasColor = false;
234
- for (let frameIndex = 0; frameIndex < records.length; frameIndex++) {
235
- const frame = records[frameIndex];
236
- if (!frame) continue;
237
- times[frameIndex] = finiteNumber(frame.time, 0);
238
- for (const [key, value] of Object.entries(frame)) {
239
- if (key === 'time' || key === 'curve') continue;
240
- if (key === 'color' && typeof value === 'string') hasColor = true;
241
- else if (typeof value === 'number') numericKeys.add(key);
242
- }
243
- }
244
- const numericChannels = new Map<string, CompiledNumericChannel>();
245
- for (const key of numericKeys) numericChannels.set(key, compileNumericChannel(records, key));
246
- const timeline: CompiledFrameTimeline = {
247
- times,
248
- numericChannels,
249
- color: hasColor ? compileColorChannel(records) : null,
250
- };
251
- compiledFrames.set(frames, timeline);
252
- return timeline;
253
- }
254
-
255
- function compileNumericChannel(frames: Array<Record<string, unknown>>, key: string): CompiledNumericChannel {
256
- const values = new Float32Array(frames.length);
257
- const curveKinds = new Uint8Array(frames.length);
258
- const curves = new Float32Array(frames.length * 4);
259
- const curveOffset = getCurveOffset(key);
260
- for (let frameIndex = 0; frameIndex < frames.length; frameIndex++) {
261
- const frame = frames[frameIndex];
262
- const value = frame?.[key] ?? frame?.value;
263
- values[frameIndex] = typeof value === 'number' && Number.isFinite(value) ? value : Number.NaN;
264
- compileCurve(frame?.curve, curveOffset, curveKinds, frameIndex, curves, frameIndex * 4);
265
- }
266
- return { values, curveKinds, curves };
267
- }
268
-
269
- function compileColorChannel(frames: Array<Record<string, unknown>>): CompiledColorChannel {
270
- const values = new Float32Array(frames.length * 4);
271
- values.fill(Number.NaN);
272
- const curveKinds = new Uint8Array(frames.length * 4);
273
- const curves = new Float32Array(frames.length * 16);
274
- for (let frameIndex = 0; frameIndex < frames.length; frameIndex++) {
275
- const frame = frames[frameIndex];
276
- writeHexColor(frame?.color, values, frameIndex * 4);
277
- for (let channel = 0; channel < 4; channel++) {
278
- const curveIndex = frameIndex * 4 + channel;
279
- compileCurve(frame?.curve, channel * 4, curveKinds, curveIndex, curves, curveIndex * 4);
280
- }
281
- }
282
- return { values, curveKinds, curves };
283
- }
284
-
285
- function compileCurve(
286
- curve: unknown,
287
- sourceOffset: number,
288
- kinds: Uint8Array,
289
- kindIndex: number,
290
- curves: Float32Array,
291
- targetOffset: number,
292
- ): void {
293
- if (curve === 'stepped') {
294
- kinds[kindIndex] = CURVE_STEPPED;
295
- return;
296
- }
297
- if (!Array.isArray(curve) || curve.length < sourceOffset + 4) return;
298
- kinds[kindIndex] = CURVE_BEZIER;
299
- curves[targetOffset] = finiteNumber(curve[sourceOffset], 0);
300
- curves[targetOffset + 1] = finiteNumber(curve[sourceOffset + 1], 0);
301
- curves[targetOffset + 2] = finiteNumber(curve[sourceOffset + 2], 0);
302
- curves[targetOffset + 3] = finiteNumber(curve[sourceOffset + 3], 0);
303
- }
304
-
305
- function getOrCompileFrames(frames: unknown[] | undefined): CompiledFrameTimeline | null {
306
- if (!Array.isArray(frames) || frames.length === 0) return null;
307
- return compiledFrames.get(frames) ?? compileFrameArray(frames);
308
- }
309
-
310
- function findIntervalIndex(
311
- timeline: CompiledFrameTimeline,
312
- time: number,
313
- state: SpineTimelineCursor | null,
314
- ): number {
315
- const times = timeline.times;
316
- const lastInterval = Math.max(0, times.length - 2);
317
- let cursor = Math.min(lastInterval, state?.intervalCursor ?? 0);
318
- if (
319
- state
320
- && time >= state.intervalTime
321
- && time >= (times[cursor] ?? 0)
322
- && time <= (times[cursor + 1] ?? Infinity)
323
- ) {
324
- state.intervalTime = time;
325
- return cursor;
326
- }
327
- if (state && time >= state.intervalTime && time >= (times[cursor] ?? 0)) {
328
- while (cursor < lastInterval && (times[cursor + 1] ?? Infinity) < time) cursor++;
329
- } else {
330
- cursor = Math.max(0, lowerBound(times, time) - 1);
331
- }
332
- if (state) {
333
- state.intervalCursor = cursor;
334
- state.intervalTime = time;
335
- }
336
- return cursor;
337
- }
338
-
339
- function getTimelineCursor(
340
- frames: object | undefined,
341
- samplerState: SpineTimelineSamplerState | undefined,
342
- ): SpineTimelineCursor | null {
343
- if (!frames || !samplerState) return null;
344
- let cursor = samplerState.cursors.get(frames);
345
- if (!cursor) {
346
- cursor = { intervalCursor: 0, intervalTime: -Infinity, discreteCursor: 0, discreteTime: -Infinity };
347
- samplerState.cursors.set(frames, cursor);
348
- samplerState.cursorMisses++;
349
- }
350
- return cursor;
351
- }
352
-
353
- function lowerBound(values: Float64Array, target: number): number {
354
- let low = 0;
355
- let high = values.length;
356
- while (low < high) {
357
- const middle = (low + high) >>> 1;
358
- if ((values[middle] ?? Infinity) < target) low = middle + 1;
359
- else high = middle;
360
- }
361
- return low;
362
- }
363
-
364
- function upperBound(values: Float64Array, target: number): number {
365
- let low = 0;
366
- let high = values.length;
367
- while (low < high) {
368
- const middle = (low + high) >>> 1;
369
- if ((values[middle] ?? Infinity) <= target) low = middle + 1;
370
- else high = middle;
371
- }
372
- return low;
373
- }
374
-
375
- function sampleBezierChannel(
376
- time: number,
377
- time1: number,
378
- value1: number,
379
- curves: Float32Array,
380
- curveOffset: number,
381
- time2: number,
382
- value2: number,
383
- ): number {
384
- const cx1 = curves[curveOffset] ?? time1;
385
- const cy1 = curves[curveOffset + 1] ?? value1;
386
- const cx2 = curves[curveOffset + 2] ?? time2;
387
- const cy2 = curves[curveOffset + 3] ?? value2;
388
- let low = 0;
389
- let high = 1;
390
- let parameter = 0;
391
- for (let iteration = 0; iteration < 12; iteration++) {
392
- parameter = (low + high) * 0.5;
393
- if (cubicBezier(time1, cx1, cx2, time2, parameter) < time) low = parameter;
394
- else high = parameter;
395
- }
396
- parameter = (low + high) * 0.5;
397
- return cubicBezier(value1, cy1, cy2, value2, parameter);
398
- }
399
-
400
- function cubicBezier(p0: number, p1: number, p2: number, p3: number, time: number): number {
401
- const inverse = 1 - time;
402
- return inverse * inverse * inverse * p0
403
- + 3 * inverse * inverse * time * p1
404
- + 3 * inverse * time * time * p2
405
- + time * time * time * p3;
406
- }
407
-
408
- function copyCompiledColor(
409
- channel: CompiledColorChannel,
410
- frameIndex: number,
411
- fallback: ArrayLike<number>,
412
- out: [number, number, number, number],
413
- ): [number, number, number, number] {
414
- for (let colorChannel = 0; colorChannel < 4; colorChannel++) {
415
- out[colorChannel] = finiteOrFallback(
416
- channel.values[frameIndex * 4 + colorChannel],
417
- fallback[colorChannel] ?? 1,
418
- );
419
- }
420
- return out;
421
- }
422
-
423
- function copyColor(source: ArrayLike<number>, out: [number, number, number, number]): [number, number, number, number] {
424
- out[0] = source[0] ?? 1;
425
- out[1] = source[1] ?? 1;
426
- out[2] = source[2] ?? 1;
427
- out[3] = source[3] ?? 1;
428
- return out;
429
- }
430
-
431
- function writeHexColor(value: unknown, out: Float32Array, offset: number): void {
432
- if (typeof value !== 'string' || value.length < 8) return;
433
- out[offset] = parseInt(value.slice(0, 2), 16) / 255;
434
- out[offset + 1] = parseInt(value.slice(2, 4), 16) / 255;
435
- out[offset + 2] = parseInt(value.slice(4, 6), 16) / 255;
436
- out[offset + 3] = parseInt(value.slice(6, 8), 16) / 255;
437
- }
438
-
439
- function getCurveOffset(key: string): number {
440
- return key === 'y' || key === 'scaleY' || key === 'softness' ? 4 : 0;
441
- }
442
-
443
- function finiteNumber(value: unknown, fallback: number): number {
444
- return typeof value === 'number' && Number.isFinite(value) ? value : fallback;
445
- }
446
-
447
- function finiteOrFallback(value: number | undefined, fallback: number): number {
448
- return value !== undefined && Number.isFinite(value) ? value : fallback;
449
- }
450
-
451
- function clampUnit(value: number): number {
452
- return Math.max(0, Math.min(1, value));
453
- }