@itwin/core-frontend 4.1.0-dev.35 → 4.1.0-dev.40

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 (851) hide show
  1. package/lib/cjs/AccuDraw.js.map +1 -1
  2. package/lib/cjs/AccuSnap.js.map +1 -1
  3. package/lib/cjs/ApproximateTerrainHeights.js.map +1 -1
  4. package/lib/cjs/ApproximateTerrainHeightsProps.js.map +1 -1
  5. package/lib/cjs/AuxCoordSys.js.map +1 -1
  6. package/lib/cjs/BackgroundMapGeometry.js.map +1 -1
  7. package/lib/cjs/BingLocation.js.map +1 -1
  8. package/lib/cjs/BriefcaseConnection.js.map +1 -1
  9. package/lib/cjs/BriefcaseTxns.js.map +1 -1
  10. package/lib/cjs/CategorySelectorState.js.map +1 -1
  11. package/lib/cjs/ChangeFlags.js.map +1 -1
  12. package/lib/cjs/CheckpointConnection.js.map +1 -1
  13. package/lib/cjs/CoordSystem.js.map +1 -1
  14. package/lib/cjs/DecorationsCache.js.map +1 -1
  15. package/lib/cjs/DevTools.js.map +1 -1
  16. package/lib/cjs/DisplayStyleState.js.map +1 -1
  17. package/lib/cjs/DrawingViewState.js +5 -5
  18. package/lib/cjs/DrawingViewState.js.map +1 -1
  19. package/lib/cjs/ElementLocateManager.js.map +1 -1
  20. package/lib/cjs/EmphasizeElements.js.map +1 -1
  21. package/lib/cjs/EntityState.js.map +1 -1
  22. package/lib/cjs/EnvironmentDecorations.js.map +1 -1
  23. package/lib/cjs/FeatureOverrideProvider.js.map +1 -1
  24. package/lib/cjs/FlashSettings.js.map +1 -1
  25. package/lib/cjs/FrontendHubAccess.js.map +1 -1
  26. package/lib/cjs/Frustum2d.js.map +1 -1
  27. package/lib/cjs/FrustumAnimator.js.map +1 -1
  28. package/lib/cjs/FuzzySearch.js.map +1 -1
  29. package/lib/cjs/GeoServices.js.map +1 -1
  30. package/lib/cjs/GlobeAnimator.js.map +1 -1
  31. package/lib/cjs/GraphicalEditingScope.js.map +1 -1
  32. package/lib/cjs/HitDetail.js.map +1 -1
  33. package/lib/cjs/IModelApp.js.map +1 -1
  34. package/lib/cjs/IModelConnection.js +23 -23
  35. package/lib/cjs/IModelConnection.js.map +1 -1
  36. package/lib/cjs/IModelRoutingContext.js.map +1 -1
  37. package/lib/cjs/IModeljs-css.js +133 -133
  38. package/lib/cjs/IModeljs-css.js.map +1 -1
  39. package/lib/cjs/IpcApp.js.map +1 -1
  40. package/lib/cjs/LinePlaneIntersect.js.map +1 -1
  41. package/lib/cjs/LocalhostIpcApp.js.map +1 -1
  42. package/lib/cjs/MarginPercent.js.map +1 -1
  43. package/lib/cjs/Marker.js.map +1 -1
  44. package/lib/cjs/ModelSelectorState.js.map +1 -1
  45. package/lib/cjs/NativeApp.js.map +1 -1
  46. package/lib/cjs/NativeAppLogger.js.map +1 -1
  47. package/lib/cjs/NoRenderApp.js.map +1 -1
  48. package/lib/cjs/NotificationManager.js.map +1 -1
  49. package/lib/cjs/PerModelCategoryVisibility.js.map +1 -1
  50. package/lib/cjs/PlanarClipMaskState.js.map +1 -1
  51. package/lib/cjs/RealityDataSource.js.map +1 -1
  52. package/lib/cjs/RealityDataSourceCesiumIonAssetImpl.js.map +1 -1
  53. package/lib/cjs/RealityDataSourceContextShareImpl.js.map +1 -1
  54. package/lib/cjs/RealityDataSourceTilesetUrlImpl.js.map +1 -1
  55. package/lib/cjs/SelectionSet.js.map +1 -1
  56. package/lib/cjs/SheetViewState.js.map +1 -1
  57. package/lib/cjs/SpatialViewState.js.map +1 -1
  58. package/lib/cjs/Sprites.js.map +1 -1
  59. package/lib/cjs/StandardView.js.map +1 -1
  60. package/lib/cjs/SubCategoriesCache.js.map +1 -1
  61. package/lib/cjs/TentativePoint.js.map +1 -1
  62. package/lib/cjs/Tiles.js.map +1 -1
  63. package/lib/cjs/UserPreferences.js.map +1 -1
  64. package/lib/cjs/ViewAnimation.js.map +1 -1
  65. package/lib/cjs/ViewContext.js.map +1 -1
  66. package/lib/cjs/ViewCreator2d.js.map +1 -1
  67. package/lib/cjs/ViewCreator3d.js.map +1 -1
  68. package/lib/cjs/ViewGlobalLocation.js.map +1 -1
  69. package/lib/cjs/ViewManager.js.map +1 -1
  70. package/lib/cjs/ViewPose.js.map +1 -1
  71. package/lib/cjs/ViewState.js.map +1 -1
  72. package/lib/cjs/ViewStatus.js.map +1 -1
  73. package/lib/cjs/ViewingSpace.js.map +1 -1
  74. package/lib/cjs/Viewport.js.map +1 -1
  75. package/lib/cjs/ViewportSync.js.map +1 -1
  76. package/lib/cjs/common/FrontendLoggerCategory.js.map +1 -1
  77. package/lib/cjs/common/ImageUtil.js.map +1 -1
  78. package/lib/cjs/common/ViewRect.js.map +1 -1
  79. package/lib/cjs/common/WorkerProxy.js.map +1 -1
  80. package/lib/cjs/common/gltf/GltfModel.js.map +1 -1
  81. package/lib/cjs/common/gltf/GltfParser.js.map +1 -1
  82. package/lib/cjs/common/gltf/GltfSchema.js.map +1 -1
  83. package/lib/cjs/common/imdl/CompactEdges.js.map +1 -1
  84. package/lib/cjs/common/imdl/ImdlModel.js.map +1 -1
  85. package/lib/cjs/common/imdl/ImdlSchema.js.map +1 -1
  86. package/lib/cjs/common/imdl/ParseImdlDocument.js.map +1 -1
  87. package/lib/cjs/common/render/AnimationNodeId.js.map +1 -1
  88. package/lib/cjs/common/render/MaterialParams.js.map +1 -1
  89. package/lib/cjs/common/render/TextureParams.js.map +1 -1
  90. package/lib/cjs/common/render/primitives/AuxChannelTable.js.map +1 -1
  91. package/lib/cjs/common/render/primitives/DisplayParams.js.map +1 -1
  92. package/lib/cjs/common/render/primitives/EdgeParams.js.map +1 -1
  93. package/lib/cjs/common/render/primitives/MeshParams.js.map +1 -1
  94. package/lib/cjs/common/render/primitives/MeshPrimitive.js.map +1 -1
  95. package/lib/cjs/common/render/primitives/PointStringParams.js.map +1 -1
  96. package/lib/cjs/common/render/primitives/PolylineParams.js.map +1 -1
  97. package/lib/cjs/common/render/primitives/SurfaceParams.js.map +1 -1
  98. package/lib/cjs/common/render/primitives/VertexIndices.js.map +1 -1
  99. package/lib/cjs/common/render/primitives/VertexTable.js.map +1 -1
  100. package/lib/cjs/common/render/primitives/VertexTableSplitter.js.map +1 -1
  101. package/lib/cjs/core-frontend.js.map +1 -1
  102. package/lib/cjs/extension/Extension.js.map +1 -1
  103. package/lib/cjs/extension/ExtensionAdmin.js.map +1 -1
  104. package/lib/cjs/extension/ExtensionHost.js.map +1 -1
  105. package/lib/cjs/extension/ExtensionRuntime.js.map +1 -1
  106. package/lib/cjs/extension/providers/ExtensionLoadScript.js.map +1 -1
  107. package/lib/cjs/extension/providers/LocalExtensionProvider.js.map +1 -1
  108. package/lib/cjs/extension/providers/RemoteExtensionProvider.js.map +1 -1
  109. package/lib/cjs/properties/AngleDescription.js.map +1 -1
  110. package/lib/cjs/properties/FormattedQuantityDescription.js.map +1 -1
  111. package/lib/cjs/properties/LengthDescription.js.map +1 -1
  112. package/lib/cjs/public/scripts/checkbrowser.js +24 -24
  113. package/lib/cjs/quantity-formatting/BaseUnitFormattingSettingsProvider.js.map +1 -1
  114. package/lib/cjs/quantity-formatting/BasicUnitsProvider.js.map +1 -1
  115. package/lib/cjs/quantity-formatting/LocalUnitFormatProvider.js.map +1 -1
  116. package/lib/cjs/quantity-formatting/QuantityFormatter.js.map +1 -1
  117. package/lib/cjs/quantity-formatting/QuantityTypesEditorSpecs.js.map +1 -1
  118. package/lib/cjs/quantity-formatting/UnitsData.js.map +1 -1
  119. package/lib/cjs/render/CanvasDecoration.js.map +1 -1
  120. package/lib/cjs/render/CreateRenderMaterialArgs.js.map +1 -1
  121. package/lib/cjs/render/CreateTextureArgs.js.map +1 -1
  122. package/lib/cjs/render/Decorations.js.map +1 -1
  123. package/lib/cjs/render/FeatureSymbology.js.map +1 -1
  124. package/lib/cjs/render/FrameStats.js.map +1 -1
  125. package/lib/cjs/render/GraphicBranch.js.map +1 -1
  126. package/lib/cjs/render/GraphicBuilder.js.map +1 -1
  127. package/lib/cjs/render/GraphicPrimitive.js.map +1 -1
  128. package/lib/cjs/render/InstancedGraphicParams.js.map +1 -1
  129. package/lib/cjs/render/MockRender.js.map +1 -1
  130. package/lib/cjs/render/ParticleCollectionBuilder.js.map +1 -1
  131. package/lib/cjs/render/Pixel.js.map +1 -1
  132. package/lib/cjs/render/RealityMeshGraphicParams.js.map +1 -1
  133. package/lib/cjs/render/RealityMeshParams.js.map +1 -1
  134. package/lib/cjs/render/RenderClipVolume.js.map +1 -1
  135. package/lib/cjs/render/RenderGraphic.js.map +1 -1
  136. package/lib/cjs/render/RenderMemory.js.map +1 -1
  137. package/lib/cjs/render/RenderPlan.js.map +1 -1
  138. package/lib/cjs/render/RenderPlanarClassifier.js.map +1 -1
  139. package/lib/cjs/render/RenderSystem.js.map +1 -1
  140. package/lib/cjs/render/RenderTarget.js.map +1 -1
  141. package/lib/cjs/render/Scene.js.map +1 -1
  142. package/lib/cjs/render/ScreenSpaceEffectBuilder.js.map +1 -1
  143. package/lib/cjs/render/UpsampleRealityMeshParams.js.map +1 -1
  144. package/lib/cjs/render/VisibleFeature.js.map +1 -1
  145. package/lib/cjs/render/primitives/ColorMap.js.map +1 -1
  146. package/lib/cjs/render/primitives/EdgeParams.js.map +1 -1
  147. package/lib/cjs/render/primitives/PointCloudPrimitive.js.map +1 -1
  148. package/lib/cjs/render/primitives/PointStringParams.js.map +1 -1
  149. package/lib/cjs/render/primitives/Polyface.js.map +1 -1
  150. package/lib/cjs/render/primitives/PolylineParams.js.map +1 -1
  151. package/lib/cjs/render/primitives/Primitives.js.map +1 -1
  152. package/lib/cjs/render/primitives/Strokes.js.map +1 -1
  153. package/lib/cjs/render/primitives/VertexKey.js.map +1 -1
  154. package/lib/cjs/render/primitives/VertexTableBuilder.js.map +1 -1
  155. package/lib/cjs/render/primitives/geometry/GeometryAccumulator.js.map +1 -1
  156. package/lib/cjs/render/primitives/geometry/GeometryList.js.map +1 -1
  157. package/lib/cjs/render/primitives/geometry/GeometryListBuilder.js.map +1 -1
  158. package/lib/cjs/render/primitives/geometry/GeometryPrimitives.js.map +1 -1
  159. package/lib/cjs/render/primitives/mesh/MeshBuilder.js.map +1 -1
  160. package/lib/cjs/render/primitives/mesh/MeshBuilderMap.js.map +1 -1
  161. package/lib/cjs/render/primitives/mesh/MeshPrimitives.js.map +1 -1
  162. package/lib/cjs/render/webgl/AtmosphereUniforms.js.map +1 -1
  163. package/lib/cjs/render/webgl/AttributeBuffers.js.map +1 -1
  164. package/lib/cjs/render/webgl/AttributeMap.js.map +1 -1
  165. package/lib/cjs/render/webgl/BackgroundMapDrape.js.map +1 -1
  166. package/lib/cjs/render/webgl/BatchState.js.map +1 -1
  167. package/lib/cjs/render/webgl/BatchUniforms.js.map +1 -1
  168. package/lib/cjs/render/webgl/BranchStack.js.map +1 -1
  169. package/lib/cjs/render/webgl/BranchState.js.map +1 -1
  170. package/lib/cjs/render/webgl/BranchUniforms.js.map +1 -1
  171. package/lib/cjs/render/webgl/CachedGeometry.js.map +1 -1
  172. package/lib/cjs/render/webgl/ClipStack.js.map +1 -1
  173. package/lib/cjs/render/webgl/ClipVolume.js.map +1 -1
  174. package/lib/cjs/render/webgl/ClippingProgram.js.map +1 -1
  175. package/lib/cjs/render/webgl/ColorInfo.js.map +1 -1
  176. package/lib/cjs/render/webgl/Diagnostics.js.map +1 -1
  177. package/lib/cjs/render/webgl/Disposable.js.map +1 -1
  178. package/lib/cjs/render/webgl/DrawCommand.js.map +1 -1
  179. package/lib/cjs/render/webgl/EDL.js.map +1 -1
  180. package/lib/cjs/render/webgl/EdgeGeometry.js.map +1 -1
  181. package/lib/cjs/render/webgl/EdgeSettings.js.map +1 -1
  182. package/lib/cjs/render/webgl/FeatureOverrides.js.map +1 -1
  183. package/lib/cjs/render/webgl/FloatRGBA.js.map +1 -1
  184. package/lib/cjs/render/webgl/FrameBuffer.js.map +1 -1
  185. package/lib/cjs/render/webgl/FrustumUniforms.js.map +1 -1
  186. package/lib/cjs/render/webgl/GL.js.map +1 -1
  187. package/lib/cjs/render/webgl/GLTimer.js.map +1 -1
  188. package/lib/cjs/render/webgl/Graphic.js.map +1 -1
  189. package/lib/cjs/render/webgl/HiliteUniforms.js.map +1 -1
  190. package/lib/cjs/render/webgl/IModelFrameLifecycle.js.map +1 -1
  191. package/lib/cjs/render/webgl/IndexedEdgeGeometry.js.map +1 -1
  192. package/lib/cjs/render/webgl/InstancedGeometry.js.map +1 -1
  193. package/lib/cjs/render/webgl/Layer.js.map +1 -1
  194. package/lib/cjs/render/webgl/LayerCommands.js.map +1 -1
  195. package/lib/cjs/render/webgl/LightingUniforms.js.map +1 -1
  196. package/lib/cjs/render/webgl/LineCode.js.map +1 -1
  197. package/lib/cjs/render/webgl/Material.js.map +1 -1
  198. package/lib/cjs/render/webgl/Matrix.js.map +1 -1
  199. package/lib/cjs/render/webgl/Mesh.js.map +1 -1
  200. package/lib/cjs/render/webgl/MeshData.js.map +1 -1
  201. package/lib/cjs/render/webgl/MeshGeometry.js.map +1 -1
  202. package/lib/cjs/render/webgl/PerformanceMetrics.js.map +1 -1
  203. package/lib/cjs/render/webgl/PlanarClassifier.js.map +1 -1
  204. package/lib/cjs/render/webgl/PlanarGrid.js.map +1 -1
  205. package/lib/cjs/render/webgl/PlanarTextureProjection.js.map +1 -1
  206. package/lib/cjs/render/webgl/PointCloud.js.map +1 -1
  207. package/lib/cjs/render/webgl/PointString.js.map +1 -1
  208. package/lib/cjs/render/webgl/Polyline.js.map +1 -1
  209. package/lib/cjs/render/webgl/Primitive.js.map +1 -1
  210. package/lib/cjs/render/webgl/RealityMesh.js.map +1 -1
  211. package/lib/cjs/render/webgl/RealityModelUniforms.js.map +1 -1
  212. package/lib/cjs/render/webgl/RenderBuffer.js.map +1 -1
  213. package/lib/cjs/render/webgl/RenderCommands.js.map +1 -1
  214. package/lib/cjs/render/webgl/RenderFlags.js.map +1 -1
  215. package/lib/cjs/render/webgl/RenderState.js.map +1 -1
  216. package/lib/cjs/render/webgl/SceneCompositor.js.map +1 -1
  217. package/lib/cjs/render/webgl/ScratchDrawParams.js.map +1 -1
  218. package/lib/cjs/render/webgl/ScreenSpaceEffect.js.map +1 -1
  219. package/lib/cjs/render/webgl/ShaderBuilder.js.map +1 -1
  220. package/lib/cjs/render/webgl/ShaderProgram.js.map +1 -1
  221. package/lib/cjs/render/webgl/ShadowUniforms.js.map +1 -1
  222. package/lib/cjs/render/webgl/SolarShadowMap.js.map +1 -1
  223. package/lib/cjs/render/webgl/StyleUniforms.js.map +1 -1
  224. package/lib/cjs/render/webgl/SurfaceGeometry.js.map +1 -1
  225. package/lib/cjs/render/webgl/Sync.js.map +1 -1
  226. package/lib/cjs/render/webgl/System.js.map +1 -1
  227. package/lib/cjs/render/webgl/Target.js.map +1 -1
  228. package/lib/cjs/render/webgl/TargetGraphics.js.map +1 -1
  229. package/lib/cjs/render/webgl/TargetUniforms.js.map +1 -1
  230. package/lib/cjs/render/webgl/Technique.js.map +1 -1
  231. package/lib/cjs/render/webgl/TechniqueFlags.js.map +1 -1
  232. package/lib/cjs/render/webgl/TechniqueId.js.map +1 -1
  233. package/lib/cjs/render/webgl/Texture.js.map +1 -1
  234. package/lib/cjs/render/webgl/TextureDrape.js.map +1 -1
  235. package/lib/cjs/render/webgl/ThematicSensors.js.map +1 -1
  236. package/lib/cjs/render/webgl/ThematicUniforms.js.map +1 -1
  237. package/lib/cjs/render/webgl/UniformHandle.js.map +1 -1
  238. package/lib/cjs/render/webgl/VertexLUT.js.map +1 -1
  239. package/lib/cjs/render/webgl/ViewRectUniforms.js.map +1 -1
  240. package/lib/cjs/render/webgl/VisibleTileFeatures.js.map +1 -1
  241. package/lib/cjs/render/webgl/glsl/AmbientOcclusion.js +154 -154
  242. package/lib/cjs/render/webgl/glsl/AmbientOcclusion.js.map +1 -1
  243. package/lib/cjs/render/webgl/glsl/Animation.js +83 -83
  244. package/lib/cjs/render/webgl/glsl/Animation.js.map +1 -1
  245. package/lib/cjs/render/webgl/glsl/Atmosphere.js +266 -266
  246. package/lib/cjs/render/webgl/glsl/Atmosphere.js.map +1 -1
  247. package/lib/cjs/render/webgl/glsl/Blur.js +37 -37
  248. package/lib/cjs/render/webgl/glsl/Blur.js.map +1 -1
  249. package/lib/cjs/render/webgl/glsl/ClearPickAndColor.js +4 -4
  250. package/lib/cjs/render/webgl/glsl/ClearPickAndColor.js.map +1 -1
  251. package/lib/cjs/render/webgl/glsl/ClearTranslucent.js +3 -3
  252. package/lib/cjs/render/webgl/glsl/ClearTranslucent.js.map +1 -1
  253. package/lib/cjs/render/webgl/glsl/Clipping.js +60 -60
  254. package/lib/cjs/render/webgl/glsl/Clipping.js.map +1 -1
  255. package/lib/cjs/render/webgl/glsl/Color.js +12 -12
  256. package/lib/cjs/render/webgl/glsl/Color.js.map +1 -1
  257. package/lib/cjs/render/webgl/glsl/Combine3Textures.js +7 -7
  258. package/lib/cjs/render/webgl/glsl/Combine3Textures.js.map +1 -1
  259. package/lib/cjs/render/webgl/glsl/CombineTextures.js +5 -5
  260. package/lib/cjs/render/webgl/glsl/CombineTextures.js.map +1 -1
  261. package/lib/cjs/render/webgl/glsl/Common.js +16 -16
  262. package/lib/cjs/render/webgl/glsl/Common.js.map +1 -1
  263. package/lib/cjs/render/webgl/glsl/Composite.js +71 -71
  264. package/lib/cjs/render/webgl/glsl/Composite.js.map +1 -1
  265. package/lib/cjs/render/webgl/glsl/CopyColor.js +6 -6
  266. package/lib/cjs/render/webgl/glsl/CopyColor.js.map +1 -1
  267. package/lib/cjs/render/webgl/glsl/CopyPickBuffers.js +3 -3
  268. package/lib/cjs/render/webgl/glsl/CopyPickBuffers.js.map +1 -1
  269. package/lib/cjs/render/webgl/glsl/CopyStencil.js +4 -4
  270. package/lib/cjs/render/webgl/glsl/CopyStencil.js.map +1 -1
  271. package/lib/cjs/render/webgl/glsl/Decode.js +65 -65
  272. package/lib/cjs/render/webgl/glsl/Decode.js.map +1 -1
  273. package/lib/cjs/render/webgl/glsl/EDL.js +103 -103
  274. package/lib/cjs/render/webgl/glsl/EDL.js.map +1 -1
  275. package/lib/cjs/render/webgl/glsl/EVSMFromDepth.js +25 -25
  276. package/lib/cjs/render/webgl/glsl/EVSMFromDepth.js.map +1 -1
  277. package/lib/cjs/render/webgl/glsl/Edge.js +146 -146
  278. package/lib/cjs/render/webgl/glsl/Edge.js.map +1 -1
  279. package/lib/cjs/render/webgl/glsl/FeatureSymbology.js +232 -232
  280. package/lib/cjs/render/webgl/glsl/FeatureSymbology.js.map +1 -1
  281. package/lib/cjs/render/webgl/glsl/Fragment.js +41 -41
  282. package/lib/cjs/render/webgl/glsl/Fragment.js.map +1 -1
  283. package/lib/cjs/render/webgl/glsl/Instancing.js +21 -21
  284. package/lib/cjs/render/webgl/glsl/Instancing.js.map +1 -1
  285. package/lib/cjs/render/webgl/glsl/Lighting.js +92 -92
  286. package/lib/cjs/render/webgl/glsl/Lighting.js.map +1 -1
  287. package/lib/cjs/render/webgl/glsl/LogarithmicDepthBuffer.js.map +1 -1
  288. package/lib/cjs/render/webgl/glsl/LookupTable.js +19 -19
  289. package/lib/cjs/render/webgl/glsl/LookupTable.js.map +1 -1
  290. package/lib/cjs/render/webgl/glsl/Monochrome.js +13 -13
  291. package/lib/cjs/render/webgl/glsl/Monochrome.js.map +1 -1
  292. package/lib/cjs/render/webgl/glsl/PlanarClassification.js +188 -188
  293. package/lib/cjs/render/webgl/glsl/PlanarClassification.js.map +1 -1
  294. package/lib/cjs/render/webgl/glsl/PlanarGrid.js +22 -22
  295. package/lib/cjs/render/webgl/glsl/PlanarGrid.js.map +1 -1
  296. package/lib/cjs/render/webgl/glsl/PointCloud.js +28 -28
  297. package/lib/cjs/render/webgl/glsl/PointCloud.js.map +1 -1
  298. package/lib/cjs/render/webgl/glsl/PointString.js +9 -9
  299. package/lib/cjs/render/webgl/glsl/PointString.js.map +1 -1
  300. package/lib/cjs/render/webgl/glsl/Polyline.js +213 -213
  301. package/lib/cjs/render/webgl/glsl/Polyline.js.map +1 -1
  302. package/lib/cjs/render/webgl/glsl/RealityMesh.js +83 -83
  303. package/lib/cjs/render/webgl/glsl/RealityMesh.js.map +1 -1
  304. package/lib/cjs/render/webgl/glsl/RenderPass.js.map +1 -1
  305. package/lib/cjs/render/webgl/glsl/ScreenSpaceEffect.js +9 -9
  306. package/lib/cjs/render/webgl/glsl/ScreenSpaceEffect.js.map +1 -1
  307. package/lib/cjs/render/webgl/glsl/SkyBox.js.map +1 -1
  308. package/lib/cjs/render/webgl/glsl/SkySphere.js +49 -49
  309. package/lib/cjs/render/webgl/glsl/SkySphere.js.map +1 -1
  310. package/lib/cjs/render/webgl/glsl/SolarShadowMapping.js +51 -51
  311. package/lib/cjs/render/webgl/glsl/SolarShadowMapping.js.map +1 -1
  312. package/lib/cjs/render/webgl/glsl/Surface.js +239 -239
  313. package/lib/cjs/render/webgl/glsl/Surface.js.map +1 -1
  314. package/lib/cjs/render/webgl/glsl/Thematic.js +134 -134
  315. package/lib/cjs/render/webgl/glsl/Thematic.js.map +1 -1
  316. package/lib/cjs/render/webgl/glsl/Translucency.js +19 -19
  317. package/lib/cjs/render/webgl/glsl/Translucency.js.map +1 -1
  318. package/lib/cjs/render/webgl/glsl/Vertex.js +73 -73
  319. package/lib/cjs/render/webgl/glsl/Vertex.js.map +1 -1
  320. package/lib/cjs/render/webgl/glsl/Viewport.js +38 -38
  321. package/lib/cjs/render/webgl/glsl/Viewport.js.map +1 -1
  322. package/lib/cjs/render/webgl/glsl/ViewportQuad.js.map +1 -1
  323. package/lib/cjs/render/webgl/glsl/Wiremesh.js +10 -10
  324. package/lib/cjs/render/webgl/glsl/Wiremesh.js.map +1 -1
  325. package/lib/cjs/render-primitives.js.map +1 -1
  326. package/lib/cjs/request/Request.js.map +1 -1
  327. package/lib/cjs/tile/B3dmReader.js.map +1 -1
  328. package/lib/cjs/tile/BatchedTileIdMap.js.map +1 -1
  329. package/lib/cjs/tile/CesiumAssetProvider.js.map +1 -1
  330. package/lib/cjs/tile/ClassifierTileTree.js.map +1 -1
  331. package/lib/cjs/tile/ContextShareProvider.js.map +1 -1
  332. package/lib/cjs/tile/DisclosedTileTreeSet.js.map +1 -1
  333. package/lib/cjs/tile/DynamicIModelTile.js.map +1 -1
  334. package/lib/cjs/tile/GltfReader.js.map +1 -1
  335. package/lib/cjs/tile/GraphicsCollector.js.map +1 -1
  336. package/lib/cjs/tile/I3dmReader.js.map +1 -1
  337. package/lib/cjs/tile/IModelTile.js.map +1 -1
  338. package/lib/cjs/tile/IModelTileRequestChannels.js.map +1 -1
  339. package/lib/cjs/tile/IModelTileTree.js.map +1 -1
  340. package/lib/cjs/tile/ImdlDecoder.js.map +1 -1
  341. package/lib/cjs/tile/ImdlGraphicsCreator.js.map +1 -1
  342. package/lib/cjs/tile/ImdlParser.js.map +1 -1
  343. package/lib/cjs/tile/ImdlReader.js.map +1 -1
  344. package/lib/cjs/tile/LRUTileList.js.map +1 -1
  345. package/lib/cjs/tile/OPCFormatInterpreter.js.map +1 -1
  346. package/lib/cjs/tile/PntsReader.js.map +1 -1
  347. package/lib/cjs/tile/RealityTile.js.map +1 -1
  348. package/lib/cjs/tile/RealityTileDrawArgs.js.map +1 -1
  349. package/lib/cjs/tile/RealityTileLoader.js.map +1 -1
  350. package/lib/cjs/tile/RealityTileTree.js +1 -1
  351. package/lib/cjs/tile/RealityTileTree.js.map +1 -1
  352. package/lib/cjs/tile/ThreeDTileFormatInterpreter.js.map +1 -1
  353. package/lib/cjs/tile/Tile.js.map +1 -1
  354. package/lib/cjs/tile/TileAdmin.js.map +1 -1
  355. package/lib/cjs/tile/TileContent.js.map +1 -1
  356. package/lib/cjs/tile/TileDrawArgs.js.map +1 -1
  357. package/lib/cjs/tile/TileGeometryCollector.js.map +1 -1
  358. package/lib/cjs/tile/TileParams.js.map +1 -1
  359. package/lib/cjs/tile/TileRequest.js.map +1 -1
  360. package/lib/cjs/tile/TileRequestChannel.js.map +1 -1
  361. package/lib/cjs/tile/TileRequestChannels.js.map +1 -1
  362. package/lib/cjs/tile/TileStorage.js.map +1 -1
  363. package/lib/cjs/tile/TileTree.js.map +1 -1
  364. package/lib/cjs/tile/TileTreeOwner.js.map +1 -1
  365. package/lib/cjs/tile/TileTreeParams.js.map +1 -1
  366. package/lib/cjs/tile/TileTreeReference.js.map +1 -1
  367. package/lib/cjs/tile/TileTreeSupplier.js.map +1 -1
  368. package/lib/cjs/tile/TileUsageMarker.js.map +1 -1
  369. package/lib/cjs/tile/TileUser.js.map +1 -1
  370. package/lib/cjs/tile/TileUserSet.js.map +1 -1
  371. package/lib/cjs/tile/TiledGraphicsProvider.js.map +1 -1
  372. package/lib/cjs/tile/ViewFlagOverrides.js.map +1 -1
  373. package/lib/cjs/tile/internal.js.map +1 -1
  374. package/lib/cjs/tile/map/ArcGISTileMap.js.map +1 -1
  375. package/lib/cjs/tile/map/ArcGisUtilities.js.map +1 -1
  376. package/lib/cjs/tile/map/BingElevation.js.map +1 -1
  377. package/lib/cjs/tile/map/CesiumTerrainProvider.js.map +1 -1
  378. package/lib/cjs/tile/map/EllipsoidTerrainProvider.js.map +1 -1
  379. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  380. package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  381. package/lib/cjs/tile/map/ImageryProviders/AzureMapsLayerImageryProvider.js.map +1 -1
  382. package/lib/cjs/tile/map/ImageryProviders/BingImageryProvider.js.map +1 -1
  383. package/lib/cjs/tile/map/ImageryProviders/MapBoxLayerImageryProvider.js.map +1 -1
  384. package/lib/cjs/tile/map/ImageryProviders/TileUrlImageryProvider.js.map +1 -1
  385. package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
  386. package/lib/cjs/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
  387. package/lib/cjs/tile/map/MapCartoRectangle.js.map +1 -1
  388. package/lib/cjs/tile/map/MapFeatureInfo.js.map +1 -1
  389. package/lib/cjs/tile/map/MapLayerAuthentication.js.map +1 -1
  390. package/lib/cjs/tile/map/MapLayerFormatRegistry.js.map +1 -1
  391. package/lib/cjs/tile/map/MapLayerImageryProvider.js +2 -2
  392. package/lib/cjs/tile/map/MapLayerImageryProvider.js.map +1 -1
  393. package/lib/cjs/tile/map/MapLayerSources.js.map +1 -1
  394. package/lib/cjs/tile/map/MapLayerTileTreeReference.js.map +1 -1
  395. package/lib/cjs/tile/map/MapTile.js.map +1 -1
  396. package/lib/cjs/tile/map/MapTileAvailability.js.map +1 -1
  397. package/lib/cjs/tile/map/MapTileLoader.js.map +1 -1
  398. package/lib/cjs/tile/map/MapTiledGraphicsProvider.js.map +1 -1
  399. package/lib/cjs/tile/map/MapTilingScheme.js.map +1 -1
  400. package/lib/cjs/tile/map/QuadId.js.map +1 -1
  401. package/lib/cjs/tile/map/TerrainMeshProvider.js.map +1 -1
  402. package/lib/cjs/tile/map/TerrainProvider.js.map +1 -1
  403. package/lib/cjs/tile/map/WmsCapabilities.js.map +1 -1
  404. package/lib/cjs/tile/map/WmsUtilities.js.map +1 -1
  405. package/lib/cjs/tile/map/WmtsCapabilities.js.map +1 -1
  406. package/lib/cjs/tools/AccuDrawTool.js.map +1 -1
  407. package/lib/cjs/tools/ClipViewTool.js.map +1 -1
  408. package/lib/cjs/tools/EditManipulator.js.map +1 -1
  409. package/lib/cjs/tools/ElementSetTool.js.map +1 -1
  410. package/lib/cjs/tools/EventController.js.map +1 -1
  411. package/lib/cjs/tools/IdleTool.js.map +1 -1
  412. package/lib/cjs/tools/MeasureTool.js.map +1 -1
  413. package/lib/cjs/tools/PrimitiveTool.js.map +1 -1
  414. package/lib/cjs/tools/SelectTool.js.map +1 -1
  415. package/lib/cjs/tools/ToolAdmin.js.map +1 -1
  416. package/lib/cjs/tools/ToolAssistance.js.map +1 -1
  417. package/lib/cjs/tools/ToolSettings.js.map +1 -1
  418. package/lib/cjs/tools/ViewTool.js.map +1 -1
  419. package/lib/cjs/webgl.js.map +1 -1
  420. package/lib/cjs/workers/ImdlParser/Worker.js.map +1 -1
  421. package/lib/cjs/workers/ImdlParser/webpack.config.js +40 -40
  422. package/lib/cjs/workers/RegisterWorker.js.map +1 -1
  423. package/lib/esm/AccuDraw.js.map +1 -1
  424. package/lib/esm/AccuSnap.js.map +1 -1
  425. package/lib/esm/ApproximateTerrainHeights.js.map +1 -1
  426. package/lib/esm/ApproximateTerrainHeightsProps.js.map +1 -1
  427. package/lib/esm/AuxCoordSys.js.map +1 -1
  428. package/lib/esm/BackgroundMapGeometry.js.map +1 -1
  429. package/lib/esm/BingLocation.js.map +1 -1
  430. package/lib/esm/BriefcaseConnection.js.map +1 -1
  431. package/lib/esm/BriefcaseTxns.js.map +1 -1
  432. package/lib/esm/CategorySelectorState.js.map +1 -1
  433. package/lib/esm/ChangeFlags.js.map +1 -1
  434. package/lib/esm/CheckpointConnection.js.map +1 -1
  435. package/lib/esm/CoordSystem.js.map +1 -1
  436. package/lib/esm/DecorationsCache.js.map +1 -1
  437. package/lib/esm/DevTools.js.map +1 -1
  438. package/lib/esm/DisplayStyleState.js.map +1 -1
  439. package/lib/esm/DrawingViewState.js +5 -5
  440. package/lib/esm/DrawingViewState.js.map +1 -1
  441. package/lib/esm/ElementLocateManager.js.map +1 -1
  442. package/lib/esm/EmphasizeElements.js.map +1 -1
  443. package/lib/esm/EntityState.js.map +1 -1
  444. package/lib/esm/EnvironmentDecorations.js.map +1 -1
  445. package/lib/esm/FeatureOverrideProvider.js.map +1 -1
  446. package/lib/esm/FlashSettings.js.map +1 -1
  447. package/lib/esm/FrontendHubAccess.js.map +1 -1
  448. package/lib/esm/Frustum2d.js.map +1 -1
  449. package/lib/esm/FrustumAnimator.js.map +1 -1
  450. package/lib/esm/FuzzySearch.js.map +1 -1
  451. package/lib/esm/GeoServices.js.map +1 -1
  452. package/lib/esm/GlobeAnimator.js.map +1 -1
  453. package/lib/esm/GraphicalEditingScope.js.map +1 -1
  454. package/lib/esm/HitDetail.js.map +1 -1
  455. package/lib/esm/IModelApp.js.map +1 -1
  456. package/lib/esm/IModelConnection.js +23 -23
  457. package/lib/esm/IModelConnection.js.map +1 -1
  458. package/lib/esm/IModelRoutingContext.js.map +1 -1
  459. package/lib/esm/IModeljs-css.js +133 -133
  460. package/lib/esm/IModeljs-css.js.map +1 -1
  461. package/lib/esm/IpcApp.js.map +1 -1
  462. package/lib/esm/LinePlaneIntersect.js.map +1 -1
  463. package/lib/esm/LocalhostIpcApp.js.map +1 -1
  464. package/lib/esm/MarginPercent.js.map +1 -1
  465. package/lib/esm/Marker.js.map +1 -1
  466. package/lib/esm/ModelSelectorState.js.map +1 -1
  467. package/lib/esm/NativeApp.js.map +1 -1
  468. package/lib/esm/NativeAppLogger.js.map +1 -1
  469. package/lib/esm/NoRenderApp.js.map +1 -1
  470. package/lib/esm/NotificationManager.js.map +1 -1
  471. package/lib/esm/PerModelCategoryVisibility.js.map +1 -1
  472. package/lib/esm/PlanarClipMaskState.js.map +1 -1
  473. package/lib/esm/RealityDataSource.js.map +1 -1
  474. package/lib/esm/RealityDataSourceCesiumIonAssetImpl.js.map +1 -1
  475. package/lib/esm/RealityDataSourceContextShareImpl.js.map +1 -1
  476. package/lib/esm/RealityDataSourceTilesetUrlImpl.js.map +1 -1
  477. package/lib/esm/SelectionSet.js.map +1 -1
  478. package/lib/esm/SheetViewState.js.map +1 -1
  479. package/lib/esm/SpatialViewState.js.map +1 -1
  480. package/lib/esm/Sprites.js.map +1 -1
  481. package/lib/esm/StandardView.js.map +1 -1
  482. package/lib/esm/SubCategoriesCache.js.map +1 -1
  483. package/lib/esm/TentativePoint.js.map +1 -1
  484. package/lib/esm/Tiles.js.map +1 -1
  485. package/lib/esm/UserPreferences.js.map +1 -1
  486. package/lib/esm/ViewAnimation.js.map +1 -1
  487. package/lib/esm/ViewContext.js.map +1 -1
  488. package/lib/esm/ViewCreator2d.js.map +1 -1
  489. package/lib/esm/ViewCreator3d.js.map +1 -1
  490. package/lib/esm/ViewGlobalLocation.js.map +1 -1
  491. package/lib/esm/ViewManager.js.map +1 -1
  492. package/lib/esm/ViewPose.js.map +1 -1
  493. package/lib/esm/ViewState.js.map +1 -1
  494. package/lib/esm/ViewStatus.js.map +1 -1
  495. package/lib/esm/ViewingSpace.js.map +1 -1
  496. package/lib/esm/Viewport.js.map +1 -1
  497. package/lib/esm/ViewportSync.js.map +1 -1
  498. package/lib/esm/common/FrontendLoggerCategory.js.map +1 -1
  499. package/lib/esm/common/ImageUtil.js.map +1 -1
  500. package/lib/esm/common/ViewRect.js.map +1 -1
  501. package/lib/esm/common/WorkerProxy.js.map +1 -1
  502. package/lib/esm/common/gltf/GltfModel.js.map +1 -1
  503. package/lib/esm/common/gltf/GltfParser.js.map +1 -1
  504. package/lib/esm/common/gltf/GltfSchema.js.map +1 -1
  505. package/lib/esm/common/imdl/CompactEdges.js.map +1 -1
  506. package/lib/esm/common/imdl/ImdlModel.js.map +1 -1
  507. package/lib/esm/common/imdl/ImdlSchema.js.map +1 -1
  508. package/lib/esm/common/imdl/ParseImdlDocument.js.map +1 -1
  509. package/lib/esm/common/render/AnimationNodeId.js.map +1 -1
  510. package/lib/esm/common/render/MaterialParams.js.map +1 -1
  511. package/lib/esm/common/render/TextureParams.js.map +1 -1
  512. package/lib/esm/common/render/primitives/AuxChannelTable.js.map +1 -1
  513. package/lib/esm/common/render/primitives/DisplayParams.js.map +1 -1
  514. package/lib/esm/common/render/primitives/EdgeParams.js.map +1 -1
  515. package/lib/esm/common/render/primitives/MeshParams.js.map +1 -1
  516. package/lib/esm/common/render/primitives/MeshPrimitive.js.map +1 -1
  517. package/lib/esm/common/render/primitives/PointStringParams.js.map +1 -1
  518. package/lib/esm/common/render/primitives/PolylineParams.js.map +1 -1
  519. package/lib/esm/common/render/primitives/SurfaceParams.js.map +1 -1
  520. package/lib/esm/common/render/primitives/VertexIndices.js.map +1 -1
  521. package/lib/esm/common/render/primitives/VertexTable.js.map +1 -1
  522. package/lib/esm/common/render/primitives/VertexTableSplitter.js.map +1 -1
  523. package/lib/esm/core-frontend.js.map +1 -1
  524. package/lib/esm/extension/Extension.js.map +1 -1
  525. package/lib/esm/extension/ExtensionAdmin.js.map +1 -1
  526. package/lib/esm/extension/ExtensionHost.js.map +1 -1
  527. package/lib/esm/extension/ExtensionRuntime.js.map +1 -1
  528. package/lib/esm/extension/providers/ExtensionLoadScript.js.map +1 -1
  529. package/lib/esm/extension/providers/LocalExtensionProvider.js.map +1 -1
  530. package/lib/esm/extension/providers/RemoteExtensionProvider.js.map +1 -1
  531. package/lib/esm/properties/AngleDescription.js.map +1 -1
  532. package/lib/esm/properties/FormattedQuantityDescription.js.map +1 -1
  533. package/lib/esm/properties/LengthDescription.js.map +1 -1
  534. package/lib/esm/public/scripts/checkbrowser.js +24 -24
  535. package/lib/esm/quantity-formatting/BaseUnitFormattingSettingsProvider.js.map +1 -1
  536. package/lib/esm/quantity-formatting/BasicUnitsProvider.js.map +1 -1
  537. package/lib/esm/quantity-formatting/LocalUnitFormatProvider.js.map +1 -1
  538. package/lib/esm/quantity-formatting/QuantityFormatter.js.map +1 -1
  539. package/lib/esm/quantity-formatting/QuantityTypesEditorSpecs.js.map +1 -1
  540. package/lib/esm/quantity-formatting/UnitsData.js.map +1 -1
  541. package/lib/esm/render/CanvasDecoration.js.map +1 -1
  542. package/lib/esm/render/CreateRenderMaterialArgs.js.map +1 -1
  543. package/lib/esm/render/CreateTextureArgs.js.map +1 -1
  544. package/lib/esm/render/Decorations.js.map +1 -1
  545. package/lib/esm/render/FeatureSymbology.js.map +1 -1
  546. package/lib/esm/render/FrameStats.js.map +1 -1
  547. package/lib/esm/render/GraphicBranch.js.map +1 -1
  548. package/lib/esm/render/GraphicBuilder.js.map +1 -1
  549. package/lib/esm/render/GraphicPrimitive.js.map +1 -1
  550. package/lib/esm/render/InstancedGraphicParams.js.map +1 -1
  551. package/lib/esm/render/MockRender.js.map +1 -1
  552. package/lib/esm/render/ParticleCollectionBuilder.js.map +1 -1
  553. package/lib/esm/render/Pixel.js.map +1 -1
  554. package/lib/esm/render/RealityMeshGraphicParams.js.map +1 -1
  555. package/lib/esm/render/RealityMeshParams.js.map +1 -1
  556. package/lib/esm/render/RenderClipVolume.js.map +1 -1
  557. package/lib/esm/render/RenderGraphic.js.map +1 -1
  558. package/lib/esm/render/RenderMemory.js.map +1 -1
  559. package/lib/esm/render/RenderPlan.js.map +1 -1
  560. package/lib/esm/render/RenderPlanarClassifier.js.map +1 -1
  561. package/lib/esm/render/RenderSystem.js.map +1 -1
  562. package/lib/esm/render/RenderTarget.js.map +1 -1
  563. package/lib/esm/render/Scene.js.map +1 -1
  564. package/lib/esm/render/ScreenSpaceEffectBuilder.js.map +1 -1
  565. package/lib/esm/render/UpsampleRealityMeshParams.js.map +1 -1
  566. package/lib/esm/render/VisibleFeature.js.map +1 -1
  567. package/lib/esm/render/primitives/ColorMap.js.map +1 -1
  568. package/lib/esm/render/primitives/EdgeParams.js.map +1 -1
  569. package/lib/esm/render/primitives/PointCloudPrimitive.js.map +1 -1
  570. package/lib/esm/render/primitives/PointStringParams.js.map +1 -1
  571. package/lib/esm/render/primitives/Polyface.js.map +1 -1
  572. package/lib/esm/render/primitives/PolylineParams.js.map +1 -1
  573. package/lib/esm/render/primitives/Primitives.js.map +1 -1
  574. package/lib/esm/render/primitives/Strokes.js.map +1 -1
  575. package/lib/esm/render/primitives/VertexKey.js.map +1 -1
  576. package/lib/esm/render/primitives/VertexTableBuilder.js.map +1 -1
  577. package/lib/esm/render/primitives/geometry/GeometryAccumulator.js.map +1 -1
  578. package/lib/esm/render/primitives/geometry/GeometryList.js.map +1 -1
  579. package/lib/esm/render/primitives/geometry/GeometryListBuilder.js.map +1 -1
  580. package/lib/esm/render/primitives/geometry/GeometryPrimitives.js.map +1 -1
  581. package/lib/esm/render/primitives/mesh/MeshBuilder.js.map +1 -1
  582. package/lib/esm/render/primitives/mesh/MeshBuilderMap.js.map +1 -1
  583. package/lib/esm/render/primitives/mesh/MeshPrimitives.js.map +1 -1
  584. package/lib/esm/render/webgl/AtmosphereUniforms.js.map +1 -1
  585. package/lib/esm/render/webgl/AttributeBuffers.js.map +1 -1
  586. package/lib/esm/render/webgl/AttributeMap.js.map +1 -1
  587. package/lib/esm/render/webgl/BackgroundMapDrape.js.map +1 -1
  588. package/lib/esm/render/webgl/BatchState.js.map +1 -1
  589. package/lib/esm/render/webgl/BatchUniforms.js.map +1 -1
  590. package/lib/esm/render/webgl/BranchStack.js.map +1 -1
  591. package/lib/esm/render/webgl/BranchState.js.map +1 -1
  592. package/lib/esm/render/webgl/BranchUniforms.js.map +1 -1
  593. package/lib/esm/render/webgl/CachedGeometry.js.map +1 -1
  594. package/lib/esm/render/webgl/ClipStack.js.map +1 -1
  595. package/lib/esm/render/webgl/ClipVolume.js.map +1 -1
  596. package/lib/esm/render/webgl/ClippingProgram.js.map +1 -1
  597. package/lib/esm/render/webgl/ColorInfo.js.map +1 -1
  598. package/lib/esm/render/webgl/Diagnostics.js.map +1 -1
  599. package/lib/esm/render/webgl/Disposable.js.map +1 -1
  600. package/lib/esm/render/webgl/DrawCommand.js.map +1 -1
  601. package/lib/esm/render/webgl/EDL.js.map +1 -1
  602. package/lib/esm/render/webgl/EdgeGeometry.js.map +1 -1
  603. package/lib/esm/render/webgl/EdgeSettings.js.map +1 -1
  604. package/lib/esm/render/webgl/FeatureOverrides.js.map +1 -1
  605. package/lib/esm/render/webgl/FloatRGBA.js.map +1 -1
  606. package/lib/esm/render/webgl/FrameBuffer.js.map +1 -1
  607. package/lib/esm/render/webgl/FrustumUniforms.js.map +1 -1
  608. package/lib/esm/render/webgl/GL.js.map +1 -1
  609. package/lib/esm/render/webgl/GLTimer.js.map +1 -1
  610. package/lib/esm/render/webgl/Graphic.js.map +1 -1
  611. package/lib/esm/render/webgl/HiliteUniforms.js.map +1 -1
  612. package/lib/esm/render/webgl/IModelFrameLifecycle.js.map +1 -1
  613. package/lib/esm/render/webgl/IndexedEdgeGeometry.js.map +1 -1
  614. package/lib/esm/render/webgl/InstancedGeometry.js.map +1 -1
  615. package/lib/esm/render/webgl/Layer.js.map +1 -1
  616. package/lib/esm/render/webgl/LayerCommands.js.map +1 -1
  617. package/lib/esm/render/webgl/LightingUniforms.js.map +1 -1
  618. package/lib/esm/render/webgl/LineCode.js.map +1 -1
  619. package/lib/esm/render/webgl/Material.js.map +1 -1
  620. package/lib/esm/render/webgl/Matrix.js.map +1 -1
  621. package/lib/esm/render/webgl/Mesh.js.map +1 -1
  622. package/lib/esm/render/webgl/MeshData.js.map +1 -1
  623. package/lib/esm/render/webgl/MeshGeometry.js.map +1 -1
  624. package/lib/esm/render/webgl/PerformanceMetrics.js.map +1 -1
  625. package/lib/esm/render/webgl/PlanarClassifier.js.map +1 -1
  626. package/lib/esm/render/webgl/PlanarGrid.js.map +1 -1
  627. package/lib/esm/render/webgl/PlanarTextureProjection.js.map +1 -1
  628. package/lib/esm/render/webgl/PointCloud.js.map +1 -1
  629. package/lib/esm/render/webgl/PointString.js.map +1 -1
  630. package/lib/esm/render/webgl/Polyline.js.map +1 -1
  631. package/lib/esm/render/webgl/Primitive.js.map +1 -1
  632. package/lib/esm/render/webgl/RealityMesh.js.map +1 -1
  633. package/lib/esm/render/webgl/RealityModelUniforms.js.map +1 -1
  634. package/lib/esm/render/webgl/RenderBuffer.js.map +1 -1
  635. package/lib/esm/render/webgl/RenderCommands.js.map +1 -1
  636. package/lib/esm/render/webgl/RenderFlags.js.map +1 -1
  637. package/lib/esm/render/webgl/RenderState.js.map +1 -1
  638. package/lib/esm/render/webgl/SceneCompositor.js.map +1 -1
  639. package/lib/esm/render/webgl/ScratchDrawParams.js.map +1 -1
  640. package/lib/esm/render/webgl/ScreenSpaceEffect.js.map +1 -1
  641. package/lib/esm/render/webgl/ShaderBuilder.js.map +1 -1
  642. package/lib/esm/render/webgl/ShaderProgram.js.map +1 -1
  643. package/lib/esm/render/webgl/ShadowUniforms.js.map +1 -1
  644. package/lib/esm/render/webgl/SolarShadowMap.js.map +1 -1
  645. package/lib/esm/render/webgl/StyleUniforms.js.map +1 -1
  646. package/lib/esm/render/webgl/SurfaceGeometry.js.map +1 -1
  647. package/lib/esm/render/webgl/Sync.js.map +1 -1
  648. package/lib/esm/render/webgl/System.js.map +1 -1
  649. package/lib/esm/render/webgl/Target.js.map +1 -1
  650. package/lib/esm/render/webgl/TargetGraphics.js.map +1 -1
  651. package/lib/esm/render/webgl/TargetUniforms.js.map +1 -1
  652. package/lib/esm/render/webgl/Technique.js.map +1 -1
  653. package/lib/esm/render/webgl/TechniqueFlags.js.map +1 -1
  654. package/lib/esm/render/webgl/TechniqueId.js.map +1 -1
  655. package/lib/esm/render/webgl/Texture.js.map +1 -1
  656. package/lib/esm/render/webgl/TextureDrape.js.map +1 -1
  657. package/lib/esm/render/webgl/ThematicSensors.js.map +1 -1
  658. package/lib/esm/render/webgl/ThematicUniforms.js.map +1 -1
  659. package/lib/esm/render/webgl/UniformHandle.js.map +1 -1
  660. package/lib/esm/render/webgl/VertexLUT.js.map +1 -1
  661. package/lib/esm/render/webgl/ViewRectUniforms.js.map +1 -1
  662. package/lib/esm/render/webgl/VisibleTileFeatures.js.map +1 -1
  663. package/lib/esm/render/webgl/glsl/AmbientOcclusion.js +154 -154
  664. package/lib/esm/render/webgl/glsl/AmbientOcclusion.js.map +1 -1
  665. package/lib/esm/render/webgl/glsl/Animation.js +83 -83
  666. package/lib/esm/render/webgl/glsl/Animation.js.map +1 -1
  667. package/lib/esm/render/webgl/glsl/Atmosphere.js +266 -266
  668. package/lib/esm/render/webgl/glsl/Atmosphere.js.map +1 -1
  669. package/lib/esm/render/webgl/glsl/Blur.js +37 -37
  670. package/lib/esm/render/webgl/glsl/Blur.js.map +1 -1
  671. package/lib/esm/render/webgl/glsl/ClearPickAndColor.js +4 -4
  672. package/lib/esm/render/webgl/glsl/ClearPickAndColor.js.map +1 -1
  673. package/lib/esm/render/webgl/glsl/ClearTranslucent.js +3 -3
  674. package/lib/esm/render/webgl/glsl/ClearTranslucent.js.map +1 -1
  675. package/lib/esm/render/webgl/glsl/Clipping.js +60 -60
  676. package/lib/esm/render/webgl/glsl/Clipping.js.map +1 -1
  677. package/lib/esm/render/webgl/glsl/Color.js +12 -12
  678. package/lib/esm/render/webgl/glsl/Color.js.map +1 -1
  679. package/lib/esm/render/webgl/glsl/Combine3Textures.js +7 -7
  680. package/lib/esm/render/webgl/glsl/Combine3Textures.js.map +1 -1
  681. package/lib/esm/render/webgl/glsl/CombineTextures.js +5 -5
  682. package/lib/esm/render/webgl/glsl/CombineTextures.js.map +1 -1
  683. package/lib/esm/render/webgl/glsl/Common.js +16 -16
  684. package/lib/esm/render/webgl/glsl/Common.js.map +1 -1
  685. package/lib/esm/render/webgl/glsl/Composite.js +71 -71
  686. package/lib/esm/render/webgl/glsl/Composite.js.map +1 -1
  687. package/lib/esm/render/webgl/glsl/CopyColor.js +6 -6
  688. package/lib/esm/render/webgl/glsl/CopyColor.js.map +1 -1
  689. package/lib/esm/render/webgl/glsl/CopyPickBuffers.js +3 -3
  690. package/lib/esm/render/webgl/glsl/CopyPickBuffers.js.map +1 -1
  691. package/lib/esm/render/webgl/glsl/CopyStencil.js +4 -4
  692. package/lib/esm/render/webgl/glsl/CopyStencil.js.map +1 -1
  693. package/lib/esm/render/webgl/glsl/Decode.js +65 -65
  694. package/lib/esm/render/webgl/glsl/Decode.js.map +1 -1
  695. package/lib/esm/render/webgl/glsl/EDL.js +103 -103
  696. package/lib/esm/render/webgl/glsl/EDL.js.map +1 -1
  697. package/lib/esm/render/webgl/glsl/EVSMFromDepth.js +25 -25
  698. package/lib/esm/render/webgl/glsl/EVSMFromDepth.js.map +1 -1
  699. package/lib/esm/render/webgl/glsl/Edge.js +146 -146
  700. package/lib/esm/render/webgl/glsl/Edge.js.map +1 -1
  701. package/lib/esm/render/webgl/glsl/FeatureSymbology.js +232 -232
  702. package/lib/esm/render/webgl/glsl/FeatureSymbology.js.map +1 -1
  703. package/lib/esm/render/webgl/glsl/Fragment.js +41 -41
  704. package/lib/esm/render/webgl/glsl/Fragment.js.map +1 -1
  705. package/lib/esm/render/webgl/glsl/Instancing.js +21 -21
  706. package/lib/esm/render/webgl/glsl/Instancing.js.map +1 -1
  707. package/lib/esm/render/webgl/glsl/Lighting.js +92 -92
  708. package/lib/esm/render/webgl/glsl/Lighting.js.map +1 -1
  709. package/lib/esm/render/webgl/glsl/LogarithmicDepthBuffer.js.map +1 -1
  710. package/lib/esm/render/webgl/glsl/LookupTable.js +19 -19
  711. package/lib/esm/render/webgl/glsl/LookupTable.js.map +1 -1
  712. package/lib/esm/render/webgl/glsl/Monochrome.js +13 -13
  713. package/lib/esm/render/webgl/glsl/Monochrome.js.map +1 -1
  714. package/lib/esm/render/webgl/glsl/PlanarClassification.js +188 -188
  715. package/lib/esm/render/webgl/glsl/PlanarClassification.js.map +1 -1
  716. package/lib/esm/render/webgl/glsl/PlanarGrid.js +22 -22
  717. package/lib/esm/render/webgl/glsl/PlanarGrid.js.map +1 -1
  718. package/lib/esm/render/webgl/glsl/PointCloud.js +28 -28
  719. package/lib/esm/render/webgl/glsl/PointCloud.js.map +1 -1
  720. package/lib/esm/render/webgl/glsl/PointString.js +9 -9
  721. package/lib/esm/render/webgl/glsl/PointString.js.map +1 -1
  722. package/lib/esm/render/webgl/glsl/Polyline.js +213 -213
  723. package/lib/esm/render/webgl/glsl/Polyline.js.map +1 -1
  724. package/lib/esm/render/webgl/glsl/RealityMesh.js +83 -83
  725. package/lib/esm/render/webgl/glsl/RealityMesh.js.map +1 -1
  726. package/lib/esm/render/webgl/glsl/RenderPass.js.map +1 -1
  727. package/lib/esm/render/webgl/glsl/ScreenSpaceEffect.js +9 -9
  728. package/lib/esm/render/webgl/glsl/ScreenSpaceEffect.js.map +1 -1
  729. package/lib/esm/render/webgl/glsl/SkyBox.js.map +1 -1
  730. package/lib/esm/render/webgl/glsl/SkySphere.js +49 -49
  731. package/lib/esm/render/webgl/glsl/SkySphere.js.map +1 -1
  732. package/lib/esm/render/webgl/glsl/SolarShadowMapping.js +51 -51
  733. package/lib/esm/render/webgl/glsl/SolarShadowMapping.js.map +1 -1
  734. package/lib/esm/render/webgl/glsl/Surface.js +239 -239
  735. package/lib/esm/render/webgl/glsl/Surface.js.map +1 -1
  736. package/lib/esm/render/webgl/glsl/Thematic.js +134 -134
  737. package/lib/esm/render/webgl/glsl/Thematic.js.map +1 -1
  738. package/lib/esm/render/webgl/glsl/Translucency.js +19 -19
  739. package/lib/esm/render/webgl/glsl/Translucency.js.map +1 -1
  740. package/lib/esm/render/webgl/glsl/Vertex.js +73 -73
  741. package/lib/esm/render/webgl/glsl/Vertex.js.map +1 -1
  742. package/lib/esm/render/webgl/glsl/Viewport.js +38 -38
  743. package/lib/esm/render/webgl/glsl/Viewport.js.map +1 -1
  744. package/lib/esm/render/webgl/glsl/ViewportQuad.js.map +1 -1
  745. package/lib/esm/render/webgl/glsl/Wiremesh.js +10 -10
  746. package/lib/esm/render/webgl/glsl/Wiremesh.js.map +1 -1
  747. package/lib/esm/render-primitives.js.map +1 -1
  748. package/lib/esm/request/Request.js.map +1 -1
  749. package/lib/esm/tile/B3dmReader.js.map +1 -1
  750. package/lib/esm/tile/BatchedTileIdMap.js.map +1 -1
  751. package/lib/esm/tile/CesiumAssetProvider.js.map +1 -1
  752. package/lib/esm/tile/ClassifierTileTree.js.map +1 -1
  753. package/lib/esm/tile/ContextShareProvider.js.map +1 -1
  754. package/lib/esm/tile/DisclosedTileTreeSet.js.map +1 -1
  755. package/lib/esm/tile/DynamicIModelTile.js.map +1 -1
  756. package/lib/esm/tile/GltfReader.js.map +1 -1
  757. package/lib/esm/tile/GraphicsCollector.js.map +1 -1
  758. package/lib/esm/tile/I3dmReader.js.map +1 -1
  759. package/lib/esm/tile/IModelTile.js.map +1 -1
  760. package/lib/esm/tile/IModelTileRequestChannels.js.map +1 -1
  761. package/lib/esm/tile/IModelTileTree.js.map +1 -1
  762. package/lib/esm/tile/ImdlDecoder.js.map +1 -1
  763. package/lib/esm/tile/ImdlGraphicsCreator.js.map +1 -1
  764. package/lib/esm/tile/ImdlParser.js.map +1 -1
  765. package/lib/esm/tile/ImdlReader.js.map +1 -1
  766. package/lib/esm/tile/LRUTileList.js.map +1 -1
  767. package/lib/esm/tile/OPCFormatInterpreter.js.map +1 -1
  768. package/lib/esm/tile/PntsReader.js.map +1 -1
  769. package/lib/esm/tile/RealityTile.js.map +1 -1
  770. package/lib/esm/tile/RealityTileDrawArgs.js.map +1 -1
  771. package/lib/esm/tile/RealityTileLoader.js.map +1 -1
  772. package/lib/esm/tile/RealityTileTree.js +1 -1
  773. package/lib/esm/tile/RealityTileTree.js.map +1 -1
  774. package/lib/esm/tile/ThreeDTileFormatInterpreter.js.map +1 -1
  775. package/lib/esm/tile/Tile.js.map +1 -1
  776. package/lib/esm/tile/TileAdmin.js.map +1 -1
  777. package/lib/esm/tile/TileContent.js.map +1 -1
  778. package/lib/esm/tile/TileDrawArgs.js.map +1 -1
  779. package/lib/esm/tile/TileGeometryCollector.js.map +1 -1
  780. package/lib/esm/tile/TileParams.js.map +1 -1
  781. package/lib/esm/tile/TileRequest.js.map +1 -1
  782. package/lib/esm/tile/TileRequestChannel.js.map +1 -1
  783. package/lib/esm/tile/TileRequestChannels.js.map +1 -1
  784. package/lib/esm/tile/TileStorage.js.map +1 -1
  785. package/lib/esm/tile/TileTree.js.map +1 -1
  786. package/lib/esm/tile/TileTreeOwner.js.map +1 -1
  787. package/lib/esm/tile/TileTreeParams.js.map +1 -1
  788. package/lib/esm/tile/TileTreeReference.js.map +1 -1
  789. package/lib/esm/tile/TileTreeSupplier.js.map +1 -1
  790. package/lib/esm/tile/TileUsageMarker.js.map +1 -1
  791. package/lib/esm/tile/TileUser.js.map +1 -1
  792. package/lib/esm/tile/TileUserSet.js.map +1 -1
  793. package/lib/esm/tile/TiledGraphicsProvider.js.map +1 -1
  794. package/lib/esm/tile/ViewFlagOverrides.js.map +1 -1
  795. package/lib/esm/tile/internal.js.map +1 -1
  796. package/lib/esm/tile/map/ArcGISTileMap.js.map +1 -1
  797. package/lib/esm/tile/map/ArcGisUtilities.js.map +1 -1
  798. package/lib/esm/tile/map/BingElevation.js.map +1 -1
  799. package/lib/esm/tile/map/CesiumTerrainProvider.js.map +1 -1
  800. package/lib/esm/tile/map/EllipsoidTerrainProvider.js.map +1 -1
  801. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  802. package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  803. package/lib/esm/tile/map/ImageryProviders/AzureMapsLayerImageryProvider.js.map +1 -1
  804. package/lib/esm/tile/map/ImageryProviders/BingImageryProvider.js.map +1 -1
  805. package/lib/esm/tile/map/ImageryProviders/MapBoxLayerImageryProvider.js.map +1 -1
  806. package/lib/esm/tile/map/ImageryProviders/TileUrlImageryProvider.js.map +1 -1
  807. package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
  808. package/lib/esm/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
  809. package/lib/esm/tile/map/MapCartoRectangle.js.map +1 -1
  810. package/lib/esm/tile/map/MapFeatureInfo.js.map +1 -1
  811. package/lib/esm/tile/map/MapLayerAuthentication.js.map +1 -1
  812. package/lib/esm/tile/map/MapLayerFormatRegistry.js.map +1 -1
  813. package/lib/esm/tile/map/MapLayerImageryProvider.js +2 -2
  814. package/lib/esm/tile/map/MapLayerImageryProvider.js.map +1 -1
  815. package/lib/esm/tile/map/MapLayerSources.js.map +1 -1
  816. package/lib/esm/tile/map/MapLayerTileTreeReference.js.map +1 -1
  817. package/lib/esm/tile/map/MapTile.js.map +1 -1
  818. package/lib/esm/tile/map/MapTileAvailability.js.map +1 -1
  819. package/lib/esm/tile/map/MapTileLoader.js.map +1 -1
  820. package/lib/esm/tile/map/MapTiledGraphicsProvider.js.map +1 -1
  821. package/lib/esm/tile/map/MapTilingScheme.js.map +1 -1
  822. package/lib/esm/tile/map/QuadId.js.map +1 -1
  823. package/lib/esm/tile/map/TerrainMeshProvider.js.map +1 -1
  824. package/lib/esm/tile/map/TerrainProvider.js.map +1 -1
  825. package/lib/esm/tile/map/WmsCapabilities.js.map +1 -1
  826. package/lib/esm/tile/map/WmsUtilities.js.map +1 -1
  827. package/lib/esm/tile/map/WmtsCapabilities.js.map +1 -1
  828. package/lib/esm/tools/AccuDrawTool.js.map +1 -1
  829. package/lib/esm/tools/ClipViewTool.js.map +1 -1
  830. package/lib/esm/tools/EditManipulator.js.map +1 -1
  831. package/lib/esm/tools/ElementSetTool.js.map +1 -1
  832. package/lib/esm/tools/EventController.js.map +1 -1
  833. package/lib/esm/tools/IdleTool.js.map +1 -1
  834. package/lib/esm/tools/MeasureTool.js.map +1 -1
  835. package/lib/esm/tools/PrimitiveTool.js.map +1 -1
  836. package/lib/esm/tools/SelectTool.js.map +1 -1
  837. package/lib/esm/tools/ToolAdmin.js.map +1 -1
  838. package/lib/esm/tools/ToolAssistance.js.map +1 -1
  839. package/lib/esm/tools/ToolSettings.js.map +1 -1
  840. package/lib/esm/tools/ViewTool.js.map +1 -1
  841. package/lib/esm/webgl.js.map +1 -1
  842. package/lib/esm/workers/ImdlParser/Worker.js.map +1 -1
  843. package/lib/esm/workers/ImdlParser/webpack.config.js +40 -40
  844. package/lib/esm/workers/RegisterWorker.js.map +1 -1
  845. package/lib/public/assets/MapLayerSources.json +25 -25
  846. package/lib/public/images/cesium-ion.svg +92 -92
  847. package/lib/public/images/imodeljs-icon.svg +2 -2
  848. package/lib/public/locales/en/CoreTools.json +477 -477
  849. package/lib/public/locales/en/iModelJs.json +170 -170
  850. package/lib/public/scripts/checkbrowser.js +24 -24
  851. package/package.json +23 -22
