qwc2 2025.10.9 → 2025.10.14

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 (241) hide show
  1. package/actions/display.js +30 -1
  2. package/actions/editing.js +22 -1
  3. package/actions/layerinfo.js +13 -1
  4. package/actions/layers.js +213 -3
  5. package/actions/localConfig.js +58 -1
  6. package/actions/locale.js +21 -1
  7. package/actions/locate.js +26 -1
  8. package/actions/logging.js +10 -1
  9. package/actions/map.js +105 -2
  10. package/actions/measurement.js +12 -1
  11. package/actions/processNotifications.js +37 -1
  12. package/actions/redlining.js +18 -1
  13. package/actions/redliningPick.js +12 -1
  14. package/actions/search.js +12 -1
  15. package/actions/serviceinfo.js +12 -1
  16. package/actions/task.js +55 -3
  17. package/actions/theme.js +339 -19
  18. package/actions/windows.js +164 -5
  19. package/components/AppMenu.js +435 -3
  20. package/components/AttributeForm.js +928 -32
  21. package/components/AttributeTableWidget.js +1105 -13
  22. package/components/AutoEditForm.js +189 -3
  23. package/components/CoordinateDisplayer.js +78 -2
  24. package/components/EditComboField.js +190 -6
  25. package/components/EditUploadField.js +315 -3
  26. package/components/ExportSelection.js +203 -2
  27. package/components/FullscreenSwitcher.js +90 -3
  28. package/components/Icon.js +81 -2
  29. package/components/IdentifyViewer.js +1161 -6
  30. package/components/ImportLayer.js +718 -20
  31. package/components/LayerInfoWindow.js +145 -2
  32. package/components/LinkFeatureForm.js +246 -5
  33. package/components/MapButton.js +88 -2
  34. package/components/MapSelection.js +287 -8
  35. package/components/MessageBar.js +68 -2
  36. package/components/NumericInputWindow.js +359 -2
  37. package/components/PickFeature.js +266 -2
  38. package/components/PluginsContainer.js +227 -8
  39. package/components/PrintSelection.js +620 -49
  40. package/components/ProcessNotifications.js +104 -2
  41. package/components/QtDesignerForm.js +1137 -18
  42. package/components/ResizeableWindow.js +591 -8
  43. package/components/SearchBox.js +1307 -20
  44. package/components/ServiceInfoWindow.js +107 -2
  45. package/components/SideBar.js +204 -4
  46. package/components/StandardApp.js +381 -20
  47. package/components/Swipeable.js +15 -1
  48. package/components/TaskBar.js +85 -2
  49. package/components/ThemeLayersListWindow.js +216 -4
  50. package/components/ThemeList.js +381 -7
  51. package/components/Toolbar.js +106 -2
  52. package/components/WindowManager.js +178 -2
  53. package/components/map/OlLayer.js +257 -6
  54. package/components/map/OlMap.js +405 -5
  55. package/components/map/layers/BingLayer.js +31 -2
  56. package/components/map/layers/GoogleLayer.js +222 -19
  57. package/components/map/layers/GraticuleLayer.js +21 -1
  58. package/components/map/layers/ImageLayer.js +15 -1
  59. package/components/map/layers/MVTLayer.js +52 -2
  60. package/components/map/layers/OSMLayer.js +24 -2
  61. package/components/map/layers/OverlayLayer.js +55 -3
  62. package/components/map/layers/VectorLayer.js +173 -8
  63. package/components/map/layers/WFSLayer.js +220 -6
  64. package/components/map/layers/WMSLayer.js +180 -6
  65. package/components/map/layers/WMTSLayer.js +67 -3
  66. package/components/map/layers/XYZLayer.js +24 -2
  67. package/components/map/layers/index.js +28 -1
  68. package/components/map3d/EditDataset3D.js +190 -3
  69. package/components/map3d/HeightProfile3D.js +402 -3
  70. package/components/map3d/ImportObjects3D.js +162 -2
  71. package/components/map3d/Map3D.js +1304 -38
  72. package/components/map3d/MapControls3D.js +392 -7
  73. package/components/map3d/SearchField3D.js +183 -11
  74. package/components/map3d/View3DSwitcher.js +98 -2
  75. package/components/map3d/drawtool/CreateTool3D.js +174 -4
  76. package/components/map3d/drawtool/EditTool3D.js +590 -6
  77. package/components/map3d/drawtool/NumericInput3D.js +336 -4
  78. package/components/map3d/layers/GeoTIFFLayer3D.js +15 -1
  79. package/components/map3d/layers/VectorLayer3D.js +53 -2
  80. package/components/map3d/layers/WFSLayer3D.js +109 -3
  81. package/components/map3d/layers/WMSLayer3D.js +70 -2
  82. package/components/map3d/layers/WMTSLayer3D.js +27 -3
  83. package/components/map3d/layers/index.js +14 -1
  84. package/components/map3d/utils/FirstPersonControls3D.js +423 -16
  85. package/components/map3d/utils/MiscUtils3D.js +221 -13
  86. package/components/map3d/utils/OrbitControls3D.js +176 -5
  87. package/components/map3d/utils/Tiles3DStyle.js +238 -9
  88. package/components/share/ShareLink.js +54 -2
  89. package/components/share/ShareQRCode.js +62 -2
  90. package/components/share/ShareSocials.js +125 -3
  91. package/components/timeline/FixedTimeline.js +236 -5
  92. package/components/timeline/InfiniteTimeline.js +347 -8
  93. package/components/timeline/TimelineFeaturesSlider.js +439 -5
  94. package/components/widgets/AccordeonWidget.js +96 -2
  95. package/components/widgets/ButtonBar.js +124 -2
  96. package/components/widgets/ColorButton.js +201 -3
  97. package/components/widgets/ComboBox.js +166 -2
  98. package/components/widgets/CopyButton.js +110 -2
  99. package/components/widgets/DateTimeInput.js +100 -3
  100. package/components/widgets/EditableSelect.js +230 -3
  101. package/components/widgets/FileSelector.js +128 -4
  102. package/components/widgets/Input.js +124 -2
  103. package/components/widgets/InputContainer.js +96 -2
  104. package/components/widgets/LayerCatalogWidget.js +219 -3
  105. package/components/widgets/MenuButton.js +157 -1
  106. package/components/widgets/ModalDialog.js +64 -2
  107. package/components/widgets/NavBar.js +119 -2
  108. package/components/widgets/NumberInput.js +226 -4
  109. package/components/widgets/PopupMenu.js +72 -1
  110. package/components/widgets/Primitives.js +6 -1
  111. package/components/widgets/ReCaptchaWidget.js +55 -1
  112. package/components/widgets/SearchWidget.js +255 -2
  113. package/components/widgets/Spinner.js +44 -2
  114. package/components/widgets/SuggestionInput.js +77 -2
  115. package/components/widgets/TextInput.js +308 -2
  116. package/components/widgets/ToggleSwitch.js +85 -2
  117. package/components/widgets/VectorLayerPicker.js +85 -3
  118. package/libs/openlayers.js +225 -5
  119. package/package.json +1 -1
  120. package/plugins/API.js +358 -15
  121. package/plugins/AttributeTable.js +109 -3
  122. package/plugins/Authentication.js +130 -5
  123. package/plugins/BackgroundSwitcher.js +218 -4
  124. package/plugins/Bookmark.js +289 -3
  125. package/plugins/BottomBar.js +298 -4
  126. package/plugins/CookiePopup.js +67 -3
  127. package/plugins/Cyclomedia.js +442 -5
  128. package/plugins/Editing.js +497 -9
  129. package/plugins/FeatureForm.js +366 -4
  130. package/plugins/FeatureSearch.js +458 -3
  131. package/plugins/GeometryDigitizer.js +664 -7
  132. package/plugins/HeightProfile.js +763 -15
  133. package/plugins/Help.js +102 -3
  134. package/plugins/HomeButton.js +80 -3
  135. package/plugins/Identify.js +543 -5
  136. package/plugins/LayerCatalog.js +215 -4
  137. package/plugins/LayerTree.js +1194 -6
  138. package/plugins/LocateButton.js +94 -3
  139. package/plugins/Map.js +320 -16
  140. package/plugins/MapCompare.js +94 -3
  141. package/plugins/MapCopyright.js +127 -5
  142. package/plugins/MapExport.js +613 -20
  143. package/plugins/MapFilter.js +868 -12
  144. package/plugins/MapInfoTooltip.js +277 -3
  145. package/plugins/MapLegend.js +253 -4
  146. package/plugins/MapTip.js +290 -4
  147. package/plugins/Measure.js +220 -4
  148. package/plugins/NewsPopup.js +137 -3
  149. package/plugins/OverviewMap.js +167 -7
  150. package/plugins/Panoramax.js +340 -2
  151. package/plugins/Portal.js +199 -4
  152. package/plugins/Print.js +1231 -15
  153. package/plugins/Redlining.js +750 -6
  154. package/plugins/Reports.js +332 -3
  155. package/plugins/Routing.js +1278 -15
  156. package/plugins/ScratchDrawing.js +173 -5
  157. package/plugins/Settings.js +241 -4
  158. package/plugins/Share.js +198 -3
  159. package/plugins/StartupMarker.js +84 -4
  160. package/plugins/TaskButton.js +88 -3
  161. package/plugins/ThemeSwitcher.js +164 -4
  162. package/plugins/TimeManager.js +971 -10
  163. package/plugins/TopBar.js +300 -7
  164. package/plugins/TourGuide.js +213 -2
  165. package/plugins/ValueTool.js +419 -4
  166. package/plugins/View3D.js +519 -14
  167. package/plugins/ZoomButtons.js +165 -3
  168. package/plugins/map/EditingSupport.js +199 -7
  169. package/plugins/map/LocateSupport.js +260 -4
  170. package/plugins/map/MeasurementSupport.js +216 -8
  171. package/plugins/map/RedliningPickSupport.js +201 -7
  172. package/plugins/map/RedliningSupport.js +726 -17
  173. package/plugins/map/SnapInteraction.js +101 -1
  174. package/plugins/map/SnapSupport.js +210 -2
  175. package/plugins/map/SnappingSupport.js +356 -17
  176. package/plugins/map3d/BackgroundSwitcher3D.js +44 -3
  177. package/plugins/map3d/BottomBar3D.js +118 -3
  178. package/plugins/map3d/Compare3D.js +422 -8
  179. package/plugins/map3d/Draw3D.js +353 -6
  180. package/plugins/map3d/ExportObjects3D.js +393 -18
  181. package/plugins/map3d/HideObjects3D.js +313 -12
  182. package/plugins/map3d/Identify3D.js +283 -12
  183. package/plugins/map3d/LayerTree3D.js +323 -3
  184. package/plugins/map3d/MapCopyright3D.js +128 -5
  185. package/plugins/map3d/MapExport3D.js +590 -10
  186. package/plugins/map3d/MapLight3D.js +553 -6
  187. package/plugins/map3d/Measure3D.js +571 -20
  188. package/plugins/map3d/OverviewMap3D.js +169 -3
  189. package/plugins/map3d/Settings3D.js +73 -3
  190. package/plugins/map3d/TopBar3D.js +207 -9
  191. package/plugins/redlining/RedliningBufferSupport.js +206 -3
  192. package/reducers/display.js +34 -2
  193. package/reducers/editing.js +68 -3
  194. package/reducers/index.js +9 -1
  195. package/reducers/layerinfo.js +26 -2
  196. package/reducers/layers.js +456 -9
  197. package/reducers/localConfig.js +122 -2
  198. package/reducers/locale.js +38 -2
  199. package/reducers/locate.js +40 -2
  200. package/reducers/map.js +176 -5
  201. package/reducers/measurement.js +42 -2
  202. package/reducers/processNotifications.js +49 -2
  203. package/reducers/redlining.js +50 -2
  204. package/reducers/redliningPick.js +27 -2
  205. package/reducers/search.js +20 -1
  206. package/reducers/serviceinfo.js +25 -2
  207. package/reducers/task.js +45 -2
  208. package/reducers/theme.js +51 -2
  209. package/reducers/windows.js +203 -2
  210. package/scripts/dist.sh +1 -1
  211. package/scripts/gen-plugin-docs.js +152 -2
  212. package/scripts/makeIconkit.js +85 -6
  213. package/scripts/themesConfig.js +742 -40
  214. package/scripts/updateTranslations.js +251 -10
  215. package/selectors/searchproviders.js +44 -2
  216. package/stores/StandardStore.js +42 -2
  217. package/utils/ConfigUtils.js +84 -3
  218. package/utils/CoordinatesUtils.js +234 -23
  219. package/utils/DxfUtils.js +237 -11
  220. package/utils/EditingInterface.js +421 -87
  221. package/utils/EditingUtils.js +357 -13
  222. package/utils/ElevationInterface.js +83 -22
  223. package/utils/FeatureStyles.js +429 -5
  224. package/utils/IdentifyUtils.js +443 -7
  225. package/utils/ImageEditor.js +79 -9
  226. package/utils/LayerUtils.js +1516 -50
  227. package/utils/LocaleUtils.js +117 -7
  228. package/utils/MapUtils.js +241 -59
  229. package/utils/MeasureUtils.js +323 -2
  230. package/utils/MiscUtils.js +189 -11
  231. package/utils/PermaLinkUtils.js +429 -6
  232. package/utils/PluginStore.js +27 -1
  233. package/utils/ResourceRegistry.js +15 -1
  234. package/utils/RoutingInterface.js +307 -7
  235. package/utils/SearchProviders.js +722 -19
  236. package/utils/ServiceLayerUtils.js +669 -14
  237. package/utils/Signal.js +32 -2
  238. package/utils/ThemeUtils.js +341 -7
  239. package/utils/VectorLayerUtils.js +589 -15
  240. package/utils/expr_grammar/grammar.js +2239 -2
  241. package/utils/expr_grammar/test.js +65 -3
