@openglobus/og 0.14.10 → 0.15.0

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 (140) hide show
  1. package/css/og.css +378 -275
  2. package/dist/@openglobus/og.css +1 -1
  3. package/dist/@openglobus/og.esm.js +2 -2
  4. package/dist/@openglobus/og.esm.js.map +1 -1
  5. package/dist/@openglobus/og.umd.js +2 -2
  6. package/dist/@openglobus/og.umd.js.map +1 -1
  7. package/package.json +18 -17
  8. package/src/og/Clock.js +218 -194
  9. package/src/og/Globe.js +5 -5
  10. package/src/og/Object3d.js +104 -145
  11. package/src/og/camera/Camera.js +31 -27
  12. package/src/og/camera/PlanetCamera.js +22 -14
  13. package/src/og/cons.js +107 -107
  14. package/src/og/control/Atmosphere.js +396 -0
  15. package/src/og/control/CompassButton.js +11 -18
  16. package/src/og/control/Control.js +187 -188
  17. package/src/og/control/GeoImageDragControl.js +84 -66
  18. package/src/og/control/LayerSwitcher.js +56 -138
  19. package/src/og/control/Lighting.js +314 -186
  20. package/src/og/control/MouseNavigation.js +2 -2
  21. package/src/og/control/RulerSwitcher.js +24 -19
  22. package/src/og/control/ScaleControl.js +30 -10
  23. package/src/og/control/SimpleSkyBackground.js +210 -0
  24. package/src/og/control/Sun.js +2 -0
  25. package/src/og/control/ZoomControl.js +30 -42
  26. package/src/og/control/index.js +6 -0
  27. package/src/og/control/ruler/RulerScene.js +5 -23
  28. package/src/og/control/selection/Selection.js +99 -0
  29. package/src/og/control/selection/SelectionScene.js +350 -0
  30. package/src/og/control/timeline/TimelineControl.js +99 -0
  31. package/src/og/control/timeline/TimelineModel.js +133 -0
  32. package/src/og/control/timeline/TimelineView.js +449 -0
  33. package/src/og/control/timeline/timelineUtils.js +132 -0
  34. package/src/og/ellipsoid/Ellipsoid.js +120 -93
  35. package/src/og/ellipsoid/wgs84.js +13 -13
  36. package/src/og/entity/Entity.js +36 -9
  37. package/src/og/entity/EntityCollection.js +0 -2
  38. package/src/og/entity/GeoObject.js +72 -56
  39. package/src/og/entity/GeoObjectHandler.js +487 -656
  40. package/src/og/entity/GeometryHandler.js +1341 -1337
  41. package/src/og/entity/Polyline.js +0 -16
  42. package/src/og/entity/Ray.js +0 -10
  43. package/src/og/entity/RayHandler.js +3 -44
  44. package/src/og/entity/Strip.js +1 -6
  45. package/src/og/index.js +10 -6
  46. package/src/og/input/input.js +3 -1
  47. package/src/og/layer/CanvasTiles.js +39 -34
  48. package/src/og/layer/Layer.js +69 -9
  49. package/src/og/layer/Material.js +1 -8
  50. package/src/og/layer/WMS.js +16 -5
  51. package/src/og/light/LightSource.js +2 -0
  52. package/src/og/math/Line3.js +140 -139
  53. package/src/og/math/Plane.js +118 -117
  54. package/src/og/math/Ray.js +242 -239
  55. package/src/og/math/Vec3.js +56 -37
  56. package/src/og/math/Vec4.js +3 -4
  57. package/src/og/math.js +21 -21
  58. package/src/og/quadTree/Node.js +5 -4
  59. package/src/og/quadTree/index.js +12 -0
  60. package/src/og/renderer/Renderer.js +64 -37
  61. package/src/og/renderer/RendererEvents.js +1071 -1065
  62. package/src/og/scene/Planet.js +352 -172
  63. package/src/og/scene/RenderNode.js +27 -12
  64. package/src/og/segment/Segment.js +0 -5
  65. package/src/og/shaders/atmos.js +332 -0
  66. package/src/og/shaders/drawnode.js +475 -109
  67. package/src/og/shaders/geoObject.js +96 -51
  68. package/src/og/shaders/polyline.js +212 -17
  69. package/src/og/shaders/ray.js +13 -6
  70. package/src/og/shaders/toneMapping.js +5 -5
  71. package/src/og/shaders/utils.js +88 -0
  72. package/src/og/terrain/GlobusTerrain.js +5 -4
  73. package/src/og/terrain/MapboxTerrain.js +231 -52
  74. package/src/og/ui/Button.js +106 -0
  75. package/src/og/ui/ButtonGroup.js +57 -0
  76. package/src/og/ui/Dialog.js +242 -0
  77. package/src/og/ui/Slider.js +144 -0
  78. package/src/og/ui/ToggleButton.js +51 -0
  79. package/src/og/{control → ui}/UIhelpers.js +11 -2
  80. package/src/og/ui/View.js +190 -0
  81. package/src/og/utils/shared.js +960 -942
  82. package/src/og/webgl/Framebuffer.js +308 -387
  83. package/src/og/webgl/Handler.js +90 -30
  84. package/src/og/webgl/Multisample.js +8 -0
  85. package/types/Clock.d.ts +7 -2
  86. package/types/Object3d.d.ts +14 -3
  87. package/types/camera/Camera.d.ts +18 -17
  88. package/types/camera/PlanetCamera.d.ts +3 -1
  89. package/types/control/Atmosphere.d.ts +15 -0
  90. package/types/control/CompassButton.d.ts +1 -2
  91. package/types/control/GeoImageDragControl.d.ts +7 -1
  92. package/types/control/LayerSwitcher.d.ts +5 -6
  93. package/types/control/Lighting.d.ts +32 -7
  94. package/types/control/ScaleControl.d.ts +2 -1
  95. package/types/control/SimpleSkyBackground.d.ts +15 -0
  96. package/types/control/ZoomControl.d.ts +0 -1
  97. package/types/control/index.d.ts +4 -1
  98. package/types/control/ruler/RulerScene.d.ts +0 -1
  99. package/types/control/selection/Selection.d.ts +49 -0
  100. package/types/control/selection/SelectionScene.d.ts +34 -0
  101. package/types/ellipsoid/Ellipsoid.d.ts +3 -2
  102. package/types/entity/Entity.d.ts +8 -0
  103. package/types/entity/GeoObject.d.ts +28 -22
  104. package/types/entity/GeoObjectHandler.d.ts +16 -56
  105. package/types/entity/Ray.d.ts +0 -3
  106. package/types/entity/RayHandler.d.ts +0 -4
  107. package/types/index.d.ts +7 -5
  108. package/types/input/input.d.ts +2 -0
  109. package/types/layer/CanvasTiles.d.ts +1 -0
  110. package/types/layer/Layer.d.ts +9 -0
  111. package/types/layer/WMS.d.ts +7 -3
  112. package/types/math/Plane.d.ts +1 -1
  113. package/types/math/Vec3.d.ts +19 -16
  114. package/types/math/Vec4.d.ts +2 -3
  115. package/types/math.d.ts +20 -20
  116. package/types/quadTree/index.d.ts +10 -0
  117. package/types/renderer/Renderer.d.ts +11 -37
  118. package/types/scene/Planet.d.ts +27 -1
  119. package/types/scene/RenderNode.d.ts +2 -1
  120. package/types/segment/Segment.d.ts +1 -1
  121. package/types/shaders/atmos.d.ts +4 -0
  122. package/types/shaders/drawnode.d.ts +3 -2
  123. package/types/shaders/utils.d.ts +1 -0
  124. package/types/terrain/GlobusTerrain.d.ts +1 -1
  125. package/types/terrain/MapboxTerrain.d.ts +2 -1
  126. package/types/ui/Button.d.ts +21 -0
  127. package/types/ui/Dialog.d.ts +41 -0
  128. package/types/ui/Slider.d.ts +30 -0
  129. package/types/ui/ToggleButton.d.ts +10 -0
  130. package/types/{control → ui}/UIhelpers.d.ts +1 -1
  131. package/types/ui/View.d.ts +32 -0
  132. package/types/utils/shared.d.ts +16 -14
  133. package/types/webgl/Framebuffer.d.ts +2 -5
  134. package/types/webgl/Handler.d.ts +15 -10
  135. package/types/webgl/Multisample.d.ts +2 -0
  136. package/src/og/ajax.js +0 -204
  137. package/src/og/entity/Object3d.js +0 -504
  138. package/src/og/utils/quadTreeType.js +0 -11
  139. package/types/ajax.d.ts +0 -24
  140. package/types/utils/quadTreeType.d.ts +0 -8
