@itwin/core-frontend 4.4.0-dev.8 → 4.4.0

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 (210) hide show
  1. package/CHANGELOG.md +40 -1
  2. package/lib/cjs/DisplayStyleState.d.ts +3 -0
  3. package/lib/cjs/DisplayStyleState.d.ts.map +1 -1
  4. package/lib/cjs/DisplayStyleState.js +10 -0
  5. package/lib/cjs/DisplayStyleState.js.map +1 -1
  6. package/lib/cjs/Viewport.d.ts +5 -0
  7. package/lib/cjs/Viewport.d.ts.map +1 -1
  8. package/lib/cjs/Viewport.js +6 -0
  9. package/lib/cjs/Viewport.js.map +1 -1
  10. package/lib/cjs/common/gltf/GltfSchema.d.ts +20 -3
  11. package/lib/cjs/common/gltf/GltfSchema.d.ts.map +1 -1
  12. package/lib/cjs/common/gltf/GltfSchema.js.map +1 -1
  13. package/lib/cjs/common/imdl/ImdlModel.d.ts +15 -1
  14. package/lib/cjs/common/imdl/ImdlModel.d.ts.map +1 -1
  15. package/lib/cjs/common/imdl/ImdlModel.js +11 -3
  16. package/lib/cjs/common/imdl/ImdlModel.js.map +1 -1
  17. package/lib/cjs/common/imdl/ParseImdlDocument.d.ts +3 -1
  18. package/lib/cjs/common/imdl/ParseImdlDocument.d.ts.map +1 -1
  19. package/lib/cjs/common/imdl/ParseImdlDocument.js +66 -11
  20. package/lib/cjs/common/imdl/ParseImdlDocument.js.map +1 -1
  21. package/lib/cjs/render/GraphicBranch.d.ts +10 -0
  22. package/lib/cjs/render/GraphicBranch.d.ts.map +1 -1
  23. package/lib/cjs/render/GraphicBranch.js.map +1 -1
  24. package/lib/cjs/render/webgl/BranchState.d.ts +2 -0
  25. package/lib/cjs/render/webgl/BranchState.d.ts.map +1 -1
  26. package/lib/cjs/render/webgl/BranchState.js +2 -0
  27. package/lib/cjs/render/webgl/BranchState.js.map +1 -1
  28. package/lib/cjs/render/webgl/Graphic.d.ts.map +1 -1
  29. package/lib/cjs/render/webgl/Graphic.js +3 -0
  30. package/lib/cjs/render/webgl/Graphic.js.map +1 -1
  31. package/lib/cjs/render/webgl/InstancedGeometry.d.ts +1 -0
  32. package/lib/cjs/render/webgl/InstancedGeometry.d.ts.map +1 -1
  33. package/lib/cjs/render/webgl/InstancedGeometry.js +1 -0
  34. package/lib/cjs/render/webgl/InstancedGeometry.js.map +1 -1
  35. package/lib/cjs/render/webgl/RealityMesh.d.ts.map +1 -1
  36. package/lib/cjs/render/webgl/RealityMesh.js +6 -0
  37. package/lib/cjs/render/webgl/RealityMesh.js.map +1 -1
  38. package/lib/cjs/request/utils.d.ts +18 -0
  39. package/lib/cjs/request/utils.d.ts.map +1 -0
  40. package/lib/cjs/request/utils.js +45 -0
  41. package/lib/cjs/request/utils.js.map +1 -0
  42. package/lib/cjs/tile/BatchedTileIdMap.d.ts +1 -2
  43. package/lib/cjs/tile/BatchedTileIdMap.d.ts.map +1 -1
  44. package/lib/cjs/tile/BatchedTileIdMap.js +3 -3
  45. package/lib/cjs/tile/BatchedTileIdMap.js.map +1 -1
  46. package/lib/cjs/tile/GltfReader.d.ts +4 -1
  47. package/lib/cjs/tile/GltfReader.d.ts.map +1 -1
  48. package/lib/cjs/tile/GltfReader.js +126 -21
  49. package/lib/cjs/tile/GltfReader.js.map +1 -1
  50. package/lib/cjs/tile/ImdlDecoder.d.ts +7 -1
  51. package/lib/cjs/tile/ImdlDecoder.d.ts.map +1 -1
  52. package/lib/cjs/tile/ImdlDecoder.js.map +1 -1
  53. package/lib/cjs/tile/ImdlGraphicsCreator.d.ts.map +1 -1
  54. package/lib/cjs/tile/ImdlGraphicsCreator.js +28 -17
  55. package/lib/cjs/tile/ImdlGraphicsCreator.js.map +1 -1
  56. package/lib/cjs/tile/ImdlReader.d.ts +2 -1
  57. package/lib/cjs/tile/ImdlReader.d.ts.map +1 -1
  58. package/lib/cjs/tile/ImdlReader.js +1 -0
  59. package/lib/cjs/tile/ImdlReader.js.map +1 -1
  60. package/lib/cjs/tile/RealityModelTileTree.d.ts.map +1 -1
  61. package/lib/cjs/tile/RealityModelTileTree.js +2 -3
  62. package/lib/cjs/tile/RealityModelTileTree.js.map +1 -1
  63. package/lib/cjs/tile/RealityTileTree.d.ts +31 -0
  64. package/lib/cjs/tile/RealityTileTree.d.ts.map +1 -1
  65. package/lib/cjs/tile/RealityTileTree.js +6 -0
  66. package/lib/cjs/tile/RealityTileTree.js.map +1 -1
  67. package/lib/cjs/tile/TileDrawArgs.d.ts +6 -0
  68. package/lib/cjs/tile/TileDrawArgs.d.ts.map +1 -1
  69. package/lib/cjs/tile/TileDrawArgs.js +7 -0
  70. package/lib/cjs/tile/TileDrawArgs.js.map +1 -1
  71. package/lib/cjs/tile/TileTreeReference.d.ts +2 -0
  72. package/lib/cjs/tile/TileTreeReference.d.ts.map +1 -1
  73. package/lib/cjs/tile/TileTreeReference.js +5 -0
  74. package/lib/cjs/tile/TileTreeReference.js.map +1 -1
  75. package/lib/cjs/tile/map/ArcGISTileMap.d.ts +6 -2
  76. package/lib/cjs/tile/map/ArcGISTileMap.d.ts.map +1 -1
  77. package/lib/cjs/tile/map/ArcGISTileMap.js +127 -69
  78. package/lib/cjs/tile/map/ArcGISTileMap.js.map +1 -1
  79. package/lib/cjs/tile/map/ArcGisUtilities.d.ts.map +1 -1
  80. package/lib/cjs/tile/map/ArcGisUtilities.js +5 -0
  81. package/lib/cjs/tile/map/ArcGisUtilities.js.map +1 -1
  82. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
  83. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js +61 -39
  84. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  85. package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +1 -1
  86. package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  87. package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts +6 -0
  88. package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
  89. package/lib/cjs/tile/map/MapLayerImageryProvider.js +47 -7
  90. package/lib/cjs/tile/map/MapLayerImageryProvider.js.map +1 -1
  91. package/lib/cjs/tile/map/WmsCapabilities.d.ts.map +1 -1
  92. package/lib/cjs/tile/map/WmsCapabilities.js +1 -15
  93. package/lib/cjs/tile/map/WmsCapabilities.js.map +1 -1
  94. package/lib/cjs/tile/map/WmsUtilities.d.ts +7 -0
  95. package/lib/cjs/tile/map/WmsUtilities.d.ts.map +1 -1
  96. package/lib/cjs/tile/map/WmsUtilities.js +22 -0
  97. package/lib/cjs/tile/map/WmsUtilities.js.map +1 -1
  98. package/lib/cjs/tile/map/WmtsCapabilities.d.ts.map +1 -1
  99. package/lib/cjs/tile/map/WmtsCapabilities.js +2 -16
  100. package/lib/cjs/tile/map/WmtsCapabilities.js.map +1 -1
  101. package/lib/cjs/tools/SelectTool.d.ts +1 -0
  102. package/lib/cjs/tools/SelectTool.d.ts.map +1 -1
  103. package/lib/cjs/tools/SelectTool.js +19 -13
  104. package/lib/cjs/tools/SelectTool.js.map +1 -1
  105. package/lib/esm/DisplayStyleState.d.ts +3 -0
  106. package/lib/esm/DisplayStyleState.d.ts.map +1 -1
  107. package/lib/esm/DisplayStyleState.js +10 -0
  108. package/lib/esm/DisplayStyleState.js.map +1 -1
  109. package/lib/esm/Viewport.d.ts +5 -0
  110. package/lib/esm/Viewport.d.ts.map +1 -1
  111. package/lib/esm/Viewport.js +6 -0
  112. package/lib/esm/Viewport.js.map +1 -1
  113. package/lib/esm/common/gltf/GltfSchema.d.ts +20 -3
  114. package/lib/esm/common/gltf/GltfSchema.d.ts.map +1 -1
  115. package/lib/esm/common/gltf/GltfSchema.js.map +1 -1
  116. package/lib/esm/common/imdl/ImdlModel.d.ts +15 -1
  117. package/lib/esm/common/imdl/ImdlModel.d.ts.map +1 -1
  118. package/lib/esm/common/imdl/ImdlModel.js +11 -3
  119. package/lib/esm/common/imdl/ImdlModel.js.map +1 -1
  120. package/lib/esm/common/imdl/ParseImdlDocument.d.ts +3 -1
  121. package/lib/esm/common/imdl/ParseImdlDocument.d.ts.map +1 -1
  122. package/lib/esm/common/imdl/ParseImdlDocument.js +67 -12
  123. package/lib/esm/common/imdl/ParseImdlDocument.js.map +1 -1
  124. package/lib/esm/render/GraphicBranch.d.ts +10 -0
  125. package/lib/esm/render/GraphicBranch.d.ts.map +1 -1
  126. package/lib/esm/render/GraphicBranch.js.map +1 -1
  127. package/lib/esm/render/webgl/BranchState.d.ts +2 -0
  128. package/lib/esm/render/webgl/BranchState.d.ts.map +1 -1
  129. package/lib/esm/render/webgl/BranchState.js +2 -0
  130. package/lib/esm/render/webgl/BranchState.js.map +1 -1
  131. package/lib/esm/render/webgl/Graphic.d.ts.map +1 -1
  132. package/lib/esm/render/webgl/Graphic.js +3 -0
  133. package/lib/esm/render/webgl/Graphic.js.map +1 -1
  134. package/lib/esm/render/webgl/InstancedGeometry.d.ts +1 -0
  135. package/lib/esm/render/webgl/InstancedGeometry.d.ts.map +1 -1
  136. package/lib/esm/render/webgl/InstancedGeometry.js +1 -0
  137. package/lib/esm/render/webgl/InstancedGeometry.js.map +1 -1
  138. package/lib/esm/render/webgl/RealityMesh.d.ts.map +1 -1
  139. package/lib/esm/render/webgl/RealityMesh.js +6 -0
  140. package/lib/esm/render/webgl/RealityMesh.js.map +1 -1
  141. package/lib/esm/request/utils.d.ts +18 -0
  142. package/lib/esm/request/utils.d.ts.map +1 -0
  143. package/lib/esm/request/utils.js +40 -0
  144. package/lib/esm/request/utils.js.map +1 -0
  145. package/lib/esm/tile/BatchedTileIdMap.d.ts +1 -2
  146. package/lib/esm/tile/BatchedTileIdMap.d.ts.map +1 -1
  147. package/lib/esm/tile/BatchedTileIdMap.js +3 -3
  148. package/lib/esm/tile/BatchedTileIdMap.js.map +1 -1
  149. package/lib/esm/tile/GltfReader.d.ts +4 -1
  150. package/lib/esm/tile/GltfReader.d.ts.map +1 -1
  151. package/lib/esm/tile/GltfReader.js +127 -22
  152. package/lib/esm/tile/GltfReader.js.map +1 -1
  153. package/lib/esm/tile/ImdlDecoder.d.ts +7 -1
  154. package/lib/esm/tile/ImdlDecoder.d.ts.map +1 -1
  155. package/lib/esm/tile/ImdlDecoder.js.map +1 -1
  156. package/lib/esm/tile/ImdlGraphicsCreator.d.ts.map +1 -1
  157. package/lib/esm/tile/ImdlGraphicsCreator.js +28 -17
  158. package/lib/esm/tile/ImdlGraphicsCreator.js.map +1 -1
  159. package/lib/esm/tile/ImdlReader.d.ts +2 -1
  160. package/lib/esm/tile/ImdlReader.d.ts.map +1 -1
  161. package/lib/esm/tile/ImdlReader.js +1 -0
  162. package/lib/esm/tile/ImdlReader.js.map +1 -1
  163. package/lib/esm/tile/RealityModelTileTree.d.ts.map +1 -1
  164. package/lib/esm/tile/RealityModelTileTree.js +2 -3
  165. package/lib/esm/tile/RealityModelTileTree.js.map +1 -1
  166. package/lib/esm/tile/RealityTileTree.d.ts +31 -0
  167. package/lib/esm/tile/RealityTileTree.d.ts.map +1 -1
  168. package/lib/esm/tile/RealityTileTree.js +6 -0
  169. package/lib/esm/tile/RealityTileTree.js.map +1 -1
  170. package/lib/esm/tile/TileDrawArgs.d.ts +6 -0
  171. package/lib/esm/tile/TileDrawArgs.d.ts.map +1 -1
  172. package/lib/esm/tile/TileDrawArgs.js +8 -1
  173. package/lib/esm/tile/TileDrawArgs.js.map +1 -1
  174. package/lib/esm/tile/TileTreeReference.d.ts +2 -0
  175. package/lib/esm/tile/TileTreeReference.d.ts.map +1 -1
  176. package/lib/esm/tile/TileTreeReference.js +5 -0
  177. package/lib/esm/tile/TileTreeReference.js.map +1 -1
  178. package/lib/esm/tile/map/ArcGISTileMap.d.ts +6 -2
  179. package/lib/esm/tile/map/ArcGISTileMap.d.ts.map +1 -1
  180. package/lib/esm/tile/map/ArcGISTileMap.js +130 -71
  181. package/lib/esm/tile/map/ArcGISTileMap.js.map +1 -1
  182. package/lib/esm/tile/map/ArcGisUtilities.d.ts.map +1 -1
  183. package/lib/esm/tile/map/ArcGisUtilities.js +5 -0
  184. package/lib/esm/tile/map/ArcGisUtilities.js.map +1 -1
  185. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
  186. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js +61 -39
  187. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  188. package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +1 -1
  189. package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  190. package/lib/esm/tile/map/MapLayerImageryProvider.d.ts +6 -0
  191. package/lib/esm/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
  192. package/lib/esm/tile/map/MapLayerImageryProvider.js +48 -8
  193. package/lib/esm/tile/map/MapLayerImageryProvider.js.map +1 -1
  194. package/lib/esm/tile/map/WmsCapabilities.d.ts.map +1 -1
  195. package/lib/esm/tile/map/WmsCapabilities.js +1 -15
  196. package/lib/esm/tile/map/WmsCapabilities.js.map +1 -1
  197. package/lib/esm/tile/map/WmsUtilities.d.ts +7 -0
  198. package/lib/esm/tile/map/WmsUtilities.d.ts.map +1 -1
  199. package/lib/esm/tile/map/WmsUtilities.js +22 -0
  200. package/lib/esm/tile/map/WmsUtilities.js.map +1 -1
  201. package/lib/esm/tile/map/WmtsCapabilities.d.ts.map +1 -1
  202. package/lib/esm/tile/map/WmtsCapabilities.js +2 -16
  203. package/lib/esm/tile/map/WmtsCapabilities.js.map +1 -1
  204. package/lib/esm/tools/SelectTool.d.ts +1 -0
  205. package/lib/esm/tools/SelectTool.d.ts.map +1 -1
  206. package/lib/esm/tools/SelectTool.js +19 -13
  207. package/lib/esm/tools/SelectTool.js.map +1 -1
  208. package/lib/public/scripts/parse-imdl-worker.js +1 -1
  209. package/lib/workers/webpack/parse-imdl-worker.js +1 -1
  210. package/package.json +20 -19
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import { assert, ByteStream, compareBooleans, compareNumbers, compareStrings, Dictionary, JsonUtils, Logger, utf8ToString, } from "@itwin/core-bentley";
9
9
  import { Angle, IndexedPolyface, Matrix3d, Point2d, Point3d, Point4d, Range2d, Range3d, Transform, Vector3d, } from "@itwin/core-geometry";