@@ -1 +1 @@
1
- {"version":3,"file":"FrustumAnimator.js","sourceRoot":"","sources":["../../src/FrustumAnimator.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Views\r\n */\r\n\r\nimport { Angle, Geometry, Matrix3d, Point3d, Range3d, Transform, Vector3d } from \"@itwin/core-geometry\";\r\nimport { Tweens } from \"@itwin/core-common\";\r\nimport { Animator, ViewAnimationOptions } from \"./ViewAnimation\";\r\nimport { ScreenViewport } from \"./Viewport\";\r\nimport { ViewPose, ViewPose3d } from \"./ViewPose\";\r\nimport { ViewState3d } from \"./ViewState\";\r\n/**\r\n * Compute an intermediate eye point as it swings around a moving target with rotating axes and varying distance to target.\r\n * (eye, target, distance) is redundant -- implementation problem is to figure out which to use for compatibility with subsequent view setup.\r\n */\r\nfunction interpolateSwingingEye(\r\n axes0: Matrix3d,\r\n eye0: Point3d,\r\n distance0: number,\r\n axes1: Matrix3d,\r\n eye1: Point3d,\r\n distance1: number,\r\n fraction: number,\r\n axesAtFraction: Matrix3d\r\n): { target: Point3d, eye: Point3d, distance: number } {\r\n const z0 = axes0.rowZ();\r\n const z1 = axes1.rowZ();\r\n const zA = axesAtFraction.rowZ();\r\n // back up from the eye points to the targets.\r\n const target0 = eye0.plusScaled(z0, -distance0);\r\n const target1 = eye1.plusScaled(z1, -distance1);\r\n // RULE: Target point moves by simple interpolation\r\n const targetA = target0.interpolate(fraction, target1);\r\n // RULE: Distance from target to eye is simple interpolation\r\n const distanceA = Geometry.interpolate(distance0, fraction, distance1);\r\n // The interpolated target, interpolated distance, and specified axes give the intermediate eyepoint.\r\n const eyeA = targetA.plusScaled(zA, distanceA);\r\n return {\r\n target: targetA,\r\n eye: eyeA,\r\n distance: distanceA,\r\n };\r\n}\r\n/** Animates the transition of a [[Viewport]] from one [Frustum]($common) to another. The viewport will render as many frames as necessary during the supplied duration.\r\n * @see [[Viewport.animateFrustumChange]] to conveniently animate a viewport from one frustum to another.\r\n * @public\r\n * @extensions\r\n */\r\nexport class FrustumAnimator implements Animator {\r\n private _tweens = new Tweens();\r\n private _duration = 0;\r\n\r\n /** Construct an animator that animates from `begin` to `end`. */\r\n public constructor(public options: ViewAnimationOptions, viewport: ScreenViewport, begin: ViewPose, end: ViewPose) {\r\n const settings = ScreenViewport.animation;\r\n const zoomSettings = settings.zoomOut;\r\n\r\n let duration = undefined !== options.animationTime ? options.animationTime : settings.time.normal.milliseconds;\r\n if (duration <= 0 || begin.cameraOn !== end.cameraOn) // no duration means skip animation. We can't animate if the camera toggles.\r\n return;\r\n\r\n this._duration = duration;\r\n let extentBias: Vector3d | undefined;\r\n let eyeBias: Vector3d | undefined;\r\n const zVec = begin.zVec;\r\n const view = viewport.view;\r\n const view3 = view as ViewState3d;\r\n const begin3 = begin as ViewPose3d;\r\n const end3 = end as ViewPose3d;\r\n const beginTarget = begin.target;\r\n const endTarget = end.target;\r\n const axis = end.rotation.multiplyMatrixMatrixInverse(begin.rotation)!.getAxisAndAngleOfRotation(); // axis to rotate begin to get to end\r\n const timing = { fraction: 0.0, height: 0, position: 0 }; // updated by tween.\r\n\r\n // don't do \"zoom out\" if the two views aren't pointing in the same direction, or if they request cancelOnAbort (since that implies that the view\r\n // is a linear interpolation from begin to end), or if it's disabled.\r\n if (zoomSettings.enable && !options.cancelOnAbort && zVec.isAlmostEqual(end.zVec)) {\r\n view.applyPose(end); // start with the pose at the end\r\n const viewTransform = Transform.createOriginAndMatrix(undefined, view.getRotation());\r\n const endRange = Range3d.createTransformedArray(viewTransform, view.calculateFocusCorners()); // get the view-aligned range of the focus plane at the end\r\n const beginRange = Range3d.createTransformedArray(viewTransform, view.applyPose(begin).calculateFocusCorners()); // get the view-aligned range of the focus plane at the beginning\r\n\r\n // do the starting and ending views (plus the margin) overlap? If not we need to zoom out to show how to get from one to the other\r\n const expand = (range: Range3d) => {\r\n const r = range.clone();\r\n r.scaleAboutCenterInPlace(zoomSettings.margin);\r\n return r;\r\n };\r\n\r\n if (!expand(beginRange).intersectsRangeXY(expand(endRange))) {\r\n view3.lookAtViewAlignedVolume(beginRange.union(endRange), viewport.viewRect.aspect); // set up a view that would show both extents\r\n duration *= zoomSettings.durationFactor; // increase duration so the zooming isn't too fast\r\n extentBias = view.getExtents().minus(begin.extents); // if the camera is off, the \"bias\" is the amount the union-ed view is larger than the starting view\r\n if (begin.cameraOn)\r\n eyeBias = zVec.scaleToLength(zVec.dotProduct(begin3.camera.eye.vectorTo(view3.camera.eye))); // if the camera is on, the bias is the difference in height of the two eye positions\r\n }\r\n }\r\n\r\n this._tweens.create(timing, {\r\n to: { fraction: 1.0, height: zoomSettings.heights, position: zoomSettings.positions },\r\n duration,\r\n start: true,\r\n easing: options.easingFunction ? options.easingFunction : settings.easing,\r\n interpolation: zoomSettings.interpolation,\r\n onComplete: () =>\r\n viewport.setupFromView(end), // when we're done, set up from final state\r\n onUpdate: () => {\r\n const fraction = extentBias ? timing.position : timing.fraction; // if we're zooming, fraction comes from position interpolation\r\n const rot = Matrix3d.createRotationAroundVector(axis.axis, Angle.createDegrees(fraction * axis.angle.degrees))!.multiplyMatrixMatrix(begin.rotation);\r\n if (begin.cameraOn) {\r\n const newExtents = begin.extents.interpolate(fraction, end.extents);\r\n if (undefined !== eyeBias) {\r\n const eyePoint = begin3.camera.eye.interpolate(fraction, end3.camera.eye);\r\n eyePoint.plusScaled(eyeBias, timing.height, eyePoint);\r\n const targetPoint = eyePoint.plusScaled(rot.getRow(2), -1.0 * (Geometry.interpolate(begin3.camera.focusDist, fraction, end3.camera.focusDist)));\r\n view3.lookAt({ eyePoint, targetPoint, upVector: rot.getRow(1), newExtents });\r\n } else {\r\n const data = interpolateSwingingEye(\r\n begin3.rotation, begin3.camera.eye, begin3.camera.focusDist,\r\n end3.rotation, end3.camera.eye, end3.camera.focusDist, fraction, rot);\r\n view3.lookAt({ eyePoint: data.eye, targetPoint: data.target, upVector: rot.getRow(1), newExtents });\r\n }\r\n } else {\r\n const extents = begin.extents.interpolate(timing.fraction, end.extents);\r\n if (undefined !== extentBias)\r\n extents.plusScaled(extentBias, timing.height, extents); // no camera, zooming out expands extents\r\n view.setExtents(extents);\r\n view.setRotation(rot);\r\n view.setCenter(beginTarget.interpolate(fraction, endTarget)); // must be done last - depends on extents and rotation\r\n }\r\n viewport.setupFromView();\r\n },\r\n });\r\n }\r\n\r\n /** @internal */\r\n public animate() {\r\n const didFinish = !this._tweens.update();\r\n if (didFinish && this.options.animationFinishedCallback)\r\n this.options.animationFinishedCallback(true);\r\n return didFinish;\r\n }\r\n\r\n /** @internal */\r\n public interrupt() {\r\n // We were interrupted. Either go to: the final frame (normally) or, add a small fraction of the total duration (30ms for a .5 second duration) to\r\n // the current time for cancelOnAbort. That makes aborted animations show some progress, as happens when the mouse wheel rolls quickly.\r\n this._tweens.update(this.options.cancelOnAbort ? Date.now() + (this._duration * .06) : Infinity);\r\n if (this.options.animationFinishedCallback)\r\n this.options.animationFinishedCallback(false);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"FrustumAnimator.js","sourceRoot":"","sources":["../../src/FrustumAnimator.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Views\n */\n\nimport { Angle, Geometry, Matrix3d, Point3d, Range3d, Transform, Vector3d } from \"@itwin/core-geometry\";\nimport { Tweens } from \"@itwin/core-common\";\nimport { Animator, ViewAnimationOptions } from \"./ViewAnimation\";\nimport { ScreenViewport } from \"./Viewport\";\nimport { ViewPose, ViewPose3d } from \"./ViewPose\";\nimport { ViewState3d } from \"./ViewState\";\n/**\n * Compute an intermediate eye point as it swings around a moving target with rotating axes and varying distance to target.\n * (eye, target, distance) is redundant -- implementation problem is to figure out which to use for compatibility with subsequent view setup.\n */\nfunction interpolateSwingingEye(\n axes0: Matrix3d,\n eye0: Point3d,\n distance0: number,\n axes1: Matrix3d,\n eye1: Point3d,\n distance1: number,\n fraction: number,\n axesAtFraction: Matrix3d\n): { target: Point3d, eye: Point3d, distance: number } {\n const z0 = axes0.rowZ();\n const z1 = axes1.rowZ();\n const zA = axesAtFraction.rowZ();\n // back up from the eye points to the targets.\n const target0 = eye0.plusScaled(z0, -distance0);\n const target1 = eye1.plusScaled(z1, -distance1);\n // RULE: Target point moves by simple interpolation\n const targetA = target0.interpolate(fraction, target1);\n // RULE: Distance from target to eye is simple interpolation\n const distanceA = Geometry.interpolate(distance0, fraction, distance1);\n // The interpolated target, interpolated distance, and specified axes give the intermediate eyepoint.\n const eyeA = targetA.plusScaled(zA, distanceA);\n return {\n target: targetA,\n eye: eyeA,\n distance: distanceA,\n };\n}\n/** Animates the transition of a [[Viewport]] from one [Frustum]($common) to another. The viewport will render as many frames as necessary during the supplied duration.\n * @see [[Viewport.animateFrustumChange]] to conveniently animate a viewport from one frustum to another.\n * @public\n * @extensions\n */\nexport class FrustumAnimator implements Animator {\n private _tweens = new Tweens();\n private _duration = 0;\n\n /** Construct an animator that animates from `begin` to `end`. */\n public constructor(public options: ViewAnimationOptions, viewport: ScreenViewport, begin: ViewPose, end: ViewPose) {\n const settings = ScreenViewport.animation;\n const zoomSettings = settings.zoomOut;\n\n let duration = undefined !== options.animationTime ? options.animationTime : settings.time.normal.milliseconds;\n if (duration <= 0 || begin.cameraOn !== end.cameraOn) // no duration means skip animation. We can't animate if the camera toggles.\n return;\n\n this._duration = duration;\n let extentBias: Vector3d | undefined;\n let eyeBias: Vector3d | undefined;\n const zVec = begin.zVec;\n const view = viewport.view;\n const view3 = view as ViewState3d;\n const begin3 = begin as ViewPose3d;\n const end3 = end as ViewPose3d;\n const beginTarget = begin.target;\n const endTarget = end.target;\n const axis = end.rotation.multiplyMatrixMatrixInverse(begin.rotation)!.getAxisAndAngleOfRotation(); // axis to rotate begin to get to end\n const timing = { fraction: 0.0, height: 0, position: 0 }; // updated by tween.\n\n // don't do \"zoom out\" if the two views aren't pointing in the same direction, or if they request cancelOnAbort (since that implies that the view\n // is a linear interpolation from begin to end), or if it's disabled.\n if (zoomSettings.enable && !options.cancelOnAbort && zVec.isAlmostEqual(end.zVec)) {\n view.applyPose(end); // start with the pose at the end\n const viewTransform = Transform.createOriginAndMatrix(undefined, view.getRotation());\n const endRange = Range3d.createTransformedArray(viewTransform, view.calculateFocusCorners()); // get the view-aligned range of the focus plane at the end\n const beginRange = Range3d.createTransformedArray(viewTransform, view.applyPose(begin).calculateFocusCorners()); // get the view-aligned range of the focus plane at the beginning\n\n // do the starting and ending views (plus the margin) overlap? If not we need to zoom out to show how to get from one to the other\n const expand = (range: Range3d) => {\n const r = range.clone();\n r.scaleAboutCenterInPlace(zoomSettings.margin);\n return r;\n };\n\n if (!expand(beginRange).intersectsRangeXY(expand(endRange))) {\n view3.lookAtViewAlignedVolume(beginRange.union(endRange), viewport.viewRect.aspect); // set up a view that would show both extents\n duration *= zoomSettings.durationFactor; // increase duration so the zooming isn't too fast\n extentBias = view.getExtents().minus(begin.extents); // if the camera is off, the \"bias\" is the amount the union-ed view is larger than the starting view\n if (begin.cameraOn)\n eyeBias = zVec.scaleToLength(zVec.dotProduct(begin3.camera.eye.vectorTo(view3.camera.eye))); // if the camera is on, the bias is the difference in height of the two eye positions\n }\n }\n\n this._tweens.create(timing, {\n to: { fraction: 1.0, height: zoomSettings.heights, position: zoomSettings.positions },\n duration,\n start: true,\n easing: options.easingFunction ? options.easingFunction : settings.easing,\n interpolation: zoomSettings.interpolation,\n onComplete: () =>\n viewport.setupFromView(end), // when we're done, set up from final state\n onUpdate: () => {\n const fraction = extentBias ? timing.position : timing.fraction; // if we're zooming, fraction comes from position interpolation\n const rot = Matrix3d.createRotationAroundVector(axis.axis, Angle.createDegrees(fraction * axis.angle.degrees))!.multiplyMatrixMatrix(begin.rotation);\n if (begin.cameraOn) {\n const newExtents = begin.extents.interpolate(fraction, end.extents);\n if (undefined !== eyeBias) {\n const eyePoint = begin3.camera.eye.interpolate(fraction, end3.camera.eye);\n eyePoint.plusScaled(eyeBias, timing.height, eyePoint);\n const targetPoint = eyePoint.plusScaled(rot.getRow(2), -1.0 * (Geometry.interpolate(begin3.camera.focusDist, fraction, end3.camera.focusDist)));\n view3.lookAt({ eyePoint, targetPoint, upVector: rot.getRow(1), newExtents });\n } else {\n const data = interpolateSwingingEye(\n begin3.rotation, begin3.camera.eye, begin3.camera.focusDist,\n end3.rotation, end3.camera.eye, end3.camera.focusDist, fraction, rot);\n view3.lookAt({ eyePoint: data.eye, targetPoint: data.target, upVector: rot.getRow(1), newExtents });\n }\n } else {\n const extents = begin.extents.interpolate(timing.fraction, end.extents);\n if (undefined !== extentBias)\n extents.plusScaled(extentBias, timing.height, extents); // no camera, zooming out expands extents\n view.setExtents(extents);\n view.setRotation(rot);\n view.setCenter(beginTarget.interpolate(fraction, endTarget)); // must be done last - depends on extents and rotation\n }\n viewport.setupFromView();\n },\n });\n }\n\n /** @internal */\n public animate() {\n const didFinish = !this._tweens.update();\n if (didFinish && this.options.animationFinishedCallback)\n this.options.animationFinishedCallback(true);\n return didFinish;\n }\n\n /** @internal */\n public interrupt() {\n // We were interrupted. Either go to: the final frame (normally) or, add a small fraction of the total duration (30ms for a .5 second duration) to\n // the current time for cancelOnAbort. That makes aborted animations show some progress, as happens when the mouse wheel rolls quickly.\n this._tweens.update(this.options.cancelOnAbort ? Date.now() + (this._duration * .06) : Infinity);\n if (this.options.animationFinishedCallback)\n this.options.animationFinishedCallback(false);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"FuzzySearch.js","sourceRoot":"","sources":["../../src/FuzzySearch.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tools\r\n */\r\n\r\nimport Fuse from \"fuse.js\";\r\n\r\n/** @public */\r\nexport class FuzzySearch<T> {\r\n\r\n /** Override to provide non-standard FuseOptions for searches where the a single word pattern is used */\r\n public onGetSingleWordSearchOptions(): Fuse.FuseOptions<T> {\r\n return {\r\n shouldSort: true,\r\n threshold: 0.40,\r\n location: 0,\r\n distance: 100,\r\n maxPatternLength: 32,\r\n minMatchCharLength: 2,\r\n includeMatches: true,\r\n includeScore: true,\r\n };\r\n }\r\n\r\n /** Override to provide non-standard FuseOptions for searches where the a multiple word pattern is used */\r\n public onGetMultiWordSearchOptions(): Fuse.FuseOptions<T> {\r\n return {\r\n shouldSort: true,\r\n threshold: 0.40,\r\n tokenize: true,\r\n matchAllTokens: true,\r\n maxPatternLength: 32,\r\n minMatchCharLength: 2,\r\n includeMatches: true,\r\n includeScore: true,\r\n };\r\n }\r\n\r\n /** Call to conduct a fuzzy search of searchedObjects, looking at the 'key' member of each such object\r\n * @param searchedObjects An array of objects to search.\r\n * @param keys The name of the members to search in the searchedObjects.\r\n * @param pattern The pattern for which each searchedObject is searched.\r\n * @return FuzzySearchResults.\r\n */\r\n public search(searchedObjects: T[], keys: Array<keyof T>, pattern: string): FuzzySearchResults<T> {\r\n if (!pattern || pattern.length < 2)\r\n return new FuzzySearchResults<T>(undefined);\r\n\r\n // it is a multi-word pattern if there's a space other than at the end of the pattern.\r\n const spaceIndex: number = pattern.indexOf(\" \");\r\n const multiWord: boolean = (-1 !== spaceIndex) && (spaceIndex !== (pattern.length - 1));\r\n const options: Fuse.FuseOptions<T> = multiWord ? this.onGetMultiWordSearchOptions() : this.onGetSingleWordSearchOptions();\r\n options.keys = keys;\r\n const fuse = new Fuse(searchedObjects, options);\r\n let results: any[] = fuse.search(pattern);\r\n\r\n // We need to set the threshold fairly high to get results when the user misspells words (otherwise they are not returned),\r\n // but doing that results in matches that don't make sense when there are \"good\" matches. So we discard matches where the match\r\n // score increases by a large amount between results.\r\n let checkScoreDelta: boolean = false;\r\n let averageScoreDeltaThreshold = 1;\r\n if (results.length > 30) {\r\n averageScoreDeltaThreshold = ((results[results.length - 1].score - results[0].score) / results.length) * 10;\r\n if (averageScoreDeltaThreshold > 0.01)\r\n checkScoreDelta = true;\r\n }\r\n\r\n // Sometimes fuse returns results in the array where the matches array is empty. That seems like a bug to me, but it happens when\r\n // the input is something like \"fjt\" and the string it matches is \"fit\". If we have more than three actual matches, we just truncate the set when we see one.\r\n // The other use for this loop is to truncate when we see a dramatic increase in the score. The ones after are unlikely\r\n // to be useful, so we truncate the results when we hit that point also.\r\n for (let resultIndex = 0; resultIndex < results.length; resultIndex++) {\r\n const thisResult = results[resultIndex];\r\n if (0 === thisResult.matches.length) {\r\n // here we have a result with no matches. If we have other matches, just discard this and the rest.\r\n if (resultIndex > 2) {\r\n results = results.slice(0, resultIndex);\r\n break;\r\n }\r\n // otherwise we want to keep this result, but we have to add the matched value to the object because we can't get it from the matches array.\r\n // we assume it came from the first key (usually there's only one anyway).\r\n\r\n thisResult.matchedValue = thisResult.item[keys[0]];\r\n thisResult.matchedKey = keys[0];\r\n }\r\n\r\n if (checkScoreDelta && (resultIndex > 0)) {\r\n const resultScore = results[resultIndex].score;\r\n if (resultScore < 0.101)\r\n continue;\r\n if ((resultScore - results[resultIndex - 1].score) > averageScoreDeltaThreshold) {\r\n results = results.slice(0, resultIndex);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // put the functions on each result so it fulfils the FuzzySearchResult interface.\r\n for (const thisResult of results) {\r\n thisResult.getResult = getResult.bind(thisResult);\r\n thisResult.getBoldMask = getBoldMask.bind(thisResult);\r\n thisResult.getMatchedKey = getMatchedKey.bind(thisResult);\r\n thisResult.getMatchedValue = getMatchedValue.bind(thisResult);\r\n }\r\n return new FuzzySearchResults<T>(results);\r\n }\r\n}\r\n\r\n/** Interface implemented by objects returned while iterating through FuzzySearchResults\r\n * @public\r\n * @extensions\r\n */\r\nexport interface FuzzySearchResult<T> {\r\n /** Return the current result object */\r\n getResult(): T;\r\n\r\n /** Return the key found in this result object */\r\n getMatchedKey(): string;\r\n\r\n /** Return the value matched in this result object */\r\n getMatchedValue(): string;\r\n\r\n /** Return a boolean array that contains true for each letter in the matched value that was matched part of the search pattern */\r\n getBoldMask(): boolean[];\r\n}\r\n\r\n/** Added to each result to support the FuzzySearchResult interface. */\r\nfunction getResult(this: any) {\r\n return this.item;\r\n}\r\n\r\n/** Added to each result to support the FuzzySearchResult interface. */\r\nfunction getMatchedKey(this: any): string {\r\n return (this.matches.length > 0) ? this.matches[0].key : this.matchedKey;\r\n}\r\n\r\n/** Added to each result to support the FuzzySearchResult interface. */\r\nfunction getMatchedValue(this: any): string {\r\n return (this.matches.length > 0) ? this.matches[0].value : this.matchedValue;\r\n}\r\n\r\n/** this function is added to each result to support the FuzzySearchResult interface. */\r\nfunction getBoldMask(this: any): boolean[] | undefined {\r\n if (this.boldMask)\r\n return this.boldMask;\r\n\r\n // if we had no matches, we return a bold mask with all false.\r\n if (0 === this.matches.length) {\r\n const noBoldMask = new Array<boolean>(this.matchedValue.length);\r\n noBoldMask.fill(false);\r\n return this.boldMask = noBoldMask;\r\n }\r\n\r\n // we have some matched portions.\r\n const thisMatchedString: string = this.matches[0].value;\r\n const valueLength = thisMatchedString.length;\r\n const boldMask: boolean[] = new Array<boolean>(valueLength);\r\n boldMask.fill(false);\r\n const indicesArray: number[][] = this.matches[0].indices;\r\n indicesArray.forEach((set: number[]) => {\r\n for (let start = set[0], end = set[1]; start <= end; start++) {\r\n boldMask[start] = true;\r\n }\r\n });\r\n // cache it so if someone asks again we don't have to recalculate it.\r\n return this.boldMask = boldMask;\r\n}\r\n\r\n/**\r\n * This class is used to return the results of FuzzySearch.search. It is iterable, with each iteration\r\n * returning an object implementing the FuzzySearchResult interface.\r\n * @public\r\n */\r\nexport class FuzzySearchResults<T> implements Iterable<T> {\r\n public results: any[];\r\n\r\n constructor(results: any[] | undefined) {\r\n this.results = [];\r\n if (results)\r\n this.results = results;\r\n }\r\n\r\n public [Symbol.iterator](): any { return new FuzzySearchResultsIterator(this); }\r\n\r\n public get length(): number { return this.results.length; }\r\n\r\n public getResult(resultIndex: number): FuzzySearchResult<T> | undefined {\r\n if ((resultIndex < 0) || (resultIndex > this.results.length))\r\n return undefined;\r\n return this.results[resultIndex];\r\n }\r\n}\r\nclass FuzzySearchResultsIterator<T> {\r\n public counter: number;\r\n public fsr: FuzzySearchResults<T>;\r\n\r\n constructor(fsr: FuzzySearchResults<T>) {\r\n this.fsr = fsr;\r\n this.counter = 0;\r\n }\r\n\r\n public next: any = () => {\r\n return {\r\n done: this.counter === this.fsr.results.length,\r\n value: this.fsr.results[this.counter++] as FuzzySearchResult<T>,\r\n };\r\n };\r\n}\r\n"]}
1
+ {"version":3,"file":"FuzzySearch.js","sourceRoot":"","sources":["../../src/FuzzySearch.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Tools\n */\n\nimport Fuse from \"fuse.js\";\n\n/** @public */\nexport class FuzzySearch<T> {\n\n /** Override to provide non-standard FuseOptions for searches where the a single word pattern is used */\n public onGetSingleWordSearchOptions(): Fuse.FuseOptions<T> {\n return {\n shouldSort: true,\n threshold: 0.40,\n location: 0,\n distance: 100,\n maxPatternLength: 32,\n minMatchCharLength: 2,\n includeMatches: true,\n includeScore: true,\n };\n }\n\n /** Override to provide non-standard FuseOptions for searches where the a multiple word pattern is used */\n public onGetMultiWordSearchOptions(): Fuse.FuseOptions<T> {\n return {\n shouldSort: true,\n threshold: 0.40,\n tokenize: true,\n matchAllTokens: true,\n maxPatternLength: 32,\n minMatchCharLength: 2,\n includeMatches: true,\n includeScore: true,\n };\n }\n\n /** Call to conduct a fuzzy search of searchedObjects, looking at the 'key' member of each such object\n * @param searchedObjects An array of objects to search.\n * @param keys The name of the members to search in the searchedObjects.\n * @param pattern The pattern for which each searchedObject is searched.\n * @return FuzzySearchResults.\n */\n public search(searchedObjects: T[], keys: Array<keyof T>, pattern: string): FuzzySearchResults<T> {\n if (!pattern || pattern.length < 2)\n return new FuzzySearchResults<T>(undefined);\n\n // it is a multi-word pattern if there's a space other than at the end of the pattern.\n const spaceIndex: number = pattern.indexOf(\" \");\n const multiWord: boolean = (-1 !== spaceIndex) && (spaceIndex !== (pattern.length - 1));\n const options: Fuse.FuseOptions<T> = multiWord ? this.onGetMultiWordSearchOptions() : this.onGetSingleWordSearchOptions();\n options.keys = keys;\n const fuse = new Fuse(searchedObjects, options);\n let results: any[] = fuse.search(pattern);\n\n // We need to set the threshold fairly high to get results when the user misspells words (otherwise they are not returned),\n // but doing that results in matches that don't make sense when there are \"good\" matches. So we discard matches where the match\n // score increases by a large amount between results.\n let checkScoreDelta: boolean = false;\n let averageScoreDeltaThreshold = 1;\n if (results.length > 30) {\n averageScoreDeltaThreshold = ((results[results.length - 1].score - results[0].score) / results.length) * 10;\n if (averageScoreDeltaThreshold > 0.01)\n checkScoreDelta = true;\n }\n\n // Sometimes fuse returns results in the array where the matches array is empty. That seems like a bug to me, but it happens when\n // the input is something like \"fjt\" and the string it matches is \"fit\". If we have more than three actual matches, we just truncate the set when we see one.\n // The other use for this loop is to truncate when we see a dramatic increase in the score. The ones after are unlikely\n // to be useful, so we truncate the results when we hit that point also.\n for (let resultIndex = 0; resultIndex < results.length; resultIndex++) {\n const thisResult = results[resultIndex];\n if (0 === thisResult.matches.length) {\n // here we have a result with no matches. If we have other matches, just discard this and the rest.\n if (resultIndex > 2) {\n results = results.slice(0, resultIndex);\n break;\n }\n // otherwise we want to keep this result, but we have to add the matched value to the object because we can't get it from the matches array.\n // we assume it came from the first key (usually there's only one anyway).\n\n thisResult.matchedValue = thisResult.item[keys[0]];\n thisResult.matchedKey = keys[0];\n }\n\n if (checkScoreDelta && (resultIndex > 0)) {\n const resultScore = results[resultIndex].score;\n if (resultScore < 0.101)\n continue;\n if ((resultScore - results[resultIndex - 1].score) > averageScoreDeltaThreshold) {\n results = results.slice(0, resultIndex);\n break;\n }\n }\n }\n\n // put the functions on each result so it fulfils the FuzzySearchResult interface.\n for (const thisResult of results) {\n thisResult.getResult = getResult.bind(thisResult);\n thisResult.getBoldMask = getBoldMask.bind(thisResult);\n thisResult.getMatchedKey = getMatchedKey.bind(thisResult);\n thisResult.getMatchedValue = getMatchedValue.bind(thisResult);\n }\n return new FuzzySearchResults<T>(results);\n }\n}\n\n/** Interface implemented by objects returned while iterating through FuzzySearchResults\n * @public\n * @extensions\n */\nexport interface FuzzySearchResult<T> {\n /** Return the current result object */\n getResult(): T;\n\n /** Return the key found in this result object */\n getMatchedKey(): string;\n\n /** Return the value matched in this result object */\n getMatchedValue(): string;\n\n /** Return a boolean array that contains true for each letter in the matched value that was matched part of the search pattern */\n getBoldMask(): boolean[];\n}\n\n/** Added to each result to support the FuzzySearchResult interface. */\nfunction getResult(this: any) {\n return this.item;\n}\n\n/** Added to each result to support the FuzzySearchResult interface. */\nfunction getMatchedKey(this: any): string {\n return (this.matches.length > 0) ? this.matches[0].key : this.matchedKey;\n}\n\n/** Added to each result to support the FuzzySearchResult interface. */\nfunction getMatchedValue(this: any): string {\n return (this.matches.length > 0) ? this.matches[0].value : this.matchedValue;\n}\n\n/** this function is added to each result to support the FuzzySearchResult interface. */\nfunction getBoldMask(this: any): boolean[] | undefined {\n if (this.boldMask)\n return this.boldMask;\n\n // if we had no matches, we return a bold mask with all false.\n if (0 === this.matches.length) {\n const noBoldMask = new Array<boolean>(this.matchedValue.length);\n noBoldMask.fill(false);\n return this.boldMask = noBoldMask;\n }\n\n // we have some matched portions.\n const thisMatchedString: string = this.matches[0].value;\n const valueLength = thisMatchedString.length;\n const boldMask: boolean[] = new Array<boolean>(valueLength);\n boldMask.fill(false);\n const indicesArray: number[][] = this.matches[0].indices;\n indicesArray.forEach((set: number[]) => {\n for (let start = set[0], end = set[1]; start <= end; start++) {\n boldMask[start] = true;\n }\n });\n // cache it so if someone asks again we don't have to recalculate it.\n return this.boldMask = boldMask;\n}\n\n/**\n * This class is used to return the results of FuzzySearch.search. It is iterable, with each iteration\n * returning an object implementing the FuzzySearchResult interface.\n * @public\n */\nexport class FuzzySearchResults<T> implements Iterable<T> {\n public results: any[];\n\n constructor(results: any[] | undefined) {\n this.results = [];\n if (results)\n this.results = results;\n }\n\n public [Symbol.iterator](): any { return new FuzzySearchResultsIterator(this); }\n\n public get length(): number { return this.results.length; }\n\n public getResult(resultIndex: number): FuzzySearchResult<T> | undefined {\n if ((resultIndex < 0) || (resultIndex > this.results.length))\n return undefined;\n return this.results[resultIndex];\n }\n}\nclass FuzzySearchResultsIterator<T> {\n public counter: number;\n public fsr: FuzzySearchResults<T>;\n\n constructor(fsr: FuzzySearchResults<T>) {\n this.fsr = fsr;\n this.counter = 0;\n }\n\n public next: any = () => {\n return {\n done: this.counter === this.fsr.results.length,\n value: this.fsr.results[this.counter++] as FuzzySearchResult<T>,\n };\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"GeoServices.js","sourceRoot":"","sources":["../../src/GeoServices.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module IModelConnection\r\n */\r\n\r\n// cspell:ignore GCRS\r\nimport {\r\n assert, BeEvent, Dictionary, Logger, SortedArray,\r\n} from \"@itwin/core-bentley\";\r\nimport { WritableXYAndZ, XYAndZ, XYZProps } from \"@itwin/core-geometry\";\r\nimport {\r\n GeoCoordinatesRequestProps, GeoCoordinatesResponseProps, GeoCoordStatus, GeographicCRSProps, IModelCoordinatesRequestProps, IModelCoordinatesResponseProps,\r\n IModelReadRpcInterface, PointWithStatus,\r\n} from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"./IModelConnection\";\r\nimport { FrontendLoggerCategory } from \"./common/FrontendLoggerCategory\";\r\n\r\n/** Options used to create a [[CoordinateConverter]].\r\n * @internal exported strictly for tests.\r\n */\r\nexport interface CoordinateConverterOptions {\r\n isIModelClosed: () => boolean;\r\n /** Asynchronously convert each point. The resultant array should have the same number and order of points as the input. */\r\n requestPoints: (points: XYAndZ[]) => Promise<PointWithStatus[]>;\r\n /** Maximum number of points to include in each request. Default: 300. */\r\n maxPointsPerRequest?: number;\r\n}\r\n\r\nfunction compareXYAndZ(lhs: XYAndZ, rhs: XYAndZ): number {\r\n return lhs.x - rhs.x || lhs.y - rhs.y || lhs.z - rhs.z;\r\n}\r\n\r\nfunction cloneXYAndZ(xyz: XYAndZ): XYAndZ {\r\n return { x: xyz.x, y: xyz.y, z: xyz.z };\r\n}\r\n\r\ntype CoordinateConverterState =\r\n // No pending requests.\r\n \"idle\" |\r\n // We have scheduled a requestAnimationFrame to dispatch all pending requests.\r\n \"scheduled\" |\r\n // We have dispatched all requests that were pending at the most recent requestAnimationFrame callback.\r\n \"in-flight\";\r\n\r\n/** Performs conversion of coordinates from one coordinate system to another.\r\n * A [[GeoConverter]] has a pair of these for converting between iModel coordinates and geographic coordinates.\r\n * Uses a cache to avoid repeatedly requesting the same points, and a batching strategy to avoid making frequent small requests.\r\n * The cache stores every point that was ever converted by [[convert]]. It is currently permitted to grow to unbounded size.\r\n * The batching works as follows:\r\n * When a conversion is requested via [[convert]], if all the requested points are in the cache, they are returned immediately.\r\n * Otherwise, any points not in the cache and not in the current in-flight request (if any) are placed onto the queue of pending requests.\r\n * A pending request is scheduled if one hasn't already been scheduled, via requestAnimationFrame.\r\n * In the animation frame callback, the pending requests are split into batches of no more than options.maxPointsPerRequest and dispatched to the backend.\r\n * Once the response is received, the results are loaded into and returned from the cache.\r\n * If more calls to convert occurred while the request was in flight, another request is dispatched.\r\n * @internal exported strictly for tests.\r\n */\r\nexport class CoordinateConverter {\r\n protected readonly _cache: Dictionary<XYAndZ, PointWithStatus>;\r\n protected _state: CoordinateConverterState = \"idle\";\r\n // The accumulated set of points to be converted by the next request.\r\n protected _pending: SortedArray<XYAndZ>;\r\n // The set of points that were included in the current in-flight request, if any.\r\n protected _inflight: SortedArray<XYAndZ>;\r\n // An event fired when the next request completes.\r\n protected _onCompleted = new BeEvent<() => void>();\r\n // Used for creating cache keys (XYAndZ) from XYZProps without having to allocate temporary objects.\r\n protected readonly _scratchXYZ = { x: 0, y: 0, z: 0 };\r\n protected readonly _maxPointsPerRequest: number;\r\n protected readonly _isIModelClosed: () => boolean;\r\n protected readonly _requestPoints: (points: XYAndZ[]) => Promise<PointWithStatus[]>;\r\n // If true, [[dispatch]] will schedule another dispatch after it receives a response.\r\n // This is needed when all the points requested after the most recent dispatch were included in the currently-in-flight request -\r\n // _pending will be empty but new callers will be awaiting the results of the in-flight request.\r\n protected _redispatchOnCompletion = false;\r\n\r\n public get isIdle(): boolean {\r\n return \"idle\" === this._state;\r\n }\r\n\r\n protected toXYAndZ(input: XYZProps, output: WritableXYAndZ): XYAndZ {\r\n if (Array.isArray(input)) {\r\n output.x = input[0] ?? 0;\r\n output.y = input[1] ?? 0;\r\n output.z = input[2] ?? 0;\r\n } else {\r\n output.x = input.x ?? 0;\r\n output.y = input.y ?? 0;\r\n output.z = input.z ?? 0;\r\n }\r\n\r\n return output;\r\n }\r\n\r\n public constructor(opts: CoordinateConverterOptions) {\r\n this._maxPointsPerRequest = Math.max(1, opts.maxPointsPerRequest ?? 300);\r\n this._isIModelClosed = opts.isIModelClosed;\r\n this._requestPoints = opts.requestPoints;\r\n\r\n this._cache = new Dictionary<XYAndZ, PointWithStatus>(compareXYAndZ, cloneXYAndZ);\r\n this._pending = new SortedArray<XYAndZ>(compareXYAndZ, false, cloneXYAndZ);\r\n this._inflight = new SortedArray<XYAndZ>(compareXYAndZ, false, cloneXYAndZ);\r\n }\r\n\r\n protected async dispatch(): Promise<void> {\r\n assert(this._state === \"scheduled\");\r\n if (this._isIModelClosed() || this._pending.isEmpty) {\r\n this._state = \"idle\";\r\n this._onCompleted.raiseEvent();\r\n return;\r\n }\r\n\r\n this._state = \"in-flight\";\r\n\r\n // Ensure subsequently-enqueued requests listen for the *next* response to be received.\r\n const onCompleted = this._onCompleted;\r\n this._onCompleted = new BeEvent<() => void>();\r\n\r\n // Pending requests are now in flight. Start a new list of pending requests. It's cheaper to swap than to allocate new objects.\r\n const inflight = this._pending;\r\n this._pending = this._inflight;\r\n assert(this._pending.isEmpty);\r\n this._inflight = inflight;\r\n\r\n // Split requests if necessary to avoid requesting more than the maximum allowed number of points.\r\n const promises: Array<Promise<void>> = [];\r\n for (let i = 0; i < inflight.length; i += this._maxPointsPerRequest) {\r\n const requests = inflight.slice(i, i + this._maxPointsPerRequest).extractArray();\r\n const promise = this._requestPoints(requests).then((results) => {\r\n if (this._isIModelClosed())\r\n return;\r\n\r\n if (results.length !== requests.length)\r\n Logger.logError(`${FrontendLoggerCategory.Package}.geoservices`, `requested conversion of ${requests.length} points, but received ${results.length} points`);\r\n\r\n for (let j = 0; j < results.length; j++) {\r\n if (j < requests.length)\r\n this._cache.set(requests[j], results[j]);\r\n }\r\n }).catch((err) => {\r\n Logger.logException(`${FrontendLoggerCategory.Package}.geoservices`, err);\r\n });\r\n\r\n promises.push(promise);\r\n }\r\n\r\n await Promise.all(promises);\r\n\r\n assert(this._state === \"in-flight\");\r\n this._state = \"idle\";\r\n this._inflight.clear();\r\n\r\n // If any more pending conversions arrived while awaiting this request, schedule another request.\r\n if (!this._pending.isEmpty || this._redispatchOnCompletion) {\r\n this._redispatchOnCompletion = false;\r\n this.scheduleDispatch(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n\r\n // Resolve promises of all callers who were awaiting this request.\r\n onCompleted.raiseEvent();\r\n }\r\n\r\n // Add any points not present in cache to pending request list.\r\n // Return the number of points present in cache.\r\n protected enqueue(points: XYZProps[]): number {\r\n let numInCache = 0;\r\n for (const point of points) {\r\n const xyz = this.toXYAndZ(point, this._scratchXYZ);\r\n if (this._cache.get(xyz))\r\n ++numInCache;\r\n else if (this._inflight.contains(xyz))\r\n this._redispatchOnCompletion = true;\r\n else\r\n this._pending.insert(xyz);\r\n }\r\n\r\n return numInCache;\r\n }\r\n\r\n // Obtain converted points from the cache. The assumption is that every point in `inputs` is already present in the cache.\r\n // Any point not present will be returned unconverted with an error status.\r\n protected getFromCache(inputs: XYZProps[]): PointWithStatus[] {\r\n const outputs: PointWithStatus[] = [];\r\n for (const input of inputs) {\r\n const xyz = this.toXYAndZ(input, this._scratchXYZ);\r\n let output = this._cache.get(xyz);\r\n if (!output)\r\n output = { p: { ...xyz }, s: GeoCoordStatus.CSMapError };\r\n\r\n outputs.push(output);\r\n }\r\n\r\n return outputs;\r\n }\r\n\r\n protected async scheduleDispatch(): Promise<void> {\r\n if (\"idle\" === this._state) {\r\n this._state = \"scheduled\";\r\n requestAnimationFrame(() => {\r\n this.dispatch(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n });\r\n }\r\n\r\n return new Promise((resolve) => {\r\n this._onCompleted.addOnce(() => resolve());\r\n });\r\n }\r\n\r\n public async convert(inputs: XYZProps[]): Promise<{ points: PointWithStatus[], fromCache: number }> {\r\n const fromCache = this.enqueue(inputs);\r\n assert(fromCache >= 0);\r\n assert(fromCache <= inputs.length);\r\n\r\n if (fromCache === inputs.length)\r\n return { points: this.getFromCache(inputs), fromCache };\r\n\r\n await this.scheduleDispatch();\r\n\r\n return { points: this.getFromCache(inputs), fromCache };\r\n }\r\n\r\n public findCached(inputs: XYZProps[]): CachedIModelCoordinatesResponseProps {\r\n const result: Array<PointWithStatus | undefined> = [];\r\n let missing: XYZProps[] | undefined;\r\n for (const input of inputs) {\r\n const key = this.toXYAndZ(input, this._scratchXYZ);\r\n const output = this._cache.get(key);\r\n result.push(output);\r\n if (!output) {\r\n if (!missing)\r\n missing = [];\r\n\r\n missing.push(input);\r\n }\r\n }\r\n\r\n return { result, missing };\r\n }\r\n}\r\n\r\n/** Response to a request to obtain imodel coordinates from cache.\r\n * @internal\r\n */\r\nexport interface CachedIModelCoordinatesResponseProps {\r\n /** An array of the same length as the input array, with undefined entries at indices corresponding to points not found in cache. */\r\n result: Array<PointWithStatus | undefined>;\r\n /** An array of points in the input array which were not found in the cache, or undefined if all points were found in the cache. */\r\n missing?: XYZProps[];\r\n}\r\n\r\n/** Options used to create a [[GeoConverter]].\r\n * @internal exported strictly for tests.\r\n */\r\nexport interface GeoConverterOptions {\r\n readonly datum: string;\r\n isIModelClosed: () => boolean;\r\n toIModelCoords: (request: IModelCoordinatesRequestProps) => Promise<PointWithStatus[]>;\r\n fromIModelCoords: (request: GeoCoordinatesRequestProps) => Promise<PointWithStatus[]>;\r\n}\r\n\r\n/** An object capable of communicating with the backend to convert between coordinates in a geographic coordinate system and coordinates in an [[IModelConnection]]'s own coordinate system.\r\n * @see [[GeoServices.getConverter]] to obtain a converter.\r\n * @see [GeographicCRS]($common) for more information about geographic coordinate reference systems.\r\n * @public\r\n */\r\nexport class GeoConverter {\r\n private readonly _geoToIModel: CoordinateConverter;\r\n private readonly _iModelToGeo: CoordinateConverter;\r\n /** Used for removing this converter from GeoServices' cache after all requests are completed.\r\n * @internal\r\n */\r\n public readonly onAllRequestsCompleted = new BeEvent<() => void>();\r\n\r\n /** @internal */\r\n constructor(opts: GeoConverterOptions) {\r\n const isIModelClosed = opts.isIModelClosed;\r\n this._geoToIModel = new CoordinateConverter({\r\n isIModelClosed,\r\n requestPoints: async (geoCoords: XYAndZ[]) => opts.toIModelCoords({ source: opts.datum, geoCoords }),\r\n });\r\n\r\n this._iModelToGeo = new CoordinateConverter({\r\n isIModelClosed,\r\n requestPoints: async (iModelCoords: XYAndZ[]) => opts.fromIModelCoords({ target: opts.datum, iModelCoords }),\r\n });\r\n }\r\n\r\n /** Convert the specified geographic coordinates into iModel coordinates. */\r\n public async convertToIModelCoords(geoPoints: XYZProps[]): Promise<PointWithStatus[]> {\r\n const result = await this.getIModelCoordinatesFromGeoCoordinates(geoPoints);\r\n return result.iModelCoords;\r\n }\r\n\r\n /** Convert the specified iModel coordinates into geographic coordinates. */\r\n public async convertFromIModelCoords(iModelCoords: XYZProps[]): Promise<PointWithStatus[]> {\r\n const result = await this.getGeoCoordinatesFromIModelCoordinates(iModelCoords);\r\n return result.geoCoords;\r\n }\r\n\r\n /** @internal */\r\n public async getIModelCoordinatesFromGeoCoordinates(geoPoints: XYZProps[]): Promise<IModelCoordinatesResponseProps> {\r\n const result = await this._geoToIModel.convert(geoPoints);\r\n this.checkCompletion();\r\n return {\r\n iModelCoords: result.points,\r\n fromCache: result.fromCache,\r\n };\r\n }\r\n\r\n /** @internal */\r\n public async getGeoCoordinatesFromIModelCoordinates(iModelPoints: XYZProps[]): Promise<GeoCoordinatesResponseProps> {\r\n const result = await this._iModelToGeo.convert(iModelPoints);\r\n this.checkCompletion();\r\n return {\r\n geoCoords: result.points,\r\n fromCache: result.fromCache,\r\n };\r\n }\r\n\r\n private checkCompletion(): void {\r\n if (this._geoToIModel.isIdle && this._iModelToGeo.isIdle)\r\n this.onAllRequestsCompleted.raiseEvent();\r\n }\r\n\r\n /** @internal */\r\n public getCachedIModelCoordinatesFromGeoCoordinates(geoPoints: XYZProps[]): CachedIModelCoordinatesResponseProps {\r\n return this._geoToIModel.findCached(geoPoints);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport type GeoServicesOptions = Omit<GeoConverterOptions, \"datum\">;\r\n\r\n/** The Geographic Services available for an [[IModelConnection]].\r\n * @see [[IModelConnection.geoServices]] to obtain the GeoServices for a specific iModel.\r\n * @public\r\n */\r\nexport class GeoServices {\r\n private readonly _options: GeoServicesOptions;\r\n /** Each GeoConverter has its own independent request queue and cache of previously-converted points.\r\n * Some callers like RealityTileTree obtain a single GeoConverter and reuse it throughout their own lifetime. Therefore they benefit from both batching and caching, and\r\n * the cache gets deleted once the RealityTileTree becomes disused.\r\n *\r\n * Other callers like IModelConnection.spatialToCartographic obtain a new GeoConverter every time they need one, use it to convert a single point(!), and then discard the converter.\r\n * This entirely prevents batching - e.g., calling spatialToCartographic 20 times in one frame results in 20 http requests.\r\n * To address that, we cache each GeoConverter returned by getConverter until it has converted at least one point and has no further outstanding conversion requests.\r\n * In this way, the converter lives for as long as (and no longer than) any caller is awaiting conversion to/from its datum - it and its cache are deleted once it becomes disused.\r\n * This makes the coordinate caching generally less useful, but at least bounded - and maximizes batching of requests.\r\n */\r\n private readonly _cache = new Map<string, GeoConverter>();\r\n\r\n /** @internal */\r\n public constructor(options: GeoServicesOptions) {\r\n this._options = options;\r\n }\r\n\r\n /** @internal */\r\n public static createForIModel(iModel: IModelConnection): GeoServices {\r\n return new GeoServices({\r\n isIModelClosed: () => iModel.isClosed,\r\n toIModelCoords: async (request) => {\r\n const rpc = IModelReadRpcInterface.getClientForRouting(iModel.routingContext.token);\r\n const response = await rpc.getIModelCoordinatesFromGeoCoordinates(iModel.getRpcProps(), request);\r\n return response.iModelCoords;\r\n },\r\n fromIModelCoords: async (request) => {\r\n const rpc = IModelReadRpcInterface.getClientForRouting(iModel.routingContext.token);\r\n const response = await rpc.getGeoCoordinatesFromIModelCoordinates(iModel.getRpcProps(), request);\r\n return response.geoCoords;\r\n },\r\n });\r\n }\r\n\r\n /** Obtain a converter that can convert between a geographic coordinate system and the iModel's own coordinate system.\r\n * @param datumOrGCRS The name or JSON representation of the geographic coordinate system datum - for example, \"WGS84\".\r\n * @returns a converter, or `undefined` if the iModel is not open.\r\n * @note A [[BlankConnection]] has no connection to a backend, so it is never \"open\"; therefore it always returns `undefined`.\r\n */\r\n public getConverter(datumOrGCRS?: string | GeographicCRSProps): GeoConverter | undefined {\r\n if (this._options.isIModelClosed())\r\n return undefined;\r\n\r\n const datum = (typeof datumOrGCRS === \"object\" ? JSON.stringify(datumOrGCRS) : datumOrGCRS) ?? \"\";\r\n\r\n let converter = this._cache.get(datum);\r\n if (!converter) {\r\n converter = new GeoConverter({ ...this._options, datum });\r\n this._cache.set(datum, converter);\r\n\r\n converter.onAllRequestsCompleted.addOnce(() => {\r\n if (converter === this._cache.get(datum))\r\n this._cache.delete(datum);\r\n });\r\n }\r\n\r\n return converter;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"GeoServices.js","sourceRoot":"","sources":["../../src/GeoServices.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module IModelConnection\n */\n\n// cspell:ignore GCRS\nimport {\n assert, BeEvent, Dictionary, Logger, SortedArray,\n} from \"@itwin/core-bentley\";\nimport { WritableXYAndZ, XYAndZ, XYZProps } from \"@itwin/core-geometry\";\nimport {\n GeoCoordinatesRequestProps, GeoCoordinatesResponseProps, GeoCoordStatus, GeographicCRSProps, IModelCoordinatesRequestProps, IModelCoordinatesResponseProps,\n IModelReadRpcInterface, PointWithStatus,\n} from \"@itwin/core-common\";\nimport { IModelConnection } from \"./IModelConnection\";\nimport { FrontendLoggerCategory } from \"./common/FrontendLoggerCategory\";\n\n/** Options used to create a [[CoordinateConverter]].\n * @internal exported strictly for tests.\n */\nexport interface CoordinateConverterOptions {\n isIModelClosed: () => boolean;\n /** Asynchronously convert each point. The resultant array should have the same number and order of points as the input. */\n requestPoints: (points: XYAndZ[]) => Promise<PointWithStatus[]>;\n /** Maximum number of points to include in each request. Default: 300. */\n maxPointsPerRequest?: number;\n}\n\nfunction compareXYAndZ(lhs: XYAndZ, rhs: XYAndZ): number {\n return lhs.x - rhs.x || lhs.y - rhs.y || lhs.z - rhs.z;\n}\n\nfunction cloneXYAndZ(xyz: XYAndZ): XYAndZ {\n return { x: xyz.x, y: xyz.y, z: xyz.z };\n}\n\ntype CoordinateConverterState =\n // No pending requests.\n \"idle\" |\n // We have scheduled a requestAnimationFrame to dispatch all pending requests.\n \"scheduled\" |\n // We have dispatched all requests that were pending at the most recent requestAnimationFrame callback.\n \"in-flight\";\n\n/** Performs conversion of coordinates from one coordinate system to another.\n * A [[GeoConverter]] has a pair of these for converting between iModel coordinates and geographic coordinates.\n * Uses a cache to avoid repeatedly requesting the same points, and a batching strategy to avoid making frequent small requests.\n * The cache stores every point that was ever converted by [[convert]]. It is currently permitted to grow to unbounded size.\n * The batching works as follows:\n * When a conversion is requested via [[convert]], if all the requested points are in the cache, they are returned immediately.\n * Otherwise, any points not in the cache and not in the current in-flight request (if any) are placed onto the queue of pending requests.\n * A pending request is scheduled if one hasn't already been scheduled, via requestAnimationFrame.\n * In the animation frame callback, the pending requests are split into batches of no more than options.maxPointsPerRequest and dispatched to the backend.\n * Once the response is received, the results are loaded into and returned from the cache.\n * If more calls to convert occurred while the request was in flight, another request is dispatched.\n * @internal exported strictly for tests.\n */\nexport class CoordinateConverter {\n protected readonly _cache: Dictionary<XYAndZ, PointWithStatus>;\n protected _state: CoordinateConverterState = \"idle\";\n // The accumulated set of points to be converted by the next request.\n protected _pending: SortedArray<XYAndZ>;\n // The set of points that were included in the current in-flight request, if any.\n protected _inflight: SortedArray<XYAndZ>;\n // An event fired when the next request completes.\n protected _onCompleted = new BeEvent<() => void>();\n // Used for creating cache keys (XYAndZ) from XYZProps without having to allocate temporary objects.\n protected readonly _scratchXYZ = { x: 0, y: 0, z: 0 };\n protected readonly _maxPointsPerRequest: number;\n protected readonly _isIModelClosed: () => boolean;\n protected readonly _requestPoints: (points: XYAndZ[]) => Promise<PointWithStatus[]>;\n // If true, [[dispatch]] will schedule another dispatch after it receives a response.\n // This is needed when all the points requested after the most recent dispatch were included in the currently-in-flight request -\n // _pending will be empty but new callers will be awaiting the results of the in-flight request.\n protected _redispatchOnCompletion = false;\n\n public get isIdle(): boolean {\n return \"idle\" === this._state;\n }\n\n protected toXYAndZ(input: XYZProps, output: WritableXYAndZ): XYAndZ {\n if (Array.isArray(input)) {\n output.x = input[0] ?? 0;\n output.y = input[1] ?? 0;\n output.z = input[2] ?? 0;\n } else {\n output.x = input.x ?? 0;\n output.y = input.y ?? 0;\n output.z = input.z ?? 0;\n }\n\n return output;\n }\n\n public constructor(opts: CoordinateConverterOptions) {\n this._maxPointsPerRequest = Math.max(1, opts.maxPointsPerRequest ?? 300);\n this._isIModelClosed = opts.isIModelClosed;\n this._requestPoints = opts.requestPoints;\n\n this._cache = new Dictionary<XYAndZ, PointWithStatus>(compareXYAndZ, cloneXYAndZ);\n this._pending = new SortedArray<XYAndZ>(compareXYAndZ, false, cloneXYAndZ);\n this._inflight = new SortedArray<XYAndZ>(compareXYAndZ, false, cloneXYAndZ);\n }\n\n protected async dispatch(): Promise<void> {\n assert(this._state === \"scheduled\");\n if (this._isIModelClosed() || this._pending.isEmpty) {\n this._state = \"idle\";\n this._onCompleted.raiseEvent();\n return;\n }\n\n this._state = \"in-flight\";\n\n // Ensure subsequently-enqueued requests listen for the *next* response to be received.\n const onCompleted = this._onCompleted;\n this._onCompleted = new BeEvent<() => void>();\n\n // Pending requests are now in flight. Start a new list of pending requests. It's cheaper to swap than to allocate new objects.\n const inflight = this._pending;\n this._pending = this._inflight;\n assert(this._pending.isEmpty);\n this._inflight = inflight;\n\n // Split requests if necessary to avoid requesting more than the maximum allowed number of points.\n const promises: Array<Promise<void>> = [];\n for (let i = 0; i < inflight.length; i += this._maxPointsPerRequest) {\n const requests = inflight.slice(i, i + this._maxPointsPerRequest).extractArray();\n const promise = this._requestPoints(requests).then((results) => {\n if (this._isIModelClosed())\n return;\n\n if (results.length !== requests.length)\n Logger.logError(`${FrontendLoggerCategory.Package}.geoservices`, `requested conversion of ${requests.length} points, but received ${results.length} points`);\n\n for (let j = 0; j < results.length; j++) {\n if (j < requests.length)\n this._cache.set(requests[j], results[j]);\n }\n }).catch((err) => {\n Logger.logException(`${FrontendLoggerCategory.Package}.geoservices`, err);\n });\n\n promises.push(promise);\n }\n\n await Promise.all(promises);\n\n assert(this._state === \"in-flight\");\n this._state = \"idle\";\n this._inflight.clear();\n\n // If any more pending conversions arrived while awaiting this request, schedule another request.\n if (!this._pending.isEmpty || this._redispatchOnCompletion) {\n this._redispatchOnCompletion = false;\n this.scheduleDispatch(); // eslint-disable-line @typescript-eslint/no-floating-promises\n }\n\n // Resolve promises of all callers who were awaiting this request.\n onCompleted.raiseEvent();\n }\n\n // Add any points not present in cache to pending request list.\n // Return the number of points present in cache.\n protected enqueue(points: XYZProps[]): number {\n let numInCache = 0;\n for (const point of points) {\n const xyz = this.toXYAndZ(point, this._scratchXYZ);\n if (this._cache.get(xyz))\n ++numInCache;\n else if (this._inflight.contains(xyz))\n this._redispatchOnCompletion = true;\n else\n this._pending.insert(xyz);\n }\n\n return numInCache;\n }\n\n // Obtain converted points from the cache. The assumption is that every point in `inputs` is already present in the cache.\n // Any point not present will be returned unconverted with an error status.\n protected getFromCache(inputs: XYZProps[]): PointWithStatus[] {\n const outputs: PointWithStatus[] = [];\n for (const input of inputs) {\n const xyz = this.toXYAndZ(input, this._scratchXYZ);\n let output = this._cache.get(xyz);\n if (!output)\n output = { p: { ...xyz }, s: GeoCoordStatus.CSMapError };\n\n outputs.push(output);\n }\n\n return outputs;\n }\n\n protected async scheduleDispatch(): Promise<void> {\n if (\"idle\" === this._state) {\n this._state = \"scheduled\";\n requestAnimationFrame(() => {\n this.dispatch(); // eslint-disable-line @typescript-eslint/no-floating-promises\n });\n }\n\n return new Promise((resolve) => {\n this._onCompleted.addOnce(() => resolve());\n });\n }\n\n public async convert(inputs: XYZProps[]): Promise<{ points: PointWithStatus[], fromCache: number }> {\n const fromCache = this.enqueue(inputs);\n assert(fromCache >= 0);\n assert(fromCache <= inputs.length);\n\n if (fromCache === inputs.length)\n return { points: this.getFromCache(inputs), fromCache };\n\n await this.scheduleDispatch();\n\n return { points: this.getFromCache(inputs), fromCache };\n }\n\n public findCached(inputs: XYZProps[]): CachedIModelCoordinatesResponseProps {\n const result: Array<PointWithStatus | undefined> = [];\n let missing: XYZProps[] | undefined;\n for (const input of inputs) {\n const key = this.toXYAndZ(input, this._scratchXYZ);\n const output = this._cache.get(key);\n result.push(output);\n if (!output) {\n if (!missing)\n missing = [];\n\n missing.push(input);\n }\n }\n\n return { result, missing };\n }\n}\n\n/** Response to a request to obtain imodel coordinates from cache.\n * @internal\n */\nexport interface CachedIModelCoordinatesResponseProps {\n /** An array of the same length as the input array, with undefined entries at indices corresponding to points not found in cache. */\n result: Array<PointWithStatus | undefined>;\n /** An array of points in the input array which were not found in the cache, or undefined if all points were found in the cache. */\n missing?: XYZProps[];\n}\n\n/** Options used to create a [[GeoConverter]].\n * @internal exported strictly for tests.\n */\nexport interface GeoConverterOptions {\n readonly datum: string;\n isIModelClosed: () => boolean;\n toIModelCoords: (request: IModelCoordinatesRequestProps) => Promise<PointWithStatus[]>;\n fromIModelCoords: (request: GeoCoordinatesRequestProps) => Promise<PointWithStatus[]>;\n}\n\n/** An object capable of communicating with the backend to convert between coordinates in a geographic coordinate system and coordinates in an [[IModelConnection]]'s own coordinate system.\n * @see [[GeoServices.getConverter]] to obtain a converter.\n * @see [GeographicCRS]($common) for more information about geographic coordinate reference systems.\n * @public\n */\nexport class GeoConverter {\n private readonly _geoToIModel: CoordinateConverter;\n private readonly _iModelToGeo: CoordinateConverter;\n /** Used for removing this converter from GeoServices' cache after all requests are completed.\n * @internal\n */\n public readonly onAllRequestsCompleted = new BeEvent<() => void>();\n\n /** @internal */\n constructor(opts: GeoConverterOptions) {\n const isIModelClosed = opts.isIModelClosed;\n this._geoToIModel = new CoordinateConverter({\n isIModelClosed,\n requestPoints: async (geoCoords: XYAndZ[]) => opts.toIModelCoords({ source: opts.datum, geoCoords }),\n });\n\n this._iModelToGeo = new CoordinateConverter({\n isIModelClosed,\n requestPoints: async (iModelCoords: XYAndZ[]) => opts.fromIModelCoords({ target: opts.datum, iModelCoords }),\n });\n }\n\n /** Convert the specified geographic coordinates into iModel coordinates. */\n public async convertToIModelCoords(geoPoints: XYZProps[]): Promise<PointWithStatus[]> {\n const result = await this.getIModelCoordinatesFromGeoCoordinates(geoPoints);\n return result.iModelCoords;\n }\n\n /** Convert the specified iModel coordinates into geographic coordinates. */\n public async convertFromIModelCoords(iModelCoords: XYZProps[]): Promise<PointWithStatus[]> {\n const result = await this.getGeoCoordinatesFromIModelCoordinates(iModelCoords);\n return result.geoCoords;\n }\n\n /** @internal */\n public async getIModelCoordinatesFromGeoCoordinates(geoPoints: XYZProps[]): Promise<IModelCoordinatesResponseProps> {\n const result = await this._geoToIModel.convert(geoPoints);\n this.checkCompletion();\n return {\n iModelCoords: result.points,\n fromCache: result.fromCache,\n };\n }\n\n /** @internal */\n public async getGeoCoordinatesFromIModelCoordinates(iModelPoints: XYZProps[]): Promise<GeoCoordinatesResponseProps> {\n const result = await this._iModelToGeo.convert(iModelPoints);\n this.checkCompletion();\n return {\n geoCoords: result.points,\n fromCache: result.fromCache,\n };\n }\n\n private checkCompletion(): void {\n if (this._geoToIModel.isIdle && this._iModelToGeo.isIdle)\n this.onAllRequestsCompleted.raiseEvent();\n }\n\n /** @internal */\n public getCachedIModelCoordinatesFromGeoCoordinates(geoPoints: XYZProps[]): CachedIModelCoordinatesResponseProps {\n return this._geoToIModel.findCached(geoPoints);\n }\n}\n\n/** @internal */\nexport type GeoServicesOptions = Omit<GeoConverterOptions, \"datum\">;\n\n/** The Geographic Services available for an [[IModelConnection]].\n * @see [[IModelConnection.geoServices]] to obtain the GeoServices for a specific iModel.\n * @public\n */\nexport class GeoServices {\n private readonly _options: GeoServicesOptions;\n /** Each GeoConverter has its own independent request queue and cache of previously-converted points.\n * Some callers like RealityTileTree obtain a single GeoConverter and reuse it throughout their own lifetime. Therefore they benefit from both batching and caching, and\n * the cache gets deleted once the RealityTileTree becomes disused.\n *\n * Other callers like IModelConnection.spatialToCartographic obtain a new GeoConverter every time they need one, use it to convert a single point(!), and then discard the converter.\n * This entirely prevents batching - e.g., calling spatialToCartographic 20 times in one frame results in 20 http requests.\n * To address that, we cache each GeoConverter returned by getConverter until it has converted at least one point and has no further outstanding conversion requests.\n * In this way, the converter lives for as long as (and no longer than) any caller is awaiting conversion to/from its datum - it and its cache are deleted once it becomes disused.\n * This makes the coordinate caching generally less useful, but at least bounded - and maximizes batching of requests.\n */\n private readonly _cache = new Map<string, GeoConverter>();\n\n /** @internal */\n public constructor(options: GeoServicesOptions) {\n this._options = options;\n }\n\n /** @internal */\n public static createForIModel(iModel: IModelConnection): GeoServices {\n return new GeoServices({\n isIModelClosed: () => iModel.isClosed,\n toIModelCoords: async (request) => {\n const rpc = IModelReadRpcInterface.getClientForRouting(iModel.routingContext.token);\n const response = await rpc.getIModelCoordinatesFromGeoCoordinates(iModel.getRpcProps(), request);\n return response.iModelCoords;\n },\n fromIModelCoords: async (request) => {\n const rpc = IModelReadRpcInterface.getClientForRouting(iModel.routingContext.token);\n const response = await rpc.getGeoCoordinatesFromIModelCoordinates(iModel.getRpcProps(), request);\n return response.geoCoords;\n },\n });\n }\n\n /** Obtain a converter that can convert between a geographic coordinate system and the iModel's own coordinate system.\n * @param datumOrGCRS The name or JSON representation of the geographic coordinate system datum - for example, \"WGS84\".\n * @returns a converter, or `undefined` if the iModel is not open.\n * @note A [[BlankConnection]] has no connection to a backend, so it is never \"open\"; therefore it always returns `undefined`.\n */\n public getConverter(datumOrGCRS?: string | GeographicCRSProps): GeoConverter | undefined {\n if (this._options.isIModelClosed())\n return undefined;\n\n const datum = (typeof datumOrGCRS === \"object\" ? JSON.stringify(datumOrGCRS) : datumOrGCRS) ?? \"\";\n\n let converter = this._cache.get(datum);\n if (!converter) {\n converter = new GeoConverter({ ...this._options, datum });\n this._cache.set(datum, converter);\n\n converter.onAllRequestsCompleted.addOnce(() => {\n if (converter === this._cache.get(datum))\n this._cache.delete(datum);\n });\n }\n\n return converter;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"GlobeAnimator.js","sourceRoot":"","sources":["../../src/GlobeAnimator.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Views\r\n */\r\n\r\nimport { Arc3d, Geometry, Point3d, SmoothTransformBetweenFrusta } from \"@itwin/core-geometry\";\r\nimport { Cartographic, Easing, Frustum, GlobeMode, Interpolation, Tweens } from \"@itwin/core-common\";\r\nimport {\r\n areaToEyeHeight, areaToEyeHeightFromGcs, eyeToCartographicOnGlobe, GlobalLocation, metersToRange, ViewGlobalLocationConstants,\r\n} from \"./ViewGlobalLocation\";\r\nimport { ScreenViewport } from \"./Viewport\";\r\nimport { Animator } from \"./ViewAnimation\";\r\n\r\n/** Animates the transition of a [[Viewport]] to view a location on the Earth. The animation traces a flight path from the viewport's current [Frustum]($common) to the destination.\r\n * The duration of the animation varies based on the distance traversed.\r\n * @see [[Viewport.animateFlyoverToGlobalLocation]].\r\n * @public\r\n * @extensions\r\n */\r\nexport class GlobeAnimator implements Animator {\r\n protected _flightTweens = new Tweens();\r\n protected _viewport: ScreenViewport;\r\n protected _startCartographic?: Cartographic;\r\n protected _ellipsoidArc?: Arc3d;\r\n protected _columbusLine: Point3d[] = [];\r\n protected _flightLength = 0;\r\n protected _endLocation: GlobalLocation;\r\n protected _endHeight?: number;\r\n protected _midHeight?: number;\r\n protected _startHeight?: number;\r\n protected _fixTakeoffInterpolator?: SmoothTransformBetweenFrusta;\r\n protected _fixTakeoffFraction?: number;\r\n protected _fixLandingInterpolator?: SmoothTransformBetweenFrusta;\r\n protected _afterLanding: Frustum;\r\n protected _afterFocusDistance: number;\r\n protected readonly _fixLandingFraction: number = 0.9;\r\n protected readonly _scratchFrustum = new Frustum();\r\n\r\n protected _moveFlightToFraction(fraction: number): boolean {\r\n const vp = this._viewport;\r\n const view = vp.view;\r\n\r\n if (!(view.is3d()) || !vp.iModel.isGeoLocated) // This animation only works for 3d views and geolocated models\r\n return true;\r\n\r\n // If we're done, set the final state directly\r\n if (fraction >= 1.0) {\r\n if (vp.view.is3d()) // Need to reset focus as well -- setupViewFromFustum does not set this and it will remain at flight distance.\r\n vp.view.camera.setFocusDistance(this._afterFocusDistance);\r\n vp.setupViewFromFrustum(this._afterLanding);\r\n vp.synchWithView();\r\n return true;\r\n }\r\n\r\n // Possibly smooth the takeoff\r\n if (fraction < this._fixTakeoffFraction! && this._fixTakeoffInterpolator !== undefined) {\r\n this._moveFixToFraction((1.0 / this._fixTakeoffFraction!) * fraction, this._fixTakeoffInterpolator);\r\n return false;\r\n }\r\n\r\n // Possibly smooth the landing\r\n if (fraction >= this._fixLandingFraction && fraction < 1.0) {\r\n if (this._fixLandingInterpolator === undefined) {\r\n const beforeLanding = vp.getWorldFrustum();\r\n this._fixLandingInterpolator = SmoothTransformBetweenFrusta.create(beforeLanding.points, this._afterLanding.points);\r\n }\r\n this._moveFixToFraction((1.0 / (1.0 - this._fixLandingFraction)) * (fraction - this._fixLandingFraction), this._fixLandingInterpolator!);\r\n return false;\r\n }\r\n\r\n // Set the camera based on a fraction along the flight arc\r\n const height: number = Interpolation.Bezier([this._startHeight, this._midHeight, this._endHeight], fraction);\r\n let targetPoint: Point3d;\r\n if (view.globeMode === GlobeMode.Plane)\r\n targetPoint = this._columbusLine[0].interpolate(fraction, this._columbusLine[1]);\r\n else\r\n targetPoint = this._ellipsoidArc!.fractionToPoint(fraction);\r\n view.lookAtGlobalLocation(height, ViewGlobalLocationConstants.birdPitchAngleRadians, undefined, targetPoint);\r\n vp.setupFromView();\r\n\r\n return false;\r\n }\r\n\r\n /** Apply a SmoothTransformBetweenFrusta interpolator to the view based on a fraction. */\r\n protected _moveFixToFraction(fract: number, interpolator: SmoothTransformBetweenFrusta): boolean {\r\n let done = false;\r\n\r\n if (fract >= 1.0) {\r\n fract = 1.0;\r\n done = true;\r\n }\r\n\r\n interpolator.fractionToWorldCorners(Math.max(fract, 0), this._scratchFrustum.points);\r\n this._viewport.setupViewFromFrustum(this._scratchFrustum);\r\n return done;\r\n }\r\n\r\n /** Create an animator to transition to the specified destination.\r\n * @param viewport The viewport to animate.\r\n * @param destination The destination to travel to.\r\n * @returns An animator, or undefined if the viewport's iModel is not geolocated or its view is not 3d.\r\n */\r\n public static async create(viewport: ScreenViewport, destination: GlobalLocation): Promise<GlobeAnimator | undefined> {\r\n const view = viewport.view;\r\n\r\n if (!(view.is3d()) || !viewport.iModel.isGeoLocated) // This animation only works for 3d views and geolocated models\r\n return undefined;\r\n\r\n const endHeight = destination.area !== undefined ? await areaToEyeHeightFromGcs(view, destination.area, destination.center.height) : ViewGlobalLocationConstants.birdHeightAboveEarthInMeters;\r\n\r\n const beforeFrustum = viewport.getWorldFrustum();\r\n await view.lookAtGlobalLocationFromGcs(endHeight, ViewGlobalLocationConstants.birdPitchAngleRadians, destination);\r\n viewport.setupFromView();\r\n const afterLanding = viewport.getWorldFrustum();\r\n const afterFocus = view.camera.focusDist;\r\n viewport.setupViewFromFrustum(beforeFrustum); // revert old frustum\r\n\r\n return new GlobeAnimator(viewport, destination, afterLanding, afterFocus);\r\n }\r\n\r\n protected constructor(viewport: ScreenViewport, destination: GlobalLocation, afterLanding: Frustum, afterFocus: number) {\r\n this._viewport = viewport;\r\n this._endLocation = destination;\r\n this._afterLanding = afterLanding;\r\n this._afterFocusDistance = afterFocus;\r\n const view = viewport.view;\r\n\r\n if (!(view.is3d()) || !viewport.iModel.isGeoLocated) // This animation only works for 3d views and geolocated models\r\n return;\r\n\r\n // Calculate start height as the height of the current eye above the earth.\r\n // Calculate end height from the destination area (if specified); otherwise, use a constant value.\r\n const backgroundMapGeometry = view.displayStyle.getBackgroundMapGeometry();\r\n if (undefined === backgroundMapGeometry)\r\n return;\r\n\r\n this._startHeight = eyeToCartographicOnGlobe(this._viewport, true)!.height;\r\n this._endHeight = destination.area !== undefined ? areaToEyeHeight(view, destination.area, destination.center.height) : ViewGlobalLocationConstants.birdHeightAboveEarthInMeters;\r\n\r\n // Starting cartographic position is the eye projected onto the globe.\r\n let startCartographic = eyeToCartographicOnGlobe(viewport);\r\n if (startCartographic === undefined) {\r\n startCartographic = Cartographic.createZero();\r\n }\r\n this._startCartographic = startCartographic;\r\n\r\n let maxFlightDuration: number;\r\n\r\n if (view.globeMode === GlobeMode.Plane) {\r\n // Calculate a line segment going from the starting cartographic coordinate to the ending cartographic coordinate\r\n this._columbusLine.push(view.cartographicToRoot(startCartographic)!);\r\n this._columbusLine.push(view.cartographicToRoot(this._endLocation.center)!);\r\n this._flightLength = this._columbusLine[0].distance(this._columbusLine[1]);\r\n // Set a shorter flight duration in Plane mode\r\n maxFlightDuration = 7000.0;\r\n } else {\r\n // Calculate a flight arc from the ellipsoid of the Earth and the starting and ending cartographic coordinates.\r\n const earthEllipsoid = backgroundMapGeometry.getEarthEllipsoid();\r\n this._ellipsoidArc = earthEllipsoid.radiansPairToGreatArc(this._startCartographic.longitude, this._startCartographic.latitude, this._endLocation.center.longitude, this._endLocation.center.latitude)!;\r\n if (this._ellipsoidArc !== undefined)\r\n this._flightLength = this._ellipsoidArc.curveLength();\r\n // Set a longer flight duration in 3D mode\r\n maxFlightDuration = 13000.0;\r\n }\r\n\r\n if (Geometry.isSmallMetricDistance(this._flightLength))\r\n return;\r\n\r\n // The peak of the flight varies based on total distance to travel. The larger the distance, the higher the peak of the flight will be.\r\n this._midHeight = metersToRange(this._flightLength,\r\n ViewGlobalLocationConstants.birdHeightAboveEarthInMeters,\r\n ViewGlobalLocationConstants.satelliteHeightAboveEarthInMeters * 4,\r\n ViewGlobalLocationConstants.largestEarthArc);\r\n\r\n // We will \"fix\" the initial frustum so it smoothly transitions to some point along the travel arc depending on the starting height.\r\n // Alternatively, if the distance to travel is small enough, we will _only_ do a frustum transition to the destination location - ignoring the flight arc.\r\n const beforeTakeoff = viewport.getWorldFrustum();\r\n\r\n if (view.globeMode === GlobeMode.Plane) {\r\n /// Do not \"fix\" the take-off for plane mode; SmoothTransformBetweenFrusta can behave wrongly.\r\n // However, if within driving distance, still use SmoothTransformBetweenFrusta to navigate there without flight.\r\n this._fixTakeoffFraction = this._flightLength <= ViewGlobalLocationConstants.maximumDistanceToDrive ? 1.0 : 0.0;\r\n } else {\r\n this._fixTakeoffFraction = this._flightLength <= ViewGlobalLocationConstants.maximumDistanceToDrive ? 1.0 : metersToRange(this._startHeight, 0.1, 0.4, ViewGlobalLocationConstants.birdHeightAboveEarthInMeters);\r\n }\r\n\r\n if (this._fixTakeoffFraction > 0.0) {\r\n this._moveFlightToFraction(this._fixTakeoffFraction);\r\n const afterTakeoff = viewport.getWorldFrustum();\r\n this._fixTakeoffInterpolator = SmoothTransformBetweenFrusta.create(beforeTakeoff.points, afterTakeoff.points);\r\n }\r\n\r\n // The duration of the animation will increase the larger the distance to travel.\r\n const flightDurationInMilliseconds = metersToRange(this._flightLength, 1000, maxFlightDuration, ViewGlobalLocationConstants.largestEarthArc);\r\n\r\n // Specify the tweening behavior for this animation.\r\n this._flightTweens.create({ fraction: 0.0 }, {\r\n to: { fraction: 1.0 },\r\n duration: flightDurationInMilliseconds,\r\n easing: Easing.Cubic.InOut,\r\n start: true,\r\n onUpdate: (obj: any) => this._moveFlightToFraction(obj.fraction),\r\n });\r\n }\r\n\r\n /** @internal */\r\n public animate() {\r\n if (this._flightLength <= 0) {\r\n this._moveFlightToFraction(1.0); // Skip to final frustum\r\n return true;\r\n }\r\n return !this._flightTweens.update();\r\n }\r\n\r\n /** @internal */\r\n public interrupt() {\r\n this._moveFlightToFraction(1.0); // Skip to final frustum\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"GlobeAnimator.js","sourceRoot":"","sources":["../../src/GlobeAnimator.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Views\n */\n\nimport { Arc3d, Geometry, Point3d, SmoothTransformBetweenFrusta } from \"@itwin/core-geometry\";\nimport { Cartographic, Easing, Frustum, GlobeMode, Interpolation, Tweens } from \"@itwin/core-common\";\nimport {\n areaToEyeHeight, areaToEyeHeightFromGcs, eyeToCartographicOnGlobe, GlobalLocation, metersToRange, ViewGlobalLocationConstants,\n} from \"./ViewGlobalLocation\";\nimport { ScreenViewport } from \"./Viewport\";\nimport { Animator } from \"./ViewAnimation\";\n\n/** Animates the transition of a [[Viewport]] to view a location on the Earth. The animation traces a flight path from the viewport's current [Frustum]($common) to the destination.\n * The duration of the animation varies based on the distance traversed.\n * @see [[Viewport.animateFlyoverToGlobalLocation]].\n * @public\n * @extensions\n */\nexport class GlobeAnimator implements Animator {\n protected _flightTweens = new Tweens();\n protected _viewport: ScreenViewport;\n protected _startCartographic?: Cartographic;\n protected _ellipsoidArc?: Arc3d;\n protected _columbusLine: Point3d[] = [];\n protected _flightLength = 0;\n protected _endLocation: GlobalLocation;\n protected _endHeight?: number;\n protected _midHeight?: number;\n protected _startHeight?: number;\n protected _fixTakeoffInterpolator?: SmoothTransformBetweenFrusta;\n protected _fixTakeoffFraction?: number;\n protected _fixLandingInterpolator?: SmoothTransformBetweenFrusta;\n protected _afterLanding: Frustum;\n protected _afterFocusDistance: number;\n protected readonly _fixLandingFraction: number = 0.9;\n protected readonly _scratchFrustum = new Frustum();\n\n protected _moveFlightToFraction(fraction: number): boolean {\n const vp = this._viewport;\n const view = vp.view;\n\n if (!(view.is3d()) || !vp.iModel.isGeoLocated) // This animation only works for 3d views and geolocated models\n return true;\n\n // If we're done, set the final state directly\n if (fraction >= 1.0) {\n if (vp.view.is3d()) // Need to reset focus as well -- setupViewFromFustum does not set this and it will remain at flight distance.\n vp.view.camera.setFocusDistance(this._afterFocusDistance);\n vp.setupViewFromFrustum(this._afterLanding);\n vp.synchWithView();\n return true;\n }\n\n // Possibly smooth the takeoff\n if (fraction < this._fixTakeoffFraction! && this._fixTakeoffInterpolator !== undefined) {\n this._moveFixToFraction((1.0 / this._fixTakeoffFraction!) * fraction, this._fixTakeoffInterpolator);\n return false;\n }\n\n // Possibly smooth the landing\n if (fraction >= this._fixLandingFraction && fraction < 1.0) {\n if (this._fixLandingInterpolator === undefined) {\n const beforeLanding = vp.getWorldFrustum();\n this._fixLandingInterpolator = SmoothTransformBetweenFrusta.create(beforeLanding.points, this._afterLanding.points);\n }\n this._moveFixToFraction((1.0 / (1.0 - this._fixLandingFraction)) * (fraction - this._fixLandingFraction), this._fixLandingInterpolator!);\n return false;\n }\n\n // Set the camera based on a fraction along the flight arc\n const height: number = Interpolation.Bezier([this._startHeight, this._midHeight, this._endHeight], fraction);\n let targetPoint: Point3d;\n if (view.globeMode === GlobeMode.Plane)\n targetPoint = this._columbusLine[0].interpolate(fraction, this._columbusLine[1]);\n else\n targetPoint = this._ellipsoidArc!.fractionToPoint(fraction);\n view.lookAtGlobalLocation(height, ViewGlobalLocationConstants.birdPitchAngleRadians, undefined, targetPoint);\n vp.setupFromView();\n\n return false;\n }\n\n /** Apply a SmoothTransformBetweenFrusta interpolator to the view based on a fraction. */\n protected _moveFixToFraction(fract: number, interpolator: SmoothTransformBetweenFrusta): boolean {\n let done = false;\n\n if (fract >= 1.0) {\n fract = 1.0;\n done = true;\n }\n\n interpolator.fractionToWorldCorners(Math.max(fract, 0), this._scratchFrustum.points);\n this._viewport.setupViewFromFrustum(this._scratchFrustum);\n return done;\n }\n\n /** Create an animator to transition to the specified destination.\n * @param viewport The viewport to animate.\n * @param destination The destination to travel to.\n * @returns An animator, or undefined if the viewport's iModel is not geolocated or its view is not 3d.\n */\n public static async create(viewport: ScreenViewport, destination: GlobalLocation): Promise<GlobeAnimator | undefined> {\n const view = viewport.view;\n\n if (!(view.is3d()) || !viewport.iModel.isGeoLocated) // This animation only works for 3d views and geolocated models\n return undefined;\n\n const endHeight = destination.area !== undefined ? await areaToEyeHeightFromGcs(view, destination.area, destination.center.height) : ViewGlobalLocationConstants.birdHeightAboveEarthInMeters;\n\n const beforeFrustum = viewport.getWorldFrustum();\n await view.lookAtGlobalLocationFromGcs(endHeight, ViewGlobalLocationConstants.birdPitchAngleRadians, destination);\n viewport.setupFromView();\n const afterLanding = viewport.getWorldFrustum();\n const afterFocus = view.camera.focusDist;\n viewport.setupViewFromFrustum(beforeFrustum); // revert old frustum\n\n return new GlobeAnimator(viewport, destination, afterLanding, afterFocus);\n }\n\n protected constructor(viewport: ScreenViewport, destination: GlobalLocation, afterLanding: Frustum, afterFocus: number) {\n this._viewport = viewport;\n this._endLocation = destination;\n this._afterLanding = afterLanding;\n this._afterFocusDistance = afterFocus;\n const view = viewport.view;\n\n if (!(view.is3d()) || !viewport.iModel.isGeoLocated) // This animation only works for 3d views and geolocated models\n return;\n\n // Calculate start height as the height of the current eye above the earth.\n // Calculate end height from the destination area (if specified); otherwise, use a constant value.\n const backgroundMapGeometry = view.displayStyle.getBackgroundMapGeometry();\n if (undefined === backgroundMapGeometry)\n return;\n\n this._startHeight = eyeToCartographicOnGlobe(this._viewport, true)!.height;\n this._endHeight = destination.area !== undefined ? areaToEyeHeight(view, destination.area, destination.center.height) : ViewGlobalLocationConstants.birdHeightAboveEarthInMeters;\n\n // Starting cartographic position is the eye projected onto the globe.\n let startCartographic = eyeToCartographicOnGlobe(viewport);\n if (startCartographic === undefined) {\n startCartographic = Cartographic.createZero();\n }\n this._startCartographic = startCartographic;\n\n let maxFlightDuration: number;\n\n if (view.globeMode === GlobeMode.Plane) {\n // Calculate a line segment going from the starting cartographic coordinate to the ending cartographic coordinate\n this._columbusLine.push(view.cartographicToRoot(startCartographic)!);\n this._columbusLine.push(view.cartographicToRoot(this._endLocation.center)!);\n this._flightLength = this._columbusLine[0].distance(this._columbusLine[1]);\n // Set a shorter flight duration in Plane mode\n maxFlightDuration = 7000.0;\n } else {\n // Calculate a flight arc from the ellipsoid of the Earth and the starting and ending cartographic coordinates.\n const earthEllipsoid = backgroundMapGeometry.getEarthEllipsoid();\n this._ellipsoidArc = earthEllipsoid.radiansPairToGreatArc(this._startCartographic.longitude, this._startCartographic.latitude, this._endLocation.center.longitude, this._endLocation.center.latitude)!;\n if (this._ellipsoidArc !== undefined)\n this._flightLength = this._ellipsoidArc.curveLength();\n // Set a longer flight duration in 3D mode\n maxFlightDuration = 13000.0;\n }\n\n if (Geometry.isSmallMetricDistance(this._flightLength))\n return;\n\n // The peak of the flight varies based on total distance to travel. The larger the distance, the higher the peak of the flight will be.\n this._midHeight = metersToRange(this._flightLength,\n ViewGlobalLocationConstants.birdHeightAboveEarthInMeters,\n ViewGlobalLocationConstants.satelliteHeightAboveEarthInMeters * 4,\n ViewGlobalLocationConstants.largestEarthArc);\n\n // We will \"fix\" the initial frustum so it smoothly transitions to some point along the travel arc depending on the starting height.\n // Alternatively, if the distance to travel is small enough, we will _only_ do a frustum transition to the destination location - ignoring the flight arc.\n const beforeTakeoff = viewport.getWorldFrustum();\n\n if (view.globeMode === GlobeMode.Plane) {\n /// Do not \"fix\" the take-off for plane mode; SmoothTransformBetweenFrusta can behave wrongly.\n // However, if within driving distance, still use SmoothTransformBetweenFrusta to navigate there without flight.\n this._fixTakeoffFraction = this._flightLength <= ViewGlobalLocationConstants.maximumDistanceToDrive ? 1.0 : 0.0;\n } else {\n this._fixTakeoffFraction = this._flightLength <= ViewGlobalLocationConstants.maximumDistanceToDrive ? 1.0 : metersToRange(this._startHeight, 0.1, 0.4, ViewGlobalLocationConstants.birdHeightAboveEarthInMeters);\n }\n\n if (this._fixTakeoffFraction > 0.0) {\n this._moveFlightToFraction(this._fixTakeoffFraction);\n const afterTakeoff = viewport.getWorldFrustum();\n this._fixTakeoffInterpolator = SmoothTransformBetweenFrusta.create(beforeTakeoff.points, afterTakeoff.points);\n }\n\n // The duration of the animation will increase the larger the distance to travel.\n const flightDurationInMilliseconds = metersToRange(this._flightLength, 1000, maxFlightDuration, ViewGlobalLocationConstants.largestEarthArc);\n\n // Specify the tweening behavior for this animation.\n this._flightTweens.create({ fraction: 0.0 }, {\n to: { fraction: 1.0 },\n duration: flightDurationInMilliseconds,\n easing: Easing.Cubic.InOut,\n start: true,\n onUpdate: (obj: any) => this._moveFlightToFraction(obj.fraction),\n });\n }\n\n /** @internal */\n public animate() {\n if (this._flightLength <= 0) {\n this._moveFlightToFraction(1.0); // Skip to final frustum\n return true;\n }\n return !this._flightTweens.update();\n }\n\n /** @internal */\n public interrupt() {\n this._moveFlightToFraction(1.0); // Skip to final frustum\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"GraphicalEditingScope.js","sourceRoot":"","sources":["../../src/GraphicalEditingScope.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module IModelConnection\r\n */\r\n\r\nimport { assert, BeEvent, compareStrings, DbOpcode, DuplicatePolicy, GuidString, Id64Set, Id64String, SortedArray } from \"@itwin/core-bentley\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport {\r\n EditingScopeNotifications, ElementGeometryChange, ipcAppChannels, ModelGeometryChanges, ModelGeometryChangesProps, RemoveFunction,\r\n} from \"@itwin/core-common\";\r\nimport { BriefcaseNotificationHandler } from \"./BriefcaseTxns\";\r\nimport { BriefcaseConnection } from \"./BriefcaseConnection\";\r\nimport { IpcApp } from \"./IpcApp\";\r\n\r\nclass ModelChanges extends SortedArray<ElementGeometryChange> {\r\n public geometryGuid: GuidString;\r\n public readonly range: Range3d;\r\n\r\n public constructor(geometryGuid: GuidString, range: Range3d) {\r\n super((lhs, rhs) => compareStrings(lhs.id, rhs.id), DuplicatePolicy.Replace);\r\n this.geometryGuid = geometryGuid;\r\n this.range = range;\r\n }\r\n}\r\n\r\n/** Represents a period of time within an [interactive editing]($docs/learning/InteractiveEditing.md) session during which the\r\n * geometry of elements being displayed in one or more [[Viewport]]s is being modified. Outside of such a scope, whenever the\r\n * geometry within a [GeometricModel]($backend) changes new [[Tile]]s must be generated to reflect those changes in a viewport.\r\n * Regenerating entire tiles each time individual elements change can be time-consuming, which may introduce an unacceptable delay\r\n * between making a modification and seeing its result on the screen.\r\n *\r\n * Within the context of a graphical editing scope, no new tiles are generated. Instead, the geometry for any deleted or modified elements\r\n * is hidden in the tile graphics, and additional temporary graphics are displayed for any newly-inserted or modified elements. Only when the\r\n * scope exits are new tiles produced.\r\n *\r\n * The application decides when to enter and exit a graphical editing scope. A single interactive editing session may involve any number of\r\n * editing scopes. Typically, applications will enter a new editing scope (after first exiting a previous scope, if one exists):\r\n * - When switching from a non-graphical workflow to one that involves editing geometry; or\r\n * - When changing which geometric model is being edited; or\r\n * - After performing an operation that creates or modifies a \"large\" number (perhaps hundreds?) of elements.\r\n *\r\n * An application should typically exit any graphical editing scope before:\r\n * - Pulling changesets; or\r\n * - Switching from a graphical editing workflow to some non-graphical workflow.\r\n *\r\n * Graphical editing scopes are only supported for [[BriefcaseConnection]]s opened in read-write mode that contain version 1.0.11 or newer of the BisCore schema.\r\n * @see [[BriefcaseConnection.enterEditingScope]] to create a scope for a briefcase.\r\n * @see [[BriefcaseConnection.editingScope]] to obtain a briefcase's current scope.\r\n * @see [[exit]] to terminate a scope.\r\n * @public\r\n */\r\nexport class GraphicalEditingScope extends BriefcaseNotificationHandler implements EditingScopeNotifications {\r\n public get briefcaseChannelName() { return ipcAppChannels.editingScope; }\r\n\r\n /** Maps model Id to accumulated changes to geometric elements within the associated model. */\r\n private readonly _geometryChanges = new Map<Id64String, ModelChanges>();\r\n private _disposed = false;\r\n private _cleanup?: RemoveFunction;\r\n\r\n /** The connection to the iModel being edited. */\r\n public readonly iModel: BriefcaseConnection;\r\n\r\n /** Event raised when a new scope is created for any [[BriefcaseConnection]].\r\n * @see [[onExiting]] and [[onExited]] for complementary events.\r\n */\r\n public static readonly onEnter = new BeEvent<(scope: GraphicalEditingScope) => void>();\r\n\r\n /** Event raised when this scope is about to exit.\r\n * @see [[onEnter]] for the complementary event.\r\n * @see [[onExited]] for an event raised after the scope exits.\r\n */\r\n public readonly onExiting = new BeEvent<(scope: GraphicalEditingScope) => void>();\r\n\r\n /** Event raised when this scope has exited.\r\n * @see [[onEnter]] for the complementary event.\r\n * @see [[onExiting]] for an event raised just before the scope is exited.\r\n */\r\n public readonly onExited = new BeEvent<(scope: GraphicalEditingScope) => void>();\r\n\r\n /** Event raised after geometric changes are written to the iModel. */\r\n public readonly onGeometryChanges = new BeEvent<(changes: Iterable<ModelGeometryChanges>, scope: GraphicalEditingScope) => void>();\r\n\r\n /** Don't call this directly - use BriefcaseConnection.enterEditingScope.\r\n * @internal\r\n */\r\n public static async enter(imodel: BriefcaseConnection): Promise<GraphicalEditingScope> {\r\n if (imodel.editingScope)\r\n throw new Error(\"Cannot create an editing scope for an iModel that already has one\");\r\n\r\n // Register the scope synchronously, in case enter() is called again for same iModel while awaiting asynchronous initialization.\r\n const scope = new GraphicalEditingScope(imodel);\r\n try {\r\n const scopeStarted = await IpcApp.appFunctionIpc.toggleGraphicalEditingScope(imodel.key, true);\r\n assert(scopeStarted); // If it didn't, the backend threw an error.\r\n } catch (e) {\r\n scope.dispose();\r\n throw e;\r\n }\r\n\r\n this.onEnter.raiseEvent(scope);\r\n\r\n return scope;\r\n }\r\n\r\n /** Exits this editing scope. The associated [[BriefcaseConnection]]'s `editingScope` will be reset to `undefined`.\r\n * @throws Error if the scope could not be exited, e.g., if it has already been exited.\r\n * @see [[BriefcaseConnection.enterEditingScope]] to enter an editing scope.\r\n */\r\n public async exit(): Promise<void> {\r\n if (this._disposed || this.iModel.editingScope !== this)\r\n throw new Error(\"Cannot exit editing scope after it is disconnected from the iModel\");\r\n\r\n this._disposed = true;\r\n try {\r\n this.onExiting.raiseEvent(this);\r\n } finally {\r\n const scopeExited = await IpcApp.appFunctionIpc.toggleGraphicalEditingScope(this.iModel.key, false);\r\n assert(!scopeExited);\r\n try {\r\n this.onExited.raiseEvent(this);\r\n } finally {\r\n this.dispose();\r\n }\r\n }\r\n }\r\n\r\n /** Obtain all geometric changes to elements within the specified model accumulated within this scope. */\r\n public getGeometryChangesForModel(modelId: Id64String): Iterable<ElementGeometryChange> | undefined {\r\n return this._geometryChanges.get(modelId);\r\n }\r\n\r\n /** Obtain all geometric changes to models accumulated within this scope. */\r\n public getGeometryChanges(): Iterable<ModelGeometryChanges> {\r\n return { [Symbol.iterator]: () => this.geometryChangeIterator() };\r\n }\r\n\r\n /** @internal */\r\n public get isDisposed() {\r\n return this._disposed;\r\n }\r\n\r\n private * geometryChangeIterator(): Iterator<ModelGeometryChanges> {\r\n for (const [key, value] of this._geometryChanges) {\r\n yield {\r\n id: key,\r\n geometryGuid: value.geometryGuid,\r\n range: value.range,\r\n elements: value,\r\n };\r\n }\r\n }\r\n\r\n private constructor(iModel: BriefcaseConnection) {\r\n super(iModel.key);\r\n this.iModel = iModel;\r\n this._cleanup = this.registerImpl();\r\n }\r\n\r\n private dispose(): void {\r\n this._disposed = true;\r\n\r\n this.onExiting.clear();\r\n this.onGeometryChanges.clear();\r\n this.onExited.clear();\r\n\r\n this._geometryChanges.clear();\r\n\r\n if (this._cleanup) {\r\n this._cleanup();\r\n this._cleanup = undefined;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public notifyGeometryChanged(props: ModelGeometryChangesProps[]) {\r\n const changes = ModelGeometryChanges.iterable(props);\r\n const modelIds: Id64String[] = [];\r\n let deletedIds: Id64Set | undefined;\r\n\r\n for (const modelChanges of changes) {\r\n // ###TODO do we care about the model range?\r\n let list = this._geometryChanges.get(modelChanges.id);\r\n modelIds.push(modelChanges.id);\r\n for (const elementChange of modelChanges.elements) {\r\n if (!list) {\r\n this._geometryChanges.set(modelChanges.id, list = new ModelChanges(modelChanges.geometryGuid, modelChanges.range));\r\n } else {\r\n list.geometryGuid = modelChanges.geometryGuid;\r\n modelChanges.range.clone(list.range);\r\n }\r\n\r\n list.insert(elementChange);\r\n if (DbOpcode.Delete === elementChange.type) {\r\n if (undefined === deletedIds)\r\n deletedIds = new Set<Id64String>();\r\n deletedIds.add(elementChange.id);\r\n }\r\n }\r\n }\r\n\r\n if (deletedIds) {\r\n this.iModel.selectionSet.remove(deletedIds);\r\n this.iModel.hilited.setHilite(deletedIds, false);\r\n }\r\n\r\n this.onGeometryChanges.raiseEvent(changes, this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"GraphicalEditingScope.js","sourceRoot":"","sources":["../../src/GraphicalEditingScope.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module IModelConnection\n */\n\nimport { assert, BeEvent, compareStrings, DbOpcode, DuplicatePolicy, GuidString, Id64Set, Id64String, SortedArray } from \"@itwin/core-bentley\";\nimport { Range3d } from \"@itwin/core-geometry\";\nimport {\n EditingScopeNotifications, ElementGeometryChange, ipcAppChannels, ModelGeometryChanges, ModelGeometryChangesProps, RemoveFunction,\n} from \"@itwin/core-common\";\nimport { BriefcaseNotificationHandler } from \"./BriefcaseTxns\";\nimport { BriefcaseConnection } from \"./BriefcaseConnection\";\nimport { IpcApp } from \"./IpcApp\";\n\nclass ModelChanges extends SortedArray<ElementGeometryChange> {\n public geometryGuid: GuidString;\n public readonly range: Range3d;\n\n public constructor(geometryGuid: GuidString, range: Range3d) {\n super((lhs, rhs) => compareStrings(lhs.id, rhs.id), DuplicatePolicy.Replace);\n this.geometryGuid = geometryGuid;\n this.range = range;\n }\n}\n\n/** Represents a period of time within an [interactive editing]($docs/learning/InteractiveEditing.md) session during which the\n * geometry of elements being displayed in one or more [[Viewport]]s is being modified. Outside of such a scope, whenever the\n * geometry within a [GeometricModel]($backend) changes new [[Tile]]s must be generated to reflect those changes in a viewport.\n * Regenerating entire tiles each time individual elements change can be time-consuming, which may introduce an unacceptable delay\n * between making a modification and seeing its result on the screen.\n *\n * Within the context of a graphical editing scope, no new tiles are generated. Instead, the geometry for any deleted or modified elements\n * is hidden in the tile graphics, and additional temporary graphics are displayed for any newly-inserted or modified elements. Only when the\n * scope exits are new tiles produced.\n *\n * The application decides when to enter and exit a graphical editing scope. A single interactive editing session may involve any number of\n * editing scopes. Typically, applications will enter a new editing scope (after first exiting a previous scope, if one exists):\n * - When switching from a non-graphical workflow to one that involves editing geometry; or\n * - When changing which geometric model is being edited; or\n * - After performing an operation that creates or modifies a \"large\" number (perhaps hundreds?) of elements.\n *\n * An application should typically exit any graphical editing scope before:\n * - Pulling changesets; or\n * - Switching from a graphical editing workflow to some non-graphical workflow.\n *\n * Graphical editing scopes are only supported for [[BriefcaseConnection]]s opened in read-write mode that contain version 1.0.11 or newer of the BisCore schema.\n * @see [[BriefcaseConnection.enterEditingScope]] to create a scope for a briefcase.\n * @see [[BriefcaseConnection.editingScope]] to obtain a briefcase's current scope.\n * @see [[exit]] to terminate a scope.\n * @public\n */\nexport class GraphicalEditingScope extends BriefcaseNotificationHandler implements EditingScopeNotifications {\n public get briefcaseChannelName() { return ipcAppChannels.editingScope; }\n\n /** Maps model Id to accumulated changes to geometric elements within the associated model. */\n private readonly _geometryChanges = new Map<Id64String, ModelChanges>();\n private _disposed = false;\n private _cleanup?: RemoveFunction;\n\n /** The connection to the iModel being edited. */\n public readonly iModel: BriefcaseConnection;\n\n /** Event raised when a new scope is created for any [[BriefcaseConnection]].\n * @see [[onExiting]] and [[onExited]] for complementary events.\n */\n public static readonly onEnter = new BeEvent<(scope: GraphicalEditingScope) => void>();\n\n /** Event raised when this scope is about to exit.\n * @see [[onEnter]] for the complementary event.\n * @see [[onExited]] for an event raised after the scope exits.\n */\n public readonly onExiting = new BeEvent<(scope: GraphicalEditingScope) => void>();\n\n /** Event raised when this scope has exited.\n * @see [[onEnter]] for the complementary event.\n * @see [[onExiting]] for an event raised just before the scope is exited.\n */\n public readonly onExited = new BeEvent<(scope: GraphicalEditingScope) => void>();\n\n /** Event raised after geometric changes are written to the iModel. */\n public readonly onGeometryChanges = new BeEvent<(changes: Iterable<ModelGeometryChanges>, scope: GraphicalEditingScope) => void>();\n\n /** Don't call this directly - use BriefcaseConnection.enterEditingScope.\n * @internal\n */\n public static async enter(imodel: BriefcaseConnection): Promise<GraphicalEditingScope> {\n if (imodel.editingScope)\n throw new Error(\"Cannot create an editing scope for an iModel that already has one\");\n\n // Register the scope synchronously, in case enter() is called again for same iModel while awaiting asynchronous initialization.\n const scope = new GraphicalEditingScope(imodel);\n try {\n const scopeStarted = await IpcApp.appFunctionIpc.toggleGraphicalEditingScope(imodel.key, true);\n assert(scopeStarted); // If it didn't, the backend threw an error.\n } catch (e) {\n scope.dispose();\n throw e;\n }\n\n this.onEnter.raiseEvent(scope);\n\n return scope;\n }\n\n /** Exits this editing scope. The associated [[BriefcaseConnection]]'s `editingScope` will be reset to `undefined`.\n * @throws Error if the scope could not be exited, e.g., if it has already been exited.\n * @see [[BriefcaseConnection.enterEditingScope]] to enter an editing scope.\n */\n public async exit(): Promise<void> {\n if (this._disposed || this.iModel.editingScope !== this)\n throw new Error(\"Cannot exit editing scope after it is disconnected from the iModel\");\n\n this._disposed = true;\n try {\n this.onExiting.raiseEvent(this);\n } finally {\n const scopeExited = await IpcApp.appFunctionIpc.toggleGraphicalEditingScope(this.iModel.key, false);\n assert(!scopeExited);\n try {\n this.onExited.raiseEvent(this);\n } finally {\n this.dispose();\n }\n }\n }\n\n /** Obtain all geometric changes to elements within the specified model accumulated within this scope. */\n public getGeometryChangesForModel(modelId: Id64String): Iterable<ElementGeometryChange> | undefined {\n return this._geometryChanges.get(modelId);\n }\n\n /** Obtain all geometric changes to models accumulated within this scope. */\n public getGeometryChanges(): Iterable<ModelGeometryChanges> {\n return { [Symbol.iterator]: () => this.geometryChangeIterator() };\n }\n\n /** @internal */\n public get isDisposed() {\n return this._disposed;\n }\n\n private * geometryChangeIterator(): Iterator<ModelGeometryChanges> {\n for (const [key, value] of this._geometryChanges) {\n yield {\n id: key,\n geometryGuid: value.geometryGuid,\n range: value.range,\n elements: value,\n };\n }\n }\n\n private constructor(iModel: BriefcaseConnection) {\n super(iModel.key);\n this.iModel = iModel;\n this._cleanup = this.registerImpl();\n }\n\n private dispose(): void {\n this._disposed = true;\n\n this.onExiting.clear();\n this.onGeometryChanges.clear();\n this.onExited.clear();\n\n this._geometryChanges.clear();\n\n if (this._cleanup) {\n this._cleanup();\n this._cleanup = undefined;\n }\n }\n\n /** @internal */\n public notifyGeometryChanged(props: ModelGeometryChangesProps[]) {\n const changes = ModelGeometryChanges.iterable(props);\n const modelIds: Id64String[] = [];\n let deletedIds: Id64Set | undefined;\n\n for (const modelChanges of changes) {\n // ###TODO do we care about the model range?\n let list = this._geometryChanges.get(modelChanges.id);\n modelIds.push(modelChanges.id);\n for (const elementChange of modelChanges.elements) {\n if (!list) {\n this._geometryChanges.set(modelChanges.id, list = new ModelChanges(modelChanges.geometryGuid, modelChanges.range));\n } else {\n list.geometryGuid = modelChanges.geometryGuid;\n modelChanges.range.clone(list.range);\n }\n\n list.insert(elementChange);\n if (DbOpcode.Delete === elementChange.type) {\n if (undefined === deletedIds)\n deletedIds = new Set<Id64String>();\n deletedIds.add(elementChange.id);\n }\n }\n }\n\n if (deletedIds) {\n this.iModel.selectionSet.remove(deletedIds);\n this.iModel.hilited.setHilite(deletedIds, false);\n }\n\n this.onGeometryChanges.raiseEvent(changes, this);\n }\n}\n"]}