@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.
Files changed (209) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +14 -14
  3. package/dist/esm/core/Application.d.ts +25 -6
  4. package/dist/esm/core/Application.js +42 -8
  5. package/dist/esm/core/Application.js.map +1 -1
  6. package/dist/esm/core/Perf.d.ts +23 -0
  7. package/dist/esm/core/Perf.js +49 -0
  8. package/dist/esm/core/Perf.js.map +1 -0
  9. package/dist/esm/core/Scene.d.ts +8 -8
  10. package/dist/esm/core/Scene.js +7 -7
  11. package/dist/esm/core/Scene.js.map +1 -1
  12. package/dist/esm/core/SceneManager.js +2 -2
  13. package/dist/esm/core/SceneManager.js.map +1 -1
  14. package/dist/esm/core/SceneNode.d.ts +0 -3
  15. package/dist/esm/core/SceneNode.js +0 -9
  16. package/dist/esm/core/SceneNode.js.map +1 -1
  17. package/dist/esm/core/capabilities.d.ts +2 -0
  18. package/dist/esm/core/capabilities.js +15 -0
  19. package/dist/esm/core/capabilities.js.map +1 -1
  20. package/dist/esm/core/index.d.ts +1 -0
  21. package/dist/esm/core/types.d.ts +1 -1
  22. package/dist/esm/core/utils.d.ts +12 -0
  23. package/dist/esm/core/utils.js +18 -1
  24. package/dist/esm/core/utils.js.map +1 -1
  25. package/dist/esm/index.js +14 -3
  26. package/dist/esm/index.js.map +1 -1
  27. package/dist/esm/particles/ParticleSystem.d.ts +8 -5
  28. package/dist/esm/particles/ParticleSystem.js +9 -5
  29. package/dist/esm/particles/ParticleSystem.js.map +1 -1
  30. package/dist/esm/particles/distributions/{Gradient.d.ts → ColorGradient.d.ts} +5 -5
  31. package/dist/esm/particles/distributions/{Gradient.js → ColorGradient.js} +5 -5
  32. package/dist/esm/particles/distributions/ColorGradient.js.map +1 -0
  33. package/dist/esm/particles/distributions/Distribution.d.ts +2 -2
  34. package/dist/esm/particles/distributions/index.d.ts +2 -2
  35. package/dist/esm/particles/gpu/ParticleGpuState.js +1 -1
  36. package/dist/esm/particles/modules/ColorOverLifetime.d.ts +3 -3
  37. package/dist/esm/particles/modules/ColorOverLifetime.js.map +1 -1
  38. package/dist/esm/particles/modules/ColorOverSpeed.d.ts +3 -3
  39. package/dist/esm/particles/modules/ColorOverSpeed.js.map +1 -1
  40. package/dist/esm/particles/modules/UpdateModule.d.ts +2 -2
  41. package/dist/esm/particles/modules/UpdateModule.js +1 -1
  42. package/dist/esm/particles/modules/WgslContribution.d.ts +2 -2
  43. package/dist/esm/rendering/Camera.d.ts +33 -0
  44. package/dist/esm/rendering/Camera.js +38 -0
  45. package/dist/esm/rendering/Camera.js.map +1 -0
  46. package/dist/esm/rendering/Container.d.ts +5 -24
  47. package/dist/esm/rendering/Container.js +8 -71
  48. package/dist/esm/rendering/Container.js.map +1 -1
  49. package/dist/esm/rendering/Drawable.d.ts +8 -10
  50. package/dist/esm/rendering/Drawable.js +12 -20
  51. package/dist/esm/rendering/Drawable.js.map +1 -1
  52. package/dist/esm/rendering/RenderBackend.d.ts +18 -0
  53. package/dist/esm/rendering/RenderNode.d.ts +81 -8
  54. package/dist/esm/rendering/RenderNode.js +121 -144
  55. package/dist/esm/rendering/RenderNode.js.map +1 -1
  56. package/dist/esm/rendering/RenderTarget.d.ts +13 -0
  57. package/dist/esm/rendering/RenderTarget.js +13 -0
  58. package/dist/esm/rendering/RenderTarget.js.map +1 -1
  59. package/dist/esm/rendering/RenderTargetPass.js +17 -0
  60. package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
  61. package/dist/esm/rendering/RenderingContext.d.ts +87 -0
  62. package/dist/esm/rendering/RenderingContext.js +157 -0
  63. package/dist/esm/rendering/RenderingContext.js.map +1 -0
  64. package/dist/esm/rendering/TransformBuffer.d.ts +38 -0
  65. package/dist/esm/rendering/TransformBuffer.js +116 -0
  66. package/dist/esm/rendering/TransformBuffer.js.map +1 -0
  67. package/dist/esm/rendering/filters/WebGpuShaderFilter.js +5 -12
  68. package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -1
  69. package/dist/esm/rendering/geometry/Geometry.d.ts +40 -0
  70. package/dist/esm/rendering/geometry/Geometry.js +228 -0
  71. package/dist/esm/rendering/geometry/Geometry.js.map +1 -0
  72. package/dist/esm/rendering/geometry/GeometryAttribute.d.ts +32 -0
  73. package/dist/esm/rendering/geometry/QuadGeometry.d.ts +5 -0
  74. package/dist/esm/rendering/gradient/Gradient.d.ts +34 -0
  75. package/dist/esm/rendering/gradient/Gradient.js +114 -0
  76. package/dist/esm/rendering/gradient/Gradient.js.map +1 -0
  77. package/dist/esm/rendering/gradient/LinearGradient.d.ts +10 -0
  78. package/dist/esm/rendering/gradient/LinearGradient.js +26 -0
  79. package/dist/esm/rendering/gradient/LinearGradient.js.map +1 -0
  80. package/dist/esm/rendering/gradient/RadialGradient.d.ts +10 -0
  81. package/dist/esm/rendering/gradient/RadialGradient.js +25 -0
  82. package/dist/esm/rendering/gradient/RadialGradient.js.map +1 -0
  83. package/dist/esm/rendering/index.d.ts +16 -2
  84. package/dist/esm/rendering/material/Material.d.ts +114 -0
  85. package/dist/esm/rendering/material/Material.js +111 -0
  86. package/dist/esm/rendering/material/Material.js.map +1 -0
  87. package/dist/esm/rendering/material/MaterialKey.d.ts +18 -0
  88. package/dist/esm/rendering/material/MaterialKey.js +82 -0
  89. package/dist/esm/rendering/material/MaterialKey.js.map +1 -0
  90. package/dist/esm/rendering/material/MeshMaterial.d.ts +16 -0
  91. package/dist/esm/rendering/material/MeshMaterial.js +21 -0
  92. package/dist/esm/rendering/material/MeshMaterial.js.map +1 -0
  93. package/dist/esm/rendering/{mesh/MeshShader.d.ts → material/ShaderSource.d.ts} +29 -62
  94. package/dist/esm/rendering/{mesh/MeshShader.js → material/ShaderSource.js} +35 -62
  95. package/dist/esm/rendering/material/ShaderSource.js.map +1 -0
  96. package/dist/esm/rendering/material/SpriteMaterial.d.ts +15 -0
  97. package/dist/esm/rendering/material/SpriteMaterial.js +20 -0
  98. package/dist/esm/rendering/material/SpriteMaterial.js.map +1 -0
  99. package/dist/esm/rendering/mesh/Mesh.d.ts +29 -12
  100. package/dist/esm/rendering/mesh/Mesh.js +122 -3
  101. package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
  102. package/dist/esm/rendering/pass/RenderPassCoordinator.d.ts +63 -0
  103. package/dist/esm/rendering/pass/RenderPassDescriptor.d.ts +48 -0
  104. package/dist/esm/rendering/pass/RenderPassDescriptor.js +16 -0
  105. package/dist/esm/rendering/pass/RenderPassDescriptor.js.map +1 -0
  106. package/dist/esm/rendering/plan/RenderCommand.d.ts +67 -0
  107. package/dist/esm/rendering/plan/RenderCommand.js +94 -0
  108. package/dist/esm/rendering/plan/RenderCommand.js.map +1 -0
  109. package/dist/esm/rendering/plan/RenderEffectExecutor.d.ts +10 -0
  110. package/dist/esm/rendering/plan/RenderEffectExecutor.js +159 -0
  111. package/dist/esm/rendering/plan/RenderEffectExecutor.js.map +1 -0
  112. package/dist/esm/rendering/plan/RenderPlan.d.ts +23 -0
  113. package/dist/esm/rendering/plan/RenderPlan.js +12 -0
  114. package/dist/esm/rendering/plan/RenderPlan.js.map +1 -0
  115. package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts +31 -0
  116. package/dist/esm/rendering/plan/RenderPlanBuilder.js +242 -0
  117. package/dist/esm/rendering/plan/RenderPlanBuilder.js.map +1 -0
  118. package/dist/esm/rendering/plan/RenderPlanOptimizer.d.ts +10 -0
  119. package/dist/esm/rendering/plan/RenderPlanOptimizer.js +180 -0
  120. package/dist/esm/rendering/plan/RenderPlanOptimizer.js.map +1 -0
  121. package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts +9 -0
  122. package/dist/esm/rendering/plan/RenderPlanPlayer.js +56 -0
  123. package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -0
  124. package/dist/esm/rendering/plan/RenderScope.d.ts +70 -0
  125. package/dist/esm/rendering/plan/RenderScope.js +16 -0
  126. package/dist/esm/rendering/plan/RenderScope.js.map +1 -0
  127. package/dist/esm/rendering/plan/playRenderTree.d.ts +4 -0
  128. package/dist/esm/rendering/plan/playRenderTree.js +19 -0
  129. package/dist/esm/rendering/plan/playRenderTree.js.map +1 -0
  130. package/dist/esm/rendering/sprite/Sprite.d.ts +22 -1
  131. package/dist/esm/rendering/sprite/Sprite.js +33 -2
  132. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  133. package/dist/esm/rendering/sprite/spriteMaterialSources.d.ts +36 -0
  134. package/dist/esm/rendering/sprite/spriteMaterialSources.js +128 -0
  135. package/dist/esm/rendering/sprite/spriteMaterialSources.js.map +1 -0
  136. package/dist/esm/rendering/text/TextStyle.d.ts +1 -1
  137. package/dist/esm/rendering/texture/DataTexture.d.ts +5 -0
  138. package/dist/esm/rendering/texture/DataTexture.js +7 -0
  139. package/dist/esm/rendering/texture/DataTexture.js.map +1 -1
  140. package/dist/esm/rendering/video/Video.d.ts +3 -7
  141. package/dist/esm/rendering/video/Video.js +3 -8
  142. package/dist/esm/rendering/video/Video.js.map +1 -1
  143. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +40 -0
  144. package/dist/esm/rendering/webgl2/WebGl2Backend.js +303 -22
  145. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  146. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +22 -2
  147. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +404 -112
  148. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
  149. package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.d.ts +57 -0
  150. package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js +79 -0
  151. package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js.map +1 -0
  152. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +12 -0
  153. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +214 -58
  154. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
  155. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.d.ts +34 -0
  156. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js +169 -0
  157. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js.map +1 -0
  158. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +4 -0
  159. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -1
  160. package/dist/esm/rendering/webgl2/glsl/mesh.frag.js +1 -1
  161. package/dist/esm/rendering/webgl2/glsl/mesh.vert.js +1 -1
  162. package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js +4 -0
  163. package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js.map +1 -0
  164. package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js +4 -0
  165. package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js.map +1 -0
  166. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +50 -0
  167. package/dist/esm/rendering/webgpu/WebGpuBackend.js +135 -19
  168. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  169. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +22 -17
  170. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -1
  171. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +24 -0
  172. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +488 -74
  173. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
  174. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +13 -17
  175. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
  176. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.d.ts +141 -0
  177. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js +270 -0
  178. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js.map +1 -0
  179. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +16 -0
  180. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +335 -26
  181. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
  182. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts +57 -0
  183. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js +257 -0
  184. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js.map +1 -0
  185. package/dist/esm/rendering/webgpu/WebGpuStencilState.d.ts +14 -0
  186. package/dist/esm/rendering/webgpu/WebGpuStencilState.js +36 -0
  187. package/dist/esm/rendering/webgpu/WebGpuStencilState.js.map +1 -0
  188. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +14 -12
  189. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -1
  190. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +16 -0
  191. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +57 -0
  192. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -0
  193. package/dist/esm/resources/JsonStore.d.ts +18 -0
  194. package/dist/esm/resources/JsonStore.js +62 -0
  195. package/dist/esm/resources/JsonStore.js.map +1 -0
  196. package/dist/esm/resources/factories/ImageFactory.d.ts +14 -8
  197. package/dist/esm/resources/factories/ImageFactory.js +13 -6
  198. package/dist/esm/resources/factories/ImageFactory.js.map +1 -1
  199. package/dist/esm/resources/factories/TextureFactory.d.ts +4 -4
  200. package/dist/esm/resources/factories/TextureFactory.js +8 -4
  201. package/dist/esm/resources/factories/TextureFactory.js.map +1 -1
  202. package/dist/esm/resources/index.d.ts +1 -0
  203. package/dist/exo.esm.js +5424 -2205
  204. package/dist/exo.esm.js.map +1 -1
  205. package/package.json +30 -24
  206. package/dist/esm/particles/distributions/Gradient.js.map +0 -1
  207. package/dist/esm/rendering/mesh/MeshShader.js.map +0 -1
  208. package/dist/esm/vendor/webgl-debug.js +0 -1160
  209. 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
  }