@sadhaka/loom-engine 0.10.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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +344 -0
  3. package/dist/animation/animation-clip.d.ts +12 -0
  4. package/dist/animation/animation-clip.d.ts.map +1 -0
  5. package/dist/animation/animation-clip.js +85 -0
  6. package/dist/animation/animation-clip.js.map +1 -0
  7. package/dist/animation/animation-state-pool.d.ts +25 -0
  8. package/dist/animation/animation-state-pool.d.ts.map +1 -0
  9. package/dist/animation/animation-state-pool.js +113 -0
  10. package/dist/animation/animation-state-pool.js.map +1 -0
  11. package/dist/asset/sprite-sheet-loader.d.ts +41 -0
  12. package/dist/asset/sprite-sheet-loader.d.ts.map +1 -0
  13. package/dist/asset/sprite-sheet-loader.js +313 -0
  14. package/dist/asset/sprite-sheet-loader.js.map +1 -0
  15. package/dist/audio/audio-bus.d.ts +43 -0
  16. package/dist/audio/audio-bus.d.ts.map +1 -0
  17. package/dist/audio/audio-bus.js +258 -0
  18. package/dist/audio/audio-bus.js.map +1 -0
  19. package/dist/combat/mob-catalog.d.ts +29 -0
  20. package/dist/combat/mob-catalog.d.ts.map +1 -0
  21. package/dist/combat/mob-catalog.js +104 -0
  22. package/dist/combat/mob-catalog.js.map +1 -0
  23. package/dist/components/health.d.ts +28 -0
  24. package/dist/components/health.d.ts.map +1 -0
  25. package/dist/components/health.js +150 -0
  26. package/dist/components/health.js.map +1 -0
  27. package/dist/components/interactable.d.ts +30 -0
  28. package/dist/components/interactable.d.ts.map +1 -0
  29. package/dist/components/interactable.js +94 -0
  30. package/dist/components/interactable.js.map +1 -0
  31. package/dist/components/particle-emitter.d.ts +62 -0
  32. package/dist/components/particle-emitter.d.ts.map +1 -0
  33. package/dist/components/particle-emitter.js +193 -0
  34. package/dist/components/particle-emitter.js.map +1 -0
  35. package/dist/components/pursue.d.ts +23 -0
  36. package/dist/components/pursue.d.ts.map +1 -0
  37. package/dist/components/pursue.js +96 -0
  38. package/dist/components/pursue.js.map +1 -0
  39. package/dist/components/ranged-attack.d.ts +44 -0
  40. package/dist/components/ranged-attack.d.ts.map +1 -0
  41. package/dist/components/ranged-attack.js +120 -0
  42. package/dist/components/ranged-attack.js.map +1 -0
  43. package/dist/components/sprite.d.ts +27 -0
  44. package/dist/components/sprite.d.ts.map +1 -0
  45. package/dist/components/sprite.js +122 -0
  46. package/dist/components/sprite.js.map +1 -0
  47. package/dist/components/transform.d.ts +30 -0
  48. package/dist/components/transform.d.ts.map +1 -0
  49. package/dist/components/transform.js +150 -0
  50. package/dist/components/transform.js.map +1 -0
  51. package/dist/director/director-bridge.d.ts +22 -0
  52. package/dist/director/director-bridge.d.ts.map +1 -0
  53. package/dist/director/director-bridge.js +23 -0
  54. package/dist/director/director-bridge.js.map +1 -0
  55. package/dist/director/director-encounter-system.d.ts +21 -0
  56. package/dist/director/director-encounter-system.d.ts.map +1 -0
  57. package/dist/director/director-encounter-system.js +128 -0
  58. package/dist/director/director-encounter-system.js.map +1 -0
  59. package/dist/director/director-system.d.ts +19 -0
  60. package/dist/director/director-system.d.ts.map +1 -0
  61. package/dist/director/director-system.js +179 -0
  62. package/dist/director/director-system.js.map +1 -0
  63. package/dist/director/event-envelope.d.ts +144 -0
  64. package/dist/director/event-envelope.d.ts.map +1 -0
  65. package/dist/director/event-envelope.js +108 -0
  66. package/dist/director/event-envelope.js.map +1 -0
  67. package/dist/director/knot-context-resource.d.ts +25 -0
  68. package/dist/director/knot-context-resource.d.ts.map +1 -0
  69. package/dist/director/knot-context-resource.js +152 -0
  70. package/dist/director/knot-context-resource.js.map +1 -0
  71. package/dist/director/mock-director-bridge.d.ts +18 -0
  72. package/dist/director/mock-director-bridge.d.ts.map +1 -0
  73. package/dist/director/mock-director-bridge.js +75 -0
  74. package/dist/director/mock-director-bridge.js.map +1 -0
  75. package/dist/director/snapshot-recovery.d.ts +37 -0
  76. package/dist/director/snapshot-recovery.d.ts.map +1 -0
  77. package/dist/director/snapshot-recovery.js +180 -0
  78. package/dist/director/snapshot-recovery.js.map +1 -0
  79. package/dist/director/sse-director-bridge.d.ts +42 -0
  80. package/dist/director/sse-director-bridge.d.ts.map +1 -0
  81. package/dist/director/sse-director-bridge.js +280 -0
  82. package/dist/director/sse-director-bridge.js.map +1 -0
  83. package/dist/engine.d.ts +25 -0
  84. package/dist/engine.d.ts.map +1 -0
  85. package/dist/engine.js +166 -0
  86. package/dist/engine.js.map +1 -0
  87. package/dist/entity.d.ts +17 -0
  88. package/dist/entity.d.ts.map +1 -0
  89. package/dist/entity.js +77 -0
  90. package/dist/entity.js.map +1 -0
  91. package/dist/index.d.ts +85 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +64 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/input/input-manager.d.ts +91 -0
  96. package/dist/input/input-manager.d.ts.map +1 -0
  97. package/dist/input/input-manager.js +349 -0
  98. package/dist/input/input-manager.js.map +1 -0
  99. package/dist/input/tap-to-walk.d.ts +27 -0
  100. package/dist/input/tap-to-walk.d.ts.map +1 -0
  101. package/dist/input/tap-to-walk.js +118 -0
  102. package/dist/input/tap-to-walk.js.map +1 -0
  103. package/dist/input/virtual-dpad.d.ts +34 -0
  104. package/dist/input/virtual-dpad.d.ts.map +1 -0
  105. package/dist/input/virtual-dpad.js +267 -0
  106. package/dist/input/virtual-dpad.js.map +1 -0
  107. package/dist/renderer/camera.d.ts +26 -0
  108. package/dist/renderer/camera.d.ts.map +1 -0
  109. package/dist/renderer/camera.js +39 -0
  110. package/dist/renderer/camera.js.map +1 -0
  111. package/dist/renderer/canvas2d-device.d.ts +26 -0
  112. package/dist/renderer/canvas2d-device.d.ts.map +1 -0
  113. package/dist/renderer/canvas2d-device.js +252 -0
  114. package/dist/renderer/canvas2d-device.js.map +1 -0
  115. package/dist/renderer/graphics-device.d.ts +36 -0
  116. package/dist/renderer/graphics-device.d.ts.map +1 -0
  117. package/dist/renderer/graphics-device.js +12 -0
  118. package/dist/renderer/graphics-device.js.map +1 -0
  119. package/dist/renderer/iso-projection.d.ts +11 -0
  120. package/dist/renderer/iso-projection.d.ts.map +1 -0
  121. package/dist/renderer/iso-projection.js +59 -0
  122. package/dist/renderer/iso-projection.js.map +1 -0
  123. package/dist/resources.d.ts +28 -0
  124. package/dist/resources.d.ts.map +1 -0
  125. package/dist/resources.js +53 -0
  126. package/dist/resources.js.map +1 -0
  127. package/dist/system.d.ts +14 -0
  128. package/dist/system.d.ts.map +1 -0
  129. package/dist/system.js +25 -0
  130. package/dist/system.js.map +1 -0
  131. package/dist/systems/animation-system.d.ts +8 -0
  132. package/dist/systems/animation-system.d.ts.map +1 -0
  133. package/dist/systems/animation-system.js +77 -0
  134. package/dist/systems/animation-system.js.map +1 -0
  135. package/dist/systems/attack-system.d.ts +17 -0
  136. package/dist/systems/attack-system.d.ts.map +1 -0
  137. package/dist/systems/attack-system.js +94 -0
  138. package/dist/systems/attack-system.js.map +1 -0
  139. package/dist/systems/damage-system.d.ts +18 -0
  140. package/dist/systems/damage-system.d.ts.map +1 -0
  141. package/dist/systems/damage-system.js +77 -0
  142. package/dist/systems/damage-system.js.map +1 -0
  143. package/dist/systems/input-system.d.ts +7 -0
  144. package/dist/systems/input-system.d.ts.map +1 -0
  145. package/dist/systems/input-system.js +27 -0
  146. package/dist/systems/input-system.js.map +1 -0
  147. package/dist/systems/interaction-system.d.ts +23 -0
  148. package/dist/systems/interaction-system.d.ts.map +1 -0
  149. package/dist/systems/interaction-system.js +120 -0
  150. package/dist/systems/interaction-system.js.map +1 -0
  151. package/dist/systems/particle-emitter-system.d.ts +8 -0
  152. package/dist/systems/particle-emitter-system.d.ts.map +1 -0
  153. package/dist/systems/particle-emitter-system.js +161 -0
  154. package/dist/systems/particle-emitter-system.js.map +1 -0
  155. package/dist/systems/particle-render-system.d.ts +7 -0
  156. package/dist/systems/particle-render-system.d.ts.map +1 -0
  157. package/dist/systems/particle-render-system.js +53 -0
  158. package/dist/systems/particle-render-system.js.map +1 -0
  159. package/dist/systems/particle-simulation-system.d.ts +8 -0
  160. package/dist/systems/particle-simulation-system.d.ts.map +1 -0
  161. package/dist/systems/particle-simulation-system.js +45 -0
  162. package/dist/systems/particle-simulation-system.js.map +1 -0
  163. package/dist/systems/projectile-render-system.d.ts +7 -0
  164. package/dist/systems/projectile-render-system.d.ts.map +1 -0
  165. package/dist/systems/projectile-render-system.js +35 -0
  166. package/dist/systems/projectile-render-system.js.map +1 -0
  167. package/dist/systems/projectile-system.d.ts +7 -0
  168. package/dist/systems/projectile-system.d.ts.map +1 -0
  169. package/dist/systems/projectile-system.js +114 -0
  170. package/dist/systems/projectile-system.js.map +1 -0
  171. package/dist/systems/pursue-system.d.ts +7 -0
  172. package/dist/systems/pursue-system.d.ts.map +1 -0
  173. package/dist/systems/pursue-system.js +83 -0
  174. package/dist/systems/pursue-system.js.map +1 -0
  175. package/dist/systems/ranged-attack-system.d.ts +7 -0
  176. package/dist/systems/ranged-attack-system.d.ts.map +1 -0
  177. package/dist/systems/ranged-attack-system.js +98 -0
  178. package/dist/systems/ranged-attack-system.js.map +1 -0
  179. package/dist/systems/sprite-render-system.d.ts +9 -0
  180. package/dist/systems/sprite-render-system.d.ts.map +1 -0
  181. package/dist/systems/sprite-render-system.js +108 -0
  182. package/dist/systems/sprite-render-system.js.map +1 -0
  183. package/dist/systems/veil-budget-system.d.ts +7 -0
  184. package/dist/systems/veil-budget-system.d.ts.map +1 -0
  185. package/dist/systems/veil-budget-system.js +37 -0
  186. package/dist/systems/veil-budget-system.js.map +1 -0
  187. package/dist/util/color.d.ts +19 -0
  188. package/dist/util/color.d.ts.map +1 -0
  189. package/dist/util/color.js +45 -0
  190. package/dist/util/color.js.map +1 -0
  191. package/dist/util/math.d.ts +26 -0
  192. package/dist/util/math.d.ts.map +1 -0
  193. package/dist/util/math.js +47 -0
  194. package/dist/util/math.js.map +1 -0
  195. package/dist/util/typed-arrays.d.ts +7 -0
  196. package/dist/util/typed-arrays.d.ts.map +1 -0
  197. package/dist/util/typed-arrays.js +42 -0
  198. package/dist/util/typed-arrays.js.map +1 -0
  199. package/dist/vfx/particle-pool.d.ts +61 -0
  200. package/dist/vfx/particle-pool.d.ts.map +1 -0
  201. package/dist/vfx/particle-pool.js +204 -0
  202. package/dist/vfx/particle-pool.js.map +1 -0
  203. package/dist/vfx/projectile-pool.d.ts +56 -0
  204. package/dist/vfx/projectile-pool.d.ts.map +1 -0
  205. package/dist/vfx/projectile-pool.js +157 -0
  206. package/dist/vfx/projectile-pool.js.map +1 -0
  207. package/dist/world.d.ts +23 -0
  208. package/dist/world.d.ts.map +1 -0
  209. package/dist/world.js +101 -0
  210. package/dist/world.js.map +1 -0
  211. package/dist/zone/zone-catalog.d.ts +17 -0
  212. package/dist/zone/zone-catalog.d.ts.map +1 -0
  213. package/dist/zone/zone-catalog.js +116 -0
  214. package/dist/zone/zone-catalog.js.map +1 -0
  215. package/dist/zone/zone-state.d.ts +18 -0
  216. package/dist/zone/zone-state.d.ts.map +1 -0
  217. package/dist/zone/zone-state.js +52 -0
  218. package/dist/zone/zone-state.js.map +1 -0
  219. package/package.json +56 -0