10
- import { BatchType, ColorDef, Feature, FeatureIndex, FeatureIndexType, FeatureTable, FillFlags, GlbHeader, ImageSource, LinePixels, MeshEdge, MeshEdges, MeshPolyline, OctEncodedNormal, PackedFeatureTable, QParams2d, QParams3d, QPoint2dList, QPoint3dList, Quantization, RenderTexture, TextureMapping, TextureTransparency, TileFormat, TileReadStatus, } from "@itwin/core-common";
10
+ import { BatchType, ColorDef, Feature, FeatureIndex, FeatureIndexType, FeatureTable, FillFlags, GlbHeader, ImageSource, LinePixels, MeshEdge, MeshEdges, MeshPolyline, OctEncodedNormal, PackedFeatureTable, QParams2d, QParams3d, QPoint2dList, QPoint3dList, Quantization, RenderMode, RenderTexture, TextureMapping, TextureTransparency, TileFormat, TileReadStatus, } from "@itwin/core-common";
11
11
  import { IModelApp } from "../IModelApp";
12
12
  import { GraphicBranch } from "../render/GraphicBranch";
13
13
  import { RealityMeshParams } from "../render/RealityMeshParams";
@@ -206,6 +206,17 @@ function colorFromMaterial(material, isTransparent) {
206
206
  color = color.withTransparency(0);
207
207
  return color;
208
208
  }
