@zylem/behaviors 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 (175) hide show
  1. package/README.md +26 -0
  2. package/dist/behavior-system-DYbx-x_-.d.ts +307 -0
  3. package/dist/chunk-2C3Z5GE7.js +176 -0
  4. package/dist/chunk-2C3Z5GE7.js.map +1 -0
  5. package/dist/chunk-2CLT36VB.js +241 -0
  6. package/dist/chunk-2CLT36VB.js.map +1 -0
  7. package/dist/chunk-3PYGRHAL.js +35 -0
  8. package/dist/chunk-3PYGRHAL.js.map +1 -0
  9. package/dist/chunk-4I6E6DGV.js +212 -0
  10. package/dist/chunk-4I6E6DGV.js.map +1 -0
  11. package/dist/chunk-4URF65BR.js +44 -0
  12. package/dist/chunk-4URF65BR.js.map +1 -0
  13. package/dist/chunk-6C6NXNEW.js +38 -0
  14. package/dist/chunk-6C6NXNEW.js.map +1 -0
  15. package/dist/chunk-ARJWUNRE.js +431 -0
  16. package/dist/chunk-ARJWUNRE.js.map +1 -0
  17. package/dist/chunk-BXP4K7RF.js +1205 -0
  18. package/dist/chunk-BXP4K7RF.js.map +1 -0
  19. package/dist/chunk-DYLH6K7B.js +44 -0
  20. package/dist/chunk-DYLH6K7B.js.map +1 -0
  21. package/dist/chunk-EIWQM6U3.js +27 -0
  22. package/dist/chunk-EIWQM6U3.js.map +1 -0
  23. package/dist/chunk-EZNCCO4L.js +14 -0
  24. package/dist/chunk-EZNCCO4L.js.map +1 -0
  25. package/dist/chunk-F3KRX2V4.js +457 -0
  26. package/dist/chunk-F3KRX2V4.js.map +1 -0
  27. package/dist/chunk-FPTWVCPN.js +53 -0
  28. package/dist/chunk-FPTWVCPN.js.map +1 -0
  29. package/dist/chunk-GCNRXAKH.js +37 -0
  30. package/dist/chunk-GCNRXAKH.js.map +1 -0
  31. package/dist/chunk-GYURWCIQ.js +1985 -0
  32. package/dist/chunk-GYURWCIQ.js.map +1 -0
  33. package/dist/chunk-HZMY3TT4.js +244 -0
  34. package/dist/chunk-HZMY3TT4.js.map +1 -0
  35. package/dist/chunk-ID5QJYF5.js +50 -0
  36. package/dist/chunk-ID5QJYF5.js.map +1 -0
  37. package/dist/chunk-JAN34G6S.js +552 -0
  38. package/dist/chunk-JAN34G6S.js.map +1 -0
  39. package/dist/chunk-K3UNLQ7W.js +118 -0
  40. package/dist/chunk-K3UNLQ7W.js.map +1 -0
  41. package/dist/chunk-KDY5N6J4.js +82 -0
  42. package/dist/chunk-KDY5N6J4.js.map +1 -0
  43. package/dist/chunk-KOZUNIIE.js +413 -0
  44. package/dist/chunk-KOZUNIIE.js.map +1 -0
  45. package/dist/chunk-KS72RZHX.js +30 -0
  46. package/dist/chunk-KS72RZHX.js.map +1 -0
  47. package/dist/chunk-LD5SMIB3.js +32 -0
  48. package/dist/chunk-LD5SMIB3.js.map +1 -0
  49. package/dist/chunk-OHCPV2NT.js +86 -0
  50. package/dist/chunk-OHCPV2NT.js.map +1 -0
  51. package/dist/chunk-OYWFPIHF.js +115 -0
  52. package/dist/chunk-OYWFPIHF.js.map +1 -0
  53. package/dist/chunk-POZER3MQ.js +407 -0
  54. package/dist/chunk-POZER3MQ.js.map +1 -0
  55. package/dist/chunk-RTRVBEIB.js +56 -0
  56. package/dist/chunk-RTRVBEIB.js.map +1 -0
  57. package/dist/chunk-RTVRUNYR.js +29 -0
  58. package/dist/chunk-RTVRUNYR.js.map +1 -0
  59. package/dist/chunk-SS7ELMJ7.js +406 -0
  60. package/dist/chunk-SS7ELMJ7.js.map +1 -0
  61. package/dist/chunk-STCCNLPC.js +160 -0
  62. package/dist/chunk-STCCNLPC.js.map +1 -0
  63. package/dist/chunk-SVLNF434.js +261 -0
  64. package/dist/chunk-SVLNF434.js.map +1 -0
  65. package/dist/chunk-UYFOLI2X.js +24 -0
  66. package/dist/chunk-UYFOLI2X.js.map +1 -0
  67. package/dist/chunk-VAN4WW3F.js +67 -0
  68. package/dist/chunk-VAN4WW3F.js.map +1 -0
  69. package/dist/chunk-WOMHL23C.js +369 -0
  70. package/dist/chunk-WOMHL23C.js.map +1 -0
  71. package/dist/chunk-WWVD5DR5.js +120 -0
  72. package/dist/chunk-WWVD5DR5.js.map +1 -0
  73. package/dist/chunk-XG2YMCJW.js +201 -0
  74. package/dist/chunk-XG2YMCJW.js.map +1 -0
  75. package/dist/chunk-XIJNE67Y.js +210 -0
  76. package/dist/chunk-XIJNE67Y.js.map +1 -0
  77. package/dist/chunk-Y6UJOUE5.js +44 -0
  78. package/dist/chunk-Y6UJOUE5.js.map +1 -0
  79. package/dist/chunk-YUO6SKJD.js +348 -0
  80. package/dist/chunk-YUO6SKJD.js.map +1 -0
  81. package/dist/components--hjBMTnz.d.ts +120 -0
  82. package/dist/components-B29WHGQN.d.ts +39 -0
  83. package/dist/components-BWG1GkZA.d.ts +20 -0
  84. package/dist/components-XCpL6IYt.d.ts +18 -0
  85. package/dist/components-qWwOsvwh.d.ts +43 -0
  86. package/dist/cooldown.d.ts +116 -0
  87. package/dist/cooldown.js +20 -0
  88. package/dist/cooldown.js.map +1 -0
  89. package/dist/coordinators/boundary-ricochet-3d.d.ts +19 -0
  90. package/dist/coordinators/boundary-ricochet-3d.js +8 -0
  91. package/dist/coordinators/boundary-ricochet-3d.js.map +1 -0
  92. package/dist/coordinators/boundary-ricochet.d.ts +34 -0
  93. package/dist/coordinators/boundary-ricochet.js +8 -0
  94. package/dist/coordinators/boundary-ricochet.js.map +1 -0
  95. package/dist/coordinators/first-person-shooter.d.ts +35 -0
  96. package/dist/coordinators/first-person-shooter.js +9 -0
  97. package/dist/coordinators/first-person-shooter.js.map +1 -0
  98. package/dist/coordinators/multidirectional-space-shooter.d.ts +27 -0
  99. package/dist/coordinators/multidirectional-space-shooter.js +10 -0
  100. package/dist/coordinators/multidirectional-space-shooter.js.map +1 -0
  101. package/dist/coordinators/top-down-shooter.d.ts +27 -0
  102. package/dist/coordinators/top-down-shooter.js +10 -0
  103. package/dist/coordinators/top-down-shooter.js.map +1 -0
  104. package/dist/core.d.ts +25 -0
  105. package/dist/core.js +327 -0
  106. package/dist/core.js.map +1 -0
  107. package/dist/destructible-3d.d.ts +42 -0
  108. package/dist/destructible-3d.js +13 -0
  109. package/dist/destructible-3d.js.map +1 -0
  110. package/dist/destructible-prebake.d.ts +28 -0
  111. package/dist/destructible-prebake.js +23 -0
  112. package/dist/destructible-prebake.js.map +1 -0
  113. package/dist/entity-types-CmtQ-IBp.d.ts +15 -0
  114. package/dist/first-person-perspective-C9Mptl0-.d.ts +23 -0
  115. package/dist/first-person.d.ts +204 -0
  116. package/dist/first-person.js +27 -0
  117. package/dist/first-person.js.map +1 -0
  118. package/dist/index.d.ts +40 -0
  119. package/dist/index.js +263 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/jumper-2d.d.ts +113 -0
  122. package/dist/jumper-2d.js +27 -0
  123. package/dist/jumper-2d.js.map +1 -0
  124. package/dist/jumper-3d.d.ts +164 -0
  125. package/dist/jumper-3d.js +29 -0
  126. package/dist/jumper-3d.js.map +1 -0
  127. package/dist/moveable-BCRpjAQb.d.ts +176 -0
  128. package/dist/particle-emitter/presets.d.ts +46 -0
  129. package/dist/particle-emitter/presets.js +15 -0
  130. package/dist/particle-emitter/presets.js.map +1 -0
  131. package/dist/particle-emitter.d.ts +78 -0
  132. package/dist/particle-emitter.js +15 -0
  133. package/dist/particle-emitter.js.map +1 -0
  134. package/dist/payload-BQzu-oY_.d.ts +89 -0
  135. package/dist/platformer-3d.d.ts +347 -0
  136. package/dist/platformer-3d.js +23 -0
  137. package/dist/platformer-3d.js.map +1 -0
  138. package/dist/ricochet-2d.d.ts +274 -0
  139. package/dist/ricochet-2d.js +16 -0
  140. package/dist/ricochet-2d.js.map +1 -0
  141. package/dist/ricochet-3d.d.ts +116 -0
  142. package/dist/ricochet-3d.js +16 -0
  143. package/dist/ricochet-3d.js.map +1 -0
  144. package/dist/runtime-2d.d.ts +2 -0
  145. package/dist/runtime-2d.js +32 -0
  146. package/dist/runtime-2d.js.map +1 -0
  147. package/dist/runtime-pong.d.ts +92 -0
  148. package/dist/runtime-pong.js +38 -0
  149. package/dist/runtime-pong.js.map +1 -0
  150. package/dist/screen-visibility.d.ts +74 -0
  151. package/dist/screen-visibility.js +10 -0
  152. package/dist/screen-visibility.js.map +1 -0
  153. package/dist/screen-wrap.d.ts +86 -0
  154. package/dist/screen-wrap.js +16 -0
  155. package/dist/screen-wrap.js.map +1 -0
  156. package/dist/shooter-2d.d.ts +77 -0
  157. package/dist/shooter-2d.js +12 -0
  158. package/dist/shooter-2d.js.map +1 -0
  159. package/dist/spark-DDlIg1nM.d.ts +148 -0
  160. package/dist/sync-state-machine-CZyspBpj.d.ts +16 -0
  161. package/dist/thruster.d.ts +132 -0
  162. package/dist/thruster.js +26 -0
  163. package/dist/thruster.js.map +1 -0
  164. package/dist/top-down-movement.d.ts +40 -0
  165. package/dist/top-down-movement.js +20 -0
  166. package/dist/top-down-movement.js.map +1 -0
  167. package/dist/use-behavior-D_82jAL3.d.ts +13 -0
  168. package/dist/vector-Bm65-FOG.d.ts +45 -0
  169. package/dist/world-boundary-2d.d.ts +141 -0
  170. package/dist/world-boundary-2d.js +21 -0
  171. package/dist/world-boundary-2d.js.map +1 -0
  172. package/dist/world-boundary-3d.d.ts +75 -0
  173. package/dist/world-boundary-3d.js +21 -0
  174. package/dist/world-boundary-3d.js.map +1 -0
  175. package/package.json +161 -0
