@openglobus/og 1.0.0-rc3 → 1.0.0-rc5

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 (39) hide show
  1. package/lib/camera/Camera.d.ts +17 -4
  2. package/lib/camera/PlanetCamera.d.ts +1 -0
  3. package/lib/control/CameraFrameComposer.d.ts +1 -1
  4. package/lib/control/FramebufferPreview.d.ts +16 -2
  5. package/lib/control/Navigation.d.ts +2 -1
  6. package/lib/control/cameraDepthHandler/CameraDepthHandler.d.ts +7 -0
  7. package/lib/entity/EntityCollection.d.ts +16 -2
  8. package/lib/entity/geoObject/GeoObjectHandler.d.ts +3 -0
  9. package/lib/index.d.ts +6 -2
  10. package/lib/layer/BaseTileMaterialLayer.d.ts +36 -0
  11. package/lib/layer/CanvasTiles.d.ts +8 -12
  12. package/lib/layer/Vector.d.ts +28 -7
  13. package/lib/layer/XYZ.d.ts +5 -21
  14. package/lib/og.css +1 -1
  15. package/lib/og.es.js +1 -1
  16. package/lib/og.es.js.map +1 -1
  17. package/lib/quadTree/EntityCollectionsTreeStrategy.d.ts +1 -0
  18. package/lib/quadTree/QuadTreeStrategy.d.ts +1 -0
  19. package/lib/quadTree/earth/EarthEntityCollectionsTreeStrategy.d.ts +1 -0
  20. package/lib/quadTree/equi/EquiEntityCollectionsTreeStrategy.d.ts +1 -0
  21. package/lib/renderer/PhongDeferredShading.d.ts +2 -0
  22. package/lib/renderer/Renderer.d.ts +4 -2
  23. package/lib/renderer/RendererEvents.d.ts +1 -0
  24. package/lib/renderer/projectors/Projector.d.ts +69 -0
  25. package/lib/renderer/projectors/ProjectorManager.d.ts +83 -0
  26. package/lib/renderer/projectors/ProjectorsPass.d.ts +37 -0
  27. package/lib/scene/Planet.d.ts +6 -3
  28. package/lib/scene/Scene.d.ts +1 -8
  29. package/lib/scene/SkyBox.d.ts +2 -1
  30. package/lib/shaders/geo_object/geo_object.d.ts +1 -0
  31. package/lib/shaders/projectorsPass/projectorsPass.d.ts +2 -0
  32. package/lib/terrain/MapterhornTerrain.d.ts +10 -0
  33. package/lib/terrain/RgbTerrain.d.ts +11 -0
  34. package/lib/terrain/index.d.ts +6 -2
  35. package/lib/tsconfig.tsbuildinfo +1 -1
  36. package/lib/webgl/BaseFramebuffer.d.ts +14 -0
  37. package/lib/webgl/Framebuffer.d.ts +5 -0
  38. package/lib/webgl/Handler.d.ts +13 -0
  39. package/package.json +1 -1
