@onerjs/addons 8.31.9 → 8.32.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/atmosphere/Shaders/ShadersInclude/atmosphereFunctions.js +18 -3
  2. package/atmosphere/Shaders/ShadersInclude/atmosphereFunctions.js.map +1 -1
  3. package/atmosphere/Shaders/aerialPerspective.fragment.js +3 -2
  4. package/atmosphere/Shaders/aerialPerspective.fragment.js.map +1 -1
  5. package/atmosphere/Shaders/compositeAerialPerspective.fragment.js +2 -1
  6. package/atmosphere/Shaders/compositeAerialPerspective.fragment.js.map +1 -1
  7. package/atmosphere/Shaders/compositeGlobeAtmosphere.fragment.js +9 -6
  8. package/atmosphere/Shaders/compositeGlobeAtmosphere.fragment.js.map +1 -1
  9. package/atmosphere/Shaders/compositeSky.fragment.js +9 -6
  10. package/atmosphere/Shaders/compositeSky.fragment.js.map +1 -1
  11. package/atmosphere/Shaders/diffuseSkyIrradiance.fragment.js +3 -4
  12. package/atmosphere/Shaders/diffuseSkyIrradiance.fragment.js.map +1 -1
  13. package/atmosphere/Shaders/multiScattering.fragment.js +4 -3
  14. package/atmosphere/Shaders/multiScattering.fragment.js.map +1 -1
  15. package/atmosphere/Shaders/skyView.fragment.js +3 -2
  16. package/atmosphere/Shaders/skyView.fragment.js.map +1 -1
  17. package/atmosphere/Shaders/transmittance.fragment.js +2 -1
  18. package/atmosphere/Shaders/transmittance.fragment.js.map +1 -1
  19. package/atmosphere/atmosphere.js +3 -3
  20. package/atmosphere/atmosphere.js.map +1 -1
  21. package/atmosphere/atmosphereOptions.js +1 -1
  22. package/atmosphere/atmosphereOptions.js.map +1 -1
  23. package/atmosphere/atmospherePBRMaterialPlugin.d.ts +2 -0
  24. package/atmosphere/atmospherePBRMaterialPlugin.js +9 -1
  25. package/atmosphere/atmospherePBRMaterialPlugin.js.map +1 -1
  26. package/atmosphere/atmospherePerCameraVariables.js +1 -1
  27. package/atmosphere/atmospherePerCameraVariables.js.map +1 -1
  28. package/atmosphere/atmospherePhysicalProperties.js +1 -1
  29. package/atmosphere/atmospherePhysicalProperties.js.map +1 -1
  30. package/atmosphere/atmospherePhysicalPropertiesOptions.js +1 -1
  31. package/atmosphere/atmospherePhysicalPropertiesOptions.js.map +1 -1
  32. package/atmosphere/diffuseSkyIrradianceLut.js +7 -5
  33. package/atmosphere/diffuseSkyIrradianceLut.js.map +1 -1
  34. package/atmosphere/index.js +1 -1
  35. package/atmosphere/index.js.map +1 -1
  36. package/atmosphere/sampling.js +1 -1
  37. package/atmosphere/sampling.js.map +1 -1
  38. package/atmosphere/transmittanceLut.js +5 -4
  39. package/atmosphere/transmittanceLut.js.map +1 -1
  40. package/htmlMesh/pointerEventsCaptureBehavior.d.ts +4 -0
  41. package/htmlMesh/pointerEventsCaptureBehavior.js +6 -0
  42. package/htmlMesh/pointerEventsCaptureBehavior.js.map +1 -1
  43. package/package.json +2 -2
  44. package/atmosphere/test/unit/sampling.test.d.ts +0 -1
  45. package/atmosphere/test/unit/sampling.test.js +0 -77
  46. package/atmosphere/test/unit/sampling.test.js.map +0 -1
@@ -1,4 +1,4 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
- // MIT License
2
+ // Licensed under the MIT License.
3
3
  export {};
4
4
  //# sourceMappingURL=atmosphereOptions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"atmosphereOptions.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmosphereOptions.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,cAAc","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// MIT License\r\n\r\nimport type { AtmospherePhysicalProperties } from \"./atmospherePhysicalProperties\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { IColor3Like } from \"core/Maths/math.like\";\r\n\r\n/**\r\n * Creation options for the {@link Atmosphere}.\r\n */\r\nexport interface IAtmosphereOptions {\r\n /**\r\n * The properties that define the atmosphere's composition and size.\r\n */\r\n physicalProperties?: AtmospherePhysicalProperties;\r\n\r\n /**\r\n * An optional depth texture that will be used by the fullscreen passes that render the sky, aerial perspective, or globe atmosphere.\r\n * This enables deferred rendering scenarios, where atmospheric effects need to be composited onto geometry buffers.\r\n * Expects infinite far plane on the camera (camera.maxZ = 0) and a non-linear depth to be stored in the red channel.\r\n */\r\n depthTexture?: BaseTexture;\r\n\r\n /**\r\n * Controls the overall brightness of the atmosphere rendering.\r\n * A value of 1.0 is physically correct.\r\n */\r\n exposure?: number;\r\n\r\n /**\r\n * Whether the light values should be specified in linear space.\r\n * Set to true when using PBRMaterials, which expect linear light values.\r\n */\r\n isLinearSpaceLight?: boolean;\r\n\r\n /**\r\n * Whether the composition of the sky should be in linear space.\r\n * Set to true for HDR rendering or when using image post-processes.\r\n */\r\n isLinearSpaceComposition?: boolean;\r\n\r\n /**\r\n * Whether to apply approximate transmittance to dim surfaces behind the atmosphere.\r\n * When true, distant surfaces are dimmed using a grayscale approximation of transmittance.\r\n */\r\n applyApproximateTransmittance?: boolean;\r\n\r\n /**\r\n * Whether to use the sky view LUT for compositing the sky.\r\n * When false, full ray marching is required (slower).\r\n */\r\n isSkyViewLutEnabled?: boolean;\r\n\r\n /**\r\n * Whether to use the aerial perspective LUT.\r\n * When false, full ray marching is required for aerial perspective (slower).\r\n */\r\n isAerialPerspectiveLutEnabled?: boolean;\r\n\r\n /**\r\n * Radiance bias applied to the aerial perspective.\r\n * Positive values brighten the aerial perspective, negative values darken it.\r\n * The default is 0 (no change).\r\n */\r\n aerialPerspectiveRadianceBias?: number;\r\n\r\n /**\r\n * Scale factor for the amount of light transmitted into aerial perspective from the light source.\r\n * The default is 1 (no scaling).\r\n */\r\n aerialPerspectiveTransmittanceScale?: number;\r\n\r\n /**\r\n * Amount of saturation applied to the aerial perspective.\r\n * Lower values make the aerial perspective more gray.\r\n * The default is 1 (no saturation change).\r\n */\r\n aerialPerspectiveSaturation?: number;\r\n\r\n /**\r\n * Overall intensity multiplier for the aerial perspective effect.\r\n * Higher values increase haziness.\r\n * The default is 1 (no intensity change).\r\n */\r\n aerialPerspectiveIntensity?: number;\r\n\r\n /**\r\n * Whether to use the diffuse sky irradiance LUT.\r\n */\r\n isDiffuseSkyIrradianceLutEnabled?: boolean;\r\n\r\n /**\r\n * Higher values result in more desaturated diffuse irradiance.\r\n * The default is 0 (no desaturation).\r\n */\r\n diffuseSkyIrradianceDesaturationFactor?: number;\r\n\r\n /**\r\n * Overall intensity multiplier for the diffuse irradiance.\r\n * The default is 1 (no intensity change).\r\n */\r\n diffuseSkyIrradianceIntensity?: number;\r\n\r\n /**\r\n * Controls the intensity of the additional diffuse irradiance amount.\r\n */\r\n additionalDiffuseSkyIrradianceIntensity?: number;\r\n\r\n /**\r\n * Controls the color of the additional diffuse irradiance amount.\r\n */\r\n additionalDiffuseSkyIrradianceColor?: IColor3Like;\r\n\r\n /**\r\n * Higher values increase the contribution of multiple scattering to the overall atmosphere.\r\n * Default is 1 (no intensity change).\r\n */\r\n multiScatteringIntensity?: number;\r\n\r\n /**\r\n * Average color of light reflected off the ground.\r\n * Affects the multiply scattered light contribution in the atmosphere.\r\n */\r\n groundAlbedo?: IColor3Like;\r\n\r\n /**\r\n * Minimum color for multiple scattering.\r\n * Useful for creating a quick, but not physically accurate, night sky.\r\n */\r\n minimumMultiScatteringColor?: IColor3Like;\r\n\r\n /**\r\n * Controls the intensity of the {@link minimumMultiScatteringColor}.\r\n * Useful for creating a quick, but not physically accurate, night sky.\r\n */\r\n minimumMultiScatteringIntensity?: number;\r\n\r\n /**\r\n * Height in kilometers of the scene's origin relative to the planet surface.\r\n */\r\n originHeight?: number;\r\n\r\n /**\r\n * The rendering group ID for the sky compositor.\r\n * When specified, the sky will only be rendered for this group.\r\n * If not specified, defaults to group 0.\r\n */\r\n skyRenderingGroup?: number;\r\n\r\n /**\r\n * The rendering group ID for the aerial perspective compositor.\r\n * When specified, aerial perspective will only be rendered for this group.\r\n * If not specified, defaults to group 0.\r\n */\r\n aerialPerspectiveRenderingGroup?: number;\r\n\r\n /**\r\n * The rendering group ID for the globe atmosphere compositor.\r\n * When specified, the globe atmosphere will only be rendered for this group.\r\n * If not specified, defaults to group 0.\r\n */\r\n globeAtmosphereRenderingGroup?: number;\r\n}\r\n"]}
