@itwin/core-frontend 4.0.0-dev.46 → 4.0.0-dev.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/lib/cjs/ElementLocateManager.js +1 -1
  2. package/lib/cjs/ElementLocateManager.js.map +1 -1
  3. package/lib/cjs/SpatialViewState.d.ts.map +1 -1
  4. package/lib/cjs/SpatialViewState.js +2 -0
  5. package/lib/cjs/SpatialViewState.js.map +1 -1
  6. package/lib/cjs/ViewState.d.ts +2 -0
  7. package/lib/cjs/ViewState.d.ts.map +1 -1
  8. package/lib/cjs/ViewState.js.map +1 -1
  9. package/lib/cjs/Viewport.d.ts +2 -0
  10. package/lib/cjs/Viewport.d.ts.map +1 -1
  11. package/lib/cjs/Viewport.js +8 -4
  12. package/lib/cjs/Viewport.js.map +1 -1
  13. package/lib/cjs/render/MockRender.d.ts +4 -4
  14. package/lib/cjs/render/MockRender.js.map +1 -1
  15. package/lib/cjs/render/Pixel.d.ts +13 -4
  16. package/lib/cjs/render/Pixel.d.ts.map +1 -1
  17. package/lib/cjs/render/Pixel.js +16 -13
  18. package/lib/cjs/render/Pixel.js.map +1 -1
  19. package/lib/cjs/render/RenderSystem.d.ts +2 -2
  20. package/lib/cjs/render/RenderSystem.d.ts.map +1 -1
  21. package/lib/cjs/render/RenderSystem.js.map +1 -1
  22. package/lib/cjs/render/VisibleFeature.js +2 -2
  23. package/lib/cjs/render/VisibleFeature.js.map +1 -1
  24. package/lib/cjs/render/webgl/BatchState.d.ts +3 -2
  25. package/lib/cjs/render/webgl/BatchState.d.ts.map +1 -1
  26. package/lib/cjs/render/webgl/BatchState.js +4 -3
  27. package/lib/cjs/render/webgl/BatchState.js.map +1 -1
  28. package/lib/cjs/render/webgl/DrawCommand.d.ts.map +1 -1
  29. package/lib/cjs/render/webgl/DrawCommand.js +4 -2
  30. package/lib/cjs/render/webgl/DrawCommand.js.map +1 -1
  31. package/lib/cjs/render/webgl/FeatureOverrides.d.ts +3 -3
  32. package/lib/cjs/render/webgl/FeatureOverrides.d.ts.map +1 -1
  33. package/lib/cjs/render/webgl/FeatureOverrides.js +24 -28
  34. package/lib/cjs/render/webgl/FeatureOverrides.js.map +1 -1
  35. package/lib/cjs/render/webgl/Graphic.d.ts +3 -3
  36. package/lib/cjs/render/webgl/Graphic.js.map +1 -1
  37. package/lib/cjs/render/webgl/RenderCommands.js +1 -1
  38. package/lib/cjs/render/webgl/RenderCommands.js.map +1 -1
  39. package/lib/cjs/render/webgl/SceneCompositor.d.ts.map +1 -1
  40. package/lib/cjs/render/webgl/SceneCompositor.js +13 -4
  41. package/lib/cjs/render/webgl/SceneCompositor.js.map +1 -1
  42. package/lib/cjs/render/webgl/System.d.ts +2 -2
  43. package/lib/cjs/render/webgl/System.js.map +1 -1
  44. package/lib/cjs/render/webgl/VisibleTileFeatures.js +6 -7
  45. package/lib/cjs/render/webgl/VisibleTileFeatures.js.map +1 -1
  46. package/lib/cjs/tile/GltfReader.d.ts +24 -1
  47. package/lib/cjs/tile/GltfReader.d.ts.map +1 -1
  48. package/lib/cjs/tile/GltfReader.js +27 -3
  49. package/lib/cjs/tile/GltfReader.js.map +1 -1
  50. package/lib/cjs/tile/ImdlReader.d.ts +3 -2
  51. package/lib/cjs/tile/ImdlReader.d.ts.map +1 -1
  52. package/lib/cjs/tile/ImdlReader.js +34 -25
  53. package/lib/cjs/tile/ImdlReader.js.map +1 -1
  54. package/lib/cjs/tile/PrimaryTileTree.d.ts +5 -1
  55. package/lib/cjs/tile/PrimaryTileTree.d.ts.map +1 -1
  56. package/lib/cjs/tile/PrimaryTileTree.js +2 -0
  57. package/lib/cjs/tile/PrimaryTileTree.js.map +1 -1
  58. package/lib/cjs/tools/ClipViewTool.d.ts.map +1 -1
  59. package/lib/cjs/tools/ClipViewTool.js +5 -1
  60. package/lib/cjs/tools/ClipViewTool.js.map +1 -1
  61. package/lib/esm/ElementLocateManager.js +1 -1
  62. package/lib/esm/ElementLocateManager.js.map +1 -1
  63. package/lib/esm/SpatialViewState.d.ts.map +1 -1
  64. package/lib/esm/SpatialViewState.js +2 -0
  65. package/lib/esm/SpatialViewState.js.map +1 -1
  66. package/lib/esm/ViewState.d.ts +2 -0
  67. package/lib/esm/ViewState.d.ts.map +1 -1
  68. package/lib/esm/ViewState.js.map +1 -1
  69. package/lib/esm/Viewport.d.ts +2 -0
  70. package/lib/esm/Viewport.d.ts.map +1 -1
  71. package/lib/esm/Viewport.js +8 -4
  72. package/lib/esm/Viewport.js.map +1 -1
  73. package/lib/esm/render/MockRender.d.ts +4 -4
  74. package/lib/esm/render/MockRender.js.map +1 -1
  75. package/lib/esm/render/Pixel.d.ts +13 -4
  76. package/lib/esm/render/Pixel.d.ts.map +1 -1
  77. package/lib/esm/render/Pixel.js +17 -14
  78. package/lib/esm/render/Pixel.js.map +1 -1
  79. package/lib/esm/render/RenderSystem.d.ts +2 -2
  80. package/lib/esm/render/RenderSystem.d.ts.map +1 -1
  81. package/lib/esm/render/RenderSystem.js.map +1 -1
  82. package/lib/esm/render/VisibleFeature.js +2 -2
  83. package/lib/esm/render/VisibleFeature.js.map +1 -1
  84. package/lib/esm/render/webgl/BatchState.d.ts +3 -2
  85. package/lib/esm/render/webgl/BatchState.d.ts.map +1 -1
  86. package/lib/esm/render/webgl/BatchState.js +4 -3
  87. package/lib/esm/render/webgl/BatchState.js.map +1 -1
  88. package/lib/esm/render/webgl/DrawCommand.d.ts.map +1 -1
  89. package/lib/esm/render/webgl/DrawCommand.js +4 -2
  90. package/lib/esm/render/webgl/DrawCommand.js.map +1 -1
  91. package/lib/esm/render/webgl/FeatureOverrides.d.ts +3 -3
  92. package/lib/esm/render/webgl/FeatureOverrides.d.ts.map +1 -1
  93. package/lib/esm/render/webgl/FeatureOverrides.js +24 -28
  94. package/lib/esm/render/webgl/FeatureOverrides.js.map +1 -1
  95. package/lib/esm/render/webgl/Graphic.d.ts +3 -3
  96. package/lib/esm/render/webgl/Graphic.js.map +1 -1
  97. package/lib/esm/render/webgl/RenderCommands.js +1 -1
  98. package/lib/esm/render/webgl/RenderCommands.js.map +1 -1
  99. package/lib/esm/render/webgl/SceneCompositor.d.ts.map +1 -1
  100. package/lib/esm/render/webgl/SceneCompositor.js +14 -5
  101. package/lib/esm/render/webgl/SceneCompositor.js.map +1 -1
  102. package/lib/esm/render/webgl/System.d.ts +2 -2
  103. package/lib/esm/render/webgl/System.js.map +1 -1
  104. package/lib/esm/render/webgl/VisibleTileFeatures.js +7 -8
  105. package/lib/esm/render/webgl/VisibleTileFeatures.js.map +1 -1
  106. package/lib/esm/tile/GltfReader.d.ts +24 -1
  107. package/lib/esm/tile/GltfReader.d.ts.map +1 -1
  108. package/lib/esm/tile/GltfReader.js +24 -1
  109. package/lib/esm/tile/GltfReader.js.map +1 -1
  110. package/lib/esm/tile/ImdlReader.d.ts +3 -2
  111. package/lib/esm/tile/ImdlReader.d.ts.map +1 -1
  112. package/lib/esm/tile/ImdlReader.js +35 -26
  113. package/lib/esm/tile/ImdlReader.js.map +1 -1
  114. package/lib/esm/tile/PrimaryTileTree.d.ts +5 -1
  115. package/lib/esm/tile/PrimaryTileTree.d.ts.map +1 -1
  116. package/lib/esm/tile/PrimaryTileTree.js +2 -0
  117. package/lib/esm/tile/PrimaryTileTree.js.map +1 -1
  118. package/lib/esm/tools/ClipViewTool.d.ts.map +1 -1
  119. package/lib/esm/tools/ClipViewTool.js +5 -1
  120. package/lib/esm/tools/ClipViewTool.js.map +1 -1
  121. package/lib/public/locales/en/CoreTools.json +4 -0
  122. package/package.json +19 -19
