@codexo/exojs 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -0
- package/README.md +14 -14
- package/dist/esm/core/Application.d.ts +25 -6
- package/dist/esm/core/Application.js +42 -8
- package/dist/esm/core/Application.js.map +1 -1
- package/dist/esm/core/Perf.d.ts +23 -0
- package/dist/esm/core/Perf.js +49 -0
- package/dist/esm/core/Perf.js.map +1 -0
- package/dist/esm/core/Scene.d.ts +8 -8
- package/dist/esm/core/Scene.js +7 -7
- package/dist/esm/core/Scene.js.map +1 -1
- package/dist/esm/core/SceneManager.js +2 -2
- package/dist/esm/core/SceneManager.js.map +1 -1
- package/dist/esm/core/SceneNode.d.ts +0 -3
- package/dist/esm/core/SceneNode.js +0 -9
- package/dist/esm/core/SceneNode.js.map +1 -1
- package/dist/esm/core/capabilities.d.ts +2 -0
- package/dist/esm/core/capabilities.js +15 -0
- package/dist/esm/core/capabilities.js.map +1 -1
- package/dist/esm/core/index.d.ts +1 -0
- package/dist/esm/core/types.d.ts +1 -1
- package/dist/esm/core/utils.d.ts +12 -0
- package/dist/esm/core/utils.js +18 -1
- package/dist/esm/core/utils.js.map +1 -1
- package/dist/esm/index.js +14 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/particles/ParticleSystem.d.ts +8 -5
- package/dist/esm/particles/ParticleSystem.js +9 -5
- package/dist/esm/particles/ParticleSystem.js.map +1 -1
- package/dist/esm/particles/distributions/{Gradient.d.ts → ColorGradient.d.ts} +5 -5
- package/dist/esm/particles/distributions/{Gradient.js → ColorGradient.js} +5 -5
- package/dist/esm/particles/distributions/ColorGradient.js.map +1 -0
- package/dist/esm/particles/distributions/Distribution.d.ts +2 -2
- package/dist/esm/particles/distributions/index.d.ts +2 -2
- package/dist/esm/particles/gpu/ParticleGpuState.js +1 -1
- package/dist/esm/particles/modules/ColorOverLifetime.d.ts +3 -3
- package/dist/esm/particles/modules/ColorOverLifetime.js.map +1 -1
- package/dist/esm/particles/modules/ColorOverSpeed.d.ts +3 -3
- package/dist/esm/particles/modules/ColorOverSpeed.js.map +1 -1
- package/dist/esm/particles/modules/UpdateModule.d.ts +2 -2
- package/dist/esm/particles/modules/UpdateModule.js +1 -1
- package/dist/esm/particles/modules/WgslContribution.d.ts +2 -2
- package/dist/esm/rendering/Camera.d.ts +33 -0
- package/dist/esm/rendering/Camera.js +38 -0
- package/dist/esm/rendering/Camera.js.map +1 -0
- package/dist/esm/rendering/Container.d.ts +5 -24
- package/dist/esm/rendering/Container.js +8 -71
- package/dist/esm/rendering/Container.js.map +1 -1
- package/dist/esm/rendering/Drawable.d.ts +8 -10
- package/dist/esm/rendering/Drawable.js +12 -20
- package/dist/esm/rendering/Drawable.js.map +1 -1
- package/dist/esm/rendering/RenderBackend.d.ts +18 -0
- package/dist/esm/rendering/RenderNode.d.ts +81 -8
- package/dist/esm/rendering/RenderNode.js +121 -144
- package/dist/esm/rendering/RenderNode.js.map +1 -1
- package/dist/esm/rendering/RenderTarget.d.ts +13 -0
- package/dist/esm/rendering/RenderTarget.js +13 -0
- package/dist/esm/rendering/RenderTarget.js.map +1 -1
- package/dist/esm/rendering/RenderTargetPass.js +17 -0
- package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
- package/dist/esm/rendering/RenderingContext.d.ts +87 -0
- package/dist/esm/rendering/RenderingContext.js +157 -0
- package/dist/esm/rendering/RenderingContext.js.map +1 -0
- package/dist/esm/rendering/TransformBuffer.d.ts +38 -0
- package/dist/esm/rendering/TransformBuffer.js +116 -0
- package/dist/esm/rendering/TransformBuffer.js.map +1 -0
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js +5 -12
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -1
- package/dist/esm/rendering/geometry/Geometry.d.ts +40 -0
- package/dist/esm/rendering/geometry/Geometry.js +228 -0
- package/dist/esm/rendering/geometry/Geometry.js.map +1 -0
- package/dist/esm/rendering/geometry/GeometryAttribute.d.ts +32 -0
- package/dist/esm/rendering/geometry/QuadGeometry.d.ts +5 -0
- package/dist/esm/rendering/gradient/Gradient.d.ts +34 -0
- package/dist/esm/rendering/gradient/Gradient.js +114 -0
- package/dist/esm/rendering/gradient/Gradient.js.map +1 -0
- package/dist/esm/rendering/gradient/LinearGradient.d.ts +10 -0
- package/dist/esm/rendering/gradient/LinearGradient.js +26 -0
- package/dist/esm/rendering/gradient/LinearGradient.js.map +1 -0
- package/dist/esm/rendering/gradient/RadialGradient.d.ts +10 -0
- package/dist/esm/rendering/gradient/RadialGradient.js +25 -0
- package/dist/esm/rendering/gradient/RadialGradient.js.map +1 -0
- package/dist/esm/rendering/index.d.ts +16 -2
- package/dist/esm/rendering/material/Material.d.ts +114 -0
- package/dist/esm/rendering/material/Material.js +111 -0
- package/dist/esm/rendering/material/Material.js.map +1 -0
- package/dist/esm/rendering/material/MaterialKey.d.ts +18 -0
- package/dist/esm/rendering/material/MaterialKey.js +82 -0
- package/dist/esm/rendering/material/MaterialKey.js.map +1 -0
- package/dist/esm/rendering/material/MeshMaterial.d.ts +16 -0
- package/dist/esm/rendering/material/MeshMaterial.js +21 -0
- package/dist/esm/rendering/material/MeshMaterial.js.map +1 -0
- package/dist/esm/rendering/{mesh/MeshShader.d.ts → material/ShaderSource.d.ts} +29 -62
- package/dist/esm/rendering/{mesh/MeshShader.js → material/ShaderSource.js} +35 -62
- package/dist/esm/rendering/material/ShaderSource.js.map +1 -0
- package/dist/esm/rendering/material/SpriteMaterial.d.ts +15 -0
- package/dist/esm/rendering/material/SpriteMaterial.js +20 -0
- package/dist/esm/rendering/material/SpriteMaterial.js.map +1 -0
- package/dist/esm/rendering/mesh/Mesh.d.ts +29 -12
- package/dist/esm/rendering/mesh/Mesh.js +122 -3
- package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
- package/dist/esm/rendering/pass/RenderPassCoordinator.d.ts +63 -0
- package/dist/esm/rendering/pass/RenderPassDescriptor.d.ts +48 -0
- package/dist/esm/rendering/pass/RenderPassDescriptor.js +16 -0
- package/dist/esm/rendering/pass/RenderPassDescriptor.js.map +1 -0
- package/dist/esm/rendering/plan/RenderCommand.d.ts +67 -0
- package/dist/esm/rendering/plan/RenderCommand.js +94 -0
- package/dist/esm/rendering/plan/RenderCommand.js.map +1 -0
- package/dist/esm/rendering/plan/RenderEffectExecutor.d.ts +10 -0
- package/dist/esm/rendering/plan/RenderEffectExecutor.js +159 -0
- package/dist/esm/rendering/plan/RenderEffectExecutor.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlan.d.ts +23 -0
- package/dist/esm/rendering/plan/RenderPlan.js +12 -0
- package/dist/esm/rendering/plan/RenderPlan.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts +31 -0
- package/dist/esm/rendering/plan/RenderPlanBuilder.js +242 -0
- package/dist/esm/rendering/plan/RenderPlanBuilder.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanOptimizer.d.ts +10 -0
- package/dist/esm/rendering/plan/RenderPlanOptimizer.js +180 -0
- package/dist/esm/rendering/plan/RenderPlanOptimizer.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts +9 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.js +56 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -0
- package/dist/esm/rendering/plan/RenderScope.d.ts +70 -0
- package/dist/esm/rendering/plan/RenderScope.js +16 -0
- package/dist/esm/rendering/plan/RenderScope.js.map +1 -0
- package/dist/esm/rendering/plan/playRenderTree.d.ts +4 -0
- package/dist/esm/rendering/plan/playRenderTree.js +19 -0
- package/dist/esm/rendering/plan/playRenderTree.js.map +1 -0
- package/dist/esm/rendering/sprite/Sprite.d.ts +22 -1
- package/dist/esm/rendering/sprite/Sprite.js +33 -2
- package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
- package/dist/esm/rendering/sprite/spriteMaterialSources.d.ts +36 -0
- package/dist/esm/rendering/sprite/spriteMaterialSources.js +128 -0
- package/dist/esm/rendering/sprite/spriteMaterialSources.js.map +1 -0
- package/dist/esm/rendering/text/TextStyle.d.ts +1 -1
- package/dist/esm/rendering/texture/DataTexture.d.ts +5 -0
- package/dist/esm/rendering/texture/DataTexture.js +7 -0
- package/dist/esm/rendering/texture/DataTexture.js.map +1 -1
- package/dist/esm/rendering/video/Video.d.ts +3 -7
- package/dist/esm/rendering/video/Video.js +3 -8
- package/dist/esm/rendering/video/Video.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +40 -0
- package/dist/esm/rendering/webgl2/WebGl2Backend.js +303 -22
- package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +22 -2
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +404 -112
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.d.ts +57 -0
- package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js +79 -0
- package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +12 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +214 -58
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.d.ts +34 -0
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js +169 -0
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +4 -0
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/glsl/mesh.frag.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/mesh.vert.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +50 -0
- package/dist/esm/rendering/webgpu/WebGpuBackend.js +135 -19
- package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +22 -17
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +24 -0
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +488 -74
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +13 -17
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.d.ts +141 -0
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js +270 -0
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +16 -0
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +335 -26
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts +57 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js +257 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilState.d.ts +14 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilState.js +36 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilState.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +14 -12
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +16 -0
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +57 -0
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -0
- package/dist/esm/resources/JsonStore.d.ts +18 -0
- package/dist/esm/resources/JsonStore.js +62 -0
- package/dist/esm/resources/JsonStore.js.map +1 -0
- package/dist/esm/resources/factories/ImageFactory.d.ts +14 -8
- package/dist/esm/resources/factories/ImageFactory.js +13 -6
- package/dist/esm/resources/factories/ImageFactory.js.map +1 -1
- package/dist/esm/resources/factories/TextureFactory.d.ts +4 -4
- package/dist/esm/resources/factories/TextureFactory.js +8 -4
- package/dist/esm/resources/factories/TextureFactory.js.map +1 -1
- package/dist/esm/resources/index.d.ts +1 -0
- package/dist/exo.esm.js +5424 -2205
- package/dist/exo.esm.js.map +1 -1
- package/package.json +30 -24
- package/dist/esm/particles/distributions/Gradient.js.map +0 -1
- package/dist/esm/rendering/mesh/MeshShader.js.map +0 -1
- package/dist/esm/vendor/webgl-debug.js +0 -1160
- package/dist/esm/vendor/webgl-debug.js.map +0 -1
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { Matrix } from '../../math/Matrix.js';
|
|
2
|
+
import { WebGpuStencilClipper } from './WebGpuStencilClipper.js';
|
|
3
|
+
export { stencilAttachmentFormat } from './WebGpuStencilClipper.js';
|
|
4
|
+
|
|
5
|
+
/// <reference types="@webgpu/types" />
|
|
6
|
+
/**
|
|
7
|
+
* WebGPU implementation of {@link RenderPassCoordinator}.
|
|
8
|
+
*
|
|
9
|
+
* Owns the GPU render-pass mechanics (acquire/end the active
|
|
10
|
+
* `GPURenderPassEncoder`), the clear-vs-load decision, and — from phase 12E —
|
|
11
|
+
* geometric stencil clipping: a per-target `depth24plus-stencil8` attachment
|
|
12
|
+
* shared across the multiple submits of a clip scope (via `stencilLoadOp:'load'`)
|
|
13
|
+
* plus a position-only stencil-write pipeline. Renderers select stencil-enabled
|
|
14
|
+
* content pipelines while {@link stencilActive} is true.
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
class WebGpuPassCoordinator {
|
|
18
|
+
_backend;
|
|
19
|
+
_stencil = new WebGpuStencilClipper();
|
|
20
|
+
_stencilDepths = new Map();
|
|
21
|
+
_stencilStacks = new Map();
|
|
22
|
+
_stencilConnected = false;
|
|
23
|
+
_stencilWriteInProgress = false;
|
|
24
|
+
_stencilLoadOp = 'load';
|
|
25
|
+
_stencilRef = 0;
|
|
26
|
+
_active = null;
|
|
27
|
+
constructor(backend) {
|
|
28
|
+
this._backend = backend;
|
|
29
|
+
}
|
|
30
|
+
get activeTarget() {
|
|
31
|
+
return this._backend.renderTarget;
|
|
32
|
+
}
|
|
33
|
+
get activeView() {
|
|
34
|
+
return this._backend.view;
|
|
35
|
+
}
|
|
36
|
+
get hasActivePass() {
|
|
37
|
+
return this._active !== null;
|
|
38
|
+
}
|
|
39
|
+
/** The open GPU pass, or `null` when none is open. @internal */
|
|
40
|
+
get activePass() {
|
|
41
|
+
return this._active;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Whether a geometric stencil clip is currently in effect on the active
|
|
45
|
+
* target. Renderers read this to select a stencil-enabled content pipeline
|
|
46
|
+
* (matching the depth/stencil attachment {@link acquirePass} adds).
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
get stencilActive() {
|
|
50
|
+
return this._stencilWriteInProgress || this._activeTargetDepth() > 0;
|
|
51
|
+
}
|
|
52
|
+
/** Current stencil reference value content pipelines must test against. @internal */
|
|
53
|
+
get stencilReference() {
|
|
54
|
+
return this._stencilRef;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Open (or return the already-open) GPU render pass for the backend's current
|
|
58
|
+
* target/view. Resolves colour load/clear via {@link createColorAttachment},
|
|
59
|
+
* counts the pass, applies the active scissor, and — when a stencil clip is in
|
|
60
|
+
* effect — attaches the per-target depth/stencil buffer and sets the reference.
|
|
61
|
+
*/
|
|
62
|
+
acquirePass() {
|
|
63
|
+
if (this._active !== null) {
|
|
64
|
+
return this._active;
|
|
65
|
+
}
|
|
66
|
+
const backend = this._backend;
|
|
67
|
+
const stencilEnabled = this.stencilActive;
|
|
68
|
+
const descriptor = {
|
|
69
|
+
colorAttachments: [backend.createColorAttachment()],
|
|
70
|
+
};
|
|
71
|
+
if (stencilEnabled) {
|
|
72
|
+
descriptor.depthStencilAttachment = this._createStencilAttachment(backend.renderTarget);
|
|
73
|
+
}
|
|
74
|
+
const encoder = backend.device.createCommandEncoder();
|
|
75
|
+
const pass = encoder.beginRenderPass(descriptor);
|
|
76
|
+
backend.stats.renderPasses++;
|
|
77
|
+
const scissor = backend.getScissorRect();
|
|
78
|
+
if (scissor !== null && scissor.width > 0 && scissor.height > 0) {
|
|
79
|
+
pass.setScissorRect(scissor.x, scissor.y, scissor.width, scissor.height);
|
|
80
|
+
}
|
|
81
|
+
if (stencilEnabled) {
|
|
82
|
+
pass.setStencilReference(this._stencilRef);
|
|
83
|
+
}
|
|
84
|
+
this._active = {
|
|
85
|
+
encoder,
|
|
86
|
+
pass,
|
|
87
|
+
targetFormat: backend.renderTargetFormat,
|
|
88
|
+
view: backend.view,
|
|
89
|
+
stencilEnabled,
|
|
90
|
+
stencilRef: this._stencilRef,
|
|
91
|
+
};
|
|
92
|
+
return this._active;
|
|
93
|
+
}
|
|
94
|
+
/** End and submit the active GPU pass, if any. Idempotent. */
|
|
95
|
+
endPass() {
|
|
96
|
+
const active = this._active;
|
|
97
|
+
if (active === null) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
this._active = null;
|
|
101
|
+
active.pass.end();
|
|
102
|
+
this._backend.submit(active.encoder.finish());
|
|
103
|
+
}
|
|
104
|
+
beginPass(descriptor) {
|
|
105
|
+
this._backend.setRenderTarget(descriptor.target);
|
|
106
|
+
this._backend.setView(descriptor.view);
|
|
107
|
+
if (descriptor.load === 'clear') {
|
|
108
|
+
this._backend.clear(descriptor.clearColor ?? undefined);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
withChildPass(descriptor, body) {
|
|
112
|
+
const previousTarget = this._backend.renderTarget;
|
|
113
|
+
const previousView = this._backend.view;
|
|
114
|
+
this.beginPass(descriptor);
|
|
115
|
+
try {
|
|
116
|
+
body();
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
// setRenderTarget flushes the active renderer on change, which self-closes
|
|
120
|
+
// its GPU pass, so the child's draws are committed into the child target
|
|
121
|
+
// before the bind switches back.
|
|
122
|
+
this._backend.setRenderTarget(previousTarget);
|
|
123
|
+
this._backend.setView(previousView);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
pushScissorRect(bounds) {
|
|
127
|
+
this._backend.pushScissorRect(bounds);
|
|
128
|
+
}
|
|
129
|
+
popScissorRect() {
|
|
130
|
+
this._backend.popScissorRect();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Establish a geometric stencil clip on the active target. The shape silhouette
|
|
134
|
+
* is incremented into the stencil buffer where it covers the already-valid
|
|
135
|
+
* region (intersection on nesting); subsequent content draws are restricted to
|
|
136
|
+
* the new depth via the stencil-enabled content pipelines.
|
|
137
|
+
*/
|
|
138
|
+
pushStencilClip(shape, transform) {
|
|
139
|
+
const target = this._backend.renderTarget;
|
|
140
|
+
const depth = this._stencilDepths.get(target) ?? 0;
|
|
141
|
+
if (depth >= 255) {
|
|
142
|
+
throw new Error('Stencil clip nesting exceeds the 255-level limit.');
|
|
143
|
+
}
|
|
144
|
+
this._connectStencil();
|
|
145
|
+
this.endPass();
|
|
146
|
+
// The write pass tests stencil == depth and increments to depth+1. At the
|
|
147
|
+
// outermost level the stencil aspect is cleared first so stale values from a
|
|
148
|
+
// previous frame cannot leak in; deeper levels load the existing buffer.
|
|
149
|
+
this._stencilWriteInProgress = true;
|
|
150
|
+
this._stencilRef = depth;
|
|
151
|
+
this._stencilLoadOp = depth === 0 ? 'clear' : 'load';
|
|
152
|
+
const active = this.acquirePass();
|
|
153
|
+
this._stencil.draw(active.pass, active.targetFormat, true, shape, transform, active.view);
|
|
154
|
+
this.endPass();
|
|
155
|
+
this._stencilWriteInProgress = false;
|
|
156
|
+
this._stencilDepths.set(target, depth + 1);
|
|
157
|
+
this._stencilRef = depth + 1;
|
|
158
|
+
this._getStencilStack(target).push({ shape, transform: new Matrix().copy(transform) });
|
|
159
|
+
}
|
|
160
|
+
/** Pop the most recent stencil clip on the active target, restoring the outer level. */
|
|
161
|
+
popStencilClip() {
|
|
162
|
+
const target = this._backend.renderTarget;
|
|
163
|
+
const stack = this._stencilStacks.get(target);
|
|
164
|
+
const entry = stack?.pop();
|
|
165
|
+
if (entry === undefined) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const depth = this._stencilDepths.get(target) ?? 0;
|
|
169
|
+
this.endPass();
|
|
170
|
+
// The decrement pass tests stencil == depth and decrements the region this
|
|
171
|
+
// clip incremented, restoring the outer level. The stencil aspect is loaded.
|
|
172
|
+
this._stencilWriteInProgress = true;
|
|
173
|
+
this._stencilRef = depth;
|
|
174
|
+
this._stencilLoadOp = 'load';
|
|
175
|
+
const active = this.acquirePass();
|
|
176
|
+
this._stencil.draw(active.pass, active.targetFormat, false, entry.shape, entry.transform, active.view);
|
|
177
|
+
this.endPass();
|
|
178
|
+
this._stencilWriteInProgress = false;
|
|
179
|
+
this._stencilDepths.set(target, depth - 1);
|
|
180
|
+
this._stencilRef = depth - 1;
|
|
181
|
+
}
|
|
182
|
+
resolveLoad(target, clearRequested) {
|
|
183
|
+
// Clear when explicitly requested or when the target holds no content to
|
|
184
|
+
// preserve; otherwise load, so a render texture keeps its prior contents
|
|
185
|
+
// across multiple passes in the same frame.
|
|
186
|
+
return clearRequested || !this._backend._targetHasContent(target) ? 'clear' : 'load';
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Drop a target's cached stencil attachment and clip state. Called when the
|
|
190
|
+
* target is destroyed so a pooled render texture never reuses a stale buffer.
|
|
191
|
+
* @internal
|
|
192
|
+
*/
|
|
193
|
+
releaseStencilTarget(target) {
|
|
194
|
+
if (this._stencilConnected) {
|
|
195
|
+
this._stencil.releaseAttachment(target);
|
|
196
|
+
}
|
|
197
|
+
this._stencilDepths.delete(target);
|
|
198
|
+
this._stencilStacks.delete(target);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Drop all stencil clip bookkeeping (depths, stacks, write/ref state). Invoked
|
|
202
|
+
* on the unbalanced-clip recovery path at the end of a draw plan (see
|
|
203
|
+
* `WebGpuBackend._endDrawPlan`) so a leaked clip cannot corrupt the next frame;
|
|
204
|
+
* backend destroy / device loss go through `destroyStencil` instead. @internal
|
|
205
|
+
*/
|
|
206
|
+
resetStencil() {
|
|
207
|
+
this._stencilDepths.clear();
|
|
208
|
+
this._stencilStacks.clear();
|
|
209
|
+
this._stencilWriteInProgress = false;
|
|
210
|
+
this._stencilRef = 0;
|
|
211
|
+
}
|
|
212
|
+
/** Tear down all stencil GPU resources (device loss / backend destroy). @internal */
|
|
213
|
+
destroyStencil() {
|
|
214
|
+
if (this._stencilConnected) {
|
|
215
|
+
this._stencil.disconnect();
|
|
216
|
+
this._stencilConnected = false;
|
|
217
|
+
}
|
|
218
|
+
this._stencilDepths.clear();
|
|
219
|
+
this._stencilStacks.clear();
|
|
220
|
+
this._stencilWriteInProgress = false;
|
|
221
|
+
this._stencilRef = 0;
|
|
222
|
+
}
|
|
223
|
+
/** Number of unpopped stencil clips across all targets (balance assertion). @internal */
|
|
224
|
+
unbalancedStencilClips() {
|
|
225
|
+
let total = 0;
|
|
226
|
+
for (const stack of this._stencilStacks.values()) {
|
|
227
|
+
total += stack.length;
|
|
228
|
+
}
|
|
229
|
+
return total;
|
|
230
|
+
}
|
|
231
|
+
_activeTargetDepth() {
|
|
232
|
+
return this._stencilDepths.get(this._backend.renderTarget) ?? 0;
|
|
233
|
+
}
|
|
234
|
+
_connectStencil() {
|
|
235
|
+
if (!this._stencilConnected) {
|
|
236
|
+
this._stencil.connect(this._backend.device);
|
|
237
|
+
this._stencilConnected = true;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
_getStencilStack(target) {
|
|
241
|
+
let stack = this._stencilStacks.get(target);
|
|
242
|
+
if (stack === undefined) {
|
|
243
|
+
stack = [];
|
|
244
|
+
this._stencilStacks.set(target, stack);
|
|
245
|
+
}
|
|
246
|
+
return stack;
|
|
247
|
+
}
|
|
248
|
+
_createStencilAttachment(target) {
|
|
249
|
+
// Size the stencil attachment to the colour attachment's physical pixels, not
|
|
250
|
+
// the target's logical size. The root canvas backing store is logical ×
|
|
251
|
+
// pixelRatio, so a logical-sized stencil buffer would mismatch the
|
|
252
|
+
// getCurrentTexture() colour attachment at pixelRatio > 1; RenderTexture
|
|
253
|
+
// targets report the same size for both, so they are unaffected.
|
|
254
|
+
const { width, height } = this._backend._getAttachmentPixelSize(target);
|
|
255
|
+
const view = this._stencil.getAttachmentView(target, width, height);
|
|
256
|
+
const stencilLoadOp = this._stencilLoadOp;
|
|
257
|
+
// Consumed once; subsequent passes within the clip scope load the buffer.
|
|
258
|
+
this._stencilLoadOp = 'load';
|
|
259
|
+
return {
|
|
260
|
+
view,
|
|
261
|
+
depthReadOnly: true,
|
|
262
|
+
stencilLoadOp,
|
|
263
|
+
stencilStoreOp: 'store',
|
|
264
|
+
stencilClearValue: 0,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export { WebGpuPassCoordinator };
|
|
270
|
+
//# sourceMappingURL=WebGpuPassCoordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebGpuPassCoordinator.js","sources":["../../../../../src/rendering/webgpu/WebGpuPassCoordinator.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -22,9 +22,17 @@ export declare class WebGpuSpriteRenderer extends AbstractWebGpuRenderer<Sprite>
|
|
|
22
22
|
private _slotCount;
|
|
23
23
|
private _instanceCount;
|
|
24
24
|
private _currentBlendMode;
|
|
25
|
+
private readonly _customMaterials;
|
|
26
|
+
private _customBaseTextureLayout;
|
|
27
|
+
private _currentMaterial;
|
|
28
|
+
private _currentBaseTexture;
|
|
25
29
|
protected onConnect(backend: WebGpuBackend): void;
|
|
26
30
|
protected onDisconnect(): void;
|
|
27
31
|
render(sprite: Sprite): void;
|
|
32
|
+
/** Default multi-texture path: rotate the base texture through 8 slots. */
|
|
33
|
+
private _renderDefault;
|
|
34
|
+
/** Custom-material path: single base texture on group(1), instanced. */
|
|
35
|
+
private _renderCustom;
|
|
28
36
|
flush(): void;
|
|
29
37
|
destroy(): void;
|
|
30
38
|
/**
|
|
@@ -45,4 +53,12 @@ export declare class WebGpuSpriteRenderer extends AbstractWebGpuRenderer<Sprite>
|
|
|
45
53
|
private _createTextureBindGroup;
|
|
46
54
|
private _getPipeline;
|
|
47
55
|
private _buildPipelineDescriptor;
|
|
56
|
+
private _drawCustomBatch;
|
|
57
|
+
private _getOrCreateCustomResources;
|
|
58
|
+
private _getOrCreateCustomPipeline;
|
|
59
|
+
private _getCustomBaseTextureBindGroup;
|
|
60
|
+
private _buildUserBindGroupLayout;
|
|
61
|
+
private _uploadUserUniforms;
|
|
62
|
+
private _buildUserBindGroup;
|
|
63
|
+
private _releaseCustomResources;
|
|
48
64
|
}
|