1
+ {"version":3,"file":"atmosphereOptions.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmosphereOptions.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// Licensed under the MIT License.\r\n\r\nimport type { AtmospherePhysicalProperties } from \"./atmospherePhysicalProperties\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { IColor3Like } from \"core/Maths/math.like\";\r\n\r\n/**\r\n * Creation options for the {@link Atmosphere}.\r\n */\r\nexport interface IAtmosphereOptions {\r\n /**\r\n * The properties that define the atmosphere's composition and size.\r\n */\r\n physicalProperties?: AtmospherePhysicalProperties;\r\n\r\n /**\r\n * An optional depth texture that will be used by the fullscreen passes that render the sky, aerial perspective, or globe atmosphere.\r\n * This enables deferred rendering scenarios, where atmospheric effects need to be composited onto geometry buffers.\r\n * Expects infinite far plane on the camera (camera.maxZ = 0) and a non-linear depth to be stored in the red channel.\r\n */\r\n depthTexture?: BaseTexture;\r\n\r\n /**\r\n * Controls the overall brightness of the atmosphere rendering.\r\n * A value of 1.0 is physically correct.\r\n */\r\n exposure?: number;\r\n\r\n /**\r\n * Whether the light values should be specified in linear space.\r\n * Set to true when using PBRMaterials, which expect linear light values.\r\n */\r\n isLinearSpaceLight?: boolean;\r\n\r\n /**\r\n * Whether the composition of the sky should be in linear space.\r\n * Set to true for HDR rendering or when using image post-processes.\r\n */\r\n isLinearSpaceComposition?: boolean;\r\n\r\n /**\r\n * Whether to apply approximate transmittance to dim surfaces behind the atmosphere.\r\n * When true, distant surfaces are dimmed using a grayscale approximation of transmittance.\r\n */\r\n applyApproximateTransmittance?: boolean;\r\n\r\n /**\r\n * Whether to use the sky view LUT for compositing the sky.\r\n * When false, full ray marching is required (slower).\r\n */\r\n isSkyViewLutEnabled?: boolean;\r\n\r\n /**\r\n * Whether to use the aerial perspective LUT.\r\n * When false, full ray marching is required for aerial perspective (slower).\r\n */\r\n isAerialPerspectiveLutEnabled?: boolean;\r\n\r\n /**\r\n * Radiance bias applied to the aerial perspective.\r\n * Positive values brighten the aerial perspective, negative values darken it.\r\n * The default is 0 (no change).\r\n */\r\n aerialPerspectiveRadianceBias?: number;\r\n\r\n /**\r\n * Scale factor for the amount of light transmitted into aerial perspective from the light source.\r\n * The default is 1 (no scaling).\r\n */\r\n aerialPerspectiveTransmittanceScale?: number;\r\n\r\n /**\r\n * Amount of saturation applied to the aerial perspective.\r\n * Lower values make the aerial perspective more gray.\r\n * The default is 1 (no saturation change).\r\n */\r\n aerialPerspectiveSaturation?: number;\r\n\r\n /**\r\n * Overall intensity multiplier for the aerial perspective effect.\r\n * Higher values increase haziness.\r\n * The default is 1 (no intensity change).\r\n */\r\n aerialPerspectiveIntensity?: number;\r\n\r\n /**\r\n * Whether to use the diffuse sky irradiance LUT.\r\n */\r\n isDiffuseSkyIrradianceLutEnabled?: boolean;\r\n\r\n /**\r\n * Higher values result in more desaturated diffuse irradiance.\r\n * The default is 0 (no desaturation).\r\n */\r\n diffuseSkyIrradianceDesaturationFactor?: number;\r\n\r\n /**\r\n * Overall intensity multiplier for the diffuse irradiance.\r\n * The default is 1 (no intensity change).\r\n */\r\n diffuseSkyIrradianceIntensity?: number;\r\n\r\n /**\r\n * Controls the intensity of the additional diffuse irradiance amount.\r\n */\r\n additionalDiffuseSkyIrradianceIntensity?: number;\r\n\r\n /**\r\n * Controls the color of the additional diffuse irradiance amount.\r\n */\r\n additionalDiffuseSkyIrradianceColor?: IColor3Like;\r\n\r\n /**\r\n * Higher values increase the contribution of multiple scattering to the overall atmosphere.\r\n * Default is 1 (no intensity change).\r\n */\r\n multiScatteringIntensity?: number;\r\n\r\n /**\r\n * Average color of light reflected off the ground.\r\n * Affects the multiply scattered light contribution in the atmosphere.\r\n */\r\n groundAlbedo?: IColor3Like;\r\n\r\n /**\r\n * Minimum color for multiple scattering.\r\n * Useful for creating a quick, but not physically accurate, night sky.\r\n */\r\n minimumMultiScatteringColor?: IColor3Like;\r\n\r\n /**\r\n * Controls the intensity of the {@link minimumMultiScatteringColor}.\r\n * Useful for creating a quick, but not physically accurate, night sky.\r\n */\r\n minimumMultiScatteringIntensity?: number;\r\n\r\n /**\r\n * Height in kilometers of the scene's origin relative to the planet surface.\r\n */\r\n originHeight?: number;\r\n\r\n /**\r\n * The rendering group ID for the sky compositor.\r\n * When specified, the sky will only be rendered for this group.\r\n * If not specified, defaults to group 0.\r\n */\r\n skyRenderingGroup?: number;\r\n\r\n /**\r\n * The rendering group ID for the aerial perspective compositor.\r\n * When specified, aerial perspective will only be rendered for this group.\r\n * If not specified, defaults to group 0.\r\n */\r\n aerialPerspectiveRenderingGroup?: number;\r\n\r\n /**\r\n * The rendering group ID for the globe atmosphere compositor.\r\n * When specified, the globe atmosphere will only be rendered for this group.\r\n * If not specified, defaults to group 0.\r\n */\r\n globeAtmosphereRenderingGroup?: number;\r\n}\r\n"]}
@@ -9,6 +9,8 @@ declare class AtmospherePBRMaterialDefines extends MaterialDefines {
9
9
  USE_AERIAL_PERSPECTIVE_LUT: boolean;
10
10
  APPLY_AERIAL_PERSPECTIVE_INTENSITY: boolean;
11
11
  APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS: boolean;
12
+ SAMPLE_TRANSMITTANCE_LUT: boolean;
13
+ EXCLUDE_RAY_MARCHING_FUNCTIONS: boolean;
12
14
  /**
13
15
  * Constructs the {@link AtmospherePBRMaterialDefines}.
14
16
  * @param useAerialPerspectiveLut - Whether to use the aerial perspective LUT.
@@ -1,5 +1,5 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
- // MIT License
2
+ // Licensed under the MIT License.
3
3
  import { MaterialDefines } from "@onerjs/core/Materials/materialDefines.js";
4
4
  import { MaterialPluginBase } from "@onerjs/core/Materials/materialPluginBase.js";
5
5
  import { Vector3FromFloatsToRef, Vector3ScaleToRef } from "@onerjs/core/Maths/math.vector.functions.js";
@@ -14,6 +14,10 @@ class AtmospherePBRMaterialDefines extends MaterialDefines {
14
14
  this.APPLY_AERIAL_PERSPECTIVE_INTENSITY = false;
15
15
  // eslint-disable-next-line @typescript-eslint/naming-convention
16
16
  this.APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS = false;
17
+ // eslint-disable-next-line @typescript-eslint/naming-convention
18
+ this.SAMPLE_TRANSMITTANCE_LUT = true;
19
+ // eslint-disable-next-line @typescript-eslint/naming-convention
20
+ this.EXCLUDE_RAY_MARCHING_FUNCTIONS = true;
17
21
  this.USE_AERIAL_PERSPECTIVE_LUT = useAerialPerspectiveLut;
18
22
  }
19
23
  }
@@ -54,6 +58,10 @@ export class AtmospherePBRMaterialPlugin extends MaterialPluginBase {
54
58
  APPLY_AERIAL_PERSPECTIVE_INTENSITY: _isAerialPerspectiveEnabled && _atmosphere.aerialPerspectiveIntensity !== 1.0,
55
59
  // eslint-disable-next-line @typescript-eslint/naming-convention
56
60
  APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS: _isAerialPerspectiveEnabled && _atmosphere.aerialPerspectiveRadianceBias !== 0.0,
61
+ // eslint-disable-next-line @typescript-eslint/naming-convention
62
+ SAMPLE_TRANSMITTANCE_LUT: true,
63
+ // eslint-disable-next-line @typescript-eslint/naming-convention
64
+ EXCLUDE_RAY_MARCHING_FUNCTIONS: true,
57
65
  }, false, // addPluginToList -- false because we need to control when this is added to the list
58
66
  true, // enable
59
67
  true // resolveIncludes
@@ -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// 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\n\r\nclass AtmospherePBRMaterialDefines extends MaterialDefines {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public USE_AERIAL_PERSPECTIVE_LUT: boolean;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public APPLY_AERIAL_PERSPECTIVE_INTENSITY = false;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS = false;\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 // eslint-disable-next-line @typescript-eslint/naming-convention\r\n USE_CUSTOM_REFLECTION: _atmosphere.diffuseSkyIrradianceLut !== null,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_BEFORE_FOG: _isAerialPerspectiveEnabled,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n USE_AERIAL_PERSPECTIVE_LUT: _isAerialPerspectiveEnabled && _atmosphere.isAerialPerspectiveLutEnabled,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n APPLY_AERIAL_PERSPECTIVE_INTENSITY: _isAerialPerspectiveEnabled && _atmosphere.aerialPerspectiveIntensity !== 1.0,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS: _isAerialPerspectiveEnabled && _atmosphere.aerialPerspectiveRadianceBias !== 0.0,\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 getUniformBuffersNames(_ubos: string[]): void {\r\n const uniformBuffer = this._atmosphere.uniformBuffer;\r\n if (uniformBuffer.useUbo) {\r\n _ubos.push(uniformBuffer.name);\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): 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 = this._atmosphere.uniformBuffer.useUbo;\r\n const atmosphereImportSnippet = useAtmosphereUbo ? \"#include<atmosphereUboDeclaration>\" : \"#include<atmosphereFragmentDeclaration>\";\r\n\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 }\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\n\r\nclass AtmospherePBRMaterialDefines extends MaterialDefines {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public USE_AERIAL_PERSPECTIVE_LUT: boolean;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public APPLY_AERIAL_PERSPECTIVE_INTENSITY = false;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS = false;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public SAMPLE_TRANSMITTANCE_LUT = true;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\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 // eslint-disable-next-line @typescript-eslint/naming-convention\r\n USE_CUSTOM_REFLECTION: _atmosphere.diffuseSkyIrradianceLut !== null,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_BEFORE_FOG: _isAerialPerspectiveEnabled,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n USE_AERIAL_PERSPECTIVE_LUT: _isAerialPerspectiveEnabled && _atmosphere.isAerialPerspectiveLutEnabled,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n APPLY_AERIAL_PERSPECTIVE_INTENSITY: _isAerialPerspectiveEnabled && _atmosphere.aerialPerspectiveIntensity !== 1.0,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS: _isAerialPerspectiveEnabled && _atmosphere.aerialPerspectiveRadianceBias !== 0.0,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n SAMPLE_TRANSMITTANCE_LUT: true,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\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 getUniformBuffersNames(_ubos: string[]): void {\r\n const uniformBuffer = this._atmosphere.uniformBuffer;\r\n if (uniformBuffer.useUbo) {\r\n _ubos.push(uniformBuffer.name);\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): 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 = this._atmosphere.uniformBuffer.useUbo;\r\n const atmosphereImportSnippet = useAtmosphereUbo ? \"#include<atmosphereUboDeclaration>\" : \"#include<atmosphereFragmentDeclaration>\";\r\n\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 }\r\n}\r\n"]}
@@ -1,5 +1,5 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
- // MIT License
2
+ // Licensed under the MIT License.
3
3
  import { Matrix, Vector3, Vector4 } from "@onerjs/core/Maths/math.vector.js";
4
4
  import { Ray } from "@onerjs/core/Culling/ray.core.js";
5
5
  import { Vector3Dot } from "@onerjs/core/Maths/math.vector.functions.js";
@@ -1 +1 @@
1
- {"version":3,"file":"atmospherePerCameraVariables.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmospherePerCameraVariables.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// MIT License\r\n\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport type { IMatrixLike, IVector3Like, IVector4Like } from \"core/Maths/math.like\";\r\nimport { Matrix, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { Ray } from \"core/Culling/ray.core\";\r\nimport { Vector3Dot } from \"core/Maths/math.vector.functions\";\r\n\r\nconst TempRay = new Ray(Vector3.Zero(), Vector3.Zero());\r\n\r\n/**\r\n * Variables that are used to render the atmosphere and are computed per-camera.\r\n */\r\nexport class AtmospherePerCameraVariables {\r\n private _inverseViewProjectionMatrixWithoutTranslation = Matrix.Identity();\r\n private _directionToLightRelativeToCameraGeocentricNormal = Vector3.Up();\r\n private _cosAngleLightToZenith = 0;\r\n private _cameraRadius = 0;\r\n private _clampedCameraRadius = 0;\r\n private _cameraHeight = 0;\r\n private _clampedCameraHeight = 0;\r\n private _cameraPositionGlobal = new Vector3();\r\n private _clampedCameraPositionGlobal = new Vector3();\r\n private _cosCameraHorizonAngleFromZenith = 0;\r\n private _sinCameraAtmosphereHorizonAngleFromNadir = 0;\r\n private _cameraGeocentricNormal = Vector3.Up();\r\n private _cameraForward = Vector3.Down();\r\n private _cameraNearPlane = 0;\r\n private _cameraPosition = new Vector3();\r\n private _viewport = new Vector4();\r\n private _lastViewMatrix = Matrix.Identity();\r\n private _lastProjectionMatrix = Matrix.Identity();\r\n private _inverseViewMatrixWithoutTranslation = Matrix.Identity();\r\n private _inverseProjectionMatrix = Matrix.Identity();\r\n\r\n /**\r\n * The inverse view projection matrix is used to unproject rays.\r\n * To avoid precision issues, the translation part of the matrix has been removed.\r\n */\r\n public get inverseViewProjectionMatrixWithoutTranslation(): IMatrixLike {\r\n return this._inverseViewProjectionMatrixWithoutTranslation;\r\n }\r\n\r\n /**\r\n * The direction to the light relative to the geocentric normal under the camera.\r\n */\r\n public get directionToLightRelativeToCameraGeocentricNormal(): IVector3Like {\r\n return this._directionToLightRelativeToCameraGeocentricNormal;\r\n }\r\n\r\n /**\r\n * The cosine of the angle between the light direction and zenith.\r\n */\r\n public get cosAngleLightToZenith(): number {\r\n return this._cosAngleLightToZenith;\r\n }\r\n\r\n /**\r\n * The distance from the camera to the planet origin in kilometers.\r\n */\r\n public get cameraRadius(): number {\r\n return this._cameraRadius;\r\n }\r\n\r\n /**\r\n * The distance from the camera to the planet origin, clamped to the planet radius offset, in kilometers.\r\n */\r\n public get clampedCameraRadius(): number {\r\n return this._clampedCameraRadius;\r\n }\r\n\r\n /**\r\n * The height of the camera above the planet surface in kilometers.\r\n */\r\n public get cameraHeight(): number {\r\n return this._cameraHeight;\r\n }\r\n\r\n /**\r\n * The height of the camera above the planet surface, clamped to the planet radius offset, in kilometers.\r\n */\r\n public get clampedCameraHeight(): number {\r\n return this._clampedCameraHeight;\r\n }\r\n\r\n /**\r\n * The camera position in global space kilometers.\r\n *\r\n * The behavior of this value depends on whether floating origin mode is enabled:\r\n * - If floating origin mode is enabled, this is simply the camera's global position scaled to kilometers. The atmosphere's origin height is used to offset the camera position along its geocentric normal.\r\n * - If floating origin mode is disabled, the camera's y position is offset by the planet radius plus any origin height.\r\n */\r\n public get cameraPositionGlobal(): IVector3Like {\r\n return this._cameraPositionGlobal;\r\n }\r\n\r\n /**\r\n * The camera position, clamped to the planet radius offset, in global space kilometers.\r\n * See {@link cameraPositionGlobal} for details on how the value is computed.\r\n */\r\n public get clampedCameraPositionGlobal(): IVector3Like {\r\n return this._clampedCameraPositionGlobal;\r\n }\r\n\r\n /**\r\n * The cosine of the angle from the zenith to the horizon of the planet, measured from the camera position.\r\n */\r\n public get cosCameraHorizonAngleFromZenith(): number {\r\n return this._cosCameraHorizonAngleFromZenith;\r\n }\r\n\r\n /**\r\n * The sine of the angle from the nadir to the horizon of the atmosphere, measured from the camera position.\r\n */\r\n public get sinCameraAtmosphereHorizonAngleFromNadir(): number {\r\n return this._sinCameraAtmosphereHorizonAngleFromNadir;\r\n }\r\n\r\n /**\r\n * The geocentric normal of the camera in global space i.e., the normalization of {@link cameraPositionGlobal}.\r\n * Note the behavior of this value depends on whether floating origin mode is enabled. See {@link cameraPositionGlobal} for details.\r\n */\r\n public get cameraGeocentricNormal(): IVector3Like {\r\n return this._cameraGeocentricNormal;\r\n }\r\n\r\n /**\r\n * The camera's forward direction in world space.\r\n */\r\n public get cameraForward(): IVector3Like {\r\n return this._cameraForward;\r\n }\r\n\r\n /**\r\n * The distance to the near plane of the camera.\r\n */\r\n public get cameraNearPlane(): number {\r\n return this._cameraNearPlane;\r\n }\r\n\r\n /**\r\n * The camera's position in world space.\r\n */\r\n public get cameraPosition(): IVector3Like {\r\n return this._cameraPosition;\r\n }\r\n\r\n /**\r\n * The viewport for the camera.\r\n */\r\n public get viewport(): IVector4Like {\r\n return this._viewport;\r\n }\r\n\r\n /**\r\n * Updates the variables.\r\n * @param camera - The camera to update the variables for.\r\n * @param planetRadius - The radius of the planet in kilometers.\r\n * @param planetRadiusWithOffset - The radius of the planet with the offset in kilometers.\r\n * @param atmosphereRadius - The radius of the atmosphere in kilometers.\r\n * @param directionToLight - The direction to the light in world space.\r\n * @param originHeight - The height of the origin (distance from planet's surface) in kilometers.\r\n */\r\n public update(camera: Camera, planetRadius: number, planetRadiusWithOffset: number, atmosphereRadius: number, directionToLight: IVector3Like, originHeight: number): void {\r\n this._cameraNearPlane = camera.minZ;\r\n this._cameraForward.copyFrom(camera.getForwardRayToRef(TempRay, 1).direction);\r\n\r\n const scene = camera.getScene();\r\n const engine = scene.getEngine();\r\n this._viewport.copyFromFloats(0.0, 0.0, engine.getRenderWidth(), engine.getRenderHeight());\r\n\r\n // Compute inverse view projection matrix, but remove the translational component to increase precision.\r\n const viewMatrix = camera.getViewMatrix();\r\n const projectionMatrix = camera.getProjectionMatrix();\r\n const lastViewMatrix = this._lastViewMatrix;\r\n const lastProjectionMatrix = this._lastProjectionMatrix;\r\n if (!lastViewMatrix.equals(viewMatrix) || !lastProjectionMatrix.equals(projectionMatrix)) {\r\n lastViewMatrix.copyFrom(viewMatrix);\r\n lastViewMatrix.setTranslation(Vector3.ZeroReadOnly);\r\n lastViewMatrix.invertToRef(this._inverseViewMatrixWithoutTranslation);\r\n\r\n lastProjectionMatrix.copyFrom(projectionMatrix);\r\n lastProjectionMatrix.invertToRef(this._inverseProjectionMatrix);\r\n this._inverseProjectionMatrix.multiplyToRef(this._inverseViewMatrixWithoutTranslation, this._inverseViewProjectionMatrixWithoutTranslation);\r\n }\r\n\r\n // Compute the global space position of the camera in kilometers.\r\n const cameraPositionGlobal = this._cameraPosition.copyFrom(camera.globalPosition).scaleToRef(0.001, this._cameraPositionGlobal); // scale to kilometers\r\n\r\n // Apply the origin height to the camera position, and in doing so, compute the camera geocentric normal.\r\n if (scene.floatingOriginMode) {\r\n // When in floating origin mode, assume world space origin is at the planet center.\r\n // Therefore \"up\" is away from the planet center (0, 0, 0).\r\n cameraPositionGlobal.normalizeToRef(this._cameraGeocentricNormal);\r\n this._cameraGeocentricNormal.scaleAndAddToRef(originHeight, cameraPositionGlobal);\r\n } else {\r\n // If not in floating origin mode, offset the camera position by the origin height.\r\n // Assume the origin is directly above the planet surface along the up axis (y axis).\r\n cameraPositionGlobal.y += planetRadius + originHeight;\r\n cameraPositionGlobal.normalizeToRef(this._cameraGeocentricNormal);\r\n }\r\n\r\n this._cameraRadius = cameraPositionGlobal.length(); // distance from planet center\r\n this._cameraHeight = this._cameraRadius - planetRadius; // height above planet surface\r\n\r\n // Clamp the camera parameters.\r\n this._clampedCameraRadius = this._cameraRadius;\r\n if (this._clampedCameraRadius < planetRadiusWithOffset) {\r\n this._clampedCameraRadius = planetRadiusWithOffset;\r\n this._cameraGeocentricNormal.scaleToRef(planetRadiusWithOffset, this._clampedCameraPositionGlobal);\r\n } else {\r\n this._clampedCameraPositionGlobal.copyFrom(cameraPositionGlobal);\r\n }\r\n\r\n this._cosCameraHorizonAngleFromZenith = ComputeCosHorizonAngleFromZenith(planetRadius, this._clampedCameraRadius);\r\n this._sinCameraAtmosphereHorizonAngleFromNadir = Math.min(1.0, atmosphereRadius / this._clampedCameraRadius);\r\n this._clampedCameraHeight = this._clampedCameraRadius - planetRadius;\r\n\r\n // Compute the direction to the light relative to the camera's geocentric normal.\r\n {\r\n this._cosAngleLightToZenith = Vector3Dot(directionToLight, this._cameraGeocentricNormal);\r\n const lightZenithSinAngle = Math.sqrt(Math.max(0.0, 1.0 - this._cosAngleLightToZenith * this._cosAngleLightToZenith));\r\n this._directionToLightRelativeToCameraGeocentricNormal.copyFromFloats(lightZenithSinAngle, this._cosAngleLightToZenith, 0.0);\r\n this._directionToLightRelativeToCameraGeocentricNormal.normalize();\r\n }\r\n }\r\n}\r\n\r\nconst ComputeCosHorizonAngleFromZenith = (planetRadius: number, radius: number): number => {\r\n const sinHorizonAngleFromNadir = Math.min(1, planetRadius / radius);\r\n const cosHorizonAngleFromNadir = Math.sqrt(1 - sinHorizonAngleFromNadir * sinHorizonAngleFromNadir);\r\n const cosHorizonAngleFromZenith = -cosHorizonAngleFromNadir;\r\n return cosHorizonAngleFromZenith;\r\n};\r\n"]}
1
+ {"version":3,"file":"atmospherePerCameraVariables.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmospherePerCameraVariables.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// Licensed under the MIT License.\r\n\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport type { IMatrixLike, IVector3Like, IVector4Like } from \"core/Maths/math.like\";\r\nimport { Matrix, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { Ray } from \"core/Culling/ray.core\";\r\nimport { Vector3Dot } from \"core/Maths/math.vector.functions\";\r\n\r\nconst TempRay = new Ray(Vector3.Zero(), Vector3.Zero());\r\n\r\n/**\r\n * Variables that are used to render the atmosphere and are computed per-camera.\r\n */\r\nexport class AtmospherePerCameraVariables {\r\n private _inverseViewProjectionMatrixWithoutTranslation = Matrix.Identity();\r\n private _directionToLightRelativeToCameraGeocentricNormal = Vector3.Up();\r\n private _cosAngleLightToZenith = 0;\r\n private _cameraRadius = 0;\r\n private _clampedCameraRadius = 0;\r\n private _cameraHeight = 0;\r\n private _clampedCameraHeight = 0;\r\n private _cameraPositionGlobal = new Vector3();\r\n private _clampedCameraPositionGlobal = new Vector3();\r\n private _cosCameraHorizonAngleFromZenith = 0;\r\n private _sinCameraAtmosphereHorizonAngleFromNadir = 0;\r\n private _cameraGeocentricNormal = Vector3.Up();\r\n private _cameraForward = Vector3.Down();\r\n private _cameraNearPlane = 0;\r\n private _cameraPosition = new Vector3();\r\n private _viewport = new Vector4();\r\n private _lastViewMatrix = Matrix.Identity();\r\n private _lastProjectionMatrix = Matrix.Identity();\r\n private _inverseViewMatrixWithoutTranslation = Matrix.Identity();\r\n private _inverseProjectionMatrix = Matrix.Identity();\r\n\r\n /**\r\n * The inverse view projection matrix is used to unproject rays.\r\n * To avoid precision issues, the translation part of the matrix has been removed.\r\n */\r\n public get inverseViewProjectionMatrixWithoutTranslation(): IMatrixLike {\r\n return this._inverseViewProjectionMatrixWithoutTranslation;\r\n }\r\n\r\n /**\r\n * The direction to the light relative to the geocentric normal under the camera.\r\n */\r\n public get directionToLightRelativeToCameraGeocentricNormal(): IVector3Like {\r\n return this._directionToLightRelativeToCameraGeocentricNormal;\r\n }\r\n\r\n /**\r\n * The cosine of the angle between the light direction and zenith.\r\n */\r\n public get cosAngleLightToZenith(): number {\r\n return this._cosAngleLightToZenith;\r\n }\r\n\r\n /**\r\n * The distance from the camera to the planet origin in kilometers.\r\n */\r\n public get cameraRadius(): number {\r\n return this._cameraRadius;\r\n }\r\n\r\n /**\r\n * The distance from the camera to the planet origin, clamped to the planet radius offset, in kilometers.\r\n */\r\n public get clampedCameraRadius(): number {\r\n return this._clampedCameraRadius;\r\n }\r\n\r\n /**\r\n * The height of the camera above the planet surface in kilometers.\r\n */\r\n public get cameraHeight(): number {\r\n return this._cameraHeight;\r\n }\r\n\r\n /**\r\n * The height of the camera above the planet surface, clamped to the planet radius offset, in kilometers.\r\n */\r\n public get clampedCameraHeight(): number {\r\n return this._clampedCameraHeight;\r\n }\r\n\r\n /**\r\n * The camera position in global space kilometers.\r\n *\r\n * The behavior of this value depends on whether floating origin mode is enabled:\r\n * - If floating origin mode is enabled, this is simply the camera's global position scaled to kilometers. The atmosphere's origin height is used to offset the camera position along its geocentric normal.\r\n * - If floating origin mode is disabled, the camera's y position is offset by the planet radius plus any origin height.\r\n */\r\n public get cameraPositionGlobal(): IVector3Like {\r\n return this._cameraPositionGlobal;\r\n }\r\n\r\n /**\r\n * The camera position, clamped to the planet radius offset, in global space kilometers.\r\n * See {@link cameraPositionGlobal} for details on how the value is computed.\r\n */\r\n public get clampedCameraPositionGlobal(): IVector3Like {\r\n return this._clampedCameraPositionGlobal;\r\n }\r\n\r\n /**\r\n * The cosine of the angle from the zenith to the horizon of the planet, measured from the camera position.\r\n */\r\n public get cosCameraHorizonAngleFromZenith(): number {\r\n return this._cosCameraHorizonAngleFromZenith;\r\n }\r\n\r\n /**\r\n * The sine of the angle from the nadir to the horizon of the atmosphere, measured from the camera position.\r\n */\r\n public get sinCameraAtmosphereHorizonAngleFromNadir(): number {\r\n return this._sinCameraAtmosphereHorizonAngleFromNadir;\r\n }\r\n\r\n /**\r\n * The geocentric normal of the camera in global space i.e., the normalization of {@link cameraPositionGlobal}.\r\n * Note the behavior of this value depends on whether floating origin mode is enabled. See {@link cameraPositionGlobal} for details.\r\n */\r\n public get cameraGeocentricNormal(): IVector3Like {\r\n return this._cameraGeocentricNormal;\r\n }\r\n\r\n /**\r\n * The camera's forward direction in world space.\r\n */\r\n public get cameraForward(): IVector3Like {\r\n return this._cameraForward;\r\n }\r\n\r\n /**\r\n * The distance to the near plane of the camera.\r\n */\r\n public get cameraNearPlane(): number {\r\n return this._cameraNearPlane;\r\n }\r\n\r\n /**\r\n * The camera's position in world space.\r\n */\r\n public get cameraPosition(): IVector3Like {\r\n return this._cameraPosition;\r\n }\r\n\r\n /**\r\n * The viewport for the camera.\r\n */\r\n public get viewport(): IVector4Like {\r\n return this._viewport;\r\n }\r\n\r\n /**\r\n * Updates the variables.\r\n * @param camera - The camera to update the variables for.\r\n * @param planetRadius - The radius of the planet in kilometers.\r\n * @param planetRadiusWithOffset - The radius of the planet with the offset in kilometers.\r\n * @param atmosphereRadius - The radius of the atmosphere in kilometers.\r\n * @param directionToLight - The direction to the light in world space.\r\n * @param originHeight - The height of the origin (distance from planet's surface) in kilometers.\r\n */\r\n public update(camera: Camera, planetRadius: number, planetRadiusWithOffset: number, atmosphereRadius: number, directionToLight: IVector3Like, originHeight: number): void {\r\n this._cameraNearPlane = camera.minZ;\r\n this._cameraForward.copyFrom(camera.getForwardRayToRef(TempRay, 1).direction);\r\n\r\n const scene = camera.getScene();\r\n const engine = scene.getEngine();\r\n this._viewport.copyFromFloats(0.0, 0.0, engine.getRenderWidth(), engine.getRenderHeight());\r\n\r\n // Compute inverse view projection matrix, but remove the translational component to increase precision.\r\n const viewMatrix = camera.getViewMatrix();\r\n const projectionMatrix = camera.getProjectionMatrix();\r\n const lastViewMatrix = this._lastViewMatrix;\r\n const lastProjectionMatrix = this._lastProjectionMatrix;\r\n if (!lastViewMatrix.equals(viewMatrix) || !lastProjectionMatrix.equals(projectionMatrix)) {\r\n lastViewMatrix.copyFrom(viewMatrix);\r\n lastViewMatrix.setTranslation(Vector3.ZeroReadOnly);\r\n lastViewMatrix.invertToRef(this._inverseViewMatrixWithoutTranslation);\r\n\r\n lastProjectionMatrix.copyFrom(projectionMatrix);\r\n lastProjectionMatrix.invertToRef(this._inverseProjectionMatrix);\r\n this._inverseProjectionMatrix.multiplyToRef(this._inverseViewMatrixWithoutTranslation, this._inverseViewProjectionMatrixWithoutTranslation);\r\n }\r\n\r\n // Compute the global space position of the camera in kilometers.\r\n const cameraPositionGlobal = this._cameraPosition.copyFrom(camera.globalPosition).scaleToRef(0.001, this._cameraPositionGlobal); // scale to kilometers\r\n\r\n // Apply the origin height to the camera position, and in doing so, compute the camera geocentric normal.\r\n if (scene.floatingOriginMode) {\r\n // When in floating origin mode, assume world space origin is at the planet center.\r\n // Therefore \"up\" is away from the planet center (0, 0, 0).\r\n cameraPositionGlobal.normalizeToRef(this._cameraGeocentricNormal);\r\n this._cameraGeocentricNormal.scaleAndAddToRef(originHeight, cameraPositionGlobal);\r\n } else {\r\n // If not in floating origin mode, offset the camera position by the origin height.\r\n // Assume the origin is directly above the planet surface along the up axis (y axis).\r\n cameraPositionGlobal.y += planetRadius + originHeight;\r\n cameraPositionGlobal.normalizeToRef(this._cameraGeocentricNormal);\r\n }\r\n\r\n this._cameraRadius = cameraPositionGlobal.length(); // distance from planet center\r\n this._cameraHeight = this._cameraRadius - planetRadius; // height above planet surface\r\n\r\n // Clamp the camera parameters.\r\n this._clampedCameraRadius = this._cameraRadius;\r\n if (this._clampedCameraRadius < planetRadiusWithOffset) {\r\n this._clampedCameraRadius = planetRadiusWithOffset;\r\n this._cameraGeocentricNormal.scaleToRef(planetRadiusWithOffset, this._clampedCameraPositionGlobal);\r\n } else {\r\n this._clampedCameraPositionGlobal.copyFrom(cameraPositionGlobal);\r\n }\r\n\r\n this._cosCameraHorizonAngleFromZenith = ComputeCosHorizonAngleFromZenith(planetRadius, this._clampedCameraRadius);\r\n this._sinCameraAtmosphereHorizonAngleFromNadir = Math.min(1.0, atmosphereRadius / this._clampedCameraRadius);\r\n this._clampedCameraHeight = this._clampedCameraRadius - planetRadius;\r\n\r\n // Compute the direction to the light relative to the camera's geocentric normal.\r\n {\r\n this._cosAngleLightToZenith = Vector3Dot(directionToLight, this._cameraGeocentricNormal);\r\n const lightZenithSinAngle = Math.sqrt(Math.max(0.0, 1.0 - this._cosAngleLightToZenith * this._cosAngleLightToZenith));\r\n this._directionToLightRelativeToCameraGeocentricNormal.copyFromFloats(lightZenithSinAngle, this._cosAngleLightToZenith, 0.0);\r\n this._directionToLightRelativeToCameraGeocentricNormal.normalize();\r\n }\r\n }\r\n}\r\n\r\nconst ComputeCosHorizonAngleFromZenith = (planetRadius: number, radius: number): number => {\r\n const sinHorizonAngleFromNadir = Math.min(1, planetRadius / radius);\r\n const cosHorizonAngleFromNadir = Math.sqrt(1 - sinHorizonAngleFromNadir * sinHorizonAngleFromNadir);\r\n const cosHorizonAngleFromZenith = -cosHorizonAngleFromNadir;\r\n return cosHorizonAngleFromZenith;\r\n};\r\n"]}
@@ -1,5 +1,5 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
- // MIT License
2
+ // Licensed under the MIT License.
3
3
  import { Observable } from "@onerjs/core/Misc/observable.js";
4
4
  import { Vector3 } from "@onerjs/core/Maths/math.vector.js";
5
5
  const DefaultPlanetRadius = 6360.0;
@@ -1 +1 @@
1
- {"version":3,"file":"atmospherePhysicalProperties.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmospherePhysicalProperties.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// MIT License\r\n\r\nimport type { IAtmospherePhysicalPropertiesOptions } from \"./atmospherePhysicalPropertiesOptions\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\n\r\nconst DefaultPlanetRadius = 6360.0;\r\nconst DefaultPlanetRadiusOffset = 0.01;\r\nconst DefaultAtmosphereThickness = 100.0;\r\n\r\n// The scattering and absorption values are per kilometer measured at sea level.\r\nconst DefaultPeakRayleighScattering = new Vector3(0.005802, 0.013558, 0.0331);\r\nconst DefaultPeakMieScattering = new Vector3(0.003996, 0.003996, 0.003996);\r\nconst DefaultPeakMieAbsorption = new Vector3(0.000444, 0.000444, 0.000444);\r\nconst DefaultPeakOzoneAbsorption = new Vector3(0.00065, 0.001881, 0.000085);\r\n\r\n/**\r\n * Describes the physical properties of the atmosphere. Assumes a spherical planet.\r\n * - \"radius\" values describe a distance from the planet's center.\r\n * - \"height\" values describe a distance from the planet's surface.\r\n * - Distances are in kilometers unless otherwise specified. Angles are in radians.\r\n */\r\nexport class AtmospherePhysicalProperties {\r\n /**\r\n * Notification for when properties of the {@link AtmospherePhysicalProperties} are changed.\r\n */\r\n public readonly onChangedObservable = new Observable<AtmospherePhysicalProperties>();\r\n\r\n private _planetRadius: number;\r\n private _planetRadiusOffset: number;\r\n private _atmosphereThickness: number;\r\n private _rayleighScatteringScale: number;\r\n private _peakRayleighScattering = new Vector3();\r\n private _mieScatteringScale: number;\r\n private _peakMieScattering = new Vector3();\r\n private _mieAbsorptionScale: number;\r\n private _peakMieAbsorption = new Vector3();\r\n private _ozoneAbsorptionScale: number;\r\n private _peakOzoneAbsorption = new Vector3();\r\n\r\n // Inferred values.\r\n private _planetRadiusWithOffset = 0;\r\n private _planetRadiusSquared = 0;\r\n private _atmosphereRadius = 0;\r\n private _atmosphereRadiusSquared = 0;\r\n private _horizonDistanceToAtmosphereEdge = 0;\r\n private _horizonDistanceToAtmosphereEdgeSquared = 0;\r\n private _rayleighScattering = new Vector3();\r\n private _mieScattering = new Vector3();\r\n private _mieAbsorption = new Vector3();\r\n private _mieExtinction = new Vector3();\r\n private _ozoneAbsorption = new Vector3();\r\n\r\n /**\r\n * The radius of the planet in kilometers.\r\n */\r\n public get planetRadius(): number {\r\n return this._planetRadius;\r\n }\r\n public set planetRadius(value: number) {\r\n if (this._planetRadius !== value) {\r\n this._planetRadius = value;\r\n this._recomputeDimensionalParameters();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The squared radius of the planet in kilometers.\r\n */\r\n public get planetRadiusSquared(): number {\r\n return this._planetRadiusSquared;\r\n }\r\n\r\n /**\r\n * Offset applied to view points near the planet's surface. This should be greater than 0.\r\n * It prevents rendering issues close to the planet's surface.\r\n */\r\n public get planetRadiusOffset(): number {\r\n return this._planetRadiusOffset;\r\n }\r\n public set planetRadiusOffset(value: number) {\r\n if (this._planetRadiusOffset !== value) {\r\n this._planetRadiusOffset = value;\r\n this._recomputeDimensionalParameters();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * This is the {@link planetRadius} with the additional {@link planetRadiusOffset}, in kilometers.\r\n */\r\n public get planetRadiusWithOffset(): number {\r\n return this._planetRadiusWithOffset;\r\n }\r\n\r\n /**\r\n * The thickness of the atmosphere measured in kilometers.\r\n */\r\n public get atmosphereThickness(): number {\r\n return this._atmosphereThickness;\r\n }\r\n public set atmosphereThickness(value: number) {\r\n if (this._atmosphereThickness !== value) {\r\n this._atmosphereThickness = value;\r\n this._recomputeDimensionalParameters();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The combined planet radius and atmosphere thickness in kilometers.\r\n */\r\n public get atmosphereRadius(): number {\r\n return this._atmosphereRadius;\r\n }\r\n\r\n /**\r\n * The atmosphere radius squared in kilometers.\r\n */\r\n public get atmosphereRadiusSquared(): number {\r\n return this._atmosphereRadiusSquared;\r\n }\r\n\r\n /**\r\n * Horizon distance from the planet's surface to the outer edge of the atmosphere in kilometers.\r\n */\r\n public get horizonDistanceToAtmosphereEdge(): number {\r\n return this._horizonDistanceToAtmosphereEdge;\r\n }\r\n\r\n /**\r\n * Horizon distance from the planet's surface to the outer edge of the atmosphere, squared, in kilometers.\r\n */\r\n public get horizonDistanceToAtmosphereEdgeSquared(): number {\r\n return this._horizonDistanceToAtmosphereEdgeSquared;\r\n }\r\n\r\n /**\r\n * The scale applied to {@link peakRayleighScattering}.\r\n */\r\n public get rayleighScatteringScale(): number {\r\n return this._rayleighScatteringScale;\r\n }\r\n public set rayleighScatteringScale(value: number) {\r\n if (this._rayleighScatteringScale !== value) {\r\n this._rayleighScatteringScale = value;\r\n this._recomputeRayleighScattering();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The Rayleigh scattering per kilometer at sea level for red, green, and blue wavelengths.\r\n */\r\n public get peakRayleighScattering(): Vector3 {\r\n return this._peakRayleighScattering;\r\n }\r\n public set peakRayleighScattering(value: Vector3) {\r\n if (!this._peakRayleighScattering.equals(value)) {\r\n this._peakRayleighScattering.copyFrom(value);\r\n this._recomputeRayleighScattering();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The Rayleigh scattering per kilometer at sea level for red, green, and blue wavelengths.\r\n * This value cannot be set directly. It is inferred by scaling {@link peakRayleighScattering} by {@link rayleighScatteringScale}.\r\n */\r\n public get rayleighScattering(): Vector3 {\r\n return this._rayleighScattering;\r\n }\r\n\r\n /**\r\n * The scale applied to {@link peakMieScattering}.\r\n */\r\n public get mieScatteringScale(): number {\r\n return this._mieScatteringScale;\r\n }\r\n public set mieScatteringScale(value: number) {\r\n if (this._mieScatteringScale !== value) {\r\n this._mieScatteringScale = value;\r\n this._recomputeMieScattering();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The Mie scattering per kilometer at sea level for red, green, and blue wavelengths.\r\n */\r\n public get peakMieScattering(): Vector3 {\r\n return this._peakMieScattering;\r\n }\r\n public set peakMieScattering(value: Vector3) {\r\n if (!this._peakMieScattering.equals(value)) {\r\n this._peakMieScattering.copyFrom(value);\r\n this._recomputeMieScattering();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The Mie scattering per kilometer at sea level for red, green, and blue wavelengths.\r\n * This value cannot be set directly. It is inferred by scaling {@link mieScatteringScale} by {@link peakMieScattering}.\r\n */\r\n public get mieScattering(): Vector3 {\r\n return this._mieScattering;\r\n }\r\n\r\n /**\r\n * The scale applied to {@link peakMieAbsorption}.\r\n */\r\n public get mieAbsorptionScale(): number {\r\n return this._mieAbsorptionScale;\r\n }\r\n public set mieAbsorptionScale(value: number) {\r\n if (this._mieAbsorptionScale !== value) {\r\n this._mieAbsorptionScale = value;\r\n this._recomputeMieAbsorption();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The Mie absorption per kilometer at sea level for red, green, and blue wavelengths.\r\n */\r\n public get peakMieAbsorption(): Vector3 {\r\n return this._peakMieAbsorption;\r\n }\r\n public set peakMieAbsorption(value: Vector3) {\r\n if (!this._peakMieAbsorption.equals(value)) {\r\n this._peakMieAbsorption.copyFrom(value);\r\n this._recomputeMieAbsorption();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The Mie absorption per kilometer at sea level for red, green, and blue wavelengths.\r\n * This value cannot be set directly. It is inferred by scaling {@link mieAbsorptionScale} by {@link peakMieAbsorption}.\r\n */\r\n public get mieAbsorption(): Vector3 {\r\n return this._mieAbsorption;\r\n }\r\n\r\n /**\r\n * The Mie extinction per kilometer at sea level for red, green, and blue wavelengths.\r\n * This value cannot be set directly. It is inferred by adding the {@link mieAbsorption} to the {@link mieScattering}.\r\n */\r\n public get mieExtinction(): Vector3 {\r\n return this._mieExtinction;\r\n }\r\n\r\n /**\r\n * The scale applied to {@link peakOzoneAbsorption}.\r\n */\r\n public get ozoneAbsorptionScale(): number {\r\n return this._ozoneAbsorptionScale;\r\n }\r\n public set ozoneAbsorptionScale(value: number) {\r\n if (this._ozoneAbsorptionScale !== value) {\r\n this._ozoneAbsorptionScale = value;\r\n this._recomputeOzoneAbsorption();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The ozone absorption per kilometer measured at a height corresponding to it's peak concentration,\r\n * for red, green, and blue wavelengths.\r\n */\r\n public get peakOzoneAbsorption(): Vector3 {\r\n return this._peakOzoneAbsorption;\r\n }\r\n public set peakOzoneAbsorption(value: Vector3) {\r\n if (!this._peakOzoneAbsorption.equals(value)) {\r\n this._peakOzoneAbsorption.copyFrom(value);\r\n this._recomputeOzoneAbsorption();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The ozone absorption per kilometer at sea level for red, green, and blue wavelengths.\r\n * This value cannot be set directly. It is inferred by scaling {@link peakOzoneAbsorption} by {@link ozoneAbsorptionScale}.\r\n */\r\n public get ozoneAbsorption(): Vector3 {\r\n return this._ozoneAbsorption;\r\n }\r\n\r\n /**\r\n * Constructs the {@link AtmospherePhysicalProperties}.\r\n * @param options - The options for the {@link AtmospherePhysicalProperties}.\r\n */\r\n constructor(options?: IAtmospherePhysicalPropertiesOptions) {\r\n this._planetRadius = options?.planetRadius ?? DefaultPlanetRadius;\r\n this._planetRadiusOffset = options?.planetRadiusOffset ?? DefaultPlanetRadiusOffset;\r\n this._atmosphereThickness = options?.atmosphereThickness ?? DefaultAtmosphereThickness;\r\n this._rayleighScatteringScale = options?.rayleighScatteringScale ?? 1.0;\r\n this._peakRayleighScattering.copyFrom(options?.peakRayleighScattering ?? DefaultPeakRayleighScattering);\r\n this._mieScatteringScale = options?.mieScatteringScale ?? 1.0;\r\n this._peakMieScattering.copyFrom(options?.peakMieScattering ?? DefaultPeakMieScattering);\r\n this._mieAbsorptionScale = options?.mieAbsorptionScale ?? 1.0;\r\n this._peakMieAbsorption.copyFrom(options?.peakMieAbsorption ?? DefaultPeakMieAbsorption);\r\n this._ozoneAbsorptionScale = options?.ozoneAbsorptionScale ?? 1.0;\r\n this._peakOzoneAbsorption.copyFrom(options?.peakOzoneAbsorption ?? DefaultPeakOzoneAbsorption);\r\n\r\n // Compute inferred values.\r\n this._recomputeDimensionalParameters();\r\n this._recomputeRayleighScattering();\r\n this._recomputeMieScattering();\r\n this._recomputeMieAbsorption();\r\n this._recomputeOzoneAbsorption();\r\n }\r\n\r\n private _recomputeDimensionalParameters(): void {\r\n this._planetRadiusWithOffset = this._planetRadius + this._planetRadiusOffset;\r\n this._planetRadiusSquared = this._planetRadius * this._planetRadius;\r\n this._atmosphereRadius = this._planetRadius + this._atmosphereThickness;\r\n this._atmosphereRadiusSquared = this._atmosphereRadius * this._atmosphereRadius;\r\n this._horizonDistanceToAtmosphereEdgeSquared = this._atmosphereRadiusSquared - this._planetRadiusSquared;\r\n this._horizonDistanceToAtmosphereEdge = Math.sqrt(this._horizonDistanceToAtmosphereEdgeSquared);\r\n }\r\n\r\n private _recomputeRayleighScattering(): void {\r\n this._peakRayleighScattering.scaleToRef(this._rayleighScatteringScale, this._rayleighScattering);\r\n }\r\n\r\n private _recomputeMieScattering(): void {\r\n this._peakMieScattering.scaleToRef(this._mieScatteringScale, this._mieScattering);\r\n this._recomputeMieExtinction();\r\n }\r\n\r\n private _recomputeMieAbsorption(): void {\r\n this._peakMieAbsorption.scaleToRef(this._mieAbsorptionScale, this._mieAbsorption);\r\n this._recomputeMieExtinction();\r\n }\r\n\r\n private _recomputeMieExtinction(): void {\r\n this._mieAbsorption.addToRef(this._mieScattering, this._mieExtinction);\r\n }\r\n\r\n private _recomputeOzoneAbsorption(): void {\r\n this._peakOzoneAbsorption.scaleToRef(this._ozoneAbsorptionScale, this._ozoneAbsorption);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"atmospherePhysicalProperties.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmospherePhysicalProperties.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// Licensed under the MIT License.\r\n\r\nimport type { IAtmospherePhysicalPropertiesOptions } from \"./atmospherePhysicalPropertiesOptions\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\n\r\nconst DefaultPlanetRadius = 6360.0;\r\nconst DefaultPlanetRadiusOffset = 0.01;\r\nconst DefaultAtmosphereThickness = 100.0;\r\n\r\n// The scattering and absorption values are per kilometer measured at sea level.\r\nconst DefaultPeakRayleighScattering = new Vector3(0.005802, 0.013558, 0.0331);\r\nconst DefaultPeakMieScattering = new Vector3(0.003996, 0.003996, 0.003996);\r\nconst DefaultPeakMieAbsorption = new Vector3(0.000444, 0.000444, 0.000444);\r\nconst DefaultPeakOzoneAbsorption = new Vector3(0.00065, 0.001881, 0.000085);\r\n\r\n/**\r\n * Describes the physical properties of the atmosphere. Assumes a spherical planet.\r\n * - \"radius\" values describe a distance from the planet's center.\r\n * - \"height\" values describe a distance from the planet's surface.\r\n * - Distances are in kilometers unless otherwise specified. Angles are in radians.\r\n */\r\nexport class AtmospherePhysicalProperties {\r\n /**\r\n * Notification for when properties of the {@link AtmospherePhysicalProperties} are changed.\r\n */\r\n public readonly onChangedObservable = new Observable<AtmospherePhysicalProperties>();\r\n\r\n private _planetRadius: number;\r\n private _planetRadiusOffset: number;\r\n private _atmosphereThickness: number;\r\n private _rayleighScatteringScale: number;\r\n private _peakRayleighScattering = new Vector3();\r\n private _mieScatteringScale: number;\r\n private _peakMieScattering = new Vector3();\r\n private _mieAbsorptionScale: number;\r\n private _peakMieAbsorption = new Vector3();\r\n private _ozoneAbsorptionScale: number;\r\n private _peakOzoneAbsorption = new Vector3();\r\n\r\n // Inferred values.\r\n private _planetRadiusWithOffset = 0;\r\n private _planetRadiusSquared = 0;\r\n private _atmosphereRadius = 0;\r\n private _atmosphereRadiusSquared = 0;\r\n private _horizonDistanceToAtmosphereEdge = 0;\r\n private _horizonDistanceToAtmosphereEdgeSquared = 0;\r\n private _rayleighScattering = new Vector3();\r\n private _mieScattering = new Vector3();\r\n private _mieAbsorption = new Vector3();\r\n private _mieExtinction = new Vector3();\r\n private _ozoneAbsorption = new Vector3();\r\n\r\n /**\r\n * The radius of the planet in kilometers.\r\n */\r\n public get planetRadius(): number {\r\n return this._planetRadius;\r\n }\r\n public set planetRadius(value: number) {\r\n if (this._planetRadius !== value) {\r\n this._planetRadius = value;\r\n this._recomputeDimensionalParameters();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The squared radius of the planet in kilometers.\r\n */\r\n public get planetRadiusSquared(): number {\r\n return this._planetRadiusSquared;\r\n }\r\n\r\n /**\r\n * Offset applied to view points near the planet's surface. This should be greater than 0.\r\n * It prevents rendering issues close to the planet's surface.\r\n */\r\n public get planetRadiusOffset(): number {\r\n return this._planetRadiusOffset;\r\n }\r\n public set planetRadiusOffset(value: number) {\r\n if (this._planetRadiusOffset !== value) {\r\n this._planetRadiusOffset = value;\r\n this._recomputeDimensionalParameters();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * This is the {@link planetRadius} with the additional {@link planetRadiusOffset}, in kilometers.\r\n */\r\n public get planetRadiusWithOffset(): number {\r\n return this._planetRadiusWithOffset;\r\n }\r\n\r\n /**\r\n * The thickness of the atmosphere measured in kilometers.\r\n */\r\n public get atmosphereThickness(): number {\r\n return this._atmosphereThickness;\r\n }\r\n public set atmosphereThickness(value: number) {\r\n if (this._atmosphereThickness !== value) {\r\n this._atmosphereThickness = value;\r\n this._recomputeDimensionalParameters();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The combined planet radius and atmosphere thickness in kilometers.\r\n */\r\n public get atmosphereRadius(): number {\r\n return this._atmosphereRadius;\r\n }\r\n\r\n /**\r\n * The atmosphere radius squared in kilometers.\r\n */\r\n public get atmosphereRadiusSquared(): number {\r\n return this._atmosphereRadiusSquared;\r\n }\r\n\r\n /**\r\n * Horizon distance from the planet's surface to the outer edge of the atmosphere in kilometers.\r\n */\r\n public get horizonDistanceToAtmosphereEdge(): number {\r\n return this._horizonDistanceToAtmosphereEdge;\r\n }\r\n\r\n /**\r\n * Horizon distance from the planet's surface to the outer edge of the atmosphere, squared, in kilometers.\r\n */\r\n public get horizonDistanceToAtmosphereEdgeSquared(): number {\r\n return this._horizonDistanceToAtmosphereEdgeSquared;\r\n }\r\n\r\n /**\r\n * The scale applied to {@link peakRayleighScattering}.\r\n */\r\n public get rayleighScatteringScale(): number {\r\n return this._rayleighScatteringScale;\r\n }\r\n public set rayleighScatteringScale(value: number) {\r\n if (this._rayleighScatteringScale !== value) {\r\n this._rayleighScatteringScale = value;\r\n this._recomputeRayleighScattering();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The Rayleigh scattering per kilometer at sea level for red, green, and blue wavelengths.\r\n */\r\n public get peakRayleighScattering(): Vector3 {\r\n return this._peakRayleighScattering;\r\n }\r\n public set peakRayleighScattering(value: Vector3) {\r\n if (!this._peakRayleighScattering.equals(value)) {\r\n this._peakRayleighScattering.copyFrom(value);\r\n this._recomputeRayleighScattering();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The Rayleigh scattering per kilometer at sea level for red, green, and blue wavelengths.\r\n * This value cannot be set directly. It is inferred by scaling {@link peakRayleighScattering} by {@link rayleighScatteringScale}.\r\n */\r\n public get rayleighScattering(): Vector3 {\r\n return this._rayleighScattering;\r\n }\r\n\r\n /**\r\n * The scale applied to {@link peakMieScattering}.\r\n */\r\n public get mieScatteringScale(): number {\r\n return this._mieScatteringScale;\r\n }\r\n public set mieScatteringScale(value: number) {\r\n if (this._mieScatteringScale !== value) {\r\n this._mieScatteringScale = value;\r\n this._recomputeMieScattering();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The Mie scattering per kilometer at sea level for red, green, and blue wavelengths.\r\n */\r\n public get peakMieScattering(): Vector3 {\r\n return this._peakMieScattering;\r\n }\r\n public set peakMieScattering(value: Vector3) {\r\n if (!this._peakMieScattering.equals(value)) {\r\n this._peakMieScattering.copyFrom(value);\r\n this._recomputeMieScattering();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The Mie scattering per kilometer at sea level for red, green, and blue wavelengths.\r\n * This value cannot be set directly. It is inferred by scaling {@link mieScatteringScale} by {@link peakMieScattering}.\r\n */\r\n public get mieScattering(): Vector3 {\r\n return this._mieScattering;\r\n }\r\n\r\n /**\r\n * The scale applied to {@link peakMieAbsorption}.\r\n */\r\n public get mieAbsorptionScale(): number {\r\n return this._mieAbsorptionScale;\r\n }\r\n public set mieAbsorptionScale(value: number) {\r\n if (this._mieAbsorptionScale !== value) {\r\n this._mieAbsorptionScale = value;\r\n this._recomputeMieAbsorption();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The Mie absorption per kilometer at sea level for red, green, and blue wavelengths.\r\n */\r\n public get peakMieAbsorption(): Vector3 {\r\n return this._peakMieAbsorption;\r\n }\r\n public set peakMieAbsorption(value: Vector3) {\r\n if (!this._peakMieAbsorption.equals(value)) {\r\n this._peakMieAbsorption.copyFrom(value);\r\n this._recomputeMieAbsorption();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The Mie absorption per kilometer at sea level for red, green, and blue wavelengths.\r\n * This value cannot be set directly. It is inferred by scaling {@link mieAbsorptionScale} by {@link peakMieAbsorption}.\r\n */\r\n public get mieAbsorption(): Vector3 {\r\n return this._mieAbsorption;\r\n }\r\n\r\n /**\r\n * The Mie extinction per kilometer at sea level for red, green, and blue wavelengths.\r\n * This value cannot be set directly. It is inferred by adding the {@link mieAbsorption} to the {@link mieScattering}.\r\n */\r\n public get mieExtinction(): Vector3 {\r\n return this._mieExtinction;\r\n }\r\n\r\n /**\r\n * The scale applied to {@link peakOzoneAbsorption}.\r\n */\r\n public get ozoneAbsorptionScale(): number {\r\n return this._ozoneAbsorptionScale;\r\n }\r\n public set ozoneAbsorptionScale(value: number) {\r\n if (this._ozoneAbsorptionScale !== value) {\r\n this._ozoneAbsorptionScale = value;\r\n this._recomputeOzoneAbsorption();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The ozone absorption per kilometer measured at a height corresponding to it's peak concentration,\r\n * for red, green, and blue wavelengths.\r\n */\r\n public get peakOzoneAbsorption(): Vector3 {\r\n return this._peakOzoneAbsorption;\r\n }\r\n public set peakOzoneAbsorption(value: Vector3) {\r\n if (!this._peakOzoneAbsorption.equals(value)) {\r\n this._peakOzoneAbsorption.copyFrom(value);\r\n this._recomputeOzoneAbsorption();\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * The ozone absorption per kilometer at sea level for red, green, and blue wavelengths.\r\n * This value cannot be set directly. It is inferred by scaling {@link peakOzoneAbsorption} by {@link ozoneAbsorptionScale}.\r\n */\r\n public get ozoneAbsorption(): Vector3 {\r\n return this._ozoneAbsorption;\r\n }\r\n\r\n /**\r\n * Constructs the {@link AtmospherePhysicalProperties}.\r\n * @param options - The options for the {@link AtmospherePhysicalProperties}.\r\n */\r\n constructor(options?: IAtmospherePhysicalPropertiesOptions) {\r\n this._planetRadius = options?.planetRadius ?? DefaultPlanetRadius;\r\n this._planetRadiusOffset = options?.planetRadiusOffset ?? DefaultPlanetRadiusOffset;\r\n this._atmosphereThickness = options?.atmosphereThickness ?? DefaultAtmosphereThickness;\r\n this._rayleighScatteringScale = options?.rayleighScatteringScale ?? 1.0;\r\n this._peakRayleighScattering.copyFrom(options?.peakRayleighScattering ?? DefaultPeakRayleighScattering);\r\n this._mieScatteringScale = options?.mieScatteringScale ?? 1.0;\r\n this._peakMieScattering.copyFrom(options?.peakMieScattering ?? DefaultPeakMieScattering);\r\n this._mieAbsorptionScale = options?.mieAbsorptionScale ?? 1.0;\r\n this._peakMieAbsorption.copyFrom(options?.peakMieAbsorption ?? DefaultPeakMieAbsorption);\r\n this._ozoneAbsorptionScale = options?.ozoneAbsorptionScale ?? 1.0;\r\n this._peakOzoneAbsorption.copyFrom(options?.peakOzoneAbsorption ?? DefaultPeakOzoneAbsorption);\r\n\r\n // Compute inferred values.\r\n this._recomputeDimensionalParameters();\r\n this._recomputeRayleighScattering();\r\n this._recomputeMieScattering();\r\n this._recomputeMieAbsorption();\r\n this._recomputeOzoneAbsorption();\r\n }\r\n\r\n private _recomputeDimensionalParameters(): void {\r\n this._planetRadiusWithOffset = this._planetRadius + this._planetRadiusOffset;\r\n this._planetRadiusSquared = this._planetRadius * this._planetRadius;\r\n this._atmosphereRadius = this._planetRadius + this._atmosphereThickness;\r\n this._atmosphereRadiusSquared = this._atmosphereRadius * this._atmosphereRadius;\r\n this._horizonDistanceToAtmosphereEdgeSquared = this._atmosphereRadiusSquared - this._planetRadiusSquared;\r\n this._horizonDistanceToAtmosphereEdge = Math.sqrt(this._horizonDistanceToAtmosphereEdgeSquared);\r\n }\r\n\r\n private _recomputeRayleighScattering(): void {\r\n this._peakRayleighScattering.scaleToRef(this._rayleighScatteringScale, this._rayleighScattering);\r\n }\r\n\r\n private _recomputeMieScattering(): void {\r\n this._peakMieScattering.scaleToRef(this._mieScatteringScale, this._mieScattering);\r\n this._recomputeMieExtinction();\r\n }\r\n\r\n private _recomputeMieAbsorption(): void {\r\n this._peakMieAbsorption.scaleToRef(this._mieAbsorptionScale, this._mieAbsorption);\r\n this._recomputeMieExtinction();\r\n }\r\n\r\n private _recomputeMieExtinction(): void {\r\n this._mieAbsorption.addToRef(this._mieScattering, this._mieExtinction);\r\n }\r\n\r\n private _recomputeOzoneAbsorption(): void {\r\n this._peakOzoneAbsorption.scaleToRef(this._ozoneAbsorptionScale, this._ozoneAbsorption);\r\n }\r\n}\r\n"]}
@@ -1,4 +1,4 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
- // MIT License
2
+ // Licensed under the MIT License.
3
3
  export {};
4
4
  //# sourceMappingURL=atmospherePhysicalPropertiesOptions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"atmospherePhysicalPropertiesOptions.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmospherePhysicalPropertiesOptions.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,cAAc","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// MIT License\r\n\r\nimport type { Vector3 } from \"core/Maths/math.vector\";\r\n\r\n/**\r\n * The options for the {@link AtmospherePhysicalProperties} that describe the planet, the atmosphere, and scattering.\r\n */\r\nexport interface IAtmospherePhysicalPropertiesOptions {\r\n /**\r\n * The radius of the planet in kilometers.\r\n */\r\n planetRadius?: number;\r\n\r\n /**\r\n * The minimum camera radius (distance from the planet's center) allowed when rendering the atmosphere.\r\n * This should be greater than 0.\r\n * It prevents rendering issues close to the planet's surface.\r\n */\r\n planetRadiusOffset?: number;\r\n\r\n /**\r\n * The thickness of the atmosphere measured in kilometers from the planet's surface to the outer edge of the atmosphere.\r\n */\r\n atmosphereThickness?: number;\r\n\r\n /**\r\n * The scale applied to the Rayleigh scattering.\r\n */\r\n rayleighScatteringScale?: number;\r\n\r\n /**\r\n * The Rayleigh scattering per kilometer at sea level for red, green, and blue wavelengths.\r\n */\r\n peakRayleighScattering?: Vector3;\r\n\r\n /**\r\n * The scale applied to the Mie scattering.\r\n */\r\n mieScatteringScale?: number;\r\n\r\n /**\r\n * The Mie scattering per kilometer at sea level for red, green, and blue wavelengths.\r\n */\r\n peakMieScattering?: Vector3;\r\n\r\n /**\r\n * The scale applied to the Mie absorption.\r\n */\r\n mieAbsorptionScale?: number;\r\n\r\n /**\r\n * The Mie absorption per kilometer at sea level for red, green, and blue wavelengths.\r\n */\r\n peakMieAbsorption?: Vector3;\r\n\r\n /**\r\n * The scale applied to the ozone absorption.\r\n */\r\n ozoneAbsorptionScale?: number;\r\n\r\n /**\r\n * The ozone absorption per kilometer at sea level for red, green, and blue wavelengths.\r\n */\r\n peakOzoneAbsorption?: Vector3;\r\n}\r\n"]}
1
+ {"version":3,"file":"atmospherePhysicalPropertiesOptions.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmospherePhysicalPropertiesOptions.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// Licensed under the MIT License.\r\n\r\nimport type { Vector3 } from \"core/Maths/math.vector\";\r\n\r\n/**\r\n * The options for the {@link AtmospherePhysicalProperties} that describe the planet, the atmosphere, and scattering.\r\n */\r\nexport interface IAtmospherePhysicalPropertiesOptions {\r\n /**\r\n * The radius of the planet in kilometers.\r\n */\r\n planetRadius?: number;\r\n\r\n /**\r\n * The minimum camera radius (distance from the planet's center) allowed when rendering the atmosphere.\r\n * This should be greater than 0.\r\n * It prevents rendering issues close to the planet's surface.\r\n */\r\n planetRadiusOffset?: number;\r\n\r\n /**\r\n * The thickness of the atmosphere measured in kilometers from the planet's surface to the outer edge of the atmosphere.\r\n */\r\n atmosphereThickness?: number;\r\n\r\n /**\r\n * The scale applied to the Rayleigh scattering.\r\n */\r\n rayleighScatteringScale?: number;\r\n\r\n /**\r\n * The Rayleigh scattering per kilometer at sea level for red, green, and blue wavelengths.\r\n */\r\n peakRayleighScattering?: Vector3;\r\n\r\n /**\r\n * The scale applied to the Mie scattering.\r\n */\r\n mieScatteringScale?: number;\r\n\r\n /**\r\n * The Mie scattering per kilometer at sea level for red, green, and blue wavelengths.\r\n */\r\n peakMieScattering?: Vector3;\r\n\r\n /**\r\n * The scale applied to the Mie absorption.\r\n */\r\n mieAbsorptionScale?: number;\r\n\r\n /**\r\n * The Mie absorption per kilometer at sea level for red, green, and blue wavelengths.\r\n */\r\n peakMieAbsorption?: Vector3;\r\n\r\n /**\r\n * The scale applied to the ozone absorption.\r\n */\r\n ozoneAbsorptionScale?: number;\r\n\r\n /**\r\n * The ozone absorption per kilometer at sea level for red, green, and blue wavelengths.\r\n */\r\n peakOzoneAbsorption?: Vector3;\r\n}\r\n"]}
@@ -1,5 +1,5 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
- // MIT License
2
+ // Licensed under the MIT License.
3
3
  import { Clamp } from "@onerjs/core/Maths/math.scalar.functions.js";
4
4
  import { Constants } from "@onerjs/core/Engines/constants.js";
5
5
  import { EffectRenderer, EffectWrapper } from "@onerjs/core/Materials/effectRenderer.js";
@@ -82,21 +82,23 @@ export class DiffuseSkyIrradianceLut {
82
82
  renderTarget.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;
83
83
  renderTarget.anisotropicFilteringLevel = 1;
84
84
  renderTarget.skipInitialClear = true;
85
- const useUbo = atmosphere.uniformBuffer.useUbo;
85
+ const atmosphereUbo = atmosphere.uniformBuffer;
86
+ const useUbo = atmosphereUbo.useUbo;
87
+ const heightParam = engine.isWebGPU ? "radius" : "filteringInfo.x";
86
88
  this._effectWrapper = new EffectWrapper({
87
89
  engine,
88
90
  name,
89
91
  vertexShader: "fullscreenTriangle",
90
92
  fragmentShader: "diffuseSkyIrradiance",
91
93
  attributeNames: ["position"],
92
- uniformNames: ["depth", ...(useUbo ? [] : atmosphere.uniformBuffer.getUniformNames())],
93
- uniformBuffers: useUbo ? [atmosphere.uniformBuffer.name] : [],
94
+ uniformNames: ["depth", ...(useUbo ? [] : atmosphereUbo.getUniformNames())],
95
+ uniformBuffers: useUbo ? [atmosphereUbo.name] : [],
94
96
  defines: [
95
97
  "#define POSITION_VEC2",
96
98
  `#define NUM_SAMPLES ${RaySamples}u`,
97
99
  "#define CUSTOM_IRRADIANCE_FILTERING_INPUT /* empty */", // empty, no input texture needed as the radiance is procedurally generated from ray marching.
98
100
  // The following ray marches the atmosphere to get the radiance.
99
- "#define CUSTOM_IRRADIANCE_FILTERING_FUNCTION vec3 c = integrateForIrradiance(n, Ls, vec3(0., filteringInfo.x, 0.));",
101
+ `#define CUSTOM_IRRADIANCE_FILTERING_FUNCTION vec3 c = integrateForIrradiance(n, Ls, vec3(0., ${heightParam}, 0.));`,
100
102
  ],
101
103
  samplers: ["transmittanceLut", "multiScatteringLut"],
102
104
  useShaderStore: true,
@@ -1 +1 @@
1
- {"version":3,"file":"diffuseSkyIrradianceLut.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/diffuseSkyIrradianceLut.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// MIT License\r\n\r\nimport type { Atmosphere } from \"./atmosphere\";\r\nimport type { AtmospherePhysicalProperties } from \"./atmospherePhysicalProperties\";\r\nimport { Clamp } from \"core/Maths/math.scalar.functions\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { EffectRenderer, EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport { FromHalfFloat } from \"core/Misc/textureTools\";\r\nimport type { IColor3Like, IColor4Like, IVector2Like, IVector3Like } from \"core/Maths/math.like\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { Sample2DRgbaToRef } from \"./sampling\";\r\nimport { Vector3Dot } from \"core/Maths/math.vector.functions\";\r\nimport \"./Shaders/diffuseSkyIrradiance.fragment\";\r\nimport \"./Shaders/fullscreenTriangle.vertex\";\r\n\r\nconst RaySamples = 128;\r\nconst LutWidthPx = 64;\r\nconst LutHeightPx = 16;\r\nconst HalfTexelSize = { x: 0.5 / LutWidthPx, y: 0.5 / LutHeightPx };\r\nconst UnitToUVScale = { x: (LutWidthPx - 1.0) / LutWidthPx, y: (LutHeightPx - 1.0) / LutHeightPx };\r\nconst UvTemp = { x: Number.NaN, y: Number.NaN };\r\nconst Color4Temp = { r: Number.NaN, g: Number.NaN, b: Number.NaN, a: Number.NaN } as IColor4Like;\r\n\r\nconst ComputeLutUVToRef = (properties: AtmospherePhysicalProperties, radius: number, cosAngleLightToZenith: number, result: IVector2Like): void => {\r\n const unitX = Clamp(0.5 + 0.5 * cosAngleLightToZenith);\r\n const unitY = Clamp((radius - properties.planetRadius) / properties.atmosphereThickness);\r\n result.x = unitX * UnitToUVScale.x + HalfTexelSize.x;\r\n result.y = unitY * UnitToUVScale.y + HalfTexelSize.y;\r\n};\r\n\r\n/**\r\n * The diffuse sky irradiance LUT is used to query the diffuse irradiance at a specified position.\r\n */\r\nexport class DiffuseSkyIrradianceLut {\r\n private readonly _atmosphere: Atmosphere;\r\n private _renderTarget: Nullable<RenderTargetTexture> = null;\r\n private _effectWrapper: Nullable<EffectWrapper> = null;\r\n private _effectRenderer: Nullable<EffectRenderer> = null;\r\n private _isDirty = true;\r\n private _isDisposed = false;\r\n private _lutData: Uint8Array | Uint16Array = new Uint16Array(0);\r\n\r\n /**\r\n * True if the LUT needs to be rendered.\r\n */\r\n public get isDirty() {\r\n return this._isDirty;\r\n }\r\n\r\n /**\r\n * True if the LUT has been disposed.\r\n */\r\n public get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n /**\r\n * The render target used for this LUT.\r\n * @throws if the LUT has been disposed.\r\n */\r\n public get renderTarget(): RenderTargetTexture {\r\n if (this._isDisposed || this._renderTarget === null) {\r\n throw new Error();\r\n }\r\n return this._renderTarget;\r\n }\r\n\r\n /**\r\n * True if the LUT data has been read back from the GPU.\r\n */\r\n public get hasLutData(): boolean {\r\n return this._lutData[0] !== undefined;\r\n }\r\n\r\n /**\r\n * Constructs the {@link DiffuseSkyIrradianceLut}.\r\n * @param atmosphere - The atmosphere to use.\r\n */\r\n constructor(atmosphere: Atmosphere) {\r\n this._atmosphere = atmosphere;\r\n const scene = atmosphere.scene;\r\n const engine = scene.getEngine();\r\n\r\n const name = \"atmo-diffuseSkyIrradiance\";\r\n const caps = engine.getCaps();\r\n const textureType = caps.textureHalfFloatRender ? Constants.TEXTURETYPE_HALF_FLOAT : Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n const renderTarget = (this._renderTarget = new RenderTargetTexture(name, { width: LutWidthPx, height: LutHeightPx }, scene, {\r\n generateMipMaps: false,\r\n type: textureType,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n gammaSpace: false,\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\r\n const useUbo = atmosphere.uniformBuffer.useUbo;\r\n\r\n this._effectWrapper = new EffectWrapper({\r\n engine,\r\n name,\r\n vertexShader: \"fullscreenTriangle\",\r\n fragmentShader: \"diffuseSkyIrradiance\",\r\n attributeNames: [\"position\"],\r\n uniformNames: [\"depth\", ...(useUbo ? [] : atmosphere.uniformBuffer.getUniformNames())],\r\n uniformBuffers: useUbo ? [atmosphere.uniformBuffer.name] : [],\r\n defines: [\r\n \"#define POSITION_VEC2\",\r\n `#define NUM_SAMPLES ${RaySamples}u`,\r\n \"#define CUSTOM_IRRADIANCE_FILTERING_INPUT /* empty */\", // empty, no input texture needed as the radiance is procedurally generated from ray marching.\r\n // The following ray marches the atmosphere to get the radiance.\r\n \"#define CUSTOM_IRRADIANCE_FILTERING_FUNCTION vec3 c = integrateForIrradiance(n, Ls, vec3(0., filteringInfo.x, 0.));\",\r\n ],\r\n samplers: [\"transmittanceLut\", \"multiScatteringLut\"],\r\n useShaderStore: true,\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 // The sky irradiance will also be used for the environment texture.\r\n scene.environmentTexture = renderTarget;\r\n scene.environmentTexture.irradianceTexture = renderTarget;\r\n scene.environmentIntensity = 1.0;\r\n\r\n // Prevent the irradiance LUT from being rendered redundantly at the beginning of the frame.\r\n scene.environmentTexture.isRenderTarget = false;\r\n }\r\n\r\n /**\r\n * Gets the diffuse sky irradiance for a surface oriented along the geocentric normal.\r\n * Resulting color is always in linear space.\r\n * @param directionToLight - The direction to the light in world space.\r\n * @param radius - The position's distance to the planet origin.\r\n * @param cameraGeocentricNormal - The geocentric normal of the camera.\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 radius: number,\r\n cameraGeocentricNormal: IVector3Like,\r\n lightIrradiance: number,\r\n result: T\r\n ): T {\r\n const atmosphere = this._atmosphere;\r\n const additionalDiffuseSkyIrradiance = atmosphere.additionalDiffuseSkyIrradiance;\r\n\r\n const properties = atmosphere.physicalProperties;\r\n if (this._lutData[0] === undefined || radius > properties.atmosphereRadius) {\r\n result.r = additionalDiffuseSkyIrradiance.r;\r\n result.g = additionalDiffuseSkyIrradiance.g;\r\n result.b = additionalDiffuseSkyIrradiance.b;\r\n return result;\r\n }\r\n\r\n const cosAngleLightToZenith = Vector3Dot(directionToLight, cameraGeocentricNormal);\r\n ComputeLutUVToRef(properties, radius, cosAngleLightToZenith, UvTemp);\r\n Sample2DRgbaToRef(UvTemp.x, UvTemp.y, LutWidthPx, LutHeightPx, this._lutData, Color4Temp, FromHalfFloat);\r\n\r\n const intensity = atmosphere.diffuseSkyIrradianceIntensity;\r\n result.r = intensity * (lightIrradiance * Color4Temp.r + additionalDiffuseSkyIrradiance.r);\r\n result.g = intensity * (lightIrradiance * Color4Temp.g + additionalDiffuseSkyIrradiance.g);\r\n result.b = intensity * (lightIrradiance * Color4Temp.b + additionalDiffuseSkyIrradiance.b);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Renders the LUT.\r\n * @returns True if the LUT was rendered.\r\n */\r\n public render(): boolean {\r\n // Only need to render the LUT once.\r\n const effectWrapper = this._effectWrapper;\r\n if (!this._isDirty || !effectWrapper?.isReady() || !this._renderTarget?.isReady()) {\r\n return false;\r\n }\r\n\r\n const engine = this._atmosphere.scene.getEngine();\r\n\r\n engine.bindFramebuffer(this.renderTarget.renderTarget!, undefined, undefined, undefined, true);\r\n\r\n const effectRenderer = this._effectRenderer!;\r\n effectRenderer.applyEffectWrapper(effectWrapper);\r\n\r\n effectRenderer.saveStates();\r\n effectRenderer.setViewport();\r\n\r\n const effect = effectWrapper.effect;\r\n effectRenderer.bindBuffers(effect);\r\n\r\n effect.setTexture(\"transmittanceLut\", this._atmosphere.transmittanceLut!.renderTarget);\r\n effect.setTexture(\"multiScatteringLut\", this._atmosphere.multiScatteringLutRenderTarget);\r\n\r\n this._atmosphere.bindUniformBufferToEffect(effect);\r\n\r\n effect.setFloat(\"depth\", 0.0);\r\n\r\n effectRenderer.draw();\r\n\r\n effectRenderer.restoreStates();\r\n engine.restoreDefaultFramebuffer();\r\n\r\n this._isDirty = false;\r\n\r\n // eslint-disable-next-line github/no-then\r\n void this.renderTarget.readPixels(0, 0, undefined, undefined, true /* noDataConversion */)?.then((value: ArrayBufferView) => {\r\n if (this._isDisposed) {\r\n return;\r\n }\r\n this._lutData = value as Uint8Array | Uint16Array;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Marks the LUT as needing to be rendered.\r\n */\r\n public markDirty(): void {\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Disposes the LUT.\r\n */\r\n public dispose() {\r\n if (this._renderTarget) {\r\n this._renderTarget.irradianceTexture = null;\r\n this._renderTarget.dispose();\r\n }\r\n this._renderTarget = null;\r\n this._effectWrapper?.dispose();\r\n this._effectWrapper = null;\r\n this._effectRenderer?.dispose();\r\n this._effectRenderer = null;\r\n this._isDisposed = true;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"diffuseSkyIrradianceLut.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/diffuseSkyIrradianceLut.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 { AtmospherePhysicalProperties } from \"./atmospherePhysicalProperties\";\r\nimport { Clamp } from \"core/Maths/math.scalar.functions\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { EffectRenderer, EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport { FromHalfFloat } from \"core/Misc/textureTools\";\r\nimport type { IColor3Like, IColor4Like, IVector2Like, IVector3Like } from \"core/Maths/math.like\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { Sample2DRgbaToRef } from \"./sampling\";\r\nimport { Vector3Dot } from \"core/Maths/math.vector.functions\";\r\nimport \"./Shaders/diffuseSkyIrradiance.fragment\";\r\nimport \"./Shaders/fullscreenTriangle.vertex\";\r\n\r\nconst RaySamples = 128;\r\nconst LutWidthPx = 64;\r\nconst LutHeightPx = 16;\r\nconst HalfTexelSize = { x: 0.5 / LutWidthPx, y: 0.5 / LutHeightPx };\r\nconst UnitToUVScale = { x: (LutWidthPx - 1.0) / LutWidthPx, y: (LutHeightPx - 1.0) / LutHeightPx };\r\nconst UvTemp = { x: Number.NaN, y: Number.NaN };\r\nconst Color4Temp = { r: Number.NaN, g: Number.NaN, b: Number.NaN, a: Number.NaN } as IColor4Like;\r\n\r\nconst ComputeLutUVToRef = (properties: AtmospherePhysicalProperties, radius: number, cosAngleLightToZenith: number, result: IVector2Like): void => {\r\n const unitX = Clamp(0.5 + 0.5 * cosAngleLightToZenith);\r\n const unitY = Clamp((radius - properties.planetRadius) / properties.atmosphereThickness);\r\n result.x = unitX * UnitToUVScale.x + HalfTexelSize.x;\r\n result.y = unitY * UnitToUVScale.y + HalfTexelSize.y;\r\n};\r\n\r\n/**\r\n * The diffuse sky irradiance LUT is used to query the diffuse irradiance at a specified position.\r\n */\r\nexport class DiffuseSkyIrradianceLut {\r\n private readonly _atmosphere: Atmosphere;\r\n private _renderTarget: Nullable<RenderTargetTexture> = null;\r\n private _effectWrapper: Nullable<EffectWrapper> = null;\r\n private _effectRenderer: Nullable<EffectRenderer> = null;\r\n private _isDirty = true;\r\n private _isDisposed = false;\r\n private _lutData: Uint8Array | Uint16Array = new Uint16Array(0);\r\n\r\n /**\r\n * True if the LUT needs to be rendered.\r\n */\r\n public get isDirty() {\r\n return this._isDirty;\r\n }\r\n\r\n /**\r\n * True if the LUT has been disposed.\r\n */\r\n public get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n /**\r\n * The render target used for this LUT.\r\n * @throws if the LUT has been disposed.\r\n */\r\n public get renderTarget(): RenderTargetTexture {\r\n if (this._isDisposed || this._renderTarget === null) {\r\n throw new Error();\r\n }\r\n return this._renderTarget;\r\n }\r\n\r\n /**\r\n * True if the LUT data has been read back from the GPU.\r\n */\r\n public get hasLutData(): boolean {\r\n return this._lutData[0] !== undefined;\r\n }\r\n\r\n /**\r\n * Constructs the {@link DiffuseSkyIrradianceLut}.\r\n * @param atmosphere - The atmosphere to use.\r\n */\r\n constructor(atmosphere: Atmosphere) {\r\n this._atmosphere = atmosphere;\r\n const scene = atmosphere.scene;\r\n const engine = scene.getEngine();\r\n\r\n const name = \"atmo-diffuseSkyIrradiance\";\r\n const caps = engine.getCaps();\r\n const textureType = caps.textureHalfFloatRender ? Constants.TEXTURETYPE_HALF_FLOAT : Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n const renderTarget = (this._renderTarget = new RenderTargetTexture(name, { width: LutWidthPx, height: LutHeightPx }, scene, {\r\n generateMipMaps: false,\r\n type: textureType,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n gammaSpace: false,\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\r\n const atmosphereUbo = atmosphere.uniformBuffer;\r\n const useUbo = atmosphereUbo.useUbo;\r\n\r\n const heightParam = engine.isWebGPU ? \"radius\" : \"filteringInfo.x\";\r\n this._effectWrapper = new EffectWrapper({\r\n engine,\r\n name,\r\n vertexShader: \"fullscreenTriangle\",\r\n fragmentShader: \"diffuseSkyIrradiance\",\r\n attributeNames: [\"position\"],\r\n uniformNames: [\"depth\", ...(useUbo ? [] : atmosphereUbo.getUniformNames())],\r\n uniformBuffers: useUbo ? [atmosphereUbo.name] : [],\r\n defines: [\r\n \"#define POSITION_VEC2\",\r\n `#define NUM_SAMPLES ${RaySamples}u`,\r\n \"#define CUSTOM_IRRADIANCE_FILTERING_INPUT /* empty */\", // empty, no input texture needed as the radiance is procedurally generated from ray marching.\r\n // The following ray marches the atmosphere to get the radiance.\r\n `#define CUSTOM_IRRADIANCE_FILTERING_FUNCTION vec3 c = integrateForIrradiance(n, Ls, vec3(0., ${heightParam}, 0.));`,\r\n ],\r\n samplers: [\"transmittanceLut\", \"multiScatteringLut\"],\r\n useShaderStore: true,\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 // The sky irradiance will also be used for the environment texture.\r\n scene.environmentTexture = renderTarget;\r\n scene.environmentTexture.irradianceTexture = renderTarget;\r\n scene.environmentIntensity = 1.0;\r\n\r\n // Prevent the irradiance LUT from being rendered redundantly at the beginning of the frame.\r\n scene.environmentTexture.isRenderTarget = false;\r\n }\r\n\r\n /**\r\n * Gets the diffuse sky irradiance for a surface oriented along the geocentric normal.\r\n * Resulting color is always in linear space.\r\n * @param directionToLight - The direction to the light in world space.\r\n * @param radius - The position's distance to the planet origin.\r\n * @param cameraGeocentricNormal - The geocentric normal of the camera.\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 radius: number,\r\n cameraGeocentricNormal: IVector3Like,\r\n lightIrradiance: number,\r\n result: T\r\n ): T {\r\n const atmosphere = this._atmosphere;\r\n const additionalDiffuseSkyIrradiance = atmosphere.additionalDiffuseSkyIrradiance;\r\n\r\n const properties = atmosphere.physicalProperties;\r\n if (this._lutData[0] === undefined || radius > properties.atmosphereRadius) {\r\n result.r = additionalDiffuseSkyIrradiance.r;\r\n result.g = additionalDiffuseSkyIrradiance.g;\r\n result.b = additionalDiffuseSkyIrradiance.b;\r\n return result;\r\n }\r\n\r\n const cosAngleLightToZenith = Vector3Dot(directionToLight, cameraGeocentricNormal);\r\n ComputeLutUVToRef(properties, radius, cosAngleLightToZenith, UvTemp);\r\n Sample2DRgbaToRef(UvTemp.x, UvTemp.y, LutWidthPx, LutHeightPx, this._lutData, Color4Temp, FromHalfFloat);\r\n\r\n const intensity = atmosphere.diffuseSkyIrradianceIntensity;\r\n result.r = intensity * (lightIrradiance * Color4Temp.r + additionalDiffuseSkyIrradiance.r);\r\n result.g = intensity * (lightIrradiance * Color4Temp.g + additionalDiffuseSkyIrradiance.g);\r\n result.b = intensity * (lightIrradiance * Color4Temp.b + additionalDiffuseSkyIrradiance.b);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Renders the LUT.\r\n * @returns True if the LUT was rendered.\r\n */\r\n public render(): boolean {\r\n // Only need to render the LUT once.\r\n const effectWrapper = this._effectWrapper;\r\n if (!this._isDirty || !effectWrapper?.isReady() || !this._renderTarget?.isReady()) {\r\n return false;\r\n }\r\n\r\n const engine = this._atmosphere.scene.getEngine();\r\n\r\n engine.bindFramebuffer(this.renderTarget.renderTarget!, undefined, undefined, undefined, true);\r\n\r\n const effectRenderer = this._effectRenderer!;\r\n effectRenderer.applyEffectWrapper(effectWrapper);\r\n\r\n effectRenderer.saveStates();\r\n effectRenderer.setViewport();\r\n\r\n const effect = effectWrapper.effect;\r\n effectRenderer.bindBuffers(effect);\r\n\r\n effect.setTexture(\"transmittanceLut\", this._atmosphere.transmittanceLut!.renderTarget);\r\n effect.setTexture(\"multiScatteringLut\", this._atmosphere.multiScatteringLutRenderTarget);\r\n\r\n this._atmosphere.bindUniformBufferToEffect(effect);\r\n\r\n effect.setFloat(\"depth\", 0.0);\r\n\r\n effectRenderer.draw();\r\n\r\n effectRenderer.restoreStates();\r\n engine.restoreDefaultFramebuffer();\r\n\r\n this._isDirty = false;\r\n\r\n // eslint-disable-next-line github/no-then\r\n void this.renderTarget.readPixels(0, 0, undefined, undefined, true /* noDataConversion */)?.then((value: ArrayBufferView) => {\r\n if (this._isDisposed) {\r\n return;\r\n }\r\n this._lutData = value as Uint8Array | Uint16Array;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Marks the LUT as needing to be rendered.\r\n */\r\n public markDirty(): void {\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * Disposes the LUT.\r\n */\r\n public dispose() {\r\n if (this._renderTarget) {\r\n this._renderTarget.irradianceTexture = null;\r\n this._renderTarget.dispose();\r\n }\r\n this._renderTarget = null;\r\n this._effectWrapper?.dispose();\r\n this._effectWrapper = null;\r\n this._effectRenderer?.dispose();\r\n this._effectRenderer = null;\r\n this._isDisposed = true;\r\n }\r\n}\r\n"]}
@@ -1,5 +1,5 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
- // MIT License
2
+ // Licensed under the MIT License.
3
3
  export * from "./atmosphere.js";
4
4
  export * from "./atmosphereOptions.js";
5
5
  export * from "./atmospherePhysicalProperties.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,cAAc;AAEd,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// MIT License\r\n\r\nexport * from \"./atmosphere\";\r\nexport * from \"./atmosphereOptions\";\r\nexport * from \"./atmospherePhysicalProperties\";\r\nexport * from \"./atmospherePhysicalPropertiesOptions\";\r\nexport * from \"./diffuseSkyIrradianceLut\";\r\nexport * from \"./transmittanceLut\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// Licensed under the MIT License.\r\n\r\nexport * from \"./atmosphere\";\r\nexport * from \"./atmosphereOptions\";\r\nexport * from \"./atmospherePhysicalProperties\";\r\nexport * from \"./atmospherePhysicalPropertiesOptions\";\r\nexport * from \"./diffuseSkyIrradianceLut\";\r\nexport * from \"./transmittanceLut\";\r\n"]}
@@ -1,5 +1,5 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
- // MIT License
2
+ // Licensed under the MIT License.
3
3
  import { Clamp } from "@onerjs/core/Maths/math.scalar.functions.js";
4
4
  const MakeTempColor4Like = () => {
5
5
  return {