209
+ function trsMatrix(translation, rotation, scale, result) {
210
+ // SPEC: To compose the local transformation matrix, TRS properties MUST be converted to matrices and postmultiplied in the T * R * S order;
211
+ // first the scale is applied to the vertices, then the rotation, and then the translation.
212
+ const scaleTf = Transform.createRefs(undefined, scale ? Matrix3d.createScale(scale[0], scale[1], scale[2]) : Matrix3d.identity);
213
+ const rotTf = Transform.createRefs(undefined, rotation ? Matrix3d.createFromQuaternion(Point4d.create(rotation[0], rotation[1], rotation[2], rotation[3])) : Matrix3d.identity);
214
+ rotTf.matrix.transposeInPlace(); // See comment on Matrix3d.createFromQuaternion
215
+ const transTf = Transform.createTranslation(translation ? new Point3d(translation[0], translation[1], translation[2]) : Point3d.createZero());
216
+ const tf = scaleTf.multiplyTransformTransform(rotTf, result);
217
+ transTf.multiplyTransformTransform(tf, tf);
218
+ return tf;
219
+ }
209
220
  class TransformStack {
210
221
  constructor(transform) {
211
222
  this._stack = [];
@@ -226,14 +237,7 @@ class TransformStack {
226
237
  nodeTransform = Transform.createOriginAndMatrix(origin, matrix);
227
238
  }
228
239
  else if (node.rotation || node.scale || node.translation) {
229
- // SPEC: To compose the local transformation matrix, TRS properties MUST be converted to matrices and postmultiplied in the T * R * S order;
230
- // first the scale is applied to the vertices, then the rotation, and then the translation.
231
- const scale = Transform.createRefs(undefined, node.scale ? Matrix3d.createScale(node.scale[0], node.scale[1], node.scale[2]) : Matrix3d.identity);
232
- const rot = Transform.createRefs(undefined, node.rotation ? Matrix3d.createFromQuaternion(Point4d.create(node.rotation[0], node.rotation[1], node.rotation[2], node.rotation[3])) : Matrix3d.identity);
233
- rot.matrix.transposeInPlace(); // See comment on Matrix3d.createFromQuaternion
234
- const trans = Transform.createTranslation(node.translation ? new Point3d(node.translation[0], node.translation[1], node.translation[2]) : Point3d.createZero());
235
- nodeTransform = scale.multiplyTransformTransform(rot);
236
- trans.multiplyTransformTransform(nodeTransform, nodeTransform);
240
+ nodeTransform = trsMatrix(node.translation, node.rotation, node.scale);
237
241
  }
238
242
  const top = this.transform;
239
243
  if (!top)
@@ -286,6 +290,9 @@ export class GltfReader {
286
290
  traverseScene() {
287
291
  return this.traverseNodes(this._sceneNodes);
288
292
  }
293
+ get viewFlagOverrides() {
294
+ return undefined;
295
+ }
289
296
  getTileTransform(transformToRoot, pseudoRtcBias) {
290
297
  let transform;
291
298
  if (this._returnToCenter || pseudoRtcBias || this._yAxisUp || transformToRoot) {
@@ -330,16 +337,23 @@ export class GltfReader {
330
337
  else
331
338
  renderGraphic = this._system.createGraphicList(renderGraphicList);
332
339
  const transform = this.getTileTransform(transformToRoot, pseudoRtcBias);
340
+ // Compute range in tileset/world space.
333
341
  let range = contentRange;
334
342
  const invTransform = transform?.inverse();
335
343
  if (invTransform)
336
344
  range = invTransform.multiplyRange(contentRange);
345
+ // The batch range needs to be in tile coordinate space.
346
+ // If we computed the content range ourselves, it's already in tile space.
347
+ // If the content range was supplied by the caller, it's in tileset space and needs to be transformed to tile space.
337
348
  if (featureTable)
338
- renderGraphic = this._system.createBatch(renderGraphic, PackedFeatureTable.pack(featureTable), range);
339
- if (transform) {
349
+ renderGraphic = this._system.createBatch(renderGraphic, PackedFeatureTable.pack(featureTable), this._computedContentRange ? contentRange : range);
350
+ const viewFlagOverrides = this.viewFlagOverrides;
351
+ if (transform || viewFlagOverrides) {
340
352
  const branch = new GraphicBranch(true);
353
+ if (viewFlagOverrides)
354
+ branch.setViewFlagOverrides(viewFlagOverrides);
341
355
  branch.add(renderGraphic);
342
- renderGraphic = this._system.createBranch(branch, transform);
356
+ renderGraphic = this._system.createBranch(branch, transform ?? Transform.createIdentity());
343
357
  }
344
358
  return {
345
359
  readStatus,
@@ -387,12 +401,76 @@ export class GltfReader {
387
401
  mesh.normals.push(new OctEncodedNormal(normal));
388
402
  return mesh.getGraphics(this._system, instances);
389
403
  }
390
- readNodeAndCreateGraphics(renderGraphicList, node, featureTable, transformStack, instances, pseudoRtcBias) {
404
+ readInstanceAttributes(node, featureTable) {
405
+ const ext = node.extensions?.EXT_mesh_gpu_instancing;
406
+ if (!ext || !ext.attributes) {
407
+ return undefined;
408
+ }
409
+ const translationsView = this.getBufferView(ext.attributes, "TRANSLATION");
410
+ const translations = translationsView?.toBufferData(GltfDataType.Float);
411
+ const rotations = this.getBufferView(ext.attributes, "ROTATION")?.toBufferData(GltfDataType.Float);
412
+ const scales = this.getBufferView(ext.attributes, "SCALE")?.toBufferData(GltfDataType.Float);
413
+ // All attributes must specify the same count, count must be greater than zero, and at least one attribute must be specified.
414
+ const count = translations?.count ?? rotations?.count ?? scales?.count;
415
+ if (!count || (rotations && rotations.count !== count) || (scales && scales.count !== count)) {
416
+ return undefined;
417
+ }
418
+ const transformCenter = new Point3d();
419
+ const trMin = translationsView?.accessor.min;
420
+ const trMax = translationsView?.accessor.max;
421
+ if (trMin && trMax) {
422
+ const half = (idx) => trMin[idx] + (trMax[idx] - trMin[idx]) / 2;
423
+ transformCenter.set(half(0), half(1), half(2));
424
+ }
425
+ const getTranslation = (index) => {
426
+ if (!translations) {
427
+ return undefined;
428
+ }
429
+ index *= 3;
430
+ return [
431
+ translations.buffer[index + 0] - transformCenter.x,
432
+ translations.buffer[index + 1] - transformCenter.y,
433
+ translations.buffer[index + 2] - transformCenter.z,
434
+ ];
435
+ };
436
+ const getRotation = (index) => {
437
+ index *= 4;
438
+ return rotations ? [rotations.buffer[index], rotations.buffer[index + 1], rotations.buffer[index + 2], rotations.buffer[index + 3]] : undefined;
439
+ };
440
+ const getScale = (index) => {
441
+ index *= 3;
442
+ return scales ? [scales.buffer[index], scales.buffer[index + 1], scales.buffer[index + 2]] : undefined;
443
+ };
444
+ const transforms = new Float32Array(3 * 4 * count);
445
+ const transform = Transform.createIdentity();
446
+ for (let i = 0; i < count; i++) {
447
+ const tf = trsMatrix(getTranslation(i), getRotation(i), getScale(i), transform);
448
+ const idx = i * 3 * 4;
449
+ transforms[idx + 0] = tf.matrix.coffs[0];
450
+ transforms[idx + 1] = tf.matrix.coffs[1];
451
+ transforms[idx + 2] = tf.matrix.coffs[2];
452
+ transforms[idx + 3] = tf.origin.x;
453
+ transforms[idx + 4] = tf.matrix.coffs[3];
454
+ transforms[idx + 5] = tf.matrix.coffs[4];
455
+ transforms[idx + 6] = tf.matrix.coffs[5];
456
+ transforms[idx + 7] = tf.origin.y;
457
+ transforms[idx + 8] = tf.matrix.coffs[6];
458
+ transforms[idx + 9] = tf.matrix.coffs[7];
459
+ transforms[idx + 10] = tf.matrix.coffs[8];
460
+ transforms[idx + 11] = tf.origin.z;
461
+ }
462
+ // ###TODO? The extension currently provides no way of specifying per-instance feature Ids.
463
+ // For now, assume that if the feature table contains exactly one feature, all the instances belong to that feature.
464
+ const featureIds = featureTable && featureTable.isUniform ? new Uint8Array(3 * count) : undefined;
465
+ return { count, transforms, transformCenter, featureIds };
466
+ }
467
+ readNodeAndCreateGraphics(renderGraphicList, node, featureTable, transformStack, batchInstances, pseudoRtcBias) {
391
468
  if (undefined === node)
392
469
  return TileReadStatus.InvalidTileData;
393
470
  // IMPORTANT: Do not return without popping this node from the stack.
394
471
  transformStack.push(node);
395
472
  const thisTransform = transformStack.transform;
473
+ const nodeInstances = !batchInstances && undefined !== node.mesh ? this.readInstanceAttributes(node, featureTable) : undefined;
396
474
  /**
397
475
  * This is a workaround for tiles generated by
398
476
  * context capture which have a large offset from the tileset origin that exceeds the
@@ -407,16 +485,16 @@ export class GltfReader {
407
485
  for (const meshKey of getGltfNodeMeshIds(node)) {
408
486
  const nodeMesh = this._meshes[meshKey];
409
487
  if (nodeMesh?.primitives) {
410
- const meshes = this.readMeshPrimitives(node, featureTable, thisTransform, thisBias);
488
+ const meshes = this.readMeshPrimitives(node, featureTable, thisTransform, thisBias, nodeInstances);
411
489
  let renderGraphic;
412
490
  if (0 !== meshes.length) {
413
491
  if (1 === meshes.length) {
414
- renderGraphic = this.graphicFromMeshData(meshes[0], instances);
492
+ renderGraphic = this.graphicFromMeshData(meshes[0], batchInstances ?? nodeInstances);
415
493
  }
416
494
  else {
417
495
  const thisList = [];
418
496
  for (const mesh of meshes) {
419
- renderGraphic = this.graphicFromMeshData(mesh, instances);
497
+ renderGraphic = this.graphicFromMeshData(mesh, batchInstances ?? nodeInstances);
420
498
  if (undefined !== renderGraphic)
421
499
  thisList.push(renderGraphic);
422
500
  }
@@ -438,7 +516,7 @@ export class GltfReader {
438
516
  for (const childId of node.children) {
439
517
  const child = this._nodes[childId];
440
518
  if (child)
441
- this.readNodeAndCreateGraphics(renderGraphicList, child, featureTable, transformStack, instances);
519
+ this.readNodeAndCreateGraphics(renderGraphicList, child, featureTable, transformStack, batchInstances ?? nodeInstances);
442
520
  }
443
521
  }
444
522
  transformStack.pop();
@@ -667,9 +745,9 @@ export class GltfReader {
667
745
  // DisplayParams doesn't want a separate texture mapping if the material already has one.
668
746
  textureMapping = undefined;
669
747
  }
670
- return new DisplayParams(DisplayParams.Type.Mesh, color, color, 1, LinePixels.Solid, FillFlags.Always, renderMaterial, undefined, hasBakedLighting, textureMapping);
748
+ return new DisplayParams(DisplayParams.Type.Mesh, color, color, 1, LinePixels.Solid, FillFlags.None, renderMaterial, undefined, hasBakedLighting, textureMapping);
671
749
  }
672
- readMeshPrimitives(node, featureTable, thisTransform, thisBias) {
750
+ readMeshPrimitives(node, featureTable, thisTransform, thisBias, instances) {
673
751
  const meshes = [];
674
752
  for (const meshKey of getGltfNodeMeshIds(node)) {
675
753
  const nodeMesh = this._meshes[meshKey];
@@ -679,9 +757,30 @@ export class GltfReader {
679
757
  if (mesh) {
680
758
  meshes.push(mesh);
681
759
  if (this._computedContentRange && mesh.pointRange) {
682
- const invTransform = thisTransform?.inverse();
683
- const meshRange = invTransform ? invTransform.multiplyRange(mesh.pointRange) : mesh.pointRange;
684
- this._computedContentRange.extendRange(meshRange);
760
+ const meshRange = thisTransform ? thisTransform.multiplyRange(mesh.pointRange) : mesh.pointRange;
761
+ if (!instances) {
762
+ this._computedContentRange.extendRange(meshRange);
763
+ }
764
+ else {
765
+ const tfs = instances.transforms;
766
+ const nodeRange = new Range3d();
767
+ const extendTransformedRange = (i, x, y, z) => {
768
+ nodeRange.extendXYZ(tfs[i + 3] + tfs[i + 0] * x + tfs[i + 1] * y + tfs[i + 2] * z, tfs[i + 7] + tfs[i + 4] * x + tfs[i + 5] * y + tfs[i + 6] * z, tfs[i + 11] + tfs[i + 8] * x + tfs[i + 9] * y + tfs[i + 10] * z);
769
+ };
770
+ for (let i = 0; i < tfs.length; i += 3 * 4) {
771
+ extendTransformedRange(i, meshRange.low.x, meshRange.low.y, meshRange.low.z);
772
+ extendTransformedRange(i, meshRange.low.x, meshRange.low.y, meshRange.high.z);
773
+ extendTransformedRange(i, meshRange.low.x, meshRange.high.y, meshRange.low.z);
774
+ extendTransformedRange(i, meshRange.low.x, meshRange.high.y, meshRange.high.z);
775
+ extendTransformedRange(i, meshRange.high.x, meshRange.low.y, meshRange.low.z);
776
+ extendTransformedRange(i, meshRange.high.x, meshRange.low.y, meshRange.high.z);
777
+ extendTransformedRange(i, meshRange.high.x, meshRange.high.y, meshRange.low.z);
778
+ extendTransformedRange(i, meshRange.high.x, meshRange.high.y, meshRange.high.z);
779
+ }
780
+ nodeRange.low.addInPlace(instances.transformCenter);
781
+ nodeRange.high.addInPlace(instances.transformCenter);
782
+ this._computedContentRange.extendRange(nodeRange);
783
+ }
685
784
  }
686
785
  }
687
786
  }
@@ -1416,6 +1515,12 @@ export class GltfGraphicsReader extends GltfReader {
1416
1515
  this._featureTable.insert(new Feature(pickableId));
1417
1516
  }
1418
1517
  }
1518
+ get viewFlagOverrides() {
1519
+ return {
1520
+ whiteOnWhiteReversal: false,
1521
+ renderMode: RenderMode.SmoothShade,
1522
+ };
1523
+ }
1419
1524
  async read() {
1420
1525
  await this.resolveResources();
1421
1526
  return this.readGltfAndCreateGraphics(this._isLeaf, this._featureTable, this._contentRange, this._transform);