@openglobus/og 0.20.1 → 0.20.3

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 (35) hide show
  1. package/css/og.css +55 -23
  2. package/lib/@openglobus/js/Globe.d.ts +3 -0
  3. package/lib/@openglobus/js/control/Atmosphere.d.ts +27 -3
  4. package/lib/@openglobus/js/control/AtmosphereConfig.d.ts +59 -0
  5. package/lib/@openglobus/js/control/index.d.ts +29 -29
  6. package/lib/@openglobus/js/scene/Planet.d.ts +6 -0
  7. package/lib/@openglobus/js/shaders/atmos.d.ts +19 -3
  8. package/lib/@openglobus/js/shaders/drawnode.d.ts +2 -1
  9. package/lib/@openglobus/js/webgl/Handler.d.ts +3 -1
  10. package/lib/@openglobus/og.css +1 -1
  11. package/lib/@openglobus/og.esm.js +1 -1
  12. package/lib/@openglobus/og.esm.js.map +1 -1
  13. package/lib/@openglobus/og.umd.js +1 -1
  14. package/lib/@openglobus/og.umd.js.map +1 -1
  15. package/lib/js/Globe.d.ts +3 -0
  16. package/lib/js/Globe.js +6 -1
  17. package/lib/js/control/Atmosphere.d.ts +27 -3
  18. package/lib/js/control/Atmosphere.js +109 -43
  19. package/lib/js/control/AtmosphereConfig.d.ts +59 -0
  20. package/lib/js/control/AtmosphereConfig.js +348 -0
  21. package/lib/js/control/DebugInfo.js +5 -4
  22. package/lib/js/control/Lighting.js +13 -5
  23. package/lib/js/control/index.d.ts +29 -29
  24. package/lib/js/control/index.js +29 -29
  25. package/lib/js/layer/Layer.js +2 -2
  26. package/lib/js/scene/Planet.d.ts +6 -0
  27. package/lib/js/scene/Planet.js +24 -10
  28. package/lib/js/shaders/atmos.d.ts +19 -3
  29. package/lib/js/shaders/atmos.js +40 -26
  30. package/lib/js/shaders/drawnode.d.ts +2 -1
  31. package/lib/js/shaders/drawnode.js +15 -12
  32. package/lib/js/ui/Slider.js +3 -3
  33. package/lib/js/webgl/Handler.d.ts +3 -1
  34. package/lib/js/webgl/Handler.js +38 -28
  35. package/package.json +8 -8
package/css/og.css CHANGED
@@ -140,19 +140,33 @@ input {
140
140
  visibility: hidden !important;
141
141
  }
142
142
 
143
- /*.og-dialog {
144
- position: absolute;
145
- right: 52px;
146
- width: 13em;
147
- border-radius: 4px;
148
- box-shadow: 3px 3px 4px rgba(15, 15, 15, 0.17);
149
- background-color: rgba(64, 59, 59, 0.85);
150
- z-index: 25000;
151
- padding: 0;
152
- margin: 0;
153
- font-family: "Segoe UI", Frutiger, "Frutiger Linotype", "Dejavu Sans", "Helvetica Neue", Arial, sans-serif;
154
- overflow: hidden;
155
- }*/
143
+ .og-options-container {
144
+ position: relative;
145
+ padding: 12px;
146
+ height: calc(100% - 30px);
147
+ color: #b6b6b6;
148
+ }
149
+
150
+ .og-option {
151
+ width: 100%;
152
+ position: relative;
153
+ display: inline-block;
154
+ flex-direction: row;
155
+ padding-bottom: 7px;
156
+ text-overflow: ellipsis;
157
+ align-items: center;
158
+ justify-content: left;
159
+ }
160
+
161
+ .og-option .og-slider {
162
+ width: 100%;
163
+ }
164
+
165
+ .og-option .og-slider .og-slider-label,
166
+ .og-option .og-color-label {
167
+ width: 100px;
168
+ font-size: 12px;
169
+ }
156
170
 
