@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
package/dist/render/depthpass.js
CHANGED
|
@@ -12,6 +12,7 @@ import { ShaderHelper } from '../material/shader/helper.js';
|
|
|
12
12
|
_renderBackface;
|
|
13
13
|
_encodeDepth;
|
|
14
14
|
_transmission;
|
|
15
|
+
_motionVectorOnly;
|
|
15
16
|
/**
|
|
16
17
|
* Creates an instance of DepthRenderPass
|
|
17
18
|
*/ constructor(){
|
|
@@ -19,6 +20,30 @@ import { ShaderHelper } from '../material/shader/helper.js';
|
|
|
19
20
|
this._renderBackface = false;
|
|
20
21
|
this._encodeDepth = false;
|
|
21
22
|
this._transmission = false;
|
|
23
|
+
this._motionVectorOnly = false;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Draws the transparent queue for its motion vectors alone.
|
|
27
|
+
*
|
|
28
|
+
* @remarks
|
|
29
|
+
* Blended geometry is absent from the ordinary prepass, so it contributes no
|
|
30
|
+
* velocity and a temporal filter reprojects it with whatever is behind it -
|
|
31
|
+
* which for hair swinging in front of a still background means reprojecting it
|
|
32
|
+
* as if it were still. This mode fills that in: same pass, same shaders, but
|
|
33
|
+
* the framebuffer carries the motion vector attachment only, nothing writes
|
|
34
|
+
* depth, and materials that have not opted in discard.
|
|
35
|
+
*
|
|
36
|
+
* It cannot be exact. One velocity per pixel cannot describe several blended
|
|
37
|
+
* layers, so the value that survives is whichever fragment landed last rather
|
|
38
|
+
* than the nearest. For hair that is the same approximation the dithered path
|
|
39
|
+
* already makes - dither keeps one arbitrary strand per pixel - which is why
|
|
40
|
+
* it holds up there and why it stays opt-in rather than applying to every
|
|
41
|
+
* transparent material.
|
|
42
|
+
*/ get motionVectorOnly() {
|
|
43
|
+
return this._motionVectorOnly;
|
|
44
|
+
}
|
|
45
|
+
set motionVectorOnly(val) {
|
|
46
|
+
this._motionVectorOnly = !!val;
|
|
22
47
|
}
|
|
23
48
|
get transmission() {
|
|
24
49
|
return this._transmission;
|
|
@@ -39,7 +64,7 @@ import { ShaderHelper } from '../material/shader/helper.js';
|
|
|
39
64
|
this._encodeDepth = !!val;
|
|
40
65
|
}
|
|
41
66
|
/** @internal */ _getGlobalBindGroupHash(ctx) {
|
|
42
|
-
return `${Number(this._renderBackface)}:${Number(this._encodeDepth)}:${Number(ctx.motionVectors)}`;
|
|
67
|
+
return `${Number(this._renderBackface)}:${Number(this._encodeDepth)}:${Number(ctx.motionVectors)}:${Number(this._motionVectorOnly)}`;
|
|
43
68
|
}
|
|
44
69
|
/** @internal */ renderItems(ctx, renderCamera, renderQueue) {
|
|
45
70
|
const items = renderQueue.itemList;
|
|
@@ -47,12 +72,21 @@ import { ShaderHelper } from '../material/shader/helper.js';
|
|
|
47
72
|
ctx.drawEnvLight = false;
|
|
48
73
|
ctx.env = null;
|
|
49
74
|
ctx.flip = this.isAutoFlip(ctx);
|
|
75
|
+
// This pass keys its programs off renderPassHash, which Material.calcGlobalHash only
|
|
76
|
+
// consults when shaderVariantHash is null. LightPass clears that field on entry but not
|
|
77
|
+
// on exit, so a depth pass running after it would otherwise inherit the light pass's
|
|
78
|
+
// variant hash and hash to the same key -- handing this pass the light pass's program.
|
|
79
|
+
// The prepass never noticed (it runs first, while the field is still null); the
|
|
80
|
+
// transmission depth pass runs after the light pass and did, silently reusing a
|
|
81
|
+
// single-output program. With motion vectors on, its framebuffer has two attachments and
|
|
82
|
+
// the reuse finally surfaced as a fragment output count mismatch.
|
|
83
|
+
ctx.shaderVariantHash = null;
|
|
50
84
|
ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, renderCamera);
|
|
51
85
|
const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);
|
|
52
86
|
ctx.device.setBindGroup(0, bindGroup);
|
|
53
87
|
ShaderHelper.setCameraUniforms(bindGroup, ctx, renderCamera, true);
|
|
54
88
|
const reverseWinding = ctx.camera.worldMatrixDet < 0;
|
|
55
|
-
const list = this._transmission ? items.transmission : items.opaque;
|
|
89
|
+
const list = this._motionVectorOnly ? items.transparent : this._transmission ? items.transmission : items.opaque;
|
|
56
90
|
for (const lit of list.lit){
|
|
57
91
|
this.drawItemList(lit, ctx, reverseWinding);
|
|
58
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"depthpass.js","sources":["../../src/render/depthpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { RENDER_PASS_TYPE_DEPTH } from '../values';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { Camera } from '../camera';\r\n\r\n/**\r\n * Depth render pass\r\n *\r\n * Scene depth render pass\r\n *\r\n * @public\r\n */\r\nexport class DepthPass extends RenderPass {\r\n private _renderBackface: boolean;\r\n private _encodeDepth: boolean;\r\n private _transmission: boolean;\r\n /**\r\n * Creates an instance of DepthRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_DEPTH);\r\n this._renderBackface = false;\r\n this._encodeDepth = false;\r\n this._transmission = false;\r\n }\r\n get transmission() {\r\n return this._transmission;\r\n }\r\n set transmission(val: boolean) {\r\n this._transmission = val;\r\n }\r\n get renderBackface() {\r\n return this._renderBackface;\r\n }\r\n set renderBackface(val) {\r\n this._renderBackface = !!val;\r\n }\r\n get encodeDepth() {\r\n return this._encodeDepth;\r\n }\r\n set encodeDepth(val) {\r\n this._encodeDepth = !!val;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext) {\r\n return `${Number(this._renderBackface)}:${Number(this._encodeDepth)}:${Number(ctx.motionVectors)}`;\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, renderCamera: Camera, renderQueue: RenderQueue) {\r\n const items = renderQueue.itemList;\r\n if (items) {\r\n ctx.drawEnvLight = false;\r\n ctx.env = null;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, renderCamera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, renderCamera, true);\r\n const reverseWinding = ctx.camera.worldMatrixDet < 0;\r\n const list = this._transmission
|
|
1
|
+
{"version":3,"file":"depthpass.js","sources":["../../src/render/depthpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { RENDER_PASS_TYPE_DEPTH } from '../values';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { Camera } from '../camera';\r\n\r\n/**\r\n * Depth render pass\r\n *\r\n * Scene depth render pass\r\n *\r\n * @public\r\n */\r\nexport class DepthPass extends RenderPass {\r\n private _renderBackface: boolean;\r\n private _encodeDepth: boolean;\r\n private _transmission: boolean;\r\n private _motionVectorOnly: boolean;\r\n /**\r\n * Creates an instance of DepthRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_DEPTH);\r\n this._renderBackface = false;\r\n this._encodeDepth = false;\r\n this._transmission = false;\r\n this._motionVectorOnly = false;\r\n }\r\n /**\r\n * Draws the transparent queue for its motion vectors alone.\r\n *\r\n * @remarks\r\n * Blended geometry is absent from the ordinary prepass, so it contributes no\r\n * velocity and a temporal filter reprojects it with whatever is behind it -\r\n * which for hair swinging in front of a still background means reprojecting it\r\n * as if it were still. This mode fills that in: same pass, same shaders, but\r\n * the framebuffer carries the motion vector attachment only, nothing writes\r\n * depth, and materials that have not opted in discard.\r\n *\r\n * It cannot be exact. One velocity per pixel cannot describe several blended\r\n * layers, so the value that survives is whichever fragment landed last rather\r\n * than the nearest. For hair that is the same approximation the dithered path\r\n * already makes - dither keeps one arbitrary strand per pixel - which is why\r\n * it holds up there and why it stays opt-in rather than applying to every\r\n * transparent material.\r\n */\r\n get motionVectorOnly() {\r\n return this._motionVectorOnly;\r\n }\r\n set motionVectorOnly(val: boolean) {\r\n this._motionVectorOnly = !!val;\r\n }\r\n get transmission() {\r\n return this._transmission;\r\n }\r\n set transmission(val: boolean) {\r\n this._transmission = val;\r\n }\r\n get renderBackface() {\r\n return this._renderBackface;\r\n }\r\n set renderBackface(val) {\r\n this._renderBackface = !!val;\r\n }\r\n get encodeDepth() {\r\n return this._encodeDepth;\r\n }\r\n set encodeDepth(val) {\r\n this._encodeDepth = !!val;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext) {\r\n return `${Number(this._renderBackface)}:${Number(this._encodeDepth)}:${Number(\r\n ctx.motionVectors\r\n )}:${Number(this._motionVectorOnly)}`;\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, renderCamera: Camera, renderQueue: RenderQueue) {\r\n const items = renderQueue.itemList;\r\n if (items) {\r\n ctx.drawEnvLight = false;\r\n ctx.env = null;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n // This pass keys its programs off renderPassHash, which Material.calcGlobalHash only\r\n // consults when shaderVariantHash is null. LightPass clears that field on entry but not\r\n // on exit, so a depth pass running after it would otherwise inherit the light pass's\r\n // variant hash and hash to the same key -- handing this pass the light pass's program.\r\n // The prepass never noticed (it runs first, while the field is still null); the\r\n // transmission depth pass runs after the light pass and did, silently reusing a\r\n // single-output program. With motion vectors on, its framebuffer has two attachments and\r\n // the reuse finally surfaced as a fragment output count mismatch.\r\n ctx.shaderVariantHash = null;\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, renderCamera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, renderCamera, true);\r\n const reverseWinding = ctx.camera.worldMatrixDet < 0;\r\n const list = this._motionVectorOnly\r\n ? items.transparent\r\n : this._transmission\r\n ? items.transmission\r\n : items.opaque;\r\n for (const lit of list.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n for (const unlit of list.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["DepthPass","RenderPass","_renderBackface","_encodeDepth","_transmission","_motionVectorOnly","RENDER_PASS_TYPE_DEPTH","motionVectorOnly","val","transmission","renderBackface","encodeDepth","_getGlobalBindGroupHash","ctx","Number","motionVectors","renderCamera","renderQueue","items","itemList","drawEnvLight","env","flip","isAutoFlip","shaderVariantHash","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","device","setBindGroup","ShaderHelper","setCameraUniforms","reverseWinding","camera","worldMatrixDet","list","transparent","opaque","lit","drawItemList","unlit"],"mappings":"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"}
|
|
@@ -6,10 +6,13 @@ import '../material/unlit.js';
|
|
|
6
6
|
import '../material/particle.js';
|
|
7
7
|
import '../material/subsurfaceprofile.js';
|
|
8
8
|
import '../material/skin.js';
|
|
9
|
+
import '../material/eye.js';
|
|
9
10
|
import '@zephyr3d/device';
|
|
10
11
|
import { MaterialVaryingFlags } from '../values.js';
|
|
11
12
|
import { getDevice } from '../app/api.js';
|
|
12
13
|
import '../material/meshmaterial.js';
|
|
14
|
+
import '../material/hair.js';
|
|
15
|
+
import '../material/hairstrand.js';
|
|
13
16
|
import '../material/grassmaterial.js';
|
|
14
17
|
import '../material/terrain-cm.js';
|
|
15
18
|
import '../material/pbrmr.js';
|
|
@@ -22,6 +25,8 @@ import '../utility/blueprint/material/texture.js';
|
|
|
22
25
|
|
|
23
26
|
let _drawableId = 0;
|
|
24
27
|
const boneTextureSize = new Vector2();
|
|
28
|
+
const skinInfluenceInfo = new Vector4();
|
|
29
|
+
let defaultSkinInfluenceTexture = null;
|
|
25
30
|
const instanceBindGroupTransfromTags = new WeakMap();
|
|
26
31
|
const drawableBindGroupTransfromTags = new WeakMap();
|
|
27
32
|
const bindGroupCache = {};
|
|
@@ -58,6 +63,22 @@ function releaseBindGroup(bindGroup) {
|
|
|
58
63
|
}
|
|
59
64
|
}
|
|
60
65
|
}
|
|
66
|
+
function getDefaultSkinInfluenceTexture() {
|
|
67
|
+
let texture = defaultSkinInfluenceTexture;
|
|
68
|
+
if (!texture) {
|
|
69
|
+
texture = getDevice().createTexture2D('rgba32f', 1, 1, {
|
|
70
|
+
mipmapping: false,
|
|
71
|
+
samplerOptions: {
|
|
72
|
+
minFilter: 'nearest',
|
|
73
|
+
magFilter: 'nearest',
|
|
74
|
+
mipFilter: 'none'
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
texture.update(new Float32Array(4), 0, 0, 1, 1);
|
|
78
|
+
defaultSkinInfluenceTexture = texture;
|
|
79
|
+
}
|
|
80
|
+
return texture;
|
|
81
|
+
}
|
|
61
82
|
function mixinDrawable(baseCls) {
|
|
62
83
|
const cls = class extends baseCls {
|
|
63
84
|
_mdRenderQueueRef;
|
|
@@ -200,14 +221,18 @@ function mixinDrawable(baseCls) {
|
|
|
200
221
|
}
|
|
201
222
|
if (ctx.materialFlags & MaterialVaryingFlags.SKIN_ANIMATION) {
|
|
202
223
|
const boneTexture = this.getBoneMatrices();
|
|
224
|
+
const skinData = this.getSkinInfluenceData();
|
|
203
225
|
drawableBindGroup.setTexture(ShaderHelper.getBoneMatricesUniformName(), boneTexture);
|
|
204
226
|
drawableBindGroup.setValue(ShaderHelper.getBoneInvBindMatrixUniformName(), this.invWorldMatrix);
|
|
205
227
|
boneTextureSize.setXY(boneTexture.width, boneTexture.height);
|
|
206
228
|
drawableBindGroup.setValue(ShaderHelper.getBoneTextureSizeUniformName(), boneTextureSize);
|
|
229
|
+
drawableBindGroup.setTexture(ShaderHelper.getSkinInfluenceDataUniformName(), skinData?.texture?.get() ?? getDefaultSkinInfluenceTexture());
|
|
230
|
+
skinInfluenceInfo.setXYZW(skinData?.width ?? 1, skinData?.height ?? 1, skinData?.influenceCount ?? 4, skinData ? Math.ceil(Math.max(0, skinData.influenceCount - 4) / 2) : 0);
|
|
231
|
+
drawableBindGroup.setValue(ShaderHelper.getSkinInfluenceInfoUniformName(), skinInfluenceInfo);
|
|
207
232
|
}
|
|
208
233
|
if (ctx.materialFlags & MaterialVaryingFlags.MORPH_ANIMATION) {
|
|
209
234
|
const morphData = this.getMorphData();
|
|
210
|
-
const morphInfo = this.
|
|
235
|
+
const morphInfo = this.getRenderMorphInfo();
|
|
211
236
|
drawableBindGroup.setTexture(ShaderHelper.getMorphDataUniformName(), morphData.texture.get());
|
|
212
237
|
drawableBindGroup.setBuffer(ShaderHelper.getMorphInfoUniformName(), morphInfo.buffer.get());
|
|
213
238
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drawable_mixin.js","sources":["../../src/render/drawable_mixin.ts"],"sourcesContent":["import type { Disposable, GenericConstructor, Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { AbstractDevice } from '@zephyr3d/device';\r\nimport type { BindGroup } from '@zephyr3d/device';\r\nimport type { BatchDrawable, DrawContext, Drawable } from './drawable';\r\nimport { ShaderHelper } from '../material';\r\nimport type { DrawableInstanceInfo, RenderQueue, RenderQueueRef } from './render_queue';\r\nimport type { Mesh, SceneNode } from '../scene';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport interface IMixinDrawable {\r\n readonly objectColor: Vector4;\r\n getDrawableId(): number;\r\n pushRenderQueueRef(ref: RenderQueueRef): void;\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number): void;\r\n applyTransformUniforms(renderQueue: RenderQueue): void;\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo): void;\r\n applyMaterialUniformsAll(): void;\r\n getObjectColor(): Vector4;\r\n updateState(): void;\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>): void;\r\n}\r\n\r\nlet _drawableId = 0;\r\nconst boneTextureSize = new Vector2();\r\n\r\nconst instanceBindGroupTransfromTags = new WeakMap<DrawableInstanceInfo, number>();\r\nconst drawableBindGroupTransfromTags = new WeakMap<BindGroup, number>();\r\n\r\nconst bindGroupCache: Record<string, BindGroup[]> = {};\r\nconst usedBindGroups: WeakMap<BindGroup, string> = new WeakMap();\r\n\r\nfunction fetchBindGroup(skinning: boolean, morphing: boolean, instancing: boolean) {\r\n const hash = `${instancing}:${morphing}:${skinning}`;\r\n const bindGroups = bindGroupCache[hash];\r\n let bindGroup: Nullable<BindGroup> = null;\r\n if (bindGroups && bindGroups.length > 0) {\r\n bindGroup = bindGroups.pop()!;\r\n } else {\r\n const layout = ShaderHelper.getDrawableBindGroupLayout(skinning, morphing, instancing);\r\n bindGroup = getDevice().createBindGroup(layout);\r\n }\r\n usedBindGroups.set(bindGroup, hash);\r\n return bindGroup;\r\n}\r\n\r\nfunction releaseBindGroup(bindGroup: Nullable<BindGroup>) {\r\n if (bindGroup) {\r\n const hash = usedBindGroups.get(bindGroup);\r\n if (hash) {\r\n usedBindGroups.delete(bindGroup);\r\n drawableBindGroupTransfromTags.delete(bindGroup);\r\n const bindGroups = bindGroupCache[hash];\r\n if (bindGroups) {\r\n bindGroups.push(bindGroup);\r\n } else {\r\n bindGroupCache[hash] = [bindGroup];\r\n }\r\n } else {\r\n bindGroup.dispose();\r\n }\r\n }\r\n}\r\n\r\nexport function mixinDrawable<\r\n T extends GenericConstructor<\r\n {\r\n getNode(): SceneNode;\r\n } & Disposable\r\n >\r\n>(baseCls: T): T & { new (...args: any[]): IMixinDrawable } {\r\n const cls = class extends baseCls {\r\n private readonly _mdRenderQueueRef: RenderQueueRef[];\r\n private _mdDrawableBindGroup: Nullable<BindGroup>;\r\n private readonly _mdDrawableBindGroupInstanced: Map<RenderQueue, BindGroup>;\r\n private _mdDrawableBindGroupSkin: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupMorph: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupSkinMorph: Nullable<BindGroup>;\r\n private readonly _worldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private _framestampBuffer: Int32Array<ArrayBuffer>;\r\n private readonly _currentWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _prevWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _drawableId: number;\r\n private _objectColor: Nullable<Vector4>;\r\n private _nodeTransformTag: number;\r\n constructor(...args: any[]) {\r\n super(...args);\r\n this._drawableId = ++_drawableId;\r\n this._objectColor = null;\r\n this._mdRenderQueueRef = [];\r\n this._mdDrawableBindGroup = null;\r\n this._mdDrawableBindGroupInstanced = new Map();\r\n this._mdDrawableBindGroupSkin = null;\r\n this._mdDrawableBindGroupMorph = null;\r\n this._mdDrawableBindGroupSkinMorph = null;\r\n this._worldMatrixBuffer = new Float32Array(4 * 9);\r\n this._framestampBuffer = new Int32Array(this._worldMatrixBuffer.buffer, 4 * 16);\r\n this._currentWorldMatrixBuffer = this._worldMatrixBuffer.subarray(0, 16);\r\n this._prevWorldMatrixBuffer = this._worldMatrixBuffer.subarray(20, 36);\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._framestampBuffer[0] = getDevice().frameInfo.frameCounter;\r\n this._framestampBuffer[1] = this._framestampBuffer[0];\r\n this._prevWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._nodeTransformTag = -1;\r\n this.getNode().on('transformchanged', () => {\r\n this.getNode().scene?.queueUpdateDrawable(this as unknown as Drawable);\r\n });\r\n }\r\n getDrawableId() {\r\n return this._drawableId;\r\n }\r\n getObjectColor(): Immutable<Vector4> {\r\n if (!this._objectColor) {\r\n const a = (this._drawableId & 0xff) / 255;\r\n const b = ((this._drawableId >>> 8) & 0xff) / 255;\r\n const g = ((this._drawableId >>> 16) & 0xff) / 255;\r\n const r = ((this._drawableId >>> 24) & 0xff) / 255;\r\n this._objectColor = new Vector4(r, g, b, a);\r\n }\r\n return this._objectColor;\r\n }\r\n pushRenderQueueRef(ref: RenderQueueRef) {\r\n this.renderQueueRefPrune();\r\n if (!this._mdRenderQueueRef.includes(ref)) {\r\n this._mdRenderQueueRef.push(ref);\r\n }\r\n }\r\n renderQueueRefPrune(force = false) {\r\n for (let i = this._mdRenderQueueRef.length - 1; i >= 0; i--) {\r\n const queueRef = this._mdRenderQueueRef[i];\r\n const ref = queueRef.ref;\r\n if (force || !queueRef.valid || ref.disposed) {\r\n this._mdRenderQueueRef.splice(i, 1);\r\n const bindGroup = this._mdDrawableBindGroupInstanced.get(ref);\r\n if (bindGroup) {\r\n releaseBindGroup(bindGroup);\r\n this._mdDrawableBindGroupInstanced.delete(ref);\r\n }\r\n }\r\n }\r\n }\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number) {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), true, renderQueue);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataStrideUniformName(), stride >> 2);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataOffsetUniformName(), offset >> 2);\r\n }\r\n applyTransformUniforms(renderQueue: RenderQueue) {\r\n const instanceInfo = renderQueue.getInstanceInfo(this as unknown as Drawable);\r\n const currentTag = this.getNode().transformTag;\r\n if (instanceInfo) {\r\n const tag = instanceBindGroupTransfromTags.get(instanceInfo) ?? -1;\r\n if (tag !== currentTag) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n instanceInfo.offset * 4,\r\n this._worldMatrixBuffer,\r\n 0,\r\n 36\r\n );\r\n instanceBindGroupTransfromTags.set(instanceInfo, currentTag);\r\n }\r\n } else {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), false, renderQueue);\r\n const tag = drawableBindGroupTransfromTags.get(drawableBindGroup) ?? -1;\r\n if (tag !== currentTag) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getWorldMatrixUniformName(),\r\n this._currentWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixUniformName(),\r\n this._prevWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixFrameUniformName(),\r\n this._framestampBuffer[0]\r\n );\r\n if ((this as unknown as Drawable).getBoneMatrices()) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n }\r\n drawableBindGroupTransfromTags.set(drawableBindGroup, currentTag);\r\n }\r\n }\r\n }\r\n applyMaterialUniformsAll() {\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n const instanceInfo = ref.ref.getInstanceInfo(this as unknown as Drawable);\r\n if (instanceInfo) {\r\n this.applyMaterialUniforms(instanceInfo);\r\n }\r\n }\r\n }\r\n }\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo) {\r\n const uniforms = (this as unknown as BatchDrawable).getInstanceUniforms();\r\n if (uniforms) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n (instanceInfo.offset + ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4) * 4,\r\n uniforms,\r\n 0,\r\n uniforms.length\r\n );\r\n }\r\n }\r\n updateState() {\r\n const currentTag = this.getNode().transformTag;\r\n if (this._nodeTransformTag !== currentTag) {\r\n this._nodeTransformTag = currentTag;\r\n const frame = getDevice().frameInfo.frameCounter;\r\n if (frame !== this._framestampBuffer[1]) {\r\n this._prevWorldMatrixBuffer.set(this._currentWorldMatrixBuffer);\r\n this._framestampBuffer[0] = frame;\r\n this._framestampBuffer[1] = frame;\r\n }\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n this.applyTransformUniforms(ref.ref);\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const device = ctx.device;\r\n const drawableBindGroup = this.getDrawableBindGroup(device, !!ctx.instanceData, renderQueue!);\r\n device.setBindGroup(1, drawableBindGroup);\r\n if (ctx.instanceData) {\r\n device.setBindGroup(3, ctx.instanceData.bindGroup.bindGroup);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SKIN_ANIMATION) {\r\n const boneTexture = (this as unknown as Mesh).getBoneMatrices()!;\r\n drawableBindGroup.setTexture(ShaderHelper.getBoneMatricesUniformName(), boneTexture);\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n boneTextureSize.setXY(boneTexture.width, boneTexture.height);\r\n drawableBindGroup.setValue(ShaderHelper.getBoneTextureSizeUniformName(), boneTextureSize);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.MORPH_ANIMATION) {\r\n const morphData = (this as unknown as Mesh).getMorphData()!;\r\n const morphInfo = (this as unknown as Mesh).getMorphInfo()!;\r\n drawableBindGroup.setTexture(ShaderHelper.getMorphDataUniformName(), morphData.texture!.get()!);\r\n drawableBindGroup.setBuffer(ShaderHelper.getMorphInfoUniformName(), morphInfo.buffer!.get()!);\r\n }\r\n }\r\n /** @internal */\r\n getDrawableBindGroup(device: AbstractDevice, instancing: boolean, renderQueue: RenderQueue) {\r\n const skinning = !!(this as unknown as Drawable).getBoneMatrices();\r\n const morphing = !!(this as unknown as Drawable).getMorphData();\r\n let bindGroup = instancing\r\n ? this._mdDrawableBindGroupInstanced.get(renderQueue)\r\n : skinning && morphing\r\n ? this._mdDrawableBindGroupSkinMorph\r\n : skinning\r\n ? this._mdDrawableBindGroupSkin\r\n : morphing\r\n ? this._mdDrawableBindGroupMorph\r\n : this._mdDrawableBindGroup;\r\n if (!bindGroup) {\r\n bindGroup = fetchBindGroup(skinning, morphing, instancing);\r\n if (instancing) {\r\n this._mdDrawableBindGroupInstanced.set(renderQueue, bindGroup);\r\n } else if (skinning && morphing) {\r\n this._mdDrawableBindGroupSkinMorph = bindGroup;\r\n } else if (skinning) {\r\n this._mdDrawableBindGroupSkin = bindGroup;\r\n } else if (morphing) {\r\n this._mdDrawableBindGroupMorph = bindGroup;\r\n } else {\r\n this._mdDrawableBindGroup = bindGroup;\r\n }\r\n if (!instancing) {\r\n bindGroup.setValue(ShaderHelper.getObjectColorUniformName(), this.getObjectColor());\r\n }\r\n }\r\n return bindGroup;\r\n }\r\n onDispose() {\r\n super.onDispose();\r\n this.renderQueueRefPrune(true);\r\n releaseBindGroup(this._mdDrawableBindGroup);\r\n releaseBindGroup(this._mdDrawableBindGroupSkin);\r\n releaseBindGroup(this._mdDrawableBindGroupMorph);\r\n }\r\n };\r\n return cls as unknown as T & { new (...args: any[]): IMixinDrawable };\r\n}\r\n"],"names":["_drawableId","boneTextureSize","Vector2","instanceBindGroupTransfromTags","WeakMap","drawableBindGroupTransfromTags","bindGroupCache","usedBindGroups","fetchBindGroup","skinning","morphing","instancing","hash","bindGroups","bindGroup","length","pop","layout","ShaderHelper","getDrawableBindGroupLayout","getDevice","createBindGroup","set","releaseBindGroup","get","delete","push","dispose","mixinDrawable","baseCls","cls","_mdRenderQueueRef","_mdDrawableBindGroup","_mdDrawableBindGroupInstanced","_mdDrawableBindGroupSkin","_mdDrawableBindGroupMorph","_mdDrawableBindGroupSkinMorph","_worldMatrixBuffer","_framestampBuffer","_currentWorldMatrixBuffer","_prevWorldMatrixBuffer","_objectColor","_nodeTransformTag","args","Map","Float32Array","Int32Array","buffer","subarray","getNode","worldMatrix","frameInfo","frameCounter","on","scene","queueUpdateDrawable","getDrawableId","getObjectColor","a","b","g","r","Vector4","pushRenderQueueRef","ref","renderQueueRefPrune","includes","force","i","queueRef","valid","disposed","splice","applyInstanceOffsetAndStride","renderQueue","stride","offset","drawableBindGroup","getDrawableBindGroup","setValue","getInstanceDataStrideUniformName","getInstanceDataOffsetUniformName","applyTransformUniforms","instanceInfo","getInstanceInfo","currentTag","transformTag","tag","setRawData","getInstanceDataUniformName","getWorldMatrixUniformName","getPrevWorldMatrixUniformName","getPrevWorldMatrixFrameUniformName","getBoneMatrices","getBoneInvBindMatrixUniformName","invWorldMatrix","applyMaterialUniformsAll","applyMaterialUniforms","uniforms","getInstanceUniforms","MATERIAL_INSTANCE_DATA_OFFSET","updateState","frame","bind","ctx","device","instanceData","setBindGroup","materialFlags","MaterialVaryingFlags","SKIN_ANIMATION","boneTexture","setTexture","getBoneMatricesUniformName","setXY","width","height","getBoneTextureSizeUniformName","MORPH_ANIMATION","morphData","getMorphData","morphInfo","getMorphInfo","getMorphDataUniformName","texture","setBuffer","getMorphInfoUniformName","getObjectColorUniformName","onDispose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"drawable_mixin.js","sources":["../../src/render/drawable_mixin.ts"],"sourcesContent":["import type { Disposable, GenericConstructor, Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { AbstractDevice, Texture2D } from '@zephyr3d/device';\r\nimport type { BindGroup } from '@zephyr3d/device';\r\nimport type { BatchDrawable, DrawContext, Drawable } from './drawable';\r\nimport { ShaderHelper } from '../material';\r\nimport type { DrawableInstanceInfo, RenderQueue, RenderQueueRef } from './render_queue';\r\nimport type { Mesh, SceneNode } from '../scene';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport interface IMixinDrawable {\r\n readonly objectColor: Vector4;\r\n getDrawableId(): number;\r\n pushRenderQueueRef(ref: RenderQueueRef): void;\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number): void;\r\n applyTransformUniforms(renderQueue: RenderQueue): void;\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo): void;\r\n applyMaterialUniformsAll(): void;\r\n getObjectColor(): Vector4;\r\n updateState(): void;\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>): void;\r\n}\r\n\r\nlet _drawableId = 0;\r\nconst boneTextureSize = new Vector2();\r\nconst skinInfluenceInfo = new Vector4();\r\nlet defaultSkinInfluenceTexture: Nullable<Texture2D> = null;\r\n\r\nconst instanceBindGroupTransfromTags = new WeakMap<DrawableInstanceInfo, number>();\r\nconst drawableBindGroupTransfromTags = new WeakMap<BindGroup, number>();\r\n\r\nconst bindGroupCache: Record<string, BindGroup[]> = {};\r\nconst usedBindGroups: WeakMap<BindGroup, string> = new WeakMap();\r\n\r\nfunction fetchBindGroup(skinning: boolean, morphing: boolean, instancing: boolean) {\r\n const hash = `${instancing}:${morphing}:${skinning}`;\r\n const bindGroups = bindGroupCache[hash];\r\n let bindGroup: Nullable<BindGroup> = null;\r\n if (bindGroups && bindGroups.length > 0) {\r\n bindGroup = bindGroups.pop()!;\r\n } else {\r\n const layout = ShaderHelper.getDrawableBindGroupLayout(skinning, morphing, instancing);\r\n bindGroup = getDevice().createBindGroup(layout);\r\n }\r\n usedBindGroups.set(bindGroup, hash);\r\n return bindGroup;\r\n}\r\n\r\nfunction releaseBindGroup(bindGroup: Nullable<BindGroup>) {\r\n if (bindGroup) {\r\n const hash = usedBindGroups.get(bindGroup);\r\n if (hash) {\r\n usedBindGroups.delete(bindGroup);\r\n drawableBindGroupTransfromTags.delete(bindGroup);\r\n const bindGroups = bindGroupCache[hash];\r\n if (bindGroups) {\r\n bindGroups.push(bindGroup);\r\n } else {\r\n bindGroupCache[hash] = [bindGroup];\r\n }\r\n } else {\r\n bindGroup.dispose();\r\n }\r\n }\r\n}\r\n\r\nfunction getDefaultSkinInfluenceTexture() {\r\n let texture = defaultSkinInfluenceTexture;\r\n if (!texture) {\r\n texture = getDevice().createTexture2D('rgba32f', 1, 1, {\r\n mipmapping: false,\r\n samplerOptions: {\r\n minFilter: 'nearest',\r\n magFilter: 'nearest',\r\n mipFilter: 'none'\r\n }\r\n })!;\r\n texture.update(new Float32Array(4), 0, 0, 1, 1);\r\n defaultSkinInfluenceTexture = texture;\r\n }\r\n return texture;\r\n}\r\n\r\nexport function mixinDrawable<\r\n T extends GenericConstructor<\r\n {\r\n getNode(): SceneNode;\r\n } & Disposable\r\n >\r\n>(baseCls: T): T & { new (...args: any[]): IMixinDrawable } {\r\n const cls = class extends baseCls {\r\n private readonly _mdRenderQueueRef: RenderQueueRef[];\r\n private _mdDrawableBindGroup: Nullable<BindGroup>;\r\n private readonly _mdDrawableBindGroupInstanced: Map<RenderQueue, BindGroup>;\r\n private _mdDrawableBindGroupSkin: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupMorph: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupSkinMorph: Nullable<BindGroup>;\r\n private readonly _worldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private _framestampBuffer: Int32Array<ArrayBuffer>;\r\n private readonly _currentWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _prevWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _drawableId: number;\r\n private _objectColor: Nullable<Vector4>;\r\n private _nodeTransformTag: number;\r\n constructor(...args: any[]) {\r\n super(...args);\r\n this._drawableId = ++_drawableId;\r\n this._objectColor = null;\r\n this._mdRenderQueueRef = [];\r\n this._mdDrawableBindGroup = null;\r\n this._mdDrawableBindGroupInstanced = new Map();\r\n this._mdDrawableBindGroupSkin = null;\r\n this._mdDrawableBindGroupMorph = null;\r\n this._mdDrawableBindGroupSkinMorph = null;\r\n this._worldMatrixBuffer = new Float32Array(4 * 9);\r\n this._framestampBuffer = new Int32Array(this._worldMatrixBuffer.buffer, 4 * 16);\r\n this._currentWorldMatrixBuffer = this._worldMatrixBuffer.subarray(0, 16);\r\n this._prevWorldMatrixBuffer = this._worldMatrixBuffer.subarray(20, 36);\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._framestampBuffer[0] = getDevice().frameInfo.frameCounter;\r\n this._framestampBuffer[1] = this._framestampBuffer[0];\r\n this._prevWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._nodeTransformTag = -1;\r\n this.getNode().on('transformchanged', () => {\r\n this.getNode().scene?.queueUpdateDrawable(this as unknown as Drawable);\r\n });\r\n }\r\n getDrawableId() {\r\n return this._drawableId;\r\n }\r\n getObjectColor(): Immutable<Vector4> {\r\n if (!this._objectColor) {\r\n const a = (this._drawableId & 0xff) / 255;\r\n const b = ((this._drawableId >>> 8) & 0xff) / 255;\r\n const g = ((this._drawableId >>> 16) & 0xff) / 255;\r\n const r = ((this._drawableId >>> 24) & 0xff) / 255;\r\n this._objectColor = new Vector4(r, g, b, a);\r\n }\r\n return this._objectColor;\r\n }\r\n pushRenderQueueRef(ref: RenderQueueRef) {\r\n this.renderQueueRefPrune();\r\n if (!this._mdRenderQueueRef.includes(ref)) {\r\n this._mdRenderQueueRef.push(ref);\r\n }\r\n }\r\n renderQueueRefPrune(force = false) {\r\n for (let i = this._mdRenderQueueRef.length - 1; i >= 0; i--) {\r\n const queueRef = this._mdRenderQueueRef[i];\r\n const ref = queueRef.ref;\r\n if (force || !queueRef.valid || ref.disposed) {\r\n this._mdRenderQueueRef.splice(i, 1);\r\n const bindGroup = this._mdDrawableBindGroupInstanced.get(ref);\r\n if (bindGroup) {\r\n releaseBindGroup(bindGroup);\r\n this._mdDrawableBindGroupInstanced.delete(ref);\r\n }\r\n }\r\n }\r\n }\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number) {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), true, renderQueue);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataStrideUniformName(), stride >> 2);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataOffsetUniformName(), offset >> 2);\r\n }\r\n applyTransformUniforms(renderQueue: RenderQueue) {\r\n const instanceInfo = renderQueue.getInstanceInfo(this as unknown as Drawable);\r\n const currentTag = this.getNode().transformTag;\r\n if (instanceInfo) {\r\n const tag = instanceBindGroupTransfromTags.get(instanceInfo) ?? -1;\r\n if (tag !== currentTag) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n instanceInfo.offset * 4,\r\n this._worldMatrixBuffer,\r\n 0,\r\n 36\r\n );\r\n instanceBindGroupTransfromTags.set(instanceInfo, currentTag);\r\n }\r\n } else {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), false, renderQueue);\r\n const tag = drawableBindGroupTransfromTags.get(drawableBindGroup) ?? -1;\r\n if (tag !== currentTag) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getWorldMatrixUniformName(),\r\n this._currentWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixUniformName(),\r\n this._prevWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixFrameUniformName(),\r\n this._framestampBuffer[0]\r\n );\r\n if ((this as unknown as Drawable).getBoneMatrices()) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n }\r\n drawableBindGroupTransfromTags.set(drawableBindGroup, currentTag);\r\n }\r\n }\r\n }\r\n applyMaterialUniformsAll() {\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n const instanceInfo = ref.ref.getInstanceInfo(this as unknown as Drawable);\r\n if (instanceInfo) {\r\n this.applyMaterialUniforms(instanceInfo);\r\n }\r\n }\r\n }\r\n }\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo) {\r\n const uniforms = (this as unknown as BatchDrawable).getInstanceUniforms();\r\n if (uniforms) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n (instanceInfo.offset + ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4) * 4,\r\n uniforms,\r\n 0,\r\n uniforms.length\r\n );\r\n }\r\n }\r\n updateState() {\r\n const currentTag = this.getNode().transformTag;\r\n if (this._nodeTransformTag !== currentTag) {\r\n this._nodeTransformTag = currentTag;\r\n const frame = getDevice().frameInfo.frameCounter;\r\n if (frame !== this._framestampBuffer[1]) {\r\n this._prevWorldMatrixBuffer.set(this._currentWorldMatrixBuffer);\r\n this._framestampBuffer[0] = frame;\r\n this._framestampBuffer[1] = frame;\r\n }\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n this.applyTransformUniforms(ref.ref);\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const device = ctx.device;\r\n const drawableBindGroup = this.getDrawableBindGroup(device, !!ctx.instanceData, renderQueue!);\r\n device.setBindGroup(1, drawableBindGroup);\r\n if (ctx.instanceData) {\r\n device.setBindGroup(3, ctx.instanceData.bindGroup.bindGroup);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SKIN_ANIMATION) {\r\n const boneTexture = (this as unknown as Mesh).getBoneMatrices()!;\r\n const skinData = (this as unknown as Mesh).getSkinInfluenceData();\r\n drawableBindGroup.setTexture(ShaderHelper.getBoneMatricesUniformName(), boneTexture);\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n boneTextureSize.setXY(boneTexture.width, boneTexture.height);\r\n drawableBindGroup.setValue(ShaderHelper.getBoneTextureSizeUniformName(), boneTextureSize);\r\n drawableBindGroup.setTexture(\r\n ShaderHelper.getSkinInfluenceDataUniformName(),\r\n skinData?.texture?.get() ?? getDefaultSkinInfluenceTexture()\r\n );\r\n skinInfluenceInfo.setXYZW(\r\n skinData?.width ?? 1,\r\n skinData?.height ?? 1,\r\n skinData?.influenceCount ?? 4,\r\n skinData ? Math.ceil(Math.max(0, skinData.influenceCount - 4) / 2) : 0\r\n );\r\n drawableBindGroup.setValue(ShaderHelper.getSkinInfluenceInfoUniformName(), skinInfluenceInfo);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.MORPH_ANIMATION) {\r\n const morphData = (this as unknown as Mesh).getMorphData()!;\r\n const morphInfo = (this as unknown as Mesh).getRenderMorphInfo()!;\r\n drawableBindGroup.setTexture(ShaderHelper.getMorphDataUniformName(), morphData.texture!.get()!);\r\n drawableBindGroup.setBuffer(ShaderHelper.getMorphInfoUniformName(), morphInfo.buffer!.get()!);\r\n }\r\n }\r\n /** @internal */\r\n getDrawableBindGroup(device: AbstractDevice, instancing: boolean, renderQueue: RenderQueue) {\r\n const skinning = !!(this as unknown as Drawable).getBoneMatrices();\r\n const morphing = !!(this as unknown as Drawable).getMorphData();\r\n let bindGroup = instancing\r\n ? this._mdDrawableBindGroupInstanced.get(renderQueue)\r\n : skinning && morphing\r\n ? this._mdDrawableBindGroupSkinMorph\r\n : skinning\r\n ? this._mdDrawableBindGroupSkin\r\n : morphing\r\n ? this._mdDrawableBindGroupMorph\r\n : this._mdDrawableBindGroup;\r\n if (!bindGroup) {\r\n bindGroup = fetchBindGroup(skinning, morphing, instancing);\r\n if (instancing) {\r\n this._mdDrawableBindGroupInstanced.set(renderQueue, bindGroup);\r\n } else if (skinning && morphing) {\r\n this._mdDrawableBindGroupSkinMorph = bindGroup;\r\n } else if (skinning) {\r\n this._mdDrawableBindGroupSkin = bindGroup;\r\n } else if (morphing) {\r\n this._mdDrawableBindGroupMorph = bindGroup;\r\n } else {\r\n this._mdDrawableBindGroup = bindGroup;\r\n }\r\n if (!instancing) {\r\n bindGroup.setValue(ShaderHelper.getObjectColorUniformName(), this.getObjectColor());\r\n }\r\n }\r\n return bindGroup;\r\n }\r\n onDispose() {\r\n super.onDispose();\r\n this.renderQueueRefPrune(true);\r\n releaseBindGroup(this._mdDrawableBindGroup);\r\n releaseBindGroup(this._mdDrawableBindGroupSkin);\r\n releaseBindGroup(this._mdDrawableBindGroupMorph);\r\n }\r\n };\r\n return cls as unknown as T & { new (...args: any[]): IMixinDrawable };\r\n}\r\n"],"names":["_drawableId","boneTextureSize","Vector2","skinInfluenceInfo","Vector4","defaultSkinInfluenceTexture","instanceBindGroupTransfromTags","WeakMap","drawableBindGroupTransfromTags","bindGroupCache","usedBindGroups","fetchBindGroup","skinning","morphing","instancing","hash","bindGroups","bindGroup","length","pop","layout","ShaderHelper","getDrawableBindGroupLayout","getDevice","createBindGroup","set","releaseBindGroup","get","delete","push","dispose","getDefaultSkinInfluenceTexture","texture","createTexture2D","mipmapping","samplerOptions","minFilter","magFilter","mipFilter","update","Float32Array","mixinDrawable","baseCls","cls","_mdRenderQueueRef","_mdDrawableBindGroup","_mdDrawableBindGroupInstanced","_mdDrawableBindGroupSkin","_mdDrawableBindGroupMorph","_mdDrawableBindGroupSkinMorph","_worldMatrixBuffer","_framestampBuffer","_currentWorldMatrixBuffer","_prevWorldMatrixBuffer","_objectColor","_nodeTransformTag","args","Map","Int32Array","buffer","subarray","getNode","worldMatrix","frameInfo","frameCounter","on","scene","queueUpdateDrawable","getDrawableId","getObjectColor","a","b","g","r","pushRenderQueueRef","ref","renderQueueRefPrune","includes","force","i","queueRef","valid","disposed","splice","applyInstanceOffsetAndStride","renderQueue","stride","offset","drawableBindGroup","getDrawableBindGroup","setValue","getInstanceDataStrideUniformName","getInstanceDataOffsetUniformName","applyTransformUniforms","instanceInfo","getInstanceInfo","currentTag","transformTag","tag","setRawData","getInstanceDataUniformName","getWorldMatrixUniformName","getPrevWorldMatrixUniformName","getPrevWorldMatrixFrameUniformName","getBoneMatrices","getBoneInvBindMatrixUniformName","invWorldMatrix","applyMaterialUniformsAll","applyMaterialUniforms","uniforms","getInstanceUniforms","MATERIAL_INSTANCE_DATA_OFFSET","updateState","frame","bind","ctx","device","instanceData","setBindGroup","materialFlags","MaterialVaryingFlags","SKIN_ANIMATION","boneTexture","skinData","getSkinInfluenceData","setTexture","getBoneMatricesUniformName","setXY","width","height","getBoneTextureSizeUniformName","getSkinInfluenceDataUniformName","setXYZW","influenceCount","Math","ceil","max","getSkinInfluenceInfoUniformName","MORPH_ANIMATION","morphData","getMorphData","morphInfo","getRenderMorphInfo","getMorphDataUniformName","setBuffer","getMorphInfoUniformName","getObjectColorUniformName","onDispose"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Vector4, REVERSE_Z, DEPTH_FARTHEST } from '@zephyr3d/base';
|
|
2
|
+
import { OIT } from './oit.js';
|
|
2
3
|
import { drawFullscreenQuad } from './fullscreenquad.js';
|
|
3
4
|
import { tryGetApp } from '../app/api.js';
|
|
4
5
|
|
|
@@ -18,7 +19,7 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
|
|
|
18
19
|
* returns false and the transparent pass falls back to sorted alpha blending.
|
|
19
20
|
*
|
|
20
21
|
* @public
|
|
21
|
-
*/ class DualDepthPeelingOIT extends
|
|
22
|
+
*/ class DualDepthPeelingOIT extends OIT {
|
|
22
23
|
/** Type name of DualDepthPeelingOIT */ static type = 'ddp';
|
|
23
24
|
static DEPTH_CLEAR = new Vector4(-1, -1, -1, -1);
|
|
24
25
|
static FRONT_CLEAR = new Vector4(0, 0, 0, 1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dualdepthpeeling_oit.js","sources":["../../src/render/dualdepthpeeling_oit.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n DeviceCaps,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_FARTHEST, Disposable, REVERSE_Z, Vector4 } from '@zephyr3d/base';\r\nimport type { OIT } from './oit';\r\nimport type { DrawContext } from './drawable';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { tryGetApp } from '../app/api';\r\n\r\nconst DEPTH_FORMAT: TextureFormat = 'rg32f';\r\nconst ACCUM_FORMAT: TextureFormat = 'rgba16f';\r\nconst COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;\r\n\r\n/**\r\n * Dual depth peeling OIT renderer.\r\n *\r\n * @remarks\r\n * This implementation follows the official dual depth peeling pass structure:\r\n * an initialization pass writes the nearest/farthest transparent depth pair, then\r\n * each peel pass ping-pongs the depth pair while accumulating front and back colors.\r\n *\r\n * It requires MRT, per-target blending, min/max blend equations and blendable\r\n * floating-point color targets. If those capabilities are missing, supportDevice()\r\n * returns false and the transparent pass falls back to sorted alpha blending.\r\n *\r\n * @public\r\n */\r\nexport class DualDepthPeelingOIT extends Disposable implements OIT {\r\n /** Type name of DualDepthPeelingOIT */\r\n public static readonly type = 'ddp';\r\n private static readonly DEPTH_CLEAR = new Vector4(-1, -1, -1, -1);\r\n private static readonly FRONT_CLEAR = new Vector4(0, 0, 0, 1);\r\n private static readonly BACK_CLEAR = new Vector4(0, 0, 0, 0);\r\n private static _compositeProgram: Nullable<GPUProgram> = null;\r\n private static _compositeBindGroup: Nullable<BindGroup> = null;\r\n private static _compositeRenderStates: Nullable<RenderStateSet> = null;\r\n private _numPeels: number;\r\n private _currentPass: number;\r\n private _hash: string;\r\n private _depthTargets: [Nullable<Texture2D>, Nullable<Texture2D>];\r\n private _frontTarget: Nullable<Texture2D>;\r\n private _backTarget: Nullable<Texture2D>;\r\n private _framebuffers: [Nullable<FrameBuffer>, Nullable<FrameBuffer>];\r\n private _device: Nullable<AbstractDevice>;\r\n\r\n /**\r\n * Creates an instance of DualDepthPeelingOIT.\r\n *\r\n * @param numPeels - Number of peel iterations after the initialization pass.\r\n */\r\n constructor(numPeels = 8) {\r\n super();\r\n this._numPeels = Math.max(1, Math.floor(numPeels || 0));\r\n this._currentPass = 0;\r\n this._hash = DualDepthPeelingOIT.type;\r\n this._depthTargets = [null, null];\r\n this._frontTarget = null;\r\n this._backTarget = null;\r\n this._framebuffers = [null, null];\r\n this._device = null;\r\n }\r\n\r\n /** Number of front/back peel iterations after the initialization pass. */\r\n get numPeels() {\r\n return this._numPeels;\r\n }\r\n set numPeels(val: number) {\r\n this._numPeels = Math.max(1, Math.floor(val || 0));\r\n }\r\n\r\n /**\r\n * Checks whether dual depth peeling can run with a capability snapshot.\r\n *\r\n * @param deviceType - The device type.\r\n * @param caps - The device capabilities.\r\n * @returns True if dual depth peeling is supported.\r\n */\r\n static supportDeviceCaps(deviceType: string, caps: DeviceCaps) {\r\n const framebufferCaps = caps.framebufferCaps;\r\n const textureCaps = caps.textureCaps;\r\n const shaderCaps = caps.shaderCaps;\r\n const miscCaps = caps.miscCaps;\r\n const webgl2OrBetter = deviceType !== 'webgl' || shaderCaps.maxUniformBufferSize > 0;\r\n return (\r\n webgl2OrBetter &&\r\n framebufferCaps.maxDrawBuffers >= 3 &&\r\n framebufferCaps.supportPerTargetBlending &&\r\n framebufferCaps.maxColorAttachmentBytesPerSample >= COLOR_ATTACHMENT_BYTES_PER_SAMPLE &&\r\n miscCaps.supportBlendMinMax &&\r\n textureCaps.supportHalfFloatColorBuffer &&\r\n textureCaps.supportFloatColorBuffer &&\r\n textureCaps.supportFloatBlending\r\n );\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.getType}\r\n */\r\n getType() {\r\n return DualDepthPeelingOIT.type;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.supportDevice}\r\n */\r\n supportDevice(deviceType: string) {\r\n const device = tryGetApp()?.device;\r\n return (\r\n !!device &&\r\n device.type === deviceType &&\r\n DualDepthPeelingOIT.supportDeviceCaps(deviceType, device.getDeviceCaps())\r\n );\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\r\n */\r\n wantsPremultipliedAlpha() {\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}\r\n */\r\n wantsAdditiveLightPassAlpha() {\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.begin}\r\n */\r\n begin(ctx: DrawContext) {\r\n this.releaseFramebuffers();\r\n if (!ctx.depthTexture) {\r\n return 0;\r\n }\r\n this._device = ctx.device;\r\n this.createFramebuffers(ctx);\r\n return this._numPeels + 1;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.end}\r\n */\r\n end(ctx: DrawContext) {\r\n try {\r\n if (this._frontTarget && this._backTarget) {\r\n this.composite(ctx, ctx.device, this._frontTarget, this._backTarget);\r\n }\r\n } finally {\r\n this.releaseFramebuffers();\r\n this._hash = DualDepthPeelingOIT.type;\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.beginPass}\r\n */\r\n beginPass(ctx: DrawContext, pass: number) {\r\n this._currentPass = pass;\r\n const targetIndex = pass & 1;\r\n const currentDepthTarget = this._depthTargets[targetIndex];\r\n const previousDepthTarget = this._depthTargets[targetIndex ^ 1];\r\n const framebuffer = this._framebuffers[targetIndex];\r\n if (!currentDepthTarget || !framebuffer || (pass > 0 && !previousDepthTarget)) {\r\n return false;\r\n }\r\n this._hash =\r\n pass === 0\r\n ? `${this.getType()}#init#${currentDepthTarget.uid}`\r\n : `${this.getType()}#peel#${previousDepthTarget!.uid}`;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(framebuffer);\r\n ctx.device.clearFrameBuffer(\r\n pass === 0\r\n ? [DualDepthPeelingOIT.DEPTH_CLEAR, DualDepthPeelingOIT.FRONT_CLEAR, DualDepthPeelingOIT.BACK_CLEAR]\r\n : [DualDepthPeelingOIT.DEPTH_CLEAR, null, null],\r\n null,\r\n null\r\n );\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.endPass}\r\n */\r\n endPass(ctx: DrawContext, _pass: number) {\r\n ctx.device.popDeviceStates();\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.setupFragmentOutput}\r\n */\r\n setupFragmentOutput(scope: PBGlobalScope) {\r\n const pb = scope.$builder;\r\n scope.$outputs.Z_DDP_depth = pb.vec2();\r\n scope.$outputs.Z_DDP_frontColor = pb.vec4();\r\n scope.$outputs.Z_DDP_backColor = pb.vec4();\r\n if (this._currentPass > 0) {\r\n scope.Z_DDP_depthTexture = pb.tex2D().uniform(2).noSampler();\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.outputFragmentColor}\r\n */\r\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp, ctx: DrawContext) {\r\n const pb = scope.$builder;\r\n scope.$outputs.Z_DDP_depth = pb.vec2(-1, -1);\r\n scope.$outputs.Z_DDP_frontColor = pb.vec4(0, 0, 0, 0);\r\n scope.$outputs.Z_DDP_backColor = pb.vec4(0, 0, 0, 0);\r\n // The peeling depth encoding is internal to this algorithm; normalize\r\n // device depth to standard orientation (0 = near) so the (-front, back)\r\n // encoding, the max/max blend extraction and the peel window logic stay\r\n // convention independent.\r\n scope.$l.Z_DDP_normDepth = REVERSE_Z\r\n ? pb.sub(1, scope.$builtins.fragCoord.z)\r\n : scope.$builtins.fragCoord.z;\r\n if (this._currentPass === 0) {\r\n scope.$outputs.Z_DDP_depth = pb.vec2(pb.neg(scope.Z_DDP_normDepth), scope.Z_DDP_normDepth);\r\n } else {\r\n scope.$l.Z_DDP_prevDepth = pb.textureLoad(\r\n scope.Z_DDP_depthTexture,\r\n pb.ivec2(scope.$builtins.fragCoord.xy),\r\n 0\r\n ).xy;\r\n scope.$l.Z_DDP_frontDepth = pb.neg(scope.Z_DDP_prevDepth.x);\r\n scope.$l.Z_DDP_backDepth = scope.Z_DDP_prevDepth.y;\r\n scope.$l.Z_DDP_curDepth = scope.Z_DDP_normDepth;\r\n scope.$l.Z_DDP_outputColor = pb.vec4(color.rgb, ctx.lightBlending ? pb.float(0) : color.a);\r\n scope\r\n .$if(\r\n pb.or(\r\n pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth),\r\n pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)\r\n ),\r\n function () {\r\n pb.discard();\r\n }\r\n )\r\n .$elseif(\r\n pb.and(\r\n pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth),\r\n pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)\r\n ),\r\n function () {\r\n this.$outputs.Z_DDP_depth = pb.vec2(pb.neg(this.Z_DDP_normDepth), this.Z_DDP_normDepth);\r\n }\r\n )\r\n .$elseif(\r\n pb.and(\r\n pb.lessThan(scope.Z_DDP_curDepth, pb.add(scope.Z_DDP_frontDepth, 0.000001)),\r\n pb.greaterThan(scope.Z_DDP_curDepth, pb.sub(scope.Z_DDP_frontDepth, 0.000001))\r\n ),\r\n function () {\r\n this.$outputs.Z_DDP_frontColor = this.Z_DDP_outputColor;\r\n }\r\n )\r\n .$else(function () {\r\n this.$outputs.Z_DDP_backColor = this.Z_DDP_outputColor;\r\n });\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.applyUniforms}\r\n */\r\n applyUniforms(_ctx: DrawContext, bindGroup: BindGroup) {\r\n if (this._currentPass > 0) {\r\n bindGroup.setTexture('Z_DDP_depthTexture', this._depthTargets[(this._currentPass & 1) ^ 1]!);\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.calculateHash}\r\n */\r\n calculateHash() {\r\n return this._hash;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.setRenderStates}\r\n */\r\n setRenderStates(rs: RenderStateSet) {\r\n rs.useBlendingState().enable(false).enableAlphaToCoverage(false);\r\n rs.useDepthState().enableTest(true).enableWrite(false);\r\n\r\n rs.useTargetBlendingState(0)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('max', 'max')\r\n .setBlendFunc('one', 'one');\r\n\r\n rs.useTargetBlendingState(1)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('dst-alpha', 'one')\r\n .setBlendFuncAlpha('zero', 'inv-src-alpha');\r\n\r\n rs.useTargetBlendingState(2)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('one', 'inv-src-alpha')\r\n .setBlendFuncAlpha('one', 'inv-src-alpha');\r\n }\r\n\r\n /** @internal */\r\n private createFramebuffers(ctx: DrawContext) {\r\n const device = ctx.device;\r\n const width = ctx.depthTexture!.width;\r\n const height = ctx.depthTexture!.height;\r\n const depthTarget0 = device.pool.fetchTemporalTexture2D(false, DEPTH_FORMAT, width, height, false);\r\n const depthTarget1 = device.pool.fetchTemporalTexture2D(false, DEPTH_FORMAT, width, height, false);\r\n const frontTarget = device.pool.fetchTemporalTexture2D(false, ACCUM_FORMAT, width, height, false);\r\n const backTarget = device.pool.fetchTemporalTexture2D(false, ACCUM_FORMAT, width, height, false);\r\n const framebuffer0 = device.pool.createTemporalFramebuffer(\r\n false,\r\n [depthTarget0, frontTarget, backTarget],\r\n ctx.depthTexture\r\n );\r\n const framebuffer1 = device.pool.createTemporalFramebuffer(\r\n false,\r\n [depthTarget1, frontTarget, backTarget],\r\n ctx.depthTexture\r\n );\r\n device.pool.releaseTexture(depthTarget0);\r\n device.pool.releaseTexture(depthTarget1);\r\n device.pool.releaseTexture(frontTarget);\r\n device.pool.releaseTexture(backTarget);\r\n this._depthTargets = [depthTarget0, depthTarget1];\r\n this._frontTarget = frontTarget;\r\n this._backTarget = backTarget;\r\n this._framebuffers = [framebuffer0, framebuffer1];\r\n }\r\n\r\n /** @internal */\r\n private composite(ctx: DrawContext, device: AbstractDevice, frontTarget: Texture2D, backTarget: Texture2D) {\r\n const currentFramebuffer = device.getFramebuffer();\r\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\r\n const singleColorFramebuffer =\r\n currentFramebuffer && currentFramebuffer.getColorAttachments().length > 1 && colorAttachment\r\n ? device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n colorAttachment,\r\n currentFramebuffer.getDepthAttachment(),\r\n false\r\n )\r\n : null;\r\n if (singleColorFramebuffer) {\r\n const viewport = device.getViewport();\r\n const scissor = device.getScissor();\r\n device.pushDeviceStates();\r\n device.setFramebuffer(singleColorFramebuffer);\r\n device.setViewport(viewport);\r\n device.setScissor(scissor);\r\n }\r\n try {\r\n device.setProgram(DualDepthPeelingOIT.getCompositeProgram(device));\r\n DualDepthPeelingOIT._compositeBindGroup!.setTexture('frontTex', frontTarget);\r\n DualDepthPeelingOIT._compositeBindGroup!.setTexture('backTex', backTarget);\r\n device.setBindGroup(0, DualDepthPeelingOIT._compositeBindGroup!);\r\n drawFullscreenQuad(DualDepthPeelingOIT._compositeRenderStates!);\r\n } finally {\r\n if (singleColorFramebuffer) {\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(singleColorFramebuffer);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n private releaseFramebuffers() {\r\n if (this._device) {\r\n if (this._framebuffers[0]) {\r\n this._device.pool.releaseFrameBuffer(this._framebuffers[0]);\r\n }\r\n if (this._framebuffers[1]) {\r\n this._device.pool.releaseFrameBuffer(this._framebuffers[1]);\r\n }\r\n }\r\n this._depthTargets = [null, null];\r\n this._frontTarget = null;\r\n this._backTarget = null;\r\n this._framebuffers = [null, null];\r\n this._device = null;\r\n }\r\n\r\n /** @internal */\r\n private static getCompositeProgram(device: AbstractDevice) {\r\n if (!this._compositeProgram) {\r\n this._compositeProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.outColor = pb.vec4();\r\n this.frontTex = pb.tex2D().uniform(0);\r\n this.backTex = pb.tex2D().uniform(0);\r\n pb.main(function () {\r\n this.$l.frontColor = pb.textureSample(this.frontTex, this.$inputs.uv);\r\n this.$l.backColor = pb.textureSample(this.backTex, this.$inputs.uv);\r\n this.$l.remainingAlpha = pb.clamp(pb.mul(this.frontColor.a, pb.sub(1, this.backColor.a)), 0, 1);\r\n this.$outputs.outColor = pb.vec4(\r\n pb.add(this.frontColor.rgb, pb.mul(this.frontColor.a, this.backColor.rgb)),\r\n this.remainingAlpha\r\n );\r\n });\r\n }\r\n })!;\r\n this._compositeProgram.name = '@DualDepthPeelingOIT_Composite';\r\n this._compositeBindGroup = device.createBindGroup(this._compositeProgram.bindGroupLayouts[0]);\r\n this._compositeRenderStates = device.createRenderStateSet();\r\n this._compositeRenderStates\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'src-alpha')\r\n .setBlendFuncAlpha('zero', 'one');\r\n this._compositeRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n }\r\n return this._compositeProgram;\r\n }\r\n\r\n protected onDispose() {\r\n super.onDispose();\r\n this.releaseFramebuffers();\r\n }\r\n}\r\n"],"names":["DEPTH_FORMAT","ACCUM_FORMAT","COLOR_ATTACHMENT_BYTES_PER_SAMPLE","DualDepthPeelingOIT","Disposable","type","DEPTH_CLEAR","Vector4","FRONT_CLEAR","BACK_CLEAR","_compositeProgram","_compositeBindGroup","_compositeRenderStates","_numPeels","_currentPass","_hash","_depthTargets","_frontTarget","_backTarget","_framebuffers","_device","numPeels","Math","max","floor","val","supportDeviceCaps","deviceType","caps","framebufferCaps","textureCaps","shaderCaps","miscCaps","webgl2OrBetter","maxUniformBufferSize","maxDrawBuffers","supportPerTargetBlending","maxColorAttachmentBytesPerSample","supportBlendMinMax","supportHalfFloatColorBuffer","supportFloatColorBuffer","supportFloatBlending","getType","supportDevice","device","tryGetApp","getDeviceCaps","wantsPremultipliedAlpha","wantsAdditiveLightPassAlpha","begin","ctx","releaseFramebuffers","depthTexture","createFramebuffers","end","composite","beginPass","pass","targetIndex","currentDepthTarget","previousDepthTarget","framebuffer","uid","pushDeviceStates","setFramebuffer","clearFrameBuffer","endPass","_pass","popDeviceStates","setupFragmentOutput","scope","pb","$builder","$outputs","Z_DDP_depth","vec2","Z_DDP_frontColor","vec4","Z_DDP_backColor","Z_DDP_depthTexture","tex2D","uniform","noSampler","outputFragmentColor","color","$l","Z_DDP_normDepth","REVERSE_Z","sub","$builtins","fragCoord","z","neg","Z_DDP_prevDepth","textureLoad","ivec2","xy","Z_DDP_frontDepth","x","Z_DDP_backDepth","y","Z_DDP_curDepth","Z_DDP_outputColor","rgb","lightBlending","float","a","$if","or","lessThan","add","greaterThan","discard","$elseif","and","$else","applyUniforms","_ctx","bindGroup","setTexture","calculateHash","setRenderStates","rs","useBlendingState","enable","enableAlphaToCoverage","useDepthState","enableTest","enableWrite","useTargetBlendingState","setBlendEquation","setBlendFunc","setBlendFuncRGB","setBlendFuncAlpha","width","height","depthTarget0","pool","fetchTemporalTexture2D","depthTarget1","frontTarget","backTarget","framebuffer0","createTemporalFramebuffer","framebuffer1","releaseTexture","currentFramebuffer","getFramebuffer","colorAttachment","getColorAttachments","singleColorFramebuffer","length","fetchTemporalFramebuffer","getDepthAttachment","viewport","getViewport","scissor","getScissor","setViewport","setScissor","setProgram","getCompositeProgram","setBindGroup","drawFullscreenQuad","releaseFrameBuffer","buildRenderProgram","vertex","$inputs","pos","attrib","uv","main","position","DEPTH_FARTHEST","mul","fragment","outColor","frontTex","backTex","frontColor","textureSample","backColor","remainingAlpha","clamp","name","createBindGroup","bindGroupLayouts","createRenderStateSet","onDispose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dualdepthpeeling_oit.js","sources":["../../src/render/dualdepthpeeling_oit.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n DeviceCaps,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_FARTHEST, REVERSE_Z, Vector4 } from '@zephyr3d/base';\r\nimport { OIT } from './oit';\r\nimport type { DrawContext } from './drawable';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { tryGetApp } from '../app/api';\r\n\r\nconst DEPTH_FORMAT: TextureFormat = 'rg32f';\r\nconst ACCUM_FORMAT: TextureFormat = 'rgba16f';\r\nconst COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;\r\n\r\n/**\r\n * Dual depth peeling OIT renderer.\r\n *\r\n * @remarks\r\n * This implementation follows the official dual depth peeling pass structure:\r\n * an initialization pass writes the nearest/farthest transparent depth pair, then\r\n * each peel pass ping-pongs the depth pair while accumulating front and back colors.\r\n *\r\n * It requires MRT, per-target blending, min/max blend equations and blendable\r\n * floating-point color targets. If those capabilities are missing, supportDevice()\r\n * returns false and the transparent pass falls back to sorted alpha blending.\r\n *\r\n * @public\r\n */\r\nexport class DualDepthPeelingOIT extends OIT {\r\n /** Type name of DualDepthPeelingOIT */\r\n public static readonly type = 'ddp';\r\n private static readonly DEPTH_CLEAR = new Vector4(-1, -1, -1, -1);\r\n private static readonly FRONT_CLEAR = new Vector4(0, 0, 0, 1);\r\n private static readonly BACK_CLEAR = new Vector4(0, 0, 0, 0);\r\n private static _compositeProgram: Nullable<GPUProgram> = null;\r\n private static _compositeBindGroup: Nullable<BindGroup> = null;\r\n private static _compositeRenderStates: Nullable<RenderStateSet> = null;\r\n private _numPeels: number;\r\n private _currentPass: number;\r\n private _hash: string;\r\n private _depthTargets: [Nullable<Texture2D>, Nullable<Texture2D>];\r\n private _frontTarget: Nullable<Texture2D>;\r\n private _backTarget: Nullable<Texture2D>;\r\n private _framebuffers: [Nullable<FrameBuffer>, Nullable<FrameBuffer>];\r\n private _device: Nullable<AbstractDevice>;\r\n\r\n /**\r\n * Creates an instance of DualDepthPeelingOIT.\r\n *\r\n * @param numPeels - Number of peel iterations after the initialization pass.\r\n */\r\n constructor(numPeels = 8) {\r\n super();\r\n this._numPeels = Math.max(1, Math.floor(numPeels || 0));\r\n this._currentPass = 0;\r\n this._hash = DualDepthPeelingOIT.type;\r\n this._depthTargets = [null, null];\r\n this._frontTarget = null;\r\n this._backTarget = null;\r\n this._framebuffers = [null, null];\r\n this._device = null;\r\n }\r\n\r\n /** Number of front/back peel iterations after the initialization pass. */\r\n get numPeels() {\r\n return this._numPeels;\r\n }\r\n set numPeels(val: number) {\r\n this._numPeels = Math.max(1, Math.floor(val || 0));\r\n }\r\n\r\n /**\r\n * Checks whether dual depth peeling can run with a capability snapshot.\r\n *\r\n * @param deviceType - The device type.\r\n * @param caps - The device capabilities.\r\n * @returns True if dual depth peeling is supported.\r\n */\r\n static supportDeviceCaps(deviceType: string, caps: DeviceCaps) {\r\n const framebufferCaps = caps.framebufferCaps;\r\n const textureCaps = caps.textureCaps;\r\n const shaderCaps = caps.shaderCaps;\r\n const miscCaps = caps.miscCaps;\r\n const webgl2OrBetter = deviceType !== 'webgl' || shaderCaps.maxUniformBufferSize > 0;\r\n return (\r\n webgl2OrBetter &&\r\n framebufferCaps.maxDrawBuffers >= 3 &&\r\n framebufferCaps.supportPerTargetBlending &&\r\n framebufferCaps.maxColorAttachmentBytesPerSample >= COLOR_ATTACHMENT_BYTES_PER_SAMPLE &&\r\n miscCaps.supportBlendMinMax &&\r\n textureCaps.supportHalfFloatColorBuffer &&\r\n textureCaps.supportFloatColorBuffer &&\r\n textureCaps.supportFloatBlending\r\n );\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.getType}\r\n */\r\n getType() {\r\n return DualDepthPeelingOIT.type;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.supportDevice}\r\n */\r\n supportDevice(deviceType: string) {\r\n const device = tryGetApp()?.device;\r\n return (\r\n !!device &&\r\n device.type === deviceType &&\r\n DualDepthPeelingOIT.supportDeviceCaps(deviceType, device.getDeviceCaps())\r\n );\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\r\n */\r\n wantsPremultipliedAlpha() {\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}\r\n */\r\n wantsAdditiveLightPassAlpha() {\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.begin}\r\n */\r\n begin(ctx: DrawContext) {\r\n this.releaseFramebuffers();\r\n if (!ctx.depthTexture) {\r\n return 0;\r\n }\r\n this._device = ctx.device;\r\n this.createFramebuffers(ctx);\r\n return this._numPeels + 1;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.end}\r\n */\r\n end(ctx: DrawContext) {\r\n try {\r\n if (this._frontTarget && this._backTarget) {\r\n this.composite(ctx, ctx.device, this._frontTarget, this._backTarget);\r\n }\r\n } finally {\r\n this.releaseFramebuffers();\r\n this._hash = DualDepthPeelingOIT.type;\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.beginPass}\r\n */\r\n beginPass(ctx: DrawContext, pass: number) {\r\n this._currentPass = pass;\r\n const targetIndex = pass & 1;\r\n const currentDepthTarget = this._depthTargets[targetIndex];\r\n const previousDepthTarget = this._depthTargets[targetIndex ^ 1];\r\n const framebuffer = this._framebuffers[targetIndex];\r\n if (!currentDepthTarget || !framebuffer || (pass > 0 && !previousDepthTarget)) {\r\n return false;\r\n }\r\n this._hash =\r\n pass === 0\r\n ? `${this.getType()}#init#${currentDepthTarget.uid}`\r\n : `${this.getType()}#peel#${previousDepthTarget!.uid}`;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(framebuffer);\r\n ctx.device.clearFrameBuffer(\r\n pass === 0\r\n ? [DualDepthPeelingOIT.DEPTH_CLEAR, DualDepthPeelingOIT.FRONT_CLEAR, DualDepthPeelingOIT.BACK_CLEAR]\r\n : [DualDepthPeelingOIT.DEPTH_CLEAR, null, null],\r\n null,\r\n null\r\n );\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.endPass}\r\n */\r\n endPass(ctx: DrawContext, _pass: number) {\r\n ctx.device.popDeviceStates();\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.setupFragmentOutput}\r\n */\r\n setupFragmentOutput(scope: PBGlobalScope) {\r\n const pb = scope.$builder;\r\n scope.$outputs.Z_DDP_depth = pb.vec2();\r\n scope.$outputs.Z_DDP_frontColor = pb.vec4();\r\n scope.$outputs.Z_DDP_backColor = pb.vec4();\r\n if (this._currentPass > 0) {\r\n scope.Z_DDP_depthTexture = pb.tex2D().uniform(2).noSampler();\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.outputFragmentColor}\r\n */\r\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp, ctx: DrawContext) {\r\n const pb = scope.$builder;\r\n scope.$outputs.Z_DDP_depth = pb.vec2(-1, -1);\r\n scope.$outputs.Z_DDP_frontColor = pb.vec4(0, 0, 0, 0);\r\n scope.$outputs.Z_DDP_backColor = pb.vec4(0, 0, 0, 0);\r\n // The peeling depth encoding is internal to this algorithm; normalize\r\n // device depth to standard orientation (0 = near) so the (-front, back)\r\n // encoding, the max/max blend extraction and the peel window logic stay\r\n // convention independent.\r\n scope.$l.Z_DDP_normDepth = REVERSE_Z\r\n ? pb.sub(1, scope.$builtins.fragCoord.z)\r\n : scope.$builtins.fragCoord.z;\r\n if (this._currentPass === 0) {\r\n scope.$outputs.Z_DDP_depth = pb.vec2(pb.neg(scope.Z_DDP_normDepth), scope.Z_DDP_normDepth);\r\n } else {\r\n scope.$l.Z_DDP_prevDepth = pb.textureLoad(\r\n scope.Z_DDP_depthTexture,\r\n pb.ivec2(scope.$builtins.fragCoord.xy),\r\n 0\r\n ).xy;\r\n scope.$l.Z_DDP_frontDepth = pb.neg(scope.Z_DDP_prevDepth.x);\r\n scope.$l.Z_DDP_backDepth = scope.Z_DDP_prevDepth.y;\r\n scope.$l.Z_DDP_curDepth = scope.Z_DDP_normDepth;\r\n scope.$l.Z_DDP_outputColor = pb.vec4(color.rgb, ctx.lightBlending ? pb.float(0) : color.a);\r\n scope\r\n .$if(\r\n pb.or(\r\n pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth),\r\n pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)\r\n ),\r\n function () {\r\n pb.discard();\r\n }\r\n )\r\n .$elseif(\r\n pb.and(\r\n pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth),\r\n pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)\r\n ),\r\n function () {\r\n this.$outputs.Z_DDP_depth = pb.vec2(pb.neg(this.Z_DDP_normDepth), this.Z_DDP_normDepth);\r\n }\r\n )\r\n .$elseif(\r\n pb.and(\r\n pb.lessThan(scope.Z_DDP_curDepth, pb.add(scope.Z_DDP_frontDepth, 0.000001)),\r\n pb.greaterThan(scope.Z_DDP_curDepth, pb.sub(scope.Z_DDP_frontDepth, 0.000001))\r\n ),\r\n function () {\r\n this.$outputs.Z_DDP_frontColor = this.Z_DDP_outputColor;\r\n }\r\n )\r\n .$else(function () {\r\n this.$outputs.Z_DDP_backColor = this.Z_DDP_outputColor;\r\n });\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.applyUniforms}\r\n */\r\n applyUniforms(_ctx: DrawContext, bindGroup: BindGroup) {\r\n if (this._currentPass > 0) {\r\n bindGroup.setTexture('Z_DDP_depthTexture', this._depthTargets[(this._currentPass & 1) ^ 1]!);\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.calculateHash}\r\n */\r\n calculateHash() {\r\n return this._hash;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.setRenderStates}\r\n */\r\n setRenderStates(rs: RenderStateSet) {\r\n rs.useBlendingState().enable(false).enableAlphaToCoverage(false);\r\n rs.useDepthState().enableTest(true).enableWrite(false);\r\n\r\n rs.useTargetBlendingState(0)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('max', 'max')\r\n .setBlendFunc('one', 'one');\r\n\r\n rs.useTargetBlendingState(1)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('dst-alpha', 'one')\r\n .setBlendFuncAlpha('zero', 'inv-src-alpha');\r\n\r\n rs.useTargetBlendingState(2)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('one', 'inv-src-alpha')\r\n .setBlendFuncAlpha('one', 'inv-src-alpha');\r\n }\r\n\r\n /** @internal */\r\n private createFramebuffers(ctx: DrawContext) {\r\n const device = ctx.device;\r\n const width = ctx.depthTexture!.width;\r\n const height = ctx.depthTexture!.height;\r\n const depthTarget0 = device.pool.fetchTemporalTexture2D(false, DEPTH_FORMAT, width, height, false);\r\n const depthTarget1 = device.pool.fetchTemporalTexture2D(false, DEPTH_FORMAT, width, height, false);\r\n const frontTarget = device.pool.fetchTemporalTexture2D(false, ACCUM_FORMAT, width, height, false);\r\n const backTarget = device.pool.fetchTemporalTexture2D(false, ACCUM_FORMAT, width, height, false);\r\n const framebuffer0 = device.pool.createTemporalFramebuffer(\r\n false,\r\n [depthTarget0, frontTarget, backTarget],\r\n ctx.depthTexture\r\n );\r\n const framebuffer1 = device.pool.createTemporalFramebuffer(\r\n false,\r\n [depthTarget1, frontTarget, backTarget],\r\n ctx.depthTexture\r\n );\r\n device.pool.releaseTexture(depthTarget0);\r\n device.pool.releaseTexture(depthTarget1);\r\n device.pool.releaseTexture(frontTarget);\r\n device.pool.releaseTexture(backTarget);\r\n this._depthTargets = [depthTarget0, depthTarget1];\r\n this._frontTarget = frontTarget;\r\n this._backTarget = backTarget;\r\n this._framebuffers = [framebuffer0, framebuffer1];\r\n }\r\n\r\n /** @internal */\r\n private composite(ctx: DrawContext, device: AbstractDevice, frontTarget: Texture2D, backTarget: Texture2D) {\r\n const currentFramebuffer = device.getFramebuffer();\r\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\r\n const singleColorFramebuffer =\r\n currentFramebuffer && currentFramebuffer.getColorAttachments().length > 1 && colorAttachment\r\n ? device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n colorAttachment,\r\n currentFramebuffer.getDepthAttachment(),\r\n false\r\n )\r\n : null;\r\n if (singleColorFramebuffer) {\r\n const viewport = device.getViewport();\r\n const scissor = device.getScissor();\r\n device.pushDeviceStates();\r\n device.setFramebuffer(singleColorFramebuffer);\r\n device.setViewport(viewport);\r\n device.setScissor(scissor);\r\n }\r\n try {\r\n device.setProgram(DualDepthPeelingOIT.getCompositeProgram(device));\r\n DualDepthPeelingOIT._compositeBindGroup!.setTexture('frontTex', frontTarget);\r\n DualDepthPeelingOIT._compositeBindGroup!.setTexture('backTex', backTarget);\r\n device.setBindGroup(0, DualDepthPeelingOIT._compositeBindGroup!);\r\n drawFullscreenQuad(DualDepthPeelingOIT._compositeRenderStates!);\r\n } finally {\r\n if (singleColorFramebuffer) {\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(singleColorFramebuffer);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n private releaseFramebuffers() {\r\n if (this._device) {\r\n if (this._framebuffers[0]) {\r\n this._device.pool.releaseFrameBuffer(this._framebuffers[0]);\r\n }\r\n if (this._framebuffers[1]) {\r\n this._device.pool.releaseFrameBuffer(this._framebuffers[1]);\r\n }\r\n }\r\n this._depthTargets = [null, null];\r\n this._frontTarget = null;\r\n this._backTarget = null;\r\n this._framebuffers = [null, null];\r\n this._device = null;\r\n }\r\n\r\n /** @internal */\r\n private static getCompositeProgram(device: AbstractDevice) {\r\n if (!this._compositeProgram) {\r\n this._compositeProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.outColor = pb.vec4();\r\n this.frontTex = pb.tex2D().uniform(0);\r\n this.backTex = pb.tex2D().uniform(0);\r\n pb.main(function () {\r\n this.$l.frontColor = pb.textureSample(this.frontTex, this.$inputs.uv);\r\n this.$l.backColor = pb.textureSample(this.backTex, this.$inputs.uv);\r\n this.$l.remainingAlpha = pb.clamp(pb.mul(this.frontColor.a, pb.sub(1, this.backColor.a)), 0, 1);\r\n this.$outputs.outColor = pb.vec4(\r\n pb.add(this.frontColor.rgb, pb.mul(this.frontColor.a, this.backColor.rgb)),\r\n this.remainingAlpha\r\n );\r\n });\r\n }\r\n })!;\r\n this._compositeProgram.name = '@DualDepthPeelingOIT_Composite';\r\n this._compositeBindGroup = device.createBindGroup(this._compositeProgram.bindGroupLayouts[0]);\r\n this._compositeRenderStates = device.createRenderStateSet();\r\n this._compositeRenderStates\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'src-alpha')\r\n .setBlendFuncAlpha('zero', 'one');\r\n this._compositeRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n }\r\n return this._compositeProgram;\r\n }\r\n\r\n protected onDispose() {\r\n super.onDispose();\r\n this.releaseFramebuffers();\r\n }\r\n}\r\n"],"names":["DEPTH_FORMAT","ACCUM_FORMAT","COLOR_ATTACHMENT_BYTES_PER_SAMPLE","DualDepthPeelingOIT","OIT","type","DEPTH_CLEAR","Vector4","FRONT_CLEAR","BACK_CLEAR","_compositeProgram","_compositeBindGroup","_compositeRenderStates","_numPeels","_currentPass","_hash","_depthTargets","_frontTarget","_backTarget","_framebuffers","_device","numPeels","Math","max","floor","val","supportDeviceCaps","deviceType","caps","framebufferCaps","textureCaps","shaderCaps","miscCaps","webgl2OrBetter","maxUniformBufferSize","maxDrawBuffers","supportPerTargetBlending","maxColorAttachmentBytesPerSample","supportBlendMinMax","supportHalfFloatColorBuffer","supportFloatColorBuffer","supportFloatBlending","getType","supportDevice","device","tryGetApp","getDeviceCaps","wantsPremultipliedAlpha","wantsAdditiveLightPassAlpha","begin","ctx","releaseFramebuffers","depthTexture","createFramebuffers","end","composite","beginPass","pass","targetIndex","currentDepthTarget","previousDepthTarget","framebuffer","uid","pushDeviceStates","setFramebuffer","clearFrameBuffer","endPass","_pass","popDeviceStates","setupFragmentOutput","scope","pb","$builder","$outputs","Z_DDP_depth","vec2","Z_DDP_frontColor","vec4","Z_DDP_backColor","Z_DDP_depthTexture","tex2D","uniform","noSampler","outputFragmentColor","color","$l","Z_DDP_normDepth","REVERSE_Z","sub","$builtins","fragCoord","z","neg","Z_DDP_prevDepth","textureLoad","ivec2","xy","Z_DDP_frontDepth","x","Z_DDP_backDepth","y","Z_DDP_curDepth","Z_DDP_outputColor","rgb","lightBlending","float","a","$if","or","lessThan","add","greaterThan","discard","$elseif","and","$else","applyUniforms","_ctx","bindGroup","setTexture","calculateHash","setRenderStates","rs","useBlendingState","enable","enableAlphaToCoverage","useDepthState","enableTest","enableWrite","useTargetBlendingState","setBlendEquation","setBlendFunc","setBlendFuncRGB","setBlendFuncAlpha","width","height","depthTarget0","pool","fetchTemporalTexture2D","depthTarget1","frontTarget","backTarget","framebuffer0","createTemporalFramebuffer","framebuffer1","releaseTexture","currentFramebuffer","getFramebuffer","colorAttachment","getColorAttachments","singleColorFramebuffer","length","fetchTemporalFramebuffer","getDepthAttachment","viewport","getViewport","scissor","getScissor","setViewport","setScissor","setProgram","getCompositeProgram","setBindGroup","drawFullscreenQuad","releaseFrameBuffer","buildRenderProgram","vertex","$inputs","pos","attrib","uv","main","position","DEPTH_FARTHEST","mul","fragment","outColor","frontTex","backTex","frontColor","textureSample","backColor","remainingAlpha","clamp","name","createBindGroup","bindGroupLayouts","createRenderStateSet","onDispose"],"mappings":";;;;;AAoBA,MAAMA,YAA8B,GAAA,OAAA;AACpC,MAAMC,YAA8B,GAAA,SAAA;AACpC,MAAMC,iCAAAA,GAAoC,IAAI,CAAI,GAAA,CAAA;AAElD;;;;;;;;;;;;;IAcO,MAAMC,mBAA4BC,SAAAA,GAAAA,CAAAA;4CAEvC,OAAuBC,IAAAA,GAAO,KAAM;IACpC,OAAwBC,WAAAA,GAAc,IAAIC,OAAAA,CAAQ,EAAC,EAAG,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA;AAClE,IAAA,OAAwBC,cAAc,IAAID,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,GAAG,CAAG,CAAA;AAC9D,IAAA,OAAwBE,aAAa,IAAIF,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,GAAG,CAAG,CAAA;AAC7D,IAAA,OAAeG,oBAA0C,IAAK;AAC9D,IAAA,OAAeC,sBAA2C,IAAK;AAC/D,IAAA,OAAeC,yBAAmD,IAAK;IAC/DC,SAAkB;IAClBC,YAAqB;IACrBC,KAAc;IACdC,aAA0D;IAC1DC,YAAkC;IAClCC,WAAiC;IACjCC,aAA8D;IAC9DC,OAAkC;AAE1C;;;;MAKA,WAAA,CAAYC,QAAW,GAAA,CAAC,CAAE;QACxB,KAAK,EAAA;QACL,IAAI,CAACR,SAAS,GAAGS,IAAKC,CAAAA,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,KAAK,CAACH,QAAY,IAAA,CAAA,CAAA,CAAA;QACpD,IAAI,CAACP,YAAY,GAAG,CAAA;AACpB,QAAA,IAAI,CAACC,KAAK,GAAGZ,mBAAAA,CAAoBE,IAAI;QACrC,IAAI,CAACW,aAAa,GAAG;AAAC,YAAA,IAAA;AAAM,YAAA;AAAK,SAAA;QACjC,IAAI,CAACC,YAAY,GAAG,IAAA;QACpB,IAAI,CAACC,WAAW,GAAG,IAAA;QACnB,IAAI,CAACC,aAAa,GAAG;AAAC,YAAA,IAAA;AAAM,YAAA;AAAK,SAAA;QACjC,IAAI,CAACC,OAAO,GAAG,IAAA;AACjB;+EAGA,IAAIC,QAAW,GAAA;QACb,OAAO,IAAI,CAACR,SAAS;AACvB;IACA,IAAIQ,QAAAA,CAASI,GAAW,EAAE;QACxB,IAAI,CAACZ,SAAS,GAAGS,IAAKC,CAAAA,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,KAAK,CAACC,GAAO,IAAA,CAAA,CAAA,CAAA;AACjD;AAEA;;;;;;AAMC,MACD,OAAOC,iBAAAA,CAAkBC,UAAkB,EAAEC,IAAgB,EAAE;QAC7D,MAAMC,eAAAA,GAAkBD,KAAKC,eAAe;QAC5C,MAAMC,WAAAA,GAAcF,KAAKE,WAAW;QACpC,MAAMC,UAAAA,GAAaH,KAAKG,UAAU;QAClC,MAAMC,QAAAA,GAAWJ,KAAKI,QAAQ;AAC9B,QAAA,MAAMC,cAAiBN,GAAAA,UAAAA,KAAe,OAAWI,IAAAA,UAAAA,CAAWG,oBAAoB,GAAG,CAAA;QACnF,OACED,cAAAA,IACAJ,gBAAgBM,cAAc,IAAI,KAClCN,eAAgBO,CAAAA,wBAAwB,IACxCP,eAAAA,CAAgBQ,gCAAgC,IAAInC,qCACpD8B,QAASM,CAAAA,kBAAkB,IAC3BR,WAAYS,CAAAA,2BAA2B,IACvCT,WAAYU,CAAAA,uBAAuB,IACnCV,WAAAA,CAAYW,oBAAoB;AAEpC;AAEA;;AAEC,MACDC,OAAU,GAAA;AACR,QAAA,OAAOvC,oBAAoBE,IAAI;AACjC;AAEA;;MAGAsC,aAAAA,CAAchB,UAAkB,EAAE;AAChC,QAAA,MAAMiB,SAASC,SAAaD,EAAAA,EAAAA,MAAAA;AAC5B,QAAA,OACE,CAAC,CAACA,MACFA,IAAAA,MAAAA,CAAOvC,IAAI,KAAKsB,UAChBxB,IAAAA,mBAAAA,CAAoBuB,iBAAiB,CAACC,UAAYiB,EAAAA,MAAAA,CAAOE,aAAa,EAAA,CAAA;AAE1E;AAEA;;AAEC,MACDC,uBAA0B,GAAA;QACxB,OAAO,IAAA;AACT;AAEA;;AAEC,MACDC,2BAA8B,GAAA;QAC5B,OAAO,IAAA;AACT;AAEA;;MAGAC,KAAAA,CAAMC,GAAgB,EAAE;AACtB,QAAA,IAAI,CAACC,mBAAmB,EAAA;QACxB,IAAI,CAACD,GAAIE,CAAAA,YAAY,EAAE;YACrB,OAAO,CAAA;AACT;AACA,QAAA,IAAI,CAAChC,OAAO,GAAG8B,GAAAA,CAAIN,MAAM;QACzB,IAAI,CAACS,kBAAkB,CAACH,GAAAA,CAAAA;QACxB,OAAO,IAAI,CAACrC,SAAS,GAAG,CAAA;AAC1B;AAEA;;MAGAyC,GAAAA,CAAIJ,GAAgB,EAAE;QACpB,IAAI;AACF,YAAA,IAAI,IAAI,CAACjC,YAAY,IAAI,IAAI,CAACC,WAAW,EAAE;AACzC,gBAAA,IAAI,CAACqC,SAAS,CAACL,GAAAA,EAAKA,GAAIN,CAAAA,MAAM,EAAE,IAAI,CAAC3B,YAAY,EAAE,IAAI,CAACC,WAAW,CAAA;AACrE;SACQ,QAAA;AACR,YAAA,IAAI,CAACiC,mBAAmB,EAAA;AACxB,YAAA,IAAI,CAACpC,KAAK,GAAGZ,mBAAAA,CAAoBE,IAAI;AACvC;AACF;AAEA;;AAEC,MACDmD,SAAUN,CAAAA,GAAgB,EAAEO,IAAY,EAAE;QACxC,IAAI,CAAC3C,YAAY,GAAG2C,IAAAA;AACpB,QAAA,MAAMC,cAAcD,IAAO,GAAA,CAAA;AAC3B,QAAA,MAAME,kBAAqB,GAAA,IAAI,CAAC3C,aAAa,CAAC0C,WAAY,CAAA;AAC1D,QAAA,MAAME,sBAAsB,IAAI,CAAC5C,aAAa,CAAC0C,cAAc,CAAE,CAAA;AAC/D,QAAA,MAAMG,WAAc,GAAA,IAAI,CAAC1C,aAAa,CAACuC,WAAY,CAAA;AACnD,QAAA,IAAI,CAACC,kBAAsB,IAAA,CAACE,eAAgBJ,IAAO,GAAA,CAAA,IAAK,CAACG,mBAAsB,EAAA;YAC7E,OAAO,KAAA;AACT;QACA,IAAI,CAAC7C,KAAK,GACR0C,IAAS,KAAA,CAAA,GACL,GAAG,IAAI,CAACf,OAAO,EAAA,CAAG,MAAM,EAAEiB,mBAAmBG,GAAG,CAAA,CAAE,GAClD,CAAA,EAAG,IAAI,CAACpB,OAAO,EAAA,CAAG,MAAM,EAAEkB,mBAAqBE,CAAAA,GAAG,CAAE,CAAA;QAC1DZ,GAAIN,CAAAA,MAAM,CAACmB,gBAAgB,EAAA;QAC3Bb,GAAIN,CAAAA,MAAM,CAACoB,cAAc,CAACH,WAAAA,CAAAA;AAC1BX,QAAAA,GAAAA,CAAIN,MAAM,CAACqB,gBAAgB,CACzBR,SAAS,CACL,GAAA;AAACtD,YAAAA,mBAAAA,CAAoBG,WAAW;AAAEH,YAAAA,mBAAAA,CAAoBK,WAAW;AAAEL,YAAAA,mBAAAA,CAAoBM;SAAW,GAClG;AAACN,YAAAA,mBAAAA,CAAoBG,WAAW;AAAE,YAAA,IAAA;AAAM,YAAA;AAAK,SAAA,EACjD,IACA,EAAA,IAAA,CAAA;QAEF,OAAO,IAAA;AACT;AAEA;;AAEC,MACD4D,OAAQhB,CAAAA,GAAgB,EAAEiB,KAAa,EAAE;QACvCjB,GAAIN,CAAAA,MAAM,CAACwB,eAAe,EAAA;AAC5B;AAEA;;MAGAC,mBAAAA,CAAoBC,KAAoB,EAAE;QACxC,MAAMC,EAAAA,GAAKD,MAAME,QAAQ;AACzBF,QAAAA,KAAAA,CAAMG,QAAQ,CAACC,WAAW,GAAGH,GAAGI,IAAI,EAAA;AACpCL,QAAAA,KAAAA,CAAMG,QAAQ,CAACG,gBAAgB,GAAGL,GAAGM,IAAI,EAAA;AACzCP,QAAAA,KAAAA,CAAMG,QAAQ,CAACK,eAAe,GAAGP,GAAGM,IAAI,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC/D,YAAY,GAAG,CAAG,EAAA;YACzBwD,KAAMS,CAAAA,kBAAkB,GAAGR,EAAGS,CAAAA,KAAK,GAAGC,OAAO,CAAC,GAAGC,SAAS,EAAA;AAC5D;AACF;AAEA;;AAEC,MACDC,oBAAoBb,KAA4B,EAAEc,KAAkB,EAAElC,GAAgB,EAAE;QACtF,MAAMqB,EAAAA,GAAKD,MAAME,QAAQ;QACzBF,KAAMG,CAAAA,QAAQ,CAACC,WAAW,GAAGH,GAAGI,IAAI,CAAC,EAAC,EAAG,EAAC,CAAA;QAC1CL,KAAMG,CAAAA,QAAQ,CAACG,gBAAgB,GAAGL,GAAGM,IAAI,CAAC,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;QACnDP,KAAMG,CAAAA,QAAQ,CAACK,eAAe,GAAGP,GAAGM,IAAI,CAAC,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;;;;;QAKlDP,KAAMe,CAAAA,EAAE,CAACC,eAAe,GAAGC,YACvBhB,EAAGiB,CAAAA,GAAG,CAAC,CAAGlB,EAAAA,KAAAA,CAAMmB,SAAS,CAACC,SAAS,CAACC,CAAC,CAAA,GACrCrB,MAAMmB,SAAS,CAACC,SAAS,CAACC,CAAC;AAC/B,QAAA,IAAI,IAAI,CAAC7E,YAAY,KAAK,CAAG,EAAA;AAC3BwD,YAAAA,KAAAA,CAAMG,QAAQ,CAACC,WAAW,GAAGH,GAAGI,IAAI,CAACJ,EAAGqB,CAAAA,GAAG,CAACtB,KAAAA,CAAMgB,eAAe,CAAA,EAAGhB,MAAMgB,eAAe,CAAA;SACpF,MAAA;YACLhB,KAAMe,CAAAA,EAAE,CAACQ,eAAe,GAAGtB,GAAGuB,WAAW,CACvCxB,MAAMS,kBAAkB,EACxBR,GAAGwB,KAAK,CAACzB,MAAMmB,SAAS,CAACC,SAAS,CAACM,EAAE,CACrC,EAAA,CAAA,CAAA,CACAA,EAAE;YACJ1B,KAAMe,CAAAA,EAAE,CAACY,gBAAgB,GAAG1B,EAAAA,CAAGqB,GAAG,CAACtB,KAAAA,CAAMuB,eAAe,CAACK,CAAC,CAAA;AAC1D5B,YAAAA,KAAAA,CAAMe,EAAE,CAACc,eAAe,GAAG7B,KAAMuB,CAAAA,eAAe,CAACO,CAAC;AAClD9B,YAAAA,KAAAA,CAAMe,EAAE,CAACgB,cAAc,GAAG/B,MAAMgB,eAAe;AAC/ChB,YAAAA,KAAAA,CAAMe,EAAE,CAACiB,iBAAiB,GAAG/B,EAAGM,CAAAA,IAAI,CAACO,KAAMmB,CAAAA,GAAG,EAAErD,GAAAA,CAAIsD,aAAa,GAAGjC,EAAAA,CAAGkC,KAAK,CAAC,CAAA,CAAA,GAAKrB,MAAMsB,CAAC,CAAA;AACzFpC,YAAAA,KAAAA,CACGqC,GAAG,CACFpC,EAAGqC,CAAAA,EAAE,CACHrC,EAAAA,CAAGsC,QAAQ,CAACtC,EAAGuC,CAAAA,GAAG,CAACxC,KAAAA,CAAM+B,cAAc,EAAE,QAAA,CAAA,EAAW/B,KAAM2B,CAAAA,gBAAgB,CAC1E1B,EAAAA,EAAAA,CAAGwC,WAAW,CAACxC,EAAGiB,CAAAA,GAAG,CAAClB,KAAAA,CAAM+B,cAAc,EAAE,QAAW/B,CAAAA,EAAAA,KAAAA,CAAM6B,eAAe,CAE9E,CAAA,EAAA,WAAA;AACE5B,gBAAAA,EAAAA,CAAGyC,OAAO,EAAA;AACZ,aAAA,CAAA,CAEDC,OAAO,CACN1C,EAAG2C,CAAAA,GAAG,CACJ3C,EAAAA,CAAGwC,WAAW,CAACxC,EAAGiB,CAAAA,GAAG,CAAClB,KAAAA,CAAM+B,cAAc,EAAE,QAAA,CAAA,EAAW/B,KAAM2B,CAAAA,gBAAgB,CAC7E1B,EAAAA,EAAAA,CAAGsC,QAAQ,CAACtC,EAAGuC,CAAAA,GAAG,CAACxC,KAAAA,CAAM+B,cAAc,EAAE,QAAW/B,CAAAA,EAAAA,KAAAA,CAAM6B,eAAe,CAE3E,CAAA,EAAA,WAAA;AACE,gBAAA,IAAI,CAAC1B,QAAQ,CAACC,WAAW,GAAGH,GAAGI,IAAI,CAACJ,EAAGqB,CAAAA,GAAG,CAAC,IAAI,CAACN,eAAe,CAAG,EAAA,IAAI,CAACA,eAAe,CAAA;AACxF,aAAA,CAAA,CAED2B,OAAO,CACN1C,EAAG2C,CAAAA,GAAG,CACJ3C,EAAAA,CAAGsC,QAAQ,CAACvC,KAAM+B,CAAAA,cAAc,EAAE9B,EAAAA,CAAGuC,GAAG,CAACxC,KAAAA,CAAM2B,gBAAgB,EAAE,QACjE1B,CAAAA,CAAAA,EAAAA,EAAAA,CAAGwC,WAAW,CAACzC,KAAM+B,CAAAA,cAAc,EAAE9B,EAAAA,CAAGiB,GAAG,CAAClB,KAAM2B,CAAAA,gBAAgB,EAAE,QAEtE,CAAA,CAAA,CAAA,EAAA,WAAA;AACE,gBAAA,IAAI,CAACxB,QAAQ,CAACG,gBAAgB,GAAG,IAAI,CAAC0B,iBAAiB;AACzD,aAAA,CAAA,CAEDa,KAAK,CAAC,WAAA;AACL,gBAAA,IAAI,CAAC1C,QAAQ,CAACK,eAAe,GAAG,IAAI,CAACwB,iBAAiB;AACxD,aAAA,CAAA;AACJ;QACA,OAAO,IAAA;AACT;AAEA;;AAEC,MACDc,aAAcC,CAAAA,IAAiB,EAAEC,SAAoB,EAAE;AACrD,QAAA,IAAI,IAAI,CAACxG,YAAY,GAAG,CAAG,EAAA;AACzBwG,YAAAA,SAAAA,CAAUC,UAAU,CAAC,oBAAsB,EAAA,IAAI,CAACvG,aAAa,CAAE,IAAI,CAACF,YAAY,GAAG,IAAK,CAAE,CAAA,CAAA;AAC5F;AACF;AAEA;;AAEC,MACD0G,aAAgB,GAAA;QACd,OAAO,IAAI,CAACzG,KAAK;AACnB;AAEA;;MAGA0G,eAAAA,CAAgBC,EAAkB,EAAE;AAClCA,QAAAA,EAAAA,CAAGC,gBAAgB,EAAGC,CAAAA,MAAM,CAAC,KAAA,CAAA,CAAOC,qBAAqB,CAAC,KAAA,CAAA;AAC1DH,QAAAA,EAAAA,CAAGI,aAAa,EAAGC,CAAAA,UAAU,CAAC,IAAA,CAAA,CAAMC,WAAW,CAAC,KAAA,CAAA;AAEhDN,QAAAA,EAAAA,CAAGO,sBAAsB,CAAC,CACvBL,CAAAA,CAAAA,MAAM,CAAC,IACPC,CAAAA,CAAAA,qBAAqB,CAAC,KAAA,CAAA,CACtBK,gBAAgB,CAAC,KAAA,EAAO,KACxBC,CAAAA,CAAAA,YAAY,CAAC,KAAO,EAAA,KAAA,CAAA;AAEvBT,QAAAA,EAAAA,CAAGO,sBAAsB,CAAC,CAAA,CAAA,CACvBL,MAAM,CAAC,IAAA,CAAA,CACPC,qBAAqB,CAAC,KAAA,CAAA,CACtBK,gBAAgB,CAAC,KAAA,EAAO,OACxBE,eAAe,CAAC,aAAa,KAC7BC,CAAAA,CAAAA,iBAAiB,CAAC,MAAQ,EAAA,eAAA,CAAA;AAE7BX,QAAAA,EAAAA,CAAGO,sBAAsB,CAAC,CAAA,CAAA,CACvBL,MAAM,CAAC,IAAA,CAAA,CACPC,qBAAqB,CAAC,KAAA,CAAA,CACtBK,gBAAgB,CAAC,KAAA,EAAO,OACxBE,eAAe,CAAC,OAAO,eACvBC,CAAAA,CAAAA,iBAAiB,CAAC,KAAO,EAAA,eAAA,CAAA;AAC9B;AAEA,qBACQhF,kBAAmBH,CAAAA,GAAgB,EAAE;QAC3C,MAAMN,MAAAA,GAASM,IAAIN,MAAM;AACzB,QAAA,MAAM0F,KAAQpF,GAAAA,GAAAA,CAAIE,YAAY,CAAEkF,KAAK;AACrC,QAAA,MAAMC,MAASrF,GAAAA,GAAAA,CAAIE,YAAY,CAAEmF,MAAM;QACvC,MAAMC,YAAAA,GAAe5F,OAAO6F,IAAI,CAACC,sBAAsB,CAAC,KAAA,EAAO1I,YAAcsI,EAAAA,KAAAA,EAAOC,MAAQ,EAAA,KAAA,CAAA;QAC5F,MAAMI,YAAAA,GAAe/F,OAAO6F,IAAI,CAACC,sBAAsB,CAAC,KAAA,EAAO1I,YAAcsI,EAAAA,KAAAA,EAAOC,MAAQ,EAAA,KAAA,CAAA;QAC5F,MAAMK,WAAAA,GAAchG,OAAO6F,IAAI,CAACC,sBAAsB,CAAC,KAAA,EAAOzI,YAAcqI,EAAAA,KAAAA,EAAOC,MAAQ,EAAA,KAAA,CAAA;QAC3F,MAAMM,UAAAA,GAAajG,OAAO6F,IAAI,CAACC,sBAAsB,CAAC,KAAA,EAAOzI,YAAcqI,EAAAA,KAAAA,EAAOC,MAAQ,EAAA,KAAA,CAAA;AAC1F,QAAA,MAAMO,eAAelG,MAAO6F,CAAAA,IAAI,CAACM,yBAAyB,CACxD,KACA,EAAA;AAACP,YAAAA,YAAAA;AAAcI,YAAAA,WAAAA;AAAaC,YAAAA;AAAW,SAAA,EACvC3F,IAAIE,YAAY,CAAA;AAElB,QAAA,MAAM4F,eAAepG,MAAO6F,CAAAA,IAAI,CAACM,yBAAyB,CACxD,KACA,EAAA;AAACJ,YAAAA,YAAAA;AAAcC,YAAAA,WAAAA;AAAaC,YAAAA;AAAW,SAAA,EACvC3F,IAAIE,YAAY,CAAA;QAElBR,MAAO6F,CAAAA,IAAI,CAACQ,cAAc,CAACT,YAAAA,CAAAA;QAC3B5F,MAAO6F,CAAAA,IAAI,CAACQ,cAAc,CAACN,YAAAA,CAAAA;QAC3B/F,MAAO6F,CAAAA,IAAI,CAACQ,cAAc,CAACL,WAAAA,CAAAA;QAC3BhG,MAAO6F,CAAAA,IAAI,CAACQ,cAAc,CAACJ,UAAAA,CAAAA;QAC3B,IAAI,CAAC7H,aAAa,GAAG;AAACwH,YAAAA,YAAAA;AAAcG,YAAAA;AAAa,SAAA;QACjD,IAAI,CAAC1H,YAAY,GAAG2H,WAAAA;QACpB,IAAI,CAAC1H,WAAW,GAAG2H,UAAAA;QACnB,IAAI,CAAC1H,aAAa,GAAG;AAAC2H,YAAAA,YAAAA;AAAcE,YAAAA;AAAa,SAAA;AACnD;qBAGA,SAAQzF,CAAUL,GAAgB,EAAEN,MAAsB,EAAEgG,WAAsB,EAAEC,UAAqB,EAAE;QACzG,MAAMK,kBAAAA,GAAqBtG,OAAOuG,cAAc,EAAA;AAChD,QAAA,MAAMC,eAAkBF,GAAAA,kBAAAA,EAAoBG,mBAAqB,EAAA,CAAC,EAAE,IAAI,IAAA;QACxE,MAAMC,sBAAAA,GACJJ,sBAAsBA,kBAAmBG,CAAAA,mBAAmB,GAAGE,MAAM,GAAG,KAAKH,eACzExG,GAAAA,MAAAA,CAAO6F,IAAI,CAACe,wBAAwB,CAClC,KACA,EAAA,CAAA,EACA,GACAJ,eACAF,EAAAA,kBAAAA,CAAmBO,kBAAkB,EAAA,EACrC,KAEF,CAAA,GAAA,IAAA;AACN,QAAA,IAAIH,sBAAwB,EAAA;YAC1B,MAAMI,QAAAA,GAAW9G,OAAO+G,WAAW,EAAA;YACnC,MAAMC,OAAAA,GAAUhH,OAAOiH,UAAU,EAAA;AACjCjH,YAAAA,MAAAA,CAAOmB,gBAAgB,EAAA;AACvBnB,YAAAA,MAAAA,CAAOoB,cAAc,CAACsF,sBAAAA,CAAAA;AACtB1G,YAAAA,MAAAA,CAAOkH,WAAW,CAACJ,QAAAA,CAAAA;AACnB9G,YAAAA,MAAAA,CAAOmH,UAAU,CAACH,OAAAA,CAAAA;AACpB;QACA,IAAI;AACFhH,YAAAA,MAAAA,CAAOoH,UAAU,CAAC7J,mBAAoB8J,CAAAA,mBAAmB,CAACrH,MAAAA,CAAAA,CAAAA;AAC1DzC,YAAAA,mBAAAA,CAAoBQ,mBAAmB,CAAE4G,UAAU,CAAC,UAAYqB,EAAAA,WAAAA,CAAAA;AAChEzI,YAAAA,mBAAAA,CAAoBQ,mBAAmB,CAAE4G,UAAU,CAAC,SAAWsB,EAAAA,UAAAA,CAAAA;AAC/DjG,YAAAA,MAAAA,CAAOsH,YAAY,CAAC,CAAG/J,EAAAA,mBAAAA,CAAoBQ,mBAAmB,CAAA;AAC9DwJ,YAAAA,kBAAAA,CAAmBhK,oBAAoBS,sBAAsB,CAAA;SACrD,QAAA;AACR,YAAA,IAAI0I,sBAAwB,EAAA;AAC1B1G,gBAAAA,MAAAA,CAAOwB,eAAe,EAAA;gBACtBxB,MAAO6F,CAAAA,IAAI,CAAC2B,kBAAkB,CAACd,sBAAAA,CAAAA;AACjC;AACF;AACF;qBAGA,mBAA8B,GAAA;QAC5B,IAAI,IAAI,CAAClI,OAAO,EAAE;AAChB,YAAA,IAAI,IAAI,CAACD,aAAa,CAAC,EAAE,EAAE;gBACzB,IAAI,CAACC,OAAO,CAACqH,IAAI,CAAC2B,kBAAkB,CAAC,IAAI,CAACjJ,aAAa,CAAC,CAAE,CAAA,CAAA;AAC5D;AACA,YAAA,IAAI,IAAI,CAACA,aAAa,CAAC,EAAE,EAAE;gBACzB,IAAI,CAACC,OAAO,CAACqH,IAAI,CAAC2B,kBAAkB,CAAC,IAAI,CAACjJ,aAAa,CAAC,CAAE,CAAA,CAAA;AAC5D;AACF;QACA,IAAI,CAACH,aAAa,GAAG;AAAC,YAAA,IAAA;AAAM,YAAA;AAAK,SAAA;QACjC,IAAI,CAACC,YAAY,GAAG,IAAA;QACpB,IAAI,CAACC,WAAW,GAAG,IAAA;QACnB,IAAI,CAACC,aAAa,GAAG;AAAC,YAAA,IAAA;AAAM,YAAA;AAAK,SAAA;QACjC,IAAI,CAACC,OAAO,GAAG,IAAA;AACjB;AAEA,qBACA,OAAe6I,mBAAoBrH,CAAAA,MAAsB,EAAE;AACzD,QAAA,IAAI,CAAC,IAAI,CAAClC,iBAAiB,EAAE;AAC3B,YAAA,IAAI,CAACA,iBAAiB,GAAGkC,MAAAA,CAAOyH,kBAAkB,CAAC;AACjDC,gBAAAA,MAAAA,CAAAA,CAAO/F,EAAE,EAAA;oBACP,IAAI,CAACgG,OAAO,CAACC,GAAG,GAAGjG,EAAGI,CAAAA,IAAI,EAAG8F,CAAAA,MAAM,CAAC,UAAA,CAAA;AACpC,oBAAA,IAAI,CAAChG,QAAQ,CAACiG,EAAE,GAAGnG,GAAGI,IAAI,EAAA;AAC1BJ,oBAAAA,EAAAA,CAAGoG,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAAClF,SAAS,CAACmF,QAAQ,GAAGrG,EAAGM,CAAAA,IAAI,CAAC,IAAI,CAAC0F,OAAO,CAACC,GAAG,EAAEK,cAAgB,EAAA,CAAA,CAAA;wBACpE,IAAI,CAACpG,QAAQ,CAACiG,EAAE,GAAGnG,EAAGuC,CAAAA,GAAG,CAACvC,EAAAA,CAAGuG,GAAG,CAAC,IAAI,CAACP,OAAO,CAACC,GAAG,CAACxE,EAAE,EAAE,GAAA,CAAA,EAAMzB,EAAGI,CAAAA,IAAI,CAAC,GAAA,CAAA,CAAA;wBACpE,IAAI/B,MAAAA,CAAOvC,IAAI,KAAK,QAAU,EAAA;AAC5B,4BAAA,IAAI,CAACoF,SAAS,CAACmF,QAAQ,CAACxE,CAAC,GAAG7B,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAACH,SAAS,CAACmF,QAAQ,CAACxE,CAAC,CAAA;AAC9D;AACF,qBAAA,CAAA;AACF,iBAAA;AACA2E,gBAAAA,QAAAA,CAAAA,CAASxG,EAAE,EAAA;AACT,oBAAA,IAAI,CAACE,QAAQ,CAACuG,QAAQ,GAAGzG,GAAGM,IAAI,EAAA;AAChC,oBAAA,IAAI,CAACoG,QAAQ,GAAG1G,GAAGS,KAAK,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AACnC,oBAAA,IAAI,CAACiG,OAAO,GAAG3G,GAAGS,KAAK,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AAClCV,oBAAAA,EAAAA,CAAGoG,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACtF,EAAE,CAAC8F,UAAU,GAAG5G,GAAG6G,aAAa,CAAC,IAAI,CAACH,QAAQ,EAAE,IAAI,CAACV,OAAO,CAACG,EAAE,CAAA;AACpE,wBAAA,IAAI,CAACrF,EAAE,CAACgG,SAAS,GAAG9G,GAAG6G,aAAa,CAAC,IAAI,CAACF,OAAO,EAAE,IAAI,CAACX,OAAO,CAACG,EAAE,CAAA;wBAClE,IAAI,CAACrF,EAAE,CAACiG,cAAc,GAAG/G,EAAGgH,CAAAA,KAAK,CAAChH,EAAAA,CAAGuG,GAAG,CAAC,IAAI,CAACK,UAAU,CAACzE,CAAC,EAAEnC,EAAGiB,CAAAA,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC6F,SAAS,CAAC3E,CAAC,CAAA,CAAA,EAAI,CAAG,EAAA,CAAA,CAAA;AAC7F,wBAAA,IAAI,CAACjC,QAAQ,CAACuG,QAAQ,GAAGzG,EAAGM,CAAAA,IAAI,CAC9BN,EAAAA,CAAGuC,GAAG,CAAC,IAAI,CAACqE,UAAU,CAAC5E,GAAG,EAAEhC,EAAGuG,CAAAA,GAAG,CAAC,IAAI,CAACK,UAAU,CAACzE,CAAC,EAAE,IAAI,CAAC2E,SAAS,CAAC9E,GAAG,CACxE,CAAA,EAAA,IAAI,CAAC+E,cAAc,CAAA;AAEvB,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;AACA,YAAA,IAAI,CAAC5K,iBAAiB,CAAC8K,IAAI,GAAG,gCAAA;AAC9B,YAAA,IAAI,CAAC7K,mBAAmB,GAAGiC,MAAAA,CAAO6I,eAAe,CAAC,IAAI,CAAC/K,iBAAiB,CAACgL,gBAAgB,CAAC,CAAE,CAAA,CAAA;AAC5F,YAAA,IAAI,CAAC9K,sBAAsB,GAAGgC,MAAAA,CAAO+I,oBAAoB,EAAA;AACzD,YAAA,IAAI,CAAC/K,sBAAsB,CACxB+G,gBAAgB,GAChBC,MAAM,CAAC,IACPQ,CAAAA,CAAAA,eAAe,CAAC,KAAA,EAAO,WACvBC,CAAAA,CAAAA,iBAAiB,CAAC,MAAQ,EAAA,KAAA,CAAA;YAC7B,IAAI,CAACzH,sBAAsB,CAACkH,aAAa,GAAGC,UAAU,CAAC,KAAOC,CAAAA,CAAAA,WAAW,CAAC,KAAA,CAAA;AAC5E;QACA,OAAO,IAAI,CAACtH,iBAAiB;AAC/B;IAEUkL,SAAY,GAAA;AACpB,QAAA,KAAK,CAACA,SAAAA,EAAAA;AACN,QAAA,IAAI,CAACzI,mBAAmB,EAAA;AAC1B;AACF;;;;"}
|
package/dist/render/envlight.js
CHANGED
|
@@ -502,7 +502,7 @@ const SSGI_REPAIR_MAX_RADIUS_TEXELS = 16;
|
|
|
502
502
|
return scope.Z_ssgi_reprojectIrradiance(normal, iblIrradiance);
|
|
503
503
|
}
|
|
504
504
|
/** Whether all textures required by the lighting reprojection are scoped. @internal */ static hasSSGIHistory(ctx) {
|
|
505
|
-
return !!(ctx?.SSGI && ctx.SSGIIrradianceHistoryTexture && ctx.SSGISurfaceHistoryTexture && (ctx.device.type
|
|
505
|
+
return !!(ctx?.SSGI && ctx.SSGIIrradianceHistoryTexture && ctx.SSGISurfaceHistoryTexture && (ctx.device.type === 'webgl' || ctx.motionVectorTexture) && ctx.linearDepthTexture);
|
|
506
506
|
}
|
|
507
507
|
/**
|
|
508
508
|
* {@inheritDoc EnvironmentLighting.hasRadiance}
|