@zephyr3d/scene 0.9.18 → 0.9.20
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/joint_dynamics/convex_collider.js +320 -0
- package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
- package/dist/app/scriptregistry.js +124 -6
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +1 -0
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/camera/camera.js +240 -201
- package/dist/camera/camera.js.map +1 -1
- package/dist/index.d.ts +458 -9
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/material/meshmaterial.js +2 -2
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +11 -5
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lit.js +10 -0
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/shader/helper.js +138 -10
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/skin.js +4 -6
- package/dist/material/skin.js.map +1 -1
- package/dist/material/water.js +1 -1
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js +177 -29
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js +111 -204
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/motionblur.js +3 -0
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +79 -0
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssr.js +238 -7
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +16 -15
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +121 -19
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js +1 -1
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +7 -1
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js +52 -8
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +331 -0
- package/dist/render/dualdepthpeeling_oit.js.map +1 -0
- package/dist/render/envlight.js +6 -3
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/hzb.js +11 -4
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +21 -12
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/renderer.js +7 -3
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +79 -0
- package/dist/render/rendergraph/blackboard.js.map +1 -0
- package/dist/render/rendergraph/device_pool_allocator.js +10 -1
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/executor.js +41 -11
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +551 -201
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/rendergraph.js +29 -0
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +12 -2
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/shadow_mask_pass.js +297 -0
- package/dist/render/shadow_mask_pass.js.map +1 -0
- package/dist/render/weightedblended_oit.js +5 -0
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +1 -0
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +1 -0
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +1 -0
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/msdftext.js +1 -0
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +1 -0
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +1 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +1 -0
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/terrain-cm/grass.js +1 -0
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +1 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +1 -0
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/ssr.js +52 -21
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/utility/misc.js +10 -1
- package/dist/utility/misc.js.map +1 -1
- package/dist/utility/serialization/manager.js +1 -0
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +1 -0
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +1 -0
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +35 -2
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +1 -0
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +1 -0
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +1 -0
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +1 -0
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +1 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +1 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +1 -0
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +1 -0
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +1 -0
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/values.js +11 -1
- package/dist/values.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { Vector2, Vector4 } from '@zephyr3d/base';
|
|
2
|
+
import { ShaderHelper } from '../material/shader/helper.js';
|
|
3
|
+
import { drawFullscreenQuad } from './fullscreenquad.js';
|
|
4
|
+
import { MAX_SHADOW_MASK_LIGHTS } from '../values.js';
|
|
5
|
+
|
|
6
|
+
const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
|
|
7
|
+
/**
|
|
8
|
+
* Number of shadow-casting lights packed into a single RGBA8 mask array layer.
|
|
9
|
+
* One light per color channel.
|
|
10
|
+
*/ const SHADOW_MASK_LIGHTS_PER_LAYER = 4;
|
|
11
|
+
/**
|
|
12
|
+
* Maximum number of shadow mask array layers, derived from the per-light cap.
|
|
13
|
+
*/ const MAX_SHADOW_MASK_LAYERS = MAX_SHADOW_MASK_LIGHTS / SHADOW_MASK_LIGHTS_PER_LAYER;
|
|
14
|
+
/**
|
|
15
|
+
* Renders the screen-space shadow mask for the Forward+ pipeline.
|
|
16
|
+
*
|
|
17
|
+
* For each shadow-casting light, the light's visibility factor `[0,1]` (1 = lit,
|
|
18
|
+
* 0 = fully shadowed) is reconstructed from the linear depth prepass and written
|
|
19
|
+
* into one channel of one layer of an `rgba8unorm` texture array. Four lights are
|
|
20
|
+
* packed per layer (one per RGBA channel).
|
|
21
|
+
*
|
|
22
|
+
* The layer/channel assignment must stay in lockstep with
|
|
23
|
+
* {@link ClusteredLight.getVisibleLights}: shadow-casting lights occupy clustered
|
|
24
|
+
* buffer indices `1..N` in the order of `renderQueue.shadowedLights`. The zero-based
|
|
25
|
+
* light ordinal `s = index - 1` maps to `layer = s >> 2`, `channel = s & 3`. The
|
|
26
|
+
* clustered shading pass recovers the same mapping from a light's buffer index, so
|
|
27
|
+
* no per-light mask index is stored.
|
|
28
|
+
*
|
|
29
|
+
* @internal
|
|
30
|
+
*/ class ShadowMaskRenderer {
|
|
31
|
+
/** Fullscreen mask programs keyed by a per-light shader signature. */ _programs;
|
|
32
|
+
/** Bind groups paired with each cached program. */ _bindGroups;
|
|
33
|
+
/** One render state per RGBA channel (color mask selects the target channel). */ _channelStates;
|
|
34
|
+
_nearFar;
|
|
35
|
+
_cameraPosition;
|
|
36
|
+
_cameraParams;
|
|
37
|
+
constructor(){
|
|
38
|
+
this._programs = new Map();
|
|
39
|
+
this._bindGroups = new Map();
|
|
40
|
+
this._channelStates = null;
|
|
41
|
+
this._nearFar = new Vector2();
|
|
42
|
+
this._cameraPosition = new Vector4();
|
|
43
|
+
this._cameraParams = new Vector4();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Number of array layers required to hold `numLights` shadow lights.
|
|
47
|
+
* @param numLights - Number of shadow-casting lights.
|
|
48
|
+
* @returns Layer count, clamped to {@link MAX_SHADOW_MASK_LAYERS}.
|
|
49
|
+
*/ static getLayerCount(numLights) {
|
|
50
|
+
const n = Math.min(numLights, MAX_SHADOW_MASK_LIGHTS);
|
|
51
|
+
return Math.min(Math.ceil(n / SHADOW_MASK_LIGHTS_PER_LAYER), MAX_SHADOW_MASK_LAYERS);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Render the shadow mask for the given shadow-casting lights.
|
|
55
|
+
*
|
|
56
|
+
* @param ctx - Draw context (must carry shadowMapInfo for the lights).
|
|
57
|
+
* @param depthTexture - Linear depth texture from the depth prepass.
|
|
58
|
+
* @param lights - Shadow-casting lights, in clustered-buffer order (index 1..N).
|
|
59
|
+
* @param getLayerFramebuffer - Resolves the framebuffer bound to mask array layer `k`.
|
|
60
|
+
*/ render(ctx, depthTexture, lights, getLayerFramebuffer) {
|
|
61
|
+
const device = ctx.device;
|
|
62
|
+
const numLights = Math.min(lights.length, MAX_SHADOW_MASK_LIGHTS);
|
|
63
|
+
if (numLights === 0 || !ctx.shadowMapInfo) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const numLayers = ShadowMaskRenderer.getLayerCount(numLights);
|
|
67
|
+
const channelStates = this.getChannelStates(device);
|
|
68
|
+
const savedShadowLight = ctx.currentShadowLight;
|
|
69
|
+
device.pushDeviceStates();
|
|
70
|
+
for(let layer = 0; layer < numLayers; layer++){
|
|
71
|
+
const framebuffer = getLayerFramebuffer(layer);
|
|
72
|
+
device.setFramebuffer(framebuffer);
|
|
73
|
+
// Clear to "fully lit" (1 = no shadow) so channels without an assigned
|
|
74
|
+
// light, and pixels outside any shadow, read as unshadowed. The mask array
|
|
75
|
+
// has no depth attachment, so depth/stencil clear args are null.
|
|
76
|
+
device.clearFrameBuffer(new Vector4(1, 1, 1, 1), null, null);
|
|
77
|
+
for(let channel = 0; channel < SHADOW_MASK_LIGHTS_PER_LAYER; channel++){
|
|
78
|
+
const ordinal = layer * SHADOW_MASK_LIGHTS_PER_LAYER + channel;
|
|
79
|
+
if (ordinal >= numLights) {
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
const light = lights[ordinal];
|
|
83
|
+
const shadowMapParams = ctx.shadowMapInfo.get(light);
|
|
84
|
+
if (!shadowMapParams || !shadowMapParams.shadowMap) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
ctx.currentShadowLight = light;
|
|
88
|
+
this.renderLightChannel(ctx, depthTexture, light, shadowMapParams, channelStates[channel]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
device.popDeviceStates();
|
|
92
|
+
ctx.currentShadowLight = savedShadowLight;
|
|
93
|
+
}
|
|
94
|
+
/** Render one shadow light into one color channel of the current framebuffer. */ renderLightChannel(ctx, depthTexture, light, shadowMapParams, renderState) {
|
|
95
|
+
const device = ctx.device;
|
|
96
|
+
const key = this.getProgramKey(ctx, shadowMapParams);
|
|
97
|
+
let program = this._programs.get(key) ?? null;
|
|
98
|
+
let bindGroup = this._bindGroups.get(key) ?? null;
|
|
99
|
+
if (!program) {
|
|
100
|
+
program = this.createProgram(ctx, shadowMapParams);
|
|
101
|
+
bindGroup = device.createBindGroup(program.bindGroupLayouts[0]);
|
|
102
|
+
this._programs.set(key, program);
|
|
103
|
+
this._bindGroups.set(key, bindGroup);
|
|
104
|
+
}
|
|
105
|
+
bindGroup = this._bindGroups.get(key);
|
|
106
|
+
this.setUniforms(bindGroup, ctx, depthTexture, light, shadowMapParams);
|
|
107
|
+
device.setProgram(program);
|
|
108
|
+
device.setBindGroup(0, bindGroup);
|
|
109
|
+
drawFullscreenQuad(renderState);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The program signature: distinct shadow implementations, cascade counts and
|
|
113
|
+
* shadow map types must not share a compiled program.
|
|
114
|
+
*/ getProgramKey(ctx, shadowMapParams) {
|
|
115
|
+
return `${ctx.device.type}|${shadowMapParams.shaderHash}`;
|
|
116
|
+
}
|
|
117
|
+
getChannelStates(device) {
|
|
118
|
+
if (!this._channelStates) {
|
|
119
|
+
this._channelStates = [];
|
|
120
|
+
for(let c = 0; c < SHADOW_MASK_LIGHTS_PER_LAYER; c++){
|
|
121
|
+
const rs = device.createRenderStateSet();
|
|
122
|
+
rs.useDepthState().enableTest(false).enableWrite(false);
|
|
123
|
+
rs.useRasterizerState().setCullMode('none');
|
|
124
|
+
rs.useColorState().setColorMask(c === 0, c === 1, c === 2, c === 3);
|
|
125
|
+
this._channelStates.push(rs);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return this._channelStates;
|
|
129
|
+
}
|
|
130
|
+
setUniforms(bindGroup, ctx, depthTexture, light, shadowMapParams) {
|
|
131
|
+
const camera = ctx.camera;
|
|
132
|
+
const near = camera.getNearPlane();
|
|
133
|
+
const far = camera.getFarPlane();
|
|
134
|
+
const cameraPos = camera.getWorldPosition();
|
|
135
|
+
this._cameraPosition.setXYZW(cameraPos.x, cameraPos.y, cameraPos.z, 0);
|
|
136
|
+
this._cameraParams.setXYZW(near, far, 1, 1);
|
|
137
|
+
this._nearFar.setXY(near, far);
|
|
138
|
+
bindGroup.setValue('camera', {
|
|
139
|
+
position: this._cameraPosition,
|
|
140
|
+
params: this._cameraParams,
|
|
141
|
+
shadowDebugCascades: camera.shadowDebugCascades ? 1 : 0,
|
|
142
|
+
framestamp: ctx.device.frameInfo.frameCounter
|
|
143
|
+
});
|
|
144
|
+
// Full shadow light struct (matches helper.ts currentShadowLight lightStruct,
|
|
145
|
+
// including implParams which PCSS/VSM impls read via getShadowImplParams).
|
|
146
|
+
const implParams = new Vector4();
|
|
147
|
+
shadowMapParams.impl.getParams(implParams);
|
|
148
|
+
bindGroup.setValue('light', {
|
|
149
|
+
sunDir: ctx.sunLight ? ctx.sunLight.directionAndCutoff.xyz().scaleBy(-1) : new Vector4(0, 1, 0, 0).xyz(),
|
|
150
|
+
shadowCascades: shadowMapParams.numShadowCascades,
|
|
151
|
+
positionAndRange: light.positionAndRange,
|
|
152
|
+
directionAndCutoff: light.directionAndCutoff,
|
|
153
|
+
diffuseAndIntensity: light.diffuseAndIntensity,
|
|
154
|
+
extraParams: light.extraParams,
|
|
155
|
+
cascadeDistances: shadowMapParams.cascadeDistances,
|
|
156
|
+
depthBiasValues: shadowMapParams.depthBiasValues[0],
|
|
157
|
+
shadowCameraParams: shadowMapParams.cameraParams,
|
|
158
|
+
depthBiasScales: shadowMapParams.depthBiasScales,
|
|
159
|
+
implParams: implParams,
|
|
160
|
+
shadowMatrices: new Float32Array(shadowMapParams.shadowMatrices),
|
|
161
|
+
shadowStrength: light.shadow.shadowStrength,
|
|
162
|
+
envLightStrength: ctx.env?.light.strength ?? 0,
|
|
163
|
+
envLightSpecularStrength: ctx.env?.light.specularStrength ?? 1
|
|
164
|
+
});
|
|
165
|
+
bindGroup.setValue('invViewProjMatrix', camera.invViewProjectionMatrix);
|
|
166
|
+
bindGroup.setValue('cameraNearFar', this._nearFar);
|
|
167
|
+
bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);
|
|
168
|
+
bindGroup.setTexture('depthTex', depthTexture);
|
|
169
|
+
bindGroup.setTexture(UNIFORM_NAME_SHADOW_MAP, shadowMapParams.shadowMap, shadowMapParams.shadowMapSampler);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Whether the fullscreen output needs a vertical flip. Mask array layers are
|
|
173
|
+
* offscreen render targets, so the convention matches other offscreen passes
|
|
174
|
+
* (no flip); WebGPU still flips clip-space Y in the vertex shader.
|
|
175
|
+
*/ needFlip(_device) {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
createProgram(ctx, shadowMapParams) {
|
|
179
|
+
const device = ctx.device;
|
|
180
|
+
const numCascades = shadowMapParams.numShadowCascades;
|
|
181
|
+
const shadowMap = shadowMapParams.shadowMap;
|
|
182
|
+
const program = device.buildRenderProgram({
|
|
183
|
+
label: 'ShadowMask',
|
|
184
|
+
vertex (pb) {
|
|
185
|
+
this.flip = pb.int().uniform(0);
|
|
186
|
+
this.$inputs.pos = pb.vec2().attrib('position');
|
|
187
|
+
this.$outputs.uv = pb.vec2();
|
|
188
|
+
pb.main(function() {
|
|
189
|
+
this.$builtins.position = pb.vec4(this.$inputs.pos, 1, 1);
|
|
190
|
+
this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));
|
|
191
|
+
this.$if(pb.notEqual(this.flip, 0), function() {
|
|
192
|
+
this.$builtins.position.y = pb.neg(this.$builtins.position.y);
|
|
193
|
+
});
|
|
194
|
+
if (device.type === 'webgpu') {
|
|
195
|
+
this.$builtins.position.y = pb.neg(this.$builtins.position.y);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
},
|
|
199
|
+
fragment (pb) {
|
|
200
|
+
const cameraStruct = pb.defineStruct([
|
|
201
|
+
pb.vec4('position'),
|
|
202
|
+
pb.vec4('params'),
|
|
203
|
+
pb.float('shadowDebugCascades'),
|
|
204
|
+
// Required by PCSS temporal jitter (ShaderHelper.getFramestamp).
|
|
205
|
+
pb.int('framestamp')
|
|
206
|
+
]);
|
|
207
|
+
// Must match helper.ts currentShadowLight lightStruct field-for-field.
|
|
208
|
+
const lightStruct = pb.defineStruct([
|
|
209
|
+
pb.vec3('sunDir'),
|
|
210
|
+
pb.int('shadowCascades'),
|
|
211
|
+
pb.vec4('positionAndRange'),
|
|
212
|
+
pb.vec4('directionAndCutoff'),
|
|
213
|
+
pb.vec4('diffuseAndIntensity'),
|
|
214
|
+
pb.vec4('extraParams'),
|
|
215
|
+
pb.vec4('cascadeDistances'),
|
|
216
|
+
pb.vec4('depthBiasValues'),
|
|
217
|
+
pb.vec4('shadowCameraParams'),
|
|
218
|
+
pb.vec4('depthBiasScales'),
|
|
219
|
+
pb.vec4('implParams'),
|
|
220
|
+
pb.vec4[16]('shadowMatrices'),
|
|
221
|
+
pb.float('shadowStrength'),
|
|
222
|
+
pb.float('envLightStrength'),
|
|
223
|
+
pb.float('envLightSpecularStrength')
|
|
224
|
+
]);
|
|
225
|
+
this.camera = cameraStruct().uniform(0);
|
|
226
|
+
this.light = lightStruct().uniform(0);
|
|
227
|
+
const shadowTex = shadowMap.isTextureCube() ? shadowMap.isDepth() ? pb.texCubeShadow() : pb.texCube() : shadowMap.isTexture2D() ? shadowMap.isDepth() ? pb.tex2DShadow() : pb.tex2D() : shadowMap.isDepth() ? pb.tex2DArrayShadow() : pb.tex2DArray();
|
|
228
|
+
if (!shadowMap.isDepth() && !device.getDeviceCaps().textureCaps.getTextureFormatInfo(shadowMap.format).filterable) {
|
|
229
|
+
shadowTex.sampleType('unfilterable-float');
|
|
230
|
+
}
|
|
231
|
+
this[UNIFORM_NAME_SHADOW_MAP] = shadowTex.uniform(0);
|
|
232
|
+
this.depthTex = pb.tex2D().uniform(0);
|
|
233
|
+
this.invViewProjMatrix = pb.mat4().uniform(0);
|
|
234
|
+
this.cameraNearFar = pb.vec2().uniform(0);
|
|
235
|
+
this.$outputs.color = pb.vec4();
|
|
236
|
+
// Explicit-depth cascade selection (fragCoord.z is invalid in a fullscreen
|
|
237
|
+
// pass). Mirrors posteffect/sss.ts calculateTransmissionShadow.
|
|
238
|
+
pb.func('zShadowMaskFactor', [
|
|
239
|
+
pb.vec3('worldPos'),
|
|
240
|
+
pb.float('depth01'),
|
|
241
|
+
pb.float('NoL')
|
|
242
|
+
], function() {
|
|
243
|
+
if (numCascades > 1) {
|
|
244
|
+
this.$l.linearDepth = pb.mul(this.depth01, this.camera.params.y);
|
|
245
|
+
this.$l.splitDistances = this.light.cascadeDistances;
|
|
246
|
+
this.$l.comparison = pb.vec4(pb.greaterThan(pb.vec4(this.linearDepth), this.splitDistances));
|
|
247
|
+
this.$l.cascadeFlags = pb.vec4(pb.float(pb.greaterThan(this.light.shadowCascades, 0)), pb.float(pb.greaterThan(this.light.shadowCascades, 1)), pb.float(pb.greaterThan(this.light.shadowCascades, 2)), pb.float(pb.greaterThan(this.light.shadowCascades, 3)));
|
|
248
|
+
this.$l.split = pb.int(pb.dot(this.comparison, this.cascadeFlags));
|
|
249
|
+
if (device.type === 'webgl') {
|
|
250
|
+
this.$l.shadowVertex = pb.vec4();
|
|
251
|
+
this.$for(pb.int('cascade'), 0, 4, function() {
|
|
252
|
+
this.$if(pb.equal(this.cascade, this.split), function() {
|
|
253
|
+
this.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(this, pb.vec4(this.worldPos, 1), this.cascade);
|
|
254
|
+
this.$break();
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
} else {
|
|
258
|
+
this.$l.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(this, pb.vec4(this.worldPos, 1), this.split);
|
|
259
|
+
}
|
|
260
|
+
this.$l.shadow = shadowMapParams.impl.computeShadowCSM(shadowMapParams, this, this.shadowVertex, this.NoL, this.split);
|
|
261
|
+
this.$l.shadowDistance = this.light.shadowCameraParams.w;
|
|
262
|
+
this.shadow = pb.mix(this.shadow, 1, pb.smoothStep(pb.mul(this.shadowDistance, 0.8), this.shadowDistance, pb.distance(this.camera.position.xyz, this.worldPos)));
|
|
263
|
+
this.shadow = pb.mix(1, this.shadow, this.light.shadowStrength);
|
|
264
|
+
this.$return(pb.clamp(this.shadow, 0, 1));
|
|
265
|
+
} else {
|
|
266
|
+
this.$l.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(this, pb.vec4(this.worldPos, 1));
|
|
267
|
+
this.$l.shadow = shadowMapParams.impl.computeShadow(shadowMapParams, this, this.shadowVertex, this.NoL);
|
|
268
|
+
this.$l.shadowDistance = this.light.shadowCameraParams.w;
|
|
269
|
+
this.shadow = pb.mix(this.shadow, 1, pb.smoothStep(pb.mul(this.shadowDistance, 0.8), this.shadowDistance, pb.distance(this.camera.position.xyz, this.worldPos)));
|
|
270
|
+
this.shadow = pb.mix(1, this.shadow, this.light.shadowStrength);
|
|
271
|
+
this.$return(pb.clamp(this.shadow, 0, 1));
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
pb.main(function() {
|
|
275
|
+
this.$l.pos = ShaderHelper.samplePositionFromDepth(this, this.depthTex, this.$inputs.uv, this.invViewProjMatrix, this.cameraNearFar);
|
|
276
|
+
// NoL is unavailable in a fullscreen pass (no geometric normal); it only
|
|
277
|
+
// feeds normal-offset bias, so a conservative 1.0 is used.
|
|
278
|
+
this.$l.factor = this.zShadowMaskFactor(this.pos.xyz, this.pos.w, pb.float(1));
|
|
279
|
+
this.$outputs.color = pb.vec4(this.factor);
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
program.name = '@ShadowMask';
|
|
284
|
+
return program;
|
|
285
|
+
}
|
|
286
|
+
/** Release cached GPU resources. */ dispose() {
|
|
287
|
+
for (const program of this._programs.values()){
|
|
288
|
+
program.dispose();
|
|
289
|
+
}
|
|
290
|
+
this._programs.clear();
|
|
291
|
+
this._bindGroups.clear();
|
|
292
|
+
this._channelStates = null;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export { MAX_SHADOW_MASK_LAYERS, SHADOW_MASK_LIGHTS_PER_LAYER, ShadowMaskRenderer };
|
|
297
|
+
//# sourceMappingURL=shadow_mask_pass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadow_mask_pass.js","sources":["../../src/render/shadow_mask_pass.ts"],"sourcesContent":["import { Vector2, Vector4 } from '@zephyr3d/base';\nimport type { Nullable } from '@zephyr3d/base';\nimport type {\n AbstractDevice,\n BindGroup,\n FrameBuffer,\n GPUProgram,\n PBShaderExp,\n RenderStateSet,\n Texture2D\n} from '@zephyr3d/device';\nimport type { DrawContext } from './drawable';\nimport type { PunctualLight } from '../scene/light';\nimport type { ShadowMapParams } from '../shadow/shadowmapper';\nimport { ShaderHelper } from '../material/shader/helper';\nimport { drawFullscreenQuad } from './fullscreenquad';\nimport { MAX_SHADOW_MASK_LIGHTS } from '../values';\n\nconst UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';\n\n/**\n * Number of shadow-casting lights packed into a single RGBA8 mask array layer.\n * One light per color channel.\n */\nexport const SHADOW_MASK_LIGHTS_PER_LAYER = 4;\n\n/**\n * Maximum number of shadow mask array layers, derived from the per-light cap.\n */\nexport const MAX_SHADOW_MASK_LAYERS = MAX_SHADOW_MASK_LIGHTS / SHADOW_MASK_LIGHTS_PER_LAYER;\n\n/**\n * Renders the screen-space shadow mask for the Forward+ pipeline.\n *\n * For each shadow-casting light, the light's visibility factor `[0,1]` (1 = lit,\n * 0 = fully shadowed) is reconstructed from the linear depth prepass and written\n * into one channel of one layer of an `rgba8unorm` texture array. Four lights are\n * packed per layer (one per RGBA channel).\n *\n * The layer/channel assignment must stay in lockstep with\n * {@link ClusteredLight.getVisibleLights}: shadow-casting lights occupy clustered\n * buffer indices `1..N` in the order of `renderQueue.shadowedLights`. The zero-based\n * light ordinal `s = index - 1` maps to `layer = s >> 2`, `channel = s & 3`. The\n * clustered shading pass recovers the same mapping from a light's buffer index, so\n * no per-light mask index is stored.\n *\n * @internal\n */\nexport class ShadowMaskRenderer {\n /** Fullscreen mask programs keyed by a per-light shader signature. */\n private _programs: Map<string, GPUProgram>;\n /** Bind groups paired with each cached program. */\n private _bindGroups: Map<string, BindGroup>;\n /** One render state per RGBA channel (color mask selects the target channel). */\n private _channelStates: Nullable<RenderStateSet[]>;\n private readonly _nearFar: Vector2;\n private readonly _cameraPosition: Vector4;\n private readonly _cameraParams: Vector4;\n\n constructor() {\n this._programs = new Map();\n this._bindGroups = new Map();\n this._channelStates = null;\n this._nearFar = new Vector2();\n this._cameraPosition = new Vector4();\n this._cameraParams = new Vector4();\n }\n\n /**\n * Number of array layers required to hold `numLights` shadow lights.\n * @param numLights - Number of shadow-casting lights.\n * @returns Layer count, clamped to {@link MAX_SHADOW_MASK_LAYERS}.\n */\n static getLayerCount(numLights: number): number {\n const n = Math.min(numLights, MAX_SHADOW_MASK_LIGHTS);\n return Math.min(Math.ceil(n / SHADOW_MASK_LIGHTS_PER_LAYER), MAX_SHADOW_MASK_LAYERS);\n }\n\n /**\n * Render the shadow mask for the given shadow-casting lights.\n *\n * @param ctx - Draw context (must carry shadowMapInfo for the lights).\n * @param depthTexture - Linear depth texture from the depth prepass.\n * @param lights - Shadow-casting lights, in clustered-buffer order (index 1..N).\n * @param getLayerFramebuffer - Resolves the framebuffer bound to mask array layer `k`.\n */\n render(\n ctx: DrawContext,\n depthTexture: Texture2D,\n lights: PunctualLight[],\n getLayerFramebuffer: (layer: number) => FrameBuffer\n ): void {\n const device = ctx.device;\n const numLights = Math.min(lights.length, MAX_SHADOW_MASK_LIGHTS);\n if (numLights === 0 || !ctx.shadowMapInfo) {\n return;\n }\n const numLayers = ShadowMaskRenderer.getLayerCount(numLights);\n const channelStates = this.getChannelStates(device);\n const savedShadowLight = ctx.currentShadowLight;\n\n device.pushDeviceStates();\n for (let layer = 0; layer < numLayers; layer++) {\n const framebuffer = getLayerFramebuffer(layer);\n device.setFramebuffer(framebuffer);\n // Clear to \"fully lit\" (1 = no shadow) so channels without an assigned\n // light, and pixels outside any shadow, read as unshadowed. The mask array\n // has no depth attachment, so depth/stencil clear args are null.\n device.clearFrameBuffer(new Vector4(1, 1, 1, 1), null, null);\n for (let channel = 0; channel < SHADOW_MASK_LIGHTS_PER_LAYER; channel++) {\n const ordinal = layer * SHADOW_MASK_LIGHTS_PER_LAYER + channel;\n if (ordinal >= numLights) {\n break;\n }\n const light = lights[ordinal];\n const shadowMapParams = ctx.shadowMapInfo.get(light);\n if (!shadowMapParams || !shadowMapParams.shadowMap) {\n continue;\n }\n ctx.currentShadowLight = light;\n this.renderLightChannel(ctx, depthTexture, light, shadowMapParams, channelStates[channel]);\n }\n }\n device.popDeviceStates();\n ctx.currentShadowLight = savedShadowLight;\n }\n\n /** Render one shadow light into one color channel of the current framebuffer. */\n private renderLightChannel(\n ctx: DrawContext,\n depthTexture: Texture2D,\n light: PunctualLight,\n shadowMapParams: ShadowMapParams,\n renderState: RenderStateSet\n ): void {\n const device = ctx.device;\n const key = this.getProgramKey(ctx, shadowMapParams);\n let program = this._programs.get(key) ?? null;\n let bindGroup = this._bindGroups.get(key) ?? null;\n if (!program) {\n program = this.createProgram(ctx, shadowMapParams);\n bindGroup = device.createBindGroup(program.bindGroupLayouts[0]);\n this._programs.set(key, program);\n this._bindGroups.set(key, bindGroup);\n }\n bindGroup = this._bindGroups.get(key)!;\n this.setUniforms(bindGroup, ctx, depthTexture, light, shadowMapParams);\n device.setProgram(program);\n device.setBindGroup(0, bindGroup);\n drawFullscreenQuad(renderState);\n }\n\n /**\n * The program signature: distinct shadow implementations, cascade counts and\n * shadow map types must not share a compiled program.\n */\n private getProgramKey(ctx: DrawContext, shadowMapParams: ShadowMapParams): string {\n return `${ctx.device.type}|${shadowMapParams.shaderHash}`;\n }\n\n private getChannelStates(device: AbstractDevice): RenderStateSet[] {\n if (!this._channelStates) {\n this._channelStates = [];\n for (let c = 0; c < SHADOW_MASK_LIGHTS_PER_LAYER; c++) {\n const rs = device.createRenderStateSet();\n rs.useDepthState().enableTest(false).enableWrite(false);\n rs.useRasterizerState().setCullMode('none');\n rs.useColorState().setColorMask(c === 0, c === 1, c === 2, c === 3);\n this._channelStates.push(rs);\n }\n }\n return this._channelStates;\n }\n\n private setUniforms(\n bindGroup: BindGroup,\n ctx: DrawContext,\n depthTexture: Texture2D,\n light: PunctualLight,\n shadowMapParams: ShadowMapParams\n ): void {\n const camera = ctx.camera;\n const near = camera.getNearPlane();\n const far = camera.getFarPlane();\n const cameraPos = camera.getWorldPosition();\n this._cameraPosition.setXYZW(cameraPos.x, cameraPos.y, cameraPos.z, 0);\n this._cameraParams.setXYZW(near, far, 1, 1);\n this._nearFar.setXY(near, far);\n bindGroup.setValue('camera', {\n position: this._cameraPosition,\n params: this._cameraParams,\n shadowDebugCascades: camera.shadowDebugCascades ? 1 : 0,\n framestamp: ctx.device.frameInfo.frameCounter\n });\n // Full shadow light struct (matches helper.ts currentShadowLight lightStruct,\n // including implParams which PCSS/VSM impls read via getShadowImplParams).\n const implParams = new Vector4();\n shadowMapParams.impl!.getParams(implParams);\n bindGroup.setValue('light', {\n sunDir: ctx.sunLight\n ? ctx.sunLight.directionAndCutoff.xyz().scaleBy(-1)\n : new Vector4(0, 1, 0, 0).xyz(),\n shadowCascades: shadowMapParams.numShadowCascades,\n positionAndRange: light.positionAndRange,\n directionAndCutoff: light.directionAndCutoff,\n diffuseAndIntensity: light.diffuseAndIntensity,\n extraParams: light.extraParams,\n cascadeDistances: shadowMapParams.cascadeDistances,\n depthBiasValues: shadowMapParams.depthBiasValues[0],\n shadowCameraParams: shadowMapParams.cameraParams,\n depthBiasScales: shadowMapParams.depthBiasScales,\n implParams: implParams,\n shadowMatrices: new Float32Array(shadowMapParams.shadowMatrices),\n shadowStrength: light.shadow.shadowStrength,\n envLightStrength: ctx.env?.light.strength ?? 0,\n envLightSpecularStrength: ctx.env?.light.specularStrength ?? 1\n });\n bindGroup.setValue('invViewProjMatrix', camera.invViewProjectionMatrix);\n bindGroup.setValue('cameraNearFar', this._nearFar);\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\n bindGroup.setTexture('depthTex', depthTexture);\n bindGroup.setTexture(\n UNIFORM_NAME_SHADOW_MAP,\n shadowMapParams.shadowMap!,\n shadowMapParams.shadowMapSampler\n );\n }\n\n /**\n * Whether the fullscreen output needs a vertical flip. Mask array layers are\n * offscreen render targets, so the convention matches other offscreen passes\n * (no flip); WebGPU still flips clip-space Y in the vertex shader.\n */\n private needFlip(_device: AbstractDevice): boolean {\n return false;\n }\n\n private createProgram(ctx: DrawContext, shadowMapParams: ShadowMapParams): GPUProgram {\n const device = ctx.device;\n const numCascades = shadowMapParams.numShadowCascades;\n const shadowMap = shadowMapParams.shadowMap!;\n const program = device.buildRenderProgram({\n label: 'ShadowMask',\n vertex(pb) {\n this.flip = pb.int().uniform(0);\n this.$inputs.pos = pb.vec2().attrib('position');\n this.$outputs.uv = pb.vec2();\n pb.main(function () {\n this.$builtins.position = pb.vec4(this.$inputs.pos, 1, 1);\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\n this.$if(pb.notEqual(this.flip, 0), function () {\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\n });\n if (device.type === 'webgpu') {\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\n }\n });\n },\n fragment(pb) {\n const cameraStruct = pb.defineStruct([\n pb.vec4('position'),\n pb.vec4('params'),\n pb.float('shadowDebugCascades'),\n // Required by PCSS temporal jitter (ShaderHelper.getFramestamp).\n pb.int('framestamp')\n ]);\n // Must match helper.ts currentShadowLight lightStruct field-for-field.\n const lightStruct = pb.defineStruct([\n pb.vec3('sunDir'),\n pb.int('shadowCascades'),\n pb.vec4('positionAndRange'),\n pb.vec4('directionAndCutoff'),\n pb.vec4('diffuseAndIntensity'),\n pb.vec4('extraParams'),\n pb.vec4('cascadeDistances'),\n pb.vec4('depthBiasValues'),\n pb.vec4('shadowCameraParams'),\n pb.vec4('depthBiasScales'),\n pb.vec4('implParams'),\n pb.vec4[16]('shadowMatrices'),\n pb.float('shadowStrength'),\n pb.float('envLightStrength'),\n pb.float('envLightSpecularStrength')\n ]);\n this.camera = cameraStruct().uniform(0);\n this.light = lightStruct().uniform(0);\n const shadowTex = shadowMap.isTextureCube()\n ? shadowMap.isDepth()\n ? pb.texCubeShadow()\n : pb.texCube()\n : shadowMap.isTexture2D()\n ? shadowMap.isDepth()\n ? pb.tex2DShadow()\n : pb.tex2D()\n : shadowMap.isDepth()\n ? pb.tex2DArrayShadow()\n : pb.tex2DArray();\n if (\n !shadowMap.isDepth() &&\n !device.getDeviceCaps().textureCaps.getTextureFormatInfo(shadowMap.format).filterable\n ) {\n shadowTex.sampleType('unfilterable-float');\n }\n this[UNIFORM_NAME_SHADOW_MAP] = shadowTex.uniform(0);\n this.depthTex = pb.tex2D().uniform(0);\n this.invViewProjMatrix = pb.mat4().uniform(0);\n this.cameraNearFar = pb.vec2().uniform(0);\n this.$outputs.color = pb.vec4();\n // Explicit-depth cascade selection (fragCoord.z is invalid in a fullscreen\n // pass). Mirrors posteffect/sss.ts calculateTransmissionShadow.\n pb.func(\n 'zShadowMaskFactor',\n [pb.vec3('worldPos'), pb.float('depth01'), pb.float('NoL')],\n function () {\n if (numCascades > 1) {\n this.$l.linearDepth = pb.mul(this.depth01, this.camera.params.y);\n this.$l.splitDistances = this.light.cascadeDistances;\n this.$l.comparison = pb.vec4(pb.greaterThan(pb.vec4(this.linearDepth), this.splitDistances));\n this.$l.cascadeFlags = pb.vec4(\n pb.float(pb.greaterThan(this.light.shadowCascades, 0)),\n pb.float(pb.greaterThan(this.light.shadowCascades, 1)),\n pb.float(pb.greaterThan(this.light.shadowCascades, 2)),\n pb.float(pb.greaterThan(this.light.shadowCascades, 3))\n );\n this.$l.split = pb.int(pb.dot(this.comparison, this.cascadeFlags));\n if (device.type === 'webgl') {\n this.$l.shadowVertex = pb.vec4();\n this.$for(pb.int('cascade'), 0, 4, function () {\n this.$if(pb.equal(this.cascade, this.split), function () {\n this.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(\n this,\n pb.vec4(this.worldPos, 1),\n this.cascade\n );\n this.$break();\n });\n });\n } else {\n this.$l.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(\n this,\n pb.vec4(this.worldPos, 1),\n this.split\n );\n }\n this.$l.shadow = shadowMapParams.impl!.computeShadowCSM(\n shadowMapParams,\n this,\n this.shadowVertex,\n this.NoL,\n this.split\n );\n this.$l.shadowDistance = this.light.shadowCameraParams.w;\n this.shadow = pb.mix(\n this.shadow,\n 1,\n pb.smoothStep(\n pb.mul(this.shadowDistance, 0.8),\n this.shadowDistance,\n pb.distance(this.camera.position.xyz, this.worldPos)\n )\n );\n this.shadow = pb.mix(1, this.shadow, this.light.shadowStrength);\n this.$return(pb.clamp(this.shadow, 0, 1));\n } else {\n this.$l.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(this, pb.vec4(this.worldPos, 1));\n this.$l.shadow = shadowMapParams.impl!.computeShadow(\n shadowMapParams,\n this,\n this.shadowVertex,\n this.NoL\n );\n this.$l.shadowDistance = this.light.shadowCameraParams.w;\n this.shadow = pb.mix(\n this.shadow,\n 1,\n pb.smoothStep(\n pb.mul(this.shadowDistance, 0.8),\n this.shadowDistance,\n pb.distance(this.camera.position.xyz, this.worldPos)\n )\n );\n this.shadow = pb.mix(1, this.shadow, this.light.shadowStrength);\n this.$return(pb.clamp(this.shadow, 0, 1));\n }\n }\n );\n pb.main(function () {\n this.$l.pos = ShaderHelper.samplePositionFromDepth(\n this,\n this.depthTex,\n this.$inputs.uv,\n this.invViewProjMatrix,\n this.cameraNearFar\n );\n // NoL is unavailable in a fullscreen pass (no geometric normal); it only\n // feeds normal-offset bias, so a conservative 1.0 is used.\n this.$l.factor = this.zShadowMaskFactor(this.pos.xyz, this.pos.w, pb.float(1));\n this.$outputs.color = pb.vec4(this.factor);\n });\n }\n })!;\n program.name = '@ShadowMask';\n return program;\n }\n\n /** Release cached GPU resources. */\n dispose(): void {\n for (const program of this._programs.values()) {\n program.dispose();\n }\n this._programs.clear();\n this._bindGroups.clear();\n this._channelStates = null;\n }\n}\n\n/** Shared type alias to keep the mask factor accessor discoverable. */\nexport type ShadowMaskFactorExp = PBShaderExp;\n"],"names":["UNIFORM_NAME_SHADOW_MAP","SHADOW_MASK_LIGHTS_PER_LAYER","MAX_SHADOW_MASK_LAYERS","MAX_SHADOW_MASK_LIGHTS","ShadowMaskRenderer","_nearFar","_cameraPosition","_cameraParams","_programs","Map","_bindGroups","_channelStates","Vector2","Vector4","getLayerCount","numLights","n","Math","min","ceil","render","ctx","depthTexture","lights","getLayerFramebuffer","device","length","shadowMapInfo","numLayers","channelStates","getChannelStates","savedShadowLight","currentShadowLight","pushDeviceStates","layer","framebuffer","setFramebuffer","clearFrameBuffer","channel","ordinal","light","shadowMapParams","get","shadowMap","renderLightChannel","popDeviceStates","renderState","key","getProgramKey","program","bindGroup","createProgram","createBindGroup","bindGroupLayouts","set","setUniforms","setProgram","setBindGroup","drawFullscreenQuad","type","shaderHash","c","rs","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","useColorState","setColorMask","push","camera","near","getNearPlane","far","getFarPlane","cameraPos","getWorldPosition","setXYZW","x","y","z","setXY","setValue","position","params","shadowDebugCascades","framestamp","frameInfo","frameCounter","implParams","impl","getParams","sunDir","sunLight","directionAndCutoff","xyz","scaleBy","shadowCascades","numShadowCascades","positionAndRange","diffuseAndIntensity","extraParams","cascadeDistances","depthBiasValues","shadowCameraParams","cameraParams","depthBiasScales","shadowMatrices","Float32Array","shadowStrength","shadow","envLightStrength","env","strength","envLightSpecularStrength","specularStrength","invViewProjectionMatrix","needFlip","setTexture","shadowMapSampler","_device","numCascades","buildRenderProgram","label","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","vec4","add","mul","xy","$if","notEqual","neg","fragment","cameraStruct","defineStruct","float","lightStruct","vec3","shadowTex","isTextureCube","isDepth","texCubeShadow","texCube","isTexture2D","tex2DShadow","tex2D","tex2DArrayShadow","tex2DArray","getDeviceCaps","textureCaps","getTextureFormatInfo","format","filterable","sampleType","depthTex","invViewProjMatrix","mat4","cameraNearFar","color","func","$l","linearDepth","depth01","splitDistances","comparison","greaterThan","cascadeFlags","split","dot","shadowVertex","$for","equal","cascade","ShaderHelper","calculateShadowSpaceVertex","worldPos","$break","computeShadowCSM","NoL","shadowDistance","w","mix","smoothStep","distance","$return","clamp","computeShadow","samplePositionFromDepth","factor","zShadowMaskFactor","name","dispose","values","clear"],"mappings":"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"}
|
|
@@ -32,6 +32,11 @@ import { Disposable, Vector4 } from '@zephyr3d/base';
|
|
|
32
32
|
return false;
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
35
|
+
* {@inheritDoc OIT.wantsAdditiveLightPassAlpha}
|
|
36
|
+
*/ wantsAdditiveLightPassAlpha() {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
35
40
|
* {@inheritDoc OIT.begin}
|
|
36
41
|
*/ begin(_ctx) {
|
|
37
42
|
return 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weightedblended_oit.js","sources":["../../src/render/weightedblended_oit.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport type { OIT } from './oit';\r\nimport type { DrawContext } from './drawable';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { Disposable, Vector4 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Weighted-blended OIT renderer.\r\n *\r\n * @remarks\r\n * The weighed-blended OIT renderer supports both WebGL, WebGL2 and WebGPU device.\r\n *\r\n * @public\r\n */\r\nexport class WeightedBlendedOIT extends Disposable implements OIT {\r\n /** Type name of WeightedBlendedOIT */\r\n public static readonly type = 'wb';\r\n private static _compositeProgram: GPUProgram;\r\n private static _compositeBindGroup: BindGroup;\r\n private static _compositeRenderStates: RenderStateSet;\r\n\r\n constructor() {\r\n super();\r\n }\r\n /**\r\n * {@inheritDoc OIT.getType}\r\n */\r\n getType() {\r\n return WeightedBlendedOIT.type;\r\n }\r\n /**\r\n * {@inheritDoc OIT.supportDevice}\r\n */\r\n supportDevice(_deviceType: string) {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\r\n */\r\n wantsPremultipliedAlpha() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc OIT.begin}\r\n */\r\n begin(_ctx: DrawContext) {\r\n return 1;\r\n }\r\n /**\r\n * {@inheritDoc OIT.end}\r\n */\r\n end(_ctx: DrawContext) {\r\n return;\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.outColor = pb.vec4();\r\n scope.$outputs.outAlpha = pb.getDevice().type === 'webgl' ? pb.vec4() : pb.float();\r\n }\r\n /**\r\n * {@inheritDoc OIT.beginPass}\r\n */\r\n beginPass(ctx: DrawContext, _pass: number) {\r\n const device = ctx.device;\r\n const accumBuffer = this.getAccumFramebuffer(ctx, device);\r\n device.pushDeviceStates();\r\n device.setFramebuffer(accumBuffer);\r\n device.clearFrameBuffer(new Vector4(0, 0, 0, 1), null, null);\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.endPass}\r\n */\r\n endPass(ctx: DrawContext, _pass: number) {\r\n const device = ctx.device;\r\n const accumBuffer = device.getFramebuffer()!;\r\n device.popDeviceStates();\r\n const accumTargets = accumBuffer.getColorAttachments();\r\n this.composite(ctx, device, accumTargets[0] as Texture2D, accumTargets[1] as Texture2D);\r\n }\r\n /**\r\n * {@inheritDoc OIT.calculateHash}\r\n */\r\n calculateHash() {\r\n return this.getType();\r\n }\r\n /**\r\n * {@inheritDoc OIT.applyUniforms}\r\n */\r\n applyUniforms(_ctx: DrawContext, _bindGroup: BindGroup) {\r\n return;\r\n }\r\n /**\r\n * {@inheritDoc OIT.outputFragmentColor}\r\n */\r\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp) {\r\n const pb = scope.$builder;\r\n pb.func('Z_WBOIT_depthWeight', [pb.float('z'), pb.float('a')], function () {\r\n this.$return(\r\n pb.clamp(\r\n pb.mul(\r\n pb.pow(pb.add(pb.min(1, pb.mul(this.a, 10)), 0.01), 3),\r\n 1e8,\r\n pb.pow(pb.sub(1, pb.mul(this.z, 0.9)), 2)\r\n ),\r\n 1e-2,\r\n 3e3\r\n )\r\n );\r\n });\r\n pb.func('Z_WBOIT_output', [pb.vec4('color')], function () {\r\n this.$l.w = this.Z_WBOIT_depthWeight(this.$builtins.fragCoord.z, this.color.a);\r\n this.$outputs[0] = pb.vec4(pb.mul(this.color.rgb, this.w), this.color.a);\r\n this.$outputs[1] =\r\n pb.getDevice().type === 'webgl'\r\n ? pb.vec4(pb.mul(this.color.a, this.w))\r\n : pb.mul(this.color.a, this.w);\r\n });\r\n scope.Z_WBOIT_output(color);\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.setRenderStates}\r\n */\r\n setRenderStates(rs: RenderStateSet) {\r\n const blendingState = rs.useBlendingState();\r\n blendingState.enable(true);\r\n blendingState.setBlendEquation('add', 'add');\r\n blendingState.setBlendFuncRGB('one', 'one');\r\n blendingState.setBlendFuncAlpha('zero', 'inv-src-alpha');\r\n const depthState = rs.useDepthState();\r\n depthState.enableWrite(false).enableTest(true);\r\n }\r\n /** @internal */\r\n private composite(ctx: DrawContext, device: AbstractDevice, accumColor: Texture2D, accumAlpha: 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(WeightedBlendedOIT.getCompositeProgram(device));\r\n WeightedBlendedOIT._compositeBindGroup.setTexture('accumColorTex', accumColor);\r\n WeightedBlendedOIT._compositeBindGroup.setTexture('accumAlphaTex', accumAlpha);\r\n device.setBindGroup(0, WeightedBlendedOIT._compositeBindGroup);\r\n drawFullscreenQuad(WeightedBlendedOIT._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 /** @internal */\r\n private getAccumFramebuffer(ctx: DrawContext, device: AbstractDevice) {\r\n const width = ctx.depthTexture!.width;\r\n const height = ctx.depthTexture!.height;\r\n const accumColor = device.pool.fetchTemporalTexture2D(false, 'rgba16f', width, height, false);\r\n const accumAlpha = device.pool.fetchTemporalTexture2D(\r\n false,\r\n device.type === 'webgl' ? 'rgba16f' : 'r16f',\r\n width,\r\n height,\r\n false\r\n );\r\n const fb = device.pool.createTemporalFramebuffer(true, [accumColor, accumAlpha], ctx.depthTexture);\r\n device.pool.releaseTexture(accumColor);\r\n device.pool.releaseTexture(accumAlpha);\r\n return fb;\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, 1, 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.accumColorTex = pb.tex2D().uniform(0);\r\n this.accumAlphaTex = pb.tex2D().uniform(0);\r\n pb.main(function () {\r\n this.$l.accumColor = pb.textureSample(this.accumColorTex, this.$inputs.uv);\r\n this.$l.accumAlpha = pb.textureSample(this.accumAlphaTex, this.$inputs.uv);\r\n this.$l.r = this.accumColor.a;\r\n this.accumColor.a = this.accumAlpha.r;\r\n this.$outputs.outColor = pb.vec4(\r\n pb.div(this.accumColor.rgb, pb.clamp(this.accumColor.a, 0.0001, 50000)),\r\n this.r\r\n );\r\n });\r\n }\r\n })!;\r\n this._compositeProgram.name = '@WBOIT_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('inv-src-alpha', '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"],"names":["WeightedBlendedOIT","Disposable","type","_compositeProgram","_compositeBindGroup","_compositeRenderStates","getType","supportDevice","_deviceType","wantsPremultipliedAlpha","begin","_ctx","end","setupFragmentOutput","scope","pb","$builder","$outputs","outColor","vec4","outAlpha","getDevice","float","beginPass","ctx","_pass","device","accumBuffer","getAccumFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","Vector4","endPass","getFramebuffer","popDeviceStates","accumTargets","getColorAttachments","composite","calculateHash","applyUniforms","_bindGroup","outputFragmentColor","color","func","$return","clamp","mul","pow","add","min","a","sub","z","$l","w","Z_WBOIT_depthWeight","$builtins","fragCoord","rgb","Z_WBOIT_output","setRenderStates","rs","blendingState","useBlendingState","enable","setBlendEquation","setBlendFuncRGB","setBlendFuncAlpha","depthState","useDepthState","enableWrite","enableTest","accumColor","accumAlpha","currentFramebuffer","colorAttachment","singleColorFramebuffer","length","pool","fetchTemporalFramebuffer","getDepthAttachment","viewport","getViewport","scissor","getScissor","setViewport","setScissor","setProgram","getCompositeProgram","setTexture","setBindGroup","drawFullscreenQuad","releaseFrameBuffer","width","depthTexture","height","fetchTemporalTexture2D","fb","createTemporalFramebuffer","releaseTexture","buildRenderProgram","vertex","$inputs","pos","vec2","attrib","uv","main","position","xy","y","neg","fragment","accumColorTex","tex2D","uniform","accumAlphaTex","textureSample","r","div","name","createBindGroup","bindGroupLayouts","createRenderStateSet"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"weightedblended_oit.js","sources":["../../src/render/weightedblended_oit.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport type { OIT } from './oit';\r\nimport type { DrawContext } from './drawable';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { Disposable, Vector4 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Weighted-blended OIT renderer.\r\n *\r\n * @remarks\r\n * The weighed-blended OIT renderer supports both WebGL, WebGL2 and WebGPU device.\r\n *\r\n * @public\r\n */\r\nexport class WeightedBlendedOIT extends Disposable implements OIT {\r\n /** Type name of WeightedBlendedOIT */\r\n public static readonly type = 'wb';\r\n private static _compositeProgram: GPUProgram;\r\n private static _compositeBindGroup: BindGroup;\r\n private static _compositeRenderStates: RenderStateSet;\r\n\r\n constructor() {\r\n super();\r\n }\r\n /**\r\n * {@inheritDoc OIT.getType}\r\n */\r\n getType() {\r\n return WeightedBlendedOIT.type;\r\n }\r\n /**\r\n * {@inheritDoc OIT.supportDevice}\r\n */\r\n supportDevice(_deviceType: string) {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\r\n */\r\n wantsPremultipliedAlpha() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}\r\n */\r\n wantsAdditiveLightPassAlpha() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc OIT.begin}\r\n */\r\n begin(_ctx: DrawContext) {\r\n return 1;\r\n }\r\n /**\r\n * {@inheritDoc OIT.end}\r\n */\r\n end(_ctx: DrawContext) {\r\n return;\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.outColor = pb.vec4();\r\n scope.$outputs.outAlpha = pb.getDevice().type === 'webgl' ? pb.vec4() : pb.float();\r\n }\r\n /**\r\n * {@inheritDoc OIT.beginPass}\r\n */\r\n beginPass(ctx: DrawContext, _pass: number) {\r\n const device = ctx.device;\r\n const accumBuffer = this.getAccumFramebuffer(ctx, device);\r\n device.pushDeviceStates();\r\n device.setFramebuffer(accumBuffer);\r\n device.clearFrameBuffer(new Vector4(0, 0, 0, 1), null, null);\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.endPass}\r\n */\r\n endPass(ctx: DrawContext, _pass: number) {\r\n const device = ctx.device;\r\n const accumBuffer = device.getFramebuffer()!;\r\n device.popDeviceStates();\r\n const accumTargets = accumBuffer.getColorAttachments();\r\n this.composite(ctx, device, accumTargets[0] as Texture2D, accumTargets[1] as Texture2D);\r\n }\r\n /**\r\n * {@inheritDoc OIT.calculateHash}\r\n */\r\n calculateHash() {\r\n return this.getType();\r\n }\r\n /**\r\n * {@inheritDoc OIT.applyUniforms}\r\n */\r\n applyUniforms(_ctx: DrawContext, _bindGroup: BindGroup) {\r\n return;\r\n }\r\n /**\r\n * {@inheritDoc OIT.outputFragmentColor}\r\n */\r\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp) {\r\n const pb = scope.$builder;\r\n pb.func('Z_WBOIT_depthWeight', [pb.float('z'), pb.float('a')], function () {\r\n this.$return(\r\n pb.clamp(\r\n pb.mul(\r\n pb.pow(pb.add(pb.min(1, pb.mul(this.a, 10)), 0.01), 3),\r\n 1e8,\r\n pb.pow(pb.sub(1, pb.mul(this.z, 0.9)), 2)\r\n ),\r\n 1e-2,\r\n 3e3\r\n )\r\n );\r\n });\r\n pb.func('Z_WBOIT_output', [pb.vec4('color')], function () {\r\n this.$l.w = this.Z_WBOIT_depthWeight(this.$builtins.fragCoord.z, this.color.a);\r\n this.$outputs[0] = pb.vec4(pb.mul(this.color.rgb, this.w), this.color.a);\r\n this.$outputs[1] =\r\n pb.getDevice().type === 'webgl'\r\n ? pb.vec4(pb.mul(this.color.a, this.w))\r\n : pb.mul(this.color.a, this.w);\r\n });\r\n scope.Z_WBOIT_output(color);\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.setRenderStates}\r\n */\r\n setRenderStates(rs: RenderStateSet) {\r\n const blendingState = rs.useBlendingState();\r\n blendingState.enable(true);\r\n blendingState.setBlendEquation('add', 'add');\r\n blendingState.setBlendFuncRGB('one', 'one');\r\n blendingState.setBlendFuncAlpha('zero', 'inv-src-alpha');\r\n const depthState = rs.useDepthState();\r\n depthState.enableWrite(false).enableTest(true);\r\n }\r\n /** @internal */\r\n private composite(ctx: DrawContext, device: AbstractDevice, accumColor: Texture2D, accumAlpha: 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(WeightedBlendedOIT.getCompositeProgram(device));\r\n WeightedBlendedOIT._compositeBindGroup.setTexture('accumColorTex', accumColor);\r\n WeightedBlendedOIT._compositeBindGroup.setTexture('accumAlphaTex', accumAlpha);\r\n device.setBindGroup(0, WeightedBlendedOIT._compositeBindGroup);\r\n drawFullscreenQuad(WeightedBlendedOIT._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 /** @internal */\r\n private getAccumFramebuffer(ctx: DrawContext, device: AbstractDevice) {\r\n const width = ctx.depthTexture!.width;\r\n const height = ctx.depthTexture!.height;\r\n const accumColor = device.pool.fetchTemporalTexture2D(false, 'rgba16f', width, height, false);\r\n const accumAlpha = device.pool.fetchTemporalTexture2D(\r\n false,\r\n device.type === 'webgl' ? 'rgba16f' : 'r16f',\r\n width,\r\n height,\r\n false\r\n );\r\n const fb = device.pool.createTemporalFramebuffer(true, [accumColor, accumAlpha], ctx.depthTexture);\r\n device.pool.releaseTexture(accumColor);\r\n device.pool.releaseTexture(accumAlpha);\r\n return fb;\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, 1, 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.accumColorTex = pb.tex2D().uniform(0);\r\n this.accumAlphaTex = pb.tex2D().uniform(0);\r\n pb.main(function () {\r\n this.$l.accumColor = pb.textureSample(this.accumColorTex, this.$inputs.uv);\r\n this.$l.accumAlpha = pb.textureSample(this.accumAlphaTex, this.$inputs.uv);\r\n this.$l.r = this.accumColor.a;\r\n this.accumColor.a = this.accumAlpha.r;\r\n this.$outputs.outColor = pb.vec4(\r\n pb.div(this.accumColor.rgb, pb.clamp(this.accumColor.a, 0.0001, 50000)),\r\n this.r\r\n );\r\n });\r\n }\r\n })!;\r\n this._compositeProgram.name = '@WBOIT_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('inv-src-alpha', '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"],"names":["WeightedBlendedOIT","Disposable","type","_compositeProgram","_compositeBindGroup","_compositeRenderStates","getType","supportDevice","_deviceType","wantsPremultipliedAlpha","wantsAdditiveLightPassAlpha","begin","_ctx","end","setupFragmentOutput","scope","pb","$builder","$outputs","outColor","vec4","outAlpha","getDevice","float","beginPass","ctx","_pass","device","accumBuffer","getAccumFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","Vector4","endPass","getFramebuffer","popDeviceStates","accumTargets","getColorAttachments","composite","calculateHash","applyUniforms","_bindGroup","outputFragmentColor","color","func","$return","clamp","mul","pow","add","min","a","sub","z","$l","w","Z_WBOIT_depthWeight","$builtins","fragCoord","rgb","Z_WBOIT_output","setRenderStates","rs","blendingState","useBlendingState","enable","setBlendEquation","setBlendFuncRGB","setBlendFuncAlpha","depthState","useDepthState","enableWrite","enableTest","accumColor","accumAlpha","currentFramebuffer","colorAttachment","singleColorFramebuffer","length","pool","fetchTemporalFramebuffer","getDepthAttachment","viewport","getViewport","scissor","getScissor","setViewport","setScissor","setProgram","getCompositeProgram","setTexture","setBindGroup","drawFullscreenQuad","releaseFrameBuffer","width","depthTexture","height","fetchTemporalTexture2D","fb","createTemporalFramebuffer","releaseTexture","buildRenderProgram","vertex","$inputs","pos","vec2","attrib","uv","main","position","xy","y","neg","fragment","accumColorTex","tex2D","uniform","accumAlphaTex","textureSample","r","div","name","createBindGroup","bindGroupLayouts","createRenderStateSet"],"mappings":"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"}
|
package/dist/scene/basesprite.js
CHANGED
|
@@ -27,6 +27,7 @@ import '../render/rendergraph/forward_plus_builder.js';
|
|
|
27
27
|
import '../render/lightpass.js';
|
|
28
28
|
import '../render/sky.js';
|
|
29
29
|
import '../render/clipmap.js';
|
|
30
|
+
import '../render/dualdepthpeeling_oit.js';
|
|
30
31
|
import '../shaders/atmosphere.js';
|
|
31
32
|
import { BoundingBox } from '../utility/bounding_volume.js';
|
|
32
33
|
import { mixinDrawable } from '../render/drawable_mixin.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basesprite.js","sources":["../../src/scene/basesprite.ts"],"sourcesContent":["import type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, DRef, Quaternion, Vector2, Vector3 } from '@zephyr3d/base';\r\nimport { GraphNode } from './graph_node';\r\nimport type { RenderPass, BatchDrawable, DrawContext, PickTarget, RenderQueue } from '../render';\r\nimport { Primitive } from '../render';\r\nimport type { RenderBundle } from '@zephyr3d/device';\r\nimport type { Scene } from './scene';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { QUEUE_OPAQUE } from '../values';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport { RenderBundleWrapper } from '../render/renderbundle_wrapper';\r\nimport type { SceneNode } from './scene_node';\r\nimport { getDevice } from '../app/api';\r\nimport { SpriteMaterial } from '../material/sprite';\r\n\r\n/**\r\n * Mesh node\r\n * @public\r\n */\r\nexport class BaseSprite<M extends SpriteMaterial>\r\n extends applyMixins(GraphNode, mixinDrawable)\r\n implements BatchDrawable\r\n{\r\n /** @internal */\r\n private static _primitive: DRef<Primitive> = new DRef();\r\n /** @internal */\r\n protected readonly _material: DRef<M>;\r\n /** @internal */\r\n protected _instanceHash: Nullable<string>;\r\n /** @internal */\r\n protected _batchable: boolean;\r\n /** @internal */\r\n protected _pickTarget: PickTarget;\r\n /** @internal */\r\n protected _renderBundle: Record<string, RenderBundle>;\r\n /** @internal */\r\n protected _useRenderBundle: boolean;\r\n /** @internal */\r\n protected _materialChangeTag: Nullable<number>;\r\n /** @internal */\r\n protected _anchor: Vector2;\r\n /** @internal */\r\n protected _rotateAngle: number;\r\n /**\r\n * Creates an instance of mesh node\r\n * @param scene - The scene to which the mesh node belongs\r\n */\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._material = new DRef();\r\n this._instanceHash = null;\r\n this._pickTarget = { node: this };\r\n this._batchable = getDevice().type !== 'webgl';\r\n this._anchor = new Vector2(0.5, 0.5);\r\n this._rotateAngle = 0;\r\n this._renderBundle = {};\r\n this._useRenderBundle = true;\r\n this._materialChangeTag = null;\r\n }\r\n /**\r\n * Returns the batch instance ID for the current render pass.\r\n */\r\n getInstanceId(_renderPass: RenderPass) {\r\n return `${this._instanceHash}:${this.worldMatrixDet >= 0}`;\r\n }\r\n /**\r\n * Returns the packed instance-uniform buffer used for batching.\r\n */\r\n getInstanceUniforms() {\r\n return this._material.get()!.$instanceUniforms;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n setPickTarget(node: SceneNode, label?: string) {\r\n this._pickTarget = { node, label };\r\n }\r\n /** Material of the mesh */\r\n get material() {\r\n return this._material.get()!;\r\n }\r\n set material(m) {\r\n if (this._material.get() !== m && m instanceof SpriteMaterial) {\r\n this._material.set(m);\r\n if (m) {\r\n this.onSetMaterial(m);\r\n RenderBundleWrapper.materialAttached(m.coreMaterial, this);\r\n }\r\n this._instanceHash = m ? `${this.constructor.name}:${this._scene?.id ?? 0}:${m.instanceId}` : null;\r\n RenderBundleWrapper.drawableChanged(this);\r\n this._materialChangeTag = null;\r\n }\r\n }\r\n get anchorX() {\r\n return this._anchor.x;\r\n }\r\n set anchorX(value) {\r\n if (this._anchor.x !== value) {\r\n this._anchor.x = value;\r\n this.invalidateWorldBoundingVolume(false);\r\n const material = this._material.get();\r\n if (material) {\r\n material.anchorX = this._anchor.x;\r\n }\r\n }\r\n }\r\n get anchorY() {\r\n return this._anchor.y;\r\n }\r\n set anchorY(value) {\r\n if (this._anchor.y !== value) {\r\n this._anchor.y = value;\r\n this.invalidateWorldBoundingVolume(false);\r\n const material = this._material.get();\r\n if (material) {\r\n material.anchorY = this._anchor.y;\r\n }\r\n }\r\n }\r\n get uvTopLeft() {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n return new Vector2(uvinfo.x, uvinfo.y);\r\n }\r\n set uvTopLeft(value) {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n this._material.get()!.setUVInfo(value.x, value.y, uvinfo.z, uvinfo.w);\r\n }\r\n get uvBottomRight() {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n return new Vector2(uvinfo.z, uvinfo.w);\r\n }\r\n set uvBottomRight(value) {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n this._material.get()!.setUVInfo(uvinfo.x, uvinfo.y, value.x, value.y);\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isBatchable}\r\n */\r\n isBatchable(): this is BatchDrawable {\r\n return this._batchable && !!this._material.get() && this._material.get()!.isBatchable();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this.material?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return !this.material?.supportLighting();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this.material?.needSceneColor();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.needSceneDepth();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.draw}\r\n */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>, hash?: string) {\r\n const material = this.material;\r\n const primitive = this.getPrimitive();\r\n if (material && primitive) {\r\n if (this._useRenderBundle && !ctx.instanceData && hash) {\r\n if (this._materialChangeTag !== material.changeTag) {\r\n this._renderBundle = {};\r\n this._materialChangeTag = material.changeTag;\r\n }\r\n const renderBundle = this._renderBundle[hash];\r\n if (!renderBundle) {\r\n ctx.device.beginCapture();\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n this._renderBundle[hash] = ctx.device.endCapture();\r\n } else {\r\n ctx.device.executeRenderBundle(renderBundle);\r\n }\r\n } else {\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this.material;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n let primitive = BaseSprite._primitive.get();\r\n if (!primitive) {\r\n primitive = new Primitive();\r\n primitive.createAndSetVertexBuffer('position_f32', new Float32Array([0, 1, 2, 3]));\r\n primitive.createAndSetIndexBuffer(new Uint16Array([0, 1, 2, 3]));\r\n primitive.primitiveType = 'triangle-strip';\r\n BaseSprite._primitive.set(primitive);\r\n }\r\n return primitive;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getBoneMatrices}\r\n */\r\n getBoneMatrices() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getNode}\r\n */\r\n getNode() {\r\n // mesh transform should be ignored when skinned\r\n return this;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeBoundingVolume}\r\n */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeWorldBoundingVolume}\r\n */\r\n computeWorldBoundingVolume() {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const scaleX = Math.hypot(this.worldMatrix[0], this.worldMatrix[1], this.worldMatrix[2]);\r\n const scaleY = Math.hypot(this.worldMatrix[4], this.worldMatrix[5], this.worldMatrix[6]);\r\n const mat = this._material?.get();\r\n if (mat) {\r\n const boundingBox = new BoundingBox();\r\n const cx = Math.max(Math.abs(this._anchor.x), Math.abs(1 - this._anchor.x)) * scaleX;\r\n const cy = Math.max(Math.abs(this._anchor.y), Math.abs(1 - this._anchor.y)) * scaleY;\r\n const size = Math.max(cx, cy);\r\n boundingBox.minPoint.setXYZ(p.x - size, p.y - size, p.z - size);\r\n boundingBox.maxPoint.setXYZ(p.x + size, p.y + size, p.z + size);\r\n return boundingBox;\r\n }\r\n return null;\r\n }\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n const rot = this.rotation.toEulerAngles().z;\r\n const rotationZ = Quaternion.fromAxisAngle(Vector3.axisPZ(), rot);\r\n outMatrix.compose(this._scaling, rotationZ, this._position);\r\n if (this._material?.get()) {\r\n this._rotateAngle = -rot;\r\n this._material.get()!.rotation = this._rotateAngle;\r\n }\r\n\r\n //outMatrix.scaling(this.scale).translateLeft(this._position);\r\n }\r\n calculateWorldTransform(outMatrix: Matrix4x4) {\r\n outMatrix.set(this.localMatrix);\r\n if (this.parent) {\r\n outMatrix.m03 += this.parent.worldMatrix.m03;\r\n outMatrix.m13 += this.parent.worldMatrix.m13;\r\n outMatrix.m23 += this.parent.worldMatrix.m23;\r\n }\r\n }\r\n /** Called when new material is set */\r\n protected onSetMaterial(material: M) {\r\n material.anchor = this._anchor;\r\n material.rotation = this._rotateAngle;\r\n }\r\n /** Disposes the mesh node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n}\r\n"],"names":["BaseSprite","applyMixins","GraphNode","mixinDrawable","_primitive","DRef","scene","_material","_instanceHash","_pickTarget","node","_batchable","getDevice","type","_anchor","Vector2","_rotateAngle","_renderBundle","_useRenderBundle","_materialChangeTag","getInstanceId","_renderPass","worldMatrixDet","getInstanceUniforms","get","$instanceUniforms","getPickTarget","setPickTarget","label","material","m","SpriteMaterial","set","onSetMaterial","RenderBundleWrapper","materialAttached","coreMaterial","name","_scene","id","instanceId","drawableChanged","anchorX","x","value","invalidateWorldBoundingVolume","anchorY","y","uvTopLeft","uvinfo","setUVInfo","z","w","uvBottomRight","getMorphData","getMorphInfo","isBatchable","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","draw","ctx","renderQueue","hash","primitive","getPrimitive","instanceData","changeTag","renderBundle","device","beginCapture","bind","endCapture","executeRenderBundle","getMaterial","Primitive","createAndSetVertexBuffer","Float32Array","createAndSetIndexBuffer","Uint16Array","primitiveType","getBoneMatrices","getNode","computeBoundingVolume","computeWorldBoundingVolume","p","worldMatrix","transformPointAffine","Vector3","zero","scaleX","Math","hypot","scaleY","mat","boundingBox","BoundingBox","cx","max","abs","cy","size","minPoint","setXYZ","maxPoint","calculateLocalTransform","outMatrix","rot","rotation","toEulerAngles","rotationZ","Quaternion","fromAxisAngle","axisPZ","compose","_scaling","_position","calculateWorldTransform","localMatrix","parent","m03","m13","m23","anchor","onDispose","dispose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"basesprite.js","sources":["../../src/scene/basesprite.ts"],"sourcesContent":["import type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, DRef, Quaternion, Vector2, Vector3 } from '@zephyr3d/base';\r\nimport { GraphNode } from './graph_node';\r\nimport type { RenderPass, BatchDrawable, DrawContext, PickTarget, RenderQueue } from '../render';\r\nimport { Primitive } from '../render';\r\nimport type { RenderBundle } from '@zephyr3d/device';\r\nimport type { Scene } from './scene';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { QUEUE_OPAQUE } from '../values';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport { RenderBundleWrapper } from '../render/renderbundle_wrapper';\r\nimport type { SceneNode } from './scene_node';\r\nimport { getDevice } from '../app/api';\r\nimport { SpriteMaterial } from '../material/sprite';\r\n\r\n/**\r\n * Mesh node\r\n * @public\r\n */\r\nexport class BaseSprite<M extends SpriteMaterial>\r\n extends applyMixins(GraphNode, mixinDrawable)\r\n implements BatchDrawable\r\n{\r\n /** @internal */\r\n private static _primitive: DRef<Primitive> = new DRef();\r\n /** @internal */\r\n protected readonly _material: DRef<M>;\r\n /** @internal */\r\n protected _instanceHash: Nullable<string>;\r\n /** @internal */\r\n protected _batchable: boolean;\r\n /** @internal */\r\n protected _pickTarget: PickTarget;\r\n /** @internal */\r\n protected _renderBundle: Record<string, RenderBundle>;\r\n /** @internal */\r\n protected _useRenderBundle: boolean;\r\n /** @internal */\r\n protected _materialChangeTag: Nullable<number>;\r\n /** @internal */\r\n protected _anchor: Vector2;\r\n /** @internal */\r\n protected _rotateAngle: number;\r\n /**\r\n * Creates an instance of mesh node\r\n * @param scene - The scene to which the mesh node belongs\r\n */\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._material = new DRef();\r\n this._instanceHash = null;\r\n this._pickTarget = { node: this };\r\n this._batchable = getDevice().type !== 'webgl';\r\n this._anchor = new Vector2(0.5, 0.5);\r\n this._rotateAngle = 0;\r\n this._renderBundle = {};\r\n this._useRenderBundle = true;\r\n this._materialChangeTag = null;\r\n }\r\n /**\r\n * Returns the batch instance ID for the current render pass.\r\n */\r\n getInstanceId(_renderPass: RenderPass) {\r\n return `${this._instanceHash}:${this.worldMatrixDet >= 0}`;\r\n }\r\n /**\r\n * Returns the packed instance-uniform buffer used for batching.\r\n */\r\n getInstanceUniforms() {\r\n return this._material.get()!.$instanceUniforms;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n setPickTarget(node: SceneNode, label?: string) {\r\n this._pickTarget = { node, label };\r\n }\r\n /** Material of the mesh */\r\n get material() {\r\n return this._material.get()!;\r\n }\r\n set material(m) {\r\n if (this._material.get() !== m && m instanceof SpriteMaterial) {\r\n this._material.set(m);\r\n if (m) {\r\n this.onSetMaterial(m);\r\n RenderBundleWrapper.materialAttached(m.coreMaterial, this);\r\n }\r\n this._instanceHash = m ? `${this.constructor.name}:${this._scene?.id ?? 0}:${m.instanceId}` : null;\r\n RenderBundleWrapper.drawableChanged(this);\r\n this._materialChangeTag = null;\r\n }\r\n }\r\n get anchorX() {\r\n return this._anchor.x;\r\n }\r\n set anchorX(value) {\r\n if (this._anchor.x !== value) {\r\n this._anchor.x = value;\r\n this.invalidateWorldBoundingVolume(false);\r\n const material = this._material.get();\r\n if (material) {\r\n material.anchorX = this._anchor.x;\r\n }\r\n }\r\n }\r\n get anchorY() {\r\n return this._anchor.y;\r\n }\r\n set anchorY(value) {\r\n if (this._anchor.y !== value) {\r\n this._anchor.y = value;\r\n this.invalidateWorldBoundingVolume(false);\r\n const material = this._material.get();\r\n if (material) {\r\n material.anchorY = this._anchor.y;\r\n }\r\n }\r\n }\r\n get uvTopLeft() {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n return new Vector2(uvinfo.x, uvinfo.y);\r\n }\r\n set uvTopLeft(value) {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n this._material.get()!.setUVInfo(value.x, value.y, uvinfo.z, uvinfo.w);\r\n }\r\n get uvBottomRight() {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n return new Vector2(uvinfo.z, uvinfo.w);\r\n }\r\n set uvBottomRight(value) {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n this._material.get()!.setUVInfo(uvinfo.x, uvinfo.y, value.x, value.y);\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isBatchable}\r\n */\r\n isBatchable(): this is BatchDrawable {\r\n return this._batchable && !!this._material.get() && this._material.get()!.isBatchable();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this.material?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return !this.material?.supportLighting();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this.material?.needSceneColor();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.needSceneDepth();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.draw}\r\n */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>, hash?: string) {\r\n const material = this.material;\r\n const primitive = this.getPrimitive();\r\n if (material && primitive) {\r\n if (this._useRenderBundle && !ctx.instanceData && hash) {\r\n if (this._materialChangeTag !== material.changeTag) {\r\n this._renderBundle = {};\r\n this._materialChangeTag = material.changeTag;\r\n }\r\n const renderBundle = this._renderBundle[hash];\r\n if (!renderBundle) {\r\n ctx.device.beginCapture();\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n this._renderBundle[hash] = ctx.device.endCapture();\r\n } else {\r\n ctx.device.executeRenderBundle(renderBundle);\r\n }\r\n } else {\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this.material;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n let primitive = BaseSprite._primitive.get();\r\n if (!primitive) {\r\n primitive = new Primitive();\r\n primitive.createAndSetVertexBuffer('position_f32', new Float32Array([0, 1, 2, 3]));\r\n primitive.createAndSetIndexBuffer(new Uint16Array([0, 1, 2, 3]));\r\n primitive.primitiveType = 'triangle-strip';\r\n BaseSprite._primitive.set(primitive);\r\n }\r\n return primitive;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getBoneMatrices}\r\n */\r\n getBoneMatrices() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getNode}\r\n */\r\n getNode() {\r\n // mesh transform should be ignored when skinned\r\n return this;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeBoundingVolume}\r\n */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeWorldBoundingVolume}\r\n */\r\n computeWorldBoundingVolume() {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const scaleX = Math.hypot(this.worldMatrix[0], this.worldMatrix[1], this.worldMatrix[2]);\r\n const scaleY = Math.hypot(this.worldMatrix[4], this.worldMatrix[5], this.worldMatrix[6]);\r\n const mat = this._material?.get();\r\n if (mat) {\r\n const boundingBox = new BoundingBox();\r\n const cx = Math.max(Math.abs(this._anchor.x), Math.abs(1 - this._anchor.x)) * scaleX;\r\n const cy = Math.max(Math.abs(this._anchor.y), Math.abs(1 - this._anchor.y)) * scaleY;\r\n const size = Math.max(cx, cy);\r\n boundingBox.minPoint.setXYZ(p.x - size, p.y - size, p.z - size);\r\n boundingBox.maxPoint.setXYZ(p.x + size, p.y + size, p.z + size);\r\n return boundingBox;\r\n }\r\n return null;\r\n }\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n const rot = this.rotation.toEulerAngles().z;\r\n const rotationZ = Quaternion.fromAxisAngle(Vector3.axisPZ(), rot);\r\n outMatrix.compose(this._scaling, rotationZ, this._position);\r\n if (this._material?.get()) {\r\n this._rotateAngle = -rot;\r\n this._material.get()!.rotation = this._rotateAngle;\r\n }\r\n\r\n //outMatrix.scaling(this.scale).translateLeft(this._position);\r\n }\r\n calculateWorldTransform(outMatrix: Matrix4x4) {\r\n outMatrix.set(this.localMatrix);\r\n if (this.parent) {\r\n outMatrix.m03 += this.parent.worldMatrix.m03;\r\n outMatrix.m13 += this.parent.worldMatrix.m13;\r\n outMatrix.m23 += this.parent.worldMatrix.m23;\r\n }\r\n }\r\n /** Called when new material is set */\r\n protected onSetMaterial(material: M) {\r\n material.anchor = this._anchor;\r\n material.rotation = this._rotateAngle;\r\n }\r\n /** Disposes the mesh node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n}\r\n"],"names":["BaseSprite","applyMixins","GraphNode","mixinDrawable","_primitive","DRef","scene","_material","_instanceHash","_pickTarget","node","_batchable","getDevice","type","_anchor","Vector2","_rotateAngle","_renderBundle","_useRenderBundle","_materialChangeTag","getInstanceId","_renderPass","worldMatrixDet","getInstanceUniforms","get","$instanceUniforms","getPickTarget","setPickTarget","label","material","m","SpriteMaterial","set","onSetMaterial","RenderBundleWrapper","materialAttached","coreMaterial","name","_scene","id","instanceId","drawableChanged","anchorX","x","value","invalidateWorldBoundingVolume","anchorY","y","uvTopLeft","uvinfo","setUVInfo","z","w","uvBottomRight","getMorphData","getMorphInfo","isBatchable","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","draw","ctx","renderQueue","hash","primitive","getPrimitive","instanceData","changeTag","renderBundle","device","beginCapture","bind","endCapture","executeRenderBundle","getMaterial","Primitive","createAndSetVertexBuffer","Float32Array","createAndSetIndexBuffer","Uint16Array","primitiveType","getBoneMatrices","getNode","computeBoundingVolume","computeWorldBoundingVolume","p","worldMatrix","transformPointAffine","Vector3","zero","scaleX","Math","hypot","scaleY","mat","boundingBox","BoundingBox","cx","max","abs","cy","size","minPoint","setXYZ","maxPoint","calculateLocalTransform","outMatrix","rot","rotation","toEulerAngles","rotationZ","Quaternion","fromAxisAngle","axisPZ","compose","_scaling","_position","calculateWorldTransform","localMatrix","parent","m03","m13","m23","anchor","onDispose","dispose"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA;;;AAGC,IACM,MAAMA,UACHC,SAAAA,WAAAA,CAAYC,SAAWC,EAAAA,aAAAA,CAAAA,CAAAA;AAG/B,qBACA,OAAeC,UAA8B,GAAA,IAAIC,IAAO,EAAA;qBAExD,SAAsC;qBAEtC,aAA0C;qBAE1C,UAA8B;qBAE9B,WAAkC;qBAElC,aAAsD;qBAEtD,gBAAoC;qBAEpC,kBAA+C;qBAE/C,OAA2B;qBAE3B,YAA+B;AAC/B;;;MAIA,WAAA,CAAYC,KAAY,CAAE;AACxB,QAAA,KAAK,CAACA,KAAAA,CAAAA;QACN,IAAI,CAACC,SAAS,GAAG,IAAIF,IAAAA,EAAAA;QACrB,IAAI,CAACG,aAAa,GAAG,IAAA;QACrB,IAAI,CAACC,WAAW,GAAG;AAAEC,YAAAA,IAAAA,EAAM;AAAK,SAAA;AAChC,QAAA,IAAI,CAACC,UAAU,GAAGC,SAAAA,EAAAA,CAAYC,IAAI,KAAK,OAAA;AACvC,QAAA,IAAI,CAACC,OAAO,GAAG,IAAIC,QAAQ,GAAK,EAAA,GAAA,CAAA;QAChC,IAAI,CAACC,YAAY,GAAG,CAAA;QACpB,IAAI,CAACC,aAAa,GAAG,EAAC;QACtB,IAAI,CAACC,gBAAgB,GAAG,IAAA;QACxB,IAAI,CAACC,kBAAkB,GAAG,IAAA;AAC5B;AACA;;MAGAC,aAAAA,CAAcC,WAAuB,EAAE;QACrC,OAAO,CAAA,EAAG,IAAI,CAACb,aAAa,CAAC,CAAC,EAAE,IAAI,CAACc,cAAc,IAAI,CAAG,CAAA,CAAA;AAC5D;AACA;;AAEC,MACDC,mBAAsB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAChB,SAAS,CAACiB,GAAG,GAAIC,iBAAiB;AAChD;AACA;;AAEC,MACDC,aAAgB,GAAA;QACd,OAAO,IAAI,CAACjB,WAAW;AACzB;IACAkB,aAAcjB,CAAAA,IAAe,EAAEkB,KAAc,EAAE;QAC7C,IAAI,CAACnB,WAAW,GAAG;AAAEC,YAAAA,IAAAA;AAAMkB,YAAAA;AAAM,SAAA;AACnC;gCAEA,IAAIC,QAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAACtB,SAAS,CAACiB,GAAG,EAAA;AAC3B;IACA,IAAIK,QAAAA,CAASC,CAAC,EAAE;QACd,IAAI,IAAI,CAACvB,SAAS,CAACiB,GAAG,EAAOM,KAAAA,CAAAA,IAAKA,aAAaC,cAAgB,EAAA;AAC7D,YAAA,IAAI,CAACxB,SAAS,CAACyB,GAAG,CAACF,CAAAA,CAAAA;AACnB,YAAA,IAAIA,CAAG,EAAA;gBACL,IAAI,CAACG,aAAa,CAACH,CAAAA,CAAAA;AACnBI,gBAAAA,mBAAAA,CAAoBC,gBAAgB,CAACL,CAAEM,CAAAA,YAAY,EAAE,IAAI,CAAA;AAC3D;YACA,IAAI,CAAC5B,aAAa,GAAGsB,CAAI,GAAA,CAAA,EAAG,IAAI,CAAC,WAAW,CAACO,IAAI,CAAC,CAAC,EAAE,IAAI,CAACC,MAAM,EAAEC,EAAM,IAAA,CAAA,CAAE,CAAC,EAAET,CAAAA,CAAEU,UAAU,CAAA,CAAE,GAAG,IAAA;YAC9FN,mBAAoBO,CAAAA,eAAe,CAAC,IAAI,CAAA;YACxC,IAAI,CAACtB,kBAAkB,GAAG,IAAA;AAC5B;AACF;AACA,IAAA,IAAIuB,OAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC5B,OAAO,CAAC6B,CAAC;AACvB;IACA,IAAID,OAAAA,CAAQE,KAAK,EAAE;AACjB,QAAA,IAAI,IAAI,CAAC9B,OAAO,CAAC6B,CAAC,KAAKC,KAAO,EAAA;AAC5B,YAAA,IAAI,CAAC9B,OAAO,CAAC6B,CAAC,GAAGC,KAAAA;YACjB,IAAI,CAACC,6BAA6B,CAAC,KAAA,CAAA;AACnC,YAAA,MAAMhB,QAAW,GAAA,IAAI,CAACtB,SAAS,CAACiB,GAAG,EAAA;AACnC,YAAA,IAAIK,QAAU,EAAA;AACZA,gBAAAA,QAAAA,CAASa,OAAO,GAAG,IAAI,CAAC5B,OAAO,CAAC6B,CAAC;AACnC;AACF;AACF;AACA,IAAA,IAAIG,OAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAChC,OAAO,CAACiC,CAAC;AACvB;IACA,IAAID,OAAAA,CAAQF,KAAK,EAAE;AACjB,QAAA,IAAI,IAAI,CAAC9B,OAAO,CAACiC,CAAC,KAAKH,KAAO,EAAA;AAC5B,YAAA,IAAI,CAAC9B,OAAO,CAACiC,CAAC,GAAGH,KAAAA;YACjB,IAAI,CAACC,6BAA6B,CAAC,KAAA,CAAA;AACnC,YAAA,MAAMhB,QAAW,GAAA,IAAI,CAACtB,SAAS,CAACiB,GAAG,EAAA;AACnC,YAAA,IAAIK,QAAU,EAAA;AACZA,gBAAAA,QAAAA,CAASiB,OAAO,GAAG,IAAI,CAAChC,OAAO,CAACiC,CAAC;AACnC;AACF;AACF;AACA,IAAA,IAAIC,SAAY,GAAA;AACd,QAAA,MAAMC,SAAS,IAAI,CAAC1C,SAAS,CAACiB,GAAG,GAAIyB,MAAM;AAC3C,QAAA,OAAO,IAAIlC,OAAQkC,CAAAA,MAAAA,CAAON,CAAC,EAAEM,OAAOF,CAAC,CAAA;AACvC;IACA,IAAIC,SAAAA,CAAUJ,KAAK,EAAE;AACnB,QAAA,MAAMK,SAAS,IAAI,CAAC1C,SAAS,CAACiB,GAAG,GAAIyB,MAAM;AAC3C,QAAA,IAAI,CAAC1C,SAAS,CAACiB,GAAG,EAAA,CAAI0B,SAAS,CAACN,KAAAA,CAAMD,CAAC,EAAEC,MAAMG,CAAC,EAAEE,OAAOE,CAAC,EAAEF,OAAOG,CAAC,CAAA;AACtE;AACA,IAAA,IAAIC,aAAgB,GAAA;AAClB,QAAA,MAAMJ,SAAS,IAAI,CAAC1C,SAAS,CAACiB,GAAG,GAAIyB,MAAM;AAC3C,QAAA,OAAO,IAAIlC,OAAQkC,CAAAA,MAAAA,CAAOE,CAAC,EAAEF,OAAOG,CAAC,CAAA;AACvC;IACA,IAAIC,aAAAA,CAAcT,KAAK,EAAE;AACvB,QAAA,MAAMK,SAAS,IAAI,CAAC1C,SAAS,CAACiB,GAAG,GAAIyB,MAAM;AAC3C,QAAA,IAAI,CAAC1C,SAAS,CAACiB,GAAG,EAAA,CAAI0B,SAAS,CAACD,MAAAA,CAAON,CAAC,EAAEM,OAAOF,CAAC,EAAEH,MAAMD,CAAC,EAAEC,MAAMG,CAAC,CAAA;AACtE;AACA;;AAEC,MACDO,YAAe,GAAA;QACb,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,YAAe,GAAA;QACb,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,WAAqC,GAAA;AACnC,QAAA,OAAO,IAAI,CAAC7C,UAAU,IAAI,CAAC,CAAC,IAAI,CAACJ,SAAS,CAACiB,GAAG,MAAM,IAAI,CAACjB,SAAS,CAACiB,GAAG,GAAIgC,WAAW,EAAA;AACvF;AACA;;AAEC,MACDC,YAAe,GAAA;AACb,QAAA,OAAO,IAAI,CAAC5B,QAAQ,EAAE4B,YAAkBC,EAAAA,IAAAA,YAAAA;AAC1C;AACA;;AAEC,MACDC,OAAU,GAAA;AACR,QAAA,OAAO,CAAC,IAAI,CAAC9B,QAAQ,EAAE+B,eAAAA,EAAAA;AACzB;AACA;;AAEC,MACDC,cAAiB,GAAA;QACf,OAAO,IAAI,CAAChC,QAAQ,EAAEgC,cAAAA,EAAAA;AACxB;AACA;;AAEC,MACDC,cAAiB,GAAA;QACf,OAAO,IAAI,CAACjC,QAAQ,EAAEiC,cAAAA,EAAAA;AACxB;AACA;;AAEC,MACDC,KAAKC,GAAgB,EAAEC,WAAkC,EAAEC,IAAa,EAAE;QACxE,MAAMrC,QAAAA,GAAW,IAAI,CAACA,QAAQ;QAC9B,MAAMsC,SAAAA,GAAY,IAAI,CAACC,YAAY,EAAA;AACnC,QAAA,IAAIvC,YAAYsC,SAAW,EAAA;YACzB,IAAI,IAAI,CAACjD,gBAAgB,IAAI,CAAC8C,GAAIK,CAAAA,YAAY,IAAIH,IAAM,EAAA;AACtD,gBAAA,IAAI,IAAI,CAAC/C,kBAAkB,KAAKU,QAAAA,CAASyC,SAAS,EAAE;oBAClD,IAAI,CAACrD,aAAa,GAAG,EAAC;AACtB,oBAAA,IAAI,CAACE,kBAAkB,GAAGU,QAAAA,CAASyC,SAAS;AAC9C;AACA,gBAAA,MAAMC,YAAe,GAAA,IAAI,CAACtD,aAAa,CAACiD,IAAK,CAAA;AAC7C,gBAAA,IAAI,CAACK,YAAc,EAAA;oBACjBP,GAAIQ,CAAAA,MAAM,CAACC,YAAY,EAAA;oBACvB,IAAI,CAACC,IAAI,CAACV,GAAKC,EAAAA,WAAAA,CAAAA;oBACfpC,QAASkC,CAAAA,IAAI,CAACI,SAAWH,EAAAA,GAAAA,CAAAA;oBACzB,IAAI,CAAC/C,aAAa,CAACiD,IAAAA,CAAK,GAAGF,GAAIQ,CAAAA,MAAM,CAACG,UAAU,EAAA;iBAC3C,MAAA;oBACLX,GAAIQ,CAAAA,MAAM,CAACI,mBAAmB,CAACL,YAAAA,CAAAA;AACjC;aACK,MAAA;gBACL,IAAI,CAACG,IAAI,CAACV,GAAKC,EAAAA,WAAAA,CAAAA;gBACfpC,QAASkC,CAAAA,IAAI,CAACI,SAAWH,EAAAA,GAAAA,CAAAA;AAC3B;AACF;AACF;AACA;;AAEC,MACDa,WAAc,GAAA;QACZ,OAAO,IAAI,CAAChD,QAAQ;AACtB;AACA;;AAEC,MACDuC,YAAe,GAAA;AACb,QAAA,IAAID,SAAYnE,GAAAA,UAAAA,CAAWI,UAAU,CAACoB,GAAG,EAAA;AACzC,QAAA,IAAI,CAAC2C,SAAW,EAAA;AACdA,YAAAA,SAAAA,GAAY,IAAIW,SAAAA,EAAAA;AAChBX,YAAAA,SAAAA,CAAUY,wBAAwB,CAAC,cAAgB,EAAA,IAAIC,YAAa,CAAA;AAAC,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA;AAAE,aAAA,CAAA,CAAA;YAChFb,SAAUc,CAAAA,uBAAuB,CAAC,IAAIC,WAAY,CAAA;AAAC,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA;AAAE,aAAA,CAAA,CAAA;AAC9Df,YAAAA,SAAAA,CAAUgB,aAAa,GAAG,gBAAA;YAC1BnF,UAAWI,CAAAA,UAAU,CAAC4B,GAAG,CAACmC,SAAAA,CAAAA;AAC5B;QACA,OAAOA,SAAAA;AACT;AACA;;AAEC,MACDiB,eAAkB,GAAA;QAChB,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,OAAU,GAAA;;AAER,QAAA,OAAO,IAAI;AACb;AACA;;AAEC,MACDC,qBAAwB,GAAA;QACtB,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,0BAA6B,GAAA;QAC3B,MAAMC,CAAAA,GAAI,IAAI,CAACC,WAAW,CAACC,oBAAoB,CAACC,QAAQC,IAAI,EAAA,CAAA;QAC5D,MAAMC,MAAAA,GAASC,KAAKC,KAAK,CAAC,IAAI,CAACN,WAAW,CAAC,CAAE,CAAA,EAAE,IAAI,CAACA,WAAW,CAAC,CAAE,CAAA,EAAE,IAAI,CAACA,WAAW,CAAC,CAAE,CAAA,CAAA;QACvF,MAAMO,MAAAA,GAASF,KAAKC,KAAK,CAAC,IAAI,CAACN,WAAW,CAAC,CAAE,CAAA,EAAE,IAAI,CAACA,WAAW,CAAC,CAAE,CAAA,EAAE,IAAI,CAACA,WAAW,CAAC,CAAE,CAAA,CAAA;AACvF,QAAA,MAAMQ,GAAM,GAAA,IAAI,CAAC1F,SAAS,EAAEiB,GAAAA,EAAAA;AAC5B,QAAA,IAAIyE,GAAK,EAAA;AACP,YAAA,MAAMC,cAAc,IAAIC,WAAAA,EAAAA;YACxB,MAAMC,EAAAA,GAAKN,KAAKO,GAAG,CAACP,KAAKQ,GAAG,CAAC,IAAI,CAACxF,OAAO,CAAC6B,CAAC,CAAGmD,EAAAA,IAAAA,CAAKQ,GAAG,CAAC,CAAA,GAAI,IAAI,CAACxF,OAAO,CAAC6B,CAAC,CAAKkD,CAAAA,GAAAA,MAAAA;YAC9E,MAAMU,EAAAA,GAAKT,KAAKO,GAAG,CAACP,KAAKQ,GAAG,CAAC,IAAI,CAACxF,OAAO,CAACiC,CAAC,CAAG+C,EAAAA,IAAAA,CAAKQ,GAAG,CAAC,CAAA,GAAI,IAAI,CAACxF,OAAO,CAACiC,CAAC,CAAKiD,CAAAA,GAAAA,MAAAA;AAC9E,YAAA,MAAMQ,IAAOV,GAAAA,IAAAA,CAAKO,GAAG,CAACD,EAAIG,EAAAA,EAAAA,CAAAA;AAC1BL,YAAAA,WAAAA,CAAYO,QAAQ,CAACC,MAAM,CAAClB,EAAE7C,CAAC,GAAG6D,IAAMhB,EAAAA,CAAAA,CAAEzC,CAAC,GAAGyD,IAAMhB,EAAAA,CAAAA,CAAErC,CAAC,GAAGqD,IAAAA,CAAAA;AAC1DN,YAAAA,WAAAA,CAAYS,QAAQ,CAACD,MAAM,CAAClB,EAAE7C,CAAC,GAAG6D,IAAMhB,EAAAA,CAAAA,CAAEzC,CAAC,GAAGyD,IAAMhB,EAAAA,CAAAA,CAAErC,CAAC,GAAGqD,IAAAA,CAAAA;YAC1D,OAAON,WAAAA;AACT;QACA,OAAO,IAAA;AACT;AACAU,IAAAA,uBAAAA,CAAwBC,SAAoB,EAAE;AAC5C,QAAA,MAAMC,MAAM,IAAI,CAACC,QAAQ,CAACC,aAAa,GAAG7D,CAAC;AAC3C,QAAA,MAAM8D,YAAYC,UAAWC,CAAAA,aAAa,CAACxB,OAAAA,CAAQyB,MAAM,EAAIN,EAAAA,GAAAA,CAAAA;QAC7DD,SAAUQ,CAAAA,OAAO,CAAC,IAAI,CAACC,QAAQ,EAAEL,SAAAA,EAAW,IAAI,CAACM,SAAS,CAAA;AAC1D,QAAA,IAAI,IAAI,CAAChH,SAAS,EAAEiB,GAAO,EAAA,EAAA;YACzB,IAAI,CAACR,YAAY,GAAG,CAAC8F,GAAAA;YACrB,IAAI,CAACvG,SAAS,CAACiB,GAAG,GAAIuF,QAAQ,GAAG,IAAI,CAAC/F,YAAY;AACpD;;AAGF;AACAwG,IAAAA,uBAAAA,CAAwBX,SAAoB,EAAE;AAC5CA,QAAAA,SAAAA,CAAU7E,GAAG,CAAC,IAAI,CAACyF,WAAW,CAAA;QAC9B,IAAI,IAAI,CAACC,MAAM,EAAE;YACfb,SAAUc,CAAAA,GAAG,IAAI,IAAI,CAACD,MAAM,CAACjC,WAAW,CAACkC,GAAG;YAC5Cd,SAAUe,CAAAA,GAAG,IAAI,IAAI,CAACF,MAAM,CAACjC,WAAW,CAACmC,GAAG;YAC5Cf,SAAUgB,CAAAA,GAAG,IAAI,IAAI,CAACH,MAAM,CAACjC,WAAW,CAACoC,GAAG;AAC9C;AACF;AACA,2CACU5F,aAAcJ,CAAAA,QAAW,EAAE;AACnCA,QAAAA,QAAAA,CAASiG,MAAM,GAAG,IAAI,CAAChH,OAAO;AAC9Be,QAAAA,QAAAA,CAASkF,QAAQ,GAAG,IAAI,CAAC/F,YAAY;AACvC;kCAEA,SAAsB,GAAA;AACpB,QAAA,KAAK,CAAC+G,SAAAA,EAAAA;QACN,IAAI,CAACxH,SAAS,CAACyH,OAAO,EAAA;QACtB9F,mBAAoBO,CAAAA,eAAe,CAAC,IAAI,CAAA;AAC1C;AACF;;;;"}
|
package/dist/scene/batchgroup.js
CHANGED
|
@@ -25,6 +25,7 @@ import '../render/rendergraph/forward_plus_builder.js';
|
|
|
25
25
|
import '../render/lightpass.js';
|
|
26
26
|
import '../render/sky.js';
|
|
27
27
|
import '../render/clipmap.js';
|
|
28
|
+
import '../render/dualdepthpeeling_oit.js';
|
|
28
29
|
import '../shaders/atmosphere.js';
|
|
29
30
|
import { BoundingBox } from '../utility/bounding_volume.js';
|
|
30
31
|
|