@itwin/core-frontend 3.2.0-dev.1 → 3.2.0-dev.3

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 (159) hide show
  1. package/lib/cjs/HitDetail.js.map +1 -1
  2. package/lib/cjs/render/ParticleCollectionBuilder.d.ts.map +1 -1
  3. package/lib/cjs/render/ParticleCollectionBuilder.js +16 -9
  4. package/lib/cjs/render/ParticleCollectionBuilder.js.map +1 -1
  5. package/lib/cjs/render/RenderSystem.d.ts.map +1 -1
  6. package/lib/cjs/render/RenderSystem.js +19 -17
  7. package/lib/cjs/render/RenderSystem.js.map +1 -1
  8. package/lib/cjs/render/primitives/EdgeParams.d.ts.map +1 -1
  9. package/lib/cjs/render/primitives/EdgeParams.js +3 -1
  10. package/lib/cjs/render/primitives/EdgeParams.js.map +1 -1
  11. package/lib/cjs/render/primitives/PolylineParams.d.ts.map +1 -1
  12. package/lib/cjs/render/primitives/PolylineParams.js +10 -5
  13. package/lib/cjs/render/primitives/PolylineParams.js.map +1 -1
  14. package/lib/cjs/render/primitives/VertexKey.d.ts +11 -8
  15. package/lib/cjs/render/primitives/VertexKey.d.ts.map +1 -1
  16. package/lib/cjs/render/primitives/VertexKey.js +24 -6
  17. package/lib/cjs/render/primitives/VertexKey.js.map +1 -1
  18. package/lib/cjs/render/primitives/VertexTable.d.ts +15 -2
  19. package/lib/cjs/render/primitives/VertexTable.d.ts.map +1 -1
  20. package/lib/cjs/render/primitives/VertexTable.js +273 -108
  21. package/lib/cjs/render/primitives/VertexTable.js.map +1 -1
  22. package/lib/cjs/render/primitives/geometry/GeometryAccumulator.d.ts.map +1 -1
  23. package/lib/cjs/render/primitives/geometry/GeometryAccumulator.js +22 -10
  24. package/lib/cjs/render/primitives/geometry/GeometryAccumulator.js.map +1 -1
  25. package/lib/cjs/render/primitives/mesh/MeshBuilder.d.ts +4 -6
  26. package/lib/cjs/render/primitives/mesh/MeshBuilder.d.ts.map +1 -1
  27. package/lib/cjs/render/primitives/mesh/MeshBuilder.js +16 -13
  28. package/lib/cjs/render/primitives/mesh/MeshBuilder.js.map +1 -1
  29. package/lib/cjs/render/primitives/mesh/MeshBuilderMap.d.ts.map +1 -1
  30. package/lib/cjs/render/primitives/mesh/MeshBuilderMap.js +12 -1
  31. package/lib/cjs/render/primitives/mesh/MeshBuilderMap.js.map +1 -1
  32. package/lib/cjs/render/primitives/mesh/MeshPrimitives.d.ts +45 -28
  33. package/lib/cjs/render/primitives/mesh/MeshPrimitives.d.ts.map +1 -1
  34. package/lib/cjs/render/primitives/mesh/MeshPrimitives.js +107 -146
  35. package/lib/cjs/render/primitives/mesh/MeshPrimitives.js.map +1 -1
  36. package/lib/cjs/render/webgl/CachedGeometry.d.ts +6 -0
  37. package/lib/cjs/render/webgl/CachedGeometry.d.ts.map +1 -1
  38. package/lib/cjs/render/webgl/CachedGeometry.js +6 -0
  39. package/lib/cjs/render/webgl/CachedGeometry.js.map +1 -1
  40. package/lib/cjs/render/webgl/ShaderBuilder.d.ts +8 -7
  41. package/lib/cjs/render/webgl/ShaderBuilder.d.ts.map +1 -1
  42. package/lib/cjs/render/webgl/ShaderBuilder.js +12 -5
  43. package/lib/cjs/render/webgl/ShaderBuilder.js.map +1 -1
  44. package/lib/cjs/render/webgl/VertexLUT.d.ts +2 -1
  45. package/lib/cjs/render/webgl/VertexLUT.d.ts.map +1 -1
  46. package/lib/cjs/render/webgl/VertexLUT.js +4 -3
  47. package/lib/cjs/render/webgl/VertexLUT.js.map +1 -1
  48. package/lib/cjs/render/webgl/glsl/Color.js +1 -1
  49. package/lib/cjs/render/webgl/glsl/Color.js.map +1 -1
  50. package/lib/cjs/render/webgl/glsl/Decode.d.ts +6 -0
  51. package/lib/cjs/render/webgl/glsl/Decode.d.ts.map +1 -1
  52. package/lib/cjs/render/webgl/glsl/Decode.js +18 -1
  53. package/lib/cjs/render/webgl/glsl/Decode.js.map +1 -1
  54. package/lib/cjs/render/webgl/glsl/Edge.d.ts.map +1 -1
  55. package/lib/cjs/render/webgl/glsl/Edge.js +15 -6
  56. package/lib/cjs/render/webgl/glsl/Edge.js.map +1 -1
  57. package/lib/cjs/render/webgl/glsl/PointString.d.ts.map +1 -1
  58. package/lib/cjs/render/webgl/glsl/PointString.js +1 -1
  59. package/lib/cjs/render/webgl/glsl/PointString.js.map +1 -1
  60. package/lib/cjs/render/webgl/glsl/Polyline.d.ts +2 -2
  61. package/lib/cjs/render/webgl/glsl/Polyline.d.ts.map +1 -1
  62. package/lib/cjs/render/webgl/glsl/Polyline.js +24 -9
  63. package/lib/cjs/render/webgl/glsl/Polyline.js.map +1 -1
  64. package/lib/cjs/render/webgl/glsl/Surface.d.ts.map +1 -1
  65. package/lib/cjs/render/webgl/glsl/Surface.js +18 -19
  66. package/lib/cjs/render/webgl/glsl/Surface.js.map +1 -1
  67. package/lib/cjs/render/webgl/glsl/Thematic.d.ts.map +1 -1
  68. package/lib/cjs/render/webgl/glsl/Thematic.js +1 -6
  69. package/lib/cjs/render/webgl/glsl/Thematic.js.map +1 -1
  70. package/lib/cjs/render/webgl/glsl/Vertex.d.ts.map +1 -1
  71. package/lib/cjs/render/webgl/glsl/Vertex.js +31 -14
  72. package/lib/cjs/render/webgl/glsl/Vertex.js.map +1 -1
  73. package/lib/cjs/tile/GltfReader.d.ts.map +1 -1
  74. package/lib/cjs/tile/GltfReader.js +8 -6
  75. package/lib/cjs/tile/GltfReader.js.map +1 -1
  76. package/lib/cjs/tile/map/BingElevation.d.ts +2 -16
  77. package/lib/cjs/tile/map/BingElevation.d.ts.map +1 -1
  78. package/lib/cjs/tile/map/BingElevation.js +1 -63
  79. package/lib/cjs/tile/map/BingElevation.js.map +1 -1
  80. package/lib/esm/HitDetail.js.map +1 -1
  81. package/lib/esm/render/ParticleCollectionBuilder.d.ts.map +1 -1
  82. package/lib/esm/render/ParticleCollectionBuilder.js +17 -10
  83. package/lib/esm/render/ParticleCollectionBuilder.js.map +1 -1
  84. package/lib/esm/render/RenderSystem.d.ts.map +1 -1
  85. package/lib/esm/render/RenderSystem.js +20 -18
  86. package/lib/esm/render/RenderSystem.js.map +1 -1
  87. package/lib/esm/render/primitives/EdgeParams.d.ts.map +1 -1
  88. package/lib/esm/render/primitives/EdgeParams.js +3 -1
  89. package/lib/esm/render/primitives/EdgeParams.js.map +1 -1
  90. package/lib/esm/render/primitives/PolylineParams.d.ts.map +1 -1
  91. package/lib/esm/render/primitives/PolylineParams.js +11 -6
  92. package/lib/esm/render/primitives/PolylineParams.js.map +1 -1
  93. package/lib/esm/render/primitives/VertexKey.d.ts +11 -8
  94. package/lib/esm/render/primitives/VertexKey.d.ts.map +1 -1
  95. package/lib/esm/render/primitives/VertexKey.js +24 -6
  96. package/lib/esm/render/primitives/VertexKey.js.map +1 -1
  97. package/lib/esm/render/primitives/VertexTable.d.ts +15 -2
  98. package/lib/esm/render/primitives/VertexTable.d.ts.map +1 -1
  99. package/lib/esm/render/primitives/VertexTable.js +274 -109
  100. package/lib/esm/render/primitives/VertexTable.js.map +1 -1
  101. package/lib/esm/render/primitives/geometry/GeometryAccumulator.d.ts.map +1 -1
  102. package/lib/esm/render/primitives/geometry/GeometryAccumulator.js +23 -11
  103. package/lib/esm/render/primitives/geometry/GeometryAccumulator.js.map +1 -1
  104. package/lib/esm/render/primitives/mesh/MeshBuilder.d.ts +4 -6
  105. package/lib/esm/render/primitives/mesh/MeshBuilder.d.ts.map +1 -1
  106. package/lib/esm/render/primitives/mesh/MeshBuilder.js +17 -14
  107. package/lib/esm/render/primitives/mesh/MeshBuilder.js.map +1 -1
  108. package/lib/esm/render/primitives/mesh/MeshBuilderMap.d.ts.map +1 -1
  109. package/lib/esm/render/primitives/mesh/MeshBuilderMap.js +12 -1
  110. package/lib/esm/render/primitives/mesh/MeshBuilderMap.js.map +1 -1
  111. package/lib/esm/render/primitives/mesh/MeshPrimitives.d.ts +45 -28
  112. package/lib/esm/render/primitives/mesh/MeshPrimitives.d.ts.map +1 -1
  113. package/lib/esm/render/primitives/mesh/MeshPrimitives.js +108 -144
  114. package/lib/esm/render/primitives/mesh/MeshPrimitives.js.map +1 -1
  115. package/lib/esm/render/webgl/CachedGeometry.d.ts +6 -0
  116. package/lib/esm/render/webgl/CachedGeometry.d.ts.map +1 -1
  117. package/lib/esm/render/webgl/CachedGeometry.js +6 -0
  118. package/lib/esm/render/webgl/CachedGeometry.js.map +1 -1
  119. package/lib/esm/render/webgl/ShaderBuilder.d.ts +8 -7
  120. package/lib/esm/render/webgl/ShaderBuilder.d.ts.map +1 -1
  121. package/lib/esm/render/webgl/ShaderBuilder.js +12 -5
  122. package/lib/esm/render/webgl/ShaderBuilder.js.map +1 -1
  123. package/lib/esm/render/webgl/VertexLUT.d.ts +2 -1
  124. package/lib/esm/render/webgl/VertexLUT.d.ts.map +1 -1
  125. package/lib/esm/render/webgl/VertexLUT.js +4 -3
  126. package/lib/esm/render/webgl/VertexLUT.js.map +1 -1
  127. package/lib/esm/render/webgl/glsl/Color.js +1 -1
  128. package/lib/esm/render/webgl/glsl/Color.js.map +1 -1
  129. package/lib/esm/render/webgl/glsl/Decode.d.ts +6 -0
  130. package/lib/esm/render/webgl/glsl/Decode.d.ts.map +1 -1
  131. package/lib/esm/render/webgl/glsl/Decode.js +17 -0
  132. package/lib/esm/render/webgl/glsl/Decode.js.map +1 -1
  133. package/lib/esm/render/webgl/glsl/Edge.d.ts.map +1 -1
  134. package/lib/esm/render/webgl/glsl/Edge.js +15 -6
  135. package/lib/esm/render/webgl/glsl/Edge.js.map +1 -1
  136. package/lib/esm/render/webgl/glsl/PointString.d.ts.map +1 -1
  137. package/lib/esm/render/webgl/glsl/PointString.js +1 -1
  138. package/lib/esm/render/webgl/glsl/PointString.js.map +1 -1
  139. package/lib/esm/render/webgl/glsl/Polyline.d.ts +2 -2
  140. package/lib/esm/render/webgl/glsl/Polyline.d.ts.map +1 -1
  141. package/lib/esm/render/webgl/glsl/Polyline.js +24 -9
  142. package/lib/esm/render/webgl/glsl/Polyline.js.map +1 -1
  143. package/lib/esm/render/webgl/glsl/Surface.d.ts.map +1 -1
  144. package/lib/esm/render/webgl/glsl/Surface.js +18 -19
  145. package/lib/esm/render/webgl/glsl/Surface.js.map +1 -1
  146. package/lib/esm/render/webgl/glsl/Thematic.d.ts.map +1 -1
  147. package/lib/esm/render/webgl/glsl/Thematic.js +1 -6
  148. package/lib/esm/render/webgl/glsl/Thematic.js.map +1 -1
  149. package/lib/esm/render/webgl/glsl/Vertex.d.ts.map +1 -1
  150. package/lib/esm/render/webgl/glsl/Vertex.js +32 -15
  151. package/lib/esm/render/webgl/glsl/Vertex.js.map +1 -1
  152. package/lib/esm/tile/GltfReader.d.ts.map +1 -1
  153. package/lib/esm/tile/GltfReader.js +9 -7
  154. package/lib/esm/tile/GltfReader.js.map +1 -1
  155. package/lib/esm/tile/map/BingElevation.d.ts +2 -16
  156. package/lib/esm/tile/map/BingElevation.d.ts.map +1 -1
  157. package/lib/esm/tile/map/BingElevation.js +1 -63
  158. package/lib/esm/tile/map/BingElevation.js.map +1 -1
  159. package/package.json +20 -20
@@ -1,22 +1,10 @@
1
- /** @packageDocumentation
2
- * @module Tiles
3
- */
4
- import { Point3d, Range1d, Range2d } from "@itwin/core-geometry";
5
- import { Cartographic, RenderTexture } from "@itwin/core-common";
6
1
  import { IModelConnection } from "../../IModelConnection";
7
- import { RenderGraphic } from "../../render/RenderGraphic";
8
- import { RenderSystem } from "../../render/RenderSystem";
2
+ import { Cartographic } from "@itwin/core-common";
3
+ import { Point3d, Range1d } from "@itwin/core-geometry";
9
4
  /** Provides an interface to the [Bing Maps elevation services](https://docs.microsoft.com/en-us/bingmaps/rest-services/elevations/).
10
5
  * @public
11
6
  */
