@codexo/exojs 0.6.12 → 0.7.11

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 (186) hide show
  1. package/CHANGELOG.md +1316 -0
  2. package/dist/esm/audio/AbstractMedia.d.ts +18 -0
  3. package/dist/esm/audio/AbstractMedia.js +66 -0
  4. package/dist/esm/audio/AbstractMedia.js.map +1 -1
  5. package/dist/esm/audio/AudioAnalyser.d.ts +62 -23
  6. package/dist/esm/audio/AudioAnalyser.js +261 -57
  7. package/dist/esm/audio/AudioAnalyser.js.map +1 -1
  8. package/dist/esm/audio/AudioBus.d.ts +45 -0
  9. package/dist/esm/audio/AudioBus.js +219 -0
  10. package/dist/esm/audio/AudioBus.js.map +1 -0
  11. package/dist/esm/audio/AudioFilter.d.ts +9 -0
  12. package/dist/esm/audio/AudioFilter.js +7 -0
  13. package/dist/esm/audio/AudioFilter.js.map +1 -0
  14. package/dist/esm/audio/AudioListener.d.ts +20 -0
  15. package/dist/esm/audio/AudioListener.js +86 -0
  16. package/dist/esm/audio/AudioListener.js.map +1 -0
  17. package/dist/esm/audio/AudioManager.d.ts +31 -0
  18. package/dist/esm/audio/AudioManager.js +102 -0
  19. package/dist/esm/audio/AudioManager.js.map +1 -0
  20. package/dist/esm/audio/BeatDetector.d.ts +121 -0
  21. package/dist/esm/audio/BeatDetector.js +936 -0
  22. package/dist/esm/audio/BeatDetector.js.map +1 -0
  23. package/dist/esm/audio/Envelope.d.ts +44 -0
  24. package/dist/esm/audio/Envelope.js +60 -0
  25. package/dist/esm/audio/Envelope.js.map +1 -0
  26. package/dist/esm/audio/Music.d.ts +8 -0
  27. package/dist/esm/audio/Music.js +33 -4
  28. package/dist/esm/audio/Music.js.map +1 -1
  29. package/dist/esm/audio/OscillatorSound.d.ts +98 -0
  30. package/dist/esm/audio/OscillatorSound.js +342 -0
  31. package/dist/esm/audio/OscillatorSound.js.map +1 -0
  32. package/dist/esm/audio/Sound.d.ts +94 -9
  33. package/dist/esm/audio/Sound.js +283 -117
  34. package/dist/esm/audio/Sound.js.map +1 -1
  35. package/dist/esm/audio/crossFade.d.ts +19 -0
  36. package/dist/esm/audio/crossFade.js +26 -0
  37. package/dist/esm/audio/crossFade.js.map +1 -0
  38. package/dist/esm/audio/dsp/fft.d.ts +22 -0
  39. package/dist/esm/audio/dsp/mel.d.ts +43 -0
  40. package/dist/esm/audio/dsp/tempogram.d.ts +51 -0
  41. package/dist/esm/audio/filters/ChorusFilter.d.ts +47 -0
  42. package/dist/esm/audio/filters/ChorusFilter.js +139 -0
  43. package/dist/esm/audio/filters/ChorusFilter.js.map +1 -0
  44. package/dist/esm/audio/filters/CompressorFilter.d.ts +31 -0
  45. package/dist/esm/audio/filters/CompressorFilter.js +97 -0
  46. package/dist/esm/audio/filters/CompressorFilter.js.map +1 -0
  47. package/dist/esm/audio/filters/DelayFilter.d.ts +23 -0
  48. package/dist/esm/audio/filters/DelayFilter.js +100 -0
  49. package/dist/esm/audio/filters/DelayFilter.js.map +1 -0
  50. package/dist/esm/audio/filters/DuckingFilter.d.ts +31 -0
  51. package/dist/esm/audio/filters/DuckingFilter.js +152 -0
  52. package/dist/esm/audio/filters/DuckingFilter.js.map +1 -0
  53. package/dist/esm/audio/filters/EqualizerFilter.d.ts +29 -0
  54. package/dist/esm/audio/filters/EqualizerFilter.js +94 -0
  55. package/dist/esm/audio/filters/EqualizerFilter.js.map +1 -0
  56. package/dist/esm/audio/filters/GranularFilter.d.ts +56 -0
  57. package/dist/esm/audio/filters/GranularFilter.js +170 -0
  58. package/dist/esm/audio/filters/GranularFilter.js.map +1 -0
  59. package/dist/esm/audio/filters/HighpassFilter.d.ts +19 -0
  60. package/dist/esm/audio/filters/HighpassFilter.js +62 -0
  61. package/dist/esm/audio/filters/HighpassFilter.js.map +1 -0
  62. package/dist/esm/audio/filters/LowpassFilter.d.ts +19 -0
  63. package/dist/esm/audio/filters/LowpassFilter.js +62 -0
  64. package/dist/esm/audio/filters/LowpassFilter.js.map +1 -0
  65. package/dist/esm/audio/filters/PitchShiftFilter.d.ts +42 -0
  66. package/dist/esm/audio/filters/PitchShiftFilter.js +130 -0
  67. package/dist/esm/audio/filters/PitchShiftFilter.js.map +1 -0
  68. package/dist/esm/audio/filters/ReverbFilter.d.ts +24 -0
  69. package/dist/esm/audio/filters/ReverbFilter.js +107 -0
  70. package/dist/esm/audio/filters/ReverbFilter.js.map +1 -0
  71. package/dist/esm/audio/filters/VocoderFilter.d.ts +38 -0
  72. package/dist/esm/audio/filters/VocoderFilter.js +163 -0
  73. package/dist/esm/audio/filters/VocoderFilter.js.map +1 -0
  74. package/dist/esm/audio/filters/WorkletFilter.d.ts +46 -0
  75. package/dist/esm/audio/filters/WorkletFilter.js +101 -0
  76. package/dist/esm/audio/filters/WorkletFilter.js.map +1 -0
  77. package/dist/esm/audio/filters/index.d.ts +12 -0
  78. package/dist/esm/audio/index.d.ts +15 -1
  79. package/dist/esm/audio/worklet/registerWorklet.d.ts +10 -0
  80. package/dist/esm/audio/worklet/registerWorklet.js +44 -0
  81. package/dist/esm/audio/worklet/registerWorklet.js.map +1 -0
  82. package/dist/esm/core/Application.d.ts +19 -0
  83. package/dist/esm/core/Application.js +76 -2
  84. package/dist/esm/core/Application.js.map +1 -1
  85. package/dist/esm/core/SceneNode.d.ts +9 -1
  86. package/dist/esm/core/SceneNode.js +44 -6
  87. package/dist/esm/core/SceneNode.js.map +1 -1
  88. package/dist/esm/core/Time.js +1 -1
  89. package/dist/esm/core/index.d.ts +0 -1
  90. package/dist/esm/debug/BoundingBoxesLayer.d.ts +18 -0
  91. package/dist/esm/debug/BoundingBoxesLayer.js +128 -0
  92. package/dist/esm/debug/BoundingBoxesLayer.js.map +1 -0
  93. package/dist/esm/debug/DebugLayer.d.ts +29 -0
  94. package/dist/esm/debug/DebugLayer.js +26 -0
  95. package/dist/esm/debug/DebugLayer.js.map +1 -0
  96. package/dist/esm/debug/DebugOverlay.d.ts +48 -0
  97. package/dist/esm/debug/DebugOverlay.js +117 -0
  98. package/dist/esm/debug/DebugOverlay.js.map +1 -0
  99. package/dist/esm/debug/HitTestLayer.d.ts +23 -0
  100. package/dist/esm/debug/HitTestLayer.js +109 -0
  101. package/dist/esm/debug/HitTestLayer.js.map +1 -0
  102. package/dist/esm/debug/PerformanceLayer.d.ts +21 -0
  103. package/dist/esm/debug/PerformanceLayer.js +175 -0
  104. package/dist/esm/debug/PerformanceLayer.js.map +1 -0
  105. package/dist/esm/debug/PointerStackLayer.d.ts +23 -0
  106. package/dist/esm/debug/PointerStackLayer.js +152 -0
  107. package/dist/esm/debug/PointerStackLayer.js.map +1 -0
  108. package/dist/esm/debug/index.d.ts +6 -0
  109. package/dist/esm/debug/index.js +7 -0
  110. package/dist/esm/debug/index.js.map +1 -0
  111. package/dist/esm/index.js +28 -2
  112. package/dist/esm/index.js.map +1 -1
  113. package/dist/esm/input/InputManager.d.ts +10 -0
  114. package/dist/esm/input/InputManager.js +35 -5
  115. package/dist/esm/input/InputManager.js.map +1 -1
  116. package/dist/esm/input/InteractionEvent.d.ts +18 -0
  117. package/dist/esm/input/InteractionEvent.js +29 -0
  118. package/dist/esm/input/InteractionEvent.js.map +1 -0
  119. package/dist/esm/input/InteractionManager.d.ts +134 -0
  120. package/dist/esm/input/InteractionManager.js +546 -0
  121. package/dist/esm/input/InteractionManager.js.map +1 -0
  122. package/dist/esm/input/index.d.ts +2 -0
  123. package/dist/esm/input/interaction-hooks.d.ts +34 -0
  124. package/dist/esm/input/interaction-hooks.js +35 -0
  125. package/dist/esm/input/interaction-hooks.js.map +1 -0
  126. package/dist/esm/math/Circle.d.ts +12 -2
  127. package/dist/esm/math/Circle.js +82 -14
  128. package/dist/esm/math/Circle.js.map +1 -1
  129. package/dist/esm/math/Interval.js +1 -1
  130. package/dist/esm/math/ObservableVector.d.ts +2 -2
  131. package/dist/esm/math/ObservableVector.js +4 -2
  132. package/dist/esm/math/ObservableVector.js.map +1 -1
  133. package/dist/esm/math/Polygon.d.ts +15 -1
  134. package/dist/esm/math/Polygon.js +58 -6
  135. package/dist/esm/math/Polygon.js.map +1 -1
  136. package/dist/esm/math/Quadtree.d.ts +47 -0
  137. package/dist/esm/math/Quadtree.js +168 -0
  138. package/dist/esm/math/Quadtree.js.map +1 -0
  139. package/dist/esm/math/Random.js +1 -1
  140. package/dist/esm/math/Size.js +1 -1
  141. package/dist/esm/math/Vector.js +1 -1
  142. package/dist/esm/math/collision-detection.js +4 -1
  143. package/dist/esm/math/collision-detection.js.map +1 -1
  144. package/dist/esm/math/index.d.ts +1 -0
  145. package/dist/esm/particles/ParticleSystem.js +1 -0
  146. package/dist/esm/particles/ParticleSystem.js.map +1 -1
  147. package/dist/esm/particles/affectors/TorqueAffector.js +1 -1
  148. package/dist/esm/rendering/Container.d.ts +1 -0
  149. package/dist/esm/rendering/Container.js +19 -0
  150. package/dist/esm/rendering/Container.js.map +1 -1
  151. package/dist/esm/rendering/RenderNode.d.ts +27 -0
  152. package/dist/esm/rendering/RenderNode.js +44 -0
  153. package/dist/esm/rendering/RenderNode.js.map +1 -1
  154. package/dist/esm/rendering/View.d.ts +6 -4
  155. package/dist/esm/rendering/View.js +12 -2
  156. package/dist/esm/rendering/View.js.map +1 -1
  157. package/dist/esm/rendering/filters/WebGl2ShaderFilter.d.ts +109 -0
  158. package/dist/esm/rendering/filters/WebGl2ShaderFilter.js +268 -0
  159. package/dist/esm/rendering/filters/WebGl2ShaderFilter.js.map +1 -0
  160. package/dist/esm/rendering/filters/WebGpuShaderFilter.d.ts +111 -0
  161. package/dist/esm/rendering/filters/WebGpuShaderFilter.js +397 -0
  162. package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -0
  163. package/dist/esm/rendering/index.d.ts +3 -0
  164. package/dist/esm/rendering/mesh/Mesh.js +1 -0
  165. package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
  166. package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.d.ts +34 -0
  167. package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js +60 -0
  168. package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js.map +1 -0
  169. package/dist/esm/rendering/sprite/Sprite.d.ts +6 -1
  170. package/dist/esm/rendering/sprite/Sprite.js +41 -19
  171. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  172. package/dist/esm/rendering/video/Video.d.ts +4 -0
  173. package/dist/esm/rendering/video/Video.js +32 -4
  174. package/dist/esm/rendering/video/Video.js.map +1 -1
  175. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +4 -4
  176. package/dist/esm/rendering/webgl2/WebGl2Backend.js +7 -16
  177. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  178. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +10 -8
  179. package/dist/esm/rendering/webgpu/WebGpuBackend.js +30 -40
  180. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  181. package/dist/exo.esm.js +7764 -2453
  182. package/dist/exo.esm.js.map +1 -1
  183. package/package.json +14 -2
  184. package/dist/esm/core/Quadtree.d.ts +0 -20
  185. package/dist/esm/core/Quadtree.js +0 -86
  186. package/dist/esm/core/Quadtree.js.map +0 -1
