bruce-cesium 6.8.1 → 6.8.2

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 (34) hide show
  1. package/dist/bruce-cesium.es5.js +618 -248
  2. package/dist/bruce-cesium.es5.js.map +1 -1
  3. package/dist/bruce-cesium.umd.js +616 -246
  4. package/dist/bruce-cesium.umd.js.map +1 -1
  5. package/dist/lib/bruce-cesium.js +1 -1
  6. package/dist/lib/rendering/menu-item-manager.js +15 -0
  7. package/dist/lib/rendering/menu-item-manager.js.map +1 -1
  8. package/dist/lib/rendering/render-managers/entities/entities-datalab-render-manager.js +60 -1
  9. package/dist/lib/rendering/render-managers/entities/entities-datalab-render-manager.js.map +1 -1
  10. package/dist/lib/rendering/render-managers/entities/entities-render-manager.js +126 -42
  11. package/dist/lib/rendering/render-managers/entities/entities-render-manager.js.map +1 -1
  12. package/dist/lib/rendering/render-managers/tilesets/tileset-cad-render-manager.js +10 -9
  13. package/dist/lib/rendering/render-managers/tilesets/tileset-cad-render-manager.js.map +1 -1
  14. package/dist/lib/rendering/render-managers/tilesets/tileset-entities-render-manager.js +9 -8
  15. package/dist/lib/rendering/render-managers/tilesets/tileset-entities-render-manager.js.map +1 -1
  16. package/dist/lib/rendering/render-managers/tilesets/tileset-google-photos-render-manager.js +39 -23
  17. package/dist/lib/rendering/render-managers/tilesets/tileset-google-photos-render-manager.js.map +1 -1
  18. package/dist/lib/rendering/render-managers/tilesets/tileset-osm-render-manager.js +149 -73
  19. package/dist/lib/rendering/render-managers/tilesets/tileset-osm-render-manager.js.map +1 -1
  20. package/dist/lib/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.js +30 -0
  21. package/dist/lib/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.js.map +1 -1
  22. package/dist/lib/rendering/visual-register-culler.js +1 -1
  23. package/dist/lib/rendering/visual-register-culler.js.map +1 -1
  24. package/dist/lib/rendering/visuals-register.js +176 -88
  25. package/dist/lib/rendering/visuals-register.js.map +1 -1
  26. package/dist/types/bruce-cesium.d.ts +1 -1
  27. package/dist/types/rendering/render-managers/entities/entities-datalab-render-manager.d.ts +6 -1
  28. package/dist/types/rendering/render-managers/entities/entities-render-manager.d.ts +6 -1
  29. package/dist/types/rendering/render-managers/tilesets/tileset-entities-render-manager.d.ts +1 -1
  30. package/dist/types/rendering/render-managers/tilesets/tileset-google-photos-render-manager.d.ts +6 -1
  31. package/dist/types/rendering/render-managers/tilesets/tileset-osm-render-manager.d.ts +6 -1
  32. package/dist/types/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.d.ts +5 -1
  33. package/dist/types/rendering/visuals-register.d.ts +17 -12
  34. package/package.json +8 -11
@@ -380,6 +380,7 @@ var VisualsRegister;
380
380
  // skipped by the applier so a live user action always wins.
381
381
  this.lazyOverrideExclusions = new Set();
382
382
  this.lazyOverrideInterval = null;
383
+ this.activeChunkedIntervals = new Set();
383
384
  this.onUpdate = null;
384
385
  // Entity ID -> Menu Item ID -> State.
385
386
  // When no Menu Item ID is set, then the second key is a blank string.
@@ -976,6 +977,31 @@ var VisualsRegister;
976
977
  }
977
978
  this.viewer.scene.requestRender();
978
979
  }
