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

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 (121) hide show
  1. package/lib/cjs/AccuSnap.d.ts.map +1 -1
  2. package/lib/cjs/AccuSnap.js +10 -5
  3. package/lib/cjs/AccuSnap.js.map +1 -1
  4. package/lib/cjs/DisplayStyleState.d.ts.map +1 -1
  5. package/lib/cjs/DisplayStyleState.js +2 -1
  6. package/lib/cjs/DisplayStyleState.js.map +1 -1
  7. package/lib/cjs/ElementLocateManager.d.ts.map +1 -1
  8. package/lib/cjs/ElementLocateManager.js +23 -1
  9. package/lib/cjs/ElementLocateManager.js.map +1 -1
  10. package/lib/cjs/HitDetail.d.ts +100 -29
  11. package/lib/cjs/HitDetail.d.ts.map +1 -1
  12. package/lib/cjs/HitDetail.js +88 -35
  13. package/lib/cjs/HitDetail.js.map +1 -1
  14. package/lib/cjs/SheetViewState.d.ts +6 -2
  15. package/lib/cjs/SheetViewState.d.ts.map +1 -1
  16. package/lib/cjs/SheetViewState.js +17 -0
  17. package/lib/cjs/SheetViewState.js.map +1 -1
  18. package/lib/cjs/SpatialViewState.d.ts +18 -3
  19. package/lib/cjs/SpatialViewState.d.ts.map +1 -1
  20. package/lib/cjs/SpatialViewState.js +11 -3
  21. package/lib/cjs/SpatialViewState.js.map +1 -1
  22. package/lib/cjs/TentativePoint.d.ts.map +1 -1
  23. package/lib/cjs/TentativePoint.js +10 -1
  24. package/lib/cjs/TentativePoint.js.map +1 -1
  25. package/lib/cjs/ViewCreator3d.d.ts.map +1 -1
  26. package/lib/cjs/ViewCreator3d.js +6 -3
  27. package/lib/cjs/ViewCreator3d.js.map +1 -1
  28. package/lib/cjs/ViewState.d.ts +8 -0
  29. package/lib/cjs/ViewState.d.ts.map +1 -1
  30. package/lib/cjs/ViewState.js +6 -0
  31. package/lib/cjs/ViewState.js.map +1 -1
  32. package/lib/cjs/Viewport.d.ts.map +1 -1
  33. package/lib/cjs/Viewport.js +5 -1
  34. package/lib/cjs/Viewport.js.map +1 -1
  35. package/lib/cjs/render/GraphicBranch.d.ts +4 -0
  36. package/lib/cjs/render/GraphicBranch.d.ts.map +1 -1
  37. package/lib/cjs/render/GraphicBranch.js.map +1 -1
  38. package/lib/cjs/render/Pixel.d.ts +5 -0
  39. package/lib/cjs/render/Pixel.d.ts.map +1 -1
  40. package/lib/cjs/render/Pixel.js +1 -0
  41. package/lib/cjs/render/Pixel.js.map +1 -1
  42. package/lib/cjs/render/primitives/mesh/MeshBuilder.d.ts.map +1 -1
  43. package/lib/cjs/render/primitives/mesh/MeshBuilder.js +4 -2
  44. package/lib/cjs/render/primitives/mesh/MeshBuilder.js.map +1 -1
  45. package/lib/cjs/render/primitives/mesh/MeshBuilderMap.d.ts.map +1 -1
  46. package/lib/cjs/render/primitives/mesh/MeshBuilderMap.js +4 -2
  47. package/lib/cjs/render/primitives/mesh/MeshBuilderMap.js.map +1 -1
  48. package/lib/cjs/render/webgl/BatchState.js +1 -1
  49. package/lib/cjs/render/webgl/BatchState.js.map +1 -1
  50. package/lib/cjs/render/webgl/BranchState.d.ts +3 -0
  51. package/lib/cjs/render/webgl/BranchState.d.ts.map +1 -1
  52. package/lib/cjs/render/webgl/BranchState.js +2 -0
  53. package/lib/cjs/render/webgl/BranchState.js.map +1 -1
  54. package/lib/cjs/render/webgl/Graphic.d.ts +7 -1
  55. package/lib/cjs/render/webgl/Graphic.d.ts.map +1 -1
  56. package/lib/cjs/render/webgl/Graphic.js +7 -2
  57. package/lib/cjs/render/webgl/Graphic.js.map +1 -1
  58. package/lib/cjs/render/webgl/SceneCompositor.d.ts.map +1 -1
  59. package/lib/cjs/render/webgl/SceneCompositor.js +4 -2
  60. package/lib/cjs/render/webgl/SceneCompositor.js.map +1 -1
  61. package/lib/esm/AccuSnap.d.ts.map +1 -1
  62. package/lib/esm/AccuSnap.js +10 -5
  63. package/lib/esm/AccuSnap.js.map +1 -1
  64. package/lib/esm/DisplayStyleState.d.ts.map +1 -1
  65. package/lib/esm/DisplayStyleState.js +2 -1
  66. package/lib/esm/DisplayStyleState.js.map +1 -1
  67. package/lib/esm/ElementLocateManager.d.ts.map +1 -1
  68. package/lib/esm/ElementLocateManager.js +23 -1
  69. package/lib/esm/ElementLocateManager.js.map +1 -1
  70. package/lib/esm/HitDetail.d.ts +100 -29
  71. package/lib/esm/HitDetail.d.ts.map +1 -1
  72. package/lib/esm/HitDetail.js +89 -36
  73. package/lib/esm/HitDetail.js.map +1 -1
  74. package/lib/esm/SheetViewState.d.ts +6 -2
  75. package/lib/esm/SheetViewState.d.ts.map +1 -1
  76. package/lib/esm/SheetViewState.js +17 -0
  77. package/lib/esm/SheetViewState.js.map +1 -1
  78. package/lib/esm/SpatialViewState.d.ts +18 -3
  79. package/lib/esm/SpatialViewState.d.ts.map +1 -1
  80. package/lib/esm/SpatialViewState.js +11 -3
  81. package/lib/esm/SpatialViewState.js.map +1 -1
  82. package/lib/esm/TentativePoint.d.ts.map +1 -1
  83. package/lib/esm/TentativePoint.js +10 -1
  84. package/lib/esm/TentativePoint.js.map +1 -1
  85. package/lib/esm/ViewCreator3d.d.ts.map +1 -1
  86. package/lib/esm/ViewCreator3d.js +6 -3
  87. package/lib/esm/ViewCreator3d.js.map +1 -1
  88. package/lib/esm/ViewState.d.ts +8 -0
  89. package/lib/esm/ViewState.d.ts.map +1 -1
  90. package/lib/esm/ViewState.js +6 -0
  91. package/lib/esm/ViewState.js.map +1 -1
  92. package/lib/esm/Viewport.d.ts.map +1 -1
  93. package/lib/esm/Viewport.js +5 -1
  94. package/lib/esm/Viewport.js.map +1 -1
  95. package/lib/esm/render/GraphicBranch.d.ts +4 -0
  96. package/lib/esm/render/GraphicBranch.d.ts.map +1 -1
  97. package/lib/esm/render/GraphicBranch.js.map +1 -1
  98. package/lib/esm/render/Pixel.d.ts +5 -0
  99. package/lib/esm/render/Pixel.d.ts.map +1 -1
  100. package/lib/esm/render/Pixel.js +1 -0
  101. package/lib/esm/render/Pixel.js.map +1 -1
  102. package/lib/esm/render/primitives/mesh/MeshBuilder.d.ts.map +1 -1
  103. package/lib/esm/render/primitives/mesh/MeshBuilder.js +4 -2
  104. package/lib/esm/render/primitives/mesh/MeshBuilder.js.map +1 -1
  105. package/lib/esm/render/primitives/mesh/MeshBuilderMap.d.ts.map +1 -1
  106. package/lib/esm/render/primitives/mesh/MeshBuilderMap.js +4 -2
  107. package/lib/esm/render/primitives/mesh/MeshBuilderMap.js.map +1 -1
  108. package/lib/esm/render/webgl/BatchState.js +1 -1
  109. package/lib/esm/render/webgl/BatchState.js.map +1 -1
  110. package/lib/esm/render/webgl/BranchState.d.ts +3 -0
  111. package/lib/esm/render/webgl/BranchState.d.ts.map +1 -1
  112. package/lib/esm/render/webgl/BranchState.js +2 -0
  113. package/lib/esm/render/webgl/BranchState.js.map +1 -1
  114. package/lib/esm/render/webgl/Graphic.d.ts +7 -1
  115. package/lib/esm/render/webgl/Graphic.d.ts.map +1 -1
  116. package/lib/esm/render/webgl/Graphic.js +7 -2
  117. package/lib/esm/render/webgl/Graphic.js.map +1 -1
  118. package/lib/esm/render/webgl/SceneCompositor.d.ts.map +1 -1
  119. package/lib/esm/render/webgl/SceneCompositor.js +4 -2
  120. package/lib/esm/render/webgl/SceneCompositor.js.map +1 -1
  121. package/package.json +18 -18
@@ -98,6 +98,10 @@ export interface GraphicBranchOptions {
98
98
  appearanceProvider?: FeatureAppearanceProvider;
99
99
  /** @internal Secondary planar classifiers (map layers) */
100
100
  secondaryClassifiers?: Map<number, RenderPlanarClassifier>;
101
+ /** The Id of the [ViewAttachment]($backend) from which this branch's graphics originated.
102
+ * @internal
103
+ */
104
+ viewAttachmentId?: Id64String;
101
105
  }
