@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
@@ -5,7 +5,6 @@ export * from './Bounds';
5
5
  export * from './capabilities';
6
6
  export * from './Clock';
7
7
  export * from './Color';
8
- export * from './Quadtree';
9
8
  export * from './Scene';
10
9
  export * from './SceneManager';
11
10
  export * from './SceneNode';
@@ -0,0 +1,18 @@
1
+ import { DebugLayer } from './DebugLayer';
2
+ import type { DebugLayerViewMode } from './DebugLayer';
3
+ import type { Time } from '@/core/Time';
4
+ import type { RenderBackend } from '@/rendering/RenderBackend';
5
+ import type { Application } from '@/core/Application';
6
+ /**
7
+ * Debug layer that draws a bounding-box outline around every visible
8
+ * RenderNode in the scene. Colours cycle by zIndex (HSL hue). World-space.
9
+ */
10
+ export declare class BoundingBoxesLayer extends DebugLayer {
11
+ private _graphics;
12
+ constructor(app: Application);
13
+ get viewMode(): DebugLayerViewMode;
14
+ update(_delta: Time): void;
15
+ render(backend: RenderBackend): void;
16
+ destroy(): void;
17
+ private _walkNode;
18
+ }
@@ -0,0 +1,128 @@
1
+ import { DebugLayer } from './DebugLayer.js';
2
+ import { Graphics } from '../rendering/primitives/Graphics.js';
3
+ import { Color } from '../core/Color.js';
4
+ import '../math/Size.js';
5
+ import '../core/Time.js';
6
+ import '../core/SceneNode.js';
7
+ import '../math/Rectangle.js';
8
+ import '../rendering/types.js';
9
+ import '../rendering/View.js';
10
+ import '../rendering/texture/RenderTexture.js';
11
+
12
+ // ---------------------------------------------------------------------------
13
+ // HSL → RGB helper
14
+ // ---------------------------------------------------------------------------
15
+ /**
16
+ * Convert HSL (hue 0-360, saturation 0-1, lightness 0-1) to a Color instance.
17
+ * Returns an RGB Color (alpha = alpha parameter).
18
+ */
19
+ function hslToColor(h, s, l, alpha) {
20
+ const c = (1 - Math.abs(2 * l - 1)) * s;
21
+ const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
22
+ const m = l - c / 2;
23
+ let r = 0;
24
+ let g = 0;
25
+ let b = 0;
26
+ if (h < 60) {
27
+ r = c;
28
+ g = x;
29
+ b = 0;
30
+ }
31
+ else if (h < 120) {
32
+ r = x;
33
+ g = c;
34
+ b = 0;
35
+ }
36
+ else if (h < 180) {
37
+ r = 0;
38
+ g = c;
39
+ b = x;
40
+ }
41
+ else if (h < 240) {
42
+ r = 0;
43
+ g = x;
44
+ b = c;
45
+ }
46
+ else if (h < 300) {
47
+ r = x;
48
+ g = 0;
49
+ b = c;
50
+ }
51
+ else {
52
+ r = c;
53
+ g = 0;
54
+ b = x;
55
+ }
56
+ return new Color(r + m, g + m, b + m, alpha);
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ /**
60
+ * Debug layer that draws a bounding-box outline around every visible
61
+ * RenderNode in the scene. Colours cycle by zIndex (HSL hue). World-space.
62
+ */
63
+ class BoundingBoxesLayer extends DebugLayer {
64
+ _graphics = null;
65
+ constructor(app) {
66
+ super(app);
67
+ }
68
+ get viewMode() {
69
+ return 'world';
70
+ }
71
+ update(_delta) {
72
+ // State is built in render() each frame; nothing to pre-compute here.
73
+ }
74
+ render(backend) {
75
+ const root = this._app.sceneManager.scene?.root;
76
+ if (!root) {
77
+ return;
78
+ }
79
+ if (this._graphics === null) {
80
+ this._graphics = new Graphics();
81
+ }
82
+ const gfx = this._graphics;
83
+ gfx.clear();
84
+ gfx.lineWidth = 1;
85
+ this._walkNode(root, gfx);
86
+ gfx.render(backend);
87
+ }
88
+ destroy() {
89
+ if (this._graphics !== null) {
90
+ this._graphics.destroy();
91
+ this._graphics = null;
92
+ }
93
+ }
94
+ // -----------------------------------------------------------------------
95
+ _walkNode(node, gfx) {
96
+ if (!node.visible) {
97
+ return;
98
+ }
99
+ const bounds = node.getBounds();
100
+ // Skip zero-area bounds (defensive).
101
+ if (bounds.width > 0 && bounds.height > 0) {
102
+ const hue = ((node.zIndex * 30) % 360 + 360) % 360;
103
+ const color = hslToColor(hue, 0.7, 0.5, 0.7);
104
+ gfx.lineColor = color;
105
+ // Draw the rectangle outline as four line segments.
106
+ const l = bounds.left;
107
+ const t = bounds.top;
108
+ const r = bounds.right;
109
+ const bo = bounds.bottom;
110
+ gfx.moveTo(l, t);
111
+ gfx.lineTo(r, t);
112
+ gfx.lineTo(r, bo);
113
+ gfx.lineTo(l, bo);
114
+ gfx.lineTo(l, t);
115
+ color.destroy();
116
+ }
117
+ // Recurse into Container children.
118
+ const container = node;
119
+ if (Array.isArray(container.children)) {
120
+ for (const child of container.children) {
121
+ this._walkNode(child, gfx);
122
+ }
123
+ }
124
+ }
125
+ }
126
+
127
+ export { BoundingBoxesLayer };
128
+ //# sourceMappingURL=BoundingBoxesLayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoundingBoxesLayer.js","sources":["../../../../src/debug/BoundingBoxesLayer.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;AAUA;AACA;AACA;AAEA;;;AAGG;AACH,SAAS,UAAU,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,KAAa,EAAA;AAC9D,IAAA,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IACvC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChD,IAAA,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;IAEnB,IAAI,CAAC,GAAG,CAAC;IACT,IAAI,CAAC,GAAG,CAAC;IACT,IAAI,CAAC,GAAG,CAAC;AAET,IAAA,IAAI,CAAC,GAAG,EAAE,EAAQ;QAAE,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC;IAAE;AACpC,SAAA,IAAI,CAAC,GAAG,GAAG,EAAE;QAAE,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC;IAAE;AACpC,SAAA,IAAI,CAAC,GAAG,GAAG,EAAE;QAAE,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC;IAAE;AACpC,SAAA,IAAI,CAAC,GAAG,GAAG,EAAE;QAAE,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC;IAAE;AACpC,SAAA,IAAI,CAAC,GAAG,GAAG,EAAE;QAAE,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC;IAAE;SACvB;QAAE,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC;IAAE;AAEzC,IAAA,OAAO,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;AAChD;AAEA;AAEA;;;AAGG;AACG,MAAO,kBAAmB,SAAQ,UAAU,CAAA;IACtC,SAAS,GAAoB,IAAI;AAEzC,IAAA,WAAA,CAAmB,GAAgB,EAAA;QAC/B,KAAK,CAAC,GAAG,CAAC;IACd;AAEA,IAAA,IAAoB,QAAQ,GAAA;AACxB,QAAA,OAAO,OAAO;IAClB;AAEgB,IAAA,MAAM,CAAC,MAAY,EAAA;;IAEnC;AAEgB,IAAA,MAAM,CAAC,OAAsB,EAAA;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI;QAE/C,IAAI,CAAC,IAAI,EAAE;YACP;QACJ;AAEA,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AACzB,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,QAAQ,EAAE;QACnC;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS;QAE1B,GAAG,CAAC,KAAK,EAAE;AACX,QAAA,GAAG,CAAC,SAAS,GAAG,CAAC;AAEjB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAkB,EAAE,GAAG,CAAC;AAEvC,QAAA,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;IACvB;IAEgB,OAAO,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AACzB,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AACxB,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACzB;IACJ;;IAIQ,SAAS,CAAC,IAAgB,EAAE,GAAa,EAAA;AAC7C,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACf;QACJ;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE;;AAG/B,QAAA,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACvC,YAAA,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG;AAClD,YAAA,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AAE5C,YAAA,GAAG,CAAC,SAAS,GAAG,KAAK;;AAGrB,YAAA,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI;AACrB,YAAA,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG;AACpB,YAAA,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK;AACtB,YAAA,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM;AAExB,YAAA,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;AAChB,YAAA,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;AAChB,YAAA,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC;AACjB,YAAA,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC;AACjB,YAAA,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;YAEhB,KAAK,CAAC,OAAO,EAAE;QACnB;;QAGA,MAAM,SAAS,GAAG,IAAgD;QAElE,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;AACnC,YAAA,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,QAAQ,EAAE;AACpC,gBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC;YAC9B;QACJ;IACJ;AACH;;;;"}
@@ -0,0 +1,29 @@
1
+ import type { Time } from '@/core/Time';
2
+ import type { RenderBackend } from '@/rendering/RenderBackend';
3
+ import type { Application } from '@/core/Application';
4
+ export type DebugLayerViewMode = 'screen' | 'world';
5
+ /**
6
+ * Base class for a debug layer. Subclasses build a visual
7
+ * (text, outlines, etc.) that the DebugOverlay renders each frame when
8
+ * `visible` is true. Tree-shake-able via the @codexo/exojs/debug subpath.
9
+ */
10
+ export declare abstract class DebugLayer {
11
+ protected readonly _app: Application;
12
+ visible: boolean;
13
+ constructor(_app: Application);
14
+ /**
15
+ * Whether this layer renders in the scene's world-space view or in a
16
+ * screen-space (canvas-pixel) view. Defaults to 'screen'. Subclasses
17
+ * override to return 'world' when rendering at actual scene positions.
18
+ */
19
+ get viewMode(): DebugLayerViewMode;
20
+ /** Update internal state from this frame's data. Called only when visible. */
21
+ abstract update(delta: Time): void;
22
+ /**
23
+ * Render the layer's content using the backend. The DebugOverlay manages
24
+ * the active view based on this layer's viewMode; restore is handled by the overlay.
25
+ * Called only when visible.
26
+ */
27
+ abstract render(backend: RenderBackend): void;
28
+ destroy(): void;
29
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Base class for a debug layer. Subclasses build a visual
3
+ * (text, outlines, etc.) that the DebugOverlay renders each frame when
4
+ * `visible` is true. Tree-shake-able via the @codexo/exojs/debug subpath.
5
+ */
6
+ class DebugLayer {
7
+ _app;
8
+ visible = false;
9
+ constructor(_app) {
10
+ this._app = _app;
11
+ }
12
+ /**
13
+ * Whether this layer renders in the scene's world-space view or in a
14
+ * screen-space (canvas-pixel) view. Defaults to 'screen'. Subclasses
15
+ * override to return 'world' when rendering at actual scene positions.
16
+ */
17
+ get viewMode() {
18
+ return 'screen';
19
+ }
20
+ destroy() {
21
+ // Default: nothing. Subclasses override to release Container subtrees etc.
22
+ }
23
+ }
24
+
25
+ export { DebugLayer };
26
+ //# sourceMappingURL=DebugLayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugLayer.js","sources":["../../../../src/debug/DebugLayer.ts"],"sourcesContent":[null],"names":[],"mappings":"AAMA;;;;AAIG;MACmB,UAAU,CAAA;AAGU,IAAA,IAAA;IAF/B,OAAO,GAAY,KAAK;AAE/B,IAAA,WAAA,CAAsC,IAAiB,EAAA;QAAjB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAgB;AAE1D;;;;AAIG;AACH,IAAA,IAAW,QAAQ,GAAA;AACf,QAAA,OAAO,QAAQ;IACnB;IAYO,OAAO,GAAA;;IAEd;AACH;;;;"}
@@ -0,0 +1,48 @@
1
+ import { PerformanceLayer } from './PerformanceLayer';
2
+ import { BoundingBoxesLayer } from './BoundingBoxesLayer';
3
+ import { HitTestLayer } from './HitTestLayer';
4
+ import { PointerStackLayer } from './PointerStackLayer';
5
+ import type { Application } from '@/core/Application';
6
+ export interface DebugLayers {
7
+ readonly performance: PerformanceLayer;
8
+ readonly boundingBoxes: BoundingBoxesLayer;
9
+ readonly hitTest: HitTestLayer;
10
+ readonly pointerStack: PointerStackLayer;
11
+ }
12
+ /**
13
+ * Canvas-native debug overlay. Instantiate AFTER Application is constructed:
14
+ *
15
+ * import { DebugOverlay } from '@codexo/exojs/debug';
16
+ * const debug = new DebugOverlay(app);
17
+ * debug.layers.performance.visible = true; // or press F1
18
+ *
19
+ * The overlay subscribes to `app.onFrame` and renders its visible layers.
20
+ * World-space layers render first (under text panels) in the scene view;
21
+ * screen-space layers then render in the overlay's pixel-space view.
22
+ *
23
+ * Keybindings (while canvas has focus):
24
+ * F1 — toggle Performance layer
25
+ * F2 — toggle BoundingBoxes layer
26
+ * F3 — toggle HitTest layer
27
+ * F4 — toggle PointerStack layer
28
+ *
29
+ * NOTE: F-keys only fire while the canvas has focus (engine convention).
30
+ *
31
+ * The master `visible` switch suppresses all layer rendering when false
32
+ * without changing individual layer visibility flags.
33
+ */
34
+ export declare class DebugOverlay {
35
+ /** Master visibility switch. When false, no layers render regardless of their individual flags. */
36
+ visible: boolean;
37
+ readonly layers: DebugLayers;
38
+ private readonly _app;
39
+ private readonly _view;
40
+ private readonly _onFrameHandler;
41
+ private readonly _onKeyDownHandler;
42
+ private readonly _onResizeHandler;
43
+ constructor(app: Application);
44
+ destroy(): void;
45
+ private _onResize;
46
+ private _onFrame;
47
+ private _onKeyDown;
48
+ }
@@ -0,0 +1,117 @@
1
+ import { View } from '../rendering/View.js';
2
+ import { Keyboard } from '../input/types.js';
3
+ import { PerformanceLayer } from './PerformanceLayer.js';
4
+ import { BoundingBoxesLayer } from './BoundingBoxesLayer.js';
5
+ import { HitTestLayer } from './HitTestLayer.js';
6
+ import { PointerStackLayer } from './PointerStackLayer.js';
7
+
8
+ /**
9
+ * Canvas-native debug overlay. Instantiate AFTER Application is constructed:
10
+ *
11
+ * import { DebugOverlay } from '@codexo/exojs/debug';
12
+ * const debug = new DebugOverlay(app);
13
+ * debug.layers.performance.visible = true; // or press F1
14
+ *
15
+ * The overlay subscribes to `app.onFrame` and renders its visible layers.
16
+ * World-space layers render first (under text panels) in the scene view;
17
+ * screen-space layers then render in the overlay's pixel-space view.
18
+ *
19
+ * Keybindings (while canvas has focus):
20
+ * F1 — toggle Performance layer
21
+ * F2 — toggle BoundingBoxes layer
22
+ * F3 — toggle HitTest layer
23
+ * F4 — toggle PointerStack layer
24
+ *
25
+ * NOTE: F-keys only fire while the canvas has focus (engine convention).
26
+ *
27
+ * The master `visible` switch suppresses all layer rendering when false
28
+ * without changing individual layer visibility flags.
29
+ */
30
+ class DebugOverlay {
31
+ /** Master visibility switch. When false, no layers render regardless of their individual flags. */
32
+ visible = true;
33
+ layers;
34
+ _app;
35
+ _view;
36
+ _onFrameHandler;
37
+ _onKeyDownHandler;
38
+ _onResizeHandler;
39
+ constructor(app) {
40
+ this._app = app;
41
+ this._view = new View(app.canvas.width / 2, app.canvas.height / 2, app.canvas.width, app.canvas.height);
42
+ this.layers = {
43
+ performance: new PerformanceLayer(app),
44
+ boundingBoxes: new BoundingBoxesLayer(app),
45
+ hitTest: new HitTestLayer(app),
46
+ pointerStack: new PointerStackLayer(app),
47
+ };
48
+ this._onFrameHandler = this._onFrame.bind(this);
49
+ this._onKeyDownHandler = this._onKeyDown.bind(this);
50
+ this._onResizeHandler = this._onResize.bind(this);
51
+ app.onFrame.add(this._onFrameHandler);
52
+ app.inputManager.onKeyDown.add(this._onKeyDownHandler);
53
+ app.onResize.add(this._onResizeHandler);
54
+ }
55
+ destroy() {
56
+ this._app.onFrame.remove(this._onFrameHandler);
57
+ this._app.inputManager.onKeyDown.remove(this._onKeyDownHandler);
58
+ this._app.onResize.remove(this._onResizeHandler);
59
+ for (const layer of Object.values(this.layers)) {
60
+ layer.destroy();
61
+ }
62
+ this._view.destroy();
63
+ }
64
+ _onResize(width, height) {
65
+ this._view.resize(width, height);
66
+ this._view.setCenter(width / 2, height / 2);
67
+ }
68
+ _onFrame(delta) {
69
+ if (!this.visible)
70
+ return;
71
+ const layers = Object.values(this.layers);
72
+ const visibleLayers = layers.filter(l => l.visible);
73
+ if (visibleLayers.length === 0)
74
+ return;
75
+ const backend = this._app.backend;
76
+ const sceneView = backend.view; // capture scene's current view
77
+ // --- World-space layers first (render under screen-space text panels) ---
78
+ const worldLayers = visibleLayers.filter(l => l.viewMode === 'world');
79
+ for (const layer of worldLayers) {
80
+ layer.update(delta);
81
+ layer.render(backend);
82
+ }
83
+ // --- Screen-space layers: swap to overlay's pixel view ---
84
+ const screenLayers = visibleLayers.filter(l => l.viewMode === 'screen');
85
+ if (screenLayers.length > 0) {
86
+ backend.setView(this._view);
87
+ try {
88
+ for (const layer of screenLayers) {
89
+ layer.update(delta);
90
+ layer.render(backend);
91
+ }
92
+ }
93
+ finally {
94
+ backend.setView(sceneView);
95
+ }
96
+ }
97
+ }
98
+ _onKeyDown(channel) {
99
+ switch (channel) {
100
+ case Keyboard.F1:
101
+ this.layers.performance.visible = !this.layers.performance.visible;
102
+ break;
103
+ case Keyboard.F2:
104
+ this.layers.boundingBoxes.visible = !this.layers.boundingBoxes.visible;
105
+ break;
106
+ case Keyboard.F3:
107
+ this.layers.hitTest.visible = !this.layers.hitTest.visible;
108
+ break;
109
+ case Keyboard.F4:
110
+ this.layers.pointerStack.visible = !this.layers.pointerStack.visible;
111
+ break;
112
+ }
113
+ }
114
+ }
115
+
116
+ export { DebugOverlay };
117
+ //# sourceMappingURL=DebugOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugOverlay.js","sources":["../../../../src/debug/DebugOverlay.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;AAiBA;;;;;;;;;;;;;;;;;;;;;AAqBG;MACU,YAAY,CAAA;;IAEd,OAAO,GAAY,IAAI;AAEd,IAAA,MAAM;AAEL,IAAA,IAAI;AACJ,IAAA,KAAK;AACL,IAAA,eAAe;AACf,IAAA,iBAAiB;AACjB,IAAA,gBAAgB;AAEjC,IAAA,WAAA,CAAmB,GAAgB,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG;AACf,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAEvG,IAAI,CAAC,MAAM,GAAG;AACV,YAAA,WAAW,EAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC;AACvC,YAAA,aAAa,EAAE,IAAI,kBAAkB,CAAC,GAAG,CAAC;AAC1C,YAAA,OAAO,EAAQ,IAAI,YAAY,CAAC,GAAG,CAAC;AACpC,YAAA,YAAY,EAAG,IAAI,iBAAiB,CAAC,GAAG,CAAC;SAC5C;QAED,IAAI,CAAC,eAAe,GAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAChD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QACnD,IAAI,CAAC,gBAAgB,GAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAElD,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;QACrC,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC;QACtD,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAC3C;IAEO,OAAO,GAAA;QACV,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;AAC9C,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAEhD,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAsB,EAAE;YACjE,KAAK,CAAC,OAAO,EAAE;QACnB;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;IACxB;IAEQ,SAAS,CAAC,KAAa,EAAE,MAAc,EAAA;QAC3C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;AAChC,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;IAC/C;AAEQ,IAAA,QAAQ,CAAC,KAAW,EAAA;QACxB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QAEnB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAsB;AAC9D,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;AAEnD,QAAA,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE;AAEhC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO;AACjC,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;;AAG/B,QAAA,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;AAErE,QAAA,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE;AAC7B,YAAA,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;AACnB,YAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;QACzB;;AAGA,QAAA,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;AAEvE,QAAA,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AACzB,YAAA,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AAE3B,YAAA,IAAI;AACA,gBAAA,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE;AAC9B,oBAAA,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;AACnB,oBAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;gBACzB;YACJ;oBAAU;AACN,gBAAA,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YAC9B;QACJ;IACJ;AAEQ,IAAA,UAAU,CAAC,OAAe,EAAA;QAC9B,QAAQ,OAAO;YACX,KAAK,QAAQ,CAAC,EAAE;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,GAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO;gBAAG;YACxF,KAAK,QAAQ,CAAC,EAAE;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO;gBAAE;YAC1F,KAAK,QAAQ,CAAC,EAAE;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,GAAS,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO;gBAAQ;YAC1F,KAAK,QAAQ,CAAC,EAAE;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,GAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO;gBAAG;;IAElG;AACH;;;;"}
@@ -0,0 +1,23 @@
1
+ import { DebugLayer } from './DebugLayer';
2
+ import type { DebugLayerViewMode } from './DebugLayer';
3
+ import type { Time } from '@/core/Time';
4
+ import type { RenderBackend } from '@/rendering/RenderBackend';
5
+ import type { Application } from '@/core/Application';
6
+ /**
7
+ * Debug layer that draws outlines around interactive scene nodes.
8
+ * - Magenta: interactive but idle.
9
+ * - Yellow: currently hovered.
10
+ * - Cyan: pointer-captured (drag in progress).
11
+ * - Faint gray quadrant outlines when the spatial index is active (i.e.
12
+ * at least one interactive node is present in the scene).
13
+ * World-space.
14
+ */
15
+ export declare class HitTestLayer extends DebugLayer {
16
+ private _graphics;
17
+ constructor(app: Application);
18
+ get viewMode(): DebugLayerViewMode;
19
+ update(_delta: Time): void;
20
+ render(backend: RenderBackend): void;
21
+ destroy(): void;
22
+ private _walkNode;
23
+ }
@@ -0,0 +1,109 @@
1
+ import { DebugLayer } from './DebugLayer.js';
2
+ import { Graphics } from '../rendering/primitives/Graphics.js';
3
+ import { Color } from '../core/Color.js';
4
+ import '../math/Size.js';
5
+ import '../core/Time.js';
6
+ import '../core/SceneNode.js';
7
+ import '../math/Rectangle.js';
8
+ import '../rendering/types.js';
9
+ import '../rendering/View.js';
10
+ import '../rendering/texture/RenderTexture.js';
11
+
12
+ // Color constants (created once, reused).
13
+ const colorIdle = new Color(1, 0, 1, 0.6); // magenta
14
+ const colorHovered = new Color(1, 1, 0, 0.9); // yellow
15
+ const colorCaptured = new Color(0, 1, 1, 0.9); // cyan
16
+ const colorQuadrant = new Color(0.5, 0.5, 0.5, 0.3); // faint gray
17
+ /**
18
+ * Debug layer that draws outlines around interactive scene nodes.
19
+ * - Magenta: interactive but idle.
20
+ * - Yellow: currently hovered.
21
+ * - Cyan: pointer-captured (drag in progress).
22
+ * - Faint gray quadrant outlines when the spatial index is active (i.e.
23
+ * at least one interactive node is present in the scene).
24
+ * World-space.
25
+ */
26
+ class HitTestLayer extends DebugLayer {
27
+ _graphics = null;
28
+ constructor(app) {
29
+ super(app);
30
+ }
31
+ get viewMode() {
32
+ return 'world';
33
+ }
34
+ update(_delta) {
35
+ // Nothing to pre-compute; all state is read in render().
36
+ }
37
+ render(backend) {
38
+ const root = this._app.sceneManager.scene?.root;
39
+ if (!root) {
40
+ return;
41
+ }
42
+ if (this._graphics === null) {
43
+ this._graphics = new Graphics();
44
+ }
45
+ const gfx = this._graphics;
46
+ gfx.clear();
47
+ gfx.lineWidth = 1;
48
+ // Determine hovered and captured sets for color-coding.
49
+ const interaction = this._app.interaction;
50
+ const hoveredNode = interaction.getHoveredNode();
51
+ const capturedNodes = new Set(interaction.getCapturedNodes());
52
+ // Walk scene and draw outlines for interactive nodes.
53
+ this._walkNode(root, gfx, hoveredNode, capturedNodes);
54
+ // Draw quadtree regions when the spatial index is active.
55
+ const quadtree = interaction._getDebugQuadtree();
56
+ if (quadtree !== null) {
57
+ gfx.lineColor = colorQuadrant;
58
+ quadtree._walkBounds((rect) => {
59
+ gfx.moveTo(rect.left, rect.top);
60
+ gfx.lineTo(rect.right, rect.top);
61
+ gfx.lineTo(rect.right, rect.bottom);
62
+ gfx.lineTo(rect.left, rect.bottom);
63
+ gfx.lineTo(rect.left, rect.top);
64
+ });
65
+ }
66
+ gfx.render(backend);
67
+ }
68
+ destroy() {
69
+ if (this._graphics !== null) {
70
+ this._graphics.destroy();
71
+ this._graphics = null;
72
+ }
73
+ }
74
+ // -----------------------------------------------------------------------
75
+ _walkNode(node, gfx, hovered, captured) {
76
+ if (!node.visible) {
77
+ return;
78
+ }
79
+ if (node.interactive) {
80
+ const bounds = node.getBounds();
81
+ if (bounds.width > 0 && bounds.height > 0) {
82
+ if (captured.has(node)) {
83
+ gfx.lineColor = colorCaptured;
84
+ }
85
+ else if (node === hovered) {
86
+ gfx.lineColor = colorHovered;
87
+ }
88
+ else {
89
+ gfx.lineColor = colorIdle;
90
+ }
91
+ gfx.moveTo(bounds.left, bounds.top);
92
+ gfx.lineTo(bounds.right, bounds.top);
93
+ gfx.lineTo(bounds.right, bounds.bottom);
94
+ gfx.lineTo(bounds.left, bounds.bottom);
95
+ gfx.lineTo(bounds.left, bounds.top);
96
+ }
97
+ }
98
+ // Recurse into Container children.
99
+ const container = node;
100
+ if (Array.isArray(container.children)) {
101
+ for (const child of container.children) {
102
+ this._walkNode(child, gfx, hovered, captured);
103
+ }
104
+ }
105
+ }
106
+ }
107
+
108
+ export { HitTestLayer };
109
+ //# sourceMappingURL=HitTestLayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HitTestLayer.js","sources":["../../../../src/debug/HitTestLayer.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { DebugLayer } from './DebugLayer';
2
+ import type { Time } from '@/core/Time';
3
+ import type { RenderBackend } from '@/rendering/RenderBackend';
4
+ import type { Application } from '@/core/Application';
5
+ export declare class PerformanceLayer extends DebugLayer {
6
+ private readonly _fpsSamples;
7
+ private _fpsSampleIndex;
8
+ private readonly _sparkSamples;
9
+ private _sparkSampleIndex;
10
+ private _root;
11
+ private _textFps;
12
+ private _textFrame;
13
+ private _textDraws;
14
+ private _textNodes;
15
+ private _sparkline;
16
+ constructor(app: Application);
17
+ update(delta: Time): void;
18
+ render(backend: RenderBackend): void;
19
+ destroy(): void;
20
+ private _build;
21
+ }