@zephyr3d/scene 0.9.21 → 0.9.23

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 (238) hide show
  1. package/dist/animation/joint_dynamics/collision.js +1 -7
  2. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  3. package/dist/animation/joint_dynamics/constraints.js +2 -17
  4. package/dist/animation/joint_dynamics/constraints.js.map +1 -1
  5. package/dist/animation/joint_dynamics/controller.js +2 -20
  6. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  7. package/dist/animation/joint_dynamics/joint_dynamics_system.js +1 -3
  8. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  9. package/dist/animation/joint_dynamics/solver.js +14 -60
  10. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  11. package/dist/animation/joint_dynamics/types.js +3 -3
  12. package/dist/animation/joint_dynamics/types.js.map +1 -1
  13. package/dist/app/app.js +23 -0
  14. package/dist/app/app.js.map +1 -1
  15. package/dist/app/scriptregistry.js +16 -53
  16. package/dist/app/scriptregistry.js.map +1 -1
  17. package/dist/asset/assetmanager.js +2 -0
  18. package/dist/asset/assetmanager.js.map +1 -1
  19. package/dist/asset/model.js +22 -0
  20. package/dist/asset/model.js.map +1 -1
  21. package/dist/blitter/bilateralblur.js +3 -1
  22. package/dist/blitter/bilateralblur.js.map +1 -1
  23. package/dist/blitter/blitter.js +3 -3
  24. package/dist/blitter/blitter.js.map +1 -1
  25. package/dist/camera/camera.js +398 -45
  26. package/dist/camera/camera.js.map +1 -1
  27. package/dist/camera/perspectivecamera.js +69 -2
  28. package/dist/camera/perspectivecamera.js.map +1 -1
  29. package/dist/index.d.ts +9100 -8712
  30. package/dist/index.js +9 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/material/blinn.js +1 -1
  33. package/dist/material/blinn.js.map +1 -1
  34. package/dist/material/lambert.js +3 -3
  35. package/dist/material/lambert.js.map +1 -1
  36. package/dist/material/material.js +8 -5
  37. package/dist/material/material.js.map +1 -1
  38. package/dist/material/meshmaterial.js +17 -10
  39. package/dist/material/meshmaterial.js.map +1 -1
  40. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  41. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  42. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  43. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  44. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +21 -6
  45. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  46. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +1 -1
  47. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  48. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +1 -1
  49. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  50. package/dist/material/mixins/lit.js +33 -11
  51. package/dist/material/mixins/lit.js.map +1 -1
  52. package/dist/material/mixins/pbr/brdf.js +44 -12
  53. package/dist/material/mixins/pbr/brdf.js.map +1 -1
  54. package/dist/material/mixins/pbr/common.js +149 -14
  55. package/dist/material/mixins/pbr/common.js.map +1 -1
  56. package/dist/material/mtoon.js +7 -4
  57. package/dist/material/mtoon.js.map +1 -1
  58. package/dist/material/pbrblueprint.js +5 -1
  59. package/dist/material/pbrblueprint.js.map +1 -1
  60. package/dist/material/pbrmr.js +1 -1
  61. package/dist/material/pbrmr.js.map +1 -1
  62. package/dist/material/pbrsg.js +1 -1
  63. package/dist/material/pbrsg.js.map +1 -1
  64. package/dist/material/shader/helper.js +186 -11
  65. package/dist/material/shader/helper.js.map +1 -1
  66. package/dist/material/skin.js +2 -2
  67. package/dist/material/skin.js.map +1 -1
  68. package/dist/material/terrain-cm.js +5 -5
  69. package/dist/material/terrain-cm.js.map +1 -1
  70. package/dist/material/water.js +6 -4
  71. package/dist/material/water.js.map +1 -1
  72. package/dist/posteffect/bloom.js +54 -4
  73. package/dist/posteffect/bloom.js.map +1 -1
  74. package/dist/posteffect/compositor.js +41 -0
  75. package/dist/posteffect/compositor.js.map +1 -1
  76. package/dist/posteffect/posteffect.js +51 -0
  77. package/dist/posteffect/posteffect.js.map +1 -1
  78. package/dist/posteffect/sao.js +7 -6
  79. package/dist/posteffect/sao.js.map +1 -1
  80. package/dist/posteffect/skinsss.js +3 -3
  81. package/dist/posteffect/skinsss.js.map +1 -1
  82. package/dist/posteffect/ssgi.js +1196 -0
  83. package/dist/posteffect/ssgi.js.map +1 -0
  84. package/dist/posteffect/ssr.js +83 -45
  85. package/dist/posteffect/ssr.js.map +1 -1
  86. package/dist/posteffect/sss.js +137 -49
  87. package/dist/posteffect/sss.js.map +1 -1
  88. package/dist/posteffect/taa.js +5 -4
  89. package/dist/posteffect/taa.js.map +1 -1
  90. package/dist/posteffect/tonemap.js +15 -3
  91. package/dist/posteffect/tonemap.js.map +1 -1
  92. package/dist/render/abuffer_oit.js +2 -2
  93. package/dist/render/abuffer_oit.js.map +1 -1
  94. package/dist/render/cluster_light.js +12 -6
  95. package/dist/render/cluster_light.js.map +1 -1
  96. package/dist/render/drawable_mixin.js +8 -5
  97. package/dist/render/drawable_mixin.js.map +1 -1
  98. package/dist/render/dualdepthpeeling_oit.js +10 -5
  99. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  100. package/dist/render/envlight.js +298 -5
  101. package/dist/render/envlight.js.map +1 -1
  102. package/dist/render/gpu_picking.js +7 -5
  103. package/dist/render/gpu_picking.js.map +1 -1
  104. package/dist/render/hzb.js +28 -19
  105. package/dist/render/hzb.js.map +1 -1
  106. package/dist/render/lightpass.js +18 -4
  107. package/dist/render/lightpass.js.map +1 -1
  108. package/dist/render/render_queue.js +37 -4
  109. package/dist/render/render_queue.js.map +1 -1
  110. package/dist/render/renderer.js +8 -3
  111. package/dist/render/renderer.js.map +1 -1
  112. package/dist/render/rendergraph/blackboard.js +20 -48
  113. package/dist/render/rendergraph/blackboard.js.map +1 -1
  114. package/dist/render/rendergraph/device_pool_allocator.js +18 -58
  115. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  116. package/dist/render/rendergraph/executor.js +89 -115
  117. package/dist/render/rendergraph/executor.js.map +1 -1
  118. package/dist/render/rendergraph/forward_plus_builder.js +1003 -715
  119. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  120. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  121. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  122. package/dist/render/rendergraph/frame_resource_requirements.js +14 -0
  123. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -0
  124. package/dist/render/rendergraph/history_resource_manager.js +74 -140
  125. package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
  126. package/dist/render/rendergraph/history_resources.js +7 -5
  127. package/dist/render/rendergraph/history_resources.js.map +1 -1
  128. package/dist/render/rendergraph/render_context.js +19 -0
  129. package/dist/render/rendergraph/render_context.js.map +1 -0
  130. package/dist/render/rendergraph/render_pipeline.js +315 -0
  131. package/dist/render/rendergraph/render_pipeline.js.map +1 -0
  132. package/dist/render/rendergraph/rendergraph.js +158 -141
  133. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  134. package/dist/render/rendergraph/scene_render_context.js +267 -0
  135. package/dist/render/rendergraph/scene_render_context.js.map +1 -0
  136. package/dist/render/rendergraph/texture_affinity_cache.js +19 -0
  137. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -0
  138. package/dist/render/rendergraph/types.js +19 -31
  139. package/dist/render/rendergraph/types.js.map +1 -1
  140. package/dist/render/renderpass.js +3 -3
  141. package/dist/render/renderpass.js.map +1 -1
  142. package/dist/render/shadow_mask_pass.js +10 -6
  143. package/dist/render/shadow_mask_pass.js.map +1 -1
  144. package/dist/render/sky.js +197 -35
  145. package/dist/render/sky.js.map +1 -1
  146. package/dist/render/weightedblended_oit.js +4 -3
  147. package/dist/render/weightedblended_oit.js.map +1 -1
  148. package/dist/scene/basesprite.js +2 -0
  149. package/dist/scene/basesprite.js.map +1 -1
  150. package/dist/scene/batchgroup.js +10 -0
  151. package/dist/scene/batchgroup.js.map +1 -1
  152. package/dist/scene/environment.js +61 -2
  153. package/dist/scene/environment.js.map +1 -1
  154. package/dist/scene/light.js +178 -10
  155. package/dist/scene/light.js.map +1 -1
  156. package/dist/scene/meshdrawable.js +89 -2
  157. package/dist/scene/meshdrawable.js.map +1 -1
  158. package/dist/scene/msdftext.js +2 -0
  159. package/dist/scene/msdftext.js.map +1 -1
  160. package/dist/scene/msdftextsprite.js +2 -0
  161. package/dist/scene/msdftextsprite.js.map +1 -1
  162. package/dist/scene/particlesys.js +2 -0
  163. package/dist/scene/particlesys.js.map +1 -1
  164. package/dist/scene/scene.js +34 -1
  165. package/dist/scene/scene.js.map +1 -1
  166. package/dist/scene/terrain-cm/grass.js +2 -1
  167. package/dist/scene/terrain-cm/grass.js.map +1 -1
  168. package/dist/scene/terrain-cm/terrain-cm.js +2 -0
  169. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  170. package/dist/scene/water.js +2 -0
  171. package/dist/scene/water.js.map +1 -1
  172. package/dist/shaders/atmosphere.js +5 -4
  173. package/dist/shaders/atmosphere.js.map +1 -1
  174. package/dist/shaders/fog.js +10 -3
  175. package/dist/shaders/fog.js.map +1 -1
  176. package/dist/shaders/shadow.js +96 -29
  177. package/dist/shaders/shadow.js.map +1 -1
  178. package/dist/shaders/ssgi.js +63 -0
  179. package/dist/shaders/ssgi.js.map +1 -0
  180. package/dist/shaders/ssgi_reprojection.js +118 -0
  181. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  182. package/dist/shaders/ssr.js +322 -154
  183. package/dist/shaders/ssr.js.map +1 -1
  184. package/dist/shadow/esm.js +13 -8
  185. package/dist/shadow/esm.js.map +1 -1
  186. package/dist/shadow/pcf_opt.js +15 -12
  187. package/dist/shadow/pcf_opt.js.map +1 -1
  188. package/dist/shadow/pcf_pd.js +15 -12
  189. package/dist/shadow/pcf_pd.js.map +1 -1
  190. package/dist/shadow/pcss.js +17 -11
  191. package/dist/shadow/pcss.js.map +1 -1
  192. package/dist/shadow/shadow_impl.js +20 -2
  193. package/dist/shadow/shadow_impl.js.map +1 -1
  194. package/dist/shadow/shadowmapper.js +10 -3
  195. package/dist/shadow/shadowmapper.js.map +1 -1
  196. package/dist/shadow/ssm.js +16 -13
  197. package/dist/shadow/ssm.js.map +1 -1
  198. package/dist/shadow/vsm.js +10 -8
  199. package/dist/shadow/vsm.js.map +1 -1
  200. package/dist/utility/physical.js +74 -0
  201. package/dist/utility/physical.js.map +1 -0
  202. package/dist/utility/rendermipmap.js +2 -2
  203. package/dist/utility/rendermipmap.js.map +1 -1
  204. package/dist/utility/serialization/manager.js +3 -1
  205. package/dist/utility/serialization/manager.js.map +1 -1
  206. package/dist/utility/serialization/scene/animation.js +3 -1
  207. package/dist/utility/serialization/scene/animation.js.map +1 -1
  208. package/dist/utility/serialization/scene/batch.js +3 -1
  209. package/dist/utility/serialization/scene/batch.js.map +1 -1
  210. package/dist/utility/serialization/scene/camera.js +598 -2
  211. package/dist/utility/serialization/scene/camera.js.map +1 -1
  212. package/dist/utility/serialization/scene/light.js +180 -9
  213. package/dist/utility/serialization/scene/light.js.map +1 -1
  214. package/dist/utility/serialization/scene/material.js +43 -3
  215. package/dist/utility/serialization/scene/material.js.map +1 -1
  216. package/dist/utility/serialization/scene/mesh.js +3 -1
  217. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  218. package/dist/utility/serialization/scene/node.js +3 -1
  219. package/dist/utility/serialization/scene/node.js.map +1 -1
  220. package/dist/utility/serialization/scene/particle.js +3 -1
  221. package/dist/utility/serialization/scene/particle.js.map +1 -1
  222. package/dist/utility/serialization/scene/primitive.js +2 -0
  223. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  224. package/dist/utility/serialization/scene/scene.js +70 -0
  225. package/dist/utility/serialization/scene/scene.js.map +1 -1
  226. package/dist/utility/serialization/scene/sprite.js +3 -1
  227. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  228. package/dist/utility/serialization/scene/terrain.js +3 -1
  229. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  230. package/dist/utility/serialization/scene/text.js +3 -0
  231. package/dist/utility/serialization/scene/text.js.map +1 -1
  232. package/dist/utility/serialization/scene/water.js +3 -1
  233. package/dist/utility/serialization/scene/water.js.map +1 -1
  234. package/dist/values.js +2 -3
  235. package/dist/values.js.map +1 -1
  236. package/package.json +3 -3
  237. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  238. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -0,0 +1,315 @@