@@ -46,7 +46,7 @@ class RenderNode extends BaseNode {
46
46
  * @type {Array.<LightSource>}
47
47
  */
48
48
  this._lights = [];
49
- this._lightsTransformedPositions = [];
49
+ this._lightsPositions = [];
50
50
  this._lightsParamsv = [];
51
51
  this._lightsParamsf = [];
52
52
  this._lightsNames = [];
@@ -228,19 +228,28 @@ class RenderNode extends BaseNode {
228
228
  transformLights() {
229
229
  var r = this.renderer;
230
230
  for (var i = 0; i < this._lights.length; i++) {
231
- var ii = i * 4;
231
+ var ii = i * 3;
232
232
  var tp;
233
- if (this._lights[i].directional) {
234
- tp = r.activeCamera._normalMatrix.mulVec(this._lights[i]._position);
235
- this._lightsTransformedPositions[ii + 3] = 0;
236
- } else {
237
- tp = r.activeCamera._viewMatrix.mulVec3(this._lights[i]._position);
238
- this._lightsTransformedPositions[ii + 3] = 1;
239
- }
240
- this._lightsTransformedPositions[ii] = tp.x;
241
- this._lightsTransformedPositions[ii + 1] = tp.y;
242
- this._lightsTransformedPositions[ii + 2] = tp.z;
233
+ tp = this._lights[i]._position;
234
+ this._lightsPositions[ii] = tp.x;
235
+ this._lightsPositions[ii + 1] = tp.y;
236
+ this._lightsPositions[ii + 2] = tp.z;
243
237
  }
238
+
239
+ // for (var i = 0; i < this._lights.length; i++) {
240
+ // var ii = i * 4;
241
+ // var tp;
242
+ // if (this._lights[i].directional) {
243
+ // tp = r.activeCamera._normalMatrix.mulVec(this._lights[i]._position);
244
+ // this._lightsTransformedPositions[ii + 3] = 0;
245
+ // } else {
246
+ // tp = r.activeCamera._viewMatrix.mulVec3(this._lights[i]._position);
247
+ // this._lightsTransformedPositions[ii + 3] = 1;
248
+ // }
249
+ // this._lightsTransformedPositions[ii] = tp.x;
250
+ // this._lightsTransformedPositions[ii + 1] = tp.y;
251
+ // this._lightsTransformedPositions[ii + 2] = tp.z;
252
+ // }
244
253
  }
245
254
 
246
255
  updateBillboardsTexCoords() {
@@ -249,6 +258,12 @@ class RenderNode extends BaseNode {
249
258
  }
250
259
  }
251
260
 
261
+ updateGeoObjectsTexCoords() {
262
+ for (var i = 0; i < this.entityCollections.length; i++) {
263
+ this.entityCollections[i].geoObjectHandler.refreshTexCoordsArr();
264
+ }
265
+ }
266
+
252
267
  /**
253
268
  * @private
254
269
  */
@@ -97,11 +97,6 @@ class Segment {
97
97
  */
98
98
  this.bbox = new Box();
99
99
 
100
- //this._swNorm = null;
101
- //this._nwNorm = null;
102
- //this._seNorm = null;
103
- //this._neNorm = null;
104
-
105
100
  this._sw = new Vec3();
106
101
  this._nw = new Vec3();
107
102
  this._se = new Vec3();
@@ -0,0 +1,332 @@
1
+ 'use strict';
2
+
3
+ import { Program } from '../webgl/Program.js';
4
+ import { UTILS } from './utils.js';
5
+
6
+ export const COMMON =
7
+ `
8
+
9
+ ${UTILS}
10
+
11
+ #define PI 3.1415926538
12
+ #define ATMOS_HEIGHT 100000.0
13
+ #define RAYLEIGH_SCALE 0.08
14
+ #define MIE_SCALE 0.012
15
+
16
+ #define SAMPLE_COUNT 16
17
+ #define SQRT_SAMPLE_COUNT 4
18
+
19
+ const float GROUND_ALBEDO = 0.05 / PI;
20
+
21
+ // Sphere
22
+ const float BOTTOM_RADIUS = 6356752.3142451793;
23
+ const float TOP_RADIUS = 6356752.3142451793 + ATMOS_HEIGHT;
24
+
25
+ // Ellipsoid
26
+ const vec3 bottomRadii = vec3(6378137.0, 6356752.3142451793, 6378137.0);
27
+ const vec3 topRadii = bottomRadii + ATMOS_HEIGHT;
28
+
29
+ const vec3 SPHERE_TO_ELLIPSOID_SCALE = vec3(BOTTOM_RADIUS) / bottomRadii;
30
+
31
+ const vec2 rayleighMieHeights = vec2(RAYLEIGH_SCALE, MIE_SCALE) * ATMOS_HEIGHT;
32
+
33
+ const vec3 rayleighScatteringCoefficient = vec3(5.802, 13.558, 33.100) * 1e-6;
34
+
35
+ const float mieScatteringCoefficient = 3.996e-06;
36
+ const float mieExtinctionCoefficient = 4.440e-06;
37
+ const vec3 ozoneAbsorptionCoefficient = vec3(0.650, 1.881, 0.085) * 1e-6;
38
+
39
+ const float SUN_ANGULAR_RADIUS = 0.004685;
40
+ const float SUN_INTENSITY = 1.0;
41
+
42
+ vec3 sunWithBloom(vec3 rayDir, vec3 sunDir)
43
+ {
44
+ float minSunCosTheta = cos(SUN_ANGULAR_RADIUS);
45
+ float cosTheta = dot(rayDir, sunDir);
46
+ if (cosTheta >= minSunCosTheta) return vec3(1.0);
47
+ float offset = minSunCosTheta - cosTheta;
48
+ float gaussianBloom = exp(-offset*15000.0)*0.7;
49
+ float invBloom = 1.0/(0.09 + offset*200.0)*0.01;
50
+ return vec3(gaussianBloom + invBloom);
51
+ }
52
+
53
+ float rayleighPhase(float angle)
54
+ {
55
+ return 3.0 / (16.0 * PI) * (1.0 + (angle * angle));
56
+ }
57
+
58
+ float miePhase(float angle)
59
+ {
60
+ float g = 0.8;
61
+ return 3.0 / (8.0 * PI) * ((1.0 - g * g) * (1.0 + angle * angle)) / ((2.0 + g * g) * pow(1.0 + g * g - 2.0 * g * angle, 1.5));
62
+ }
63
+
64
+ vec3 opticalDepth(float height, float angle)
65
+ {
66
+ vec3 rayOrigin = vec3(0.0, BOTTOM_RADIUS + height, 0.0);
67
+ vec3 rayDirection = vec3(sqrt(1.0 - angle * angle), angle, 0.0);
68
+ float t1, t2;
69
+ intersectSphere(rayOrigin, rayDirection, TOP_RADIUS, t1, t2);
70
+ float segmentLength = t2 / float(SAMPLE_COUNT);
71
+
72
+ float t = segmentLength * 0.5;
73
+ vec3 opticalDepth = vec3(0.0);
74
+
75
+ for (int i = 0; i < SAMPLE_COUNT; i++)
76
+ {
77
+ vec3 position = rayOrigin + t * rayDirection;
78
+ float height = length(position) - BOTTOM_RADIUS;
79
+ opticalDepth.xy += exp(-height / rayleighMieHeights) * segmentLength;
80
+
81
+ // density of the ozone layer is modeled as a triangular
82
+ // function that is 30 km wide and centered at 25 km altitude
83
+ opticalDepth.z += (1.0 - min(abs(height - 25e3) / 15e3, 1.0)) * segmentLength;
84
+ t += segmentLength;
85
+ }
86
+
87
+ return opticalDepth;
88
+ }
89
+
90
+ vec3 transmittance(float height, float angle)
91
+ {
92
+ vec3 opticalDepth = opticalDepth(height, angle);
93
+ return exp(-(rayleighScatteringCoefficient * opticalDepth.x + mieExtinctionCoefficient * opticalDepth.y + ozoneAbsorptionCoefficient * opticalDepth.z));
94
+ }`;
95
+
96
+ export function transmittance() {
97
+ return new Program("transmittance", {
98
+ uniforms: {
99
+ iResolution: "vec2"
100
+ },
101
+ attributes: {
102
+ a_position: "vec2"
103
+ },
104
+
105
+ vertexShader:
106
+ `
107
+ attribute vec2 a_position;
108
+
109
+ void main(void)
110
+ {
111
+ gl_Position = vec4(a_position, 0.0, 1.0);
112
+ }`,
113
+
114
+ fragmentShader:
115
+ `
116
+ precision highp float;
117
+
118
+ ${COMMON}
119
+
120
+ uniform vec2 iResolution;
121
+
122
+ void main(void)
123
+ {
124
+ vec2 uv = gl_FragCoord.xy / iResolution.xy;
125
+ float height = uv.y * ATMOS_HEIGHT;
126
+ float angle = uv.x * 2.0 - 1.0;
127
+ gl_FragColor = vec4(transmittance(height, angle), 1.0);
128
+ }`
129
+ });
130
+ }
131
+
132
+ export function scattering() {
133
+ return new Program("scattering", {
134
+ uniforms: {
135
+ iResolution: "vec2",
136
+ transmittanceTexture: "sampler2d"
137
+ },
138
+ attributes: {
139
+ a_position: "vec2"
140
+ },
141
+
142
+ vertexShader:
143
+ `
144
+ attribute vec2 a_position;
145
+
146
+ void main(void)
147
+ {
148
+ gl_Position = vec4(a_position, 0.0, 1.0);
149
+ }`,
150
+
151
+ fragmentShader:
152
+ `
153
+ precision highp float;
154
+
155
+ uniform sampler2D transmittanceTexture;
156
+ uniform vec2 iResolution;
157
+
158
+ ${COMMON}
159
+
160
+ vec3 transmittanceFromTexture(float height, float angle)
161
+ {
162
+ float u = (angle + 1.0) * 0.5;
163
+ float v = height / ATMOS_HEIGHT;
164
+ return texture2D(transmittanceTexture, vec2(u, v)).xyz;
165
+ }
166
+
167
+ void main(void)
168
+ {
169
+ vec2 uv = gl_FragCoord.xy / iResolution.xy;
170
+
171
+ float height = uv.y * ATMOS_HEIGHT;
172
+ float angle = uv.x * 2.0 - 1.0;
173
+
174
+ vec3 rayOrigin = vec3(0.0, BOTTOM_RADIUS + height, 0.0);
175
+ vec3 up = rayOrigin / length(rayOrigin);
176
+ vec3 lightDirection = vec3(sqrt(1.0 - angle * angle), angle, 0.0);
177
+
178
+ const float isotropicPhase = 1.0 / (4.0 * PI);
179
+
180
+ vec3 light = vec3(0.0);
181
+ vec3 lightTransferFactor = vec3(0.0);
182
+
183
+ for (int i = 0; i < SQRT_SAMPLE_COUNT; i++)
184
+ {
185
+ for (int j = 0; j < SQRT_SAMPLE_COUNT; j++)
186
+ {
187
+ float u = ((0.5 + float(i)) / float(SQRT_SAMPLE_COUNT)) * 2.0 - 1.0;
188
+ float v = (0.5 + float(j)) / float(SQRT_SAMPLE_COUNT);
189
+ float r = sqrt(1.0 - u * u);
190
+ float theta = 2.0 * PI * v;
191
+ vec3 rayDirection = vec3(cos(theta) * r, sin(theta) * r, u);
192
+
193
+ float rayAngle = dot(up, rayDirection);
194
+ bool cameraBelow = rayAngle < 0.0;
195
+
196
+ vec3 transmittanceFromCameraToSpace = transmittanceFromTexture(height, cameraBelow ? -rayAngle : rayAngle);
197
+
198
+ float offset = 0.0;
199
+ float distanceToSpace = 0.0;
200
+
201
+ intersectSphere(rayOrigin, rayDirection, TOP_RADIUS, offset, distanceToSpace);
202
+
203
+ float distanceToGround = 0.0;
204
+ bool hitGround = intersectSphere(rayOrigin, rayDirection, BOTTOM_RADIUS, distanceToGround) && distanceToGround > 0.0;
205
+ float segmentLength = (hitGround ? distanceToGround : distanceToSpace) / float(SAMPLE_COUNT);
206
+ float t = segmentLength * 0.5;
207
+
208
+ vec3 transmittanceCamera;
209
+ vec3 transmittanceLight;
210
+
211
+ for (int k = 0; k < SAMPLE_COUNT; k++)
212
+ {
213
+ vec3 position = rayOrigin + t * rayDirection;
214
+ float height = length(position) - BOTTOM_RADIUS;
215
+ vec3 up = position / length(position);
216
+ float rayAngle = dot(up, rayDirection);
217
+ float lightAngle = dot(up, lightDirection);
218
+
219
+ float distanceToGround;
220
+ float shadow = intersectSphere(position, lightDirection, BOTTOM_RADIUS, distanceToGround) && distanceToGround >= 0.0 ? 0.0 : 1.0;
221
+ vec3 transmittanceToSpace = transmittanceFromTexture(height, cameraBelow ? -rayAngle : rayAngle);
222
+
223
+ transmittanceCamera = cameraBelow ? (transmittanceToSpace / transmittanceFromCameraToSpace) : (transmittanceFromCameraToSpace / transmittanceToSpace);
224
+ transmittanceLight = transmittanceFromTexture(height, lightAngle);
225
+
226
+ vec2 opticalDensity = exp(-height / rayleighMieHeights);
227
+ vec3 scatteredLight = transmittanceLight * (rayleighScatteringCoefficient * opticalDensity.x + mieScatteringCoefficient * opticalDensity.y) * isotropicPhase;
228
+
229
+ light += shadow * transmittanceCamera * scatteredLight * segmentLength;
230
+ lightTransferFactor += transmittanceCamera * (rayleighScatteringCoefficient * opticalDensity.x + mieScatteringCoefficient * opticalDensity.y) * segmentLength;
231
+
232
+ t += segmentLength;
233
+ }
234
+
235
+ if (hitGround)
236
+ {
237
+ vec3 hitPoint = rayOrigin + rayDirection * distanceToGround;
238
+ vec3 normal = normalize(hitPoint);
239
+ float diffuseAngle = max(dot(normal, lightDirection), 0.0);
240
+ float earthAlbedo = 0.05;
241
+ light += transmittanceCamera * transmittanceLight * (earthAlbedo / PI) * diffuseAngle;
242
+ }
243
+ }
244
+ }
245
+
246
+ light /= float(SAMPLE_COUNT);
247
+ lightTransferFactor /= float(SAMPLE_COUNT);
248
+ vec3 color = light / (1.0 - lightTransferFactor);
249
+ gl_FragColor = vec4(color, 1.0);
250
+ }`
251
+ });
252
+ }
253
+
254
+ // const vec3 solar_irradiance = vec3(1.474000,1.850400,1.911980);
255
+ // float GetTextureCoordFromUnitRange(float x, int texture_size) {
256
+ // return 0.5 / float(texture_size) + x * (1.0 - 1.0 / float(texture_size));
257
+ // }
258
+ //
259
+ // float ClampDistance(float d) {
260
+ // return max(d, 0.0 * m);
261
+ // }
262
+ //
263
+ // float SafeSqrt(float a) {
264
+ // return sqrt(max(a, 0.0 * m2));
265
+ // }
266
+
267
+ // float DistanceToTopAtmosphereBoundary(float r, float mu) {
268
+ //
269
+ // //assert(r <= atmosphere.top_radius);
270
+ // //assert(mu >= -1.0 && mu <= 1.0);
271
+ //
272
+ // float discriminant = r * r * (mu * mu - 1.0) + TOP_RADIUS * TOP_RADIUS;
273
+ // return ClampDistance(-r * mu + SafeSqrt(discriminant));
274
+ // }
275
+
276
+ // vec2 GetTransmittanceTextureUvFromRMu(
277
+ // float r,
278
+ // float mu)
279
+ // {
280
+ // //assert(r >= atmosphere.BOTTOM_RADIUS && r <= TOP_RADIUS);
281
+ // //assert(mu >= -1.0 && mu <= 1.0);
282
+ //
283
+ // float H = sqrt(TOP_RADIUS * TOP_RADIUS - BOTTOM_RADIUS * BOTTOM_RADIUS);
284
+ // float rho = SafeSqrt(r * r - BOTTOM_RADIUS * BOTTOM_RADIUS);
285
+ // float d = DistanceToTopAtmosphereBoundary(r, mu);
286
+ // float d_min = TOP_RADIUS - r;
287
+ // float d_max = rho + H;
288
+ // float x_mu = (d - d_min) / (d_max - d_min);
289
+ // float x_r = rho / H;
290
+ //
291
+ // return vec2(
292
+ // GetTextureCoordFromUnitRange(x_mu, TRANSMITTANCE_TEXTURE_WIDTH),
293
+ // GetTextureCoordFromUnitRange(x_r, TRANSMITTANCE_TEXTURE_HEIGHT)
294
+ // );
295
+ // }
296
+
297
+ // vec3 GetTransmittanceToTopAtmosphereBoundary(in sampler2D transmittance_texture, float r, float mu)
298
+ // {
299
+ // //assert(r >= BOTTOM_RADIUS && r <= TOP_RADIUS);
300
+ //
301
+ // vec2 uv = GetTransmittanceTextureUvFromRMu(r, mu);
302
+ // return texture(transmittance_texture, uv).xyz;
303
+ // }
304
+
305
+ // vec3 GetTransmittanceToSun(
306
+ // in sampler2D transmittance_texture,
307
+ // float r,
308
+ // float mu_s)
309
+ // {
310
+ // float sin_theta_h = BOTTOM_RADIUS / r;
311
+ // float cos_theta_h = -sqrt(max(1.0 - sin_theta_h * sin_theta_h, 0.0));
312
+ //
313
+ // return GetTransmittanceToTopAtmosphereBoundary(transmittance_texture, r, mu_s) * smoothstep(
314
+ // -sin_theta_h * SUN_ANGULAR_RADIUS / rad, sin_theta_h * SUN_ANGULAR_RADIUS / rad,
315
+ // mu_s - cos_theta_h
316
+ // );
317
+ // }
318
+
319
+ // vec3 GetSunAndSkyIrradiance(
320
+ // in sampler2D transmittance_texture,
321
+ // in vec3 point,
322
+ // in vec3 normal,
323
+ // in vec3 sun_direction,
324
+ // out vec3 sky_irradiance)
325
+ // {
326
+ // float r = length(point);
327
+ // float mu_s = dot(point, sun_direction) / r;
328
+ //
329
+ // sky_irradiance = vec3(0.0); // GetIrradiance(atmosphere, irradiance_texture, r, mu_s) * (1.0 + dot(normal, point) / r) * 0.5;
330
+ //
331
+ // return solar_irradiance * GetTransmittanceToSun(transmittance_texture, r, mu_s) * max(dot(normal, sun_direction), 0.0);
332
+ // }