@openglobus/og 0.22.2 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/css/og.css +137 -1
  2. package/lib/@openglobus/js/Object3d.d.ts +20 -10
  3. package/lib/@openglobus/js/camera/Camera.d.ts +9 -0
  4. package/lib/@openglobus/js/camera/Frustum.d.ts +3 -0
  5. package/lib/@openglobus/js/control/CameraLock.d.ts +38 -0
  6. package/lib/@openglobus/js/control/SimpleNavigation.d.ts +27 -10
  7. package/lib/@openglobus/js/control/geoObjectEditor/ArrowEntity.d.ts +15 -0
  8. package/lib/@openglobus/js/control/geoObjectEditor/AxisTrackEntity.d.ts +9 -0
  9. package/lib/@openglobus/js/control/geoObjectEditor/GeoObjectEditor.d.ts +13 -0
  10. package/lib/@openglobus/js/control/geoObjectEditor/GeoObjectEditorDialog.d.ts +69 -0
  11. package/lib/@openglobus/js/control/geoObjectEditor/GeoObjectEditorScene.d.ts +78 -9
  12. package/lib/@openglobus/js/control/geoObjectEditor/MoveAxisEntity.d.ts +17 -0
  13. package/lib/@openglobus/js/control/geoObjectEditor/MovePlaneEntity.d.ts +7 -0
  14. package/lib/@openglobus/js/control/geoObjectEditor/RotateEntity.d.ts +9 -0
  15. package/lib/@openglobus/js/control/geoObjectEditor/colors.d.ts +8 -0
  16. package/lib/@openglobus/js/control/index.d.ts +2 -0
  17. package/lib/@openglobus/js/entity/Entity.d.ts +278 -19
  18. package/lib/@openglobus/js/entity/EntityCollection.d.ts +8 -9
  19. package/lib/@openglobus/js/entity/GeoObject.d.ts +141 -36
  20. package/lib/@openglobus/js/entity/GeoObjectHandler.d.ts +39 -63
  21. package/lib/@openglobus/js/entity/InstanceData.d.ts +76 -0
  22. package/lib/@openglobus/js/entity/Polyline.d.ts +19 -6
  23. package/lib/@openglobus/js/entity/PolylineHandler.d.ts +7 -0
  24. package/lib/@openglobus/js/index.d.ts +2 -1
  25. package/lib/@openglobus/js/layer/Vector.d.ts +4 -0
  26. package/lib/@openglobus/js/light/LightSource.d.ts +1 -139
  27. package/lib/@openglobus/js/math/Quat.d.ts +46 -33
  28. package/lib/@openglobus/js/math/Ray.d.ts +10 -4
  29. package/lib/@openglobus/js/math/Vec3.d.ts +15 -0
  30. package/lib/@openglobus/js/math.d.ts +2 -2
  31. package/lib/@openglobus/js/quadTree/EntityCollectionNode.d.ts +2 -2
  32. package/lib/@openglobus/js/quadTree/Node.d.ts +1 -1
  33. package/lib/@openglobus/js/quadTree/earth/EarthEntityCollectionNodeLonLat.d.ts +1 -1
  34. package/lib/@openglobus/js/quadTree/equi/EquiEntityCollectionNodeLonLat.d.ts +1 -1
  35. package/lib/@openglobus/js/renderer/Renderer.d.ts +63 -44
  36. package/lib/@openglobus/js/renderer/RendererEvents.d.ts +1 -0
  37. package/lib/@openglobus/js/scene/Planet.d.ts +11 -7
  38. package/lib/@openglobus/js/scene/RenderNode.d.ts +10 -25
  39. package/lib/@openglobus/js/shaders/drawnode.d.ts +1 -0
  40. package/lib/@openglobus/js/shaders/geoObject.d.ts +1 -0
  41. package/lib/@openglobus/js/shaders/utils.d.ts +1 -1
  42. package/lib/@openglobus/js/ui/Checkbox.d.ts +31 -0
  43. package/lib/@openglobus/js/ui/Dialog.d.ts +3 -0
  44. package/lib/@openglobus/js/ui/Input.d.ts +32 -0
  45. package/lib/@openglobus/js/ui/View.d.ts +3 -1
  46. package/lib/@openglobus/js/utils/objParser.d.ts +44 -12
  47. package/lib/@openglobus/js/utils/shared.d.ts +22 -0
  48. package/lib/@openglobus/js/webgl/BaseFramebuffer.d.ts +0 -1
  49. package/lib/@openglobus/js/webgl/Framebuffer.d.ts +35 -8
  50. package/lib/@openglobus/js/webgl/Handler.d.ts +1 -0
  51. package/lib/@openglobus/og.css +1 -1
  52. package/lib/@openglobus/og.esm.js +1 -1
  53. package/lib/@openglobus/og.esm.js.map +1 -1
  54. package/lib/@openglobus/og.umd.js +1 -1
  55. package/lib/@openglobus/og.umd.js.map +1 -1
  56. package/lib/js/Object3d.d.ts +20 -10
  57. package/lib/js/Object3d.js +124 -48
  58. package/lib/js/camera/Camera.d.ts +9 -0
  59. package/lib/js/camera/Camera.js +27 -1
  60. package/lib/js/camera/Frustum.d.ts +3 -0
  61. package/lib/js/camera/Frustum.js +7 -0
  62. package/lib/js/control/Atmosphere.js +10 -6
  63. package/lib/js/control/CameraLock.d.ts +38 -0
  64. package/lib/js/control/CameraLock.js +216 -0
  65. package/lib/js/control/Control.js +1 -1
  66. package/lib/js/control/DebugInfo.js +13 -3
  67. package/lib/js/control/KeyboardNavigation.js +1 -1
  68. package/lib/js/control/ScaleControl.js +9 -3
  69. package/lib/js/control/SimpleNavigation.d.ts +27 -10
  70. package/lib/js/control/SimpleNavigation.js +148 -49
  71. package/lib/js/control/Sun.js +1 -1
  72. package/lib/js/control/elevationProfile/ElevationProfileScene.js +4 -4
  73. package/lib/js/control/geoObjectEditor/ArrowEntity.d.ts +15 -0
  74. package/lib/js/control/geoObjectEditor/ArrowEntity.js +59 -0
  75. package/lib/js/control/geoObjectEditor/AxisTrackEntity.d.ts +9 -0
  76. package/lib/js/control/geoObjectEditor/AxisTrackEntity.js +93 -0
  77. package/lib/js/control/geoObjectEditor/GeoObjectEditor.d.ts +13 -0
  78. package/lib/js/control/geoObjectEditor/GeoObjectEditor.js +30 -0
  79. package/lib/js/control/geoObjectEditor/GeoObjectEditorDialog.d.ts +69 -0
  80. package/lib/js/control/geoObjectEditor/GeoObjectEditorDialog.js +502 -0
  81. package/lib/js/control/geoObjectEditor/GeoObjectEditorScene.d.ts +78 -9
  82. package/lib/js/control/geoObjectEditor/GeoObjectEditorScene.js +487 -43
  83. package/lib/js/control/geoObjectEditor/MoveAxisEntity.d.ts +17 -0
  84. package/lib/js/control/geoObjectEditor/MoveAxisEntity.js +106 -0
  85. package/lib/js/control/geoObjectEditor/MovePlaneEntity.d.ts +7 -0
  86. package/lib/js/control/geoObjectEditor/MovePlaneEntity.js +34 -0
  87. package/lib/js/control/geoObjectEditor/RotateEntity.d.ts +9 -0
  88. package/lib/js/control/geoObjectEditor/RotateEntity.js +105 -0
  89. package/lib/js/control/geoObjectEditor/colors.d.ts +8 -0
  90. package/lib/js/control/geoObjectEditor/colors.js +8 -0
  91. package/lib/js/control/index.d.ts +2 -0
  92. package/lib/js/control/index.js +2 -0
  93. package/lib/js/control/timeline/TimelineControl.js +2 -0
  94. package/lib/js/entity/Entity.d.ts +278 -19
  95. package/lib/js/entity/Entity.js +483 -63
  96. package/lib/js/entity/EntityCollection.d.ts +8 -9
  97. package/lib/js/entity/EntityCollection.js +48 -45
  98. package/lib/js/entity/GeoObject.d.ts +141 -36
  99. package/lib/js/entity/GeoObject.js +153 -90
  100. package/lib/js/entity/GeoObjectHandler.d.ts +39 -63
  101. package/lib/js/entity/GeoObjectHandler.js +198 -295
  102. package/lib/js/entity/InstanceData.d.ts +76 -0
  103. package/lib/js/entity/InstanceData.js +344 -0
  104. package/lib/js/entity/Polyline.d.ts +19 -6
  105. package/lib/js/entity/Polyline.js +76 -36
  106. package/lib/js/entity/PolylineHandler.d.ts +7 -0
  107. package/lib/js/entity/PolylineHandler.js +26 -1
  108. package/lib/js/index.d.ts +2 -1
  109. package/lib/js/index.js +2 -1
  110. package/lib/js/layer/Bing.js +2 -2
  111. package/lib/js/layer/Vector.d.ts +4 -0
  112. package/lib/js/layer/Vector.js +16 -0
  113. package/lib/js/light/LightSource.d.ts +1 -139
  114. package/lib/js/light/LightSource.js +21 -227
  115. package/lib/js/math/Quat.d.ts +46 -33
  116. package/lib/js/math/Quat.js +91 -90
  117. package/lib/js/math/Ray.d.ts +10 -4
  118. package/lib/js/math/Ray.js +20 -4
  119. package/lib/js/math/Vec3.d.ts +15 -0
  120. package/lib/js/math/Vec3.js +30 -1
  121. package/lib/js/math.d.ts +2 -2
  122. package/lib/js/math.js +3 -3
  123. package/lib/js/quadTree/EntityCollectionNode.d.ts +2 -2
  124. package/lib/js/quadTree/EntityCollectionNode.js +8 -8
  125. package/lib/js/quadTree/Node.d.ts +1 -1
  126. package/lib/js/quadTree/Node.js +2 -2
  127. package/lib/js/quadTree/QuadTreeStrategy.js +1 -1
  128. package/lib/js/quadTree/earth/EarthEntityCollectionNodeLonLat.d.ts +1 -1
  129. package/lib/js/quadTree/earth/EarthEntityCollectionNodeLonLat.js +2 -2
  130. package/lib/js/quadTree/equi/EquiEntityCollectionNodeLonLat.d.ts +1 -1
  131. package/lib/js/quadTree/equi/EquiEntityCollectionNodeLonLat.js +2 -2
  132. package/lib/js/renderer/Renderer.d.ts +63 -44
  133. package/lib/js/renderer/Renderer.js +260 -263
  134. package/lib/js/renderer/RendererEvents.d.ts +1 -0
  135. package/lib/js/renderer/RendererEvents.js +2 -1
  136. package/lib/js/scene/Planet.d.ts +11 -7
  137. package/lib/js/scene/Planet.js +109 -87
  138. package/lib/js/scene/RenderNode.d.ts +10 -25
  139. package/lib/js/scene/RenderNode.js +70 -58
  140. package/lib/js/shaders/depth.js +2 -5
  141. package/lib/js/shaders/drawnode.d.ts +1 -0
  142. package/lib/js/shaders/drawnode.js +51 -52
  143. package/lib/js/shaders/geoObject.d.ts +1 -0
  144. package/lib/js/shaders/geoObject.js +154 -91
  145. package/lib/js/shaders/polyline.js +68 -51
  146. package/lib/js/shaders/utils.d.ts +1 -1
  147. package/lib/js/shaders/utils.js +11 -0
  148. package/lib/js/ui/Checkbox.d.ts +31 -0
  149. package/lib/js/ui/Checkbox.js +110 -0
  150. package/lib/js/ui/Color.js +2 -1
  151. package/lib/js/ui/Dialog.d.ts +3 -0
  152. package/lib/js/ui/Dialog.js +20 -0
  153. package/lib/js/ui/Input.d.ts +32 -0
  154. package/lib/js/ui/Input.js +107 -0
  155. package/lib/js/ui/View.d.ts +3 -1
  156. package/lib/js/ui/View.js +6 -0
  157. package/lib/js/utils/objParser.d.ts +44 -12
  158. package/lib/js/utils/objParser.js +241 -149
  159. package/lib/js/utils/shared.d.ts +22 -0
  160. package/lib/js/utils/shared.js +34 -0
  161. package/lib/js/webgl/BaseFramebuffer.d.ts +0 -1
  162. package/lib/js/webgl/Framebuffer.d.ts +35 -8
  163. package/lib/js/webgl/Framebuffer.js +136 -29
  164. package/lib/js/webgl/Handler.d.ts +1 -0
  165. package/lib/js/webgl/Handler.js +11 -1
  166. package/lib/js/webgl/Program.js +0 -8
  167. package/package.json +4 -2
