bruce-cesium 2.8.3 → 2.8.4

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.
@@ -1,6 +1,6 @@
1
1
  import { BruceEvent, Cartes, Carto, Entity as Entity$1, Geometry, Tileset, MathUtils, LRUCache, ZoomControl, Style, EntityTag, Calculator, EntityLod, EntityType, ClientFile, ObjectUtils, Bounds, EntityRelationType, DelayQueue, BatchedDataGetter, EntityCoords, EntityFilterGetter, EntitySource, MenuItem, EntityRelation, ENVIRONMENT, ProjectView, ProjectViewBookmark, ProjectViewTile, ProjectViewLegacyTile, ProgramKey, Camera, AbstractApi, EntityAttachment, EntityAttachmentType, EntityAttribute } from 'bruce-models';
2
2
  import * as Cesium from 'cesium';
3
- import { Cartographic, Cartesian2, CallbackProperty, Cartesian3, Color, Rectangle, Math as Math$1, JulianDate, SceneMode, Entity, Primitive, Cesium3DTileFeature, HeightReference, DistanceDisplayCondition, NearFarScalar, HorizontalOrigin, VerticalOrigin, ClassificationType, ArcType, CornerType, ShadowMode, PolygonHierarchy, PolylineGraphics, HeadingPitchRoll, Transforms, ColorBlendMode, Cesium3DTileColorBlendMode, HeadingPitchRange, createOsmBuildings, Cesium3DTileStyle, KmlDataSource, SceneTransforms, Cesium3DTileset, Matrix4, Matrix3, IonResource, Ion, OrthographicFrustum, EasingFunction, createWorldTerrain, EllipsoidTerrainProvider, CesiumTerrainProvider, BingMapsImageryProvider, BingMapsStyle, MapboxImageryProvider, MapboxStyleImageryProvider, ArcGisMapServerImageryProvider, OpenStreetMapImageryProvider, GridImageryProvider, GeographicTilingScheme, ImageryLayer, UrlTemplateImageryProvider, TileMapServiceImageryProvider, IonImageryProvider, CesiumInspector, defined, PolygonPipeline, EllipsoidGeodesic, sampleTerrainMostDetailed, Model, ColorMaterialProperty, GeometryInstance, ScreenSpaceEventHandler, ScreenSpaceEventType, BoundingSphere } from 'cesium';
3
+ import { Cartographic, Cartesian2, CallbackProperty, Cartesian3, Color, Rectangle, Math as Math$1, Entity, Primitive, Cesium3DTileFeature, JulianDate, HeightReference, DistanceDisplayCondition, NearFarScalar, HorizontalOrigin, VerticalOrigin, ClassificationType, ArcType, CornerType, ShadowMode, PolygonHierarchy, PolylineGraphics, HeadingPitchRoll, Transforms, ColorBlendMode, SceneMode, Cesium3DTileColorBlendMode, HeadingPitchRange, createOsmBuildings, Cesium3DTileStyle, KmlDataSource, OrthographicFrustum, EasingFunction, SceneTransforms, EllipsoidTerrainProvider, CesiumInspector, defined, EllipsoidGeodesic, sampleTerrainMostDetailed, Cesium3DTileset, Model, createWorldTerrain, CesiumTerrainProvider, BingMapsImageryProvider, BingMapsStyle, MapboxImageryProvider, MapboxStyleImageryProvider, ArcGisMapServerImageryProvider, OpenStreetMapImageryProvider, GridImageryProvider, GeographicTilingScheme, ImageryLayer, UrlTemplateImageryProvider, TileMapServiceImageryProvider, IonImageryProvider, Matrix4, Matrix3, IonResource, Ion, PolygonPipeline, ScreenSpaceEventHandler, ScreenSpaceEventType, ColorMaterialProperty, GeometryInstance, BoundingSphere } from 'cesium';
4
4
 
5
5
  var TIME_LAG = 300;
6
6
  var POSITION_CHECK_TIMER = 950;
@@ -1741,7 +1741,7 @@ function getName(api, entity) {
1741
1741
  type: type,
1742
1742
  defaultToId: false
1743
1743
  });
1744
- return [2 /*return*/, name_1 ? name_1 : "Unnamed entity"];
1744
+ return [2 /*return*/, name_1 ? name_1 : "Unnamed Entity"];
1745
1745
  }
1746
1746
  return [3 /*break*/, 4];
1747
1747
  case 3:
@@ -3716,16 +3716,13 @@ var RelationRenderEngine;
3716
3716
  })(Parabola = RelationRenderEngine.Parabola || (RelationRenderEngine.Parabola = {}));
3717
3717
  })(RelationRenderEngine || (RelationRenderEngine = {}));
3718
3718
 