980
+ runChunked(items, perItem, onComplete) {
981
+ const BATCH_SIZE = 5000;
982
+ let index = 0;
983
+ const interval = setInterval(() => {
984
+ if (this.Disposed) {
985
+ clearInterval(interval);
986
+ this.activeChunkedIntervals.delete(interval);
987
+ return;
988
+ }
989
+ const end = Math.min(index + BATCH_SIZE, items.length);
990
+ for (; index < end; index++) {
991
+ perItem(items[index]);
992
+ }
993
+ this.viewer.scene.requestRender();
994
+ if (index >= items.length) {
995
+ clearInterval(interval);
996
+ this.activeChunkedIntervals.delete(interval);
997
+ onComplete === null || onComplete === void 0 ? void 0 : onComplete();
998
+ }
999
+ }, 10);
1000
+ this.activeChunkedIntervals.add(interval);
1001
+ }
1002
+ startLazyRemoval(entityIds, removeOne, onComplete) {
1003
+ this.runChunked(entityIds, removeOne, onComplete);
1004
+ }
979
1005
  /**
980
1006
  * Cancels any in-flight lazy OverrideStates() apply.
981
1007
  */
@@ -1048,9 +1074,7 @@ var VisualsRegister;
1048
1074
  }, 10);
1049
1075
  }
1050
1076
  /**
1051
- * Returns all states with the first detected Menu Item ID settings included.
1052
- * This is a utility function for returning settings for apps that don't support the newer state settings.
1053
- * @deprecated Use GetStates() or GetState().
1077
+ * Returns all states keyed by entity id, without regard to menu item id.
1054
1078
  * @returns
1055
1079
  */
1056
1080
  GetStatesLegacy() {
@@ -1076,7 +1100,7 @@ var VisualsRegister;
1076
1100
  const entityId = entityIds[i];
1077
1101
  const state = this.GetState({
1078
1102
  entityId: entityId,
1079
- // First known Menu Item.
1103
+ // Most-recently-set Menu Item for this entity, if any.
1080
1104
  menuItemId: entityIdsMenuItem[entityId]
1081
1105
  });
1082
1106
  states[entityId] = state;
@@ -1132,6 +1156,10 @@ var VisualsRegister;
1132
1156
  clearInterval(this.lazyOverrideInterval);
1133
1157
  this.lazyOverrideInterval = null;
1134
1158
  this.lazyOverrideActive = false;
1159
+ for (const interval of this.activeChunkedIntervals) {
1160
+ clearInterval(interval);
1161
+ }
1162
+ this.activeChunkedIntervals.clear();
1135
1163
  this.disposed = true;
1136
1164
  }
1137
1165
  ForceUpdate(params) {
@@ -1224,8 +1252,7 @@ var VisualsRegister;
1224
1252
  }
1225
1253
  }
1226
1254
  /**
1227
- * Returns all labelled entity ids.
1228
- * @deprecated Use GetStates() or GetState().
1255
+ * Returns all labelled entity ids, without regard to menu item id.
1229
1256
  */
1230
1257
  GetLabelled() {
1231
1258
  const labelledIds = [];
@@ -1376,7 +1403,7 @@ var VisualsRegister;
1376
1403
  }
1377
1404
  }
1378
1405
  /**
1379
- * @deprecated Use GetStates() or GetState().
1406
+ * Returns all selected entity ids, without regard to menu item id.
1380
1407
  * @returns
1381
1408
  */
1382
1409
  GetSelected() {
@@ -1511,7 +1538,7 @@ var VisualsRegister;
1511
1538
  }
1512
1539
  }
1513
1540
  /**
1514
- * @deprecated Use GetStates() or GetState().
1541
+ * Returns all highlighted entity ids, without regard to menu item id.
1515
1542
  * @returns
1516
1543
  */
1517
1544
  GetHighlighted() {
@@ -1572,7 +1599,7 @@ var VisualsRegister;
1572
1599
  return this.isolatedAnyCache;
1573
1600
  }
1574
1601
  /**
1575
- * @deprecated Use GetStates() or GetState().
1602
+ * Returns all isolated entity ids, without regard to menu item id.
1576
1603
  * @returns
1577
1604
  */
1578
1605
  GetIsolated() {
@@ -1630,7 +1657,7 @@ var VisualsRegister;
1630
1657
  return state.hidden === true;
1631
1658
  }
1632
1659
  /**
1633
- * @deprecated Use GetStates() or GetState().
1660
+ * Returns all hidden entity ids, without regard to menu item id.
1634
1661
  * @returns
1635
1662
  */