@@ -367,6 +367,12 @@ declare class Camera {
367
367
  * @param {number} angle - View angle
368
368
  */
369
369
  setViewAngle(angle: number): void;
370
+ /**
371
+ * Sets camera horizontal view angle in degrees.
372
+ * @public
373
+ * @param {number} angle - Horizontal view angle.
374
+ */
375
+ setHorizontalViewAngle(angle: number): void;
370
376
  /**
371
377
  * Returns camera vertical view angle in degrees.
372
378
  * @public
@@ -562,7 +568,7 @@ declare class Camera {
562
568
  */
563
569
  rotateAround(angle: number, isArc?: boolean, center?: Vec3, up?: Vec3): void;
564
570
  /**
565
- * Rotates camera around center point by horizontal.
571
+ * Rotates camera around the center point by horizontal.
566
572
  * @public
567
573
  * @param {number} angle - Rotation angle in radians.
568
574
  * @param {boolean} [isArc] - If true camera up vector gets from current up vector every frame,
@@ -572,14 +578,14 @@ declare class Camera {
572
578
  */
573
579
  rotateHorizontal(angle: number, isArc?: boolean, center?: Vec3, up?: Vec3): void;
574
580
  /**
575
- * Rotates camera around center point by vertical.
581
+ * Rotates camera around the center point by vertical.
576
582
  * @param {number} angle - Rotation angle in radians.
577
583
  * @param {Vec3} [center] - Point that the camera rotates around.
578
584
  */
579
585
  rotateVertical(angle: number, center?: Vec3): void;
580
586
  /**
581
587
  * Gets 3d size factor. Uses in LOD distance calculation.
582
- * It is very important function used in Node.ts
588
+ * It is a very important function used in Node.ts
583
589
  * @public
584
590
  * @param {Vec3} p - Point in 3d.
585
591
  * @param {Vec3} r - size.
@@ -611,12 +617,19 @@ declare class Camera {
611
617
  */
612
618
  getCurrentFrustum(): number;
613
619
  /**
614
- * Checks whether sphere intersects any camera frustum.
620
+ * Checks whether the sphere intersects any camera frustum.
615
621
  * @public
616
622
  * @param {Sphere} sphere - Bounding sphere.
617
623
  * @returns {boolean} `true` when visible in at least one frustum.
618
624
  */
619
625
  containsSphere(sphere: Sphere): boolean;
626
+ /**
627
+ * Checks whether a point is inside any camera frustum.
628
+ * @public
629
+ * @param {Vec3} point - Cartesian point.
630
+ * @returns {boolean} `true` when visible in at least one frustum.
631
+ */
632
+ containsPoint(point: Vec3): boolean;
620
633
  /**
621
634
  * Returns current active frustum.
622
635
  * @public
@@ -233,6 +233,7 @@ declare class PlanetCamera extends Camera {
233
233
  * @returns {Vec3 | undefined} Terrain point under camera when available.
234
234
  */
235
235
  checkTerrainCollision(): Vec3 | undefined;
236
+ protected _getInsideCollisionSegment(): Segment | null;
236
237
  /**
237
238
  * Returns visible surface arc distance from current altitude.
238
239
  * @public
@@ -15,5 +15,5 @@ export declare class CameraFrameComposer extends Control {
15
15
  oninit(): void;
16
16
  activate(): void;
17
17
  deactivate(): void;
18
- protected _onPostdraw: () => void;
18
+ protected _onDraw: () => void;
19
19
  }
@@ -4,6 +4,10 @@ import { Control, IControlParams } from "./Control";
4
4
  import { ShaderProgram } from "../webgl/ShaderProgram";
5
5
  export interface IFramebufferDialogParams extends IControlParams {
6
6
  framebuffer?: Framebuffer;
7
+ arrayTexture?: WebGLTexture;
8
+ arrayLayer?: number;
9
+ width?: number;
10
+ height?: number;
7
11
  title?: string;
8
12
  common?: string;
9
13
  image?: string;
@@ -11,15 +15,25 @@ export interface IFramebufferDialogParams extends IControlParams {
11
15
  }
12
16
  export declare class FramebufferPreview extends Control {
13
17
  protected _dialog: Dialog<null>;
14
- $canvas: HTMLCanvasElement;
15
18
  protected _framebuffer: Framebuffer | null;
19
+ protected _arrayTexture: WebGLTexture | null;
20
+ protected _arrayLayer: number;
21
+ protected _width: number;
22
+ protected _height: number;
23
+ protected _isArrayMode: boolean;
16
24
  protected _screenFramebuffer: Framebuffer | null;
17
- framebufferCurrentTexture: number;
18
25
  protected _program: ShaderProgram;
26
+ $canvas: HTMLCanvasElement;
27
+ framebufferCurrentTexture: number;
19
28
  constructor(params: IFramebufferDialogParams);
20
29
  bindFramebuffer(framebuffer: Framebuffer): void;
30
+ bindArrayTexture(texture: WebGLTexture, layer: number): void;
21
31
  oninit(): void;
22
32
  activate(): void;
23
33
  deactivate(): void;
34
+ protected _isDrawSubscribed: boolean;
35
+ protected _subscribeDraw(): void;
36
+ protected _unsubscribeDraw(): void;
37
+ protected _onDialogVisibilityChange: (isVisible: boolean) => void;
24
38
  protected _onDraw: () => void;
25
39
  }
@@ -67,6 +67,7 @@ export declare class Navigation extends Control {
67
67
  protected _grabbedSphere: Sphere;
68
68
  protected _wheelDirection: number;
69
69
  protected _currScreenPos: Vec2;
70
+ protected _grabbedScreenPoint: Vec2;
70
71
  protected _tUp: Vec3;
71
72
  protected _tRad: number;
72
73
  protected _shiftBusy: boolean;
@@ -89,7 +90,7 @@ export declare class Navigation extends Control {
89
90
  onremove(): void;
90
91
  onactivate(): void;
91
92
  ondeactivate(): void;
92
- protected onDraw(): void;
93
+ protected onPreDraw(): void;
93
94
  _onShiftFree: () => void;
94
95
  private _onCameraFly;
95
96
  protected _onMouseMove: (e: IMouseState) => void;
@@ -1,6 +1,7 @@
1
1
  import { CameraFrameComposer } from "../CameraFrameComposer";
2
2
  import { CameraFrameHandler } from "../CameraFrameHandler";
3
3
  import { Camera } from "../../camera/Camera";
4
+ import { PlanetCamera } from "../../camera/PlanetCamera";
4
5
  import { Framebuffer } from "../../webgl";
5
6
  import { Control, IControlParams } from "../Control";
6
7
  import { Vec3 } from "../../math/Vec3";
@@ -15,6 +16,7 @@ interface IPerimeterSegmentsData {
15
16
  export interface ICameraDepthHandlerParams extends IControlParams {
16
17
  showFrustum?: boolean;
17
18
  showFootprint?: boolean;
19
+ excludeLayers?: Vector[];
18
20
  }
19
21
  export declare class CameraDepthHandler extends Control {
20
22
  protected _frameHandler: CameraFrameHandler | null;
@@ -26,11 +28,16 @@ export declare class CameraDepthHandler extends Control {
26
28
  protected _quadTreeStrategy: QuadTreeStrategy | null;
27
29
  protected _showFrustum: boolean;
28
30
  protected _showFootprint: boolean;
31
+ protected _excludeLayers: Vector[];
29
32
  constructor(params: ICameraDepthHandlerParams);
30
33
  protected _createCamera(): Camera;
31
34
  get camera(): Camera | undefined;
32
35
  oninit(): void;
33
36
  get framebuffer(): Framebuffer | undefined;
37
+ getCamera(): Camera;
38
+ getDepthTexture(): WebGLTexture;
39
+ protected _segmentsPass(camera: PlanetCamera, quadTreeStrategy: QuadTreeStrategy): void;
40
+ protected _geoObjectsPass(camera: PlanetCamera): void;
34
41
  protected _depthHandlerCallback: (frameHandler: CameraFrameHandler) => void;
35
42
  protected _renderFootprint(frameHandler: CameraFrameHandler): void;
36
43
  protected _collectPerimeterLonLats(width: number, height: number): IPerimeterSegmentsData;
@@ -22,6 +22,7 @@ interface IEntityCollectionParams {
22
22
  visibility?: boolean;
23
23
  labelMaxLetters?: number;
24
24
  pickingEnabled?: boolean;
25
+ receiveProjectors?: boolean;
25
26
  scaleByDistance?: NumberArray3;
26
27
  pickingScale?: number | NumberArray3;
27
28
  opacity?: number;
@@ -39,10 +40,11 @@ interface IEntityCollectionParams {
39
40
  * @param {boolean} [options.visibility=true] - Entity visibility.
40
41
  * @param {number} [options.labelMaxLetters] - Maximum label letters per line used by the label handler.
41
42
  * @param {boolean} [options.pickingEnabled] - Enables/disables picking for all entity handlers.
43
+ * @param {boolean} [options.receiveProjectors=true] - Enables/disables projector effect reception for this collection.
42
44
  * @param {Array.<number>} [options.scaleByDistance] - Entity scale by distance parameters. (exactly 3 entries)
43
45
  * First index - near distance to the entity, after entity becomes full scale.
44
- * Second index - far distance to the entity, when entity becomes zero scale.
45
- * Third index - far distance to the entity, when entity becomes invisible.
46
+ * Second index - far distance to the entity, when the entity becomes zero scale.
47
+ * Third index - far distance to the entity, when the entity becomes invisible.
46
48
  * @param {number|Array.<number>} [options.pickingScale] - Picking scale value or xyz scale array.
47
49
  * @param {number} [options.opacity] - Entity global opacity.
48
50
  * @param {number|string} [options.shadeMode=1] - Geo object shading mode: `0|none|unlit`, `0.5|phong`, `1|pbr`.
@@ -194,6 +196,12 @@ declare class EntityCollection {
194
196
  _layer?: Vector;
195
197
  _quadNode?: EntityCollectionNode;
196
198
  _shadeMode: ShadeMode;
199
+ /**
200
+ * Enables/disables projector effect reception for this collection.
201
+ * @public
202
+ * @type {boolean}
203
+ */
204
+ receiveProjectors: boolean;
197
205
  /**
198
206
  * Disables `gl.CULL_FACE` for geo objects rendering passes (opaque/transparent).
199
207
  * Useful for rendering models with inverted/inconsistent triangle winding.
@@ -234,6 +242,12 @@ declare class EntityCollection {
234
242
  * @param {boolean} enable - Picking enable flag.
235
243
  */
236
244
  setPickingEnabled(enable: boolean): void;
245
+ /**
246
+ * Sets whether this collection receives projector effects.
247
+ * @public
248
+ * @param {boolean} enable - `true` to receive projector effects, `false` to ignore them.
249
+ */
250
+ setReceiveProjectors(enable: boolean): void;
237
251
  /**
238
252
  * Gets collection opacity.
239
253
  * @public
@@ -8,6 +8,7 @@ import { Object3d } from "../../Object3d";
8
8
  import { InstanceData } from "./InstanceData";
9
9
  import type { Renderer } from "../../renderer/Renderer";
10
10
  import type { Scene } from "../../scene/Scene";
11
+ import type { Camera } from "../../camera/Camera";
11
12
  import type { ShaderProgram } from "../../webgl/ShaderProgram";
12
13
  export declare const VERTEX_BUFFER = 0;
13
14
  export declare const RTC_POSITION_BUFFER = 1;
@@ -68,6 +69,8 @@ export declare class GeoObjectHandler {
68
69
  _displayForwardPASS(): void;
69
70
  protected _depthPASS(): void;
70
71
  drawDepth(): void;
72
+ protected _depthCameraPASS(camera: Camera): void;
73
+ drawDepthCameraPass(camera: Camera): void;
71
74
  drawPicking(): void;
72
75
  protected _pickingPASS(): void;
73
76
  setQRotArr(tagData: InstanceData, tagDataIndex: number, qRot: Quat): void;
package/lib/index.d.ts CHANGED
@@ -18,9 +18,13 @@ export type { IControlParams } from "./control/Control";
18
18
  export type { ITouchState } from "./renderer/RendererEvents";
19
19
  export type { IDeferredShadingPass } from "./renderer/IDeferredShadingPass";
20
20
  export type { ITransparencyPass } from "./renderer/ITransparencyPass";
21
+ export type { ProjectorSourceType, ProjectorRenderMode, IProjectorParams } from "./renderer/projectors/Projector";
22
+ export { Projector } from "./renderer/projectors/Projector";
21
23
  export { PhongDeferredShading } from "./renderer/PhongDeferredShading";
22
24
  export { AtmosphereDeferredShading } from "./renderer/AtmosphereDeferredShading";
23
25
  export { WOITPass } from "./renderer/WOITPass";
26
+ export { ProjectorsPass } from "./renderer/projectors/ProjectorsPass";
27
+ export { ProjectorManager } from "./renderer/projectors/ProjectorManager";
24
28
  export { SHADE_UNLIT, SHADE_PHONG, SHADE_PBR, type ShadeMode, type ShadeModeInput } from "./shadeModeConstants";
25
29
  export declare const version: string;
26
30
  import { Geoid } from "./terrain/Geoid";
@@ -40,9 +44,9 @@ import { Loader, type IResponse } from "./utils/Loader";
40
44
  import { EarthQuadTreeStrategy, EquiQuadTreeStrategy, QuadTreeStrategy, quadTreeStrategyType, Wgs84QuadTreeStrategy } from "./quadTree/index";
41
45
  import { Object3d } from "./Object3d";
42
46
  import { Handler, ShaderProgram, Framebuffer, Multisample } from "./webgl/index";
43
- import { EmptyTerrain, GlobusTerrain, RgbTerrain, BilTerrain, GlobusRgbTerrain } from "./terrain/index";
47
+ import { EmptyTerrain, GlobusTerrain, RgbTerrain, BilTerrain, GlobusRgbTerrain, MapterhornTerrain, rgbToHeightByEncoding, rgbToHeightRgb, rgbToHeightTerrarium, resolveRgbToHeightFunc } from "./terrain/index";
44
48
  import { MoveAxisEntity } from "./control/entityEditor/MoveAxisEntity";
45
49
  import { Gltf } from "./utils/gltf/gltfParser";
46
50
  import { Easing } from "./utils/easing";
47
51
  import type { EasingFunction } from "./utils/easing";
48
- export { bv, jd, math, mercator, utils, input, control, scene, quadTreeStrategyType, wgs84, moon, mars, terrain, layer, ui, webgl, Easing, EasingFunction, Framebuffer, EmptyTerrain, GlobusTerrain, RgbTerrain, GlobusRgbTerrain, BilTerrain, Camera, Ellipsoid, Planet, PlanetCamera, ShaderProgram, Handler, Multisample, Renderer, Clock, Events, EventsHandler, createEvents, Extent, LonLat, Scene, Line2, Line3, Mat3, Mat4, Plane, Quat, Ray, Vec2, Vec3, Vec4, Geoid, Popup, QuadTreeStrategy, EquiQuadTreeStrategy, EarthQuadTreeStrategy, Wgs84QuadTreeStrategy, Object3d, Gltf, MoveAxisEntity, Loader, IResponse };
52
+ export { bv, jd, math, mercator, utils, input, control, scene, quadTreeStrategyType, wgs84, moon, mars, terrain, layer, ui, webgl, Easing, EasingFunction, Framebuffer, EmptyTerrain, GlobusTerrain, RgbTerrain, GlobusRgbTerrain, MapterhornTerrain, rgbToHeightByEncoding, rgbToHeightRgb, rgbToHeightTerrarium, resolveRgbToHeightFunc, BilTerrain, Camera, Ellipsoid, Planet, PlanetCamera, ShaderProgram, Handler, Multisample, Renderer, Clock, Events, EventsHandler, createEvents, Extent, LonLat, Scene, Line2, Line3, Mat3, Mat4, Plane, Quat, Ray, Vec2, Vec3, Vec4, Geoid, Popup, QuadTreeStrategy, EquiQuadTreeStrategy, EarthQuadTreeStrategy, Wgs84QuadTreeStrategy, Object3d, Gltf, MoveAxisEntity, Loader, IResponse };
@@ -0,0 +1,36 @@
1
+ import { Layer } from "./Layer";
2
+ import type { ILayerParams } from "./Layer";
3
+ import { Material } from "./Material";
4
+ import type { NumberArray4 } from "../math/Vec4";
5
+ import type { Node } from "../quadTree/Node";
6
+ import { Segment } from "../segment/Segment";
7
+ export interface IBaseTileMaterialLayerParams extends ILayerParams {
8
+ minNativeZoom?: number;
9
+ maxNativeZoom?: number;
10
+ }
11
+ /**
12
+ * Shared tile material application for imagery/canvas tile layers.
13
+ * It can be applied to any type of tiled data that can be displayed on the planet in either of these two ways, such as BUildings, vector tiles etc.
14
+ */
15
+ export declare abstract class BaseTileMaterialLayer extends Layer {
16
+ minNativeZoom: number;
17
+ maxNativeZoom: number;
18
+ constructor(name?: string | null, options?: IBaseTileMaterialLayerParams);
19
+ applyMaterial(material: Material, forceLoading?: boolean): NumberArray4;
20
+ protected _applyMaterialDefaultCore(material: Material, forceLoading?: boolean): NumberArray4;
21
+ protected _applyMaterialFastCore(material: Material, forceLoading?: boolean): NumberArray4;
22
+ protected _applyReadyParentTexture(material: Material, segment: Segment, layerId: number): void;
23
+ protected _allowsLoadWithoutPassReady(): boolean;
24
+ protected _hasParentMaterial(psegm: Material): boolean;
25
+ protected _applyNoParentMaterial(material: Material, segment: Segment): void;
26
+ protected _onMaterialReady(_material: Material): void;
27
+ protected _onParentMaterialApplied(_material: Material, _psegm: Material): void;
28
+ protected _beforeFastMaterialParentWalk(material: Material, segment: Segment, forceLoading: boolean): void;
29
+ protected _applyFastPassReadyLoading(material: Material, segment: Segment, pn: Node, forceLoading: boolean): void;
30
+ /** pn from parent walk is at maxNativeZoom. */
31
+ protected _fastWhenWalkerAtMaxNativeZoom(material: Material, segment: Segment): void;
32
+ protected _fastLoadParentAtMaxNativeZoom(material: Material, segment: Segment, maxNativeZoom: number): void;
33
+ protected _triggerDefaultMaterialLoad(mat: Material, material: Material, targetNode: Node, forceLoading: boolean): void;
34
+ protected _defaultMaterialLoadForce(_mat: Material, material: Material, targetNode: Node, forceLoading: boolean): boolean;
35
+ clearMaterial(material: Material): void;
36
+ }
@@ -1,12 +1,12 @@
1
1
  import type { EventCallback, EventsHandler } from "../Events";
2
- import { Layer } from "./Layer";
3
- import type { ILayerParams, LayerEventsList } from "./Layer";
2
+ import { BaseTileMaterialLayer } from "./BaseTileMaterialLayer";
3
+ import type { IBaseTileMaterialLayerParams } from "./BaseTileMaterialLayer";
4
+ import type { LayerEventsList } from "./Layer";
4
5
  import { Material } from "../layer/Material";
5
- import type { NumberArray4 } from "../math/Vec4";
6
6
  import { Planet } from "../scene/Planet";
7
7
  type ApplyImageFunc = (material: HTMLCanvasElement | ImageBitmap | HTMLImageElement) => void;
8
8
  type DrawTileCallback = (material: Material, applyImage: ApplyImageFunc) => void;
9
- export interface ICanvasTilesParams extends ILayerParams {
9
+ export interface ICanvasTilesParams extends IBaseTileMaterialLayerParams {
10
10
  drawTile: DrawTileCallback;
11
11
  animated?: boolean;
12
12
  minNativeZoom?: number;
@@ -33,13 +33,11 @@ type CanvasTilesEventsType = EventsHandler<CanvasTilesEventsList> & EventsHandle
33
33
  * @fires load
34
34
  * @fires loadend
35
35
  */
36
- declare class CanvasTiles extends Layer {
36
+ declare class CanvasTiles extends BaseTileMaterialLayer {
37
37
  static MAX_REQUESTS: number;
38
38
  static __requestsCounter: number;
39
39
  events: CanvasTilesEventsType;
40
40
  animated: boolean;
41
- minNativeZoom: number;
42
- maxNativeZoom: number;
43
41
  /**
44
42
  * Current creating tiles counter.
45
43
  * @protected
@@ -82,7 +80,7 @@ declare class CanvasTiles extends Layer {
82
80
  * @virtual
83
81
  * @param {Material} material -
84
82
  */
85
- loadMaterial(material: Material): void;
83
+ loadMaterial(material: Material, _forceLoading?: boolean): void;
86
84
  /**
87
85
  * Loads material image and apply it to the planet segment.
88
86
  * @protected
@@ -98,9 +96,7 @@ declare class CanvasTiles extends Layer {
98
96
  abortMaterialLoading(material: Material): void;
99
97
  protected _dequeueRequest(): void;
100
98
  protected _whilePendings(): Material | null;
101
- applyMaterial(material: Material): NumberArray4;
102
- protected _apllyMaterialDefault(material: Material): NumberArray4;
103
- protected _applyMaterialFast(material: Material): NumberArray4;
104
- clearMaterial(material: Material): void;
99
+ protected _onMaterialReady(material: Material): void;
100
+ protected _onParentMaterialApplied(material: Material, _psegm: Material): void;
105
101
  }
106
102
  export { CanvasTiles };
@@ -4,14 +4,16 @@ import { EntityCollection } from "../entity/EntityCollection";
4
4
  import { EntityCollectionsTreeStrategy } from "../quadTree/EntityCollectionsTreeStrategy";
5
5
  import type { EventsHandler } from "../Events";
6
6
  import { GeometryHandler } from "../entity/geometry/GeometryHandler";
7
- import { Layer } from "./Layer";
8
- import type { ILayerParams, LayerEventsList } from "./Layer";
7
+ import { BaseTileMaterialLayer } from "./BaseTileMaterialLayer";
8
+ import type { IBaseTileMaterialLayerParams } from "./BaseTileMaterialLayer";
9
+ import type { LayerEventsList } from "./Layer";
9
10
  import type { NumberArray3 } from "../math/Vec3";
10
11
  import { Planet } from "../scene/Planet";
11
12
  import { Material } from "./Material";
13
+ import { Segment } from "../segment/Segment";
12
14
  import type { NumberArray4 } from "../math/Vec4";
13
15
  import { type ShadeMode, type ShadeModeInput } from "../shadeModeConstants";
14
- export interface IVectorParams extends ILayerParams {
16
+ export interface IVectorParams extends IBaseTileMaterialLayerParams {
15
17
  entities?: Entity[] | IEntityParams[];
16
18
  depthOffset?: number;
17
19
  nodeCapacity?: number;
@@ -24,6 +26,7 @@ export interface IVectorParams extends ILayerParams {
24
26
  shadeMode?: ShadeModeInput;
25
27
  depthOrder?: number;
26
28
  disableCullFace?: boolean;
29
+ receiveProjectors?: boolean;
27
30
  }
28
31
  type VectorEventsList = [
29
32
  "draw",
@@ -33,7 +36,7 @@ type VectorEventsList = [
33
36
  export type VectorEventsType = EventsHandler<VectorEventsList> & EventsHandler<LayerEventsList>;
34
37
  /**
35
38
  * Vector layer is an alternative entity storage. Used for geospatial data rendering like
36
- * points, lines, polygons, geometry objects etc.
39
+ * points, lines, polygons, geometry objects, etc.
37
40
  * @class
38
41
  * @extends {Layer}
39
42
  * @param {string} [name="noname"] - Layer name.
@@ -65,6 +68,7 @@ export type VectorEventsType = EventsHandler<VectorEventsList> & EventsHandler<L
65
68
  * @param {number|string} [options.shadeMode=1] - Geo object shading: 0/none unlit, 0.5/phong, 1/pbr.
66
69
  * @param {number} [options.depthOrder=0] - Rendering order group for vector collections.
67
70
  * @param {boolean} [options.disableCullFace=false] - Disables back-face culling for geo object rendering.
71
+ * @param {boolean} [options.receiveProjectors=true] - Enables/disables projector effect reception for this layer entities.
68
72
  *
69
73
  * //@fires entitymove
70
74
  * @fires draw
@@ -74,7 +78,7 @@ export type VectorEventsType = EventsHandler<VectorEventsList> & EventsHandler<L
74
78
  * @fires entityremove
75
79
  * @fires visibilitychange
76
80
  */
77
- declare class Vector extends Layer {
81
+ declare class Vector extends BaseTileMaterialLayer {
78
82
  events: VectorEventsType;
79
83
  protected _depthOrder: number;
80
84
  /**
@@ -117,7 +121,7 @@ declare class Vector extends Layer {
117
121
  /** todo: combine into one */
118
122
  protected _stripEntityCollection: EntityCollection;
119
123
  protected _polylineEntityCollection: EntityCollection;
120
- protected _geoObjectEntityCollection: EntityCollection;
124
+ _geoObjectEntityCollection: EntityCollection;
121
125
  _geometryHandler: GeometryHandler;
122
126
  protected _entityCollectionsTreeStrategy: EntityCollectionsTreeStrategy | null;
123
127
  /**
@@ -131,6 +135,7 @@ declare class Vector extends Layer {
131
135
  protected _labelMaxLetters: number;
132
136
  protected _shadeMode: ShadeMode;
133
137
  protected _disableCullFace: boolean;
138
+ protected _receiveProjectors: boolean;
134
139
  constructor(name?: string | null, options?: IVectorParams);
135
140
  get depthOrder(): number;
136
141
  set depthOrder(d: number);
@@ -138,6 +143,18 @@ declare class Vector extends Layer {
138
143
  set shadeMode(m: ShadeModeInput);
139
144
  get disableCullFace(): boolean;
140
145
  set disableCullFace(v: boolean);
146
+ /**
147
+ * Gets projector effect reception state for this vector layer entities.
148
+ * @public
149
+ * @returns {boolean}
150
+ */
151
+ get receiveProjectors(): boolean;
152
+ /**
153
+ * Enables/disables projector effect reception for this vector layer entities.
154
+ * @public
155
+ * @param {boolean} v - `true` to receive projector effects, `false` to ignore them.
156
+ */
157
+ set receiveProjectors(v: boolean);
141
158
  get labelMaxLetters(): number;
142
159
  get instanceName(): string;
143
160
  protected _bindPicking(): void;
@@ -238,7 +255,7 @@ declare class Vector extends Layer {
238
255
  * @virtual
239
256
  * @param {Material} material - Current material.
240
257
  */
241
- loadMaterial(material: Material): void;
258
+ loadMaterial(material: Material, _forceLoading?: boolean): void;
242
259
  /**
243
260
  * Abort exact material loading.
244
261
  * @public
@@ -247,6 +264,10 @@ declare class Vector extends Layer {
247
264
  */
248
265
  abortMaterialLoading(material: Material): void;
249
266
  applyMaterial(material: Material): NumberArray4;
267
+ protected _allowsLoadWithoutPassReady(): boolean;
268
+ protected _hasParentMaterial(psegm: Material): boolean;
269
+ protected _onParentMaterialApplied(material: Material, psegm: Material): void;
270
+ protected _applyNoParentMaterial(material: Material, segment: Segment): void;
250
271
  clearMaterial(material: Material): void;
251
272
  update(): void;
252
273
  }
@@ -1,11 +1,11 @@
1
- import { Layer } from "./Layer";
2
- import type { ILayerParams, LayerEventsList } from "./Layer";
1
+ import { BaseTileMaterialLayer } from "./BaseTileMaterialLayer";
2
+ import type { IBaseTileMaterialLayerParams } from "./BaseTileMaterialLayer";
3
+ import type { LayerEventsList } from "./Layer";
3
4
  import { Segment } from "../segment/Segment";
4
5
  import type { EventsHandler } from "../Events";
5
6
  import { Material } from "./Material";
6
- import type { NumberArray4 } from "../math/Vec4";
7
7
  import type { FetchCache } from "../utils/Loader";
8
- export interface IXYZParams extends ILayerParams {
8
+ export interface IXYZParams extends IBaseTileMaterialLayerParams {
9
9
  url?: string;
10
10
  subdomains?: string[];
11
11
  minNativeZoom?: number;
@@ -51,7 +51,7 @@ type XYZEventsType = EventsHandler<XYZEventsList> & EventsHandler<LayerEventsLis
51
51
  * attribution: 'Data @ <a href="http://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="http://www.openstreetmap.org/copyright">ODbL</a>'
52
52
  * });
53
53
  */
54
- export declare class XYZ extends Layer {
54
+ export declare class XYZ extends BaseTileMaterialLayer {
55
55
  events: XYZEventsType;
56
56
  /**
57
57
  * Tile url source template.
@@ -63,18 +63,6 @@ export declare class XYZ extends Layer {
63
63
  * @protected
64
64
  */
65
65
  protected _s: string[];
66
- /**
67
- * Minimal native zoom level when tiles are available.
68
- * @public
69
- * @type {number}
70
- */
71
- minNativeZoom: number;
72
- /**
73
- * Maximal native zoom level when tiles are available.
74
- * @public
75
- * @type {number}
76
- */
77
- maxNativeZoom: number;
78
66
  /**
79
67
  * Rewrites imagery tile url query.
80
68
  * @private
@@ -144,10 +132,6 @@ export declare class XYZ extends Layer {
144
132
  * @param {Function} ur - The callback that returns tile custom created url.
145
133
  */
146
134
  setUrlRewriteCallback(ur: Function): void;
147
- applyMaterial(material: Material, forceLoading?: boolean): NumberArray4;
148
- protected _apllyMaterialDefault(material: Material, forceLoading?: boolean): NumberArray4;
149
- protected _applyMaterialFast(material: Material, forceLoading?: boolean): NumberArray4;
150
- clearMaterial(material: Material): void;
151
135
  /**
152
136
  * @protected
153
137
  */
package/lib/og.css CHANGED
@@ -1 +1 @@
1
- :root{--grey0: rgb(36 36 36);--grey1: #434244;--grey2: #3f3f46;--grey3: #bbbbbb;--grey4: #5e5e5e;--grey5: rgb(50, 50, 50);--grey6: #b6b6b6;--grey7: #707070;--grey8: #e2e2e2;--grey9: #9f9f9f;--blue0: #1700a9ee}.og-map-button{height:40px;width:40px;position:absolute;outline:none;cursor:pointer;z-index:1;background-color:var(--grey5)}.og-control-container{position:absolute;top:12px;z-index:2;display:flex;flex-direction:row;flex-wrap:wrap;align-content:flex-start;gap:8px;width:min(136px,calc(100% - 24px));box-sizing:border-box;pointer-events:none}.og-control-container>*{pointer-events:auto}.og-control-container .og-map-button{position:relative;top:auto!important;right:auto!important;bottom:auto!important;left:auto!important;margin:0;flex:0 0 auto}.og-control-container__top-left{left:10px;justify-content:flex-start}.og-control-container__top-right{right:12px;justify-content:flex-end}.og-control-container__bottom-right{top:auto;bottom:12px;right:12px;width:auto;max-width:calc(100% - 24px);flex-direction:column;align-items:flex-end;justify-content:flex-end}.og-control-container .og-scale-container,.og-control-container .og-coordinates{position:relative;top:auto!important;right:auto!important;bottom:auto!important;left:auto!important;margin:0}.og-control-container__bottom-right .og-scale-container{order:0}.og-control-container__bottom-right .og-coordinates{order:1}.ogCenterIcon{height:12px;width:12px;margin-bottom:-3.5px;margin-right:-7.5px;bottom:50%;right:50%;position:absolute}.ogHandPoiner{cursor:pointer}.defaultText{position:absolute;top:0;left:0;color:#fff}#ogShowFpsControl{color:red}.ogGrabbingPoiner{cursor:grabbing!important}.og-inner{width:100%;height:100%;float:left;position:relative;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none;overflow:hidden}.og-attribution{background:#cecece;text-align:right;bottom:0;left:0;position:absolute;font-size:.7rem;padding:1px 0;line-height:1.375em;font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;display:flex;flex-direction:row}.og-attribution .og-attribution__layer{margin-left:5px;margin-right:5px;align-items:center;display:inline;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:#1f1f1f}.og-attribution img{max-height:1.3em}input{accent-color:var(--blue0);cursor:pointer}.og-menu-bar-vertical{position:absolute;right:12px;top:12px;width:40px;height:40px;background-color:#403b3bd9;border-radius:2px;box-shadow:0 1px 4px #0f0f0f2b;z-index:0}.og-hide{display:none!important}.og-not-visible{visibility:hidden!important}.og-options-container{position:relative;padding:12px;height:calc(100% - 30px);color:#b6b6b6}.og-option{width:100%;position:relative;display:inline-block;flex-direction:row;padding-bottom:7px;text-overflow:ellipsis;align-items:center;justify-content:left}.og-option .og-slider{width:100%}.og-option .og-slider .og-slider-label,.og-option .og-color-label{width:100px;font-size:12px}.og-ddialog{position:absolute;display:flex;flex-direction:column;box-shadow:3px 3px 4px #0f0f0f2b;background-color:var(--grey0);border:1px solid;border-color:var(--grey1);border-radius:4px;overflow:auto}.og-ddialog .og-ddialog-header{width:100%;height:27px;position:relative;padding:0;z-index:1;background-color:var(--grey2);color:#fff;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.og-ddialog .og-ddialog-header .og-ddialog-header__title{color:var(--grey3);padding-left:5px;pointer-events:none;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-size:14px;font-weight:400}.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{overflow:auto;position:relative;width:100%;height:100%;font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:14px}.og-ddialog.dragging{-webkit-user-select:none;user-select:none}.og-ddialog .og-ddialog-resize-handle{display:block;position:absolute;right:0;bottom:0;width:20px;height:20px;cursor:nwse-resize;touch-action:none;z-index:2}.og-button{display:flex;align-items:center;align-content:center;padding:2px;flex-direction:row;cursor:default;justify-content:center;color:var(--grey6);border-radius:6px}.og-button .og-button-icon{display:flex;align-items:center;justify-content:center;line-height:0}.og-button svg{width:24px;height:24px;display:block}.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{position:relative;color:#b6b6b6;width:100%;height:100%;overflow-x:hidden;overflow-y:auto}.og-layerSwitcher__title{position:relative;color:#b6b6b6;font-size:14px;width:100%;padding:5px}.og-layerSwitcher__list{position:relative;width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;padding:2px}.og-layerSwitcher__layerButton{width:70px;height:70px;position:relative;background-color:#7a7a7a;cursor:pointer;border-radius:7px;margin:3px;border:2px solid rgba(0,0,0,0);padding:0;display:flex;flex-direction:column-reverse}.og-layerSwitcher__layerButton.og-layerSwitcher__visible{border:2px solid #56ff64}.og-layerSwitcher__layerButton.og-layerSwitcher__visible img{opacity:1}.og-layerSwitcher__layerButton img{width:100%;height:100%;border-radius:7px;position:absolute;left:0;top:0;opacity:1}.og-layerSwitcher__layerButton img:hover{opacity:1}.og-layerSwitcher__name{color:var(--grey8);font-size:12px;overflow:hidden;text-overflow:ellipsis;padding:3px;background-color:#00000080;bottom:0;border-bottom-left-radius:7px;border-bottom-right-radius:7px;z-index:10}.og-entityTree{width:100%}.og-entityTree__node{width:100%;box-sizing:border-box}.og-entityTree__row{display:flex;align-items:center;min-height:22px}.og-entityTree__toggleBtn{width:20px;height:20px;border:none;background:transparent;color:var(--grey3);cursor:pointer;border-radius:4px;padding:0;font-size:14px}.og-entityTree__toggleBtn_hasChildren:hover{background-color:var(--grey1)}.og-entityTree__toggleBtn_empty{visibility:hidden;pointer-events:none}.og-entityTree__entityBtn{flex:1;min-width:0;border:none;background:transparent;color:var(--grey6);display:flex;align-items:center;justify-content:space-between;gap:8px;text-align:left;cursor:pointer;border-radius:4px;padding:3px 6px 3px 4px;font-size:12px}.og-entityTree__entityBtn:hover,.og-entityTree__entityBtn:focus-visible{background-color:var(--grey1)}.og-entityTree__name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.og-entityTree__type{color:var(--grey9);font-size:11px;white-space:nowrap}.og-entityTree__children_hidden{display:none}.og-entityTree__children{padding-left:17px}.og-entityTreeControl{position:relative;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;color:var(--grey4)}.og-entityTreeControl__tree{width:100%;padding:4px;box-sizing:border-box}.og-entityTreeControl__empty{padding:10px 8px;color:var(--grey3);font-size:13px}.displayNone{display:none}.displayBlock{display:block}.og-drawing-default_button .og-button-icon{transform:scale(.73)}.ogConsole{position:absolute;top:0;left:0;width:100%;max-height:70%;overflow:auto;font-size:14px;font-family:Arial;background-color:#8282827d;color:#fff;z-index:100000000;pointer-events:none}.ogConsole-text{padding:7px;overflow:hidden}.ogConsole-error{color:red}.ogConsole-warning{color:#ff0}.ogViewExtentBtn{margin-left:12px;height:24px;width:24px;scale:70%;cursor:pointer;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==) center center no-repeat}.ogViewExtentBtn:hover{border-radius:10px;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==) center center no-repeat,var(--blue0)}.og-debuginfo_controls{padding-bottom:8px;display:flex}.og-debuginfo_controls-button{width:25px;height:25px;float:left;margin:3px}.og-debug-info{color:#fff;font-size:12px;padding:10px}.og-debug-info .og-watch-line{width:100%;padding-bottom:5px;display:flex;flex-direction:row}.og-watch-line .og-watch-label{color:#cecece;width:200px}.og-watch-line .og-watch-value{margin-left:15px}.og-popup{position:absolute;text-align:center;bottom:-2px}.og-popup-content-wrapper,.og-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px #0006}.og-popup-content-wrapper{background:#fff;color:#333;box-shadow:0 3px 14px #0006;padding:1px;text-align:left;border-radius:8px;min-width:30px;min-height:17px}.og-popup-content{margin:20px 5px 5px;line-height:1.4}.og-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none;bottom:-19px}.og-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.og-popup-toolbar{position:absolute;top:3px;right:2px;display:inline-block}.og-popup-btn{width:15px;height:15px;cursor:pointer;float:right}.og-popup-btn:hover{color:#2e9be7}.og-popup-title{position:absolute;left:5px;top:3px;font-size:14px}.og-scale-container{position:absolute;right:320px;bottom:30px}.og-scale-label{position:relative;color:#fff;font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:12px;text-align:center}.og-scale-ruler{position:relative;height:7px;border-bottom:2px solid white;border-left:1px solid white;border-right:1px solid white}.og-compass-button .og-button-icon{display:flex;align-items:center;justify-content:center;transform-origin:center center}.og-compass-button .og-button-icon svg{width:48px!important;height:48px!important;display:block}.og-orthoswitcher_button .og-button-icon svg{width:45px!important;height:45px!important;display:block;transform:translateY(3px)}.og-suncontrol-button{width:25px;height:25px;float:left;margin:3px}.og-lighing{position:relative;padding:12px;height:calc(100% - 30px);color:#b6b6b6}.og-lighing .og-layers{display:flex;flex-direction:row;align-items:center}.og-lighing .og-caption{position:relative}.og-emptyline,.og-lighing .og-lighting-emptyline{width:100%;padding:3px}.og-emptyline-2{width:100%;padding:5px}.og-lighing .og-slider{width:100%}.og-lighing .og-slider .og-slider-label,.og-lighing .og-color-label{width:100px;font-size:12px}.og-lighing .og-color{padding-right:10px}.og-lighing #layers{font-family:monospace;padding:2px;margin-left:21px;width:200px}.og-coordinates{position:absolute;bottom:25px;right:12px;text-align:right;overflow:hidden;font-family:monospace;font-size:1em;cursor:pointer;float:left;background-color:var(--grey5);color:var(--grey8);padding:5px;border-radius:4px}.og-coordinates div{float:left}.og-coordinates .og-coordinates-copy-btn{float:left;margin-right:6px;padding:0;border:0;background:transparent;color:var(--grey8);opacity:.8;cursor:pointer}.og-coordinates .og-coordinates-copy-btn:hover{opacity:1}.og-coordinates .og-coordinates-copy-btn svg{display:block;transform:translateY(1px)}.og-coordinates .og-coordinates-copy-btn svg path{fill:currentColor}.og-lat-side,.og-lon-side{width:10px;padding-right:3px}.og-lat-val,.og-lon-val{width:90px;padding-right:3px;text-align:left;text-overflow:unset;overflow:hidden}.og-height{width:50px;text-align:right;text-overflow:ellipsis;padding-left:3px;overflow:hidden}.og-units-height{width:15px;text-align:left;padding-left:3px}.og-center-icon{height:12px;width:12px;margin-bottom:-3.5px;margin-right:-7.5px;bottom:50%;right:50%;position:absolute;pointer-events:none}.og-atmosphere.og-options-container .og-slider-label{width:300px;overflow:hidden;height:20px}.og-atmosphere.og-options-container .og-slider input{width:87px}.og-timeline-control_button{width:25px;height:20px;margin-left:3px;margin-right:3px;background:var(--grey7);border-radius:1px}.og-timeline-control_button.og-button__active{background:var(--grey3)}.og-timeline{width:100%;height:100%;background:#2d2d2d;position:relative;left:0;bottom:0;overflow:hidden}.og-timeline-frame{position:relative;width:calc(100% - 20px);margin:0 0 0 10px;height:30px}.og-timeline-scale{overflow:hidden;width:100%;height:100%;touch-action:none}.og-timeline-current{position:absolute;left:0;width:11px;height:100%;margin-left:-5px;cursor:pointer;margin-top:-7px;touch-action:none}.og-timeline-current-spin{margin:0 auto;width:1px;height:100%;background-color:#ff3434;pointer-events:none}.og-timeline-current-arrow{width:0;height:0;border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ff3434;margin-left:-6px}.og-timeline-bottom{width:100%;display:flex;position:relative;justify-content:center;margin-top:3px}.og-timeline-controls{position:relative;border-radius:10px;display:flex;flex-direction:row;justify-content:center;align-items:center;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{width:100%;display:block;height:15px}.og-slider{display:flex;flex-direction:row;gap:5px;margin:5px}.og-slider .og-slider-label{width:100%;height:100%;color:var(--grey6);font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:14px;display:flex;align-items:center;text-align:left;margin-right:5px}.og-slider .og-slider-panel{position:relative;width:100%;height:20px;background-color:var(--grey1);z-index:1;border-radius:2px}.og-slider .og-slider-panel .og-slider-progress{position:absolute;height:100%;background-color:var(--grey7);pointer-events:none;border-top-left-radius:2px;border-bottom-left-radius:2px}.og-slider .og-slider-panel .og-slider-pointer{position:absolute;left:0;top:0;height:100%;width:3px;background-color:var(--grey3);pointer-events:none}.og-slider input{position:relative;height:100%;width:100%;background:var(--grey5);border:1px solid var(--grey1);z-index:0;color:var(--grey3);padding-left:5px;width:60px;border-radius:2px}.og-slider input:focus-visible{outline:none}.og-slider input::-webkit-outer-spin-button,.og-slider input::-webkit-inner-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{width:100%;height:100%;color:var(--grey6);font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:14px;align-items:center;text-align:left;margin-right:5px}.og-checkbox input,.og-input input{position:relative;height:100%;width:100%;background:var(--grey5);border:1px solid var(--grey1);z-index:0;color:var(--grey3);padding-left:5px;border-radius:5px}.og-checkbox input:focus-visible,.og-input input:focus-visible{outline:none}.og-checkbox input[type=checkbox]{width:14px;height:14px;-moz-appearance:none;appearance:none;-webkit-appearance:none;display:flex;align-content:center;justify-content:center;border:1px solid var(--grey1);border-radius:3px;background:var(--grey8);cursor:pointer;position:relative;padding:0}.og-checkbox input[type=checkbox]:before{content:"";position:absolute;width:3px;height:6px;border:solid black;border-width:0 2px 2px 0;transform:rotate(45deg);top:2px;left:3.5px;opacity:0;transition:opacity .2s ease-in-out}.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{pointer-events:none;opacity:.7}.og-input-disabled input[type=checkbox]{background:var(--grey9)}.og-input input[type=number]{-moz-appearance:textfield}.og-elevationprofile{width:100%;height:100%;position:absolute;overflow:hidden}.og-elevationprofile__container{position:relative;width:100%;height:100%;display:flex;flex-direction:column;align-content:center;align-items:center}.og-elevationprofile__menu{position:relative;width:100%;height:43px}.og-elevationprofile__graph{position:relative;width:100%;height:100%}.og-elevationprofile-legend{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-size:12px;color:var(--grey8);position:absolute;top:0;right:0;margin:5px;display:flex;z-index:1}.og-elevationprofile-legend__row{position:relative;padding:5px;width:70px}.og-elevationprofile-square{position:relative;float:left;width:6px;height:6px;margin:5px}.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;position:relative;float:left;padding-left:5px}.og-elevationprofile-value{width:30px;display:inline-block;position:relative;float:left;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.og-elevationprofile-buttons{display:inline-block;position:absolute;top:0;left:0}.og-elevationprofile-button{width:25px;height:25px;float:left;margin:3px}.og-elevationprofile-list{position:relative;width:100%;height:100%;display:flex;flex-direction:column}.og-elevationprofile-list textarea{position:relative;width:100%;height:100%;resize:none;background:var(--grey8);padding:5px}.og-elevationprofile-list-buttons{position:relative;height:60px;display:flex;flex-direction:row;align-items:center;justify-content:right}.og-elevationprofile-list-apply{padding:4px 10px 7px;float:right;background-color:var(--grey2);margin-right:15px}.og-elevationprofile_pointer{position:absolute;left:0;top:0;height:100%}.og-elevationprofile-line{position:absolute;background-color:#fff;width:3px;height:30px;margin-left:-1.5px}.og-elevationprofile-label{position:absolute;top:0;left:0;color:#fff}.og-elevationprofile-button__location svg{width:17px;height:17px}.og-elevationprofile-loading{opacity:.3;background-color:#000;position:absolute;width:100%;height:100%;z-index:2;display:flex;flex-direction:row;justify-content:center;align-items:center}.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{position:absolute;width:11px;height:40px;top:30px;animation:ldio-p0v5a1f6oz .9345794392523364s cubic-bezier(.5,0,.5,1) infinite}.ldio-p0v5a1f6oz div:nth-child(1){transform:translate(14.5px);background:#353535;animation-delay:-.5607476635514018s}.ldio-p0v5a1f6oz div:nth-child(2){transform:translate(34.5px);background:#666;animation-delay:-.37383177570093457s}.ldio-p0v5a1f6oz div:nth-child(3){transform:translate(54.5px);background:#9b9b9b;animation-delay:-.18691588785046728s}.ldio-p0v5a1f6oz div:nth-child(4){transform:translate(74.5px);background:#d4d4d4;animation-delay:-.9345794392523364s}.loadingio-spinner-bars-r354qqyl5v{width:88px;height:88px;display:inline-block;overflow:hidden;background:none}.ldio-p0v5a1f6oz{width:100%;height:100%;position:relative;transform:translateZ(0) scale(.88);backface-visibility:hidden;transform-origin:0 0}.ldio-p0v5a1f6oz div{box-sizing:content-box}.og-editor-ground_button{width:fit-content;background:var(--grey1);padding:4px 6px 8px;margin-left:5px;margin-top:15px}.og-editor_toolbar{padding-bottom:8px;display:flex}.og-editor_toolbar-button{width:25px;height:25px;float:left;margin:3px}.og-object3d-manager .og-ddialog-container{display:flex;flex-direction:column}.og-object3d-collection{width:100%;height:100%}.og-object3d-collection__item{width:75px;height:75px;position:relative;background-color:#7a7a7a;cursor:pointer;border-radius:5px;margin:3px;border:2px solid rgba(0,0,0,0)}.og-object3d-collection__item.active{border:solid #00e0be 2px}.og-object3d-collection__item_name{width:100%;height:20px;position:absolute;left:0;bottom:0;background:#3d3d3da3;color:#fff;padding-top:3px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}
1
+ :root{--grey0: rgb(36 36 36);--grey1: #434244;--grey2: #3f3f46;--grey3: #bbbbbb;--grey4: #5e5e5e;--grey5: rgb(50, 50, 50);--grey6: #b6b6b6;--grey7: #707070;--grey8: #e2e2e2;--grey9: #9f9f9f;--blue0: #1700a9ee}.og-map-button{height:40px;width:40px;position:absolute;outline:none;cursor:pointer;z-index:1;background-color:var(--grey5)}.og-control-container{position:absolute;top:12px;z-index:2;display:flex;flex-direction:row;flex-wrap:wrap;align-content:flex-start;gap:8px;width:min(136px,calc(100% - 24px));box-sizing:border-box;pointer-events:none}.og-control-container>*{pointer-events:auto}.og-control-container .og-map-button{position:relative;top:auto!important;right:auto!important;bottom:auto!important;left:auto!important;margin:0;flex:0 0 auto}.og-control-container__top-left{left:10px;justify-content:flex-start}.og-control-container__top-right{right:12px;justify-content:flex-end}.og-control-container__bottom-right{top:auto;bottom:12px;right:12px;width:auto;max-width:calc(100% - 24px);flex-direction:column;align-items:flex-end;justify-content:flex-end}.og-control-container .og-scale-container,.og-control-container .og-coordinates{position:relative;top:auto!important;right:auto!important;bottom:auto!important;left:auto!important;margin:0}.og-control-container__bottom-right .og-scale-container{order:0}.og-control-container__bottom-right .og-coordinates{order:1}.ogCenterIcon{height:12px;width:12px;margin-bottom:-3.5px;margin-right:-7.5px;bottom:50%;right:50%;position:absolute}.ogHandPoiner{cursor:pointer}.defaultText{position:absolute;top:0;left:0;color:#fff}#ogShowFpsControl{color:red}.ogGrabbingPoiner{cursor:grabbing!important}.og-inner{width:100%;height:100%;float:left;position:relative;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none;overflow:hidden}.og-attribution{background:#cecece;text-align:right;bottom:0;left:0;position:absolute;font-size:.7rem;padding:1px 0;line-height:1.375em;font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;display:flex;flex-direction:row}.og-attribution .og-attribution__layer{margin-left:5px;margin-right:5px;align-items:center;display:inline;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:#1f1f1f}.og-attribution img{max-height:1.3em}input{accent-color:var(--blue0);cursor:pointer}.og-menu-bar-vertical{position:absolute;right:12px;top:12px;width:40px;height:40px;background-color:#403b3bd9;border-radius:2px;box-shadow:0 1px 4px #0f0f0f2b;z-index:0}.og-hide{display:none!important}.og-not-visible{visibility:hidden!important}.og-options-container{position:relative;padding:12px;height:calc(100% - 30px);color:#b6b6b6}.og-option{width:100%;position:relative;display:inline-block;flex-direction:row;padding-bottom:7px;text-overflow:ellipsis;align-items:center;justify-content:left}.og-option .og-slider{width:100%}.og-option .og-slider .og-slider-label,.og-option .og-color-label{width:100px;font-size:12px}.og-ddialog{position:absolute;display:flex;flex-direction:column;box-shadow:3px 3px 4px #0f0f0f2b;background-color:var(--grey0);border:1px solid;border-color:var(--grey1);border-radius:4px;overflow:auto}.og-ddialog .og-ddialog-header{width:100%;height:27px;position:relative;padding:0;z-index:1;background-color:var(--grey2);color:#fff;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.og-ddialog .og-ddialog-header .og-ddialog-header__title{color:var(--grey3);padding-left:5px;pointer-events:none;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-size:14px;font-weight:400}.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{overflow:auto;position:relative;width:100%;height:100%;font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:14px}.og-ddialog.dragging{-webkit-user-select:none;user-select:none}.og-ddialog .og-ddialog-resize-handle{display:block;position:absolute;right:0;bottom:0;width:20px;height:20px;cursor:nwse-resize;touch-action:none;z-index:2}.og-button{display:flex;align-items:center;align-content:center;padding:2px;flex-direction:row;cursor:default;justify-content:center;color:var(--grey6);border-radius:6px}.og-button .og-button-icon{display:flex;align-items:center;justify-content:center;line-height:0}.og-button svg{width:24px;height:24px;display:block}.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{position:relative;color:#b6b6b6;width:100%;height:100%;overflow-x:hidden;overflow-y:auto}.og-layerSwitcher__title{position:relative;color:#b6b6b6;font-size:14px;width:100%;padding:5px}.og-layerSwitcher__list{position:relative;width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;padding:2px}.og-layerSwitcher__layerButton{width:70px;height:70px;position:relative;background-color:#7a7a7a;cursor:pointer;border-radius:7px;margin:3px;border:2px solid rgba(0,0,0,0);padding:0;display:flex;flex-direction:column-reverse}.og-layerSwitcher__layerButton.og-layerSwitcher__visible{border:2px solid #56ff64}.og-layerSwitcher__layerButton.og-layerSwitcher__visible img{opacity:1}.og-layerSwitcher__layerButton img{width:100%;height:100%;border-radius:7px;position:absolute;left:0;top:0;opacity:1}.og-layerSwitcher__layerButton img:hover{opacity:1}.og-layerSwitcher__name{color:var(--grey8);font-size:12px;overflow:hidden;text-overflow:ellipsis;padding:3px;background-color:#00000080;bottom:0;border-bottom-left-radius:7px;border-bottom-right-radius:7px;z-index:10}.og-entityTree{width:100%}.og-entityTree__node{width:100%;box-sizing:border-box}.og-entityTree__row{display:flex;align-items:center;min-height:22px}.og-entityTree__toggleBtn{width:20px;height:20px;border:none;background:transparent;color:var(--grey3);cursor:pointer;border-radius:4px;padding:0;font-size:14px}.og-entityTree__toggleBtn_hasChildren:hover{background-color:var(--grey1)}.og-entityTree__toggleBtn_empty{visibility:hidden;pointer-events:none}.og-entityTree__entityBtn{flex:1;min-width:0;border:none;background:transparent;color:var(--grey6);display:flex;align-items:center;justify-content:space-between;gap:8px;text-align:left;cursor:pointer;border-radius:4px;padding:3px 6px 3px 4px;font-size:12px}.og-entityTree__entityBtn:hover,.og-entityTree__entityBtn:focus-visible{background-color:var(--grey1)}.og-entityTree__name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.og-entityTree__type{color:var(--grey9);font-size:11px;white-space:nowrap}.og-entityTree__children_hidden{display:none}.og-entityTree__children{padding-left:17px}.og-entityTreeControl{position:relative;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;color:var(--grey4)}.og-entityTreeControl__tree{width:100%;padding:4px;box-sizing:border-box}.og-entityTreeControl__empty{padding:10px 8px;color:var(--grey3);font-size:13px}.displayNone{display:none}.displayBlock{display:block}.og-drawing-default_button .og-button-icon{transform:scale(.73)}.ogConsole{position:absolute;top:0;left:0;width:100%;max-height:70%;overflow:auto;font-size:14px;font-family:Arial;background-color:#8282827d;color:#fff;z-index:100000000}.ogConsole-text{padding:7px;overflow:hidden}.ogConsole-error{color:red}.ogConsole-warning{color:#ff0}.ogViewExtentBtn{margin-left:12px;height:24px;width:24px;scale:70%;cursor:pointer;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==) center center no-repeat}.ogViewExtentBtn:hover{border-radius:10px;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==) center center no-repeat,var(--blue0)}.og-debuginfo_controls{padding-bottom:8px;display:flex}.og-debuginfo_controls-button{width:25px;height:25px;float:left;margin:3px}.og-debug-info{color:#fff;font-size:12px;padding:10px}.og-debug-info .og-watch-line{width:100%;padding-bottom:5px;display:flex;flex-direction:row}.og-watch-line .og-watch-label{color:#cecece;width:200px}.og-watch-line .og-watch-value{margin-left:15px}.og-popup{position:absolute;text-align:center;bottom:-2px}.og-popup-content-wrapper,.og-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px #0006}.og-popup-content-wrapper{background:#fff;color:#333;box-shadow:0 3px 14px #0006;padding:1px;text-align:left;border-radius:8px;min-width:30px;min-height:17px}.og-popup-content{margin:20px 5px 5px;line-height:1.4}.og-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none;bottom:-19px}.og-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.og-popup-toolbar{position:absolute;top:3px;right:2px;display:inline-block}.og-popup-btn{width:15px;height:15px;cursor:pointer;float:right}.og-popup-btn:hover{color:#2e9be7}.og-popup-title{position:absolute;left:5px;top:3px;font-size:14px}.og-scale-container{position:absolute;right:320px;bottom:30px}.og-scale-label{position:relative;color:#fff;font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:12px;text-align:center}.og-scale-ruler{position:relative;height:7px;border-bottom:2px solid white;border-left:1px solid white;border-right:1px solid white}.og-compass-button .og-button-icon{display:flex;align-items:center;justify-content:center;transform-origin:center center}.og-compass-button .og-button-icon svg{width:48px!important;height:48px!important;display:block}.og-orthoswitcher_button .og-button-icon svg{width:45px!important;height:45px!important;display:block;transform:translateY(3px)}.og-suncontrol-button{width:25px;height:25px;float:left;margin:3px}.og-lighing{position:relative;padding:12px;height:calc(100% - 30px);color:#b6b6b6}.og-lighing .og-layers{display:flex;flex-direction:row;align-items:center}.og-lighing .og-caption{position:relative}.og-emptyline,.og-lighing .og-lighting-emptyline{width:100%;padding:3px}.og-emptyline-2{width:100%;padding:5px}.og-lighing .og-slider{width:100%}.og-lighing .og-slider .og-slider-label,.og-lighing .og-color-label{width:100px;font-size:12px}.og-lighing .og-color{padding-right:10px}.og-lighing #layers{font-family:monospace;padding:2px;margin-left:21px;width:200px}.og-coordinates{position:absolute;bottom:25px;right:12px;text-align:right;overflow:hidden;font-family:monospace;font-size:1em;cursor:pointer;float:left;background-color:var(--grey5);color:var(--grey8);padding:5px;border-radius:4px}.og-coordinates div{float:left}.og-coordinates .og-coordinates-copy-btn{float:left;margin-right:6px;padding:0;border:0;background:transparent;color:var(--grey8);opacity:.8;cursor:pointer}.og-coordinates .og-coordinates-copy-btn:hover{opacity:1}.og-coordinates .og-coordinates-copy-btn svg{display:block;transform:translateY(1px)}.og-coordinates .og-coordinates-copy-btn svg path{fill:currentColor}.og-lat-side,.og-lon-side{width:10px;padding-right:3px}.og-lat-val,.og-lon-val{width:90px;padding-right:3px;text-align:left;text-overflow:unset;overflow:hidden}.og-height{width:50px;text-align:right;text-overflow:ellipsis;padding-left:3px;overflow:hidden}.og-units-height{width:15px;text-align:left;padding-left:3px}.og-center-icon{height:12px;width:12px;margin-bottom:-3.5px;margin-right:-7.5px;bottom:50%;right:50%;position:absolute;pointer-events:none}.og-atmosphere.og-options-container .og-slider-label{width:300px;overflow:hidden;height:20px}.og-atmosphere.og-options-container .og-slider input{width:87px}.og-timeline-control_button{width:25px;height:20px;margin-left:3px;margin-right:3px;background:var(--grey7);border-radius:1px}.og-timeline-control_button.og-button__active{background:var(--grey3)}.og-timeline{width:100%;height:100%;background:#2d2d2d;position:relative;left:0;bottom:0;overflow:hidden}.og-timeline-frame{position:relative;width:calc(100% - 20px);margin:0 0 0 10px;height:30px}.og-timeline-scale{overflow:hidden;width:100%;height:100%;touch-action:none}.og-timeline-current{position:absolute;left:0;width:11px;height:100%;margin-left:-5px;cursor:pointer;margin-top:-7px;touch-action:none}.og-timeline-current-spin{margin:0 auto;width:1px;height:100%;background-color:#ff3434;pointer-events:none}.og-timeline-current-arrow{width:0;height:0;border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ff3434;margin-left:-6px}.og-timeline-bottom{width:100%;display:flex;position:relative;justify-content:center;margin-top:3px}.og-timeline-controls{position:relative;border-radius:10px;display:flex;flex-direction:row;justify-content:center;align-items:center;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{width:100%;display:block;height:15px}.og-slider{display:flex;flex-direction:row;gap:5px;margin:5px}.og-slider .og-slider-label{width:100%;height:100%;color:var(--grey6);font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:14px;display:flex;align-items:center;text-align:left;margin-right:5px}.og-slider .og-slider-panel{position:relative;width:100%;height:20px;background-color:var(--grey1);z-index:1;border-radius:2px}.og-slider .og-slider-panel .og-slider-progress{position:absolute;height:100%;background-color:var(--grey7);pointer-events:none;border-top-left-radius:2px;border-bottom-left-radius:2px}.og-slider .og-slider-panel .og-slider-pointer{position:absolute;left:0;top:0;height:100%;width:3px;background-color:var(--grey3);pointer-events:none}.og-slider input{position:relative;height:100%;width:100%;background:var(--grey5);border:1px solid var(--grey1);z-index:0;color:var(--grey3);padding-left:5px;width:60px;border-radius:2px}.og-slider input:focus-visible{outline:none}.og-slider input::-webkit-outer-spin-button,.og-slider input::-webkit-inner-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{width:100%;height:100%;color:var(--grey6);font-family:Segoe UI,Frutiger,Frutiger Linotype,Dejavu Sans,Helvetica Neue,Arial,sans-serif;font-size:14px;align-items:center;text-align:left;margin-right:5px}.og-checkbox input,.og-input input{position:relative;height:100%;width:100%;background:var(--grey5);border:1px solid var(--grey1);z-index:0;color:var(--grey3);padding-left:5px;border-radius:5px}.og-checkbox input:focus-visible,.og-input input:focus-visible{outline:none}.og-checkbox input[type=checkbox]{width:14px;height:14px;-moz-appearance:none;appearance:none;-webkit-appearance:none;display:flex;align-content:center;justify-content:center;border:1px solid var(--grey1);border-radius:3px;background:var(--grey8);cursor:pointer;position:relative;padding:0}.og-checkbox input[type=checkbox]:before{content:"";position:absolute;width:3px;height:6px;border:solid black;border-width:0 2px 2px 0;transform:rotate(45deg);top:2px;left:3.5px;opacity:0;transition:opacity .2s ease-in-out}.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{pointer-events:none;opacity:.7}.og-input-disabled input[type=checkbox]{background:var(--grey9)}.og-input input[type=number]{-moz-appearance:textfield}.og-elevationprofile{width:100%;height:100%;position:absolute;overflow:hidden}.og-elevationprofile__container{position:relative;width:100%;height:100%;display:flex;flex-direction:column;align-content:center;align-items:center}.og-elevationprofile__menu{position:relative;width:100%;height:43px}.og-elevationprofile__graph{position:relative;width:100%;height:100%}.og-elevationprofile-legend{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;font-size:12px;color:var(--grey8);position:absolute;top:0;right:0;margin:5px;display:flex;z-index:1}.og-elevationprofile-legend__row{position:relative;padding:5px;width:70px}.og-elevationprofile-square{position:relative;float:left;width:6px;height:6px;margin:5px}.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;position:relative;float:left;padding-left:5px}.og-elevationprofile-value{width:30px;display:inline-block;position:relative;float:left;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.og-elevationprofile-buttons{display:inline-block;position:absolute;top:0;left:0}.og-elevationprofile-button{width:25px;height:25px;float:left;margin:3px}.og-elevationprofile-list{position:relative;width:100%;height:100%;display:flex;flex-direction:column}.og-elevationprofile-list textarea{position:relative;width:100%;height:100%;resize:none;background:var(--grey8);padding:5px}.og-elevationprofile-list-buttons{position:relative;height:60px;display:flex;flex-direction:row;align-items:center;justify-content:right}.og-elevationprofile-list-apply{padding:4px 10px 7px;float:right;background-color:var(--grey2);margin-right:15px}.og-elevationprofile_pointer{position:absolute;left:0;top:0;height:100%}.og-elevationprofile-line{position:absolute;background-color:#fff;width:3px;height:30px;margin-left:-1.5px}.og-elevationprofile-label{position:absolute;top:0;left:0;color:#fff}.og-elevationprofile-button__location svg{width:17px;height:17px}.og-elevationprofile-loading{opacity:.3;background-color:#000;position:absolute;width:100%;height:100%;z-index:2;display:flex;flex-direction:row;justify-content:center;align-items:center}.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{position:absolute;width:11px;height:40px;top:30px;animation:ldio-p0v5a1f6oz .9345794392523364s cubic-bezier(.5,0,.5,1) infinite}.ldio-p0v5a1f6oz div:nth-child(1){transform:translate(14.5px);background:#353535;animation-delay:-.5607476635514018s}.ldio-p0v5a1f6oz div:nth-child(2){transform:translate(34.5px);background:#666;animation-delay:-.37383177570093457s}.ldio-p0v5a1f6oz div:nth-child(3){transform:translate(54.5px);background:#9b9b9b;animation-delay:-.18691588785046728s}.ldio-p0v5a1f6oz div:nth-child(4){transform:translate(74.5px);background:#d4d4d4;animation-delay:-.9345794392523364s}.loadingio-spinner-bars-r354qqyl5v{width:88px;height:88px;display:inline-block;overflow:hidden;background:none}.ldio-p0v5a1f6oz{width:100%;height:100%;position:relative;transform:translateZ(0) scale(.88);backface-visibility:hidden;transform-origin:0 0}.ldio-p0v5a1f6oz div{box-sizing:content-box}.og-editor-ground_button{width:fit-content;background:var(--grey1);padding:4px 6px 8px;margin-left:5px;margin-top:15px}.og-editor_toolbar{padding-bottom:8px;display:flex}.og-editor_toolbar-button{width:25px;height:25px;float:left;margin:3px}.og-object3d-manager .og-ddialog-container{display:flex;flex-direction:column}.og-object3d-collection{width:100%;height:100%}.og-object3d-collection__item{width:75px;height:75px;position:relative;background-color:#7a7a7a;cursor:pointer;border-radius:5px;margin:3px;border:2px solid rgba(0,0,0,0)}.og-object3d-collection__item.active{border:solid #00e0be 2px}.og-object3d-collection__item_name{width:100%;height:20px;position:absolute;left:0;bottom:0;background:#3d3d3da3;color:#fff;padding-top:3px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}