bruce-cesium 5.7.9 → 5.8.1

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 (230) hide show
  1. package/dist/bruce-cesium.es5.js +32308 -0
  2. package/dist/bruce-cesium.es5.js.map +1 -0
  3. package/dist/bruce-cesium.umd.js +32232 -0
  4. package/dist/bruce-cesium.umd.js.map +1 -0
  5. package/dist/lib/bruce-cesium.js +76 -0
  6. package/dist/lib/bruce-cesium.js.map +1 -0
  7. package/dist/lib/internal/cesium-utils.js +109 -0
  8. package/dist/lib/internal/cesium-utils.js.map +1 -0
  9. package/dist/lib/internal/js-utils.js +22 -0
  10. package/dist/lib/internal/js-utils.js.map +1 -0
  11. package/dist/lib/internal/limited-log.js +17 -0
  12. package/dist/lib/internal/limited-log.js.map +1 -0
  13. package/dist/lib/rendering/cesium-animated-in-out.js +166 -0
  14. package/dist/lib/rendering/cesium-animated-in-out.js.map +1 -0
  15. package/dist/lib/rendering/cesium-animated-property.js +1111 -0
  16. package/dist/lib/rendering/cesium-animated-property.js.map +1 -0
  17. package/dist/lib/rendering/entity-gatherer.js +327 -0
  18. package/dist/lib/rendering/entity-gatherer.js.map +1 -0
  19. package/dist/lib/rendering/entity-render-engine-model3d.js +689 -0
  20. package/dist/lib/rendering/entity-render-engine-model3d.js.map +1 -0
  21. package/dist/lib/rendering/entity-render-engine-point.js +984 -0
  22. package/dist/lib/rendering/entity-render-engine-point.js.map +1 -0
  23. package/dist/lib/rendering/entity-render-engine-polygon.js +669 -0
  24. package/dist/lib/rendering/entity-render-engine-polygon.js.map +1 -0
  25. package/dist/lib/rendering/entity-render-engine-polyline.js +415 -0
  26. package/dist/lib/rendering/entity-render-engine-polyline.js.map +1 -0
  27. package/dist/lib/rendering/entity-render-engine.js +442 -0
  28. package/dist/lib/rendering/entity-render-engine.js.map +1 -0
  29. package/dist/lib/rendering/getters/batched-data-getter.js +91 -0
  30. package/dist/lib/rendering/getters/batched-data-getter.js.map +1 -0
  31. package/dist/lib/rendering/getters/entity-filter-getter.js +634 -0
  32. package/dist/lib/rendering/getters/entity-filter-getter.js.map +1 -0
  33. package/dist/lib/rendering/getters/entity-globe.js +172 -0
  34. package/dist/lib/rendering/getters/entity-globe.js.map +1 -0
  35. package/dist/lib/rendering/menu-item-creator.js +354 -0
  36. package/dist/lib/rendering/menu-item-creator.js.map +1 -0
  37. package/dist/lib/rendering/menu-item-manager.js +464 -0
  38. package/dist/lib/rendering/menu-item-manager.js.map +1 -0
  39. package/dist/lib/rendering/relation-render-engine.js +235 -0
  40. package/dist/lib/rendering/relation-render-engine.js.map +1 -0
  41. package/dist/lib/rendering/render-managers/common/cesium-parabola.js +368 -0
  42. package/dist/lib/rendering/render-managers/common/cesium-parabola.js.map +1 -0
  43. package/dist/lib/rendering/render-managers/common/entity-label.js +703 -0
  44. package/dist/lib/rendering/render-managers/common/entity-label.js.map +1 -0
  45. package/dist/lib/rendering/render-managers/common/point-clustering.js +826 -0
  46. package/dist/lib/rendering/render-managers/common/point-clustering.js.map +1 -0
  47. package/dist/lib/rendering/render-managers/common/shared-getters.js +187 -0
  48. package/dist/lib/rendering/render-managers/common/shared-getters.js.map +1 -0
  49. package/dist/lib/rendering/render-managers/data-source/data-source-static-csv-manager.js +668 -0
  50. package/dist/lib/rendering/render-managers/data-source/data-source-static-csv-manager.js.map +1 -0
  51. package/dist/lib/rendering/render-managers/data-source/data-source-static-kml-manager.js +92 -0
  52. package/dist/lib/rendering/render-managers/data-source/data-source-static-kml-manager.js.map +1 -0
  53. package/dist/lib/rendering/render-managers/entities/entities-datalab-render-manager.js +143 -0
  54. package/dist/lib/rendering/render-managers/entities/entities-datalab-render-manager.js.map +1 -0
  55. package/dist/lib/rendering/render-managers/entities/entities-ids-render-manager.js +510 -0
  56. package/dist/lib/rendering/render-managers/entities/entities-ids-render-manager.js.map +1 -0
  57. package/dist/lib/rendering/render-managers/entities/entities-loaded-render-manager.js +717 -0
  58. package/dist/lib/rendering/render-managers/entities/entities-loaded-render-manager.js.map +1 -0
  59. package/dist/lib/rendering/render-managers/entities/entities-render-manager.js +999 -0
  60. package/dist/lib/rendering/render-managers/entities/entities-render-manager.js.map +1 -0
  61. package/dist/lib/rendering/render-managers/entities/entity-render-manager.js +186 -0
  62. package/dist/lib/rendering/render-managers/entities/entity-render-manager.js.map +1 -0
  63. package/dist/lib/rendering/render-managers/other/assembly-render-manager.js +226 -0
  64. package/dist/lib/rendering/render-managers/other/assembly-render-manager.js.map +1 -0
  65. package/dist/lib/rendering/render-managers/other/google-search-render-manager.js +430 -0
  66. package/dist/lib/rendering/render-managers/other/google-search-render-manager.js.map +1 -0
  67. package/dist/lib/rendering/render-managers/other/legacy-relations-render-manager.js +290 -0
  68. package/dist/lib/rendering/render-managers/other/legacy-relations-render-manager.js.map +1 -0
  69. package/dist/lib/rendering/render-managers/other/relations-render-manager.js +401 -0
  70. package/dist/lib/rendering/render-managers/other/relations-render-manager.js.map +1 -0
  71. package/dist/lib/rendering/render-managers/render-manager.js +276 -0
  72. package/dist/lib/rendering/render-managers/render-manager.js.map +1 -0
  73. package/dist/lib/rendering/render-managers/tilesets/tileset-arb-render-manager.js +356 -0
  74. package/dist/lib/rendering/render-managers/tilesets/tileset-arb-render-manager.js.map +1 -0
  75. package/dist/lib/rendering/render-managers/tilesets/tileset-cad-render-manager.js +861 -0
  76. package/dist/lib/rendering/render-managers/tilesets/tileset-cad-render-manager.js.map +1 -0
  77. package/dist/lib/rendering/render-managers/tilesets/tileset-entities-render-manager.js +279 -0
  78. package/dist/lib/rendering/render-managers/tilesets/tileset-entities-render-manager.js.map +1 -0
  79. package/dist/lib/rendering/render-managers/tilesets/tileset-google-photos-render-manager.js +104 -0
  80. package/dist/lib/rendering/render-managers/tilesets/tileset-google-photos-render-manager.js.map +1 -0
  81. package/dist/lib/rendering/render-managers/tilesets/tileset-i3s-render-manager.js +81 -0
  82. package/dist/lib/rendering/render-managers/tilesets/tileset-i3s-render-manager.js.map +1 -0
  83. package/dist/lib/rendering/render-managers/tilesets/tileset-osm-render-manager.js +378 -0
  84. package/dist/lib/rendering/render-managers/tilesets/tileset-osm-render-manager.js.map +1 -0
  85. package/dist/lib/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.js +140 -0
  86. package/dist/lib/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.js.map +1 -0
  87. package/dist/lib/rendering/tile-render-engine.js +1328 -0
  88. package/dist/lib/rendering/tile-render-engine.js.map +1 -0
  89. package/dist/lib/rendering/tileset-render-engine.js +588 -0
  90. package/dist/lib/rendering/tileset-render-engine.js.map +1 -0
  91. package/dist/lib/rendering/tileset-styler.js +590 -0
  92. package/dist/lib/rendering/tileset-styler.js.map +1 -0
  93. package/dist/lib/rendering/view-render-engine.js +1004 -0
  94. package/dist/lib/rendering/view-render-engine.js.map +1 -0
  95. package/dist/lib/rendering/visual-register-culler.js +676 -0
  96. package/dist/lib/rendering/visual-register-culler.js.map +1 -0
  97. package/dist/lib/rendering/visuals-register.js +1741 -0
  98. package/dist/lib/rendering/visuals-register.js.map +1 -0
  99. package/dist/lib/utils/cesium-entity-styler.js +914 -0
  100. package/dist/lib/utils/cesium-entity-styler.js.map +1 -0
  101. package/dist/lib/utils/drawing-utils.js +308 -0
  102. package/dist/lib/utils/drawing-utils.js.map +1 -0
  103. package/dist/lib/utils/entity-utils.js +1382 -0
  104. package/dist/lib/utils/entity-utils.js.map +1 -0
  105. package/dist/lib/utils/measure-utils.js +73 -0
  106. package/dist/lib/utils/measure-utils.js.map +1 -0
  107. package/dist/lib/utils/simplify-geometry.js +323 -0
  108. package/dist/lib/utils/simplify-geometry.js.map +1 -0
  109. package/dist/lib/utils/view-utils.js +392 -0
  110. package/dist/lib/utils/view-utils.js.map +1 -0
  111. package/dist/lib/viewer/cesium-view-monitor.js +393 -0
  112. package/dist/lib/viewer/cesium-view-monitor.js.map +1 -0
  113. package/dist/lib/viewer/viewer-event-tracker.js +70 -0
  114. package/dist/lib/viewer/viewer-event-tracker.js.map +1 -0
  115. package/dist/lib/viewer/viewer-utils.js +310 -0
  116. package/dist/lib/viewer/viewer-utils.js.map +1 -0
  117. package/dist/lib/widgets/common/draw-3d-polygon.js +458 -0
  118. package/dist/lib/widgets/common/draw-3d-polygon.js.map +1 -0
  119. package/dist/lib/widgets/common/draw-3d-polyline.js +415 -0
  120. package/dist/lib/widgets/common/draw-3d-polyline.js.map +1 -0
  121. package/dist/lib/widgets/common/measure-creator.js +468 -0
  122. package/dist/lib/widgets/common/measure-creator.js.map +1 -0
  123. package/dist/lib/widgets/common/walkthrough.js +336 -0
  124. package/dist/lib/widgets/common/walkthrough.js.map +1 -0
  125. package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-fullscreen.js +36 -0
  126. package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-fullscreen.js.map +1 -0
  127. package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-search.js +437 -0
  128. package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-search.js.map +1 -0
  129. package/dist/lib/widgets/controls-view-bar/widget-control-view-bar.js +38 -0
  130. package/dist/lib/widgets/controls-view-bar/widget-control-view-bar.js.map +1 -0
  131. package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-bookmarks.js +219 -0
  132. package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-bookmarks.js.map +1 -0
  133. package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-user.js +304 -0
  134. package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-user.js.map +1 -0
  135. package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab.js +29 -0
  136. package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab.js.map +1 -0
  137. package/dist/lib/widgets/widget-bookmarks.js +497 -0
  138. package/dist/lib/widgets/widget-bookmarks.js.map +1 -0
  139. package/dist/lib/widgets/widget-branding.js +165 -0
  140. package/dist/lib/widgets/widget-branding.js.map +1 -0
  141. package/dist/lib/widgets/widget-cursorbar.js +1179 -0
  142. package/dist/lib/widgets/widget-cursorbar.js.map +1 -0
  143. package/dist/lib/widgets/widget-embedded-info-view.js +201 -0
  144. package/dist/lib/widgets/widget-embedded-info-view.js.map +1 -0
  145. package/dist/lib/widgets/widget-info-view.js +681 -0
  146. package/dist/lib/widgets/widget-info-view.js.map +1 -0
  147. package/dist/lib/widgets/widget-left-panel.js +548 -0
  148. package/dist/lib/widgets/widget-left-panel.js.map +1 -0
  149. package/dist/lib/widgets/widget-nav-compass.js +469 -0
  150. package/dist/lib/widgets/widget-nav-compass.js.map +1 -0
  151. package/dist/lib/widgets/widget-view-bar.js +284 -0
  152. package/dist/lib/widgets/widget-view-bar.js.map +1 -0
  153. package/dist/lib/widgets/widget.js +66 -0
  154. package/dist/lib/widgets/widget.js.map +1 -0
  155. package/dist/types/bruce-cesium.d.ts +58 -0
  156. package/dist/types/internal/cesium-utils.d.ts +23 -0
  157. package/dist/types/internal/js-utils.d.ts +8 -0
  158. package/dist/types/internal/limited-log.d.ts +6 -0
  159. package/dist/types/rendering/cesium-animated-in-out.d.ts +12 -0
  160. package/dist/types/rendering/cesium-animated-property.d.ts +245 -0
  161. package/dist/types/rendering/entity-gatherer.d.ts +36 -0
  162. package/dist/types/rendering/entity-render-engine-model3d.d.ts +56 -0
  163. package/dist/types/rendering/entity-render-engine-point.d.ts +73 -0
  164. package/dist/types/rendering/entity-render-engine-polygon.d.ts +26 -0
  165. package/dist/types/rendering/entity-render-engine-polyline.d.ts +47 -0
  166. package/dist/types/rendering/entity-render-engine.d.ts +108 -0
  167. package/dist/types/rendering/getters/batched-data-getter.d.ts +28 -0
  168. package/dist/types/rendering/getters/entity-filter-getter.d.ts +104 -0
  169. package/dist/types/rendering/getters/entity-globe.d.ts +21 -0
  170. package/dist/types/rendering/menu-item-creator.d.ts +53 -0
  171. package/dist/types/rendering/menu-item-manager.d.ts +85 -0
  172. package/dist/types/rendering/relation-render-engine.d.ts +32 -0
  173. package/dist/types/rendering/render-managers/common/cesium-parabola.d.ts +39 -0
  174. package/dist/types/rendering/render-managers/common/entity-label.d.ts +82 -0
  175. package/dist/types/rendering/render-managers/common/point-clustering.d.ts +91 -0
  176. package/dist/types/rendering/render-managers/common/shared-getters.d.ts +41 -0
  177. package/dist/types/rendering/render-managers/data-source/data-source-static-csv-manager.d.ts +41 -0
  178. package/dist/types/rendering/render-managers/data-source/data-source-static-kml-manager.d.ts +25 -0
  179. package/dist/types/rendering/render-managers/entities/entities-datalab-render-manager.d.ts +31 -0
  180. package/dist/types/rendering/render-managers/entities/entities-ids-render-manager.d.ts +76 -0
  181. package/dist/types/rendering/render-managers/entities/entities-loaded-render-manager.d.ts +90 -0
  182. package/dist/types/rendering/render-managers/entities/entities-render-manager.d.ts +90 -0
  183. package/dist/types/rendering/render-managers/entities/entity-render-manager.d.ts +42 -0
  184. package/dist/types/rendering/render-managers/other/assembly-render-manager.d.ts +38 -0
  185. package/dist/types/rendering/render-managers/other/google-search-render-manager.d.ts +45 -0
  186. package/dist/types/rendering/render-managers/other/legacy-relations-render-manager.d.ts +60 -0
  187. package/dist/types/rendering/render-managers/other/relations-render-manager.d.ts +53 -0
  188. package/dist/types/rendering/render-managers/render-manager.d.ts +30 -0
  189. package/dist/types/rendering/render-managers/tilesets/tileset-arb-render-manager.d.ts +37 -0
  190. package/dist/types/rendering/render-managers/tilesets/tileset-cad-render-manager.d.ts +86 -0
  191. package/dist/types/rendering/render-managers/tilesets/tileset-entities-render-manager.d.ts +41 -0
  192. package/dist/types/rendering/render-managers/tilesets/tileset-google-photos-render-manager.d.ts +26 -0
  193. package/dist/types/rendering/render-managers/tilesets/tileset-i3s-render-manager.d.ts +25 -0
  194. package/dist/types/rendering/render-managers/tilesets/tileset-osm-render-manager.d.ts +48 -0
  195. package/dist/types/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.d.ts +27 -0
  196. package/dist/types/rendering/tile-render-engine.d.ts +80 -0
  197. package/dist/types/rendering/tileset-render-engine.d.ts +99 -0
  198. package/dist/types/rendering/tileset-styler.d.ts +86 -0
  199. package/dist/types/rendering/view-render-engine.d.ts +32 -0
  200. package/dist/types/rendering/visual-register-culler.d.ts +18 -0
  201. package/dist/types/rendering/visuals-register.d.ts +361 -0
  202. package/dist/types/utils/cesium-entity-styler.d.ts +103 -0
  203. package/dist/types/utils/drawing-utils.d.ts +59 -0
  204. package/dist/types/utils/entity-utils.d.ts +133 -0
  205. package/dist/types/utils/measure-utils.d.ts +20 -0
  206. package/dist/types/utils/simplify-geometry.d.ts +19 -0
  207. package/dist/types/utils/view-utils.d.ts +101 -0
  208. package/dist/types/viewer/cesium-view-monitor.d.ts +35 -0
  209. package/dist/types/viewer/viewer-event-tracker.d.ts +47 -0
  210. package/dist/types/viewer/viewer-utils.d.ts +88 -0
  211. package/dist/types/widgets/common/draw-3d-polygon.d.ts +62 -0
  212. package/dist/types/widgets/common/draw-3d-polyline.d.ts +50 -0
  213. package/dist/types/widgets/common/measure-creator.d.ts +60 -0
  214. package/dist/types/widgets/common/walkthrough.d.ts +37 -0
  215. package/dist/types/widgets/controls-view-bar/widget-control-view-bar-fullscreen.d.ts +10 -0
  216. package/dist/types/widgets/controls-view-bar/widget-control-view-bar-search.d.ts +18 -0
  217. package/dist/types/widgets/controls-view-bar/widget-control-view-bar.d.ts +23 -0
  218. package/dist/types/widgets/tabs-left-panel/widget-left-panel-tab-bookmarks.d.ts +11 -0
  219. package/dist/types/widgets/tabs-left-panel/widget-left-panel-tab-user.d.ts +24 -0
  220. package/dist/types/widgets/tabs-left-panel/widget-left-panel-tab.d.ts +17 -0
  221. package/dist/types/widgets/widget-bookmarks.d.ts +40 -0
  222. package/dist/types/widgets/widget-branding.d.ts +15 -0
  223. package/dist/types/widgets/widget-cursorbar.d.ts +48 -0
  224. package/dist/types/widgets/widget-embedded-info-view.d.ts +13 -0
  225. package/dist/types/widgets/widget-info-view.d.ts +21 -0
  226. package/dist/types/widgets/widget-left-panel.d.ts +73 -0
  227. package/dist/types/widgets/widget-nav-compass.d.ts +27 -0
  228. package/dist/types/widgets/widget-view-bar.d.ts +37 -0
  229. package/dist/types/widgets/widget.d.ts +29 -0
  230. package/package.json +1 -1
