@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.
- package/CHANGELOG.md +499 -163
- package/README.md +156 -141
- package/dist/esm/audio/AudioAnalyser.d.ts +0 -1
- package/dist/esm/audio/AudioAnalyser.js +0 -2
- package/dist/esm/audio/AudioAnalyser.js.map +1 -1
- package/dist/esm/core/Application.d.ts +4 -4
- package/dist/esm/core/Application.js +19 -19
- package/dist/esm/core/Application.js.map +1 -1
- package/dist/esm/core/Scene.d.ts +59 -24
- package/dist/esm/core/Scene.js +60 -18
- package/dist/esm/core/Scene.js.map +1 -1
- package/dist/esm/core/SceneManager.js +15 -9
- package/dist/esm/core/SceneManager.js.map +1 -1
- package/dist/esm/core/SceneNode.d.ts +45 -5
- package/dist/esm/core/SceneNode.js +136 -7
- package/dist/esm/core/SceneNode.js.map +1 -1
- package/dist/esm/index.js +6 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/math/index.d.ts +0 -1
- package/dist/esm/rendering/CallbackRenderPass.d.ts +3 -3
- package/dist/esm/rendering/CallbackRenderPass.js +2 -2
- package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
- package/dist/esm/rendering/Container.d.ts +10 -11
- package/dist/esm/rendering/Container.js +5 -5
- package/dist/esm/rendering/Container.js.map +1 -1
- package/dist/esm/rendering/Drawable.d.ts +2 -2
- package/dist/esm/rendering/Drawable.js +5 -5
- package/dist/esm/rendering/Drawable.js.map +1 -1
- package/dist/esm/rendering/{SceneRenderRuntime.d.ts → RenderBackend.d.ts} +21 -3
- package/dist/esm/rendering/RenderNode.d.ts +41 -5
- package/dist/esm/rendering/RenderNode.js +89 -24
- package/dist/esm/rendering/RenderNode.js.map +1 -1
- package/dist/esm/rendering/RenderPass.d.ts +2 -2
- package/dist/esm/rendering/RenderTargetPass.d.ts +3 -3
- package/dist/esm/rendering/RenderTargetPass.js +9 -9
- package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
- package/dist/esm/rendering/Renderer.d.ts +3 -3
- package/dist/esm/rendering/RendererRegistry.d.ts +13 -7
- package/dist/esm/rendering/RendererRegistry.js +18 -10
- package/dist/esm/rendering/RendererRegistry.js.map +1 -1
- package/dist/esm/rendering/filters/BlurFilter.d.ts +2 -2
- package/dist/esm/rendering/filters/BlurFilter.js +5 -5
- package/dist/esm/rendering/filters/BlurFilter.js.map +1 -1
- package/dist/esm/rendering/filters/ColorFilter.d.ts +2 -2
- package/dist/esm/rendering/filters/ColorFilter.js +3 -3
- package/dist/esm/rendering/filters/ColorFilter.js.map +1 -1
- package/dist/esm/rendering/filters/Filter.d.ts +2 -2
- package/dist/esm/rendering/index.d.ts +9 -6
- package/dist/esm/rendering/mesh/Mesh.d.ts +69 -0
- package/dist/esm/rendering/mesh/Mesh.js +114 -0
- package/dist/esm/rendering/mesh/Mesh.js.map +1 -0
- package/dist/esm/rendering/primitives/Graphics.d.ts +3 -3
- package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
- package/dist/esm/rendering/shader/Shader.d.ts +3 -3
- package/dist/esm/rendering/shader/Shader.js +10 -10
- package/dist/esm/rendering/text/Text.d.ts +2 -2
- package/dist/esm/rendering/text/Text.js +2 -2
- package/dist/esm/rendering/text/Text.js.map +1 -1
- package/dist/esm/rendering/texture/Sampler.d.ts +0 -3
- package/dist/esm/rendering/texture/Sampler.js +5 -7
- package/dist/esm/rendering/texture/Sampler.js.map +1 -1
- package/dist/esm/rendering/types.d.ts +4 -0
- package/dist/esm/rendering/types.js +4 -0
- package/dist/esm/rendering/types.js.map +1 -1
- package/dist/esm/rendering/video/Video.d.ts +2 -2
- package/dist/esm/rendering/video/Video.js +2 -2
- package/dist/esm/rendering/video/Video.js.map +1 -1
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.d.ts +2 -2
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js +35 -11
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.d.ts +13 -13
- package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js +20 -20
- package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/{WebGl2RenderManager.d.ts → WebGl2Backend.d.ts} +15 -12
- package/dist/esm/rendering/webgl2/{WebGl2RenderManager.js → WebGl2Backend.js} +63 -38
- package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.d.ts +31 -0
- package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js +186 -0
- package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +27 -0
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +242 -0
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.d.ts +38 -7
- package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js +281 -90
- package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.d.ts +2 -2
- package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.js +15 -10
- package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js +12 -0
- package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.d.ts +2 -0
- package/dist/esm/rendering/webgl2/{WebGl2ShaderRuntime.js → WebGl2ShaderProgram.js} +58 -18
- package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +26 -7
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +260 -62
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.d.ts +24 -1
- package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.js +6 -2
- package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.js.map +1 -1
- package/dist/esm/rendering/webgl2/glsl/mask-compose.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/mask-compose.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/mask-compose.vert.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/mask-compose.vert.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/mesh.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/mesh.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/mesh.vert.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/mesh.vert.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/particle.vert.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/sprite.frag.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/sprite.vert.js +1 -1
- package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.d.ts +9 -9
- package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js +18 -18
- package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/{WebGpuRenderManager.d.ts → WebGpuBackend.d.ts} +17 -14
- package/dist/esm/rendering/webgpu/{WebGpuRenderManager.js → WebGpuBackend.js} +77 -40
- package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.d.ts +37 -0
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +279 -0
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +40 -0
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +439 -0
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.d.ts +2 -3
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +65 -82
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.d.ts +2 -3
- package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.js +24 -25
- package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +28 -13
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +410 -382
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
- package/dist/esm/resources/Loader.js +5 -3
- package/dist/esm/resources/Loader.js.map +1 -1
- package/dist/exo.esm.js +3574 -1696
- package/dist/exo.esm.js.map +1 -1
- package/package.json +20 -11
- package/dist/esm/math/Transformable.d.ts +0 -47
- package/dist/esm/math/Transformable.js +0 -140
- package/dist/esm/math/Transformable.js.map +0 -1
- package/dist/esm/rendering/webgl2/WebGl2RenderManager.js.map +0 -1
- package/dist/esm/rendering/webgl2/WebGl2RendererRuntime.d.ts +0 -15
- package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.d.ts +0 -2
- package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.js.map +0 -1
- package/dist/esm/rendering/webgpu/WebGpuRenderManager.js.map +0 -1
- package/dist/esm/rendering/webgpu/WebGpuRendererRuntime.d.ts +0 -8
- package/dist/exo.esm.min.js +0 -2
- package/dist/exo.esm.min.js.map +0 -1
- package/dist/exo.global.js +0 -17328
- package/dist/exo.global.js.map +0 -1
- package/dist/exo.global.min.js +0 -2
- 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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
this.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
-
|
|
91
|
-
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
The
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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":";;MAUa,aAAa,CAAA;AACL,IAAA,MAAM;AAEN,IAAA,QAAQ;AACR,IAAA,YAAY;AACZ,IAAA,YAAY;AACZ,IAAA,sBAAsB;AACtB,IAAA,kBAAkB;AAElB,IAAA,eAAe;AACf,IAAA,cAAc;AACd,IAAA,sBAAsB;AACtB,IAAA,qBAAqB;IAE9B,SAAS,GAAwB,IAAI;IACrC,
|
|
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 {
|
|
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
|
|
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
|
|
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
|
|
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 {
|
|
4
|
-
import {
|
|
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
|
-
|
|
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.
|
|
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
|
|
101
|
-
return this.
|
|
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.
|
|
125
|
+
this.backend.resetStats();
|
|
126
126
|
this.inputManager.update();
|
|
127
|
-
const runtimeView = this.
|
|
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.
|
|
133
|
-
this.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
179
|
+
createBackend(backendType) {
|
|
180
180
|
if (backendType === 'webgpu') {
|
|
181
|
-
return new
|
|
181
|
+
return new WebGpuBackend(this);
|
|
182
182
|
}
|
|
183
|
-
return new
|
|
183
|
+
return new WebGl2Backend(this);
|
|
184
184
|
}
|
|
185
185
|
async initializeRenderManager() {
|
|
186
186
|
try {
|
|
187
|
-
await this.
|
|
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.
|
|
193
|
+
this._backend.destroy();
|
|
194
194
|
this._backendType = 'webgl2';
|
|
195
|
-
this.
|
|
196
|
-
await this.
|
|
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":";;;;;;;;;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,
|
|
1
|
+
{"version":3,"file":"Application.js","sources":["../../../../src/core/Application.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/dist/esm/core/Scene.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { Time } from './Time';
|
|
2
2
|
import type { Loader } from '@/resources/Loader';
|
|
3
|
-
import type {
|
|
3
|
+
import type { RenderBackend } from '@/rendering/RenderBackend';
|
|
4
4
|
import { Container } from '@/rendering/Container';
|
|
5
|
-
import type {
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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:
|
|
73
|
-
removeChild(child:
|
|
92
|
+
addChild(child: RenderNode): this;
|
|
93
|
+
removeChild(child: RenderNode): this;
|
|
74
94
|
setParticipationPolicy(policy: SceneParticipationPolicy): this;
|
|
75
95
|
getParticipationPolicy(): SceneParticipationPolicy;
|
|
76
|
-
load(
|
|
77
|
-
init(
|
|
78
|
-
update(
|
|
79
|
-
|
|
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(
|
|
116
|
+
unload(_loader: Loader): Promise<void> | void;
|
|
82
117
|
destroy(): void;
|
|
83
118
|
}
|