@@ -1,18 +1,226 @@
1
- function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
3
+ function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
4
+ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
5
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
6
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
7
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
8
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
9
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
10
+ /**
2
11
  * Copyright 2025 Sourcepole AG
3
12
  * All rights reserved.
4
13
  *
5
14
  * This source code is licensed under the BSD-style license found in the
6
15
  * LICENSE file in the root directory of this source tree.
7
- */import{Box3,BufferGeometry,Mesh,Vector2,Vector3}from"three";import{MeshLine,MeshLineMaterial}from"three.meshline";import{GLTFLoader}from"three/addons/loaders/GLTFLoader";import{CSS2DObject}from"three/addons/renderers/CSS2DRenderer";import{v4 as uuidv4}from"uuid";import ConfigUtils from"../../../utils/ConfigUtils";export function createLabelObject(text,pos,sceneContext,zoffset){var yoffset=arguments.length>4&&arguments[4]!==undefined?arguments[4]:0;var labelEl=document.createElement("span");labelEl.className="map3d-object-label";labelEl.textContent=text;var labelObject=new CSS2DObject(labelEl);labelObject.position.set(pos.x,pos.y+yoffset,pos.z+zoffset);labelObject.updateMatrixWorld();// Leader line
8
- var linegeom=new MeshLine;linegeom.setGeometry(new BufferGeometry().setFromPoints([new Vector3(0,-yoffset,-zoffset),new Vector3(0,0,0)]));var resolution=new Vector2(sceneContext.scene.view.width,sceneContext.scene.view.height);var linemat=new MeshLineMaterial({color:3770564,resolution:resolution,lineWidth:2,sizeAttenuation:0});var linemesh=new Mesh(linegeom,linemat);labelObject.add(linemesh);linemesh.updateMatrixWorld();labelObject.userData.sceneResizeCallback=function(_ref){var width=_ref.width,height=_ref.height;linemat.resolution.set(width,height)};sceneContext.scene.view.addEventListener("view-resized",labelObject.userData.sceneResizeCallback);return labelObject}export function updateObjectLabel(sceneObject,sceneContext){var labelObject=sceneObject.children.find(function(child){return child.isCSS2DObject});if(sceneObject.userData.label){if(!labelObject){var _sceneObject$userData;labelObject=createLabelObject(sceneObject.userData.label,new Vector3(0,0,0),sceneContext,(_sceneObject$userData=sceneObject.userData.labelOffset)!==null&&_sceneObject$userData!==void 0?_sceneObject$userData:50);sceneObject.add(labelObject);sceneObject.updateMatrixWorld();labelObject.userData.removeCallback=function(){var _labelObject$element$,_labelObject$element$2;// Explicitly remove label DOM element
9
- (_labelObject$element$=labelObject.element.parentNode)===null||_labelObject$element$===void 0||(_labelObject$element$2=_labelObject$element$.removeChild)===null||_labelObject$element$2===void 0||_labelObject$element$2.call(_labelObject$element$,labelObject.element)};sceneObject.addEventListener("removed",labelObject.userData.removeCallback)}else{labelObject.element.textContent=sceneObject.userData.label}}else if(labelObject){sceneObject.removeEventListener("removed",labelObject.userData.removeCallback);sceneContext.scene.view.removeEventListener("view-resized",labelObject.userData.sceneResizeCallback);// Remove leaderline first, as the remove trigger of the CSS2DObject assumes children are CSS2DObjects as well
10
- labelObject.children[0].removeFromParent();labelObject.removeFromParent()}}export function importGltf(dataOrUrl,name,sceneContext){var options=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{};var showEditTool=arguments.length>4&&arguments[4]!==undefined?arguments[4]:false;var loader=new GLTFLoader;var processor=function processor(gltf){// GLTF is Y-UP, we need Z-UP
11
- gltf.scene.rotation.x=Math.PI/2;gltf.scene.updateMatrixWorld(true);var objectId=uuidv4();options=_objectSpread({layertree:true,title:name},options);gltf.scene.castShadow=true;gltf.scene.receiveShadow=true;gltf.scene.traverse(function(c){if(c.geometry){c.castShadow=true;c.receiveShadow=true}updateObjectLabel(c,sceneContext)});// Shift root position to center of object
12
- gltf.scene.updateMatrixWorld(true);var box=new Box3().setFromObject(gltf.scene);var centerWorld=box.getCenter(new Vector3);centerWorld.z=box.min.z;var centerLocal=gltf.scene.worldToLocal(centerWorld.clone());gltf.scene.position.add(centerWorld);// Offset children back so the world positions remain unchanged
13
- gltf.scene.children.forEach(function(child){child.position.sub(centerLocal)});gltf.scene.updateMatrixWorld(true);sceneContext.addSceneObject(objectId,gltf.scene,options,showEditTool)};if(typeof dataOrUrl==="string"){loader.load(dataOrUrl,processor,function(){},function(err){/* eslint-disable-next-line */console.warn(err)})}else{loader.parse(dataOrUrl,ConfigUtils.getAssetsPath(),processor,function(err){/* eslint-disable-next-line */console.warn(err)})}}export var TileMeshHelper=/*#__PURE__*/function(){function TileMeshHelper(object){_classCallCheck(this,TileMeshHelper);this.object=object;var _object$userData=object.userData,meshFeatures=_object$userData.meshFeatures,structuralMetadata=_object$userData.structuralMetadata;if(meshFeatures&&structuralMetadata){// Get featureId via featureId attribute
14
- var featureSetIndex=0;// usually 0 unless multiple feature sets
15
- this.featureSet=meshFeatures.featureIds[featureSetIndex];this.featureIdAttr=object.geometry.getAttribute("_feature_id_".concat(this.featureSet.attribute))}else if("_batchid"in object.geometry.attributes){// Get featureId via batchId attribute
16
- this.featureSet=null;this.featureIdAttr=object.geometry.getAttribute("_batchid")}else{/* eslint-disable-next-line */console.warn("Cannot determine tile mesh feature index attribute");this.featureIdAttr=null}this.tileObject=object;while(this.tileObject.parent&&!this.tileObject.parent.isTilesGroup){this.tileObject=this.tileObject.parent}this.propertiesCache={}}return _createClass(TileMeshHelper,[{key:"isValid",value:function isValid(){return this.featureIdAttr!==null}},{key:"getFeatureId",value:function getFeatureId(face){return this.featureIdAttr?this.featureIdAttr.getX(face.a):null}},{key:"getFeatureIdAttr",value:function getFeatureIdAttr(){return this.featureIdAttr}},{key:"getFeatureIds",value:function getFeatureIds(){var featureIds=new Set;for(var i=0;i<this.featureIdAttr.count;i++){featureIds.add(this.featureIdAttr.getX(i))}return featureIds}},{key:"getFeatureProperties",value:function getFeatureProperties(featureId){if(featureId in this.propertiesCache){return this.propertiesCache[featureId]}else if(this.object.userData.structuralMetadata){this.propertiesCache[featureId]=this.object.userData.structuralMetadata.getPropertyTableData([this.featureSet.propertyTable],[featureId])[0]}else if(this.tileObject.batchTable){this.propertiesCache[featureId]=this.tileObject.batchTable.getDataFromId(featureId)}else{this.propertiesCache[featureId]={}}return this.propertiesCache[featureId]}},{key:"getTileUserData",value:function getTileUserData(){return this.tileObject.userData}},{key:"forEachFeatureTriangle",value:function forEachFeatureTriangle(featureId,callback){if(!this.featureIdAttr){return}else if(this.object.geometry.index){// For indexed geometries, index attribute contains a sequence of triangle index triplets
17
- var indices=this.object.geometry.index.array;for(var tri=0;tri<indices.length;tri+=3){var i0=indices[tri];if(this.featureIdAttr.getX(i0)===featureId){var i1=indices[tri+1];var i2=indices[tri+2];callback(i0,i1,i2)}}}else{// For non-index geometries, the id attribute contains a sequence of triangle vertex indices
18
- for(var _tri=0;_tri<this.featureIdAttr.count;_tri+=3){if(this.featureIdAttr.getX(_tri)===featureId){callback(_tri,_tri+1,_tri+2)}}}}}])}();
16
+ */
17
+
18
+ import { Box3, BufferGeometry, Mesh, Vector2, Vector3 } from 'three';
19
+ import { MeshLine, MeshLineMaterial } from 'three.meshline';
20
+ import { GLTFLoader } from 'three/addons/loaders/GLTFLoader';
21
+ import { CSS2DObject } from "three/addons/renderers/CSS2DRenderer";
22
+ import { v4 as uuidv4 } from 'uuid';
23
+ import ConfigUtils from '../../../utils/ConfigUtils';
24
+ export function createLabelObject(text, pos, sceneContext, zoffset) {
25
+ var yoffset = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
26
+ var labelEl = document.createElement("span");
27
+ labelEl.className = "map3d-object-label";
28
+ labelEl.textContent = text;
29
+ var labelObject = new CSS2DObject(labelEl);
30
+ labelObject.position.set(pos.x, pos.y + yoffset, pos.z + zoffset);
31
+ labelObject.updateMatrixWorld();
32
+ // Leader line
33
+ var linegeom = new MeshLine();
34
+ linegeom.setGeometry(new BufferGeometry().setFromPoints([new Vector3(0, -yoffset, -zoffset), new Vector3(0, 0, 0)]));
35
+ var resolution = new Vector2(sceneContext.scene.view.width, sceneContext.scene.view.height);
36
+ var linemat = new MeshLineMaterial({
37
+ color: 0x3988C4,
38
+ resolution: resolution,
39
+ lineWidth: 2,
40
+ sizeAttenuation: 0
41
+ });
42
+ var linemesh = new Mesh(linegeom, linemat);
43
+ labelObject.add(linemesh);
44
+ linemesh.updateMatrixWorld();
45
+ labelObject.userData.sceneResizeCallback = function (_ref) {
46
+ var width = _ref.width,
47
+ height = _ref.height;
48
+ linemat.resolution.set(width, height);
49
+ };
50
+ sceneContext.scene.view.addEventListener('view-resized', labelObject.userData.sceneResizeCallback);
51
+ return labelObject;
52
+ }
53
+ export function updateObjectLabel(sceneObject, sceneContext) {
54
+ var labelObject = sceneObject.children.find(function (child) {
55
+ return child.isCSS2DObject;
56
+ });
57
+ if (sceneObject.userData.label) {
58
+ if (!labelObject) {
59
+ var _sceneObject$userData;
60
+ labelObject = createLabelObject(sceneObject.userData.label, new Vector3(0, 0, 0), sceneContext, (_sceneObject$userData = sceneObject.userData.labelOffset) !== null && _sceneObject$userData !== void 0 ? _sceneObject$userData : 50);
61
+ sceneObject.add(labelObject);
62
+ sceneObject.updateMatrixWorld();
63
+ labelObject.userData.removeCallback = function () {
64
+ var _labelObject$element$, _labelObject$element$2;
65
+ // Explicitly remove label DOM element
66
+ (_labelObject$element$ = labelObject.element.parentNode) === null || _labelObject$element$ === void 0 || (_labelObject$element$2 = _labelObject$element$.removeChild) === null || _labelObject$element$2 === void 0 || _labelObject$element$2.call(_labelObject$element$, labelObject.element);
67
+ };
68
+ sceneObject.addEventListener('removed', labelObject.userData.removeCallback);
69
+ } else {
70
+ labelObject.element.textContent = sceneObject.userData.label;
71
+ }
72
+ } else if (labelObject) {
73
+ sceneObject.removeEventListener('removed', labelObject.userData.removeCallback);
74
+ sceneContext.scene.view.removeEventListener('view-resized', labelObject.userData.sceneResizeCallback);
75
+ // Remove leaderline first, as the remove trigger of the CSS2DObject assumes children are CSS2DObjects as well
76
+ labelObject.children[0].removeFromParent();
77
+ labelObject.removeFromParent();
78
+ }
79
+ }
80
+ export function importGltf(dataOrUrl, name, sceneContext) {
81
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
82
+ var showEditTool = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
83
+ var loader = new GLTFLoader();
84
+ var processor = function processor(gltf) {
85
+ // GLTF is Y-UP, we need Z-UP
86
+ gltf.scene.rotation.x = Math.PI / 2;
87
+ gltf.scene.updateMatrixWorld(true);
88
+ var objectId = uuidv4();
89
+ options = _objectSpread({
90
+ layertree: true,
91
+ title: name
92
+ }, options);
93
+ gltf.scene.castShadow = true;
94
+ gltf.scene.receiveShadow = true;
95
+ gltf.scene.traverse(function (c) {
96
+ if (c.geometry) {
97
+ c.castShadow = true;
98
+ c.receiveShadow = true;
99
+ }
100
+ updateObjectLabel(c, sceneContext);
101
+ });
102
+
103
+ // Shift root position to center of object
104
+ gltf.scene.updateMatrixWorld(true);
105
+ var box = new Box3().setFromObject(gltf.scene);
106
+ var centerWorld = box.getCenter(new Vector3());
107
+ centerWorld.z = box.min.z;
108
+ var centerLocal = gltf.scene.worldToLocal(centerWorld.clone());
109
+ gltf.scene.position.add(centerWorld);
110
+
111
+ // Offset children back so the world positions remain unchanged
112
+ gltf.scene.children.forEach(function (child) {
113
+ child.position.sub(centerLocal);
114
+ });
115
+ gltf.scene.updateMatrixWorld(true);
116
+ sceneContext.addSceneObject(objectId, gltf.scene, options, showEditTool);
117
+ };
118
+ if (typeof dataOrUrl === 'string') {
119
+ loader.load(dataOrUrl, processor, function () {}, function (err) {
120
+ /* eslint-disable-next-line */
121
+ console.warn(err);
122
+ });
123
+ } else {
124
+ loader.parse(dataOrUrl, ConfigUtils.getAssetsPath(), processor, function (err) {
125
+ /* eslint-disable-next-line */
126
+ console.warn(err);
127
+ });
128
+ }
129
+ }
130
+ export var TileMeshHelper = /*#__PURE__*/function () {
131
+ function TileMeshHelper(object) {
132
+ _classCallCheck(this, TileMeshHelper);
133
+ this.object = object;
134
+ var _object$userData = object.userData,
135
+ meshFeatures = _object$userData.meshFeatures,
136
+ structuralMetadata = _object$userData.structuralMetadata;
137
+ if (meshFeatures && structuralMetadata) {
138
+ // Get featureId via featureId attribute
139
+ var featureSetIndex = 0; // usually 0 unless multiple feature sets
140
+ this.featureSet = meshFeatures.featureIds[featureSetIndex];
141
+ this.featureIdAttr = object.geometry.getAttribute("_feature_id_".concat(this.featureSet.attribute));
142
+ } else if ('_batchid' in object.geometry.attributes) {
143
+ // Get featureId via batchId attribute
144
+ this.featureSet = null;
145
+ this.featureIdAttr = object.geometry.getAttribute('_batchid');
146
+ } else {
147
+ /* eslint-disable-next-line */
148
+ console.warn("Cannot determine tile mesh feature index attribute");
149
+ this.featureIdAttr = null;
150
+ }
151
+ this.tileObject = object;
152
+ while (this.tileObject.parent && !this.tileObject.parent.isTilesGroup) {
153
+ this.tileObject = this.tileObject.parent;
154
+ }
155
+ this.propertiesCache = {};
156
+ }
157
+ return _createClass(TileMeshHelper, [{
158
+ key: "isValid",
159
+ value: function isValid() {
160
+ return this.featureIdAttr !== null;
161
+ }
162
+ }, {
163
+ key: "getFeatureId",
164
+ value: function getFeatureId(face) {
165
+ return this.featureIdAttr ? this.featureIdAttr.getX(face.a) : null;
166
+ }
167
+ }, {
168
+ key: "getFeatureIdAttr",
169
+ value: function getFeatureIdAttr() {
170
+ return this.featureIdAttr;
171
+ }
172
+ }, {
173
+ key: "getFeatureIds",
174
+ value: function getFeatureIds() {
175
+ var featureIds = new Set();
176
+ for (var i = 0; i < this.featureIdAttr.count; i++) {
177
+ featureIds.add(this.featureIdAttr.getX(i));
178
+ }
179
+ return featureIds;
180
+ }
181
+ }, {
182
+ key: "getFeatureProperties",
183
+ value: function getFeatureProperties(featureId) {
184
+ if (featureId in this.propertiesCache) {
185
+ return this.propertiesCache[featureId];
186
+ } else if (this.object.userData.structuralMetadata) {
187
+ this.propertiesCache[featureId] = this.object.userData.structuralMetadata.getPropertyTableData([this.featureSet.propertyTable], [featureId])[0];
188
+ } else if (this.tileObject.batchTable) {
189
+ this.propertiesCache[featureId] = this.tileObject.batchTable.getDataFromId(featureId);
190
+ } else {
191
+ this.propertiesCache[featureId] = {};
192
+ }
193
+ return this.propertiesCache[featureId];
194
+ }
195
+ }, {
196
+ key: "getTileUserData",
197
+ value: function getTileUserData() {
198
+ return this.tileObject.userData;
199
+ }
200
+ }, {
201
+ key: "forEachFeatureTriangle",
202
+ value: function forEachFeatureTriangle(featureId, callback) {
203
+ if (!this.featureIdAttr) {
204
+ return;
205
+ } else if (this.object.geometry.index) {
206
+ // For indexed geometries, index attribute contains a sequence of triangle index triplets
207
+ var indices = this.object.geometry.index.array;
208
+ for (var tri = 0; tri < indices.length; tri += 3) {
209
+ var i0 = indices[tri];
210
+ if (this.featureIdAttr.getX(i0) === featureId) {
211
+ var i1 = indices[tri + 1];
212
+ var i2 = indices[tri + 2];
213
+ callback(i0, i1, i2);
214
+ }
215
+ }
216
+ } else {
217
+ // For non-index geometries, the id attribute contains a sequence of triangle vertex indices
218
+ for (var _tri = 0; _tri < this.featureIdAttr.count; _tri += 3) {
219
+ if (this.featureIdAttr.getX(_tri) === featureId) {
220
+ callback(_tri, _tri + 1, _tri + 2);
221
+ }
222
+ }
223
+ }
224
+ }
225
+ }]);
226
+ }();
@@ -1,10 +1,181 @@
1
- function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _superPropGet(t,o,e,r){var p=_get(_getPrototypeOf(1&r?t.prototype:t),o,e);return 2&r&&"function"==typeof p?function(t){return p.apply(e,t)}:p}function _get(){return _get="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,r){var p=_superPropBase(e,t);if(p){var n=Object.getOwnPropertyDescriptor(p,t);return n.get?n.get.call(arguments.length<3?e:r):n.value}},_get.apply(null,arguments)}function _superPropBase(t,o){for(;!{}.hasOwnProperty.call(t,o)&&null!==(t=_getPrototypeOf(t)););return t}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
3
+ function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
4
+ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
5
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
6
+ function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
7
+ function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
8
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
9
+ function _superPropGet(t, o, e, r) { var p = _get(_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
10
+ function _get() { return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = _superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, _get.apply(null, arguments); }
11
+ function _superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t));); return t; }
12
+ function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
13
+ function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
14
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
15
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
16
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
17
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
18
+ /**
2
19
  * Copyright 2025 Sourcepole AG
3
20
  * All rights reserved.
4
21
  *
5
22
  * This source code is licensed under the BSD-style license found in the
6
23
  * LICENSE file in the root directory of this source tree.
7
- */import{Vector3}from"three";import{MapControls}from"three/addons/controls/MapControls";import{v4 as uuidv4}from"uuid";var OrbitControls3D=/*#__PURE__*/function(_MapControls){function OrbitControls3D(object,mouseButtons){var _this;_classCallCheck(this,OrbitControls3D);_this=_callSuper(this,OrbitControls3D,[object]);_defineProperty(_this,"updateControlsTarget",function(){var _this$sceneContext$ge;if(_this.animationId){// Do nothing if animating
8
- return}var camerapos=_this.object.position;var x=_this.target.x;var y=_this.target.y;var height=(_this$sceneContext$ge=_this.sceneContext.getTerrainHeightFromMap([x,y]))!==null&&_this$sceneContext$ge!==void 0?_this$sceneContext$ge:0;// If camera height is at terrain height, target height should be at terrain height
9
- // If camera height is at twice the terrain height or further, target height should be zero
10
- var newHeight=Math.max(0,1-(camerapos.z-height)/height)*height;_this.target.z=newHeight});_defineProperty(_this,"stopAnimations",function(){_this.animationId=null});_this.animationId=null;_this.sceneContext=null;_this.enabled=false;_this.zoomToCursor=true;_this.enableDamping=true;_this.dampingFactor=0.2;_this.keyPanSpeed=10;_this.maxPolarAngle=Math.PI*0.5;_this.mouseButtons=mouseButtons;_this.zoomSpeed=5;return _this}_inherits(OrbitControls3D,_MapControls);return _createClass(OrbitControls3D,[{key:"connect",value:function connect(sceneContext){this.domElement=sceneContext.scene.domElement;this.sceneContext=sceneContext;this.enabled=true;_superPropGet(OrbitControls3D,"connect",this,3)([]);this.listenToKeyEvents(this.domElement);this.domElement.addEventListener("pointerdown",this.stopAnimations);this.domElement.addEventListener("wheel",this.stopAnimations);this.addEventListener("change",this.updateControlsTarget);this.object.near=2;this.sceneContext.scene.view.setControls(this)}},{key:"disconnect",value:function disconnect(){this.animationId=null;_superPropGet(OrbitControls3D,"disconnect",this,3)([]);this.enabled=false;this.sceneContext.scene.view.setControls(null);this.domElement.removeEventListener("pointerdown",this.stopAnimations);this.domElement.removeEventListener("wheel",this.stopAnimations);this.removeEventListener("change",this.updateControlsTarget)}},{key:"setView",value:function setView(camerapos,target){this.object.position.copy(camerapos);this.target.copy(target);this.update()}},{key:"panView",value:function panView(dx,dy){if(dx||dy){this._pan(-dx*10,dy*10);this.update()}}},{key:"tiltView",value:function tiltView(azimuth,polar){if(azimuth){this._rotateLeft(azimuth)}if(polar){this._rotateUp(polar)}if(azimuth||polar){this.update()}}},{key:"zoomView",value:function zoomView(delta){if(delta>0){this._dollyIn(this._getZoomScale(-delta));this.update()}else if(delta<0){this._dollyOut(this._getZoomScale(-delta));this.update()}}},{key:"animateTo",value:function animateTo(camerapos,target,azimuth){var _this2=this;var callback=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var oldPosition=this.object.position.clone();var oldTarget=this.target.clone();var oldYaw=this.getAzimuthalAngle();var newPosition=camerapos;var newTarget=target;var rotateAngle=-oldYaw+azimuth;while(rotateAngle>Math.PI)rotateAngle-=2*Math.PI;while(rotateAngle<-Math.PI)rotateAngle+=2*Math.PI;var startTime=new Date/1000;var animationId=uuidv4();this.animationId=animationId;this.enableDamping=false;var _animate=function animate(){if(_this2.animationId!==animationId){return}var duration=2;var elapsed=new Date/1000-startTime;var x=elapsed/duration;var k=0.5*(1-Math.cos(x*Math.PI));var currentPosition=new Vector3().lerpVectors(oldPosition,newPosition,k);var currentTarget=new Vector3().lerpVectors(oldTarget,newTarget,k);currentPosition.x-=currentTarget.x;currentPosition.y-=currentTarget.y;currentPosition.applyAxisAngle(new Vector3(0,0,1),rotateAngle*k);currentPosition.x+=currentTarget.x;currentPosition.y+=currentTarget.y;_this2.object.position.copy(currentPosition);_this2.target.copy(currentTarget);_this2.update();if(elapsed<duration){requestAnimationFrame(_animate)}else{_this2.object.position.copy(newPosition);_this2.target.copy(newTarget);_this2.update();_this2._rotateLeft(_this2.getAzimuthalAngle()-azimuth);_this2.update();_this2.enableDamping=true;_this2.animationId=null;callback===null||callback===void 0||callback()}};requestAnimationFrame(_animate)}}])}(MapControls);export{OrbitControls3D as default};
24
+ */
25
+
26
+ import { Vector3 } from 'three';
27
+ import { MapControls } from 'three/addons/controls/MapControls';
28
+ import { v4 as uuidv4 } from 'uuid';
29
+ var OrbitControls3D = /*#__PURE__*/function (_MapControls) {
30
+ function OrbitControls3D(object, mouseButtons) {
31
+ var _this;
32
+ _classCallCheck(this, OrbitControls3D);
33
+ _this = _callSuper(this, OrbitControls3D, [object]);
34
+ _defineProperty(_this, "updateControlsTarget", function () {
35
+ var _this$sceneContext$ge;
36
+ if (_this.animationId) {
37
+ // Do nothing if animating
38
+ return;
39
+ }
40
+ var camerapos = _this.object.position;
41
+ var x = _this.target.x;
42
+ var y = _this.target.y;
43
+ var height = (_this$sceneContext$ge = _this.sceneContext.getTerrainHeightFromMap([x, y])) !== null && _this$sceneContext$ge !== void 0 ? _this$sceneContext$ge : 0;
44
+ // If camera height is at terrain height, target height should be at terrain height
45
+ // If camera height is at twice the terrain height or further, target height should be zero
46
+ var newHeight = Math.max(0, 1 - (camerapos.z - height) / height) * height;
47
+ _this.target.z = newHeight;
48
+ });
49
+ _defineProperty(_this, "stopAnimations", function () {
50
+ _this.animationId = null;
51
+ });
52
+ _this.animationId = null;
53
+ _this.sceneContext = null;
54
+ _this.enabled = false;
55
+ _this.zoomToCursor = true;
56
+ _this.enableDamping = true;
57
+ _this.dampingFactor = 0.2;
58
+ _this.keyPanSpeed = 10.0;
59
+ _this.maxPolarAngle = Math.PI * 0.5;
60
+ _this.mouseButtons = mouseButtons;
61
+ _this.zoomSpeed = 5;
62
+ return _this;
63
+ }
64
+ _inherits(OrbitControls3D, _MapControls);
65
+ return _createClass(OrbitControls3D, [{
66
+ key: "connect",
67
+ value: function connect(sceneContext) {
68
+ this.domElement = sceneContext.scene.domElement;
69
+ this.sceneContext = sceneContext;
70
+ this.enabled = true;
71
+ _superPropGet(OrbitControls3D, "connect", this, 3)([]);
72
+ this.listenToKeyEvents(this.domElement);
73
+ this.domElement.addEventListener('pointerdown', this.stopAnimations);
74
+ this.domElement.addEventListener('wheel', this.stopAnimations);
75
+ this.addEventListener('change', this.updateControlsTarget);
76
+ this.object.near = 2;
77
+ this.sceneContext.scene.view.setControls(this);
78
+ }
79
+ }, {
80
+ key: "disconnect",
81
+ value: function disconnect() {
82
+ this.animationId = null;
83
+ _superPropGet(OrbitControls3D, "disconnect", this, 3)([]);
84
+ this.enabled = false;
85
+ this.sceneContext.scene.view.setControls(null);
86
+ this.domElement.removeEventListener('pointerdown', this.stopAnimations);
87
+ this.domElement.removeEventListener('wheel', this.stopAnimations);
88
+ this.removeEventListener('change', this.updateControlsTarget);
89
+ }
90
+ }, {
91
+ key: "setView",
92
+ value: function setView(camerapos, target) {
93
+ this.object.position.copy(camerapos);
94
+ this.target.copy(target);
95
+ this.update();
96
+ }
97
+ }, {
98
+ key: "panView",
99
+ value: function panView(dx, dy) {
100
+ if (dx || dy) {
101
+ this._pan(-dx * 10, dy * 10);
102
+ this.update();
103
+ }
104
+ }
105
+ }, {
106
+ key: "tiltView",
107
+ value: function tiltView(azimuth, polar) {
108
+ if (azimuth) {
109
+ this._rotateLeft(azimuth);
110
+ }
111
+ if (polar) {
112
+ this._rotateUp(polar);
113
+ }
114
+ if (azimuth || polar) {
115
+ this.update();
116
+ }
117
+ }
118
+ }, {
119
+ key: "zoomView",
120
+ value: function zoomView(delta) {
121
+ if (delta > 0) {
122
+ this._dollyIn(this._getZoomScale(-delta));
123
+ this.update();
124
+ } else if (delta < 0) {
125
+ this._dollyOut(this._getZoomScale(-delta));
126
+ this.update();
127
+ }
128
+ }
129
+ }, {
130
+ key: "animateTo",
131
+ value: function animateTo(camerapos, target, azimuth) {
132
+ var _this2 = this;
133
+ var callback = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
134
+ var oldPosition = this.object.position.clone();
135
+ var oldTarget = this.target.clone();
136
+ var oldYaw = this.getAzimuthalAngle();
137
+ var newPosition = camerapos;
138
+ var newTarget = target;
139
+ var rotateAngle = -oldYaw + azimuth;
140
+ while (rotateAngle > Math.PI) rotateAngle -= 2 * Math.PI;
141
+ while (rotateAngle < -Math.PI) rotateAngle += 2 * Math.PI;
142
+ var startTime = new Date() / 1000;
143
+ var animationId = uuidv4();
144
+ this.animationId = animationId;
145
+ this.enableDamping = false;
146
+ var _animate = function animate() {
147
+ if (_this2.animationId !== animationId) {
148
+ return;
149
+ }
150
+ var duration = 2;
151
+ var elapsed = new Date() / 1000 - startTime;
152
+ var x = elapsed / duration;
153
+ var k = 0.5 * (1 - Math.cos(x * Math.PI));
154
+ var currentPosition = new Vector3().lerpVectors(oldPosition, newPosition, k);
155
+ var currentTarget = new Vector3().lerpVectors(oldTarget, newTarget, k);
156
+ currentPosition.x -= currentTarget.x;
157
+ currentPosition.y -= currentTarget.y;
158
+ currentPosition.applyAxisAngle(new Vector3(0, 0, 1), rotateAngle * k);
159
+ currentPosition.x += currentTarget.x;
160
+ currentPosition.y += currentTarget.y;
161
+ _this2.object.position.copy(currentPosition);
162
+ _this2.target.copy(currentTarget);
163
+ _this2.update();
164
+ if (elapsed < duration) {
165
+ requestAnimationFrame(_animate);
166
+ } else {
167
+ _this2.object.position.copy(newPosition);
168
+ _this2.target.copy(newTarget);
169
+ _this2.update();
170
+ _this2._rotateLeft(_this2.getAzimuthalAngle() - azimuth);
171
+ _this2.update();
172
+ _this2.enableDamping = true;
173
+ _this2.animationId = null;
174
+ callback === null || callback === void 0 || callback();
175
+ }
176
+ };
177
+ requestAnimationFrame(_animate);
178
+ }
179
+ }]);
180
+ }(MapControls);
181
+ export { OrbitControls3D as default };