@onerjs/core 8.44.9 → 8.45.1
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/Engines/engine.d.ts +25 -0
- package/Engines/thinEngine.js +2 -0
- package/Engines/thinEngine.js.map +1 -1
- package/Gizmos/boundingBoxGizmo.d.ts +2 -0
- package/Gizmos/boundingBoxGizmo.js +56 -7
- package/Gizmos/boundingBoxGizmo.js.map +1 -1
- package/Layers/thinEffectLayer.js +1 -2
- package/Layers/thinEffectLayer.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.d.ts +2 -2
- package/Materials/Textures/renderTargetTexture.js +2 -2
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Misc/stringTools.js +20 -14
- package/Misc/stringTools.js.map +1 -1
- package/Misc/thinMinMaxReducer.js +4 -3
- package/Misc/thinMinMaxReducer.js.map +1 -1
- package/PostProcesses/thinAnaglyphPostProcess.js +2 -2
- package/PostProcesses/thinAnaglyphPostProcess.js.map +1 -1
- package/PostProcesses/thinBlackAndWhitePostProcess.js +2 -2
- package/PostProcesses/thinBlackAndWhitePostProcess.js.map +1 -1
- package/PostProcesses/thinBloomMergePostProcess.js +2 -2
- package/PostProcesses/thinBloomMergePostProcess.js.map +1 -1
- package/PostProcesses/thinBlurPostProcess.js +2 -2
- package/PostProcesses/thinBlurPostProcess.js.map +1 -1
- package/PostProcesses/thinChromaticAberrationPostProcess.js +2 -2
- package/PostProcesses/thinChromaticAberrationPostProcess.js.map +1 -1
- package/PostProcesses/thinCircleOfConfusionPostProcess.js +2 -2
- package/PostProcesses/thinCircleOfConfusionPostProcess.js.map +1 -1
- package/PostProcesses/thinConvolutionPostProcess.js +2 -2
- package/PostProcesses/thinConvolutionPostProcess.js.map +1 -1
- package/PostProcesses/thinCustomPostProcess.js +2 -2
- package/PostProcesses/thinCustomPostProcess.js.map +1 -1
- package/PostProcesses/thinDepthOfFieldMergePostProcess.js +2 -2
- package/PostProcesses/thinDepthOfFieldMergePostProcess.js.map +1 -1
- package/PostProcesses/thinExtractHighlightsPostProcess.js +2 -2
- package/PostProcesses/thinExtractHighlightsPostProcess.js.map +1 -1
- package/PostProcesses/thinFXAAPostProcess.js +2 -2
- package/PostProcesses/thinFXAAPostProcess.js.map +1 -1
- package/PostProcesses/thinFilterPostProcess.js +2 -2
- package/PostProcesses/thinFilterPostProcess.js.map +1 -1
- package/PostProcesses/thinGrainPostProcess.js +2 -2
- package/PostProcesses/thinGrainPostProcess.js.map +1 -1
- package/PostProcesses/thinImageProcessingPostProcess.js +1 -2
- package/PostProcesses/thinImageProcessingPostProcess.js.map +1 -1
- package/PostProcesses/thinPassPostProcess.js +4 -4
- package/PostProcesses/thinPassPostProcess.js.map +1 -1
- package/PostProcesses/thinSSAO2BlurPostProcess.js +2 -2
- package/PostProcesses/thinSSAO2BlurPostProcess.js.map +1 -1
- package/PostProcesses/thinSSAO2CombinePostProcess.js +2 -2
- package/PostProcesses/thinSSAO2CombinePostProcess.js.map +1 -1
- package/PostProcesses/thinSSRBlurCombinerPostProcess.js +2 -2
- package/PostProcesses/thinSSRBlurCombinerPostProcess.js.map +1 -1
- package/PostProcesses/thinSSRBlurPostProcess.js +2 -2
- package/PostProcesses/thinSSRBlurPostProcess.js.map +1 -1
- package/PostProcesses/thinScreenSpaceCurvaturePostProcess.js +2 -2
- package/PostProcesses/thinScreenSpaceCurvaturePostProcess.js.map +1 -1
- package/PostProcesses/thinSharpenPostProcess.js +2 -2
- package/PostProcesses/thinSharpenPostProcess.js.map +1 -1
- package/PostProcesses/thinTonemapPostProcess.js +2 -2
- package/PostProcesses/thinTonemapPostProcess.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +2 -3
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +1 -2
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
- package/Rendering/iblCdfGenerator.js +1 -2
- package/Rendering/iblCdfGenerator.js.map +1 -1
- package/Rendering/objectRenderer.d.ts +8 -2
- package/Rendering/objectRenderer.js +8 -2
- package/Rendering/objectRenderer.js.map +1 -1
- package/XR/features/WebXRControllerPointerSelection.d.ts +25 -0
- package/XR/features/WebXRControllerPointerSelection.js +76 -0
- package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
- package/XR/features/WebXRControllerTeleportation.d.ts +13 -0
- package/XR/features/WebXRControllerTeleportation.js +38 -11
- package/XR/features/WebXRControllerTeleportation.js.map +1 -1
- package/package.json +1 -1
- package/scene.js +6 -0
- package/scene.js.map +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
2
|
-
import {
|
|
2
|
+
import { EngineStore } from "../Engines/engineStore.js";
|
|
3
3
|
/**
|
|
4
4
|
* Postprocess used to generate anaglyphic rendering
|
|
5
5
|
*/
|
|
@@ -23,7 +23,7 @@ export class ThinAnaglyphPostProcess extends EffectWrapper {
|
|
|
23
23
|
super({
|
|
24
24
|
...options,
|
|
25
25
|
name,
|
|
26
|
-
engine: engine ||
|
|
26
|
+
engine: engine || EngineStore.LastCreatedEngine,
|
|
27
27
|
useShaderStore: true,
|
|
28
28
|
useAsPostProcess: true,
|
|
29
29
|
fragmentShader: ThinAnaglyphPostProcess.FragmentUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinAnaglyphPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinAnaglyphPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"thinAnaglyphPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinAnaglyphPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD;;GAEG;AACH,MAAM,OAAO,uBAAwB,SAAQ,aAAa;IAWnC,cAAc,CAAC,SAAkB,EAAE,IAAoB;QACtE,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,YAAY,IAAY,EAAE,SAAmC,IAAI,EAAE,OAAsC;QACrG,KAAK,CAAC;YACF,GAAG,OAAO;YACV,IAAI;YACJ,MAAM,EAAE,MAAM,IAAI,WAAW,CAAC,iBAAkB;YAChD,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,uBAAuB,CAAC,WAAW;YACnD,QAAQ,EAAE,uBAAuB,CAAC,QAAQ;SAC7C,CAAC,CAAC;IACP,CAAC;;AAnCD;;GAEG;AACoB,mCAAW,GAAG,UAAU,CAAC;AAEhD;;GAEG;AACoB,gCAAQ,GAAG,CAAC,aAAa,CAAC,CAAC","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\n/**\r\n * Postprocess used to generate anaglyphic rendering\r\n */\r\nexport class ThinAnaglyphPostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"anaglyph\";\r\n\r\n /**\r\n * The list of samplers used by the effect\r\n */\r\n public static readonly Samplers = [\"leftSampler\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/anaglyph.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/anaglyph.fragment\"));\r\n }\r\n }\r\n\r\n /**\r\n * Constructs a new anaglyph post process\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || EngineStore.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinAnaglyphPostProcess.FragmentUrl,\r\n samplers: ThinAnaglyphPostProcess.Samplers,\r\n });\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
2
|
-
import {
|
|
2
|
+
import { EngineStore } from "../Engines/engineStore.js";
|
|
3
3
|
/**
|
|
4
4
|
* Post process used to render in black and white
|
|
5
5
|
*/
|
|
@@ -23,7 +23,7 @@ export class ThinBlackAndWhitePostProcess extends EffectWrapper {
|
|
|
23
23
|
super({
|
|
24
24
|
...options,
|
|
25
25
|
name,
|
|
26
|
-
engine: engine ||
|
|
26
|
+
engine: engine || EngineStore.LastCreatedEngine,
|
|
27
27
|
useShaderStore: true,
|
|
28
28
|
useAsPostProcess: true,
|
|
29
29
|
fragmentShader: ThinBlackAndWhitePostProcess.FragmentUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinBlackAndWhitePostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinBlackAndWhitePostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"thinBlackAndWhitePostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinBlackAndWhitePostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD;;GAEG;AACH,MAAM,OAAO,4BAA6B,SAAQ,aAAa;IAWxC,cAAc,CAAC,SAAkB,EAAE,IAAoB;QACtE,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC3D,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,YAAY,IAAY,EAAE,SAAmC,IAAI,EAAE,OAAsC;QACrG,KAAK,CAAC;YACF,GAAG,OAAO;YACV,IAAI;YACJ,MAAM,EAAE,MAAM,IAAI,WAAW,CAAC,iBAAkB;YAChD,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,4BAA4B,CAAC,WAAW;YACxD,QAAQ,EAAE,4BAA4B,CAAC,QAAQ;SAClD,CAAC,CAAC;QAGP;;WAEG;QACI,WAAM,GAAG,CAAC,CAAC;IALlB,CAAC;IAOe,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAC1C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,MAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9D,CAAC;;AA7CD;;GAEG;AACoB,wCAAW,GAAG,eAAe,AAAlB,CAAmB;AAErD;;GAEG;AACoB,qCAAQ,GAAG,CAAC,QAAQ,CAAC,AAAb,CAAc","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\n/**\r\n * Post process used to render in black and white\r\n */\r\nexport class ThinBlackAndWhitePostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"blackAndWhite\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"degree\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/blackAndWhite.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/blackAndWhite.fragment\"));\r\n }\r\n }\r\n\r\n /**\r\n * Constructs a new black and white post process\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || EngineStore.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinBlackAndWhitePostProcess.FragmentUrl,\r\n uniforms: ThinBlackAndWhitePostProcess.Uniforms,\r\n });\r\n }\r\n\r\n /**\r\n * Effect intensity (default: 1)\r\n */\r\n public degree = 1;\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n this._drawWrapper.effect!.setFloat(\"degree\", this.degree);\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
2
|
-
import {
|
|
2
|
+
import { EngineStore } from "../Engines/engineStore.js";
|
|
3
3
|
/**
|
|
4
4
|
* @internal
|
|
5
5
|
*/
|
|
@@ -17,7 +17,7 @@ export class ThinBloomMergePostProcess extends EffectWrapper {
|
|
|
17
17
|
super({
|
|
18
18
|
...options,
|
|
19
19
|
name,
|
|
20
|
-
engine: engine ||
|
|
20
|
+
engine: engine || EngineStore.LastCreatedEngine,
|
|
21
21
|
useShaderStore: true,
|
|
22
22
|
useAsPostProcess: true,
|
|
23
23
|
fragmentShader: ThinBloomMergePostProcess.FragmentUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinBloomMergePostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinBloomMergePostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"thinBloomMergePostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinBloomMergePostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,aAAa;IAOrC,cAAc,CAAC,SAAkB,EAAE,IAAoB;QACtE,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC;QACxD,CAAC;IACL,CAAC;IAED,YAAY,IAAY,EAAE,SAAmC,IAAI,EAAE,OAAsC;QACrG,KAAK,CAAC;YACF,GAAG,OAAO;YACV,IAAI;YACJ,MAAM,EAAE,MAAM,IAAI,WAAW,CAAC,iBAAkB;YAChD,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,yBAAyB,CAAC,WAAW;YACrD,QAAQ,EAAE,yBAAyB,CAAC,QAAQ;YAC5C,QAAQ,EAAE,yBAAyB,CAAC,QAAQ;SAC/C,CAAC,CAAC;QAGP,6DAA6D;QACtD,WAAM,GAAG,CAAC,CAAC;IAHlB,CAAC;IAKe,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAC1C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,MAAO,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnE,CAAC;;AAlCsB,qCAAW,GAAG,YAAY,AAAf,CAAgB;AAE3B,kCAAQ,GAAG,CAAC,aAAa,CAAC,AAAlB,CAAmB;AAE3B,kCAAQ,GAAG,CAAC,WAAW,CAAC,AAAhB,CAAiB","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ThinBloomMergePostProcess extends EffectWrapper {\r\n public static readonly FragmentUrl = \"bloomMerge\";\r\n\r\n public static readonly Uniforms = [\"bloomWeight\"];\r\n\r\n public static readonly Samplers = [\"bloomBlur\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/bloomMerge.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/bloomMerge.fragment\"));\r\n }\r\n }\r\n\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || EngineStore.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinBloomMergePostProcess.FragmentUrl,\r\n uniforms: ThinBloomMergePostProcess.Uniforms,\r\n samplers: ThinBloomMergePostProcess.Samplers,\r\n });\r\n }\r\n\r\n /** Weight of the bloom to be added to the original input. */\r\n public weight = 1;\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n this._drawWrapper.effect!.setFloat(\"bloomWeight\", this.weight);\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
2
|
-
import {
|
|
2
|
+
import { EngineStore } from "../Engines/engineStore.js";
|
|
3
3
|
/**
|
|
4
4
|
* Post process used to apply a blur effect
|
|
5
5
|
*/
|
|
@@ -26,7 +26,7 @@ export class ThinBlurPostProcess extends EffectWrapper {
|
|
|
26
26
|
super({
|
|
27
27
|
...options,
|
|
28
28
|
name,
|
|
29
|
-
engine: engine ||
|
|
29
|
+
engine: engine || EngineStore.LastCreatedEngine,
|
|
30
30
|
useShaderStore: true,
|
|
31
31
|
useAsPostProcess: true,
|
|
32
32
|
fragmentShader: ThinBlurPostProcess.FragmentUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinBlurPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinBlurPostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions, Vector2, Effect } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\nimport { Engine } from \"../Engines/engine\";\r\n\r\n/**\r\n * Post process used to apply a blur effect\r\n */\r\nexport class ThinBlurPostProcess extends EffectWrapper {\r\n /**\r\n * The vertex shader url\r\n */\r\n public static readonly VertexUrl = \"kernelBlur\";\r\n\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"kernelBlur\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"delta\", \"direction\"];\r\n\r\n /**\r\n * The list of samplers used by the effect\r\n */\r\n public static readonly Samplers = [\"circleOfConfusionSampler\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(Promise.all([import(\"../ShadersWGSL/kernelBlur.fragment\"), import(\"../ShadersWGSL/kernelBlur.vertex\")]));\r\n } else {\r\n list.push(Promise.all([import(\"../Shaders/kernelBlur.fragment\"), import(\"../Shaders/kernelBlur.vertex\")]));\r\n }\r\n }\r\n\r\n protected _kernel: number;\r\n protected _idealKernel: number;\r\n protected _packedFloat: boolean = false;\r\n private _staticDefines: string = \"\";\r\n\r\n /**\r\n * Constructs a new blur post process\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param direction Direction in which to apply the blur\r\n * @param kernel Kernel size of the blur\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, direction?: Vector2, kernel?: number, options?: EffectWrapperCreationOptions) {\r\n const blockCompilationFinal = !!options?.blockCompilation;\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || Engine.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinBlurPostProcess.FragmentUrl,\r\n uniforms: ThinBlurPostProcess.Uniforms,\r\n samplers: ThinBlurPostProcess.Samplers,\r\n vertexUrl: ThinBlurPostProcess.VertexUrl,\r\n blockCompilation: true,\r\n });\r\n\r\n this._staticDefines = options ? (Array.isArray(options.defines) ? options.defines.join(\"\\n\") : options.defines || \"\") : \"\";\r\n\r\n this.options.blockCompilation = blockCompilationFinal;\r\n\r\n if (direction !== undefined) {\r\n this.direction = direction;\r\n }\r\n if (kernel !== undefined) {\r\n this.kernel = kernel;\r\n }\r\n }\r\n\r\n /**\r\n * Width of the texture to apply the blur on\r\n */\r\n public textureWidth: number = 0;\r\n\r\n /**\r\n * Height of the texture to apply the blur on\r\n */\r\n public textureHeight: number = 0;\r\n\r\n /** The direction in which to blur the image. */\r\n public direction: Vector2;\r\n\r\n /**\r\n * Sets the length in pixels of the blur sample region\r\n */\r\n public set kernel(v: number) {\r\n if (this._idealKernel === v) {\r\n return;\r\n }\r\n\r\n v = Math.max(v, 1);\r\n this._idealKernel = v;\r\n this._kernel = this._nearestBestKernel(v);\r\n if (!this.options.blockCompilation) {\r\n this._updateParameters();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the length in pixels of the blur sample region\r\n */\r\n public get kernel(): number {\r\n return this._idealKernel;\r\n }\r\n\r\n /**\r\n * Sets whether or not the blur needs to unpack/repack floats\r\n */\r\n public set packedFloat(v: boolean) {\r\n if (this._packedFloat === v) {\r\n return;\r\n }\r\n this._packedFloat = v;\r\n if (!this.options.blockCompilation) {\r\n this._updateParameters();\r\n }\r\n }\r\n\r\n /**\r\n * Gets whether or not the blur is unpacking/repacking floats\r\n */\r\n public get packedFloat(): boolean {\r\n return this._packedFloat;\r\n }\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n this._drawWrapper.effect!.setFloat2(\"delta\", (1 / this.textureWidth) * this.direction.x, (1 / this.textureHeight) * this.direction.y);\r\n }\r\n\r\n /** @internal */\r\n public _updateParameters(onCompiled?: (effect: Effect) => void, onError?: (effect: Effect, errors: string) => void): void {\r\n // Generate sampling offsets and weights\r\n const n = this._kernel;\r\n const centerIndex = (n - 1) / 2;\r\n\r\n // Generate Gaussian sampling weights over kernel\r\n let offsets = [];\r\n let weights = [];\r\n let totalWeight = 0;\r\n for (let i = 0; i < n; i++) {\r\n const u = i / (n - 1);\r\n const w = this._gaussianWeight(u * 2.0 - 1);\r\n offsets[i] = i - centerIndex;\r\n weights[i] = w;\r\n totalWeight += w;\r\n }\r\n\r\n // Normalize weights\r\n for (let i = 0; i < weights.length; i++) {\r\n weights[i] /= totalWeight;\r\n }\r\n\r\n // Optimize: combine samples to take advantage of hardware linear sampling\r\n // Walk from left to center, combining pairs (symmetrically)\r\n const linearSamplingWeights = [];\r\n const linearSamplingOffsets = [];\r\n\r\n const linearSamplingMap = [];\r\n\r\n for (let i = 0; i <= centerIndex; i += 2) {\r\n const j = Math.min(i + 1, Math.floor(centerIndex));\r\n\r\n const singleCenterSample = i === j;\r\n\r\n if (singleCenterSample) {\r\n linearSamplingMap.push({ o: offsets[i], w: weights[i] });\r\n } else {\r\n const sharedCell = j === centerIndex;\r\n\r\n const weightLinear = weights[i] + weights[j] * (sharedCell ? 0.5 : 1);\r\n const offsetLinear = offsets[i] + 1 / (1 + weights[i] / weights[j]);\r\n\r\n if (offsetLinear === 0) {\r\n linearSamplingMap.push({ o: offsets[i], w: weights[i] });\r\n linearSamplingMap.push({ o: offsets[i + 1], w: weights[i + 1] });\r\n } else {\r\n linearSamplingMap.push({ o: offsetLinear, w: weightLinear });\r\n linearSamplingMap.push({ o: -offsetLinear, w: weightLinear });\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < linearSamplingMap.length; i++) {\r\n linearSamplingOffsets[i] = linearSamplingMap[i].o;\r\n linearSamplingWeights[i] = linearSamplingMap[i].w;\r\n }\r\n\r\n // Replace with optimized\r\n offsets = linearSamplingOffsets;\r\n weights = linearSamplingWeights;\r\n\r\n // Generate shaders\r\n const maxVaryingRows = this.options.engine.getCaps().maxVaryingVectors - (this.options.shaderLanguage === ShaderLanguage.WGSL ? 1 : 0); // Because of the additional builtins\r\n const freeVaryingVec2 = Math.max(maxVaryingRows, 0) - 1; // Because of sampleCenter\r\n\r\n let varyingCount = Math.min(offsets.length, freeVaryingVec2);\r\n\r\n let defines = \"\";\r\n defines += this._staticDefines;\r\n\r\n // The DOF fragment should ignore the center pixel when looping as it is handled manually in the fragment shader.\r\n if (this._staticDefines.indexOf(\"DOF\") != -1) {\r\n defines += `#define CENTER_WEIGHT ${this._glslFloat(weights[varyingCount - 1])}\\n`;\r\n varyingCount--;\r\n }\r\n\r\n for (let i = 0; i < varyingCount; i++) {\r\n defines += `#define KERNEL_OFFSET${i} ${this._glslFloat(offsets[i])}\\n`;\r\n defines += `#define KERNEL_WEIGHT${i} ${this._glslFloat(weights[i])}\\n`;\r\n }\r\n\r\n let depCount = 0;\r\n for (let i = freeVaryingVec2; i < offsets.length; i++) {\r\n defines += `#define KERNEL_DEP_OFFSET${depCount} ${this._glslFloat(offsets[i])}\\n`;\r\n defines += `#define KERNEL_DEP_WEIGHT${depCount} ${this._glslFloat(weights[i])}\\n`;\r\n depCount++;\r\n }\r\n\r\n if (this.packedFloat) {\r\n defines += `#define PACKEDFLOAT 1`;\r\n }\r\n\r\n this.options.blockCompilation = false;\r\n\r\n this.updateEffect(\r\n defines,\r\n null,\r\n null,\r\n {\r\n varyingCount: varyingCount,\r\n depCount: depCount,\r\n },\r\n onCompiled,\r\n onError\r\n );\r\n }\r\n\r\n /**\r\n * Best kernels are odd numbers that when divided by 2, their integer part is even, so 5, 9 or 13.\r\n * Other odd kernels optimize correctly but require proportionally more samples, even kernels are\r\n * possible but will produce minor visual artifacts. Since each new kernel requires a new shader we\r\n * want to minimize kernel changes, having gaps between physical kernels is helpful in that regard.\r\n * The gaps between physical kernels are compensated for in the weighting of the samples\r\n * @param idealKernel Ideal blur kernel.\r\n * @returns Nearest best kernel.\r\n */\r\n protected _nearestBestKernel(idealKernel: number): number {\r\n const v = Math.round(idealKernel);\r\n for (const k of [v, v - 1, v + 1, v - 2, v + 2]) {\r\n if (k % 2 !== 0 && Math.floor(k / 2) % 2 === 0 && k > 0) {\r\n return Math.max(k, 3);\r\n }\r\n }\r\n return Math.max(v, 3);\r\n }\r\n\r\n /**\r\n * Calculates the value of a Gaussian distribution with sigma 3 at a given point.\r\n * @param x The point on the Gaussian distribution to sample.\r\n * @returns the value of the Gaussian function at x.\r\n */\r\n protected _gaussianWeight(x: number): number {\r\n //reference: Engines/ImageProcessingBlur.cpp #dcc760\r\n // We are evaluating the Gaussian (normal) distribution over a kernel parameter space of [-1,1],\r\n // so we truncate at three standard deviations by setting stddev (sigma) to 1/3.\r\n // The choice of 3-sigma truncation is common but arbitrary, and means that the signal is\r\n // truncated at around 1.3% of peak strength.\r\n\r\n //the distribution is scaled to account for the difference between the actual kernel size and the requested kernel size\r\n const sigma = 1 / 3;\r\n const denominator = Math.sqrt(2.0 * Math.PI) * sigma;\r\n const exponent = -((x * x) / (2.0 * sigma * sigma));\r\n const weight = (1.0 / denominator) * Math.exp(exponent);\r\n return weight;\r\n }\r\n\r\n /**\r\n * Generates a string that can be used as a floating point number in GLSL.\r\n * @param x Value to print.\r\n * @param decimalFigures Number of decimal places to print the number to (excluding trailing 0s).\r\n * @returns GLSL float string.\r\n */\r\n protected _glslFloat(x: number, decimalFigures = 8) {\r\n return x.toFixed(decimalFigures).replace(/0+$/, \"\");\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"thinBlurPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinBlurPostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions, Vector2, Effect } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\n/**\r\n * Post process used to apply a blur effect\r\n */\r\nexport class ThinBlurPostProcess extends EffectWrapper {\r\n /**\r\n * The vertex shader url\r\n */\r\n public static readonly VertexUrl = \"kernelBlur\";\r\n\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"kernelBlur\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"delta\", \"direction\"];\r\n\r\n /**\r\n * The list of samplers used by the effect\r\n */\r\n public static readonly Samplers = [\"circleOfConfusionSampler\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(Promise.all([import(\"../ShadersWGSL/kernelBlur.fragment\"), import(\"../ShadersWGSL/kernelBlur.vertex\")]));\r\n } else {\r\n list.push(Promise.all([import(\"../Shaders/kernelBlur.fragment\"), import(\"../Shaders/kernelBlur.vertex\")]));\r\n }\r\n }\r\n\r\n protected _kernel: number;\r\n protected _idealKernel: number;\r\n protected _packedFloat: boolean = false;\r\n private _staticDefines: string = \"\";\r\n\r\n /**\r\n * Constructs a new blur post process\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param direction Direction in which to apply the blur\r\n * @param kernel Kernel size of the blur\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, direction?: Vector2, kernel?: number, options?: EffectWrapperCreationOptions) {\r\n const blockCompilationFinal = !!options?.blockCompilation;\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || EngineStore.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinBlurPostProcess.FragmentUrl,\r\n uniforms: ThinBlurPostProcess.Uniforms,\r\n samplers: ThinBlurPostProcess.Samplers,\r\n vertexUrl: ThinBlurPostProcess.VertexUrl,\r\n blockCompilation: true,\r\n });\r\n\r\n this._staticDefines = options ? (Array.isArray(options.defines) ? options.defines.join(\"\\n\") : options.defines || \"\") : \"\";\r\n\r\n this.options.blockCompilation = blockCompilationFinal;\r\n\r\n if (direction !== undefined) {\r\n this.direction = direction;\r\n }\r\n if (kernel !== undefined) {\r\n this.kernel = kernel;\r\n }\r\n }\r\n\r\n /**\r\n * Width of the texture to apply the blur on\r\n */\r\n public textureWidth: number = 0;\r\n\r\n /**\r\n * Height of the texture to apply the blur on\r\n */\r\n public textureHeight: number = 0;\r\n\r\n /** The direction in which to blur the image. */\r\n public direction: Vector2;\r\n\r\n /**\r\n * Sets the length in pixels of the blur sample region\r\n */\r\n public set kernel(v: number) {\r\n if (this._idealKernel === v) {\r\n return;\r\n }\r\n\r\n v = Math.max(v, 1);\r\n this._idealKernel = v;\r\n this._kernel = this._nearestBestKernel(v);\r\n if (!this.options.blockCompilation) {\r\n this._updateParameters();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the length in pixels of the blur sample region\r\n */\r\n public get kernel(): number {\r\n return this._idealKernel;\r\n }\r\n\r\n /**\r\n * Sets whether or not the blur needs to unpack/repack floats\r\n */\r\n public set packedFloat(v: boolean) {\r\n if (this._packedFloat === v) {\r\n return;\r\n }\r\n this._packedFloat = v;\r\n if (!this.options.blockCompilation) {\r\n this._updateParameters();\r\n }\r\n }\r\n\r\n /**\r\n * Gets whether or not the blur is unpacking/repacking floats\r\n */\r\n public get packedFloat(): boolean {\r\n return this._packedFloat;\r\n }\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n this._drawWrapper.effect!.setFloat2(\"delta\", (1 / this.textureWidth) * this.direction.x, (1 / this.textureHeight) * this.direction.y);\r\n }\r\n\r\n /** @internal */\r\n public _updateParameters(onCompiled?: (effect: Effect) => void, onError?: (effect: Effect, errors: string) => void): void {\r\n // Generate sampling offsets and weights\r\n const n = this._kernel;\r\n const centerIndex = (n - 1) / 2;\r\n\r\n // Generate Gaussian sampling weights over kernel\r\n let offsets = [];\r\n let weights = [];\r\n let totalWeight = 0;\r\n for (let i = 0; i < n; i++) {\r\n const u = i / (n - 1);\r\n const w = this._gaussianWeight(u * 2.0 - 1);\r\n offsets[i] = i - centerIndex;\r\n weights[i] = w;\r\n totalWeight += w;\r\n }\r\n\r\n // Normalize weights\r\n for (let i = 0; i < weights.length; i++) {\r\n weights[i] /= totalWeight;\r\n }\r\n\r\n // Optimize: combine samples to take advantage of hardware linear sampling\r\n // Walk from left to center, combining pairs (symmetrically)\r\n const linearSamplingWeights = [];\r\n const linearSamplingOffsets = [];\r\n\r\n const linearSamplingMap = [];\r\n\r\n for (let i = 0; i <= centerIndex; i += 2) {\r\n const j = Math.min(i + 1, Math.floor(centerIndex));\r\n\r\n const singleCenterSample = i === j;\r\n\r\n if (singleCenterSample) {\r\n linearSamplingMap.push({ o: offsets[i], w: weights[i] });\r\n } else {\r\n const sharedCell = j === centerIndex;\r\n\r\n const weightLinear = weights[i] + weights[j] * (sharedCell ? 0.5 : 1);\r\n const offsetLinear = offsets[i] + 1 / (1 + weights[i] / weights[j]);\r\n\r\n if (offsetLinear === 0) {\r\n linearSamplingMap.push({ o: offsets[i], w: weights[i] });\r\n linearSamplingMap.push({ o: offsets[i + 1], w: weights[i + 1] });\r\n } else {\r\n linearSamplingMap.push({ o: offsetLinear, w: weightLinear });\r\n linearSamplingMap.push({ o: -offsetLinear, w: weightLinear });\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < linearSamplingMap.length; i++) {\r\n linearSamplingOffsets[i] = linearSamplingMap[i].o;\r\n linearSamplingWeights[i] = linearSamplingMap[i].w;\r\n }\r\n\r\n // Replace with optimized\r\n offsets = linearSamplingOffsets;\r\n weights = linearSamplingWeights;\r\n\r\n // Generate shaders\r\n const maxVaryingRows = this.options.engine.getCaps().maxVaryingVectors - (this.options.shaderLanguage === ShaderLanguage.WGSL ? 1 : 0); // Because of the additional builtins\r\n const freeVaryingVec2 = Math.max(maxVaryingRows, 0) - 1; // Because of sampleCenter\r\n\r\n let varyingCount = Math.min(offsets.length, freeVaryingVec2);\r\n\r\n let defines = \"\";\r\n defines += this._staticDefines;\r\n\r\n // The DOF fragment should ignore the center pixel when looping as it is handled manually in the fragment shader.\r\n if (this._staticDefines.indexOf(\"DOF\") != -1) {\r\n defines += `#define CENTER_WEIGHT ${this._glslFloat(weights[varyingCount - 1])}\\n`;\r\n varyingCount--;\r\n }\r\n\r\n for (let i = 0; i < varyingCount; i++) {\r\n defines += `#define KERNEL_OFFSET${i} ${this._glslFloat(offsets[i])}\\n`;\r\n defines += `#define KERNEL_WEIGHT${i} ${this._glslFloat(weights[i])}\\n`;\r\n }\r\n\r\n let depCount = 0;\r\n for (let i = freeVaryingVec2; i < offsets.length; i++) {\r\n defines += `#define KERNEL_DEP_OFFSET${depCount} ${this._glslFloat(offsets[i])}\\n`;\r\n defines += `#define KERNEL_DEP_WEIGHT${depCount} ${this._glslFloat(weights[i])}\\n`;\r\n depCount++;\r\n }\r\n\r\n if (this.packedFloat) {\r\n defines += `#define PACKEDFLOAT 1`;\r\n }\r\n\r\n this.options.blockCompilation = false;\r\n\r\n this.updateEffect(\r\n defines,\r\n null,\r\n null,\r\n {\r\n varyingCount: varyingCount,\r\n depCount: depCount,\r\n },\r\n onCompiled,\r\n onError\r\n );\r\n }\r\n\r\n /**\r\n * Best kernels are odd numbers that when divided by 2, their integer part is even, so 5, 9 or 13.\r\n * Other odd kernels optimize correctly but require proportionally more samples, even kernels are\r\n * possible but will produce minor visual artifacts. Since each new kernel requires a new shader we\r\n * want to minimize kernel changes, having gaps between physical kernels is helpful in that regard.\r\n * The gaps between physical kernels are compensated for in the weighting of the samples\r\n * @param idealKernel Ideal blur kernel.\r\n * @returns Nearest best kernel.\r\n */\r\n protected _nearestBestKernel(idealKernel: number): number {\r\n const v = Math.round(idealKernel);\r\n for (const k of [v, v - 1, v + 1, v - 2, v + 2]) {\r\n if (k % 2 !== 0 && Math.floor(k / 2) % 2 === 0 && k > 0) {\r\n return Math.max(k, 3);\r\n }\r\n }\r\n return Math.max(v, 3);\r\n }\r\n\r\n /**\r\n * Calculates the value of a Gaussian distribution with sigma 3 at a given point.\r\n * @param x The point on the Gaussian distribution to sample.\r\n * @returns the value of the Gaussian function at x.\r\n */\r\n protected _gaussianWeight(x: number): number {\r\n //reference: Engines/ImageProcessingBlur.cpp #dcc760\r\n // We are evaluating the Gaussian (normal) distribution over a kernel parameter space of [-1,1],\r\n // so we truncate at three standard deviations by setting stddev (sigma) to 1/3.\r\n // The choice of 3-sigma truncation is common but arbitrary, and means that the signal is\r\n // truncated at around 1.3% of peak strength.\r\n\r\n //the distribution is scaled to account for the difference between the actual kernel size and the requested kernel size\r\n const sigma = 1 / 3;\r\n const denominator = Math.sqrt(2.0 * Math.PI) * sigma;\r\n const exponent = -((x * x) / (2.0 * sigma * sigma));\r\n const weight = (1.0 / denominator) * Math.exp(exponent);\r\n return weight;\r\n }\r\n\r\n /**\r\n * Generates a string that can be used as a floating point number in GLSL.\r\n * @param x Value to print.\r\n * @param decimalFigures Number of decimal places to print the number to (excluding trailing 0s).\r\n * @returns GLSL float string.\r\n */\r\n protected _glslFloat(x: number, decimalFigures = 8) {\r\n return x.toFixed(decimalFigures).replace(/0+$/, \"\");\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
2
|
-
import {
|
|
2
|
+
import { EngineStore } from "../Engines/engineStore.js";
|
|
3
3
|
import { Vector2 } from "../Maths/math.vector.js";
|
|
4
4
|
/**
|
|
5
5
|
* The ChromaticAberrationPostProcess separates the rgb channels in an image to produce chromatic distortion around the edges of the screen
|
|
@@ -24,7 +24,7 @@ export class ThinChromaticAberrationPostProcess extends EffectWrapper {
|
|
|
24
24
|
super({
|
|
25
25
|
...options,
|
|
26
26
|
name,
|
|
27
|
-
engine: engine ||
|
|
27
|
+
engine: engine || EngineStore.LastCreatedEngine,
|
|
28
28
|
useShaderStore: true,
|
|
29
29
|
useAsPostProcess: true,
|
|
30
30
|
fragmentShader: ThinChromaticAberrationPostProcess.FragmentUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinChromaticAberrationPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinChromaticAberrationPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"thinChromaticAberrationPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinChromaticAberrationPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C;;GAEG;AACH,MAAM,OAAO,kCAAmC,SAAQ,aAAa;IAW9C,cAAc,CAAC,SAAkB,EAAE,IAAoB;QACtE,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACjE,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,YAAY,IAAY,EAAE,SAAmC,IAAI,EAAE,OAAsC;QACrG,KAAK,CAAC;YACF,GAAG,OAAO;YACV,IAAI;YACJ,MAAM,EAAE,MAAM,IAAI,WAAW,CAAC,iBAAkB;YAChD,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,kCAAkC,CAAC,WAAW;YAC9D,QAAQ,EAAE,kCAAkC,CAAC,QAAQ;SACxD,CAAC,CAAC;QAGP;;WAEG;QACI,qBAAgB,GAAG,EAAE,CAAC;QAE7B;;WAEG;QACI,oBAAe,GAAG,CAAC,CAAC;QAE3B;;WAEG;QACI,cAAS,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAE7C;;WAEG;QACI,mBAAc,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IApB9C,CAAC;IA4Be,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAC1C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAO,CAAC;QAEzC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/D,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACzD,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC;;AA1ED;;GAEG;AACoB,8CAAW,GAAG,qBAAqB,AAAxB,CAAyB;AAE3D;;GAEG;AACoB,2CAAQ,GAAG,CAAC,sBAAsB,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,AAA9G,CAA+G","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Vector2 } from \"../Maths/math.vector\";\r\n\r\n/**\r\n * The ChromaticAberrationPostProcess separates the rgb channels in an image to produce chromatic distortion around the edges of the screen\r\n */\r\nexport class ThinChromaticAberrationPostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"chromaticAberration\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"chromatic_aberration\", \"screen_width\", \"screen_height\", \"direction\", \"radialIntensity\", \"centerPosition\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/chromaticAberration.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/chromaticAberration.fragment\"));\r\n }\r\n }\r\n\r\n /**\r\n * Constructs a new chromatic aberration post process\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || EngineStore.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinChromaticAberrationPostProcess.FragmentUrl,\r\n uniforms: ThinChromaticAberrationPostProcess.Uniforms,\r\n });\r\n }\r\n\r\n /**\r\n * The amount of separation of rgb channels (default: 30)\r\n */\r\n public aberrationAmount = 30;\r\n\r\n /**\r\n * The amount the effect will increase for pixels closer to the edge of the screen. (default: 0)\r\n */\r\n public radialIntensity = 0;\r\n\r\n /**\r\n * The normalized direction in which the rgb channels should be separated. If set to 0,0 radial direction will be used. (default: Vector2(0.707,0.707))\r\n */\r\n public direction = new Vector2(0.707, 0.707);\r\n\r\n /**\r\n * The center position where the radialIntensity should be around. [0.5,0.5 is center of screen, 1,1 is top right corner] (default: Vector2(0.5 ,0.5))\r\n */\r\n public centerPosition = new Vector2(0.5, 0.5);\r\n\r\n /** The width of the source texture to which the effect is applied */\r\n public screenWidth: number;\r\n\r\n /** The height of the source texture to which the effect is applied */\r\n public screenHeight: number;\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n\r\n const effect = this._drawWrapper.effect!;\r\n\r\n effect.setFloat(\"chromatic_aberration\", this.aberrationAmount);\r\n effect.setFloat(\"screen_width\", this.screenWidth);\r\n effect.setFloat(\"screen_height\", this.screenHeight);\r\n effect.setFloat(\"radialIntensity\", this.radialIntensity);\r\n effect.setFloat2(\"direction\", this.direction.x, this.direction.y);\r\n effect.setFloat2(\"centerPosition\", this.centerPosition.x, this.centerPosition.y);\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
2
|
-
import {
|
|
2
|
+
import { EngineStore } from "../Engines/engineStore.js";
|
|
3
3
|
/**
|
|
4
4
|
* Post process used to calculate the circle of confusion (used for depth of field, for example)
|
|
5
5
|
*/
|
|
@@ -23,7 +23,7 @@ export class ThinCircleOfConfusionPostProcess extends EffectWrapper {
|
|
|
23
23
|
super({
|
|
24
24
|
...options,
|
|
25
25
|
name,
|
|
26
|
-
engine: engine ||
|
|
26
|
+
engine: engine || EngineStore.LastCreatedEngine,
|
|
27
27
|
useShaderStore: true,
|
|
28
28
|
useAsPostProcess: true,
|
|
29
29
|
fragmentShader: ThinCircleOfConfusionPostProcess.FragmentUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinCircleOfConfusionPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinCircleOfConfusionPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"thinCircleOfConfusionPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinCircleOfConfusionPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAarD;;GAEG;AACH,MAAM,OAAO,gCAAiC,SAAQ,aAAa;IAqB5C,cAAc,CAAC,SAAkB,EAAE,IAAoB;QACtE,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,YAAY,IAAY,EAAE,SAAmC,IAAI,EAAE,OAAiD;QAChH,KAAK,CAAC;YACF,GAAG,OAAO;YACV,IAAI;YACJ,MAAM,EAAE,MAAM,IAAI,WAAW,CAAC,iBAAkB;YAChD,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,gCAAgC,CAAC,WAAW;YAC5D,QAAQ,EAAE,gCAAgC,CAAC,QAAQ;YACnD,QAAQ,EAAE,gCAAgC,CAAC,QAAQ;YACnD,OAAO,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,gCAAgC,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS;SAChH,CAAC,CAAC;QAQP;;WAEG;QACI,aAAQ,GAAG,EAAE,CAAC;QAErB;;WAEG;QACI,UAAK,GAAG,GAAG,CAAC;QAEnB;;WAEG;QACI,kBAAa,GAAG,IAAI,CAAC;QAE5B;;WAEG;QACI,gBAAW,GAAG,EAAE,CAAC;IAzBxB,CAAC;IA2Be,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAC1C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAkD,CAAC;QAExE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAO,CAAC;QAEzC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAC9B,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7F,CAAC;QAED,sGAAsG;QACtG,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5C,MAAM,iBAAiB,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,uFAAuF;QAE1L,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IAC5D,CAAC;;AA3FD;;GAEG;AACoB,4CAAW,GAAG,mBAAmB,AAAtB,CAAuB;AAEzD;;GAEG;AACoB,yCAAQ,GAAG,CAAC,eAAe,EAAE,eAAe,EAAE,mBAAmB,CAAC,AAA1D,CAA2D;AAE1F;;GAEG;AACoB,yCAAQ,GAAG,CAAC,cAAc,CAAC,AAAnB,CAAoB;AAEnD;;GAEG;AACoB,0DAAyB,GAAG,kCAAkC,AAArC,CAAsC","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\n/**\r\n * Options used to create a ThinCircleOfConfusionPostProcess.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface ThinCircleOfConfusionPostProcessOptions extends EffectWrapperCreationOptions {\r\n /**\r\n * If the (view) depth is normalized (0.0 to 1.0 from near to far) or not (0 to camera max distance)\r\n */\r\n depthNotNormalized?: boolean;\r\n}\r\n\r\n/**\r\n * Post process used to calculate the circle of confusion (used for depth of field, for example)\r\n */\r\nexport class ThinCircleOfConfusionPostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"circleOfConfusion\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"cameraMinMaxZ\", \"focusDistance\", \"cocPrecalculation\"];\r\n\r\n /**\r\n * The list of samplers used by the effect\r\n */\r\n public static readonly Samplers = [\"depthSampler\"];\r\n\r\n /**\r\n * Defines if the depth is normalized or not\r\n */\r\n public static readonly DefinesDepthNotNormalized = \"#define COC_DEPTH_NOT_NORMALIZED\";\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/circleOfConfusion.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/circleOfConfusion.fragment\"));\r\n }\r\n }\r\n\r\n /**\r\n * Constructs a new circle of confusion post process\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, options?: ThinCircleOfConfusionPostProcessOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || EngineStore.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinCircleOfConfusionPostProcess.FragmentUrl,\r\n uniforms: ThinCircleOfConfusionPostProcess.Uniforms,\r\n samplers: ThinCircleOfConfusionPostProcess.Samplers,\r\n defines: options?.depthNotNormalized ? ThinCircleOfConfusionPostProcess.DefinesDepthNotNormalized : undefined,\r\n });\r\n }\r\n\r\n /**\r\n * The camera to use to calculate the circle of confusion\r\n */\r\n public camera: Camera;\r\n\r\n /**\r\n * Max lens size in scene units/1000 (eg. millimeter). Standard cameras are 50mm. (default: 50) The diameter of the resulting aperture can be computed by lensSize/fStop.\r\n */\r\n public lensSize = 50;\r\n\r\n /**\r\n * F-Stop of the effect's camera. The diameter of the resulting aperture can be computed by lensSize/fStop. (default: 1.4)\r\n */\r\n public fStop = 1.4;\r\n\r\n /**\r\n * Distance away from the camera to focus on in scene units/1000 (eg. millimeter). (default: 2000)\r\n */\r\n public focusDistance = 2000;\r\n\r\n /**\r\n * Focal length of the effect's camera in scene units/1000 (eg. millimeter). (default: 50)\r\n */\r\n public focalLength = 50;\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n\r\n const options = this.options as ThinCircleOfConfusionPostProcessOptions;\r\n\r\n const effect = this._drawWrapper.effect!;\r\n\r\n if (!options.depthNotNormalized) {\r\n effect.setFloat2(\"cameraMinMaxZ\", this.camera.minZ, this.camera.maxZ - this.camera.minZ);\r\n }\r\n\r\n // Circle of confusion calculation, See https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch23.html\r\n const aperture = this.lensSize / this.fStop;\r\n const cocPrecalculation = (aperture * this.focalLength) / (this.focusDistance - this.focalLength); // * ((this.focusDistance - pixelDistance)/pixelDistance) [This part is done in shader]\r\n\r\n effect.setFloat(\"focusDistance\", this.focusDistance);\r\n effect.setFloat(\"cocPrecalculation\", cocPrecalculation);\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
2
|
-
import {
|
|
2
|
+
import { EngineStore } from "../Engines/engineStore.js";
|
|
3
3
|
/**
|
|
4
4
|
* Post process used to apply a convolution effect
|
|
5
5
|
*/
|
|
@@ -24,7 +24,7 @@ export class ThinConvolutionPostProcess extends EffectWrapper {
|
|
|
24
24
|
super({
|
|
25
25
|
...options,
|
|
26
26
|
name,
|
|
27
|
-
engine: engine ||
|
|
27
|
+
engine: engine || EngineStore.LastCreatedEngine,
|
|
28
28
|
useShaderStore: true,
|
|
29
29
|
useAsPostProcess: true,
|
|
30
30
|
fragmentShader: ThinConvolutionPostProcess.FragmentUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinConvolutionPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinConvolutionPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"thinConvolutionPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinConvolutionPostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\n/**\r\n * Post process used to apply a convolution effect\r\n */\r\nexport class ThinConvolutionPostProcess extends EffectWrapper {\r\n // Statics\r\n /**\r\n * Edge detection 0 see https://en.wikipedia.org/wiki/Kernel_(image_processing)\r\n */\r\n public static EdgeDetect0Kernel = [1, 0, -1, 0, 0, 0, -1, 0, 1];\r\n /**\r\n * Edge detection 1 see https://en.wikipedia.org/wiki/Kernel_(image_processing)\r\n */\r\n public static EdgeDetect1Kernel = [0, 1, 0, 1, -4, 1, 0, 1, 0];\r\n /**\r\n * Edge detection 2 see https://en.wikipedia.org/wiki/Kernel_(image_processing)\r\n */\r\n public static EdgeDetect2Kernel = [-1, -1, -1, -1, 8, -1, -1, -1, -1];\r\n /**\r\n * Kernel to sharpen an image see https://en.wikipedia.org/wiki/Kernel_(image_processing)\r\n */\r\n public static SharpenKernel = [0, -1, 0, -1, 5, -1, 0, -1, 0];\r\n /**\r\n * Kernel to emboss an image see https://en.wikipedia.org/wiki/Kernel_(image_processing)\r\n */\r\n public static EmbossKernel = [-2, -1, 0, -1, 1, 1, 0, 1, 2];\r\n /**\r\n * Kernel to blur an image see https://en.wikipedia.org/wiki/Kernel_(image_processing)\r\n */\r\n public static GaussianKernel = [0, 1, 0, 1, 1, 1, 0, 1, 0];\r\n\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"convolution\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"kernel\", \"screenSize\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/convolution.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/convolution.fragment\"));\r\n }\r\n }\r\n\r\n /**\r\n * Constructs a new convolution post process\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param kernel Array of 9 values corresponding to the 3x3 kernel to be applied\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, kernel: number[], options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || EngineStore.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinConvolutionPostProcess.FragmentUrl,\r\n uniforms: ThinConvolutionPostProcess.Uniforms,\r\n });\r\n\r\n this.kernel = kernel;\r\n }\r\n\r\n /** Array of 9 values corresponding to the 3x3 kernel to be applied */\r\n public kernel: number[];\r\n\r\n /**\r\n * The width of the source texture\r\n */\r\n public textureWidth: number = 0;\r\n\r\n /**\r\n * The height of the source texture\r\n */\r\n public textureHeight: number = 0;\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n\r\n const effect = this._drawWrapper.effect!;\r\n\r\n effect.setFloat2(\"screenSize\", this.textureWidth, this.textureHeight);\r\n effect.setArray(\"kernel\", this.kernel);\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
2
|
-
import {
|
|
2
|
+
import { EngineStore } from "../Engines/engineStore.js";
|
|
3
3
|
import { Observable } from "../Misc/observable.js";
|
|
4
4
|
/**
|
|
5
5
|
* Class used to apply a custom post process
|
|
@@ -14,7 +14,7 @@ export class ThinCustomPostProcess extends EffectWrapper {
|
|
|
14
14
|
constructor(name, engine = null, options) {
|
|
15
15
|
super({
|
|
16
16
|
name,
|
|
17
|
-
engine: engine ||
|
|
17
|
+
engine: engine || EngineStore.LastCreatedEngine,
|
|
18
18
|
useShaderStore: true,
|
|
19
19
|
useAsPostProcess: true,
|
|
20
20
|
...options,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinCustomPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinCustomPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"thinCustomPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinCustomPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,aAAa;IAMpD;;;;;OAKG;IACH,YAAY,IAAY,EAAE,SAAmC,IAAI,EAAE,OAAsC;QACrG,KAAK,CAAC;YACF,IAAI;YACJ,MAAM,EAAE,MAAM,IAAI,WAAW,CAAC,iBAAkB;YAChD,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;YACtB,GAAG,OAAO;SACb,CAAC,CAAC;QAlBP;;WAEG;QACI,qBAAgB,GAAuB,IAAI,UAAU,EAAU,CAAC;IAgBvE,CAAC;IAEe,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAC1C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE9B,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,MAAO,CAAC,CAAC;IACrE,CAAC;CACJ","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions, Effect } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Observable } from \"../Misc/observable\";\r\n\r\n/**\r\n * Class used to apply a custom post process\r\n */\r\nexport class ThinCustomPostProcess extends EffectWrapper {\r\n /**\r\n * Observable triggered when the post process is bound\r\n */\r\n public onBindObservable: Observable<Effect> = new Observable<Effect>();\r\n\r\n /**\r\n * Constructs a new custom post process\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, options?: EffectWrapperCreationOptions) {\r\n super({\r\n name,\r\n engine: engine || EngineStore.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n ...options,\r\n });\r\n }\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n\r\n this.onBindObservable.notifyObservers(this._drawWrapper.effect!);\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
2
|
-
import {
|
|
2
|
+
import { EngineStore } from "../Engines/engineStore.js";
|
|
3
3
|
/**
|
|
4
4
|
* @internal
|
|
5
5
|
*/
|
|
@@ -17,7 +17,7 @@ export class ThinDepthOfFieldMergePostProcess extends EffectWrapper {
|
|
|
17
17
|
super({
|
|
18
18
|
...options,
|
|
19
19
|
name,
|
|
20
|
-
engine: engine ||
|
|
20
|
+
engine: engine || EngineStore.LastCreatedEngine,
|
|
21
21
|
useShaderStore: true,
|
|
22
22
|
useAsPostProcess: true,
|
|
23
23
|
fragmentShader: ThinDepthOfFieldMergePostProcess.FragmentUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinDepthOfFieldMergePostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinDepthOfFieldMergePostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"thinDepthOfFieldMergePostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinDepthOfFieldMergePostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD;;GAEG;AACH,MAAM,OAAO,gCAAiC,SAAQ,aAAa;IAK5C,cAAc,CAAC,SAAkB,EAAE,IAAoB;QACtE,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;IAED,YAAY,IAAY,EAAE,SAAmC,IAAI,EAAE,OAAsC;QACrG,KAAK,CAAC;YACF,GAAG,OAAO;YACV,IAAI;YACJ,MAAM,EAAE,MAAM,IAAI,WAAW,CAAC,iBAAkB;YAChD,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,gCAAgC,CAAC,WAAW;YAC5D,QAAQ,EAAE,gCAAgC,CAAC,QAAQ;SACtD,CAAC,CAAC;IACP,CAAC;;AAvBsB,4CAAW,GAAG,mBAAmB,CAAC;AAElC,yCAAQ,GAAG,CAAC,0BAA0B,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ThinDepthOfFieldMergePostProcess extends EffectWrapper {\r\n public static readonly FragmentUrl = \"depthOfFieldMerge\";\r\n\r\n public static readonly Samplers = [\"circleOfConfusionSampler\", \"blurStep0\", \"blurStep1\", \"blurStep2\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/depthOfFieldMerge.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/depthOfFieldMerge.fragment\"));\r\n }\r\n }\r\n\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || EngineStore.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinDepthOfFieldMergePostProcess.FragmentUrl,\r\n samplers: ThinDepthOfFieldMergePostProcess.Samplers,\r\n });\r\n }\r\n}\r\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
2
2
|
import { ToGammaSpace } from "../Maths/math.constants.js";
|
|
3
|
-
import {
|
|
3
|
+
import { EngineStore } from "../Engines/engineStore.js";
|
|
4
4
|
/**
|
|
5
5
|
* Post process used to extract highlights.
|
|
6
6
|
*/
|
|
@@ -24,7 +24,7 @@ export class ThinExtractHighlightsPostProcess extends EffectWrapper {
|
|
|
24
24
|
super({
|
|
25
25
|
...options,
|
|
26
26
|
name,
|
|
27
|
-
engine: engine ||
|
|
27
|
+
engine: engine || EngineStore.LastCreatedEngine,
|
|
28
28
|
useShaderStore: true,
|
|
29
29
|
useAsPostProcess: true,
|
|
30
30
|
fragmentShader: ThinExtractHighlightsPostProcess.FragmentUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinExtractHighlightsPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinExtractHighlightsPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"thinExtractHighlightsPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinExtractHighlightsPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD;;GAEG;AACH,MAAM,OAAO,gCAAiC,SAAQ,aAAa;IAW5C,cAAc,CAAC,SAAkB,EAAE,IAAoB;QACtE,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,YAAY,IAAY,EAAE,SAAmC,IAAI,EAAE,OAAsC;QACrG,KAAK,CAAC;YACF,GAAG,OAAO;YACV,IAAI;YACJ,MAAM,EAAE,MAAM,IAAI,WAAW,CAAC,iBAAkB;YAChD,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,gCAAgC,CAAC,WAAW;YAC5D,QAAQ,EAAE,gCAAgC,CAAC,QAAQ;SACtD,CAAC,CAAC;QAGP;;WAEG;QACI,cAAS,GAAG,GAAG,CAAC;QAEvB,gBAAgB;QACT,cAAS,GAAG,CAAC,CAAC;IARrB,CAAC;IAUe,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAC1C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAO,CAAC;QAEzC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;;AApDD;;GAEG;AACoB,4CAAW,GAAG,mBAAmB,AAAtB,CAAuB;AAEzD;;GAEG;AACoB,yCAAQ,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,AAA5B,CAA6B","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { ToGammaSpace } from \"../Maths/math.constants\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\n/**\r\n * Post process used to extract highlights.\r\n */\r\nexport class ThinExtractHighlightsPostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"extractHighlights\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"threshold\", \"exposure\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/extractHighlights.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/extractHighlights.fragment\"));\r\n }\r\n }\r\n\r\n /**\r\n * Constructs a new extract highlights post process\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || EngineStore.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinExtractHighlightsPostProcess.FragmentUrl,\r\n uniforms: ThinExtractHighlightsPostProcess.Uniforms,\r\n });\r\n }\r\n\r\n /**\r\n * The luminance threshold, pixels below this value will be set to black.\r\n */\r\n public threshold = 0.9;\r\n\r\n /** @internal */\r\n public _exposure = 1;\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n\r\n const effect = this._drawWrapper.effect!;\r\n\r\n effect.setFloat(\"threshold\", Math.pow(this.threshold, ToGammaSpace));\r\n effect.setFloat(\"exposure\", this._exposure);\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
2
|
-
import {
|
|
2
|
+
import { EngineStore } from "../Engines/engineStore.js";
|
|
3
3
|
import { Vector2 } from "../Maths/math.vector.js";
|
|
4
4
|
/**
|
|
5
5
|
* Postprocess used to apply FXAA (antialiasing) to the scene
|
|
@@ -34,7 +34,7 @@ export class ThinFXAAPostProcess extends EffectWrapper {
|
|
|
34
34
|
const localOptions = {
|
|
35
35
|
...options,
|
|
36
36
|
name,
|
|
37
|
-
engine: engine ||
|
|
37
|
+
engine: engine || EngineStore.LastCreatedEngine,
|
|
38
38
|
useShaderStore: true,
|
|
39
39
|
useAsPostProcess: true,
|
|
40
40
|
vertexShader: ThinFXAAPostProcess.VertexUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinFXAAPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinFXAAPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"thinFXAAPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinFXAAPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IAC1C,MAAM,CAAC,WAAW,CAAC,MAAsB;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC9C,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAChD,OAAO,kBAAkB,CAAC;QAC9B,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAiBkB,cAAc,CAAC,SAAkB,EAAE,IAAoB;QACtE,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,8BAA8B,CAAC,EAAE,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3G,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC;QACnG,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,YAAY,IAAY,EAAE,SAAmC,IAAI,EAAE,OAAsC;QACrG,MAAM,YAAY,GAAG;YACjB,GAAG,OAAO;YACV,IAAI;YACJ,MAAM,EAAE,MAAM,IAAI,WAAW,CAAC,iBAAkB;YAChD,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;YACtB,YAAY,EAAE,mBAAmB,CAAC,SAAS;YAC3C,cAAc,EAAE,mBAAmB,CAAC,WAAW;YAC/C,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;SACzC,CAAC;QAEF,KAAK,CAAC;YACF,GAAG,YAAY;YACf,OAAO,EAAE,mBAAmB,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC;SAChE,CAAC,CAAC;QAGP;;WAEG;QACI,cAAS,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IALrC,CAAC;IAOe,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAC1C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,MAAO,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACzF,CAAC;;AAxDD;;GAEG;AACoB,6BAAS,GAAG,MAAM,AAAT,CAAU;AAE1C;;GAEG;AACoB,+BAAW,GAAG,MAAM,AAAT,CAAU;AAE5C;;GAEG;AACoB,4BAAQ,GAAG,CAAC,WAAW,CAAC,AAAhB,CAAiB","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Vector2 } from \"../Maths/math.vector\";\r\n\r\n/**\r\n * Postprocess used to apply FXAA (antialiasing) to the scene\r\n */\r\nexport class ThinFXAAPostProcess extends EffectWrapper {\r\n private static _GetDefines(engine: AbstractEngine): Nullable<string> {\r\n if (!engine) {\r\n return null;\r\n }\r\n\r\n const driverInfo = engine.extractDriverInfo();\r\n if (driverInfo.toLowerCase().indexOf(\"mali\") > -1) {\r\n return \"#define MALI 1\\n\";\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * The vertex shader url\r\n */\r\n public static readonly VertexUrl = \"fxaa\";\r\n\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"fxaa\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"texelSize\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(Promise.all([import(\"../ShadersWGSL/fxaa.fragment\"), import(\"../ShadersWGSL/fxaa.vertex\")]));\r\n } else {\r\n list.push(Promise.all([import(\"../Shaders/fxaa.fragment\"), import(\"../Shaders/fxaa.vertex\")]));\r\n }\r\n }\r\n\r\n /**\r\n * Constructs a new FXAA post process\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, options?: EffectWrapperCreationOptions) {\r\n const localOptions = {\r\n ...options,\r\n name,\r\n engine: engine || EngineStore.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n vertexShader: ThinFXAAPostProcess.VertexUrl,\r\n fragmentShader: ThinFXAAPostProcess.FragmentUrl,\r\n uniforms: ThinFXAAPostProcess.Uniforms,\r\n };\r\n\r\n super({\r\n ...localOptions,\r\n defines: ThinFXAAPostProcess._GetDefines(localOptions.engine),\r\n });\r\n }\r\n\r\n /**\r\n * The texel size of the texture to apply FXAA on\r\n */\r\n public texelSize = new Vector2(0, 0);\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n this._drawWrapper.effect!.setFloat2(\"texelSize\", this.texelSize.x, this.texelSize.y);\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
2
|
-
import {
|
|
2
|
+
import { EngineStore } from "../Engines/engineStore.js";
|
|
3
3
|
import { Matrix } from "../Maths/math.vector.js";
|
|
4
4
|
/**
|
|
5
5
|
* Post process used to apply a kernel filter
|
|
@@ -24,7 +24,7 @@ export class ThinFilterPostProcess extends EffectWrapper {
|
|
|
24
24
|
super({
|
|
25
25
|
...options,
|
|
26
26
|
name,
|
|
27
|
-
engine: engine ||
|
|
27
|
+
engine: engine || EngineStore.LastCreatedEngine,
|
|
28
28
|
useShaderStore: true,
|
|
29
29
|
useAsPostProcess: true,
|
|
30
30
|
fragmentShader: ThinFilterPostProcess.FragmentUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinFilterPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinFilterPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"thinFilterPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinFilterPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,aAAa;IAWjC,cAAc,CAAC,SAAkB,EAAE,IAAoB;QACtE,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,YAAY,IAAY,EAAE,SAAmC,IAAI,EAAE,OAAsC;QACrG,KAAK,CAAC;YACF,GAAG,OAAO;YACV,IAAI;YACJ,MAAM,EAAE,MAAM,IAAI,WAAW,CAAC,iBAAkB;YAChD,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,qBAAqB,CAAC,WAAW;YACjD,QAAQ,EAAE,qBAAqB,CAAC,QAAQ;SAC3C,CAAC,CAAC;QAGP;;WAEG;QACI,iBAAY,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IALxC,CAAC;IAOe,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAC1C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,MAAO,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3E,CAAC;;AA7CD;;GAEG;AACoB,iCAAW,GAAG,QAAQ,AAAX,CAAY;AAE9C;;GAEG;AACoB,8BAAQ,GAAG,CAAC,cAAc,CAAC,AAAnB,CAAoB","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Matrix } from \"../Maths/math.vector\";\r\n\r\n/**\r\n * Post process used to apply a kernel filter\r\n */\r\nexport class ThinFilterPostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"filter\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"kernelMatrix\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/filter.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/filter.fragment\"));\r\n }\r\n }\r\n\r\n /**\r\n * Constructs a new filter post process\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || EngineStore.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinFilterPostProcess.FragmentUrl,\r\n uniforms: ThinFilterPostProcess.Uniforms,\r\n });\r\n }\r\n\r\n /**\r\n * The matrix to be applied to the image\r\n */\r\n public kernelMatrix = Matrix.Identity();\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n this._drawWrapper.effect!.setMatrix(\"kernelMatrix\", this.kernelMatrix);\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EffectWrapper } from "../Materials/effectRenderer.js";
|
|
2
|
-
import {
|
|
2
|
+
import { EngineStore } from "../Engines/engineStore.js";
|
|
3
3
|
/**
|
|
4
4
|
* Post process used to render a grain effect
|
|
5
5
|
*/
|
|
@@ -23,7 +23,7 @@ export class ThinGrainPostProcess extends EffectWrapper {
|
|
|
23
23
|
super({
|
|
24
24
|
...options,
|
|
25
25
|
name,
|
|
26
|
-
engine: engine ||
|
|
26
|
+
engine: engine || EngineStore.LastCreatedEngine,
|
|
27
27
|
useShaderStore: true,
|
|
28
28
|
useAsPostProcess: true,
|
|
29
29
|
fragmentShader: ThinGrainPostProcess.FragmentUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinGrainPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinGrainPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"thinGrainPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinGrainPostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,aAAa;IAWhC,cAAc,CAAC,SAAkB,EAAE,IAAoB;QACtE,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACnD,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,YAAY,IAAY,EAAE,SAAmC,IAAI,EAAE,OAAsC;QACrG,KAAK,CAAC;YACF,GAAG,OAAO;YACV,IAAI;YACJ,MAAM,EAAE,MAAM,IAAI,WAAW,CAAC,iBAAkB;YAChD,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,oBAAoB,CAAC,WAAW;YAChD,QAAQ,EAAE,oBAAoB,CAAC,QAAQ;SAC1C,CAAC,CAAC;QAGP;;WAEG;QACI,cAAS,GAAG,EAAE,CAAC;QAEtB;;WAEG;QACI,aAAQ,GAAG,KAAK,CAAC;IAVxB,CAAC;IAYe,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAC1C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,MAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAChE,IAAI,CAAC,YAAY,CAAC,MAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9F,CAAC;;AAnDD;;GAEG;AACoB,gCAAW,GAAG,OAAO,AAAV,CAAW;AAE7C;;GAEG;AACoB,6BAAQ,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,AAAhC,CAAiC","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\n/**\r\n * Post process used to render a grain effect\r\n */\r\nexport class ThinGrainPostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"grain\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"intensity\", \"animatedSeed\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/grain.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/grain.fragment\"));\r\n }\r\n }\r\n\r\n /**\r\n * Constructs a new grain post process\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || EngineStore.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinGrainPostProcess.FragmentUrl,\r\n uniforms: ThinGrainPostProcess.Uniforms,\r\n });\r\n }\r\n\r\n /**\r\n * The intensity of the grain added (default: 30)\r\n */\r\n public intensity = 30;\r\n\r\n /**\r\n * If the grain should be randomized on every frame\r\n */\r\n public animated = false;\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n this._drawWrapper.effect!.setFloat(\"intensity\", this.intensity);\r\n this._drawWrapper.effect!.setFloat(\"animatedSeed\", this.animated ? Math.random() + 1 : 1);\r\n }\r\n}\r\n"]}
|