@@ -0,0 +1,26 @@
1
+ export interface Vec2 {
2
+ x: number;
3
+ y: number;
4
+ }
5
+ export interface Vec3 {
6
+ x: number;
7
+ y: number;
8
+ z: number;
9
+ }
10
+ export interface Rect {
11
+ x: number;
12
+ y: number;
13
+ width: number;
14
+ height: number;
15
+ }
16
+ export declare function vec2(x: number, y: number): Vec2;
17
+ export declare function vec3(x: number, y: number, z: number): Vec3;
18
+ export declare function rect(x: number, y: number, width: number, height: number): Rect;
19
+ export declare function clamp(v: number, lo: number, hi: number): number;
20
+ export declare function lerp(a: number, b: number, t: number): number;
21
+ export declare function smoothstep(edge0: number, edge1: number, x: number): number;
22
+ export declare function approxEq(a: number, b: number, epsilon?: number): boolean;
23
+ export declare function rectContains(r: Rect, x: number, y: number): boolean;
24
+ export declare function rectIntersects(a: Rect, b: Rect): boolean;
25
+ export declare function visibleInView(worldRect: Rect, viewRect: Rect): boolean;
26
+ //# sourceMappingURL=math.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/util/math.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAE1D;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9E;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAI/D;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAG1E;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,MAAa,GAAG,OAAO,CAE9E;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAOxD;AAKD,wBAAgB,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,OAAO,CAEtE"}
@@ -0,0 +1,47 @@
1
+ // Math primitives for the Loom Engine.
2
+ //
3
+ // Plain object Vec2/Vec3 types - no class hierarchy, no methods on
4
+ // instances. Free functions operate on them. Cheap to allocate, cheap
5
+ // to pool, no prototype chain.
6
+ export function vec2(x, y) {
7
+ return { x, y };
8
+ }
9
+ export function vec3(x, y, z) {
10
+ return { x, y, z };
11
+ }
12
+ export function rect(x, y, width, height) {
13
+ return { x, y, width, height };
14
+ }
15
+ export function clamp(v, lo, hi) {
16
+ if (v < lo)
17
+ return lo;
18
+ if (v > hi)
19
+ return hi;
20
+ return v;
21
+ }
22
+ export function lerp(a, b, t) {
23
+ return a + (b - a) * t;
24
+ }
25
+ export function smoothstep(edge0, edge1, x) {
26
+ const t = clamp((x - edge0) / (edge1 - edge0), 0, 1);
27
+ return t * t * (3 - 2 * t);
28
+ }
29
+ export function approxEq(a, b, epsilon = 1e-6) {
30
+ return Math.abs(a - b) <= epsilon;
31
+ }
32
+ export function rectContains(r, x, y) {
33
+ return x >= r.x && x <= r.x + r.width && y >= r.y && y <= r.y + r.height;
34
+ }
35
+ export function rectIntersects(a, b) {
36
+ return !(a.x + a.width < b.x ||
37
+ b.x + b.width < a.x ||
38
+ a.y + a.height < b.y ||
39
+ b.y + b.height < a.y);
40
+ }
41
+ // Frustum cull helper - returns true if the world-space rect overlaps
42
+ // the camera-space view rect. Used by render systems to skip offscreen
43
+ // entities before they hit the device layer.
44
+ export function visibleInView(worldRect, viewRect) {
45
+ return rectIntersects(worldRect, viewRect);
46
+ }
47
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/util/math.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,mEAAmE;AACnE,sEAAsE;AACtE,+BAA+B;AAoB/B,MAAM,UAAU,IAAI,CAAC,CAAS,EAAE,CAAS;IACvC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAClD,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,CAAS,EAAE,CAAS,EAAE,KAAa,EAAE,MAAc;IACtE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,CAAS,EAAE,EAAU,EAAE,EAAU;IACrD,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,CAAC;IACtB,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAClD,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,KAAa,EAAE,CAAS;IAChE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,UAAkB,IAAI;IACnE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAO,EAAE,CAAS,EAAE,CAAS;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAO,EAAE,CAAO;IAC7C,OAAO,CAAC,CACN,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CACrB,CAAC;AACJ,CAAC;AAED,sEAAsE;AACtE,uEAAuE;AACvE,6CAA6C;AAC7C,MAAM,UAAU,aAAa,CAAC,SAAe,EAAE,QAAc;IAC3D,OAAO,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function nextPow2(n: number): number;
2
+ export declare function growF32(src: Float32Array, newCapacity: number): Float32Array;
3
+ export declare function growI32(src: Int32Array, newCapacity: number): Int32Array;
4
+ export declare function growU32(src: Uint32Array, newCapacity: number): Uint32Array;
5
+ export declare function growU8(src: Uint8Array, newCapacity: number): Uint8Array;
6
+ export declare function fillF32(arr: Float32Array, value: number, start?: number, end?: number): void;
7
+ //# sourceMappingURL=typed-arrays.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed-arrays.d.ts","sourceRoot":"","sources":["../../src/util/typed-arrays.ts"],"names":[],"mappings":"AAOA,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK1C;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,CAI5E;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU,CAIxE;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,WAAW,CAI1E;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU,CAIvE;AAID,wBAAgB,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI,CAI3G"}
@@ -0,0 +1,42 @@
1
+ // Typed array helpers for the Loom Engine.
2
+ //
3
+ // Pools use a power-of-two grow strategy: when a write exceeds the
4
+ // current capacity, allocate a 2x array and copy the old contents.
5
+ // All component pools (TransformPool, etc.) use these helpers to
6
+ // stay consistent.
7
+ export function nextPow2(n) {
8
+ if (n <= 1)
9
+ return 1;
10
+ let p = 1;
11
+ while (p < n)
12
+ p <<= 1;
13
+ return p;
14
+ }
15
+ export function growF32(src, newCapacity) {
16
+ const next = new Float32Array(newCapacity);
17
+ next.set(src);
18
+ return next;
19
+ }
20
+ export function growI32(src, newCapacity) {
21
+ const next = new Int32Array(newCapacity);
22
+ next.set(src);
23
+ return next;
24
+ }
25
+ export function growU32(src, newCapacity) {
26
+ const next = new Uint32Array(newCapacity);
27
+ next.set(src);
28
+ return next;
29
+ }
30
+ export function growU8(src, newCapacity) {
31
+ const next = new Uint8Array(newCapacity);
32
+ next.set(src);
33
+ return next;
34
+ }
35
+ // Fast clear for a typed array slice. Avoids allocating a new array
36
+ // when the pool is reset (between encounters, scene swaps).
37
+ export function fillF32(arr, value, start = 0, end = arr.length) {
38
+ for (let i = start; i < end; i++) {
39
+ arr[i] = value;
40
+ }
41
+ }
42
+ //# sourceMappingURL=typed-arrays.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed-arrays.js","sourceRoot":"","sources":["../../src/util/typed-arrays.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,mEAAmE;AACnE,mEAAmE;AACnE,iEAAiE;AACjE,mBAAmB;AAEnB,MAAM,UAAU,QAAQ,CAAC,CAAS;IAChC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACrB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,CAAC;QAAE,CAAC,KAAK,CAAC,CAAC;IACtB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAiB,EAAE,WAAmB;IAC5D,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACd,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAe,EAAE,WAAmB;IAC1D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACd,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAgB,EAAE,WAAmB;IAC3D,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACd,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,GAAe,EAAE,WAAmB;IACzD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACd,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oEAAoE;AACpE,4DAA4D;AAC5D,MAAM,UAAU,OAAO,CAAC,GAAiB,EAAE,KAAa,EAAE,QAAgB,CAAC,EAAE,MAAc,GAAG,CAAC,MAAM;IACnG,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,61 @@
1
+ import type { ColorRGBA } from '../util/color.js';
2
+ export declare const PARTICLE_FLAG_ALIVE: number;
3
+ export declare const PARTICLE_FLAG_ADDITIVE: number;
4
+ export interface ParticleSpawn {
5
+ x: number;
6
+ y: number;
7
+ z: number;
8
+ vx?: number;
9
+ vy?: number;
10
+ vz?: number;
11
+ ax?: number;
12
+ ay?: number;
13
+ az?: number;
14
+ life: number;
15
+ size?: number;
16
+ endSize?: number;
17
+ color: Readonly<ColorRGBA>;
18
+ endColor?: Readonly<ColorRGBA>;
19
+ additive?: boolean;
20
+ }
21
+ export declare class ParticlePool {
22
+ x: Float32Array;
23
+ y: Float32Array;
24
+ z: Float32Array;
25
+ vx: Float32Array;
26
+ vy: Float32Array;
27
+ vz: Float32Array;
28
+ ax: Float32Array;
29
+ ay: Float32Array;
30
+ az: Float32Array;
31
+ life: Float32Array;
32
+ maxLife: Float32Array;
33
+ size: Float32Array;
34
+ endSize: Float32Array;
35
+ r0: Float32Array;
36
+ g0: Float32Array;
37
+ b0: Float32Array;
38
+ a0: Float32Array;
39
+ r1: Float32Array;
40
+ g1: Float32Array;
41
+ b1: Float32Array;
42
+ a1: Float32Array;
43
+ flags: Uint8Array;
44
+ private capacity;
45
+ private liveCount;
46
+ private freeList;
47
+ private highWaterMark;
48
+ private maxParticles;
49
+ constructor(initialCapacity?: number, maxParticles?: number);
50
+ setMaxParticles(n: number): void;
51
+ getMaxParticles(): number;
52
+ getLiveCount(): number;
53
+ getHighWaterMark(): number;
54
+ getCapacity(): number;
55
+ private ensureCapacity;
56
+ spawn(p: ParticleSpawn): number;
57
+ kill(i: number): void;
58
+ isAlive(i: number): boolean;
59
+ clear(): void;
60
+ }
61
+ //# sourceMappingURL=particle-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"particle-pool.d.ts","sourceRoot":"","sources":["../../src/vfx/particle-pool.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAC1C,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAI7C,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,YAAY;IAEvB,CAAC,EAAE,YAAY,CAAC;IAChB,CAAC,EAAE,YAAY,CAAC;IAChB,CAAC,EAAE,YAAY,CAAC;IAChB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;IAEtB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;IAElB,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,SAAS,CAAa;IAI9B,OAAO,CAAC,QAAQ,CAAgB;IAGhC,OAAO,CAAC,aAAa,CAAa;IAGlC,OAAO,CAAC,YAAY,CAAS;gBAEjB,eAAe,GAAE,MAAY,EAAE,YAAY,GAAE,MAAa;IA2BtE,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKhC,eAAe,IAAI,MAAM;IAIzB,YAAY,IAAI,MAAM;IAItB,gBAAgB,IAAI,MAAM;IAI1B,WAAW,IAAI,MAAM;IAIrB,OAAO,CAAC,cAAc;IA+BtB,KAAK,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM;IAmD/B,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAQrB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAO3B,KAAK,IAAI,IAAI;CAMd"}
@@ -0,0 +1,204 @@
1
+ // ParticlePool - flat structure-of-arrays storage for ephemeral
2
+ // particles. Particles are NOT ECS entities. They have no
3
+ // generation, no entity-id, no participation in the entity allocator.
4
+ // They are short-lived render decoration with their own simple
5
+ // integer index space and a free-list for slot recycling.
6
+ //
7
+ // This separation is deliberate. Particles can hit thousands per
8
+ // second at peak (a knight on fire, a spell hit, a death explosion);
9
+ // going through the entity allocator + transform pool would burn
10
+ // EntityId space and force every component pool to grow alongside.
11
+ //
12
+ // Layout: hot data (position, velocity, life) in Float32Arrays;
13
+ // color rgba in four parallel Float32Arrays; size in Float32Array;
14
+ // flags in Uint8Array. Capacity grows by 2x; live count tracked
15
+ // separately so iteration stays O(live) not O(capacity).
16
+ import { growF32, growU8, nextPow2 } from '../util/typed-arrays.js';
17
+ export const PARTICLE_FLAG_ALIVE = 1 << 0;
18
+ export const PARTICLE_FLAG_ADDITIVE = 1 << 1;
19
+ export class ParticlePool {
20
+ // Hot per-particle data
21
+ x;
22
+ y;
23
+ z;
24
+ vx;
25
+ vy;
26
+ vz;
27
+ ax;
28
+ ay;
29
+ az;
30
+ life; // seconds remaining
31
+ maxLife; // total seconds at spawn (for fade interpolation)
32
+ size;
33
+ endSize;
34
+ // Color start + end (interpolated by life/maxLife each frame)
35
+ r0;
36
+ g0;
37
+ b0;
38
+ a0;
39
+ r1;
40
+ g1;
41
+ b1;
42
+ a1;
43
+ flags;
44
+ capacity = 0;
45
+ liveCount = 0;
46
+ // Free list of indices below the high-water mark that have been
47
+ // freed. Avoids fragmentation: spawn pulls from here first, then
48
+ // bumps the highWaterMark.
49
+ freeList = [];
50
+ // Index just past the highest slot ever used. Iteration sweeps
51
+ // [0, highWaterMark).
52
+ highWaterMark = 0;
53
+ // Hard cap. Spawn returns -1 when liveCount >= maxParticles. The
54
+ // Director can set this from the Veil Essence budget per frame.
55
+ maxParticles;
56
+ constructor(initialCapacity = 256, maxParticles = 4096) {
57
+ this.capacity = nextPow2(initialCapacity);
58
+ this.maxParticles = maxParticles;
59
+ this.x = new Float32Array(this.capacity);
60
+ this.y = new Float32Array(this.capacity);
61
+ this.z = new Float32Array(this.capacity);
62
+ this.vx = new Float32Array(this.capacity);
63
+ this.vy = new Float32Array(this.capacity);
64
+ this.vz = new Float32Array(this.capacity);
65
+ this.ax = new Float32Array(this.capacity);
66
+ this.ay = new Float32Array(this.capacity);
67
+ this.az = new Float32Array(this.capacity);
68
+ this.life = new Float32Array(this.capacity);
69
+ this.maxLife = new Float32Array(this.capacity);
70
+ this.size = new Float32Array(this.capacity);
71
+ this.endSize = new Float32Array(this.capacity);
72
+ this.r0 = new Float32Array(this.capacity);
73
+ this.g0 = new Float32Array(this.capacity);
74
+ this.b0 = new Float32Array(this.capacity);
75
+ this.a0 = new Float32Array(this.capacity);
76
+ this.r1 = new Float32Array(this.capacity);
77
+ this.g1 = new Float32Array(this.capacity);
78
+ this.b1 = new Float32Array(this.capacity);
79
+ this.a1 = new Float32Array(this.capacity);
80
+ this.flags = new Uint8Array(this.capacity);
81
+ }
82
+ setMaxParticles(n) {
83
+ if (n < 0)
84
+ n = 0;
85
+ this.maxParticles = n;
86
+ }
87
+ getMaxParticles() {
88
+ return this.maxParticles;
89
+ }
90
+ getLiveCount() {
91
+ return this.liveCount;
92
+ }
93
+ getHighWaterMark() {
94
+ return this.highWaterMark;
95
+ }
96
+ getCapacity() {
97
+ return this.capacity;
98
+ }
99
+ ensureCapacity(neededIndex) {
100
+ if (neededIndex < this.capacity)
101
+ return;
102
+ const next = nextPow2(neededIndex + 1);
103
+ this.x = growF32(this.x, next);
104
+ this.y = growF32(this.y, next);
105
+ this.z = growF32(this.z, next);
106
+ this.vx = growF32(this.vx, next);
107
+ this.vy = growF32(this.vy, next);
108
+ this.vz = growF32(this.vz, next);
109
+ this.ax = growF32(this.ax, next);
110
+ this.ay = growF32(this.ay, next);
111
+ this.az = growF32(this.az, next);
112
+ this.life = growF32(this.life, next);
113
+ this.maxLife = growF32(this.maxLife, next);
114
+ this.size = growF32(this.size, next);
115
+ this.endSize = growF32(this.endSize, next);
116
+ this.r0 = growF32(this.r0, next);
117
+ this.g0 = growF32(this.g0, next);
118
+ this.b0 = growF32(this.b0, next);
119
+ this.a0 = growF32(this.a0, next);
120
+ this.r1 = growF32(this.r1, next);
121
+ this.g1 = growF32(this.g1, next);
122
+ this.b1 = growF32(this.b1, next);
123
+ this.a1 = growF32(this.a1, next);
124
+ this.flags = growU8(this.flags, next);
125
+ this.capacity = next;
126
+ }
127
+ // Spawn a particle. Returns the slot index, or -1 if the budget
128
+ // (maxParticles) is exhausted. Callers that emit per-frame should
129
+ // check the return value to know if their burst was clipped.
130
+ spawn(p) {
131
+ if (this.liveCount >= this.maxParticles)
132
+ return -1;
133
+ let i;
134
+ const recycled = this.freeList.pop();
135
+ if (recycled !== undefined) {
136
+ i = recycled;
137
+ }
138
+ else {
139
+ i = this.highWaterMark;
140
+ this.highWaterMark++;
141
+ this.ensureCapacity(i);
142
+ }
143
+ this.x[i] = p.x;
144
+ this.y[i] = p.y;
145
+ this.z[i] = p.z;
146
+ this.vx[i] = p.vx ?? 0;
147
+ this.vy[i] = p.vy ?? 0;
148
+ this.vz[i] = p.vz ?? 0;
149
+ this.ax[i] = p.ax ?? 0;
150
+ this.ay[i] = p.ay ?? 0;
151
+ this.az[i] = p.az ?? 0;
152
+ this.life[i] = p.life;
153
+ this.maxLife[i] = p.life;
154
+ this.size[i] = p.size ?? 4;
155
+ this.endSize[i] = p.endSize ?? p.size ?? 4;
156
+ this.r0[i] = p.color.r;
157
+ this.g0[i] = p.color.g;
158
+ this.b0[i] = p.color.b;
159
+ this.a0[i] = p.color.a;
160
+ if (p.endColor) {
161
+ this.r1[i] = p.endColor.r;
162
+ this.g1[i] = p.endColor.g;
163
+ this.b1[i] = p.endColor.b;
164
+ this.a1[i] = p.endColor.a;
165
+ }
166
+ else {
167
+ // Default fade to fully transparent, same hue.
168
+ this.r1[i] = p.color.r;
169
+ this.g1[i] = p.color.g;
170
+ this.b1[i] = p.color.b;
171
+ this.a1[i] = 0;
172
+ }
173
+ let f = PARTICLE_FLAG_ALIVE;
174
+ if (p.additive)
175
+ f |= PARTICLE_FLAG_ADDITIVE;
176
+ this.flags[i] = f;
177
+ this.liveCount++;
178
+ return i;
179
+ }
180
+ // Mark a particle dead and reclaim its slot for reuse.
181
+ kill(i) {
182
+ if (i < 0 || i >= this.highWaterMark)
183
+ return;
184
+ if ((this.flags[i] ?? 0) === 0)
185
+ return;
186
+ this.flags[i] = 0;
187
+ this.liveCount--;
188
+ this.freeList.push(i);
189
+ }
190
+ isAlive(i) {
191
+ if (i < 0 || i >= this.highWaterMark)
192
+ return false;
193
+ return ((this.flags[i] ?? 0) & PARTICLE_FLAG_ALIVE) !== 0;
194
+ }
195
+ // Reset everything. Used between scenes / encounters when the
196
+ // engine wants a clean slate.
197
+ clear() {
198
+ this.flags.fill(0);
199
+ this.freeList.length = 0;
200
+ this.liveCount = 0;
201
+ this.highWaterMark = 0;
202
+ }
203
+ }
204
+ //# sourceMappingURL=particle-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"particle-pool.js","sourceRoot":"","sources":["../../src/vfx/particle-pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { ColorRGBA } from '../util/color.js';
2
+ export declare const PROJECTILE_FLAG_ALIVE: number;
3
+ export declare const PROJECTILE_FLAG_HOMING: number;
4
+ export declare const PROJECTILE_FLAG_PIERCE: number;
5
+ export interface ProjectileSpawn {
6
+ x: number;
7
+ y: number;
8
+ z: number;
9
+ vx: number;
10
+ vy: number;
11
+ vz: number;
12
+ life: number;
13
+ damage: number;
14
+ ownerIndex: number;
15
+ targetIndex?: number;
16
+ size: number;
17
+ color: Readonly<ColorRGBA>;
18
+ homing?: boolean;
19
+ pierce?: boolean;
20
+ }
21
+ export declare class ProjectilePool {
22
+ x: Float32Array;
23
+ y: Float32Array;
24
+ z: Float32Array;
25
+ vx: Float32Array;
26
+ vy: Float32Array;
27
+ vz: Float32Array;
28
+ life: Float32Array;
29
+ damage: Float32Array;
30
+ ownerIndex: Int32Array;
31
+ targetIndex: Int32Array;
32
+ size: Float32Array;
33
+ r: Float32Array;
34
+ g: Float32Array;
35
+ b: Float32Array;
36
+ a: Float32Array;
37
+ flags: Uint8Array;
38
+ private capacity;
39
+ private liveCount;
40
+ private freeList;
41
+ private highWaterMark;
42
+ private maxProjectiles;
43
+ constructor(initialCapacity?: number, maxProjectiles?: number);
44
+ setMaxProjectiles(n: number): void;
45
+ getMaxProjectiles(): number;
46
+ getLiveCount(): number;
47
+ getHighWaterMark(): number;
48
+ getCapacity(): number;
49
+ private ensureCapacity;
50
+ spawn(p: ProjectileSpawn): number;
51
+ kill(i: number): void;
52
+ isAlive(i: number): boolean;
53
+ clear(): void;
54
+ }
55
+ export declare const POOL_PROJECTILE = "projectile";
56
+ //# sourceMappingURL=projectile-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectile-pool.d.ts","sourceRoot":"","sources":["../../src/vfx/projectile-pool.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAG5C,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAG7C,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAE7C,MAAM,WAAW,eAAe;IAE9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IAGV,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IAGf,UAAU,EAAE,MAAM,CAAC;IAEnB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,cAAc;IAEzB,CAAC,EAAE,YAAY,CAAC;IAChB,CAAC,EAAE,YAAY,CAAC;IAChB,CAAC,EAAE,YAAY,CAAC;IAChB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,UAAU,CAAC;IACxB,IAAI,EAAE,YAAY,CAAC;IAEnB,CAAC,EAAE,YAAY,CAAC;IAChB,CAAC,EAAE,YAAY,CAAC;IAChB,CAAC,EAAE,YAAY,CAAC;IAChB,CAAC,EAAE,YAAY,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAElB,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,cAAc,CAAS;gBAEnB,eAAe,GAAE,MAAW,EAAE,cAAc,GAAE,MAAY;IAqBtE,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAIlC,iBAAiB,IAAI,MAAM;IAC3B,YAAY,IAAI,MAAM;IACtB,gBAAgB,IAAI,MAAM;IAC1B,WAAW,IAAI,MAAM;IAErB,OAAO,CAAC,cAAc;IA0BtB,KAAK,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM;IA8BjC,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAQrB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAK3B,KAAK,IAAI,IAAI;CAMd;AAED,eAAO,MAAM,eAAe,eAAe,CAAC"}
@@ -0,0 +1,157 @@
1
+ // ProjectilePool - in-flight projectiles (arrows, bolts, spells).
2
+ //
3
+ // Lives in vfx/ alongside ParticlePool because projectiles are
4
+ // short-lived rendered objects with simulation. Unlike particles,
5
+ // projectiles damage things on contact, so this pool tracks owner
6
+ // + damage payload + an optional homing target.
7
+ //
8
+ // Projectiles are NOT ECS entities. Same reasoning as ParticlePool
9
+ // (Phase 4): ephemeral, fast-spawning, would burn entity-id space.
10
+ // Free-list slot recycling. Hard cap configurable per scene.
11
+ import { growF32, growU8, nextPow2 } from '../util/typed-arrays.js';
12
+ export const PROJECTILE_FLAG_ALIVE = 1 << 0;
13
+ // Homing: each tick, projectile re-aims at target's position.
14
+ // Without this flag, projectile flies a straight line.
15
+ export const PROJECTILE_FLAG_HOMING = 1 << 1;
16
+ // Pierce: projectile keeps going after a hit instead of being
17
+ // destroyed. Used for spell beams, piercing arrows.
18
+ export const PROJECTILE_FLAG_PIERCE = 1 << 2;
19
+ export class ProjectilePool {
20
+ // Hot
21
+ x;
22
+ y;
23
+ z;
24
+ vx;
25
+ vy;
26
+ vz;
27
+ life;
28
+ damage;
29
+ ownerIndex;
30
+ targetIndex; // -1 if not homing
31
+ size;
32
+ // Color rgba split.
33
+ r;
34
+ g;
35
+ b;
36
+ a;
37
+ flags;
38
+ capacity = 0;
39
+ liveCount = 0;
40
+ freeList = [];
41
+ highWaterMark = 0;
42
+ maxProjectiles;
43
+ constructor(initialCapacity = 64, maxProjectiles = 512) {
44
+ this.capacity = nextPow2(initialCapacity);
45
+ this.maxProjectiles = maxProjectiles;
46
+ this.x = new Float32Array(this.capacity);
47
+ this.y = new Float32Array(this.capacity);
48
+ this.z = new Float32Array(this.capacity);
49
+ this.vx = new Float32Array(this.capacity);
50
+ this.vy = new Float32Array(this.capacity);
51
+ this.vz = new Float32Array(this.capacity);
52
+ this.life = new Float32Array(this.capacity);
53
+ this.damage = new Float32Array(this.capacity);
54
+ this.ownerIndex = new Int32Array(this.capacity).fill(-1);
55
+ this.targetIndex = new Int32Array(this.capacity).fill(-1);
56
+ this.size = new Float32Array(this.capacity);
57
+ this.r = new Float32Array(this.capacity);
58
+ this.g = new Float32Array(this.capacity);
59
+ this.b = new Float32Array(this.capacity);
60
+ this.a = new Float32Array(this.capacity);
61
+ this.flags = new Uint8Array(this.capacity);
62
+ }
63
+ setMaxProjectiles(n) {
64
+ if (n < 0)
65
+ n = 0;
66
+ this.maxProjectiles = n;
67
+ }
68
+ getMaxProjectiles() { return this.maxProjectiles; }
69
+ getLiveCount() { return this.liveCount; }
70
+ getHighWaterMark() { return this.highWaterMark; }
71
+ getCapacity() { return this.capacity; }
72
+ ensureCapacity(neededIndex) {
73
+ if (neededIndex < this.capacity)
74
+ return;
75
+ const next = nextPow2(neededIndex + 1);
76
+ this.x = growF32(this.x, next);
77
+ this.y = growF32(this.y, next);
78
+ this.z = growF32(this.z, next);
79
+ this.vx = growF32(this.vx, next);
80
+ this.vy = growF32(this.vy, next);
81
+ this.vz = growF32(this.vz, next);
82
+ this.life = growF32(this.life, next);
83
+ this.damage = growF32(this.damage, next);
84
+ const newOwner = new Int32Array(next).fill(-1);
85
+ newOwner.set(this.ownerIndex);
86
+ this.ownerIndex = newOwner;
87
+ const newTarget = new Int32Array(next).fill(-1);
88
+ newTarget.set(this.targetIndex);
89
+ this.targetIndex = newTarget;
90
+ this.size = growF32(this.size, next);
91
+ this.r = growF32(this.r, next);
92
+ this.g = growF32(this.g, next);
93
+ this.b = growF32(this.b, next);
94
+ this.a = growF32(this.a, next);
95
+ this.flags = growU8(this.flags, next);
96
+ this.capacity = next;
97
+ }
98
+ spawn(p) {
99
+ if (this.liveCount >= this.maxProjectiles)
100
+ return -1;
101
+ let i;
102
+ const recycled = this.freeList.pop();
103
+ if (recycled !== undefined) {
104
+ i = recycled;
105
+ }
106
+ else {
107
+ i = this.highWaterMark;
108
+ this.highWaterMark++;
109
+ this.ensureCapacity(i);
110
+ }
111
+ this.x[i] = p.x;
112
+ this.y[i] = p.y;
113
+ this.z[i] = p.z;
114
+ this.vx[i] = p.vx;
115
+ this.vy[i] = p.vy;
116
+ this.vz[i] = p.vz;
117
+ this.life[i] = p.life;
118
+ this.damage[i] = p.damage;
119
+ this.ownerIndex[i] = p.ownerIndex;
120
+ this.targetIndex[i] = p.targetIndex ?? -1;
121
+ this.size[i] = p.size;
122
+ this.r[i] = p.color.r;
123
+ this.g[i] = p.color.g;
124
+ this.b[i] = p.color.b;
125
+ this.a[i] = p.color.a;
126
+ let f = PROJECTILE_FLAG_ALIVE;
127
+ if (p.homing)
128
+ f |= PROJECTILE_FLAG_HOMING;
129
+ if (p.pierce)
130
+ f |= PROJECTILE_FLAG_PIERCE;
131
+ this.flags[i] = f;
132
+ this.liveCount++;
133
+ return i;
134
+ }
135
+ kill(i) {
136
+ if (i < 0 || i >= this.highWaterMark)
137
+ return;
138
+ if ((this.flags[i] ?? 0) === 0)
139
+ return;
140
+ this.flags[i] = 0;
141
+ this.liveCount--;
142
+ this.freeList.push(i);
143
+ }
144
+ isAlive(i) {
145
+ if (i < 0 || i >= this.highWaterMark)
146
+ return false;
147
+ return ((this.flags[i] ?? 0) & PROJECTILE_FLAG_ALIVE) !== 0;
148
+ }
149
+ clear() {
150
+ this.flags.fill(0);
151
+ this.freeList.length = 0;
152
+ this.liveCount = 0;
153
+ this.highWaterMark = 0;
154
+ }
155
+ }
156
+ export const POOL_PROJECTILE = 'projectile';
157
+ //# sourceMappingURL=projectile-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectile-pool.js","sourceRoot":"","sources":["../../src/vfx/projectile-pool.ts"],"names":[],"mappings":"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"}