@babylonjs/core 9.10.0 → 9.11.0
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/AudioV2/abstractAudio/subNodes/audioAnalyzerSubNode.d.ts +2 -0
- package/AudioV2/abstractAudio/subNodes/audioAnalyzerSubNode.js.map +1 -1
- package/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.d.ts +13 -3
- package/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.js +16 -0
- package/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.js.map +1 -1
- package/AudioV2/abstractAudio/subProperties/audioAnalyzer.d.ts +4 -0
- package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js +22 -0
- package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js.map +1 -1
- package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.d.ts +6 -0
- package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.js +22 -5
- package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.js.map +1 -1
- package/Compute/computeEffect.d.ts +6 -0
- package/Compute/computeEffect.js +3 -0
- package/Compute/computeEffect.js.map +1 -1
- package/Compute/computeShader.pure.d.ts +4 -0
- package/Compute/computeShader.pure.js +1 -0
- package/Compute/computeShader.pure.js.map +1 -1
- package/DeviceInput/webDeviceInputSystem.js +7 -1
- package/DeviceInput/webDeviceInputSystem.js.map +1 -1
- package/Engines/Native/nativeInterfaces.d.ts +10 -1
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.computeShader.pure.js +154 -2
- package/Engines/WebGPU/Extensions/engine.computeShader.pure.js.map +1 -1
- package/Engines/abstractEngine.pure.d.ts +7 -1
- package/Engines/abstractEngine.pure.js +34 -4
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/engine.common.js +61 -1
- package/Engines/engine.common.js.map +1 -1
- package/Engines/engine.pure.d.ts +0 -7
- package/Engines/engine.pure.js +0 -34
- package/Engines/engine.pure.js.map +1 -1
- package/Engines/thinNativeEngine.pure.js +15 -8
- package/Engines/thinNativeEngine.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.d.ts +8 -0
- package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js +26 -0
- package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js.map +1 -1
- package/Materials/PBR/pbrMaterial.pure.d.ts +6 -0
- package/Materials/PBR/pbrMaterial.pure.js +8 -0
- package/Materials/PBR/pbrMaterial.pure.js.map +1 -1
- package/Materials/Textures/Procedurals/noiseProceduralTexture.pure.js +17 -5
- package/Materials/Textures/Procedurals/noiseProceduralTexture.pure.js.map +1 -1
- package/Materials/effect.pure.d.ts +2 -2
- package/Materials/effect.pure.js +12 -6
- package/Materials/effect.pure.js.map +1 -1
- package/Materials/meshDebugPluginMaterial.pure.js +15 -13
- package/Materials/meshDebugPluginMaterial.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingDebugger.pure.d.ts +2 -0
- package/Meshes/GaussianSplatting/gaussianSplattingDebugger.pure.js +17 -0
- package/Meshes/GaussianSplatting/gaussianSplattingDebugger.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +4 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +6 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +8 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
- package/Misc/tools.pure.js +11 -4
- package/Misc/tools.pure.js.map +1 -1
- package/Particles/computeShaderParticleSystem.pure.js +5 -1
- package/Particles/computeShaderParticleSystem.pure.js.map +1 -1
- package/Particles/gpuParticleSystem.pure.d.ts +1 -0
- package/Particles/gpuParticleSystem.pure.js +17 -1
- package/Particles/gpuParticleSystem.pure.js.map +1 -1
- package/ShadersWGSL/gpuRenderParticles.fragment.d.ts +5 -0
- package/ShadersWGSL/gpuRenderParticles.fragment.js +50 -0
- package/ShadersWGSL/gpuRenderParticles.fragment.js.map +1 -0
- package/ShadersWGSL/gpuRenderParticles.vertex.d.ts +5 -0
- package/ShadersWGSL/gpuRenderParticles.vertex.js +120 -0
- package/ShadersWGSL/gpuRenderParticles.vertex.js.map +1 -0
- package/ShadersWGSL/noise.fragment.d.ts +5 -0
- package/ShadersWGSL/noise.fragment.js +18 -0
- package/ShadersWGSL/noise.fragment.js.map +1 -0
- package/SmartAssets/index.d.ts +1 -1
- package/SmartAssets/index.js +1 -1
- package/SmartAssets/index.js.map +1 -1
- package/SmartAssets/pure.d.ts +1 -0
- package/SmartAssets/pure.js +1 -0
- package/SmartAssets/pure.js.map +1 -1
- package/SmartAssets/{smartAssetManager.js → smartAssetManager.pure.js} +30 -17
- package/SmartAssets/smartAssetManager.pure.js.map +1 -0
- package/package.json +1 -1
- package/SmartAssets/smartAssetManager.js.map +0 -1
- /package/SmartAssets/{smartAssetManager.d.ts → smartAssetManager.pure.d.ts} +0 -0
|
@@ -16,8 +16,8 @@ flat varying float dbg_vPass;
|
|
|
16
16
|
const vertexDefinitionsWebGPU = `#if defined(DBG_ENABLED)
|
|
17
17
|
attribute dbg_initialPass: f32;
|
|
18
18
|
varying dbg_vBarycentric: vec3f;
|
|
19
|
-
varying dbg_vVertexWorldPos: vec3f;
|
|
20
|
-
varying dbg_vPass: f32;
|
|
19
|
+
flat varying dbg_vVertexWorldPos: vec3f;
|
|
20
|
+
flat varying dbg_vPass: f32;
|
|
21
21
|
#endif`;
|
|
22
22
|
const vertexMainEnd = `#if defined(DBG_ENABLED)
|
|
23
23
|
float dbg_vertexIndex = mod(float(gl_VertexID), 3.);
|
|
@@ -136,8 +136,8 @@ flat varying float dbg_vPass;
|
|
|
136
136
|
#endif`;
|
|
137
137
|
const fragmentDefinitionsWebGPU = `#if defined(DBG_ENABLED)
|
|
138
138
|
varying dbg_vBarycentric: vec3f;
|
|
139
|
-
varying dbg_vVertexWorldPos: vec3f;
|
|
140
|
-
varying dbg_vPass: f32;
|
|
139
|
+
flat varying dbg_vVertexWorldPos: vec3f;
|
|
140
|
+
flat varying dbg_vPass: f32;
|
|
141
141
|
|
|
142
142
|
#if !defined(DBG_MULTIPLY)
|
|
143
143
|
fn dbg_applyShading(color: vec3f) -> vec3f {
|
|
@@ -163,10 +163,10 @@ varying dbg_vPass: f32;
|
|
|
163
163
|
|
|
164
164
|
#if DBG_MODE == 2 || DBG_MODE == 3
|
|
165
165
|
fn dbg_cornerFactor() -> f32 {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
166
|
+
let worldPos = fragmentInputs.vPositionW;
|
|
167
|
+
let dist = length(worldPos - fragmentInputs.dbg_vVertexWorldPos);
|
|
168
|
+
let camDist = length(worldPos - scene.vEyePosition.xyz);
|
|
169
|
+
let d = sqrt(camDist) * .001;
|
|
170
170
|
return smoothstep((uniforms.dbg_thicknessRadiusScale.y * d), ((uniforms.dbg_thicknessRadiusScale.y * 1.01) * d), dist);
|
|
171
171
|
}
|
|
172
172
|
#endif
|
|
@@ -175,7 +175,7 @@ varying dbg_vPass: f32;
|
|
|
175
175
|
fn dbg_checkerboardFactor(uv: vec2f) -> f32 {
|
|
176
176
|
var f = fract(uv * uniforms.dbg_thicknessRadiusScale.z);
|
|
177
177
|
f -= .5;
|
|
178
|
-
return (f.x * f.y) > 0.
|
|
178
|
+
return select(0.0, 1.0, (f.x * f.y) > 0.0);
|
|
179
179
|
}
|
|
180
180
|
#endif
|
|
181
181
|
#endif`;
|
|
@@ -215,9 +215,11 @@ var dbg_color = vec3f(1.);
|
|
|
215
215
|
#if DBG_MODE == 1
|
|
216
216
|
dbg_color = mix(uniforms.dbg_wireframeTrianglesColor, vec3f(1.), dbg_edgeFactor());
|
|
217
217
|
#elif DBG_MODE == 2 || DBG_MODE == 3
|
|
218
|
-
|
|
219
|
-
if (fragmentInputs.dbg_vPass == 0. && dbg_cornerFactor == 1.)
|
|
220
|
-
|
|
218
|
+
let dbg_cornerFactor = dbg_cornerFactor();
|
|
219
|
+
if (fragmentInputs.dbg_vPass == 0.0 && dbg_cornerFactor == 1.0) {
|
|
220
|
+
discard;
|
|
221
|
+
}
|
|
222
|
+
dbg_color = mix(uniforms.dbg_vertexColor, vec3f(1.), dbg_cornerFactor);
|
|
221
223
|
#if DBG_MODE == 3
|
|
222
224
|
dbg_color *= mix(uniforms.dbg_wireframeVerticesColor, vec3f(1.), dbg_edgeFactor());
|
|
223
225
|
#endif
|
|
@@ -235,7 +237,7 @@ var dbg_color = vec3f(1.);
|
|
|
235
237
|
fragmentOutputs.color *= vec4f(dbg_color, 1.);
|
|
236
238
|
#else
|
|
237
239
|
#if DBG_MODE != 6
|
|
238
|
-
fragmentOutputs.color = vec4f(dbg_applyShading(dbg_shadedDiffuseColor) * dbg_color, 1.);
|
|
240
|
+
fragmentOutputs.color = vec4f(dbg_applyShading(uniforms.dbg_shadedDiffuseColor) * dbg_color, 1.);
|
|
239
241
|
#else
|
|
240
242
|
fragmentOutputs.color = vec4f(dbg_color, 1.);
|
|
241
243
|
#endif
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meshDebugPluginMaterial.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/meshDebugPluginMaterial.pure.ts"],"names":[],"mappings":"AAAA,6DAA6D;;AAE7D,yDAAyD;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAI/D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGtF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,iBAAiB,GAAG;;;;;OAKnB,CAAC;AAER,MAAM,uBAAuB,GAAG;;;;;OAKzB,CAAC;AAER,MAAM,aAAa,GAAG;;;;;;;;;;;;;;OAcf,CAAC;AAER,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;OAcrB,CAAC;AAER,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;OAmBlB,CAAC;AAER,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;OAmBxB,CAAC;AAER,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4CrB,CAAC;AAER,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4C3B,CAAC;AAER,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BjB,CAAC;AAER,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BvB,CAAC;AAER,MAAM,qBAAqB,GAAG;IAC1B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC;IAC3B,IAAI,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IACzB,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;IAC3B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;IAC1B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;IAC3B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IACzB,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC;IACzB,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAN,IAAkB,aAoCjB;AApCD,WAAkB,aAAa;IAC3B;;OAEG;IACH,iDAAQ,CAAA;IACR;;;OAGG;IACH,2DAAa,CAAA;IACb;;;OAGG;IACH,yDAAY,CAAA;IACZ;;;OAGG;IACH,6EAAsB,CAAA;IACtB;;OAEG;IACH,+CAAO,CAAA;IACP;;OAEG;IACH,+CAAO,CAAA;IACP;;OAEG;IACH,iEAAgB,CAAA;IAChB;;OAEG;IACH,+DAAe,CAAA;AACnB,CAAC,EApCiB,aAAa,KAAb,aAAa,QAoC9B;AAyED,gBAAgB;AAChB,MAAM,gBAAiB,SAAQ,eAAe;IAA9C;;QACI;;;WAGG;QACH,aAAQ,8BAAqC;QAC7C;;;WAGG;QACH,iBAAY,GAAY,IAAI,CAAC;QAC7B;;;WAGG;QACH,gBAAW,GAAY,IAAI,CAAC;IAChC,CAAC;CAAA;AAED;;;GAGG;AACH,MAAM,OAAO,uBAAwB,SAAQ,kBAAkB;IA0H3D,gBAAgB;IACN,sBAAsB;QAC5B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9B,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACa,YAAY,CAAC,cAA8B;QACvD,QAAQ,cAAc,EAAE,CAAC;YACrB,iCAAyB;YACzB;gBACI,OAAO,IAAI,CAAC;YAChB;gBACI,OAAO,KAAK,CAAC;QACrB,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,YAAY,QAA4C,EAAE,UAA4B,EAAE;QACpF,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACvC,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC;QACpD,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;QAChE,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAEvD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpF,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,EAAE,CAAC;QAC7D,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,GAAG,CAAC;QAC5D,IAAI,CAAC,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,IAAI,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,IAAI,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1F,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAE9E,IAAI,CAAC,cAAc,GAAG,uBAAuB,CAAC,cAAc,CAAC,uBAAuB,CAAC,YAAY,EAAE,GAAG,uBAAuB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACrJ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACa,YAAY;QACxB,OAAO,yBAAyB,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IACD;;;OAGG;IACH,IAAW,SAAS,CAAC,KAAc;QAC/B,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YAC5B,OAAO;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;YACxG,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;YACvE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,OAAO;QACX,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACa,cAAc,CAAC,OAAyB,EAAE,KAAY,EAAE,IAAkB;QACtF,IACI,CAAC,IAAI,CAAC,KAAK,kCAA0B,IAAI,IAAI,CAAC,KAAK,mCAA2B,IAAI,IAAI,CAAC,KAAK,4CAAoC,CAAC;YACjI,CAAC,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,EAChD,CAAC;YACC,MAAM,CAAC,IAAI,CACP,8JAA8J,EAC9J,CAAC,CACJ,CAAC;QACN,CAAC;QAED,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC9B,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC;QACtC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACa,aAAa,CAAC,UAAoB;QAC9C,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACa,WAAW,CAAC,cAAc,8BAAsB;QAC5D,OAAO;YACH,GAAG,EAAE;gBACD,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;gBACzD,EAAE,IAAI,EAAE,8BAA8B,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,2CAA2C;gBAC5G,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,4CAA4C;gBACzG,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;gBAC9D,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;gBAC7D,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;gBAClD,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;gBACrD,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;gBACvD,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;aACvD;YACD,QAAQ,EAAE,cAAc,gCAAwB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,sBAAsB;SAC/F,CAAC;IACN,CAAC;IAED;;;OAGG;IACa,cAAc,CAAC,aAA4B;QACvD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QACD,aAAa,CAAC,YAAY,CAAC,wBAAwB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACtI,aAAa,CAAC,YAAY,CAAC,8BAA8B,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACzK,aAAa,CAAC,YAAY,CAAC,0BAA0B,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjH,aAAa,CAAC,YAAY,CAAC,6BAA6B,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACxF,aAAa,CAAC,YAAY,CAAC,4BAA4B,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACtF,aAAa,CAAC,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAChE,aAAa,CAAC,YAAY,CAAC,oBAAoB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACtE,aAAa,CAAC,YAAY,CAAC,sBAAsB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC1E,aAAa,CAAC,YAAY,CAAC,mBAAmB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IACzE,CAAC;IAED;;;;;OAKG;IACa,aAAa,CAAC,UAAkB,EAAE,cAAc,8BAAsB;QAClF,IAAI,cAAc,gCAAwB,EAAE,CAAC;YACzC,OAAO,UAAU,KAAK,QAAQ;gBAC1B,CAAC,CAAC;oBACI,yBAAyB,EAAE,uBAAuB;oBAClD,sBAAsB,EAAE,mBAAmB;iBAC9C;gBACH,CAAC,CAAC;oBACI,2BAA2B,EAAE,yBAAyB;oBACtD,wBAAwB,EAAE,qBAAqB;iBAClD,CAAC;QACZ,CAAC;QAED,OAAO,UAAU,KAAK,QAAQ;YAC1B,CAAC,CAAC;gBACI,yBAAyB,EAAE,iBAAiB;gBAC5C,sBAAsB,EAAE,aAAa;aACxC;YACH,CAAC,CAAC;gBACI,2BAA2B,EAAE,mBAAmB;gBAChD,wBAAwB,EAAE,eAAe;aAC5C,CAAC;IACZ,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,KAAK;QACf,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,qBAAqB,CAAC;IAChD,CAAC;IAED;;;;;;;;OAQG;IACI,MAAM,CAAC,sCAAsC,CAAC,IAAU,EAAE,iBAA0B,KAAK;QAC5F,IAAI,QAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;QAExB,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC;YAC9B,OAAO,QAAQ,CAAC;QACpB,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAG,CAAC;YACnC,MAAM,IAAI,GAAmC,EAAE,CAAC;YAChD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAE,CAAC;YAC7C,CAAC;YAED,QAAQ,GAAG;gBACP,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACvB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAE,CAAC,aAAa,EAAE,CAAC;oBAC3D,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;gBAC9D,CAAC;gBACD,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;YAC/C,CAAC,CAAC;QACN,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAG,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QAE7C,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAEzB,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAG,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1D,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QAE7C,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9D,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAExD,OAAO,QAAQ,CAAC;IACpB,CAAC;;AAjXD;;;GAGG;AACY,oCAAY,GAAW,CAAC,CAAC;AAExC;;;GAGG;AACW,sCAAc,GAAa,qBAAqB,CAAC;AAOvD;IADP,iBAAiB,EAAE;+DACW;AAOvB;IADP,SAAS,EAAE;2DACgB;AASrB;IAFN,SAAS,EAAE;IACX,gBAAgB,CAAC,wBAAwB,CAAC;qDAChB;AASpB;IAFN,SAAS,EAAE;IACX,gBAAgB,CAAC,wBAAwB,CAAC;yDAClB;AAOlB;IADN,iBAAiB,EAAE;mEACc;AAO3B;IADN,iBAAiB,EAAE;oEACe;AAO5B;IADN,SAAS,EAAE;oEACuB;AAO5B;IADN,SAAS,EAAE;mEACsB;AAO3B;IADN,iBAAiB,EAAE;wEACmB;AAOhC;IADN,iBAAiB,EAAE;uEACkB;AAO/B;IADN,iBAAiB,EAAE;4DACO;AAOpB;IADN,SAAS,EAAE;6DACgB;AAOrB;IADN,SAAS,EAAE;wDACW;AAOhB;IADN,iBAAiB,EAAE;+DACU;AAOvB;IADN,iBAAiB,EAAE;iEACY;AA6PpC,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB;;;GAGG;AACH,MAAM,UAAU,+BAA+B;IAC3C,IAAI,WAAW,EAAE,CAAC;QACd,OAAO;IACX,CAAC;IACD,WAAW,GAAG,IAAI,CAAC;IAEnB,aAAa,CAAC,iCAAiC,EAAE,uBAAuB,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { MaterialPluginBase } from \"./materialPluginBase.pure\";\r\nimport { type Scene } from \"../scene.pure\";\r\nimport { type UniformBuffer } from \"./uniformBuffer\";\r\nimport { type FloatArray, type Nullable } from \"../types\";\r\nimport { MaterialDefines } from \"./materialDefines\";\r\nimport { type PBRBaseMaterial } from \"./PBR/pbrBaseMaterial.pure\";\r\nimport { type StandardMaterial } from \"./standardMaterial.pure\";\r\nimport { Color3 } from \"core/Maths/math\";\r\nimport { type Mesh } from \"core/Meshes/mesh.pure\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { expandToProperty, serialize, serializeAsColor3 } from \"core/Misc/decorators\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh.pure\";\r\nimport { ShaderLanguage } from \"./shaderLanguage\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\nconst vertexDefinitions = `#if defined(DBG_ENABLED)\r\nattribute float dbg_initialPass;\r\nvarying vec3 dbg_vBarycentric;\r\nflat varying vec3 dbg_vVertexWorldPos;\r\nflat varying float dbg_vPass;\r\n#endif`;\r\n\r\nconst vertexDefinitionsWebGPU = `#if defined(DBG_ENABLED)\r\nattribute dbg_initialPass: f32;\r\nvarying dbg_vBarycentric: vec3f;\r\nvarying dbg_vVertexWorldPos: vec3f;\r\nvarying dbg_vPass: f32;\r\n#endif`;\r\n\r\nconst vertexMainEnd = `#if defined(DBG_ENABLED)\r\nfloat dbg_vertexIndex = mod(float(gl_VertexID), 3.);\r\nif (dbg_vertexIndex == 0.0) { \r\n dbg_vBarycentric = vec3(1.,0.,0.); \r\n}\r\nelse if (dbg_vertexIndex == 1.0) { \r\n dbg_vBarycentric = vec3(0.,1.,0.); \r\n}\r\nelse { \r\n dbg_vBarycentric = vec3(0.,0.,1.); \r\n}\r\n\r\ndbg_vVertexWorldPos = vPositionW;\r\ndbg_vPass = dbg_initialPass;\r\n#endif`;\r\n\r\nconst vertexMainEndWebGPU = `#if defined(DBG_ENABLED)\r\nvar dbg_vertexIndex = f32(input.vertexIndex) % 3.;\r\nif (dbg_vertexIndex == 0.0) { \r\n vertexOutputs.dbg_vBarycentric = vec3f(1.,0.,0.); \r\n}\r\nelse if (dbg_vertexIndex == 1.0) { \r\n vertexOutputs.dbg_vBarycentric = vec3f(0.,1.,0.); \r\n}\r\nelse { \r\n vertexOutputs.dbg_vBarycentric = vec3f(0.,0.,1.); \r\n}\r\n\r\nvertexOutputs.dbg_vVertexWorldPos = vertexOutputs.vPositionW;\r\nvertexOutputs.dbg_vPass = input.dbg_initialPass;\r\n#endif`;\r\n\r\nconst fragmentUniforms = `#if defined(DBG_ENABLED)\r\nuniform vec3 dbg_shadedDiffuseColor;\r\nuniform vec4 dbg_shadedSpecularColorPower;\r\nuniform vec3 dbg_thicknessRadiusScale;\r\n\r\n#if DBG_MODE == 2 || DBG_MODE == 3\r\n uniform vec3 dbg_vertexColor;\r\n#endif\r\n\r\n#if DBG_MODE == 1\r\n uniform vec3 dbg_wireframeTrianglesColor;\r\n#elif DBG_MODE == 3\r\n uniform vec3 dbg_wireframeVerticesColor;\r\n#elif DBG_MODE == 4 || DBG_MODE == 5\r\n uniform vec3 dbg_uvPrimaryColor;\r\n uniform vec3 dbg_uvSecondaryColor;\r\n#elif DBG_MODE == 7\r\n uniform vec3 dbg_materialColor;\r\n#endif\r\n#endif`;\r\n\r\nconst fragmentUniformsWebGPU = `#if defined(DBG_ENABLED)\r\nuniform dbg_shadedDiffuseColor: vec3f;\r\nuniform dbg_shadedSpecularColorPower: vec4f;\r\nuniform dbg_thicknessRadiusScale: vec3f;\r\n\r\n#if DBG_MODE == 2 || DBG_MODE == 3\r\n uniform dbg_vertexColor: vec3f;\r\n#endif\r\n\r\n#if DBG_MODE == 1\r\n uniform dbg_wireframeTrianglesColor: vec3f;\r\n#elif DBG_MODE == 3\r\n uniform dbg_wireframeVerticesColor: vec3f;\r\n#elif DBG_MODE == 4 || DBG_MODE == 5\r\n uniform dbg_uvPrimaryColor: vec3f;\r\n uniform dbg_uvSecondaryColor: vec3f;\r\n#elif DBG_MODE == 7\r\n uniform dbg_materialColor: vec3f;\r\n#endif\r\n#endif`;\r\n\r\nconst fragmentDefinitions = `#if defined(DBG_ENABLED)\r\nvarying vec3 dbg_vBarycentric;\r\nflat varying vec3 dbg_vVertexWorldPos;\r\nflat varying float dbg_vPass;\r\n\r\n#if !defined(DBG_MULTIPLY)\r\n vec3 dbg_applyShading(vec3 color) {\r\n vec3 N = vNormalW.xyz;\r\n vec3 L = normalize(vEyePosition.xyz - vPositionW.xyz);\r\n vec3 H = normalize(L + L);\r\n float LdotN = clamp(dot(L,N), 0., 1.);\r\n float HdotN = clamp(dot(H,N), 0., 1.);\r\n float specTerm = pow(HdotN, dbg_shadedSpecularColorPower.w);\r\n color *= (LdotN / PI);\r\n color += dbg_shadedSpecularColorPower.rgb * (specTerm / PI);\r\n return color;\r\n }\r\n#endif\r\n\r\n#if DBG_MODE == 1 || DBG_MODE == 3\r\n float dbg_edgeFactor() {\r\n vec3 d = fwidth(dbg_vBarycentric);\r\n vec3 a3 = smoothstep(vec3(0.), d * dbg_thicknessRadiusScale.x, dbg_vBarycentric);\r\n return min(min(a3.x, a3.y), a3.z);\r\n }\r\n#endif\r\n\r\n#if DBG_MODE == 2 || DBG_MODE == 3\r\n float dbg_cornerFactor() {\r\n vec3 worldPos = vPositionW;\r\n float dist = length(worldPos - dbg_vVertexWorldPos);\r\n float camDist = length(worldPos - vEyePosition.xyz);\r\n float d = sqrt(camDist) * .001;\r\n return smoothstep((dbg_thicknessRadiusScale.y * d), ((dbg_thicknessRadiusScale.y * 1.01) * d), dist);\r\n }\r\n#endif\r\n\r\n#if (DBG_MODE == 4 && defined(UV1)) || (DBG_MODE == 5 && defined(UV2))\r\n float dbg_checkerboardFactor(vec2 uv) {\r\n vec2 f = fract(uv * dbg_thicknessRadiusScale.z);\r\n f -= .5;\r\n return (f.x * f.y) > 0. ? 1. : 0.;\r\n }\r\n#endif\r\n#endif`;\r\n\r\nconst fragmentDefinitionsWebGPU = `#if defined(DBG_ENABLED)\r\nvarying dbg_vBarycentric: vec3f;\r\nvarying dbg_vVertexWorldPos: vec3f;\r\nvarying dbg_vPass: f32;\r\n\r\n#if !defined(DBG_MULTIPLY)\r\n fn dbg_applyShading(color: vec3f) -> vec3f {\r\n var N = fragmentInputs.vNormalW.xyz;\r\n var L = normalize(scene.vEyePosition.xyz - fragmentInputs.vPositionW.xyz);\r\n var H = normalize(L + L);\r\n var LdotN = clamp(dot(L,N), 0., 1.);\r\n var HdotN = clamp(dot(H,N), 0., 1.);\r\n var specTerm = pow(HdotN, uniforms.dbg_shadedSpecularColorPower.w);\r\n var result = color * (LdotN / PI);\r\n result += uniforms.dbg_shadedSpecularColorPower.rgb * (specTerm / PI);\r\n return result;\r\n }\r\n#endif\r\n\r\n#if DBG_MODE == 1 || DBG_MODE == 3\r\n fn dbg_edgeFactor() -> f32 {\r\n var d = fwidth(fragmentInputs.dbg_vBarycentric);\r\n var a3 = smoothstep(vec3f(0.), d * uniforms.dbg_thicknessRadiusScale.x, fragmentInputs.dbg_vBarycentric);\r\n return min(min(a3.x, a3.y), a3.z);\r\n }\r\n#endif\r\n\r\n#if DBG_MODE == 2 || DBG_MODE == 3\r\n fn dbg_cornerFactor() -> f32 {\r\n var worldPos = fragmentInputs.vPositionW;\r\n float dist = length(worldPos - fragmentInputs.dbg_vVertexWorldPos);\r\n float camDist = length(worldPos - scene.vEyePosition.xyz);\r\n float d = sqrt(camDist) * .001;\r\n return smoothstep((uniforms.dbg_thicknessRadiusScale.y * d), ((uniforms.dbg_thicknessRadiusScale.y * 1.01) * d), dist);\r\n }\r\n#endif\r\n\r\n#if (DBG_MODE == 4 && defined(UV1)) || (DBG_MODE == 5 && defined(UV2))\r\n fn dbg_checkerboardFactor(uv: vec2f) -> f32 {\r\n var f = fract(uv * uniforms.dbg_thicknessRadiusScale.z);\r\n f -= .5;\r\n return (f.x * f.y) > 0. ? 1. : 0.;\r\n }\r\n#endif\r\n#endif`;\r\n\r\nconst fragmentMainEnd = `#if defined(DBG_ENABLED)\r\nvec3 dbg_color = vec3(1.);\r\n#if DBG_MODE == 1\r\n dbg_color = mix(dbg_wireframeTrianglesColor, vec3(1.), dbg_edgeFactor());\r\n#elif DBG_MODE == 2 || DBG_MODE == 3\r\n float dbg_cornerFactor = dbg_cornerFactor();\r\n if (dbg_vPass == 0. && dbg_cornerFactor == 1.) discard;\r\n dbg_color = mix(dbg_vertexColor, vec3(1.), dbg_cornerFactor);\r\n #if DBG_MODE == 3\r\n dbg_color *= mix(dbg_wireframeVerticesColor, vec3(1.), dbg_edgeFactor());\r\n #endif\r\n#elif DBG_MODE == 4 && defined(MAINUV1)\r\n dbg_color = mix(dbg_uvPrimaryColor, dbg_uvSecondaryColor, dbg_checkerboardFactor(vMainUV1));\r\n#elif DBG_MODE == 5 && defined(MAINUV2)\r\n dbg_color = mix(dbg_uvPrimaryColor, dbg_uvSecondaryColor, dbg_checkerboardFactor(vMainUV2));\r\n#elif DBG_MODE == 6 && defined(VERTEXCOLOR)\r\n dbg_color = vColor.rgb;\r\n#elif DBG_MODE == 7\r\n dbg_color = dbg_materialColor;\r\n#endif\r\n\r\n#if defined(DBG_MULTIPLY)\r\n gl_FragColor *= vec4(dbg_color, 1.);\r\n#else\r\n #if DBG_MODE != 6\r\n gl_FragColor = vec4(dbg_applyShading(dbg_shadedDiffuseColor) * dbg_color, 1.);\r\n #else\r\n gl_FragColor = vec4(dbg_color, 1.);\r\n #endif\r\n#endif\r\n#endif`;\r\n\r\nconst fragmentMainEndWebGPU = `#if defined(DBG_ENABLED)\r\nvar dbg_color = vec3f(1.);\r\n#if DBG_MODE == 1\r\n dbg_color = mix(uniforms.dbg_wireframeTrianglesColor, vec3f(1.), dbg_edgeFactor());\r\n#elif DBG_MODE == 2 || DBG_MODE == 3\r\n var dbg_cornerFactor = dbg_cornerFactor();\r\n if (fragmentInputs.dbg_vPass == 0. && dbg_cornerFactor == 1.) discard;\r\n dbg_color = mix(uniforms.dbg_vertexColor, vec3(1.), dbg_cornerFactor);\r\n #if DBG_MODE == 3\r\n dbg_color *= mix(uniforms.dbg_wireframeVerticesColor, vec3f(1.), dbg_edgeFactor());\r\n #endif\r\n#elif DBG_MODE == 4 && defined(MAINUV1)\r\n dbg_color = mix(uniforms.dbg_uvPrimaryColor, uniforms.dbg_uvSecondaryColor, dbg_checkerboardFactor(fragmentInputs.vMainUV1));\r\n#elif DBG_MODE == 5 && defined(MAINUV2)\r\n dbg_color = mix(uniforms.dbg_uvPrimaryColor, uniforms.dbg_uvSecondaryColor, dbg_checkerboardFactor(fragmentInputs.vMainUV2));\r\n#elif DBG_MODE == 6 && defined(VERTEXCOLOR)\r\n dbg_color = fragmentInputs.vColor.rgb;\r\n#elif DBG_MODE == 7\r\n dbg_color = uniforms.dbg_materialColor;\r\n#endif\r\n\r\n#if defined(DBG_MULTIPLY)\r\n fragmentOutputs.color *= vec4f(dbg_color, 1.);\r\n#else\r\n #if DBG_MODE != 6\r\n fragmentOutputs.color = vec4f(dbg_applyShading(dbg_shadedDiffuseColor) * dbg_color, 1.);\r\n #else\r\n fragmentOutputs.color = vec4f(dbg_color, 1.);\r\n #endif\r\n#endif\r\n#endif`;\r\n\r\nconst defaultMaterialColors = [\r\n new Color3(0.98, 0.26, 0.38),\r\n new Color3(0.47, 0.75, 0.3),\r\n new Color3(0, 0.26, 0.77),\r\n new Color3(0.97, 0.6, 0.76),\r\n new Color3(0.19, 0.63, 0.78),\r\n new Color3(0.98, 0.8, 0.6),\r\n new Color3(0.65, 0.43, 0.15),\r\n new Color3(0.15, 0.47, 0.22),\r\n new Color3(0.67, 0.71, 0.86),\r\n new Color3(0.09, 0.46, 0.56),\r\n new Color3(0.8, 0.98, 0.02),\r\n new Color3(0.39, 0.29, 0.13),\r\n new Color3(0.53, 0.63, 0.06),\r\n new Color3(0.95, 0.96, 0.41),\r\n new Color3(1, 0.72, 0.94),\r\n new Color3(0.63, 0.08, 0.31),\r\n new Color3(0.66, 0.96, 0.95),\r\n new Color3(0.22, 0.14, 0.19),\r\n new Color3(0.14, 0.65, 0.59),\r\n new Color3(0.93, 1, 0.68),\r\n new Color3(0.93, 0.14, 0.44),\r\n new Color3(0.47, 0.86, 0.67),\r\n new Color3(0.85, 0.07, 0.78),\r\n new Color3(0.53, 0.64, 0.98),\r\n new Color3(0.43, 0.37, 0.56),\r\n new Color3(0.71, 0.65, 0.25),\r\n new Color3(0.66, 0.19, 0.01),\r\n new Color3(0.94, 0.53, 0.12),\r\n new Color3(0.41, 0.44, 0.44),\r\n new Color3(0.24, 0.71, 0.96),\r\n new Color3(0.57, 0.28, 0.56),\r\n new Color3(0.44, 0.98, 0.42),\r\n];\r\n\r\n/**\r\n * Supported visualizations of MeshDebugPluginMaterial\r\n */\r\nexport const enum MeshDebugMode {\r\n /**\r\n * Material without any mesh debug visualization\r\n */\r\n NONE = 0,\r\n /**\r\n * A wireframe of the mesh\r\n * NOTE: For this mode to work correctly, convertToUnIndexedMesh() or MeshDebugPluginMaterial.PrepareMeshForTrianglesAndVerticesMode() must first be called on mesh.\r\n */\r\n TRIANGLES = 1,\r\n /**\r\n * Points drawn over vertices of mesh\r\n * NOTE: For this mode to work correctly, MeshDebugPluginMaterial.PrepareMeshForTrianglesAndVerticesMode() must first be called on mesh.\r\n */\r\n VERTICES = 2,\r\n /**\r\n * A wireframe of the mesh, with points drawn over vertices\r\n * NOTE: For this mode to work correctly, MeshDebugPluginMaterial.PrepareMeshForTrianglesAndVerticesMode() must first be called on mesh.\r\n */\r\n TRIANGLES_VERTICES = 3,\r\n /**\r\n * A checkerboard grid of the mesh's UV set 0\r\n */\r\n UV0 = 4,\r\n /**\r\n * A checkerboard grid of the mesh's UV set 1\r\n */\r\n UV1 = 5,\r\n /**\r\n * The mesh's vertex colors displayed as the primary texture\r\n */\r\n VERTEXCOLORS = 6,\r\n /**\r\n * An arbitrary, distinguishable color to identify the material\r\n */\r\n MATERIALIDS = 7,\r\n}\r\n\r\n/**\r\n * Options for MeshDebugPluginMaterial visualizations\r\n */\r\nexport interface MeshDebugOptions {\r\n /**\r\n * The mesh debug visualization.\r\n * Defaults to NONE.\r\n */\r\n mode?: MeshDebugMode;\r\n /**\r\n * Whether the mesh debug visualization should multiply with color underneath.\r\n * Defaults to true.\r\n */\r\n multiply?: boolean;\r\n /**\r\n * Diffuse color used to shade the mesh.\r\n * Defaults to (1.0, 1.0, 1.0).\r\n */\r\n shadedDiffuseColor?: Color3;\r\n /**\r\n * Specular color used to shade the mesh.\r\n * Defaults to (0.8, 0.8, 0.8).\r\n */\r\n shadedSpecularColor?: Color3;\r\n /**\r\n * Specular power used to shade the mesh.\r\n * Defaults to 10.\r\n */\r\n shadedSpecularPower?: number;\r\n /**\r\n * Width of edge lines in TRIANGLES and TRIANGLE_VERTICES modes.\r\n * Defaults to 0.7.\r\n */\r\n wireframeThickness?: number;\r\n /**\r\n * Color of edge lines in TRIANGLES mode.\r\n * Defaults to (0.0, 0.0, 0.0).\r\n */\r\n wireframeTrianglesColor?: Color3;\r\n /**\r\n * Color of edge lines in TRIANGLES_VERTICES modes.\r\n * Defaults to (0.8, 0.8, 0.8).\r\n */\r\n wireframeVerticesColor?: Color3;\r\n /**\r\n * Color of vertices in TRIANGLES_VERTICES and VERTICES mode.\r\n * Defaults to (0.0, 0.0, 0.0).\r\n */\r\n vertexColor?: Color3;\r\n /**\r\n * Radius of dots drawn over vertices in TRIANGLE_VERTICES and VERTICES mode.\r\n * Defaults to 1.2.\r\n */\r\n vertexRadius?: number;\r\n /**\r\n * Size of tiles in UV1 or UV2 modes.\r\n * Defaults to 20.\r\n */\r\n uvScale?: number;\r\n /**\r\n * 1st color of checkerboard grid in UV1 or UV2 modes.\r\n * Defaults to (1.0, 1.0, 1.0).\r\n */\r\n uvPrimaryColor?: Color3;\r\n /**\r\n * 2nd color of checkerboard grid in UV1 or UV2 modes.\r\n * Defaults to (0.5, 0.5, 0.5).\r\n */\r\n uvSecondaryColor?: Color3;\r\n}\r\n\r\n/** @internal */\r\nclass MeshDebugDefines extends MaterialDefines {\r\n /**\r\n * Current mesh debug visualization.\r\n * Defaults to NONE.\r\n */\r\n DBG_MODE: MeshDebugMode = MeshDebugMode.NONE;\r\n /**\r\n * Whether the mesh debug visualization multiplies with colors underneath.\r\n * Defaults to true.\r\n */\r\n DBG_MULTIPLY: boolean = true;\r\n /**\r\n * Whether the mesh debug plugin is enabled in the material.\r\n * Defaults to true.\r\n */\r\n DBG_ENABLED: boolean = true;\r\n}\r\n\r\n/**\r\n * Plugin that implements various mesh debug visualizations,\r\n * List of available visualizations can be found in MeshDebugMode enum.\r\n */\r\nexport class MeshDebugPluginMaterial extends MaterialPluginBase {\r\n /**\r\n * Total number of instances of the plugin.\r\n * Starts at 0.\r\n */\r\n private static _PluginCount: number = 0;\r\n\r\n /**\r\n * Color palette used for MATERIALIDS mode.\r\n * Defaults to `defaultMaterialColors`\r\n */\r\n public static MaterialColors: Color3[] = defaultMaterialColors;\r\n\r\n /**\r\n * Material ID color of this plugin instance.\r\n * Taken from index `_PluginCount` of `MaterialColors` at time of instantiation.\r\n */\r\n @serializeAsColor3()\r\n private _materialColor: Color3;\r\n\r\n /**\r\n * Whether the mesh debug plugin is enabled in the material.\r\n * Defaults to true in constructor.\r\n */\r\n @serialize()\r\n private _isEnabled: boolean;\r\n\r\n private _mode: MeshDebugMode;\r\n /**\r\n * The mesh debug visualization.\r\n * Defaults to NONE.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllDefinesAsDirty\")\r\n public mode: MeshDebugMode;\r\n\r\n private _multiply: boolean;\r\n /**\r\n * Whether the mesh debug visualization should multiply with color underneath.\r\n * Defaults to true.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllDefinesAsDirty\")\r\n public multiply: boolean;\r\n\r\n /**\r\n * Diffuse color used to shade the mesh.\r\n * Defaults to (1.0, 1.0, 1.0).\r\n */\r\n @serializeAsColor3()\r\n public shadedDiffuseColor: Color3;\r\n\r\n /**\r\n * Specular color used to shade the mesh.\r\n * Defaults to (0.8, 0.8, 0.8).\r\n */\r\n @serializeAsColor3()\r\n public shadedSpecularColor: Color3;\r\n\r\n /**\r\n * Specular power used to shade the mesh.\r\n * Defaults to 10.\r\n */\r\n @serialize()\r\n public shadedSpecularPower: number;\r\n\r\n /**\r\n * Width of edge lines in TRIANGLES and TRIANGLE_VERTICES modes.\r\n * Defaults to 0.7.\r\n */\r\n @serialize()\r\n public wireframeThickness: number;\r\n\r\n /**\r\n * Color of edge lines in TRIANGLES mode.\r\n * Defaults to (0.0, 0.0, 0.0).\r\n */\r\n @serializeAsColor3()\r\n public wireframeTrianglesColor: Color3;\r\n\r\n /**\r\n * Color of edge lines in TRIANGLES_VERTICES modes.\r\n * Defaults to (0.8, 0.8, 0.8).\r\n */\r\n @serializeAsColor3()\r\n public wireframeVerticesColor: Color3;\r\n\r\n /**\r\n * Color of vertices in TRIANGLES_VERTICES and VERTICES mode.\r\n * Defaults to (0.0, 0.0, 0.0).\r\n */\r\n @serializeAsColor3()\r\n public vertexColor: Color3;\r\n\r\n /**\r\n * Radius of dots drawn over vertices in TRIANGLE_VERTICES and VERTICES mode.\r\n * Defaults to 1.2.\r\n */\r\n @serialize()\r\n public vertexRadius: number;\r\n\r\n /**\r\n * Size of tiles in UV1 or UV2 modes.\r\n * Defaults to 20.\r\n */\r\n @serialize()\r\n public uvScale: number;\r\n\r\n /**\r\n * 1st color of checkerboard grid in UV1 or UV2 modes.\r\n * Defaults to (1.0, 1.0, 1.0).\r\n */\r\n @serializeAsColor3()\r\n public uvPrimaryColor: Color3;\r\n\r\n /**\r\n * 2nd color of checkerboard grid in UV1 or UV2 modes.\r\n * Defaults to (0.5, 0.5, 0.5).\r\n */\r\n @serializeAsColor3()\r\n public uvSecondaryColor: Color3;\r\n\r\n /** @internal */\r\n protected _markAllDefinesAsDirty(): void {\r\n this._enable(this._isEnabled);\r\n this.markAllDefinesAsDirty();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the plugin is compatible with a given shader language.\r\n * @param shaderLanguage The shader language to use.\r\n * @returns true if the plugin is compatible with the shader language\r\n */\r\n public override isCompatible(shaderLanguage: ShaderLanguage): boolean {\r\n switch (shaderLanguage) {\r\n case ShaderLanguage.GLSL:\r\n case ShaderLanguage.WGSL:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new MeshDebugPluginMaterial\r\n * @param material Material to attach the mesh debug plugin to\r\n * @param options Options for the mesh debug plugin\r\n */\r\n constructor(material: PBRBaseMaterial | StandardMaterial, options: MeshDebugOptions = {}) {\r\n const defines = new MeshDebugDefines();\r\n defines.DBG_MODE = options.mode ?? defines.DBG_MODE;\r\n defines.DBG_MULTIPLY = options.multiply ?? defines.DBG_MULTIPLY;\r\n super(material, \"MeshDebug\", 200, defines, true, true);\r\n\r\n this._mode = defines.DBG_MODE;\r\n this._multiply = defines.DBG_MULTIPLY;\r\n this.shadedDiffuseColor = options.shadedDiffuseColor ?? new Color3(1, 1, 1);\r\n this.shadedSpecularColor = options.shadedSpecularColor ?? new Color3(0.8, 0.8, 0.8);\r\n this.shadedSpecularPower = options.shadedSpecularPower ?? 10;\r\n this.wireframeThickness = options.wireframeThickness ?? 0.7;\r\n this.wireframeTrianglesColor = options.wireframeTrianglesColor ?? new Color3(0, 0, 0);\r\n this.wireframeVerticesColor = options.wireframeVerticesColor ?? new Color3(0.8, 0.8, 0.8);\r\n this.vertexColor = options.vertexColor ?? new Color3(0, 0, 0);\r\n this.vertexRadius = options.vertexRadius ?? 1.2;\r\n this.uvScale = options.uvScale ?? 20;\r\n this.uvPrimaryColor = options.uvPrimaryColor ?? new Color3(1, 1, 1);\r\n this.uvSecondaryColor = options.uvSecondaryColor ?? new Color3(0.5, 0.5, 0.5);\r\n\r\n this._materialColor = MeshDebugPluginMaterial.MaterialColors[MeshDebugPluginMaterial._PluginCount++ % MeshDebugPluginMaterial.MaterialColors.length];\r\n this.isEnabled = true;\r\n }\r\n\r\n /**\r\n * Get the class name\r\n * @returns Class name\r\n */\r\n public override getClassName() {\r\n return \"MeshDebugPluginMaterial\";\r\n }\r\n\r\n /**\r\n * Gets whether the mesh debug plugin is enabled in the material.\r\n */\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n /**\r\n * Sets whether the mesh debug plugin is enabled in the material.\r\n * @param value enabled\r\n */\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n if (!this._material.getScene().getEngine().isWebGPU && this._material.getScene().getEngine().version == 1) {\r\n Logger.Error(\"MeshDebugPluginMaterial is not supported on WebGL 1.0.\");\r\n this._isEnabled = false;\r\n return;\r\n }\r\n this._isEnabled = value;\r\n this._markAllDefinesAsDirty();\r\n }\r\n\r\n /**\r\n * Prepare the defines\r\n * @param defines Mesh debug defines\r\n * @param scene Scene\r\n * @param mesh Mesh associated with material\r\n */\r\n public override prepareDefines(defines: MeshDebugDefines, scene: Scene, mesh: AbstractMesh) {\r\n if (\r\n (this._mode == MeshDebugMode.VERTICES || this._mode == MeshDebugMode.TRIANGLES || this._mode == MeshDebugMode.TRIANGLES_VERTICES) &&\r\n !mesh.isVerticesDataPresent(\"dbg_initialPass\")\r\n ) {\r\n Logger.Warn(\r\n \"For best results with TRIANGLES, TRIANGLES_VERTICES, or VERTICES modes, please use MeshDebugPluginMaterial.PrepareMeshForTrianglesAndVerticesMode() on mesh.\",\r\n 1\r\n );\r\n }\r\n\r\n defines.DBG_MODE = this._mode;\r\n defines.DBG_MULTIPLY = this._multiply;\r\n defines.DBG_ENABLED = this._isEnabled;\r\n }\r\n\r\n /**\r\n * Get the shader attributes\r\n * @param attributes Array of attributes\r\n */\r\n public override getAttributes(attributes: string[]) {\r\n attributes.push(\"dbg_initialPass\");\r\n }\r\n\r\n /**\r\n * Get the shader uniforms\r\n * @param shaderLanguage The shader language to use.\r\n * @returns Uniforms\r\n */\r\n public override getUniforms(shaderLanguage = ShaderLanguage.GLSL) {\r\n return {\r\n ubo: [\r\n { name: \"dbg_shadedDiffuseColor\", size: 3, type: \"vec3\" },\r\n { name: \"dbg_shadedSpecularColorPower\", size: 4, type: \"vec4\" }, // shadedSpecularColor, shadedSpecularPower\r\n { name: \"dbg_thicknessRadiusScale\", size: 3, type: \"vec3\" }, // wireframeThickness, vertexRadius, uvScale\r\n { name: \"dbg_wireframeTrianglesColor\", size: 3, type: \"vec3\" },\r\n { name: \"dbg_wireframeVerticesColor\", size: 3, type: \"vec3\" },\r\n { name: \"dbg_vertexColor\", size: 3, type: \"vec3\" },\r\n { name: \"dbg_uvPrimaryColor\", size: 3, type: \"vec3\" },\r\n { name: \"dbg_uvSecondaryColor\", size: 3, type: \"vec3\" },\r\n { name: \"dbg_materialColor\", size: 3, type: \"vec3\" },\r\n ],\r\n fragment: shaderLanguage === ShaderLanguage.GLSL ? fragmentUniforms : fragmentUniformsWebGPU,\r\n };\r\n }\r\n\r\n /**\r\n * Bind the uniform buffer\r\n * @param uniformBuffer Uniform buffer\r\n */\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n uniformBuffer.updateFloat3(\"dbg_shadedDiffuseColor\", this.shadedDiffuseColor.r, this.shadedDiffuseColor.g, this.shadedDiffuseColor.b);\r\n uniformBuffer.updateFloat4(\"dbg_shadedSpecularColorPower\", this.shadedSpecularColor.r, this.shadedSpecularColor.g, this.shadedSpecularColor.b, this.shadedSpecularPower);\r\n uniformBuffer.updateFloat3(\"dbg_thicknessRadiusScale\", this.wireframeThickness, this.vertexRadius, this.uvScale);\r\n uniformBuffer.updateColor3(\"dbg_wireframeTrianglesColor\", this.wireframeTrianglesColor);\r\n uniformBuffer.updateColor3(\"dbg_wireframeVerticesColor\", this.wireframeVerticesColor);\r\n uniformBuffer.updateColor3(\"dbg_vertexColor\", this.vertexColor);\r\n uniformBuffer.updateColor3(\"dbg_uvPrimaryColor\", this.uvPrimaryColor);\r\n uniformBuffer.updateColor3(\"dbg_uvSecondaryColor\", this.uvSecondaryColor);\r\n uniformBuffer.updateColor3(\"dbg_materialColor\", this._materialColor);\r\n }\r\n\r\n /**\r\n * Get shader code\r\n * @param shaderType \"vertex\" or \"fragment\"\r\n * @param shaderLanguage The shader language to use.\r\n * @returns Shader code\r\n */\r\n public override getCustomCode(shaderType: string, shaderLanguage = ShaderLanguage.GLSL): Nullable<{ [pointName: string]: string }> {\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n return shaderType === \"vertex\"\r\n ? {\r\n CUSTOM_VERTEX_DEFINITIONS: vertexDefinitionsWebGPU,\r\n CUSTOM_VERTEX_MAIN_END: vertexMainEndWebGPU,\r\n }\r\n : {\r\n CUSTOM_FRAGMENT_DEFINITIONS: fragmentDefinitionsWebGPU,\r\n CUSTOM_FRAGMENT_MAIN_END: fragmentMainEndWebGPU,\r\n };\r\n }\r\n\r\n return shaderType === \"vertex\"\r\n ? {\r\n CUSTOM_VERTEX_DEFINITIONS: vertexDefinitions,\r\n CUSTOM_VERTEX_MAIN_END: vertexMainEnd,\r\n }\r\n : {\r\n CUSTOM_FRAGMENT_DEFINITIONS: fragmentDefinitions,\r\n CUSTOM_FRAGMENT_MAIN_END: fragmentMainEnd,\r\n };\r\n }\r\n\r\n /**\r\n * Resets static variables of the plugin to their original state\r\n */\r\n public static Reset(): void {\r\n this._PluginCount = 0;\r\n this.MaterialColors = defaultMaterialColors;\r\n }\r\n\r\n /**\r\n * Renders triangles in a mesh 3 times by tripling the indices in the index buffer.\r\n * Used to prepare a mesh to be rendered in `TRIANGLES`, `VERTICES`, or `TRIANGLES_VERTICES` modes.\r\n * NOTE: This is a destructive operation. The mesh's index buffer and vertex buffers are modified, and a new vertex buffer is allocated.\r\n * If you'd like the ability to revert these changes, toggle the optional `returnRollback` flag.\r\n * @param mesh the mesh to target\r\n * @param returnRollback whether or not to return a function that reverts mesh to its initial state. Default: false.\r\n * @returns a rollback function if `returnRollback` is true, otherwise an empty function.\r\n */\r\n public static PrepareMeshForTrianglesAndVerticesMode(mesh: Mesh, returnRollback: boolean = false): () => void {\r\n let rollback = () => {};\r\n\r\n if (mesh.getTotalIndices() == 0) {\r\n return rollback;\r\n }\r\n\r\n if (returnRollback) {\r\n const kinds = mesh.getVerticesDataKinds();\r\n const indices = mesh.getIndices()!;\r\n const data: { [kind: string]: FloatArray } = {};\r\n for (const kind of kinds) {\r\n data[kind] = mesh.getVerticesData(kind)!;\r\n }\r\n\r\n rollback = function () {\r\n mesh.setIndices(indices);\r\n for (const kind of kinds) {\r\n const stride = mesh.getVertexBuffer(kind)!.getStrideSize();\r\n mesh.setVerticesData(kind, data[kind], undefined, stride);\r\n }\r\n mesh.removeVerticesData(\"dbg_initialPass\");\r\n };\r\n }\r\n\r\n let indices = Array.from(mesh.getIndices()!);\r\n const newIndices1 = [];\r\n for (let i = 0; i < indices.length; i += 3) {\r\n newIndices1.push(indices[i + 1], indices[i + 2], indices[i + 0]);\r\n }\r\n mesh.setIndices(indices.concat(newIndices1));\r\n\r\n mesh.convertToUnIndexedMesh();\r\n\r\n mesh.isUnIndexed = false;\r\n\r\n indices = Array.from(mesh.getIndices()!);\r\n const newIndices2 = [];\r\n for (let i = indices.length / 2; i < indices.length; i += 3) {\r\n newIndices2.push(indices[i + 1], indices[i + 2], indices[i + 0]);\r\n }\r\n mesh.setIndices(indices.concat(newIndices2));\r\n\r\n const num = mesh.getTotalVertices();\r\n const mid = num / 2;\r\n const pass = new Array(num).fill(1, 0, mid).fill(0, mid, num);\r\n mesh.setVerticesData(\"dbg_initialPass\", pass, false, 1);\r\n\r\n return rollback;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for meshDebugPluginMaterial.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterMeshDebugPluginMaterial(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.MeshDebugPluginMaterial\", MeshDebugPluginMaterial);\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"meshDebugPluginMaterial.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/meshDebugPluginMaterial.pure.ts"],"names":[],"mappings":"AAAA,6DAA6D;;AAE7D,yDAAyD;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAI/D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGtF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,iBAAiB,GAAG;;;;;OAKnB,CAAC;AAER,MAAM,uBAAuB,GAAG;;;;;OAKzB,CAAC;AAER,MAAM,aAAa,GAAG;;;;;;;;;;;;;;OAcf,CAAC;AAER,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;OAcrB,CAAC;AAER,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;OAmBlB,CAAC;AAER,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;OAmBxB,CAAC;AAER,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4CrB,CAAC;AAER,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4C3B,CAAC;AAER,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BjB,CAAC;AAER,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCvB,CAAC;AAER,MAAM,qBAAqB,GAAG;IAC1B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC;IAC3B,IAAI,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IACzB,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;IAC3B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;IAC1B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;IAC3B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IACzB,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC;IACzB,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { MaterialPluginBase } from \"./materialPluginBase.pure\";\r\nimport { type Scene } from \"../scene.pure\";\r\nimport { type UniformBuffer } from \"./uniformBuffer\";\r\nimport { type FloatArray, type Nullable } from \"../types\";\r\nimport { MaterialDefines } from \"./materialDefines\";\r\nimport { type PBRBaseMaterial } from \"./PBR/pbrBaseMaterial.pure\";\r\nimport { type StandardMaterial } from \"./standardMaterial.pure\";\r\nimport { Color3 } from \"core/Maths/math\";\r\nimport { type Mesh } from \"core/Meshes/mesh.pure\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { expandToProperty, serialize, serializeAsColor3 } from \"core/Misc/decorators\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh.pure\";\r\nimport { ShaderLanguage } from \"./shaderLanguage\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\nconst vertexDefinitions = `#if defined(DBG_ENABLED)\r\nattribute float dbg_initialPass;\r\nvarying vec3 dbg_vBarycentric;\r\nflat varying vec3 dbg_vVertexWorldPos;\r\nflat varying float dbg_vPass;\r\n#endif`;\r\n\r\nconst vertexDefinitionsWebGPU = `#if defined(DBG_ENABLED)\r\nattribute dbg_initialPass: f32;\r\nvarying dbg_vBarycentric: vec3f;\r\nflat varying dbg_vVertexWorldPos: vec3f;\r\nflat varying dbg_vPass: f32;\r\n#endif`;\r\n\r\nconst vertexMainEnd = `#if defined(DBG_ENABLED)\r\nfloat dbg_vertexIndex = mod(float(gl_VertexID), 3.);\r\nif (dbg_vertexIndex == 0.0) { \r\n dbg_vBarycentric = vec3(1.,0.,0.); \r\n}\r\nelse if (dbg_vertexIndex == 1.0) { \r\n dbg_vBarycentric = vec3(0.,1.,0.); \r\n}\r\nelse { \r\n dbg_vBarycentric = vec3(0.,0.,1.); \r\n}\r\n\r\ndbg_vVertexWorldPos = vPositionW;\r\ndbg_vPass = dbg_initialPass;\r\n#endif`;\r\n\r\nconst vertexMainEndWebGPU = `#if defined(DBG_ENABLED)\r\nvar dbg_vertexIndex = f32(input.vertexIndex) % 3.;\r\nif (dbg_vertexIndex == 0.0) { \r\n vertexOutputs.dbg_vBarycentric = vec3f(1.,0.,0.); \r\n}\r\nelse if (dbg_vertexIndex == 1.0) { \r\n vertexOutputs.dbg_vBarycentric = vec3f(0.,1.,0.); \r\n}\r\nelse { \r\n vertexOutputs.dbg_vBarycentric = vec3f(0.,0.,1.); \r\n}\r\n\r\nvertexOutputs.dbg_vVertexWorldPos = vertexOutputs.vPositionW;\r\nvertexOutputs.dbg_vPass = input.dbg_initialPass;\r\n#endif`;\r\n\r\nconst fragmentUniforms = `#if defined(DBG_ENABLED)\r\nuniform vec3 dbg_shadedDiffuseColor;\r\nuniform vec4 dbg_shadedSpecularColorPower;\r\nuniform vec3 dbg_thicknessRadiusScale;\r\n\r\n#if DBG_MODE == 2 || DBG_MODE == 3\r\n uniform vec3 dbg_vertexColor;\r\n#endif\r\n\r\n#if DBG_MODE == 1\r\n uniform vec3 dbg_wireframeTrianglesColor;\r\n#elif DBG_MODE == 3\r\n uniform vec3 dbg_wireframeVerticesColor;\r\n#elif DBG_MODE == 4 || DBG_MODE == 5\r\n uniform vec3 dbg_uvPrimaryColor;\r\n uniform vec3 dbg_uvSecondaryColor;\r\n#elif DBG_MODE == 7\r\n uniform vec3 dbg_materialColor;\r\n#endif\r\n#endif`;\r\n\r\nconst fragmentUniformsWebGPU = `#if defined(DBG_ENABLED)\r\nuniform dbg_shadedDiffuseColor: vec3f;\r\nuniform dbg_shadedSpecularColorPower: vec4f;\r\nuniform dbg_thicknessRadiusScale: vec3f;\r\n\r\n#if DBG_MODE == 2 || DBG_MODE == 3\r\n uniform dbg_vertexColor: vec3f;\r\n#endif\r\n\r\n#if DBG_MODE == 1\r\n uniform dbg_wireframeTrianglesColor: vec3f;\r\n#elif DBG_MODE == 3\r\n uniform dbg_wireframeVerticesColor: vec3f;\r\n#elif DBG_MODE == 4 || DBG_MODE == 5\r\n uniform dbg_uvPrimaryColor: vec3f;\r\n uniform dbg_uvSecondaryColor: vec3f;\r\n#elif DBG_MODE == 7\r\n uniform dbg_materialColor: vec3f;\r\n#endif\r\n#endif`;\r\n\r\nconst fragmentDefinitions = `#if defined(DBG_ENABLED)\r\nvarying vec3 dbg_vBarycentric;\r\nflat varying vec3 dbg_vVertexWorldPos;\r\nflat varying float dbg_vPass;\r\n\r\n#if !defined(DBG_MULTIPLY)\r\n vec3 dbg_applyShading(vec3 color) {\r\n vec3 N = vNormalW.xyz;\r\n vec3 L = normalize(vEyePosition.xyz - vPositionW.xyz);\r\n vec3 H = normalize(L + L);\r\n float LdotN = clamp(dot(L,N), 0., 1.);\r\n float HdotN = clamp(dot(H,N), 0., 1.);\r\n float specTerm = pow(HdotN, dbg_shadedSpecularColorPower.w);\r\n color *= (LdotN / PI);\r\n color += dbg_shadedSpecularColorPower.rgb * (specTerm / PI);\r\n return color;\r\n }\r\n#endif\r\n\r\n#if DBG_MODE == 1 || DBG_MODE == 3\r\n float dbg_edgeFactor() {\r\n vec3 d = fwidth(dbg_vBarycentric);\r\n vec3 a3 = smoothstep(vec3(0.), d * dbg_thicknessRadiusScale.x, dbg_vBarycentric);\r\n return min(min(a3.x, a3.y), a3.z);\r\n }\r\n#endif\r\n\r\n#if DBG_MODE == 2 || DBG_MODE == 3\r\n float dbg_cornerFactor() {\r\n vec3 worldPos = vPositionW;\r\n float dist = length(worldPos - dbg_vVertexWorldPos);\r\n float camDist = length(worldPos - vEyePosition.xyz);\r\n float d = sqrt(camDist) * .001;\r\n return smoothstep((dbg_thicknessRadiusScale.y * d), ((dbg_thicknessRadiusScale.y * 1.01) * d), dist);\r\n }\r\n#endif\r\n\r\n#if (DBG_MODE == 4 && defined(UV1)) || (DBG_MODE == 5 && defined(UV2))\r\n float dbg_checkerboardFactor(vec2 uv) {\r\n vec2 f = fract(uv * dbg_thicknessRadiusScale.z);\r\n f -= .5;\r\n return (f.x * f.y) > 0. ? 1. : 0.;\r\n }\r\n#endif\r\n#endif`;\r\n\r\nconst fragmentDefinitionsWebGPU = `#if defined(DBG_ENABLED)\r\nvarying dbg_vBarycentric: vec3f;\r\nflat varying dbg_vVertexWorldPos: vec3f;\r\nflat varying dbg_vPass: f32;\r\n\r\n#if !defined(DBG_MULTIPLY)\r\n fn dbg_applyShading(color: vec3f) -> vec3f {\r\n var N = fragmentInputs.vNormalW.xyz;\r\n var L = normalize(scene.vEyePosition.xyz - fragmentInputs.vPositionW.xyz);\r\n var H = normalize(L + L);\r\n var LdotN = clamp(dot(L,N), 0., 1.);\r\n var HdotN = clamp(dot(H,N), 0., 1.);\r\n var specTerm = pow(HdotN, uniforms.dbg_shadedSpecularColorPower.w);\r\n var result = color * (LdotN / PI);\r\n result += uniforms.dbg_shadedSpecularColorPower.rgb * (specTerm / PI);\r\n return result;\r\n }\r\n#endif\r\n\r\n#if DBG_MODE == 1 || DBG_MODE == 3\r\n fn dbg_edgeFactor() -> f32 {\r\n var d = fwidth(fragmentInputs.dbg_vBarycentric);\r\n var a3 = smoothstep(vec3f(0.), d * uniforms.dbg_thicknessRadiusScale.x, fragmentInputs.dbg_vBarycentric);\r\n return min(min(a3.x, a3.y), a3.z);\r\n }\r\n#endif\r\n\r\n#if DBG_MODE == 2 || DBG_MODE == 3\r\n fn dbg_cornerFactor() -> f32 {\r\n let worldPos = fragmentInputs.vPositionW;\r\n let dist = length(worldPos - fragmentInputs.dbg_vVertexWorldPos);\r\n let camDist = length(worldPos - scene.vEyePosition.xyz);\r\n let d = sqrt(camDist) * .001;\r\n return smoothstep((uniforms.dbg_thicknessRadiusScale.y * d), ((uniforms.dbg_thicknessRadiusScale.y * 1.01) * d), dist);\r\n }\r\n#endif\r\n\r\n#if (DBG_MODE == 4 && defined(UV1)) || (DBG_MODE == 5 && defined(UV2))\r\n fn dbg_checkerboardFactor(uv: vec2f) -> f32 {\r\n var f = fract(uv * uniforms.dbg_thicknessRadiusScale.z);\r\n f -= .5;\r\n return select(0.0, 1.0, (f.x * f.y) > 0.0);\r\n }\r\n#endif\r\n#endif`;\r\n\r\nconst fragmentMainEnd = `#if defined(DBG_ENABLED)\r\nvec3 dbg_color = vec3(1.);\r\n#if DBG_MODE == 1\r\n dbg_color = mix(dbg_wireframeTrianglesColor, vec3(1.), dbg_edgeFactor());\r\n#elif DBG_MODE == 2 || DBG_MODE == 3\r\n float dbg_cornerFactor = dbg_cornerFactor();\r\n if (dbg_vPass == 0. && dbg_cornerFactor == 1.) discard;\r\n dbg_color = mix(dbg_vertexColor, vec3(1.), dbg_cornerFactor);\r\n #if DBG_MODE == 3\r\n dbg_color *= mix(dbg_wireframeVerticesColor, vec3(1.), dbg_edgeFactor());\r\n #endif\r\n#elif DBG_MODE == 4 && defined(MAINUV1)\r\n dbg_color = mix(dbg_uvPrimaryColor, dbg_uvSecondaryColor, dbg_checkerboardFactor(vMainUV1));\r\n#elif DBG_MODE == 5 && defined(MAINUV2)\r\n dbg_color = mix(dbg_uvPrimaryColor, dbg_uvSecondaryColor, dbg_checkerboardFactor(vMainUV2));\r\n#elif DBG_MODE == 6 && defined(VERTEXCOLOR)\r\n dbg_color = vColor.rgb;\r\n#elif DBG_MODE == 7\r\n dbg_color = dbg_materialColor;\r\n#endif\r\n\r\n#if defined(DBG_MULTIPLY)\r\n gl_FragColor *= vec4(dbg_color, 1.);\r\n#else\r\n #if DBG_MODE != 6\r\n gl_FragColor = vec4(dbg_applyShading(dbg_shadedDiffuseColor) * dbg_color, 1.);\r\n #else\r\n gl_FragColor = vec4(dbg_color, 1.);\r\n #endif\r\n#endif\r\n#endif`;\r\n\r\nconst fragmentMainEndWebGPU = `#if defined(DBG_ENABLED)\r\nvar dbg_color = vec3f(1.);\r\n#if DBG_MODE == 1\r\n dbg_color = mix(uniforms.dbg_wireframeTrianglesColor, vec3f(1.), dbg_edgeFactor());\r\n#elif DBG_MODE == 2 || DBG_MODE == 3\r\n let dbg_cornerFactor = dbg_cornerFactor();\r\n if (fragmentInputs.dbg_vPass == 0.0 && dbg_cornerFactor == 1.0) {\r\n discard;\r\n }\r\n dbg_color = mix(uniforms.dbg_vertexColor, vec3f(1.), dbg_cornerFactor);\r\n #if DBG_MODE == 3\r\n dbg_color *= mix(uniforms.dbg_wireframeVerticesColor, vec3f(1.), dbg_edgeFactor());\r\n #endif\r\n#elif DBG_MODE == 4 && defined(MAINUV1)\r\n dbg_color = mix(uniforms.dbg_uvPrimaryColor, uniforms.dbg_uvSecondaryColor, dbg_checkerboardFactor(fragmentInputs.vMainUV1));\r\n#elif DBG_MODE == 5 && defined(MAINUV2)\r\n dbg_color = mix(uniforms.dbg_uvPrimaryColor, uniforms.dbg_uvSecondaryColor, dbg_checkerboardFactor(fragmentInputs.vMainUV2));\r\n#elif DBG_MODE == 6 && defined(VERTEXCOLOR)\r\n dbg_color = fragmentInputs.vColor.rgb;\r\n#elif DBG_MODE == 7\r\n dbg_color = uniforms.dbg_materialColor;\r\n#endif\r\n\r\n#if defined(DBG_MULTIPLY)\r\n fragmentOutputs.color *= vec4f(dbg_color, 1.);\r\n#else\r\n #if DBG_MODE != 6\r\n fragmentOutputs.color = vec4f(dbg_applyShading(uniforms.dbg_shadedDiffuseColor) * dbg_color, 1.);\r\n #else\r\n fragmentOutputs.color = vec4f(dbg_color, 1.);\r\n #endif\r\n#endif\r\n#endif`;\r\n\r\nconst defaultMaterialColors = [\r\n new Color3(0.98, 0.26, 0.38),\r\n new Color3(0.47, 0.75, 0.3),\r\n new Color3(0, 0.26, 0.77),\r\n new Color3(0.97, 0.6, 0.76),\r\n new Color3(0.19, 0.63, 0.78),\r\n new Color3(0.98, 0.8, 0.6),\r\n new Color3(0.65, 0.43, 0.15),\r\n new Color3(0.15, 0.47, 0.22),\r\n new Color3(0.67, 0.71, 0.86),\r\n new Color3(0.09, 0.46, 0.56),\r\n new Color3(0.8, 0.98, 0.02),\r\n new Color3(0.39, 0.29, 0.13),\r\n new Color3(0.53, 0.63, 0.06),\r\n new Color3(0.95, 0.96, 0.41),\r\n new Color3(1, 0.72, 0.94),\r\n new Color3(0.63, 0.08, 0.31),\r\n new Color3(0.66, 0.96, 0.95),\r\n new Color3(0.22, 0.14, 0.19),\r\n new Color3(0.14, 0.65, 0.59),\r\n new Color3(0.93, 1, 0.68),\r\n new Color3(0.93, 0.14, 0.44),\r\n new Color3(0.47, 0.86, 0.67),\r\n new Color3(0.85, 0.07, 0.78),\r\n new Color3(0.53, 0.64, 0.98),\r\n new Color3(0.43, 0.37, 0.56),\r\n new Color3(0.71, 0.65, 0.25),\r\n new Color3(0.66, 0.19, 0.01),\r\n new Color3(0.94, 0.53, 0.12),\r\n new Color3(0.41, 0.44, 0.44),\r\n new Color3(0.24, 0.71, 0.96),\r\n new Color3(0.57, 0.28, 0.56),\r\n new Color3(0.44, 0.98, 0.42),\r\n];\r\n\r\n/**\r\n * Supported visualizations of MeshDebugPluginMaterial\r\n */\r\nexport const enum MeshDebugMode {\r\n /**\r\n * Material without any mesh debug visualization\r\n */\r\n NONE = 0,\r\n /**\r\n * A wireframe of the mesh\r\n * NOTE: For this mode to work correctly, convertToUnIndexedMesh() or MeshDebugPluginMaterial.PrepareMeshForTrianglesAndVerticesMode() must first be called on mesh.\r\n */\r\n TRIANGLES = 1,\r\n /**\r\n * Points drawn over vertices of mesh\r\n * NOTE: For this mode to work correctly, MeshDebugPluginMaterial.PrepareMeshForTrianglesAndVerticesMode() must first be called on mesh.\r\n */\r\n VERTICES = 2,\r\n /**\r\n * A wireframe of the mesh, with points drawn over vertices\r\n * NOTE: For this mode to work correctly, MeshDebugPluginMaterial.PrepareMeshForTrianglesAndVerticesMode() must first be called on mesh.\r\n */\r\n TRIANGLES_VERTICES = 3,\r\n /**\r\n * A checkerboard grid of the mesh's UV set 0\r\n */\r\n UV0 = 4,\r\n /**\r\n * A checkerboard grid of the mesh's UV set 1\r\n */\r\n UV1 = 5,\r\n /**\r\n * The mesh's vertex colors displayed as the primary texture\r\n */\r\n VERTEXCOLORS = 6,\r\n /**\r\n * An arbitrary, distinguishable color to identify the material\r\n */\r\n MATERIALIDS = 7,\r\n}\r\n\r\n/**\r\n * Options for MeshDebugPluginMaterial visualizations\r\n */\r\nexport interface MeshDebugOptions {\r\n /**\r\n * The mesh debug visualization.\r\n * Defaults to NONE.\r\n */\r\n mode?: MeshDebugMode;\r\n /**\r\n * Whether the mesh debug visualization should multiply with color underneath.\r\n * Defaults to true.\r\n */\r\n multiply?: boolean;\r\n /**\r\n * Diffuse color used to shade the mesh.\r\n * Defaults to (1.0, 1.0, 1.0).\r\n */\r\n shadedDiffuseColor?: Color3;\r\n /**\r\n * Specular color used to shade the mesh.\r\n * Defaults to (0.8, 0.8, 0.8).\r\n */\r\n shadedSpecularColor?: Color3;\r\n /**\r\n * Specular power used to shade the mesh.\r\n * Defaults to 10.\r\n */\r\n shadedSpecularPower?: number;\r\n /**\r\n * Width of edge lines in TRIANGLES and TRIANGLE_VERTICES modes.\r\n * Defaults to 0.7.\r\n */\r\n wireframeThickness?: number;\r\n /**\r\n * Color of edge lines in TRIANGLES mode.\r\n * Defaults to (0.0, 0.0, 0.0).\r\n */\r\n wireframeTrianglesColor?: Color3;\r\n /**\r\n * Color of edge lines in TRIANGLES_VERTICES modes.\r\n * Defaults to (0.8, 0.8, 0.8).\r\n */\r\n wireframeVerticesColor?: Color3;\r\n /**\r\n * Color of vertices in TRIANGLES_VERTICES and VERTICES mode.\r\n * Defaults to (0.0, 0.0, 0.0).\r\n */\r\n vertexColor?: Color3;\r\n /**\r\n * Radius of dots drawn over vertices in TRIANGLE_VERTICES and VERTICES mode.\r\n * Defaults to 1.2.\r\n */\r\n vertexRadius?: number;\r\n /**\r\n * Size of tiles in UV1 or UV2 modes.\r\n * Defaults to 20.\r\n */\r\n uvScale?: number;\r\n /**\r\n * 1st color of checkerboard grid in UV1 or UV2 modes.\r\n * Defaults to (1.0, 1.0, 1.0).\r\n */\r\n uvPrimaryColor?: Color3;\r\n /**\r\n * 2nd color of checkerboard grid in UV1 or UV2 modes.\r\n * Defaults to (0.5, 0.5, 0.5).\r\n */\r\n uvSecondaryColor?: Color3;\r\n}\r\n\r\n/** @internal */\r\nclass MeshDebugDefines extends MaterialDefines {\r\n /**\r\n * Current mesh debug visualization.\r\n * Defaults to NONE.\r\n */\r\n DBG_MODE: MeshDebugMode = MeshDebugMode.NONE;\r\n /**\r\n * Whether the mesh debug visualization multiplies with colors underneath.\r\n * Defaults to true.\r\n */\r\n DBG_MULTIPLY: boolean = true;\r\n /**\r\n * Whether the mesh debug plugin is enabled in the material.\r\n * Defaults to true.\r\n */\r\n DBG_ENABLED: boolean = true;\r\n}\r\n\r\n/**\r\n * Plugin that implements various mesh debug visualizations,\r\n * List of available visualizations can be found in MeshDebugMode enum.\r\n */\r\nexport class MeshDebugPluginMaterial extends MaterialPluginBase {\r\n /**\r\n * Total number of instances of the plugin.\r\n * Starts at 0.\r\n */\r\n private static _PluginCount: number = 0;\r\n\r\n /**\r\n * Color palette used for MATERIALIDS mode.\r\n * Defaults to `defaultMaterialColors`\r\n */\r\n public static MaterialColors: Color3[] = defaultMaterialColors;\r\n\r\n /**\r\n * Material ID color of this plugin instance.\r\n * Taken from index `_PluginCount` of `MaterialColors` at time of instantiation.\r\n */\r\n @serializeAsColor3()\r\n private _materialColor: Color3;\r\n\r\n /**\r\n * Whether the mesh debug plugin is enabled in the material.\r\n * Defaults to true in constructor.\r\n */\r\n @serialize()\r\n private _isEnabled: boolean;\r\n\r\n private _mode: MeshDebugMode;\r\n /**\r\n * The mesh debug visualization.\r\n * Defaults to NONE.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllDefinesAsDirty\")\r\n public mode: MeshDebugMode;\r\n\r\n private _multiply: boolean;\r\n /**\r\n * Whether the mesh debug visualization should multiply with color underneath.\r\n * Defaults to true.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllDefinesAsDirty\")\r\n public multiply: boolean;\r\n\r\n /**\r\n * Diffuse color used to shade the mesh.\r\n * Defaults to (1.0, 1.0, 1.0).\r\n */\r\n @serializeAsColor3()\r\n public shadedDiffuseColor: Color3;\r\n\r\n /**\r\n * Specular color used to shade the mesh.\r\n * Defaults to (0.8, 0.8, 0.8).\r\n */\r\n @serializeAsColor3()\r\n public shadedSpecularColor: Color3;\r\n\r\n /**\r\n * Specular power used to shade the mesh.\r\n * Defaults to 10.\r\n */\r\n @serialize()\r\n public shadedSpecularPower: number;\r\n\r\n /**\r\n * Width of edge lines in TRIANGLES and TRIANGLE_VERTICES modes.\r\n * Defaults to 0.7.\r\n */\r\n @serialize()\r\n public wireframeThickness: number;\r\n\r\n /**\r\n * Color of edge lines in TRIANGLES mode.\r\n * Defaults to (0.0, 0.0, 0.0).\r\n */\r\n @serializeAsColor3()\r\n public wireframeTrianglesColor: Color3;\r\n\r\n /**\r\n * Color of edge lines in TRIANGLES_VERTICES modes.\r\n * Defaults to (0.8, 0.8, 0.8).\r\n */\r\n @serializeAsColor3()\r\n public wireframeVerticesColor: Color3;\r\n\r\n /**\r\n * Color of vertices in TRIANGLES_VERTICES and VERTICES mode.\r\n * Defaults to (0.0, 0.0, 0.0).\r\n */\r\n @serializeAsColor3()\r\n public vertexColor: Color3;\r\n\r\n /**\r\n * Radius of dots drawn over vertices in TRIANGLE_VERTICES and VERTICES mode.\r\n * Defaults to 1.2.\r\n */\r\n @serialize()\r\n public vertexRadius: number;\r\n\r\n /**\r\n * Size of tiles in UV1 or UV2 modes.\r\n * Defaults to 20.\r\n */\r\n @serialize()\r\n public uvScale: number;\r\n\r\n /**\r\n * 1st color of checkerboard grid in UV1 or UV2 modes.\r\n * Defaults to (1.0, 1.0, 1.0).\r\n */\r\n @serializeAsColor3()\r\n public uvPrimaryColor: Color3;\r\n\r\n /**\r\n * 2nd color of checkerboard grid in UV1 or UV2 modes.\r\n * Defaults to (0.5, 0.5, 0.5).\r\n */\r\n @serializeAsColor3()\r\n public uvSecondaryColor: Color3;\r\n\r\n /** @internal */\r\n protected _markAllDefinesAsDirty(): void {\r\n this._enable(this._isEnabled);\r\n this.markAllDefinesAsDirty();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the plugin is compatible with a given shader language.\r\n * @param shaderLanguage The shader language to use.\r\n * @returns true if the plugin is compatible with the shader language\r\n */\r\n public override isCompatible(shaderLanguage: ShaderLanguage): boolean {\r\n switch (shaderLanguage) {\r\n case ShaderLanguage.GLSL:\r\n case ShaderLanguage.WGSL:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new MeshDebugPluginMaterial\r\n * @param material Material to attach the mesh debug plugin to\r\n * @param options Options for the mesh debug plugin\r\n */\r\n constructor(material: PBRBaseMaterial | StandardMaterial, options: MeshDebugOptions = {}) {\r\n const defines = new MeshDebugDefines();\r\n defines.DBG_MODE = options.mode ?? defines.DBG_MODE;\r\n defines.DBG_MULTIPLY = options.multiply ?? defines.DBG_MULTIPLY;\r\n super(material, \"MeshDebug\", 200, defines, true, true);\r\n\r\n this._mode = defines.DBG_MODE;\r\n this._multiply = defines.DBG_MULTIPLY;\r\n this.shadedDiffuseColor = options.shadedDiffuseColor ?? new Color3(1, 1, 1);\r\n this.shadedSpecularColor = options.shadedSpecularColor ?? new Color3(0.8, 0.8, 0.8);\r\n this.shadedSpecularPower = options.shadedSpecularPower ?? 10;\r\n this.wireframeThickness = options.wireframeThickness ?? 0.7;\r\n this.wireframeTrianglesColor = options.wireframeTrianglesColor ?? new Color3(0, 0, 0);\r\n this.wireframeVerticesColor = options.wireframeVerticesColor ?? new Color3(0.8, 0.8, 0.8);\r\n this.vertexColor = options.vertexColor ?? new Color3(0, 0, 0);\r\n this.vertexRadius = options.vertexRadius ?? 1.2;\r\n this.uvScale = options.uvScale ?? 20;\r\n this.uvPrimaryColor = options.uvPrimaryColor ?? new Color3(1, 1, 1);\r\n this.uvSecondaryColor = options.uvSecondaryColor ?? new Color3(0.5, 0.5, 0.5);\r\n\r\n this._materialColor = MeshDebugPluginMaterial.MaterialColors[MeshDebugPluginMaterial._PluginCount++ % MeshDebugPluginMaterial.MaterialColors.length];\r\n this.isEnabled = true;\r\n }\r\n\r\n /**\r\n * Get the class name\r\n * @returns Class name\r\n */\r\n public override getClassName() {\r\n return \"MeshDebugPluginMaterial\";\r\n }\r\n\r\n /**\r\n * Gets whether the mesh debug plugin is enabled in the material.\r\n */\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n /**\r\n * Sets whether the mesh debug plugin is enabled in the material.\r\n * @param value enabled\r\n */\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n if (!this._material.getScene().getEngine().isWebGPU && this._material.getScene().getEngine().version == 1) {\r\n Logger.Error(\"MeshDebugPluginMaterial is not supported on WebGL 1.0.\");\r\n this._isEnabled = false;\r\n return;\r\n }\r\n this._isEnabled = value;\r\n this._markAllDefinesAsDirty();\r\n }\r\n\r\n /**\r\n * Prepare the defines\r\n * @param defines Mesh debug defines\r\n * @param scene Scene\r\n * @param mesh Mesh associated with material\r\n */\r\n public override prepareDefines(defines: MeshDebugDefines, scene: Scene, mesh: AbstractMesh) {\r\n if (\r\n (this._mode == MeshDebugMode.VERTICES || this._mode == MeshDebugMode.TRIANGLES || this._mode == MeshDebugMode.TRIANGLES_VERTICES) &&\r\n !mesh.isVerticesDataPresent(\"dbg_initialPass\")\r\n ) {\r\n Logger.Warn(\r\n \"For best results with TRIANGLES, TRIANGLES_VERTICES, or VERTICES modes, please use MeshDebugPluginMaterial.PrepareMeshForTrianglesAndVerticesMode() on mesh.\",\r\n 1\r\n );\r\n }\r\n\r\n defines.DBG_MODE = this._mode;\r\n defines.DBG_MULTIPLY = this._multiply;\r\n defines.DBG_ENABLED = this._isEnabled;\r\n }\r\n\r\n /**\r\n * Get the shader attributes\r\n * @param attributes Array of attributes\r\n */\r\n public override getAttributes(attributes: string[]) {\r\n attributes.push(\"dbg_initialPass\");\r\n }\r\n\r\n /**\r\n * Get the shader uniforms\r\n * @param shaderLanguage The shader language to use.\r\n * @returns Uniforms\r\n */\r\n public override getUniforms(shaderLanguage = ShaderLanguage.GLSL) {\r\n return {\r\n ubo: [\r\n { name: \"dbg_shadedDiffuseColor\", size: 3, type: \"vec3\" },\r\n { name: \"dbg_shadedSpecularColorPower\", size: 4, type: \"vec4\" }, // shadedSpecularColor, shadedSpecularPower\r\n { name: \"dbg_thicknessRadiusScale\", size: 3, type: \"vec3\" }, // wireframeThickness, vertexRadius, uvScale\r\n { name: \"dbg_wireframeTrianglesColor\", size: 3, type: \"vec3\" },\r\n { name: \"dbg_wireframeVerticesColor\", size: 3, type: \"vec3\" },\r\n { name: \"dbg_vertexColor\", size: 3, type: \"vec3\" },\r\n { name: \"dbg_uvPrimaryColor\", size: 3, type: \"vec3\" },\r\n { name: \"dbg_uvSecondaryColor\", size: 3, type: \"vec3\" },\r\n { name: \"dbg_materialColor\", size: 3, type: \"vec3\" },\r\n ],\r\n fragment: shaderLanguage === ShaderLanguage.GLSL ? fragmentUniforms : fragmentUniformsWebGPU,\r\n };\r\n }\r\n\r\n /**\r\n * Bind the uniform buffer\r\n * @param uniformBuffer Uniform buffer\r\n */\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n uniformBuffer.updateFloat3(\"dbg_shadedDiffuseColor\", this.shadedDiffuseColor.r, this.shadedDiffuseColor.g, this.shadedDiffuseColor.b);\r\n uniformBuffer.updateFloat4(\"dbg_shadedSpecularColorPower\", this.shadedSpecularColor.r, this.shadedSpecularColor.g, this.shadedSpecularColor.b, this.shadedSpecularPower);\r\n uniformBuffer.updateFloat3(\"dbg_thicknessRadiusScale\", this.wireframeThickness, this.vertexRadius, this.uvScale);\r\n uniformBuffer.updateColor3(\"dbg_wireframeTrianglesColor\", this.wireframeTrianglesColor);\r\n uniformBuffer.updateColor3(\"dbg_wireframeVerticesColor\", this.wireframeVerticesColor);\r\n uniformBuffer.updateColor3(\"dbg_vertexColor\", this.vertexColor);\r\n uniformBuffer.updateColor3(\"dbg_uvPrimaryColor\", this.uvPrimaryColor);\r\n uniformBuffer.updateColor3(\"dbg_uvSecondaryColor\", this.uvSecondaryColor);\r\n uniformBuffer.updateColor3(\"dbg_materialColor\", this._materialColor);\r\n }\r\n\r\n /**\r\n * Get shader code\r\n * @param shaderType \"vertex\" or \"fragment\"\r\n * @param shaderLanguage The shader language to use.\r\n * @returns Shader code\r\n */\r\n public override getCustomCode(shaderType: string, shaderLanguage = ShaderLanguage.GLSL): Nullable<{ [pointName: string]: string }> {\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n return shaderType === \"vertex\"\r\n ? {\r\n CUSTOM_VERTEX_DEFINITIONS: vertexDefinitionsWebGPU,\r\n CUSTOM_VERTEX_MAIN_END: vertexMainEndWebGPU,\r\n }\r\n : {\r\n CUSTOM_FRAGMENT_DEFINITIONS: fragmentDefinitionsWebGPU,\r\n CUSTOM_FRAGMENT_MAIN_END: fragmentMainEndWebGPU,\r\n };\r\n }\r\n\r\n return shaderType === \"vertex\"\r\n ? {\r\n CUSTOM_VERTEX_DEFINITIONS: vertexDefinitions,\r\n CUSTOM_VERTEX_MAIN_END: vertexMainEnd,\r\n }\r\n : {\r\n CUSTOM_FRAGMENT_DEFINITIONS: fragmentDefinitions,\r\n CUSTOM_FRAGMENT_MAIN_END: fragmentMainEnd,\r\n };\r\n }\r\n\r\n /**\r\n * Resets static variables of the plugin to their original state\r\n */\r\n public static Reset(): void {\r\n this._PluginCount = 0;\r\n this.MaterialColors = defaultMaterialColors;\r\n }\r\n\r\n /**\r\n * Renders triangles in a mesh 3 times by tripling the indices in the index buffer.\r\n * Used to prepare a mesh to be rendered in `TRIANGLES`, `VERTICES`, or `TRIANGLES_VERTICES` modes.\r\n * NOTE: This is a destructive operation. The mesh's index buffer and vertex buffers are modified, and a new vertex buffer is allocated.\r\n * If you'd like the ability to revert these changes, toggle the optional `returnRollback` flag.\r\n * @param mesh the mesh to target\r\n * @param returnRollback whether or not to return a function that reverts mesh to its initial state. Default: false.\r\n * @returns a rollback function if `returnRollback` is true, otherwise an empty function.\r\n */\r\n public static PrepareMeshForTrianglesAndVerticesMode(mesh: Mesh, returnRollback: boolean = false): () => void {\r\n let rollback = () => {};\r\n\r\n if (mesh.getTotalIndices() == 0) {\r\n return rollback;\r\n }\r\n\r\n if (returnRollback) {\r\n const kinds = mesh.getVerticesDataKinds();\r\n const indices = mesh.getIndices()!;\r\n const data: { [kind: string]: FloatArray } = {};\r\n for (const kind of kinds) {\r\n data[kind] = mesh.getVerticesData(kind)!;\r\n }\r\n\r\n rollback = function () {\r\n mesh.setIndices(indices);\r\n for (const kind of kinds) {\r\n const stride = mesh.getVertexBuffer(kind)!.getStrideSize();\r\n mesh.setVerticesData(kind, data[kind], undefined, stride);\r\n }\r\n mesh.removeVerticesData(\"dbg_initialPass\");\r\n };\r\n }\r\n\r\n let indices = Array.from(mesh.getIndices()!);\r\n const newIndices1 = [];\r\n for (let i = 0; i < indices.length; i += 3) {\r\n newIndices1.push(indices[i + 1], indices[i + 2], indices[i + 0]);\r\n }\r\n mesh.setIndices(indices.concat(newIndices1));\r\n\r\n mesh.convertToUnIndexedMesh();\r\n\r\n mesh.isUnIndexed = false;\r\n\r\n indices = Array.from(mesh.getIndices()!);\r\n const newIndices2 = [];\r\n for (let i = indices.length / 2; i < indices.length; i += 3) {\r\n newIndices2.push(indices[i + 1], indices[i + 2], indices[i + 0]);\r\n }\r\n mesh.setIndices(indices.concat(newIndices2));\r\n\r\n const num = mesh.getTotalVertices();\r\n const mid = num / 2;\r\n const pass = new Array(num).fill(1, 0, mid).fill(0, mid, num);\r\n mesh.setVerticesData(\"dbg_initialPass\", pass, false, 1);\r\n\r\n return rollback;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for meshDebugPluginMaterial.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterMeshDebugPluginMaterial(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.MeshDebugPluginMaterial\", MeshDebugPluginMaterial);\r\n}\r\n"]}
|
|
@@ -31,6 +31,8 @@ export declare class GaussianSplattingDebugger {
|
|
|
31
31
|
private _plugins;
|
|
32
32
|
private _meshes;
|
|
33
33
|
private _disposeObservers;
|
|
34
|
+
private _partCountObservers;
|
|
35
|
+
private _partRemovedObservers;
|
|
34
36
|
private _clippingBox;
|
|
35
37
|
private _opacityCulling;
|
|
36
38
|
private _sizeCulling;
|
|
@@ -30,6 +30,9 @@ export class GaussianSplattingDebugger {
|
|
|
30
30
|
this._plugins = [];
|
|
31
31
|
this._meshes = [];
|
|
32
32
|
this._disposeObservers = [];
|
|
33
|
+
// observable.add() returns Nullable<Observer<T>>; Observable.remove() accepts null safely.
|
|
34
|
+
this._partCountObservers = [];
|
|
35
|
+
this._partRemovedObservers = [];
|
|
33
36
|
// Cached option state so newly added meshes inherit current settings
|
|
34
37
|
this._clippingBox = null;
|
|
35
38
|
this._opacityCulling = null;
|
|
@@ -63,6 +66,12 @@ export class GaussianSplattingDebugger {
|
|
|
63
66
|
this._meshes.push(mesh);
|
|
64
67
|
this._plugins.push(plugin);
|
|
65
68
|
this._disposeObservers.push(mesh.onDisposeObservable.add(() => this.removeMesh(mesh)));
|
|
69
|
+
this._partCountObservers.push(mesh.onPartCountChangedObservable.add((count) => {
|
|
70
|
+
plugin.partCount = count;
|
|
71
|
+
}));
|
|
72
|
+
this._partRemovedObservers.push(mesh.onPartRemovedObservable.add((removedIndex) => {
|
|
73
|
+
plugin.shiftPartOptions(removedIndex);
|
|
74
|
+
}));
|
|
66
75
|
}
|
|
67
76
|
/**
|
|
68
77
|
* Removes a mesh and disposes its debug plugin.
|
|
@@ -74,20 +83,28 @@ export class GaussianSplattingDebugger {
|
|
|
74
83
|
return;
|
|
75
84
|
}
|
|
76
85
|
mesh.onDisposeObservable.remove(this._disposeObservers[idx]);
|
|
86
|
+
mesh.onPartCountChangedObservable.remove(this._partCountObservers[idx]);
|
|
87
|
+
mesh.onPartRemovedObservable.remove(this._partRemovedObservers[idx]);
|
|
77
88
|
this._plugins[idx].dispose();
|
|
78
89
|
this._meshes.splice(idx, 1);
|
|
79
90
|
this._plugins.splice(idx, 1);
|
|
80
91
|
this._disposeObservers.splice(idx, 1);
|
|
92
|
+
this._partCountObservers.splice(idx, 1);
|
|
93
|
+
this._partRemovedObservers.splice(idx, 1);
|
|
81
94
|
}
|
|
82
95
|
/** Disposes all debug plugins and clears the mesh list. */
|
|
83
96
|
dispose() {
|
|
84
97
|
for (let i = 0; i < this._meshes.length; i++) {
|
|
85
98
|
this._meshes[i].onDisposeObservable.remove(this._disposeObservers[i]);
|
|
99
|
+
this._meshes[i].onPartCountChangedObservable.remove(this._partCountObservers[i]);
|
|
100
|
+
this._meshes[i].onPartRemovedObservable.remove(this._partRemovedObservers[i]);
|
|
86
101
|
this._plugins[i].dispose();
|
|
87
102
|
}
|
|
88
103
|
this._meshes.length = 0;
|
|
89
104
|
this._plugins.length = 0;
|
|
90
105
|
this._disposeObservers.length = 0;
|
|
106
|
+
this._partCountObservers.length = 0;
|
|
107
|
+
this._partRemovedObservers.length = 0;
|
|
91
108
|
}
|
|
92
109
|
/**
|
|
93
110
|
* Returns the min/max size range of splats in a mesh.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gaussianSplattingDebugger.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/GaussianSplatting/gaussianSplattingDebugger.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { type Nullable } from \"../../types\";\nimport { type Observer } from \"../../Misc/observable\";\nimport { type Node } from \"../../node\";\nimport { type Vector3 } from \"../../Maths/math.vector\";\nimport { GaussianSplattingMaterial } from \"../../Materials/GaussianSplatting/gaussianSplattingMaterial.pure\";\nimport { GaussianSplattingDebugMaterialPlugin, type IGaussianSplattingDebugOptions } from \"../../Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure\";\nimport { type GaussianSplattingMeshBase } from \"./gaussianSplattingMeshBase.pure\";\n\n/**\n * Manages debug rendering options across a set of Gaussian splat meshes.\n * Create one instance, add meshes via addMesh(), then set options to apply\n * them to every registered mesh simultaneously.\n *\n * All options default to their \"off\" states so there is no rendering cost\n * until a feature is explicitly enabled.\n *\n * @example\n * ```ts\n * // Global options — applied to every registered mesh\n * const gsDebugger = new GaussianSplattingDebugger();\n * gsDebugger.addMesh(mesh1);\n * gsDebugger.addMesh(compoundMesh); // compound mesh with multiple parts\n * gsDebugger.clippingBox = { min: new Vector3(-2, -2, -2), max: new Vector3(2, 2, 2) };\n * gsDebugger.shOrder1 = false;\n *\n * // Per-part override — saturate opacity on part 0 of the compound mesh only,\n * // leaving all other parts (and mesh1) unaffected\n * gsDebugger.setPartOptions(compoundMesh, 0, { opacitySaturate: true });\n * // Later, restore part 0 to the global setting\n * gsDebugger.clearPartOptions(compoundMesh, 0);\n * ```\n */\nexport class GaussianSplattingDebugger {\n private _plugins: GaussianSplattingDebugMaterialPlugin[] = [];\n private _meshes: GaussianSplattingMeshBase[] = [];\n private _disposeObservers: Observer<Node>[] = [];\n\n // Cached option state so newly added meshes inherit current settings\n private _clippingBox: Nullable<{ min: Vector3; max: Vector3 }> = null;\n private _opacityCulling: Nullable<{ min: number; max: number }> = null;\n private _sizeCulling: Nullable<{ min: number; max: number }> = null;\n private _opacityScale: number = 1.0;\n private _opacitySaturate: boolean = false;\n private _shDc: boolean = true;\n private _shOrder1: boolean = true;\n private _shOrder2: boolean = true;\n private _shOrder3: boolean = true;\n private _shOrder4: boolean = true;\n\n /**\n * Adds a mesh to the debugger, attaching a debug plugin to its material.\n * The mesh must already have a GaussianSplattingMaterial assigned (i.e., data\n * must have been loaded at least once). Current option values are applied immediately.\n * The mesh is automatically unregistered if it is disposed.\n * @param mesh The mesh to register.\n */\n public addMesh(mesh: GaussianSplattingMeshBase): void {\n if (this._meshes.indexOf(mesh) !== -1) {\n return;\n }\n const mat = mesh.material;\n if (!(mat instanceof GaussianSplattingMaterial)) {\n throw new Error(\"GaussianSplattingDebugger.addMesh: mesh must have a GaussianSplattingMaterial.\");\n }\n const plugin = new GaussianSplattingDebugMaterialPlugin(mat);\n plugin.partCount = (mesh as unknown as { partCount?: number }).partCount ?? 0;\n this._applyAllTo(plugin);\n this._meshes.push(mesh);\n this._plugins.push(plugin);\n this._disposeObservers.push(mesh.onDisposeObservable.add(() => this.removeMesh(mesh))!);\n }\n\n /**\n * Removes a mesh and disposes its debug plugin.\n * @param mesh The mesh to unregister.\n */\n public removeMesh(mesh: GaussianSplattingMeshBase): void {\n const idx = this._meshes.indexOf(mesh);\n if (idx === -1) {\n return;\n }\n mesh.onDisposeObservable.remove(this._disposeObservers[idx]);\n this._plugins[idx].dispose();\n this._meshes.splice(idx, 1);\n this._plugins.splice(idx, 1);\n this._disposeObservers.splice(idx, 1);\n }\n\n /** Disposes all debug plugins and clears the mesh list. */\n public dispose(): void {\n for (let i = 0; i < this._meshes.length; i++) {\n this._meshes[i].onDisposeObservable.remove(this._disposeObservers[i]);\n this._plugins[i].dispose();\n }\n this._meshes.length = 0;\n this._plugins.length = 0;\n this._disposeObservers.length = 0;\n }\n\n /**\n * Returns the min/max size range of splats in a mesh.\n * Convenience wrapper for GaussianSplattingMeshBase.splatSizeRange.\n * @param mesh The mesh to query.\n * @returns the splat size range, or null if not yet computed.\n */\n public static GetSplatSizeRange(mesh: GaussianSplattingMeshBase): Nullable<{ min: number; max: number }> {\n return mesh.splatSizeRange;\n }\n\n // ----- Option setters (broadcast to all plugins) -----\n\n private _applyAllTo(plugin: GaussianSplattingDebugMaterialPlugin): void {\n plugin.clippingBox = this._clippingBox;\n plugin.opacityCulling = this._opacityCulling;\n plugin.sizeCulling = this._sizeCulling;\n plugin.opacityScale = this._opacityScale;\n plugin.opacitySaturate = this._opacitySaturate;\n plugin.shDc = this._shDc;\n plugin.shOrder1 = this._shOrder1;\n plugin.shOrder2 = this._shOrder2;\n plugin.shOrder3 = this._shOrder3;\n plugin.shOrder4 = this._shOrder4;\n }\n\n /**\n * World-space axis-aligned clipping box. Splats outside are not rendered.\n * Set to null to disable.\n */\n public get clippingBox(): Nullable<{ min: Vector3; max: Vector3 }> {\n return this._clippingBox;\n }\n public set clippingBox(value: Nullable<{ min: Vector3; max: Vector3 }>) {\n this._clippingBox = value;\n for (const p of this._plugins) {\n p.clippingBox = value;\n }\n }\n\n /**\n * Opacity culling range [0..1]. Splats outside this range are not rendered.\n * Set to null to disable.\n */\n public get opacityCulling(): Nullable<{ min: number; max: number }> {\n return this._opacityCulling;\n }\n public set opacityCulling(value: Nullable<{ min: number; max: number }>) {\n this._opacityCulling = value;\n for (const p of this._plugins) {\n p.opacityCulling = value;\n }\n }\n\n /**\n * Size culling range. Size is pow(|det(Σ)|, 1/6) of the 3D covariance matrix,\n * equal to the geometric mean of the principal radii. Splats outside this range are not rendered.\n * Use GaussianSplattingDebugger.GetSplatSizeRange(mesh) to find an asset's range.\n * Set to null to disable.\n */\n public get sizeCulling(): Nullable<{ min: number; max: number }> {\n return this._sizeCulling;\n }\n public set sizeCulling(value: Nullable<{ min: number; max: number }>) {\n this._sizeCulling = value;\n for (const p of this._plugins) {\n p.sizeCulling = value;\n }\n }\n\n /** Scalar multiplier applied to every splat's opacity. 1.0 = no change. */\n public get opacityScale(): number {\n return this._opacityScale;\n }\n public set opacityScale(value: number) {\n this._opacityScale = value;\n for (const p of this._plugins) {\n p.opacityScale = value;\n }\n }\n\n /**\n * When true, replaces the Gaussian spatial falloff with a flat uniform opacity,\n * showing each splat as a solid disk.\n */\n public get opacitySaturate(): boolean {\n return this._opacitySaturate;\n }\n public set opacitySaturate(value: boolean) {\n this._opacitySaturate = value;\n for (const p of this._plugins) {\n p.opacitySaturate = value;\n }\n }\n\n /** Include the DC (base) color from colorsTexture. Default: true. */\n public get shDc(): boolean {\n return this._shDc;\n }\n public set shDc(value: boolean) {\n this._shDc = value;\n for (const p of this._plugins) {\n p.shDc = value;\n }\n }\n\n /** Include SH band 1 contribution. Default: true. */\n public get shOrder1(): boolean {\n return this._shOrder1;\n }\n public set shOrder1(value: boolean) {\n this._shOrder1 = value;\n for (const p of this._plugins) {\n p.shOrder1 = value;\n }\n }\n\n /** Include SH band 2 contribution. Default: true. */\n public get shOrder2(): boolean {\n return this._shOrder2;\n }\n public set shOrder2(value: boolean) {\n this._shOrder2 = value;\n for (const p of this._plugins) {\n p.shOrder2 = value;\n }\n }\n\n /** Include SH band 3 contribution. Default: true. */\n public get shOrder3(): boolean {\n return this._shOrder3;\n }\n public set shOrder3(value: boolean) {\n this._shOrder3 = value;\n for (const p of this._plugins) {\n p.shOrder3 = value;\n }\n }\n\n /** Include SH band 4 contribution. Default: true. */\n public get shOrder4(): boolean {\n return this._shOrder4;\n }\n public set shOrder4(value: boolean) {\n this._shOrder4 = value;\n for (const p of this._plugins) {\n p.shOrder4 = value;\n }\n }\n\n // ----- Per-part API (compound meshes only) -----\n\n /**\n * Sets per-part debug overrides for a specific part of a compound mesh.\n * The mesh must already be registered via addMesh(). Logs an error if the mesh\n * is not compound (partCount is 0).\n * @param mesh The compound mesh.\n * @param partIndex The zero-based part index.\n * @param options Partial set of debug options to override for this part.\n */\n public setPartOptions(mesh: GaussianSplattingMeshBase, partIndex: number, options: Partial<IGaussianSplattingDebugOptions>): void {\n const idx = this._meshes.indexOf(mesh);\n if (idx < 0) {\n return;\n }\n this._plugins[idx].setPartOptions(partIndex, options);\n }\n\n /**\n * Clears all per-part debug overrides for a specific part, falling back to global settings.\n * @param mesh The compound mesh.\n * @param partIndex The zero-based part index.\n */\n public clearPartOptions(mesh: GaussianSplattingMeshBase, partIndex: number): void {\n const idx = this._meshes.indexOf(mesh);\n if (idx < 0) {\n return;\n }\n this._plugins[idx].clearPartOptions(partIndex);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"gaussianSplattingDebugger.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Meshes/GaussianSplatting/gaussianSplattingDebugger.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { type Nullable } from \"../../types\";\nimport { type Observer } from \"../../Misc/observable\";\nimport { type Node } from \"../../node\";\nimport { type Vector3 } from \"../../Maths/math.vector\";\nimport { GaussianSplattingMaterial } from \"../../Materials/GaussianSplatting/gaussianSplattingMaterial.pure\";\nimport { GaussianSplattingDebugMaterialPlugin, type IGaussianSplattingDebugOptions } from \"../../Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure\";\nimport { type GaussianSplattingMeshBase } from \"./gaussianSplattingMeshBase.pure\";\n\n/**\n * Manages debug rendering options across a set of Gaussian splat meshes.\n * Create one instance, add meshes via addMesh(), then set options to apply\n * them to every registered mesh simultaneously.\n *\n * All options default to their \"off\" states so there is no rendering cost\n * until a feature is explicitly enabled.\n *\n * @example\n * ```ts\n * // Global options — applied to every registered mesh\n * const gsDebugger = new GaussianSplattingDebugger();\n * gsDebugger.addMesh(mesh1);\n * gsDebugger.addMesh(compoundMesh); // compound mesh with multiple parts\n * gsDebugger.clippingBox = { min: new Vector3(-2, -2, -2), max: new Vector3(2, 2, 2) };\n * gsDebugger.shOrder1 = false;\n *\n * // Per-part override — saturate opacity on part 0 of the compound mesh only,\n * // leaving all other parts (and mesh1) unaffected\n * gsDebugger.setPartOptions(compoundMesh, 0, { opacitySaturate: true });\n * // Later, restore part 0 to the global setting\n * gsDebugger.clearPartOptions(compoundMesh, 0);\n * ```\n */\nexport class GaussianSplattingDebugger {\n private _plugins: GaussianSplattingDebugMaterialPlugin[] = [];\n private _meshes: GaussianSplattingMeshBase[] = [];\n private _disposeObservers: Observer<Node>[] = [];\n // observable.add() returns Nullable<Observer<T>>; Observable.remove() accepts null safely.\n private _partCountObservers: Nullable<Observer<number>>[] = [];\n private _partRemovedObservers: Nullable<Observer<number>>[] = [];\n\n // Cached option state so newly added meshes inherit current settings\n private _clippingBox: Nullable<{ min: Vector3; max: Vector3 }> = null;\n private _opacityCulling: Nullable<{ min: number; max: number }> = null;\n private _sizeCulling: Nullable<{ min: number; max: number }> = null;\n private _opacityScale: number = 1.0;\n private _opacitySaturate: boolean = false;\n private _shDc: boolean = true;\n private _shOrder1: boolean = true;\n private _shOrder2: boolean = true;\n private _shOrder3: boolean = true;\n private _shOrder4: boolean = true;\n\n /**\n * Adds a mesh to the debugger, attaching a debug plugin to its material.\n * The mesh must already have a GaussianSplattingMaterial assigned (i.e., data\n * must have been loaded at least once). Current option values are applied immediately.\n * The mesh is automatically unregistered if it is disposed.\n * @param mesh The mesh to register.\n */\n public addMesh(mesh: GaussianSplattingMeshBase): void {\n if (this._meshes.indexOf(mesh) !== -1) {\n return;\n }\n const mat = mesh.material;\n if (!(mat instanceof GaussianSplattingMaterial)) {\n throw new Error(\"GaussianSplattingDebugger.addMesh: mesh must have a GaussianSplattingMaterial.\");\n }\n const plugin = new GaussianSplattingDebugMaterialPlugin(mat);\n plugin.partCount = (mesh as unknown as { partCount?: number }).partCount ?? 0;\n this._applyAllTo(plugin);\n this._meshes.push(mesh);\n this._plugins.push(plugin);\n this._disposeObservers.push(mesh.onDisposeObservable.add(() => this.removeMesh(mesh))!);\n this._partCountObservers.push(\n mesh.onPartCountChangedObservable.add((count) => {\n plugin.partCount = count;\n })\n );\n this._partRemovedObservers.push(\n mesh.onPartRemovedObservable.add((removedIndex) => {\n plugin.shiftPartOptions(removedIndex);\n })\n );\n }\n\n /**\n * Removes a mesh and disposes its debug plugin.\n * @param mesh The mesh to unregister.\n */\n public removeMesh(mesh: GaussianSplattingMeshBase): void {\n const idx = this._meshes.indexOf(mesh);\n if (idx === -1) {\n return;\n }\n mesh.onDisposeObservable.remove(this._disposeObservers[idx]);\n mesh.onPartCountChangedObservable.remove(this._partCountObservers[idx]);\n mesh.onPartRemovedObservable.remove(this._partRemovedObservers[idx]);\n this._plugins[idx].dispose();\n this._meshes.splice(idx, 1);\n this._plugins.splice(idx, 1);\n this._disposeObservers.splice(idx, 1);\n this._partCountObservers.splice(idx, 1);\n this._partRemovedObservers.splice(idx, 1);\n }\n\n /** Disposes all debug plugins and clears the mesh list. */\n public dispose(): void {\n for (let i = 0; i < this._meshes.length; i++) {\n this._meshes[i].onDisposeObservable.remove(this._disposeObservers[i]);\n this._meshes[i].onPartCountChangedObservable.remove(this._partCountObservers[i]);\n this._meshes[i].onPartRemovedObservable.remove(this._partRemovedObservers[i]);\n this._plugins[i].dispose();\n }\n this._meshes.length = 0;\n this._plugins.length = 0;\n this._disposeObservers.length = 0;\n this._partCountObservers.length = 0;\n this._partRemovedObservers.length = 0;\n }\n\n /**\n * Returns the min/max size range of splats in a mesh.\n * Convenience wrapper for GaussianSplattingMeshBase.splatSizeRange.\n * @param mesh The mesh to query.\n * @returns the splat size range, or null if not yet computed.\n */\n public static GetSplatSizeRange(mesh: GaussianSplattingMeshBase): Nullable<{ min: number; max: number }> {\n return mesh.splatSizeRange;\n }\n\n // ----- Option setters (broadcast to all plugins) -----\n\n private _applyAllTo(plugin: GaussianSplattingDebugMaterialPlugin): void {\n plugin.clippingBox = this._clippingBox;\n plugin.opacityCulling = this._opacityCulling;\n plugin.sizeCulling = this._sizeCulling;\n plugin.opacityScale = this._opacityScale;\n plugin.opacitySaturate = this._opacitySaturate;\n plugin.shDc = this._shDc;\n plugin.shOrder1 = this._shOrder1;\n plugin.shOrder2 = this._shOrder2;\n plugin.shOrder3 = this._shOrder3;\n plugin.shOrder4 = this._shOrder4;\n }\n\n /**\n * World-space axis-aligned clipping box. Splats outside are not rendered.\n * Set to null to disable.\n */\n public get clippingBox(): Nullable<{ min: Vector3; max: Vector3 }> {\n return this._clippingBox;\n }\n public set clippingBox(value: Nullable<{ min: Vector3; max: Vector3 }>) {\n this._clippingBox = value;\n for (const p of this._plugins) {\n p.clippingBox = value;\n }\n }\n\n /**\n * Opacity culling range [0..1]. Splats outside this range are not rendered.\n * Set to null to disable.\n */\n public get opacityCulling(): Nullable<{ min: number; max: number }> {\n return this._opacityCulling;\n }\n public set opacityCulling(value: Nullable<{ min: number; max: number }>) {\n this._opacityCulling = value;\n for (const p of this._plugins) {\n p.opacityCulling = value;\n }\n }\n\n /**\n * Size culling range. Size is pow(|det(Σ)|, 1/6) of the 3D covariance matrix,\n * equal to the geometric mean of the principal radii. Splats outside this range are not rendered.\n * Use GaussianSplattingDebugger.GetSplatSizeRange(mesh) to find an asset's range.\n * Set to null to disable.\n */\n public get sizeCulling(): Nullable<{ min: number; max: number }> {\n return this._sizeCulling;\n }\n public set sizeCulling(value: Nullable<{ min: number; max: number }>) {\n this._sizeCulling = value;\n for (const p of this._plugins) {\n p.sizeCulling = value;\n }\n }\n\n /** Scalar multiplier applied to every splat's opacity. 1.0 = no change. */\n public get opacityScale(): number {\n return this._opacityScale;\n }\n public set opacityScale(value: number) {\n this._opacityScale = value;\n for (const p of this._plugins) {\n p.opacityScale = value;\n }\n }\n\n /**\n * When true, replaces the Gaussian spatial falloff with a flat uniform opacity,\n * showing each splat as a solid disk.\n */\n public get opacitySaturate(): boolean {\n return this._opacitySaturate;\n }\n public set opacitySaturate(value: boolean) {\n this._opacitySaturate = value;\n for (const p of this._plugins) {\n p.opacitySaturate = value;\n }\n }\n\n /** Include the DC (base) color from colorsTexture. Default: true. */\n public get shDc(): boolean {\n return this._shDc;\n }\n public set shDc(value: boolean) {\n this._shDc = value;\n for (const p of this._plugins) {\n p.shDc = value;\n }\n }\n\n /** Include SH band 1 contribution. Default: true. */\n public get shOrder1(): boolean {\n return this._shOrder1;\n }\n public set shOrder1(value: boolean) {\n this._shOrder1 = value;\n for (const p of this._plugins) {\n p.shOrder1 = value;\n }\n }\n\n /** Include SH band 2 contribution. Default: true. */\n public get shOrder2(): boolean {\n return this._shOrder2;\n }\n public set shOrder2(value: boolean) {\n this._shOrder2 = value;\n for (const p of this._plugins) {\n p.shOrder2 = value;\n }\n }\n\n /** Include SH band 3 contribution. Default: true. */\n public get shOrder3(): boolean {\n return this._shOrder3;\n }\n public set shOrder3(value: boolean) {\n this._shOrder3 = value;\n for (const p of this._plugins) {\n p.shOrder3 = value;\n }\n }\n\n /** Include SH band 4 contribution. Default: true. */\n public get shOrder4(): boolean {\n return this._shOrder4;\n }\n public set shOrder4(value: boolean) {\n this._shOrder4 = value;\n for (const p of this._plugins) {\n p.shOrder4 = value;\n }\n }\n\n // ----- Per-part API (compound meshes only) -----\n\n /**\n * Sets per-part debug overrides for a specific part of a compound mesh.\n * The mesh must already be registered via addMesh(). Logs an error if the mesh\n * is not compound (partCount is 0).\n * @param mesh The compound mesh.\n * @param partIndex The zero-based part index.\n * @param options Partial set of debug options to override for this part.\n */\n public setPartOptions(mesh: GaussianSplattingMeshBase, partIndex: number, options: Partial<IGaussianSplattingDebugOptions>): void {\n const idx = this._meshes.indexOf(mesh);\n if (idx < 0) {\n return;\n }\n this._plugins[idx].setPartOptions(partIndex, options);\n }\n\n /**\n * Clears all per-part debug overrides for a specific part, falling back to global settings.\n * @param mesh The compound mesh.\n * @param partIndex The zero-based part index.\n */\n public clearPartOptions(mesh: GaussianSplattingMeshBase, partIndex: number): void {\n const idx = this._meshes.indexOf(mesh);\n if (idx < 0) {\n return;\n }\n this._plugins[idx].clearPartOptions(partIndex);\n }\n}\n"]}
|
|
@@ -901,6 +901,7 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
901
901
|
this._canPostToWorker = true;
|
|
902
902
|
this._postToWorker(true);
|
|
903
903
|
}
|
|
904
|
+
this.onPartCountChangedObservable.notifyObservers(this.partCount);
|
|
904
905
|
return { proxyMeshes, assignedPartIndices };
|
|
905
906
|
}
|
|
906
907
|
catch (e) {
|
|
@@ -962,6 +963,8 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
962
963
|
throw new Error(`Cannot remove part: the SH data for part "${proxyMesh.name}" is not available.`);
|
|
963
964
|
}
|
|
964
965
|
}
|
|
966
|
+
// Notify listeners before mutation so they can record state keyed on the original index.
|
|
967
|
+
this.onPartRemovedObservable.notifyObservers(index);
|
|
965
968
|
// --- Reset this mesh to an empty state ---
|
|
966
969
|
// Terminate the sort worker before zeroing _vertexCount. The worker's onmessage handler
|
|
967
970
|
// compares depthMix.length against (_vertexCount + 15) & ~0xf; with _vertexCount = 0 that
|
|
@@ -1021,6 +1024,7 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
|
|
|
1021
1024
|
if (survivors.length === 0) {
|
|
1022
1025
|
// Nothing left — leave the mesh empty.
|
|
1023
1026
|
this.setEnabled(false);
|
|
1027
|
+
this.onPartCountChangedObservable.notifyObservers(0);
|
|
1024
1028
|
return;
|
|
1025
1029
|
}
|
|
1026
1030
|
// Gate the sort worker: suppress any sort request until the full rebuild is committed.
|