@itwin/core-frontend 4.0.0-dev.23 → 4.0.0-dev.28
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.
- package/CHANGELOG.md +43 -36
- package/lib/cjs/AccuDraw.js +1 -1
- package/lib/cjs/AccuDraw.js.map +1 -1
- package/lib/cjs/AccuSnap.js +3 -3
- package/lib/cjs/AccuSnap.js.map +1 -1
- package/lib/cjs/BriefcaseConnection.js +9 -11
- package/lib/cjs/BriefcaseConnection.js.map +1 -1
- package/lib/cjs/DisplayStyleState.js +8 -12
- package/lib/cjs/DisplayStyleState.js.map +1 -1
- package/lib/cjs/DrawingViewState.js +4 -6
- package/lib/cjs/DrawingViewState.js.map +1 -1
- package/lib/cjs/EnvironmentDecorations.js +2 -3
- package/lib/cjs/EnvironmentDecorations.js.map +1 -1
- package/lib/cjs/FlashSettings.js +3 -4
- package/lib/cjs/FlashSettings.js.map +1 -1
- package/lib/cjs/GeoServices.js +7 -9
- package/lib/cjs/GeoServices.js.map +1 -1
- package/lib/cjs/IModelApp.js +19 -21
- package/lib/cjs/IModelApp.js.map +1 -1
- package/lib/cjs/IModelConnection.js +1 -1
- package/lib/cjs/IModelConnection.js.map +1 -1
- package/lib/cjs/IpcApp.js +1 -1
- package/lib/cjs/IpcApp.js.map +1 -1
- package/lib/cjs/LocalhostIpcApp.js +3 -4
- package/lib/cjs/LocalhostIpcApp.js.map +1 -1
- package/lib/cjs/ModelState.js +2 -3
- package/lib/cjs/ModelState.js.map +1 -1
- package/lib/cjs/NativeApp.js +4 -7
- package/lib/cjs/NativeApp.js.map +1 -1
- package/lib/cjs/NoRenderApp.js +1 -2
- package/lib/cjs/NoRenderApp.js.map +1 -1
- package/lib/cjs/PlanarClipMaskState.js +1 -1
- package/lib/cjs/PlanarClipMaskState.js.map +1 -1
- package/lib/cjs/RealityDataSourceContextShareImpl.js +2 -4
- package/lib/cjs/RealityDataSourceContextShareImpl.js.map +1 -1
- package/lib/cjs/SheetViewState.js +15 -23
- package/lib/cjs/SheetViewState.js.map +1 -1
- package/lib/cjs/Tiles.js +2 -2
- package/lib/cjs/Tiles.js.map +1 -1
- package/lib/cjs/ViewContext.js +1 -1
- package/lib/cjs/ViewContext.js.map +1 -1
- package/lib/cjs/ViewCreator2d.js +4 -5
- package/lib/cjs/ViewCreator2d.js.map +1 -1
- package/lib/cjs/ViewCreator3d.js +5 -5
- package/lib/cjs/ViewCreator3d.js.map +1 -1
- package/lib/cjs/ViewState.js +17 -24
- package/lib/cjs/ViewState.js.map +1 -1
- package/lib/cjs/Viewport.js +22 -32
- package/lib/cjs/Viewport.js.map +1 -1
- package/lib/cjs/extension/ExtensionImpl.js +1 -1
- package/lib/cjs/extension/ExtensionImpl.js.map +1 -1
- package/lib/cjs/quantity-formatting/BaseUnitFormattingSettingsProvider.js +2 -3
- package/lib/cjs/quantity-formatting/BaseUnitFormattingSettingsProvider.js.map +1 -1
- package/lib/cjs/quantity-formatting/QuantityFormatter.js +7 -9
- package/lib/cjs/quantity-formatting/QuantityFormatter.js.map +1 -1
- package/lib/cjs/render/FeatureSymbology.js +1 -2
- package/lib/cjs/render/FeatureSymbology.js.map +1 -1
- package/lib/cjs/render/GraphicBuilder.js +7 -9
- package/lib/cjs/render/GraphicBuilder.js.map +1 -1
- package/lib/cjs/render/MockRender.js +1 -2
- package/lib/cjs/render/MockRender.js.map +1 -1
- package/lib/cjs/render/ParticleCollectionBuilder.js +2 -3
- package/lib/cjs/render/ParticleCollectionBuilder.js.map +1 -1
- package/lib/cjs/render/RealityMeshParams.js +7 -10
- package/lib/cjs/render/RealityMeshParams.js.map +1 -1
- package/lib/cjs/render/RenderPlan.js +1 -1
- package/lib/cjs/render/RenderPlan.js.map +1 -1
- package/lib/cjs/render/RenderSystem.js +1 -2
- package/lib/cjs/render/RenderSystem.js.map +1 -1
- package/lib/cjs/render/VisibleFeature.js +2 -4
- package/lib/cjs/render/VisibleFeature.js.map +1 -1
- package/lib/cjs/render/primitives/AuxChannelTable.js +6 -9
- package/lib/cjs/render/primitives/AuxChannelTable.js.map +1 -1
- package/lib/cjs/render/primitives/EdgeParams.js +6 -7
- package/lib/cjs/render/primitives/EdgeParams.js.map +1 -1
- package/lib/cjs/render/primitives/PolylineParams.js +2 -3
- package/lib/cjs/render/primitives/PolylineParams.js.map +1 -1
- package/lib/cjs/render/primitives/VertexKey.js +1 -1
- package/lib/cjs/render/primitives/VertexKey.js.map +1 -1
- package/lib/cjs/render/primitives/VertexTable.js +1 -1
- package/lib/cjs/render/primitives/VertexTable.js.map +1 -1
- package/lib/cjs/render/primitives/VertexTableSplitter.js +6 -8
- package/lib/cjs/render/primitives/VertexTableSplitter.js.map +1 -1
- package/lib/cjs/render/primitives/geometry/GeometryAccumulator.js +9 -11
- package/lib/cjs/render/primitives/geometry/GeometryAccumulator.js.map +1 -1
- package/lib/cjs/render/primitives/geometry/GeometryListBuilder.js +3 -5
- package/lib/cjs/render/primitives/geometry/GeometryListBuilder.js.map +1 -1
- package/lib/cjs/render/primitives/mesh/MeshBuilder.js +1 -1
- package/lib/cjs/render/primitives/mesh/MeshBuilder.js.map +1 -1
- package/lib/cjs/render/primitives/mesh/MeshPrimitives.js +2 -3
- package/lib/cjs/render/primitives/mesh/MeshPrimitives.js.map +1 -1
- package/lib/cjs/render/webgl/BranchState.js +9 -10
- package/lib/cjs/render/webgl/BranchState.js.map +1 -1
- package/lib/cjs/render/webgl/EDL.js +17 -21
- package/lib/cjs/render/webgl/EDL.js.map +1 -1
- package/lib/cjs/render/webgl/FeatureOverrides.js +2 -2
- package/lib/cjs/render/webgl/FeatureOverrides.js.map +1 -1
- package/lib/cjs/render/webgl/Graphic.js +3 -5
- package/lib/cjs/render/webgl/Graphic.js.map +1 -1
- package/lib/cjs/render/webgl/IndexedEdgeGeometry.js +1 -1
- package/lib/cjs/render/webgl/IndexedEdgeGeometry.js.map +1 -1
- package/lib/cjs/render/webgl/InstancedGeometry.js +2 -3
- package/lib/cjs/render/webgl/InstancedGeometry.js.map +1 -1
- package/lib/cjs/render/webgl/Mesh.js +7 -10
- package/lib/cjs/render/webgl/Mesh.js.map +1 -1
- package/lib/cjs/render/webgl/MeshData.js +1 -2
- package/lib/cjs/render/webgl/MeshData.js.map +1 -1
- package/lib/cjs/render/webgl/PlanarClassifier.js +10 -15
- package/lib/cjs/render/webgl/PlanarClassifier.js.map +1 -1
- package/lib/cjs/render/webgl/RealityMesh.js +5 -8
- package/lib/cjs/render/webgl/RealityMesh.js.map +1 -1
- package/lib/cjs/render/webgl/RealityModelUniforms.js +3 -4
- package/lib/cjs/render/webgl/RealityModelUniforms.js.map +1 -1
- package/lib/cjs/render/webgl/RenderCommands.js +7 -8
- package/lib/cjs/render/webgl/RenderCommands.js.map +1 -1
- package/lib/cjs/render/webgl/SceneCompositor.js +7 -9
- package/lib/cjs/render/webgl/SceneCompositor.js.map +1 -1
- package/lib/cjs/render/webgl/ShaderBuilder.js +1 -2
- package/lib/cjs/render/webgl/ShaderBuilder.js.map +1 -1
- package/lib/cjs/render/webgl/SolarShadowMap.js +1 -2
- package/lib/cjs/render/webgl/SolarShadowMap.js.map +1 -1
- package/lib/cjs/render/webgl/SurfaceGeometry.js +1 -1
- package/lib/cjs/render/webgl/SurfaceGeometry.js.map +1 -1
- package/lib/cjs/render/webgl/System.js +12 -16
- package/lib/cjs/render/webgl/System.js.map +1 -1
- package/lib/cjs/render/webgl/Target.js +9 -14
- package/lib/cjs/render/webgl/Target.js.map +1 -1
- package/lib/cjs/render/webgl/TargetGraphics.js +1 -2
- package/lib/cjs/render/webgl/TargetGraphics.js.map +1 -1
- package/lib/cjs/render/webgl/Texture.js +1 -2
- package/lib/cjs/render/webgl/Texture.js.map +1 -1
- package/lib/cjs/render/webgl/ThematicSensors.js +2 -4
- package/lib/cjs/render/webgl/ThematicSensors.js.map +1 -1
- package/lib/cjs/render/webgl/VisibleTileFeatures.js +1 -2
- package/lib/cjs/render/webgl/VisibleTileFeatures.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Animation.js +6 -9
- package/lib/cjs/render/webgl/glsl/Animation.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/FeatureSymbology.js +1 -2
- package/lib/cjs/render/webgl/glsl/FeatureSymbology.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Instancing.js +4 -5
- package/lib/cjs/render/webgl/glsl/Instancing.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/RealityMesh.js +2 -4
- package/lib/cjs/render/webgl/glsl/RealityMesh.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Surface.js +1 -2
- package/lib/cjs/render/webgl/glsl/Surface.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Thematic.js +1 -2
- package/lib/cjs/render/webgl/glsl/Thematic.js.map +1 -1
- package/lib/cjs/tile/ClassifierTileTree.js +3 -3
- package/lib/cjs/tile/ClassifierTileTree.js.map +1 -1
- package/lib/cjs/tile/GltfReader.js +61 -75
- package/lib/cjs/tile/GltfReader.js.map +1 -1
- package/lib/cjs/tile/IModelTile.js +2 -3
- package/lib/cjs/tile/IModelTile.js.map +1 -1
- package/lib/cjs/tile/IModelTileRequestChannels.js +6 -11
- package/lib/cjs/tile/IModelTileRequestChannels.js.map +1 -1
- package/lib/cjs/tile/IModelTileTree.js +5 -9
- package/lib/cjs/tile/IModelTileTree.js.map +1 -1
- package/lib/cjs/tile/ImdlReader.js +13 -17
- package/lib/cjs/tile/ImdlReader.js.map +1 -1
- package/lib/cjs/tile/OrbitGtTileTree.js +2 -2
- package/lib/cjs/tile/OrbitGtTileTree.js.map +1 -1
- package/lib/cjs/tile/PntsReader.js +4 -5
- package/lib/cjs/tile/PntsReader.js.map +1 -1
- package/lib/cjs/tile/PrimaryTileTree.js +22 -32
- package/lib/cjs/tile/PrimaryTileTree.js.map +1 -1
- package/lib/cjs/tile/RealityModelTileTree.js +12 -19
- package/lib/cjs/tile/RealityModelTileTree.js.map +1 -1
- package/lib/cjs/tile/RealityTile.js +3 -5
- package/lib/cjs/tile/RealityTile.js.map +1 -1
- package/lib/cjs/tile/RealityTileLoader.js +2 -2
- package/lib/cjs/tile/RealityTileLoader.js.map +1 -1
- package/lib/cjs/tile/ThreeDTileFormatInterpreter.js +3 -5
- package/lib/cjs/tile/ThreeDTileFormatInterpreter.js.map +1 -1
- package/lib/cjs/tile/Tile.js +1 -1
- package/lib/cjs/tile/Tile.js.map +1 -1
- package/lib/cjs/tile/TileAdmin.js +22 -27
- package/lib/cjs/tile/TileAdmin.js.map +1 -1
- package/lib/cjs/tile/TileDrawArgs.js +3 -6
- package/lib/cjs/tile/TileDrawArgs.js.map +1 -1
- package/lib/cjs/tile/TileRequestChannels.js +1 -1
- package/lib/cjs/tile/TileRequestChannels.js.map +1 -1
- package/lib/cjs/tile/TileTree.js +2 -3
- package/lib/cjs/tile/TileTree.js.map +1 -1
- package/lib/cjs/tile/TiledGraphicsProvider.js +1 -1
- package/lib/cjs/tile/TiledGraphicsProvider.js.map +1 -1
- package/lib/cjs/tile/map/ArcGISTileMap.js +5 -6
- package/lib/cjs/tile/map/ArcGISTileMap.js.map +1 -1
- package/lib/cjs/tile/map/ArcGisUtilities.js +6 -8
- package/lib/cjs/tile/map/ArcGisUtilities.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js +4 -7
- package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +6 -8
- package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/BingImageryProvider.js +1 -2
- package/lib/cjs/tile/map/ImageryProviders/BingImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +14 -19
- package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +14 -20
- package/lib/cjs/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/MapCartoRectangle.js +1 -1
- package/lib/cjs/tile/map/MapCartoRectangle.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerFormatRegistry.js +5 -6
- package/lib/cjs/tile/map/MapLayerFormatRegistry.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerImageryFormats.js +11 -14
- package/lib/cjs/tile/map/MapLayerImageryFormats.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerImageryProvider.js +2 -3
- package/lib/cjs/tile/map/MapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerSources.js +1 -1
- package/lib/cjs/tile/map/MapLayerSources.js.map +1 -1
- package/lib/cjs/tile/map/MapTile.js +6 -8
- package/lib/cjs/tile/map/MapTile.js.map +1 -1
- package/lib/cjs/tile/map/MapTileLoader.js +1 -1
- package/lib/cjs/tile/map/MapTileLoader.js.map +1 -1
- package/lib/cjs/tile/map/MapTileTree.js +13 -18
- package/lib/cjs/tile/map/MapTileTree.js.map +1 -1
- package/lib/cjs/tile/map/MapTiledGraphicsProvider.js +6 -7
- package/lib/cjs/tile/map/MapTiledGraphicsProvider.js.map +1 -1
- package/lib/cjs/tile/map/WmsCapabilities.js +4 -5
- package/lib/cjs/tile/map/WmsCapabilities.js.map +1 -1
- package/lib/cjs/tile/map/WmtsCapabilities.js +17 -25
- package/lib/cjs/tile/map/WmtsCapabilities.js.map +1 -1
- package/lib/cjs/tools/ClipViewTool.js +1 -1
- package/lib/cjs/tools/ClipViewTool.js.map +1 -1
- package/lib/cjs/tools/MeasureTool.js +2 -4
- package/lib/cjs/tools/MeasureTool.js.map +1 -1
- package/lib/cjs/tools/PrimitiveTool.js +2 -3
- package/lib/cjs/tools/PrimitiveTool.js.map +1 -1
- package/lib/cjs/tools/SelectTool.js +1 -2
- package/lib/cjs/tools/SelectTool.js.map +1 -1
- package/lib/cjs/tools/Tool.js +2 -3
- package/lib/cjs/tools/Tool.js.map +1 -1
- package/lib/cjs/tools/ToolAdmin.js +2 -4
- package/lib/cjs/tools/ToolAdmin.js.map +1 -1
- package/lib/cjs/tools/ViewTool.js +3 -3
- package/lib/cjs/tools/ViewTool.js.map +1 -1
- package/lib/esm/AccuDraw.js +1 -1
- package/lib/esm/AccuDraw.js.map +1 -1
- package/lib/esm/AccuSnap.js +3 -3
- package/lib/esm/AccuSnap.js.map +1 -1
- package/lib/esm/BriefcaseConnection.js +9 -11
- package/lib/esm/BriefcaseConnection.js.map +1 -1
- package/lib/esm/DisplayStyleState.js +8 -12
- package/lib/esm/DisplayStyleState.js.map +1 -1
- package/lib/esm/DrawingViewState.js +4 -6
- package/lib/esm/DrawingViewState.js.map +1 -1
- package/lib/esm/EnvironmentDecorations.js +2 -3
- package/lib/esm/EnvironmentDecorations.js.map +1 -1
- package/lib/esm/FlashSettings.js +3 -4
- package/lib/esm/FlashSettings.js.map +1 -1
- package/lib/esm/GeoServices.js +7 -9
- package/lib/esm/GeoServices.js.map +1 -1
- package/lib/esm/IModelApp.js +19 -21
- package/lib/esm/IModelApp.js.map +1 -1
- package/lib/esm/IModelConnection.js +1 -1
- package/lib/esm/IModelConnection.js.map +1 -1
- package/lib/esm/IpcApp.js +1 -1
- package/lib/esm/IpcApp.js.map +1 -1
- package/lib/esm/LocalhostIpcApp.js +3 -4
- package/lib/esm/LocalhostIpcApp.js.map +1 -1
- package/lib/esm/ModelState.js +2 -3
- package/lib/esm/ModelState.js.map +1 -1
- package/lib/esm/NativeApp.js +4 -7
- package/lib/esm/NativeApp.js.map +1 -1
- package/lib/esm/NoRenderApp.js +1 -2
- package/lib/esm/NoRenderApp.js.map +1 -1
- package/lib/esm/PlanarClipMaskState.js +1 -1
- package/lib/esm/PlanarClipMaskState.js.map +1 -1
- package/lib/esm/RealityDataSourceContextShareImpl.js +2 -4
- package/lib/esm/RealityDataSourceContextShareImpl.js.map +1 -1
- package/lib/esm/SheetViewState.js +15 -23
- package/lib/esm/SheetViewState.js.map +1 -1
- package/lib/esm/Tiles.js +2 -2
- package/lib/esm/Tiles.js.map +1 -1
- package/lib/esm/ViewContext.js +1 -1
- package/lib/esm/ViewContext.js.map +1 -1
- package/lib/esm/ViewCreator2d.js +4 -5
- package/lib/esm/ViewCreator2d.js.map +1 -1
- package/lib/esm/ViewCreator3d.js +5 -5
- package/lib/esm/ViewCreator3d.js.map +1 -1
- package/lib/esm/ViewState.js +17 -24
- package/lib/esm/ViewState.js.map +1 -1
- package/lib/esm/Viewport.js +22 -32
- package/lib/esm/Viewport.js.map +1 -1
- package/lib/esm/extension/ExtensionImpl.js +1 -1
- package/lib/esm/extension/ExtensionImpl.js.map +1 -1
- package/lib/esm/quantity-formatting/BaseUnitFormattingSettingsProvider.js +2 -3
- package/lib/esm/quantity-formatting/BaseUnitFormattingSettingsProvider.js.map +1 -1
- package/lib/esm/quantity-formatting/QuantityFormatter.js +7 -9
- package/lib/esm/quantity-formatting/QuantityFormatter.js.map +1 -1
- package/lib/esm/render/FeatureSymbology.js +1 -2
- package/lib/esm/render/FeatureSymbology.js.map +1 -1
- package/lib/esm/render/GraphicBuilder.js +7 -9
- package/lib/esm/render/GraphicBuilder.js.map +1 -1
- package/lib/esm/render/MockRender.js +1 -2
- package/lib/esm/render/MockRender.js.map +1 -1
- package/lib/esm/render/ParticleCollectionBuilder.js +2 -3
- package/lib/esm/render/ParticleCollectionBuilder.js.map +1 -1
- package/lib/esm/render/RealityMeshParams.js +7 -10
- package/lib/esm/render/RealityMeshParams.js.map +1 -1
- package/lib/esm/render/RenderPlan.js +1 -1
- package/lib/esm/render/RenderPlan.js.map +1 -1
- package/lib/esm/render/RenderSystem.js +1 -2
- package/lib/esm/render/RenderSystem.js.map +1 -1
- package/lib/esm/render/VisibleFeature.js +2 -4
- package/lib/esm/render/VisibleFeature.js.map +1 -1
- package/lib/esm/render/primitives/AuxChannelTable.js +6 -9
- package/lib/esm/render/primitives/AuxChannelTable.js.map +1 -1
- package/lib/esm/render/primitives/EdgeParams.js +6 -7
- package/lib/esm/render/primitives/EdgeParams.js.map +1 -1
- package/lib/esm/render/primitives/PolylineParams.js +2 -3
- package/lib/esm/render/primitives/PolylineParams.js.map +1 -1
- package/lib/esm/render/primitives/VertexKey.js +1 -1
- package/lib/esm/render/primitives/VertexKey.js.map +1 -1
- package/lib/esm/render/primitives/VertexTable.js +1 -1
- package/lib/esm/render/primitives/VertexTable.js.map +1 -1
- package/lib/esm/render/primitives/VertexTableSplitter.js +6 -8
- package/lib/esm/render/primitives/VertexTableSplitter.js.map +1 -1
- package/lib/esm/render/primitives/geometry/GeometryAccumulator.js +9 -11
- package/lib/esm/render/primitives/geometry/GeometryAccumulator.js.map +1 -1
- package/lib/esm/render/primitives/geometry/GeometryListBuilder.js +3 -5
- package/lib/esm/render/primitives/geometry/GeometryListBuilder.js.map +1 -1
- package/lib/esm/render/primitives/mesh/MeshBuilder.js +1 -1
- package/lib/esm/render/primitives/mesh/MeshBuilder.js.map +1 -1
- package/lib/esm/render/primitives/mesh/MeshPrimitives.js +2 -3
- package/lib/esm/render/primitives/mesh/MeshPrimitives.js.map +1 -1
- package/lib/esm/render/webgl/BranchState.js +9 -10
- package/lib/esm/render/webgl/BranchState.js.map +1 -1
- package/lib/esm/render/webgl/EDL.js +17 -21
- package/lib/esm/render/webgl/EDL.js.map +1 -1
- package/lib/esm/render/webgl/FeatureOverrides.js +2 -2
- package/lib/esm/render/webgl/FeatureOverrides.js.map +1 -1
- package/lib/esm/render/webgl/Graphic.js +3 -5
- package/lib/esm/render/webgl/Graphic.js.map +1 -1
- package/lib/esm/render/webgl/IndexedEdgeGeometry.js +1 -1
- package/lib/esm/render/webgl/IndexedEdgeGeometry.js.map +1 -1
- package/lib/esm/render/webgl/InstancedGeometry.js +2 -3
- package/lib/esm/render/webgl/InstancedGeometry.js.map +1 -1
- package/lib/esm/render/webgl/Mesh.js +7 -10
- package/lib/esm/render/webgl/Mesh.js.map +1 -1
- package/lib/esm/render/webgl/MeshData.js +1 -2
- package/lib/esm/render/webgl/MeshData.js.map +1 -1
- package/lib/esm/render/webgl/PlanarClassifier.js +10 -15
- package/lib/esm/render/webgl/PlanarClassifier.js.map +1 -1
- package/lib/esm/render/webgl/RealityMesh.js +5 -8
- package/lib/esm/render/webgl/RealityMesh.js.map +1 -1
- package/lib/esm/render/webgl/RealityModelUniforms.js +3 -4
- package/lib/esm/render/webgl/RealityModelUniforms.js.map +1 -1
- package/lib/esm/render/webgl/RenderCommands.js +7 -8
- package/lib/esm/render/webgl/RenderCommands.js.map +1 -1
- package/lib/esm/render/webgl/SceneCompositor.js +7 -9
- package/lib/esm/render/webgl/SceneCompositor.js.map +1 -1
- package/lib/esm/render/webgl/ShaderBuilder.js +1 -2
- package/lib/esm/render/webgl/ShaderBuilder.js.map +1 -1
- package/lib/esm/render/webgl/SolarShadowMap.js +1 -2
- package/lib/esm/render/webgl/SolarShadowMap.js.map +1 -1
- package/lib/esm/render/webgl/SurfaceGeometry.js +1 -1
- package/lib/esm/render/webgl/SurfaceGeometry.js.map +1 -1
- package/lib/esm/render/webgl/System.js +12 -16
- package/lib/esm/render/webgl/System.js.map +1 -1
- package/lib/esm/render/webgl/Target.js +9 -14
- package/lib/esm/render/webgl/Target.js.map +1 -1
- package/lib/esm/render/webgl/TargetGraphics.js +1 -2
- package/lib/esm/render/webgl/TargetGraphics.js.map +1 -1
- package/lib/esm/render/webgl/Texture.js +1 -2
- package/lib/esm/render/webgl/Texture.js.map +1 -1
- package/lib/esm/render/webgl/ThematicSensors.js +2 -4
- package/lib/esm/render/webgl/ThematicSensors.js.map +1 -1
- package/lib/esm/render/webgl/VisibleTileFeatures.js +1 -2
- package/lib/esm/render/webgl/VisibleTileFeatures.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Animation.js +6 -9
- package/lib/esm/render/webgl/glsl/Animation.js.map +1 -1
- package/lib/esm/render/webgl/glsl/FeatureSymbology.js +1 -2
- package/lib/esm/render/webgl/glsl/FeatureSymbology.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Instancing.js +4 -5
- package/lib/esm/render/webgl/glsl/Instancing.js.map +1 -1
- package/lib/esm/render/webgl/glsl/RealityMesh.js +2 -4
- package/lib/esm/render/webgl/glsl/RealityMesh.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Surface.js +1 -2
- package/lib/esm/render/webgl/glsl/Surface.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Thematic.js +1 -2
- package/lib/esm/render/webgl/glsl/Thematic.js.map +1 -1
- package/lib/esm/tile/ClassifierTileTree.js +3 -3
- package/lib/esm/tile/ClassifierTileTree.js.map +1 -1
- package/lib/esm/tile/GltfReader.js +61 -75
- package/lib/esm/tile/GltfReader.js.map +1 -1
- package/lib/esm/tile/IModelTile.js +2 -3
- package/lib/esm/tile/IModelTile.js.map +1 -1
- package/lib/esm/tile/IModelTileRequestChannels.js +6 -11
- package/lib/esm/tile/IModelTileRequestChannels.js.map +1 -1
- package/lib/esm/tile/IModelTileTree.js +5 -9
- package/lib/esm/tile/IModelTileTree.js.map +1 -1
- package/lib/esm/tile/ImdlReader.js +13 -17
- package/lib/esm/tile/ImdlReader.js.map +1 -1
- package/lib/esm/tile/OrbitGtTileTree.js +2 -2
- package/lib/esm/tile/OrbitGtTileTree.js.map +1 -1
- package/lib/esm/tile/PntsReader.js +4 -5
- package/lib/esm/tile/PntsReader.js.map +1 -1
- package/lib/esm/tile/PrimaryTileTree.js +22 -32
- package/lib/esm/tile/PrimaryTileTree.js.map +1 -1
- package/lib/esm/tile/RealityModelTileTree.js +12 -19
- package/lib/esm/tile/RealityModelTileTree.js.map +1 -1
- package/lib/esm/tile/RealityTile.js +3 -5
- package/lib/esm/tile/RealityTile.js.map +1 -1
- package/lib/esm/tile/RealityTileLoader.js +2 -2
- package/lib/esm/tile/RealityTileLoader.js.map +1 -1
- package/lib/esm/tile/ThreeDTileFormatInterpreter.js +3 -5
- package/lib/esm/tile/ThreeDTileFormatInterpreter.js.map +1 -1
- package/lib/esm/tile/Tile.js +1 -1
- package/lib/esm/tile/Tile.js.map +1 -1
- package/lib/esm/tile/TileAdmin.js +22 -27
- package/lib/esm/tile/TileAdmin.js.map +1 -1
- package/lib/esm/tile/TileDrawArgs.js +3 -6
- package/lib/esm/tile/TileDrawArgs.js.map +1 -1
- package/lib/esm/tile/TileRequestChannels.js +1 -1
- package/lib/esm/tile/TileRequestChannels.js.map +1 -1
- package/lib/esm/tile/TileTree.js +2 -3
- package/lib/esm/tile/TileTree.js.map +1 -1
- package/lib/esm/tile/TiledGraphicsProvider.js +1 -1
- package/lib/esm/tile/TiledGraphicsProvider.js.map +1 -1
- package/lib/esm/tile/map/ArcGISTileMap.js +5 -6
- package/lib/esm/tile/map/ArcGISTileMap.js.map +1 -1
- package/lib/esm/tile/map/ArcGisUtilities.js +6 -8
- package/lib/esm/tile/map/ArcGisUtilities.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js +4 -7
- package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +6 -8
- package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/BingImageryProvider.js +1 -2
- package/lib/esm/tile/map/ImageryProviders/BingImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +14 -19
- package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +14 -20
- package/lib/esm/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/MapCartoRectangle.js +1 -1
- package/lib/esm/tile/map/MapCartoRectangle.js.map +1 -1
- package/lib/esm/tile/map/MapLayerFormatRegistry.js +5 -6
- package/lib/esm/tile/map/MapLayerFormatRegistry.js.map +1 -1
- package/lib/esm/tile/map/MapLayerImageryFormats.js +11 -14
- package/lib/esm/tile/map/MapLayerImageryFormats.js.map +1 -1
- package/lib/esm/tile/map/MapLayerImageryProvider.js +2 -3
- package/lib/esm/tile/map/MapLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/MapLayerSources.js +1 -1
- package/lib/esm/tile/map/MapLayerSources.js.map +1 -1
- package/lib/esm/tile/map/MapTile.js +6 -8
- package/lib/esm/tile/map/MapTile.js.map +1 -1
- package/lib/esm/tile/map/MapTileLoader.js +1 -1
- package/lib/esm/tile/map/MapTileLoader.js.map +1 -1
- package/lib/esm/tile/map/MapTileTree.js +13 -18
- package/lib/esm/tile/map/MapTileTree.js.map +1 -1
- package/lib/esm/tile/map/MapTiledGraphicsProvider.js +6 -7
- package/lib/esm/tile/map/MapTiledGraphicsProvider.js.map +1 -1
- package/lib/esm/tile/map/WmsCapabilities.js +4 -5
- package/lib/esm/tile/map/WmsCapabilities.js.map +1 -1
- package/lib/esm/tile/map/WmtsCapabilities.js +17 -25
- package/lib/esm/tile/map/WmtsCapabilities.js.map +1 -1
- package/lib/esm/tools/ClipViewTool.js +1 -1
- package/lib/esm/tools/ClipViewTool.js.map +1 -1
- package/lib/esm/tools/MeasureTool.js +2 -4
- package/lib/esm/tools/MeasureTool.js.map +1 -1
- package/lib/esm/tools/PrimitiveTool.js +2 -3
- package/lib/esm/tools/PrimitiveTool.js.map +1 -1
- package/lib/esm/tools/SelectTool.js +1 -2
- package/lib/esm/tools/SelectTool.js.map +1 -1
- package/lib/esm/tools/Tool.js +2 -3
- package/lib/esm/tools/Tool.js.map +1 -1
- package/lib/esm/tools/ToolAdmin.js +2 -4
- package/lib/esm/tools/ToolAdmin.js.map +1 -1
- package/lib/esm/tools/ViewTool.js +3 -3
- package/lib/esm/tools/ViewTool.js.map +1 -1
- package/package.json +18 -18
|
@@ -48,12 +48,11 @@ class IModelTile extends internal_1.Tile {
|
|
|
48
48
|
}
|
|
49
49
|
get iModelTree() { return this.tree; }
|
|
50
50
|
get iModelChildren() { return this.children; }
|
|
51
|
-
get emptySubRangeMask() {
|
|
51
|
+
get emptySubRangeMask() { return this._emptySubRangeMask ?? 0; }
|
|
52
52
|
get sizeMultiplier() { return this._sizeMultiplier; }
|
|
53
53
|
get hasSizeMultiplier() { return undefined !== this.sizeMultiplier; }
|
|
54
54
|
get maximumSize() {
|
|
55
|
-
|
|
56
|
-
return super.maximumSize * ((_a = this.sizeMultiplier) !== null && _a !== void 0 ? _a : 1.0);
|
|
55
|
+
return super.maximumSize * (this.sizeMultiplier ?? 1.0);
|
|
57
56
|
}
|
|
58
57
|
get channel() {
|
|
59
58
|
return IModelApp_1.IModelApp.tileAdmin.channels.getIModelTileChannel(this);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IModelTile.js","sourceRoot":"","sources":["../../../src/tile/IModelTile.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,sDAAoF;AACpF,wDAA+C;AAC/C,oDAE4B;AAC5B,4CAAyC;AAGzC,yCAGoB;AASpB,gBAAgB;AAChB,SAAgB,wBAAwB,CAAC,KAAgB,EAAE,MAA8B;IACvF,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IACjE,MAAM,KAAK,GAAG,uBAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,YAAY,CAAC;IACjB,IAAI,SAAS,KAAK,KAAK,CAAC,YAAY;QAClC,YAAY,GAAG,uBAAO,CAAC,QAAQ,CAAsB,KAAK,CAAC,YAAY,CAAC,CAAC;IAE3E,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;AACzF,CAAC;AATD,4DASC;AAED;;;GAGG;AACH,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,2CAAE,CAAA;IACF,6CAAG,CAAA;AACL,CAAC,EAHW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAGvB;AAUD;;GAEG;AACH,MAAa,UAAW,SAAQ,eAAI;IAQlC,YAAmB,MAAwB,EAAE,IAAoB;QAC/D,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,cAAc,CAAC;QAE7C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,2DAA2D;YAChH,oGAAoG;YACpG,MAAM,YAAY,GAAG,qBAAS,CAAC,SAAS,CAAC,uBAAuB,CAAC;YACjE,IAAI,YAAY,GAAG,CAAC,IAAI,IAAA,uCAAyB,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,YAAY;gBACrH,IAAI,CAAC,OAAO,EAAE,CAAC;SAClB;IACH,CAAC;IAED,IAAW,UAAU,KAAqB,OAAO,IAAI,CAAC,IAAsB,CAAC,CAAC,CAAC;IAC/E,IAAW,cAAc,KAA+B,OAAO,IAAI,CAAC,QAAoC,CAAC,CAAC,CAAC;IAC3G,IAAW,iBAAiB,aAAa,OAAO,MAAA,IAAI,CAAC,kBAAkB,mCAAI,CAAC,CAAC,CAAC,CAAC;IAE/E,IAAW,cAAc,KAAyB,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IAChF,IAAW,iBAAiB,KAAK,OAAO,SAAS,KAAK,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAC5E,IAAoB,WAAW;;QAC7B,OAAO,KAAK,CAAC,WAAW,GAAG,CAAC,MAAA,IAAI,CAAC,cAAc,mCAAI,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,qBAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAEM,KAAK,CAAC,cAAc;QACzB,OAAO,qBAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,IAA8B,EAAE,MAAoB,EAAE,UAA0B;QACvG,IAAI,SAAS,KAAK,UAAU;YAC1B,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;QAErC,IAAA,qBAAM,EAAC,IAAI,YAAY,UAAU,CAAC,CAAC;QACnC,MAAM,YAAY,GAAG,yBAAU,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC;QACrC,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;QACzC,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC;QAE/B,IAAI,OAAO,GAAsB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAClD,IAAA,qBAAM,EAAC,wBAAU,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,wBAAU,CAAC,MAAM;YAC9B,OAAO,OAAO,CAAC;QAEjB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;QAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,GAAG,IAAI,CAAC;QAC/D,MAAM,MAAM,GAAG,qBAAU,CAAC,MAAM,CAAC;YAC/B,MAAM,EAAE,YAAY;YACpB,IAAI,EAAE,IAAI,CAAC,SAAS;YACpB,SAAS,EAAE,KAAK,KAAK,IAAI,CAAC,WAAW;YACrC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;YACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,sBAAsB;SAClF,CAAC,CAAC;QAEH,IAAI,SAAS,KAAK,MAAM,EAAE;YACxB,IAAI;gBACF,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;aAC/B;YAAC,MAAM;gBACN,EAAE;aACH;SACF;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEe,UAAU,CAAC,OAA0B;QACnD,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAE1B,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QAEpD,mHAAmH;QACnH,gEAAgE;QAChE,8GAA8G;QAC9G,IAAI,SAAS,KAAK,OAAO,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW;YACzD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAErD,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC;QACxC,IAAI,SAAS,KAAK,QAAQ,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,eAAe,IAAI,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE;YACrG,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;YAChC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACxG,IAAI,SAAS,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACzD,IAAI,CAAC,eAAe,EAAE,CAAC;SAC1B;IACH,CAAC;IAES,aAAa,CAAC,OAAmC,EAAE,MAA8B;QACzF,IAAI;YACF,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAA,mCAAqB,EAAC,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;YACvE,qBAAS,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEjD,MAAM,QAAQ,GAAiB,EAAE,CAAC;YAClC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC1E,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACtB;YAED,OAAO,CAAC,QAAQ,CAAC,CAAC;SACnB;QAAC,OAAO,GAAG,EAAE;YACZ,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,2BAAY,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACnF;IACH,CAAC;IAED,IAAuB,iBAAiB;QACtC,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,sBAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IACzE,CAAC;IAEkB,eAAe,CAAC,OAAuB,EAAE,IAAuB;QACjF,IAAI,4BAAiB,CAAC,YAAY,KAAK,IAAI,EAAE;YAC3C,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,OAAO;SACR;QAED,MAAM,MAAM,GAAG,IAAA,oCAAsB,EAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAQ,CAAC,KAAK,CAAC;YAC7D,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAU,CAAC,UAAU,CAAC,CAAC,CAAC,wBAAU,CAAC,KAAK,CAAC;YACzE,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAClD,IAAA,0BAAe,EAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACvD;IACH,CAAC;IAEM,aAAa,CAAC,SAAsB;QACzC,qFAAqF;QACrF,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;YACzC,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO;SACR;QAED,uFAAuF;QACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC;QACrC,IAAI,SAAS,KAAK,QAAQ;YACxB,KAAK,MAAM,KAAK,IAAI,QAAQ;gBAC1B,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAEM,WAAW,CAAC,QAAgB,EAAE,IAAkB,EAAE,UAAkB;QACzE,IAAI,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,yBAAc,CAAC,cAAc,KAAK,GAAG;YACvC,OAAO,YAAY,CAAC,EAAE,CAAC;QAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAC/C,IAAI,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ;YAClD,GAAG,GAAG,yBAAc,CAAC,OAAO,CAAC;QAE/B,IAAI,yBAAc,CAAC,OAAO,KAAK,GAAG,EAAE;YAClC,0FAA0F;YAC1F,IAAI,CAAC,IAAI,CAAC,OAAO;gBACf,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAE3B,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,8BAA8B;gBAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACrB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACrB;iBAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBACxB,mFAAmF;gBACnF,qDAAqD;gBACrD,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC;gBACpC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC;gBACjC,IAAI,SAAS,KAAK,IAAI;oBACpB,OAAO,YAAY,CAAC,GAAG,CAAC;gBAE1B,0EAA0E;gBAC1E,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE;oBACtD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;wBACtB,IAAI,YAAY,CAAC,GAAG,KAAK,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE;4BACpE,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC;4BAC9B,OAAO,YAAY,CAAC,GAAG,CAAC;yBACzB;wBAED,OAAO,YAAY,CAAC,EAAE,CAAC;qBACxB;iBACF;gBAED,0DAA0D;gBAC1D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;oBACtB,IAAI,yBAAc,CAAC,cAAc,KAAK,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE;wBACjE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;4BACpB,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC;4BAC9B,OAAO,YAAY,CAAC,GAAG,CAAC;yBACzB;6BAAM;4BACL,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;yBACpB;qBACF;iBACF;gBAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACrB;YAED,0DAA0D;YAC1D,OAAO,YAAY,CAAC,EAAE,CAAC;SACxB;QAED,2EAA2E;QAC3E,+FAA+F;QAC/F,+IAA+I;QAC/I,IAAI,eAAe,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC;QACrH,IAAI,eAAe,EAAE;YACnB,UAAU,GAAG,CAAC,CAAC;SAChB;aAAM;YACL,eAAe,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC;YACjH,IAAI,eAAe,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,kEAAkE;gBAC7G,2IAA2I;gBAC3I,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;gBACjF,IAAI,UAAU,EAAE;oBACd,IAAI,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc;wBAC9C,eAAe,GAAG,KAAK,CAAC;;wBAExB,UAAU,IAAI,CAAC,CAAC;iBACnB;aACF;SACF;QAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,mBAAmB;QACnE,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,IAAI,eAAe,IAAI,6BAAkB,CAAC,OAAO,KAAK,kBAAkB,EAAE;YACxE,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SACrB;QAED,IAAI,SAAS,KAAK,QAAQ,EAAE;YAC1B,2JAA2J;YAC3J,4KAA4K;YAC5K,MAAM,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC;YAC7D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpB,IAAI,YAAY,GAAG,IAAI,CAAC;YACxB,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC;YACpC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;gBAC5B,oFAAoF;gBACpF,IAAI,YAAY,CAAC,GAAG,KAAK,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE;oBACtE,IAAI,KAAK,CAAC,UAAU,KAAK,yBAAc,CAAC,QAAQ,EAAE;wBAChD,uHAAuH;wBACvH,YAAY,GAAG,eAAe,GAAG,KAAK,CAAC;qBACxC;yBAAM;wBACL,+JAA+J;wBAC/J,YAAY,GAAG,uBAAuB,CAAC;qBACxC;iBACF;aACF;YAED,IAAI,YAAY;gBACd,OAAO,YAAY,CAAC,EAAE,CAAC;YAEzB,qIAAqI;YACrI,IAAI,IAAI,CAAC,2BAA2B;gBAClC,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC;SACjC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,IAAI,CAAC,eAAe,EAAE;oBACpB,sGAAsG;oBACtG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;iBACtB;aACF;YAED,OAAO,YAAY,CAAC,EAAE,CAAC;SACxB;QAED,8EAA8E;QAC9E,IAAI,CAAC,eAAe;YAClB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAE3B,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC;IACvE,CAAC;CACF;AAvRD,gCAuRC","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 Tiles\n */\n\nimport { assert, BentleyError, BeTimePoint, ByteStream } from \"@itwin/core-bentley\";\nimport { Range3d } from \"@itwin/core-geometry\";\nimport {\n ColorDef, computeChildTileProps, computeChildTileRanges, computeTileChordTolerance, ElementAlignedBox3d, LinePixels, TileFormat, TileProps,\n} from \"@itwin/core-common\";\nimport { IModelApp } from \"../IModelApp\";\nimport { GraphicBuilder } from \"../render/GraphicBuilder\";\nimport { RenderSystem } from \"../render/RenderSystem\";\nimport {\n addRangeGraphic, ImdlReader, IModelTileTree, Tile, TileBoundingBoxes, TileContent, TileDrawArgs, TileLoadStatus, TileParams, TileRequest,\n TileRequestChannel, TileTreeLoadStatus, TileVisibility,\n} from \"./internal\";\n\n/** Parameters used to construct an [[IModelTile]].\n * @internal\n */\nexport interface IModelTileParams extends TileParams {\n sizeMultiplier?: number;\n}\n\n/** @internal */\nexport function iModelTileParamsFromJSON(props: TileProps, parent: IModelTile | undefined): IModelTileParams {\n const { contentId, maximumSize, isLeaf, sizeMultiplier } = props;\n const range = Range3d.fromJSON(props.range);\n\n let contentRange;\n if (undefined !== props.contentRange)\n contentRange = Range3d.fromJSON<ElementAlignedBox3d>(props.contentRange);\n\n return { contentId, range, maximumSize, isLeaf, parent, contentRange, sizeMultiplier };\n}\n\n/**\n * Indicates whether a parent tile should be drawn in place of a child tile.\n * @internal\n */\nexport enum SelectParent {\n No,\n Yes,\n}\n\n/** @internal */\nexport interface IModelTileContent extends TileContent {\n /** If this tile was produced by refinement, the multiplier applied to its screen size. */\n sizeMultiplier?: number;\n /** A bitfield describing empty sub-volumes of this tile's volume. */\n emptySubRangeMask?: number;\n}\n\n/** A tile belonging to an [[IModelTileTree].\n * @internal\n */\nexport class IModelTile extends Tile {\n private _sizeMultiplier?: number;\n private _emptySubRangeMask?: number;\n /** If an initial attempt to obtain this tile's content (e.g., from cloud storage cache) failed,\n * the next channel to try.\n */\n public requestChannel?: TileRequestChannel;\n\n public constructor(params: IModelTileParams, tree: IModelTileTree) {\n super(params, tree);\n this._sizeMultiplier = params.sizeMultiplier;\n\n if (!this.isLeaf && this.tree.is3d && !this.isReady) { // ###TODO: Want to know specifically if tree is *spatial*.\n // Do not sub-divide such that chord tolerance would be below specified minimum, if minimum defined.\n const minTolerance = IModelApp.tileAdmin.minimumSpatialTolerance;\n if (minTolerance > 0 && computeTileChordTolerance(this, this.tree.is3d, this.iModelTree.tileScreenSize) <= minTolerance)\n this.setLeaf();\n }\n }\n\n public get iModelTree(): IModelTileTree { return this.tree as IModelTileTree; }\n public get iModelChildren(): IModelTile[] | undefined { return this.children as IModelTile[] | undefined; }\n public get emptySubRangeMask(): number { return this._emptySubRangeMask ?? 0; }\n\n public get sizeMultiplier(): number | undefined { return this._sizeMultiplier; }\n public get hasSizeMultiplier() { return undefined !== this.sizeMultiplier; }\n public override get maximumSize(): number {\n return super.maximumSize * (this.sizeMultiplier ?? 1.0);\n }\n\n public get channel(): TileRequestChannel {\n return IModelApp.tileAdmin.channels.getIModelTileChannel(this);\n }\n\n public async requestContent(): Promise<TileRequest.Response> {\n return IModelApp.tileAdmin.generateTileContent(this);\n }\n\n public async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<IModelTileContent> {\n if (undefined === isCanceled)\n isCanceled = () => !this.isLoading;\n\n assert(data instanceof Uint8Array);\n const streamBuffer = ByteStream.fromUint8Array(data);\n\n const position = streamBuffer.curPos;\n const format = streamBuffer.readUint32();\n streamBuffer.curPos = position;\n\n let content: IModelTileContent = { isLeaf: true };\n assert(TileFormat.IModel === format);\n if (format !== TileFormat.IModel)\n return content;\n\n const tree = this.iModelTree;\n const sizeMultiplier = this.hasSizeMultiplier ? this.sizeMultiplier : undefined;\n const { iModel, modelId, is3d, containsTransformNodes } = tree;\n const reader = ImdlReader.create({\n stream: streamBuffer,\n type: tree.batchType,\n loadEdges: false !== tree.edgeOptions,\n options: { tileId: this.contentId },\n timeline: tree.timeline,\n iModel, modelId, is3d, system, isCanceled, sizeMultiplier, containsTransformNodes,\n });\n\n if (undefined !== reader) {\n try {\n content = await reader.read();\n } catch {\n //\n }\n }\n\n return content;\n }\n\n public override setContent(content: IModelTileContent): void {\n super.setContent(content);\n\n this._emptySubRangeMask = content.emptySubRangeMask;\n\n // NB: If this tile has no graphics, it may or may not have children - but we don't want to load the children until\n // this tile is too coarse for view based on its size in pixels.\n // That is different than an \"undisplayable\" tile (maximumSize=0) whose children should be loaded immediately.\n if (undefined !== content.graphic && 0 === this.maximumSize)\n this._maximumSize = this.iModelTree.tileScreenSize;\n\n const sizeMult = content.sizeMultiplier;\n if (undefined !== sizeMult && (undefined === this._sizeMultiplier || sizeMult > this._sizeMultiplier)) {\n this._sizeMultiplier = sizeMult;\n this._contentId = this.iModelTree.contentIdProvider.idFromParentAndMultiplier(this.contentId, sizeMult);\n if (undefined !== this.children && this.children.length > 1)\n this.disposeChildren();\n }\n }\n\n protected _loadChildren(resolve: (children: Tile[]) => void, reject: (error: Error) => void): void {\n try {\n const tree = this.iModelTree;\n const kids = computeChildTileProps(this, tree.contentIdProvider, tree);\n IModelApp.tileAdmin.onTilesElided(kids.numEmpty);\n\n const children: IModelTile[] = [];\n for (const props of kids.children) {\n const child = new IModelTile(iModelTileParamsFromJSON(props, this), tree);\n children.push(child);\n }\n\n resolve(children);\n } catch (err) {\n reject(err instanceof Error ? err : new Error(BentleyError.getErrorMessage(err)));\n }\n }\n\n protected override get rangeGraphicColor(): ColorDef {\n return this.hasSizeMultiplier ? ColorDef.red : super.rangeGraphicColor;\n }\n\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\n if (TileBoundingBoxes.ChildVolumes !== type) {\n super.addRangeGraphic(builder, type);\n return;\n }\n\n const ranges = computeChildTileRanges(this, this.iModelTree);\n for (const range of ranges) {\n const color = range.isEmpty ? ColorDef.blue : ColorDef.green;\n const pixels = !range.isEmpty ? LinePixels.HiddenLine : LinePixels.Solid;\n const width = !range.isEmpty ? 2 : 1;\n builder.setSymbology(color, color, width, pixels);\n addRangeGraphic(builder, range.range, this.tree.is2d);\n }\n }\n\n public pruneChildren(olderThan: BeTimePoint): void {\n // A tile's usage marker indicates its the most recent time its *children* were used.\n if (this.usageMarker.isExpired(olderThan)) {\n this.disposeChildren();\n return;\n }\n\n // this node has been used recently. Keep it, but potentially unload its grandchildren.\n const children = this.iModelChildren;\n if (undefined !== children)\n for (const child of children)\n child.pruneChildren(olderThan);\n }\n\n public selectTiles(selected: Tile[], args: TileDrawArgs, numSkipped: number): SelectParent {\n let vis = this.computeVisibility(args);\n if (TileVisibility.OutsideFrustum === vis)\n return SelectParent.No;\n\n const maxDepth = this.iModelTree.debugMaxDepth;\n if (undefined !== maxDepth && this.depth >= maxDepth)\n vis = TileVisibility.Visible;\n\n if (TileVisibility.Visible === vis) {\n // This tile is of appropriate resolution to draw. If need loading or refinement, enqueue.\n if (!this.isReady)\n args.insertMissing(this);\n\n if (this.hasGraphics) {\n // It can be drawn - select it\n args.markReady(this);\n selected.push(this);\n } else if (!this.isReady) {\n // It can't be drawn. Try to draw children in its place; otherwise draw the parent.\n // Do not load/request the children for this purpose.\n const initialSize = selected.length;\n const kids = this.iModelChildren;\n if (undefined === kids)\n return SelectParent.Yes;\n\n // Find any descendant to draw, until we exceed max initial tiles to skip.\n if (this.depth < this.iModelTree.maxInitialTilesToSkip) {\n for (const kid of kids) {\n if (SelectParent.Yes === kid.selectTiles(selected, args, numSkipped)) {\n selected.length = initialSize;\n return SelectParent.Yes;\n }\n\n return SelectParent.No;\n }\n }\n\n // If all visible direct children can be drawn, draw them.\n for (const kid of kids) {\n if (TileVisibility.OutsideFrustum !== kid.computeVisibility(args)) {\n if (!kid.hasGraphics) {\n selected.length = initialSize;\n return SelectParent.Yes;\n } else {\n selected.push(kid);\n }\n }\n }\n\n args.markUsed(this);\n }\n\n // We're drawing either this tile, or its direct children.\n return SelectParent.No;\n }\n\n // This tile is too coarse to draw. Try to draw something more appropriate.\n // If it is not ready to draw, we may want to skip loading in favor of loading its descendants.\n // If we previously loaded and later unloaded content for this tile to free memory, don't force it to reload its content - proceed to children.\n let canSkipThisTile = (this._hadGraphics && !this.hasGraphics) || this.depth < this.iModelTree.maxInitialTilesToSkip;\n if (canSkipThisTile) {\n numSkipped = 1;\n } else {\n canSkipThisTile = this.isReady || this.isParentDisplayable || this.depth < this.iModelTree.maxInitialTilesToSkip;\n if (canSkipThisTile && this.isDisplayable) { // skipping an undisplayable tile doesn't count toward the maximum\n // Some tiles do not sub-divide - they only facet the same geometry to a higher resolution. We can skip directly to the correct resolution.\n const isNotReady = !this.isReady && !this.hasGraphics && !this.hasSizeMultiplier;\n if (isNotReady) {\n if (numSkipped >= this.iModelTree.maxTilesToSkip)\n canSkipThisTile = false;\n else\n numSkipped += 1;\n }\n }\n }\n\n const childrenLoadStatus = this.loadChildren(); // NB: asynchronous\n const children = canSkipThisTile ? this.iModelChildren : undefined;\n if (canSkipThisTile && TileTreeLoadStatus.Loading === childrenLoadStatus) {\n args.markChildrenLoading();\n args.markUsed(this);\n }\n\n if (undefined !== children) {\n // If we are the root tile and we are not displayable, then we want to draw *any* currently available children in our place, or else we would draw nothing.\n // Otherwise, if we want to draw children in our place, we should wait for *all* of them to load, or else we would show missing chunks where not-yet-loaded children belong.\n const isUndisplayableRootTile = this.isUndisplayableRootTile;\n args.markUsed(this);\n let drawChildren = true;\n const initialSize = selected.length;\n for (const child of children) {\n // NB: We must continue iterating children so that they can be requested if missing.\n if (SelectParent.Yes === child.selectTiles(selected, args, numSkipped)) {\n if (child.loadStatus === TileLoadStatus.NotFound) {\n // At least one child we want to draw failed to load. e.g., we reached max depth of map tile tree. Draw parent instead.\n drawChildren = canSkipThisTile = false;\n } else {\n // At least one child we want to draw is not yet loaded. Wait for it to load before drawing it and its siblings, unless we have nothing to draw in their place.\n drawChildren = isUndisplayableRootTile;\n }\n }\n }\n\n if (drawChildren)\n return SelectParent.No;\n\n // Some types of tiles (like maps) allow the ready children to be drawn on top of the parent while other children are not yet loaded.\n if (args.parentsAndChildrenExclusive)\n selected.length = initialSize;\n }\n\n if (this.isReady) {\n if (this.hasGraphics) {\n selected.push(this);\n if (!canSkipThisTile) {\n // This tile is too coarse, but we require loading it before we can start loading higher-res children.\n args.markReady(this);\n }\n }\n\n return SelectParent.No;\n }\n\n // This tile is not ready to be drawn. Request it *only* if we cannot skip it.\n if (!canSkipThisTile)\n args.insertMissing(this);\n\n return this.isParentDisplayable ? SelectParent.Yes : SelectParent.No;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"IModelTile.js","sourceRoot":"","sources":["../../../src/tile/IModelTile.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 Tiles\n */\n\nimport { assert, BentleyError, BeTimePoint, ByteStream } from \"@itwin/core-bentley\";\nimport { Range3d } from \"@itwin/core-geometry\";\nimport {\n ColorDef, computeChildTileProps, computeChildTileRanges, computeTileChordTolerance, ElementAlignedBox3d, LinePixels, TileFormat, TileProps,\n} from \"@itwin/core-common\";\nimport { IModelApp } from \"../IModelApp\";\nimport { GraphicBuilder } from \"../render/GraphicBuilder\";\nimport { RenderSystem } from \"../render/RenderSystem\";\nimport {\n addRangeGraphic, ImdlReader, IModelTileTree, Tile, TileBoundingBoxes, TileContent, TileDrawArgs, TileLoadStatus, TileParams, TileRequest,\n TileRequestChannel, TileTreeLoadStatus, TileVisibility,\n} from \"./internal\";\n\n/** Parameters used to construct an [[IModelTile]].\n * @internal\n */\nexport interface IModelTileParams extends TileParams {\n sizeMultiplier?: number;\n}\n\n/** @internal */\nexport function iModelTileParamsFromJSON(props: TileProps, parent: IModelTile | undefined): IModelTileParams {\n const { contentId, maximumSize, isLeaf, sizeMultiplier } = props;\n const range = Range3d.fromJSON(props.range);\n\n let contentRange;\n if (undefined !== props.contentRange)\n contentRange = Range3d.fromJSON<ElementAlignedBox3d>(props.contentRange);\n\n return { contentId, range, maximumSize, isLeaf, parent, contentRange, sizeMultiplier };\n}\n\n/**\n * Indicates whether a parent tile should be drawn in place of a child tile.\n * @internal\n */\nexport enum SelectParent {\n No,\n Yes,\n}\n\n/** @internal */\nexport interface IModelTileContent extends TileContent {\n /** If this tile was produced by refinement, the multiplier applied to its screen size. */\n sizeMultiplier?: number;\n /** A bitfield describing empty sub-volumes of this tile's volume. */\n emptySubRangeMask?: number;\n}\n\n/** A tile belonging to an [[IModelTileTree].\n * @internal\n */\nexport class IModelTile extends Tile {\n private _sizeMultiplier?: number;\n private _emptySubRangeMask?: number;\n /** If an initial attempt to obtain this tile's content (e.g., from cloud storage cache) failed,\n * the next channel to try.\n */\n public requestChannel?: TileRequestChannel;\n\n public constructor(params: IModelTileParams, tree: IModelTileTree) {\n super(params, tree);\n this._sizeMultiplier = params.sizeMultiplier;\n\n if (!this.isLeaf && this.tree.is3d && !this.isReady) { // ###TODO: Want to know specifically if tree is *spatial*.\n // Do not sub-divide such that chord tolerance would be below specified minimum, if minimum defined.\n const minTolerance = IModelApp.tileAdmin.minimumSpatialTolerance;\n if (minTolerance > 0 && computeTileChordTolerance(this, this.tree.is3d, this.iModelTree.tileScreenSize) <= minTolerance)\n this.setLeaf();\n }\n }\n\n public get iModelTree(): IModelTileTree { return this.tree as IModelTileTree; }\n public get iModelChildren(): IModelTile[] | undefined { return this.children as IModelTile[] | undefined; }\n public get emptySubRangeMask(): number { return this._emptySubRangeMask ?? 0; }\n\n public get sizeMultiplier(): number | undefined { return this._sizeMultiplier; }\n public get hasSizeMultiplier() { return undefined !== this.sizeMultiplier; }\n public override get maximumSize(): number {\n return super.maximumSize * (this.sizeMultiplier ?? 1.0);\n }\n\n public get channel(): TileRequestChannel {\n return IModelApp.tileAdmin.channels.getIModelTileChannel(this);\n }\n\n public async requestContent(): Promise<TileRequest.Response> {\n return IModelApp.tileAdmin.generateTileContent(this);\n }\n\n public async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<IModelTileContent> {\n if (undefined === isCanceled)\n isCanceled = () => !this.isLoading;\n\n assert(data instanceof Uint8Array);\n const streamBuffer = ByteStream.fromUint8Array(data);\n\n const position = streamBuffer.curPos;\n const format = streamBuffer.readUint32();\n streamBuffer.curPos = position;\n\n let content: IModelTileContent = { isLeaf: true };\n assert(TileFormat.IModel === format);\n if (format !== TileFormat.IModel)\n return content;\n\n const tree = this.iModelTree;\n const sizeMultiplier = this.hasSizeMultiplier ? this.sizeMultiplier : undefined;\n const { iModel, modelId, is3d, containsTransformNodes } = tree;\n const reader = ImdlReader.create({\n stream: streamBuffer,\n type: tree.batchType,\n loadEdges: false !== tree.edgeOptions,\n options: { tileId: this.contentId },\n timeline: tree.timeline,\n iModel, modelId, is3d, system, isCanceled, sizeMultiplier, containsTransformNodes,\n });\n\n if (undefined !== reader) {\n try {\n content = await reader.read();\n } catch {\n //\n }\n }\n\n return content;\n }\n\n public override setContent(content: IModelTileContent): void {\n super.setContent(content);\n\n this._emptySubRangeMask = content.emptySubRangeMask;\n\n // NB: If this tile has no graphics, it may or may not have children - but we don't want to load the children until\n // this tile is too coarse for view based on its size in pixels.\n // That is different than an \"undisplayable\" tile (maximumSize=0) whose children should be loaded immediately.\n if (undefined !== content.graphic && 0 === this.maximumSize)\n this._maximumSize = this.iModelTree.tileScreenSize;\n\n const sizeMult = content.sizeMultiplier;\n if (undefined !== sizeMult && (undefined === this._sizeMultiplier || sizeMult > this._sizeMultiplier)) {\n this._sizeMultiplier = sizeMult;\n this._contentId = this.iModelTree.contentIdProvider.idFromParentAndMultiplier(this.contentId, sizeMult);\n if (undefined !== this.children && this.children.length > 1)\n this.disposeChildren();\n }\n }\n\n protected _loadChildren(resolve: (children: Tile[]) => void, reject: (error: Error) => void): void {\n try {\n const tree = this.iModelTree;\n const kids = computeChildTileProps(this, tree.contentIdProvider, tree);\n IModelApp.tileAdmin.onTilesElided(kids.numEmpty);\n\n const children: IModelTile[] = [];\n for (const props of kids.children) {\n const child = new IModelTile(iModelTileParamsFromJSON(props, this), tree);\n children.push(child);\n }\n\n resolve(children);\n } catch (err) {\n reject(err instanceof Error ? err : new Error(BentleyError.getErrorMessage(err)));\n }\n }\n\n protected override get rangeGraphicColor(): ColorDef {\n return this.hasSizeMultiplier ? ColorDef.red : super.rangeGraphicColor;\n }\n\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\n if (TileBoundingBoxes.ChildVolumes !== type) {\n super.addRangeGraphic(builder, type);\n return;\n }\n\n const ranges = computeChildTileRanges(this, this.iModelTree);\n for (const range of ranges) {\n const color = range.isEmpty ? ColorDef.blue : ColorDef.green;\n const pixels = !range.isEmpty ? LinePixels.HiddenLine : LinePixels.Solid;\n const width = !range.isEmpty ? 2 : 1;\n builder.setSymbology(color, color, width, pixels);\n addRangeGraphic(builder, range.range, this.tree.is2d);\n }\n }\n\n public pruneChildren(olderThan: BeTimePoint): void {\n // A tile's usage marker indicates its the most recent time its *children* were used.\n if (this.usageMarker.isExpired(olderThan)) {\n this.disposeChildren();\n return;\n }\n\n // this node has been used recently. Keep it, but potentially unload its grandchildren.\n const children = this.iModelChildren;\n if (undefined !== children)\n for (const child of children)\n child.pruneChildren(olderThan);\n }\n\n public selectTiles(selected: Tile[], args: TileDrawArgs, numSkipped: number): SelectParent {\n let vis = this.computeVisibility(args);\n if (TileVisibility.OutsideFrustum === vis)\n return SelectParent.No;\n\n const maxDepth = this.iModelTree.debugMaxDepth;\n if (undefined !== maxDepth && this.depth >= maxDepth)\n vis = TileVisibility.Visible;\n\n if (TileVisibility.Visible === vis) {\n // This tile is of appropriate resolution to draw. If need loading or refinement, enqueue.\n if (!this.isReady)\n args.insertMissing(this);\n\n if (this.hasGraphics) {\n // It can be drawn - select it\n args.markReady(this);\n selected.push(this);\n } else if (!this.isReady) {\n // It can't be drawn. Try to draw children in its place; otherwise draw the parent.\n // Do not load/request the children for this purpose.\n const initialSize = selected.length;\n const kids = this.iModelChildren;\n if (undefined === kids)\n return SelectParent.Yes;\n\n // Find any descendant to draw, until we exceed max initial tiles to skip.\n if (this.depth < this.iModelTree.maxInitialTilesToSkip) {\n for (const kid of kids) {\n if (SelectParent.Yes === kid.selectTiles(selected, args, numSkipped)) {\n selected.length = initialSize;\n return SelectParent.Yes;\n }\n\n return SelectParent.No;\n }\n }\n\n // If all visible direct children can be drawn, draw them.\n for (const kid of kids) {\n if (TileVisibility.OutsideFrustum !== kid.computeVisibility(args)) {\n if (!kid.hasGraphics) {\n selected.length = initialSize;\n return SelectParent.Yes;\n } else {\n selected.push(kid);\n }\n }\n }\n\n args.markUsed(this);\n }\n\n // We're drawing either this tile, or its direct children.\n return SelectParent.No;\n }\n\n // This tile is too coarse to draw. Try to draw something more appropriate.\n // If it is not ready to draw, we may want to skip loading in favor of loading its descendants.\n // If we previously loaded and later unloaded content for this tile to free memory, don't force it to reload its content - proceed to children.\n let canSkipThisTile = (this._hadGraphics && !this.hasGraphics) || this.depth < this.iModelTree.maxInitialTilesToSkip;\n if (canSkipThisTile) {\n numSkipped = 1;\n } else {\n canSkipThisTile = this.isReady || this.isParentDisplayable || this.depth < this.iModelTree.maxInitialTilesToSkip;\n if (canSkipThisTile && this.isDisplayable) { // skipping an undisplayable tile doesn't count toward the maximum\n // Some tiles do not sub-divide - they only facet the same geometry to a higher resolution. We can skip directly to the correct resolution.\n const isNotReady = !this.isReady && !this.hasGraphics && !this.hasSizeMultiplier;\n if (isNotReady) {\n if (numSkipped >= this.iModelTree.maxTilesToSkip)\n canSkipThisTile = false;\n else\n numSkipped += 1;\n }\n }\n }\n\n const childrenLoadStatus = this.loadChildren(); // NB: asynchronous\n const children = canSkipThisTile ? this.iModelChildren : undefined;\n if (canSkipThisTile && TileTreeLoadStatus.Loading === childrenLoadStatus) {\n args.markChildrenLoading();\n args.markUsed(this);\n }\n\n if (undefined !== children) {\n // If we are the root tile and we are not displayable, then we want to draw *any* currently available children in our place, or else we would draw nothing.\n // Otherwise, if we want to draw children in our place, we should wait for *all* of them to load, or else we would show missing chunks where not-yet-loaded children belong.\n const isUndisplayableRootTile = this.isUndisplayableRootTile;\n args.markUsed(this);\n let drawChildren = true;\n const initialSize = selected.length;\n for (const child of children) {\n // NB: We must continue iterating children so that they can be requested if missing.\n if (SelectParent.Yes === child.selectTiles(selected, args, numSkipped)) {\n if (child.loadStatus === TileLoadStatus.NotFound) {\n // At least one child we want to draw failed to load. e.g., we reached max depth of map tile tree. Draw parent instead.\n drawChildren = canSkipThisTile = false;\n } else {\n // At least one child we want to draw is not yet loaded. Wait for it to load before drawing it and its siblings, unless we have nothing to draw in their place.\n drawChildren = isUndisplayableRootTile;\n }\n }\n }\n\n if (drawChildren)\n return SelectParent.No;\n\n // Some types of tiles (like maps) allow the ready children to be drawn on top of the parent while other children are not yet loaded.\n if (args.parentsAndChildrenExclusive)\n selected.length = initialSize;\n }\n\n if (this.isReady) {\n if (this.hasGraphics) {\n selected.push(this);\n if (!canSkipThisTile) {\n // This tile is too coarse, but we require loading it before we can start loading higher-res children.\n args.markReady(this);\n }\n }\n\n return SelectParent.No;\n }\n\n // This tile is not ready to be drawn. Request it *only* if we cannot skip it.\n if (!canSkipThisTile)\n args.insertMissing(this);\n\n return this.isParentDisplayable ? SelectParent.Yes : SelectParent.No;\n }\n}\n"]}
|
|
@@ -72,10 +72,9 @@ class IModelTileMetadataCacheChannel extends internal_1.TileRequestChannel {
|
|
|
72
72
|
this._cacheByIModel = new Map();
|
|
73
73
|
}
|
|
74
74
|
onNoContent(request) {
|
|
75
|
-
var _a;
|
|
76
75
|
(0, core_bentley_1.assert)(request.tile instanceof internal_1.IModelTile);
|
|
77
76
|
const channels = IModelApp_1.IModelApp.tileAdmin.channels.iModelChannels;
|
|
78
|
-
request.tile.requestChannel =
|
|
77
|
+
request.tile.requestChannel = channels.cloudStorage ?? channels.rpc;
|
|
79
78
|
return true;
|
|
80
79
|
}
|
|
81
80
|
async requestContent(tile) {
|
|
@@ -84,14 +83,13 @@ class IModelTileMetadataCacheChannel extends internal_1.TileRequestChannel {
|
|
|
84
83
|
return content ? { content } : undefined;
|
|
85
84
|
}
|
|
86
85
|
getCachedContent(tile) {
|
|
87
|
-
|
|
88
|
-
const cached = (_b = (_a = this._cacheByIModel.get(tile.iModel)) === null || _a === void 0 ? void 0 : _a.get(tile.tree)) === null || _b === void 0 ? void 0 : _b.findEquivalent((x) => (0, core_bentley_1.compareStrings)(x.contentId, tile.contentId));
|
|
86
|
+
const cached = this._cacheByIModel.get(tile.iModel)?.get(tile.tree)?.findEquivalent((x) => (0, core_bentley_1.compareStrings)(x.contentId, tile.contentId));
|
|
89
87
|
if (!cached)
|
|
90
88
|
return undefined;
|
|
91
89
|
const content = {
|
|
92
90
|
...cached,
|
|
93
91
|
graphic: cached.hasGraphic ? IModelApp_1.IModelApp.renderSystem.createGraphicList([]) : undefined,
|
|
94
|
-
contentRange:
|
|
92
|
+
contentRange: cached.contentRange?.clone(),
|
|
95
93
|
};
|
|
96
94
|
return content;
|
|
97
95
|
}
|
|
@@ -102,7 +100,6 @@ class IModelTileMetadataCacheChannel extends internal_1.TileRequestChannel {
|
|
|
102
100
|
channel.contentCallback = (tile, content) => this.cache(tile, content);
|
|
103
101
|
}
|
|
104
102
|
cache(tile, content) {
|
|
105
|
-
var _a;
|
|
106
103
|
(0, core_bentley_1.assert)(tile instanceof internal_1.IModelTile);
|
|
107
104
|
let trees = this._cacheByIModel.get(tile.iModel);
|
|
108
105
|
if (!trees)
|
|
@@ -114,7 +111,7 @@ class IModelTileMetadataCacheChannel extends internal_1.TileRequestChannel {
|
|
|
114
111
|
list.insert({
|
|
115
112
|
contentId: tile.contentId,
|
|
116
113
|
hasGraphic: undefined !== content.graphic,
|
|
117
|
-
contentRange:
|
|
114
|
+
contentRange: content.contentRange?.clone(),
|
|
118
115
|
isLeaf: content.isLeaf,
|
|
119
116
|
sizeMultiplier: content.sizeMultiplier,
|
|
120
117
|
emptySubRangeMask: content.emptySubRangeMask,
|
|
@@ -126,7 +123,6 @@ class IModelTileMetadataCacheChannel extends internal_1.TileRequestChannel {
|
|
|
126
123
|
*/
|
|
127
124
|
class IModelTileRequestChannels {
|
|
128
125
|
constructor(args) {
|
|
129
|
-
var _a;
|
|
130
126
|
const channelName = "itwinjs-tile-rpc";
|
|
131
127
|
this.rpc = args.usesHttp ? new internal_1.TileRequestChannel(channelName, args.concurrency) : new IModelTileChannel(channelName, args.concurrency);
|
|
132
128
|
if (args.cacheMetadata) {
|
|
@@ -134,7 +130,7 @@ class IModelTileRequestChannels {
|
|
|
134
130
|
this._contentCache.registerChannel(this.rpc);
|
|
135
131
|
}
|
|
136
132
|
this._cloudStorage = new CloudStorageCacheChannel("itwinjs-cloud-cache", args.cacheConcurrency);
|
|
137
|
-
|
|
133
|
+
this._contentCache?.registerChannel(this._cloudStorage);
|
|
138
134
|
}
|
|
139
135
|
get cloudStorage() {
|
|
140
136
|
return this._cloudStorage;
|
|
@@ -155,8 +151,7 @@ class IModelTileRequestChannels {
|
|
|
155
151
|
}
|
|
156
152
|
/** Strictly for tests. */
|
|
157
153
|
getCachedContent(tile) {
|
|
158
|
-
|
|
159
|
-
return (_a = this._contentCache) === null || _a === void 0 ? void 0 : _a.getCachedContent(tile);
|
|
154
|
+
return this._contentCache?.getCachedContent(tile);
|
|
160
155
|
}
|
|
161
156
|
}
|
|
162
157
|
exports.IModelTileRequestChannels = IModelTileRequestChannels;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IModelTileRequestChannels.js","sourceRoot":"","sources":["../../../src/tile/IModelTileRequestChannels.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 Tiles\n */\n\nimport { assert, compareStrings, SortedArray } from \"@itwin/core-bentley\";\nimport { TileTreeContentIds } from \"@itwin/core-common\";\nimport { IModelApp } from \"../IModelApp\";\nimport { IpcApp } from \"../IpcApp\";\nimport { IModelConnection } from \"../IModelConnection\";\nimport { IModelTile, IModelTileContent, Tile, TileRequest, TileRequestChannel, TileTree } from \"./internal\";\n\n/** Handles requests to the cloud storage tile cache, if one is configured. If a tile's content is not found in the cache, subsequent requests for the same tile will\n * use the IModelTileChannel instead.\n */\nclass CloudStorageCacheChannel extends TileRequestChannel {\n public override async requestContent(tile: Tile): Promise<TileRequest.Response> {\n assert(tile instanceof IModelTile);\n return IModelApp.tileAdmin.requestCachedTileContent(tile);\n }\n\n public override onNoContent(request: TileRequest): boolean {\n assert(request.tile instanceof IModelTile);\n request.tile.requestChannel = IModelApp.tileAdmin.channels.iModelChannels.rpc;\n ++this._statistics.totalCacheMisses;\n return true;\n }\n}\n\n/** For an [[IpcApp]], allows backend tile generation requests in progress to be canceled. */\nclass IModelTileChannel extends TileRequestChannel {\n private readonly _canceled = new Map<IModelConnection, Map<string, Set<string>>>();\n\n public override onActiveRequestCanceled(request: TileRequest): void {\n const tree = request.tile.tree;\n let entry = this._canceled.get(tree.iModel);\n if (!entry)\n this._canceled.set(tree.iModel, entry = new Map<string, Set<string>>());\n\n let ids = entry.get(tree.id);\n if (!ids)\n entry.set(tree.id, ids = new Set<string>());\n\n ids.add(request.tile.contentId);\n }\n\n public override processCancellations(): void {\n for (const [imodel, entries] of this._canceled) {\n const treeContentIds: TileTreeContentIds[] = [];\n for (const [treeId, tileIds] of entries) {\n const contentIds = Array.from(tileIds);\n treeContentIds.push({ treeId, contentIds });\n this._statistics.totalAbortedRequests += contentIds.length;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n IpcApp.appFunctionIpc.cancelTileContentRequests(imodel.getRpcProps(), treeContentIds);\n }\n\n this._canceled.clear();\n }\n\n public override onIModelClosed(imodel: IModelConnection): void {\n this._canceled.delete(imodel);\n }\n}\n\ninterface CachedContent extends Omit<IModelTileContent, \"graphic\"> {\n contentId: string;\n hasGraphic: boolean;\n}\n\n/** If TileAdmin.Props.cacheTileMetadata is true, then this is the first channel through which we request content for an IModelTile.\n * It serves a niche purpose: a tile pre-generation agent that wants to ensure that every tile selected during interaction with the application\n * has its tile generated and cached in cloud storage. This agent might request thousands of tiles in sequence, causing a given tile to be discarded\n * and reloaded many times. To avoid pointlessly reloading tiles whose contents have already been generated, this channel caches the metadata for each tile;\n * on subsequent requests for the same tile, it produces the metadata and an empty RenderGraphic.\n */\nclass IModelTileMetadataCacheChannel extends TileRequestChannel {\n private readonly _cacheByIModel = new Map<IModelConnection, Map<TileTree, SortedArray<CachedContent>>>();\n\n public constructor() {\n super(\"itwinjs-imodel-metadata-cache\", 100);\n }\n\n public override onNoContent(request: TileRequest): boolean {\n assert(request.tile instanceof IModelTile);\n const channels = IModelApp.tileAdmin.channels.iModelChannels;\n request.tile.requestChannel = channels.cloudStorage ?? channels.rpc;\n return true;\n }\n\n public override async requestContent(tile: Tile): Promise<TileRequest.Response> {\n assert(tile instanceof IModelTile);\n const content = this.getCachedContent(tile);\n return content ? { content } : undefined;\n }\n\n public getCachedContent(tile: IModelTile): IModelTileContent | undefined {\n const cached = this._cacheByIModel.get(tile.iModel)?.get(tile.tree)?.findEquivalent((x) => compareStrings(x.contentId, tile.contentId));\n if (!cached)\n return undefined;\n\n const content: IModelTileContent = {\n ...cached,\n graphic: cached.hasGraphic ? IModelApp.renderSystem.createGraphicList([]) : undefined,\n contentRange: cached.contentRange?.clone(),\n };\n\n return content;\n }\n\n public override onIModelClosed(imodel: IModelConnection): void {\n this._cacheByIModel.delete(imodel);\n }\n\n public registerChannel(channel: TileRequestChannel): void {\n channel.contentCallback = (tile, content) => this.cache(tile, content);\n }\n\n private cache(tile: Tile, content: IModelTileContent): void {\n assert(tile instanceof IModelTile);\n let trees = this._cacheByIModel.get(tile.iModel);\n if (!trees)\n this._cacheByIModel.set(tile.iModel, trees = new Map<TileTree, SortedArray<CachedContent>>());\n\n let list = trees.get(tile.tree);\n if (!list)\n trees.set(tile.tree, list = new SortedArray<CachedContent>((lhs, rhs) => compareStrings(lhs.contentId, rhs.contentId)));\n\n assert(undefined === list.findEquivalent((x) => compareStrings(x.contentId, tile.contentId)));\n list.insert({\n contentId: tile.contentId,\n hasGraphic: undefined !== content.graphic,\n contentRange: content.contentRange?.clone(),\n isLeaf: content.isLeaf,\n sizeMultiplier: content.sizeMultiplier,\n emptySubRangeMask: content.emptySubRangeMask,\n });\n }\n}\n\n/** TileRequestChannels used for requesting content for IModelTiles.\n * @internal\n */\nexport class IModelTileRequestChannels {\n private _cloudStorage: TileRequestChannel;\n private readonly _contentCache?: IModelTileMetadataCacheChannel;\n public readonly rpc: TileRequestChannel;\n\n public constructor(args: {\n concurrency: number;\n usesHttp: boolean;\n cacheMetadata: boolean;\n cacheConcurrency: number;\n }) {\n const channelName = \"itwinjs-tile-rpc\";\n this.rpc = args.usesHttp ? new TileRequestChannel(channelName, args.concurrency) : new IModelTileChannel(channelName, args.concurrency);\n\n if (args.cacheMetadata) {\n this._contentCache = new IModelTileMetadataCacheChannel();\n this._contentCache.registerChannel(this.rpc);\n }\n\n this._cloudStorage = new CloudStorageCacheChannel(\"itwinjs-cloud-cache\", args.cacheConcurrency);\n this._contentCache?.registerChannel(this._cloudStorage);\n }\n\n public get cloudStorage(): TileRequestChannel {\n return this._cloudStorage;\n }\n\n public [Symbol.iterator](): Iterator<TileRequestChannel> {\n const channels = [this.rpc];\n if (this._cloudStorage)\n channels.push(this._cloudStorage);\n\n if (this._contentCache)\n channels.push(this._contentCache);\n\n return channels[Symbol.iterator]();\n }\n\n public setRpcConcurrency(concurrency: number): void {\n this.rpc.concurrency = concurrency;\n }\n\n public getChannelForTile(tile: IModelTile): TileRequestChannel {\n return tile.requestChannel || this._contentCache || this._cloudStorage || this.rpc;\n }\n\n /** Strictly for tests. */\n public getCachedContent(tile: IModelTile): IModelTileContent | undefined {\n return this._contentCache?.getCachedContent(tile);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"IModelTileRequestChannels.js","sourceRoot":"","sources":["../../../src/tile/IModelTileRequestChannels.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 Tiles\n */\n\nimport { assert, compareStrings, SortedArray } from \"@itwin/core-bentley\";\nimport { TileTreeContentIds } from \"@itwin/core-common\";\nimport { IModelApp } from \"../IModelApp\";\nimport { IpcApp } from \"../IpcApp\";\nimport { IModelConnection } from \"../IModelConnection\";\nimport { IModelTile, IModelTileContent, Tile, TileRequest, TileRequestChannel, TileTree } from \"./internal\";\n\n/** Handles requests to the cloud storage tile cache, if one is configured. If a tile's content is not found in the cache, subsequent requests for the same tile will\n * use the IModelTileChannel instead.\n */\nclass CloudStorageCacheChannel extends TileRequestChannel {\n public override async requestContent(tile: Tile): Promise<TileRequest.Response> {\n assert(tile instanceof IModelTile);\n return IModelApp.tileAdmin.requestCachedTileContent(tile);\n }\n\n public override onNoContent(request: TileRequest): boolean {\n assert(request.tile instanceof IModelTile);\n request.tile.requestChannel = IModelApp.tileAdmin.channels.iModelChannels.rpc;\n ++this._statistics.totalCacheMisses;\n return true;\n }\n}\n\n/** For an [[IpcApp]], allows backend tile generation requests in progress to be canceled. */\nclass IModelTileChannel extends TileRequestChannel {\n private readonly _canceled = new Map<IModelConnection, Map<string, Set<string>>>();\n\n public override onActiveRequestCanceled(request: TileRequest): void {\n const tree = request.tile.tree;\n let entry = this._canceled.get(tree.iModel);\n if (!entry)\n this._canceled.set(tree.iModel, entry = new Map<string, Set<string>>());\n\n let ids = entry.get(tree.id);\n if (!ids)\n entry.set(tree.id, ids = new Set<string>());\n\n ids.add(request.tile.contentId);\n }\n\n public override processCancellations(): void {\n for (const [imodel, entries] of this._canceled) {\n const treeContentIds: TileTreeContentIds[] = [];\n for (const [treeId, tileIds] of entries) {\n const contentIds = Array.from(tileIds);\n treeContentIds.push({ treeId, contentIds });\n this._statistics.totalAbortedRequests += contentIds.length;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n IpcApp.appFunctionIpc.cancelTileContentRequests(imodel.getRpcProps(), treeContentIds);\n }\n\n this._canceled.clear();\n }\n\n public override onIModelClosed(imodel: IModelConnection): void {\n this._canceled.delete(imodel);\n }\n}\n\ninterface CachedContent extends Omit<IModelTileContent, \"graphic\"> {\n contentId: string;\n hasGraphic: boolean;\n}\n\n/** If TileAdmin.Props.cacheTileMetadata is true, then this is the first channel through which we request content for an IModelTile.\n * It serves a niche purpose: a tile pre-generation agent that wants to ensure that every tile selected during interaction with the application\n * has its tile generated and cached in cloud storage. This agent might request thousands of tiles in sequence, causing a given tile to be discarded\n * and reloaded many times. To avoid pointlessly reloading tiles whose contents have already been generated, this channel caches the metadata for each tile;\n * on subsequent requests for the same tile, it produces the metadata and an empty RenderGraphic.\n */\nclass IModelTileMetadataCacheChannel extends TileRequestChannel {\n private readonly _cacheByIModel = new Map<IModelConnection, Map<TileTree, SortedArray<CachedContent>>>();\n\n public constructor() {\n super(\"itwinjs-imodel-metadata-cache\", 100);\n }\n\n public override onNoContent(request: TileRequest): boolean {\n assert(request.tile instanceof IModelTile);\n const channels = IModelApp.tileAdmin.channels.iModelChannels;\n request.tile.requestChannel = channels.cloudStorage ?? channels.rpc;\n return true;\n }\n\n public override async requestContent(tile: Tile): Promise<TileRequest.Response> {\n assert(tile instanceof IModelTile);\n const content = this.getCachedContent(tile);\n return content ? { content } : undefined;\n }\n\n public getCachedContent(tile: IModelTile): IModelTileContent | undefined {\n const cached = this._cacheByIModel.get(tile.iModel)?.get(tile.tree)?.findEquivalent((x) => compareStrings(x.contentId, tile.contentId));\n if (!cached)\n return undefined;\n\n const content: IModelTileContent = {\n ...cached,\n graphic: cached.hasGraphic ? IModelApp.renderSystem.createGraphicList([]) : undefined,\n contentRange: cached.contentRange?.clone(),\n };\n\n return content;\n }\n\n public override onIModelClosed(imodel: IModelConnection): void {\n this._cacheByIModel.delete(imodel);\n }\n\n public registerChannel(channel: TileRequestChannel): void {\n channel.contentCallback = (tile, content) => this.cache(tile, content);\n }\n\n private cache(tile: Tile, content: IModelTileContent): void {\n assert(tile instanceof IModelTile);\n let trees = this._cacheByIModel.get(tile.iModel);\n if (!trees)\n this._cacheByIModel.set(tile.iModel, trees = new Map<TileTree, SortedArray<CachedContent>>());\n\n let list = trees.get(tile.tree);\n if (!list)\n trees.set(tile.tree, list = new SortedArray<CachedContent>((lhs, rhs) => compareStrings(lhs.contentId, rhs.contentId)));\n\n assert(undefined === list.findEquivalent((x) => compareStrings(x.contentId, tile.contentId)));\n list.insert({\n contentId: tile.contentId,\n hasGraphic: undefined !== content.graphic,\n contentRange: content.contentRange?.clone(),\n isLeaf: content.isLeaf,\n sizeMultiplier: content.sizeMultiplier,\n emptySubRangeMask: content.emptySubRangeMask,\n });\n }\n}\n\n/** TileRequestChannels used for requesting content for IModelTiles.\n * @internal\n */\nexport class IModelTileRequestChannels {\n private _cloudStorage: TileRequestChannel;\n private readonly _contentCache?: IModelTileMetadataCacheChannel;\n public readonly rpc: TileRequestChannel;\n\n public constructor(args: {\n concurrency: number;\n usesHttp: boolean;\n cacheMetadata: boolean;\n cacheConcurrency: number;\n }) {\n const channelName = \"itwinjs-tile-rpc\";\n this.rpc = args.usesHttp ? new TileRequestChannel(channelName, args.concurrency) : new IModelTileChannel(channelName, args.concurrency);\n\n if (args.cacheMetadata) {\n this._contentCache = new IModelTileMetadataCacheChannel();\n this._contentCache.registerChannel(this.rpc);\n }\n\n this._cloudStorage = new CloudStorageCacheChannel(\"itwinjs-cloud-cache\", args.cacheConcurrency);\n this._contentCache?.registerChannel(this._cloudStorage);\n }\n\n public get cloudStorage(): TileRequestChannel {\n return this._cloudStorage;\n }\n\n public [Symbol.iterator](): Iterator<TileRequestChannel> {\n const channels = [this.rpc];\n if (this._cloudStorage)\n channels.push(this._cloudStorage);\n\n if (this._contentCache)\n channels.push(this._contentCache);\n\n return channels[Symbol.iterator]();\n }\n\n public setRpcConcurrency(concurrency: number): void {\n this.rpc.concurrency = concurrency;\n }\n\n public getChannelForTile(tile: IModelTile): TileRequestChannel {\n return tile.requestChannel || this._contentCache || this._cloudStorage || this.rpc;\n }\n\n /** Strictly for tests. */\n public getCachedContent(tile: IModelTile): IModelTileContent | undefined {\n return this._contentCache?.getCachedContent(tile);\n }\n}\n"]}
|
|
@@ -19,10 +19,9 @@ const internal_1 = require("./internal");
|
|
|
19
19
|
const viewFlagOverrides = {};
|
|
20
20
|
/** @internal */
|
|
21
21
|
function iModelTileTreeParamsFromJSON(props, iModel, modelId, options) {
|
|
22
|
-
var _a;
|
|
23
22
|
const location = core_geometry_1.Transform.fromJSON(props.location);
|
|
24
23
|
const { formatVersion, id, rootTile, contentIdQualifier, maxInitialTilesToSkip, geometryGuid } = props;
|
|
25
|
-
const tileScreenSize =
|
|
24
|
+
const tileScreenSize = props.tileScreenSize ?? 512;
|
|
26
25
|
let contentRange;
|
|
27
26
|
if (undefined !== props.contentRange)
|
|
28
27
|
contentRange = core_geometry_1.Range3d.fromJSON(props.contentRange);
|
|
@@ -124,17 +123,16 @@ const disposedState = new DisposedState();
|
|
|
124
123
|
*/
|
|
125
124
|
class RootTile extends internal_1.Tile {
|
|
126
125
|
constructor(params, tree) {
|
|
127
|
-
var _a, _b;
|
|
128
126
|
const rootParams = {
|
|
129
127
|
...params,
|
|
130
128
|
range: params.range.clone(),
|
|
131
|
-
contentRange:
|
|
129
|
+
contentRange: params.contentRange?.clone(),
|
|
132
130
|
isLeaf: false,
|
|
133
131
|
contentId: "",
|
|
134
132
|
};
|
|
135
133
|
super(rootParams, tree);
|
|
136
134
|
this.staticBranch = new internal_1.IModelTile(params, tree);
|
|
137
|
-
this._staticTreeContentRange =
|
|
135
|
+
this._staticTreeContentRange = tree.contentRange?.clone();
|
|
138
136
|
if (!this._contentRange)
|
|
139
137
|
this._contentRange = this.staticBranch.contentRange.clone();
|
|
140
138
|
// Determine initial state.
|
|
@@ -247,7 +245,6 @@ class RootTile extends internal_1.Tile {
|
|
|
247
245
|
*/
|
|
248
246
|
class IModelTileTree extends internal_1.TileTree {
|
|
249
247
|
constructor(params, treeId) {
|
|
250
|
-
var _a;
|
|
251
248
|
super(params);
|
|
252
249
|
/** A little hacky...we must not override selectTiles(), but draw() needs to distinguish between static and dynamic tiles.
|
|
253
250
|
* So _selectTiles() puts the static tiles first in the Tile[] array, and records the number of static tiles selected, to be
|
|
@@ -259,7 +256,7 @@ class IModelTileTree extends internal_1.TileTree {
|
|
|
259
256
|
this.tileScreenSize = params.tileScreenSize;
|
|
260
257
|
if (core_common_1.BatchType.Primary === treeId.type)
|
|
261
258
|
this.stringifiedSectionClip = treeId.sectionCut;
|
|
262
|
-
this.maxInitialTilesToSkip =
|
|
259
|
+
this.maxInitialTilesToSkip = params.maxInitialTilesToSkip ?? 0;
|
|
263
260
|
this.maxTilesToSkip = IModelApp_1.IModelApp.tileAdmin.maximumLevelsToSkip;
|
|
264
261
|
this._options = params.options;
|
|
265
262
|
this._transformNodeRanges = params.transformNodeRanges;
|
|
@@ -308,8 +305,7 @@ class IModelTileTree extends internal_1.TileTree {
|
|
|
308
305
|
return "dynamic" === state.type ? state.rootTile.hiddenElements : [];
|
|
309
306
|
}
|
|
310
307
|
getTransformNodeRange(nodeId) {
|
|
311
|
-
|
|
312
|
-
return (_a = this._transformNodeRanges) === null || _a === void 0 ? void 0 : _a.get(nodeId);
|
|
308
|
+
return this._transformNodeRanges?.get(nodeId);
|
|
313
309
|
}
|
|
314
310
|
get containsTransformNodes() {
|
|
315
311
|
return undefined !== this._transformNodeRanges;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IModelTileTree.js","sourceRoot":"","sources":["../../../src/tile/IModelTileTree.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,sDAA6F;AAC7F,wDAA0D;AAC1D,oDAG4B;AAC5B,4CAAyC;AAEzC,oEAAiE;AAEjE,2DAAwD;AACxD,yCAGoB;AAWpB,qBAAqB;AACrB,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAgB7B,gBAAgB;AAChB,SAAgB,4BAA4B,CAAC,KAA0B,EAAE,MAAwB,EAAE,OAAmB,EAAE,OAA8B;;IACpJ,MAAM,QAAQ,GAAG,yBAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IACvG,MAAM,cAAc,GAAG,MAAA,KAAK,CAAC,cAAc,mCAAI,GAAG,CAAC;IAEnD,IAAI,YAAY,CAAC;IACjB,IAAI,SAAS,KAAK,KAAK,CAAC,YAAY;QAClC,YAAY,GAAG,uBAAO,CAAC,QAAQ,CAAsB,KAAK,CAAC,YAAY,CAAC,CAAC;IAE3E,IAAI,mBAAmB,CAAC;IACxB,IAAI,KAAK,CAAC,mBAAmB,EAAE;QAC7B,mBAAmB,GAAG,IAAI,GAAG,EAAmB,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,mBAAmB;YAC3C,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,uBAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;KAC9D;IAED,MAAM,QAAQ,GAAG,uBAAS,CAAC,OAAO,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,2BAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,2BAAgB,CAAC,UAAU,CAAC;IAClH,OAAO;QACL,aAAa;QACb,EAAE;QACF,QAAQ;QACR,MAAM;QACN,QAAQ;QACR,OAAO;QACP,YAAY;QACZ,YAAY;QACZ,kBAAkB;QAClB,qBAAqB;QACrB,QAAQ;QACR,OAAO;QACP,cAAc;QACd,mBAAmB;KACpB,CAAC;AACJ,CAAC;AAjCD,oEAiCC;AAED,SAAS,0BAA0B,CAAC,OAAuC,EAAE,OAAmB;IAC9F,KAAK,MAAM,MAAM,IAAI,OAAO;QAC1B,IAAI,MAAM,CAAC,EAAE,KAAK,OAAO;YACvB,OAAO,MAAM,CAAC,QAAQ,CAAC;IAE3B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,sDAAsD;AACtD,MAAM,WAAW;IAIf,YAAmB,IAAc;QAHjB,SAAI,GAAG,QAAQ,CAAC;QAI9B,IAAI,CAAC,OAAO,GAAG,6CAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAA4B,EAAE,EAAE;YACpF,IAAI,CAAC,UAAU,CAAC,IAAI,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,kHAAkH;AAClH,MAAM,gBAAgB;IAIpB,YAAmB,KAA4B,EAAE,IAAc;QAH/C,SAAI,GAAG,aAAa,CAAC;QAInC,MAAM,oBAAoB,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACzD,IAAI,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,kBAAkB,GAAG,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,OAAuC,EAAE,MAA6B,EAAE,EAAE;YACxI,IAAA,qBAAM,EAAC,KAAK,KAAK,MAAM,CAAC,CAAC;YACzB,MAAM,WAAW,GAAG,0BAA0B,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3E,IAAI,WAAW;gBACb,IAAI,CAAC,UAAU,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE;YAClB,oBAAoB,EAAE,CAAC;YACvB,kBAAkB,EAAE,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC;CACF;AAED,6FAA6F;AAC7F,MAAM,YAAY;IAUhB,YAAmB,IAAc,EAAE,WAA4C,EAAE,KAA4B;QAT7F,SAAI,GAAG,SAAS,CAAC;QAU/B,IAAI,CAAC,QAAQ,GAAG,4BAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAE5D,MAAM,oBAAoB,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACzD,IAAI,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,kBAAkB,GAAG,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,OAAuC,EAAE,MAA6B,EAAE,EAAE;YACxI,IAAA,qBAAM,EAAC,KAAK,KAAK,MAAM,CAAC,CAAC;YACzB,MAAM,KAAK,GAAG,0BAA0B,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrE,IAAI,KAAK;gBACP,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE;YACnB,oBAAoB,EAAE,CAAC;YACvB,kBAAkB,EAAE,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC;IAvBM,OAAO;QACZ,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;CAqBF;AAED,uCAAuC;AACvC,MAAM,aAAa;IAAnB;QACkB,SAAI,GAAG,UAAU,CAAC;IAEpC,CAAC;IADQ,OAAO,KAAW,CAAC;CAC3B;AAED,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;AAU1C;;;;GAIG;AACH,MAAM,QAAS,SAAQ,eAAI;IASzB,YAAmB,MAAwB,EAAE,IAAoB;;QAC/D,MAAM,UAAU,GAAe;YAC7B,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;YAC3B,YAAY,EAAE,MAAA,MAAM,CAAC,YAAY,0CAAE,KAAK,EAAE;YAC1C,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,EAAE;SACd,CAAC;QAEF,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,IAAI,qBAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,uBAAuB,GAAG,MAAA,IAAI,CAAC,YAAY,0CAAE,KAAK,EAAE,CAAC;QAE1D,IAAI,CAAC,IAAI,CAAC,aAAa;YACrB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAE9D,2BAA2B;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QACzF,IAAI,SAAS,KAAK,KAAK,EAAE;YACvB,IAAI,CAAC,UAAU,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;SACzC;aAAM;YACL,MAAM,OAAO,GAAG,KAAK,CAAC,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/D,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;SACxG;QAED,iCAAiC;QACjC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAhCD,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAgCe,OAAO;QACrB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAC/B,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;IAES,aAAa,CAAC,OAA+C,EAAE,OAA+B;QACtG,MAAM,QAAQ,GAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS;YACpC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE1C,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,IAAW,OAAO;QAChB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,WAA0B;QACpD,IAAA,qBAAM,EAAC,KAAK,EAAE,iCAAiC,CAAC,CAAC;QACjD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAA+B,EAAE,OAAqB,EAAE,WAA0B;QACzG,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAEM,IAAI,CAAC,IAAkB,EAAE,KAAa,EAAE,cAAsB;QACnE,IAAA,qBAAM,EAAC,cAAc,IAAI,CAAC,IAAI,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAE9D,yBAAyB;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE;YACrC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE9B,IAAI,SAAS,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,cAAc,KAAK,KAAK,CAAC,MAAM,EAAE;YACzE,IAAI,SAAS,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI;gBACpC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAE1E,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO;SACR;QAED,yGAAyG;QACzG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;YAC1B,MAAM,YAAY,GAAG,IAAI,6BAAa,EAAE,CAAC;YACzC,KAAK,MAAM,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO;gBAC/C,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAElC,IAAI,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YACrE,IAAI,IAAI,CAAC,kBAAkB;gBACzB,kBAAkB,GAAG,uCAAyB,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;YAEpG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,YAAY,EAAE,yBAAS,CAAC,cAAc,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;SACvH;QAED,0BAA0B;QAC1B,KAAK,IAAI,CAAC,GAAG,cAAc,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;YAChD,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE9B,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,SAAsB;QACjC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI;YACpC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;IAEM,UAAU,CAAC,QAAuB;QACvC,IAAA,qBAAM,EAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,SAAS,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAEtD,IAAA,qBAAM,EAAC,SAAS,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,SAAS,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACtC,IAAA,qBAAM,EAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;SACrB;aAAM,IAAI,SAAS,KAAK,QAAQ,CAAC,IAAI,EAAE;YACtC,IAAA,qBAAM,EAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;SACvC;QAED,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;QAE3B,IAAI,UAAU;YACZ,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEzD,IAAI,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY;YACxD,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAE/D,CAAC;IAED,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC;IACrD,CAAC;IAEM,kBAAkB,CAAC,IAAU;QAClC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM;YACrF,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAExD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;YACpB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAErC,IAAA,qBAAM,EAAC,SAAS,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM;YAC3B,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtD,CAAC;CACF;AAED;;GAEG;AACH,MAAa,cAAe,SAAQ,mBAAQ;IAmB1C,YAAmB,MAA4B,EAAE,MAAwB;;QACvE,KAAK,CAAC,MAAM,CAAC,CAAC;QAPhB;;;WAGG;QACK,4BAAuB,GAAG,CAAC,CAAC;QAIlC,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;QACpD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACxC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QAE5C,IAAI,uBAAS,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI;YACnC,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,UAAU,CAAC;QAElD,IAAI,CAAC,qBAAqB,GAAG,MAAA,MAAM,CAAC,qBAAqB,mCAAI,CAAC,CAAC;QAC/D,IAAI,CAAC,cAAc,GAAG,qBAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC;QAE9D,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,mBAAmB,CAAC;QAEvD,IAAI,CAAC,iBAAiB,GAAG,+BAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,qBAAS,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAE7H,MAAM,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC;QACjE,IAAI,CAAC,SAAS,GAAG,IAAI,QAAQ,CAAC,IAAA,mCAAwB,EAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5F,CAAC;IAED,IAAW,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IACpC,IAAW,QAAQ,KAAW,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACtD,iCAAiC;IACjC,IAAW,YAAY,KAAiB,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;IAC7E,IAAW,IAAI,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,IAAoB,kBAAkB,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;IAC1D,IAAW,iBAAiB,KAAK,OAAO,iBAAiB,CAAC,CAAC,CAAC;IAE5D,IAAW,SAAS,KAAgB,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACrE,IAAW,WAAW,KAA0B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7E,IAAW,QAAQ,KAA+C,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAElG,IAAoB,YAAY;QAC9B,yFAAyF;QACzF,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,2BAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;IACtF,CAAC;IAES,YAAY,CAAC,IAAkB;QACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAW,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC,MAAM,CAAC;QAE5C,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS;YAC7C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAE7D,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,IAAI,CAAC,IAAkB;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACjE,CAAC;IAEM,KAAK;QACV,MAAM,SAAS,GAAG,0BAAW,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,kCAAkC;IAClC,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;IACvC,CAAC;IAED,kCAAkC;IAClC,IAAW,cAAc;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QACvC,OAAO,SAAS,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,CAAC;IAEM,qBAAqB,CAAC,MAAc;;QACzC,OAAO,MAAA,IAAI,CAAC,oBAAoB,0CAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,IAAW,sBAAsB;QAC/B,OAAO,SAAS,KAAK,IAAI,CAAC,oBAAoB,CAAC;IACjD,CAAC;CACF;AAjGD,wCAiGC","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 Tiles\n */\n\nimport { assert, BeTimePoint, GuidString, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport { Range3d, Transform } from \"@itwin/core-geometry\";\nimport {\n BatchType, ContentIdProvider, EdgeOptions, ElementAlignedBox3d, ElementGeometryChange, FeatureAppearanceProvider,\n IModelTileTreeId, IModelTileTreeProps, ModelGeometryChanges, RenderSchedule, TileProps,\n} from \"@itwin/core-common\";\nimport { IModelApp } from \"../IModelApp\";\nimport { IModelConnection } from \"../IModelConnection\";\nimport { GraphicalEditingScope } from \"../GraphicalEditingScope\";\nimport { RenderSystem } from \"../render/RenderSystem\";\nimport { GraphicBranch } from \"../render/GraphicBranch\";\nimport {\n DynamicIModelTile, IModelTile, IModelTileParams, iModelTileParamsFromJSON, Tile, TileContent, TileDrawArgs, TileLoadPriority, TileParams, TileRequest,\n TileRequestChannel, TileTree, TileTreeParams,\n} from \"./internal\";\n\n/** @internal */\nexport interface IModelTileTreeOptions {\n readonly allowInstancing: boolean;\n readonly edges: EdgeOptions | false;\n readonly batchType: BatchType;\n readonly is3d: boolean;\n readonly timeline: RenderSchedule.ModelTimeline | undefined;\n}\n\n// Overrides nothing.\nconst viewFlagOverrides = {};\n\n/** Parameters used to construct an [[IModelTileTree]]\n * @internal\n */\nexport interface IModelTileTreeParams extends TileTreeParams {\n rootTile: TileProps;\n contentIdQualifier?: string;\n geometryGuid?: GuidString;\n maxInitialTilesToSkip?: number;\n formatVersion?: number;\n tileScreenSize: number;\n options: IModelTileTreeOptions;\n transformNodeRanges?: Map<number, Range3d>;\n}\n\n/** @internal */\nexport function iModelTileTreeParamsFromJSON(props: IModelTileTreeProps, iModel: IModelConnection, modelId: Id64String, options: IModelTileTreeOptions): IModelTileTreeParams {\n const location = Transform.fromJSON(props.location);\n const { formatVersion, id, rootTile, contentIdQualifier, maxInitialTilesToSkip, geometryGuid } = props;\n const tileScreenSize = props.tileScreenSize ?? 512;\n\n let contentRange;\n if (undefined !== props.contentRange)\n contentRange = Range3d.fromJSON<ElementAlignedBox3d>(props.contentRange);\n\n let transformNodeRanges;\n if (props.transformNodeRanges) {\n transformNodeRanges = new Map<number, Range3d>();\n for (const entry of props.transformNodeRanges)\n transformNodeRanges.set(entry.id, Range3d.fromJSON(entry));\n }\n\n const priority = BatchType.Primary === options.batchType ? TileLoadPriority.Primary : TileLoadPriority.Classifier;\n return {\n formatVersion,\n id,\n rootTile,\n iModel,\n location,\n modelId,\n contentRange,\n geometryGuid,\n contentIdQualifier,\n maxInitialTilesToSkip,\n priority,\n options,\n tileScreenSize,\n transformNodeRanges,\n };\n}\n\nfunction findElementChangesForModel(changes: Iterable<ModelGeometryChanges>, modelId: Id64String): Iterable<ElementGeometryChange> | undefined {\n for (const change of changes)\n if (change.id === modelId)\n return change.elements;\n\n return undefined;\n}\n\n/** No graphical editing scope is currently active. */\nclass StaticState {\n public readonly type = \"static\";\n public readonly dispose: () => void;\n\n public constructor(root: RootTile) {\n this.dispose = GraphicalEditingScope.onEnter.addOnce((scope: GraphicalEditingScope) => {\n root.transition(new InteractiveState(scope, root));\n });\n }\n}\n\n/** A graphical editing scope is currently active, but no elements in the tile tree's model have been modified. */\nclass InteractiveState {\n public readonly type = \"interactive\";\n public readonly dispose: () => void;\n\n public constructor(scope: GraphicalEditingScope, root: RootTile) {\n const removeEndingListener = scope.onExiting.addOnce((_) => {\n root.transition(new StaticState(root));\n });\n\n const removeGeomListener = scope.onGeometryChanges.addListener((changes: Iterable<ModelGeometryChanges>, _scope: GraphicalEditingScope) => {\n assert(scope === _scope);\n const elemChanges = findElementChangesForModel(changes, root.tree.modelId);\n if (elemChanges)\n root.transition(new DynamicState(root, elemChanges, scope));\n });\n\n this.dispose = () => {\n removeEndingListener();\n removeGeomListener();\n };\n }\n}\n\n/** Elements in the tile tree's model have been modified during the current editing scope. */\nclass DynamicState {\n public readonly type = \"dynamic\";\n public readonly rootTile: DynamicIModelTile;\n private readonly _dispose: () => void;\n\n public dispose(): void {\n this._dispose();\n this.rootTile.dispose();\n }\n\n public constructor(root: RootTile, elemChanges: Iterable<ElementGeometryChange>, scope: GraphicalEditingScope) {\n this.rootTile = DynamicIModelTile.create(root, elemChanges);\n\n const removeEndingListener = scope.onExiting.addOnce((_) => {\n root.transition(new StaticState(root));\n });\n\n const removeGeomListener = scope.onGeometryChanges.addListener((changes: Iterable<ModelGeometryChanges>, _scope: GraphicalEditingScope) => {\n assert(scope === _scope);\n const elems = findElementChangesForModel(changes, root.tree.modelId);\n if (elems)\n this.rootTile.handleGeometryChanges(elems);\n });\n\n this._dispose = () => {\n removeEndingListener();\n removeGeomListener();\n };\n }\n}\n\n/** The tile tree has been disposed. */\nclass DisposedState {\n public readonly type = \"disposed\";\n public dispose(): void { }\n}\n\nconst disposedState = new DisposedState();\n\n/** The current state of an [[IModelTileTree]]'s [[RootTile]]. The tile transitions between these states primarily in response to GraphicalEditingScope events. */\ntype RootTileState = StaticState | InteractiveState | DynamicState | DisposedState;\n\n/** The root tile for an [[IModelTileTree]].\n * @internal\n */\nexport type RootIModelTile = Tile & { tileScreenSize: number, updateDynamicRange: (childTile: Tile) => void };\n\n/** Represents the root [[Tile]] of an [[IModelTileTree]]. The root tile has one or two direct child tiles which represent different branches of the tree:\n * - The static branch, containing tiles that represent the state of the model's geometry as of the beginning of the current [[GraphicalEditingScope]].\n * - The dynamic branch, containing tiles representing the geometry of elements that have been modified during the current [[GraphicalEditingScope]].\n * If no editing scope is currently active, the dynamic branch does not exist, and the static branch represents the current state of all elements in the model.\n */\nclass RootTile extends Tile {\n public readonly staticBranch: IModelTile;\n private _tileState: RootTileState;\n private readonly _staticTreeContentRange?: Range3d;\n\n public get tileState(): RootTileState {\n return this._tileState;\n }\n\n public constructor(params: IModelTileParams, tree: IModelTileTree) {\n const rootParams: TileParams = {\n ...params,\n range: params.range.clone(),\n contentRange: params.contentRange?.clone(),\n isLeaf: false,\n contentId: \"\",\n };\n\n super(rootParams, tree);\n this.staticBranch = new IModelTile(params, tree);\n this._staticTreeContentRange = tree.contentRange?.clone();\n\n if (!this._contentRange)\n this._contentRange = this.staticBranch.contentRange.clone();\n\n // Determine initial state.\n const scope = tree.iModel.isBriefcaseConnection() ? tree.iModel.editingScope : undefined;\n if (undefined === scope) {\n this._tileState = new StaticState(this);\n } else {\n const changes = scope.getGeometryChangesForModel(tree.modelId);\n this._tileState = changes ? new DynamicState(this, changes, scope) : new InteractiveState(scope, this);\n }\n\n // Load the children immediately.\n this.setIsReady();\n this.loadChildren();\n }\n\n public override dispose(): void {\n this.transition(disposedState);\n super.dispose();\n }\n\n protected _loadChildren(resolve: (children: Tile[] | undefined) => void, _reject: (error: Error) => void): void {\n const children: Tile[] = [this.staticBranch];\n if (this._tileState.type === \"dynamic\")\n children.push(this._tileState.rootTile);\n\n resolve(children);\n }\n\n public get channel(): TileRequestChannel {\n throw new Error(\"Root iModel tile has no content\");\n }\n\n public async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\n assert(false, \"Root iModel tile has no content\");\n return undefined;\n }\n\n public async readContent(_data: TileRequest.ResponseData, _system: RenderSystem, _isCanceled: () => boolean): Promise<TileContent> {\n throw new Error(\"Root iModel tile has no content\");\n }\n\n public draw(args: TileDrawArgs, tiles: Tile[], numStaticTiles: number): void {\n assert(numStaticTiles >= 0 && numStaticTiles <= tiles.length);\n\n // Draw the static tiles.\n for (let i = 0; i < numStaticTiles; i++)\n tiles[i].drawGraphics(args);\n\n if (\"dynamic\" !== this._tileState.type || numStaticTiles === tiles.length) {\n if (\"dynamic\" === this._tileState.type)\n args.addAppearanceProvider(this._tileState.rootTile.appearanceProvider);\n\n args.drawGraphics();\n return;\n }\n\n // We need to hide any modified elements in the static tiles. Pull their graphics into a separate branch.\n if (!args.graphics.isEmpty) {\n const staticBranch = new GraphicBranch();\n for (const staticGraphic of args.graphics.entries)\n staticBranch.add(staticGraphic);\n\n let appearanceProvider = this._tileState.rootTile.appearanceProvider;\n if (args.appearanceProvider)\n appearanceProvider = FeatureAppearanceProvider.chain(args.appearanceProvider, appearanceProvider);\n\n args.graphics.clear();\n args.graphics.add(args.context.createGraphicBranch(staticBranch, Transform.createIdentity(), { appearanceProvider }));\n }\n\n // Draw the dynamic tiles.\n for (let i = numStaticTiles; i < tiles.length; i++)\n tiles[i].drawGraphics(args);\n\n args.drawGraphics();\n }\n\n public prune(olderThan: BeTimePoint): void {\n this.staticBranch.pruneChildren(olderThan);\n if (\"dynamic\" === this._tileState.type)\n this._tileState.rootTile.pruneChildren(olderThan);\n }\n\n public transition(newState: RootTileState): void {\n assert(newState.type !== this._tileState.type);\n const resetRange = \"dynamic\" === this._tileState.type;\n\n assert(undefined !== this.children);\n if (\"dynamic\" === this._tileState.type) {\n assert(2 === this.children.length);\n this.children.pop();\n } else if (\"dynamic\" === newState.type) {\n assert(1 === this.children.length);\n this.children.push(newState.rootTile);\n }\n\n this._tileState.dispose();\n this._tileState = newState;\n\n if (resetRange)\n this.resetRange();\n }\n\n private resetRange(): void {\n this.staticBranch.range.clone(this.range);\n this.staticBranch.contentRange.clone(this._contentRange);\n\n if (this._staticTreeContentRange && this.tree.contentRange)\n this._staticTreeContentRange.clone(this.tree.contentRange);\n\n }\n\n public get tileScreenSize(): number {\n return this.staticBranch.iModelTree.tileScreenSize;\n }\n\n public updateDynamicRange(tile: Tile): void {\n this.resetRange();\n if (this._staticTreeContentRange && this.tree.contentRange && !tile.contentRange.isNull)\n this.tree.contentRange.extendRange(tile.contentRange);\n\n if (!tile.range.isNull)\n this.range.extendRange(tile.range);\n\n assert(undefined !== this._contentRange);\n if (!tile.contentRange.isNull)\n this._contentRange.extendRange(tile.contentRange);\n }\n}\n\n/** A TileTree whose contents are derived from geometry stored in a Model in an IModelDb.\n * @internal\n */\nexport class IModelTileTree extends TileTree {\n private readonly _rootTile: RootTile;\n private readonly _options: IModelTileTreeOptions;\n private readonly _transformNodeRanges?: Map<number, Range3d>;\n public readonly contentIdQualifier?: string;\n public readonly geometryGuid?: string;\n public readonly maxTilesToSkip: number;\n public readonly maxInitialTilesToSkip: number;\n public readonly contentIdProvider: ContentIdProvider;\n public readonly stringifiedSectionClip?: string;\n public readonly tileScreenSize: number;\n /** Strictly for debugging/testing - forces tile selection to halt at the specified depth. */\n public debugMaxDepth?: number;\n /** A little hacky...we must not override selectTiles(), but draw() needs to distinguish between static and dynamic tiles.\n * So _selectTiles() puts the static tiles first in the Tile[] array, and records the number of static tiles selected, to be\n * used by draw().\n */\n private _numStaticTilesSelected = 0;\n\n public constructor(params: IModelTileTreeParams, treeId: IModelTileTreeId) {\n super(params);\n this.contentIdQualifier = params.contentIdQualifier;\n this.geometryGuid = params.geometryGuid;\n this.tileScreenSize = params.tileScreenSize;\n\n if (BatchType.Primary === treeId.type)\n this.stringifiedSectionClip = treeId.sectionCut;\n\n this.maxInitialTilesToSkip = params.maxInitialTilesToSkip ?? 0;\n this.maxTilesToSkip = IModelApp.tileAdmin.maximumLevelsToSkip;\n\n this._options = params.options;\n this._transformNodeRanges = params.transformNodeRanges;\n\n this.contentIdProvider = ContentIdProvider.create(params.options.allowInstancing, IModelApp.tileAdmin, params.formatVersion);\n\n params.rootTile.contentId = this.contentIdProvider.rootContentId;\n this._rootTile = new RootTile(iModelTileParamsFromJSON(params.rootTile, undefined), this);\n }\n\n public get maxDepth() { return 32; }\n public get rootTile(): Tile { return this._rootTile; }\n /** Exposed chiefly for tests. */\n public get staticBranch(): IModelTile { return this._rootTile.staticBranch; }\n public get is3d() { return this._options.is3d; }\n public override get isContentUnbounded() { return false; }\n public get viewFlagOverrides() { return viewFlagOverrides; }\n\n public get batchType(): BatchType { return this._options.batchType; }\n public get edgeOptions(): EdgeOptions | false { return this._options.edges; }\n public get timeline(): RenderSchedule.ModelTimeline | undefined { return this._options.timeline; }\n\n public override get loadPriority(): TileLoadPriority {\n // If the model has been modified, we want to prioritize keeping its graphics up to date.\n return this.tileState === \"dynamic\" ? TileLoadPriority.Dynamic : super.loadPriority;\n }\n\n protected _selectTiles(args: TileDrawArgs): Tile[] {\n args.markUsed(this._rootTile);\n const tiles: Tile[] = [];\n this._rootTile.staticBranch.selectTiles(tiles, args, 0);\n this._numStaticTilesSelected = tiles.length;\n\n if (this._rootTile.tileState.type === \"dynamic\")\n this._rootTile.tileState.rootTile.selectTiles(tiles, args);\n\n return tiles;\n }\n\n public draw(args: TileDrawArgs): void {\n const tiles = this.selectTiles(args);\n this._rootTile.draw(args, tiles, this._numStaticTilesSelected);\n }\n\n public prune(): void {\n const olderThan = BeTimePoint.now().minus(this.expirationTime);\n this._rootTile.prune(olderThan);\n }\n\n /** Exposed strictly for tests. */\n public get tileState(): \"static\" | \"dynamic\" | \"interactive\" | \"disposed\" {\n return this._rootTile.tileState.type;\n }\n\n /** Exposed strictly for tests. */\n public get hiddenElements(): Id64Array {\n const state = this._rootTile.tileState;\n return \"dynamic\" === state.type ? state.rootTile.hiddenElements : [];\n }\n\n public getTransformNodeRange(nodeId: number): Range3d | undefined {\n return this._transformNodeRanges?.get(nodeId);\n }\n\n public get containsTransformNodes(): boolean {\n return undefined !== this._transformNodeRanges;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"IModelTileTree.js","sourceRoot":"","sources":["../../../src/tile/IModelTileTree.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 Tiles\n */\n\nimport { assert, BeTimePoint, GuidString, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport { Range3d, Transform } from \"@itwin/core-geometry\";\nimport {\n BatchType, ContentIdProvider, EdgeOptions, ElementAlignedBox3d, ElementGeometryChange, FeatureAppearanceProvider,\n IModelTileTreeId, IModelTileTreeProps, ModelGeometryChanges, RenderSchedule, TileProps,\n} from \"@itwin/core-common\";\nimport { IModelApp } from \"../IModelApp\";\nimport { IModelConnection } from \"../IModelConnection\";\nimport { GraphicalEditingScope } from \"../GraphicalEditingScope\";\nimport { RenderSystem } from \"../render/RenderSystem\";\nimport { GraphicBranch } from \"../render/GraphicBranch\";\nimport {\n DynamicIModelTile, IModelTile, IModelTileParams, iModelTileParamsFromJSON, Tile, TileContent, TileDrawArgs, TileLoadPriority, TileParams, TileRequest,\n TileRequestChannel, TileTree, TileTreeParams,\n} from \"./internal\";\n\n/** @internal */\nexport interface IModelTileTreeOptions {\n readonly allowInstancing: boolean;\n readonly edges: EdgeOptions | false;\n readonly batchType: BatchType;\n readonly is3d: boolean;\n readonly timeline: RenderSchedule.ModelTimeline | undefined;\n}\n\n// Overrides nothing.\nconst viewFlagOverrides = {};\n\n/** Parameters used to construct an [[IModelTileTree]]\n * @internal\n */\nexport interface IModelTileTreeParams extends TileTreeParams {\n rootTile: TileProps;\n contentIdQualifier?: string;\n geometryGuid?: GuidString;\n maxInitialTilesToSkip?: number;\n formatVersion?: number;\n tileScreenSize: number;\n options: IModelTileTreeOptions;\n transformNodeRanges?: Map<number, Range3d>;\n}\n\n/** @internal */\nexport function iModelTileTreeParamsFromJSON(props: IModelTileTreeProps, iModel: IModelConnection, modelId: Id64String, options: IModelTileTreeOptions): IModelTileTreeParams {\n const location = Transform.fromJSON(props.location);\n const { formatVersion, id, rootTile, contentIdQualifier, maxInitialTilesToSkip, geometryGuid } = props;\n const tileScreenSize = props.tileScreenSize ?? 512;\n\n let contentRange;\n if (undefined !== props.contentRange)\n contentRange = Range3d.fromJSON<ElementAlignedBox3d>(props.contentRange);\n\n let transformNodeRanges;\n if (props.transformNodeRanges) {\n transformNodeRanges = new Map<number, Range3d>();\n for (const entry of props.transformNodeRanges)\n transformNodeRanges.set(entry.id, Range3d.fromJSON(entry));\n }\n\n const priority = BatchType.Primary === options.batchType ? TileLoadPriority.Primary : TileLoadPriority.Classifier;\n return {\n formatVersion,\n id,\n rootTile,\n iModel,\n location,\n modelId,\n contentRange,\n geometryGuid,\n contentIdQualifier,\n maxInitialTilesToSkip,\n priority,\n options,\n tileScreenSize,\n transformNodeRanges,\n };\n}\n\nfunction findElementChangesForModel(changes: Iterable<ModelGeometryChanges>, modelId: Id64String): Iterable<ElementGeometryChange> | undefined {\n for (const change of changes)\n if (change.id === modelId)\n return change.elements;\n\n return undefined;\n}\n\n/** No graphical editing scope is currently active. */\nclass StaticState {\n public readonly type = \"static\";\n public readonly dispose: () => void;\n\n public constructor(root: RootTile) {\n this.dispose = GraphicalEditingScope.onEnter.addOnce((scope: GraphicalEditingScope) => {\n root.transition(new InteractiveState(scope, root));\n });\n }\n}\n\n/** A graphical editing scope is currently active, but no elements in the tile tree's model have been modified. */\nclass InteractiveState {\n public readonly type = \"interactive\";\n public readonly dispose: () => void;\n\n public constructor(scope: GraphicalEditingScope, root: RootTile) {\n const removeEndingListener = scope.onExiting.addOnce((_) => {\n root.transition(new StaticState(root));\n });\n\n const removeGeomListener = scope.onGeometryChanges.addListener((changes: Iterable<ModelGeometryChanges>, _scope: GraphicalEditingScope) => {\n assert(scope === _scope);\n const elemChanges = findElementChangesForModel(changes, root.tree.modelId);\n if (elemChanges)\n root.transition(new DynamicState(root, elemChanges, scope));\n });\n\n this.dispose = () => {\n removeEndingListener();\n removeGeomListener();\n };\n }\n}\n\n/** Elements in the tile tree's model have been modified during the current editing scope. */\nclass DynamicState {\n public readonly type = \"dynamic\";\n public readonly rootTile: DynamicIModelTile;\n private readonly _dispose: () => void;\n\n public dispose(): void {\n this._dispose();\n this.rootTile.dispose();\n }\n\n public constructor(root: RootTile, elemChanges: Iterable<ElementGeometryChange>, scope: GraphicalEditingScope) {\n this.rootTile = DynamicIModelTile.create(root, elemChanges);\n\n const removeEndingListener = scope.onExiting.addOnce((_) => {\n root.transition(new StaticState(root));\n });\n\n const removeGeomListener = scope.onGeometryChanges.addListener((changes: Iterable<ModelGeometryChanges>, _scope: GraphicalEditingScope) => {\n assert(scope === _scope);\n const elems = findElementChangesForModel(changes, root.tree.modelId);\n if (elems)\n this.rootTile.handleGeometryChanges(elems);\n });\n\n this._dispose = () => {\n removeEndingListener();\n removeGeomListener();\n };\n }\n}\n\n/** The tile tree has been disposed. */\nclass DisposedState {\n public readonly type = \"disposed\";\n public dispose(): void { }\n}\n\nconst disposedState = new DisposedState();\n\n/** The current state of an [[IModelTileTree]]'s [[RootTile]]. The tile transitions between these states primarily in response to GraphicalEditingScope events. */\ntype RootTileState = StaticState | InteractiveState | DynamicState | DisposedState;\n\n/** The root tile for an [[IModelTileTree]].\n * @internal\n */\nexport type RootIModelTile = Tile & { tileScreenSize: number, updateDynamicRange: (childTile: Tile) => void };\n\n/** Represents the root [[Tile]] of an [[IModelTileTree]]. The root tile has one or two direct child tiles which represent different branches of the tree:\n * - The static branch, containing tiles that represent the state of the model's geometry as of the beginning of the current [[GraphicalEditingScope]].\n * - The dynamic branch, containing tiles representing the geometry of elements that have been modified during the current [[GraphicalEditingScope]].\n * If no editing scope is currently active, the dynamic branch does not exist, and the static branch represents the current state of all elements in the model.\n */\nclass RootTile extends Tile {\n public readonly staticBranch: IModelTile;\n private _tileState: RootTileState;\n private readonly _staticTreeContentRange?: Range3d;\n\n public get tileState(): RootTileState {\n return this._tileState;\n }\n\n public constructor(params: IModelTileParams, tree: IModelTileTree) {\n const rootParams: TileParams = {\n ...params,\n range: params.range.clone(),\n contentRange: params.contentRange?.clone(),\n isLeaf: false,\n contentId: \"\",\n };\n\n super(rootParams, tree);\n this.staticBranch = new IModelTile(params, tree);\n this._staticTreeContentRange = tree.contentRange?.clone();\n\n if (!this._contentRange)\n this._contentRange = this.staticBranch.contentRange.clone();\n\n // Determine initial state.\n const scope = tree.iModel.isBriefcaseConnection() ? tree.iModel.editingScope : undefined;\n if (undefined === scope) {\n this._tileState = new StaticState(this);\n } else {\n const changes = scope.getGeometryChangesForModel(tree.modelId);\n this._tileState = changes ? new DynamicState(this, changes, scope) : new InteractiveState(scope, this);\n }\n\n // Load the children immediately.\n this.setIsReady();\n this.loadChildren();\n }\n\n public override dispose(): void {\n this.transition(disposedState);\n super.dispose();\n }\n\n protected _loadChildren(resolve: (children: Tile[] | undefined) => void, _reject: (error: Error) => void): void {\n const children: Tile[] = [this.staticBranch];\n if (this._tileState.type === \"dynamic\")\n children.push(this._tileState.rootTile);\n\n resolve(children);\n }\n\n public get channel(): TileRequestChannel {\n throw new Error(\"Root iModel tile has no content\");\n }\n\n public async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\n assert(false, \"Root iModel tile has no content\");\n return undefined;\n }\n\n public async readContent(_data: TileRequest.ResponseData, _system: RenderSystem, _isCanceled: () => boolean): Promise<TileContent> {\n throw new Error(\"Root iModel tile has no content\");\n }\n\n public draw(args: TileDrawArgs, tiles: Tile[], numStaticTiles: number): void {\n assert(numStaticTiles >= 0 && numStaticTiles <= tiles.length);\n\n // Draw the static tiles.\n for (let i = 0; i < numStaticTiles; i++)\n tiles[i].drawGraphics(args);\n\n if (\"dynamic\" !== this._tileState.type || numStaticTiles === tiles.length) {\n if (\"dynamic\" === this._tileState.type)\n args.addAppearanceProvider(this._tileState.rootTile.appearanceProvider);\n\n args.drawGraphics();\n return;\n }\n\n // We need to hide any modified elements in the static tiles. Pull their graphics into a separate branch.\n if (!args.graphics.isEmpty) {\n const staticBranch = new GraphicBranch();\n for (const staticGraphic of args.graphics.entries)\n staticBranch.add(staticGraphic);\n\n let appearanceProvider = this._tileState.rootTile.appearanceProvider;\n if (args.appearanceProvider)\n appearanceProvider = FeatureAppearanceProvider.chain(args.appearanceProvider, appearanceProvider);\n\n args.graphics.clear();\n args.graphics.add(args.context.createGraphicBranch(staticBranch, Transform.createIdentity(), { appearanceProvider }));\n }\n\n // Draw the dynamic tiles.\n for (let i = numStaticTiles; i < tiles.length; i++)\n tiles[i].drawGraphics(args);\n\n args.drawGraphics();\n }\n\n public prune(olderThan: BeTimePoint): void {\n this.staticBranch.pruneChildren(olderThan);\n if (\"dynamic\" === this._tileState.type)\n this._tileState.rootTile.pruneChildren(olderThan);\n }\n\n public transition(newState: RootTileState): void {\n assert(newState.type !== this._tileState.type);\n const resetRange = \"dynamic\" === this._tileState.type;\n\n assert(undefined !== this.children);\n if (\"dynamic\" === this._tileState.type) {\n assert(2 === this.children.length);\n this.children.pop();\n } else if (\"dynamic\" === newState.type) {\n assert(1 === this.children.length);\n this.children.push(newState.rootTile);\n }\n\n this._tileState.dispose();\n this._tileState = newState;\n\n if (resetRange)\n this.resetRange();\n }\n\n private resetRange(): void {\n this.staticBranch.range.clone(this.range);\n this.staticBranch.contentRange.clone(this._contentRange);\n\n if (this._staticTreeContentRange && this.tree.contentRange)\n this._staticTreeContentRange.clone(this.tree.contentRange);\n\n }\n\n public get tileScreenSize(): number {\n return this.staticBranch.iModelTree.tileScreenSize;\n }\n\n public updateDynamicRange(tile: Tile): void {\n this.resetRange();\n if (this._staticTreeContentRange && this.tree.contentRange && !tile.contentRange.isNull)\n this.tree.contentRange.extendRange(tile.contentRange);\n\n if (!tile.range.isNull)\n this.range.extendRange(tile.range);\n\n assert(undefined !== this._contentRange);\n if (!tile.contentRange.isNull)\n this._contentRange.extendRange(tile.contentRange);\n }\n}\n\n/** A TileTree whose contents are derived from geometry stored in a Model in an IModelDb.\n * @internal\n */\nexport class IModelTileTree extends TileTree {\n private readonly _rootTile: RootTile;\n private readonly _options: IModelTileTreeOptions;\n private readonly _transformNodeRanges?: Map<number, Range3d>;\n public readonly contentIdQualifier?: string;\n public readonly geometryGuid?: string;\n public readonly maxTilesToSkip: number;\n public readonly maxInitialTilesToSkip: number;\n public readonly contentIdProvider: ContentIdProvider;\n public readonly stringifiedSectionClip?: string;\n public readonly tileScreenSize: number;\n /** Strictly for debugging/testing - forces tile selection to halt at the specified depth. */\n public debugMaxDepth?: number;\n /** A little hacky...we must not override selectTiles(), but draw() needs to distinguish between static and dynamic tiles.\n * So _selectTiles() puts the static tiles first in the Tile[] array, and records the number of static tiles selected, to be\n * used by draw().\n */\n private _numStaticTilesSelected = 0;\n\n public constructor(params: IModelTileTreeParams, treeId: IModelTileTreeId) {\n super(params);\n this.contentIdQualifier = params.contentIdQualifier;\n this.geometryGuid = params.geometryGuid;\n this.tileScreenSize = params.tileScreenSize;\n\n if (BatchType.Primary === treeId.type)\n this.stringifiedSectionClip = treeId.sectionCut;\n\n this.maxInitialTilesToSkip = params.maxInitialTilesToSkip ?? 0;\n this.maxTilesToSkip = IModelApp.tileAdmin.maximumLevelsToSkip;\n\n this._options = params.options;\n this._transformNodeRanges = params.transformNodeRanges;\n\n this.contentIdProvider = ContentIdProvider.create(params.options.allowInstancing, IModelApp.tileAdmin, params.formatVersion);\n\n params.rootTile.contentId = this.contentIdProvider.rootContentId;\n this._rootTile = new RootTile(iModelTileParamsFromJSON(params.rootTile, undefined), this);\n }\n\n public get maxDepth() { return 32; }\n public get rootTile(): Tile { return this._rootTile; }\n /** Exposed chiefly for tests. */\n public get staticBranch(): IModelTile { return this._rootTile.staticBranch; }\n public get is3d() { return this._options.is3d; }\n public override get isContentUnbounded() { return false; }\n public get viewFlagOverrides() { return viewFlagOverrides; }\n\n public get batchType(): BatchType { return this._options.batchType; }\n public get edgeOptions(): EdgeOptions | false { return this._options.edges; }\n public get timeline(): RenderSchedule.ModelTimeline | undefined { return this._options.timeline; }\n\n public override get loadPriority(): TileLoadPriority {\n // If the model has been modified, we want to prioritize keeping its graphics up to date.\n return this.tileState === \"dynamic\" ? TileLoadPriority.Dynamic : super.loadPriority;\n }\n\n protected _selectTiles(args: TileDrawArgs): Tile[] {\n args.markUsed(this._rootTile);\n const tiles: Tile[] = [];\n this._rootTile.staticBranch.selectTiles(tiles, args, 0);\n this._numStaticTilesSelected = tiles.length;\n\n if (this._rootTile.tileState.type === \"dynamic\")\n this._rootTile.tileState.rootTile.selectTiles(tiles, args);\n\n return tiles;\n }\n\n public draw(args: TileDrawArgs): void {\n const tiles = this.selectTiles(args);\n this._rootTile.draw(args, tiles, this._numStaticTilesSelected);\n }\n\n public prune(): void {\n const olderThan = BeTimePoint.now().minus(this.expirationTime);\n this._rootTile.prune(olderThan);\n }\n\n /** Exposed strictly for tests. */\n public get tileState(): \"static\" | \"dynamic\" | \"interactive\" | \"disposed\" {\n return this._rootTile.tileState.type;\n }\n\n /** Exposed strictly for tests. */\n public get hiddenElements(): Id64Array {\n const state = this._rootTile.tileState;\n return \"dynamic\" === state.type ? state.rootTile.hiddenElements : [];\n }\n\n public getTransformNodeRange(nodeId: number): Range3d | undefined {\n return this._transformNodeRanges?.get(nodeId);\n }\n\n public get containsTransformNodes(): boolean {\n return undefined !== this._transformNodeRanges;\n }\n}\n"]}
|
|
@@ -101,7 +101,6 @@ function extractNodeId(nodeName) {
|
|
|
101
101
|
*/
|
|
102
102
|
class ImdlReader {
|
|
103
103
|
constructor(imdl, binaryPosition, args) {
|
|
104
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
105
104
|
this._patternGeometry = new Map();
|
|
106
105
|
this._buffer = args.stream;
|
|
107
106
|
this._binaryData = new Uint8Array(this._buffer.arrayBuffer, binaryPosition);
|
|
@@ -109,21 +108,21 @@ class ImdlReader {
|
|
|
109
108
|
this._bufferViews = imdl.bufferViews;
|
|
110
109
|
this._meshes = imdl.meshes;
|
|
111
110
|
this._nodes = imdl.nodes;
|
|
112
|
-
this._materialValues =
|
|
113
|
-
this._renderMaterials =
|
|
114
|
-
this._namedTextures =
|
|
115
|
-
this._patternSymbols =
|
|
111
|
+
this._materialValues = imdl.materials ?? {};
|
|
112
|
+
this._renderMaterials = imdl.renderMaterials ?? {};
|
|
113
|
+
this._namedTextures = imdl.namedTextures ?? {};
|
|
114
|
+
this._patternSymbols = imdl.patternSymbols ?? {};
|
|
116
115
|
this._rtcCenter = imdl.rtcCenter ? core_geometry_1.Point3d.fromJSON(imdl.rtcCenter) : undefined;
|
|
117
116
|
this._iModel = args.iModel;
|
|
118
117
|
this._modelId = args.modelId;
|
|
119
118
|
this._is3d = args.is3d;
|
|
120
119
|
this._system = args.system;
|
|
121
|
-
this._type =
|
|
120
|
+
this._type = args.type ?? core_common_1.BatchType.Primary;
|
|
122
121
|
this._canceled = args.isCanceled;
|
|
123
122
|
this._sizeMultiplier = args.sizeMultiplier;
|
|
124
|
-
this._loadEdges =
|
|
125
|
-
this._options =
|
|
126
|
-
this._containsTransformNodes =
|
|
123
|
+
this._loadEdges = args.loadEdges ?? true;
|
|
124
|
+
this._options = args.options ?? {};
|
|
125
|
+
this._containsTransformNodes = args.containsTransformNodes ?? false;
|
|
127
126
|
this._timeline = args.timeline;
|
|
128
127
|
}
|
|
129
128
|
get _isCanceled() { return undefined !== this._canceled && this._canceled(this); }
|
|
@@ -257,7 +256,6 @@ class ImdlReader {
|
|
|
257
256
|
return this._system.createMaterial(materialParams, this._iModel);
|
|
258
257
|
}
|
|
259
258
|
textureMappingFromJson(json) {
|
|
260
|
-
var _a;
|
|
261
259
|
if (undefined === json)
|
|
262
260
|
return undefined;
|
|
263
261
|
const name = core_bentley_1.JsonUtils.asString(json.name);
|
|
@@ -280,7 +278,7 @@ class ImdlReader {
|
|
|
280
278
|
if (normalMapJson) {
|
|
281
279
|
let normalMap;
|
|
282
280
|
const normalTexName = core_bentley_1.JsonUtils.asString(normalMapJson.textureName);
|
|
283
|
-
if (normalTexName.length === 0 || undefined !== (normalMap =
|
|
281
|
+
if (normalTexName.length === 0 || undefined !== (normalMap = this._namedTextures[normalTexName]?.renderTexture)) {
|
|
284
282
|
textureMapping.normalMapParams = {
|
|
285
283
|
normalMap,
|
|
286
284
|
greenUp: core_bentley_1.JsonUtils.asBool(normalMapJson.greenUp),
|
|
@@ -641,8 +639,7 @@ class ImdlReader {
|
|
|
641
639
|
return { succeeded, params };
|
|
642
640
|
}
|
|
643
641
|
readPrimitiveParams(primitive) {
|
|
644
|
-
|
|
645
|
-
const materialName = (_a = primitive.material) !== null && _a !== void 0 ? _a : "";
|
|
642
|
+
const materialName = primitive.material ?? "";
|
|
646
643
|
const materialValue = 0 < materialName.length ? core_bentley_1.JsonUtils.asObject(this._materialValues[materialName]) : undefined;
|
|
647
644
|
const displayParams = undefined !== materialValue ? this.createDisplayParams(materialValue) : undefined;
|
|
648
645
|
if (undefined === displayParams)
|
|
@@ -749,9 +746,8 @@ class ImdlReader {
|
|
|
749
746
|
return branch;
|
|
750
747
|
};
|
|
751
748
|
featureTable.populateAnimationNodeIds((elemIdPair) => {
|
|
752
|
-
var _a;
|
|
753
749
|
const elementTimeline = timeline.getTimelineForElement(elemIdPair.lower, elemIdPair.upper);
|
|
754
|
-
return
|
|
750
|
+
return elementTimeline?.batchId ?? 0;
|
|
755
751
|
}, timeline.maxBatchId);
|
|
756
752
|
const discreteNodeIds = timeline.discreteBatchIds;
|
|
757
753
|
const computeNodeId = (_id, featureIndex) => {
|
|
@@ -835,7 +831,7 @@ class ImdlReader {
|
|
|
835
831
|
// Unstructured -- prior to animation support....
|
|
836
832
|
for (const meshKey of Object.keys(this._meshes)) {
|
|
837
833
|
const meshValue = this._meshes[meshKey];
|
|
838
|
-
const primitives = meshValue
|
|
834
|
+
const primitives = meshValue?.primitives;
|
|
839
835
|
if (!primitives || !meshValue)
|
|
840
836
|
continue;
|
|
841
837
|
for (const primitive of primitives) {
|
|
@@ -849,7 +845,7 @@ class ImdlReader {
|
|
|
849
845
|
for (const nodeKey of Object.keys(this._nodes)) {
|
|
850
846
|
const nodeValue = this._nodes[nodeKey];
|
|
851
847
|
const meshValue = undefined !== nodeValue ? this._meshes[nodeValue] : undefined;
|
|
852
|
-
const primitives = meshValue
|
|
848
|
+
const primitives = meshValue?.primitives;
|
|
853
849
|
if (!primitives || !meshValue)
|
|
854
850
|
continue;
|
|
855
851
|
const layerId = meshValue.layer;
|