1636
1663
  GetHidden() {
@@ -1717,8 +1744,8 @@ var VisualsRegister;
1717
1744
  * Re-parents every rego registered under one menu item id to a different menu item id.
1718
1745
  */
1719
1746
  ReassignMenuItem(params) {
1720
- var _a, _b;
1721
- const { fromMenuItemId, toMenuItemId, toMenuItemType, toPriority, requestRender, source } = params;
1747
+ var _a;
1748
+ const { fromMenuItemId, toMenuItemId, toMenuItemType, toPriority, requestRender, source, lazy, onBatch, onComplete } = params;
1722
1749
  if (!fromMenuItemId || !toMenuItemId || fromMenuItemId === toMenuItemId) {
1723
1750
  return;
1724
1751
  }
@@ -1726,37 +1753,44 @@ var VisualsRegister;
1726
1753
  if (!entityIds) {
1727
1754
  return;
1728
1755
  }
1729
- // Snapshot: unindexMenuItemEntityIfAbsent() below mutates this same set.
1730
- for (const entityId of Array.from(entityIds)) {
1756
+ const idsSnapshot = Array.from(entityIds);
1757
+ const regoSnapshot = new Map();
1758
+ for (const entityId of idsSnapshot) {
1759
+ const snapRego = (_a = this.rego[entityId]) === null || _a === void 0 ? void 0 : _a.find(r => r.menuItemId === fromMenuItemId);
1760
+ if (snapRego) {
1761
+ regoSnapshot.set(entityId, snapRego);
1762
+ }
1763
+ }
1764
+ const reassignOne = (entityId) => {
1765
+ var _a, _b;
1731
1766
  const regos = this.rego[entityId];
1732
1767
  if (!regos) {
1733
- continue;
1768
+ return null;
1734
1769
  }
1735
- for (const rego of regos) {
1736
- if (rego.menuItemId !== fromMenuItemId) {
1737
- continue;
1738
- }
1739
- if (source !== EUpdateSource.TREE_CASCADE) {
1740
- (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger({
1741
- type: EVisualUpdateType.Remove,
1742
- entityId,
1743
- rego: { ...rego, menuItemId: fromMenuItemId },
1744
- source
1745
- });
1746
- }
1747
- rego.menuItemId = toMenuItemId;
1748
- rego.menuItemType = toMenuItemType;
1749
- if (toPriority != null) {
1750
- rego.priority = toPriority;
1751
- }
1752
- if (source !== EUpdateSource.TREE_CASCADE) {
1753
- (_b = this.onUpdate) === null || _b === void 0 ? void 0 : _b.Trigger({
1754
- type: EVisualUpdateType.Add,
1755
- entityId,
1756
- rego,
1757
- source
1758
- });
1759
- }
1770
+ const rego = regos.find(r => r.menuItemId === fromMenuItemId);
1771
+ if (!rego || rego !== regoSnapshot.get(entityId)) {
1772
+ return null;
1773
+ }
1774
+ if (source !== EUpdateSource.TREE_CASCADE) {
1775
+ (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger({
1776
+ type: EVisualUpdateType.Remove,
1777
+ entityId,
1778
+ rego: { ...rego, menuItemId: fromMenuItemId },
1779
+ source
1780
+ });
1781
+ }
1782
+ rego.menuItemId = toMenuItemId;
1783
+ rego.menuItemType = toMenuItemType;
1784
+ if (toPriority != null) {
1785
+ rego.priority = toPriority;
1786
+ }
1787
+ if (source !== EUpdateSource.TREE_CASCADE) {
1788
+ (_b = this.onUpdate) === null || _b === void 0 ? void 0 : _b.Trigger({
1789
+ type: EVisualUpdateType.Add,
1790
+ entityId,
1791
+ rego,
1792
+ source
1793
+ });
1760
1794
  }
1761
1795
  const eStates = this.states[entityId];
1762
1796
  const movingState = eStates === null || eStates === void 0 ? void 0 : eStates[fromMenuItemId];
@@ -1776,11 +1810,50 @@ var VisualsRegister;
1776
1810
  entityId,
1777
1811
  refresh: true
1778
1812
  });
1813
+ return rego;
1814
+ };
1815
+ if (lazy) {
1816
+ this.startLazyReassign(idsSnapshot, reassignOne, requestRender, onBatch, onComplete);
1817
+ return;
1818
+ }
1819
+ for (const entityId of idsSnapshot) {
1820
+ reassignOne(entityId);
1779
1821
  }
1780
1822
  if (requestRender != false) {
1781
1823
  this.viewer.scene.requestRender();
1782
1824
  }
1783
1825
  }
1826
+ startLazyReassign(entityIds, reassignOne, requestRender, onBatch, onComplete) {
1827
+ const BATCH_SIZE = 5000;
1828
+ let index = 0;
1829
+ const interval = setInterval(() => {
1830
+ if (this.Disposed) {
1831
+ clearInterval(interval);
1832
+ this.activeChunkedIntervals.delete(interval);
1833
+ return;
1834
+ }
1835
+ const end = Math.min(index + BATCH_SIZE, entityIds.length);
1836
+ const batch = [];
1837
+ for (; index < end; index++) {
1838
+ const rego = reassignOne(entityIds[index]);
1839
+ if (rego) {
1840
+ batch.push(rego);
1841
+ }
1842
+ }
1843
+ if (batch.length) {
1844
+ onBatch === null || onBatch === void 0 ? void 0 : onBatch(batch);
1845
+ }
1846
+ if (requestRender != false) {
1847
+ this.viewer.scene.requestRender();
1848
+ }
1849
+ if (index >= entityIds.length) {
1850
+ clearInterval(interval);
1851
+ this.activeChunkedIntervals.delete(interval);
1852
+ onComplete === null || onComplete === void 0 ? void 0 : onComplete();
1853
+ }
1854
+ }, 10);
1855
+ this.activeChunkedIntervals.add(interval);
1856
+ }
1784
1857
  /**
1785
1858
  * Locates a visual corresponding to a given entity id.
1786
1859
  * If no menu item id is provided, then it will pick the "best" one.
@@ -1823,6 +1896,7 @@ var VisualsRegister;
1823
1896
  GetRegos(params) {
1824
1897
  // TODO: refactor.
1825
1898
  // Currently this was made by merging two functions.
1899
+ var _a;
1826
1900
  const { entityId, menuItemId, styleId, styleEffectiveFilter } = params;
1827
1901
  const matchesStyleFilters = (rego) => {
1828
1902
  if (styleId != null && rego.styleId !== styleId) {
@@ -1846,10 +1920,10 @@ var VisualsRegister;
1846
1920
  }
1847
1921
  else if (menuItemId) {
1848
1922
  const visuals = [];
1849
- for (const eId in this.rego) {
1850
- const entityRegos = this.rego[eId];
1851
- if (entityRegos) {
1852
- const rego = entityRegos.find(r => r.menuItemId === menuItemId);
1923
+ const eIds = this.entityIdsByMenuItem[menuItemId];
1924
+ if (eIds) {
1925
+ for (const eId of eIds) {
1926
+ const rego = (_a = this.rego[eId]) === null || _a === void 0 ? void 0 : _a.find(r => r.menuItemId === menuItemId);
1853
1927
  if (rego && matchesStyleFilters(rego)) {
1854
1928
  visuals.push(rego);
1855
1929
  }
@@ -1881,7 +1955,7 @@ var VisualsRegister;
1881
1955
  */
1882
1956
  RemoveRegos(params) {
1883
1957
  var _a, _b, _c;
1884
- let { entityId, menuItemId, doUpdate, relation, retainTagIds, requestRender, doRemove, source } = params;
1958
+ let { entityId, menuItemId, doUpdate, relation, retainTagIds, requestRender, doRemove, source, lazy, onComplete } = params;
1885
1959
  if (doUpdate == null || doUpdate === undefined) {
1886
1960
  doUpdate = true;
1887
1961
  }
@@ -1892,50 +1966,65 @@ var VisualsRegister;
1892
1966
  // Currently this was made by merging two functions.
1893
1967
  if (menuItemId && !entityId) {
1894
1968
  // Entities registered under this menu item, keyed via entityIdsByMenuItem.
1895
- // Snapshot to an array since removals below mutate the backing set.
1896
1969
  const entityIds = this.entityIdsByMenuItem[menuItemId] ? Array.from(this.entityIdsByMenuItem[menuItemId]) : [];
1897
- for (const entityId of entityIds) {
1970
+ const regoSnapshot = new Map();
1971
+ for (const snapEntityId of entityIds) {
1972
+ const snapRego = (_a = this.rego[snapEntityId]) === null || _a === void 0 ? void 0 : _a.find(r => r.menuItemId === menuItemId);
1973
+ if (snapRego) {
1974
+ regoSnapshot.set(snapEntityId, snapRego);
1975
+ }
1976
+ }
1977
+ const removeOne = (entityId) => {
1978
+ var _a;
1898
1979
  const entityRegos = this.rego[entityId];
1899
- if (entityRegos) {
1900
- const rego = entityRegos.find(r => r.menuItemId === menuItemId);
1901
- if (!rego) {
1902
- continue;
1903
- }
1904
- const regoTagIds = rego.tagIds ? rego.tagIds : [];
1905
- const shouldRetain = regoTagIds.some(tagId => retainTagIds.includes(tagId));
1906
- if (shouldRetain) {
1907
- continue;
1908
- }
1909
- entity_label_1.EntityLabel.Detatch({
1910
- rego
1980
+ if (!entityRegos) {
1981
+ return;
1982
+ }
1983
+ const rego = entityRegos.find(r => r.menuItemId === menuItemId);
1984
+ if (!rego || rego !== regoSnapshot.get(entityId)) {
1985
+ return;
1986
+ }
1987
+ const regoTagIds = rego.tagIds ? rego.tagIds : [];
1988
+ const shouldRetain = regoTagIds.some(tagId => retainTagIds.includes(tagId));
1989
+ if (shouldRetain) {
1990
+ return;
1991
+ }
1992
+ entity_label_1.EntityLabel.Detatch({
1993
+ rego
1994
+ });
1995
+ if (doRemove != false) {
1996
+ removeEntity(this.viewer, rego.visual);
1997
+ }
1998
+ rego.visual = null;
1999
+ const doesInclude = this.rego[entityId].find(r => r.menuItemId === menuItemId);
2000
+ if (doesInclude) {
2001
+ this.rego[entityId] = entityRegos.filter(r => r.menuItemId !== menuItemId);
2002
+ this.unindexMenuItemEntityIfAbsent(menuItemId, entityId);
2003
+ }
2004
+ const update = {
2005
+ type: EVisualUpdateType.Remove,
2006
+ entityId: rego.entityId,
2007
+ rego: rego
2008
+ };
2009
+ if (source) {
2010
+ update.source = source;
2011
+ }
2012
+ if (source !== EUpdateSource.TREE_CASCADE) {
2013
+ (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
2014
+ }
2015
+ if (doesInclude) {
2016
+ this.queueUpdate({
2017
+ entityId: entityId,
2018
+ refresh: false
1911
2019
  });
1912
- if (doRemove != false) {
1913
- removeEntity(this.viewer, rego.visual);
1914
- }
1915
- rego.visual = null;
1916
- const doesInclude = this.rego[entityId].find(r => r.menuItemId === menuItemId);
1917
- if (doesInclude) {
1918
- this.rego[entityId] = entityRegos.filter(r => r.menuItemId !== menuItemId);
1919
- this.unindexMenuItemEntityIfAbsent(menuItemId, entityId);
1920
- }
1921
- const update = {
1922
- type: EVisualUpdateType.Remove,
1923
- entityId: rego.entityId,
1924
- rego: rego
1925
- };
1926
- if (source) {
1927
- update.source = source;
1928
- }
1929
- if (source !== EUpdateSource.TREE_CASCADE) {
1930
- (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
1931
- }
1932
- if (doesInclude) {
1933
- this.queueUpdate({
1934
- entityId: entityId,
1935
- refresh: false
1936
- });
1937
- }
1938
2020
  }
2021
+ };
2022
+ if (lazy) {
2023
+ this.startLazyRemoval(entityIds, removeOne, onComplete);
2024
+ return;
2025
+ }
2026
+ for (const entityId of entityIds) {
2027
+ removeOne(entityId);
1939
2028
  }
1940
2029
  }
1941
2030
  else if (entityId) {
@@ -2258,10 +2347,9 @@ var VisualsRegister;
2258
2347
  });
2259
2348
  }
2260
2349
  /**
2261
- * Returns a dictionary containing entityId -> opacity values.
2262
- * Opacity 1 = 100%.
2350
+ * Returns a dictionary containing entityId -> opacity values, without regard to
2351
+ * menu item id. Opacity 1 = 100%.
2263
2352
  * @returns
2264
- * @deprecated Use GetStates() or GetState().
2265
2353
  */
2266
2354
  GetOpacityMap() {
2267
2355
  const map = {};