12
7
  export declare class BingElevationProvider {
13
- private static _scratchRange;
14
- private static _scratchVertex;
15
- private static _scratchQParams;
16
- private static _scratchQPoint;
17
- private static _scratchMeshArgs;
18
- private static _scratchUV;
19
- private static _scratchPoint;
20
8
  private _heightRangeRequestTemplate;
21
9
  private _seaLevelOffsetRequestTemplate;
22
10
  private _heightListRequestTemplate;
@@ -45,7 +33,5 @@ export declare class BingElevationProvider {
45
33
  * @public
46
34
  */
47
35
  getHeightAverage(iModel: IModelConnection): Promise<number>;
48
- /** @internal */
49
- getGraphic(latLongRange: Range2d, corners: Point3d[], groundBias: number, texture: RenderTexture, system: RenderSystem): Promise<RenderGraphic | undefined>;
50
36
  }
51
37
  //# sourceMappingURL=BingElevation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BingElevation.d.ts","sourceRoot":"","sources":["../../../../src/tile/map/BingElevation.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,OAAO,EAA0B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAW,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,YAAY,EAAwD,aAAa,EAAkB,MAAM,oBAAoB,CAAC;AAGvI,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAM1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAIzD;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAwB;IACpD,OAAO,CAAC,MAAM,CAAC,cAAc,CAAwB;IACrD,OAAO,CAAC,MAAM,CAAC,eAAe,CAA4D;IAC1F,OAAO,CAAC,MAAM,CAAC,cAAc,CAAgG;IAC7H,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAkB;IACjD,OAAO,CAAC,MAAM,CAAC,UAAU,CAAwB;IACjD,OAAO,CAAC,MAAM,CAAC,aAAa,CAAwB;IAEpD,OAAO,CAAC,2BAA2B,CAAS;IAC5C,OAAO,CAAC,8BAA8B,CAAS;IAC/C,OAAO,CAAC,0BAA0B,CAAS;IAE3C,cAAc;;IAWd;;;OAGG;IACU,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,UAAO;IAY3D,gBAAgB;YACF,UAAU;IAWxB,gBAAgB;IACH,2BAA2B,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAanG;;;;OAIG;IACU,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,UAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvG;;OAEG;IACU,cAAc,CAAC,MAAM,EAAE,gBAAgB;IAYpD;;OAEG;IACU,gBAAgB,CAAC,MAAM,EAAE,gBAAgB;IAWtD,gBAAgB;IACH,UAAU,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;CAoDzK"}
1
+ {"version":3,"file":"BingElevation.d.ts","sourceRoot":"","sources":["../../../../src/tile/map/BingElevation.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAW,MAAM,sBAAsB,CAAC;AAIjE;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,2BAA2B,CAAS;IAC5C,OAAO,CAAC,8BAA8B,CAAS;IAC/C,OAAO,CAAC,0BAA0B,CAAS;IAE3C,cAAc;;IAWd;;;OAGG;IACU,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,UAAO;IAY3D,gBAAgB;YACF,UAAU;IAWxB,gBAAgB;IACH,2BAA2B,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAanG;;;;OAIG;IACU,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,UAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvG;;OAEG;IACU,cAAc,CAAC,MAAM,EAAE,gBAAgB;IAYpD;;OAEG;IACU,gBAAgB,CAAC,MAAM,EAAE,gBAAgB;CAWvD"}
@@ -8,15 +8,9 @@ exports.BingElevationProvider = void 0;
8
8
  /** @packageDocumentation
9
9
  * @module Tiles
10
10
  */
11
- const core_geometry_1 = require("@itwin/core-geometry");
12
- const core_common_1 = require("@itwin/core-common");
13
11
  const Request_1 = require("../../request/Request");
14
12
  const IModelApp_1 = require("../../IModelApp");
15
- const MeshPrimitives_1 = require("../../render/primitives/mesh/MeshPrimitives");
16
- const DisplayParams_1 = require("../../render/primitives/DisplayParams");
17
- const Primitives_1 = require("../../render/primitives/Primitives");
18
- const VertexKey_1 = require("../../render/primitives/VertexKey");
19
- const VertexTable_1 = require("../../render/primitives/VertexTable");
13
+ const core_geometry_1 = require("@itwin/core-geometry");
20
14
  // cspell:ignore atae qdng uyzv auje sealevel
21
15
  /** Provides an interface to the [Bing Maps elevation services](https://docs.microsoft.com/en-us/bingmaps/rest-services/elevations/).
22
16
  * @public
@@ -114,62 +108,6 @@ class BingElevationProvider {
114
108
  total += height;
115
109
  return total / heights.length;
116
110
  }
117
- /** @internal */
118
- async getGraphic(latLongRange, corners, groundBias, texture, system) {
119
- const heights = await this.getHeights(latLongRange);
120
- if (undefined === heights)
121
- return undefined;
122
- const patch = new core_geometry_1.BilinearPatch(corners[0], corners[1], corners[2], corners[3]);
123
- const textureParams = new core_common_1.TextureMapping.Params({ mapMode: core_common_1.TextureMapping.Mode.Parametric });
124
- const textureMapping = new core_common_1.TextureMapping(texture, textureParams);
125
- const displayParams = new DisplayParams_1.DisplayParams(DisplayParams_1.DisplayParams.Type.Mesh, core_common_1.ColorDef.white, core_common_1.ColorDef.white, 0.0, core_common_1.LinePixels.Solid, core_common_1.FillFlags.None, undefined, undefined, false, textureMapping);
126
- BingElevationProvider._scratchRange.setNull();
127
- BingElevationProvider._scratchRange.extendArray(corners);
128
- BingElevationProvider._scratchRange.low.z = 10E8;
129
- BingElevationProvider._scratchRange.high.z = -1.0E8;
130
- for (const height of heights) {
131
- BingElevationProvider._scratchRange.low.z = Math.min(BingElevationProvider._scratchRange.low.z, height);
132
- BingElevationProvider._scratchRange.high.z = Math.max(BingElevationProvider._scratchRange.high.z, height);
133
- }
134
- BingElevationProvider._scratchRange.low.z += groundBias;
135
- BingElevationProvider._scratchRange.high.z += groundBias;
136
- BingElevationProvider._scratchQParams.setFromRange(BingElevationProvider._scratchRange);
137
- const mesh = MeshPrimitives_1.Mesh.create({ displayParams, type: MeshPrimitives_1.Mesh.PrimitiveType.Mesh, range: BingElevationProvider._scratchRange, isPlanar: false, is2d: false });
138
- const size = 16;
139
- const sizeM1 = size - 1;
140
- const triangle0 = new Primitives_1.Triangle(false), triangle1 = new Primitives_1.Triangle(false);
141
- for (let row = 0; row < sizeM1; row++) {
142
- const thisRowIndex = row * size;
143
- const nextRowIndex = thisRowIndex + size;
144
- for (let col = 0; col < size - 1; col++) {
145
- const q0 = thisRowIndex + col, q1 = q0 + 1, q3 = nextRowIndex + col, q2 = q3 + 1;
146
- triangle0.setIndices(q0, q1, q2);
147
- triangle1.setIndices(q0, q2, q3);
148
- mesh.addTriangle(triangle0);
149
- mesh.addTriangle(triangle1);
150
- }
151
- }
152
- BingElevationProvider._scratchUV.y = 0.0;
153
- const delta = 1.0 / sizeM1;
154
- for (let row = 0; row < size; row++, BingElevationProvider._scratchUV.y += delta) {
155
- BingElevationProvider._scratchUV.x = 0;
156
- for (let col = 0; col < size; col++, BingElevationProvider._scratchUV.x += delta) {
157
- patch.uvFractionToPoint(BingElevationProvider._scratchUV.x, BingElevationProvider._scratchUV.y, BingElevationProvider._scratchPoint);
158
- BingElevationProvider._scratchPoint.z = groundBias + heights[(sizeM1 - row) * size + col];
159
- BingElevationProvider._scratchQPoint.init(BingElevationProvider._scratchPoint, BingElevationProvider._scratchQParams);
160
- mesh.addVertex(VertexKey_1.VertexKey.create({ position: BingElevationProvider._scratchQPoint, fillColor: 0xffffff, uvParam: BingElevationProvider._scratchUV }));
161
- }
162
- }
163
- BingElevationProvider._scratchMeshArgs.init(mesh);
164
- return system.createMesh(VertexTable_1.MeshParams.create(BingElevationProvider._scratchMeshArgs));
165
- }
166
111
  }
167
112
  exports.BingElevationProvider = BingElevationProvider;
168
- BingElevationProvider._scratchRange = core_geometry_1.Range3d.createNull();
169
- BingElevationProvider._scratchVertex = core_geometry_1.Point3d.createZero();
170
- BingElevationProvider._scratchQParams = core_common_1.QParams3d.fromRange(BingElevationProvider._scratchRange);
171
- BingElevationProvider._scratchQPoint = core_common_1.QPoint3d.create(BingElevationProvider._scratchVertex, BingElevationProvider._scratchQParams);
172
- BingElevationProvider._scratchMeshArgs = new MeshPrimitives_1.MeshArgs();
173
- BingElevationProvider._scratchUV = core_geometry_1.Point2d.createZero();
174
- BingElevationProvider._scratchPoint = core_geometry_1.Point3d.createZero();
175
113
  //# sourceMappingURL=BingElevation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BingElevation.js","sourceRoot":"","sources":["../../../../src/tile/map/BingElevation.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\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\nimport { BilinearPatch, Point2d, Point3d, Range1d, Range2d, Range3d } from \"@itwin/core-geometry\";\r\nimport { Cartographic, ColorDef, FillFlags, LinePixels, QParams3d, QPoint3d, RenderTexture, TextureMapping } from \"@itwin/core-common\";\r\nimport { request, RequestOptions, Response } from \"../../request/Request\";\r\nimport { IModelApp } from \"../../IModelApp\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport { Mesh, MeshArgs } from \"../../render/primitives/mesh/MeshPrimitives\";\r\nimport { DisplayParams } from \"../../render/primitives/DisplayParams\";\r\nimport { Triangle } from \"../../render/primitives/Primitives\";\r\nimport { VertexKey } from \"../../render/primitives/VertexKey\";\r\nimport { MeshParams } from \"../../render/primitives/VertexTable\";\r\nimport { RenderGraphic } from \"../../render/RenderGraphic\";\r\nimport { RenderSystem } from \"../../render/RenderSystem\";\r\n\r\n// cspell:ignore atae qdng uyzv auje sealevel\r\n\r\n/** Provides an interface to the [Bing Maps elevation services](https://docs.microsoft.com/en-us/bingmaps/rest-services/elevations/).\r\n * @public\r\n */\r\nexport class BingElevationProvider {\r\n private static _scratchRange = Range3d.createNull();\r\n private static _scratchVertex = Point3d.createZero();\r\n private static _scratchQParams = QParams3d.fromRange(BingElevationProvider._scratchRange);\r\n private static _scratchQPoint = QPoint3d.create(BingElevationProvider._scratchVertex, BingElevationProvider._scratchQParams);\r\n private static _scratchMeshArgs = new MeshArgs();\r\n private static _scratchUV = Point2d.createZero();\r\n private static _scratchPoint = Point3d.createZero();\r\n\r\n private _heightRangeRequestTemplate: string;\r\n private _seaLevelOffsetRequestTemplate: string;\r\n private _heightListRequestTemplate: string;\r\n\r\n /** @public */\r\n constructor() {\r\n let bingKey = \"\";\r\n if (IModelApp.mapLayerFormatRegistry.configOptions.BingMaps) {\r\n bingKey = IModelApp.mapLayerFormatRegistry.configOptions.BingMaps.value;\r\n }\r\n this._heightRangeRequestTemplate = \"https://dev.virtualearth.net/REST/v1/Elevation/Bounds?bounds={boundingBox}&rows=16&cols=16&heights=ellipsoid&key={BingMapsAPIKey}\".replace(\"{BingMapsAPIKey}\", bingKey);\r\n this._seaLevelOffsetRequestTemplate = \"https://dev.virtualearth.net/REST/v1/Elevation/SeaLevel?points={points}&key={BingMapsAPIKey}\".replace(\"{BingMapsAPIKey}\", bingKey);\r\n this._heightListRequestTemplate = \"https://dev.virtualearth.net/REST/v1/Elevation/List?points={points}&heights={heights}&key={BingMapsAPIKey}\".replace(\"{BingMapsAPIKey}\", bingKey);\r\n }\r\n\r\n /** Return the height (altitude) at a given cartographic location.\r\n * If geodetic is true (the default) then height is returned in the Ellipsoidal WGS84 datum. If geodetic is false then the sea level height id returned using the Earth Gravitational Model 2008 (EGM2008 2.5’).\r\n * @public\r\n */\r\n public async getHeight(carto: Cartographic, geodetic = true) {\r\n if (undefined === carto)\r\n return 0.0;\r\n const requestUrl = this._heightListRequestTemplate.replace(\"{points}\", `${carto.latitudeDegrees},${carto.longitudeDegrees}`).replace(\"{heights}\", geodetic ? \"ellipsoid\" : \"sealevel\");\r\n const requestOptions: RequestOptions = { method: \"GET\", responseType: \"json\" };\r\n try {\r\n const tileResponse: Response = await request(requestUrl, requestOptions);\r\n return tileResponse.body.resourceSets[0].resources[0].elevations[0];\r\n } catch (error) {\r\n return 0.0;\r\n }\r\n }\r\n /** @internal */\r\n private async getHeights(range: Range2d) {\r\n const boundingBox = `${range.low.y},${range.low.x},${range.high.y},${range.high.x}`;\r\n const requestUrl = this._heightRangeRequestTemplate.replace(\"{boundingBox}\", boundingBox);\r\n const tileRequestOptions: RequestOptions = { method: \"GET\", responseType: \"json\" };\r\n try {\r\n const tileResponse: Response = await request(requestUrl, tileRequestOptions);\r\n return tileResponse.body.resourceSets[0].resources[0].elevations;\r\n } catch (error) {\r\n return undefined;\r\n }\r\n }\r\n /** @internal */\r\n public async getGeodeticToSeaLevelOffset(point: Point3d, iModel: IModelConnection): Promise<number> {\r\n const carto = iModel.spatialToCartographicFromEcef(point);\r\n if (carto === undefined)\r\n return 0.0;\r\n const requestUrl = this._seaLevelOffsetRequestTemplate.replace(\"{points}\", `${carto.latitudeDegrees},${carto.longitudeDegrees}`);\r\n const requestOptions: RequestOptions = { method: \"GET\", responseType: \"json\" };\r\n try {\r\n const tileResponse: Response = await request(requestUrl, requestOptions);\r\n return tileResponse.body.resourceSets[0].resources[0].offsets[0];\r\n } catch (error) {\r\n return 0.0;\r\n }\r\n }\r\n /** Get the height (altitude) at a given iModel coordinate. The height is geodetic (WGS84 ellipsoid)\r\n * If geodetic is true (the default) then height is returned in the Ellipsoidal WGS84 datum. If geodetic is false then sea level height is returned using the Earth Gravitational Model 2008 (EGM2008 2.5’).\r\n *\r\n * @public\r\n */\r\n public async getHeightValue(point: Point3d, iModel: IModelConnection, geodetic = true): Promise<number> {\r\n return this.getHeight(iModel.spatialToCartographicFromEcef(point), geodetic);\r\n }\r\n\r\n /** Get the height (altitude) range for a given iModel project extents. The height values are geodetic (WGS84 ellipsoid).\r\n * @public\r\n */\r\n public async getHeightRange(iModel: IModelConnection) {\r\n const latLongRange = Range2d.createNull();\r\n const range = iModel.projectExtents.clone();\r\n range.expandInPlace(1000.); // Expand for project surroundings.\r\n for (const corner of range.corners()) {\r\n const carto = iModel.spatialToCartographicFromEcef(corner);\r\n latLongRange.extendXY(carto.longitudeDegrees, carto.latitudeDegrees);\r\n }\r\n const heights = await this.getHeights(latLongRange);\r\n return Range1d.createArray(heights);\r\n }\r\n\r\n /** Get the average height (altitude) for a given iModel project extents. The height values are geodetic (WGS84 ellipsoid).\r\n * @public\r\n */\r\n public async getHeightAverage(iModel: IModelConnection) {\r\n const latLongRange = Range2d.createNull();\r\n for (const corner of iModel.projectExtents.corners()) {\r\n const carto = iModel.spatialToCartographicFromEcef(corner);\r\n latLongRange.extendXY(carto.longitudeDegrees, carto.latitudeDegrees);\r\n }\r\n const heights = await this.getHeights(latLongRange);\r\n let total = 0.0;\r\n for (const height of heights) total += height;\r\n return total / heights.length;\r\n }\r\n /** @internal */\r\n public async getGraphic(latLongRange: Range2d, corners: Point3d[], groundBias: number, texture: RenderTexture, system: RenderSystem): Promise<RenderGraphic | undefined> {\r\n const heights = await this.getHeights(latLongRange);\r\n if (undefined === heights)\r\n return undefined;\r\n\r\n const patch = new BilinearPatch(corners[0], corners[1], corners[2], corners[3]);\r\n const textureParams = new TextureMapping.Params({ mapMode: TextureMapping.Mode.Parametric });\r\n const textureMapping = new TextureMapping(texture, textureParams);\r\n const displayParams = new DisplayParams(DisplayParams.Type.Mesh, ColorDef.white, ColorDef.white, 0.0, LinePixels.Solid, FillFlags.None, undefined, undefined, false, textureMapping);\r\n BingElevationProvider._scratchRange.setNull();\r\n BingElevationProvider._scratchRange.extendArray(corners);\r\n BingElevationProvider._scratchRange.low.z = 10E8;\r\n BingElevationProvider._scratchRange.high.z = -1.0E8;\r\n\r\n for (const height of heights) {\r\n BingElevationProvider._scratchRange.low.z = Math.min(BingElevationProvider._scratchRange.low.z, height);\r\n BingElevationProvider._scratchRange.high.z = Math.max(BingElevationProvider._scratchRange.high.z, height);\r\n }\r\n\r\n BingElevationProvider._scratchRange.low.z += groundBias;\r\n BingElevationProvider._scratchRange.high.z += groundBias;\r\n\r\n BingElevationProvider._scratchQParams.setFromRange(BingElevationProvider._scratchRange);\r\n const mesh = Mesh.create({ displayParams, type: Mesh.PrimitiveType.Mesh, range: BingElevationProvider._scratchRange, isPlanar: false, is2d: false });\r\n const size = 16;\r\n const sizeM1 = size - 1;\r\n const triangle0 = new Triangle(false), triangle1 = new Triangle(false);\r\n for (let row = 0; row < sizeM1; row++) {\r\n const thisRowIndex = row * size;\r\n const nextRowIndex = thisRowIndex + size;\r\n for (let col = 0; col < size - 1; col++) {\r\n const q0 = thisRowIndex + col, q1 = q0 + 1, q3 = nextRowIndex + col, q2 = q3 + 1;\r\n triangle0.setIndices(q0, q1, q2);\r\n triangle1.setIndices(q0, q2, q3);\r\n mesh.addTriangle(triangle0);\r\n mesh.addTriangle(triangle1);\r\n }\r\n }\r\n BingElevationProvider._scratchUV.y = 0.0;\r\n const delta = 1.0 / sizeM1;\r\n for (let row = 0; row < size; row++, BingElevationProvider._scratchUV.y += delta) {\r\n BingElevationProvider._scratchUV.x = 0;\r\n for (let col = 0; col < size; col++, BingElevationProvider._scratchUV.x += delta) {\r\n patch.uvFractionToPoint(BingElevationProvider._scratchUV.x, BingElevationProvider._scratchUV.y, BingElevationProvider._scratchPoint);\r\n BingElevationProvider._scratchPoint.z = groundBias + heights[(sizeM1 - row) * size + col];\r\n BingElevationProvider._scratchQPoint.init(BingElevationProvider._scratchPoint, BingElevationProvider._scratchQParams);\r\n mesh.addVertex(VertexKey.create({ position: BingElevationProvider._scratchQPoint, fillColor: 0xffffff, uvParam: BingElevationProvider._scratchUV }));\r\n }\r\n }\r\n BingElevationProvider._scratchMeshArgs.init(mesh);\r\n return system.createMesh(MeshParams.create(BingElevationProvider._scratchMeshArgs));\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BingElevation.js","sourceRoot":"","sources":["../../../../src/tile/map/BingElevation.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F;;GAEG;AACH,mDAA0E;AAC1E,+CAA4C;AAG5C,wDAAiE;AAEjE,6CAA6C;AAE7C;;GAEG;AACH,MAAa,qBAAqB;IAKhC,cAAc;IACd;QACE,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,qBAAS,CAAC,sBAAsB,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC3D,OAAO,GAAG,qBAAS,CAAC,sBAAsB,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;SACzE;QACD,IAAI,CAAC,2BAA2B,GAAG,mIAAmI,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAC5M,IAAI,CAAC,8BAA8B,GAAG,8FAA8F,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAC1K,IAAI,CAAC,0BAA0B,GAAG,4GAA4G,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACtL,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,SAAS,CAAC,KAAmB,EAAE,QAAQ,GAAG,IAAI;QACzD,IAAI,SAAS,KAAK,KAAK;YACrB,OAAO,GAAG,CAAC;QACb,MAAM,UAAU,GAAG,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACvL,MAAM,cAAc,GAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAC/E,IAAI;YACF,MAAM,YAAY,GAAa,MAAM,IAAA,iBAAO,EAAC,UAAU,EAAE,cAAc,CAAC,CAAC;YACzE,OAAO,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SACrE;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,GAAG,CAAC;SACZ;IACH,CAAC;IACD,gBAAgB;IACR,KAAK,CAAC,UAAU,CAAC,KAAc;QACrC,MAAM,WAAW,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACpF,MAAM,UAAU,GAAG,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAC1F,MAAM,kBAAkB,GAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QACnF,IAAI;YACF,MAAM,YAAY,GAAa,MAAM,IAAA,iBAAO,EAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;YAC7E,OAAO,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;SAClE;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,SAAS,CAAC;SAClB;IACH,CAAC;IACD,gBAAgB;IACT,KAAK,CAAC,2BAA2B,CAAC,KAAc,EAAE,MAAwB;QAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,6BAA6B,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,KAAK,KAAK,SAAS;YACrB,OAAO,GAAG,CAAC;QACb,MAAM,UAAU,GAAG,IAAI,CAAC,8BAA8B,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACjI,MAAM,cAAc,GAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAC/E,IAAI;YACF,MAAM,YAAY,GAAa,MAAM,IAAA,iBAAO,EAAC,UAAU,EAAE,cAAc,CAAC,CAAC;YACzE,OAAO,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SAClE;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,GAAG,CAAC;SACZ;IACH,CAAC;IACD;;;;OAIG;IACI,KAAK,CAAC,cAAc,CAAC,KAAc,EAAE,MAAwB,EAAE,QAAQ,GAAG,IAAI;QACnF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,6BAA6B,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,cAAc,CAAC,MAAwB;QAClD,MAAM,YAAY,GAAG,uBAAO,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5C,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAS,mCAAmC;QACvE,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,MAAM,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC;YAC3D,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;SACtE;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACpD,OAAO,uBAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,gBAAgB,CAAC,MAAwB;QACpD,MAAM,YAAY,GAAG,uBAAO,CAAC,UAAU,EAAE,CAAC;QAC1C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE;YACpD,MAAM,KAAK,GAAG,MAAM,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC;YAC3D,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;SACtE;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACpD,IAAI,KAAK,GAAG,GAAG,CAAC;QAChB,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,KAAK,IAAI,MAAM,CAAC;QAC9C,OAAO,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAChC,CAAC;CACF;AAhGD,sDAgGC","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\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\nimport { request, RequestOptions, Response } from \"../../request/Request\";\r\nimport { IModelApp } from \"../../IModelApp\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport { Cartographic } from \"@itwin/core-common\";\r\nimport { Point3d, Range1d, Range2d } from \"@itwin/core-geometry\";\r\n\r\n// cspell:ignore atae qdng uyzv auje sealevel\r\n\r\n/** Provides an interface to the [Bing Maps elevation services](https://docs.microsoft.com/en-us/bingmaps/rest-services/elevations/).\r\n * @public\r\n */\r\nexport class BingElevationProvider {\r\n private _heightRangeRequestTemplate: string;\r\n private _seaLevelOffsetRequestTemplate: string;\r\n private _heightListRequestTemplate: string;\r\n\r\n /** @public */\r\n constructor() {\r\n let bingKey = \"\";\r\n if (IModelApp.mapLayerFormatRegistry.configOptions.BingMaps) {\r\n bingKey = IModelApp.mapLayerFormatRegistry.configOptions.BingMaps.value;\r\n }\r\n this._heightRangeRequestTemplate = \"https://dev.virtualearth.net/REST/v1/Elevation/Bounds?bounds={boundingBox}&rows=16&cols=16&heights=ellipsoid&key={BingMapsAPIKey}\".replace(\"{BingMapsAPIKey}\", bingKey);\r\n this._seaLevelOffsetRequestTemplate = \"https://dev.virtualearth.net/REST/v1/Elevation/SeaLevel?points={points}&key={BingMapsAPIKey}\".replace(\"{BingMapsAPIKey}\", bingKey);\r\n this._heightListRequestTemplate = \"https://dev.virtualearth.net/REST/v1/Elevation/List?points={points}&heights={heights}&key={BingMapsAPIKey}\".replace(\"{BingMapsAPIKey}\", bingKey);\r\n }\r\n\r\n /** Return the height (altitude) at a given cartographic location.\r\n * If geodetic is true (the default) then height is returned in the Ellipsoidal WGS84 datum. If geodetic is false then the sea level height id returned using the Earth Gravitational Model 2008 (EGM2008 2.5’).\r\n * @public\r\n */\r\n public async getHeight(carto: Cartographic, geodetic = true) {\r\n if (undefined === carto)\r\n return 0.0;\r\n const requestUrl = this._heightListRequestTemplate.replace(\"{points}\", `${carto.latitudeDegrees},${carto.longitudeDegrees}`).replace(\"{heights}\", geodetic ? \"ellipsoid\" : \"sealevel\");\r\n const requestOptions: RequestOptions = { method: \"GET\", responseType: \"json\" };\r\n try {\r\n const tileResponse: Response = await request(requestUrl, requestOptions);\r\n return tileResponse.body.resourceSets[0].resources[0].elevations[0];\r\n } catch (error) {\r\n return 0.0;\r\n }\r\n }\r\n /** @internal */\r\n private async getHeights(range: Range2d) {\r\n const boundingBox = `${range.low.y},${range.low.x},${range.high.y},${range.high.x}`;\r\n const requestUrl = this._heightRangeRequestTemplate.replace(\"{boundingBox}\", boundingBox);\r\n const tileRequestOptions: RequestOptions = { method: \"GET\", responseType: \"json\" };\r\n try {\r\n const tileResponse: Response = await request(requestUrl, tileRequestOptions);\r\n return tileResponse.body.resourceSets[0].resources[0].elevations;\r\n } catch (error) {\r\n return undefined;\r\n }\r\n }\r\n /** @internal */\r\n public async getGeodeticToSeaLevelOffset(point: Point3d, iModel: IModelConnection): Promise<number> {\r\n const carto = iModel.spatialToCartographicFromEcef(point);\r\n if (carto === undefined)\r\n return 0.0;\r\n const requestUrl = this._seaLevelOffsetRequestTemplate.replace(\"{points}\", `${carto.latitudeDegrees},${carto.longitudeDegrees}`);\r\n const requestOptions: RequestOptions = { method: \"GET\", responseType: \"json\" };\r\n try {\r\n const tileResponse: Response = await request(requestUrl, requestOptions);\r\n return tileResponse.body.resourceSets[0].resources[0].offsets[0];\r\n } catch (error) {\r\n return 0.0;\r\n }\r\n }\r\n /** Get the height (altitude) at a given iModel coordinate. The height is geodetic (WGS84 ellipsoid)\r\n * If geodetic is true (the default) then height is returned in the Ellipsoidal WGS84 datum. If geodetic is false then sea level height is returned using the Earth Gravitational Model 2008 (EGM2008 2.5’).\r\n *\r\n * @public\r\n */\r\n public async getHeightValue(point: Point3d, iModel: IModelConnection, geodetic = true): Promise<number> {\r\n return this.getHeight(iModel.spatialToCartographicFromEcef(point), geodetic);\r\n }\r\n\r\n /** Get the height (altitude) range for a given iModel project extents. The height values are geodetic (WGS84 ellipsoid).\r\n * @public\r\n */\r\n public async getHeightRange(iModel: IModelConnection) {\r\n const latLongRange = Range2d.createNull();\r\n const range = iModel.projectExtents.clone();\r\n range.expandInPlace(1000.); // Expand for project surroundings.\r\n for (const corner of range.corners()) {\r\n const carto = iModel.spatialToCartographicFromEcef(corner);\r\n latLongRange.extendXY(carto.longitudeDegrees, carto.latitudeDegrees);\r\n }\r\n const heights = await this.getHeights(latLongRange);\r\n return Range1d.createArray(heights);\r\n }\r\n\r\n /** Get the average height (altitude) for a given iModel project extents. The height values are geodetic (WGS84 ellipsoid).\r\n * @public\r\n */\r\n public async getHeightAverage(iModel: IModelConnection) {\r\n const latLongRange = Range2d.createNull();\r\n for (const corner of iModel.projectExtents.corners()) {\r\n const carto = iModel.spatialToCartographicFromEcef(corner);\r\n latLongRange.extendXY(carto.longitudeDegrees, carto.latitudeDegrees);\r\n }\r\n const heights = await this.getHeights(latLongRange);\r\n let total = 0.0;\r\n for (const height of heights) total += height;\r\n return total / heights.length;\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"HitDetail.js","sourceRoot":"","sources":["../../src/HitDetail.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 LocatingElements\r\n */\r\nimport { Id64 } from \"@itwin/core-bentley\";\r\nimport { Arc3d, CurvePrimitive, LineSegment3d, LineString3d, Path, Point3d, Transform, Vector3d, XYZProps } from \"@itwin/core-geometry\";\r\nimport { GeometryClass, LinePixels } from \"@itwin/core-common\";\r\nimport { IModelApp } from \"./IModelApp\";\r\nimport { IModelConnection } from \"./IModelConnection\";\r\nimport { GraphicType } from \"./render/GraphicBuilder\";\r\nimport { IconSprites, Sprite } from \"./Sprites\";\r\nimport { DecorateContext } from \"./ViewContext\";\r\nimport { ScreenViewport } from \"./Viewport\";\r\n\r\n/** @public */\r\nexport enum SnapMode {\r\n Nearest = 1,\r\n NearestKeypoint = 1 << 1,\r\n MidPoint = 1 << 2,\r\n Center = 1 << 3,\r\n Origin = 1 << 4,\r\n Bisector = 1 << 5,\r\n Intersection = 1 << 6,\r\n}\r\n\r\n/** @public */\r\nexport enum SnapHeat {\r\n None = 0,\r\n NotInRange = 1, // \"of interest\", but out of range\r\n InRange = 2,\r\n}\r\n\r\n/** The procedure that generated this Hit.\r\n * @public\r\n */\r\nexport enum HitSource {\r\n None = 0,\r\n FromUser = 1,\r\n MotionLocate = 2,\r\n AccuSnap = 3,\r\n TentativeSnap = 4,\r\n DataPoint = 5,\r\n Application = 6,\r\n EditAction = 7,\r\n EditActionSS = 8,\r\n}\r\n\r\n/** What was being tested to generate this hit. This is not the element or\r\n * GeometricPrimitive that generated the Hit, it is an indication of whether it is an edge or interior hit.\r\n * @public\r\n */\r\nexport enum HitGeomType {\r\n None = 0,\r\n Point = 1,\r\n Segment = 2,\r\n Curve = 3,\r\n Arc = 4,\r\n Surface = 5,\r\n}\r\n\r\n/** Classification of GeometricPrimitive that generated the Hit.\r\n * @public\r\n */\r\nexport enum HitParentGeomType {\r\n None = 0,\r\n Wire = 1,\r\n Sheet = 2,\r\n Solid = 3,\r\n Mesh = 4,\r\n Text = 5,\r\n}\r\n\r\n/** @public */\r\nexport enum HitPriority {\r\n WireEdge = 0,\r\n PlanarEdge = 1,\r\n NonPlanarEdge = 2,\r\n SilhouetteEdge = 3,\r\n PlanarSurface = 4,\r\n NonPlanarSurface = 5,\r\n Unknown = 6,\r\n}\r\n\r\n/** @public */\r\nexport enum HitDetailType {\r\n Hit = 1,\r\n Snap = 2,\r\n Intersection = 3,\r\n}\r\n\r\n/** A HitDetail stores the result when locating geometry displayed in a view.\r\n * It holds an approximate location on an element (or decoration) from a *pick*.\r\n * @public\r\n */\r\nexport class HitDetail {\r\n private readonly _iModel?: IModelConnection;\r\n /** @internal chiefly for debugging. */\r\n public readonly tileId?: string;\r\n /** @alpha */\r\n public readonly isClassifier: boolean;\r\n\r\n /** Create a new HitDetail from the inputs to and results of a locate operation.\r\n * @param testPoint The world coordinate space point that was used as the locate point.\r\n * @param viewport The view the locate operation was performed in.\r\n * @param hitSource The procedure that requested the locate operation.\r\n * @param hitPoint The approximate world coordinate location on the geometry identified by this HitDetail.\r\n * @param sourceId The source of the geometry, either a persistent element id or pickable decoration id.\r\n * @param priority The hit geometry priority/classification.\r\n * @param distXY The xy distance to hit in view coordinates.\r\n * @param distFraction The near plane distance fraction to hit.\r\n * @param subCategoryId The SubCategory for a persistent element hit.\r\n * @param geometryClass The GeometryClass for a persistent element hit.\r\n * @param iModel The IModelConnection from which the hit originated. This should almost always be left undefined, unless the hit is known to have originated from an iModel other than the one associated with the viewport.\r\n * @param modelId Optionally the Id of the [[ModelState]] from which the hit originated.\r\n * @param tileId Optionally the Id of the Tile from which the hit originated.\r\n * @param isClassifier Optionally whether the hit originated from a reality model classification.\r\n */\r\n public constructor(public readonly testPoint: Point3d, public readonly viewport: ScreenViewport, public readonly hitSource: HitSource,\r\n public readonly hitPoint: Point3d, public readonly sourceId: string, public readonly priority: HitPriority, public readonly distXY: number, public readonly distFraction: number,\r\n public readonly subCategoryId?: string, public readonly geometryClass?: GeometryClass, public readonly modelId?: string, iModel?: IModelConnection, tileId?: string, isClassifier?: boolean) {\r\n this._iModel = iModel;\r\n this.tileId = tileId;\r\n this.isClassifier = undefined !== isClassifier ? isClassifier : false;\r\n }\r\n\r\n /** Get the type of HitDetail.\r\n * @returns HitDetailType.Hit if this is a HitDetail, HitDetailType.Snap if it is a SnapDetail\r\n */\r\n public getHitType(): HitDetailType { return HitDetailType.Hit; }\r\n\r\n /** Get the *hit point* for this HitDetail. Returns the approximate point on the element that caused the hit when not a SnapDetail or IntersectDetail.\r\n * For a snap that is *hot*, the *exact* point on the Element for the snap mode is returned, otherwise the close point on the hit geometry is returned.\r\n */\r\n public getPoint(): Point3d { return this.hitPoint; }\r\n\r\n /** Determine if this HitPoint is from the same source as another HitDetail. */\r\n public isSameHit(otherHit?: HitDetail): boolean { return (undefined !== otherHit && this.sourceId === otherHit.sourceId && this.iModel === otherHit.iModel); }\r\n /** Return whether sourceId is for a persistent element and not a pickable decoration. */\r\n public get isElementHit(): boolean { return !Id64.isInvalid(this.sourceId) && !Id64.isTransient(this.sourceId); }\r\n // return whether the sourceId is for a model (reality models etc.)\r\n public get isModelHit(): boolean {\r\n return this.modelId === this.sourceId;\r\n }\r\n // return whether the hit point is from map.\r\n public get isMapHit(): boolean { return undefined !== this.viewport.mapLayerFromHit(this); }\r\n\r\n /** Create a deep copy of this HitDetail */\r\n public clone(): HitDetail {\r\n const val = new HitDetail(this.testPoint, this.viewport, this.hitSource, this.hitPoint, this.sourceId, this.priority, this.distXY, this.distFraction, this.subCategoryId, this.geometryClass, this.modelId, this._iModel, this.tileId, this.isClassifier);\r\n return val;\r\n }\r\n\r\n /** Draw this HitDetail as a Decoration. Causes the picked element to *flash* */\r\n public draw(_context: DecorateContext) {\r\n this.viewport.flashedId = this.sourceId;\r\n }\r\n\r\n /** Get the tooltip content for this HitDetail. */\r\n public async getToolTip(): Promise<HTMLElement | string> {\r\n let toolTipPromise = this.isElementHit ? IModelApp.viewManager.overrideElementToolTip(this) : IModelApp.viewManager.getDecorationToolTip(this);\r\n for (const toolTipProvider of IModelApp.viewManager.toolTipProviders)\r\n toolTipPromise = toolTipProvider.augmentToolTip(this, toolTipPromise);\r\n return toolTipPromise;\r\n }\r\n\r\n /** The IModelConnection from which the hit originated. In some cases this may not be the same as the iModel associated with the Viewport -\r\n * for example, if a [[TiledGraphicsProvider]] is used to display graphics from a different iModel in the viewport.\r\n * This HitDetail's element, subcategory, and model Ids are defined in the context of this IModelConnection.\r\n */\r\n public get iModel(): IModelConnection { return undefined !== this._iModel ? this._iModel : this.viewport.iModel; }\r\n\r\n /** Returns true if this hit originated from an [[IModelConnection]] other than the one associated with the [[Viewport]].\r\n * @see [[iModel]].\r\n */\r\n public get isExternalIModelHit(): boolean { return this.iModel !== this.viewport.iModel; }\r\n}\r\n\r\n/** A SnapDetail is generated from the result of a snap request. In addition to the HitDetail about the reason the element was *picked*,\r\n * it holds the *exact* point on the element from the snapping logic, plus additional information that varies with the type of element and snap mode.\r\n * @public\r\n */\r\nexport class SnapDetail extends HitDetail {\r\n /** A sprite to show the user the type of snap performed */\r\n public sprite?: Sprite;\r\n /** HitPoint adjusted by snap */\r\n public readonly snapPoint: Point3d;\r\n /** AccuSnap/AccuDraw can adjust the point after the snap. */\r\n public readonly adjustedPoint: Point3d;\r\n /** Curve primitive for snap. */\r\n public primitive?: CurvePrimitive;\r\n /** Surface normal at snapPoint */\r\n public normal?: Vector3d;\r\n /** The HitGeomType of this SnapDetail */\r\n public geomType?: HitGeomType;\r\n /** The HitGeomType of this SnapDetail */\r\n public parentGeomType?: HitParentGeomType;\r\n\r\n /** Constructor for SnapDetail.\r\n * @param from The HitDetail that created this snap\r\n * @param snapMode The SnapMode used to create this SnapDetail\r\n * @param heat The SnapHeat of this SnapDetail\r\n * @param snapPoint The snapped point in the element\r\n */\r\n public constructor(from: HitDetail, public snapMode: SnapMode = SnapMode.Nearest, public heat: SnapHeat = SnapHeat.None, snapPoint?: XYZProps) {\r\n super(from.testPoint, from.viewport, from.hitSource, from.hitPoint, from.sourceId, from.priority, from.distXY, from.distFraction, from.subCategoryId, from.geometryClass, from.modelId, from.iModel, from.tileId, from.isClassifier);\r\n this.snapPoint = Point3d.fromJSON(snapPoint ? snapPoint : from.hitPoint);\r\n this.adjustedPoint = this.snapPoint.clone();\r\n this.sprite = IconSprites.getSpriteFromUrl(SnapDetail.getSnapSpriteUrl(snapMode));\r\n }\r\n\r\n /** Returns `HitDetailType.Snap` */\r\n public override getHitType(): HitDetailType { return HitDetailType.Snap; }\r\n /** Get the snap point if this SnapDetail is *hot*, the pick point otherwise. */\r\n public override getPoint(): Point3d { return this.isHot ? this.snapPoint : super.getPoint(); }\r\n /** Return true if the pick point was closer than the snap aperture from the generated snap point. */\r\n public get isHot(): boolean { return this.heat !== SnapHeat.None; }\r\n /** Determine whether the [[adjustedPoint]] is different than the [[snapPoint]]. This happens, for example, when points are adjusted for grids, acs plane snap, and AccuDraw. */\r\n public get isPointAdjusted(): boolean { return !this.adjustedPoint.isExactEqual(this.snapPoint); }\r\n /** Change the snap point. */\r\n public setSnapPoint(point: Point3d, heat: SnapHeat) { this.snapPoint.setFrom(point); this.adjustedPoint.setFrom(point); this.heat = heat; }\r\n\r\n /** Set curve primitive and HitGeometryType for this SnapDetail. */\r\n public setCurvePrimitive(primitive?: CurvePrimitive, localToWorld?: Transform, geomType?: HitGeomType): void {\r\n this.primitive = primitive;\r\n this.geomType = undefined;\r\n\r\n // Only HitGeomType.Point and HitGeomType.Surface are valid without a curve primitive.\r\n if (undefined === this.primitive) {\r\n if (HitGeomType.Point === geomType || HitGeomType.Surface === geomType)\r\n this.geomType = geomType;\r\n return;\r\n }\r\n\r\n if (undefined !== localToWorld)\r\n this.primitive.tryTransformInPlace(localToWorld);\r\n\r\n if (this.primitive instanceof Arc3d)\r\n this.geomType = HitGeomType.Arc;\r\n else if (this.primitive instanceof LineSegment3d)\r\n this.geomType = HitGeomType.Segment;\r\n else if (this.primitive instanceof LineString3d)\r\n this.geomType = HitGeomType.Segment;\r\n else\r\n this.geomType = HitGeomType.Curve;\r\n\r\n // Set curve primitive geometry type override...\r\n // - HitGeomType.Point with arc/ellipse denotes center.\r\n // - HitGeomType.Surface with any curve primitive denotes an interior hit.\r\n if (undefined !== geomType && HitGeomType.None !== geomType)\r\n this.geomType = geomType;\r\n }\r\n\r\n /** Make a copy of this SnapDetail. */\r\n public override clone(): SnapDetail {\r\n const val = new SnapDetail(this, this.snapMode, this.heat, this.snapPoint);\r\n val.sprite = this.sprite;\r\n val.geomType = this.geomType;\r\n val.parentGeomType = this.parentGeomType;\r\n val.adjustedPoint.setFrom(this.adjustedPoint);\r\n if (undefined !== this.primitive)\r\n val.primitive = this.primitive.clone() as CurvePrimitive;\r\n if (undefined !== this.normal)\r\n val.normal = this.normal.clone();\r\n return val;\r\n }\r\n\r\n public getCurvePrimitive(singleSegment: boolean = true): CurvePrimitive | undefined {\r\n if (!singleSegment || undefined === this.primitive)\r\n return this.primitive;\r\n\r\n if (this.primitive instanceof LineString3d) {\r\n const ls = this.primitive;\r\n if (ls.points.length > 2) {\r\n const loc = ls.closestPoint(this.snapPoint, false);\r\n const nSegments = ls.points.length - 1;\r\n const uSegRange = (1.0 / nSegments);\r\n let segmentNo = Math.floor(loc.fraction / uSegRange);\r\n if (segmentNo >= nSegments)\r\n segmentNo = nSegments - 1;\r\n return LineSegment3d.create(ls.points[segmentNo], ls.points[segmentNo + 1]);\r\n }\r\n }\r\n\r\n return this.primitive;\r\n }\r\n\r\n public override draw(context: DecorateContext) {\r\n if (undefined !== this.primitive) {\r\n let singleSegment = false;\r\n switch (this.snapMode) {\r\n case SnapMode.Center:\r\n case SnapMode.Origin:\r\n case SnapMode.Bisector:\r\n break; // Snap point for these is computed using entire linestring, not just the hit segment...\r\n\r\n default: {\r\n singleSegment = true;\r\n break;\r\n }\r\n }\r\n\r\n const builder = context.createGraphicBuilder(GraphicType.WorldOverlay);\r\n const outline = context.viewport.hilite.color.adjustedForContrast(context.viewport.view.backgroundColor, 50);\r\n const centerLine = context.viewport.hilite.color.adjustedForContrast(outline, 175);\r\n const path = Path.create(this.getCurvePrimitive(singleSegment)!);\r\n\r\n builder.setSymbology(outline, outline, 6);\r\n builder.addPath(path);\r\n\r\n builder.setSymbology(centerLine, centerLine, 2);\r\n builder.addPath(path);\r\n\r\n context.addDecorationFromBuilder(builder);\r\n return;\r\n }\r\n super.draw(context);\r\n }\r\n\r\n private static getSnapSpriteUrl(snapType: SnapMode): string {\r\n switch (snapType) {\r\n case SnapMode.Nearest: return `${IModelApp.publicPath}sprites/SnapPointOn.png`;\r\n case SnapMode.NearestKeypoint: return `${IModelApp.publicPath}sprites/SnapKeypoint.png`;\r\n case SnapMode.MidPoint: return `${IModelApp.publicPath}sprites/SnapMidpoint.png`;\r\n case SnapMode.Center: return `${IModelApp.publicPath}sprites/SnapCenter.png`;\r\n case SnapMode.Origin: return `${IModelApp.publicPath}sprites/SnapOrigin.png`;\r\n case SnapMode.Bisector: return `${IModelApp.publicPath}sprites/SnapBisector.png`;\r\n case SnapMode.Intersection: return `${IModelApp.publicPath}sprites/SnapIntersection.png`;\r\n }\r\n return \"\";\r\n }\r\n}\r\n\r\n/** @public */\r\nexport class IntersectDetail extends SnapDetail {\r\n public constructor(from: SnapDetail, heat: SnapHeat = SnapHeat.None, snapPoint: XYZProps, public readonly otherPrimitive: CurvePrimitive, public readonly otherId: string) {\r\n super(from, SnapMode.Intersection, heat, snapPoint);\r\n this.primitive = from.primitive;\r\n this.normal = from.normal; // Preserve normal from primary snap location for AccuDraw smart rotation...\r\n }\r\n\r\n public override draw(context: DecorateContext) {\r\n if (undefined !== this.primitive && undefined !== this.otherPrimitive) {\r\n const builder = context.createGraphicBuilder(GraphicType.WorldOverlay);\r\n const outline = context.viewport.hilite.color.adjustedForContrast(context.viewport.view.backgroundColor, 50);\r\n const centerLine = context.viewport.hilite.color.adjustedForContrast(outline, 175);\r\n const path1 = Path.create(this.primitive);\r\n const path2 = Path.create(this.otherPrimitive);\r\n\r\n builder.setSymbology(outline, outline, 6);\r\n builder.addPath(path1);\r\n builder.addPath(path2);\r\n\r\n builder.setSymbology(centerLine, centerLine, 2);\r\n builder.addPath(path1);\r\n builder.setSymbology(centerLine, centerLine, 2, LinePixels.Code2);\r\n builder.addPath(path2);\r\n\r\n context.addDecorationFromBuilder(builder);\r\n return;\r\n }\r\n super.draw(context);\r\n }\r\n}\r\n\r\n/** The result of a \"locate\" is a sorted list of objects that satisfied the search criteria (a HitList). Earlier hits in the list\r\n * are somehow *better* than those later on.\r\n * @public\r\n */\r\nexport class HitList<T extends HitDetail> {\r\n public hits: T[] = [];\r\n public currHit = -1;\r\n public get length(): number { return this.hits.length; }\r\n public empty(): void { this.hits.length = 0; this.currHit = -1; }\r\n public resetCurrentHit(): void { this.currHit = -1; }\r\n\r\n /** Get a hit from a particular index into a HitList\r\n * return the requested hit from the HitList or undefined\r\n */\r\n public getHit(hitNum: number): T | undefined {\r\n if (hitNum < 0) hitNum = this.length - 1;\r\n return (hitNum >= this.length) ? undefined : this.hits[hitNum];\r\n }\r\n\r\n /** When setting one or more indices to undefined you must call dropNulls afterwards */\r\n public setHit(i: number, p: T | undefined): void {\r\n if (i < 0 || i >= this.length)\r\n return;\r\n this.hits[i] = p!;\r\n }\r\n\r\n public dropNulls(): void {\r\n const hits = this.hits;\r\n this.hits = [];\r\n for (const hit of hits)\r\n this.hits.push(hit);\r\n }\r\n\r\n public getNextHit(): T | undefined { this.currHit++; return this.getCurrentHit(); }\r\n public getCurrentHit(): T | undefined { return -1 === this.currHit ? undefined : this.getHit(this.currHit); }\r\n\r\n public setCurrentHit(hit: T): void {\r\n this.resetCurrentHit();\r\n for (let thisHit; undefined !== (thisHit = this.getNextHit());) {\r\n if (thisHit === hit)\r\n return;\r\n }\r\n }\r\n\r\n /** remove the current hit from the list. */\r\n public removeCurrentHit() { this.removeHit(this.currHit); }\r\n\r\n /** remove a hit in the list. */\r\n public removeHit(hitNum: number) {\r\n if (hitNum < 0) // Support -1 == END\r\n hitNum = this.length - 1;\r\n\r\n if (hitNum <= this.currHit)\r\n this.currHit = -1;\r\n\r\n if (hitNum >= this.length) // Locate calls GetNextHit, which increments currHit, until it goes beyond the end of size of the array.\r\n return; // Then Reset call RemoteCurrentHit, which passes in currHit. When it is out of range, we do nothing.\r\n\r\n this.hits.splice(hitNum, 1);\r\n }\r\n\r\n /** search through list and remove any hits that contain a specified element id. */\r\n public removeHitsFrom(sourceId: string): boolean {\r\n let removedOne = false;\r\n\r\n // walk backwards through list so we don't have to worry about what happens on remove\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n const thisHit = this.hits[i];\r\n if (thisHit && sourceId === thisHit.sourceId) {\r\n removedOne = true;\r\n this.removeHit(i);\r\n }\r\n }\r\n return removedOne;\r\n }\r\n\r\n private getPriorityZOverride(priority: HitPriority): number {\r\n switch (priority) {\r\n case HitPriority.WireEdge:\r\n case HitPriority.PlanarEdge:\r\n case HitPriority.NonPlanarEdge:\r\n return 0;\r\n case HitPriority.SilhouetteEdge:\r\n return 1;\r\n case HitPriority.PlanarSurface:\r\n case HitPriority.NonPlanarSurface:\r\n return 2;\r\n default:\r\n return 3;\r\n }\r\n }\r\n\r\n /** compare two hits for insertion into list. */\r\n public compare(hit1: HitDetail | undefined, hit2: HitDetail | undefined): -1 | 1 | 0 {\r\n if (!hit1 || !hit2)\r\n return 0;\r\n\r\n const zOverride1 = this.getPriorityZOverride(hit1.priority);\r\n const zOverride2 = this.getPriorityZOverride(hit2.priority);\r\n\r\n // Prefer edges over surfaces, this is more important than z because we know the edge isn't obscured...\r\n if (zOverride1 < zOverride2) return -1;\r\n if (zOverride1 > zOverride2) return 1;\r\n\r\n // Compare xy distance from pick point, prefer hits closer to center...\r\n if (hit1.distXY < hit2.distXY) return -1;\r\n if (hit1.distXY > hit2.distXY) return 1;\r\n\r\n // Compare distance fraction, prefer hits closer to eye...\r\n if (hit1.distFraction > hit2.distFraction) return -1;\r\n if (hit1.distFraction < hit2.distFraction) return 1;\r\n\r\n // Compare geometry class, prefer path/region hits over surface hits when all else is equal...\r\n if (hit1.priority < hit2.priority) return -1;\r\n if (hit1.priority > hit2.priority) return 1;\r\n\r\n return 0;\r\n }\r\n\r\n /** Add a new hit to the list. Hits are sorted according to their priority and distance. */\r\n public addHit(newHit: T): number {\r\n if (0 === this.hits.length) {\r\n this.hits.push(newHit);\r\n return 0;\r\n }\r\n let index = 0;\r\n for (; index < this.hits.length; ++index) {\r\n const oldHit = this.hits[index];\r\n const comparison = this.compare(newHit, oldHit);\r\n if (comparison < 0)\r\n break;\r\n }\r\n\r\n this.hits.splice(index, 0, newHit);\r\n return index;\r\n }\r\n\r\n /** Insert a new hit into the list at the supplied index. */\r\n public insertHit(i: number, hit: T): void {\r\n if (i < 0 || i >= this.length)\r\n this.hits.push(hit);\r\n else\r\n this.hits.splice(i, 0, hit);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"HitDetail.js","sourceRoot":"","sources":["../../src/HitDetail.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 LocatingElements\r\n */\r\nimport { Id64 } from \"@itwin/core-bentley\";\r\nimport { Arc3d, CurvePrimitive, LineSegment3d, LineString3d, Path, Point3d, Transform, Vector3d, XYZProps } from \"@itwin/core-geometry\";\r\nimport { GeometryClass, LinePixels } from \"@itwin/core-common\";\r\nimport { IModelApp } from \"./IModelApp\";\r\nimport { IModelConnection } from \"./IModelConnection\";\r\nimport { GraphicType } from \"./render/GraphicBuilder\";\r\nimport { IconSprites, Sprite } from \"./Sprites\";\r\nimport { DecorateContext } from \"./ViewContext\";\r\nimport { ScreenViewport } from \"./Viewport\";\r\n\r\n/** @public */\r\nexport enum SnapMode {\r\n Nearest = 1,\r\n NearestKeypoint = 1 << 1,\r\n MidPoint = 1 << 2,\r\n Center = 1 << 3,\r\n Origin = 1 << 4,\r\n Bisector = 1 << 5,\r\n Intersection = 1 << 6,\r\n}\r\n\r\n/** @public */\r\nexport enum SnapHeat {\r\n None = 0,\r\n NotInRange = 1, // \"of interest\", but out of range\r\n InRange = 2,\r\n}\r\n\r\n/** The procedure that generated this Hit.\r\n * @public\r\n */\r\nexport enum HitSource {\r\n None = 0,\r\n FromUser = 1,\r\n MotionLocate = 2,\r\n AccuSnap = 3,\r\n TentativeSnap = 4,\r\n DataPoint = 5,\r\n Application = 6,\r\n EditAction = 7,\r\n EditActionSS = 8,\r\n}\r\n\r\n/** What was being tested to generate this hit. This is not the element or\r\n * GeometricPrimitive that generated the Hit, it is an indication of whether it is an edge or interior hit.\r\n * @public\r\n */\r\nexport enum HitGeomType {\r\n None = 0,\r\n Point = 1,\r\n Segment = 2,\r\n Curve = 3,\r\n Arc = 4,\r\n Surface = 5,\r\n}\r\n\r\n/** Classification of GeometricPrimitive that generated the Hit.\r\n * @public\r\n */\r\nexport enum HitParentGeomType {\r\n None = 0,\r\n Wire = 1,\r\n Sheet = 2,\r\n Solid = 3,\r\n Mesh = 4,\r\n Text = 5,\r\n}\r\n\r\n/** @public */\r\nexport enum HitPriority {\r\n WireEdge = 0,\r\n PlanarEdge = 1,\r\n NonPlanarEdge = 2,\r\n SilhouetteEdge = 3,\r\n PlanarSurface = 4,\r\n NonPlanarSurface = 5,\r\n Unknown = 6,\r\n}\r\n\r\n/** @public */\r\nexport enum HitDetailType {\r\n Hit = 1,\r\n Snap = 2,\r\n Intersection = 3,\r\n}\r\n\r\n/** A HitDetail stores the result when locating geometry displayed in a view.\r\n * It holds an approximate location on an element (or decoration) from a *pick*.\r\n * @public\r\n */\r\nexport class HitDetail {\r\n private readonly _iModel?: IModelConnection;\r\n /** @internal chiefly for debugging. */\r\n public readonly tileId?: string;\r\n /** @alpha */\r\n public readonly isClassifier: boolean;\r\n\r\n /** Create a new HitDetail from the inputs to and results of a locate operation.\r\n * @param testPoint The world coordinate space point that was used as the locate point.\r\n * @param viewport The view the locate operation was performed in.\r\n * @param hitSource The procedure that requested the locate operation.\r\n * @param hitPoint The approximate world coordinate location on the geometry identified by this HitDetail.\r\n * @param sourceId The source of the geometry, either a persistent element id or pickable decoration id.\r\n * @param priority The hit geometry priority/classification.\r\n * @param distXY The xy distance to hit in view coordinates.\r\n * @param distFraction The near plane distance fraction to hit.\r\n * @param subCategoryId The SubCategory for a persistent element hit.\r\n * @param geometryClass The GeometryClass for a persistent element hit.\r\n * @param iModel The IModelConnection from which the hit originated. This should almost always be left undefined, unless the hit is known to have originated from an iModel other than the one associated with the viewport.\r\n * @param modelId Optionally the Id of the [[ModelState]] from which the hit originated.\r\n * @param tileId Optionally the Id of the Tile from which the hit originated.\r\n * @param isClassifier Optionally whether the hit originated from a reality model classification.\r\n */\r\n public constructor(public readonly testPoint: Point3d, public readonly viewport: ScreenViewport, public readonly hitSource: HitSource,\r\n public readonly hitPoint: Point3d, public readonly sourceId: string, public readonly priority: HitPriority, public readonly distXY: number, public readonly distFraction: number,\r\n public readonly subCategoryId?: string, public readonly geometryClass?: GeometryClass, public readonly modelId?: string, iModel?: IModelConnection, tileId?: string, isClassifier?: boolean) {\r\n this._iModel = iModel;\r\n this.tileId = tileId;\r\n this.isClassifier = undefined !== isClassifier ? isClassifier : false;\r\n }\r\n\r\n /** Get the type of HitDetail.\r\n * @returns HitDetailType.Hit if this is a HitDetail, HitDetailType.Snap if it is a SnapDetail\r\n */\r\n public getHitType(): HitDetailType { return HitDetailType.Hit; }\r\n\r\n /** Get the *hit point* for this HitDetail. Returns the approximate point on the element that caused the hit when not a SnapDetail or IntersectDetail.\r\n * For a snap that is *hot*, the *exact* point on the Element for the snap mode is returned, otherwise the close point on the hit geometry is returned.\r\n */\r\n public getPoint(): Point3d { return this.hitPoint; }\r\n\r\n /** Determine if this HitPoint is from the same source as another HitDetail. */\r\n public isSameHit(otherHit?: HitDetail): boolean { return (undefined !== otherHit && this.sourceId === otherHit.sourceId && this.iModel === otherHit.iModel); }\r\n /** Return whether sourceId is for a persistent element and not a pickable decoration. */\r\n public get isElementHit(): boolean { return !Id64.isInvalid(this.sourceId) && !Id64.isTransient(this.sourceId); }\r\n // return whether the sourceId is for a model (reality models etc.)\r\n public get isModelHit(): boolean {\r\n return this.modelId === this.sourceId;\r\n }\r\n // return whether the hit point is from map.\r\n public get isMapHit(): boolean { return undefined !== this.viewport.mapLayerFromHit(this); }\r\n\r\n /** Create a deep copy of this HitDetail */\r\n public clone(): HitDetail {\r\n const val = new HitDetail(this.testPoint, this.viewport, this.hitSource, this.hitPoint, this.sourceId, this.priority, this.distXY, this.distFraction, this.subCategoryId, this.geometryClass, this.modelId, this._iModel, this.tileId, this.isClassifier);\r\n return val;\r\n }\r\n\r\n /** Draw this HitDetail as a Decoration. Causes the picked element to *flash* */\r\n public draw(_context: DecorateContext) {\r\n this.viewport.flashedId = this.sourceId;\r\n }\r\n\r\n /** Get the tooltip content for this HitDetail. */\r\n public async getToolTip(): Promise<HTMLElement | string> {\r\n let toolTipPromise = this.isElementHit ? IModelApp.viewManager.overrideElementToolTip(this) : IModelApp.viewManager.getDecorationToolTip(this);\r\n for (const toolTipProvider of IModelApp.viewManager.toolTipProviders)\r\n toolTipPromise = toolTipProvider.augmentToolTip(this, toolTipPromise);\r\n return toolTipPromise;\r\n }\r\n\r\n /** The IModelConnection from which the hit originated. In some cases this may not be the same as the iModel associated with the Viewport -\r\n * for example, if a [[TiledGraphicsProvider]] is used to display graphics from a different iModel in the viewport.\r\n * This HitDetail's element, subcategory, and model Ids are defined in the context of this IModelConnection.\r\n */\r\n public get iModel(): IModelConnection { return undefined !== this._iModel ? this._iModel : this.viewport.iModel; }\r\n\r\n /** Returns true if this hit originated from an [[IModelConnection]] other than the one associated with the [[Viewport]].\r\n * @see [[iModel]].\r\n */\r\n public get isExternalIModelHit(): boolean { return this.iModel !== this.viewport.iModel; }\r\n}\r\n\r\n/** A SnapDetail is generated from the result of a snap request. In addition to the HitDetail about the reason the element was *picked*,\r\n * it holds the *exact* point on the element from the snapping logic, plus additional information that varies with the type of element and snap mode.\r\n * @public\r\n */\r\nexport class SnapDetail extends HitDetail {\r\n /** A sprite to show the user the type of snap performed */\r\n public sprite?: Sprite;\r\n /** HitPoint adjusted by snap */\r\n public readonly snapPoint: Point3d;\r\n /** AccuSnap/AccuDraw can adjust the point after the snap. */\r\n public readonly adjustedPoint: Point3d;\r\n /** Curve primitive for snap. */\r\n public primitive?: CurvePrimitive;\r\n /** Surface normal at snapPoint */\r\n public normal?: Vector3d;\r\n /** The HitGeomType of this SnapDetail */\r\n public geomType?: HitGeomType;\r\n /** The HitGeomType of this SnapDetail */\r\n public parentGeomType?: HitParentGeomType;\r\n\r\n /** Constructor for SnapDetail.\r\n * @param from The HitDetail that created this snap\r\n * @param snapMode The SnapMode used to create this SnapDetail\r\n * @param heat The SnapHeat of this SnapDetail\r\n * @param snapPoint The snapped point in the element\r\n */\r\n public constructor(from: HitDetail, public snapMode: SnapMode = SnapMode.Nearest, public heat: SnapHeat = SnapHeat.None, snapPoint?: XYZProps) {\r\n super(from.testPoint, from.viewport, from.hitSource, from.hitPoint, from.sourceId, from.priority, from.distXY, from.distFraction, from.subCategoryId, from.geometryClass, from.modelId, from.iModel, from.tileId, from.isClassifier);\r\n this.snapPoint = Point3d.fromJSON(snapPoint ? snapPoint : from.hitPoint);\r\n this.adjustedPoint = this.snapPoint.clone();\r\n this.sprite = IconSprites.getSpriteFromUrl(SnapDetail.getSnapSpriteUrl(snapMode));\r\n }\r\n\r\n /** Returns `HitDetailType.Snap` */\r\n public override getHitType(): HitDetailType { return HitDetailType.Snap; }\r\n /** Get the snap point if this SnapDetail is *hot*, the pick point otherwise. */\r\n public override getPoint(): Point3d { return this.isHot ? this.snapPoint : super.getPoint(); }\r\n /** Return true if the pick point was closer than the snap aperture from the generated snap point. */\r\n public get isHot(): boolean { return this.heat !== SnapHeat.None; }\r\n /** Determine whether the [[adjustedPoint]] is different than the [[snapPoint]]. This happens, for example, when points are adjusted for grids, acs plane snap, and AccuDraw. */\r\n public get isPointAdjusted(): boolean { return !this.adjustedPoint.isExactEqual(this.snapPoint); }\r\n /** Change the snap point. */\r\n public setSnapPoint(point: Point3d, heat: SnapHeat) { this.snapPoint.setFrom(point); this.adjustedPoint.setFrom(point); this.heat = heat; }\r\n\r\n /** Set curve primitive and HitGeometryType for this SnapDetail. */\r\n public setCurvePrimitive(primitive?: CurvePrimitive, localToWorld?: Transform, geomType?: HitGeomType): void {\r\n this.primitive = primitive;\r\n this.geomType = undefined;\r\n\r\n // Only HitGeomType.Point and HitGeomType.Surface are valid without a curve primitive.\r\n if (undefined === this.primitive) {\r\n if (HitGeomType.Point === geomType || HitGeomType.Surface === geomType)\r\n this.geomType = geomType;\r\n return;\r\n }\r\n\r\n if (undefined !== localToWorld)\r\n this.primitive.tryTransformInPlace(localToWorld);\r\n\r\n if (this.primitive instanceof Arc3d)\r\n this.geomType = HitGeomType.Arc;\r\n else if (this.primitive instanceof LineSegment3d)\r\n this.geomType = HitGeomType.Segment;\r\n else if (this.primitive instanceof LineString3d)\r\n this.geomType = HitGeomType.Segment;\r\n else\r\n this.geomType = HitGeomType.Curve;\r\n\r\n // Set curve primitive geometry type override...\r\n // - HitGeomType.Point with arc/ellipse denotes center.\r\n // - HitGeomType.Surface with any curve primitive denotes an interior hit.\r\n if (undefined !== geomType && HitGeomType.None !== geomType)\r\n this.geomType = geomType;\r\n }\r\n\r\n /** Make a copy of this SnapDetail. */\r\n public override clone(): SnapDetail {\r\n const val = new SnapDetail(this, this.snapMode, this.heat, this.snapPoint);\r\n val.sprite = this.sprite;\r\n val.geomType = this.geomType;\r\n val.parentGeomType = this.parentGeomType;\r\n val.adjustedPoint.setFrom(this.adjustedPoint);\r\n if (undefined !== this.primitive)\r\n val.primitive = this.primitive.clone();\r\n if (undefined !== this.normal)\r\n val.normal = this.normal.clone();\r\n return val;\r\n }\r\n\r\n public getCurvePrimitive(singleSegment: boolean = true): CurvePrimitive | undefined {\r\n if (!singleSegment || undefined === this.primitive)\r\n return this.primitive;\r\n\r\n if (this.primitive instanceof LineString3d) {\r\n const ls = this.primitive;\r\n if (ls.points.length > 2) {\r\n const loc = ls.closestPoint(this.snapPoint, false);\r\n const nSegments = ls.points.length - 1;\r\n const uSegRange = (1.0 / nSegments);\r\n let segmentNo = Math.floor(loc.fraction / uSegRange);\r\n if (segmentNo >= nSegments)\r\n segmentNo = nSegments - 1;\r\n return LineSegment3d.create(ls.points[segmentNo], ls.points[segmentNo + 1]);\r\n }\r\n }\r\n\r\n return this.primitive;\r\n }\r\n\r\n public override draw(context: DecorateContext) {\r\n if (undefined !== this.primitive) {\r\n let singleSegment = false;\r\n switch (this.snapMode) {\r\n case SnapMode.Center:\r\n case SnapMode.Origin:\r\n case SnapMode.Bisector:\r\n break; // Snap point for these is computed using entire linestring, not just the hit segment...\r\n\r\n default: {\r\n singleSegment = true;\r\n break;\r\n }\r\n }\r\n\r\n const builder = context.createGraphicBuilder(GraphicType.WorldOverlay);\r\n const outline = context.viewport.hilite.color.adjustedForContrast(context.viewport.view.backgroundColor, 50);\r\n const centerLine = context.viewport.hilite.color.adjustedForContrast(outline, 175);\r\n const path = Path.create(this.getCurvePrimitive(singleSegment)!);\r\n\r\n builder.setSymbology(outline, outline, 6);\r\n builder.addPath(path);\r\n\r\n builder.setSymbology(centerLine, centerLine, 2);\r\n builder.addPath(path);\r\n\r\n context.addDecorationFromBuilder(builder);\r\n return;\r\n }\r\n super.draw(context);\r\n }\r\n\r\n private static getSnapSpriteUrl(snapType: SnapMode): string {\r\n switch (snapType) {\r\n case SnapMode.Nearest: return `${IModelApp.publicPath}sprites/SnapPointOn.png`;\r\n case SnapMode.NearestKeypoint: return `${IModelApp.publicPath}sprites/SnapKeypoint.png`;\r\n case SnapMode.MidPoint: return `${IModelApp.publicPath}sprites/SnapMidpoint.png`;\r\n case SnapMode.Center: return `${IModelApp.publicPath}sprites/SnapCenter.png`;\r\n case SnapMode.Origin: return `${IModelApp.publicPath}sprites/SnapOrigin.png`;\r\n case SnapMode.Bisector: return `${IModelApp.publicPath}sprites/SnapBisector.png`;\r\n case SnapMode.Intersection: return `${IModelApp.publicPath}sprites/SnapIntersection.png`;\r\n }\r\n return \"\";\r\n }\r\n}\r\n\r\n/** @public */\r\nexport class IntersectDetail extends SnapDetail {\r\n public constructor(from: SnapDetail, heat: SnapHeat = SnapHeat.None, snapPoint: XYZProps, public readonly otherPrimitive: CurvePrimitive, public readonly otherId: string) {\r\n super(from, SnapMode.Intersection, heat, snapPoint);\r\n this.primitive = from.primitive;\r\n this.normal = from.normal; // Preserve normal from primary snap location for AccuDraw smart rotation...\r\n }\r\n\r\n public override draw(context: DecorateContext) {\r\n if (undefined !== this.primitive && undefined !== this.otherPrimitive) {\r\n const builder = context.createGraphicBuilder(GraphicType.WorldOverlay);\r\n const outline = context.viewport.hilite.color.adjustedForContrast(context.viewport.view.backgroundColor, 50);\r\n const centerLine = context.viewport.hilite.color.adjustedForContrast(outline, 175);\r\n const path1 = Path.create(this.primitive);\r\n const path2 = Path.create(this.otherPrimitive);\r\n\r\n builder.setSymbology(outline, outline, 6);\r\n builder.addPath(path1);\r\n builder.addPath(path2);\r\n\r\n builder.setSymbology(centerLine, centerLine, 2);\r\n builder.addPath(path1);\r\n builder.setSymbology(centerLine, centerLine, 2, LinePixels.Code2);\r\n builder.addPath(path2);\r\n\r\n context.addDecorationFromBuilder(builder);\r\n return;\r\n }\r\n super.draw(context);\r\n }\r\n}\r\n\r\n/** The result of a \"locate\" is a sorted list of objects that satisfied the search criteria (a HitList). Earlier hits in the list\r\n * are somehow *better* than those later on.\r\n * @public\r\n */\r\nexport class HitList<T extends HitDetail> {\r\n public hits: T[] = [];\r\n public currHit = -1;\r\n public get length(): number { return this.hits.length; }\r\n public empty(): void { this.hits.length = 0; this.currHit = -1; }\r\n public resetCurrentHit(): void { this.currHit = -1; }\r\n\r\n /** Get a hit from a particular index into a HitList\r\n * return the requested hit from the HitList or undefined\r\n */\r\n public getHit(hitNum: number): T | undefined {\r\n if (hitNum < 0) hitNum = this.length - 1;\r\n return (hitNum >= this.length) ? undefined : this.hits[hitNum];\r\n }\r\n\r\n /** When setting one or more indices to undefined you must call dropNulls afterwards */\r\n public setHit(i: number, p: T | undefined): void {\r\n if (i < 0 || i >= this.length)\r\n return;\r\n this.hits[i] = p!;\r\n }\r\n\r\n public dropNulls(): void {\r\n const hits = this.hits;\r\n this.hits = [];\r\n for (const hit of hits)\r\n this.hits.push(hit);\r\n }\r\n\r\n public getNextHit(): T | undefined { this.currHit++; return this.getCurrentHit(); }\r\n public getCurrentHit(): T | undefined { return -1 === this.currHit ? undefined : this.getHit(this.currHit); }\r\n\r\n public setCurrentHit(hit: T): void {\r\n this.resetCurrentHit();\r\n for (let thisHit; undefined !== (thisHit = this.getNextHit());) {\r\n if (thisHit === hit)\r\n return;\r\n }\r\n }\r\n\r\n /** remove the current hit from the list. */\r\n public removeCurrentHit() { this.removeHit(this.currHit); }\r\n\r\n /** remove a hit in the list. */\r\n public removeHit(hitNum: number) {\r\n if (hitNum < 0) // Support -1 == END\r\n hitNum = this.length - 1;\r\n\r\n if (hitNum <= this.currHit)\r\n this.currHit = -1;\r\n\r\n if (hitNum >= this.length) // Locate calls GetNextHit, which increments currHit, until it goes beyond the end of size of the array.\r\n return; // Then Reset call RemoteCurrentHit, which passes in currHit. When it is out of range, we do nothing.\r\n\r\n this.hits.splice(hitNum, 1);\r\n }\r\n\r\n /** search through list and remove any hits that contain a specified element id. */\r\n public removeHitsFrom(sourceId: string): boolean {\r\n let removedOne = false;\r\n\r\n // walk backwards through list so we don't have to worry about what happens on remove\r\n for (let i = this.length - 1; i >= 0; i--) {\r\n const thisHit = this.hits[i];\r\n if (thisHit && sourceId === thisHit.sourceId) {\r\n removedOne = true;\r\n this.removeHit(i);\r\n }\r\n }\r\n return removedOne;\r\n }\r\n\r\n private getPriorityZOverride(priority: HitPriority): number {\r\n switch (priority) {\r\n case HitPriority.WireEdge:\r\n case HitPriority.PlanarEdge:\r\n case HitPriority.NonPlanarEdge:\r\n return 0;\r\n case HitPriority.SilhouetteEdge:\r\n return 1;\r\n case HitPriority.PlanarSurface:\r\n case HitPriority.NonPlanarSurface:\r\n return 2;\r\n default:\r\n return 3;\r\n }\r\n }\r\n\r\n /** compare two hits for insertion into list. */\r\n public compare(hit1: HitDetail | undefined, hit2: HitDetail | undefined): -1 | 1 | 0 {\r\n if (!hit1 || !hit2)\r\n return 0;\r\n\r\n const zOverride1 = this.getPriorityZOverride(hit1.priority);\r\n const zOverride2 = this.getPriorityZOverride(hit2.priority);\r\n\r\n // Prefer edges over surfaces, this is more important than z because we know the edge isn't obscured...\r\n if (zOverride1 < zOverride2) return -1;\r\n if (zOverride1 > zOverride2) return 1;\r\n\r\n // Compare xy distance from pick point, prefer hits closer to center...\r\n if (hit1.distXY < hit2.distXY) return -1;\r\n if (hit1.distXY > hit2.distXY) return 1;\r\n\r\n // Compare distance fraction, prefer hits closer to eye...\r\n if (hit1.distFraction > hit2.distFraction) return -1;\r\n if (hit1.distFraction < hit2.distFraction) return 1;\r\n\r\n // Compare geometry class, prefer path/region hits over surface hits when all else is equal...\r\n if (hit1.priority < hit2.priority) return -1;\r\n if (hit1.priority > hit2.priority) return 1;\r\n\r\n return 0;\r\n }\r\n\r\n /** Add a new hit to the list. Hits are sorted according to their priority and distance. */\r\n public addHit(newHit: T): number {\r\n if (0 === this.hits.length) {\r\n this.hits.push(newHit);\r\n return 0;\r\n }\r\n let index = 0;\r\n for (; index < this.hits.length; ++index) {\r\n const oldHit = this.hits[index];\r\n const comparison = this.compare(newHit, oldHit);\r\n if (comparison < 0)\r\n break;\r\n }\r\n\r\n this.hits.splice(index, 0, newHit);\r\n return index;\r\n }\r\n\r\n /** Insert a new hit into the list at the supplied index. */\r\n public insertHit(i: number, hit: T): void {\r\n if (i < 0 || i >= this.length)\r\n this.hits.push(hit);\r\n else\r\n this.hits.splice(i, 0, hit);\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ParticleCollectionBuilder.d.ts","sourceRoot":"","sources":["../../../src/render/ParticleCollectionBuilder.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAkD,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC/G,OAAO,EACyE,aAAa,EAC5F,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMhD;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAC9C;;;OAGG;IACH,OAAO,EAAE,aAAa,CAAC;IAEvB;;OAEG;IACH,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IAErB,uGAAuG;IACvG,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,yFAAyF;IACzF,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,yDAAyD;IACzD,QAAQ,EAAE,QAAQ,CAAC;IAEnB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAc,SAAQ,MAAM;IAC3C;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAEtB,6KAA6K;IAC7K,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,sIAAsI;IACtI,cAAc,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB,iIAAiI;IACjI,IAAI,EAAE,KAAK,CAAC;IAEZ;;;;OAIG;IACH,WAAW,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;IAE/C;;;OAGG;IACH,MAAM,EAAE,MAAM,aAAa,GAAG,SAAS,CAAC;CACzC;AAED,cAAc;AACd,yBAAiB,yBAAyB,CAAC;IACzC;;OAEG;IACH,SAAgB,MAAM,CAAC,MAAM,EAAE,+BAA+B,GAAG,yBAAyB,CAEzF;CACF"}
1
+ {"version":3,"file":"ParticleCollectionBuilder.d.ts","sourceRoot":"","sources":["../../../src/render/ParticleCollectionBuilder.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAkD,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC/G,OAAO,EAC8G,aAAa,EACjI,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMhD;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAC9C;;;OAGG;IACH,OAAO,EAAE,aAAa,CAAC;IAEvB;;OAEG;IACH,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IAErB,uGAAuG;IACvG,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,yFAAyF;IACzF,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,yDAAyD;IACzD,QAAQ,EAAE,QAAQ,CAAC;IAEnB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAc,SAAQ,MAAM;IAC3C;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAEtB,6KAA6K;IAC7K,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,sIAAsI;IACtI,cAAc,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB,iIAAiI;IACjI,IAAI,EAAE,KAAK,CAAC;IAEZ;;;;OAIG;IACH,WAAW,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;IAE/C;;;OAGG;IACH,MAAM,EAAE,MAAM,aAAa,GAAG,SAAS,CAAC;CACzC;AAED,cAAc;AACd,yBAAiB,yBAAyB,CAAC;IACzC;;OAEG;IACH,SAAgB,MAAM,CAAC,MAAM,EAAE,+BAA+B,GAAG,yBAAyB,CAEzF;CACF"}
@@ -6,10 +6,9 @@
6
6
  * @module Rendering
7
7
  */
8
8
  import { Point2d, Point3d, Range3d, Transform, Vector2d } from "@itwin/core-geometry";
9
- import { ColorDef, Feature, FeatureTable, PackedFeatureTable, QParams3d, QPoint3dList, } from "@itwin/core-common";
9
+ import { ColorDef, ColorIndex, Feature, FeatureIndex, FeatureTable, FillFlags, PackedFeatureTable, QParams3d, QPoint3dList, } from "@itwin/core-common";
10
10
  import { GraphicBranch } from "./GraphicBranch";
11
11
  import { MeshParams } from "./primitives/VertexTable";
12
- import { MeshArgs } from "./primitives/mesh/MeshPrimitives";
13
12
  import { DisplayParams } from "./primitives/DisplayParams";
14
13
  /** @public */
15
14
  export var ParticleCollectionBuilder;
@@ -209,18 +208,26 @@ function createQuad(size, texture, transparency) {
209
208
  new Point3d(-halfWidth, -halfHeight, 0), new Point3d(halfWidth, -halfHeight, 0),
210
209
  new Point3d(-halfWidth, halfHeight, 0), new Point3d(halfWidth, halfHeight, 0),
211
210
  ];
212
- const quadArgs = new MeshArgs();
213
211
  const range = new Range3d();
214
212
  range.low = corners[0];
215
213
  range.high = corners[3];
216
- quadArgs.points = new QPoint3dList(QParams3d.fromRange(range));
214
+ const points = new QPoint3dList(QParams3d.fromRange(range));
217
215
  for (const corner of corners)
218
- quadArgs.points.add(corner);
219
- quadArgs.vertIndices = [0, 1, 2, 2, 1, 3];
220
- quadArgs.textureUv = [new Point2d(0, 1), new Point2d(1, 1), new Point2d(0, 0), new Point2d(1, 0)];
221
- quadArgs.texture = texture;
222
- quadArgs.colors.initUniform(ColorDef.white.withTransparency(transparency));
223
- quadArgs.isPlanar = true;
216
+ points.add(corner);
217
+ const colors = new ColorIndex();
218
+ colors.initUniform(ColorDef.white.withTransparency(transparency));
219
+ const quadArgs = {
220
+ points,
221
+ vertIndices: [0, 1, 2, 2, 1, 3],
222
+ fillFlags: FillFlags.None,
223
+ isPlanar: true,
224
+ colors,
225
+ features: new FeatureIndex(),
226
+ textureMapping: {
227
+ texture,
228
+ uvParams: [new Point2d(0, 1), new Point2d(1, 1), new Point2d(0, 0), new Point2d(1, 0)],
229
+ },
230
+ };
224
231
  return MeshParams.create(quadArgs);
225
232
  }
226
233
  function clampTransparency(transparency) {
@@ -1 +1 @@
1
- {"version":3,"file":"ParticleCollectionBuilder.js","sourceRoot":"","sources":["../../../src/render/ParticleCollectionBuilder.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 { Id64String } from \"@itwin/core-bentley\";\r\nimport { Matrix3d, Point2d, Point3d, Range3d, Transform, Vector2d, XAndY, XYAndZ } from \"@itwin/core-geometry\";\r\nimport {\r\n ColorDef, Feature, FeatureTable, PackedFeatureTable, QParams3d, QPoint3dList, RenderTexture,\r\n} from \"@itwin/core-common\";\r\nimport { Viewport } from \"../Viewport\";\r\nimport { RenderGraphic } from \"./RenderGraphic\";\r\nimport { GraphicBranch } from \"./GraphicBranch\";\r\nimport { MeshParams } from \"./primitives/VertexTable\";\r\nimport { MeshArgs } from \"./primitives/mesh/MeshPrimitives\";\r\nimport { DisplayParams } from \"./primitives/DisplayParams\";\r\n\r\n/** Parameters used to construct a [[ParticleCollectionBuilder]].\r\n * @public\r\n */\r\nexport interface ParticleCollectionBuilderParams {\r\n /** The image mapped to each particle quad.\r\n * @note The texture should be disposed of when no longer needed to free up WebGL resources. For example, if a [[Decorator]] creates the texture, the\r\n * texture should probably be disposed of when the decorator is removed from the [[ViewManager]].\r\n */\r\n texture: RenderTexture;\r\n\r\n /** The default extents of the particle quad. Individual particles may apply a scale to these extents to produce particles of varying dimensions.\r\n * Must be positive.\r\n */\r\n size: XAndY | number;\r\n\r\n /** The initial transparency of the particles as an integer in [0,255]. Defaults to zero if omitted. */\r\n transparency?: number;\r\n\r\n /** The origin of the particle collection in world coordinates. Defaults to (0, 0, 0). */\r\n origin?: XYAndZ;\r\n\r\n /** If the particles are to be pickable, a unique identifier to associate with the resultant [[RenderGraphic]].\r\n * @see [[IModelConnection.transientIdSequence]] to obtain an Id that is unique within an iModel.\r\n */\r\n pickableId?: Id64String;\r\n\r\n /** The viewport in which the particles will be drawn. */\r\n viewport: Viewport;\r\n\r\n /** If true, the finished graphic will be defined in view coordinates, for use as a decoration of type [[GraphicType.ViewBackground]] or [[GraphicType.ViewOverlay]].\r\n * Defaults to false, indicating the graphic will be defined in world coordinates.\r\n * @see [[CoordSystem.View]] and [[CoordSystem.World]].\r\n */\r\n isViewCoords?: boolean;\r\n}\r\n\r\n/** Describes a particle to to add to a particle collection via [[ParticleCollectionBuilder.addParticle]].\r\n * The x, y, and z coordinates represent the centroid of the particle quad in the collection's coordinate space.\r\n * @public\r\n */\r\nexport interface ParticleProps extends XYAndZ {\r\n /** The size of the particle, in the collection's coordinate space. If omitted, it defaults to the size supplied to the collection by [[ParticleCollectionBuilderParams.size]].\r\n * Supplying a `number` produces a square; supplying a non-uniform `XAndY` produces a rectangle. Must be positive.\r\n */\r\n size?: XAndY | number;\r\n\r\n /** The transparency with which to draw the particle as an integer in [0,255]. If omitted, it defaults to the current value of [[ParticleCollectionBuilder.transparency]]. */\r\n transparency?: number;\r\n\r\n /** A rotation matrix to orient the particle. If supplied then the particle will not be automatically oriented towards the camera. */\r\n rotationMatrix?: Matrix3d;\r\n}\r\n\r\n/** Interface for producing a collection of particles suitable for use in particle effects.\r\n * Particle effects involve animating hundreds or thousands of small particles to simulate phenomena like smoke, fire, snow, etc.\r\n * A particle collection represents each particle as a quad (rectangle) displaying an image. The position of each particle corresponds to the\r\n * centroid of its quad. The transparency and size of each particle can be specified individually. By default, the quads will always rotate to face the camera\r\n * such that the image is fully visible.\r\n *\r\n * Creating a particle collection using a ParticleCollectionBuilder is far more efficient (in both CPU and GPU usage) than doing so using a [[GraphicBuilder]].\r\n * @see interactive demonstrations of [Snow and Rain](https://www.itwinjs.org/sample-showcase/?group=Viewer+Features&sample=snow-rain-sample&imodel=Villa) and\r\n * [Fire and Smoke](https://www.itwinjs.org/sample-showcase/?group=Viewer+Features&sample=fire-sample&imodel=Villa) particle effects.\r\n * @see [SnowEffect]($frontend-devtools) for an example of a particle effect.\r\n * @public\r\n */\r\nexport interface ParticleCollectionBuilder {\r\n /** The default transparency for newly-added particles as an integer in [0,255], used by [[ParticleCollectionBuilder.addParticle]] if [[ParticleProps.transparency]] is omitted.\r\n * Changing this value has no effect on the transparency of previously-added particles.\r\n */\r\n transparency: number;\r\n\r\n /** The default size of each particle, used by [[ParticleCollectionBuilder.addParticle]] if [[ParticleProps.size]] is omitted. */\r\n size: XAndY;\r\n\r\n /** Add a particle to the collection.\r\n * If `size` is omitted, `this.size` is used.\r\n * If `transparency` is omitted, `this.transparency` is used.\r\n * @throws Error if particle size is defined and not greater than zero.\r\n */\r\n addParticle: (particle: ParticleProps) => void;\r\n\r\n /** Produces a finished graphic from the accumulated particles.\r\n * It returns the finished graphic, or `undefined` if the collection contains no particles or the [[RenderSystem]] failed to produce the graphic.\r\n * @note After this method returns, the particle collection is empty.\r\n */\r\n finish: () => RenderGraphic | undefined;\r\n}\r\n\r\n/** @public */\r\nexport namespace ParticleCollectionBuilder {\r\n /** Creates a new ParticleCollectionBuilder.\r\n * @throws Error if size is not greater than zero.\r\n */\r\n export function create(params: ParticleCollectionBuilderParams): ParticleCollectionBuilder {\r\n return new Builder(params);\r\n }\r\n}\r\n\r\nclass Particle {\r\n public readonly centroid: Point3d;\r\n public readonly transparency: number;\r\n public readonly width: number;\r\n public readonly height: number;\r\n public readonly rotationMatrix?: Matrix3d;\r\n\r\n public constructor(centroid: XYAndZ, width: number, height: number, transparency: number, rotationMatrix?: Matrix3d) {\r\n this.centroid = Point3d.fromJSON(centroid);\r\n this.transparency = transparency;\r\n this.width = width;\r\n this.height = height;\r\n this.rotationMatrix = rotationMatrix;\r\n }\r\n}\r\n\r\nclass Builder implements ParticleCollectionBuilder {\r\n private readonly _viewport: Viewport;\r\n private readonly _isViewCoords: boolean;\r\n private readonly _pickableId?: Id64String;\r\n private readonly _texture: RenderTexture;\r\n private readonly _size: Vector2d;\r\n private _transparency: number;\r\n private _hasVaryingTransparency = false;\r\n private readonly _localToWorldTransform: Transform;\r\n private readonly _range = Range3d.createNull();\r\n private _particlesOpaque: Particle[] = [];\r\n private _particlesTranslucent: Particle[] = [];\r\n\r\n public constructor(params: ParticleCollectionBuilderParams) {\r\n this._viewport = params.viewport;\r\n this._isViewCoords = true === params.isViewCoords;\r\n this._pickableId = params.pickableId;\r\n this._texture = params.texture;\r\n this._transparency = undefined !== params.transparency ? clampTransparency(params.transparency) : 0;\r\n this._localToWorldTransform = params.origin ? Transform.createTranslationXYZ(params.origin.x, params.origin.y, params.origin.z) : Transform.createIdentity();\r\n\r\n if (\"number\" === typeof params.size)\r\n this._size = new Vector2d(params.size, params.size);\r\n else\r\n this._size = Vector2d.fromJSON(params.size);\r\n\r\n if (this._size.x <= 0 || this._size.y <= 0)\r\n throw new Error(\"Particle size must be greater than zero\");\r\n }\r\n\r\n public get size(): XAndY {\r\n return this._size;\r\n }\r\n\r\n public get transparency() {\r\n return this._transparency;\r\n }\r\n\r\n public set transparency(transparency: number) {\r\n transparency = clampTransparency(transparency);\r\n if (transparency !== this._transparency) {\r\n this._transparency = transparency;\r\n this._hasVaryingTransparency = this._particlesTranslucent.length > 0;\r\n }\r\n }\r\n\r\n public addParticle(props: ParticleProps): void {\r\n const size = props.size ?? this._size;\r\n let width, height;\r\n if (\"number\" === typeof size) {\r\n width = height = size;\r\n } else {\r\n width = size.x;\r\n height = size.y;\r\n }\r\n\r\n if (width <= 0 || height <= 0)\r\n throw new Error(\"A particle must have a size greater than zero\");\r\n\r\n const transparency = undefined !== props.transparency ? clampTransparency(props.transparency) : this.transparency;\r\n if (transparency !== this.transparency && this._particlesTranslucent.length > 0)\r\n this._hasVaryingTransparency = true;\r\n\r\n const particle = new Particle(props, width, height, transparency, props.rotationMatrix);\r\n if (transparency > 0)\r\n this._particlesTranslucent.push(particle);\r\n else\r\n this._particlesOpaque.push(particle);\r\n this._range.extendPoint(particle.centroid);\r\n }\r\n\r\n public finish(): RenderGraphic | undefined {\r\n if (0 === this._particlesTranslucent.length + this._particlesOpaque.length)\r\n return undefined;\r\n\r\n // Order-independent transparency doesn't work well with opaque geometry - it will look semi-transparent.\r\n // If we have a mix of opaque and transparent particles, put them in separate graphics to be rendered in separate passes.\r\n const opaque = this.createGraphic(this._particlesOpaque, 0);\r\n const transparent = this.createGraphic(this._particlesTranslucent, this._hasVaryingTransparency ? undefined : this._transparency);\r\n\r\n // Empty the collection before any return statements.\r\n const range = this._range.clone();\r\n this._range.setNull();\r\n this._particlesOpaque.length = 0;\r\n this._particlesTranslucent.length = 0;\r\n this._hasVaryingTransparency = false;\r\n\r\n if (!transparent && !opaque)\r\n return undefined;\r\n\r\n // Transform from origin to collection, then to world.\r\n const toCollection = Transform.createTranslation(range.center);\r\n const toWorld = toCollection.multiplyTransformTransform(this._localToWorldTransform);\r\n const branch = new GraphicBranch(true);\r\n if (opaque)\r\n branch.add(opaque);\r\n\r\n if (transparent)\r\n branch.add(transparent);\r\n\r\n let graphic = this._viewport.target.renderSystem.createGraphicBranch(branch, toWorld);\r\n\r\n // If we have a pickable Id, produce a batch.\r\n // NB: We pass this._pickableId as the FeatureTable's modelId so that it will be treated like a reality model or a map -\r\n // specifically, it can be located and display a tooltip, but can't be selected.\r\n const featureTable = this._pickableId ? new FeatureTable(1, this._pickableId) : undefined;\r\n if (featureTable) {\r\n this._localToWorldTransform.multiplyRange(range, range);\r\n featureTable.insert(new Feature(this._pickableId));\r\n graphic = this._viewport.target.renderSystem.createBatch(graphic, PackedFeatureTable.pack(featureTable), range);\r\n }\r\n\r\n return graphic;\r\n }\r\n\r\n private createGraphic(particles: Particle[], uniformTransparency: number | undefined): RenderGraphic | undefined {\r\n const numParticles = particles.length;\r\n if (numParticles <= 0)\r\n return undefined;\r\n\r\n // To keep scale values close to 1, compute mean size to use as size of quad.\r\n const meanSize = new Vector2d();\r\n let maxSize = 0;\r\n for (const particle of particles) {\r\n meanSize.x += particle.width;\r\n meanSize.y += particle.height;\r\n if (particle.width > maxSize)\r\n maxSize = particle.width;\r\n if (particle.height > maxSize)\r\n maxSize = particle.height;\r\n }\r\n meanSize.x /= numParticles;\r\n meanSize.y /= numParticles;\r\n\r\n // Define InstancedGraphicParams for particles.\r\n const rangeCenter = this._range.center;\r\n const floatsPerTransform = 12;\r\n const transforms = new Float32Array(floatsPerTransform * numParticles);\r\n const bytesPerOverride = 8;\r\n const symbologyOverrides = undefined === uniformTransparency ? new Uint8Array(bytesPerOverride * numParticles) : undefined;\r\n\r\n const viewToWorld = this._viewport.view.getRotation().transpose();\r\n let tfIndex = 0;\r\n let ovrIndex = 0;\r\n for (const particle of particles) {\r\n const scaleX = particle.width / meanSize.x;\r\n const scaleY = particle.height / meanSize.y;\r\n if (this._isViewCoords) {\r\n // Particles already face the camera in view coords - just apply the scale.\r\n transforms[tfIndex + 0] = scaleX;\r\n transforms[tfIndex + 5] = scaleY;\r\n transforms[tfIndex + 10] = 1;\r\n } else if (undefined !== particle.rotationMatrix) {\r\n // Scale rotation matrix relative to size of quad.\r\n transforms[tfIndex + 0] = particle.rotationMatrix.coffs[0] * scaleX;\r\n transforms[tfIndex + 1] = particle.rotationMatrix.coffs[1] * scaleY;\r\n transforms[tfIndex + 2] = particle.rotationMatrix.coffs[2];\r\n transforms[tfIndex + 4] = particle.rotationMatrix.coffs[3] * scaleX;\r\n transforms[tfIndex + 5] = particle.rotationMatrix.coffs[4] * scaleY;\r\n transforms[tfIndex + 6] = particle.rotationMatrix.coffs[5];\r\n transforms[tfIndex + 8] = particle.rotationMatrix.coffs[6] * scaleX;\r\n transforms[tfIndex + 9] = particle.rotationMatrix.coffs[7] * scaleY;\r\n transforms[tfIndex + 10] = particle.rotationMatrix.coffs[8];\r\n } else {\r\n // Rotate about origin by inverse view matrix so quads always face the camera and scale relative to size of quad.\r\n transforms[tfIndex + 0] = viewToWorld.coffs[0] * scaleX;\r\n transforms[tfIndex + 1] = viewToWorld.coffs[1] * scaleY;\r\n transforms[tfIndex + 2] = viewToWorld.coffs[2];\r\n transforms[tfIndex + 4] = viewToWorld.coffs[3] * scaleX;\r\n transforms[tfIndex + 5] = viewToWorld.coffs[4] * scaleY;\r\n transforms[tfIndex + 6] = viewToWorld.coffs[5];\r\n transforms[tfIndex + 8] = viewToWorld.coffs[6] * scaleX;\r\n transforms[tfIndex + 9] = viewToWorld.coffs[7] * scaleY;\r\n transforms[tfIndex + 10] = viewToWorld.coffs[8];\r\n }\r\n\r\n // Translate relative to center of particles range.\r\n transforms[tfIndex + 3] = particle.centroid.x - rangeCenter.x;\r\n transforms[tfIndex + 7] = particle.centroid.y - rangeCenter.y;\r\n transforms[tfIndex + 11] = particle.centroid.z - rangeCenter.z;\r\n\r\n tfIndex += floatsPerTransform;\r\n\r\n if (symbologyOverrides) {\r\n // See FeatureOverrides.buildLookupTable() for layout.\r\n symbologyOverrides[ovrIndex + 0] = 1 << 2; // OvrFlags.Alpha\r\n symbologyOverrides[ovrIndex + 7] = 0xff - particle.transparency;\r\n\r\n ovrIndex += bytesPerOverride;\r\n }\r\n }\r\n\r\n // Produce instanced quads.\r\n // Note: We do not need to allocate an array of featureIds. If we have a pickableId, all particles refer to the same Feature, with index 0.\r\n // So we leave the vertex attribute disabled causing the shader to receive the default (0, 0, 0) which happens to correspond to our feature index.\r\n const quad = createQuad(meanSize, this._texture, uniformTransparency ?? 0x7f);\r\n const transformCenter = new Point3d(0, 0, 0);\r\n const range = computeRange(this._range, rangeCenter, maxSize);\r\n const instances = { count: numParticles, transforms, transformCenter, symbologyOverrides, range };\r\n return this._viewport.target.renderSystem.createMesh(quad, instances);\r\n }\r\n}\r\n\r\nfunction createQuad(size: XAndY, texture: RenderTexture, transparency: number): MeshParams {\r\n const halfWidth = size.x / 2;\r\n const halfHeight = size.y / 2;\r\n const corners = [\r\n new Point3d(-halfWidth, -halfHeight, 0), new Point3d(halfWidth, -halfHeight, 0),\r\n new Point3d(-halfWidth, halfHeight, 0), new Point3d(halfWidth, halfHeight, 0),\r\n ];\r\n\r\n const quadArgs = new MeshArgs();\r\n const range = new Range3d();\r\n range.low = corners[0];\r\n range.high = corners[3];\r\n quadArgs.points = new QPoint3dList(QParams3d.fromRange(range));\r\n for (const corner of corners)\r\n quadArgs.points.add(corner);\r\n\r\n quadArgs.vertIndices = [0, 1, 2, 2, 1, 3];\r\n quadArgs.textureUv = [new Point2d(0, 1), new Point2d(1, 1), new Point2d(0, 0), new Point2d(1, 0)];\r\n quadArgs.texture = texture;\r\n quadArgs.colors.initUniform(ColorDef.white.withTransparency(transparency));\r\n quadArgs.isPlanar = true;\r\n\r\n return MeshParams.create(quadArgs);\r\n}\r\n\r\nfunction clampTransparency(transparency: number): number {\r\n transparency = Math.min(255, transparency, Math.max(0, transparency));\r\n transparency = Math.floor(transparency);\r\n if (transparency < DisplayParams.minTransparency)\r\n transparency = 0;\r\n\r\n return transparency;\r\n}\r\n\r\nfunction computeRange(centroidRange: Range3d, center: Point3d, maxSize: number): Range3d {\r\n const range2 = centroidRange.clone();\r\n range2.low.subtractInPlace(center);\r\n range2.high.subtractInPlace(center);\r\n const halfSize = maxSize * 0.5;\r\n range2.low.x -= halfSize;\r\n range2.low.y -= halfSize;\r\n range2.low.z -= halfSize;\r\n range2.high.x += halfSize;\r\n range2.high.y += halfSize;\r\n range2.high.z += halfSize;\r\n return range2;\r\n}\r\n"]}
1
+ {"version":3,"file":"ParticleCollectionBuilder.js","sourceRoot":"","sources":["../../../src/render/ParticleCollectionBuilder.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 { Id64String } from \"@itwin/core-bentley\";\r\nimport { Matrix3d, Point2d, Point3d, Range3d, Transform, Vector2d, XAndY, XYAndZ } from \"@itwin/core-geometry\";\r\nimport {\r\n ColorDef, ColorIndex, Feature, FeatureIndex, FeatureTable, FillFlags, PackedFeatureTable, QParams3d, QPoint3dList, RenderTexture,\r\n} from \"@itwin/core-common\";\r\nimport { Viewport } from \"../Viewport\";\r\nimport { RenderGraphic } from \"./RenderGraphic\";\r\nimport { GraphicBranch } from \"./GraphicBranch\";\r\nimport { MeshParams } from \"./primitives/VertexTable\";\r\nimport { MeshArgs } from \"./primitives/mesh/MeshPrimitives\";\r\nimport { DisplayParams } from \"./primitives/DisplayParams\";\r\n\r\n/** Parameters used to construct a [[ParticleCollectionBuilder]].\r\n * @public\r\n */\r\nexport interface ParticleCollectionBuilderParams {\r\n /** The image mapped to each particle quad.\r\n * @note The texture should be disposed of when no longer needed to free up WebGL resources. For example, if a [[Decorator]] creates the texture, the\r\n * texture should probably be disposed of when the decorator is removed from the [[ViewManager]].\r\n */\r\n texture: RenderTexture;\r\n\r\n /** The default extents of the particle quad. Individual particles may apply a scale to these extents to produce particles of varying dimensions.\r\n * Must be positive.\r\n */\r\n size: XAndY | number;\r\n\r\n /** The initial transparency of the particles as an integer in [0,255]. Defaults to zero if omitted. */\r\n transparency?: number;\r\n\r\n /** The origin of the particle collection in world coordinates. Defaults to (0, 0, 0). */\r\n origin?: XYAndZ;\r\n\r\n /** If the particles are to be pickable, a unique identifier to associate with the resultant [[RenderGraphic]].\r\n * @see [[IModelConnection.transientIdSequence]] to obtain an Id that is unique within an iModel.\r\n */\r\n pickableId?: Id64String;\r\n\r\n /** The viewport in which the particles will be drawn. */\r\n viewport: Viewport;\r\n\r\n /** If true, the finished graphic will be defined in view coordinates, for use as a decoration of type [[GraphicType.ViewBackground]] or [[GraphicType.ViewOverlay]].\r\n * Defaults to false, indicating the graphic will be defined in world coordinates.\r\n * @see [[CoordSystem.View]] and [[CoordSystem.World]].\r\n */\r\n isViewCoords?: boolean;\r\n}\r\n\r\n/** Describes a particle to to add to a particle collection via [[ParticleCollectionBuilder.addParticle]].\r\n * The x, y, and z coordinates represent the centroid of the particle quad in the collection's coordinate space.\r\n * @public\r\n */\r\nexport interface ParticleProps extends XYAndZ {\r\n /** The size of the particle, in the collection's coordinate space. If omitted, it defaults to the size supplied to the collection by [[ParticleCollectionBuilderParams.size]].\r\n * Supplying a `number` produces a square; supplying a non-uniform `XAndY` produces a rectangle. Must be positive.\r\n */\r\n size?: XAndY | number;\r\n\r\n /** The transparency with which to draw the particle as an integer in [0,255]. If omitted, it defaults to the current value of [[ParticleCollectionBuilder.transparency]]. */\r\n transparency?: number;\r\n\r\n /** A rotation matrix to orient the particle. If supplied then the particle will not be automatically oriented towards the camera. */\r\n rotationMatrix?: Matrix3d;\r\n}\r\n\r\n/** Interface for producing a collection of particles suitable for use in particle effects.\r\n * Particle effects involve animating hundreds or thousands of small particles to simulate phenomena like smoke, fire, snow, etc.\r\n * A particle collection represents each particle as a quad (rectangle) displaying an image. The position of each particle corresponds to the\r\n * centroid of its quad. The transparency and size of each particle can be specified individually. By default, the quads will always rotate to face the camera\r\n * such that the image is fully visible.\r\n *\r\n * Creating a particle collection using a ParticleCollectionBuilder is far more efficient (in both CPU and GPU usage) than doing so using a [[GraphicBuilder]].\r\n * @see interactive demonstrations of [Snow and Rain](https://www.itwinjs.org/sample-showcase/?group=Viewer+Features&sample=snow-rain-sample&imodel=Villa) and\r\n * [Fire and Smoke](https://www.itwinjs.org/sample-showcase/?group=Viewer+Features&sample=fire-sample&imodel=Villa) particle effects.\r\n * @see [SnowEffect]($frontend-devtools) for an example of a particle effect.\r\n * @public\r\n */\r\nexport interface ParticleCollectionBuilder {\r\n /** The default transparency for newly-added particles as an integer in [0,255], used by [[ParticleCollectionBuilder.addParticle]] if [[ParticleProps.transparency]] is omitted.\r\n * Changing this value has no effect on the transparency of previously-added particles.\r\n */\r\n transparency: number;\r\n\r\n /** The default size of each particle, used by [[ParticleCollectionBuilder.addParticle]] if [[ParticleProps.size]] is omitted. */\r\n size: XAndY;\r\n\r\n /** Add a particle to the collection.\r\n * If `size` is omitted, `this.size` is used.\r\n * If `transparency` is omitted, `this.transparency` is used.\r\n * @throws Error if particle size is defined and not greater than zero.\r\n */\r\n addParticle: (particle: ParticleProps) => void;\r\n\r\n /** Produces a finished graphic from the accumulated particles.\r\n * It returns the finished graphic, or `undefined` if the collection contains no particles or the [[RenderSystem]] failed to produce the graphic.\r\n * @note After this method returns, the particle collection is empty.\r\n */\r\n finish: () => RenderGraphic | undefined;\r\n}\r\n\r\n/** @public */\r\nexport namespace ParticleCollectionBuilder {\r\n /** Creates a new ParticleCollectionBuilder.\r\n * @throws Error if size is not greater than zero.\r\n */\r\n export function create(params: ParticleCollectionBuilderParams): ParticleCollectionBuilder {\r\n return new Builder(params);\r\n }\r\n}\r\n\r\nclass Particle {\r\n public readonly centroid: Point3d;\r\n public readonly transparency: number;\r\n public readonly width: number;\r\n public readonly height: number;\r\n public readonly rotationMatrix?: Matrix3d;\r\n\r\n public constructor(centroid: XYAndZ, width: number, height: number, transparency: number, rotationMatrix?: Matrix3d) {\r\n this.centroid = Point3d.fromJSON(centroid);\r\n this.transparency = transparency;\r\n this.width = width;\r\n this.height = height;\r\n this.rotationMatrix = rotationMatrix;\r\n }\r\n}\r\n\r\nclass Builder implements ParticleCollectionBuilder {\r\n private readonly _viewport: Viewport;\r\n private readonly _isViewCoords: boolean;\r\n private readonly _pickableId?: Id64String;\r\n private readonly _texture: RenderTexture;\r\n private readonly _size: Vector2d;\r\n private _transparency: number;\r\n private _hasVaryingTransparency = false;\r\n private readonly _localToWorldTransform: Transform;\r\n private readonly _range = Range3d.createNull();\r\n private _particlesOpaque: Particle[] = [];\r\n private _particlesTranslucent: Particle[] = [];\r\n\r\n public constructor(params: ParticleCollectionBuilderParams) {\r\n this._viewport = params.viewport;\r\n this._isViewCoords = true === params.isViewCoords;\r\n this._pickableId = params.pickableId;\r\n this._texture = params.texture;\r\n this._transparency = undefined !== params.transparency ? clampTransparency(params.transparency) : 0;\r\n this._localToWorldTransform = params.origin ? Transform.createTranslationXYZ(params.origin.x, params.origin.y, params.origin.z) : Transform.createIdentity();\r\n\r\n if (\"number\" === typeof params.size)\r\n this._size = new Vector2d(params.size, params.size);\r\n else\r\n this._size = Vector2d.fromJSON(params.size);\r\n\r\n if (this._size.x <= 0 || this._size.y <= 0)\r\n throw new Error(\"Particle size must be greater than zero\");\r\n }\r\n\r\n public get size(): XAndY {\r\n return this._size;\r\n }\r\n\r\n public get transparency() {\r\n return this._transparency;\r\n }\r\n\r\n public set transparency(transparency: number) {\r\n transparency = clampTransparency(transparency);\r\n if (transparency !== this._transparency) {\r\n this._transparency = transparency;\r\n this._hasVaryingTransparency = this._particlesTranslucent.length > 0;\r\n }\r\n }\r\n\r\n public addParticle(props: ParticleProps): void {\r\n const size = props.size ?? this._size;\r\n let width, height;\r\n if (\"number\" === typeof size) {\r\n width = height = size;\r\n } else {\r\n width = size.x;\r\n height = size.y;\r\n }\r\n\r\n if (width <= 0 || height <= 0)\r\n throw new Error(\"A particle must have a size greater than zero\");\r\n\r\n const transparency = undefined !== props.transparency ? clampTransparency(props.transparency) : this.transparency;\r\n if (transparency !== this.transparency && this._particlesTranslucent.length > 0)\r\n this._hasVaryingTransparency = true;\r\n\r\n const particle = new Particle(props, width, height, transparency, props.rotationMatrix);\r\n if (transparency > 0)\r\n this._particlesTranslucent.push(particle);\r\n else\r\n this._particlesOpaque.push(particle);\r\n this._range.extendPoint(particle.centroid);\r\n }\r\n\r\n public finish(): RenderGraphic | undefined {\r\n if (0 === this._particlesTranslucent.length + this._particlesOpaque.length)\r\n return undefined;\r\n\r\n // Order-independent transparency doesn't work well with opaque geometry - it will look semi-transparent.\r\n // If we have a mix of opaque and transparent particles, put them in separate graphics to be rendered in separate passes.\r\n const opaque = this.createGraphic(this._particlesOpaque, 0);\r\n const transparent = this.createGraphic(this._particlesTranslucent, this._hasVaryingTransparency ? undefined : this._transparency);\r\n\r\n // Empty the collection before any return statements.\r\n const range = this._range.clone();\r\n this._range.setNull();\r\n this._particlesOpaque.length = 0;\r\n this._particlesTranslucent.length = 0;\r\n this._hasVaryingTransparency = false;\r\n\r\n if (!transparent && !opaque)\r\n return undefined;\r\n\r\n // Transform from origin to collection, then to world.\r\n const toCollection = Transform.createTranslation(range.center);\r\n const toWorld = toCollection.multiplyTransformTransform(this._localToWorldTransform);\r\n const branch = new GraphicBranch(true);\r\n if (opaque)\r\n branch.add(opaque);\r\n\r\n if (transparent)\r\n branch.add(transparent);\r\n\r\n let graphic = this._viewport.target.renderSystem.createGraphicBranch(branch, toWorld);\r\n\r\n // If we have a pickable Id, produce a batch.\r\n // NB: We pass this._pickableId as the FeatureTable's modelId so that it will be treated like a reality model or a map -\r\n // specifically, it can be located and display a tooltip, but can't be selected.\r\n const featureTable = this._pickableId ? new FeatureTable(1, this._pickableId) : undefined;\r\n if (featureTable) {\r\n this._localToWorldTransform.multiplyRange(range, range);\r\n featureTable.insert(new Feature(this._pickableId));\r\n graphic = this._viewport.target.renderSystem.createBatch(graphic, PackedFeatureTable.pack(featureTable), range);\r\n }\r\n\r\n return graphic;\r\n }\r\n\r\n private createGraphic(particles: Particle[], uniformTransparency: number | undefined): RenderGraphic | undefined {\r\n const numParticles = particles.length;\r\n if (numParticles <= 0)\r\n return undefined;\r\n\r\n // To keep scale values close to 1, compute mean size to use as size of quad.\r\n const meanSize = new Vector2d();\r\n let maxSize = 0;\r\n for (const particle of particles) {\r\n meanSize.x += particle.width;\r\n meanSize.y += particle.height;\r\n if (particle.width > maxSize)\r\n maxSize = particle.width;\r\n if (particle.height > maxSize)\r\n maxSize = particle.height;\r\n }\r\n meanSize.x /= numParticles;\r\n meanSize.y /= numParticles;\r\n\r\n // Define InstancedGraphicParams for particles.\r\n const rangeCenter = this._range.center;\r\n const floatsPerTransform = 12;\r\n const transforms = new Float32Array(floatsPerTransform * numParticles);\r\n const bytesPerOverride = 8;\r\n const symbologyOverrides = undefined === uniformTransparency ? new Uint8Array(bytesPerOverride * numParticles) : undefined;\r\n\r\n const viewToWorld = this._viewport.view.getRotation().transpose();\r\n let tfIndex = 0;\r\n let ovrIndex = 0;\r\n for (const particle of particles) {\r\n const scaleX = particle.width / meanSize.x;\r\n const scaleY = particle.height / meanSize.y;\r\n if (this._isViewCoords) {\r\n // Particles already face the camera in view coords - just apply the scale.\r\n transforms[tfIndex + 0] = scaleX;\r\n transforms[tfIndex + 5] = scaleY;\r\n transforms[tfIndex + 10] = 1;\r\n } else if (undefined !== particle.rotationMatrix) {\r\n // Scale rotation matrix relative to size of quad.\r\n transforms[tfIndex + 0] = particle.rotationMatrix.coffs[0] * scaleX;\r\n transforms[tfIndex + 1] = particle.rotationMatrix.coffs[1] * scaleY;\r\n transforms[tfIndex + 2] = particle.rotationMatrix.coffs[2];\r\n transforms[tfIndex + 4] = particle.rotationMatrix.coffs[3] * scaleX;\r\n transforms[tfIndex + 5] = particle.rotationMatrix.coffs[4] * scaleY;\r\n transforms[tfIndex + 6] = particle.rotationMatrix.coffs[5];\r\n transforms[tfIndex + 8] = particle.rotationMatrix.coffs[6] * scaleX;\r\n transforms[tfIndex + 9] = particle.rotationMatrix.coffs[7] * scaleY;\r\n transforms[tfIndex + 10] = particle.rotationMatrix.coffs[8];\r\n } else {\r\n // Rotate about origin by inverse view matrix so quads always face the camera and scale relative to size of quad.\r\n transforms[tfIndex + 0] = viewToWorld.coffs[0] * scaleX;\r\n transforms[tfIndex + 1] = viewToWorld.coffs[1] * scaleY;\r\n transforms[tfIndex + 2] = viewToWorld.coffs[2];\r\n transforms[tfIndex + 4] = viewToWorld.coffs[3] * scaleX;\r\n transforms[tfIndex + 5] = viewToWorld.coffs[4] * scaleY;\r\n transforms[tfIndex + 6] = viewToWorld.coffs[5];\r\n transforms[tfIndex + 8] = viewToWorld.coffs[6] * scaleX;\r\n transforms[tfIndex + 9] = viewToWorld.coffs[7] * scaleY;\r\n transforms[tfIndex + 10] = viewToWorld.coffs[8];\r\n }\r\n\r\n // Translate relative to center of particles range.\r\n transforms[tfIndex + 3] = particle.centroid.x - rangeCenter.x;\r\n transforms[tfIndex + 7] = particle.centroid.y - rangeCenter.y;\r\n transforms[tfIndex + 11] = particle.centroid.z - rangeCenter.z;\r\n\r\n tfIndex += floatsPerTransform;\r\n\r\n if (symbologyOverrides) {\r\n // See FeatureOverrides.buildLookupTable() for layout.\r\n symbologyOverrides[ovrIndex + 0] = 1 << 2; // OvrFlags.Alpha\r\n symbologyOverrides[ovrIndex + 7] = 0xff - particle.transparency;\r\n\r\n ovrIndex += bytesPerOverride;\r\n }\r\n }\r\n\r\n // Produce instanced quads.\r\n // Note: We do not need to allocate an array of featureIds. If we have a pickableId, all particles refer to the same Feature, with index 0.\r\n // So we leave the vertex attribute disabled causing the shader to receive the default (0, 0, 0) which happens to correspond to our feature index.\r\n const quad = createQuad(meanSize, this._texture, uniformTransparency ?? 0x7f);\r\n const transformCenter = new Point3d(0, 0, 0);\r\n const range = computeRange(this._range, rangeCenter, maxSize);\r\n const instances = { count: numParticles, transforms, transformCenter, symbologyOverrides, range };\r\n return this._viewport.target.renderSystem.createMesh(quad, instances);\r\n }\r\n}\r\n\r\nfunction createQuad(size: XAndY, texture: RenderTexture, transparency: number): MeshParams {\r\n const halfWidth = size.x / 2;\r\n const halfHeight = size.y / 2;\r\n const corners = [\r\n new Point3d(-halfWidth, -halfHeight, 0), new Point3d(halfWidth, -halfHeight, 0),\r\n new Point3d(-halfWidth, halfHeight, 0), new Point3d(halfWidth, halfHeight, 0),\r\n ];\r\n\r\n const range = new Range3d();\r\n range.low = corners[0];\r\n range.high = corners[3];\r\n\r\n const points = new QPoint3dList(QParams3d.fromRange(range));\r\n for (const corner of corners)\r\n points.add(corner);\r\n\r\n const colors = new ColorIndex();\r\n colors.initUniform(ColorDef.white.withTransparency(transparency));\r\n\r\n const quadArgs: MeshArgs = {\r\n points,\r\n vertIndices: [0, 1, 2, 2, 1, 3],\r\n fillFlags: FillFlags.None,\r\n isPlanar: true,\r\n colors,\r\n features: new FeatureIndex(),\r\n textureMapping: {\r\n texture,\r\n uvParams: [new Point2d(0, 1), new Point2d(1, 1), new Point2d(0, 0), new Point2d(1, 0)],\r\n },\r\n };\r\n\r\n return MeshParams.create(quadArgs);\r\n}\r\n\r\nfunction clampTransparency(transparency: number): number {\r\n transparency = Math.min(255, transparency, Math.max(0, transparency));\r\n transparency = Math.floor(transparency);\r\n if (transparency < DisplayParams.minTransparency)\r\n transparency = 0;\r\n\r\n return transparency;\r\n}\r\n\r\nfunction computeRange(centroidRange: Range3d, center: Point3d, maxSize: number): Range3d {\r\n const range2 = centroidRange.clone();\r\n range2.low.subtractInPlace(center);\r\n range2.high.subtractInPlace(center);\r\n const halfSize = maxSize * 0.5;\r\n range2.low.x -= halfSize;\r\n range2.low.y -= halfSize;\r\n range2.low.z -= halfSize;\r\n range2.high.x += halfSize;\r\n range2.high.y += halfSize;\r\n range2.high.z += halfSize;\r\n return range2;\r\n}\r\n"]}