@openglobus/og 0.14.10 → 0.15.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 (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 +197 -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 +3 -1
  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 +13 -7
  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 +354 -174
  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 +9 -6
  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
package/src/og/cons.js CHANGED
@@ -1,108 +1,108 @@
1
- 'use strict';
2
-
3
- /**
4
- * Console logging singleton object.
5
- * @class
6
- */
7
- export class Cons {
8
- constructor() {
9
- this._container = document.createElement("div");
10
- this._container.classList.add("ogConsole");
11
- this._container.style.display = "none";
12
- if (document.body) {
13
- document.body.appendChild(this._container);
14
- }
15
-
16
- this._visibility = false;
17
- }
18
-
19
- getVisibility() {
20
- return this._visibility;
21
- }
22
-
23
- setVisibility(visibility) {
24
- if (this._visibility != visibility) {
25
- this._visibility = visibility;
26
- if (this._visibility) {
27
- this.show();
28
- } else {
29
- this.hide();
30
- }
31
- }
32
- }
33
-
34
- /**
35
- * Show console panel.
36
- * @public
37
- */
38
- show() {
39
- if (!this._container.parentNode) {
40
- if (document.body) {
41
- document.body.appendChild(this._container);
42
- }
43
- }
44
- this._container.style.display = "block";
45
- this._visibility = true;
46
- }
47
-
48
- /**
49
- * Hide console panel.
50
- * @public
51
- */
52
- hide() {
53
- this._container.style.display = "none";
54
- this._visibility = false;
55
- }
56
-
57
- /**
58
- * Adds error text in the console.
59
- * @public
60
- * @param {string} str - Error text.
61
- */
62
- logErr(str) {
63
- var d = document.createElement("div");
64
- d.classList.add("ogConsole-text");
65
- d.classList.add("ogConsole-error");
66
- d.innerHTML = "error: " + str;
67
- console.log(d.innerHTML);
68
- this._container.appendChild(d);
69
- this.show();
70
- }
71
-
72
- /**
73
- * Adds warning text in the console.
74
- * @public
75
- * @param {string} str - Warning text.
76
- */
77
- logWrn(str) {
78
- var d = document.createElement("div");
79
- d.classList.add("ogConsole-text");
80
- d.classList.add("ogConsole-warning");
81
- d.innerHTML = "warning: " + str;
82
- console.log(d.innerHTML);
83
- this._container.appendChild(d);
84
- this.show();
85
- }
86
-
87
- /**
88
- * Adds log text in the console.
89
- * @public
90
- * @param {string} str - Log text.
91
- * @param {Object} [style] - HTML style.
92
- */
93
- log(str, style) {
94
- var d = document.createElement("div");
95
- d.classList.add("ogConsole-text");
96
- if (style) {
97
- for (var s in style) {
98
- d.style[s] = style[s];
99
- }
100
- }
101
- d.innerHTML = str;
102
- console.log(str);
103
- this._container.appendChild(d);
104
- this.show();
105
- }
106
- }
107
-
1
+ 'use strict';
2
+
3
+ /**
4
+ * Console logging singleton object.
5
+ * @class
6
+ */
7
+ export class Cons {
8
+ constructor() {
9
+ this._container = document.createElement("div");
10
+ this._container.classList.add("ogConsole");
11
+ this._container.style.display = "none";
12
+ if (document.body) {
13
+ document.body.appendChild(this._container);
14
+ }
15
+
16
+ this._visibility = false;
17
+ }
18
+
19
+ getVisibility() {
20
+ return this._visibility;
21
+ }
22
+
23
+ setVisibility(visibility) {
24
+ if (this._visibility != visibility) {
25
+ this._visibility = visibility;
26
+ if (this._visibility) {
27
+ this.show();
28
+ } else {
29
+ this.hide();
30
+ }
31
+ }
32
+ }
33
+
34
+ /**
35
+ * Show console panel.
36
+ * @public
37
+ */
38
+ show() {
39
+ if (!this._container.parentNode) {
40
+ if (document.body) {
41
+ document.body.appendChild(this._container);
42
+ }
43
+ }
44
+ this._container.style.display = "block";
45
+ this._visibility = true;
46
+ }
47
+
48
+ /**
49
+ * Hide console panel.
50
+ * @public
51
+ */
52
+ hide() {
53
+ this._container.style.display = "none";
54
+ this._visibility = false;
55
+ }
56
+
57
+ /**
58
+ * Adds error text in the console.
59
+ * @public
60
+ * @param {string} str - Error text.
61
+ */
62
+ logErr(str) {
63
+ var d = document.createElement("div");
64
+ d.classList.add("ogConsole-text");
65
+ d.classList.add("ogConsole-error");
66
+ d.innerHTML = "error: " + str;
67
+ console.trace(d.innerHTML);
68
+ this._container.appendChild(d);
69
+ this.show();
70
+ }
71
+
72
+ /**
73
+ * Adds warning text in the console.
74
+ * @public
75
+ * @param {string} str - Warning text.
76
+ */
77
+ logWrn(str) {
78
+ var d = document.createElement("div");
79
+ d.classList.add("ogConsole-text");
80
+ d.classList.add("ogConsole-warning");
81
+ d.innerHTML = "warning: " + str;
82
+ console.trace(d.innerHTML);
83
+ this._container.appendChild(d);
84
+ this.show();
85
+ }
86
+
87
+ /**
88
+ * Adds log text in the console.
89
+ * @public
90
+ * @param {string} str - Log text.
91
+ * @param {Object} [style] - HTML style.
92
+ */
93
+ log(str, style) {
94
+ var d = document.createElement("div");
95
+ d.classList.add("ogConsole-text");
96
+ if (style) {
97
+ for (var s in style) {
98
+ d.style[s] = style[s];
99
+ }
100
+ }
101
+ d.innerHTML = str;
102
+ console.trace(str);
103
+ this._container.appendChild(d);
104
+ this.show();
105
+ }
106
+ }
107
+
108
108
  export const cons = new Cons();
@@ -0,0 +1,396 @@
1
+ /**
2
+ * @module og/control/Atmosphere
3
+ */
4
+
5
+ "use strict";
6
+
7
+ import * as atmos from "../shaders/atmos.js";
8
+ import { Control } from "./Control.js";
9
+ import { Program } from '../webgl/Program.js';
10
+ import { Framebuffer } from "../webgl/index.js";
11
+
12
+ /**
13
+ * Frame per second(FPS) display control.
14
+ * @class
15
+ * @extends {Control}
16
+ * @param {Object} [options] - Control options.
17
+ */
18
+ class Atmosphere extends Control {
19
+ constructor(options) {
20
+ super({
21
+ name: "Atmosphere",
22
+ ...options
23
+ });
24
+
25
+ this._transmittanceBuffer = null;
26
+ this._scatteringBuffer = null;
27
+
28
+ this.opacity = 1.0;
29
+ }
30
+
31
+ oninit() {
32
+ this.renderer.handler.addProgram(atmos.transmittance(), true);
33
+ this.renderer.handler.addProgram(atmos.scattering(), true);
34
+ this.renderer.handler.addProgram(atmosphereBackgroundShader(), true);
35
+
36
+ this._drawAtmosphereTextures();
37
+
38
+ this.activate();
39
+ }
40
+
41
+ onactivate() {
42
+ super.onactivate();
43
+ this.planet.events.on("draw", this._drawBackground, this);
44
+ }
45
+
46
+ ondeactivate() {
47
+ super.ondeactivate();
48
+ this.planet.events.off("draw", this._drawBackground);
49
+ }
50
+
51
+ _drawAtmosphereTextures() {
52
+
53
+ let width = 256,
54
+ height = 128;
55
+
56
+ this._transmittanceBuffer = new Framebuffer(this.renderer.handler, {
57
+ width: width,
58
+ height: height,
59
+ useDepth: false,
60
+ filter: "LINEAR",
61
+ type: "FLOAT",
62
+ internalFormat: "RGBA16F"
63
+ });
64
+
65
+ this._transmittanceBuffer.init();
66
+
67
+ this._scatteringBuffer = new Framebuffer(this.renderer.handler, {
68
+ width: width,
69
+ height: height,
70
+ useDepth: false,
71
+ filter: "LINEAR",
72
+ type: "FLOAT",
73
+ internalFormat: "RGBA16F"
74
+ });
75
+
76
+ this._scatteringBuffer.init();
77
+
78
+ let positionBuffer = this.renderer.screenFramePositionBuffer;
79
+
80
+ let h = this.renderer.handler;
81
+ let gl = h.gl;
82
+
83
+ //
84
+ // Draw transmittance texture
85
+ //
86
+ this._transmittanceBuffer.activate();
87
+
88
+ let p = h.programs.transmittance;
89
+ let sha = p._program.attributes;
90
+ let shu = p._program.uniforms;
91
+ p.activate();
92
+
93
+ gl.clearColor(0.0, 0.0, 0.0, 1.0);
94
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
95
+
96
+ gl.uniform2fv(shu.iResolution, [this._transmittanceBuffer.width, this._transmittanceBuffer.height]);
97
+
98
+ gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
99
+ gl.vertexAttribPointer(sha.a_position, positionBuffer.itemSize, gl.FLOAT, false, 0, 0);
100
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, positionBuffer.numItems);
101
+
102
+ this._transmittanceBuffer.deactivate();
103
+
104
+ //
105
+ // Draw scattering texture
106
+ //
107
+ this._scatteringBuffer.activate();
108
+
109
+ p = h.programs.scattering;
110
+ sha = p._program.attributes;
111
+ shu = p._program.uniforms;
112
+ p.activate();
113
+
114
+ gl.clearColor(0.0, 0.0, 0.0, 1.0);
115
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
116
+
117
+ gl.uniform2fv(shu.iResolution, [this._scatteringBuffer.width, this._scatteringBuffer.height]);
118
+
119
+ gl.activeTexture(gl.TEXTURE0);
120
+ gl.bindTexture(gl.TEXTURE_2D, this._transmittanceBuffer.textures[0]);
121
+ gl.uniform1i(shu.transmittanceTexture, 0);
122
+
123
+ gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
124
+ gl.vertexAttribPointer(sha.a_position, positionBuffer.itemSize, gl.FLOAT, false, 0, 0);
125
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, positionBuffer.numItems);
126
+
127
+ this._scatteringBuffer.deactivate();
128
+
129
+ //
130
+ // remove shaders
131
+ if (this._scatteringBuffer.isComplete()) {
132
+ h.removeProgram("scattering");
133
+ }
134
+
135
+ if (this._transmittanceBuffer.isComplete()) {
136
+ h.removeProgram("transmittance");
137
+ }
138
+ }
139
+
140
+ _drawBackground() {
141
+ let h = this.renderer.handler;
142
+ let sh = h.programs.atmosphereBackground,
143
+ p = sh._program,
144
+ shu = p.uniforms, gl = h.gl;
145
+ let cam = this.renderer.activeCamera;
146
+
147
+ gl.disable(gl.DEPTH_TEST);
148
+
149
+ gl.blendEquation(gl.FUNC_ADD);
150
+ gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
151
+ gl.enable(gl.BLEND);
152
+
153
+ sh.activate();
154
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.renderer.screenFramePositionBuffer);
155
+ gl.vertexAttribPointer(p.attributes.corners, 2, gl.FLOAT, false, 0, 0);
156
+
157
+ gl.activeTexture(gl.TEXTURE0);
158
+ gl.bindTexture(gl.TEXTURE_2D, this._transmittanceBuffer.textures[0]);
159
+ gl.uniform1i(shu.transmittanceTexture, 0);
160
+
161
+ gl.activeTexture(gl.TEXTURE1);
162
+ gl.bindTexture(gl.TEXTURE_2D, this._scatteringBuffer.textures[0]);
163
+ gl.uniform1i(shu.scatteringTexture, 1);
164
+
165
+ gl.uniformMatrix4fv(shu.viewMatrix, false, cam.getViewMatrix());
166
+
167
+ let sunPos = this.planet.sunPos;
168
+ gl.uniform3fv(shu.sunPos, [sunPos.x, sunPos.y, sunPos.z]);
169
+ gl.uniform3fv(shu.camPos, [cam.eye.x, cam.eye.y, cam.eye.z]);
170
+ gl.uniform2fv(shu.iResolution, [this.renderer.sceneFramebuffer.width, this.renderer.sceneFramebuffer.height]);
171
+ gl.uniform1f(shu.fov, cam.getViewAngle());
172
+ gl.uniform1f(shu.opacity, this.opacity);
173
+
174
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
175
+
176
+ gl.enable(gl.DEPTH_TEST);
177
+ gl.disable(gl.BLEND);
178
+ }
179
+ }
180
+
181
+ function atmosphereBackgroundShader() {
182
+ return new Program("atmosphereBackground", {
183
+ uniforms: {
184
+ iResolution: "vec2",
185
+ fov: "float",
186
+ camPos: "vec3",
187
+ viewMatrix: "mat4",
188
+ transmittanceTexture: "sampler2D",
189
+ scatteringTexture: "sampler2D",
190
+ sunPos: "vec3",
191
+ opacity: "float"
192
+ },
193
+ attributes: {
194
+ corners: "vec3"
195
+ },
196
+ vertexShader:
197
+ `
198
+ attribute vec2 corners;
199
+
200
+ void main(void) {
201
+ gl_Position = vec4(corners, 0.0, 1.0);
202
+ }`,
203
+ fragmentShader:
204
+ `
205
+ precision highp float;
206
+
207
+ ${atmos.COMMON}
208
+
209
+ uniform mat4 viewMatrix;
210
+ uniform vec3 sunPos;
211
+ uniform vec3 camPos;
212
+ uniform vec2 iResolution;
213
+ uniform float fov;
214
+ uniform float opacity;
215
+
216
+ uniform sampler2D transmittanceTexture;
217
+ uniform sampler2D scatteringTexture;
218
+
219
+ vec3 transmittanceFromTexture(float height, float angle)
220
+ {
221
+ float u = (angle + 1.0) * 0.5;
222
+ float v = height / ATMOS_HEIGHT;
223
+ return texture2D(transmittanceTexture, vec2(u, v)).xyz;
224
+ }
225
+
226
+ vec3 multipleScatteringContributionFromTexture(float height, float angle)
227
+ {
228
+ float u = (angle + 1.0) * 0.5;
229
+ float v = height / ATMOS_HEIGHT;
230
+ return texture2D(scatteringTexture, vec2(u, v)).xyz;
231
+ }
232
+
233
+ bool intersectEllipsoidToSphere(in vec3 ro, in vec3 rd, in vec3 ellRadii, in float sphereRadius, out float t1, out float t2)
234
+ {
235
+ float offset = 0.0,
236
+ distanceToSpace = 0.0;
237
+
238
+ if(intersectEllipsoid(ro, rd, ellRadii, offset, distanceToSpace)){
239
+ vec3 hitEll = ro + rd * offset;
240
+ vec3 nEll = normalEllipsoid(hitEll, ellRadii);
241
+ float t = 0.0;
242
+ bool intersectsSphere = intersectSphere(hitEll, nEll, sphereRadius, t);
243
+ vec3 hitSphere = hitEll + nEll * t;
244
+ t1 = length(hitSphere - ro);
245
+
246
+ hitEll = ro + rd * distanceToSpace;
247
+ nEll = normalEllipsoid(hitEll, ellRadii);
248
+ t = 0.0;
249
+ intersectsSphere = intersectSphere(hitEll, nEll, sphereRadius, t);
250
+ hitSphere = hitEll + nEll * t;
251
+ t2 = length(hitSphere - ro);
252
+
253
+ return true;
254
+ }
255
+ return false;
256
+ }
257
+
258
+ mat4 transpose(in mat4 m)
259
+ {
260
+ vec4 i0 = m[0];
261
+ vec4 i1 = m[1];
262
+ vec4 i2 = m[2];
263
+ vec4 i3 = m[3];
264
+
265
+ mat4 outMatrix = mat4(
266
+ vec4(i0.x, i1.x, i2.x, i3.x),
267
+ vec4(i0.y, i1.y, i2.y, i3.y),
268
+ vec4(i0.z, i1.z, i2.z, i3.z),
269
+ vec4(i0.w, i1.w, i2.w, i3.w)
270
+ );
271
+
272
+ return outMatrix;
273
+ }
274
+
275
+ void mainImage(out vec4 fragColor)
276
+ {
277
+ vec3 cameraPosition = camPos;
278
+
279
+ vec3 lightDirection = normalize(sunPos);
280
+
281
+ vec2 uv = (2.0 * gl_FragCoord.xy - iResolution.xy) / iResolution.y;
282
+ float fieldOfView = fov;
283
+ float z = 1.0 / tan(fieldOfView * 0.5 * PI / 180.0);
284
+ vec3 rayDirection = normalize(vec3(uv, -z));
285
+ vec4 rd = transpose(viewMatrix) * vec4(rayDirection, 1.0);
286
+ rayDirection = rd.xyz;
287
+
288
+ vec3 light = vec3(0.0);
289
+ vec3 transmittanceFromCameraToSpace = vec3(1.0);
290
+ float offset = 0.0;
291
+ float distanceToSpace = 0.0;
292
+
293
+ rayDirection = normalize(rayDirection * SPHERE_TO_ELLIPSOID_SCALE);
294
+ cameraPosition *= SPHERE_TO_ELLIPSOID_SCALE;
295
+ lightDirection = normalize(lightDirection * SPHERE_TO_ELLIPSOID_SCALE);
296
+
297
+ if (intersectSphere(cameraPosition, rayDirection, TOP_RADIUS, offset, distanceToSpace))
298
+ {
299
+ vec3 rayOrigin = cameraPosition;
300
+
301
+ // above atmosphere
302
+ if (offset > 0.0) {
303
+ // intersection of camera ray with atmosphere
304
+ rayOrigin = cameraPosition + rayDirection * offset;
305
+ }
306
+
307
+ float height = length(rayOrigin) - BOTTOM_RADIUS;
308
+ float rayAngle = dot(rayOrigin, rayDirection) / length(rayOrigin);
309
+ bool cameraBelow = rayAngle < 0.0;
310
+
311
+ transmittanceFromCameraToSpace = transmittanceFromTexture(height, cameraBelow ? -rayAngle : rayAngle);
312
+
313
+ float phaseAngle = dot(lightDirection, rayDirection);
314
+ float rayleighPhase = rayleighPhase(phaseAngle);
315
+ float miePhase = miePhase(phaseAngle);
316
+
317
+ float distanceToGround = 0.0;
318
+
319
+ bool hitGround = intersectSphere(cameraPosition, rayDirection, BOTTOM_RADIUS, distanceToGround) && distanceToGround > 0.0;
320
+
321
+ if(intersectSphere(cameraPosition, rayDirection, BOTTOM_RADIUS - 15000.0, distanceToGround) && hitGround){
322
+ discard;
323
+ }
324
+
325
+ float segmentLength = ((hitGround ? distanceToGround : distanceToSpace) - max(offset, 0.0)) / float(SAMPLE_COUNT);
326
+
327
+ float t = segmentLength * 0.5;
328
+
329
+ vec3 transmittanceCamera;
330
+ vec3 transmittanceLight;
331
+
332
+ for (int i = 0; i < SAMPLE_COUNT; i++)
333
+ {
334
+ vec3 position = rayOrigin + t * rayDirection;
335
+ float height = length(position) - BOTTOM_RADIUS;
336
+ vec3 up = position / length(position);
337
+ float rayAngle = dot(up, rayDirection);
338
+ float lightAngle = dot(up, lightDirection);
339
+ // shadow is ommitted because it can create banding artifacts with low sample counts
340
+ // float distanceToGround;
341
+ // float shadow = intersectSphere(position, lightDirection, BOTTOM_RADIUS, distanceToGround) && distanceToGround >= 0.0 ? 0.0 : 1.0;
342
+ float shadow = 1.0;
343
+ vec3 transmittanceToSpace = transmittanceFromTexture(height, cameraBelow ? -rayAngle : rayAngle);
344
+ transmittanceCamera = cameraBelow ? (transmittanceToSpace / transmittanceFromCameraToSpace) : (transmittanceFromCameraToSpace / transmittanceToSpace);
345
+ transmittanceLight = transmittanceFromTexture(height, lightAngle);
346
+ vec2 opticalDensity = exp(-height / rayleighMieHeights);
347
+ vec3 scatteredLight = transmittanceLight * (rayleighScatteringCoefficient * opticalDensity.x * rayleighPhase + mieScatteringCoefficient * opticalDensity.y * miePhase);
348
+ scatteredLight += multipleScatteringContributionFromTexture(height, lightAngle) * (rayleighScatteringCoefficient * opticalDensity.x + mieScatteringCoefficient * opticalDensity.y);
349
+ light += shadow * transmittanceCamera * scatteredLight * segmentLength;
350
+ t += segmentLength;
351
+ }
352
+
353
+ light *= SUN_INTENSITY;
354
+
355
+ if (hitGround)
356
+ {
357
+ vec3 hitPoint = cameraPosition + rayDirection * distanceToGround;
358
+ vec3 up = hitPoint / length(hitPoint);
359
+ float diffuseAngle = max(dot(up, lightDirection), 0.0);
360
+ float lightAngle = dot(up, lightDirection);
361
+ light += transmittanceCamera * GROUND_ALBEDO * multipleScatteringContributionFromTexture(height, lightAngle) * SUN_INTENSITY;
362
+ light += transmittanceCamera * transmittanceLight * GROUND_ALBEDO * diffuseAngle * SUN_INTENSITY;
363
+ }
364
+ }
365
+
366
+ // sun disk
367
+ // float distanceToGround;
368
+ // bool hitGround = intersectSphere(cameraPosition, rayDirection, BOTTOM_RADIUS, distanceToGround) && distanceToGround > 0.0;
369
+ // if (!hitGround) {
370
+ // float angle = dot(rayDirection, lightDirection);
371
+ // if (angle > cos(SUN_ANGULAR_RADIUS)) {
372
+ // light = SUN_INTENSITY * transmittanceFromCameraToSpace;
373
+ // }
374
+ // }
375
+
376
+ float distanceToGround = 0.0;
377
+ bool hitGround = intersectSphere(cameraPosition, rayDirection, BOTTOM_RADIUS, distanceToGround) && distanceToGround > 0.0;
378
+ if(!hitGround)
379
+ {
380
+ vec3 sunLum = sunWithBloom(rayDirection, lightDirection) * vec3(1.0,1.0,0.8);
381
+ // limit the bloom effect
382
+ sunLum = smoothstep(0.002, 1.0, sunLum);
383
+ light += sunLum * SUN_INTENSITY * transmittanceFromCameraToSpace;
384
+ }
385
+
386
+ fragColor = vec4(pow(light * 8.0, vec3(1.0 / 2.2)), opacity);
387
+ }
388
+
389
+ void main(void)
390
+ {
391
+ mainImage(gl_FragColor);
392
+ }`
393
+ });
394
+ }
395
+
396
+ export { Atmosphere };
@@ -2,8 +2,10 @@
2
2
 