@@ -20,8 +20,10 @@ import { Quat } from "../math/Quat";
20
20
  import { QuadTreeStrategy } from "../quadTree/QuadTreeStrategy";
21
21
  import { Ray } from "../math/Ray";
22
22
  import { RenderNode } from "./RenderNode";
23
+ import { Sun } from "../control/Sun";
23
24
  import { TerrainWorker } from "../utils/TerrainWorker";
24
25
  import { Vec2, Vec3, NumberArray2, NumberArray3, NumberArray4 } from "../math/index";
26
+ import { Vector } from "../layer/Vector";
25
27
  import { VectorTileCreator } from "../utils/VectorTileCreator";
26
28
  import { WebGLBufferExt, WebGLTextureExt, IDefaultTextureParams } from "../webgl/Handler";
27
29
  import { Program } from "../webgl/Program";
@@ -122,14 +124,15 @@ export declare class Planet extends RenderNode {
122
124
  * @protected
123
125
  * @type {Array.<Layer>}
124
126
  */
125
- protected visibleVectorLayers: Layer[];
127
+ protected visibleVectorLayers: Vector[];
128
+ protected _visibleVectorLayersByDepthOrder: Vector[][];
126
129
  protected _visibleTileLayerSlices: Layer[][];
127
130
  /**
128
131
  * Vector layers visible nodes with collections.
129
132
  * @protected
130
- * @type {Array.<EntityCollection>}
133
+ * @type {EntityCollection[][]}
131
134
  */
132
- protected _frustumEntityCollections: EntityCollection[];
135
+ protected _visibleEntityCollections: EntityCollection[][];
133
136
  /**
134
137
  * There is only one base layer on the globe when layer.isBaseLayer is true.
135
138
  * @public
@@ -184,6 +187,7 @@ export declare class Planet extends RenderNode {
184
187
  _renderedNodesInFrustum: Node[][];
185
188
  _fadingNodes: Map<number, Node>;
186
189
  _fadingNodesInFrustum: Node[][];
190
+ protected _fadingOpaqueSegments: Segment[];
187
191
  /**
188
192
  * Layers activity lock.
189
193
  * @public
@@ -308,6 +312,7 @@ export declare class Planet extends RenderNode {
308
312
  get terrainReady(): boolean;
309
313
  get maxGridSize(): number;
310
314
  getNorthFrameRotation(cartesian: Vec3): Quat;
315
+ getFrameRotation(cartesian: Vec3): Quat;
311
316
  set atmosphereMaxOpacity(opacity: number);
312
317
  get atmosphereMaxOpacity(): number;
313
318
  set atmosphereMinOpacity(opacity: number);
@@ -327,6 +332,7 @@ export declare class Planet extends RenderNode {
327
332
  * @public
328
333
  */
329
334
  getLayers(): Layer[];
335
+ get sun(): Sun | undefined;
330
336
  get sunPos(): Vec3;
331
337
  /**
332
338
  * Add the given control to the renderer of the planet scene.
@@ -466,18 +472,16 @@ export declare class Planet extends RenderNode {
466
472
  unlockQuadTree(): void;
467
473
  protected _setUniformsNoAtmos(cam: PlanetCamera): Program;
468
474
  protected _setUniformsAtmos(cam: PlanetCamera): Program;
469
- protected _renderingFadingNodes: (nodes: Map<number, boolean>, sh: Program, currentNode: Node, sl: Layer[], sliceIndex: number, outTransparentSegments?: Segment[]) => void;
470
- protected _renderingFadingNodesNoDepth: (nodes: Map<number, boolean>, sh: Program, currentNode: Node, sl: Layer[], sliceIndex: number) => void;
475
+ protected _renderingFadingNodes: (nodes: Map<number, boolean>, sh: Program, currentNode: Node, sl: Layer[], sliceIndex: number, outTransparentSegments?: Segment[], outOpaqueSegments?: Segment[]) => void;
476
+ protected _renderingFadingNodesNoDepth: (nodes: Map<number, boolean>, sh: Program, currentNode: Node, sl: Layer[], sliceIndex: number, outOpaqueSegments?: Segment[]) => void;
471
477
  /**
472
478
  * Drawing nodes
473
479
  */
474
480
  protected _renderingScreenNodes(sh: Program, cam: PlanetCamera, renderedNodes: Node[]): void;
475
481
  protected _renderingScreenNodesWithHeight(sh: Program, cam: PlanetCamera, renderedNodes: Node[]): void;
476
- protected _renderDistanceFramebufferPASS(): void;
477
482
  protected _renderColorPickingFramebufferPASS(): void;
478
483
  protected _renderDepthFramebufferPASS(): void;
479
484
  protected _collectVectorLayerCollections(): void;
480
- protected _frustumEntityCollectionPickingCallback(): void;
481
485
  /**
482
486
  * Starts clear memory thread.
483
487
  * @public
@@ -2,6 +2,8 @@ import { BaseNode } from "./BaseNode";
2
2
  import { Renderer } from "../renderer/Renderer";
3
3
  import { LightSource } from "../light/LightSource";
4
4
  import { EntityCollection } from "../entity/EntityCollection";
5
+ import { Quat } from "../math/Quat";
6
+ import { Vec3 } from "../math/Vec3";
5
7
  /**
6
8
  * Render node is a logical part of a render mechanism. Represents scene rendering.
7
9
  * For example one scene node for rendering the Earth, another one for rendering the Moon, another node for rendering stars etc.
@@ -37,19 +39,19 @@ declare class RenderNode extends BaseNode {
37
39
  * @public
38
40
  * @type {Array.<LightSource>}
39
41
  */
40
- _lights: LightSource[];
41
- _lightsNames: string[];
42
- _lightsPositions: number[];
43
- _lightsParamsv: number[];
44
- _lightsParamsf: number[];
42
+ _lightPosition: Float32Array;
43
+ _lightParams: Float32Array;
44
+ _lightShininess: number;
45
45
  /**
46
46
  * Entity collection array.
47
47
  * @public
48
48
  * @type {Array.<EntityCollection>}
49
49
  */
50
50
  entityCollections: EntityCollection[];
51
+ protected _entityCollectionsByDepthOrder: EntityCollection[][];
51
52
  protected _pickingId: number;
52
53
  constructor(name?: string);
54
+ getFrameRotation(cartesian: Vec3): Quat;
53
55
  /**
54
56
  * Adds node to the current hierarchy.
55
57
  * @public
@@ -73,13 +75,14 @@ declare class RenderNode extends BaseNode {
73
75
  * @param {boolean} [isHidden] - If it's true that this collection has specific rendering.
74
76
  * @returns {RenderNode} -
75
77
  */
76
- addEntityCollection(entityCollection: EntityCollection, isHidden?: boolean): RenderNode;
78
+ addEntityCollection(entityCollection: EntityCollection, isHidden?: boolean): void;
77
79
  /**
78
80
  * Removes entity collection.
79
81
  * @public
80
82
  * @param {EntityCollection} entityCollection - Entity collection for remove.
81
83
  */
82
84
  removeEntityCollection(entityCollection: EntityCollection): void;
85
+ updateEntityCollectionsDepthOrder(): void;
83
86
  /**
84
87
  * Adds point light source.
85
88
  * @public
@@ -87,19 +90,6 @@ declare class RenderNode extends BaseNode {
87
90
  * @returns {RenderNode}
88
91
  */
89
92
  addLight(light: LightSource): RenderNode;
90
- /**
91
- * Gets light object by its name.
92
- * @public
93
- * @param {string} name - Point light name.
94
- * @returns {LightSource}
95
- */
96
- getLightByName(name: string): LightSource | undefined;
97
- /**
98
- * Removes light source.
99
- * @public
100
- * @param {LightSource} light - Light source object.
101
- */
102
- removeLight(light: LightSource): void;
103
93
  /**
104
94
  * Calls render frame node's callback. Used in renderer.
105
95
  * @public
@@ -128,17 +118,12 @@ declare class RenderNode extends BaseNode {
128
118
  * @param {Number} mode - Draw mode, such as gl.TRIANGLES, gl.TRIANGLE_STRIP, gl.LINES etc.
129
119
  */
130
120
  setDrawMode(mode: number): void;
131
- /**
132
- * IMPORTANT: This function have to be called manually in each render node frame callback, before drawing scene geometry.
133
- * @public
134
- */
135
- transformLights(): void;
136
121
  updateBillboardsTexCoords(): void;
137
122
  frame(): void;
138
123
  preFrame(): void;
139
124
  protected _preDrawNodes(): void;
140
125
  protected _drawNodes(): void;
141
- drawEntityCollections(ec: EntityCollection[]): void;
126
+ drawEntityCollections(ec: EntityCollection[], depthOrder?: number): void;
142
127
  /**
143
128
  * Draw entity collections picking frame.
144
129
  * @public
@@ -1,5 +1,6 @@
1
1
  import { AtmosphereParameters } from "./atmos";
2
2
  import { Program } from "../webgl/Program";
3
+ export declare const ENCODE24 = "vec3 encode24(highp float f) {\n float F = abs(f);\n float s = step( 0.0, -f );\n float e = floor( log2(F) );\n float m = exp2(- e) * F;\n e = floor( log2(F) + 127.0 ) + floor( log2(m) );\n return vec3(\n ( 128.0 * s + floor( e * exp2(-1.0) ) ) / 255.0,\n ( 128.0 * mod( e, 2.0 ) + mod( floor( m * 128.0 ), 128.0 ) ) / 255.0,\n floor( mod( floor( m * exp2( 23.0 - 8.0) ), exp2(8.0) ) ) / 255.0);\n }";
3
4
  export declare function drawnode_screen_nl(): Program;
4
5
  export declare function drawnode_screen_wl_webgl1NoAtmos(): Program;
5
6
  export declare function drawnode_screen_wl_webgl2NoAtmos(): Program;
@@ -1,3 +1,4 @@
1
1
  import { Program } from "../webgl/Program";
2
2
  export declare const geo_object: () => Program;
3
3
  export declare const geo_object_picking: () => Program;
4
+ export declare const geo_object_depth: () => Program;
@@ -1 +1 @@
1
- export declare const UTILS = "\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";
1
+ export declare const UTILS = "\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 float intersectSphere( vec3 ro, vec3 rd, vec4 sph )\n {\n vec3 oc = ro - sph.xyz;\n float b = dot( oc, rd );\n float c = dot( oc, oc ) - sph.w*sph.w;\n float h = b*b - c;\n if( h<0.0 ) return -1.0;\n h = sqrt( h );\n return -b - h;\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";
@@ -0,0 +1,31 @@
1
+ import { EventsHandler } from "../Events";
2
+ import { IViewParams, View, ViewEventsList } from './View';
3
+ interface ICheckboxParams extends IViewParams {
4
+ label?: string;
5
+ checked?: boolean;
6
+ disabled?: boolean;
7
+ }
8
+ type CheckboxEventsList = ["change"];
9
+ declare class Checkbox extends View<null> {
10
+ events: EventsHandler<CheckboxEventsList> & EventsHandler<ViewEventsList>;
11
+ protected $label: HTMLElement | null;
12
+ protected $input: HTMLInputElement | null;
13
+ protected _checked: boolean;
14
+ protected _disabled: boolean;
15
+ constructor(options?: ICheckboxParams);
16
+ set disabled(disabled: boolean);
17
+ protected _updateDisabled(): void;
18
+ get disabled(): boolean;
19
+ render(params: any): this;
20
+ protected _onResize: () => void;
21
+ set checked(isChecked: boolean);
22
+ get checked(): boolean;
23
+ protected _initEvents(): void;
24
+ protected _clearEvents(): void;
25
+ protected _onMouseWheel: (e: WheelEvent) => void;
26
+ protected _onMouseWheelFF: (e: WheelEvent) => void;
27
+ protected _onClick: (e: Event) => void;
28
+ remove(): void;
29
+ set visibility(visibility: boolean);
30
+ }
31
+ export { Checkbox };
@@ -8,6 +8,7 @@ export interface IDialogParams extends IViewParams {
8
8
  width?: number;
9
9
  height?: number;
10
10
  left?: number;
11
+ right?: number;
11
12
  top?: number;
12
13
  minHeight?: number;
13
14
  maxHeight?: number;
@@ -28,6 +29,7 @@ declare class Dialog<M> extends View<M> {
28
29
  protected _startPosY: number;
29
30
  protected _closeBtn: Button;
30
31
  protected _visibility: boolean;
32
+ protected _right: number | null;
31
33
  constructor(options?: IDialogParams);
32
34
  setContainer(htmlStr: string): void;
33
35
  get container(): HTMLElement | null;
@@ -39,6 +41,7 @@ declare class Dialog<M> extends View<M> {
39
41
  hide(): void;
40
42
  close(): void;
41
43
  setVisibility(visibility: boolean): void;
44
+ getVisibility(): boolean;
42
45
  protected _initButtons(): void;
43
46
  protected _initEvents(): void;
44
47
  protected _onCloseBtnClick: () => void;
@@ -0,0 +1,32 @@
1
+ import { EventsHandler } from "../Events";
2
+ import { IViewParams, View, ViewEventsList } from './View';
3
+ interface IInputParams extends IViewParams {
4
+ label?: string;
5
+ value?: string;
6
+ min?: number;
7
+ max?: number;
8
+ type?: string;
9
+ maxFixed?: number;
10
+ }
11
+ type InputEventsList = ["change"];
12
+ declare class Input extends View<null> {
13
+ events: EventsHandler<InputEventsList> & EventsHandler<ViewEventsList>;
14
+ protected _value: string;
15
+ protected $label: HTMLElement | null;
16
+ protected $input: HTMLInputElement | null;
17
+ protected _maxFixed: number;
18
+ constructor(options?: IInputParams);
19
+ render(params: any): this;
20
+ protected _onResize: () => void;
21
+ set value(val: string | number);
22
+ protected _setValue(val: string | number): void;
23
+ get value(): string;
24
+ protected _initEvents(): void;
25
+ protected _clearEvents(): void;
26
+ protected _onMouseWheel: (e: WheelEvent) => void;
27
+ protected _onMouseWheelFF: (e: WheelEvent) => void;
28
+ protected _onInput: (e: Event) => void;
29
+ remove(): void;
30
+ set visibility(visibility: boolean);
31
+ }
32
+ export { Input };
@@ -1,4 +1,4 @@
1
- import { EventsHandler } from '../Events';
1
+ import { EventCallback, EventsHandler } from '../Events';
2
2
  export interface IViewParams {
3
3
  model?: any;
4
4
  template?: string;
@@ -16,6 +16,8 @@ declare class View<M> {
16
16
  el: HTMLElement | null;
17
17
  protected _classList: string[];
18
18
  constructor(options?: IViewParams);
19
+ on(name: string, callback: EventCallback, sender?: any, priority?: number): void;
20
+ off(name: string, callback: EventCallback): void;
19
21
  static getHTML(template: string, params: any): string;
20
22
  static parseHTML(htmlStr: string): HTMLElement[];
21
23
  static insertAfter(newNodes: HTMLElement | HTMLElement[], referenceNode: Node): HTMLElement[];
@@ -1,24 +1,56 @@
1
- interface IObjGeometryData {
1
+ import { NumberArray3 } from "../math/Vec3";
2
+ export interface IObjGeometryData {
2
3
  vertices: number[];
3
- textures: number[];
4
+ texCoords: number[];
4
5
  normals: number[];
5
6
  }
6
- interface IObjGeometry {
7
+ export interface IObjGeometry {
7
8
  object: string;
8
9
  groups: string[];
9
10
  material: string;
10
11
  data: IObjGeometryData;
11
12
  }
12
- interface IObjData {
13
- geometries: IObjGeometry[];
14
- materialLibs: string[];
13
+ export interface IObjMaterial {
14
+ ambient?: NumberArray3;
15
+ diffuse?: NumberArray3;
16
+ specular?: NumberArray3;
17
+ shininess?: number;
18
+ color?: NumberArray3;
19
+ opacity?: number;
20
+ illum?: number;
21
+ colorTexture?: string;
22
+ normalTexture?: string;
23
+ metallicRoughnessTexture?: string;
15
24
  }
16
- export declare function objParser(text: string): {
25
+ type MaterialMap = Record<string, IObjMaterial>;
26
+ export interface IObj {
17
27
  geometries: IObjGeometry[];
18
- materialLibs: string[];
19
- };
20
- export declare function transformLeftToRightCoordinateSystem(objData: IObjData): {
28
+ materials: MaterialMap;
29
+ }
30
+ export declare class Obj {
31
+ objPositions: number[][];
32
+ objTexcoords: number[][];
33
+ objNormals: number[][];
34
+ objVertexData: [number[][], number[][], number[][]];
35
+ vertexData: [number[], number[], number[]];
36
+ _materialLibs: string[];
21
37
  geometries: IObjGeometry[];
22
- materialLibs: string[];
23
- };
38
+ geometry: IObjGeometry | null;
39
+ materials: MaterialMap;
40
+ material: IObjMaterial;
41
+ object: string;
42
+ groups: string[];
43
+ keywords: Record<string, (parts: string[], unparsedArgs: string) => void>;
44
+ protected _path: string;
45
+ constructor();
46
+ newGeometry(): void;
47
+ setGeometry(): void;
48
+ addVertex(vert: string): void;
49
+ protected _innerParser(text: string, fileName: string): void;
50
+ get data(): IObj;
51
+ load(src: string): Promise<IObj>;
52
+ protected _readAndParse(file: File): Promise<void>;
53
+ readFile(objFile: File, mtlFile?: File): Promise<IObj>;
54
+ protected _cleanupGeometryArrays(): void;
55
+ }
24
56
  export {};
@@ -7,6 +7,7 @@ import { Vec2 } from "../math/Vec2";
7
7
  import { NumberArray2 } from "../math/Vec2";
8
8
  import { NumberArray3, Vec3 } from "../math/Vec3";
9
9
  import { NumberArray4, Vec4 } from "../math/Vec4";
10
+ import { Ellipsoid } from "../ellipsoid/Ellipsoid";
10
11
  export declare function getDefault(param?: any, def?: any): boolean;
11
12
  export declare function isEmpty(v: any): boolean;
12
13
  /**
@@ -261,3 +262,24 @@ export declare function isImageLoaded(image: HTMLImageElement): boolean;
261
262
  export declare function distanceFormat(v: number): string;
262
263
  export declare function distanceFormatExt(v: number): [string, string];
263
264
  export declare function getUrlParam(paramName: string): number | undefined;
265
+ /**
266
+ *
267
+ * @param x
268
+ * @param y
269
+ * @param z
270
+ * @param imageSize
271
+ * @param ellipsoid
272
+ *
273
+ * console.log(1, getTileImageResolution(0, 0, 1));
274
+ * console.log(7, getTileImageResolution(66, 44, 7));
275
+ * console.log(10, getTileImageResolution(536, 358, 10));
276
+ * console.log(12, getTileImageResolution(2149, 1446, 12));
277
+ * console.log(13, getTileImageResolution(4301, 2892, 13));
278
+ * console.log(14, getTileImageResolution(8582, 5736, 14));
279
+ * console.log(15, getTileImageResolution(17205, 11569, 15));
280
+ * console.log(16, getTileImageResolution(34419, 23138, 16));
281
+ * console.log(17, getTileImageResolution(68661, 45892, 17));
282
+ * console.log(18, getTileImageResolution(137650, 92555, 18));
283
+ */
284
+ export declare function getTileImageResolution(x: number, y: number, z: number, imageSize?: number, ellipsoid?: Ellipsoid): number[];
285
+ export declare function toFixedMax(value: number, maxFixed?: number): string;
@@ -1,6 +1,5 @@
1
1
  import { Handler } from "./Handler";
2
2
  export interface IBaseFramebufferParams {
3
- internalFormat?: string | string[];
4
3
  width?: number;
5
4
  height?: number;
6
5
  useDepth?: boolean;
@@ -1,13 +1,37 @@
1
1
  import { BaseFramebuffer, IBaseFramebufferParams } from "./BaseFramebuffer";
2
2
  import { Handler } from "./Handler";
3
+ import { TypedArray } from "../utils/shared";
4
+ export interface ITargetParams {
5
+ internalFormat?: string;
6
+ format?: string;
7
+ type?: string;
8
+ attachment?: string;
9
+ filter?: string;
10
+ readAsync?: boolean;
11
+ }
3
12
  export interface IFrameBufferParams extends IBaseFramebufferParams {
4
13
  isBare?: boolean;
5
- format?: string | string[];
6
- type?: string | string[];
7
- attachment?: string | string[];
8
14
  renderbufferTarget?: string;
9
15
  textures?: WebGLTexture[];
16
+ targets?: ITargetParams[];
17
+ }
18
+ type TypedArrayConstructor = Uint8ArrayConstructor | Float32ArrayConstructor;
19
+ interface ITarget {
20
+ internalFormat: string;
21
+ format: string;
22
+ type: string;
23
+ attachment: string;
24
+ filter: string;
25
+ pixelBufferIndex: number;
26
+ TypeArrayConstructor: TypedArrayConstructor;
27
+ }
28
+ interface IPixelBuffer {
29
+ buffer: WebGLBuffer | null;
30
+ data: TypedArray | null;
31
+ glType: number;
32
+ glAttachment: number;
10
33
  }
34
+ export declare function clientWaitAsync(gl: WebGL2RenderingContext, sync: WebGLSync, flags: number): Promise<void>;
11
35
  /**
12
36
  * Class represents framebuffer.
13
37
  * @class
@@ -15,19 +39,18 @@ export interface IFrameBufferParams extends IBaseFramebufferParams {
15
39
  * @param {IFrameBufferParams} [options] - Framebuffer options:
16
40
  */
17
41
  export declare class Framebuffer extends BaseFramebuffer {
18
- protected _isBare: boolean;
19
- protected _internalFormatArr: string[];
20
- protected _formatArr: string[];
21
- protected _typeArr: string[];
22
- protected _attachmentArr: string[];
23
42
  protected _renderbufferTarget: string;
43
+ protected _targets: ITarget[];
24
44
  /**
25
45
  * Framebuffer texture.
26
46
  * @public
27
47
  * @type {number}
28
48
  */
29
49
  textures: WebGLTexture[];
50
+ pixelBuffers: IPixelBuffer[];
51
+ protected _skipFrame: boolean;
30
52
  constructor(handler: Handler, options?: IFrameBufferParams);
53
+ static createTargets(targets?: ITargetParams[]): ITarget[];
31
54
  destroy(): void;
32
55
  /**
33
56
  * Framebuffer initialization.
@@ -35,6 +58,9 @@ export declare class Framebuffer extends BaseFramebuffer {
35
58
  * @override
36
59
  */
37
60
  init(): void;
61
+ readPixelBuffersAsync: () => void;
62
+ getPixelBufferData(targetIndex: number): TypedArray | null;
63
+ protected _createPixelBuffer(target: ITarget): void;
38
64
  /**
39
65
  * Bind buffer texture.
40
66
  * @public
@@ -67,3 +93,4 @@ export declare class Framebuffer extends BaseFramebuffer {
67
93
  */
68
94
  getImage(): HTMLImageElement;
69
95
  }
96
+ export {};
@@ -82,6 +82,7 @@ declare class Handler {
82
82
  * @type {number}
83
83
  */
84
84
  deltaTime: number;
85
+ prevDeltaTime: number;
85
86
  /**
86
87
  * WebGL rendering canvas element.
87
88
  * @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-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}
1
+ :root{--grey0:#2d2d2d;--grey1:#434244;--grey2:#3f3f46;--grey3:#bbb;--grey4:#5e5e5e;--grey5:#403b3b;--grey6:#bfbfbf;--grey7:#707070;--grey8:#e2e2e2;--grey9:#9f9f9f;--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;gap:5px;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);border-radius:5px;height:20px;position:relative;width:100%;z-index:1}.og-slider .og-slider-panel .og-slider-progress{background-color:var(--grey7);border-bottom-left-radius:5px;border-top-left-radius:5px;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);border-radius:5px;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-checkbox,.og-input{display:flex;flex-direction:row;margin:5px}.og-checkbox .og-input-label,.og-input .og-input-label{align-items:center;color:var(--grey6);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-checkbox input,.og-input input{background:var(--grey5);border:1px solid var(--grey1);border-radius:5px;color:var(--grey3);height:100%;padding-left:5px;position:relative;width:100%;z-index:0}.og-checkbox input:focus-visible,.og-input input:focus-visible{outline:none}.og-checkbox input[type=checkbox]{align-content:center;appearance:none;-webkit-appearance:none;background:var(--grey8);border:1px solid var(--grey1);border-radius:3px;cursor:pointer;display:flex;height:14px;justify-content:center;padding:0;position:relative;width:14px}.og-checkbox input[type=checkbox]:before{border:solid #000;border-width:0 2px 2px 0;content:"";height:6px;left:3.5px;opacity:0;position:absolute;top:2px;transform:rotate(45deg);transition:opacity .2s ease-in-out;width:3px}.og-checkbox input[type=checkbox]:checked:before{opacity:1}.og-checkbox input[type=checkbox]:hover{border-color:var(--grey2)}.og-checkbox .og-input-label{margin-right:0}.og-checkbox-input{width:100%}.og-input-disabled{opacity:.7;pointer-events:none}.og-input-disabled input[type=checkbox]{background:var(--grey9)}.og-input 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}.og-editor-ground_button{background:var(--grey1);margin-left:5px;margin-top:15px;padding:4px 6px 8px;width:fit-content}.og-editor_toolbar{display:flex;padding-bottom:8px}.og-editor_toolbar-button{float:left;height:25px;margin:3px;width:25px}