@onerjs/core 8.32.7 → 8.32.9
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/Audio/sound.js +0 -1
- package/Audio/sound.js.map +1 -1
- package/AudioV2/abstractAudio/abstractSoundSource.js +12 -4
- package/AudioV2/abstractAudio/abstractSoundSource.js.map +1 -1
- package/AudioV2/webAudio/webAudioStaticSound.js +10 -3
- package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
- package/Engines/Extensions/engine.prefilteredCubeTexture.js +1 -1
- package/Engines/Extensions/engine.prefilteredCubeTexture.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/FrameGraph/Node/Blocks/PostProcesses/baseWithPropertiesPostProcessBlock.js +1 -1
- package/FrameGraph/Node/Blocks/PostProcesses/baseWithPropertiesPostProcessBlock.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.d.ts +18 -0
- package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +105 -15
- package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js +7 -7
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js.map +1 -1
- package/FrameGraph/Node/Blocks/Textures/copyTextureBlock.js +1 -1
- package/FrameGraph/Node/Blocks/Textures/copyTextureBlock.js.map +1 -1
- package/FrameGraph/Passes/pass.d.ts +11 -2
- package/FrameGraph/Passes/pass.js +14 -2
- package/FrameGraph/Passes/pass.js.map +1 -1
- package/FrameGraph/Passes/renderPass.d.ts +4 -2
- package/FrameGraph/Passes/renderPass.js +5 -2
- package/FrameGraph/Passes/renderPass.js.map +1 -1
- package/FrameGraph/Tasks/Layers/baseLayerTask.js +27 -31
- package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +41 -1
- package/FrameGraph/Tasks/Rendering/objectRendererTask.js +122 -0
- package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
- package/FrameGraph/Tasks/Texture/clearTextureTask.js +6 -4
- package/FrameGraph/Tasks/Texture/clearTextureTask.js.map +1 -1
- package/FrameGraph/frameGraph.js +3 -0
- package/FrameGraph/frameGraph.js.map +1 -1
- package/FrameGraph/frameGraphRenderTarget.js +1 -0
- package/FrameGraph/frameGraphRenderTarget.js.map +1 -1
- package/FrameGraph/frameGraphTask.d.ts +2 -0
- package/FrameGraph/frameGraphTask.js +11 -0
- package/FrameGraph/frameGraphTask.js.map +1 -1
- package/FrameGraph/frameGraphTypes.d.ts +8 -0
- package/FrameGraph/frameGraphTypes.js.map +1 -1
- package/Layers/effectLayer.d.ts +1 -1
- package/Layers/effectLayer.js.map +1 -1
- package/Layers/glowLayer.js +2 -0
- package/Layers/glowLayer.js.map +1 -1
- package/Layers/highlightLayer.js +2 -0
- package/Layers/highlightLayer.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +9 -0
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +66 -22
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
- package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js +3 -6
- package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js.map +1 -1
- package/Materials/materialHelper.functions.js +2 -8
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Materials/shaderMaterial.js +2 -2
- package/Materials/shaderMaterial.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +16 -6
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +37 -33
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Misc/snapshotRenderingHelper.js +10 -0
- package/Misc/snapshotRenderingHelper.js.map +1 -1
- package/Rendering/depthPeelingRenderer.d.ts +7 -78
- package/Rendering/depthPeelingRenderer.js +12 -398
- package/Rendering/depthPeelingRenderer.js.map +1 -1
- package/Rendering/depthPeelingSceneComponent.d.ts +3 -3
- package/Rendering/depthPeelingSceneComponent.js.map +1 -1
- package/Rendering/depthRenderer.js +9 -1
- package/Rendering/depthRenderer.js.map +1 -1
- package/Rendering/index.d.ts +1 -0
- package/Rendering/index.js +1 -0
- package/Rendering/index.js.map +1 -1
- package/Rendering/objectRenderer.d.ts +20 -0
- package/Rendering/objectRenderer.js +17 -1
- package/Rendering/objectRenderer.js.map +1 -1
- package/Rendering/renderingGroup.d.ts +10 -3
- package/Rendering/renderingGroup.js +24 -13
- package/Rendering/renderingGroup.js.map +1 -1
- package/Rendering/renderingManager.d.ts +6 -2
- package/Rendering/renderingManager.js +8 -2
- package/Rendering/renderingManager.js.map +1 -1
- package/Rendering/thinDepthPeelingRenderer.d.ts +120 -0
- package/Rendering/thinDepthPeelingRenderer.js +469 -0
- package/Rendering/thinDepthPeelingRenderer.js.map +1 -0
- package/Shaders/ShadersInclude/gaussianSplatting.js +1 -1
- package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/Shaders/gaussianSplatting.vertex.js +2 -2
- package/Shaders/gaussianSplatting.vertex.js.map +1 -1
- package/Shaders/gaussianSplattingDepth.fragment.js +9 -2
- package/Shaders/gaussianSplattingDepth.fragment.js.map +1 -1
- package/Shaders/gaussianSplattingDepth.vertex.js +13 -2
- package/Shaders/gaussianSplattingDepth.vertex.js.map +1 -1
- package/Shaders/oitFinalSimpleBlend.fragment.d.ts +5 -0
- package/Shaders/oitFinalSimpleBlend.fragment.js +12 -0
- package/Shaders/oitFinalSimpleBlend.fragment.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +1 -5
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js +2 -2
- package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
- package/ShadersWGSL/gaussianSplattingDepth.fragment.js +12 -3
- package/ShadersWGSL/gaussianSplattingDepth.fragment.js.map +1 -1
- package/ShadersWGSL/gaussianSplattingDepth.vertex.js +13 -2
- package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -1
- package/ShadersWGSL/iblVoxelGrid.vertex.d.ts +1 -0
- package/ShadersWGSL/iblVoxelGrid.vertex.js +15 -8
- package/ShadersWGSL/iblVoxelGrid.vertex.js.map +1 -1
- package/ShadersWGSL/oitFinalSimpleBlend.fragment.d.ts +5 -0
- package/ShadersWGSL/oitFinalSimpleBlend.fragment.js +13 -0
- package/ShadersWGSL/oitFinalSimpleBlend.fragment.js.map +1 -0
- package/node.d.ts +2 -0
- package/node.js +5 -0
- package/node.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Implementation based on https://medium.com/@shrekshao_71662/dual-depth-peeling-implementation-in-webgl-11baa061ba4b
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { MultiRenderTarget } from "../Materials/Textures/multiRenderTarget.js";
|
|
6
|
+
import { Color4 } from "../Maths/math.color.js";
|
|
7
|
+
import { SmartArray } from "../Misc/smartArray.js";
|
|
8
|
+
import { ThinTexture } from "../Materials/Textures/thinTexture.js";
|
|
9
|
+
import { EffectRenderer, EffectWrapper } from "../Materials/effectRenderer.js";
|
|
10
|
+
import { Material } from "../Materials/material.js";
|
|
11
|
+
import "../Engines/Extensions/engine.multiRender.js";
|
|
12
|
+
/**
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export class ThinDepthPeelingRenderer {
|
|
16
|
+
/**
|
|
17
|
+
* Number of depth peeling passes. As we are using dual depth peeling, each pass two levels of transparency are processed.
|
|
18
|
+
*/
|
|
19
|
+
get passCount() {
|
|
20
|
+
return this._passCount;
|
|
21
|
+
}
|
|
22
|
+
set passCount(count) {
|
|
23
|
+
if (this._passCount === count) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
this._passCount = count;
|
|
27
|
+
this._createRenderPassIds();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Instructs the renderer to use render passes. It is an optimization that makes the rendering faster for some engines (like WebGPU) but that consumes more memory, so it is disabled by default.
|
|
31
|
+
*/
|
|
32
|
+
get useRenderPasses() {
|
|
33
|
+
return this._useRenderPasses;
|
|
34
|
+
}
|
|
35
|
+
set useRenderPasses(usePasses) {
|
|
36
|
+
if (this._useRenderPasses === usePasses) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
this._useRenderPasses = usePasses;
|
|
40
|
+
this._createRenderPassIds();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Add a mesh in the exclusion list to prevent it to be handled by the depth peeling renderer
|
|
44
|
+
* @param mesh The mesh to exclude from the depth peeling renderer
|
|
45
|
+
*/
|
|
46
|
+
addExcludedMesh(mesh) {
|
|
47
|
+
if (this._excludedMeshes.indexOf(mesh.uniqueId) === -1) {
|
|
48
|
+
this._excludedMeshes.push(mesh.uniqueId);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Remove a mesh from the exclusion list of the depth peeling renderer
|
|
53
|
+
* @param mesh The mesh to remove
|
|
54
|
+
*/
|
|
55
|
+
removeExcludedMesh(mesh) {
|
|
56
|
+
const index = this._excludedMeshes.indexOf(mesh.uniqueId);
|
|
57
|
+
if (index !== -1) {
|
|
58
|
+
this._excludedMeshes.splice(index, 1);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Gets the shader language used in this renderer
|
|
63
|
+
*/
|
|
64
|
+
get shaderLanguage() {
|
|
65
|
+
return this._shaderLanguage;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Sets the render target wrapper we will blend the transparent objects onto
|
|
69
|
+
*/
|
|
70
|
+
get blendOutput() {
|
|
71
|
+
return this._blendOutput;
|
|
72
|
+
}
|
|
73
|
+
set blendOutput(blendOutput) {
|
|
74
|
+
this._blendOutput = blendOutput;
|
|
75
|
+
this._disposeTextures();
|
|
76
|
+
if (blendOutput) {
|
|
77
|
+
this._createTextures();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Instanciates the depth peeling renderer
|
|
82
|
+
* @param scene Scene to attach to
|
|
83
|
+
* @param passCount Number of depth layers to peel
|
|
84
|
+
* @returns The depth peeling renderer
|
|
85
|
+
*/
|
|
86
|
+
constructor(scene, passCount = 5) {
|
|
87
|
+
this._depthMrts = [];
|
|
88
|
+
this._thinTextures = [];
|
|
89
|
+
this._colorMrts = [];
|
|
90
|
+
this._currentPingPongState = 0;
|
|
91
|
+
this._layoutCacheFormat = [[true], [true, true], [true, true, true]];
|
|
92
|
+
this._layoutCache = [];
|
|
93
|
+
this._candidateSubMeshes = new SmartArray(10);
|
|
94
|
+
this._excludedSubMeshes = new SmartArray(10);
|
|
95
|
+
this._excludedMeshes = [];
|
|
96
|
+
this._colorCache = [
|
|
97
|
+
new Color4(ThinDepthPeelingRenderer._DEPTH_CLEAR_VALUE, ThinDepthPeelingRenderer._DEPTH_CLEAR_VALUE, 0, 0),
|
|
98
|
+
new Color4(-ThinDepthPeelingRenderer._MIN_DEPTH, ThinDepthPeelingRenderer._MAX_DEPTH, 0, 0),
|
|
99
|
+
new Color4(0, 0, 0, 0),
|
|
100
|
+
];
|
|
101
|
+
/** Shader language used by the renderer */
|
|
102
|
+
this._shaderLanguage = 0 /* ShaderLanguage.GLSL */;
|
|
103
|
+
this._scene = scene;
|
|
104
|
+
this._engine = scene.getEngine();
|
|
105
|
+
this._passCount = passCount;
|
|
106
|
+
for (let i = 0; i < this._layoutCacheFormat.length; ++i) {
|
|
107
|
+
this._layoutCache[i] = this._engine.buildTextureLayout(this._layoutCacheFormat[i]);
|
|
108
|
+
}
|
|
109
|
+
this._renderPassIds = [];
|
|
110
|
+
this.useRenderPasses = false;
|
|
111
|
+
if (this._engine.isWebGPU) {
|
|
112
|
+
this._shaderLanguage = 1 /* ShaderLanguage.WGSL */;
|
|
113
|
+
}
|
|
114
|
+
this._createEffects("oitFinalSimpleBlend", ["uFrontColor"]);
|
|
115
|
+
}
|
|
116
|
+
_createRenderPassIds() {
|
|
117
|
+
this._releaseRenderPassIds();
|
|
118
|
+
if (this._useRenderPasses) {
|
|
119
|
+
for (let i = 0; i < this._passCount + 1; ++i) {
|
|
120
|
+
if (!this._renderPassIds[i]) {
|
|
121
|
+
this._renderPassIds[i] = this._engine.createRenderPassId(`DepthPeelingRenderer - pass #${i}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
_releaseRenderPassIds() {
|
|
127
|
+
for (let i = 0; i < this._renderPassIds.length; ++i) {
|
|
128
|
+
this._engine.releaseRenderPassId(this._renderPassIds[i]);
|
|
129
|
+
}
|
|
130
|
+
this._renderPassIds = [];
|
|
131
|
+
}
|
|
132
|
+
_getTextureSize() {
|
|
133
|
+
if (this._blendOutput) {
|
|
134
|
+
return {
|
|
135
|
+
width: this._blendOutput.width,
|
|
136
|
+
height: this._blendOutput.height,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() };
|
|
140
|
+
}
|
|
141
|
+
_createTextures() {
|
|
142
|
+
const size = this._getTextureSize();
|
|
143
|
+
// 2 for ping pong
|
|
144
|
+
this._depthMrts = [
|
|
145
|
+
new MultiRenderTarget("depthPeelingDepth0MRT", size, 3, this._scene, undefined, [
|
|
146
|
+
"depthPeelingDepth0MRT_depth",
|
|
147
|
+
"depthPeelingDepth0MRT_frontColor",
|
|
148
|
+
"depthPeelingDepth0MRT_backColor",
|
|
149
|
+
]),
|
|
150
|
+
new MultiRenderTarget("depthPeelingDepth1MRT", size, 3, this._scene, undefined, [
|
|
151
|
+
"depthPeelingDepth1MRT_depth",
|
|
152
|
+
"depthPeelingDepth1MRT_frontColor",
|
|
153
|
+
"depthPeelingDepth1MRT_backColor",
|
|
154
|
+
]),
|
|
155
|
+
];
|
|
156
|
+
this._colorMrts = [
|
|
157
|
+
new MultiRenderTarget("depthPeelingColor0MRT", size, 2, this._scene, { generateDepthBuffer: false }, [
|
|
158
|
+
"depthPeelingColor0MRT_frontColor",
|
|
159
|
+
"depthPeelingColor0MRT_backColor",
|
|
160
|
+
]),
|
|
161
|
+
new MultiRenderTarget("depthPeelingColor1MRT", size, 2, this._scene, { generateDepthBuffer: false }, [
|
|
162
|
+
"depthPeelingColor1MRT_frontColor",
|
|
163
|
+
"depthPeelingColor1MRT_backColor",
|
|
164
|
+
]),
|
|
165
|
+
];
|
|
166
|
+
this._blendBackMrt = new MultiRenderTarget("depthPeelingBackMRT", size, 1, this._scene, { generateDepthBuffer: false }, ["depthPeelingBackMRT_blendBack"]);
|
|
167
|
+
if (this._blendOutput) {
|
|
168
|
+
this._blendBackMrt.setInternalTexture(this._blendOutput.texture, 0);
|
|
169
|
+
}
|
|
170
|
+
// 0 is a depth texture
|
|
171
|
+
// 1 is a color texture
|
|
172
|
+
const optionsArray = [
|
|
173
|
+
{
|
|
174
|
+
format: 7,
|
|
175
|
+
samplingMode: 1,
|
|
176
|
+
type: this._engine.getCaps().textureFloatLinearFiltering ? 1 : 2,
|
|
177
|
+
label: "DepthPeelingRenderer-DepthTexture",
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
format: 5,
|
|
181
|
+
samplingMode: 1,
|
|
182
|
+
type: 2,
|
|
183
|
+
label: "DepthPeelingRenderer-ColorTexture",
|
|
184
|
+
},
|
|
185
|
+
];
|
|
186
|
+
for (let i = 0; i < 2; i++) {
|
|
187
|
+
const depthTexture = this._engine._createInternalTexture(size, optionsArray[0], false);
|
|
188
|
+
const frontColorTexture = this._engine._createInternalTexture(size, optionsArray[1], false);
|
|
189
|
+
const backColorTexture = this._engine._createInternalTexture(size, optionsArray[1], false);
|
|
190
|
+
this._depthMrts[i].setInternalTexture(depthTexture, 0);
|
|
191
|
+
this._depthMrts[i].setInternalTexture(frontColorTexture, 1);
|
|
192
|
+
this._depthMrts[i].setInternalTexture(backColorTexture, 2);
|
|
193
|
+
this._colorMrts[i].setInternalTexture(frontColorTexture, 0);
|
|
194
|
+
this._colorMrts[i].setInternalTexture(backColorTexture, 1);
|
|
195
|
+
this._thinTextures.push(new ThinTexture(depthTexture), new ThinTexture(frontColorTexture), new ThinTexture(backColorTexture));
|
|
196
|
+
}
|
|
197
|
+
if (this._blendOutput) {
|
|
198
|
+
this._blendOutput.shareDepth(this._depthMrts[0].renderTarget);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
_disposeTextures() {
|
|
202
|
+
for (let i = 0; i < this._thinTextures.length; i++) {
|
|
203
|
+
this._thinTextures[i].dispose();
|
|
204
|
+
}
|
|
205
|
+
for (let i = 0; i < this._depthMrts.length; i++) {
|
|
206
|
+
this._depthMrts[i].dispose(true);
|
|
207
|
+
this._colorMrts[i].dispose(true);
|
|
208
|
+
this._blendBackMrt.dispose(true);
|
|
209
|
+
}
|
|
210
|
+
this._thinTextures = [];
|
|
211
|
+
this._colorMrts = [];
|
|
212
|
+
this._depthMrts = [];
|
|
213
|
+
}
|
|
214
|
+
_createEffects(finalEffectFragmentShaderName, finalEffectSamplerNames) {
|
|
215
|
+
this._blendBackEffectWrapper = new EffectWrapper({
|
|
216
|
+
fragmentShader: "oitBackBlend",
|
|
217
|
+
useShaderStore: true,
|
|
218
|
+
engine: this._engine,
|
|
219
|
+
samplerNames: ["uBackColor"],
|
|
220
|
+
uniformNames: [],
|
|
221
|
+
shaderLanguage: this._shaderLanguage,
|
|
222
|
+
extraInitializationsAsync: async () => {
|
|
223
|
+
if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
|
|
224
|
+
await import("../ShadersWGSL/oitBackBlend.fragment.js");
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
await import("../Shaders/oitBackBlend.fragment.js");
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
this._blendBackEffectWrapperPingPong = new EffectWrapper({
|
|
232
|
+
fragmentShader: "oitBackBlend",
|
|
233
|
+
useShaderStore: true,
|
|
234
|
+
engine: this._engine,
|
|
235
|
+
samplerNames: ["uBackColor"],
|
|
236
|
+
uniformNames: [],
|
|
237
|
+
shaderLanguage: this._shaderLanguage,
|
|
238
|
+
extraInitializationsAsync: async () => {
|
|
239
|
+
if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
|
|
240
|
+
await import("../ShadersWGSL/oitBackBlend.fragment.js");
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
await import("../Shaders/oitBackBlend.fragment.js");
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
this._finalEffectWrapper = new EffectWrapper({
|
|
248
|
+
fragmentShader: finalEffectFragmentShaderName,
|
|
249
|
+
useShaderStore: true,
|
|
250
|
+
engine: this._engine,
|
|
251
|
+
samplerNames: finalEffectSamplerNames,
|
|
252
|
+
uniformNames: [],
|
|
253
|
+
shaderLanguage: this._shaderLanguage,
|
|
254
|
+
extraInitializationsAsync: async () => {
|
|
255
|
+
if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
|
|
256
|
+
await import("../ShadersWGSL/oitFinalSimpleBlend.fragment.js");
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
await import("../Shaders/oitFinalSimpleBlend.fragment.js");
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
this._effectRenderer = new EffectRenderer(this._engine);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Links to the prepass renderer
|
|
267
|
+
* @param _prePassRenderer The scene PrePassRenderer
|
|
268
|
+
*/
|
|
269
|
+
setPrePassRenderer(_prePassRenderer) { }
|
|
270
|
+
/**
|
|
271
|
+
* Binds depth peeling textures on an effect
|
|
272
|
+
* @param effect The effect to bind textures on
|
|
273
|
+
*/
|
|
274
|
+
bind(effect) {
|
|
275
|
+
effect.setTexture("oitDepthSampler", this._thinTextures[this._currentPingPongState * 3]);
|
|
276
|
+
effect.setTexture("oitFrontColorSampler", this._thinTextures[this._currentPingPongState * 3 + 1]);
|
|
277
|
+
}
|
|
278
|
+
_renderSubMeshes(transparentSubMeshes) {
|
|
279
|
+
let mapMaterialContext;
|
|
280
|
+
if (this._useRenderPasses) {
|
|
281
|
+
mapMaterialContext = {};
|
|
282
|
+
}
|
|
283
|
+
for (let j = 0; j < transparentSubMeshes.length; j++) {
|
|
284
|
+
const material = transparentSubMeshes.data[j].getMaterial();
|
|
285
|
+
let previousShaderHotSwapping = true;
|
|
286
|
+
let previousBFC = false;
|
|
287
|
+
const subMesh = transparentSubMeshes.data[j];
|
|
288
|
+
let drawWrapper;
|
|
289
|
+
let firstDraw = false;
|
|
290
|
+
if (this._useRenderPasses) {
|
|
291
|
+
drawWrapper = subMesh._getDrawWrapper();
|
|
292
|
+
firstDraw = !drawWrapper;
|
|
293
|
+
}
|
|
294
|
+
if (material) {
|
|
295
|
+
previousShaderHotSwapping = material.allowShaderHotSwapping;
|
|
296
|
+
previousBFC = material.backFaceCulling;
|
|
297
|
+
material.allowShaderHotSwapping = false;
|
|
298
|
+
material.backFaceCulling = false;
|
|
299
|
+
}
|
|
300
|
+
subMesh.render(false);
|
|
301
|
+
if (firstDraw) {
|
|
302
|
+
// first time we draw this submesh: we replace the material context
|
|
303
|
+
drawWrapper = subMesh._getDrawWrapper(); // we are sure it is now non empty as we just rendered the submesh
|
|
304
|
+
if (drawWrapper.materialContext) {
|
|
305
|
+
let newMaterialContext = mapMaterialContext[drawWrapper.materialContext.uniqueId];
|
|
306
|
+
if (!newMaterialContext) {
|
|
307
|
+
newMaterialContext = mapMaterialContext[drawWrapper.materialContext.uniqueId] = this._engine.createMaterialContext();
|
|
308
|
+
}
|
|
309
|
+
subMesh._getDrawWrapper().materialContext = newMaterialContext;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
if (material) {
|
|
313
|
+
material.allowShaderHotSwapping = previousShaderHotSwapping;
|
|
314
|
+
material.backFaceCulling = previousBFC;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
_finalCompose(writeId) {
|
|
319
|
+
this._engine.bindFramebuffer(this._blendOutput);
|
|
320
|
+
this._engine.setAlphaMode(7);
|
|
321
|
+
this._engine.depthCullingState.depthMask = false;
|
|
322
|
+
this._engine.depthCullingState.depthTest = false;
|
|
323
|
+
this._engine.applyStates();
|
|
324
|
+
this._engine.enableEffect(this._finalEffectWrapper.drawWrapper);
|
|
325
|
+
this._finalEffectWrapper.effect.setTexture("uFrontColor", this._thinTextures[writeId * 3 + 1]);
|
|
326
|
+
this._effectRenderer.render(this._finalEffectWrapper);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Checks if the depth peeling renderer is ready to render transparent meshes
|
|
330
|
+
* @returns true if the depth peeling renderer is ready to render the transparent meshes
|
|
331
|
+
*/
|
|
332
|
+
isReady() {
|
|
333
|
+
return this._blendBackEffectWrapper.effect.isReady() && this._blendBackEffectWrapperPingPong.effect.isReady() && this._finalEffectWrapper.effect.isReady();
|
|
334
|
+
}
|
|
335
|
+
_beforeRender() { }
|
|
336
|
+
_afterRender() { }
|
|
337
|
+
/**
|
|
338
|
+
* Renders transparent submeshes with depth peeling
|
|
339
|
+
* @param transparentSubMeshes List of transparent meshes to render
|
|
340
|
+
* @returns The array of submeshes that could not be handled by this renderer
|
|
341
|
+
*/
|
|
342
|
+
render(transparentSubMeshes) {
|
|
343
|
+
this._candidateSubMeshes.length = 0;
|
|
344
|
+
this._excludedSubMeshes.length = 0;
|
|
345
|
+
if (!this.isReady()) {
|
|
346
|
+
return this._excludedSubMeshes;
|
|
347
|
+
}
|
|
348
|
+
if (this._scene.activeCamera) {
|
|
349
|
+
this._engine.setViewport(this._scene.activeCamera.viewport);
|
|
350
|
+
}
|
|
351
|
+
for (let i = 0; i < transparentSubMeshes.length; i++) {
|
|
352
|
+
const subMesh = transparentSubMeshes.data[i];
|
|
353
|
+
const material = subMesh.getMaterial();
|
|
354
|
+
const fillMode = material && subMesh.getRenderingMesh()._getRenderingFillMode(material.fillMode);
|
|
355
|
+
if (material &&
|
|
356
|
+
(fillMode === Material.TriangleFanDrawMode || fillMode === Material.TriangleFillMode || fillMode === Material.TriangleStripDrawMode) &&
|
|
357
|
+
this._excludedMeshes.indexOf(subMesh.getMesh().uniqueId) === -1) {
|
|
358
|
+
this._candidateSubMeshes.push(subMesh);
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
this._excludedSubMeshes.push(subMesh);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (!this._candidateSubMeshes.length) {
|
|
365
|
+
return this._excludedSubMeshes;
|
|
366
|
+
}
|
|
367
|
+
const currentRenderPassId = this._engine.currentRenderPassId;
|
|
368
|
+
this._beforeRender();
|
|
369
|
+
if (this._useRenderPasses) {
|
|
370
|
+
this._engine.currentRenderPassId = this._renderPassIds[0];
|
|
371
|
+
}
|
|
372
|
+
// Clears
|
|
373
|
+
this._engine.bindFramebuffer(this._depthMrts[0].renderTarget);
|
|
374
|
+
this._engine.bindAttachments(this._layoutCache[0]);
|
|
375
|
+
this._engine.clear(this._colorCache[0], true, false, false);
|
|
376
|
+
this._engine.unBindFramebuffer(this._depthMrts[0].renderTarget);
|
|
377
|
+
this._engine.bindFramebuffer(this._depthMrts[1].renderTarget);
|
|
378
|
+
this._engine.bindAttachments(this._layoutCache[0]);
|
|
379
|
+
this._engine.clear(this._colorCache[1], true, false, false);
|
|
380
|
+
this._engine.unBindFramebuffer(this._depthMrts[1].renderTarget);
|
|
381
|
+
this._engine.bindFramebuffer(this._colorMrts[0].renderTarget);
|
|
382
|
+
this._engine.bindAttachments(this._layoutCache[1]);
|
|
383
|
+
this._engine.clear(this._colorCache[2], true, false, false);
|
|
384
|
+
this._engine.unBindFramebuffer(this._colorMrts[0].renderTarget);
|
|
385
|
+
this._engine.bindFramebuffer(this._colorMrts[1].renderTarget);
|
|
386
|
+
this._engine.bindAttachments(this._layoutCache[1]);
|
|
387
|
+
this._engine.clear(this._colorCache[2], true, false, false);
|
|
388
|
+
this._engine.unBindFramebuffer(this._colorMrts[1].renderTarget);
|
|
389
|
+
// Draw depth for first pass
|
|
390
|
+
this._engine.bindFramebuffer(this._depthMrts[0].renderTarget);
|
|
391
|
+
this._engine.bindAttachments(this._layoutCache[0]);
|
|
392
|
+
this._engine.setAlphaMode(11); // in WebGPU, when using MIN or MAX equation, the src / dst color factors should not use SRC_ALPHA and the src / dst alpha factors must be 1 else WebGPU will throw a validation error
|
|
393
|
+
this._engine.setAlphaEquation(3);
|
|
394
|
+
this._engine.depthCullingState.depthMask = false;
|
|
395
|
+
this._engine.depthCullingState.depthTest = true;
|
|
396
|
+
this._engine.applyStates();
|
|
397
|
+
this._currentPingPongState = 1;
|
|
398
|
+
// Render
|
|
399
|
+
this._renderSubMeshes(this._candidateSubMeshes);
|
|
400
|
+
this._engine.unBindFramebuffer(this._depthMrts[0].renderTarget);
|
|
401
|
+
this._scene.resetCachedMaterial();
|
|
402
|
+
// depth peeling ping-pong
|
|
403
|
+
let readId = 0;
|
|
404
|
+
let writeId = 0;
|
|
405
|
+
for (let i = 0; i < this._passCount; i++) {
|
|
406
|
+
readId = i % 2;
|
|
407
|
+
writeId = 1 - readId;
|
|
408
|
+
this._currentPingPongState = readId;
|
|
409
|
+
if (this._useRenderPasses) {
|
|
410
|
+
this._engine.currentRenderPassId = this._renderPassIds[i + 1];
|
|
411
|
+
}
|
|
412
|
+
if (this._scene.activeCamera) {
|
|
413
|
+
this._engine.setViewport(this._scene.activeCamera.viewport);
|
|
414
|
+
}
|
|
415
|
+
// Clears
|
|
416
|
+
this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget);
|
|
417
|
+
this._engine.bindAttachments(this._layoutCache[0]);
|
|
418
|
+
this._engine.clear(this._colorCache[0], true, false, false);
|
|
419
|
+
this._engine.unBindFramebuffer(this._depthMrts[writeId].renderTarget);
|
|
420
|
+
this._engine.bindFramebuffer(this._colorMrts[writeId].renderTarget);
|
|
421
|
+
this._engine.bindAttachments(this._layoutCache[1]);
|
|
422
|
+
this._engine.clear(this._colorCache[2], true, false, false);
|
|
423
|
+
this._engine.unBindFramebuffer(this._colorMrts[writeId].renderTarget);
|
|
424
|
+
this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget);
|
|
425
|
+
this._engine.bindAttachments(this._layoutCache[2]);
|
|
426
|
+
this._engine.setAlphaMode(11); // the value does not matter (as MAX operation does not use them) but the src and dst color factors should not use SRC_ALPHA else WebGPU will throw a validation error
|
|
427
|
+
this._engine.setAlphaEquation(3);
|
|
428
|
+
this._engine.depthCullingState.depthTest = false;
|
|
429
|
+
this._engine.applyStates();
|
|
430
|
+
// Render
|
|
431
|
+
this._renderSubMeshes(this._candidateSubMeshes);
|
|
432
|
+
this._engine.unBindFramebuffer(this._depthMrts[writeId].renderTarget);
|
|
433
|
+
this._scene.resetCachedMaterial();
|
|
434
|
+
// Back color
|
|
435
|
+
this._engine.bindFramebuffer(this._blendBackMrt.renderTarget);
|
|
436
|
+
this._engine.bindAttachments(this._layoutCache[0]);
|
|
437
|
+
this._engine.setAlphaEquation(0);
|
|
438
|
+
this._engine.setAlphaMode(17);
|
|
439
|
+
this._engine.applyStates();
|
|
440
|
+
const blendBackEffectWrapper = writeId === 0 || !this._useRenderPasses ? this._blendBackEffectWrapper : this._blendBackEffectWrapperPingPong;
|
|
441
|
+
this._engine.enableEffect(blendBackEffectWrapper.drawWrapper);
|
|
442
|
+
blendBackEffectWrapper.effect.setTexture("uBackColor", this._thinTextures[writeId * 3 + 2]);
|
|
443
|
+
this._effectRenderer.render(blendBackEffectWrapper);
|
|
444
|
+
this._engine.unBindFramebuffer(this._blendBackMrt.renderTarget);
|
|
445
|
+
}
|
|
446
|
+
this._engine.currentRenderPassId = currentRenderPassId;
|
|
447
|
+
// Final composition on default FB
|
|
448
|
+
this._finalCompose(writeId);
|
|
449
|
+
this._engine.setAlphaMode(0);
|
|
450
|
+
this._engine.depthCullingState.depthMask = true;
|
|
451
|
+
this._engine.depthCullingState.depthTest = true;
|
|
452
|
+
this._afterRender();
|
|
453
|
+
return this._excludedSubMeshes;
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Disposes the depth peeling renderer and associated resources
|
|
457
|
+
*/
|
|
458
|
+
dispose() {
|
|
459
|
+
this._disposeTextures();
|
|
460
|
+
this._blendBackEffectWrapper.dispose();
|
|
461
|
+
this._finalEffectWrapper.dispose();
|
|
462
|
+
this._effectRenderer.dispose();
|
|
463
|
+
this._releaseRenderPassIds();
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
ThinDepthPeelingRenderer._DEPTH_CLEAR_VALUE = -99999.0;
|
|
467
|
+
ThinDepthPeelingRenderer._MIN_DEPTH = 0;
|
|
468
|
+
ThinDepthPeelingRenderer._MAX_DEPTH = 1;
|
|
469
|
+
//# sourceMappingURL=thinDepthPeelingRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinDepthPeelingRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/thinDepthPeelingRenderer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAE5E,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAI5E,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,0CAA0C,CAAC;AAKlD;;GAEG;AACH,MAAM,OAAO,wBAAwB;IAiCjC;;OAEG;IACH,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,IAAW,SAAS,CAAC,KAAa;QAC9B,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YAC5B,OAAO;QACX,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAGD;;OAEG;IACH,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACjC,CAAC;IAED,IAAW,eAAe,CAAC,SAAkB;QACzC,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO;QACX,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAClC,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAED;;;OAGG;IACI,eAAe,CAAC,IAAkB;QACrC,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,kBAAkB,CAAC,IAAkB;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC;IAKD;;OAEG;IACH,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAGD;;OAEG;IACH,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,IAAW,WAAW,CAAC,WAA0C;QAC7D,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,WAAW,EAAE,CAAC;YACd,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,YAAY,KAAY,EAAE,YAAoB,CAAC;QAlHrC,eAAU,GAAwB,EAAE,CAAC;QACrC,kBAAa,GAAkB,EAAE,CAAC;QAClC,eAAU,GAAwB,EAAE,CAAC;QAQrC,0BAAqB,GAAW,CAAC,CAAC;QAElC,uBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAChE,iBAAY,GAAe,EAAE,CAAC;QAE9B,wBAAmB,GAAwB,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QAC9D,uBAAkB,GAAwB,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QAC7D,oBAAe,GAAa,EAAE,CAAC;QAM/B,gBAAW,GAAG;YACpB,IAAI,MAAM,CAAC,wBAAwB,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1G,IAAI,MAAM,CAAC,CAAC,wBAAwB,CAAC,UAAU,EAAE,wBAAwB,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3F,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACzB,CAAC;QAuDF,2CAA2C;QACjC,oBAAe,+BAAuB;QAgC5C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;QACvF,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAE7B,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,eAAe,8BAAsB,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAChE,CAAC;IAEO,oBAAoB;QACxB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1B,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC;gBAClG,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAEO,qBAAqB;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAC7B,CAAC;IAES,eAAe;QACrB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO;gBACH,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK;gBAC9B,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;aACnC,CAAC;QACN,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;IAC5F,CAAC;IAES,eAAe;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAEpC,kBAAkB;QAClB,IAAI,CAAC,UAAU,GAAG;YACd,IAAI,iBAAiB,CAAC,uBAAuB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE;gBAC5E,6BAA6B;gBAC7B,kCAAkC;gBAClC,iCAAiC;aACpC,CAAC;YACF,IAAI,iBAAiB,CAAC,uBAAuB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE;gBAC5E,6BAA6B;gBAC7B,kCAAkC;gBAClC,iCAAiC;aACpC,CAAC;SACL,CAAC;QACF,IAAI,CAAC,UAAU,GAAG;YACd,IAAI,iBAAiB,CAAC,uBAAuB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE;gBACjG,kCAAkC;gBAClC,iCAAiC;aACpC,CAAC;YACF,IAAI,iBAAiB,CAAC,uBAAuB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE;gBACjG,kCAAkC;gBAClC,iCAAiC;aACpC,CAAC;SACL,CAAC;QACF,IAAI,CAAC,aAAa,GAAG,IAAI,iBAAiB,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC3J,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,OAAQ,EAAE,CAAC,CAAC,CAAC;QACzE,CAAC;QAED,uBAAuB;QACvB,uBAAuB;QACvB,MAAM,YAAY,GAAG;YACjB;gBACI,MAAM,EAAE,SAAS,CAAC,gBAAgB;gBAClC,YAAY,EAAE,SAAS,CAAC,4BAA4B;gBACpD,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,2BAA2B,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB;gBACzH,KAAK,EAAE,mCAAmC;aACX;YACnC;gBACI,MAAM,EAAE,SAAS,CAAC,kBAAkB;gBACpC,YAAY,EAAE,SAAS,CAAC,4BAA4B;gBACpD,IAAI,EAAE,SAAS,CAAC,sBAAsB;gBACtC,KAAK,EAAE,mCAAmC;aACX;SACtC,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACvF,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC5F,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAE3F,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;YACvD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;YAC5D,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;YAC5D,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YAE3D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,YAAY,CAAC,EAAE,IAAI,WAAW,CAAC,iBAAiB,CAAC,EAAE,IAAI,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAClI,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAa,CAAC,CAAC;QACnE,CAAC;IACL,CAAC;IAES,gBAAgB;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACpC,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IACzB,CAAC;IAES,cAAc,CAAC,6BAAqC,EAAE,uBAAiC;QAC7F,IAAI,CAAC,uBAAuB,GAAG,IAAI,aAAa,CAAC;YAC7C,cAAc,EAAE,cAAc;YAC9B,cAAc,EAAE,IAAI;YACpB,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,YAAY,EAAE,CAAC,YAAY,CAAC;YAC5B,YAAY,EAAE,EAAE;YAChB,cAAc,EAAE,IAAI,CAAC,eAAe;YACpC,yBAAyB,EAAE,KAAK,IAAI,EAAE;gBAClC,IAAI,IAAI,CAAC,eAAe,gCAAwB,EAAE,CAAC;oBAC/C,MAAM,MAAM,CAAC,sCAAsC,CAAC,CAAC;gBACzD,CAAC;qBAAM,CAAC;oBACJ,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;gBACrD,CAAC;YACL,CAAC;SACJ,CAAC,CAAC;QACH,IAAI,CAAC,+BAA+B,GAAG,IAAI,aAAa,CAAC;YACrD,cAAc,EAAE,cAAc;YAC9B,cAAc,EAAE,IAAI;YACpB,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,YAAY,EAAE,CAAC,YAAY,CAAC;YAC5B,YAAY,EAAE,EAAE;YAChB,cAAc,EAAE,IAAI,CAAC,eAAe;YACpC,yBAAyB,EAAE,KAAK,IAAI,EAAE;gBAClC,IAAI,IAAI,CAAC,eAAe,gCAAwB,EAAE,CAAC;oBAC/C,MAAM,MAAM,CAAC,sCAAsC,CAAC,CAAC;gBACzD,CAAC;qBAAM,CAAC;oBACJ,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;gBACrD,CAAC;YACL,CAAC;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,mBAAmB,GAAG,IAAI,aAAa,CAAC;YACzC,cAAc,EAAE,6BAA6B;YAC7C,cAAc,EAAE,IAAI;YACpB,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,YAAY,EAAE,uBAAuB;YACrC,YAAY,EAAE,EAAE;YAChB,cAAc,EAAE,IAAI,CAAC,eAAe;YACpC,yBAAyB,EAAE,KAAK,IAAI,EAAE;gBAClC,IAAI,IAAI,CAAC,eAAe,gCAAwB,EAAE,CAAC;oBAC/C,MAAM,MAAM,CAAC,6CAA6C,CAAC,CAAC;gBAChE,CAAC;qBAAM,CAAC;oBACJ,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAC;gBAC5D,CAAC;YACL,CAAC;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACI,kBAAkB,CAAC,gBAAiC,IAAG,CAAC;IAE/D;;;OAGG;IACI,IAAI,CAAC,MAAc;QACtB,MAAM,CAAC,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,CAAC;QACzF,MAAM,CAAC,UAAU,CAAC,sBAAsB,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,qBAAqB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtG,CAAC;IAEO,gBAAgB,CAAC,oBAAyC;QAC9D,IAAI,kBAAwE,CAAC;QAC7E,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,kBAAkB,GAAG,EAAE,CAAC;QAC5B,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,oBAAoB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5D,IAAI,yBAAyB,GAAG,IAAI,CAAC;YACrC,IAAI,WAAW,GAAG,KAAK,CAAC;YAExB,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,WAAoC,CAAC;YACzC,IAAI,SAAS,GAAG,KAAK,CAAC;YAEtB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,WAAW,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;gBACxC,SAAS,GAAG,CAAC,WAAW,CAAC;YAC7B,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACX,yBAAyB,GAAG,QAAQ,CAAC,sBAAsB,CAAC;gBAC5D,WAAW,GAAG,QAAQ,CAAC,eAAe,CAAC;gBACvC,QAAQ,CAAC,sBAAsB,GAAG,KAAK,CAAC;gBACxC,QAAQ,CAAC,eAAe,GAAG,KAAK,CAAC;YACrC,CAAC;YAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEtB,IAAI,SAAS,EAAE,CAAC;gBACZ,mEAAmE;gBACnE,WAAW,GAAG,OAAO,CAAC,eAAe,EAAG,CAAC,CAAC,kEAAkE;gBAC5G,IAAI,WAAW,CAAC,eAAe,EAAE,CAAC;oBAC9B,IAAI,kBAAkB,GAAG,kBAAmB,CAAC,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;oBACnF,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBACtB,kBAAkB,GAAG,kBAAmB,CAAC,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;oBAC1H,CAAC;oBACD,OAAO,CAAC,eAAe,EAAG,CAAC,eAAe,GAAG,kBAAkB,CAAC;gBACpE,CAAC;YACL,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACX,QAAQ,CAAC,sBAAsB,GAAG,yBAAyB,CAAC;gBAC5D,QAAQ,CAAC,eAAe,GAAG,WAAW,CAAC;YAC3C,CAAC;QACL,CAAC;IACL,CAAC;IAES,aAAa,CAAC,OAAe;QACnC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,YAAa,CAAC,CAAC;QAEjD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAE3B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/F,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACI,OAAO;QACV,OAAO,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,+BAA+B,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC/J,CAAC;IAES,aAAa,KAAI,CAAC;IAElB,YAAY,KAAI,CAAC;IAE3B;;;;OAIG;IACI,MAAM,CAAC,oBAAyC;QACnD,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,kBAAkB,CAAC;QACnC,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAChE,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,oBAAoB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnD,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEjG,IACI,QAAQ;gBACR,CAAC,QAAQ,KAAK,QAAQ,CAAC,mBAAmB,IAAI,QAAQ,KAAK,QAAQ,CAAC,gBAAgB,IAAI,QAAQ,KAAK,QAAQ,CAAC,qBAAqB,CAAC;gBACpI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EACjE,CAAC;gBACC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1C,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,kBAAkB,CAAC;QACnC,CAAC;QAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;QAE7D,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;QAED,SAAS;QACT,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAa,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAa,CAAC,CAAC;QAEjE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAa,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAa,CAAC,CAAC;QAEjE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAa,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAa,CAAC,CAAC;QAEjE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAa,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAa,CAAC,CAAC;QAEjE,4BAA4B;QAC5B,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAa,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,sLAAsL;QAChP,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAE3B,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;QAC/B,SAAS;QACT,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAa,CAAC,CAAC;QAEjE,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAElC,0BAA0B;QAC1B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;YACf,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC;YAEpC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,IAAI,CAAC,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAChE,CAAC;YAED,SAAS;YACT,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,YAAa,CAAC,CAAC;YACrE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC5D,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,YAAa,CAAC,CAAC;YAEvE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,YAAa,CAAC,CAAC;YACrE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC5D,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,YAAa,CAAC,CAAC;YAEvE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,YAAa,CAAC,CAAC;YACrE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YAEnD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,sKAAsK;YAChO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAC5D,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YACjD,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAE3B,SAAS;YACT,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAChD,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,YAAa,CAAC,CAAC;YAEvE,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAElC,aAAa;YACb,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,YAAa,CAAC,CAAC;YAC/D,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAC5D,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YAC5D,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAE3B,MAAM,sBAAsB,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC;YAC7I,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;YAC9D,sBAAsB,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5F,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,YAAa,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;QAEvD,kCAAkC;QAClC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAE5B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAEnD,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;QAEhD,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,CAAC;QACvC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACjC,CAAC;;AA7gBgB,2CAAkB,GAAG,CAAC,OAAO,AAAX,CAAY;AAC9B,mCAAU,GAAG,CAAC,AAAJ,CAAK;AACf,mCAAU,GAAG,CAAC,AAAJ,CAAK","sourcesContent":["/**\r\n * Implementation based on https://medium.com/@shrekshao_71662/dual-depth-peeling-implementation-in-webgl-11baa061ba4b\r\n */\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { MultiRenderTarget } from \"../Materials/Textures/multiRenderTarget\";\r\nimport type { InternalTextureCreationOptions } from \"../Materials/Textures/textureCreationOptions\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport type { Scene } from \"../scene\";\r\nimport { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport { EffectRenderer, EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport type { PrePassRenderer } from \"./prePassRenderer\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\nimport type { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport { Material } from \"../Materials/material\";\r\n\r\nimport \"../Engines/Extensions/engine.multiRender\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport type { RenderTargetWrapper } from \"../Engines/renderTargetWrapper\";\r\nimport type { Nullable } from \"../types\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ThinDepthPeelingRenderer {\r\n protected _scene: Scene;\r\n protected _engine: AbstractEngine;\r\n protected _depthMrts: MultiRenderTarget[] = [];\r\n protected _thinTextures: ThinTexture[] = [];\r\n protected _colorMrts: MultiRenderTarget[] = [];\r\n protected _blendBackMrt: MultiRenderTarget;\r\n\r\n protected _blendBackEffectWrapper: EffectWrapper;\r\n protected _blendBackEffectWrapperPingPong: EffectWrapper;\r\n protected _finalEffectWrapper: EffectWrapper;\r\n protected _effectRenderer: EffectRenderer;\r\n\r\n protected _currentPingPongState: number = 0;\r\n\r\n protected _layoutCacheFormat = [[true], [true, true], [true, true, true]];\r\n protected _layoutCache: number[][] = [];\r\n protected _renderPassIds: number[];\r\n protected _candidateSubMeshes: SmartArray<SubMesh> = new SmartArray(10);\r\n protected _excludedSubMeshes: SmartArray<SubMesh> = new SmartArray(10);\r\n protected _excludedMeshes: number[] = [];\r\n\r\n protected static _DEPTH_CLEAR_VALUE = -99999.0;\r\n protected static _MIN_DEPTH = 0;\r\n protected static _MAX_DEPTH = 1;\r\n\r\n protected _colorCache = [\r\n new Color4(ThinDepthPeelingRenderer._DEPTH_CLEAR_VALUE, ThinDepthPeelingRenderer._DEPTH_CLEAR_VALUE, 0, 0),\r\n new Color4(-ThinDepthPeelingRenderer._MIN_DEPTH, ThinDepthPeelingRenderer._MAX_DEPTH, 0, 0),\r\n new Color4(0, 0, 0, 0),\r\n ];\r\n\r\n protected _passCount: number;\r\n /**\r\n * Number of depth peeling passes. As we are using dual depth peeling, each pass two levels of transparency are processed.\r\n */\r\n public get passCount(): number {\r\n return this._passCount;\r\n }\r\n\r\n public set passCount(count: number) {\r\n if (this._passCount === count) {\r\n return;\r\n }\r\n this._passCount = count;\r\n this._createRenderPassIds();\r\n }\r\n\r\n protected _useRenderPasses: boolean;\r\n /**\r\n * Instructs the renderer to use render passes. It is an optimization that makes the rendering faster for some engines (like WebGPU) but that consumes more memory, so it is disabled by default.\r\n */\r\n public get useRenderPasses() {\r\n return this._useRenderPasses;\r\n }\r\n\r\n public set useRenderPasses(usePasses: boolean) {\r\n if (this._useRenderPasses === usePasses) {\r\n return;\r\n }\r\n this._useRenderPasses = usePasses;\r\n this._createRenderPassIds();\r\n }\r\n\r\n /**\r\n * Add a mesh in the exclusion list to prevent it to be handled by the depth peeling renderer\r\n * @param mesh The mesh to exclude from the depth peeling renderer\r\n */\r\n public addExcludedMesh(mesh: AbstractMesh): void {\r\n if (this._excludedMeshes.indexOf(mesh.uniqueId) === -1) {\r\n this._excludedMeshes.push(mesh.uniqueId);\r\n }\r\n }\r\n\r\n /**\r\n * Remove a mesh from the exclusion list of the depth peeling renderer\r\n * @param mesh The mesh to remove\r\n */\r\n public removeExcludedMesh(mesh: AbstractMesh): void {\r\n const index = this._excludedMeshes.indexOf(mesh.uniqueId);\r\n if (index !== -1) {\r\n this._excludedMeshes.splice(index, 1);\r\n }\r\n }\r\n\r\n /** Shader language used by the renderer */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this renderer\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n private _blendOutput: Nullable<RenderTargetWrapper>;\r\n /**\r\n * Sets the render target wrapper we will blend the transparent objects onto\r\n */\r\n public get blendOutput(): Nullable<RenderTargetWrapper> {\r\n return this._blendOutput;\r\n }\r\n\r\n public set blendOutput(blendOutput: Nullable<RenderTargetWrapper>) {\r\n this._blendOutput = blendOutput;\r\n this._disposeTextures();\r\n if (blendOutput) {\r\n this._createTextures();\r\n }\r\n }\r\n\r\n /**\r\n * Instanciates the depth peeling renderer\r\n * @param scene Scene to attach to\r\n * @param passCount Number of depth layers to peel\r\n * @returns The depth peeling renderer\r\n */\r\n constructor(scene: Scene, passCount: number = 5) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._passCount = passCount;\r\n\r\n for (let i = 0; i < this._layoutCacheFormat.length; ++i) {\r\n this._layoutCache[i] = this._engine.buildTextureLayout(this._layoutCacheFormat[i]);\r\n }\r\n\r\n this._renderPassIds = [];\r\n this.useRenderPasses = false;\r\n\r\n if (this._engine.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n this._createEffects(\"oitFinalSimpleBlend\", [\"uFrontColor\"]);\r\n }\r\n\r\n private _createRenderPassIds(): void {\r\n this._releaseRenderPassIds();\r\n if (this._useRenderPasses) {\r\n for (let i = 0; i < this._passCount + 1; ++i) {\r\n if (!this._renderPassIds[i]) {\r\n this._renderPassIds[i] = this._engine.createRenderPassId(`DepthPeelingRenderer - pass #${i}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _releaseRenderPassIds(): void {\r\n for (let i = 0; i < this._renderPassIds.length; ++i) {\r\n this._engine.releaseRenderPassId(this._renderPassIds[i]);\r\n }\r\n this._renderPassIds = [];\r\n }\r\n\r\n protected _getTextureSize(): { width: number; height: number } {\r\n if (this._blendOutput) {\r\n return {\r\n width: this._blendOutput.width,\r\n height: this._blendOutput.height,\r\n };\r\n }\r\n return { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() };\r\n }\r\n\r\n protected _createTextures() {\r\n const size = this._getTextureSize();\r\n\r\n // 2 for ping pong\r\n this._depthMrts = [\r\n new MultiRenderTarget(\"depthPeelingDepth0MRT\", size, 3, this._scene, undefined, [\r\n \"depthPeelingDepth0MRT_depth\",\r\n \"depthPeelingDepth0MRT_frontColor\",\r\n \"depthPeelingDepth0MRT_backColor\",\r\n ]),\r\n new MultiRenderTarget(\"depthPeelingDepth1MRT\", size, 3, this._scene, undefined, [\r\n \"depthPeelingDepth1MRT_depth\",\r\n \"depthPeelingDepth1MRT_frontColor\",\r\n \"depthPeelingDepth1MRT_backColor\",\r\n ]),\r\n ];\r\n this._colorMrts = [\r\n new MultiRenderTarget(\"depthPeelingColor0MRT\", size, 2, this._scene, { generateDepthBuffer: false }, [\r\n \"depthPeelingColor0MRT_frontColor\",\r\n \"depthPeelingColor0MRT_backColor\",\r\n ]),\r\n new MultiRenderTarget(\"depthPeelingColor1MRT\", size, 2, this._scene, { generateDepthBuffer: false }, [\r\n \"depthPeelingColor1MRT_frontColor\",\r\n \"depthPeelingColor1MRT_backColor\",\r\n ]),\r\n ];\r\n this._blendBackMrt = new MultiRenderTarget(\"depthPeelingBackMRT\", size, 1, this._scene, { generateDepthBuffer: false }, [\"depthPeelingBackMRT_blendBack\"]);\r\n if (this._blendOutput) {\r\n this._blendBackMrt.setInternalTexture(this._blendOutput.texture!, 0);\r\n }\r\n\r\n // 0 is a depth texture\r\n // 1 is a color texture\r\n const optionsArray = [\r\n {\r\n format: Constants.TEXTUREFORMAT_RG,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n type: this._engine.getCaps().textureFloatLinearFiltering ? Constants.TEXTURETYPE_FLOAT : Constants.TEXTURETYPE_HALF_FLOAT,\r\n label: \"DepthPeelingRenderer-DepthTexture\",\r\n } as InternalTextureCreationOptions,\r\n {\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n label: \"DepthPeelingRenderer-ColorTexture\",\r\n } as InternalTextureCreationOptions,\r\n ];\r\n\r\n for (let i = 0; i < 2; i++) {\r\n const depthTexture = this._engine._createInternalTexture(size, optionsArray[0], false);\r\n const frontColorTexture = this._engine._createInternalTexture(size, optionsArray[1], false);\r\n const backColorTexture = this._engine._createInternalTexture(size, optionsArray[1], false);\r\n\r\n this._depthMrts[i].setInternalTexture(depthTexture, 0);\r\n this._depthMrts[i].setInternalTexture(frontColorTexture, 1);\r\n this._depthMrts[i].setInternalTexture(backColorTexture, 2);\r\n this._colorMrts[i].setInternalTexture(frontColorTexture, 0);\r\n this._colorMrts[i].setInternalTexture(backColorTexture, 1);\r\n\r\n this._thinTextures.push(new ThinTexture(depthTexture), new ThinTexture(frontColorTexture), new ThinTexture(backColorTexture));\r\n }\r\n\r\n if (this._blendOutput) {\r\n this._blendOutput.shareDepth(this._depthMrts[0].renderTarget!);\r\n }\r\n }\r\n\r\n protected _disposeTextures() {\r\n for (let i = 0; i < this._thinTextures.length; i++) {\r\n this._thinTextures[i].dispose();\r\n }\r\n\r\n for (let i = 0; i < this._depthMrts.length; i++) {\r\n this._depthMrts[i].dispose(true);\r\n this._colorMrts[i].dispose(true);\r\n this._blendBackMrt.dispose(true);\r\n }\r\n\r\n this._thinTextures = [];\r\n this._colorMrts = [];\r\n this._depthMrts = [];\r\n }\r\n\r\n protected _createEffects(finalEffectFragmentShaderName: string, finalEffectSamplerNames: string[]) {\r\n this._blendBackEffectWrapper = new EffectWrapper({\r\n fragmentShader: \"oitBackBlend\",\r\n useShaderStore: true,\r\n engine: this._engine,\r\n samplerNames: [\"uBackColor\"],\r\n uniformNames: [],\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await import(\"../ShadersWGSL/oitBackBlend.fragment\");\r\n } else {\r\n await import(\"../Shaders/oitBackBlend.fragment\");\r\n }\r\n },\r\n });\r\n this._blendBackEffectWrapperPingPong = new EffectWrapper({\r\n fragmentShader: \"oitBackBlend\",\r\n useShaderStore: true,\r\n engine: this._engine,\r\n samplerNames: [\"uBackColor\"],\r\n uniformNames: [],\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await import(\"../ShadersWGSL/oitBackBlend.fragment\");\r\n } else {\r\n await import(\"../Shaders/oitBackBlend.fragment\");\r\n }\r\n },\r\n });\r\n\r\n this._finalEffectWrapper = new EffectWrapper({\r\n fragmentShader: finalEffectFragmentShaderName,\r\n useShaderStore: true,\r\n engine: this._engine,\r\n samplerNames: finalEffectSamplerNames,\r\n uniformNames: [],\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await import(\"../ShadersWGSL/oitFinalSimpleBlend.fragment\");\r\n } else {\r\n await import(\"../Shaders/oitFinalSimpleBlend.fragment\");\r\n }\r\n },\r\n });\r\n\r\n this._effectRenderer = new EffectRenderer(this._engine);\r\n }\r\n\r\n /**\r\n * Links to the prepass renderer\r\n * @param _prePassRenderer The scene PrePassRenderer\r\n */\r\n public setPrePassRenderer(_prePassRenderer: PrePassRenderer) {}\r\n\r\n /**\r\n * Binds depth peeling textures on an effect\r\n * @param effect The effect to bind textures on\r\n */\r\n public bind(effect: Effect) {\r\n effect.setTexture(\"oitDepthSampler\", this._thinTextures[this._currentPingPongState * 3]);\r\n effect.setTexture(\"oitFrontColorSampler\", this._thinTextures[this._currentPingPongState * 3 + 1]);\r\n }\r\n\r\n private _renderSubMeshes(transparentSubMeshes: SmartArray<SubMesh>) {\r\n let mapMaterialContext: { [uniqueId: number]: IMaterialContext | undefined };\r\n if (this._useRenderPasses) {\r\n mapMaterialContext = {};\r\n }\r\n for (let j = 0; j < transparentSubMeshes.length; j++) {\r\n const material = transparentSubMeshes.data[j].getMaterial();\r\n let previousShaderHotSwapping = true;\r\n let previousBFC = false;\r\n\r\n const subMesh = transparentSubMeshes.data[j];\r\n let drawWrapper: DrawWrapper | undefined;\r\n let firstDraw = false;\r\n\r\n if (this._useRenderPasses) {\r\n drawWrapper = subMesh._getDrawWrapper();\r\n firstDraw = !drawWrapper;\r\n }\r\n\r\n if (material) {\r\n previousShaderHotSwapping = material.allowShaderHotSwapping;\r\n previousBFC = material.backFaceCulling;\r\n material.allowShaderHotSwapping = false;\r\n material.backFaceCulling = false;\r\n }\r\n\r\n subMesh.render(false);\r\n\r\n if (firstDraw) {\r\n // first time we draw this submesh: we replace the material context\r\n drawWrapper = subMesh._getDrawWrapper()!; // we are sure it is now non empty as we just rendered the submesh\r\n if (drawWrapper.materialContext) {\r\n let newMaterialContext = mapMaterialContext![drawWrapper.materialContext.uniqueId];\r\n if (!newMaterialContext) {\r\n newMaterialContext = mapMaterialContext![drawWrapper.materialContext.uniqueId] = this._engine.createMaterialContext();\r\n }\r\n subMesh._getDrawWrapper()!.materialContext = newMaterialContext;\r\n }\r\n }\r\n\r\n if (material) {\r\n material.allowShaderHotSwapping = previousShaderHotSwapping;\r\n material.backFaceCulling = previousBFC;\r\n }\r\n }\r\n }\r\n\r\n protected _finalCompose(writeId: number) {\r\n this._engine.bindFramebuffer(this._blendOutput!);\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_PREMULTIPLIED);\r\n this._engine.depthCullingState.depthMask = false;\r\n this._engine.depthCullingState.depthTest = false;\r\n this._engine.applyStates();\r\n\r\n this._engine.enableEffect(this._finalEffectWrapper.drawWrapper);\r\n this._finalEffectWrapper.effect.setTexture(\"uFrontColor\", this._thinTextures[writeId * 3 + 1]);\r\n this._effectRenderer.render(this._finalEffectWrapper);\r\n }\r\n\r\n /**\r\n * Checks if the depth peeling renderer is ready to render transparent meshes\r\n * @returns true if the depth peeling renderer is ready to render the transparent meshes\r\n */\r\n public isReady() {\r\n return this._blendBackEffectWrapper.effect.isReady() && this._blendBackEffectWrapperPingPong.effect.isReady() && this._finalEffectWrapper.effect.isReady();\r\n }\r\n\r\n protected _beforeRender() {}\r\n\r\n protected _afterRender() {}\r\n\r\n /**\r\n * Renders transparent submeshes with depth peeling\r\n * @param transparentSubMeshes List of transparent meshes to render\r\n * @returns The array of submeshes that could not be handled by this renderer\r\n */\r\n public render(transparentSubMeshes: SmartArray<SubMesh>): SmartArray<SubMesh> {\r\n this._candidateSubMeshes.length = 0;\r\n this._excludedSubMeshes.length = 0;\r\n if (!this.isReady()) {\r\n return this._excludedSubMeshes;\r\n }\r\n\r\n if (this._scene.activeCamera) {\r\n this._engine.setViewport(this._scene.activeCamera.viewport);\r\n }\r\n\r\n for (let i = 0; i < transparentSubMeshes.length; i++) {\r\n const subMesh = transparentSubMeshes.data[i];\r\n const material = subMesh.getMaterial();\r\n const fillMode = material && subMesh.getRenderingMesh()._getRenderingFillMode(material.fillMode);\r\n\r\n if (\r\n material &&\r\n (fillMode === Material.TriangleFanDrawMode || fillMode === Material.TriangleFillMode || fillMode === Material.TriangleStripDrawMode) &&\r\n this._excludedMeshes.indexOf(subMesh.getMesh().uniqueId) === -1\r\n ) {\r\n this._candidateSubMeshes.push(subMesh);\r\n } else {\r\n this._excludedSubMeshes.push(subMesh);\r\n }\r\n }\r\n\r\n if (!this._candidateSubMeshes.length) {\r\n return this._excludedSubMeshes;\r\n }\r\n\r\n const currentRenderPassId = this._engine.currentRenderPassId;\r\n\r\n this._beforeRender();\r\n\r\n if (this._useRenderPasses) {\r\n this._engine.currentRenderPassId = this._renderPassIds[0];\r\n }\r\n\r\n // Clears\r\n this._engine.bindFramebuffer(this._depthMrts[0].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[0]);\r\n this._engine.clear(this._colorCache[0], true, false, false);\r\n this._engine.unBindFramebuffer(this._depthMrts[0].renderTarget!);\r\n\r\n this._engine.bindFramebuffer(this._depthMrts[1].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[0]);\r\n this._engine.clear(this._colorCache[1], true, false, false);\r\n this._engine.unBindFramebuffer(this._depthMrts[1].renderTarget!);\r\n\r\n this._engine.bindFramebuffer(this._colorMrts[0].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[1]);\r\n this._engine.clear(this._colorCache[2], true, false, false);\r\n this._engine.unBindFramebuffer(this._colorMrts[0].renderTarget!);\r\n\r\n this._engine.bindFramebuffer(this._colorMrts[1].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[1]);\r\n this._engine.clear(this._colorCache[2], true, false, false);\r\n this._engine.unBindFramebuffer(this._colorMrts[1].renderTarget!);\r\n\r\n // Draw depth for first pass\r\n this._engine.bindFramebuffer(this._depthMrts[0].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[0]);\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_ONEONE_ONEONE); // in WebGPU, when using MIN or MAX equation, the src / dst color factors should not use SRC_ALPHA and the src / dst alpha factors must be 1 else WebGPU will throw a validation error\r\n this._engine.setAlphaEquation(Constants.ALPHA_EQUATION_MAX);\r\n this._engine.depthCullingState.depthMask = false;\r\n this._engine.depthCullingState.depthTest = true;\r\n this._engine.applyStates();\r\n\r\n this._currentPingPongState = 1;\r\n // Render\r\n this._renderSubMeshes(this._candidateSubMeshes);\r\n this._engine.unBindFramebuffer(this._depthMrts[0].renderTarget!);\r\n\r\n this._scene.resetCachedMaterial();\r\n\r\n // depth peeling ping-pong\r\n let readId = 0;\r\n let writeId = 0;\r\n\r\n for (let i = 0; i < this._passCount; i++) {\r\n readId = i % 2;\r\n writeId = 1 - readId;\r\n this._currentPingPongState = readId;\r\n\r\n if (this._useRenderPasses) {\r\n this._engine.currentRenderPassId = this._renderPassIds[i + 1];\r\n }\r\n\r\n if (this._scene.activeCamera) {\r\n this._engine.setViewport(this._scene.activeCamera.viewport);\r\n }\r\n\r\n // Clears\r\n this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[0]);\r\n this._engine.clear(this._colorCache[0], true, false, false);\r\n this._engine.unBindFramebuffer(this._depthMrts[writeId].renderTarget!);\r\n\r\n this._engine.bindFramebuffer(this._colorMrts[writeId].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[1]);\r\n this._engine.clear(this._colorCache[2], true, false, false);\r\n this._engine.unBindFramebuffer(this._colorMrts[writeId].renderTarget!);\r\n\r\n this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[2]);\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_ONEONE_ONEONE); // the value does not matter (as MAX operation does not use them) but the src and dst color factors should not use SRC_ALPHA else WebGPU will throw a validation error\r\n this._engine.setAlphaEquation(Constants.ALPHA_EQUATION_MAX);\r\n this._engine.depthCullingState.depthTest = false;\r\n this._engine.applyStates();\r\n\r\n // Render\r\n this._renderSubMeshes(this._candidateSubMeshes);\r\n this._engine.unBindFramebuffer(this._depthMrts[writeId].renderTarget!);\r\n\r\n this._scene.resetCachedMaterial();\r\n\r\n // Back color\r\n this._engine.bindFramebuffer(this._blendBackMrt.renderTarget!);\r\n this._engine.bindAttachments(this._layoutCache[0]);\r\n this._engine.setAlphaEquation(Constants.ALPHA_EQUATION_ADD);\r\n this._engine.setAlphaMode(Constants.ALPHA_LAYER_ACCUMULATE);\r\n this._engine.applyStates();\r\n\r\n const blendBackEffectWrapper = writeId === 0 || !this._useRenderPasses ? this._blendBackEffectWrapper : this._blendBackEffectWrapperPingPong;\r\n this._engine.enableEffect(blendBackEffectWrapper.drawWrapper);\r\n blendBackEffectWrapper.effect.setTexture(\"uBackColor\", this._thinTextures[writeId * 3 + 2]);\r\n this._effectRenderer.render(blendBackEffectWrapper);\r\n this._engine.unBindFramebuffer(this._blendBackMrt.renderTarget!);\r\n }\r\n\r\n this._engine.currentRenderPassId = currentRenderPassId;\r\n\r\n // Final composition on default FB\r\n this._finalCompose(writeId);\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n this._engine.depthCullingState.depthMask = true;\r\n this._engine.depthCullingState.depthTest = true;\r\n\r\n this._afterRender();\r\n\r\n return this._excludedSubMeshes;\r\n }\r\n\r\n /**\r\n * Disposes the depth peeling renderer and associated resources\r\n */\r\n public dispose() {\r\n this._disposeTextures();\r\n this._blendBackEffectWrapper.dispose();\r\n this._finalEffectWrapper.dispose();\r\n this._effectRenderer.dispose();\r\n this._releaseRenderPassIds();\r\n }\r\n}\r\n"]}
|
|
@@ -99,7 +99,7 @@ focal.x/camspace.z,0.,-(focal.x*camspace.x)/(camspace.z*camspace.z),
|
|
|
99
99
|
0.,focal.y/camspace.z,-(focal.y*camspace.y)/(camspace.z*camspace.z),
|
|
100
100
|
0.,0.,0.
|
|
101
101
|
);}
|
|
102
|
-
mat3
|
|
102
|
+
mat3 T=transpose(mat3(modelView))*J;mat3 cov2d=transpose(T)*Vrk*T;
|
|
103
103
|
#if COMPENSATION
|
|
104
104
|
float c00=cov2d[0][0];float c11=cov2d[1][1];float c01=cov2d[0][1];float detOrig=c00*c11-c01*c01;
|
|
105
105
|
#endif
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gaussianSplatting.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/gaussianSplatting.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,mBAAmB,CAAC;AACjC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kEA+GmD,CAAC;AACnE,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"gaussianSplatting\";\nconst shader = `#if !defined(WEBGL2) && !defined(WEBGPU) && !defined(NATIVE)\nmat3 transpose(mat3 matrix) {return mat3(matrix[0][0],matrix[1][0],matrix[2][0],\nmatrix[0][1],matrix[1][1],matrix[2][1],\nmatrix[0][2],matrix[1][2],matrix[2][2]);}\n#endif\nvec2 getDataUV(float index,vec2 textureSize) {float y=floor(index/textureSize.x);float x=index-y*textureSize.x;return vec2((x+0.5)/textureSize.x,(y+0.5)/textureSize.y);}\n#if SH_DEGREE>0\nivec2 getDataUVint(float index,vec2 textureSize) {float y=floor(index/textureSize.x);float x=index-y*textureSize.x;return ivec2(uint(x+0.5),uint(y+0.5));}\n#endif\nstruct Splat {vec4 center;vec4 color;vec4 covA;vec4 covB;\n#if SH_DEGREE>0\nuvec4 sh0; \n#endif\n#if SH_DEGREE>1\nuvec4 sh1;\n#endif\n#if SH_DEGREE>2\nuvec4 sh2;\n#endif\n};float getSplatIndex(int localIndex)\n{float splatIndex;switch (localIndex)\n{case 0: splatIndex=splatIndex0.x; break;case 1: splatIndex=splatIndex0.y; break;case 2: splatIndex=splatIndex0.z; break;case 3: splatIndex=splatIndex0.w; break;case 4: splatIndex=splatIndex1.x; break;case 5: splatIndex=splatIndex1.y; break;case 6: splatIndex=splatIndex1.z; break;case 7: splatIndex=splatIndex1.w; break;case 8: splatIndex=splatIndex2.x; break;case 9: splatIndex=splatIndex2.y; break;case 10: splatIndex=splatIndex2.z; break;case 11: splatIndex=splatIndex2.w; break;case 12: splatIndex=splatIndex3.x; break;case 13: splatIndex=splatIndex3.y; break;case 14: splatIndex=splatIndex3.z; break;case 15: splatIndex=splatIndex3.w; break;}\nreturn splatIndex;}\nSplat readSplat(float splatIndex)\n{Splat splat;vec2 splatUV=getDataUV(splatIndex,dataTextureSize);splat.center=texture2D(centersTexture,splatUV);splat.color=texture2D(colorsTexture,splatUV);splat.covA=texture2D(covariancesATexture,splatUV)*splat.center.w;splat.covB=texture2D(covariancesBTexture,splatUV)*splat.center.w;\n#if SH_DEGREE>0\nivec2 splatUVint=getDataUVint(splatIndex,dataTextureSize);splat.sh0=texelFetch(shTexture0,splatUVint,0);\n#endif\n#if SH_DEGREE>1\nsplat.sh1=texelFetch(shTexture1,splatUVint,0);\n#endif\n#if SH_DEGREE>2\nsplat.sh2=texelFetch(shTexture2,splatUVint,0);\n#endif\nreturn splat;}\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nvec3 computeColorFromSHDegree(vec3 dir,const vec3 sh[16])\n{const float SH_C0=0.28209479;const float SH_C1=0.48860251;float SH_C2[5];SH_C2[0]=1.092548430;SH_C2[1]=-1.09254843;SH_C2[2]=0.315391565;SH_C2[3]=-1.09254843;SH_C2[4]=0.546274215;float SH_C3[7];SH_C3[0]=-0.59004358;SH_C3[1]=2.890611442;SH_C3[2]=-0.45704579;SH_C3[3]=0.373176332;SH_C3[4]=-0.45704579;SH_C3[5]=1.445305721;SH_C3[6]=-0.59004358;vec3 result=/*SH_C0**/sh[0];\n#if SH_DEGREE>0\nfloat x=dir.x;float y=dir.y;float z=dir.z;result+=- SH_C1*y*sh[1]+SH_C1*z*sh[2]-SH_C1*x*sh[3];\n#if SH_DEGREE>1\nfloat xx=x*x,yy=y*y,zz=z*z;float xy=x*y,yz=y*z,xz=x*z;result+=\nSH_C2[0]*xy*sh[4] +\nSH_C2[1]*yz*sh[5] +\nSH_C2[2]*(2.0*zz-xx-yy)*sh[6] +\nSH_C2[3]*xz*sh[7] +\nSH_C2[4]*(xx-yy)*sh[8];\n#if SH_DEGREE>2\nresult+=\nSH_C3[0]*y*(3.0*xx-yy)*sh[9] +\nSH_C3[1]*xy*z*sh[10] +\nSH_C3[2]*y*(4.0*zz-xx-yy)*sh[11] +\nSH_C3[3]*z*(2.0*zz-3.0*xx-3.0*yy)*sh[12] +\nSH_C3[4]*x*(4.0*zz-xx-yy)*sh[13] +\nSH_C3[5]*z*(xx-yy)*sh[14] +\nSH_C3[6]*x*(xx-3.0*yy)*sh[15];\n#endif\n#endif\n#endif\nreturn result;}\nvec4 decompose(uint value)\n{vec4 components=vec4(\nfloat((value ) & 255u),\nfloat((value>>uint( 8)) & 255u),\nfloat((value>>uint(16)) & 255u),\nfloat((value>>uint(24)) & 255u));return components*vec4(2./255.)-vec4(1.);}\nvec3 computeSH(Splat splat,vec3 dir)\n{vec3 sh[16];sh[0]=vec3(0.,0.,0.);\n#if SH_DEGREE>0\nvec4 sh00=decompose(splat.sh0.x);vec4 sh01=decompose(splat.sh0.y);vec4 sh02=decompose(splat.sh0.z);sh[1]=vec3(sh00.x,sh00.y,sh00.z);sh[2]=vec3(sh00.w,sh01.x,sh01.y);sh[3]=vec3(sh01.z,sh01.w,sh02.x);\n#endif\n#if SH_DEGREE>1\nvec4 sh03=decompose(splat.sh0.w);vec4 sh04=decompose(splat.sh1.x);vec4 sh05=decompose(splat.sh1.y);sh[4]=vec3(sh02.y,sh02.z,sh02.w);sh[5]=vec3(sh03.x,sh03.y,sh03.z);sh[6]=vec3(sh03.w,sh04.x,sh04.y);sh[7]=vec3(sh04.z,sh04.w,sh05.x);sh[8]=vec3(sh05.y,sh05.z,sh05.w);\n#endif\n#if SH_DEGREE>2\nvec4 sh06=decompose(splat.sh1.z);vec4 sh07=decompose(splat.sh1.w);vec4 sh08=decompose(splat.sh2.x);vec4 sh09=decompose(splat.sh2.y);vec4 sh10=decompose(splat.sh2.z);vec4 sh11=decompose(splat.sh2.w);sh[9]=vec3(sh06.x,sh06.y,sh06.z);sh[10]=vec3(sh06.w,sh07.x,sh07.y);sh[11]=vec3(sh07.z,sh07.w,sh08.x);sh[12]=vec3(sh08.y,sh08.z,sh08.w);sh[13]=vec3(sh09.x,sh09.y,sh09.z);sh[14]=vec3(sh09.w,sh10.x,sh10.y);sh[15]=vec3(sh10.z,sh10.w,sh11.x); \n#endif\nreturn computeColorFromSHDegree(dir,sh);}\n#else\nvec3 computeSH(Splat splat,vec3 dir)\n{return vec3(0.,0.,0.);}\n#endif\nvec4 gaussianSplatting(vec2 meshPos,vec3 worldPos,vec2 scale,vec3 covA,vec3 covB,mat4 worldMatrix,mat4 viewMatrix,mat4 projectionMatrix)\n{mat4 modelView=viewMatrix*worldMatrix;vec4 camspace=viewMatrix*vec4(worldPos,1.);vec4 pos2d=projectionMatrix*camspace;float bounds=1.2*pos2d.w;if (pos2d.z<-pos2d.w || pos2d.x<-bounds || pos2d.x>bounds\n|| pos2d.y<-bounds || pos2d.y>bounds) {return vec4(0.0,0.0,2.0,1.0);}\nmat3 Vrk=mat3(\ncovA.x,covA.y,covA.z,\ncovA.y,covB.x,covB.y,\ncovA.z,covB.y,covB.z\n);bool isOrtho=abs(projectionMatrix[3][3]-1.0)<0.001;mat3 J;if (isOrtho) {J=mat3(\nfocal.x,0.,0.,\n0.,focal.y,0.,\n0.,0.,0.\n);} else {J=mat3(\nfocal.x/camspace.z,0.,-(focal.x*camspace.x)/(camspace.z*camspace.z),\n0.,focal.y/camspace.z,-(focal.y*camspace.y)/(camspace.z*camspace.z),\n0.,0.,0.\n);}\nmat3
|
|
1
|
+
{"version":3,"file":"gaussianSplatting.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/gaussianSplatting.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,mBAAmB,CAAC;AACjC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kEA+GmD,CAAC;AACnE,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"gaussianSplatting\";\nconst shader = `#if !defined(WEBGL2) && !defined(WEBGPU) && !defined(NATIVE)\nmat3 transpose(mat3 matrix) {return mat3(matrix[0][0],matrix[1][0],matrix[2][0],\nmatrix[0][1],matrix[1][1],matrix[2][1],\nmatrix[0][2],matrix[1][2],matrix[2][2]);}\n#endif\nvec2 getDataUV(float index,vec2 textureSize) {float y=floor(index/textureSize.x);float x=index-y*textureSize.x;return vec2((x+0.5)/textureSize.x,(y+0.5)/textureSize.y);}\n#if SH_DEGREE>0\nivec2 getDataUVint(float index,vec2 textureSize) {float y=floor(index/textureSize.x);float x=index-y*textureSize.x;return ivec2(uint(x+0.5),uint(y+0.5));}\n#endif\nstruct Splat {vec4 center;vec4 color;vec4 covA;vec4 covB;\n#if SH_DEGREE>0\nuvec4 sh0; \n#endif\n#if SH_DEGREE>1\nuvec4 sh1;\n#endif\n#if SH_DEGREE>2\nuvec4 sh2;\n#endif\n};float getSplatIndex(int localIndex)\n{float splatIndex;switch (localIndex)\n{case 0: splatIndex=splatIndex0.x; break;case 1: splatIndex=splatIndex0.y; break;case 2: splatIndex=splatIndex0.z; break;case 3: splatIndex=splatIndex0.w; break;case 4: splatIndex=splatIndex1.x; break;case 5: splatIndex=splatIndex1.y; break;case 6: splatIndex=splatIndex1.z; break;case 7: splatIndex=splatIndex1.w; break;case 8: splatIndex=splatIndex2.x; break;case 9: splatIndex=splatIndex2.y; break;case 10: splatIndex=splatIndex2.z; break;case 11: splatIndex=splatIndex2.w; break;case 12: splatIndex=splatIndex3.x; break;case 13: splatIndex=splatIndex3.y; break;case 14: splatIndex=splatIndex3.z; break;case 15: splatIndex=splatIndex3.w; break;}\nreturn splatIndex;}\nSplat readSplat(float splatIndex)\n{Splat splat;vec2 splatUV=getDataUV(splatIndex,dataTextureSize);splat.center=texture2D(centersTexture,splatUV);splat.color=texture2D(colorsTexture,splatUV);splat.covA=texture2D(covariancesATexture,splatUV)*splat.center.w;splat.covB=texture2D(covariancesBTexture,splatUV)*splat.center.w;\n#if SH_DEGREE>0\nivec2 splatUVint=getDataUVint(splatIndex,dataTextureSize);splat.sh0=texelFetch(shTexture0,splatUVint,0);\n#endif\n#if SH_DEGREE>1\nsplat.sh1=texelFetch(shTexture1,splatUVint,0);\n#endif\n#if SH_DEGREE>2\nsplat.sh2=texelFetch(shTexture2,splatUVint,0);\n#endif\nreturn splat;}\n#if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE)\nvec3 computeColorFromSHDegree(vec3 dir,const vec3 sh[16])\n{const float SH_C0=0.28209479;const float SH_C1=0.48860251;float SH_C2[5];SH_C2[0]=1.092548430;SH_C2[1]=-1.09254843;SH_C2[2]=0.315391565;SH_C2[3]=-1.09254843;SH_C2[4]=0.546274215;float SH_C3[7];SH_C3[0]=-0.59004358;SH_C3[1]=2.890611442;SH_C3[2]=-0.45704579;SH_C3[3]=0.373176332;SH_C3[4]=-0.45704579;SH_C3[5]=1.445305721;SH_C3[6]=-0.59004358;vec3 result=/*SH_C0**/sh[0];\n#if SH_DEGREE>0\nfloat x=dir.x;float y=dir.y;float z=dir.z;result+=- SH_C1*y*sh[1]+SH_C1*z*sh[2]-SH_C1*x*sh[3];\n#if SH_DEGREE>1\nfloat xx=x*x,yy=y*y,zz=z*z;float xy=x*y,yz=y*z,xz=x*z;result+=\nSH_C2[0]*xy*sh[4] +\nSH_C2[1]*yz*sh[5] +\nSH_C2[2]*(2.0*zz-xx-yy)*sh[6] +\nSH_C2[3]*xz*sh[7] +\nSH_C2[4]*(xx-yy)*sh[8];\n#if SH_DEGREE>2\nresult+=\nSH_C3[0]*y*(3.0*xx-yy)*sh[9] +\nSH_C3[1]*xy*z*sh[10] +\nSH_C3[2]*y*(4.0*zz-xx-yy)*sh[11] +\nSH_C3[3]*z*(2.0*zz-3.0*xx-3.0*yy)*sh[12] +\nSH_C3[4]*x*(4.0*zz-xx-yy)*sh[13] +\nSH_C3[5]*z*(xx-yy)*sh[14] +\nSH_C3[6]*x*(xx-3.0*yy)*sh[15];\n#endif\n#endif\n#endif\nreturn result;}\nvec4 decompose(uint value)\n{vec4 components=vec4(\nfloat((value ) & 255u),\nfloat((value>>uint( 8)) & 255u),\nfloat((value>>uint(16)) & 255u),\nfloat((value>>uint(24)) & 255u));return components*vec4(2./255.)-vec4(1.);}\nvec3 computeSH(Splat splat,vec3 dir)\n{vec3 sh[16];sh[0]=vec3(0.,0.,0.);\n#if SH_DEGREE>0\nvec4 sh00=decompose(splat.sh0.x);vec4 sh01=decompose(splat.sh0.y);vec4 sh02=decompose(splat.sh0.z);sh[1]=vec3(sh00.x,sh00.y,sh00.z);sh[2]=vec3(sh00.w,sh01.x,sh01.y);sh[3]=vec3(sh01.z,sh01.w,sh02.x);\n#endif\n#if SH_DEGREE>1\nvec4 sh03=decompose(splat.sh0.w);vec4 sh04=decompose(splat.sh1.x);vec4 sh05=decompose(splat.sh1.y);sh[4]=vec3(sh02.y,sh02.z,sh02.w);sh[5]=vec3(sh03.x,sh03.y,sh03.z);sh[6]=vec3(sh03.w,sh04.x,sh04.y);sh[7]=vec3(sh04.z,sh04.w,sh05.x);sh[8]=vec3(sh05.y,sh05.z,sh05.w);\n#endif\n#if SH_DEGREE>2\nvec4 sh06=decompose(splat.sh1.z);vec4 sh07=decompose(splat.sh1.w);vec4 sh08=decompose(splat.sh2.x);vec4 sh09=decompose(splat.sh2.y);vec4 sh10=decompose(splat.sh2.z);vec4 sh11=decompose(splat.sh2.w);sh[9]=vec3(sh06.x,sh06.y,sh06.z);sh[10]=vec3(sh06.w,sh07.x,sh07.y);sh[11]=vec3(sh07.z,sh07.w,sh08.x);sh[12]=vec3(sh08.y,sh08.z,sh08.w);sh[13]=vec3(sh09.x,sh09.y,sh09.z);sh[14]=vec3(sh09.w,sh10.x,sh10.y);sh[15]=vec3(sh10.z,sh10.w,sh11.x); \n#endif\nreturn computeColorFromSHDegree(dir,sh);}\n#else\nvec3 computeSH(Splat splat,vec3 dir)\n{return vec3(0.,0.,0.);}\n#endif\nvec4 gaussianSplatting(vec2 meshPos,vec3 worldPos,vec2 scale,vec3 covA,vec3 covB,mat4 worldMatrix,mat4 viewMatrix,mat4 projectionMatrix)\n{mat4 modelView=viewMatrix*worldMatrix;vec4 camspace=viewMatrix*vec4(worldPos,1.);vec4 pos2d=projectionMatrix*camspace;float bounds=1.2*pos2d.w;if (pos2d.z<-pos2d.w || pos2d.x<-bounds || pos2d.x>bounds\n|| pos2d.y<-bounds || pos2d.y>bounds) {return vec4(0.0,0.0,2.0,1.0);}\nmat3 Vrk=mat3(\ncovA.x,covA.y,covA.z,\ncovA.y,covB.x,covB.y,\ncovA.z,covB.y,covB.z\n);bool isOrtho=abs(projectionMatrix[3][3]-1.0)<0.001;mat3 J;if (isOrtho) {J=mat3(\nfocal.x,0.,0.,\n0.,focal.y,0.,\n0.,0.,0.\n);} else {J=mat3(\nfocal.x/camspace.z,0.,-(focal.x*camspace.x)/(camspace.z*camspace.z),\n0.,focal.y/camspace.z,-(focal.y*camspace.y)/(camspace.z*camspace.z),\n0.,0.,0.\n);}\nmat3 T=transpose(mat3(modelView))*J;mat3 cov2d=transpose(T)*Vrk*T;\n#if COMPENSATION\nfloat c00=cov2d[0][0];float c11=cov2d[1][1];float c01=cov2d[0][1];float detOrig=c00*c11-c01*c01;\n#endif\ncov2d[0][0]+=kernelSize;cov2d[1][1]+=kernelSize;\n#if COMPENSATION\nvec3 c2d=vec3(cov2d[0][0],c01,cov2d[1][1]);float detBlur=c2d.x*c2d.z-c2d.y*c2d.y;float compensation=sqrt(max(0.,detOrig/detBlur));vColor.w*=compensation;\n#endif\nfloat mid=(cov2d[0][0]+cov2d[1][1])/2.0;float radius=length(vec2((cov2d[0][0]-cov2d[1][1])/2.0,cov2d[0][1]));float epsilon=0.0001;float lambda1=mid+radius+epsilon,lambda2=mid-radius+epsilon;if (lambda2<0.0)\n{return vec4(0.0,0.0,2.0,1.0);}\nvec2 diagonalVector=normalize(vec2(cov2d[0][1],lambda1-cov2d[0][0]));vec2 majorAxis=min(sqrt(2.0*lambda1),1024.0)*diagonalVector;vec2 minorAxis=min(sqrt(2.0*lambda2),1024.0)*vec2(diagonalVector.y,-diagonalVector.x);vec2 vCenter=vec2(pos2d);float scaleFactor=isOrtho ? 1.0 : pos2d.w;return vec4(\nvCenter \n+ ((meshPos.x*majorAxis\n+ meshPos.y*minorAxis)*invViewport*scaleFactor)*scale,pos2d.zw);}`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const gaussianSplatting = { name, shader };\n"]}
|
|
@@ -19,7 +19,7 @@ const shader = `#include<__decl__gaussianSplattingVertex>
|
|
|
19
19
|
#include<fogVertexDeclaration>
|
|
20
20
|
#include<logDepthDeclaration>
|
|
21
21
|
#include<helperFunctions>
|
|
22
|
-
uniform vec2 invViewport;uniform vec2 dataTextureSize;uniform vec2 focal;uniform float kernelSize;uniform vec3 eyePosition;uniform
|
|
22
|
+
uniform vec2 invViewport;uniform vec2 dataTextureSize;uniform vec2 focal;uniform float kernelSize;uniform vec3 eyePosition;uniform float alpha;uniform sampler2D covariancesATexture;uniform sampler2D covariancesBTexture;uniform sampler2D centersTexture;uniform sampler2D colorsTexture;
|
|
23
23
|
#if SH_DEGREE>0
|
|
24
24
|
uniform highp usampler2D shTexture0;
|
|
25
25
|
#endif
|
|
@@ -33,7 +33,7 @@ varying vec4 vColor;varying vec2 vPosition;
|
|
|
33
33
|
#include<gaussianSplatting>
|
|
34
34
|
void main () {float splatIndex=getSplatIndex(int(position.z+0.5));Splat splat=readSplat(splatIndex);vec3 covA=splat.covA.xyz;vec3 covB=vec3(splat.covA.w,splat.covB.xy);vec4 worldPos=world*vec4(splat.center.xyz,1.0);vColor=splat.color;vPosition=position.xy;
|
|
35
35
|
#if SH_DEGREE>0
|
|
36
|
-
mat3 worldRot=mat3(world);mat3 normWorldRot=inverseMat3(worldRot);vec3
|
|
36
|
+
mat3 worldRot=mat3(world);mat3 normWorldRot=inverseMat3(worldRot);vec3 eyeToSplatLocalSpace=normalize(normWorldRot*(worldPos.xyz-eyePosition));vColor.xyz=splat.color.xyz+computeSH(splat,eyeToSplatLocalSpace);
|
|
37
37
|
#endif
|
|
38
38
|
vColor.w*=alpha;gl_Position=gaussianSplatting(position.xy,worldPos.xyz,vec2(1.,1.),covA,covB,world,view,projection);
|
|
39
39
|
#include<clipPlaneVertex>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gaussianSplatting.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/gaussianSplatting.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,qDAAqD,CAAC;AAC7D,OAAO,kDAAkD,CAAC;AAC1D,OAAO,6CAA6C,CAAC;AACrD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,oCAAoC,CAAC;AAC5C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,4BAA4B,CAAC;AACpC,OAAO,iCAAiC,CAAC;AAEzC,MAAM,IAAI,GAAG,+BAA+B,CAAC;AAC7C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Bd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport \"./ShadersInclude/gaussianSplattingVertexDeclaration\";\nimport \"./ShadersInclude/gaussianSplattingUboDeclaration\";\nimport \"./ShadersInclude/clipPlaneVertexDeclaration\";\nimport \"./ShadersInclude/fogVertexDeclaration\";\nimport \"./ShadersInclude/logDepthDeclaration\";\nimport \"./ShadersInclude/helperFunctions\";\nimport \"./ShadersInclude/gaussianSplatting\";\nimport \"./ShadersInclude/clipPlaneVertex\";\nimport \"./ShadersInclude/fogVertex\";\nimport \"./ShadersInclude/logDepthVertex\";\n\nconst name = \"gaussianSplattingVertexShader\";\nconst shader = `#include<__decl__gaussianSplattingVertex>\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\n#include<clipPlaneVertexDeclaration>\n#include<fogVertexDeclaration>\n#include<logDepthDeclaration>\n#include<helperFunctions>\nuniform vec2 invViewport;uniform vec2 dataTextureSize;uniform vec2 focal;uniform float kernelSize;uniform vec3 eyePosition;uniform
|
|
1
|
+
{"version":3,"file":"gaussianSplatting.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/gaussianSplatting.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,qDAAqD,CAAC;AAC7D,OAAO,kDAAkD,CAAC;AAC1D,OAAO,6CAA6C,CAAC;AACrD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,oCAAoC,CAAC;AAC5C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,4BAA4B,CAAC;AACpC,OAAO,iCAAiC,CAAC;AAEzC,MAAM,IAAI,GAAG,+BAA+B,CAAC;AAC7C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Bd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport \"./ShadersInclude/gaussianSplattingVertexDeclaration\";\nimport \"./ShadersInclude/gaussianSplattingUboDeclaration\";\nimport \"./ShadersInclude/clipPlaneVertexDeclaration\";\nimport \"./ShadersInclude/fogVertexDeclaration\";\nimport \"./ShadersInclude/logDepthDeclaration\";\nimport \"./ShadersInclude/helperFunctions\";\nimport \"./ShadersInclude/gaussianSplatting\";\nimport \"./ShadersInclude/clipPlaneVertex\";\nimport \"./ShadersInclude/fogVertex\";\nimport \"./ShadersInclude/logDepthVertex\";\n\nconst name = \"gaussianSplattingVertexShader\";\nconst shader = `#include<__decl__gaussianSplattingVertex>\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\n#include<clipPlaneVertexDeclaration>\n#include<fogVertexDeclaration>\n#include<logDepthDeclaration>\n#include<helperFunctions>\nuniform vec2 invViewport;uniform vec2 dataTextureSize;uniform vec2 focal;uniform float kernelSize;uniform vec3 eyePosition;uniform float alpha;uniform sampler2D covariancesATexture;uniform sampler2D covariancesBTexture;uniform sampler2D centersTexture;uniform sampler2D colorsTexture;\n#if SH_DEGREE>0\nuniform highp usampler2D shTexture0;\n#endif\n#if SH_DEGREE>1\nuniform highp usampler2D shTexture1;\n#endif\n#if SH_DEGREE>2\nuniform highp usampler2D shTexture2;\n#endif\nvarying vec4 vColor;varying vec2 vPosition;\n#include<gaussianSplatting>\nvoid main () {float splatIndex=getSplatIndex(int(position.z+0.5));Splat splat=readSplat(splatIndex);vec3 covA=splat.covA.xyz;vec3 covB=vec3(splat.covA.w,splat.covB.xy);vec4 worldPos=world*vec4(splat.center.xyz,1.0);vColor=splat.color;vPosition=position.xy;\n#if SH_DEGREE>0\nmat3 worldRot=mat3(world);mat3 normWorldRot=inverseMat3(worldRot);vec3 eyeToSplatLocalSpace=normalize(normWorldRot*(worldPos.xyz-eyePosition));vColor.xyz=splat.color.xyz+computeSH(splat,eyeToSplatLocalSpace);\n#endif\nvColor.w*=alpha;gl_Position=gaussianSplatting(position.xy,worldPos.xyz,vec2(1.,1.),covA,covB,world,view,projection);\n#include<clipPlaneVertex>\n#include<fogVertex>\n#include<logDepthVertex>\n}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const gaussianSplattingVertexShader = { name, shader };\n"]}
|