@@ -0,0 +1,546 @@
1
+ import { Container } from '../rendering/Container.js';
2
+ import { InteractionEvent } from './InteractionEvent.js';
3
+ import { Rectangle } from '../math/Rectangle.js';
4
+ import { Quadtree } from '../math/Quadtree.js';
5
+ import { _setCurrentInteractionManager } from './interaction-hooks.js';
6
+
7
+ // ---------------------------------------------------------------------------
8
+ // Internal types
9
+ // ---------------------------------------------------------------------------
10
+ var PointerEventFlag;
11
+ (function (PointerEventFlag) {
12
+ PointerEventFlag[PointerEventFlag["None"] = 0] = "None";
13
+ PointerEventFlag[PointerEventFlag["Down"] = 1] = "Down";
14
+ PointerEventFlag[PointerEventFlag["Move"] = 2] = "Move";
15
+ PointerEventFlag[PointerEventFlag["Up"] = 4] = "Up";
16
+ PointerEventFlag[PointerEventFlag["Tap"] = 8] = "Tap";
17
+ PointerEventFlag[PointerEventFlag["Cancel"] = 16] = "Cancel";
18
+ PointerEventFlag[PointerEventFlag["Leave"] = 32] = "Leave";
19
+ })(PointerEventFlag || (PointerEventFlag = {}));
20
+ // ---------------------------------------------------------------------------
21
+ class InteractionManager {
22
+ _app;
23
+ // Persistent quadtree — null when no interactive nodes are present.
24
+ _quadtree = null;
25
+ // All currently-tracked interactive RenderNodes.
26
+ _interactiveNodes = new Set();
27
+ // Nodes whose quadtree entry is stale (bounds changed since last insert).
28
+ _staleNodes = new Set();
29
+ // Items stored in the quadtree, keyed by node for fast removal.
30
+ _quadtreeItems = new Map();
31
+ // Running insertion-order counter used to break hit-test ties.
32
+ _quadtreeOrderCounter = 0;
33
+ _quadtreeQueryBuffer = [];
34
+ /** Maps pointerId → the deepest interactive RenderNode that pointer is currently over. */
35
+ _lastHit = new Map();
36
+ /** Pending per-pointer event queues, filled by signal handlers each frame. */
37
+ _pending = new Map();
38
+ /** Active pointer captures set up by drag-start. Maps pointerId → the captured node. */
39
+ _capturedPointers = new Map();
40
+ /** Active drag states. Maps pointerId → drag metadata. */
41
+ _drags = new Map();
42
+ /** Whether any pointer enqueued events since the last update(). */
43
+ _dirty = false;
44
+ _onPointerDownHandler;
45
+ _onPointerMoveHandler;
46
+ _onPointerUpHandler;
47
+ _onPointerTapHandler;
48
+ _onPointerCancelHandler;
49
+ _onPointerLeaveHandler;
50
+ constructor(app) {
51
+ this._app = app;
52
+ // Register as the active singleton so RenderNode / Container / SceneNode hooks
53
+ // can reach the manager without holding an explicit reference.
54
+ _setCurrentInteractionManager(this);
55
+ this._onPointerDownHandler = this._handlePointerDown.bind(this);
56
+ this._onPointerMoveHandler = this._handlePointerMove.bind(this);
57
+ this._onPointerUpHandler = this._handlePointerUp.bind(this);
58
+ this._onPointerTapHandler = this._handlePointerTap.bind(this);
59
+ this._onPointerCancelHandler = this._handlePointerCancel.bind(this);
60
+ this._onPointerLeaveHandler = this._handlePointerLeave.bind(this);
61
+ app.inputManager.onPointerDown.add(this._onPointerDownHandler);
62
+ app.inputManager.onPointerMove.add(this._onPointerMoveHandler);
63
+ app.inputManager.onPointerUp.add(this._onPointerUpHandler);
64
+ app.inputManager.onPointerTap.add(this._onPointerTapHandler);
65
+ app.inputManager.onPointerCancel.add(this._onPointerCancelHandler);
66
+ app.inputManager.onPointerLeave.add(this._onPointerLeaveHandler);
67
+ }
68
+ /**
69
+ * Returns the RenderNode currently hovered by the given pointer, or null.
70
+ * If pointerId is omitted, returns the hovered node for the first pointer
71
+ * in iteration order (typically the primary mouse pointer).
72
+ */
73
+ getHoveredNode(pointerId) {
74
+ if (pointerId !== undefined) {
75
+ return this._lastHit.get(pointerId) ?? null;
76
+ }
77
+ const firstEntry = this._lastHit.values().next();
78
+ return firstEntry.done ? null : firstEntry.value;
79
+ }
80
+ /**
81
+ * Returns all currently captured RenderNodes (nodes that have an active
82
+ * drag / pointer-capture in progress). Used by debug layers.
83
+ */
84
+ getCapturedNodes() {
85
+ return Array.from(this._capturedPointers.values());
86
+ }
87
+ /**
88
+ * Returns the internal quadtree used for spatial hit-testing, or null when
89
+ * no interactive nodes are present. The quadtree is automatically created
90
+ * when the first interactive node is registered and disposed when the last
91
+ * interactive node is removed. Prefixed with underscore to signal
92
+ * "internal-but-public" (debug use only).
93
+ */
94
+ _getDebugQuadtree() {
95
+ return this._quadtree;
96
+ }
97
+ destroy() {
98
+ this._app.inputManager.onPointerDown.remove(this._onPointerDownHandler);
99
+ this._app.inputManager.onPointerMove.remove(this._onPointerMoveHandler);
100
+ this._app.inputManager.onPointerUp.remove(this._onPointerUpHandler);
101
+ this._app.inputManager.onPointerTap.remove(this._onPointerTapHandler);
102
+ this._app.inputManager.onPointerCancel.remove(this._onPointerCancelHandler);
103
+ this._app.inputManager.onPointerLeave.remove(this._onPointerLeaveHandler);
104
+ this._lastHit.clear();
105
+ this._pending.clear();
106
+ this._capturedPointers.clear();
107
+ this._drags.clear();
108
+ this._interactiveNodes.clear();
109
+ this._staleNodes.clear();
110
+ this._quadtreeItems.clear();
111
+ this._dirty = false;
112
+ if (this._quadtree !== null) {
113
+ this._quadtree.destroy();
114
+ this._quadtree = null;
115
+ }
116
+ _setCurrentInteractionManager(null);
117
+ }
118
+ /**
119
+ * Process all pending pointer events accumulated since the last frame.
120
+ * Must be called once per frame from {@link Application.update}, after
121
+ * `inputManager.update()` has run (so signals are already dispatched and
122
+ * queued here) and before game-state updates so that user listeners on
123
+ * `onPointerDown` etc. fire before per-frame logic mutates state.
124
+ *
125
+ * The dirty flag ensures this is a no-op on frames with no pointer
126
+ * activity; every signal handler that enqueues an event sets `_dirty =
127
+ * true`, and `update()` clears it at the top before draining the queue.
128
+ */
129
+ update() {
130
+ if (!this._dirty)
131
+ return;
132
+ this._dirty = false;
133
+ this._flushStaleEntries();
134
+ for (const queue of this._pending.values()) {
135
+ this._processQueue(queue);
136
+ }
137
+ this._pending.clear();
138
+ this._updateCursor();
139
+ }
140
+ // ---------------------------------------------------------------------------
141
+ // Hooks called by RenderNode / Container / SceneNode
142
+ // These are prefixed _ to signal "internal-but-public".
143
+ // ---------------------------------------------------------------------------
144
+ /**
145
+ * Called when a subtree rooted at `node` has been added to the scene.
146
+ * Walks the subtree and registers any interactive nodes found.
147
+ *
148
+ * @internal
149
+ */
150
+ _notifyNodeAdded(node) {
151
+ this._walkSubtree(node, (n) => {
152
+ if (n.interactive) {
153
+ this._registerNode(n);
154
+ }
155
+ });
156
+ }
157
+ /**
158
+ * Called when a subtree rooted at `node` is about to be removed from the
159
+ * scene. Walks the subtree and unregisters any interactive nodes found.
160
+ *
161
+ * @internal
162
+ */
163
+ _notifyNodeRemoved(node) {
164
+ this._walkSubtree(node, (n) => {
165
+ if (this._interactiveNodes.has(n)) {
166
+ this._unregisterNode(n);
167
+ }
168
+ });
169
+ }
170
+ /**
171
+ * Called when a node's `interactive` property changes.
172
+ *
173
+ * @internal
174
+ */
175
+ _notifyInteractiveChanged(node, becameInteractive) {
176
+ if (becameInteractive) {
177
+ this._registerNode(node);
178
+ }
179
+ else {
180
+ this._unregisterNode(node);
181
+ }
182
+ }
183
+ /**
184
+ * Called when a node's world transform / bounds are invalidated. If the
185
+ * node is currently tracked as interactive, mark it stale so its quadtree
186
+ * entry is refreshed on the next query.
187
+ *
188
+ * @internal
189
+ */
190
+ _notifyBoundsInvalidated(node) {
191
+ if (this._interactiveNodes.has(node)) {
192
+ this._staleNodes.add(node);
193
+ }
194
+ }
195
+ // ---------------------------------------------------------------------------
196
+ // Signal handlers — only enqueue flags, never hit-test
197
+ // ---------------------------------------------------------------------------
198
+ _handlePointerDown(pointer) {
199
+ this._enqueue(pointer, PointerEventFlag.Down);
200
+ }
201
+ _handlePointerMove(pointer) {
202
+ this._enqueue(pointer, PointerEventFlag.Move);
203
+ }
204
+ _handlePointerUp(pointer) {
205
+ this._enqueue(pointer, PointerEventFlag.Up);
206
+ }
207
+ _handlePointerTap(pointer) {
208
+ this._enqueue(pointer, PointerEventFlag.Tap);
209
+ }
210
+ _handlePointerCancel(pointer) {
211
+ this._enqueue(pointer, PointerEventFlag.Cancel);
212
+ }
213
+ _handlePointerLeave(pointer) {
214
+ this._enqueue(pointer, PointerEventFlag.Leave);
215
+ }
216
+ _enqueue(pointer, flag) {
217
+ let q = this._pending.get(pointer.id);
218
+ if (!q) {
219
+ q = { pointer, events: 0 };
220
+ this._pending.set(pointer.id, q);
221
+ }
222
+ else {
223
+ // Refresh to latest pointer ref (same object usually, but be defensive).
224
+ q.pointer = pointer;
225
+ }
226
+ q.events |= flag;
227
+ this._dirty = true;
228
+ }
229
+ // ---------------------------------------------------------------------------
230
+ // Per-frame queue processing
231
+ // ---------------------------------------------------------------------------
232
+ _processQueue(queue) {
233
+ const { pointer, events } = queue;
234
+ const { id, x, y } = pointer;
235
+ // Determine the hit node. Captured pointers short-circuit hit-testing.
236
+ const captured = this._capturedPointers.get(id) ?? null;
237
+ const hit = captured !== null ? captured : this._hitTest(x, y);
238
+ // --- Over / Out transitions ---
239
+ // Skip while a drag is active for this pointer — the dragged node
240
+ // stays "hovered" by definition and we don't want spurious events.
241
+ const drag = this._drags.get(id) ?? null;
242
+ const last = this._lastHit.get(id) ?? null;
243
+ const isExitEvent = (events & (PointerEventFlag.Cancel | PointerEventFlag.Leave)) !== 0;
244
+ if (captured === null && hit !== last && !isExitEvent) {
245
+ if (last !== null) {
246
+ this._dispatchBubble(new InteractionEvent('pointerout', last, pointer, x, y));
247
+ }
248
+ if (hit !== null) {
249
+ this._dispatchBubble(new InteractionEvent('pointerover', hit, pointer, x, y));
250
+ }
251
+ this._setLastHit(id, hit);
252
+ }
253
+ // --- Down ---
254
+ if ((events & PointerEventFlag.Down) !== 0) {
255
+ if (hit !== null) {
256
+ this._dispatchBubble(new InteractionEvent('pointerdown', hit, pointer, x, y));
257
+ // Start drag if node is draggable and no existing drag for this pointer.
258
+ if (hit.draggable && !this._drags.has(id)) {
259
+ const offsetX = hit.position.x - x;
260
+ const offsetY = hit.position.y - y;
261
+ this._drags.set(id, { pointerId: id, node: hit, offsetX, offsetY });
262
+ this._capturedPointers.set(id, hit);
263
+ try {
264
+ this._app.canvas.setPointerCapture(id);
265
+ }
266
+ catch {
267
+ // Best-effort — jsdom and some browsers may not support this.
268
+ }
269
+ this._dispatchDirect(new InteractionEvent('dragstart', hit, pointer, x, y), hit.onDragStart);
270
+ }
271
+ }
272
+ }
273
+ // --- Move ---
274
+ if ((events & PointerEventFlag.Move) !== 0) {
275
+ if (drag !== null) {
276
+ // Auto-position the dragged node, preserving the grab offset.
277
+ drag.node.position.x = x + drag.offsetX;
278
+ drag.node.position.y = y + drag.offsetY;
279
+ }
280
+ if (hit !== null) {
281
+ this._dispatchBubble(new InteractionEvent('pointermove', hit, pointer, x, y));
282
+ }
283
+ if (drag !== null) {
284
+ this._dispatchDirect(new InteractionEvent('drag', drag.node, pointer, x, y), drag.node.onDrag);
285
+ }
286
+ }
287
+ // --- Up ---
288
+ if ((events & PointerEventFlag.Up) !== 0) {
289
+ if (hit !== null) {
290
+ this._dispatchBubble(new InteractionEvent('pointerup', hit, pointer, x, y));
291
+ }
292
+ if (drag !== null) {
293
+ this._dispatchDirect(new InteractionEvent('dragend', drag.node, pointer, x, y), drag.node.onDragEnd);
294
+ this._endDrag(id);
295
+ }
296
+ }
297
+ // --- Tap ---
298
+ if ((events & PointerEventFlag.Tap) !== 0) {
299
+ if (hit !== null) {
300
+ this._dispatchBubble(new InteractionEvent('pointertap', hit, pointer, x, y));
301
+ }
302
+ }
303
+ // --- Cancel / Leave ---
304
+ if (isExitEvent) {
305
+ if (drag !== null) {
306
+ this._dispatchDirect(new InteractionEvent('dragend', drag.node, pointer, x, y), drag.node.onDragEnd);
307
+ this._endDrag(id);
308
+ }
309
+ else if (last !== null) {
310
+ this._dispatchBubble(new InteractionEvent('pointerout', last, pointer, x, y));
311
+ }
312
+ this._lastHit.delete(id);
313
+ }
314
+ }
315
+ _endDrag(pointerId) {
316
+ this._drags.delete(pointerId);
317
+ this._capturedPointers.delete(pointerId);
318
+ try {
319
+ this._app.canvas.releasePointerCapture(pointerId);
320
+ }
321
+ catch {
322
+ // Releasing an already-released pointer throws in some browsers; swallow it.
323
+ }
324
+ }
325
+ // ---------------------------------------------------------------------------
326
+ // Hit-testing
327
+ // ---------------------------------------------------------------------------
328
+ _hitTest(x, y) {
329
+ if (this._quadtree !== null) {
330
+ return this._hitTestIndexed(x, y);
331
+ }
332
+ const root = this._app.sceneManager.scene?.root;
333
+ if (!root) {
334
+ return null;
335
+ }
336
+ return this._hitTestNode(root, x, y);
337
+ }
338
+ _hitTestIndexed(x, y) {
339
+ const candidates = this._quadtreeQueryBuffer;
340
+ candidates.length = 0;
341
+ this._quadtree.queryPoint(x, y, candidates);
342
+ let bestOrder = -1;
343
+ let bestNode = null;
344
+ for (const candidate of candidates) {
345
+ const indexed = candidate.payload;
346
+ if (indexed.order > bestOrder && indexed.node.contains(x, y)) {
347
+ bestOrder = indexed.order;
348
+ bestNode = indexed.node;
349
+ }
350
+ }
351
+ return bestNode;
352
+ }
353
+ // Walk children in REVERSE order (top z-order first). Recurse into Container children even
354
+ // when the container itself isn't interactive (so children can be hit through a non-interactive parent).
355
+ // Return the FIRST (deepest, top-most) interactive node whose contains(x, y) returns true.
356
+ _hitTestNode(node, x, y) {
357
+ if (!node.visible) {
358
+ return null;
359
+ }
360
+ if (node instanceof Container) {
361
+ const children = node.children;
362
+ for (let i = children.length - 1; i >= 0; i--) {
363
+ const hit = this._hitTestNode(children[i], x, y);
364
+ if (hit) {
365
+ return hit;
366
+ }
367
+ }
368
+ }
369
+ if (node.interactive && node.contains(x, y)) {
370
+ return node;
371
+ }
372
+ return null;
373
+ }
374
+ // ---------------------------------------------------------------------------
375
+ // Persistent spatial index management
376
+ // ---------------------------------------------------------------------------
377
+ /**
378
+ * Register an interactive node: add it to the tracking set, create the
379
+ * quadtree if this is the first interactive node, and insert the node.
380
+ */
381
+ _registerNode(node) {
382
+ if (this._interactiveNodes.has(node)) {
383
+ return;
384
+ }
385
+ this._interactiveNodes.add(node);
386
+ // Lazy-init the quadtree on the first interactive node.
387
+ if (this._quadtree === null) {
388
+ this._quadtree = this._createQuadtree();
389
+ }
390
+ this._insertNode(node);
391
+ }
392
+ /**
393
+ * Unregister an interactive node: remove from the quadtree and tracking
394
+ * set. Dispose the quadtree when it becomes empty.
395
+ */
396
+ _unregisterNode(node) {
397
+ if (!this._interactiveNodes.has(node)) {
398
+ return;
399
+ }
400
+ this._interactiveNodes.delete(node);
401
+ this._staleNodes.delete(node);
402
+ const item = this._quadtreeItems.get(node);
403
+ if (item !== undefined && this._quadtree !== null) {
404
+ this._quadtree.remove(item);
405
+ }
406
+ this._quadtreeItems.delete(node);
407
+ if (this._interactiveNodes.size === 0 && this._quadtree !== null) {
408
+ this._quadtree.destroy();
409
+ this._quadtree = null;
410
+ this._quadtreeOrderCounter = 0;
411
+ }
412
+ }
413
+ /**
414
+ * Insert a single node into the quadtree (or mark it stale to be inserted
415
+ * at next flush if the quadtree is not yet ready).
416
+ */
417
+ _insertNode(node) {
418
+ if (this._quadtree === null) {
419
+ return;
420
+ }
421
+ const bounds = node.getBounds();
422
+ const item = {
423
+ bounds: new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height),
424
+ payload: { node, order: this._quadtreeOrderCounter++ },
425
+ };
426
+ this._quadtree.insert(item);
427
+ this._quadtreeItems.set(node, item);
428
+ }
429
+ /**
430
+ * Flush stale entries: remove each stale node's old quadtree entry and
431
+ * re-insert it with fresh bounds. Called at the start of update().
432
+ */
433
+ _flushStaleEntries() {
434
+ if (this._quadtree === null || this._staleNodes.size === 0) {
435
+ return;
436
+ }
437
+ for (const node of this._staleNodes) {
438
+ const oldItem = this._quadtreeItems.get(node);
439
+ if (oldItem !== undefined) {
440
+ this._quadtree.remove(oldItem);
441
+ oldItem.bounds.destroy();
442
+ }
443
+ this._quadtreeItems.delete(node);
444
+ // Re-insert with current bounds.
445
+ const bounds = node.getBounds();
446
+ const newItem = {
447
+ bounds: new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height),
448
+ payload: { node, order: oldItem?.payload.order ?? this._quadtreeOrderCounter++ },
449
+ };
450
+ this._quadtree.insert(newItem);
451
+ this._quadtreeItems.set(node, newItem);
452
+ }
453
+ this._staleNodes.clear();
454
+ }
455
+ /** Build a fresh Quadtree sized to encompass the canvas + current scene root. */
456
+ _createQuadtree() {
457
+ const canvas = this._app.canvas;
458
+ const bounds = new Rectangle(0, 0, canvas.width || 800, canvas.height || 600);
459
+ const root = this._app.sceneManager.scene?.root;
460
+ if (root) {
461
+ const rootBounds = root.getBounds();
462
+ const minX = Math.min(bounds.left, rootBounds.left);
463
+ const minY = Math.min(bounds.top, rootBounds.top);
464
+ const maxX = Math.max(bounds.right, rootBounds.right);
465
+ const maxY = Math.max(bounds.bottom, rootBounds.bottom);
466
+ bounds.set(minX, minY, maxX - minX, maxY - minY);
467
+ }
468
+ return new Quadtree(bounds);
469
+ }
470
+ /** Walk a subtree, calling `callback` for every RenderNode (including root). */
471
+ _walkSubtree(node, callback) {
472
+ callback(node);
473
+ if (node instanceof Container) {
474
+ for (const child of node.children) {
475
+ this._walkSubtree(child, callback);
476
+ }
477
+ }
478
+ }
479
+ // ---------------------------------------------------------------------------
480
+ // Dispatch helpers
481
+ // ---------------------------------------------------------------------------
482
+ _dispatchBubble(event) {
483
+ let current = event.target;
484
+ while (current !== null && !event.propagationStopped) {
485
+ event.currentTarget = current;
486
+ const signal = this._signalFor(event.type, current);
487
+ signal.dispatch(event);
488
+ if (event.propagationStopped) {
489
+ break;
490
+ }
491
+ // Walk up to interactive ancestor only (parent must opt in to receive bubble).
492
+ const parent = current.parentNode;
493
+ current = (parent !== null && parent.interactive) ? parent : null;
494
+ }
495
+ }
496
+ /** Dispatch an event directly on a single node without bubbling. */
497
+ _dispatchDirect(event, signal) {
498
+ event.currentTarget = event.target;
499
+ signal.dispatch(event);
500
+ }
501
+ _signalFor(type, node) {
502
+ switch (type) {
503
+ case 'pointerdown': return node.onPointerDown;
504
+ case 'pointerup': return node.onPointerUp;
505
+ case 'pointermove': return node.onPointerMove;
506
+ case 'pointerover': return node.onPointerOver;
507
+ case 'pointerout': return node.onPointerOut;
508
+ case 'pointertap': return node.onPointerTap;
509
+ case 'dragstart': return node.onDragStart;
510
+ case 'drag': return node.onDrag;
511
+ case 'dragend': return node.onDragEnd;
512
+ }
513
+ }
514
+ // ---------------------------------------------------------------------------
515
+ // Cursor
516
+ // ---------------------------------------------------------------------------
517
+ _setLastHit(id, node) {
518
+ if (node !== null) {
519
+ this._lastHit.set(id, node);
520
+ }
521
+ else {
522
+ this._lastHit.delete(id);
523
+ }
524
+ }
525
+ _updateCursor() {
526
+ let cursor = null;
527
+ for (const node of this._lastHit.values()) {
528
+ let n = node;
529
+ while (n !== null) {
530
+ if (n.cursor !== null) {
531
+ cursor = n.cursor;
532
+ break;
533
+ }
534
+ const p = n.parentNode;
535
+ n = p;
536
+ }
537
+ if (cursor !== null) {
538
+ break;
539
+ }
540
+ }
541
+ this._app.canvas.style.cursor = cursor ?? '';
542
+ }
543
+ }
544
+
545
+ export { InteractionManager };
546
+ //# sourceMappingURL=InteractionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InteractionManager.js","sources":["../../../../src/input/InteractionManager.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -17,3 +17,5 @@ export * from './ArcadeStickGamepadMapping';
17
17
  export * from './Input';
