@codexo/exojs 0.4.0 → 0.6.2

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 (151) hide show
  1. package/CHANGELOG.md +499 -163
  2. package/README.md +156 -141
  3. package/dist/esm/audio/AudioAnalyser.d.ts +0 -1
  4. package/dist/esm/audio/AudioAnalyser.js +0 -2
  5. package/dist/esm/audio/AudioAnalyser.js.map +1 -1
  6. package/dist/esm/core/Application.d.ts +4 -4
  7. package/dist/esm/core/Application.js +19 -19
  8. package/dist/esm/core/Application.js.map +1 -1
  9. package/dist/esm/core/Scene.d.ts +59 -24
  10. package/dist/esm/core/Scene.js +60 -18
  11. package/dist/esm/core/Scene.js.map +1 -1
  12. package/dist/esm/core/SceneManager.js +15 -9
  13. package/dist/esm/core/SceneManager.js.map +1 -1
  14. package/dist/esm/core/SceneNode.d.ts +45 -5
  15. package/dist/esm/core/SceneNode.js +136 -7
  16. package/dist/esm/core/SceneNode.js.map +1 -1
  17. package/dist/esm/index.js +6 -4
  18. package/dist/esm/index.js.map +1 -1
  19. package/dist/esm/math/index.d.ts +0 -1
  20. package/dist/esm/rendering/CallbackRenderPass.d.ts +3 -3
  21. package/dist/esm/rendering/CallbackRenderPass.js +2 -2
  22. package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
  23. package/dist/esm/rendering/Container.d.ts +10 -11
  24. package/dist/esm/rendering/Container.js +5 -5
  25. package/dist/esm/rendering/Container.js.map +1 -1
  26. package/dist/esm/rendering/Drawable.d.ts +2 -2
  27. package/dist/esm/rendering/Drawable.js +5 -5
  28. package/dist/esm/rendering/Drawable.js.map +1 -1
  29. package/dist/esm/rendering/{SceneRenderRuntime.d.ts → RenderBackend.d.ts} +21 -3
  30. package/dist/esm/rendering/RenderNode.d.ts +41 -5
  31. package/dist/esm/rendering/RenderNode.js +89 -24
  32. package/dist/esm/rendering/RenderNode.js.map +1 -1
  33. package/dist/esm/rendering/RenderPass.d.ts +2 -2
  34. package/dist/esm/rendering/RenderTargetPass.d.ts +3 -3
  35. package/dist/esm/rendering/RenderTargetPass.js +9 -9
  36. package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
  37. package/dist/esm/rendering/Renderer.d.ts +3 -3
  38. package/dist/esm/rendering/RendererRegistry.d.ts +13 -7
  39. package/dist/esm/rendering/RendererRegistry.js +18 -10
  40. package/dist/esm/rendering/RendererRegistry.js.map +1 -1
  41. package/dist/esm/rendering/filters/BlurFilter.d.ts +2 -2
  42. package/dist/esm/rendering/filters/BlurFilter.js +5 -5
  43. package/dist/esm/rendering/filters/BlurFilter.js.map +1 -1
  44. package/dist/esm/rendering/filters/ColorFilter.d.ts +2 -2
  45. package/dist/esm/rendering/filters/ColorFilter.js +3 -3
  46. package/dist/esm/rendering/filters/ColorFilter.js.map +1 -1
  47. package/dist/esm/rendering/filters/Filter.d.ts +2 -2
  48. package/dist/esm/rendering/index.d.ts +9 -6
  49. package/dist/esm/rendering/mesh/Mesh.d.ts +69 -0
  50. package/dist/esm/rendering/mesh/Mesh.js +114 -0
  51. package/dist/esm/rendering/mesh/Mesh.js.map +1 -0
  52. package/dist/esm/rendering/primitives/Graphics.d.ts +3 -3
  53. package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
  54. package/dist/esm/rendering/shader/Shader.d.ts +3 -3
  55. package/dist/esm/rendering/shader/Shader.js +10 -10
  56. package/dist/esm/rendering/text/Text.d.ts +2 -2
  57. package/dist/esm/rendering/text/Text.js +2 -2
  58. package/dist/esm/rendering/text/Text.js.map +1 -1
  59. package/dist/esm/rendering/texture/Sampler.d.ts +0 -3
  60. package/dist/esm/rendering/texture/Sampler.js +5 -7
  61. package/dist/esm/rendering/texture/Sampler.js.map +1 -1
  62. package/dist/esm/rendering/types.d.ts +4 -0
  63. package/dist/esm/rendering/types.js +4 -0
  64. package/dist/esm/rendering/types.js.map +1 -1
  65. package/dist/esm/rendering/video/Video.d.ts +2 -2
  66. package/dist/esm/rendering/video/Video.js +2 -2
  67. package/dist/esm/rendering/video/Video.js.map +1 -1
  68. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.d.ts +2 -2
  69. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js +35 -11
  70. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js.map +1 -1
  71. package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.d.ts +13 -13
  72. package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js +20 -20
  73. package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js.map +1 -1
  74. package/dist/esm/rendering/webgl2/{WebGl2RenderManager.d.ts → WebGl2Backend.d.ts} +15 -12
  75. package/dist/esm/rendering/webgl2/{WebGl2RenderManager.js → WebGl2Backend.js} +63 -38
  76. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -0
  77. package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.d.ts +31 -0
  78. package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js +186 -0
  79. package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js.map +1 -0
  80. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +27 -0
  81. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +242 -0
  82. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -0
  83. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.d.ts +38 -7
  84. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js +281 -90
  85. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js.map +1 -1
  86. package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.d.ts +2 -2
  87. package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.js +15 -10
  88. package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.js.map +1 -1
  89. package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js +12 -0
  90. package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js.map +1 -1
  91. package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.d.ts +2 -0
  92. package/dist/esm/rendering/webgl2/{WebGl2ShaderRuntime.js → WebGl2ShaderProgram.js} +58 -18
  93. package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.js.map +1 -0
  94. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +26 -7
  95. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +260 -62
  96. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
  97. package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.d.ts +24 -1
  98. package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.js +6 -2
  99. package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.js.map +1 -1
  100. package/dist/esm/rendering/webgl2/glsl/mask-compose.frag.js +4 -0
  101. package/dist/esm/rendering/webgl2/glsl/mask-compose.frag.js.map +1 -0
  102. package/dist/esm/rendering/webgl2/glsl/mask-compose.vert.js +4 -0
  103. package/dist/esm/rendering/webgl2/glsl/mask-compose.vert.js.map +1 -0
  104. package/dist/esm/rendering/webgl2/glsl/mesh.frag.js +4 -0
  105. package/dist/esm/rendering/webgl2/glsl/mesh.frag.js.map +1 -0
  106. package/dist/esm/rendering/webgl2/glsl/mesh.vert.js +4 -0
  107. package/dist/esm/rendering/webgl2/glsl/mesh.vert.js.map +1 -0
  108. package/dist/esm/rendering/webgl2/glsl/particle.vert.js +1 -1
  109. package/dist/esm/rendering/webgl2/glsl/sprite.frag.js +1 -1
  110. package/dist/esm/rendering/webgl2/glsl/sprite.vert.js +1 -1
  111. package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.d.ts +9 -9
  112. package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js +18 -18
  113. package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js.map +1 -1
  114. package/dist/esm/rendering/webgpu/{WebGpuRenderManager.d.ts → WebGpuBackend.d.ts} +17 -14
  115. package/dist/esm/rendering/webgpu/{WebGpuRenderManager.js → WebGpuBackend.js} +77 -40
  116. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -0
  117. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.d.ts +37 -0
  118. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +279 -0
  119. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -0
  120. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +40 -0
  121. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +439 -0
  122. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -0
  123. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.d.ts +2 -3
  124. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +65 -82
  125. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
  126. package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.d.ts +2 -3
  127. package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.js +24 -25
  128. package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.js.map +1 -1
  129. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +28 -13
  130. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +410 -382
  131. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
  132. package/dist/esm/resources/Loader.js +5 -3
  133. package/dist/esm/resources/Loader.js.map +1 -1
  134. package/dist/exo.esm.js +3574 -1696
  135. package/dist/exo.esm.js.map +1 -1
  136. package/package.json +20 -11
  137. package/dist/esm/math/Transformable.d.ts +0 -47
  138. package/dist/esm/math/Transformable.js +0 -140
  139. package/dist/esm/math/Transformable.js.map +0 -1
  140. package/dist/esm/rendering/webgl2/WebGl2RenderManager.js.map +0 -1
  141. package/dist/esm/rendering/webgl2/WebGl2RendererRuntime.d.ts +0 -15
  142. package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.d.ts +0 -2
  143. package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.js.map +0 -1
  144. package/dist/esm/rendering/webgpu/WebGpuRenderManager.js.map +0 -1
  145. package/dist/esm/rendering/webgpu/WebGpuRendererRuntime.d.ts +0 -8
  146. package/dist/exo.esm.min.js +0 -2
  147. package/dist/exo.esm.min.js.map +0 -1
  148. package/dist/exo.global.js +0 -17328
  149. package/dist/exo.global.js.map +0 -1
  150. package/dist/exo.global.min.js +0 -2
  151. package/dist/exo.global.min.js.map +0 -1
