@babylonjs/core 5.31.0 → 5.31.2
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/Animations/animatable.d.ts +1 -0
- package/Animations/animatable.js +7 -0
- package/Animations/animatable.js.map +1 -1
- package/Engines/Extensions/engine.rawTexture.js +17 -0
- package/Engines/Extensions/engine.rawTexture.js.map +1 -1
- package/Engines/Extensions/engine.views.js +2 -2
- package/Engines/Extensions/engine.views.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.rawTexture.js +3 -0
- package/Engines/WebGPU/Extensions/engine.rawTexture.js.map +1 -1
- package/Engines/thinEngine.js +6 -4
- package/Engines/thinEngine.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.js +8 -4
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Materials/effectRenderer.d.ts +6 -4
- package/Materials/effectRenderer.js +27 -28
- package/Materials/effectRenderer.js.map +1 -1
- package/Meshes/mesh.d.ts +3 -1
- package/Meshes/mesh.js +4 -1
- package/Meshes/mesh.js.map +1 -1
- package/PostProcesses/motionBlurPostProcess.js +7 -5
- package/PostProcesses/motionBlurPostProcess.js.map +1 -1
- package/Shaders/motionBlur.fragment.js +2 -2
- package/Shaders/motionBlur.fragment.js.map +1 -1
- package/Shaders/shadowMap.fragment.js +6 -4
- package/Shaders/shadowMap.fragment.js.map +1 -1
- package/Shaders/shadowMap.vertex.js +2 -2
- package/Shaders/shadowMap.vertex.js.map +1 -1
- package/XR/webXRCamera.js +2 -0
- package/XR/webXRCamera.js.map +1 -1
- package/assetContainer.js +2 -2
- package/assetContainer.js.map +1 -1
- package/package.json +1 -1
|
@@ -25,18 +25,20 @@ export interface IEffectRendererOptions {
|
|
|
25
25
|
* You can access the previous rendering in your shader by declaring a sampler named textureSampler
|
|
26
26
|
*/
|
|
27
27
|
export declare class EffectRenderer {
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
/**
|
|
29
|
+
* The engine the effect renderer has been created for.
|
|
30
|
+
*/
|
|
31
|
+
readonly engine: ThinEngine;
|
|
30
32
|
private _vertexBuffers;
|
|
31
33
|
private _indexBuffer;
|
|
32
34
|
private _fullscreenViewport;
|
|
33
35
|
private _onContextRestoredObserver;
|
|
34
36
|
/**
|
|
35
37
|
* Creates an effect renderer
|
|
36
|
-
* @param
|
|
38
|
+
* @param engine the engine to use for rendering
|
|
37
39
|
* @param options defines the options of the effect renderer
|
|
38
40
|
*/
|
|
39
|
-
constructor(
|
|
41
|
+
constructor(engine: ThinEngine, options?: IEffectRendererOptions);
|
|
40
42
|
/**
|
|
41
43
|
* Sets the current viewport in normalized coordinates 0-1
|
|
42
44
|
* @param viewport Defines the viewport to set (defaults to 0 0 1 1)
|
|
@@ -6,6 +6,11 @@ import { Effect } from "./effect.js";
|
|
|
6
6
|
import { DrawWrapper } from "./drawWrapper.js";
|
|
7
7
|
// Prevents ES6 Crash if not imported.
|
|
8
8
|
import "../Shaders/postprocess.vertex.js";
|
|
9
|
+
// Fullscreen quad buffers by default.
|
|
10
|
+
const defaultOptions = {
|
|
11
|
+
positions: [1, 1, -1, 1, -1, -1, 1, -1],
|
|
12
|
+
indices: [0, 1, 2, 0, 2, 3],
|
|
13
|
+
};
|
|
9
14
|
/**
|
|
10
15
|
* Helper class to render one or more effects.
|
|
11
16
|
* You can access the previous rendering in your shader by declaring a sampler named textureSampler
|
|
@@ -13,22 +18,21 @@ import "../Shaders/postprocess.vertex.js";
|
|
|
13
18
|
export class EffectRenderer {
|
|
14
19
|
/**
|
|
15
20
|
* Creates an effect renderer
|
|
16
|
-
* @param
|
|
21
|
+
* @param engine the engine to use for rendering
|
|
17
22
|
* @param options defines the options of the effect renderer
|
|
18
23
|
*/
|
|
19
|
-
constructor(
|
|
20
|
-
|
|
24
|
+
constructor(engine, options = defaultOptions) {
|
|
25
|
+
var _a, _b;
|
|
21
26
|
this._fullscreenViewport = new Viewport(0, 0, 1, 1);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
};
|
|
27
|
+
const positions = (_a = options.positions) !== null && _a !== void 0 ? _a : defaultOptions.positions;
|
|
28
|
+
const indices = (_b = options.indices) !== null && _b !== void 0 ? _b : defaultOptions.indices;
|
|
29
|
+
this.engine = engine;
|
|
26
30
|
this._vertexBuffers = {
|
|
27
|
-
[VertexBuffer.PositionKind]: new VertexBuffer(
|
|
31
|
+
[VertexBuffer.PositionKind]: new VertexBuffer(engine, positions, VertexBuffer.PositionKind, false, false, 2),
|
|
28
32
|
};
|
|
29
|
-
this._indexBuffer =
|
|
30
|
-
this._onContextRestoredObserver =
|
|
31
|
-
this._indexBuffer =
|
|
33
|
+
this._indexBuffer = engine.createIndexBuffer(indices);
|
|
34
|
+
this._onContextRestoredObserver = engine.onContextRestoredObservable.add(() => {
|
|
35
|
+
this._indexBuffer = engine.createIndexBuffer(indices);
|
|
32
36
|
for (const key in this._vertexBuffers) {
|
|
33
37
|
const vertexBuffer = this._vertexBuffers[key];
|
|
34
38
|
vertexBuffer._rebuild();
|
|
@@ -40,14 +44,14 @@ export class EffectRenderer {
|
|
|
40
44
|
* @param viewport Defines the viewport to set (defaults to 0 0 1 1)
|
|
41
45
|
*/
|
|
42
46
|
setViewport(viewport = this._fullscreenViewport) {
|
|
43
|
-
this.
|
|
47
|
+
this.engine.setViewport(viewport);
|
|
44
48
|
}
|
|
45
49
|
/**
|
|
46
50
|
* Binds the embedded attributes buffer to the effect.
|
|
47
51
|
* @param effect Defines the effect to bind the attributes for
|
|
48
52
|
*/
|
|
49
53
|
bindBuffers(effect) {
|
|
50
|
-
this.
|
|
54
|
+
this.engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);
|
|
51
55
|
}
|
|
52
56
|
/**
|
|
53
57
|
* Sets the current effect wrapper to use during draw.
|
|
@@ -56,9 +60,9 @@ export class EffectRenderer {
|
|
|
56
60
|
* @param effectWrapper Defines the effect to draw with
|
|
57
61
|
*/
|
|
58
62
|
applyEffectWrapper(effectWrapper) {
|
|
59
|
-
this.
|
|
60
|
-
this.
|
|
61
|
-
this.
|
|
63
|
+
this.engine.depthCullingState.depthTest = false;
|
|
64
|
+
this.engine.stencilState.stencilTest = false;
|
|
65
|
+
this.engine.enableEffect(effectWrapper._drawWrapper);
|
|
62
66
|
this.bindBuffers(effectWrapper.effect);
|
|
63
67
|
effectWrapper.onApplyObservable.notifyObservers({});
|
|
64
68
|
}
|
|
@@ -66,14 +70,14 @@ export class EffectRenderer {
|
|
|
66
70
|
* Restores engine states
|
|
67
71
|
*/
|
|
68
72
|
restoreStates() {
|
|
69
|
-
this.
|
|
70
|
-
this.
|
|
73
|
+
this.engine.depthCullingState.depthTest = true;
|
|
74
|
+
this.engine.stencilState.stencilTest = true;
|
|
71
75
|
}
|
|
72
76
|
/**
|
|
73
77
|
* Draws a full screen quad.
|
|
74
78
|
*/
|
|
75
79
|
draw() {
|
|
76
|
-
this.
|
|
80
|
+
this.engine.drawElementsType(0, 0, 6);
|
|
77
81
|
}
|
|
78
82
|
_isRenderTargetTexture(texture) {
|
|
79
83
|
return texture.renderTarget !== undefined;
|
|
@@ -92,12 +96,12 @@ export class EffectRenderer {
|
|
|
92
96
|
this.setViewport();
|
|
93
97
|
const out = outputTexture === null ? null : this._isRenderTargetTexture(outputTexture) ? outputTexture.renderTarget : outputTexture;
|
|
94
98
|
if (out) {
|
|
95
|
-
this.
|
|
99
|
+
this.engine.bindFramebuffer(out);
|
|
96
100
|
}
|
|
97
101
|
this.applyEffectWrapper(effectWrapper);
|
|
98
102
|
this.draw();
|
|
99
103
|
if (out) {
|
|
100
|
-
this.
|
|
104
|
+
this.engine.unBindFramebuffer(out);
|
|
101
105
|
}
|
|
102
106
|
this.restoreStates();
|
|
103
107
|
}
|
|
@@ -111,19 +115,14 @@ export class EffectRenderer {
|
|
|
111
115
|
delete this._vertexBuffers[VertexBuffer.PositionKind];
|
|
112
116
|
}
|
|
113
117
|
if (this._indexBuffer) {
|
|
114
|
-
this.
|
|
118
|
+
this.engine._releaseBuffer(this._indexBuffer);
|
|
115
119
|
}
|
|
116
120
|
if (this._onContextRestoredObserver) {
|
|
117
|
-
this.
|
|
121
|
+
this.engine.onContextRestoredObservable.remove(this._onContextRestoredObserver);
|
|
118
122
|
this._onContextRestoredObserver = null;
|
|
119
123
|
}
|
|
120
124
|
}
|
|
121
125
|
}
|
|
122
|
-
// Fullscreen quad buffers by default.
|
|
123
|
-
EffectRenderer._DefaultOptions = {
|
|
124
|
-
positions: [1, 1, -1, 1, -1, -1, 1, -1],
|
|
125
|
-
indices: [0, 1, 2, 0, 2, 3],
|
|
126
|
-
};
|
|
127
126
|
/**
|
|
128
127
|
* Wraps an effect to be used for rendering
|
|
129
128
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effectRenderer.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Materials/effectRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\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 { 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 type { ShaderLanguage } from \"./shaderLanguage\";\r\n\r\n// Prevents ES6 Crash 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/**\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 // Fullscreen quad buffers by default.\r\n private static _DefaultOptions: IEffectRendererOptions = {\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 private _vertexBuffers: { [key: string]: VertexBuffer };\r\n private _indexBuffer: DataBuffer;\r\n\r\n private _fullscreenViewport = new Viewport(0, 0, 1, 1);\r\n private _onContextRestoredObserver: Nullable<Observer<ThinEngine>>;\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(private _engine: ThinEngine, options: IEffectRendererOptions = EffectRenderer._DefaultOptions) {\r\n options = {\r\n ...EffectRenderer._DefaultOptions,\r\n ...options,\r\n };\r\n\r\n this._vertexBuffers = {\r\n [VertexBuffer.PositionKind]: new VertexBuffer(_engine, options.positions!, VertexBuffer.PositionKind, false, false, 2),\r\n };\r\n this._indexBuffer = _engine.createIndexBuffer(options.indices!);\r\n\r\n this._onContextRestoredObserver = _engine.onContextRestoredObservable.add(() => {\r\n this._indexBuffer = _engine.createIndexBuffer(options.indices!);\r\n\r\n for (const key in this._vertexBuffers) {\r\n const vertexBuffer = <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.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 * Restores engine states\r\n */\r\n public restoreStates(): void {\r\n this._engine.depthCullingState.depthTest = true;\r\n this._engine.stencilState.stencilTest = true;\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, 6);\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 screen.\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 // 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 * Options to create an EffectWrapper\r\n */\r\ninterface EffectWrapperCreationOptions {\r\n /**\r\n * Engine to use to create the effect\r\n */\r\n engine: ThinEngine;\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\r\n */\r\n vertexShader?: string;\r\n /**\r\n * Attributes to use in the shader\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 * Texture sampler names to use in the shader\r\n */\r\n samplerNames?: Array<string>;\r\n /**\r\n * Defines to use in the shader\r\n */\r\n defines?: Array<string>;\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 displayed in Spector.\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\r\n/**\r\n * Wraps an effect to be used for rendering\r\n */\r\nexport class EffectWrapper {\r\n /**\r\n * Event that is fired right before the effect is drawn (should be used to update uniforms)\r\n */\r\n public onApplyObservable = new Observable<{}>();\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 /** @internal */\r\n public _drawWrapper: DrawWrapper;\r\n\r\n private _onContextRestoredObserver: Nullable<Observer<ThinEngine>>;\r\n\r\n /**\r\n * Creates an effect to be renderer\r\n * @param creationOptions options to create the effect\r\n */\r\n constructor(creationOptions: EffectWrapperCreationOptions) {\r\n let effectCreationOptions: any;\r\n const uniformNames = creationOptions.uniformNames || [];\r\n\r\n if (creationOptions.vertexShader) {\r\n effectCreationOptions = {\r\n fragmentSource: creationOptions.fragmentShader,\r\n vertexSource: creationOptions.vertexShader,\r\n spectorName: creationOptions.name || \"effectWrapper\",\r\n };\r\n } else {\r\n // Default scale to use in post process vertex shader.\r\n uniformNames.push(\"scale\");\r\n\r\n effectCreationOptions = {\r\n fragmentSource: creationOptions.fragmentShader,\r\n vertex: \"postprocess\",\r\n spectorName: creationOptions.name || \"effectWrapper\",\r\n };\r\n\r\n // Sets the default scale to identity for the post process vertex shader.\r\n this.onApplyObservable.add(() => {\r\n this.effect.setFloat2(\"scale\", 1, 1);\r\n });\r\n }\r\n\r\n const defines = creationOptions.defines ? creationOptions.defines.join(\"\\n\") : \"\";\r\n this._drawWrapper = new DrawWrapper(creationOptions.engine);\r\n\r\n if (creationOptions.useShaderStore) {\r\n effectCreationOptions.fragment = effectCreationOptions.fragmentSource;\r\n if (!effectCreationOptions.vertex) {\r\n effectCreationOptions.vertex = effectCreationOptions.vertexSource;\r\n }\r\n\r\n delete effectCreationOptions.fragmentSource;\r\n delete effectCreationOptions.vertexSource;\r\n\r\n this.effect = creationOptions.engine.createEffect(\r\n effectCreationOptions,\r\n creationOptions.attributeNames || [\"position\"],\r\n uniformNames,\r\n creationOptions.samplerNames,\r\n defines,\r\n undefined,\r\n creationOptions.onCompiled,\r\n undefined,\r\n undefined,\r\n creationOptions.shaderLanguage\r\n );\r\n } else {\r\n this.effect = new Effect(\r\n effectCreationOptions,\r\n creationOptions.attributeNames || [\"position\"],\r\n uniformNames,\r\n creationOptions.samplerNames,\r\n creationOptions.engine,\r\n defines,\r\n undefined,\r\n creationOptions.onCompiled,\r\n undefined,\r\n undefined,\r\n undefined,\r\n creationOptions.shaderLanguage\r\n );\r\n\r\n this._onContextRestoredObserver = creationOptions.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._wasPreviouslyReady = false;\r\n this.effect._prepareEffect();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the effect wrapper\r\n */\r\n public dispose() {\r\n if (this._onContextRestoredObserver) {\r\n this.effect.getEngine().onContextRestoredObservable.remove(this._onContextRestoredObserver);\r\n this._onContextRestoredObserver = null;\r\n }\r\n this.effect.dispose();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"effectRenderer.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Materials/effectRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\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 { 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 type { ShaderLanguage } from \"./shaderLanguage\";\r\n\r\n// Prevents ES6 Crash 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: ThinEngine;\r\n\r\n private _vertexBuffers: { [key: string]: VertexBuffer };\r\n private _indexBuffer: DataBuffer;\r\n\r\n private _fullscreenViewport = new Viewport(0, 0, 1, 1);\r\n private _onContextRestoredObserver: Nullable<Observer<ThinEngine>>;\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: ThinEngine, 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 [VertexBuffer.PositionKind]: new VertexBuffer(engine, positions, VertexBuffer.PositionKind, false, false, 2),\r\n };\r\n this._indexBuffer = engine.createIndexBuffer(indices);\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.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 * Restores engine states\r\n */\r\n public restoreStates(): void {\r\n this.engine.depthCullingState.depthTest = true;\r\n this.engine.stencilState.stencilTest = true;\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, 6);\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 screen.\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 // 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 * Options to create an EffectWrapper\r\n */\r\ninterface EffectWrapperCreationOptions {\r\n /**\r\n * Engine to use to create the effect\r\n */\r\n engine: ThinEngine;\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\r\n */\r\n vertexShader?: string;\r\n /**\r\n * Attributes to use in the shader\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 * Texture sampler names to use in the shader\r\n */\r\n samplerNames?: Array<string>;\r\n /**\r\n * Defines to use in the shader\r\n */\r\n defines?: Array<string>;\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 displayed in Spector.\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\r\n/**\r\n * Wraps an effect to be used for rendering\r\n */\r\nexport class EffectWrapper {\r\n /**\r\n * Event that is fired right before the effect is drawn (should be used to update uniforms)\r\n */\r\n public onApplyObservable = new Observable<{}>();\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 /** @internal */\r\n public _drawWrapper: DrawWrapper;\r\n\r\n private _onContextRestoredObserver: Nullable<Observer<ThinEngine>>;\r\n\r\n /**\r\n * Creates an effect to be renderer\r\n * @param creationOptions options to create the effect\r\n */\r\n constructor(creationOptions: EffectWrapperCreationOptions) {\r\n let effectCreationOptions: any;\r\n const uniformNames = creationOptions.uniformNames || [];\r\n\r\n if (creationOptions.vertexShader) {\r\n effectCreationOptions = {\r\n fragmentSource: creationOptions.fragmentShader,\r\n vertexSource: creationOptions.vertexShader,\r\n spectorName: creationOptions.name || \"effectWrapper\",\r\n };\r\n } else {\r\n // Default scale to use in post process vertex shader.\r\n uniformNames.push(\"scale\");\r\n\r\n effectCreationOptions = {\r\n fragmentSource: creationOptions.fragmentShader,\r\n vertex: \"postprocess\",\r\n spectorName: creationOptions.name || \"effectWrapper\",\r\n };\r\n\r\n // Sets the default scale to identity for the post process vertex shader.\r\n this.onApplyObservable.add(() => {\r\n this.effect.setFloat2(\"scale\", 1, 1);\r\n });\r\n }\r\n\r\n const defines = creationOptions.defines ? creationOptions.defines.join(\"\\n\") : \"\";\r\n this._drawWrapper = new DrawWrapper(creationOptions.engine);\r\n\r\n if (creationOptions.useShaderStore) {\r\n effectCreationOptions.fragment = effectCreationOptions.fragmentSource;\r\n if (!effectCreationOptions.vertex) {\r\n effectCreationOptions.vertex = effectCreationOptions.vertexSource;\r\n }\r\n\r\n delete effectCreationOptions.fragmentSource;\r\n delete effectCreationOptions.vertexSource;\r\n\r\n this.effect = creationOptions.engine.createEffect(\r\n effectCreationOptions,\r\n creationOptions.attributeNames || [\"position\"],\r\n uniformNames,\r\n creationOptions.samplerNames,\r\n defines,\r\n undefined,\r\n creationOptions.onCompiled,\r\n undefined,\r\n undefined,\r\n creationOptions.shaderLanguage\r\n );\r\n } else {\r\n this.effect = new Effect(\r\n effectCreationOptions,\r\n creationOptions.attributeNames || [\"position\"],\r\n uniformNames,\r\n creationOptions.samplerNames,\r\n creationOptions.engine,\r\n defines,\r\n undefined,\r\n creationOptions.onCompiled,\r\n undefined,\r\n undefined,\r\n undefined,\r\n creationOptions.shaderLanguage\r\n );\r\n\r\n this._onContextRestoredObserver = creationOptions.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._wasPreviouslyReady = false;\r\n this.effect._prepareEffect();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the effect wrapper\r\n */\r\n public dispose() {\r\n if (this._onContextRestoredObserver) {\r\n this.effect.getEngine().onContextRestoredObservable.remove(this._onContextRestoredObserver);\r\n this._onContextRestoredObserver = null;\r\n }\r\n this.effect.dispose();\r\n }\r\n}\r\n"]}
|
package/Meshes/mesh.d.ts
CHANGED
|
@@ -181,7 +181,7 @@ export declare class Mesh extends AbstractMesh implements IGetSetVerticesData {
|
|
|
181
181
|
static _GetDefaultSideOrientation(orientation?: number): number;
|
|
182
182
|
private _internalMeshDataInfo;
|
|
183
183
|
/**
|
|
184
|
-
* Determines if the LOD levels are intended to be calculated using screen coverage (surface area ratio) instead of distance
|
|
184
|
+
* Determines if the LOD levels are intended to be calculated using screen coverage (surface area ratio) instead of distance.
|
|
185
185
|
*/
|
|
186
186
|
get useLODScreenCoverage(): boolean;
|
|
187
187
|
set useLODScreenCoverage(value: boolean);
|
|
@@ -346,6 +346,8 @@ export declare class Mesh extends AbstractMesh implements IGetSetVerticesData {
|
|
|
346
346
|
* @see https://doc.babylonjs.com/how_to/how_to_use_lod
|
|
347
347
|
* @param distanceOrScreenCoverage Either distance from the center of the object to show this level or the screen coverage if `useScreenCoverage` is set to `true`.
|
|
348
348
|
* If screen coverage, value is a fraction of the screen's total surface, between 0 and 1.
|
|
349
|
+
* Example Playground for distance https://playground.babylonjs.com/#QE7KM#197
|
|
350
|
+
* Example Playground for screen coverage https://playground.babylonjs.com/#QE7KM#196
|
|
349
351
|
* @param mesh The mesh to be added as LOD level (can be null)
|
|
350
352
|
* @returns This mesh (for chaining)
|
|
351
353
|
*/
|
package/Meshes/mesh.js
CHANGED
|
@@ -314,13 +314,14 @@ export class Mesh extends AbstractMesh {
|
|
|
314
314
|
return orientation || Mesh.FRONTSIDE; // works as Mesh.FRONTSIDE is 0
|
|
315
315
|
}
|
|
316
316
|
/**
|
|
317
|
-
* Determines if the LOD levels are intended to be calculated using screen coverage (surface area ratio) instead of distance
|
|
317
|
+
* Determines if the LOD levels are intended to be calculated using screen coverage (surface area ratio) instead of distance.
|
|
318
318
|
*/
|
|
319
319
|
get useLODScreenCoverage() {
|
|
320
320
|
return this._internalMeshDataInfo._useLODScreenCoverage;
|
|
321
321
|
}
|
|
322
322
|
set useLODScreenCoverage(value) {
|
|
323
323
|
this._internalMeshDataInfo._useLODScreenCoverage = value;
|
|
324
|
+
this._sortLODLevels();
|
|
324
325
|
}
|
|
325
326
|
get computeBonesUsingShaders() {
|
|
326
327
|
return this._internalAbstractMeshDataInfo._computeBonesUsingShaders;
|
|
@@ -567,6 +568,8 @@ export class Mesh extends AbstractMesh {
|
|
|
567
568
|
* @see https://doc.babylonjs.com/how_to/how_to_use_lod
|
|
568
569
|
* @param distanceOrScreenCoverage Either distance from the center of the object to show this level or the screen coverage if `useScreenCoverage` is set to `true`.
|
|
569
570
|
* If screen coverage, value is a fraction of the screen's total surface, between 0 and 1.
|
|
571
|
+
* Example Playground for distance https://playground.babylonjs.com/#QE7KM#197
|
|
572
|
+
* Example Playground for screen coverage https://playground.babylonjs.com/#QE7KM#196
|
|
570
573
|
* @param mesh The mesh to be added as LOD level (can be null)
|
|
571
574
|
* @returns This mesh (for chaining)
|
|
572
575
|
*/
|