@babylonjs/core 8.33.4 → 8.34.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/AudioV2/abstractAudio/abstractSound.d.ts +4 -0
- package/AudioV2/abstractAudio/abstractSound.js +6 -0
- package/AudioV2/abstractAudio/abstractSound.js.map +1 -1
- package/AudioV2/abstractAudio/abstractSoundInstance.js +3 -0
- package/AudioV2/abstractAudio/abstractSoundInstance.js.map +1 -1
- package/AudioV2/webAudio/webAudioStreamingSound.js +4 -1
- package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
- package/AudioV2/webAudio/webAudioUnmuteUI.js +1 -1
- package/AudioV2/webAudio/webAudioUnmuteUI.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/ssao2Task.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2Task.js +7 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2Task.js.map +1 -1
- package/Materials/Background/backgroundMaterial.js +9 -5
- package/Materials/Background/backgroundMaterial.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
- package/Materials/PBR/openpbrMaterial.d.ts +14 -0
- package/Materials/PBR/openpbrMaterial.js +16 -0
- package/Materials/PBR/openpbrMaterial.js.map +1 -1
- package/Materials/Textures/index.d.ts +1 -0
- package/Materials/Textures/index.js +1 -0
- package/Materials/Textures/index.js.map +1 -1
- package/Materials/Textures/mirrorTexture.d.ts +4 -0
- package/Materials/Textures/mirrorTexture.js +9 -0
- package/Materials/Textures/mirrorTexture.js.map +1 -1
- package/Materials/Textures/textureMerger.d.ts +75 -0
- package/Materials/Textures/textureMerger.js +206 -0
- package/Materials/Textures/textureMerger.js.map +1 -0
- package/Materials/floatingOriginMatrixOverrides.js +3 -2
- package/Materials/floatingOriginMatrixOverrides.js.map +1 -1
- package/Meshes/mesh.js +1 -1
- package/Meshes/mesh.js.map +1 -1
- package/Misc/sceneSerializer.js +8 -2
- package/Misc/sceneSerializer.js.map +1 -1
- package/Particles/Node/Blocks/Emitters/boxShapeBlock.js.map +1 -1
- package/Particles/Node/Blocks/Emitters/coneShapeBlock.d.ts +57 -0
- package/Particles/Node/Blocks/Emitters/coneShapeBlock.js +163 -0
- package/Particles/Node/Blocks/Emitters/coneShapeBlock.js.map +1 -0
- package/Particles/Node/Blocks/Emitters/index.d.ts +5 -4
- package/Particles/Node/Blocks/Emitters/index.js +5 -4
- package/Particles/Node/Blocks/Emitters/index.js.map +1 -1
- package/Particles/Node/Blocks/particleInputBlock.js +2 -0
- package/Particles/Node/Blocks/particleInputBlock.js.map +1 -1
- package/Particles/Node/Blocks/systemBlock.d.ts +4 -0
- package/Particles/Node/Blocks/systemBlock.js +8 -0
- package/Particles/Node/Blocks/systemBlock.js.map +1 -1
- package/Particles/Node/Enums/nodeParticleContextualSources.d.ts +5 -1
- package/Particles/Node/Enums/nodeParticleContextualSources.js +4 -0
- package/Particles/Node/Enums/nodeParticleContextualSources.js.map +1 -1
- package/Particles/Node/nodeParticleBuildState.js +5 -0
- package/Particles/Node/nodeParticleBuildState.js.map +1 -1
- package/Particles/Node/nodeParticleSystemSet.helper.d.ts +4 -3
- package/Particles/Node/nodeParticleSystemSet.helper.js +182 -115
- package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.d.ts +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +8 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
- package/PostProcesses/postProcess.d.ts +4 -0
- package/PostProcesses/postProcess.js +4 -0
- package/PostProcesses/postProcess.js.map +1 -1
- package/PostProcesses/thinSSAO2PostProcess.d.ts +1 -0
- package/PostProcesses/thinSSAO2PostProcess.js +9 -4
- package/PostProcesses/thinSSAO2PostProcess.js.map +1 -1
- package/Shaders/ShadersInclude/gaussianSplatting.js +2 -10
- package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrBaseLayerData.js +1 -1
- package/Shaders/ShadersInclude/openpbrBaseLayerData.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrCoatLayerData.js +4 -0
- package/Shaders/ShadersInclude/openpbrCoatLayerData.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrDirectLighting.js +5 -2
- package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js +2 -2
- package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrFuzzLayerData.js +1 -1
- package/Shaders/ShadersInclude/openpbrFuzzLayerData.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBRDFFunctions.js +1 -1
- package/Shaders/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
- package/Shaders/default.fragment.js +1 -1
- package/Shaders/default.fragment.js.map +1 -1
- package/Shaders/gaussianSplattingDepth.fragment.js +7 -1
- package/Shaders/gaussianSplattingDepth.fragment.js.map +1 -1
- package/Shaders/gaussianSplattingDepth.vertex.js +2 -2
- package/Shaders/gaussianSplattingDepth.vertex.js.map +1 -1
- package/Shaders/particles.vertex.js +1 -1
- package/Shaders/particles.vertex.js.map +1 -1
- package/Shaders/textureMerger.fragment.d.ts +5 -0
- package/Shaders/textureMerger.fragment.js +94 -0
- package/Shaders/textureMerger.fragment.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +1 -7
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrBaseLayerData.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrBaseLayerData.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrCoatLayerData.js +4 -0
- package/ShadersWGSL/ShadersInclude/openpbrCoatLayerData.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +5 -2
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js +2 -2
- package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrFuzzLayerData.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrFuzzLayerData.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +1 -1
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/gaussianSplattingDepth.fragment.d.ts +1 -0
- package/ShadersWGSL/gaussianSplattingDepth.fragment.js +15 -3
- package/ShadersWGSL/gaussianSplattingDepth.fragment.js.map +1 -1
- package/ShadersWGSL/gaussianSplattingDepth.vertex.js +2 -2
- package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -1
- package/ShadersWGSL/particles.vertex.js +1 -1
- package/ShadersWGSL/particles.vertex.js.map +1 -1
- package/ShadersWGSL/textureMerger.fragment.d.ts +5 -0
- package/ShadersWGSL/textureMerger.fragment.js +86 -0
- package/ShadersWGSL/textureMerger.fragment.js.map +1 -0
- package/Sprites/spriteManager.d.ts +8 -0
- package/Sprites/spriteManager.js +4 -0
- package/Sprites/spriteManager.js.map +1 -1
- package/XR/features/WebXRAnchorSystem.js +14 -21
- package/XR/features/WebXRAnchorSystem.js.map +1 -1
- package/package.json +1 -1
|
@@ -22,6 +22,7 @@ export * from "./rawTexture2DArray.js";
|
|
|
22
22
|
export * from "./rawTexture3D.js";
|
|
23
23
|
export * from "./refractionTexture.js";
|
|
24
24
|
export * from "./renderTargetTexture.js";
|
|
25
|
+
export * from "./textureMerger.js";
|
|
25
26
|
export * from "./textureSampler.js";
|
|
26
27
|
export * from "./texture.js";
|
|
27
28
|
export * from "./thinTexture.js";
|
|
@@ -24,6 +24,7 @@ export * from "./rawTexture2DArray.js";
|
|
|
24
24
|
export * from "./rawTexture3D.js";
|
|
25
25
|
export * from "./refractionTexture.js";
|
|
26
26
|
export * from "./renderTargetTexture.js";
|
|
27
|
+
export * from "./textureMerger.js";
|
|
27
28
|
export * from "./textureSampler.js";
|
|
28
29
|
export * from "./texture.js";
|
|
29
30
|
export * from "./thinTexture.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Textures/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,cAAc,eAAe,CAAC;AAC9B,yCAAyC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AAEzC,kCAAkC;AAClC,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAEhD,gBAAgB;AAChB,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,iDAAiD,CAAC;AAChE,cAAc,mDAAmD,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nexport * from \"./baseTexture\";\r\n// eslint-disable-next-line import/export\r\nexport * from \"./baseTexture.polynomial\";\r\nexport * from \"./colorGradingTexture\";\r\nexport * from \"./cubeTexture\";\r\nexport * from \"./dynamicTexture\";\r\nexport * from \"./equiRectangularCubeTexture\";\r\nexport * from \"./externalTexture\";\r\nexport * from \"./Filtering/hdrFiltering\";\r\nexport * from \"./envCubeTexture\";\r\nexport * from \"./hdrCubeTexture\";\r\nexport * from \"./exrCubeTexture\";\r\nexport * from \"./htmlElementTexture\";\r\nexport * from \"./internalTexture\";\r\nexport * from \"./Loaders/index\";\r\nexport * from \"./mirrorTexture\";\r\nexport * from \"./multiRenderTarget\";\r\nexport * from \"./Packer/index\";\r\nexport * from \"./Procedurals/index\";\r\nexport * from \"./rawCubeTexture\";\r\nexport * from \"./rawTexture\";\r\nexport * from \"./rawTexture2DArray\";\r\nexport * from \"./rawTexture3D\";\r\nexport * from \"./refractionTexture\";\r\nexport * from \"./renderTargetTexture\";\r\nexport * from \"./textureSampler\";\r\nexport * from \"./texture\";\r\nexport * from \"./thinTexture\";\r\nexport * from \"./thinRenderTargetTexture\";\r\nexport * from \"./videoTexture\";\r\nexport * from \"./ktx2decoderTypes\";\r\nexport * from \"./textureCreationOptions\";\r\n\r\n// Shaders for procedural textures\r\nexport * from \"../../ShadersWGSL/procedural.vertex\";\r\nexport * from \"../../Shaders/procedural.vertex\";\r\n\r\n// HDR filtering\r\nexport * from \"../../Shaders/hdrFiltering.vertex\";\r\nexport * from \"../../Shaders/hdrFiltering.fragment\";\r\nexport * from \"../../ShadersWGSL/hdrFiltering.vertex\";\r\nexport * from \"../../ShadersWGSL/hdrFiltering.fragment\";\r\nexport * from \"../../Shaders/hdrIrradianceFiltering.vertex\";\r\nexport * from \"../../Shaders/hdrIrradianceFiltering.fragment\";\r\nexport * from \"../../ShadersWGSL/hdrIrradianceFiltering.vertex\";\r\nexport * from \"../../ShadersWGSL/hdrIrradianceFiltering.fragment\";\r\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Textures/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,cAAc,eAAe,CAAC;AAC9B,yCAAyC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AAEzC,kCAAkC;AAClC,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAEhD,gBAAgB;AAChB,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,iDAAiD,CAAC;AAChE,cAAc,mDAAmD,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nexport * from \"./baseTexture\";\r\n// eslint-disable-next-line import/export\r\nexport * from \"./baseTexture.polynomial\";\r\nexport * from \"./colorGradingTexture\";\r\nexport * from \"./cubeTexture\";\r\nexport * from \"./dynamicTexture\";\r\nexport * from \"./equiRectangularCubeTexture\";\r\nexport * from \"./externalTexture\";\r\nexport * from \"./Filtering/hdrFiltering\";\r\nexport * from \"./envCubeTexture\";\r\nexport * from \"./hdrCubeTexture\";\r\nexport * from \"./exrCubeTexture\";\r\nexport * from \"./htmlElementTexture\";\r\nexport * from \"./internalTexture\";\r\nexport * from \"./Loaders/index\";\r\nexport * from \"./mirrorTexture\";\r\nexport * from \"./multiRenderTarget\";\r\nexport * from \"./Packer/index\";\r\nexport * from \"./Procedurals/index\";\r\nexport * from \"./rawCubeTexture\";\r\nexport * from \"./rawTexture\";\r\nexport * from \"./rawTexture2DArray\";\r\nexport * from \"./rawTexture3D\";\r\nexport * from \"./refractionTexture\";\r\nexport * from \"./renderTargetTexture\";\r\nexport * from \"./textureMerger\";\r\nexport * from \"./textureSampler\";\r\nexport * from \"./texture\";\r\nexport * from \"./thinTexture\";\r\nexport * from \"./thinRenderTargetTexture\";\r\nexport * from \"./videoTexture\";\r\nexport * from \"./ktx2decoderTypes\";\r\nexport * from \"./textureCreationOptions\";\r\n\r\n// Shaders for procedural textures\r\nexport * from \"../../ShadersWGSL/procedural.vertex\";\r\nexport * from \"../../Shaders/procedural.vertex\";\r\n\r\n// HDR filtering\r\nexport * from \"../../Shaders/hdrFiltering.vertex\";\r\nexport * from \"../../Shaders/hdrFiltering.fragment\";\r\nexport * from \"../../ShadersWGSL/hdrFiltering.vertex\";\r\nexport * from \"../../ShadersWGSL/hdrFiltering.fragment\";\r\nexport * from \"../../Shaders/hdrIrradianceFiltering.vertex\";\r\nexport * from \"../../Shaders/hdrIrradianceFiltering.fragment\";\r\nexport * from \"../../ShadersWGSL/hdrIrradianceFiltering.vertex\";\r\nexport * from \"../../ShadersWGSL/hdrIrradianceFiltering.fragment\";\r\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Scene } from "../../scene.js";
|
|
2
2
|
import { RenderTargetTexture } from "../../Materials/Textures/renderTargetTexture.js";
|
|
3
3
|
import { Plane } from "../../Maths/math.plane.js";
|
|
4
|
+
import type { TextureSize } from "../../Materials/Textures/textureCreationOptions.js";
|
|
4
5
|
/**
|
|
5
6
|
* Mirror texture can be used to simulate the view from a mirror in a scene.
|
|
6
7
|
* It will dynamically be rendered every frame to adapt to the camera point of view.
|
|
@@ -43,6 +44,9 @@ export declare class MirrorTexture extends RenderTargetTexture {
|
|
|
43
44
|
set blurKernelY(value: number);
|
|
44
45
|
get blurKernelY(): number;
|
|
45
46
|
private _autoComputeBlurKernel;
|
|
47
|
+
resize(size: TextureSize | {
|
|
48
|
+
ratio: number;
|
|
49
|
+
}): void;
|
|
46
50
|
protected _onRatioRescale(): void;
|
|
47
51
|
private _updateGammaSpace;
|
|
48
52
|
private _imageProcessingConfigChangeObserver;
|
|
@@ -76,6 +76,15 @@ export class MirrorTexture extends RenderTargetTexture {
|
|
|
76
76
|
this.blurKernelX = this._adaptiveBlurKernel * dw;
|
|
77
77
|
this.blurKernelY = this._adaptiveBlurKernel * dh;
|
|
78
78
|
}
|
|
79
|
+
resize(size) {
|
|
80
|
+
super.resize(size);
|
|
81
|
+
if (!this._adaptiveBlurKernel) {
|
|
82
|
+
this._preparePostProcesses();
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
this._autoComputeBlurKernel();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
79
88
|
_onRatioRescale() {
|
|
80
89
|
if (this._sizeRatio) {
|
|
81
90
|
this.resize(this._initialSizeParameter);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mirrorTexture.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Textures/mirrorTexture.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix, Vector3, Vector2 } from \"../../Maths/math.vector\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport type { ImageProcessingConfiguration } from \"../../Materials/imageProcessingConfiguration\";\r\nimport { BlurPostProcess } from \"../../PostProcesses/blurPostProcess\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { Plane } from \"../../Maths/math.plane\";\r\nimport type { UniformBuffer } from \"../uniformBuffer\";\r\n/**\r\n * Mirror texture can be used to simulate the view from a mirror in a scene.\r\n * It will dynamically be rendered every frame to adapt to the camera point of view.\r\n * You can then easily use it as a reflectionTexture on a flat surface.\r\n * In case the surface is not a plane, please consider relying on reflection probes.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#mirrortexture\r\n */\r\nexport class MirrorTexture extends RenderTargetTexture {\r\n /**\r\n * Define the reflection plane we want to use. The mirrorPlane is usually set to the constructed reflector.\r\n * It is possible to directly set the mirrorPlane by directly using a Plane(a, b, c, d) where a, b and c give the plane normal vector (a, b, c) and d is a scalar displacement from the mirrorPlane to the origin. However in all but the very simplest of situations it is more straight forward to set it to the reflector as stated in the doc.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#mirrors\r\n */\r\n public mirrorPlane = new Plane(0, 1, 0, 1);\r\n\r\n /**\r\n * Define the blur ratio used to blur the reflection if needed.\r\n */\r\n public set blurRatio(value: number) {\r\n if (this._blurRatio === value) {\r\n return;\r\n }\r\n\r\n this._blurRatio = value;\r\n this._preparePostProcesses();\r\n }\r\n\r\n public get blurRatio(): number {\r\n return this._blurRatio;\r\n }\r\n\r\n /**\r\n * Define the adaptive blur kernel used to blur the reflection if needed.\r\n * This will autocompute the closest best match for the `blurKernel`\r\n */\r\n public set adaptiveBlurKernel(value: number) {\r\n this._adaptiveBlurKernel = value;\r\n this._autoComputeBlurKernel();\r\n }\r\n\r\n /**\r\n * Define the blur kernel used to blur the reflection if needed.\r\n * Please consider using `adaptiveBlurKernel` as it could find the closest best value for you.\r\n */\r\n public set blurKernel(value: number) {\r\n this.blurKernelX = value;\r\n this.blurKernelY = value;\r\n }\r\n\r\n /**\r\n * Define the blur kernel on the X Axis used to blur the reflection if needed.\r\n * Please consider using `adaptiveBlurKernel` as it could find the closest best value for you.\r\n */\r\n public set blurKernelX(value: number) {\r\n if (this._blurKernelX === value) {\r\n return;\r\n }\r\n\r\n this._blurKernelX = value;\r\n this._preparePostProcesses();\r\n }\r\n\r\n public get blurKernelX(): number {\r\n return this._blurKernelX;\r\n }\r\n\r\n /**\r\n * Define the blur kernel on the Y Axis used to blur the reflection if needed.\r\n * Please consider using `adaptiveBlurKernel` as it could find the closest best value for you.\r\n */\r\n public set blurKernelY(value: number) {\r\n if (this._blurKernelY === value) {\r\n return;\r\n }\r\n\r\n this._blurKernelY = value;\r\n this._preparePostProcesses();\r\n }\r\n\r\n public get blurKernelY(): number {\r\n return this._blurKernelY;\r\n }\r\n\r\n private _autoComputeBlurKernel(): void {\r\n const engine = this.getScene()!.getEngine();\r\n\r\n const dw = this.getRenderWidth() / engine.getRenderWidth();\r\n const dh = this.getRenderHeight() / engine.getRenderHeight();\r\n this.blurKernelX = this._adaptiveBlurKernel * dw;\r\n this.blurKernelY = this._adaptiveBlurKernel * dh;\r\n }\r\n\r\n protected override _onRatioRescale(): void {\r\n if (this._sizeRatio) {\r\n this.resize(this._initialSizeParameter);\r\n if (!this._adaptiveBlurKernel) {\r\n this._preparePostProcesses();\r\n }\r\n }\r\n\r\n if (this._adaptiveBlurKernel) {\r\n this._autoComputeBlurKernel();\r\n }\r\n }\r\n\r\n private _updateGammaSpace() {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n this.gammaSpace = !scene.imageProcessingConfiguration.isEnabled || !scene.imageProcessingConfiguration.applyByPostProcess;\r\n }\r\n\r\n private _imageProcessingConfigChangeObserver: Nullable<Observer<ImageProcessingConfiguration>>;\r\n\r\n private _transformMatrix = Matrix.Zero();\r\n private _mirrorMatrix = Matrix.Zero();\r\n\r\n private _blurX: Nullable<BlurPostProcess>;\r\n private _blurY: Nullable<BlurPostProcess>;\r\n private _adaptiveBlurKernel = 0;\r\n private _blurKernelX = 0;\r\n private _blurKernelY = 0;\r\n private _blurRatio = 1.0;\r\n private _sceneUBO: UniformBuffer;\r\n private _currentSceneUBO: UniformBuffer;\r\n\r\n /**\r\n * Instantiates a Mirror Texture.\r\n * Mirror texture can be used to simulate the view from a mirror in a scene.\r\n * It will dynamically be rendered every frame to adapt to the camera point of view.\r\n * You can then easily use it as a reflectionTexture on a flat surface.\r\n * In case the surface is not a plane, please consider relying on reflection probes.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#mirrors\r\n * @param name\r\n * @param size\r\n * @param scene\r\n * @param generateMipMaps\r\n * @param type\r\n * @param samplingMode\r\n * @param generateDepthBuffer\r\n */\r\n constructor(\r\n name: string,\r\n size: number | { width: number; height: number } | { ratio: number },\r\n scene?: Scene,\r\n generateMipMaps?: boolean,\r\n type: number = Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode = Texture.BILINEAR_SAMPLINGMODE,\r\n generateDepthBuffer = true\r\n ) {\r\n super(name, size, scene, generateMipMaps, true, type, false, samplingMode, generateDepthBuffer);\r\n\r\n scene = <Scene>this.getScene();\r\n\r\n if (!scene) {\r\n return this;\r\n }\r\n this.ignoreCameraViewport = true;\r\n\r\n this._updateGammaSpace();\r\n this._imageProcessingConfigChangeObserver = scene.imageProcessingConfiguration.onUpdateParameters.add(() => {\r\n this._updateGammaSpace();\r\n });\r\n\r\n const engine = scene.getEngine();\r\n\r\n if (engine.supportsUniformBuffers) {\r\n this._sceneUBO = scene.createSceneUniformBuffer(`Scene for Mirror Texture (name \"${name}\")`);\r\n }\r\n\r\n let saveClipPlane: Nullable<Plane>;\r\n\r\n this.onBeforeRenderObservable.add(() => {\r\n if (this._sceneUBO) {\r\n this._currentSceneUBO = scene.getSceneUniformBuffer();\r\n scene.setSceneUniformBuffer(this._sceneUBO);\r\n scene.getSceneUniformBuffer().unbindEffect();\r\n }\r\n\r\n Matrix.ReflectionToRef(this.mirrorPlane, this._mirrorMatrix);\r\n this._mirrorMatrix.multiplyToRef(scene.getViewMatrix(), this._transformMatrix);\r\n\r\n scene.setTransformMatrix(this._transformMatrix, scene.getProjectionMatrix());\r\n\r\n saveClipPlane = scene.clipPlane;\r\n scene.clipPlane = this.mirrorPlane;\r\n\r\n scene._mirroredCameraPosition = Vector3.TransformCoordinates((<Camera>scene.activeCamera).globalPosition, this._mirrorMatrix);\r\n });\r\n\r\n this.onAfterRenderObservable.add(() => {\r\n if (this._sceneUBO) {\r\n scene.setSceneUniformBuffer(this._currentSceneUBO);\r\n }\r\n scene.updateTransformMatrix();\r\n scene._mirroredCameraPosition = null;\r\n\r\n scene.clipPlane = saveClipPlane;\r\n });\r\n }\r\n\r\n private _preparePostProcesses(): void {\r\n this.clearPostProcesses(true);\r\n\r\n if (this._blurKernelX && this._blurKernelY) {\r\n const engine = (<Scene>this.getScene()).getEngine();\r\n\r\n const textureType =\r\n engine.getCaps().textureFloatRender && engine.getCaps().textureFloatLinearFiltering ? Constants.TEXTURETYPE_FLOAT : Constants.TEXTURETYPE_HALF_FLOAT;\r\n\r\n this._blurX = new BlurPostProcess(\r\n \"horizontal blur\",\r\n new Vector2(1.0, 0),\r\n this._blurKernelX,\r\n this._blurRatio,\r\n null,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n engine,\r\n false,\r\n textureType\r\n );\r\n this._blurX.autoClear = false;\r\n\r\n if (this._blurRatio === 1 && this.samples < 2 && this._texture) {\r\n this._blurX.inputTexture = this._renderTarget!;\r\n } else {\r\n this._blurX.alwaysForcePOT = true;\r\n }\r\n\r\n this._blurY = new BlurPostProcess(\r\n \"vertical blur\",\r\n new Vector2(0, 1.0),\r\n this._blurKernelY,\r\n this._blurRatio,\r\n null,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n engine,\r\n false,\r\n textureType\r\n );\r\n this._blurY.autoClear = false;\r\n this._blurY.alwaysForcePOT = this._blurRatio !== 1;\r\n\r\n this.addPostProcess(this._blurX);\r\n this.addPostProcess(this._blurY);\r\n } else {\r\n if (this._blurY) {\r\n this.removePostProcess(this._blurY);\r\n this._blurY.dispose();\r\n this._blurY = null;\r\n }\r\n if (this._blurX) {\r\n this.removePostProcess(this._blurX);\r\n this._blurX.dispose();\r\n this._blurX = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clone the mirror texture.\r\n * @returns the cloned texture\r\n */\r\n public override clone(): MirrorTexture {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return this;\r\n }\r\n\r\n const textureSize = this.getSize();\r\n const newTexture = new MirrorTexture(\r\n this.name,\r\n textureSize.width,\r\n scene,\r\n this._renderTargetOptions.generateMipMaps,\r\n this._renderTargetOptions.type,\r\n this._renderTargetOptions.samplingMode,\r\n this._renderTargetOptions.generateDepthBuffer\r\n );\r\n\r\n // Base texture\r\n newTexture.hasAlpha = this.hasAlpha;\r\n newTexture.level = this.level;\r\n\r\n // Mirror Texture\r\n newTexture.mirrorPlane = this.mirrorPlane.clone();\r\n if (this.renderList) {\r\n newTexture.renderList = this.renderList.slice(0);\r\n }\r\n\r\n return newTexture;\r\n }\r\n\r\n /**\r\n * Serialize the texture to a JSON representation you could use in Parse later on\r\n * @returns the serialized JSON representation\r\n */\r\n public override serialize(): any {\r\n if (!this.name) {\r\n return null;\r\n }\r\n\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.mirrorPlane = this.mirrorPlane.asArray();\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Dispose the texture and release its associated resources.\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n const scene = this.getScene();\r\n\r\n if (scene) {\r\n scene.imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingConfigChangeObserver);\r\n }\r\n this._sceneUBO?.dispose();\r\n }\r\n}\r\n\r\nTexture._CreateMirror = (name: string, renderTargetSize: number, scene: Scene, generateMipMaps: boolean): MirrorTexture => {\r\n return new MirrorTexture(name, renderTargetSize, scene, generateMipMaps);\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"file":"mirrorTexture.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Textures/mirrorTexture.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix, Vector3, Vector2 } from \"../../Maths/math.vector\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport type { ImageProcessingConfiguration } from \"../../Materials/imageProcessingConfiguration\";\r\nimport { BlurPostProcess } from \"../../PostProcesses/blurPostProcess\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { Plane } from \"../../Maths/math.plane\";\r\nimport type { UniformBuffer } from \"../uniformBuffer\";\r\nimport type { TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\r\n\r\n/**\r\n * Mirror texture can be used to simulate the view from a mirror in a scene.\r\n * It will dynamically be rendered every frame to adapt to the camera point of view.\r\n * You can then easily use it as a reflectionTexture on a flat surface.\r\n * In case the surface is not a plane, please consider relying on reflection probes.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#mirrortexture\r\n */\r\nexport class MirrorTexture extends RenderTargetTexture {\r\n /**\r\n * Define the reflection plane we want to use. The mirrorPlane is usually set to the constructed reflector.\r\n * It is possible to directly set the mirrorPlane by directly using a Plane(a, b, c, d) where a, b and c give the plane normal vector (a, b, c) and d is a scalar displacement from the mirrorPlane to the origin. However in all but the very simplest of situations it is more straight forward to set it to the reflector as stated in the doc.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#mirrors\r\n */\r\n public mirrorPlane = new Plane(0, 1, 0, 1);\r\n\r\n /**\r\n * Define the blur ratio used to blur the reflection if needed.\r\n */\r\n public set blurRatio(value: number) {\r\n if (this._blurRatio === value) {\r\n return;\r\n }\r\n\r\n this._blurRatio = value;\r\n this._preparePostProcesses();\r\n }\r\n\r\n public get blurRatio(): number {\r\n return this._blurRatio;\r\n }\r\n\r\n /**\r\n * Define the adaptive blur kernel used to blur the reflection if needed.\r\n * This will autocompute the closest best match for the `blurKernel`\r\n */\r\n public set adaptiveBlurKernel(value: number) {\r\n this._adaptiveBlurKernel = value;\r\n this._autoComputeBlurKernel();\r\n }\r\n\r\n /**\r\n * Define the blur kernel used to blur the reflection if needed.\r\n * Please consider using `adaptiveBlurKernel` as it could find the closest best value for you.\r\n */\r\n public set blurKernel(value: number) {\r\n this.blurKernelX = value;\r\n this.blurKernelY = value;\r\n }\r\n\r\n /**\r\n * Define the blur kernel on the X Axis used to blur the reflection if needed.\r\n * Please consider using `adaptiveBlurKernel` as it could find the closest best value for you.\r\n */\r\n public set blurKernelX(value: number) {\r\n if (this._blurKernelX === value) {\r\n return;\r\n }\r\n\r\n this._blurKernelX = value;\r\n this._preparePostProcesses();\r\n }\r\n\r\n public get blurKernelX(): number {\r\n return this._blurKernelX;\r\n }\r\n\r\n /**\r\n * Define the blur kernel on the Y Axis used to blur the reflection if needed.\r\n * Please consider using `adaptiveBlurKernel` as it could find the closest best value for you.\r\n */\r\n public set blurKernelY(value: number) {\r\n if (this._blurKernelY === value) {\r\n return;\r\n }\r\n\r\n this._blurKernelY = value;\r\n this._preparePostProcesses();\r\n }\r\n\r\n public get blurKernelY(): number {\r\n return this._blurKernelY;\r\n }\r\n\r\n private _autoComputeBlurKernel(): void {\r\n const engine = this.getScene()!.getEngine();\r\n\r\n const dw = this.getRenderWidth() / engine.getRenderWidth();\r\n const dh = this.getRenderHeight() / engine.getRenderHeight();\r\n this.blurKernelX = this._adaptiveBlurKernel * dw;\r\n this.blurKernelY = this._adaptiveBlurKernel * dh;\r\n }\r\n\r\n public override resize(size: TextureSize | { ratio: number }): void {\r\n super.resize(size);\r\n if (!this._adaptiveBlurKernel) {\r\n this._preparePostProcesses();\r\n } else {\r\n this._autoComputeBlurKernel();\r\n }\r\n }\r\n\r\n protected override _onRatioRescale(): void {\r\n if (this._sizeRatio) {\r\n this.resize(this._initialSizeParameter);\r\n if (!this._adaptiveBlurKernel) {\r\n this._preparePostProcesses();\r\n }\r\n }\r\n\r\n if (this._adaptiveBlurKernel) {\r\n this._autoComputeBlurKernel();\r\n }\r\n }\r\n\r\n private _updateGammaSpace() {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n this.gammaSpace = !scene.imageProcessingConfiguration.isEnabled || !scene.imageProcessingConfiguration.applyByPostProcess;\r\n }\r\n\r\n private _imageProcessingConfigChangeObserver: Nullable<Observer<ImageProcessingConfiguration>>;\r\n\r\n private _transformMatrix = Matrix.Zero();\r\n private _mirrorMatrix = Matrix.Zero();\r\n\r\n private _blurX: Nullable<BlurPostProcess>;\r\n private _blurY: Nullable<BlurPostProcess>;\r\n private _adaptiveBlurKernel = 0;\r\n private _blurKernelX = 0;\r\n private _blurKernelY = 0;\r\n private _blurRatio = 1.0;\r\n private _sceneUBO: UniformBuffer;\r\n private _currentSceneUBO: UniformBuffer;\r\n\r\n /**\r\n * Instantiates a Mirror Texture.\r\n * Mirror texture can be used to simulate the view from a mirror in a scene.\r\n * It will dynamically be rendered every frame to adapt to the camera point of view.\r\n * You can then easily use it as a reflectionTexture on a flat surface.\r\n * In case the surface is not a plane, please consider relying on reflection probes.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#mirrors\r\n * @param name\r\n * @param size\r\n * @param scene\r\n * @param generateMipMaps\r\n * @param type\r\n * @param samplingMode\r\n * @param generateDepthBuffer\r\n */\r\n constructor(\r\n name: string,\r\n size: number | { width: number; height: number } | { ratio: number },\r\n scene?: Scene,\r\n generateMipMaps?: boolean,\r\n type: number = Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode = Texture.BILINEAR_SAMPLINGMODE,\r\n generateDepthBuffer = true\r\n ) {\r\n super(name, size, scene, generateMipMaps, true, type, false, samplingMode, generateDepthBuffer);\r\n\r\n scene = <Scene>this.getScene();\r\n\r\n if (!scene) {\r\n return this;\r\n }\r\n this.ignoreCameraViewport = true;\r\n\r\n this._updateGammaSpace();\r\n this._imageProcessingConfigChangeObserver = scene.imageProcessingConfiguration.onUpdateParameters.add(() => {\r\n this._updateGammaSpace();\r\n });\r\n\r\n const engine = scene.getEngine();\r\n\r\n if (engine.supportsUniformBuffers) {\r\n this._sceneUBO = scene.createSceneUniformBuffer(`Scene for Mirror Texture (name \"${name}\")`);\r\n }\r\n\r\n let saveClipPlane: Nullable<Plane>;\r\n\r\n this.onBeforeRenderObservable.add(() => {\r\n if (this._sceneUBO) {\r\n this._currentSceneUBO = scene.getSceneUniformBuffer();\r\n scene.setSceneUniformBuffer(this._sceneUBO);\r\n scene.getSceneUniformBuffer().unbindEffect();\r\n }\r\n\r\n Matrix.ReflectionToRef(this.mirrorPlane, this._mirrorMatrix);\r\n this._mirrorMatrix.multiplyToRef(scene.getViewMatrix(), this._transformMatrix);\r\n\r\n scene.setTransformMatrix(this._transformMatrix, scene.getProjectionMatrix());\r\n\r\n saveClipPlane = scene.clipPlane;\r\n scene.clipPlane = this.mirrorPlane;\r\n\r\n scene._mirroredCameraPosition = Vector3.TransformCoordinates((<Camera>scene.activeCamera).globalPosition, this._mirrorMatrix);\r\n });\r\n\r\n this.onAfterRenderObservable.add(() => {\r\n if (this._sceneUBO) {\r\n scene.setSceneUniformBuffer(this._currentSceneUBO);\r\n }\r\n scene.updateTransformMatrix();\r\n scene._mirroredCameraPosition = null;\r\n\r\n scene.clipPlane = saveClipPlane;\r\n });\r\n }\r\n\r\n private _preparePostProcesses(): void {\r\n this.clearPostProcesses(true);\r\n\r\n if (this._blurKernelX && this._blurKernelY) {\r\n const engine = (<Scene>this.getScene()).getEngine();\r\n\r\n const textureType =\r\n engine.getCaps().textureFloatRender && engine.getCaps().textureFloatLinearFiltering ? Constants.TEXTURETYPE_FLOAT : Constants.TEXTURETYPE_HALF_FLOAT;\r\n\r\n this._blurX = new BlurPostProcess(\r\n \"horizontal blur\",\r\n new Vector2(1.0, 0),\r\n this._blurKernelX,\r\n this._blurRatio,\r\n null,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n engine,\r\n false,\r\n textureType\r\n );\r\n this._blurX.autoClear = false;\r\n\r\n if (this._blurRatio === 1 && this.samples < 2 && this._texture) {\r\n this._blurX.inputTexture = this._renderTarget!;\r\n } else {\r\n this._blurX.alwaysForcePOT = true;\r\n }\r\n\r\n this._blurY = new BlurPostProcess(\r\n \"vertical blur\",\r\n new Vector2(0, 1.0),\r\n this._blurKernelY,\r\n this._blurRatio,\r\n null,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n engine,\r\n false,\r\n textureType\r\n );\r\n this._blurY.autoClear = false;\r\n this._blurY.alwaysForcePOT = this._blurRatio !== 1;\r\n\r\n this.addPostProcess(this._blurX);\r\n this.addPostProcess(this._blurY);\r\n } else {\r\n if (this._blurY) {\r\n this.removePostProcess(this._blurY);\r\n this._blurY.dispose();\r\n this._blurY = null;\r\n }\r\n if (this._blurX) {\r\n this.removePostProcess(this._blurX);\r\n this._blurX.dispose();\r\n this._blurX = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clone the mirror texture.\r\n * @returns the cloned texture\r\n */\r\n public override clone(): MirrorTexture {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return this;\r\n }\r\n\r\n const textureSize = this.getSize();\r\n const newTexture = new MirrorTexture(\r\n this.name,\r\n textureSize.width,\r\n scene,\r\n this._renderTargetOptions.generateMipMaps,\r\n this._renderTargetOptions.type,\r\n this._renderTargetOptions.samplingMode,\r\n this._renderTargetOptions.generateDepthBuffer\r\n );\r\n\r\n // Base texture\r\n newTexture.hasAlpha = this.hasAlpha;\r\n newTexture.level = this.level;\r\n\r\n // Mirror Texture\r\n newTexture.mirrorPlane = this.mirrorPlane.clone();\r\n if (this.renderList) {\r\n newTexture.renderList = this.renderList.slice(0);\r\n }\r\n\r\n return newTexture;\r\n }\r\n\r\n /**\r\n * Serialize the texture to a JSON representation you could use in Parse later on\r\n * @returns the serialized JSON representation\r\n */\r\n public override serialize(): any {\r\n if (!this.name) {\r\n return null;\r\n }\r\n\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.mirrorPlane = this.mirrorPlane.asArray();\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Dispose the texture and release its associated resources.\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n const scene = this.getScene();\r\n\r\n if (scene) {\r\n scene.imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingConfigChangeObserver);\r\n }\r\n this._sceneUBO?.dispose();\r\n }\r\n}\r\n\r\nTexture._CreateMirror = (name: string, renderTargetSize: number, scene: Scene, generateMipMaps: boolean): MirrorTexture => {\r\n return new MirrorTexture(name, renderTargetSize, scene, generateMipMaps);\r\n};\r\n"]}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { Scene } from "../../scene.js";
|
|
2
|
+
import { ProceduralTexture } from "./Procedurals/proceduralTexture.js";
|
|
3
|
+
import type { BaseTexture } from "./baseTexture.js";
|
|
4
|
+
import type { TextureSize } from "./textureCreationOptions.js";
|
|
5
|
+
/**
|
|
6
|
+
* Configuration for a texture input source
|
|
7
|
+
*/
|
|
8
|
+
export interface ITextureChannelInput {
|
|
9
|
+
/** The texture to use as input */
|
|
10
|
+
texture: BaseTexture;
|
|
11
|
+
/** Source channel to read from (0=R, 1=G, 2=B, 3=A) */
|
|
12
|
+
sourceChannel: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Configuration for a constant value input source
|
|
16
|
+
*/
|
|
17
|
+
export interface IConstantChannelInput {
|
|
18
|
+
/** Constant value between 0.0 and 1.0 */
|
|
19
|
+
value: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Union type for channel input sources
|
|
23
|
+
*/
|
|
24
|
+
export type ChannelInput = ITextureChannelInput | IConstantChannelInput;
|
|
25
|
+
/**
|
|
26
|
+
* Configuration for texture merging operation
|
|
27
|
+
*/
|
|
28
|
+
export interface ITextureMergeConfiguration {
|
|
29
|
+
/** Configuration for red output channel */
|
|
30
|
+
red: ChannelInput;
|
|
31
|
+
/** Configuration for green output channel (optional, defaults to 0) */
|
|
32
|
+
green?: ChannelInput;
|
|
33
|
+
/** Configuration for blue output channel (optional, defaults to 0) */
|
|
34
|
+
blue?: ChannelInput;
|
|
35
|
+
/** Configuration for alpha output channel (optional, defaults to 1) */
|
|
36
|
+
alpha?: ChannelInput;
|
|
37
|
+
/** Output texture size. If not specified, uses the largest input texture size */
|
|
38
|
+
outputSize?: TextureSize;
|
|
39
|
+
/** Whether to generate mipmaps for the output texture */
|
|
40
|
+
generateMipMaps?: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* @internal
|
|
44
|
+
* Merge multiple texture channels into a single texture
|
|
45
|
+
* @param name Name for the resulting texture
|
|
46
|
+
* @param config Merge configuration
|
|
47
|
+
* @param scene Scene to create the texture in
|
|
48
|
+
* @returns The merged texture
|
|
49
|
+
*/
|
|
50
|
+
export declare function MergeTexturesAsync(name: string, config: ITextureMergeConfiguration, scene: Scene): Promise<ProceduralTexture>;
|
|
51
|
+
/**
|
|
52
|
+
* @internal
|
|
53
|
+
* Create a texture input configuration
|
|
54
|
+
* @param texture The texture to read from
|
|
55
|
+
* @param sourceChannel The channel to read (0=R, 1=G, 2=B, 3=A)
|
|
56
|
+
* @returns Texture channel input configuration
|
|
57
|
+
*/
|
|
58
|
+
export declare function CreateTextureInput(texture: BaseTexture, sourceChannel: number): ITextureChannelInput;
|
|
59
|
+
/**
|
|
60
|
+
* @internal
|
|
61
|
+
* Create a constant value input configuration
|
|
62
|
+
* @param value The constant value (0.0-1.0)
|
|
63
|
+
* @returns Constant channel input configuration
|
|
64
|
+
*/
|
|
65
|
+
export declare function CreateConstantInput(value: number): IConstantChannelInput;
|
|
66
|
+
/**
|
|
67
|
+
* @internal
|
|
68
|
+
* Create a simple RGBA channel packing configuration
|
|
69
|
+
* @param red Input for red channel
|
|
70
|
+
* @param green Input for green channel (optional, defaults to 0)
|
|
71
|
+
* @param blue Input for blue channel (optional, defaults to 0)
|
|
72
|
+
* @param alpha Input for alpha channel (optional, defaults to 1)
|
|
73
|
+
* @returns Texture merge configuration
|
|
74
|
+
*/
|
|
75
|
+
export declare function CreateRGBAConfiguration(red: ChannelInput, green?: ChannelInput, blue?: ChannelInput, alpha?: ChannelInput): ITextureMergeConfiguration;
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { ProceduralTexture } from "./Procedurals/proceduralTexture.js";
|
|
2
|
+
|
|
3
|
+
const _ShaderName = "textureMerger";
|
|
4
|
+
/**
|
|
5
|
+
* @internal
|
|
6
|
+
* Check if a channel input is a texture input
|
|
7
|
+
* @param input The channel input to check
|
|
8
|
+
* @returns True if the input is a texture input, false otherwise
|
|
9
|
+
*/
|
|
10
|
+
function IsTextureInput(input) {
|
|
11
|
+
return "texture" in input;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* @internal
|
|
15
|
+
* Check if a channel input is a constant input
|
|
16
|
+
* @param input The channel input to check
|
|
17
|
+
* @returns True if the input is a constant input, false otherwise
|
|
18
|
+
*/
|
|
19
|
+
function IsConstantInput(input) {
|
|
20
|
+
return "value" in input;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* @internal
|
|
24
|
+
* Copy texture transformation properties from one texture to another
|
|
25
|
+
* @param source The source texture
|
|
26
|
+
* @param destination The destination texture
|
|
27
|
+
*/
|
|
28
|
+
function CopyTextureTransform(source, destination) {
|
|
29
|
+
destination.uOffset = source.uOffset;
|
|
30
|
+
destination.vOffset = source.vOffset;
|
|
31
|
+
destination.uScale = source.uScale;
|
|
32
|
+
destination.vScale = source.vScale;
|
|
33
|
+
destination.uAng = source.uAng;
|
|
34
|
+
destination.vAng = source.vAng;
|
|
35
|
+
destination.wAng = source.wAng;
|
|
36
|
+
destination.uRotationCenter = source.uRotationCenter;
|
|
37
|
+
destination.vRotationCenter = source.vRotationCenter;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* @internal
|
|
41
|
+
* Merge multiple texture channels into a single texture
|
|
42
|
+
* @param name Name for the resulting texture
|
|
43
|
+
* @param config Merge configuration
|
|
44
|
+
* @param scene Scene to create the texture in
|
|
45
|
+
* @returns The merged texture
|
|
46
|
+
*/
|
|
47
|
+
export async function MergeTexturesAsync(name, config, scene) {
|
|
48
|
+
const channels = [config.red, config.green, config.blue, config.alpha];
|
|
49
|
+
const textureInputs = [];
|
|
50
|
+
const textureInputMap = []; // Maps channel index to texture input index (-1 for constants)
|
|
51
|
+
// Collect unique textures and validate inputs
|
|
52
|
+
for (let channelIndex = 0; channelIndex < 4; channelIndex++) {
|
|
53
|
+
const channel = channels[channelIndex];
|
|
54
|
+
if (channel) {
|
|
55
|
+
if (IsTextureInput(channel)) {
|
|
56
|
+
// Validate source channel
|
|
57
|
+
if (channel.sourceChannel < 0 || channel.sourceChannel > 3) {
|
|
58
|
+
throw new Error("Source channel must be between 0 and 3 (R, G, B, A)");
|
|
59
|
+
}
|
|
60
|
+
// Find or add texture to inputs
|
|
61
|
+
let textureIndex = textureInputs.indexOf(channel.texture);
|
|
62
|
+
if (textureIndex === -1) {
|
|
63
|
+
textureIndex = textureInputs.length;
|
|
64
|
+
textureInputs.push(channel.texture);
|
|
65
|
+
}
|
|
66
|
+
textureInputMap[channelIndex] = textureIndex;
|
|
67
|
+
}
|
|
68
|
+
else if (IsConstantInput(channel)) {
|
|
69
|
+
// Validate constant value
|
|
70
|
+
if (channel.value < 0 || channel.value > 1) {
|
|
71
|
+
throw new Error("Constant value must be between 0.0 and 1.0");
|
|
72
|
+
}
|
|
73
|
+
textureInputMap[channelIndex] = -1;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
throw new Error("Invalid channel input configuration");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
textureInputMap[channelIndex] = -1;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Determine output size
|
|
84
|
+
let outputSize = config.outputSize;
|
|
85
|
+
if (!outputSize && textureInputs.length > 0) {
|
|
86
|
+
// Use the largest texture size
|
|
87
|
+
let maxSize = 0;
|
|
88
|
+
for (const texture of textureInputs) {
|
|
89
|
+
const size = texture.getSize();
|
|
90
|
+
const currentSize = Math.max(size.width, size.height);
|
|
91
|
+
if (currentSize > maxSize) {
|
|
92
|
+
maxSize = currentSize;
|
|
93
|
+
outputSize = size.width === size.height ? maxSize : size;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
outputSize = outputSize || 512; // Fallback size
|
|
98
|
+
// Generate shader defines
|
|
99
|
+
const defines = [];
|
|
100
|
+
const usedTextures = new Set();
|
|
101
|
+
for (let channelIndex = 0; channelIndex < 4; channelIndex++) {
|
|
102
|
+
const channel = channels[channelIndex];
|
|
103
|
+
const channelName = ["RED", "GREEN", "BLUE", "ALPHA"][channelIndex];
|
|
104
|
+
if (channel && IsTextureInput(channel)) {
|
|
105
|
+
defines.push(`${channelName}_FROM_TEXTURE`);
|
|
106
|
+
const textureIndex = textureInputMap[channelIndex];
|
|
107
|
+
usedTextures.add(textureIndex);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Add texture defines for used textures
|
|
111
|
+
usedTextures.forEach((textureIndex) => {
|
|
112
|
+
defines.push(`USE_TEXTURE${textureIndex}`);
|
|
113
|
+
});
|
|
114
|
+
// Create the procedural texture
|
|
115
|
+
const outputTextureOptions = {
|
|
116
|
+
type: 2,
|
|
117
|
+
format: 5,
|
|
118
|
+
samplingMode: 1,
|
|
119
|
+
generateDepthBuffer: false,
|
|
120
|
+
generateMipMaps: false,
|
|
121
|
+
shaderLanguage: scene.getEngine().isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */,
|
|
122
|
+
extraInitializationsAsync: async () => {
|
|
123
|
+
if (scene.getEngine().isWebGPU) {
|
|
124
|
+
await Promise.all([import("../../ShadersWGSL/textureMerger.fragment.js")]);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
await Promise.all([import("../../Shaders/textureMerger.fragment.js")]);
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
const proceduralTexture = new ProceduralTexture(name, outputSize, _ShaderName, scene, outputTextureOptions);
|
|
132
|
+
proceduralTexture.refreshRate = -1; // Do not auto-refresh
|
|
133
|
+
// Set the defines
|
|
134
|
+
proceduralTexture.defines = defines.length > 0 ? "#define " + defines.join("\n#define ") + "\n" : "";
|
|
135
|
+
// Set up texture inputs
|
|
136
|
+
for (let i = 0; i < textureInputs.length; i++) {
|
|
137
|
+
CopyTextureTransform(textureInputs[i], proceduralTexture);
|
|
138
|
+
proceduralTexture.setTexture(`inputTexture${i}`, textureInputs[i]);
|
|
139
|
+
}
|
|
140
|
+
// Set up channel configuration
|
|
141
|
+
for (let channelIndex = 0; channelIndex < 4; channelIndex++) {
|
|
142
|
+
const channel = channels[channelIndex];
|
|
143
|
+
const channelName = ["red", "green", "blue", "alpha"][channelIndex];
|
|
144
|
+
if (channel && IsTextureInput(channel)) {
|
|
145
|
+
const textureIndex = textureInputMap[channelIndex];
|
|
146
|
+
proceduralTexture.setInt(`${channelName}TextureIndex`, textureIndex);
|
|
147
|
+
proceduralTexture.setInt(`${channelName}SourceChannel`, channel.sourceChannel);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
// Use constant value (either provided or default)
|
|
151
|
+
let constantValue;
|
|
152
|
+
if (channel && IsConstantInput(channel)) {
|
|
153
|
+
constantValue = channel.value;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
// Use default values: 0 for RGB, 1 for alpha
|
|
157
|
+
constantValue = channelIndex === 3 ? 1.0 : 0.0;
|
|
158
|
+
}
|
|
159
|
+
proceduralTexture.setFloat(`${channelName}ConstantValue`, constantValue);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return await new Promise((resolve, reject) => {
|
|
163
|
+
// Compile and render
|
|
164
|
+
proceduralTexture.executeWhenReady(() => {
|
|
165
|
+
try {
|
|
166
|
+
proceduralTexture.render();
|
|
167
|
+
resolve(proceduralTexture);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* @internal
|
|
177
|
+
* Create a texture input configuration
|
|
178
|
+
* @param texture The texture to read from
|
|
179
|
+
* @param sourceChannel The channel to read (0=R, 1=G, 2=B, 3=A)
|
|
180
|
+
* @returns Texture channel input configuration
|
|
181
|
+
*/
|
|
182
|
+
export function CreateTextureInput(texture, sourceChannel) {
|
|
183
|
+
return { texture, sourceChannel };
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* @internal
|
|
187
|
+
* Create a constant value input configuration
|
|
188
|
+
* @param value The constant value (0.0-1.0)
|
|
189
|
+
* @returns Constant channel input configuration
|
|
190
|
+
*/
|
|
191
|
+
export function CreateConstantInput(value) {
|
|
192
|
+
return { value };
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* @internal
|
|
196
|
+
* Create a simple RGBA channel packing configuration
|
|
197
|
+
* @param red Input for red channel
|
|
198
|
+
* @param green Input for green channel (optional, defaults to 0)
|
|
199
|
+
* @param blue Input for blue channel (optional, defaults to 0)
|
|
200
|
+
* @param alpha Input for alpha channel (optional, defaults to 1)
|
|
201
|
+
* @returns Texture merge configuration
|
|
202
|
+
*/
|
|
203
|
+
export function CreateRGBAConfiguration(red, green, blue, alpha) {
|
|
204
|
+
return { red, green, blue, alpha };
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=textureMerger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textureMerger.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Textures/textureMerger.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"../../scene\";\nimport type { IProceduralTextureCreationOptions } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\nimport { ProceduralTexture } from \"./Procedurals/proceduralTexture\";\nimport type { BaseTexture } from \"./baseTexture\";\nimport type { TextureSize } from \"./textureCreationOptions\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport { Constants } from \"../../Engines/constants\";\nimport type { Texture } from \"./texture\";\n\n/**\n * Configuration for a texture input source\n */\nexport interface ITextureChannelInput {\n /** The texture to use as input */\n texture: BaseTexture;\n /** Source channel to read from (0=R, 1=G, 2=B, 3=A) */\n sourceChannel: number;\n}\n\n/**\n * Configuration for a constant value input source\n */\nexport interface IConstantChannelInput {\n /** Constant value between 0.0 and 1.0 */\n value: number;\n}\n\n/**\n * Union type for channel input sources\n */\nexport type ChannelInput = ITextureChannelInput | IConstantChannelInput;\n\n/**\n * Configuration for texture merging operation\n */\nexport interface ITextureMergeConfiguration {\n /** Configuration for red output channel */\n red: ChannelInput;\n /** Configuration for green output channel (optional, defaults to 0) */\n green?: ChannelInput;\n /** Configuration for blue output channel (optional, defaults to 0) */\n blue?: ChannelInput;\n /** Configuration for alpha output channel (optional, defaults to 1) */\n alpha?: ChannelInput;\n /** Output texture size. If not specified, uses the largest input texture size */\n outputSize?: TextureSize;\n /** Whether to generate mipmaps for the output texture */\n generateMipMaps?: boolean;\n}\n\nconst _ShaderName = \"textureMerger\";\n\n/**\n * @internal\n * Check if a channel input is a texture input\n * @param input The channel input to check\n * @returns True if the input is a texture input, false otherwise\n */\nfunction IsTextureInput(input: ChannelInput): input is ITextureChannelInput {\n return \"texture\" in input;\n}\n\n/**\n * @internal\n * Check if a channel input is a constant input\n * @param input The channel input to check\n * @returns True if the input is a constant input, false otherwise\n */\nfunction IsConstantInput(input: ChannelInput): input is IConstantChannelInput {\n return \"value\" in input;\n}\n\n/**\n * @internal\n * Copy texture transformation properties from one texture to another\n * @param source The source texture\n * @param destination The destination texture\n */\nfunction CopyTextureTransform(source: Texture, destination: Texture) {\n destination.uOffset = source.uOffset;\n destination.vOffset = source.vOffset;\n destination.uScale = source.uScale;\n destination.vScale = source.vScale;\n destination.uAng = source.uAng;\n destination.vAng = source.vAng;\n destination.wAng = source.wAng;\n destination.uRotationCenter = source.uRotationCenter;\n destination.vRotationCenter = source.vRotationCenter;\n}\n\n/**\n * @internal\n * Merge multiple texture channels into a single texture\n * @param name Name for the resulting texture\n * @param config Merge configuration\n * @param scene Scene to create the texture in\n * @returns The merged texture\n */\nexport async function MergeTexturesAsync(name: string, config: ITextureMergeConfiguration, scene: Scene): Promise<ProceduralTexture> {\n const channels = [config.red, config.green, config.blue, config.alpha];\n const textureInputs: BaseTexture[] = [];\n const textureInputMap: number[] = []; // Maps channel index to texture input index (-1 for constants)\n\n // Collect unique textures and validate inputs\n for (let channelIndex = 0; channelIndex < 4; channelIndex++) {\n const channel = channels[channelIndex];\n if (channel) {\n if (IsTextureInput(channel)) {\n // Validate source channel\n if (channel.sourceChannel < 0 || channel.sourceChannel > 3) {\n throw new Error(\"Source channel must be between 0 and 3 (R, G, B, A)\");\n }\n\n // Find or add texture to inputs\n let textureIndex = textureInputs.indexOf(channel.texture);\n if (textureIndex === -1) {\n textureIndex = textureInputs.length;\n textureInputs.push(channel.texture);\n }\n textureInputMap[channelIndex] = textureIndex;\n } else if (IsConstantInput(channel)) {\n // Validate constant value\n if (channel.value < 0 || channel.value > 1) {\n throw new Error(\"Constant value must be between 0.0 and 1.0\");\n }\n textureInputMap[channelIndex] = -1;\n } else {\n throw new Error(\"Invalid channel input configuration\");\n }\n } else {\n textureInputMap[channelIndex] = -1;\n }\n }\n\n // Determine output size\n let outputSize = config.outputSize;\n if (!outputSize && textureInputs.length > 0) {\n // Use the largest texture size\n let maxSize = 0;\n for (const texture of textureInputs) {\n const size = texture.getSize();\n const currentSize = Math.max(size.width, size.height);\n if (currentSize > maxSize) {\n maxSize = currentSize;\n outputSize = size.width === size.height ? maxSize : size;\n }\n }\n }\n outputSize = outputSize || 512; // Fallback size\n\n // Generate shader defines\n const defines: string[] = [];\n const usedTextures = new Set<number>();\n\n for (let channelIndex = 0; channelIndex < 4; channelIndex++) {\n const channel = channels[channelIndex];\n const channelName = [\"RED\", \"GREEN\", \"BLUE\", \"ALPHA\"][channelIndex];\n\n if (channel && IsTextureInput(channel)) {\n defines.push(`${channelName}_FROM_TEXTURE`);\n const textureIndex = textureInputMap[channelIndex];\n usedTextures.add(textureIndex);\n }\n }\n\n // Add texture defines for used textures\n usedTextures.forEach((textureIndex) => {\n defines.push(`USE_TEXTURE${textureIndex}`);\n });\n\n // Create the procedural texture\n const outputTextureOptions: IProceduralTextureCreationOptions = {\n type: Constants.TEXTURETYPE_HALF_FLOAT,\n format: Constants.TEXTUREFORMAT_RGBA,\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n generateDepthBuffer: false,\n generateMipMaps: false,\n shaderLanguage: scene.getEngine().isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (scene.getEngine().isWebGPU) {\n await Promise.all([import(\"../../ShadersWGSL/textureMerger.fragment\")]);\n } else {\n await Promise.all([import(\"../../Shaders/textureMerger.fragment\")]);\n }\n },\n };\n const proceduralTexture = new ProceduralTexture(name, outputSize, _ShaderName, scene, outputTextureOptions);\n proceduralTexture.refreshRate = -1; // Do not auto-refresh\n\n // Set the defines\n proceduralTexture.defines = defines.length > 0 ? \"#define \" + defines.join(\"\\n#define \") + \"\\n\" : \"\";\n\n // Set up texture inputs\n for (let i = 0; i < textureInputs.length; i++) {\n CopyTextureTransform(textureInputs[i] as Texture, proceduralTexture);\n proceduralTexture.setTexture(`inputTexture${i}`, textureInputs[i]);\n }\n\n // Set up channel configuration\n for (let channelIndex = 0; channelIndex < 4; channelIndex++) {\n const channel = channels[channelIndex];\n const channelName = [\"red\", \"green\", \"blue\", \"alpha\"][channelIndex];\n\n if (channel && IsTextureInput(channel)) {\n const textureIndex = textureInputMap[channelIndex];\n proceduralTexture.setInt(`${channelName}TextureIndex`, textureIndex);\n proceduralTexture.setInt(`${channelName}SourceChannel`, channel.sourceChannel);\n } else {\n // Use constant value (either provided or default)\n let constantValue: number;\n if (channel && IsConstantInput(channel)) {\n constantValue = channel.value;\n } else {\n // Use default values: 0 for RGB, 1 for alpha\n constantValue = channelIndex === 3 ? 1.0 : 0.0;\n }\n proceduralTexture.setFloat(`${channelName}ConstantValue`, constantValue);\n }\n }\n\n return await new Promise<ProceduralTexture>((resolve, reject) => {\n // Compile and render\n proceduralTexture.executeWhenReady(() => {\n try {\n proceduralTexture.render();\n resolve(proceduralTexture);\n } catch (error) {\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n });\n}\n\n/**\n * @internal\n * Create a texture input configuration\n * @param texture The texture to read from\n * @param sourceChannel The channel to read (0=R, 1=G, 2=B, 3=A)\n * @returns Texture channel input configuration\n */\nexport function CreateTextureInput(texture: BaseTexture, sourceChannel: number): ITextureChannelInput {\n return { texture, sourceChannel };\n}\n\n/**\n * @internal\n * Create a constant value input configuration\n * @param value The constant value (0.0-1.0)\n * @returns Constant channel input configuration\n */\nexport function CreateConstantInput(value: number): IConstantChannelInput {\n return { value };\n}\n\n/**\n * @internal\n * Create a simple RGBA channel packing configuration\n * @param red Input for red channel\n * @param green Input for green channel (optional, defaults to 0)\n * @param blue Input for blue channel (optional, defaults to 0)\n * @param alpha Input for alpha channel (optional, defaults to 1)\n * @returns Texture merge configuration\n */\nexport function CreateRGBAConfiguration(red: ChannelInput, green?: ChannelInput, blue?: ChannelInput, alpha?: ChannelInput): ITextureMergeConfiguration {\n return { red, green, blue, alpha };\n}\n"]}
|
|
@@ -84,12 +84,13 @@ function OffsetWorldViewProjectionToRef(offset, worldViewProjection, viewProject
|
|
|
84
84
|
return ref;
|
|
85
85
|
}
|
|
86
86
|
function GetOffsetMatrix(uniformName, mat) {
|
|
87
|
-
TempFinalMat.updateFlag = mat.updateFlag;
|
|
88
87
|
const scene = FloatingOriginCurrentScene.getScene();
|
|
89
88
|
// Early out for scenes that don't have floatingOriginMode enabled
|
|
90
|
-
if
|
|
89
|
+
// Effect.setMatrix will call pipelineContext.setMatrix. In WebGPU, this will in turn call ubo.updateMatrix. To avoid double offset, early out if mat is TempFinalMat
|
|
90
|
+
if (!scene || TempFinalMat === mat) {
|
|
91
91
|
return mat;
|
|
92
92
|
}
|
|
93
|
+
TempFinalMat.updateFlag = mat.updateFlag;
|
|
93
94
|
const offset = scene.floatingOriginOffset;
|
|
94
95
|
switch (uniformName) {
|
|
95
96
|
case "world":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floatingOriginMatrixOverrides.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/floatingOriginMatrixOverrides.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"../Materials/effect\";\r\nimport { Matrix } from \"../Maths/math.vector\";\r\nimport type { IMatrixLike, IVector3Like } from \"../Maths/math.like\";\r\nimport { InvertMatrixToRef, MultiplyMatricesToRef } from \"../Maths/ThinMaths/thinMath.matrix.functions\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { DeepImmutable } from \"../types\";\r\nimport { UniformBuffer } from \"./uniformBuffer\";\r\n\r\nconst TempFinalMat: Matrix = new Matrix();\r\nconst TempMat1: Matrix = new Matrix();\r\nconst TempMat2: Matrix = new Matrix();\r\n\r\n/**\r\n * When rendering, each scene will reset this to ensure the correct floating origin offset is when overriding the below functions\r\n */\r\nexport const FloatingOriginCurrentScene = {\r\n getScene: () => undefined as Scene | undefined,\r\n eyeAtCamera: true, // When true, we can assume viewMatrix translation is at origin. Otherwise, we must do full offset calculations\r\n};\r\n\r\nfunction OffsetWorldToRef(offset: IVector3Like, world: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n const refArray = ref.asArray();\r\n const worldArray = world.asArray();\r\n for (let i = 0; i < 16; i++) {\r\n refArray[i] = worldArray[i];\r\n }\r\n refArray[12] -= offset.x;\r\n refArray[13] -= offset.y;\r\n refArray[14] -= offset.z;\r\n ref.markAsUpdated();\r\n return ref;\r\n}\r\n\r\nfunction GetFullOffsetView(offset: IVector3Like, viewMatrix: DeepImmutable<IMatrixLike>, ref: IMatrixLike) {\r\n InvertMatrixToRef(viewMatrix, TempMat1); // TempMat1 = light world matrix (inverse of view)\r\n OffsetWorldToRef(offset, TempMat1, TempMat2); // TempMat2 = offset light world matrix\r\n InvertMatrixToRef(TempMat2, ref); // TempMat1 = offset view matrix\r\n return ref;\r\n}\r\n\r\nfunction OffsetViewToRef(offset: IVector3Like, view: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n // When eye is not at camera, we cannot assume the translation of view matrix is at origin, so we perform full offset calculation\r\n if (!FloatingOriginCurrentScene.eyeAtCamera) {\r\n return GetFullOffsetView(offset, view, ref);\r\n }\r\n const refArray = ref.asArray();\r\n const viewArray = view.asArray();\r\n for (let i = 0; i < 16; i++) {\r\n refArray[i] = viewArray[i];\r\n }\r\n refArray[12] = 0;\r\n refArray[13] = 0;\r\n refArray[14] = 0;\r\n ref.markAsUpdated();\r\n return ref;\r\n}\r\n\r\nfunction OffsetViewProjectionToRef(offset: IVector3Like, view: DeepImmutable<IMatrixLike>, projection: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n MultiplyMatricesToRef(OffsetViewToRef(offset, view, ref), projection, ref);\r\n return ref;\r\n}\r\n\r\nexport function GetOffsetTransformMatrices(\r\n offset: IVector3Like,\r\n viewMatrices: Array<Matrix>,\r\n projectionMatrices: Array<Matrix>,\r\n length: number,\r\n resultArray: Float32Array\r\n): Float32Array {\r\n for (let cascadeIndex = 0; cascadeIndex < length; ++cascadeIndex) {\r\n GetFullOffsetViewProjectionToRef(offset, viewMatrices[cascadeIndex], projectionMatrices[cascadeIndex], TempMat1);\r\n TempMat1.copyToArray(resultArray, cascadeIndex * 16);\r\n }\r\n return resultArray;\r\n}\r\n\r\nfunction OffsetWorldViewToRef(offset: IVector3Like, worldView: DeepImmutable<IMatrixLike>, view: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n // ( world * view ) * inverse ( view ) = world\r\n InvertMatrixToRef(view, TempMat1); // TempMat1 = inverseView\r\n MultiplyMatricesToRef(worldView, TempMat1, TempMat2); // TempMat2 = world, TempMat1 can be reused\r\n\r\n // ( offsetWorld * offsetView ) = offsetWorldView\r\n OffsetWorldToRef(offset, TempMat2, TempMat1); // TempMat1 = offsetWorld\r\n OffsetViewToRef(offset, view, TempMat2); // TempMat2 = offsetView\r\n MultiplyMatricesToRef(TempMat1, TempMat2, ref);\r\n\r\n return ref;\r\n}\r\n\r\nexport function GetFullOffsetViewProjectionToRef(\r\n offset: IVector3Like,\r\n viewMatrix: DeepImmutable<IMatrixLike>,\r\n projectionMatrix: DeepImmutable<IMatrixLike>,\r\n ref: IMatrixLike\r\n): DeepImmutable<IMatrixLike> {\r\n GetFullOffsetView(offset, viewMatrix, TempMat2);\r\n MultiplyMatricesToRef(TempMat2, projectionMatrix, ref);\r\n return ref;\r\n}\r\n\r\nfunction OffsetWorldViewProjectionToRef(\r\n offset: IVector3Like,\r\n worldViewProjection: DeepImmutable<IMatrixLike>,\r\n viewProjection: DeepImmutable<IMatrixLike>,\r\n view: DeepImmutable<IMatrixLike>,\r\n projection: DeepImmutable<IMatrixLike>,\r\n ref: IMatrixLike\r\n): DeepImmutable<IMatrixLike> {\r\n // ( world * view * projection ) * inverse(projection) * inverse(view) = world\r\n // ( world * view * projection ) * inverse (view * projection) = world\r\n InvertMatrixToRef(viewProjection, TempMat1); // TempMat1 = inverse (view * projection)\r\n MultiplyMatricesToRef(worldViewProjection, TempMat1, TempMat2); // TempMat2 = world, TempMat1 can be reused\r\n\r\n // ( offsetWorld * offsetViewProjection) = offsetWorldViewProjection\r\n OffsetWorldToRef(offset, TempMat2, TempMat1); // TempMat1 = offsetWorld\r\n OffsetViewProjectionToRef(offset, view, projection, TempMat2); // TempMat2 = offsetViewProjection\r\n MultiplyMatricesToRef(TempMat1, TempMat2, ref);\r\n\r\n return ref;\r\n}\r\n\r\nfunction GetOffsetMatrix(uniformName: string, mat: IMatrixLike): IMatrixLike {\r\n TempFinalMat.updateFlag = mat.updateFlag;\r\n const scene = FloatingOriginCurrentScene.getScene();\r\n // Early out for scenes that don't have floatingOriginMode enabled\r\n if (!scene) {\r\n return mat;\r\n }\r\n const offset = scene.floatingOriginOffset;\r\n switch (uniformName) {\r\n case \"world\":\r\n return OffsetWorldToRef(offset, mat, TempFinalMat);\r\n case \"view\":\r\n return OffsetViewToRef(offset, mat, TempFinalMat);\r\n case \"worldView\":\r\n return OffsetWorldViewToRef(offset, mat, scene.getViewMatrix(), TempFinalMat);\r\n case \"viewProjection\":\r\n return OffsetViewProjectionToRef(offset, scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n case \"worldViewProjection\":\r\n return OffsetWorldViewProjectionToRef(offset, mat, scene.getTransformMatrix(), scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n default:\r\n return mat;\r\n }\r\n}\r\n\r\n// ---- Overriding the prototypes of effect and uniformBuffer's setMatrix functions ----\r\nconst UniformBufferInternal = UniformBuffer as any;\r\nconst EffectInternal = Effect as any;\r\nconst OriginalUpdateMatrixForUniform = UniformBufferInternal.prototype._updateMatrixForUniform;\r\nconst OriginalSetMatrix = Effect.prototype.setMatrix;\r\n\r\nexport function ResetMatrixFunctions() {\r\n Effect.prototype.setMatrix = OriginalSetMatrix;\r\n EffectInternal._setMatrixOverride = undefined;\r\n UniformBufferInternal.prototype._updateMatrixForUniform = OriginalUpdateMatrixForUniform;\r\n UniformBufferInternal.prototype._updateMatrixForUniformOverride = undefined;\r\n}\r\n\r\nexport function OverrideMatrixFunctions() {\r\n EffectInternal.prototype._setMatrixOverride = OriginalSetMatrix;\r\n EffectInternal.prototype.setMatrix = function (uniformName: string, matrix: IMatrixLike) {\r\n this._setMatrixOverride(uniformName, GetOffsetMatrix(uniformName, matrix));\r\n return this;\r\n };\r\n UniformBufferInternal.prototype._updateMatrixForUniformOverride = OriginalUpdateMatrixForUniform;\r\n UniformBufferInternal.prototype._updateMatrixForUniform = function (uniformName: string, matrix: IMatrixLike) {\r\n this._updateMatrixForUniformOverride(uniformName, GetOffsetMatrix(uniformName, matrix));\r\n };\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"floatingOriginMatrixOverrides.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/floatingOriginMatrixOverrides.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"../Materials/effect\";\r\nimport { Matrix } from \"../Maths/math.vector\";\r\nimport type { IMatrixLike, IVector3Like } from \"../Maths/math.like\";\r\nimport { InvertMatrixToRef, MultiplyMatricesToRef } from \"../Maths/ThinMaths/thinMath.matrix.functions\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { DeepImmutable } from \"../types\";\r\nimport { UniformBuffer } from \"./uniformBuffer\";\r\n\r\nconst TempFinalMat: Matrix = new Matrix();\r\nconst TempMat1: Matrix = new Matrix();\r\nconst TempMat2: Matrix = new Matrix();\r\n\r\n/**\r\n * When rendering, each scene will reset this to ensure the correct floating origin offset is when overriding the below functions\r\n */\r\nexport const FloatingOriginCurrentScene = {\r\n getScene: () => undefined as Scene | undefined,\r\n eyeAtCamera: true, // When true, we can assume viewMatrix translation is at origin. Otherwise, we must do full offset calculations\r\n};\r\n\r\nfunction OffsetWorldToRef(offset: IVector3Like, world: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n const refArray = ref.asArray();\r\n const worldArray = world.asArray();\r\n for (let i = 0; i < 16; i++) {\r\n refArray[i] = worldArray[i];\r\n }\r\n refArray[12] -= offset.x;\r\n refArray[13] -= offset.y;\r\n refArray[14] -= offset.z;\r\n ref.markAsUpdated();\r\n return ref;\r\n}\r\n\r\nfunction GetFullOffsetView(offset: IVector3Like, viewMatrix: DeepImmutable<IMatrixLike>, ref: IMatrixLike) {\r\n InvertMatrixToRef(viewMatrix, TempMat1); // TempMat1 = light world matrix (inverse of view)\r\n OffsetWorldToRef(offset, TempMat1, TempMat2); // TempMat2 = offset light world matrix\r\n InvertMatrixToRef(TempMat2, ref); // TempMat1 = offset view matrix\r\n return ref;\r\n}\r\n\r\nfunction OffsetViewToRef(offset: IVector3Like, view: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n // When eye is not at camera, we cannot assume the translation of view matrix is at origin, so we perform full offset calculation\r\n if (!FloatingOriginCurrentScene.eyeAtCamera) {\r\n return GetFullOffsetView(offset, view, ref);\r\n }\r\n const refArray = ref.asArray();\r\n const viewArray = view.asArray();\r\n for (let i = 0; i < 16; i++) {\r\n refArray[i] = viewArray[i];\r\n }\r\n refArray[12] = 0;\r\n refArray[13] = 0;\r\n refArray[14] = 0;\r\n ref.markAsUpdated();\r\n return ref;\r\n}\r\n\r\nfunction OffsetViewProjectionToRef(offset: IVector3Like, view: DeepImmutable<IMatrixLike>, projection: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n MultiplyMatricesToRef(OffsetViewToRef(offset, view, ref), projection, ref);\r\n return ref;\r\n}\r\n\r\nexport function GetOffsetTransformMatrices(\r\n offset: IVector3Like,\r\n viewMatrices: Array<Matrix>,\r\n projectionMatrices: Array<Matrix>,\r\n length: number,\r\n resultArray: Float32Array\r\n): Float32Array {\r\n for (let cascadeIndex = 0; cascadeIndex < length; ++cascadeIndex) {\r\n GetFullOffsetViewProjectionToRef(offset, viewMatrices[cascadeIndex], projectionMatrices[cascadeIndex], TempMat1);\r\n TempMat1.copyToArray(resultArray, cascadeIndex * 16);\r\n }\r\n return resultArray;\r\n}\r\n\r\nfunction OffsetWorldViewToRef(offset: IVector3Like, worldView: DeepImmutable<IMatrixLike>, view: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n // ( world * view ) * inverse ( view ) = world\r\n InvertMatrixToRef(view, TempMat1); // TempMat1 = inverseView\r\n MultiplyMatricesToRef(worldView, TempMat1, TempMat2); // TempMat2 = world, TempMat1 can be reused\r\n\r\n // ( offsetWorld * offsetView ) = offsetWorldView\r\n OffsetWorldToRef(offset, TempMat2, TempMat1); // TempMat1 = offsetWorld\r\n OffsetViewToRef(offset, view, TempMat2); // TempMat2 = offsetView\r\n MultiplyMatricesToRef(TempMat1, TempMat2, ref);\r\n\r\n return ref;\r\n}\r\n\r\nexport function GetFullOffsetViewProjectionToRef(\r\n offset: IVector3Like,\r\n viewMatrix: DeepImmutable<IMatrixLike>,\r\n projectionMatrix: DeepImmutable<IMatrixLike>,\r\n ref: IMatrixLike\r\n): DeepImmutable<IMatrixLike> {\r\n GetFullOffsetView(offset, viewMatrix, TempMat2);\r\n MultiplyMatricesToRef(TempMat2, projectionMatrix, ref);\r\n return ref;\r\n}\r\n\r\nfunction OffsetWorldViewProjectionToRef(\r\n offset: IVector3Like,\r\n worldViewProjection: DeepImmutable<IMatrixLike>,\r\n viewProjection: DeepImmutable<IMatrixLike>,\r\n view: DeepImmutable<IMatrixLike>,\r\n projection: DeepImmutable<IMatrixLike>,\r\n ref: IMatrixLike\r\n): DeepImmutable<IMatrixLike> {\r\n // ( world * view * projection ) * inverse(projection) * inverse(view) = world\r\n // ( world * view * projection ) * inverse (view * projection) = world\r\n InvertMatrixToRef(viewProjection, TempMat1); // TempMat1 = inverse (view * projection)\r\n MultiplyMatricesToRef(worldViewProjection, TempMat1, TempMat2); // TempMat2 = world, TempMat1 can be reused\r\n\r\n // ( offsetWorld * offsetViewProjection) = offsetWorldViewProjection\r\n OffsetWorldToRef(offset, TempMat2, TempMat1); // TempMat1 = offsetWorld\r\n OffsetViewProjectionToRef(offset, view, projection, TempMat2); // TempMat2 = offsetViewProjection\r\n MultiplyMatricesToRef(TempMat1, TempMat2, ref);\r\n\r\n return ref;\r\n}\r\n\r\nfunction GetOffsetMatrix(uniformName: string, mat: IMatrixLike): IMatrixLike {\r\n const scene = FloatingOriginCurrentScene.getScene();\r\n // Early out for scenes that don't have floatingOriginMode enabled\r\n // Effect.setMatrix will call pipelineContext.setMatrix. In WebGPU, this will in turn call ubo.updateMatrix. To avoid double offset, early out if mat is TempFinalMat\r\n if (!scene || TempFinalMat === mat) {\r\n return mat;\r\n }\r\n TempFinalMat.updateFlag = mat.updateFlag;\r\n const offset = scene.floatingOriginOffset;\r\n switch (uniformName) {\r\n case \"world\":\r\n return OffsetWorldToRef(offset, mat, TempFinalMat);\r\n case \"view\":\r\n return OffsetViewToRef(offset, mat, TempFinalMat);\r\n case \"worldView\":\r\n return OffsetWorldViewToRef(offset, mat, scene.getViewMatrix(), TempFinalMat);\r\n case \"viewProjection\":\r\n return OffsetViewProjectionToRef(offset, scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n case \"worldViewProjection\":\r\n return OffsetWorldViewProjectionToRef(offset, mat, scene.getTransformMatrix(), scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n default:\r\n return mat;\r\n }\r\n}\r\n\r\n// ---- Overriding the prototypes of effect and uniformBuffer's setMatrix functions ----\r\nconst UniformBufferInternal = UniformBuffer as any;\r\nconst EffectInternal = Effect as any;\r\nconst OriginalUpdateMatrixForUniform = UniformBufferInternal.prototype._updateMatrixForUniform;\r\nconst OriginalSetMatrix = Effect.prototype.setMatrix;\r\n\r\nexport function ResetMatrixFunctions() {\r\n Effect.prototype.setMatrix = OriginalSetMatrix;\r\n EffectInternal._setMatrixOverride = undefined;\r\n UniformBufferInternal.prototype._updateMatrixForUniform = OriginalUpdateMatrixForUniform;\r\n UniformBufferInternal.prototype._updateMatrixForUniformOverride = undefined;\r\n}\r\n\r\nexport function OverrideMatrixFunctions() {\r\n EffectInternal.prototype._setMatrixOverride = OriginalSetMatrix;\r\n EffectInternal.prototype.setMatrix = function (uniformName: string, matrix: IMatrixLike) {\r\n this._setMatrixOverride(uniformName, GetOffsetMatrix(uniformName, matrix));\r\n return this;\r\n };\r\n UniformBufferInternal.prototype._updateMatrixForUniformOverride = OriginalUpdateMatrixForUniform;\r\n UniformBufferInternal.prototype._updateMatrixForUniform = function (uniformName: string, matrix: IMatrixLike) {\r\n this._updateMatrixForUniformOverride(uniformName, GetOffsetMatrix(uniformName, matrix));\r\n };\r\n}\r\n"]}
|
package/Meshes/mesh.js
CHANGED
|
@@ -2105,7 +2105,7 @@ export class Mesh extends AbstractMesh {
|
|
|
2105
2105
|
if (!instanceDataStorage.isFrozen &&
|
|
2106
2106
|
(this._internalMeshDataInfo._effectiveMaterial.backFaceCulling ||
|
|
2107
2107
|
this._internalMeshDataInfo._effectiveMaterial.sideOrientation !== null ||
|
|
2108
|
-
this._internalMeshDataInfo._effectiveMaterial.
|
|
2108
|
+
this._internalMeshDataInfo._effectiveMaterial._twoSidedLighting)) {
|
|
2109
2109
|
// Note: if two sided lighting is enabled, we need to ensure that the normal will point in the right direction even if the determinant of the world matrix is negative
|
|
2110
2110
|
const mainDeterminant = effectiveMesh._getWorldMatrixDeterminant();
|
|
2111
2111
|
sideOrientation = this._internalMeshDataInfo._effectiveMaterial._getEffectiveOrientation(this);
|