package/README.md CHANGED
@@ -1,141 +1,156 @@
1
- # ExoJS
2
-
3
- ExoJS is a TypeScript-first 2D runtime for browser games and interactive apps. It is designed around explicit scene flow, practical rendering features, and predictable runtime behavior.
4
-
5
- ## Project status
6
-
7
- ExoJS is **pre-1.0**. The public API is still under active design — scene graph, rendering pipeline, and resource lifecycle boundaries may change between minor versions. Pin exact versions in downstream experiments. `1.0.0` will mark the first stable API contract.
8
-
9
- ## Why ExoJS
10
-
11
- - TypeScript-first API surface with strong runtime contracts
12
- - Scene and asset workflows built for real game loops
13
- - Modern rendering stack: WebGPU-first with WebGL2 fallback
14
- - Practical visuals: filters, masks, render passes, cache-as-bitmap
15
- - Gameplay tools: animated sprites, scene stacking, camera helpers, audio sprites
16
- - Performance visibility with built-in render stats and benchmark harness
17
- - Optional Rapier physics integration without forcing physics on every app
18
-
19
- ## What Is Shipped Today
20
-
21
- - `Application`, `Scene`, and scene-manager lifecycle
22
- - Typed `Loader` with manifest/bundle workflow (`defineAssetManifest`, `registerManifest`, `loadBundle`)
23
- - Drawables: `Sprite`, `AnimatedSprite`, `Graphics`, `ParticleSystem`, `Text`, `Video`
24
- - Scene stacking (`overlay` / `modal` / `opaque`) with input routing and fade transitions
25
- - View/camera helpers (`follow`, bounds clamp, shake, zoom)
26
- - Rendering composition primitives (`RenderTexture`, `RenderTargetPass`, filter chains, masks, cache-as-bitmap)
27
- - Render stats (`submittedNodes`, `culledNodes`, `drawCalls`, `batches`, `renderPasses`, ...)
28
- - Optional Rapier adapter (`createRapierPhysicsWorld`)
29
-
30
- ## Installation
31
-
32
- ```bash
33
- npm install exojs
34
- ```
35
-
36
- ## Quickstart
37
-
38
- ```ts
39
- import { Application, Scene, Graphics, Color, type SceneRenderRuntime } from 'exojs';
40
-
41
- class HelloScene extends Scene {
42
- private readonly box = new Graphics();
43
-
44
- public constructor() {
45
- super();
46
-
47
- this.box.fillColor = Color.white;
48
- this.box.drawRectangle(-32, -32, 64, 64);
49
- this.box.setPosition(400, 300);
50
-
51
- this.addChild(this.box);
52
- }
53
-
54
- public override update(delta: import('exojs').Time): void {
55
- this.box.rotation += delta.seconds * 45;
56
- }
57
-
58
- public override draw(runtime: SceneRenderRuntime): void {
59
- this.root.render(runtime);
60
- }
61
- }
62
-
63
- const canvas = document.querySelector('canvas');
64
-
65
- if (!canvas) {
66
- throw new Error('Missing <canvas> element.');
67
- }
68
-
69
- const app = new Application({
70
- canvas,
71
- width: 800,
72
- height: 600,
73
- clearColor: Color.cornflowerBlue,
74
- });
75
-
76
- await app.start(new HelloScene());
77
- ```
78
-
79
- ## Next Steps
80
-
81
- - Documentation hub: [docs/README.md](docs/README.md)
82
- - Getting started: [docs/getting-started/quickstart.md](docs/getting-started/quickstart.md)
83
- - Core concepts: [docs/core-concepts/overview.md](docs/core-concepts/overview.md)
84
- - Assets and bundles: [docs/assets/loader-and-bundles.md](docs/assets/loader-and-bundles.md)
85
- - Scenes and stack flow: [docs/scenes/scene-flow.md](docs/scenes/scene-flow.md)
86
- - Rendering and visuals: [docs/rendering/visual-capabilities.md](docs/rendering/visual-capabilities.md)
87
- - Audio workflow: [docs/audio/audio-workflow.md](docs/audio/audio-workflow.md)
88
- - Optional physics: [docs/physics/rapier-integration.md](docs/physics/rapier-integration.md)
89
- - Performance/debugging: [docs/performance/performance-and-debugging.md](docs/performance/performance-and-debugging.md)
90
- - API reference: [docs/api/README.md](docs/api/README.md)
91
- - In-repo examples: [examples/README.md](examples/README.md)
92
-
93
- ## WebGPU and WebGL2
94
-
95
- `Application` defaults to backend auto-selection:
96
-
97
- - prefers WebGPU when available
98
- - falls back to WebGL2 if WebGPU is unavailable or initialization fails
99
-
100
- You can force backend selection when needed:
101
-
102
- ```ts
103
- new Application({ backend: { type: 'webgpu' } });
104
- new Application({ backend: { type: 'webgl2' } });
105
- new Application({ backend: { type: 'auto' } });
106
- ```
107
-
108
- ## Optional Rapier Physics
109
-
110
- Rapier integration is opt-in and loaded only when you use it.
111
-
112
- ```ts
113
- import { createRapierPhysicsWorld } from 'exojs';
114
-
115
- const physics = await createRapierPhysicsWorld({ gravityY: 9.81 });
116
- ```
117
-
118
- If Rapier is unavailable, creation fails with a clear setup error.
119
-
120
- ## Examples
121
-
122
- The runnable live site (Astro + Lit + Monaco preview) lives in [`examples/`](examples/README.md) and is deployed as the repository's GitHub Pages site at <https://exoridus.github.io/ExoJS/>.
123
-
124
- ## Development
125
-
126
- ```bash
127
- npm run typecheck
128
- npm run lint
129
- npm test
130
- npm run build
131
- npm run verify:package
132
- npm run perf:benchmark
133
- ```
134
-
135
- Internal imports use the `@/*` path alias (mapped to `src/*`) — the same convention used by Vite, Next.js, and other modern TypeScript setups. Building the library requires TypeScript 6.
136
-
137
- ## Links
138
-
139
- - Repository: <https://github.com/Exoridus/ExoJS>
140
- - Issues: <https://github.com/Exoridus/ExoJS/issues>
141
- - Changelog: [CHANGELOG.md](CHANGELOG.md)
1
+ # ExoJS
2
+
3
+ ExoJS is a TypeScript-first 2D runtime for browser games and interactive apps. It is designed around explicit scene flow, practical rendering features, and predictable runtime behavior.
4
+
5
+ ## Project status
6
+
7
+ ExoJS is **pre-1.0**. The public API is still under active design — scene graph, rendering pipeline, and resource lifecycle boundaries may change between minor versions. Pin exact versions in downstream experiments. `1.0.0` will mark the first stable API contract.
8
+
9
+ ## Why ExoJS
10
+
11
+ - TypeScript-first API surface with strong runtime contracts
12
+ - Scene and asset workflows built for real game loops
13
+ - Modern rendering stack: WebGPU-first with WebGL2 fallback
14
+ - Practical visuals: filters, masks, render passes, cache-as-bitmap
15
+ - Gameplay tools: animated sprites, scene stacking, camera helpers, audio sprites
16
+ - Performance visibility with built-in render stats and benchmark harness
17
+ - Optional Rapier physics integration without forcing physics on every app
18
+
19
+ ## What Is Shipped Today
20
+
21
+ - `Application`, `Scene`, and scene-manager lifecycle
22
+ - Typed `Loader` with manifest/bundle workflow (`defineAssetManifest`, `registerManifest`, `loadBundle`)
23
+ - Drawables: `Sprite`, `AnimatedSprite`, `Graphics`, `ParticleSystem`, `Text`, `Video`
24
+ - Scene stacking (`overlay` / `modal` / `opaque`) with input routing and fade transitions
25
+ - View/camera helpers (`follow`, bounds clamp, shake, zoom)
26
+ - Rendering composition primitives (`RenderTexture`, `RenderTargetPass`, filter chains, visual masks, cache-as-bitmap)
27
+ - Render stats (`submittedNodes`, `culledNodes`, `drawCalls`, `batches`, `renderPasses`, ...)
28
+ - Optional Rapier adapter (`createRapierPhysicsWorld`)
29
+
30
+ ## Installation
31
+
32
+ ```bash
33
+ npm install @codexo/exojs
34
+ ```
35
+
36
+ ExoJS currently publishes an ESM-first package shape. Use `import` syntax with modern bundlers/runtime tooling.
37
+ CommonJS `require()` usage is not part of the supported contract for this pre-1.0 line.
38
+
39
+ ## Quickstart
40
+
41
+ ```ts
42
+ import { Application, Scene, Graphics, Color, type RenderBackend } from '@codexo/exojs';
43
+
44
+ class HelloScene extends Scene {
45
+ private readonly box = new Graphics();
46
+
47
+ public constructor() {
48
+ super();
49
+
50
+ this.box.fillColor = Color.white;
51
+ this.box.drawRectangle(-32, -32, 64, 64);
52
+ this.box.setPosition(400, 300);
53
+
54
+ this.addChild(this.box);
55
+ }
56
+
57
+ public override update(delta: import('@codexo/exojs').Time): void {
58
+ this.box.rotation += delta.seconds * 45;
59
+ }
60
+
61
+ public override draw(backend: RenderBackend): void {
62
+ this.root.render(backend);
63
+ }
64
+ }
65
+
66
+ const canvas = document.querySelector('canvas');
67
+
68
+ if (!canvas) {
69
+ throw new Error('Missing <canvas> element.');
70
+ }
71
+
72
+ const app = new Application({
73
+ canvas,
74
+ width: 800,
75
+ height: 600,
76
+ clearColor: Color.cornflowerBlue,
77
+ });
78
+
79
+ await app.start(new HelloScene());
80
+ ```
81
+
82
+ ## Next Steps
83
+
84
+ - In-repo examples: [examples/README.md](examples/README.md)
85
+
86
+ ## WebGPU and WebGL2
87
+
88
+ `Application` defaults to backend auto-selection:
89
+
90
+ - prefers WebGPU when available
91
+ - falls back to WebGL2 if WebGPU is unavailable or initialization fails
92
+
93
+ You can force backend selection when needed:
94
+
95
+ ```ts
96
+ new Application({ backend: { type: 'webgpu' } });
97
+ new Application({ backend: { type: 'webgl2' } });
98
+ new Application({ backend: { type: 'auto' } });
99
+ ```
100
+
101
+ ## Optional Rapier Physics
102
+
103
+ Rapier integration is opt-in and loaded only when you use it.
104
+
105
+ ```ts
106
+ import { createRapierPhysicsWorld } from '@codexo/exojs';
107
+
108
+ const physics = await createRapierPhysicsWorld({ gravityY: 9.81 });
109
+ ```
110
+
111
+ If Rapier is unavailable, creation fails with a clear setup error.
112
+
113
+ ### Physics scope policy
114
+
115
+ ExoJS ships **one** physics adapter: Rapier. The integration is intentionally
116
+ narrow:
117
+
118
+ - Physics is **optional**. `@dimforge/rapier2d-compat` is a peer dependency
119
+ marked `optional`. Apps that do not call `createRapierPhysicsWorld` never
120
+ load it and never pay for it at runtime.
121
+ - Rendering, application, and core scene code **do not** depend on physics.
122
+ The adapter binds Rapier bodies to scene nodes from the outside; the core
123
+ has no knowledge of physics.
124
+ - ExoJS is **not** a physics-engine abstraction layer. There is no
125
+ `PhysicsWorld` interface that spans multiple backends, and no plan to
126
+ add one. If you need a different physics library, integrate it directly
127
+ in your app code without library involvement.
128
+ - A second physics adapter (Box2D, Matter.js, Planck, etc.) is **not** on
129
+ the 1.0 roadmap and will not be accepted as a contribution. The honesty
130
+ rule that applies to rendering backends applies here too: one chosen
131
+ physics, not a fake-universal physics layer.
132
+
133
+ For full integration details see [docs/physics/rapier-integration.md](docs/physics/rapier-integration.md).
134
+
135
+ ## Examples
136
+
137
+ The runnable live site (Astro + Lit + Monaco preview) lives in [`examples/`](examples/README.md) and is deployed as the repository's GitHub Pages site at <https://exoridus.github.io/ExoJS/>.
138
+
139
+ ## Development
140
+
141
+ ```bash
142
+ npm run typecheck
143
+ npm run lint
144
+ npm test
145
+ npm run build
146
+ npm run verify:package
147
+ npm run perf:benchmark
148
+ ```
149
+
150
+ Internal imports use the `@/*` path alias (mapped to `src/*`) — the same convention used by Vite, Next.js, and other modern TypeScript setups. Building the library requires TypeScript 6.
151
+
152
+ ## Links
153
+
154
+ - Repository: <https://github.com/Exoridus/ExoJS>
155
+ - Issues: <https://github.com/Exoridus/ExoJS/issues>
156
+ - Changelog: [CHANGELOG.md](CHANGELOG.md)
@@ -17,7 +17,6 @@ export declare class AudioAnalyser {
17
17
  private readonly _preciseTimeDomainData;
18
18
  private readonly _preciseFrequencyData;
19
19
  private _analyser;
20
- private _audioContext;
21
20
  private _analyserTarget;
22
21
  constructor(media: Media, options?: Partial<AudioAnalyserOptions>);
23
22
  connect(): this;
@@ -12,7 +12,6 @@ class AudioAnalyser {
12
12
  _preciseTimeDomainData;
13
13
  _preciseFrequencyData;
14
14
  _analyser = null;
15
- _audioContext = null;
16
15
  _analyserTarget = null;
17
16
  constructor(media, options = {}) {
18
17
  const { fftSize, minDecibels, maxDecibels, smoothingTimeConstant } = options;
@@ -79,7 +78,6 @@ class AudioAnalyser {
79
78
  this._analyser?.disconnect();
80
79
  }
81
80
  setupWithAudioContext(audioContext) {
82
- this._audioContext = audioContext;
83
81
  this._analyser = audioContext.createAnalyser();
84
82
  this._analyser.fftSize = this._fftSize;
85
83
  this._analyser.minDecibels = this._minDecibels;
@@ -1 +1 @@
1
- {"version":3,"file":"AudioAnalyser.js","sources":["../../../../src/audio/AudioAnalyser.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AudioAnalyser.js","sources":["../../../../src/audio/AudioAnalyser.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import { Color } from './Color';
6
6
  import type { Time } from './Time';
7
7
  import type { Scene } from './Scene';
8
8
  import type { CacheStore } from '@/resources/CacheStore';
9
- import type { SceneRenderRuntime } from '@/rendering/SceneRenderRuntime';
9
+ import type { RenderBackend } from '@/rendering/RenderBackend';
10
10
  import type { GamepadDefinition } from '@/input/GamepadDefinitions';
11
11
  export declare enum ApplicationStatus {
12
12
  Loading = 1,
@@ -56,21 +56,21 @@ export declare class Application {
56
56
  private _frameCount;
57
57
  private _frameRequest;
58
58
  private _backendType;
59
- private _renderManager;
59
+ private _backend;
60
60
  constructor(appSettings?: Partial<ApplicationOptions>);
61
61
  get status(): ApplicationStatus;
62
62
  get startupTime(): Time;
63
63
  get activeTime(): Time;
64
64
  get frameTime(): Time;
65
65
  get frameCount(): number;
66
- get renderManager(): SceneRenderRuntime;
66
+ get backend(): RenderBackend;
67
67
  start(scene: Scene): Promise<this>;
68
68
  update(): this;
69
69
  stop(): this;
70
70
  resize(width: number, height: number): this;
71
71
  destroy(): void;
72
72
  private resolveInitialBackendType;
73
- private createRenderManager;
73
+ private createBackend;
74
74
  private initializeRenderManager;
75
75
  private canUseWebGpu;
76
76
  }
@@ -1,7 +1,7 @@
1
1
  import { Clock } from './Clock.js';
2
2
  import { SceneManager } from './SceneManager.js';
3
- import { WebGl2RenderManager } from '../rendering/webgl2/WebGl2RenderManager.js';
4
- import { WebGpuRenderManager } from '../rendering/webgpu/WebGpuRenderManager.js';
3
+ import { WebGl2Backend } from '../rendering/webgl2/WebGl2Backend.js';
4
+ import { WebGpuBackend } from '../rendering/webgpu/WebGpuBackend.js';
5
5
  import { InputManager } from '../input/InputManager.js';
6
6
  import { Loader } from '../resources/Loader.js';
7
7
  import { Signal } from './Signal.js';
@@ -58,7 +58,7 @@ class Application {
58
58
  _frameCount = 0;
59
59
  _frameRequest = 0;
60
60
  _backendType;
61
- _renderManager;
61
+ _backend;
62
62
  constructor(appSettings) {
63
63
  this.options = {
64
64
  canvas: appSettings?.canvas ?? createDefaultCanvas(),
@@ -76,7 +76,7 @@ class Application {
76
76
  cache: this.options.cache,
77
77
  });
78
78
  this._backendType = this.resolveInitialBackendType();
79
- this._renderManager = this.createRenderManager(this._backendType);
79
+ this._backend = this.createBackend(this._backendType);
80
80
  this.inputManager = new InputManager(this);
81
81
  this.sceneManager = new SceneManager(this);
82
82
  this._updateHandler = this.update.bind(this);
@@ -97,8 +97,8 @@ class Application {
97
97
  get frameCount() {
98
98
  return this._frameCount;
99
99
  }
100
- get renderManager() {
101
- return this._renderManager;
100
+ get backend() {
101
+ return this._backend;
102
102
  }
103
103
  async start(scene) {
104
104
  if (this._status === ApplicationStatus.Stopped) {
@@ -122,15 +122,15 @@ class Application {
122
122
  if (this._status === ApplicationStatus.Running) {
123
123
  const frameDelta = this._frameClock.elapsedTime;
124
124
  const frameStart = performance.now();
125
- this.renderManager.resetStats();
125
+ this.backend.resetStats();
126
126
  this.inputManager.update();
127
- const runtimeView = this.renderManager.view;
127
+ const runtimeView = this.backend.view;
128
128
  if (runtimeView && typeof runtimeView.update === 'function') {
129
129
  runtimeView.update(frameDelta.milliseconds);
130
130
  }
131
131
  this.sceneManager.update(frameDelta);
132
- this.renderManager.flush();
133
- this.renderManager.stats.frameTimeMs = performance.now() - frameStart;
132
+ this.backend.flush();
133
+ this.backend.stats.frameTimeMs = performance.now() - frameStart;
134
134
  this._frameRequest = requestAnimationFrame(this._updateHandler);
135
135
  this._frameClock.restart();
136
136
  this._frameCount++;
@@ -151,7 +151,7 @@ class Application {
151
151
  return this;
152
152
  }
153
153
  resize(width, height) {
154
- this.renderManager.resize(width, height);
154
+ this.backend.resize(width, height);
155
155
  this.onResize.dispatch(width, height, this);
156
156
  return this;
157
157
  }
@@ -159,7 +159,7 @@ class Application {
159
159
  this.stop();
160
160
  this.loader.destroy();
161
161
  this.inputManager.destroy();
162
- this._renderManager.destroy();
162
+ this._backend.destroy();
163
163
  this.sceneManager.destroy();
164
164
  this._startupClock.destroy();
165
165
  this._activeClock.destroy();
@@ -176,24 +176,24 @@ class Application {
176
176
  }
177
177
  return this.canUseWebGpu() ? 'webgpu' : 'webgl2';
178
178
  }
179
- createRenderManager(backendType) {
179
+ createBackend(backendType) {
180
180
  if (backendType === 'webgpu') {
181
- return new WebGpuRenderManager(this);
181
+ return new WebGpuBackend(this);
182
182
  }
183
- return new WebGl2RenderManager(this);
183
+ return new WebGl2Backend(this);
184
184
  }
185
185
  async initializeRenderManager() {
186
186
  try {
187
- await this._renderManager.initialize();
187
+ await this._backend.initialize();
188
188
  }
189
189
  catch (error) {
190
190
  if (this.options.backend?.type !== 'auto' || this._backendType !== 'webgpu') {
191
191
  throw error;
192
192
  }
193
- this._renderManager.destroy();
193
+ this._backend.destroy();
194
194
  this._backendType = 'webgl2';
195
- this._renderManager = this.createRenderManager(this._backendType);
196
- await this._renderManager.initialize();
195
+ this._backend = this.createBackend(this._backendType);
196
+ await this._backend.initialize();
197
197
  }
198
198
  }
199
199
  canUseWebGpu() {
@@ -1 +1 @@
1
- {"version":3,"file":"Application.js","sources":["../../../../src/core/Application.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Application.js","sources":["../../../../src/core/Application.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;IAcY;AAAZ,CAAA,UAAY,iBAAiB,EAAA;AACzB,IAAA,iBAAA,CAAA,iBAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAW;AACX,IAAA,iBAAA,CAAA,iBAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAW;AACX,IAAA,iBAAA,CAAA,iBAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAW;AACX,IAAA,iBAAA,CAAA,iBAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAW;AACf,CAAC,EALW,iBAAiB,KAAjB,iBAAiB,GAAA,EAAA,CAAA,CAAA;AAyC7B,MAAM,mBAAmB,GAAG,MAAyB,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAsB;AAC1G,MAAM,oBAAoB,GAAsB,EAAE,IAAI,EAAE,MAAM,EAAE;AAEhE,MAAM,kBAAkB,GAA8B;AAClD,IAAA,KAAK,EAAE,GAAG;AACV,IAAA,MAAM,EAAE,GAAG;IACX,UAAU,EAAE,KAAK,CAAC,cAAc;AAChC,IAAA,KAAK,EAAE,KAAK;IACZ,uBAAuB,EAAE,IAAI;IAC7B,yBAAyB,EAAE,IAAI;IAC/B,0BAA0B,EAAE,KAAK;AACjC,IAAA,kBAAkB,EAAE,EAAE;AACtB,IAAA,wBAAwB,EAAE,EAAE;AAC5B,IAAA,eAAe,EAAE;AACb,QAAA,KAAK,EAAE,KAAK;AACZ,QAAA,SAAS,EAAE,KAAK;AAChB,QAAA,kBAAkB,EAAE,KAAK;AACzB,QAAA,qBAAqB,EAAE,KAAK;AAC5B,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,KAAK,EAAE,KAAK;AACf,KAAA;AACD,IAAA,YAAY,EAAE,EAAE;AAChB,IAAA,cAAc,EAAE;AACZ,QAAA,MAAM,EAAE,KAAK;AACb,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,KAAK,EAAE,SAAS;AACnB,KAAA;AACD,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,OAAO,EAAE,oBAAoB;CAChC;MAEY,WAAW,CAAA;AACJ,IAAA,OAAO;AACP,IAAA,MAAM;AACN,IAAA,MAAM;AACN,IAAA,YAAY;AACZ,IAAA,YAAY;AACZ,IAAA,QAAQ,GAAG,IAAI,MAAM,EAAiC;AAErD,IAAA,cAAc;AACd,IAAA,aAAa,GAAU,IAAI,KAAK,EAAE;AAClC,IAAA,YAAY,GAAU,IAAI,KAAK,EAAE;AACjC,IAAA,WAAW,GAAU,IAAI,KAAK,EAAE;AAEzC,IAAA,OAAO,GAAsB,iBAAiB,CAAC,OAAO;IACtD,WAAW,GAAG,CAAC;IACf,aAAa,GAAG,CAAC;AACjB,IAAA,YAAY;AACZ,IAAA,QAAQ;AAEhB,IAAA,WAAA,CAAmB,WAAyC,EAAA;QACxD,IAAI,CAAC,OAAO,GAAG;AACX,YAAA,MAAM,EAAE,WAAW,EAAE,MAAM,IAAI,mBAAmB,EAAE;AACpD,YAAA,GAAG,kBAAkB;AACrB,YAAA,GAAG,WAAW;AACd,YAAA,OAAO,EAAE,WAAW,EAAE,OAAO,IAAI,oBAAoB;SACxD;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;QAEjC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC;QAC9C;AAEA,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;AACrB,YAAA,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;AACvC,YAAA,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;AAC3C,YAAA,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;AAC5B,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,yBAAyB,EAAE;QACpD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC;QACrD,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC;QAC1C,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC;QAC1C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AAE5C,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;IAC9B;AAEA,IAAA,IAAW,MAAM,GAAA;QACb,OAAO,IAAI,CAAC,OAAO;IACvB;AAEA,IAAA,IAAW,WAAW,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW;IACzC;AAEA,IAAA,IAAW,UAAU,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW;IACxC;AAEA,IAAA,IAAW,SAAS,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW;IACvC;AAEA,IAAA,IAAW,UAAU,GAAA;QACjB,OAAO,IAAI,CAAC,WAAW;IAC3B;AAEA,IAAA,IAAW,OAAO,GAAA;QACd,OAAO,IAAI,CAAC,QAAQ;IACxB;IAEO,MAAM,KAAK,CAAC,KAAY,EAAA;QAC3B,IAAI,IAAI,CAAC,OAAO,KAAK,iBAAiB,CAAC,OAAO,EAAE;AAC5C,YAAA,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,OAAO;AAExC,YAAA,IAAI;AACA,gBAAA,MAAM,IAAI,CAAC,uBAAuB,EAAE;gBACpC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvC,IAAI,CAAC,aAAa,GAAG,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC;AAC/D,gBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AAC1B,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACzB,gBAAA,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,OAAO;YAC5C;YAAE,OAAO,KAAK,EAAE;AACZ,gBAAA,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,OAAO;AACxC,gBAAA,MAAM,KAAK;YACf;QACJ;AAEA,QAAA,OAAO,IAAI;IACf;IAEO,MAAM,GAAA;QACT,IAAI,IAAI,CAAC,OAAO,KAAK,iBAAiB,CAAC,OAAO,EAAE;AAC5C,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW;AAC/C,YAAA,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;AAEpC,YAAA,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAEzB,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AAC1B,YAAA,MAAM,WAAW,GAAI,IAAI,CAAC,OAEvB,CAAC,IAAI;YAER,IAAI,WAAW,IAAI,OAAO,WAAW,CAAC,MAAM,KAAK,UAAU,EAAE;AACzD,gBAAA,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC;YAC/C;AAEA,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC;AACpC,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACpB,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU;YAC/D,IAAI,CAAC,aAAa,GAAG,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC;AAC/D,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;YAC1B,IAAI,CAAC,WAAW,EAAE;QACtB;AAEA,QAAA,OAAO,IAAI;IACf;IAEO,IAAI,GAAA;QACP,IAAI,IAAI,CAAC,OAAO,KAAK,iBAAiB,CAAC,OAAO,EAAE;AAC5C,YAAA,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,OAAO;AACxC,YAAA,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC;AACxC,YAAA,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,KAAI;AAC3D,gBAAA,OAAO,CAAC,KAAK,CAAC,uDAAuD,EAAE,KAAK,CAAC;AACjF,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AACxB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AACvB,YAAA,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,OAAO;QAC5C;AAEA,QAAA,OAAO,IAAI;IACf;IAEO,MAAM,CAAC,KAAa,EAAE,MAAc,EAAA;QACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC;AAE3C,QAAA,OAAO,IAAI;IACf;IAEO,OAAO,GAAA;QACV,IAAI,CAAC,IAAI,EAAE;AACX,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AACrB,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AAC3B,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;AAC5B,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AAC3B,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;IAC3B;IAEQ,yBAAyB,GAAA;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI;AAE9C,QAAA,IAAI,WAAW,KAAK,QAAQ,EAAE;AAC1B,YAAA,OAAO,QAAQ;QACnB;AAEA,QAAA,IAAI,WAAW,KAAK,QAAQ,EAAE;AAC1B,YAAA,OAAO,QAAQ;QACnB;AAEA,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,GAAG,QAAQ,GAAG,QAAQ;IACpD;AAEQ,IAAA,aAAa,CAAC,WAAgC,EAAA;AAClD,QAAA,IAAI,WAAW,KAAK,QAAQ,EAAE;AAC1B,YAAA,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC;QAClC;AAEA,QAAA,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC;IAClC;AAEQ,IAAA,MAAM,uBAAuB,GAAA;AACjC,QAAA,IAAI;AACA,YAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;QACpC;QAAE,OAAO,KAAK,EAAE;AACZ,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE;AACzE,gBAAA,MAAM,KAAK;YACf;AAEA,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;AACvB,YAAA,IAAI,CAAC,YAAY,GAAG,QAAQ;YAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC;AACrD,YAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;QACpC;IACJ;IAEQ,YAAY,GAAA;QAChB,MAAM,YAAY,GAAG,SAA+C;AAEpE,QAAA,OAAO,CAAC,CAAC,YAAY,CAAC,GAAG;IAC7B;AACH;;;;"}
@@ -1,8 +1,8 @@
1
1
  import type { Time } from './Time';
2
2
  import type { Loader } from '@/resources/Loader';
3
- import type { SceneRenderRuntime } from '@/rendering/SceneRenderRuntime';
3
+ import type { RenderBackend } from '@/rendering/RenderBackend';
4
4
  import { Container } from '@/rendering/Container';
5
- import type { SceneNode } from './SceneNode';
5
+ import type { RenderNode } from '@/rendering/RenderNode';
6
6
  import type { Application } from './Application';
7
7
  import type { Pointer } from '@/input/Pointer';
8
8
  import type { Vector } from '@/math/Vector';
@@ -46,38 +46,73 @@ export type SceneInputEvent = {
46
46
  type: 'mouseWheel';
47
47
  wheel: Vector;
48
48
  };
49
- export interface SceneData {
50
- load?: (loader: Loader) => Promise<void> | void;
51
- init?: (loader: Loader) => Promise<void> | void;
52
- update?: (delta: Time) => void;
53
- draw?: (renderManager: SceneRenderRuntime) => void;
54
- handleInput?: (event: SceneInputEvent) => boolean | void;
55
- unload?: (loader: Loader) => Promise<void> | void;
56
- }
57
- export type SceneInstance<T extends SceneData = SceneData> = Scene & T;
49
+ /**
50
+ * A scene's lifecycle host. Subclass to define scene behavior:
51
+ *
52
+ * class GameScene extends Scene {
53
+ * override init(loader: Loader): void { ... }
54
+ * override update(delta: Time): void { ... }
55
+ * override draw(backend: RenderBackend): void { ... }
56
+ * }
57
+ *
58
+ * app.start(new GameScene());
59
+ *
60
+ * For one-off scenes, an anonymous subclass works just as well:
61
+ *
62
+ * app.start(new class extends Scene {
63
+ * override update(delta) { ... }
64
+ * override draw(backend) { ... }
65
+ * });
66
+ */
58
67
  export declare class Scene {
59
- private _app;
60
- private readonly _root;
61
- private _stackMode;
62
- private _inputMode;
63
- static create<T extends SceneData>(definition: T & ThisType<SceneInstance<T>>): SceneInstance<T>;
64
- constructor();
68
+ protected _app: Application | null;
69
+ protected readonly _root: Container;
70
+ protected _stackMode: SceneStackMode;
71
+ protected _inputMode: SceneInputMode;
65
72
  get app(): Application | null;
66
73
  set app(app: Application | null);
74
+ /**
75
+ * Structural root container for this scene's hierarchy.
76
+ *
77
+ * `Scene.root` is an **ownership and traversal anchor**, not an
78
+ * automatic render-authoritative root. The framework never calls
79
+ * `root.render(backend)` for you. `Scene.draw(backend)` is the
80
+ * explicit orchestration point — see {@link Scene.draw}.
81
+ *
82
+ * The root exists eagerly so `addChild` / `removeChild` can proxy
83
+ * to a known container, and so transform/bounds traversal has a
84
+ * stable parent. Selecting what to render each frame remains the
85
+ * scene's responsibility.
86
+ */
67
87
  get root(): Container;
68
88
  get stackMode(): SceneStackMode;
69
89
  set stackMode(mode: SceneStackMode);
70
90
  get inputMode(): SceneInputMode;
71
91
  set inputMode(mode: SceneInputMode);
72
- addChild(child: SceneNode): this;
73
- removeChild(child: SceneNode): this;
92
+ addChild(child: RenderNode): this;
93
+ removeChild(child: RenderNode): this;
74
94
  setParticipationPolicy(policy: SceneParticipationPolicy): this;
75
95
  getParticipationPolicy(): SceneParticipationPolicy;
76
- load(loader: Loader): Promise<void> | void;
77
- init(loader: Loader): Promise<void> | void;
78
- update(delta: Time): void;
79
- draw(renderManager: SceneRenderRuntime): void;
96
+ load(_loader: Loader): Promise<void> | void;
97
+ init(_loader: Loader): Promise<void> | void;
98
+ update(_delta: Time): void;
99
+ /**
100
+ * Explicit per-frame rendering entry point. Override to choose
101
+ * what gets rendered.
102
+ *
103
+ * The default body is intentionally empty: `Scene` does not
104
+ * automatically traverse {@link Scene.root}. Auto-rendering the
105
+ * full hierarchy would conflict with ExoJS's "explicit instead of
106
+ * implicit" identity. Users decide which subtree(s) render each
107
+ * frame — `this.root.render(backend)` is one common pattern, but
108
+ * selective rendering (e.g. `world.render(backend)` while skipping
109
+ * `ui` for a given frame) is equally valid and intentionally
110
+ * supported.
111
+ *
112
+ * @see Scene.root for why root is structural, not render-authoritative.
113
+ */
114
+ draw(_backend: RenderBackend): void;
80
115
  handleInput(_event: SceneInputEvent): boolean | void;
81
- unload(loader: Loader): Promise<void> | void;
116
+ unload(_loader: Loader): Promise<void> | void;
82
117
  destroy(): void;
83
118
  }