@onerjs/addons 8.25.4 → 8.25.5

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 (81) hide show
  1. package/atmosphere/Shaders/ShadersInclude/atmosphereFragmentDeclaration.d.ts +5 -0
  2. package/atmosphere/Shaders/ShadersInclude/atmosphereFragmentDeclaration.js +12 -0
  3. package/atmosphere/Shaders/ShadersInclude/atmosphereFragmentDeclaration.js.map +1 -0
  4. package/atmosphere/Shaders/ShadersInclude/atmosphereFunctions.d.ts +6 -0
  5. package/atmosphere/Shaders/ShadersInclude/atmosphereFunctions.js +234 -0
  6. package/atmosphere/Shaders/ShadersInclude/atmosphereFunctions.js.map +1 -0
  7. package/atmosphere/Shaders/ShadersInclude/atmosphereUboDeclaration.d.ts +5 -0
  8. package/atmosphere/Shaders/ShadersInclude/atmosphereUboDeclaration.js +12 -0
  9. package/atmosphere/Shaders/ShadersInclude/atmosphereUboDeclaration.js.map +1 -0
  10. package/atmosphere/Shaders/ShadersInclude/atmosphereVertexDeclaration.d.ts +5 -0
  11. package/atmosphere/Shaders/ShadersInclude/atmosphereVertexDeclaration.js +12 -0
  12. package/atmosphere/Shaders/ShadersInclude/atmosphereVertexDeclaration.js.map +1 -0
  13. package/atmosphere/Shaders/ShadersInclude/depthFunctions.d.ts +5 -0
  14. package/atmosphere/Shaders/ShadersInclude/depthFunctions.js +19 -0
  15. package/atmosphere/Shaders/ShadersInclude/depthFunctions.js.map +1 -0
  16. package/atmosphere/Shaders/aerialPerspective.fragment.d.ts +9 -0
  17. package/atmosphere/Shaders/aerialPerspective.fragment.js +25 -0
  18. package/atmosphere/Shaders/aerialPerspective.fragment.js.map +1 -0
  19. package/atmosphere/Shaders/compositeAerialPerspective.fragment.d.ts +10 -0
  20. package/atmosphere/Shaders/compositeAerialPerspective.fragment.js +72 -0
  21. package/atmosphere/Shaders/compositeAerialPerspective.fragment.js.map +1 -0
  22. package/atmosphere/Shaders/compositeGlobeAtmosphere.fragment.d.ts +10 -0
  23. package/atmosphere/Shaders/compositeGlobeAtmosphere.fragment.js +96 -0
  24. package/atmosphere/Shaders/compositeGlobeAtmosphere.fragment.js.map +1 -0
  25. package/atmosphere/Shaders/compositeSky.fragment.d.ts +10 -0
  26. package/atmosphere/Shaders/compositeSky.fragment.js +75 -0
  27. package/atmosphere/Shaders/compositeSky.fragment.js.map +1 -0
  28. package/atmosphere/Shaders/diffuseSkyIrradiance.fragment.d.ts +13 -0
  29. package/atmosphere/Shaders/diffuseSkyIrradiance.fragment.js +49 -0
  30. package/atmosphere/Shaders/diffuseSkyIrradiance.fragment.js.map +1 -0
  31. package/atmosphere/Shaders/fullscreenTriangle.vertex.d.ts +7 -0
  32. package/atmosphere/Shaders/fullscreenTriangle.vertex.js +31 -0
  33. package/atmosphere/Shaders/fullscreenTriangle.vertex.js.map +1 -0
  34. package/atmosphere/Shaders/multiScattering.fragment.d.ts +9 -0
  35. package/atmosphere/Shaders/multiScattering.fragment.js +21 -0
  36. package/atmosphere/Shaders/multiScattering.fragment.js.map +1 -0
  37. package/atmosphere/Shaders/skyView.fragment.d.ts +9 -0
  38. package/atmosphere/Shaders/skyView.fragment.js +20 -0
  39. package/atmosphere/Shaders/skyView.fragment.js.map +1 -0
  40. package/atmosphere/Shaders/transmittance.fragment.d.ts +9 -0
  41. package/atmosphere/Shaders/transmittance.fragment.js +20 -0
  42. package/atmosphere/Shaders/transmittance.fragment.js.map +1 -0
  43. package/atmosphere/atmosphere.d.ts +418 -0
  44. package/atmosphere/atmosphere.js +1446 -0
  45. package/atmosphere/atmosphere.js.map +1 -0
  46. package/atmosphere/atmosphereOptions.d.ts +135 -0
  47. package/atmosphere/atmosphereOptions.js +4 -0
  48. package/atmosphere/atmosphereOptions.js.map +1 -0
  49. package/atmosphere/atmospherePBRMaterialPlugin.d.ts +72 -0
  50. package/atmosphere/atmospherePBRMaterialPlugin.js +230 -0
  51. package/atmosphere/atmospherePBRMaterialPlugin.js.map +1 -0
  52. package/atmosphere/atmospherePerCameraVariables.d.ts +102 -0
  53. package/atmosphere/atmospherePerCameraVariables.js +189 -0
  54. package/atmosphere/atmospherePerCameraVariables.js.map +1 -0
  55. package/atmosphere/atmospherePhysicalProperties.d.ts +154 -0
  56. package/atmosphere/atmospherePhysicalProperties.js +305 -0
  57. package/atmosphere/atmospherePhysicalProperties.js.map +1 -0
  58. package/atmosphere/atmospherePhysicalPropertiesOptions.d.ts +52 -0
  59. package/atmosphere/atmospherePhysicalPropertiesOptions.js +4 -0
  60. package/atmosphere/atmospherePhysicalPropertiesOptions.js.map +1 -0
  61. package/atmosphere/diffuseSkyIrradianceLut.d.ts +63 -0
  62. package/atmosphere/diffuseSkyIrradianceLut.js +199 -0
  63. package/atmosphere/diffuseSkyIrradianceLut.js.map +1 -0
  64. package/atmosphere/index.d.ts +6 -0
  65. package/atmosphere/index.js +9 -0
  66. package/atmosphere/index.js.map +1 -0
  67. package/atmosphere/sampling.d.ts +15 -0
  68. package/atmosphere/sampling.js +89 -0
  69. package/atmosphere/sampling.js.map +1 -0
  70. package/atmosphere/test/unit/sampling.test.d.ts +1 -0
  71. package/atmosphere/test/unit/sampling.test.js +77 -0
  72. package/atmosphere/test/unit/sampling.test.js.map +1 -0
  73. package/atmosphere/transmittanceLut.d.ts +68 -0
  74. package/atmosphere/transmittanceLut.js +207 -0
  75. package/atmosphere/transmittanceLut.js.map +1 -0
  76. package/index.d.ts +1 -0
  77. package/index.js +1 -0
  78. package/index.js.map +1 -1
  79. package/msdfText/paragraphOptions.d.ts +1 -1
  80. package/msdfText/paragraphOptions.js.map +1 -1
  81. package/package.json +2 -2
