@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,30 +0,0 @@
1
- import type {
2
- SpineAnimationBoneTimelines,
3
- SpineAnimationData,
4
- } from './SpineSkeletonRuntime';
5
-
6
- interface SpineAnimationBoneTimelineEntry {
7
- boneName: string;
8
- timelines: SpineAnimationBoneTimelines;
9
- }
10
-
11
- const cache = new WeakMap<object, SpineAnimationBoneTimelineEntry[]>();
12
- const EMPTY: SpineAnimationBoneTimelineEntry[] = [];
13
-
14
- export function compileAnimationBoneTimelines(animations: Record<string, SpineAnimationData>): void {
15
- for (const animation of Object.values(animations)) getAnimationBoneTimelines(animation);
16
- }
17
-
18
- export function getAnimationBoneTimelines(
19
- animation: SpineAnimationData | undefined,
20
- ): SpineAnimationBoneTimelineEntry[] {
21
- if (!animation || typeof animation !== 'object') return EMPTY;
22
- const cached = cache.get(animation);
23
- if (cached) return cached;
24
- const entries: SpineAnimationBoneTimelineEntry[] = [];
25
- for (const [boneName, timelines] of Object.entries(animation.bones ?? {})) {
26
- entries.push({ boneName, timelines });
27
- }
28
- cache.set(animation, entries);
29
- return entries;
30
- }
@@ -1,20 +0,0 @@
1
- import { parseAtlas, type AtlasRegion } from './SpineAtlasParser';
2
- import { normalizeSpineData } from './SpineSkeletonRuntime';
3
-
4
- export interface SpineAssetParserInput { json: unknown; atlasText: string; }
5
- /** Structured-clone-safe parser boundary; the runtime validates and narrows this payload before use. */
6
- export interface SpineParsedAsset { data: unknown; regions: Array<[string, AtlasRegion]>; }
7
-
8
- export const SPINE_ASSET_PARSER = Object.freeze({
9
- type: 'skeleton/spine',
10
- parse(input: SpineAssetParserInput, _context?: { signal?: AbortSignal; source?: string }): SpineParsedAsset {
11
- return {
12
- data: normalizeSpineData(input.json),
13
- regions: [...parseAtlas(input.atlasText).entries()],
14
- };
15
- },
16
- });
17
-
18
- export function parseSpineAssetPayload(input: SpineAssetParserInput): SpineParsedAsset {
19
- return SPINE_ASSET_PARSER.parse(input, { source: 'spine' });
20
- }
@@ -1,112 +0,0 @@
1
- import { WorkerChannel, type WorkerChannelLike } from '@haiyue/engine/experimental/async';
2
- import type { SpineParsedAsset } from './SpineAssetParser';
3
- import type { SpineAssetWorker } from './SpineAssetWorkerContract';
4
-
5
- type SpineWorkerLike = WorkerChannelLike;
6
-
7
- export class SpineAssetWorkerClient implements SpineAssetWorker {
8
- private readonly channel: WorkerChannel;
9
-
10
- constructor(worker: SpineWorkerLike, private readonly objectUrl: string | null = null) {
11
- this.channel = new WorkerChannel(worker, {
12
- label: 'Spine asset worker',
13
- path: 'spine.worker',
14
- context: { resourceType: 'skeleton/spine' },
15
- });
16
- }
17
-
18
- loadParsedAsset(jsonUrl: string, atlasUrl: string, options: { signal?: AbortSignal } = {}): Promise<SpineParsedAsset> {
19
- return this.channel.request('loadParsedSpineAsset', { jsonUrl, atlasUrl }, {
20
- ...(options.signal ? { signal: options.signal } : {}),
21
- context: { url: jsonUrl },
22
- abortMessage: 'Spine load aborted.',
23
- validate: isSpineParsedAsset,
24
- });
25
- }
26
-
27
- dispose(options: { terminate?: boolean } = {}): void {
28
- const alreadyDisposed = this.channel.isDisposed;
29
- this.channel.dispose(options);
30
- if (!alreadyDisposed && this.objectUrl) URL.revokeObjectURL(this.objectUrl);
31
- }
32
- }
33
-
34
- function isSpineParsedAsset(value: unknown): value is SpineParsedAsset {
35
- if (!value || typeof value !== 'object') return false;
36
- const candidate = value as { data?: unknown; regions?: unknown };
37
- const data = candidate.data as { bones?: unknown } | null | undefined;
38
- return !!data && typeof data === 'object'
39
- && Array.isArray(data.bones)
40
- && Array.isArray(candidate.regions);
41
- }
42
-
43
-
44
- export function createSpineAssetWorkerSource(extensionSpineModuleUrl: string): string {
45
- return `
46
- const parserModulePromise = import(${JSON.stringify(extensionSpineModuleUrl)});
47
- const requests = new Map();
48
- const assetError = (message, code, path, recovery, context, cause) => Object.assign(new Error(message), {
49
- domain: 'component', code, path, recovery, recoverable: recovery === 'retry', context, cause,
50
- });
51
- self.addEventListener('message', async event => {
52
- const request = event.data;
53
- if (!request || request.version !== 1 || typeof request.id !== 'number') return;
54
- if (request.type === 'cancel') { requests.get(request.id)?.abort('cancelled'); requests.delete(request.id); return; }
55
- if (request.type !== 'loadParsedSpineAsset') return;
56
- const controller = new AbortController();
57
- requests.set(request.id, controller);
58
- try {
59
- const [parser, jsonResponse, atlasResponse] = await Promise.all([
60
- parserModulePromise,
61
- fetch(request.jsonUrl, { signal: controller.signal }),
62
- request.atlasUrl ? fetch(request.atlasUrl, { signal: controller.signal }) : Promise.resolve(null),
63
- ]);
64
- if (!jsonResponse.ok) throw assetError(
65
- 'Failed to load Spine JSON: ' + jsonResponse.status + ' ' + jsonResponse.statusText,
66
- 'E_ASSET_LOAD_FAILED', 'spine.json', 'retry',
67
- { url: request.jsonUrl, resourceType: 'skeleton/spine-json', status: jsonResponse.status },
68
- );
69
- if (atlasResponse && !atlasResponse.ok) throw assetError(
70
- 'Failed to load Spine atlas: ' + atlasResponse.status + ' ' + atlasResponse.statusText,
71
- 'E_ASSET_LOAD_FAILED', 'spine.atlas', 'retry',
72
- { url: request.atlasUrl, resourceType: 'skeleton/spine-atlas', status: atlasResponse.status },
73
- );
74
- let json;
75
- try { json = await jsonResponse.json(); }
76
- catch (cause) {
77
- throw assetError(
78
- 'Spine JSON is not valid JSON.', 'E_ASSET_INVALID_DATA', 'spine.json', 'release-resource',
79
- { url: request.jsonUrl, resourceType: 'skeleton/spine-json' }, cause,
80
- );
81
- }
82
- const value = parser.parseSpineAssetPayload({
83
- json,
84
- atlasText: atlasResponse ? await atlasResponse.text() : '',
85
- });
86
- self.postMessage({ version: 1, id: request.id, ok: true, value });
87
- } catch (error) {
88
- if (controller.signal.aborted) return;
89
- const serialized = error && typeof error.toJSON === 'function' ? error.toJSON() : {
90
- name: 'EngineError', domain: error && error.domain || 'asset', code: error && error.code || 'E_ASSET_INVALID_DATA',
91
- message: error instanceof Error ? error.message : String(error),
92
- recovery: error && error.recovery || 'release-resource',
93
- recoverable: error && typeof error.recoverable === 'boolean' ? error.recoverable : false,
94
- context: Object.assign({ url: request.jsonUrl, resourceType: 'skeleton/spine' }, error && error.context || {}),
95
- path: error && error.path || 'spine.parse',
96
- cause: error instanceof Error ? { name: error.name, message: error.message, stack: error.stack } : undefined,
97
- };
98
- self.postMessage({ version: 1, id: request.id, ok: false, error: serialized });
99
- } finally { requests.delete(request.id); }
100
- });
101
- `.trim();
102
- }
103
-
104
- export function createInlineSpineAssetWorkerClient(extensionSpineModuleUrl: string, options?: WorkerOptions): SpineAssetWorkerClient {
105
- const blob = new Blob([createSpineAssetWorkerSource(extensionSpineModuleUrl)], { type: 'text/javascript' });
106
- const url = URL.createObjectURL(blob);
107
- return new SpineAssetWorkerClient(new Worker(url, { type: 'module', ...options }), url);
108
- }
109
-
110
- export function createSpineAssetWorkerClientFromUrl(url: string | URL, options?: WorkerOptions): SpineAssetWorkerClient {
111
- return new SpineAssetWorkerClient(new Worker(url, options));
112
- }
@@ -1,4 +0,0 @@
1
- /** Stable structural seam for optional Spine parsing offload. */
2
- export interface SpineAssetWorker {
3
- loadParsedAsset(jsonUrl: string, atlasUrl: string, options?: { signal?: AbortSignal }): Promise<unknown>;
4
- }
@@ -1,127 +0,0 @@
1
- import { EngineError, EngineErrorCode } from '@haiyue/engine';
2
- import { ErrorDomain, ErrorRecovery } from '@haiyue/engine/core';
3
-
4
- export interface AtlasRegion {
5
- name: string;
6
- page: string;
7
- x: number;
8
- y: number;
9
- width: number;
10
- height: number;
11
- originalWidth: number;
12
- originalHeight: number;
13
- offsetX: number;
14
- offsetY: number;
15
- rotate: number;
16
- }
17
-
18
- export interface ResolveAtlasPageImageOptions {
19
- atlasUrl: string;
20
- imageUrl: string;
21
- imageUrls: Record<string, string>;
22
- }
23
-
24
- export function parseAtlas(text: string): Map<string, AtlasRegion> {
25
- const regions = new Map<string, AtlasRegion>();
26
- const lines = text.split(/\r?\n/);
27
- let page = '';
28
- for (let i = 0; i < lines.length; i++) {
29
- const sourceLine = lines[i];
30
- if (sourceLine === undefined) continue;
31
- const line = sourceLine.trim();
32
- if (!line) continue;
33
- if (!line.includes(':')) {
34
- const next = lines[i + 1]?.trim() ?? '';
35
- if (next.startsWith('size:') || next.startsWith('format:') || next.startsWith('filter:') || next.startsWith('repeat:')) {
36
- page = line;
37
- continue;
38
- }
39
- const name = line;
40
- const region: AtlasRegion = {
41
- name,
42
- page,
43
- x: 0,
44
- y: 0,
45
- width: 1,
46
- height: 1,
47
- originalWidth: 0,
48
- originalHeight: 0,
49
- offsetX: 0,
50
- offsetY: 0,
51
- rotate: 0,
52
- };
53
- while (i + 1 < lines.length) {
54
- const propertyLine = lines[i + 1];
55
- if (propertyLine === undefined || !propertyLine.includes(':')) break;
56
- i++;
57
- const separator = propertyLine.indexOf(':');
58
- const key = propertyLine.slice(0, separator).trim();
59
- const raw = propertyLine.slice(separator + 1).trim();
60
- const nums = raw.split(',').map(Number);
61
- const numberAt = (index: number, fallback: number): number => {
62
- const value = nums[index];
63
- return value !== undefined && Number.isFinite(value) ? value : fallback;
64
- };
65
- if (key === 'rotate') region.rotate = raw === 'true' ? 90 : raw === 'false' ? 0 : Number(raw) || 0;
66
- if (key === 'bounds') {
67
- region.x = numberAt(0, region.x);
68
- region.y = numberAt(1, region.y);
69
- region.width = numberAt(2, region.width);
70
- region.height = numberAt(3, region.height);
71
- }
72
- if (key === 'xy') {
73
- region.x = numberAt(0, region.x);
74
- region.y = numberAt(1, region.y);
75
- }
76
- if (key === 'size') {
77
- region.width = numberAt(0, region.width);
78
- region.height = numberAt(1, region.height);
79
- }
80
- if (key === 'orig') {
81
- region.originalWidth = numberAt(0, region.originalWidth);
82
- region.originalHeight = numberAt(1, region.originalHeight);
83
- }
84
- if (key === 'offsets') {
85
- region.offsetX = numberAt(0, region.offsetX);
86
- region.offsetY = numberAt(1, region.offsetY);
87
- region.originalWidth = numberAt(2, region.originalWidth);
88
- region.originalHeight = numberAt(3, region.originalHeight);
89
- }
90
- if (key === 'offset') {
91
- region.offsetX = numberAt(0, region.offsetX);
92
- region.offsetY = numberAt(1, region.offsetY);
93
- }
94
- }
95
- if (!region.originalWidth && !region.originalHeight) {
96
- region.originalWidth = region.width;
97
- region.originalHeight = region.height;
98
- }
99
- regions.set(name, region);
100
- }
101
- }
102
- return regions;
103
- }
104
-
105
- export function resolveAtlasPageImageUrl(
106
- options: ResolveAtlasPageImageOptions,
107
- atlas: Map<string, AtlasRegion>,
108
- page: string,
109
- ): string {
110
- const mapped = options.imageUrls[page] ?? options.imageUrls[page.split('/').pop() ?? page];
111
- if (mapped) return mapped;
112
- if (options.imageUrl && (!page || atlasPageCount(atlas) <= 1)) return options.imageUrl;
113
- if (!page) {
114
- if (options.imageUrl) return options.imageUrl;
115
- throw new EngineError(EngineErrorCode.AssetInvalidData, 'Spine imageUrl is required when atlas has no page.', {
116
- domain: ErrorDomain.Component,
117
- recovery: ErrorRecovery.ReleaseResource,
118
- context: { atlasUrl: options.atlasUrl, resourceType: 'skeleton/spine-atlas' },
119
- path: 'spine.atlas.pages',
120
- });
121
- }
122
- return new URL(page, options.atlasUrl || window.location.href).href;
123
- }
124
-
125
- export function atlasPageCount(atlas: Map<string, AtlasRegion>): number {
126
- return new Set(Array.from(atlas.values()).map(region => region.page).filter(Boolean)).size;
127
- }
@@ -1,66 +0,0 @@
1
- export class SpineFloatBuilder {
2
- data: Float32Array;
3
- length = 0;
4
-
5
- constructor(initialCapacity = 1024) {
6
- this.data = new Float32Array(initialCapacity);
7
- }
8
-
9
- clear(): void {
10
- this.length = 0;
11
- }
12
-
13
- get byteLength(): number {
14
- return this.length * 4;
15
- }
16
-
17
- get(index: number): number {
18
- return this.data[index] ?? 0;
19
- }
20
-
21
- push(...values: number[]): void {
22
- this.ensureCapacity(this.length + values.length);
23
- this.data.set(values, this.length);
24
- this.length += values.length;
25
- }
26
-
27
- push8(a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number): void {
28
- this.ensureCapacity(this.length + 8);
29
- const offset = this.length;
30
- this.data[offset] = a;
31
- this.data[offset + 1] = b;
32
- this.data[offset + 2] = c;
33
- this.data[offset + 3] = d;
34
- this.data[offset + 4] = e;
35
- this.data[offset + 5] = f;
36
- this.data[offset + 6] = g;
37
- this.data[offset + 7] = h;
38
- this.length += 8;
39
- }
40
-
41
- appendArray(values: ArrayLike<number>, length = values.length): void {
42
- this.ensureCapacity(this.length + length);
43
- for (let i = 0; i < length; i++) this.data[this.length + i] = values[i] ?? 0;
44
- this.length += length;
45
- }
46
-
47
- truncate(length: number): void {
48
- this.length = Math.max(0, Math.min(this.length, length));
49
- }
50
-
51
- /** Grows storage if needed and exposes a reusable writable region without allocating a temporary array. */
52
- reserveLength(length: number): void {
53
- const nextLength = Math.max(0, length);
54
- this.ensureCapacity(nextLength);
55
- this.length = nextLength;
56
- }
57
-
58
- private ensureCapacity(required: number): void {
59
- if (this.data.length >= required) return;
60
- let nextCapacity = Math.max(1, this.data.length);
61
- while (nextCapacity < required) nextCapacity *= 2;
62
- const next = new Float32Array(nextCapacity);
63
- next.set(this.data.subarray(0, this.length));
64
- this.data = next;
65
- }
66
- }