@@ -50,12 +50,12 @@ class ScreenFeatures {
50
50
  for (let x = rect.left; x < rect.right; x++) {
51
51
  for (let y = rect.top; y < rect.bottom; y++) {
52
52
  const pixel = pixels.getPixel(x, y);
53
- if (pixel.feature && pixel.featureTable) {
53
+ if (pixel.feature && pixel.modelId) {
54
54
  yield {
55
55
  elementId: pixel.feature.elementId,
56
56
  subCategoryId: pixel.feature.subCategoryId,
57
57
  geometryClass: pixel.feature.geometryClass,
58
- modelId: pixel.featureTable.modelId,
58
+ modelId: pixel.modelId,
59
59
  iModel: pixel.iModel ?? iModel,
60
60
  };
61
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"VisibleFeature.js","sourceRoot":"","sources":["../../../src/render/VisibleFeature.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Rendering\r\n */\r\n\r\nimport { assert, Id64String } from \"@itwin/core-bentley\";\r\nimport { GeometryClass } from \"@itwin/core-common\";\r\nimport { ViewRect } from \"../ViewRect\";\r\nimport { Viewport } from \"../Viewport\";\r\nimport { IModelConnection } from \"../IModelConnection\";\r\nimport { Pixel } from \"./Pixel\";\r\n\r\n/** Represents a [Feature]($common) determined to be visible within a [[Viewport]].\r\n * @see [[Viewport.queryVisibleFeatures]].\r\n * @public\r\n */\r\nexport interface VisibleFeature {\r\n /** The Id of the [Element]($backend) associated with the feature. May be invalid or transient. */\r\n readonly elementId: Id64String;\r\n /** The Id of the [SubCategory]($backend) associated with the feature. May be invalid or transient. */\r\n readonly subCategoryId: Id64String;\r\n /** The class of geometry associated with the feature. */\r\n readonly geometryClass: GeometryClass;\r\n /** The Id of the [GeometricModel]($backend) associated with the feature. May be invalid or transient. */\r\n readonly modelId: Id64String;\r\n /** The iModel associated with the feature. In some cases this may differ from the [[Viewport]]'s iModel. */\r\n iModel: IModelConnection;\r\n}\r\n\r\n/** Options specifying how to query for visible [Feature]($common)s by reading pixels rendered by a [[Viewport]].\r\n * This method of determining visibility considers a feature \"visible\" if it lit up at least one pixel.\r\n * @note A pixel that is behind another, transparent pixel is not considered visible.\r\n * @see [[QueryVisibleFeaturesOptions]].\r\n * @public\r\n */\r\nexport interface QueryScreenFeaturesOptions {\r\n /** Union discriminator for [[QueryVisibleFeaturesOptions]]. */\r\n source: \"screen\";\r\n /** If true, non-locatable features are considered visible. */\r\n includeNonLocatable?: boolean;\r\n /** If specified, a sub-region of the [[Viewport]] to which to constrain the query. */\r\n rect?: ViewRect;\r\n}\r\n\r\n/** Options specifying how to query for visible [Feature]($common)s by inspecting the [[Tile]]s selected for display by a [[Viewport]].\r\n * This method of determining visibility considers a feature \"visible\" if it is included in at least one tile selected for display and is\r\n * not otherwise rendered invisible by the view's [[CategorySelectorState]], [SubCategoryAppearance]($common) overrides, [FeatureOverrides]($common), or\r\n * other means.\r\n * @note If a clip volume is applied to the view, features contained in tiles that *intersect* the clip volume are considered visible regardless of whether\r\n * their geometry would actually be entirely clipped out by the clip volume.\r\n * @see [[QueryVisibleFeaturesOptions]].\r\n * @public\r\n */\r\nexport interface QueryTileFeaturesOptions {\r\n /** Union discriminator for [[QueryVisibleFeaturesOptions]]. */\r\n source: \"tiles\";\r\n /** If true, non-locatable features are considered visible. */\r\n includeNonLocatable?: boolean;\r\n}\r\n\r\n/** Options specifying how to query for visible [Feature]($common)s.\r\n * @see [[Viewport.queryVisibleFeatures]].\r\n * @public\r\n */\r\nexport type QueryVisibleFeaturesOptions = QueryScreenFeaturesOptions | QueryTileFeaturesOptions;\r\n\r\n/** A function supplied to [[Viewport.queryVisibleFeatures]] to process the results. The iterable supplied to the callback consists of all of the\r\n * [Feature]($common)s determined to be visible. The same feature may recur multiple times.\r\n * @note The iterable supplied to the callback is usable only within the callback. Once the callback exits, the iterable becomes empty.\r\n * @public\r\n */\r\nexport type QueryVisibleFeaturesCallback = (features: Iterable<VisibleFeature>) => void;\r\n\r\n/** Ensures that the iterable supplied to QueryVisibleFeaturesCallback becomes invalidated once the callback exits.\r\n * The iterable relies on RenderTarget state that changes from one frame to another.\r\n */\r\nclass ExpiringIterable implements Iterable<VisibleFeature> {\r\n private _features: Iterable<VisibleFeature>;\r\n private _disposed = false;\r\n\r\n public constructor(features: Iterable<VisibleFeature>) {\r\n this._features = features;\r\n }\r\n\r\n public dispose(): void {\r\n this._disposed = true;\r\n this._features = [];\r\n }\r\n\r\n public [Symbol.iterator](): Iterator<VisibleFeature> {\r\n assert(!this._disposed, \"The iterable supplied to QueryVisibleFeaturesCallback is valid only for the duration of the callback.\");\r\n return this._features[Symbol.iterator]();\r\n }\r\n}\r\n\r\nfunction invokeCallback(features: Iterable<VisibleFeature>, callback: QueryVisibleFeaturesCallback): void {\r\n const iterable = new ExpiringIterable(features);\r\n try {\r\n callback(iterable);\r\n } finally {\r\n iterable.dispose();\r\n }\r\n}\r\n\r\n/** Features read from pixels rendered by a viewport. */\r\nclass ScreenFeatures implements Iterable<VisibleFeature> {\r\n private readonly _pixels: Pixel.Buffer;\r\n private readonly _rect: ViewRect;\r\n private readonly _iModel: IModelConnection;\r\n\r\n public constructor(pixels: Pixel.Buffer, rect: ViewRect, viewport: Viewport) {\r\n this._pixels = pixels;\r\n this._rect = rect.clone();\r\n this._rect.right = viewport.cssPixelsToDevicePixels(this._rect.right);\r\n this._rect.bottom = viewport.cssPixelsToDevicePixels(this._rect.bottom);\r\n this._iModel = viewport.iModel;\r\n }\r\n\r\n public [Symbol.iterator](): Iterator<VisibleFeature> {\r\n function* iterator(pixels: Pixel.Buffer, rect: ViewRect, iModel: IModelConnection) {\r\n for (let x = rect.left; x < rect.right; x++) {\r\n for (let y = rect.top; y < rect.bottom; y++) {\r\n const pixel = pixels.getPixel(x, y);\r\n if (pixel.feature && pixel.featureTable) {\r\n yield {\r\n elementId: pixel.feature.elementId,\r\n subCategoryId: pixel.feature.subCategoryId,\r\n geometryClass: pixel.feature.geometryClass,\r\n modelId: pixel.featureTable.modelId,\r\n iModel: pixel.iModel ?? iModel,\r\n };\r\n }\r\n }\r\n }\r\n }\r\n\r\n return iterator(this._pixels, this._rect, this._iModel);\r\n }\r\n}\r\n\r\n/** Implementation of [[Viewport.queryVisibleFeatures]].\r\n * @internal\r\n */\r\nexport function queryVisibleFeatures(viewport: Viewport, options: QueryVisibleFeaturesOptions, callback: QueryVisibleFeaturesCallback): void {\r\n assert(\"screen\" === options.source || \"tiles\" === options.source);\r\n switch (options.source) {\r\n case \"screen\":\r\n const rect = options.rect ?? viewport.viewRect;\r\n viewport.readPixels(rect, Pixel.Selector.Feature, (pixels) => invokeCallback(pixels ? new ScreenFeatures(pixels, rect, viewport) : [], callback), true !== options.includeNonLocatable);\r\n break;\r\n case \"tiles\":\r\n viewport.target.queryVisibleTileFeatures(options, viewport.iModel, (features) => invokeCallback(features, callback));\r\n break;\r\n default:\r\n invokeCallback([], callback);\r\n break;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"VisibleFeature.js","sourceRoot":"","sources":["../../../src/render/VisibleFeature.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Rendering\r\n */\r\n\r\nimport { assert, Id64String } from \"@itwin/core-bentley\";\r\nimport { GeometryClass } from \"@itwin/core-common\";\r\nimport { ViewRect } from \"../ViewRect\";\r\nimport { Viewport } from \"../Viewport\";\r\nimport { IModelConnection } from \"../IModelConnection\";\r\nimport { Pixel } from \"./Pixel\";\r\n\r\n/** Represents a [Feature]($common) determined to be visible within a [[Viewport]].\r\n * @see [[Viewport.queryVisibleFeatures]].\r\n * @public\r\n */\r\nexport interface VisibleFeature {\r\n /** The Id of the [Element]($backend) associated with the feature. May be invalid or transient. */\r\n readonly elementId: Id64String;\r\n /** The Id of the [SubCategory]($backend) associated with the feature. May be invalid or transient. */\r\n readonly subCategoryId: Id64String;\r\n /** The class of geometry associated with the feature. */\r\n readonly geometryClass: GeometryClass;\r\n /** The Id of the [GeometricModel]($backend) associated with the feature. May be invalid or transient. */\r\n readonly modelId: Id64String;\r\n /** The iModel associated with the feature. In some cases this may differ from the [[Viewport]]'s iModel. */\r\n iModel: IModelConnection;\r\n}\r\n\r\n/** Options specifying how to query for visible [Feature]($common)s by reading pixels rendered by a [[Viewport]].\r\n * This method of determining visibility considers a feature \"visible\" if it lit up at least one pixel.\r\n * @note A pixel that is behind another, transparent pixel is not considered visible.\r\n * @see [[QueryVisibleFeaturesOptions]].\r\n * @public\r\n */\r\nexport interface QueryScreenFeaturesOptions {\r\n /** Union discriminator for [[QueryVisibleFeaturesOptions]]. */\r\n source: \"screen\";\r\n /** If true, non-locatable features are considered visible. */\r\n includeNonLocatable?: boolean;\r\n /** If specified, a sub-region of the [[Viewport]] to which to constrain the query. */\r\n rect?: ViewRect;\r\n}\r\n\r\n/** Options specifying how to query for visible [Feature]($common)s by inspecting the [[Tile]]s selected for display by a [[Viewport]].\r\n * This method of determining visibility considers a feature \"visible\" if it is included in at least one tile selected for display and is\r\n * not otherwise rendered invisible by the view's [[CategorySelectorState]], [SubCategoryAppearance]($common) overrides, [FeatureOverrides]($common), or\r\n * other means.\r\n * @note If a clip volume is applied to the view, features contained in tiles that *intersect* the clip volume are considered visible regardless of whether\r\n * their geometry would actually be entirely clipped out by the clip volume.\r\n * @see [[QueryVisibleFeaturesOptions]].\r\n * @public\r\n */\r\nexport interface QueryTileFeaturesOptions {\r\n /** Union discriminator for [[QueryVisibleFeaturesOptions]]. */\r\n source: \"tiles\";\r\n /** If true, non-locatable features are considered visible. */\r\n includeNonLocatable?: boolean;\r\n}\r\n\r\n/** Options specifying how to query for visible [Feature]($common)s.\r\n * @see [[Viewport.queryVisibleFeatures]].\r\n * @public\r\n */\r\nexport type QueryVisibleFeaturesOptions = QueryScreenFeaturesOptions | QueryTileFeaturesOptions;\r\n\r\n/** A function supplied to [[Viewport.queryVisibleFeatures]] to process the results. The iterable supplied to the callback consists of all of the\r\n * [Feature]($common)s determined to be visible. The same feature may recur multiple times.\r\n * @note The iterable supplied to the callback is usable only within the callback. Once the callback exits, the iterable becomes empty.\r\n * @public\r\n */\r\nexport type QueryVisibleFeaturesCallback = (features: Iterable<VisibleFeature>) => void;\r\n\r\n/** Ensures that the iterable supplied to QueryVisibleFeaturesCallback becomes invalidated once the callback exits.\r\n * The iterable relies on RenderTarget state that changes from one frame to another.\r\n */\r\nclass ExpiringIterable implements Iterable<VisibleFeature> {\r\n private _features: Iterable<VisibleFeature>;\r\n private _disposed = false;\r\n\r\n public constructor(features: Iterable<VisibleFeature>) {\r\n this._features = features;\r\n }\r\n\r\n public dispose(): void {\r\n this._disposed = true;\r\n this._features = [];\r\n }\r\n\r\n public [Symbol.iterator](): Iterator<VisibleFeature> {\r\n assert(!this._disposed, \"The iterable supplied to QueryVisibleFeaturesCallback is valid only for the duration of the callback.\");\r\n return this._features[Symbol.iterator]();\r\n }\r\n}\r\n\r\nfunction invokeCallback(features: Iterable<VisibleFeature>, callback: QueryVisibleFeaturesCallback): void {\r\n const iterable = new ExpiringIterable(features);\r\n try {\r\n callback(iterable);\r\n } finally {\r\n iterable.dispose();\r\n }\r\n}\r\n\r\n/** Features read from pixels rendered by a viewport. */\r\nclass ScreenFeatures implements Iterable<VisibleFeature> {\r\n private readonly _pixels: Pixel.Buffer;\r\n private readonly _rect: ViewRect;\r\n private readonly _iModel: IModelConnection;\r\n\r\n public constructor(pixels: Pixel.Buffer, rect: ViewRect, viewport: Viewport) {\r\n this._pixels = pixels;\r\n this._rect = rect.clone();\r\n this._rect.right = viewport.cssPixelsToDevicePixels(this._rect.right);\r\n this._rect.bottom = viewport.cssPixelsToDevicePixels(this._rect.bottom);\r\n this._iModel = viewport.iModel;\r\n }\r\n\r\n public [Symbol.iterator](): Iterator<VisibleFeature> {\r\n function* iterator(pixels: Pixel.Buffer, rect: ViewRect, iModel: IModelConnection) {\r\n for (let x = rect.left; x < rect.right; x++) {\r\n for (let y = rect.top; y < rect.bottom; y++) {\r\n const pixel = pixels.getPixel(x, y);\r\n if (pixel.feature && pixel.modelId) {\r\n yield {\r\n elementId: pixel.feature.elementId,\r\n subCategoryId: pixel.feature.subCategoryId,\r\n geometryClass: pixel.feature.geometryClass,\r\n modelId: pixel.modelId,\r\n iModel: pixel.iModel ?? iModel,\r\n };\r\n }\r\n }\r\n }\r\n }\r\n\r\n return iterator(this._pixels, this._rect, this._iModel);\r\n }\r\n}\r\n\r\n/** Implementation of [[Viewport.queryVisibleFeatures]].\r\n * @internal\r\n */\r\nexport function queryVisibleFeatures(viewport: Viewport, options: QueryVisibleFeaturesOptions, callback: QueryVisibleFeaturesCallback): void {\r\n assert(\"screen\" === options.source || \"tiles\" === options.source);\r\n switch (options.source) {\r\n case \"screen\":\r\n const rect = options.rect ?? viewport.viewRect;\r\n viewport.readPixels(rect, Pixel.Selector.Feature, (pixels) => invokeCallback(pixels ? new ScreenFeatures(pixels, rect, viewport) : [], callback), true !== options.includeNonLocatable);\r\n break;\r\n case \"tiles\":\r\n viewport.target.queryVisibleTileFeatures(options, viewport.iModel, (features) => invokeCallback(features, callback));\r\n break;\r\n default:\r\n invokeCallback([], callback);\r\n break;\r\n }\r\n}\r\n"]}
@@ -2,7 +2,7 @@
2
2
  * @module WebGL
3
3
  */
4
4
  import { Id64String } from "@itwin/core-bentley";
5
- import { Feature } from "@itwin/core-common";
5
+ import { ModelFeature } from "@itwin/core-common";
6
6
  import { IModelConnection } from "../../IModelConnection";
7
7
  import { BranchStack } from "./BranchStack";
8
8
  import { Batch } from "./Graphic";
@@ -33,8 +33,9 @@ export declare class BatchState {
33
33
  push(batch: Batch, allowAdd: boolean): void;
34
34
  pop(): void;
35
35
  reset(): void;
36
+ private static readonly _scratchElementIdPair;
36
37
  getElementId(featureId: number): Id64String;
37
- getFeature(featureId: number): Feature | undefined;
38
+ getFeature(featureId: number, result: ModelFeature): ModelFeature | undefined;
38
39
  get numFeatureIds(): number;
39
40
  get numBatches(): number;
40
41
  findBatchId(featureId: number): number;
@@ -1 +1 @@
1
- {"version":3,"file":"BatchState.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/BatchState.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAgB,UAAU,EAAc,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC;;;;;;;;;;;;;;GAcG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAQ;gBAEP,KAAK,EAAE,WAAW;IAIrC,IAAW,YAAY,IAAI,KAAK,GAAG,SAAS,CAA2B;IACvE,IAAW,cAAc,IAAI,MAAM,CAAsE;IACzG,IAAW,kBAAkB,IAAI,gBAAgB,GAAG,SAAS,CAAkF;IAC/I,IAAW,OAAO,IAAI,OAAO,CAAuC;IAE7D,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAM3C,GAAG,IAAI,IAAI;IAKX,KAAK,IAAI,IAAI;IASb,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU;IAY3C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAWzD,IAAW,aAAa,WAA+B;IACvD,IAAW,UAAU,WAAmC;IAEjD,WAAW,CAAC,SAAS,EAAE,MAAM;IAKpC,IAAW,WAAW,IAAI,MAAM,CAY/B;IAED,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,OAAO;IAiBR,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;CAIlD"}
1
+ {"version":3,"file":"BatchState.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/BatchState.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAgB,UAAU,EAAc,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC;;;;;;;;;;;;;;GAcG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAQ;gBAEP,KAAK,EAAE,WAAW;IAIrC,IAAW,YAAY,IAAI,KAAK,GAAG,SAAS,CAA2B;IACvE,IAAW,cAAc,IAAI,MAAM,CAAsE;IACzG,IAAW,kBAAkB,IAAI,gBAAgB,GAAG,SAAS,CAAkF;IAC/I,IAAW,OAAO,IAAI,OAAO,CAAuC;IAE7D,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAM3C,GAAG,IAAI,IAAI;IAKX,KAAK,IAAI,IAAI;IASpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAA0B;IAChE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU;IAY3C,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,YAAY,GAAG,SAAS;IAWpF,IAAW,aAAa,WAA+B;IACvD,IAAW,UAAU,WAAmC;IAEjD,WAAW,CAAC,SAAS,EAAE,MAAM;IAKpC,IAAW,WAAW,IAAI,MAAM,CAY/B;IAED,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,OAAO;IAiBR,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;CAIlD"}
@@ -55,16 +55,16 @@ class BatchState {
55
55
  return core_bentley_1.Id64.invalid;
56
56
  const featureIndex = featureId - batch.batchId;
57
57
  (0, core_bentley_1.assert)(featureIndex >= 0);
58
- const parts = batch.featureTable.getElementIdPair(featureIndex);
58
+ const parts = batch.featureTable.getElementIdPair(featureIndex, BatchState._scratchElementIdPair);
59
59
  return core_bentley_1.Id64.fromUint32Pair(parts.lower, parts.upper);
60
60
  }
61
- getFeature(featureId) {
61
+ getFeature(featureId, result) {
62
62
  const batch = this.find(featureId);
63
63
  if (undefined === batch)
64
64
  return undefined;
65
65
  const featureIndex = featureId - batch.batchId;
66
66
  (0, core_bentley_1.assert)(featureIndex >= 0);
67
- return batch.featureTable.findFeature(featureIndex);
67
+ return batch.featureTable.findFeature(featureIndex, result);
68
68
  }
69
69
  get numFeatureIds() { return this.nextBatchId; }
70
70
  get numBatches() { return this._batches.length; }
@@ -108,4 +108,5 @@ class BatchState {
108
108
  }
109
109
  }
110
110
  exports.BatchState = BatchState;
111
+ BatchState._scratchElementIdPair = { lower: 0, upper: 0 };
111
112
  //# sourceMappingURL=BatchState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BatchState.js","sourceRoot":"","sources":["../../../../src/render/webgl/BatchState.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert, Id64, Id64String, lowerBound } from \"@itwin/core-bentley\";\r\nimport { Feature } from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport { BranchStack } from \"./BranchStack\";\r\nimport { Batch } from \"./Graphic\";\r\n\r\n/**\r\n * Assigns a transient, unique 32-bit integer ID to each Batch in a RenderCommands.\r\n * A batch ID of 0 means \"no batch\".\r\n * The first batch gets batch ID of 1.\r\n * The next batch gets the previous batch's ID plus the number of features in the previous batch's feature table\r\n * (or 1, if empty feature table).\r\n * The IDs are set temporarily as members on the Batch objects and reset to 0 immediately after rendering.\r\n * The currentBatch member identifies the batch containing primitives currently being drawn.\r\n * The combination of the current batch's ID (passed as uniform to shader) and the index of a given Feature within\r\n * its batch's FeatureTable (stored in vertex table) produce a unique ID for every feature rendered during a frame.\r\n * During rendering, the feature IDs are written to the \"feature ID\" color attachment.\r\n * The batch IDs remain valid during a call to Target.readPixels() so that they can be used to extract\r\n * Features from the Batch's FeatureTables.\r\n * @internal\r\n */\r\nexport class BatchState {\r\n private readonly _stack: BranchStack;\r\n private _batches: Batch[] = []; // NB: this list is ordered - but *not* indexed - by batch ID.\r\n private _curBatch?: Batch;\r\n\r\n public constructor(stack: BranchStack) {\r\n this._stack = stack;\r\n }\r\n\r\n public get currentBatch(): Batch | undefined { return this._curBatch; }\r\n public get currentBatchId(): number { return undefined !== this._curBatch ? this._curBatch.batchId : 0; }\r\n public get currentBatchIModel(): IModelConnection | undefined { return undefined !== this._curBatch ? this._curBatch.batchIModel : undefined; }\r\n public get isEmpty(): boolean { return 0 === this._batches.length; }\r\n\r\n public push(batch: Batch, allowAdd: boolean): void {\r\n assert(undefined === this.currentBatch, \"batches cannot nest\");\r\n this.getBatchId(batch, allowAdd);\r\n this._curBatch = batch;\r\n }\r\n\r\n public pop(): void {\r\n assert(undefined !== this.currentBatch);\r\n this._curBatch = undefined;\r\n }\r\n\r\n public reset(): void {\r\n assert(undefined === this.currentBatch);\r\n for (const batch of this._batches)\r\n batch.resetContext();\r\n\r\n this._batches.length = 0;\r\n this._curBatch = undefined;\r\n }\r\n\r\n public getElementId(featureId: number): Id64String {\r\n const batch = this.find(featureId);\r\n if (undefined === batch)\r\n return Id64.invalid;\r\n\r\n const featureIndex = featureId - batch.batchId;\r\n assert(featureIndex >= 0);\r\n\r\n const parts = batch.featureTable.getElementIdPair(featureIndex);\r\n return Id64.fromUint32Pair(parts.lower, parts.upper);\r\n }\r\n\r\n public getFeature(featureId: number): Feature | undefined {\r\n const batch = this.find(featureId);\r\n if (undefined === batch)\r\n return undefined;\r\n\r\n const featureIndex = featureId - batch.batchId;\r\n assert(featureIndex >= 0);\r\n\r\n return batch.featureTable.findFeature(featureIndex);\r\n }\r\n\r\n public get numFeatureIds() { return this.nextBatchId; }\r\n public get numBatches() { return this._batches.length; }\r\n\r\n public findBatchId(featureId: number) {\r\n const batch = this.find(featureId);\r\n return undefined !== batch ? batch.batchId : 0;\r\n }\r\n\r\n public get nextBatchId(): number {\r\n if (this.isEmpty)\r\n return 1;\r\n\r\n const prev = this._batches[this._batches.length - 1];\r\n assert(0 !== prev.batchId);\r\n\r\n let prevNumFeatures = prev.featureTable.numFeatures;\r\n if (0 === prevNumFeatures)\r\n prevNumFeatures = 1;\r\n\r\n return prev.batchId + prevNumFeatures;\r\n }\r\n\r\n private getBatchId(batch: Batch, allowAdd: boolean): number {\r\n if (allowAdd && 0 === batch.batchId) {\r\n batch.setContext(this.nextBatchId, this._stack.top.iModel);\r\n this._batches.push(batch);\r\n }\r\n\r\n return batch.batchId;\r\n }\r\n\r\n private indexOf(featureId: number): number {\r\n if (featureId <= 0)\r\n return -1;\r\n\r\n const found = lowerBound(featureId, this._batches, (lhs: number, rhs: Batch) => {\r\n // Determine if the requested feature ID is within the range of this batch.\r\n if (lhs < rhs.batchId)\r\n return -1;\r\n\r\n const numFeatures = rhs.featureTable.numFeatures;\r\n const nextBatchId = rhs.batchId + (numFeatures > 0 ? numFeatures : 1);\r\n return lhs < nextBatchId ? 0 : 1;\r\n });\r\n\r\n return found.index < this._batches.length ? found.index : -1;\r\n }\r\n\r\n public find(featureId: number): Batch | undefined {\r\n const index = this.indexOf(featureId);\r\n return -1 !== index ? this._batches[index] : undefined;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchState.js","sourceRoot":"","sources":["../../../../src/render/webgl/BatchState.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert, Id64, Id64String, lowerBound } from \"@itwin/core-bentley\";\r\nimport { ModelFeature } from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport { BranchStack } from \"./BranchStack\";\r\nimport { Batch } from \"./Graphic\";\r\n\r\n/**\r\n * Assigns a transient, unique 32-bit integer ID to each Batch in a RenderCommands.\r\n * A batch ID of 0 means \"no batch\".\r\n * The first batch gets batch ID of 1.\r\n * The next batch gets the previous batch's ID plus the number of features in the previous batch's feature table\r\n * (or 1, if empty feature table).\r\n * The IDs are set temporarily as members on the Batch objects and reset to 0 immediately after rendering.\r\n * The currentBatch member identifies the batch containing primitives currently being drawn.\r\n * The combination of the current batch's ID (passed as uniform to shader) and the index of a given Feature within\r\n * its batch's FeatureTable (stored in vertex table) produce a unique ID for every feature rendered during a frame.\r\n * During rendering, the feature IDs are written to the \"feature ID\" color attachment.\r\n * The batch IDs remain valid during a call to Target.readPixels() so that they can be used to extract\r\n * Features from the Batch's FeatureTables.\r\n * @internal\r\n */\r\nexport class BatchState {\r\n private readonly _stack: BranchStack;\r\n private _batches: Batch[] = []; // NB: this list is ordered - but *not* indexed - by batch ID.\r\n private _curBatch?: Batch;\r\n\r\n public constructor(stack: BranchStack) {\r\n this._stack = stack;\r\n }\r\n\r\n public get currentBatch(): Batch | undefined { return this._curBatch; }\r\n public get currentBatchId(): number { return undefined !== this._curBatch ? this._curBatch.batchId : 0; }\r\n public get currentBatchIModel(): IModelConnection | undefined { return undefined !== this._curBatch ? this._curBatch.batchIModel : undefined; }\r\n public get isEmpty(): boolean { return 0 === this._batches.length; }\r\n\r\n public push(batch: Batch, allowAdd: boolean): void {\r\n assert(undefined === this.currentBatch, \"batches cannot nest\");\r\n this.getBatchId(batch, allowAdd);\r\n this._curBatch = batch;\r\n }\r\n\r\n public pop(): void {\r\n assert(undefined !== this.currentBatch);\r\n this._curBatch = undefined;\r\n }\r\n\r\n public reset(): void {\r\n assert(undefined === this.currentBatch);\r\n for (const batch of this._batches)\r\n batch.resetContext();\r\n\r\n this._batches.length = 0;\r\n this._curBatch = undefined;\r\n }\r\n\r\n private static readonly _scratchElementIdPair = { lower: 0, upper: 0 };\r\n public getElementId(featureId: number): Id64String {\r\n const batch = this.find(featureId);\r\n if (undefined === batch)\r\n return Id64.invalid;\r\n\r\n const featureIndex = featureId - batch.batchId;\r\n assert(featureIndex >= 0);\r\n\r\n const parts = batch.featureTable.getElementIdPair(featureIndex, BatchState._scratchElementIdPair);\r\n return Id64.fromUint32Pair(parts.lower, parts.upper);\r\n }\r\n\r\n public getFeature(featureId: number, result: ModelFeature): ModelFeature | undefined {\r\n const batch = this.find(featureId);\r\n if (undefined === batch)\r\n return undefined;\r\n\r\n const featureIndex = featureId - batch.batchId;\r\n assert(featureIndex >= 0);\r\n\r\n return batch.featureTable.findFeature(featureIndex, result);\r\n }\r\n\r\n public get numFeatureIds() { return this.nextBatchId; }\r\n public get numBatches() { return this._batches.length; }\r\n\r\n public findBatchId(featureId: number) {\r\n const batch = this.find(featureId);\r\n return undefined !== batch ? batch.batchId : 0;\r\n }\r\n\r\n public get nextBatchId(): number {\r\n if (this.isEmpty)\r\n return 1;\r\n\r\n const prev = this._batches[this._batches.length - 1];\r\n assert(0 !== prev.batchId);\r\n\r\n let prevNumFeatures = prev.featureTable.numFeatures;\r\n if (0 === prevNumFeatures)\r\n prevNumFeatures = 1;\r\n\r\n return prev.batchId + prevNumFeatures;\r\n }\r\n\r\n private getBatchId(batch: Batch, allowAdd: boolean): number {\r\n if (allowAdd && 0 === batch.batchId) {\r\n batch.setContext(this.nextBatchId, this._stack.top.iModel);\r\n this._batches.push(batch);\r\n }\r\n\r\n return batch.batchId;\r\n }\r\n\r\n private indexOf(featureId: number): number {\r\n if (featureId <= 0)\r\n return -1;\r\n\r\n const found = lowerBound(featureId, this._batches, (lhs: number, rhs: Batch) => {\r\n // Determine if the requested feature ID is within the range of this batch.\r\n if (lhs < rhs.batchId)\r\n return -1;\r\n\r\n const numFeatures = rhs.featureTable.numFeatures;\r\n const nextBatchId = rhs.batchId + (numFeatures > 0 ? numFeatures : 1);\r\n return lhs < nextBatchId ? 0 : 1;\r\n });\r\n\r\n return found.index < this._batches.length ? found.index : -1;\r\n }\r\n\r\n public find(featureId: number): Batch | undefined {\r\n const index = this.indexOf(featureId);\r\n return -1 !== index ? this._batches[index] : undefined;\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"DrawCommand.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/DrawCommand.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DrawCommand.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/DrawCommand.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.extractHilitedVolumeClassifierCommands = exports.extractFlashedVolumeClassifierCommands = exports.PrimitiveCommand = exports.PopClipCommand = exports.PushClipCommand = exports.PopBranchCommand = exports.PushBranchCommand = exports.PushStateCommand = exports.PushBatchCommand = exports.PopBatchCommand = exports.DrawOpCode = exports.DrawParams = exports.ShaderProgramParams = void 0;
11
11
  const core_bentley_1 = require("@itwin/core-bentley");
12
+ const core_common_1 = require("@itwin/core-common");
12
13
  const FeatureOverrides_1 = require("./FeatureOverrides");
13
14
  const System_1 = require("./System");
14
15
  const TechniqueFlags_1 = require("./TechniqueFlags");
@@ -221,6 +222,7 @@ function extractFlashedVolumeClassifierCommands(flashedId, cmds, numCmdsPerClass
221
222
  return undefined;
222
223
  }
223
224
  exports.extractFlashedVolumeClassifierCommands = extractFlashedVolumeClassifierCommands;
225
+ const scratchFeature = core_common_1.PackedFeature.create();
224
226
  /** @internal */
225
227
  function extractHilitedVolumeClassifierCommands(hilites, cmds) {
226
228
  // TODO: This could really be done at the time the HiliteClassification render pass commands are being generated
@@ -251,8 +253,8 @@ function extractHilitedVolumeClassifierCommands(hilites, cmds) {
251
253
  const surface = cmd.primitive.cachedGeometry.asSurface;
252
254
  if (undefined === surface || undefined === surface.mesh.uniformFeatureId)
253
255
  continue;
254
- const feature = batch.featureTable.getPackedFeature(surface.mesh.uniformFeatureId);
255
- if (undefined === feature || !(0, FeatureOverrides_1.isFeatureHilited)(feature, hilites, hilites.models.hasId(batch.featureTable.modelId)))
256
+ const feature = batch.featureTable.getPackedFeature(surface.mesh.uniformFeatureId, scratchFeature);
257
+ if (undefined === feature || !(0, FeatureOverrides_1.isFeatureHilited)(feature, hilites, hilites.models.hasId(core_bentley_1.Id64.fromUint32PairObject(feature.modelId))))
256
258
  continue;
257
259
  break;
258
260
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DrawCommand.js","sourceRoot":"","sources":["../../../../src/render/webgl/DrawCommand.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert, Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { BranchState } from \"./BranchState\";\r\nimport { CachedGeometry } from \"./CachedGeometry\";\r\nimport { ClipVolume } from \"./ClipVolume\";\r\nimport { isFeatureHilited } from \"./FeatureOverrides\";\r\nimport { Batch, Branch } from \"./Graphic\";\r\nimport { UniformHandle } from \"./UniformHandle\";\r\nimport { Primitive } from \"./Primitive\";\r\nimport { Pass, RenderOrder, RenderPass } from \"./RenderFlags\";\r\nimport { ShaderProgramExecutor } from \"./ShaderProgram\";\r\nimport { System } from \"./System\";\r\nimport { Hilites, Target } from \"./Target\";\r\nimport { IsAnimated, IsClassified, IsInstanced, IsShadowable, IsThematic, IsWiremesh, TechniqueFlags } from \"./TechniqueFlags\";\r\nimport { TechniqueId } from \"./TechniqueId\";\r\n\r\n/* eslint-disable no-restricted-syntax */\r\n\r\n/** @internal */\r\nexport class ShaderProgramParams {\r\n private _target?: Target;\r\n private _renderPass: RenderPass = RenderPass.None;\r\n\r\n public get target(): Target {\r\n assert(undefined !== this._target);\r\n return this._target;\r\n }\r\n\r\n public get renderPass() { return this._renderPass; }\r\n\r\n public get projectionMatrix() { return this.target.uniforms.getProjectionMatrix32(this.isViewCoords); }\r\n public bindProjectionMatrix(uniform: UniformHandle) { this.target.uniforms.bindProjectionMatrix(uniform, this.isViewCoords); }\r\n\r\n public get isViewCoords() { return RenderPass.ViewOverlay === this.renderPass || RenderPass.Background === this.renderPass; }\r\n public get isOverlayPass() { return RenderPass.WorldOverlay === this.renderPass || RenderPass.ViewOverlay === this.renderPass; }\r\n public get context() { return System.instance.context; }\r\n\r\n public init(target: Target, pass: RenderPass = RenderPass.OpaqueGeneral) {\r\n this._renderPass = pass;\r\n this._target = target;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class DrawParams {\r\n private _programParams?: ShaderProgramParams;\r\n private _geometry?: CachedGeometry;\r\n\r\n public get geometry(): CachedGeometry {\r\n assert(undefined !== this._geometry);\r\n return this._geometry;\r\n }\r\n\r\n public get programParams(): ShaderProgramParams {\r\n assert(undefined !== this._programParams);\r\n return this._programParams;\r\n }\r\n\r\n public get target() { return this.programParams.target; }\r\n public get renderPass() { return this.programParams.renderPass; }\r\n public get projectionMatrix() { return this.programParams.projectionMatrix; }\r\n public get isViewCoords() {\r\n return this.programParams.isViewCoords || this.target.currentBranch.forceViewCoords;\r\n }\r\n public get isOverlayPass() { return this.programParams.isOverlayPass; }\r\n public get context() { return this.programParams.context; }\r\n\r\n public init(programParams: ShaderProgramParams, geometry: CachedGeometry) {\r\n this._programParams = programParams;\r\n this._geometry = geometry;\r\n }\r\n}\r\n\r\n/** Defines operation associated with pushing or popping a branch\r\n * @internal\r\n */\r\nexport const enum PushOrPop {\r\n Push,\r\n Pop,\r\n}\r\n\r\n/** Represents a command to be executed within a RenderPass. The most common command is\r\n * to draw a primitive; others involve state changes such as pushing/popping transforms\r\n * and symbology overrides, which require that commands be executed in order.\r\n * @internal\r\n */\r\nexport enum DrawOpCode {\r\n Primitive = \"drawPrimitive\", // eslint-disable-line @typescript-eslint/no-shadow\r\n PushBranch = \"pushBranch\",\r\n PopBranch = \"popBranch\",\r\n PushBatch = \"pushBatch\",\r\n PopBatch = \"popBatch\",\r\n PushState = \"pushState\",\r\n PushClip = \"pushClip\",\r\n PopClip = \"popClip\",\r\n}\r\n\r\n/** @internal */\r\nexport class PopBatchCommand {\r\n public readonly opcode = \"popBatch\";\r\n\r\n private constructor() { }\r\n\r\n public static instance = new PopBatchCommand();\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n exec.target.popBatch();\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class PushBatchCommand {\r\n public readonly opcode = \"pushBatch\";\r\n\r\n public constructor(public readonly batch: Batch) { }\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n exec.target.pushBatch(this.batch);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class PushStateCommand {\r\n public readonly opcode = \"pushState\";\r\n\r\n public constructor(public readonly state: BranchState) { }\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n exec.target.pushState(this.state);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class PushBranchCommand {\r\n public readonly opcode = \"pushBranch\";\r\n\r\n public constructor(public readonly branch: Branch) { }\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n exec.pushBranch(this.branch);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class PopBranchCommand {\r\n public readonly opcode = \"popBranch\";\r\n\r\n private constructor() { }\r\n\r\n public static instance = new PopBranchCommand();\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n exec.popBranch();\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class PushClipCommand {\r\n public readonly opcode = \"pushClip\";\r\n\r\n public constructor(public readonly clip: ClipVolume) { }\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n exec.target.uniforms.branch.clipStack.push(this.clip);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class PopClipCommand {\r\n public readonly opcode = \"popClip\";\r\n\r\n private constructor() { }\r\n\r\n public static instance = new PopClipCommand();\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n exec.target.uniforms.branch.clipStack.pop();\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class PrimitiveCommand {\r\n public readonly opcode = \"drawPrimitive\";\r\n\r\n public constructor(public readonly primitive: Primitive) { }\r\n\r\n private static readonly _scratchTechniqueFlags = new TechniqueFlags();\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n if (exec.target.isGeometryOutsideActiveVolume(this.primitive.cachedGeometry))\r\n return;\r\n\r\n const techniqueId = this.primitive.techniqueId;\r\n if (TechniqueId.Invalid === techniqueId)\r\n return;\r\n\r\n const target = exec.target;\r\n const thematic = this.primitive.cachedGeometry.supportsThematicDisplay && target.wantThematicDisplay;\r\n const shadowable = (techniqueId === TechniqueId.Surface || techniqueId === TechniqueId.RealityMesh) && target.solarShadowMap.isReady && target.currentViewFlags.shadows && !thematic;\r\n const isShadowable = shadowable ? IsShadowable.Yes : IsShadowable.No;\r\n let isThematic = thematic ? IsThematic.Yes : IsThematic.No;\r\n const isClassified = (undefined !== target.currentPlanarClassifierOrDrape || undefined !== target.activeVolumeClassifierTexture) ? IsClassified.Yes : IsClassified.No;\r\n const isInstanced = this.primitive.isInstanced ? IsInstanced.Yes : IsInstanced.No;\r\n const isAnimated = this.primitive.hasAnimation ? IsAnimated.Yes : IsAnimated.No;\r\n\r\n // Point clouds do not support hillshade or slope mode for thematic display.\r\n if (isThematic && (undefined !== this.primitive.cachedGeometry.asPointCloud) && (target.uniforms.thematic.wantSlopeMode || target.uniforms.thematic.wantHillShadeMode))\r\n isThematic = IsThematic.No;\r\n\r\n const wiremesh = target.currentViewFlags.wiremesh && (techniqueId === TechniqueId.Surface || techniqueId === TechniqueId.RealityMesh);\r\n const isWiremesh = wiremesh ? IsWiremesh.Yes : IsWiremesh.No;\r\n const flags = PrimitiveCommand._scratchTechniqueFlags;\r\n const posType = this.primitive.cachedGeometry.usesQuantizedPositions ? \"quantized\" : \"unquantized\";\r\n flags.init(target, exec.renderPass, isInstanced, isAnimated, isClassified, isShadowable, isThematic, isWiremesh, posType);\r\n\r\n const technique = target.techniques.getTechnique(techniqueId);\r\n const program = technique.getShader(flags);\r\n\r\n if (exec.setProgram(program))\r\n exec.target.compositor.drawPrimitive(this.primitive, exec, program.outputsToPick);\r\n }\r\n\r\n public get hasFeatures(): boolean { return this.primitive.hasFeatures; }\r\n public get renderOrder(): RenderOrder { return this.primitive.renderOrder; }\r\n\r\n public getPass(target: Target): Pass {\r\n return this.primitive.getPass(target);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport type PushCommand = PushBranchCommand | PushBatchCommand | PushStateCommand | PushClipCommand;\r\n/** @internal */\r\nexport type PopCommand = PopBranchCommand | PopBatchCommand | PopClipCommand;\r\n/** @internal */\r\nexport type DrawCommand = PushCommand | PopCommand | PrimitiveCommand;\r\n\r\n/** For a single RenderPass, an ordered list of commands to be executed during that pass.\r\n * @internal\r\n */\r\nexport type DrawCommands = DrawCommand[];\r\n\r\n/** Extracts the commands for rendering the flashed classifier (if any) from the by-index set of volume classifier commands.\r\n * NB: Cmds will be sets of some pushes, a primitive, and then some pops (equal to number of pushes).\r\n * The primitive should be right in the middle of a set. We need to find the set which matches the flashID.\r\n * @internal\r\n */\r\nexport function extractFlashedVolumeClassifierCommands(flashedId: Id64String, cmds: DrawCommands, numCmdsPerClassifier: number): DrawCommands | undefined {\r\n if (!Id64.isValid(flashedId) || 0 === numCmdsPerClassifier)\r\n return undefined;\r\n\r\n const firstPrim = (numCmdsPerClassifier - 1) / 2;\r\n for (let i = firstPrim; i < cmds.length; i += numCmdsPerClassifier) {\r\n assert(\"drawPrimitive\" === cmds[i].opcode, \"Command list not configured as expected.\");\r\n const pc: PrimitiveCommand = cmds[i] as PrimitiveCommand;\r\n const surface = pc.primitive.cachedGeometry.asSurface;\r\n if (undefined !== surface && undefined !== surface.mesh.uniformFeatureId) {\r\n let j = i - 1;\r\n while (j >= 0 && \"pushBatch\" !== cmds[j].opcode) // Find batch for this primitive\r\n j--;\r\n if (j < 0)\r\n continue;\r\n\r\n const pushBatch = cmds[j] as PushBatchCommand;\r\n const elemId = pushBatch.batch.featureTable.findElementId(surface.mesh.uniformFeatureId);\r\n if (undefined !== elemId && elemId === flashedId) {\r\n return cmds.slice(i - firstPrim, i + firstPrim + 1);\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/** @internal */\r\nexport function extractHilitedVolumeClassifierCommands(hilites: Hilites, cmds: DrawCommands): DrawCommands {\r\n // TODO: This could really be done at the time the HiliteClassification render pass commands are being generated\r\n // by just not putting the ones which are not hilited into the ClassificationHilite command list.\r\n const result: DrawCommand[] = [];\r\n\r\n let batch;\r\n for (const cmd of cmds) {\r\n switch (cmd.opcode) {\r\n case \"popBranch\":\r\n if (result.length > 0 && \"pushBranch\" === result[result.length - 1].opcode) {\r\n result.pop(); // remove empty push/pop pairs\r\n continue;\r\n }\r\n break;\r\n case \"popBatch\":\r\n batch = undefined;\r\n if (result.length > 0 && \"pushBatch\" === result[result.length - 1].opcode) {\r\n result.pop(); // remove empty push/pop pairs\r\n continue;\r\n }\r\n break;\r\n case \"pushBatch\":\r\n batch = cmd.batch;\r\n break;\r\n case \"drawPrimitive\":\r\n if (undefined !== batch) {\r\n // Skip any primitives that are not hilited.\r\n const surface = cmd.primitive.cachedGeometry.asSurface;\r\n if (undefined === surface || undefined === surface.mesh.uniformFeatureId)\r\n continue;\r\n\r\n const feature = batch.featureTable.getPackedFeature(surface.mesh.uniformFeatureId);\r\n if (undefined === feature || !isFeatureHilited(feature, hilites, hilites.models.hasId(batch.featureTable.modelId)))\r\n continue;\r\n\r\n break;\r\n }\r\n }\r\n\r\n result.push(cmd);\r\n }\r\n\r\n return result;\r\n}\r\n"]}
1
+ {"version":3,"file":"DrawCommand.js","sourceRoot":"","sources":["../../../../src/render/webgl/DrawCommand.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert, Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { PackedFeature } from \"@itwin/core-common\";\r\nimport { BranchState } from \"./BranchState\";\r\nimport { CachedGeometry } from \"./CachedGeometry\";\r\nimport { ClipVolume } from \"./ClipVolume\";\r\nimport { isFeatureHilited } from \"./FeatureOverrides\";\r\nimport { Batch, Branch } from \"./Graphic\";\r\nimport { UniformHandle } from \"./UniformHandle\";\r\nimport { Primitive } from \"./Primitive\";\r\nimport { Pass, RenderOrder, RenderPass } from \"./RenderFlags\";\r\nimport { ShaderProgramExecutor } from \"./ShaderProgram\";\r\nimport { System } from \"./System\";\r\nimport { Hilites, Target } from \"./Target\";\r\nimport { IsAnimated, IsClassified, IsInstanced, IsShadowable, IsThematic, IsWiremesh, TechniqueFlags } from \"./TechniqueFlags\";\r\nimport { TechniqueId } from \"./TechniqueId\";\r\n\r\n/* eslint-disable no-restricted-syntax */\r\n\r\n/** @internal */\r\nexport class ShaderProgramParams {\r\n private _target?: Target;\r\n private _renderPass: RenderPass = RenderPass.None;\r\n\r\n public get target(): Target {\r\n assert(undefined !== this._target);\r\n return this._target;\r\n }\r\n\r\n public get renderPass() { return this._renderPass; }\r\n\r\n public get projectionMatrix() { return this.target.uniforms.getProjectionMatrix32(this.isViewCoords); }\r\n public bindProjectionMatrix(uniform: UniformHandle) { this.target.uniforms.bindProjectionMatrix(uniform, this.isViewCoords); }\r\n\r\n public get isViewCoords() { return RenderPass.ViewOverlay === this.renderPass || RenderPass.Background === this.renderPass; }\r\n public get isOverlayPass() { return RenderPass.WorldOverlay === this.renderPass || RenderPass.ViewOverlay === this.renderPass; }\r\n public get context() { return System.instance.context; }\r\n\r\n public init(target: Target, pass: RenderPass = RenderPass.OpaqueGeneral) {\r\n this._renderPass = pass;\r\n this._target = target;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class DrawParams {\r\n private _programParams?: ShaderProgramParams;\r\n private _geometry?: CachedGeometry;\r\n\r\n public get geometry(): CachedGeometry {\r\n assert(undefined !== this._geometry);\r\n return this._geometry;\r\n }\r\n\r\n public get programParams(): ShaderProgramParams {\r\n assert(undefined !== this._programParams);\r\n return this._programParams;\r\n }\r\n\r\n public get target() { return this.programParams.target; }\r\n public get renderPass() { return this.programParams.renderPass; }\r\n public get projectionMatrix() { return this.programParams.projectionMatrix; }\r\n public get isViewCoords() {\r\n return this.programParams.isViewCoords || this.target.currentBranch.forceViewCoords;\r\n }\r\n public get isOverlayPass() { return this.programParams.isOverlayPass; }\r\n public get context() { return this.programParams.context; }\r\n\r\n public init(programParams: ShaderProgramParams, geometry: CachedGeometry) {\r\n this._programParams = programParams;\r\n this._geometry = geometry;\r\n }\r\n}\r\n\r\n/** Defines operation associated with pushing or popping a branch\r\n * @internal\r\n */\r\nexport const enum PushOrPop {\r\n Push,\r\n Pop,\r\n}\r\n\r\n/** Represents a command to be executed within a RenderPass. The most common command is\r\n * to draw a primitive; others involve state changes such as pushing/popping transforms\r\n * and symbology overrides, which require that commands be executed in order.\r\n * @internal\r\n */\r\nexport enum DrawOpCode {\r\n Primitive = \"drawPrimitive\", // eslint-disable-line @typescript-eslint/no-shadow\r\n PushBranch = \"pushBranch\",\r\n PopBranch = \"popBranch\",\r\n PushBatch = \"pushBatch\",\r\n PopBatch = \"popBatch\",\r\n PushState = \"pushState\",\r\n PushClip = \"pushClip\",\r\n PopClip = \"popClip\",\r\n}\r\n\r\n/** @internal */\r\nexport class PopBatchCommand {\r\n public readonly opcode = \"popBatch\";\r\n\r\n private constructor() { }\r\n\r\n public static instance = new PopBatchCommand();\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n exec.target.popBatch();\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class PushBatchCommand {\r\n public readonly opcode = \"pushBatch\";\r\n\r\n public constructor(public readonly batch: Batch) { }\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n exec.target.pushBatch(this.batch);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class PushStateCommand {\r\n public readonly opcode = \"pushState\";\r\n\r\n public constructor(public readonly state: BranchState) { }\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n exec.target.pushState(this.state);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class PushBranchCommand {\r\n public readonly opcode = \"pushBranch\";\r\n\r\n public constructor(public readonly branch: Branch) { }\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n exec.pushBranch(this.branch);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class PopBranchCommand {\r\n public readonly opcode = \"popBranch\";\r\n\r\n private constructor() { }\r\n\r\n public static instance = new PopBranchCommand();\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n exec.popBranch();\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class PushClipCommand {\r\n public readonly opcode = \"pushClip\";\r\n\r\n public constructor(public readonly clip: ClipVolume) { }\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n exec.target.uniforms.branch.clipStack.push(this.clip);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class PopClipCommand {\r\n public readonly opcode = \"popClip\";\r\n\r\n private constructor() { }\r\n\r\n public static instance = new PopClipCommand();\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n exec.target.uniforms.branch.clipStack.pop();\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class PrimitiveCommand {\r\n public readonly opcode = \"drawPrimitive\";\r\n\r\n public constructor(public readonly primitive: Primitive) { }\r\n\r\n private static readonly _scratchTechniqueFlags = new TechniqueFlags();\r\n\r\n public execute(exec: ShaderProgramExecutor): void {\r\n if (exec.target.isGeometryOutsideActiveVolume(this.primitive.cachedGeometry))\r\n return;\r\n\r\n const techniqueId = this.primitive.techniqueId;\r\n if (TechniqueId.Invalid === techniqueId)\r\n return;\r\n\r\n const target = exec.target;\r\n const thematic = this.primitive.cachedGeometry.supportsThematicDisplay && target.wantThematicDisplay;\r\n const shadowable = (techniqueId === TechniqueId.Surface || techniqueId === TechniqueId.RealityMesh) && target.solarShadowMap.isReady && target.currentViewFlags.shadows && !thematic;\r\n const isShadowable = shadowable ? IsShadowable.Yes : IsShadowable.No;\r\n let isThematic = thematic ? IsThematic.Yes : IsThematic.No;\r\n const isClassified = (undefined !== target.currentPlanarClassifierOrDrape || undefined !== target.activeVolumeClassifierTexture) ? IsClassified.Yes : IsClassified.No;\r\n const isInstanced = this.primitive.isInstanced ? IsInstanced.Yes : IsInstanced.No;\r\n const isAnimated = this.primitive.hasAnimation ? IsAnimated.Yes : IsAnimated.No;\r\n\r\n // Point clouds do not support hillshade or slope mode for thematic display.\r\n if (isThematic && (undefined !== this.primitive.cachedGeometry.asPointCloud) && (target.uniforms.thematic.wantSlopeMode || target.uniforms.thematic.wantHillShadeMode))\r\n isThematic = IsThematic.No;\r\n\r\n const wiremesh = target.currentViewFlags.wiremesh && (techniqueId === TechniqueId.Surface || techniqueId === TechniqueId.RealityMesh);\r\n const isWiremesh = wiremesh ? IsWiremesh.Yes : IsWiremesh.No;\r\n const flags = PrimitiveCommand._scratchTechniqueFlags;\r\n const posType = this.primitive.cachedGeometry.usesQuantizedPositions ? \"quantized\" : \"unquantized\";\r\n flags.init(target, exec.renderPass, isInstanced, isAnimated, isClassified, isShadowable, isThematic, isWiremesh, posType);\r\n\r\n const technique = target.techniques.getTechnique(techniqueId);\r\n const program = technique.getShader(flags);\r\n\r\n if (exec.setProgram(program))\r\n exec.target.compositor.drawPrimitive(this.primitive, exec, program.outputsToPick);\r\n }\r\n\r\n public get hasFeatures(): boolean { return this.primitive.hasFeatures; }\r\n public get renderOrder(): RenderOrder { return this.primitive.renderOrder; }\r\n\r\n public getPass(target: Target): Pass {\r\n return this.primitive.getPass(target);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport type PushCommand = PushBranchCommand | PushBatchCommand | PushStateCommand | PushClipCommand;\r\n/** @internal */\r\nexport type PopCommand = PopBranchCommand | PopBatchCommand | PopClipCommand;\r\n/** @internal */\r\nexport type DrawCommand = PushCommand | PopCommand | PrimitiveCommand;\r\n\r\n/** For a single RenderPass, an ordered list of commands to be executed during that pass.\r\n * @internal\r\n */\r\nexport type DrawCommands = DrawCommand[];\r\n\r\n/** Extracts the commands for rendering the flashed classifier (if any) from the by-index set of volume classifier commands.\r\n * NB: Cmds will be sets of some pushes, a primitive, and then some pops (equal to number of pushes).\r\n * The primitive should be right in the middle of a set. We need to find the set which matches the flashID.\r\n * @internal\r\n */\r\nexport function extractFlashedVolumeClassifierCommands(flashedId: Id64String, cmds: DrawCommands, numCmdsPerClassifier: number): DrawCommands | undefined {\r\n if (!Id64.isValid(flashedId) || 0 === numCmdsPerClassifier)\r\n return undefined;\r\n\r\n const firstPrim = (numCmdsPerClassifier - 1) / 2;\r\n for (let i = firstPrim; i < cmds.length; i += numCmdsPerClassifier) {\r\n assert(\"drawPrimitive\" === cmds[i].opcode, \"Command list not configured as expected.\");\r\n const pc: PrimitiveCommand = cmds[i] as PrimitiveCommand;\r\n const surface = pc.primitive.cachedGeometry.asSurface;\r\n if (undefined !== surface && undefined !== surface.mesh.uniformFeatureId) {\r\n let j = i - 1;\r\n while (j >= 0 && \"pushBatch\" !== cmds[j].opcode) // Find batch for this primitive\r\n j--;\r\n if (j < 0)\r\n continue;\r\n\r\n const pushBatch = cmds[j] as PushBatchCommand;\r\n const elemId = pushBatch.batch.featureTable.findElementId(surface.mesh.uniformFeatureId);\r\n if (undefined !== elemId && elemId === flashedId) {\r\n return cmds.slice(i - firstPrim, i + firstPrim + 1);\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nconst scratchFeature = PackedFeature.create();\r\n\r\n/** @internal */\r\nexport function extractHilitedVolumeClassifierCommands(hilites: Hilites, cmds: DrawCommands): DrawCommands {\r\n // TODO: This could really be done at the time the HiliteClassification render pass commands are being generated\r\n // by just not putting the ones which are not hilited into the ClassificationHilite command list.\r\n const result: DrawCommand[] = [];\r\n\r\n let batch;\r\n for (const cmd of cmds) {\r\n switch (cmd.opcode) {\r\n case \"popBranch\":\r\n if (result.length > 0 && \"pushBranch\" === result[result.length - 1].opcode) {\r\n result.pop(); // remove empty push/pop pairs\r\n continue;\r\n }\r\n break;\r\n case \"popBatch\":\r\n batch = undefined;\r\n if (result.length > 0 && \"pushBatch\" === result[result.length - 1].opcode) {\r\n result.pop(); // remove empty push/pop pairs\r\n continue;\r\n }\r\n break;\r\n case \"pushBatch\":\r\n batch = cmd.batch;\r\n break;\r\n case \"drawPrimitive\":\r\n if (undefined !== batch) {\r\n // Skip any primitives that are not hilited.\r\n const surface = cmd.primitive.cachedGeometry.asSurface;\r\n if (undefined === surface || undefined === surface.mesh.uniformFeatureId)\r\n continue;\r\n\r\n const feature = batch.featureTable.getPackedFeature(surface.mesh.uniformFeatureId, scratchFeature);\r\n if (undefined === feature || !isFeatureHilited(feature, hilites, hilites.models.hasId(Id64.fromUint32PairObject(feature.modelId))))\r\n continue;\r\n\r\n break;\r\n }\r\n }\r\n\r\n result.push(cmd);\r\n }\r\n\r\n return result;\r\n}\r\n"]}
@@ -1,7 +1,7 @@
1
1
  /** @packageDocumentation
2
2
  * @module WebGL
3
3
  */
4
- import { PackedFeature, PackedFeatureTable } from "@itwin/core-common";
4
+ import { PackedFeature, RenderFeatureTable } from "@itwin/core-common";
5
5
  import { BatchOptions } from "../GraphicBuilder";
6
6
  import { WebGLDisposable } from "./Disposable";
7
7
  import { UniformHandle } from "./UniformHandle";
@@ -47,8 +47,8 @@ export declare class FeatureOverrides implements WebGLDisposable {
47
47
  static createFromTarget(target: Target, options: BatchOptions, cleanup: FeatureOverridesCleanup | undefined): FeatureOverrides;
48
48
  get isDisposed(): boolean;
49
49
  dispose(): void;
50
- initFromMap(map: PackedFeatureTable): void;
51
- update(features: PackedFeatureTable): void;
50
+ initFromMap(map: RenderFeatureTable): void;
51
+ update(features: RenderFeatureTable): void;
52
52
  bindLUTParams(uniform: UniformHandle): void;
53
53
  bindLUT(uniform: UniformHandle): void;
54
54
  bindUniformSymbologyFlags(uniform: UniformHandle): void;
@@ -1 +1 @@
1
- {"version":3,"file":"FeatureOverrides.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/FeatureOverrides.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAkC3C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,GAAG,OAAO,CAQ3G;AAED,gBAAgB;AAChB,oBAAY,uBAAuB,GAAG,MAAM,IAAI,CAAC;AAEjD,gBAAgB;AAChB,qBAAa,gBAAiB,YAAW,eAAe;IACtD,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,IAAI,CAAC,CAAkB;IAC/B,OAAO,CAAC,6BAA6B,CAAC,CAA6B;IACnE,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,mBAAmB,CAAoB;IAC/C,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,8BAA8B,CAAQ;IAC9C,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,sBAAsB,CAAqC;IACnE,OAAO,CAAC,QAAQ,CAAC,CAA0B;IAE3C,IAAW,aAAa,YAAkC;IAC1D,IAAW,SAAS,YAA8B;IAClD,IAAW,cAAc,YAAmC;IAC5D,IAAW,6BAA6B,YAAkD;IAC1F,IAAW,SAAS,YAA8B;IAClD,IAAW,UAAU,YAA+B;IAEpD,iBAAiB;IACjB,IAAW,OAAO,IAAI,UAAU,GAAG,SAAS,CAAiC;IAC7E,IAAW,UAAU,IAAI,MAAM,CAA8D;IAC7F,IAAW,SAAS,YAAmE;IAEvF,OAAO,CAAC,2BAA2B;IAuB5B,mBAAmB,IAAI,UAAU;IAOxC,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,gBAAgB;IAoHxB,OAAO,CAAC,uBAAuB;IA0D/B,OAAO,CAAC,aAAa;IA8BrB,OAAO;WAMO,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,uBAAuB,GAAG,SAAS;IAIlH,IAAW,UAAU,IAAI,OAAO,CAAoC;IAE7D,OAAO;IAQP,WAAW,CAAC,GAAG,EAAE,kBAAkB;IAcnC,MAAM,CAAC,QAAQ,EAAE,kBAAkB;IAuBnC,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAI3C,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAKrC,yBAAyB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;CAG/D"}
1
+ {"version":3,"file":"FeatureOverrides.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/FeatureOverrides.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAkC3C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,GAAG,OAAO,CAQ3G;AAED,gBAAgB;AAChB,oBAAY,uBAAuB,GAAG,MAAM,IAAI,CAAC;AAIjD,gBAAgB;AAChB,qBAAa,gBAAiB,YAAW,eAAe;IACtD,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,IAAI,CAAC,CAAkB;IAC/B,OAAO,CAAC,6BAA6B,CAAC,CAA6B;IACnE,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,mBAAmB,CAAoB;IAC/C,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,8BAA8B,CAAQ;IAC9C,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,sBAAsB,CAAqC;IACnE,OAAO,CAAC,QAAQ,CAAC,CAA0B;IAE3C,IAAW,aAAa,YAAkC;IAC1D,IAAW,SAAS,YAA8B;IAClD,IAAW,cAAc,YAAmC;IAC5D,IAAW,6BAA6B,YAAkD;IAC1F,IAAW,SAAS,YAA8B;IAClD,IAAW,UAAU,YAA+B;IAEpD,iBAAiB;IACjB,IAAW,OAAO,IAAI,UAAU,GAAG,SAAS,CAAiC;IAC7E,IAAW,UAAU,IAAI,MAAM,CAA8D;IAC7F,IAAW,SAAS,YAAmE;IAEvF,OAAO,CAAC,2BAA2B;IAuB5B,mBAAmB,IAAI,UAAU;IAOxC,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,gBAAgB;IA0HxB,OAAO,CAAC,uBAAuB;IA6C/B,OAAO,CAAC,aAAa;IA8BrB,OAAO;WAMO,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,uBAAuB,GAAG,SAAS;IAIlH,IAAW,UAAU,IAAI,OAAO,CAAoC;IAE7D,OAAO;IAQP,WAAW,CAAC,GAAG,EAAE,kBAAkB;IAcnC,MAAM,CAAC,QAAQ,EAAE,kBAAkB;IAuBnC,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAI3C,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAKrC,yBAAyB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;CAG/D"}
@@ -9,6 +9,7 @@
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.FeatureOverrides = exports.isFeatureHilited = void 0;
11
11
  const core_bentley_1 = require("@itwin/core-bentley");
12
+ const core_common_1 = require("@itwin/core-common");
12
13
  const DisplayParams_1 = require("../primitives/DisplayParams");
13
14
  const LineCode_1 = require("./LineCode");
14
15
  const GL_1 = require("./GL");
@@ -47,6 +48,7 @@ function isFeatureHilited(feature, hilites, isModelHilited) {
47
48
  return hilites.elements.hasPair(feature.elementId) || (isModelHilited && hilites.subcategories.hasPair(feature.subCategoryId));
48
49
  }
49
50
  exports.isFeatureHilited = isFeatureHilited;
51
+ const scratchPackedFeature = core_common_1.PackedFeature.createWithIndex();
50
52
  /** @internal */
51
53
  class FeatureOverrides {
52
54
  constructor(target, options, cleanup) {
@@ -125,8 +127,8 @@ class FeatureOverrides {
125
127
  const allowHilite = true !== this._options.noHilite;
126
128
  const allowFlash = true !== this._options.noFlash;
127
129
  const allowEmphasis = true !== this._options.noEmphasis;
128
- const modelIdParts = core_bentley_1.Id64.getUint32Pair(map.modelId);
129
- const isModelHilited = allowHilite && hilites.models.hasPair(modelIdParts);
130
+ let isModelHilited = false;
131
+ const prevModelId = { lower: -1, upper: -1 };
130
132
  this._anyOpaque = this._anyTranslucent = this._anyViewIndependentTranslucent = this._anyHilited = false;
131
133
  let nHidden = 0;
132
134
  let nOverridden = 0;
@@ -138,10 +140,15 @@ class FeatureOverrides {
138
140
  // [1]
139
141
  // RGB = rgb
140
142
  // A = alpha
141
- for (let i = 0; i < map.numFeatures; i++) {
142
- const feature = map.getPackedFeature(i);
143
+ for (const feature of map.iterable(scratchPackedFeature)) {
144
+ const i = feature.index;
143
145
  const dataIndex = i * 4 * 2;
144
- const app = this.target.currentBranch.getFeatureAppearance(ovr, feature.elementId.lower, feature.elementId.upper, feature.subCategoryId.lower, feature.subCategoryId.upper, feature.geometryClass, modelIdParts.lower, modelIdParts.upper, map.type, feature.animationNodeId);
146
+ if (prevModelId.lower !== feature.modelId.lower || prevModelId.upper !== feature.modelId.upper) {
147
+ prevModelId.lower = feature.modelId.lower;
148
+ prevModelId.upper = feature.modelId.upper;
149
+ isModelHilited = allowHilite && hilites.models.hasPair(feature.modelId);
150
+ }
151
+ const app = this.target.currentBranch.getFeatureAppearance(ovr, feature.elementId.lower, feature.elementId.upper, feature.subCategoryId.lower, feature.subCategoryId.upper, feature.geometryClass, feature.modelId.lower, feature.modelId.upper, map.type, feature.animationNodeId);
145
152
  // NB: If the appearance is fully transparent, then:
146
153
  // - For normal ("primary") models, getAppearance() returns undefined.
147
154
  // - For classifier models, getAppearance() returns the appearance, and classification shader will discard fully-transparent classified pixels.
@@ -220,37 +227,25 @@ class FeatureOverrides {
220
227
  }
221
228
  const allowFlash = true !== this._options.noFlash;
222
229
  const intersect = "intersection" === hilites.modelSubCategoryMode;
223
- let isModelHilited = false;
224
- if (!hilites.models.isEmpty) {
225
- const modelId = core_bentley_1.Id64.getUint32Pair(map.modelId);
226
- isModelHilited = hilites.models.hasPair(modelId);
227
- }
228
230
  this._anyOverridden = this._anyHilited = false;
229
- for (let i = 0; i < map.numFeatures; i++) {
230
- const dataIndex = i * 4 * 2;
231
+ for (const feature of map.iterable(scratchPackedFeature)) {
232
+ const dataIndex = feature.index * 4 * 2;
231
233
  const oldFlags = data.getOvrFlagsAtIndex(dataIndex);
232
234
  if (0 /* None */ !== (oldFlags & 1 /* Visibility */)) {
233
235
  // If it's invisible, none of the other flags matter. We can't flash it and don't want to hilite it.
234
236
  this._anyOverridden = true;
235
237
  continue;
236
238
  }
237
- let elemId;
239
+ const isModelHilited = hilites.models.hasPair(feature.modelId);
238
240
  let isHilited = isModelHilited && !intersect;
239
- if (!isHilited && !hilites.elements.isEmpty) {
240
- elemId = map.getElementIdPair(i);
241
- isHilited = hilites.elements.hasPair(elemId);
242
- }
243
- if (!isHilited && !hilites.subcategories.isEmpty) {
244
- if (isModelHilited || !intersect) {
245
- const subcat = map.getSubCategoryIdPair(i);
246
- isHilited = hilites.subcategories.hasPair(subcat);
247
- }
248
- }
241
+ if (!isHilited)
242
+ isHilited = hilites.elements.hasPair(feature.elementId);
243
+ if (!isHilited)
244
+ if (isModelHilited || !intersect)
245
+ isHilited = hilites.subcategories.hasPair(feature.subCategoryId);
249
246
  let isFlashed = false;
250
- if (flashed && allowFlash) {
251
- elemId = elemId ?? map.getElementIdPair(i);
252
- isFlashed = elemId.lower === flashed.lower && elemId.upper === flashed.upper;
253
- }
247
+ if (flashed && allowFlash)
248
+ isFlashed = feature.elementId.lower === flashed.lower && feature.elementId.upper === flashed.upper;
254
249
  let newFlags = isFlashed ? (oldFlags | 16 /* Flashed */) : (oldFlags & ~16 /* Flashed */);
255
250
  newFlags = isHilited ? (newFlags | 256 /* Hilited */) : (newFlags & ~256 /* Hilited */);
256
251
  data.setOvrFlagsAtIndex(dataIndex, newFlags);
@@ -265,6 +260,7 @@ class FeatureOverrides {
265
260
  if (true === this._options.noFlash)
266
261
  return;
267
262
  this._anyOverridden = false;
263
+ const elemId = { lower: 0, upper: 0 };
268
264
  for (let i = 0; i < map.numFeatures; i++) {
269
265
  const dataIndex = i * 4 * 2;
270
266
  const oldFlags = data.getOvrFlagsAtIndex(dataIndex);
@@ -275,7 +271,7 @@ class FeatureOverrides {
275
271
  }
276
272
  let isFlashed = false;
277
273
  if (flashed) {
278
- const elemId = map.getElementIdPair(i);
274
+ map.getElementIdPair(i, elemId);
279
275
  isFlashed = elemId.lower === flashed.lower && elemId.upper === flashed.upper;
280
276
  }
281
277
  const newFlags = isFlashed ? (oldFlags | 16 /* Flashed */) : (oldFlags & ~16 /* Flashed */);