102
106
  /** Clip/Transform for a branch that are varied over time.
103
107
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"GraphicBranch.d.ts","sourceRoot":"","sources":["../../../src/render/GraphicBranch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GraphicBranch.d.ts","sourceRoot":"","sources":["../../../src/render/GraphicBranch.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"GraphicBranch.js","sourceRoot":"","sources":["../../../src/render/GraphicBranch.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 { disposeArray, Id64String, IDisposable } from \"@itwin/core-bentley\";\r\nimport {\r\n FeatureAppearanceProvider, HiddenLine, RealityModelDisplaySettings, RenderSchedule, ViewFlagOverrides, ViewFlags,\r\n} from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"../IModelConnection\";\r\nimport { IModelApp } from \"../IModelApp\";\r\nimport { FeatureSymbology } from \"./FeatureSymbology\";\r\nimport { RenderClipVolume } from \"./RenderClipVolume\";\r\nimport { RenderGraphic } from \"./RenderGraphic\";\r\nimport { RenderMemory } from \"./RenderMemory\";\r\nimport { RenderPlanarClassifier } from \"./RenderPlanarClassifier\";\r\nimport { RenderTextureDrape } from \"./RenderSystem\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { AnimationNodeId } from \"../common/render/AnimationNodeId\";\r\n\r\n/** Carries information in a GraphicBranchOptions about a GraphicBranch produced by drawing one view into the context of another.\r\n * @internal\r\n */\r\nexport interface GraphicBranchFrustum {\r\n is3d: boolean;\r\n scale: {\r\n x: number;\r\n y: number;\r\n };\r\n}\r\n\r\n/**\r\n * A node in a scene graph. The branch itself is not renderable. Instead it contains a list of RenderGraphics,\r\n * and a transform, symbology overrides, and clip volume which are to be applied when rendering them.\r\n * Branches can be nested to build an arbitrarily-complex scene graph.\r\n * @see [[RenderSystem.createBranch]]\r\n * @public\r\n * @extensions\r\n */\r\nexport class GraphicBranch implements IDisposable /* , RenderMemory.Consumer */ {\r\n /** The child nodes of this branch */\r\n public readonly entries: RenderGraphic[] = [];\r\n /** If true, when the branch is disposed of, the RenderGraphics in its entries array will also be disposed */\r\n public readonly ownsEntries: boolean;\r\n /** Selectively overrides the view's [ViewFlags]($common) while drawing graphics within this branch. The default overrides nothing.\r\n * @see [[setViewFlagOverrides]].\r\n */\r\n public viewFlagOverrides: ViewFlagOverrides = {};\r\n /** Controls how reality models are displayed within this branch.\r\n * @beta\r\n */\r\n public realityModelDisplaySettings?: RealityModelDisplaySettings;\r\n /** @internal */\r\n public realityModelRange?: Range3d;\r\n /** Optional symbology overrides to be applied to all graphics in this branch */\r\n public symbologyOverrides?: FeatureSymbology.Overrides;\r\n /** Optional animation branch Id that incorporates the model Id and, for element timelines, the batch Id.\r\n * @internal\r\n */\r\n public animationId?: string;\r\n /** Identifies the node in the [RenderSchedule.Script]($backend) with which this branch is associated.\r\n * @internal\r\n */\r\n public animationNodeId?: AnimationNodeId | number;\r\n\r\n /** Constructor\r\n * @param ownsEntries If true, when this branch is [[dispose]]d, all of the [[RenderGraphic]]s it contains will also be disposed.\r\n */\r\n public constructor(ownsEntries: boolean = false) {\r\n this.ownsEntries = ownsEntries;\r\n }\r\n\r\n /** Add a graphic to this branch. */\r\n public add(graphic: RenderGraphic): void {\r\n this.entries.push(graphic);\r\n }\r\n\r\n /** Compute the view flags that result from applying this branch's [[viewFlagOverrides]] to the input flags.\r\n * @param flags The input view flags, e.g., from the view's [[DisplayStyleState]].\r\n * @returns The result of applying [[viewFlagOverrides]] to `flags`.\r\n */\r\n public getViewFlags(flags: ViewFlags): ViewFlags {\r\n return flags.override(this.viewFlagOverrides);\r\n }\r\n\r\n /** Set [[viewFlagOverrides]] to override **all** ViewFlags as specified by `flags`. */\r\n public setViewFlags(flags: ViewFlags): void {\r\n this.viewFlagOverrides = { ...flags };\r\n }\r\n\r\n /** Change [[viewFlagOverrides]]. */\r\n public setViewFlagOverrides(ovr: ViewFlagOverrides): void {\r\n this.viewFlagOverrides = { ...ovr };\r\n }\r\n\r\n /** Disposes of all graphics in this branch, if and only if [[ownsEntries]] is true. */\r\n public dispose() {\r\n this.clear();\r\n }\r\n\r\n /** Returns true if this branch contains no graphics. */\r\n public get isEmpty(): boolean {\r\n return 0 === this.entries.length;\r\n }\r\n\r\n /** Empties the list of [[RenderGraphic]]s contained in this branch, and if the [[ownsEntries]] flag is set, also disposes of them. */\r\n public clear(): void {\r\n if (this.ownsEntries)\r\n disposeArray(this.entries);\r\n else\r\n this.entries.length = 0;\r\n }\r\n\r\n /** @internal */\r\n public collectStatistics(stats: RenderMemory.Statistics): void {\r\n for (const entry of this.entries)\r\n entry.collectStatistics(stats);\r\n }\r\n}\r\n\r\n/** Options passed to [[RenderSystem.createGraphicBranch]].\r\n * @public\r\n * @extensions\r\n */\r\nexport interface GraphicBranchOptions {\r\n /** Clip applied to the graphics in the branch. */\r\n clipVolume?: RenderClipVolume;\r\n /** @internal */\r\n classifierOrDrape?: RenderPlanarClassifier | RenderTextureDrape;\r\n /** Optionally replaces the view's hidden line settings when drawing the branch. */\r\n hline?: HiddenLine.Settings;\r\n /** The iModel from which the graphics originate, if different than that associated with the view. */\r\n iModel?: IModelConnection;\r\n /** @internal */\r\n frustum?: GraphicBranchFrustum;\r\n /** Supplements the view's [[FeatureSymbology.Overrides]] for graphics in the branch. */\r\n appearanceProvider?: FeatureAppearanceProvider;\r\n /** @internal Secondary planar classifiers (map layers) */\r\n secondaryClassifiers?: Map<number, RenderPlanarClassifier>;\r\n}\r\n\r\n/** Clip/Transform for a branch that are varied over time.\r\n * @internal\r\n */\r\nexport interface AnimationBranchState {\r\n readonly clip?: RenderClipVolume;\r\n readonly omit?: boolean;\r\n}\r\n\r\n/** @internal */\r\nexport function formatAnimationBranchId(modelId: Id64String, branchId: number): string {\r\n if (branchId < 0)\r\n return modelId;\r\n\r\n return `${modelId}_Node_${branchId.toString()}`;\r\n}\r\n\r\nfunction addAnimationBranch(modelId: Id64String, timeline: RenderSchedule.Timeline, branchId: number, branches: Map<string, AnimationBranchState>, time: number): void {\r\n const clipVector = timeline.getClipVector(time);\r\n const clip = clipVector ? IModelApp.renderSystem.createClipVolume(clipVector) : undefined;\r\n if (clip)\r\n branches.set(formatAnimationBranchId(modelId, branchId), { clip });\r\n}\r\n\r\n/** Mapping from node/branch IDs to animation branch state\r\n * @internal\r\n */\r\nexport interface AnimationBranchStates {\r\n /** Maps node Id to branch state. */\r\n readonly branchStates: Map<string, AnimationBranchState>;\r\n /** Ids of nodes that apply a transform. */\r\n readonly transformNodeIds: ReadonlySet<number>;\r\n}\r\n\r\n/** @internal */\r\nexport namespace AnimationBranchStates {\r\n export function fromScript(script: RenderSchedule.Script, time: number): AnimationBranchStates | undefined {\r\n if (!script.containsModelClipping && !script.requiresBatching)\r\n return undefined;\r\n\r\n const branches = new Map<string, AnimationBranchState>();\r\n for (const model of script.modelTimelines) {\r\n addAnimationBranch(model.modelId, model, -1, branches, time);\r\n for (const elem of model.elementTimelines) {\r\n if (elem.getVisibility(time) <= 0)\r\n branches.set(formatAnimationBranchId(model.modelId, elem.batchId), { omit: true });\r\n else\r\n addAnimationBranch(model.modelId, elem, elem.batchId, branches, time);\r\n }\r\n }\r\n\r\n return {\r\n branchStates: branches,\r\n transformNodeIds: script.transformBatchIds,\r\n };\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"GraphicBranch.js","sourceRoot":"","sources":["../../../src/render/GraphicBranch.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 { disposeArray, Id64String, IDisposable } from \"@itwin/core-bentley\";\r\nimport {\r\n FeatureAppearanceProvider, HiddenLine, RealityModelDisplaySettings, RenderSchedule, ViewFlagOverrides, ViewFlags,\r\n} from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"../IModelConnection\";\r\nimport { IModelApp } from \"../IModelApp\";\r\nimport { FeatureSymbology } from \"./FeatureSymbology\";\r\nimport { RenderClipVolume } from \"./RenderClipVolume\";\r\nimport { RenderGraphic } from \"./RenderGraphic\";\r\nimport { RenderMemory } from \"./RenderMemory\";\r\nimport { RenderPlanarClassifier } from \"./RenderPlanarClassifier\";\r\nimport { RenderTextureDrape } from \"./RenderSystem\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { AnimationNodeId } from \"../common/render/AnimationNodeId\";\r\n\r\n/** Carries information in a GraphicBranchOptions about a GraphicBranch produced by drawing one view into the context of another.\r\n * @internal\r\n */\r\nexport interface GraphicBranchFrustum {\r\n is3d: boolean;\r\n scale: {\r\n x: number;\r\n y: number;\r\n };\r\n}\r\n\r\n/**\r\n * A node in a scene graph. The branch itself is not renderable. Instead it contains a list of RenderGraphics,\r\n * and a transform, symbology overrides, and clip volume which are to be applied when rendering them.\r\n * Branches can be nested to build an arbitrarily-complex scene graph.\r\n * @see [[RenderSystem.createBranch]]\r\n * @public\r\n * @extensions\r\n */\r\nexport class GraphicBranch implements IDisposable /* , RenderMemory.Consumer */ {\r\n /** The child nodes of this branch */\r\n public readonly entries: RenderGraphic[] = [];\r\n /** If true, when the branch is disposed of, the RenderGraphics in its entries array will also be disposed */\r\n public readonly ownsEntries: boolean;\r\n /** Selectively overrides the view's [ViewFlags]($common) while drawing graphics within this branch. The default overrides nothing.\r\n * @see [[setViewFlagOverrides]].\r\n */\r\n public viewFlagOverrides: ViewFlagOverrides = {};\r\n /** Controls how reality models are displayed within this branch.\r\n * @beta\r\n */\r\n public realityModelDisplaySettings?: RealityModelDisplaySettings;\r\n /** @internal */\r\n public realityModelRange?: Range3d;\r\n /** Optional symbology overrides to be applied to all graphics in this branch */\r\n public symbologyOverrides?: FeatureSymbology.Overrides;\r\n /** Optional animation branch Id that incorporates the model Id and, for element timelines, the batch Id.\r\n * @internal\r\n */\r\n public animationId?: string;\r\n /** Identifies the node in the [RenderSchedule.Script]($backend) with which this branch is associated.\r\n * @internal\r\n */\r\n public animationNodeId?: AnimationNodeId | number;\r\n\r\n /** Constructor\r\n * @param ownsEntries If true, when this branch is [[dispose]]d, all of the [[RenderGraphic]]s it contains will also be disposed.\r\n */\r\n public constructor(ownsEntries: boolean = false) {\r\n this.ownsEntries = ownsEntries;\r\n }\r\n\r\n /** Add a graphic to this branch. */\r\n public add(graphic: RenderGraphic): void {\r\n this.entries.push(graphic);\r\n }\r\n\r\n /** Compute the view flags that result from applying this branch's [[viewFlagOverrides]] to the input flags.\r\n * @param flags The input view flags, e.g., from the view's [[DisplayStyleState]].\r\n * @returns The result of applying [[viewFlagOverrides]] to `flags`.\r\n */\r\n public getViewFlags(flags: ViewFlags): ViewFlags {\r\n return flags.override(this.viewFlagOverrides);\r\n }\r\n\r\n /** Set [[viewFlagOverrides]] to override **all** ViewFlags as specified by `flags`. */\r\n public setViewFlags(flags: ViewFlags): void {\r\n this.viewFlagOverrides = { ...flags };\r\n }\r\n\r\n /** Change [[viewFlagOverrides]]. */\r\n public setViewFlagOverrides(ovr: ViewFlagOverrides): void {\r\n this.viewFlagOverrides = { ...ovr };\r\n }\r\n\r\n /** Disposes of all graphics in this branch, if and only if [[ownsEntries]] is true. */\r\n public dispose() {\r\n this.clear();\r\n }\r\n\r\n /** Returns true if this branch contains no graphics. */\r\n public get isEmpty(): boolean {\r\n return 0 === this.entries.length;\r\n }\r\n\r\n /** Empties the list of [[RenderGraphic]]s contained in this branch, and if the [[ownsEntries]] flag is set, also disposes of them. */\r\n public clear(): void {\r\n if (this.ownsEntries)\r\n disposeArray(this.entries);\r\n else\r\n this.entries.length = 0;\r\n }\r\n\r\n /** @internal */\r\n public collectStatistics(stats: RenderMemory.Statistics): void {\r\n for (const entry of this.entries)\r\n entry.collectStatistics(stats);\r\n }\r\n}\r\n\r\n/** Options passed to [[RenderSystem.createGraphicBranch]].\r\n * @public\r\n * @extensions\r\n */\r\nexport interface GraphicBranchOptions {\r\n /** Clip applied to the graphics in the branch. */\r\n clipVolume?: RenderClipVolume;\r\n /** @internal */\r\n classifierOrDrape?: RenderPlanarClassifier | RenderTextureDrape;\r\n /** Optionally replaces the view's hidden line settings when drawing the branch. */\r\n hline?: HiddenLine.Settings;\r\n /** The iModel from which the graphics originate, if different than that associated with the view. */\r\n iModel?: IModelConnection;\r\n /** @internal */\r\n frustum?: GraphicBranchFrustum;\r\n /** Supplements the view's [[FeatureSymbology.Overrides]] for graphics in the branch. */\r\n appearanceProvider?: FeatureAppearanceProvider;\r\n /** @internal Secondary planar classifiers (map layers) */\r\n secondaryClassifiers?: Map<number, RenderPlanarClassifier>;\r\n /** The Id of the [ViewAttachment]($backend) from which this branch's graphics originated.\r\n * @internal\r\n */\r\n viewAttachmentId?: Id64String;\r\n}\r\n\r\n/** Clip/Transform for a branch that are varied over time.\r\n * @internal\r\n */\r\nexport interface AnimationBranchState {\r\n readonly clip?: RenderClipVolume;\r\n readonly omit?: boolean;\r\n}\r\n\r\n/** @internal */\r\nexport function formatAnimationBranchId(modelId: Id64String, branchId: number): string {\r\n if (branchId < 0)\r\n return modelId;\r\n\r\n return `${modelId}_Node_${branchId.toString()}`;\r\n}\r\n\r\nfunction addAnimationBranch(modelId: Id64String, timeline: RenderSchedule.Timeline, branchId: number, branches: Map<string, AnimationBranchState>, time: number): void {\r\n const clipVector = timeline.getClipVector(time);\r\n const clip = clipVector ? IModelApp.renderSystem.createClipVolume(clipVector) : undefined;\r\n if (clip)\r\n branches.set(formatAnimationBranchId(modelId, branchId), { clip });\r\n}\r\n\r\n/** Mapping from node/branch IDs to animation branch state\r\n * @internal\r\n */\r\nexport interface AnimationBranchStates {\r\n /** Maps node Id to branch state. */\r\n readonly branchStates: Map<string, AnimationBranchState>;\r\n /** Ids of nodes that apply a transform. */\r\n readonly transformNodeIds: ReadonlySet<number>;\r\n}\r\n\r\n/** @internal */\r\nexport namespace AnimationBranchStates {\r\n export function fromScript(script: RenderSchedule.Script, time: number): AnimationBranchStates | undefined {\r\n if (!script.containsModelClipping && !script.requiresBatching)\r\n return undefined;\r\n\r\n const branches = new Map<string, AnimationBranchState>();\r\n for (const model of script.modelTimelines) {\r\n addAnimationBranch(model.modelId, model, -1, branches, time);\r\n for (const elem of model.elementTimelines) {\r\n if (elem.getVisibility(time) <= 0)\r\n branches.set(formatAnimationBranchId(model.modelId, elem.batchId), { omit: true });\r\n else\r\n addAnimationBranch(model.modelId, elem, elem.batchId, branches, time);\r\n }\r\n }\r\n\r\n return {\r\n branchStates: branches,\r\n transformNodeIds: script.transformBatchIds,\r\n };\r\n }\r\n}\r\n"]}
@@ -27,6 +27,10 @@ export declare namespace Pixel {
27
27
  readonly iModel?: IModelConnection;
28
28
  /** @internal */
29
29
  readonly tileId?: string;
30
+ /** The Id of the [ViewAttachment]($backend), if any, from which the pixel originated.
31
+ * @beta
32
+ */
33
+ readonly viewAttachmentId?: Id64String;
30
34
  /** @internal */
31
35
  get isClassifier(): boolean;
32
36
  /** @internal */
@@ -38,6 +42,7 @@ export declare namespace Pixel {
38
42
  batchType?: BatchType;
39
43
  iModel?: IModelConnection;
40
44
  tileId?: string;
45
+ viewAttachmentId?: string;
41
46
  });
42
47
  /** The Id of the element that produced the pixel. */
43
48
  get elementId(): Id64String | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"Pixel.d.ts","sourceRoot":"","sources":["../../../src/render/Pixel.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;GAIG;AACH,yBAAiB,KAAK,CAAC;IACrB,0DAA0D;IAC1D,MAAa,IAAI;QACf,2CAA2C;QAC3C,SAAgB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClC,SAAgB,OAAO,CAAC,EAAE,UAAU,CAAC;QACrC,sHAAsH;QACtH,SAAgB,gBAAgB,EAAE,MAAM,CAAC;QACzC,oDAAoD;QACpD,SAAgB,IAAI,EAAE,YAAY,CAAC;QACnC,6DAA6D;QAC7D,SAAgB,SAAS,EAAE,SAAS,CAAC;QACrC,gBAAgB;QAChB,SAAgB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtC,yEAAyE;QACzE,SAAgB,MAAM,CAAC,EAAE,gBAAgB,CAAC;QAC1C,gBAAgB;QAChB,SAAgB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChC,gBAAgB;QAChB,IAAW,YAAY,IAAI,OAAO,CAEjC;QAED,gBAAgB;oBACG,IAAI,CAAC,EAAE;YACxB,OAAO,CAAC,EAAE,YAAY,CAAC;YACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;YAC1B,IAAI,CAAC,EAAE,YAAY,CAAC;YACpB,SAAS,CAAC,EAAE,SAAS,CAAC;YACtB,SAAS,CAAC,EAAE,SAAS,CAAC;YACtB,MAAM,CAAC,EAAE,gBAAgB,CAAC;YAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB;QAYD,qDAAqD;QACrD,IAAW,SAAS,IAAI,UAAU,GAAG,SAAS,CAE7C;QAED,qEAAqE;QACrE,IAAW,aAAa,IAAI,UAAU,GAAG,SAAS,CAEjD;QAED,qDAAqD;QACrD,IAAW,aAAa,IAAI,aAAa,GAAG,SAAS,CAEpD;KACF;IAED,uEAAuE;IACvE,KAAY,YAAY;QACtB,qGAAqG;QACrG,OAAO,IAAA;QACP,8CAA8C;QAC9C,IAAI,IAAA;QACJ,qCAAqC;QACrC,OAAO,IAAA;QACP,yDAAyD;QACzD,MAAM,IAAA;QACN,uDAAuD;QACvD,IAAI,IAAA;QACJ,wEAAwE;QACxE,UAAU,IAAA;KACX;IAED,iFAAiF;IACjF,KAAY,SAAS;QACnB,0GAA0G;QAC1G,OAAO,IAAA;QACP,8CAA8C;QAC9C,IAAI,IAAA;QACJ,2CAA2C;QAC3C,MAAM,IAAA;QACN,+CAA+C;QAC/C,SAAS,IAAA;KACV;IAED;;;OAGG;IACH,KAAY,QAAQ;QAClB,IAAI,IAAI;QACR,wDAAwD;QACxD,OAAO,IAAS;QAChB,mJAAmJ;QACnJ,mBAAmB,IAAS;QAC5B,wCAAwC;QACxC,GAAG,IAAgC;KACpC;IAED;;;OAGG;IACH,UAAiB,MAAM;QACrB,gFAAgF;QAChF,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACtC;IAED;;OAEG;IACH,KAAY,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CAC7D"}
1
+ {"version":3,"file":"Pixel.d.ts","sourceRoot":"","sources":["../../../src/render/Pixel.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;GAIG;AACH,yBAAiB,KAAK,CAAC;IACrB,0DAA0D;IAC1D,MAAa,IAAI;QACf,2CAA2C;QAC3C,SAAgB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClC,SAAgB,OAAO,CAAC,EAAE,UAAU,CAAC;QACrC,sHAAsH;QACtH,SAAgB,gBAAgB,EAAE,MAAM,CAAC;QACzC,oDAAoD;QACpD,SAAgB,IAAI,EAAE,YAAY,CAAC;QACnC,6DAA6D;QAC7D,SAAgB,SAAS,EAAE,SAAS,CAAC;QACrC,gBAAgB;QAChB,SAAgB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtC,yEAAyE;QACzE,SAAgB,MAAM,CAAC,EAAE,gBAAgB,CAAC;QAC1C,gBAAgB;QAChB,SAAgB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChC;;WAEG;QACH,SAAgB,gBAAgB,CAAC,EAAE,UAAU,CAAC;QAC9C,gBAAgB;QAChB,IAAW,YAAY,IAAI,OAAO,CAEjC;QAED,gBAAgB;oBACG,IAAI,CAAC,EAAE;YACxB,OAAO,CAAC,EAAE,YAAY,CAAC;YACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;YAC1B,IAAI,CAAC,EAAE,YAAY,CAAC;YACpB,SAAS,CAAC,EAAE,SAAS,CAAC;YACtB,SAAS,CAAC,EAAE,SAAS,CAAC;YACtB,MAAM,CAAC,EAAE,gBAAgB,CAAC;YAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;SAC3B;QAaD,qDAAqD;QACrD,IAAW,SAAS,IAAI,UAAU,GAAG,SAAS,CAE7C;QAED,qEAAqE;QACrE,IAAW,aAAa,IAAI,UAAU,GAAG,SAAS,CAEjD;QAED,qDAAqD;QACrD,IAAW,aAAa,IAAI,aAAa,GAAG,SAAS,CAEpD;KACF;IAED,uEAAuE;IACvE,KAAY,YAAY;QACtB,qGAAqG;QACrG,OAAO,IAAA;QACP,8CAA8C;QAC9C,IAAI,IAAA;QACJ,qCAAqC;QACrC,OAAO,IAAA;QACP,yDAAyD;QACzD,MAAM,IAAA;QACN,uDAAuD;QACvD,IAAI,IAAA;QACJ,wEAAwE;QACxE,UAAU,IAAA;KACX;IAED,iFAAiF;IACjF,KAAY,SAAS;QACnB,0GAA0G;QAC1G,OAAO,IAAA;QACP,8CAA8C;QAC9C,IAAI,IAAA;QACJ,2CAA2C;QAC3C,MAAM,IAAA;QACN,+CAA+C;QAC/C,SAAS,IAAA;KACV;IAED;;;OAGG;IACH,KAAY,QAAQ;QAClB,IAAI,IAAI;QACR,wDAAwD;QACxD,OAAO,IAAS;QAChB,mJAAmJ;QACnJ,mBAAmB,IAAS;QAC5B,wCAAwC;QACxC,GAAG,IAAgC;KACpC;IAED;;;OAGG;IACH,UAAiB,MAAM;QACrB,gFAAgF;QAChF,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACtC;IAED;;OAEG;IACH,KAAY,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CAC7D"}
@@ -32,6 +32,7 @@ var Pixel;
32
32
  this.planarity = args?.planarity ?? Planarity.Unknown;
33
33
  this.iModel = args?.iModel;
34
34
  this.tileId = args?.tileId;
35
+ this.viewAttachmentId = args?.viewAttachmentId;
35
36
  }
36
37
  /** The Id of the element that produced the pixel. */
37
38
  get elementId() {
@@ -1 +1 @@
1
- {"version":3,"file":"Pixel.js","sourceRoot":"","sources":["../../../src/render/Pixel.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAGH,oDAAqF;AAGrF;;;;GAIG;AACH,IAAiB,KAAK,CAmHrB;AAnHD,WAAiB,KAAK;IACpB,0DAA0D;IAC1D,MAAa,IAAI;QAgBf,gBAAgB;QAChB,IAAW,YAAY;YACrB,OAAO,SAAS,KAAK,IAAI,CAAC,SAAS,IAAI,uBAAS,CAAC,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC;QAC9E,CAAC;QAED,gBAAgB;QAChB,YAAmB,IAQlB;YACC,IAAI,IAAI,EAAE,OAAO;gBACf,IAAI,CAAC,OAAO,GAAG,IAAI,qBAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAE7G,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC;YACtC,IAAI,CAAC,gBAAgB,GAAG,IAAI,EAAE,gBAAgB,IAAI,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,YAAY,CAAC,OAAO,CAAC;YAC/C,IAAI,CAAC,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,SAAS,CAAC,OAAO,CAAC;YACtD,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC;YAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC;QAC7B,CAAC;QAED,qDAAqD;QACrD,IAAW,SAAS;YAClB,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;QACjC,CAAC;QAED,qEAAqE;QACrE,IAAW,aAAa;YACtB,OAAO,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;QACrC,CAAC;QAED,qDAAqD;QACrD,IAAW,aAAa;YACtB,OAAO,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;QACrC,CAAC;KACF;IAxDY,UAAI,OAwDhB,CAAA;IAED,uEAAuE;IACvE,IAAY,YAaX;IAbD,WAAY,YAAY;QACtB,qGAAqG;QACrG,qDAAO,CAAA;QACP,8CAA8C;QAC9C,+CAAI,CAAA;QACJ,qCAAqC;QACrC,qDAAO,CAAA;QACP,yDAAyD;QACzD,mDAAM,CAAA;QACN,uDAAuD;QACvD,+CAAI,CAAA;QACJ,wEAAwE;QACxE,2DAAU,CAAA;IACZ,CAAC,EAbW,YAAY,GAAZ,kBAAY,KAAZ,kBAAY,QAavB;IAED,iFAAiF;IACjF,IAAY,SASX;IATD,WAAY,SAAS;QACnB,0GAA0G;QAC1G,+CAAO,CAAA;QACP,8CAA8C;QAC9C,yCAAI,CAAA;QACJ,2CAA2C;QAC3C,6CAAM,CAAA;QACN,+CAA+C;QAC/C,mDAAS,CAAA;IACX,CAAC,EATW,SAAS,GAAT,eAAS,KAAT,eAAS,QASpB;IAED;;;OAGG;IACH,IAAY,QAQX;IARD,WAAY,QAAQ;QAClB,uCAAQ,CAAA;QACR,wDAAwD;QACxD,6CAAgB,CAAA;QAChB,mJAAmJ;QACnJ,qEAA4B,CAAA;QAC5B,wCAAwC;QACxC,qCAAmC,CAAA;IACrC,CAAC,EARW,QAAQ,GAAR,cAAQ,KAAR,cAAQ,QAQnB;AAeH,CAAC,EAnHgB,KAAK,GAAL,aAAK,KAAL,aAAK,QAmHrB","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 { Id64String } from \"@itwin/core-bentley\";\r\nimport { BatchType, Feature, GeometryClass, ModelFeature } from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"../IModelConnection\";\r\n\r\n/** Describes aspects of a pixel as read from a [[Viewport]].\r\n * @see [[Viewport.readPixels]].\r\n * @public\r\n * @extensions\r\n */\r\nexport namespace Pixel {\r\n /** Describes a single pixel within a [[Pixel.Buffer]]. */\r\n export class Data {\r\n /** The feature that produced the pixel. */\r\n public readonly feature?: Feature;\r\n public readonly modelId?: Id64String;\r\n /** The pixel's depth in [[CoordSystem.Npc]] coordinates (0 to 1), or -1 if depth was not written or not requested. */\r\n public readonly distanceFraction: number;\r\n /** The type of geometry that produced the pixel. */\r\n public readonly type: GeometryType;\r\n /** The planarity of the geometry that produced the pixel. */\r\n public readonly planarity: Planarity;\r\n /** @internal */\r\n public readonly batchType?: BatchType;\r\n /** The iModel from which the geometry producing the pixel originated. */\r\n public readonly iModel?: IModelConnection;\r\n /** @internal */\r\n public readonly tileId?: string;\r\n /** @internal */\r\n public get isClassifier(): boolean {\r\n return undefined !== this.batchType && BatchType.Primary !== this.batchType;\r\n }\r\n\r\n /** @internal */\r\n public constructor(args?: {\r\n feature?: ModelFeature;\r\n distanceFraction?: number;\r\n type?: GeometryType;\r\n planarity?: Planarity;\r\n batchType?: BatchType;\r\n iModel?: IModelConnection;\r\n tileId?: string;\r\n }) {\r\n if (args?.feature)\r\n this.feature = new Feature(args.feature.elementId, args.feature.subCategoryId, args.feature.geometryClass);\r\n\r\n this.modelId = args?.feature?.modelId;\r\n this.distanceFraction = args?.distanceFraction ?? -1;\r\n this.type = args?.type ?? GeometryType.Unknown;\r\n this.planarity = args?.planarity ?? Planarity.Unknown;\r\n this.iModel = args?.iModel;\r\n this.tileId = args?.tileId;\r\n }\r\n\r\n /** The Id of the element that produced the pixel. */\r\n public get elementId(): Id64String | undefined {\r\n return this.feature?.elementId;\r\n }\r\n\r\n /** The Id of the [SubCategory]($backend) that produced the pixel. */\r\n public get subCategoryId(): Id64String | undefined {\r\n return this.feature?.subCategoryId;\r\n }\r\n\r\n /** The class of geometry that produced the pixel. */\r\n public get geometryClass(): GeometryClass | undefined {\r\n return this.feature?.geometryClass;\r\n }\r\n }\r\n\r\n /** Describes the type of geometry that produced the [[Pixel.Data]]. */\r\n export enum GeometryType {\r\n /** [[Pixel.Selector.GeometryAndDistance]] was not specified, or the type could not be determined. */\r\n Unknown, // Geometry was not selected, or type could not be determined\r\n /** No geometry was rendered to this pixel. */\r\n None,\r\n /** A surface produced this pixel. */\r\n Surface,\r\n /** A point primitive or polyline produced this pixel. */\r\n Linear,\r\n /** This pixel was produced by an edge of a surface. */\r\n Edge,\r\n /** This pixel was produced by a silhouette edge of a curved surface. */\r\n Silhouette,\r\n }\r\n\r\n /** Describes the planarity of the foremost geometry which produced the pixel. */\r\n export enum Planarity {\r\n /** [[Pixel.Selector.GeometryAndDistance]] was not specified, or the planarity could not be determined. */\r\n Unknown,\r\n /** No geometry was rendered to this pixel. */\r\n None,\r\n /** Planar geometry produced this pixel. */\r\n Planar,\r\n /** Non-planar geometry produced this pixel. */\r\n NonPlanar,\r\n }\r\n\r\n /**\r\n * Bit-mask by which callers of [[Viewport.readPixels]] specify which aspects are of interest.\r\n * Aspects not specified will be omitted from the returned data.\r\n */\r\n export enum Selector {\r\n None = 0,\r\n /** Select the [[Feature]] which produced each pixel. */\r\n Feature = 1 << 0, // eslint-disable-line @typescript-eslint/no-shadow\r\n /** Select the type and planarity of geometry which produced each pixel as well as the fraction of its distance between the near and far planes. */\r\n GeometryAndDistance = 1 << 2,\r\n /** Select all aspects of each pixel. */\r\n All = GeometryAndDistance | Feature,\r\n }\r\n\r\n /** A rectangular array of pixels as read from a [[Viewport]]'s frame buffer. Each pixel is represented as a [[Pixel.Data]] object.\r\n * The contents of the pixel buffer will be specified using device pixels, not CSS pixels. See [[Viewport.devicePixelRatio]] and [[Viewport.cssPixelsToDevicePixels]].\r\n * @see [[Viewport.readPixels]].\r\n */\r\n export interface Buffer {\r\n /** Retrieve the data associated with the pixel at (x,y) in view coordinates. */\r\n getPixel(x: number, y: number): Data;\r\n }\r\n\r\n /** A function which receives the results of a call to [[Viewport.readPixels]].\r\n * @note The contents of the buffer become invalid once the Receiver function returns. Do not store a reference to it.\r\n */\r\n export type Receiver = (pixels: Buffer | undefined) => void;\r\n}\r\n"]}
1
+ {"version":3,"file":"Pixel.js","sourceRoot":"","sources":["../../../src/render/Pixel.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAGH,oDAAqF;AAGrF;;;;GAIG;AACH,IAAiB,KAAK,CAyHrB;AAzHD,WAAiB,KAAK;IACpB,0DAA0D;IAC1D,MAAa,IAAI;QAoBf,gBAAgB;QAChB,IAAW,YAAY;YACrB,OAAO,SAAS,KAAK,IAAI,CAAC,SAAS,IAAI,uBAAS,CAAC,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC;QAC9E,CAAC;QAED,gBAAgB;QAChB,YAAmB,IASlB;YACC,IAAI,IAAI,EAAE,OAAO;gBACf,IAAI,CAAC,OAAO,GAAG,IAAI,qBAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAE7G,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC;YACtC,IAAI,CAAC,gBAAgB,GAAG,IAAI,EAAE,gBAAgB,IAAI,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,YAAY,CAAC,OAAO,CAAC;YAC/C,IAAI,CAAC,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,SAAS,CAAC,OAAO,CAAC;YACtD,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC;YAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC;YAC3B,IAAI,CAAC,gBAAgB,GAAG,IAAI,EAAE,gBAAgB,CAAC;QACjD,CAAC;QAED,qDAAqD;QACrD,IAAW,SAAS;YAClB,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;QACjC,CAAC;QAED,qEAAqE;QACrE,IAAW,aAAa;YACtB,OAAO,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;QACrC,CAAC;QAED,qDAAqD;QACrD,IAAW,aAAa;YACtB,OAAO,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;QACrC,CAAC;KACF;IA9DY,UAAI,OA8DhB,CAAA;IAED,uEAAuE;IACvE,IAAY,YAaX;IAbD,WAAY,YAAY;QACtB,qGAAqG;QACrG,qDAAO,CAAA;QACP,8CAA8C;QAC9C,+CAAI,CAAA;QACJ,qCAAqC;QACrC,qDAAO,CAAA;QACP,yDAAyD;QACzD,mDAAM,CAAA;QACN,uDAAuD;QACvD,+CAAI,CAAA;QACJ,wEAAwE;QACxE,2DAAU,CAAA;IACZ,CAAC,EAbW,YAAY,GAAZ,kBAAY,KAAZ,kBAAY,QAavB;IAED,iFAAiF;IACjF,IAAY,SASX;IATD,WAAY,SAAS;QACnB,0GAA0G;QAC1G,+CAAO,CAAA;QACP,8CAA8C;QAC9C,yCAAI,CAAA;QACJ,2CAA2C;QAC3C,6CAAM,CAAA;QACN,+CAA+C;QAC/C,mDAAS,CAAA;IACX,CAAC,EATW,SAAS,GAAT,eAAS,KAAT,eAAS,QASpB;IAED;;;OAGG;IACH,IAAY,QAQX;IARD,WAAY,QAAQ;QAClB,uCAAQ,CAAA;QACR,wDAAwD;QACxD,6CAAgB,CAAA;QAChB,mJAAmJ;QACnJ,qEAA4B,CAAA;QAC5B,wCAAwC;QACxC,qCAAmC,CAAA;IACrC,CAAC,EARW,QAAQ,GAAR,cAAQ,KAAR,cAAQ,QAQnB;AAeH,CAAC,EAzHgB,KAAK,GAAL,aAAK,KAAL,aAAK,QAyHrB","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 { Id64String } from \"@itwin/core-bentley\";\r\nimport { BatchType, Feature, GeometryClass, ModelFeature } from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"../IModelConnection\";\r\n\r\n/** Describes aspects of a pixel as read from a [[Viewport]].\r\n * @see [[Viewport.readPixels]].\r\n * @public\r\n * @extensions\r\n */\r\nexport namespace Pixel {\r\n /** Describes a single pixel within a [[Pixel.Buffer]]. */\r\n export class Data {\r\n /** The feature that produced the pixel. */\r\n public readonly feature?: Feature;\r\n public readonly modelId?: Id64String;\r\n /** The pixel's depth in [[CoordSystem.Npc]] coordinates (0 to 1), or -1 if depth was not written or not requested. */\r\n public readonly distanceFraction: number;\r\n /** The type of geometry that produced the pixel. */\r\n public readonly type: GeometryType;\r\n /** The planarity of the geometry that produced the pixel. */\r\n public readonly planarity: Planarity;\r\n /** @internal */\r\n public readonly batchType?: BatchType;\r\n /** The iModel from which the geometry producing the pixel originated. */\r\n public readonly iModel?: IModelConnection;\r\n /** @internal */\r\n public readonly tileId?: string;\r\n /** The Id of the [ViewAttachment]($backend), if any, from which the pixel originated.\r\n * @beta\r\n */\r\n public readonly viewAttachmentId?: Id64String;\r\n /** @internal */\r\n public get isClassifier(): boolean {\r\n return undefined !== this.batchType && BatchType.Primary !== this.batchType;\r\n }\r\n\r\n /** @internal */\r\n public constructor(args?: {\r\n feature?: ModelFeature;\r\n distanceFraction?: number;\r\n type?: GeometryType;\r\n planarity?: Planarity;\r\n batchType?: BatchType;\r\n iModel?: IModelConnection;\r\n tileId?: string;\r\n viewAttachmentId?: string;\r\n }) {\r\n if (args?.feature)\r\n this.feature = new Feature(args.feature.elementId, args.feature.subCategoryId, args.feature.geometryClass);\r\n\r\n this.modelId = args?.feature?.modelId;\r\n this.distanceFraction = args?.distanceFraction ?? -1;\r\n this.type = args?.type ?? GeometryType.Unknown;\r\n this.planarity = args?.planarity ?? Planarity.Unknown;\r\n this.iModel = args?.iModel;\r\n this.tileId = args?.tileId;\r\n this.viewAttachmentId = args?.viewAttachmentId;\r\n }\r\n\r\n /** The Id of the element that produced the pixel. */\r\n public get elementId(): Id64String | undefined {\r\n return this.feature?.elementId;\r\n }\r\n\r\n /** The Id of the [SubCategory]($backend) that produced the pixel. */\r\n public get subCategoryId(): Id64String | undefined {\r\n return this.feature?.subCategoryId;\r\n }\r\n\r\n /** The class of geometry that produced the pixel. */\r\n public get geometryClass(): GeometryClass | undefined {\r\n return this.feature?.geometryClass;\r\n }\r\n }\r\n\r\n /** Describes the type of geometry that produced the [[Pixel.Data]]. */\r\n export enum GeometryType {\r\n /** [[Pixel.Selector.GeometryAndDistance]] was not specified, or the type could not be determined. */\r\n Unknown, // Geometry was not selected, or type could not be determined\r\n /** No geometry was rendered to this pixel. */\r\n None,\r\n /** A surface produced this pixel. */\r\n Surface,\r\n /** A point primitive or polyline produced this pixel. */\r\n Linear,\r\n /** This pixel was produced by an edge of a surface. */\r\n Edge,\r\n /** This pixel was produced by a silhouette edge of a curved surface. */\r\n Silhouette,\r\n }\r\n\r\n /** Describes the planarity of the foremost geometry which produced the pixel. */\r\n export enum Planarity {\r\n /** [[Pixel.Selector.GeometryAndDistance]] was not specified, or the planarity could not be determined. */\r\n Unknown,\r\n /** No geometry was rendered to this pixel. */\r\n None,\r\n /** Planar geometry produced this pixel. */\r\n Planar,\r\n /** Non-planar geometry produced this pixel. */\r\n NonPlanar,\r\n }\r\n\r\n /**\r\n * Bit-mask by which callers of [[Viewport.readPixels]] specify which aspects are of interest.\r\n * Aspects not specified will be omitted from the returned data.\r\n */\r\n export enum Selector {\r\n None = 0,\r\n /** Select the [[Feature]] which produced each pixel. */\r\n Feature = 1 << 0, // eslint-disable-line @typescript-eslint/no-shadow\r\n /** Select the type and planarity of geometry which produced each pixel as well as the fraction of its distance between the near and far planes. */\r\n GeometryAndDistance = 1 << 2,\r\n /** Select all aspects of each pixel. */\r\n All = GeometryAndDistance | Feature,\r\n }\r\n\r\n /** A rectangular array of pixels as read from a [[Viewport]]'s frame buffer. Each pixel is represented as a [[Pixel.Data]] object.\r\n * The contents of the pixel buffer will be specified using device pixels, not CSS pixels. See [[Viewport.devicePixelRatio]] and [[Viewport.cssPixelsToDevicePixels]].\r\n * @see [[Viewport.readPixels]].\r\n */\r\n export interface Buffer {\r\n /** Retrieve the data associated with the pixel at (x,y) in view coordinates. */\r\n getPixel(x: number, y: number): Data;\r\n }\r\n\r\n /** A function which receives the results of a call to [[Viewport.readPixels]].\r\n * @note The contents of the buffer become invalid once the Receiver function returns. Do not store a reference to it.\r\n */\r\n export type Receiver = (pixels: Buffer | undefined) => void;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MeshBuilder.d.ts","sourceRoot":"","sources":["../../../../../src/render/primitives/mesh/MeshBuilder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MeshBuilder.d.ts","sourceRoot":"","sources":["../../../../../src/render/primitives/mesh/MeshBuilder.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAS,eAAe,EAAW,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAY,MAAM,sBAAsB,CAAC;AAC9H,OAAO,EAAE,OAAO,EAA2F,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACtJ,OAAO,EAAE,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAe,WAAW,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAa,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,KAAK,uBAAuB,GAAG,cAAc,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,gBAAgB;AAChB,qBAAa,WAAW;IACtB,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,OAAO,CAAC,YAAY,CAAC,CAAc;IACnC,OAAO,CAAC,gBAAgB,CAAC,CAAsB;IAC/C,SAAgB,IAAI,EAAE,IAAI,CAAC;IAC3B,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,aAAa,EAAE,MAAM,CAAC;IACtC,SAAgB,SAAS,EAAE,OAAO,CAAC;IACnC,IAAW,eAAe,IAAI,mBAAmB,GAAG,SAAS,CAAkC;IAC/F,IAAW,aAAa,CAAC,MAAM,EAAE,aAAa,EAAuC;IAErF,iDAAiD;IACjD,IAAW,WAAW,IAAI,WAAW,CAKpC;IAED,OAAO;IAkBP,+BAA+B;WACjB,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW;IAM3D;;;;;OAKG;IACI,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI;IAS3I;;;;OAIG;IACI,eAAe,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,CAAC,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI;IAWzH;;;OAGG;IACI,sBAAsB,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,CAAC,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI;IAyB1H,sBAAsB,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,CAAC,sBAAsB,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,uBAAuB,EAAE,GAAG,SAAS;IAmCzL,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,CAAC,sBAAsB,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS;IAuCvK,8BAA8B;IACvB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI;IAU5F,8BAA8B;IACvB,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI;IAUxF,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAOzE,WAAW,IAAI,IAAI;IASnB,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,iBAAiB,UAAO,GAAG,MAAM;IAMnE,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;CAS7C;AAED,gBAAgB;AAChB,yBAAiB,WAAW,CAAC;IAC3B,UAAiB,KAAM,SAAQ,IAAI,CAAC,KAAK;QACvC,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACvB;IACD,UAAiB,eAAe;QAC9B,aAAa,EAAE,OAAO,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,cAAc,CAAC;QAC/B,WAAW,EAAE,uBAAuB,CAAC;KACtC;IAED,UAAiB,sBAAuB,SAAQ,eAAe;QAC7D,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,OAAO,CAAC;KACpB;CACF;AAED,gBAAgB;AAChB,qBAAa,uBAAuB;IAClC,SAAgB,IAAI,EAAE,uBAAuB,CAAC,IAAI,CAAC;IACnD,SAAgB,cAAc,SAAiC;IAC/D,IAAW,gBAAgB,IAAI,OAAO,CAAgE;IACtG,IAAW,eAAe,IAAI,OAAO,CAA+D;IACpG,IAAW,mBAAmB,IAAI,OAAO,CAAyE;IAClH,sEAAsE;IACtE,IAAW,gBAAgB,IAAI,OAAO,CAA0E;gBACpG,IAAI,+BAAuC;CACxD;AAED,gBAAgB;AAChB,yBAAiB,uBAAuB,CAAC;IACvC,KAAY,IAAI;QACd,OAAO,IAAS;QAChB,WAAW,IAAc;QACzB,WAAW,IAAc;QACzB,YAAY,IAAc;QAC1B,YAAY,IAAc;QAC1B,QAAQ,IAA4B;KACrC;CACF;AAED,gBAAgB;AAChB,qBAAa,mBAAmB;IAC9B,SAAgB,QAAQ,EAAE,QAAQ,CAAC;IACnC,SAAgB,WAAW,EAAE,uBAAuB,CAAC;IACrD,SAAgB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAA6B;IAChF,SAAgB,iBAAiB,EAAE,MAAM,CAAC;gBAC9B,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM;CAKhG"}
@@ -188,8 +188,10 @@ class MeshBuilder {
188
188
  return this.vertexMap.insertKey(vertex, addToMeshOnInsert ? onInsert : undefined);
189
189
  }
190
190
  addTriangle(triangle) {
191
- // Prefer to avoid adding vertices originating from degenerate triangles before we get here...
192
- (0, core_bentley_1.assert)(!triangle.isDegenerate);
191
+ // Attempt to avoid adding vertices originating from degenerate triangles before we get here.
192
+ // Removed assert and just return if degenerate at this point because uncommon cases (not worth testing for) can still occur.
193
+ if (triangle.isDegenerate)
194
+ return;
193
195
  const onInsert = (_vk) => this.mesh.addTriangle(triangle);
194
196
  this.triangleSet.insertKey(triangle, onInsert);
195
197
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MeshBuilder.js","sourceRoot":"","sources":["../../../../../src/render/primitives/mesh/MeshBuilder.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, Dictionary } from \"@itwin/core-bentley\";\r\nimport { Angle, IndexedPolyface, Point2d, Point3d, Polyface, PolyfaceVisitor, Range3d, Vector3d } from \"@itwin/core-geometry\";\r\nimport { Feature, MeshEdge, MeshEdges, MeshPolyline, OctEncodedNormal, OctEncodedNormalPair, QPoint3dList, TextureMapping } from \"@itwin/core-common\";\r\nimport { DisplayParams } from \"../../../common/render/primitives/DisplayParams\";\r\nimport { Triangle, TriangleKey, TriangleSet } from \"../Primitives\";\r\nimport { StrokesPrimitivePointLists } from \"../Strokes\";\r\nimport { VertexKey, VertexKeyProps, VertexMap } from \"../VertexKey\";\r\nimport { Mesh } from \"./MeshPrimitives\";\r\n\r\n// Describes a vertex along with the index of the source vertex in the source PolyfaceVisitor.\r\ntype VertexKeyPropsWithIndex = VertexKeyProps & { sourceIndex: number };\r\n\r\n/** @internal */\r\nexport class MeshBuilder {\r\n public readonly vertexMap: VertexMap;\r\n private _triangleSet?: TriangleSet;\r\n private _currentPolyface?: MeshBuilderPolyface;\r\n public readonly mesh: Mesh;\r\n public readonly tolerance: number;\r\n public readonly areaTolerance: number;\r\n public readonly tileRange: Range3d;\r\n public get currentPolyface(): MeshBuilderPolyface | undefined { return this._currentPolyface; }\r\n public set displayParams(params: DisplayParams) { this.mesh.displayParams = params; }\r\n\r\n /** create reference for triangleSet on demand */\r\n public get triangleSet(): TriangleSet {\r\n if (undefined === this._triangleSet)\r\n this._triangleSet = new TriangleSet();\r\n\r\n return this._triangleSet;\r\n }\r\n\r\n private constructor(mesh: Mesh, tolerance: number, areaTolerance: number, tileRange: Range3d) {\r\n this.mesh = mesh;\r\n this.tolerance = tolerance;\r\n this.areaTolerance = areaTolerance;\r\n this.tileRange = tileRange;\r\n\r\n let vertexTolerance;\r\n if (mesh.points instanceof QPoint3dList) {\r\n const p0 = mesh.points.params.unquantize(0, 0, 0);\r\n const p1 = mesh.points.params.unquantize(1, 1, 1);\r\n vertexTolerance = p1.minus(p0, p0);\r\n } else {\r\n vertexTolerance = { x: tolerance, y: tolerance, z: tolerance };\r\n }\r\n\r\n this.vertexMap = new VertexMap(vertexTolerance);\r\n }\r\n\r\n /** create a new MeshBuilder */\r\n public static create(props: MeshBuilder.Props): MeshBuilder {\r\n const mesh = Mesh.create(props);\r\n const { tolerance, areaTolerance, range } = props;\r\n return new MeshBuilder(mesh, tolerance, areaTolerance, range);\r\n }\r\n\r\n /**\r\n * iterate through each point list of the strokes primitive and either load the point string or polyline into builder\r\n * @param strokes lists of stroke primitive point lists to iterate\r\n * @param isDisjoint if true add point string, else add polyline\r\n * @param fillColor\r\n */\r\n public addStrokePointLists(strokes: StrokesPrimitivePointLists, isDisjoint: boolean, fillColor: number, feature: Feature | undefined): void {\r\n for (const strokePoints of strokes) {\r\n if (isDisjoint)\r\n this.addPointString(strokePoints.points, fillColor, feature);\r\n else\r\n this.addPolyline(strokePoints.points, fillColor, feature);\r\n }\r\n }\r\n\r\n /**\r\n * add data from polyface into mesh builder\r\n * @param polyface the indexed polyface to iterate the facets of to load each facet's triangles' vertices\r\n * @param props the properties required for this operation\r\n */\r\n public addFromPolyface(polyface: IndexedPolyface, props: MeshBuilder.PolyfaceOptions, feature: Feature | undefined): void {\r\n this.beginPolyface(polyface, props.edgeOptions);\r\n const visitor = polyface.createVisitor();\r\n\r\n while (visitor.moveToNextFacet()) {\r\n this.addFromPolyfaceVisitor(visitor, props, feature);\r\n }\r\n\r\n this.endPolyface();\r\n }\r\n\r\n /**\r\n * @param visitor the PolyfaceVisitor containing the face data to be added\r\n * @param props the properties required for this operation:\r\n */\r\n public addFromPolyfaceVisitor(visitor: PolyfaceVisitor, options: MeshBuilder.PolyfaceOptions, feature: Feature | undefined): void {\r\n const { pointCount, normalCount, paramCount, requireNormals } = visitor;\r\n const { includeParams, mappedTexture } = options;\r\n\r\n const isDegenerate = requireNormals && normalCount < pointCount; // TFS#790263: Degenerate triangle - no normals.\r\n\r\n // a triangle must have at least 3 points\r\n if (pointCount < 3 || isDegenerate)\r\n return;\r\n\r\n const haveParam = includeParams && paramCount > 0;\r\n const triangleCount = pointCount - 2;\r\n\r\n assert(!includeParams || paramCount > 0);\r\n assert(!haveParam || undefined !== mappedTexture);\r\n\r\n // The face represented by this visitor should be convex (we request that in facet options) - so we do a simple fan triangulation.\r\n const polyfaceVisitorOptions = { ...options, triangleCount, haveParam };\r\n for (let triangleIndex = 0; triangleIndex < triangleCount; triangleIndex++) {\r\n const triangle = this.createTriangle(triangleIndex, visitor, polyfaceVisitorOptions, feature);\r\n if (undefined !== triangle)\r\n this.addTriangle(triangle);\r\n }\r\n }\r\n\r\n public createTriangleVertices(triangleIndex: number, visitor: PolyfaceVisitor, options: MeshBuilder.PolyfaceVisitorOptions, feature: Feature | undefined): VertexKeyPropsWithIndex[] | undefined {\r\n const { point, requireNormals } = visitor;\r\n const { fillColor, haveParam } = options;\r\n\r\n // If we do not have UVParams stored on the IndexedPolyface, compute them now\r\n let params: Point2d[] | undefined;\r\n if (haveParam && options.mappedTexture) {\r\n assert(this.mesh.points.length === 0 || this.mesh.uvParams.length !== 0);\r\n const mappedTexture = options.mappedTexture;\r\n const transformToImodel = mappedTexture.params.textureMatrix.transform;\r\n if (transformToImodel)\r\n params = mappedTexture.computeUVParams(visitor, transformToImodel);\r\n assert(params !== undefined);\r\n }\r\n\r\n const vertices = [];\r\n for (let i = 0; i < 3; ++i) {\r\n const vertexIndex = 0 === i ? 0 : triangleIndex + i;\r\n const position = point.getPoint3dAtUncheckedPointIndex(vertexIndex);\r\n const normal = requireNormals ? OctEncodedNormal.fromVector(visitor.getNormal(vertexIndex)!) : undefined;\r\n const uvParam: Point2d | undefined = params ? params[vertexIndex] : undefined;\r\n vertices[i] = { position, fillColor, normal, uvParam, sourceIndex: vertexIndex, feature };\r\n }\r\n\r\n // Previously we would add all 3 vertices to our map, then detect degenerate triangles in AddTriangle().\r\n // This led to unused vertex data, and caused mismatch in # of vertices when recreating the MeshBuilder from the data in the tile cache.\r\n // Detect beforehand instead.\r\n if (this.vertexMap.arePositionsAlmostEqual(vertices[0], vertices[1])\r\n || this.vertexMap.arePositionsAlmostEqual(vertices[0], vertices[2])\r\n || this.vertexMap.arePositionsAlmostEqual(vertices[1], vertices[2]))\r\n return undefined;\r\n\r\n return vertices;\r\n }\r\n\r\n public createTriangle(triangleIndex: number, visitor: PolyfaceVisitor, options: MeshBuilder.PolyfaceVisitorOptions, feature: Feature | undefined): Triangle | undefined {\r\n // generate vertex key properties for each of the three sides of the triangle\r\n const vertices = this.createTriangleVertices(triangleIndex, visitor, options, feature);\r\n\r\n // avoid creating degenerate triangles\r\n if (undefined === vertices)\r\n return undefined;\r\n\r\n const { edgeVisible } = visitor;\r\n\r\n const triangle = new Triangle();\r\n\r\n triangle.setEdgeVisibility(\r\n 0 === triangleIndex ? edgeVisible[0] : false,\r\n edgeVisible[triangleIndex + 1],\r\n triangleIndex === options.triangleCount - 1 ? edgeVisible[triangleIndex + 2] : false,\r\n );\r\n\r\n // set each triangle index to the index associated with the vertex key location in the vertex map\r\n vertices.forEach((vertexProps, i: number) => {\r\n let vertexKeyIndex;\r\n if (visitor.auxData) {\r\n // No deduplication with auxData (for now...)\r\n vertexKeyIndex = this.mesh.addVertex(vertexProps);\r\n this.mesh.addAuxChannels(visitor.auxData.channels, vertexProps.sourceIndex);\r\n } else {\r\n vertexKeyIndex = this.addVertex(vertexProps);\r\n }\r\n\r\n triangle.indices[i] = vertexKeyIndex;\r\n\r\n // if the current polyface exists, map the vertex key index to the visitor's client point index\r\n if (this.currentPolyface !== undefined)\r\n this.currentPolyface.vertexIndexMap.set(vertexKeyIndex, visitor.clientPointIndex(vertexProps.sourceIndex));\r\n });\r\n\r\n return triangle;\r\n }\r\n\r\n /** removed Feature for now */\r\n public addPolyline(points: Point3d[], fillColor: number, feature: Feature | undefined): void {\r\n const { mesh } = this;\r\n\r\n const poly = new MeshPolyline();\r\n for (const position of points)\r\n poly.addIndex(this.addVertex({ position, fillColor, feature }));\r\n\r\n mesh.addPolyline(poly);\r\n }\r\n\r\n /** removed Feature for now */\r\n public addPointString(points: Point3d[], fillColor: number, feature: Feature | undefined): void {\r\n const { mesh } = this;\r\n const poly = new MeshPolyline();\r\n\r\n for (const position of points)\r\n poly.addIndex(this.addVertex({ position, fillColor, feature }));\r\n\r\n mesh.addPolyline(poly);\r\n }\r\n\r\n public beginPolyface(polyface: Polyface, options: MeshEdgeCreationOptions): void {\r\n if (!options.generateNoEdges) {\r\n const triangles = this.mesh.triangles;\r\n this._currentPolyface = new MeshBuilderPolyface(polyface, options, triangles === undefined ? 0 : triangles.length);\r\n }\r\n }\r\n\r\n public endPolyface(): void {\r\n const { currentPolyface, mesh } = this;\r\n if (undefined === currentPolyface)\r\n return;\r\n\r\n this._currentPolyface = undefined;\r\n buildMeshEdges(mesh, currentPolyface);\r\n }\r\n\r\n public addVertex(vertex: VertexKeyProps, addToMeshOnInsert = true): number {\r\n // if vertex key isn't duplicate, then also insert properties into mesh\r\n const onInsert = (vk: VertexKey) => this.mesh.addVertex(vk);\r\n return this.vertexMap.insertKey(vertex, addToMeshOnInsert ? onInsert : undefined);\r\n }\r\n\r\n public addTriangle(triangle: Triangle): void {\r\n // Prefer to avoid adding vertices originating from degenerate triangles before we get here...\r\n assert(!triangle.isDegenerate);\r\n\r\n const onInsert = (_vk: TriangleKey) => this.mesh.addTriangle(triangle);\r\n this.triangleSet.insertKey(triangle, onInsert);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport namespace MeshBuilder { // eslint-disable-line no-redeclare\r\n export interface Props extends Mesh.Props {\r\n tolerance: number;\r\n areaTolerance: number;\r\n }\r\n export interface PolyfaceOptions {\r\n includeParams: boolean;\r\n fillColor: number;\r\n mappedTexture?: TextureMapping;\r\n edgeOptions: MeshEdgeCreationOptions;\r\n }\r\n\r\n export interface PolyfaceVisitorOptions extends PolyfaceOptions {\r\n triangleCount: number;\r\n haveParam: boolean;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class MeshEdgeCreationOptions {\r\n public readonly type: MeshEdgeCreationOptions.Type;\r\n public readonly minCreaseAngle = 20.0 * Angle.radiansPerDegree;\r\n public get generateAllEdges(): boolean { return this.type === MeshEdgeCreationOptions.Type.AllEdges; }\r\n public get generateNoEdges(): boolean { return this.type === MeshEdgeCreationOptions.Type.NoEdges; }\r\n public get generateCreaseEdges(): boolean { return 0 !== (this.type & MeshEdgeCreationOptions.Type.CreaseEdges); }\r\n /** Create edge chains for polyfaces that do not already have them. */\r\n public get createEdgeChains(): boolean { return 0 !== (this.type & MeshEdgeCreationOptions.Type.CreateChains); }\r\n constructor(type = MeshEdgeCreationOptions.Type.NoEdges) { this.type = type; }\r\n}\r\n\r\n/** @internal */\r\nexport namespace MeshEdgeCreationOptions { // eslint-disable-line no-redeclare\r\n export enum Type {\r\n NoEdges = 0x0000,\r\n CreaseEdges = 0x0001 << 1,\r\n SmoothEdges = 0x0001 << 2,\r\n CreateChains = 0x0001 << 3,\r\n DefaultEdges = CreaseEdges,\r\n AllEdges = CreaseEdges | SmoothEdges,\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class MeshBuilderPolyface {\r\n public readonly polyface: Polyface;\r\n public readonly edgeOptions: MeshEdgeCreationOptions;\r\n public readonly vertexIndexMap: Map<number, number> = new Map<number, number>();\r\n public readonly baseTriangleIndex: number;\r\n constructor(polyface: Polyface, edgeOptions: MeshEdgeCreationOptions, baseTriangleIndex: number) {\r\n this.polyface = polyface;\r\n this.edgeOptions = edgeOptions;\r\n this.baseTriangleIndex = baseTriangleIndex;\r\n }\r\n}\r\n\r\nclass EdgeInfo {\r\n public faceIndex1?: number;\r\n\r\n public constructor(\r\n public visible: boolean,\r\n public faceIndex0: number,\r\n public edge: MeshEdge,\r\n public point0: Point3d,\r\n public point1: Point3d) {\r\n }\r\n\r\n public addFace(visible: boolean, faceIndex: number) {\r\n if (undefined === this.faceIndex1) {\r\n this.visible ||= visible;\r\n this.faceIndex1 = faceIndex;\r\n }\r\n }\r\n}\r\n\r\nfunction buildMeshEdges(mesh: Mesh, polyface: MeshBuilderPolyface): void {\r\n if (!mesh.triangles)\r\n return;\r\n\r\n const edgeMap = new Dictionary<MeshEdge, EdgeInfo>((lhs, rhs) => lhs.compareTo(rhs));\r\n const triangleNormals: Vector3d[] = [];\r\n\r\n // We need to detect the edge pairs -- Can't do that from the Mesh indices as these are not shared - so we'll\r\n // assume that the polyface indices are properly shared, this should be true as a seperate index array is used\r\n // for Polyfaces.\r\n const triangle = new Triangle();\r\n const polyfacePoints = [new Point3d(), new Point3d(), new Point3d()];\r\n const polyfaceIndices = [0, 0, 0];\r\n\r\n for (let triangleIndex = polyface.baseTriangleIndex; triangleIndex < mesh.triangles.length; triangleIndex++) {\r\n let indexNotFound = false;\r\n mesh.triangles.getTriangle(triangleIndex, triangle);\r\n for (let j = 0; j < 3; j++) {\r\n const foundPolyfaceIndex = polyface.vertexIndexMap.get(triangle.indices[j]);\r\n assert(undefined !== foundPolyfaceIndex);\r\n if (undefined === foundPolyfaceIndex) {\r\n indexNotFound = true;\r\n continue;\r\n }\r\n\r\n polyfaceIndices[j] = foundPolyfaceIndex;\r\n polyface.polyface.data.getPoint(foundPolyfaceIndex, polyfacePoints[j]);\r\n }\r\n\r\n if (indexNotFound)\r\n continue;\r\n\r\n for (let j = 0; j < 3; j++) {\r\n const jNext = (j + 1) % 3;\r\n const triangleNormalIndex = triangleNormals.length;\r\n const meshEdge = new MeshEdge(triangle.indices[j], triangle.indices[jNext]);\r\n const polyfaceEdge = new MeshEdge(polyfaceIndices[j], polyfaceIndices[jNext]);\r\n const edgeInfo = new EdgeInfo(triangle.isEdgeVisible(j), triangleNormalIndex, meshEdge, polyfacePoints[j], polyfacePoints[jNext]);\r\n\r\n const findOrInsert = edgeMap.findOrInsert(polyfaceEdge, edgeInfo);\r\n if (!findOrInsert.inserted)\r\n findOrInsert.value.addFace(edgeInfo.visible, triangleNormalIndex);\r\n }\r\n\r\n const normal = Vector3d.createCrossProductToPoints(polyfacePoints[0], polyfacePoints[1], polyfacePoints[2]);\r\n normal.normalizeInPlace();\r\n triangleNormals.push(normal);\r\n }\r\n\r\n // If there is no visibility indication in the mesh, infer from the mesh geometry.\r\n if (!polyface.edgeOptions.generateAllEdges) {\r\n const minEdgeDot = Math.cos(polyface.edgeOptions.minCreaseAngle);\r\n for (const edgeInfo of edgeMap.values()) {\r\n if (undefined !== edgeInfo.faceIndex1) {\r\n const normal0 = triangleNormals[edgeInfo.faceIndex0];\r\n const normal1 = triangleNormals[edgeInfo.faceIndex1];\r\n if (Math.abs(normal0.dotProduct(normal1)) > minEdgeDot)\r\n edgeInfo.visible = false;\r\n }\r\n }\r\n }\r\n\r\n // Now populate the MeshEdges.\r\n // ###TODO edge chains?\r\n if (undefined === mesh.edges)\r\n mesh.edges = new MeshEdges();\r\n\r\n const maxPlanarDot = 0.999999;\r\n for (const edgeInfo of edgeMap.values()) {\r\n if (edgeInfo.visible) {\r\n mesh.edges.visible.push(edgeInfo.edge);\r\n } else if (undefined !== edgeInfo.faceIndex1) {\r\n const normal0 = triangleNormals[edgeInfo.faceIndex0];\r\n const normal1 = triangleNormals[edgeInfo.faceIndex1];\r\n if (Math.abs(normal0.dotProduct(normal1)) < maxPlanarDot) {\r\n mesh.edges.silhouette.push(edgeInfo.edge);\r\n mesh.edges.silhouetteNormals.push(new OctEncodedNormalPair(OctEncodedNormal.fromVector(normal0), OctEncodedNormal.fromVector(normal1)));\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"MeshBuilder.js","sourceRoot":"","sources":["../../../../../src/render/primitives/mesh/MeshBuilder.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, Dictionary } from \"@itwin/core-bentley\";\r\nimport { Angle, IndexedPolyface, Point2d, Point3d, Polyface, PolyfaceVisitor, Range3d, Vector3d } from \"@itwin/core-geometry\";\r\nimport { Feature, MeshEdge, MeshEdges, MeshPolyline, OctEncodedNormal, OctEncodedNormalPair, QPoint3dList, TextureMapping } from \"@itwin/core-common\";\r\nimport { DisplayParams } from \"../../../common/render/primitives/DisplayParams\";\r\nimport { Triangle, TriangleKey, TriangleSet } from \"../Primitives\";\r\nimport { StrokesPrimitivePointLists } from \"../Strokes\";\r\nimport { VertexKey, VertexKeyProps, VertexMap } from \"../VertexKey\";\r\nimport { Mesh } from \"./MeshPrimitives\";\r\n\r\n// Describes a vertex along with the index of the source vertex in the source PolyfaceVisitor.\r\ntype VertexKeyPropsWithIndex = VertexKeyProps & { sourceIndex: number };\r\n\r\n/** @internal */\r\nexport class MeshBuilder {\r\n public readonly vertexMap: VertexMap;\r\n private _triangleSet?: TriangleSet;\r\n private _currentPolyface?: MeshBuilderPolyface;\r\n public readonly mesh: Mesh;\r\n public readonly tolerance: number;\r\n public readonly areaTolerance: number;\r\n public readonly tileRange: Range3d;\r\n public get currentPolyface(): MeshBuilderPolyface | undefined { return this._currentPolyface; }\r\n public set displayParams(params: DisplayParams) { this.mesh.displayParams = params; }\r\n\r\n /** create reference for triangleSet on demand */\r\n public get triangleSet(): TriangleSet {\r\n if (undefined === this._triangleSet)\r\n this._triangleSet = new TriangleSet();\r\n\r\n return this._triangleSet;\r\n }\r\n\r\n private constructor(mesh: Mesh, tolerance: number, areaTolerance: number, tileRange: Range3d) {\r\n this.mesh = mesh;\r\n this.tolerance = tolerance;\r\n this.areaTolerance = areaTolerance;\r\n this.tileRange = tileRange;\r\n\r\n let vertexTolerance;\r\n if (mesh.points instanceof QPoint3dList) {\r\n const p0 = mesh.points.params.unquantize(0, 0, 0);\r\n const p1 = mesh.points.params.unquantize(1, 1, 1);\r\n vertexTolerance = p1.minus(p0, p0);\r\n } else {\r\n vertexTolerance = { x: tolerance, y: tolerance, z: tolerance };\r\n }\r\n\r\n this.vertexMap = new VertexMap(vertexTolerance);\r\n }\r\n\r\n /** create a new MeshBuilder */\r\n public static create(props: MeshBuilder.Props): MeshBuilder {\r\n const mesh = Mesh.create(props);\r\n const { tolerance, areaTolerance, range } = props;\r\n return new MeshBuilder(mesh, tolerance, areaTolerance, range);\r\n }\r\n\r\n /**\r\n * iterate through each point list of the strokes primitive and either load the point string or polyline into builder\r\n * @param strokes lists of stroke primitive point lists to iterate\r\n * @param isDisjoint if true add point string, else add polyline\r\n * @param fillColor\r\n */\r\n public addStrokePointLists(strokes: StrokesPrimitivePointLists, isDisjoint: boolean, fillColor: number, feature: Feature | undefined): void {\r\n for (const strokePoints of strokes) {\r\n if (isDisjoint)\r\n this.addPointString(strokePoints.points, fillColor, feature);\r\n else\r\n this.addPolyline(strokePoints.points, fillColor, feature);\r\n }\r\n }\r\n\r\n /**\r\n * add data from polyface into mesh builder\r\n * @param polyface the indexed polyface to iterate the facets of to load each facet's triangles' vertices\r\n * @param props the properties required for this operation\r\n */\r\n public addFromPolyface(polyface: IndexedPolyface, props: MeshBuilder.PolyfaceOptions, feature: Feature | undefined): void {\r\n this.beginPolyface(polyface, props.edgeOptions);\r\n const visitor = polyface.createVisitor();\r\n\r\n while (visitor.moveToNextFacet()) {\r\n this.addFromPolyfaceVisitor(visitor, props, feature);\r\n }\r\n\r\n this.endPolyface();\r\n }\r\n\r\n /**\r\n * @param visitor the PolyfaceVisitor containing the face data to be added\r\n * @param props the properties required for this operation:\r\n */\r\n public addFromPolyfaceVisitor(visitor: PolyfaceVisitor, options: MeshBuilder.PolyfaceOptions, feature: Feature | undefined): void {\r\n const { pointCount, normalCount, paramCount, requireNormals } = visitor;\r\n const { includeParams, mappedTexture } = options;\r\n\r\n const isDegenerate = requireNormals && normalCount < pointCount; // TFS#790263: Degenerate triangle - no normals.\r\n\r\n // a triangle must have at least 3 points\r\n if (pointCount < 3 || isDegenerate)\r\n return;\r\n\r\n const haveParam = includeParams && paramCount > 0;\r\n const triangleCount = pointCount - 2;\r\n\r\n assert(!includeParams || paramCount > 0);\r\n assert(!haveParam || undefined !== mappedTexture);\r\n\r\n // The face represented by this visitor should be convex (we request that in facet options) - so we do a simple fan triangulation.\r\n const polyfaceVisitorOptions = { ...options, triangleCount, haveParam };\r\n for (let triangleIndex = 0; triangleIndex < triangleCount; triangleIndex++) {\r\n const triangle = this.createTriangle(triangleIndex, visitor, polyfaceVisitorOptions, feature);\r\n if (undefined !== triangle)\r\n this.addTriangle(triangle);\r\n }\r\n }\r\n\r\n public createTriangleVertices(triangleIndex: number, visitor: PolyfaceVisitor, options: MeshBuilder.PolyfaceVisitorOptions, feature: Feature | undefined): VertexKeyPropsWithIndex[] | undefined {\r\n const { point, requireNormals } = visitor;\r\n const { fillColor, haveParam } = options;\r\n\r\n // If we do not have UVParams stored on the IndexedPolyface, compute them now\r\n let params: Point2d[] | undefined;\r\n if (haveParam && options.mappedTexture) {\r\n assert(this.mesh.points.length === 0 || this.mesh.uvParams.length !== 0);\r\n const mappedTexture = options.mappedTexture;\r\n const transformToImodel = mappedTexture.params.textureMatrix.transform;\r\n if (transformToImodel)\r\n params = mappedTexture.computeUVParams(visitor, transformToImodel);\r\n assert(params !== undefined);\r\n }\r\n\r\n const vertices = [];\r\n for (let i = 0; i < 3; ++i) {\r\n const vertexIndex = 0 === i ? 0 : triangleIndex + i;\r\n const position = point.getPoint3dAtUncheckedPointIndex(vertexIndex);\r\n const normal = requireNormals ? OctEncodedNormal.fromVector(visitor.getNormal(vertexIndex)!) : undefined;\r\n const uvParam: Point2d | undefined = params ? params[vertexIndex] : undefined;\r\n vertices[i] = { position, fillColor, normal, uvParam, sourceIndex: vertexIndex, feature };\r\n }\r\n\r\n // Previously we would add all 3 vertices to our map, then detect degenerate triangles in AddTriangle().\r\n // This led to unused vertex data, and caused mismatch in # of vertices when recreating the MeshBuilder from the data in the tile cache.\r\n // Detect beforehand instead.\r\n if (this.vertexMap.arePositionsAlmostEqual(vertices[0], vertices[1])\r\n || this.vertexMap.arePositionsAlmostEqual(vertices[0], vertices[2])\r\n || this.vertexMap.arePositionsAlmostEqual(vertices[1], vertices[2]))\r\n return undefined;\r\n\r\n return vertices;\r\n }\r\n\r\n public createTriangle(triangleIndex: number, visitor: PolyfaceVisitor, options: MeshBuilder.PolyfaceVisitorOptions, feature: Feature | undefined): Triangle | undefined {\r\n // generate vertex key properties for each of the three sides of the triangle\r\n const vertices = this.createTriangleVertices(triangleIndex, visitor, options, feature);\r\n\r\n // avoid creating degenerate triangles\r\n if (undefined === vertices)\r\n return undefined;\r\n\r\n const { edgeVisible } = visitor;\r\n\r\n const triangle = new Triangle();\r\n\r\n triangle.setEdgeVisibility(\r\n 0 === triangleIndex ? edgeVisible[0] : false,\r\n edgeVisible[triangleIndex + 1],\r\n triangleIndex === options.triangleCount - 1 ? edgeVisible[triangleIndex + 2] : false,\r\n );\r\n\r\n // set each triangle index to the index associated with the vertex key location in the vertex map\r\n vertices.forEach((vertexProps, i: number) => {\r\n let vertexKeyIndex;\r\n if (visitor.auxData) {\r\n // No deduplication with auxData (for now...)\r\n vertexKeyIndex = this.mesh.addVertex(vertexProps);\r\n this.mesh.addAuxChannels(visitor.auxData.channels, vertexProps.sourceIndex);\r\n } else {\r\n vertexKeyIndex = this.addVertex(vertexProps);\r\n }\r\n\r\n triangle.indices[i] = vertexKeyIndex;\r\n\r\n // if the current polyface exists, map the vertex key index to the visitor's client point index\r\n if (this.currentPolyface !== undefined)\r\n this.currentPolyface.vertexIndexMap.set(vertexKeyIndex, visitor.clientPointIndex(vertexProps.sourceIndex));\r\n });\r\n\r\n return triangle;\r\n }\r\n\r\n /** removed Feature for now */\r\n public addPolyline(points: Point3d[], fillColor: number, feature: Feature | undefined): void {\r\n const { mesh } = this;\r\n\r\n const poly = new MeshPolyline();\r\n for (const position of points)\r\n poly.addIndex(this.addVertex({ position, fillColor, feature }));\r\n\r\n mesh.addPolyline(poly);\r\n }\r\n\r\n /** removed Feature for now */\r\n public addPointString(points: Point3d[], fillColor: number, feature: Feature | undefined): void {\r\n const { mesh } = this;\r\n const poly = new MeshPolyline();\r\n\r\n for (const position of points)\r\n poly.addIndex(this.addVertex({ position, fillColor, feature }));\r\n\r\n mesh.addPolyline(poly);\r\n }\r\n\r\n public beginPolyface(polyface: Polyface, options: MeshEdgeCreationOptions): void {\r\n if (!options.generateNoEdges) {\r\n const triangles = this.mesh.triangles;\r\n this._currentPolyface = new MeshBuilderPolyface(polyface, options, triangles === undefined ? 0 : triangles.length);\r\n }\r\n }\r\n\r\n public endPolyface(): void {\r\n const { currentPolyface, mesh } = this;\r\n if (undefined === currentPolyface)\r\n return;\r\n\r\n this._currentPolyface = undefined;\r\n buildMeshEdges(mesh, currentPolyface);\r\n }\r\n\r\n public addVertex(vertex: VertexKeyProps, addToMeshOnInsert = true): number {\r\n // if vertex key isn't duplicate, then also insert properties into mesh\r\n const onInsert = (vk: VertexKey) => this.mesh.addVertex(vk);\r\n return this.vertexMap.insertKey(vertex, addToMeshOnInsert ? onInsert : undefined);\r\n }\r\n\r\n public addTriangle(triangle: Triangle): void {\r\n // Attempt to avoid adding vertices originating from degenerate triangles before we get here.\r\n // Removed assert and just return if degenerate at this point because uncommon cases (not worth testing for) can still occur.\r\n if (triangle.isDegenerate)\r\n return;\r\n\r\n const onInsert = (_vk: TriangleKey) => this.mesh.addTriangle(triangle);\r\n this.triangleSet.insertKey(triangle, onInsert);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport namespace MeshBuilder { // eslint-disable-line no-redeclare\r\n export interface Props extends Mesh.Props {\r\n tolerance: number;\r\n areaTolerance: number;\r\n }\r\n export interface PolyfaceOptions {\r\n includeParams: boolean;\r\n fillColor: number;\r\n mappedTexture?: TextureMapping;\r\n edgeOptions: MeshEdgeCreationOptions;\r\n }\r\n\r\n export interface PolyfaceVisitorOptions extends PolyfaceOptions {\r\n triangleCount: number;\r\n haveParam: boolean;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class MeshEdgeCreationOptions {\r\n public readonly type: MeshEdgeCreationOptions.Type;\r\n public readonly minCreaseAngle = 20.0 * Angle.radiansPerDegree;\r\n public get generateAllEdges(): boolean { return this.type === MeshEdgeCreationOptions.Type.AllEdges; }\r\n public get generateNoEdges(): boolean { return this.type === MeshEdgeCreationOptions.Type.NoEdges; }\r\n public get generateCreaseEdges(): boolean { return 0 !== (this.type & MeshEdgeCreationOptions.Type.CreaseEdges); }\r\n /** Create edge chains for polyfaces that do not already have them. */\r\n public get createEdgeChains(): boolean { return 0 !== (this.type & MeshEdgeCreationOptions.Type.CreateChains); }\r\n constructor(type = MeshEdgeCreationOptions.Type.NoEdges) { this.type = type; }\r\n}\r\n\r\n/** @internal */\r\nexport namespace MeshEdgeCreationOptions { // eslint-disable-line no-redeclare\r\n export enum Type {\r\n NoEdges = 0x0000,\r\n CreaseEdges = 0x0001 << 1,\r\n SmoothEdges = 0x0001 << 2,\r\n CreateChains = 0x0001 << 3,\r\n DefaultEdges = CreaseEdges,\r\n AllEdges = CreaseEdges | SmoothEdges,\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class MeshBuilderPolyface {\r\n public readonly polyface: Polyface;\r\n public readonly edgeOptions: MeshEdgeCreationOptions;\r\n public readonly vertexIndexMap: Map<number, number> = new Map<number, number>();\r\n public readonly baseTriangleIndex: number;\r\n constructor(polyface: Polyface, edgeOptions: MeshEdgeCreationOptions, baseTriangleIndex: number) {\r\n this.polyface = polyface;\r\n this.edgeOptions = edgeOptions;\r\n this.baseTriangleIndex = baseTriangleIndex;\r\n }\r\n}\r\n\r\nclass EdgeInfo {\r\n public faceIndex1?: number;\r\n\r\n public constructor(\r\n public visible: boolean,\r\n public faceIndex0: number,\r\n public edge: MeshEdge,\r\n public point0: Point3d,\r\n public point1: Point3d) {\r\n }\r\n\r\n public addFace(visible: boolean, faceIndex: number) {\r\n if (undefined === this.faceIndex1) {\r\n this.visible ||= visible;\r\n this.faceIndex1 = faceIndex;\r\n }\r\n }\r\n}\r\n\r\nfunction buildMeshEdges(mesh: Mesh, polyface: MeshBuilderPolyface): void {\r\n if (!mesh.triangles)\r\n return;\r\n\r\n const edgeMap = new Dictionary<MeshEdge, EdgeInfo>((lhs, rhs) => lhs.compareTo(rhs));\r\n const triangleNormals: Vector3d[] = [];\r\n\r\n // We need to detect the edge pairs -- Can't do that from the Mesh indices as these are not shared - so we'll\r\n // assume that the polyface indices are properly shared, this should be true as a seperate index array is used\r\n // for Polyfaces.\r\n const triangle = new Triangle();\r\n const polyfacePoints = [new Point3d(), new Point3d(), new Point3d()];\r\n const polyfaceIndices = [0, 0, 0];\r\n\r\n for (let triangleIndex = polyface.baseTriangleIndex; triangleIndex < mesh.triangles.length; triangleIndex++) {\r\n let indexNotFound = false;\r\n mesh.triangles.getTriangle(triangleIndex, triangle);\r\n for (let j = 0; j < 3; j++) {\r\n const foundPolyfaceIndex = polyface.vertexIndexMap.get(triangle.indices[j]);\r\n assert(undefined !== foundPolyfaceIndex);\r\n if (undefined === foundPolyfaceIndex) {\r\n indexNotFound = true;\r\n continue;\r\n }\r\n\r\n polyfaceIndices[j] = foundPolyfaceIndex;\r\n polyface.polyface.data.getPoint(foundPolyfaceIndex, polyfacePoints[j]);\r\n }\r\n\r\n if (indexNotFound)\r\n continue;\r\n\r\n for (let j = 0; j < 3; j++) {\r\n const jNext = (j + 1) % 3;\r\n const triangleNormalIndex = triangleNormals.length;\r\n const meshEdge = new MeshEdge(triangle.indices[j], triangle.indices[jNext]);\r\n const polyfaceEdge = new MeshEdge(polyfaceIndices[j], polyfaceIndices[jNext]);\r\n const edgeInfo = new EdgeInfo(triangle.isEdgeVisible(j), triangleNormalIndex, meshEdge, polyfacePoints[j], polyfacePoints[jNext]);\r\n\r\n const findOrInsert = edgeMap.findOrInsert(polyfaceEdge, edgeInfo);\r\n if (!findOrInsert.inserted)\r\n findOrInsert.value.addFace(edgeInfo.visible, triangleNormalIndex);\r\n }\r\n\r\n const normal = Vector3d.createCrossProductToPoints(polyfacePoints[0], polyfacePoints[1], polyfacePoints[2]);\r\n normal.normalizeInPlace();\r\n triangleNormals.push(normal);\r\n }\r\n\r\n // If there is no visibility indication in the mesh, infer from the mesh geometry.\r\n if (!polyface.edgeOptions.generateAllEdges) {\r\n const minEdgeDot = Math.cos(polyface.edgeOptions.minCreaseAngle);\r\n for (const edgeInfo of edgeMap.values()) {\r\n if (undefined !== edgeInfo.faceIndex1) {\r\n const normal0 = triangleNormals[edgeInfo.faceIndex0];\r\n const normal1 = triangleNormals[edgeInfo.faceIndex1];\r\n if (Math.abs(normal0.dotProduct(normal1)) > minEdgeDot)\r\n edgeInfo.visible = false;\r\n }\r\n }\r\n }\r\n\r\n // Now populate the MeshEdges.\r\n // ###TODO edge chains?\r\n if (undefined === mesh.edges)\r\n mesh.edges = new MeshEdges();\r\n\r\n const maxPlanarDot = 0.999999;\r\n for (const edgeInfo of edgeMap.values()) {\r\n if (edgeInfo.visible) {\r\n mesh.edges.visible.push(edgeInfo.edge);\r\n } else if (undefined !== edgeInfo.faceIndex1) {\r\n const normal0 = triangleNormals[edgeInfo.faceIndex0];\r\n const normal1 = triangleNormals[edgeInfo.faceIndex1];\r\n if (Math.abs(normal0.dotProduct(normal1)) < maxPlanarDot) {\r\n mesh.edges.silhouette.push(edgeInfo.edge);\r\n mesh.edges.silhouetteNormals.push(new OctEncodedNormalPair(OctEncodedNormal.fromVector(normal0), OctEncodedNormal.fromVector(normal1)));\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MeshBuilderMap.d.ts","sourceRoot":"","sources":["../../../../../src/render/primitives/mesh/MeshBuilderMap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MeshBuilderMap.d.ts","sourceRoot":"","sources":["../../../../../src/render/primitives/mesh/MeshBuilderMap.ts"],"names":[],"mappings":"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"}
@@ -36,8 +36,10 @@ class MeshBuilderMap extends core_bentley_1.Dictionary {
36
36
  }
37
37
  toMeshes() {
38
38
  const meshes = new MeshPrimitives_1.MeshList(this.features, this.range);
39
- for (const builder of this._values)
40
- meshes.push(builder.mesh);
39
+ for (const builder of this._values) {
40
+ if (builder.mesh.points.length > 0)
41
+ meshes.push(builder.mesh);
42
+ }
41
43
  return meshes;
42
44
  }
43
45
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"MeshBuilderMap.js","sourceRoot":"","sources":["../../../../../src/render/primitives/mesh/MeshBuilderMap.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 { compareBooleans, compareNumbers, Dictionary, Id64String } from \"@itwin/core-bentley\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { Feature, FeatureTable } from \"@itwin/core-common\";\r\nimport { DisplayParams } from \"../../../common/render/primitives/DisplayParams\";\r\nimport { MeshPrimitiveType } from \"../../../common/render/primitives/MeshPrimitive\";\r\nimport { GeometryList } from \"../geometry/GeometryList\";\r\nimport { Geometry } from \"../geometry/GeometryPrimitives\";\r\nimport { PolyfacePrimitive } from \"../Polyface\";\r\nimport { GeometryOptions, ToleranceRatio } from \"../Primitives\";\r\nimport { StrokesPrimitive } from \"../Strokes\";\r\nimport { MeshBuilder, MeshEdgeCreationOptions } from \"./MeshBuilder\";\r\nimport { Mesh, MeshList } from \"./MeshPrimitives\";\r\n\r\n/** @internal */\r\nexport class MeshBuilderMap extends Dictionary<MeshBuilderMap.Key, MeshBuilder> {\r\n public readonly range: Range3d;\r\n public readonly vertexTolerance: number;\r\n public readonly facetAreaTolerance: number;\r\n public readonly tolerance: number;\r\n public readonly is2d: boolean;\r\n public readonly features?: FeatureTable;\r\n public readonly options: GeometryOptions;\r\n private _keyOrder = 0;\r\n\r\n constructor(tolerance: number, range: Range3d, is2d: boolean, options: GeometryOptions, pickable: { modelId?: Id64String } | undefined) {\r\n super((lhs: MeshBuilderMap.Key, rhs: MeshBuilderMap.Key) => lhs.compare(rhs));\r\n this.tolerance = tolerance;\r\n this.vertexTolerance = tolerance * ToleranceRatio.vertex;\r\n this.facetAreaTolerance = tolerance * ToleranceRatio.facetArea;\r\n this.range = range;\r\n this.is2d = is2d;\r\n this.options = options;\r\n\r\n if (pickable)\r\n this.features = new FeatureTable(2048 * 1024, pickable.modelId);\r\n }\r\n\r\n public static createFromGeometries(geometries: GeometryList, tolerance: number, range: Range3d, is2d: boolean, options: GeometryOptions, pickable: { modelId?: Id64String} | undefined): MeshBuilderMap {\r\n const map = new MeshBuilderMap(tolerance, range, is2d, options, pickable);\r\n\r\n for (const geom of geometries)\r\n map.loadGeometry(geom);\r\n\r\n return map;\r\n }\r\n\r\n public toMeshes(): MeshList {\r\n const meshes = new MeshList(this.features, this.range);\r\n for (const builder of this._values)\r\n meshes.push(builder.mesh);\r\n\r\n return meshes;\r\n }\r\n\r\n /**\r\n * extract polyfaces and strokes from geometry into MeshBuilder stored in builderMap\r\n * @param geom Geometry instance to extract polyfaces and strokes from\r\n * @param wantSurfacesOnly if true prevent strokes from being loaded into builders\r\n */\r\n public loadGeometry(geom: Geometry): void {\r\n this.loadPolyfacePrimitiveList(geom);\r\n\r\n if (!this.options.wantSurfacesOnly)\r\n this.loadStrokePrimitiveList(geom);\r\n }\r\n\r\n /**\r\n * extract polyface primitives from geometry in meshBuilder stored in builderMap\r\n * @param geom Geometry instance to extract polyfaces from\r\n */\r\n public loadPolyfacePrimitiveList(geom: Geometry): void {\r\n const polyfaces = geom.getPolyfaces(this.tolerance);\r\n\r\n if (polyfaces !== undefined)\r\n for (const polyface of polyfaces)\r\n this.loadIndexedPolyface(polyface, geom.feature);\r\n }\r\n\r\n /**\r\n * extract indexed polyfaces into meshBuilder stored in builderMap\r\n * @param polyface PolyfacePrimitive to extract indexed polyfaces from\r\n */\r\n public loadIndexedPolyface(polyface: PolyfacePrimitive, feature: Feature | undefined): void {\r\n const { indexedPolyface, displayParams, isPlanar } = polyface;\r\n const { pointCount, normalCount } = indexedPolyface;\r\n const { fillColor, isTextured } = displayParams;\r\n const textureMapping = displayParams.textureMapping;\r\n\r\n if (pointCount === 0)\r\n return;\r\n\r\n const builder = this.getBuilder(displayParams, MeshPrimitiveType.Mesh, normalCount > 0, isPlanar);\r\n const edgeOptions = new MeshEdgeCreationOptions(polyface.displayEdges && this.options.edges ? MeshEdgeCreationOptions.Type.DefaultEdges : MeshEdgeCreationOptions.Type.NoEdges);\r\n builder.addFromPolyface(indexedPolyface, { edgeOptions, includeParams: isTextured, fillColor: fillColor.tbgr, mappedTexture: textureMapping }, feature);\r\n }\r\n\r\n /**\r\n * extract stroke primitives from geometry in meshBuilder stored in builderMap\r\n * @param geom Geometry instance to extract strokes from\r\n */\r\n public loadStrokePrimitiveList(geom: Geometry): void {\r\n const strokes = geom.getStrokes(this.tolerance);\r\n\r\n if (undefined !== strokes)\r\n for (const stroke of strokes)\r\n this.loadStrokesPrimitive(stroke, geom.feature);\r\n }\r\n\r\n /**\r\n * extract strokes primitive into meshBuilder stored in builderMap\r\n * @param strokePrimitive StrokesPrimitive instance to extractfrom\r\n */\r\n public loadStrokesPrimitive(strokePrimitive: StrokesPrimitive, feature: Feature | undefined): void {\r\n const { displayParams, isDisjoint, isPlanar, strokes } = strokePrimitive;\r\n\r\n const type = isDisjoint ? MeshPrimitiveType.Point : MeshPrimitiveType.Polyline;\r\n const builder = this.getBuilder(displayParams, type, false, isPlanar);\r\n builder.addStrokePointLists(strokes, isDisjoint, displayParams.fillColor.tbgr, feature);\r\n }\r\n\r\n public getBuilder(displayParams: DisplayParams, type: MeshPrimitiveType, hasNormals: boolean, isPlanar: boolean): MeshBuilder {\r\n const { facetAreaTolerance, tolerance, is2d, range } = this;\r\n const key = this.getKey(displayParams, type, hasNormals, isPlanar);\r\n\r\n const quantizePositions = false; // ###TODO should this be configurable?\r\n return this.getBuilderFromKey(key, {\r\n displayParams,\r\n type,\r\n range,\r\n quantizePositions,\r\n is2d,\r\n isPlanar,\r\n tolerance,\r\n areaTolerance: facetAreaTolerance,\r\n features: this.features,\r\n });\r\n }\r\n\r\n public getKey(displayParams: DisplayParams, type: MeshPrimitiveType, hasNormals: boolean, isPlanar: boolean): MeshBuilderMap.Key {\r\n const key = new MeshBuilderMap.Key(displayParams, type, hasNormals, isPlanar);\r\n\r\n if (this.options.preserveOrder)\r\n key.order = ++this._keyOrder;\r\n\r\n return key;\r\n }\r\n\r\n /**\r\n * gets builder associated with key if defined, otherwise creates a new builder and sets that with key\r\n * @param key MeshBuilderMap.Key to associate with builder\r\n * @param props MeshBuilder.Props required to create builder if it does not already exist\r\n * @returns builder reference, changes will update instance stored in builderMap\r\n */\r\n public getBuilderFromKey(key: MeshBuilderMap.Key, props: MeshBuilder.Props): MeshBuilder {\r\n let builder = this.get(key);\r\n if (undefined === builder) {\r\n builder = MeshBuilder.create(props);\r\n this.set(key, builder);\r\n }\r\n return builder;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport namespace MeshBuilderMap { // eslint-disable-line no-redeclare\r\n export class Key {\r\n public order: number = 0;\r\n public readonly params: DisplayParams;\r\n public readonly type: MeshPrimitiveType;\r\n public readonly hasNormals: boolean;\r\n public readonly isPlanar: boolean;\r\n\r\n constructor(params: DisplayParams, type: MeshPrimitiveType, hasNormals: boolean, isPlanar: boolean) {\r\n this.params = params;\r\n this.type = type;\r\n this.hasNormals = hasNormals;\r\n this.isPlanar = isPlanar;\r\n }\r\n\r\n public static createFromMesh(mesh: Mesh): Key {\r\n return new Key(mesh.displayParams, mesh.type, mesh.normals.length !== 0, mesh.isPlanar);\r\n }\r\n\r\n public compare(rhs: Key): number {\r\n let diff = compareNumbers(this.order, rhs.order);\r\n if (0 === diff) {\r\n diff = compareNumbers(this.type, rhs.type);\r\n if (0 === diff) {\r\n diff = compareBooleans(this.isPlanar, rhs.isPlanar);\r\n if (0 === diff) {\r\n diff = compareBooleans(this.hasNormals, rhs.hasNormals);\r\n if (0 === diff) {\r\n diff = this.params.compareForMerge(rhs.params);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return diff;\r\n }\r\n\r\n public equals(rhs: Key): boolean { return 0 === this.compare(rhs); }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"MeshBuilderMap.js","sourceRoot":"","sources":["../../../../../src/render/primitives/mesh/MeshBuilderMap.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 { compareBooleans, compareNumbers, Dictionary, Id64String } from \"@itwin/core-bentley\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { Feature, FeatureTable } from \"@itwin/core-common\";\r\nimport { DisplayParams } from \"../../../common/render/primitives/DisplayParams\";\r\nimport { MeshPrimitiveType } from \"../../../common/render/primitives/MeshPrimitive\";\r\nimport { GeometryList } from \"../geometry/GeometryList\";\r\nimport { Geometry } from \"../geometry/GeometryPrimitives\";\r\nimport { PolyfacePrimitive } from \"../Polyface\";\r\nimport { GeometryOptions, ToleranceRatio } from \"../Primitives\";\r\nimport { StrokesPrimitive } from \"../Strokes\";\r\nimport { MeshBuilder, MeshEdgeCreationOptions } from \"./MeshBuilder\";\r\nimport { Mesh, MeshList } from \"./MeshPrimitives\";\r\n\r\n/** @internal */\r\nexport class MeshBuilderMap extends Dictionary<MeshBuilderMap.Key, MeshBuilder> {\r\n public readonly range: Range3d;\r\n public readonly vertexTolerance: number;\r\n public readonly facetAreaTolerance: number;\r\n public readonly tolerance: number;\r\n public readonly is2d: boolean;\r\n public readonly features?: FeatureTable;\r\n public readonly options: GeometryOptions;\r\n private _keyOrder = 0;\r\n\r\n constructor(tolerance: number, range: Range3d, is2d: boolean, options: GeometryOptions, pickable: { modelId?: Id64String } | undefined) {\r\n super((lhs: MeshBuilderMap.Key, rhs: MeshBuilderMap.Key) => lhs.compare(rhs));\r\n this.tolerance = tolerance;\r\n this.vertexTolerance = tolerance * ToleranceRatio.vertex;\r\n this.facetAreaTolerance = tolerance * ToleranceRatio.facetArea;\r\n this.range = range;\r\n this.is2d = is2d;\r\n this.options = options;\r\n\r\n if (pickable)\r\n this.features = new FeatureTable(2048 * 1024, pickable.modelId);\r\n }\r\n\r\n public static createFromGeometries(geometries: GeometryList, tolerance: number, range: Range3d, is2d: boolean, options: GeometryOptions, pickable: { modelId?: Id64String } | undefined): MeshBuilderMap {\r\n const map = new MeshBuilderMap(tolerance, range, is2d, options, pickable);\r\n\r\n for (const geom of geometries)\r\n map.loadGeometry(geom);\r\n\r\n return map;\r\n }\r\n\r\n public toMeshes(): MeshList {\r\n const meshes = new MeshList(this.features, this.range);\r\n for (const builder of this._values) {\r\n if (builder.mesh.points.length > 0)\r\n meshes.push(builder.mesh);\r\n }\r\n return meshes;\r\n }\r\n\r\n /**\r\n * extract polyfaces and strokes from geometry into MeshBuilder stored in builderMap\r\n * @param geom Geometry instance to extract polyfaces and strokes from\r\n * @param wantSurfacesOnly if true prevent strokes from being loaded into builders\r\n */\r\n public loadGeometry(geom: Geometry): void {\r\n this.loadPolyfacePrimitiveList(geom);\r\n\r\n if (!this.options.wantSurfacesOnly)\r\n this.loadStrokePrimitiveList(geom);\r\n }\r\n\r\n /**\r\n * extract polyface primitives from geometry in meshBuilder stored in builderMap\r\n * @param geom Geometry instance to extract polyfaces from\r\n */\r\n public loadPolyfacePrimitiveList(geom: Geometry): void {\r\n const polyfaces = geom.getPolyfaces(this.tolerance);\r\n\r\n if (polyfaces !== undefined)\r\n for (const polyface of polyfaces)\r\n this.loadIndexedPolyface(polyface, geom.feature);\r\n }\r\n\r\n /**\r\n * extract indexed polyfaces into meshBuilder stored in builderMap\r\n * @param polyface PolyfacePrimitive to extract indexed polyfaces from\r\n */\r\n public loadIndexedPolyface(polyface: PolyfacePrimitive, feature: Feature | undefined): void {\r\n const { indexedPolyface, displayParams, isPlanar } = polyface;\r\n const { pointCount, normalCount } = indexedPolyface;\r\n const { fillColor, isTextured } = displayParams;\r\n const textureMapping = displayParams.textureMapping;\r\n\r\n if (pointCount === 0)\r\n return;\r\n\r\n const builder = this.getBuilder(displayParams, MeshPrimitiveType.Mesh, normalCount > 0, isPlanar);\r\n const edgeOptions = new MeshEdgeCreationOptions(polyface.displayEdges && this.options.edges ? MeshEdgeCreationOptions.Type.DefaultEdges : MeshEdgeCreationOptions.Type.NoEdges);\r\n builder.addFromPolyface(indexedPolyface, { edgeOptions, includeParams: isTextured, fillColor: fillColor.tbgr, mappedTexture: textureMapping }, feature);\r\n }\r\n\r\n /**\r\n * extract stroke primitives from geometry in meshBuilder stored in builderMap\r\n * @param geom Geometry instance to extract strokes from\r\n */\r\n public loadStrokePrimitiveList(geom: Geometry): void {\r\n const strokes = geom.getStrokes(this.tolerance);\r\n\r\n if (undefined !== strokes)\r\n for (const stroke of strokes)\r\n this.loadStrokesPrimitive(stroke, geom.feature);\r\n }\r\n\r\n /**\r\n * extract strokes primitive into meshBuilder stored in builderMap\r\n * @param strokePrimitive StrokesPrimitive instance to extractfrom\r\n */\r\n public loadStrokesPrimitive(strokePrimitive: StrokesPrimitive, feature: Feature | undefined): void {\r\n const { displayParams, isDisjoint, isPlanar, strokes } = strokePrimitive;\r\n\r\n const type = isDisjoint ? MeshPrimitiveType.Point : MeshPrimitiveType.Polyline;\r\n const builder = this.getBuilder(displayParams, type, false, isPlanar);\r\n builder.addStrokePointLists(strokes, isDisjoint, displayParams.fillColor.tbgr, feature);\r\n }\r\n\r\n public getBuilder(displayParams: DisplayParams, type: MeshPrimitiveType, hasNormals: boolean, isPlanar: boolean): MeshBuilder {\r\n const { facetAreaTolerance, tolerance, is2d, range } = this;\r\n const key = this.getKey(displayParams, type, hasNormals, isPlanar);\r\n\r\n const quantizePositions = false; // ###TODO should this be configurable?\r\n return this.getBuilderFromKey(key, {\r\n displayParams,\r\n type,\r\n range,\r\n quantizePositions,\r\n is2d,\r\n isPlanar,\r\n tolerance,\r\n areaTolerance: facetAreaTolerance,\r\n features: this.features,\r\n });\r\n }\r\n\r\n public getKey(displayParams: DisplayParams, type: MeshPrimitiveType, hasNormals: boolean, isPlanar: boolean): MeshBuilderMap.Key {\r\n const key = new MeshBuilderMap.Key(displayParams, type, hasNormals, isPlanar);\r\n\r\n if (this.options.preserveOrder)\r\n key.order = ++this._keyOrder;\r\n\r\n return key;\r\n }\r\n\r\n /**\r\n * gets builder associated with key if defined, otherwise creates a new builder and sets that with key\r\n * @param key MeshBuilderMap.Key to associate with builder\r\n * @param props MeshBuilder.Props required to create builder if it does not already exist\r\n * @returns builder reference, changes will update instance stored in builderMap\r\n */\r\n public getBuilderFromKey(key: MeshBuilderMap.Key, props: MeshBuilder.Props): MeshBuilder {\r\n let builder = this.get(key);\r\n if (undefined === builder) {\r\n builder = MeshBuilder.create(props);\r\n this.set(key, builder);\r\n }\r\n return builder;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport namespace MeshBuilderMap { // eslint-disable-line no-redeclare\r\n export class Key {\r\n public order: number = 0;\r\n public readonly params: DisplayParams;\r\n public readonly type: MeshPrimitiveType;\r\n public readonly hasNormals: boolean;\r\n public readonly isPlanar: boolean;\r\n\r\n constructor(params: DisplayParams, type: MeshPrimitiveType, hasNormals: boolean, isPlanar: boolean) {\r\n this.params = params;\r\n this.type = type;\r\n this.hasNormals = hasNormals;\r\n this.isPlanar = isPlanar;\r\n }\r\n\r\n public static createFromMesh(mesh: Mesh): Key {\r\n return new Key(mesh.displayParams, mesh.type, mesh.normals.length !== 0, mesh.isPlanar);\r\n }\r\n\r\n public compare(rhs: Key): number {\r\n let diff = compareNumbers(this.order, rhs.order);\r\n if (0 === diff) {\r\n diff = compareNumbers(this.type, rhs.type);\r\n if (0 === diff) {\r\n diff = compareBooleans(this.isPlanar, rhs.isPlanar);\r\n if (0 === diff) {\r\n diff = compareBooleans(this.hasNormals, rhs.hasNormals);\r\n if (0 === diff) {\r\n diff = this.params.compareForMerge(rhs.params);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return diff;\r\n }\r\n\r\n public equals(rhs: Key): boolean { return 0 === this.compare(rhs); }\r\n }\r\n}\r\n"]}
@@ -84,7 +84,7 @@ class BatchState {
84
84
  }
85
85
  getBatchId(batch, allowAdd) {
86
86
  if (allowAdd && 0 === batch.batchId) {
87
- batch.setContext(this.nextBatchId, this._stack.top.iModel);
87
+ batch.setContext(this.nextBatchId, this._stack.top);
88
88
  this._batches.push(batch);
89
89
  }
90
90
  return batch.batchId;
@@ -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 { 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
+ {"version":3,"file":"BatchState.js","sourceRoot":"","sources":["../../../../src/render/webgl/BatchState.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,sDAA2E;AAM3E;;;;;;;;;;;;;;GAcG;AACH,MAAa,UAAU;IAKrB,YAAmB,KAAkB;QAH7B,aAAQ,GAAY,EAAE,CAAC,CAAC,8DAA8D;QAI5F,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAW,YAAY,KAAwB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACvE,IAAW,cAAc,KAAa,OAAO,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzG,IAAW,kBAAkB,KAAmC,OAAO,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/I,IAAW,OAAO,KAAc,OAAO,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAE7D,IAAI,CAAC,KAAY,EAAE,QAAiB;QACzC,IAAA,qBAAM,EAAC,SAAS,KAAK,IAAI,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAEM,GAAG;QACR,IAAA,qBAAM,EAAC,SAAS,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAEM,KAAK;QACV,IAAA,qBAAM,EAAC,SAAS,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;QACxC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;YAC/B,KAAK,CAAC,YAAY,EAAE,CAAC;QAEvB,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAGM,YAAY,CAAC,SAAiB;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,SAAS,KAAK,KAAK;YACrB,OAAO,mBAAI,CAAC,OAAO,CAAC;QAEtB,MAAM,YAAY,GAAG,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/C,IAAA,qBAAM,EAAC,YAAY,IAAI,CAAC,CAAC,CAAC;QAE1B,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,CAAC,qBAAqB,CAAC,CAAC;QAClG,OAAO,mBAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAEM,UAAU,CAAC,SAAiB,EAAE,MAAoB;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,SAAS,KAAK,KAAK;YACrB,OAAO,SAAS,CAAC;QAEnB,MAAM,YAAY,GAAG,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/C,IAAA,qBAAM,EAAC,YAAY,IAAI,CAAC,CAAC,CAAC;QAE1B,OAAO,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,IAAW,aAAa,KAAK,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACvD,IAAW,UAAU,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjD,WAAW,CAAC,SAAiB;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,IAAW,WAAW;QACpB,IAAI,IAAI,CAAC,OAAO;YACd,OAAO,CAAC,CAAC;QAEX,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrD,IAAA,qBAAM,EAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC;QAE3B,IAAI,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;QACpD,IAAI,CAAC,KAAK,eAAe;YACvB,eAAe,GAAG,CAAC,CAAC;QAEtB,OAAO,IAAI,CAAC,OAAO,GAAG,eAAe,CAAC;IACxC,CAAC;IAEO,UAAU,CAAC,KAAY,EAAE,QAAiB;QAChD,IAAI,QAAQ,IAAI,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE;YACnC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC3B;QAED,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAEO,OAAO,CAAC,SAAiB;QAC/B,IAAI,SAAS,IAAI,CAAC;YAChB,OAAO,CAAC,CAAC,CAAC;QAEZ,MAAM,KAAK,GAAG,IAAA,yBAAU,EAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAW,EAAE,GAAU,EAAE,EAAE;YAC7E,2EAA2E;YAC3E,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO;gBACnB,OAAO,CAAC,CAAC,CAAC;YAEZ,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC;YACjD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,OAAO,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEM,IAAI,CAAC,SAAiB;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACtC,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,CAAC;;AA3EuB,gCAAqB,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,AAAzB,CAA0B;AAlC5D,gCAAU","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);\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,6 +1,7 @@
1
1
  /** @packageDocumentation
2
2
  * @module WebGL
3
3
  */
4
+ import { Id64String } from "@itwin/core-bentley";
4
5
  import { Transform } from "@itwin/core-geometry";
5
6
  import { BatchType, FeatureAppearance, FeatureAppearanceProvider, GeometryClass, HiddenLine, RealityModelDisplaySettings, ViewFlags } from "@itwin/core-common";
6
7
  import { IModelConnection } from "../../IModelConnection";
@@ -37,6 +38,7 @@ export interface BranchStateOptions {
37
38
  readonly appearanceProvider?: FeatureAppearanceProvider;
38
39
  readonly realityModelDisplaySettings?: RealityModelDisplaySettings;
39
40
  forceViewCoords?: boolean;
41
+ readonly viewAttachmentId?: Id64String;
40
42
  }
41
43
  /**
42
44
  * Represents a branch node in the scene graph, with associated view flags and transform to be applied to
@@ -62,6 +64,7 @@ export declare class BranchState {
62
64
  get appearanceProvider(): FeatureAppearanceProvider | undefined;
63
65
  get secondaryClassifiers(): PlanarClassifier[] | undefined;
64
66
  get realityModelDisplaySettings(): RealityModelDisplaySettings | undefined;
67
+ get viewAttachmentId(): string | undefined;
65
68
  get symbologyOverrides(): FeatureSymbology.Overrides;
66
69
  set symbologyOverrides(ovrs: FeatureSymbology.Overrides);
67
70
  changeRenderPlan(viewFlags: ViewFlags, is3d: boolean, hline: HiddenLine.Settings | undefined): void;
@@ -1 +1 @@
1
- {"version":3,"file":"BranchState.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/BranchState.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BranchState.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/BranchState.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,7 @@ class BranchState {
32
32
  get appearanceProvider() { return this._opts.appearanceProvider; }
33
33
  get secondaryClassifiers() { return this._opts.secondaryClassifiers; }
34
34
  get realityModelDisplaySettings() { return this._opts.realityModelDisplaySettings; }
35
+ get viewAttachmentId() { return this._opts.viewAttachmentId; }
35
36
  get symbologyOverrides() {
36
37
  return this._opts.symbologyOverrides;
37
38
  }
@@ -61,6 +62,7 @@ class BranchState {
61
62
  // The branch can augment the symbology overrides. If it doesn't want to, allow its parent to do so, unless this branch supplies its own symbology overrides.
62
63
  appearanceProvider: branch.appearanceProvider ?? (branch.branch.symbologyOverrides ? undefined : prev.appearanceProvider),
63
64
  realityModelDisplaySettings: branch.branch.realityModelDisplaySettings ?? prev.realityModelDisplaySettings,
65
+ viewAttachmentId: branch.viewAttachmentId ?? prev.viewAttachmentId,
64
66
  });
65
67
  }
66
68
  getFeatureAppearance(overrides, elemLo, elemHi, subcatLo, subcatHi, geomClass, modelLo, modelHi, type, animationNodeId) {