@@ -0,0 +1,199 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // MIT License
3
+ import { Clamp } from "@onerjs/core/Maths/math.scalar.functions.js";
4
+ import { Constants } from "@onerjs/core/Engines/constants.js";
5
+ import { EffectRenderer, EffectWrapper } from "@onerjs/core/Materials/effectRenderer.js";
6
+ import { FromHalfFloat } from "@onerjs/core/Misc/textureTools.js";
7
+ import { RenderTargetTexture } from "@onerjs/core/Materials/Textures/renderTargetTexture.js";
8
+ import { Sample2DRgbaToRef } from "./sampling.js";
9
+ import "./Shaders/diffuseSkyIrradiance.fragment.js";
10
+ import "./Shaders/fullscreenTriangle.vertex.js";
11
+ const RaySamples = 128;
12
+ const LutWidthPx = 64;
13
+ const LutHeightPx = 16;
14
+ const HalfTexelSize = { x: 0.5 / LutWidthPx, y: 0.5 / LutHeightPx };
15
+ const UnitToUVScale = { x: (LutWidthPx - 1.0) / LutWidthPx, y: (LutHeightPx - 1.0) / LutHeightPx };
16
+ const UvTemp = { x: Number.NaN, y: Number.NaN };
17
+ const Color4Temp = { r: Number.NaN, g: Number.NaN, b: Number.NaN, a: Number.NaN };
18
+ const ComputeLutUVToRef = (properties, radius, cosAngleLightToZenith, result) => {
19
+ const unitX = Clamp(0.5 + 0.5 * cosAngleLightToZenith);
20
+ const unitY = Clamp((radius - properties.planetRadius) / properties.atmosphereThickness);
21
+ result.x = unitX * UnitToUVScale.x + HalfTexelSize.x;
22
+ result.y = unitY * UnitToUVScale.y + HalfTexelSize.y;
23
+ };
24
+ /**
25
+ * The diffuse sky irradiance LUT is used to query the diffuse irradiance at a specified position.
26
+ */
27
+ export class DiffuseSkyIrradianceLut {
28
+ /**
29
+ * True if the LUT needs to be rendered.
30
+ */
31
+ get isDirty() {
32
+ return this._isDirty;
33
+ }
34
+ /**
35
+ * True if the LUT has been disposed.
36
+ */
37
+ get isDisposed() {
38
+ return this._isDisposed;
39
+ }
40
+ /**
41
+ * The render target used for this LUT.
42
+ * @throws if the LUT has been disposed.
43
+ */
44
+ get renderTarget() {
45
+ if (this._isDisposed || this._renderTarget === null) {
46
+ throw new Error();
47
+ }
48
+ return this._renderTarget;
49
+ }
50
+ /**
51
+ * True if the LUT data has been read back from the GPU.
52
+ */
53
+ get hasLutData() {
54
+ return this._lutData[0] !== undefined;
55
+ }
56
+ /**
57
+ * Constructs the {@link DiffuseSkyIrradianceLut}.
58
+ * @param atmosphere - The atmosphere to use.
59
+ */
60
+ constructor(atmosphere) {
61
+ this._renderTarget = null;
62
+ this._effectWrapper = null;
63
+ this._effectRenderer = null;
64
+ this._isDirty = true;
65
+ this._isDisposed = false;
66
+ this._lutData = new Uint16Array(0);
67
+ this._atmosphere = atmosphere;
68
+ const scene = atmosphere.scene;
69
+ const engine = scene.getEngine();
70
+ const name = "atmo-diffuseSkyIrradiance";
71
+ const renderTarget = (this._renderTarget = new RenderTargetTexture(name, { width: LutWidthPx, height: LutHeightPx }, scene, {
72
+ generateMipMaps: false,
73
+ type: Constants.TEXTURETYPE_HALF_FLOAT,
74
+ samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,
75
+ generateDepthBuffer: false,
76
+ gammaSpace: false,
77
+ }));
78
+ renderTarget.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;
79
+ renderTarget.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;
80
+ renderTarget.anisotropicFilteringLevel = 1;
81
+ renderTarget.skipInitialClear = true;
82
+ const useUbo = atmosphere.uniformBuffer.useUbo;
83
+ this._effectWrapper = new EffectWrapper({
84
+ engine,
85
+ name,
86
+ vertexShader: "fullscreenTriangle",
87
+ fragmentShader: "diffuseSkyIrradiance",
88
+ attributeNames: ["position"],
89
+ uniformNames: ["depth", ...(useUbo ? [] : atmosphere.uniformBuffer.getUniformNames())],
90
+ uniformBuffers: useUbo ? [atmosphere.uniformBuffer.name] : [],
91
+ defines: [
92
+ "#define POSITION_VEC2",
93
+ `#define NUM_SAMPLES ${RaySamples}u`,
94
+ "#define CUSTOM_IRRADIANCE_FILTERING_INPUT /* empty */", // empty, no input texture needed as the radiance is procedurally generated from ray marching.
95
+ // The following ray marches the atmosphere to get the radiance.
96
+ "#define CUSTOM_IRRADIANCE_FILTERING_FUNCTION vec3 c = integrateForIrradiance(n, Ls, vec3(0., filteringInfo.x, 0.));",
97
+ ],
98
+ samplers: ["transmittanceLut", "multiScatteringLut"],
99
+ useShaderStore: true,
100
+ });
101
+ this._effectRenderer = new EffectRenderer(engine, {
102
+ // Full screen triangle.
103
+ indices: [0, 2, 1],
104
+ positions: [-1, -1, -1, 3, 3, -1],
105
+ });
106
+ // The sky irradiance will also be used for the environment texture.
107
+ scene.environmentTexture = renderTarget;
108
+ scene.environmentTexture.irradianceTexture = renderTarget;
109
+ scene.environmentIntensity = 1.0;
110
+ // Prevent the irradiance LUT from being rendered redundantly at the beginning of the frame.
111
+ scene.environmentTexture.isRenderTarget = false;
112
+ }
113
+ /**
114
+ * Gets the diffuse sky irradiance for a surface oriented along the geocentric normal.
115
+ * Resulting color is always in linear space.
116
+ * @param directionToLight - The direction to the light in world space.
117
+ * @param radius - The position's distance to the planet origin.
118
+ * @param cameraGeocentricNormal - The geocentric normal of the camera.
119
+ * @param lightIrradiance - The irradiance of the light.
120
+ * @param result - The color to store the result in.
121
+ * @returns The result color.
122
+ */
123
+ getDiffuseSkyIrradianceToRef(directionToLight, radius, cameraGeocentricNormal, lightIrradiance, result) {
124
+ const atmosphere = this._atmosphere;
125
+ const additionalDiffuseSkyIrradiance = atmosphere.additionalDiffuseSkyIrradiance;
126
+ const properties = atmosphere.physicalProperties;
127
+ if (this._lutData[0] === undefined || radius > properties.atmosphereRadius) {
128
+ result.r = additionalDiffuseSkyIrradiance.r;
129
+ result.g = additionalDiffuseSkyIrradiance.g;
130
+ result.b = additionalDiffuseSkyIrradiance.b;
131
+ return result;
132
+ }
133
+ const cosAngleLightToZenith = directionToLight.x * cameraGeocentricNormal.x + directionToLight.y * cameraGeocentricNormal.y + directionToLight.z * cameraGeocentricNormal.z;
134
+ ComputeLutUVToRef(properties, radius, cosAngleLightToZenith, UvTemp);
135
+ Sample2DRgbaToRef(UvTemp.x, UvTemp.y, LutWidthPx, LutHeightPx, this._lutData, Color4Temp, FromHalfFloat);
136
+ const intensity = atmosphere.diffuseSkyIrradianceIntensity;
137
+ result.r = intensity * (lightIrradiance * Color4Temp.r + additionalDiffuseSkyIrradiance.r);
138
+ result.g = intensity * (lightIrradiance * Color4Temp.g + additionalDiffuseSkyIrradiance.g);
139
+ result.b = intensity * (lightIrradiance * Color4Temp.b + additionalDiffuseSkyIrradiance.b);
140
+ return result;
141
+ }
142
+ /**
143
+ * Renders the LUT.
144
+ * @returns True if the LUT was rendered.
145
+ */
146
+ render() {
147
+ // Only need to render the LUT once.
148
+ const effectWrapper = this._effectWrapper;
149
+ if (!this._isDirty || !effectWrapper?.isReady() || !this._renderTarget?.isReady()) {
150
+ return false;
151
+ }
152
+ const engine = this._atmosphere.scene.getEngine();
153
+ engine.bindFramebuffer(this.renderTarget.renderTarget, undefined, undefined, undefined, true);
154
+ const effectRenderer = this._effectRenderer;
155
+ effectRenderer.applyEffectWrapper(effectWrapper);
156
+ effectRenderer.saveStates();
157
+ effectRenderer.setViewport();
158
+ const effect = effectWrapper.effect;
159
+ effectRenderer.bindBuffers(effect);
160
+ effect.setTexture("transmittanceLut", this._atmosphere.transmittanceLut.renderTarget);
161
+ effect.setTexture("multiScatteringLut", this._atmosphere.multiScatteringLutRenderTarget);
162
+ this._atmosphere.bindUniformBufferToEffect(effect);
163
+ effect.setFloat("depth", 0.0);
164
+ effectRenderer.draw();
165
+ effectRenderer.restoreStates();
166
+ engine.restoreDefaultFramebuffer();
167
+ this._isDirty = false;
168
+ // eslint-disable-next-line github/no-then
169
+ void this.renderTarget.readPixels(0, 0, undefined, undefined, true /* noDataConversion */)?.then((value) => {
170
+ if (this._isDisposed) {
171
+ return;
172
+ }
173
+ this._lutData = value;
174
+ });
175
+ return true;
176
+ }
177
+ /**
178
+ * Marks the LUT as needing to be rendered.
179
+ */
180
+ markDirty() {
181
+ this._isDirty = true;
182
+ }
183
+ /**
184
+ * Disposes the LUT.
185
+ */
186
+ dispose() {
187
+ if (this._renderTarget) {
188
+ this._renderTarget.irradianceTexture = null;
189
+ this._renderTarget.dispose();
190
+ }
191
+ this._renderTarget = null;
192
+ this._effectWrapper?.dispose();
193
+ this._effectWrapper = null;
194
+ this._effectRenderer?.dispose();
195
+ this._effectRenderer = null;
196
+ this._isDisposed = true;
197
+ }
198
+ }
199
+ //# sourceMappingURL=diffuseSkyIrradianceLut.js.map
@@ -0,0 +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 \"./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 renderTarget = (this._renderTarget = new RenderTargetTexture(name, { width: LutWidthPx, height: LutHeightPx }, scene, {\r\n generateMipMaps: false,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\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 = directionToLight.x * cameraGeocentricNormal.x + directionToLight.y * cameraGeocentricNormal.y + directionToLight.z * cameraGeocentricNormal.z;\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"]}
@@ -0,0 +1,6 @@
1
+ export * from "./atmosphere.js";
2
+ export * from "./atmosphereOptions.js";
3
+ export * from "./atmospherePhysicalProperties.js";
4
+ export * from "./atmospherePhysicalPropertiesOptions.js";
5
+ export * from "./diffuseSkyIrradianceLut.js";
6
+ export * from "./transmittanceLut.js";
@@ -0,0 +1,9 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // MIT License
3
+ export * from "./atmosphere.js";
4
+ export * from "./atmosphereOptions.js";
5
+ export * from "./atmospherePhysicalProperties.js";
6
+ export * from "./atmospherePhysicalPropertiesOptions.js";
7
+ export * from "./diffuseSkyIrradianceLut.js";
8
+ export * from "./transmittanceLut.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,15 @@
1
+ import type { IColor4Like } from "@onerjs/core/Maths/math.like.js";
2
+ /**
3
+ * Samples the texture data at the given uv coordinate using bilinear interpolation.
4
+ * Note this will not match GPU sampling behavior exactly.
5
+ * Currently assumes clamping behavior.
6
+ * @param u - The u coordinate to sample.
7
+ * @param v - The v coordinate to sample.
8
+ * @param widthPx - The width of the texture in texels.
9
+ * @param heightPx - The height of the texture in texels.
10
+ * @param data - The texture data to sample.
11
+ * @param result - The color to store the sample.
12
+ * @param normalizeFunc - The function to normalize the texel values. Default is to divide by 255.
13
+ * @returns The result color.
14
+ */
15
+ export declare function Sample2DRgbaToRef<T extends IColor4Like>(u: number, v: number, widthPx: number, heightPx: number, data: Uint8Array | Uint16Array | Float32Array, result: T, normalizeFunc?: (value: number) => number): T;
@@ -0,0 +1,89 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // MIT License
3
+ import { Clamp } from "@onerjs/core/Maths/math.scalar.functions.js";
4
+ const MakeTempColor4Like = () => {
5
+ return {
6
+ r: Number.NaN,
7
+ g: Number.NaN,
8
+ b: Number.NaN,
9
+ a: Number.NaN,
10
+ };
11
+ };
12
+ const TmpColor1 = MakeTempColor4Like();
13
+ const TmpColor2 = MakeTempColor4Like();
14
+ const TmpColor3 = MakeTempColor4Like();
15
+ const TmpColor4 = MakeTempColor4Like();
16
+ /**
17
+ * Samples the texture data at the given uv coordinate using bilinear interpolation.
18
+ * Note this will not match GPU sampling behavior exactly.
19
+ * Currently assumes clamping behavior.
20
+ * @param u - The u coordinate to sample.
21
+ * @param v - The v coordinate to sample.
22
+ * @param widthPx - The width of the texture in texels.
23
+ * @param heightPx - The height of the texture in texels.
24
+ * @param data - The texture data to sample.
25
+ * @param result - The color to store the sample.
26
+ * @param normalizeFunc - The function to normalize the texel values. Default is to divide by 255.
27
+ * @returns The result color.
28
+ */
29
+ export function Sample2DRgbaToRef(u, v, widthPx, heightPx, data, result, normalizeFunc = (value) => value / 255.0) {
30
+ if (widthPx <= 0 || heightPx <= 0) {
31
+ throw new Error("Sample2DRgbaToRef: widthPx and heightPx must be positive.");
32
+ }
33
+ const expectedLength = widthPx * heightPx * 4;
34
+ if (data.length < expectedLength) {
35
+ throw new Error(`Sample2DRgbaToRef: data length (${data.length}) is less than required (${expectedLength}).`);
36
+ }
37
+ // Default to clamping behavior, but could support others.
38
+ u = Clamp(u);
39
+ v = Clamp(v);
40
+ // Compute 4 nearest neighbor texels.
41
+ const fractionalTexelX = Math.max(u * widthPx - 0.5, 0);
42
+ const fractionalTexelY = Math.max(v * heightPx - 0.5, 0);
43
+ const xLeft = Math.floor(fractionalTexelX);
44
+ const xRight = Math.min(xLeft + 1, widthPx - 1);
45
+ const yBottom = Math.floor(fractionalTexelY);
46
+ const yTop = Math.min(yBottom + 1, heightPx - 1);
47
+ // Sample nearest neighbor texels.
48
+ const lowerLeftColor = TexelFetch2DRgbaToRef(xLeft, yBottom, widthPx, heightPx, data, TmpColor1, normalizeFunc);
49
+ const upperLeftColor = TexelFetch2DRgbaToRef(xLeft, yTop, widthPx, heightPx, data, TmpColor2, normalizeFunc);
50
+ const lowerRightColor = TexelFetch2DRgbaToRef(xRight, yBottom, widthPx, heightPx, data, TmpColor3, normalizeFunc);
51
+ const upperRightColor = TexelFetch2DRgbaToRef(xRight, yTop, widthPx, heightPx, data, TmpColor4, normalizeFunc);
52
+ // Compute weights.
53
+ const tX = fractionalTexelX - xLeft;
54
+ const tY = fractionalTexelY - yBottom;
55
+ const oneMinusTX = 1.0 - tX;
56
+ const oneMinusTY = 1.0 - tY;
57
+ const w0 = oneMinusTX * oneMinusTY;
58
+ const w1 = tX * oneMinusTY;
59
+ const w2 = oneMinusTX * tY;
60
+ const w3 = tX * tY;
61
+ // Compute the result.
62
+ result.r = lowerLeftColor.r * w0 + lowerRightColor.r * w1 + upperLeftColor.r * w2 + upperRightColor.r * w3;
63
+ result.g = lowerLeftColor.g * w0 + lowerRightColor.g * w1 + upperLeftColor.g * w2 + upperRightColor.g * w3;
64
+ result.b = lowerLeftColor.b * w0 + lowerRightColor.b * w1 + upperLeftColor.b * w2 + upperRightColor.b * w3;
65
+ result.a = lowerLeftColor.a * w0 + lowerRightColor.a * w1 + upperLeftColor.a * w2 + upperRightColor.a * w3;
66
+ return result;
67
+ }
68
+ /**
69
+ * Fetches a texel from a 2D texture and stores the result in the given color.
70
+ * @param x - The x coordinate in texels.
71
+ * @param y - The y coordinate in texels.
72
+ * @param width - The width of the texture in texels.
73
+ * @param height - The height of the texture in texels.
74
+ * @param data - The texture data to sample from.
75
+ * @param result - The color to store the sampled color in.
76
+ * @param normalizeFunc - The function to normalize the texel values. Default is to divide by 255.
77
+ * @returns The result color.
78
+ */
79
+ const TexelFetch2DRgbaToRef = (x, y, width, height, data, result, normalizeFunc = (value) => value / 255.0) => {
80
+ const clampedTexelX = Clamp(x, 0, width - 1);
81
+ const clampedTexelY = Clamp(y, 0, height - 1);
82
+ const index = 4 * (clampedTexelY * width + clampedTexelX);
83
+ result.r = normalizeFunc(data[index]);
84
+ result.g = normalizeFunc(data[index + 1]);
85
+ result.b = normalizeFunc(data[index + 2]);
86
+ result.a = normalizeFunc(data[index + 3]);
87
+ return result;
88
+ };
89
+ //# sourceMappingURL=sampling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sampling.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/sampling.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// MIT License\r\n\r\nimport { Clamp } from \"core/Maths/math.scalar.functions\";\r\nimport type { IColor4Like } from \"core/Maths/math.like\";\r\n\r\nconst MakeTempColor4Like = (): IColor4Like => {\r\n return {\r\n r: Number.NaN,\r\n g: Number.NaN,\r\n b: Number.NaN,\r\n a: Number.NaN,\r\n };\r\n};\r\n\r\nconst TmpColor1 = MakeTempColor4Like();\r\nconst TmpColor2 = MakeTempColor4Like();\r\nconst TmpColor3 = MakeTempColor4Like();\r\nconst TmpColor4 = MakeTempColor4Like();\r\n\r\n/**\r\n * Samples the texture data at the given uv coordinate using bilinear interpolation.\r\n * Note this will not match GPU sampling behavior exactly.\r\n * Currently assumes clamping behavior.\r\n * @param u - The u coordinate to sample.\r\n * @param v - The v coordinate to sample.\r\n * @param widthPx - The width of the texture in texels.\r\n * @param heightPx - The height of the texture in texels.\r\n * @param data - The texture data to sample.\r\n * @param result - The color to store the sample.\r\n * @param normalizeFunc - The function to normalize the texel values. Default is to divide by 255.\r\n * @returns The result color.\r\n */\r\nexport function Sample2DRgbaToRef<T extends IColor4Like>(\r\n u: number,\r\n v: number,\r\n widthPx: number,\r\n heightPx: number,\r\n data: Uint8Array | Uint16Array | Float32Array,\r\n result: T,\r\n normalizeFunc = (value: number) => value / 255.0\r\n): T {\r\n if (widthPx <= 0 || heightPx <= 0) {\r\n throw new Error(\"Sample2DRgbaToRef: widthPx and heightPx must be positive.\");\r\n }\r\n\r\n const expectedLength = widthPx * heightPx * 4;\r\n if (data.length < expectedLength) {\r\n throw new Error(`Sample2DRgbaToRef: data length (${data.length}) is less than required (${expectedLength}).`);\r\n }\r\n\r\n // Default to clamping behavior, but could support others.\r\n u = Clamp(u);\r\n v = Clamp(v);\r\n\r\n // Compute 4 nearest neighbor texels.\r\n const fractionalTexelX = Math.max(u * widthPx - 0.5, 0);\r\n const fractionalTexelY = Math.max(v * heightPx - 0.5, 0);\r\n const xLeft = Math.floor(fractionalTexelX);\r\n const xRight = Math.min(xLeft + 1, widthPx - 1);\r\n const yBottom = Math.floor(fractionalTexelY);\r\n const yTop = Math.min(yBottom + 1, heightPx - 1);\r\n\r\n // Sample nearest neighbor texels.\r\n const lowerLeftColor = TexelFetch2DRgbaToRef(xLeft, yBottom, widthPx, heightPx, data, TmpColor1, normalizeFunc);\r\n const upperLeftColor = TexelFetch2DRgbaToRef(xLeft, yTop, widthPx, heightPx, data, TmpColor2, normalizeFunc);\r\n const lowerRightColor = TexelFetch2DRgbaToRef(xRight, yBottom, widthPx, heightPx, data, TmpColor3, normalizeFunc);\r\n const upperRightColor = TexelFetch2DRgbaToRef(xRight, yTop, widthPx, heightPx, data, TmpColor4, normalizeFunc);\r\n\r\n // Compute weights.\r\n const tX = fractionalTexelX - xLeft;\r\n const tY = fractionalTexelY - yBottom;\r\n const oneMinusTX = 1.0 - tX;\r\n const oneMinusTY = 1.0 - tY;\r\n const w0 = oneMinusTX * oneMinusTY;\r\n const w1 = tX * oneMinusTY;\r\n const w2 = oneMinusTX * tY;\r\n const w3 = tX * tY;\r\n\r\n // Compute the result.\r\n result.r = lowerLeftColor.r * w0 + lowerRightColor.r * w1 + upperLeftColor.r * w2 + upperRightColor.r * w3;\r\n result.g = lowerLeftColor.g * w0 + lowerRightColor.g * w1 + upperLeftColor.g * w2 + upperRightColor.g * w3;\r\n result.b = lowerLeftColor.b * w0 + lowerRightColor.b * w1 + upperLeftColor.b * w2 + upperRightColor.b * w3;\r\n result.a = lowerLeftColor.a * w0 + lowerRightColor.a * w1 + upperLeftColor.a * w2 + upperRightColor.a * w3;\r\n return result;\r\n}\r\n\r\n/**\r\n * Fetches a texel from a 2D texture and stores the result in the given color.\r\n * @param x - The x coordinate in texels.\r\n * @param y - The y coordinate in texels.\r\n * @param width - The width of the texture in texels.\r\n * @param height - The height of the texture in texels.\r\n * @param data - The texture data to sample from.\r\n * @param result - The color to store the sampled color in.\r\n * @param normalizeFunc - The function to normalize the texel values. Default is to divide by 255.\r\n * @returns The result color.\r\n */\r\nconst TexelFetch2DRgbaToRef = <T extends IColor4Like>(\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n data: Uint8Array | Uint16Array | Float32Array,\r\n result: T,\r\n normalizeFunc = (value: number) => value / 255.0\r\n): T => {\r\n const clampedTexelX = Clamp(x, 0, width - 1);\r\n const clampedTexelY = Clamp(y, 0, height - 1);\r\n const index = 4 * (clampedTexelY * width + clampedTexelX);\r\n result.r = normalizeFunc(data[index]);\r\n result.g = normalizeFunc(data[index + 1]);\r\n result.b = normalizeFunc(data[index + 2]);\r\n result.a = normalizeFunc(data[index + 3]);\r\n return result;\r\n};\r\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,77 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // MIT License
3
+ import { Sample2DRgbaToRef } from "../../sampling.js";
4
+ const Black = { r: 0, g: 0, b: 0, a: 1.0 };
5
+ const DarkGrey = { r: 0.25, g: 0.25, b: 0.25, a: 1.0 };
6
+ const Grey = { r: 0.5, g: 0.5, b: 0.5, a: 1.0 };
7
+ const White = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };
8
+ const Red = { r: 1.0, g: 0.0, b: 0.0, a: 1.0 };
9
+ const Green = { r: 0.0, g: 1.0, b: 0.0, a: 1.0 };
10
+ const Blue = { r: 0.0, g: 0.0, b: 1.0, a: 1.0 };
11
+ expect.extend({
12
+ toBeApproxColor4Like(received, expected) {
13
+ const isEqual = Math.abs(received.r - expected.r) < 0.0001 &&
14
+ Math.abs(received.g - expected.g) < 0.0001 &&
15
+ Math.abs(received.b - expected.b) < 0.0001 &&
16
+ Math.abs(received.a - expected.a) < 0.0001;
17
+ return {
18
+ message: () => `expected ${JSON.stringify(received)} to be close to ${JSON.stringify(expected)}`,
19
+ pass: isEqual,
20
+ };
21
+ },
22
+ });
23
+ describe("textureSampler", () => {
24
+ test("testVertical2x2", () => {
25
+ const testData2x2 = new Float32Array([Black, Black, White, White].flatMap((x) => [x.r, x.g, x.b, x.a]));
26
+ const result = { r: 0, g: 0, b: 0, a: 0 };
27
+ Sample2DRgbaToRef(0.0, 0.0, 2, 2, testData2x2, result, (value) => value);
28
+ expect(result).toBeApproxColor4Like(Black);
29
+ Sample2DRgbaToRef(1.0, 0.25, 2, 2, testData2x2, result, (value) => value);
30
+ expect(result).toBeApproxColor4Like(Black);
31
+ Sample2DRgbaToRef(1.0, 0.375, 2, 2, testData2x2, result, (value) => value);
32
+ expect(result).toBeApproxColor4Like(DarkGrey);
33
+ Sample2DRgbaToRef(1.0, 0.5, 2, 2, testData2x2, result, (value) => value);
34
+ expect(result).toBeApproxColor4Like(Grey);
35
+ Sample2DRgbaToRef(0.5, 0.5, 2, 2, testData2x2, result, (value) => value);
36
+ expect(result).toBeApproxColor4Like(Grey);
37
+ Sample2DRgbaToRef(1.0, 1.0, 2, 2, testData2x2, result, (value) => value);
38
+ expect(result).toBeApproxColor4Like(White);
39
+ });
40
+ test("testVertical3x3", () => {
41
+ const testData2x2 = new Float32Array([Black, Black, White, White, White, White, White, White, White].flatMap((x) => [x.r, x.g, x.b, x.a]));
42
+ const result = { r: 0, g: 0, b: 0, a: 0 };
43
+ Sample2DRgbaToRef(0.33333333333, 0.33333333333, 3, 3, testData2x2, result, (value) => value);
44
+ expect(result).toBeApproxColor4Like(Grey);
45
+ });
46
+ test("testHorizontal2x2", () => {
47
+ const testData2x2 = new Float32Array([Black, White, Black, White].flatMap((x) => [x.r, x.g, x.b, x.a]));
48
+ const result = { r: 0, g: 0, b: 0, a: 0 };
49
+ Sample2DRgbaToRef(0.0, 0.0, 2, 2, testData2x2, result, (value) => value);
50
+ expect(result).toBeApproxColor4Like(Black);
51
+ Sample2DRgbaToRef(0.5, 1.0, 2, 2, testData2x2, result, (value) => value);
52
+ expect(result).toBeApproxColor4Like(Grey);
53
+ Sample2DRgbaToRef(0.5, 0.5, 2, 2, testData2x2, result, (value) => value);
54
+ expect(result).toBeApproxColor4Like(Grey);
55
+ Sample2DRgbaToRef(1.0, 1.0, 2, 2, testData2x2, result, (value) => value);
56
+ expect(result).toBeApproxColor4Like(White);
57
+ });
58
+ test("testDistinct2x2", () => {
59
+ const data = new Float32Array([Red, Green, Blue, White].flatMap((x) => [x.r, x.g, x.b, x.a]));
60
+ const result = { r: 0, g: 0, b: 0, a: 0 };
61
+ Sample2DRgbaToRef(0.25, 0.25, 2, 2, data, result, (v) => v);
62
+ expect(result).toBeApproxColor4Like({ r: 1.0, g: 0.0, b: 0.0, a: 1 });
63
+ Sample2DRgbaToRef(0.25, 0.75, 2, 2, data, result, (v) => v);
64
+ expect(result).toBeApproxColor4Like({ r: 0.0, g: 0.0, b: 1.0, a: 1 });
65
+ Sample2DRgbaToRef(0.75, 0.25, 2, 2, data, result, (v) => v);
66
+ expect(result).toBeApproxColor4Like({ r: 0.0, g: 1.0, b: 0.0, a: 1 });
67
+ Sample2DRgbaToRef(0.75, 0.75, 2, 2, data, result, (v) => v);
68
+ expect(result).toBeApproxColor4Like({ r: 1.0, g: 1.0, b: 1.0, a: 1 });
69
+ Sample2DRgbaToRef(0.5, 0.5, 2, 2, data, result, (v) => v);
70
+ expect(result).toBeApproxColor4Like({ r: 0.5, g: 0.5, b: 0.5, a: 1 });
71
+ Sample2DRgbaToRef(0.5, 0.0, 2, 2, data, result, (v) => v);
72
+ expect(result).toBeApproxColor4Like({ r: 0.5, g: 0.5, b: 0.0, a: 1 });
73
+ Sample2DRgbaToRef(0.0, 0.5, 2, 2, data, result, (v) => v);
74
+ expect(result).toBeApproxColor4Like({ r: 0.5, g: 0.0, b: 0.5, a: 1 });
75
+ });
76
+ });
77
+ //# sourceMappingURL=sampling.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sampling.test.js","sourceRoot":"","sources":["../../../../../../dev/addons/src/atmosphere/test/unit/sampling.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// MIT License\r\n\r\nimport { Sample2DRgbaToRef } from \"../../sampling\";\r\nimport type { IColor4Like } from \"core/Maths/math.like\";\r\n\r\nconst Black = { r: 0, g: 0, b: 0, a: 1.0 };\r\nconst DarkGrey = { r: 0.25, g: 0.25, b: 0.25, a: 1.0 };\r\nconst Grey = { r: 0.5, g: 0.5, b: 0.5, a: 1.0 };\r\nconst White = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };\r\nconst Red = { r: 1.0, g: 0.0, b: 0.0, a: 1.0 };\r\nconst Green = { r: 0.0, g: 1.0, b: 0.0, a: 1.0 };\r\nconst Blue = { r: 0.0, g: 0.0, b: 1.0, a: 1.0 };\r\n\r\nexpect.extend({\r\n toBeApproxColor4Like(received: IColor4Like, expected: IColor4Like) {\r\n const isEqual =\r\n Math.abs(received.r - expected.r) < 0.0001 &&\r\n Math.abs(received.g - expected.g) < 0.0001 &&\r\n Math.abs(received.b - expected.b) < 0.0001 &&\r\n Math.abs(received.a - expected.a) < 0.0001;\r\n return {\r\n message: () => `expected ${JSON.stringify(received)} to be close to ${JSON.stringify(expected)}`,\r\n pass: isEqual,\r\n };\r\n },\r\n});\r\n\r\ndescribe(\"textureSampler\", () => {\r\n test(\"testVertical2x2\", () => {\r\n const testData2x2 = new Float32Array([Black, Black, White, White].flatMap((x) => [x.r, x.g, x.b, x.a]));\r\n\r\n const result = { r: 0, g: 0, b: 0, a: 0 };\r\n Sample2DRgbaToRef(0.0, 0.0, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Black);\r\n\r\n Sample2DRgbaToRef(1.0, 0.25, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Black);\r\n\r\n Sample2DRgbaToRef(1.0, 0.375, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(DarkGrey);\r\n\r\n Sample2DRgbaToRef(1.0, 0.5, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Grey);\r\n\r\n Sample2DRgbaToRef(0.5, 0.5, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Grey);\r\n\r\n Sample2DRgbaToRef(1.0, 1.0, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(White);\r\n });\r\n test(\"testVertical3x3\", () => {\r\n const testData2x2 = new Float32Array([Black, Black, White, White, White, White, White, White, White].flatMap((x) => [x.r, x.g, x.b, x.a]));\r\n\r\n const result = { r: 0, g: 0, b: 0, a: 0 };\r\n Sample2DRgbaToRef(0.33333333333, 0.33333333333, 3, 3, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Grey);\r\n });\r\n test(\"testHorizontal2x2\", () => {\r\n const testData2x2 = new Float32Array([Black, White, Black, White].flatMap((x) => [x.r, x.g, x.b, x.a]));\r\n\r\n const result = { r: 0, g: 0, b: 0, a: 0 };\r\n Sample2DRgbaToRef(0.0, 0.0, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Black);\r\n\r\n Sample2DRgbaToRef(0.5, 1.0, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Grey);\r\n\r\n Sample2DRgbaToRef(0.5, 0.5, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Grey);\r\n\r\n Sample2DRgbaToRef(1.0, 1.0, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(White);\r\n });\r\n test(\"testDistinct2x2\", () => {\r\n const data = new Float32Array([Red, Green, Blue, White].flatMap((x) => [x.r, x.g, x.b, x.a]));\r\n\r\n const result = { r: 0, g: 0, b: 0, a: 0 };\r\n Sample2DRgbaToRef(0.25, 0.25, 2, 2, data, result, (v) => v);\r\n (expect(result) as any).toBeApproxColor4Like({ r: 1.0, g: 0.0, b: 0.0, a: 1 });\r\n\r\n Sample2DRgbaToRef(0.25, 0.75, 2, 2, data, result, (v) => v);\r\n (expect(result) as any).toBeApproxColor4Like({ r: 0.0, g: 0.0, b: 1.0, a: 1 });\r\n\r\n Sample2DRgbaToRef(0.75, 0.25, 2, 2, data, result, (v) => v);\r\n (expect(result) as any).toBeApproxColor4Like({ r: 0.0, g: 1.0, b: 0.0, a: 1 });\r\n\r\n Sample2DRgbaToRef(0.75, 0.75, 2, 2, data, result, (v) => v);\r\n (expect(result) as any).toBeApproxColor4Like({ r: 1.0, g: 1.0, b: 1.0, a: 1 });\r\n\r\n Sample2DRgbaToRef(0.5, 0.5, 2, 2, data, result, (v) => v);\r\n (expect(result) as any).toBeApproxColor4Like({ r: 0.5, g: 0.5, b: 0.5, a: 1 });\r\n\r\n Sample2DRgbaToRef(0.5, 0.0, 2, 2, data, result, (v) => v);\r\n (expect(result) as any).toBeApproxColor4Like({ r: 0.5, g: 0.5, b: 0.0, a: 1 });\r\n\r\n Sample2DRgbaToRef(0.0, 0.5, 2, 2, data, result, (v) => v);\r\n (expect(result) as any).toBeApproxColor4Like({ r: 0.5, g: 0.0, b: 0.5, a: 1 });\r\n });\r\n});\r\n"]}
@@ -0,0 +1,68 @@
1
+ import type { Atmosphere } from "./atmosphere.js";
2
+ import type { DirectionalLight } from "@onerjs/core/Lights/directionalLight.js";
3
+ import type { IColor3Like, IVector3Like } from "@onerjs/core/Maths/math.like.js";
4
+ import { Observable } from "@onerjs/core/Misc/observable.js";
5
+ import { RenderTargetTexture } from "@onerjs/core/Materials/Textures/renderTargetTexture.js";
6
+ import "./Shaders/fullscreenTriangle.vertex.js";
7
+ import "./Shaders/transmittance.fragment.js";
8
+ /**
9
+ * The transmittance LUT can be used to get the radiance from an external light source arriving a given point, accounting for atmospheric scattering.
10
+ */
11
+ export declare class TransmittanceLut {
12
+ /**
13
+ * Listen to this observer to know when the LUT data has been updated.
14
+ * This is typically infrequent (once at startup), but also happens whenever the atmosphere's properties change.
15
+ */
16
+ readonly onUpdatedObservable: Observable<void>;
17
+ private readonly _atmosphere;
18
+ private _lutData;
19
+ private _renderTarget;
20
+ private _effectWrapper;
21
+ private _effectRenderer;
22
+ private _isDirty;
23
+ private _isDisposed;
24
+ /**
25
+ * True if the LUT has been rendered.
26
+ */
27
+ get isDirty(): boolean;
28
+ /**
29
+ * The render target that contains the transmittance LUT.
30
+ * @throws if the LUT has been disposed.
31
+ */
32
+ get renderTarget(): RenderTargetTexture;
33
+ /**
34
+ * Constructs the {@link TransmittanceLut}.
35
+ * @param atmosphere - The atmosphere that owns this LUT.
36
+ */
37
+ constructor(atmosphere: Atmosphere);
38
+ /**
39
+ * Gets the transmittance of an external light through the atmosphere to a point specified by its distance to the planet center and its geocentric normal.
40
+ * The result is always a linear space color.
41
+ * @param directionToLight - The direction to the light source.
42
+ * @param pointRadius - The distance from the origin to the point.
43
+ * @param pointGeocentricNormal - The normal of the point.
44
+ * @param result - The color to write the result to.
45
+ * @returns The result color.
46
+ */
47
+ getTransmittedColorToRef<T extends IColor3Like>(directionToLight: IVector3Like, pointRadius: number, pointGeocentricNormal: IVector3Like, result: T): T;
48
+ /**
49
+ * Derives light color from the transmittance at a point specified by its distance to the planet center and its geocentric normal.
50
+ * @param light - The light to update.
51
+ * @param pointRadius - The distance from the origin to the point.
52
+ * @param pointGeocentricNormal - The normal of the point.
53
+ */
54
+ updateLightParameters(light: DirectionalLight, pointRadius: number, pointGeocentricNormal: IVector3Like): void;
55
+ /**
56
+ * Renders the LUT if needed.
57
+ * @returns true if the LUT was rendered.
58
+ */
59
+ render(): boolean;
60
+ /**
61
+ * Marks the LUT as needing to be rendered.
62
+ */
63
+ markDirty(): void;
64
+ /**
65
+ * Disposes the LUT and its resources.
66
+ */
67
+ dispose(): void;
68
+ }