bruce-cesium 7.5.2 → 7.5.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.
- package/dist/bruce-cesium.es5.js +358 -104
- package/dist/bruce-cesium.es5.js.map +1 -1
- package/dist/bruce-cesium.umd.js +356 -102
- package/dist/bruce-cesium.umd.js.map +1 -1
- package/dist/lib/bruce-cesium.js +1 -1
- package/dist/lib/rendering/entity-gatherer.js +3 -0
- package/dist/lib/rendering/entity-gatherer.js.map +1 -1
- package/dist/lib/rendering/entity-render-engine-model3d.js +8 -3
- package/dist/lib/rendering/entity-render-engine-model3d.js.map +1 -1
- package/dist/lib/rendering/entity-render-engine.js +0 -3
- package/dist/lib/rendering/entity-render-engine.js.map +1 -1
- package/dist/lib/rendering/tileset-styler.js +176 -44
- package/dist/lib/rendering/tileset-styler.js.map +1 -1
- package/dist/lib/rendering/visuals-register.js +37 -0
- package/dist/lib/rendering/visuals-register.js.map +1 -1
- package/dist/lib/utils/cesium-entity-styler.js +49 -0
- package/dist/lib/utils/cesium-entity-styler.js.map +1 -1
- package/dist/lib/utils/entity-utils.js +78 -55
- package/dist/lib/utils/entity-utils.js.map +1 -1
- package/dist/types/bruce-cesium.d.ts +1 -1
- package/dist/types/rendering/entity-gatherer.d.ts +1 -0
- package/dist/types/rendering/entity-render-engine.d.ts +5 -3
- package/dist/types/rendering/menu-item-manager.d.ts +2 -2
- package/dist/types/rendering/tileset-styler.d.ts +59 -0
- package/dist/types/rendering/visuals-register.d.ts +5 -0
- package/dist/types/utils/cesium-entity-styler.d.ts +20 -0
- package/package.json +2 -2
package/dist/bruce-cesium.umd.js
CHANGED
|
@@ -3026,6 +3026,7 @@
|
|
|
3026
3026
|
}
|
|
3027
3027
|
let _selectColor = Cesium.Color.fromAlpha(Cesium.Color.YELLOW, 0.5);
|
|
3028
3028
|
let _highlightColor = Cesium.Color.fromCssColorString("#33b1ff").withAlpha(0.5);
|
|
3029
|
+
const DIMMING_REGISTERS_KEY = "_nextspaceDimmingRegisters";
|
|
3029
3030
|
const STORE_COLOR_PREFIX = "_storeColor_";
|
|
3030
3031
|
function getStoreKey(key) {
|
|
3031
3032
|
return STORE_COLOR_PREFIX + key;
|
|
@@ -3182,6 +3183,10 @@
|
|
|
3182
3183
|
getColor$1(viewer, "default", graphic);
|
|
3183
3184
|
}
|
|
3184
3185
|
let color = (_a = getColor$1(viewer, key, graphic)) !== null && _a !== void 0 ? _a : Cesium.Color.WHITE;
|
|
3186
|
+
// A model that is itself dimmed stays see-through. Only the ones standing out from dimmed surroundings go opaque.
|
|
3187
|
+
if (key != "default" && (opacity == null || opacity >= 1) && exports.CesiumEntityStyler.IsSelectionOpaque(viewer, graphic)) {
|
|
3188
|
+
color = color.withAlpha(1);
|
|
3189
|
+
}
|
|
3185
3190
|
// If we're selecting and it's highlighted, don't change the color.
|
|
3186
3191
|
if (key != "select" || getKeyState(graphic, "highlight") == false) {
|
|
3187
3192
|
let animateMs = key == "highlight" ? ANIMATE_COLOR_HIGHLIGHT_MS : ANIMATE_COLOR_MS;
|
|
@@ -3352,6 +3357,50 @@
|
|
|
3352
3357
|
return value == null ? false : value;
|
|
3353
3358
|
}
|
|
3354
3359
|
(function (CesiumEntityStyler) {
|
|
3360
|
+
/**
|
|
3361
|
+
* Whether a graphic or visual is a 3D model, ie: a tileset feature from a CAD or assembly import, or a model Entity.
|
|
3362
|
+
* @param graphic
|
|
3363
|
+
*/
|
|
3364
|
+
function IsModel(graphic) {
|
|
3365
|
+
if (graphic instanceof Cesium.Entity) {
|
|
3366
|
+
return Boolean(graphic.model);
|
|
3367
|
+
}
|
|
3368
|
+
return graphic instanceof Cesium.Cesium3DTileFeature || graphic instanceof Cesium.ModelGraphics;
|
|
3369
|
+
}
|
|
3370
|
+
CesiumEntityStyler.IsModel = IsModel;
|
|
3371
|
+
/**
|
|
3372
|
+
* Whether a graphic is drawn with an opaque selection and highlight because something on its viewer is dimmed.
|
|
3373
|
+
* Only 3D models are. GIS graphics keep the colour's own alpha.
|
|
3374
|
+
* @param viewer
|
|
3375
|
+
* @param graphic
|
|
3376
|
+
*/
|
|
3377
|
+
function IsSelectionOpaque(viewer, graphic) {
|
|
3378
|
+
var _a;
|
|
3379
|
+
return Boolean((_a = viewer === null || viewer === void 0 ? void 0 : viewer[DIMMING_REGISTERS_KEY]) === null || _a === void 0 ? void 0 : _a.size) && IsModel(graphic);
|
|
3380
|
+
}
|
|
3381
|
+
CesiumEntityStyler.IsSelectionOpaque = IsSelectionOpaque;
|
|
3382
|
+
/**
|
|
3383
|
+
* Records whether a register dims anything on a viewer, by isolation or by opacity.
|
|
3384
|
+
* @param viewer
|
|
3385
|
+
* @param registerId
|
|
3386
|
+
* @param dimming
|
|
3387
|
+
* @returns Whether the viewer went into or out of dimming, so selected models can be recoloured.
|
|
3388
|
+
*/
|
|
3389
|
+
function SetDimming(viewer, registerId, dimming) {
|
|
3390
|
+
let ids = viewer[DIMMING_REGISTERS_KEY];
|
|
3391
|
+
const before = Boolean(ids === null || ids === void 0 ? void 0 : ids.size);
|
|
3392
|
+
if (dimming) {
|
|
3393
|
+
if (!ids) {
|
|
3394
|
+
ids = viewer[DIMMING_REGISTERS_KEY] = new Set();
|
|
3395
|
+
}
|
|
3396
|
+
ids.add(registerId);
|
|
3397
|
+
}
|
|
3398
|
+
else {
|
|
3399
|
+
ids === null || ids === void 0 ? void 0 : ids.delete(registerId);
|
|
3400
|
+
}
|
|
3401
|
+
return before !== Boolean(ids === null || ids === void 0 ? void 0 : ids.size);
|
|
3402
|
+
}
|
|
3403
|
+
CesiumEntityStyler.SetDimming = SetDimming;
|
|
3355
3404
|
function UpdateColorSetting(key, color) {
|
|
3356
3405
|
if (key == "highlight") {
|
|
3357
3406
|
_highlightColor = color.clone();
|
|
@@ -9836,6 +9885,8 @@
|
|
|
9836
9885
|
// Caches GetIsIsolatedAny(). `null` means "unknown, recompute".
|
|
9837
9886
|
// Invalidated on any write that could affect isolation.
|
|
9838
9887
|
this.isolatedAnyCache = null;
|
|
9888
|
+
// Set when isolation or opacity changes, so the next update checks whether anything is still dimmed.
|
|
9889
|
+
this.dimmingDirty = false;
|
|
9839
9890
|
// Caches GetIsolationOpacity(). `undefined` means "unknown, recompute", `null` means
|
|
9840
9891
|
// "isolation (if any) is the legacy boolean/full-hide kind, not a numeric dim".
|
|
9841
9892
|
// Invalidated alongside isolatedAnyCache.
|
|
@@ -10104,6 +10155,7 @@
|
|
|
10104
10155
|
this.updateQueueInterval = null;
|
|
10105
10156
|
return;
|
|
10106
10157
|
}
|
|
10158
|
+
this.syncDimming();
|
|
10107
10159
|
const batch = this.updateQueue.splice(0, BATCH_SIZE);
|
|
10108
10160
|
const cache = {};
|
|
10109
10161
|
for (let i = 0; i < batch.length; i++) {
|
|
@@ -10338,6 +10390,9 @@
|
|
|
10338
10390
|
this.isolatedAnyCache = null;
|
|
10339
10391
|
this.isolationOpacityCache = undefined;
|
|
10340
10392
|
}
|
|
10393
|
+
if (keys.includes("isolated") || keys.includes("opacity")) {
|
|
10394
|
+
this.dimmingDirty = true;
|
|
10395
|
+
}
|
|
10341
10396
|
let changed = false;
|
|
10342
10397
|
const eStates = this.states[entityId] || {};
|
|
10343
10398
|
this.states[entityId] = eStates;
|
|
@@ -10769,8 +10824,36 @@
|
|
|
10769
10824
|
const { rego } = params;
|
|
10770
10825
|
markEntity(this, rego, rego.visual, false);
|
|
10771
10826
|
}
|
|
10827
|
+
/**
|
|
10828
|
+
* Tells the styler whether this register dims anything, by isolation or opacity.
|
|
10829
|
+
*/
|
|
10830
|
+
syncDimming() {
|
|
10831
|
+
var _a, _b;
|
|
10832
|
+
if (!this.dimmingDirty) {
|
|
10833
|
+
return;
|
|
10834
|
+
}
|
|
10835
|
+
this.dimmingDirty = false;
|
|
10836
|
+
const dimming = Object.values(this.states).some(states => Object.values(states).some(state => state.isolated || (state.opacity != null && state.opacity < 1)));
|
|
10837
|
+
if (!exports.CesiumEntityStyler.SetDimming(this.viewer, this.id, dimming)) {
|
|
10838
|
+
return;
|
|
10839
|
+
}
|
|
10840
|
+
const entityIds = new Set([...this.GetSelected(), ...this.GetHighlighted()]);
|
|
10841
|
+
for (const entityId of entityIds) {
|
|
10842
|
+
for (const rego of (_a = this.rego[entityId]) !== null && _a !== void 0 ? _a : []) {
|
|
10843
|
+
if (exports.CesiumEntityStyler.IsModel(rego.visual)) {
|
|
10844
|
+
exports.CesiumEntityStyler.Refresh({
|
|
10845
|
+
viewer: this.viewer,
|
|
10846
|
+
entity: rego.visual,
|
|
10847
|
+
requestRender: false
|
|
10848
|
+
});
|
|
10849
|
+
}
|
|
10850
|
+
}
|
|
10851
|
+
}
|
|
10852
|
+
(_b = this.viewer.scene) === null || _b === void 0 ? void 0 : _b.requestRender();
|
|
10853
|
+
}
|
|
10772
10854
|
Dispose() {
|
|
10773
10855
|
var _a, _b, _c, _d, _e;
|
|
10856
|
+
exports.CesiumEntityStyler.SetDimming(this.viewer, this.id, false);
|
|
10774
10857
|
this.ClearLabelHover();
|
|
10775
10858
|
clearTimeout(this.hoverRingReset);
|
|
10776
10859
|
this.hoverRingState = {};
|
|
@@ -11397,6 +11480,7 @@
|
|
|
11397
11480
|
// Mutated `isolated` directly rather than through setStateValues().
|
|
11398
11481
|
this.isolatedAnyCache = false;
|
|
11399
11482
|
this.isolationOpacityCache = null;
|
|
11483
|
+
this.dimmingDirty = true;
|
|
11400
11484
|
}
|
|
11401
11485
|
if (changed && (params === null || params === void 0 ? void 0 : params.doUpdate) !== false) {
|
|
11402
11486
|
this.updateAllEntities({
|
|
@@ -12133,6 +12217,7 @@
|
|
|
12133
12217
|
}
|
|
12134
12218
|
}
|
|
12135
12219
|
async updateAllEntities(params) {
|
|
12220
|
+
this.syncDimming();
|
|
12136
12221
|
const ids = Object.keys(this.rego);
|
|
12137
12222
|
const interval = setInterval(() => {
|
|
12138
12223
|
const batch = ids.splice(0, 3000);
|
|
@@ -12227,6 +12312,7 @@
|
|
|
12227
12312
|
const clearedIds = new Set();
|
|
12228
12313
|
this.ForEachState((state) => {
|
|
12229
12314
|
if (!clearedIds.has(state.entityId) && state.opacity != null) {
|
|
12315
|
+
this.dimmingDirty = true;
|
|
12230
12316
|
this.markLazyExclusion(state.entityId);
|
|
12231
12317
|
this.queueUpdate({
|
|
12232
12318
|
entityId: state.entityId,
|
|
@@ -17169,6 +17255,9 @@
|
|
|
17169
17255
|
}
|
|
17170
17256
|
};
|
|
17171
17257
|
}
|
|
17258
|
+
HasEntityDataOverride(eId) {
|
|
17259
|
+
return this.entityDataOverrides.has(eId);
|
|
17260
|
+
}
|
|
17172
17261
|
SetEntityDataOverride(eId, entity) {
|
|
17173
17262
|
if (this.disposed) {
|
|
17174
17263
|
return;
|
|
@@ -17865,6 +17954,24 @@
|
|
|
17865
17954
|
}
|
|
17866
17955
|
return style;
|
|
17867
17956
|
}
|
|
17957
|
+
/**
|
|
17958
|
+
* Reads the baked attribute declaration from a loaded tileset, keyed by path.
|
|
17959
|
+
* @param cTileset
|
|
17960
|
+
*/
|
|
17961
|
+
function getBakedAttributes(cTileset) {
|
|
17962
|
+
var _a, _b;
|
|
17963
|
+
const result = new Map();
|
|
17964
|
+
const declared = (_b = (_a = cTileset === null || cTileset === void 0 ? void 0 : cTileset.extras) === null || _a === void 0 ? void 0 : _a.bruce) === null || _b === void 0 ? void 0 : _b.bakedAttributes;
|
|
17965
|
+
if (!Array.isArray(declared)) {
|
|
17966
|
+
return result;
|
|
17967
|
+
}
|
|
17968
|
+
for (const baked of declared) {
|
|
17969
|
+
if (Array.isArray(baked === null || baked === void 0 ? void 0 : baked.path) && baked.path.length && typeof baked.property == "string") {
|
|
17970
|
+
result.set(JSON.stringify(baked.path), baked);
|
|
17971
|
+
}
|
|
17972
|
+
}
|
|
17973
|
+
return result;
|
|
17974
|
+
}
|
|
17868
17975
|
function colorToCColor$3(color) {
|
|
17869
17976
|
return new Cesium.Color(color.red ? color.red / 255 : 0, color.green ? color.green / 255 : 0, color.blue ? color.blue / 255 : 0, color.alpha);
|
|
17870
17977
|
}
|
|
@@ -17935,6 +18042,10 @@
|
|
|
17935
18042
|
// When false the Entity data is still gathered and the regos still updated, but no colour is
|
|
17936
18043
|
// applied. A historic item that did not ask for styling needs the first without the second.
|
|
17937
18044
|
this.applyStyles = true;
|
|
18045
|
+
// Attribute values the tiles carry per feature, keyed by JSON path. Empty for a tileset without them.
|
|
18046
|
+
this.bakedAttributes = new Map();
|
|
18047
|
+
// Entities changed since the tileset was generated, so their baked values can no longer be trusted.
|
|
18048
|
+
this.bakedStaleIds = new Set();
|
|
17938
18049
|
this.reRenderState = new EntityReRenderMaintainState();
|
|
17939
18050
|
// More expensive process.
|
|
17940
18051
|
// When an Entity is styled, the rego is reviewed and updated if needed.
|
|
@@ -17976,6 +18087,7 @@
|
|
|
17976
18087
|
this.viewer = viewer;
|
|
17977
18088
|
this.api = api;
|
|
17978
18089
|
this.cTileset = cTileset;
|
|
18090
|
+
this.bakedAttributes = getBakedAttributes(cTileset);
|
|
17979
18091
|
this.register = register;
|
|
17980
18092
|
this.menuItemId = menuItemId;
|
|
17981
18093
|
this.historic = Boolean(historic);
|
|
@@ -18054,6 +18166,7 @@
|
|
|
18054
18166
|
for (const [internalId, entityId] of this.styledByInternalId) {
|
|
18055
18167
|
if (BModels.RecordChangeFeed.isEntityInternalIdInRangeString(rangeStr, internalId)) {
|
|
18056
18168
|
this.feedPendingRestyleIds.add(entityId);
|
|
18169
|
+
this.bakedStaleIds.add(entityId);
|
|
18057
18170
|
}
|
|
18058
18171
|
}
|
|
18059
18172
|
if (this.feedPendingRestyleIds.size && !this.feedRestyleThrottleTimer) {
|
|
@@ -18293,8 +18406,6 @@
|
|
|
18293
18406
|
console.error(e);
|
|
18294
18407
|
}
|
|
18295
18408
|
// Before we start the loop we'll do a single request for the needed Entity Types.
|
|
18296
|
-
// This will be aimed at rows that don't specify a Style and if the default fallback-
|
|
18297
|
-
//is set to 0 (using the default of the Entity Type).
|
|
18298
18409
|
const typeMap = new Map();
|
|
18299
18410
|
const typeIds = styleMapping.map(x => x.StyleID == -1 || Boolean(x.style) ? null : x.EntityTypeID).filter(x => !!x);
|
|
18300
18411
|
if (typeIds.length) {
|
|
@@ -18360,23 +18471,7 @@
|
|
|
18360
18471
|
}
|
|
18361
18472
|
this.styleMappingsLoaded.set(styleMap.EntityTypeID, true);
|
|
18362
18473
|
if (this.loaded) {
|
|
18363
|
-
|
|
18364
|
-
// then we can pass them to the gatherer now.
|
|
18365
|
-
const relatedIds = this.stylePendingEntityIds.get(styleMap.EntityTypeID);
|
|
18366
|
-
if (relatedIds) {
|
|
18367
|
-
if (this.getTilesetFeatureNeedsFullData(styleMap.EntityTypeID)) {
|
|
18368
|
-
this.entityGatherer.Queue(Array.from(relatedIds));
|
|
18369
|
-
}
|
|
18370
|
-
else {
|
|
18371
|
-
relatedIds.forEach(id => {
|
|
18372
|
-
const rego = this.getEntityRego(id);
|
|
18373
|
-
if (rego) {
|
|
18374
|
-
this.styleTilesetFeature(rego);
|
|
18375
|
-
}
|
|
18376
|
-
});
|
|
18377
|
-
}
|
|
18378
|
-
this.stylePendingEntityIds.delete(styleMap.EntityTypeID);
|
|
18379
|
-
}
|
|
18474
|
+
this.flushPendingForType(styleMap.EntityTypeID);
|
|
18380
18475
|
}
|
|
18381
18476
|
}
|
|
18382
18477
|
if (this.loadingCounter != counter) {
|
|
@@ -18392,22 +18487,63 @@
|
|
|
18392
18487
|
for (const key of pendingKeys) {
|
|
18393
18488
|
const relatedIds = this.stylePendingEntityIds.get(key);
|
|
18394
18489
|
if (relatedIds) {
|
|
18395
|
-
|
|
18396
|
-
this.entityGatherer.Queue(Array.from(relatedIds));
|
|
18397
|
-
}
|
|
18398
|
-
else {
|
|
18399
|
-
relatedIds.forEach(id => {
|
|
18400
|
-
const rego = this.getEntityRego(id);
|
|
18401
|
-
if (rego) {
|
|
18402
|
-
this.styleTilesetFeature(rego);
|
|
18403
|
-
}
|
|
18404
|
-
});
|
|
18405
|
-
}
|
|
18490
|
+
this.styleOrGatherIds(key, relatedIds);
|
|
18406
18491
|
}
|
|
18407
18492
|
}
|
|
18408
18493
|
this.stylePendingEntityIds.clear();
|
|
18409
18494
|
}
|
|
18410
18495
|
}
|
|
18496
|
+
/**
|
|
18497
|
+
* Passes the Entities waiting on an Entity Type's style on to be styled, now that the style is known.
|
|
18498
|
+
* @param entityTypeId
|
|
18499
|
+
*/
|
|
18500
|
+
flushPendingForType(entityTypeId) {
|
|
18501
|
+
const relatedIds = this.stylePendingEntityIds.get(entityTypeId);
|
|
18502
|
+
if (!relatedIds) {
|
|
18503
|
+
return;
|
|
18504
|
+
}
|
|
18505
|
+
this.styleOrGatherIds(entityTypeId, relatedIds);
|
|
18506
|
+
this.stylePendingEntityIds.delete(entityTypeId);
|
|
18507
|
+
}
|
|
18508
|
+
hasMappingRow(entityTypeId) {
|
|
18509
|
+
var _a;
|
|
18510
|
+
return Boolean((_a = this.styleMapping) === null || _a === void 0 ? void 0 : _a.some(x => x.EntityTypeID == entityTypeId));
|
|
18511
|
+
}
|
|
18512
|
+
/**
|
|
18513
|
+
* Loads the default style of an Entity Type that the style mapping does not list.
|
|
18514
|
+
* @param entityTypeId
|
|
18515
|
+
*/
|
|
18516
|
+
async loadEntityTypeDefaultStyle(entityTypeId) {
|
|
18517
|
+
const counter = this.loadingCounter;
|
|
18518
|
+
const styleMap = { EntityTypeID: entityTypeId, StyleID: 0, style: null };
|
|
18519
|
+
this.styleMapping.push(styleMap);
|
|
18520
|
+
try {
|
|
18521
|
+
const { entityType } = await BModels.EntityType.Get({
|
|
18522
|
+
api: this.api,
|
|
18523
|
+
entityTypeId
|
|
18524
|
+
});
|
|
18525
|
+
const styleId = entityType === null || entityType === void 0 ? void 0 : entityType["DisplaySetting.ID"];
|
|
18526
|
+
if (styleId && styleId != -1) {
|
|
18527
|
+
const { style } = await BModels.Style.Get({
|
|
18528
|
+
api: this.api,
|
|
18529
|
+
styleId
|
|
18530
|
+
});
|
|
18531
|
+
if (style) {
|
|
18532
|
+
styleMap.style = style;
|
|
18533
|
+
styleMap.StyleID = styleId;
|
|
18534
|
+
}
|
|
18535
|
+
}
|
|
18536
|
+
}
|
|
18537
|
+
catch (e) {
|
|
18538
|
+
console.error(e);
|
|
18539
|
+
}
|
|
18540
|
+
// A reload in the meantime resolves the row itself, or replaces the mapping and re-queues everything.
|
|
18541
|
+
if (this.disposed || this.loadingCounter != counter) {
|
|
18542
|
+
return;
|
|
18543
|
+
}
|
|
18544
|
+
this.styleMappingsLoaded.set(entityTypeId, true);
|
|
18545
|
+
this.flushPendingForType(entityTypeId);
|
|
18546
|
+
}
|
|
18411
18547
|
disposeGatherer() {
|
|
18412
18548
|
if (this.feedRestyleThrottleTimer) {
|
|
18413
18549
|
clearTimeout(this.feedRestyleThrottleTimer);
|
|
@@ -18446,21 +18582,15 @@
|
|
|
18446
18582
|
this.overrideFeatureColor.set(rego.entityId, false);
|
|
18447
18583
|
}
|
|
18448
18584
|
const typeId = rego.entityTypeId || "";
|
|
18449
|
-
|
|
18450
|
-
|
|
18451
|
-
|
|
18452
|
-
|
|
18453
|
-
|
|
18454
|
-
|
|
18455
|
-
}
|
|
18585
|
+
// With no fallback style to use instead, a type the mapping does not list falls back to its own default.
|
|
18586
|
+
if (this.styleMappingLoaded && typeId && !this.fallbackStyle && !this.hasMappingRow(typeId)) {
|
|
18587
|
+
this.loadEntityTypeDefaultStyle(typeId);
|
|
18588
|
+
}
|
|
18589
|
+
if (this.styleMappingsLoaded.get(typeId) || (this.styleMappingLoaded && !this.hasMappingRow(typeId))) {
|
|
18590
|
+
this.styleOrCollect(rego, typeId, needsDataIds);
|
|
18456
18591
|
}
|
|
18457
18592
|
else if (!this.styleMappingsLoaded.has(typeId) && this.styleFallbackLoaded) {
|
|
18458
|
-
|
|
18459
|
-
needsDataIds.push(rego.entityId);
|
|
18460
|
-
}
|
|
18461
|
-
else {
|
|
18462
|
-
this.styleTilesetFeature(rego);
|
|
18463
|
-
}
|
|
18593
|
+
this.styleOrCollect(rego, typeId, needsDataIds);
|
|
18464
18594
|
}
|
|
18465
18595
|
else {
|
|
18466
18596
|
if (!this.stylePendingEntityIds.has(typeId)) {
|
|
@@ -18473,6 +18603,96 @@
|
|
|
18473
18603
|
this.entityGatherer.Queue(needsDataIds, highPriority);
|
|
18474
18604
|
}
|
|
18475
18605
|
}
|
|
18606
|
+
/**
|
|
18607
|
+
* Styles each Entity waiting on a type's style, gathering the records of those that need one.
|
|
18608
|
+
* @param entityTypeId
|
|
18609
|
+
* @param entityIds
|
|
18610
|
+
*/
|
|
18611
|
+
styleOrGatherIds(entityTypeId, entityIds) {
|
|
18612
|
+
const gatherIds = [];
|
|
18613
|
+
for (const id of entityIds) {
|
|
18614
|
+
const rego = this.getEntityRego(id);
|
|
18615
|
+
if (rego) {
|
|
18616
|
+
this.styleOrCollect(rego, entityTypeId, gatherIds);
|
|
18617
|
+
}
|
|
18618
|
+
}
|
|
18619
|
+
if (gatherIds.length) {
|
|
18620
|
+
this.entityGatherer.Queue(gatherIds);
|
|
18621
|
+
}
|
|
18622
|
+
}
|
|
18623
|
+
/**
|
|
18624
|
+
* Styles a feature now when its style reads no record, or reads only values its tile carries, and otherwise collects it for gathering.
|
|
18625
|
+
* @param rego
|
|
18626
|
+
* @param entityTypeId
|
|
18627
|
+
* @param gatherIds Receives the Entity ID when its record is needed.
|
|
18628
|
+
*/
|
|
18629
|
+
styleOrCollect(rego, entityTypeId, gatherIds) {
|
|
18630
|
+
if (!this.getTilesetFeatureNeedsFullData(entityTypeId)) {
|
|
18631
|
+
this.styleTilesetFeature(rego);
|
|
18632
|
+
return;
|
|
18633
|
+
}
|
|
18634
|
+
const record = this.canStyleFromBaked(rego.entityId, entityTypeId) ? this.readBakedRecord(rego.visual) : null;
|
|
18635
|
+
if (!record) {
|
|
18636
|
+
gatherIds.push(rego.entityId);
|
|
18637
|
+
return;
|
|
18638
|
+
}
|
|
18639
|
+
this.styleTilesetFeatureFullData(rego, record, []);
|
|
18640
|
+
// A later edit has to reach the record path, and the change feed finds Entities by Internal ID.
|
|
18641
|
+
if (rego.internalId != null) {
|
|
18642
|
+
this.styledByInternalId.set(rego.internalId, rego.entityId);
|
|
18643
|
+
}
|
|
18644
|
+
}
|
|
18645
|
+
/**
|
|
18646
|
+
* Returns if the tile's baked values hold everything this Entity's style would read from its record.
|
|
18647
|
+
* @param entityId
|
|
18648
|
+
* @param entityTypeId
|
|
18649
|
+
*/
|
|
18650
|
+
canStyleFromBaked(entityId, entityTypeId) {
|
|
18651
|
+
var _a, _b, _c;
|
|
18652
|
+
// Baked values are the base record at generation time, which a scenario, a point in time or merged sources all differ from.
|
|
18653
|
+
if (!this.bakedAttributes.size || this.historic || !!this.scenario || this.expandSources) {
|
|
18654
|
+
return false;
|
|
18655
|
+
}
|
|
18656
|
+
if (this.bakedStaleIds.has(entityId) || ((_a = this.entityGatherer) === null || _a === void 0 ? void 0 : _a.HasEntityDataOverride(entityId))) {
|
|
18657
|
+
return false;
|
|
18658
|
+
}
|
|
18659
|
+
const paths = BModels.Calculator.GetFieldPaths((_c = (_b = this.getTilesetFeatureStyle(entityTypeId)) === null || _b === void 0 ? void 0 : _b.modelStyle) === null || _c === void 0 ? void 0 : _c.fillColor);
|
|
18660
|
+
return paths != null && paths.every(path => this.bakedAttributes.has(JSON.stringify(path)));
|
|
18661
|
+
}
|
|
18662
|
+
/**
|
|
18663
|
+
* Builds a stand-in record from a feature's baked values, holding only the attributes that have one.
|
|
18664
|
+
* Returns null when the feature's tile lacks a declared column, so the record is gathered instead.
|
|
18665
|
+
* @param visual
|
|
18666
|
+
*/
|
|
18667
|
+
readBakedRecord(visual) {
|
|
18668
|
+
if (!(visual instanceof Cesium.Cesium3DTileFeature)) {
|
|
18669
|
+
return null;
|
|
18670
|
+
}
|
|
18671
|
+
const record = {};
|
|
18672
|
+
for (const baked of this.bakedAttributes.values()) {
|
|
18673
|
+
if (!visual.hasProperty(baked.property)) {
|
|
18674
|
+
return null;
|
|
18675
|
+
}
|
|
18676
|
+
let value = visual.getProperty(baked.property);
|
|
18677
|
+
if (value == null) {
|
|
18678
|
+
continue;
|
|
18679
|
+
}
|
|
18680
|
+
// Booleans travel as 0/1 because a boolean column has no way to say "no value".
|
|
18681
|
+
if (baked.type == "BOOLEAN") {
|
|
18682
|
+
value = value != 0;
|
|
18683
|
+
}
|
|
18684
|
+
let target = record;
|
|
18685
|
+
for (let i = 0; i < baked.path.length - 1; i++) {
|
|
18686
|
+
const segment = baked.path[i];
|
|
18687
|
+
if (target[segment] == null || typeof target[segment] != "object") {
|
|
18688
|
+
target[segment] = {};
|
|
18689
|
+
}
|
|
18690
|
+
target = target[segment];
|
|
18691
|
+
}
|
|
18692
|
+
target[baked.path[baked.path.length - 1]] = value;
|
|
18693
|
+
}
|
|
18694
|
+
return record;
|
|
18695
|
+
}
|
|
18476
18696
|
styleTilesetFeature(rego) {
|
|
18477
18697
|
this.styleTilesetFeatureFullData(rego, null, []);
|
|
18478
18698
|
}
|
|
@@ -40491,6 +40711,47 @@
|
|
|
40491
40711
|
}
|
|
40492
40712
|
return Cesium.Matrix4.multiplyByPoint(enuFrame, new Cesium.Cartesian3(tx, ty, tz), new Cesium.Cartesian3());
|
|
40493
40713
|
}
|
|
40714
|
+
// Records created within about this long ago are the ones the oversized GeometryRadius bug could have written.
|
|
40715
|
+
const GEOMETRY_RADIUS_SUSPECT_AGE_MS = 1000 * 60 * 60 * 24 * 183;
|
|
40716
|
+
// Above this a recent record's radius is treated as that bug rather than a real size.
|
|
40717
|
+
const GEOMETRY_RADIUS_SUSPECT_ABOVE = 500;
|
|
40718
|
+
/**
|
|
40719
|
+
* Returns an entity's Bruce.GeometryRadius, or null when there is none or it looks like the oversized-radius bug.
|
|
40720
|
+
* The size cap only applies to records created recently; older ones and ones with no known date are taken as they are.
|
|
40721
|
+
* @param entity
|
|
40722
|
+
*/
|
|
40723
|
+
function getTrustedGeometryRadius(entity) {
|
|
40724
|
+
var _a;
|
|
40725
|
+
const radius = EnsureNumber(BModels.Entity.GetValue({
|
|
40726
|
+
entity: entity,
|
|
40727
|
+
path: ["Bruce", "GeometryRadius"]
|
|
40728
|
+
}));
|
|
40729
|
+
if (!(radius > 0)) {
|
|
40730
|
+
return null;
|
|
40731
|
+
}
|
|
40732
|
+
const created = Date.parse((_a = entity === null || entity === void 0 ? void 0 : entity.Bruce) === null || _a === void 0 ? void 0 : _a.Created);
|
|
40733
|
+
const recent = !isNaN(created) && Date.now() - created < GEOMETRY_RADIUS_SUSPECT_AGE_MS;
|
|
40734
|
+
if (recent && radius >= GEOMETRY_RADIUS_SUSPECT_ABOVE) {
|
|
40735
|
+
return null;
|
|
40736
|
+
}
|
|
40737
|
+
return radius;
|
|
40738
|
+
}
|
|
40739
|
+
/**
|
|
40740
|
+
* Returns the world centre of a model's own bounds, applying the entity's orientation to the offset.
|
|
40741
|
+
* The position is the one GetLocation already resolved, so height references are honoured.
|
|
40742
|
+
* @param viewer
|
|
40743
|
+
* @param part
|
|
40744
|
+
* @param pos3d
|
|
40745
|
+
* @param bounds
|
|
40746
|
+
*/
|
|
40747
|
+
function getModelBoundsCenter(viewer, part, pos3d, bounds) {
|
|
40748
|
+
const orientation = GetValue$1(viewer, part.orientation);
|
|
40749
|
+
const rotation = orientation
|
|
40750
|
+
? Cesium.Matrix3.fromQuaternion(orientation, new Cesium.Matrix3())
|
|
40751
|
+
: Cesium.Matrix4.getMatrix3(Cesium.Transforms.eastNorthUpToFixedFrame(pos3d), new Cesium.Matrix3());
|
|
40752
|
+
const offset = Cesium.Matrix3.multiplyByVector(rotation, bounds.center, new Cesium.Cartesian3());
|
|
40753
|
+
return Cesium.Cartesian3.add(pos3d, offset, new Cesium.Cartesian3());
|
|
40754
|
+
}
|
|
40494
40755
|
// +90° rotation around Z: aligns GLTF Y-up forward with Cesium ENU North.
|
|
40495
40756
|
const _assemblyAxisShift = new Cesium.Quaternion(0, 0, -Math.SQRT1_2, Math.SQRT1_2);
|
|
40496
40757
|
(function (EntityUtils) {
|
|
@@ -40541,6 +40802,9 @@
|
|
|
40541
40802
|
rectangle: null,
|
|
40542
40803
|
sphere: null
|
|
40543
40804
|
};
|
|
40805
|
+
const spheres = [];
|
|
40806
|
+
// The tile holding a rendered feature that says nothing of where it is, used only when nothing better turns up.
|
|
40807
|
+
const tileSpheres = [];
|
|
40544
40808
|
const processPosHeight = async (pos3d, heightRef) => {
|
|
40545
40809
|
// Raise to minimumAlt if needed.
|
|
40546
40810
|
if ((!isNaN(minimumAlt) && minimumAlt != null)) {
|
|
@@ -40618,7 +40882,7 @@
|
|
|
40618
40882
|
* Returns an array of positions from the entity's currently rendered graphics.
|
|
40619
40883
|
*/
|
|
40620
40884
|
const evaluateRendered = async () => {
|
|
40621
|
-
var _a, _b;
|
|
40885
|
+
var _a, _b, _c, _d;
|
|
40622
40886
|
const rego = visualRegister ? visualRegister.GetRego({
|
|
40623
40887
|
entityId: sample.entityId,
|
|
40624
40888
|
menuItemId: sample.menuItemId
|
|
@@ -40750,9 +41014,14 @@
|
|
|
40750
41014
|
posses.push(pos3d);
|
|
40751
41015
|
if (part.model) {
|
|
40752
41016
|
const modelExt = part.model;
|
|
40753
|
-
|
|
41017
|
+
const bounds = modelExt._bounds;
|
|
41018
|
+
if ((bounds === null || bounds === void 0 ? void 0 : bounds.radius) > 0) {
|
|
41019
|
+
spheres.push(new Cesium.BoundingSphere(getModelBoundsCenter(viewer, part, pos3d, bounds), bounds.radius));
|
|
41020
|
+
}
|
|
41021
|
+
else if (modelExt._radius && modelExt._radius > -1) {
|
|
40754
41022
|
const sphere = Cesium.BoundingSphere.fromPoints([pos3d]);
|
|
40755
41023
|
sphere.radius = modelExt._radius;
|
|
41024
|
+
spheres.push(sphere);
|
|
40756
41025
|
}
|
|
40757
41026
|
}
|
|
40758
41027
|
else if (part.ellipse) {
|
|
@@ -40771,6 +41040,7 @@
|
|
|
40771
41040
|
const radius = Math.max(semiMajorAxis, semiMinorAxis, height);
|
|
40772
41041
|
if (radius && radius > 0) {
|
|
40773
41042
|
const sphere = new Cesium.BoundingSphere(pos3d, radius);
|
|
41043
|
+
spheres.push(sphere);
|
|
40774
41044
|
}
|
|
40775
41045
|
}
|
|
40776
41046
|
}
|
|
@@ -40789,6 +41059,14 @@
|
|
|
40789
41059
|
posses.push(pos3d);
|
|
40790
41060
|
if (data.radius != null && !isNaN(data.radius)) {
|
|
40791
41061
|
const sphere = new Cesium.BoundingSphere(pos3d, data.radius);
|
|
41062
|
+
spheres.push(sphere);
|
|
41063
|
+
}
|
|
41064
|
+
}
|
|
41065
|
+
else {
|
|
41066
|
+
// Missing from the typings this library builds against, but there at runtime.
|
|
41067
|
+
const tileSphere = (_d = (_c = part.content) === null || _c === void 0 ? void 0 : _c.tile) === null || _d === void 0 ? void 0 : _d.boundingSphere;
|
|
41068
|
+
if ((tileSphere === null || tileSphere === void 0 ? void 0 : tileSphere.radius) > 0) {
|
|
41069
|
+
tileSpheres.push(Cesium.BoundingSphere.clone(tileSphere));
|
|
40792
41070
|
}
|
|
40793
41071
|
}
|
|
40794
41072
|
}
|
|
@@ -40868,7 +41146,7 @@
|
|
|
40868
41146
|
}
|
|
40869
41147
|
const boundaries = BModels.Entity.GetValue({
|
|
40870
41148
|
entity: entity,
|
|
40871
|
-
path: ["Bruce, Boundaries"]
|
|
41149
|
+
path: ["Bruce", "Boundaries"]
|
|
40872
41150
|
});
|
|
40873
41151
|
if (boundaries && typeof boundaries == "object") {
|
|
40874
41152
|
const point = {
|
|
@@ -40921,16 +41199,9 @@
|
|
|
40921
41199
|
const transformedOffset = Cesium.Matrix3.multiplyByVector(transformHpr, offset, new Cesium.Cartesian3());
|
|
40922
41200
|
pos3d = Cesium.Matrix4.multiplyByPoint(m1, transformedOffset, new Cesium.Cartesian3());
|
|
40923
41201
|
pos3d = await processPosHeight(pos3d, Cesium.HeightReference.NONE);
|
|
40924
|
-
const geometryRadius =
|
|
40925
|
-
entity: entity,
|
|
40926
|
-
path: ["Bruce", "GeometryRadius"]
|
|
40927
|
-
});
|
|
41202
|
+
const geometryRadius = getTrustedGeometryRadius(entity);
|
|
40928
41203
|
if (geometryRadius && (pos3d === null || pos3d === void 0 ? void 0 : pos3d.x)) {
|
|
40929
|
-
|
|
40930
|
-
// For now making sure it's less than x amount because we had a bug which made it huge.
|
|
40931
|
-
if (geometryRadius && geometryRadius < 500 && geometryRadius > 0.1) {
|
|
40932
|
-
sphere.radius = geometryRadius;
|
|
40933
|
-
}
|
|
41204
|
+
spheres.push(new Cesium.BoundingSphere(pos3d, geometryRadius));
|
|
40934
41205
|
}
|
|
40935
41206
|
return [pos3d];
|
|
40936
41207
|
}
|
|
@@ -40938,16 +41209,9 @@
|
|
|
40938
41209
|
if (location) {
|
|
40939
41210
|
let pos3d = Cesium.Cartesian3.fromDegrees(longitude, latitude, EnsureNumber(location.altitude));
|
|
40940
41211
|
pos3d = await processPosHeight(pos3d, Cesium.HeightReference.NONE);
|
|
40941
|
-
const geometryRadius =
|
|
40942
|
-
entity: entity,
|
|
40943
|
-
path: ["Bruce", "GeometryRadius"]
|
|
40944
|
-
});
|
|
41212
|
+
const geometryRadius = getTrustedGeometryRadius(entity);
|
|
40945
41213
|
if (geometryRadius && (pos3d === null || pos3d === void 0 ? void 0 : pos3d.x)) {
|
|
40946
|
-
|
|
40947
|
-
// For now making sure it's less than x amount because we had a bug which made it huge.
|
|
40948
|
-
if (geometryRadius && geometryRadius < 500 && geometryRadius > 0.1) {
|
|
40949
|
-
sphere.radius = geometryRadius;
|
|
40950
|
-
}
|
|
41214
|
+
spheres.push(new Cesium.BoundingSphere(pos3d, geometryRadius));
|
|
40951
41215
|
}
|
|
40952
41216
|
return [pos3d];
|
|
40953
41217
|
}
|
|
@@ -40970,16 +41234,9 @@
|
|
|
40970
41234
|
}
|
|
40971
41235
|
if (pos3d) {
|
|
40972
41236
|
pos3d = await processPosHeight(pos3d, Cesium.HeightReference.NONE);
|
|
40973
|
-
const geometryRadius =
|
|
40974
|
-
entity: entity,
|
|
40975
|
-
path: ["Bruce", "GeometryRadius"]
|
|
40976
|
-
});
|
|
41237
|
+
const geometryRadius = getTrustedGeometryRadius(entity);
|
|
40977
41238
|
if (geometryRadius && (pos3d === null || pos3d === void 0 ? void 0 : pos3d.x)) {
|
|
40978
|
-
|
|
40979
|
-
// For now making sure it's less than x amount because we had a bug which made it huge.
|
|
40980
|
-
if (geometryRadius && geometryRadius < 500 && geometryRadius > 0.1) {
|
|
40981
|
-
sphere.radius = geometryRadius;
|
|
40982
|
-
}
|
|
41239
|
+
spheres.push(new Cesium.BoundingSphere(pos3d, geometryRadius));
|
|
40983
41240
|
}
|
|
40984
41241
|
return [pos3d];
|
|
40985
41242
|
}
|
|
@@ -40999,16 +41256,9 @@
|
|
|
40999
41256
|
if (pos3d === null || pos3d === void 0 ? void 0 : pos3d.x) {
|
|
41000
41257
|
pos3d = await processPosHeight(pos3d, Cesium.HeightReference.NONE);
|
|
41001
41258
|
}
|
|
41002
|
-
const geometryRadius =
|
|
41003
|
-
entity: entity,
|
|
41004
|
-
path: ["Bruce", "GeometryRadius"]
|
|
41005
|
-
});
|
|
41259
|
+
const geometryRadius = getTrustedGeometryRadius(entity);
|
|
41006
41260
|
if (geometryRadius && (pos3d === null || pos3d === void 0 ? void 0 : pos3d.x)) {
|
|
41007
|
-
|
|
41008
|
-
// For now making sure it's less than x amount because we had a bug which made it huge.
|
|
41009
|
-
if (geometryRadius && geometryRadius < 500 && geometryRadius > 0.1) {
|
|
41010
|
-
sphere.radius = geometryRadius;
|
|
41011
|
-
}
|
|
41261
|
+
spheres.push(new Cesium.BoundingSphere(pos3d, geometryRadius));
|
|
41012
41262
|
}
|
|
41013
41263
|
}
|
|
41014
41264
|
}
|
|
@@ -41243,6 +41493,7 @@
|
|
|
41243
41493
|
radius /= 2;
|
|
41244
41494
|
}
|
|
41245
41495
|
const sphere = new Cesium.BoundingSphere(data.pos3d, radius);
|
|
41496
|
+
spheres.push(sphere);
|
|
41246
41497
|
data.sphere = sphere;
|
|
41247
41498
|
}
|
|
41248
41499
|
else {
|
|
@@ -41252,23 +41503,24 @@
|
|
|
41252
41503
|
else if (allPosses.length == 1) {
|
|
41253
41504
|
data.pos3d = allPosses[0];
|
|
41254
41505
|
}
|
|
41255
|
-
|
|
41256
|
-
|
|
41257
|
-
|
|
41258
|
-
if (
|
|
41259
|
-
|
|
41260
|
-
|
|
41261
|
-
|
|
41262
|
-
|
|
41263
|
-
spheres.push(rectSphere);
|
|
41264
|
-
}
|
|
41265
|
-
const combinedSphere = Cesium.BoundingSphere.fromBoundingSpheres(spheres);
|
|
41266
|
-
data.sphere = combinedSphere;
|
|
41506
|
+
// The entities' own sizes, so a large piece is framed whole and a small one is not left far away.
|
|
41507
|
+
// The rectangle sphere above only spans the sampled points, which for one entity is its pivot alone.
|
|
41508
|
+
const sizeSpheres = spheres.filter(x => x !== data.sphere && x.radius > 0);
|
|
41509
|
+
if (sizeSpheres.length) {
|
|
41510
|
+
data.sphere = Cesium.BoundingSphere.fromBoundingSpheres(data.sphere ? [data.sphere, ...sizeSpheres] : sizeSpheres);
|
|
41511
|
+
if (allPosses.length <= 1) {
|
|
41512
|
+
data.pos3d = data.sphere.center;
|
|
41513
|
+
}
|
|
41267
41514
|
}
|
|
41268
|
-
*/
|
|
41269
41515
|
if (data.sphere && data.sphere.radius <= 0) {
|
|
41270
41516
|
data.sphere = null;
|
|
41271
41517
|
}
|
|
41518
|
+
// An Assembly part's record can come back without a location while the API has yet to resolve its model's
|
|
41519
|
+
// bounds, and its feature carries no position of its own. The tile it is drawn in still says roughly where.
|
|
41520
|
+
if (!data.pos3d && tileSpheres.length) {
|
|
41521
|
+
data.sphere = Cesium.BoundingSphere.fromBoundingSpheres(tileSpheres);
|
|
41522
|
+
data.pos3d = data.sphere.center;
|
|
41523
|
+
}
|
|
41272
41524
|
return data;
|
|
41273
41525
|
}
|
|
41274
41526
|
EntityUtils.GetLocation = GetLocation;
|
|
@@ -43827,6 +44079,10 @@
|
|
|
43827
44079
|
}
|
|
43828
44080
|
let radius = modelPrim.boundingSphere.radius;
|
|
43829
44081
|
let centerOffset = modelPrim.boundingSphere.center;
|
|
44082
|
+
const bounds = {
|
|
44083
|
+
center: centerOffset ? Cesium.Cartesian3.clone(centerOffset) : Cesium.Cartesian3.ZERO.clone(),
|
|
44084
|
+
radius: modelPrim.boundingSphere.radius
|
|
44085
|
+
};
|
|
43830
44086
|
if (centerOffset) {
|
|
43831
44087
|
// Add the center offset to the radius because I am not good at math.
|
|
43832
44088
|
const magnitude = Cesium.Cartesian3.magnitude(centerOffset);
|
|
@@ -43838,7 +44094,7 @@
|
|
|
43838
44094
|
}
|
|
43839
44095
|
}
|
|
43840
44096
|
kill();
|
|
43841
|
-
res(radius);
|
|
44097
|
+
res({ radius, bounds });
|
|
43842
44098
|
};
|
|
43843
44099
|
let readyEventRemoval = null;
|
|
43844
44100
|
// Newer Cesium versions have readyEvent. They don't use readyPromise.
|
|
@@ -43863,9 +44119,10 @@
|
|
|
43863
44119
|
});
|
|
43864
44120
|
_fileRadiusCache.Set(fileRadiusKey, heightProm);
|
|
43865
44121
|
}
|
|
43866
|
-
heightProm.then((
|
|
44122
|
+
heightProm.then((measured) => {
|
|
43867
44123
|
if (model) {
|
|
43868
|
-
model._radius = radius;
|
|
44124
|
+
model._radius = measured ? measured.radius : null;
|
|
44125
|
+
model._bounds = measured ? measured.bounds : null;
|
|
43869
44126
|
model._radiusLoaded = true;
|
|
43870
44127
|
if (params.viewer && params.viewer.scene && !params.viewer.isDestroyed()) {
|
|
43871
44128
|
exports.VisualRegisterCuller.MarkShouldRecheck(params.viewer);
|
|
@@ -49649,9 +49906,6 @@ void main() {
|
|
|
49649
49906
|
StyleEffective.Combine = Combine;
|
|
49650
49907
|
/**
|
|
49651
49908
|
* Returns true if every segment in the filter string appears in the subject effective string.
|
|
49652
|
-
* A filter segment matches if the subject contains a segment starting with the same key,
|
|
49653
|
-
* and either no value filter is given or the value matches exactly.
|
|
49654
|
-
* Passing a partial effective value (e.g. just "f0:gradient") also matches.
|
|
49655
49909
|
*/
|
|
49656
49910
|
function MatchesFilter(effective, filter) {
|
|
49657
49911
|
if (!filter) {
|
|
@@ -50916,7 +51170,7 @@ void main() {
|
|
|
50916
51170
|
StyleUtils.ApplyTypeStyle = ApplyTypeStyle;
|
|
50917
51171
|
})(exports.StyleUtils || (exports.StyleUtils = {}));
|
|
50918
51172
|
|
|
50919
|
-
const VERSION = "7.5.
|
|
51173
|
+
const VERSION = "7.5.4";
|
|
50920
51174
|
/**
|
|
50921
51175
|
* Updates the environment instance used by bruce-cesium to one specified.
|
|
50922
51176
|
* This can be used to ensure that the instance a parent is referencing is shared between bruce-cesium, bruce-models, and the parent app.
|