@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.
- package/css/og.css +378 -275
- package/dist/@openglobus/og.css +1 -1
- package/dist/@openglobus/og.esm.js +2 -2
- package/dist/@openglobus/og.esm.js.map +1 -1
- package/dist/@openglobus/og.umd.js +2 -2
- package/dist/@openglobus/og.umd.js.map +1 -1
- package/package.json +18 -17
- package/src/og/Clock.js +218 -194
- package/src/og/Globe.js +5 -5
- package/src/og/Object3d.js +104 -145
- package/src/og/camera/Camera.js +31 -27
- package/src/og/camera/PlanetCamera.js +22 -14
- package/src/og/cons.js +107 -107
- package/src/og/control/Atmosphere.js +396 -0
- package/src/og/control/CompassButton.js +11 -18
- package/src/og/control/Control.js +197 -188
- package/src/og/control/GeoImageDragControl.js +84 -66
- package/src/og/control/LayerSwitcher.js +56 -138
- package/src/og/control/Lighting.js +314 -186
- package/src/og/control/MouseNavigation.js +2 -2
- package/src/og/control/RulerSwitcher.js +24 -19
- package/src/og/control/ScaleControl.js +30 -10
- package/src/og/control/SimpleSkyBackground.js +210 -0
- package/src/og/control/Sun.js +3 -1
- package/src/og/control/ZoomControl.js +30 -42
- package/src/og/control/index.js +6 -0
- package/src/og/control/ruler/RulerScene.js +5 -23
- package/src/og/control/selection/Selection.js +99 -0
- package/src/og/control/selection/SelectionScene.js +350 -0
- package/src/og/control/timeline/TimelineControl.js +99 -0
- package/src/og/control/timeline/TimelineModel.js +133 -0
- package/src/og/control/timeline/TimelineView.js +449 -0
- package/src/og/control/timeline/timelineUtils.js +132 -0
- package/src/og/ellipsoid/Ellipsoid.js +120 -93
- package/src/og/ellipsoid/wgs84.js +13 -13
- package/src/og/entity/Entity.js +36 -9
- package/src/og/entity/EntityCollection.js +0 -2
- package/src/og/entity/GeoObject.js +72 -56
- package/src/og/entity/GeoObjectHandler.js +487 -656
- package/src/og/entity/GeometryHandler.js +1341 -1337
- package/src/og/entity/Polyline.js +0 -16
- package/src/og/entity/Ray.js +0 -10
- package/src/og/entity/RayHandler.js +3 -44
- package/src/og/entity/Strip.js +1 -6
- package/src/og/index.js +13 -7
- package/src/og/input/input.js +3 -1
- package/src/og/layer/CanvasTiles.js +39 -34
- package/src/og/layer/Layer.js +69 -9
- package/src/og/layer/Material.js +1 -8
- package/src/og/layer/WMS.js +16 -5
- package/src/og/light/LightSource.js +2 -0
- package/src/og/math/Line3.js +140 -139
- package/src/og/math/Plane.js +118 -117
- package/src/og/math/Ray.js +242 -239
- package/src/og/math/Vec3.js +56 -37
- package/src/og/math/Vec4.js +3 -4
- package/src/og/math.js +21 -21
- package/src/og/quadTree/Node.js +5 -4
- package/src/og/quadTree/index.js +12 -0
- package/src/og/renderer/Renderer.js +64 -37
- package/src/og/renderer/RendererEvents.js +1071 -1065
- package/src/og/scene/Planet.js +354 -174
- package/src/og/scene/RenderNode.js +27 -12
- package/src/og/segment/Segment.js +0 -5
- package/src/og/shaders/atmos.js +332 -0
- package/src/og/shaders/drawnode.js +475 -109
- package/src/og/shaders/geoObject.js +96 -51
- package/src/og/shaders/polyline.js +212 -17
- package/src/og/shaders/ray.js +13 -6
- package/src/og/shaders/toneMapping.js +5 -5
- package/src/og/shaders/utils.js +88 -0
- package/src/og/terrain/GlobusTerrain.js +5 -4
- package/src/og/terrain/MapboxTerrain.js +231 -52
- package/src/og/ui/Button.js +106 -0
- package/src/og/ui/ButtonGroup.js +57 -0
- package/src/og/ui/Dialog.js +242 -0
- package/src/og/ui/Slider.js +144 -0
- package/src/og/ui/ToggleButton.js +51 -0
- package/src/og/{control → ui}/UIhelpers.js +11 -2
- package/src/og/ui/View.js +190 -0
- package/src/og/utils/shared.js +960 -942
- package/src/og/webgl/Framebuffer.js +308 -387
- package/src/og/webgl/Handler.js +90 -30
- package/src/og/webgl/Multisample.js +8 -0
- package/types/Clock.d.ts +7 -2
- package/types/Object3d.d.ts +14 -3
- package/types/camera/Camera.d.ts +18 -17
- package/types/camera/PlanetCamera.d.ts +3 -1
- package/types/control/Atmosphere.d.ts +15 -0
- package/types/control/CompassButton.d.ts +1 -2
- package/types/control/GeoImageDragControl.d.ts +7 -1
- package/types/control/LayerSwitcher.d.ts +5 -6
- package/types/control/Lighting.d.ts +32 -7
- package/types/control/ScaleControl.d.ts +2 -1
- package/types/control/SimpleSkyBackground.d.ts +15 -0
- package/types/control/ZoomControl.d.ts +0 -1
- package/types/control/index.d.ts +4 -1
- package/types/control/ruler/RulerScene.d.ts +0 -1
- package/types/control/selection/Selection.d.ts +49 -0
- package/types/control/selection/SelectionScene.d.ts +34 -0
- package/types/ellipsoid/Ellipsoid.d.ts +3 -2
- package/types/entity/Entity.d.ts +8 -0
- package/types/entity/GeoObject.d.ts +28 -22
- package/types/entity/GeoObjectHandler.d.ts +16 -56
- package/types/entity/Ray.d.ts +0 -3
- package/types/entity/RayHandler.d.ts +0 -4
- package/types/index.d.ts +9 -6
- package/types/input/input.d.ts +2 -0
- package/types/layer/CanvasTiles.d.ts +1 -0
- package/types/layer/Layer.d.ts +9 -0
- package/types/layer/WMS.d.ts +7 -3
- package/types/math/Plane.d.ts +1 -1
- package/types/math/Vec3.d.ts +19 -16
- package/types/math/Vec4.d.ts +2 -3
- package/types/math.d.ts +20 -20
- package/types/quadTree/index.d.ts +10 -0
- package/types/renderer/Renderer.d.ts +11 -37
- package/types/scene/Planet.d.ts +27 -1
- package/types/scene/RenderNode.d.ts +2 -1
- package/types/segment/Segment.d.ts +1 -1
- package/types/shaders/atmos.d.ts +4 -0
- package/types/shaders/drawnode.d.ts +3 -2
- package/types/shaders/utils.d.ts +1 -0
- package/types/terrain/GlobusTerrain.d.ts +1 -1
- package/types/terrain/MapboxTerrain.d.ts +2 -1
- package/types/ui/Button.d.ts +21 -0
- package/types/ui/Dialog.d.ts +41 -0
- package/types/ui/Slider.d.ts +30 -0
- package/types/ui/ToggleButton.d.ts +10 -0
- package/types/{control → ui}/UIhelpers.d.ts +1 -1
- package/types/ui/View.d.ts +32 -0
- package/types/utils/shared.d.ts +16 -14
- package/types/webgl/Framebuffer.d.ts +2 -5
- package/types/webgl/Handler.d.ts +15 -10
- package/types/webgl/Multisample.d.ts +2 -0
- package/src/og/ajax.js +0 -204
- package/src/og/entity/Object3d.js +0 -504
- package/src/og/utils/quadTreeType.js +0 -11
- package/types/ajax.d.ts +0 -24
- 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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
105
|
+
btn.on("click", this._onClick, this);
|
|
113
106
|
|
|
114
|
-
|
|
107
|
+
this._svg = btn.select("svg");
|
|
115
108
|
|
|
116
109
|
this.renderer.events.on("draw", this._draw, this);
|
|
117
110
|
}
|