@itwin/core-frontend 4.4.0-dev.9 → 4.5.0-dev.2

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 +8 -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 +125 -26
  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 +126 -27
  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) {
@@ -329,18 +336,19 @@ export class GltfReader {
329
336
  renderGraphic = renderGraphicList[0];
330
337
  else
331
338
  renderGraphic = this._system.createGraphicList(renderGraphicList);
332
- const transform = this.getTileTransform(transformToRoot, pseudoRtcBias);
333
- let range = contentRange;
334
- const invTransform = transform?.inverse();
335
- if (invTransform)
336
- range = invTransform.multiplyRange(contentRange);
337
339
  if (featureTable)
338
- renderGraphic = this._system.createBatch(renderGraphic, PackedFeatureTable.pack(featureTable), range);
339
- if (transform) {
340
+ renderGraphic = this._system.createBatch(renderGraphic, PackedFeatureTable.pack(featureTable), contentRange);
341
+ const transform = this.getTileTransform(transformToRoot, pseudoRtcBias);
342
+ const viewFlagOverrides = this.viewFlagOverrides;
343
+ if (transform || viewFlagOverrides) {
340
344
  const branch = new GraphicBranch(true);
345
+ if (viewFlagOverrides)
346
+ branch.setViewFlagOverrides(viewFlagOverrides);
341
347
  branch.add(renderGraphic);
342
- renderGraphic = this._system.createBranch(branch, transform);
348
+ renderGraphic = this._system.createBranch(branch, transform ?? Transform.createIdentity());
343
349
  }
350
+ const invTransform = transform?.inverse();
351
+ const range = invTransform ? invTransform.multiplyRange(contentRange) : contentRange;
344
352
  return {
345
353
  readStatus,
346
354
  isLeaf,
@@ -387,12 +395,76 @@ export class GltfReader {
387
395
  mesh.normals.push(new OctEncodedNormal(normal));
388
396
  return mesh.getGraphics(this._system, instances);
389
397
  }
390
- readNodeAndCreateGraphics(renderGraphicList, node, featureTable, transformStack, instances, pseudoRtcBias) {
398
+ readInstanceAttributes(node, featureTable) {
399
+ const ext = node.extensions?.EXT_mesh_gpu_instancing;
400
+ if (!ext || !ext.attributes) {
401
+ return undefined;
402
+ }
403
+ const translationsView = this.getBufferView(ext.attributes, "TRANSLATION");
404
+ const translations = translationsView?.toBufferData(GltfDataType.Float);
405
+ const rotations = this.getBufferView(ext.attributes, "ROTATION")?.toBufferData(GltfDataType.Float);
406
+ const scales = this.getBufferView(ext.attributes, "SCALE")?.toBufferData(GltfDataType.Float);
407
+ // All attributes must specify the same count, count must be greater than zero, and at least one attribute must be specified.
408
+ const count = translations?.count ?? rotations?.count ?? scales?.count;
409
+ if (!count || (rotations && rotations.count !== count) || (scales && scales.count !== count)) {
410
+ return undefined;
411
+ }
412
+ const transformCenter = new Point3d();
413
+ const trMin = translationsView?.accessor.min;
414
+ const trMax = translationsView?.accessor.max;
415
+ if (trMin && trMax) {
416
+ const half = (idx) => trMin[idx] + (trMax[idx] - trMin[idx]) / 2;
417
+ transformCenter.set(half(0), half(1), half(2));
418
+ }
419
+ const getTranslation = (index) => {
420
+ if (!translations) {
421
+ return undefined;
422
+ }
423
+ index *= 3;
424
+ return [
425
+ translations.buffer[index + 0] - transformCenter.x,
426
+ translations.buffer[index + 1] - transformCenter.y,
427
+ translations.buffer[index + 2] - transformCenter.z,
428
+ ];
429
+ };
430
+ const getRotation = (index) => {
431
+ index *= 4;
432
+ return rotations ? [rotations.buffer[index], rotations.buffer[index + 1], rotations.buffer[index + 2], rotations.buffer[index + 3]] : undefined;
433
+ };
434
+ const getScale = (index) => {
435
+ index *= 3;
436
+ return scales ? [scales.buffer[index], scales.buffer[index + 1], scales.buffer[index + 2]] : undefined;
437
+ };
438
+ const transforms = new Float32Array(3 * 4 * count);
439
+ const transform = Transform.createIdentity();
440
+ for (let i = 0; i < count; i++) {
441
+ const tf = trsMatrix(getTranslation(i), getRotation(i), getScale(i), transform);
442
+ const idx = i * 3 * 4;
443
+ transforms[idx + 0] = tf.matrix.coffs[0];
444
+ transforms[idx + 1] = tf.matrix.coffs[1];
445
+ transforms[idx + 2] = tf.matrix.coffs[2];
446
+ transforms[idx + 3] = tf.origin.x;
447
+ transforms[idx + 4] = tf.matrix.coffs[3];
448
+ transforms[idx + 5] = tf.matrix.coffs[4];
449
+ transforms[idx + 6] = tf.matrix.coffs[5];
450
+ transforms[idx + 7] = tf.origin.y;
451
+ transforms[idx + 8] = tf.matrix.coffs[6];
452
+ transforms[idx + 9] = tf.matrix.coffs[7];
453
+ transforms[idx + 10] = tf.matrix.coffs[8];
454
+ transforms[idx + 11] = tf.origin.z;
455
+ }
456
+ // ###TODO? The extension currently provides no way of specifying per-instance feature Ids.
457
+ // For now, assume that if the feature table contains exactly one feature, all the instances belong to that feature.
458
+ const featureIds = featureTable && featureTable.isUniform ? new Uint8Array(3 * count) : undefined;
459
+ return { count, transforms, transformCenter, featureIds };
460
+ }
461
+ readNodeAndCreateGraphics(renderGraphicList, node, featureTable, transformStack, batchInstances, pseudoRtcBias) {
391
462
  if (undefined === node)
392
463
  return TileReadStatus.InvalidTileData;
393
464
  // IMPORTANT: Do not return without popping this node from the stack.
394
465
  transformStack.push(node);
395
466
  const thisTransform = transformStack.transform;
467
+ const nodeInstances = !batchInstances && undefined !== node.mesh ? this.readInstanceAttributes(node, featureTable) : undefined;
396
468
  /**
397
469
  * This is a workaround for tiles generated by
398
470
  * context capture which have a large offset from the tileset origin that exceeds the
@@ -407,16 +479,16 @@ export class GltfReader {
407
479
  for (const meshKey of getGltfNodeMeshIds(node)) {
408
480
  const nodeMesh = this._meshes[meshKey];
409
481
  if (nodeMesh?.primitives) {
410
- const meshes = this.readMeshPrimitives(node, featureTable, thisTransform, thisBias);
482
+ const meshes = this.readMeshPrimitives(node, featureTable, thisTransform, thisBias, nodeInstances);
411
483
  let renderGraphic;
412
484
  if (0 !== meshes.length) {
413
485
  if (1 === meshes.length) {
414
- renderGraphic = this.graphicFromMeshData(meshes[0], instances);
486
+ renderGraphic = this.graphicFromMeshData(meshes[0], batchInstances ?? nodeInstances);
415
487
  }
416
488
  else {
417
489
  const thisList = [];
418
490
  for (const mesh of meshes) {
419
- renderGraphic = this.graphicFromMeshData(mesh, instances);
491
+ renderGraphic = this.graphicFromMeshData(mesh, batchInstances ?? nodeInstances);
420
492
  if (undefined !== renderGraphic)
421
493
  thisList.push(renderGraphic);
422
494
  }
@@ -438,7 +510,7 @@ export class GltfReader {
438
510
  for (const childId of node.children) {
439
511
  const child = this._nodes[childId];
440
512
  if (child)
441
- this.readNodeAndCreateGraphics(renderGraphicList, child, featureTable, transformStack, instances);
513
+ this.readNodeAndCreateGraphics(renderGraphicList, child, featureTable, transformStack, batchInstances ?? nodeInstances);
442
514
  }
443
515
  }
444
516
  transformStack.pop();
@@ -667,9 +739,9 @@ export class GltfReader {
667
739
  // DisplayParams doesn't want a separate texture mapping if the material already has one.
668
740
  textureMapping = undefined;
669
741
  }
670
- return new DisplayParams(DisplayParams.Type.Mesh, color, color, 1, LinePixels.Solid, FillFlags.Always, renderMaterial, undefined, hasBakedLighting, textureMapping);
742
+ return new DisplayParams(DisplayParams.Type.Mesh, color, color, 1, LinePixels.Solid, FillFlags.None, renderMaterial, undefined, hasBakedLighting, textureMapping);
671
743
  }
672
- readMeshPrimitives(node, featureTable, thisTransform, thisBias) {
744
+ readMeshPrimitives(node, featureTable, thisTransform, thisBias, instances) {
673
745
  const meshes = [];
674
746
  for (const meshKey of getGltfNodeMeshIds(node)) {
675
747
  const nodeMesh = this._meshes[meshKey];
@@ -679,9 +751,30 @@ export class GltfReader {
679
751
  if (mesh) {
680
752
  meshes.push(mesh);
681
753
  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);
754
+ const meshRange = thisTransform ? thisTransform.multiplyRange(mesh.pointRange) : mesh.pointRange;
755
+ if (!instances) {
756
+ this._computedContentRange.extendRange(meshRange);
757
+ }
758
+ else {
759
+ const tfs = instances.transforms;
760
+ const nodeRange = new Range3d();
761
+ const extendTransformedRange = (i, x, y, z) => {
762
+ 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);
763
+ };
764
+ for (let i = 0; i < tfs.length; i += 3 * 4) {
765
+ extendTransformedRange(i, meshRange.low.x, meshRange.low.y, meshRange.low.z);
766
+ extendTransformedRange(i, meshRange.low.x, meshRange.low.y, meshRange.high.z);
767
+ extendTransformedRange(i, meshRange.low.x, meshRange.high.y, meshRange.low.z);
768
+ extendTransformedRange(i, meshRange.low.x, meshRange.high.y, meshRange.high.z);
769
+ extendTransformedRange(i, meshRange.high.x, meshRange.low.y, meshRange.low.z);
770
+ extendTransformedRange(i, meshRange.high.x, meshRange.low.y, meshRange.high.z);
771
+ extendTransformedRange(i, meshRange.high.x, meshRange.high.y, meshRange.low.z);
772
+ extendTransformedRange(i, meshRange.high.x, meshRange.high.y, meshRange.high.z);
773
+ }
774
+ nodeRange.low.addInPlace(instances.transformCenter);
775
+ nodeRange.high.addInPlace(instances.transformCenter);
776
+ this._computedContentRange.extendRange(nodeRange);
777
+ }
685
778
  }
686
779
  }
687
780
  }
@@ -1416,6 +1509,12 @@ export class GltfGraphicsReader extends GltfReader {
1416
1509
  this._featureTable.insert(new Feature(pickableId));
1417
1510
  }
1418
1511
  }
1512
+ get viewFlagOverrides() {
1513
+ return {
1514
+ whiteOnWhiteReversal: false,
1515
+ renderMode: RenderMode.SmoothShade,
1516
+ };
1517
+ }
1419
1518
  async read() {
1420
1519
  await this.resolveResources();
1421
1520
  return this.readGltfAndCreateGraphics(this._isLeaf, this._featureTable, this._contentRange, this._transform);