@@ -0,0 +1,407 @@
1
+ import {
2
+ createParticleMaterial,
3
+ createRangeValue,
4
+ createTextureSystemOptions,
5
+ electricityPresets,
6
+ firePresets,
7
+ gasPresets,
8
+ magicPresets,
9
+ particleEffect,
10
+ toColorVector,
11
+ waterPresets
12
+ } from "./chunk-GYURWCIQ.js";
13
+ import {
14
+ VEC3_ZERO,
15
+ normalizeVec3,
16
+ toThreeVector3
17
+ } from "./chunk-WWVD5DR5.js";
18
+ import {
19
+ defineBehavior
20
+ } from "./chunk-EZNCCO4L.js";
21
+
22
+ // src/lib/behaviors/particle-emitter/particle-emitter.descriptor.ts
23
+ import { Group, Quaternion, Vector3 } from "three";
24
+ import {
25
+ BatchedRenderer
26
+ } from "three.quarks";
27
+ function getRefGlobals(ref) {
28
+ return ref.__getGlobals ?? null;
29
+ }
30
+ var PARTICLE_EMITTER_BEHAVIOR_KEY = /* @__PURE__ */ Symbol.for(
31
+ "zylem:behavior:particle-emitter"
32
+ );
33
+ var DEFAULT_PARTICLE_EFFECT = {
34
+ create() {
35
+ throw new Error(
36
+ "ParticleEmitterBehavior requires an effect definition created with particleEffect(...)."
37
+ );
38
+ }
39
+ };
40
+ var defaultOptions = {
41
+ effect: DEFAULT_PARTICLE_EFFECT,
42
+ autoplay: true,
43
+ localOffset: void 0,
44
+ followPosition: true,
45
+ followRotation: true,
46
+ autoDestroy: false
47
+ };
48
+ var ParticleRendererService = class {
49
+ constructor(sceneRoot) {
50
+ this.sceneRoot = sceneRoot;
51
+ this.renderer.name = "zylem-particle-batch-renderer";
52
+ this.sceneRoot.add(this.renderer);
53
+ }
54
+ sceneRoot;
55
+ renderer = new BatchedRenderer();
56
+ systems = /* @__PURE__ */ new Set();
57
+ register(system) {
58
+ if (this.systems.has(system)) {
59
+ return;
60
+ }
61
+ this.renderer.addSystem(system);
62
+ this.systems.add(system);
63
+ }
64
+ forget(system) {
65
+ this.systems.delete(system);
66
+ }
67
+ update(delta) {
68
+ this.renderer.update(delta);
69
+ }
70
+ destroy() {
71
+ this.systems.clear();
72
+ this.renderer.removeFromParent();
73
+ }
74
+ };
75
+ function getParticleControlState(ref) {
76
+ const runtimeState = ref.__particleEmitterControlState;
77
+ if (runtimeState) {
78
+ return runtimeState;
79
+ }
80
+ const nextState = {
81
+ desiredState: ref.options.autoplay ? "playing" : "stopped",
82
+ pendingRestart: false,
83
+ runtime: null
84
+ };
85
+ ref.__particleEmitterControlState = nextState;
86
+ return nextState;
87
+ }
88
+ function shouldCreateRuntime(state) {
89
+ return state.runtime == null && (state.desiredState !== "stopped" || state.pendingRestart);
90
+ }
91
+ function getLocalOffset(options) {
92
+ return toThreeVector3(options.localOffset, VEC3_ZERO);
93
+ }
94
+ function readHostTransform(entity) {
95
+ const wasmPose = entity.getPose?.();
96
+ if (wasmPose && entity.runtimeHandle >= 0) {
97
+ return {
98
+ position: new Vector3(wasmPose.position.x, wasmPose.position.y, wasmPose.position.z),
99
+ quaternion: new Quaternion(
100
+ wasmPose.rotation.x,
101
+ wasmPose.rotation.y,
102
+ wasmPose.rotation.z,
103
+ wasmPose.rotation.w
104
+ )
105
+ };
106
+ }
107
+ if (entity.body?.translation) {
108
+ const position2 = entity.body.translation();
109
+ const rotation = entity.body.rotation?.() ?? { x: 0, y: 0, z: 0, w: 1 };
110
+ return {
111
+ position: new Vector3(position2.x, position2.y, position2.z),
112
+ quaternion: new Quaternion(rotation.x, rotation.y, rotation.z, rotation.w)
113
+ };
114
+ }
115
+ const visualRoot = entity.group ?? entity.mesh;
116
+ if (visualRoot) {
117
+ const position2 = new Vector3();
118
+ const quaternion = new Quaternion();
119
+ visualRoot.getWorldPosition(position2);
120
+ visualRoot.getWorldQuaternion(quaternion);
121
+ return { position: position2, quaternion };
122
+ }
123
+ const position = normalizeVec3(entity.options?.position, VEC3_ZERO);
124
+ return {
125
+ position: new Vector3(position.x, position.y, position.z),
126
+ quaternion: new Quaternion()
127
+ };
128
+ }
129
+ function syncRuntimeTransform(entity, ref, runtime) {
130
+ const current = readHostTransform(entity);
131
+ const options = ref.options;
132
+ const basePosition = options.followPosition ? current.position : runtime.initialPosition;
133
+ const baseQuaternion = options.followRotation ? current.quaternion : runtime.initialQuaternion;
134
+ const offset = getLocalOffset(options);
135
+ if (options.followRotation) {
136
+ offset.applyQuaternion(baseQuaternion);
137
+ }
138
+ runtime.anchor.position.copy(basePosition).add(offset);
139
+ runtime.anchor.quaternion.copy(baseQuaternion);
140
+ }
141
+ function applyRuntimeState(ref) {
142
+ const state = getParticleControlState(ref);
143
+ const runtime = state.runtime;
144
+ if (!runtime) {
145
+ return;
146
+ }
147
+ if (state.pendingRestart) {
148
+ runtime.system.restart();
149
+ state.pendingRestart = false;
150
+ }
151
+ if (state.desiredState === "paused") {
152
+ runtime.system.pause();
153
+ return;
154
+ }
155
+ if (state.desiredState === "stopped") {
156
+ runtime.system.stop();
157
+ return;
158
+ }
159
+ runtime.system.play();
160
+ }
161
+ function releaseRuntime(ref, reason) {
162
+ const state = getParticleControlState(ref);
163
+ const runtime = state.runtime;
164
+ if (!runtime) {
165
+ return;
166
+ }
167
+ state.runtime = null;
168
+ state.pendingRestart = false;
169
+ runtime.system.removeEventListener("destroy", runtime.onDestroy);
170
+ runtime.service.forget(runtime.system);
171
+ if (reason === "manual") {
172
+ runtime.system.dispose();
173
+ }
174
+ runtime.anchor.removeFromParent();
175
+ }
176
+ function handleSystemDestroyed(entity, ref) {
177
+ releaseRuntime(ref, "system-destroyed");
178
+ const state = getParticleControlState(ref);
179
+ state.desiredState = "stopped";
180
+ if (ref.options.autoDestroy && entity.__zylemParticleSystemEntity && !entity.markedForRemoval) {
181
+ entity.nodeDestroy?.({ me: entity, globals: getRefGlobals(ref)?.() ?? {} });
182
+ }
183
+ }
184
+ function createRuntime(entity, ref, service) {
185
+ const system = ref.options.effect.create();
186
+ const anchor = new Group();
187
+ const initialTransform = readHostTransform(entity);
188
+ const runtime = {
189
+ system,
190
+ anchor,
191
+ service,
192
+ initialPosition: initialTransform.position.clone(),
193
+ initialQuaternion: initialTransform.quaternion.clone(),
194
+ onDestroy: () => handleSystemDestroyed(entity, ref)
195
+ };
196
+ anchor.name = `${entity.name || entity.uuid}:particle-anchor`;
197
+ system.autoDestroy = ref.options.autoDestroy;
198
+ anchor.add(system.emitter);
199
+ service.register(system);
200
+ service.renderer.parent?.add(anchor);
201
+ system.addEventListener("destroy", runtime.onDestroy);
202
+ syncRuntimeTransform(entity, ref, runtime);
203
+ return runtime;
204
+ }
205
+ function createParticleEmitterHandle(ref) {
206
+ return {
207
+ play: () => {
208
+ const state = getParticleControlState(ref);
209
+ state.desiredState = "playing";
210
+ applyRuntimeState(ref);
211
+ },
212
+ stop: () => {
213
+ const state = getParticleControlState(ref);
214
+ state.desiredState = "stopped";
215
+ state.pendingRestart = false;
216
+ applyRuntimeState(ref);
217
+ },
218
+ pause: () => {
219
+ const state = getParticleControlState(ref);
220
+ state.desiredState = "paused";
221
+ applyRuntimeState(ref);
222
+ },
223
+ restart: () => {
224
+ const state = getParticleControlState(ref);
225
+ state.desiredState = "playing";
226
+ state.pendingRestart = true;
227
+ applyRuntimeState(ref);
228
+ },
229
+ burst: () => {
230
+ const state = getParticleControlState(ref);
231
+ state.desiredState = "playing";
232
+ state.pendingRestart = true;
233
+ applyRuntimeState(ref);
234
+ },
235
+ isPlaying: () => {
236
+ const runtime = getParticleControlState(ref).runtime;
237
+ if (!runtime) {
238
+ return getParticleControlState(ref).desiredState === "playing";
239
+ }
240
+ return !runtime.system.paused;
241
+ },
242
+ getSystem: () => getParticleControlState(ref).runtime?.system ?? null
243
+ };
244
+ }
245
+ var ParticleEmitterBehaviorSystem = class {
246
+ constructor(scene, getBehaviorLinks, getGlobals) {
247
+ this.scene = scene;
248
+ this.getBehaviorLinks = getBehaviorLinks;
249
+ this.getGlobals = getGlobals;
250
+ }
251
+ scene;
252
+ getBehaviorLinks;
253
+ getGlobals;
254
+ rendererService = null;
255
+ getRendererService() {
256
+ if (!this.rendererService) {
257
+ this.rendererService = new ParticleRendererService(this.scene.scene);
258
+ }
259
+ return this.rendererService;
260
+ }
261
+ update(_ecs, delta) {
262
+ const links = this.getBehaviorLinks?.(PARTICLE_EMITTER_BEHAVIOR_KEY);
263
+ if (!links) {
264
+ return;
265
+ }
266
+ let hasRuntime = false;
267
+ let rendererService = this.rendererService;
268
+ for (const link of links) {
269
+ const entity = link.entity;
270
+ const ref = link.ref;
271
+ ref.__getGlobals = this.getGlobals;
272
+ const state = getParticleControlState(ref);
273
+ if (shouldCreateRuntime(state)) {
274
+ try {
275
+ rendererService ??= this.getRendererService();
276
+ state.runtime = createRuntime(entity, ref, rendererService);
277
+ } catch (error) {
278
+ state.desiredState = "stopped";
279
+ state.pendingRestart = false;
280
+ console.error("Failed to create particle runtime:", error);
281
+ continue;
282
+ }
283
+ }
284
+ if (!state.runtime) {
285
+ continue;
286
+ }
287
+ hasRuntime = true;
288
+ syncRuntimeTransform(entity, ref, state.runtime);
289
+ applyRuntimeState(ref);
290
+ }
291
+ if (hasRuntime && rendererService) {
292
+ rendererService.update(delta);
293
+ }
294
+ }
295
+ detach(link) {
296
+ releaseRuntime(
297
+ link.ref,
298
+ "manual"
299
+ );
300
+ }
301
+ destroy(_ecs) {
302
+ const links = this.getBehaviorLinks?.(PARTICLE_EMITTER_BEHAVIOR_KEY);
303
+ if (links) {
304
+ for (const link of links) {
305
+ releaseRuntime(
306
+ link.ref,
307
+ "manual"
308
+ );
309
+ }
310
+ }
311
+ this.rendererService?.destroy();
312
+ this.rendererService = null;
313
+ }
314
+ };
315
+ var ParticleEmitterBehavior = defineBehavior({
316
+ name: "particle-emitter",
317
+ defaultOptions,
318
+ systemFactory: (ctx) => new ParticleEmitterBehaviorSystem(ctx.scene, ctx.getBehaviorLinks, ctx.getGlobals),
319
+ createHandle: createParticleEmitterHandle
320
+ });
321
+
322
+ // src/lib/behaviors/particle-emitter/particle-effect.ts
323
+ import {
324
+ ConstantColor,
325
+ ConstantValue,
326
+ ParticleSystem as ParticleSystem2,
327
+ PointEmitter,
328
+ RenderMode
329
+ } from "three.quarks";
330
+ var particlePresets = {
331
+ burst(options = {}) {
332
+ return particleEffect(
333
+ () => new ParticleSystem2({
334
+ duration: options.duration ?? 0.25,
335
+ looping: false,
336
+ worldSpace: options.worldSpace ?? false,
337
+ startLife: createRangeValue(options.life ?? [0.3, 0.7], [0.3, 0.7]),
338
+ startSpeed: createRangeValue(options.speed ?? [1.5, 4], [1.5, 4]),
339
+ startSize: createRangeValue(options.size ?? [0.08, 0.18], [0.08, 0.18]),
340
+ startColor: new ConstantColor(
341
+ toColorVector(options.color ?? "#ffffff")
342
+ ),
343
+ emissionOverTime: new ConstantValue(0),
344
+ emissionBursts: [
345
+ {
346
+ time: 0,
347
+ count: new ConstantValue(options.count ?? 18),
348
+ cycle: 1,
349
+ interval: 0,
350
+ probability: 1
351
+ }
352
+ ],
353
+ shape: new PointEmitter(),
354
+ material: createParticleMaterial(
355
+ options.color ?? "#ffffff",
356
+ options
357
+ ),
358
+ ...createTextureSystemOptions(options),
359
+ renderMode: RenderMode.BillBoard
360
+ })
361
+ );
362
+ },
363
+ smoke(options = {}) {
364
+ return particleEffect(
365
+ () => new ParticleSystem2({
366
+ duration: options.duration ?? 1.1,
367
+ looping: false,
368
+ worldSpace: options.worldSpace ?? false,
369
+ startLife: createRangeValue(options.life ?? [0.8, 1.6], [0.8, 1.6]),
370
+ startSpeed: createRangeValue(options.speed ?? [0.2, 0.8], [0.2, 0.8]),
371
+ startSize: createRangeValue(options.size ?? [0.2, 0.5], [0.2, 0.5]),
372
+ startColor: new ConstantColor(
373
+ toColorVector(options.color ?? "#999999")
374
+ ),
375
+ emissionOverTime: new ConstantValue(0),
376
+ emissionBursts: [
377
+ {
378
+ time: 0,
379
+ count: new ConstantValue(options.count ?? 10),
380
+ cycle: 1,
381
+ interval: 0,
382
+ probability: 1
383
+ }
384
+ ],
385
+ shape: new PointEmitter(),
386
+ material: createParticleMaterial(
387
+ options.color ?? "#999999",
388
+ options,
389
+ 0.85
390
+ ),
391
+ ...createTextureSystemOptions(options),
392
+ renderMode: RenderMode.BillBoard
393
+ })
394
+ );
395
+ },
396
+ fire: firePresets,
397
+ water: waterPresets,
398
+ gas: gasPresets,
399
+ electricity: electricityPresets,
400
+ magic: magicPresets
401
+ };
402
+
403
+ export {
404
+ ParticleEmitterBehavior,
405
+ particlePresets
406
+ };
407
+ //# sourceMappingURL=chunk-POZER3MQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/behaviors/particle-emitter/particle-emitter.descriptor.ts","../src/lib/behaviors/particle-emitter/particle-effect.ts"],"sourcesContent":["import { Group, Object3D, Quaternion, Vector3 } from 'three';\nimport {\n\tBatchedRenderer,\n\tParticleSystem,\n\ttype ParticleSystemEvent,\n} from 'three.quarks';\n\nimport { defineBehavior, type BehaviorRef } from '../behavior-descriptor';\nimport type { BehaviorEntityLink, BehaviorSystem } from '../behavior-system';\nimport { VEC3_ZERO, type Vec3Input, normalizeVec3, toThreeVector3 } from '../../core/vector';\nfunction getRefGlobals(\n\tref: BehaviorRef<ParticleEmitterBehaviorOptions>,\n): (() => any) | null {\n\treturn ((ref as any).__getGlobals ?? null) as (() => any) | null;\n}\nimport type { ParticleEffectDefinition } from './particle-effect';\n\nexport interface ParticleEmitterBehaviorOptions {\n\teffect: ParticleEffectDefinition;\n\tautoplay: boolean;\n\tlocalOffset?: Vec3Input;\n\tfollowPosition: boolean;\n\tfollowRotation: boolean;\n\tautoDestroy: boolean;\n}\n\nexport interface ParticleEmitterHandle {\n\tplay(): void;\n\tstop(): void;\n\tpause(): void;\n\trestart(): void;\n\tburst(): void;\n\tisPlaying(): boolean;\n\tgetSystem(): ParticleSystem | null;\n}\n\ntype DesiredParticleState = 'playing' | 'paused' | 'stopped';\n\ninterface ParticleEmitterControlState {\n\tdesiredState: DesiredParticleState;\n\tpendingRestart: boolean;\n\truntime: ParticleEmitterRuntime | null;\n}\n\ninterface ParticleEmitterRuntime {\n\tsystem: ParticleSystem;\n\tanchor: Group;\n\tservice: ParticleRendererService;\n\tinitialPosition: Vector3;\n\tinitialQuaternion: Quaternion;\n\tonDestroy: (event: ParticleSystemEvent) => void;\n}\n\ninterface ParticleEmitterHostEntity {\n\tuuid: string;\n\tname?: string;\n\tbody?: {\n\t\ttranslation(): { x: number; y: number; z: number };\n\t\trotation?(): { x: number; y: number; z: number; w: number };\n\t} | null;\n\tgroup?: Object3D | null;\n\tmesh?: Object3D | null;\n\toptions?: {\n\t\tposition?: Vec3Input;\n\t};\n\tmarkedForRemoval?: boolean;\n\tnodeDestroy?(params: { me: unknown; globals: unknown }): void;\n\t__zylemParticleSystemEntity?: boolean;\n}\n\nconst PARTICLE_EMITTER_BEHAVIOR_KEY = Symbol.for(\n\t'zylem:behavior:particle-emitter',\n);\n\nconst DEFAULT_PARTICLE_EFFECT: ParticleEffectDefinition = {\n\tcreate() {\n\t\tthrow new Error(\n\t\t\t'ParticleEmitterBehavior requires an effect definition created with particleEffect(...).',\n\t\t);\n\t},\n};\n\nconst defaultOptions: ParticleEmitterBehaviorOptions = {\n\teffect: DEFAULT_PARTICLE_EFFECT,\n\tautoplay: true,\n\tlocalOffset: undefined,\n\tfollowPosition: true,\n\tfollowRotation: true,\n\tautoDestroy: false,\n};\n\nclass ParticleRendererService {\n\treadonly renderer = new BatchedRenderer();\n\tprivate readonly systems = new Set<ParticleSystem>();\n\n\tconstructor(private readonly sceneRoot: Object3D) {\n\t\tthis.renderer.name = 'zylem-particle-batch-renderer';\n\t\tthis.sceneRoot.add(this.renderer);\n\t}\n\n\tregister(system: ParticleSystem): void {\n\t\tif (this.systems.has(system)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.renderer.addSystem(system);\n\t\tthis.systems.add(system);\n\t}\n\n\tforget(system: ParticleSystem): void {\n\t\tthis.systems.delete(system);\n\t}\n\n\tupdate(delta: number): void {\n\t\tthis.renderer.update(delta);\n\t}\n\n\tdestroy(): void {\n\t\tthis.systems.clear();\n\t\tthis.renderer.removeFromParent();\n\t}\n}\n\nfunction getParticleControlState(\n\tref: BehaviorRef<ParticleEmitterBehaviorOptions>,\n): ParticleEmitterControlState {\n\tconst runtimeState = (ref as any).__particleEmitterControlState as\n\t\t| ParticleEmitterControlState\n\t\t| undefined;\n\tif (runtimeState) {\n\t\treturn runtimeState;\n\t}\n\n\tconst nextState: ParticleEmitterControlState = {\n\t\tdesiredState: ref.options.autoplay ? 'playing' : 'stopped',\n\t\tpendingRestart: false,\n\t\truntime: null,\n\t};\n\t(ref as any).__particleEmitterControlState = nextState;\n\treturn nextState;\n}\n\nfunction shouldCreateRuntime(\n\tstate: ParticleEmitterControlState,\n): boolean {\n\treturn state.runtime == null\n\t\t&& (state.desiredState !== 'stopped' || state.pendingRestart);\n}\n\nfunction getLocalOffset(options: ParticleEmitterBehaviorOptions): Vector3 {\n\treturn toThreeVector3(options.localOffset, VEC3_ZERO);\n}\n\nfunction readHostTransform(entity: ParticleEmitterHostEntity): {\n\tposition: Vector3;\n\tquaternion: Quaternion;\n} {\n\tconst wasmPose = (entity as any).getPose?.();\n\tif (wasmPose && (entity as any).runtimeHandle >= 0) {\n\t\treturn {\n\t\t\tposition: new Vector3(wasmPose.position.x, wasmPose.position.y, wasmPose.position.z),\n\t\t\tquaternion: new Quaternion(\n\t\t\t\twasmPose.rotation.x,\n\t\t\t\twasmPose.rotation.y,\n\t\t\t\twasmPose.rotation.z,\n\t\t\t\twasmPose.rotation.w,\n\t\t\t),\n\t\t};\n\t}\n\n\tif (entity.body?.translation) {\n\t\tconst position = entity.body.translation();\n\t\tconst rotation = entity.body.rotation?.() ?? { x: 0, y: 0, z: 0, w: 1 };\n\t\treturn {\n\t\t\tposition: new Vector3(position.x, position.y, position.z),\n\t\t\tquaternion: new Quaternion(rotation.x, rotation.y, rotation.z, rotation.w),\n\t\t};\n\t}\n\n\tconst visualRoot = entity.group ?? entity.mesh;\n\tif (visualRoot) {\n\t\tconst position = new Vector3();\n\t\tconst quaternion = new Quaternion();\n\t\tvisualRoot.getWorldPosition(position);\n\t\tvisualRoot.getWorldQuaternion(quaternion);\n\t\treturn { position, quaternion };\n\t}\n\n\tconst position = normalizeVec3(entity.options?.position, VEC3_ZERO);\n\treturn {\n\t\tposition: new Vector3(position.x, position.y, position.z),\n\t\tquaternion: new Quaternion(),\n\t};\n}\n\nfunction syncRuntimeTransform(\n\tentity: ParticleEmitterHostEntity,\n\tref: BehaviorRef<ParticleEmitterBehaviorOptions>,\n\truntime: ParticleEmitterRuntime,\n): void {\n\tconst current = readHostTransform(entity);\n\tconst options = ref.options;\n\tconst basePosition = options.followPosition\n\t\t? current.position\n\t\t: runtime.initialPosition;\n\tconst baseQuaternion = options.followRotation\n\t\t? current.quaternion\n\t\t: runtime.initialQuaternion;\n\tconst offset = getLocalOffset(options);\n\n\tif (options.followRotation) {\n\t\toffset.applyQuaternion(baseQuaternion);\n\t}\n\n\truntime.anchor.position.copy(basePosition).add(offset);\n\truntime.anchor.quaternion.copy(baseQuaternion);\n}\n\nfunction applyRuntimeState(\n\tref: BehaviorRef<ParticleEmitterBehaviorOptions>,\n): void {\n\tconst state = getParticleControlState(ref);\n\tconst runtime = state.runtime;\n\tif (!runtime) {\n\t\treturn;\n\t}\n\n\tif (state.pendingRestart) {\n\t\truntime.system.restart();\n\t\tstate.pendingRestart = false;\n\t}\n\n\tif (state.desiredState === 'paused') {\n\t\truntime.system.pause();\n\t\treturn;\n\t}\n\n\tif (state.desiredState === 'stopped') {\n\t\truntime.system.stop();\n\t\treturn;\n\t}\n\n\truntime.system.play();\n}\n\nfunction releaseRuntime(\n\tref: BehaviorRef<ParticleEmitterBehaviorOptions>,\n\treason: 'manual' | 'system-destroyed',\n): void {\n\tconst state = getParticleControlState(ref);\n\tconst runtime = state.runtime;\n\tif (!runtime) {\n\t\treturn;\n\t}\n\n\tstate.runtime = null;\n\tstate.pendingRestart = false;\n\n\truntime.system.removeEventListener('destroy', runtime.onDestroy);\n\truntime.service.forget(runtime.system);\n\n\tif (reason === 'manual') {\n\t\truntime.system.dispose();\n\t}\n\n\truntime.anchor.removeFromParent();\n}\n\nfunction handleSystemDestroyed(\n\tentity: ParticleEmitterHostEntity,\n\tref: BehaviorRef<ParticleEmitterBehaviorOptions>,\n): void {\n\treleaseRuntime(ref, 'system-destroyed');\n\tconst state = getParticleControlState(ref);\n\tstate.desiredState = 'stopped';\n\n\tif (\n\t\tref.options.autoDestroy\n\t\t&& entity.__zylemParticleSystemEntity\n\t\t&& !entity.markedForRemoval\n\t) {\n\t\tentity.nodeDestroy?.({ me: entity, globals: getRefGlobals(ref)?.() ?? {} });\n\t}\n}\n\nfunction createRuntime(\n\tentity: ParticleEmitterHostEntity,\n\tref: BehaviorRef<ParticleEmitterBehaviorOptions>,\n\tservice: ParticleRendererService,\n): ParticleEmitterRuntime {\n\tconst system = ref.options.effect.create();\n\tconst anchor = new Group();\n\tconst initialTransform = readHostTransform(entity);\n\tconst runtime: ParticleEmitterRuntime = {\n\t\tsystem,\n\t\tanchor,\n\t\tservice,\n\t\tinitialPosition: initialTransform.position.clone(),\n\t\tinitialQuaternion: initialTransform.quaternion.clone(),\n\t\tonDestroy: () => handleSystemDestroyed(entity, ref),\n\t};\n\n\tanchor.name = `${entity.name || entity.uuid}:particle-anchor`;\n\tsystem.autoDestroy = ref.options.autoDestroy;\n\tanchor.add(system.emitter);\n\tservice.register(system);\n\tservice.renderer.parent?.add(anchor);\n\tsystem.addEventListener('destroy', runtime.onDestroy);\n\n\tsyncRuntimeTransform(entity, ref, runtime);\n\treturn runtime;\n}\n\nfunction createParticleEmitterHandle(\n\tref: BehaviorRef<ParticleEmitterBehaviorOptions>,\n): ParticleEmitterHandle {\n\treturn {\n\t\tplay: () => {\n\t\t\tconst state = getParticleControlState(ref);\n\t\t\tstate.desiredState = 'playing';\n\t\t\tapplyRuntimeState(ref);\n\t\t},\n\t\tstop: () => {\n\t\t\tconst state = getParticleControlState(ref);\n\t\t\tstate.desiredState = 'stopped';\n\t\t\tstate.pendingRestart = false;\n\t\t\tapplyRuntimeState(ref);\n\t\t},\n\t\tpause: () => {\n\t\t\tconst state = getParticleControlState(ref);\n\t\t\tstate.desiredState = 'paused';\n\t\t\tapplyRuntimeState(ref);\n\t\t},\n\t\trestart: () => {\n\t\t\tconst state = getParticleControlState(ref);\n\t\t\tstate.desiredState = 'playing';\n\t\t\tstate.pendingRestart = true;\n\t\t\tapplyRuntimeState(ref);\n\t\t},\n\t\tburst: () => {\n\t\t\tconst state = getParticleControlState(ref);\n\t\t\tstate.desiredState = 'playing';\n\t\t\tstate.pendingRestart = true;\n\t\t\tapplyRuntimeState(ref);\n\t\t},\n\t\tisPlaying: () => {\n\t\t\tconst runtime = getParticleControlState(ref).runtime;\n\t\t\tif (!runtime) {\n\t\t\t\treturn getParticleControlState(ref).desiredState === 'playing';\n\t\t\t}\n\t\t\treturn !runtime.system.paused;\n\t\t},\n\t\tgetSystem: () => getParticleControlState(ref).runtime?.system ?? null,\n\t};\n}\n\nclass ParticleEmitterBehaviorSystem implements BehaviorSystem {\n\tprivate rendererService: ParticleRendererService | null = null;\n\n\tconstructor(\n\t\tprivate readonly scene: { scene: Object3D },\n\t\tprivate readonly getBehaviorLinks?: (key: symbol) => Iterable<BehaviorEntityLink>,\n\t\tprivate readonly getGlobals?: () => any,\n\t) {}\n\n\tprivate getRendererService(): ParticleRendererService {\n\t\tif (!this.rendererService) {\n\t\t\tthis.rendererService = new ParticleRendererService(this.scene.scene);\n\t\t}\n\t\treturn this.rendererService;\n\t}\n\n\tupdate(_ecs: unknown, delta: number): void {\n\t\tconst links = this.getBehaviorLinks?.(PARTICLE_EMITTER_BEHAVIOR_KEY);\n\t\tif (!links) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet hasRuntime = false;\n\t\tlet rendererService = this.rendererService;\n\n\t\tfor (const link of links) {\n\t\t\tconst entity = link.entity as ParticleEmitterHostEntity;\n\t\t\tconst ref = link.ref as BehaviorRef<ParticleEmitterBehaviorOptions>;\n\t\t\t(ref as any).__getGlobals = this.getGlobals;\n\t\t\tconst state = getParticleControlState(ref);\n\n\t\t\tif (shouldCreateRuntime(state)) {\n\t\t\t\ttry {\n\t\t\t\t\trendererService ??= this.getRendererService();\n\t\t\t\t\tstate.runtime = createRuntime(entity, ref, rendererService);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tstate.desiredState = 'stopped';\n\t\t\t\t\tstate.pendingRestart = false;\n\t\t\t\t\tconsole.error('Failed to create particle runtime:', error);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!state.runtime) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\thasRuntime = true;\n\t\t\tsyncRuntimeTransform(entity, ref, state.runtime);\n\t\t\tapplyRuntimeState(ref);\n\t\t}\n\n\t\tif (hasRuntime && rendererService) {\n\t\t\trendererService.update(delta);\n\t\t}\n\t}\n\n\tdetach(link: BehaviorEntityLink): void {\n\t\treleaseRuntime(\n\t\t\tlink.ref as BehaviorRef<ParticleEmitterBehaviorOptions>,\n\t\t\t'manual',\n\t\t);\n\t}\n\n\tdestroy(_ecs: unknown): void {\n\t\tconst links = this.getBehaviorLinks?.(PARTICLE_EMITTER_BEHAVIOR_KEY);\n\t\tif (links) {\n\t\t\tfor (const link of links) {\n\t\t\t\treleaseRuntime(\n\t\t\t\t\tlink.ref as BehaviorRef<ParticleEmitterBehaviorOptions>,\n\t\t\t\t\t'manual',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.rendererService?.destroy();\n\t\tthis.rendererService = null;\n\t}\n}\n\nexport const ParticleEmitterBehavior = defineBehavior<\n\tParticleEmitterBehaviorOptions,\n\tParticleEmitterHandle\n>({\n\tname: 'particle-emitter',\n\tdefaultOptions,\n\tsystemFactory: (ctx) =>\n\t\tnew ParticleEmitterBehaviorSystem(ctx.scene, ctx.getBehaviorLinks, ctx.getGlobals),\n\tcreateHandle: createParticleEmitterHandle,\n});\n","import type { ColorRepresentation } from 'three';\nimport {\n\tConstantColor,\n\tConstantValue,\n\tParticleSystem,\n\tPointEmitter,\n\tRenderMode,\n} from 'three.quarks';\n\nimport {\n\tcreateParticleMaterial,\n\tcreateRangeValue,\n\tcreateTextureSystemOptions,\n\tparticleEffect,\n\ttoColorVector,\n\ttype ParticleEffectDefinition,\n\ttype ParticlePresetMaterialOptions,\n} from './preset-builder';\nimport { electricityPresets, firePresets, gasPresets, magicPresets, waterPresets } from './presets';\n\nexport type {\n\tParticleEffectDefinition,\n\tParticleMagicAgency,\n\tParticleMagicAlignment,\n\tParticleMagicModifierInput,\n\tParticleMagicModifierOptions,\n\tParticleMagicOrder,\n\tParticleMagicRealityEffect,\n\tParticleMagicTemperament,\n\tParticlePresetMaterialOptions,\n\tSemanticParticlePresetOptions,\n} from './preset-builder';\n\nexport interface BurstParticlePresetOptions extends ParticlePresetMaterialOptions {\n\tcolor?: ColorRepresentation;\n\tcount?: number;\n\tduration?: number;\n\tlife?: number | readonly [number, number];\n\tsize?: number | readonly [number, number];\n\tspeed?: number | readonly [number, number];\n\tworldSpace?: boolean;\n}\n\nexport const particlePresets = {\n\tburst(\n\t\toptions: BurstParticlePresetOptions = {},\n\t): ParticleEffectDefinition {\n\t\treturn particleEffect(\n\t\t\t() =>\n\t\t\t\tnew ParticleSystem({\n\t\t\t\t\tduration: options.duration ?? 0.25,\n\t\t\t\t\tlooping: false,\n\t\t\t\t\tworldSpace: options.worldSpace ?? false,\n\t\t\t\t\tstartLife: createRangeValue(options.life ?? [0.3, 0.7], [0.3, 0.7]),\n\t\t\t\t\tstartSpeed: createRangeValue(options.speed ?? [1.5, 4], [1.5, 4]),\n\t\t\t\t\tstartSize: createRangeValue(options.size ?? [0.08, 0.18], [0.08, 0.18]),\n\t\t\t\t\tstartColor: new ConstantColor(\n\t\t\t\t\t\ttoColorVector(options.color ?? '#ffffff'),\n\t\t\t\t\t),\n\t\t\t\t\temissionOverTime: new ConstantValue(0),\n\t\t\t\t\temissionBursts: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttime: 0,\n\t\t\t\t\t\t\tcount: new ConstantValue(options.count ?? 18),\n\t\t\t\t\t\t\tcycle: 1,\n\t\t\t\t\t\t\tinterval: 0,\n\t\t\t\t\t\t\tprobability: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tshape: new PointEmitter(),\n\t\t\t\t\tmaterial: createParticleMaterial(\n\t\t\t\t\t\toptions.color ?? '#ffffff',\n\t\t\t\t\t\toptions,\n\t\t\t\t\t),\n\t\t\t\t\t...createTextureSystemOptions(options),\n\t\t\t\t\trenderMode: RenderMode.BillBoard,\n\t\t\t\t}),\n\t\t);\n\t},\n\tsmoke(\n\t\toptions: BurstParticlePresetOptions = {},\n\t): ParticleEffectDefinition {\n\t\treturn particleEffect(\n\t\t\t() =>\n\t\t\t\tnew ParticleSystem({\n\t\t\t\t\tduration: options.duration ?? 1.1,\n\t\t\t\t\tlooping: false,\n\t\t\t\t\tworldSpace: options.worldSpace ?? false,\n\t\t\t\t\tstartLife: createRangeValue(options.life ?? [0.8, 1.6], [0.8, 1.6]),\n\t\t\t\t\tstartSpeed: createRangeValue(options.speed ?? [0.2, 0.8], [0.2, 0.8]),\n\t\t\t\t\tstartSize: createRangeValue(options.size ?? [0.2, 0.5], [0.2, 0.5]),\n\t\t\t\t\tstartColor: new ConstantColor(\n\t\t\t\t\t\ttoColorVector(options.color ?? '#999999'),\n\t\t\t\t\t),\n\t\t\t\t\temissionOverTime: new ConstantValue(0),\n\t\t\t\t\temissionBursts: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttime: 0,\n\t\t\t\t\t\t\tcount: new ConstantValue(options.count ?? 10),\n\t\t\t\t\t\t\tcycle: 1,\n\t\t\t\t\t\t\tinterval: 0,\n\t\t\t\t\t\t\tprobability: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tshape: new PointEmitter(),\n\t\t\t\t\tmaterial: createParticleMaterial(\n\t\t\t\t\t\toptions.color ?? '#999999',\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\t0.85,\n\t\t\t\t\t),\n\t\t\t\t\t...createTextureSystemOptions(options),\n\t\t\t\t\trenderMode: RenderMode.BillBoard,\n\t\t\t\t}),\n\t\t);\n\t},\n\tfire: firePresets,\n\twater: waterPresets,\n\tgas: gasPresets,\n\telectricity: electricityPresets,\n\tmagic: magicPresets,\n} as const;\n\nexport { particleEffect } from './preset-builder';\n"],"mappings":"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","names":["position","ParticleSystem","ParticleSystem"]}
@@ -0,0 +1,56 @@
1
+ import {
2
+ getEntityFacingAngle2D,
3
+ resolveAim2D
4
+ } from "./chunk-6C6NXNEW.js";
5
+ import {
6
+ createThrusterInputComponent
7
+ } from "./chunk-KS72RZHX.js";
8
+
9
+ // src/lib/coordinators/multidirectional-space-shooter.coordinator.ts
10
+ var MultidirectionalSpaceShooterCoordinator = class {
11
+ constructor(entity, shooter, stage) {
12
+ this.entity = entity;
13
+ this.shooter = shooter;
14
+ this.stage = stage;
15
+ }
16
+ entity;
17
+ shooter;
18
+ stage;
19
+ update(input) {
20
+ if (!this.entity.$thruster) {
21
+ this.entity.$thruster = createThrusterInputComponent();
22
+ }
23
+ this.entity.$thruster.thrustX = input.moveX;
24
+ this.entity.$thruster.thrustY = input.moveY;
25
+ this.entity.$thruster.thrust = 0;
26
+ this.entity.$thruster.rotate = 0;
27
+ const aim = resolveAim2D(
28
+ input.aimX,
29
+ input.aimY,
30
+ getEntityFacingAngle2D(this.entity)
31
+ );
32
+ if (aim.hasAimInput) {
33
+ this.entity.setRotationZ(aim.angle);
34
+ }
35
+ if (!input.shootPressed && !input.shootHeld) {
36
+ return;
37
+ }
38
+ const sourcePosition = this.entity.body?.translation();
39
+ if (!sourcePosition) {
40
+ return;
41
+ }
42
+ void this.shooter.fire({
43
+ source: this.entity,
44
+ stage: this.stage,
45
+ target: {
46
+ x: sourcePosition.x + aim.direction.x,
47
+ y: sourcePosition.y + aim.direction.y
48
+ }
49
+ });
50
+ }
51
+ };
52
+
53
+ export {
54
+ MultidirectionalSpaceShooterCoordinator
55
+ };
56
+ //# sourceMappingURL=chunk-RTRVBEIB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/coordinators/multidirectional-space-shooter.coordinator.ts"],"sourcesContent":["import type { GameEntity } from '../entities/entity';\nimport {\n\tcreateThrusterInputComponent,\n\ttype ThrusterInputComponent,\n} from '../behaviors/thruster/components';\nimport type {\n\tShooter2DHandle,\n\tShooter2DSourceEntity,\n\tShooter2DStageLike,\n} from '../behaviors/shooter-2d/shooter-2d.descriptor';\nimport { getEntityFacingAngle2D, resolveAim2D } from './shared/top-down-aim';\n\nexport interface MultidirectionalSpaceShooterInput {\n\tmoveX: number;\n\tmoveY: number;\n\taimX: number;\n\taimY: number;\n\tshootPressed: boolean;\n\tshootHeld: boolean;\n}\n\ntype MultidirectionalSpaceShooterEntity = GameEntity<any> & Shooter2DSourceEntity & {\n\t$thruster?: ThrusterInputComponent;\n};\n\nexport class MultidirectionalSpaceShooterCoordinator {\n\tconstructor(\n\t\tprivate entity: MultidirectionalSpaceShooterEntity,\n\t\tprivate shooter: Shooter2DHandle,\n\t\tprivate stage: Shooter2DStageLike,\n\t) {}\n\n\tpublic update(input: MultidirectionalSpaceShooterInput): void {\n\t\tif (!this.entity.$thruster) {\n\t\t\tthis.entity.$thruster = createThrusterInputComponent();\n\t\t}\n\n\t\tthis.entity.$thruster.thrustX = input.moveX;\n\t\tthis.entity.$thruster.thrustY = input.moveY;\n\t\tthis.entity.$thruster.thrust = 0;\n\t\tthis.entity.$thruster.rotate = 0;\n\n\t\tconst aim = resolveAim2D(\n\t\t\tinput.aimX,\n\t\t\tinput.aimY,\n\t\t\tgetEntityFacingAngle2D(this.entity),\n\t\t);\n\t\tif (aim.hasAimInput) {\n\t\t\tthis.entity.setRotationZ(aim.angle);\n\t\t}\n\n\t\tif (!input.shootPressed && !input.shootHeld) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst sourcePosition = this.entity.body?.translation();\n\t\tif (!sourcePosition) {\n\t\t\treturn;\n\t\t}\n\n\t\tvoid this.shooter.fire({\n\t\t\tsource: this.entity,\n\t\t\tstage: this.stage,\n\t\t\ttarget: {\n\t\t\t\tx: sourcePosition.x + aim.direction.x,\n\t\t\t\ty: sourcePosition.y + aim.direction.y,\n\t\t\t},\n\t\t});\n\t}\n}\n"],"mappings":";;;;;;;;;AAyBO,IAAM,0CAAN,MAA8C;AAAA,EACpD,YACS,QACA,SACA,OACP;AAHO;AACA;AACA;AAAA,EACN;AAAA,EAHM;AAAA,EACA;AAAA,EACA;AAAA,EAGF,OAAO,OAAgD;AAC7D,QAAI,CAAC,KAAK,OAAO,WAAW;AAC3B,WAAK,OAAO,YAAY,6BAA6B;AAAA,IACtD;AAEA,SAAK,OAAO,UAAU,UAAU,MAAM;AACtC,SAAK,OAAO,UAAU,UAAU,MAAM;AACtC,SAAK,OAAO,UAAU,SAAS;AAC/B,SAAK,OAAO,UAAU,SAAS;AAE/B,UAAM,MAAM;AAAA,MACX,MAAM;AAAA,MACN,MAAM;AAAA,MACN,uBAAuB,KAAK,MAAM;AAAA,IACnC;AACA,QAAI,IAAI,aAAa;AACpB,WAAK,OAAO,aAAa,IAAI,KAAK;AAAA,IACnC;AAEA,QAAI,CAAC,MAAM,gBAAgB,CAAC,MAAM,WAAW;AAC5C;AAAA,IACD;AAEA,UAAM,iBAAiB,KAAK,OAAO,MAAM,YAAY;AACrD,QAAI,CAAC,gBAAgB;AACpB;AAAA,IACD;AAEA,SAAK,KAAK,QAAQ,KAAK;AAAA,MACtB,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,QAAQ;AAAA,QACP,GAAG,eAAe,IAAI,IAAI,UAAU;AAAA,QACpC,GAAG,eAAe,IAAI,IAAI,UAAU;AAAA,MACrC;AAAA,IACD,CAAC;AAAA,EACF;AACD;","names":[]}
@@ -0,0 +1,29 @@
1
+ // src/lib/actions/capabilities/velocity-intents.ts
2
+ function setVelocityIntent(store, sourceId, vector, options = {}) {
3
+ const prev = store.velocityChannels[sourceId];
4
+ const mode = options.mode ?? prev?.mode ?? "replace";
5
+ const priority = options.priority ?? prev?.priority ?? 0;
6
+ const isAdditiveMerge = mode === "add" && prev?.mode === "add";
7
+ const x = vector.x == null ? prev?.x : isAdditiveMerge ? (prev?.x ?? 0) + vector.x : vector.x;
8
+ const y = vector.y == null ? prev?.y : isAdditiveMerge ? (prev?.y ?? 0) + vector.y : vector.y;
9
+ const z = vector.z == null ? prev?.z : isAdditiveMerge ? (prev?.z ?? 0) + vector.z : vector.z;
10
+ store.velocityChannels[sourceId] = {
11
+ x,
12
+ y,
13
+ z,
14
+ mode,
15
+ priority
16
+ };
17
+ store.dirty.velocityChannels = true;
18
+ }
19
+ function clearVelocityIntent(store, sourceId) {
20
+ if (!(sourceId in store.velocityChannels)) return;
21
+ delete store.velocityChannels[sourceId];
22
+ store.dirty.velocityChannels = true;
23
+ }
24
+
25
+ export {
26
+ setVelocityIntent,
27
+ clearVelocityIntent
28
+ };
29
+ //# sourceMappingURL=chunk-RTVRUNYR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/actions/capabilities/velocity-intents.ts"],"sourcesContent":["import { TransformState, VelocityIntentMode } from './transform-store';\n\nexport interface VelocityIntentOptions {\n\tmode?: VelocityIntentMode;\n\tpriority?: number;\n}\n\nexport interface VelocityIntentVector {\n\tx?: number;\n\ty?: number;\n\tz?: number;\n}\n\nexport function setVelocityIntent(\n\tstore: TransformState,\n\tsourceId: string,\n\tvector: VelocityIntentVector,\n\toptions: VelocityIntentOptions = {},\n): void {\n\tconst prev = store.velocityChannels[sourceId];\n\tconst mode = options.mode ?? prev?.mode ?? 'replace';\n\tconst priority = options.priority ?? prev?.priority ?? 0;\n\tconst isAdditiveMerge = mode === 'add' && prev?.mode === 'add';\n\n\tconst x =\n\t\tvector.x == null\n\t\t\t? prev?.x\n\t\t\t: isAdditiveMerge\n\t\t\t\t? (prev?.x ?? 0) + vector.x\n\t\t\t\t: vector.x;\n\tconst y =\n\t\tvector.y == null\n\t\t\t? prev?.y\n\t\t\t: isAdditiveMerge\n\t\t\t\t? (prev?.y ?? 0) + vector.y\n\t\t\t\t: vector.y;\n\tconst z =\n\t\tvector.z == null\n\t\t\t? prev?.z\n\t\t\t: isAdditiveMerge\n\t\t\t\t? (prev?.z ?? 0) + vector.z\n\t\t\t\t: vector.z;\n\n\tstore.velocityChannels[sourceId] = {\n\t\tx,\n\t\ty,\n\t\tz,\n\t\tmode,\n\t\tpriority,\n\t};\n\tstore.dirty.velocityChannels = true;\n}\n\nexport function clearVelocityIntent(store: TransformState, sourceId: string): void {\n\tif (!(sourceId in store.velocityChannels)) return;\n\tdelete store.velocityChannels[sourceId];\n\tstore.dirty.velocityChannels = true;\n}\n"],"mappings":";AAaO,SAAS,kBACf,OACA,UACA,QACA,UAAiC,CAAC,GAC3B;AACP,QAAM,OAAO,MAAM,iBAAiB,QAAQ;AAC5C,QAAM,OAAO,QAAQ,QAAQ,MAAM,QAAQ;AAC3C,QAAM,WAAW,QAAQ,YAAY,MAAM,YAAY;AACvD,QAAM,kBAAkB,SAAS,SAAS,MAAM,SAAS;AAEzD,QAAM,IACL,OAAO,KAAK,OACT,MAAM,IACN,mBACE,MAAM,KAAK,KAAK,OAAO,IACxB,OAAO;AACZ,QAAM,IACL,OAAO,KAAK,OACT,MAAM,IACN,mBACE,MAAM,KAAK,KAAK,OAAO,IACxB,OAAO;AACZ,QAAM,IACL,OAAO,KAAK,OACT,MAAM,IACN,mBACE,MAAM,KAAK,KAAK,OAAO,IACxB,OAAO;AAEZ,QAAM,iBAAiB,QAAQ,IAAI;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACA,QAAM,MAAM,mBAAmB;AAChC;AAEO,SAAS,oBAAoB,OAAuB,UAAwB;AAClF,MAAI,EAAE,YAAY,MAAM,kBAAmB;AAC3C,SAAO,MAAM,iBAAiB,QAAQ;AACtC,QAAM,MAAM,mBAAmB;AAChC;","names":[]}