@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
|
@@ -13,7 +13,7 @@ export class FlowGraphCancelDelayBlock extends FlowGraphExecutionBlockWithOutSig
|
|
|
13
13
|
}
|
|
14
14
|
_execute(context, _callingSignal) {
|
|
15
15
|
const delayIndex = getNumericValue(this.delayIndex.getValue(context));
|
|
16
|
-
if (delayIndex
|
|
16
|
+
if (delayIndex < 0 || isNaN(delayIndex) || !isFinite(delayIndex)) {
|
|
17
17
|
return this._reportError(context, "Invalid delay index");
|
|
18
18
|
}
|
|
19
19
|
const timers = context._getGlobalContextVariable("pendingDelays", []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flowGraphCancelDelayBlock.pure.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAM7D,OAAO,EAAE,oCAAoC,EAAE,MAAM,+CAA+C,CAAC;AACrG,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAI5E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,oCAAoC;IAM/E,YAAY,MAAqC;QAC7C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;IACrF,CAAC;IAEM,QAAQ,CAAC,OAAyB,EAAE,cAAyC;QAChF,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACtE,IAAI,UAAU,
|
|
1
|
+
{"version":3,"file":"flowGraphCancelDelayBlock.pure.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAM7D,OAAO,EAAE,oCAAoC,EAAE,MAAM,+CAA+C,CAAC;AACrG,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAI5E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,oCAAoC;IAM/E,YAAY,MAAqC;QAC7C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;IACrF,CAAC;IAEM,QAAQ,CAAC,OAAyB,EAAE,cAAyC;QAChF,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACtE,IAAI,UAAU,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,eAAe,EAAE,EAAqB,CAAC,CAAC;QACzF,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,KAAK,EAAE,CAAC;YACR,KAAK,CAAC,OAAO,EAAE,CAAC;YAChB,+EAA+E;QACnF,CAAC;QACD,+BAA+B;QAC/B,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAEe,YAAY;QACxB,yEAAuC;IAC3C,CAAC;CACJ;AAED,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB;;;GAGG;AACH,MAAM,UAAU,iCAAiC;IAC7C,IAAI,WAAW,EAAE,CAAC;QACd,OAAO;IACX,CAAC;IACD,WAAW,GAAG,IAAI,CAAC;IAEnB,aAAa,oEAAkC,yBAAyB,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { type AdvancedTimer } from \"../../../../Misc/timer\";\nimport { type IFlowGraphBlockConfiguration } from \"../../../flowGraphBlock\";\nimport { type FlowGraphContext } from \"../../../flowGraphContext\";\nimport { type FlowGraphDataConnection } from \"../../../flowGraphDataConnection.pure\";\nimport { FlowGraphExecutionBlockWithOutSignal } from \"../../../flowGraphExecutionBlockWithOutSignal\";\nimport { RichTypeFlowGraphInteger } from \"../../../flowGraphRichTypes.pure\";\nimport { type FlowGraphSignalConnection } from \"../../../flowGraphSignalConnection.pure\";\nimport { FlowGraphBlockNames } from \"../../flowGraphBlockNames\";\nimport { type FlowGraphInteger } from \"core/FlowGraph/CustomTypes/flowGraphInteger.pure\";\nimport { getNumericValue } from \"core/FlowGraph/utils\";\nimport { RegisterClass } from \"core/Misc/typeStore\";\n\n/**\n * This block cancels a delay that was previously scheduled.\n */\nexport class FlowGraphCancelDelayBlock extends FlowGraphExecutionBlockWithOutSignal {\n /**\n * Input connection: The index value of the scheduled activation to be cancelled.\n */\n public readonly delayIndex: FlowGraphDataConnection<FlowGraphInteger>;\n\n constructor(config?: IFlowGraphBlockConfiguration) {\n super(config);\n this.delayIndex = this.registerDataInput(\"delayIndex\", RichTypeFlowGraphInteger);\n }\n\n public _execute(context: FlowGraphContext, _callingSignal: FlowGraphSignalConnection): void {\n const delayIndex = getNumericValue(this.delayIndex.getValue(context));\n if (delayIndex < 0 || isNaN(delayIndex) || !isFinite(delayIndex)) {\n return this._reportError(context, \"Invalid delay index\");\n }\n const timers = context._getGlobalContextVariable(\"pendingDelays\", [] as AdvancedTimer[]);\n const timer = timers[delayIndex];\n if (timer) {\n timer.dispose();\n // not removing it from the array. Disposing it will clear all of its resources\n }\n // activate the out output flow\n this.out._activateSignal(context);\n }\n\n public override getClassName(): string {\n return FlowGraphBlockNames.CancelDelay;\n }\n}\n\nlet _Registered = false;\n/**\n * Register side effects for flowGraphCancelDelayBlock.\n * Safe to call multiple times; only the first call has an effect.\n */\nexport function RegisterFlowGraphCancelDelayBlock(): void {\n if (_Registered) {\n return;\n }\n _Registered = true;\n\n RegisterClass(FlowGraphBlockNames.CancelDelay, FlowGraphCancelDelayBlock);\n}\n"]}
|
|
@@ -102,6 +102,7 @@ export declare class GaussianSplattingDebugMaterialPlugin extends MaterialPlugin
|
|
|
102
102
|
private _partShOrder2s;
|
|
103
103
|
private _partShOrder3s;
|
|
104
104
|
private _partShOrder4s;
|
|
105
|
+
private readonly _partArrays;
|
|
105
106
|
private _dbgPartDataTexture;
|
|
106
107
|
private _textureDirty;
|
|
107
108
|
private _maxPartCount;
|
|
@@ -132,6 +133,13 @@ export declare class GaussianSplattingDebugMaterialPlugin extends MaterialPlugin
|
|
|
132
133
|
* @param partIndex The zero-based part index.
|
|
133
134
|
*/
|
|
134
135
|
clearPartOptions(partIndex: number): void;
|
|
136
|
+
/**
|
|
137
|
+
* Removes the per-part override slot at `removedIndex` and shifts all higher-indexed
|
|
138
|
+
* slots down by one, keeping the arrays aligned with the compound mesh's new part layout.
|
|
139
|
+
* @param removedIndex The original (pre-removal) part index.
|
|
140
|
+
* @internal
|
|
141
|
+
*/
|
|
142
|
+
shiftPartOptions(removedIndex: number): void;
|
|
135
143
|
/**
|
|
136
144
|
* World-space axis-aligned clipping box. Splats outside are not rendered.
|
|
137
145
|
* Set to null to disable clipping.
|
|
@@ -77,6 +77,18 @@ export class GaussianSplattingDebugMaterialPlugin extends MaterialPluginBase {
|
|
|
77
77
|
this._dbgPartDataTexture = null;
|
|
78
78
|
this._textureDirty = false;
|
|
79
79
|
this._maxPartCount = 0;
|
|
80
|
+
this._partArrays = [
|
|
81
|
+
this._partClippingBoxes,
|
|
82
|
+
this._partOpacityCullings,
|
|
83
|
+
this._partSizeCullings,
|
|
84
|
+
this._partOpacityScales,
|
|
85
|
+
this._partOpacitySaturates,
|
|
86
|
+
this._partShDcs,
|
|
87
|
+
this._partShOrder1s,
|
|
88
|
+
this._partShOrder2s,
|
|
89
|
+
this._partShOrder3s,
|
|
90
|
+
this._partShOrder4s,
|
|
91
|
+
];
|
|
80
92
|
}
|
|
81
93
|
_isAnyFeatureActive() {
|
|
82
94
|
return (this._clippingBox !== null ||
|
|
@@ -180,6 +192,20 @@ export class GaussianSplattingDebugMaterialPlugin extends MaterialPluginBase {
|
|
|
180
192
|
this._partShOrder4s[partIndex] = null;
|
|
181
193
|
this._markDirty();
|
|
182
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Removes the per-part override slot at `removedIndex` and shifts all higher-indexed
|
|
197
|
+
* slots down by one, keeping the arrays aligned with the compound mesh's new part layout.
|
|
198
|
+
* @param removedIndex The original (pre-removal) part index.
|
|
199
|
+
* @internal
|
|
200
|
+
*/
|
|
201
|
+
shiftPartOptions(removedIndex) {
|
|
202
|
+
for (const arr of this._partArrays) {
|
|
203
|
+
if (removedIndex < arr.length) {
|
|
204
|
+
arr.splice(removedIndex, 1);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
this._markDirty();
|
|
208
|
+
}
|
|
183
209
|
/**
|
|
184
210
|
* World-space axis-aligned clipping box. Splats outside are not rendered.
|
|
185
211
|
* Set to null to disable clipping.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gaussianSplattingDebugMaterialPlugin.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.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 Scene } from \"../../scene\";\nimport { type AbstractEngine } from \"../../Engines/abstractEngine\";\nimport { type SubMesh } from \"../../Meshes/subMesh\";\nimport { type UniformBuffer } from \"../uniformBuffer\";\nimport { MaterialDefines } from \"../materialDefines\";\nimport { MaterialPluginBase } from \"../materialPluginBase.pure\";\nimport { ShaderLanguage } from \"../shaderLanguage\";\nimport { RegisterClass } from \"../../Misc/typeStore\";\nimport { type Vector3 } from \"../../Maths/math.vector\";\nimport { Logger } from \"../../Misc/logger\";\nimport { type GaussianSplattingMaterial, GetGaussianSplattingMaxPartCount } from \"./gaussianSplattingMaterial.pure\";\nimport { RawTexture } from \"../Textures/rawTexture\";\nimport { Constants } from \"../../Engines/constants\";\n\n/** @internal */\nclass GaussianSplattingDebugDefines extends MaterialDefines {\n /** Defines whether any debug feature is active */\n GS_DBG_ENABLED: boolean = false;\n /** Defines whether world-space clipping box is enabled (0: off, 1: on) */\n GS_DBG_CLIP: number = 0;\n /** Defines whether opacity culling is enabled (0: off, 1: on) */\n GS_DBG_CULL_OPACITY: number = 0;\n /** Defines whether size culling is enabled (0: off, 1: on) */\n GS_DBG_CULL_SIZE: number = 0;\n /** Defines whether per-splat opacity scaling is enabled (0: off, 1: on) */\n GS_DBG_OPACITY_SCALE: number = 0;\n /** Defines whether opacity saturation (flat disk) is enabled (0: off, 1: on) */\n GS_DBG_OPACITY_SATURATE: number = 0;\n /** Defines whether the DC (base) SH color is included (0: off, 1: on) */\n GS_DBG_SH_DC: number = 1;\n /** Defines whether SH band 1 contribution is included (0: off, 1: on) */\n GS_DBG_SH_ORDER1: number = 1;\n /** Defines whether SH band 2 contribution is included (0: off, 1: on) */\n GS_DBG_SH_ORDER2: number = 1;\n /** Defines whether SH band 3 contribution is included (0: off, 1: on) */\n GS_DBG_SH_ORDER3: number = 1;\n /** Defines whether SH band 4 contribution is included (0: off, 1: on) */\n GS_DBG_SH_ORDER4: number = 1;\n}\n\n/**\n * Per-part debug options for compound Gaussian splat meshes.\n * Each field is optional; unset fields fall back to the global setting on the plugin,\n * and if that is also unset, a neutral value is used (no culling, full SH, etc.).\n */\nexport interface IGaussianSplattingDebugOptions {\n /** World-space axis-aligned clipping box, or null to disable. */\n clippingBox: Nullable<{ min: Vector3; max: Vector3 }>;\n /** Opacity culling range [0..1], or null to disable. */\n opacityCulling: Nullable<{ min: number; max: number }>;\n /** Size culling range, or null to disable. */\n sizeCulling: Nullable<{ min: number; max: number }>;\n /** Scalar opacity multiplier. 1.0 = no change. */\n opacityScale: number;\n /** When true, replaces Gaussian falloff with flat disk opacity. */\n opacitySaturate: boolean;\n /** Include the DC (base) SH color. */\n shDc: boolean;\n /** Include SH band 1 contribution. */\n shOrder1: boolean;\n /** Include SH band 2 contribution. */\n shOrder2: boolean;\n /** Include SH band 3 contribution. */\n shOrder3: boolean;\n /** Include SH band 4 contribution. */\n shOrder4: boolean;\n}\n\n/**\n * Debug plugin for GaussianSplattingMaterial.\n * Provides runtime controls for clipping, opacity/size culling, opacity scaling,\n * opacity saturation, and per-SH-order toggling. All features are gated behind\n * the GS_DBG_ENABLED shader define — when every option is at its default value\n * the define is absent and the shader compiles to identical code as without the plugin.\n *\n * In compound mode (partCount \\> 0), per-part overrides can be set via setPartOptions().\n * Global settings act as defaults; per-part settings override them for that part index.\n */\nexport class GaussianSplattingDebugMaterialPlugin extends MaterialPluginBase {\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 // Per-part state (only populated when partCount > 0)\n private _partCount: number = 0;\n private _partClippingBoxes: Array<Nullable<{ min: Vector3; max: Vector3 }>> = [];\n private _partOpacityCullings: Array<Nullable<{ min: number; max: number }>> = [];\n private _partSizeCullings: Array<Nullable<{ min: number; max: number }>> = [];\n private _partOpacityScales: Array<Nullable<number>> = [];\n private _partOpacitySaturates: Array<Nullable<boolean>> = [];\n private _partShDcs: Array<Nullable<boolean>> = [];\n private _partShOrder1s: Array<Nullable<boolean>> = [];\n private _partShOrder2s: Array<Nullable<boolean>> = [];\n private _partShOrder3s: Array<Nullable<boolean>> = [];\n private _partShOrder4s: Array<Nullable<boolean>> = [];\n\n // Per-part debug LUT: MAX_PART_COUNT × 5 RGBA float texture (dbgPartData)\n private _dbgPartDataTexture: Nullable<RawTexture> = null;\n private _textureDirty: boolean = false;\n private _maxPartCount: number = 0;\n\n /**\n * Creates a new GaussianSplattingDebugMaterialPlugin.\n * @param material The GaussianSplattingMaterial to attach the plugin to.\n */\n constructor(material: GaussianSplattingMaterial) {\n super(material, \"GaussianSplattingDebug\", 200, new GaussianSplattingDebugDefines(), true, true);\n }\n\n private _isAnyFeatureActive(): boolean {\n return (\n this._clippingBox !== null ||\n this._opacityCulling !== null ||\n this._sizeCulling !== null ||\n this._opacityScale !== 1.0 ||\n this._opacitySaturate ||\n !this._shDc ||\n !this._shOrder1 ||\n !this._shOrder2 ||\n !this._shOrder3 ||\n !this._shOrder4 ||\n this._partClippingBoxes.some((b) => b !== null) ||\n this._partOpacityCullings.some((b) => b !== null) ||\n this._partSizeCullings.some((b) => b !== null) ||\n this._partOpacityScales.some((s) => s !== null) ||\n this._partOpacitySaturates.some((s) => s !== null) ||\n this._partShDcs.some((s) => s !== null) ||\n this._partShOrder1s.some((s) => s !== null) ||\n this._partShOrder2s.some((s) => s !== null) ||\n this._partShOrder3s.some((s) => s !== null) ||\n this._partShOrder4s.some((s) => s !== null)\n );\n }\n\n private _markDirty(): void {\n this.markAllDefinesAsDirty();\n this._textureDirty = true;\n }\n\n // ----- Public API -----\n\n /**\n * Number of parts in compound mode. Set automatically by GaussianSplattingDebugger.addMesh().\n * When 0 (non-compound), setPartOptions() logs an error.\n * @returns the part count\n */\n public get partCount(): number {\n return this._partCount;\n }\n public set partCount(count: number) {\n if (this._partCount !== count) {\n this._partCount = count;\n this._markDirty();\n }\n }\n\n /**\n * Sets per-part debug overrides for the given part index.\n * Only valid on compound meshes (partCount \\> 0); logs an error otherwise.\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(partIndex: number, options: Partial<IGaussianSplattingDebugOptions>): void {\n if (this._partCount === 0) {\n Logger.Error(\"GaussianSplattingDebugMaterialPlugin.setPartOptions: called on a non-compound mesh. partCount is 0.\");\n return;\n }\n if (options.clippingBox !== undefined) {\n this._partClippingBoxes[partIndex] = options.clippingBox;\n }\n if (options.opacityCulling !== undefined) {\n this._partOpacityCullings[partIndex] = options.opacityCulling;\n }\n if (options.sizeCulling !== undefined) {\n this._partSizeCullings[partIndex] = options.sizeCulling;\n }\n if (options.opacityScale !== undefined) {\n this._partOpacityScales[partIndex] = options.opacityScale;\n }\n if (options.opacitySaturate !== undefined) {\n this._partOpacitySaturates[partIndex] = options.opacitySaturate;\n }\n if (options.shDc !== undefined) {\n this._partShDcs[partIndex] = options.shDc;\n }\n if (options.shOrder1 !== undefined) {\n this._partShOrder1s[partIndex] = options.shOrder1;\n }\n if (options.shOrder2 !== undefined) {\n this._partShOrder2s[partIndex] = options.shOrder2;\n }\n if (options.shOrder3 !== undefined) {\n this._partShOrder3s[partIndex] = options.shOrder3;\n }\n if (options.shOrder4 !== undefined) {\n this._partShOrder4s[partIndex] = options.shOrder4;\n }\n this._markDirty();\n }\n\n /**\n * Clears all per-part debug overrides for the given part index,\n * falling back to global settings.\n * @param partIndex The zero-based part index.\n */\n public clearPartOptions(partIndex: number): void {\n this._partClippingBoxes[partIndex] = null;\n this._partOpacityCullings[partIndex] = null;\n this._partSizeCullings[partIndex] = null;\n this._partOpacityScales[partIndex] = null;\n this._partOpacitySaturates[partIndex] = null;\n this._partShDcs[partIndex] = null;\n this._partShOrder1s[partIndex] = null;\n this._partShOrder2s[partIndex] = null;\n this._partShOrder3s[partIndex] = null;\n this._partShOrder4s[partIndex] = null;\n this._markDirty();\n }\n\n /**\n * World-space axis-aligned clipping box. Splats outside are not rendered.\n * Set to null to disable clipping.\n * Example: `{ min: new Vector3(-2,-2,-2), max: new Vector3(2,2,2) }`\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 this._markDirty();\n }\n\n /**\n * Opacity culling range [0..1]. Splats whose stored opacity falls outside this\n * range are not rendered. 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 this._markDirty();\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. Use GaussianSplattingMeshBase.splatSizeRange\n * to find the asset's range. 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 this._markDirty();\n }\n\n /**\n * Scalar multiplier applied to every splat's opacity after all other modifiers.\n * 1.0 (default) = no change.\n */\n public get opacityScale(): number {\n return this._opacityScale;\n }\n public set opacityScale(value: number) {\n this._opacityScale = value;\n this._markDirty();\n }\n\n /**\n * When true, replaces the Gaussian spatial falloff with a flat uniform opacity,\n * making each splat appear as a solid disk with its raw alpha value.\n */\n public get opacitySaturate(): boolean {\n return this._opacitySaturate;\n }\n public set opacitySaturate(value: boolean) {\n this._opacitySaturate = value;\n this._markDirty();\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 this._markDirty();\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 this._markDirty();\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 this._markDirty();\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 this._markDirty();\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 this._markDirty();\n }\n\n // ----- Plugin overrides -----\n\n /**\n * Adds the per-part debug data texture name to the sampler list so the effect can bind it.\n * @param samplers the sampler list to populate\n */\n public override getSamplers(samplers: string[]): void {\n samplers.push(\"dbgPartData\");\n }\n\n /** @returns the class name of this plugin */\n public override getClassName(): string {\n return \"GaussianSplattingDebugMaterialPlugin\";\n }\n\n /**\n * @param shaderLanguage the shader language to check\n * @returns true for GLSL and WGSL\n */\n public override isCompatible(shaderLanguage: ShaderLanguage): boolean {\n switch (shaderLanguage) {\n case ShaderLanguage.GLSL:\n case ShaderLanguage.WGSL:\n return true;\n default:\n return false;\n }\n }\n\n /**\n * Always ready — no async resources.\n * @param _defines unused\n * @param _scene unused\n * @param _engine unused\n * @param _subMesh unused\n * @returns true\n */\n public override isReadyForSubMesh(_defines: MaterialDefines, _scene: Scene, _engine: AbstractEngine, _subMesh: SubMesh): boolean {\n return true;\n }\n\n /**\n * Sets shader defines from current property state. GS_DBG_ENABLED is set to true\n * only when at least one feature is non-default, ensuring zero overhead otherwise.\n * Sub-flags also check per-part arrays so compound-only overrides activate the correct\n * code paths even when the global setting is at its default.\n * @param defines the defines object\n */\n public override prepareDefines(defines: GaussianSplattingDebugDefines): void {\n defines.GS_DBG_ENABLED = this._isAnyFeatureActive();\n defines.GS_DBG_CLIP = this._clippingBox !== null || this._partClippingBoxes.some((b) => b !== null) ? 1 : 0;\n defines.GS_DBG_CULL_OPACITY = this._opacityCulling !== null || this._partOpacityCullings.some((b) => b !== null) ? 1 : 0;\n defines.GS_DBG_CULL_SIZE = this._sizeCulling !== null || this._partSizeCullings.some((b) => b !== null) ? 1 : 0;\n defines.GS_DBG_OPACITY_SCALE = this._opacityScale !== 1.0 || this._partOpacityScales.some((s) => s !== null) ? 1 : 0;\n defines.GS_DBG_OPACITY_SATURATE = this._opacitySaturate || this._partOpacitySaturates.some((s) => s !== null) ? 1 : 0;\n defines.GS_DBG_SH_DC = !this._shDc || this._partShDcs.some((s) => s !== null) ? 0 : 1;\n defines.GS_DBG_SH_ORDER1 = !this._shOrder1 || this._partShOrder1s.some((s) => s !== null) ? 0 : 1;\n defines.GS_DBG_SH_ORDER2 = !this._shOrder2 || this._partShOrder2s.some((s) => s !== null) ? 0 : 1;\n defines.GS_DBG_SH_ORDER3 = !this._shOrder3 || this._partShOrder3s.some((s) => s !== null) ? 0 : 1;\n defines.GS_DBG_SH_ORDER4 = !this._shOrder4 || this._partShOrder4s.some((s) => s !== null) ? 0 : 1;\n }\n\n /**\n * Returns shader code injections for the debug features.\n * @param shaderType \"vertex\" or \"fragment\"\n * @param shaderLanguage GLSL or WGSL\n * @returns map of injection-point name to injected code, or null\n */\n public override getCustomCode(shaderType: string, shaderLanguage = ShaderLanguage.GLSL): Nullable<{ [pointName: string]: string }> {\n if (shaderLanguage === ShaderLanguage.WGSL) {\n return this._getCustomCodeWGSL(shaderType);\n }\n return this._getCustomCodeGLSL(shaderType);\n }\n\n private _getCustomCodeGLSL(shaderType: string): Nullable<{ [pointName: string]: string }> {\n if (shaderType === \"vertex\") {\n return {\n CUSTOM_VERTEX_DEFINITIONS: `\n#if defined(GS_DBG_ENABLED) && GS_DBG_CLIP == 1 && !defined(IS_COMPOUND)\nuniform vec3 dbgClipMin;\nuniform vec3 dbgClipMax;\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_OPACITY == 1 && !defined(IS_COMPOUND)\nuniform float dbgMinOpacity;\nuniform float dbgMaxOpacity;\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_SIZE == 1 && !defined(IS_COMPOUND)\nuniform float dbgMinSize;\nuniform float dbgMaxSize;\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_OPACITY_SCALE == 1 && !defined(IS_COMPOUND)\nuniform float dbgOpacityScale;\n#endif\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\nuniform sampler2D dbgPartData;\nvarying float vPartIndex;\n#endif\n`,\n CUSTOM_VERTEX_UPDATE: `\n#if defined(GS_DBG_ENABLED) && GS_DBG_CLIP == 1 && !defined(IS_COMPOUND)\n if (worldPos.x < dbgClipMin.x || worldPos.x > dbgClipMax.x ||\n worldPos.y < dbgClipMin.y || worldPos.y > dbgClipMax.y ||\n worldPos.z < dbgClipMin.z || worldPos.z > dbgClipMax.z) {\n scale = vec2(0.0);\n }\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_OPACITY == 1 && !defined(IS_COMPOUND)\n if (splat.color.w < dbgMinOpacity || splat.color.w > dbgMaxOpacity) {\n scale = vec2(0.0);\n }\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_SIZE == 1 && !defined(IS_COMPOUND)\n {\n float _d0 = splat.covA.x; float _d1 = splat.covA.y; float _d2 = splat.covA.z;\n float _d3 = splat.covA.w; float _d4 = splat.covB.x; float _d5 = splat.covB.y;\n float _det = _d0*(_d3*_d5 - _d4*_d4) - _d1*(_d1*_d5 - _d4*_d2) + _d2*(_d1*_d4 - _d3*_d2);\n float _sz = pow(abs(_det), 1.0/6.0);\n if (_sz < dbgMinSize || _sz > dbgMaxSize) {\n scale = vec2(0.0);\n }\n }\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_OPACITY_SCALE == 1 && !defined(IS_COMPOUND)\n vColor.w *= dbgOpacityScale;\n#endif\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\n {\n int _pIdx = int(splat.partIndex);\n vPartIndex = float(splat.partIndex);\n vec4 _row0 = texelFetch(dbgPartData, ivec2(_pIdx, 0), 0);\n vec4 _row1 = texelFetch(dbgPartData, ivec2(_pIdx, 1), 0);\n vec4 _row2 = texelFetch(dbgPartData, ivec2(_pIdx, 2), 0);\n vec3 _clipMin = _row0.xyz;\n vec3 _clipMax = vec3(_row0.w, _row1.xy);\n float _minOp = _row1.z;\n float _maxOp = _row1.w;\n float _minSz = _row2.x;\n float _maxSz = _row2.y;\n float _opSc = _row2.z;\n #if GS_DBG_CLIP == 1\n if (worldPos.x < _clipMin.x || worldPos.x > _clipMax.x ||\n worldPos.y < _clipMin.y || worldPos.y > _clipMax.y ||\n worldPos.z < _clipMin.z || worldPos.z > _clipMax.z) {\n scale = vec2(0.0);\n }\n #endif\n #if GS_DBG_CULL_OPACITY == 1\n if (splat.color.w < _minOp || splat.color.w > _maxOp) {\n scale = vec2(0.0);\n }\n #endif\n #if GS_DBG_CULL_SIZE == 1\n {\n float _d0 = splat.covA.x; float _d1 = splat.covA.y; float _d2 = splat.covA.z;\n float _d3 = splat.covA.w; float _d4 = splat.covB.x; float _d5 = splat.covB.y;\n float _det = _d0*(_d3*_d5 - _d4*_d4) - _d1*(_d1*_d5 - _d4*_d2) + _d2*(_d1*_d4 - _d3*_d2);\n float _sz = pow(abs(_det), 1.0/6.0);\n if (_sz < _minSz || _sz > _maxSz) {\n scale = vec2(0.0);\n }\n }\n #endif\n #if GS_DBG_OPACITY_SCALE == 1\n vColor.w *= _opSc;\n #endif\n }\n#endif\n`,\n };\n } else if (shaderType === \"fragment\") {\n return {\n CUSTOM_FRAGMENT_DEFINITIONS: `\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\nuniform sampler2D dbgPartData;\nvarying float vPartIndex;\n#endif\n`,\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\n if (texelFetch(dbgPartData, ivec2(int(vPartIndex + 0.5), 2), 0).w > 0.5) { finalColor.a = vColor.a; }\n#elif defined(GS_DBG_ENABLED) && GS_DBG_OPACITY_SATURATE == 1\n finalColor.a = vColor.a;\n#endif\n`,\n };\n }\n return null;\n }\n\n private _getCustomCodeWGSL(shaderType: string): Nullable<{ [pointName: string]: string }> {\n if (shaderType === \"vertex\") {\n return {\n CUSTOM_VERTEX_DEFINITIONS: `\n#if defined(GS_DBG_ENABLED) && GS_DBG_CLIP == 1 && !defined(IS_COMPOUND)\nuniform dbgClipMin: vec3f;\nuniform dbgClipMax: vec3f;\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_OPACITY == 1 && !defined(IS_COMPOUND)\nuniform dbgMinOpacity: f32;\nuniform dbgMaxOpacity: f32;\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_SIZE == 1 && !defined(IS_COMPOUND)\nuniform dbgMinSize: f32;\nuniform dbgMaxSize: f32;\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_OPACITY_SCALE == 1 && !defined(IS_COMPOUND)\nuniform dbgOpacityScale: f32;\n#endif\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\nvar dbgPartData: texture_2d<f32>;\nvarying vPartIndex: f32;\n#endif\n`,\n CUSTOM_VERTEX_UPDATE: `\n#if defined(GS_DBG_ENABLED) && GS_DBG_CLIP == 1 && !defined(IS_COMPOUND)\n if (worldPos.x < uniforms.dbgClipMin.x || worldPos.x > uniforms.dbgClipMax.x ||\n worldPos.y < uniforms.dbgClipMin.y || worldPos.y > uniforms.dbgClipMax.y ||\n worldPos.z < uniforms.dbgClipMin.z || worldPos.z > uniforms.dbgClipMax.z) {\n scale = vec2f(0.0);\n }\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_OPACITY == 1 && !defined(IS_COMPOUND)\n if (splat.color.w < uniforms.dbgMinOpacity || splat.color.w > uniforms.dbgMaxOpacity) {\n scale = vec2f(0.0);\n }\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_SIZE == 1 && !defined(IS_COMPOUND)\n {\n let _d0 = splat.covA.x; let _d1 = splat.covA.y; let _d2 = splat.covA.z;\n let _d3 = splat.covA.w; let _d4 = splat.covB.x; let _d5 = splat.covB.y;\n let _det = _d0*(_d3*_d5 - _d4*_d4) - _d1*(_d1*_d5 - _d4*_d2) + _d2*(_d1*_d4 - _d3*_d2);\n let _sz = pow(abs(_det), 1.0/6.0);\n if (_sz < uniforms.dbgMinSize || _sz > uniforms.dbgMaxSize) {\n scale = vec2f(0.0);\n }\n }\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_OPACITY_SCALE == 1 && !defined(IS_COMPOUND)\n vertexOutputs.vColor.w *= uniforms.dbgOpacityScale;\n#endif\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\n {\n let _pIdx = i32(splat.partIndex);\n vertexOutputs.vPartIndex = f32(splat.partIndex);\n let _row0 = textureLoad(dbgPartData, vec2i(_pIdx, 0), 0);\n let _row1 = textureLoad(dbgPartData, vec2i(_pIdx, 1), 0);\n let _row2 = textureLoad(dbgPartData, vec2i(_pIdx, 2), 0);\n let _clipMin = _row0.xyz;\n let _clipMax = vec3f(_row0.w, _row1.xy);\n let _minOp = _row1.z;\n let _maxOp = _row1.w;\n let _minSz = _row2.x;\n let _maxSz = _row2.y;\n let _opSc = _row2.z;\n #if GS_DBG_CLIP == 1\n if (worldPos.x < _clipMin.x || worldPos.x > _clipMax.x ||\n worldPos.y < _clipMin.y || worldPos.y > _clipMax.y ||\n worldPos.z < _clipMin.z || worldPos.z > _clipMax.z) {\n scale = vec2f(0.0);\n }\n #endif\n #if GS_DBG_CULL_OPACITY == 1\n if (splat.color.w < _minOp || splat.color.w > _maxOp) {\n scale = vec2f(0.0);\n }\n #endif\n #if GS_DBG_CULL_SIZE == 1\n {\n let _d0 = splat.covA.x; let _d1 = splat.covA.y; let _d2 = splat.covA.z;\n let _d3 = splat.covA.w; let _d4 = splat.covB.x; let _d5 = splat.covB.y;\n let _det = _d0*(_d3*_d5 - _d4*_d4) - _d1*(_d1*_d5 - _d4*_d2) + _d2*(_d1*_d4 - _d3*_d2);\n let _sz = pow(abs(_det), 1.0/6.0);\n if (_sz < _minSz || _sz > _maxSz) {\n scale = vec2f(0.0);\n }\n }\n #endif\n #if GS_DBG_OPACITY_SCALE == 1\n vertexOutputs.vColor.w *= _opSc;\n #endif\n }\n#endif\n`,\n };\n } else if (shaderType === \"fragment\") {\n return {\n CUSTOM_FRAGMENT_DEFINITIONS: `\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\nvar dbgPartData: texture_2d<f32>;\nvarying vPartIndex: f32;\n#endif\n`,\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\n if (textureLoad(dbgPartData, vec2i(i32(fragmentInputs.vPartIndex + 0.5), 2), 0).w > 0.5) {\n let _gsdbgA: f32 = -dot(fragmentInputs.vPosition, fragmentInputs.vPosition);\n if (_gsdbgA > -4.0) { finalColor.a = fragmentInputs.vColor.a; }\n }\n#elif defined(GS_DBG_ENABLED) && GS_DBG_OPACITY_SATURATE == 1\n {\n let _gsdbgA: f32 = -dot(fragmentInputs.vPosition, fragmentInputs.vPosition);\n if (_gsdbgA > -4.0) {\n finalColor.a = fragmentInputs.vColor.a;\n }\n }\n#endif\n`,\n };\n }\n return null;\n }\n\n /**\n * Declares the non-compound scalar debug uniform names as external so the Effect can\n * resolve their locations. WGSL uniforms are declared inline in getCustomCode() injections.\n * @returns uniform descriptor with externalUniforms list\n */\n public override getUniforms(): {\n ubo?: Array<{ name: string; size?: number; type?: string; arraySize?: number }>;\n vertex?: string;\n fragment?: string;\n externalUniforms?: string[];\n } {\n return {\n externalUniforms: [\"dbgClipMin\", \"dbgClipMax\", \"dbgMinOpacity\", \"dbgMaxOpacity\", \"dbgMinSize\", \"dbgMaxSize\", \"dbgOpacityScale\"],\n };\n }\n\n private _buildTextureData(partCount: number): Float32Array {\n const maxPartCount = this._maxPartCount;\n const data = new Float32Array(maxPartCount * 5 * 4);\n for (let i = 0; i < maxPartCount; i++) {\n const r0 = i * 4;\n const r1 = (maxPartCount + i) * 4;\n const r2 = (maxPartCount * 2 + i) * 4;\n const r3 = (maxPartCount * 3 + i) * 4;\n const r4 = (maxPartCount * 4 + i) * 4;\n\n // Row 0: clipMin.xyz, clipMax.x — Row 1: clipMax.yz, minOpacity, maxOpacity\n const box = i < partCount ? (this._partClippingBoxes[i] ?? this._clippingBox) : this._clippingBox;\n if (box) {\n data[r0] = box.min.x;\n data[r0 + 1] = box.min.y;\n data[r0 + 2] = box.min.z;\n data[r0 + 3] = box.max.x;\n data[r1] = box.max.y;\n data[r1 + 1] = box.max.z;\n } else {\n data[r0] = -1e9;\n data[r0 + 1] = -1e9;\n data[r0 + 2] = -1e9;\n data[r0 + 3] = 1e9;\n data[r1] = 1e9;\n data[r1 + 1] = 1e9;\n }\n const opCull = i < partCount ? (this._partOpacityCullings[i] ?? this._opacityCulling) : this._opacityCulling;\n data[r1 + 2] = opCull ? opCull.min : 0.0;\n data[r1 + 3] = opCull ? opCull.max : 1.0;\n\n // Row 2: minSize, maxSize, opacityScale, opacitySaturate\n const szCull = i < partCount ? (this._partSizeCullings[i] ?? this._sizeCulling) : this._sizeCulling;\n data[r2] = szCull ? szCull.min : 0.0;\n data[r2 + 1] = szCull ? szCull.max : 1e9;\n data[r2 + 2] = i < partCount ? (this._partOpacityScales[i] ?? this._opacityScale) : this._opacityScale;\n const sat = i < partCount ? (this._partOpacitySaturates[i] ?? this._opacitySaturate) : this._opacitySaturate;\n data[r2 + 3] = sat ? 1.0 : 0.0;\n\n // Row 3: shDc, shOrder1, shOrder2, shOrder3\n data[r3] = (i < partCount ? (this._partShDcs[i] ?? this._shDc) : this._shDc) ? 1.0 : 0.0;\n data[r3 + 1] = (i < partCount ? (this._partShOrder1s[i] ?? this._shOrder1) : this._shOrder1) ? 1.0 : 0.0;\n data[r3 + 2] = (i < partCount ? (this._partShOrder2s[i] ?? this._shOrder2) : this._shOrder2) ? 1.0 : 0.0;\n data[r3 + 3] = (i < partCount ? (this._partShOrder3s[i] ?? this._shOrder3) : this._shOrder3) ? 1.0 : 0.0;\n\n // Row 4: shOrder4, padding\n data[r4] = (i < partCount ? (this._partShOrder4s[i] ?? this._shOrder4) : this._shOrder4) ? 1.0 : 0.0;\n }\n return data;\n }\n\n private _updateOrCreateTexture(scene: Scene): void {\n if (!this._maxPartCount) {\n this._maxPartCount = GetGaussianSplattingMaxPartCount(scene.getEngine());\n }\n const data = this._buildTextureData(this._partCount);\n if (!this._dbgPartDataTexture) {\n this._dbgPartDataTexture = RawTexture.CreateRGBATexture(\n data,\n this._maxPartCount,\n 5,\n scene,\n false,\n false,\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n Constants.TEXTURETYPE_FLOAT\n );\n } else {\n this._dbgPartDataTexture.update(data);\n }\n this._textureDirty = false;\n }\n\n /**\n * Binds uniform values each frame. Scalar uniforms are uploaded for non-compound mode;\n * the per-part data texture is updated and bound for compound mode.\n * @param _uniformBuffer unused\n * @param _scene the current scene\n * @param _engine unused\n * @param subMesh the submesh being rendered\n */\n public override bindForSubMesh(_uniformBuffer: UniformBuffer, _scene: Scene, _engine: AbstractEngine, subMesh: SubMesh): void {\n const effect = subMesh.effect;\n if (!effect) {\n return;\n }\n\n if (this._partCount > 0 && this._isAnyFeatureActive()) {\n // Compound mode: pack per-part data into a texture (only when the debug path is active)\n if (this._textureDirty || !this._dbgPartDataTexture) {\n this._updateOrCreateTexture(_scene);\n }\n if (this._dbgPartDataTexture) {\n effect.setTexture(\"dbgPartData\", this._dbgPartDataTexture);\n }\n } else if (this._partCount === 0) {\n // Non-compound: upload scalar uniforms\n if (this._clippingBox) {\n effect.setVector3(\"dbgClipMin\", this._clippingBox.min);\n effect.setVector3(\"dbgClipMax\", this._clippingBox.max);\n }\n if (this._opacityCulling) {\n effect.setFloat(\"dbgMinOpacity\", this._opacityCulling.min);\n effect.setFloat(\"dbgMaxOpacity\", this._opacityCulling.max);\n }\n if (this._sizeCulling) {\n effect.setFloat(\"dbgMinSize\", this._sizeCulling.min);\n effect.setFloat(\"dbgMaxSize\", this._sizeCulling.max);\n }\n if (this._opacityScale !== 1.0) {\n effect.setFloat(\"dbgOpacityScale\", this._opacityScale);\n }\n }\n }\n\n /**\n * Disposes the per-part data texture.\n * @param _forceDisposeTextures unused; the LUT texture is always disposed as it is owned by this plugin\n */\n public override dispose(_forceDisposeTextures?: boolean): void {\n this._dbgPartDataTexture?.dispose();\n this._dbgPartDataTexture = null;\n }\n}\n\nlet _Registered = false;\n/**\n * Register side effects for GaussianSplattingDebugMaterialPlugin.\n * Safe to call multiple times; only the first call has an effect.\n */\nexport function RegisterGaussianSplattingDebugMaterialPlugin(): void {\n if (_Registered) {\n return;\n }\n _Registered = true;\n\n RegisterClass(\"BABYLON.GaussianSplattingDebugMaterialPlugin\", GaussianSplattingDebugMaterialPlugin);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"gaussianSplattingDebugMaterialPlugin.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.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 Scene } from \"../../scene\";\nimport { type AbstractEngine } from \"../../Engines/abstractEngine\";\nimport { type SubMesh } from \"../../Meshes/subMesh\";\nimport { type UniformBuffer } from \"../uniformBuffer\";\nimport { MaterialDefines } from \"../materialDefines\";\nimport { MaterialPluginBase } from \"../materialPluginBase.pure\";\nimport { ShaderLanguage } from \"../shaderLanguage\";\nimport { RegisterClass } from \"../../Misc/typeStore\";\nimport { type Vector3 } from \"../../Maths/math.vector\";\nimport { Logger } from \"../../Misc/logger\";\nimport { type GaussianSplattingMaterial, GetGaussianSplattingMaxPartCount } from \"./gaussianSplattingMaterial.pure\";\nimport { RawTexture } from \"../Textures/rawTexture\";\nimport { Constants } from \"../../Engines/constants\";\n\n/** @internal */\nclass GaussianSplattingDebugDefines extends MaterialDefines {\n /** Defines whether any debug feature is active */\n GS_DBG_ENABLED: boolean = false;\n /** Defines whether world-space clipping box is enabled (0: off, 1: on) */\n GS_DBG_CLIP: number = 0;\n /** Defines whether opacity culling is enabled (0: off, 1: on) */\n GS_DBG_CULL_OPACITY: number = 0;\n /** Defines whether size culling is enabled (0: off, 1: on) */\n GS_DBG_CULL_SIZE: number = 0;\n /** Defines whether per-splat opacity scaling is enabled (0: off, 1: on) */\n GS_DBG_OPACITY_SCALE: number = 0;\n /** Defines whether opacity saturation (flat disk) is enabled (0: off, 1: on) */\n GS_DBG_OPACITY_SATURATE: number = 0;\n /** Defines whether the DC (base) SH color is included (0: off, 1: on) */\n GS_DBG_SH_DC: number = 1;\n /** Defines whether SH band 1 contribution is included (0: off, 1: on) */\n GS_DBG_SH_ORDER1: number = 1;\n /** Defines whether SH band 2 contribution is included (0: off, 1: on) */\n GS_DBG_SH_ORDER2: number = 1;\n /** Defines whether SH band 3 contribution is included (0: off, 1: on) */\n GS_DBG_SH_ORDER3: number = 1;\n /** Defines whether SH band 4 contribution is included (0: off, 1: on) */\n GS_DBG_SH_ORDER4: number = 1;\n}\n\n/**\n * Per-part debug options for compound Gaussian splat meshes.\n * Each field is optional; unset fields fall back to the global setting on the plugin,\n * and if that is also unset, a neutral value is used (no culling, full SH, etc.).\n */\nexport interface IGaussianSplattingDebugOptions {\n /** World-space axis-aligned clipping box, or null to disable. */\n clippingBox: Nullable<{ min: Vector3; max: Vector3 }>;\n /** Opacity culling range [0..1], or null to disable. */\n opacityCulling: Nullable<{ min: number; max: number }>;\n /** Size culling range, or null to disable. */\n sizeCulling: Nullable<{ min: number; max: number }>;\n /** Scalar opacity multiplier. 1.0 = no change. */\n opacityScale: number;\n /** When true, replaces Gaussian falloff with flat disk opacity. */\n opacitySaturate: boolean;\n /** Include the DC (base) SH color. */\n shDc: boolean;\n /** Include SH band 1 contribution. */\n shOrder1: boolean;\n /** Include SH band 2 contribution. */\n shOrder2: boolean;\n /** Include SH band 3 contribution. */\n shOrder3: boolean;\n /** Include SH band 4 contribution. */\n shOrder4: boolean;\n}\n\n/**\n * Debug plugin for GaussianSplattingMaterial.\n * Provides runtime controls for clipping, opacity/size culling, opacity scaling,\n * opacity saturation, and per-SH-order toggling. All features are gated behind\n * the GS_DBG_ENABLED shader define — when every option is at its default value\n * the define is absent and the shader compiles to identical code as without the plugin.\n *\n * In compound mode (partCount \\> 0), per-part overrides can be set via setPartOptions().\n * Global settings act as defaults; per-part settings override them for that part index.\n */\nexport class GaussianSplattingDebugMaterialPlugin extends MaterialPluginBase {\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 // Per-part state (only populated when partCount > 0)\n private _partCount: number = 0;\n private _partClippingBoxes: Array<Nullable<{ min: Vector3; max: Vector3 }>> = [];\n private _partOpacityCullings: Array<Nullable<{ min: number; max: number }>> = [];\n private _partSizeCullings: Array<Nullable<{ min: number; max: number }>> = [];\n private _partOpacityScales: Array<Nullable<number>> = [];\n private _partOpacitySaturates: Array<Nullable<boolean>> = [];\n private _partShDcs: Array<Nullable<boolean>> = [];\n private _partShOrder1s: Array<Nullable<boolean>> = [];\n private _partShOrder2s: Array<Nullable<boolean>> = [];\n private _partShOrder3s: Array<Nullable<boolean>> = [];\n private _partShOrder4s: Array<Nullable<boolean>> = [];\n // Single registry of every _part* array — shiftPartOptions iterates this instead of\n // listing each array by name, so adding a new per-part field only requires adding it here.\n private readonly _partArrays: Array<Array<unknown>>;\n\n // Per-part debug LUT: MAX_PART_COUNT × 5 RGBA float texture (dbgPartData)\n private _dbgPartDataTexture: Nullable<RawTexture> = null;\n private _textureDirty: boolean = false;\n private _maxPartCount: number = 0;\n\n /**\n * Creates a new GaussianSplattingDebugMaterialPlugin.\n * @param material The GaussianSplattingMaterial to attach the plugin to.\n */\n constructor(material: GaussianSplattingMaterial) {\n super(material, \"GaussianSplattingDebug\", 200, new GaussianSplattingDebugDefines(), true, true);\n this._partArrays = [\n this._partClippingBoxes,\n this._partOpacityCullings,\n this._partSizeCullings,\n this._partOpacityScales,\n this._partOpacitySaturates,\n this._partShDcs,\n this._partShOrder1s,\n this._partShOrder2s,\n this._partShOrder3s,\n this._partShOrder4s,\n ];\n }\n\n private _isAnyFeatureActive(): boolean {\n return (\n this._clippingBox !== null ||\n this._opacityCulling !== null ||\n this._sizeCulling !== null ||\n this._opacityScale !== 1.0 ||\n this._opacitySaturate ||\n !this._shDc ||\n !this._shOrder1 ||\n !this._shOrder2 ||\n !this._shOrder3 ||\n !this._shOrder4 ||\n this._partClippingBoxes.some((b) => b !== null) ||\n this._partOpacityCullings.some((b) => b !== null) ||\n this._partSizeCullings.some((b) => b !== null) ||\n this._partOpacityScales.some((s) => s !== null) ||\n this._partOpacitySaturates.some((s) => s !== null) ||\n this._partShDcs.some((s) => s !== null) ||\n this._partShOrder1s.some((s) => s !== null) ||\n this._partShOrder2s.some((s) => s !== null) ||\n this._partShOrder3s.some((s) => s !== null) ||\n this._partShOrder4s.some((s) => s !== null)\n );\n }\n\n private _markDirty(): void {\n this.markAllDefinesAsDirty();\n this._textureDirty = true;\n }\n\n // ----- Public API -----\n\n /**\n * Number of parts in compound mode. Set automatically by GaussianSplattingDebugger.addMesh().\n * When 0 (non-compound), setPartOptions() logs an error.\n * @returns the part count\n */\n public get partCount(): number {\n return this._partCount;\n }\n public set partCount(count: number) {\n if (this._partCount !== count) {\n this._partCount = count;\n this._markDirty();\n }\n }\n\n /**\n * Sets per-part debug overrides for the given part index.\n * Only valid on compound meshes (partCount \\> 0); logs an error otherwise.\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(partIndex: number, options: Partial<IGaussianSplattingDebugOptions>): void {\n if (this._partCount === 0) {\n Logger.Error(\"GaussianSplattingDebugMaterialPlugin.setPartOptions: called on a non-compound mesh. partCount is 0.\");\n return;\n }\n if (options.clippingBox !== undefined) {\n this._partClippingBoxes[partIndex] = options.clippingBox;\n }\n if (options.opacityCulling !== undefined) {\n this._partOpacityCullings[partIndex] = options.opacityCulling;\n }\n if (options.sizeCulling !== undefined) {\n this._partSizeCullings[partIndex] = options.sizeCulling;\n }\n if (options.opacityScale !== undefined) {\n this._partOpacityScales[partIndex] = options.opacityScale;\n }\n if (options.opacitySaturate !== undefined) {\n this._partOpacitySaturates[partIndex] = options.opacitySaturate;\n }\n if (options.shDc !== undefined) {\n this._partShDcs[partIndex] = options.shDc;\n }\n if (options.shOrder1 !== undefined) {\n this._partShOrder1s[partIndex] = options.shOrder1;\n }\n if (options.shOrder2 !== undefined) {\n this._partShOrder2s[partIndex] = options.shOrder2;\n }\n if (options.shOrder3 !== undefined) {\n this._partShOrder3s[partIndex] = options.shOrder3;\n }\n if (options.shOrder4 !== undefined) {\n this._partShOrder4s[partIndex] = options.shOrder4;\n }\n this._markDirty();\n }\n\n /**\n * Clears all per-part debug overrides for the given part index,\n * falling back to global settings.\n * @param partIndex The zero-based part index.\n */\n public clearPartOptions(partIndex: number): void {\n this._partClippingBoxes[partIndex] = null;\n this._partOpacityCullings[partIndex] = null;\n this._partSizeCullings[partIndex] = null;\n this._partOpacityScales[partIndex] = null;\n this._partOpacitySaturates[partIndex] = null;\n this._partShDcs[partIndex] = null;\n this._partShOrder1s[partIndex] = null;\n this._partShOrder2s[partIndex] = null;\n this._partShOrder3s[partIndex] = null;\n this._partShOrder4s[partIndex] = null;\n this._markDirty();\n }\n\n /**\n * Removes the per-part override slot at `removedIndex` and shifts all higher-indexed\n * slots down by one, keeping the arrays aligned with the compound mesh's new part layout.\n * @param removedIndex The original (pre-removal) part index.\n * @internal\n */\n public shiftPartOptions(removedIndex: number): void {\n for (const arr of this._partArrays) {\n if (removedIndex < arr.length) {\n arr.splice(removedIndex, 1);\n }\n }\n this._markDirty();\n }\n\n /**\n * World-space axis-aligned clipping box. Splats outside are not rendered.\n * Set to null to disable clipping.\n * Example: `{ min: new Vector3(-2,-2,-2), max: new Vector3(2,2,2) }`\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 this._markDirty();\n }\n\n /**\n * Opacity culling range [0..1]. Splats whose stored opacity falls outside this\n * range are not rendered. 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 this._markDirty();\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. Use GaussianSplattingMeshBase.splatSizeRange\n * to find the asset's range. 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 this._markDirty();\n }\n\n /**\n * Scalar multiplier applied to every splat's opacity after all other modifiers.\n * 1.0 (default) = no change.\n */\n public get opacityScale(): number {\n return this._opacityScale;\n }\n public set opacityScale(value: number) {\n this._opacityScale = value;\n this._markDirty();\n }\n\n /**\n * When true, replaces the Gaussian spatial falloff with a flat uniform opacity,\n * making each splat appear as a solid disk with its raw alpha value.\n */\n public get opacitySaturate(): boolean {\n return this._opacitySaturate;\n }\n public set opacitySaturate(value: boolean) {\n this._opacitySaturate = value;\n this._markDirty();\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 this._markDirty();\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 this._markDirty();\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 this._markDirty();\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 this._markDirty();\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 this._markDirty();\n }\n\n // ----- Plugin overrides -----\n\n /**\n * Adds the per-part debug data texture name to the sampler list so the effect can bind it.\n * @param samplers the sampler list to populate\n */\n public override getSamplers(samplers: string[]): void {\n samplers.push(\"dbgPartData\");\n }\n\n /** @returns the class name of this plugin */\n public override getClassName(): string {\n return \"GaussianSplattingDebugMaterialPlugin\";\n }\n\n /**\n * @param shaderLanguage the shader language to check\n * @returns true for GLSL and WGSL\n */\n public override isCompatible(shaderLanguage: ShaderLanguage): boolean {\n switch (shaderLanguage) {\n case ShaderLanguage.GLSL:\n case ShaderLanguage.WGSL:\n return true;\n default:\n return false;\n }\n }\n\n /**\n * Always ready — no async resources.\n * @param _defines unused\n * @param _scene unused\n * @param _engine unused\n * @param _subMesh unused\n * @returns true\n */\n public override isReadyForSubMesh(_defines: MaterialDefines, _scene: Scene, _engine: AbstractEngine, _subMesh: SubMesh): boolean {\n return true;\n }\n\n /**\n * Sets shader defines from current property state. GS_DBG_ENABLED is set to true\n * only when at least one feature is non-default, ensuring zero overhead otherwise.\n * Sub-flags also check per-part arrays so compound-only overrides activate the correct\n * code paths even when the global setting is at its default.\n * @param defines the defines object\n */\n public override prepareDefines(defines: GaussianSplattingDebugDefines): void {\n defines.GS_DBG_ENABLED = this._isAnyFeatureActive();\n defines.GS_DBG_CLIP = this._clippingBox !== null || this._partClippingBoxes.some((b) => b !== null) ? 1 : 0;\n defines.GS_DBG_CULL_OPACITY = this._opacityCulling !== null || this._partOpacityCullings.some((b) => b !== null) ? 1 : 0;\n defines.GS_DBG_CULL_SIZE = this._sizeCulling !== null || this._partSizeCullings.some((b) => b !== null) ? 1 : 0;\n defines.GS_DBG_OPACITY_SCALE = this._opacityScale !== 1.0 || this._partOpacityScales.some((s) => s !== null) ? 1 : 0;\n defines.GS_DBG_OPACITY_SATURATE = this._opacitySaturate || this._partOpacitySaturates.some((s) => s !== null) ? 1 : 0;\n defines.GS_DBG_SH_DC = !this._shDc || this._partShDcs.some((s) => s !== null) ? 0 : 1;\n defines.GS_DBG_SH_ORDER1 = !this._shOrder1 || this._partShOrder1s.some((s) => s !== null) ? 0 : 1;\n defines.GS_DBG_SH_ORDER2 = !this._shOrder2 || this._partShOrder2s.some((s) => s !== null) ? 0 : 1;\n defines.GS_DBG_SH_ORDER3 = !this._shOrder3 || this._partShOrder3s.some((s) => s !== null) ? 0 : 1;\n defines.GS_DBG_SH_ORDER4 = !this._shOrder4 || this._partShOrder4s.some((s) => s !== null) ? 0 : 1;\n }\n\n /**\n * Returns shader code injections for the debug features.\n * @param shaderType \"vertex\" or \"fragment\"\n * @param shaderLanguage GLSL or WGSL\n * @returns map of injection-point name to injected code, or null\n */\n public override getCustomCode(shaderType: string, shaderLanguage = ShaderLanguage.GLSL): Nullable<{ [pointName: string]: string }> {\n if (shaderLanguage === ShaderLanguage.WGSL) {\n return this._getCustomCodeWGSL(shaderType);\n }\n return this._getCustomCodeGLSL(shaderType);\n }\n\n private _getCustomCodeGLSL(shaderType: string): Nullable<{ [pointName: string]: string }> {\n if (shaderType === \"vertex\") {\n return {\n CUSTOM_VERTEX_DEFINITIONS: `\n#if defined(GS_DBG_ENABLED) && GS_DBG_CLIP == 1 && !defined(IS_COMPOUND)\nuniform vec3 dbgClipMin;\nuniform vec3 dbgClipMax;\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_OPACITY == 1 && !defined(IS_COMPOUND)\nuniform float dbgMinOpacity;\nuniform float dbgMaxOpacity;\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_SIZE == 1 && !defined(IS_COMPOUND)\nuniform float dbgMinSize;\nuniform float dbgMaxSize;\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_OPACITY_SCALE == 1 && !defined(IS_COMPOUND)\nuniform float dbgOpacityScale;\n#endif\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\nuniform sampler2D dbgPartData;\nvarying float vPartIndex;\n#endif\n`,\n CUSTOM_VERTEX_UPDATE: `\n#if defined(GS_DBG_ENABLED) && GS_DBG_CLIP == 1 && !defined(IS_COMPOUND)\n if (worldPos.x < dbgClipMin.x || worldPos.x > dbgClipMax.x ||\n worldPos.y < dbgClipMin.y || worldPos.y > dbgClipMax.y ||\n worldPos.z < dbgClipMin.z || worldPos.z > dbgClipMax.z) {\n scale = vec2(0.0);\n }\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_OPACITY == 1 && !defined(IS_COMPOUND)\n if (splat.color.w < dbgMinOpacity || splat.color.w > dbgMaxOpacity) {\n scale = vec2(0.0);\n }\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_SIZE == 1 && !defined(IS_COMPOUND)\n {\n float _d0 = splat.covA.x; float _d1 = splat.covA.y; float _d2 = splat.covA.z;\n float _d3 = splat.covA.w; float _d4 = splat.covB.x; float _d5 = splat.covB.y;\n float _det = _d0*(_d3*_d5 - _d4*_d4) - _d1*(_d1*_d5 - _d4*_d2) + _d2*(_d1*_d4 - _d3*_d2);\n float _sz = pow(abs(_det), 1.0/6.0);\n if (_sz < dbgMinSize || _sz > dbgMaxSize) {\n scale = vec2(0.0);\n }\n }\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_OPACITY_SCALE == 1 && !defined(IS_COMPOUND)\n vColor.w *= dbgOpacityScale;\n#endif\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\n {\n int _pIdx = int(splat.partIndex);\n vPartIndex = float(splat.partIndex);\n vec4 _row0 = texelFetch(dbgPartData, ivec2(_pIdx, 0), 0);\n vec4 _row1 = texelFetch(dbgPartData, ivec2(_pIdx, 1), 0);\n vec4 _row2 = texelFetch(dbgPartData, ivec2(_pIdx, 2), 0);\n vec3 _clipMin = _row0.xyz;\n vec3 _clipMax = vec3(_row0.w, _row1.xy);\n float _minOp = _row1.z;\n float _maxOp = _row1.w;\n float _minSz = _row2.x;\n float _maxSz = _row2.y;\n float _opSc = _row2.z;\n #if GS_DBG_CLIP == 1\n if (worldPos.x < _clipMin.x || worldPos.x > _clipMax.x ||\n worldPos.y < _clipMin.y || worldPos.y > _clipMax.y ||\n worldPos.z < _clipMin.z || worldPos.z > _clipMax.z) {\n scale = vec2(0.0);\n }\n #endif\n #if GS_DBG_CULL_OPACITY == 1\n if (splat.color.w < _minOp || splat.color.w > _maxOp) {\n scale = vec2(0.0);\n }\n #endif\n #if GS_DBG_CULL_SIZE == 1\n {\n float _d0 = splat.covA.x; float _d1 = splat.covA.y; float _d2 = splat.covA.z;\n float _d3 = splat.covA.w; float _d4 = splat.covB.x; float _d5 = splat.covB.y;\n float _det = _d0*(_d3*_d5 - _d4*_d4) - _d1*(_d1*_d5 - _d4*_d2) + _d2*(_d1*_d4 - _d3*_d2);\n float _sz = pow(abs(_det), 1.0/6.0);\n if (_sz < _minSz || _sz > _maxSz) {\n scale = vec2(0.0);\n }\n }\n #endif\n #if GS_DBG_OPACITY_SCALE == 1\n vColor.w *= _opSc;\n #endif\n }\n#endif\n`,\n };\n } else if (shaderType === \"fragment\") {\n return {\n CUSTOM_FRAGMENT_DEFINITIONS: `\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\nuniform sampler2D dbgPartData;\nvarying float vPartIndex;\n#endif\n`,\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\n if (texelFetch(dbgPartData, ivec2(int(vPartIndex + 0.5), 2), 0).w > 0.5) { finalColor.a = vColor.a; }\n#elif defined(GS_DBG_ENABLED) && GS_DBG_OPACITY_SATURATE == 1\n finalColor.a = vColor.a;\n#endif\n`,\n };\n }\n return null;\n }\n\n private _getCustomCodeWGSL(shaderType: string): Nullable<{ [pointName: string]: string }> {\n if (shaderType === \"vertex\") {\n return {\n CUSTOM_VERTEX_DEFINITIONS: `\n#if defined(GS_DBG_ENABLED) && GS_DBG_CLIP == 1 && !defined(IS_COMPOUND)\nuniform dbgClipMin: vec3f;\nuniform dbgClipMax: vec3f;\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_OPACITY == 1 && !defined(IS_COMPOUND)\nuniform dbgMinOpacity: f32;\nuniform dbgMaxOpacity: f32;\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_SIZE == 1 && !defined(IS_COMPOUND)\nuniform dbgMinSize: f32;\nuniform dbgMaxSize: f32;\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_OPACITY_SCALE == 1 && !defined(IS_COMPOUND)\nuniform dbgOpacityScale: f32;\n#endif\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\nvar dbgPartData: texture_2d<f32>;\nvarying vPartIndex: f32;\n#endif\n`,\n CUSTOM_VERTEX_UPDATE: `\n#if defined(GS_DBG_ENABLED) && GS_DBG_CLIP == 1 && !defined(IS_COMPOUND)\n if (worldPos.x < uniforms.dbgClipMin.x || worldPos.x > uniforms.dbgClipMax.x ||\n worldPos.y < uniforms.dbgClipMin.y || worldPos.y > uniforms.dbgClipMax.y ||\n worldPos.z < uniforms.dbgClipMin.z || worldPos.z > uniforms.dbgClipMax.z) {\n scale = vec2f(0.0);\n }\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_OPACITY == 1 && !defined(IS_COMPOUND)\n if (splat.color.w < uniforms.dbgMinOpacity || splat.color.w > uniforms.dbgMaxOpacity) {\n scale = vec2f(0.0);\n }\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_CULL_SIZE == 1 && !defined(IS_COMPOUND)\n {\n let _d0 = splat.covA.x; let _d1 = splat.covA.y; let _d2 = splat.covA.z;\n let _d3 = splat.covA.w; let _d4 = splat.covB.x; let _d5 = splat.covB.y;\n let _det = _d0*(_d3*_d5 - _d4*_d4) - _d1*(_d1*_d5 - _d4*_d2) + _d2*(_d1*_d4 - _d3*_d2);\n let _sz = pow(abs(_det), 1.0/6.0);\n if (_sz < uniforms.dbgMinSize || _sz > uniforms.dbgMaxSize) {\n scale = vec2f(0.0);\n }\n }\n#endif\n#if defined(GS_DBG_ENABLED) && GS_DBG_OPACITY_SCALE == 1 && !defined(IS_COMPOUND)\n vertexOutputs.vColor.w *= uniforms.dbgOpacityScale;\n#endif\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\n {\n let _pIdx = i32(splat.partIndex);\n vertexOutputs.vPartIndex = f32(splat.partIndex);\n let _row0 = textureLoad(dbgPartData, vec2i(_pIdx, 0), 0);\n let _row1 = textureLoad(dbgPartData, vec2i(_pIdx, 1), 0);\n let _row2 = textureLoad(dbgPartData, vec2i(_pIdx, 2), 0);\n let _clipMin = _row0.xyz;\n let _clipMax = vec3f(_row0.w, _row1.xy);\n let _minOp = _row1.z;\n let _maxOp = _row1.w;\n let _minSz = _row2.x;\n let _maxSz = _row2.y;\n let _opSc = _row2.z;\n #if GS_DBG_CLIP == 1\n if (worldPos.x < _clipMin.x || worldPos.x > _clipMax.x ||\n worldPos.y < _clipMin.y || worldPos.y > _clipMax.y ||\n worldPos.z < _clipMin.z || worldPos.z > _clipMax.z) {\n scale = vec2f(0.0);\n }\n #endif\n #if GS_DBG_CULL_OPACITY == 1\n if (splat.color.w < _minOp || splat.color.w > _maxOp) {\n scale = vec2f(0.0);\n }\n #endif\n #if GS_DBG_CULL_SIZE == 1\n {\n let _d0 = splat.covA.x; let _d1 = splat.covA.y; let _d2 = splat.covA.z;\n let _d3 = splat.covA.w; let _d4 = splat.covB.x; let _d5 = splat.covB.y;\n let _det = _d0*(_d3*_d5 - _d4*_d4) - _d1*(_d1*_d5 - _d4*_d2) + _d2*(_d1*_d4 - _d3*_d2);\n let _sz = pow(abs(_det), 1.0/6.0);\n if (_sz < _minSz || _sz > _maxSz) {\n scale = vec2f(0.0);\n }\n }\n #endif\n #if GS_DBG_OPACITY_SCALE == 1\n vertexOutputs.vColor.w *= _opSc;\n #endif\n }\n#endif\n`,\n };\n } else if (shaderType === \"fragment\") {\n return {\n CUSTOM_FRAGMENT_DEFINITIONS: `\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\nvar dbgPartData: texture_2d<f32>;\nvarying vPartIndex: f32;\n#endif\n`,\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\n#if defined(GS_DBG_ENABLED) && IS_COMPOUND\n if (textureLoad(dbgPartData, vec2i(i32(fragmentInputs.vPartIndex + 0.5), 2), 0).w > 0.5) {\n let _gsdbgA: f32 = -dot(fragmentInputs.vPosition, fragmentInputs.vPosition);\n if (_gsdbgA > -4.0) { finalColor.a = fragmentInputs.vColor.a; }\n }\n#elif defined(GS_DBG_ENABLED) && GS_DBG_OPACITY_SATURATE == 1\n {\n let _gsdbgA: f32 = -dot(fragmentInputs.vPosition, fragmentInputs.vPosition);\n if (_gsdbgA > -4.0) {\n finalColor.a = fragmentInputs.vColor.a;\n }\n }\n#endif\n`,\n };\n }\n return null;\n }\n\n /**\n * Declares the non-compound scalar debug uniform names as external so the Effect can\n * resolve their locations. WGSL uniforms are declared inline in getCustomCode() injections.\n * @returns uniform descriptor with externalUniforms list\n */\n public override getUniforms(): {\n ubo?: Array<{ name: string; size?: number; type?: string; arraySize?: number }>;\n vertex?: string;\n fragment?: string;\n externalUniforms?: string[];\n } {\n return {\n externalUniforms: [\"dbgClipMin\", \"dbgClipMax\", \"dbgMinOpacity\", \"dbgMaxOpacity\", \"dbgMinSize\", \"dbgMaxSize\", \"dbgOpacityScale\"],\n };\n }\n\n private _buildTextureData(partCount: number): Float32Array {\n const maxPartCount = this._maxPartCount;\n const data = new Float32Array(maxPartCount * 5 * 4);\n for (let i = 0; i < maxPartCount; i++) {\n const r0 = i * 4;\n const r1 = (maxPartCount + i) * 4;\n const r2 = (maxPartCount * 2 + i) * 4;\n const r3 = (maxPartCount * 3 + i) * 4;\n const r4 = (maxPartCount * 4 + i) * 4;\n\n // Row 0: clipMin.xyz, clipMax.x — Row 1: clipMax.yz, minOpacity, maxOpacity\n const box = i < partCount ? (this._partClippingBoxes[i] ?? this._clippingBox) : this._clippingBox;\n if (box) {\n data[r0] = box.min.x;\n data[r0 + 1] = box.min.y;\n data[r0 + 2] = box.min.z;\n data[r0 + 3] = box.max.x;\n data[r1] = box.max.y;\n data[r1 + 1] = box.max.z;\n } else {\n data[r0] = -1e9;\n data[r0 + 1] = -1e9;\n data[r0 + 2] = -1e9;\n data[r0 + 3] = 1e9;\n data[r1] = 1e9;\n data[r1 + 1] = 1e9;\n }\n const opCull = i < partCount ? (this._partOpacityCullings[i] ?? this._opacityCulling) : this._opacityCulling;\n data[r1 + 2] = opCull ? opCull.min : 0.0;\n data[r1 + 3] = opCull ? opCull.max : 1.0;\n\n // Row 2: minSize, maxSize, opacityScale, opacitySaturate\n const szCull = i < partCount ? (this._partSizeCullings[i] ?? this._sizeCulling) : this._sizeCulling;\n data[r2] = szCull ? szCull.min : 0.0;\n data[r2 + 1] = szCull ? szCull.max : 1e9;\n data[r2 + 2] = i < partCount ? (this._partOpacityScales[i] ?? this._opacityScale) : this._opacityScale;\n const sat = i < partCount ? (this._partOpacitySaturates[i] ?? this._opacitySaturate) : this._opacitySaturate;\n data[r2 + 3] = sat ? 1.0 : 0.0;\n\n // Row 3: shDc, shOrder1, shOrder2, shOrder3\n data[r3] = (i < partCount ? (this._partShDcs[i] ?? this._shDc) : this._shDc) ? 1.0 : 0.0;\n data[r3 + 1] = (i < partCount ? (this._partShOrder1s[i] ?? this._shOrder1) : this._shOrder1) ? 1.0 : 0.0;\n data[r3 + 2] = (i < partCount ? (this._partShOrder2s[i] ?? this._shOrder2) : this._shOrder2) ? 1.0 : 0.0;\n data[r3 + 3] = (i < partCount ? (this._partShOrder3s[i] ?? this._shOrder3) : this._shOrder3) ? 1.0 : 0.0;\n\n // Row 4: shOrder4, padding\n data[r4] = (i < partCount ? (this._partShOrder4s[i] ?? this._shOrder4) : this._shOrder4) ? 1.0 : 0.0;\n }\n return data;\n }\n\n private _updateOrCreateTexture(scene: Scene): void {\n if (!this._maxPartCount) {\n this._maxPartCount = GetGaussianSplattingMaxPartCount(scene.getEngine());\n }\n const data = this._buildTextureData(this._partCount);\n if (!this._dbgPartDataTexture) {\n this._dbgPartDataTexture = RawTexture.CreateRGBATexture(\n data,\n this._maxPartCount,\n 5,\n scene,\n false,\n false,\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n Constants.TEXTURETYPE_FLOAT\n );\n } else {\n this._dbgPartDataTexture.update(data);\n }\n this._textureDirty = false;\n }\n\n /**\n * Binds uniform values each frame. Scalar uniforms are uploaded for non-compound mode;\n * the per-part data texture is updated and bound for compound mode.\n * @param _uniformBuffer unused\n * @param _scene the current scene\n * @param _engine unused\n * @param subMesh the submesh being rendered\n */\n public override bindForSubMesh(_uniformBuffer: UniformBuffer, _scene: Scene, _engine: AbstractEngine, subMesh: SubMesh): void {\n const effect = subMesh.effect;\n if (!effect) {\n return;\n }\n\n if (this._partCount > 0 && this._isAnyFeatureActive()) {\n // Compound mode: pack per-part data into a texture (only when the debug path is active)\n if (this._textureDirty || !this._dbgPartDataTexture) {\n this._updateOrCreateTexture(_scene);\n }\n if (this._dbgPartDataTexture) {\n effect.setTexture(\"dbgPartData\", this._dbgPartDataTexture);\n }\n } else if (this._partCount === 0) {\n // Non-compound: upload scalar uniforms\n if (this._clippingBox) {\n effect.setVector3(\"dbgClipMin\", this._clippingBox.min);\n effect.setVector3(\"dbgClipMax\", this._clippingBox.max);\n }\n if (this._opacityCulling) {\n effect.setFloat(\"dbgMinOpacity\", this._opacityCulling.min);\n effect.setFloat(\"dbgMaxOpacity\", this._opacityCulling.max);\n }\n if (this._sizeCulling) {\n effect.setFloat(\"dbgMinSize\", this._sizeCulling.min);\n effect.setFloat(\"dbgMaxSize\", this._sizeCulling.max);\n }\n if (this._opacityScale !== 1.0) {\n effect.setFloat(\"dbgOpacityScale\", this._opacityScale);\n }\n }\n }\n\n /**\n * Disposes the per-part data texture.\n * @param _forceDisposeTextures unused; the LUT texture is always disposed as it is owned by this plugin\n */\n public override dispose(_forceDisposeTextures?: boolean): void {\n this._dbgPartDataTexture?.dispose();\n this._dbgPartDataTexture = null;\n }\n}\n\nlet _Registered = false;\n/**\n * Register side effects for GaussianSplattingDebugMaterialPlugin.\n * Safe to call multiple times; only the first call has an effect.\n */\nexport function RegisterGaussianSplattingDebugMaterialPlugin(): void {\n if (_Registered) {\n return;\n }\n _Registered = true;\n\n RegisterClass(\"BABYLON.GaussianSplattingDebugMaterialPlugin\", GaussianSplattingDebugMaterialPlugin);\n}\n"]}
|
|
@@ -427,3 +427,9 @@ export declare class PBRMaterial extends PBRBaseMaterial {
|
|
|
427
427
|
* Safe to call multiple times; only the first call has an effect.
|
|
428
428
|
*/
|
|
429
429
|
export declare function RegisterPbrMaterial(): void;
|
|
430
|
+
/**
|
|
431
|
+
* Register side effects for PBRMaterial.
|
|
432
|
+
* Safe to call multiple times; only the first call has an effect.
|
|
433
|
+
* Alias for {@link RegisterPbrMaterial}.
|
|
434
|
+
*/
|
|
435
|
+
export declare function RegisterPBRMaterial(): void;
|
|
@@ -724,4 +724,12 @@ export function RegisterPbrMaterial() {
|
|
|
724
724
|
_Registered = true;
|
|
725
725
|
RegisterClass("BABYLON.PBRMaterial", PBRMaterial);
|
|
726
726
|
}
|
|
727
|
+
/**
|
|
728
|
+
* Register side effects for PBRMaterial.
|
|
729
|
+
* Safe to call multiple times; only the first call has an effect.
|
|
730
|
+
* Alias for {@link RegisterPbrMaterial}.
|
|
731
|
+
*/
|
|
732
|
+
export function RegisterPBRMaterial() {
|
|
733
|
+
RegisterPbrMaterial();
|
|
734
|
+
}
|
|
727
735
|
//# sourceMappingURL=pbrMaterial.pure.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pbrMaterial.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/PBR/pbrMaterial.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { serialize, serializeAsColor3, expandToProperty, serializeAsTexture } from \"../../Misc/decorators\";\r\nimport { GetEnvironmentBRDFTexture } from \"../../Misc/brdfTextureTools\";\r\nimport { type Nullable } from \"../../types\";\r\nimport { type Scene } from \"../../scene.pure\";\r\nimport { Color3 } from \"../../Maths/math.color.pure\";\r\nimport { type BaseTexture } from \"../../Materials/Textures/baseTexture.pure\";\r\nimport { PBRBaseMaterial } from \"./pbrBaseMaterial.pure\";\r\nimport { Material } from \"../material.pure\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\nimport { RegisterClass } from \"../../Misc/typeStore\";\r\n\r\n/**\r\n * The Physically based material of BJS.\r\n *\r\n * This offers the main features of a standard PBR material.\r\n * For more information, please refer to the documentation :\r\n * https://doc.babylonjs.com/features/featuresDeepDive/materials/using/introToPBR\r\n */\r\nexport class PBRMaterial extends PBRBaseMaterial {\r\n /**\r\n * PBRMaterialTransparencyMode: No transparency mode, Alpha channel is not use.\r\n */\r\n public static override readonly PBRMATERIAL_OPAQUE = PBRBaseMaterial.PBRMATERIAL_OPAQUE;\r\n\r\n /**\r\n * PBRMaterialTransparencyMode: Alpha Test mode, pixel are discarded below a certain threshold defined by the alpha cutoff value.\r\n */\r\n public static override readonly PBRMATERIAL_ALPHATEST = PBRBaseMaterial.PBRMATERIAL_ALPHATEST;\r\n\r\n /**\r\n * PBRMaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.\r\n */\r\n public static override readonly PBRMATERIAL_ALPHABLEND = PBRBaseMaterial.PBRMATERIAL_ALPHABLEND;\r\n\r\n /**\r\n * PBRMaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.\r\n * They are also discarded below the alpha cutoff threshold to improve performances.\r\n */\r\n public static override readonly PBRMATERIAL_ALPHATESTANDBLEND = PBRBaseMaterial.PBRMATERIAL_ALPHATESTANDBLEND;\r\n\r\n /**\r\n * Defines the default value of how much AO map is occluding the analytical lights\r\n * (point spot...).\r\n */\r\n public static override DEFAULT_AO_ON_ANALYTICAL_LIGHTS = PBRBaseMaterial.DEFAULT_AO_ON_ANALYTICAL_LIGHTS;\r\n\r\n /**\r\n * Intensity of the direct lights e.g. the four lights available in your scene.\r\n * This impacts both the direct diffuse and specular highlights.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public directIntensity: number = 1.0;\r\n\r\n /**\r\n * Intensity of the emissive part of the material.\r\n * This helps controlling the emissive effect without modifying the emissive color.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public emissiveIntensity: number = 1.0;\r\n\r\n /**\r\n * Intensity of the environment e.g. how much the environment will light the object\r\n * either through harmonics for rough material or through the reflection for shiny ones.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public environmentIntensity: number = 1.0;\r\n\r\n /**\r\n * This is a special control allowing the reduction of the specular highlights coming from the\r\n * four lights of the scene. Those highlights may not be needed in full environment lighting.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public specularIntensity: number = 1.0;\r\n\r\n /**\r\n * Debug Control allowing disabling the bump map on this material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public disableBumpMap: boolean = false;\r\n\r\n /**\r\n * AKA Diffuse Texture in standard nomenclature.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public albedoTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * OpenPBR Base Weight texture (multiplier to the diffuse and metal lobes).\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public baseWeightTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * OpenPBR Base Diffuse Roughness texture (roughness of the diffuse lobe).\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public baseDiffuseRoughnessTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * AKA Occlusion Texture in other nomenclature.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public ambientTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * AKA Occlusion Texture Intensity in other nomenclature.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public ambientTextureStrength: number = 1.0;\r\n\r\n /**\r\n * Defines how much the AO map is occluding the analytical lights (point spot...).\r\n * 1 means it completely occludes it\r\n * 0 mean it has no impact\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public ambientTextureImpactOnAnalyticalLights: number = PBRMaterial.DEFAULT_AO_ON_ANALYTICAL_LIGHTS;\r\n\r\n /**\r\n * Stores the alpha values in a texture. Use luminance if texture.getAlphaFromRGB is true.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\r\n public opacityTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Stores the reflection values in a texture.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public reflectionTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Stores the emissive values in a texture.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public emissiveTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * AKA Specular texture in other nomenclature.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public reflectivityTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Used to switch from specular/glossiness to metallic/roughness workflow.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public metallicTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Specifies the metallic scalar of the metallic/roughness workflow.\r\n * Can also be used to scale the metalness values of the metallic texture.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public metallic: Nullable<number>;\r\n\r\n /**\r\n * Specifies the roughness scalar of the metallic/roughness workflow.\r\n * Can also be used to scale the roughness values of the metallic texture.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public roughness: Nullable<number>;\r\n\r\n /**\r\n * In metallic workflow, specifies an F0 factor to help configuring the material F0.\r\n * By default the indexOfrefraction is used to compute F0;\r\n *\r\n * This is used as a factor against the default reflectance at normal incidence to tweak it.\r\n *\r\n * F0 = defaultF0 * metallicF0Factor * metallicReflectanceColor;\r\n * F90 = metallicReflectanceColor;\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public metallicF0Factor = 1;\r\n\r\n /**\r\n * In metallic workflow, specifies an F0 color.\r\n * By default the F90 is always 1;\r\n *\r\n * Please note that this factor is also used as a factor against the default reflectance at normal incidence.\r\n *\r\n * F0 = defaultF0_from_IOR * metallicF0Factor * metallicReflectanceColor\r\n * F90 = metallicF0Factor;\r\n */\r\n @serializeAsColor3()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public metallicReflectanceColor = Color3.White();\r\n\r\n /**\r\n * Specifies that only the A channel from metallicReflectanceTexture should be used.\r\n * If false, both RGB and A channels will be used\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useOnlyMetallicFromMetallicReflectanceTexture = false;\r\n\r\n /**\r\n * Defines to store metallicReflectanceColor in RGB and metallicF0Factor in A\r\n * This is multiplied against the scalar values defined in the material.\r\n * If useOnlyMetallicFromMetallicReflectanceTexture is true, don't use the RGB channels, only A\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public metallicReflectanceTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Defines to store reflectanceColor in RGB\r\n * This is multiplied against the scalar values defined in the material.\r\n * If both reflectanceTexture and metallicReflectanceTexture textures are provided and useOnlyMetallicFromMetallicReflectanceTexture\r\n * is false, metallicReflectanceTexture takes priority and reflectanceTexture is not used\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public reflectanceTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Used to enable roughness/glossiness fetch from a separate channel depending on the current mode.\r\n * Gray Scale represents roughness in metallic mode and glossiness in specular mode.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public microSurfaceTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Stores surface normal data used to displace a mesh in a texture.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public bumpTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Stores the pre-calculated light information of a mesh in a texture.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\", null)\r\n public lightmapTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Stores the refracted light information in a texture.\r\n */\r\n public get refractionTexture(): Nullable<BaseTexture> {\r\n return this.subSurface.refractionTexture;\r\n }\r\n public set refractionTexture(value: Nullable<BaseTexture>) {\r\n this.subSurface.refractionTexture = value;\r\n if (value) {\r\n this.subSurface.isRefractionEnabled = true;\r\n } else if (!this.subSurface.linkRefractionWithTransparency) {\r\n this.subSurface.isRefractionEnabled = false;\r\n }\r\n }\r\n\r\n /**\r\n * The color of a material in ambient lighting.\r\n */\r\n @serializeAsColor3(\"ambient\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public ambientColor = new Color3(0, 0, 0);\r\n\r\n /**\r\n * AKA Diffuse Color in other nomenclature.\r\n */\r\n @serializeAsColor3(\"albedo\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public albedoColor = new Color3(1, 1, 1);\r\n\r\n /**\r\n * OpenPBR Base Weight (multiplier to the diffuse and metal lobes).\r\n */\r\n @serialize(\"baseWeight\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public baseWeight = 1;\r\n\r\n /**\r\n * OpenPBR Base Diffuse Roughness (roughness of the diffuse lobe).\r\n */\r\n @serialize(\"baseDiffuseRoughness\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public baseDiffuseRoughness: Nullable<number>;\r\n\r\n /**\r\n * AKA Specular Color in other nomenclature.\r\n */\r\n @serializeAsColor3(\"reflectivity\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public reflectivityColor = new Color3(1, 1, 1);\r\n\r\n /**\r\n * The color reflected from the material.\r\n */\r\n @serializeAsColor3(\"reflection\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public reflectionColor = new Color3(1.0, 1.0, 1.0);\r\n\r\n /**\r\n * The color emitted from the material.\r\n */\r\n @serializeAsColor3(\"emissive\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public emissiveColor = new Color3(0, 0, 0);\r\n\r\n /**\r\n * AKA Glossiness in other nomenclature.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public microSurface = 1.0;\r\n\r\n /**\r\n * Index of refraction of the material base layer.\r\n * https://en.wikipedia.org/wiki/List_of_refractive_indices\r\n *\r\n * This does not only impact refraction but also the Base F0 of Dielectric Materials.\r\n *\r\n * From dielectric fresnel rules: F0 = square((iorT - iorI) / (iorT + iorI))\r\n */\r\n public get indexOfRefraction(): number {\r\n return this.subSurface.indexOfRefraction;\r\n }\r\n public set indexOfRefraction(value: number) {\r\n this.subSurface.indexOfRefraction = value;\r\n }\r\n\r\n /**\r\n * Controls if refraction needs to be inverted on Y. This could be useful for procedural texture.\r\n */\r\n public get invertRefractionY(): boolean {\r\n return this.subSurface.invertRefractionY;\r\n }\r\n public set invertRefractionY(value: boolean) {\r\n this.subSurface.invertRefractionY = value;\r\n }\r\n\r\n /**\r\n * This parameters will make the material used its opacity to control how much it is refracting against not.\r\n * Materials half opaque for instance using refraction could benefit from this control.\r\n */\r\n public get linkRefractionWithTransparency(): boolean {\r\n return this.subSurface.linkRefractionWithTransparency;\r\n }\r\n public set linkRefractionWithTransparency(value: boolean) {\r\n this.subSurface.linkRefractionWithTransparency = value;\r\n if (value) {\r\n this.subSurface.isRefractionEnabled = true;\r\n }\r\n }\r\n\r\n /**\r\n * If true, the light map contains occlusion information instead of lighting info.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useLightmapAsShadowmap = false;\r\n\r\n /**\r\n * Specifies that the alpha is coming form the albedo channel alpha channel for alpha blending.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\r\n public useAlphaFromAlbedoTexture = false;\r\n\r\n /**\r\n * Enforces alpha test in opaque or blend mode in order to improve the performances of some situations.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\r\n public forceAlphaTest = false;\r\n\r\n /**\r\n * Defines the alpha limits in alpha test mode.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\r\n public alphaCutOff = 0.4;\r\n\r\n /**\r\n * Specifies that the material will keep the specular highlights over a transparent surface (only the most luminous ones).\r\n * A car glass is a good example of that. When sun reflects on it you can not see what is behind.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useSpecularOverAlpha = true;\r\n\r\n /**\r\n * Specifies if the reflectivity texture contains the glossiness information in its alpha channel.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useMicroSurfaceFromReflectivityMapAlpha = false;\r\n\r\n /**\r\n * Specifies if the metallic texture contains the roughness information in its alpha channel.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useRoughnessFromMetallicTextureAlpha = true;\r\n\r\n /**\r\n * Specifies if the metallic texture contains the roughness information in its green channel.\r\n * Needs useRoughnessFromMetallicTextureAlpha to be false.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useRoughnessFromMetallicTextureGreen = false;\r\n\r\n /**\r\n * Specifies if the metallic texture contains the metallness information in its blue channel.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useMetallnessFromMetallicTextureBlue = false;\r\n\r\n /**\r\n * Specifies if the metallic texture contains the ambient occlusion information in its red channel.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useAmbientOcclusionFromMetallicTextureRed = false;\r\n\r\n /**\r\n * Specifies if the ambient texture contains the ambient occlusion information in its red channel only.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useAmbientInGrayScale = false;\r\n\r\n /**\r\n * In case the reflectivity map does not contain the microsurface information in its alpha channel,\r\n * The material will try to infer what glossiness each pixel should be.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useAutoMicroSurfaceFromReflectivityMap = false;\r\n\r\n /**\r\n * BJS is using an hardcoded light falloff based on a manually sets up range.\r\n * In PBR, one way to represents the falloff is to use the inverse squared root algorithm.\r\n * This parameter can help you switch back to the BJS mode in order to create scenes using both materials.\r\n */\r\n @serialize()\r\n public get usePhysicalLightFalloff(): boolean {\r\n return this._lightFalloff === PBRBaseMaterial.LIGHTFALLOFF_PHYSICAL;\r\n }\r\n\r\n /**\r\n * BJS is using an hardcoded light falloff based on a manually sets up range.\r\n * In PBR, one way to represents the falloff is to use the inverse squared root algorithm.\r\n * This parameter can help you switch back to the BJS mode in order to create scenes using both materials.\r\n */\r\n public set usePhysicalLightFalloff(value: boolean) {\r\n if (value !== this.usePhysicalLightFalloff) {\r\n // Ensure the effect will be rebuilt.\r\n this._markAllSubMeshesAsTexturesDirty();\r\n\r\n if (value) {\r\n this._lightFalloff = PBRBaseMaterial.LIGHTFALLOFF_PHYSICAL;\r\n } else {\r\n this._lightFalloff = PBRBaseMaterial.LIGHTFALLOFF_STANDARD;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * In order to support the falloff compatibility with gltf, a special mode has been added\r\n * to reproduce the gltf light falloff.\r\n */\r\n @serialize()\r\n public get useGLTFLightFalloff(): boolean {\r\n return this._lightFalloff === PBRBaseMaterial.LIGHTFALLOFF_GLTF;\r\n }\r\n\r\n /**\r\n * In order to support the falloff compatibility with gltf, a special mode has been added\r\n * to reproduce the gltf light falloff.\r\n */\r\n public set useGLTFLightFalloff(value: boolean) {\r\n if (value !== this.useGLTFLightFalloff) {\r\n // Ensure the effect will be rebuilt.\r\n this._markAllSubMeshesAsTexturesDirty();\r\n\r\n if (value) {\r\n this._lightFalloff = PBRBaseMaterial.LIGHTFALLOFF_GLTF;\r\n } else {\r\n this._lightFalloff = PBRBaseMaterial.LIGHTFALLOFF_STANDARD;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Specifies that the material will keeps the reflection highlights over a transparent surface (only the most luminous ones).\r\n * A car glass is a good example of that. When the street lights reflects on it you can not see what is behind.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useRadianceOverAlpha = true;\r\n\r\n /**\r\n * Allows using an object space normal map (instead of tangent space).\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useObjectSpaceNormalMap = false;\r\n\r\n /**\r\n * Allows using the bump map in parallax mode.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useParallax = false;\r\n\r\n /**\r\n * Allows using the bump map in parallax occlusion mode.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useParallaxOcclusion = false;\r\n\r\n /**\r\n * Controls the scale bias of the parallax mode.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public parallaxScaleBias = 0.05;\r\n\r\n /**\r\n * If sets to true, disables all the lights affecting the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsLightsDirty\")\r\n public disableLighting = false;\r\n\r\n /**\r\n * Force the shader to compute irradiance in the fragment shader in order to take bump in account.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public forceIrradianceInFragment = false;\r\n\r\n /**\r\n * Number of Simultaneous lights allowed on the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsLightsDirty\")\r\n public maxSimultaneousLights = 4;\r\n\r\n /**\r\n * If sets to true, x component of normal map value will invert (x = 1.0 - x).\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public invertNormalMapX = false;\r\n\r\n /**\r\n * If sets to true, y component of normal map value will invert (y = 1.0 - y).\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public invertNormalMapY = false;\r\n\r\n /**\r\n * If sets to true and backfaceCulling is false, normals will be flipped on the backside.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public twoSidedLighting = false;\r\n\r\n /**\r\n * A fresnel is applied to the alpha of the model to ensure grazing angles edges are not alpha tested.\r\n * And/Or occlude the blended part. (alpha is converted to gamma to compute the fresnel)\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useAlphaFresnel = false;\r\n\r\n /**\r\n * A fresnel is applied to the alpha of the model to ensure grazing angles edges are not alpha tested.\r\n * And/Or occlude the blended part. (alpha stays linear to compute the fresnel)\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useLinearAlphaFresnel = false;\r\n\r\n /**\r\n * Let user defines the brdf lookup texture used for IBL.\r\n * A default 8bit version is embedded but you could point at :\r\n * * Default texture: https://assets.babylonjs.com/environments/correlatedMSBRDF_RGBD.png\r\n * * Default 16bit pixel depth texture: https://assets.babylonjs.com/environments/correlatedMSBRDF.dds\r\n * * LEGACY Default None correlated https://assets.babylonjs.com/environments/uncorrelatedBRDF_RGBD.png\r\n * * LEGACY Default None correlated 16bit pixel depth https://assets.babylonjs.com/environments/uncorrelatedBRDF.dds\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public environmentBRDFTexture: Nullable<BaseTexture> = null;\r\n\r\n /**\r\n * Force normal to face away from face.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public forceNormalForward = false;\r\n\r\n /**\r\n * Enables specular anti aliasing in the PBR shader.\r\n * It will both interacts on the Geometry for analytical and IBL lighting.\r\n * It also prefilter the roughness map based on the bump values.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public enableSpecularAntiAliasing = false;\r\n\r\n /**\r\n * This parameters will enable/disable Horizon occlusion to prevent normal maps to look shiny when the normal\r\n * makes the reflect vector face the model (under horizon).\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useHorizonOcclusion = true;\r\n\r\n /**\r\n * This parameters will enable/disable radiance occlusion by preventing the radiance to lit\r\n * too much the area relying on ambient texture to define their ambient occlusion.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useRadianceOcclusion = true;\r\n\r\n /**\r\n * If set to true, no lighting calculations will be applied.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsMiscDirty\")\r\n public unlit = false;\r\n\r\n /**\r\n * If sets to true, the decal map will be applied after the detail map. Else, it is applied before (default: false)\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsMiscDirty\")\r\n public applyDecalMapAfterDetailMap = false;\r\n\r\n /**\r\n * Instantiates a new PBRMaterial instance.\r\n *\r\n * @param name The material name\r\n * @param scene The scene the material will be use in.\r\n * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false\r\n */\r\n constructor(name: string, scene?: Scene, forceGLSL = false) {\r\n super(name, scene, forceGLSL);\r\n\r\n this._environmentBRDFTexture = GetEnvironmentBRDFTexture(this.getScene());\r\n }\r\n\r\n /**\r\n * @returns the name of this material class.\r\n */\r\n public override getClassName(): string {\r\n return \"PBRMaterial\";\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current material.\r\n * @param name - name to use for the new material.\r\n * @param cloneTexturesOnlyOnce - if a texture is used in more than one channel (e.g diffuse and opacity), only clone it once and reuse it on the other channels. Default false.\r\n * @param rootUrl defines the root URL to use to load textures\r\n * @returns cloned material instance\r\n */\r\n public override clone(name: string, cloneTexturesOnlyOnce: boolean = true, rootUrl = \"\"): PBRMaterial {\r\n const clone = SerializationHelper.Clone(() => new PBRMaterial(name, this.getScene()), this, { cloneTexturesOnlyOnce });\r\n\r\n clone.id = name;\r\n clone.name = name;\r\n\r\n this.stencil.copyTo(clone.stencil);\r\n\r\n this._clonePlugins(clone, rootUrl);\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Serializes this PBR Material.\r\n * @returns - An object with the serialized material.\r\n */\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.PBRMaterial\";\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Parses a PBR Material from a serialized object.\r\n * @param source - Serialized object.\r\n * @param scene - BJS scene instance.\r\n * @param rootUrl - url for the scene object\r\n * @returns - PBRMaterial\r\n */\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): PBRMaterial {\r\n const material = SerializationHelper.Parse(() => new PBRMaterial(source.name, scene), source, scene, rootUrl);\r\n\r\n if (source.stencil) {\r\n material.stencil.parse(source.stencil, scene, rootUrl);\r\n }\r\n\r\n Material._ParsePlugins(source, material, scene, rootUrl);\r\n\r\n // The code block below ensures backward compatibility with serialized materials before plugins are automatically serialized.\r\n if (source.clearCoat) {\r\n material.clearCoat.parse(source.clearCoat, scene, rootUrl);\r\n }\r\n if (source.anisotropy) {\r\n material.anisotropy.parse(source.anisotropy, scene, rootUrl);\r\n }\r\n if (source.brdf) {\r\n material.brdf.parse(source.brdf, scene, rootUrl);\r\n }\r\n if (source.sheen) {\r\n material.sheen.parse(source.sheen, scene, rootUrl);\r\n }\r\n if (source.subSurface) {\r\n material.subSurface.parse(source.subSurface, scene, rootUrl);\r\n }\r\n if (source.iridescence) {\r\n material.iridescence.parse(source.iridescence, scene, rootUrl);\r\n }\r\n\r\n return material;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for pbrMaterial.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterPbrMaterial(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.PBRMaterial\", PBRMaterial);\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"pbrMaterial.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/PBR/pbrMaterial.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { serialize, serializeAsColor3, expandToProperty, serializeAsTexture } from \"../../Misc/decorators\";\r\nimport { GetEnvironmentBRDFTexture } from \"../../Misc/brdfTextureTools\";\r\nimport { type Nullable } from \"../../types\";\r\nimport { type Scene } from \"../../scene.pure\";\r\nimport { Color3 } from \"../../Maths/math.color.pure\";\r\nimport { type BaseTexture } from \"../../Materials/Textures/baseTexture.pure\";\r\nimport { PBRBaseMaterial } from \"./pbrBaseMaterial.pure\";\r\nimport { Material } from \"../material.pure\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\nimport { RegisterClass } from \"../../Misc/typeStore\";\r\n\r\n/**\r\n * The Physically based material of BJS.\r\n *\r\n * This offers the main features of a standard PBR material.\r\n * For more information, please refer to the documentation :\r\n * https://doc.babylonjs.com/features/featuresDeepDive/materials/using/introToPBR\r\n */\r\nexport class PBRMaterial extends PBRBaseMaterial {\r\n /**\r\n * PBRMaterialTransparencyMode: No transparency mode, Alpha channel is not use.\r\n */\r\n public static override readonly PBRMATERIAL_OPAQUE = PBRBaseMaterial.PBRMATERIAL_OPAQUE;\r\n\r\n /**\r\n * PBRMaterialTransparencyMode: Alpha Test mode, pixel are discarded below a certain threshold defined by the alpha cutoff value.\r\n */\r\n public static override readonly PBRMATERIAL_ALPHATEST = PBRBaseMaterial.PBRMATERIAL_ALPHATEST;\r\n\r\n /**\r\n * PBRMaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.\r\n */\r\n public static override readonly PBRMATERIAL_ALPHABLEND = PBRBaseMaterial.PBRMATERIAL_ALPHABLEND;\r\n\r\n /**\r\n * PBRMaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.\r\n * They are also discarded below the alpha cutoff threshold to improve performances.\r\n */\r\n public static override readonly PBRMATERIAL_ALPHATESTANDBLEND = PBRBaseMaterial.PBRMATERIAL_ALPHATESTANDBLEND;\r\n\r\n /**\r\n * Defines the default value of how much AO map is occluding the analytical lights\r\n * (point spot...).\r\n */\r\n public static override DEFAULT_AO_ON_ANALYTICAL_LIGHTS = PBRBaseMaterial.DEFAULT_AO_ON_ANALYTICAL_LIGHTS;\r\n\r\n /**\r\n * Intensity of the direct lights e.g. the four lights available in your scene.\r\n * This impacts both the direct diffuse and specular highlights.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public directIntensity: number = 1.0;\r\n\r\n /**\r\n * Intensity of the emissive part of the material.\r\n * This helps controlling the emissive effect without modifying the emissive color.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public emissiveIntensity: number = 1.0;\r\n\r\n /**\r\n * Intensity of the environment e.g. how much the environment will light the object\r\n * either through harmonics for rough material or through the reflection for shiny ones.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public environmentIntensity: number = 1.0;\r\n\r\n /**\r\n * This is a special control allowing the reduction of the specular highlights coming from the\r\n * four lights of the scene. Those highlights may not be needed in full environment lighting.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public specularIntensity: number = 1.0;\r\n\r\n /**\r\n * Debug Control allowing disabling the bump map on this material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public disableBumpMap: boolean = false;\r\n\r\n /**\r\n * AKA Diffuse Texture in standard nomenclature.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public albedoTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * OpenPBR Base Weight texture (multiplier to the diffuse and metal lobes).\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public baseWeightTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * OpenPBR Base Diffuse Roughness texture (roughness of the diffuse lobe).\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public baseDiffuseRoughnessTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * AKA Occlusion Texture in other nomenclature.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public ambientTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * AKA Occlusion Texture Intensity in other nomenclature.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public ambientTextureStrength: number = 1.0;\r\n\r\n /**\r\n * Defines how much the AO map is occluding the analytical lights (point spot...).\r\n * 1 means it completely occludes it\r\n * 0 mean it has no impact\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public ambientTextureImpactOnAnalyticalLights: number = PBRMaterial.DEFAULT_AO_ON_ANALYTICAL_LIGHTS;\r\n\r\n /**\r\n * Stores the alpha values in a texture. Use luminance if texture.getAlphaFromRGB is true.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\r\n public opacityTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Stores the reflection values in a texture.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public reflectionTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Stores the emissive values in a texture.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public emissiveTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * AKA Specular texture in other nomenclature.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public reflectivityTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Used to switch from specular/glossiness to metallic/roughness workflow.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public metallicTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Specifies the metallic scalar of the metallic/roughness workflow.\r\n * Can also be used to scale the metalness values of the metallic texture.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public metallic: Nullable<number>;\r\n\r\n /**\r\n * Specifies the roughness scalar of the metallic/roughness workflow.\r\n * Can also be used to scale the roughness values of the metallic texture.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public roughness: Nullable<number>;\r\n\r\n /**\r\n * In metallic workflow, specifies an F0 factor to help configuring the material F0.\r\n * By default the indexOfrefraction is used to compute F0;\r\n *\r\n * This is used as a factor against the default reflectance at normal incidence to tweak it.\r\n *\r\n * F0 = defaultF0 * metallicF0Factor * metallicReflectanceColor;\r\n * F90 = metallicReflectanceColor;\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public metallicF0Factor = 1;\r\n\r\n /**\r\n * In metallic workflow, specifies an F0 color.\r\n * By default the F90 is always 1;\r\n *\r\n * Please note that this factor is also used as a factor against the default reflectance at normal incidence.\r\n *\r\n * F0 = defaultF0_from_IOR * metallicF0Factor * metallicReflectanceColor\r\n * F90 = metallicF0Factor;\r\n */\r\n @serializeAsColor3()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public metallicReflectanceColor = Color3.White();\r\n\r\n /**\r\n * Specifies that only the A channel from metallicReflectanceTexture should be used.\r\n * If false, both RGB and A channels will be used\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useOnlyMetallicFromMetallicReflectanceTexture = false;\r\n\r\n /**\r\n * Defines to store metallicReflectanceColor in RGB and metallicF0Factor in A\r\n * This is multiplied against the scalar values defined in the material.\r\n * If useOnlyMetallicFromMetallicReflectanceTexture is true, don't use the RGB channels, only A\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public metallicReflectanceTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Defines to store reflectanceColor in RGB\r\n * This is multiplied against the scalar values defined in the material.\r\n * If both reflectanceTexture and metallicReflectanceTexture textures are provided and useOnlyMetallicFromMetallicReflectanceTexture\r\n * is false, metallicReflectanceTexture takes priority and reflectanceTexture is not used\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public reflectanceTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Used to enable roughness/glossiness fetch from a separate channel depending on the current mode.\r\n * Gray Scale represents roughness in metallic mode and glossiness in specular mode.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public microSurfaceTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Stores surface normal data used to displace a mesh in a texture.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public bumpTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Stores the pre-calculated light information of a mesh in a texture.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\", null)\r\n public lightmapTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Stores the refracted light information in a texture.\r\n */\r\n public get refractionTexture(): Nullable<BaseTexture> {\r\n return this.subSurface.refractionTexture;\r\n }\r\n public set refractionTexture(value: Nullable<BaseTexture>) {\r\n this.subSurface.refractionTexture = value;\r\n if (value) {\r\n this.subSurface.isRefractionEnabled = true;\r\n } else if (!this.subSurface.linkRefractionWithTransparency) {\r\n this.subSurface.isRefractionEnabled = false;\r\n }\r\n }\r\n\r\n /**\r\n * The color of a material in ambient lighting.\r\n */\r\n @serializeAsColor3(\"ambient\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public ambientColor = new Color3(0, 0, 0);\r\n\r\n /**\r\n * AKA Diffuse Color in other nomenclature.\r\n */\r\n @serializeAsColor3(\"albedo\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public albedoColor = new Color3(1, 1, 1);\r\n\r\n /**\r\n * OpenPBR Base Weight (multiplier to the diffuse and metal lobes).\r\n */\r\n @serialize(\"baseWeight\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public baseWeight = 1;\r\n\r\n /**\r\n * OpenPBR Base Diffuse Roughness (roughness of the diffuse lobe).\r\n */\r\n @serialize(\"baseDiffuseRoughness\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public baseDiffuseRoughness: Nullable<number>;\r\n\r\n /**\r\n * AKA Specular Color in other nomenclature.\r\n */\r\n @serializeAsColor3(\"reflectivity\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public reflectivityColor = new Color3(1, 1, 1);\r\n\r\n /**\r\n * The color reflected from the material.\r\n */\r\n @serializeAsColor3(\"reflection\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public reflectionColor = new Color3(1.0, 1.0, 1.0);\r\n\r\n /**\r\n * The color emitted from the material.\r\n */\r\n @serializeAsColor3(\"emissive\")\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public emissiveColor = new Color3(0, 0, 0);\r\n\r\n /**\r\n * AKA Glossiness in other nomenclature.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public microSurface = 1.0;\r\n\r\n /**\r\n * Index of refraction of the material base layer.\r\n * https://en.wikipedia.org/wiki/List_of_refractive_indices\r\n *\r\n * This does not only impact refraction but also the Base F0 of Dielectric Materials.\r\n *\r\n * From dielectric fresnel rules: F0 = square((iorT - iorI) / (iorT + iorI))\r\n */\r\n public get indexOfRefraction(): number {\r\n return this.subSurface.indexOfRefraction;\r\n }\r\n public set indexOfRefraction(value: number) {\r\n this.subSurface.indexOfRefraction = value;\r\n }\r\n\r\n /**\r\n * Controls if refraction needs to be inverted on Y. This could be useful for procedural texture.\r\n */\r\n public get invertRefractionY(): boolean {\r\n return this.subSurface.invertRefractionY;\r\n }\r\n public set invertRefractionY(value: boolean) {\r\n this.subSurface.invertRefractionY = value;\r\n }\r\n\r\n /**\r\n * This parameters will make the material used its opacity to control how much it is refracting against not.\r\n * Materials half opaque for instance using refraction could benefit from this control.\r\n */\r\n public get linkRefractionWithTransparency(): boolean {\r\n return this.subSurface.linkRefractionWithTransparency;\r\n }\r\n public set linkRefractionWithTransparency(value: boolean) {\r\n this.subSurface.linkRefractionWithTransparency = value;\r\n if (value) {\r\n this.subSurface.isRefractionEnabled = true;\r\n }\r\n }\r\n\r\n /**\r\n * If true, the light map contains occlusion information instead of lighting info.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useLightmapAsShadowmap = false;\r\n\r\n /**\r\n * Specifies that the alpha is coming form the albedo channel alpha channel for alpha blending.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\r\n public useAlphaFromAlbedoTexture = false;\r\n\r\n /**\r\n * Enforces alpha test in opaque or blend mode in order to improve the performances of some situations.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\r\n public forceAlphaTest = false;\r\n\r\n /**\r\n * Defines the alpha limits in alpha test mode.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\r\n public alphaCutOff = 0.4;\r\n\r\n /**\r\n * Specifies that the material will keep the specular highlights over a transparent surface (only the most luminous ones).\r\n * A car glass is a good example of that. When sun reflects on it you can not see what is behind.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useSpecularOverAlpha = true;\r\n\r\n /**\r\n * Specifies if the reflectivity texture contains the glossiness information in its alpha channel.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useMicroSurfaceFromReflectivityMapAlpha = false;\r\n\r\n /**\r\n * Specifies if the metallic texture contains the roughness information in its alpha channel.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useRoughnessFromMetallicTextureAlpha = true;\r\n\r\n /**\r\n * Specifies if the metallic texture contains the roughness information in its green channel.\r\n * Needs useRoughnessFromMetallicTextureAlpha to be false.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useRoughnessFromMetallicTextureGreen = false;\r\n\r\n /**\r\n * Specifies if the metallic texture contains the metallness information in its blue channel.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useMetallnessFromMetallicTextureBlue = false;\r\n\r\n /**\r\n * Specifies if the metallic texture contains the ambient occlusion information in its red channel.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useAmbientOcclusionFromMetallicTextureRed = false;\r\n\r\n /**\r\n * Specifies if the ambient texture contains the ambient occlusion information in its red channel only.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useAmbientInGrayScale = false;\r\n\r\n /**\r\n * In case the reflectivity map does not contain the microsurface information in its alpha channel,\r\n * The material will try to infer what glossiness each pixel should be.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useAutoMicroSurfaceFromReflectivityMap = false;\r\n\r\n /**\r\n * BJS is using an hardcoded light falloff based on a manually sets up range.\r\n * In PBR, one way to represents the falloff is to use the inverse squared root algorithm.\r\n * This parameter can help you switch back to the BJS mode in order to create scenes using both materials.\r\n */\r\n @serialize()\r\n public get usePhysicalLightFalloff(): boolean {\r\n return this._lightFalloff === PBRBaseMaterial.LIGHTFALLOFF_PHYSICAL;\r\n }\r\n\r\n /**\r\n * BJS is using an hardcoded light falloff based on a manually sets up range.\r\n * In PBR, one way to represents the falloff is to use the inverse squared root algorithm.\r\n * This parameter can help you switch back to the BJS mode in order to create scenes using both materials.\r\n */\r\n public set usePhysicalLightFalloff(value: boolean) {\r\n if (value !== this.usePhysicalLightFalloff) {\r\n // Ensure the effect will be rebuilt.\r\n this._markAllSubMeshesAsTexturesDirty();\r\n\r\n if (value) {\r\n this._lightFalloff = PBRBaseMaterial.LIGHTFALLOFF_PHYSICAL;\r\n } else {\r\n this._lightFalloff = PBRBaseMaterial.LIGHTFALLOFF_STANDARD;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * In order to support the falloff compatibility with gltf, a special mode has been added\r\n * to reproduce the gltf light falloff.\r\n */\r\n @serialize()\r\n public get useGLTFLightFalloff(): boolean {\r\n return this._lightFalloff === PBRBaseMaterial.LIGHTFALLOFF_GLTF;\r\n }\r\n\r\n /**\r\n * In order to support the falloff compatibility with gltf, a special mode has been added\r\n * to reproduce the gltf light falloff.\r\n */\r\n public set useGLTFLightFalloff(value: boolean) {\r\n if (value !== this.useGLTFLightFalloff) {\r\n // Ensure the effect will be rebuilt.\r\n this._markAllSubMeshesAsTexturesDirty();\r\n\r\n if (value) {\r\n this._lightFalloff = PBRBaseMaterial.LIGHTFALLOFF_GLTF;\r\n } else {\r\n this._lightFalloff = PBRBaseMaterial.LIGHTFALLOFF_STANDARD;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Specifies that the material will keeps the reflection highlights over a transparent surface (only the most luminous ones).\r\n * A car glass is a good example of that. When the street lights reflects on it you can not see what is behind.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useRadianceOverAlpha = true;\r\n\r\n /**\r\n * Allows using an object space normal map (instead of tangent space).\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useObjectSpaceNormalMap = false;\r\n\r\n /**\r\n * Allows using the bump map in parallax mode.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useParallax = false;\r\n\r\n /**\r\n * Allows using the bump map in parallax occlusion mode.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useParallaxOcclusion = false;\r\n\r\n /**\r\n * Controls the scale bias of the parallax mode.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public parallaxScaleBias = 0.05;\r\n\r\n /**\r\n * If sets to true, disables all the lights affecting the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsLightsDirty\")\r\n public disableLighting = false;\r\n\r\n /**\r\n * Force the shader to compute irradiance in the fragment shader in order to take bump in account.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public forceIrradianceInFragment = false;\r\n\r\n /**\r\n * Number of Simultaneous lights allowed on the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsLightsDirty\")\r\n public maxSimultaneousLights = 4;\r\n\r\n /**\r\n * If sets to true, x component of normal map value will invert (x = 1.0 - x).\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public invertNormalMapX = false;\r\n\r\n /**\r\n * If sets to true, y component of normal map value will invert (y = 1.0 - y).\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public invertNormalMapY = false;\r\n\r\n /**\r\n * If sets to true and backfaceCulling is false, normals will be flipped on the backside.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public twoSidedLighting = false;\r\n\r\n /**\r\n * A fresnel is applied to the alpha of the model to ensure grazing angles edges are not alpha tested.\r\n * And/Or occlude the blended part. (alpha is converted to gamma to compute the fresnel)\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useAlphaFresnel = false;\r\n\r\n /**\r\n * A fresnel is applied to the alpha of the model to ensure grazing angles edges are not alpha tested.\r\n * And/Or occlude the blended part. (alpha stays linear to compute the fresnel)\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useLinearAlphaFresnel = false;\r\n\r\n /**\r\n * Let user defines the brdf lookup texture used for IBL.\r\n * A default 8bit version is embedded but you could point at :\r\n * * Default texture: https://assets.babylonjs.com/environments/correlatedMSBRDF_RGBD.png\r\n * * Default 16bit pixel depth texture: https://assets.babylonjs.com/environments/correlatedMSBRDF.dds\r\n * * LEGACY Default None correlated https://assets.babylonjs.com/environments/uncorrelatedBRDF_RGBD.png\r\n * * LEGACY Default None correlated 16bit pixel depth https://assets.babylonjs.com/environments/uncorrelatedBRDF.dds\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public environmentBRDFTexture: Nullable<BaseTexture> = null;\r\n\r\n /**\r\n * Force normal to face away from face.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public forceNormalForward = false;\r\n\r\n /**\r\n * Enables specular anti aliasing in the PBR shader.\r\n * It will both interacts on the Geometry for analytical and IBL lighting.\r\n * It also prefilter the roughness map based on the bump values.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public enableSpecularAntiAliasing = false;\r\n\r\n /**\r\n * This parameters will enable/disable Horizon occlusion to prevent normal maps to look shiny when the normal\r\n * makes the reflect vector face the model (under horizon).\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useHorizonOcclusion = true;\r\n\r\n /**\r\n * This parameters will enable/disable radiance occlusion by preventing the radiance to lit\r\n * too much the area relying on ambient texture to define their ambient occlusion.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useRadianceOcclusion = true;\r\n\r\n /**\r\n * If set to true, no lighting calculations will be applied.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsMiscDirty\")\r\n public unlit = false;\r\n\r\n /**\r\n * If sets to true, the decal map will be applied after the detail map. Else, it is applied before (default: false)\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsMiscDirty\")\r\n public applyDecalMapAfterDetailMap = false;\r\n\r\n /**\r\n * Instantiates a new PBRMaterial instance.\r\n *\r\n * @param name The material name\r\n * @param scene The scene the material will be use in.\r\n * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false\r\n */\r\n constructor(name: string, scene?: Scene, forceGLSL = false) {\r\n super(name, scene, forceGLSL);\r\n\r\n this._environmentBRDFTexture = GetEnvironmentBRDFTexture(this.getScene());\r\n }\r\n\r\n /**\r\n * @returns the name of this material class.\r\n */\r\n public override getClassName(): string {\r\n return \"PBRMaterial\";\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current material.\r\n * @param name - name to use for the new material.\r\n * @param cloneTexturesOnlyOnce - if a texture is used in more than one channel (e.g diffuse and opacity), only clone it once and reuse it on the other channels. Default false.\r\n * @param rootUrl defines the root URL to use to load textures\r\n * @returns cloned material instance\r\n */\r\n public override clone(name: string, cloneTexturesOnlyOnce: boolean = true, rootUrl = \"\"): PBRMaterial {\r\n const clone = SerializationHelper.Clone(() => new PBRMaterial(name, this.getScene()), this, { cloneTexturesOnlyOnce });\r\n\r\n clone.id = name;\r\n clone.name = name;\r\n\r\n this.stencil.copyTo(clone.stencil);\r\n\r\n this._clonePlugins(clone, rootUrl);\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Serializes this PBR Material.\r\n * @returns - An object with the serialized material.\r\n */\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.PBRMaterial\";\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Parses a PBR Material from a serialized object.\r\n * @param source - Serialized object.\r\n * @param scene - BJS scene instance.\r\n * @param rootUrl - url for the scene object\r\n * @returns - PBRMaterial\r\n */\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): PBRMaterial {\r\n const material = SerializationHelper.Parse(() => new PBRMaterial(source.name, scene), source, scene, rootUrl);\r\n\r\n if (source.stencil) {\r\n material.stencil.parse(source.stencil, scene, rootUrl);\r\n }\r\n\r\n Material._ParsePlugins(source, material, scene, rootUrl);\r\n\r\n // The code block below ensures backward compatibility with serialized materials before plugins are automatically serialized.\r\n if (source.clearCoat) {\r\n material.clearCoat.parse(source.clearCoat, scene, rootUrl);\r\n }\r\n if (source.anisotropy) {\r\n material.anisotropy.parse(source.anisotropy, scene, rootUrl);\r\n }\r\n if (source.brdf) {\r\n material.brdf.parse(source.brdf, scene, rootUrl);\r\n }\r\n if (source.sheen) {\r\n material.sheen.parse(source.sheen, scene, rootUrl);\r\n }\r\n if (source.subSurface) {\r\n material.subSurface.parse(source.subSurface, scene, rootUrl);\r\n }\r\n if (source.iridescence) {\r\n material.iridescence.parse(source.iridescence, scene, rootUrl);\r\n }\r\n\r\n return material;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for pbrMaterial.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterPbrMaterial(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.PBRMaterial\", PBRMaterial);\r\n}\r\n\r\n/**\r\n * Register side effects for PBRMaterial.\r\n * Safe to call multiple times; only the first call has an effect.\r\n * Alias for {@link RegisterPbrMaterial}.\r\n */\r\nexport function RegisterPBRMaterial(): void {\r\n RegisterPbrMaterial();\r\n}\r\n"]}
|