@zephyr3d/scene 0.9.25 → 0.9.27
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/dist/animation/animationset.js +92 -30
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
- package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
- package/dist/animation/joint_dynamics/controller.js +7 -5
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/convex_collider.js +320 -0
- package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/morphtrack.js +3 -4
- package/dist/animation/morphtrack.js.map +1 -1
- package/dist/animation/skeleton.js +79 -25
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/spring/multi_chain_spring_system.js +577 -179
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +4 -3
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
- package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
- package/dist/animation/spring/spring_particle.js +2 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_system.js +11 -3
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring_modifier.js +10 -0
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/engine.js +53 -43
- package/dist/app/engine.js.map +1 -1
- package/dist/app/scriptingsystem.js +119 -6
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +3 -2
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +284 -67
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/zhair/zhair_format.js +288 -0
- package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
- package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
- package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
- package/dist/asset/model.js +184 -69
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/camera.js +268 -44
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/perspectivecamera.js +3 -1
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +9044 -5139
- package/dist/index.js +17 -6
- package/dist/index.js.map +1 -1
- package/dist/material/eye.js +932 -0
- package/dist/material/eye.js.map +1 -0
- package/dist/material/hair.js +917 -0
- package/dist/material/hair.js.map +1 -0
- package/dist/material/hairstrand.js +842 -0
- package/dist/material/hairstrand.js.map +1 -0
- package/dist/material/hairstrand_data.js +162 -0
- package/dist/material/hairstrand_data.js.map +1 -0
- package/dist/material/lambert.js +5 -2
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +48 -10
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +120 -19
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/albedocolor.js +1 -1
- package/dist/material/mixins/albedocolor.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +5 -4
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +106 -19
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +4 -4
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mixins/texture.js +48 -11
- package/dist/material/mixins/texture.js.map +1 -1
- package/dist/material/mtoon.js +6 -5
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrblueprint.js +146 -28
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrblueprint_instance.js +501 -0
- package/dist/material/pbrblueprint_instance.js.map +1 -0
- package/dist/material/pbrmr.js +15 -16
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/shader/helper.js +734 -23
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/shader/terrain_blend.js +55 -0
- package/dist/material/shader/terrain_blend.js.map +1 -0
- package/dist/material/skin.js +192 -32
- package/dist/material/skin.js.map +1 -1
- package/dist/material/spriteblueprint.js +16 -1
- package/dist/material/spriteblueprint.js.map +1 -1
- package/dist/material/subsurfaceprofile.js +86 -23
- package/dist/material/subsurfaceprofile.js.map +1 -1
- package/dist/material/water.js +2059 -72
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js +167 -7
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/coloradjust.js +2 -1
- package/dist/posteffect/coloradjust.js.map +1 -1
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/fxaa.js +2 -1
- package/dist/posteffect/fxaa.js.map +1 -1
- package/dist/posteffect/grayscale.js +3 -1
- package/dist/posteffect/grayscale.js.map +1 -1
- package/dist/posteffect/motionblur.js +664 -56
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +46 -44
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +368 -69
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +16 -9
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +3 -0
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +121 -36
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js +44 -1
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +8 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +156 -5
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cull_visitor.js +20 -0
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/depthpass.js +36 -2
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +26 -1
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +3 -2
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +1 -1
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +6 -3
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +57 -15
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +130 -20
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +3 -0
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +6 -3
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/oit.js +29 -0
- package/dist/render/oit.js.map +1 -0
- package/dist/render/render_queue.js +39 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +4 -0
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +1 -0
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/executor.js +2 -0
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +379 -10
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
- package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/shadow_mask_pass.js +73 -8
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/sky.js +166 -126
- package/dist/render/sky.js.map +1 -1
- package/dist/render/underwater.js +624 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/water_caustics.js +1380 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/weightedblended_oit.js +3 -2
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +8 -0
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +3 -0
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +4 -1
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/hair.js +963 -0
- package/dist/scene/hair.js.map +1 -0
- package/dist/scene/light.js +5 -1
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +481 -47
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +3 -0
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +3 -0
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +6 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +3 -0
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +6 -1
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain-cm/grass.js +3 -0
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +3 -0
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +6 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/terrain-cm/texture_cache.js +309 -0
- package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
- package/dist/scene/water.js +546 -4
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/diffusion.js +54 -0
- package/dist/shaders/diffusion.js.map +1 -0
- package/dist/shaders/shadow.js +33 -21
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/temporal.js +71 -33
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js +22 -19
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +56 -0
- package/dist/shaders/water_medium.js.map +1 -0
- package/dist/shadow/dom.js +546 -0
- package/dist/shadow/dom.js.map +1 -0
- package/dist/shadow/pcf_opt.js +3 -5
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +1 -1
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/receiver_bias.js +41 -0
- package/dist/shadow/receiver_bias.js.map +1 -0
- package/dist/shadow/shader.js +20 -60
- package/dist/shadow/shader.js.map +1 -1
- package/dist/shadow/shadow_impl.js +89 -0
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +1 -1
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/shadow/shadowmapper.js +150 -37
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shapes/shape.js +11 -2
- package/dist/shapes/shape.js.map +1 -1
- package/dist/shapes/sphere.js +50 -9
- package/dist/shapes/sphere.js.map +1 -1
- package/dist/utility/blueprint/common/constants.js +112 -2
- package/dist/utility/blueprint/common/constants.js.map +1 -1
- package/dist/utility/blueprint/material/func.js +142 -49
- package/dist/utility/blueprint/material/func.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +490 -25
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/texture.js +898 -4
- package/dist/utility/blueprint/material/texture.js.map +1 -1
- package/dist/utility/serialization/manager.js +434 -101
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +401 -5
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +4 -0
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +186 -26
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/common.js +26 -5
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/hair.js +1141 -0
- package/dist/utility/serialization/scene/hair.js.map +1 -0
- package/dist/utility/serialization/scene/light.js +84 -4
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +1867 -166
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +231 -14
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +141 -7
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +4 -0
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +18 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +4 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +4 -0
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +4 -0
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +1105 -21
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +9 -8
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/values.js +49 -2
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
- package/dist/render/rendergraph/frame_graph_context.js +0 -41
- package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
- package/dist/shaders/ssgi.js +0 -63
- package/dist/shaders/ssgi.js.map +0 -1
- package/dist/shaders/ssgi_reprojection.js +0 -118
- package/dist/shaders/ssgi_reprojection.js.map +0 -1
|
@@ -8,9 +8,12 @@ import '../material/unlit.js';
|
|
|
8
8
|
import '../material/particle.js';
|
|
9
9
|
import '../material/subsurfaceprofile.js';
|
|
10
10
|
import '../material/skin.js';
|
|
11
|
+
import '../material/eye.js';
|
|
11
12
|
import { RenderBundleWrapper } from './renderbundle_wrapper.js';
|
|
12
13
|
import { getDevice } from '../app/api.js';
|
|
13
14
|
import '../material/meshmaterial.js';
|
|
15
|
+
import '../material/hair.js';
|
|
16
|
+
import '../material/hairstrand.js';
|
|
14
17
|
import '../material/grassmaterial.js';
|
|
15
18
|
import '../material/terrain-cm.js';
|
|
16
19
|
import '../material/pbrmr.js';
|
|
@@ -97,11 +100,20 @@ const tmpDrawablePos = new Vector3();
|
|
|
97
100
|
/** @internal */ _sunLight;
|
|
98
101
|
/** @internal */ _primaryDirectionalLight;
|
|
99
102
|
/** @internal */ _primaryTransmissionLight;
|
|
103
|
+
/**
|
|
104
|
+
* Visible water surfaces, in visit order.
|
|
105
|
+
*
|
|
106
|
+
* Collected separately from the item lists so passes that run before the light
|
|
107
|
+
* pass - the caustics pass, which has to know where the water plane is before
|
|
108
|
+
* anything shades under it - can find them without walking every draw item.
|
|
109
|
+
* @internal
|
|
110
|
+
*/ _waterList;
|
|
100
111
|
/** @internal */ _bindGroupAllocator;
|
|
101
112
|
/** @internal */ _ref;
|
|
102
113
|
/** @internal */ _instanceInfo;
|
|
103
114
|
/** @internal */ _needSceneColor;
|
|
104
115
|
_needSceneDepth;
|
|
116
|
+
_needHiZNearest;
|
|
105
117
|
_needSceneColorWithDepth;
|
|
106
118
|
/** @internal */ _drawTransparent;
|
|
107
119
|
/** @internal */ _objectColorMaps;
|
|
@@ -118,6 +130,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
118
130
|
this._sunLight = null;
|
|
119
131
|
this._primaryDirectionalLight = null;
|
|
120
132
|
this._primaryTransmissionLight = null;
|
|
133
|
+
this._waterList = [];
|
|
121
134
|
this._ref = {
|
|
122
135
|
ref: this,
|
|
123
136
|
valid: true
|
|
@@ -125,6 +138,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
125
138
|
this._instanceInfo = new Map();
|
|
126
139
|
this._needSceneColor = false;
|
|
127
140
|
this._needSceneDepth = false;
|
|
141
|
+
this._needHiZNearest = false;
|
|
128
142
|
this._needSceneColorWithDepth = false;
|
|
129
143
|
this._drawTransparent = false;
|
|
130
144
|
this._objectColorMaps = [
|
|
@@ -165,6 +179,17 @@ const tmpDrawablePos = new Vector3();
|
|
|
165
179
|
/** @internal */ needSceneDepth() {
|
|
166
180
|
return this._needSceneDepth;
|
|
167
181
|
}
|
|
182
|
+
/**
|
|
183
|
+
* Whether any drawable needs the Hi-Z pyramid's nearest-depth channel.
|
|
184
|
+
*
|
|
185
|
+
* Materials request it the way they request the scene colour and depth, which
|
|
186
|
+
* is what lets a surface that queries the scene's proximity - water foam
|
|
187
|
+
* against a shoreline or a piling - turn the second channel on without the
|
|
188
|
+
* application having to know it exists.
|
|
189
|
+
* @internal
|
|
190
|
+
*/ needHiZNearest() {
|
|
191
|
+
return this._needHiZNearest;
|
|
192
|
+
}
|
|
168
193
|
/** @internal */ needSceneColorWithDepth() {
|
|
169
194
|
return this._needSceneColorWithDepth;
|
|
170
195
|
}
|
|
@@ -184,6 +209,15 @@ const tmpDrawablePos = new Vector3();
|
|
|
184
209
|
*/ get shadowedLights() {
|
|
185
210
|
return this._shadowedLightList;
|
|
186
211
|
}
|
|
212
|
+
/** Visible water surfaces collected while culling. */ get waters() {
|
|
213
|
+
return this._waterList;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Record a visible water surface.
|
|
217
|
+
* @param water - The water node that passed culling.
|
|
218
|
+
*/ pushWater(water) {
|
|
219
|
+
this._waterList.push(water);
|
|
220
|
+
}
|
|
187
221
|
/**
|
|
188
222
|
* Gets the unshadowed lights
|
|
189
223
|
*/ get unshadowedLights() {
|
|
@@ -233,6 +267,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
233
267
|
* Push items from another render queue
|
|
234
268
|
* @param queue - The render queue to be pushed
|
|
235
269
|
*/ pushRenderQueue(queue) {
|
|
270
|
+
this._waterList.push(...queue._waterList);
|
|
236
271
|
const newItemLists = queue._itemList;
|
|
237
272
|
if (!newItemLists) {
|
|
238
273
|
return;
|
|
@@ -250,6 +285,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
250
285
|
this._itemList.transmission_trans.unlit.push(...newItemLists.transmission_trans.unlit);
|
|
251
286
|
this._needSceneColor ||= queue._needSceneColor;
|
|
252
287
|
this._needSceneDepth ||= queue._needSceneDepth;
|
|
288
|
+
this._needHiZNearest ||= queue._needHiZNearest;
|
|
253
289
|
this._needSceneColorWithDepth ||= queue._needSceneColorWithDepth;
|
|
254
290
|
this._drawTransparent ||= queue._drawTransparent;
|
|
255
291
|
this._sunLight ||= queue._sunLight;
|
|
@@ -278,6 +314,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
278
314
|
const transmission = !!drawable.needSceneColor() || needDepth;
|
|
279
315
|
this._needSceneColor ||= transmission;
|
|
280
316
|
this._needSceneDepth ||= drawable.needSceneDepth();
|
|
317
|
+
this._needHiZNearest ||= !!drawable.needHiZNearest?.();
|
|
281
318
|
this._needSceneColorWithDepth ||= transmission && needDepth;
|
|
282
319
|
this._drawTransparent ||= trans;
|
|
283
320
|
if (camera.getPickResultResolveFunc()) {
|
|
@@ -382,8 +419,10 @@ const tmpDrawablePos = new Vector3();
|
|
|
382
419
|
this._sunLight = null;
|
|
383
420
|
this._primaryDirectionalLight = null;
|
|
384
421
|
this._primaryTransmissionLight = null;
|
|
422
|
+
this._waterList = [];
|
|
385
423
|
this._needSceneColor = false;
|
|
386
424
|
this._needSceneDepth = false;
|
|
425
|
+
this._needHiZNearest = false;
|
|
387
426
|
this._needSceneColorWithDepth = false;
|
|
388
427
|
this._drawTransparent = false;
|
|
389
428
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render_queue.js","sources":["../../src/render/render_queue.ts"],"sourcesContent":["import type { Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { Disposable, objectKeys, Vector3 } from '@zephyr3d/base';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { BatchDrawable, Drawable } from './drawable';\r\nimport type { DirectionalLight, PunctualLight } from '../scene/light';\r\nimport type { RenderPass } from '.';\r\nimport { QUEUE_TRANSPARENT, RENDER_PASS_TYPE_SHADOWMAP } from '../values';\r\nimport type { BindGroup, BindGroupLayout } from '@zephyr3d/device';\r\nimport { ProgramBuilder } from '@zephyr3d/device';\r\nimport type { Material } from '../material';\r\nimport { ShaderHelper } from '../material';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** @public */\r\nexport type CachedBindGroup = {\r\n bindGroup: BindGroup;\r\n buffer: Float32Array;\r\n offset: number;\r\n dirty: boolean;\r\n};\r\n\r\nconst maxBufferSizeInFloats = 65536 / 4;\r\n\r\n/**\r\n * Instance bind group allocator\r\n * @public\r\n */\r\nexport class InstanceBindGroupAllocator extends Disposable {\r\n private static _instanceBindGroupLayout: Nullable<BindGroupLayout> = null;\r\n _bindGroupList: CachedBindGroup[] = [];\r\n private _allocFrameStamp: number;\r\n constructor() {\r\n super();\r\n this._allocFrameStamp = -1;\r\n this._bindGroupList = [];\r\n }\r\n allocateInstanceBindGroup(framestamp: number, sizeInFloats: number) {\r\n // Reset if render frame changed\r\n if (this._allocFrameStamp !== framestamp) {\r\n this._allocFrameStamp = framestamp;\r\n for (const k of this._bindGroupList) {\r\n k.offset = 0;\r\n }\r\n }\r\n for (const k of this._bindGroupList) {\r\n if (k.offset + sizeInFloats <= maxBufferSizeInFloats) {\r\n k.dirty = true;\r\n return k;\r\n }\r\n }\r\n if (!InstanceBindGroupAllocator._instanceBindGroupLayout) {\r\n const buildInfo = new ProgramBuilder(getDevice()).buildRender({\r\n vertex(pb) {\r\n this[ShaderHelper.getInstanceDataUniformName()] = pb.vec4[65536 >> 4]().uniformBuffer(3);\r\n pb.main(function () {});\r\n },\r\n fragment(pb) {\r\n pb.main(function () {});\r\n }\r\n });\r\n InstanceBindGroupAllocator._instanceBindGroupLayout = buildInfo[2][3];\r\n }\r\n const bindGroup = {\r\n bindGroup: getDevice().createBindGroup(InstanceBindGroupAllocator._instanceBindGroupLayout),\r\n buffer: new Float32Array(maxBufferSizeInFloats),\r\n offset: 0,\r\n dirty: true\r\n };\r\n this._bindGroupList.push(bindGroup);\r\n return bindGroup;\r\n }\r\n /** Reset all allocations so the owned bind groups can be reused. */\r\n reset() {\r\n this._allocFrameStamp = -1;\r\n for (const allocation of this._bindGroupList) {\r\n allocation.offset = 0;\r\n allocation.dirty = true;\r\n }\r\n }\r\n /** Release all bind groups owned by this allocator. */\r\n protected onDispose() {\r\n super.onDispose();\r\n for (const allocation of this._bindGroupList) {\r\n allocation.bindGroup.dispose();\r\n }\r\n this._bindGroupList.length = 0;\r\n }\r\n}\r\n\r\nconst defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();\r\nconst tmpDrawablePos = new Vector3();\r\n\r\n/**\r\n * Instance data\r\n * @public\r\n */\r\nexport interface InstanceData {\r\n bindGroup: CachedBindGroup;\r\n stride: number;\r\n offset: number;\r\n numInstances: number;\r\n}\r\n\r\n/**\r\n * Render queue item\r\n * @public\r\n */\r\nexport interface RenderQueueItem {\r\n drawable: Drawable;\r\n sortDistance: number;\r\n instanceColor?: Vector4;\r\n instanceData: Nullable<InstanceData>;\r\n}\r\n\r\n/**\r\n * Render item list information\r\n * @public\r\n */\r\nexport interface RenderItemListInfo {\r\n itemList: RenderQueueItem[];\r\n renderBundle?: RenderBundleWrapper;\r\n skinItemList: RenderQueueItem[];\r\n skinRenderBundle?: RenderBundleWrapper;\r\n morphItemList: RenderQueueItem[];\r\n morphRenderBundle?: RenderBundleWrapper;\r\n skinAndMorphItemList: RenderQueueItem[];\r\n skinAndMorphRenderBundle?: RenderBundleWrapper;\r\n instanceItemList: RenderQueueItem[];\r\n instanceRenderBundle?: RenderBundleWrapper;\r\n instanceList: Record<string, BatchDrawable[]>;\r\n materialList: Set<Material>;\r\n renderQueue: RenderQueue;\r\n}\r\n\r\n/**\r\n * Render item list bundle\r\n * @public\r\n */\r\nexport interface RenderItemListBundle {\r\n lit: RenderItemListInfo[];\r\n unlit: RenderItemListInfo[];\r\n}\r\n\r\n/**\r\n * Item list of render queue\r\n * @public\r\n */\r\nexport interface RenderItemList {\r\n opaque: RenderItemListBundle;\r\n transmission: RenderItemListBundle;\r\n transparent: RenderItemListBundle;\r\n transmission_trans: RenderItemListBundle;\r\n}\r\n\r\n/**\r\n * Render queue reference\r\n * @public\r\n */\r\nexport interface RenderQueueRef {\r\n ref: RenderQueue;\r\n /** False after the queue is cleared and starts a new contents generation. */\r\n valid: boolean;\r\n}\r\n\r\n/**\r\n * Drawable instance information\r\n * @public\r\n */\r\nexport interface DrawableInstanceInfo {\r\n bindGroup: CachedBindGroup;\r\n offset: number;\r\n}\r\n\r\n/**\r\n * A queue that contains the items to be rendered\r\n * @public\r\n */\r\nexport class RenderQueue extends Disposable {\r\n /** @internal */\r\n private _itemList: Nullable<RenderItemList>;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private _shadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _unshadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _sunLight: Nullable<DirectionalLight>;\r\n /** @internal */\r\n private _primaryDirectionalLight: Nullable<DirectionalLight>;\r\n /** @internal */\r\n private _primaryTransmissionLight: Nullable<PunctualLight>;\r\n /** @internal */\r\n private readonly _bindGroupAllocator: InstanceBindGroupAllocator;\r\n /** @internal */\r\n private _ref: RenderQueueRef;\r\n /** @internal */\r\n private readonly _instanceInfo: Map<Drawable, DrawableInstanceInfo>;\r\n /** @internal */\r\n private _needSceneColor: boolean;\r\n private _needSceneDepth: boolean;\r\n private _needSceneColorWithDepth: boolean;\r\n /** @internal */\r\n private _drawTransparent: boolean;\r\n /** @internal */\r\n private readonly _objectColorMaps: Map<number, Drawable>[];\r\n /**\r\n * Creates an instance of a render queue\r\n * @param renderPass - The render pass to which the render queue belongs\r\n */\r\n constructor(renderPass: RenderPass, bindGroupAllocator?: InstanceBindGroupAllocator) {\r\n super();\r\n this._bindGroupAllocator = bindGroupAllocator ?? defaultInstanceBindGroupAlloator;\r\n this._itemList = null;\r\n this._renderPass = renderPass;\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._primaryDirectionalLight = null;\r\n this._primaryTransmissionLight = null;\r\n this._ref = { ref: this, valid: true };\r\n this._instanceInfo = new Map();\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n this._objectColorMaps = [new Map()];\r\n }\r\n /** The sun light */\r\n get sunLight() {\r\n return this._sunLight;\r\n }\r\n set sunLight(light) {\r\n this._sunLight = light;\r\n }\r\n /** Primary directional light used by effects that need a main light direction. */\r\n get primaryDirectionalLight() {\r\n return this._primaryDirectionalLight;\r\n }\r\n set primaryDirectionalLight(light) {\r\n this._primaryDirectionalLight = light;\r\n }\r\n /** Primary punctual light used by thin-transmission effects when there is no main directional light. */\r\n get primaryTransmissionLight() {\r\n return this._primaryTransmissionLight;\r\n }\r\n set primaryTransmissionLight(light) {\r\n this._primaryTransmissionLight = light;\r\n }\r\n /** @internal */\r\n private getTransmissionLightScore(light: PunctualLight) {\r\n if (light.isDirectionLight()) {\r\n return -1;\r\n }\r\n const color = light.diffuseAndIntensity;\r\n const luma = color.x * 0.2126 + color.y * 0.7152 + color.z * 0.0722;\r\n const range = Math.max(1, light.positionAndRange.w);\r\n const typeWeight = light.isSpotLight()\r\n ? 1.2\r\n : light.isPointLight()\r\n ? 1.08\r\n : light.isRectLight()\r\n ? 1.02\r\n : 1;\r\n return Math.max(color.w, 0) * Math.max(luma, 0) * Math.sqrt(range) * typeWeight;\r\n }\r\n /** @internal */\r\n needSceneColor() {\r\n return this._needSceneColor;\r\n }\r\n /** @internal */\r\n needSceneDepth() {\r\n return this._needSceneDepth;\r\n }\r\n /** @internal */\r\n needSceneColorWithDepth() {\r\n return this._needSceneColorWithDepth;\r\n }\r\n /** Whether this render queue has transparent objects to be drawn */\r\n get drawTransparent() {\r\n return this._drawTransparent;\r\n }\r\n /** The render pass to which the render queue belongs */\r\n get renderPass() {\r\n return this._renderPass;\r\n }\r\n /**\r\n * Gets the items of the render queue\r\n */\r\n get itemList() {\r\n return this._itemList;\r\n }\r\n /**\r\n * Gets the shadowed lights\r\n */\r\n get shadowedLights() {\r\n return this._shadowedLightList;\r\n }\r\n /**\r\n * Gets the unshadowed lights\r\n */\r\n get unshadowedLights() {\r\n return this._unshadowedLightList;\r\n }\r\n /**\r\n * Gets the indirect reference of this\r\n */\r\n get ref() {\r\n return this._ref;\r\n }\r\n /**\r\n * Gets the instance information for given drawable object\r\n * @param drawable - The drawable object\r\n * @returns The instane information for given drawable object, null if no exists\r\n */\r\n getInstanceInfo(drawable: Drawable) {\r\n return this._instanceInfo.get(drawable);\r\n }\r\n /**\r\n * Gets the maximum batch size of a given device\r\n * @returns The maximum batch size of the device\r\n *\r\n * @internal\r\n */\r\n getMaxBatchSize() {\r\n return getDevice().getDeviceCaps().shaderCaps.maxUniformBufferSize / 64;\r\n }\r\n /**\r\n * Push a punctual light\r\n * @param light - The light to be pushed\r\n */\r\n pushLight(light: PunctualLight) {\r\n if (light.castShadow) {\r\n this._shadowedLightList.push(light);\r\n } else {\r\n this._unshadowedLightList.push(light);\r\n }\r\n if (light.isDirectionLight()) {\r\n if (!this._primaryDirectionalLight || light.intensity > this._primaryDirectionalLight.intensity) {\r\n this._primaryDirectionalLight = light;\r\n }\r\n if (light.sunLight) {\r\n this.sunLight = light;\r\n }\r\n } else if (\r\n !this._primaryTransmissionLight ||\r\n this.getTransmissionLightScore(light) > this.getTransmissionLightScore(this._primaryTransmissionLight)\r\n ) {\r\n this._primaryTransmissionLight = light;\r\n }\r\n }\r\n /**\r\n * Push items from another render queue\r\n * @param queue - The render queue to be pushed\r\n */\r\n pushRenderQueue(queue: RenderQueue) {\r\n const newItemLists = queue._itemList;\r\n if (!newItemLists) {\r\n return;\r\n }\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n this._itemList.opaque.lit.push(...newItemLists.opaque.lit);\r\n this._itemList.opaque.unlit.push(...newItemLists.opaque.unlit);\r\n this._itemList.transmission.lit.push(...newItemLists.transmission.lit);\r\n this._itemList.transmission.unlit.push(...newItemLists.transmission.unlit);\r\n this._itemList.transparent.lit.push(...newItemLists.transparent.lit);\r\n this._itemList.transparent.unlit.push(...newItemLists.transparent.unlit);\r\n this._itemList.transmission_trans.lit.push(...newItemLists.transmission_trans.lit);\r\n this._itemList.transmission_trans.unlit.push(...newItemLists.transmission_trans.unlit);\r\n this._needSceneColor ||= queue._needSceneColor;\r\n this._needSceneDepth ||= queue._needSceneDepth;\r\n this._needSceneColorWithDepth ||= queue._needSceneColorWithDepth;\r\n this._drawTransparent ||= queue._drawTransparent;\r\n this._sunLight ||= queue._sunLight;\r\n if (\r\n queue._primaryDirectionalLight &&\r\n (!this._primaryDirectionalLight ||\r\n queue._primaryDirectionalLight.intensity > this._primaryDirectionalLight.intensity)\r\n ) {\r\n this._primaryDirectionalLight = queue._primaryDirectionalLight;\r\n }\r\n if (\r\n queue._primaryTransmissionLight &&\r\n (!this._primaryTransmissionLight ||\r\n this.getTransmissionLightScore(queue._primaryTransmissionLight) >\r\n this.getTransmissionLightScore(this._primaryTransmissionLight))\r\n ) {\r\n this._primaryTransmissionLight = queue._primaryTransmissionLight;\r\n }\r\n this._objectColorMaps.push(...queue._objectColorMaps);\r\n }\r\n /**\r\n * Push an item to the render queue\r\n * @param camera - The camera for drawing the item\r\n * @param drawable - The object to be drawn\r\n */\r\n push(camera: Camera, drawable: Drawable) {\r\n if (drawable) {\r\n drawable.pushRenderQueueRef(this._ref);\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n const material = drawable.getMaterial();\r\n const trans =\r\n this._renderPass.type === RENDER_PASS_TYPE_SHADOWMAP &&\r\n material?.useTransparentShadowCasterForPass?.(this._renderPass.type)\r\n ? false\r\n : drawable.getQueueType() === QUEUE_TRANSPARENT;\r\n const unlit = drawable.isUnlit();\r\n const needDepth = !!drawable.needSceneDepth();\r\n const transmission = !!drawable.needSceneColor() || needDepth;\r\n this._needSceneColor ||= transmission;\r\n this._needSceneDepth ||= drawable.needSceneDepth();\r\n this._needSceneColorWithDepth ||= transmission && needDepth;\r\n this._drawTransparent ||= trans;\r\n if (camera.getPickResultResolveFunc()) {\r\n drawable.getMaterial()!.objectColor = drawable.getObjectColor();\r\n this._objectColorMaps[0].set(drawable.getDrawableId(), drawable);\r\n }\r\n if (drawable.isBatchable()) {\r\n const instanceList = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0].instanceList\r\n : this._itemList.transmission_trans.lit[0].instanceList\r\n : unlit\r\n ? this._itemList.transparent.unlit[0].instanceList\r\n : this._itemList.transparent.lit[0].instanceList\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0].instanceList\r\n : this._itemList.transmission.lit[0].instanceList\r\n : unlit\r\n ? this._itemList.opaque.unlit[0].instanceList\r\n : this._itemList.opaque.lit[0].instanceList;\r\n const hash = drawable.getInstanceId(this._renderPass);\r\n let drawableList = instanceList[hash];\r\n if (!drawableList) {\r\n drawableList = [];\r\n instanceList[hash] = drawableList;\r\n }\r\n drawableList.push(drawable);\r\n } else {\r\n const list = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0]\r\n : this._itemList.transmission_trans.lit[0]\r\n : unlit\r\n ? this._itemList.transparent.unlit[0]\r\n : this._itemList.transparent.lit[0]\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0]\r\n : this._itemList.transmission.lit[0]\r\n : unlit\r\n ? this._itemList.opaque.unlit[0]\r\n : this._itemList.opaque.lit[0];\r\n const skinAnimation = !!drawable.getBoneMatrices();\r\n const morphAnimation = !!drawable.getMorphData();\r\n let queue: RenderQueueItem[];\r\n if (skinAnimation && morphAnimation) {\r\n queue = list.skinAndMorphItemList;\r\n } else if (skinAnimation) {\r\n queue = list.skinItemList;\r\n } else if (morphAnimation) {\r\n queue = list.morphItemList;\r\n } else {\r\n queue = list.itemList;\r\n }\r\n this.binaryInsert(queue, {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: null\r\n });\r\n if (material) {\r\n list.materialList.add(material.coreMaterial);\r\n }\r\n drawable.applyTransformUniforms(this);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n getDrawableByColor(c: Uint8Array<ArrayBuffer>, map?: Map<number, Drawable>[]) {\r\n const id = (c[0] << 24) + (c[1] << 16) + (c[2] << 8) + c[3];\r\n map = map ?? this._objectColorMaps;\r\n for (const m of map) {\r\n const drawable = m.get(id);\r\n if (drawable) {\r\n return drawable;\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Capture an object-color lookup that remains valid after this queue is reset or disposed.\r\n * @internal\r\n */\r\n createObjectColorLookupSnapshot(): (c: Uint8Array<ArrayBuffer>) => Nullable<Drawable> {\r\n const snapshot = this._objectColorMaps.slice();\r\n return (c: Uint8Array<ArrayBuffer>) => this.getDrawableByColor(c, snapshot);\r\n }\r\n /**\r\n * Removes all items in the render queue\r\n */\r\n reset() {\r\n if (this._itemList) {\r\n // Release all render bundles\r\n for (const k of objectKeys(this._itemList)) {\r\n const itemListBundle: RenderItemListBundle = this._itemList[k];\r\n for (const l of objectKeys(itemListBundle)) {\r\n const listInfo: RenderItemListInfo[] = itemListBundle[l];\r\n for (const info of listInfo) {\r\n if (info.renderQueue === this) {\r\n if (info.renderBundle) {\r\n info.renderBundle.dispose();\r\n }\r\n if (info.skinRenderBundle) {\r\n info.skinRenderBundle.dispose();\r\n }\r\n if (info.morphRenderBundle) {\r\n info.morphRenderBundle.dispose();\r\n }\r\n if (info.skinAndMorphRenderBundle) {\r\n info.skinAndMorphRenderBundle.dispose();\r\n }\r\n if (info.instanceRenderBundle) {\r\n info.instanceRenderBundle.dispose();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this._itemList = null;\r\n }\r\n this._ref.valid = false;\r\n this._ref = { ref: this, valid: true };\r\n this._instanceInfo.clear();\r\n this._objectColorMaps.length = 0;\r\n this._objectColorMaps.push(new Map());\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._primaryDirectionalLight = null;\r\n this._primaryTransmissionLight = null;\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n }\r\n /** @internal */\r\n end(camera: Camera, createRenderBundles?: boolean) {\r\n const frameCounter = getDevice().frameInfo.frameCounter;\r\n const itemList = this._itemList!;\r\n if (!this.itemList) {\r\n return this;\r\n }\r\n const lists = [\r\n itemList.opaque.lit,\r\n itemList.opaque.unlit,\r\n itemList.transmission.lit,\r\n itemList.transmission.unlit,\r\n itemList.transparent.lit,\r\n itemList.transparent.unlit,\r\n itemList.transmission_trans.lit,\r\n itemList.transmission_trans.unlit\r\n ];\r\n for (let i = 0; i < lists.length; i++) {\r\n const list = lists[i];\r\n for (const info of list) {\r\n if (info.renderQueue !== this) {\r\n continue;\r\n }\r\n const instanceList = info.instanceList;\r\n for (const x in instanceList) {\r\n const drawables = instanceList[x];\r\n let bindGroup: Nullable<CachedBindGroup> = null;\r\n let item: Nullable<RenderQueueItem> = null;\r\n for (let i = 0; i < drawables.length; i++) {\r\n const drawable = drawables[i];\r\n const instanceUniforms = drawable.getInstanceUniforms();\r\n const instanceUniformsSize = instanceUniforms?.length ?? 0;\r\n const stride = ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4 + instanceUniformsSize;\r\n if (!bindGroup || bindGroup.offset + stride > maxBufferSizeInFloats) {\r\n bindGroup = this._bindGroupAllocator.allocateInstanceBindGroup(frameCounter, stride);\r\n item = {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: {\r\n bindGroup,\r\n offset: bindGroup.offset,\r\n numInstances: 0,\r\n stride\r\n }\r\n };\r\n this.binaryInsert(info.instanceItemList, item);\r\n drawable.applyInstanceOffsetAndStride(this, stride, bindGroup.offset);\r\n }\r\n const instanceInfo = { bindGroup, offset: bindGroup.offset };\r\n this._instanceInfo.set(drawable, instanceInfo);\r\n drawable.applyTransformUniforms(this);\r\n drawable.applyMaterialUniforms(instanceInfo);\r\n bindGroup.offset += stride;\r\n item!.instanceData!.numInstances++;\r\n const mat = drawable.getMaterial();\r\n if (mat) {\r\n info.materialList.add(mat.coreMaterial);\r\n }\r\n }\r\n }\r\n info.instanceList = {};\r\n if (createRenderBundles) {\r\n if (info.itemList.length > 0) {\r\n info.renderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinItemList.length > 0) {\r\n info.skinRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.morphItemList.length > 0) {\r\n info.morphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinAndMorphItemList.length > 0) {\r\n info.skinAndMorphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.instanceItemList.length > 0) {\r\n info.instanceRenderBundle = new RenderBundleWrapper();\r\n }\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n binaryInsert(itemList: RenderQueueItem[], item: RenderQueueItem) {\r\n let left = 0;\r\n let right = itemList.length - 1;\r\n const newInstanceId = item.drawable.getMaterial()!.instanceId;\r\n while (left <= right) {\r\n const mid = Math.floor((left + right) / 2);\r\n const instanceId = itemList[mid].drawable.getMaterial()!.instanceId;\r\n if (instanceId === newInstanceId) {\r\n itemList.splice(mid + 1, 0, item);\r\n return;\r\n } else if (instanceId < newInstanceId) {\r\n left = mid + 1;\r\n } else {\r\n right = mid - 1;\r\n }\r\n }\r\n itemList.splice(left, 0, item);\r\n }\r\n /**\r\n * Sorts the items in the render queue for rendering\r\n */\r\n sortTransparentItems(cameraPos: Vector3) {\r\n if (this._itemList) {\r\n this._itemList.transparent.lit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n }\r\n }\r\n /** Disposes the render queue */\r\n protected onDispose() {\r\n super.onDispose();\r\n this.reset();\r\n this._ref.valid = false;\r\n }\r\n\r\n private drawableDistanceToCamera(drawable: Drawable, cameraPos: Vector3) {\r\n const drawablePos = drawable.getNode().getWorldPosition(tmpDrawablePos);\r\n return Vector3.distanceSq(drawablePos, cameraPos);\r\n }\r\n private newRenderItemListInfo() {\r\n return {\r\n itemList: [],\r\n skinItemList: [],\r\n morphItemList: [],\r\n skinAndMorphItemList: [],\r\n instanceItemList: [],\r\n materialList: new Set(),\r\n instanceList: {},\r\n renderQueue: this\r\n } as RenderItemListInfo;\r\n }\r\n private newRenderItemListBundle() {\r\n return {\r\n lit: [this.newRenderItemListInfo()],\r\n unlit: [this.newRenderItemListInfo()]\r\n };\r\n }\r\n private newRenderItemList() {\r\n return {\r\n opaque: this.newRenderItemListBundle(),\r\n transmission: this.newRenderItemListBundle(),\r\n transparent: this.newRenderItemListBundle(),\r\n transmission_trans: this.newRenderItemListBundle()\r\n };\r\n }\r\n}\r\n"],"names":["maxBufferSizeInFloats","InstanceBindGroupAllocator","Disposable","_instanceBindGroupLayout","_bindGroupList","_allocFrameStamp","allocateInstanceBindGroup","framestamp","sizeInFloats","k","offset","dirty","buildInfo","ProgramBuilder","getDevice","buildRender","vertex","pb","ShaderHelper","getInstanceDataUniformName","vec4","uniformBuffer","main","fragment","bindGroup","createBindGroup","buffer","Float32Array","push","reset","allocation","onDispose","dispose","length","defaultInstanceBindGroupAlloator","tmpDrawablePos","Vector3","RenderQueue","_needSceneDepth","_needSceneColorWithDepth","renderPass","bindGroupAllocator","_bindGroupAllocator","_itemList","_renderPass","_shadowedLightList","_unshadowedLightList","_sunLight","_primaryDirectionalLight","_primaryTransmissionLight","_ref","ref","valid","_instanceInfo","Map","_needSceneColor","_drawTransparent","_objectColorMaps","sunLight","light","primaryDirectionalLight","primaryTransmissionLight","getTransmissionLightScore","isDirectionLight","color","diffuseAndIntensity","luma","x","y","z","range","Math","max","positionAndRange","w","typeWeight","isSpotLight","isPointLight","isRectLight","sqrt","needSceneColor","needSceneDepth","needSceneColorWithDepth","drawTransparent","itemList","shadowedLights","unshadowedLights","getInstanceInfo","drawable","get","getMaxBatchSize","getDeviceCaps","shaderCaps","maxUniformBufferSize","pushLight","castShadow","intensity","pushRenderQueue","queue","newItemLists","newRenderItemList","opaque","lit","unlit","transmission","transparent","transmission_trans","camera","pushRenderQueueRef","material","getMaterial","trans","type","RENDER_PASS_TYPE_SHADOWMAP","useTransparentShadowCasterForPass","getQueueType","QUEUE_TRANSPARENT","isUnlit","needDepth","getPickResultResolveFunc","objectColor","getObjectColor","set","getDrawableId","isBatchable","instanceList","hash","getInstanceId","drawableList","list","skinAnimation","getBoneMatrices","morphAnimation","getMorphData","skinAndMorphItemList","skinItemList","morphItemList","binaryInsert","sortDistance","getSortDistance","instanceData","materialList","add","coreMaterial","applyTransformUniforms","getDrawableByColor","c","map","id","m","createObjectColorLookupSnapshot","snapshot","slice","objectKeys","itemListBundle","l","listInfo","info","renderQueue","renderBundle","skinRenderBundle","morphRenderBundle","skinAndMorphRenderBundle","instanceRenderBundle","clear","end","createRenderBundles","frameCounter","frameInfo","lists","i","drawables","item","instanceUniforms","getInstanceUniforms","instanceUniformsSize","stride","MATERIAL_INSTANCE_DATA_OFFSET","numInstances","instanceItemList","applyInstanceOffsetAndStride","instanceInfo","applyMaterialUniforms","mat","RenderBundleWrapper","left","right","newInstanceId","instanceId","mid","floor","splice","sortTransparentItems","cameraPos","sort","a","b","drawableDistanceToCamera","drawablePos","getNode","getWorldPosition","distanceSq","newRenderItemListInfo","Set","newRenderItemListBundle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"render_queue.js","sources":["../../src/render/render_queue.ts"],"sourcesContent":["import type { Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { Disposable, objectKeys, Vector3 } from '@zephyr3d/base';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { BatchDrawable, Drawable } from './drawable';\r\nimport type { DirectionalLight, PunctualLight } from '../scene/light';\r\nimport type { Water } from '../scene/water';\r\nimport type { RenderPass } from '.';\r\nimport { QUEUE_TRANSPARENT, RENDER_PASS_TYPE_SHADOWMAP } from '../values';\r\nimport type { BindGroup, BindGroupLayout } from '@zephyr3d/device';\r\nimport { ProgramBuilder } from '@zephyr3d/device';\r\nimport type { Material } from '../material';\r\nimport { ShaderHelper } from '../material';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** @public */\r\nexport type CachedBindGroup = {\r\n bindGroup: BindGroup;\r\n buffer: Float32Array;\r\n offset: number;\r\n dirty: boolean;\r\n};\r\n\r\nconst maxBufferSizeInFloats = 65536 / 4;\r\n\r\n/**\r\n * Instance bind group allocator\r\n * @public\r\n */\r\nexport class InstanceBindGroupAllocator extends Disposable {\r\n private static _instanceBindGroupLayout: Nullable<BindGroupLayout> = null;\r\n _bindGroupList: CachedBindGroup[] = [];\r\n private _allocFrameStamp: number;\r\n constructor() {\r\n super();\r\n this._allocFrameStamp = -1;\r\n this._bindGroupList = [];\r\n }\r\n allocateInstanceBindGroup(framestamp: number, sizeInFloats: number) {\r\n // Reset if render frame changed\r\n if (this._allocFrameStamp !== framestamp) {\r\n this._allocFrameStamp = framestamp;\r\n for (const k of this._bindGroupList) {\r\n k.offset = 0;\r\n }\r\n }\r\n for (const k of this._bindGroupList) {\r\n if (k.offset + sizeInFloats <= maxBufferSizeInFloats) {\r\n k.dirty = true;\r\n return k;\r\n }\r\n }\r\n if (!InstanceBindGroupAllocator._instanceBindGroupLayout) {\r\n const buildInfo = new ProgramBuilder(getDevice()).buildRender({\r\n vertex(pb) {\r\n this[ShaderHelper.getInstanceDataUniformName()] = pb.vec4[65536 >> 4]().uniformBuffer(3);\r\n pb.main(function () {});\r\n },\r\n fragment(pb) {\r\n pb.main(function () {});\r\n }\r\n });\r\n InstanceBindGroupAllocator._instanceBindGroupLayout = buildInfo[2][3];\r\n }\r\n const bindGroup = {\r\n bindGroup: getDevice().createBindGroup(InstanceBindGroupAllocator._instanceBindGroupLayout),\r\n buffer: new Float32Array(maxBufferSizeInFloats),\r\n offset: 0,\r\n dirty: true\r\n };\r\n this._bindGroupList.push(bindGroup);\r\n return bindGroup;\r\n }\r\n /** Reset all allocations so the owned bind groups can be reused. */\r\n reset() {\r\n this._allocFrameStamp = -1;\r\n for (const allocation of this._bindGroupList) {\r\n allocation.offset = 0;\r\n allocation.dirty = true;\r\n }\r\n }\r\n /** Release all bind groups owned by this allocator. */\r\n protected onDispose() {\r\n super.onDispose();\r\n for (const allocation of this._bindGroupList) {\r\n allocation.bindGroup.dispose();\r\n }\r\n this._bindGroupList.length = 0;\r\n }\r\n}\r\n\r\nconst defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();\r\nconst tmpDrawablePos = new Vector3();\r\n\r\n/**\r\n * Instance data\r\n * @public\r\n */\r\nexport interface InstanceData {\r\n bindGroup: CachedBindGroup;\r\n stride: number;\r\n offset: number;\r\n numInstances: number;\r\n}\r\n\r\n/**\r\n * Render queue item\r\n * @public\r\n */\r\nexport interface RenderQueueItem {\r\n drawable: Drawable;\r\n sortDistance: number;\r\n instanceColor?: Vector4;\r\n instanceData: Nullable<InstanceData>;\r\n}\r\n\r\n/**\r\n * Render item list information\r\n * @public\r\n */\r\nexport interface RenderItemListInfo {\r\n itemList: RenderQueueItem[];\r\n renderBundle?: RenderBundleWrapper;\r\n skinItemList: RenderQueueItem[];\r\n skinRenderBundle?: RenderBundleWrapper;\r\n morphItemList: RenderQueueItem[];\r\n morphRenderBundle?: RenderBundleWrapper;\r\n skinAndMorphItemList: RenderQueueItem[];\r\n skinAndMorphRenderBundle?: RenderBundleWrapper;\r\n instanceItemList: RenderQueueItem[];\r\n instanceRenderBundle?: RenderBundleWrapper;\r\n instanceList: Record<string, BatchDrawable[]>;\r\n materialList: Set<Material>;\r\n renderQueue: RenderQueue;\r\n}\r\n\r\n/**\r\n * Render item list bundle\r\n * @public\r\n */\r\nexport interface RenderItemListBundle {\r\n lit: RenderItemListInfo[];\r\n unlit: RenderItemListInfo[];\r\n}\r\n\r\n/**\r\n * Item list of render queue\r\n * @public\r\n */\r\nexport interface RenderItemList {\r\n opaque: RenderItemListBundle;\r\n transmission: RenderItemListBundle;\r\n transparent: RenderItemListBundle;\r\n transmission_trans: RenderItemListBundle;\r\n}\r\n\r\n/**\r\n * Render queue reference\r\n * @public\r\n */\r\nexport interface RenderQueueRef {\r\n ref: RenderQueue;\r\n /** False after the queue is cleared and starts a new contents generation. */\r\n valid: boolean;\r\n}\r\n\r\n/**\r\n * Drawable instance information\r\n * @public\r\n */\r\nexport interface DrawableInstanceInfo {\r\n bindGroup: CachedBindGroup;\r\n offset: number;\r\n}\r\n\r\n/**\r\n * A queue that contains the items to be rendered\r\n * @public\r\n */\r\nexport class RenderQueue extends Disposable {\r\n /** @internal */\r\n private _itemList: Nullable<RenderItemList>;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private _shadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _unshadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _sunLight: Nullable<DirectionalLight>;\r\n /** @internal */\r\n private _primaryDirectionalLight: Nullable<DirectionalLight>;\r\n /** @internal */\r\n private _primaryTransmissionLight: Nullable<PunctualLight>;\r\n /**\r\n * Visible water surfaces, in visit order.\r\n *\r\n * Collected separately from the item lists so passes that run before the light\r\n * pass - the caustics pass, which has to know where the water plane is before\r\n * anything shades under it - can find them without walking every draw item.\r\n * @internal\r\n */\r\n private _waterList: Water[];\r\n /** @internal */\r\n private readonly _bindGroupAllocator: InstanceBindGroupAllocator;\r\n /** @internal */\r\n private _ref: RenderQueueRef;\r\n /** @internal */\r\n private readonly _instanceInfo: Map<Drawable, DrawableInstanceInfo>;\r\n /** @internal */\r\n private _needSceneColor: boolean;\r\n private _needSceneDepth: boolean;\r\n private _needHiZNearest: boolean;\r\n private _needSceneColorWithDepth: boolean;\r\n /** @internal */\r\n private _drawTransparent: boolean;\r\n /** @internal */\r\n private readonly _objectColorMaps: Map<number, Drawable>[];\r\n /**\r\n * Creates an instance of a render queue\r\n * @param renderPass - The render pass to which the render queue belongs\r\n */\r\n constructor(renderPass: RenderPass, bindGroupAllocator?: InstanceBindGroupAllocator) {\r\n super();\r\n this._bindGroupAllocator = bindGroupAllocator ?? defaultInstanceBindGroupAlloator;\r\n this._itemList = null;\r\n this._renderPass = renderPass;\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._primaryDirectionalLight = null;\r\n this._primaryTransmissionLight = null;\r\n this._waterList = [];\r\n this._ref = { ref: this, valid: true };\r\n this._instanceInfo = new Map();\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needHiZNearest = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n this._objectColorMaps = [new Map()];\r\n }\r\n /** The sun light */\r\n get sunLight() {\r\n return this._sunLight;\r\n }\r\n set sunLight(light) {\r\n this._sunLight = light;\r\n }\r\n /** Primary directional light used by effects that need a main light direction. */\r\n get primaryDirectionalLight() {\r\n return this._primaryDirectionalLight;\r\n }\r\n set primaryDirectionalLight(light) {\r\n this._primaryDirectionalLight = light;\r\n }\r\n /** Primary punctual light used by thin-transmission effects when there is no main directional light. */\r\n get primaryTransmissionLight() {\r\n return this._primaryTransmissionLight;\r\n }\r\n set primaryTransmissionLight(light) {\r\n this._primaryTransmissionLight = light;\r\n }\r\n /** @internal */\r\n private getTransmissionLightScore(light: PunctualLight) {\r\n if (light.isDirectionLight()) {\r\n return -1;\r\n }\r\n const color = light.diffuseAndIntensity;\r\n const luma = color.x * 0.2126 + color.y * 0.7152 + color.z * 0.0722;\r\n const range = Math.max(1, light.positionAndRange.w);\r\n const typeWeight = light.isSpotLight()\r\n ? 1.2\r\n : light.isPointLight()\r\n ? 1.08\r\n : light.isRectLight()\r\n ? 1.02\r\n : 1;\r\n return Math.max(color.w, 0) * Math.max(luma, 0) * Math.sqrt(range) * typeWeight;\r\n }\r\n /** @internal */\r\n needSceneColor() {\r\n return this._needSceneColor;\r\n }\r\n /** @internal */\r\n needSceneDepth() {\r\n return this._needSceneDepth;\r\n }\r\n /**\r\n * Whether any drawable needs the Hi-Z pyramid's nearest-depth channel.\r\n *\r\n * Materials request it the way they request the scene colour and depth, which\r\n * is what lets a surface that queries the scene's proximity - water foam\r\n * against a shoreline or a piling - turn the second channel on without the\r\n * application having to know it exists.\r\n * @internal\r\n */\r\n needHiZNearest() {\r\n return this._needHiZNearest;\r\n }\r\n /** @internal */\r\n needSceneColorWithDepth() {\r\n return this._needSceneColorWithDepth;\r\n }\r\n /** Whether this render queue has transparent objects to be drawn */\r\n get drawTransparent() {\r\n return this._drawTransparent;\r\n }\r\n /** The render pass to which the render queue belongs */\r\n get renderPass() {\r\n return this._renderPass;\r\n }\r\n /**\r\n * Gets the items of the render queue\r\n */\r\n get itemList() {\r\n return this._itemList;\r\n }\r\n /**\r\n * Gets the shadowed lights\r\n */\r\n get shadowedLights() {\r\n return this._shadowedLightList;\r\n }\r\n /** Visible water surfaces collected while culling. */\r\n get waters(): readonly Water[] {\r\n return this._waterList;\r\n }\r\n /**\r\n * Record a visible water surface.\r\n * @param water - The water node that passed culling.\r\n */\r\n pushWater(water: Water) {\r\n this._waterList.push(water);\r\n }\r\n /**\r\n * Gets the unshadowed lights\r\n */\r\n get unshadowedLights() {\r\n return this._unshadowedLightList;\r\n }\r\n /**\r\n * Gets the indirect reference of this\r\n */\r\n get ref() {\r\n return this._ref;\r\n }\r\n /**\r\n * Gets the instance information for given drawable object\r\n * @param drawable - The drawable object\r\n * @returns The instane information for given drawable object, null if no exists\r\n */\r\n getInstanceInfo(drawable: Drawable) {\r\n return this._instanceInfo.get(drawable);\r\n }\r\n /**\r\n * Gets the maximum batch size of a given device\r\n * @returns The maximum batch size of the device\r\n *\r\n * @internal\r\n */\r\n getMaxBatchSize() {\r\n return getDevice().getDeviceCaps().shaderCaps.maxUniformBufferSize / 64;\r\n }\r\n /**\r\n * Push a punctual light\r\n * @param light - The light to be pushed\r\n */\r\n pushLight(light: PunctualLight) {\r\n if (light.castShadow) {\r\n this._shadowedLightList.push(light);\r\n } else {\r\n this._unshadowedLightList.push(light);\r\n }\r\n if (light.isDirectionLight()) {\r\n if (!this._primaryDirectionalLight || light.intensity > this._primaryDirectionalLight.intensity) {\r\n this._primaryDirectionalLight = light;\r\n }\r\n if (light.sunLight) {\r\n this.sunLight = light;\r\n }\r\n } else if (\r\n !this._primaryTransmissionLight ||\r\n this.getTransmissionLightScore(light) > this.getTransmissionLightScore(this._primaryTransmissionLight)\r\n ) {\r\n this._primaryTransmissionLight = light;\r\n }\r\n }\r\n /**\r\n * Push items from another render queue\r\n * @param queue - The render queue to be pushed\r\n */\r\n pushRenderQueue(queue: RenderQueue) {\r\n this._waterList.push(...queue._waterList);\r\n const newItemLists = queue._itemList;\r\n if (!newItemLists) {\r\n return;\r\n }\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n this._itemList.opaque.lit.push(...newItemLists.opaque.lit);\r\n this._itemList.opaque.unlit.push(...newItemLists.opaque.unlit);\r\n this._itemList.transmission.lit.push(...newItemLists.transmission.lit);\r\n this._itemList.transmission.unlit.push(...newItemLists.transmission.unlit);\r\n this._itemList.transparent.lit.push(...newItemLists.transparent.lit);\r\n this._itemList.transparent.unlit.push(...newItemLists.transparent.unlit);\r\n this._itemList.transmission_trans.lit.push(...newItemLists.transmission_trans.lit);\r\n this._itemList.transmission_trans.unlit.push(...newItemLists.transmission_trans.unlit);\r\n this._needSceneColor ||= queue._needSceneColor;\r\n this._needSceneDepth ||= queue._needSceneDepth;\r\n this._needHiZNearest ||= queue._needHiZNearest;\r\n this._needSceneColorWithDepth ||= queue._needSceneColorWithDepth;\r\n this._drawTransparent ||= queue._drawTransparent;\r\n this._sunLight ||= queue._sunLight;\r\n if (\r\n queue._primaryDirectionalLight &&\r\n (!this._primaryDirectionalLight ||\r\n queue._primaryDirectionalLight.intensity > this._primaryDirectionalLight.intensity)\r\n ) {\r\n this._primaryDirectionalLight = queue._primaryDirectionalLight;\r\n }\r\n if (\r\n queue._primaryTransmissionLight &&\r\n (!this._primaryTransmissionLight ||\r\n this.getTransmissionLightScore(queue._primaryTransmissionLight) >\r\n this.getTransmissionLightScore(this._primaryTransmissionLight))\r\n ) {\r\n this._primaryTransmissionLight = queue._primaryTransmissionLight;\r\n }\r\n this._objectColorMaps.push(...queue._objectColorMaps);\r\n }\r\n /**\r\n * Push an item to the render queue\r\n * @param camera - The camera for drawing the item\r\n * @param drawable - The object to be drawn\r\n */\r\n push(camera: Camera, drawable: Drawable) {\r\n if (drawable) {\r\n drawable.pushRenderQueueRef(this._ref);\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n const material = drawable.getMaterial();\r\n const trans =\r\n this._renderPass.type === RENDER_PASS_TYPE_SHADOWMAP &&\r\n material?.useTransparentShadowCasterForPass?.(this._renderPass.type)\r\n ? false\r\n : drawable.getQueueType() === QUEUE_TRANSPARENT;\r\n const unlit = drawable.isUnlit();\r\n const needDepth = !!drawable.needSceneDepth();\r\n const transmission = !!drawable.needSceneColor() || needDepth;\r\n this._needSceneColor ||= transmission;\r\n this._needSceneDepth ||= drawable.needSceneDepth();\r\n this._needHiZNearest ||= !!drawable.needHiZNearest?.();\r\n this._needSceneColorWithDepth ||= transmission && needDepth;\r\n this._drawTransparent ||= trans;\r\n if (camera.getPickResultResolveFunc()) {\r\n drawable.getMaterial()!.objectColor = drawable.getObjectColor();\r\n this._objectColorMaps[0].set(drawable.getDrawableId(), drawable);\r\n }\r\n if (drawable.isBatchable()) {\r\n const instanceList = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0].instanceList\r\n : this._itemList.transmission_trans.lit[0].instanceList\r\n : unlit\r\n ? this._itemList.transparent.unlit[0].instanceList\r\n : this._itemList.transparent.lit[0].instanceList\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0].instanceList\r\n : this._itemList.transmission.lit[0].instanceList\r\n : unlit\r\n ? this._itemList.opaque.unlit[0].instanceList\r\n : this._itemList.opaque.lit[0].instanceList;\r\n const hash = drawable.getInstanceId(this._renderPass);\r\n let drawableList = instanceList[hash];\r\n if (!drawableList) {\r\n drawableList = [];\r\n instanceList[hash] = drawableList;\r\n }\r\n drawableList.push(drawable);\r\n } else {\r\n const list = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0]\r\n : this._itemList.transmission_trans.lit[0]\r\n : unlit\r\n ? this._itemList.transparent.unlit[0]\r\n : this._itemList.transparent.lit[0]\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0]\r\n : this._itemList.transmission.lit[0]\r\n : unlit\r\n ? this._itemList.opaque.unlit[0]\r\n : this._itemList.opaque.lit[0];\r\n const skinAnimation = !!drawable.getBoneMatrices();\r\n const morphAnimation = !!drawable.getMorphData();\r\n let queue: RenderQueueItem[];\r\n if (skinAnimation && morphAnimation) {\r\n queue = list.skinAndMorphItemList;\r\n } else if (skinAnimation) {\r\n queue = list.skinItemList;\r\n } else if (morphAnimation) {\r\n queue = list.morphItemList;\r\n } else {\r\n queue = list.itemList;\r\n }\r\n this.binaryInsert(queue, {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: null\r\n });\r\n if (material) {\r\n list.materialList.add(material.coreMaterial);\r\n }\r\n drawable.applyTransformUniforms(this);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n getDrawableByColor(c: Uint8Array<ArrayBuffer>, map?: Map<number, Drawable>[]) {\r\n const id = (c[0] << 24) + (c[1] << 16) + (c[2] << 8) + c[3];\r\n map = map ?? this._objectColorMaps;\r\n for (const m of map) {\r\n const drawable = m.get(id);\r\n if (drawable) {\r\n return drawable;\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Capture an object-color lookup that remains valid after this queue is reset or disposed.\r\n * @internal\r\n */\r\n createObjectColorLookupSnapshot(): (c: Uint8Array<ArrayBuffer>) => Nullable<Drawable> {\r\n const snapshot = this._objectColorMaps.slice();\r\n return (c: Uint8Array<ArrayBuffer>) => this.getDrawableByColor(c, snapshot);\r\n }\r\n /**\r\n * Removes all items in the render queue\r\n */\r\n reset() {\r\n if (this._itemList) {\r\n // Release all render bundles\r\n for (const k of objectKeys(this._itemList)) {\r\n const itemListBundle: RenderItemListBundle = this._itemList[k];\r\n for (const l of objectKeys(itemListBundle)) {\r\n const listInfo: RenderItemListInfo[] = itemListBundle[l];\r\n for (const info of listInfo) {\r\n if (info.renderQueue === this) {\r\n if (info.renderBundle) {\r\n info.renderBundle.dispose();\r\n }\r\n if (info.skinRenderBundle) {\r\n info.skinRenderBundle.dispose();\r\n }\r\n if (info.morphRenderBundle) {\r\n info.morphRenderBundle.dispose();\r\n }\r\n if (info.skinAndMorphRenderBundle) {\r\n info.skinAndMorphRenderBundle.dispose();\r\n }\r\n if (info.instanceRenderBundle) {\r\n info.instanceRenderBundle.dispose();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this._itemList = null;\r\n }\r\n this._ref.valid = false;\r\n this._ref = { ref: this, valid: true };\r\n this._instanceInfo.clear();\r\n this._objectColorMaps.length = 0;\r\n this._objectColorMaps.push(new Map());\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._primaryDirectionalLight = null;\r\n this._primaryTransmissionLight = null;\r\n this._waterList = [];\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needHiZNearest = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n }\r\n /** @internal */\r\n end(camera: Camera, createRenderBundles?: boolean) {\r\n const frameCounter = getDevice().frameInfo.frameCounter;\r\n const itemList = this._itemList!;\r\n if (!this.itemList) {\r\n return this;\r\n }\r\n const lists = [\r\n itemList.opaque.lit,\r\n itemList.opaque.unlit,\r\n itemList.transmission.lit,\r\n itemList.transmission.unlit,\r\n itemList.transparent.lit,\r\n itemList.transparent.unlit,\r\n itemList.transmission_trans.lit,\r\n itemList.transmission_trans.unlit\r\n ];\r\n for (let i = 0; i < lists.length; i++) {\r\n const list = lists[i];\r\n for (const info of list) {\r\n if (info.renderQueue !== this) {\r\n continue;\r\n }\r\n const instanceList = info.instanceList;\r\n for (const x in instanceList) {\r\n const drawables = instanceList[x];\r\n let bindGroup: Nullable<CachedBindGroup> = null;\r\n let item: Nullable<RenderQueueItem> = null;\r\n for (let i = 0; i < drawables.length; i++) {\r\n const drawable = drawables[i];\r\n const instanceUniforms = drawable.getInstanceUniforms();\r\n const instanceUniformsSize = instanceUniforms?.length ?? 0;\r\n const stride = ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4 + instanceUniformsSize;\r\n if (!bindGroup || bindGroup.offset + stride > maxBufferSizeInFloats) {\r\n bindGroup = this._bindGroupAllocator.allocateInstanceBindGroup(frameCounter, stride);\r\n item = {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: {\r\n bindGroup,\r\n offset: bindGroup.offset,\r\n numInstances: 0,\r\n stride\r\n }\r\n };\r\n this.binaryInsert(info.instanceItemList, item);\r\n drawable.applyInstanceOffsetAndStride(this, stride, bindGroup.offset);\r\n }\r\n const instanceInfo = { bindGroup, offset: bindGroup.offset };\r\n this._instanceInfo.set(drawable, instanceInfo);\r\n drawable.applyTransformUniforms(this);\r\n drawable.applyMaterialUniforms(instanceInfo);\r\n bindGroup.offset += stride;\r\n item!.instanceData!.numInstances++;\r\n const mat = drawable.getMaterial();\r\n if (mat) {\r\n info.materialList.add(mat.coreMaterial);\r\n }\r\n }\r\n }\r\n info.instanceList = {};\r\n if (createRenderBundles) {\r\n if (info.itemList.length > 0) {\r\n info.renderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinItemList.length > 0) {\r\n info.skinRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.morphItemList.length > 0) {\r\n info.morphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinAndMorphItemList.length > 0) {\r\n info.skinAndMorphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.instanceItemList.length > 0) {\r\n info.instanceRenderBundle = new RenderBundleWrapper();\r\n }\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n binaryInsert(itemList: RenderQueueItem[], item: RenderQueueItem) {\r\n let left = 0;\r\n let right = itemList.length - 1;\r\n const newInstanceId = item.drawable.getMaterial()!.instanceId;\r\n while (left <= right) {\r\n const mid = Math.floor((left + right) / 2);\r\n const instanceId = itemList[mid].drawable.getMaterial()!.instanceId;\r\n if (instanceId === newInstanceId) {\r\n itemList.splice(mid + 1, 0, item);\r\n return;\r\n } else if (instanceId < newInstanceId) {\r\n left = mid + 1;\r\n } else {\r\n right = mid - 1;\r\n }\r\n }\r\n itemList.splice(left, 0, item);\r\n }\r\n /**\r\n * Sorts the items in the render queue for rendering\r\n */\r\n sortTransparentItems(cameraPos: Vector3) {\r\n if (this._itemList) {\r\n this._itemList.transparent.lit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n }\r\n }\r\n /** Disposes the render queue */\r\n protected onDispose() {\r\n super.onDispose();\r\n this.reset();\r\n this._ref.valid = false;\r\n }\r\n\r\n private drawableDistanceToCamera(drawable: Drawable, cameraPos: Vector3) {\r\n const drawablePos = drawable.getNode().getWorldPosition(tmpDrawablePos);\r\n return Vector3.distanceSq(drawablePos, cameraPos);\r\n }\r\n private newRenderItemListInfo() {\r\n return {\r\n itemList: [],\r\n skinItemList: [],\r\n morphItemList: [],\r\n skinAndMorphItemList: [],\r\n instanceItemList: [],\r\n materialList: new Set(),\r\n instanceList: {},\r\n renderQueue: this\r\n } as RenderItemListInfo;\r\n }\r\n private newRenderItemListBundle() {\r\n return {\r\n lit: [this.newRenderItemListInfo()],\r\n unlit: [this.newRenderItemListInfo()]\r\n };\r\n }\r\n private newRenderItemList() {\r\n return {\r\n opaque: this.newRenderItemListBundle(),\r\n transmission: this.newRenderItemListBundle(),\r\n transparent: this.newRenderItemListBundle(),\r\n transmission_trans: this.newRenderItemListBundle()\r\n };\r\n }\r\n}\r\n"],"names":["maxBufferSizeInFloats","InstanceBindGroupAllocator","Disposable","_instanceBindGroupLayout","_bindGroupList","_allocFrameStamp","allocateInstanceBindGroup","framestamp","sizeInFloats","k","offset","dirty","buildInfo","ProgramBuilder","getDevice","buildRender","vertex","pb","ShaderHelper","getInstanceDataUniformName","vec4","uniformBuffer","main","fragment","bindGroup","createBindGroup","buffer","Float32Array","push","reset","allocation","onDispose","dispose","length","defaultInstanceBindGroupAlloator","tmpDrawablePos","Vector3","RenderQueue","_needSceneDepth","_needHiZNearest","_needSceneColorWithDepth","renderPass","bindGroupAllocator","_bindGroupAllocator","_itemList","_renderPass","_shadowedLightList","_unshadowedLightList","_sunLight","_primaryDirectionalLight","_primaryTransmissionLight","_waterList","_ref","ref","valid","_instanceInfo","Map","_needSceneColor","_drawTransparent","_objectColorMaps","sunLight","light","primaryDirectionalLight","primaryTransmissionLight","getTransmissionLightScore","isDirectionLight","color","diffuseAndIntensity","luma","x","y","z","range","Math","max","positionAndRange","w","typeWeight","isSpotLight","isPointLight","isRectLight","sqrt","needSceneColor","needSceneDepth","needHiZNearest","needSceneColorWithDepth","drawTransparent","itemList","shadowedLights","waters","pushWater","water","unshadowedLights","getInstanceInfo","drawable","get","getMaxBatchSize","getDeviceCaps","shaderCaps","maxUniformBufferSize","pushLight","castShadow","intensity","pushRenderQueue","queue","newItemLists","newRenderItemList","opaque","lit","unlit","transmission","transparent","transmission_trans","camera","pushRenderQueueRef","material","getMaterial","trans","type","RENDER_PASS_TYPE_SHADOWMAP","useTransparentShadowCasterForPass","getQueueType","QUEUE_TRANSPARENT","isUnlit","needDepth","getPickResultResolveFunc","objectColor","getObjectColor","set","getDrawableId","isBatchable","instanceList","hash","getInstanceId","drawableList","list","skinAnimation","getBoneMatrices","morphAnimation","getMorphData","skinAndMorphItemList","skinItemList","morphItemList","binaryInsert","sortDistance","getSortDistance","instanceData","materialList","add","coreMaterial","applyTransformUniforms","getDrawableByColor","c","map","id","m","createObjectColorLookupSnapshot","snapshot","slice","objectKeys","itemListBundle","l","listInfo","info","renderQueue","renderBundle","skinRenderBundle","morphRenderBundle","skinAndMorphRenderBundle","instanceRenderBundle","clear","end","createRenderBundles","frameCounter","frameInfo","lists","i","drawables","item","instanceUniforms","getInstanceUniforms","instanceUniformsSize","stride","MATERIAL_INSTANCE_DATA_OFFSET","numInstances","instanceItemList","applyInstanceOffsetAndStride","instanceInfo","applyMaterialUniforms","mat","RenderBundleWrapper","left","right","newInstanceId","instanceId","mid","floor","splice","sortTransparentItems","cameraPos","sort","a","b","drawableDistanceToCamera","drawablePos","getNode","getWorldPosition","distanceSq","newRenderItemListInfo","Set","newRenderItemListBundle"],"mappings":"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"}
|
package/dist/render/renderer.js
CHANGED
|
@@ -52,6 +52,10 @@ import { executeForwardPlusGraph } from './rendergraph/forward_plus_builder.js';
|
|
|
52
52
|
// WebGL1 has no 2D array textures; degrade gracefully to the legacy
|
|
53
53
|
// per-light additive shadow path (mirrors the HiZ gating above).
|
|
54
54
|
screenSpaceShadowMask: camera.screenSpaceShadowMask && device.type !== 'webgl',
|
|
55
|
+
// Set by the WaterCaustics module once it has produced a map.
|
|
56
|
+
waterCaustics: false,
|
|
57
|
+
// Resolved by executeForwardPlusGraph before the graph is built.
|
|
58
|
+
underwater: null,
|
|
55
59
|
globalBindGroupAllocator,
|
|
56
60
|
camera,
|
|
57
61
|
compositor: camera.compositor,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sources":["../../src/render/renderer.ts"],"sourcesContent":["import { CopyBlitter } from '../blitter';\r\nimport type { DrawContext } from './drawable';\r\nimport type { Scene } from '../scene';\r\nimport type { Camera } from '../camera';\r\nimport { GlobalBindGroupAllocator } from './globalbindgroup_allocator';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport { executeForwardPlusGraph } from './rendergraph/forward_plus_builder';\r\n\r\n/**\r\n * Forward render scheme\r\n * @internal\r\n */\r\nexport class SceneRenderer {\r\n /**\r\n * Renders a scene by given camera\r\n * @param scene - The scene to render\r\n * @param camera - The camera that will be used to render the scene\r\n */\r\n static renderScene(scene: Scene, camera: Camera): void {\r\n const device = getDevice();\r\n const halfFloatColorBuffer = device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer;\r\n const colorFormat = camera.HDR && halfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const depthFormat = device.getDeviceCaps().framebufferCaps.supportDepth32floatStencil8\r\n ? 'd32fs8'\r\n : 'd24s8';\r\n const globalBindGroupAllocator = GlobalBindGroupAllocator.get();\r\n scene.frameUpdate();\r\n scene.frameUpdatePerCamera(camera);\r\n if (camera && !device.isContextLost()) {\r\n const defaultViewport = (!camera.TAA || device.type === 'webgl') && !camera.viewport && !camera.scissor;\r\n const renderX = camera.viewport ? device.screenXToDevice(camera.viewport[0]) : 0;\r\n const renderY = camera.viewport ? device.screenYToDevice(camera.viewport[1]) : 0;\r\n const renderWidth = camera.viewport\r\n ? device.screenXToDevice(camera.viewport[2])\r\n : device.getDrawingBufferWidth();\r\n const renderHeight = camera.viewport\r\n ? device.screenYToDevice(camera.viewport[3])\r\n : device.getDrawingBufferHeight();\r\n if (renderWidth > 0 && renderHeight > 0) {\r\n const tmpFramebuffer = defaultViewport\r\n ? null\r\n : device.pool.fetchTemporalFramebuffer(false, renderWidth, renderHeight, colorFormat, depthFormat);\r\n const originFramebuffer = device.getFramebuffer();\r\n if (tmpFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n device.clearFrameBuffer(camera.clearColor, camera.clearDepth, camera.clearStencil);\r\n const SSR = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const SSGI =\r\n camera.SSGI &&\r\n camera.HDR &&\r\n camera.ssgiIntensity > 0 &&\r\n scene.env.light.type === 'ibl' &&\r\n !!scene.env.light.envLight?.hasRadiance() &&\r\n !!scene.env.light.envLight?.hasIrradiance();\r\n const SSS = camera.SSS;\r\n const ctx: DrawContext = {\r\n device,\r\n scene,\r\n renderWidth,\r\n renderHeight,\r\n oit: null,\r\n motionVectors:\r\n device.type !== 'webgl' && (camera.TAA || camera.motionBlur || (SSR && camera.ssrTemporal)),\r\n HiZ: camera.HiZ && device.type !== 'webgl',\r\n HiZTexture: null,\r\n // WebGL1 has no 2D array textures; degrade gracefully to the legacy\r\n // per-light additive shadow path (mirrors the HiZ gating above).\r\n screenSpaceShadowMask: camera.screenSpaceShadowMask && device.type !== 'webgl',\r\n globalBindGroupAllocator,\r\n camera,\r\n compositor: camera.compositor,\r\n queue: 0,\r\n lightBlending: false,\r\n renderPass: null,\r\n renderPassHash: null,\r\n shaderVariantHash: null,\r\n flip: false,\r\n depthFormat,\r\n colorFormat,\r\n drawEnvLight: false,\r\n env: null,\r\n sunLight: null,\r\n primaryDirectionalLight: null,\r\n primaryTransmissionLight: null,\r\n materialFlags: 0,\r\n SSR,\r\n SSGI,\r\n SSGIIrradianceHistoryTexture: null,\r\n SSGISurfaceHistoryTexture: null,\r\n SSS,\r\n SSRCalcThickness: SSR && camera.ssrCalcThickness,\r\n // Surface roughness/normal MRT textures are render graph resources\r\n // created by the LightPass; resolved into these fields at execution.\r\n SceneRoughnessTexture: null,\r\n SceneNormalTexture: null,\r\n SSSProfileTexture: null,\r\n SSSParamTexture: null,\r\n SSSDiffuseTexture: null,\r\n SSSTransmissionTexture: null,\r\n SkinSSSTexture: null,\r\n ssrSDFBoxBuffer: null,\r\n ssrSDFBoxCount: 0,\r\n finalFramebuffer: device.getFramebuffer(),\r\n intermediateFramebuffer: null\r\n };\r\n this._renderScene(ctx);\r\n if (tmpFramebuffer) {\r\n device.popDeviceStates();\r\n const oversizedViewport =\r\n renderX < 0 ||\r\n renderY < 0 ||\r\n renderX + renderWidth > device.getDrawingBufferWidth() ||\r\n renderY + renderHeight > device.getDrawingBufferHeight();\r\n const blitter = new CopyBlitter();\r\n if (oversizedViewport) {\r\n blitter.destRect = [renderX, renderY, renderWidth, renderHeight];\r\n } else {\r\n blitter.viewport = camera.viewport ? camera.viewport.slice() : null;\r\n }\r\n blitter.scissor = camera.scissor ? camera.scissor.slice() : null;\r\n blitter.srgbOut = !originFramebuffer;\r\n blitter.blit(\r\n tmpFramebuffer.getColorAttachments()[0],\r\n originFramebuffer ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n } else {\r\n camera.getPickResultResolveFunc()?.(null);\r\n return;\r\n }\r\n }\r\n GlobalBindGroupAllocator.release(globalBindGroupAllocator);\r\n }\r\n\r\n /** @internal */\r\n protected static _renderScene(ctx: DrawContext): void {\r\n executeForwardPlusGraph(ctx);\r\n }\r\n}\r\n"],"names":["SceneRenderer","renderScene","scene","camera","device","getDevice","halfFloatColorBuffer","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","colorFormat","HDR","depthFormat","framebufferCaps","supportDepth32floatStencil8","globalBindGroupAllocator","GlobalBindGroupAllocator","get","frameUpdate","frameUpdatePerCamera","isContextLost","defaultViewport","TAA","type","viewport","scissor","renderX","screenXToDevice","renderY","screenYToDevice","renderWidth","getDrawingBufferWidth","renderHeight","getDrawingBufferHeight","tmpFramebuffer","pool","fetchTemporalFramebuffer","originFramebuffer","getFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","clearColor","clearDepth","clearStencil","SSR","env","light","envLight","hasRadiance","SSGI","ssgiIntensity","hasIrradiance","SSS","ctx","oit","motionVectors","motionBlur","ssrTemporal","HiZ","HiZTexture","screenSpaceShadowMask","compositor","queue","lightBlending","renderPass","renderPassHash","shaderVariantHash","flip","drawEnvLight","sunLight","primaryDirectionalLight","primaryTransmissionLight","materialFlags","SSGIIrradianceHistoryTexture","SSGISurfaceHistoryTexture","SSRCalcThickness","ssrCalcThickness","SceneRoughnessTexture","SceneNormalTexture","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","ssrSDFBoxBuffer","ssrSDFBoxCount","finalFramebuffer","intermediateFramebuffer","_renderScene","popDeviceStates","oversizedViewport","blitter","CopyBlitter","destRect","slice","srgbOut","blit","getColorAttachments","fetchSampler","releaseFrameBuffer","getPickResultResolveFunc","release","executeForwardPlusGraph"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer.js","sources":["../../src/render/renderer.ts"],"sourcesContent":["import { CopyBlitter } from '../blitter';\r\nimport type { DrawContext } from './drawable';\r\nimport type { Scene } from '../scene';\r\nimport type { Camera } from '../camera';\r\nimport { GlobalBindGroupAllocator } from './globalbindgroup_allocator';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport { executeForwardPlusGraph } from './rendergraph/forward_plus_builder';\r\n\r\n/**\r\n * Forward render scheme\r\n * @internal\r\n */\r\nexport class SceneRenderer {\r\n /**\r\n * Renders a scene by given camera\r\n * @param scene - The scene to render\r\n * @param camera - The camera that will be used to render the scene\r\n */\r\n static renderScene(scene: Scene, camera: Camera): void {\r\n const device = getDevice();\r\n const halfFloatColorBuffer = device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer;\r\n const colorFormat = camera.HDR && halfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const depthFormat = device.getDeviceCaps().framebufferCaps.supportDepth32floatStencil8\r\n ? 'd32fs8'\r\n : 'd24s8';\r\n const globalBindGroupAllocator = GlobalBindGroupAllocator.get();\r\n scene.frameUpdate();\r\n scene.frameUpdatePerCamera(camera);\r\n if (camera && !device.isContextLost()) {\r\n const defaultViewport = (!camera.TAA || device.type === 'webgl') && !camera.viewport && !camera.scissor;\r\n const renderX = camera.viewport ? device.screenXToDevice(camera.viewport[0]) : 0;\r\n const renderY = camera.viewport ? device.screenYToDevice(camera.viewport[1]) : 0;\r\n const renderWidth = camera.viewport\r\n ? device.screenXToDevice(camera.viewport[2])\r\n : device.getDrawingBufferWidth();\r\n const renderHeight = camera.viewport\r\n ? device.screenYToDevice(camera.viewport[3])\r\n : device.getDrawingBufferHeight();\r\n if (renderWidth > 0 && renderHeight > 0) {\r\n const tmpFramebuffer = defaultViewport\r\n ? null\r\n : device.pool.fetchTemporalFramebuffer(false, renderWidth, renderHeight, colorFormat, depthFormat);\r\n const originFramebuffer = device.getFramebuffer();\r\n if (tmpFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n device.clearFrameBuffer(camera.clearColor, camera.clearDepth, camera.clearStencil);\r\n const SSR = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const SSGI =\r\n camera.SSGI &&\r\n camera.HDR &&\r\n camera.ssgiIntensity > 0 &&\r\n scene.env.light.type === 'ibl' &&\r\n !!scene.env.light.envLight?.hasRadiance() &&\r\n !!scene.env.light.envLight?.hasIrradiance();\r\n const SSS = camera.SSS;\r\n const ctx: DrawContext = {\r\n device,\r\n scene,\r\n renderWidth,\r\n renderHeight,\r\n oit: null,\r\n motionVectors:\r\n device.type !== 'webgl' && (camera.TAA || camera.motionBlur || (SSR && camera.ssrTemporal)),\r\n HiZ: camera.HiZ && device.type !== 'webgl',\r\n HiZTexture: null,\r\n // WebGL1 has no 2D array textures; degrade gracefully to the legacy\r\n // per-light additive shadow path (mirrors the HiZ gating above).\r\n screenSpaceShadowMask: camera.screenSpaceShadowMask && device.type !== 'webgl',\r\n // Set by the WaterCaustics module once it has produced a map.\r\n waterCaustics: false,\r\n // Resolved by executeForwardPlusGraph before the graph is built.\r\n underwater: null,\r\n globalBindGroupAllocator,\r\n camera,\r\n compositor: camera.compositor,\r\n queue: 0,\r\n lightBlending: false,\r\n renderPass: null,\r\n renderPassHash: null,\r\n shaderVariantHash: null,\r\n flip: false,\r\n depthFormat,\r\n colorFormat,\r\n drawEnvLight: false,\r\n env: null,\r\n sunLight: null,\r\n primaryDirectionalLight: null,\r\n primaryTransmissionLight: null,\r\n materialFlags: 0,\r\n SSR,\r\n SSGI,\r\n SSGIIrradianceHistoryTexture: null,\r\n SSGISurfaceHistoryTexture: null,\r\n SSS,\r\n SSRCalcThickness: SSR && camera.ssrCalcThickness,\r\n // Surface roughness/normal MRT textures are render graph resources\r\n // created by the LightPass; resolved into these fields at execution.\r\n SceneRoughnessTexture: null,\r\n SceneNormalTexture: null,\r\n SSSProfileTexture: null,\r\n SSSParamTexture: null,\r\n SSSDiffuseTexture: null,\r\n SSSTransmissionTexture: null,\r\n SkinSSSTexture: null,\r\n ssrSDFBoxBuffer: null,\r\n ssrSDFBoxCount: 0,\r\n finalFramebuffer: device.getFramebuffer(),\r\n intermediateFramebuffer: null\r\n };\r\n this._renderScene(ctx);\r\n if (tmpFramebuffer) {\r\n device.popDeviceStates();\r\n const oversizedViewport =\r\n renderX < 0 ||\r\n renderY < 0 ||\r\n renderX + renderWidth > device.getDrawingBufferWidth() ||\r\n renderY + renderHeight > device.getDrawingBufferHeight();\r\n const blitter = new CopyBlitter();\r\n if (oversizedViewport) {\r\n blitter.destRect = [renderX, renderY, renderWidth, renderHeight];\r\n } else {\r\n blitter.viewport = camera.viewport ? camera.viewport.slice() : null;\r\n }\r\n blitter.scissor = camera.scissor ? camera.scissor.slice() : null;\r\n blitter.srgbOut = !originFramebuffer;\r\n blitter.blit(\r\n tmpFramebuffer.getColorAttachments()[0],\r\n originFramebuffer ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n } else {\r\n camera.getPickResultResolveFunc()?.(null);\r\n return;\r\n }\r\n }\r\n GlobalBindGroupAllocator.release(globalBindGroupAllocator);\r\n }\r\n\r\n /** @internal */\r\n protected static _renderScene(ctx: DrawContext): void {\r\n executeForwardPlusGraph(ctx);\r\n }\r\n}\r\n"],"names":["SceneRenderer","renderScene","scene","camera","device","getDevice","halfFloatColorBuffer","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","colorFormat","HDR","depthFormat","framebufferCaps","supportDepth32floatStencil8","globalBindGroupAllocator","GlobalBindGroupAllocator","get","frameUpdate","frameUpdatePerCamera","isContextLost","defaultViewport","TAA","type","viewport","scissor","renderX","screenXToDevice","renderY","screenYToDevice","renderWidth","getDrawingBufferWidth","renderHeight","getDrawingBufferHeight","tmpFramebuffer","pool","fetchTemporalFramebuffer","originFramebuffer","getFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","clearColor","clearDepth","clearStencil","SSR","env","light","envLight","hasRadiance","SSGI","ssgiIntensity","hasIrradiance","SSS","ctx","oit","motionVectors","motionBlur","ssrTemporal","HiZ","HiZTexture","screenSpaceShadowMask","waterCaustics","underwater","compositor","queue","lightBlending","renderPass","renderPassHash","shaderVariantHash","flip","drawEnvLight","sunLight","primaryDirectionalLight","primaryTransmissionLight","materialFlags","SSGIIrradianceHistoryTexture","SSGISurfaceHistoryTexture","SSRCalcThickness","ssrCalcThickness","SceneRoughnessTexture","SceneNormalTexture","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","ssrSDFBoxBuffer","ssrSDFBoxCount","finalFramebuffer","intermediateFramebuffer","_renderScene","popDeviceStates","oversizedViewport","blitter","CopyBlitter","destRect","slice","srgbOut","blit","getColorAttachments","fetchSampler","releaseFrameBuffer","getPickResultResolveFunc","release","executeForwardPlusGraph"],"mappings":"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"}
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
SSSTransmission: 'sssTransmission',
|
|
23
23
|
SkinSSS: 'skinSSS',
|
|
24
24
|
ShadowMask: 'shadowMask',
|
|
25
|
+
/** Light-space caustic map projected onto whatever sits under the water. */ WaterCaustics: 'waterCaustics',
|
|
25
26
|
/** Final presented color. The last registration becomes the graph sink. */ PresentedColor: 'presentedColor'
|
|
26
27
|
};
|
|
27
28
|
/** Per-frame registry of named render graph resources. @public */ class RGBlackboard {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blackboard.js","sources":["../../../src/render/rendergraph/blackboard.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport type { RGHandle, RGTextureHandle } from './types';\r\n\r\n/** Typed key used to publish a frame resource. @public */\r\nexport type FrameResourceKey<THandle extends RGHandle = RGHandle> = string & {\r\n readonly __frameResourceHandle: THandle;\r\n};\r\n\r\ntype FrameResourceMap = {\r\n readonly SceneColor: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneColorCopy: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneColorNoFog: FrameResourceKey<RGTextureHandle>;\r\n readonly LinearDepth: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneDepthAttachment: FrameResourceKey<RGTextureHandle>;\r\n readonly MotionVector: FrameResourceKey<RGTextureHandle>;\r\n readonly HiZ: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneRoughness: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneNormal: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSProfile: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSParam: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSDiffuse: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSTransmission: FrameResourceKey<RGTextureHandle>;\r\n readonly SkinSSS: FrameResourceKey<RGTextureHandle>;\r\n readonly ShadowMask: FrameResourceKey<RGTextureHandle>;\r\n readonly PresentedColor: FrameResourceKey<RGTextureHandle>;\r\n};\r\n\r\n/** Well-known frame resource names shared through {@link RGBlackboard}. @public */\r\nexport const FrameResources = {\r\n SceneColor: 'sceneColor',\r\n SceneColorCopy: 'sceneColorCopy',\r\n /**\r\n * Opaque scene color with sky but before height fog is composited.\r\n *\r\n * Screen-space passes read this as the outgoing radiance of a traced hit. Fog\r\n * along the camera-to-hit ray is unrelated to the shading-point-to-hit path\r\n * those passes integrate, and sampling it would both tint hits with the fog\r\n * color and feed back into the next frame. Only published when fog is present\r\n * and a consumer needs it.\r\n */\r\n SceneColorNoFog: 'sceneColorNoFog',\r\n LinearDepth: 'linearDepth',\r\n SceneDepthAttachment: 'sceneDepthAttachment',\r\n MotionVector: 'motionVector',\r\n HiZ: 'hiZ',\r\n SceneRoughness: 'sceneRoughness',\r\n SceneNormal: 'sceneNormal',\r\n SSSProfile: 'sssProfile',\r\n SSSParam: 'sssParam',\r\n SSSDiffuse: 'sssDiffuse',\r\n SSSTransmission: 'sssTransmission',\r\n SkinSSS: 'skinSSS',\r\n ShadowMask: 'shadowMask',\r\n /** Final presented color. The last registration becomes the graph sink. */\r\n PresentedColor: 'presentedColor'\r\n} as unknown as FrameResourceMap;\r\n\r\n/** Per-frame registry of named render graph resources. @public */\r\nexport class RGBlackboard {\r\n /** @internal */\r\n private _handles: Map<string, RGHandle> = new Map();\r\n /** Register or replace a resource handle. */\r\n set<THandle extends RGHandle>(name: FrameResourceKey<THandle>, handle: THandle): void {\r\n this._handles.set(name, handle);\r\n }\r\n /** Return a resource handle, or null when absent. */\r\n get<THandle extends RGHandle = RGHandle>(name: FrameResourceKey<THandle>): Nullable<THandle> {\r\n return (this._handles.get(name) as THandle | undefined) ?? null;\r\n }\r\n /** Check whether a resource is registered. */\r\n has(name: FrameResourceKey): boolean {\r\n return this._handles.has(name);\r\n }\r\n /** Return a required resource handle. */\r\n expect<THandle extends RGHandle = RGHandle>(name: FrameResourceKey<THandle>): THandle {\r\n const handle = this._handles.get(name);\r\n if (!handle) {\r\n throw new Error(`RGBlackboard: required frame resource \"${name}\" was not registered`);\r\n }\r\n return handle as THandle;\r\n }\r\n /** Remove all registered handles. */\r\n clear(): void {\r\n this._handles.clear();\r\n }\r\n}\r\n"],"names":["FrameResources","SceneColor","SceneColorCopy","SceneColorNoFog","LinearDepth","SceneDepthAttachment","MotionVector","HiZ","SceneRoughness","SceneNormal","SSSProfile","SSSParam","SSSDiffuse","SSSTransmission","SkinSSS","ShadowMask","PresentedColor","RGBlackboard","_handles","Map","set","name","handle","get","has","expect","Error","clear"],"mappings":"
|
|
1
|
+
{"version":3,"file":"blackboard.js","sources":["../../../src/render/rendergraph/blackboard.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport type { RGHandle, RGTextureHandle } from './types';\r\n\r\n/** Typed key used to publish a frame resource. @public */\r\nexport type FrameResourceKey<THandle extends RGHandle = RGHandle> = string & {\r\n readonly __frameResourceHandle: THandle;\r\n};\r\n\r\ntype FrameResourceMap = {\r\n readonly SceneColor: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneColorCopy: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneColorNoFog: FrameResourceKey<RGTextureHandle>;\r\n readonly LinearDepth: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneDepthAttachment: FrameResourceKey<RGTextureHandle>;\r\n readonly MotionVector: FrameResourceKey<RGTextureHandle>;\r\n readonly HiZ: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneRoughness: FrameResourceKey<RGTextureHandle>;\r\n readonly SceneNormal: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSProfile: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSParam: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSDiffuse: FrameResourceKey<RGTextureHandle>;\r\n readonly SSSTransmission: FrameResourceKey<RGTextureHandle>;\r\n readonly SkinSSS: FrameResourceKey<RGTextureHandle>;\r\n readonly ShadowMask: FrameResourceKey<RGTextureHandle>;\r\n readonly WaterCaustics: FrameResourceKey<RGTextureHandle>;\r\n readonly PresentedColor: FrameResourceKey<RGTextureHandle>;\r\n};\r\n\r\n/** Well-known frame resource names shared through {@link RGBlackboard}. @public */\r\nexport const FrameResources = {\r\n SceneColor: 'sceneColor',\r\n SceneColorCopy: 'sceneColorCopy',\r\n /**\r\n * Opaque scene color with sky but before height fog is composited.\r\n *\r\n * Screen-space passes read this as the outgoing radiance of a traced hit. Fog\r\n * along the camera-to-hit ray is unrelated to the shading-point-to-hit path\r\n * those passes integrate, and sampling it would both tint hits with the fog\r\n * color and feed back into the next frame. Only published when fog is present\r\n * and a consumer needs it.\r\n */\r\n SceneColorNoFog: 'sceneColorNoFog',\r\n LinearDepth: 'linearDepth',\r\n SceneDepthAttachment: 'sceneDepthAttachment',\r\n MotionVector: 'motionVector',\r\n HiZ: 'hiZ',\r\n SceneRoughness: 'sceneRoughness',\r\n SceneNormal: 'sceneNormal',\r\n SSSProfile: 'sssProfile',\r\n SSSParam: 'sssParam',\r\n SSSDiffuse: 'sssDiffuse',\r\n SSSTransmission: 'sssTransmission',\r\n SkinSSS: 'skinSSS',\r\n ShadowMask: 'shadowMask',\r\n /** Light-space caustic map projected onto whatever sits under the water. */\r\n WaterCaustics: 'waterCaustics',\r\n /** Final presented color. The last registration becomes the graph sink. */\r\n PresentedColor: 'presentedColor'\r\n} as unknown as FrameResourceMap;\r\n\r\n/** Per-frame registry of named render graph resources. @public */\r\nexport class RGBlackboard {\r\n /** @internal */\r\n private _handles: Map<string, RGHandle> = new Map();\r\n /** Register or replace a resource handle. */\r\n set<THandle extends RGHandle>(name: FrameResourceKey<THandle>, handle: THandle): void {\r\n this._handles.set(name, handle);\r\n }\r\n /** Return a resource handle, or null when absent. */\r\n get<THandle extends RGHandle = RGHandle>(name: FrameResourceKey<THandle>): Nullable<THandle> {\r\n return (this._handles.get(name) as THandle | undefined) ?? null;\r\n }\r\n /** Check whether a resource is registered. */\r\n has(name: FrameResourceKey): boolean {\r\n return this._handles.has(name);\r\n }\r\n /** Return a required resource handle. */\r\n expect<THandle extends RGHandle = RGHandle>(name: FrameResourceKey<THandle>): THandle {\r\n const handle = this._handles.get(name);\r\n if (!handle) {\r\n throw new Error(`RGBlackboard: required frame resource \"${name}\" was not registered`);\r\n }\r\n return handle as THandle;\r\n }\r\n /** Remove all registered handles. */\r\n clear(): void {\r\n this._handles.clear();\r\n }\r\n}\r\n"],"names":["FrameResources","SceneColor","SceneColorCopy","SceneColorNoFog","LinearDepth","SceneDepthAttachment","MotionVector","HiZ","SceneRoughness","SceneNormal","SSSProfile","SSSParam","SSSDiffuse","SSSTransmission","SkinSSS","ShadowMask","WaterCaustics","PresentedColor","RGBlackboard","_handles","Map","set","name","handle","get","has","expect","Error","clear"],"mappings":"AA4BA,oFACO,MAAMA,cAAiB,GAAA;IAC5BC,UAAY,EAAA,YAAA;IACZC,cAAgB,EAAA,gBAAA;AAChB;;;;;;;;AAQC,MACDC,eAAiB,EAAA,iBAAA;IACjBC,WAAa,EAAA,aAAA;IACbC,oBAAsB,EAAA,sBAAA;IACtBC,YAAc,EAAA,cAAA;IACdC,GAAK,EAAA,KAAA;IACLC,cAAgB,EAAA,gBAAA;IAChBC,WAAa,EAAA,aAAA;IACbC,UAAY,EAAA,YAAA;IACZC,QAAU,EAAA,UAAA;IACVC,UAAY,EAAA,YAAA;IACZC,eAAiB,EAAA,iBAAA;IACjBC,OAAS,EAAA,SAAA;IACTC,UAAY,EAAA,YAAA;AACZ,iFACAC,aAAe,EAAA,eAAA;AACf,gFACAC,cAAgB,EAAA;AAClB;AAEA,mEACO,MAAMC,YAAAA,CAAAA;AACX,qBACQC,QAAkC,GAAA,IAAIC,GAAM,EAAA;AACpD,kDACAC,GAAAA,CAA8BC,IAA+B,EAAEC,MAAe,EAAQ;AACpF,QAAA,IAAI,CAACJ,QAAQ,CAACE,GAAG,CAACC,IAAMC,EAAAA,MAAAA,CAAAA;AAC1B;0DAEAC,GAAyCF,CAAAA,IAA+B,EAAqB;AAC3F,QAAA,OAAO,IAAK,CAACH,QAAQ,CAACK,GAAG,CAACF,IAAiC,CAAA,IAAA,IAAA;AAC7D;mDAEAG,GAAIH,CAAAA,IAAsB,EAAW;AACnC,QAAA,OAAO,IAAI,CAACH,QAAQ,CAACM,GAAG,CAACH,IAAAA,CAAAA;AAC3B;8CAEAI,MAA4CJ,CAAAA,IAA+B,EAAW;AACpF,QAAA,MAAMC,SAAS,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACF,IAAAA,CAAAA;AACjC,QAAA,IAAI,CAACC,MAAQ,EAAA;AACX,YAAA,MAAM,IAAII,KAAM,CAAA,CAAC,uCAAuC,EAAEL,IAAAA,CAAK,oBAAoB,CAAC,CAAA;AACtF;QACA,OAAOC,MAAAA;AACT;AACA,0CACAK,KAAc,GAAA;QACZ,IAAI,CAACT,QAAQ,CAACS,KAAK,EAAA;AACrB;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device_pool_allocator.js","sources":["../../../src/render/rendergraph/device_pool_allocator.ts"],"sourcesContent":["import type { FrameBuffer, Texture2D, Texture2DArray, TextureFormat, AbstractDevice } from '@zephyr3d/device';\r\nimport type { RGFramebufferDesc, RGTextureAllocator, RGTextureDesc, RGResolvedSize } from './types';\r\nimport { getDevice } from '../../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\n\r\n/** Render graph allocator backed by the device resource pool. @public */\r\nexport class DevicePoolAllocator implements RGTextureAllocator<Texture2D
|
|
1
|
+
{"version":3,"file":"device_pool_allocator.js","sources":["../../../src/render/rendergraph/device_pool_allocator.ts"],"sourcesContent":["import type { FrameBuffer, Texture2D, Texture2DArray, TextureFormat, AbstractDevice } from '@zephyr3d/device';\r\nimport type { RGFramebufferDesc, RGTextureAllocator, RGTextureDesc, RGResolvedSize } from './types';\r\nimport { getDevice } from '../../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\n\r\n/** Render graph allocator backed by the device resource pool. @public */\r\nexport class DevicePoolAllocator implements RGTextureAllocator<Texture2D> {\r\n private _device: Nullable<AbstractDevice>;\r\n /** Create an allocator using the given device or the global device. */\r\n constructor(device?: AbstractDevice) {\r\n this._device = device ?? null;\r\n }\r\n /** Allocate a transient texture from the device pool. */\r\n allocate(desc: RGTextureDesc, size: RGResolvedSize, preferred?: Texture2D): Texture2D {\r\n const device = this._device ?? getDevice();\r\n const requestedMips = desc.mipLevels ?? 1;\r\n // The pool allocates either one mip or a full chain.\r\n if (requestedMips > 1) {\r\n const maxMips = Math.max(1, Math.floor(Math.log2(Math.max(1, size.width, size.height))) + 1);\r\n if (requestedMips > maxMips) {\r\n throw new Error(\r\n `DevicePoolAllocator: texture \"${desc.label ?? '<unnamed>'}\" requested ${requestedMips} ` +\r\n `mip levels, but a ${size.width}x${size.height} texture supports at most ${maxMips}.`\r\n );\r\n }\r\n }\r\n const mipmapping = requestedMips > 1;\r\n const arrayLayers = desc.arrayLayers;\r\n // Any defined arrayLayers value requests Texture2DArray, including 1.\r\n const texture =\r\n arrayLayers !== undefined\r\n ? (device.pool.fetchTemporalTexture2DArray(\r\n false,\r\n desc.format,\r\n size.width,\r\n size.height,\r\n arrayLayers,\r\n mipmapping,\r\n preferred as unknown as Texture2DArray\r\n ) as unknown as Texture2D)\r\n : device.pool.fetchTemporalTexture2D(\r\n false,\r\n desc.format,\r\n size.width,\r\n size.height,\r\n mipmapping,\r\n preferred\r\n );\r\n if (desc.mipLevels && texture.mipLevelCount < desc.mipLevels) {\r\n device.pool.releaseTexture(texture);\r\n throw new Error(\r\n `DevicePoolAllocator: texture \"${desc.label ?? '<unnamed>'}\" requested ${desc.mipLevels} ` +\r\n `mip levels, but only ${texture.mipLevelCount} were allocated.`\r\n );\r\n }\r\n return texture;\r\n }\r\n\r\n /** Release a transient texture to the pool. */\r\n release(texture: Texture2D): void {\r\n const device = this._device ?? getDevice();\r\n device.pool.releaseTexture(texture);\r\n }\r\n\r\n /** Retain a pooled texture beyond graph execution. */\r\n retain(texture: Texture2D): void {\r\n const device = this._device ?? getDevice();\r\n device.pool.retainTexture(texture);\r\n }\r\n\r\n /** Allocate a temporary framebuffer from the pool. */\r\n allocateFramebuffer(desc: RGFramebufferDesc): FrameBuffer {\r\n const device = this._device ?? getDevice();\r\n const colors = Array.isArray(desc.colorAttachments)\r\n ? (desc.colorAttachments as Array<Texture2D | TextureFormat>)\r\n : desc.colorAttachments\r\n ? [desc.colorAttachments as Texture2D | TextureFormat]\r\n : [];\r\n const depthAttachment = (desc.depthAttachment ?? null) as Texture2D | TextureFormat | null;\r\n return device.pool.fetchTemporalFramebuffer(\r\n false,\r\n desc.width ?? 0,\r\n desc.height ?? 0,\r\n colors,\r\n depthAttachment,\r\n desc.mipmapping ?? false,\r\n desc.sampleCount ?? 1,\r\n desc.ignoreDepthStencil ?? true,\r\n desc.attachmentMipLevel ?? 0,\r\n desc.attachmentCubeface ?? 0,\r\n desc.attachmentLayer ?? 0\r\n );\r\n }\r\n\r\n /** Release a temporary framebuffer to the pool. */\r\n releaseFramebuffer(framebuffer: FrameBuffer): void {\r\n const device = this._device ?? getDevice();\r\n device.pool.releaseFrameBuffer(framebuffer);\r\n }\r\n}\r\n"],"names":["DevicePoolAllocator","_device","device","allocate","desc","size","preferred","getDevice","requestedMips","mipLevels","maxMips","Math","max","floor","log2","width","height","Error","label","mipmapping","arrayLayers","texture","undefined","pool","fetchTemporalTexture2DArray","format","fetchTemporalTexture2D","mipLevelCount","releaseTexture","release","retain","retainTexture","allocateFramebuffer","colors","Array","isArray","colorAttachments","depthAttachment","fetchTemporalFramebuffer","sampleCount","ignoreDepthStencil","attachmentMipLevel","attachmentCubeface","attachmentLayer","releaseFramebuffer","framebuffer","releaseFrameBuffer"],"mappings":"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"}
|
|
@@ -558,6 +558,8 @@ const DEFAULT_PROFILING_OPTIONS = {
|
|
|
558
558
|
if (accessScope) {
|
|
559
559
|
this._assertDeclaredAccess(accessScope, attachment, 'texture');
|
|
560
560
|
}
|
|
561
|
+
// The resolved physical texture stands in for the handle; the graph is
|
|
562
|
+
// only parameterized by TTexture, which the allocator produces.
|
|
561
563
|
return this._resolveResource(attachment);
|
|
562
564
|
}
|
|
563
565
|
return attachment;
|