@itwin/core-frontend 5.2.0-dev.28 → 5.2.0-dev.29
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.
- package/CHANGELOG.md +8 -1
- package/lib/cjs/internal/cross-package.d.ts +1 -1
- package/lib/cjs/internal/cross-package.d.ts.map +1 -1
- package/lib/cjs/internal/cross-package.js +2 -1
- package/lib/cjs/internal/cross-package.js.map +1 -1
- package/lib/cjs/internal/tile/PrimaryTileTree.d.ts +2 -0
- package/lib/cjs/internal/tile/PrimaryTileTree.d.ts.map +1 -1
- package/lib/cjs/internal/tile/PrimaryTileTree.js +17 -12
- package/lib/cjs/internal/tile/PrimaryTileTree.js.map +1 -1
- package/lib/cjs/tile/GltfReader.d.ts.map +1 -1
- package/lib/cjs/tile/GltfReader.js +13 -4
- package/lib/cjs/tile/GltfReader.js.map +1 -1
- package/lib/esm/internal/cross-package.d.ts +1 -1
- package/lib/esm/internal/cross-package.d.ts.map +1 -1
- package/lib/esm/internal/cross-package.js +1 -1
- package/lib/esm/internal/cross-package.js.map +1 -1
- package/lib/esm/internal/tile/PrimaryTileTree.d.ts +2 -0
- package/lib/esm/internal/tile/PrimaryTileTree.d.ts.map +1 -1
- package/lib/esm/internal/tile/PrimaryTileTree.js +16 -12
- package/lib/esm/internal/tile/PrimaryTileTree.js.map +1 -1
- package/lib/esm/tile/GltfReader.d.ts.map +1 -1
- package/lib/esm/tile/GltfReader.js +13 -4
- package/lib/esm/tile/GltfReader.js.map +1 -1
- package/lib/public/scripts/draco_decoder.wasm +0 -0
- package/lib/public/scripts/draco_encoder.js +52 -0
- package/lib/public/scripts/draco_wasm_wrapper.js +117 -0
- package/package.json +21 -22
- package/lib/public/draco_decoder.wasm +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GltfReader.js","sourceRoot":"","sources":["../../../src/tile/GltfReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Tiles\n */\n\nimport {\n assert, ByteStream, compareBooleans, compareNumbers, compareStrings, Dictionary, expectDefined, JsonUtils, Logger, ProcessDetector, utf8ToString,\n} from \"@itwin/core-bentley\";\nimport {\n Angle, IndexedPolyface, Matrix3d, Point2d, Point3d, Point4d, Range2d, Range3d, Transform, Vector3d,\n} from \"@itwin/core-geometry\";\nimport {\n AxisAlignedBox3d, BatchType, ColorDef, EdgeAppearanceOverrides, ElementAlignedBox3d, Feature, FeatureIndex, FeatureIndexType, FeatureTable, FillFlags, GlbHeader, ImageSource, LinePixels, MeshEdge,\n MeshEdges, MeshPolyline, MeshPolylineList, OctEncodedNormal, OctEncodedNormalPair, PackedFeatureTable, QParams2d, QParams3d, QPoint2dList,\n QPoint3dList, Quantization, RenderMaterial, RenderMode, RenderTexture, TextureMapping, TextureTransparency, TileFormat, TileReadStatus, ViewFlagOverrides,\n} from \"@itwin/core-common\";\nimport { IModelConnection } from \"../IModelConnection\";\nimport { IModelApp } from \"../IModelApp\";\nimport { InstancedGraphicParams } from \"../common/render/InstancedGraphicParams\";\nimport { RealityMeshParams } from \"../render/RealityMeshParams\";\nimport { Mesh } from \"../common/internal/render/MeshPrimitives\";\nimport { Triangle } from \"../common/internal/render/Primitives\";\nimport { RenderGraphic } from \"../render/RenderGraphic\";\nimport { RenderSystem } from \"../render/RenderSystem\";\nimport { BatchedTileIdMap, decodeMeshoptBuffer, RealityTileGeometry,TileContent } from \"./internal\";\nimport type { DracoLoader, DracoMesh } from \"@loaders.gl/draco\";\nimport { CreateRenderMaterialArgs } from \"../render/CreateRenderMaterialArgs\";\nimport { DisplayParams } from \"../common/internal/render/DisplayParams\";\nimport { FrontendLoggerCategory } from \"../common/FrontendLoggerCategory\";\nimport { getImageSourceFormatForMimeType, imageBitmapFromImageSource, imageElementFromImageSource, tryImageElementFromUrl } from \"../common/ImageUtil\";\nimport { MeshPrimitiveType } from \"../common/internal/render/MeshPrimitive\";\nimport { PointCloudArgs } from \"../common/internal/render/PointCloudPrimitive\";\nimport { TextureImageSource } from \"../common/render/TextureParams\";\nimport {\n DracoMeshCompression, getGltfNodeMeshIds, Gltf2Node, GltfAccessor, GltfBuffer, GltfBufferViewProps, GltfDataType, GltfDictionary, gltfDictionaryIterator, GltfDocument, GltfId,\n GltfImage, GltfMaterial, GltfMesh, GltfMeshMode, GltfMeshPrimitive, GltfNode, GltfSampler, GltfScene, GltfStructuralMetadata, GltfTechniqueState, GltfTexture, GltfWrapMode, isGltf1Material, traverseGltfNodes,\n} from \"../common/gltf/GltfSchema\";\nimport { PickableGraphicOptions } from \"../common/render/BatchOptions\";\nimport { createGraphicTemplate, GraphicTemplateBatch, GraphicTemplateBranch, GraphicTemplateNode } from \"../internal/render/GraphicTemplateImpl\";\nimport { RenderGeometry } from \"../internal/render/RenderGeometry\";\nimport { GraphicTemplate } from \"../render/GraphicTemplate\";\nimport { LayerTileData } from \"../internal/render/webgl/MapLayerParams\";\nimport { compactEdgeIterator } from \"../common/imdl/CompactEdges\";\nimport { MeshPolylineGroup } from \"@itwin/core-common/lib/cjs/internal/RenderMesh\";\n\n/** @internal */\nexport type GltfDataBuffer = Uint8Array | Uint16Array | Uint32Array | Float32Array | Int8Array;\n\n/**\n * A chunk of binary data exposed as a typed array.\n * The count member indicates how many elements exist. This may be less than this.buffer.length due to padding added to the\n * binary stream to ensure correct alignment.\n * @internal\n */\nexport class GltfBufferData {\n public readonly buffer: GltfDataBuffer;\n public readonly count: number;\n\n public constructor(buffer: GltfDataBuffer, count: number) {\n this.buffer = buffer;\n this.count = count;\n }\n\n /**\n * Create a GltfBufferData of the desired type. The actual type may differ from the desired type - for example, small 32-bit integers\n * may be represented as 8-bit or 16-bit integers instead.\n * If the actual data type is not convertible to the desired type, this function returns undefined.\n */\n public static create(bytes: Uint8Array, actualType: GltfDataType, expectedType: GltfDataType, count: number): GltfBufferData | undefined {\n if (expectedType !== actualType) {\n // Some data is stored in smaller data types to save space if no values exceed the maximum of the smaller type.\n switch (expectedType) {\n case GltfDataType.Float:\n case GltfDataType.UnsignedByte:\n case GltfDataType.SignedByte:\n return undefined;\n case GltfDataType.UnsignedShort:\n if (GltfDataType.UnsignedByte !== actualType)\n return undefined;\n break;\n case GltfDataType.UInt32:\n if (GltfDataType.UnsignedByte !== actualType && GltfDataType.UnsignedShort !== actualType)\n return undefined;\n break;\n }\n }\n\n const data = this.createDataBuffer(bytes, actualType);\n return undefined !== data ? new GltfBufferData(data, count) : undefined;\n }\n\n private static createDataBuffer(bytes: Uint8Array, actualType: GltfDataType): GltfDataBuffer | undefined {\n // NB: Endianness of typed array data is determined by the 'platform byte order'. Actual data is always little-endian.\n // We are assuming little-endian platform. If we find a big-endian platform, we'll need to use a DataView instead.\n switch (actualType) {\n case GltfDataType.UnsignedByte:\n return bytes;\n case GltfDataType.SignedByte:\n return new Int8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n case GltfDataType.UnsignedShort:\n return new Uint16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 2);\n case GltfDataType.UInt32:\n return new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);\n case GltfDataType.Float:\n return new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);\n default:\n return undefined;\n }\n }\n}\n\n/**\n * A view of a chunk of glTF binary data containing an array of elements of a specific data type.\n * The count member indicates how many elements exist; this may be smaller than this.data.length.\n * The count member may also indicate the number of elements of a type containing more than one value of the\n * underlying type. For example, a buffer of 4 32-bit floating point 'vec2' elements will have a count of 4,\n * but its data member will contain 8 32-bit floating point values (2 per vec2).\n * The accessor member may contain additional JSON data specific to a particular buffer.\n * @internal\n */\nclass GltfBufferView {\n public readonly data: Uint8Array;\n public readonly count: number;\n public readonly type: GltfDataType;\n public readonly accessor: GltfAccessor;\n public readonly stride: number;\n\n public get byteLength(): number { return this.data.length; }\n\n public constructor(data: Uint8Array, count: number, type: GltfDataType, accessor: GltfAccessor, stride: number) {\n this.data = data;\n this.count = count;\n this.type = type;\n this.accessor = accessor;\n this.stride = stride;\n }\n\n public toBufferData(desiredType: GltfDataType): GltfBufferData | undefined {\n return GltfBufferData.create(this.data, this.type, desiredType, this.count);\n }\n}\n\n/** The result of [[GltfReader.read]].\n * @internal\n */\nexport interface GltfReaderResult extends TileContent {\n readStatus: TileReadStatus;\n range?: AxisAlignedBox3d;\n copyright?: string;\n}\n\ntype GltfTemplateResult = Omit<GltfReaderResult, \"graphic\"> & { template?: GraphicTemplate };\n\nfunction templateToGraphicResult(result: GltfTemplateResult, system: RenderSystem): GltfReaderResult {\n const template = result.template;\n delete result.template;\n return {\n ...result,\n graphic: template ? system.createGraphicFromTemplate({ template }) : undefined,\n };\n}\n\n/** Data required for creating a [[GltfReader]] capable of deserializing [glTF](https://www.khronos.org/gltf/).\n * @internal\n */\nexport class GltfReaderProps {\n public readonly version: number;\n public readonly glTF: GltfDocument;\n public readonly yAxisUp: boolean;\n public readonly binaryData?: Uint8Array;\n public readonly baseUrl?: URL;\n\n private constructor(glTF: GltfDocument, version: number, yAxisUp: boolean, binaryData: Uint8Array | undefined, baseUrl?: URL | undefined) {\n this.version = version;\n this.glTF = glTF;\n this.binaryData = binaryData;\n this.yAxisUp = yAxisUp;\n this.baseUrl = baseUrl;\n }\n\n /** Attempt to construct a new GltfReaderProps from the binary data beginning at the supplied stream's current read position. */\n public static create(source: Uint8Array | GltfDocument, yAxisUp: boolean = false, baseUrl?: URL): GltfReaderProps | undefined {\n let version: number;\n let json: GltfDocument;\n let binaryData: Uint8Array | undefined;\n\n if (source instanceof Uint8Array) {\n // It may be JSON - check for magic indicating glb.\n const buffer = ByteStream.fromUint8Array(source);\n if (TileFormat.Gltf !== buffer.readUint32()) {\n try {\n const utf8Json = utf8ToString(source);\n if (!utf8Json)\n return undefined;\n\n json = JSON.parse(utf8Json);\n version = 2;\n } catch {\n return undefined;\n }\n } else {\n buffer.reset();\n const header = new GlbHeader(buffer);\n if (!header.isValid)\n return undefined;\n\n version = header.version;\n if (header.binaryChunk)\n binaryData = new Uint8Array(source.buffer, source.byteOffset + header.binaryChunk.offset, header.binaryChunk.length);\n\n try {\n const jsonBytes = new Uint8Array(source.buffer, source.byteOffset + header.jsonChunk.offset, header.jsonChunk.length);\n const jsonStr = utf8ToString(jsonBytes);\n if (undefined === jsonStr)\n return undefined;\n\n json = JSON.parse(jsonStr);\n } catch {\n return undefined;\n }\n }\n } else {\n version = 2; // ###TODO verify against source.asset?.version\n json = source;\n }\n\n // asset is required in glTF 2, optional in glTF 1\n const asset = JsonUtils.asObject(json.asset);\n if (version === 2 && !asset)\n return undefined;\n\n const glTF: GltfDocument = {\n asset,\n scene: JsonUtils.asString(json.scene),\n extensions: JsonUtils.asObject(json.extensions),\n extensionsUsed: JsonUtils.asArray(json.extensionsUsed),\n extensionsRequired: JsonUtils.asArray(json.extensionsRequired),\n accessors: JsonUtils.asObject(json.accessors),\n buffers: JsonUtils.asObject(json.buffers),\n bufferViews: JsonUtils.asObject(json.bufferViews),\n images: JsonUtils.asObject(json.images),\n materials: JsonUtils.asObject(json.materials),\n meshes: JsonUtils.asObject(json.meshes),\n nodes: JsonUtils.asObject(json.nodes),\n samplers: JsonUtils.asObject(json.samplers),\n scenes: JsonUtils.asObject(json.scenes),\n textures: JsonUtils.asObject(json.textures),\n techniques: JsonUtils.asObject(json.techniques),\n };\n\n return glTF.meshes ? new GltfReaderProps(glTF, version, yAxisUp, binaryData, baseUrl) : undefined;\n }\n}\n\n/** The GltfMeshData contains the raw GLTF mesh data. If the data is suitable to create a [[RealityMesh]] directly, basically in the quantized format produced by\n * ContextCapture, then a RealityMesh is created directly from this data. Otherwise, the mesh primitive is populated from the raw data and a MeshPrimitive\n * is generated. The MeshPrimitve path is much less efficient but should be rarely used.\n *\n * @internal\n */\nexport class GltfMeshData {\n public primitive: Mesh; // Populated with vertex and indices only if the mesh cannot be represented as [[RealityMesh]]\n public pointQParams?: QParams3d;\n public points?: Uint16Array;\n public pointRange?: Range3d;\n public normals?: Uint16Array;\n public uvQParams?: QParams2d;\n public uvs?: Uint16Array;\n public uvRange?: Range2d;\n public indices?: Uint8Array | Uint16Array | Uint32Array;\n public readonly type = \"mesh\" as const;\n\n public constructor(props: Mesh) {\n this.primitive = props;\n }\n}\n\ninterface GltfPointCloud extends PointCloudArgs {\n readonly type: \"pointcloud\";\n pointRange: Range3d;\n}\n\ntype GltfPrimitiveData = GltfMeshData | GltfPointCloud;\n\n/** A function that returns true if deserialization of the data supplied by the reader should abort.\n * @internal\n */\nexport type ShouldAbortReadGltf = (reader: GltfReader) => boolean;\n\nconst emptyDict = { };\n\nfunction colorFromJson(values: number[]): ColorDef {\n return ColorDef.from(values[0] * 255, values[1] * 255, values[2] * 255, (1.0 - values[3]) * 255);\n}\n\nfunction colorFromMaterial(material: GltfMaterial, isTransparent: boolean): ColorDef {\n let color = ColorDef.white;\n if (isGltf1Material(material)) {\n if (material.values?.color && Array.isArray(material.values.color))\n color = colorFromJson(material.values.color);\n } else if (material.extensions?.KHR_techniques_webgl?.values?.u_color) {\n color = colorFromJson(material.extensions.KHR_techniques_webgl.values.u_color);\n } else if (material.pbrMetallicRoughness?.baseColorFactor) {\n color = colorFromJson(material.pbrMetallicRoughness.baseColorFactor);\n }\n\n // SPEC: Opaque materials ignore any alpha channel.\n if (!isTransparent)\n color = color.withTransparency(0);\n\n return color;\n}\n\nfunction trsMatrix(translation: [number, number, number] | undefined, rotation: [number, number, number, number] | undefined, scale: [number, number, number] | undefined, result?: Transform): Transform {\n // SPEC: To compose the local transformation matrix, TRS properties MUST be converted to matrices and postmultiplied in the T * R * S order;\n // first the scale is applied to the vertices, then the rotation, and then the translation.\n const scaleTf = Transform.createRefs(undefined, scale ? Matrix3d.createScale(scale[0], scale[1], scale[2]) : Matrix3d.identity);\n const rotTf = Transform.createRefs(undefined, rotation ? Matrix3d.createFromQuaternion(Point4d.create(rotation[0], rotation[1], rotation[2], rotation[3])) : Matrix3d.identity);\n rotTf.matrix.transposeInPlace(); // See comment on Matrix3d.createFromQuaternion\n const transTf = Transform.createTranslation(translation ? new Point3d(translation[0], translation[1], translation[2]) : Point3d.createZero());\n const tf = rotTf.multiplyTransformTransform(scaleTf, result);\n transTf.multiplyTransformTransform(tf, tf);\n return tf;\n}\n\nclass TransformStack {\n private readonly _stack: Array<Transform | undefined> = [];\n\n public constructor(transform?: Transform) {\n if (transform)\n this._stack.push(transform);\n }\n\n public get transform(): Transform | undefined {\n return this._stack.length > 0 ? this._stack[this._stack.length - 1] : undefined;\n }\n\n public get isEmpty(): boolean {\n return 0 === this._stack.length;\n }\n\n public push(node: GltfNode): void {\n let nodeTransform;\n if (node.matrix) {\n const origin = Point3d.create(node.matrix[12], node.matrix[13], node.matrix[14]);\n const matrix = Matrix3d.createRowValues(\n node.matrix[0], node.matrix[4], node.matrix[8],\n node.matrix[1], node.matrix[5], node.matrix[9],\n node.matrix[2], node.matrix[6], node.matrix[10],\n );\n\n nodeTransform = Transform.createOriginAndMatrix(origin, matrix);\n } else if (node.rotation || node.scale || node.translation) {\n nodeTransform = trsMatrix(node.translation, node.rotation, node.scale);\n }\n\n const top = this.transform;\n if (!top)\n this._stack.push(nodeTransform);\n else\n this._stack.push(nodeTransform ? top.multiplyTransformTransform(nodeTransform) : top);\n }\n\n public pop(): void {\n assert(this._stack.length > 0);\n this._stack.pop();\n }\n}\n\n/** Arguments to [[GltfReader]] constructor.\n * @internal\n */\nexport interface GltfReaderArgs {\n /** Properties of the glTF source. */\n props: GltfReaderProps;\n /** The iModel with which the graphics are to be associated. */\n iModel: IModelConnection;\n /** If true, create 2d graphics. */\n is2d?: boolean;\n /** The render system that will produce the graphics. Defaults to [[IModelApp.renderSystem]]. */\n system?: RenderSystem;\n /** The type of batch to create. Defaults to [BatchType.Primary]($common).\n * @see [[RenderSystem.createBatch]].\n */\n type?: BatchType;\n /** An optional function that, if supplied, is invoked periodically to determine if the process of producing graphics from the glTF should terminate early. */\n shouldAbort?: ShouldAbortReadGltf;\n /** If true, each vertex in the graphics should belong to exactly one triangle. This is less efficient than sharing vertices between adjoining triangles, but\n * sometimes required - for example, for [ViewFlags.wiremesh]($common).\n */\n deduplicateVertices?: boolean;\n /** If true, the graphics produced will always use a [[VertexTable]]; otherwise, where possible a [[RealityMeshParams]] will be used instead.\n * Reality meshes are simpler but do not support some features like lighting.\n */\n vertexTableRequired?: boolean;\n /** A table structure to store the Gltf structural metadata if present.\n */\n idMap?: BatchedTileIdMap;\n}\n\ninterface TextureKey {\n readonly id: GltfId;\n readonly isTransparent: boolean;\n}\n\nfunction compareTextureKeys(lhs: TextureKey, rhs: TextureKey): number {\n const cmp = compareBooleans(lhs.isTransparent, rhs.isTransparent);\n if (0 !== cmp)\n return cmp;\n\n assert(typeof lhs.id === typeof rhs.id);\n if (\"string\" === typeof lhs.id) {\n assert(\"string\" === typeof rhs.id);\n return compareStrings(lhs.id, rhs.id);\n }\n\n assert(\"number\" === typeof lhs.id && \"number\" === typeof rhs.id);\n return compareNumbers(lhs.id, rhs.id);\n}\n\ninterface StructuralMetadataTableEntries{\n name: string;\n values: any[];\n};\n\ninterface StructuralMetadataTable{\n name: string;\n entries: StructuralMetadataTableEntries[];\n};\n\ninterface StructuralMetadata{\n tables: StructuralMetadataTable[];\n}\n\n/** @internal exported strictly for testing */\nexport function getMeshPrimitives(mesh: GltfMesh | undefined): GltfMeshPrimitive[] | undefined {\n const ext = mesh?.extensions?.EXT_mesh_primitive_restart;\n const meshPrimitives = mesh?.primitives;\n if (!meshPrimitives || meshPrimitives.length === 0 || !ext?.primitiveGroups || ext.primitiveGroups.length === 0) {\n return meshPrimitives;\n }\n\n // Note: per the spec, any violation of the extension's specification should cause us to fall back to mesh.primitives, if detecting the violation is feasible.\n\n // Start with a copy of mesh.primitives. For each group, replace the first primitive in the group with a primitive representing the entire group,\n // and set the rest of the primitives in the group to `undefined`.\n // This allows us to identify which remaining primitives do not use primitive restart, and any errors involving a primitive appearing in more than one group.\n const primitives: Array<GltfMeshPrimitive | undefined> = [...meshPrimitives];\n for (const group of ext.primitiveGroups) {\n // Spec: the group must not be empty and all indices must be valid array indices into mesh.primitives.\n const firstPrimitiveIndex = group.primitives[0];\n if (undefined === firstPrimitiveIndex || !meshPrimitives[firstPrimitiveIndex]) {\n return meshPrimitives;\n }\n\n const primitive = { ...meshPrimitives[firstPrimitiveIndex], indices: group.indices };\n\n // Spec: primitive restart only supported for these topologies.\n switch (primitive.mode) {\n case GltfMeshMode.TriangleFan:\n case GltfMeshMode.TriangleStrip:\n case GltfMeshMode.LineStrip:\n case GltfMeshMode.LineLoop:\n break;\n default:\n return meshPrimitives;\n }\n\n\n for (const primitiveIndex of group.primitives) {\n const thisPrimitive = primitives[primitiveIndex];\n\n // Spec: all primitives must use indexed geometry and a given primitive may appear in at most one group.\n // Spec: all primitives must have same topology.\n if (undefined === thisPrimitive?.indices || thisPrimitive.mode !== primitive.mode) {\n return meshPrimitives;\n }\n\n primitives[primitiveIndex] = undefined;\n }\n\n primitives[firstPrimitiveIndex] = primitive;\n }\n\n return primitives.filter((x) => x !== undefined);\n}\n\n/** Deserializes [glTF](https://www.khronos.org/gltf/).\n * @internal\n */\nexport abstract class GltfReader {\n protected readonly _glTF: GltfDocument;\n protected readonly _version: number;\n protected readonly _iModel: IModelConnection;\n protected readonly _is3d: boolean;\n protected readonly _system: RenderSystem;\n protected readonly _returnToCenter?: Point3d;\n protected readonly _yAxisUp: boolean;\n protected readonly _baseUrl?: URL;\n protected readonly _type: BatchType;\n protected readonly _deduplicateVertices: boolean;\n protected readonly _vertexTableRequired: boolean;\n private readonly _canceled?: ShouldAbortReadGltf;\n protected readonly _sceneNodes: GltfId[];\n protected _computedContentRange?: ElementAlignedBox3d;\n private readonly _resolvedTextures = new Dictionary<TextureKey, RenderTexture | false>((lhs, rhs) => compareTextureKeys(lhs, rhs));\n private readonly _dracoMeshes = new Map<DracoMeshCompression, DracoMesh>();\n private _containsPointCloud = false;\n protected _instanceFeatures: Feature[] = [];\n protected _meshFeatures: Feature[] = [];\n protected _instanceElementIdToFeatureId: Map<string, number> = new Map<string, number>();\n protected _meshElementIdToFeatureIndex: Map<string, number> = new Map<string, number>();\n protected _structuralMetadata?: StructuralMetadata;\n protected readonly _idMap?: BatchedTileIdMap;\n private _tileData?: LayerTileData | undefined;\n\n protected get _nodes(): GltfDictionary<GltfNode> { return this._glTF.nodes ?? emptyDict; }\n protected get _meshes(): GltfDictionary<GltfMesh> { return this._glTF.meshes ?? emptyDict; }\n protected get _accessors(): GltfDictionary<GltfAccessor> { return this._glTF.accessors ?? emptyDict; }\n protected get _bufferViews(): GltfDictionary<GltfBufferViewProps & { resolvedBuffer?: Uint8Array }> { return this._glTF.bufferViews ?? emptyDict; }\n protected get _materials(): GltfDictionary<GltfMaterial> { return this._glTF.materials ?? emptyDict; }\n protected get _samplers(): GltfDictionary<GltfSampler> { return this._glTF.samplers ?? emptyDict; }\n protected get _textures(): GltfDictionary<GltfTexture> { return this._glTF.textures ?? emptyDict; }\n\n protected get _images(): GltfDictionary<GltfImage & { resolvedImage?: TextureImageSource }> { return this._glTF.images ?? emptyDict; }\n protected get _buffers(): GltfDictionary<GltfBuffer & { resolvedBuffer?: Uint8Array }> { return this._glTF.buffers ?? emptyDict; }\n\n /** Asynchronously deserialize the tile data and return the result. */\n public abstract read(): Promise<GltfReaderResult>;\n\n protected get _isCanceled(): boolean { return undefined !== this._canceled && this._canceled(this); }\n protected get _isVolumeClassifier(): boolean { return BatchType.VolumeClassifier === this._type; }\n\n /** Traverse the nodes specified by their Ids, recursing into their child nodes.\n * @param nodeIds The Ids of the nodes to traverse.\n * @throws Error if a node appears more than once during traversal\n */\n public traverseNodes(nodeIds: Iterable<GltfId>): Iterable<GltfNode> {\n return traverseGltfNodes(nodeIds, this._nodes, new Set<GltfId>());\n }\n\n /** Traverse the nodes specified by their scene, recursing into their child nodes.\n * @throws Error if a node appears more than once during traversal\n */\n public traverseScene(): Iterable<GltfNode> {\n return this.traverseNodes(this._sceneNodes);\n }\n\n protected get viewFlagOverrides(): ViewFlagOverrides | undefined {\n return undefined;\n }\n\n private getTileTransform(transformToRoot?: Transform, pseudoRtcBias?: Vector3d): Transform | undefined {\n let transform;\n\n if (this._returnToCenter || pseudoRtcBias || this._yAxisUp || transformToRoot) {\n if (this._returnToCenter)\n transform = Transform.createTranslation(this._returnToCenter.clone());\n else if (pseudoRtcBias)\n transform = Transform.createTranslationXYZ(pseudoRtcBias.x, pseudoRtcBias.y, pseudoRtcBias.z);\n else\n transform = Transform.createIdentity();\n\n if (this._yAxisUp)\n transform = transform.multiplyTransformMatrix3d(Matrix3d.createRotationAroundVector(Vector3d.create(1.0, 0.0, 0.0), Angle.createRadians(Angle.piOver2Radians)) as Matrix3d);\n\n if (transformToRoot)\n transform = transformToRoot.multiplyTransformTransform(transform);\n }\n\n return transform;\n }\n\n protected readGltfAndCreateGraphics(isLeaf: boolean, featureTable: FeatureTable | undefined, contentRange: ElementAlignedBox3d | undefined, transformToRoot?: Transform, pseudoRtcBias?: Vector3d, instances?: InstancedGraphicParams): GltfReaderResult {\n const result = this.readGltfAndCreateTemplate(isLeaf, featureTable, contentRange, true, transformToRoot, pseudoRtcBias, instances);\n return templateToGraphicResult(result, this._system);\n }\n\n protected readGltfAndCreateTemplate(isLeaf: boolean, featureTable: FeatureTable | undefined, contentRange: ElementAlignedBox3d | undefined, noDispose: boolean, transformToRoot?: Transform, pseudoRtcBias?: Vector3d, instances?: InstancedGraphicParams): GltfTemplateResult {\n if (this._isCanceled)\n return { readStatus: TileReadStatus.Canceled, isLeaf };\n\n // If contentRange was not supplied, we will compute it as we read the meshes.\n if (!contentRange)\n this._computedContentRange = contentRange = Range3d.createNull();\n else\n this._computedContentRange = undefined;\n\n // Save feature table model id in case we need to recreate it after reading instances\n const featureTableModelId = featureTable?.modelId;\n // Flush feature table if instance features are used\n if(this._structuralMetadata && this._glTF.extensionsUsed?.includes(\"EXT_instance_features\") && this._idMap){\n featureTable = undefined;\n }\n\n // ###TODO this looks like a hack? Why does it assume the first node's transform is special, or that the transform will be specified as a matrix instead of translation+rot+scale?\n if (this._returnToCenter || this._nodes[0]?.matrix || (pseudoRtcBias && pseudoRtcBias.magnitude() < 1.0E5))\n pseudoRtcBias = undefined;\n\n const transformStack = new TransformStack();\n const templateNodes: GraphicTemplateNode[] = [];\n let readStatus: TileReadStatus = TileReadStatus.InvalidTileData;\n for (const nodeKey of this._sceneNodes) {\n assert(transformStack.isEmpty);\n const node = this._nodes[nodeKey];\n if (node && TileReadStatus.Success !== (readStatus = this.readTemplateNodes(templateNodes, node, featureTable, transformStack, instances, pseudoRtcBias)))\n return { readStatus, isLeaf };\n }\n\n // Creates a feature table based on instance features\n // The table must be created after reading instances, since the maximum number of features is not known until all instances have been read.\n if(this._instanceFeatures.length > 0 && this._idMap){\n featureTable = new FeatureTable(this._instanceFeatures.length, featureTableModelId);\n for(let instanceFeatureId = 0; instanceFeatureId < this._instanceFeatures.length; instanceFeatureId++){\n featureTable.insertWithIndex(this._instanceFeatures[instanceFeatureId], instanceFeatureId);\n }\n }\n\n if(this._meshFeatures.length > 0 && this._idMap){\n featureTable = new FeatureTable(this._meshFeatures.length, featureTableModelId);\n for(let meshFeatureId = 0; meshFeatureId < this._meshFeatures.length; meshFeatureId++){\n featureTable.insertWithIndex(this._meshFeatures[meshFeatureId], meshFeatureId);\n }\n }\n\n if (0 === templateNodes.length)\n return { readStatus: TileReadStatus.InvalidTileData, isLeaf };\n\n // Compute range in tileset/world space.\n let range = contentRange;\n const transform = this.getTileTransform(transformToRoot, pseudoRtcBias);\n const invTransform = transform?.inverse();\n if (invTransform)\n range = invTransform.multiplyRange(contentRange);\n\n // The batch range needs to be in tile coordinate space.\n // If we computed the content range ourselves, it's already in tile space.\n // If the content range was supplied by the caller, it's in tileset space and needs to be transformed to tile space.\n const batch: GraphicTemplateBatch | undefined = !featureTable ? undefined : {\n featureTable: PackedFeatureTable.pack(featureTable),\n range: this._computedContentRange ? contentRange : range,\n };\n\n const viewFlagOverrides = this.viewFlagOverrides;\n const branch: GraphicTemplateBranch | undefined = transform || viewFlagOverrides ? { transform, viewFlagOverrides } : undefined;\n\n return {\n readStatus,\n isLeaf,\n contentRange,\n range,\n copyright: this._glTF.asset?.copyright,\n containsPointCloud: this._containsPointCloud,\n template: createGraphicTemplate({\n nodes: templateNodes,\n batch,\n branch,\n noDispose,\n }),\n };\n }\n\n public readGltfAndCreateGeometry(transformToRoot?: Transform, needNormals = false, needParams = false): RealityTileGeometry {\n const transformStack = new TransformStack(this.getTileTransform(transformToRoot));\n const polyfaces: IndexedPolyface[] = [];\n for (const nodeKey of this._sceneNodes) {\n const node = this._nodes[nodeKey];\n if (node)\n this.readNodeAndCreatePolyfaces(polyfaces, node, transformStack, needNormals, needParams);\n }\n\n return { polyfaces };\n }\n\n private geometryFromMeshData(gltfMesh: GltfPrimitiveData, isInstanced: boolean): RenderGeometry | undefined {\n if (\"pointcloud\" === gltfMesh.type)\n return this._system.createPointCloudGeometry(gltfMesh);\n\n if (!gltfMesh.points || !gltfMesh.pointRange)\n return this._system.createGeometryFromMesh(gltfMesh.primitive, undefined);\n\n let realityMeshPrimitive = (this._vertexTableRequired || isInstanced) ? undefined : RealityMeshParams.fromGltfMesh(gltfMesh);\n if (realityMeshPrimitive && this._tileData) {\n\n realityMeshPrimitive = {\n ...realityMeshPrimitive,\n tileData: this._tileData,\n };\n }\n\n if (realityMeshPrimitive) {\n const realityMesh = this._system.createRealityMeshGeometry(realityMeshPrimitive);\n if (realityMesh)\n return realityMesh;\n }\n\n const mesh = gltfMesh.primitive;\n const pointCount = gltfMesh.points.length / 3;\n assert(mesh.points instanceof QPoint3dList);\n mesh.points.fromTypedArray(gltfMesh.pointRange, gltfMesh.points);\n if (mesh.triangles && gltfMesh.indices)\n mesh.triangles.addFromTypedArray(gltfMesh.indices);\n\n if (gltfMesh.uvs && gltfMesh.uvRange && gltfMesh.uvQParams) {\n /** This is ugly and inefficient... unnecessary if Mesh stored uvs as QPoint2dList */\n for (let i = 0, j = 0; i < pointCount; i++)\n mesh.uvParams.push(gltfMesh.uvQParams.unquantize(gltfMesh.uvs[j++], gltfMesh.uvs[j++]));\n }\n\n if (gltfMesh.normals)\n for (const normal of gltfMesh.normals)\n mesh.normals.push(new OctEncodedNormal(normal));\n\n return this._system.createGeometryFromMesh(mesh, undefined, this._tileData,);\n }\n\n private readInstanceAttributes(node: Gltf2Node, featureTable: FeatureTable | undefined): InstancedGraphicParams | undefined {\n const ext = node.extensions?.EXT_mesh_gpu_instancing;\n if (!ext || !ext.attributes) {\n return undefined;\n }\n\n const translationsView = this.getBufferView(ext.attributes, \"TRANSLATION\");\n const translations = translationsView?.toBufferData(GltfDataType.Float);\n const rotations = this.getBufferView(ext.attributes, \"ROTATION\")?.toBufferData(GltfDataType.Float);\n const scales = this.getBufferView(ext.attributes, \"SCALE\")?.toBufferData(GltfDataType.Float);\n\n // All attributes must specify the same count, count must be greater than zero, and at least one attribute must be specified.\n const count = translations?.count ?? rotations?.count ?? scales?.count;\n if (!count || (rotations && rotations.count !== count) || (scales && scales.count !== count)) {\n return undefined;\n }\n\n const transformCenter = new Point3d();\n const trMin = translationsView?.accessor.min;\n const trMax = translationsView?.accessor.max;\n if (trMin && trMax) {\n const half = (idx: number): number => trMin[idx] + (trMax[idx] - trMin[idx]) / 2;\n transformCenter.set(half(0), half(1), half(2));\n }\n\n const getTranslation = (index: number): [number, number, number] | undefined => {\n if (!translations) {\n return undefined;\n }\n\n index *= 3;\n return [\n translations.buffer[index + 0] - transformCenter.x,\n translations.buffer[index + 1] - transformCenter.y,\n translations.buffer[index + 2] - transformCenter.z,\n ];\n };\n\n const getRotation = (index: number): [number, number, number, number] | undefined => {\n index *= 4;\n return rotations ? [rotations.buffer[index], rotations.buffer[index + 1], rotations.buffer[index + 2], rotations.buffer[index + 3]] : undefined;\n };\n\n const getScale = (index: number): [number, number, number] | undefined => {\n index *= 3;\n return scales ? [scales.buffer[index], scales.buffer[index + 1], scales.buffer[index + 2]] : undefined;\n };\n\n const transforms = new Float32Array(3 * 4 * count);\n const transform = Transform.createIdentity();\n for (let i = 0; i < count; i++) {\n const tf = trsMatrix(getTranslation(i), getRotation(i), getScale(i), transform);\n const idx = i * 3 * 4;\n transforms[idx + 0] = tf.matrix.coffs[0];\n transforms[idx + 1] = tf.matrix.coffs[1];\n transforms[idx + 2] = tf.matrix.coffs[2];\n transforms[idx + 3] = tf.origin.x;\n transforms[idx + 4] = tf.matrix.coffs[3];\n transforms[idx + 5] = tf.matrix.coffs[4];\n transforms[idx + 6] = tf.matrix.coffs[5];\n transforms[idx + 7] = tf.origin.y;\n transforms[idx + 8] = tf.matrix.coffs[6];\n transforms[idx + 9] = tf.matrix.coffs[7];\n transforms[idx + 10] = tf.matrix.coffs[8];\n transforms[idx + 11] = tf.origin.z;\n }\n\n let featureIds = ((featureTable && featureTable.isUniform)) ? new Uint8Array(3 * count) : undefined;\n\n // Resolve instance features if the EXT_instance_features if present\n const instanceFeaturesExt = node.extensions?.EXT_instance_features;\n if(this._structuralMetadata && instanceFeaturesExt && this._idMap){\n if(!featureIds)\n featureIds = new Uint8Array(3 * count);\n // Resolve feature buffers before creating instance table\n const featureBuffers = new Map<number, GltfDataBuffer>();\n for(const featureIdDesc of instanceFeaturesExt.featureIds){\n\n if(featureIdDesc.attribute !== undefined){\n const bufferView = this.getBufferView(ext.attributes, `_FEATURE_ID_${ featureIdDesc.attribute}`);\n if(bufferView){\n const bufferData = bufferView.toBufferData(bufferView.type)?.buffer;\n if(bufferData){\n featureBuffers.set(featureIdDesc.attribute, bufferData);\n }\n }\n }\n }\n\n for(let localInstanceId = 0; localInstanceId < count; localInstanceId++){\n\n const instanceProps: any = {};\n for(const featureIdDesc of instanceFeaturesExt.featureIds){\n\n const table = this._structuralMetadata.tables[featureIdDesc.propertyTable];\n instanceProps[table.name] = {};\n // If the attribute is not defined, then the feature id corresponds to the instance id\n if(featureIdDesc.attribute === undefined){\n for(const entries of table.entries){\n if(entries.values[localInstanceId] !== undefined){\n instanceProps[table.name][entries.name] = entries.values[localInstanceId];\n }\n }\n } else if(featureBuffers.has(featureIdDesc.attribute)) {\n const featureBuffer = featureBuffers.get(featureIdDesc.attribute);\n if(!featureBuffer){\n continue;\n }\n const featureId = featureBuffer[localInstanceId];\n\n if(featureIdDesc.nullFeatureId !== undefined && featureId === featureIdDesc.nullFeatureId){\n continue;\n }\n\n for(const entries of table.entries){\n if(entries.values[featureId] !== undefined){\n instanceProps[table.name][entries.name] = entries.values[featureId];\n }\n }\n }\n }\n\n const instanceElementId = this._idMap.getBatchId(instanceProps);\n\n // If the element id is already assigned to a previous instance,\n // reuse the previous feature id to avoid collision in the feature table\n if(!this._instanceElementIdToFeatureId.has(instanceElementId)){\n this._instanceElementIdToFeatureId.set(instanceElementId, this._instanceFeatures.length);\n this._instanceFeatures.push(new Feature(instanceElementId));\n }\n\n // If the map didn't contain instanceElementId, it was inserted above\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const instanceFeatureId = this._instanceElementIdToFeatureId.get(instanceElementId)!;\n featureIds[localInstanceId * 3 + 0] = instanceFeatureId & 0xFF;\n featureIds[localInstanceId * 3 + 1] = (instanceFeatureId >> 8) & 0xFF;\n featureIds[localInstanceId * 3 + 2] = (instanceFeatureId >> 16) & 0xFF;\n }\n }\n\n return { count, transforms, transformCenter, featureIds };\n }\n\n private readTemplateNodes(\n templateNodes: GraphicTemplateNode[],\n node: GltfNode,\n featureTable: FeatureTable | undefined,\n transformStack: TransformStack,\n batchInstances?: InstancedGraphicParams,\n pseudoRtcBias?: Vector3d\n ): TileReadStatus {\n if (undefined === node)\n return TileReadStatus.InvalidTileData;\n\n // IMPORTANT: Do not return without popping this node from the stack.\n transformStack.push(node);\n const thisTransform = transformStack.transform;\n\n const nodeInstances = !batchInstances && undefined !== node.mesh ? this.readInstanceAttributes(node, featureTable) : undefined;\n\n /**\n * This is a workaround for tiles generated by\n * context capture which have a large offset from the tileset origin that exceeds the\n * capacity of 32 bit integers. It is essentially an ad hoc RTC applied at read time only if the tile is far from the\n * origin and there is no RTC supplied either with the B3DM of the GLTF.\n * as the vertices are supplied in a quantized format, applying the RTC bias to\n * quantization origin will make these tiles work correctly.\n */\n let thisBias;\n if (undefined !== pseudoRtcBias)\n thisBias = (undefined === thisTransform) ? pseudoRtcBias : thisTransform.matrix.multiplyInverse(pseudoRtcBias);\n\n for (const meshKey of getGltfNodeMeshIds(node)) {\n const nodeMesh = this._meshes[meshKey];\n if (nodeMesh?.primitives) {\n const meshes = this.readMeshPrimitives(node, featureTable, thisTransform, thisBias, nodeInstances);\n\n if (0 !== meshes.length) {\n const thisList: RenderGeometry[] = [];\n for (const mesh of meshes) {\n const geometry = this.geometryFromMeshData(mesh, !!batchInstances || !!nodeInstances);\n if (undefined !== geometry)\n thisList.push(geometry);\n }\n\n if (0 !== thisList.length) {\n templateNodes.push({\n geometry: thisList,\n transform: thisTransform && !thisTransform.isIdentity ? thisTransform : undefined,\n instances: batchInstances ?? nodeInstances,\n });\n }\n }\n }\n }\n\n if (node.children) {\n for (const childId of node.children) {\n const child = this._nodes[childId];\n if (child)\n this.readTemplateNodes(templateNodes, child, featureTable, transformStack, batchInstances ?? nodeInstances);\n }\n }\n\n transformStack.pop();\n return TileReadStatus.Success;\n }\n\n private readNodeAndCreatePolyfaces(polyfaces: IndexedPolyface[], node: GltfNode, transformStack: TransformStack, needNormals: boolean, needParams: boolean): void {\n // IMPORTANT: Do not return without popping this node from the stack.\n transformStack.push(node);\n const meshes = this.readMeshPrimitives(node);\n\n for (const mesh of meshes) {\n if (mesh.type === \"mesh\") {\n const polyface = this.polyfaceFromGltfMesh(mesh, transformStack.transform, needNormals, needParams);\n if (polyface)\n polyfaces.push(polyface);\n }\n }\n\n if (node.children) {\n for (const childId of node.children) {\n const child = this._nodes[childId];\n if (child)\n this.readNodeAndCreatePolyfaces(polyfaces, child, transformStack, needNormals, needParams);\n }\n }\n }\n\n private polyfaceFromGltfMesh(mesh: GltfMeshData, transform: Transform | undefined , needNormals: boolean, needParams: boolean): IndexedPolyface | undefined {\n if (!mesh.pointQParams || !mesh.points || !mesh.indices)\n return undefined;\n\n const { points, pointQParams, normals, uvs, uvQParams, indices } = mesh;\n\n const includeNormals = needNormals && undefined !== normals;\n const includeParams = needParams && undefined !== uvQParams && undefined !== uvs;\n\n const polyface = IndexedPolyface.create(includeNormals, includeParams);\n for (let i = 0; i < points.length; ) {\n const point = pointQParams.unquantize(points[i++], points[i++], points[i++]);\n if (transform)\n transform.multiplyPoint3d(point, point);\n\n polyface.addPoint(point);\n }\n\n if (includeNormals && normals)\n for (let i = 0; i < normals.length; )\n polyface.addNormal(OctEncodedNormal.decodeValue(normals[i++]));\n\n if (includeParams && uvs && uvQParams)\n for (let i = 0; i < uvs.length; )\n polyface.addParam(uvQParams.unquantize(uvs[i++], uvs[i++]));\n\n let j = 0;\n for (const index of indices) {\n polyface.addPointIndex(index);\n if (includeNormals)\n polyface.addNormalIndex(index);\n\n if (includeParams)\n polyface.addParamIndex(index);\n\n if (0 === (++j % 3))\n polyface.terminateFacet();\n }\n\n return polyface;\n }\n\n // ###TODO what is the actual type of `json`?\n public getBufferView(json: { [k: string]: any }, accessorName: string): GltfBufferView | undefined {\n try {\n const accessorValue = JsonUtils.asString(json[accessorName]);\n const accessor = accessorValue ? this._accessors[accessorValue] : undefined;\n if (!accessor)\n return undefined;\n\n const bufferViewAccessorValue = accessor.bufferView;\n const bufferView = undefined !== bufferViewAccessorValue ? this._bufferViews[bufferViewAccessorValue] : undefined;\n if (!bufferView)\n return undefined;\n\n let bufferData = bufferView.resolvedBuffer;\n if (!bufferData) {\n if (undefined === bufferView.buffer)\n return undefined;\n\n const buffer = this._buffers[bufferView.buffer];\n bufferData = buffer?.resolvedBuffer;\n }\n\n if (!bufferData)\n return undefined;\n\n const type = accessor.componentType;\n let dataSize = 0;\n switch (type) {\n case GltfDataType.UnsignedByte:\n case GltfDataType.SignedByte:\n dataSize = 1;\n break;\n case GltfDataType.UnsignedShort:\n dataSize = 2;\n break;\n case GltfDataType.UInt32:\n case GltfDataType.Float:\n dataSize = 4;\n break;\n default:\n return undefined;\n }\n let componentCount = 1;\n switch (accessor.type) {\n case \"VEC4\":\n componentCount = 4;\n break;\n case \"VEC3\":\n componentCount = 3;\n break;\n case \"VEC2\":\n componentCount = 2;\n break;\n }\n\n const byteStride = bufferView.byteStride ? bufferView.byteStride : componentCount * dataSize;\n const offset = ((bufferView && bufferView.byteOffset) ? bufferView.byteOffset : 0) + (accessor.byteOffset ? accessor.byteOffset : 0);\n const length = byteStride * accessor.count;\n\n // If the data is misaligned (Scalable mesh tile publisher) use slice to copy -- else use subarray.\n const aligned = 0 === (bufferData.byteOffset + offset) % dataSize;\n const bytes = aligned ? bufferData.subarray(offset, offset + length) : bufferData.slice(offset, offset + length);\n return new GltfBufferView(bytes, accessor.count, type, accessor, byteStride / dataSize);\n } catch {\n return undefined;\n }\n }\n\n public readBufferData32(json: { [k: string]: any }, accessorName: string): GltfBufferData | undefined { return this.readBufferData(json, accessorName, GltfDataType.UInt32); }\n public readBufferData16(json: { [k: string]: any }, accessorName: string): GltfBufferData | undefined { return this.readBufferData(json, accessorName, GltfDataType.UnsignedShort); }\n public readBufferData8(json: { [k: string]: any }, accessorName: string): GltfBufferData | undefined { return this.readBufferData(json, accessorName, GltfDataType.UnsignedByte); }\n public readBufferDataFloat(json: { [k: string]: any }, accessorName: string): GltfBufferData | undefined { return this.readBufferData(json, accessorName, GltfDataType.Float); }\n\n protected constructor(args: GltfReaderArgs & { tileData?: LayerTileData }) {\n this._tileData = args.tileData;\n this._glTF = args.props.glTF;\n this._version = args.props.version;\n this._yAxisUp = args.props.yAxisUp;\n this._baseUrl = args.props.baseUrl;\n\n const rtcCenter = args.props.glTF.extensions?.CESIUM_RTC?.center;\n if (rtcCenter && 3 === rtcCenter.length)\n if (0 !== rtcCenter[0] || 0 !== rtcCenter[1] || 0 !== rtcCenter[2])\n this._returnToCenter = Point3d.fromJSON(rtcCenter);\n\n this._iModel = args.iModel;\n this._is3d = true !== args.is2d;\n this._system = args.system ?? IModelApp.renderSystem;\n this._type = args.type ?? BatchType.Primary;\n this._canceled = args.shouldAbort;\n this._deduplicateVertices = args.deduplicateVertices ?? false;\n this._vertexTableRequired = args.vertexTableRequired ?? false;\n\n const binaryData = args.props.binaryData;\n if (binaryData) {\n const buffer = this._buffers[this._version === 2 ? 0 : \"binary_glTF\"];\n if (buffer && undefined === buffer.uri)\n buffer.resolvedBuffer = binaryData;\n }\n\n // The original implementation of GltfReader would process and produce graphics for every node in glTF.nodes.\n // What it's *supposed* to do is process the nodes in glTF.scenes[glTF.scene].nodes\n // Some nodes may not be referenced by the configured scene, or only indirectly via GltfNode.children.\n // Perhaps some faulty tiles existed that didn't define their scenes properly?\n let sceneNodes;\n if (this._glTF.scenes && undefined !== this._glTF.scene)\n sceneNodes = this._glTF.scenes[this._glTF.scene]?.nodes;\n\n if (!sceneNodes)\n sceneNodes = Object.keys(this._nodes);\n\n this._sceneNodes = sceneNodes;\n this._idMap = args.idMap;\n }\n\n protected readBufferData(json: { [k: string]: any }, accessorName: string, type: GltfDataType): GltfBufferData | undefined {\n const view = this.getBufferView(json, accessorName);\n return undefined !== view ? view.toBufferData(type) : undefined;\n }\n\n protected readFeatureIndices(_json: any): number[] | undefined { return undefined; }\n\n private extractId(value: any): string | undefined {\n switch (typeof value) {\n case \"string\":\n return value;\n case \"number\":\n return value.toString();\n default:\n return undefined;\n }\n }\n\n private extractTextureId(material: GltfMaterial): string | undefined {\n if (typeof material !== \"object\")\n return undefined;\n\n // Bimium's shader value...almost certainly obsolete at this point.\n if (isGltf1Material(material))\n return material.diffuse ?? this.extractId(material.values?.tex);\n\n // KHR_techniques_webgl extension\n const techniques = this._glTF.extensions?.KHR_techniques_webgl?.techniques;\n const ext = Array.isArray(techniques) ? material.extensions?.KHR_techniques_webgl : undefined;\n if (techniques && undefined !== ext && typeof(ext.values) === \"object\") {\n const uniforms = typeof ext.technique === \"number\" ? techniques[ext.technique].uniforms : undefined;\n if (typeof uniforms === \"object\") {\n for (const uniformName of Object.keys(uniforms)) {\n const uniform = uniforms[uniformName];\n if (typeof uniform === \"object\" && uniform.type === GltfDataType.Sampler2d)\n return this.extractId((ext.values[uniformName] as any)?.index);\n }\n }\n }\n\n const id = this.extractId(material.pbrMetallicRoughness?.baseColorTexture?.index);\n return id ?? this.extractId(material.emissiveTexture?.index);\n }\n\n private extractNormalMapId(material: GltfMaterial): string | undefined {\n if (typeof material !== \"object\")\n return undefined;\n\n if (isGltf1Material(material))\n return undefined;\n\n return this.extractId(material.normalTexture?.index);\n }\n\n private isMaterialTransparent(material: GltfMaterial): boolean {\n if (isGltf1Material(material)) {\n if (this._glTF.techniques && undefined !== material.technique) {\n const technique = this._glTF.techniques[material.technique];\n if (technique?.states?.enable?.some((state: GltfTechniqueState) => state === GltfTechniqueState.Blend))\n return true;\n }\n\n return false;\n } else {\n // Default: OPAQUE.\n // ###TODO support MASK. For now treat as opaque.\n return \"BLEND\" === material.alphaMode;\n }\n }\n\n protected createDisplayParams(material: GltfMaterial, hasBakedLighting: boolean): DisplayParams | undefined {\n const isTransparent = this.isMaterialTransparent(material);\n const textureId = this.extractTextureId(material);\n const normalMapId = this.extractNormalMapId(material);\n let textureMapping = (undefined !== textureId || undefined !== normalMapId) ? this.findTextureMapping(textureId, isTransparent, normalMapId) : undefined;\n const color = colorFromMaterial(material, isTransparent);\n let renderMaterial: RenderMaterial | undefined;\n if (undefined !== textureMapping && undefined !== textureMapping.normalMapParams) {\n const args: CreateRenderMaterialArgs = { diffuse: { color }, specular: { color: ColorDef.white }, textureMapping };\n renderMaterial = IModelApp.renderSystem.createRenderMaterial(args);\n\n // DisplayParams doesn't want a separate texture mapping if the material already has one.\n textureMapping = undefined;\n\n }\n\n return new DisplayParams(DisplayParams.Type.Mesh, color, color, 1, LinePixels.Solid, FillFlags.None, renderMaterial, undefined, hasBakedLighting, textureMapping);\n }\n\n private readMeshPrimitives(node: GltfNode, featureTable?: FeatureTable, thisTransform?: Transform, thisBias?: Vector3d, instances?: InstancedGraphicParams): GltfPrimitiveData[] {\n const meshes: GltfPrimitiveData[] = [];\n for (const meshKey of getGltfNodeMeshIds(node)) {\n const nodeMesh = this._meshes[meshKey];\n const primitives = getMeshPrimitives(nodeMesh);\n if (primitives) {\n for (const primitive of primitives) {\n const mesh = this.readMeshPrimitive(primitive, featureTable, thisBias);\n if (mesh) {\n meshes.push(mesh);\n if (this._computedContentRange && mesh.pointRange) {\n const meshRange = thisTransform ? thisTransform .multiplyRange(mesh.pointRange) : mesh.pointRange;\n if (!instances) {\n this._computedContentRange.extendRange(meshRange);\n } else {\n const tfs = instances.transforms;\n const nodeRange = new Range3d();\n const extendTransformedRange = (i: number, x: number, y: number, z: number) => {\n nodeRange.extendXYZ(tfs[i + 3] + tfs[i + 0] * x + tfs[i + 1] * y + tfs[i + 2] * z,\n tfs[i + 7] + tfs[i + 4] * x + tfs[i + 5] * y + tfs[i + 6] * z,\n tfs[i + 11] + tfs[i + 8] * x + tfs[i + 9] * y + tfs[i + 10] * z);\n };\n\n for (let i = 0; i < tfs.length; i += 3 * 4) {\n extendTransformedRange(i, meshRange.low.x, meshRange.low.y, meshRange.low.z);\n extendTransformedRange(i, meshRange.low.x, meshRange.low.y, meshRange.high.z);\n extendTransformedRange(i, meshRange.low.x, meshRange.high.y, meshRange.low.z);\n extendTransformedRange(i, meshRange.low.x, meshRange.high.y, meshRange.high.z);\n extendTransformedRange(i, meshRange.high.x, meshRange.low.y, meshRange.low.z);\n extendTransformedRange(i, meshRange.high.x, meshRange.low.y, meshRange.high.z);\n extendTransformedRange(i, meshRange.high.x, meshRange.high.y, meshRange.low.z);\n extendTransformedRange(i, meshRange.high.x, meshRange.high.y, meshRange.high.z);\n }\n\n nodeRange.low.addInPlace(instances.transformCenter);\n nodeRange.high.addInPlace(instances.transformCenter);\n\n this._computedContentRange.extendRange(nodeRange);\n }\n }\n }\n }\n }\n }\n\n return meshes;\n }\n\n protected readMeshPrimitive(primitive: GltfMeshPrimitive, featureTable?: FeatureTable, pseudoRtcBias?: Vector3d): GltfPrimitiveData | undefined {\n const meshMode = JsonUtils.asInt(primitive.mode, GltfMeshMode.Triangles);\n if (meshMode === GltfMeshMode.Points /* && !this._vertexTableRequired */) {\n const pointCloud = this.readPointCloud2(primitive, undefined !== featureTable);\n if (pointCloud)\n return pointCloud;\n }\n\n const materialName = JsonUtils.asString(primitive.material);\n const material = 0 < materialName.length ? this._materials[materialName] : { };\n if (!material)\n return undefined;\n\n const hasBakedLighting = undefined === primitive.attributes.NORMAL || undefined !== material.extensions?.KHR_materials_unlit;\n const displayParams = material ? this.createDisplayParams(material, hasBakedLighting) : undefined;\n if (!displayParams)\n return undefined;\n\n let primitiveType: number = -1;\n switch (meshMode) {\n case GltfMeshMode.Lines:\n case GltfMeshMode.LineStrip:\n primitiveType = MeshPrimitiveType.Polyline;\n break;\n\n case GltfMeshMode.Points:\n primitiveType = MeshPrimitiveType.Point;\n break;\n\n case GltfMeshMode.Triangles:\n primitiveType = MeshPrimitiveType.Mesh;\n break;\n\n default:\n return undefined;\n }\n\n const isVolumeClassifier = this._isVolumeClassifier;\n const meshPrimitive = Mesh.create({\n displayParams,\n features: featureTable,\n type: primitiveType,\n range: Range3d.createNull(),\n is2d: !this._is3d,\n isPlanar: false,\n hasBakedLighting,\n isVolumeClassifier,\n quantizePositions: true,\n });\n\n const mesh = new GltfMeshData(meshPrimitive);\n\n // ###TODO_GLTF: There can be more than one color attribute; COLOR_0 might not be the one we want.\n if (!this.readColors(mesh, primitive.attributes, \"COLOR_0\")) {\n // We don't have real colormap - just load material color. This will be used if non-Bentley\n // tile or fit the color table is uniform. For a non-Bentley, non-Uniform, we'll set the\n // uv parameters to pick the colors out of the color map texture.\n meshPrimitive.colorMap.insert(displayParams.fillColor.tbgr); // White...\n // _COLORINDEX is an ancient holdover from glTF 1.0 and Bimium...unlikely to actually encounter it in the wild.\n const colorIndices = this.readBufferData16(primitive.attributes, \"_COLORINDEX\");\n if (undefined !== colorIndices && material) {\n let texStep;\n if (isGltf1Material(material))\n texStep = material.values?.texStep;\n else\n texStep = material.extensions?.KHR_techniques_webgl?.values?.u_texStep;\n\n if (texStep) {\n const uvParams = [];\n for (let i = 0; i < colorIndices.count; i++)\n uvParams.push(new Point2d(texStep[1] + texStep[0] * colorIndices.buffer[i], .5));\n\n const paramList = QPoint2dList.fromPoints(uvParams);\n mesh.uvs = paramList.toTypedArray();\n mesh.uvQParams = paramList.params;\n }\n }\n }\n\n const draco = primitive.extensions?.KHR_draco_mesh_compression;\n if (draco)\n return this.readDracoMeshPrimitive(mesh.primitive, draco) ? mesh : undefined;\n\n this.readBatchTable(mesh.primitive, primitive);\n if (mesh.primitive.features) {\n const features = this.readPrimitiveFeatures(primitive);\n if (features) {\n if (features instanceof Feature)\n mesh.primitive.features.add(features, 1);\n else\n mesh.primitive.features.setIndices(features);\n }\n }\n\n if (!this.readVertices(mesh, primitive, pseudoRtcBias))\n return undefined;\n\n switch (primitiveType) {\n case MeshPrimitiveType.Mesh: {\n if (!this.readMeshIndices(mesh, primitive))\n return undefined;\n\n if (!displayParams.ignoreLighting && !this.readMeshNormals(mesh, primitive.attributes, \"NORMAL\"))\n return undefined;\n\n if (!mesh.uvs) {\n let texCoordIndex = 0;\n if (!isGltf1Material(material) && undefined !== material.pbrMetallicRoughness?.baseColorTexture?.texCoord)\n texCoordIndex = JsonUtils.asInt(material.pbrMetallicRoughness.baseColorTexture.texCoord);\n\n this.readUVParams(mesh, primitive.attributes, `TEXCOORD_${texCoordIndex}`);\n }\n\n if (this._deduplicateVertices && !this.deduplicateVertices(mesh))\n return undefined;\n\n break;\n }\n\n case MeshPrimitiveType.Polyline:\n case MeshPrimitiveType.Point: {\n assert(meshMode === GltfMeshMode.Points || meshMode === GltfMeshMode.Lines || meshMode === GltfMeshMode.LineStrip);\n if (undefined !== mesh.primitive.polylines && !this.readPolylines(mesh.primitive.polylines, primitive, \"indices\", meshMode))\n return undefined;\n break;\n }\n default: {\n assert(false, \"unhandled primitive type\");\n return undefined;\n }\n }\n\n if (displayParams.textureMapping && !mesh.uvs)\n return undefined;\n\n if (primitive.extensions?.CESIUM_primitive_outline) {\n const data = this.readBufferData32(primitive.extensions.CESIUM_primitive_outline, \"indices\");\n if (data !== undefined) {\n assert(0 === data.count % 2);\n mesh.primitive.edges = new MeshEdges();\n for (let i = 0; i < data.count;)\n mesh.primitive.edges.visible.push(new MeshEdge(data.buffer[i++], data.buffer[i++]));\n }\n } else if (primitive.extensions?.EXT_mesh_primitive_edge_visibility) {\n const ext = primitive.extensions.EXT_mesh_primitive_edge_visibility;\n const visibility = this.readBufferData8(ext, \"visibility\");\n if (visibility) {\n const indices = mesh.indices;\n assert(indices !== undefined);\n assert(visibility.buffer instanceof Uint8Array);\n\n const silhouetteNormals = this.readAndOctEncodeNormals(ext, \"silhouetteNormals\");\n const normalPairs = silhouetteNormals ? new Uint32Array(silhouetteNormals.buffer, silhouetteNormals.byteOffset, silhouetteNormals.byteLength / 4) : undefined;\n mesh.primitive.edges = new MeshEdges();\n\n for (const edge of compactEdgeIterator(visibility.buffer, normalPairs, indices.length, (idx) => indices[idx])) {\n if (undefined === edge.normals) {\n mesh.primitive.edges.visible.push(new MeshEdge(edge.index0, edge.index1));\n } else {\n mesh.primitive.edges.silhouette.push(new MeshEdge(edge.index0, edge.index1));\n const normal0 = new OctEncodedNormal(edge.normals & 0x0000ffff);\n const normal1 = new OctEncodedNormal(edge.normals >>> 16);\n mesh.primitive.edges.silhouetteNormals.push(new OctEncodedNormalPair(normal0, normal1));\n }\n }\n }\n\n const lineStrings = ext.lineStrings;\n if (lineStrings) {\n for (const extLineString of lineStrings) {\n const polylineIndices = this.readBufferData32(extLineString, \"indices\");\n if (polylineIndices) {\n if (!mesh.primitive.edges) {\n mesh.primitive.edges = new MeshEdges();\n }\n\n const curGroup: MeshPolylineGroup = {\n appearance: this.getEdgeAppearance(extLineString.material),\n polylines: [],\n };\n\n const curLineString: number[] = [];\n for (const index of polylineIndices.buffer) {\n if (index === 0xffffffff) {\n if (curLineString.length > 1) {\n curGroup.polylines.push(new MeshPolyline(curLineString));\n }\n\n curLineString.length = 0;\n } else {\n curLineString.push(index);\n }\n }\n\n if (curLineString.length > 1) {\n curGroup.polylines.push(new MeshPolyline(curLineString));\n }\n\n if (curGroup.polylines.length > 0) {\n mesh.primitive.edges.polylineGroups.push(curGroup);\n }\n }\n }\n }\n\n if (mesh.primitive.edges) {\n mesh.primitive.edges.appearance = this.getEdgeAppearance(ext.material);\n }\n }\n\n return mesh;\n }\n\n private getEdgeAppearance(materialId: GltfId | undefined): EdgeAppearanceOverrides | undefined {\n const material = undefined !== materialId ? this._materials[materialId] : undefined;\n const displayParams = material ? this.createDisplayParams(material, false) : undefined;\n if (displayParams) {\n return { color: displayParams.lineColor };\n }\n\n return undefined;\n }\n\n private readPointCloud2(primitive: GltfMeshPrimitive, hasFeatures: boolean): GltfPointCloud | undefined {\n let pointRange: Range3d | undefined;\n let positions: Uint8Array | Uint16Array | Float32Array;\n let qparams: QParams3d | undefined;\n\n const posView = this.getBufferView(primitive.attributes, \"POSITION\");\n switch (posView?.type) {\n case GltfDataType.Float: {\n const posData = posView.toBufferData(GltfDataType.Float);\n if (!(posData?.buffer instanceof Float32Array)) {\n return undefined;\n }\n\n positions = posData.buffer;\n const strideSkip = posView.stride - 3;\n pointRange = new Range3d();\n for (let i = 0; i < positions.length; i += strideSkip) {\n pointRange.extendXYZ(positions[i++], positions[i++], positions[i++]);\n }\n\n qparams = QParams3d.fromOriginAndScale(new Point3d(0, 0, 0), new Point3d(1, 1, 1));\n break;\n }\n case GltfDataType.UnsignedByte:\n case GltfDataType.UnsignedShort: {\n const posData = posView.toBufferData(posView.type);\n if (!(posData?.buffer instanceof Uint8Array || posData?.buffer instanceof Uint16Array)) {\n return undefined;\n }\n\n positions = posData.buffer;\n let min, max;\n const ext = posView.accessor.extensions?.WEB3D_quantized_attributes;\n if (ext) {\n min = ext.decodedMin;\n max = ext.decodedMax;\n } else {\n // Assume KHR_mesh_quantization...\n min = [0, 0, 0];\n if (GltfDataType.UnsignedShort === posView.type)\n max = [0xFFFF, 0xFFFF, 0xFFFF];\n else\n max = [0xFF, 0xFF, 0xFF];\n }\n\n if (undefined === min || undefined === max) {\n return undefined;\n }\n\n pointRange = Range3d.createXYZXYZ(min[0], min[1], min[2], max[0], max[1], max[2]);\n qparams = QParams3d.fromRange(pointRange);\n break;\n }\n default:\n return undefined;\n }\n\n const colorView = this.getBufferView(primitive.attributes, \"COLOR_0\");\n if (!colorView || GltfDataType.UnsignedByte !== colorView.type)\n return undefined;\n\n const colorData = colorView.toBufferData(GltfDataType.UnsignedByte);\n if (!(colorData?.buffer instanceof Uint8Array))\n return undefined;\n\n let colors = colorData.buffer;\n if (\"VEC4\" === colorView.accessor.type) {\n // ###TODO support transparent point clouds\n colors = new Uint8Array(colorData.count * 3);\n for (let i = 0; i < colorData.count; i++) {\n const srcIdx = colorView.stride * i;\n const dstIdx = 3 * i;\n for (let j = 0; j < 3; j++)\n colors[dstIdx + j] = colorData.buffer[srcIdx + j];\n }\n }\n\n const features = new FeatureIndex();\n if (hasFeatures) {\n features.type = FeatureIndexType.Uniform;\n }\n\n this._containsPointCloud = true;\n return {\n type: \"pointcloud\",\n positions,\n qparams,\n pointRange,\n colors,\n colorFormat: \"rgb\",\n features,\n // ###TODO: If tile does not use additive refinement, compute voxelSize based on point range.\n // Additive refinement is typical of the glTF point clouds we receive from Orbit.\n voxelSize: 0,\n };\n }\n\n private readDracoMeshPrimitive(mesh: Mesh, ext: DracoMeshCompression): boolean {\n const draco = this._dracoMeshes.get(ext);\n if (!draco || \"triangle-list\" !== draco.topology)\n return false;\n\n const indices = draco.indices?.value;\n if (!indices || (indices.length % 3) !== 0)\n return false;\n\n const pos = draco.attributes.POSITION?.value;\n if (!pos || (pos.length % 3) !== 0)\n return false;\n\n // ###TODO: I have yet to see a draco-encoded mesh with interleaved attributes. Currently not checking.\n const triangle = new Triangle();\n for (let i = 0; i < indices.length; i += 3) {\n triangle.setIndices(indices[i], indices[i + 1], indices[i + 2]);\n mesh.addTriangle(triangle);\n }\n\n let posRange: Range3d;\n const bbox = draco.header?.boundingBox;\n if (bbox) {\n posRange = Range3d.createXYZXYZ(bbox[0][0], bbox[0][1], bbox[0][2], bbox[1][0], bbox[1][1], bbox[1][2]);\n } else {\n posRange = Range3d.createNull();\n for (let i = 0; i < pos.length; i += 3)\n posRange.extendXYZ(pos[i], pos[i + 1], pos[i + 2]);\n }\n\n assert(mesh.points instanceof QPoint3dList);\n mesh.points.params.setFromRange(posRange);\n const pt = Point3d.createZero();\n for (let i = 0; i < pos.length; i += 3) {\n pt.set(pos[i], pos[i + 1], pos[i + 2]);\n mesh.points.add(pt);\n }\n\n const normals = draco.attributes.NORMAL?.value;\n if (normals && (normals.length % 3) === 0) {\n const vec = Vector3d.createZero();\n for (let i = 0; i < normals.length; i += 3) {\n vec.set(normals[i], normals[i + 1], normals[i + 2]);\n mesh.normals.push(OctEncodedNormal.fromVector(vec));\n }\n }\n\n const uvs = draco.attributes.TEXCOORD_0?.value;\n if (uvs && (uvs.length % 2) === 0)\n for (let i = 0; i < uvs.length; i += 2)\n mesh.uvParams.push(new Point2d(uvs[i], uvs[i + 1]));\n\n const batchIds = draco.attributes._BATCHID?.value;\n if (batchIds && mesh.features) {\n const featureIndices = [];\n for (const batchId of batchIds)\n featureIndices.push(batchId);\n\n mesh.features.setIndices(featureIndices);\n }\n\n return true;\n }\n\n private deduplicateVertices(mesh: GltfMeshData): boolean {\n if (!mesh.points || !mesh.indices)\n return false;\n\n const numPoints = mesh.indices.length;\n assert(0 === numPoints % 3);\n\n const indices = mesh.indices;\n if (indices instanceof Uint16Array && numPoints > 0xffff)\n mesh.indices = new Uint32Array(numPoints);\n else if (indices instanceof Uint8Array && numPoints > 0xff)\n mesh.indices = new Uint32Array(numPoints);\n\n const points = new Uint16Array(3 * numPoints);\n const normals = mesh.normals ? new Uint16Array(numPoints) : undefined;\n const uvs = mesh.uvs ? new Uint16Array(2 * numPoints) : undefined;\n\n for (let i = 0; i < numPoints; i++) {\n const index = indices[i];\n mesh.indices[i] = i;\n\n points[i * 3 + 0] = mesh.points[index * 3 + 0];\n points[i * 3 + 1] = mesh.points[index * 3 + 1];\n points[i * 3 + 2] = mesh.points[index * 3 + 2];\n\n if (normals)\n // normals is only defined if mesh.normals is defined.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n normals[i] = mesh.normals![index];\n\n if (uvs) {\n // uvs is only defined if mesh.uvs is defined.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n uvs[i * 2 + 0] = mesh.uvs![index * 2 + 0];\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n uvs[i * 2 + 1] = mesh.uvs![index * 2 + 1];\n }\n }\n\n mesh.points = points;\n mesh.normals = normals;\n mesh.uvs = uvs;\n\n return true;\n }\n\n /**\n *\n * @param positions quantized points\n * @param primitive input json\n * @param pseudoRtcBias a bias applied to each point - this is a workaround for tiles generated by\n * context capture which have a large offset from the tileset origin that exceeds the\n * capacity of 32 bit integers. This is essentially an ad hoc RTC applied at read time.\n */\n private readVertices(mesh: GltfMeshData, primitive: GltfMeshPrimitive, pseudoRtcBias?: Vector3d): boolean {\n const view = this.getBufferView(primitive.attributes, \"POSITION\");\n if (undefined === view)\n return false;\n\n if (GltfDataType.Float === view.type) {\n const buffer = view.toBufferData(GltfDataType.Float);\n if (undefined === buffer)\n return false;\n\n const strideSkip = view.stride - 3;\n mesh.pointRange = Range3d.createNull();\n for (let i = 0; i < buffer.buffer.length; i += strideSkip)\n mesh.pointRange.extendXYZ(buffer.buffer[i++], buffer.buffer[i++], buffer.buffer[i++]);\n\n const positions = new QPoint3dList(QParams3d.fromRange(mesh.pointRange));\n const scratchPoint = new Point3d();\n for (let i = 0, j = 0; i < buffer.count; i++, j += strideSkip) {\n scratchPoint.set(buffer.buffer[j++], buffer.buffer[j++], buffer.buffer[j++]);\n if (undefined !== pseudoRtcBias)\n scratchPoint.subtractInPlace(pseudoRtcBias);\n\n positions.add(scratchPoint);\n }\n mesh.pointQParams = positions.params;\n mesh.points = positions.toTypedArray();\n } else {\n if (GltfDataType.UnsignedShort !== view.type)\n return false;\n\n let rangeMin, rangeMax;\n const quantized = view.accessor.extensions?.WEB3D_quantized_attributes;\n if (quantized) {\n rangeMin = quantized.decodedMin;\n rangeMax = quantized.decodedMax;\n } else {\n // Assume KHR_mesh_quantization...\n rangeMin = [0, 0, 0];\n rangeMax = [0xFFFF, 0xFFFF, 0xFFFF];\n }\n\n if (undefined === rangeMin || undefined === rangeMax) // required by spec...\n return false;\n\n // ###TODO apply WEB3D_quantized_attributes.decodeMatrix? Have not encountered in the wild; glTF 1.0 only.\n const buffer = view.toBufferData(GltfDataType.UnsignedShort);\n if (undefined === buffer || !(buffer.buffer instanceof Uint16Array))\n return false;\n\n assert(buffer.buffer instanceof Uint16Array);\n mesh.pointRange = Range3d.createXYZXYZ(rangeMin[0], rangeMin[1], rangeMin[2], rangeMax[0], rangeMax[1], rangeMax[2]);\n if (undefined !== pseudoRtcBias) {\n mesh.pointRange.low.subtractInPlace(pseudoRtcBias);\n mesh.pointRange.high.subtractInPlace(pseudoRtcBias);\n }\n mesh.pointQParams = QParams3d.fromRange(mesh.pointRange);\n if (3 === view.stride) {\n mesh.points = buffer.buffer;\n } else {\n mesh.points = new Uint16Array(3 * view.count);\n for (let i = 0, j = 0; i < view.count; i++) {\n const index = i * view.stride;\n mesh.points[j++] = buffer.buffer[index];\n mesh.points[j++] = buffer.buffer[index + 1];\n mesh.points[j++] = buffer.buffer[index + 2];\n }\n }\n }\n\n return true;\n }\n\n protected readIndices(json: { [k: string]: any }, accessorName: string): number[] | undefined {\n const data = this.readBufferData32(json, accessorName);\n if (undefined === data)\n return undefined;\n\n const indices = [];\n for (let i = 0; i < data.count; i++)\n indices.push(data.buffer[i]);\n\n return indices;\n }\n\n protected readBatchTable(_mesh: Mesh, _json: GltfMeshPrimitive) {\n }\n\n protected readPrimitiveFeatures(primitive: GltfMeshPrimitive): Feature | number[] | undefined {\n const ext = primitive.extensions?.EXT_mesh_features;\n if (!ext || !primitive.attributes || !this._structuralMetadata || !this._idMap) {\n return undefined;\n }\n\n let vertexCount = 0;\n const featureIdBuffers = new Map<number, {buffer: GltfDataBuffer, stride: number}>();\n for(const featureIdDesc of ext.featureIds){\n if(featureIdDesc.attribute === undefined){\n continue;\n }\n const bufferView = this.getBufferView(primitive.attributes, `_FEATURE_ID_${featureIdDesc.attribute}`);\n const bufferData = bufferView?.toBufferData(bufferView.type);\n const buffer = bufferData?.buffer;\n if (!bufferView || !buffer) {\n return undefined;\n }\n vertexCount = bufferData.count ?? 0;\n featureIdBuffers.set(featureIdDesc.attribute, {buffer, stride: bufferView.stride});\n }\n\n const itwinFeatureIndices: number[] = [];\n const vertexPropsMap = new Map<string, string>();\n for (let vertexId = 0; vertexId < vertexCount; vertexId++) {\n let vertexUniqueId = \"\";\n for(const featureIdDesc of ext.featureIds){\n if (featureIdDesc.attribute === undefined) {\n continue;\n }\n const {buffer, stride} = expectDefined(featureIdBuffers.get(featureIdDesc.attribute));\n const featureId = buffer[vertexId * stride];\n const propertyTableId = featureIdDesc.propertyTable ?? 0;\n vertexUniqueId = `${vertexUniqueId}-${featureId}-${propertyTableId}`;\n }\n\n let vertexElementId;\n if(!vertexPropsMap.has(vertexUniqueId)){\n const vertexProps: any = {};\n\n for(const featureIdDesc of ext.featureIds){\n if (featureIdDesc.attribute === undefined) {\n continue;\n }\n const {buffer, stride} = expectDefined(featureIdBuffers.get(featureIdDesc.attribute));\n const featureId = buffer[vertexId * stride];\n\n const table = this._structuralMetadata.tables[featureIdDesc.propertyTable ?? 0];\n vertexProps[table.name] = {};\n for(const entries of table.entries){\n if(entries.values[featureId] !== undefined){\n vertexProps[table.name][entries.name] = entries.values[featureId];\n }\n }\n }\n\n vertexElementId = this._idMap.getBatchId(vertexProps);\n vertexPropsMap.set(vertexUniqueId, vertexElementId);\n\n // If the element id is already assigned to a previous vertex,\n // reuse the previous feature id to avoid collision in the feature table\n if(!this._meshElementIdToFeatureIndex.has(vertexElementId)){\n this._meshElementIdToFeatureIndex.set(vertexElementId, this._meshFeatures.length);\n this._meshFeatures.push(new Feature(vertexElementId));\n }\n }\n\n vertexElementId = vertexPropsMap.get(vertexUniqueId) ?? \"\";\n itwinFeatureIndices.push(this._meshElementIdToFeatureIndex.get(vertexElementId) ?? 0);\n }\n\n return itwinFeatureIndices;\n }\n\n protected readMeshIndices(mesh: GltfMeshData, json: { [k: string]: any }): boolean {\n if (undefined !== json.indices) {\n const data = this.readBufferData16(json, \"indices\") || this.readBufferData32(json, \"indices\");\n if (data && (data.buffer instanceof Uint8Array || data.buffer instanceof Uint16Array || data.buffer instanceof Uint32Array)) {\n mesh.indices = data.buffer;\n return true;\n }\n\n return false;\n }\n\n // Non-indexed geometry. Manufacture triangle indices from points.\n const numPoints = mesh.points?.length;\n if (undefined === numPoints || 0 !== numPoints % 3)\n return false;\n\n mesh.indices = numPoints < 255 ? new Uint8Array(numPoints) : (numPoints < 0xffff ? new Uint16Array(numPoints) : new Uint32Array(numPoints));\n for (let i = 0; i < numPoints; i++)\n mesh.indices[i] = i;\n\n return true;\n }\n\n protected readMeshNormals(mesh: GltfMeshData, json: { [k: string]: any }, accessorName: string): boolean {\n const normals = this.readAndOctEncodeNormals(json, accessorName);\n if (normals) {\n mesh.normals = normals;\n return true;\n }\n\n return false;\n }\n\n protected readAndOctEncodeNormals(json: { [k: string]: any }, accessorName: string): Uint16Array | undefined {\n const view = this.getBufferView(json, accessorName);\n if (undefined === view)\n return undefined;\n\n switch (view.type) {\n case GltfDataType.Float: {\n const data = view.toBufferData(GltfDataType.Float);\n if (undefined === data)\n return undefined;\n\n const normals = new Uint16Array(data.count);\n const scratchNormal = new Vector3d();\n const strideSkip = view.stride - 3;\n for (let i = 0, j = 0; i < data.count; i++, j += strideSkip) {\n scratchNormal.set(data.buffer[j++], data.buffer[j++], data.buffer[j++]);\n normals[i] = OctEncodedNormal.encode(scratchNormal);\n }\n\n return normals;\n }\n\n case GltfDataType.SignedByte: {\n const data = view.toBufferData(GltfDataType.SignedByte);\n if (!data) {\n return undefined;\n }\n\n const normalize = (val: number) => 2 * ((val + 128) / 255) - 1;\n const normals = new Uint16Array(data.count);\n const scratchNormal = new Vector3d();\n const strideSkip = view.stride - 3;\n for (let i = 0, j = 0; i < data.count; i++, j += strideSkip) {\n const x = normalize(data.buffer[j++]);\n const y = normalize(data.buffer[j++]);\n const z = normalize(data.buffer[j++]);\n scratchNormal.set(x, y, z);\n normals[i] = OctEncodedNormal.encode(scratchNormal);\n }\n\n return normals;\n }\n\n // This is weird, why does it assume 8-bit normal vectors are actually 16-bit oct-encoded normals?\n case GltfDataType.UnsignedByte: {\n const data = view.toBufferData(GltfDataType.UnsignedByte);\n if (undefined === data)\n return undefined;\n\n // ###TODO: we shouldn't have to allocate OctEncodedNormal objects...just use uint16s / numbers...\n const normals = new Uint16Array(data.count);\n for (let i = 0; i < data.count; i++) {\n // ###TODO? not clear why ray writes these as pairs of uint8...\n const index = i * view.stride;\n const normal = data.buffer[index] | (data.buffer[index + 1] << 8);\n normals[i] = normal;\n }\n\n return normals;\n }\n default:\n return undefined;\n }\n }\n\n protected readColors(mesh: GltfMeshData, attribute: { [k: string]: any }, accessorName: string): boolean {\n const view = this.getBufferView(attribute, accessorName);\n if (!view || (GltfDataType.Float !== view.type && GltfDataType.UnsignedByte !== view.type && GltfDataType.SignedByte !== view.type))\n return false;\n\n const data = view.toBufferData(view.type);\n if (!data)\n return false;\n\n const hasAlpha = \"VEC4\" === view.accessor.type;\n const factor = view.type === GltfDataType.Float ? 255 : 1;\n const rgbt = new Uint8Array(4);\n const color = new Uint32Array(rgbt.buffer);\n for (let i = 0; i < data.count; i++) {\n const index = view.stride * i;\n rgbt[0] = data.buffer[index] * factor;\n rgbt[1] = data.buffer[index + 1] * factor;\n rgbt[2] = data.buffer[index + 2] * factor;\n rgbt[3] = hasAlpha ? (255 - data.buffer[index + 3] * factor) : 0;\n mesh.primitive.colors.push(mesh.primitive.colorMap.insert(color[0]));\n }\n\n return true;\n }\n\n private readUVParams(mesh: GltfMeshData, json: { [k: string]: any }, accessorName: string): boolean {\n const view = this.getBufferView(json, accessorName);\n\n if (view === undefined)\n return false;\n\n switch (view.type) {\n case GltfDataType.Float: {\n const data = this.readBufferDataFloat(json, accessorName);\n if (!data)\n return false;\n\n mesh.uvRange = Range2d.createNull();\n\n for (let i = 0; i < data.count; i++) {\n const index = view.stride * i; // 2 float per param...\n mesh.uvRange.extendXY(data.buffer[index], data.buffer[index + 1]);\n }\n mesh.uvQParams = QParams2d.fromRange(mesh.uvRange);\n mesh.uvs = new Uint16Array(data.count * 2);\n for (let i = 0, j = 0; i < data.count; i++) {\n const index = view.stride * i; // 2 float per param...\n mesh.uvs[j++] = Quantization.quantize(data.buffer[index], mesh.uvQParams.origin.x, mesh.uvQParams.scale.x);\n mesh.uvs[j++] = Quantization.quantize(data.buffer[index + 1], mesh.uvQParams.origin.y, mesh.uvQParams.scale.y);\n }\n return true;\n }\n\n case GltfDataType.UnsignedShort: {\n const quantized = view.accessor.extensions?.WEB3D_quantized_attributes;\n const rangeMin = quantized?.decodedMin;\n const rangeMax = quantized?.decodedMax;\n if (undefined === rangeMin || undefined === rangeMax)\n return false;\n\n const qData = view.toBufferData(GltfDataType.UnsignedShort);\n if (undefined === qData || !(qData.buffer instanceof Uint16Array))\n return false;\n\n mesh.uvRange = Range2d.createXYXY(rangeMin[0], rangeMin[1], rangeMax[0], rangeMax[1]);\n mesh.uvQParams = QParams2d.fromRange(mesh.uvRange);\n if (2 === view.stride) {\n mesh.uvs = qData.buffer;\n } else {\n mesh.uvs = new Uint16Array(2 * view.count);\n for (let i = 0, j = 0; i < view.count; i++) {\n const index = i * view.stride;\n mesh.uvs[j++] = qData.buffer[index];\n mesh.uvs[j++] = qData.buffer[index + 1];\n }\n }\n return true;\n }\n default:\n assert(false);\n return false;\n\n }\n\n return true;\n }\n\n protected readPolylines(polylines: MeshPolylineList, json: { [k: string]: any }, accessorName: string, mode: GltfMeshMode.Points | GltfMeshMode.Lines | GltfMeshMode.LineStrip): boolean {\n const bufferView = this.getBufferView(json, accessorName);\n const data = bufferView?.toBufferData(GltfDataType.UInt32);\n if (undefined === data)\n return false;\n\n const indices = new Array<number>();\n switch (mode) {\n case GltfMeshMode.Points: {\n for (let i = 0; i < data.count;)\n indices.push(data.buffer[i++]);\n\n break;\n }\n case GltfMeshMode.Lines: {\n for (let i = 0; i < data.count;) {\n const index0 = data.buffer[i++];\n const index1 = data.buffer[i++];\n if (0 === indices.length || index0 !== indices[indices.length - 1]) {\n if (indices.length !== 0) {\n polylines.push(new MeshPolyline(indices));\n indices.length = 0;\n }\n indices.push(index0);\n }\n indices.push(index1);\n }\n\n break;\n }\n case GltfMeshMode.LineStrip: {\n assert(undefined !== bufferView); // compiler can't seem to infer this...\n const restart = GltfDataType.UnsignedByte === bufferView.type ? 0xff : (GltfDataType.UnsignedShort === bufferView.type ? 0xffff : 0xffffffff);\n for (const index of data.buffer) {\n if (index === restart) {\n if (indices.length > 1) {\n polylines.push(new MeshPolyline(indices));\n }\n\n indices.length = 0;\n } else {\n indices.push(index);\n }\n }\n break;\n }\n }\n\n if (indices.length !== 0)\n polylines.push(new MeshPolyline(indices));\n\n return true;\n }\n\n protected async resolveResources(): Promise<void> {\n // Load any external images and buffers.\n await this._resolveResources();\n\n // Decompress any meshopt-compressed buffer views\n const decodeMeshoptBuffers: Array<Promise<void>> = [];\n for (const bv of gltfDictionaryIterator(this._bufferViews)) {\n const ext = bv.extensions?.EXT_meshopt_compression;\n if (ext) {\n const bufferData = this._buffers[ext.buffer]?.resolvedBuffer;\n if (bufferData) {\n const source = new Uint8Array(bufferData.buffer, bufferData.byteOffset + (ext.byteOffset ?? 0), ext.byteLength ?? 0);\n const decode = async () => {\n bv.resolvedBuffer = await decodeMeshoptBuffer(source, ext);\n if (bv.resolvedBuffer) {\n bv.byteLength = bv.resolvedBuffer.byteLength;\n bv.byteOffset = 0;\n }\n };\n\n decodeMeshoptBuffers.push(decode());\n }\n }\n }\n\n await Promise.all(decodeMeshoptBuffers);\n\n // If any meshes are draco-compressed, dynamically load the decoder module and then decode the meshes.\n const dracoMeshes: DracoMeshCompression[] = [];\n\n for (const node of this.traverseScene()) {\n for (const meshId of getGltfNodeMeshIds(node)) {\n const mesh = this._meshes[meshId];\n if (mesh?.primitives)\n for (const primitive of mesh.primitives)\n if (primitive.extensions?.KHR_draco_mesh_compression)\n dracoMeshes.push(primitive.extensions.KHR_draco_mesh_compression);\n }\n }\n\n if (dracoMeshes.length === 0)\n return;\n\n try {\n // Refuse to continue decoding if using Internet Explorer or old Microsoft Edge. We do not want to trigger any legacy decoding fallbacks within draco3d.\n if (ProcessDetector.isIEBrowser) {\n throw new Error(\"Unsupported browser for Draco decoding\");\n }\n\n const dracolib = await import(\"draco3d\");\n const dracoLoader = (await import(\"@loaders.gl/draco\")).DracoLoader;\n\n await Promise.all(dracoMeshes.map(async (x) => this.decodeDracoMesh(x, dracoLoader, dracolib)));\n } catch (err) {\n Logger.logWarning(FrontendLoggerCategory.Render, \"Failed to decode draco-encoded glTF mesh\");\n Logger.logException(FrontendLoggerCategory.Render, err);\n }\n }\n\n private async _resolveResources(): Promise<void> {\n // ###TODO traverse the scene nodes to find resources referenced by them, instead of resolving everything - some resources may not\n // be required for the scene.\n const promises: Array<Promise<void>> = [];\n try {\n for (const buffer of gltfDictionaryIterator(this._buffers))\n if (!buffer.resolvedBuffer)\n promises.push(this.resolveBuffer(buffer));\n\n await Promise.all(promises);\n if (this._isCanceled)\n return;\n\n promises.length = 0;\n for (const image of gltfDictionaryIterator(this._images))\n if (!image.resolvedImage)\n promises.push(this.resolveImage(image));\n\n await Promise.all(promises);\n } catch { }\n }\n\n private async decodeDracoMesh(ext: DracoMeshCompression, loader: typeof DracoLoader, draco3d: any): Promise<void> {\n const bv = this._bufferViews[ext.bufferView];\n if (!bv || !bv.byteLength)\n return;\n\n let buf = this._buffers[bv.buffer]?.resolvedBuffer;\n if (!buf)\n return;\n\n const offset = bv.byteOffset ?? 0;\n buf = buf.subarray(offset, offset + bv.byteLength);\n\n const mesh = await loader.parse(buf, { modules: { draco3d } }); // NB: `options` argument declared optional but will produce exception if not supplied. Regardless, we are specifying our own bundled draco3d module to avoid CDN requests.\n if (mesh)\n this._dracoMeshes.set(ext, mesh);\n }\n\n protected resolveUrl(uri: string): string | undefined {\n try {\n const resolved = new URL(uri, this._baseUrl);\n resolved.search = this._baseUrl?.search ?? \"\";\n return resolved.toString();\n } catch {\n return undefined;\n }\n }\n\n private async resolveBuffer(buffer: GltfBuffer & { resolvedBuffer?: Uint8Array }): Promise<void> {\n if (buffer.resolvedBuffer || undefined === buffer.uri)\n return;\n\n try {\n const url = this.resolveUrl(buffer.uri);\n const response = url ? await fetch(url) : undefined;\n if (this._isCanceled)\n return;\n\n const data = await response?.arrayBuffer();\n if (this._isCanceled)\n return;\n\n if (data)\n buffer.resolvedBuffer = new Uint8Array(data);\n } catch {\n //\n }\n }\n\n private async resolveImage(image: GltfImage & { resolvedImage?: TextureImageSource }): Promise<void> {\n if (image.resolvedImage)\n return;\n\n interface BufferViewSource { bufferView?: GltfId, mimeType?: string }\n const bvSrc: BufferViewSource | undefined = undefined !== image.bufferView ? image : image.extensions?.KHR_binary_glTF;\n if (undefined !== bvSrc?.bufferView) {\n const format = undefined !== bvSrc.mimeType ? getImageSourceFormatForMimeType(bvSrc.mimeType) : undefined;\n const bufferView = this._bufferViews[bvSrc.bufferView];\n if (undefined === format || !bufferView || !bufferView.byteLength || bufferView.byteLength < 0)\n return;\n\n const bufferData = this._buffers[bufferView.buffer]?.resolvedBuffer;\n if (!bufferData)\n return;\n\n const offset = bufferView.byteOffset ?? 0;\n const bytes = bufferData.subarray(offset, offset + bufferView.byteLength);\n try {\n const imageSource = new ImageSource(bytes, format);\n if (this._system.supportsCreateImageBitmap)\n image.resolvedImage = await imageBitmapFromImageSource(imageSource);\n else\n image.resolvedImage = await imageElementFromImageSource(imageSource);\n } catch {\n //\n }\n\n return;\n }\n\n const url = undefined !== image.uri ? this.resolveUrl(image.uri) : undefined;\n if (undefined !== url)\n image.resolvedImage = await tryImageElementFromUrl(url);\n }\n\n /** The glTF spec says that if GltfSampler.wrapS/T are omitted, they default to Repeat.\n * However, the reality data service serves tiles that lack any wrapS/T property, and we want those clamped to edge, not repeated.\n * (We also don't want to produce mip-maps for them, which is determined indirectly from the wrap mode).\n * Allow the default to be optionally overridden.\n */\n public defaultWrapMode = GltfWrapMode.Repeat;\n\n /** Exposed strictly for testing. */\n public getTextureType(sampler?: GltfSampler): RenderTexture.Type {\n // ###TODO: RenderTexture currently does not support different wrapping behavior for U vs V, nor does it support mirrored repeat.\n let wrapS = sampler?.wrapS;\n let wrapT = sampler?.wrapT;\n if (undefined === wrapS && undefined === wrapT)\n wrapS = wrapT = this.defaultWrapMode;\n\n if (GltfWrapMode.ClampToEdge === wrapS || GltfWrapMode.ClampToEdge === wrapT)\n return RenderTexture.Type.TileSection;\n\n return RenderTexture.Type.Normal;\n }\n\n private resolveTexture(textureId: string, isTransparent: boolean): RenderTexture | false {\n const texture = this._textures[textureId];\n if (!texture || undefined === texture.source)\n return false;\n\n const image = this._images[texture.source]?.resolvedImage;\n if (!image)\n return false;\n\n\n const samplerId = texture.sampler;\n const sampler = undefined !== samplerId ? this._samplers[samplerId] : undefined;\n const textureType = this.getTextureType(sampler);\n const renderTexture = this._system.createTexture({\n type: textureType,\n image: {\n source: image,\n transparency: isTransparent ? TextureTransparency.Mixed : TextureTransparency.Opaque,\n },\n });\n return renderTexture ?? false;\n }\n\n protected findTextureMapping(id: string | undefined, isTransparent: boolean, normalMapId: string | undefined): TextureMapping | undefined {\n if (undefined === id && undefined === normalMapId)\n return undefined;\n\n let texture;\n if (undefined !== id) {\n texture = this._resolvedTextures.get({ id, isTransparent });\n if (undefined === texture)\n this._resolvedTextures.set({ id, isTransparent }, texture = this.resolveTexture(id, isTransparent));\n }\n\n let normalMap;\n if (undefined !== normalMapId) {\n normalMap = this._resolvedTextures.get({ id: normalMapId, isTransparent: false });\n if (undefined === normalMap)\n this._resolvedTextures.set({ id: normalMapId, isTransparent: false }, normalMap = this.resolveTexture(normalMapId, false));\n }\n\n let nMap;\n if (normalMap) {\n const greenUp = true;\n if (texture) {\n nMap = {\n normalMap,\n greenUp,\n };\n } else {\n texture = normalMap;\n nMap = { greenUp };\n }\n }\n\n if (!texture)\n return undefined;\n\n const textureMapping = new TextureMapping(texture, new TextureMapping.Params());\n textureMapping.normalMapParams = nMap;\n return textureMapping;\n }\n}\n\n/** Arguments supplied to [[readGltfGraphics]] to produce a [[RenderGraphic]] from a [glTF](https://www.khronos.org/gltf/) asset.\n * @public\n * @extensions\n */\nexport interface ReadGltfGraphicsArgs {\n /** A representation of the glTF data as one of:\n * - The binary data in glb format as a Uint8Array; or\n * - A JSON object conforming to the [glTF 2.0 specification](https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html); or\n * - A Uint8Array containing the utf8-encoded stringified JSON of an object conforming to the [glTF 2.0 specification](https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html).\n */\n gltf: Uint8Array | object;\n /** The iModel with which the graphics will be associated - typically obtained from the [[Viewport]] into which they will be drawn. */\n iModel: IModelConnection;\n /** Options for making the graphic [pickable]($docs/learning/frontend/ViewDecorations#pickable-view-graphic-decorations).\n * Only the [[PickableGraphicOptions.id]] property is required to make the graphics pickable. If a `modelId` is also supplied and differs from the `id`,\n * the graphics will also be selectable.\n */\n pickableOptions?: PickableGraphicOptions;\n /** The base URL for any relative URIs in the glTF. Typically, this is the same as the URL for the glTF asset itself.\n * If not supplied, relative URIs cannot be resolved. For glTF assets containing no relative URIs, this is not required.\n */\n baseUrl?: URL | string;\n /** @alpha */\n contentRange?: ElementAlignedBox3d;\n /** @alpha */\n transform?: Transform;\n /** @alpha */\n hasChildren?: boolean;\n /** @internal */\n idMap?: BatchedTileIdMap;\n}\n\n/** The output of [[readGltf]].\n * @public\n */\nexport interface GltfGraphic {\n /** The graphic created from the glTF model. */\n graphic: RenderGraphic;\n /** The bounding box of the model, in local coordinates (y-axis up). */\n localBoundingBox: ElementAlignedBox3d;\n /** The bounding box of the model, in world coordinates (z-axis up). */\n boundingBox: AxisAlignedBox3d;\n}\n\n/** The output of [[readGltfTemplate]].\n * @beta\n */\nexport interface GltfTemplate {\n /** The graphic template created from the glTF model. */\n template: GraphicTemplate;\n /** The bounding box of the model, in local coordinates (y-axis up). */\n localBoundingBox: ElementAlignedBox3d;\n /** The bounding box of the model, in world coordinates (z-axis up). */\n boundingBox: AxisAlignedBox3d;\n}\n\n/** Produce a [[RenderGraphic]] from a [glTF](https://www.khronos.org/gltf/) asset suitable for use in [view decorations]($docs/learning/frontend/ViewDecorations).\n * @returns a graphic produced from the glTF asset's default scene, or `undefined` if a graphic could not be produced from the asset.\n * @see [[readGltf]] for more details.\n * @public\n * @extensions\n */\nexport async function readGltfGraphics(args: ReadGltfGraphicsArgs): Promise<RenderGraphic | undefined> {\n const result = await readGltf(args);\n return result?.graphic;\n}\n\n/** Produce a [[GraphicTemplate]] from a [glTF](https://www.khronos.org/gltf/) asset suitable for use in [view decorations]($docs/learning/frontend/ViewDecorations).\n * @returns a template produced from the glTF asset's default scene, or `undefined` if a template could not be produced from the asset.\n * @see [[readGltf]] for more details.\n * @beta\n */\nexport async function readGltfTemplate(args: ReadGltfGraphicsArgs): Promise<GltfTemplate | undefined> {\n const baseUrl = typeof args.baseUrl === \"string\" ? new URL(args.baseUrl) : args.baseUrl;\n const props = GltfReaderProps.create(args.gltf, true, baseUrl); // glTF supports exactly one coordinate system with y axis up.\n const reader = props ? new GltfGraphicsReader(props, args) : undefined;\n if (!reader)\n return undefined;\n\n const result = await reader.readTemplate();\n if (!result.template)\n return undefined;\n\n return {\n template: result.template,\n localBoundingBox: result.contentRange ?? Range3d.createNull(),\n boundingBox: result.range ?? Range3d.createNull(),\n };\n}\n\n/** Produce a [[RenderGraphic]] from a [glTF](https://www.khronos.org/gltf/) asset suitable for use in [view decorations]($docs/learning/frontend/ViewDecorations).\n * @returns a graphic produced from the glTF asset's default scene, or `undefined` if a graphic could not be produced from the asset.\n * The returned graphic also includes the bounding boxes of the glTF model in world and local coordiantes.\n * @note Support for the full [glTF 2.0 specification](https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html) is currently a work in progress.\n * If a particular glTF asset fails to load and/or display properly, please\n * [submit an issue](https://github.com/iTwin/itwinjs-core/issues).\n * @see [Example decorator]($docs/learning/frontend/ViewDecorations#gltf-decorations) for an example of a decorator that reads and displays a glTF asset.\n * @see [[readGltfTemplate]] to produce a [[GraphicTemplate]] instead of a [[RenderGraphic]].\n * @public\n */\nexport async function readGltf(args: ReadGltfGraphicsArgs): Promise<GltfGraphic | undefined> {\n const result = await readGltfTemplate(args);\n if (!result) {\n return undefined;\n }\n\n const template = result.template;\n delete (result as Partial<GltfTemplate>).template;\n return {\n ...result,\n graphic: IModelApp.renderSystem.createGraphicFromTemplate({ template }),\n };\n}\n\n/** Implements [[readGltfGraphics]]. Exported strictly for tests.\n * @internal\n */\nexport class GltfGraphicsReader extends GltfReader {\n private readonly _featureTable?: FeatureTable;\n private readonly _contentRange?: ElementAlignedBox3d;\n private readonly _transform?: Transform;\n private readonly _isLeaf: boolean;\n public readonly binaryData?: Uint8Array; // strictly for tests\n public meshes?: GltfMeshData; // strictly for tests\n\n public constructor(props: GltfReaderProps, args: ReadGltfGraphicsArgs & { tileData?: LayerTileData }) {\n super({\n props,\n iModel: args.iModel,\n vertexTableRequired: true,\n idMap: args.idMap,\n tileData: args.tileData,\n });\n\n this._contentRange = args.contentRange;\n this._transform = args.transform;\n this._isLeaf = true !== args.hasChildren;\n\n this.binaryData = props.binaryData;\n const pickableId = args.pickableOptions?.id;\n if (pickableId) {\n this._featureTable = new FeatureTable(1, args.pickableOptions?.modelId ?? pickableId, BatchType.Primary);\n this._featureTable.insert(new Feature(pickableId));\n }\n }\n\n protected override get viewFlagOverrides(): ViewFlagOverrides {\n return {\n whiteOnWhiteReversal: false,\n renderMode: RenderMode.SmoothShade,\n };\n }\n\n public get meshElementIdToFeatureIndex(): Map<string, number> { // strictly for tests\n return this._meshElementIdToFeatureIndex;\n }\n\n protected override readMeshPrimitive(primitive: GltfMeshPrimitive, featureTable?: FeatureTable, pseudoRtcBias?: Vector3d): GltfPrimitiveData | undefined {\n const meshes = super.readMeshPrimitive(primitive, featureTable, pseudoRtcBias);\n this.meshes = meshes instanceof GltfMeshData ? meshes : undefined;\n return meshes;\n }\n\n private getGltfStructuralMetadataBuffer(id: GltfId, type: GltfStructuralMetadata.ClassPropertyComponentType){\n const bufferView = this._bufferViews[id];\n if (!bufferView || undefined === bufferView.buffer)\n return undefined;\n\n if(!bufferView.byteLength || bufferView.byteLength === 0){\n return undefined;\n }\n\n const bufferData = this._buffers[bufferView.buffer]?.resolvedBuffer;\n if (!bufferData)\n return undefined;\n\n assert(undefined !== bufferView.byteLength); // required by spec; TypeScript interface is wrong.\n const byteOffset = bufferView.byteOffset ?? 0;\n\n const subarray = bufferData.slice(byteOffset, byteOffset + bufferView.byteLength);\n switch(type){\n case \"INT8\":\n return new Int8Array(subarray.buffer, 0, bufferView.byteLength);\n case \"UINT8\":\n return new Uint8Array(subarray.buffer, 0, bufferView.byteLength);\n case \"INT16\":\n return new Int16Array(subarray.buffer, 0, bufferView.byteLength / 2);\n case \"UINT16\":\n return new Uint16Array(subarray.buffer, 0, bufferView.byteLength / 2);\n case \"INT32\":\n return new Int32Array(subarray.buffer, 0, bufferView.byteLength / 4);\n case \"UINT32\":\n return new Uint32Array(subarray.buffer, 0, bufferView.byteLength / 4);\n case \"INT64\":\n return new BigInt64Array(subarray.buffer, 0, bufferView.byteLength / 8);\n case \"UINT64\":\n return new BigUint64Array(subarray.buffer, 0, bufferView.byteLength / 8);\n case \"FLOAT32\":\n return new Float32Array(subarray.buffer, 0, bufferView.byteLength / 4);\n case \"FLOAT64\":\n return new Float64Array(subarray.buffer, 0, bufferView.byteLength / 8);\n }\n return undefined;\n }\n\n private getGltfStructuralMetadataPropertyValues(property: GltfStructuralMetadata.PropertyTableProperty, classProperty: GltfStructuralMetadata.ClassProperty, count: number){\n // Not supported for now\n if(classProperty.type === \"ENUM\" || classProperty.type === \"BOOLEAN\"){\n return undefined;\n }\n\n let getPropertyValue: any;\n\n if(classProperty.type === \"STRING\" && property.stringOffsets){\n\n const stringValues = this.getGltfStructuralMetadataBuffer(property.values, \"UINT8\") as Uint8Array;\n if(!stringValues){\n return undefined;\n }\n\n const stringOffsets = this.getGltfStructuralMetadataBuffer(property.stringOffsets, \"UINT32\") as Uint32Array;\n if(!stringOffsets){\n return undefined;\n }\n\n getPropertyValue = (index: number) => {\n const begin = stringOffsets[index];\n const end = stringOffsets[index+1];\n return utf8ToString(stringValues.subarray(begin, end));\n };\n } else {\n\n if(!classProperty.componentType){\n return undefined;\n }\n\n let numComponents = -1;\n switch(classProperty.type){\n case \"SCALAR\":\n numComponents = 1;\n break;\n case \"VEC2\":\n numComponents = 2;\n break;\n case \"VEC3\":\n numComponents = 3;\n break;\n case \"VEC4\":\n numComponents = 4;\n break;\n case \"MAT2\":\n numComponents = 4;\n break;\n case \"MAT3\":\n numComponents = 9;\n break;\n case \"MAT4\":\n numComponents = 16;\n break;\n }\n\n if(numComponents === -1){\n return undefined;\n }\n\n const values = this.getGltfStructuralMetadataBuffer(property.values, classProperty.componentType);\n if(!values){\n return undefined;\n }\n\n if(numComponents === 1){\n getPropertyValue = (index: number) => {\n return values[index];\n };\n } else {\n getPropertyValue = (index: number) => {\n const result = [];\n for(let i = 0; i < numComponents; i++){\n result.push(values[index * numComponents + i]);\n }\n return result;\n };\n }\n }\n\n const propertyValues: any[] = [];\n for(let i = 0; i < count; i++){\n const value = getPropertyValue(i);\n const propertyValue = (typeof value === \"bigint\" ) ? value.toString() : value;\n if(!classProperty.noData || propertyValue !== classProperty.noData){\n propertyValues.push(propertyValue);\n } else{\n propertyValues.push(undefined);\n }\n }\n\n return propertyValues;\n }\n\n private readGltfStructuralMetadata(){\n const propertyTables = this._glTF.extensions?.EXT_structural_metadata?.propertyTables;\n const schema = this._glTF.extensions?.EXT_structural_metadata?.schema;\n\n if(propertyTables && schema && schema.classes){\n\n this._structuralMetadata = { tables: [] };\n\n for(const propertyTable of propertyTables){\n if(!propertyTable.properties || !schema.classes){\n continue;\n }\n\n const propertyTableSchema = schema.classes[propertyTable.class];\n if(!propertyTableSchema || !propertyTableSchema.properties){\n continue;\n }\n\n const structuralMetadataTable: StructuralMetadataTable = {\n name: propertyTableSchema.name ?? propertyTable.class,\n entries: [],\n };\n\n for (const [propertyName, property] of Object.entries(propertyTable.properties)){\n\n const propertySchema = propertyTableSchema.properties[propertyName];\n\n if(!property || !propertySchema){\n continue;\n }\n\n const propertyValues = this.getGltfStructuralMetadataPropertyValues(property, propertySchema, propertyTable.count);\n\n if(!propertyValues){\n continue;\n }\n\n structuralMetadataTable.entries.push({\n name: propertySchema.name ?? propertyName,\n values: propertyValues,\n });\n }\n this._structuralMetadata.tables.push(structuralMetadataTable);\n }\n }\n }\n\n public async readTemplate(): Promise<GltfTemplateResult> {\n await this.resolveResources();\n this.readGltfStructuralMetadata();\n return this.readGltfAndCreateTemplate(this._isLeaf, this._featureTable, this._contentRange, true, this._transform);\n }\n\n public async read(): Promise<GltfReaderResult> {\n const result = await this.readTemplate();\n return templateToGraphicResult(result, this._system);\n }\n\n public get structuralMetadata(): StructuralMetadata | undefined { return this._structuralMetadata; }\n public get nodes(): GltfDictionary<GltfNode> { return this._nodes; }\n public get scenes(): GltfDictionary<GltfScene> { return this._glTF.scenes ?? emptyDict; }\n public get sceneNodes(): GltfId[] { return this._sceneNodes; }\n public get textures(): GltfDictionary<GltfTexture> { return this._textures; }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"GltfReader.js","sourceRoot":"","sources":["../../../src/tile/GltfReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Tiles\n */\n\nimport {\n assert, ByteStream, compareBooleans, compareNumbers, compareStrings, Dictionary, expectDefined, JsonUtils, Logger, ProcessDetector, utf8ToString,\n} from \"@itwin/core-bentley\";\nimport {\n Angle, IndexedPolyface, Matrix3d, Point2d, Point3d, Point4d, Range2d, Range3d, Transform, Vector3d,\n} from \"@itwin/core-geometry\";\nimport {\n AxisAlignedBox3d, BatchType, ColorDef, EdgeAppearanceOverrides, ElementAlignedBox3d, Feature, FeatureIndex, FeatureIndexType, FeatureTable, FillFlags, GlbHeader, ImageSource, LinePixels, MeshEdge,\n MeshEdges, MeshPolyline, MeshPolylineList, OctEncodedNormal, OctEncodedNormalPair, PackedFeatureTable, QParams2d, QParams3d, QPoint2dList,\n QPoint3dList, Quantization, RenderMaterial, RenderMode, RenderTexture, TextureMapping, TextureTransparency, TileFormat, TileReadStatus, ViewFlagOverrides,\n} from \"@itwin/core-common\";\nimport { IModelConnection } from \"../IModelConnection\";\nimport { IModelApp } from \"../IModelApp\";\nimport { InstancedGraphicParams } from \"../common/render/InstancedGraphicParams\";\nimport { RealityMeshParams } from \"../render/RealityMeshParams\";\nimport { Mesh } from \"../common/internal/render/MeshPrimitives\";\nimport { Triangle } from \"../common/internal/render/Primitives\";\nimport { RenderGraphic } from \"../render/RenderGraphic\";\nimport { RenderSystem } from \"../render/RenderSystem\";\nimport { BatchedTileIdMap, decodeMeshoptBuffer, RealityTileGeometry,TileContent } from \"./internal\";\nimport type { DracoLoader, DracoMesh } from \"@loaders.gl/draco\";\nimport { CreateRenderMaterialArgs } from \"../render/CreateRenderMaterialArgs\";\nimport { DisplayParams } from \"../common/internal/render/DisplayParams\";\nimport { FrontendLoggerCategory } from \"../common/FrontendLoggerCategory\";\nimport { getImageSourceFormatForMimeType, imageBitmapFromImageSource, imageElementFromImageSource, tryImageElementFromUrl } from \"../common/ImageUtil\";\nimport { MeshPrimitiveType } from \"../common/internal/render/MeshPrimitive\";\nimport { PointCloudArgs } from \"../common/internal/render/PointCloudPrimitive\";\nimport { TextureImageSource } from \"../common/render/TextureParams\";\nimport {\n DracoMeshCompression, getGltfNodeMeshIds, Gltf2Node, GltfAccessor, GltfBuffer, GltfBufferViewProps, GltfDataType, GltfDictionary, gltfDictionaryIterator, GltfDocument, GltfId,\n GltfImage, GltfMaterial, GltfMesh, GltfMeshMode, GltfMeshPrimitive, GltfNode, GltfSampler, GltfScene, GltfStructuralMetadata, GltfTechniqueState, GltfTexture, GltfWrapMode, isGltf1Material, traverseGltfNodes,\n} from \"../common/gltf/GltfSchema\";\nimport { PickableGraphicOptions } from \"../common/render/BatchOptions\";\nimport { createGraphicTemplate, GraphicTemplateBatch, GraphicTemplateBranch, GraphicTemplateNode } from \"../internal/render/GraphicTemplateImpl\";\nimport { RenderGeometry } from \"../internal/render/RenderGeometry\";\nimport { GraphicTemplate } from \"../render/GraphicTemplate\";\nimport { LayerTileData } from \"../internal/render/webgl/MapLayerParams\";\nimport { compactEdgeIterator } from \"../common/imdl/CompactEdges\";\nimport { MeshPolylineGroup } from \"@itwin/core-common/lib/cjs/internal/RenderMesh\";\n\n/** @internal */\nexport type GltfDataBuffer = Uint8Array | Uint16Array | Uint32Array | Float32Array | Int8Array;\n\n/**\n * A chunk of binary data exposed as a typed array.\n * The count member indicates how many elements exist. This may be less than this.buffer.length due to padding added to the\n * binary stream to ensure correct alignment.\n * @internal\n */\nexport class GltfBufferData {\n public readonly buffer: GltfDataBuffer;\n public readonly count: number;\n\n public constructor(buffer: GltfDataBuffer, count: number) {\n this.buffer = buffer;\n this.count = count;\n }\n\n /**\n * Create a GltfBufferData of the desired type. The actual type may differ from the desired type - for example, small 32-bit integers\n * may be represented as 8-bit or 16-bit integers instead.\n * If the actual data type is not convertible to the desired type, this function returns undefined.\n */\n public static create(bytes: Uint8Array, actualType: GltfDataType, expectedType: GltfDataType, count: number): GltfBufferData | undefined {\n if (expectedType !== actualType) {\n // Some data is stored in smaller data types to save space if no values exceed the maximum of the smaller type.\n switch (expectedType) {\n case GltfDataType.Float:\n case GltfDataType.UnsignedByte:\n case GltfDataType.SignedByte:\n return undefined;\n case GltfDataType.UnsignedShort:\n if (GltfDataType.UnsignedByte !== actualType)\n return undefined;\n break;\n case GltfDataType.UInt32:\n if (GltfDataType.UnsignedByte !== actualType && GltfDataType.UnsignedShort !== actualType)\n return undefined;\n break;\n }\n }\n\n const data = this.createDataBuffer(bytes, actualType);\n return undefined !== data ? new GltfBufferData(data, count) : undefined;\n }\n\n private static createDataBuffer(bytes: Uint8Array, actualType: GltfDataType): GltfDataBuffer | undefined {\n // NB: Endianness of typed array data is determined by the 'platform byte order'. Actual data is always little-endian.\n // We are assuming little-endian platform. If we find a big-endian platform, we'll need to use a DataView instead.\n switch (actualType) {\n case GltfDataType.UnsignedByte:\n return bytes;\n case GltfDataType.SignedByte:\n return new Int8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n case GltfDataType.UnsignedShort:\n return new Uint16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 2);\n case GltfDataType.UInt32:\n return new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);\n case GltfDataType.Float:\n return new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);\n default:\n return undefined;\n }\n }\n}\n\n/**\n * A view of a chunk of glTF binary data containing an array of elements of a specific data type.\n * The count member indicates how many elements exist; this may be smaller than this.data.length.\n * The count member may also indicate the number of elements of a type containing more than one value of the\n * underlying type. For example, a buffer of 4 32-bit floating point 'vec2' elements will have a count of 4,\n * but its data member will contain 8 32-bit floating point values (2 per vec2).\n * The accessor member may contain additional JSON data specific to a particular buffer.\n * @internal\n */\nclass GltfBufferView {\n public readonly data: Uint8Array;\n public readonly count: number;\n public readonly type: GltfDataType;\n public readonly accessor: GltfAccessor;\n public readonly stride: number;\n\n public get byteLength(): number { return this.data.length; }\n\n public constructor(data: Uint8Array, count: number, type: GltfDataType, accessor: GltfAccessor, stride: number) {\n this.data = data;\n this.count = count;\n this.type = type;\n this.accessor = accessor;\n this.stride = stride;\n }\n\n public toBufferData(desiredType: GltfDataType): GltfBufferData | undefined {\n return GltfBufferData.create(this.data, this.type, desiredType, this.count);\n }\n}\n\n/** The result of [[GltfReader.read]].\n * @internal\n */\nexport interface GltfReaderResult extends TileContent {\n readStatus: TileReadStatus;\n range?: AxisAlignedBox3d;\n copyright?: string;\n}\n\ntype GltfTemplateResult = Omit<GltfReaderResult, \"graphic\"> & { template?: GraphicTemplate };\n\nfunction templateToGraphicResult(result: GltfTemplateResult, system: RenderSystem): GltfReaderResult {\n const template = result.template;\n delete result.template;\n return {\n ...result,\n graphic: template ? system.createGraphicFromTemplate({ template }) : undefined,\n };\n}\n\n/** Data required for creating a [[GltfReader]] capable of deserializing [glTF](https://www.khronos.org/gltf/).\n * @internal\n */\nexport class GltfReaderProps {\n public readonly version: number;\n public readonly glTF: GltfDocument;\n public readonly yAxisUp: boolean;\n public readonly binaryData?: Uint8Array;\n public readonly baseUrl?: URL;\n\n private constructor(glTF: GltfDocument, version: number, yAxisUp: boolean, binaryData: Uint8Array | undefined, baseUrl?: URL | undefined) {\n this.version = version;\n this.glTF = glTF;\n this.binaryData = binaryData;\n this.yAxisUp = yAxisUp;\n this.baseUrl = baseUrl;\n }\n\n /** Attempt to construct a new GltfReaderProps from the binary data beginning at the supplied stream's current read position. */\n public static create(source: Uint8Array | GltfDocument, yAxisUp: boolean = false, baseUrl?: URL): GltfReaderProps | undefined {\n let version: number;\n let json: GltfDocument;\n let binaryData: Uint8Array | undefined;\n\n if (source instanceof Uint8Array) {\n // It may be JSON - check for magic indicating glb.\n const buffer = ByteStream.fromUint8Array(source);\n if (TileFormat.Gltf !== buffer.readUint32()) {\n try {\n const utf8Json = utf8ToString(source);\n if (!utf8Json)\n return undefined;\n\n json = JSON.parse(utf8Json);\n version = 2;\n } catch {\n return undefined;\n }\n } else {\n buffer.reset();\n const header = new GlbHeader(buffer);\n if (!header.isValid)\n return undefined;\n\n version = header.version;\n if (header.binaryChunk)\n binaryData = new Uint8Array(source.buffer, source.byteOffset + header.binaryChunk.offset, header.binaryChunk.length);\n\n try {\n const jsonBytes = new Uint8Array(source.buffer, source.byteOffset + header.jsonChunk.offset, header.jsonChunk.length);\n const jsonStr = utf8ToString(jsonBytes);\n if (undefined === jsonStr)\n return undefined;\n\n json = JSON.parse(jsonStr);\n } catch {\n return undefined;\n }\n }\n } else {\n version = 2; // ###TODO verify against source.asset?.version\n json = source;\n }\n\n // asset is required in glTF 2, optional in glTF 1\n const asset = JsonUtils.asObject(json.asset);\n if (version === 2 && !asset)\n return undefined;\n\n const glTF: GltfDocument = {\n asset,\n scene: JsonUtils.asString(json.scene),\n extensions: JsonUtils.asObject(json.extensions),\n extensionsUsed: JsonUtils.asArray(json.extensionsUsed),\n extensionsRequired: JsonUtils.asArray(json.extensionsRequired),\n accessors: JsonUtils.asObject(json.accessors),\n buffers: JsonUtils.asObject(json.buffers),\n bufferViews: JsonUtils.asObject(json.bufferViews),\n images: JsonUtils.asObject(json.images),\n materials: JsonUtils.asObject(json.materials),\n meshes: JsonUtils.asObject(json.meshes),\n nodes: JsonUtils.asObject(json.nodes),\n samplers: JsonUtils.asObject(json.samplers),\n scenes: JsonUtils.asObject(json.scenes),\n textures: JsonUtils.asObject(json.textures),\n techniques: JsonUtils.asObject(json.techniques),\n };\n\n return glTF.meshes ? new GltfReaderProps(glTF, version, yAxisUp, binaryData, baseUrl) : undefined;\n }\n}\n\n/** The GltfMeshData contains the raw GLTF mesh data. If the data is suitable to create a [[RealityMesh]] directly, basically in the quantized format produced by\n * ContextCapture, then a RealityMesh is created directly from this data. Otherwise, the mesh primitive is populated from the raw data and a MeshPrimitive\n * is generated. The MeshPrimitve path is much less efficient but should be rarely used.\n *\n * @internal\n */\nexport class GltfMeshData {\n public primitive: Mesh; // Populated with vertex and indices only if the mesh cannot be represented as [[RealityMesh]]\n public pointQParams?: QParams3d;\n public points?: Uint16Array;\n public pointRange?: Range3d;\n public normals?: Uint16Array;\n public uvQParams?: QParams2d;\n public uvs?: Uint16Array;\n public uvRange?: Range2d;\n public indices?: Uint8Array | Uint16Array | Uint32Array;\n public readonly type = \"mesh\" as const;\n\n public constructor(props: Mesh) {\n this.primitive = props;\n }\n}\n\ninterface GltfPointCloud extends PointCloudArgs {\n readonly type: \"pointcloud\";\n pointRange: Range3d;\n}\n\ntype GltfPrimitiveData = GltfMeshData | GltfPointCloud;\n\n/** A function that returns true if deserialization of the data supplied by the reader should abort.\n * @internal\n */\nexport type ShouldAbortReadGltf = (reader: GltfReader) => boolean;\n\nconst emptyDict = { };\n\nfunction colorFromJson(values: number[]): ColorDef {\n return ColorDef.from(values[0] * 255, values[1] * 255, values[2] * 255, (1.0 - values[3]) * 255);\n}\n\nfunction colorFromMaterial(material: GltfMaterial, isTransparent: boolean): ColorDef {\n let color = ColorDef.white;\n if (isGltf1Material(material)) {\n if (material.values?.color && Array.isArray(material.values.color))\n color = colorFromJson(material.values.color);\n } else if (material.extensions?.KHR_techniques_webgl?.values?.u_color) {\n color = colorFromJson(material.extensions.KHR_techniques_webgl.values.u_color);\n } else if (material.pbrMetallicRoughness?.baseColorFactor) {\n color = colorFromJson(material.pbrMetallicRoughness.baseColorFactor);\n }\n\n // SPEC: Opaque materials ignore any alpha channel.\n if (!isTransparent)\n color = color.withTransparency(0);\n\n return color;\n}\n\nfunction trsMatrix(translation: [number, number, number] | undefined, rotation: [number, number, number, number] | undefined, scale: [number, number, number] | undefined, result?: Transform): Transform {\n // SPEC: To compose the local transformation matrix, TRS properties MUST be converted to matrices and postmultiplied in the T * R * S order;\n // first the scale is applied to the vertices, then the rotation, and then the translation.\n const scaleTf = Transform.createRefs(undefined, scale ? Matrix3d.createScale(scale[0], scale[1], scale[2]) : Matrix3d.identity);\n const rotTf = Transform.createRefs(undefined, rotation ? Matrix3d.createFromQuaternion(Point4d.create(rotation[0], rotation[1], rotation[2], rotation[3])) : Matrix3d.identity);\n rotTf.matrix.transposeInPlace(); // See comment on Matrix3d.createFromQuaternion\n const transTf = Transform.createTranslation(translation ? new Point3d(translation[0], translation[1], translation[2]) : Point3d.createZero());\n const tf = rotTf.multiplyTransformTransform(scaleTf, result);\n transTf.multiplyTransformTransform(tf, tf);\n return tf;\n}\n\nclass TransformStack {\n private readonly _stack: Array<Transform | undefined> = [];\n\n public constructor(transform?: Transform) {\n if (transform)\n this._stack.push(transform);\n }\n\n public get transform(): Transform | undefined {\n return this._stack.length > 0 ? this._stack[this._stack.length - 1] : undefined;\n }\n\n public get isEmpty(): boolean {\n return 0 === this._stack.length;\n }\n\n public push(node: GltfNode): void {\n let nodeTransform;\n if (node.matrix) {\n const origin = Point3d.create(node.matrix[12], node.matrix[13], node.matrix[14]);\n const matrix = Matrix3d.createRowValues(\n node.matrix[0], node.matrix[4], node.matrix[8],\n node.matrix[1], node.matrix[5], node.matrix[9],\n node.matrix[2], node.matrix[6], node.matrix[10],\n );\n\n nodeTransform = Transform.createOriginAndMatrix(origin, matrix);\n } else if (node.rotation || node.scale || node.translation) {\n nodeTransform = trsMatrix(node.translation, node.rotation, node.scale);\n }\n\n const top = this.transform;\n if (!top)\n this._stack.push(nodeTransform);\n else\n this._stack.push(nodeTransform ? top.multiplyTransformTransform(nodeTransform) : top);\n }\n\n public pop(): void {\n assert(this._stack.length > 0);\n this._stack.pop();\n }\n}\n\n/** Arguments to [[GltfReader]] constructor.\n * @internal\n */\nexport interface GltfReaderArgs {\n /** Properties of the glTF source. */\n props: GltfReaderProps;\n /** The iModel with which the graphics are to be associated. */\n iModel: IModelConnection;\n /** If true, create 2d graphics. */\n is2d?: boolean;\n /** The render system that will produce the graphics. Defaults to [[IModelApp.renderSystem]]. */\n system?: RenderSystem;\n /** The type of batch to create. Defaults to [BatchType.Primary]($common).\n * @see [[RenderSystem.createBatch]].\n */\n type?: BatchType;\n /** An optional function that, if supplied, is invoked periodically to determine if the process of producing graphics from the glTF should terminate early. */\n shouldAbort?: ShouldAbortReadGltf;\n /** If true, each vertex in the graphics should belong to exactly one triangle. This is less efficient than sharing vertices between adjoining triangles, but\n * sometimes required - for example, for [ViewFlags.wiremesh]($common).\n */\n deduplicateVertices?: boolean;\n /** If true, the graphics produced will always use a [[VertexTable]]; otherwise, where possible a [[RealityMeshParams]] will be used instead.\n * Reality meshes are simpler but do not support some features like lighting.\n */\n vertexTableRequired?: boolean;\n /** A table structure to store the Gltf structural metadata if present.\n */\n idMap?: BatchedTileIdMap;\n}\n\ninterface TextureKey {\n readonly id: GltfId;\n readonly isTransparent: boolean;\n}\n\nfunction compareTextureKeys(lhs: TextureKey, rhs: TextureKey): number {\n const cmp = compareBooleans(lhs.isTransparent, rhs.isTransparent);\n if (0 !== cmp)\n return cmp;\n\n assert(typeof lhs.id === typeof rhs.id);\n if (\"string\" === typeof lhs.id) {\n assert(\"string\" === typeof rhs.id);\n return compareStrings(lhs.id, rhs.id);\n }\n\n assert(\"number\" === typeof lhs.id && \"number\" === typeof rhs.id);\n return compareNumbers(lhs.id, rhs.id);\n}\n\ninterface StructuralMetadataTableEntries{\n name: string;\n values: any[];\n};\n\ninterface StructuralMetadataTable{\n name: string;\n entries: StructuralMetadataTableEntries[];\n};\n\ninterface StructuralMetadata{\n tables: StructuralMetadataTable[];\n}\n\n/** @internal exported strictly for testing */\nexport function getMeshPrimitives(mesh: GltfMesh | undefined): GltfMeshPrimitive[] | undefined {\n const ext = mesh?.extensions?.EXT_mesh_primitive_restart;\n const meshPrimitives = mesh?.primitives;\n if (!meshPrimitives || meshPrimitives.length === 0 || !ext?.primitiveGroups || ext.primitiveGroups.length === 0) {\n return meshPrimitives;\n }\n\n // Note: per the spec, any violation of the extension's specification should cause us to fall back to mesh.primitives, if detecting the violation is feasible.\n\n // Start with a copy of mesh.primitives. For each group, replace the first primitive in the group with a primitive representing the entire group,\n // and set the rest of the primitives in the group to `undefined`.\n // This allows us to identify which remaining primitives do not use primitive restart, and any errors involving a primitive appearing in more than one group.\n const primitives: Array<GltfMeshPrimitive | undefined> = [...meshPrimitives];\n for (const group of ext.primitiveGroups) {\n // Spec: the group must not be empty and all indices must be valid array indices into mesh.primitives.\n const firstPrimitiveIndex = group.primitives[0];\n if (undefined === firstPrimitiveIndex || !meshPrimitives[firstPrimitiveIndex]) {\n return meshPrimitives;\n }\n\n const primitive = { ...meshPrimitives[firstPrimitiveIndex], indices: group.indices };\n\n // Spec: primitive restart only supported for these topologies.\n switch (primitive.mode) {\n case GltfMeshMode.TriangleFan:\n case GltfMeshMode.TriangleStrip:\n case GltfMeshMode.LineStrip:\n case GltfMeshMode.LineLoop:\n break;\n default:\n return meshPrimitives;\n }\n\n\n for (const primitiveIndex of group.primitives) {\n const thisPrimitive = primitives[primitiveIndex];\n\n // Spec: all primitives must use indexed geometry and a given primitive may appear in at most one group.\n // Spec: all primitives must have same topology.\n if (undefined === thisPrimitive?.indices || thisPrimitive.mode !== primitive.mode) {\n return meshPrimitives;\n }\n\n primitives[primitiveIndex] = undefined;\n }\n\n primitives[firstPrimitiveIndex] = primitive;\n }\n\n return primitives.filter((x) => x !== undefined);\n}\n\n/** Deserializes [glTF](https://www.khronos.org/gltf/).\n * @internal\n */\nexport abstract class GltfReader {\n protected readonly _glTF: GltfDocument;\n protected readonly _version: number;\n protected readonly _iModel: IModelConnection;\n protected readonly _is3d: boolean;\n protected readonly _system: RenderSystem;\n protected readonly _returnToCenter?: Point3d;\n protected readonly _yAxisUp: boolean;\n protected readonly _baseUrl?: URL;\n protected readonly _type: BatchType;\n protected readonly _deduplicateVertices: boolean;\n protected readonly _vertexTableRequired: boolean;\n private readonly _canceled?: ShouldAbortReadGltf;\n protected readonly _sceneNodes: GltfId[];\n protected _computedContentRange?: ElementAlignedBox3d;\n private readonly _resolvedTextures = new Dictionary<TextureKey, RenderTexture | false>((lhs, rhs) => compareTextureKeys(lhs, rhs));\n private readonly _dracoMeshes = new Map<DracoMeshCompression, DracoMesh>();\n private _containsPointCloud = false;\n protected _instanceFeatures: Feature[] = [];\n protected _meshFeatures: Feature[] = [];\n protected _instanceElementIdToFeatureId: Map<string, number> = new Map<string, number>();\n protected _meshElementIdToFeatureIndex: Map<string, number> = new Map<string, number>();\n protected _structuralMetadata?: StructuralMetadata;\n protected readonly _idMap?: BatchedTileIdMap;\n private _tileData?: LayerTileData | undefined;\n\n protected get _nodes(): GltfDictionary<GltfNode> { return this._glTF.nodes ?? emptyDict; }\n protected get _meshes(): GltfDictionary<GltfMesh> { return this._glTF.meshes ?? emptyDict; }\n protected get _accessors(): GltfDictionary<GltfAccessor> { return this._glTF.accessors ?? emptyDict; }\n protected get _bufferViews(): GltfDictionary<GltfBufferViewProps & { resolvedBuffer?: Uint8Array }> { return this._glTF.bufferViews ?? emptyDict; }\n protected get _materials(): GltfDictionary<GltfMaterial> { return this._glTF.materials ?? emptyDict; }\n protected get _samplers(): GltfDictionary<GltfSampler> { return this._glTF.samplers ?? emptyDict; }\n protected get _textures(): GltfDictionary<GltfTexture> { return this._glTF.textures ?? emptyDict; }\n\n protected get _images(): GltfDictionary<GltfImage & { resolvedImage?: TextureImageSource }> { return this._glTF.images ?? emptyDict; }\n protected get _buffers(): GltfDictionary<GltfBuffer & { resolvedBuffer?: Uint8Array }> { return this._glTF.buffers ?? emptyDict; }\n\n /** Asynchronously deserialize the tile data and return the result. */\n public abstract read(): Promise<GltfReaderResult>;\n\n protected get _isCanceled(): boolean { return undefined !== this._canceled && this._canceled(this); }\n protected get _isVolumeClassifier(): boolean { return BatchType.VolumeClassifier === this._type; }\n\n /** Traverse the nodes specified by their Ids, recursing into their child nodes.\n * @param nodeIds The Ids of the nodes to traverse.\n * @throws Error if a node appears more than once during traversal\n */\n public traverseNodes(nodeIds: Iterable<GltfId>): Iterable<GltfNode> {\n return traverseGltfNodes(nodeIds, this._nodes, new Set<GltfId>());\n }\n\n /** Traverse the nodes specified by their scene, recursing into their child nodes.\n * @throws Error if a node appears more than once during traversal\n */\n public traverseScene(): Iterable<GltfNode> {\n return this.traverseNodes(this._sceneNodes);\n }\n\n protected get viewFlagOverrides(): ViewFlagOverrides | undefined {\n return undefined;\n }\n\n private getTileTransform(transformToRoot?: Transform, pseudoRtcBias?: Vector3d): Transform | undefined {\n let transform;\n\n if (this._returnToCenter || pseudoRtcBias || this._yAxisUp || transformToRoot) {\n if (this._returnToCenter)\n transform = Transform.createTranslation(this._returnToCenter.clone());\n else if (pseudoRtcBias)\n transform = Transform.createTranslationXYZ(pseudoRtcBias.x, pseudoRtcBias.y, pseudoRtcBias.z);\n else\n transform = Transform.createIdentity();\n\n if (this._yAxisUp)\n transform = transform.multiplyTransformMatrix3d(Matrix3d.createRotationAroundVector(Vector3d.create(1.0, 0.0, 0.0), Angle.createRadians(Angle.piOver2Radians)) as Matrix3d);\n\n if (transformToRoot)\n transform = transformToRoot.multiplyTransformTransform(transform);\n }\n\n return transform;\n }\n\n protected readGltfAndCreateGraphics(isLeaf: boolean, featureTable: FeatureTable | undefined, contentRange: ElementAlignedBox3d | undefined, transformToRoot?: Transform, pseudoRtcBias?: Vector3d, instances?: InstancedGraphicParams): GltfReaderResult {\n const result = this.readGltfAndCreateTemplate(isLeaf, featureTable, contentRange, true, transformToRoot, pseudoRtcBias, instances);\n return templateToGraphicResult(result, this._system);\n }\n\n protected readGltfAndCreateTemplate(isLeaf: boolean, featureTable: FeatureTable | undefined, contentRange: ElementAlignedBox3d | undefined, noDispose: boolean, transformToRoot?: Transform, pseudoRtcBias?: Vector3d, instances?: InstancedGraphicParams): GltfTemplateResult {\n if (this._isCanceled)\n return { readStatus: TileReadStatus.Canceled, isLeaf };\n\n // If contentRange was not supplied, we will compute it as we read the meshes.\n if (!contentRange)\n this._computedContentRange = contentRange = Range3d.createNull();\n else\n this._computedContentRange = undefined;\n\n // Save feature table model id in case we need to recreate it after reading instances\n const featureTableModelId = featureTable?.modelId;\n // Flush feature table if instance features are used\n if(this._structuralMetadata && this._glTF.extensionsUsed?.includes(\"EXT_instance_features\") && this._idMap){\n featureTable = undefined;\n }\n\n // ###TODO this looks like a hack? Why does it assume the first node's transform is special, or that the transform will be specified as a matrix instead of translation+rot+scale?\n if (this._returnToCenter || this._nodes[0]?.matrix || (pseudoRtcBias && pseudoRtcBias.magnitude() < 1.0E5))\n pseudoRtcBias = undefined;\n\n const transformStack = new TransformStack();\n const templateNodes: GraphicTemplateNode[] = [];\n let readStatus: TileReadStatus = TileReadStatus.InvalidTileData;\n for (const nodeKey of this._sceneNodes) {\n assert(transformStack.isEmpty);\n const node = this._nodes[nodeKey];\n if (node && TileReadStatus.Success !== (readStatus = this.readTemplateNodes(templateNodes, node, featureTable, transformStack, instances, pseudoRtcBias)))\n return { readStatus, isLeaf };\n }\n\n // Creates a feature table based on instance features\n // The table must be created after reading instances, since the maximum number of features is not known until all instances have been read.\n if(this._instanceFeatures.length > 0 && this._idMap){\n featureTable = new FeatureTable(this._instanceFeatures.length, featureTableModelId);\n for(let instanceFeatureId = 0; instanceFeatureId < this._instanceFeatures.length; instanceFeatureId++){\n featureTable.insertWithIndex(this._instanceFeatures[instanceFeatureId], instanceFeatureId);\n }\n }\n\n if(this._meshFeatures.length > 0 && this._idMap){\n featureTable = new FeatureTable(this._meshFeatures.length, featureTableModelId);\n for(let meshFeatureId = 0; meshFeatureId < this._meshFeatures.length; meshFeatureId++){\n featureTable.insertWithIndex(this._meshFeatures[meshFeatureId], meshFeatureId);\n }\n }\n\n if (0 === templateNodes.length)\n return { readStatus: TileReadStatus.InvalidTileData, isLeaf };\n\n // Compute range in tileset/world space.\n let range = contentRange;\n const transform = this.getTileTransform(transformToRoot, pseudoRtcBias);\n const invTransform = transform?.inverse();\n if (invTransform)\n range = invTransform.multiplyRange(contentRange);\n\n // The batch range needs to be in tile coordinate space.\n // If we computed the content range ourselves, it's already in tile space.\n // If the content range was supplied by the caller, it's in tileset space and needs to be transformed to tile space.\n const batch: GraphicTemplateBatch | undefined = !featureTable ? undefined : {\n featureTable: PackedFeatureTable.pack(featureTable),\n range: this._computedContentRange ? contentRange : range,\n };\n\n const viewFlagOverrides = this.viewFlagOverrides;\n const branch: GraphicTemplateBranch | undefined = transform || viewFlagOverrides ? { transform, viewFlagOverrides } : undefined;\n\n return {\n readStatus,\n isLeaf,\n contentRange,\n range,\n copyright: this._glTF.asset?.copyright,\n containsPointCloud: this._containsPointCloud,\n template: createGraphicTemplate({\n nodes: templateNodes,\n batch,\n branch,\n noDispose,\n }),\n };\n }\n\n public readGltfAndCreateGeometry(transformToRoot?: Transform, needNormals = false, needParams = false): RealityTileGeometry {\n const transformStack = new TransformStack(this.getTileTransform(transformToRoot));\n const polyfaces: IndexedPolyface[] = [];\n for (const nodeKey of this._sceneNodes) {\n const node = this._nodes[nodeKey];\n if (node)\n this.readNodeAndCreatePolyfaces(polyfaces, node, transformStack, needNormals, needParams);\n }\n\n return { polyfaces };\n }\n\n private geometryFromMeshData(gltfMesh: GltfPrimitiveData, isInstanced: boolean): RenderGeometry | undefined {\n if (\"pointcloud\" === gltfMesh.type)\n return this._system.createPointCloudGeometry(gltfMesh);\n\n if (!gltfMesh.points || !gltfMesh.pointRange)\n return this._system.createGeometryFromMesh(gltfMesh.primitive, undefined);\n\n let realityMeshPrimitive = (this._vertexTableRequired || isInstanced) ? undefined : RealityMeshParams.fromGltfMesh(gltfMesh);\n if (realityMeshPrimitive && this._tileData) {\n\n realityMeshPrimitive = {\n ...realityMeshPrimitive,\n tileData: this._tileData,\n };\n }\n\n if (realityMeshPrimitive) {\n const realityMesh = this._system.createRealityMeshGeometry(realityMeshPrimitive);\n if (realityMesh)\n return realityMesh;\n }\n\n const mesh = gltfMesh.primitive;\n const pointCount = gltfMesh.points.length / 3;\n assert(mesh.points instanceof QPoint3dList);\n mesh.points.fromTypedArray(gltfMesh.pointRange, gltfMesh.points);\n if (mesh.triangles && gltfMesh.indices)\n mesh.triangles.addFromTypedArray(gltfMesh.indices);\n\n if (gltfMesh.uvs && gltfMesh.uvRange && gltfMesh.uvQParams) {\n /** This is ugly and inefficient... unnecessary if Mesh stored uvs as QPoint2dList */\n for (let i = 0, j = 0; i < pointCount; i++)\n mesh.uvParams.push(gltfMesh.uvQParams.unquantize(gltfMesh.uvs[j++], gltfMesh.uvs[j++]));\n }\n\n if (gltfMesh.normals)\n for (const normal of gltfMesh.normals)\n mesh.normals.push(new OctEncodedNormal(normal));\n\n return this._system.createGeometryFromMesh(mesh, undefined, this._tileData,);\n }\n\n private readInstanceAttributes(node: Gltf2Node, featureTable: FeatureTable | undefined): InstancedGraphicParams | undefined {\n const ext = node.extensions?.EXT_mesh_gpu_instancing;\n if (!ext || !ext.attributes) {\n return undefined;\n }\n\n const translationsView = this.getBufferView(ext.attributes, \"TRANSLATION\");\n const translations = translationsView?.toBufferData(GltfDataType.Float);\n const rotations = this.getBufferView(ext.attributes, \"ROTATION\")?.toBufferData(GltfDataType.Float);\n const scales = this.getBufferView(ext.attributes, \"SCALE\")?.toBufferData(GltfDataType.Float);\n\n // All attributes must specify the same count, count must be greater than zero, and at least one attribute must be specified.\n const count = translations?.count ?? rotations?.count ?? scales?.count;\n if (!count || (rotations && rotations.count !== count) || (scales && scales.count !== count)) {\n return undefined;\n }\n\n const transformCenter = new Point3d();\n const trMin = translationsView?.accessor.min;\n const trMax = translationsView?.accessor.max;\n if (trMin && trMax) {\n const half = (idx: number): number => trMin[idx] + (trMax[idx] - trMin[idx]) / 2;\n transformCenter.set(half(0), half(1), half(2));\n }\n\n const getTranslation = (index: number): [number, number, number] | undefined => {\n if (!translations) {\n return undefined;\n }\n\n index *= 3;\n return [\n translations.buffer[index + 0] - transformCenter.x,\n translations.buffer[index + 1] - transformCenter.y,\n translations.buffer[index + 2] - transformCenter.z,\n ];\n };\n\n const getRotation = (index: number): [number, number, number, number] | undefined => {\n index *= 4;\n return rotations ? [rotations.buffer[index], rotations.buffer[index + 1], rotations.buffer[index + 2], rotations.buffer[index + 3]] : undefined;\n };\n\n const getScale = (index: number): [number, number, number] | undefined => {\n index *= 3;\n return scales ? [scales.buffer[index], scales.buffer[index + 1], scales.buffer[index + 2]] : undefined;\n };\n\n const transforms = new Float32Array(3 * 4 * count);\n const transform = Transform.createIdentity();\n for (let i = 0; i < count; i++) {\n const tf = trsMatrix(getTranslation(i), getRotation(i), getScale(i), transform);\n const idx = i * 3 * 4;\n transforms[idx + 0] = tf.matrix.coffs[0];\n transforms[idx + 1] = tf.matrix.coffs[1];\n transforms[idx + 2] = tf.matrix.coffs[2];\n transforms[idx + 3] = tf.origin.x;\n transforms[idx + 4] = tf.matrix.coffs[3];\n transforms[idx + 5] = tf.matrix.coffs[4];\n transforms[idx + 6] = tf.matrix.coffs[5];\n transforms[idx + 7] = tf.origin.y;\n transforms[idx + 8] = tf.matrix.coffs[6];\n transforms[idx + 9] = tf.matrix.coffs[7];\n transforms[idx + 10] = tf.matrix.coffs[8];\n transforms[idx + 11] = tf.origin.z;\n }\n\n let featureIds = ((featureTable && featureTable.isUniform)) ? new Uint8Array(3 * count) : undefined;\n\n // Resolve instance features if the EXT_instance_features if present\n const instanceFeaturesExt = node.extensions?.EXT_instance_features;\n if(this._structuralMetadata && instanceFeaturesExt && this._idMap){\n if(!featureIds)\n featureIds = new Uint8Array(3 * count);\n // Resolve feature buffers before creating instance table\n const featureBuffers = new Map<number, GltfDataBuffer>();\n for(const featureIdDesc of instanceFeaturesExt.featureIds){\n\n if(featureIdDesc.attribute !== undefined){\n const bufferView = this.getBufferView(ext.attributes, `_FEATURE_ID_${ featureIdDesc.attribute}`);\n if(bufferView){\n const bufferData = bufferView.toBufferData(bufferView.type)?.buffer;\n if(bufferData){\n featureBuffers.set(featureIdDesc.attribute, bufferData);\n }\n }\n }\n }\n\n for(let localInstanceId = 0; localInstanceId < count; localInstanceId++){\n\n const instanceProps: any = {};\n for(const featureIdDesc of instanceFeaturesExt.featureIds){\n\n const table = this._structuralMetadata.tables[featureIdDesc.propertyTable];\n instanceProps[table.name] = {};\n // If the attribute is not defined, then the feature id corresponds to the instance id\n if(featureIdDesc.attribute === undefined){\n for(const entries of table.entries){\n if(entries.values[localInstanceId] !== undefined){\n instanceProps[table.name][entries.name] = entries.values[localInstanceId];\n }\n }\n } else if(featureBuffers.has(featureIdDesc.attribute)) {\n const featureBuffer = featureBuffers.get(featureIdDesc.attribute);\n if(!featureBuffer){\n continue;\n }\n const featureId = featureBuffer[localInstanceId];\n\n if(featureIdDesc.nullFeatureId !== undefined && featureId === featureIdDesc.nullFeatureId){\n continue;\n }\n\n for(const entries of table.entries){\n if(entries.values[featureId] !== undefined){\n instanceProps[table.name][entries.name] = entries.values[featureId];\n }\n }\n }\n }\n\n const instanceElementId = this._idMap.getBatchId(instanceProps);\n\n // If the element id is already assigned to a previous instance,\n // reuse the previous feature id to avoid collision in the feature table\n if(!this._instanceElementIdToFeatureId.has(instanceElementId)){\n this._instanceElementIdToFeatureId.set(instanceElementId, this._instanceFeatures.length);\n this._instanceFeatures.push(new Feature(instanceElementId));\n }\n\n // If the map didn't contain instanceElementId, it was inserted above\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const instanceFeatureId = this._instanceElementIdToFeatureId.get(instanceElementId)!;\n featureIds[localInstanceId * 3 + 0] = instanceFeatureId & 0xFF;\n featureIds[localInstanceId * 3 + 1] = (instanceFeatureId >> 8) & 0xFF;\n featureIds[localInstanceId * 3 + 2] = (instanceFeatureId >> 16) & 0xFF;\n }\n }\n\n return { count, transforms, transformCenter, featureIds };\n }\n\n private readTemplateNodes(\n templateNodes: GraphicTemplateNode[],\n node: GltfNode,\n featureTable: FeatureTable | undefined,\n transformStack: TransformStack,\n batchInstances?: InstancedGraphicParams,\n pseudoRtcBias?: Vector3d\n ): TileReadStatus {\n if (undefined === node)\n return TileReadStatus.InvalidTileData;\n\n // IMPORTANT: Do not return without popping this node from the stack.\n transformStack.push(node);\n const thisTransform = transformStack.transform;\n\n const nodeInstances = !batchInstances && undefined !== node.mesh ? this.readInstanceAttributes(node, featureTable) : undefined;\n\n /**\n * This is a workaround for tiles generated by\n * context capture which have a large offset from the tileset origin that exceeds the\n * capacity of 32 bit integers. It is essentially an ad hoc RTC applied at read time only if the tile is far from the\n * origin and there is no RTC supplied either with the B3DM of the GLTF.\n * as the vertices are supplied in a quantized format, applying the RTC bias to\n * quantization origin will make these tiles work correctly.\n */\n let thisBias;\n if (undefined !== pseudoRtcBias)\n thisBias = (undefined === thisTransform) ? pseudoRtcBias : thisTransform.matrix.multiplyInverse(pseudoRtcBias);\n\n for (const meshKey of getGltfNodeMeshIds(node)) {\n const nodeMesh = this._meshes[meshKey];\n if (nodeMesh?.primitives) {\n const meshes = this.readMeshPrimitives(node, featureTable, thisTransform, thisBias, nodeInstances);\n\n if (0 !== meshes.length) {\n const thisList: RenderGeometry[] = [];\n for (const mesh of meshes) {\n const geometry = this.geometryFromMeshData(mesh, !!batchInstances || !!nodeInstances);\n if (undefined !== geometry)\n thisList.push(geometry);\n }\n\n if (0 !== thisList.length) {\n templateNodes.push({\n geometry: thisList,\n transform: thisTransform && !thisTransform.isIdentity ? thisTransform : undefined,\n instances: batchInstances ?? nodeInstances,\n });\n }\n }\n }\n }\n\n if (node.children) {\n for (const childId of node.children) {\n const child = this._nodes[childId];\n if (child)\n this.readTemplateNodes(templateNodes, child, featureTable, transformStack, batchInstances ?? nodeInstances);\n }\n }\n\n transformStack.pop();\n return TileReadStatus.Success;\n }\n\n private readNodeAndCreatePolyfaces(polyfaces: IndexedPolyface[], node: GltfNode, transformStack: TransformStack, needNormals: boolean, needParams: boolean): void {\n // IMPORTANT: Do not return without popping this node from the stack.\n transformStack.push(node);\n const meshes = this.readMeshPrimitives(node);\n\n for (const mesh of meshes) {\n if (mesh.type === \"mesh\") {\n const polyface = this.polyfaceFromGltfMesh(mesh, transformStack.transform, needNormals, needParams);\n if (polyface)\n polyfaces.push(polyface);\n }\n }\n\n if (node.children) {\n for (const childId of node.children) {\n const child = this._nodes[childId];\n if (child)\n this.readNodeAndCreatePolyfaces(polyfaces, child, transformStack, needNormals, needParams);\n }\n }\n }\n\n private polyfaceFromGltfMesh(mesh: GltfMeshData, transform: Transform | undefined , needNormals: boolean, needParams: boolean): IndexedPolyface | undefined {\n if (!mesh.pointQParams || !mesh.points || !mesh.indices)\n return undefined;\n\n const { points, pointQParams, normals, uvs, uvQParams, indices } = mesh;\n\n const includeNormals = needNormals && undefined !== normals;\n const includeParams = needParams && undefined !== uvQParams && undefined !== uvs;\n\n const polyface = IndexedPolyface.create(includeNormals, includeParams);\n for (let i = 0; i < points.length; ) {\n const point = pointQParams.unquantize(points[i++], points[i++], points[i++]);\n if (transform)\n transform.multiplyPoint3d(point, point);\n\n polyface.addPoint(point);\n }\n\n if (includeNormals && normals)\n for (let i = 0; i < normals.length; )\n polyface.addNormal(OctEncodedNormal.decodeValue(normals[i++]));\n\n if (includeParams && uvs && uvQParams)\n for (let i = 0; i < uvs.length; )\n polyface.addParam(uvQParams.unquantize(uvs[i++], uvs[i++]));\n\n let j = 0;\n for (const index of indices) {\n polyface.addPointIndex(index);\n if (includeNormals)\n polyface.addNormalIndex(index);\n\n if (includeParams)\n polyface.addParamIndex(index);\n\n if (0 === (++j % 3))\n polyface.terminateFacet();\n }\n\n return polyface;\n }\n\n // ###TODO what is the actual type of `json`?\n public getBufferView(json: { [k: string]: any }, accessorName: string): GltfBufferView | undefined {\n try {\n const accessorValue = JsonUtils.asString(json[accessorName]);\n const accessor = accessorValue ? this._accessors[accessorValue] : undefined;\n if (!accessor)\n return undefined;\n\n const bufferViewAccessorValue = accessor.bufferView;\n const bufferView = undefined !== bufferViewAccessorValue ? this._bufferViews[bufferViewAccessorValue] : undefined;\n if (!bufferView)\n return undefined;\n\n let bufferData = bufferView.resolvedBuffer;\n if (!bufferData) {\n if (undefined === bufferView.buffer)\n return undefined;\n\n const buffer = this._buffers[bufferView.buffer];\n bufferData = buffer?.resolvedBuffer;\n }\n\n if (!bufferData)\n return undefined;\n\n const type = accessor.componentType;\n let dataSize = 0;\n switch (type) {\n case GltfDataType.UnsignedByte:\n case GltfDataType.SignedByte:\n dataSize = 1;\n break;\n case GltfDataType.UnsignedShort:\n dataSize = 2;\n break;\n case GltfDataType.UInt32:\n case GltfDataType.Float:\n dataSize = 4;\n break;\n default:\n return undefined;\n }\n let componentCount = 1;\n switch (accessor.type) {\n case \"VEC4\":\n componentCount = 4;\n break;\n case \"VEC3\":\n componentCount = 3;\n break;\n case \"VEC2\":\n componentCount = 2;\n break;\n }\n\n const byteStride = bufferView.byteStride ? bufferView.byteStride : componentCount * dataSize;\n const offset = ((bufferView && bufferView.byteOffset) ? bufferView.byteOffset : 0) + (accessor.byteOffset ? accessor.byteOffset : 0);\n const length = byteStride * accessor.count;\n\n // If the data is misaligned (Scalable mesh tile publisher) use slice to copy -- else use subarray.\n const aligned = 0 === (bufferData.byteOffset + offset) % dataSize;\n const bytes = aligned ? bufferData.subarray(offset, offset + length) : bufferData.slice(offset, offset + length);\n return new GltfBufferView(bytes, accessor.count, type, accessor, byteStride / dataSize);\n } catch {\n return undefined;\n }\n }\n\n public readBufferData32(json: { [k: string]: any }, accessorName: string): GltfBufferData | undefined { return this.readBufferData(json, accessorName, GltfDataType.UInt32); }\n public readBufferData16(json: { [k: string]: any }, accessorName: string): GltfBufferData | undefined { return this.readBufferData(json, accessorName, GltfDataType.UnsignedShort); }\n public readBufferData8(json: { [k: string]: any }, accessorName: string): GltfBufferData | undefined { return this.readBufferData(json, accessorName, GltfDataType.UnsignedByte); }\n public readBufferDataFloat(json: { [k: string]: any }, accessorName: string): GltfBufferData | undefined { return this.readBufferData(json, accessorName, GltfDataType.Float); }\n\n protected constructor(args: GltfReaderArgs & { tileData?: LayerTileData }) {\n this._tileData = args.tileData;\n this._glTF = args.props.glTF;\n this._version = args.props.version;\n this._yAxisUp = args.props.yAxisUp;\n this._baseUrl = args.props.baseUrl;\n\n const rtcCenter = args.props.glTF.extensions?.CESIUM_RTC?.center;\n if (rtcCenter && 3 === rtcCenter.length)\n if (0 !== rtcCenter[0] || 0 !== rtcCenter[1] || 0 !== rtcCenter[2])\n this._returnToCenter = Point3d.fromJSON(rtcCenter);\n\n this._iModel = args.iModel;\n this._is3d = true !== args.is2d;\n this._system = args.system ?? IModelApp.renderSystem;\n this._type = args.type ?? BatchType.Primary;\n this._canceled = args.shouldAbort;\n this._deduplicateVertices = args.deduplicateVertices ?? false;\n this._vertexTableRequired = args.vertexTableRequired ?? false;\n\n const binaryData = args.props.binaryData;\n if (binaryData) {\n const buffer = this._buffers[this._version === 2 ? 0 : \"binary_glTF\"];\n if (buffer && undefined === buffer.uri)\n buffer.resolvedBuffer = binaryData;\n }\n\n // The original implementation of GltfReader would process and produce graphics for every node in glTF.nodes.\n // What it's *supposed* to do is process the nodes in glTF.scenes[glTF.scene].nodes\n // Some nodes may not be referenced by the configured scene, or only indirectly via GltfNode.children.\n // Perhaps some faulty tiles existed that didn't define their scenes properly?\n let sceneNodes;\n if (this._glTF.scenes && undefined !== this._glTF.scene)\n sceneNodes = this._glTF.scenes[this._glTF.scene]?.nodes;\n\n if (!sceneNodes)\n sceneNodes = Object.keys(this._nodes);\n\n this._sceneNodes = sceneNodes;\n this._idMap = args.idMap;\n }\n\n protected readBufferData(json: { [k: string]: any }, accessorName: string, type: GltfDataType): GltfBufferData | undefined {\n const view = this.getBufferView(json, accessorName);\n return undefined !== view ? view.toBufferData(type) : undefined;\n }\n\n protected readFeatureIndices(_json: any): number[] | undefined { return undefined; }\n\n private extractId(value: any): string | undefined {\n switch (typeof value) {\n case \"string\":\n return value;\n case \"number\":\n return value.toString();\n default:\n return undefined;\n }\n }\n\n private extractTextureId(material: GltfMaterial): string | undefined {\n if (typeof material !== \"object\")\n return undefined;\n\n // Bimium's shader value...almost certainly obsolete at this point.\n if (isGltf1Material(material))\n return material.diffuse ?? this.extractId(material.values?.tex);\n\n // KHR_techniques_webgl extension\n const techniques = this._glTF.extensions?.KHR_techniques_webgl?.techniques;\n const ext = Array.isArray(techniques) ? material.extensions?.KHR_techniques_webgl : undefined;\n if (techniques && undefined !== ext && typeof(ext.values) === \"object\") {\n const uniforms = typeof ext.technique === \"number\" ? techniques[ext.technique].uniforms : undefined;\n if (typeof uniforms === \"object\") {\n for (const uniformName of Object.keys(uniforms)) {\n const uniform = uniforms[uniformName];\n if (typeof uniform === \"object\" && uniform.type === GltfDataType.Sampler2d)\n return this.extractId((ext.values[uniformName] as any)?.index);\n }\n }\n }\n\n const id = this.extractId(material.pbrMetallicRoughness?.baseColorTexture?.index);\n return id ?? this.extractId(material.emissiveTexture?.index);\n }\n\n private extractNormalMapId(material: GltfMaterial): string | undefined {\n if (typeof material !== \"object\")\n return undefined;\n\n if (isGltf1Material(material))\n return undefined;\n\n return this.extractId(material.normalTexture?.index);\n }\n\n private isMaterialTransparent(material: GltfMaterial): boolean {\n if (isGltf1Material(material)) {\n if (this._glTF.techniques && undefined !== material.technique) {\n const technique = this._glTF.techniques[material.technique];\n if (technique?.states?.enable?.some((state: GltfTechniqueState) => state === GltfTechniqueState.Blend))\n return true;\n }\n\n return false;\n } else {\n // Default: OPAQUE.\n // ###TODO support MASK. For now treat as opaque.\n return \"BLEND\" === material.alphaMode;\n }\n }\n\n protected createDisplayParams(material: GltfMaterial, hasBakedLighting: boolean): DisplayParams | undefined {\n const isTransparent = this.isMaterialTransparent(material);\n const textureId = this.extractTextureId(material);\n const normalMapId = this.extractNormalMapId(material);\n let textureMapping = (undefined !== textureId || undefined !== normalMapId) ? this.findTextureMapping(textureId, isTransparent, normalMapId) : undefined;\n const color = colorFromMaterial(material, isTransparent);\n let renderMaterial: RenderMaterial | undefined;\n if (undefined !== textureMapping && undefined !== textureMapping.normalMapParams) {\n const args: CreateRenderMaterialArgs = { diffuse: { color }, specular: { color: ColorDef.white }, textureMapping };\n renderMaterial = IModelApp.renderSystem.createRenderMaterial(args);\n\n // DisplayParams doesn't want a separate texture mapping if the material already has one.\n textureMapping = undefined;\n\n }\n\n return new DisplayParams(DisplayParams.Type.Mesh, color, color, 1, LinePixels.Solid, FillFlags.None, renderMaterial, undefined, hasBakedLighting, textureMapping);\n }\n\n private readMeshPrimitives(node: GltfNode, featureTable?: FeatureTable, thisTransform?: Transform, thisBias?: Vector3d, instances?: InstancedGraphicParams): GltfPrimitiveData[] {\n const meshes: GltfPrimitiveData[] = [];\n for (const meshKey of getGltfNodeMeshIds(node)) {\n const nodeMesh = this._meshes[meshKey];\n const primitives = getMeshPrimitives(nodeMesh);\n if (primitives) {\n for (const primitive of primitives) {\n const mesh = this.readMeshPrimitive(primitive, featureTable, thisBias);\n if (mesh) {\n meshes.push(mesh);\n if (this._computedContentRange && mesh.pointRange) {\n const meshRange = thisTransform ? thisTransform .multiplyRange(mesh.pointRange) : mesh.pointRange;\n if (!instances) {\n this._computedContentRange.extendRange(meshRange);\n } else {\n const tfs = instances.transforms;\n const nodeRange = new Range3d();\n const extendTransformedRange = (i: number, x: number, y: number, z: number) => {\n nodeRange.extendXYZ(tfs[i + 3] + tfs[i + 0] * x + tfs[i + 1] * y + tfs[i + 2] * z,\n tfs[i + 7] + tfs[i + 4] * x + tfs[i + 5] * y + tfs[i + 6] * z,\n tfs[i + 11] + tfs[i + 8] * x + tfs[i + 9] * y + tfs[i + 10] * z);\n };\n\n for (let i = 0; i < tfs.length; i += 3 * 4) {\n extendTransformedRange(i, meshRange.low.x, meshRange.low.y, meshRange.low.z);\n extendTransformedRange(i, meshRange.low.x, meshRange.low.y, meshRange.high.z);\n extendTransformedRange(i, meshRange.low.x, meshRange.high.y, meshRange.low.z);\n extendTransformedRange(i, meshRange.low.x, meshRange.high.y, meshRange.high.z);\n extendTransformedRange(i, meshRange.high.x, meshRange.low.y, meshRange.low.z);\n extendTransformedRange(i, meshRange.high.x, meshRange.low.y, meshRange.high.z);\n extendTransformedRange(i, meshRange.high.x, meshRange.high.y, meshRange.low.z);\n extendTransformedRange(i, meshRange.high.x, meshRange.high.y, meshRange.high.z);\n }\n\n nodeRange.low.addInPlace(instances.transformCenter);\n nodeRange.high.addInPlace(instances.transformCenter);\n\n this._computedContentRange.extendRange(nodeRange);\n }\n }\n }\n }\n }\n }\n\n return meshes;\n }\n\n protected readMeshPrimitive(primitive: GltfMeshPrimitive, featureTable?: FeatureTable, pseudoRtcBias?: Vector3d): GltfPrimitiveData | undefined {\n const meshMode = JsonUtils.asInt(primitive.mode, GltfMeshMode.Triangles);\n if (meshMode === GltfMeshMode.Points /* && !this._vertexTableRequired */) {\n const pointCloud = this.readPointCloud2(primitive, undefined !== featureTable);\n if (pointCloud)\n return pointCloud;\n }\n\n const materialName = JsonUtils.asString(primitive.material);\n const material = 0 < materialName.length ? this._materials[materialName] : { };\n if (!material)\n return undefined;\n\n const hasBakedLighting = undefined === primitive.attributes.NORMAL || undefined !== material.extensions?.KHR_materials_unlit;\n const displayParams = material ? this.createDisplayParams(material, hasBakedLighting) : undefined;\n if (!displayParams)\n return undefined;\n\n let primitiveType: number = -1;\n switch (meshMode) {\n case GltfMeshMode.Lines:\n case GltfMeshMode.LineStrip:\n primitiveType = MeshPrimitiveType.Polyline;\n break;\n\n case GltfMeshMode.Points:\n primitiveType = MeshPrimitiveType.Point;\n break;\n\n case GltfMeshMode.Triangles:\n primitiveType = MeshPrimitiveType.Mesh;\n break;\n\n default:\n return undefined;\n }\n\n const isVolumeClassifier = this._isVolumeClassifier;\n const meshPrimitive = Mesh.create({\n displayParams,\n features: featureTable,\n type: primitiveType,\n range: Range3d.createNull(),\n is2d: !this._is3d,\n isPlanar: false,\n hasBakedLighting,\n isVolumeClassifier,\n quantizePositions: true,\n });\n\n const mesh = new GltfMeshData(meshPrimitive);\n\n // ###TODO_GLTF: There can be more than one color attribute; COLOR_0 might not be the one we want.\n if (!this.readColors(mesh, primitive.attributes, \"COLOR_0\")) {\n // We don't have real colormap - just load material color. This will be used if non-Bentley\n // tile or fit the color table is uniform. For a non-Bentley, non-Uniform, we'll set the\n // uv parameters to pick the colors out of the color map texture.\n meshPrimitive.colorMap.insert(displayParams.fillColor.tbgr); // White...\n // _COLORINDEX is an ancient holdover from glTF 1.0 and Bimium...unlikely to actually encounter it in the wild.\n const colorIndices = this.readBufferData16(primitive.attributes, \"_COLORINDEX\");\n if (undefined !== colorIndices && material) {\n let texStep;\n if (isGltf1Material(material))\n texStep = material.values?.texStep;\n else\n texStep = material.extensions?.KHR_techniques_webgl?.values?.u_texStep;\n\n if (texStep) {\n const uvParams = [];\n for (let i = 0; i < colorIndices.count; i++)\n uvParams.push(new Point2d(texStep[1] + texStep[0] * colorIndices.buffer[i], .5));\n\n const paramList = QPoint2dList.fromPoints(uvParams);\n mesh.uvs = paramList.toTypedArray();\n mesh.uvQParams = paramList.params;\n }\n }\n }\n\n const draco = primitive.extensions?.KHR_draco_mesh_compression;\n if (draco)\n return this.readDracoMeshPrimitive(mesh.primitive, draco) ? mesh : undefined;\n\n this.readBatchTable(mesh.primitive, primitive);\n if (mesh.primitive.features) {\n const features = this.readPrimitiveFeatures(primitive);\n if (features) {\n if (features instanceof Feature)\n mesh.primitive.features.add(features, 1);\n else\n mesh.primitive.features.setIndices(features);\n }\n }\n\n if (!this.readVertices(mesh, primitive, pseudoRtcBias))\n return undefined;\n\n switch (primitiveType) {\n case MeshPrimitiveType.Mesh: {\n if (!this.readMeshIndices(mesh, primitive))\n return undefined;\n\n if (!displayParams.ignoreLighting && !this.readMeshNormals(mesh, primitive.attributes, \"NORMAL\"))\n return undefined;\n\n if (!mesh.uvs) {\n let texCoordIndex = 0;\n if (!isGltf1Material(material) && undefined !== material.pbrMetallicRoughness?.baseColorTexture?.texCoord)\n texCoordIndex = JsonUtils.asInt(material.pbrMetallicRoughness.baseColorTexture.texCoord);\n\n this.readUVParams(mesh, primitive.attributes, `TEXCOORD_${texCoordIndex}`);\n }\n\n if (this._deduplicateVertices && !this.deduplicateVertices(mesh))\n return undefined;\n\n break;\n }\n\n case MeshPrimitiveType.Polyline:\n case MeshPrimitiveType.Point: {\n assert(meshMode === GltfMeshMode.Points || meshMode === GltfMeshMode.Lines || meshMode === GltfMeshMode.LineStrip);\n if (undefined !== mesh.primitive.polylines && !this.readPolylines(mesh.primitive.polylines, primitive, \"indices\", meshMode))\n return undefined;\n break;\n }\n default: {\n assert(false, \"unhandled primitive type\");\n return undefined;\n }\n }\n\n if (displayParams.textureMapping && !mesh.uvs)\n return undefined;\n\n if (primitive.extensions?.CESIUM_primitive_outline) {\n const data = this.readBufferData32(primitive.extensions.CESIUM_primitive_outline, \"indices\");\n if (data !== undefined) {\n assert(0 === data.count % 2);\n mesh.primitive.edges = new MeshEdges();\n for (let i = 0; i < data.count;)\n mesh.primitive.edges.visible.push(new MeshEdge(data.buffer[i++], data.buffer[i++]));\n }\n } else if (primitive.extensions?.EXT_mesh_primitive_edge_visibility) {\n const ext = primitive.extensions.EXT_mesh_primitive_edge_visibility;\n const visibility = this.readBufferData8(ext, \"visibility\");\n if (visibility) {\n const indices = mesh.indices;\n assert(indices !== undefined);\n assert(visibility.buffer instanceof Uint8Array);\n\n const silhouetteNormals = this.readAndOctEncodeNormals(ext, \"silhouetteNormals\");\n const normalPairs = silhouetteNormals ? new Uint32Array(silhouetteNormals.buffer, silhouetteNormals.byteOffset, silhouetteNormals.byteLength / 4) : undefined;\n mesh.primitive.edges = new MeshEdges();\n\n for (const edge of compactEdgeIterator(visibility.buffer, normalPairs, indices.length, (idx) => indices[idx])) {\n if (undefined === edge.normals) {\n mesh.primitive.edges.visible.push(new MeshEdge(edge.index0, edge.index1));\n } else {\n mesh.primitive.edges.silhouette.push(new MeshEdge(edge.index0, edge.index1));\n const normal0 = new OctEncodedNormal(edge.normals & 0x0000ffff);\n const normal1 = new OctEncodedNormal(edge.normals >>> 16);\n mesh.primitive.edges.silhouetteNormals.push(new OctEncodedNormalPair(normal0, normal1));\n }\n }\n }\n\n const lineStrings = ext.lineStrings;\n if (lineStrings) {\n for (const extLineString of lineStrings) {\n const polylineIndices = this.readBufferData32(extLineString, \"indices\");\n if (polylineIndices) {\n if (!mesh.primitive.edges) {\n mesh.primitive.edges = new MeshEdges();\n }\n\n const curGroup: MeshPolylineGroup = {\n appearance: this.getEdgeAppearance(extLineString.material),\n polylines: [],\n };\n\n const curLineString: number[] = [];\n for (const index of polylineIndices.buffer) {\n if (index === 0xffffffff) {\n if (curLineString.length > 1) {\n curGroup.polylines.push(new MeshPolyline(curLineString));\n }\n\n curLineString.length = 0;\n } else {\n curLineString.push(index);\n }\n }\n\n if (curLineString.length > 1) {\n curGroup.polylines.push(new MeshPolyline(curLineString));\n }\n\n if (curGroup.polylines.length > 0) {\n mesh.primitive.edges.polylineGroups.push(curGroup);\n }\n }\n }\n }\n\n if (mesh.primitive.edges) {\n mesh.primitive.edges.appearance = this.getEdgeAppearance(ext.material);\n }\n }\n\n return mesh;\n }\n\n private getEdgeAppearance(materialId: GltfId | undefined): EdgeAppearanceOverrides | undefined {\n const material = undefined !== materialId ? this._materials[materialId] : undefined;\n const displayParams = material ? this.createDisplayParams(material, false) : undefined;\n if (displayParams) {\n return { color: displayParams.lineColor };\n }\n\n return undefined;\n }\n\n private readPointCloud2(primitive: GltfMeshPrimitive, hasFeatures: boolean): GltfPointCloud | undefined {\n let pointRange: Range3d | undefined;\n let positions: Uint8Array | Uint16Array | Float32Array;\n let qparams: QParams3d | undefined;\n\n const posView = this.getBufferView(primitive.attributes, \"POSITION\");\n switch (posView?.type) {\n case GltfDataType.Float: {\n const posData = posView.toBufferData(GltfDataType.Float);\n if (!(posData?.buffer instanceof Float32Array)) {\n return undefined;\n }\n\n positions = posData.buffer;\n const strideSkip = posView.stride - 3;\n pointRange = new Range3d();\n for (let i = 0; i < positions.length; i += strideSkip) {\n pointRange.extendXYZ(positions[i++], positions[i++], positions[i++]);\n }\n\n qparams = QParams3d.fromOriginAndScale(new Point3d(0, 0, 0), new Point3d(1, 1, 1));\n break;\n }\n case GltfDataType.UnsignedByte:\n case GltfDataType.UnsignedShort: {\n const posData = posView.toBufferData(posView.type);\n if (!(posData?.buffer instanceof Uint8Array || posData?.buffer instanceof Uint16Array)) {\n return undefined;\n }\n\n positions = posData.buffer;\n let min, max;\n const ext = posView.accessor.extensions?.WEB3D_quantized_attributes;\n if (ext) {\n min = ext.decodedMin;\n max = ext.decodedMax;\n } else {\n // Assume KHR_mesh_quantization...\n min = [0, 0, 0];\n if (GltfDataType.UnsignedShort === posView.type)\n max = [0xFFFF, 0xFFFF, 0xFFFF];\n else\n max = [0xFF, 0xFF, 0xFF];\n }\n\n if (undefined === min || undefined === max) {\n return undefined;\n }\n\n pointRange = Range3d.createXYZXYZ(min[0], min[1], min[2], max[0], max[1], max[2]);\n qparams = QParams3d.fromRange(pointRange);\n break;\n }\n default:\n return undefined;\n }\n\n const colorView = this.getBufferView(primitive.attributes, \"COLOR_0\");\n if (!colorView || GltfDataType.UnsignedByte !== colorView.type)\n return undefined;\n\n const colorData = colorView.toBufferData(GltfDataType.UnsignedByte);\n if (!(colorData?.buffer instanceof Uint8Array))\n return undefined;\n\n let colors = colorData.buffer;\n if (\"VEC4\" === colorView.accessor.type) {\n // ###TODO support transparent point clouds\n colors = new Uint8Array(colorData.count * 3);\n for (let i = 0; i < colorData.count; i++) {\n const srcIdx = colorView.stride * i;\n const dstIdx = 3 * i;\n for (let j = 0; j < 3; j++)\n colors[dstIdx + j] = colorData.buffer[srcIdx + j];\n }\n }\n\n const features = new FeatureIndex();\n if (hasFeatures) {\n features.type = FeatureIndexType.Uniform;\n }\n\n this._containsPointCloud = true;\n return {\n type: \"pointcloud\",\n positions,\n qparams,\n pointRange,\n colors,\n colorFormat: \"rgb\",\n features,\n // ###TODO: If tile does not use additive refinement, compute voxelSize based on point range.\n // Additive refinement is typical of the glTF point clouds we receive from Orbit.\n voxelSize: 0,\n };\n }\n\n private readDracoMeshPrimitive(mesh: Mesh, ext: DracoMeshCompression): boolean {\n const draco = this._dracoMeshes.get(ext);\n if (!draco || \"triangle-list\" !== draco.topology)\n return false;\n\n const indices = draco.indices?.value;\n if (!indices || (indices.length % 3) !== 0)\n return false;\n\n const pos = draco.attributes.POSITION?.value;\n if (!pos || (pos.length % 3) !== 0)\n return false;\n\n // ###TODO: I have yet to see a draco-encoded mesh with interleaved attributes. Currently not checking.\n const triangle = new Triangle();\n for (let i = 0; i < indices.length; i += 3) {\n triangle.setIndices(indices[i], indices[i + 1], indices[i + 2]);\n mesh.addTriangle(triangle);\n }\n\n let posRange: Range3d;\n const bbox = draco.header?.boundingBox;\n if (bbox) {\n posRange = Range3d.createXYZXYZ(bbox[0][0], bbox[0][1], bbox[0][2], bbox[1][0], bbox[1][1], bbox[1][2]);\n } else {\n posRange = Range3d.createNull();\n for (let i = 0; i < pos.length; i += 3)\n posRange.extendXYZ(pos[i], pos[i + 1], pos[i + 2]);\n }\n\n assert(mesh.points instanceof QPoint3dList);\n mesh.points.params.setFromRange(posRange);\n const pt = Point3d.createZero();\n for (let i = 0; i < pos.length; i += 3) {\n pt.set(pos[i], pos[i + 1], pos[i + 2]);\n mesh.points.add(pt);\n }\n\n const normals = draco.attributes.NORMAL?.value;\n if (normals && (normals.length % 3) === 0) {\n const vec = Vector3d.createZero();\n for (let i = 0; i < normals.length; i += 3) {\n vec.set(normals[i], normals[i + 1], normals[i + 2]);\n mesh.normals.push(OctEncodedNormal.fromVector(vec));\n }\n }\n\n const uvs = draco.attributes.TEXCOORD_0?.value;\n if (uvs && (uvs.length % 2) === 0)\n for (let i = 0; i < uvs.length; i += 2)\n mesh.uvParams.push(new Point2d(uvs[i], uvs[i + 1]));\n\n const batchIds = draco.attributes._BATCHID?.value;\n if (batchIds && mesh.features) {\n const featureIndices = [];\n for (const batchId of batchIds)\n featureIndices.push(batchId);\n\n mesh.features.setIndices(featureIndices);\n }\n\n return true;\n }\n\n private deduplicateVertices(mesh: GltfMeshData): boolean {\n if (!mesh.points || !mesh.indices)\n return false;\n\n const numPoints = mesh.indices.length;\n assert(0 === numPoints % 3);\n\n const indices = mesh.indices;\n if (indices instanceof Uint16Array && numPoints > 0xffff)\n mesh.indices = new Uint32Array(numPoints);\n else if (indices instanceof Uint8Array && numPoints > 0xff)\n mesh.indices = new Uint32Array(numPoints);\n\n const points = new Uint16Array(3 * numPoints);\n const normals = mesh.normals ? new Uint16Array(numPoints) : undefined;\n const uvs = mesh.uvs ? new Uint16Array(2 * numPoints) : undefined;\n\n for (let i = 0; i < numPoints; i++) {\n const index = indices[i];\n mesh.indices[i] = i;\n\n points[i * 3 + 0] = mesh.points[index * 3 + 0];\n points[i * 3 + 1] = mesh.points[index * 3 + 1];\n points[i * 3 + 2] = mesh.points[index * 3 + 2];\n\n if (normals)\n // normals is only defined if mesh.normals is defined.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n normals[i] = mesh.normals![index];\n\n if (uvs) {\n // uvs is only defined if mesh.uvs is defined.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n uvs[i * 2 + 0] = mesh.uvs![index * 2 + 0];\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n uvs[i * 2 + 1] = mesh.uvs![index * 2 + 1];\n }\n }\n\n mesh.points = points;\n mesh.normals = normals;\n mesh.uvs = uvs;\n\n return true;\n }\n\n /**\n *\n * @param positions quantized points\n * @param primitive input json\n * @param pseudoRtcBias a bias applied to each point - this is a workaround for tiles generated by\n * context capture which have a large offset from the tileset origin that exceeds the\n * capacity of 32 bit integers. This is essentially an ad hoc RTC applied at read time.\n */\n private readVertices(mesh: GltfMeshData, primitive: GltfMeshPrimitive, pseudoRtcBias?: Vector3d): boolean {\n const view = this.getBufferView(primitive.attributes, \"POSITION\");\n if (undefined === view)\n return false;\n\n if (GltfDataType.Float === view.type) {\n const buffer = view.toBufferData(GltfDataType.Float);\n if (undefined === buffer)\n return false;\n\n const strideSkip = view.stride - 3;\n mesh.pointRange = Range3d.createNull();\n for (let i = 0; i < buffer.buffer.length; i += strideSkip)\n mesh.pointRange.extendXYZ(buffer.buffer[i++], buffer.buffer[i++], buffer.buffer[i++]);\n\n const positions = new QPoint3dList(QParams3d.fromRange(mesh.pointRange));\n const scratchPoint = new Point3d();\n for (let i = 0, j = 0; i < buffer.count; i++, j += strideSkip) {\n scratchPoint.set(buffer.buffer[j++], buffer.buffer[j++], buffer.buffer[j++]);\n if (undefined !== pseudoRtcBias)\n scratchPoint.subtractInPlace(pseudoRtcBias);\n\n positions.add(scratchPoint);\n }\n mesh.pointQParams = positions.params;\n mesh.points = positions.toTypedArray();\n } else {\n if (GltfDataType.UnsignedShort !== view.type)\n return false;\n\n let rangeMin, rangeMax;\n const quantized = view.accessor.extensions?.WEB3D_quantized_attributes;\n if (quantized) {\n rangeMin = quantized.decodedMin;\n rangeMax = quantized.decodedMax;\n } else {\n // Assume KHR_mesh_quantization...\n rangeMin = [0, 0, 0];\n rangeMax = [0xFFFF, 0xFFFF, 0xFFFF];\n }\n\n if (undefined === rangeMin || undefined === rangeMax) // required by spec...\n return false;\n\n // ###TODO apply WEB3D_quantized_attributes.decodeMatrix? Have not encountered in the wild; glTF 1.0 only.\n const buffer = view.toBufferData(GltfDataType.UnsignedShort);\n if (undefined === buffer || !(buffer.buffer instanceof Uint16Array))\n return false;\n\n assert(buffer.buffer instanceof Uint16Array);\n mesh.pointRange = Range3d.createXYZXYZ(rangeMin[0], rangeMin[1], rangeMin[2], rangeMax[0], rangeMax[1], rangeMax[2]);\n if (undefined !== pseudoRtcBias) {\n mesh.pointRange.low.subtractInPlace(pseudoRtcBias);\n mesh.pointRange.high.subtractInPlace(pseudoRtcBias);\n }\n mesh.pointQParams = QParams3d.fromRange(mesh.pointRange);\n if (3 === view.stride) {\n mesh.points = buffer.buffer;\n } else {\n mesh.points = new Uint16Array(3 * view.count);\n for (let i = 0, j = 0; i < view.count; i++) {\n const index = i * view.stride;\n mesh.points[j++] = buffer.buffer[index];\n mesh.points[j++] = buffer.buffer[index + 1];\n mesh.points[j++] = buffer.buffer[index + 2];\n }\n }\n }\n\n return true;\n }\n\n protected readIndices(json: { [k: string]: any }, accessorName: string): number[] | undefined {\n const data = this.readBufferData32(json, accessorName);\n if (undefined === data)\n return undefined;\n\n const indices = [];\n for (let i = 0; i < data.count; i++)\n indices.push(data.buffer[i]);\n\n return indices;\n }\n\n protected readBatchTable(_mesh: Mesh, _json: GltfMeshPrimitive) {\n }\n\n protected readPrimitiveFeatures(primitive: GltfMeshPrimitive): Feature | number[] | undefined {\n const ext = primitive.extensions?.EXT_mesh_features;\n if (!ext || !primitive.attributes || !this._structuralMetadata || !this._idMap) {\n return undefined;\n }\n\n let vertexCount = 0;\n const featureIdBuffers = new Map<number, {buffer: GltfDataBuffer, stride: number}>();\n for(const featureIdDesc of ext.featureIds){\n if(featureIdDesc.attribute === undefined){\n continue;\n }\n const bufferView = this.getBufferView(primitive.attributes, `_FEATURE_ID_${featureIdDesc.attribute}`);\n const bufferData = bufferView?.toBufferData(bufferView.type);\n const buffer = bufferData?.buffer;\n if (!bufferView || !buffer) {\n return undefined;\n }\n vertexCount = bufferData.count ?? 0;\n featureIdBuffers.set(featureIdDesc.attribute, {buffer, stride: bufferView.stride});\n }\n\n const itwinFeatureIndices: number[] = [];\n const vertexPropsMap = new Map<string, string>();\n for (let vertexId = 0; vertexId < vertexCount; vertexId++) {\n let vertexUniqueId = \"\";\n for(const featureIdDesc of ext.featureIds){\n if (featureIdDesc.attribute === undefined) {\n continue;\n }\n const {buffer, stride} = expectDefined(featureIdBuffers.get(featureIdDesc.attribute));\n const featureId = buffer[vertexId * stride];\n const propertyTableId = featureIdDesc.propertyTable ?? 0;\n vertexUniqueId = `${vertexUniqueId}-${featureId}-${propertyTableId}`;\n }\n\n let vertexElementId;\n if(!vertexPropsMap.has(vertexUniqueId)){\n const vertexProps: any = {};\n\n for(const featureIdDesc of ext.featureIds){\n if (featureIdDesc.attribute === undefined) {\n continue;\n }\n const {buffer, stride} = expectDefined(featureIdBuffers.get(featureIdDesc.attribute));\n const featureId = buffer[vertexId * stride];\n\n const table = this._structuralMetadata.tables[featureIdDesc.propertyTable ?? 0];\n vertexProps[table.name] = {};\n for(const entries of table.entries){\n if(entries.values[featureId] !== undefined){\n vertexProps[table.name][entries.name] = entries.values[featureId];\n }\n }\n }\n\n vertexElementId = this._idMap.getBatchId(vertexProps);\n vertexPropsMap.set(vertexUniqueId, vertexElementId);\n\n // If the element id is already assigned to a previous vertex,\n // reuse the previous feature id to avoid collision in the feature table\n if(!this._meshElementIdToFeatureIndex.has(vertexElementId)){\n this._meshElementIdToFeatureIndex.set(vertexElementId, this._meshFeatures.length);\n this._meshFeatures.push(new Feature(vertexElementId));\n }\n }\n\n vertexElementId = vertexPropsMap.get(vertexUniqueId) ?? \"\";\n itwinFeatureIndices.push(this._meshElementIdToFeatureIndex.get(vertexElementId) ?? 0);\n }\n\n return itwinFeatureIndices;\n }\n\n protected readMeshIndices(mesh: GltfMeshData, json: { [k: string]: any }): boolean {\n if (undefined !== json.indices) {\n const data = this.readBufferData16(json, \"indices\") || this.readBufferData32(json, \"indices\");\n if (data && (data.buffer instanceof Uint8Array || data.buffer instanceof Uint16Array || data.buffer instanceof Uint32Array)) {\n mesh.indices = data.buffer;\n return true;\n }\n\n return false;\n }\n\n // Non-indexed geometry. Manufacture triangle indices from points.\n const numPoints = mesh.points?.length;\n if (undefined === numPoints || 0 !== numPoints % 3)\n return false;\n\n mesh.indices = numPoints < 255 ? new Uint8Array(numPoints) : (numPoints < 0xffff ? new Uint16Array(numPoints) : new Uint32Array(numPoints));\n for (let i = 0; i < numPoints; i++)\n mesh.indices[i] = i;\n\n return true;\n }\n\n protected readMeshNormals(mesh: GltfMeshData, json: { [k: string]: any }, accessorName: string): boolean {\n const normals = this.readAndOctEncodeNormals(json, accessorName);\n if (normals) {\n mesh.normals = normals;\n return true;\n }\n\n return false;\n }\n\n protected readAndOctEncodeNormals(json: { [k: string]: any }, accessorName: string): Uint16Array | undefined {\n const view = this.getBufferView(json, accessorName);\n if (undefined === view)\n return undefined;\n\n switch (view.type) {\n case GltfDataType.Float: {\n const data = view.toBufferData(GltfDataType.Float);\n if (undefined === data)\n return undefined;\n\n const normals = new Uint16Array(data.count);\n const scratchNormal = new Vector3d();\n const strideSkip = view.stride - 3;\n for (let i = 0, j = 0; i < data.count; i++, j += strideSkip) {\n scratchNormal.set(data.buffer[j++], data.buffer[j++], data.buffer[j++]);\n normals[i] = OctEncodedNormal.encode(scratchNormal);\n }\n\n return normals;\n }\n\n case GltfDataType.SignedByte: {\n const data = view.toBufferData(GltfDataType.SignedByte);\n if (!data) {\n return undefined;\n }\n\n const normalize = (val: number) => 2 * ((val + 128) / 255) - 1;\n const normals = new Uint16Array(data.count);\n const scratchNormal = new Vector3d();\n const strideSkip = view.stride - 3;\n for (let i = 0, j = 0; i < data.count; i++, j += strideSkip) {\n const x = normalize(data.buffer[j++]);\n const y = normalize(data.buffer[j++]);\n const z = normalize(data.buffer[j++]);\n scratchNormal.set(x, y, z);\n normals[i] = OctEncodedNormal.encode(scratchNormal);\n }\n\n return normals;\n }\n\n // This is weird, why does it assume 8-bit normal vectors are actually 16-bit oct-encoded normals?\n case GltfDataType.UnsignedByte: {\n const data = view.toBufferData(GltfDataType.UnsignedByte);\n if (undefined === data)\n return undefined;\n\n // ###TODO: we shouldn't have to allocate OctEncodedNormal objects...just use uint16s / numbers...\n const normals = new Uint16Array(data.count);\n for (let i = 0; i < data.count; i++) {\n // ###TODO? not clear why ray writes these as pairs of uint8...\n const index = i * view.stride;\n const normal = data.buffer[index] | (data.buffer[index + 1] << 8);\n normals[i] = normal;\n }\n\n return normals;\n }\n default:\n return undefined;\n }\n }\n\n protected readColors(mesh: GltfMeshData, attribute: { [k: string]: any }, accessorName: string): boolean {\n const view = this.getBufferView(attribute, accessorName);\n if (!view || (GltfDataType.Float !== view.type && GltfDataType.UnsignedByte !== view.type && GltfDataType.SignedByte !== view.type))\n return false;\n\n const data = view.toBufferData(view.type);\n if (!data)\n return false;\n\n const hasAlpha = \"VEC4\" === view.accessor.type;\n const factor = view.type === GltfDataType.Float ? 255 : 1;\n const rgbt = new Uint8Array(4);\n const color = new Uint32Array(rgbt.buffer);\n for (let i = 0; i < data.count; i++) {\n const index = view.stride * i;\n rgbt[0] = data.buffer[index] * factor;\n rgbt[1] = data.buffer[index + 1] * factor;\n rgbt[2] = data.buffer[index + 2] * factor;\n rgbt[3] = hasAlpha ? (255 - data.buffer[index + 3] * factor) : 0;\n mesh.primitive.colors.push(mesh.primitive.colorMap.insert(color[0]));\n }\n\n return true;\n }\n\n private readUVParams(mesh: GltfMeshData, json: { [k: string]: any }, accessorName: string): boolean {\n const view = this.getBufferView(json, accessorName);\n\n if (view === undefined)\n return false;\n\n switch (view.type) {\n case GltfDataType.Float: {\n const data = this.readBufferDataFloat(json, accessorName);\n if (!data)\n return false;\n\n mesh.uvRange = Range2d.createNull();\n\n for (let i = 0; i < data.count; i++) {\n const index = view.stride * i; // 2 float per param...\n mesh.uvRange.extendXY(data.buffer[index], data.buffer[index + 1]);\n }\n mesh.uvQParams = QParams2d.fromRange(mesh.uvRange);\n mesh.uvs = new Uint16Array(data.count * 2);\n for (let i = 0, j = 0; i < data.count; i++) {\n const index = view.stride * i; // 2 float per param...\n mesh.uvs[j++] = Quantization.quantize(data.buffer[index], mesh.uvQParams.origin.x, mesh.uvQParams.scale.x);\n mesh.uvs[j++] = Quantization.quantize(data.buffer[index + 1], mesh.uvQParams.origin.y, mesh.uvQParams.scale.y);\n }\n return true;\n }\n\n case GltfDataType.UnsignedShort: {\n const quantized = view.accessor.extensions?.WEB3D_quantized_attributes;\n const rangeMin = quantized?.decodedMin;\n const rangeMax = quantized?.decodedMax;\n if (undefined === rangeMin || undefined === rangeMax)\n return false;\n\n const qData = view.toBufferData(GltfDataType.UnsignedShort);\n if (undefined === qData || !(qData.buffer instanceof Uint16Array))\n return false;\n\n mesh.uvRange = Range2d.createXYXY(rangeMin[0], rangeMin[1], rangeMax[0], rangeMax[1]);\n mesh.uvQParams = QParams2d.fromRange(mesh.uvRange);\n if (2 === view.stride) {\n mesh.uvs = qData.buffer;\n } else {\n mesh.uvs = new Uint16Array(2 * view.count);\n for (let i = 0, j = 0; i < view.count; i++) {\n const index = i * view.stride;\n mesh.uvs[j++] = qData.buffer[index];\n mesh.uvs[j++] = qData.buffer[index + 1];\n }\n }\n return true;\n }\n default:\n assert(false);\n return false;\n\n }\n\n return true;\n }\n\n protected readPolylines(polylines: MeshPolylineList, json: { [k: string]: any }, accessorName: string, mode: GltfMeshMode.Points | GltfMeshMode.Lines | GltfMeshMode.LineStrip): boolean {\n const bufferView = this.getBufferView(json, accessorName);\n const data = bufferView?.toBufferData(GltfDataType.UInt32);\n if (undefined === data)\n return false;\n\n const indices = new Array<number>();\n switch (mode) {\n case GltfMeshMode.Points: {\n for (let i = 0; i < data.count;)\n indices.push(data.buffer[i++]);\n\n break;\n }\n case GltfMeshMode.Lines: {\n for (let i = 0; i < data.count;) {\n const index0 = data.buffer[i++];\n const index1 = data.buffer[i++];\n if (0 === indices.length || index0 !== indices[indices.length - 1]) {\n if (indices.length !== 0) {\n polylines.push(new MeshPolyline(indices));\n indices.length = 0;\n }\n indices.push(index0);\n }\n indices.push(index1);\n }\n\n break;\n }\n case GltfMeshMode.LineStrip: {\n assert(undefined !== bufferView); // compiler can't seem to infer this...\n const restart = GltfDataType.UnsignedByte === bufferView.type ? 0xff : (GltfDataType.UnsignedShort === bufferView.type ? 0xffff : 0xffffffff);\n for (const index of data.buffer) {\n if (index === restart) {\n if (indices.length > 1) {\n polylines.push(new MeshPolyline(indices));\n }\n\n indices.length = 0;\n } else {\n indices.push(index);\n }\n }\n break;\n }\n }\n\n if (indices.length !== 0)\n polylines.push(new MeshPolyline(indices));\n\n return true;\n }\n\n protected async resolveResources(): Promise<void> {\n // Load any external images and buffers.\n await this._resolveResources();\n\n // Decompress any meshopt-compressed buffer views\n const decodeMeshoptBuffers: Array<Promise<void>> = [];\n for (const bv of gltfDictionaryIterator(this._bufferViews)) {\n const ext = bv.extensions?.EXT_meshopt_compression;\n if (ext) {\n const bufferData = this._buffers[ext.buffer]?.resolvedBuffer;\n if (bufferData) {\n const source = new Uint8Array(bufferData.buffer, bufferData.byteOffset + (ext.byteOffset ?? 0), ext.byteLength ?? 0);\n const decode = async () => {\n bv.resolvedBuffer = await decodeMeshoptBuffer(source, ext);\n if (bv.resolvedBuffer) {\n bv.byteLength = bv.resolvedBuffer.byteLength;\n bv.byteOffset = 0;\n }\n };\n\n decodeMeshoptBuffers.push(decode());\n }\n }\n }\n\n await Promise.all(decodeMeshoptBuffers);\n\n // If any meshes are draco-compressed, dynamically load the decoder module and then decode the meshes.\n const dracoMeshes: DracoMeshCompression[] = [];\n\n for (const node of this.traverseScene()) {\n for (const meshId of getGltfNodeMeshIds(node)) {\n const mesh = this._meshes[meshId];\n if (mesh?.primitives)\n for (const primitive of mesh.primitives)\n if (primitive.extensions?.KHR_draco_mesh_compression)\n dracoMeshes.push(primitive.extensions.KHR_draco_mesh_compression);\n }\n }\n\n if (dracoMeshes.length === 0)\n return;\n\n try {\n // Refuse to continue decoding if using Internet Explorer or old Microsoft Edge. We do not want to trigger any legacy decoding fallbacks within draco3d.\n if (ProcessDetector.isIEBrowser) {\n throw new Error(\"Unsupported browser for Draco decoding\");\n }\n\n const dracoLoader = (await import(\"@loaders.gl/draco\")).DracoLoader;\n\n await Promise.all(dracoMeshes.map(async (x) => this.decodeDracoMesh(x, dracoLoader)));\n } catch (err) {\n Logger.logWarning(FrontendLoggerCategory.Render, \"Failed to decode draco-encoded glTF mesh\");\n Logger.logException(FrontendLoggerCategory.Render, err);\n }\n }\n\n private async _resolveResources(): Promise<void> {\n // ###TODO traverse the scene nodes to find resources referenced by them, instead of resolving everything - some resources may not\n // be required for the scene.\n const promises: Array<Promise<void>> = [];\n try {\n for (const buffer of gltfDictionaryIterator(this._buffers))\n if (!buffer.resolvedBuffer)\n promises.push(this.resolveBuffer(buffer));\n\n await Promise.all(promises);\n if (this._isCanceled)\n return;\n\n promises.length = 0;\n for (const image of gltfDictionaryIterator(this._images))\n if (!image.resolvedImage)\n promises.push(this.resolveImage(image));\n\n await Promise.all(promises);\n } catch { }\n }\n\n private async decodeDracoMesh(ext: DracoMeshCompression, loader: typeof DracoLoader): Promise<void> {\n const bv = this._bufferViews[ext.bufferView];\n if (!bv || !bv.byteLength)\n return;\n\n let buf = this._buffers[bv.buffer]?.resolvedBuffer;\n if (!buf)\n return;\n\n const offset = bv.byteOffset ?? 0;\n buf = buf.subarray(offset, offset + bv.byteLength);\n\n const mesh = await loader.parse(buf, {\n draco: {\n decoderType: \"wasm\",\n },\n modules: {\n \"draco_wasm_wrapper.js\": `${IModelApp.publicPath}scripts/draco_wasm_wrapper.js`,\n \"draco_decoder.wasm\": `${IModelApp.publicPath}scripts/draco_decoder.wasm`,\n },\n worker: false,\n useLocalLibraries: true,\n });\n if (mesh)\n this._dracoMeshes.set(ext, mesh);\n }\n\n protected resolveUrl(uri: string): string | undefined {\n try {\n const resolved = new URL(uri, this._baseUrl);\n resolved.search = this._baseUrl?.search ?? \"\";\n return resolved.toString();\n } catch {\n return undefined;\n }\n }\n\n private async resolveBuffer(buffer: GltfBuffer & { resolvedBuffer?: Uint8Array }): Promise<void> {\n if (buffer.resolvedBuffer || undefined === buffer.uri)\n return;\n\n try {\n const url = this.resolveUrl(buffer.uri);\n const response = url ? await fetch(url) : undefined;\n if (this._isCanceled)\n return;\n\n const data = await response?.arrayBuffer();\n if (this._isCanceled)\n return;\n\n if (data)\n buffer.resolvedBuffer = new Uint8Array(data);\n } catch {\n //\n }\n }\n\n private async resolveImage(image: GltfImage & { resolvedImage?: TextureImageSource }): Promise<void> {\n if (image.resolvedImage)\n return;\n\n interface BufferViewSource { bufferView?: GltfId, mimeType?: string }\n const bvSrc: BufferViewSource | undefined = undefined !== image.bufferView ? image : image.extensions?.KHR_binary_glTF;\n if (undefined !== bvSrc?.bufferView) {\n const format = undefined !== bvSrc.mimeType ? getImageSourceFormatForMimeType(bvSrc.mimeType) : undefined;\n const bufferView = this._bufferViews[bvSrc.bufferView];\n if (undefined === format || !bufferView || !bufferView.byteLength || bufferView.byteLength < 0)\n return;\n\n const bufferData = this._buffers[bufferView.buffer]?.resolvedBuffer;\n if (!bufferData)\n return;\n\n const offset = bufferView.byteOffset ?? 0;\n const bytes = bufferData.subarray(offset, offset + bufferView.byteLength);\n try {\n const imageSource = new ImageSource(bytes, format);\n if (this._system.supportsCreateImageBitmap)\n image.resolvedImage = await imageBitmapFromImageSource(imageSource);\n else\n image.resolvedImage = await imageElementFromImageSource(imageSource);\n } catch {\n //\n }\n\n return;\n }\n\n const url = undefined !== image.uri ? this.resolveUrl(image.uri) : undefined;\n if (undefined !== url)\n image.resolvedImage = await tryImageElementFromUrl(url);\n }\n\n /** The glTF spec says that if GltfSampler.wrapS/T are omitted, they default to Repeat.\n * However, the reality data service serves tiles that lack any wrapS/T property, and we want those clamped to edge, not repeated.\n * (We also don't want to produce mip-maps for them, which is determined indirectly from the wrap mode).\n * Allow the default to be optionally overridden.\n */\n public defaultWrapMode = GltfWrapMode.Repeat;\n\n /** Exposed strictly for testing. */\n public getTextureType(sampler?: GltfSampler): RenderTexture.Type {\n // ###TODO: RenderTexture currently does not support different wrapping behavior for U vs V, nor does it support mirrored repeat.\n let wrapS = sampler?.wrapS;\n let wrapT = sampler?.wrapT;\n if (undefined === wrapS && undefined === wrapT)\n wrapS = wrapT = this.defaultWrapMode;\n\n if (GltfWrapMode.ClampToEdge === wrapS || GltfWrapMode.ClampToEdge === wrapT)\n return RenderTexture.Type.TileSection;\n\n return RenderTexture.Type.Normal;\n }\n\n private resolveTexture(textureId: string, isTransparent: boolean): RenderTexture | false {\n const texture = this._textures[textureId];\n if (!texture || undefined === texture.source)\n return false;\n\n const image = this._images[texture.source]?.resolvedImage;\n if (!image)\n return false;\n\n\n const samplerId = texture.sampler;\n const sampler = undefined !== samplerId ? this._samplers[samplerId] : undefined;\n const textureType = this.getTextureType(sampler);\n const renderTexture = this._system.createTexture({\n type: textureType,\n image: {\n source: image,\n transparency: isTransparent ? TextureTransparency.Mixed : TextureTransparency.Opaque,\n },\n });\n return renderTexture ?? false;\n }\n\n protected findTextureMapping(id: string | undefined, isTransparent: boolean, normalMapId: string | undefined): TextureMapping | undefined {\n if (undefined === id && undefined === normalMapId)\n return undefined;\n\n let texture;\n if (undefined !== id) {\n texture = this._resolvedTextures.get({ id, isTransparent });\n if (undefined === texture)\n this._resolvedTextures.set({ id, isTransparent }, texture = this.resolveTexture(id, isTransparent));\n }\n\n let normalMap;\n if (undefined !== normalMapId) {\n normalMap = this._resolvedTextures.get({ id: normalMapId, isTransparent: false });\n if (undefined === normalMap)\n this._resolvedTextures.set({ id: normalMapId, isTransparent: false }, normalMap = this.resolveTexture(normalMapId, false));\n }\n\n let nMap;\n if (normalMap) {\n const greenUp = true;\n if (texture) {\n nMap = {\n normalMap,\n greenUp,\n };\n } else {\n texture = normalMap;\n nMap = { greenUp };\n }\n }\n\n if (!texture)\n return undefined;\n\n const textureMapping = new TextureMapping(texture, new TextureMapping.Params());\n textureMapping.normalMapParams = nMap;\n return textureMapping;\n }\n}\n\n/** Arguments supplied to [[readGltfGraphics]] to produce a [[RenderGraphic]] from a [glTF](https://www.khronos.org/gltf/) asset.\n * @public\n * @extensions\n */\nexport interface ReadGltfGraphicsArgs {\n /** A representation of the glTF data as one of:\n * - The binary data in glb format as a Uint8Array; or\n * - A JSON object conforming to the [glTF 2.0 specification](https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html); or\n * - A Uint8Array containing the utf8-encoded stringified JSON of an object conforming to the [glTF 2.0 specification](https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html).\n */\n gltf: Uint8Array | object;\n /** The iModel with which the graphics will be associated - typically obtained from the [[Viewport]] into which they will be drawn. */\n iModel: IModelConnection;\n /** Options for making the graphic [pickable]($docs/learning/frontend/ViewDecorations#pickable-view-graphic-decorations).\n * Only the [[PickableGraphicOptions.id]] property is required to make the graphics pickable. If a `modelId` is also supplied and differs from the `id`,\n * the graphics will also be selectable.\n */\n pickableOptions?: PickableGraphicOptions;\n /** The base URL for any relative URIs in the glTF. Typically, this is the same as the URL for the glTF asset itself.\n * If not supplied, relative URIs cannot be resolved. For glTF assets containing no relative URIs, this is not required.\n */\n baseUrl?: URL | string;\n /** @alpha */\n contentRange?: ElementAlignedBox3d;\n /** @alpha */\n transform?: Transform;\n /** @alpha */\n hasChildren?: boolean;\n /** @internal */\n idMap?: BatchedTileIdMap;\n}\n\n/** The output of [[readGltf]].\n * @public\n */\nexport interface GltfGraphic {\n /** The graphic created from the glTF model. */\n graphic: RenderGraphic;\n /** The bounding box of the model, in local coordinates (y-axis up). */\n localBoundingBox: ElementAlignedBox3d;\n /** The bounding box of the model, in world coordinates (z-axis up). */\n boundingBox: AxisAlignedBox3d;\n}\n\n/** The output of [[readGltfTemplate]].\n * @beta\n */\nexport interface GltfTemplate {\n /** The graphic template created from the glTF model. */\n template: GraphicTemplate;\n /** The bounding box of the model, in local coordinates (y-axis up). */\n localBoundingBox: ElementAlignedBox3d;\n /** The bounding box of the model, in world coordinates (z-axis up). */\n boundingBox: AxisAlignedBox3d;\n}\n\n/** Produce a [[RenderGraphic]] from a [glTF](https://www.khronos.org/gltf/) asset suitable for use in [view decorations]($docs/learning/frontend/ViewDecorations).\n * @returns a graphic produced from the glTF asset's default scene, or `undefined` if a graphic could not be produced from the asset.\n * @see [[readGltf]] for more details.\n * @public\n * @extensions\n */\nexport async function readGltfGraphics(args: ReadGltfGraphicsArgs): Promise<RenderGraphic | undefined> {\n const result = await readGltf(args);\n return result?.graphic;\n}\n\n/** Produce a [[GraphicTemplate]] from a [glTF](https://www.khronos.org/gltf/) asset suitable for use in [view decorations]($docs/learning/frontend/ViewDecorations).\n * @returns a template produced from the glTF asset's default scene, or `undefined` if a template could not be produced from the asset.\n * @see [[readGltf]] for more details.\n * @beta\n */\nexport async function readGltfTemplate(args: ReadGltfGraphicsArgs): Promise<GltfTemplate | undefined> {\n const baseUrl = typeof args.baseUrl === \"string\" ? new URL(args.baseUrl) : args.baseUrl;\n const props = GltfReaderProps.create(args.gltf, true, baseUrl); // glTF supports exactly one coordinate system with y axis up.\n const reader = props ? new GltfGraphicsReader(props, args) : undefined;\n if (!reader)\n return undefined;\n\n const result = await reader.readTemplate();\n if (!result.template)\n return undefined;\n\n return {\n template: result.template,\n localBoundingBox: result.contentRange ?? Range3d.createNull(),\n boundingBox: result.range ?? Range3d.createNull(),\n };\n}\n\n/** Produce a [[RenderGraphic]] from a [glTF](https://www.khronos.org/gltf/) asset suitable for use in [view decorations]($docs/learning/frontend/ViewDecorations).\n * @returns a graphic produced from the glTF asset's default scene, or `undefined` if a graphic could not be produced from the asset.\n * The returned graphic also includes the bounding boxes of the glTF model in world and local coordiantes.\n * @note Support for the full [glTF 2.0 specification](https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html) is currently a work in progress.\n * If a particular glTF asset fails to load and/or display properly, please\n * [submit an issue](https://github.com/iTwin/itwinjs-core/issues).\n * @see [Example decorator]($docs/learning/frontend/ViewDecorations#gltf-decorations) for an example of a decorator that reads and displays a glTF asset.\n * @see [[readGltfTemplate]] to produce a [[GraphicTemplate]] instead of a [[RenderGraphic]].\n * @public\n */\nexport async function readGltf(args: ReadGltfGraphicsArgs): Promise<GltfGraphic | undefined> {\n const result = await readGltfTemplate(args);\n if (!result) {\n return undefined;\n }\n\n const template = result.template;\n delete (result as Partial<GltfTemplate>).template;\n return {\n ...result,\n graphic: IModelApp.renderSystem.createGraphicFromTemplate({ template }),\n };\n}\n\n/** Implements [[readGltfGraphics]]. Exported strictly for tests.\n * @internal\n */\nexport class GltfGraphicsReader extends GltfReader {\n private readonly _featureTable?: FeatureTable;\n private readonly _contentRange?: ElementAlignedBox3d;\n private readonly _transform?: Transform;\n private readonly _isLeaf: boolean;\n public readonly binaryData?: Uint8Array; // strictly for tests\n public meshes?: GltfMeshData; // strictly for tests\n\n public constructor(props: GltfReaderProps, args: ReadGltfGraphicsArgs & { tileData?: LayerTileData }) {\n super({\n props,\n iModel: args.iModel,\n vertexTableRequired: true,\n idMap: args.idMap,\n tileData: args.tileData,\n });\n\n this._contentRange = args.contentRange;\n this._transform = args.transform;\n this._isLeaf = true !== args.hasChildren;\n\n this.binaryData = props.binaryData;\n const pickableId = args.pickableOptions?.id;\n if (pickableId) {\n this._featureTable = new FeatureTable(1, args.pickableOptions?.modelId ?? pickableId, BatchType.Primary);\n this._featureTable.insert(new Feature(pickableId));\n }\n }\n\n protected override get viewFlagOverrides(): ViewFlagOverrides {\n return {\n whiteOnWhiteReversal: false,\n renderMode: RenderMode.SmoothShade,\n };\n }\n\n public get meshElementIdToFeatureIndex(): Map<string, number> { // strictly for tests\n return this._meshElementIdToFeatureIndex;\n }\n\n protected override readMeshPrimitive(primitive: GltfMeshPrimitive, featureTable?: FeatureTable, pseudoRtcBias?: Vector3d): GltfPrimitiveData | undefined {\n const meshes = super.readMeshPrimitive(primitive, featureTable, pseudoRtcBias);\n this.meshes = meshes instanceof GltfMeshData ? meshes : undefined;\n return meshes;\n }\n\n private getGltfStructuralMetadataBuffer(id: GltfId, type: GltfStructuralMetadata.ClassPropertyComponentType){\n const bufferView = this._bufferViews[id];\n if (!bufferView || undefined === bufferView.buffer)\n return undefined;\n\n if(!bufferView.byteLength || bufferView.byteLength === 0){\n return undefined;\n }\n\n const bufferData = this._buffers[bufferView.buffer]?.resolvedBuffer;\n if (!bufferData)\n return undefined;\n\n assert(undefined !== bufferView.byteLength); // required by spec; TypeScript interface is wrong.\n const byteOffset = bufferView.byteOffset ?? 0;\n\n const subarray = bufferData.slice(byteOffset, byteOffset + bufferView.byteLength);\n switch(type){\n case \"INT8\":\n return new Int8Array(subarray.buffer, 0, bufferView.byteLength);\n case \"UINT8\":\n return new Uint8Array(subarray.buffer, 0, bufferView.byteLength);\n case \"INT16\":\n return new Int16Array(subarray.buffer, 0, bufferView.byteLength / 2);\n case \"UINT16\":\n return new Uint16Array(subarray.buffer, 0, bufferView.byteLength / 2);\n case \"INT32\":\n return new Int32Array(subarray.buffer, 0, bufferView.byteLength / 4);\n case \"UINT32\":\n return new Uint32Array(subarray.buffer, 0, bufferView.byteLength / 4);\n case \"INT64\":\n return new BigInt64Array(subarray.buffer, 0, bufferView.byteLength / 8);\n case \"UINT64\":\n return new BigUint64Array(subarray.buffer, 0, bufferView.byteLength / 8);\n case \"FLOAT32\":\n return new Float32Array(subarray.buffer, 0, bufferView.byteLength / 4);\n case \"FLOAT64\":\n return new Float64Array(subarray.buffer, 0, bufferView.byteLength / 8);\n }\n return undefined;\n }\n\n private getGltfStructuralMetadataPropertyValues(property: GltfStructuralMetadata.PropertyTableProperty, classProperty: GltfStructuralMetadata.ClassProperty, count: number){\n // Not supported for now\n if(classProperty.type === \"ENUM\" || classProperty.type === \"BOOLEAN\"){\n return undefined;\n }\n\n let getPropertyValue: any;\n\n if(classProperty.type === \"STRING\" && property.stringOffsets){\n\n const stringValues = this.getGltfStructuralMetadataBuffer(property.values, \"UINT8\") as Uint8Array;\n if(!stringValues){\n return undefined;\n }\n\n const stringOffsets = this.getGltfStructuralMetadataBuffer(property.stringOffsets, \"UINT32\") as Uint32Array;\n if(!stringOffsets){\n return undefined;\n }\n\n getPropertyValue = (index: number) => {\n const begin = stringOffsets[index];\n const end = stringOffsets[index+1];\n return utf8ToString(stringValues.subarray(begin, end));\n };\n } else {\n\n if(!classProperty.componentType){\n return undefined;\n }\n\n let numComponents = -1;\n switch(classProperty.type){\n case \"SCALAR\":\n numComponents = 1;\n break;\n case \"VEC2\":\n numComponents = 2;\n break;\n case \"VEC3\":\n numComponents = 3;\n break;\n case \"VEC4\":\n numComponents = 4;\n break;\n case \"MAT2\":\n numComponents = 4;\n break;\n case \"MAT3\":\n numComponents = 9;\n break;\n case \"MAT4\":\n numComponents = 16;\n break;\n }\n\n if(numComponents === -1){\n return undefined;\n }\n\n const values = this.getGltfStructuralMetadataBuffer(property.values, classProperty.componentType);\n if(!values){\n return undefined;\n }\n\n if(numComponents === 1){\n getPropertyValue = (index: number) => {\n return values[index];\n };\n } else {\n getPropertyValue = (index: number) => {\n const result = [];\n for(let i = 0; i < numComponents; i++){\n result.push(values[index * numComponents + i]);\n }\n return result;\n };\n }\n }\n\n const propertyValues: any[] = [];\n for(let i = 0; i < count; i++){\n const value = getPropertyValue(i);\n const propertyValue = (typeof value === \"bigint\" ) ? value.toString() : value;\n if(!classProperty.noData || propertyValue !== classProperty.noData){\n propertyValues.push(propertyValue);\n } else{\n propertyValues.push(undefined);\n }\n }\n\n return propertyValues;\n }\n\n private readGltfStructuralMetadata(){\n const propertyTables = this._glTF.extensions?.EXT_structural_metadata?.propertyTables;\n const schema = this._glTF.extensions?.EXT_structural_metadata?.schema;\n\n if(propertyTables && schema && schema.classes){\n\n this._structuralMetadata = { tables: [] };\n\n for(const propertyTable of propertyTables){\n if(!propertyTable.properties || !schema.classes){\n continue;\n }\n\n const propertyTableSchema = schema.classes[propertyTable.class];\n if(!propertyTableSchema || !propertyTableSchema.properties){\n continue;\n }\n\n const structuralMetadataTable: StructuralMetadataTable = {\n name: propertyTableSchema.name ?? propertyTable.class,\n entries: [],\n };\n\n for (const [propertyName, property] of Object.entries(propertyTable.properties)){\n\n const propertySchema = propertyTableSchema.properties[propertyName];\n\n if(!property || !propertySchema){\n continue;\n }\n\n const propertyValues = this.getGltfStructuralMetadataPropertyValues(property, propertySchema, propertyTable.count);\n\n if(!propertyValues){\n continue;\n }\n\n structuralMetadataTable.entries.push({\n name: propertySchema.name ?? propertyName,\n values: propertyValues,\n });\n }\n this._structuralMetadata.tables.push(structuralMetadataTable);\n }\n }\n }\n\n public async readTemplate(): Promise<GltfTemplateResult> {\n await this.resolveResources();\n this.readGltfStructuralMetadata();\n return this.readGltfAndCreateTemplate(this._isLeaf, this._featureTable, this._contentRange, true, this._transform);\n }\n\n public async read(): Promise<GltfReaderResult> {\n const result = await this.readTemplate();\n return templateToGraphicResult(result, this._system);\n }\n\n public get structuralMetadata(): StructuralMetadata | undefined { return this._structuralMetadata; }\n public get nodes(): GltfDictionary<GltfNode> { return this._nodes; }\n public get scenes(): GltfDictionary<GltfScene> { return this._glTF.scenes ?? emptyDict; }\n public get sceneNodes(): GltfId[] { return this._sceneNodes; }\n public get textures(): GltfDictionary<GltfTexture> { return this._textures; }\n}\n"]}
|