3719
- // Key where the label instance is stored within the cesium entity.
3720
- // Eg: cEntity[ATTACH_KEY] = new EntityLabel(...);
3721
- var ATTACH_KEY = "nextspace-navigator-entity-label";
3722
3719
  /**
3723
3720
  * Returns cesium property's value.
3724
3721
  * This will check if it's one that changes over time, or just a fixed value.
3725
3722
  * Eg: const pos3d = getValue<Cesium.Cartesian3>(cViewer, cEntity.point.position);
3726
3723
  * @param viewer
3727
3724
  * @param obj
3728
- */
3725
+ */
3729
3726
  function getValue$1(viewer, obj) {
3730
3727
  if (obj === null || obj === void 0 ? void 0 : obj.getValue) {
3731
3728
  return obj.getValue(viewer.scene.lastRenderTime);
@@ -3734,9 +3731,12 @@ function getValue$1(viewer, obj) {
3734
3731
  }
3735
3732
  /**
3736
3733
  * Util for generating labels within cesium space on entities.
3737
- */
3734
+ */
3738
3735
  var EntityLabel;
3739
3736
  (function (EntityLabel) {
3737
+ // Key where the label instance is stored within the cesium entity.
3738
+ // Eg: rego[ATTACH_KEY] = new EntityLabel(...);
3739
+ EntityLabel.ATTACH_KEY = "nextspace-navigator-entity-label";
3740
3740
  var Label = /** @class */ (function () {
3741
3741
  function Label(params) {
3742
3742
  var _this = this;
@@ -3747,16 +3747,28 @@ var EntityLabel;
3747
3747
  // Indicates the label was disposed and any actions will be ignored.
3748
3748
  this.disposed = false;
3749
3749
  this.creating = false;
3750
+ // Calculated pos3d for the label.
3751
+ // Override to make it draw at a different position.
3752
+ this.pos3d = null;
3750
3753
  this.rego = params.rego;
3751
3754
  this.viewer = params.viewer;
3755
+ this.api = params.api;
3756
+ this.visualRegister = params.visualRegister;
3752
3757
  this.creating = true;
3753
- this.createCLabel().then(function () {
3758
+ this.createCLabel(params.pos3d).then(function () {
3754
3759
  _this.creating = false;
3755
3760
  }).catch(function (e) {
3756
3761
  console.error("Failed to create label", e);
3757
3762
  _this.creating = false;
3758
3763
  });
3759
3764
  }
3765
+ Object.defineProperty(Label.prototype, "Rego", {
3766
+ get: function () {
3767
+ return this.rego;
3768
+ },
3769
+ enumerable: false,
3770
+ configurable: true
3771
+ });
3760
3772
  Object.defineProperty(Label.prototype, "Disposed", {
3761
3773
  get: function () {
3762
3774
  return this.disposed;
@@ -3792,161 +3804,222 @@ var EntityLabel;
3792
3804
  };
3793
3805
  /**
3794
3806
  * Creates cesium entity for the label if one does not exist.
3807
+ * @param pos23 optional position to create label at.
3795
3808
  */
3796
- Label.prototype.createCLabel = function () {
3797
- var _a, _b, _c;
3809
+ Label.prototype.createCLabel = function (pos3d) {
3810
+ var _a, _b, _c, _d, _e, _f;
3798
3811
  return __awaiter(this, void 0, void 0, function () {
3799
- var pos3d, heightRef, heightOffset, pixelOffset, visual, isClamped, height, scale, carto, text, ele, _lastDistance, _lastCameraPos, getDistance, MAX_DISTANCE, updateLabel;
3812
+ var heightRef, heightOffset, pixelOffset, visual, isClamped, height, scale, featureAny, propertyNames, latProp, lonProp, lat, lon, latIsRad, lonIsRad, latIsDeg, lonIsDeg, carto, text, ele, _lastDistance, _lastCameraPos, getDistance, MAX_DISTANCE, updateLabel;
3800
3813
  var _this = this;
3801
- return __generator(this, function (_d) {
3802
- if (this.label || this.disposed) {
3803
- return [2 /*return*/];
3804
- }
3805
- pos3d = null;
3806
- heightRef = null;
3807
- heightOffset = 10;
3808
- pixelOffset = new Cartesian2(0, 0);
3809
- visual = (_a = this.rego) === null || _a === void 0 ? void 0 : _a.visual;
3810
- if (visual && visual instanceof Entity) {
3811
- if (visual.polygon) {
3812
- heightRef = getValue$1(this.viewer, visual.polygon.heightReference);
3813
- }
3814
- else if (visual.polyline) {
3815
- isClamped = getValue$1(this.viewer, visual.polyline.clampToGround);
3816
- heightRef = isClamped == false ? HeightReference.NONE : HeightReference.CLAMP_TO_GROUND;
3817
- }
3818
- else if (visual.model) {
3819
- heightRef = getValue$1(this.viewer, visual.model.heightReference);
3820
- }
3821
- else if (visual.point) {
3822
- heightRef = getValue$1(this.viewer, visual.point.heightReference);
3823
- }
3824
- else if (visual.billboard) {
3825
- heightRef = getValue$1(this.viewer, visual.billboard.heightReference);
3826
- height = getValue$1(this.viewer, visual.billboard.height);
3827
- if (height) {
3828
- scale = EnsureNumber(getValue$1(this.viewer, visual.billboard.scale), 1);
3829
- pixelOffset.y = -(height * scale);
3814
+ return __generator(this, function (_g) {
3815
+ switch (_g.label) {
3816
+ case 0:
3817
+ if (this.label || this.disposed) {
3818
+ return [2 /*return*/];
3819
+ }
3820
+ heightRef = null;
3821
+ heightOffset = 10;
3822
+ pixelOffset = new Cartesian2(0, 0);
3823
+ if (!isNaN(pos3d === null || pos3d === void 0 ? void 0 : pos3d.x)) return [3 /*break*/, 3];
3824
+ visual = (_a = this.rego) === null || _a === void 0 ? void 0 : _a.visual;
3825
+ if (visual && visual instanceof Entity) {
3826
+ if (visual.polygon) {
3827
+ heightRef = getValue$1(this.viewer, visual.polygon.heightReference);
3828
+ }
3829
+ else if (visual.polyline) {
3830
+ isClamped = getValue$1(this.viewer, visual.polyline.clampToGround);
3831
+ heightRef = isClamped == false ? HeightReference.NONE : HeightReference.CLAMP_TO_GROUND;
3832
+ }
3833
+ else if (visual.model) {
3834
+ heightRef = getValue$1(this.viewer, visual.model.heightReference);
3835
+ }
3836
+ else if (visual.point) {
3837
+ heightRef = getValue$1(this.viewer, visual.point.heightReference);
3838
+ }
3839
+ else if (visual.billboard) {
3840
+ heightRef = getValue$1(this.viewer, visual.billboard.heightReference);
3841
+ height = getValue$1(this.viewer, visual.billboard.height);
3842
+ if (height) {
3843
+ scale = EnsureNumber(getValue$1(this.viewer, visual.billboard.scale), 1);
3844
+ pixelOffset.y = -(height * scale);
3845
+ }
3846
+ // Flat padding.
3847
+ pixelOffset.y -= 5;
3848
+ heightOffset = 0;
3849
+ }
3850
+ else if (visual.corridor) {
3851
+ heightRef = getValue$1(this.viewer, visual.corridor.heightReference);
3852
+ }
3853
+ else if (visual.ellipse) {
3854
+ heightRef = getValue$1(this.viewer, visual.ellipse.heightReference);
3855
+ }
3856
+ pos3d = getValue$1(this.viewer, visual.position);
3857
+ }
3858
+ else if (visual instanceof Cesium3DTileFeature) {
3859
+ featureAny = visual;
3860
+ propertyNames = featureAny.getPropertyNames ? featureAny.getPropertyNames() : (_b = featureAny.getPropertyIds) === null || _b === void 0 ? void 0 : _b.call(featureAny);
3861
+ if (propertyNames === null || propertyNames === void 0 ? void 0 : propertyNames.length) {
3862
+ latProp = propertyNames.find(function (x) { return x.toLowerCase().includes("lat"); });
3863
+ lonProp = propertyNames.find(function (x) { return x.toLowerCase().includes("lon"); });
3864
+ lat = latProp ? featureAny.getProperty(latProp) : null;
3865
+ lon = lonProp ? featureAny.getProperty(lonProp) : null;
3866
+ if (lat && lon) {
3867
+ latIsRad = typeof lat == "number" && lat > -Math.PI && lat < Math.PI;
3868
+ lonIsRad = typeof lon == "number" && lon > -Math.PI && lon < Math.PI;
3869
+ latIsDeg = typeof lat == "number" && lat > -180 && lat < 180;
3870
+ lonIsDeg = typeof lon == "number" && lon > -180 && lon < 180;
3871
+ if (latIsRad && lonIsRad) {
3872
+ pos3d = Cartographic.toCartesian(Cartographic.fromRadians(lon, lat, 0));
3873
+ }
3874
+ else if (latIsDeg && lonIsDeg) {
3875
+ pos3d = Cartographic.toCartesian(Cartographic.fromDegrees(lon, lat, 0));
3876
+ }
3877
+ heightRef = HeightReference.CLAMP_TO_GROUND;
3878
+ }
3879
+ }
3830
3880
  }
3881
+ if (!isNaN(pos3d === null || pos3d === void 0 ? void 0 : pos3d.x)) return [3 /*break*/, 2];
3882
+ return [4 /*yield*/, EntityUtils.GetPosAsync({
3883
+ viewer: this.viewer,
3884
+ api: this.api,
3885
+ entityId: (_c = this.rego) === null || _c === void 0 ? void 0 : _c.entityId,
3886
+ returnHeightRef: HeightReference.NONE,
3887
+ tilesetId: (_d = this.rego) === null || _d === void 0 ? void 0 : _d.tilesetId,
3888
+ visualRegister: this.visualRegister
3889
+ })];
3890
+ case 1:
3891
+ pos3d = _g.sent();
3892
+ heightRef = HeightReference.NONE;
3893
+ _g.label = 2;
3894
+ case 2: return [3 /*break*/, 4];
3895
+ case 3:
3896
+ heightRef = HeightReference.NONE;
3831
3897
  // Flat padding.
3832
- pixelOffset.y -= 5;
3833
3898
  heightOffset = 0;
3834
- }
3835
- else if (visual.corridor) {
3836
- heightRef = getValue$1(this.viewer, visual.corridor.heightReference);
3837
- }
3838
- else if (visual.ellipse) {
3839
- heightRef = getValue$1(this.viewer, visual.ellipse.heightReference);
3840
- }
3841
- pos3d = getValue$1(this.viewer, visual.position);
3842
- }
3843
- if (isNaN(pos3d === null || pos3d === void 0 ? void 0 : pos3d.x)) {
3844
- return [2 /*return*/];
3899
+ pixelOffset.y = -15;
3900
+ _g.label = 4;
3901
+ case 4:
3902
+ if (isNaN(pos3d === null || pos3d === void 0 ? void 0 : pos3d.x)) {
3903
+ return [2 /*return*/];
3904
+ }
3905
+ pos3d = DrawingUtils.EnsurePosHeight({
3906
+ desiredHeightRef: HeightReference.NONE,
3907
+ heightRef: heightRef,
3908
+ pos3d: pos3d,
3909
+ viewer: this.viewer
3910
+ });
3911
+ if (isNaN(pos3d === null || pos3d === void 0 ? void 0 : pos3d.x)) {
3912
+ return [2 /*return*/];
3913
+ }
3914
+ if (heightOffset) {
3915
+ carto = Cartographic.fromCartesian(pos3d);
3916
+ // TODO: Check if we need to use heightRef and adjust to absolute height.
3917
+ // TODO: We should be smarter and not just add 10m to the height. Eg: use polygon extrusion.
3918
+ carto.height += heightOffset;
3919
+ pos3d = Cartographic.toCartesian(carto);
3920
+ }
3921
+ this.pos3d = pos3d;
3922
+ text = (_f = (_e = this.rego) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : "Unnamed Entity";
3923
+ ele = document.createElement("div");
3924
+ ele.innerHTML = text;
3925
+ ele.setAttribute("style", "\n position: absolute;\n z-index: 1;\n display: none;\n pointer-events: none;\n padding: 6px 8px;\n border-radius: 6px;\n font-family: Arial;\n font-size: 12px;\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n background: rgba(33,39,42,.8);\n border-radius: 9px;\n box-shadow: 0 0 1px rgba(18,22,25,.36),0 18px 36px -4px rgba(18,22,25,.36);\n color: #ffffff;\n }");
3926
+ this.label = ele;
3927
+ this.viewer.container.appendChild(ele);
3928
+ _lastDistance = null;
3929
+ _lastCameraPos = null;
3930
+ getDistance = function () {
3931
+ var _a;
3932
+ if (_this.disposed) {
3933
+ return null;
3934
+ }
3935
+ var cameraPos = (_a = _this.viewer.camera) === null || _a === void 0 ? void 0 : _a.position;
3936
+ if (isNaN(cameraPos === null || cameraPos === void 0 ? void 0 : cameraPos.x)) {
3937
+ return null;
3938
+ }
3939
+ // If camera hasn't moved much then we can use the last distance.
3940
+ var TOLERANCE = 0.1;
3941
+ if (_lastCameraPos) {
3942
+ var totalMovement = Math.abs(_lastCameraPos.x - cameraPos.x) +
3943
+ Math.abs(_lastCameraPos.y - cameraPos.y) +
3944
+ Math.abs(_lastCameraPos.z - cameraPos.z);
3945
+ if (totalMovement < TOLERANCE) {
3946
+ return _lastDistance;
3947
+ }
3948
+ }
3949
+ // Check if there is a raycast collision between camera and pos3d.
3950
+ // We'll let the labels draw through a ground collision.
3951
+ // Commented out while it is WIP.
3952
+ // const direction = Cesium.Cartesian3.subtract(pos3d, cameraPos, new Cesium.Cartesian3());
3953
+ // const ray = new Cesium.Ray(pos3d.clone(), direction);
3954
+ // const objects = (this.viewer.scene as any).drillPickFromRay(ray, 1, [visuals]);
3955
+ // if (objects && objects.length > 0) {
3956
+ // for (let i = 0; i < objects.length; ++i) {
3957
+ // const obj = objects[i];
3958
+ // if (!visuals.find(x => x == obj?.id)) {
3959
+ // let isGround = true;
3960
+ // if (obj.object) {
3961
+ // const url = obj.object?.primitive?._basePath;
3962
+ // if (url && typeof url == "string") {
3963
+ // isGround = url.includes("tile.googleapis.com");
3964
+ // }
3965
+ // else {
3966
+ // isGround = false;
3967
+ // }
3968
+ // }
3969
+ // if (!isGround) {
3970
+ // return null;
3971
+ // }
3972
+ // }
3973
+ // }
3974
+ // }
3975
+ var distance = Cartesian3.distance(cameraPos, _this.pos3d);
3976
+ _lastDistance = distance;
3977
+ _lastCameraPos = cameraPos.clone();
3978
+ return distance;
3979
+ };
3980
+ MAX_DISTANCE = 5000;
3981
+ updateLabel = function () {
3982
+ var _a;
3983
+ if (_this.disposed || isNaN((_a = _this.pos3d) === null || _a === void 0 ? void 0 : _a.x)) {
3984
+ return;
3985
+ }
3986
+ var distance = getDistance();
3987
+ if (isNaN(distance) || distance >= MAX_DISTANCE) {
3988
+ ele.style.display = "none";
3989
+ return;
3990
+ }
3991
+ var pos2d = SceneTransforms.wgs84ToWindowCoordinates(_this.viewer.scene, _this.pos3d);
3992
+ if (isNaN(pos2d === null || pos2d === void 0 ? void 0 : pos2d.x)) {
3993
+ ele.style.display = "none";
3994
+ return;
3995
+ }
3996
+ // If out of the screen then we can hide it.
3997
+ if (pos2d.x < 0 || pos2d.x > _this.viewer.canvas.clientWidth ||
3998
+ pos2d.y < 0 || pos2d.y > _this.viewer.canvas.clientHeight) {
3999
+ ele.style.display = "none";
4000
+ return;
4001
+ }
4002
+ ele.style.display = "block";
4003
+ // Check scale to apply based on distance between camera and pos3d.
4004
+ // We'll make the label smaller and less transparent when further away.
4005
+ var scale = 1 - (distance / MAX_DISTANCE);
4006
+ if (scale && scale > 0.15) {
4007
+ ele.style.transform = "scale(".concat(scale, ")");
4008
+ ele.style.opacity = "".concat(scale);
4009
+ var left = pos2d.x - (ele.clientWidth / 2) + pixelOffset.x;
4010
+ ele.style.left = "".concat(left, "px");
4011
+ var top_1 = pos2d.y - ele.clientHeight + (pixelOffset.y * scale);
4012
+ ele.style.top = "".concat(top_1, "px");
4013
+ }
4014
+ else {
4015
+ ele.style.transform = "";
4016
+ ele.style.opacity = "0";
4017
+ }
4018
+ };
4019
+ this.renderRemoval = this.viewer.scene.postUpdate.addEventListener(updateLabel);
4020
+ updateLabel();
4021
+ return [2 /*return*/];
3845
4022
  }
3846
- carto = Cartographic.fromCartesian(pos3d);
3847
- // TODO: Check if we need to use heightRef and adjust to absolute height.
3848
- // TODO: We should be smarter and not just add 10m to the height. Eg: use polygon extrusion.
3849
- carto.height += heightOffset;
3850
- pos3d = Cartographic.toCartesian(carto);
3851
- text = (_c = (_b = this.rego) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : "Unnamed Entity";
3852
- ele = document.createElement("div");
3853
- ele.innerHTML = text;
3854
- ele.setAttribute("style", "\n position: absolute;\n z-index: 1;\n display: none;\n pointer-events: none;\n padding: 6px;\n border-radius: 6px;\n font-family: sans-serif;\n font-size: 12px;\n background-color: #000000;\n color: #ffffff;\n }");
3855
- this.label = ele;
3856
- this.viewer.container.appendChild(ele);
3857
- _lastDistance = null;
3858
- _lastCameraPos = null;
3859
- getDistance = function () {
3860
- var _a;
3861
- if (_this.disposed) {
3862
- return null;
3863
- }
3864
- var cameraPos = (_a = _this.viewer.camera) === null || _a === void 0 ? void 0 : _a.position;
3865
- if (isNaN(cameraPos === null || cameraPos === void 0 ? void 0 : cameraPos.x)) {
3866
- return null;
3867
- }
3868
- // If camera hasn't moved much then we can use the last distance.
3869
- var TOLERANCE = 0.1;
3870
- if (_lastCameraPos) {
3871
- var totalMovement = Math.abs(_lastCameraPos.x - cameraPos.x) +
3872
- Math.abs(_lastCameraPos.y - cameraPos.y) +
3873
- Math.abs(_lastCameraPos.z - cameraPos.z);
3874
- if (totalMovement < TOLERANCE) {
3875
- return _lastDistance;
3876
- }
3877
- }
3878
- // Check if there is a raycast collision between camera and pos3d.
3879
- // We'll let the labels draw through a ground collision.
3880
- // Commented out while it is WIP.
3881
- // const direction = Cesium.Cartesian3.subtract(pos3d, cameraPos, new Cesium.Cartesian3());
3882
- // const ray = new Cesium.Ray(pos3d.clone(), direction);
3883
- // const objects = (this.viewer.scene as any).drillPickFromRay(ray, 1, [visuals]);
3884
- // if (objects && objects.length > 0) {
3885
- // for (let i = 0; i < objects.length; ++i) {
3886
- // const obj = objects[i];
3887
- // if (!visuals.find(x => x == obj?.id)) {
3888
- // let isGround = true;
3889
- // if (obj.object) {
3890
- // const url = obj.object?.primitive?._basePath;
3891
- // if (url && typeof url == "string") {
3892
- // isGround = url.includes("tile.googleapis.com");
3893
- // }
3894
- // else {
3895
- // isGround = false;
3896
- // }
3897
- // }
3898
- // if (!isGround) {
3899
- // return null;
3900
- // }
3901
- // }
3902
- // }
3903
- // }
3904
- var distance = Cartesian3.distance(cameraPos, pos3d);
3905
- _lastDistance = distance;
3906
- _lastCameraPos = cameraPos.clone();
3907
- return distance;
3908
- };
3909
- MAX_DISTANCE = 5000;
3910
- updateLabel = function () {
3911
- if (_this.disposed || isNaN(pos3d === null || pos3d === void 0 ? void 0 : pos3d.x)) {
3912
- return;
3913
- }
3914
- var distance = getDistance();
3915
- if (isNaN(distance) || distance >= MAX_DISTANCE) {
3916
- ele.style.display = "none";
3917
- return;
3918
- }
3919
- var pos2d = SceneTransforms.wgs84ToWindowCoordinates(_this.viewer.scene, pos3d);
3920
- if (isNaN(pos2d === null || pos2d === void 0 ? void 0 : pos2d.x)) {
3921
- ele.style.display = "none";
3922
- return;
3923
- }
3924
- // If out of the screen then we can hide it.
3925
- if (pos2d.x < 0 || pos2d.x > _this.viewer.canvas.clientWidth ||
3926
- pos2d.y < 0 || pos2d.y > _this.viewer.canvas.clientHeight) {
3927
- ele.style.display = "none";
3928
- return;
3929
- }
3930
- ele.style.display = "block";
3931
- // Check scale to apply based on distance between camera and pos3d.
3932
- // We'll make the label smaller and less transparent when further away.
3933
- var scale = 1 - (distance / MAX_DISTANCE);
3934
- if (scale && scale > 0.15) {
3935
- ele.style.transform = "scale(".concat(scale, ")");
3936
- ele.style.opacity = "".concat(scale);
3937
- var left = pos2d.x - (ele.clientWidth / 2) + pixelOffset.x;
3938
- ele.style.left = "".concat(left, "px");
3939
- var top_1 = pos2d.y - ele.clientHeight + (pixelOffset.y * scale);
3940
- ele.style.top = "".concat(top_1, "px");
3941
- }
3942
- else {
3943
- ele.style.transform = "";
3944
- ele.style.opacity = "0";
3945
- }
3946
- };
3947
- this.renderRemoval = this.viewer.scene.postUpdate.addEventListener(updateLabel);
3948
- updateLabel();
3949
- return [2 /*return*/];
3950
4023
  });
3951
4024
  });
3952
4025
  };
@@ -3958,14 +4031,18 @@ var EntityLabel;
3958
4031
  * If one exists then the action is ignored.
3959
4032
  */
3960
4033
  function Attach(params) {
3961
- var rego = params.rego, viewer = params.viewer;
3962
- if (!rego || !viewer || rego[ATTACH_KEY]) {
4034
+ var rego = params.rego, viewer = params.viewer, pos3d = params.pos3d, visualRegister = params.visualRegister, api = params.api;
4035
+ if (!rego || !viewer || rego[EntityLabel.ATTACH_KEY]) {
3963
4036
  return;
3964
4037
  }
3965
- rego[ATTACH_KEY] = new Label({
4038
+ rego[EntityLabel.ATTACH_KEY] = new Label({
3966
4039
  rego: rego,
3967
- viewer: viewer
4040
+ viewer: viewer,
4041
+ pos3d: pos3d,
4042
+ visualRegister: visualRegister,
4043
+ api: api
3968
4044
  });
4045
+ return rego[EntityLabel.ATTACH_KEY];
3969
4046
  }
3970
4047
  EntityLabel.Attach = Attach;
3971
4048
  /**
@@ -3973,15 +4050,34 @@ var EntityLabel;
3973
4050
  * If one doesn't exist then the action is ignored.
3974
4051
  */
3975
4052
  function Detatch(params) {
3976
- var _a, _b;
3977
- var rego = params.rego;
3978
- if (!rego || !rego[ATTACH_KEY]) {
4053
+ var _a, _b, _c;
4054
+ var rego = params.rego, label = params.label;
4055
+ if (!rego && label) {
4056
+ rego = label.Rego;
4057
+ }
4058
+ if (!rego || !rego[EntityLabel.ATTACH_KEY]) {
4059
+ if (label) {
4060
+ (_a = label.Dispose) === null || _a === void 0 ? void 0 : _a.call(label);
4061
+ }
3979
4062
  return;
3980
4063
  }
3981
- (_b = (_a = rego[ATTACH_KEY]).Dispose) === null || _b === void 0 ? void 0 : _b.call(_a);
3982
- rego[ATTACH_KEY] = null;
4064
+ (_c = (_b = rego[EntityLabel.ATTACH_KEY]).Dispose) === null || _c === void 0 ? void 0 : _c.call(_b);
4065
+ rego[EntityLabel.ATTACH_KEY] = null;
3983
4066
  }
3984
4067
  EntityLabel.Detatch = Detatch;
4068
+ /**
4069
+ * Returns label instance from given rego if one exists.
4070
+ * @param params
4071
+ * @returns
4072
+ */
4073
+ function GetLabel(params) {
4074
+ var rego = params.rego;
4075
+ if (!rego) {
4076
+ return null;
4077
+ }
4078
+ return rego[EntityLabel.ATTACH_KEY];
4079
+ }
4080
+ EntityLabel.GetLabel = GetLabel;
3985
4081
  })(EntityLabel || (EntityLabel = {}));
3986
4082
 
3987
4083
  /**
@@ -4121,7 +4217,9 @@ function updateEntity(viewer, entityId, register) {
4121
4217
  if (isLabelled && visible) {
4122
4218
  EntityLabel.Attach({
4123
4219
  rego: rego,
4124
- viewer: viewer
4220
+ viewer: viewer,
4221
+ api: register.ApiGetters.GetBruceApi(),
4222
+ visualRegister: register
4125
4223
  });
4126
4224
  }
4127
4225
  else {
@@ -4302,7 +4400,7 @@ var VisualsRegister;
4302
4400
  EVisualUpdateType["DeselectAll"] = "DESELECT_ALL";
4303
4401
  })(EVisualUpdateType = VisualsRegister.EVisualUpdateType || (VisualsRegister.EVisualUpdateType = {}));
4304
4402
  var Register = /** @class */ (function () {
4305
- function Register(viewer) {
4403
+ function Register(params) {
4306
4404
  this.id = ObjectUtils.UId();
4307
4405
  this.rego = {};
4308
4406
  this.onUpdate = null;
@@ -4315,7 +4413,8 @@ var VisualsRegister;
4315
4413
  // It will be drawn on the "best" visual, and only while the entity is visible.
4316
4414
  // Warning: this sucks for CAD entities.
4317
4415
  this.labelledEntityIds = [];
4318
- this.viewer = viewer;
4416
+ this.viewer = params.viewer;
4417
+ this.apiGetters = params.apiGetters;
4319
4418
  }
4320
4419
  Object.defineProperty(Register.prototype, "Id", {
4321
4420
  get: function () {
@@ -4331,6 +4430,13 @@ var VisualsRegister;
4331
4430
  enumerable: false,
4332
4431
  configurable: true
4333
4432
  });
4433
+ Object.defineProperty(Register.prototype, "ApiGetters", {
4434
+ get: function () {
4435
+ return this.apiGetters;
4436
+ },
4437
+ enumerable: false,
4438
+ configurable: true
4439
+ });
4334
4440
  Object.defineProperty(Register.prototype, "OnUpdate", {
4335
4441
  get: function () {
4336
4442
  if (!this.onUpdate) {
@@ -9927,15 +10033,29 @@ var MenuItemManager;
9927
10033
  function Manager(params) {
9928
10034
  this.items = [];
9929
10035
  this.onUpdate = null;
9930
- var viewer = params.viewer, visualsRegister = params.visualsRegister;
10036
+ var viewer = params.viewer, visualsRegister = params.visualsRegister, getters = params.getters;
9931
10037
  this.viewer = viewer;
10038
+ if (!getters) {
10039
+ getters = ENVIRONMENT.Api();
10040
+ }
10041
+ this.getters = getters;
9932
10042
  if (!visualsRegister) {
9933
- visualsRegister = new VisualsRegister.Register(viewer);
10043
+ visualsRegister = new VisualsRegister.Register({
10044
+ viewer: this.viewer,
10045
+ apiGetters: getters
10046
+ });
9934
10047
  }
9935
10048
  this.visualsRegister = visualsRegister;
9936
10049
  this.sharedGetters = new SharedGetters.Cache();
9937
10050
  this.sharedMonitor = new CesiumViewMonitor(this.viewer);
9938
10051
  }
10052
+ Object.defineProperty(Manager.prototype, "Getters", {
10053
+ get: function () {
10054
+ return this.getters;
10055
+ },
10056
+ enumerable: false,
10057
+ configurable: true
10058
+ });
9939
10059
  Object.defineProperty(Manager.prototype, "Viewer", {
9940
10060
  get: function () {
9941
10061
  return this.viewer;
@@ -9978,11 +10098,15 @@ var MenuItemManager;
9978
10098
  if (this.viewer.isDestroyed()) {
9979
10099
  return null;
9980
10100
  }
10101
+ if (!params.getters) {
10102
+ params.getters = this.getters;
10103
+ }
10104
+ // Deprecated. Backwards compatibility.
9981
10105
  if (!params.getters) {
9982
10106
  params.getters = ENVIRONMENT.Api();
9983
10107
  }
9984
- if (params.apiGetter && !params.getters) {
9985
- console.warn("RenderItem(): Please pass getters instead of apiGetter. This is now deprecated due to needing access to other kinds of apis.");
10108
+ if (params.apiGetter && !this.getters) {
10109
+ console.warn("RenderItem(): Please pass getters within menu-item-manager constructor. 'getters' and 'apiGetter' within RenderItem are now deprecated.");
9986
10110
  }
9987
10111
  else if (!params.apiGetter) {
9988
10112
  params.apiGetter = params.getters.GetBruceGetter();
@@ -15591,7 +15715,7 @@ var WidgetInfoView = /** @class */ (function (_super) {
15591
15715
  defaultToId: false
15592
15716
  });
15593
15717
  if (!name_1) {
15594
- name_1 = "Unnamed entity";
15718
+ name_1 = "Unnamed Entity";
15595
15719
  }
15596
15720
  this._title.style.display = "block";
15597
15721
  this._flyTo.style.display = "flex";
@@ -15817,12 +15941,15 @@ var ViewerUtils;
15817
15941
  * @returns
15818
15942
  */
15819
15943
  function GetManager(params) {
15820
- var viewer = params.viewer, createIfMissing = params.createIfMissing;
15944
+ var viewer = params.viewer, createIfMissing = params.createIfMissing, getters = params.getters;
15821
15945
  if (viewer[CESIUM_VIEWER_MANAGER_KEY]) {
15822
15946
  return viewer[CESIUM_VIEWER_MANAGER_KEY];
15823
15947
  }
15824
15948
  else if (createIfMissing != false) {
15825
- var manager = new MenuItemManager.Manager({ viewer: viewer });
15949
+ var manager = new MenuItemManager.Manager({
15950
+ viewer: viewer,
15951
+ getters: getters
15952
+ });
15826
15953
  viewer[CESIUM_VIEWER_MANAGER_KEY] = manager;
15827
15954
  return manager;
15828
15955
  }
@@ -15881,7 +16008,7 @@ var ViewerUtils;
15881
16008
  ViewerUtils.CreateWidgets = CreateWidgets;
15882
16009
  })(ViewerUtils || (ViewerUtils = {}));
15883
16010
 
15884
- var VERSION$1 = "2.8.3";
16011
+ var VERSION$1 = "2.8.4";
15885
16012
 
15886
16013
  export { VERSION$1 as VERSION, CesiumViewMonitor, ViewerUtils, MenuItemManager, EntityRenderEngine, MenuItemCreator, VisualsRegister, RenderManager, EntitiesIdsRenderManager, EntitiesLoadedRenderManager, EntitiesRenderManager, EntityRenderManager, TilesetCadRenderManager, TilesetArbRenderManager, TilesetEntitiesRenderManager, TilesetOsmRenderManager, TilesetPointcloudRenderManager, TilesetGooglePhotosRenderManager, DataSourceStaticKmlManager, RelationsRenderManager, SharedGetters, CesiumParabola, EntityLabel, ViewRenderEngine, TileRenderEngine, TilesetRenderEngine, CESIUM_INSPECTOR_KEY, ViewUtils, DrawingUtils, MeasureUtils, EntityUtils, Draw3dPolygon, Draw3dPolyline };
15887
16014
  //# sourceMappingURL=bruce-cesium.es5.js.map