@onerjs/addons 8.42.7 → 8.42.9
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/atmosphere/atmosphere.d.ts +6 -0
- package/atmosphere/atmosphere.js +42 -0
- package/atmosphere/atmosphere.js.map +1 -1
- package/atmosphere/atmospherePBRMaterialPlugin.js +15 -5
- package/atmosphere/atmospherePBRMaterialPlugin.js.map +1 -1
- package/msdfText/textRenderer.js +2 -2
- package/msdfText/textRenderer.js.map +1 -1
- package/package.json +2 -2
|
@@ -301,6 +301,12 @@ export declare class Atmosphere implements IDisposable {
|
|
|
301
301
|
* @param enabled - True to enable the atmosphere, false to disable it.
|
|
302
302
|
*/
|
|
303
303
|
setEnabled(enabled: boolean): void;
|
|
304
|
+
/**
|
|
305
|
+
* Returns true if the atmosphere is ready for rendering.
|
|
306
|
+
* Note, this will cause a render of the global LUTs if they are not up to date.
|
|
307
|
+
* @returns true if the atmosphere is ready
|
|
308
|
+
*/
|
|
309
|
+
isReady(): boolean;
|
|
304
310
|
/**
|
|
305
311
|
* The class name of the {@link Atmosphere}.
|
|
306
312
|
* @returns - The class name of the atmosphere.
|
package/atmosphere/atmosphere.js
CHANGED
|
@@ -692,11 +692,13 @@ export class Atmosphere {
|
|
|
692
692
|
}
|
|
693
693
|
return null;
|
|
694
694
|
});
|
|
695
|
+
scene.addIsReadyCheck(this);
|
|
695
696
|
}
|
|
696
697
|
/**
|
|
697
698
|
* @override
|
|
698
699
|
*/
|
|
699
700
|
dispose() {
|
|
701
|
+
this.scene.removeIsReadyCheck(this);
|
|
700
702
|
this._onBeforeCameraRenderObserver?.remove();
|
|
701
703
|
this._onBeforeCameraRenderObserver = null;
|
|
702
704
|
this._onBeforeDrawPhaseObserver?.remove();
|
|
@@ -752,6 +754,46 @@ export class Atmosphere {
|
|
|
752
754
|
setEnabled(enabled) {
|
|
753
755
|
this._isEnabled = enabled;
|
|
754
756
|
}
|
|
757
|
+
/**
|
|
758
|
+
* Returns true if the atmosphere is ready for rendering.
|
|
759
|
+
* Note, this will cause a render of the global LUTs if they are not up to date.
|
|
760
|
+
* @returns true if the atmosphere is ready
|
|
761
|
+
*/
|
|
762
|
+
isReady() {
|
|
763
|
+
if (!this._isEnabled) {
|
|
764
|
+
return true;
|
|
765
|
+
}
|
|
766
|
+
const engine = this._engine;
|
|
767
|
+
const uniformBuffer = this.uniformBuffer;
|
|
768
|
+
const isSkyViewLutEnabled = this._isSkyViewLutEnabled;
|
|
769
|
+
const isLinearSpaceComposition = this._isLinearSpaceComposition;
|
|
770
|
+
const applyApproximateTransmittance = this._applyApproximateTransmittance;
|
|
771
|
+
const depthTexture = this.depthTexture;
|
|
772
|
+
this._skyCompositorEffectWrapper ?? (this._skyCompositorEffectWrapper = CreateSkyCompositorEffectWrapper(engine, uniformBuffer, isSkyViewLutEnabled, isLinearSpaceComposition, applyApproximateTransmittance));
|
|
773
|
+
this._globeAtmosphereCompositorEffectWrapper ?? (this._globeAtmosphereCompositorEffectWrapper = CreateGlobeAtmosphereCompositorEffectWrapper(engine, uniformBuffer, isSkyViewLutEnabled, isLinearSpaceComposition, applyApproximateTransmittance, this._aerialPerspectiveIntensity, this._aerialPerspectiveRadianceBias, depthTexture !== null));
|
|
774
|
+
if (depthTexture !== null) {
|
|
775
|
+
this._aerialPerspectiveCompositorEffectWrapper ?? (this._aerialPerspectiveCompositorEffectWrapper = CreateAerialPerspectiveCompositorEffectWrapper(engine, uniformBuffer, this._isAerialPerspectiveLutEnabled, isSkyViewLutEnabled, isLinearSpaceComposition, applyApproximateTransmittance, this._aerialPerspectiveIntensity, this._aerialPerspectiveRadianceBias));
|
|
776
|
+
}
|
|
777
|
+
this.renderGlobalLuts(); // Start rendering of global LUTs during readiness polling.
|
|
778
|
+
if (!this._transmittanceLut?.hasLutData || (this._isDiffuseSkyIrradianceLutEnabled && !this._diffuseSkyIrradianceLut?.hasLutData)) {
|
|
779
|
+
return false;
|
|
780
|
+
}
|
|
781
|
+
if (!this._hasRenderedMultiScatteringLut || this._multiScatteringLutRenderTarget?.isReady() === false || this._multiScatteringEffectWrapper?.isReady() === false) {
|
|
782
|
+
return false;
|
|
783
|
+
}
|
|
784
|
+
if (this._isSkyViewLutEnabled && (this._skyViewLutRenderTarget?.isReady() === false || this._skyViewLutEffectWrapper?.isReady() === false)) {
|
|
785
|
+
return false;
|
|
786
|
+
}
|
|
787
|
+
if (this._isAerialPerspectiveLutEnabled && (this._aerialPerspectiveLutRenderTarget?.isReady() === false || this._aerialPerspectiveLutEffectWrapper?.isReady() === false)) {
|
|
788
|
+
return false;
|
|
789
|
+
}
|
|
790
|
+
if (this._skyCompositorEffectWrapper?.isReady() === false ||
|
|
791
|
+
this._aerialPerspectiveCompositorEffectWrapper?.isReady() === false ||
|
|
792
|
+
this._globeAtmosphereCompositorEffectWrapper?.isReady() === false) {
|
|
793
|
+
return false;
|
|
794
|
+
}
|
|
795
|
+
return true;
|
|
796
|
+
}
|
|
755
797
|
/**
|
|
756
798
|
* The class name of the {@link Atmosphere}.
|
|
757
799
|
* @returns - The class name of the atmosphere.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atmosphere.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmosphere.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// Licensed under the MIT License.\r\n\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { AtmospherePBRMaterialPlugin } from \"./atmospherePBRMaterialPlugin\";\r\nimport { AtmospherePerCameraVariables } from \"./atmospherePerCameraVariables\";\r\nimport { AtmospherePhysicalProperties } from \"./atmospherePhysicalProperties\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { DeepImmutable, Nullable } from \"core/types\";\r\nimport { DiffuseSkyIrradianceLut } from \"./diffuseSkyIrradianceLut\";\r\nimport type { DirectionalLight } from \"core/Lights/directionalLight\";\r\nimport type { Effect } from \"core/Materials/effect\";\r\nimport { EffectRenderer, EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport type { IAtmosphereOptions } from \"./atmosphereOptions\";\r\nimport type { IColor3Like, IVector3Like } from \"core/Maths/math.like\";\r\nimport type { IDisposable, Scene } from \"core/scene\";\r\nimport { Observable, type Observer } from \"core/Misc/observable\";\r\nimport { RegisterMaterialPlugin, UnregisterMaterialPlugin } from \"core/Materials/materialPluginManager\";\r\nimport type { RenderingGroupInfo } from \"core/Rendering/renderingManager\";\r\nimport { RenderTargetTexture, type RenderTargetTextureOptions } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { TransmittanceLut } from \"./transmittanceLut\";\r\nimport { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\n\r\nconst MaterialPlugin = \"atmo-pbr\";\r\n\r\nconst AerialPerspectiveLutLayers = 32;\r\n\r\nlet UniqueId = 0;\r\n\r\n/**\r\n * Renders a physically based atmosphere.\r\n * Use {@link IsSupported} to check if the atmosphere is supported before creating an instance.\r\n * @experimental\r\n */\r\nexport class Atmosphere implements IDisposable {\r\n private readonly _directionToLight = Vector3.Zero();\r\n private readonly _tempSceneAmbient = new Color3();\r\n private readonly _engine: AbstractEngine;\r\n private readonly _isDiffuseSkyIrradianceLutEnabled: boolean;\r\n private _physicalProperties: AtmospherePhysicalProperties;\r\n private _transmittanceLut: Nullable<TransmittanceLut>;\r\n private _diffuseSkyIrradianceLut: Nullable<DiffuseSkyIrradianceLut>;\r\n private _isSkyViewLutEnabled: boolean;\r\n private _isAerialPerspectiveLutEnabled: boolean;\r\n private _aerialPerspectiveTransmittanceScale: number;\r\n private _aerialPerspectiveSaturation: number;\r\n private _aerialPerspectiveIntensity: number;\r\n private _aerialPerspectiveRadianceBias: number;\r\n private _diffuseSkyIrradianceDesaturationFactor: number;\r\n private _additionalDiffuseSkyIrradianceIntensity: number;\r\n private _additionalDiffuseSkyIrradianceColor: Color3;\r\n private _additionalDiffuseSkyIrradiance = new Color3();\r\n private _diffuseSkyIrradianceIntensity: number;\r\n private _multiScatteringIntensity: number;\r\n private _groundAlbedo: Color3;\r\n private _minimumMultiScatteringColor: Color3;\r\n private _minimumMultiScatteringIntensity: number;\r\n private _lights: DirectionalLight[];\r\n private _atmosphereUbo: Nullable<UniformBuffer> = null;\r\n private _minimumMultiScattering = new Vector3();\r\n private _cameraAtmosphereVariables = new AtmospherePerCameraVariables();\r\n private _isLinearSpaceComposition: boolean;\r\n private _isLinearSpaceLight: boolean;\r\n private _lightRadianceAtCamera = new Vector3();\r\n private _linearLightColor = new Color3();\r\n private _originHeight: number;\r\n private _applyApproximateTransmittance: boolean;\r\n private _exposure: number;\r\n private _atmosphereUniformBufferAsArray: UniformBuffer[] = [];\r\n private _effectRenderer: Nullable<EffectRenderer> = null;\r\n private _skyRenderingGroup: number;\r\n private _aerialPerspectiveRenderingGroup: number;\r\n private _globeAtmosphereRenderingGroup: number;\r\n private _isEnabled = true;\r\n private _aerialPerspectiveLutHasBeenRendered = false;\r\n\r\n private _hasRenderedMultiScatteringLut = false;\r\n private _hasEverRenderedMultiScatteringLut = false;\r\n private _multiScatteringEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _multiScatteringLutRenderTarget: Nullable<RenderTargetTexture> = null;\r\n\r\n private _aerialPerspectiveLutEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _aerialPerspectiveLutEffectRenderer: Nullable<EffectRenderer> = null;\r\n private _aerialPerspectiveLutRenderTarget: Nullable<RenderTargetTexture> = null;\r\n\r\n private _skyViewLutEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _skyViewLutEffectRenderer: Nullable<EffectRenderer> = null;\r\n private _skyViewLutRenderTarget: Nullable<RenderTargetTexture> = null;\r\n\r\n private _aerialPerspectiveCompositorEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _skyCompositorEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _globeAtmosphereCompositorEffectWrapper: Nullable<EffectWrapper> = null;\r\n\r\n private _onBeforeCameraRenderObserver: Nullable<Observer<Camera>> = null;\r\n private _onBeforeRenderObserver: Nullable<Observer<Scene>> = null;\r\n private _onBeforeDrawPhaseObserver: Nullable<Observer<Scene>> = null;\r\n private _onAfterRenderingGroupObserver: Nullable<Observer<RenderingGroupInfo>> = null;\r\n\r\n /**\r\n * Checks if the {@link Atmosphere} is supported.\r\n * @param engine - The engine to check.\r\n * @returns True if the atmosphere is supported, false otherwise.\r\n */\r\n public static IsSupported(engine: AbstractEngine): boolean {\r\n return !engine._badOS && (engine.isWebGPU || engine.version >= 2);\r\n }\r\n\r\n /**\r\n * The unique ID of this atmosphere instance.\r\n */\r\n public readonly uniqueId = UniqueId++;\r\n\r\n /**\r\n * Called after the atmosphere variables have been updated for the specified camera.\r\n */\r\n public readonly onAfterUpdateVariablesForCameraObservable = new Observable<Camera>();\r\n\r\n /**\r\n * Called immediately before the light variables are finalized.\r\n */\r\n public readonly onBeforeLightVariablesUpdateObservable = new Observable<void>();\r\n\r\n /**\r\n * Called before the LUTs are rendered for this camera. This happens after the per-camera UBO update.\r\n */\r\n public readonly onBeforeRenderLutsForCameraObservable = new Observable<Camera>();\r\n\r\n /**\r\n * Called after the LUTs were rendered.\r\n */\r\n public readonly onAfterRenderLutsForCameraObservable = new Observable<Camera>();\r\n\r\n /**\r\n * If provided, this is the depth texture used for composition passes.\r\n * Expects an infinite far plane on the camera (camera.maxZ = 0) and the non-linear depth accessible in red channel.\r\n * @internal\r\n */\r\n public readonly depthTexture: Nullable<BaseTexture> = null;\r\n\r\n /**\r\n * Controls the overall brightness of the atmosphere rendering.\r\n */\r\n public get exposure(): number {\r\n return this._exposure;\r\n }\r\n\r\n public set exposure(value: number) {\r\n this._exposure = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Affects the overall intensity of the multiple scattering.\r\n */\r\n public get multiScatteringIntensity(): number {\r\n return this._multiScatteringIntensity;\r\n }\r\n\r\n public set multiScatteringIntensity(value: number) {\r\n const newValue = Math.max(0.0, value);\r\n if (newValue !== this._multiScatteringIntensity) {\r\n this._multiScatteringIntensity = value;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Affects the multiply scattered light contribution in the atmosphere by describing the average light color reflected off the ground.\r\n */\r\n public get groundAlbedo(): DeepImmutable<IColor3Like> {\r\n return this._groundAlbedo;\r\n }\r\n\r\n public set groundAlbedo(value: DeepImmutable<IColor3Like>) {\r\n if (!this._groundAlbedo.equals(value)) {\r\n this._groundAlbedo.copyFrom(value);\r\n this._multiScatteringEffectWrapper?.dispose();\r\n this._multiScatteringEffectWrapper = null;\r\n this._hasRenderedMultiScatteringLut = false;\r\n }\r\n }\r\n\r\n /**\r\n * Can be used to clamp the multiple scattering to a minimum value.\r\n */\r\n public get minimumMultiScatteringColor(): DeepImmutable<IColor3Like> {\r\n return this._minimumMultiScatteringColor;\r\n }\r\n\r\n public set minimumMultiScatteringColor(value: DeepImmutable<IColor3Like>) {\r\n if (!this._minimumMultiScatteringColor.equals(value)) {\r\n const minimumScatteringColor = this._minimumMultiScatteringColor.copyFrom(value);\r\n this._minimumMultiScattering.x = minimumScatteringColor.r * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.y = minimumScatteringColor.g * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.z = minimumScatteringColor.b * this._minimumMultiScatteringIntensity;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * This is an additional scaling factor applied to the {@link minimumMultiScatteringColor}.\r\n */\r\n public get minimumMultiScatteringIntensity(): number {\r\n return this._minimumMultiScatteringIntensity;\r\n }\r\n\r\n public set minimumMultiScatteringIntensity(value: number) {\r\n const newValue = Math.max(0.0, value);\r\n if (newValue !== this._minimumMultiScatteringIntensity) {\r\n this._minimumMultiScatteringIntensity = value;\r\n this._minimumMultiScattering.x = this._minimumMultiScatteringColor.r * value;\r\n this._minimumMultiScattering.y = this._minimumMultiScatteringColor.g * value;\r\n this._minimumMultiScattering.z = this._minimumMultiScatteringColor.b * value;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Can be used to force the diffuse irradiance towards a gray color.\r\n */\r\n public get diffuseSkyIrradianceDesaturationFactor(): number {\r\n return this._diffuseSkyIrradianceDesaturationFactor;\r\n }\r\n\r\n public set diffuseSkyIrradianceDesaturationFactor(value: number) {\r\n const newValue = Math.max(value, 0.0);\r\n if (newValue !== this._diffuseSkyIrradianceDesaturationFactor) {\r\n this._diffuseSkyIrradianceDesaturationFactor = newValue;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * This is an additional amount of irradiance added to the diffuse irradiance.\r\n */\r\n public get additionalDiffuseSkyIrradianceIntensity(): number {\r\n return this._additionalDiffuseSkyIrradianceIntensity;\r\n }\r\n\r\n public set additionalDiffuseSkyIrradianceIntensity(value: number) {\r\n value = Math.max(0.0, value);\r\n if (value !== this._additionalDiffuseSkyIrradianceIntensity) {\r\n this._additionalDiffuseSkyIrradianceIntensity = value;\r\n this._additionalDiffuseSkyIrradianceColor.scaleToRef(value, this._additionalDiffuseSkyIrradiance);\r\n }\r\n }\r\n\r\n /**\r\n * This is the color for the additional amount of irradiance added to the diffuse irradiance.\r\n */\r\n public get additionalDiffuseSkyIrradianceColor(): DeepImmutable<IColor3Like> {\r\n return this._additionalDiffuseSkyIrradianceColor;\r\n }\r\n\r\n public set additionalDiffuseSkyIrradianceColor(value: DeepImmutable<IColor3Like>) {\r\n if (!this._additionalDiffuseSkyIrradianceColor.equals(value)) {\r\n this._additionalDiffuseSkyIrradianceColor.copyFrom(value).scaleToRef(this._additionalDiffuseSkyIrradianceIntensity, this._additionalDiffuseSkyIrradiance);\r\n }\r\n }\r\n\r\n /**\r\n * The final additional diffuse irradiance, taking into account the intensity and color.\r\n */\r\n public get additionalDiffuseSkyIrradiance(): DeepImmutable<IColor3Like> {\r\n return this._additionalDiffuseSkyIrradiance;\r\n }\r\n\r\n /**\r\n * The intensity of the diffuse irradiance.\r\n */\r\n public get diffuseSkyIrradianceIntensity(): number {\r\n return this._diffuseSkyIrradianceIntensity;\r\n }\r\n\r\n public set diffuseSkyIrradianceIntensity(value: number) {\r\n this._diffuseSkyIrradianceIntensity = Math.max(value, 0.0);\r\n }\r\n\r\n /**\r\n * True if the sky view LUT should be used for compositing the sky instead of a per-pixel ray march.\r\n */\r\n public get isSkyViewLutEnabled(): boolean {\r\n return this._isSkyViewLutEnabled;\r\n }\r\n\r\n public set isSkyViewLutEnabled(value: boolean) {\r\n this._isSkyViewLutEnabled = value;\r\n this._disposeSkyCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n\r\n /**\r\n * Gets the sky view LUT render target or null if not enabled.\r\n * @returns The render target.\r\n */\r\n public get skyViewLutRenderTarget(): Nullable<RenderTargetTexture> {\r\n if (!this._isSkyViewLutEnabled) {\r\n return null;\r\n }\r\n\r\n if (this._skyViewLutRenderTarget !== null) {\r\n return this._skyViewLutRenderTarget;\r\n }\r\n\r\n const renderTarget = (this._skyViewLutRenderTarget = CreateRenderTargetTexture(\"atmo-skyView\", { width: 128, height: 128 }, this.scene));\r\n renderTarget.coordinatesMode = Constants.TEXTURE_EQUIRECTANGULAR_MODE;\r\n\r\n this._skyViewLutEffectWrapper = CreateSkyViewEffectWrapper(this._engine, this.uniformBuffer);\r\n\r\n return renderTarget;\r\n }\r\n /**\r\n * True if the aerial perspective LUT should be used.\r\n * If false, full ray marching would be used instead.\r\n */\r\n public get isAerialPerspectiveLutEnabled(): boolean {\r\n return this._isAerialPerspectiveLutEnabled;\r\n }\r\n\r\n public set isAerialPerspectiveLutEnabled(value: boolean) {\r\n this._isAerialPerspectiveLutEnabled = value;\r\n this._disposeAerialPerspectiveCompositor();\r\n }\r\n\r\n /**\r\n * Gets the aerial perspective LUT render target or null if not enabled.\r\n * @returns The render target.\r\n */\r\n public get aerialPerspectiveLutRenderTarget(): Nullable<RenderTargetTexture> {\r\n if (!this._isAerialPerspectiveLutEnabled) {\r\n return null;\r\n }\r\n\r\n if (this._aerialPerspectiveLutRenderTarget !== null) {\r\n return this._aerialPerspectiveLutRenderTarget;\r\n }\r\n\r\n const scene = this.scene;\r\n const name = \"atmo-aerialPerspective\";\r\n const renderTarget = (this._aerialPerspectiveLutRenderTarget = CreateRenderTargetTexture(name, { width: 16, height: 64, layers: AerialPerspectiveLutLayers }, scene, {}));\r\n this._aerialPerspectiveLutEffectWrapper = CreateAerialPerspectiveEffectWrapper(this._engine, this.uniformBuffer);\r\n\r\n return renderTarget;\r\n }\r\n\r\n /**\r\n * The intensity of the aerial perspective.\r\n */\r\n public get aerialPerspectiveIntensity(): number {\r\n return this._aerialPerspectiveIntensity;\r\n }\r\n\r\n public set aerialPerspectiveIntensity(value: number) {\r\n value = Math.max(0.001, value);\r\n if (value !== this._aerialPerspectiveIntensity) {\r\n // Define only needs to change if the value is changing between 1 and not 1.\r\n const hasDefineChanged = (value === 1) !== (this._aerialPerspectiveIntensity === 1);\r\n this._aerialPerspectiveIntensity = value;\r\n if (hasDefineChanged) {\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * The amount of light transmitted into aerial perspective.\r\n * A scale of 1 is physically correct.\r\n */\r\n public get aerialPerspectiveTransmittanceScale(): number {\r\n return this._aerialPerspectiveTransmittanceScale;\r\n }\r\n\r\n public set aerialPerspectiveTransmittanceScale(value: number) {\r\n value = Math.max(0, value);\r\n if (value !== this._aerialPerspectiveTransmittanceScale) {\r\n this._aerialPerspectiveTransmittanceScale = value;\r\n }\r\n }\r\n\r\n /**\r\n * The amount of saturation applied to the aerial perspective.\r\n * Reducing to zero desaturates the aerial perspective completely.\r\n * A value of 1 has no effect.\r\n */\r\n public get aerialPerspectiveSaturation(): number {\r\n return this._aerialPerspectiveSaturation;\r\n }\r\n\r\n public set aerialPerspectiveSaturation(value: number) {\r\n value = Math.max(0.0, value);\r\n if (value !== this._aerialPerspectiveSaturation) {\r\n this._aerialPerspectiveSaturation = value;\r\n }\r\n }\r\n\r\n /**\r\n * A radiance bias applied to aerial perspective.\r\n */\r\n public get aerialPerspectiveRadianceBias(): number {\r\n return this._aerialPerspectiveRadianceBias;\r\n }\r\n\r\n public set aerialPerspectiveRadianceBias(value: number) {\r\n if (value !== this._aerialPerspectiveRadianceBias) {\r\n // Define only needs to change if the value is changing between 0 and not 0.\r\n const hasDefineChanged = (value === 0) !== (this._aerialPerspectiveRadianceBias === 0);\r\n this._aerialPerspectiveRadianceBias = value;\r\n if (hasDefineChanged) {\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * True if the composition should be in linear space (e.g. for HDR rendering).\r\n * Typically linear space is expected when ImageProcessing is enabled via PostProcesses.\r\n * False for non-linear output.\r\n */\r\n public get isLinearSpaceComposition(): boolean {\r\n return this._isLinearSpaceComposition;\r\n }\r\n\r\n public set isLinearSpaceComposition(value: boolean) {\r\n if (value !== this._isLinearSpaceComposition) {\r\n this._isLinearSpaceComposition = value;\r\n // Note, LUTs will remain in linear space. Up to compositors to apply gamma if needed.\r\n this._disposeSkyCompositor();\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n\r\n /**\r\n * True if the {@link light} value should be specified in linear space.\r\n * If using PBRMaterials, light value is expected to be linear.\r\n */\r\n public get isLinearSpaceLight(): boolean {\r\n return this._isLinearSpaceLight;\r\n }\r\n\r\n public set isLinearSpaceLight(value: boolean) {\r\n this._isLinearSpaceLight = value;\r\n }\r\n\r\n /**\r\n * The lookup table for transmittance.\r\n */\r\n public get transmittanceLut(): Nullable<TransmittanceLut> {\r\n return this._transmittanceLut;\r\n }\r\n\r\n /**\r\n * Gets the multiple scattering LUT render target.\r\n * @returns The render target.\r\n */\r\n public get multiScatteringLutRenderTarget(): Nullable<RenderTargetTexture> {\r\n return this._multiScatteringLutRenderTarget;\r\n }\r\n\r\n /**\r\n * The lookup table for diffuse sky irradiance, or null if not enabled.\r\n */\r\n public get diffuseSkyIrradianceLut(): Nullable<DiffuseSkyIrradianceLut> {\r\n return this._diffuseSkyIrradianceLut;\r\n }\r\n\r\n /**\r\n * The properties used to describe the size and optical parameters of the atmosphere.\r\n */\r\n public get physicalProperties(): AtmospherePhysicalProperties {\r\n return this._physicalProperties;\r\n }\r\n\r\n /**\r\n * The height in kilometers of the scene's origin.\r\n */\r\n public get originHeight(): number {\r\n return this._originHeight;\r\n }\r\n\r\n public set originHeight(value: number) {\r\n this._originHeight = value;\r\n }\r\n\r\n /**\r\n * When atmospheric scattering is applied to surfaces, if this value is set to true,\r\n * a grayscale approximation of the transmittance is used to dim surfaces.\r\n *\r\n * When set to false, the atmospheric composition does not dim the surfaces behind it.\r\n * It is up to the client application to apply transmittance manually.\r\n */\r\n public get applyApproximateTransmittance(): boolean {\r\n return this._applyApproximateTransmittance;\r\n }\r\n\r\n public set applyApproximateTransmittance(value: boolean) {\r\n if (this._applyApproximateTransmittance !== value) {\r\n this._applyApproximateTransmittance = value;\r\n this._disposeSkyCompositor();\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n\r\n /**\r\n * The directional lights in the scene which represent the suns illuminating the atmosphere.\r\n * Each frame, the color and intensity of the lights are updated based on the camera position and the light's direction.\r\n */\r\n public get lights(): ReadonlyArray<DirectionalLight> {\r\n return this._lights;\r\n }\r\n\r\n /**\r\n * The rendering group ID for the sky compositor.\r\n * The sky will only be rendered for this group.\r\n */\r\n public get skyRenderingGroup(): number {\r\n return this._skyRenderingGroup;\r\n }\r\n\r\n public set skyRenderingGroup(value: number) {\r\n this._skyRenderingGroup = value;\r\n this.scene.renderingManager.getRenderingGroup(value);\r\n }\r\n\r\n /**\r\n * The rendering group ID for the aerial perspective compositor.\r\n * Aerial perspective will only be rendered for this group.\r\n */\r\n public get aerialPerspectiveRenderingGroup(): number {\r\n return this._aerialPerspectiveRenderingGroup;\r\n }\r\n\r\n public set aerialPerspectiveRenderingGroup(value: number) {\r\n this._aerialPerspectiveRenderingGroup = value;\r\n this.scene.renderingManager.getRenderingGroup(value);\r\n }\r\n\r\n /**\r\n * The rendering group ID for the globe atmosphere compositor.\r\n * The globe atmosphere will only be rendered for this group.\r\n */\r\n public get globeAtmosphereRenderingGroup(): number {\r\n return this._globeAtmosphereRenderingGroup;\r\n }\r\n\r\n public set globeAtmosphereRenderingGroup(value: number) {\r\n this._globeAtmosphereRenderingGroup = value;\r\n this.scene.renderingManager.getRenderingGroup(value);\r\n }\r\n\r\n /**\r\n * Gets the uniform buffer used to store the atmosphere's physical properties.\r\n */\r\n public get uniformBuffer(): UniformBuffer {\r\n if (this._atmosphereUbo === null) {\r\n const atmosphereUbo = (this._atmosphereUbo = new UniformBuffer(this._engine, undefined, true, \"Atmosphere\"));\r\n atmosphereUbo.addUniform(\"peakRayleighScattering\", 3);\r\n atmosphereUbo.addUniform(\"planetRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakMieScattering\", 3);\r\n atmosphereUbo.addUniform(\"atmosphereThickness\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakMieAbsorption\", 3);\r\n atmosphereUbo.addUniform(\"planetRadiusSquared\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakMieExtinction\", 3);\r\n atmosphereUbo.addUniform(\"atmosphereRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakOzoneAbsorption\", 3);\r\n atmosphereUbo.addUniform(\"atmosphereRadiusSquared\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"horizonDistanceToAtmosphereEdge\", 1);\r\n atmosphereUbo.addUniform(\"horizonDistanceToAtmosphereEdgeSquared\", 1);\r\n atmosphereUbo.addUniform(\"planetRadiusWithOffset\", 1);\r\n atmosphereUbo.addUniform(\"planetRadiusOffset\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"atmosphereExposure\", 1);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveRadianceBias\", 1);\r\n atmosphereUbo.addUniform(\"inverseAtmosphereThickness\", 1);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveTransmittanceScale\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"inverseViewProjectionWithoutTranslation\", 16);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"directionToLight\", 3);\r\n atmosphereUbo.addUniform(\"multiScatteringIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"directionToLightRelativeToCameraGeocentricNormal\", 3);\r\n atmosphereUbo.addUniform(\"cameraRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"lightRadianceAtCamera\", 3);\r\n atmosphereUbo.addUniform(\"diffuseSkyIrradianceDesaturationFactor\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"groundAlbedo\", 3);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveSaturation\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"minMultiScattering\", 3);\r\n atmosphereUbo.addUniform(\"diffuseSkyIrradianceIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraPositionGlobal\", 3);\r\n atmosphereUbo.addUniform(\"lightIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"clampedCameraPositionGlobal\", 3);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraGeocentricNormal\", 3);\r\n atmosphereUbo.addUniform(\"clampedCameraRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraForward\", 3);\r\n atmosphereUbo.addUniform(\"clampedCameraHeight\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraPosition\", 3);\r\n atmosphereUbo.addUniform(\"cosCameraHorizonAngleFromZenith\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"viewport\", 4);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"additionalDiffuseSkyIrradiance\", 3);\r\n atmosphereUbo.addUniform(\"cameraHeight\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraNearPlane\", 1);\r\n atmosphereUbo.addUniform(\"originHeight\", 1);\r\n atmosphereUbo.addUniform(\"sinCameraAtmosphereHorizonAngleFromNadir\", 1);\r\n atmosphereUbo.create();\r\n }\r\n return this._atmosphereUbo;\r\n }\r\n\r\n /**\r\n * Gets the camera-related variables for this atmosphere. Updated each frame.\r\n */\r\n public get cameraAtmosphereVariables(): AtmospherePerCameraVariables {\r\n return this._cameraAtmosphereVariables;\r\n }\r\n\r\n /**\r\n * Constructs the {@link Atmosphere}.\r\n * @param name - The name of this instance.\r\n * @param scene - The scene to which the atmosphere will be added.\r\n * @param lights - The light sources that illuminate the atmosphere. Currently only supports one light, and that light should be the first light in the scene.\r\n * @param options - The options used to create the atmosphere.\r\n */\r\n public constructor(\r\n public readonly name: string,\r\n public readonly scene: Scene,\r\n lights: DirectionalLight[],\r\n options?: IAtmosphereOptions\r\n ) {\r\n const engine = (this._engine = scene.getEngine());\r\n\r\n if (!engine.isWebGPU && engine.version < 2) {\r\n throw new Error(`Atmosphere is not supported on WebGL ${engine.version}.`);\r\n }\r\n\r\n this._physicalProperties = options?.physicalProperties ?? new AtmospherePhysicalProperties();\r\n this._physicalProperties.onChangedObservable.add(() => {\r\n this._transmittanceLut?.markDirty();\r\n });\r\n\r\n if (lights.length !== 1) {\r\n throw new Error(\"Atmosphere only supports one light source currently.\");\r\n }\r\n this._lights = lights;\r\n\r\n this.depthTexture = options?.depthTexture ?? null;\r\n this._exposure = options?.exposure ?? 1.0;\r\n this._isLinearSpaceLight = options?.isLinearSpaceLight ?? false;\r\n this._isLinearSpaceComposition = options?.isLinearSpaceComposition ?? false;\r\n this._applyApproximateTransmittance = options?.applyApproximateTransmittance ?? true;\r\n this._aerialPerspectiveRadianceBias = options?.aerialPerspectiveRadianceBias ?? 0.0;\r\n this._aerialPerspectiveTransmittanceScale = options?.aerialPerspectiveTransmittanceScale ?? 1.0;\r\n this._aerialPerspectiveSaturation = options?.aerialPerspectiveSaturation ?? 1.0;\r\n this._aerialPerspectiveIntensity = options?.aerialPerspectiveIntensity ?? 1.0;\r\n this._diffuseSkyIrradianceDesaturationFactor = options?.diffuseSkyIrradianceDesaturationFactor ?? 0.5;\r\n this._diffuseSkyIrradianceIntensity = options?.diffuseSkyIrradianceIntensity ?? 1.0;\r\n this._additionalDiffuseSkyIrradianceIntensity = options?.additionalDiffuseSkyIrradianceIntensity ?? 0.01;\r\n this._multiScatteringIntensity = options?.multiScatteringIntensity ?? 1.0;\r\n this._minimumMultiScatteringIntensity = options?.minimumMultiScatteringIntensity ?? 0.000618;\r\n this._isSkyViewLutEnabled = options?.isSkyViewLutEnabled ?? true;\r\n this._isAerialPerspectiveLutEnabled = options?.isAerialPerspectiveLutEnabled ?? true;\r\n this._originHeight = options?.originHeight ?? 0;\r\n this._additionalDiffuseSkyIrradianceColor = options?.additionalDiffuseSkyIrradianceColor\r\n ? new Color3().copyFrom(options.additionalDiffuseSkyIrradianceColor)\r\n : new Color3(163 / 255.0, 199 / 255.0, 1.0);\r\n this._groundAlbedo = options?.groundAlbedo ? new Color3().copyFrom(options.groundAlbedo) : new Color3().set(124.0 / 255.0, 165.0 / 255.0, 1.0);\r\n const minimumMultiScatteringColor = (this._minimumMultiScatteringColor = options?.minimumMultiScatteringColor\r\n ? new Color3().copyFrom(options.minimumMultiScatteringColor)\r\n : new Color3(30.0 / 255.0, 40.0 / 255.0, 77.0 / 255.0));\r\n\r\n this._skyRenderingGroup = options?.skyRenderingGroup ?? 0;\r\n this._aerialPerspectiveRenderingGroup = options?.aerialPerspectiveRenderingGroup ?? 0;\r\n this._globeAtmosphereRenderingGroup = options?.globeAtmosphereRenderingGroup ?? 0;\r\n\r\n this._additionalDiffuseSkyIrradianceColor.scaleToRef(this._additionalDiffuseSkyIrradianceIntensity, this._additionalDiffuseSkyIrradiance);\r\n this._minimumMultiScattering.x = minimumMultiScatteringColor.r * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.y = minimumMultiScatteringColor.g * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.z = minimumMultiScatteringColor.b * this._minimumMultiScatteringIntensity;\r\n\r\n // Initialize light direction and color.\r\n {\r\n const light = lights[0];\r\n this._directionToLight.copyFrom(light.direction).scaleInPlace(-1);\r\n const lightColor = this._linearLightColor.copyFrom(light.diffuse);\r\n if (!this._isLinearSpaceLight) {\r\n lightColor.toLinearSpaceToRef(lightColor);\r\n }\r\n const intensity = light.intensity;\r\n this._lightRadianceAtCamera.set(intensity * lightColor.r, intensity * lightColor.g, intensity * lightColor.b);\r\n }\r\n\r\n this._effectRenderer = new EffectRenderer(engine, {\r\n // Full screen triangle.\r\n indices: [0, 2, 1],\r\n positions: [-1, -1, -1, 3, 3, -1],\r\n });\r\n\r\n this._transmittanceLut = new TransmittanceLut(this);\r\n this._multiScatteringLutRenderTarget = CreateRenderTargetTexture(\"atmo-multiScattering\", { width: 32, height: 32 }, scene);\r\n this._multiScatteringEffectWrapper = CreateMultiScatteringEffectWrapper(engine, this.uniformBuffer, this._groundAlbedo);\r\n this._isDiffuseSkyIrradianceLutEnabled = options?.isDiffuseSkyIrradianceLutEnabled ?? true;\r\n if (this._isDiffuseSkyIrradianceLutEnabled) {\r\n this._diffuseSkyIrradianceLut = new DiffuseSkyIrradianceLut(this);\r\n }\r\n if (this._isSkyViewLutEnabled) {\r\n this.skyViewLutRenderTarget!;\r\n }\r\n if (this._isAerialPerspectiveLutEnabled) {\r\n this.aerialPerspectiveLutRenderTarget!;\r\n }\r\n\r\n // Render global LUTs once per frame (not per camera).\r\n this._onBeforeRenderObserver = scene.onBeforeRenderObservable.add(() => {\r\n this.renderGlobalLuts();\r\n });\r\n\r\n // Before rendering, make sure the per-camera variables have been updated.\r\n this._onBeforeCameraRenderObserver = scene.onBeforeCameraRenderObservable.add((x) => {\r\n this._updatePerCameraVariables(x);\r\n this._renderLutsForCamera(x);\r\n });\r\n\r\n {\r\n const renderingManager = scene.renderingManager;\r\n if (this._skyRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._skyRenderingGroup);\r\n }\r\n if (this._aerialPerspectiveRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._aerialPerspectiveRenderingGroup);\r\n }\r\n if (this._globeAtmosphereRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._globeAtmosphereRenderingGroup);\r\n }\r\n\r\n // Mark all rendering groups as being \"not empty\" before rendering the corresponding targets.\r\n // This ensures onAfterRenderTargetsRenderObservable is called for empty groups,\r\n // which allows the atmosphere to be rendered even when the groups are otherwise empty e.g.,\r\n // a scene with only the atmosphere in it, and no other Meshes.\r\n this._onBeforeDrawPhaseObserver = scene.onBeforeDrawPhaseObservable.add(() => {\r\n if (this._skyRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._skyRenderingGroup)._empty = false;\r\n }\r\n if (this._aerialPerspectiveRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._aerialPerspectiveRenderingGroup)._empty = false;\r\n }\r\n if (this._globeAtmosphereRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._globeAtmosphereRenderingGroup)._empty = false;\r\n }\r\n });\r\n\r\n // Draw compositors after the respective rendering group.\r\n this._onAfterRenderingGroupObserver = scene.onAfterRenderingGroupObservable.add((group) => {\r\n if (group.renderingManager !== scene.renderingManager) {\r\n return;\r\n }\r\n\r\n const groupId = group.renderingGroupId;\r\n\r\n if (this._skyRenderingGroup === groupId) {\r\n this.drawSkyCompositor();\r\n }\r\n\r\n if (this._aerialPerspectiveRenderingGroup === groupId) {\r\n this.drawAerialPerspectiveCompositor();\r\n }\r\n\r\n if (this._globeAtmosphereRenderingGroup === groupId) {\r\n this.drawGlobeAtmosphereCompositor();\r\n }\r\n });\r\n }\r\n\r\n // Ensure the atmosphere is disposed when the scene is disposed.\r\n scene.onDisposeObservable.addOnce(() => {\r\n scene.removeExternalData(\"atmosphere\");\r\n this.dispose();\r\n });\r\n scene.addExternalData(\"atmosphere\", this);\r\n\r\n // Registers a material plugin which will allow common materials to sample the atmosphere environment maps e.g.,\r\n // sky view LUT for glossy reflections and diffuse sky illiminance LUT for irradiance.\r\n // It also handles aerial perspective application when Atmosphere is not provided with a depth texture.\r\n UnregisterMaterialPlugin(MaterialPlugin);\r\n RegisterMaterialPlugin(MaterialPlugin, (material) => {\r\n if (material.getClassName() === \"PBRMaterial\") {\r\n return new AtmospherePBRMaterialPlugin(material, this, this.depthTexture === null);\r\n }\r\n return null;\r\n });\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public dispose(): void {\r\n this._onBeforeCameraRenderObserver?.remove();\r\n this._onBeforeCameraRenderObserver = null;\r\n this._onBeforeDrawPhaseObserver?.remove();\r\n this._onBeforeDrawPhaseObserver = null;\r\n this._onAfterRenderingGroupObserver?.remove();\r\n this._onAfterRenderingGroupObserver = null;\r\n this._onBeforeRenderObserver?.remove();\r\n this._onBeforeRenderObserver = null;\r\n this._globeAtmosphereCompositorEffectWrapper?.dispose();\r\n this._globeAtmosphereCompositorEffectWrapper = null;\r\n this._skyCompositorEffectWrapper?.dispose();\r\n this._skyCompositorEffectWrapper = null;\r\n this._aerialPerspectiveCompositorEffectWrapper?.dispose();\r\n this._aerialPerspectiveCompositorEffectWrapper = null;\r\n this._skyViewLutRenderTarget?.dispose();\r\n this._skyViewLutRenderTarget = null;\r\n this._skyViewLutEffectWrapper?.dispose();\r\n this._skyViewLutEffectWrapper = null;\r\n this._skyViewLutEffectRenderer?.dispose();\r\n this._skyViewLutEffectRenderer = null;\r\n this._aerialPerspectiveLutRenderTarget?.dispose();\r\n this._aerialPerspectiveLutRenderTarget = null;\r\n this._aerialPerspectiveLutEffectWrapper?.dispose();\r\n this._aerialPerspectiveLutEffectWrapper = null;\r\n this._aerialPerspectiveLutEffectRenderer?.dispose();\r\n this._aerialPerspectiveLutEffectRenderer = null;\r\n this._multiScatteringEffectWrapper?.dispose();\r\n this._multiScatteringEffectWrapper = null;\r\n this._multiScatteringLutRenderTarget?.dispose();\r\n this._multiScatteringLutRenderTarget = null;\r\n this._transmittanceLut?.dispose();\r\n this._transmittanceLut = null;\r\n this._diffuseSkyIrradianceLut?.dispose();\r\n this._diffuseSkyIrradianceLut = null;\r\n this._atmosphereUbo?.dispose();\r\n this._atmosphereUbo = null;\r\n this._effectRenderer?.dispose();\r\n this._effectRenderer = null;\r\n this._atmosphereUniformBufferAsArray.length = 0;\r\n\r\n UnregisterMaterialPlugin(MaterialPlugin);\r\n }\r\n\r\n /**\r\n * True if the atmosphere is enabled.\r\n * @returns - True if the atmosphere is enabled.\r\n */\r\n public isEnabled() {\r\n return this._isEnabled;\r\n }\r\n\r\n /**\r\n * Sets the enabled state of the atmosphere.\r\n * @param enabled - True to enable the atmosphere, false to disable it.\r\n */\r\n public setEnabled(enabled: boolean) {\r\n this._isEnabled = enabled;\r\n }\r\n\r\n /**\r\n * The class name of the {@link Atmosphere}.\r\n * @returns - The class name of the atmosphere.\r\n */\r\n public getClassName(): string {\r\n return \"Atmosphere\";\r\n }\r\n\r\n /**\r\n * Gets the color of a light after being transmitted through the atmosphere to a point specified by its distance to the planet center and its geocentric normal.\r\n * NOTE, the result is always a linear space color.\r\n * @param directionToLight - The direction of the light.\r\n * @param pointRadius - The distance from the planet center to the point in kilometers.\r\n * @param pointGeocentricNormal - The geocentric normal at the point i.e., normalize(point - planet center).\r\n * @param result - The color to store the result in.\r\n * @returns The result color.\r\n */\r\n public getTransmittedColorToRef = <T extends IColor3Like>(directionToLight: IVector3Like, pointRadius: number, pointGeocentricNormal: IVector3Like, result: T): T =>\r\n this._transmittanceLut!.getTransmittedColorToRef(directionToLight, pointRadius, pointGeocentricNormal, result);\r\n\r\n /**\r\n * Gets the diffuse sky irradiance. Result is always in linear space.\r\n * @param directionToLight - The direction of the point to the light.\r\n * @param pointRadius - The distance from the planet center to the point in kilometers.\r\n * @param pointGeocentricNormal - The geocentric normal at the point: normalize(point - planet center).\r\n * @param lightIrradiance - The irradiance of the light.\r\n * @param result - The color to store the result in.\r\n * @returns The result color.\r\n */\r\n public getDiffuseSkyIrradianceToRef = <T extends IColor3Like>(\r\n directionToLight: IVector3Like,\r\n pointRadius: number,\r\n pointGeocentricNormal: IVector3Like,\r\n lightIrradiance: number,\r\n result: T\r\n ): T =>\r\n this._diffuseSkyIrradianceLut?.getDiffuseSkyIrradianceToRef(directionToLight, pointRadius, pointGeocentricNormal, lightIrradiance, result) ??\r\n ((result.r = 0), (result.g = 0), (result.b = 0), result);\r\n /**\r\n * Draws the multiple scattering LUT using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n private _drawMultiScatteringLut(): void {\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n DrawEffect(\r\n this._engine,\r\n this._effectRenderer!,\r\n this._multiScatteringEffectWrapper,\r\n this._multiScatteringLutRenderTarget,\r\n (effectRenderer, renderTarget, effect, engine) => {\r\n this.bindUniformBufferToEffect(effect);\r\n engine.bindFramebuffer(renderTarget!, undefined, undefined, undefined, true);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effectRenderer.draw();\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Draws the aerial perspective compositor using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n public drawAerialPerspectiveCompositor(): void {\r\n // Only works if we have a depth texture.\r\n if (this.depthTexture === null) {\r\n return;\r\n }\r\n\r\n const isEnabled = this.isEnabled();\r\n if (!isEnabled) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n const effectWrapper = (this._aerialPerspectiveCompositorEffectWrapper ??= CreateAerialPerspectiveCompositorEffectWrapper(\r\n engine,\r\n this.uniformBuffer,\r\n this._isAerialPerspectiveLutEnabled,\r\n this._isSkyViewLutEnabled,\r\n this._isLinearSpaceComposition,\r\n this._applyApproximateTransmittance,\r\n this._aerialPerspectiveIntensity,\r\n this._aerialPerspectiveRadianceBias\r\n ));\r\n\r\n if (!this._isGlobalLutsReady) {\r\n return;\r\n }\r\n\r\n // Aerial perspective compositor only renders when inside the atmosphere.\r\n const isOutsideAtmosphere = this._cameraAtmosphereVariables.clampedCameraRadius > this._physicalProperties.atmosphereRadius;\r\n if (isOutsideAtmosphere) {\r\n return;\r\n }\r\n\r\n const skyViewLut = this._isSkyViewLutEnabled ? this.skyViewLutRenderTarget : null;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n const aerialPerspectiveLut = this._isAerialPerspectiveLutEnabled ? this.aerialPerspectiveLutRenderTarget : null;\r\n if (\r\n !effectWrapper.isReady() ||\r\n !(skyViewLut?.isReady() ?? true) ||\r\n !multiScatteringLut.isReady() ||\r\n !transmittanceLut.isReady() ||\r\n !(aerialPerspectiveLut?.isReady() ?? true) ||\r\n !this.depthTexture.isReady()\r\n ) {\r\n return;\r\n }\r\n\r\n DrawEffect(\r\n engine,\r\n this._effectRenderer!,\r\n effectWrapper,\r\n null, // No render target, it will render to the current buffer.\r\n (effectRenderer, _, effect) => {\r\n if (this.depthTexture === null) {\r\n throw new Error(\"Depth texture is required for aerial perspective compositor.\");\r\n }\r\n this.bindUniformBufferToEffect(effect);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n if (this._isSkyViewLutEnabled) {\r\n effect.setTexture(\"skyViewLut\", skyViewLut);\r\n }\r\n if (this._isAerialPerspectiveLutEnabled) {\r\n effect.setTexture(\"aerialPerspectiveLut\", aerialPerspectiveLut);\r\n }\r\n effect.setTexture(\"depthTexture\", this.depthTexture);\r\n effectRenderer.draw();\r\n },\r\n 1, // depth to use in the compositor.\r\n this.applyApproximateTransmittance ? Constants.ALPHA_PREMULTIPLIED_PORTERDUFF : Constants.ALPHA_ONEONE,\r\n true, // depthTest\r\n false, // depthWrite\r\n Constants.ALWAYS, // depthFunction\r\n false // restoreDefaultFramebuffer\r\n );\r\n }\r\n\r\n /**\r\n * Draws the sky compositor using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n public drawSkyCompositor(): void {\r\n const isEnabled = this.isEnabled();\r\n if (!isEnabled) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n const effectWrapper = (this._skyCompositorEffectWrapper ??= CreateSkyCompositorEffectWrapper(\r\n engine,\r\n this.uniformBuffer,\r\n this._isSkyViewLutEnabled,\r\n this._isLinearSpaceComposition,\r\n this._applyApproximateTransmittance\r\n ));\r\n\r\n if (!this._isGlobalLutsReady) {\r\n return;\r\n }\r\n\r\n // The sky compositor only renders when inside the atmosphere.\r\n const isOutsideAtmosphere = this._cameraAtmosphereVariables.clampedCameraRadius > this._physicalProperties.atmosphereRadius;\r\n if (isOutsideAtmosphere) {\r\n return;\r\n }\r\n\r\n if (this.depthTexture !== null && !this.depthTexture.isReady()) {\r\n return;\r\n }\r\n\r\n const skyViewLut = this._isSkyViewLutEnabled ? this.skyViewLutRenderTarget : null;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n if (!effectWrapper.isReady() || !(skyViewLut?.isReady() ?? true) || !multiScatteringLut.isReady() || !transmittanceLut.isReady()) {\r\n return;\r\n }\r\n\r\n DrawEffect(\r\n engine,\r\n this._effectRenderer!,\r\n effectWrapper,\r\n null, // No render target, it will render to the current buffer.\r\n (effectRenderer, _, effect) => {\r\n this.bindUniformBufferToEffect(effect);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n if (this._isSkyViewLutEnabled) {\r\n effect.setTexture(\"skyViewLut\", skyViewLut);\r\n }\r\n effectRenderer.draw();\r\n },\r\n 1, // depth to use in the compositor.\r\n this._applyApproximateTransmittance ? Constants.ALPHA_PREMULTIPLIED_PORTERDUFF : Constants.ALPHA_ONEONE,\r\n true, // depthTest\r\n false, // depthWrite\r\n Constants.EQUAL, // depthFunction\r\n false // restoreDefaultFramebuffer\r\n );\r\n }\r\n\r\n /**\r\n * Draws the globe atmosphere compositor using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n public drawGlobeAtmosphereCompositor(): void {\r\n const isEnabled = this.isEnabled();\r\n if (!isEnabled) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n const effectWrapper = (this._globeAtmosphereCompositorEffectWrapper ??= CreateGlobeAtmosphereCompositorEffectWrapper(\r\n engine,\r\n this.uniformBuffer,\r\n this._isSkyViewLutEnabled,\r\n this._isLinearSpaceComposition,\r\n this._applyApproximateTransmittance,\r\n this._aerialPerspectiveIntensity,\r\n this._aerialPerspectiveRadianceBias,\r\n this.depthTexture !== null\r\n ));\r\n\r\n if (!this._isGlobalLutsReady) {\r\n return;\r\n }\r\n\r\n // Globe atmosphere compositor only renders when outside the atmosphere.\r\n const isOutsideAtmosphere = this._cameraAtmosphereVariables.clampedCameraRadius > this._physicalProperties.atmosphereRadius;\r\n if (!isOutsideAtmosphere) {\r\n return;\r\n }\r\n\r\n const skyViewLut = this._isSkyViewLutEnabled ? this.skyViewLutRenderTarget : null;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n if (!effectWrapper.isReady() || !(skyViewLut?.isReady() ?? true) || !multiScatteringLut.isReady() || !transmittanceLut.isReady()) {\r\n return;\r\n }\r\n\r\n if (this.depthTexture !== null && !this.depthTexture.isReady()) {\r\n return;\r\n }\r\n\r\n DrawEffect(\r\n engine,\r\n this._effectRenderer!,\r\n effectWrapper,\r\n null, // No render target, it will render to the current buffer.\r\n (effectRenderer, _, effect) => {\r\n this.bindUniformBufferToEffect(effect);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n if (this._isSkyViewLutEnabled) {\r\n effect.setTexture(\"skyViewLut\", skyViewLut);\r\n }\r\n if (this.depthTexture !== null) {\r\n effect.setTexture(\"depthTexture\", this.depthTexture);\r\n }\r\n effectRenderer.draw();\r\n },\r\n 1, // depth to use in the compositor.\r\n this._applyApproximateTransmittance ? Constants.ALPHA_PREMULTIPLIED_PORTERDUFF : Constants.ALPHA_ONEONE,\r\n true, // depthTest\r\n false, // depthWrite\r\n Constants.ALWAYS, // depthFunction\r\n false // restoreDefaultFramebuffer\r\n );\r\n }\r\n\r\n private _disposeSkyCompositor(): void {\r\n this._skyCompositorEffectWrapper?.dispose();\r\n this._skyCompositorEffectWrapper = null;\r\n }\r\n\r\n private _disposeAerialPerspectiveCompositor(): void {\r\n this._aerialPerspectiveCompositorEffectWrapper?.dispose();\r\n this._aerialPerspectiveCompositorEffectWrapper = null;\r\n }\r\n\r\n private _disposeGlobeAtmosphereCompositor(): void {\r\n this._globeAtmosphereCompositorEffectWrapper?.dispose();\r\n this._globeAtmosphereCompositorEffectWrapper = null;\r\n }\r\n\r\n private get _isGlobalLutsReady(): boolean {\r\n return (\r\n this._hasEverRenderedMultiScatteringLut &&\r\n !!this._transmittanceLut?.hasLutData &&\r\n (!this._isDiffuseSkyIrradianceLutEnabled || this._diffuseSkyIrradianceLut!.hasLutData)\r\n );\r\n }\r\n\r\n /**\r\n * Updates the camera variables that are specific to the atmosphere.\r\n * @param camera - The camera to update the variables for.\r\n */\r\n private _updatePerCameraVariables(camera: Camera): void {\r\n const light = this._lights[0];\r\n const directionToLight = this._directionToLight.copyFrom(light.direction).scaleInPlace(-1);\r\n\r\n const properties = this._physicalProperties;\r\n const cameraAtmosphereVariables = this._cameraAtmosphereVariables;\r\n cameraAtmosphereVariables.update(camera, properties.planetRadius, properties.planetRadiusWithOffset, properties.atmosphereRadius, directionToLight, this.originHeight);\r\n\r\n this._transmittanceLut!.updateLightParameters(light, cameraAtmosphereVariables.clampedCameraRadius, cameraAtmosphereVariables.cameraGeocentricNormal);\r\n this._linearLightColor.copyFrom(light.diffuse);\r\n\r\n this.getDiffuseSkyIrradianceToRef(directionToLight, 0, cameraAtmosphereVariables.cameraGeocentricNormal, light.intensity, this._tempSceneAmbient);\r\n if (!this.isLinearSpaceLight) {\r\n this._tempSceneAmbient.toGammaSpaceToRef(this._tempSceneAmbient);\r\n }\r\n this.scene.ambientColor = this._tempSceneAmbient;\r\n\r\n this.onAfterUpdateVariablesForCameraObservable.notifyObservers(camera);\r\n }\r\n\r\n /**\r\n * Renders the lookup tables, some of which can vary per-camera.\r\n * It is expected that updatePerCameraVariables was previously called.\r\n * @param camera - The camera to render the LUTs for.\r\n */\r\n private _renderLutsForCamera(camera: Camera): void {\r\n {\r\n this.onBeforeLightVariablesUpdateObservable.notifyObservers();\r\n\r\n const light = this.lights[0];\r\n if (!this.isLinearSpaceLight) {\r\n light.diffuse = light.diffuse.toGammaSpaceToRef(light.diffuse);\r\n light.specular = light.specular.toGammaSpaceToRef(light.specular);\r\n }\r\n const intensity = light.intensity;\r\n this._lightRadianceAtCamera.set(intensity * this._linearLightColor.r, intensity * this._linearLightColor.g, intensity * this._linearLightColor.b);\r\n }\r\n\r\n if (this.uniformBuffer.useUbo) {\r\n this.updateUniformBuffer();\r\n }\r\n\r\n // Render the LUTs.\r\n const isEnabled = this.isEnabled();\r\n {\r\n this.onBeforeRenderLutsForCameraObservable.notifyObservers(camera);\r\n\r\n // If atmosphere is enabled, render the per-camera LUTs (sky view and aerial perspective).\r\n if (isEnabled && !this._transmittanceLut!.isDirty && this._hasRenderedMultiScatteringLut) {\r\n if (this._isSkyViewLutEnabled) {\r\n this._drawSkyViewLut();\r\n }\r\n\r\n if (this._isAerialPerspectiveLutEnabled) {\r\n // Only need to render aerial perspective LUT when inside the atmosphere.\r\n if (this._cameraAtmosphereVariables.clampedCameraRadius <= this._physicalProperties.atmosphereRadius) {\r\n this._drawAerialPerspectiveLut();\r\n } else {\r\n // Make sure to clear the LUT to some initial value if this would have otherwise been the first time rendering it.\r\n if (!this._aerialPerspectiveLutHasBeenRendered) {\r\n this._clearAerialPerspectiveLut();\r\n }\r\n }\r\n this._aerialPerspectiveLutHasBeenRendered = true;\r\n }\r\n }\r\n\r\n this.onAfterRenderLutsForCameraObservable.notifyObservers(camera);\r\n }\r\n }\r\n\r\n /**\r\n * Renders the lookup tables that do not depend on a camera position.\r\n */\r\n public renderGlobalLuts(): void {\r\n if (this.uniformBuffer.useUbo) {\r\n this.updateUniformBuffer();\r\n }\r\n\r\n const hasNewTransmittanceLut = this._transmittanceLut!.render();\r\n if (hasNewTransmittanceLut) {\r\n this._hasRenderedMultiScatteringLut = false;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n\r\n if (!this._transmittanceLut!.isDirty && !this._hasRenderedMultiScatteringLut) {\r\n this._multiScatteringEffectWrapper ??= CreateMultiScatteringEffectWrapper(this._engine, this.uniformBuffer, this._groundAlbedo);\r\n if (this._multiScatteringEffectWrapper?.isReady() && this._multiScatteringLutRenderTarget?.isReady()) {\r\n this._drawMultiScatteringLut();\r\n this._hasRenderedMultiScatteringLut = true;\r\n this._hasEverRenderedMultiScatteringLut = true;\r\n }\r\n }\r\n\r\n if (!this._transmittanceLut!.isDirty && this._hasRenderedMultiScatteringLut) {\r\n this._diffuseSkyIrradianceLut?.render(); // Will only render if needed.\r\n }\r\n }\r\n\r\n /**\r\n * Binds the atmosphere's uniform buffer to an {@link Effect}.\r\n * @param effect - The {@link Effect} to bind the uniform buffer to.\r\n */\r\n public bindUniformBufferToEffect(effect: Effect): void {\r\n const uniformBuffer = this.uniformBuffer;\r\n const isWGSL = effect.shaderLanguage === ShaderLanguage.WGSL;\r\n const blockName = isWGSL ? \"atmosphere\" : uniformBuffer.name;\r\n uniformBuffer.bindToEffect(effect, blockName);\r\n uniformBuffer.useUbo ? uniformBuffer.update() : this.updateUniformBuffer();\r\n }\r\n\r\n /**\r\n * Updates the values in the atmosphere's uniform buffer.\r\n */\r\n public updateUniformBuffer(): void {\r\n const physicalProperties = this._physicalProperties;\r\n const cameraAtmosphereVariables = this._cameraAtmosphereVariables;\r\n const ubo = this.uniformBuffer;\r\n\r\n ubo.updateVector3(\"peakRayleighScattering\", physicalProperties.rayleighScattering);\r\n ubo.updateFloat(\"planetRadius\", physicalProperties.planetRadius);\r\n ubo.updateVector3(\"peakMieScattering\", physicalProperties.mieScattering);\r\n ubo.updateFloat(\"atmosphereThickness\", physicalProperties.atmosphereThickness);\r\n ubo.updateVector3(\"peakMieAbsorption\", physicalProperties.mieAbsorption);\r\n ubo.updateFloat(\"planetRadiusSquared\", physicalProperties.planetRadiusSquared);\r\n ubo.updateVector3(\"peakMieExtinction\", physicalProperties.mieExtinction);\r\n ubo.updateFloat(\"atmosphereRadius\", physicalProperties.atmosphereRadius);\r\n ubo.updateVector3(\"peakOzoneAbsorption\", physicalProperties.ozoneAbsorption);\r\n ubo.updateFloat(\"atmosphereRadiusSquared\", physicalProperties.atmosphereRadiusSquared);\r\n ubo.updateFloat(\"horizonDistanceToAtmosphereEdge\", physicalProperties.horizonDistanceToAtmosphereEdge);\r\n ubo.updateFloat(\"horizonDistanceToAtmosphereEdgeSquared\", physicalProperties.horizonDistanceToAtmosphereEdgeSquared);\r\n ubo.updateFloat(\"planetRadiusWithOffset\", physicalProperties.planetRadiusWithOffset);\r\n ubo.updateFloat(\"planetRadiusOffset\", physicalProperties.planetRadiusOffset);\r\n ubo.updateFloat(\"aerialPerspectiveRadianceBias\", this._aerialPerspectiveRadianceBias);\r\n ubo.updateFloat(\"inverseAtmosphereThickness\", 1 / physicalProperties.atmosphereThickness);\r\n ubo.updateFloat(\"aerialPerspectiveTransmittanceScale\", this._aerialPerspectiveTransmittanceScale);\r\n ubo.updateMatrix(\"inverseViewProjectionWithoutTranslation\", cameraAtmosphereVariables.inverseViewProjectionMatrixWithoutTranslation);\r\n ubo.updateVector3(\"directionToLight\", this._directionToLight);\r\n ubo.updateFloat(\"multiScatteringIntensity\", this.multiScatteringIntensity);\r\n ubo.updateVector3(\"directionToLightRelativeToCameraGeocentricNormal\", cameraAtmosphereVariables.directionToLightRelativeToCameraGeocentricNormal);\r\n ubo.updateFloat(\"cameraRadius\", cameraAtmosphereVariables.cameraRadius);\r\n ubo.updateVector3(\"lightRadianceAtCamera\", this._lightRadianceAtCamera);\r\n ubo.updateFloat(\"diffuseSkyIrradianceDesaturationFactor\", this._diffuseSkyIrradianceDesaturationFactor);\r\n ubo.updateColor3(\"groundAlbedo\", this._groundAlbedo);\r\n ubo.updateFloat(\"aerialPerspectiveSaturation\", this._aerialPerspectiveSaturation);\r\n ubo.updateVector3(\"minMultiScattering\", this._minimumMultiScattering);\r\n ubo.updateFloat(\"diffuseSkyIrradianceIntensity\", this._diffuseSkyIrradianceIntensity);\r\n ubo.updateVector3(\"cameraPositionGlobal\", cameraAtmosphereVariables.cameraPositionGlobal);\r\n ubo.updateFloat(\"lightIntensity\", this.lights[0].getScaledIntensity());\r\n ubo.updateVector3(\"clampedCameraPositionGlobal\", cameraAtmosphereVariables.clampedCameraPositionGlobal);\r\n ubo.updateFloat(\"aerialPerspectiveIntensity\", this._aerialPerspectiveIntensity);\r\n ubo.updateVector3(\"cameraGeocentricNormal\", cameraAtmosphereVariables.cameraGeocentricNormal);\r\n ubo.updateFloat(\"clampedCameraRadius\", cameraAtmosphereVariables.clampedCameraRadius);\r\n ubo.updateVector3(\"cameraForward\", cameraAtmosphereVariables.cameraForward);\r\n ubo.updateFloat(\"clampedCameraHeight\", cameraAtmosphereVariables.clampedCameraHeight);\r\n ubo.updateVector3(\"cameraPosition\", cameraAtmosphereVariables.cameraPosition);\r\n ubo.updateFloat(\"cosCameraHorizonAngleFromZenith\", cameraAtmosphereVariables.cosCameraHorizonAngleFromZenith);\r\n ubo.updateVector4(\"viewport\", cameraAtmosphereVariables.viewport);\r\n ubo.updateColor3(\"additionalDiffuseSkyIrradiance\", this._additionalDiffuseSkyIrradiance);\r\n ubo.updateFloat(\"cameraHeight\", cameraAtmosphereVariables.cameraHeight);\r\n ubo.updateFloat(\"cameraNearPlane\", cameraAtmosphereVariables.cameraNearPlane);\r\n ubo.updateFloat(\"originHeight\", this._originHeight);\r\n ubo.updateFloat(\"sinCameraAtmosphereHorizonAngleFromNadir\", cameraAtmosphereVariables.sinCameraAtmosphereHorizonAngleFromNadir);\r\n ubo.updateFloat(\"atmosphereExposure\", this._exposure);\r\n }\r\n\r\n /**\r\n * Draws the aerial perspective LUT using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n private _drawAerialPerspectiveLut(): void {\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget;\r\n DrawEffect(\r\n this._engine,\r\n this._effectRenderer!,\r\n this._aerialPerspectiveLutEffectWrapper,\r\n this._aerialPerspectiveLutRenderTarget,\r\n (effectRenderer, renderTarget, effect, engine) => {\r\n this.bindUniformBufferToEffect(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n for (let layer = 0; layer < AerialPerspectiveLutLayers; layer++) {\r\n engine.bindFramebuffer(renderTarget!, undefined, undefined, undefined, true, undefined, layer);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setFloat(\"layerIdx\", layer);\r\n effectRenderer.draw();\r\n }\r\n }\r\n );\r\n }\r\n\r\n private _clearAerialPerspectiveLut(): void {\r\n const renderTarget = this._aerialPerspectiveLutRenderTarget?.renderTarget;\r\n if (renderTarget) {\r\n const engine = this._engine;\r\n const clearColor = { r: 0, g: 0, b: 0, a: 0 };\r\n for (let layer = 0; layer < AerialPerspectiveLutLayers; layer++) {\r\n engine.bindFramebuffer(renderTarget, undefined, undefined, undefined, true, undefined, layer);\r\n engine.clear(clearColor, true, false, false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Draws the sky view LUT using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n private _drawSkyViewLut(): void {\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n DrawEffect(this._engine, this._effectRenderer!, this._skyViewLutEffectWrapper, this._skyViewLutRenderTarget, (effectRenderer, renderTarget, effect, engine) => {\r\n this.bindUniformBufferToEffect(effect);\r\n engine.bindFramebuffer(renderTarget!, undefined, undefined, undefined, true);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n effectRenderer.draw();\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Creates an {@link EffectWrapper} with the given parameters.\r\n * @param engine - The engine to use.\r\n * @param name - The name of the effect wrapper.\r\n * @param fragmentShader - The fragment shader source.\r\n * @param uniformNames - The uniform names to use.\r\n * @param samplerNames - The sampler names to use.\r\n * @param uniformBuffers - The uniform buffers to use.\r\n * @param defineNames - Array of define names to prepend with \"#define \".\r\n * @param useWebGPU - Whether to use WebGPU shaders.\r\n * @param extraInitializations - Optional extra initializations callback for loading shaders.\r\n * @returns The effect wrapper.\r\n */\r\nconst CreateEffectWrapper = (\r\n engine: AbstractEngine,\r\n name: string,\r\n fragmentShader: string,\r\n uniformNames?: string[],\r\n samplerNames?: string[],\r\n uniformBuffers?: string[],\r\n defineNames?: string[],\r\n useWebGPU = false,\r\n extraInitializations?: (useWebGPU: boolean, list: Promise<any>[]) => void\r\n): EffectWrapper => {\r\n const defines = defineNames?.map((defineName) => `#define ${defineName}`) ?? [];\r\n return new EffectWrapper({\r\n engine,\r\n name,\r\n vertexShader: \"fullscreenTriangle\",\r\n fragmentShader,\r\n attributeNames: [\"position\"],\r\n uniformNames,\r\n uniformBuffers,\r\n samplerNames,\r\n defines,\r\n useShaderStore: true,\r\n shaderLanguage: useWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations,\r\n });\r\n};\r\n\r\nconst CreateMultiScatteringEffectWrapper = (engine: AbstractEngine, uniformBuffer: UniformBuffer, groundAlbedo: Color3): EffectWrapper => {\r\n const name = \"atmo-multiScattering\";\r\n const useUbo = uniformBuffer.useUbo;\r\n const useWebGPU = engine.isWebGPU && !EffectWrapper.ForceGLSL;\r\n const uboName = useWebGPU ? \"atmosphere\" : uniformBuffer.name;\r\n\r\n const defines = [\"#define POSITION_VEC2\"];\r\n if (!groundAlbedo.equals(Color3.BlackReadOnly)) {\r\n defines.push(\"#define USE_GROUND_ALBEDO\");\r\n }\r\n\r\n return new EffectWrapper({\r\n engine,\r\n name,\r\n vertexShader: \"fullscreenTriangle\",\r\n fragmentShader: \"multiScattering\",\r\n attributeNames: [\"position\"],\r\n uniformNames: [\"depth\", ...(useUbo ? [] : uniformBuffer.getUniformNames())],\r\n uniformBuffers: useUbo ? [uboName] : [],\r\n samplerNames: [\"transmittanceLut\"],\r\n defines,\r\n useShaderStore: true,\r\n shaderLanguage: useWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (_, list) => {\r\n list.push(\r\n ...(useWebGPU\r\n ? [import(\"./ShadersWGSL/fullscreenTriangle.vertex\"), import(\"./ShadersWGSL/multiScattering.fragment\")]\r\n : [import(\"./Shaders/fullscreenTriangle.vertex\"), import(\"./Shaders/multiScattering.fragment\")])\r\n );\r\n },\r\n });\r\n};\r\n\r\nconst CreateRenderTargetTexture = (\r\n name: string,\r\n size: number | { width: number; height: number; layers?: number },\r\n scene: Scene,\r\n options?: RenderTargetTextureOptions\r\n): RenderTargetTexture => {\r\n const caps = scene.getEngine().getCaps();\r\n const textureType = caps.textureHalfFloatRender\r\n ? Constants.TEXTURETYPE_HALF_FLOAT\r\n : caps.textureFloatRender\r\n ? Constants.TEXTURETYPE_FLOAT\r\n : Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n const rtOptions: RenderTargetTextureOptions = {\r\n generateMipMaps: false,\r\n generateDepthBuffer: false,\r\n generateStencilBuffer: false,\r\n gammaSpace: false,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n type: textureType,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n ...options,\r\n };\r\n const renderTarget = new RenderTargetTexture(name, size, scene, rtOptions);\r\n\r\n renderTarget.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n renderTarget.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n renderTarget.anisotropicFilteringLevel = 1;\r\n renderTarget.skipInitialClear = true;\r\n return renderTarget;\r\n};\r\n\r\n/**\r\n * Common setup and teardown for drawing LUTs or composition passes.\r\n * @param engine - The engine to use.\r\n * @param effectRenderer - The effect renderer to use.\r\n * @param effectWrapper - The effect wrapper to use.\r\n * @param renderTarget - The render target.\r\n * @param drawCallback - Callback function that performs the drawing.\r\n * @param depth - The depth value to set in the effect.\r\n * @param alphaMode - The alpha mode to set before drawing.\r\n * @param depthTest - Whether to enable depth testing.\r\n * @param depthWrite - Optional depth write state to set before drawing.\r\n * @param depthFunction - The depth function to set before drawing.\r\n * @param restoreDefaultFramebuffer - Whether to restore the default framebuffer after drawing.\r\n */\r\nconst DrawEffect = (\r\n engine: AbstractEngine,\r\n effectRenderer: EffectRenderer,\r\n effectWrapper: Nullable<EffectWrapper>,\r\n renderTarget: Nullable<RenderTargetTexture>,\r\n drawCallback: (effectRenderer: EffectRenderer, renderTarget: Nullable<RenderTargetWrapper>, effect: Effect, engine: AbstractEngine) => void,\r\n depth = 0,\r\n alphaMode = Constants.ALPHA_DISABLE,\r\n depthTest = true,\r\n depthWrite?: boolean,\r\n depthFunction = Constants.LEQUAL,\r\n restoreDefaultFramebuffer = true\r\n): void => {\r\n if ((renderTarget !== null && !renderTarget.isReady()) || !effectWrapper?.isReady()) {\r\n return;\r\n }\r\n\r\n effectRenderer.saveStates();\r\n\r\n // Set additional depth/stencil states before calling applyEffectWrapper.\r\n const currentDepthWrite = engine.getDepthWrite();\r\n if (depthWrite !== undefined) {\r\n engine.setDepthWrite(depthWrite);\r\n }\r\n const currentDepthFunction = engine.getDepthFunction();\r\n engine.setDepthFunction(depthFunction);\r\n\r\n const currentAlphaMode = engine.getAlphaMode();\r\n engine.setAlphaMode(alphaMode, true);\r\n\r\n const currentCull = engine.depthCullingState.cull;\r\n\r\n effectRenderer.setViewport();\r\n effectRenderer.applyEffectWrapper(effectWrapper, depthTest); // Note, stencil is false by default.\r\n\r\n engine.depthCullingState.cull = false;\r\n\r\n const effect = effectWrapper.effect;\r\n\r\n effect.setFloat(\"depth\", depth);\r\n\r\n // Call the specific drawing logic.\r\n drawCallback(effectRenderer, renderTarget?.renderTarget!, effect, engine);\r\n\r\n // Restore state (order matters!)\r\n engine.depthCullingState.cull = currentCull;\r\n engine.setAlphaMode(currentAlphaMode, true);\r\n if (currentDepthWrite !== undefined) {\r\n engine.setDepthWrite(currentDepthWrite);\r\n }\r\n if (currentDepthFunction) {\r\n engine.setDepthFunction(currentDepthFunction);\r\n }\r\n effectRenderer.restoreStates();\r\n\r\n // And restore the default framebuffer.\r\n if (restoreDefaultFramebuffer) {\r\n engine.restoreDefaultFramebuffer();\r\n }\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the sky compositor.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @param isSkyViewLutEnabled - Whether the sky view LUT is enabled.\r\n * @param isLinearSpaceComposition - Whether composition is in linear space.\r\n * @param applyApproximateTransmittance - Whether to apply approximate transmittance.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateSkyCompositorEffectWrapper = (\r\n engine: AbstractEngine,\r\n uniformBuffer: UniformBuffer,\r\n isSkyViewLutEnabled: boolean,\r\n isLinearSpaceComposition: boolean,\r\n applyApproximateTransmittance: boolean\r\n): EffectWrapper => {\r\n const useUbo = uniformBuffer.useUbo;\r\n const useWebGPU = engine.isWebGPU && !EffectWrapper.ForceGLSL;\r\n const uboName = useWebGPU ? \"atmosphere\" : uniformBuffer.name;\r\n const defines = [\"POSITION_VEC2\", \"COMPUTE_WORLD_RAY\"];\r\n if (isSkyViewLutEnabled) {\r\n defines.push(\"USE_SKY_VIEW_LUT\");\r\n }\r\n if (!isLinearSpaceComposition) {\r\n defines.push(\"OUTPUT_TO_SRGB\");\r\n }\r\n if (applyApproximateTransmittance) {\r\n defines.push(\"APPLY_TRANSMITTANCE_BLENDING\");\r\n }\r\n const textures = isSkyViewLutEnabled ? [\"skyViewLut\"] : [\"transmittanceLut\", \"multiScatteringLut\"];\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-skyCompositor\",\r\n \"compositeSky\",\r\n [\"depth\", ...(useUbo ? [] : uniformBuffer.getUniformNames())],\r\n textures,\r\n useUbo ? [uboName] : [],\r\n defines,\r\n useWebGPU,\r\n (_, list) => {\r\n list.push(\r\n ...(useWebGPU\r\n ? [import(\"./ShadersWGSL/fullscreenTriangle.vertex\"), import(\"./ShadersWGSL/compositeSky.fragment\")]\r\n : [import(\"./Shaders/fullscreenTriangle.vertex\"), import(\"./Shaders/compositeSky.fragment\")])\r\n );\r\n }\r\n );\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the aerial perspective LUT.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateAerialPerspectiveEffectWrapper = (engine: AbstractEngine, uniformBuffer: UniformBuffer): EffectWrapper => {\r\n const useWebGPU = engine.isWebGPU && !EffectWrapper.ForceGLSL;\r\n const uboName = useWebGPU ? \"atmosphere\" : uniformBuffer.name;\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-aerialPerspective\",\r\n \"aerialPerspective\",\r\n [\"layerIdx\", ...(uniformBuffer.useUbo ? [] : uniformBuffer.getUniformNames())],\r\n [\"transmittanceLut\", \"multiScatteringLut\"],\r\n uniformBuffer.useUbo ? [uboName] : [],\r\n [\"POSITION_VEC2\", \"COMPUTE_WORLD_RAY\"],\r\n useWebGPU,\r\n (_, list) => {\r\n list.push(\r\n ...(useWebGPU\r\n ? [import(\"./ShadersWGSL/fullscreenTriangle.vertex\"), import(\"./ShadersWGSL/aerialPerspective.fragment\")]\r\n : [import(\"./Shaders/fullscreenTriangle.vertex\"), import(\"./Shaders/aerialPerspective.fragment\")])\r\n );\r\n }\r\n );\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the aerial perspective compositor.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer.\r\n * @param isAerialPerspectiveLutEnabled - Whether the aerial perspective LUT is enabled.\r\n * @param isSkyViewLutEnabled - Whether the sky view LUT is enabled.\r\n * @param isLinearSpaceComposition - Whether composition is in linear space.\r\n * @param applyApproximateTransmittance - Whether to apply approximate transmittance.\r\n * @param aerialPerspectiveIntensity - The aerial perspective intensity.\r\n * @param aerialPerspectiveRadianceBias - The aerial perspective radiance bias.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateAerialPerspectiveCompositorEffectWrapper = (\r\n engine: AbstractEngine,\r\n uniformBuffer: UniformBuffer,\r\n isAerialPerspectiveLutEnabled: boolean,\r\n isSkyViewLutEnabled: boolean,\r\n isLinearSpaceComposition: boolean,\r\n applyApproximateTransmittance: boolean,\r\n aerialPerspectiveIntensity: number,\r\n aerialPerspectiveRadianceBias: number\r\n): EffectWrapper => {\r\n const useUbo = uniformBuffer.useUbo;\r\n const useWebGPU = engine.isWebGPU && !EffectWrapper.ForceGLSL;\r\n const uboName = useWebGPU ? \"atmosphere\" : uniformBuffer.name;\r\n const defines = [\"POSITION_VEC2\", \"COMPUTE_WORLD_RAY\"];\r\n if (isAerialPerspectiveLutEnabled) {\r\n defines.push(\"USE_AERIAL_PERSPECTIVE_LUT\");\r\n }\r\n if (isSkyViewLutEnabled) {\r\n defines.push(\"USE_SKY_VIEW_LUT\");\r\n }\r\n if (aerialPerspectiveIntensity !== 1) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_INTENSITY\");\r\n }\r\n if (!isLinearSpaceComposition) {\r\n defines.push(\"OUTPUT_TO_SRGB\");\r\n }\r\n if (applyApproximateTransmittance) {\r\n defines.push(\"APPLY_TRANSMITTANCE_BLENDING\");\r\n }\r\n if (aerialPerspectiveRadianceBias !== 0.0) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS\");\r\n }\r\n\r\n const samplers = [\"transmittanceLut\", \"multiScatteringLut\", \"depthTexture\"];\r\n if (isSkyViewLutEnabled) {\r\n samplers.push(\"skyViewLut\");\r\n }\r\n if (isAerialPerspectiveLutEnabled) {\r\n samplers.push(\"aerialPerspectiveLut\");\r\n }\r\n\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-aerialPerspectiveCompositor\",\r\n \"compositeAerialPerspective\",\r\n [\"depth\", ...(useUbo ? [] : uniformBuffer.getUniformNames())],\r\n samplers,\r\n useUbo ? [uboName] : [],\r\n defines,\r\n useWebGPU,\r\n (_, list) => {\r\n list.push(\r\n ...(useWebGPU\r\n ? [import(\"./ShadersWGSL/fullscreenTriangle.vertex\"), import(\"./ShadersWGSL/compositeAerialPerspective.fragment\")]\r\n : [import(\"./Shaders/fullscreenTriangle.vertex\"), import(\"./Shaders/compositeAerialPerspective.fragment\")])\r\n );\r\n }\r\n );\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the globe atmosphere compositor.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @param isSkyViewLutEnabled - Whether the sky view LUT is enabled.\r\n * @param isLinearSpaceComposition - Whether composition is in linear space.\r\n * @param applyApproximateTransmittance - Whether to apply approximate transmittance.\r\n * @param aerialPerspectiveIntensity - The aerial perspective intensity.\r\n * @param aerialPerspectiveRadianceBias - The aerial perspective radiance bias.\r\n * @param hasDepthTexture - Whether a depth texture is available.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateGlobeAtmosphereCompositorEffectWrapper = (\r\n engine: AbstractEngine,\r\n uniformBuffer: UniformBuffer,\r\n isSkyViewLutEnabled: boolean,\r\n isLinearSpaceComposition: boolean,\r\n applyApproximateTransmittance: boolean,\r\n aerialPerspectiveIntensity: number,\r\n aerialPerspectiveRadianceBias: number,\r\n hasDepthTexture: boolean\r\n): EffectWrapper => {\r\n const useUbo = uniformBuffer.useUbo;\r\n const useWebGPU = engine.isWebGPU && !EffectWrapper.ForceGLSL;\r\n const uboName = useWebGPU ? \"atmosphere\" : uniformBuffer.name;\r\n const defines = [\"POSITION_VEC2\", \"COMPUTE_WORLD_RAY\"];\r\n if (isSkyViewLutEnabled) {\r\n defines.push(\"USE_SKY_VIEW_LUT\");\r\n }\r\n if (aerialPerspectiveIntensity !== 1) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_INTENSITY\");\r\n }\r\n if (!isLinearSpaceComposition) {\r\n defines.push(\"OUTPUT_TO_SRGB\");\r\n }\r\n if (hasDepthTexture) {\r\n defines.push(\"HAS_DEPTH_TEXTURE\");\r\n }\r\n if (applyApproximateTransmittance) {\r\n defines.push(\"APPLY_TRANSMITTANCE_BLENDING\");\r\n }\r\n if (aerialPerspectiveRadianceBias !== 0.0) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS\");\r\n }\r\n\r\n const samplers = [\"transmittanceLut\", \"multiScatteringLut\"];\r\n if (isSkyViewLutEnabled) {\r\n samplers.push(\"skyViewLut\");\r\n }\r\n if (hasDepthTexture) {\r\n samplers.push(\"depthTexture\");\r\n }\r\n\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-globeAtmosphereCompositor\",\r\n \"compositeGlobeAtmosphere\",\r\n [\"depth\", ...(useUbo ? [] : uniformBuffer.getUniformNames())],\r\n samplers,\r\n useUbo ? [uboName] : [],\r\n defines,\r\n useWebGPU,\r\n (_, list) => {\r\n list.push(\r\n ...(useWebGPU\r\n ? [import(\"./ShadersWGSL/fullscreenTriangle.vertex\"), import(\"./ShadersWGSL/compositeGlobeAtmosphere.fragment\")]\r\n : [import(\"./Shaders/fullscreenTriangle.vertex\"), import(\"./Shaders/compositeGlobeAtmosphere.fragment\")])\r\n );\r\n }\r\n );\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the sky view LUT.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateSkyViewEffectWrapper = (engine: AbstractEngine, uniformBuffer: UniformBuffer): EffectWrapper => {\r\n const useWebGPU = engine.isWebGPU && !EffectWrapper.ForceGLSL;\r\n const uboName = useWebGPU ? \"atmosphere\" : uniformBuffer.name;\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-skyView\",\r\n \"skyView\",\r\n [\"depth\", ...(uniformBuffer.useUbo ? [] : uniformBuffer.getUniformNames())],\r\n [\"transmittanceLut\", \"multiScatteringLut\"],\r\n uniformBuffer.useUbo ? [uboName] : [],\r\n [\"POSITION_VEC2\"],\r\n useWebGPU,\r\n (_, list) => {\r\n list.push(\r\n ...(useWebGPU\r\n ? [import(\"./ShadersWGSL/fullscreenTriangle.vertex\"), import(\"./ShadersWGSL/skyView.fragment\")]\r\n : [import(\"./Shaders/fullscreenTriangle.vertex\"), import(\"./Shaders/skyView.fragment\")])\r\n );\r\n }\r\n );\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"file":"atmosphere.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmosphere.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// Licensed under the MIT License.\r\n\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { AtmospherePBRMaterialPlugin } from \"./atmospherePBRMaterialPlugin\";\r\nimport { AtmospherePerCameraVariables } from \"./atmospherePerCameraVariables\";\r\nimport { AtmospherePhysicalProperties } from \"./atmospherePhysicalProperties\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { DeepImmutable, Nullable } from \"core/types\";\r\nimport { DiffuseSkyIrradianceLut } from \"./diffuseSkyIrradianceLut\";\r\nimport type { DirectionalLight } from \"core/Lights/directionalLight\";\r\nimport type { Effect } from \"core/Materials/effect\";\r\nimport { EffectRenderer, EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport type { IAtmosphereOptions } from \"./atmosphereOptions\";\r\nimport type { IColor3Like, IVector3Like } from \"core/Maths/math.like\";\r\nimport type { IDisposable, Scene } from \"core/scene\";\r\nimport { Observable, type Observer } from \"core/Misc/observable\";\r\nimport { RegisterMaterialPlugin, UnregisterMaterialPlugin } from \"core/Materials/materialPluginManager\";\r\nimport type { RenderingGroupInfo } from \"core/Rendering/renderingManager\";\r\nimport { RenderTargetTexture, type RenderTargetTextureOptions } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { TransmittanceLut } from \"./transmittanceLut\";\r\nimport { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\n\r\nconst MaterialPlugin = \"atmo-pbr\";\r\n\r\nconst AerialPerspectiveLutLayers = 32;\r\n\r\nlet UniqueId = 0;\r\n\r\n/**\r\n * Renders a physically based atmosphere.\r\n * Use {@link IsSupported} to check if the atmosphere is supported before creating an instance.\r\n * @experimental\r\n */\r\nexport class Atmosphere implements IDisposable {\r\n private readonly _directionToLight = Vector3.Zero();\r\n private readonly _tempSceneAmbient = new Color3();\r\n private readonly _engine: AbstractEngine;\r\n private readonly _isDiffuseSkyIrradianceLutEnabled: boolean;\r\n private _physicalProperties: AtmospherePhysicalProperties;\r\n private _transmittanceLut: Nullable<TransmittanceLut>;\r\n private _diffuseSkyIrradianceLut: Nullable<DiffuseSkyIrradianceLut>;\r\n private _isSkyViewLutEnabled: boolean;\r\n private _isAerialPerspectiveLutEnabled: boolean;\r\n private _aerialPerspectiveTransmittanceScale: number;\r\n private _aerialPerspectiveSaturation: number;\r\n private _aerialPerspectiveIntensity: number;\r\n private _aerialPerspectiveRadianceBias: number;\r\n private _diffuseSkyIrradianceDesaturationFactor: number;\r\n private _additionalDiffuseSkyIrradianceIntensity: number;\r\n private _additionalDiffuseSkyIrradianceColor: Color3;\r\n private _additionalDiffuseSkyIrradiance = new Color3();\r\n private _diffuseSkyIrradianceIntensity: number;\r\n private _multiScatteringIntensity: number;\r\n private _groundAlbedo: Color3;\r\n private _minimumMultiScatteringColor: Color3;\r\n private _minimumMultiScatteringIntensity: number;\r\n private _lights: DirectionalLight[];\r\n private _atmosphereUbo: Nullable<UniformBuffer> = null;\r\n private _minimumMultiScattering = new Vector3();\r\n private _cameraAtmosphereVariables = new AtmospherePerCameraVariables();\r\n private _isLinearSpaceComposition: boolean;\r\n private _isLinearSpaceLight: boolean;\r\n private _lightRadianceAtCamera = new Vector3();\r\n private _linearLightColor = new Color3();\r\n private _originHeight: number;\r\n private _applyApproximateTransmittance: boolean;\r\n private _exposure: number;\r\n private _atmosphereUniformBufferAsArray: UniformBuffer[] = [];\r\n private _effectRenderer: Nullable<EffectRenderer> = null;\r\n private _skyRenderingGroup: number;\r\n private _aerialPerspectiveRenderingGroup: number;\r\n private _globeAtmosphereRenderingGroup: number;\r\n private _isEnabled = true;\r\n private _aerialPerspectiveLutHasBeenRendered = false;\r\n\r\n private _hasRenderedMultiScatteringLut = false;\r\n private _hasEverRenderedMultiScatteringLut = false;\r\n private _multiScatteringEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _multiScatteringLutRenderTarget: Nullable<RenderTargetTexture> = null;\r\n\r\n private _aerialPerspectiveLutEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _aerialPerspectiveLutEffectRenderer: Nullable<EffectRenderer> = null;\r\n private _aerialPerspectiveLutRenderTarget: Nullable<RenderTargetTexture> = null;\r\n\r\n private _skyViewLutEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _skyViewLutEffectRenderer: Nullable<EffectRenderer> = null;\r\n private _skyViewLutRenderTarget: Nullable<RenderTargetTexture> = null;\r\n\r\n private _aerialPerspectiveCompositorEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _skyCompositorEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _globeAtmosphereCompositorEffectWrapper: Nullable<EffectWrapper> = null;\r\n\r\n private _onBeforeCameraRenderObserver: Nullable<Observer<Camera>> = null;\r\n private _onBeforeRenderObserver: Nullable<Observer<Scene>> = null;\r\n private _onBeforeDrawPhaseObserver: Nullable<Observer<Scene>> = null;\r\n private _onAfterRenderingGroupObserver: Nullable<Observer<RenderingGroupInfo>> = null;\r\n\r\n /**\r\n * Checks if the {@link Atmosphere} is supported.\r\n * @param engine - The engine to check.\r\n * @returns True if the atmosphere is supported, false otherwise.\r\n */\r\n public static IsSupported(engine: AbstractEngine): boolean {\r\n return !engine._badOS && (engine.isWebGPU || engine.version >= 2);\r\n }\r\n\r\n /**\r\n * The unique ID of this atmosphere instance.\r\n */\r\n public readonly uniqueId = UniqueId++;\r\n\r\n /**\r\n * Called after the atmosphere variables have been updated for the specified camera.\r\n */\r\n public readonly onAfterUpdateVariablesForCameraObservable = new Observable<Camera>();\r\n\r\n /**\r\n * Called immediately before the light variables are finalized.\r\n */\r\n public readonly onBeforeLightVariablesUpdateObservable = new Observable<void>();\r\n\r\n /**\r\n * Called before the LUTs are rendered for this camera. This happens after the per-camera UBO update.\r\n */\r\n public readonly onBeforeRenderLutsForCameraObservable = new Observable<Camera>();\r\n\r\n /**\r\n * Called after the LUTs were rendered.\r\n */\r\n public readonly onAfterRenderLutsForCameraObservable = new Observable<Camera>();\r\n\r\n /**\r\n * If provided, this is the depth texture used for composition passes.\r\n * Expects an infinite far plane on the camera (camera.maxZ = 0) and the non-linear depth accessible in red channel.\r\n * @internal\r\n */\r\n public readonly depthTexture: Nullable<BaseTexture> = null;\r\n\r\n /**\r\n * Controls the overall brightness of the atmosphere rendering.\r\n */\r\n public get exposure(): number {\r\n return this._exposure;\r\n }\r\n\r\n public set exposure(value: number) {\r\n this._exposure = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Affects the overall intensity of the multiple scattering.\r\n */\r\n public get multiScatteringIntensity(): number {\r\n return this._multiScatteringIntensity;\r\n }\r\n\r\n public set multiScatteringIntensity(value: number) {\r\n const newValue = Math.max(0.0, value);\r\n if (newValue !== this._multiScatteringIntensity) {\r\n this._multiScatteringIntensity = value;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Affects the multiply scattered light contribution in the atmosphere by describing the average light color reflected off the ground.\r\n */\r\n public get groundAlbedo(): DeepImmutable<IColor3Like> {\r\n return this._groundAlbedo;\r\n }\r\n\r\n public set groundAlbedo(value: DeepImmutable<IColor3Like>) {\r\n if (!this._groundAlbedo.equals(value)) {\r\n this._groundAlbedo.copyFrom(value);\r\n this._multiScatteringEffectWrapper?.dispose();\r\n this._multiScatteringEffectWrapper = null;\r\n this._hasRenderedMultiScatteringLut = false;\r\n }\r\n }\r\n\r\n /**\r\n * Can be used to clamp the multiple scattering to a minimum value.\r\n */\r\n public get minimumMultiScatteringColor(): DeepImmutable<IColor3Like> {\r\n return this._minimumMultiScatteringColor;\r\n }\r\n\r\n public set minimumMultiScatteringColor(value: DeepImmutable<IColor3Like>) {\r\n if (!this._minimumMultiScatteringColor.equals(value)) {\r\n const minimumScatteringColor = this._minimumMultiScatteringColor.copyFrom(value);\r\n this._minimumMultiScattering.x = minimumScatteringColor.r * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.y = minimumScatteringColor.g * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.z = minimumScatteringColor.b * this._minimumMultiScatteringIntensity;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * This is an additional scaling factor applied to the {@link minimumMultiScatteringColor}.\r\n */\r\n public get minimumMultiScatteringIntensity(): number {\r\n return this._minimumMultiScatteringIntensity;\r\n }\r\n\r\n public set minimumMultiScatteringIntensity(value: number) {\r\n const newValue = Math.max(0.0, value);\r\n if (newValue !== this._minimumMultiScatteringIntensity) {\r\n this._minimumMultiScatteringIntensity = value;\r\n this._minimumMultiScattering.x = this._minimumMultiScatteringColor.r * value;\r\n this._minimumMultiScattering.y = this._minimumMultiScatteringColor.g * value;\r\n this._minimumMultiScattering.z = this._minimumMultiScatteringColor.b * value;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Can be used to force the diffuse irradiance towards a gray color.\r\n */\r\n public get diffuseSkyIrradianceDesaturationFactor(): number {\r\n return this._diffuseSkyIrradianceDesaturationFactor;\r\n }\r\n\r\n public set diffuseSkyIrradianceDesaturationFactor(value: number) {\r\n const newValue = Math.max(value, 0.0);\r\n if (newValue !== this._diffuseSkyIrradianceDesaturationFactor) {\r\n this._diffuseSkyIrradianceDesaturationFactor = newValue;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * This is an additional amount of irradiance added to the diffuse irradiance.\r\n */\r\n public get additionalDiffuseSkyIrradianceIntensity(): number {\r\n return this._additionalDiffuseSkyIrradianceIntensity;\r\n }\r\n\r\n public set additionalDiffuseSkyIrradianceIntensity(value: number) {\r\n value = Math.max(0.0, value);\r\n if (value !== this._additionalDiffuseSkyIrradianceIntensity) {\r\n this._additionalDiffuseSkyIrradianceIntensity = value;\r\n this._additionalDiffuseSkyIrradianceColor.scaleToRef(value, this._additionalDiffuseSkyIrradiance);\r\n }\r\n }\r\n\r\n /**\r\n * This is the color for the additional amount of irradiance added to the diffuse irradiance.\r\n */\r\n public get additionalDiffuseSkyIrradianceColor(): DeepImmutable<IColor3Like> {\r\n return this._additionalDiffuseSkyIrradianceColor;\r\n }\r\n\r\n public set additionalDiffuseSkyIrradianceColor(value: DeepImmutable<IColor3Like>) {\r\n if (!this._additionalDiffuseSkyIrradianceColor.equals(value)) {\r\n this._additionalDiffuseSkyIrradianceColor.copyFrom(value).scaleToRef(this._additionalDiffuseSkyIrradianceIntensity, this._additionalDiffuseSkyIrradiance);\r\n }\r\n }\r\n\r\n /**\r\n * The final additional diffuse irradiance, taking into account the intensity and color.\r\n */\r\n public get additionalDiffuseSkyIrradiance(): DeepImmutable<IColor3Like> {\r\n return this._additionalDiffuseSkyIrradiance;\r\n }\r\n\r\n /**\r\n * The intensity of the diffuse irradiance.\r\n */\r\n public get diffuseSkyIrradianceIntensity(): number {\r\n return this._diffuseSkyIrradianceIntensity;\r\n }\r\n\r\n public set diffuseSkyIrradianceIntensity(value: number) {\r\n this._diffuseSkyIrradianceIntensity = Math.max(value, 0.0);\r\n }\r\n\r\n /**\r\n * True if the sky view LUT should be used for compositing the sky instead of a per-pixel ray march.\r\n */\r\n public get isSkyViewLutEnabled(): boolean {\r\n return this._isSkyViewLutEnabled;\r\n }\r\n\r\n public set isSkyViewLutEnabled(value: boolean) {\r\n this._isSkyViewLutEnabled = value;\r\n this._disposeSkyCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n\r\n /**\r\n * Gets the sky view LUT render target or null if not enabled.\r\n * @returns The render target.\r\n */\r\n public get skyViewLutRenderTarget(): Nullable<RenderTargetTexture> {\r\n if (!this._isSkyViewLutEnabled) {\r\n return null;\r\n }\r\n\r\n if (this._skyViewLutRenderTarget !== null) {\r\n return this._skyViewLutRenderTarget;\r\n }\r\n\r\n const renderTarget = (this._skyViewLutRenderTarget = CreateRenderTargetTexture(\"atmo-skyView\", { width: 128, height: 128 }, this.scene));\r\n renderTarget.coordinatesMode = Constants.TEXTURE_EQUIRECTANGULAR_MODE;\r\n\r\n this._skyViewLutEffectWrapper = CreateSkyViewEffectWrapper(this._engine, this.uniformBuffer);\r\n\r\n return renderTarget;\r\n }\r\n /**\r\n * True if the aerial perspective LUT should be used.\r\n * If false, full ray marching would be used instead.\r\n */\r\n public get isAerialPerspectiveLutEnabled(): boolean {\r\n return this._isAerialPerspectiveLutEnabled;\r\n }\r\n\r\n public set isAerialPerspectiveLutEnabled(value: boolean) {\r\n this._isAerialPerspectiveLutEnabled = value;\r\n this._disposeAerialPerspectiveCompositor();\r\n }\r\n\r\n /**\r\n * Gets the aerial perspective LUT render target or null if not enabled.\r\n * @returns The render target.\r\n */\r\n public get aerialPerspectiveLutRenderTarget(): Nullable<RenderTargetTexture> {\r\n if (!this._isAerialPerspectiveLutEnabled) {\r\n return null;\r\n }\r\n\r\n if (this._aerialPerspectiveLutRenderTarget !== null) {\r\n return this._aerialPerspectiveLutRenderTarget;\r\n }\r\n\r\n const scene = this.scene;\r\n const name = \"atmo-aerialPerspective\";\r\n const renderTarget = (this._aerialPerspectiveLutRenderTarget = CreateRenderTargetTexture(name, { width: 16, height: 64, layers: AerialPerspectiveLutLayers }, scene, {}));\r\n this._aerialPerspectiveLutEffectWrapper = CreateAerialPerspectiveEffectWrapper(this._engine, this.uniformBuffer);\r\n\r\n return renderTarget;\r\n }\r\n\r\n /**\r\n * The intensity of the aerial perspective.\r\n */\r\n public get aerialPerspectiveIntensity(): number {\r\n return this._aerialPerspectiveIntensity;\r\n }\r\n\r\n public set aerialPerspectiveIntensity(value: number) {\r\n value = Math.max(0.001, value);\r\n if (value !== this._aerialPerspectiveIntensity) {\r\n // Define only needs to change if the value is changing between 1 and not 1.\r\n const hasDefineChanged = (value === 1) !== (this._aerialPerspectiveIntensity === 1);\r\n this._aerialPerspectiveIntensity = value;\r\n if (hasDefineChanged) {\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * The amount of light transmitted into aerial perspective.\r\n * A scale of 1 is physically correct.\r\n */\r\n public get aerialPerspectiveTransmittanceScale(): number {\r\n return this._aerialPerspectiveTransmittanceScale;\r\n }\r\n\r\n public set aerialPerspectiveTransmittanceScale(value: number) {\r\n value = Math.max(0, value);\r\n if (value !== this._aerialPerspectiveTransmittanceScale) {\r\n this._aerialPerspectiveTransmittanceScale = value;\r\n }\r\n }\r\n\r\n /**\r\n * The amount of saturation applied to the aerial perspective.\r\n * Reducing to zero desaturates the aerial perspective completely.\r\n * A value of 1 has no effect.\r\n */\r\n public get aerialPerspectiveSaturation(): number {\r\n return this._aerialPerspectiveSaturation;\r\n }\r\n\r\n public set aerialPerspectiveSaturation(value: number) {\r\n value = Math.max(0.0, value);\r\n if (value !== this._aerialPerspectiveSaturation) {\r\n this._aerialPerspectiveSaturation = value;\r\n }\r\n }\r\n\r\n /**\r\n * A radiance bias applied to aerial perspective.\r\n */\r\n public get aerialPerspectiveRadianceBias(): number {\r\n return this._aerialPerspectiveRadianceBias;\r\n }\r\n\r\n public set aerialPerspectiveRadianceBias(value: number) {\r\n if (value !== this._aerialPerspectiveRadianceBias) {\r\n // Define only needs to change if the value is changing between 0 and not 0.\r\n const hasDefineChanged = (value === 0) !== (this._aerialPerspectiveRadianceBias === 0);\r\n this._aerialPerspectiveRadianceBias = value;\r\n if (hasDefineChanged) {\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * True if the composition should be in linear space (e.g. for HDR rendering).\r\n * Typically linear space is expected when ImageProcessing is enabled via PostProcesses.\r\n * False for non-linear output.\r\n */\r\n public get isLinearSpaceComposition(): boolean {\r\n return this._isLinearSpaceComposition;\r\n }\r\n\r\n public set isLinearSpaceComposition(value: boolean) {\r\n if (value !== this._isLinearSpaceComposition) {\r\n this._isLinearSpaceComposition = value;\r\n // Note, LUTs will remain in linear space. Up to compositors to apply gamma if needed.\r\n this._disposeSkyCompositor();\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n\r\n /**\r\n * True if the {@link light} value should be specified in linear space.\r\n * If using PBRMaterials, light value is expected to be linear.\r\n */\r\n public get isLinearSpaceLight(): boolean {\r\n return this._isLinearSpaceLight;\r\n }\r\n\r\n public set isLinearSpaceLight(value: boolean) {\r\n this._isLinearSpaceLight = value;\r\n }\r\n\r\n /**\r\n * The lookup table for transmittance.\r\n */\r\n public get transmittanceLut(): Nullable<TransmittanceLut> {\r\n return this._transmittanceLut;\r\n }\r\n\r\n /**\r\n * Gets the multiple scattering LUT render target.\r\n * @returns The render target.\r\n */\r\n public get multiScatteringLutRenderTarget(): Nullable<RenderTargetTexture> {\r\n return this._multiScatteringLutRenderTarget;\r\n }\r\n\r\n /**\r\n * The lookup table for diffuse sky irradiance, or null if not enabled.\r\n */\r\n public get diffuseSkyIrradianceLut(): Nullable<DiffuseSkyIrradianceLut> {\r\n return this._diffuseSkyIrradianceLut;\r\n }\r\n\r\n /**\r\n * The properties used to describe the size and optical parameters of the atmosphere.\r\n */\r\n public get physicalProperties(): AtmospherePhysicalProperties {\r\n return this._physicalProperties;\r\n }\r\n\r\n /**\r\n * The height in kilometers of the scene's origin.\r\n */\r\n public get originHeight(): number {\r\n return this._originHeight;\r\n }\r\n\r\n public set originHeight(value: number) {\r\n this._originHeight = value;\r\n }\r\n\r\n /**\r\n * When atmospheric scattering is applied to surfaces, if this value is set to true,\r\n * a grayscale approximation of the transmittance is used to dim surfaces.\r\n *\r\n * When set to false, the atmospheric composition does not dim the surfaces behind it.\r\n * It is up to the client application to apply transmittance manually.\r\n */\r\n public get applyApproximateTransmittance(): boolean {\r\n return this._applyApproximateTransmittance;\r\n }\r\n\r\n public set applyApproximateTransmittance(value: boolean) {\r\n if (this._applyApproximateTransmittance !== value) {\r\n this._applyApproximateTransmittance = value;\r\n this._disposeSkyCompositor();\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n\r\n /**\r\n * The directional lights in the scene which represent the suns illuminating the atmosphere.\r\n * Each frame, the color and intensity of the lights are updated based on the camera position and the light's direction.\r\n */\r\n public get lights(): ReadonlyArray<DirectionalLight> {\r\n return this._lights;\r\n }\r\n\r\n /**\r\n * The rendering group ID for the sky compositor.\r\n * The sky will only be rendered for this group.\r\n */\r\n public get skyRenderingGroup(): number {\r\n return this._skyRenderingGroup;\r\n }\r\n\r\n public set skyRenderingGroup(value: number) {\r\n this._skyRenderingGroup = value;\r\n this.scene.renderingManager.getRenderingGroup(value);\r\n }\r\n\r\n /**\r\n * The rendering group ID for the aerial perspective compositor.\r\n * Aerial perspective will only be rendered for this group.\r\n */\r\n public get aerialPerspectiveRenderingGroup(): number {\r\n return this._aerialPerspectiveRenderingGroup;\r\n }\r\n\r\n public set aerialPerspectiveRenderingGroup(value: number) {\r\n this._aerialPerspectiveRenderingGroup = value;\r\n this.scene.renderingManager.getRenderingGroup(value);\r\n }\r\n\r\n /**\r\n * The rendering group ID for the globe atmosphere compositor.\r\n * The globe atmosphere will only be rendered for this group.\r\n */\r\n public get globeAtmosphereRenderingGroup(): number {\r\n return this._globeAtmosphereRenderingGroup;\r\n }\r\n\r\n public set globeAtmosphereRenderingGroup(value: number) {\r\n this._globeAtmosphereRenderingGroup = value;\r\n this.scene.renderingManager.getRenderingGroup(value);\r\n }\r\n\r\n /**\r\n * Gets the uniform buffer used to store the atmosphere's physical properties.\r\n */\r\n public get uniformBuffer(): UniformBuffer {\r\n if (this._atmosphereUbo === null) {\r\n const atmosphereUbo = (this._atmosphereUbo = new UniformBuffer(this._engine, undefined, true, \"Atmosphere\"));\r\n atmosphereUbo.addUniform(\"peakRayleighScattering\", 3);\r\n atmosphereUbo.addUniform(\"planetRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakMieScattering\", 3);\r\n atmosphereUbo.addUniform(\"atmosphereThickness\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakMieAbsorption\", 3);\r\n atmosphereUbo.addUniform(\"planetRadiusSquared\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakMieExtinction\", 3);\r\n atmosphereUbo.addUniform(\"atmosphereRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakOzoneAbsorption\", 3);\r\n atmosphereUbo.addUniform(\"atmosphereRadiusSquared\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"horizonDistanceToAtmosphereEdge\", 1);\r\n atmosphereUbo.addUniform(\"horizonDistanceToAtmosphereEdgeSquared\", 1);\r\n atmosphereUbo.addUniform(\"planetRadiusWithOffset\", 1);\r\n atmosphereUbo.addUniform(\"planetRadiusOffset\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"atmosphereExposure\", 1);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveRadianceBias\", 1);\r\n atmosphereUbo.addUniform(\"inverseAtmosphereThickness\", 1);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveTransmittanceScale\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"inverseViewProjectionWithoutTranslation\", 16);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"directionToLight\", 3);\r\n atmosphereUbo.addUniform(\"multiScatteringIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"directionToLightRelativeToCameraGeocentricNormal\", 3);\r\n atmosphereUbo.addUniform(\"cameraRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"lightRadianceAtCamera\", 3);\r\n atmosphereUbo.addUniform(\"diffuseSkyIrradianceDesaturationFactor\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"groundAlbedo\", 3);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveSaturation\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"minMultiScattering\", 3);\r\n atmosphereUbo.addUniform(\"diffuseSkyIrradianceIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraPositionGlobal\", 3);\r\n atmosphereUbo.addUniform(\"lightIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"clampedCameraPositionGlobal\", 3);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraGeocentricNormal\", 3);\r\n atmosphereUbo.addUniform(\"clampedCameraRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraForward\", 3);\r\n atmosphereUbo.addUniform(\"clampedCameraHeight\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraPosition\", 3);\r\n atmosphereUbo.addUniform(\"cosCameraHorizonAngleFromZenith\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"viewport\", 4);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"additionalDiffuseSkyIrradiance\", 3);\r\n atmosphereUbo.addUniform(\"cameraHeight\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraNearPlane\", 1);\r\n atmosphereUbo.addUniform(\"originHeight\", 1);\r\n atmosphereUbo.addUniform(\"sinCameraAtmosphereHorizonAngleFromNadir\", 1);\r\n atmosphereUbo.create();\r\n }\r\n return this._atmosphereUbo;\r\n }\r\n\r\n /**\r\n * Gets the camera-related variables for this atmosphere. Updated each frame.\r\n */\r\n public get cameraAtmosphereVariables(): AtmospherePerCameraVariables {\r\n return this._cameraAtmosphereVariables;\r\n }\r\n\r\n /**\r\n * Constructs the {@link Atmosphere}.\r\n * @param name - The name of this instance.\r\n * @param scene - The scene to which the atmosphere will be added.\r\n * @param lights - The light sources that illuminate the atmosphere. Currently only supports one light, and that light should be the first light in the scene.\r\n * @param options - The options used to create the atmosphere.\r\n */\r\n public constructor(\r\n public readonly name: string,\r\n public readonly scene: Scene,\r\n lights: DirectionalLight[],\r\n options?: IAtmosphereOptions\r\n ) {\r\n const engine = (this._engine = scene.getEngine());\r\n\r\n if (!engine.isWebGPU && engine.version < 2) {\r\n throw new Error(`Atmosphere is not supported on WebGL ${engine.version}.`);\r\n }\r\n\r\n this._physicalProperties = options?.physicalProperties ?? new AtmospherePhysicalProperties();\r\n this._physicalProperties.onChangedObservable.add(() => {\r\n this._transmittanceLut?.markDirty();\r\n });\r\n\r\n if (lights.length !== 1) {\r\n throw new Error(\"Atmosphere only supports one light source currently.\");\r\n }\r\n this._lights = lights;\r\n\r\n this.depthTexture = options?.depthTexture ?? null;\r\n this._exposure = options?.exposure ?? 1.0;\r\n this._isLinearSpaceLight = options?.isLinearSpaceLight ?? false;\r\n this._isLinearSpaceComposition = options?.isLinearSpaceComposition ?? false;\r\n this._applyApproximateTransmittance = options?.applyApproximateTransmittance ?? true;\r\n this._aerialPerspectiveRadianceBias = options?.aerialPerspectiveRadianceBias ?? 0.0;\r\n this._aerialPerspectiveTransmittanceScale = options?.aerialPerspectiveTransmittanceScale ?? 1.0;\r\n this._aerialPerspectiveSaturation = options?.aerialPerspectiveSaturation ?? 1.0;\r\n this._aerialPerspectiveIntensity = options?.aerialPerspectiveIntensity ?? 1.0;\r\n this._diffuseSkyIrradianceDesaturationFactor = options?.diffuseSkyIrradianceDesaturationFactor ?? 0.5;\r\n this._diffuseSkyIrradianceIntensity = options?.diffuseSkyIrradianceIntensity ?? 1.0;\r\n this._additionalDiffuseSkyIrradianceIntensity = options?.additionalDiffuseSkyIrradianceIntensity ?? 0.01;\r\n this._multiScatteringIntensity = options?.multiScatteringIntensity ?? 1.0;\r\n this._minimumMultiScatteringIntensity = options?.minimumMultiScatteringIntensity ?? 0.000618;\r\n this._isSkyViewLutEnabled = options?.isSkyViewLutEnabled ?? true;\r\n this._isAerialPerspectiveLutEnabled = options?.isAerialPerspectiveLutEnabled ?? true;\r\n this._originHeight = options?.originHeight ?? 0;\r\n this._additionalDiffuseSkyIrradianceColor = options?.additionalDiffuseSkyIrradianceColor\r\n ? new Color3().copyFrom(options.additionalDiffuseSkyIrradianceColor)\r\n : new Color3(163 / 255.0, 199 / 255.0, 1.0);\r\n this._groundAlbedo = options?.groundAlbedo ? new Color3().copyFrom(options.groundAlbedo) : new Color3().set(124.0 / 255.0, 165.0 / 255.0, 1.0);\r\n const minimumMultiScatteringColor = (this._minimumMultiScatteringColor = options?.minimumMultiScatteringColor\r\n ? new Color3().copyFrom(options.minimumMultiScatteringColor)\r\n : new Color3(30.0 / 255.0, 40.0 / 255.0, 77.0 / 255.0));\r\n\r\n this._skyRenderingGroup = options?.skyRenderingGroup ?? 0;\r\n this._aerialPerspectiveRenderingGroup = options?.aerialPerspectiveRenderingGroup ?? 0;\r\n this._globeAtmosphereRenderingGroup = options?.globeAtmosphereRenderingGroup ?? 0;\r\n\r\n this._additionalDiffuseSkyIrradianceColor.scaleToRef(this._additionalDiffuseSkyIrradianceIntensity, this._additionalDiffuseSkyIrradiance);\r\n this._minimumMultiScattering.x = minimumMultiScatteringColor.r * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.y = minimumMultiScatteringColor.g * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.z = minimumMultiScatteringColor.b * this._minimumMultiScatteringIntensity;\r\n\r\n // Initialize light direction and color.\r\n {\r\n const light = lights[0];\r\n this._directionToLight.copyFrom(light.direction).scaleInPlace(-1);\r\n const lightColor = this._linearLightColor.copyFrom(light.diffuse);\r\n if (!this._isLinearSpaceLight) {\r\n lightColor.toLinearSpaceToRef(lightColor);\r\n }\r\n const intensity = light.intensity;\r\n this._lightRadianceAtCamera.set(intensity * lightColor.r, intensity * lightColor.g, intensity * lightColor.b);\r\n }\r\n\r\n this._effectRenderer = new EffectRenderer(engine, {\r\n // Full screen triangle.\r\n indices: [0, 2, 1],\r\n positions: [-1, -1, -1, 3, 3, -1],\r\n });\r\n\r\n this._transmittanceLut = new TransmittanceLut(this);\r\n this._multiScatteringLutRenderTarget = CreateRenderTargetTexture(\"atmo-multiScattering\", { width: 32, height: 32 }, scene);\r\n this._multiScatteringEffectWrapper = CreateMultiScatteringEffectWrapper(engine, this.uniformBuffer, this._groundAlbedo);\r\n this._isDiffuseSkyIrradianceLutEnabled = options?.isDiffuseSkyIrradianceLutEnabled ?? true;\r\n if (this._isDiffuseSkyIrradianceLutEnabled) {\r\n this._diffuseSkyIrradianceLut = new DiffuseSkyIrradianceLut(this);\r\n }\r\n if (this._isSkyViewLutEnabled) {\r\n this.skyViewLutRenderTarget!;\r\n }\r\n if (this._isAerialPerspectiveLutEnabled) {\r\n this.aerialPerspectiveLutRenderTarget!;\r\n }\r\n\r\n // Render global LUTs once per frame (not per camera).\r\n this._onBeforeRenderObserver = scene.onBeforeRenderObservable.add(() => {\r\n this.renderGlobalLuts();\r\n });\r\n\r\n // Before rendering, make sure the per-camera variables have been updated.\r\n this._onBeforeCameraRenderObserver = scene.onBeforeCameraRenderObservable.add((x) => {\r\n this._updatePerCameraVariables(x);\r\n this._renderLutsForCamera(x);\r\n });\r\n\r\n {\r\n const renderingManager = scene.renderingManager;\r\n if (this._skyRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._skyRenderingGroup);\r\n }\r\n if (this._aerialPerspectiveRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._aerialPerspectiveRenderingGroup);\r\n }\r\n if (this._globeAtmosphereRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._globeAtmosphereRenderingGroup);\r\n }\r\n\r\n // Mark all rendering groups as being \"not empty\" before rendering the corresponding targets.\r\n // This ensures onAfterRenderTargetsRenderObservable is called for empty groups,\r\n // which allows the atmosphere to be rendered even when the groups are otherwise empty e.g.,\r\n // a scene with only the atmosphere in it, and no other Meshes.\r\n this._onBeforeDrawPhaseObserver = scene.onBeforeDrawPhaseObservable.add(() => {\r\n if (this._skyRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._skyRenderingGroup)._empty = false;\r\n }\r\n if (this._aerialPerspectiveRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._aerialPerspectiveRenderingGroup)._empty = false;\r\n }\r\n if (this._globeAtmosphereRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._globeAtmosphereRenderingGroup)._empty = false;\r\n }\r\n });\r\n\r\n // Draw compositors after the respective rendering group.\r\n this._onAfterRenderingGroupObserver = scene.onAfterRenderingGroupObservable.add((group) => {\r\n if (group.renderingManager !== scene.renderingManager) {\r\n return;\r\n }\r\n\r\n const groupId = group.renderingGroupId;\r\n\r\n if (this._skyRenderingGroup === groupId) {\r\n this.drawSkyCompositor();\r\n }\r\n\r\n if (this._aerialPerspectiveRenderingGroup === groupId) {\r\n this.drawAerialPerspectiveCompositor();\r\n }\r\n\r\n if (this._globeAtmosphereRenderingGroup === groupId) {\r\n this.drawGlobeAtmosphereCompositor();\r\n }\r\n });\r\n }\r\n\r\n // Ensure the atmosphere is disposed when the scene is disposed.\r\n scene.onDisposeObservable.addOnce(() => {\r\n scene.removeExternalData(\"atmosphere\");\r\n this.dispose();\r\n });\r\n scene.addExternalData(\"atmosphere\", this);\r\n\r\n // Registers a material plugin which will allow common materials to sample the atmosphere environment maps e.g.,\r\n // sky view LUT for glossy reflections and diffuse sky illiminance LUT for irradiance.\r\n // It also handles aerial perspective application when Atmosphere is not provided with a depth texture.\r\n UnregisterMaterialPlugin(MaterialPlugin);\r\n RegisterMaterialPlugin(MaterialPlugin, (material) => {\r\n if (material.getClassName() === \"PBRMaterial\") {\r\n return new AtmospherePBRMaterialPlugin(material, this, this.depthTexture === null);\r\n }\r\n return null;\r\n });\r\n\r\n scene.addIsReadyCheck(this);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public dispose(): void {\r\n this.scene.removeIsReadyCheck(this);\r\n this._onBeforeCameraRenderObserver?.remove();\r\n this._onBeforeCameraRenderObserver = null;\r\n this._onBeforeDrawPhaseObserver?.remove();\r\n this._onBeforeDrawPhaseObserver = null;\r\n this._onAfterRenderingGroupObserver?.remove();\r\n this._onAfterRenderingGroupObserver = null;\r\n this._onBeforeRenderObserver?.remove();\r\n this._onBeforeRenderObserver = null;\r\n this._globeAtmosphereCompositorEffectWrapper?.dispose();\r\n this._globeAtmosphereCompositorEffectWrapper = null;\r\n this._skyCompositorEffectWrapper?.dispose();\r\n this._skyCompositorEffectWrapper = null;\r\n this._aerialPerspectiveCompositorEffectWrapper?.dispose();\r\n this._aerialPerspectiveCompositorEffectWrapper = null;\r\n this._skyViewLutRenderTarget?.dispose();\r\n this._skyViewLutRenderTarget = null;\r\n this._skyViewLutEffectWrapper?.dispose();\r\n this._skyViewLutEffectWrapper = null;\r\n this._skyViewLutEffectRenderer?.dispose();\r\n this._skyViewLutEffectRenderer = null;\r\n this._aerialPerspectiveLutRenderTarget?.dispose();\r\n this._aerialPerspectiveLutRenderTarget = null;\r\n this._aerialPerspectiveLutEffectWrapper?.dispose();\r\n this._aerialPerspectiveLutEffectWrapper = null;\r\n this._aerialPerspectiveLutEffectRenderer?.dispose();\r\n this._aerialPerspectiveLutEffectRenderer = null;\r\n this._multiScatteringEffectWrapper?.dispose();\r\n this._multiScatteringEffectWrapper = null;\r\n this._multiScatteringLutRenderTarget?.dispose();\r\n this._multiScatteringLutRenderTarget = null;\r\n this._transmittanceLut?.dispose();\r\n this._transmittanceLut = null;\r\n this._diffuseSkyIrradianceLut?.dispose();\r\n this._diffuseSkyIrradianceLut = null;\r\n this._atmosphereUbo?.dispose();\r\n this._atmosphereUbo = null;\r\n this._effectRenderer?.dispose();\r\n this._effectRenderer = null;\r\n this._atmosphereUniformBufferAsArray.length = 0;\r\n\r\n UnregisterMaterialPlugin(MaterialPlugin);\r\n }\r\n\r\n /**\r\n * True if the atmosphere is enabled.\r\n * @returns - True if the atmosphere is enabled.\r\n */\r\n public isEnabled() {\r\n return this._isEnabled;\r\n }\r\n\r\n /**\r\n * Sets the enabled state of the atmosphere.\r\n * @param enabled - True to enable the atmosphere, false to disable it.\r\n */\r\n public setEnabled(enabled: boolean) {\r\n this._isEnabled = enabled;\r\n }\r\n\r\n /**\r\n * Returns true if the atmosphere is ready for rendering.\r\n * Note, this will cause a render of the global LUTs if they are not up to date.\r\n * @returns true if the atmosphere is ready\r\n */\r\n public isReady(): boolean {\r\n if (!this._isEnabled) {\r\n return true;\r\n }\r\n\r\n const engine = this._engine;\r\n const uniformBuffer = this.uniformBuffer;\r\n const isSkyViewLutEnabled = this._isSkyViewLutEnabled;\r\n const isLinearSpaceComposition = this._isLinearSpaceComposition;\r\n const applyApproximateTransmittance = this._applyApproximateTransmittance;\r\n const depthTexture = this.depthTexture;\r\n this._skyCompositorEffectWrapper ??= CreateSkyCompositorEffectWrapper(engine, uniformBuffer, isSkyViewLutEnabled, isLinearSpaceComposition, applyApproximateTransmittance);\r\n this._globeAtmosphereCompositorEffectWrapper ??= CreateGlobeAtmosphereCompositorEffectWrapper(\r\n engine,\r\n uniformBuffer,\r\n isSkyViewLutEnabled,\r\n isLinearSpaceComposition,\r\n applyApproximateTransmittance,\r\n this._aerialPerspectiveIntensity,\r\n this._aerialPerspectiveRadianceBias,\r\n depthTexture !== null\r\n );\r\n if (depthTexture !== null) {\r\n this._aerialPerspectiveCompositorEffectWrapper ??= CreateAerialPerspectiveCompositorEffectWrapper(\r\n engine,\r\n uniformBuffer,\r\n this._isAerialPerspectiveLutEnabled,\r\n isSkyViewLutEnabled,\r\n isLinearSpaceComposition,\r\n applyApproximateTransmittance,\r\n this._aerialPerspectiveIntensity,\r\n this._aerialPerspectiveRadianceBias\r\n );\r\n }\r\n\r\n this.renderGlobalLuts(); // Start rendering of global LUTs during readiness polling.\r\n\r\n if (!this._transmittanceLut?.hasLutData || (this._isDiffuseSkyIrradianceLutEnabled && !this._diffuseSkyIrradianceLut?.hasLutData)) {\r\n return false;\r\n }\r\n if (!this._hasRenderedMultiScatteringLut || this._multiScatteringLutRenderTarget?.isReady() === false || this._multiScatteringEffectWrapper?.isReady() === false) {\r\n return false;\r\n }\r\n if (this._isSkyViewLutEnabled && (this._skyViewLutRenderTarget?.isReady() === false || this._skyViewLutEffectWrapper?.isReady() === false)) {\r\n return false;\r\n }\r\n if (this._isAerialPerspectiveLutEnabled && (this._aerialPerspectiveLutRenderTarget?.isReady() === false || this._aerialPerspectiveLutEffectWrapper?.isReady() === false)) {\r\n return false;\r\n }\r\n\r\n if (\r\n this._skyCompositorEffectWrapper?.isReady() === false ||\r\n this._aerialPerspectiveCompositorEffectWrapper?.isReady() === false ||\r\n this._globeAtmosphereCompositorEffectWrapper?.isReady() === false\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * The class name of the {@link Atmosphere}.\r\n * @returns - The class name of the atmosphere.\r\n */\r\n public getClassName(): string {\r\n return \"Atmosphere\";\r\n }\r\n\r\n /**\r\n * Gets the color of a light after being transmitted through the atmosphere to a point specified by its distance to the planet center and its geocentric normal.\r\n * NOTE, the result is always a linear space color.\r\n * @param directionToLight - The direction of the light.\r\n * @param pointRadius - The distance from the planet center to the point in kilometers.\r\n * @param pointGeocentricNormal - The geocentric normal at the point i.e., normalize(point - planet center).\r\n * @param result - The color to store the result in.\r\n * @returns The result color.\r\n */\r\n public getTransmittedColorToRef = <T extends IColor3Like>(directionToLight: IVector3Like, pointRadius: number, pointGeocentricNormal: IVector3Like, result: T): T =>\r\n this._transmittanceLut!.getTransmittedColorToRef(directionToLight, pointRadius, pointGeocentricNormal, result);\r\n\r\n /**\r\n * Gets the diffuse sky irradiance. Result is always in linear space.\r\n * @param directionToLight - The direction of the point to the light.\r\n * @param pointRadius - The distance from the planet center to the point in kilometers.\r\n * @param pointGeocentricNormal - The geocentric normal at the point: normalize(point - planet center).\r\n * @param lightIrradiance - The irradiance of the light.\r\n * @param result - The color to store the result in.\r\n * @returns The result color.\r\n */\r\n public getDiffuseSkyIrradianceToRef = <T extends IColor3Like>(\r\n directionToLight: IVector3Like,\r\n pointRadius: number,\r\n pointGeocentricNormal: IVector3Like,\r\n lightIrradiance: number,\r\n result: T\r\n ): T =>\r\n this._diffuseSkyIrradianceLut?.getDiffuseSkyIrradianceToRef(directionToLight, pointRadius, pointGeocentricNormal, lightIrradiance, result) ??\r\n ((result.r = 0), (result.g = 0), (result.b = 0), result);\r\n /**\r\n * Draws the multiple scattering LUT using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n private _drawMultiScatteringLut(): void {\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n DrawEffect(\r\n this._engine,\r\n this._effectRenderer!,\r\n this._multiScatteringEffectWrapper,\r\n this._multiScatteringLutRenderTarget,\r\n (effectRenderer, renderTarget, effect, engine) => {\r\n this.bindUniformBufferToEffect(effect);\r\n engine.bindFramebuffer(renderTarget!, undefined, undefined, undefined, true);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effectRenderer.draw();\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Draws the aerial perspective compositor using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n public drawAerialPerspectiveCompositor(): void {\r\n // Only works if we have a depth texture.\r\n if (this.depthTexture === null) {\r\n return;\r\n }\r\n\r\n const isEnabled = this.isEnabled();\r\n if (!isEnabled) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n const effectWrapper = (this._aerialPerspectiveCompositorEffectWrapper ??= CreateAerialPerspectiveCompositorEffectWrapper(\r\n engine,\r\n this.uniformBuffer,\r\n this._isAerialPerspectiveLutEnabled,\r\n this._isSkyViewLutEnabled,\r\n this._isLinearSpaceComposition,\r\n this._applyApproximateTransmittance,\r\n this._aerialPerspectiveIntensity,\r\n this._aerialPerspectiveRadianceBias\r\n ));\r\n\r\n if (!this._isGlobalLutsReady) {\r\n return;\r\n }\r\n\r\n // Aerial perspective compositor only renders when inside the atmosphere.\r\n const isOutsideAtmosphere = this._cameraAtmosphereVariables.clampedCameraRadius > this._physicalProperties.atmosphereRadius;\r\n if (isOutsideAtmosphere) {\r\n return;\r\n }\r\n\r\n const skyViewLut = this._isSkyViewLutEnabled ? this.skyViewLutRenderTarget : null;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n const aerialPerspectiveLut = this._isAerialPerspectiveLutEnabled ? this.aerialPerspectiveLutRenderTarget : null;\r\n if (\r\n !effectWrapper.isReady() ||\r\n !(skyViewLut?.isReady() ?? true) ||\r\n !multiScatteringLut.isReady() ||\r\n !transmittanceLut.isReady() ||\r\n !(aerialPerspectiveLut?.isReady() ?? true) ||\r\n !this.depthTexture.isReady()\r\n ) {\r\n return;\r\n }\r\n\r\n DrawEffect(\r\n engine,\r\n this._effectRenderer!,\r\n effectWrapper,\r\n null, // No render target, it will render to the current buffer.\r\n (effectRenderer, _, effect) => {\r\n if (this.depthTexture === null) {\r\n throw new Error(\"Depth texture is required for aerial perspective compositor.\");\r\n }\r\n this.bindUniformBufferToEffect(effect);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n if (this._isSkyViewLutEnabled) {\r\n effect.setTexture(\"skyViewLut\", skyViewLut);\r\n }\r\n if (this._isAerialPerspectiveLutEnabled) {\r\n effect.setTexture(\"aerialPerspectiveLut\", aerialPerspectiveLut);\r\n }\r\n effect.setTexture(\"depthTexture\", this.depthTexture);\r\n effectRenderer.draw();\r\n },\r\n 1, // depth to use in the compositor.\r\n this.applyApproximateTransmittance ? Constants.ALPHA_PREMULTIPLIED_PORTERDUFF : Constants.ALPHA_ONEONE,\r\n true, // depthTest\r\n false, // depthWrite\r\n Constants.ALWAYS, // depthFunction\r\n false // restoreDefaultFramebuffer\r\n );\r\n }\r\n\r\n /**\r\n * Draws the sky compositor using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n public drawSkyCompositor(): void {\r\n const isEnabled = this.isEnabled();\r\n if (!isEnabled) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n const effectWrapper = (this._skyCompositorEffectWrapper ??= CreateSkyCompositorEffectWrapper(\r\n engine,\r\n this.uniformBuffer,\r\n this._isSkyViewLutEnabled,\r\n this._isLinearSpaceComposition,\r\n this._applyApproximateTransmittance\r\n ));\r\n\r\n if (!this._isGlobalLutsReady) {\r\n return;\r\n }\r\n\r\n // The sky compositor only renders when inside the atmosphere.\r\n const isOutsideAtmosphere = this._cameraAtmosphereVariables.clampedCameraRadius > this._physicalProperties.atmosphereRadius;\r\n if (isOutsideAtmosphere) {\r\n return;\r\n }\r\n\r\n if (this.depthTexture !== null && !this.depthTexture.isReady()) {\r\n return;\r\n }\r\n\r\n const skyViewLut = this._isSkyViewLutEnabled ? this.skyViewLutRenderTarget : null;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n if (!effectWrapper.isReady() || !(skyViewLut?.isReady() ?? true) || !multiScatteringLut.isReady() || !transmittanceLut.isReady()) {\r\n return;\r\n }\r\n\r\n DrawEffect(\r\n engine,\r\n this._effectRenderer!,\r\n effectWrapper,\r\n null, // No render target, it will render to the current buffer.\r\n (effectRenderer, _, effect) => {\r\n this.bindUniformBufferToEffect(effect);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n if (this._isSkyViewLutEnabled) {\r\n effect.setTexture(\"skyViewLut\", skyViewLut);\r\n }\r\n effectRenderer.draw();\r\n },\r\n 1, // depth to use in the compositor.\r\n this._applyApproximateTransmittance ? Constants.ALPHA_PREMULTIPLIED_PORTERDUFF : Constants.ALPHA_ONEONE,\r\n true, // depthTest\r\n false, // depthWrite\r\n Constants.EQUAL, // depthFunction\r\n false // restoreDefaultFramebuffer\r\n );\r\n }\r\n\r\n /**\r\n * Draws the globe atmosphere compositor using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n public drawGlobeAtmosphereCompositor(): void {\r\n const isEnabled = this.isEnabled();\r\n if (!isEnabled) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n const effectWrapper = (this._globeAtmosphereCompositorEffectWrapper ??= CreateGlobeAtmosphereCompositorEffectWrapper(\r\n engine,\r\n this.uniformBuffer,\r\n this._isSkyViewLutEnabled,\r\n this._isLinearSpaceComposition,\r\n this._applyApproximateTransmittance,\r\n this._aerialPerspectiveIntensity,\r\n this._aerialPerspectiveRadianceBias,\r\n this.depthTexture !== null\r\n ));\r\n\r\n if (!this._isGlobalLutsReady) {\r\n return;\r\n }\r\n\r\n // Globe atmosphere compositor only renders when outside the atmosphere.\r\n const isOutsideAtmosphere = this._cameraAtmosphereVariables.clampedCameraRadius > this._physicalProperties.atmosphereRadius;\r\n if (!isOutsideAtmosphere) {\r\n return;\r\n }\r\n\r\n const skyViewLut = this._isSkyViewLutEnabled ? this.skyViewLutRenderTarget : null;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n if (!effectWrapper.isReady() || !(skyViewLut?.isReady() ?? true) || !multiScatteringLut.isReady() || !transmittanceLut.isReady()) {\r\n return;\r\n }\r\n\r\n if (this.depthTexture !== null && !this.depthTexture.isReady()) {\r\n return;\r\n }\r\n\r\n DrawEffect(\r\n engine,\r\n this._effectRenderer!,\r\n effectWrapper,\r\n null, // No render target, it will render to the current buffer.\r\n (effectRenderer, _, effect) => {\r\n this.bindUniformBufferToEffect(effect);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n if (this._isSkyViewLutEnabled) {\r\n effect.setTexture(\"skyViewLut\", skyViewLut);\r\n }\r\n if (this.depthTexture !== null) {\r\n effect.setTexture(\"depthTexture\", this.depthTexture);\r\n }\r\n effectRenderer.draw();\r\n },\r\n 1, // depth to use in the compositor.\r\n this._applyApproximateTransmittance ? Constants.ALPHA_PREMULTIPLIED_PORTERDUFF : Constants.ALPHA_ONEONE,\r\n true, // depthTest\r\n false, // depthWrite\r\n Constants.ALWAYS, // depthFunction\r\n false // restoreDefaultFramebuffer\r\n );\r\n }\r\n\r\n private _disposeSkyCompositor(): void {\r\n this._skyCompositorEffectWrapper?.dispose();\r\n this._skyCompositorEffectWrapper = null;\r\n }\r\n\r\n private _disposeAerialPerspectiveCompositor(): void {\r\n this._aerialPerspectiveCompositorEffectWrapper?.dispose();\r\n this._aerialPerspectiveCompositorEffectWrapper = null;\r\n }\r\n\r\n private _disposeGlobeAtmosphereCompositor(): void {\r\n this._globeAtmosphereCompositorEffectWrapper?.dispose();\r\n this._globeAtmosphereCompositorEffectWrapper = null;\r\n }\r\n\r\n private get _isGlobalLutsReady(): boolean {\r\n return (\r\n this._hasEverRenderedMultiScatteringLut &&\r\n !!this._transmittanceLut?.hasLutData &&\r\n (!this._isDiffuseSkyIrradianceLutEnabled || this._diffuseSkyIrradianceLut!.hasLutData)\r\n );\r\n }\r\n\r\n /**\r\n * Updates the camera variables that are specific to the atmosphere.\r\n * @param camera - The camera to update the variables for.\r\n */\r\n private _updatePerCameraVariables(camera: Camera): void {\r\n const light = this._lights[0];\r\n const directionToLight = this._directionToLight.copyFrom(light.direction).scaleInPlace(-1);\r\n\r\n const properties = this._physicalProperties;\r\n const cameraAtmosphereVariables = this._cameraAtmosphereVariables;\r\n cameraAtmosphereVariables.update(camera, properties.planetRadius, properties.planetRadiusWithOffset, properties.atmosphereRadius, directionToLight, this.originHeight);\r\n\r\n this._transmittanceLut!.updateLightParameters(light, cameraAtmosphereVariables.clampedCameraRadius, cameraAtmosphereVariables.cameraGeocentricNormal);\r\n this._linearLightColor.copyFrom(light.diffuse);\r\n\r\n this.getDiffuseSkyIrradianceToRef(directionToLight, 0, cameraAtmosphereVariables.cameraGeocentricNormal, light.intensity, this._tempSceneAmbient);\r\n if (!this.isLinearSpaceLight) {\r\n this._tempSceneAmbient.toGammaSpaceToRef(this._tempSceneAmbient);\r\n }\r\n this.scene.ambientColor = this._tempSceneAmbient;\r\n\r\n this.onAfterUpdateVariablesForCameraObservable.notifyObservers(camera);\r\n }\r\n\r\n /**\r\n * Renders the lookup tables, some of which can vary per-camera.\r\n * It is expected that updatePerCameraVariables was previously called.\r\n * @param camera - The camera to render the LUTs for.\r\n */\r\n private _renderLutsForCamera(camera: Camera): void {\r\n {\r\n this.onBeforeLightVariablesUpdateObservable.notifyObservers();\r\n\r\n const light = this.lights[0];\r\n if (!this.isLinearSpaceLight) {\r\n light.diffuse = light.diffuse.toGammaSpaceToRef(light.diffuse);\r\n light.specular = light.specular.toGammaSpaceToRef(light.specular);\r\n }\r\n const intensity = light.intensity;\r\n this._lightRadianceAtCamera.set(intensity * this._linearLightColor.r, intensity * this._linearLightColor.g, intensity * this._linearLightColor.b);\r\n }\r\n\r\n if (this.uniformBuffer.useUbo) {\r\n this.updateUniformBuffer();\r\n }\r\n\r\n // Render the LUTs.\r\n const isEnabled = this.isEnabled();\r\n {\r\n this.onBeforeRenderLutsForCameraObservable.notifyObservers(camera);\r\n\r\n // If atmosphere is enabled, render the per-camera LUTs (sky view and aerial perspective).\r\n if (isEnabled && !this._transmittanceLut!.isDirty && this._hasRenderedMultiScatteringLut) {\r\n if (this._isSkyViewLutEnabled) {\r\n this._drawSkyViewLut();\r\n }\r\n\r\n if (this._isAerialPerspectiveLutEnabled) {\r\n // Only need to render aerial perspective LUT when inside the atmosphere.\r\n if (this._cameraAtmosphereVariables.clampedCameraRadius <= this._physicalProperties.atmosphereRadius) {\r\n this._drawAerialPerspectiveLut();\r\n } else {\r\n // Make sure to clear the LUT to some initial value if this would have otherwise been the first time rendering it.\r\n if (!this._aerialPerspectiveLutHasBeenRendered) {\r\n this._clearAerialPerspectiveLut();\r\n }\r\n }\r\n this._aerialPerspectiveLutHasBeenRendered = true;\r\n }\r\n }\r\n\r\n this.onAfterRenderLutsForCameraObservable.notifyObservers(camera);\r\n }\r\n }\r\n\r\n /**\r\n * Renders the lookup tables that do not depend on a camera position.\r\n */\r\n public renderGlobalLuts(): void {\r\n if (this.uniformBuffer.useUbo) {\r\n this.updateUniformBuffer();\r\n }\r\n\r\n const hasNewTransmittanceLut = this._transmittanceLut!.render();\r\n if (hasNewTransmittanceLut) {\r\n this._hasRenderedMultiScatteringLut = false;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n\r\n if (!this._transmittanceLut!.isDirty && !this._hasRenderedMultiScatteringLut) {\r\n this._multiScatteringEffectWrapper ??= CreateMultiScatteringEffectWrapper(this._engine, this.uniformBuffer, this._groundAlbedo);\r\n if (this._multiScatteringEffectWrapper?.isReady() && this._multiScatteringLutRenderTarget?.isReady()) {\r\n this._drawMultiScatteringLut();\r\n this._hasRenderedMultiScatteringLut = true;\r\n this._hasEverRenderedMultiScatteringLut = true;\r\n }\r\n }\r\n\r\n if (!this._transmittanceLut!.isDirty && this._hasRenderedMultiScatteringLut) {\r\n this._diffuseSkyIrradianceLut?.render(); // Will only render if needed.\r\n }\r\n }\r\n\r\n /**\r\n * Binds the atmosphere's uniform buffer to an {@link Effect}.\r\n * @param effect - The {@link Effect} to bind the uniform buffer to.\r\n */\r\n public bindUniformBufferToEffect(effect: Effect): void {\r\n const uniformBuffer = this.uniformBuffer;\r\n const isWGSL = effect.shaderLanguage === ShaderLanguage.WGSL;\r\n const blockName = isWGSL ? \"atmosphere\" : uniformBuffer.name;\r\n uniformBuffer.bindToEffect(effect, blockName);\r\n uniformBuffer.useUbo ? uniformBuffer.update() : this.updateUniformBuffer();\r\n }\r\n\r\n /**\r\n * Updates the values in the atmosphere's uniform buffer.\r\n */\r\n public updateUniformBuffer(): void {\r\n const physicalProperties = this._physicalProperties;\r\n const cameraAtmosphereVariables = this._cameraAtmosphereVariables;\r\n const ubo = this.uniformBuffer;\r\n\r\n ubo.updateVector3(\"peakRayleighScattering\", physicalProperties.rayleighScattering);\r\n ubo.updateFloat(\"planetRadius\", physicalProperties.planetRadius);\r\n ubo.updateVector3(\"peakMieScattering\", physicalProperties.mieScattering);\r\n ubo.updateFloat(\"atmosphereThickness\", physicalProperties.atmosphereThickness);\r\n ubo.updateVector3(\"peakMieAbsorption\", physicalProperties.mieAbsorption);\r\n ubo.updateFloat(\"planetRadiusSquared\", physicalProperties.planetRadiusSquared);\r\n ubo.updateVector3(\"peakMieExtinction\", physicalProperties.mieExtinction);\r\n ubo.updateFloat(\"atmosphereRadius\", physicalProperties.atmosphereRadius);\r\n ubo.updateVector3(\"peakOzoneAbsorption\", physicalProperties.ozoneAbsorption);\r\n ubo.updateFloat(\"atmosphereRadiusSquared\", physicalProperties.atmosphereRadiusSquared);\r\n ubo.updateFloat(\"horizonDistanceToAtmosphereEdge\", physicalProperties.horizonDistanceToAtmosphereEdge);\r\n ubo.updateFloat(\"horizonDistanceToAtmosphereEdgeSquared\", physicalProperties.horizonDistanceToAtmosphereEdgeSquared);\r\n ubo.updateFloat(\"planetRadiusWithOffset\", physicalProperties.planetRadiusWithOffset);\r\n ubo.updateFloat(\"planetRadiusOffset\", physicalProperties.planetRadiusOffset);\r\n ubo.updateFloat(\"aerialPerspectiveRadianceBias\", this._aerialPerspectiveRadianceBias);\r\n ubo.updateFloat(\"inverseAtmosphereThickness\", 1 / physicalProperties.atmosphereThickness);\r\n ubo.updateFloat(\"aerialPerspectiveTransmittanceScale\", this._aerialPerspectiveTransmittanceScale);\r\n ubo.updateMatrix(\"inverseViewProjectionWithoutTranslation\", cameraAtmosphereVariables.inverseViewProjectionMatrixWithoutTranslation);\r\n ubo.updateVector3(\"directionToLight\", this._directionToLight);\r\n ubo.updateFloat(\"multiScatteringIntensity\", this.multiScatteringIntensity);\r\n ubo.updateVector3(\"directionToLightRelativeToCameraGeocentricNormal\", cameraAtmosphereVariables.directionToLightRelativeToCameraGeocentricNormal);\r\n ubo.updateFloat(\"cameraRadius\", cameraAtmosphereVariables.cameraRadius);\r\n ubo.updateVector3(\"lightRadianceAtCamera\", this._lightRadianceAtCamera);\r\n ubo.updateFloat(\"diffuseSkyIrradianceDesaturationFactor\", this._diffuseSkyIrradianceDesaturationFactor);\r\n ubo.updateColor3(\"groundAlbedo\", this._groundAlbedo);\r\n ubo.updateFloat(\"aerialPerspectiveSaturation\", this._aerialPerspectiveSaturation);\r\n ubo.updateVector3(\"minMultiScattering\", this._minimumMultiScattering);\r\n ubo.updateFloat(\"diffuseSkyIrradianceIntensity\", this._diffuseSkyIrradianceIntensity);\r\n ubo.updateVector3(\"cameraPositionGlobal\", cameraAtmosphereVariables.cameraPositionGlobal);\r\n ubo.updateFloat(\"lightIntensity\", this.lights[0].getScaledIntensity());\r\n ubo.updateVector3(\"clampedCameraPositionGlobal\", cameraAtmosphereVariables.clampedCameraPositionGlobal);\r\n ubo.updateFloat(\"aerialPerspectiveIntensity\", this._aerialPerspectiveIntensity);\r\n ubo.updateVector3(\"cameraGeocentricNormal\", cameraAtmosphereVariables.cameraGeocentricNormal);\r\n ubo.updateFloat(\"clampedCameraRadius\", cameraAtmosphereVariables.clampedCameraRadius);\r\n ubo.updateVector3(\"cameraForward\", cameraAtmosphereVariables.cameraForward);\r\n ubo.updateFloat(\"clampedCameraHeight\", cameraAtmosphereVariables.clampedCameraHeight);\r\n ubo.updateVector3(\"cameraPosition\", cameraAtmosphereVariables.cameraPosition);\r\n ubo.updateFloat(\"cosCameraHorizonAngleFromZenith\", cameraAtmosphereVariables.cosCameraHorizonAngleFromZenith);\r\n ubo.updateVector4(\"viewport\", cameraAtmosphereVariables.viewport);\r\n ubo.updateColor3(\"additionalDiffuseSkyIrradiance\", this._additionalDiffuseSkyIrradiance);\r\n ubo.updateFloat(\"cameraHeight\", cameraAtmosphereVariables.cameraHeight);\r\n ubo.updateFloat(\"cameraNearPlane\", cameraAtmosphereVariables.cameraNearPlane);\r\n ubo.updateFloat(\"originHeight\", this._originHeight);\r\n ubo.updateFloat(\"sinCameraAtmosphereHorizonAngleFromNadir\", cameraAtmosphereVariables.sinCameraAtmosphereHorizonAngleFromNadir);\r\n ubo.updateFloat(\"atmosphereExposure\", this._exposure);\r\n }\r\n\r\n /**\r\n * Draws the aerial perspective LUT using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n private _drawAerialPerspectiveLut(): void {\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget;\r\n DrawEffect(\r\n this._engine,\r\n this._effectRenderer!,\r\n this._aerialPerspectiveLutEffectWrapper,\r\n this._aerialPerspectiveLutRenderTarget,\r\n (effectRenderer, renderTarget, effect, engine) => {\r\n this.bindUniformBufferToEffect(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n for (let layer = 0; layer < AerialPerspectiveLutLayers; layer++) {\r\n engine.bindFramebuffer(renderTarget!, undefined, undefined, undefined, true, undefined, layer);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setFloat(\"layerIdx\", layer);\r\n effectRenderer.draw();\r\n }\r\n }\r\n );\r\n }\r\n\r\n private _clearAerialPerspectiveLut(): void {\r\n const renderTarget = this._aerialPerspectiveLutRenderTarget?.renderTarget;\r\n if (renderTarget) {\r\n const engine = this._engine;\r\n const clearColor = { r: 0, g: 0, b: 0, a: 0 };\r\n for (let layer = 0; layer < AerialPerspectiveLutLayers; layer++) {\r\n engine.bindFramebuffer(renderTarget, undefined, undefined, undefined, true, undefined, layer);\r\n engine.clear(clearColor, true, false, false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Draws the sky view LUT using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n private _drawSkyViewLut(): void {\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n DrawEffect(this._engine, this._effectRenderer!, this._skyViewLutEffectWrapper, this._skyViewLutRenderTarget, (effectRenderer, renderTarget, effect, engine) => {\r\n this.bindUniformBufferToEffect(effect);\r\n engine.bindFramebuffer(renderTarget!, undefined, undefined, undefined, true);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n effectRenderer.draw();\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Creates an {@link EffectWrapper} with the given parameters.\r\n * @param engine - The engine to use.\r\n * @param name - The name of the effect wrapper.\r\n * @param fragmentShader - The fragment shader source.\r\n * @param uniformNames - The uniform names to use.\r\n * @param samplerNames - The sampler names to use.\r\n * @param uniformBuffers - The uniform buffers to use.\r\n * @param defineNames - Array of define names to prepend with \"#define \".\r\n * @param useWebGPU - Whether to use WebGPU shaders.\r\n * @param extraInitializations - Optional extra initializations callback for loading shaders.\r\n * @returns The effect wrapper.\r\n */\r\nconst CreateEffectWrapper = (\r\n engine: AbstractEngine,\r\n name: string,\r\n fragmentShader: string,\r\n uniformNames?: string[],\r\n samplerNames?: string[],\r\n uniformBuffers?: string[],\r\n defineNames?: string[],\r\n useWebGPU = false,\r\n extraInitializations?: (useWebGPU: boolean, list: Promise<any>[]) => void\r\n): EffectWrapper => {\r\n const defines = defineNames?.map((defineName) => `#define ${defineName}`) ?? [];\r\n return new EffectWrapper({\r\n engine,\r\n name,\r\n vertexShader: \"fullscreenTriangle\",\r\n fragmentShader,\r\n attributeNames: [\"position\"],\r\n uniformNames,\r\n uniformBuffers,\r\n samplerNames,\r\n defines,\r\n useShaderStore: true,\r\n shaderLanguage: useWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations,\r\n });\r\n};\r\n\r\nconst CreateMultiScatteringEffectWrapper = (engine: AbstractEngine, uniformBuffer: UniformBuffer, groundAlbedo: Color3): EffectWrapper => {\r\n const name = \"atmo-multiScattering\";\r\n const useUbo = uniformBuffer.useUbo;\r\n const useWebGPU = engine.isWebGPU && !EffectWrapper.ForceGLSL;\r\n const uboName = useWebGPU ? \"atmosphere\" : uniformBuffer.name;\r\n\r\n const defines = [\"#define POSITION_VEC2\"];\r\n if (!groundAlbedo.equals(Color3.BlackReadOnly)) {\r\n defines.push(\"#define USE_GROUND_ALBEDO\");\r\n }\r\n\r\n return new EffectWrapper({\r\n engine,\r\n name,\r\n vertexShader: \"fullscreenTriangle\",\r\n fragmentShader: \"multiScattering\",\r\n attributeNames: [\"position\"],\r\n uniformNames: [\"depth\", ...(useUbo ? [] : uniformBuffer.getUniformNames())],\r\n uniformBuffers: useUbo ? [uboName] : [],\r\n samplerNames: [\"transmittanceLut\"],\r\n defines,\r\n useShaderStore: true,\r\n shaderLanguage: useWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (_, list) => {\r\n list.push(\r\n ...(useWebGPU\r\n ? [import(\"./ShadersWGSL/fullscreenTriangle.vertex\"), import(\"./ShadersWGSL/multiScattering.fragment\")]\r\n : [import(\"./Shaders/fullscreenTriangle.vertex\"), import(\"./Shaders/multiScattering.fragment\")])\r\n );\r\n },\r\n });\r\n};\r\n\r\nconst CreateRenderTargetTexture = (\r\n name: string,\r\n size: number | { width: number; height: number; layers?: number },\r\n scene: Scene,\r\n options?: RenderTargetTextureOptions\r\n): RenderTargetTexture => {\r\n const caps = scene.getEngine().getCaps();\r\n const textureType = caps.textureHalfFloatRender\r\n ? Constants.TEXTURETYPE_HALF_FLOAT\r\n : caps.textureFloatRender\r\n ? Constants.TEXTURETYPE_FLOAT\r\n : Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n const rtOptions: RenderTargetTextureOptions = {\r\n generateMipMaps: false,\r\n generateDepthBuffer: false,\r\n generateStencilBuffer: false,\r\n gammaSpace: false,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n type: textureType,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n ...options,\r\n };\r\n const renderTarget = new RenderTargetTexture(name, size, scene, rtOptions);\r\n\r\n renderTarget.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n renderTarget.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n renderTarget.anisotropicFilteringLevel = 1;\r\n renderTarget.skipInitialClear = true;\r\n return renderTarget;\r\n};\r\n\r\n/**\r\n * Common setup and teardown for drawing LUTs or composition passes.\r\n * @param engine - The engine to use.\r\n * @param effectRenderer - The effect renderer to use.\r\n * @param effectWrapper - The effect wrapper to use.\r\n * @param renderTarget - The render target.\r\n * @param drawCallback - Callback function that performs the drawing.\r\n * @param depth - The depth value to set in the effect.\r\n * @param alphaMode - The alpha mode to set before drawing.\r\n * @param depthTest - Whether to enable depth testing.\r\n * @param depthWrite - Optional depth write state to set before drawing.\r\n * @param depthFunction - The depth function to set before drawing.\r\n * @param restoreDefaultFramebuffer - Whether to restore the default framebuffer after drawing.\r\n */\r\nconst DrawEffect = (\r\n engine: AbstractEngine,\r\n effectRenderer: EffectRenderer,\r\n effectWrapper: Nullable<EffectWrapper>,\r\n renderTarget: Nullable<RenderTargetTexture>,\r\n drawCallback: (effectRenderer: EffectRenderer, renderTarget: Nullable<RenderTargetWrapper>, effect: Effect, engine: AbstractEngine) => void,\r\n depth = 0,\r\n alphaMode = Constants.ALPHA_DISABLE,\r\n depthTest = true,\r\n depthWrite?: boolean,\r\n depthFunction = Constants.LEQUAL,\r\n restoreDefaultFramebuffer = true\r\n): void => {\r\n if ((renderTarget !== null && !renderTarget.isReady()) || !effectWrapper?.isReady()) {\r\n return;\r\n }\r\n\r\n effectRenderer.saveStates();\r\n\r\n // Set additional depth/stencil states before calling applyEffectWrapper.\r\n const currentDepthWrite = engine.getDepthWrite();\r\n if (depthWrite !== undefined) {\r\n engine.setDepthWrite(depthWrite);\r\n }\r\n const currentDepthFunction = engine.getDepthFunction();\r\n engine.setDepthFunction(depthFunction);\r\n\r\n const currentAlphaMode = engine.getAlphaMode();\r\n engine.setAlphaMode(alphaMode, true);\r\n\r\n const currentCull = engine.depthCullingState.cull;\r\n\r\n effectRenderer.setViewport();\r\n effectRenderer.applyEffectWrapper(effectWrapper, depthTest); // Note, stencil is false by default.\r\n\r\n engine.depthCullingState.cull = false;\r\n\r\n const effect = effectWrapper.effect;\r\n\r\n effect.setFloat(\"depth\", depth);\r\n\r\n // Call the specific drawing logic.\r\n drawCallback(effectRenderer, renderTarget?.renderTarget!, effect, engine);\r\n\r\n // Restore state (order matters!)\r\n engine.depthCullingState.cull = currentCull;\r\n engine.setAlphaMode(currentAlphaMode, true);\r\n if (currentDepthWrite !== undefined) {\r\n engine.setDepthWrite(currentDepthWrite);\r\n }\r\n if (currentDepthFunction) {\r\n engine.setDepthFunction(currentDepthFunction);\r\n }\r\n effectRenderer.restoreStates();\r\n\r\n // And restore the default framebuffer.\r\n if (restoreDefaultFramebuffer) {\r\n engine.restoreDefaultFramebuffer();\r\n }\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the sky compositor.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @param isSkyViewLutEnabled - Whether the sky view LUT is enabled.\r\n * @param isLinearSpaceComposition - Whether composition is in linear space.\r\n * @param applyApproximateTransmittance - Whether to apply approximate transmittance.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateSkyCompositorEffectWrapper = (\r\n engine: AbstractEngine,\r\n uniformBuffer: UniformBuffer,\r\n isSkyViewLutEnabled: boolean,\r\n isLinearSpaceComposition: boolean,\r\n applyApproximateTransmittance: boolean\r\n): EffectWrapper => {\r\n const useUbo = uniformBuffer.useUbo;\r\n const useWebGPU = engine.isWebGPU && !EffectWrapper.ForceGLSL;\r\n const uboName = useWebGPU ? \"atmosphere\" : uniformBuffer.name;\r\n const defines = [\"POSITION_VEC2\", \"COMPUTE_WORLD_RAY\"];\r\n if (isSkyViewLutEnabled) {\r\n defines.push(\"USE_SKY_VIEW_LUT\");\r\n }\r\n if (!isLinearSpaceComposition) {\r\n defines.push(\"OUTPUT_TO_SRGB\");\r\n }\r\n if (applyApproximateTransmittance) {\r\n defines.push(\"APPLY_TRANSMITTANCE_BLENDING\");\r\n }\r\n const textures = isSkyViewLutEnabled ? [\"skyViewLut\"] : [\"transmittanceLut\", \"multiScatteringLut\"];\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-skyCompositor\",\r\n \"compositeSky\",\r\n [\"depth\", ...(useUbo ? [] : uniformBuffer.getUniformNames())],\r\n textures,\r\n useUbo ? [uboName] : [],\r\n defines,\r\n useWebGPU,\r\n (_, list) => {\r\n list.push(\r\n ...(useWebGPU\r\n ? [import(\"./ShadersWGSL/fullscreenTriangle.vertex\"), import(\"./ShadersWGSL/compositeSky.fragment\")]\r\n : [import(\"./Shaders/fullscreenTriangle.vertex\"), import(\"./Shaders/compositeSky.fragment\")])\r\n );\r\n }\r\n );\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the aerial perspective LUT.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateAerialPerspectiveEffectWrapper = (engine: AbstractEngine, uniformBuffer: UniformBuffer): EffectWrapper => {\r\n const useWebGPU = engine.isWebGPU && !EffectWrapper.ForceGLSL;\r\n const uboName = useWebGPU ? \"atmosphere\" : uniformBuffer.name;\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-aerialPerspective\",\r\n \"aerialPerspective\",\r\n [\"layerIdx\", ...(uniformBuffer.useUbo ? [] : uniformBuffer.getUniformNames())],\r\n [\"transmittanceLut\", \"multiScatteringLut\"],\r\n uniformBuffer.useUbo ? [uboName] : [],\r\n [\"POSITION_VEC2\", \"COMPUTE_WORLD_RAY\"],\r\n useWebGPU,\r\n (_, list) => {\r\n list.push(\r\n ...(useWebGPU\r\n ? [import(\"./ShadersWGSL/fullscreenTriangle.vertex\"), import(\"./ShadersWGSL/aerialPerspective.fragment\")]\r\n : [import(\"./Shaders/fullscreenTriangle.vertex\"), import(\"./Shaders/aerialPerspective.fragment\")])\r\n );\r\n }\r\n );\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the aerial perspective compositor.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer.\r\n * @param isAerialPerspectiveLutEnabled - Whether the aerial perspective LUT is enabled.\r\n * @param isSkyViewLutEnabled - Whether the sky view LUT is enabled.\r\n * @param isLinearSpaceComposition - Whether composition is in linear space.\r\n * @param applyApproximateTransmittance - Whether to apply approximate transmittance.\r\n * @param aerialPerspectiveIntensity - The aerial perspective intensity.\r\n * @param aerialPerspectiveRadianceBias - The aerial perspective radiance bias.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateAerialPerspectiveCompositorEffectWrapper = (\r\n engine: AbstractEngine,\r\n uniformBuffer: UniformBuffer,\r\n isAerialPerspectiveLutEnabled: boolean,\r\n isSkyViewLutEnabled: boolean,\r\n isLinearSpaceComposition: boolean,\r\n applyApproximateTransmittance: boolean,\r\n aerialPerspectiveIntensity: number,\r\n aerialPerspectiveRadianceBias: number\r\n): EffectWrapper => {\r\n const useUbo = uniformBuffer.useUbo;\r\n const useWebGPU = engine.isWebGPU && !EffectWrapper.ForceGLSL;\r\n const uboName = useWebGPU ? \"atmosphere\" : uniformBuffer.name;\r\n const defines = [\"POSITION_VEC2\", \"COMPUTE_WORLD_RAY\"];\r\n if (isAerialPerspectiveLutEnabled) {\r\n defines.push(\"USE_AERIAL_PERSPECTIVE_LUT\");\r\n }\r\n if (isSkyViewLutEnabled) {\r\n defines.push(\"USE_SKY_VIEW_LUT\");\r\n }\r\n if (aerialPerspectiveIntensity !== 1) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_INTENSITY\");\r\n }\r\n if (!isLinearSpaceComposition) {\r\n defines.push(\"OUTPUT_TO_SRGB\");\r\n }\r\n if (applyApproximateTransmittance) {\r\n defines.push(\"APPLY_TRANSMITTANCE_BLENDING\");\r\n }\r\n if (aerialPerspectiveRadianceBias !== 0.0) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS\");\r\n }\r\n\r\n const samplers = [\"transmittanceLut\", \"multiScatteringLut\", \"depthTexture\"];\r\n if (isSkyViewLutEnabled) {\r\n samplers.push(\"skyViewLut\");\r\n }\r\n if (isAerialPerspectiveLutEnabled) {\r\n samplers.push(\"aerialPerspectiveLut\");\r\n }\r\n\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-aerialPerspectiveCompositor\",\r\n \"compositeAerialPerspective\",\r\n [\"depth\", ...(useUbo ? [] : uniformBuffer.getUniformNames())],\r\n samplers,\r\n useUbo ? [uboName] : [],\r\n defines,\r\n useWebGPU,\r\n (_, list) => {\r\n list.push(\r\n ...(useWebGPU\r\n ? [import(\"./ShadersWGSL/fullscreenTriangle.vertex\"), import(\"./ShadersWGSL/compositeAerialPerspective.fragment\")]\r\n : [import(\"./Shaders/fullscreenTriangle.vertex\"), import(\"./Shaders/compositeAerialPerspective.fragment\")])\r\n );\r\n }\r\n );\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the globe atmosphere compositor.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @param isSkyViewLutEnabled - Whether the sky view LUT is enabled.\r\n * @param isLinearSpaceComposition - Whether composition is in linear space.\r\n * @param applyApproximateTransmittance - Whether to apply approximate transmittance.\r\n * @param aerialPerspectiveIntensity - The aerial perspective intensity.\r\n * @param aerialPerspectiveRadianceBias - The aerial perspective radiance bias.\r\n * @param hasDepthTexture - Whether a depth texture is available.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateGlobeAtmosphereCompositorEffectWrapper = (\r\n engine: AbstractEngine,\r\n uniformBuffer: UniformBuffer,\r\n isSkyViewLutEnabled: boolean,\r\n isLinearSpaceComposition: boolean,\r\n applyApproximateTransmittance: boolean,\r\n aerialPerspectiveIntensity: number,\r\n aerialPerspectiveRadianceBias: number,\r\n hasDepthTexture: boolean\r\n): EffectWrapper => {\r\n const useUbo = uniformBuffer.useUbo;\r\n const useWebGPU = engine.isWebGPU && !EffectWrapper.ForceGLSL;\r\n const uboName = useWebGPU ? \"atmosphere\" : uniformBuffer.name;\r\n const defines = [\"POSITION_VEC2\", \"COMPUTE_WORLD_RAY\"];\r\n if (isSkyViewLutEnabled) {\r\n defines.push(\"USE_SKY_VIEW_LUT\");\r\n }\r\n if (aerialPerspectiveIntensity !== 1) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_INTENSITY\");\r\n }\r\n if (!isLinearSpaceComposition) {\r\n defines.push(\"OUTPUT_TO_SRGB\");\r\n }\r\n if (hasDepthTexture) {\r\n defines.push(\"HAS_DEPTH_TEXTURE\");\r\n }\r\n if (applyApproximateTransmittance) {\r\n defines.push(\"APPLY_TRANSMITTANCE_BLENDING\");\r\n }\r\n if (aerialPerspectiveRadianceBias !== 0.0) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS\");\r\n }\r\n\r\n const samplers = [\"transmittanceLut\", \"multiScatteringLut\"];\r\n if (isSkyViewLutEnabled) {\r\n samplers.push(\"skyViewLut\");\r\n }\r\n if (hasDepthTexture) {\r\n samplers.push(\"depthTexture\");\r\n }\r\n\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-globeAtmosphereCompositor\",\r\n \"compositeGlobeAtmosphere\",\r\n [\"depth\", ...(useUbo ? [] : uniformBuffer.getUniformNames())],\r\n samplers,\r\n useUbo ? [uboName] : [],\r\n defines,\r\n useWebGPU,\r\n (_, list) => {\r\n list.push(\r\n ...(useWebGPU\r\n ? [import(\"./ShadersWGSL/fullscreenTriangle.vertex\"), import(\"./ShadersWGSL/compositeGlobeAtmosphere.fragment\")]\r\n : [import(\"./Shaders/fullscreenTriangle.vertex\"), import(\"./Shaders/compositeGlobeAtmosphere.fragment\")])\r\n );\r\n }\r\n );\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the sky view LUT.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateSkyViewEffectWrapper = (engine: AbstractEngine, uniformBuffer: UniformBuffer): EffectWrapper => {\r\n const useWebGPU = engine.isWebGPU && !EffectWrapper.ForceGLSL;\r\n const uboName = useWebGPU ? \"atmosphere\" : uniformBuffer.name;\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-skyView\",\r\n \"skyView\",\r\n [\"depth\", ...(uniformBuffer.useUbo ? [] : uniformBuffer.getUniformNames())],\r\n [\"transmittanceLut\", \"multiScatteringLut\"],\r\n uniformBuffer.useUbo ? [uboName] : [],\r\n [\"POSITION_VEC2\"],\r\n useWebGPU,\r\n (_, list) => {\r\n list.push(\r\n ...(useWebGPU\r\n ? [import(\"./ShadersWGSL/fullscreenTriangle.vertex\"), import(\"./ShadersWGSL/skyView.fragment\")]\r\n : [import(\"./Shaders/fullscreenTriangle.vertex\"), import(\"./Shaders/skyView.fragment\")])\r\n );\r\n }\r\n );\r\n};\r\n"]}
|
|
@@ -89,15 +89,17 @@ export class AtmospherePBRMaterialPlugin extends MaterialPluginBase {
|
|
|
89
89
|
* @override
|
|
90
90
|
*/
|
|
91
91
|
isReadyForSubMesh() {
|
|
92
|
-
let isReady = true;
|
|
93
92
|
const atmosphere = this._atmosphere;
|
|
93
|
+
if (!atmosphere.transmittanceLut?.hasLutData || (atmosphere.diffuseSkyIrradianceLut && !atmosphere.diffuseSkyIrradianceLut.hasLutData)) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
94
96
|
if (this._isAerialPerspectiveEnabled && atmosphere.isAerialPerspectiveLutEnabled) {
|
|
95
97
|
const aerialPerspectiveLutRenderTarget = atmosphere.aerialPerspectiveLutRenderTarget;
|
|
96
|
-
|
|
98
|
+
if (!aerialPerspectiveLutRenderTarget?.isReady()) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
97
101
|
}
|
|
98
|
-
|
|
99
|
-
isReady = isReady && !!transmittanceLutRenderTarget?.isReady();
|
|
100
|
-
return isReady;
|
|
102
|
+
return true;
|
|
101
103
|
}
|
|
102
104
|
/**
|
|
103
105
|
* @override
|
|
@@ -187,6 +189,7 @@ export class AtmospherePBRMaterialPlugin extends MaterialPluginBase {
|
|
|
187
189
|
CUSTOM_FRAGMENT_DEFINITIONS: this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled
|
|
188
190
|
? `uniform sampler2D transmittanceLut;\r\nprecision highp sampler2DArray;\r\nuniform sampler2DArray aerialPerspectiveLut;\r\n${atmosphereImportSnippet}\r\n#include<atmosphereFunctions>`
|
|
189
191
|
: `uniform sampler2D transmittanceLut;\r\n${atmosphereImportSnippet}\r\n#include<atmosphereFunctions>`,
|
|
192
|
+
// Provides the direct light contribution, accounting for transmittance.
|
|
190
193
|
CUSTOM_LIGHT0_COLOR: `
|
|
191
194
|
{
|
|
192
195
|
vec3 positionGlobal = 0.001 * vPositionW + ${OriginOffsetUniformName};
|
|
@@ -197,6 +200,9 @@ export class AtmospherePBRMaterialPlugin extends MaterialPluginBase {
|
|
|
197
200
|
diffuse0 = lightIntensity * sampleTransmittanceLut(transmittanceLut, positionRadius, cosAngleLightToZenith);
|
|
198
201
|
}
|
|
199
202
|
`,
|
|
203
|
+
// Approximates the environment contribution from the atmosphere.
|
|
204
|
+
// Note there are some tuned constants used below to modify the environment intensity.
|
|
205
|
+
// A more physically accurate approach could be considered, and/or uniforms added to customize.
|
|
200
206
|
CUSTOM_REFLECTION: `
|
|
201
207
|
{
|
|
202
208
|
vec3 positionGlobal = 0.001 * vPositionW + ${OriginOffsetUniformName};
|
|
@@ -253,6 +259,7 @@ export class AtmospherePBRMaterialPlugin extends MaterialPluginBase {
|
|
|
253
259
|
CUSTOM_FRAGMENT_DEFINITIONS: this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled
|
|
254
260
|
? `var transmittanceLutSampler: sampler;\r\nvar transmittanceLut: texture_2d<f32>;\r\nvar aerialPerspectiveLutSampler: sampler;\r\nvar aerialPerspectiveLut: texture_2d_array<f32>;\r\n${atmosphereImportSnippet}\r\n#include<atmosphereFunctions>`
|
|
255
261
|
: `var transmittanceLutSampler: sampler;\r\nvar transmittanceLut: texture_2d<f32>;\r\n${atmosphereImportSnippet}\r\n#include<atmosphereFunctions>`,
|
|
262
|
+
// Provides the direct light contribution, accounting for transmittance.
|
|
256
263
|
CUSTOM_LIGHT0_COLOR: `
|
|
257
264
|
{
|
|
258
265
|
var positionGlobal = 0.001 * fragmentInputs.vPositionW + uniforms.${OriginOffsetUniformName};
|
|
@@ -263,6 +270,9 @@ export class AtmospherePBRMaterialPlugin extends MaterialPluginBase {
|
|
|
263
270
|
diffuse0 = atmosphere.lightIntensity * sampleTransmittanceLut(transmittanceLut, positionRadius, cosAngleLightToZenith);
|
|
264
271
|
}
|
|
265
272
|
`,
|
|
273
|
+
// Approximates the environment contribution from the atmosphere.
|
|
274
|
+
// Note there are some tuned constants used below to modify the environment intensity.
|
|
275
|
+
// A more physically accurate approach could be considered, and/or uniforms added to customize.
|
|
266
276
|
CUSTOM_REFLECTION: `
|
|
267
277
|
{
|
|
268
278
|
var positionGlobal = 0.001 * fragmentInputs.vPositionW + uniforms.${OriginOffsetUniformName};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atmospherePBRMaterialPlugin.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmospherePBRMaterialPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// Licensed under the MIT License.\r\n\r\nimport type { Atmosphere } from \"./atmosphere\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { Vector3FromFloatsToRef, Vector3ScaleToRef } from \"core/Maths/math.vector.functions\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport \"./ShadersWGSL/ShadersInclude/atmosphereFunctions\";\r\nimport \"./ShadersWGSL/ShadersInclude/atmosphereUboDeclaration\";\r\n\r\nclass AtmospherePBRMaterialDefines extends MaterialDefines {\r\n public USE_AERIAL_PERSPECTIVE_LUT: boolean;\r\n public APPLY_AERIAL_PERSPECTIVE_INTENSITY = false;\r\n public APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS = false;\r\n public SAMPLE_TRANSMITTANCE_LUT = true;\r\n public EXCLUDE_RAY_MARCHING_FUNCTIONS = true;\r\n\r\n /**\r\n * Constructs the {@link AtmospherePBRMaterialDefines}.\r\n * @param useAerialPerspectiveLut - Whether to use the aerial perspective LUT.\r\n */\r\n constructor(useAerialPerspectiveLut: boolean) {\r\n super();\r\n this.USE_AERIAL_PERSPECTIVE_LUT = useAerialPerspectiveLut;\r\n }\r\n}\r\n\r\nconst OriginOffsetUniformName = \"originOffsetKm\";\r\nconst InverseViewportSizeUniformName = \"inverseViewportSize\";\r\n\r\nconst UboArray = [\r\n { name: OriginOffsetUniformName, size: 3, type: \"vec3\" },\r\n { name: \"_atmoPbrPadding1\", size: 1, type: \"float\" },\r\n { name: InverseViewportSizeUniformName, size: 2, type: \"vec2\" },\r\n];\r\nconst MakeUniforms = (atmosphere: Atmosphere) => ({\r\n ubo: UboArray,\r\n fragment: `uniform vec2 ${InverseViewportSizeUniformName};\\nuniform vec3 ${OriginOffsetUniformName};\\n`,\r\n externalUniforms: atmosphere.uniformBuffer.getUniformNames(),\r\n});\r\n\r\nconst PluginName = \"AtmospherePBRMaterialPlugin\";\r\nconst PluginPriority = 600;\r\nconst OriginOffsetKm = { x: 0, y: 0, z: 0 };\r\n\r\n/**\r\n * Adds shading logic to a PBRMaterial that provides radiance, diffuse sky irradiance, and aerial perspective from the atmosphere.\r\n */\r\nexport class AtmospherePBRMaterialPlugin extends MaterialPluginBase {\r\n /**\r\n * Constructs the {@link AtmospherePBRMaterialPlugin}.\r\n * @param material - The material to apply the plugin to.\r\n * @param _atmosphere - The atmosphere to use for shading.\r\n * @param _isAerialPerspectiveEnabled - Whether to apply aerial perspective.\r\n */\r\n constructor(\r\n material: Material,\r\n private readonly _atmosphere: Atmosphere,\r\n private readonly _isAerialPerspectiveEnabled = false\r\n ) {\r\n super(\r\n material,\r\n PluginName,\r\n PluginPriority,\r\n {\r\n USE_CUSTOM_REFLECTION: _atmosphere.diffuseSkyIrradianceLut !== null,\r\n CUSTOM_FRAGMENT_BEFORE_FOG: _isAerialPerspectiveEnabled,\r\n USE_AERIAL_PERSPECTIVE_LUT: _isAerialPerspectiveEnabled && _atmosphere.isAerialPerspectiveLutEnabled,\r\n APPLY_AERIAL_PERSPECTIVE_INTENSITY: _isAerialPerspectiveEnabled && _atmosphere.aerialPerspectiveIntensity !== 1.0,\r\n APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS: _isAerialPerspectiveEnabled && _atmosphere.aerialPerspectiveRadianceBias !== 0.0,\r\n SAMPLE_TRANSMITTANCE_LUT: true,\r\n EXCLUDE_RAY_MARCHING_FUNCTIONS: true,\r\n },\r\n false, // addPluginToList -- false because we need to control when this is added to the list\r\n true, // enable\r\n true // resolveIncludes\r\n );\r\n\r\n this.doNotSerialize = true;\r\n\r\n // This calls `getCode` so we need to do this after having initialized the class fields.\r\n this._pluginManager._addPlugin(this);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getUniformBuffersNames(_ubos: string[]): void {\r\n const uniformBuffer = this._atmosphere.uniformBuffer;\r\n if (uniformBuffer.useUbo) {\r\n const uboName = this._material.shaderLanguage === ShaderLanguage.WGSL ? \"atmosphere\" : uniformBuffer.name;\r\n _ubos.push(uboName);\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getUniforms() {\r\n return MakeUniforms(this._atmosphere);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override isReadyForSubMesh(): boolean {\r\n let isReady = true;\r\n const atmosphere = this._atmosphere;\r\n if (this._isAerialPerspectiveEnabled && atmosphere.isAerialPerspectiveLutEnabled) {\r\n const aerialPerspectiveLutRenderTarget = atmosphere.aerialPerspectiveLutRenderTarget;\r\n isReady = isReady && !!aerialPerspectiveLutRenderTarget?.isReady();\r\n }\r\n const transmittanceLutRenderTarget = atmosphere.transmittanceLut?.renderTarget ?? null;\r\n isReady = isReady && !!transmittanceLutRenderTarget?.isReady();\r\n return isReady;\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getActiveTextures(_activeTextures: BaseTexture[]): void {\r\n const atmosphere = this._atmosphere;\r\n if (this._isAerialPerspectiveEnabled && atmosphere.isAerialPerspectiveLutEnabled) {\r\n const aerialPerspectiveLutRenderTarget = atmosphere.aerialPerspectiveLutRenderTarget;\r\n if (aerialPerspectiveLutRenderTarget) {\r\n _activeTextures.push(aerialPerspectiveLutRenderTarget);\r\n }\r\n }\r\n\r\n const transmittanceLutRenderTarget = atmosphere.transmittanceLut?.renderTarget ?? null;\r\n if (transmittanceLutRenderTarget) {\r\n _activeTextures.push(transmittanceLutRenderTarget);\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer): void {\r\n const atmosphere = this._atmosphere;\r\n const scene = atmosphere.scene;\r\n const engine = scene.getEngine();\r\n\r\n // Bind the atmosphere's uniform buffer to the effect.\r\n const effect = uniformBuffer.currentEffect;\r\n if (effect) {\r\n this._atmosphere.bindUniformBufferToEffect(effect);\r\n }\r\n\r\n // Need the offset to apply which will take a world space position and convert it to a global space position in the atmosphere.\r\n // If floating origin mode is enabled, that offset is the floating origin offset.\r\n // If not, it's an offset up the Y-axis by the planet radius.\r\n uniformBuffer.updateVector3(\r\n OriginOffsetUniformName,\r\n scene.floatingOriginMode\r\n ? Vector3ScaleToRef(scene.floatingOriginOffset, 0.001, OriginOffsetKm) // Convert to kilometers\r\n : Vector3FromFloatsToRef(0, atmosphere.physicalProperties.planetRadius, 0, OriginOffsetKm) // planetRadius is already in kilometers\r\n );\r\n\r\n const width = engine.getRenderWidth();\r\n const height = engine.getRenderHeight();\r\n uniformBuffer.updateFloat2(InverseViewportSizeUniformName, 1.0 / width, 1.0 / height);\r\n\r\n if (this._isAerialPerspectiveEnabled && atmosphere.isAerialPerspectiveLutEnabled) {\r\n const aerialPerspectiveLutRenderTarget = atmosphere.aerialPerspectiveLutRenderTarget;\r\n uniformBuffer.setTexture(\"aerialPerspectiveLut\", aerialPerspectiveLutRenderTarget);\r\n }\r\n const transmittanceLutRenderTarget = atmosphere.transmittanceLut?.renderTarget ?? null;\r\n uniformBuffer.setTexture(\"transmittanceLut\", transmittanceLutRenderTarget);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override prepareDefines(defines: AtmospherePBRMaterialDefines): void {\r\n const lastUseAerialPerspectiveLut = defines.USE_AERIAL_PERSPECTIVE_LUT;\r\n const lastApplyAerialPerspectiveIntensity = defines.APPLY_AERIAL_PERSPECTIVE_INTENSITY;\r\n const lastApplyAerialPerspectiveRadianceBias = defines.APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS;\r\n defines.USE_AERIAL_PERSPECTIVE_LUT = this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled;\r\n defines.APPLY_AERIAL_PERSPECTIVE_INTENSITY = this._isAerialPerspectiveEnabled && this._atmosphere.aerialPerspectiveIntensity !== 1.0;\r\n defines.APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS = this._isAerialPerspectiveEnabled && this._atmosphere.aerialPerspectiveRadianceBias !== 0.0;\r\n if (\r\n lastUseAerialPerspectiveLut !== defines.USE_AERIAL_PERSPECTIVE_LUT ||\r\n lastApplyAerialPerspectiveIntensity !== defines.APPLY_AERIAL_PERSPECTIVE_INTENSITY ||\r\n lastApplyAerialPerspectiveRadianceBias !== defines.APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS\r\n ) {\r\n defines.markAllAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getSamplers(samplers: string[]): void {\r\n samplers.push(\"transmittanceLut\");\r\n if (this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled) {\r\n samplers.push(\"aerialPerspectiveLut\");\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage): Nullable<Record<string, string>> {\r\n // Assumed inputs are light0, vPositionW, normalW.\r\n // Only works for directional lights.\r\n if (shaderType !== \"fragment\") {\r\n return null;\r\n }\r\n\r\n const useUbo = this._atmosphere.scene.getEngine().supportsUniformBuffers;\r\n const directionToLightSnippet = useUbo ? \"-light0.vLightData.xyz\" : \"-vLightData0.xyz\";\r\n\r\n const useAtmosphereUbo = shaderLanguage === ShaderLanguage.WGSL || this._atmosphere.uniformBuffer.useUbo;\r\n const atmosphereImportSnippet = useAtmosphereUbo ? \"#include<atmosphereUboDeclaration>\" : \"#include<atmosphereFragmentDeclaration>\";\r\n\r\n if (shaderLanguage === ShaderLanguage.GLSL) {\r\n return {\r\n CUSTOM_FRAGMENT_DEFINITIONS:\r\n this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled\r\n ? `uniform sampler2D transmittanceLut;\\r\\nprecision highp sampler2DArray;\\r\\nuniform sampler2DArray aerialPerspectiveLut;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`\r\n : `uniform sampler2D transmittanceLut;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`,\r\n CUSTOM_LIGHT0_COLOR: `\r\n {\r\n vec3 positionGlobal = 0.001 * vPositionW + ${OriginOffsetUniformName};\r\n float positionRadius = length(positionGlobal);\r\n vec3 geocentricNormal = positionGlobal / positionRadius;\r\n vec3 directionToLight = ${directionToLightSnippet};\r\n float cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n diffuse0 = lightIntensity * sampleTransmittanceLut(transmittanceLut, positionRadius, cosAngleLightToZenith);\r\n }\r\n`,\r\n CUSTOM_REFLECTION: `\r\n {\r\n vec3 positionGlobal = 0.001 * vPositionW + ${OriginOffsetUniformName};\r\n float positionRadius = length(positionGlobal);\r\n vec3 geocentricNormal = positionGlobal / positionRadius;\r\n\r\n vec3 directionToLight = ${directionToLightSnippet};\r\n float cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n\r\n vec2 uv = vec2(0.5 + 0.5 * cosAngleLightToZenith, (positionRadius - planetRadius) / atmosphereThickness);\r\n float irradianceScaleT = 0.5 * dot(normalW, geocentricNormal) + 0.5;\r\n float irradianceScale = ((-0.6652 * irradianceScaleT) + 1.5927) * irradianceScaleT + 0.1023;\r\n vec3 environmentIrradiance = lightIntensity * sampleReflection(irradianceSampler, uv).rgb;\r\n\r\n // Add a contribution here to estimate indirect lighting.\r\n const float r = 0.2;\r\n float indirect = getLuminance(environmentIrradiance) / max(0.00001, 1. - r);\r\n environmentIrradiance *= irradianceScale;\r\n environmentIrradiance += indirect;\r\n\r\n environmentIrradiance += additionalDiffuseSkyIrradiance;\r\n\r\n const float diffuseBrdf = 1. / PI;\r\n environmentIrradiance *= diffuseBrdf * diffuseSkyIrradianceIntensity;\r\n\r\n reflectionOut.environmentIrradiance = environmentIrradiance;\r\n reflectionOut.environmentRadiance.rgb = reflectionOut.environmentIrradiance;\r\n }\r\n`,\r\n // TODO: Support full ray marching if USE_AERIAL_PERSPECTIVE_LUT is disabled.\r\n CUSTOM_FRAGMENT_BEFORE_FOG: `\r\n #if USE_AERIAL_PERSPECTIVE_LUT\r\n {\r\n float distanceFromCameraKm = 0.001 * distance(vEyePosition.xyz, vPositionW);\r\n vec4 aerialPerspective = vec4(0.);\r\n if (sampleAerialPerspectiveLut(\r\n gl_FragCoord.xy * ${InverseViewportSizeUniformName},\r\n true,\r\n distanceFromCameraKm,\r\n NumAerialPerspectiveLutLayers,\r\n AerialPerspectiveLutKMPerSlice,\r\n AerialPerspectiveLutRangeKM,\r\n aerialPerspective)) {\r\n finalColor = aerialPerspective + (1. - aerialPerspective.a) * finalColor;\r\n }\r\n }\r\n #endif\r\n`,\r\n };\r\n } else {\r\n // WGSL\r\n return {\r\n CUSTOM_FRAGMENT_DEFINITIONS:\r\n this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled\r\n ? `var transmittanceLutSampler: sampler;\\r\\nvar transmittanceLut: texture_2d<f32>;\\r\\nvar aerialPerspectiveLutSampler: sampler;\\r\\nvar aerialPerspectiveLut: texture_2d_array<f32>;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`\r\n : `var transmittanceLutSampler: sampler;\\r\\nvar transmittanceLut: texture_2d<f32>;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`,\r\n CUSTOM_LIGHT0_COLOR: `\r\n {\r\n var positionGlobal = 0.001 * fragmentInputs.vPositionW + uniforms.${OriginOffsetUniformName};\r\n var positionRadius = length(positionGlobal);\r\n var geocentricNormal = positionGlobal / positionRadius;\r\n var directionToLight = ${directionToLightSnippet};\r\n var cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n diffuse0 = atmosphere.lightIntensity * sampleTransmittanceLut(transmittanceLut, positionRadius, cosAngleLightToZenith);\r\n }\r\n`,\r\n CUSTOM_REFLECTION: `\r\n {\r\n var positionGlobal = 0.001 * fragmentInputs.vPositionW + uniforms.${OriginOffsetUniformName};\r\n var positionRadius = length(positionGlobal);\r\n var geocentricNormal = positionGlobal / positionRadius;\r\n\r\n var directionToLight = ${directionToLightSnippet};\r\n var cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n\r\n var uv = vec2f(0.5 + 0.5 * cosAngleLightToZenith, (positionRadius - atmosphere.planetRadius) / atmosphere.atmosphereThickness);\r\n var irradianceScaleT = 0.5 * dot(normalW, geocentricNormal) + 0.5;\r\n var irradianceScale = ((-0.6652 * irradianceScaleT) + 1.5927) * irradianceScaleT + 0.1023;\r\n var environmentIrradiance = atmosphere.lightIntensity * textureSample(irradianceSampler, irradianceSamplerSampler, uv).rgb;\r\n\r\n // Add a contribution here to estimate indirect lighting.\r\n const r = 0.2;\r\n var indirect = getLuminance(environmentIrradiance) / max(0.00001, 1.0 - r);\r\n environmentIrradiance *= irradianceScale;\r\n environmentIrradiance += indirect;\r\n\r\n environmentIrradiance += atmosphere.additionalDiffuseSkyIrradiance;\r\n\r\n const diffuseBrdf = 1.0 / PI;\r\n environmentIrradiance *= diffuseBrdf * atmosphere.diffuseSkyIrradianceIntensity;\r\n\r\n reflectionOut.environmentIrradiance = environmentIrradiance;\r\n reflectionOut.environmentRadiance = vec4f(reflectionOut.environmentIrradiance, reflectionOut.environmentRadiance.a);\r\n }\r\n`,\r\n // TODO: Support full ray marching if USE_AERIAL_PERSPECTIVE_LUT is disabled.\r\n CUSTOM_FRAGMENT_BEFORE_FOG: `\r\n #if USE_AERIAL_PERSPECTIVE_LUT\r\n {\r\n var distanceFromCameraKm = 0.001 * distance(scene.vEyePosition.xyz, fragmentInputs.vPositionW);\r\n var aerialPerspective = vec4f(0.);\r\n if (sampleAerialPerspectiveLut(\r\n fragmentInputs.position.xy * uniforms.${InverseViewportSizeUniformName},\r\n true,\r\n distanceFromCameraKm,\r\n NumAerialPerspectiveLutLayers,\r\n AerialPerspectiveLutKMPerSlice,\r\n AerialPerspectiveLutRangeKM,\r\n &aerialPerspective)) {\r\n finalColor = aerialPerspective + (1. - aerialPerspective.a) * finalColor;\r\n }\r\n }\r\n #endif\r\n`,\r\n };\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"atmospherePBRMaterialPlugin.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmospherePBRMaterialPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// Licensed under the MIT License.\r\n\r\nimport type { Atmosphere } from \"./atmosphere\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { Vector3FromFloatsToRef, Vector3ScaleToRef } from \"core/Maths/math.vector.functions\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport \"./ShadersWGSL/ShadersInclude/atmosphereFunctions\";\r\nimport \"./ShadersWGSL/ShadersInclude/atmosphereUboDeclaration\";\r\n\r\nclass AtmospherePBRMaterialDefines extends MaterialDefines {\r\n public USE_AERIAL_PERSPECTIVE_LUT: boolean;\r\n public APPLY_AERIAL_PERSPECTIVE_INTENSITY = false;\r\n public APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS = false;\r\n public SAMPLE_TRANSMITTANCE_LUT = true;\r\n public EXCLUDE_RAY_MARCHING_FUNCTIONS = true;\r\n\r\n /**\r\n * Constructs the {@link AtmospherePBRMaterialDefines}.\r\n * @param useAerialPerspectiveLut - Whether to use the aerial perspective LUT.\r\n */\r\n constructor(useAerialPerspectiveLut: boolean) {\r\n super();\r\n this.USE_AERIAL_PERSPECTIVE_LUT = useAerialPerspectiveLut;\r\n }\r\n}\r\n\r\nconst OriginOffsetUniformName = \"originOffsetKm\";\r\nconst InverseViewportSizeUniformName = \"inverseViewportSize\";\r\n\r\nconst UboArray = [\r\n { name: OriginOffsetUniformName, size: 3, type: \"vec3\" },\r\n { name: \"_atmoPbrPadding1\", size: 1, type: \"float\" },\r\n { name: InverseViewportSizeUniformName, size: 2, type: \"vec2\" },\r\n];\r\nconst MakeUniforms = (atmosphere: Atmosphere) => ({\r\n ubo: UboArray,\r\n fragment: `uniform vec2 ${InverseViewportSizeUniformName};\\nuniform vec3 ${OriginOffsetUniformName};\\n`,\r\n externalUniforms: atmosphere.uniformBuffer.getUniformNames(),\r\n});\r\n\r\nconst PluginName = \"AtmospherePBRMaterialPlugin\";\r\nconst PluginPriority = 600;\r\nconst OriginOffsetKm = { x: 0, y: 0, z: 0 };\r\n\r\n/**\r\n * Adds shading logic to a PBRMaterial that provides radiance, diffuse sky irradiance, and aerial perspective from the atmosphere.\r\n */\r\nexport class AtmospherePBRMaterialPlugin extends MaterialPluginBase {\r\n /**\r\n * Constructs the {@link AtmospherePBRMaterialPlugin}.\r\n * @param material - The material to apply the plugin to.\r\n * @param _atmosphere - The atmosphere to use for shading.\r\n * @param _isAerialPerspectiveEnabled - Whether to apply aerial perspective.\r\n */\r\n constructor(\r\n material: Material,\r\n private readonly _atmosphere: Atmosphere,\r\n private readonly _isAerialPerspectiveEnabled = false\r\n ) {\r\n super(\r\n material,\r\n PluginName,\r\n PluginPriority,\r\n {\r\n USE_CUSTOM_REFLECTION: _atmosphere.diffuseSkyIrradianceLut !== null,\r\n CUSTOM_FRAGMENT_BEFORE_FOG: _isAerialPerspectiveEnabled,\r\n USE_AERIAL_PERSPECTIVE_LUT: _isAerialPerspectiveEnabled && _atmosphere.isAerialPerspectiveLutEnabled,\r\n APPLY_AERIAL_PERSPECTIVE_INTENSITY: _isAerialPerspectiveEnabled && _atmosphere.aerialPerspectiveIntensity !== 1.0,\r\n APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS: _isAerialPerspectiveEnabled && _atmosphere.aerialPerspectiveRadianceBias !== 0.0,\r\n SAMPLE_TRANSMITTANCE_LUT: true,\r\n EXCLUDE_RAY_MARCHING_FUNCTIONS: true,\r\n },\r\n false, // addPluginToList -- false because we need to control when this is added to the list\r\n true, // enable\r\n true // resolveIncludes\r\n );\r\n\r\n this.doNotSerialize = true;\r\n\r\n // This calls `getCode` so we need to do this after having initialized the class fields.\r\n this._pluginManager._addPlugin(this);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getUniformBuffersNames(_ubos: string[]): void {\r\n const uniformBuffer = this._atmosphere.uniformBuffer;\r\n if (uniformBuffer.useUbo) {\r\n const uboName = this._material.shaderLanguage === ShaderLanguage.WGSL ? \"atmosphere\" : uniformBuffer.name;\r\n _ubos.push(uboName);\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getUniforms() {\r\n return MakeUniforms(this._atmosphere);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override isReadyForSubMesh(): boolean {\r\n const atmosphere = this._atmosphere;\r\n\r\n if (!atmosphere.transmittanceLut?.hasLutData || (atmosphere.diffuseSkyIrradianceLut && !atmosphere.diffuseSkyIrradianceLut.hasLutData)) {\r\n return false;\r\n }\r\n\r\n if (this._isAerialPerspectiveEnabled && atmosphere.isAerialPerspectiveLutEnabled) {\r\n const aerialPerspectiveLutRenderTarget = atmosphere.aerialPerspectiveLutRenderTarget;\r\n if (!aerialPerspectiveLutRenderTarget?.isReady()) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getActiveTextures(_activeTextures: BaseTexture[]): void {\r\n const atmosphere = this._atmosphere;\r\n if (this._isAerialPerspectiveEnabled && atmosphere.isAerialPerspectiveLutEnabled) {\r\n const aerialPerspectiveLutRenderTarget = atmosphere.aerialPerspectiveLutRenderTarget;\r\n if (aerialPerspectiveLutRenderTarget) {\r\n _activeTextures.push(aerialPerspectiveLutRenderTarget);\r\n }\r\n }\r\n\r\n const transmittanceLutRenderTarget = atmosphere.transmittanceLut?.renderTarget ?? null;\r\n if (transmittanceLutRenderTarget) {\r\n _activeTextures.push(transmittanceLutRenderTarget);\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer): void {\r\n const atmosphere = this._atmosphere;\r\n const scene = atmosphere.scene;\r\n const engine = scene.getEngine();\r\n\r\n // Bind the atmosphere's uniform buffer to the effect.\r\n const effect = uniformBuffer.currentEffect;\r\n if (effect) {\r\n this._atmosphere.bindUniformBufferToEffect(effect);\r\n }\r\n\r\n // Need the offset to apply which will take a world space position and convert it to a global space position in the atmosphere.\r\n // If floating origin mode is enabled, that offset is the floating origin offset.\r\n // If not, it's an offset up the Y-axis by the planet radius.\r\n uniformBuffer.updateVector3(\r\n OriginOffsetUniformName,\r\n scene.floatingOriginMode\r\n ? Vector3ScaleToRef(scene.floatingOriginOffset, 0.001, OriginOffsetKm) // Convert to kilometers\r\n : Vector3FromFloatsToRef(0, atmosphere.physicalProperties.planetRadius, 0, OriginOffsetKm) // planetRadius is already in kilometers\r\n );\r\n\r\n const width = engine.getRenderWidth();\r\n const height = engine.getRenderHeight();\r\n uniformBuffer.updateFloat2(InverseViewportSizeUniformName, 1.0 / width, 1.0 / height);\r\n\r\n if (this._isAerialPerspectiveEnabled && atmosphere.isAerialPerspectiveLutEnabled) {\r\n const aerialPerspectiveLutRenderTarget = atmosphere.aerialPerspectiveLutRenderTarget;\r\n uniformBuffer.setTexture(\"aerialPerspectiveLut\", aerialPerspectiveLutRenderTarget);\r\n }\r\n const transmittanceLutRenderTarget = atmosphere.transmittanceLut?.renderTarget ?? null;\r\n uniformBuffer.setTexture(\"transmittanceLut\", transmittanceLutRenderTarget);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override prepareDefines(defines: AtmospherePBRMaterialDefines): void {\r\n const lastUseAerialPerspectiveLut = defines.USE_AERIAL_PERSPECTIVE_LUT;\r\n const lastApplyAerialPerspectiveIntensity = defines.APPLY_AERIAL_PERSPECTIVE_INTENSITY;\r\n const lastApplyAerialPerspectiveRadianceBias = defines.APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS;\r\n defines.USE_AERIAL_PERSPECTIVE_LUT = this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled;\r\n defines.APPLY_AERIAL_PERSPECTIVE_INTENSITY = this._isAerialPerspectiveEnabled && this._atmosphere.aerialPerspectiveIntensity !== 1.0;\r\n defines.APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS = this._isAerialPerspectiveEnabled && this._atmosphere.aerialPerspectiveRadianceBias !== 0.0;\r\n if (\r\n lastUseAerialPerspectiveLut !== defines.USE_AERIAL_PERSPECTIVE_LUT ||\r\n lastApplyAerialPerspectiveIntensity !== defines.APPLY_AERIAL_PERSPECTIVE_INTENSITY ||\r\n lastApplyAerialPerspectiveRadianceBias !== defines.APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS\r\n ) {\r\n defines.markAllAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getSamplers(samplers: string[]): void {\r\n samplers.push(\"transmittanceLut\");\r\n if (this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled) {\r\n samplers.push(\"aerialPerspectiveLut\");\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage): Nullable<Record<string, string>> {\r\n // Assumed inputs are light0, vPositionW, normalW.\r\n // Only works for directional lights.\r\n if (shaderType !== \"fragment\") {\r\n return null;\r\n }\r\n\r\n const useUbo = this._atmosphere.scene.getEngine().supportsUniformBuffers;\r\n const directionToLightSnippet = useUbo ? \"-light0.vLightData.xyz\" : \"-vLightData0.xyz\";\r\n\r\n const useAtmosphereUbo = shaderLanguage === ShaderLanguage.WGSL || this._atmosphere.uniformBuffer.useUbo;\r\n const atmosphereImportSnippet = useAtmosphereUbo ? \"#include<atmosphereUboDeclaration>\" : \"#include<atmosphereFragmentDeclaration>\";\r\n\r\n if (shaderLanguage === ShaderLanguage.GLSL) {\r\n return {\r\n CUSTOM_FRAGMENT_DEFINITIONS:\r\n this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled\r\n ? `uniform sampler2D transmittanceLut;\\r\\nprecision highp sampler2DArray;\\r\\nuniform sampler2DArray aerialPerspectiveLut;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`\r\n : `uniform sampler2D transmittanceLut;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`,\r\n\r\n // Provides the direct light contribution, accounting for transmittance.\r\n CUSTOM_LIGHT0_COLOR: `\r\n {\r\n vec3 positionGlobal = 0.001 * vPositionW + ${OriginOffsetUniformName};\r\n float positionRadius = length(positionGlobal);\r\n vec3 geocentricNormal = positionGlobal / positionRadius;\r\n vec3 directionToLight = ${directionToLightSnippet};\r\n float cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n diffuse0 = lightIntensity * sampleTransmittanceLut(transmittanceLut, positionRadius, cosAngleLightToZenith);\r\n }\r\n`,\r\n\r\n // Approximates the environment contribution from the atmosphere.\r\n // Note there are some tuned constants used below to modify the environment intensity.\r\n // A more physically accurate approach could be considered, and/or uniforms added to customize.\r\n CUSTOM_REFLECTION: `\r\n {\r\n vec3 positionGlobal = 0.001 * vPositionW + ${OriginOffsetUniformName};\r\n float positionRadius = length(positionGlobal);\r\n vec3 geocentricNormal = positionGlobal / positionRadius;\r\n\r\n vec3 directionToLight = ${directionToLightSnippet};\r\n float cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n\r\n vec2 uv = vec2(0.5 + 0.5 * cosAngleLightToZenith, (positionRadius - planetRadius) / atmosphereThickness);\r\n float irradianceScaleT = 0.5 * dot(normalW, geocentricNormal) + 0.5;\r\n float irradianceScale = ((-0.6652 * irradianceScaleT) + 1.5927) * irradianceScaleT + 0.1023;\r\n vec3 environmentIrradiance = lightIntensity * sampleReflection(irradianceSampler, uv).rgb;\r\n\r\n // Add a contribution here to estimate indirect lighting.\r\n const float r = 0.2;\r\n float indirect = getLuminance(environmentIrradiance) / max(0.00001, 1. - r);\r\n environmentIrradiance *= irradianceScale;\r\n environmentIrradiance += indirect;\r\n\r\n environmentIrradiance += additionalDiffuseSkyIrradiance;\r\n\r\n const float diffuseBrdf = 1. / PI;\r\n environmentIrradiance *= diffuseBrdf * diffuseSkyIrradianceIntensity;\r\n\r\n reflectionOut.environmentIrradiance = environmentIrradiance;\r\n reflectionOut.environmentRadiance.rgb = reflectionOut.environmentIrradiance;\r\n }\r\n`,\r\n // TODO: Support full ray marching if USE_AERIAL_PERSPECTIVE_LUT is disabled.\r\n CUSTOM_FRAGMENT_BEFORE_FOG: `\r\n #if USE_AERIAL_PERSPECTIVE_LUT\r\n {\r\n float distanceFromCameraKm = 0.001 * distance(vEyePosition.xyz, vPositionW);\r\n vec4 aerialPerspective = vec4(0.);\r\n if (sampleAerialPerspectiveLut(\r\n gl_FragCoord.xy * ${InverseViewportSizeUniformName},\r\n true,\r\n distanceFromCameraKm,\r\n NumAerialPerspectiveLutLayers,\r\n AerialPerspectiveLutKMPerSlice,\r\n AerialPerspectiveLutRangeKM,\r\n aerialPerspective)) {\r\n finalColor = aerialPerspective + (1. - aerialPerspective.a) * finalColor;\r\n }\r\n }\r\n #endif\r\n`,\r\n };\r\n } else {\r\n // WGSL\r\n return {\r\n CUSTOM_FRAGMENT_DEFINITIONS:\r\n this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled\r\n ? `var transmittanceLutSampler: sampler;\\r\\nvar transmittanceLut: texture_2d<f32>;\\r\\nvar aerialPerspectiveLutSampler: sampler;\\r\\nvar aerialPerspectiveLut: texture_2d_array<f32>;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`\r\n : `var transmittanceLutSampler: sampler;\\r\\nvar transmittanceLut: texture_2d<f32>;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`,\r\n\r\n // Provides the direct light contribution, accounting for transmittance.\r\n CUSTOM_LIGHT0_COLOR: `\r\n {\r\n var positionGlobal = 0.001 * fragmentInputs.vPositionW + uniforms.${OriginOffsetUniformName};\r\n var positionRadius = length(positionGlobal);\r\n var geocentricNormal = positionGlobal / positionRadius;\r\n var directionToLight = ${directionToLightSnippet};\r\n var cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n diffuse0 = atmosphere.lightIntensity * sampleTransmittanceLut(transmittanceLut, positionRadius, cosAngleLightToZenith);\r\n }\r\n`,\r\n\r\n // Approximates the environment contribution from the atmosphere.\r\n // Note there are some tuned constants used below to modify the environment intensity.\r\n // A more physically accurate approach could be considered, and/or uniforms added to customize.\r\n CUSTOM_REFLECTION: `\r\n {\r\n var positionGlobal = 0.001 * fragmentInputs.vPositionW + uniforms.${OriginOffsetUniformName};\r\n var positionRadius = length(positionGlobal);\r\n var geocentricNormal = positionGlobal / positionRadius;\r\n\r\n var directionToLight = ${directionToLightSnippet};\r\n var cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n\r\n var uv = vec2f(0.5 + 0.5 * cosAngleLightToZenith, (positionRadius - atmosphere.planetRadius) / atmosphere.atmosphereThickness);\r\n var irradianceScaleT = 0.5 * dot(normalW, geocentricNormal) + 0.5;\r\n var irradianceScale = ((-0.6652 * irradianceScaleT) + 1.5927) * irradianceScaleT + 0.1023;\r\n var environmentIrradiance = atmosphere.lightIntensity * textureSample(irradianceSampler, irradianceSamplerSampler, uv).rgb;\r\n\r\n // Add a contribution here to estimate indirect lighting.\r\n const r = 0.2;\r\n var indirect = getLuminance(environmentIrradiance) / max(0.00001, 1.0 - r);\r\n environmentIrradiance *= irradianceScale;\r\n environmentIrradiance += indirect;\r\n\r\n environmentIrradiance += atmosphere.additionalDiffuseSkyIrradiance;\r\n\r\n const diffuseBrdf = 1.0 / PI;\r\n environmentIrradiance *= diffuseBrdf * atmosphere.diffuseSkyIrradianceIntensity;\r\n\r\n reflectionOut.environmentIrradiance = environmentIrradiance;\r\n reflectionOut.environmentRadiance = vec4f(reflectionOut.environmentIrradiance, reflectionOut.environmentRadiance.a);\r\n }\r\n`,\r\n // TODO: Support full ray marching if USE_AERIAL_PERSPECTIVE_LUT is disabled.\r\n CUSTOM_FRAGMENT_BEFORE_FOG: `\r\n #if USE_AERIAL_PERSPECTIVE_LUT\r\n {\r\n var distanceFromCameraKm = 0.001 * distance(scene.vEyePosition.xyz, fragmentInputs.vPositionW);\r\n var aerialPerspective = vec4f(0.);\r\n if (sampleAerialPerspectiveLut(\r\n fragmentInputs.position.xy * uniforms.${InverseViewportSizeUniformName},\r\n true,\r\n distanceFromCameraKm,\r\n NumAerialPerspectiveLutLayers,\r\n AerialPerspectiveLutKMPerSlice,\r\n AerialPerspectiveLutRangeKM,\r\n &aerialPerspective)) {\r\n finalColor = aerialPerspective + (1. - aerialPerspective.a) * finalColor;\r\n }\r\n }\r\n #endif\r\n`,\r\n };\r\n }\r\n }\r\n}\r\n"]}
|
package/msdfText/textRenderer.js
CHANGED
|
@@ -275,8 +275,8 @@ export class TextRenderer {
|
|
|
275
275
|
throw new Error("Instanced arrays are required for MSDF text rendering.");
|
|
276
276
|
}
|
|
277
277
|
let shaderLanguage = 0 /* ShaderLanguage.GLSL */;
|
|
278
|
-
let vertex
|
|
279
|
-
let fragment
|
|
278
|
+
let vertex;
|
|
279
|
+
let fragment;
|
|
280
280
|
if (engine.isWebGPU) {
|
|
281
281
|
shaderLanguage = 1 /* ShaderLanguage.WGSL */;
|
|
282
282
|
vertex = (await import("./shadersWGSL/msdf.vertex.js")).msdfVertexShaderWGSL.shader;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textRenderer.js","sourceRoot":"","sources":["../../../../dev/addons/src/msdfText/textRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Buffer } from \"core/Buffers/buffer\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { ThinEngine } from \"core/Engines/thinEngine\";\r\nimport { DrawWrapper } from \"core/Materials/drawWrapper\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport type { IDisposable } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { SdfTextParagraph } from \"./sdf/paragraph\";\r\nimport type { FontAsset } from \"./fontAsset\";\r\nimport type { ParagraphOptions } from \"./paragraphOptions\";\r\nimport { ThinMatrix } from \"core/Maths/ThinMaths/thinMath.matrix\";\r\nimport {\r\n CopyMatrixToArray,\r\n CopyMatrixToRef,\r\n IdentityMatrixToRef,\r\n MultiplyMatricesToRef,\r\n ScalingMatrixToRef,\r\n TranslationMatrixToRef,\r\n} from \"core/Maths/ThinMaths/thinMath.matrix.functions\";\r\nimport type { IColor4Like, IMatrixLike } from \"core/Maths/math.like\";\r\n\r\n/**\r\n * Abstract Node class from Babylon.js\r\n */\r\nexport interface INodeLike {\r\n getWorldMatrix(): IMatrixLike;\r\n}\r\n\r\n/**\r\n * Class used to render text using MSDF (Multi-channel Signed Distance Field) technique\r\n * Thanks a lot to the work of Bhushan_Wagh and zb_sj for their amazing work on MSDF for Babylon.js\r\n * #6RLCWP#16\r\n * Star wars scroller: #6RLCWP#29\r\n * With metrics: #6RLCWP#35\r\n * Thickness: #IABMEZ#3\r\n * Solar system: #9YCDYC#9\r\n * Stroke: #6RLCWP#37\r\n */\r\nexport class TextRenderer implements IDisposable {\r\n private readonly _useVAO: boolean = false;\r\n private _engine: AbstractEngine;\r\n private _shaderLanguage: ShaderLanguage;\r\n private _vertexBuffers: { [key: string]: VertexBuffer } = {};\r\n private _spriteBuffer: Nullable<Buffer>;\r\n private _worldBuffer: Nullable<Buffer>;\r\n private _uvBuffer: Nullable<Buffer>;\r\n private _drawWrapperBase: DrawWrapper;\r\n private _vertexArrayObject: WebGLVertexArrayObject;\r\n private _font: FontAsset;\r\n private _charMatrices = new Array<number>();\r\n private _charUvs = new Array<number>();\r\n private _isDirty = true;\r\n private _baseLine = 0;\r\n\r\n // Cache\r\n private _scalingMatrix = new ThinMatrix();\r\n private _fontScaleMatrix = new ThinMatrix();\r\n private _offsetMatrix = new ThinMatrix();\r\n private _translationMatrix = new ThinMatrix();\r\n private _baseMatrix = new ThinMatrix();\r\n private _scaledMatrix = new ThinMatrix();\r\n private _localMatrix = new ThinMatrix();\r\n private _finalMatrix = new ThinMatrix();\r\n private _lineMatrix = new ThinMatrix();\r\n private _parentWorldMatrix = new ThinMatrix();\r\n\r\n /**\r\n * Gets or sets the color of the text\r\n */\r\n public color: IColor4Like = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };\r\n\r\n /**\r\n * Gets or sets the color of the stroke around the text\r\n */\r\n public strokeColor: IColor4Like = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };\r\n\r\n /**\r\n * Gets or sets the width of the stroke around the text (inset)\r\n */\r\n public strokeInsetWidth = 0;\r\n\r\n /**\r\n * Gets or sets the width of the stroke around the text (outset)\r\n */\r\n public strokeOutsetWidth = 0;\r\n\r\n /**\r\n * Gets or sets the thickness of the text (0 means as defined in the font)\r\n * Value must be between -0.5 and 0.5\r\n */\r\n public thicknessControl = 0;\r\n\r\n private _parent: Nullable<INodeLike> = null;\r\n\r\n /**\r\n * Gets or sets the parent of the text renderer\r\n */\r\n public get parent(): Nullable<INodeLike> {\r\n return this._parent;\r\n }\r\n\r\n public set parent(value: Nullable<INodeLike>) {\r\n this._parent = value;\r\n }\r\n\r\n private _transformMatrix: IMatrixLike = new ThinMatrix();\r\n\r\n /**\r\n * Gets or sets the transform matrix of the text renderer\r\n * It will be applied in that order:\r\n * parent x transform x paragraph world\r\n */\r\n public get transformMatrix(): IMatrixLike {\r\n return this._transformMatrix;\r\n }\r\n\r\n public set transformMatrix(value: IMatrixLike) {\r\n this._transformMatrix = value;\r\n }\r\n\r\n /**\r\n * Gets or sets if the text is billboarded\r\n */\r\n public isBillboard = false;\r\n\r\n /**\r\n * Gets or sets if the text is screen projected\r\n * This will work only if the text is billboarded\r\n */\r\n public isBillboardScreenProjected = false;\r\n\r\n /**\r\n * Gets the number of characters in the text renderer\r\n */\r\n public get characterCount(): number {\r\n return this._charMatrices.length / 16;\r\n }\r\n\r\n /**\r\n * Gets or sets if the text renderer should ignore the depth buffer\r\n * Default is false\r\n */\r\n public ignoreDepthBuffer = false;\r\n\r\n private constructor(engine: AbstractEngine, shaderLanguage: ShaderLanguage = ShaderLanguage.GLSL, font: FontAsset) {\r\n this._engine = engine;\r\n this._shaderLanguage = shaderLanguage;\r\n this._font = font;\r\n this._baseLine = font._font.common.lineHeight * font.scale;\r\n\r\n this._useVAO = engine.getCaps().vertexArrayObject && !engine.disableVertexArrayObjects;\r\n\r\n // Main vertex buffer\r\n const spriteData = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\r\n this._spriteBuffer = new Buffer(engine, spriteData, false, 2);\r\n this._vertexBuffers[\"offsets\"] = this._spriteBuffer.createVertexBuffer(\"offsets\", 0, 2);\r\n\r\n // Instances\r\n this._resizeBuffers(128);\r\n }\r\n\r\n private _resizeBuffers(capacity: number) {\r\n if (this._worldBuffer) {\r\n this._worldBuffer.dispose();\r\n this._worldBuffer = null;\r\n }\r\n\r\n if (this._uvBuffer) {\r\n this._uvBuffer.dispose();\r\n this._uvBuffer = null;\r\n }\r\n\r\n this._worldBuffer = new Buffer(this._engine, new Float32Array(capacity * 16), true, 16);\r\n this._vertexBuffers[\"world0\"] = this._worldBuffer.createVertexBuffer(\"world0\", 0, 4, 16, true);\r\n this._vertexBuffers[\"world1\"] = this._worldBuffer.createVertexBuffer(\"world1\", 4, 4, 16, true);\r\n this._vertexBuffers[\"world2\"] = this._worldBuffer.createVertexBuffer(\"world2\", 8, 4, 16, true);\r\n this._vertexBuffers[\"world3\"] = this._worldBuffer.createVertexBuffer(\"world3\", 12, 4, 16, true);\r\n\r\n this._uvBuffer = new Buffer(this._engine, new Float32Array(capacity * 4), true, 4);\r\n this._vertexBuffers[\"uvs\"] = this._uvBuffer.createVertexBuffer(\"uvs\", 0, 4, 4, true);\r\n }\r\n\r\n private _setShaders(vertex: string, fragment: string) {\r\n this._drawWrapperBase?.dispose();\r\n\r\n this._drawWrapperBase = new DrawWrapper(this._engine);\r\n\r\n if (this._drawWrapperBase.drawContext) {\r\n this._drawWrapperBase.drawContext.useInstancing = true;\r\n }\r\n\r\n const defines = \"\";\r\n\r\n this._drawWrapperBase.effect = this._engine.createEffect(\r\n {\r\n vertexSource: vertex,\r\n fragmentSource: fragment,\r\n },\r\n [\"offsets\", \"world0\", \"world1\", \"world2\", \"world3\", \"uvs\"],\r\n [\"parentWorld\", \"view\", \"projection\", \"uColor\", \"thickness\", \"uStrokeColor\", \"uStrokeInsetWidth\", \"uStrokeOutsetWidth\", \"mode\", \"transform\"],\r\n [\"fontAtlas\"],\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._shaderLanguage\r\n );\r\n\r\n this._drawWrapperBase.effect._refCount++;\r\n }\r\n\r\n /**\r\n * Add a paragraph of text to the renderer\r\n * @param text define the text to add\r\n * @param options define the options to use for the paragraph (optional)\r\n * @param worldMatrix define the world matrix to use for the paragraph (optional)\r\n */\r\n public addParagraph(text: string, options?: Partial<ParagraphOptions>, worldMatrix?: IMatrixLike) {\r\n const paragraph = new SdfTextParagraph(text, this._font, options);\r\n\r\n const fontScale = this._font.scale;\r\n\r\n const texWidth = this._font._font.common.scaleW;\r\n const texHeight = this._font._font.common.scaleH;\r\n const glyphs = paragraph.glyphs.filter((g) => g.char.page >= 0);\r\n\r\n let worldMatrixToUse = worldMatrix;\r\n\r\n if (!worldMatrixToUse) {\r\n const lineHeight = paragraph.lineHeight * fontScale;\r\n const lineOffset = (paragraph.lines.length * lineHeight) / 2;\r\n TranslationMatrixToRef(0, this._baseLine - lineOffset, 0, this._lineMatrix);\r\n worldMatrixToUse = this._lineMatrix;\r\n }\r\n\r\n ScalingMatrixToRef(fontScale, fontScale, 1.0, this._fontScaleMatrix);\r\n TranslationMatrixToRef(0.5, -0.5, 0, this._offsetMatrix);\r\n\r\n const charsUvsBase = this._charUvs.length;\r\n const matricesBase = this._charMatrices.length;\r\n glyphs.forEach((g, i) => {\r\n this._charUvs[charsUvsBase + i * 4 + 0] = g.char.x / texWidth;\r\n this._charUvs[charsUvsBase + i * 4 + 1] = g.char.y / texHeight;\r\n this._charUvs[charsUvsBase + i * 4 + 2] = g.char.width / texWidth;\r\n this._charUvs[charsUvsBase + i * 4 + 3] = g.char.height / texHeight;\r\n\r\n const x = g.x + g.char.xoffset;\r\n const y = 1.0 - (g.y + g.char.yoffset);\r\n\r\n ScalingMatrixToRef(g.char.width, g.char.height, 1.0, this._scalingMatrix);\r\n MultiplyMatricesToRef(this._offsetMatrix, this._scalingMatrix, this._baseMatrix);\r\n\r\n TranslationMatrixToRef(x * fontScale, y * fontScale, 0.0, this._translationMatrix);\r\n MultiplyMatricesToRef(this._baseMatrix, this._fontScaleMatrix, this._scaledMatrix);\r\n MultiplyMatricesToRef(this._scaledMatrix, this._translationMatrix, this._localMatrix);\r\n\r\n MultiplyMatricesToRef(this._localMatrix, worldMatrixToUse, this._finalMatrix);\r\n CopyMatrixToArray(this._finalMatrix, this._charMatrices, matricesBase + i * 16);\r\n });\r\n\r\n this._isDirty = true;\r\n\r\n this._baseLine -= paragraph.lineHeight * fontScale * paragraph.lines.length;\r\n }\r\n\r\n /**\r\n * Render the text using the provided view and projection matrices\r\n * @param viewMatrix define the view matrix to use\r\n * @param projectionMatrix define the projection matrix to use\r\n */\r\n public render(viewMatrix: IMatrixLike, projectionMatrix: IMatrixLike): void {\r\n const drawWrapper = this._drawWrapperBase;\r\n\r\n const effect = drawWrapper.effect!;\r\n\r\n // Check\r\n if (!effect.isReady()) {\r\n return;\r\n }\r\n const engine = this._engine;\r\n\r\n engine.setState(false);\r\n engine.enableEffect(drawWrapper);\r\n\r\n if (this.ignoreDepthBuffer) {\r\n engine.setDepthBuffer(false);\r\n }\r\n\r\n if (this._parent) {\r\n CopyMatrixToRef(this._parent.getWorldMatrix(), this._parentWorldMatrix);\r\n } else {\r\n IdentityMatrixToRef(this._parentWorldMatrix);\r\n }\r\n\r\n effect.setInt(\"mode\", this.isBillboard ? (this.isBillboardScreenProjected ? 2 : 1) : 0);\r\n effect.setMatrix(\"parentWorld\", this._parentWorldMatrix);\r\n effect.setMatrix(\"view\", viewMatrix);\r\n effect.setMatrix(\"projection\", projectionMatrix);\r\n effect.setMatrix(\"transform\", this.transformMatrix);\r\n\r\n // Texture\r\n effect.setTexture(\"fontAtlas\", this._font.textures[0]);\r\n effect.setDirectColor4(\"uColor\", this.color);\r\n effect.setDirectColor4(\"uStrokeColor\", this.strokeColor);\r\n effect.setFloat(\"thickness\", this.thicknessControl * 0.9);\r\n effect.setFloat(\"uStrokeInsetWidth\", this.strokeInsetWidth);\r\n effect.setFloat(\"uStrokeOutsetWidth\", this.strokeOutsetWidth);\r\n\r\n const instanceCount = this._charMatrices.length / 16;\r\n\r\n // Need update?\r\n if (this._isDirty) {\r\n this._isDirty = false;\r\n\r\n if (this._worldBuffer!.getBuffer()!.capacity / 4 < instanceCount * 16) {\r\n this._resizeBuffers(instanceCount);\r\n }\r\n\r\n this._worldBuffer!.update(this._charMatrices);\r\n this._uvBuffer!.update(this._charUvs);\r\n }\r\n\r\n if (this._useVAO) {\r\n if (!this._vertexArrayObject) {\r\n this._vertexArrayObject = (engine as ThinEngine).recordVertexArrayObject(this._vertexBuffers, null, effect);\r\n }\r\n (engine as ThinEngine).bindVertexArrayObject(this._vertexArrayObject, null);\r\n } else {\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, null, effect);\r\n }\r\n\r\n engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, instanceCount);\r\n engine.unbindInstanceAttributes();\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n if (this.ignoreDepthBuffer) {\r\n engine.setDepthBuffer(true);\r\n }\r\n }\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._worldBuffer) {\r\n this._worldBuffer.dispose();\r\n this._worldBuffer = null;\r\n }\r\n\r\n if (this._uvBuffer) {\r\n this._uvBuffer.dispose();\r\n this._uvBuffer = null;\r\n }\r\n\r\n if (this._spriteBuffer) {\r\n this._spriteBuffer.dispose();\r\n this._spriteBuffer = null;\r\n }\r\n\r\n if (this._vertexArrayObject) {\r\n (this._engine as ThinEngine).releaseVertexArrayObject(this._vertexArrayObject);\r\n (<any>this._vertexArrayObject) = null;\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new TextRenderer instance asynchronously\r\n * @param font define the font asset to use\r\n * @param engine define the engine to use\r\n * @returns a promise that resolves to the created TextRenderer instance\r\n */\r\n public static async CreateTextRendererAsync(font: FontAsset, engine: AbstractEngine) {\r\n if (!engine.getCaps().instancedArrays || !engine._features.supportSpriteInstancing) {\r\n throw new Error(\"Instanced arrays are required for MSDF text rendering.\");\r\n }\r\n\r\n let shaderLanguage = ShaderLanguage.GLSL;\r\n let vertex: string = \"\";\r\n let fragment: string = \"\";\r\n if (engine.isWebGPU) {\r\n shaderLanguage = ShaderLanguage.WGSL;\r\n vertex = (await import(\"./shadersWGSL/msdf.vertex\")).msdfVertexShaderWGSL.shader;\r\n fragment = (await import(\"./shadersWGSL/msdf.fragment\")).msdfPixelShaderWGSL.shader;\r\n } else {\r\n vertex = (await import(\"./shaders/msdf.vertex\")).msdfVertexShader.shader;\r\n fragment = (await import(\"./shaders/msdf.fragment\")).msdfPixelShader.shader;\r\n }\r\n\r\n const textRenderer = new TextRenderer(engine, shaderLanguage, font);\r\n textRenderer._setShaders(vertex, fragment);\r\n\r\n return textRenderer;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"textRenderer.js","sourceRoot":"","sources":["../../../../dev/addons/src/msdfText/textRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Buffer } from \"core/Buffers/buffer\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { ThinEngine } from \"core/Engines/thinEngine\";\r\nimport { DrawWrapper } from \"core/Materials/drawWrapper\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport type { IDisposable } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { SdfTextParagraph } from \"./sdf/paragraph\";\r\nimport type { FontAsset } from \"./fontAsset\";\r\nimport type { ParagraphOptions } from \"./paragraphOptions\";\r\nimport { ThinMatrix } from \"core/Maths/ThinMaths/thinMath.matrix\";\r\nimport {\r\n CopyMatrixToArray,\r\n CopyMatrixToRef,\r\n IdentityMatrixToRef,\r\n MultiplyMatricesToRef,\r\n ScalingMatrixToRef,\r\n TranslationMatrixToRef,\r\n} from \"core/Maths/ThinMaths/thinMath.matrix.functions\";\r\nimport type { IColor4Like, IMatrixLike } from \"core/Maths/math.like\";\r\n\r\n/**\r\n * Abstract Node class from Babylon.js\r\n */\r\nexport interface INodeLike {\r\n getWorldMatrix(): IMatrixLike;\r\n}\r\n\r\n/**\r\n * Class used to render text using MSDF (Multi-channel Signed Distance Field) technique\r\n * Thanks a lot to the work of Bhushan_Wagh and zb_sj for their amazing work on MSDF for Babylon.js\r\n * #6RLCWP#16\r\n * Star wars scroller: #6RLCWP#29\r\n * With metrics: #6RLCWP#35\r\n * Thickness: #IABMEZ#3\r\n * Solar system: #9YCDYC#9\r\n * Stroke: #6RLCWP#37\r\n */\r\nexport class TextRenderer implements IDisposable {\r\n private readonly _useVAO: boolean = false;\r\n private _engine: AbstractEngine;\r\n private _shaderLanguage: ShaderLanguage;\r\n private _vertexBuffers: { [key: string]: VertexBuffer } = {};\r\n private _spriteBuffer: Nullable<Buffer>;\r\n private _worldBuffer: Nullable<Buffer>;\r\n private _uvBuffer: Nullable<Buffer>;\r\n private _drawWrapperBase: DrawWrapper;\r\n private _vertexArrayObject: WebGLVertexArrayObject;\r\n private _font: FontAsset;\r\n private _charMatrices = new Array<number>();\r\n private _charUvs = new Array<number>();\r\n private _isDirty = true;\r\n private _baseLine = 0;\r\n\r\n // Cache\r\n private _scalingMatrix = new ThinMatrix();\r\n private _fontScaleMatrix = new ThinMatrix();\r\n private _offsetMatrix = new ThinMatrix();\r\n private _translationMatrix = new ThinMatrix();\r\n private _baseMatrix = new ThinMatrix();\r\n private _scaledMatrix = new ThinMatrix();\r\n private _localMatrix = new ThinMatrix();\r\n private _finalMatrix = new ThinMatrix();\r\n private _lineMatrix = new ThinMatrix();\r\n private _parentWorldMatrix = new ThinMatrix();\r\n\r\n /**\r\n * Gets or sets the color of the text\r\n */\r\n public color: IColor4Like = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };\r\n\r\n /**\r\n * Gets or sets the color of the stroke around the text\r\n */\r\n public strokeColor: IColor4Like = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };\r\n\r\n /**\r\n * Gets or sets the width of the stroke around the text (inset)\r\n */\r\n public strokeInsetWidth = 0;\r\n\r\n /**\r\n * Gets or sets the width of the stroke around the text (outset)\r\n */\r\n public strokeOutsetWidth = 0;\r\n\r\n /**\r\n * Gets or sets the thickness of the text (0 means as defined in the font)\r\n * Value must be between -0.5 and 0.5\r\n */\r\n public thicknessControl = 0;\r\n\r\n private _parent: Nullable<INodeLike> = null;\r\n\r\n /**\r\n * Gets or sets the parent of the text renderer\r\n */\r\n public get parent(): Nullable<INodeLike> {\r\n return this._parent;\r\n }\r\n\r\n public set parent(value: Nullable<INodeLike>) {\r\n this._parent = value;\r\n }\r\n\r\n private _transformMatrix: IMatrixLike = new ThinMatrix();\r\n\r\n /**\r\n * Gets or sets the transform matrix of the text renderer\r\n * It will be applied in that order:\r\n * parent x transform x paragraph world\r\n */\r\n public get transformMatrix(): IMatrixLike {\r\n return this._transformMatrix;\r\n }\r\n\r\n public set transformMatrix(value: IMatrixLike) {\r\n this._transformMatrix = value;\r\n }\r\n\r\n /**\r\n * Gets or sets if the text is billboarded\r\n */\r\n public isBillboard = false;\r\n\r\n /**\r\n * Gets or sets if the text is screen projected\r\n * This will work only if the text is billboarded\r\n */\r\n public isBillboardScreenProjected = false;\r\n\r\n /**\r\n * Gets the number of characters in the text renderer\r\n */\r\n public get characterCount(): number {\r\n return this._charMatrices.length / 16;\r\n }\r\n\r\n /**\r\n * Gets or sets if the text renderer should ignore the depth buffer\r\n * Default is false\r\n */\r\n public ignoreDepthBuffer = false;\r\n\r\n private constructor(engine: AbstractEngine, shaderLanguage: ShaderLanguage = ShaderLanguage.GLSL, font: FontAsset) {\r\n this._engine = engine;\r\n this._shaderLanguage = shaderLanguage;\r\n this._font = font;\r\n this._baseLine = font._font.common.lineHeight * font.scale;\r\n\r\n this._useVAO = engine.getCaps().vertexArrayObject && !engine.disableVertexArrayObjects;\r\n\r\n // Main vertex buffer\r\n const spriteData = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\r\n this._spriteBuffer = new Buffer(engine, spriteData, false, 2);\r\n this._vertexBuffers[\"offsets\"] = this._spriteBuffer.createVertexBuffer(\"offsets\", 0, 2);\r\n\r\n // Instances\r\n this._resizeBuffers(128);\r\n }\r\n\r\n private _resizeBuffers(capacity: number) {\r\n if (this._worldBuffer) {\r\n this._worldBuffer.dispose();\r\n this._worldBuffer = null;\r\n }\r\n\r\n if (this._uvBuffer) {\r\n this._uvBuffer.dispose();\r\n this._uvBuffer = null;\r\n }\r\n\r\n this._worldBuffer = new Buffer(this._engine, new Float32Array(capacity * 16), true, 16);\r\n this._vertexBuffers[\"world0\"] = this._worldBuffer.createVertexBuffer(\"world0\", 0, 4, 16, true);\r\n this._vertexBuffers[\"world1\"] = this._worldBuffer.createVertexBuffer(\"world1\", 4, 4, 16, true);\r\n this._vertexBuffers[\"world2\"] = this._worldBuffer.createVertexBuffer(\"world2\", 8, 4, 16, true);\r\n this._vertexBuffers[\"world3\"] = this._worldBuffer.createVertexBuffer(\"world3\", 12, 4, 16, true);\r\n\r\n this._uvBuffer = new Buffer(this._engine, new Float32Array(capacity * 4), true, 4);\r\n this._vertexBuffers[\"uvs\"] = this._uvBuffer.createVertexBuffer(\"uvs\", 0, 4, 4, true);\r\n }\r\n\r\n private _setShaders(vertex: string, fragment: string) {\r\n this._drawWrapperBase?.dispose();\r\n\r\n this._drawWrapperBase = new DrawWrapper(this._engine);\r\n\r\n if (this._drawWrapperBase.drawContext) {\r\n this._drawWrapperBase.drawContext.useInstancing = true;\r\n }\r\n\r\n const defines = \"\";\r\n\r\n this._drawWrapperBase.effect = this._engine.createEffect(\r\n {\r\n vertexSource: vertex,\r\n fragmentSource: fragment,\r\n },\r\n [\"offsets\", \"world0\", \"world1\", \"world2\", \"world3\", \"uvs\"],\r\n [\"parentWorld\", \"view\", \"projection\", \"uColor\", \"thickness\", \"uStrokeColor\", \"uStrokeInsetWidth\", \"uStrokeOutsetWidth\", \"mode\", \"transform\"],\r\n [\"fontAtlas\"],\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._shaderLanguage\r\n );\r\n\r\n this._drawWrapperBase.effect._refCount++;\r\n }\r\n\r\n /**\r\n * Add a paragraph of text to the renderer\r\n * @param text define the text to add\r\n * @param options define the options to use for the paragraph (optional)\r\n * @param worldMatrix define the world matrix to use for the paragraph (optional)\r\n */\r\n public addParagraph(text: string, options?: Partial<ParagraphOptions>, worldMatrix?: IMatrixLike) {\r\n const paragraph = new SdfTextParagraph(text, this._font, options);\r\n\r\n const fontScale = this._font.scale;\r\n\r\n const texWidth = this._font._font.common.scaleW;\r\n const texHeight = this._font._font.common.scaleH;\r\n const glyphs = paragraph.glyphs.filter((g) => g.char.page >= 0);\r\n\r\n let worldMatrixToUse = worldMatrix;\r\n\r\n if (!worldMatrixToUse) {\r\n const lineHeight = paragraph.lineHeight * fontScale;\r\n const lineOffset = (paragraph.lines.length * lineHeight) / 2;\r\n TranslationMatrixToRef(0, this._baseLine - lineOffset, 0, this._lineMatrix);\r\n worldMatrixToUse = this._lineMatrix;\r\n }\r\n\r\n ScalingMatrixToRef(fontScale, fontScale, 1.0, this._fontScaleMatrix);\r\n TranslationMatrixToRef(0.5, -0.5, 0, this._offsetMatrix);\r\n\r\n const charsUvsBase = this._charUvs.length;\r\n const matricesBase = this._charMatrices.length;\r\n glyphs.forEach((g, i) => {\r\n this._charUvs[charsUvsBase + i * 4 + 0] = g.char.x / texWidth;\r\n this._charUvs[charsUvsBase + i * 4 + 1] = g.char.y / texHeight;\r\n this._charUvs[charsUvsBase + i * 4 + 2] = g.char.width / texWidth;\r\n this._charUvs[charsUvsBase + i * 4 + 3] = g.char.height / texHeight;\r\n\r\n const x = g.x + g.char.xoffset;\r\n const y = 1.0 - (g.y + g.char.yoffset);\r\n\r\n ScalingMatrixToRef(g.char.width, g.char.height, 1.0, this._scalingMatrix);\r\n MultiplyMatricesToRef(this._offsetMatrix, this._scalingMatrix, this._baseMatrix);\r\n\r\n TranslationMatrixToRef(x * fontScale, y * fontScale, 0.0, this._translationMatrix);\r\n MultiplyMatricesToRef(this._baseMatrix, this._fontScaleMatrix, this._scaledMatrix);\r\n MultiplyMatricesToRef(this._scaledMatrix, this._translationMatrix, this._localMatrix);\r\n\r\n MultiplyMatricesToRef(this._localMatrix, worldMatrixToUse, this._finalMatrix);\r\n CopyMatrixToArray(this._finalMatrix, this._charMatrices, matricesBase + i * 16);\r\n });\r\n\r\n this._isDirty = true;\r\n\r\n this._baseLine -= paragraph.lineHeight * fontScale * paragraph.lines.length;\r\n }\r\n\r\n /**\r\n * Render the text using the provided view and projection matrices\r\n * @param viewMatrix define the view matrix to use\r\n * @param projectionMatrix define the projection matrix to use\r\n */\r\n public render(viewMatrix: IMatrixLike, projectionMatrix: IMatrixLike): void {\r\n const drawWrapper = this._drawWrapperBase;\r\n\r\n const effect = drawWrapper.effect!;\r\n\r\n // Check\r\n if (!effect.isReady()) {\r\n return;\r\n }\r\n const engine = this._engine;\r\n\r\n engine.setState(false);\r\n engine.enableEffect(drawWrapper);\r\n\r\n if (this.ignoreDepthBuffer) {\r\n engine.setDepthBuffer(false);\r\n }\r\n\r\n if (this._parent) {\r\n CopyMatrixToRef(this._parent.getWorldMatrix(), this._parentWorldMatrix);\r\n } else {\r\n IdentityMatrixToRef(this._parentWorldMatrix);\r\n }\r\n\r\n effect.setInt(\"mode\", this.isBillboard ? (this.isBillboardScreenProjected ? 2 : 1) : 0);\r\n effect.setMatrix(\"parentWorld\", this._parentWorldMatrix);\r\n effect.setMatrix(\"view\", viewMatrix);\r\n effect.setMatrix(\"projection\", projectionMatrix);\r\n effect.setMatrix(\"transform\", this.transformMatrix);\r\n\r\n // Texture\r\n effect.setTexture(\"fontAtlas\", this._font.textures[0]);\r\n effect.setDirectColor4(\"uColor\", this.color);\r\n effect.setDirectColor4(\"uStrokeColor\", this.strokeColor);\r\n effect.setFloat(\"thickness\", this.thicknessControl * 0.9);\r\n effect.setFloat(\"uStrokeInsetWidth\", this.strokeInsetWidth);\r\n effect.setFloat(\"uStrokeOutsetWidth\", this.strokeOutsetWidth);\r\n\r\n const instanceCount = this._charMatrices.length / 16;\r\n\r\n // Need update?\r\n if (this._isDirty) {\r\n this._isDirty = false;\r\n\r\n if (this._worldBuffer!.getBuffer()!.capacity / 4 < instanceCount * 16) {\r\n this._resizeBuffers(instanceCount);\r\n }\r\n\r\n this._worldBuffer!.update(this._charMatrices);\r\n this._uvBuffer!.update(this._charUvs);\r\n }\r\n\r\n if (this._useVAO) {\r\n if (!this._vertexArrayObject) {\r\n this._vertexArrayObject = (engine as ThinEngine).recordVertexArrayObject(this._vertexBuffers, null, effect);\r\n }\r\n (engine as ThinEngine).bindVertexArrayObject(this._vertexArrayObject, null);\r\n } else {\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, null, effect);\r\n }\r\n\r\n engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, instanceCount);\r\n engine.unbindInstanceAttributes();\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n if (this.ignoreDepthBuffer) {\r\n engine.setDepthBuffer(true);\r\n }\r\n }\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._worldBuffer) {\r\n this._worldBuffer.dispose();\r\n this._worldBuffer = null;\r\n }\r\n\r\n if (this._uvBuffer) {\r\n this._uvBuffer.dispose();\r\n this._uvBuffer = null;\r\n }\r\n\r\n if (this._spriteBuffer) {\r\n this._spriteBuffer.dispose();\r\n this._spriteBuffer = null;\r\n }\r\n\r\n if (this._vertexArrayObject) {\r\n (this._engine as ThinEngine).releaseVertexArrayObject(this._vertexArrayObject);\r\n (<any>this._vertexArrayObject) = null;\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new TextRenderer instance asynchronously\r\n * @param font define the font asset to use\r\n * @param engine define the engine to use\r\n * @returns a promise that resolves to the created TextRenderer instance\r\n */\r\n public static async CreateTextRendererAsync(font: FontAsset, engine: AbstractEngine) {\r\n if (!engine.getCaps().instancedArrays || !engine._features.supportSpriteInstancing) {\r\n throw new Error(\"Instanced arrays are required for MSDF text rendering.\");\r\n }\r\n\r\n let shaderLanguage = ShaderLanguage.GLSL;\r\n let vertex: string;\r\n let fragment: string;\r\n if (engine.isWebGPU) {\r\n shaderLanguage = ShaderLanguage.WGSL;\r\n vertex = (await import(\"./shadersWGSL/msdf.vertex\")).msdfVertexShaderWGSL.shader;\r\n fragment = (await import(\"./shadersWGSL/msdf.fragment\")).msdfPixelShaderWGSL.shader;\r\n } else {\r\n vertex = (await import(\"./shaders/msdf.vertex\")).msdfVertexShader.shader;\r\n fragment = (await import(\"./shaders/msdf.fragment\")).msdfPixelShader.shader;\r\n }\r\n\r\n const textRenderer = new TextRenderer(engine, shaderLanguage, font);\r\n textRenderer._setShaders(vertex, fragment);\r\n\r\n return textRenderer;\r\n }\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onerjs/addons",
|
|
3
|
-
"version": "8.42.
|
|
3
|
+
"version": "8.42.9",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"module": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"postcompile": "build-tools -c add-js-to-es6"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@onerjs/core": "8.42.
|
|
21
|
+
"@onerjs/core": "8.42.9",
|
|
22
22
|
"@dev/addons": "^1.0.0",
|
|
23
23
|
"@dev/build-tools": "^1.0.0"
|
|
24
24
|
},
|