@babylonjs/core 8.18.0 → 8.19.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/Collisions/intersectionInfo.d.ts +1 -0
- package/Collisions/intersectionInfo.js +1 -0
- package/Collisions/intersectionInfo.js.map +1 -1
- package/Compute/computeShader.d.ts +7 -0
- package/Compute/computeShader.js +15 -0
- package/Compute/computeShader.js.map +1 -1
- package/Engines/Extensions/engine.computeShader.d.ts +2 -1
- package/Engines/Extensions/engine.computeShader.js +1 -0
- package/Engines/Extensions/engine.computeShader.js.map +1 -1
- package/Engines/IDrawContext.d.ts +31 -1
- package/Engines/IDrawContext.js.map +1 -1
- package/Engines/IMaterialContext.d.ts +1 -0
- package/Engines/IMaterialContext.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.d.ts +1 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js +2 -2
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
- package/Engines/WebGPU/webgpuComputeContext.js +15 -0
- package/Engines/WebGPU/webgpuComputeContext.js.map +1 -1
- package/Engines/WebGPU/webgpuDrawContext.d.ts +48 -3
- package/Engines/WebGPU/webgpuDrawContext.js +81 -13
- package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
- package/Engines/WebGPU/webgpuMaterialContext.d.ts +1 -0
- package/Engines/WebGPU/webgpuMaterialContext.js +1 -0
- package/Engines/WebGPU/webgpuMaterialContext.js.map +1 -1
- package/Engines/WebGPU/webgpuStencilStateComposer.js +7 -3
- package/Engines/WebGPU/webgpuStencilStateComposer.js.map +1 -1
- package/Engines/abstractEngine.d.ts +4 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/engine.d.ts +2 -2
- package/Engines/nativeEngine.d.ts +1 -1
- package/Engines/nativeEngine.js +2 -2
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/renderTargetWrapper.d.ts +8 -0
- package/Engines/renderTargetWrapper.js +8 -0
- package/Engines/renderTargetWrapper.js.map +1 -1
- package/Engines/thinEngine.d.ts +2 -3
- package/Engines/thinEngine.js +3 -2
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.d.ts +7 -4
- package/Engines/webgpuEngine.js +28 -15
- package/Engines/webgpuEngine.js.map +1 -1
- package/FrameGraph/Node/Blocks/PostProcesses/basePostProcessBlock.d.ts +1 -1
- package/FrameGraph/Node/Blocks/PostProcesses/basePostProcessBlock.js.map +1 -1
- package/FrameGraph/Passes/renderPass.d.ts +8 -0
- package/FrameGraph/Passes/renderPass.js +10 -1
- package/FrameGraph/Passes/renderPass.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/postProcessTask.d.ts +46 -2
- package/FrameGraph/Tasks/PostProcesses/postProcessTask.js +62 -15
- package/FrameGraph/Tasks/PostProcesses/postProcessTask.js.map +1 -1
- package/FrameGraph/Tasks/Texture/clearTextureTask.d.ts +4 -0
- package/FrameGraph/Tasks/Texture/clearTextureTask.js +5 -1
- package/FrameGraph/Tasks/Texture/clearTextureTask.js.map +1 -1
- package/FrameGraph/frameGraphRenderContext.d.ts +14 -5
- package/FrameGraph/frameGraphRenderContext.js +34 -14
- package/FrameGraph/frameGraphRenderContext.js.map +1 -1
- package/FrameGraph/frameGraphTextureManager.d.ts +3 -1
- package/FrameGraph/frameGraphTextureManager.js +16 -10
- package/FrameGraph/frameGraphTextureManager.js.map +1 -1
- package/Materials/Node/Blocks/PBR/reflectionBlock.d.ts +1 -0
- package/Materials/Node/Blocks/PBR/reflectionBlock.js +4 -1
- package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.js +7 -0
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.d.ts +1 -0
- package/Materials/PBR/pbrBaseMaterial.js +8 -6
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/drawWrapper.d.ts +34 -2
- package/Materials/drawWrapper.js +22 -2
- package/Materials/drawWrapper.js.map +1 -1
- package/Materials/effectRenderer.d.ts +4 -0
- package/Materials/effectRenderer.js +2 -1
- package/Materials/effectRenderer.js.map +1 -1
- package/Materials/index.d.ts +1 -0
- package/Materials/index.js +1 -0
- package/Materials/index.js.map +1 -1
- package/Materials/material.d.ts +8 -1
- package/Materials/material.js +21 -1
- package/Materials/material.js.map +1 -1
- package/Materials/materialHelper.functions.d.ts +3 -1
- package/Materials/materialHelper.functions.js +7 -1
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Materials/shaderMaterial.js +11 -0
- package/Materials/shaderMaterial.js.map +1 -1
- package/Materials/standardMaterial.d.ts +1 -0
- package/Materials/standardMaterial.js +2 -1
- package/Materials/standardMaterial.js.map +1 -1
- package/Materials/uniformBuffer.d.ts +6 -0
- package/Materials/uniformBuffer.js +8 -0
- package/Materials/uniformBuffer.js.map +1 -1
- package/Meshes/abstractMesh.js +3 -2
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/mesh.js +6 -0
- package/Meshes/mesh.js.map +1 -1
- package/Misc/fileTools.js +1 -1
- package/Misc/fileTools.js.map +1 -1
- package/States/index.d.ts +1 -0
- package/States/index.js +1 -0
- package/States/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,11 +4,26 @@ import type { Nullable } from "../types.js";
|
|
|
4
4
|
import type { AbstractEngine } from "../Engines/abstractEngine.js";
|
|
5
5
|
import type { Effect } from "./effect.js";
|
|
6
6
|
import type { MaterialDefines } from "./materialDefines.js";
|
|
7
|
-
/**
|
|
7
|
+
/**
|
|
8
|
+
* Wrapper for an effect and its associated material context and draw context.
|
|
9
|
+
* This class is meant to encapsulate the effect and its related contexts, allowing for easier management of rendering states.
|
|
10
|
+
*/
|
|
8
11
|
export declare class DrawWrapper {
|
|
12
|
+
/**
|
|
13
|
+
* The effect associated with this wrapper.
|
|
14
|
+
*/
|
|
9
15
|
effect: Nullable<Effect>;
|
|
16
|
+
/**
|
|
17
|
+
* The defines associated with this wrapper.
|
|
18
|
+
*/
|
|
10
19
|
defines: Nullable<string | MaterialDefines>;
|
|
20
|
+
/**
|
|
21
|
+
* The material context associated with this wrapper.
|
|
22
|
+
*/
|
|
11
23
|
materialContext?: IMaterialContext;
|
|
24
|
+
/**
|
|
25
|
+
* The draw context associated with this wrapper.
|
|
26
|
+
*/
|
|
12
27
|
drawContext?: IDrawContext;
|
|
13
28
|
/**
|
|
14
29
|
* @internal
|
|
@@ -25,11 +40,28 @@ export declare class DrawWrapper {
|
|
|
25
40
|
* Specifies if the effect was previously using instances
|
|
26
41
|
*/
|
|
27
42
|
_wasPreviouslyUsingInstances: Nullable<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Retrieves the effect from a DrawWrapper or Effect instance.
|
|
45
|
+
* @param effect The effect or DrawWrapper instance to retrieve the effect from.
|
|
46
|
+
* @returns The effect associated with the given instance, or null if not found.
|
|
47
|
+
*/
|
|
28
48
|
static GetEffect(effect: Effect | DrawWrapper): Nullable<Effect>;
|
|
49
|
+
/**
|
|
50
|
+
* Creates a new DrawWrapper instance.
|
|
51
|
+
* Note that drawContext is always created (but may end up being undefined if the engine doesn't need draw contexts), but materialContext is optional.
|
|
52
|
+
* @param engine The engine to create the draw wrapper for.
|
|
53
|
+
* @param createMaterialContext If true, creates a material context for this wrapper (default is true).
|
|
54
|
+
*/
|
|
29
55
|
constructor(engine: AbstractEngine, createMaterialContext?: boolean);
|
|
56
|
+
/**
|
|
57
|
+
* Sets the effect and its associated defines for this wrapper.
|
|
58
|
+
* @param effect The effect to associate with this wrapper.
|
|
59
|
+
* @param defines The defines to associate with this wrapper.
|
|
60
|
+
* @param resetContext If true, resets the draw context (default is true).
|
|
61
|
+
*/
|
|
30
62
|
setEffect(effect: Nullable<Effect>, defines?: Nullable<string | MaterialDefines>, resetContext?: boolean): void;
|
|
31
63
|
/**
|
|
32
|
-
*
|
|
64
|
+
* Disposes the effect wrapper and its resources
|
|
33
65
|
* @param immediate if the effect should be disposed immediately or on the next frame.
|
|
34
66
|
* If dispose() is not called during a scene or engine dispose, we want to delay the dispose of the underlying effect. Mostly to give a chance to user code to reuse the effect in some way.
|
|
35
67
|
*/
|
package/Materials/drawWrapper.js
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
import { TimingTools } from "../Misc/timingTools.js";
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Wrapper for an effect and its associated material context and draw context.
|
|
4
|
+
* This class is meant to encapsulate the effect and its related contexts, allowing for easier management of rendering states.
|
|
5
|
+
*/
|
|
3
6
|
export class DrawWrapper {
|
|
7
|
+
/**
|
|
8
|
+
* Retrieves the effect from a DrawWrapper or Effect instance.
|
|
9
|
+
* @param effect The effect or DrawWrapper instance to retrieve the effect from.
|
|
10
|
+
* @returns The effect associated with the given instance, or null if not found.
|
|
11
|
+
*/
|
|
4
12
|
static GetEffect(effect) {
|
|
5
13
|
return effect.getPipelineContext === undefined ? effect.effect : effect;
|
|
6
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Creates a new DrawWrapper instance.
|
|
17
|
+
* Note that drawContext is always created (but may end up being undefined if the engine doesn't need draw contexts), but materialContext is optional.
|
|
18
|
+
* @param engine The engine to create the draw wrapper for.
|
|
19
|
+
* @param createMaterialContext If true, creates a material context for this wrapper (default is true).
|
|
20
|
+
*/
|
|
7
21
|
constructor(engine, createMaterialContext = true) {
|
|
8
22
|
/**
|
|
9
23
|
* @internal
|
|
@@ -27,6 +41,12 @@ export class DrawWrapper {
|
|
|
27
41
|
this.materialContext = engine.createMaterialContext();
|
|
28
42
|
}
|
|
29
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Sets the effect and its associated defines for this wrapper.
|
|
46
|
+
* @param effect The effect to associate with this wrapper.
|
|
47
|
+
* @param defines The defines to associate with this wrapper.
|
|
48
|
+
* @param resetContext If true, resets the draw context (default is true).
|
|
49
|
+
*/
|
|
30
50
|
setEffect(effect, defines, resetContext = true) {
|
|
31
51
|
this.effect = effect;
|
|
32
52
|
if (defines !== undefined) {
|
|
@@ -37,7 +57,7 @@ export class DrawWrapper {
|
|
|
37
57
|
}
|
|
38
58
|
}
|
|
39
59
|
/**
|
|
40
|
-
*
|
|
60
|
+
* Disposes the effect wrapper and its resources
|
|
41
61
|
* @param immediate if the effect should be disposed immediately or on the next frame.
|
|
42
62
|
* If dispose() is not called during a scene or engine dispose, we want to delay the dispose of the underlying effect. Mostly to give a chance to user code to reuse the effect in some way.
|
|
43
63
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drawWrapper.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/drawWrapper.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,+BAA8B;AAEpD
|
|
1
|
+
{"version":3,"file":"drawWrapper.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/drawWrapper.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,+BAA8B;AAEpD;;;GAGG;AACH,MAAM,OAAO,WAAW;IAoCpB;;;;OAIG;IACI,MAAM,CAAC,SAAS,CAAC,MAA4B;QAChD,OAAQ,MAAiB,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAE,MAAsB,CAAC,MAAM,CAAC,CAAC,CAAE,MAAiB,CAAC;IACrH,CAAC;IAED;;;;;OAKG;IACH,YAAY,MAAsB,EAAE,qBAAqB,GAAG,IAAI;QAjChE;;;WAGG;QACI,wBAAmB,GAAG,KAAK,CAAC;QAEnC;;;WAGG;QACI,2BAAsB,GAAG,IAAI,CAAC;QAErC;;;WAGG;QACI,iCAA4B,GAAsB,IAAI,CAAC;QAkB1D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC9C,IAAI,qBAAqB,EAAE,CAAC;YACxB,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;QAC1D,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACI,SAAS,CAAC,MAAwB,EAAE,OAA4C,EAAE,YAAY,GAAG,IAAI;QACxG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAC3B,CAAC;QACD,IAAI,YAAY,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;QAC9B,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,OAAO,CAAC,SAAS,GAAG,KAAK;QAC5B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,IAAI,SAAS,EAAE,CAAC;gBACZ,MAAM,CAAC,OAAO,EAAE,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACJ,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE;oBAC1B,MAAM,CAAC,SAAS,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE;wBACjD,MAAM,CAAC,OAAO,EAAE,CAAC;oBACrB,CAAC,CAAC,CAAC;gBACP,CAAC,CAAC,CAAC;YACP,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;IAChC,CAAC;CACJ","sourcesContent":["import type { IDrawContext } from \"../Engines/IDrawContext\";\r\nimport type { IMaterialContext } from \"../Engines/IMaterialContext\";\r\nimport type { Nullable } from \"../types\";\r\n\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport type { Effect } from \"./effect\";\r\nimport type { MaterialDefines } from \"./materialDefines\";\r\nimport { TimingTools } from \"core/Misc/timingTools\";\r\n\r\n/**\r\n * Wrapper for an effect and its associated material context and draw context.\r\n * This class is meant to encapsulate the effect and its related contexts, allowing for easier management of rendering states.\r\n */\r\nexport class DrawWrapper {\r\n /**\r\n * The effect associated with this wrapper.\r\n */\r\n public effect: Nullable<Effect>;\r\n /**\r\n * The defines associated with this wrapper.\r\n */\r\n public defines: Nullable<string | MaterialDefines>;\r\n /**\r\n * The material context associated with this wrapper.\r\n */\r\n public materialContext?: IMaterialContext;\r\n /**\r\n * The draw context associated with this wrapper.\r\n */\r\n public drawContext?: IDrawContext;\r\n\r\n /**\r\n * @internal\r\n * Specifies if the effect was previously ready\r\n */\r\n public _wasPreviouslyReady = false;\r\n\r\n /**\r\n * @internal\r\n * Forces the code from bindForSubMesh to be fully run the next time it is called\r\n */\r\n public _forceRebindOnNextCall = true;\r\n\r\n /**\r\n * @internal\r\n * Specifies if the effect was previously using instances\r\n */\r\n public _wasPreviouslyUsingInstances: Nullable<boolean> = null;\r\n\r\n /**\r\n * Retrieves the effect from a DrawWrapper or Effect instance.\r\n * @param effect The effect or DrawWrapper instance to retrieve the effect from.\r\n * @returns The effect associated with the given instance, or null if not found.\r\n */\r\n public static GetEffect(effect: Effect | DrawWrapper): Nullable<Effect> {\r\n return (effect as Effect).getPipelineContext === undefined ? (effect as DrawWrapper).effect : (effect as Effect);\r\n }\r\n\r\n /**\r\n * Creates a new DrawWrapper instance.\r\n * Note that drawContext is always created (but may end up being undefined if the engine doesn't need draw contexts), but materialContext is optional.\r\n * @param engine The engine to create the draw wrapper for.\r\n * @param createMaterialContext If true, creates a material context for this wrapper (default is true).\r\n */\r\n constructor(engine: AbstractEngine, createMaterialContext = true) {\r\n this.effect = null;\r\n this.defines = null;\r\n this.drawContext = engine.createDrawContext();\r\n if (createMaterialContext) {\r\n this.materialContext = engine.createMaterialContext();\r\n }\r\n }\r\n\r\n /**\r\n * Sets the effect and its associated defines for this wrapper.\r\n * @param effect The effect to associate with this wrapper.\r\n * @param defines The defines to associate with this wrapper.\r\n * @param resetContext If true, resets the draw context (default is true).\r\n */\r\n public setEffect(effect: Nullable<Effect>, defines?: Nullable<string | MaterialDefines>, resetContext = true): void {\r\n this.effect = effect;\r\n if (defines !== undefined) {\r\n this.defines = defines;\r\n }\r\n if (resetContext) {\r\n this.drawContext?.reset();\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the effect wrapper and its resources\r\n * @param immediate if the effect should be disposed immediately or on the next frame.\r\n * If dispose() is not called during a scene or engine dispose, we want to delay the dispose of the underlying effect. Mostly to give a chance to user code to reuse the effect in some way.\r\n */\r\n public dispose(immediate = false): void {\r\n if (this.effect) {\r\n const effect = this.effect;\r\n if (immediate) {\r\n effect.dispose();\r\n } else {\r\n TimingTools.SetImmediate(() => {\r\n effect.getEngine().onEndFrameObservable.addOnce(() => {\r\n effect.dispose();\r\n });\r\n });\r\n }\r\n this.effect = null;\r\n }\r\n this.drawContext?.dispose();\r\n }\r\n}\r\n"]}
|
|
@@ -190,6 +190,10 @@ export interface EffectWrapperCreationOptions {
|
|
|
190
190
|
* If the effect should be used as a post process (default: false). If true, the effect will be created with a "scale" uniform and a "textureSampler" sampler
|
|
191
191
|
*/
|
|
192
192
|
useAsPostProcess?: boolean;
|
|
193
|
+
/**
|
|
194
|
+
* Sets this property to true if the fragment shader doesn't use a textureSampler texture (default: false).
|
|
195
|
+
*/
|
|
196
|
+
allowEmptySourceTexture?: boolean;
|
|
193
197
|
}
|
|
194
198
|
/**
|
|
195
199
|
* Wraps an effect to be used for rendering
|
|
@@ -228,12 +228,13 @@ export class EffectWrapper {
|
|
|
228
228
|
extraInitializations: creationOptions.extraInitializations || undefined,
|
|
229
229
|
extraInitializationsAsync: creationOptions.extraInitializationsAsync || undefined,
|
|
230
230
|
useAsPostProcess: creationOptions.useAsPostProcess ?? false,
|
|
231
|
+
allowEmptySourceTexture: creationOptions.allowEmptySourceTexture ?? false,
|
|
231
232
|
};
|
|
232
233
|
this.options.uniformNames = this.options.uniforms;
|
|
233
234
|
this.options.samplerNames = this.options.samplers;
|
|
234
235
|
this.options.vertexShader = this.options.vertexUrl;
|
|
235
236
|
if (this.options.useAsPostProcess) {
|
|
236
|
-
if (this.options.samplers.indexOf("textureSampler") === -1) {
|
|
237
|
+
if (!this.options.allowEmptySourceTexture && this.options.samplers.indexOf("textureSampler") === -1) {
|
|
237
238
|
this.options.samplers.push("textureSampler");
|
|
238
239
|
}
|
|
239
240
|
if (this.options.uniforms.indexOf("scale") === -1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effectRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/effectRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NonNullableFields, Nullable } from \"../types\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Viewport } from \"../Maths/math.viewport\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { IShaderPath } from \"./effect\";\r\nimport { Effect } from \"./effect\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { DrawWrapper } from \"./drawWrapper\";\r\nimport type { IRenderTargetTexture, RenderTargetWrapper } from \"../Engines/renderTargetWrapper\";\r\nimport { ShaderLanguage } from \"./shaderLanguage\";\r\n\r\n// Prevents ES6 issue if not imported.\r\nimport \"../Shaders/postprocess.vertex\";\r\n\r\n/**\r\n * Effect Render Options\r\n */\r\nexport interface IEffectRendererOptions {\r\n /**\r\n * Defines the vertices positions.\r\n */\r\n positions?: number[];\r\n /**\r\n * Defines the indices.\r\n */\r\n indices?: number[];\r\n}\r\n\r\n// Fullscreen quad buffers by default.\r\nconst DefaultOptions = {\r\n positions: [1, 1, -1, 1, -1, -1, 1, -1],\r\n indices: [0, 1, 2, 0, 2, 3],\r\n};\r\n\r\n/**\r\n * Helper class to render one or more effects.\r\n * You can access the previous rendering in your shader by declaring a sampler named textureSampler\r\n */\r\nexport class EffectRenderer {\r\n /**\r\n * The engine the effect renderer has been created for.\r\n */\r\n public readonly engine: AbstractEngine;\r\n\r\n private _vertexBuffers: { [key: string]: VertexBuffer };\r\n private _indexBuffer: DataBuffer;\r\n private _indexBufferLength: number;\r\n\r\n private _fullscreenViewport = new Viewport(0, 0, 1, 1);\r\n private _onContextRestoredObserver: Nullable<Observer<AbstractEngine>>;\r\n\r\n private _savedStateDepthTest: boolean;\r\n private _savedStateStencilTest: boolean;\r\n\r\n /**\r\n * Creates an effect renderer\r\n * @param engine the engine to use for rendering\r\n * @param options defines the options of the effect renderer\r\n */\r\n constructor(engine: AbstractEngine, options: IEffectRendererOptions = DefaultOptions) {\r\n const positions = options.positions ?? DefaultOptions.positions;\r\n const indices = options.indices ?? DefaultOptions.indices;\r\n\r\n this.engine = engine;\r\n this._vertexBuffers = {\r\n // Note, always assumes stride of 2.\r\n [VertexBuffer.PositionKind]: new VertexBuffer(engine, positions, VertexBuffer.PositionKind, false, false, 2),\r\n };\r\n this._indexBuffer = engine.createIndexBuffer(indices);\r\n this._indexBufferLength = indices.length;\r\n\r\n this._onContextRestoredObserver = engine.onContextRestoredObservable.add(() => {\r\n this._indexBuffer = engine.createIndexBuffer(indices);\r\n\r\n for (const key in this._vertexBuffers) {\r\n const vertexBuffer = this._vertexBuffers[key];\r\n vertexBuffer._rebuild();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the current viewport in normalized coordinates 0-1\r\n * @param viewport Defines the viewport to set (defaults to 0 0 1 1)\r\n */\r\n public setViewport(viewport = this._fullscreenViewport): void {\r\n this.engine.setViewport(viewport);\r\n }\r\n\r\n /**\r\n * Binds the embedded attributes buffer to the effect.\r\n * @param effect Defines the effect to bind the attributes for\r\n */\r\n public bindBuffers(effect: Effect): void {\r\n this.engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n }\r\n\r\n /**\r\n * Sets the current effect wrapper to use during draw.\r\n * The effect needs to be ready before calling this api.\r\n * This also sets the default full screen position attribute.\r\n * @param effectWrapper Defines the effect to draw with\r\n */\r\n public applyEffectWrapper(effectWrapper: EffectWrapper): void {\r\n this.engine.setState(true);\r\n this.engine.depthCullingState.depthTest = false;\r\n this.engine.stencilState.stencilTest = false;\r\n this.engine.enableEffect(effectWrapper.drawWrapper);\r\n this.bindBuffers(effectWrapper.effect);\r\n effectWrapper.onApplyObservable.notifyObservers({});\r\n }\r\n\r\n /**\r\n * Saves engine states\r\n */\r\n public saveStates(): void {\r\n this._savedStateDepthTest = this.engine.depthCullingState.depthTest;\r\n this._savedStateStencilTest = this.engine.stencilState.stencilTest;\r\n }\r\n\r\n /**\r\n * Restores engine states\r\n */\r\n public restoreStates(): void {\r\n this.engine.depthCullingState.depthTest = this._savedStateDepthTest;\r\n this.engine.stencilState.stencilTest = this._savedStateStencilTest;\r\n }\r\n\r\n /**\r\n * Draws a full screen quad.\r\n */\r\n public draw(): void {\r\n this.engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, this._indexBufferLength);\r\n }\r\n\r\n private _isRenderTargetTexture(texture: RenderTargetWrapper | IRenderTargetTexture): texture is IRenderTargetTexture {\r\n return (texture as IRenderTargetTexture).renderTarget !== undefined;\r\n }\r\n\r\n /**\r\n * renders one or more effects to a specified texture\r\n * @param effectWrapper the effect to renderer\r\n * @param outputTexture texture to draw to, if null it will render to the currently bound frame buffer\r\n */\r\n public render(effectWrapper: EffectWrapper, outputTexture: Nullable<RenderTargetWrapper | IRenderTargetTexture> = null) {\r\n // Ensure effect is ready\r\n if (!effectWrapper.effect.isReady()) {\r\n return;\r\n }\r\n\r\n this.saveStates();\r\n\r\n // Reset state\r\n this.setViewport();\r\n\r\n const out = outputTexture === null ? null : this._isRenderTargetTexture(outputTexture) ? outputTexture.renderTarget! : outputTexture;\r\n\r\n if (out) {\r\n this.engine.bindFramebuffer(out);\r\n }\r\n\r\n this.applyEffectWrapper(effectWrapper);\r\n\r\n this.draw();\r\n\r\n if (out) {\r\n this.engine.unBindFramebuffer(out);\r\n }\r\n\r\n this.restoreStates();\r\n }\r\n\r\n /**\r\n * Disposes of the effect renderer\r\n */\r\n dispose() {\r\n const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vertexBuffer) {\r\n vertexBuffer.dispose();\r\n delete this._vertexBuffers[VertexBuffer.PositionKind];\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this.engine._releaseBuffer(this._indexBuffer);\r\n }\r\n\r\n if (this._onContextRestoredObserver) {\r\n this.engine.onContextRestoredObservable.remove(this._onContextRestoredObserver);\r\n this._onContextRestoredObserver = null;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Allows for custom processing of the shader code used by an effect wrapper\r\n */\r\nexport type EffectWrapperCustomShaderCodeProcessing = {\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated after the #include have been processed\r\n */\r\n processCodeAfterIncludes?: (postProcessName: string, shaderType: string, code: string) => string;\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: (postProcessName: string, shaderType: string, code: string) => string;\r\n /**\r\n * If provided, will be called before creating the effect to collect additional custom bindings (defines, uniforms, samplers)\r\n */\r\n defineCustomBindings?: (postProcessName: string, defines: Nullable<string>, uniforms: string[], samplers: string[]) => Nullable<string>;\r\n /**\r\n * If provided, will be called when binding inputs to the shader code to allow the user to add custom bindings\r\n */\r\n bindCustomBindings?: (postProcessName: string, effect: Effect) => void;\r\n};\r\n\r\n/**\r\n * Options to create an EffectWrapper\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface EffectWrapperCreationOptions {\r\n /**\r\n * Engine to use to create the effect\r\n */\r\n engine?: AbstractEngine;\r\n /**\r\n * Fragment shader for the effect\r\n */\r\n fragmentShader?: string;\r\n /**\r\n * Use the shader store instead of direct source code\r\n */\r\n useShaderStore?: boolean;\r\n /**\r\n * Vertex shader for the effect (default: \"postprocess\")\r\n */\r\n vertexShader?: string;\r\n /**\r\n * Alias for vertexShader\r\n */\r\n vertexUrl?: string;\r\n /**\r\n * Attributes to use in the shader (default: [\"position\"])\r\n */\r\n attributeNames?: Array<string>;\r\n /**\r\n * Uniforms to use in the shader\r\n */\r\n uniformNames?: Array<string>;\r\n /**\r\n * Alias for uniformNames. Note that if it is provided, it takes precedence over uniformNames.\r\n */\r\n uniforms?: Nullable<string[]>;\r\n /**\r\n * Texture sampler names to use in the shader\r\n */\r\n samplerNames?: Array<string>;\r\n /**\r\n * Alias for samplerNames. Note that if it is provided, it takes precedence over samplerNames.\r\n */\r\n samplers?: Nullable<string[]>;\r\n /**\r\n * The list of uniform buffers used in the shader (if any)\r\n */\r\n uniformBuffers?: Nullable<string[]>;\r\n /**\r\n * Defines to use in the shader\r\n */\r\n defines?: Nullable<string | Array<string>>;\r\n /**\r\n * The index parameters to be used for babylons include syntax \"#include<kernelBlurVaryingDeclaration>[0..varyingCount]\". (default: undefined)\r\n * See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx\r\n */\r\n indexParameters?: any;\r\n /**\r\n * If the shader should not be compiled immediately. (default: false)\r\n */\r\n blockCompilation?: boolean;\r\n /**\r\n * Callback when effect is compiled\r\n */\r\n onCompiled?: Nullable<(effect: Effect) => void>;\r\n /**\r\n * The friendly name of the effect (default: \"effectWrapper\")\r\n */\r\n name?: string;\r\n /**\r\n * The language the shader is written in (default: GLSL)\r\n */\r\n shaderLanguage?: ShaderLanguage;\r\n /**\r\n * Defines additional code to call to prepare the shader code\r\n */\r\n extraInitializations?: (useWebGPU: boolean, list: Promise<any>[]) => void;\r\n /**\r\n * Additional async code to run before preparing the effect\r\n */\r\n extraInitializationsAsync?: () => Promise<void>;\r\n /**\r\n * If the effect should be used as a post process (default: false). If true, the effect will be created with a \"scale\" uniform and a \"textureSampler\" sampler\r\n */\r\n useAsPostProcess?: boolean;\r\n}\r\n\r\n/**\r\n * Wraps an effect to be used for rendering\r\n */\r\nexport class EffectWrapper {\r\n /**\r\n * Force code to compile to glsl even on WebGPU engines.\r\n * False by default. This is mostly meant for backward compatibility.\r\n */\r\n public static ForceGLSL = false;\r\n\r\n private static _CustomShaderCodeProcessing: { [effectWrapperName: string]: EffectWrapperCustomShaderCodeProcessing } = {};\r\n\r\n /**\r\n * Registers a shader code processing with an effect wrapper name.\r\n * @param effectWrapperName name of the effect wrapper. Use null for the fallback shader code processing. This is the shader code processing that will be used in case no specific shader code processing has been associated to an effect wrapper name\r\n * @param customShaderCodeProcessing shader code processing to associate to the effect wrapper name\r\n */\r\n public static RegisterShaderCodeProcessing(effectWrapperName: Nullable<string>, customShaderCodeProcessing?: EffectWrapperCustomShaderCodeProcessing) {\r\n if (!customShaderCodeProcessing) {\r\n delete EffectWrapper._CustomShaderCodeProcessing[effectWrapperName ?? \"\"];\r\n return;\r\n }\r\n\r\n EffectWrapper._CustomShaderCodeProcessing[effectWrapperName ?? \"\"] = customShaderCodeProcessing;\r\n }\r\n\r\n private static _GetShaderCodeProcessing(effectWrapperName: string) {\r\n return EffectWrapper._CustomShaderCodeProcessing[effectWrapperName] ?? EffectWrapper._CustomShaderCodeProcessing[\"\"];\r\n }\r\n\r\n /**\r\n * Gets or sets the name of the effect wrapper\r\n */\r\n public get name() {\r\n return this.options.name;\r\n }\r\n\r\n public set name(value: string) {\r\n this.options.name = value;\r\n }\r\n\r\n /**\r\n * Type of alpha mode to use when applying the effect (default: Engine.ALPHA_DISABLE). Used only if useAsPostProcess is true.\r\n */\r\n public alphaMode = Constants.ALPHA_DISABLE;\r\n\r\n /**\r\n * Executed when the effect is created\r\n * @returns effect that was created for this effect wrapper\r\n */\r\n public onEffectCreatedObservable = new Observable<Effect>(undefined, true);\r\n\r\n /**\r\n * Options used to create the effect wrapper\r\n */\r\n public readonly options: Required<NonNullableFields<EffectWrapperCreationOptions>>;\r\n\r\n /**\r\n * Get a value indicating if the effect is ready to be used\r\n * @returns true if the post-process is ready (shader is compiled)\r\n */\r\n public isReady() {\r\n return this._drawWrapper.effect?.isReady() ?? false;\r\n }\r\n\r\n /**\r\n * Get the draw wrapper associated with the effect wrapper\r\n * @returns the draw wrapper associated with the effect wrapper\r\n */\r\n public get drawWrapper() {\r\n return this._drawWrapper;\r\n }\r\n\r\n /**\r\n * Event that is fired (only when the EffectWrapper is used with an EffectRenderer) right before the effect is drawn (should be used to update uniforms)\r\n */\r\n public onApplyObservable = new Observable<{}>();\r\n\r\n /**\r\n * The underlying effect\r\n */\r\n public get effect(): Effect {\r\n return this._drawWrapper.effect!;\r\n }\r\n\r\n public set effect(effect: Effect) {\r\n this._drawWrapper.effect = effect;\r\n }\r\n\r\n protected readonly _drawWrapper: DrawWrapper;\r\n protected _shadersLoaded = false;\r\n protected readonly _shaderPath: IShaderPath;\r\n /** @internal */\r\n public _webGPUReady = false;\r\n\r\n private _onContextRestoredObserver: Nullable<Observer<AbstractEngine>>;\r\n\r\n /**\r\n * Creates an effect to be rendered\r\n * @param creationOptions options to create the effect\r\n */\r\n constructor(creationOptions: EffectWrapperCreationOptions) {\r\n this.options = {\r\n ...creationOptions,\r\n name: creationOptions.name || \"effectWrapper\",\r\n engine: creationOptions.engine!,\r\n uniforms: creationOptions.uniforms || creationOptions.uniformNames || [],\r\n uniformNames: undefined as any,\r\n samplers: creationOptions.samplers || creationOptions.samplerNames || [],\r\n samplerNames: undefined as any,\r\n attributeNames: creationOptions.attributeNames || [\"position\"],\r\n uniformBuffers: creationOptions.uniformBuffers || [],\r\n defines: creationOptions.defines || \"\",\r\n useShaderStore: creationOptions.useShaderStore || false,\r\n vertexUrl: creationOptions.vertexUrl || creationOptions.vertexShader || \"postprocess\",\r\n vertexShader: undefined as any,\r\n fragmentShader: creationOptions.fragmentShader || \"pass\",\r\n indexParameters: creationOptions.indexParameters,\r\n blockCompilation: creationOptions.blockCompilation || false,\r\n shaderLanguage: creationOptions.shaderLanguage || ShaderLanguage.GLSL,\r\n onCompiled: creationOptions.onCompiled || (undefined as any),\r\n extraInitializations: creationOptions.extraInitializations || (undefined as any),\r\n extraInitializationsAsync: creationOptions.extraInitializationsAsync || (undefined as any),\r\n useAsPostProcess: creationOptions.useAsPostProcess ?? false,\r\n };\r\n\r\n this.options.uniformNames = this.options.uniforms;\r\n this.options.samplerNames = this.options.samplers;\r\n this.options.vertexShader = this.options.vertexUrl;\r\n\r\n if (this.options.useAsPostProcess) {\r\n if (this.options.samplers.indexOf(\"textureSampler\") === -1) {\r\n this.options.samplers.push(\"textureSampler\");\r\n }\r\n if (this.options.uniforms.indexOf(\"scale\") === -1) {\r\n this.options.uniforms.push(\"scale\");\r\n }\r\n }\r\n\r\n if (creationOptions.vertexUrl || creationOptions.vertexShader) {\r\n this._shaderPath = {\r\n vertexSource: this.options.vertexShader,\r\n };\r\n } else {\r\n if (!this.options.useAsPostProcess) {\r\n this.options.uniforms.push(\"scale\");\r\n\r\n this.onApplyObservable.add(() => {\r\n this.effect.setFloat2(\"scale\", 1, 1);\r\n });\r\n }\r\n\r\n this._shaderPath = {\r\n vertex: this.options.vertexShader,\r\n };\r\n }\r\n\r\n this._shaderPath.fragmentSource = this.options.fragmentShader;\r\n this._shaderPath.spectorName = this.options.name;\r\n\r\n if (this.options.useShaderStore) {\r\n this._shaderPath.fragment = this._shaderPath.fragmentSource;\r\n if (!this._shaderPath.vertex) {\r\n this._shaderPath.vertex = this._shaderPath.vertexSource;\r\n }\r\n\r\n delete this._shaderPath.fragmentSource;\r\n delete this._shaderPath.vertexSource;\r\n }\r\n\r\n this.onApplyObservable.add(() => {\r\n this.bind();\r\n });\r\n\r\n if (!this.options.useShaderStore) {\r\n this._onContextRestoredObserver = this.options.engine.onContextRestoredObservable.add(() => {\r\n this.effect._pipelineContext = null; // because _prepareEffect will try to dispose this pipeline before recreating it and that would lead to webgl errors\r\n this.effect._prepareEffect();\r\n });\r\n }\r\n\r\n this._drawWrapper = new DrawWrapper(this.options.engine);\r\n this._webGPUReady = this.options.shaderLanguage === ShaderLanguage.WGSL;\r\n\r\n const defines = Array.isArray(this.options.defines) ? this.options.defines.join(\"\\n\") : this.options.defines;\r\n\r\n this._postConstructor(this.options.blockCompilation, defines, this.options.extraInitializations);\r\n }\r\n\r\n protected _gatherImports(useWebGPU = false, list: Promise<any>[]) {\r\n if (!this.options.useAsPostProcess) {\r\n return;\r\n }\r\n\r\n // this._webGPUReady is used to detect when an effect wrapper is intended to be used with WebGPU\r\n if (useWebGPU && this._webGPUReady) {\r\n list.push(Promise.all([import(\"../ShadersWGSL/postprocess.vertex\")]));\r\n } else {\r\n list.push(Promise.all([import(\"../Shaders/postprocess.vertex\")]));\r\n }\r\n }\r\n\r\n private _importPromises: Array<Promise<any>> = [];\r\n\r\n /** @internal */\r\n public _postConstructor(\r\n blockCompilation: boolean,\r\n defines: Nullable<string> = null,\r\n extraInitializations?: (useWebGPU: boolean, list: Promise<any>[]) => void,\r\n importPromises?: Array<Promise<any>>\r\n ) {\r\n this._importPromises.length = 0;\r\n\r\n if (importPromises) {\r\n this._importPromises.push(...importPromises);\r\n }\r\n\r\n const useWebGPU = this.options.engine.isWebGPU && !EffectWrapper.ForceGLSL;\r\n\r\n this._gatherImports(useWebGPU, this._importPromises);\r\n if (extraInitializations !== undefined) {\r\n extraInitializations(useWebGPU, this._importPromises);\r\n }\r\n\r\n if (useWebGPU && this._webGPUReady) {\r\n this.options.shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n if (!blockCompilation) {\r\n this.updateEffect(defines);\r\n }\r\n }\r\n\r\n /**\r\n * Updates the effect with the current effect wrapper compile time values and recompiles the shader.\r\n * @param defines Define statements that should be added at the beginning of the shader. (default: null)\r\n * @param uniforms Set of uniform variables that will be passed to the shader. (default: null)\r\n * @param samplers Set of Texture2D variables that will be passed to the shader. (default: null)\r\n * @param indexParameters The index parameters to be used for babylons include syntax \"#include<kernelBlurVaryingDeclaration>[0..varyingCount]\". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx\r\n * @param onCompiled Called when the shader has been compiled.\r\n * @param onError Called if there is an error when compiling a shader.\r\n * @param vertexUrl The url of the vertex shader to be used (default: the one given at construction time)\r\n * @param fragmentUrl The url of the fragment shader to be used (default: the one given at construction time)\r\n */\r\n public updateEffect(\r\n defines: Nullable<string> = null,\r\n uniforms: Nullable<string[]> = null,\r\n samplers: Nullable<string[]> = null,\r\n indexParameters?: any,\r\n onCompiled?: (effect: Effect) => void,\r\n onError?: (effect: Effect, errors: string) => void,\r\n vertexUrl?: string,\r\n fragmentUrl?: string\r\n ) {\r\n const customShaderCodeProcessing = EffectWrapper._GetShaderCodeProcessing(this.name);\r\n if (customShaderCodeProcessing?.defineCustomBindings) {\r\n const newUniforms = uniforms?.slice() ?? [];\r\n newUniforms.push(...this.options.uniforms);\r\n\r\n const newSamplers = samplers?.slice() ?? [];\r\n newSamplers.push(...this.options.samplers);\r\n\r\n defines = customShaderCodeProcessing.defineCustomBindings(this.name, defines, newUniforms, newSamplers);\r\n uniforms = newUniforms;\r\n samplers = newSamplers;\r\n }\r\n\r\n this.options.defines = defines || \"\";\r\n\r\n const waitImportsLoaded =\r\n this._shadersLoaded || this._importPromises.length === 0\r\n ? undefined\r\n : async () => {\r\n await Promise.all(this._importPromises);\r\n this._shadersLoaded = true;\r\n };\r\n\r\n let extraInitializationsAsync: (() => Promise<void>) | undefined;\r\n if (this.options.extraInitializationsAsync) {\r\n extraInitializationsAsync = async () => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n waitImportsLoaded?.();\r\n await this.options.extraInitializationsAsync();\r\n };\r\n } else {\r\n extraInitializationsAsync = waitImportsLoaded;\r\n }\r\n\r\n if (this.options.useShaderStore) {\r\n this._drawWrapper.effect = this.options.engine.createEffect(\r\n { vertex: vertexUrl ?? this._shaderPath.vertex, fragment: fragmentUrl ?? this._shaderPath.fragment },\r\n {\r\n attributes: this.options.attributeNames,\r\n uniformsNames: uniforms || this.options.uniforms,\r\n uniformBuffersNames: this.options.uniformBuffers,\r\n samplers: samplers || this.options.samplers,\r\n defines: defines !== null ? defines : \"\",\r\n fallbacks: null,\r\n onCompiled: onCompiled ?? this.options.onCompiled,\r\n onError: onError ?? null,\r\n indexParameters: indexParameters || this.options.indexParameters,\r\n processCodeAfterIncludes: customShaderCodeProcessing?.processCodeAfterIncludes\r\n ? (shaderType: string, code: string) => customShaderCodeProcessing.processCodeAfterIncludes!(this.name, shaderType, code)\r\n : null,\r\n processFinalCode: customShaderCodeProcessing?.processFinalCode\r\n ? (shaderType: string, code: string) => customShaderCodeProcessing.processFinalCode!(this.name, shaderType, code)\r\n : null,\r\n shaderLanguage: this.options.shaderLanguage,\r\n extraInitializationsAsync,\r\n },\r\n this.options.engine\r\n );\r\n } else {\r\n this._drawWrapper.effect = new Effect(\r\n this._shaderPath,\r\n this.options.attributeNames,\r\n uniforms || this.options.uniforms,\r\n samplers || this.options.samplerNames,\r\n this.options.engine,\r\n defines,\r\n undefined,\r\n onCompiled || this.options.onCompiled,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this.options.shaderLanguage,\r\n extraInitializationsAsync\r\n );\r\n }\r\n\r\n this.onEffectCreatedObservable.notifyObservers(this._drawWrapper.effect);\r\n }\r\n\r\n /**\r\n * Binds the data to the effect.\r\n * @param noDefaultBindings if true, the default bindings (scale and alpha mode) will not be set.\r\n */\r\n public bind(noDefaultBindings = false) {\r\n if (this.options.useAsPostProcess && !noDefaultBindings) {\r\n this.options.engine.setAlphaMode(this.alphaMode);\r\n this.drawWrapper.effect!.setFloat2(\"scale\", 1, 1);\r\n }\r\n\r\n EffectWrapper._GetShaderCodeProcessing(this.name)?.bindCustomBindings?.(this.name, this._drawWrapper.effect!);\r\n }\r\n\r\n /**\r\n * Disposes of the effect wrapper\r\n * @param _ignored kept for backward compatibility\r\n */\r\n public dispose(_ignored: boolean = false) {\r\n if (this._onContextRestoredObserver) {\r\n this.effect.getEngine().onContextRestoredObservable.remove(this._onContextRestoredObserver);\r\n this._onContextRestoredObserver = null;\r\n }\r\n this.onEffectCreatedObservable.clear();\r\n this._drawWrapper.dispose(true);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"effectRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/effectRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NonNullableFields, Nullable } from \"../types\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Viewport } from \"../Maths/math.viewport\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { IShaderPath } from \"./effect\";\r\nimport { Effect } from \"./effect\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { DrawWrapper } from \"./drawWrapper\";\r\nimport type { IRenderTargetTexture, RenderTargetWrapper } from \"../Engines/renderTargetWrapper\";\r\nimport { ShaderLanguage } from \"./shaderLanguage\";\r\n\r\n// Prevents ES6 issue if not imported.\r\nimport \"../Shaders/postprocess.vertex\";\r\n\r\n/**\r\n * Effect Render Options\r\n */\r\nexport interface IEffectRendererOptions {\r\n /**\r\n * Defines the vertices positions.\r\n */\r\n positions?: number[];\r\n /**\r\n * Defines the indices.\r\n */\r\n indices?: number[];\r\n}\r\n\r\n// Fullscreen quad buffers by default.\r\nconst DefaultOptions = {\r\n positions: [1, 1, -1, 1, -1, -1, 1, -1],\r\n indices: [0, 1, 2, 0, 2, 3],\r\n};\r\n\r\n/**\r\n * Helper class to render one or more effects.\r\n * You can access the previous rendering in your shader by declaring a sampler named textureSampler\r\n */\r\nexport class EffectRenderer {\r\n /**\r\n * The engine the effect renderer has been created for.\r\n */\r\n public readonly engine: AbstractEngine;\r\n\r\n private _vertexBuffers: { [key: string]: VertexBuffer };\r\n private _indexBuffer: DataBuffer;\r\n private _indexBufferLength: number;\r\n\r\n private _fullscreenViewport = new Viewport(0, 0, 1, 1);\r\n private _onContextRestoredObserver: Nullable<Observer<AbstractEngine>>;\r\n\r\n private _savedStateDepthTest: boolean;\r\n private _savedStateStencilTest: boolean;\r\n\r\n /**\r\n * Creates an effect renderer\r\n * @param engine the engine to use for rendering\r\n * @param options defines the options of the effect renderer\r\n */\r\n constructor(engine: AbstractEngine, options: IEffectRendererOptions = DefaultOptions) {\r\n const positions = options.positions ?? DefaultOptions.positions;\r\n const indices = options.indices ?? DefaultOptions.indices;\r\n\r\n this.engine = engine;\r\n this._vertexBuffers = {\r\n // Note, always assumes stride of 2.\r\n [VertexBuffer.PositionKind]: new VertexBuffer(engine, positions, VertexBuffer.PositionKind, false, false, 2),\r\n };\r\n this._indexBuffer = engine.createIndexBuffer(indices);\r\n this._indexBufferLength = indices.length;\r\n\r\n this._onContextRestoredObserver = engine.onContextRestoredObservable.add(() => {\r\n this._indexBuffer = engine.createIndexBuffer(indices);\r\n\r\n for (const key in this._vertexBuffers) {\r\n const vertexBuffer = this._vertexBuffers[key];\r\n vertexBuffer._rebuild();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the current viewport in normalized coordinates 0-1\r\n * @param viewport Defines the viewport to set (defaults to 0 0 1 1)\r\n */\r\n public setViewport(viewport = this._fullscreenViewport): void {\r\n this.engine.setViewport(viewport);\r\n }\r\n\r\n /**\r\n * Binds the embedded attributes buffer to the effect.\r\n * @param effect Defines the effect to bind the attributes for\r\n */\r\n public bindBuffers(effect: Effect): void {\r\n this.engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n }\r\n\r\n /**\r\n * Sets the current effect wrapper to use during draw.\r\n * The effect needs to be ready before calling this api.\r\n * This also sets the default full screen position attribute.\r\n * @param effectWrapper Defines the effect to draw with\r\n */\r\n public applyEffectWrapper(effectWrapper: EffectWrapper): void {\r\n this.engine.setState(true);\r\n this.engine.depthCullingState.depthTest = false;\r\n this.engine.stencilState.stencilTest = false;\r\n this.engine.enableEffect(effectWrapper.drawWrapper);\r\n this.bindBuffers(effectWrapper.effect);\r\n effectWrapper.onApplyObservable.notifyObservers({});\r\n }\r\n\r\n /**\r\n * Saves engine states\r\n */\r\n public saveStates(): void {\r\n this._savedStateDepthTest = this.engine.depthCullingState.depthTest;\r\n this._savedStateStencilTest = this.engine.stencilState.stencilTest;\r\n }\r\n\r\n /**\r\n * Restores engine states\r\n */\r\n public restoreStates(): void {\r\n this.engine.depthCullingState.depthTest = this._savedStateDepthTest;\r\n this.engine.stencilState.stencilTest = this._savedStateStencilTest;\r\n }\r\n\r\n /**\r\n * Draws a full screen quad.\r\n */\r\n public draw(): void {\r\n this.engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, this._indexBufferLength);\r\n }\r\n\r\n private _isRenderTargetTexture(texture: RenderTargetWrapper | IRenderTargetTexture): texture is IRenderTargetTexture {\r\n return (texture as IRenderTargetTexture).renderTarget !== undefined;\r\n }\r\n\r\n /**\r\n * renders one or more effects to a specified texture\r\n * @param effectWrapper the effect to renderer\r\n * @param outputTexture texture to draw to, if null it will render to the currently bound frame buffer\r\n */\r\n public render(effectWrapper: EffectWrapper, outputTexture: Nullable<RenderTargetWrapper | IRenderTargetTexture> = null) {\r\n // Ensure effect is ready\r\n if (!effectWrapper.effect.isReady()) {\r\n return;\r\n }\r\n\r\n this.saveStates();\r\n\r\n // Reset state\r\n this.setViewport();\r\n\r\n const out = outputTexture === null ? null : this._isRenderTargetTexture(outputTexture) ? outputTexture.renderTarget! : outputTexture;\r\n\r\n if (out) {\r\n this.engine.bindFramebuffer(out);\r\n }\r\n\r\n this.applyEffectWrapper(effectWrapper);\r\n\r\n this.draw();\r\n\r\n if (out) {\r\n this.engine.unBindFramebuffer(out);\r\n }\r\n\r\n this.restoreStates();\r\n }\r\n\r\n /**\r\n * Disposes of the effect renderer\r\n */\r\n dispose() {\r\n const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vertexBuffer) {\r\n vertexBuffer.dispose();\r\n delete this._vertexBuffers[VertexBuffer.PositionKind];\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this.engine._releaseBuffer(this._indexBuffer);\r\n }\r\n\r\n if (this._onContextRestoredObserver) {\r\n this.engine.onContextRestoredObservable.remove(this._onContextRestoredObserver);\r\n this._onContextRestoredObserver = null;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Allows for custom processing of the shader code used by an effect wrapper\r\n */\r\nexport type EffectWrapperCustomShaderCodeProcessing = {\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated after the #include have been processed\r\n */\r\n processCodeAfterIncludes?: (postProcessName: string, shaderType: string, code: string) => string;\r\n /**\r\n * If provided, will be called two times with the vertex and fragment code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: (postProcessName: string, shaderType: string, code: string) => string;\r\n /**\r\n * If provided, will be called before creating the effect to collect additional custom bindings (defines, uniforms, samplers)\r\n */\r\n defineCustomBindings?: (postProcessName: string, defines: Nullable<string>, uniforms: string[], samplers: string[]) => Nullable<string>;\r\n /**\r\n * If provided, will be called when binding inputs to the shader code to allow the user to add custom bindings\r\n */\r\n bindCustomBindings?: (postProcessName: string, effect: Effect) => void;\r\n};\r\n\r\n/**\r\n * Options to create an EffectWrapper\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface EffectWrapperCreationOptions {\r\n /**\r\n * Engine to use to create the effect\r\n */\r\n engine?: AbstractEngine;\r\n /**\r\n * Fragment shader for the effect\r\n */\r\n fragmentShader?: string;\r\n /**\r\n * Use the shader store instead of direct source code\r\n */\r\n useShaderStore?: boolean;\r\n /**\r\n * Vertex shader for the effect (default: \"postprocess\")\r\n */\r\n vertexShader?: string;\r\n /**\r\n * Alias for vertexShader\r\n */\r\n vertexUrl?: string;\r\n /**\r\n * Attributes to use in the shader (default: [\"position\"])\r\n */\r\n attributeNames?: Array<string>;\r\n /**\r\n * Uniforms to use in the shader\r\n */\r\n uniformNames?: Array<string>;\r\n /**\r\n * Alias for uniformNames. Note that if it is provided, it takes precedence over uniformNames.\r\n */\r\n uniforms?: Nullable<string[]>;\r\n /**\r\n * Texture sampler names to use in the shader\r\n */\r\n samplerNames?: Array<string>;\r\n /**\r\n * Alias for samplerNames. Note that if it is provided, it takes precedence over samplerNames.\r\n */\r\n samplers?: Nullable<string[]>;\r\n /**\r\n * The list of uniform buffers used in the shader (if any)\r\n */\r\n uniformBuffers?: Nullable<string[]>;\r\n /**\r\n * Defines to use in the shader\r\n */\r\n defines?: Nullable<string | Array<string>>;\r\n /**\r\n * The index parameters to be used for babylons include syntax \"#include<kernelBlurVaryingDeclaration>[0..varyingCount]\". (default: undefined)\r\n * See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx\r\n */\r\n indexParameters?: any;\r\n /**\r\n * If the shader should not be compiled immediately. (default: false)\r\n */\r\n blockCompilation?: boolean;\r\n /**\r\n * Callback when effect is compiled\r\n */\r\n onCompiled?: Nullable<(effect: Effect) => void>;\r\n /**\r\n * The friendly name of the effect (default: \"effectWrapper\")\r\n */\r\n name?: string;\r\n /**\r\n * The language the shader is written in (default: GLSL)\r\n */\r\n shaderLanguage?: ShaderLanguage;\r\n /**\r\n * Defines additional code to call to prepare the shader code\r\n */\r\n extraInitializations?: (useWebGPU: boolean, list: Promise<any>[]) => void;\r\n /**\r\n * Additional async code to run before preparing the effect\r\n */\r\n extraInitializationsAsync?: () => Promise<void>;\r\n /**\r\n * If the effect should be used as a post process (default: false). If true, the effect will be created with a \"scale\" uniform and a \"textureSampler\" sampler\r\n */\r\n useAsPostProcess?: boolean;\r\n /**\r\n * Sets this property to true if the fragment shader doesn't use a textureSampler texture (default: false).\r\n */\r\n allowEmptySourceTexture?: boolean;\r\n}\r\n\r\n/**\r\n * Wraps an effect to be used for rendering\r\n */\r\nexport class EffectWrapper {\r\n /**\r\n * Force code to compile to glsl even on WebGPU engines.\r\n * False by default. This is mostly meant for backward compatibility.\r\n */\r\n public static ForceGLSL = false;\r\n\r\n private static _CustomShaderCodeProcessing: { [effectWrapperName: string]: EffectWrapperCustomShaderCodeProcessing } = {};\r\n\r\n /**\r\n * Registers a shader code processing with an effect wrapper name.\r\n * @param effectWrapperName name of the effect wrapper. Use null for the fallback shader code processing. This is the shader code processing that will be used in case no specific shader code processing has been associated to an effect wrapper name\r\n * @param customShaderCodeProcessing shader code processing to associate to the effect wrapper name\r\n */\r\n public static RegisterShaderCodeProcessing(effectWrapperName: Nullable<string>, customShaderCodeProcessing?: EffectWrapperCustomShaderCodeProcessing) {\r\n if (!customShaderCodeProcessing) {\r\n delete EffectWrapper._CustomShaderCodeProcessing[effectWrapperName ?? \"\"];\r\n return;\r\n }\r\n\r\n EffectWrapper._CustomShaderCodeProcessing[effectWrapperName ?? \"\"] = customShaderCodeProcessing;\r\n }\r\n\r\n private static _GetShaderCodeProcessing(effectWrapperName: string) {\r\n return EffectWrapper._CustomShaderCodeProcessing[effectWrapperName] ?? EffectWrapper._CustomShaderCodeProcessing[\"\"];\r\n }\r\n\r\n /**\r\n * Gets or sets the name of the effect wrapper\r\n */\r\n public get name() {\r\n return this.options.name;\r\n }\r\n\r\n public set name(value: string) {\r\n this.options.name = value;\r\n }\r\n\r\n /**\r\n * Type of alpha mode to use when applying the effect (default: Engine.ALPHA_DISABLE). Used only if useAsPostProcess is true.\r\n */\r\n public alphaMode = Constants.ALPHA_DISABLE;\r\n\r\n /**\r\n * Executed when the effect is created\r\n * @returns effect that was created for this effect wrapper\r\n */\r\n public onEffectCreatedObservable = new Observable<Effect>(undefined, true);\r\n\r\n /**\r\n * Options used to create the effect wrapper\r\n */\r\n public readonly options: Required<NonNullableFields<EffectWrapperCreationOptions>>;\r\n\r\n /**\r\n * Get a value indicating if the effect is ready to be used\r\n * @returns true if the post-process is ready (shader is compiled)\r\n */\r\n public isReady() {\r\n return this._drawWrapper.effect?.isReady() ?? false;\r\n }\r\n\r\n /**\r\n * Get the draw wrapper associated with the effect wrapper\r\n * @returns the draw wrapper associated with the effect wrapper\r\n */\r\n public get drawWrapper() {\r\n return this._drawWrapper;\r\n }\r\n\r\n /**\r\n * Event that is fired (only when the EffectWrapper is used with an EffectRenderer) right before the effect is drawn (should be used to update uniforms)\r\n */\r\n public onApplyObservable = new Observable<{}>();\r\n\r\n /**\r\n * The underlying effect\r\n */\r\n public get effect(): Effect {\r\n return this._drawWrapper.effect!;\r\n }\r\n\r\n public set effect(effect: Effect) {\r\n this._drawWrapper.effect = effect;\r\n }\r\n\r\n protected readonly _drawWrapper: DrawWrapper;\r\n protected _shadersLoaded = false;\r\n protected readonly _shaderPath: IShaderPath;\r\n /** @internal */\r\n public _webGPUReady = false;\r\n\r\n private _onContextRestoredObserver: Nullable<Observer<AbstractEngine>>;\r\n\r\n /**\r\n * Creates an effect to be rendered\r\n * @param creationOptions options to create the effect\r\n */\r\n constructor(creationOptions: EffectWrapperCreationOptions) {\r\n this.options = {\r\n ...creationOptions,\r\n name: creationOptions.name || \"effectWrapper\",\r\n engine: creationOptions.engine!,\r\n uniforms: creationOptions.uniforms || creationOptions.uniformNames || [],\r\n uniformNames: undefined as any,\r\n samplers: creationOptions.samplers || creationOptions.samplerNames || [],\r\n samplerNames: undefined as any,\r\n attributeNames: creationOptions.attributeNames || [\"position\"],\r\n uniformBuffers: creationOptions.uniformBuffers || [],\r\n defines: creationOptions.defines || \"\",\r\n useShaderStore: creationOptions.useShaderStore || false,\r\n vertexUrl: creationOptions.vertexUrl || creationOptions.vertexShader || \"postprocess\",\r\n vertexShader: undefined as any,\r\n fragmentShader: creationOptions.fragmentShader || \"pass\",\r\n indexParameters: creationOptions.indexParameters,\r\n blockCompilation: creationOptions.blockCompilation || false,\r\n shaderLanguage: creationOptions.shaderLanguage || ShaderLanguage.GLSL,\r\n onCompiled: creationOptions.onCompiled || (undefined as any),\r\n extraInitializations: creationOptions.extraInitializations || (undefined as any),\r\n extraInitializationsAsync: creationOptions.extraInitializationsAsync || (undefined as any),\r\n useAsPostProcess: creationOptions.useAsPostProcess ?? false,\r\n allowEmptySourceTexture: creationOptions.allowEmptySourceTexture ?? false,\r\n };\r\n\r\n this.options.uniformNames = this.options.uniforms;\r\n this.options.samplerNames = this.options.samplers;\r\n this.options.vertexShader = this.options.vertexUrl;\r\n\r\n if (this.options.useAsPostProcess) {\r\n if (!this.options.allowEmptySourceTexture && this.options.samplers.indexOf(\"textureSampler\") === -1) {\r\n this.options.samplers.push(\"textureSampler\");\r\n }\r\n if (this.options.uniforms.indexOf(\"scale\") === -1) {\r\n this.options.uniforms.push(\"scale\");\r\n }\r\n }\r\n\r\n if (creationOptions.vertexUrl || creationOptions.vertexShader) {\r\n this._shaderPath = {\r\n vertexSource: this.options.vertexShader,\r\n };\r\n } else {\r\n if (!this.options.useAsPostProcess) {\r\n this.options.uniforms.push(\"scale\");\r\n\r\n this.onApplyObservable.add(() => {\r\n this.effect.setFloat2(\"scale\", 1, 1);\r\n });\r\n }\r\n\r\n this._shaderPath = {\r\n vertex: this.options.vertexShader,\r\n };\r\n }\r\n\r\n this._shaderPath.fragmentSource = this.options.fragmentShader;\r\n this._shaderPath.spectorName = this.options.name;\r\n\r\n if (this.options.useShaderStore) {\r\n this._shaderPath.fragment = this._shaderPath.fragmentSource;\r\n if (!this._shaderPath.vertex) {\r\n this._shaderPath.vertex = this._shaderPath.vertexSource;\r\n }\r\n\r\n delete this._shaderPath.fragmentSource;\r\n delete this._shaderPath.vertexSource;\r\n }\r\n\r\n this.onApplyObservable.add(() => {\r\n this.bind();\r\n });\r\n\r\n if (!this.options.useShaderStore) {\r\n this._onContextRestoredObserver = this.options.engine.onContextRestoredObservable.add(() => {\r\n this.effect._pipelineContext = null; // because _prepareEffect will try to dispose this pipeline before recreating it and that would lead to webgl errors\r\n this.effect._prepareEffect();\r\n });\r\n }\r\n\r\n this._drawWrapper = new DrawWrapper(this.options.engine);\r\n this._webGPUReady = this.options.shaderLanguage === ShaderLanguage.WGSL;\r\n\r\n const defines = Array.isArray(this.options.defines) ? this.options.defines.join(\"\\n\") : this.options.defines;\r\n\r\n this._postConstructor(this.options.blockCompilation, defines, this.options.extraInitializations);\r\n }\r\n\r\n protected _gatherImports(useWebGPU = false, list: Promise<any>[]) {\r\n if (!this.options.useAsPostProcess) {\r\n return;\r\n }\r\n\r\n // this._webGPUReady is used to detect when an effect wrapper is intended to be used with WebGPU\r\n if (useWebGPU && this._webGPUReady) {\r\n list.push(Promise.all([import(\"../ShadersWGSL/postprocess.vertex\")]));\r\n } else {\r\n list.push(Promise.all([import(\"../Shaders/postprocess.vertex\")]));\r\n }\r\n }\r\n\r\n private _importPromises: Array<Promise<any>> = [];\r\n\r\n /** @internal */\r\n public _postConstructor(\r\n blockCompilation: boolean,\r\n defines: Nullable<string> = null,\r\n extraInitializations?: (useWebGPU: boolean, list: Promise<any>[]) => void,\r\n importPromises?: Array<Promise<any>>\r\n ) {\r\n this._importPromises.length = 0;\r\n\r\n if (importPromises) {\r\n this._importPromises.push(...importPromises);\r\n }\r\n\r\n const useWebGPU = this.options.engine.isWebGPU && !EffectWrapper.ForceGLSL;\r\n\r\n this._gatherImports(useWebGPU, this._importPromises);\r\n if (extraInitializations !== undefined) {\r\n extraInitializations(useWebGPU, this._importPromises);\r\n }\r\n\r\n if (useWebGPU && this._webGPUReady) {\r\n this.options.shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n if (!blockCompilation) {\r\n this.updateEffect(defines);\r\n }\r\n }\r\n\r\n /**\r\n * Updates the effect with the current effect wrapper compile time values and recompiles the shader.\r\n * @param defines Define statements that should be added at the beginning of the shader. (default: null)\r\n * @param uniforms Set of uniform variables that will be passed to the shader. (default: null)\r\n * @param samplers Set of Texture2D variables that will be passed to the shader. (default: null)\r\n * @param indexParameters The index parameters to be used for babylons include syntax \"#include<kernelBlurVaryingDeclaration>[0..varyingCount]\". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx\r\n * @param onCompiled Called when the shader has been compiled.\r\n * @param onError Called if there is an error when compiling a shader.\r\n * @param vertexUrl The url of the vertex shader to be used (default: the one given at construction time)\r\n * @param fragmentUrl The url of the fragment shader to be used (default: the one given at construction time)\r\n */\r\n public updateEffect(\r\n defines: Nullable<string> = null,\r\n uniforms: Nullable<string[]> = null,\r\n samplers: Nullable<string[]> = null,\r\n indexParameters?: any,\r\n onCompiled?: (effect: Effect) => void,\r\n onError?: (effect: Effect, errors: string) => void,\r\n vertexUrl?: string,\r\n fragmentUrl?: string\r\n ) {\r\n const customShaderCodeProcessing = EffectWrapper._GetShaderCodeProcessing(this.name);\r\n if (customShaderCodeProcessing?.defineCustomBindings) {\r\n const newUniforms = uniforms?.slice() ?? [];\r\n newUniforms.push(...this.options.uniforms);\r\n\r\n const newSamplers = samplers?.slice() ?? [];\r\n newSamplers.push(...this.options.samplers);\r\n\r\n defines = customShaderCodeProcessing.defineCustomBindings(this.name, defines, newUniforms, newSamplers);\r\n uniforms = newUniforms;\r\n samplers = newSamplers;\r\n }\r\n\r\n this.options.defines = defines || \"\";\r\n\r\n const waitImportsLoaded =\r\n this._shadersLoaded || this._importPromises.length === 0\r\n ? undefined\r\n : async () => {\r\n await Promise.all(this._importPromises);\r\n this._shadersLoaded = true;\r\n };\r\n\r\n let extraInitializationsAsync: (() => Promise<void>) | undefined;\r\n if (this.options.extraInitializationsAsync) {\r\n extraInitializationsAsync = async () => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n waitImportsLoaded?.();\r\n await this.options.extraInitializationsAsync();\r\n };\r\n } else {\r\n extraInitializationsAsync = waitImportsLoaded;\r\n }\r\n\r\n if (this.options.useShaderStore) {\r\n this._drawWrapper.effect = this.options.engine.createEffect(\r\n { vertex: vertexUrl ?? this._shaderPath.vertex, fragment: fragmentUrl ?? this._shaderPath.fragment },\r\n {\r\n attributes: this.options.attributeNames,\r\n uniformsNames: uniforms || this.options.uniforms,\r\n uniformBuffersNames: this.options.uniformBuffers,\r\n samplers: samplers || this.options.samplers,\r\n defines: defines !== null ? defines : \"\",\r\n fallbacks: null,\r\n onCompiled: onCompiled ?? this.options.onCompiled,\r\n onError: onError ?? null,\r\n indexParameters: indexParameters || this.options.indexParameters,\r\n processCodeAfterIncludes: customShaderCodeProcessing?.processCodeAfterIncludes\r\n ? (shaderType: string, code: string) => customShaderCodeProcessing.processCodeAfterIncludes!(this.name, shaderType, code)\r\n : null,\r\n processFinalCode: customShaderCodeProcessing?.processFinalCode\r\n ? (shaderType: string, code: string) => customShaderCodeProcessing.processFinalCode!(this.name, shaderType, code)\r\n : null,\r\n shaderLanguage: this.options.shaderLanguage,\r\n extraInitializationsAsync,\r\n },\r\n this.options.engine\r\n );\r\n } else {\r\n this._drawWrapper.effect = new Effect(\r\n this._shaderPath,\r\n this.options.attributeNames,\r\n uniforms || this.options.uniforms,\r\n samplers || this.options.samplerNames,\r\n this.options.engine,\r\n defines,\r\n undefined,\r\n onCompiled || this.options.onCompiled,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this.options.shaderLanguage,\r\n extraInitializationsAsync\r\n );\r\n }\r\n\r\n this.onEffectCreatedObservable.notifyObservers(this._drawWrapper.effect);\r\n }\r\n\r\n /**\r\n * Binds the data to the effect.\r\n * @param noDefaultBindings if true, the default bindings (scale and alpha mode) will not be set.\r\n */\r\n public bind(noDefaultBindings = false) {\r\n if (this.options.useAsPostProcess && !noDefaultBindings) {\r\n this.options.engine.setAlphaMode(this.alphaMode);\r\n this.drawWrapper.effect!.setFloat2(\"scale\", 1, 1);\r\n }\r\n\r\n EffectWrapper._GetShaderCodeProcessing(this.name)?.bindCustomBindings?.(this.name, this._drawWrapper.effect!);\r\n }\r\n\r\n /**\r\n * Disposes of the effect wrapper\r\n * @param _ignored kept for backward compatibility\r\n */\r\n public dispose(_ignored: boolean = false) {\r\n if (this._onContextRestoredObserver) {\r\n this.effect.getEngine().onContextRestoredObservable.remove(this._onContextRestoredObserver);\r\n this._onContextRestoredObserver = null;\r\n }\r\n this.onEffectCreatedObservable.clear();\r\n this._drawWrapper.dispose(true);\r\n }\r\n}\r\n"]}
|
package/Materials/index.d.ts
CHANGED
|
@@ -38,6 +38,7 @@ export * from "./meshDebugPluginMaterial.js";
|
|
|
38
38
|
export * from "./GaussianSplatting/gaussianSplattingMaterial.js";
|
|
39
39
|
export * from "./materialHelper.functions.js";
|
|
40
40
|
export * from "./materialHelper.geometryrendering.js";
|
|
41
|
+
export * from "./materialStencilState.js";
|
|
41
42
|
import "./material.decalMap.js";
|
|
42
43
|
export * from "../Shaders/default.fragment.js";
|
|
43
44
|
export * from "../Shaders/default.vertex.js";
|
package/Materials/index.js
CHANGED
|
@@ -39,6 +39,7 @@ export * from "./meshDebugPluginMaterial.js";
|
|
|
39
39
|
export * from "./GaussianSplatting/gaussianSplattingMaterial.js";
|
|
40
40
|
export * from "./materialHelper.functions.js";
|
|
41
41
|
export * from "./materialHelper.geometryrendering.js";
|
|
42
|
+
export * from "./materialStencilState.js";
|
|
42
43
|
import "./material.decalMap.js";
|
|
43
44
|
// async-loaded shaders
|
|
44
45
|
// StandardMaterial
|
package/Materials/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+CAA+C,CAAC;AAC9D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oCAAoC,CAAC;AACnD,OAAO,qBAAqB,CAAC;AAE7B,uBAAuB;AAEvB,mBAAmB;AACnB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAE9C,2BAA2B;AAC3B,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nexport * from \"./Background/index\";\r\nexport * from \"./colorCurves\";\r\nexport * from \"./iEffectFallbacks\";\r\nexport * from \"./effectFallbacks\";\r\nexport * from \"./effect\";\r\nexport * from \"./fresnelParameters\";\r\nexport * from \"./imageProcessingConfiguration\";\r\nexport * from \"./material\";\r\nexport * from \"./materialDefines\";\r\nexport * from \"./clipPlaneMaterialHelper\";\r\nexport * from \"./materialHelper\";\r\nexport * from \"./multiMaterial\";\r\nexport * from \"./Occlusion/index\";\r\nexport * from \"./PBR/index\";\r\nexport * from \"./pushMaterial\";\r\nexport * from \"./shaderLanguage\";\r\nexport * from \"./shaderMaterial\";\r\nexport * from \"./standardMaterial\";\r\nexport * from \"./Textures/index\";\r\nexport * from \"./uniformBuffer\";\r\nexport * from \"./materialFlags\";\r\nexport * from \"./Node/index\";\r\nexport * from \"./effectRenderer\";\r\nexport * from \"./shadowDepthWrapper\";\r\nexport * from \"./drawWrapper.functions\";\r\nexport * from \"./drawWrapper\";\r\nexport * from \"./materialPluginBase\";\r\nexport * from \"./materialPluginManager\";\r\nexport * from \"./materialPluginEvent\";\r\nexport * from \"./material.detailMapConfiguration\";\r\nexport * from \"./material.decalMapConfiguration\";\r\nexport * from \"./materialPluginFactoryExport\";\r\nexport * from \"./GreasedLine/greasedLinePluginMaterial\";\r\nexport * from \"./GreasedLine/greasedLineSimpleMaterial\";\r\nexport * from \"./GreasedLine/greasedLineMaterialInterfaces\";\r\nexport * from \"./GreasedLine/greasedLineMaterialDefaults\";\r\nexport * from \"./meshDebugPluginMaterial\";\r\nexport * from \"./GaussianSplatting/gaussianSplattingMaterial\";\r\nexport * from \"./materialHelper.functions\";\r\nexport * from \"./materialHelper.geometryrendering\";\r\nimport \"./material.decalMap\";\r\n\r\n// async-loaded shaders\r\n\r\n// StandardMaterial\r\nexport * from \"../Shaders/default.fragment\";\r\nexport * from \"../Shaders/default.vertex\";\r\nexport * from \"../ShadersWGSL/default.fragment\";\r\nexport * from \"../ShadersWGSL/default.vertex\";\r\n\r\n// GreasedLineSimplMaterial\r\nexport * from \"../Shaders/greasedLine.fragment\";\r\nexport * from \"../Shaders/greasedLine.vertex\";\r\nexport * from \"../ShadersWGSL/greasedLine.fragment\";\r\nexport * from \"../ShadersWGSL/greasedLine.vertex\";\r\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+CAA+C,CAAC;AAC9D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oCAAoC,CAAC;AACnD,cAAc,wBAAwB,CAAC;AACvC,OAAO,qBAAqB,CAAC;AAE7B,uBAAuB;AAEvB,mBAAmB;AACnB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAE9C,2BAA2B;AAC3B,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nexport * from \"./Background/index\";\r\nexport * from \"./colorCurves\";\r\nexport * from \"./iEffectFallbacks\";\r\nexport * from \"./effectFallbacks\";\r\nexport * from \"./effect\";\r\nexport * from \"./fresnelParameters\";\r\nexport * from \"./imageProcessingConfiguration\";\r\nexport * from \"./material\";\r\nexport * from \"./materialDefines\";\r\nexport * from \"./clipPlaneMaterialHelper\";\r\nexport * from \"./materialHelper\";\r\nexport * from \"./multiMaterial\";\r\nexport * from \"./Occlusion/index\";\r\nexport * from \"./PBR/index\";\r\nexport * from \"./pushMaterial\";\r\nexport * from \"./shaderLanguage\";\r\nexport * from \"./shaderMaterial\";\r\nexport * from \"./standardMaterial\";\r\nexport * from \"./Textures/index\";\r\nexport * from \"./uniformBuffer\";\r\nexport * from \"./materialFlags\";\r\nexport * from \"./Node/index\";\r\nexport * from \"./effectRenderer\";\r\nexport * from \"./shadowDepthWrapper\";\r\nexport * from \"./drawWrapper.functions\";\r\nexport * from \"./drawWrapper\";\r\nexport * from \"./materialPluginBase\";\r\nexport * from \"./materialPluginManager\";\r\nexport * from \"./materialPluginEvent\";\r\nexport * from \"./material.detailMapConfiguration\";\r\nexport * from \"./material.decalMapConfiguration\";\r\nexport * from \"./materialPluginFactoryExport\";\r\nexport * from \"./GreasedLine/greasedLinePluginMaterial\";\r\nexport * from \"./GreasedLine/greasedLineSimpleMaterial\";\r\nexport * from \"./GreasedLine/greasedLineMaterialInterfaces\";\r\nexport * from \"./GreasedLine/greasedLineMaterialDefaults\";\r\nexport * from \"./meshDebugPluginMaterial\";\r\nexport * from \"./GaussianSplatting/gaussianSplattingMaterial\";\r\nexport * from \"./materialHelper.functions\";\r\nexport * from \"./materialHelper.geometryrendering\";\r\nexport * from \"./materialStencilState\";\r\nimport \"./material.decalMap\";\r\n\r\n// async-loaded shaders\r\n\r\n// StandardMaterial\r\nexport * from \"../Shaders/default.fragment\";\r\nexport * from \"../Shaders/default.vertex\";\r\nexport * from \"../ShadersWGSL/default.fragment\";\r\nexport * from \"../ShadersWGSL/default.vertex\";\r\n\r\n// GreasedLineSimplMaterial\r\nexport * from \"../Shaders/greasedLine.fragment\";\r\nexport * from \"../Shaders/greasedLine.vertex\";\r\nexport * from \"../ShadersWGSL/greasedLine.fragment\";\r\nexport * from \"../ShadersWGSL/greasedLine.vertex\";\r\n"]}
|
package/Materials/material.d.ts
CHANGED
|
@@ -175,6 +175,13 @@ export declare class Material implements IAnimatable, IClipPlanesHolder {
|
|
|
175
175
|
/** Shader language used by the material */
|
|
176
176
|
protected _shaderLanguage: ShaderLanguage;
|
|
177
177
|
protected _forceGLSL: boolean;
|
|
178
|
+
protected _useVertexPulling: boolean;
|
|
179
|
+
/**
|
|
180
|
+
* Tells the engine to draw geometry using vertex pulling instead of index drawing. This will automatically
|
|
181
|
+
* set the vertex buffers as storage buffers and make them accessible to the vertex shader (WebGPU only).
|
|
182
|
+
*/
|
|
183
|
+
get useVertexPulling(): boolean;
|
|
184
|
+
set useVertexPulling(value: boolean);
|
|
178
185
|
/** @internal */
|
|
179
186
|
get _supportGlowLayer(): boolean;
|
|
180
187
|
/** @internal */
|
|
@@ -354,7 +361,7 @@ export declare class Material implements IAnimatable, IClipPlanesHolder {
|
|
|
354
361
|
/**
|
|
355
362
|
* Stores the value of the alpha mode
|
|
356
363
|
*/
|
|
357
|
-
|
|
364
|
+
protected _alphaMode: number[];
|
|
358
365
|
/**
|
|
359
366
|
* Sets the value of the alpha mode.
|
|
360
367
|
*
|
package/Materials/material.js
CHANGED
|
@@ -12,10 +12,25 @@ import { DrawWrapper } from "./drawWrapper.js";
|
|
|
12
12
|
import { MaterialStencilState } from "./materialStencilState.js";
|
|
13
13
|
import { BindSceneUniformBuffer } from "./materialHelper.functions.js";
|
|
14
14
|
import { SerializationHelper } from "../Misc/decorators.serialization.js";
|
|
15
|
+
import { IsWrapper } from "./drawWrapper.functions.js";
|
|
15
16
|
/**
|
|
16
17
|
* Base class for the main features of a material in Babylon.js
|
|
17
18
|
*/
|
|
18
19
|
export class Material {
|
|
20
|
+
/**
|
|
21
|
+
* Tells the engine to draw geometry using vertex pulling instead of index drawing. This will automatically
|
|
22
|
+
* set the vertex buffers as storage buffers and make them accessible to the vertex shader (WebGPU only).
|
|
23
|
+
*/
|
|
24
|
+
get useVertexPulling() {
|
|
25
|
+
return this._useVertexPulling;
|
|
26
|
+
}
|
|
27
|
+
set useVertexPulling(value) {
|
|
28
|
+
if (this._useVertexPulling === value) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this._useVertexPulling = value;
|
|
32
|
+
this.markAsDirty(Material.MiscDirtyFlag);
|
|
33
|
+
}
|
|
19
34
|
/** @internal */
|
|
20
35
|
get _supportGlowLayer() {
|
|
21
36
|
return false;
|
|
@@ -369,6 +384,7 @@ export class Material {
|
|
|
369
384
|
/** Shader language used by the material */
|
|
370
385
|
this._shaderLanguage = 0 /* ShaderLanguage.GLSL */;
|
|
371
386
|
this._forceGLSL = false;
|
|
387
|
+
this._useVertexPulling = false;
|
|
372
388
|
/**
|
|
373
389
|
* Gets or sets user defined metadata
|
|
374
390
|
*/
|
|
@@ -808,7 +824,11 @@ export class Material {
|
|
|
808
824
|
const engine = this._scene.getEngine();
|
|
809
825
|
const orientation = overrideOrientation == null ? this.sideOrientation : overrideOrientation;
|
|
810
826
|
const reverse = orientation === Material.ClockWiseSideOrientation;
|
|
811
|
-
|
|
827
|
+
const effectiveDrawWrapper = effect ? effect : this._getDrawWrapper();
|
|
828
|
+
if (IsWrapper(effectiveDrawWrapper) && effectiveDrawWrapper.materialContext) {
|
|
829
|
+
effectiveDrawWrapper.materialContext.useVertexPulling = this.useVertexPulling;
|
|
830
|
+
}
|
|
831
|
+
engine.enableEffect(effectiveDrawWrapper);
|
|
812
832
|
engine.setState(this.backFaceCulling, this.zOffset, false, reverse, this._scene._mirroredCameraPosition ? !this.cullBackFaces : this.cullBackFaces, this.stencil, this.zOffsetUnits);
|
|
813
833
|
return reverse;
|
|
814
834
|
}
|