From f4e2ffee97c11b7b04441829911f45a023409359 Mon Sep 17 00:00:00 2001 From: alebinson Date: Sun, 28 Jun 2026 13:05:23 +0300 Subject: [PATCH] feat: update resium and cesium --- packages/react-components/package.json | 4 +- .../components/cesium-map/helpers/utils.ts | 4 +- .../components/cesium-map/layers-manager.ts | 25 +- .../layers/3d.tileset.with.update.tsx | 163 ++++++------ .../cesium-map/layers/imagery.layer.tsx | 8 +- .../cesium-map/layers/wfs.layer.tsx | 2 +- .../src/components/cesium-map/map.tsx | 223 +++++++++-------- .../tools/zoom-level-tracker.tool.tsx | 19 +- yarn.lock | 235 ++++++++---------- 9 files changed, 340 insertions(+), 343 deletions(-) diff --git a/packages/react-components/package.json b/packages/react-components/package.json index 166d1b2a..b9514f2e 100644 --- a/packages/react-components/package.json +++ b/packages/react-components/package.json @@ -41,7 +41,7 @@ "@turf/intersect": "^6.1.3", "@turf/point-to-polygon-distance": "^7.2.0", "@turf/rewind": "^5.1.5", - "cesium": "1.103.0", + "cesium": "1.142.0", "chonky": "^2.3.2", "chonky-icon-fontawesome": "^2.3.2", "copy-webpack-plugin": "^6.3.1", @@ -59,7 +59,7 @@ "react-move": "^6.5.0", "react-rxjs": "^2.0.8", "react-select": "5.7.3", - "resium": "1.16.1", + "resium": "1.23.0", "rimraf": "3.0.2", "rxjs": "^7.8.1", "textarea-caret": "^3.1.0", diff --git a/packages/react-components/src/components/cesium-map/helpers/utils.ts b/packages/react-components/src/components/cesium-map/helpers/utils.ts index df95ae2a..a24946e9 100644 --- a/packages/react-components/src/components/cesium-map/helpers/utils.ts +++ b/packages/react-components/src/components/cesium-map/helpers/utils.ts @@ -278,7 +278,7 @@ export const computeLimitedViewRectangle = (mapViewer: CesiumViewer, maxDistance } // Calculate the Field of View (FOV) of the camera - const fov = camera.frustum instanceof PerspectiveFrustum ? camera.frustum.fov : Math.PI / 3; // Default FOV if not PerspectiveFrustum + const fov = camera.frustum instanceof PerspectiveFrustum ? camera.frustum.fov ?? Math.PI / 3 : Math.PI / 3; // Default FOV if not PerspectiveFrustum // Apply zoom scaling based on camera height and FOV let zoomFactor = 1.0; @@ -418,7 +418,7 @@ export const defaultVisualizationHandler = ( pixelWidth: number, pixelHeight: number ): { widthMeters: number; heightMeters: number } | null => { - const screenPosition = SceneTransforms.wgs84ToWindowCoordinates(scene, position); + const screenPosition = SceneTransforms.worldToWindowCoordinates(scene, position); if (!screenPosition) return null; diff --git a/packages/react-components/src/components/cesium-map/layers-manager.ts b/packages/react-components/src/components/cesium-map/layers-manager.ts index c52ee5f7..a7cfe6f5 100644 --- a/packages/react-components/src/components/cesium-map/layers-manager.ts +++ b/packages/react-components/src/components/cesium-map/layers-manager.ts @@ -117,16 +117,12 @@ class LayerManager { // A general place to extend layer's data. Should be done when all providers(different types) are initialized public addMetaToLayer(meta: any, layerPredicate: (layer: ImageryLayer, idx: number) => boolean): void { - const layersReadyPromises = this.layers.map((item) => item.imageryProvider.readyPromise); - - Promise.all(layersReadyPromises).then(() => { - const layer = this.layers.find(layerPredicate); - if (layer) { - layer.meta = { ...(layer.meta ?? {}), ...meta }; - this.setLegends(); - this.layerUpdated.raiseEvent(meta); - } - }); + const layer = this.layers.find(layerPredicate); + if (layer) { + layer.meta = { ...(layer.meta ?? {}), ...meta }; + this.setLegends(); + this.layerUpdated.raiseEvent(meta); + } } public addMetaToDataLayer(meta: any): void { @@ -500,7 +496,7 @@ class LayerManager { continue; } - if (relevantToExtent !== layer.show && layer.imageryProvider.ready) { + if (relevantToExtent !== layer.show) { layer.show = relevantToExtent; } } @@ -511,9 +507,7 @@ class LayerManager { if (layer.meta?.id === TRANSPARENT_LAYER_ID) { continue; } - if (layer.imageryProvider.ready) { - layer.show = true; - } + layer.show = true; } } @@ -614,8 +608,7 @@ class LayerManager { const layerAboveIsOpaque = layerAbove.meta?.[HAS_TRANSPARENCY_META_PROP] === false; const layerAboveIntersectsExtent = !isEmpty(layerAbove.rectangle) && Rectangle.intersection(extent, layerAbove.rectangle) instanceof Rectangle; - const layerAboveCoversCurrentExtent = - !isEmpty(layerAbove.rectangle) && cesiumRectangleContained(extent, layerAbove.rectangle as Rectangle); + const layerAboveCoversCurrentExtent = !isEmpty(layerAbove.rectangle) && cesiumRectangleContained(extent, layerAbove.rectangle as Rectangle); if (layerAboveIntersectsExtent && layerAboveCoversCurrentExtent && layerAboveIsOpaque && !layerAboveHasTransparency) { isOccludedByOpaqueLayerAbove = true; break; diff --git a/packages/react-components/src/components/cesium-map/layers/3d.tileset.with.update.tsx b/packages/react-components/src/components/cesium-map/layers/3d.tileset.with.update.tsx index a240b3b4..77ab6c8d 100644 --- a/packages/react-components/src/components/cesium-map/layers/3d.tileset.with.update.tsx +++ b/packages/react-components/src/components/cesium-map/layers/3d.tileset.with.update.tsx @@ -1,89 +1,90 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/no-unnecessary-condition */ -/* - https://sandcastle.cesium.com/index.html?#c=fVZtTxs5EP4re3xho0YOkOv1jgC6ElIuiAQKKaWQqnJ2nayL187Z3qCk4r/f+GXf8nKWot3YzzOeGT8z6wWWQRdLTRTFvB2cBl14y1JUznXGfMxbreBSYq798tV9gKOIKBVoESxFJgMqeICVIlqNuTfRFxzFZIozpj9a8Ei8EA5b7JPlVTK5jOgNvep/WfUPh7Sv+vzufdTt/9F/mT8+dK/+QgD6N758MSA6GJ3/HB712gN60H66fHq5Ht0l39K+vvnaWw27h/RmFP+8ueitBqvB+8FqRq+7V/MnMDa8+Kz6KUtieB+MPv8+/Am/i8HBoH2AztvdD0NBlu2n28do+uHHp8fz3rdXKiN91J6qLyS64/eHR5+YHv65b3OwgFRFNrQRkRJTfivFgsZEllmLJMGafBWSxR4TNjqOSRijcyVovEnm5DU30NuBsmacoQUlr+u0BzsX7jv3uoJr4BK53wx+jXkAY4IVucZLIm9p9ALs42CKmSJNt6rXXDreHueYv+XRqIhwAj44Z5D9az20b2jGxITA4c91MiJKf5yBFaW9OaBpmZEiIE0ZAeHAtCPPJU2ppguiEI7j0LlYCdY92hcjxwt9iGZkkh0HpfzuiAJtRgRNpUg/GnX247D9oX3UcJQ3ePrEujhWQqQjEXqPPAoJnRD5ShUJpxmPtJF6CKEI2Qgqe0eCK8EIYmLmVzv5LnaLgpvNYxCJ8T6wOxVWTDImIuMx5bMHwbLUZNggUH3W26XTIPSxQpnBecfWHAJHNOH6vMZp1HzdvstWYh5E6aKHrbE6JSAVMWGw7FfQDztRASSEzhJjoO4HSimnaZb+Y5creJCFtpK3htAPqaOunapguJApZoWInAKLokMzAlRNo/tMTnFEhhYdOsNNp66i44WNRsWwmE6dOksASqGn0Tlbni/vI8ywDN3uTR/Z/xuMYF7UO62YSTxPaGSFWvC8e1XuHNZBiCX7NSG2y/oWkevCJWG9rk9PT3f2oZo+zFaSKIjSHKNxsFMuugVUHOJBZc37hwAj2IKEDltUAuwOzv/awJfxKJzOGfG+DYTSFwR6GQNtbw2pGTxb9743EBQpLwrUb6xqUW1E5kHPB987dZRJ4W9rteVD2bDoUqIzyTcyVSmcNaQzVoG+NcpCcy95KrfFVXOiCGeboLQo5VQ/jEJSQlHbl2oKV9lESxxpT2r6MtitbDPWy7NuMmKCkzDfrrmBrvXLtx0t0zR8KUSZAXNUZiLvQ3cEx8tafkqyY+4Uo8kGowqsWNf9VwCZ57XAsfka9RawxbXHlKdSa+NVEZkFW3Y1n6uj4p210tmE5D6Fjd3a2tSPbTUJZbG0ly6XI/+/0lEY4TOdmDL3a8jNeMhUyCA0OGorHR4nntIJ3r2jOxJtTim390y/V3yz7t1jHkdYafh6QE5HYjZj5DzTGjK5n18SehxPoOzhCmMuC82gyHWUELjCxDUBrM+ZsaMFbr/a7NTELiu72uj6KdRzkksq16E9tb3m3onSS0bOHOVvms6F1OYyEyLU0gQ6IthQrUkGQcIhKmVoJ62cdBLTRUDj0/He2v1vvBdEDG7lsDLNGLunKzLeOztpAb5GY6Bu+ArfLIhkeGkgyeHZtZtECJ204O8mSwvBJlhWLP4H -*/ +export {}; +// /* eslint-disable @typescript-eslint/ban-ts-comment */ +// /* eslint-disable @typescript-eslint/no-unsafe-assignment */ +// /* eslint-disable @typescript-eslint/no-unsafe-member-access */ +// /* eslint-disable @typescript-eslint/no-unnecessary-condition */ +// /* +// https://sandcastle.cesium.com/index.html?#c=fVZtTxs5EP4re3xho0YOkOv1jgC6ElIuiAQKKaWQqnJ2nayL187Z3qCk4r/f+GXf8nKWot3YzzOeGT8z6wWWQRdLTRTFvB2cBl14y1JUznXGfMxbreBSYq798tV9gKOIKBVoESxFJgMqeICVIlqNuTfRFxzFZIozpj9a8Ei8EA5b7JPlVTK5jOgNvep/WfUPh7Sv+vzufdTt/9F/mT8+dK/+QgD6N758MSA6GJ3/HB712gN60H66fHq5Ht0l39K+vvnaWw27h/RmFP+8ueitBqvB+8FqRq+7V/MnMDa8+Kz6KUtieB+MPv8+/Am/i8HBoH2AztvdD0NBlu2n28do+uHHp8fz3rdXKiN91J6qLyS64/eHR5+YHv65b3OwgFRFNrQRkRJTfivFgsZEllmLJMGafBWSxR4TNjqOSRijcyVovEnm5DU30NuBsmacoQUlr+u0BzsX7jv3uoJr4BK53wx+jXkAY4IVucZLIm9p9ALs42CKmSJNt6rXXDreHueYv+XRqIhwAj44Z5D9az20b2jGxITA4c91MiJKf5yBFaW9OaBpmZEiIE0ZAeHAtCPPJU2ppguiEI7j0LlYCdY92hcjxwt9iGZkkh0HpfzuiAJtRgRNpUg/GnX247D9oX3UcJQ3ePrEujhWQqQjEXqPPAoJnRD5ShUJpxmPtJF6CKEI2Qgqe0eCK8EIYmLmVzv5LnaLgpvNYxCJ8T6wOxVWTDImIuMx5bMHwbLUZNggUH3W26XTIPSxQpnBecfWHAJHNOH6vMZp1HzdvstWYh5E6aKHrbE6JSAVMWGw7FfQDztRASSEzhJjoO4HSimnaZb+Y5creJCFtpK3htAPqaOunapguJApZoWInAKLokMzAlRNo/tMTnFEhhYdOsNNp66i44WNRsWwmE6dOksASqGn0Tlbni/vI8ywDN3uTR/Z/xuMYF7UO62YSTxPaGSFWvC8e1XuHNZBiCX7NSG2y/oWkevCJWG9rk9PT3f2oZo+zFaSKIjSHKNxsFMuugVUHOJBZc37hwAj2IKEDltUAuwOzv/awJfxKJzOGfG+DYTSFwR6GQNtbw2pGTxb9743EBQpLwrUb6xqUW1E5kHPB987dZRJ4W9rteVD2bDoUqIzyTcyVSmcNaQzVoG+NcpCcy95KrfFVXOiCGeboLQo5VQ/jEJSQlHbl2oKV9lESxxpT2r6MtitbDPWy7NuMmKCkzDfrrmBrvXLtx0t0zR8KUSZAXNUZiLvQ3cEx8tafkqyY+4Uo8kGowqsWNf9VwCZ57XAsfka9RawxbXHlKdSa+NVEZkFW3Y1n6uj4p210tmE5D6Fjd3a2tSPbTUJZbG0ly6XI/+/0lEY4TOdmDL3a8jNeMhUyCA0OGorHR4nntIJ3r2jOxJtTim390y/V3yz7t1jHkdYafh6QE5HYjZj5DzTGjK5n18SehxPoOzhCmMuC82gyHWUELjCxDUBrM+ZsaMFbr/a7NTELiu72uj6KdRzkksq16E9tb3m3onSS0bOHOVvms6F1OYyEyLU0gQ6IthQrUkGQcIhKmVoJ62cdBLTRUDj0/He2v1vvBdEDG7lsDLNGLunKzLeOztpAb5GY6Bu+ArfLIhkeGkgyeHZtZtECJ204O8mSwvBJlhWLP4H +// */ -import React, { useEffect, useState } from 'react'; -import { Cesium3DTileset, Cesium3DTile, Cartographic, Cartesian3, defined, sampleTerrainMostDetailed, Cesium3DTileContent } from 'cesium'; -import { CesiumViewer, useCesiumMap } from '../map'; +// import React, { useEffect, useState } from 'react'; +// import { Cesium3DTileset, Cesium3DTile, Cartographic, Cartesian3, defined, sampleTerrainMostDetailed, Cesium3DTileContent } from 'cesium'; +// import { CesiumViewer, useCesiumMap } from '../map'; -export interface Cesium3DTilesetWithUpdateProps { - url: string; - withUpdate?: boolean; -} +// export interface Cesium3DTilesetWithUpdateProps { +// url: string; +// withUpdate?: boolean; +// } -export const Cesium3DTilesetWithUpdate: React.FC = ({ url, withUpdate }) => { - const mapViewer: CesiumViewer = useCesiumMap(); - const scene = mapViewer.scene; - const [cesium3DTileset] = useState( - new Cesium3DTileset({ - url: url, - }) - ); - const [tileset] = useState(scene.primitives.add(cesium3DTileset)); +// export const Cesium3DTilesetWithUpdate: React.FC = ({ url, withUpdate }) => { +// const mapViewer: CesiumViewer = useCesiumMap(); +// const scene = mapViewer.scene; +// const [cesium3DTileset] = useState( +// new Cesium3DTileset({ +// url: url, +// }) +// ); +// const [tileset] = useState(scene.primitives.add(cesium3DTileset)); - useEffect(() => { - scene.globe.depthTestAgainstTerrain = true; - void mapViewer.zoomTo(tileset); - if (withUpdate === true) { - updateTileset(tileset); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); +// useEffect(() => { +// scene.globe.depthTestAgainstTerrain = true; +// void mapViewer.zoomTo(tileset); +// if (withUpdate === true) { +// updateTileset(tileset); +// } +// // eslint-disable-next-line react-hooks/exhaustive-deps +// }, []); - const updateContent = (model: Cesium3DTileContent, boundingVolume: any): void => { - const height = boundingVolume.minimumHeight ? boundingVolume.minimumHeight : boundingVolume.center.z - boundingVolume.radius; - // @ts-ignore - const center = model._rtcCenter ?? boundingVolume.center; - const normal = scene.globe.ellipsoid.geodeticSurfaceNormal(center, new Cartesian3()); - const offset = Cartesian3.multiplyByScalar(normal, height, new Cartesian3()); - const carto = Cartographic.fromCartesian(center); - void new Promise((resolve, reject) => { - // @ts-ignore - if (scene.terrainProvider._ready !== true) { - const result = { ...carto }; - result.height = 0; - resolve(result); - } else { - void sampleTerrainMostDetailed(scene.terrainProvider, [carto]).then((results) => { - const result = results[0]; - if (!defined(result)) { - resolve(carto); - } - resolve(result); - }); - } - }).then((result) => { - const resultCartesian = Cartographic.toCartesian(result as Cartographic); - const position = Cartesian3.subtract(resultCartesian, offset, new Cartesian3()); - // @ts-ignore - model._rtcCenter = Cartesian3.clone(position, model._rtcCenter); - }); - }; +// const updateContent = (model: Cesium3DTileContent, boundingVolume: any): void => { +// const height = boundingVolume.minimumHeight ? boundingVolume.minimumHeight : boundingVolume.center.z - boundingVolume.radius; +// // @ts-ignore +// const center = model._rtcCenter ?? boundingVolume.center; +// const normal = scene.globe.ellipsoid.geodeticSurfaceNormal(center, new Cartesian3()); +// const offset = Cartesian3.multiplyByScalar(normal, height, new Cartesian3()); +// const carto = Cartographic.fromCartesian(center); +// void new Promise((resolve, reject) => { +// // @ts-ignore +// if (scene.terrainProvider._ready !== true) { +// const result = { ...carto }; +// result.height = 0; +// resolve(result); +// } else { +// void sampleTerrainMostDetailed(scene.terrainProvider, [carto]).then((results) => { +// const result = results[0]; +// if (!defined(result)) { +// resolve(carto); +// } +// resolve(result); +// }); +// } +// }).then((result) => { +// const resultCartesian = Cartographic.toCartesian(result as Cartographic); +// const position = Cartesian3.subtract(resultCartesian, offset, new Cartesian3()); +// // @ts-ignore +// model._rtcCenter = Cartesian3.clone(position, model._rtcCenter); +// }); +// }; - const updateTile = (tile: Cesium3DTile): void => { - if (tile.content !== undefined) { - // @ts-ignore - updateContent(tile.content, tile.boundingVolume.boundingVolume); - } else { - const listener = tileset.tileLoad.addEventListener((t) => { - if (t === tile) { - updateContent(t.content, t.boundingVolume.boundingVolume); - listener(); - } - }); - } - tile.children.forEach((child) => updateTile(child)); - }; +// const updateTile = (tile: Cesium3DTile): void => { +// if (tile.content !== undefined) { +// // @ts-ignore +// updateContent(tile.content, tile.boundingVolume.boundingVolume); +// } else { +// const listener = tileset.tileLoad.addEventListener((t) => { +// if (t === tile) { +// updateContent(t.content, t.boundingVolume.boundingVolume); +// listener(); +// } +// }); +// } +// tile.children.forEach((child) => updateTile(child)); +// }; - const updateTileset = (tileset: Cesium3DTileset): void => { - void tileset.readyPromise.then(() => { - updateTile(tileset.root); - }); - }; +// const updateTileset = (tileset: Cesium3DTileset): void => { +// void tileset.readyPromise.then(() => { +// updateTile(tileset.root); +// }); +// }; - return <>; -}; +// return <>; +// }; diff --git a/packages/react-components/src/components/cesium-map/layers/imagery.layer.tsx b/packages/react-components/src/components/cesium-map/layers/imagery.layer.tsx index 55773028..8d3b32a3 100644 --- a/packages/react-components/src/components/cesium-map/layers/imagery.layer.tsx +++ b/packages/react-components/src/components/cesium-map/layers/imagery.layer.tsx @@ -11,7 +11,13 @@ export const CesiumImageryLayer: React.FC = (props) => const mapViewer: CesiumViewer = useCesiumMap(); useLayoutEffect(() => { - mapViewer.layersManager?.addMetaToLayer(meta, meta.searchLayerPredicate); + mapViewer.layersManager?.addMetaToLayer( + meta, + meta?.searchLayerPredicate ?? + function (layer, idx) { + return true; + } + ); }, [meta, mapViewer]); return ; diff --git a/packages/react-components/src/components/cesium-map/layers/wfs.layer.tsx b/packages/react-components/src/components/cesium-map/layers/wfs.layer.tsx index 01210caf..51e990ed 100644 --- a/packages/react-components/src/components/cesium-map/layers/wfs.layer.tsx +++ b/packages/react-components/src/components/cesium-map/layers/wfs.layer.tsx @@ -184,7 +184,7 @@ export const CesiumWFSLayer: React.FC = (props) => { const worldPos = getEntityCenter(entity); if (!worldPos) return { entity, distance: Number.MAX_VALUE }; - const screenPos = SceneTransforms.wgs84ToWindowCoordinates(mapViewer.scene, worldPos); + const screenPos = SceneTransforms.worldToWindowCoordinates(mapViewer.scene, worldPos); if (!screenPos) return { entity, distance: Number.MAX_VALUE }; const dx = screenPosition.x - screenPos.x; diff --git a/packages/react-components/src/components/cesium-map/map.tsx b/packages/react-components/src/components/cesium-map/map.tsx index 06aa97ae..66a1caa4 100644 --- a/packages/react-components/src/components/cesium-map/map.tsx +++ b/packages/react-components/src/components/cesium-map/map.tsx @@ -1,14 +1,4 @@ -import React, { - createContext, - useContext, - useEffect, - useState, - useRef, - useCallback, - ComponentProps, - MouseEvent, - useMemo -} from 'react'; +import React, { createContext, useContext, useEffect, useState, useRef, useCallback, ComponentProps, MouseEvent, useMemo } from 'react'; import { createPortal } from 'react-dom'; import { Viewer, CesiumComponentRef } from 'resium'; import { @@ -213,7 +203,7 @@ export const CesiumMap: React.FC = (props) => { const imageryMenuEvent = useRef(); const [imageryMenuPosition, setImageryMenuPosition] = useState | undefined>(undefined); const [isLegendsSidebarOpen, setIsLegendsSidebarOpen] = useState(false); - const [rightClickCoordinates, setRightClickCoordinates] = useState<{ longitude: number; latitude: number; }>(); + const [rightClickCoordinates, setRightClickCoordinates] = useState<{ longitude: number; latitude: number }>(); const [viewState, setViewState] = useState(); const theme = useTheme(); const themeCesium = useMappedCesiumTheme(theme); @@ -239,7 +229,6 @@ export const CesiumMap: React.FC = (props) => { navigationHelpButton: false, homeButton: isNumber(props.zoom) && isArray(props.center), sceneModePicker: true, - imageryProvider: false, ...(props as ViewerProps), }; @@ -277,44 +266,71 @@ export const CesiumMap: React.FC = (props) => { [ref] ); + // useEffect(() => { + // if (ref.current !== null) { + // const viewer: CesiumViewer = ref.current.cesiumElement as CesiumViewer; + // if (!viewer) return; + // if (props.imageryContextMenu) { + // // Previews implementation with cesium's events wont expose the native 'contextmenu' event in its callback. + // // We need the native event for the new context menu component. + // // This is a workaround. + + // viewer.scene.canvas.removeEventListener('contextmenu', contextMenuHandler); + + // viewer.scene.canvas.addEventListener('contextmenu', contextMenuHandler); + // } + // } + // setMapViewRef(ref.current?.cesiumElement); + // }, [ref, props.imageryContextMenu]); useEffect(() => { - if (ref.current !== null) { - const viewer: CesiumViewer = ref.current.cesiumElement as CesiumViewer; - if (props.imageryContextMenu) { - // Previews implementation with cesium's events wont expose the native 'contextmenu' event in its callback. - // We need the native event for the new context menu component. - // This is a workaround. + let cancelled = false; + + const checkViewer = () => { + const viewer = ref.current?.cesiumElement; + if (!viewer || cancelled) { + requestAnimationFrame(checkViewer); + return; + } + + // viewer is ready here + if (props.imageryContextMenu) { viewer.scene.canvas.removeEventListener('contextmenu', contextMenuHandler); viewer.scene.canvas.addEventListener('contextmenu', contextMenuHandler); } - } - setMapViewRef(ref.current?.cesiumElement); - }, [ref, props.imageryContextMenu]); + + setMapViewRef(viewer); + }; + + checkViewer(); + + return () => { + cancelled = true; + }; + }, [props.imageryContextMenu]); const contextValue = useMemo(() => { - if (mapViewRef) { - const mv = mapViewRef.layersManager - ? mapViewRef - : Object.assign(mapViewRef, { - layersManager: new LayerManager( - mapViewRef, - props.legends?.mapLegendsExtractor, - () => { - setLegendsList(mapViewRef.layersManager?.legendsList as IMapLegend[]); - }, - props.layerManagerFootprintMetaFieldPath, - viewState?.shouldOptimizedTileRequests - ), - }); - return { - mapViewer: mv, - viewState, - setViewState, - }; + if (!mapViewRef) return null; + + if (!mapViewRef.layersManager) { + mapViewRef.layersManager = new LayerManager( + mapViewRef, + props.legends?.mapLegendsExtractor, + () => { + setLegendsList(mapViewRef.layersManager?.legendsList as IMapLegend[]); + }, + props.layerManagerFootprintMetaFieldPath, + viewState?.shouldOptimizedTileRequests + ); } - }, [props.legends, props.layerManagerFootprintMetaFieldPath, mapViewRef, viewState]); + + return { + mapViewer: mapViewRef, + viewState, + setViewState, + }; + }, [mapViewRef, props.legends, props.layerManagerFootprintMetaFieldPath, viewState]); useEffect(() => { setBaseMaps(props.baseMaps); @@ -331,14 +347,20 @@ export const CesiumMap: React.FC = (props) => { }, [viewState?.shouldOptimizedTileRequests, mapViewRef]); useEffect(() => { - const newTerrains = props.terrains || ((mapViewRef && mapViewRef.terrainProvider) ? [{ - id: '1', - url: DEFAULT_TERRAIN_PROVIDER_URL, - title: 'Default Terrain', - thumbnail: 'Cesium/Widgets/Images/TerrainProviders/Ellipsoid.png', - isCurrent: true, - terrainProvider: mapViewRef.terrainProvider - }] : undefined); + const newTerrains = + props.terrains || + (mapViewRef && mapViewRef.terrainProvider + ? [ + { + id: '1', + url: DEFAULT_TERRAIN_PROVIDER_URL, + title: 'Default Terrain', + thumbnail: 'Cesium/Widgets/Images/TerrainProviders/Ellipsoid.png', + isCurrent: true, + terrainProvider: mapViewRef.terrainProvider, + }, + ] + : undefined); setTerrains(newTerrains); }, [props.terrains, mapViewRef]); @@ -395,10 +417,7 @@ export const CesiumMap: React.FC = (props) => { // https://stackoverflow.com/questions/33348761/get-center-in-cesium-map if (mapViewRef.scene.mode === SceneMode.SCENE3D) { - const windowPosition = new Cartesian2( - mapViewRef.container.clientWidth / TWO, - mapViewRef.container.clientHeight / TWO - ); + const windowPosition = new Cartesian2(mapViewRef.container.clientWidth / TWO, mapViewRef.container.clientHeight / TWO); const pickRay = mapViewRef.scene.camera.getPickRay(windowPosition); const pickPosition = mapViewRef.scene.globe.pick(pickRay as Ray, mapViewRef.scene); @@ -527,7 +546,7 @@ export const CesiumMap: React.FC = (props) => { }, [props.showZoomButtons]); const updateLegendToggle = () => { - setIsLegendsSidebarOpen(prev => !prev); + setIsLegendsSidebarOpen((prev) => !prev); }; const bindCustomToolsToViewer = useCallback((): JSX.Element | undefined => { @@ -580,53 +599,53 @@ export const CesiumMap: React.FC = (props) => { return ( - - - {props.children} - {bindCustomToolsToViewer()} - {bindToolsToToolbar()} - {bindInspectorsToWidgets()} - { - props.imageryContextMenu && - showImageryMenu && - imageryMenuPosition && - rightClickCoordinates && - React.cloneElement(props.imageryContextMenu, { - data: mapViewRef?.layersManager?.findLayerByPOI( - imageryMenuPosition.x as number, - imageryMenuPosition.y as number, - false - ) as unknown as Record[], - position: { - x: imageryMenuPosition.x as number, - y: imageryMenuPosition.y as number, - }, - coordinates: rightClickCoordinates, - style: getImageryMenuStyle( - imageryMenuPosition.x as number, - imageryMenuPosition.y as number, - props.imageryContextMenuSize?.width ?? DEFAULT_WIDTH, - props.imageryContextMenuSize?.height ?? DEFAULT_HEIGHT, - props.imageryContextMenuSize?.dynamicHeightIncrement ?? DEFAULT_DYNAMIC_HEIGHT_INCREMENT - ), - size: props.imageryContextMenuSize ?? { - height: DEFAULT_HEIGHT, - width: DEFAULT_WIDTH, - }, - handleClose: () => { - setShowImageryMenu(!showImageryMenu); - }, - contextEvt: imageryMenuEvent.current, - }) - } - + {contextValue && ( + + + {props.children} + {bindCustomToolsToViewer()} + {bindToolsToToolbar()} + {bindInspectorsToWidgets()} + {props.imageryContextMenu && + showImageryMenu && + imageryMenuPosition && + rightClickCoordinates && + React.cloneElement(props.imageryContextMenu, { + data: mapViewRef?.layersManager?.findLayerByPOI( + imageryMenuPosition.x as number, + imageryMenuPosition.y as number, + false + ) as unknown as Record[], + position: { + x: imageryMenuPosition.x as number, + y: imageryMenuPosition.y as number, + }, + coordinates: rightClickCoordinates, + style: getImageryMenuStyle( + imageryMenuPosition.x as number, + imageryMenuPosition.y as number, + props.imageryContextMenuSize?.width ?? DEFAULT_WIDTH, + props.imageryContextMenuSize?.height ?? DEFAULT_HEIGHT, + props.imageryContextMenuSize?.dynamicHeightIncrement ?? DEFAULT_DYNAMIC_HEIGHT_INCREMENT + ), + size: props.imageryContextMenuSize ?? { + height: DEFAULT_HEIGHT, + width: DEFAULT_WIDTH, + }, + handleClose: () => { + setShowImageryMenu(!showImageryMenu); + }, + contextEvt: imageryMenuEvent.current, + })} + + )} ); diff --git a/packages/react-components/src/components/cesium-map/tools/zoom-level-tracker.tool.tsx b/packages/react-components/src/components/cesium-map/tools/zoom-level-tracker.tool.tsx index 230ced0c..b9a3e5b8 100644 --- a/packages/react-components/src/components/cesium-map/tools/zoom-level-tracker.tool.tsx +++ b/packages/react-components/src/components/cesium-map/tools/zoom-level-tracker.tool.tsx @@ -89,9 +89,11 @@ export const ZoomLevelTrackerTool: React.FC = ({ loc cameraHeight = mapViewer.scene.mapProjection.ellipsoid.cartesianToCartographic(camera.positionWC).height; break; case CesiumSceneMode.SCENE2D: - cameraHeight = - ((camera.frustum as PerspectiveOffCenterFrustum).right - (camera.frustum as PerspectiveOffCenterFrustum).left) * - ORTHOPHOTO_HEIGHT_FRUSTRUM_FACTOR; + const frustum = camera.frustum; + + if (frustum && frustum instanceof PerspectiveOffCenterFrustum && frustum.left !== undefined && frustum.right !== undefined) { + cameraHeight = (frustum.right - frustum.left) * ORTHOPHOTO_HEIGHT_FRUSTRUM_FACTOR; + } break; case CesiumSceneMode.COLUMBUS_VIEW: cameraHeight = camera.position.z; @@ -127,10 +129,13 @@ export const ZoomLevelTrackerTool: React.FC = ({ loc } }, [mapViewer]); - const extractZoomMethods = useMemo void>>(() => ({ - CALCULATION: calculateZoomLevel, - RENDERED_TILES: extractMaxZoomLevelFromRenderedTiles - }), [calculateZoomLevel, extractMaxZoomLevelFromRenderedTiles]); + const extractZoomMethods = useMemo void>>( + () => ({ + CALCULATION: calculateZoomLevel, + RENDERED_TILES: extractMaxZoomLevelFromRenderedTiles, + }), + [calculateZoomLevel, extractMaxZoomLevelFromRenderedTiles] + ); const zoomExtractionMethod = extractZoomMethods[valueBy]; diff --git a/yarn.lock b/yarn.lock index ed4c987e..498de7d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1503,36 +1503,44 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cesium/engine@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@cesium/engine/-/engine-2.1.0.tgz#da6c0c0ba5fdb98de96eed6c4323cd304cdfe981" - integrity sha512-U80bWcu+SmJYH/5nzowHcJI093qTkOd8wYj54Hgj7PKk1QhFKfE+oLCb8F577wAvwptoEZ57CdR4KgJNLGO1SA== +"@cesium/engine@^26.0.0": + version "26.0.0" + resolved "https://registry.yarnpkg.com/@cesium/engine/-/engine-26.0.0.tgz#05bc6612815cbe345e8e3f7444a2a8d212583f19" + integrity sha512-iV2mUQHUffYBEQii7n8CQ0XA1eSmcetOedsLoZvDJG6LW9aRHxL008rVvGnnZelQVRUQWNFFX5/+Tos3TBIIcw== dependencies: - "@tweenjs/tween.js" "^18.6.4" - "@zip.js/zip.js" "2.4.x" + "@cesium/wasm-splats" "^0.1.0-alpha.2" + "@spz-loader/core" "0.3.1" + "@tweenjs/tween.js" "^25.0.0" + "@zip.js/zip.js" "^2.8.1" autolinker "^4.0.0" bitmap-sdf "^1.0.3" - dompurify "^2.2.2" - earcut "^2.2.4" + dompurify "^3.3.0" + draco3d "^1.5.1" + earcut "^3.0.0" grapheme-splitter "^1.0.4" jsep "^1.3.8" - kdbush "^3.0.0" - ktx-parse "^0.4.5" + kdbush "^4.0.1" + ktx-parse "^1.0.0" lerc "^2.0.0" mersenne-twister "^1.1.0" - meshoptimizer "^0.18.1" + meshoptimizer "^1.0.1" pako "^2.0.4" - protobufjs "^7.1.0" - rbush "^3.0.1" + protobufjs "^8.5.0" + rbush "^4.0.1" topojson-client "^3.1.0" urijs "^1.19.7" -"@cesium/widgets@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@cesium/widgets/-/widgets-2.1.0.tgz#a9371bc929d81d19e51cba7f6f32fd7d531f1847" - integrity sha512-/sdDNr8nJMALjzHBdeeFdIxakP/9DbTccDouQWjOvpOj2aVe5iFNQWkYULssV38ywp2JEqmhvF5+eHsT0PAjPA== +"@cesium/wasm-splats@^0.1.0-alpha.2": + version "0.1.0-alpha.2" + resolved "https://registry.yarnpkg.com/@cesium/wasm-splats/-/wasm-splats-0.1.0-alpha.2.tgz#f2d0d717d46f5f3d6d923549e90fb5ab4d429cab" + integrity sha512-t9pMkknv31hhIbLpMa8yPvmqfpvs5UkUjgqlQv9SeO8VerCXOYnyP8/486BDaFrztM0A7FMbRjsXtNeKvqQghA== + +"@cesium/widgets@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@cesium/widgets/-/widgets-16.0.0.tgz#a8aafe34d120ee606cb233a9bd2503f20e74962e" + integrity sha512-52PO61PKm6Cut1BR/OqrPLmDXL9lk7iwGHXWbWQpg1pJT8SaJ7PXyLqcAPz+6VTYXspmE4D6Xo0PgIav33dEEQ== dependencies: - "@cesium/engine" "2.1.0" + "@cesium/engine" "^26.0.0" nosleep.js "^0.12.0" "@cmcleese/cesium-navigation@^4.0.7": @@ -3779,59 +3787,6 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - "@react-dnd/asap@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@react-dnd/asap/-/asap-4.0.1.tgz#5291850a6b58ce6f2da25352a64f1b0674871aab" @@ -4251,6 +4206,11 @@ dependencies: "@sinonjs/commons" "^3.0.0" +"@spz-loader/core@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@spz-loader/core/-/core-0.3.1.tgz#3337d4753f60908c30ae94b5599020f18056a18e" + integrity sha512-8qJ1WIBXaJu8HjnJAjYniE0kYcr0kCe5Hp7kDzYiGVvvd7zyrOBwbF5imoW5mvwx1Qba0hxGEK5R9jEoaHKJFA== + "@storybook/addon-actions@6.5.16": version "6.5.16" resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-6.5.16.tgz#2d7679f64899bef165a338582cb928102a09e364" @@ -6762,10 +6722,10 @@ "@types/geojson" "^7946.0.10" tslib "^2.8.1" -"@tweenjs/tween.js@^18.6.4": - version "18.6.4" - resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-18.6.4.tgz#40a3d0a93647124872dec8e0fd1bd5926695b6ca" - integrity sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ== +"@tweenjs/tween.js@^25.0.0": + version "25.0.0" + resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-25.0.0.tgz#7266baebcc3affe62a3a54318a3ea82d904cd0b9" + integrity sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A== "@types/arcgis-rest-api@*": version "10.4.5" @@ -7096,7 +7056,7 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@>=13.7.0", "@types/node@^20.3.1": +"@types/node@*", "@types/node@^20.3.1": version "20.4.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.2.tgz#129cc9ae69f93824f92fac653eebfb4812ab4af9" integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== @@ -7341,6 +7301,11 @@ dependencies: "@types/geojson" "*" +"@types/trusted-types@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + "@types/uglify-js@*": version "3.17.1" resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.1.tgz#e0ffcef756476410e5bce2cb01384ed878a195b5" @@ -7890,10 +7855,10 @@ js-yaml "^3.10.0" tslib "^2.4.0" -"@zip.js/zip.js@2.4.x": - version "2.4.26" - resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.4.26.tgz#b79bb2055dc6e185890ee01cdb710caba505d5b2" - integrity sha512-I9HBO3BHIxEMQmltmHM3iqUW6IHqi3gsL9wTSXvHTRpOrA6q2OxtR58EDSaOGjHhDVJ+wIOAxZyKq2x00AVmqw== +"@zip.js/zip.js@^2.8.1": + version "2.8.26" + resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.8.26.tgz#826a819f673e8284d0de785551ac37e9972ee794" + integrity sha512-RQ4h9F6DOiHxpdocUDrOl6xBM+yOtz+LkUol47AVWcfebGBDpZ7w7Xvz9PS24JgXvLGiXXzSAfdCdVy1tPlaFA== "@zkochan/js-yaml@0.0.6": version "0.0.6" @@ -9345,13 +9310,13 @@ ccount@^1.0.0: resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== -cesium@1.103.0: - version "1.103.0" - resolved "https://registry.yarnpkg.com/cesium/-/cesium-1.103.0.tgz#46af9c7789bf38d583e12c70cfeb9f78281a3e72" - integrity sha512-BoZx7Op/BYd8p8rBDnuv/u7b/yg2WpK3WBfrAKceemU1pv2QlMrFNBxKnd3PWHSUgJZc/yHtP7YrX5pIn7JSgA== +cesium@1.142.0: + version "1.142.0" + resolved "https://registry.yarnpkg.com/cesium/-/cesium-1.142.0.tgz#c47ac4760635f19734e45a2b8ee8f790bd541f23" + integrity sha512-Z6mBxdeBS0lEXM7WAQgG8Q0FovXYAJpZsMOSWgd7dH28Ov+djJxWOlUMiG8jOai0TzeOYdYsMLgnYb2uB/aI/A== dependencies: - "@cesium/engine" "2.1.0" - "@cesium/widgets" "2.1.0" + "@cesium/engine" "^26.0.0" + "@cesium/widgets" "^16.0.0" chalk@4.1.0: version "4.1.0" @@ -10885,10 +10850,12 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -dompurify@^2.2.2: - version "2.4.7" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.7.tgz#277adeb40a2c84be2d42a8bcd45f582bfa4d0cfc" - integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ== +dompurify@^3.3.0: + version "3.4.11" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.11.tgz#29c8ba496475f279ef4015784068452fb14a0680" + integrity sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw== + optionalDependencies: + "@types/trusted-types" "^2.0.7" domutils@^2.0.0, domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" @@ -10948,6 +10915,11 @@ dotenv@~10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +draco3d@^1.5.1: + version "1.5.7" + resolved "https://registry.yarnpkg.com/draco3d/-/draco3d-1.5.7.tgz#94f9bce293eb8920c159dc91a4ce9124a9e899e0" + integrity sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ== + duplexer3@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" @@ -10968,10 +10940,10 @@ duplexify@^3.4.2, duplexify@^3.5.0, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" -earcut@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a" - integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== +earcut@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-3.0.2.tgz#d478a29aaf99acf418151493048aa197d0512248" + integrity sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ== eastasianwidth@^0.2.0: version "0.2.0" @@ -15261,10 +15233,10 @@ kapellmeister@^3.0.1: dependencies: d3-timer "^1.0.9" -kdbush@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" - integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== +kdbush@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-4.1.0.tgz#d504bc0447a59be4fb75533a5c25e316b3ed8859" + integrity sha512-e9vurzrXJQrFX6ckpHP3bvj5l+9CnYzkxDNnNQ1h2QTqdWsUAJgXiKdGNcOa1EY85dU8KbQ+z/FdQdB7P+9yfQ== keyv@^3.0.0: version "3.1.0" @@ -15324,10 +15296,10 @@ kolorist@^1.6.0: resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== -ktx-parse@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/ktx-parse/-/ktx-parse-0.4.5.tgz#79905e22281a9d3e602b2ff522df1ee7d1813aa6" - integrity sha512-MK3FOody4TXbFf8Yqv7EBbySw7aPvEcPX++Ipt6Sox+/YMFvR5xaTyhfNSk1AEmMy+RYIw81ctN4IMxCB8OAlg== +ktx-parse@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ktx-parse/-/ktx-parse-1.1.0.tgz#1077c87776ddabfc32fc01f644f6ad8f8890abf8" + integrity sha512-mKp3y+FaYgR7mXWAbyyzpa/r1zDWeaunH+INJO4fou3hb45XuNSwar+7llrRyvpMWafxSIi99RNFJ05MHedaJQ== language-subtag-registry@~0.3.2: version "0.3.22" @@ -15809,10 +15781,10 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" -long@^5.0.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" - integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== +long@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" + integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" @@ -16162,10 +16134,10 @@ mersenne-twister@^1.1.0: resolved "https://registry.yarnpkg.com/mersenne-twister/-/mersenne-twister-1.1.0.tgz#f916618ee43d7179efcf641bec4531eb9670978a" integrity sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA== -meshoptimizer@^0.18.1: - version "0.18.1" - resolved "https://registry.yarnpkg.com/meshoptimizer/-/meshoptimizer-0.18.1.tgz#cdb90907f30a7b5b1190facd3b7ee6b7087797d8" - integrity sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw== +meshoptimizer@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/meshoptimizer/-/meshoptimizer-1.1.1.tgz#20c7d050d59bdc573154814f6a37d47d89908cca" + integrity sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g== methods@~1.1.2: version "1.1.2" @@ -18040,23 +18012,12 @@ property-information@^5.0.0, property-information@^5.3.0: dependencies: xtend "^4.0.0" -protobufjs@^7.1.0: - version "7.2.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.4.tgz#3fc1ec0cdc89dd91aef9ba6037ba07408485c3ae" - integrity sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/node" ">=13.7.0" - long "^5.0.0" +protobufjs@^8.5.0: + version "8.6.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-8.6.4.tgz#61c1589f095d096cf89e77d1e6dfa5ca1c0d70bf" + integrity sha512-/+XMv9JalknuncEJSwsyEVlwcxVLKx2iaoSUXFZA86MJkdqyOdfrlB1sB7S6aKyUk9tl20YY+SgQe5J2sJHTcg== + dependencies: + long "^5.3.2" protocol-buffers-schema@^3.3.1: version "3.6.0" @@ -18215,6 +18176,11 @@ quickselect@^2.0.0: resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== +quickselect@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-3.0.0.tgz#a37fc953867d56f095a20ac71c6d27063d2de603" + integrity sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g== + raf@^3.4.0, raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -18297,6 +18263,13 @@ rbush@^3.0.1: dependencies: quickselect "^2.0.0" +rbush@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/rbush/-/rbush-4.0.1.tgz#1f55afa64a978f71bf9e9a99bc14ff84f3cb0d6d" + integrity sha512-IP0UpfeWQujYC8Jg162rMNc01Rf0gWMMAb2Uxus/Q0qOFw4lCcq6ZnQEZwUoJqWyUGJ9th7JjwI4yIWo+uvoAQ== + dependencies: + quickselect "^3.0.0" + rc-align@^2.4.0: version "2.4.5" resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-2.4.5.tgz#c941a586f59d1017f23a428f0b468663fb7102ab" @@ -19159,10 +19132,10 @@ reselect@^4.1.8: resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524" integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== -resium@1.16.1: - version "1.16.1" - resolved "https://registry.yarnpkg.com/resium/-/resium-1.16.1.tgz#9ace9a39104c40c1e5717a21f84f54eff2a38d25" - integrity sha512-I9vyClyR4+JZzQGUv5wc9DSc+bQWh9S7qMUwy6vYWJ3GkeSQW4vgTa7qiCv87w5zyw6lL+dRXZFjuiKogYnHJA== +resium@1.23.0: + version "1.23.0" + resolved "https://registry.yarnpkg.com/resium/-/resium-1.23.0.tgz#1ff26afaa5f75030e7298fb0c6436dddd1420e37" + integrity sha512-jf+YI8G8kNoTmnF3l6Z8KnTt66PqTpKDCluhowNU4TeK16MA7nwSncVFOYiAFcsJHVGxKCH9ayuayi0Hfdjjqg== resolve-cwd@^3.0.0: version "3.0.0"