1
+ import { mergeFrameResourceRequirements } from './frame_resource_requirements.js';
2
+
3
+ /**
4
+ * Resolve module dependencies with authored order as the stable default.
5
+ * @throws If the declared dependencies form a cycle.
6
+ * @public
7
+ */ function resolveModuleOrder(modules) {
8
+ const n = modules.length;
9
+ const prereqs = modules.map(()=>new Set());
10
+ const findWriter = (resource, reader, version)=>{
11
+ const start = version === 'current' ? reader - 1 : n - 1;
12
+ for(let i = start; i >= 0; i--){
13
+ if (i !== reader && modules[i].writes?.includes(resource)) {
14
+ return i;
15
+ }
16
+ }
17
+ return -1;
18
+ };
19
+ for(let reader = 0; reader < n; reader++){
20
+ const r = modules[reader].reads;
21
+ if (!r) {
22
+ continue;
23
+ }
24
+ for (const declaredRead of r){
25
+ const read = declaredRead;
26
+ const version = read.version ?? 'current';
27
+ const producer = findWriter(read.resource, reader, version);
28
+ if (producer >= 0) {
29
+ prereqs[reader].add(producer);
30
+ } else if (!read.optional) {
31
+ throw new Error(`RenderPipeline: module "${modules[reader].type}" requires ${version} resource ` + `"${read.resource}", but no matching enabled writer exists`);
32
+ }
33
+ }
34
+ }
35
+ // Prefer the earliest authored module among ready nodes.
36
+ const emitted = new Array(n).fill(false);
37
+ const order = [];
38
+ for(let placed = 0; placed < n; placed++){
39
+ let next = -1;
40
+ for(let i = 0; i < n; i++){
41
+ if (emitted[i]) {
42
+ continue;
43
+ }
44
+ let ready = true;
45
+ for (const p of prereqs[i]){
46
+ if (!emitted[p]) {
47
+ ready = false;
48
+ break;
49
+ }
50
+ }
51
+ if (ready) {
52
+ next = i;
53
+ break;
54
+ }
55
+ }
56
+ if (next < 0) {
57
+ const stuck = modules.filter((_, i)=>!emitted[i]).map((m)=>m.type).join(' -> ');
58
+ throw new Error(`RenderPipeline: cyclic module dependency among [${stuck}]`);
59
+ }
60
+ emitted[next] = true;
61
+ order.push(modules[next]);
62
+ }
63
+ return order;
64
+ }
65
+ /** Ordered, editable collection of uniquely named render modules. @public */ class RenderPipeline {
66
+ static _moduleOwners = new WeakMap();
67
+ static _disposedModules = new WeakSet();
68
+ _modules;
69
+ _disposed = false;
70
+ /**
71
+ * @param modules - Initial ordered modules. Copied into the pipeline; the
72
+ * array is not retained. Duplicate `type` values are rejected.
73
+ */ constructor(modules){
74
+ this._modules = [];
75
+ try {
76
+ if (modules) {
77
+ for (const m of modules){
78
+ this.append(m);
79
+ }
80
+ }
81
+ } catch (error) {
82
+ try {
83
+ this.dispose();
84
+ } catch {
85
+ // Preserve the construction error.
86
+ }
87
+ throw error;
88
+ }
89
+ }
90
+ /** The pipeline's modules in authored order. */ get modules() {
91
+ return this._modules;
92
+ }
93
+ /** Whether this pipeline and its owned modules have been disposed. */ get disposed() {
94
+ return this._disposed;
95
+ }
96
+ /** Whether a module type is present. */ has(type) {
97
+ return this._indexOf(type) >= 0;
98
+ }
99
+ /** Return a module by type, or undefined. */ get(type) {
100
+ const i = this._indexOf(type);
101
+ return i >= 0 ? this._modules[i] : undefined;
102
+ }
103
+ /** Append a module. */ append(module) {
104
+ this._assertMutable();
105
+ this._assertAbsent(module.type);
106
+ this._modules.push(module);
107
+ try {
108
+ this._attachModule(module);
109
+ } catch (error) {
110
+ this._modules.pop();
111
+ throw error;
112
+ }
113
+ return this;
114
+ }
115
+ /** Prepend a module. */ prepend(module) {
116
+ this._assertMutable();
117
+ this._assertAbsent(module.type);
118
+ this._modules.unshift(module);
119
+ try {
120
+ this._attachModule(module);
121
+ } catch (error) {
122
+ this._modules.shift();
123
+ throw error;
124
+ }
125
+ return this;
126
+ }
127
+ /** Insert a module before the named anchor. */ insertBefore(anchor, module) {
128
+ this._assertMutable();
129
+ this._assertAbsent(module.type);
130
+ const index = this._requireIndex(anchor);
131
+ this._modules.splice(index, 0, module);
132
+ try {
133
+ this._attachModule(module);
134
+ } catch (error) {
135
+ this._modules.splice(index, 1);
136
+ throw error;
137
+ }
138
+ return this;
139
+ }
140
+ /** Insert a module after the named anchor. */ insertAfter(anchor, module) {
141
+ this._assertMutable();
142
+ this._assertAbsent(module.type);
143
+ const index = this._requireIndex(anchor) + 1;
144
+ this._modules.splice(index, 0, module);
145
+ try {
146
+ this._attachModule(module);
147
+ } catch (error) {
148
+ this._modules.splice(index, 1);
149
+ throw error;
150
+ }
151
+ return this;
152
+ }
153
+ /** Replace a module in place. The previous module is detached but not disposed. */ replace(anchor, module) {
154
+ this._assertMutable();
155
+ const i = this._requireIndex(anchor);
156
+ if (module.type !== this._modules[i].type) {
157
+ this._assertAbsent(module.type);
158
+ }
159
+ const previous = this._modules[i];
160
+ if (previous === module) {
161
+ return this;
162
+ }
163
+ this._modules[i] = module;
164
+ try {
165
+ this._attachModule(module);
166
+ } catch (error) {
167
+ this._modules[i] = previous;
168
+ throw error;
169
+ }
170
+ this._detachModule(previous);
171
+ return this;
172
+ }
173
+ /** Remove a module by type or instance. The module is detached but not disposed. */ remove(anchor) {
174
+ this._assertMutable();
175
+ const [module] = this._modules.splice(this._requireIndex(anchor), 1);
176
+ this._detachModule(module);
177
+ return this;
178
+ }
179
+ /** Dispose a detached module explicitly. */ disposeModule(module) {
180
+ this._disposeModule(module);
181
+ }
182
+ /** Clone the pipeline; lifecycle-aware modules must implement `clone`. */ clone() {
183
+ this._assertMutable();
184
+ const modules = this._modules.map((module)=>{
185
+ if (module.clone) {
186
+ return module.clone();
187
+ }
188
+ if (module.attach || module.detach || module.dispose) {
189
+ throw new Error(`RenderPipeline: stateful module "${module.type}" must implement clone() ` + `to be copied safely`);
190
+ }
191
+ return module;
192
+ });
193
+ return new RenderPipeline(modules);
194
+ }
195
+ /** Detach and dispose every owned module. Idempotent. */ dispose() {
196
+ if (this._disposed) {
197
+ return;
198
+ }
199
+ this._disposed = true;
200
+ const modules = this._modules.splice(0).reverse();
201
+ const errors = [];
202
+ for (const module of modules){
203
+ try {
204
+ this._releaseModule(module);
205
+ } catch (error) {
206
+ errors.push(error);
207
+ }
208
+ }
209
+ if (errors.length > 0) {
210
+ const error = new Error('RenderPipeline: one or more modules failed to dispose');
211
+ error.errors = errors;
212
+ throw error;
213
+ }
214
+ }
215
+ /** Resolve enabled modules into their setup order for the given context. */ resolveModules(context) {
216
+ this._assertMutable();
217
+ return resolveModuleOrder(this._modules.filter((module)=>module.prepare(context).enabled));
218
+ }
219
+ /** Collect requirements before module setup. @internal */ collectRequirements(context) {
220
+ this._assertMutable();
221
+ const requirements = {};
222
+ for (const module of this._modules){
223
+ mergeFrameResourceRequirements(requirements, module.prepare(context).requirements);
224
+ }
225
+ return requirements;
226
+ }
227
+ /** Build enabled modules in dependency order. @internal */ build(context) {
228
+ this._assertMutable();
229
+ for (const module of this.resolveModules(context)){
230
+ module.setup(context);
231
+ }
232
+ }
233
+ _indexOf(type) {
234
+ for(let i = 0; i < this._modules.length; i++){
235
+ if (this._modules[i].type === type) {
236
+ return i;
237
+ }
238
+ }
239
+ return -1;
240
+ }
241
+ _requireIndex(anchor) {
242
+ const i = typeof anchor === 'string' ? this._indexOf(anchor) : this._modules.indexOf(anchor);
243
+ if (i < 0) {
244
+ throw new Error(`RenderPipeline: no module with type "${typeof anchor === 'string' ? anchor : anchor.type}"`);
245
+ }
246
+ return i;
247
+ }
248
+ _assertAbsent(type) {
249
+ if (this._indexOf(type) >= 0) {
250
+ throw new Error(`RenderPipeline: a module with type "${type}" already exists`);
251
+ }
252
+ }
253
+ _releaseModule(module) {
254
+ const errors = [];
255
+ try {
256
+ this._detachModule(module);
257
+ } catch (error) {
258
+ errors.push(error);
259
+ }
260
+ try {
261
+ this._disposeModule(module);
262
+ } catch (error) {
263
+ errors.push(error);
264
+ }
265
+ if (errors.length === 1) {
266
+ throw errors[0];
267
+ }
268
+ if (errors.length > 1) {
269
+ const error = new Error(`RenderPipeline: module "${module.type}" failed to release`);
270
+ error.errors = errors;
271
+ throw error;
272
+ }
273
+ }
274
+ _detachModule(module) {
275
+ if (RenderPipeline._moduleOwners.get(module) === this) {
276
+ RenderPipeline._moduleOwners.delete(module);
277
+ }
278
+ module.detach?.(this);
279
+ }
280
+ _disposeModule(module) {
281
+ if (module.dispose && !RenderPipeline._disposedModules.has(module)) {
282
+ RenderPipeline._disposedModules.add(module);
283
+ module.dispose();
284
+ }
285
+ }
286
+ _attachModule(module) {
287
+ if (module.dispose && RenderPipeline._disposedModules.has(module)) {
288
+ throw new Error(`RenderPipeline: disposed module "${module.type}" cannot be attached again`);
289
+ }
290
+ const stateful = !!(module.attach || module.detach || module.dispose || module.clone);
291
+ if (stateful) {
292
+ const owner = RenderPipeline._moduleOwners.get(module);
293
+ if (owner && owner !== this) {
294
+ throw new Error(`RenderPipeline: stateful module "${module.type}" already belongs to another pipeline; ` + `use module.clone() or pipeline.clone()`);
295
+ }
296
+ RenderPipeline._moduleOwners.set(module, this);
297
+ }
298
+ try {
299
+ module.attach?.(this);
300
+ } catch (error) {
301
+ if (RenderPipeline._moduleOwners.get(module) === this) {
302
+ RenderPipeline._moduleOwners.delete(module);
303
+ }
304
+ throw error;
305
+ }
306
+ }
307
+ _assertMutable() {
308
+ if (this._disposed) {
309
+ throw new Error('RenderPipeline: pipeline has been disposed');
310
+ }
311
+ }
312
+ }
313
+
314
+ export { RenderPipeline, resolveModuleOrder };
315
+ //# sourceMappingURL=render_pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render_pipeline.js","sources":["../../../src/render/rendergraph/render_pipeline.ts"],"sourcesContent":["import type { RenderModule, RenderModuleReadDescriptor } from './render_module';\r\nimport type { RenderContext } from './render_context';\r\nimport type { FrameResourceRequirements } from './frame_resource_requirements';\r\nimport { mergeFrameResourceRequirements } from './frame_resource_requirements';\r\nimport type { FrameResourceKey } from './blackboard';\r\n\r\n/**\r\n * Resolve module dependencies with authored order as the stable default.\r\n * @throws If the declared dependencies form a cycle.\r\n * @public\r\n */\r\nexport function resolveModuleOrder<T extends RenderModule<any>>(modules: readonly T[]): T[] {\r\n const n = modules.length;\r\n const prereqs: Set<number>[] = modules.map(() => new Set<number>());\r\n const findWriter = (resource: FrameResourceKey, reader: number, version: 'current' | 'final') => {\r\n const start = version === 'current' ? reader - 1 : n - 1;\r\n for (let i = start; i >= 0; i--) {\r\n if (i !== reader && modules[i].writes?.includes(resource)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n };\r\n for (let reader = 0; reader < n; reader++) {\r\n const r = modules[reader].reads;\r\n if (!r) {\r\n continue;\r\n }\r\n for (const declaredRead of r) {\r\n const read: RenderModuleReadDescriptor = declaredRead;\r\n const version = read.version ?? 'current';\r\n const producer = findWriter(read.resource, reader, version);\r\n if (producer >= 0) {\r\n prereqs[reader].add(producer);\r\n } else if (!read.optional) {\r\n throw new Error(\r\n `RenderPipeline: module \"${modules[reader].type}\" requires ${version} resource ` +\r\n `\"${read.resource}\", but no matching enabled writer exists`\r\n );\r\n }\r\n }\r\n }\r\n // Prefer the earliest authored module among ready nodes.\r\n const emitted: boolean[] = new Array(n).fill(false);\r\n const order: T[] = [];\r\n for (let placed = 0; placed < n; placed++) {\r\n let next = -1;\r\n for (let i = 0; i < n; i++) {\r\n if (emitted[i]) {\r\n continue;\r\n }\r\n let ready = true;\r\n for (const p of prereqs[i]) {\r\n if (!emitted[p]) {\r\n ready = false;\r\n break;\r\n }\r\n }\r\n if (ready) {\r\n next = i;\r\n break;\r\n }\r\n }\r\n if (next < 0) {\r\n const stuck = modules\r\n .filter((_, i) => !emitted[i])\r\n .map((m) => m.type)\r\n .join(' -> ');\r\n throw new Error(`RenderPipeline: cyclic module dependency among [${stuck}]`);\r\n }\r\n emitted[next] = true;\r\n order.push(modules[next]);\r\n }\r\n return order;\r\n}\r\n\r\n/** Ordered, editable collection of uniquely named render modules. @public */\r\nexport class RenderPipeline<TCtx extends RenderContext = RenderContext> {\r\n private static readonly _moduleOwners = new WeakMap<object, RenderPipeline<any>>();\r\n private static readonly _disposedModules = new WeakSet<object>();\r\n private _modules: RenderModule<TCtx>[];\r\n private _disposed = false;\r\n\r\n /**\r\n * @param modules - Initial ordered modules. Copied into the pipeline; the\r\n * array is not retained. Duplicate `type` values are rejected.\r\n */\r\n constructor(modules?: readonly RenderModule<TCtx>[]) {\r\n this._modules = [];\r\n try {\r\n if (modules) {\r\n for (const m of modules) {\r\n this.append(m);\r\n }\r\n }\r\n } catch (error) {\r\n try {\r\n this.dispose();\r\n } catch {\r\n // Preserve the construction error.\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /** The pipeline's modules in authored order. */\r\n get modules(): readonly RenderModule<TCtx>[] {\r\n return this._modules;\r\n }\r\n\r\n /** Whether this pipeline and its owned modules have been disposed. */\r\n get disposed(): boolean {\r\n return this._disposed;\r\n }\r\n\r\n /** Whether a module type is present. */\r\n has(type: string): boolean {\r\n return this._indexOf(type) >= 0;\r\n }\r\n\r\n /** Return a module by type, or undefined. */\r\n get(type: string): RenderModule<TCtx> | undefined {\r\n const i = this._indexOf(type);\r\n return i >= 0 ? this._modules[i] : undefined;\r\n }\r\n\r\n /** Append a module. */\r\n append(module: RenderModule<TCtx>): this {\r\n this._assertMutable();\r\n this._assertAbsent(module.type);\r\n this._modules.push(module);\r\n try {\r\n this._attachModule(module);\r\n } catch (error) {\r\n this._modules.pop();\r\n throw error;\r\n }\r\n return this;\r\n }\r\n\r\n /** Prepend a module. */\r\n prepend(module: RenderModule<TCtx>): this {\r\n this._assertMutable();\r\n this._assertAbsent(module.type);\r\n this._modules.unshift(module);\r\n try {\r\n this._attachModule(module);\r\n } catch (error) {\r\n this._modules.shift();\r\n throw error;\r\n }\r\n return this;\r\n }\r\n\r\n /** Insert a module before the named anchor. */\r\n insertBefore(anchor: string | RenderModule<TCtx>, module: RenderModule<TCtx>): this {\r\n this._assertMutable();\r\n this._assertAbsent(module.type);\r\n const index = this._requireIndex(anchor);\r\n this._modules.splice(index, 0, module);\r\n try {\r\n this._attachModule(module);\r\n } catch (error) {\r\n this._modules.splice(index, 1);\r\n throw error;\r\n }\r\n return this;\r\n }\r\n\r\n /** Insert a module after the named anchor. */\r\n insertAfter(anchor: string | RenderModule<TCtx>, module: RenderModule<TCtx>): this {\r\n this._assertMutable();\r\n this._assertAbsent(module.type);\r\n const index = this._requireIndex(anchor) + 1;\r\n this._modules.splice(index, 0, module);\r\n try {\r\n this._attachModule(module);\r\n } catch (error) {\r\n this._modules.splice(index, 1);\r\n throw error;\r\n }\r\n return this;\r\n }\r\n\r\n /** Replace a module in place. The previous module is detached but not disposed. */\r\n replace(anchor: string | RenderModule<TCtx>, module: RenderModule<TCtx>): this {\r\n this._assertMutable();\r\n const i = this._requireIndex(anchor);\r\n if (module.type !== this._modules[i].type) {\r\n this._assertAbsent(module.type);\r\n }\r\n const previous = this._modules[i];\r\n if (previous === module) {\r\n return this;\r\n }\r\n this._modules[i] = module;\r\n try {\r\n this._attachModule(module);\r\n } catch (error) {\r\n this._modules[i] = previous;\r\n throw error;\r\n }\r\n this._detachModule(previous);\r\n return this;\r\n }\r\n\r\n /** Remove a module by type or instance. The module is detached but not disposed. */\r\n remove(anchor: string | RenderModule<TCtx>): this {\r\n this._assertMutable();\r\n const [module] = this._modules.splice(this._requireIndex(anchor), 1);\r\n this._detachModule(module);\r\n return this;\r\n }\r\n\r\n /** Dispose a detached module explicitly. */\r\n disposeModule(module: RenderModule<TCtx>): void {\r\n this._disposeModule(module);\r\n }\r\n\r\n /** Clone the pipeline; lifecycle-aware modules must implement `clone`. */\r\n clone(): RenderPipeline<TCtx> {\r\n this._assertMutable();\r\n const modules = this._modules.map((module) => {\r\n if (module.clone) {\r\n return module.clone();\r\n }\r\n if (module.attach || module.detach || module.dispose) {\r\n throw new Error(\r\n `RenderPipeline: stateful module \"${module.type}\" must implement clone() ` + `to be copied safely`\r\n );\r\n }\r\n return module;\r\n });\r\n return new RenderPipeline<TCtx>(modules);\r\n }\r\n\r\n /** Detach and dispose every owned module. Idempotent. */\r\n dispose(): void {\r\n if (this._disposed) {\r\n return;\r\n }\r\n this._disposed = true;\r\n const modules = this._modules.splice(0).reverse();\r\n const errors: unknown[] = [];\r\n for (const module of modules) {\r\n try {\r\n this._releaseModule(module);\r\n } catch (error) {\r\n errors.push(error);\r\n }\r\n }\r\n if (errors.length > 0) {\r\n const error = new Error('RenderPipeline: one or more modules failed to dispose') as Error & {\r\n errors: unknown[];\r\n };\r\n error.errors = errors;\r\n throw error;\r\n }\r\n }\r\n\r\n /** Resolve enabled modules into their setup order for the given context. */\r\n resolveModules(context: TCtx): readonly RenderModule<TCtx>[] {\r\n this._assertMutable();\r\n return resolveModuleOrder(this._modules.filter((module) => module.prepare(context).enabled));\r\n }\r\n\r\n /** Collect requirements before module setup. @internal */\r\n collectRequirements(context: TCtx): FrameResourceRequirements {\r\n this._assertMutable();\r\n const requirements: FrameResourceRequirements = {};\r\n for (const module of this._modules) {\r\n mergeFrameResourceRequirements(requirements, module.prepare(context).requirements);\r\n }\r\n return requirements;\r\n }\r\n\r\n /** Build enabled modules in dependency order. @internal */\r\n build(context: TCtx): void {\r\n this._assertMutable();\r\n for (const module of this.resolveModules(context)) {\r\n module.setup(context);\r\n }\r\n }\r\n\r\n private _indexOf(type: string): number {\r\n for (let i = 0; i < this._modules.length; i++) {\r\n if (this._modules[i].type === type) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n private _requireIndex(anchor: string | RenderModule<TCtx>): number {\r\n const i = typeof anchor === 'string' ? this._indexOf(anchor) : this._modules.indexOf(anchor);\r\n if (i < 0) {\r\n throw new Error(\r\n `RenderPipeline: no module with type \"${typeof anchor === 'string' ? anchor : anchor.type}\"`\r\n );\r\n }\r\n return i;\r\n }\r\n\r\n private _assertAbsent(type: string): void {\r\n if (this._indexOf(type) >= 0) {\r\n throw new Error(`RenderPipeline: a module with type \"${type}\" already exists`);\r\n }\r\n }\r\n\r\n private _releaseModule(module: RenderModule<TCtx>): void {\r\n const errors: unknown[] = [];\r\n try {\r\n this._detachModule(module);\r\n } catch (error) {\r\n errors.push(error);\r\n }\r\n try {\r\n this._disposeModule(module);\r\n } catch (error) {\r\n errors.push(error);\r\n }\r\n if (errors.length === 1) {\r\n throw errors[0];\r\n }\r\n if (errors.length > 1) {\r\n const error = new Error(`RenderPipeline: module \"${module.type}\" failed to release`) as Error & {\r\n errors: unknown[];\r\n };\r\n error.errors = errors;\r\n throw error;\r\n }\r\n }\r\n\r\n private _detachModule(module: RenderModule<TCtx>): void {\r\n if (RenderPipeline._moduleOwners.get(module) === this) {\r\n RenderPipeline._moduleOwners.delete(module);\r\n }\r\n module.detach?.(this);\r\n }\r\n\r\n private _disposeModule(module: RenderModule<TCtx>): void {\r\n if (module.dispose && !RenderPipeline._disposedModules.has(module)) {\r\n RenderPipeline._disposedModules.add(module);\r\n module.dispose();\r\n }\r\n }\r\n\r\n private _attachModule(module: RenderModule<TCtx>): void {\r\n if (module.dispose && RenderPipeline._disposedModules.has(module)) {\r\n throw new Error(`RenderPipeline: disposed module \"${module.type}\" cannot be attached again`);\r\n }\r\n const stateful = !!(module.attach || module.detach || module.dispose || module.clone);\r\n if (stateful) {\r\n const owner = RenderPipeline._moduleOwners.get(module);\r\n if (owner && owner !== this) {\r\n throw new Error(\r\n `RenderPipeline: stateful module \"${module.type}\" already belongs to another pipeline; ` +\r\n `use module.clone() or pipeline.clone()`\r\n );\r\n }\r\n RenderPipeline._moduleOwners.set(module, this);\r\n }\r\n try {\r\n module.attach?.(this);\r\n } catch (error) {\r\n if (RenderPipeline._moduleOwners.get(module) === this) {\r\n RenderPipeline._moduleOwners.delete(module);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n private _assertMutable(): void {\r\n if (this._disposed) {\r\n throw new Error('RenderPipeline: pipeline has been disposed');\r\n }\r\n }\r\n}\r\n"],"names":["resolveModuleOrder","modules","n","length","prereqs","map","Set","findWriter","resource","reader","version","start","i","writes","includes","r","reads","declaredRead","read","producer","add","optional","Error","type","emitted","Array","fill","order","placed","next","ready","p","stuck","filter","_","m","join","push","RenderPipeline","_moduleOwners","WeakMap","_disposedModules","WeakSet","_modules","_disposed","append","error","dispose","disposed","has","_indexOf","get","undefined","module","_assertMutable","_assertAbsent","_attachModule","pop","prepend","unshift","shift","insertBefore","anchor","index","_requireIndex","splice","insertAfter","replace","previous","_detachModule","remove","disposeModule","_disposeModule","clone","attach","detach","reverse","errors","_releaseModule","resolveModules","context","prepare","enabled","collectRequirements","requirements","mergeFrameResourceRequirements","build","setup","indexOf","delete","stateful","owner","set"],"mappings":"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"}