157
171
  .og-ddialog {
158
172
  position: absolute;
@@ -620,20 +634,15 @@ input {
620
634
  position: relative;
621
635
  }
622
636
 
637
+ .og-emptyline,
623
638
  .og-lighing .og-lighting-emptyline {
624
639
  width: 100%;
625
640
  padding: 3px;
626
641
  }
627
642
 
628
- .og-lighing .og-option {
643
+ .og-emptyline-2 {
629
644
  width: 100%;
630
- position: relative;
631
- display: inline-block;
632
- flex-direction: row;
633
- padding-bottom: 7px;
634
- text-overflow: ellipsis;
635
- align-items: center;
636
- justify-content: left;
645
+ padding: 5px;
637
646
  }
638
647
 
639
648
  .og-lighing .og-slider {
@@ -717,6 +726,28 @@ input {
717
726
  pointer-events: none;
718
727
  }
719
728
 
729
+
730
+ /*
731
+ ==========================
732
+ Atmosphere Config
733
+ ==========================
734
+ */
735
+ .og-atmosphere_button {
736
+ position: absolute;
737
+ left: 10px;
738
+ top: 230px;
739
+ }
740
+
741
+ .og-atmosphere.og-options-container .og-slider-label {
742
+ width: 300px;
743
+ overflow: hidden;
744
+ height: 20px;
745
+ }
746
+
747
+ .og-atmosphere.og-options-container .og-slider input{
748
+ width: 87px;
749
+ }
750
+
720
751
  /*
721
752
  ==========================
722
753
  TIMELINE
@@ -838,7 +869,7 @@ TIMELINE
838
869
  display: flex;
839
870
  flex-direction: row;
840
871
  width: 200px;
841
- height: 20px;
872
+ /*height: 20px;*/
842
873
  }
843
874
 
844
875
  .og-slider .og-slider-label {
@@ -850,12 +881,13 @@ TIMELINE
850
881
  display: flex;
851
882
  align-items: center;
852
883
  text-align: left;
884
+ margin-right: 5px;
853
885
  }
854
886
 
855
887
  .og-slider .og-slider-panel {
856
888
  position: relative;
857
889
  width: 100%;
858
- height: 100%;
890
+ height: 20px;
859
891
  background-color: var(--grey1);
860
892
  z-index: 1;
861
893
  }
@@ -9,6 +9,7 @@ import { Sun } from "./control/Sun";
9
9
  import { HTMLDivElementExt, Renderer } from "./renderer/Renderer";
10
10
  import { RenderNode } from "./scene/RenderNode";
11
11
  import { Extent } from "./Extent";
12
+ import { IAtmosphereParams } from "./control/Atmosphere";
12
13
  export interface IGlobeParams {
13
14
  attributionContainer?: HTMLElement;
14
15
  target?: string | HTMLElement;
@@ -43,6 +44,7 @@ export interface IGlobeParams {
43
44
  autoActivate?: boolean;
44
45
  fontsSrc?: string;
45
46
  resourcesSrc?: string;
47
+ atmosphereParameters?: IAtmosphereParams;
46
48
  }
47
49
  /**
48
50
  * Creates a WebGL context with globe.
@@ -94,6 +96,7 @@ export interface IGlobeParams {
94
96
  * @param {number} [options.dpi] - Device pixel ratio. Default is current screen DPI.
95
97
  * @param {boolean} [options.atmosphereEnabled] - Enables atmosphere effect.
96
98
  * @param {boolean} [options.transtitionOpacityEnabled] - Enables terrain smooth opacity transition effect.
99
+ * @param {IAtmosphereParams} [options.atmosphereParameters] - Atmosphere model parameters.
97
100
  */
98
101
  declare class Globe {
99
102
  static __counter__: number;
@@ -1,16 +1,40 @@
1
+ import { AtmosphereParameters } from "../shaders/atmos";
1
2
  import { Framebuffer } from "../webgl/Framebuffer";
2
3
  import { Control, IControlParams } from "./Control";
3
- interface IAtmosphereParams extends IControlParams {
4
+ import { NumberArray3 } from '../math/Vec3';
5
+ export interface IAtmosphereParams extends IControlParams {
6
+ height?: number;
7
+ rayleighScale?: number;
8
+ mieScale?: number;
9
+ groundAlbedo?: number;
10
+ bottomRadius?: number;
11
+ rayleighScatteringCoefficient?: NumberArray3;
12
+ mieScatteringCoefficient?: number;
13
+ mieExtinctionCoefficient?: number;
14
+ ozoneAbsorptionCoefficient?: NumberArray3;
15
+ sunAngularRadius?: number;
16
+ sunIntensity?: number;
17
+ ozoneDensityHeight?: number;
18
+ ozoneDensityWide?: number;
4
19
  }
5
20
  export declare class Atmosphere extends Control {
6
21
  _transmittanceBuffer: Framebuffer | null;
7
22
  _scatteringBuffer: Framebuffer | null;
8
23
  opacity: number;
24
+ protected _parameters: AtmosphereParameters;
9
25
  constructor(options?: IAtmosphereParams);
26
+ setParameters(parameters: AtmosphereParameters): void;
27
+ get parameters(): AtmosphereParameters;
28
+ initPlanetAtmosphereShader(): void;
10
29
  oninit(): void;
30
+ initLookupTexturesShaders(): void;
31
+ initBackgroundShader(): void;
32
+ removeBackgroundShader(): void;
33
+ removeLookupTexturesShaders(): void;
11
34
  onactivate(): void;
12
35
  ondeactivate(): void;
13
- protected _drawAtmosphereTextures(): void;
36
+ protected _initLookupTextures(): void;
37
+ protected _renderLookupTextures(): void;
38
+ drawLookupTextures(): void;
14
39
  protected _drawBackground(): void;
15
40
  }
16
- export {};
@@ -0,0 +1,59 @@
1
+ import { Control, IControlParams } from "./Control";
2
+ import { Dialog } from '../ui/Dialog';
3
+ import { Slider } from "../ui/Slider";
4
+ import { ToggleButton } from "../ui/ToggleButton";
5
+ import { View } from '../ui/View';
6
+ import { AtmosphereParameters } from "../shaders/atmos";
7
+ interface IAtmosphereConfigParams extends IControlParams {
8
+ }
9
+ /**
10
+ * Helps to set up atmosphere parameters.
11
+ */
12
+ export declare class AtmosphereConfig extends Control {
13
+ protected _toggleBtn: ToggleButton;
14
+ protected _dialog: Dialog<null>;
15
+ protected _panel: View<null>;
16
+ $maxOpacity: HTMLElement | null;
17
+ $minOpacity: HTMLElement | null;
18
+ $rayleight: HTMLElement | null;
19
+ $mie: HTMLElement | null;
20
+ $height: HTMLElement | null;
21
+ $bottomRadius: HTMLElement | null;
22
+ $mieScatteringCoefficient: HTMLElement | null;
23
+ $mieExtinctionCoefficient: HTMLElement | null;
24
+ $rayleighScatteringCoefficientA: HTMLElement | null;
25
+ $rayleighScatteringCoefficientB: HTMLElement | null;
26
+ $rayleighScatteringCoefficientC: HTMLElement | null;
27
+ $ozoneAbsorptionCoefficientA: HTMLElement | null;
28
+ $ozoneAbsorptionCoefficientB: HTMLElement | null;
29
+ $ozoneAbsorptionCoefficientC: HTMLElement | null;
30
+ $sunAngularRadius: HTMLElement | null;
31
+ $sunIntensity: HTMLElement | null;
32
+ $groundAlbedo: HTMLElement | null;
33
+ $ozoneDensityHeight: HTMLElement | null;
34
+ $ozoneDensityWide: HTMLElement | null;
35
+ protected _maxOpacity: Slider;
36
+ protected _minOpacity: Slider;
37
+ protected _rayleight: Slider;
38
+ protected _mie: Slider;
39
+ protected _height: Slider;
40
+ protected _bottomRadius: Slider;
41
+ protected _mieScatteringCoefficient: Slider;
42
+ protected _mieExtinctionCoefficient: Slider;
43
+ protected _rayleighScatteringCoefficientA: Slider;
44
+ protected _rayleighScatteringCoefficientB: Slider;
45
+ protected _rayleighScatteringCoefficientC: Slider;
46
+ protected _ozoneAbsorptionCoefficientA: Slider;
47
+ protected _ozoneAbsorptionCoefficientB: Slider;
48
+ protected _ozoneAbsorptionCoefficientC: Slider;
49
+ protected _sunAngularRadius: Slider;
50
+ protected _sunIntensity: Slider;
51
+ protected _groundAlbedo: Slider;
52
+ protected _ozoneDensityHeight: Slider;
53
+ protected _ozoneDensityWide: Slider;
54
+ protected _parameters: AtmosphereParameters;
55
+ constructor(options?: IAtmosphereConfigParams);
56
+ oninit(): void;
57
+ protected _update(): void;
58
+ }
59
+ export {};
@@ -1,29 +1,29 @@
1
- import { CompassButton } from "./CompassButton";
2
- import { Control } from "./Control";
3
- import { DebugInfo } from "./DebugInfo";
4
- import { DrawingSwitcher } from "./DrawingSwitcher";
5
- import { EarthCoordinates } from "./EarthCoordinates";
6
- import { EarthNavigation } from "./EarthNavigation";
7
- import { GeoImageDragControl } from "./GeoImageDragControl";
8
- import { KeyboardNavigation } from "./KeyboardNavigation";
9
- import { LayerAnimation } from "./LayerAnimation";
10
- import { LayerSwitcher } from "./LayerSwitcher";
11
- import { Lighting } from "./Lighting";
12
- import { MouseNavigation } from "./MouseNavigation";
13
- import { MouseWheelZoomControl } from "./MouseWheelZoomControl";
14
- import { RulerSwitcher } from "./RulerSwitcher";
15
- import { ScaleControl } from "./ScaleControl";
16
- import { ShowFps } from "./ShowFps";
17
- import { SimpleNavigation } from "./SimpleNavigation";
18
- import { SimpleSkyBackground } from "./SimpleSkyBackground";
19
- import { Sun } from "./Sun";
20
- import { ToggleWireframe } from "./ToggleWireframe";
21
- import { TouchNavigation } from "./TouchNavigation";
22
- import { ZoomControl } from "./ZoomControl";
23
- import { DrawingControl } from "./drawing/DrawingControl";
24
- import { HeightRuler } from "./heightRuler/HeightRuler";
25
- import { Ruler } from "./ruler/Ruler";
26
- import { Selection } from "./selection/Selection";
27
- import { TimelineControl } from "./timeline/TimelineControl";
28
- import { ElevationProfileControl } from "./elevationProfile/ElevationProfileControl";
29
- export { CompassButton, Control, DebugInfo, DrawingControl, DrawingSwitcher, EarthCoordinates, EarthNavigation, GeoImageDragControl, HeightRuler, KeyboardNavigation, LayerAnimation, LayerSwitcher, Lighting, MouseNavigation, MouseWheelZoomControl, Ruler, RulerSwitcher, ScaleControl, Selection, ShowFps, SimpleNavigation, SimpleSkyBackground, Sun, TimelineControl, ToggleWireframe, TouchNavigation, ZoomControl, ElevationProfileControl };
1
+ export * from "./CompassButton";
2
+ export * from "./Control";
3
+ export * from "./DebugInfo";
4
+ export * from "./DrawingSwitcher";
5
+ export * from "./EarthCoordinates";
6
+ export * from "./EarthNavigation";
7
+ export * from "./GeoImageDragControl";
8
+ export * from "./KeyboardNavigation";
9
+ export * from "./LayerAnimation";
10
+ export * from "./LayerSwitcher";
11
+ export * from "./Lighting";
12
+ export * from "./MouseNavigation";
13
+ export * from "./MouseWheelZoomControl";
14
+ export * from "./RulerSwitcher";
15
+ export * from "./ScaleControl";
16
+ export * from "./ShowFps";
17
+ export * from "./SimpleNavigation";
18
+ export * from "./SimpleSkyBackground";
19
+ export * from "./Sun";
20
+ export * from "./ToggleWireframe";
21
+ export * from "./TouchNavigation";
22
+ export * from "./ZoomControl";
23
+ export * from "./drawing/DrawingControl";
24
+ export * from "./heightRuler/HeightRuler";
25
+ export * from "./ruler/Ruler";
26
+ export * from "./selection/Selection";
27
+ export * from "./timeline/TimelineControl";
28
+ export * from "./elevationProfile/ElevationProfileControl";
29
+ export * from "./AtmosphereConfig";
@@ -1,3 +1,4 @@
1
+ import { Atmosphere, IAtmosphereParams } from "../control/Atmosphere";
1
2
  import { Control } from "../control/Control";
2
3
  import { EventsHandler } from "../Events";
3
4
  import { EmptyTerrain } from "../terrain/EmptyTerrain";
@@ -25,6 +26,7 @@ import { VectorTileCreator } from "../utils/VectorTileCreator";
25
26
  import { WebGLBufferExt, WebGLTextureExt, IDefaultTextureParams } from "../webgl/Handler";
26
27
  import { Program } from "../webgl/Program";
27
28
  import { Segment } from "../segment/Segment";
29
+ import { AtmosphereParameters } from "../shaders/atmos";
28
30
  export interface IPlanetParams {
29
31
  name?: string;
30
32
  ellipsoid?: Ellipsoid;
@@ -45,6 +47,7 @@ export interface IPlanetParams {
45
47
  maxLoadingRequests?: number;
46
48
  atmosphereEnabled?: boolean;
47
49
  transitionOpacityEnabled?: boolean;
50
+ atmosphereParameters?: IAtmosphereParams;
48
51
  }
49
52
  export type PlanetEventsList = [
50
53
  "draw",
@@ -324,6 +327,7 @@ export declare class Planet extends RenderNode {
324
327
  _prevNodes: Map<number, Node>;
325
328
  _currNodes: Map<number, Node>;
326
329
  protected _transitionOpacityEnabled: boolean;
330
+ protected _atmosphere: Atmosphere;
327
331
  constructor(options?: IPlanetParams);
328
332
  /**
329
333
  * Returns true if current terrain data set is loaded
@@ -422,6 +426,8 @@ export declare class Planet extends RenderNode {
422
426
  * @param {EmptyTerrain} terrain - Terrain provider.
423
427
  */
424
428
  setTerrain(terrain: EmptyTerrain): void;
429
+ initAtmosphereShader(atmosParams?: AtmosphereParameters): void;
430
+ get atmosphereControl(): Atmosphere;
425
431
  protected _initializeAtmosphere(): void;
426
432
  protected _initializeShaders(): void;
427
433
  protected _onLayerLoadend(layer: Layer): void;
@@ -1,4 +1,20 @@
1
1
  import { Program } from '../webgl/Program';
2
- export declare const COMMON = "\n \n \n float getLerpValue(in float min, in float max, in float between)\n {\n return (clamp(between, min, max) - min) / (max - min);\n }\n \n vec3 aces(vec3 color) \n {\n float a = 2.51;\n float b = 0.03;\n float c = 2.43;\n float d = 0.59;\n float e = 0.14;\n return clamp((color * (a * color + b)) / (color * (c * color + d ) + e), 0.0, 1.0);\n }\n \n bool intersectSphere(vec3 rayOrigin, vec3 rayDirection, float radius, inout float t1, inout float t2) \n {\n float b = dot(rayDirection, rayOrigin);\n float c = dot(rayOrigin, rayOrigin) - radius * radius;\n float d = b * b - c;\n if (d < 0.0) {\n return false;\n }\n t1 = -b - sqrt(d);\n t2 = -b + sqrt(d);\n return true;\n }\n \n bool intersectSphere(vec3 rayOrigin, vec3 rayDirection, float radius, inout float t) \n {\n float b = dot(rayDirection, rayOrigin);\n float c = dot(rayOrigin, rayOrigin) - radius * radius;\n float d = b * b - c;\n if (d < 0.0) {\n return false;\n }\n t = -b - sqrt(d);\n return true;\n }\n \n bool intersectEllipsoid( in vec3 ro, in vec3 rd, in vec3 ra, inout float t )\n {\n vec3 ocn = ro/ra;\n vec3 rdn = rd/ra;\n float a = dot( rdn, rdn );\n float b = dot( ocn, rdn );\n float c = dot( ocn, ocn );\n float h = b*b - a*(c-1.0);\n \n if (h < 0.0) \n { \n return false; \n }\n \n t = (-b-sqrt(h))/a;\n \n return true;\n }\n \n bool intersectEllipsoid( in vec3 ro, in vec3 rd, in vec3 ra, inout float t1, inout float t2)\n {\n vec3 ocn = ro/ra;\n vec3 rdn = rd/ra;\n float a = dot( rdn, rdn );\n float b = dot( ocn, rdn );\n float c = dot( ocn, ocn );\n float h = b*b - a*(c-1.0);\n \n if (h < 0.0) \n { \n return false; \n }\n \n h = sqrt(h);\n t1 = (-b-h)/a;\n t2 = (-b+h)/a;\n \n return true;\n }\n \n vec3 normalEllipsoid( in vec3 pos, in vec3 ra )\n {\n return normalize( pos/(ra*ra) );\n }\n\n \n #define PI 3.1415926538\n #define ATMOS_HEIGHT 100000.0\n #define RAYLEIGH_SCALE 0.08\n #define MIE_SCALE 0.012\n \n #define SAMPLE_COUNT 16\n #define SQRT_SAMPLE_COUNT 4\n \n const float GROUND_ALBEDO = 0.05 / PI;\n\n // Sphere\n const float BOTTOM_RADIUS = 6356752.3142451793;\n const float TOP_RADIUS = 6356752.3142451793 + ATMOS_HEIGHT;\n \n // Ellipsoid\n const vec3 bottomRadii = vec3(6378137.0, 6378137.0, 6356752.3142451793); \n const vec3 topRadii = bottomRadii + ATMOS_HEIGHT;\n \n const vec3 SPHERE_TO_ELLIPSOID_SCALE = vec3(BOTTOM_RADIUS) / bottomRadii; \n \n const vec2 rayleighMieHeights = vec2(RAYLEIGH_SCALE, MIE_SCALE) * ATMOS_HEIGHT;\n \n const vec3 rayleighScatteringCoefficient = vec3(5.802, 13.558, 33.100) * 1e-6;\n \n const float mieScatteringCoefficient = 3.996e-06;\n const float mieExtinctionCoefficient = 4.440e-06;\n const vec3 ozoneAbsorptionCoefficient = vec3(0.650, 1.881, 0.085) * 1e-6;\n \n const float SUN_ANGULAR_RADIUS = 0.004685;\n const float SUN_INTENSITY = 1.0; \n \n vec3 sunWithBloom(vec3 rayDir, vec3 sunDir) \n {\n float minSunCosTheta = cos(SUN_ANGULAR_RADIUS); \n float cosTheta = dot(rayDir, sunDir);\n if (cosTheta >= minSunCosTheta) return vec3(1.0); \n float offset = minSunCosTheta - cosTheta;\n float gaussianBloom = exp(-offset*15000.0)*0.7;\n float invBloom = 1.0/(0.09 + offset*200.0)*0.01;\n return vec3(gaussianBloom + invBloom);\n }\n \n float rayleighPhase(float angle) \n {\n return 3.0 / (16.0 * PI) * (1.0 + (angle * angle));\n }\n \n float miePhase(float angle) \n {\n float g = 0.8;\n 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));\n }\n \n vec3 opticalDepth(float height, float angle) \n {\n vec3 rayOrigin = vec3(0.0, BOTTOM_RADIUS + height, 0.0);\n vec3 rayDirection = vec3(sqrt(1.0 - angle * angle), angle, 0.0);\n float t1, t2;\n intersectSphere(rayOrigin, rayDirection, TOP_RADIUS, t1, t2);\n float segmentLength = t2 / float(SAMPLE_COUNT);\n \n float t = segmentLength * 0.5;\n vec3 opticalDepth = vec3(0.0);\n \n for (int i = 0; i < SAMPLE_COUNT; i++) \n {\n vec3 position = rayOrigin + t * rayDirection;\n float height = length(position) - BOTTOM_RADIUS;\n opticalDepth.xy += exp(-height / rayleighMieHeights) * segmentLength;\n \n // density of the ozone layer is modeled as a triangular \n // function that is 30 km wide and centered at 25 km altitude\n opticalDepth.z += (1.0 - min(abs(height - 25e3) / 15e3, 1.0)) * segmentLength; \n t += segmentLength;\n }\n \n return opticalDepth;\n }\n \n vec3 transmittance(float height, float angle) \n {\n vec3 opticalDepth = opticalDepth(height, angle);\n return exp(-(rayleighScatteringCoefficient * opticalDepth.x + mieExtinctionCoefficient * opticalDepth.y + ozoneAbsorptionCoefficient * opticalDepth.z));\n }";
3
- export declare function transmittance(): Program;
4
- export declare function scattering(): Program;
2
+ import { NumberArray3 } from "../math/Vec3";
3
+ export interface AtmosphereParameters {
4
+ ATMOS_HEIGHT: number;
5
+ RAYLEIGH_SCALE: number;
6
+ MIE_SCALE: number;
7
+ GROUND_ALBEDO: number;
8
+ BOTTOM_RADIUS: number;
9
+ rayleighScatteringCoefficient: NumberArray3;
10
+ mieScatteringCoefficient: number;
11
+ mieExtinctionCoefficient: number;
12
+ ozoneAbsorptionCoefficient: NumberArray3;
13
+ SUN_ANGULAR_RADIUS: number;
14
+ SUN_INTENSITY: number;
15
+ ozoneDensityHeight: number;
16
+ ozoneDensityWide: number;
17
+ }
18
+ export declare const COMMON: (atmosParams?: AtmosphereParameters) => string;
19
+ export declare function transmittance(atmosParams?: AtmosphereParameters): Program;
20
+ export declare function scattering(atmosParams?: AtmosphereParameters): Program;
@@ -1,8 +1,9 @@
1
+ import { AtmosphereParameters } from "./atmos";
1
2
  import { Program } from "../webgl/Program";
2
3
  export declare function drawnode_screen_nl(): Program;
3
4
  export declare function drawnode_screen_wl_webgl1NoAtmos(): Program;
4
5
  export declare function drawnode_screen_wl_webgl2NoAtmos(): Program;
5
- export declare function drawnode_screen_wl_webgl2Atmos(): Program;
6
+ export declare function drawnode_screen_wl_webgl2Atmos(atmosParams?: AtmosphereParameters): Program;
6
7
  export declare function drawnode_colorPicking(): Program;
7
8
  export declare function drawnode_heightPicking(): Program;
8
9
  export declare function drawnode_depth(): Program;
@@ -56,6 +56,7 @@ export interface IDefaultTextureParams {
56
56
  * @param {Array.<string>} [params.extensions] - Additional WebGL extension list. Available by default: EXT_texture_filter_anisotropic.
57
57
  */
58
58
  declare class Handler {
59
+ protected _throttledDrawFrame: () => void;
59
60
  /**
60
61
  * Events.
61
62
  * @public
@@ -158,6 +159,7 @@ declare class Handler {
158
159
  resizeObserver?: ResizeObserver;
159
160
  protected _requestAnimationFrameId: number;
160
161
  constructor(canvasTarget: string | HTMLCanvasElement | undefined, params?: IHandlerParameters);
162
+ set frameDelay(delay: number);
161
163
  isInitialized(): boolean;
162
164
  protected _createCanvas(): void;
163
165
  /**
@@ -431,7 +433,7 @@ declare class Handler {
431
433
  * Draw single frame.
432
434
  * @public
433
435
  */
434
- drawFrame(): void;
436
+ drawFrame: () => void;
435
437
  /**
436
438
  * Clearing gl frame.
437
439
  * @public
@@ -1 +1 @@
1
- :root{--grey0:#2d2d2d;--grey1:#434244;--grey2:#3f3f46;--grey3:#bbb;--grey4:#5e5e5e;--grey5:#403b3b;--grey6:#bfbfbf;--grey7:#707070;--grey8:#e2e2e2;--blue0:#1700a9ee}.og-map-button{background-color:var(--grey5);cursor:pointer;height:40px;outline:none;position:absolute;width:40px;z-index:1}.ogCenterIcon{bottom:50%;height:12px;margin-bottom:-3.5px;margin-right:-7.5px;position:absolute;right:50%;width:12px}.ogHandPoiner{cursor:pointer}.defaultText{color:#fff;left:0;position:absolute;top:0}#ogShowFpsControl{color:red}.ogGrabbingPoiner{cursor:grabbing!important}.og-inner{background-color:#000;float:left;height:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none;width:100%}.og-attribution{background:#cecece;bottom:0;display:flex;flex-direction:row;font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:.7rem;line-height:1.375em;padding:1px 0;position:absolute;right:0;text-align:right}.og-attribution .og-attribution__layer{align-items:center;display:inline;margin-left:5px;margin-right:5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.og-attribution img{max-height:1.3em}.og-zoomin-button{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important;bottom:102px;right:12px}.og-zoomout-button{border-top-left-radius:0!important;border-top-right-radius:0!important;bottom:58px;right:12px}input{accent-color:var(--blue0);cursor:pointer}.og-menu-bar-vertical{background-color:rgba(64,59,59,.85);border-radius:2px;box-shadow:0 1px 4px hsla(0,0%,6%,.17);height:40px;position:absolute;right:12px;top:12px;width:40px;z-index:0}.og-hide{display:none!important}.og-not-visible{visibility:hidden!important}.og-ddialog{background-color:var(--grey0);border:1px solid;border-color:var(--grey1);border-radius:4px;box-shadow:3px 3px 4px hsla(0,0%,6%,.17);display:flex;flex-direction:column;overflow:auto;position:absolute}.og-ddialog .og-ddialog-header{align-items:center;background-color:var(--grey2);color:#fff;display:flex;flex-direction:row;height:27px;justify-content:space-between;padding:0;position:relative;width:100%;z-index:1}.og-ddialog .og-ddialog-header .og-ddialog-header__title{color:var(--grey3);font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-size:14px;font-weight:400;padding-left:5px;pointer-events:none}.og-ddialog .og-ddialog-header .og-ddialog-header__buttons{display:flex;flex-direction:row;justify-content:flex-end}.og-ddialog .og-ddialog-header .og-ddialog-header__buttons .og-button{border-radius:0}.og-ddialog .og-ddialog-container{font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:14px;height:100%;overflow:auto;position:relative;width:100%}.og-ddialog.dragging{user-select:none}.og-button{align-content:center;align-items:center;border-radius:4px;color:var(--grey6);cursor:default;display:flex;flex-direction:row;justify-content:center;padding:2px}.og-button svg,.og-button svg path{fill:var(--grey6)}.og-button__active.og-button svg,.og-button__active.og-button svg path{fill:#fff}.og-button .og-button-text{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-size:14px;font-weight:400}.og-button:hover{background-color:var(--grey4)}.og-button-size__20{height:20px;width:20px}.og-button__active{background-color:var(--grey2)}.og-layerSwitcher_button{right:12px;top:12px}.og-layerSwitcher{color:#b6b6b6;height:100%;overflow-x:hidden;overflow-y:auto;position:relative;width:100%}.og-layerSwitcher__title{color:#b6b6b6;font-size:14px;padding:5px;position:relative;width:100%}.og-layerSwitcher__list{display:inline-block;flex-direction:column;padding:2px;position:relative;width:100%}.og-layerSwitcher__layerButton{background-color:#7a7a7a;border:2px solid transparent;border-radius:5px;cursor:pointer;height:75px;margin:3px;padding:0;position:relative;width:75px}.og-layerSwitcher__layerButton.og-layerSwitcher__visible{border:2px solid #00ff14}.og-layerSwitcher__layerButton.og-layerSwitcher__visible img{opacity:1}.og-layerSwitcher__layerButton img{border-radius:5px;height:100%;left:0;opacity:1;position:absolute;top:0;width:100%}.og-layerSwitcher__layerButton img:hover{opacity:1}.og-layerSwitcher__name{background-color:rgba(0,0,0,.5);border-bottom-left-radius:5px;border-bottom-right-radius:5px;bottom:0;color:var(--grey8);font-size:12px;max-height:25px;overflow:hidden;padding:3px;position:absolute;text-overflow:ellipsis;width:calc(100% - 6px)}.displayNone{display:none}.displayBlock{display:block}.og-drawing-default_button{right:166px;top:12px}.og-drawing-default_button .og-button-icon{transform:scale(.73)}.og-drawing-polygon_button{right:115px;top:12px}.og-drawing-linestring_button{right:66px;top:12px}.og-ruler_button{right:12px;top:65px}.ogConsole{background-color:hsla(0,0%,51%,.49);color:#fff;font-family:Arial;font-size:14px;left:0;max-height:70%;overflow:auto;pointer-events:none;position:absolute;top:0;width:100%;z-index:100000000}.ogConsole-text{overflow:hidden;padding:7px}.ogConsole-error{color:red}.ogConsole-warning{color:#ff0}.ogViewExtentBtn{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYEAQAAAAa7ikwAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAABgAAAAYADwa0LPAAAAB3RJTUUH5ggMBTM4rM25AwAAAAJiS0dEAACqjSMyAAABsUlEQVRIx81WWYrCQBAVg4Iwbp8ud5DoYRRBxPMoouiPegQVPYp6Azdc/ly++01XKkmPksQ4ZmAKAr3V0u9VVScU8ikQkQhwuRifHIeCFiAWgy2xWHCGRSIBVKtAt6scdDrGmtz7IOJUyjAk7ne4Ce2JdhsimXzTeKkE7PfK0vEIjMdqTuPTSc23W6BY9G/cjvpwgKjVmOBHDnitXmfnJLcboOs+YNntWGGxADIZtRcOQ4xGEMMhjdV6Ngssl6yz2XjywuSZkf8w/vrW5MS8iWi13LPFgkbC8n5SEFwmVOLry+EApaJJ6C8KCSIaVcRXKk8FlE4D/T5vzmY81zT/0Wsa68znbKPX47ksSC5/JxkM/EdPxDvJ5RKMA3nWw8EfQxQsyecz2yiXvdNUptz7adposO716pim7EQ2Lrv3ZLP+o8/n7RQVzabHwWSSGxcJlb9y4t4qcjlgtWKd9RoiHn9x1WKRG5d1E1mhBr7PzY7WCBaruAiaQsEnnrpuNC5biLzJRL0D06ki1Ircp/FH0lstdRsnoaibzZeweDuKx6m3qE5rPZnlsmu2/KtH/9Pflm+sYR/yIsaCAQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOC0xMlQwNTo1MTo1NiswMDowMIPhE+YAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDgtMTJUMDU6NTE6NTYrMDA6MDDyvKtaAAAAKHRFWHRkYXRlOnRpbWVzdGFtcAAyMDIyLTA4LTEyVDA1OjUxOjU2KzAwOjAwpamKhQAAAABJRU5ErkJggg==) 50% no-repeat;cursor:pointer;height:24px;margin-left:12px;scale:70%;width:24px}.ogViewExtentBtn:hover{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYEAQAAAAa7ikwAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAABgAAAAYADwa0LPAAAAB3RJTUUH5ggMBTM4rM25AwAAAAJiS0dEAACqjSMyAAABsUlEQVRIx81WWYrCQBAVg4Iwbp8ud5DoYRRBxPMoouiPegQVPYp6Azdc/ly++01XKkmPksQ4ZmAKAr3V0u9VVScU8ikQkQhwuRifHIeCFiAWgy2xWHCGRSIBVKtAt6scdDrGmtz7IOJUyjAk7ne4Ce2JdhsimXzTeKkE7PfK0vEIjMdqTuPTSc23W6BY9G/cjvpwgKjVmOBHDnitXmfnJLcboOs+YNntWGGxADIZtRcOQ4xGEMMhjdV6Ngssl6yz2XjywuSZkf8w/vrW5MS8iWi13LPFgkbC8n5SEFwmVOLry+EApaJJ6C8KCSIaVcRXKk8FlE4D/T5vzmY81zT/0Wsa68znbKPX47ksSC5/JxkM/EdPxDvJ5RKMA3nWw8EfQxQsyecz2yiXvdNUptz7adposO716pim7EQ2Lrv3ZLP+o8/n7RQVzabHwWSSGxcJlb9y4t4qcjlgtWKd9RoiHn9x1WKRG5d1E1mhBr7PzY7WCBaruAiaQsEnnrpuNC5biLzJRL0D06ki1Ircp/FH0lstdRsnoaibzZeweDuKx6m3qE5rPZnlsmu2/KtH/9Pflm+sYR/yIsaCAQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOC0xMlQwNTo1MTo1NiswMDowMIPhE+YAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDgtMTJUMDU6NTE6NTYrMDA6MDDyvKtaAAAAKHRFWHRkYXRlOnRpbWVzdGFtcAAyMDIyLTA4LTEyVDA1OjUxOjU2KzAwOjAwpamKhQAAAABJRU5ErkJggg==) 50% no-repeat,var(--blue0);border-radius:10px}.og-debuginfo_button{left:10px;position:absolute;top:120px}.og-debuginfo_controls{display:flex;padding-bottom:8px}.og-debuginfo_controls-button{float:left;height:25px;margin:3px;width:25px}.og-debug-info{color:#fff;font-size:12px;padding:10px}.og-debug-info .og-watch-line{display:flex;flex-direction:row;padding-bottom:5px;width:100%}.og-watch-line .og-watch-label{color:#cecece;width:200px}.og-watch-line .og-watch-value{margin-left:15px}.og-popup{bottom:-2px;position:absolute;text-align:center}.og-popup-content-wrapper,.og-popup-tip{background:#fff;box-shadow:0 3px 14px rgba(0,0,0,.4);color:#333}.og-popup-content-wrapper{border-radius:8px;min-height:17px;min-width:30px;padding:1px;text-align:left}.og-popup-content{line-height:1.4;margin:20px 5px 5px}.og-popup-tip-container{bottom:-19px;height:20px;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none;position:absolute;width:40px}.og-popup-tip{height:17px;margin:-10px auto 0;padding:1px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:17px}.og-popup-toolbar{display:inline-block;position:absolute;right:2px;top:3px}.og-popup-btn{cursor:pointer;float:right;height:15px;width:15px}.og-popup-btn:hover{color:#2e9be7}.og-popup-title{font-size:14px;left:5px;position:absolute;top:3px}.og-scale-container{bottom:30px;position:absolute;right:320px}.og-scale-label{color:#fff;font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:12px;position:relative;text-align:center}.og-scale-ruler{border-bottom:2px solid #fff;border-left:1px solid #fff;border-right:1px solid #fff;height:7px;position:relative}.og-compass-button{bottom:153px;right:12px}.og-compass-button svg{height:40px!important;width:40px!important}.og-suncontrol-button{float:left;height:25px;margin:3px;width:25px}.og-lighting_button{left:10px;position:absolute;top:65px}.og-lighing{color:#b6b6b6;height:calc(100% - 30px);padding:12px;position:relative}.og-lighing .og-layers{align-items:center;display:flex;flex-direction:row}.og-lighing .og-caption{position:relative}.og-lighing .og-lighting-emptyline{padding:3px;width:100%}.og-lighing .og-option{align-items:center;display:inline-block;flex-direction:row;justify-content:left;padding-bottom:7px;position:relative;text-overflow:ellipsis;width:100%}.og-lighing .og-slider{width:100%}.og-lighing .og-color-label,.og-lighing .og-slider .og-slider-label{font-size:12px;width:100px}.og-lighing .og-color{padding-right:10px}.og-lighing #layers{font-family:monospace;margin-left:21px;padding:2px;width:200px}.og-coordinates{background-color:var(--grey5);border-radius:4px;bottom:25px;color:var(--grey8);cursor:pointer;float:left;font-family:monospace;font-size:1em;overflow:hidden;padding:5px;position:absolute;right:12px;text-align:right}.og-coordinates div{float:left}.og-lat-side,.og-lon-side{padding-right:3px;width:10px}.og-lat-val,.og-lon-val{overflow:hidden;padding-right:3px;text-align:left;text-overflow:unset;width:90px}.og-height{overflow:hidden;padding-left:3px;text-align:right;text-overflow:ellipsis;width:50px}.og-units-height{padding-left:3px;text-align:left;width:15px}.og-center-icon{bottom:50%;height:12px;margin-bottom:-3.5px;margin-right:-7.5px;pointer-events:none;position:absolute;right:50%;width:12px}.og-timeline_button{left:10px;position:absolute;top:10px}.og-timeline-control_button{background:var(--grey7);border-radius:1px;height:20px;margin-left:3px;margin-right:3px;width:25px}.og-button svg,.og-button svg path{height:24px;width:24px}.og-timeline-control_button.og-button__active{background:var(--grey3)}.og-timeline{background:#2d2d2d;bottom:0;height:100%;left:0;overflow:hidden;position:relative;width:100%}.og-timeline-frame{height:30px;margin:0 0 0 10px;position:relative;width:calc(100% - 20px)}.og-timeline-scale{height:100%;overflow:hidden;width:100%}.og-timeline-current{cursor:pointer;height:100%;left:0;margin-left:-5px;margin-top:-7px;position:absolute;width:11px}.og-timeline-current-spin{background-color:#ff3434;height:100%;margin:0 auto;pointer-events:none;width:1px}.og-timeline-current-arrow{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ff3434;height:0;margin-left:-6px;width:0}.og-timeline-bottom{margin-top:3px;width:100%}.og-timeline-bottom,.og-timeline-controls{display:flex;justify-content:center;position:relative}.og-timeline-controls{align-items:center;border-radius:10px;flex-direction:row;padding:8px}.og-timeline-unselectable{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.og-timeline-top{display:block;height:15px;width:100%}.og-slider{display:flex;flex-direction:row;height:20px;width:200px}.og-slider .og-slider-label{align-items:center;color:var(--grey6);display:flex;font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:14px;height:100%;text-align:left;width:100%}.og-slider .og-slider-panel{background-color:var(--grey1);height:100%;position:relative;width:100%;z-index:1}.og-slider .og-slider-panel .og-slider-progress{background-color:var(--grey7);height:100%;pointer-events:none;position:absolute}.og-slider .og-slider-panel .og-slider-pointer{background-color:var(--grey3);height:100%;left:0;pointer-events:none;position:absolute;top:0;width:3px}.og-slider input{background:var(--grey5);border:1px solid var(--grey1);color:var(--grey3);height:100%;padding-left:5px;position:relative;width:100%;width:60px;z-index:0}.og-slider input:focus-visible{outline:none}.og-slider input::-webkit-inner-spin-button,.og-slider input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.og-slider input[type=number]{-moz-appearance:textfield}.og-selection_button{right:12px;top:117px}.og-geoimagegrag_button{right:12px;top:169px}.og-elevationprofile{height:100%;overflow:hidden;position:absolute;width:100%}.og-elevationprofile__container{align-content:center;align-items:center;display:flex;flex-direction:column;height:100%;position:relative;width:100%}.og-elevationprofile__menu{height:43px;position:relative;width:100%}.og-elevationprofile__graph{height:100%;position:relative;width:100%}.og-elevationprofile_button{left:10px;top:175px}.og-elevationprofile-legend{color:var(--grey8);display:flex;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-size:12px;margin:5px;position:absolute;right:0;top:0;z-index:1}.og-elevationprofile-legend__row{padding:5px;position:relative;width:70px}.og-elevationprofile-square{float:left;height:6px;margin:5px;position:relative;width:6px}.og-elevationprofile-legend__track .og-elevationprofile-square{background-color:#00ff32}.og-elevationprofile-legend__ground .og-elevationprofile-square{background-color:#c6c6c6}.og-elevationprofile-legend__warning .og-elevationprofile-square{background-color:#ff0}.og-elevationprofile-legend__collision .og-elevationprofile-square{background-color:red}.og-elevationprofile-units{display:inline-block;float:left;padding-left:5px;position:relative}.og-elevationprofile-value{display:inline-block;float:left;overflow:hidden;position:relative;text-align:right;text-overflow:ellipsis;white-space:nowrap;width:30px}.og-elevationprofile-buttons{display:inline-block;left:0;position:absolute;top:0}.og-elevationprofile-button{float:left;height:25px;margin:3px;width:25px}.og-elevationprofile-list{display:flex;flex-direction:column;height:100%;position:relative;width:100%}.og-elevationprofile-list textarea{background:var(--grey8);height:100%;padding:5px;position:relative;resize:none;width:100%}.og-elevationprofile-list-buttons{align-items:center;display:flex;flex-direction:row;height:60px;justify-content:right;position:relative}.og-elevationprofile-list-apply{background-color:var(--grey2);float:right;margin-right:15px;padding:4px 10px 7px}.og-elevationprofile_pointer{height:100%;left:0;position:absolute;top:0}.og-elevationprofile-line{background-color:#fff;height:30px;margin-left:-1.5px;position:absolute;width:3px}.og-elevationprofile-label{color:#fff;left:0;position:absolute;top:0}.og-elevationprofile-button__location svg{height:17px;width:17px}.og-elevationprofile-loading{align-items:center;background-color:#000;display:flex;flex-direction:row;height:100%;justify-content:center;opacity:.3;position:absolute;width:100%;z-index:2}.og-simpleskybackground{display:flex}.og-color-label{color:var(--grey6);font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:14px}@keyframes ldio-p0v5a1f6oz{0%{opacity:1}50%{opacity:.5}to{opacity:1}}.ldio-p0v5a1f6oz div{animation:ldio-p0v5a1f6oz .9345794392523364s cubic-bezier(.5,0,.5,1) infinite;height:40px;position:absolute;top:30px;width:11px}.ldio-p0v5a1f6oz div:first-child{animation-delay:-.5607476635514018s;background:#353535;transform:translate(14.5px)}.ldio-p0v5a1f6oz div:nth-child(2){animation-delay:-.37383177570093457s;background:#666;transform:translate(34.5px)}.ldio-p0v5a1f6oz div:nth-child(3){animation-delay:-.18691588785046728s;background:#9b9b9b;transform:translate(54.5px)}.ldio-p0v5a1f6oz div:nth-child(4){animation-delay:-.9345794392523364s;background:#d4d4d4;transform:translate(74.5px)}.loadingio-spinner-bars-r354qqyl5v{background:none;display:inline-block;height:88px;overflow:hidden;width:88px}.ldio-p0v5a1f6oz{backface-visibility:hidden;height:100%;position:relative;transform:translateZ(0) scale(.88);transform-origin:0 0;width:100%}.ldio-p0v5a1f6oz div{box-sizing:content-box}
1
+ :root{--grey0:#2d2d2d;--grey1:#434244;--grey2:#3f3f46;--grey3:#bbb;--grey4:#5e5e5e;--grey5:#403b3b;--grey6:#bfbfbf;--grey7:#707070;--grey8:#e2e2e2;--blue0:#1700a9ee}.og-map-button{background-color:var(--grey5);cursor:pointer;height:40px;outline:none;position:absolute;width:40px;z-index:1}.ogCenterIcon{bottom:50%;height:12px;margin-bottom:-3.5px;margin-right:-7.5px;position:absolute;right:50%;width:12px}.ogHandPoiner{cursor:pointer}.defaultText{color:#fff;left:0;position:absolute;top:0}#ogShowFpsControl{color:red}.ogGrabbingPoiner{cursor:grabbing!important}.og-inner{background-color:#000;float:left;height:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none;width:100%}.og-attribution{background:#cecece;bottom:0;display:flex;flex-direction:row;font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:.7rem;line-height:1.375em;padding:1px 0;position:absolute;right:0;text-align:right}.og-attribution .og-attribution__layer{align-items:center;display:inline;margin-left:5px;margin-right:5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.og-attribution img{max-height:1.3em}.og-zoomin-button{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important;bottom:102px;right:12px}.og-zoomout-button{border-top-left-radius:0!important;border-top-right-radius:0!important;bottom:58px;right:12px}input{accent-color:var(--blue0);cursor:pointer}.og-menu-bar-vertical{background-color:rgba(64,59,59,.85);border-radius:2px;box-shadow:0 1px 4px hsla(0,0%,6%,.17);height:40px;position:absolute;right:12px;top:12px;width:40px;z-index:0}.og-hide{display:none!important}.og-not-visible{visibility:hidden!important}.og-options-container{color:#b6b6b6;height:calc(100% - 30px);padding:12px;position:relative}.og-option{align-items:center;display:inline-block;flex-direction:row;justify-content:left;padding-bottom:7px;position:relative;text-overflow:ellipsis;width:100%}.og-option .og-slider{width:100%}.og-option .og-color-label,.og-option .og-slider .og-slider-label{font-size:12px;width:100px}.og-ddialog{background-color:var(--grey0);border:1px solid;border-color:var(--grey1);border-radius:4px;box-shadow:3px 3px 4px hsla(0,0%,6%,.17);display:flex;flex-direction:column;overflow:auto;position:absolute}.og-ddialog .og-ddialog-header{align-items:center;background-color:var(--grey2);color:#fff;display:flex;flex-direction:row;height:27px;justify-content:space-between;padding:0;position:relative;width:100%;z-index:1}.og-ddialog .og-ddialog-header .og-ddialog-header__title{color:var(--grey3);font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-size:14px;font-weight:400;padding-left:5px;pointer-events:none}.og-ddialog .og-ddialog-header .og-ddialog-header__buttons{display:flex;flex-direction:row;justify-content:flex-end}.og-ddialog .og-ddialog-header .og-ddialog-header__buttons .og-button{border-radius:0}.og-ddialog .og-ddialog-container{font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:14px;height:100%;overflow:auto;position:relative;width:100%}.og-ddialog.dragging{user-select:none}.og-button{align-content:center;align-items:center;border-radius:4px;color:var(--grey6);cursor:default;display:flex;flex-direction:row;justify-content:center;padding:2px}.og-button svg,.og-button svg path{fill:var(--grey6)}.og-button__active.og-button svg,.og-button__active.og-button svg path{fill:#fff}.og-button .og-button-text{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-size:14px;font-weight:400}.og-button:hover{background-color:var(--grey4)}.og-button-size__20{height:20px;width:20px}.og-button__active{background-color:var(--grey2)}.og-layerSwitcher_button{right:12px;top:12px}.og-layerSwitcher{color:#b6b6b6;height:100%;overflow-x:hidden;overflow-y:auto;position:relative;width:100%}.og-layerSwitcher__title{color:#b6b6b6;font-size:14px;padding:5px;position:relative;width:100%}.og-layerSwitcher__list{display:inline-block;flex-direction:column;padding:2px;position:relative;width:100%}.og-layerSwitcher__layerButton{background-color:#7a7a7a;border:2px solid transparent;border-radius:5px;cursor:pointer;height:75px;margin:3px;padding:0;position:relative;width:75px}.og-layerSwitcher__layerButton.og-layerSwitcher__visible{border:2px solid #00ff14}.og-layerSwitcher__layerButton.og-layerSwitcher__visible img{opacity:1}.og-layerSwitcher__layerButton img{border-radius:5px;height:100%;left:0;opacity:1;position:absolute;top:0;width:100%}.og-layerSwitcher__layerButton img:hover{opacity:1}.og-layerSwitcher__name{background-color:rgba(0,0,0,.5);border-bottom-left-radius:5px;border-bottom-right-radius:5px;bottom:0;color:var(--grey8);font-size:12px;max-height:25px;overflow:hidden;padding:3px;position:absolute;text-overflow:ellipsis;width:calc(100% - 6px)}.displayNone{display:none}.displayBlock{display:block}.og-drawing-default_button{right:166px;top:12px}.og-drawing-default_button .og-button-icon{transform:scale(.73)}.og-drawing-polygon_button{right:115px;top:12px}.og-drawing-linestring_button{right:66px;top:12px}.og-ruler_button{right:12px;top:65px}.ogConsole{background-color:hsla(0,0%,51%,.49);color:#fff;font-family:Arial;font-size:14px;left:0;max-height:70%;overflow:auto;pointer-events:none;position:absolute;top:0;width:100%;z-index:100000000}.ogConsole-text{overflow:hidden;padding:7px}.ogConsole-error{color:red}.ogConsole-warning{color:#ff0}.ogViewExtentBtn{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYEAQAAAAa7ikwAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAABgAAAAYADwa0LPAAAAB3RJTUUH5ggMBTM4rM25AwAAAAJiS0dEAACqjSMyAAABsUlEQVRIx81WWYrCQBAVg4Iwbp8ud5DoYRRBxPMoouiPegQVPYp6Azdc/ly++01XKkmPksQ4ZmAKAr3V0u9VVScU8ikQkQhwuRifHIeCFiAWgy2xWHCGRSIBVKtAt6scdDrGmtz7IOJUyjAk7ne4Ce2JdhsimXzTeKkE7PfK0vEIjMdqTuPTSc23W6BY9G/cjvpwgKjVmOBHDnitXmfnJLcboOs+YNntWGGxADIZtRcOQ4xGEMMhjdV6Ngssl6yz2XjywuSZkf8w/vrW5MS8iWi13LPFgkbC8n5SEFwmVOLry+EApaJJ6C8KCSIaVcRXKk8FlE4D/T5vzmY81zT/0Wsa68znbKPX47ksSC5/JxkM/EdPxDvJ5RKMA3nWw8EfQxQsyecz2yiXvdNUptz7adposO716pim7EQ2Lrv3ZLP+o8/n7RQVzabHwWSSGxcJlb9y4t4qcjlgtWKd9RoiHn9x1WKRG5d1E1mhBr7PzY7WCBaruAiaQsEnnrpuNC5biLzJRL0D06ki1Ircp/FH0lstdRsnoaibzZeweDuKx6m3qE5rPZnlsmu2/KtH/9Pflm+sYR/yIsaCAQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOC0xMlQwNTo1MTo1NiswMDowMIPhE+YAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDgtMTJUMDU6NTE6NTYrMDA6MDDyvKtaAAAAKHRFWHRkYXRlOnRpbWVzdGFtcAAyMDIyLTA4LTEyVDA1OjUxOjU2KzAwOjAwpamKhQAAAABJRU5ErkJggg==) 50% no-repeat;cursor:pointer;height:24px;margin-left:12px;scale:70%;width:24px}.ogViewExtentBtn:hover{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYEAQAAAAa7ikwAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAABgAAAAYADwa0LPAAAAB3RJTUUH5ggMBTM4rM25AwAAAAJiS0dEAACqjSMyAAABsUlEQVRIx81WWYrCQBAVg4Iwbp8ud5DoYRRBxPMoouiPegQVPYp6Azdc/ly++01XKkmPksQ4ZmAKAr3V0u9VVScU8ikQkQhwuRifHIeCFiAWgy2xWHCGRSIBVKtAt6scdDrGmtz7IOJUyjAk7ne4Ce2JdhsimXzTeKkE7PfK0vEIjMdqTuPTSc23W6BY9G/cjvpwgKjVmOBHDnitXmfnJLcboOs+YNntWGGxADIZtRcOQ4xGEMMhjdV6Ngssl6yz2XjywuSZkf8w/vrW5MS8iWi13LPFgkbC8n5SEFwmVOLry+EApaJJ6C8KCSIaVcRXKk8FlE4D/T5vzmY81zT/0Wsa68znbKPX47ksSC5/JxkM/EdPxDvJ5RKMA3nWw8EfQxQsyecz2yiXvdNUptz7adposO716pim7EQ2Lrv3ZLP+o8/n7RQVzabHwWSSGxcJlb9y4t4qcjlgtWKd9RoiHn9x1WKRG5d1E1mhBr7PzY7WCBaruAiaQsEnnrpuNC5biLzJRL0D06ki1Ircp/FH0lstdRsnoaibzZeweDuKx6m3qE5rPZnlsmu2/KtH/9Pflm+sYR/yIsaCAQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOC0xMlQwNTo1MTo1NiswMDowMIPhE+YAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDgtMTJUMDU6NTE6NTYrMDA6MDDyvKtaAAAAKHRFWHRkYXRlOnRpbWVzdGFtcAAyMDIyLTA4LTEyVDA1OjUxOjU2KzAwOjAwpamKhQAAAABJRU5ErkJggg==) 50% no-repeat,var(--blue0);border-radius:10px}.og-debuginfo_button{left:10px;position:absolute;top:120px}.og-debuginfo_controls{display:flex;padding-bottom:8px}.og-debuginfo_controls-button{float:left;height:25px;margin:3px;width:25px}.og-debug-info{color:#fff;font-size:12px;padding:10px}.og-debug-info .og-watch-line{display:flex;flex-direction:row;padding-bottom:5px;width:100%}.og-watch-line .og-watch-label{color:#cecece;width:200px}.og-watch-line .og-watch-value{margin-left:15px}.og-popup{bottom:-2px;position:absolute;text-align:center}.og-popup-content-wrapper,.og-popup-tip{background:#fff;box-shadow:0 3px 14px rgba(0,0,0,.4);color:#333}.og-popup-content-wrapper{border-radius:8px;min-height:17px;min-width:30px;padding:1px;text-align:left}.og-popup-content{line-height:1.4;margin:20px 5px 5px}.og-popup-tip-container{bottom:-19px;height:20px;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none;position:absolute;width:40px}.og-popup-tip{height:17px;margin:-10px auto 0;padding:1px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:17px}.og-popup-toolbar{display:inline-block;position:absolute;right:2px;top:3px}.og-popup-btn{cursor:pointer;float:right;height:15px;width:15px}.og-popup-btn:hover{color:#2e9be7}.og-popup-title{font-size:14px;left:5px;position:absolute;top:3px}.og-scale-container{bottom:30px;position:absolute;right:320px}.og-scale-label{color:#fff;font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:12px;position:relative;text-align:center}.og-scale-ruler{border-bottom:2px solid #fff;border-left:1px solid #fff;border-right:1px solid #fff;height:7px;position:relative}.og-compass-button{bottom:153px;right:12px}.og-compass-button svg{height:40px!important;width:40px!important}.og-suncontrol-button{float:left;height:25px;margin:3px;width:25px}.og-lighting_button{left:10px;position:absolute;top:65px}.og-lighing{color:#b6b6b6;height:calc(100% - 30px);padding:12px;position:relative}.og-lighing .og-layers{align-items:center;display:flex;flex-direction:row}.og-lighing .og-caption{position:relative}.og-emptyline,.og-lighing .og-lighting-emptyline{padding:3px;width:100%}.og-emptyline-2{padding:5px;width:100%}.og-lighing .og-slider{width:100%}.og-lighing .og-color-label,.og-lighing .og-slider .og-slider-label{font-size:12px;width:100px}.og-lighing .og-color{padding-right:10px}.og-lighing #layers{font-family:monospace;margin-left:21px;padding:2px;width:200px}.og-coordinates{background-color:var(--grey5);border-radius:4px;bottom:25px;color:var(--grey8);cursor:pointer;float:left;font-family:monospace;font-size:1em;overflow:hidden;padding:5px;position:absolute;right:12px;text-align:right}.og-coordinates div{float:left}.og-lat-side,.og-lon-side{padding-right:3px;width:10px}.og-lat-val,.og-lon-val{overflow:hidden;padding-right:3px;text-align:left;text-overflow:unset;width:90px}.og-height{overflow:hidden;padding-left:3px;text-align:right;text-overflow:ellipsis;width:50px}.og-units-height{padding-left:3px;text-align:left;width:15px}.og-center-icon{bottom:50%;height:12px;margin-bottom:-3.5px;margin-right:-7.5px;pointer-events:none;position:absolute;right:50%;width:12px}.og-atmosphere_button{left:10px;position:absolute;top:230px}.og-atmosphere.og-options-container .og-slider-label{height:20px;overflow:hidden;width:300px}.og-atmosphere.og-options-container .og-slider input{width:87px}.og-timeline_button{left:10px;position:absolute;top:10px}.og-timeline-control_button{background:var(--grey7);border-radius:1px;height:20px;margin-left:3px;margin-right:3px;width:25px}.og-button svg,.og-button svg path{height:24px;width:24px}.og-timeline-control_button.og-button__active{background:var(--grey3)}.og-timeline{background:#2d2d2d;bottom:0;height:100%;left:0;overflow:hidden;position:relative;width:100%}.og-timeline-frame{height:30px;margin:0 0 0 10px;position:relative;width:calc(100% - 20px)}.og-timeline-scale{height:100%;overflow:hidden;width:100%}.og-timeline-current{cursor:pointer;height:100%;left:0;margin-left:-5px;margin-top:-7px;position:absolute;width:11px}.og-timeline-current-spin{background-color:#ff3434;height:100%;margin:0 auto;pointer-events:none;width:1px}.og-timeline-current-arrow{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ff3434;height:0;margin-left:-6px;width:0}.og-timeline-bottom{margin-top:3px;width:100%}.og-timeline-bottom,.og-timeline-controls{display:flex;justify-content:center;position:relative}.og-timeline-controls{align-items:center;border-radius:10px;flex-direction:row;padding:8px}.og-timeline-unselectable{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.og-timeline-top{display:block;height:15px;width:100%}.og-slider{display:flex;flex-direction:row;width:200px}.og-slider .og-slider-label{align-items:center;color:var(--grey6);display:flex;font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:14px;height:100%;margin-right:5px;text-align:left;width:100%}.og-slider .og-slider-panel{background-color:var(--grey1);height:20px;position:relative;width:100%;z-index:1}.og-slider .og-slider-panel .og-slider-progress{background-color:var(--grey7);height:100%;pointer-events:none;position:absolute}.og-slider .og-slider-panel .og-slider-pointer{background-color:var(--grey3);height:100%;left:0;pointer-events:none;position:absolute;top:0;width:3px}.og-slider input{background:var(--grey5);border:1px solid var(--grey1);color:var(--grey3);height:100%;padding-left:5px;position:relative;width:100%;width:60px;z-index:0}.og-slider input:focus-visible{outline:none}.og-slider input::-webkit-inner-spin-button,.og-slider input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.og-slider input[type=number]{-moz-appearance:textfield}.og-selection_button{right:12px;top:117px}.og-geoimagegrag_button{right:12px;top:169px}.og-elevationprofile{height:100%;overflow:hidden;position:absolute;width:100%}.og-elevationprofile__container{align-content:center;align-items:center;display:flex;flex-direction:column;height:100%;position:relative;width:100%}.og-elevationprofile__menu{height:43px;position:relative;width:100%}.og-elevationprofile__graph{height:100%;position:relative;width:100%}.og-elevationprofile_button{left:10px;top:175px}.og-elevationprofile-legend{color:var(--grey8);display:flex;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-size:12px;margin:5px;position:absolute;right:0;top:0;z-index:1}.og-elevationprofile-legend__row{padding:5px;position:relative;width:70px}.og-elevationprofile-square{float:left;height:6px;margin:5px;position:relative;width:6px}.og-elevationprofile-legend__track .og-elevationprofile-square{background-color:#00ff32}.og-elevationprofile-legend__ground .og-elevationprofile-square{background-color:#c6c6c6}.og-elevationprofile-legend__warning .og-elevationprofile-square{background-color:#ff0}.og-elevationprofile-legend__collision .og-elevationprofile-square{background-color:red}.og-elevationprofile-units{display:inline-block;float:left;padding-left:5px;position:relative}.og-elevationprofile-value{display:inline-block;float:left;overflow:hidden;position:relative;text-align:right;text-overflow:ellipsis;white-space:nowrap;width:30px}.og-elevationprofile-buttons{display:inline-block;left:0;position:absolute;top:0}.og-elevationprofile-button{float:left;height:25px;margin:3px;width:25px}.og-elevationprofile-list{display:flex;flex-direction:column;height:100%;position:relative;width:100%}.og-elevationprofile-list textarea{background:var(--grey8);height:100%;padding:5px;position:relative;resize:none;width:100%}.og-elevationprofile-list-buttons{align-items:center;display:flex;flex-direction:row;height:60px;justify-content:right;position:relative}.og-elevationprofile-list-apply{background-color:var(--grey2);float:right;margin-right:15px;padding:4px 10px 7px}.og-elevationprofile_pointer{height:100%;left:0;position:absolute;top:0}.og-elevationprofile-line{background-color:#fff;height:30px;margin-left:-1.5px;position:absolute;width:3px}.og-elevationprofile-label{color:#fff;left:0;position:absolute;top:0}.og-elevationprofile-button__location svg{height:17px;width:17px}.og-elevationprofile-loading{align-items:center;background-color:#000;display:flex;flex-direction:row;height:100%;justify-content:center;opacity:.3;position:absolute;width:100%;z-index:2}.og-simpleskybackground{display:flex}.og-color-label{color:var(--grey6);font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:14px}@keyframes ldio-p0v5a1f6oz{0%{opacity:1}50%{opacity:.5}to{opacity:1}}.ldio-p0v5a1f6oz div{animation:ldio-p0v5a1f6oz .9345794392523364s cubic-bezier(.5,0,.5,1) infinite;height:40px;position:absolute;top:30px;width:11px}.ldio-p0v5a1f6oz div:first-child{animation-delay:-.5607476635514018s;background:#353535;transform:translate(14.5px)}.ldio-p0v5a1f6oz div:nth-child(2){animation-delay:-.37383177570093457s;background:#666;transform:translate(34.5px)}.ldio-p0v5a1f6oz div:nth-child(3){animation-delay:-.18691588785046728s;background:#9b9b9b;transform:translate(54.5px)}.ldio-p0v5a1f6oz div:nth-child(4){animation-delay:-.9345794392523364s;background:#d4d4d4;transform:translate(74.5px)}.loadingio-spinner-bars-r354qqyl5v{background:none;display:inline-block;height:88px;overflow:hidden;width:88px}.ldio-p0v5a1f6oz{backface-visibility:hidden;height:100%;position:relative;transform:translateZ(0) scale(.88);transform-origin:0 0;width:100%}.ldio-p0v5a1f6oz div{box-sizing:content-box}