18
18
  export * from './InputManager';
19
19
  export * from './Pointer';
20
+ export * from './InteractionEvent';
21
+ export * from './InteractionManager';
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Lightweight module that holds the module-level InteractionManager pointer
3
+ * used by SceneNode / Container / RenderNode hooks.
4
+ *
5
+ * Kept in its own file to break the circular import chain:
6
+ * SceneNode ← InteractionManager ← Container ← RenderNode ← SceneNode
7
+ *
8
+ * By splitting the singleton out here, SceneNode/Container/RenderNode can
9
+ * import from this module while InteractionManager (which imports Container)
10
+ * remains free of a SceneNode ↔ InteractionManager cycle.
11
+ *
12
+ * @internal
13
+ */
14
+ import type { RenderNode } from '@/rendering/RenderNode';
15
+ export interface InteractionManagerHooks {
16
+ _notifyNodeAdded(node: RenderNode): void;
17
+ _notifyNodeRemoved(node: RenderNode): void;
18
+ _notifyInteractiveChanged(node: RenderNode, becameInteractive: boolean): void;
19
+ _notifyBoundsInvalidated(node: RenderNode): void;
20
+ }
21
+ /**
22
+ * Returns the currently-registered InteractionManager, or null if none is
23
+ * active. Called by RenderNode / Container / SceneNode hooks.
24
+ *
25
+ * @internal
26
+ */
27
+ export declare function _getCurrentInteractionManager(): InteractionManagerHooks | null;
28
+ /**
29
+ * Register the active InteractionManager. Called from the InteractionManager
30
+ * constructor. Last-constructed-wins (single-Application assumed).
31
+ *
32
+ * @internal
33
+ */
34
+ export declare function _setCurrentInteractionManager(manager: InteractionManagerHooks | null): void;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Lightweight module that holds the module-level InteractionManager pointer
3
+ * used by SceneNode / Container / RenderNode hooks.
4
+ *
5
+ * Kept in its own file to break the circular import chain:
6
+ * SceneNode ← InteractionManager ← Container ← RenderNode ← SceneNode
7
+ *
8
+ * By splitting the singleton out here, SceneNode/Container/RenderNode can
9
+ * import from this module while InteractionManager (which imports Container)
10
+ * remains free of a SceneNode ↔ InteractionManager cycle.
11
+ *
12
+ * @internal
13
+ */
14
+ let _currentManager = null;
15
+ /**
16
+ * Returns the currently-registered InteractionManager, or null if none is
17
+ * active. Called by RenderNode / Container / SceneNode hooks.
18
+ *
19
+ * @internal
20
+ */
21
+ function _getCurrentInteractionManager() {
22
+ return _currentManager;
23
+ }
24
+ /**
25
+ * Register the active InteractionManager. Called from the InteractionManager
26
+ * constructor. Last-constructed-wins (single-Application assumed).
27
+ *
28
+ * @internal
29
+ */
30
+ function _setCurrentInteractionManager(manager) {
31
+ _currentManager = manager;
32
+ }
33
+
34
+ export { _getCurrentInteractionManager, _setCurrentInteractionManager };
35
+ //# sourceMappingURL=interaction-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction-hooks.js","sources":["../../../../src/input/interaction-hooks.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;;;;;AAYG;AAWH,IAAI,eAAe,GAAmC,IAAI;AAE1D;;;;;AAKG;SACa,6BAA6B,GAAA;AACzC,IAAA,OAAO,eAAe;AAC1B;AAEA;;;;;AAKG;AACG,SAAU,6BAA6B,CAAC,OAAuC,EAAA;IACjF,eAAe,GAAG,OAAO;AAC7B;;;;"}