3
3
  import { Control } from "./Control.js";
4
4
  import { parseHTML } from "../utils/shared.js";
5
+ import { Button } from "../ui/Button.js";
6
+ import { ToggleButton } from "../ui/ToggleButton.js";
5
7
 
6
- let svg = `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
8
+ const ICON_BUTTON_SVG = `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
7
9
  <svg
8
10
  xmlns:dc="http://purl.org/dc/elements/1.1/"
9
11
  xmlns:cc="http://creativecommons.org/ns#"
@@ -86,32 +88,23 @@ let svg = `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
86
88
  * @params {Object} [options] - Control options.
87
89
  */
88
90
  class CompassButton extends Control {
89
- /**
90
- *
91
- * @params {Object} [options] - Control options.
92
- */
93
- constructor(options) {
91
+ constructor(options = {}) {
94
92
  super(options);
95
-
96
- options = options || {};
97
-
98
- this.planet = null;
99
-
100
- this.compassSvg = options.compassSvg || svg;
101
-
102
93
  this._heading = null;
103
-
104
94
  this._svg = null;
105
95
  }
106
96
 
107
97
  oninit() {
108
- var btnEl = parseHTML(`<div class="og-compass-button">${this.compassSvg}</div>`)[0];
109
98
 
110
- this._svg = btnEl.querySelector("svg");
99
+ let btn = new Button({
100
+ classList: ["og-map-button", "og-compass-button"],
101
+ icon: ICON_BUTTON_SVG,
102
+ appendTo: this.renderer.div
103
+ });
111
104
 
112
- this.renderer.div.appendChild(btnEl);
105
+ btn.on("click", this._onClick, this);
113
106
 
114
- btnEl.addEventListener("click", (e) => this._onClick());
107
+ this._svg = btn.select("svg");
115
108
 
116
109
  this.renderer.events.on("draw", this._draw, this);
117
110
  }