@@ -0,0 +1,1741 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VisualsRegister = void 0;
4
+ const bruce_models_1 = require("bruce-models");
5
+ const Cesium = require("cesium");
6
+ const js_utils_1 = require("../internal/js-utils");
7
+ const entity_utils_1 = require("../utils/entity-utils");
8
+ const relation_render_engine_1 = require("./relation-render-engine");
9
+ const entity_label_1 = require("../rendering/render-managers/common/entity-label");
10
+ const visual_register_culler_1 = require("./visual-register-culler");
11
+ const cesium_entity_styler_1 = require("../utils/cesium-entity-styler");
12
+ const cesium_animated_in_out_1 = require("./cesium-animated-in-out");
13
+ /**
14
+ * Returns if a given visual is alive and in the scene.
15
+ * @param viewer
16
+ * @param visual
17
+ * @returns
18
+ */
19
+ function isAlive(viewer, visual) {
20
+ if (!(viewer === null || viewer === void 0 ? void 0 : viewer.scene) || viewer.isDestroyed()) {
21
+ return false;
22
+ }
23
+ if (visual instanceof Cesium.Entity) {
24
+ return viewer.entities.contains(visual);
25
+ }
26
+ else if (visual instanceof Cesium.Primitive) {
27
+ return viewer.scene.primitives.contains(visual);
28
+ }
29
+ else if (visual instanceof Cesium.Cesium3DTileFeature) {
30
+ const cTileset = visual === null || visual === void 0 ? void 0 : visual.tileset;
31
+ if (!cTileset) {
32
+ return false;
33
+ }
34
+ if (cTileset.isDestroyed() || !viewer.scene.primitives.contains(cTileset)) {
35
+ return false;
36
+ }
37
+ return true;
38
+ }
39
+ return false;
40
+ }
41
+ function removeEntity(viewer, visual) {
42
+ unmarkEntity(visual, false);
43
+ cesium_animated_in_out_1.CesiumAnimatedInOut.AnimateOut({
44
+ entity: visual,
45
+ viewer
46
+ });
47
+ }
48
+ const MAX_SHOW_DEPTH = 10;
49
+ function updateCEntityShow(viewer, visual, rego, show, ignoreParent, depth = 0) {
50
+ if (depth > MAX_SHOW_DEPTH) {
51
+ console.warn("updateCEntityShow(): Max show depth reached. EntityId = " + rego.entityId);
52
+ return;
53
+ }
54
+ // A sub-object can be culled while the siblings are not.
55
+ // We only cull things that give us some benefit. For example clamped to ground graphics are expensive to keep rendered.
56
+ show = show ? !visual_register_culler_1.VisualRegisterCuller.IsCulled(viewer, rego, visual) : false;
57
+ if (visual._parentEntity && !ignoreParent) {
58
+ updateCEntityShow(viewer, visual._parentEntity, rego, show, false, depth + 1);
59
+ }
60
+ if (visual._siblingGraphics) {
61
+ for (let i = 0; i < visual._siblingGraphics.length; i++) {
62
+ const sibling = visual._siblingGraphics[i];
63
+ updateCEntityShow(viewer, sibling, rego, show, true, depth + 1);
64
+ }
65
+ }
66
+ /**
67
+ * Do NOT use ".show" as it causes crashes in Cesium polylines that are clamped to ground.
68
+ * We could target them specifically here but we may be getting overall performance gain by just removing stuff from the scene.
69
+ */
70
+ if (rego.collection) {
71
+ if (!show && rego.collection.contains(visual)) {
72
+ rego.collection.remove(visual);
73
+ }
74
+ else if (show && !rego.collection.contains(visual)) {
75
+ rego.collection.add(visual);
76
+ }
77
+ }
78
+ else {
79
+ if (!show && viewer.entities.contains(visual)) {
80
+ viewer.entities.remove(visual);
81
+ }
82
+ else if (show && !viewer.entities.contains(visual)) {
83
+ viewer.entities.add(visual);
84
+ }
85
+ }
86
+ }
87
+ function updateEntityShow(viewer, rego, show) {
88
+ const visual = rego.visual;
89
+ if (visual instanceof Cesium.Entity) {
90
+ if (!(viewer === null || viewer === void 0 ? void 0 : viewer.scene) || viewer.isDestroyed()) {
91
+ return;
92
+ }
93
+ updateCEntityShow(viewer, rego.visual, rego, show, false, 0);
94
+ return;
95
+ }
96
+ if (!isAlive(viewer, visual)) {
97
+ return;
98
+ }
99
+ if (visual instanceof Cesium.Primitive) {
100
+ if (viewer.scene.primitives.contains(visual)) {
101
+ visual.show = show;
102
+ }
103
+ }
104
+ else if (visual instanceof Cesium.Cesium3DTileFeature) {
105
+ // No way to tell if changing show will crash it!
106
+ // ^ We need to improve removing visuals from the register when tiles unload to avoid this :)
107
+ try {
108
+ visual.show = show;
109
+ }
110
+ catch (e) {
111
+ console.error(e);
112
+ }
113
+ const ent = visual;
114
+ if (ent._siblingGraphics) {
115
+ for (let i = 0; i < ent._siblingGraphics.length; i++) {
116
+ try {
117
+ const sibling = ent._siblingGraphics[i];
118
+ sibling.show = show;
119
+ }
120
+ catch (e) {
121
+ console.error(e);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ }
127
+ function updateEntity(viewer, entityId, register, refresh, cache = {}) {
128
+ var _a;
129
+ // Unavailable for unoptimized single-Entity updates.
130
+ if (!cache) {
131
+ cache = {};
132
+ }
133
+ let regos = register.GetRegos({
134
+ entityId
135
+ });
136
+ regos.sort((a, b) => {
137
+ return b.priority - a.priority;
138
+ });
139
+ let highestPriority = (_a = regos[0]) === null || _a === void 0 ? void 0 : _a.priority;
140
+ if (!highestPriority) {
141
+ highestPriority = 0;
142
+ }
143
+ function getShowState(rego, state) {
144
+ if (state.hidden) {
145
+ return false;
146
+ }
147
+ else if (!state.isolated) {
148
+ if (cache.isIsolatedAny == null) {
149
+ cache.isIsolatedAny = register.GetIsIsolatedAny();
150
+ }
151
+ if (cache.isIsolatedAny) {
152
+ return false;
153
+ }
154
+ }
155
+ // We show all regos in the same highest priority level.
156
+ // So if a new visual is added that's higher priority, all lower ones get hidden.
157
+ // By default, everything has 0 priority unless explicitly set.
158
+ const priority = rego.priority ? rego.priority : 0;
159
+ return priority >= highestPriority;
160
+ }
161
+ for (let i = 0; i < regos.length; i++) {
162
+ const rego = regos[i];
163
+ const state = register.GetState({
164
+ entityId: entityId,
165
+ menuItemId: rego.menuItemId
166
+ });
167
+ let visible = rego.overrideShow;
168
+ if (visible == null || visible === undefined) {
169
+ visible = getShowState(rego, state);
170
+ }
171
+ updateEntityShow(viewer, rego, visible);
172
+ if (visible) {
173
+ if (refresh === true || (refresh !== false && (refresh === null || refresh === void 0 ? void 0 : refresh.highlighted))) {
174
+ if (state.highlighted) {
175
+ cesium_entity_styler_1.CesiumEntityStyler.Highlight({
176
+ entity: rego.visual,
177
+ viewer,
178
+ requestRender: false
179
+ });
180
+ }
181
+ else {
182
+ cesium_entity_styler_1.CesiumEntityStyler.Unhighlight({
183
+ entity: rego.visual,
184
+ viewer,
185
+ requestRender: false
186
+ });
187
+ }
188
+ }
189
+ if (refresh === true || (refresh !== false && (refresh === null || refresh === void 0 ? void 0 : refresh.selected))) {
190
+ if (state.selected) {
191
+ cesium_entity_styler_1.CesiumEntityStyler.Select({
192
+ entity: rego.visual,
193
+ viewer,
194
+ requestRender: false
195
+ });
196
+ }
197
+ else {
198
+ cesium_entity_styler_1.CesiumEntityStyler.Deselect({
199
+ entity: rego.visual,
200
+ viewer,
201
+ requestRender: false
202
+ });
203
+ }
204
+ }
205
+ if (refresh === true || (refresh !== false && (refresh === null || refresh === void 0 ? void 0 : refresh.opacity))) {
206
+ if (state.opacity != null && state.opacity != 1) {
207
+ entity_utils_1.EntityUtils.SetOpacity({
208
+ entity: rego.visual,
209
+ opacity: state.opacity,
210
+ viewer: viewer,
211
+ requestRender: false
212
+ });
213
+ }
214
+ else {
215
+ entity_utils_1.EntityUtils.RevertOpacity({
216
+ entity: rego.visual,
217
+ viewer: viewer,
218
+ requestRender: false
219
+ });
220
+ }
221
+ }
222
+ }
223
+ if (state.labelled && visible) {
224
+ entity_label_1.EntityLabel.Attach({
225
+ rego,
226
+ viewer,
227
+ api: register.ApiGetters.GetBruceApi(),
228
+ visualRegister: register
229
+ });
230
+ }
231
+ else {
232
+ entity_label_1.EntityLabel.Detatch({
233
+ rego
234
+ });
235
+ }
236
+ }
237
+ }
238
+ function markEntity(register, rego, visual, ignoreParent) {
239
+ const vis = visual;
240
+ vis._register = register;
241
+ vis._rego = rego;
242
+ if (visual instanceof Cesium.Entity) {
243
+ const visEnt = visual;
244
+ if (visEnt._parentEntity && !ignoreParent) {
245
+ markEntity(register, rego, visEnt._parentEntity, false);
246
+ }
247
+ if (visEnt._siblingGraphics) {
248
+ for (let i = 0; i < visEnt._siblingGraphics.length; i++) {
249
+ markEntity(register, rego, visEnt._siblingGraphics[i], true);
250
+ }
251
+ }
252
+ }
253
+ else if (visual instanceof Cesium.Cesium3DTileFeature) {
254
+ const visEnt = visual;
255
+ if (visEnt._siblingGraphics) {
256
+ for (let i = 0; i < visEnt._siblingGraphics.length; i++) {
257
+ markEntity(register, rego, visEnt._siblingGraphics[i], true);
258
+ }
259
+ }
260
+ }
261
+ }
262
+ function unmarkEntity(visual, ignoreParent) {
263
+ const vis = visual;
264
+ vis._register = null;
265
+ if (visual instanceof Cesium.Entity) {
266
+ const visEnt = visual;
267
+ if (visEnt._parentEntity && !ignoreParent) {
268
+ unmarkEntity(visEnt._parentEntity, false);
269
+ }
270
+ if (visEnt._siblingGraphics) {
271
+ for (let i = 0; i < visEnt._siblingGraphics.length; i++) {
272
+ unmarkEntity(visEnt._siblingGraphics[i], true);
273
+ }
274
+ }
275
+ }
276
+ else if (visual instanceof Cesium.Cesium3DTileFeature) {
277
+ const visEnt = visual;
278
+ if (visEnt._siblingGraphics) {
279
+ for (let i = 0; i < visEnt._siblingGraphics.length; i++) {
280
+ unmarkEntity(visEnt._siblingGraphics[i], true);
281
+ }
282
+ }
283
+ }
284
+ }
285
+ const NO_MENU_ITEM_KEY = "";
286
+ function getBlankState(entityId, menuItemId) {
287
+ const state = {
288
+ entityId: entityId
289
+ };
290
+ if (menuItemId) {
291
+ state.menuItemId = menuItemId;
292
+ }
293
+ return state;
294
+ }
295
+ function isBlankState(state) {
296
+ const idKeys = !state.menuItemId ? 1 : 2;
297
+ return Object.keys(state).length === idKeys;
298
+ }
299
+ /**
300
+ * Manages a registry of all Bruce visuals being rendered by menu items.
301
+ */
302
+ var VisualsRegister;
303
+ (function (VisualsRegister) {
304
+ let EVisualUpdateType;
305
+ (function (EVisualUpdateType) {
306
+ EVisualUpdateType["Add"] = "ADD";
307
+ EVisualUpdateType["Remove"] = "REMOVE";
308
+ EVisualUpdateType["Update"] = "UPDATE";
309
+ EVisualUpdateType["DeselectAll"] = "DESELECT_ALL";
310
+ })(EVisualUpdateType = VisualsRegister.EVisualUpdateType || (VisualsRegister.EVisualUpdateType = {}));
311
+ class Register {
312
+ get Id() {
313
+ return this.id;
314
+ }
315
+ get Disposed() {
316
+ return this.disposed;
317
+ }
318
+ get Viewer() {
319
+ return this.viewer;
320
+ }
321
+ get ApiGetters() {
322
+ return this.apiGetters;
323
+ }
324
+ get OnUpdate() {
325
+ if (!this.onUpdate) {
326
+ this.onUpdate = new bruce_models_1.BruceEvent();
327
+ }
328
+ return this.onUpdate;
329
+ }
330
+ constructor(params) {
331
+ this.id = bruce_models_1.ObjectUtils.UId();
332
+ this.disposed = false;
333
+ this.rego = {};
334
+ this.onUpdate = null;
335
+ // Entity ID -> Menu Item ID -> State.
336
+ // When no Menu Item ID is set, then the second key is a blank string.
337
+ // If an Entity ID state is set without a Menu Item ID, then it acts as a default for all Menu Items.
338
+ this.states = {};
339
+ // Queue of Entity updates to process in batches to avoid overloading the render loop.
340
+ this.updateQueue = [];
341
+ // Settings related to those Entities in the queue.
342
+ // This lets us modify the update without re-adding the item to the queue if it's already in it.
343
+ this.updateQueueSettings = {};
344
+ this.updateQueueInterval = null;
345
+ this.viewer = params.viewer;
346
+ this.apiGetters = params.apiGetters;
347
+ this.cameraCullerDispose = visual_register_culler_1.VisualRegisterCuller.Monitor({
348
+ register: this
349
+ });
350
+ }
351
+ queueUpdate(update) {
352
+ if (this.Disposed) {
353
+ return;
354
+ }
355
+ // Merge settings from existing queued item.
356
+ let settings = this.updateQueueSettings[update.entityId];
357
+ if (settings !== true) {
358
+ if (update.refresh === true) {
359
+ settings = true;
360
+ }
361
+ else if (update.refresh === false) {
362
+ if (!settings) {
363
+ settings = false;
364
+ }
365
+ }
366
+ else {
367
+ if (!settings) {
368
+ settings = {};
369
+ }
370
+ if (update.refresh.highlighted) {
371
+ settings.highlighted = true;
372
+ }
373
+ if (update.refresh.selected) {
374
+ settings.selected = true;
375
+ }
376
+ if (update.refresh.opacity) {
377
+ settings.opacity = true;
378
+ }
379
+ }
380
+ }
381
+ this.updateQueueSettings[update.entityId] = settings;
382
+ // Queue ID if it's not already in the queue.
383
+ if (!this.updateQueue.includes(update.entityId)) {
384
+ this.updateQueue.push(update.entityId);
385
+ this.pingUpdateQueue();
386
+ }
387
+ }
388
+ pingUpdateQueue() {
389
+ if (this.updateQueueInterval) {
390
+ return;
391
+ }
392
+ const BATCH_SIZE = 300;
393
+ if (this.updateQueue.length) {
394
+ this.updateQueueInterval = setInterval(() => {
395
+ if (this.Disposed || (!this.viewer || !this.viewer.scene || this.viewer.isDestroyed())) {
396
+ clearInterval(this.updateQueueInterval);
397
+ this.updateQueueInterval = null;
398
+ return;
399
+ }
400
+ const batch = this.updateQueue.splice(0, BATCH_SIZE);
401
+ const cache = {};
402
+ for (let i = 0; i < batch.length; i++) {
403
+ const entityId = batch[i];
404
+ // Check if still registered.
405
+ if (!this.rego[entityId] || !this.rego[entityId].length) {
406
+ continue;
407
+ }
408
+ updateEntity(this.viewer, entityId, this, this.updateQueueSettings[entityId] == null ? false : this.updateQueueSettings[entityId], cache);
409
+ this.updateQueueSettings[entityId] = null;
410
+ delete this.updateQueueSettings[entityId];
411
+ }
412
+ this.viewer.scene.requestRender();
413
+ if (!this.updateQueue.length) {
414
+ clearInterval(this.updateQueueInterval);
415
+ this.updateQueueInterval = null;
416
+ }
417
+ }, 10);
418
+ }
419
+ }
420
+ /**
421
+ * Returns the applied visual state for a given Entity ID.
422
+ * This is a combination of a Menu Item specific state and a general state.
423
+ * @param params
424
+ */
425
+ GetState(params) {
426
+ var _a, _b;
427
+ const { entityId, menuItemId } = params;
428
+ let eState = (_a = this.states[entityId]) === null || _a === void 0 ? void 0 : _a[NO_MENU_ITEM_KEY];
429
+ if (eState && isBlankState(eState)) {
430
+ eState = null;
431
+ delete this.states[entityId][NO_MENU_ITEM_KEY];
432
+ }
433
+ let mState;
434
+ if (menuItemId) {
435
+ mState = (_b = this.states[entityId]) === null || _b === void 0 ? void 0 : _b[menuItemId];
436
+ if (mState && isBlankState(mState)) {
437
+ mState = null;
438
+ delete this.states[entityId][menuItemId];
439
+ }
440
+ }
441
+ if (!mState && eState) {
442
+ return eState;
443
+ }
444
+ let state = getBlankState(entityId, menuItemId);
445
+ if (eState) {
446
+ state = Object.assign(state, eState);
447
+ }
448
+ if (mState) {
449
+ state = Object.assign(state, mState);
450
+ }
451
+ if (menuItemId) {
452
+ state.menuItemId = menuItemId;
453
+ }
454
+ state.entityId = entityId;
455
+ return state;
456
+ }
457
+ /**
458
+ * Sets the state for a given Entity.
459
+ * This can be used to perform multiple visual updates in one go.
460
+ * @param state
461
+ * @param update
462
+ */
463
+ SetState(state, update = true, source) {
464
+ if (!state || isBlankState(state)) {
465
+ return;
466
+ }
467
+ const refresh = {
468
+ highlighted: state.hasOwnProperty("highlighted"),
469
+ selected: state.hasOwnProperty("selected"),
470
+ opacity: state.hasOwnProperty("opacity")
471
+ };
472
+ const updateAll = state.hasOwnProperty("isolated");
473
+ let changed = this.setStateValues(state);
474
+ // Update the related Entity.
475
+ if (changed && update) {
476
+ if (updateAll) {
477
+ this.updateAllEntities({
478
+ refresh: refresh
479
+ });
480
+ }
481
+ else {
482
+ this.queueUpdate({
483
+ entityId: state.entityId,
484
+ refresh: refresh
485
+ });
486
+ }
487
+ // Trigger update event.
488
+ if (this.onUpdate) {
489
+ const update = {
490
+ type: EVisualUpdateType.Update,
491
+ entityId: state.entityId
492
+ };
493
+ if (state.hasOwnProperty("selected")) {
494
+ update.selected = state.selected;
495
+ }
496
+ if (state.hasOwnProperty("opacity")) {
497
+ update.opacity = state.opacity;
498
+ }
499
+ if (state.hasOwnProperty("isolated")) {
500
+ update.isolated = state.isolated;
501
+ }
502
+ if (state.hasOwnProperty("hidden")) {
503
+ update.hidden = state.hidden;
504
+ }
505
+ if (source) {
506
+ update.source = source;
507
+ }
508
+ this.onUpdate.Trigger(update);
509
+ }
510
+ }
511
+ return changed;
512
+ }
513
+ SetStates(states, source) {
514
+ // Array of changed Entity IDs so we know what to refresh/notify at the end.
515
+ const entityIds = [];
516
+ // If we need to update all Entities.
517
+ // This is usually for isolation changes.
518
+ let updateAll = false;
519
+ // Map of individual Entity refresh settings.
520
+ let refresh = {};
521
+ // Settings to apply if a refresh-all is needed.
522
+ let refreshAccumulated = {};
523
+ // Indicator that at least one Entity state was updated.
524
+ let changed = false;
525
+ const updateRefreshMarkers = (state) => {
526
+ if (state.hasOwnProperty("isolated")) {
527
+ updateAll = true;
528
+ }
529
+ let values = refresh[state.entityId];
530
+ if (!values) {
531
+ values = refresh[state.entityId] = {};
532
+ }
533
+ if (state.hasOwnProperty("highlighted")) {
534
+ values.highlighted = true;
535
+ refreshAccumulated.highlighted = true;
536
+ }
537
+ if (state.hasOwnProperty("selected")) {
538
+ values.selected = true;
539
+ refreshAccumulated.selected = true;
540
+ }
541
+ if (state.hasOwnProperty("opacity")) {
542
+ values.opacity = true;
543
+ refreshAccumulated.opacity = true;
544
+ }
545
+ };
546
+ const doUpdate = (state) => {
547
+ const eChanged = this.SetState(state, false, source);
548
+ if (eChanged && !entityIds.includes(state.entityId)) {
549
+ updateRefreshMarkers(state);
550
+ entityIds.push(state.entityId);
551
+ changed = true;
552
+ }
553
+ };
554
+ if (Array.isArray(states)) {
555
+ for (let i = 0; i < states.length; i++) {
556
+ doUpdate(states[i]);
557
+ }
558
+ }
559
+ else {
560
+ Object.values(states).forEach(state => {
561
+ doUpdate(state);
562
+ });
563
+ }
564
+ if (changed) {
565
+ if (updateAll) {
566
+ this.updateAllEntities({
567
+ refresh: refreshAccumulated
568
+ });
569
+ }
570
+ else {
571
+ for (let i = 0; i < entityIds.length; i++) {
572
+ this.queueUpdate({
573
+ entityId: entityIds[i],
574
+ refresh: refresh[entityIds[i]]
575
+ });
576
+ }
577
+ }
578
+ // Trigger update event.
579
+ if (this.onUpdate) {
580
+ const keys = Object.keys(states);
581
+ for (let i = 0; i < keys.length; i++) {
582
+ const key = keys[i];
583
+ const state = states[key];
584
+ if (entityIds.includes(state.entityId)) {
585
+ const update = {
586
+ type: EVisualUpdateType.Update,
587
+ entityId: state.entityId
588
+ };
589
+ if (state.hasOwnProperty("selected")) {
590
+ update.selected = state.selected;
591
+ }
592
+ if (state.hasOwnProperty("opacity")) {
593
+ update.opacity = state.opacity;
594
+ }
595
+ if (state.hasOwnProperty("isolated")) {
596
+ update.isolated = state.isolated;
597
+ }
598
+ if (state.hasOwnProperty("hidden")) {
599
+ update.hidden = state.hidden;
600
+ }
601
+ if (source) {
602
+ update.source = source;
603
+ }
604
+ this.onUpdate.Trigger(update);
605
+ }
606
+ }
607
+ }
608
+ }
609
+ }
610
+ /**
611
+ * Sets the provided settings for a given Entity's state.
612
+ * @param params
613
+ */
614
+ setStateValues(values) {
615
+ const { entityId, menuItemId } = values;
616
+ const keys = Object.keys(values).filter(k => k !== "entityId" && k !== "menuItemId");
617
+ if (!keys.length) {
618
+ return false;
619
+ }
620
+ let changed = false;
621
+ const eStates = this.states[entityId] || {};
622
+ this.states[entityId] = eStates;
623
+ const targetMenuItemId = menuItemId || NO_MENU_ITEM_KEY;
624
+ let state = eStates[targetMenuItemId] || getBlankState(entityId, menuItemId);
625
+ eStates[targetMenuItemId] = state;
626
+ // Update state and detect changes.
627
+ for (const key of keys) {
628
+ if (state[key] !== values[key]) {
629
+ state[key] = values[key];
630
+ changed = true;
631
+ }
632
+ if (state[key] == null) {
633
+ delete state[key];
634
+ }
635
+ }
636
+ if (isBlankState(state)) {
637
+ delete eStates[targetMenuItemId];
638
+ if (Object.keys(eStates).length === 0) {
639
+ delete this.states[entityId];
640
+ }
641
+ }
642
+ // If no menuItemId, strip matching keys from other menu item states.
643
+ if (!menuItemId) {
644
+ for (const key in eStates) {
645
+ if (key !== NO_MENU_ITEM_KEY) {
646
+ const otherState = eStates[key];
647
+ for (const stateKey of keys) {
648
+ if (otherState.hasOwnProperty(stateKey)) {
649
+ changed = true;
650
+ delete otherState[stateKey];
651
+ }
652
+ }
653
+ if (isBlankState(otherState)) {
654
+ delete eStates[key];
655
+ }
656
+ }
657
+ }
658
+ if (Object.keys(eStates).length === 0) {
659
+ delete this.states[entityId];
660
+ }
661
+ }
662
+ return changed;
663
+ }
664
+ /**
665
+ * Returns all visual state settings.
666
+ * This is typically used for saving.
667
+ */
668
+ GetStates(params) {
669
+ const states = [];
670
+ // We flatten the dictionary into an array.
671
+ const keys = Object.keys(this.states);
672
+ for (let i = 0; i < keys.length; i++) {
673
+ const entityId = keys[i];
674
+ const eStates = this.states[entityId];
675
+ if (!eStates) {
676
+ continue;
677
+ }
678
+ const mKeys = Object.keys(eStates);
679
+ for (let j = 0; j < mKeys.length; j++) {
680
+ const menuItemId = mKeys[j];
681
+ const state = eStates[menuItemId];
682
+ if (!state) {
683
+ continue;
684
+ }
685
+ states.push(state);
686
+ }
687
+ }
688
+ if (!(params === null || params === void 0 ? void 0 : params.optimized)) {
689
+ return states;
690
+ }
691
+ const newStates = [];
692
+ for (let i = 0; i < states.length; i++) {
693
+ let state = states[i];
694
+ // Dereference.
695
+ state = {
696
+ ...state
697
+ };
698
+ if (state.opacity === 1) {
699
+ delete state.opacity;
700
+ }
701
+ if (state.hidden === false) {
702
+ delete state.hidden;
703
+ }
704
+ if (state.highlighted === false) {
705
+ delete state.highlighted;
706
+ }
707
+ if (state.selected === false) {
708
+ delete state.selected;
709
+ }
710
+ if (state.labelled === false) {
711
+ delete state.labelled;
712
+ }
713
+ if (state.isolated === false) {
714
+ delete state.isolated;
715
+ }
716
+ if (isBlankState(state)) {
717
+ continue;
718
+ }
719
+ newStates.push(state);
720
+ }
721
+ return newStates;
722
+ }
723
+ /**
724
+ * Applies a set of new states to override the existing ones.
725
+ * This can be a costly operation as it will update all visuals.
726
+ * @param states
727
+ */
728
+ OverrideStates(states) {
729
+ // Clear current states.
730
+ this.ClearOpacity();
731
+ this.ClearLabelled();
732
+ this.ClearSelected();
733
+ this.ClearHighlighted();
734
+ this.ClearIsolated();
735
+ this.ClearHidden();
736
+ this.states = {};
737
+ let newStates = {};
738
+ for (let i = 0; i < states.length; i++) {
739
+ const state = states[i];
740
+ if (!state.menuItemId && state.hasOwnProperty("menuItemId")) {
741
+ delete state.menuItemId;
742
+ }
743
+ if (!state.entityId) {
744
+ continue;
745
+ }
746
+ if (isBlankState(state)) {
747
+ continue;
748
+ }
749
+ if (!newStates[state.entityId]) {
750
+ newStates[state.entityId] = {};
751
+ }
752
+ newStates[state.entityId][state.menuItemId ? state.menuItemId : NO_MENU_ITEM_KEY] = {
753
+ ...state
754
+ };
755
+ }
756
+ this.states = newStates;
757
+ // Reflect the rest of the changes.
758
+ this.updateAllEntities();
759
+ }
760
+ /**
761
+ * Returns all states with the first detected Menu Item ID settings included.
762
+ * This is a utility function for returning settings for apps that don't support the newer state settings.
763
+ * @deprecated Use GetStates() or GetState().
764
+ * @returns
765
+ */
766
+ GetStatesLegacy() {
767
+ const states = {};
768
+ let entityIds = [];
769
+ let entityIdsMenuItem = {};
770
+ for (const entityId in this.states) {
771
+ const eStates = this.states[entityId];
772
+ if (!eStates) {
773
+ continue;
774
+ }
775
+ if (!entityIds.includes(entityId)) {
776
+ entityIds.push(entityId);
777
+ }
778
+ const mKeys = Object.keys(eStates);
779
+ for (let i = 0; i < mKeys.length; i++) {
780
+ const menuItemId = mKeys[i];
781
+ if (menuItemId) {
782
+ entityIdsMenuItem[entityId] = menuItemId;
783
+ }
784
+ }
785
+ }
786
+ for (let i = 0; i < entityIds.length; i++) {
787
+ const entityId = entityIds[i];
788
+ const state = this.GetState({
789
+ entityId: entityId,
790
+ // First known Menu Item.
791
+ menuItemId: entityIdsMenuItem[entityId]
792
+ });
793
+ states[entityId] = state;
794
+ }
795
+ // Remove empty states.
796
+ const keys = Object.keys(states);
797
+ for (let i = 0; i < keys.length; i++) {
798
+ const key = keys[i];
799
+ const state = states[key];
800
+ const idKeys = !state.menuItemId ? 1 : 2;
801
+ if (Object.keys(state).length === idKeys) {
802
+ delete states[key];
803
+ }
804
+ }
805
+ return states;
806
+ }
807
+ /**
808
+ * Utility to iterate over all states.
809
+ * @param callback
810
+ */
811
+ ForEachState(callback) {
812
+ // Flatten and iterate.
813
+ const keys = Object.keys(this.states);
814
+ for (let i = 0; i < keys.length; i++) {
815
+ const entityId = keys[i];
816
+ const eStates = this.states[entityId];
817
+ if (!eStates) {
818
+ continue;
819
+ }
820
+ const mKeys = Object.keys(eStates);
821
+ for (let j = 0; j < mKeys.length; j++) {
822
+ const menuItemId = mKeys[j];
823
+ const state = eStates[menuItemId];
824
+ if (!state) {
825
+ continue;
826
+ }
827
+ callback(state);
828
+ }
829
+ }
830
+ }
831
+ RefreshMark(params) {
832
+ const { rego } = params;
833
+ markEntity(this, rego, rego.visual, false);
834
+ }
835
+ Dispose() {
836
+ var _a;
837
+ (_a = this.cameraCullerDispose) === null || _a === void 0 ? void 0 : _a.call(this, {
838
+ uncull: false
839
+ });
840
+ this.cameraCullerDispose = null;
841
+ clearInterval(this.updateQueueInterval);
842
+ this.updateQueueInterval = null;
843
+ this.disposed = true;
844
+ }
845
+ ForceUpdate(params) {
846
+ var _a;
847
+ let { entityIds, requestRender, refreshColors, source } = params;
848
+ for (let i = 0; i < entityIds.length; i++) {
849
+ const entityId = entityIds[i];
850
+ this.queueUpdate({
851
+ entityId: entityId,
852
+ refresh: true
853
+ });
854
+ const update = {
855
+ type: EVisualUpdateType.Update,
856
+ entityId
857
+ };
858
+ if (source) {
859
+ update.source = source;
860
+ }
861
+ (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
862
+ }
863
+ }
864
+ /**
865
+ * Marks given entityIds as either labelled or not labelled.
866
+ * When an entity is labelled a label will be drawn on the "best" visual for it.
867
+ * @param params
868
+ */
869
+ SetLabelled(params) {
870
+ const { labelled, entityIds, requestRender, menuItemId } = params;
871
+ const cache = {};
872
+ for (let i = 0; i < entityIds.length; i++) {
873
+ const id = entityIds[i];
874
+ const state = this.GetState({
875
+ entityId: id,
876
+ menuItemId
877
+ });
878
+ const doLabel = Boolean(state.labelled) != labelled;
879
+ this.setStateValues({
880
+ entityId: id,
881
+ menuItemId: menuItemId,
882
+ // Null means it will be deleted from the object.
883
+ labelled: labelled ? true : null
884
+ });
885
+ if (doLabel) {
886
+ this.queueUpdate({
887
+ entityId: id,
888
+ refresh: false
889
+ });
890
+ }
891
+ }
892
+ }
893
+ /**
894
+ * Returns if given entity id is labelled.
895
+ * @param params
896
+ */
897
+ GetIsLabelled(params) {
898
+ const { entityId: id, menuItemId } = params;
899
+ const state = this.GetState({
900
+ entityId: id,
901
+ menuItemId
902
+ });
903
+ return state.labelled === true;
904
+ }
905
+ /**
906
+ * Clears all labelled entities.
907
+ * @param params
908
+ */
909
+ ClearLabelled(params) {
910
+ const cache = {};
911
+ const toUpdateIds = [];
912
+ this.ForEachState((state) => {
913
+ if (state.labelled == null || state.labelled === undefined) {
914
+ return;
915
+ }
916
+ delete state.labelled;
917
+ if (!toUpdateIds.includes(state.entityId)) {
918
+ toUpdateIds.push(state.entityId);
919
+ }
920
+ });
921
+ for (let i = 0; i < toUpdateIds.length; i++) {
922
+ const id = toUpdateIds[i];
923
+ this.queueUpdate({
924
+ entityId: id,
925
+ refresh: false
926
+ });
927
+ }
928
+ }
929
+ /**
930
+ * Returns all labelled entity ids.
931
+ * @deprecated Use GetStates() or GetState().
932
+ */
933
+ GetLabelled() {
934
+ const labelledIds = [];
935
+ const states = this.GetStatesLegacy();
936
+ for (const entityId in states) {
937
+ if (states[entityId].labelled) {
938
+ labelledIds.push(entityId);
939
+ }
940
+ }
941
+ return labelledIds;
942
+ }
943
+ /**
944
+ * Updates the selection color.
945
+ * This will not update the selection color for already selected entities.
946
+ * @param color
947
+ */
948
+ SetSelectionColor(color) {
949
+ if (color) {
950
+ cesium_entity_styler_1.CesiumEntityStyler.UpdateColorSetting("select", color);
951
+ }
952
+ }
953
+ /**
954
+ * Updates the highlight color.
955
+ * This will not update the highlight color for already highlighted entities.
956
+ * @param color
957
+ */
958
+ SetHighlightColor(color) {
959
+ if (color) {
960
+ cesium_entity_styler_1.CesiumEntityStyler.UpdateColorSetting("highlight", color);
961
+ }
962
+ }
963
+ SetSelected(params) {
964
+ var _a;
965
+ let { entityIds, selected, refreshIfSelected, requestRender, menuItemId, source } = params;
966
+ if (refreshIfSelected == null || refreshIfSelected === undefined) {
967
+ refreshIfSelected = true;
968
+ }
969
+ for (let i = 0; i < entityIds.length; i++) {
970
+ const id = entityIds[i];
971
+ const state = this.GetState({
972
+ entityId: id,
973
+ menuItemId
974
+ });
975
+ // Checking if we need to refresh the selection.
976
+ const doSelect = refreshIfSelected || (Boolean(state.selected) != selected);
977
+ this.setStateValues({
978
+ entityId: id,
979
+ menuItemId: menuItemId,
980
+ // Null means it will be deleted from the object.
981
+ selected: selected ? true : null
982
+ });
983
+ if (selected) {
984
+ if (doSelect) {
985
+ const regos = this.rego[id];
986
+ if (regos) {
987
+ for (let i = 0; i < regos.length; i++) {
988
+ const rego = regos[i];
989
+ if (menuItemId && rego.menuItemId !== menuItemId) {
990
+ continue;
991
+ }
992
+ cesium_entity_styler_1.CesiumEntityStyler.Select({
993
+ entity: rego.visual,
994
+ viewer: this.viewer,
995
+ requestRender: false
996
+ });
997
+ }
998
+ }
999
+ }
1000
+ }
1001
+ else {
1002
+ if (doSelect) {
1003
+ const regos = this.rego[id];
1004
+ if (regos) {
1005
+ for (let i = 0; i < regos.length; i++) {
1006
+ const rego = regos[i];
1007
+ if (menuItemId && rego.menuItemId !== menuItemId) {
1008
+ continue;
1009
+ }
1010
+ cesium_entity_styler_1.CesiumEntityStyler.Deselect({
1011
+ entity: rego.visual,
1012
+ viewer: this.viewer,
1013
+ requestRender: false
1014
+ });
1015
+ }
1016
+ }
1017
+ }
1018
+ }
1019
+ const update = {
1020
+ entityId: id,
1021
+ type: EVisualUpdateType.Update,
1022
+ selected: selected
1023
+ };
1024
+ if (source) {
1025
+ update.source = source;
1026
+ }
1027
+ (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
1028
+ }
1029
+ if (requestRender != false) {
1030
+ this.viewer.scene.requestRender();
1031
+ }
1032
+ }
1033
+ GetIsSelected(params) {
1034
+ const { entityId: id, menuItemId } = params;
1035
+ const state = this.GetState({
1036
+ entityId: id,
1037
+ menuItemId
1038
+ });
1039
+ return state.selected === true;
1040
+ }
1041
+ ClearSelected(params) {
1042
+ var _a;
1043
+ const cleared = [];
1044
+ this.ForEachState((state) => {
1045
+ if (state.selected == null || state.selected === undefined) {
1046
+ return;
1047
+ }
1048
+ delete state.selected;
1049
+ const regos = this.GetRegos({
1050
+ entityId: state.entityId,
1051
+ menuItemId: state.menuItemId
1052
+ });
1053
+ for (let i = 0; i < regos.length; i++) {
1054
+ const rego = regos[i];
1055
+ if ((rego === null || rego === void 0 ? void 0 : rego.visual) && !cleared.includes(rego)) {
1056
+ cesium_entity_styler_1.CesiumEntityStyler.Deselect({
1057
+ entity: rego.visual,
1058
+ viewer: this.viewer,
1059
+ requestRender: false
1060
+ });
1061
+ cleared.push(rego);
1062
+ }
1063
+ }
1064
+ });
1065
+ const update = {
1066
+ type: EVisualUpdateType.DeselectAll
1067
+ };
1068
+ if (params === null || params === void 0 ? void 0 : params.source) {
1069
+ update.source = params.source;
1070
+ }
1071
+ (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
1072
+ if ((params === null || params === void 0 ? void 0 : params.requestRender) != false) {
1073
+ this.viewer.scene.requestRender();
1074
+ }
1075
+ }
1076
+ /**
1077
+ * @deprecated Use GetStates() or GetState().
1078
+ * @returns
1079
+ */
1080
+ GetSelected() {
1081
+ const selectedIds = [];
1082
+ const states = this.GetStatesLegacy();
1083
+ for (const entityId in states) {
1084
+ if (states[entityId].selected) {
1085
+ selectedIds.push(entityId);
1086
+ }
1087
+ }
1088
+ return selectedIds;
1089
+ }
1090
+ SetHighlighted(params) {
1091
+ let { entityIds, highlighted, refreshIfHighlighted, requestRender, menuItemId } = params;
1092
+ if (refreshIfHighlighted || refreshIfHighlighted === undefined) {
1093
+ refreshIfHighlighted = true;
1094
+ }
1095
+ for (let i = 0; i < entityIds.length; i++) {
1096
+ const id = entityIds[i];
1097
+ const state = this.GetState({
1098
+ entityId: id,
1099
+ menuItemId
1100
+ });
1101
+ // Checking if we need to refresh the highlight.
1102
+ const doHighlight = refreshIfHighlighted || (Boolean(state.highlighted) != highlighted);
1103
+ const changed = this.setStateValues({
1104
+ entityId: id,
1105
+ menuItemId: menuItemId,
1106
+ // Null means it will be deleted from the object.
1107
+ highlighted: highlighted ? true : null
1108
+ });
1109
+ if (highlighted) {
1110
+ if (doHighlight) {
1111
+ const regos = this.rego[id];
1112
+ if (regos) {
1113
+ for (let i = 0; i < regos.length; i++) {
1114
+ const rego = regos[i];
1115
+ if (menuItemId && rego.menuItemId !== menuItemId) {
1116
+ continue;
1117
+ }
1118
+ cesium_entity_styler_1.CesiumEntityStyler.Highlight({
1119
+ entity: rego.visual,
1120
+ viewer: this.viewer,
1121
+ requestRender: false
1122
+ });
1123
+ }
1124
+ }
1125
+ }
1126
+ }
1127
+ else {
1128
+ const regos = this.rego[id];
1129
+ if (regos) {
1130
+ for (let i = 0; i < regos.length; i++) {
1131
+ const rego = regos[i];
1132
+ if (menuItemId && rego.menuItemId !== menuItemId) {
1133
+ continue;
1134
+ }
1135
+ cesium_entity_styler_1.CesiumEntityStyler.Unhighlight({
1136
+ entity: rego.visual,
1137
+ viewer: this.viewer,
1138
+ requestRender: false
1139
+ });
1140
+ }
1141
+ }
1142
+ }
1143
+ }
1144
+ if (requestRender != false) {
1145
+ this.viewer.scene.requestRender();
1146
+ }
1147
+ }
1148
+ GetIsHighlighted(params) {
1149
+ const { entityId: id, menuItemId } = params;
1150
+ const state = this.GetState({
1151
+ entityId: id,
1152
+ menuItemId
1153
+ });
1154
+ return state.highlighted === true;
1155
+ }
1156
+ ClearHighlighted(params) {
1157
+ // Null all states.
1158
+ let entityIds = [];
1159
+ this.ForEachState((state) => {
1160
+ if (state.highlighted) {
1161
+ delete state.highlighted;
1162
+ if (!entityIds.includes(state.entityId)) {
1163
+ entityIds.push(state.entityId);
1164
+ }
1165
+ }
1166
+ });
1167
+ // Revert needed visual changes.
1168
+ for (let i = 0; i < entityIds.length; i++) {
1169
+ const id = entityIds[i];
1170
+ const regos = this.rego[id];
1171
+ if (regos) {
1172
+ for (let i = 0; i < regos.length; i++) {
1173
+ const rego = regos[i];
1174
+ cesium_entity_styler_1.CesiumEntityStyler.Unhighlight({
1175
+ entity: rego.visual,
1176
+ viewer: this.viewer,
1177
+ requestRender: false
1178
+ });
1179
+ }
1180
+ }
1181
+ }
1182
+ if ((params === null || params === void 0 ? void 0 : params.requestRender) != false) {
1183
+ this.viewer.scene.requestRender();
1184
+ }
1185
+ }
1186
+ /**
1187
+ * @deprecated Use GetStates() or GetState().
1188
+ * @returns
1189
+ */
1190
+ GetHighlighted() {
1191
+ const highlightedIds = [];
1192
+ const states = this.GetStatesLegacy();
1193
+ for (const entityId in states) {
1194
+ if (states[entityId].highlighted) {
1195
+ highlightedIds.push(entityId);
1196
+ }
1197
+ }
1198
+ return highlightedIds;
1199
+ }
1200
+ SetIsolated(params) {
1201
+ var _a;
1202
+ const { entityIds, isolated: isolate, requestRender, menuItemId, source } = params;
1203
+ for (let i = 0; i < entityIds.length; i++) {
1204
+ const entityId = entityIds[i];
1205
+ this.setStateValues({
1206
+ entityId: entityId,
1207
+ menuItemId: menuItemId,
1208
+ // Null means it will be deleted from the object.
1209
+ isolated: isolate ? true : null
1210
+ });
1211
+ const update = {
1212
+ entityId: entityId,
1213
+ type: EVisualUpdateType.Update,
1214
+ isolated: isolate
1215
+ };
1216
+ if (source) {
1217
+ update.source = source;
1218
+ }
1219
+ (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
1220
+ }
1221
+ this.updateAllEntities({
1222
+ requestRender: false,
1223
+ refresh: isolate
1224
+ });
1225
+ if (requestRender != false) {
1226
+ this.viewer.scene.requestRender();
1227
+ }
1228
+ }
1229
+ GetIsIsolated(params) {
1230
+ const { entityId: id, menuItemId } = params;
1231
+ const state = this.GetState({
1232
+ entityId: id,
1233
+ menuItemId: menuItemId
1234
+ });
1235
+ return state.isolated === true;
1236
+ }
1237
+ GetIsIsolatedAny() {
1238
+ return Object.values(this.states).some(state => state && Object.values(state).some(item => item.isolated));
1239
+ }
1240
+ /**
1241
+ * @deprecated Use GetStates() or GetState().
1242
+ * @returns
1243
+ */
1244
+ GetIsolated() {
1245
+ const isolatedIds = [];
1246
+ const states = this.GetStatesLegacy();
1247
+ for (const entityId in states) {
1248
+ if (states[entityId].isolated) {
1249
+ isolatedIds.push(entityId);
1250
+ }
1251
+ }
1252
+ return isolatedIds;
1253
+ }
1254
+ ClearIsolated(params) {
1255
+ let changed = false;
1256
+ this.ForEachState((state) => {
1257
+ if (state.isolated) {
1258
+ changed = true;
1259
+ }
1260
+ delete state.isolated;
1261
+ });
1262
+ if (changed) {
1263
+ this.updateAllEntities({
1264
+ requestRender: params === null || params === void 0 ? void 0 : params.requestRender,
1265
+ refresh: true
1266
+ });
1267
+ }
1268
+ }
1269
+ SetHidden(params) {
1270
+ const { entityIds, hidden, requestRender, menuItemId, source } = params;
1271
+ const stateChanges = [];
1272
+ for (let i = 0; i < entityIds.length; i++) {
1273
+ const entityId = entityIds[i];
1274
+ const state = {
1275
+ entityId: entityId,
1276
+ hidden: hidden
1277
+ };
1278
+ if (menuItemId) {
1279
+ state.menuItemId = menuItemId;
1280
+ }
1281
+ stateChanges.push(state);
1282
+ }
1283
+ this.SetStates(stateChanges, source);
1284
+ }
1285
+ GetIsHidden(params) {
1286
+ const { entityId: id, menuItemId } = params;
1287
+ const state = this.GetState({
1288
+ entityId: id,
1289
+ menuItemId: menuItemId
1290
+ });
1291
+ return state.hidden === true;
1292
+ }
1293
+ /**
1294
+ * @deprecated Use GetStates() or GetState().
1295
+ * @returns
1296
+ */
1297
+ GetHidden() {
1298
+ const hiddenIds = [];
1299
+ const states = this.GetStatesLegacy();
1300
+ for (const entityId in states) {
1301
+ if (states[entityId].hidden) {
1302
+ hiddenIds.push(entityId);
1303
+ }
1304
+ }
1305
+ return hiddenIds;
1306
+ }
1307
+ ClearHidden(params) {
1308
+ var _a;
1309
+ let changed = false;
1310
+ this.ForEachState((state) => {
1311
+ if (state.hidden) {
1312
+ changed = true;
1313
+ }
1314
+ delete state.hidden;
1315
+ });
1316
+ if (changed) {
1317
+ this.updateAllEntities({
1318
+ requestRender: params === null || params === void 0 ? void 0 : params.requestRender,
1319
+ refresh: true
1320
+ });
1321
+ }
1322
+ const update = {
1323
+ type: EVisualUpdateType.Update,
1324
+ hidden: false
1325
+ };
1326
+ if (params === null || params === void 0 ? void 0 : params.source) {
1327
+ update.source = params.source;
1328
+ }
1329
+ (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
1330
+ }
1331
+ AddRego(params) {
1332
+ var _a, _b;
1333
+ const { rego, requestRender, source } = params;
1334
+ // ND-2078
1335
+ // Tilesets will often add -> remove -> add because of how tiles load in and out of the scene.
1336
+ // To avoid flickering, we'll just replace rather than remove -> add.
1337
+ if (!rego.tilesetId && params.removePrior != false) {
1338
+ this.RemoveRegos({
1339
+ entityId: rego.entityId,
1340
+ menuItemId: rego.menuItemId,
1341
+ doUpdate: false,
1342
+ requestRender: false
1343
+ });
1344
+ }
1345
+ const entityId = rego.entityId;
1346
+ // Add the new visual to the register.
1347
+ const entityRegos = (_a = this.rego[entityId]) !== null && _a !== void 0 ? _a : [];
1348
+ entityRegos.push(rego);
1349
+ this.rego[entityId] = entityRegos;
1350
+ // Mark the visual as part of this register so selection works.
1351
+ markEntity(this, rego, rego.visual, false);
1352
+ // Run any updates on the visual based on the calculated state.
1353
+ // Eg: visibility, opacity, selection, etc.
1354
+ this.queueUpdate({
1355
+ entityId: entityId,
1356
+ refresh: true
1357
+ });
1358
+ const update = {
1359
+ rego: rego,
1360
+ type: EVisualUpdateType.Add,
1361
+ entityId: rego.entityId
1362
+ };
1363
+ if (source) {
1364
+ update.source = source;
1365
+ }
1366
+ (_b = this.onUpdate) === null || _b === void 0 ? void 0 : _b.Trigger(update);
1367
+ if (requestRender != false) {
1368
+ this.viewer.scene.requestRender();
1369
+ }
1370
+ }
1371
+ /**
1372
+ * Locates a visual corresponding to a given entity id.
1373
+ * If no menu item id is provided, then it will pick the "best" one.
1374
+ * @param params
1375
+ * @returns
1376
+ */
1377
+ GetRego(params) {
1378
+ const { entityId, menuItemId, relation } = params;
1379
+ if (relation) {
1380
+ const relationKey = relation_render_engine_1.RelationRenderEngine.GetRenderGroupId(relation);
1381
+ for (const entityId in this.rego) {
1382
+ const entityRegos = this.rego[entityId];
1383
+ if (entityRegos) {
1384
+ const rego = entityRegos.find(r => r.relation && relation_render_engine_1.RelationRenderEngine.GetRenderGroupId(r.relation) == relationKey);
1385
+ if (rego) {
1386
+ return rego;
1387
+ }
1388
+ }
1389
+ }
1390
+ }
1391
+ else {
1392
+ const entityRegos = this.rego[entityId];
1393
+ if (!entityRegos) {
1394
+ return null;
1395
+ }
1396
+ if (menuItemId) {
1397
+ return entityRegos.find(r => r.menuItemId === menuItemId);
1398
+ }
1399
+ return entityRegos.sort((a, b) => {
1400
+ return b.priority - a.priority;
1401
+ })[0];
1402
+ }
1403
+ }
1404
+ /**
1405
+ * Returns regos matching given criteria.
1406
+ * Either entityId or menuItemId must be provided.
1407
+ * @param params
1408
+ * @returns
1409
+ */
1410
+ GetRegos(params) {
1411
+ // TODO: refactor.
1412
+ // Currently this was made by merging two functions.
1413
+ const { entityId, menuItemId } = params;
1414
+ if (entityId) {
1415
+ const entityId = params.entityId;
1416
+ const entityRegos = this.rego[entityId];
1417
+ if (!entityRegos) {
1418
+ return [];
1419
+ }
1420
+ return menuItemId ? entityRegos.filter(x => x.menuItemId == menuItemId) : entityRegos;
1421
+ }
1422
+ else if (menuItemId) {
1423
+ const menuItemId = params.menuItemId;
1424
+ const visuals = [];
1425
+ for (const entityId in this.rego) {
1426
+ const entityRegos = this.rego[entityId];
1427
+ if (entityRegos) {
1428
+ const rego = entityRegos.find(r => r.menuItemId === menuItemId);
1429
+ if (rego) {
1430
+ visuals.push(rego);
1431
+ }
1432
+ }
1433
+ }
1434
+ return visuals;
1435
+ }
1436
+ }
1437
+ /**
1438
+ * Removes regos matching given criteria.
1439
+ * Either entityId or menuItemId must be provided.
1440
+ * @param params
1441
+ * @returns
1442
+ */
1443
+ RemoveRegos(params) {
1444
+ var _a, _b, _c;
1445
+ let { entityId, menuItemId, doUpdate, relation, retainTagIds, requestRender, doRemove, source } = params;
1446
+ if (doUpdate == null || doUpdate === undefined) {
1447
+ doUpdate = true;
1448
+ }
1449
+ if (retainTagIds == null || retainTagIds === undefined) {
1450
+ retainTagIds = [];
1451
+ }
1452
+ // TODO: refactor.
1453
+ // Currently this was made by merging two functions.
1454
+ if (menuItemId && !entityId) {
1455
+ for (const entityId in this.rego) {
1456
+ const entityRegos = this.rego[entityId];
1457
+ if (entityRegos) {
1458
+ const rego = entityRegos.find(r => r.menuItemId === menuItemId);
1459
+ if (!rego) {
1460
+ continue;
1461
+ }
1462
+ const regoTagIds = rego.tagIds ? rego.tagIds : [];
1463
+ const shouldRetain = regoTagIds.some(tagId => retainTagIds.includes(tagId));
1464
+ if (shouldRetain) {
1465
+ continue;
1466
+ }
1467
+ entity_label_1.EntityLabel.Detatch({
1468
+ rego
1469
+ });
1470
+ if (doRemove != false) {
1471
+ removeEntity(this.viewer, rego.visual);
1472
+ }
1473
+ rego.visual = null;
1474
+ const doesInclude = this.rego[entityId].find(r => r.menuItemId === menuItemId);
1475
+ if (doesInclude) {
1476
+ this.rego[entityId] = entityRegos.filter(r => r.menuItemId !== menuItemId);
1477
+ }
1478
+ const update = {
1479
+ type: EVisualUpdateType.Remove,
1480
+ entityId: rego.entityId,
1481
+ rego: rego
1482
+ };
1483
+ if (source) {
1484
+ update.source = source;
1485
+ }
1486
+ (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
1487
+ if (doesInclude) {
1488
+ this.queueUpdate({
1489
+ entityId: entityId,
1490
+ refresh: false
1491
+ });
1492
+ }
1493
+ }
1494
+ }
1495
+ }
1496
+ else if (entityId) {
1497
+ const entityRegos = this.rego[entityId];
1498
+ if (!entityRegos) {
1499
+ return;
1500
+ }
1501
+ const menuItems = menuItemId ? [menuItemId] : entityRegos.map(x => x.menuItemId);
1502
+ for (let i = 0; i < menuItems.length; i++) {
1503
+ const menuItemId = menuItems[i];
1504
+ const rego = entityRegos.find(r => r.menuItemId === menuItemId);
1505
+ if (!rego) {
1506
+ return;
1507
+ }
1508
+ entity_label_1.EntityLabel.Detatch({
1509
+ rego
1510
+ });
1511
+ if (doRemove != false) {
1512
+ removeEntity(this.viewer, rego.visual);
1513
+ }
1514
+ rego.visual = null;
1515
+ const update = {
1516
+ type: EVisualUpdateType.Remove,
1517
+ entityId: rego.entityId,
1518
+ rego: rego
1519
+ };
1520
+ if (source) {
1521
+ update.source = source;
1522
+ }
1523
+ (_b = this.onUpdate) === null || _b === void 0 ? void 0 : _b.Trigger(update);
1524
+ this.rego[entityId] = entityRegos.filter(r => r.menuItemId !== menuItemId);
1525
+ if (doUpdate && menuItemId) {
1526
+ this.queueUpdate({
1527
+ entityId: entityId,
1528
+ refresh: false
1529
+ });
1530
+ }
1531
+ }
1532
+ }
1533
+ else if (relation) {
1534
+ const relationKey = relation_render_engine_1.RelationRenderEngine.GetRenderGroupId(relation);
1535
+ for (const entityId in this.rego) {
1536
+ const entityRegos = this.rego[entityId];
1537
+ if (entityRegos) {
1538
+ const rego = entityRegos.find(r => r.relation && relation_render_engine_1.RelationRenderEngine.GetRenderGroupId(r.relation) == relationKey);
1539
+ if (!rego) {
1540
+ continue;
1541
+ }
1542
+ entity_label_1.EntityLabel.Detatch({
1543
+ rego
1544
+ });
1545
+ removeEntity(this.viewer, rego.visual);
1546
+ rego.visual = null;
1547
+ this.rego[entityId] = entityRegos.filter(r => r.menuItemId !== menuItemId);
1548
+ const update = {
1549
+ type: EVisualUpdateType.Remove,
1550
+ entityId: rego.entityId,
1551
+ rego: rego
1552
+ };
1553
+ if (source) {
1554
+ update.source = source;
1555
+ }
1556
+ (_c = this.onUpdate) === null || _c === void 0 ? void 0 : _c.Trigger(update);
1557
+ if (doUpdate && menuItemId) {
1558
+ this.queueUpdate({
1559
+ entityId: entityId,
1560
+ refresh: false
1561
+ });
1562
+ }
1563
+ }
1564
+ }
1565
+ }
1566
+ }
1567
+ /**
1568
+ * Returns an array of drilled visuals associated with this register.
1569
+ * The top array item is the first found.
1570
+ * @param params
1571
+ * @returns
1572
+ */
1573
+ GetRegosFromCursor(params) {
1574
+ var _a, _b;
1575
+ const { cursor } = params;
1576
+ const found = [];
1577
+ const width = Math.ceil((0, js_utils_1.EnsureNumber)(params.width, 5));
1578
+ const height = Math.ceil((0, js_utils_1.EnsureNumber)(params.height, 5));
1579
+ const pickLimit = Math.ceil((0, js_utils_1.EnsureNumber)(params.pickLimit, 5));
1580
+ const picked = this.viewer.scene.drillPick(new Cesium.Cartesian2(cursor.x, cursor.y), pickLimit, width, height);
1581
+ for (let i = 0; i < picked.length; i++) {
1582
+ const object = picked[i];
1583
+ const entity = (object && object.id && object.id instanceof Cesium.Entity ? object.id : object);
1584
+ const visual = entity;
1585
+ if (((_a = visual === null || visual === void 0 ? void 0 : visual._register) === null || _a === void 0 ? void 0 : _a.Id) == this.id) {
1586
+ const foundEntityId = (_b = visual._rego) === null || _b === void 0 ? void 0 : _b.entityId;
1587
+ if (foundEntityId && found.findIndex(x => x.entityId == foundEntityId) <= -1) {
1588
+ found.push(visual._rego);
1589
+ }
1590
+ }
1591
+ }
1592
+ return {
1593
+ regos: found
1594
+ };
1595
+ }
1596
+ /**
1597
+ * Returns all registered entity ids.
1598
+ */
1599
+ GetEntityIds() {
1600
+ const ids = [];
1601
+ for (const entityId in this.rego) {
1602
+ const regos = this.rego[entityId];
1603
+ if (regos && regos.length) {
1604
+ ids.push(entityId);
1605
+ }
1606
+ }
1607
+ return ids;
1608
+ }
1609
+ /**
1610
+ * Marks regos corresponding to given entity ids as stale.
1611
+ * This will cause them to be updated on the next update cycle.
1612
+ * Optionally include menu item ids to restrict the filter.
1613
+ * @param params
1614
+ */
1615
+ MarkStale(params) {
1616
+ const { entityIds, menuItemIds } = params;
1617
+ for (const entityId of entityIds) {
1618
+ const regos = this.rego[entityId];
1619
+ if (regos && regos.length) {
1620
+ for (const rego of regos) {
1621
+ if (!menuItemIds || menuItemIds.includes(rego.menuItemId)) {
1622
+ rego.stale = true;
1623
+ }
1624
+ }
1625
+ }
1626
+ }
1627
+ }
1628
+ updateAllEntities(params) {
1629
+ for (const entityId in this.rego) {
1630
+ const regos = this.rego[entityId];
1631
+ if (regos && regos.length) {
1632
+ this.queueUpdate({
1633
+ entityId: entityId,
1634
+ refresh: (params === null || params === void 0 ? void 0 : params.refresh) == null ? true : params.refresh
1635
+ });
1636
+ }
1637
+ }
1638
+ }
1639
+ /**
1640
+ * Sets opacity for given set of entities.
1641
+ * 100% opacity is treated as "use original".
1642
+ * @param params
1643
+ */
1644
+ SetOpacity(params) {
1645
+ var _a;
1646
+ let { opacity, entityIds, menuItemId, requestRender, source } = params;
1647
+ for (const entityId of entityIds) {
1648
+ this.setStateValues({
1649
+ entityId: entityId,
1650
+ menuItemId: menuItemId,
1651
+ opacity: opacity
1652
+ });
1653
+ const update = {
1654
+ type: EVisualUpdateType.Update,
1655
+ entityId: entityId,
1656
+ opacity: opacity
1657
+ };
1658
+ if (source) {
1659
+ update.source = source;
1660
+ }
1661
+ (_a = this.onUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(update);
1662
+ this.queueUpdate({
1663
+ entityId: entityId,
1664
+ refresh: {
1665
+ opacity: true
1666
+ }
1667
+ });
1668
+ }
1669
+ }
1670
+ /**
1671
+ * Returns opacity for given entity/s.
1672
+ * If multiple entities are supplied, then the average is returned.
1673
+ * Unknown opacity is treated as 100% opacity.
1674
+ * @param params
1675
+ * @returns
1676
+ */
1677
+ GetOpacity(params) {
1678
+ let { entityIds, entityId, menuItemId, menuItemIds } = params;
1679
+ if (!entityIds) {
1680
+ entityIds = entityId ? [entityId] : [];
1681
+ }
1682
+ if (!menuItemIds && menuItemId) {
1683
+ menuItemIds = menuItemId;
1684
+ }
1685
+ let totalOpacity = null;
1686
+ let totalTicks = 0;
1687
+ for (const entityId of entityIds) {
1688
+ const rego = this.GetRego({
1689
+ entityId: entityId,
1690
+ menuItemId: menuItemId
1691
+ });
1692
+ if (rego) {
1693
+ const state = this.GetState({
1694
+ entityId: entityId,
1695
+ menuItemId: rego.menuItemId
1696
+ });
1697
+ let opacity = state === null || state === void 0 ? void 0 : state.opacity;
1698
+ if (opacity != null) {
1699
+ totalOpacity += opacity;
1700
+ totalTicks += 1;
1701
+ }
1702
+ }
1703
+ }
1704
+ return (totalOpacity && totalTicks) ? (totalOpacity / totalTicks) : totalOpacity != null && typeof totalOpacity == "number" ? totalOpacity : 1;
1705
+ }
1706
+ ClearOpacity(params) {
1707
+ const clearedIds = [];
1708
+ this.ForEachState((state) => {
1709
+ if (!clearedIds.includes(state.entityId) && state.opacity != null) {
1710
+ this.queueUpdate({
1711
+ entityId: state.entityId,
1712
+ refresh: {
1713
+ opacity: true
1714
+ }
1715
+ });
1716
+ clearedIds.push(state.entityId);
1717
+ }
1718
+ delete state.opacity;
1719
+ });
1720
+ }
1721
+ /**
1722
+ * Returns a dictionary containing entityId -> opacity values.
1723
+ * Opacity 1 = 100%.
1724
+ * @returns
1725
+ * @deprecated Use GetStates() or GetState().
1726
+ */
1727
+ GetOpacityMap() {
1728
+ const map = {};
1729
+ const states = this.GetStatesLegacy();
1730
+ for (const entityId in states) {
1731
+ const opacity = states[entityId].opacity;
1732
+ if (opacity != null && opacity != 1) {
1733
+ map[entityId] = opacity;
1734
+ }
1735
+ }
1736
+ return map;
1737
+ }
1738
+ }
1739
+ VisualsRegister.Register = Register;
1740
+ })(VisualsRegister = exports.VisualsRegister || (exports.VisualsRegister = {}));
1741
+ //# sourceMappingURL=visuals-register.js.map