@itwin/core-frontend 3.1.0-dev.11 → 3.1.0-dev.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/lib/cjs/ApproximateTerrainHeights.d.ts +1 -1
  2. package/lib/cjs/ApproximateTerrainHeights.d.ts.map +1 -1
  3. package/lib/cjs/ApproximateTerrainHeights.js +21 -9
  4. package/lib/cjs/ApproximateTerrainHeights.js.map +1 -1
  5. package/lib/cjs/ApproximateTerrainHeightsProps.d.ts +12 -0
  6. package/lib/cjs/ApproximateTerrainHeightsProps.d.ts.map +1 -0
  7. package/lib/cjs/ApproximateTerrainHeightsProps.js +13 -0
  8. package/lib/cjs/ApproximateTerrainHeightsProps.js.map +1 -0
  9. package/lib/cjs/FrontendLoggerCategory.d.ts +3 -1
  10. package/lib/cjs/FrontendLoggerCategory.d.ts.map +1 -1
  11. package/lib/cjs/FrontendLoggerCategory.js +2 -0
  12. package/lib/cjs/FrontendLoggerCategory.js.map +1 -1
  13. package/lib/cjs/LocalhostIpcApp.d.ts +2 -0
  14. package/lib/cjs/LocalhostIpcApp.d.ts.map +1 -1
  15. package/lib/cjs/LocalhostIpcApp.js +10 -4
  16. package/lib/cjs/LocalhostIpcApp.js.map +1 -1
  17. package/lib/cjs/RealityDataSource.d.ts +2 -0
  18. package/lib/cjs/RealityDataSource.d.ts.map +1 -1
  19. package/lib/cjs/RealityDataSource.js +13 -0
  20. package/lib/cjs/RealityDataSource.js.map +1 -1
  21. package/lib/cjs/render/webgl/DrawCommand.js +1 -1
  22. package/lib/cjs/render/webgl/DrawCommand.js.map +1 -1
  23. package/lib/cjs/render/webgl/SceneCompositor.d.ts +3 -0
  24. package/lib/cjs/render/webgl/SceneCompositor.d.ts.map +1 -1
  25. package/lib/cjs/render/webgl/SceneCompositor.js +31 -6
  26. package/lib/cjs/render/webgl/SceneCompositor.js.map +1 -1
  27. package/lib/cjs/render/webgl/ShaderProgram.d.ts +1 -0
  28. package/lib/cjs/render/webgl/ShaderProgram.d.ts.map +1 -1
  29. package/lib/cjs/render/webgl/ShaderProgram.js +1 -0
  30. package/lib/cjs/render/webgl/ShaderProgram.js.map +1 -1
  31. package/lib/cjs/tile/GltfReader.d.ts +16 -2
  32. package/lib/cjs/tile/GltfReader.d.ts.map +1 -1
  33. package/lib/cjs/tile/GltfReader.js +122 -13
  34. package/lib/cjs/tile/GltfReader.js.map +1 -1
  35. package/lib/cjs/tile/PntsReader.d.ts +1 -1
  36. package/lib/cjs/tile/PntsReader.d.ts.map +1 -1
  37. package/lib/cjs/tile/PntsReader.js +107 -35
  38. package/lib/cjs/tile/PntsReader.js.map +1 -1
  39. package/lib/cjs/tile/RealityTileLoader.js +1 -1
  40. package/lib/cjs/tile/RealityTileLoader.js.map +1 -1
  41. package/lib/esm/ApproximateTerrainHeights.d.ts +1 -1
  42. package/lib/esm/ApproximateTerrainHeights.d.ts.map +1 -1
  43. package/lib/esm/ApproximateTerrainHeights.js +2 -9
  44. package/lib/esm/ApproximateTerrainHeights.js.map +1 -1
  45. package/lib/esm/ApproximateTerrainHeightsProps.d.ts +12 -0
  46. package/lib/esm/ApproximateTerrainHeightsProps.d.ts.map +1 -0
  47. package/lib/esm/ApproximateTerrainHeightsProps.js +10 -0
  48. package/lib/esm/ApproximateTerrainHeightsProps.js.map +1 -0
  49. package/lib/esm/FrontendLoggerCategory.d.ts +3 -1
  50. package/lib/esm/FrontendLoggerCategory.d.ts.map +1 -1
  51. package/lib/esm/FrontendLoggerCategory.js +2 -0
  52. package/lib/esm/FrontendLoggerCategory.js.map +1 -1
  53. package/lib/esm/LocalhostIpcApp.d.ts +2 -0
  54. package/lib/esm/LocalhostIpcApp.d.ts.map +1 -1
  55. package/lib/esm/LocalhostIpcApp.js +10 -4
  56. package/lib/esm/LocalhostIpcApp.js.map +1 -1
  57. package/lib/esm/RealityDataSource.d.ts +2 -0
  58. package/lib/esm/RealityDataSource.d.ts.map +1 -1
  59. package/lib/esm/RealityDataSource.js +14 -1
  60. package/lib/esm/RealityDataSource.js.map +1 -1
  61. package/lib/esm/render/webgl/DrawCommand.js +1 -1
  62. package/lib/esm/render/webgl/DrawCommand.js.map +1 -1
  63. package/lib/esm/render/webgl/SceneCompositor.d.ts +3 -0
  64. package/lib/esm/render/webgl/SceneCompositor.d.ts.map +1 -1
  65. package/lib/esm/render/webgl/SceneCompositor.js +31 -6
  66. package/lib/esm/render/webgl/SceneCompositor.js.map +1 -1
  67. package/lib/esm/render/webgl/ShaderProgram.d.ts +1 -0
  68. package/lib/esm/render/webgl/ShaderProgram.d.ts.map +1 -1
  69. package/lib/esm/render/webgl/ShaderProgram.js +1 -0
  70. package/lib/esm/render/webgl/ShaderProgram.js.map +1 -1
  71. package/lib/esm/tile/GltfReader.d.ts +16 -2
  72. package/lib/esm/tile/GltfReader.d.ts.map +1 -1
  73. package/lib/esm/tile/GltfReader.js +104 -14
  74. package/lib/esm/tile/GltfReader.js.map +1 -1
  75. package/lib/esm/tile/PntsReader.d.ts +1 -1
  76. package/lib/esm/tile/PntsReader.d.ts.map +1 -1
  77. package/lib/esm/tile/PntsReader.js +91 -38
  78. package/lib/esm/tile/PntsReader.js.map +1 -1
  79. package/lib/esm/tile/RealityTileLoader.js +1 -1
  80. package/lib/esm/tile/RealityTileLoader.js.map +1 -1
  81. package/package.json +22 -20
  82. package/lib/cjs/tile/DracoDecoder.d.ts +0 -20
  83. package/lib/cjs/tile/DracoDecoder.d.ts.map +0 -1
  84. package/lib/cjs/tile/DracoDecoder.js +0 -169
  85. package/lib/cjs/tile/DracoDecoder.js.map +0 -1
  86. package/lib/esm/tile/DracoDecoder.d.ts +0 -20
  87. package/lib/esm/tile/DracoDecoder.d.ts.map +0 -1
  88. package/lib/esm/tile/DracoDecoder.js +0 -165
  89. package/lib/esm/tile/DracoDecoder.js.map +0 -1
  90. package/lib/public/assets/approximateTerrainHeights.json +0 -1
@@ -9,5 +9,5 @@ import { RenderSystem } from "../render/RenderSystem";
9
9
  /** Deserialize a point cloud tile and return it as a RenderGraphic.
10
10
  * @internal
11
11
  */
12
- export declare function readPointCloudTileContent(stream: ByteStream, iModel: IModelConnection, modelId: Id64String, _is3d: boolean, range: ElementAlignedBox3d, system: RenderSystem): RenderGraphic | undefined;
12
+ export declare function readPointCloudTileContent(stream: ByteStream, iModel: IModelConnection, modelId: Id64String, _is3d: boolean, range: ElementAlignedBox3d, system: RenderSystem): Promise<RenderGraphic | undefined>;
13
13
  //# sourceMappingURL=PntsReader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PntsReader.d.ts","sourceRoot":"","sources":["../../../src/tile/PntsReader.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAU,UAAU,EAAE,UAAU,EAAgB,MAAM,qBAAqB,CAAC;AAEnF,OAAO,EAAa,mBAAmB,EAAkF,MAAM,oBAAoB,CAAC;AACpJ,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,YAAY,GAAG,aAAa,GAAG,SAAS,CAgExM"}
1
+ {"version":3,"file":"PntsReader.d.ts","sourceRoot":"","sources":["../../../src/tile/PntsReader.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAwB,MAAM,qBAAqB,CAAC;AAEnF,OAAO,EAAa,mBAAmB,EAA4F,MAAM,oBAAoB,CAAC;AAE9J,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AA0GtD;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA+CvN"}
@@ -5,16 +5,84 @@
5
5
  /** @packageDocumentation
6
6
  * @module Tiles
7
7
  */
8
- import { assert, utf8ToString } from "@itwin/core-bentley";
9
- import { Point3d, Vector3d } from "@itwin/core-geometry";
10
- import { BatchType, Feature, FeatureTable, PackedFeatureTable, PntsHeader, QParams3d, Quantization } from "@itwin/core-common";
8
+ import { Logger, utf8ToString } from "@itwin/core-bentley";
9
+ import { Point3d, Range3d, Vector3d } from "@itwin/core-geometry";
10
+ import { BatchType, Feature, FeatureTable, PackedFeatureTable, PntsHeader, QParams3d, QPoint3d, Quantization } from "@itwin/core-common";
11
+ import { FrontendLoggerCategory } from "../FrontendLoggerCategory";
11
12
  import { Mesh } from "../render/primitives/mesh/MeshPrimitives";
12
13
  import { PointCloudArgs } from "../render/primitives/PointCloudPrimitive";
14
+ async function decodeDracoPointCloud(buf) {
15
+ var _a, _b, _c, _d, _e, _f;
16
+ try {
17
+ const dracoLoader = (await import("@loaders.gl/draco")).DracoLoader;
18
+ const mesh = await dracoLoader.parse(buf, {});
19
+ if (mesh.topology !== "point-list")
20
+ return undefined;
21
+ const pos = (_a = mesh.attributes.POSITION) === null || _a === void 0 ? void 0 : _a.value;
22
+ if (!pos || (pos.length % 3) !== 0)
23
+ return undefined;
24
+ let colors = (_c = (_b = mesh.attributes.RGB) === null || _b === void 0 ? void 0 : _b.value) !== null && _c !== void 0 ? _c : (_d = mesh.attributes.COLOR_0) === null || _d === void 0 ? void 0 : _d.value;
25
+ if (!colors) {
26
+ const rgba = (_e = mesh.attributes.RGBA) === null || _e === void 0 ? void 0 : _e.value;
27
+ if (rgba && (rgba.length % 4) === 0) {
28
+ // We currently don't support alpha channel for point clouds - strip it.
29
+ colors = new Uint8Array(3 * rgba.length / 4);
30
+ let j = 0;
31
+ for (let i = 0; i < rgba.length; i += 4) {
32
+ colors[j++] = rgba[i];
33
+ colors[j++] = rgba[i + 1];
34
+ colors[j++] = rgba[i + 2];
35
+ }
36
+ }
37
+ }
38
+ let posRange;
39
+ const bbox = (_f = mesh.header) === null || _f === void 0 ? void 0 : _f.boundingBox;
40
+ if (bbox) {
41
+ posRange = Range3d.createXYZXYZ(bbox[0][0], bbox[0][1], bbox[0][2], bbox[1][0], bbox[1][1], bbox[1][2]);
42
+ }
43
+ else {
44
+ posRange = Range3d.createNull();
45
+ for (let i = 0; i < pos.length; i += 3)
46
+ posRange.extendXYZ(pos[i], pos[i + 1], pos[i + 2]);
47
+ }
48
+ const params = QParams3d.fromRange(posRange);
49
+ const pt = Point3d.createZero();
50
+ const qpt = QPoint3d.create(pt, params);
51
+ const points = new Uint16Array(pos.length);
52
+ for (let i = 0; i < pos.length; i += 3) {
53
+ pt.set(pos[i], pos[i + 1], pos[i + 2]);
54
+ qpt.init(pt, params);
55
+ points[i] = qpt.x;
56
+ points[i + 1] = qpt.y;
57
+ points[i + 2] = qpt.z;
58
+ }
59
+ return { points, params, colors: colors instanceof Uint8Array ? colors : undefined };
60
+ }
61
+ catch (err) {
62
+ Logger.logWarning(FrontendLoggerCategory.Render, "Failed to decode draco-encoded point cloud");
63
+ Logger.logException(FrontendLoggerCategory.Render, err);
64
+ return undefined;
65
+ }
66
+ }
67
+ function readPnts(stream, dataOffset, pnts) {
68
+ const offset = pnts.QUANTIZED_VOLUME_OFFSET;
69
+ const scale = pnts.QUANTIZED_VOLUME_SCALE;
70
+ const qpos = pnts.POSITION_QUANTIZED;
71
+ const nPts = pnts.POINTS_LENGTH;
72
+ if (!offset || !scale || !qpos || !nPts)
73
+ return undefined;
74
+ const qOrigin = new Point3d(offset[0], offset[1], offset[2]);
75
+ const qScale = new Point3d(Quantization.computeScale(scale[0]), Quantization.computeScale(scale[1]), Quantization.computeScale(scale[2]));
76
+ return {
77
+ params: QParams3d.fromOriginAndScale(qOrigin, qScale),
78
+ points: new Uint16Array(stream.arrayBuffer, dataOffset + qpos.byteOffset, 3 * nPts),
79
+ colors: pnts.RGB ? new Uint8Array(stream.arrayBuffer, dataOffset + pnts.RGB.byteOffset, 3 * nPts) : undefined,
80
+ };
81
+ }
13
82
  /** Deserialize a point cloud tile and return it as a RenderGraphic.
14
83
  * @internal
15
84
  */
16
- export function readPointCloudTileContent(stream, iModel, modelId, _is3d, range, system) {
17
- var _a;
85
+ export async function readPointCloudTileContent(stream, iModel, modelId, _is3d, range, system) {
18
86
  const header = new PntsHeader(stream);
19
87
  if (!header.isValid)
20
88
  return undefined;
@@ -24,50 +92,35 @@ export function readPointCloudTileContent(stream, iModel, modelId, _is3d, range,
24
92
  const featureValue = JSON.parse(featureStr);
25
93
  if (undefined === featureValue)
26
94
  return undefined;
27
- let qParams, qPoints;
28
- let colors;
29
- const dracoPointExtension = featureValue.extensions ? featureValue.extensions["3DTILES_draco_point_compression"] : undefined;
95
+ let props;
30
96
  const dataOffset = featureTableJsonOffset + header.featureTableJsonLength;
31
- if (dracoPointExtension && dracoPointExtension.byteLength !== undefined && dracoPointExtension.byteOffset !== undefined && ((_a = dracoPointExtension.properties) === null || _a === void 0 ? void 0 : _a.POSITION) !== undefined) {
32
- return undefined; // Defer Draco decompression until web workers implementation.
33
- /*
34
- const bufferData = new Uint8Array(stream.arrayBuffer, dataOffset + dracoPointExtension.byteOffset, dracoPointExtension.byteLength);
35
- const decoded = DracoDecoder.readDracoPointCloud(bufferData, dracoPointExtension.properties?.POSITION, dracoPointExtension.properties?.RGB);
36
- if (decoded) {
37
- qPoints = decoded.qPoints;
38
- qParams = decoded.qParams;
39
- colors = decoded.colors; */
97
+ const draco = featureValue.extensions ? featureValue.extensions["3DTILES_draco_point_compression"] : undefined;
98
+ if (draco) {
99
+ try {
100
+ const buf = new Uint8Array(stream.arrayBuffer, dataOffset + draco.byteOffset, draco.byteLength);
101
+ props = await decodeDracoPointCloud(buf);
102
+ }
103
+ catch (_) {
104
+ //
105
+ }
40
106
  }
41
107
  else {
42
- if (undefined === featureValue.POSITION_QUANTIZED ||
43
- undefined === featureValue.QUANTIZED_VOLUME_OFFSET ||
44
- undefined === featureValue.QUANTIZED_VOLUME_SCALE ||
45
- undefined === featureValue.POINTS_LENGTH ||
46
- undefined === featureValue.POSITION_QUANTIZED) {
47
- assert(false, "quantized point cloud points not found");
48
- return undefined;
49
- }
50
- const qOrigin = new Point3d(featureValue.QUANTIZED_VOLUME_OFFSET[0], featureValue.QUANTIZED_VOLUME_OFFSET[1], featureValue.QUANTIZED_VOLUME_OFFSET[2]);
51
- const qScale = new Point3d(Quantization.computeScale(featureValue.QUANTIZED_VOLUME_SCALE[0]), Quantization.computeScale(featureValue.QUANTIZED_VOLUME_SCALE[1]), Quantization.computeScale(featureValue.QUANTIZED_VOLUME_SCALE[2]));
52
- qParams = QParams3d.fromOriginAndScale(qOrigin, qScale);
53
- qPoints = new Uint16Array(stream.arrayBuffer, dataOffset + featureValue.POSITION_QUANTIZED.byteOffset, 3 * featureValue.POINTS_LENGTH);
54
- if (undefined !== featureValue.RGB)
55
- colors = new Uint8Array(stream.arrayBuffer, dataOffset + featureValue.RGB.byteOffset, 3 * featureValue.POINTS_LENGTH);
108
+ props = readPnts(stream, dataOffset, featureValue);
56
109
  }
57
- if (!qPoints || !qParams)
110
+ if (!props)
58
111
  return undefined;
59
112
  if (featureValue.RTC_CENTER)
60
- qParams = QParams3d.fromOriginAndScale(qParams.origin.plus(Vector3d.fromJSON(featureValue.RTC_CENTER)), qParams.scale);
61
- if (undefined === colors) {
62
- colors = new Uint8Array(3 * featureValue.POINTS_LENGTH);
63
- colors.fill(0xff, 0, colors.length); // TBD... Default color?
113
+ props.params = QParams3d.fromOriginAndScale(props.params.origin.plus(Vector3d.fromJSON(featureValue.RTC_CENTER)), props.params.scale);
114
+ if (!props.colors) {
115
+ props.colors = new Uint8Array(3 * featureValue.POINTS_LENGTH);
116
+ props.colors.fill(0xff, 0, props.colors.length); // TBD... Default color?
64
117
  }
65
118
  // ###TODO? Do we expect a batch table? not currently handled...
66
119
  const featureTable = new FeatureTable(1, modelId, BatchType.Primary);
67
120
  const features = new Mesh.Features(featureTable);
68
121
  features.add(new Feature(modelId), 1);
69
- const voxelSize = qParams.rangeDiagonal.maxAbs() / 256;
70
- let renderGraphic = system.createPointCloud(new PointCloudArgs(qPoints, qParams, colors, features, voxelSize), iModel);
122
+ const voxelSize = props.params.rangeDiagonal.maxAbs() / 256;
123
+ let renderGraphic = system.createPointCloud(new PointCloudArgs(props.points, props.params, props.colors, features, voxelSize), iModel);
71
124
  renderGraphic = system.createBatch(renderGraphic, PackedFeatureTable.pack(featureTable), range);
72
125
  return renderGraphic;
73
126
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PntsReader.js","sourceRoot":"","sources":["../../../src/tile/PntsReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\nimport { assert, ByteStream, Id64String, utf8ToString } from \"@itwin/core-bentley\";\r\nimport { Point3d, Vector3d } from \"@itwin/core-geometry\";\r\nimport { BatchType, ElementAlignedBox3d, Feature, FeatureTable, PackedFeatureTable, PntsHeader, QParams3d, Quantization } from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"../IModelConnection\";\r\nimport { Mesh } from \"../render/primitives/mesh/MeshPrimitives\";\r\nimport { PointCloudArgs } from \"../render/primitives/PointCloudPrimitive\";\r\nimport { RenderGraphic } from \"../render/RenderGraphic\";\r\nimport { RenderSystem } from \"../render/RenderSystem\";\r\n\r\n/** Deserialize a point cloud tile and return it as a RenderGraphic.\r\n * @internal\r\n */\r\nexport function readPointCloudTileContent(stream: ByteStream, iModel: IModelConnection, modelId: Id64String, _is3d: boolean, range: ElementAlignedBox3d, system: RenderSystem): RenderGraphic | undefined {\r\n const header = new PntsHeader(stream);\r\n\r\n if (!header.isValid)\r\n return undefined;\r\n\r\n const featureTableJsonOffset = stream.curPos;\r\n const featureStrData = stream.nextBytes(header.featureTableJsonLength);\r\n const featureStr = utf8ToString(featureStrData);\r\n const featureValue = JSON.parse(featureStr as string);\r\n\r\n if (undefined === featureValue)\r\n return undefined;\r\n\r\n let qParams, qPoints;\r\n let colors: Uint8Array | undefined;\r\n const dracoPointExtension = featureValue.extensions ? featureValue.extensions[\"3DTILES_draco_point_compression\"] : undefined;\r\n const dataOffset = featureTableJsonOffset + header.featureTableJsonLength;\r\n if (dracoPointExtension && dracoPointExtension.byteLength !== undefined && dracoPointExtension.byteOffset !== undefined && dracoPointExtension.properties?.POSITION !== undefined) {\r\n return undefined; // Defer Draco decompression until web workers implementation.\r\n /*\r\n const bufferData = new Uint8Array(stream.arrayBuffer, dataOffset + dracoPointExtension.byteOffset, dracoPointExtension.byteLength);\r\n const decoded = DracoDecoder.readDracoPointCloud(bufferData, dracoPointExtension.properties?.POSITION, dracoPointExtension.properties?.RGB);\r\n if (decoded) {\r\n qPoints = decoded.qPoints;\r\n qParams = decoded.qParams;\r\n colors = decoded.colors; */\r\n } else {\r\n if (undefined === featureValue.POSITION_QUANTIZED ||\r\n undefined === featureValue.QUANTIZED_VOLUME_OFFSET ||\r\n undefined === featureValue.QUANTIZED_VOLUME_SCALE ||\r\n undefined === featureValue.POINTS_LENGTH ||\r\n undefined === featureValue.POSITION_QUANTIZED) {\r\n assert(false, \"quantized point cloud points not found\");\r\n return undefined;\r\n }\r\n\r\n const qOrigin = new Point3d(featureValue.QUANTIZED_VOLUME_OFFSET[0], featureValue.QUANTIZED_VOLUME_OFFSET[1], featureValue.QUANTIZED_VOLUME_OFFSET[2]);\r\n const qScale = new Point3d(Quantization.computeScale(featureValue.QUANTIZED_VOLUME_SCALE[0]), Quantization.computeScale(featureValue.QUANTIZED_VOLUME_SCALE[1]), Quantization.computeScale(featureValue.QUANTIZED_VOLUME_SCALE[2]));\r\n qParams = QParams3d.fromOriginAndScale(qOrigin, qScale);\r\n qPoints = new Uint16Array(stream.arrayBuffer, dataOffset + featureValue.POSITION_QUANTIZED.byteOffset, 3 * featureValue.POINTS_LENGTH);\r\n if (undefined !== featureValue.RGB)\r\n colors = new Uint8Array(stream.arrayBuffer, dataOffset + featureValue.RGB.byteOffset, 3 * featureValue.POINTS_LENGTH);\r\n }\r\n if (!qPoints || !qParams)\r\n return undefined;\r\n\r\n if (featureValue.RTC_CENTER)\r\n qParams = QParams3d.fromOriginAndScale(qParams.origin.plus(Vector3d.fromJSON(featureValue.RTC_CENTER)), qParams.scale);\r\n\r\n if (undefined === colors) {\r\n colors = new Uint8Array(3 * featureValue.POINTS_LENGTH);\r\n colors.fill(0xff, 0, colors.length); // TBD... Default color?\r\n }\r\n\r\n // ###TODO? Do we expect a batch table? not currently handled...\r\n const featureTable = new FeatureTable(1, modelId, BatchType.Primary);\r\n const features = new Mesh.Features(featureTable);\r\n features.add(new Feature(modelId), 1);\r\n const voxelSize = qParams.rangeDiagonal.maxAbs() / 256;\r\n\r\n let renderGraphic = system.createPointCloud(new PointCloudArgs(qPoints, qParams, colors, features, voxelSize), iModel);\r\n renderGraphic = system.createBatch(renderGraphic!, PackedFeatureTable.pack(featureTable), range);\r\n return renderGraphic;\r\n}\r\n"]}
1
+ {"version":3,"file":"PntsReader.js","sourceRoot":"","sources":["../../../src/tile/PntsReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\nimport { ByteStream, Id64String, Logger, utf8ToString } from \"@itwin/core-bentley\";\r\nimport { Point3d, Range3d, Vector3d } from \"@itwin/core-geometry\";\r\nimport { BatchType, ElementAlignedBox3d, Feature, FeatureTable, PackedFeatureTable, PntsHeader, QParams3d, QPoint3d, Quantization } from \"@itwin/core-common\";\r\nimport { FrontendLoggerCategory } from \"../FrontendLoggerCategory\";\r\nimport { IModelConnection } from \"../IModelConnection\";\r\nimport { Mesh } from \"../render/primitives/mesh/MeshPrimitives\";\r\nimport { PointCloudArgs } from \"../render/primitives/PointCloudPrimitive\";\r\nimport { RenderGraphic } from \"../render/RenderGraphic\";\r\nimport { RenderSystem } from \"../render/RenderSystem\";\r\n\r\n/** Schema for the [3DTILES_draco_point_compression](https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_draco_point_compression) extension. */\r\ninterface DracoPointCloud {\r\n byteLength: number;\r\n byteOffset: number;\r\n /** Each specifies the Id of a compressed attribute. */\r\n properties: {\r\n POSITION?: number; // eslint-disable-line @typescript-eslint/naming-convention\r\n RGB?: number; // eslint-disable-line @typescript-eslint/naming-convention\r\n RGBA?: number; // eslint-disable-line @typescript-eslint/naming-convention\r\n NORMAL?: number; // eslint-disable-line @typescript-eslint/naming-convention\r\n BATCH_ID?: number; // eslint-disable-line @typescript-eslint/naming-convention\r\n /** This is not in the spec but is present in sample data in Cesium's git repository. */\r\n COLOR_0?: number; // eslint-disable-line @typescript-eslint/naming-convention\r\n };\r\n}\r\n\r\ninterface PointCloudProps {\r\n params: QParams3d;\r\n points: Uint16Array;\r\n colors?: Uint8Array;\r\n}\r\n\r\nasync function decodeDracoPointCloud(buf: Uint8Array): Promise<PointCloudProps | undefined> {\r\n try {\r\n const dracoLoader = (await import(\"@loaders.gl/draco\")).DracoLoader;\r\n const mesh = await dracoLoader.parse(buf, { });\r\n if (mesh.topology !== \"point-list\")\r\n return undefined;\r\n\r\n const pos = mesh.attributes.POSITION?.value;\r\n if (!pos || (pos.length % 3) !== 0)\r\n return undefined;\r\n\r\n let colors = mesh.attributes.RGB?.value ?? mesh.attributes.COLOR_0?.value;\r\n if (!colors) {\r\n const rgba = mesh.attributes.RGBA?.value;\r\n if (rgba && (rgba.length % 4) === 0) {\r\n // We currently don't support alpha channel for point clouds - strip it.\r\n colors = new Uint8Array(3 * rgba.length / 4);\r\n let j = 0;\r\n for (let i = 0; i < rgba.length; i += 4) {\r\n colors[j++] = rgba[i];\r\n colors[j++] = rgba[i + 1];\r\n colors[j++] = rgba[i + 2];\r\n }\r\n }\r\n }\r\n\r\n let posRange: Range3d;\r\n const bbox = mesh.header?.boundingBox;\r\n if (bbox) {\r\n posRange = Range3d.createXYZXYZ(bbox[0][0], bbox[0][1], bbox[0][2], bbox[1][0], bbox[1][1], bbox[1][2]);\r\n } else {\r\n posRange = Range3d.createNull();\r\n for (let i = 0; i < pos.length; i += 3)\r\n posRange.extendXYZ(pos[i], pos[i + 1], pos[i + 2]);\r\n }\r\n\r\n const params = QParams3d.fromRange(posRange);\r\n const pt = Point3d.createZero();\r\n const qpt = QPoint3d.create(pt, params);\r\n const points = new Uint16Array(pos.length);\r\n for (let i = 0; i < pos.length; i += 3) {\r\n pt.set(pos[i], pos[i + 1], pos[i + 2]);\r\n qpt.init(pt, params);\r\n points[i] = qpt.x;\r\n points[i + 1] = qpt.y;\r\n points[i + 2] = qpt.z;\r\n }\r\n\r\n return { points, params, colors: colors instanceof Uint8Array ? colors : undefined };\r\n } catch (err) {\r\n Logger.logWarning(FrontendLoggerCategory.Render, \"Failed to decode draco-encoded point cloud\");\r\n Logger.logException(FrontendLoggerCategory.Render, err);\r\n return undefined;\r\n }\r\n}\r\n\r\ninterface PntsProps {\r\n POSITION_QUANTIZED?: { byteOffset: number }; // eslint-disable-line @typescript-eslint/naming-convention\r\n QUANTIZED_VOLUME_OFFSET?: number[]; // eslint-disable-line @typescript-eslint/naming-convention\r\n QUANTIZED_VOLUME_SCALE?: number[]; // eslint-disable-line @typescript-eslint/naming-convention\r\n POINTS_LENGTH?: number; // eslint-disable-line @typescript-eslint/naming-convention\r\n RGB?: { byteOffset: number }; // eslint-disable-line @typescript-eslint/naming-convention\r\n}\r\n\r\nfunction readPnts(stream: ByteStream, dataOffset: number, pnts: PntsProps): PointCloudProps | undefined {\r\n const offset = pnts.QUANTIZED_VOLUME_OFFSET;\r\n const scale = pnts.QUANTIZED_VOLUME_SCALE;\r\n const qpos = pnts.POSITION_QUANTIZED;\r\n const nPts = pnts.POINTS_LENGTH;\r\n if (!offset || !scale || !qpos || !nPts)\r\n return undefined;\r\n\r\n const qOrigin = new Point3d(offset[0], offset[1], offset[2]);\r\n const qScale = new Point3d(Quantization.computeScale(scale[0]), Quantization.computeScale(scale[1]), Quantization.computeScale(scale[2]));\r\n\r\n return {\r\n params: QParams3d.fromOriginAndScale(qOrigin, qScale),\r\n points: new Uint16Array(stream.arrayBuffer, dataOffset + qpos.byteOffset, 3 * nPts),\r\n colors: pnts.RGB ? new Uint8Array(stream.arrayBuffer, dataOffset + pnts.RGB.byteOffset, 3 * nPts) : undefined,\r\n };\r\n}\r\n\r\n/** Deserialize a point cloud tile and return it as a RenderGraphic.\r\n * @internal\r\n */\r\nexport async function readPointCloudTileContent(stream: ByteStream, iModel: IModelConnection, modelId: Id64String, _is3d: boolean, range: ElementAlignedBox3d, system: RenderSystem): Promise<RenderGraphic | undefined> {\r\n const header = new PntsHeader(stream);\r\n if (!header.isValid)\r\n return undefined;\r\n\r\n const featureTableJsonOffset = stream.curPos;\r\n const featureStrData = stream.nextBytes(header.featureTableJsonLength);\r\n const featureStr = utf8ToString(featureStrData);\r\n const featureValue = JSON.parse(featureStr as string);\r\n\r\n if (undefined === featureValue)\r\n return undefined;\r\n\r\n let props: PointCloudProps | undefined;\r\n const dataOffset = featureTableJsonOffset + header.featureTableJsonLength;\r\n const draco: DracoPointCloud | undefined = featureValue.extensions ? featureValue.extensions[\"3DTILES_draco_point_compression\"] : undefined;\r\n if (draco) {\r\n try {\r\n const buf = new Uint8Array(stream.arrayBuffer, dataOffset + draco.byteOffset, draco.byteLength);\r\n props = await decodeDracoPointCloud(buf);\r\n } catch (_) {\r\n //\r\n }\r\n } else {\r\n props = readPnts(stream, dataOffset, featureValue);\r\n }\r\n\r\n if (!props)\r\n return undefined;\r\n\r\n if (featureValue.RTC_CENTER)\r\n props.params = QParams3d.fromOriginAndScale(props.params.origin.plus(Vector3d.fromJSON(featureValue.RTC_CENTER)), props.params.scale);\r\n\r\n if (!props.colors) {\r\n props.colors = new Uint8Array(3 * featureValue.POINTS_LENGTH);\r\n props.colors.fill(0xff, 0, props.colors.length); // TBD... Default color?\r\n }\r\n\r\n // ###TODO? Do we expect a batch table? not currently handled...\r\n const featureTable = new FeatureTable(1, modelId, BatchType.Primary);\r\n const features = new Mesh.Features(featureTable);\r\n features.add(new Feature(modelId), 1);\r\n const voxelSize = props.params.rangeDiagonal.maxAbs() / 256;\r\n\r\n let renderGraphic = system.createPointCloud(new PointCloudArgs(props.points, props.params, props.colors, features, voxelSize), iModel);\r\n renderGraphic = system.createBatch(renderGraphic!, PackedFeatureTable.pack(featureTable), range);\r\n return renderGraphic;\r\n}\r\n"]}
@@ -68,7 +68,7 @@ export class RealityTileLoader {
68
68
  switch (format) {
69
69
  case TileFormat.Pnts:
70
70
  this._containsPointClouds = true;
71
- let graphic = readPointCloudTileContent(streamBuffer, iModel, modelId, is3d, tile.contentRange, system);
71
+ let graphic = await readPointCloudTileContent(streamBuffer, iModel, modelId, is3d, tile.contentRange, system);
72
72
  if (graphic && tile.transformToRoot && !tile.transformToRoot.isIdentity) {
73
73
  const transformBranch = new GraphicBranch(true);
74
74
  transformBranch.add(graphic);
@@ -1 +1 @@
1
- {"version":3,"file":"RealityTileLoader.js","sourceRoot":"","sources":["../../../src/tile/RealityTileLoader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\nimport { assert, ByteStream } from \"@itwin/core-bentley\";\r\nimport { Point3d, Transform } from \"@itwin/core-geometry\";\r\nimport { BatchType, CompositeTileHeader, TileFormat, ViewFlagOverrides } from \"@itwin/core-common\";\r\nimport { IModelApp } from \"../IModelApp\";\r\nimport { GraphicBranch } from \"../render/GraphicBranch\";\r\nimport { RenderSystem } from \"../render/RenderSystem\";\r\nimport { Viewport } from \"../Viewport\";\r\nimport {\r\n B3dmReader, BatchedTileIdMap, createDefaultViewFlagOverrides, GltfReader, I3dmReader, readPointCloudTileContent, RealityTile, RealityTileContent, Tile, TileContent,\n TileDrawArgs, TileLoadPriority, TileRequest, TileRequestChannel, TileUser,\n} from \"./internal\";\r\n\r\nconst defaultViewFlagOverrides = createDefaultViewFlagOverrides({});\r\n\r\nconst scratchTileCenterWorld = new Point3d();\r\nconst scratchTileCenterView = new Point3d();\r\n\r\n/** Serves as a \"handler\" for a specific type of [[TileTree]]. Its primary responsibilities involve loading tile content.\r\n * @internal\r\n */\r\nexport abstract class RealityTileLoader {\r\n private _containsPointClouds = false;\r\n public readonly preloadRealityParentDepth: number;\r\n public readonly preloadRealityParentSkip: number;\r\n\r\n public constructor(private _produceGeometry?: boolean) {\r\n this.preloadRealityParentDepth = IModelApp.tileAdmin.contextPreloadParentDepth;\r\n this.preloadRealityParentSkip = IModelApp.tileAdmin.contextPreloadParentSkip;\r\n }\r\n\r\n public computeTilePriority(tile: Tile, viewports: Iterable<Viewport>, _users: Iterable<TileUser>): number {\r\n // ###TODO: Handle case where tile tree reference(s) have a transform different from tree's (background map with ground bias).\r\n return RealityTileLoader.computeTileClosestToEyePriority(tile, viewports, tile.tree.iModelTransform);\r\n }\r\n\r\n public abstract loadChildren(tile: RealityTile): Promise<Tile[] | undefined>;\r\n public abstract getRequestChannel(tile: Tile): TileRequestChannel;\r\n public abstract requestTileContent(tile: Tile, isCanceled: () => boolean): Promise<TileRequest.Response>;\r\n public get wantDeduplicatedVertices(): boolean { return false; }\r\n public abstract get maxDepth(): number;\r\n public abstract get minDepth(): number;\r\n public abstract get priority(): TileLoadPriority;\r\n protected get _batchType(): BatchType { return BatchType.Primary; }\r\n protected get _loadEdges(): boolean { return true; }\r\n public getBatchIdMap(): BatchedTileIdMap | undefined { return undefined; }\r\n public get isContentUnbounded(): boolean { return false; }\r\n public get containsPointClouds(): boolean { return this._containsPointClouds; }\r\n public get parentsAndChildrenExclusive(): boolean { return true; }\r\n public forceTileLoad(_tile: Tile): boolean { return false; }\r\n\r\n public processSelectedTiles(selected: Tile[], _args: TileDrawArgs): Tile[] { return selected; }\r\n\r\n // NB: The isCanceled arg is chiefly for tests...in usual case it just returns false if the tile is no longer in 'loading' state.\r\n public async loadTileContent(tile: Tile, data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<RealityTileContent> {\r\n assert(data instanceof Uint8Array);\r\n const blob = data;\r\n const streamBuffer = ByteStream.fromUint8Array(blob);\r\n const realityTile = tile as RealityTile;\r\n return this._produceGeometry ? this.loadGeometryFromStream(realityTile, streamBuffer, system) : this.loadGraphicsFromStream(realityTile, streamBuffer, system, isCanceled);\r\n }\r\n\r\n private _getFormat(streamBuffer: ByteStream) {\r\n const position = streamBuffer.curPos;\r\n const format = streamBuffer.nextUint32;\r\n streamBuffer.curPos = position;\r\n return format;\r\n\r\n }\r\n\r\n public async loadGeometryFromStream(tile: RealityTile, streamBuffer: ByteStream, system: RenderSystem): Promise<RealityTileContent> {\r\n const format = this._getFormat(streamBuffer);\r\n if (format !== TileFormat.B3dm)\r\n return {};\r\n\r\n const { is3d, yAxisUp, iModel, modelId } = tile.realityRoot;\r\n const reader = B3dmReader.create(streamBuffer, iModel, modelId, is3d, tile.contentRange, system, yAxisUp, tile.isLeaf, tile.center, tile.transformToRoot, undefined, this.getBatchIdMap());\r\n return { geometry: reader?.readGltfAndCreateGeometry(tile.tree.iModelTransform) };\r\n }\r\n\r\n private async loadGraphicsFromStream(tile: RealityTile, streamBuffer: ByteStream, system: RenderSystem, isCanceled?: () => boolean): Promise<TileContent> {\r\n const format = this._getFormat(streamBuffer);\r\n if (undefined === isCanceled)\r\n isCanceled = () => !tile.isLoading;\r\n\r\n const { is3d, yAxisUp, iModel, modelId } = tile.realityRoot;\r\n let reader: GltfReader | undefined;\r\n switch (format) {\r\n case TileFormat.Pnts:\r\n this._containsPointClouds = true;\r\n let graphic = readPointCloudTileContent(streamBuffer, iModel, modelId, is3d, tile.contentRange, system);\r\n if (graphic && tile.transformToRoot && !tile.transformToRoot.isIdentity) {\r\n const transformBranch = new GraphicBranch(true);\r\n transformBranch.add(graphic);\r\n graphic = system.createBranch(transformBranch, tile.transformToRoot);\r\n }\r\n\r\n return { graphic };\r\n\r\n case TileFormat.B3dm:\r\n reader = B3dmReader.create(streamBuffer, iModel, modelId, is3d, tile.contentRange, system, yAxisUp, tile.isLeaf, tile.center, tile.transformToRoot, isCanceled, this.getBatchIdMap(), this.wantDeduplicatedVertices);\r\n break;\r\n case TileFormat.I3dm:\r\n reader = I3dmReader.create(streamBuffer, iModel, modelId, is3d, tile.contentRange, system, yAxisUp, tile.isLeaf, isCanceled, undefined, this.wantDeduplicatedVertices);\r\n break;\r\n case TileFormat.Cmpt:\r\n const header = new CompositeTileHeader(streamBuffer);\r\n if (!header.isValid) return {};\r\n const branch = new GraphicBranch(true);\r\n for (let i = 0; i < header.tileCount; i++) {\r\n const tilePosition = streamBuffer.curPos;\r\n streamBuffer.advance(8); // Skip magic and version.\r\n const tileBytes = streamBuffer.nextUint32;\r\n streamBuffer.curPos = tilePosition;\r\n const result = await this.loadGraphicsFromStream(tile, streamBuffer, system, isCanceled);\r\n if (result.graphic)\r\n branch.add(result.graphic);\r\n streamBuffer.curPos = tilePosition + tileBytes;\r\n }\r\n return { graphic: branch.isEmpty ? undefined : system.createBranch(branch, Transform.createIdentity()), isLeaf: tile.isLeaf };\r\n\r\n default:\r\n assert(false, `unknown tile format ${format}`);\r\n break;\r\n }\r\n\r\n let content: TileContent = {};\r\n if (undefined !== reader) {\r\n try {\r\n content = await reader.read();\r\n } catch (_err) {\r\n // Failure to load should prevent us from trying to load children\r\n content.isLeaf = true;\r\n }\r\n }\r\n\r\n return content;\r\n }\r\n\r\n public get viewFlagOverrides(): ViewFlagOverrides { return defaultViewFlagOverrides; }\r\n\r\n public static computeTileClosestToEyePriority(tile: Tile, viewports: Iterable<Viewport>, location: Transform): number {\r\n // Prioritize tiles closer to eye.\r\n // NB: In NPC coords, 0 = far plane, 1 = near plane.\r\n const center = location.multiplyPoint3d(tile.center, scratchTileCenterWorld);\r\n let minDistance = 1.0;\r\n for (const viewport of viewports) {\r\n const npc = viewport.worldToNpc(center, scratchTileCenterView);\r\n const distance = 1.0 - npc.z;\r\n minDistance = Math.min(distance, minDistance);\r\n }\r\n\r\n return minDistance;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"RealityTileLoader.js","sourceRoot":"","sources":["../../../src/tile/RealityTileLoader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\nimport { assert, ByteStream } from \"@itwin/core-bentley\";\r\nimport { Point3d, Transform } from \"@itwin/core-geometry\";\r\nimport { BatchType, CompositeTileHeader, TileFormat, ViewFlagOverrides } from \"@itwin/core-common\";\r\nimport { IModelApp } from \"../IModelApp\";\r\nimport { GraphicBranch } from \"../render/GraphicBranch\";\r\nimport { RenderSystem } from \"../render/RenderSystem\";\r\nimport { Viewport } from \"../Viewport\";\r\nimport {\r\n B3dmReader, BatchedTileIdMap, createDefaultViewFlagOverrides, GltfReader, I3dmReader, readPointCloudTileContent, RealityTile, RealityTileContent, Tile, TileContent,\r\n TileDrawArgs, TileLoadPriority, TileRequest, TileRequestChannel, TileUser,\r\n} from \"./internal\";\r\n\r\nconst defaultViewFlagOverrides = createDefaultViewFlagOverrides({});\r\n\r\nconst scratchTileCenterWorld = new Point3d();\r\nconst scratchTileCenterView = new Point3d();\r\n\r\n/** Serves as a \"handler\" for a specific type of [[TileTree]]. Its primary responsibilities involve loading tile content.\r\n * @internal\r\n */\r\nexport abstract class RealityTileLoader {\r\n private _containsPointClouds = false;\r\n public readonly preloadRealityParentDepth: number;\r\n public readonly preloadRealityParentSkip: number;\r\n\r\n public constructor(private _produceGeometry?: boolean) {\r\n this.preloadRealityParentDepth = IModelApp.tileAdmin.contextPreloadParentDepth;\r\n this.preloadRealityParentSkip = IModelApp.tileAdmin.contextPreloadParentSkip;\r\n }\r\n\r\n public computeTilePriority(tile: Tile, viewports: Iterable<Viewport>, _users: Iterable<TileUser>): number {\r\n // ###TODO: Handle case where tile tree reference(s) have a transform different from tree's (background map with ground bias).\r\n return RealityTileLoader.computeTileClosestToEyePriority(tile, viewports, tile.tree.iModelTransform);\r\n }\r\n\r\n public abstract loadChildren(tile: RealityTile): Promise<Tile[] | undefined>;\r\n public abstract getRequestChannel(tile: Tile): TileRequestChannel;\r\n public abstract requestTileContent(tile: Tile, isCanceled: () => boolean): Promise<TileRequest.Response>;\r\n public get wantDeduplicatedVertices(): boolean { return false; }\r\n public abstract get maxDepth(): number;\r\n public abstract get minDepth(): number;\r\n public abstract get priority(): TileLoadPriority;\r\n protected get _batchType(): BatchType { return BatchType.Primary; }\r\n protected get _loadEdges(): boolean { return true; }\r\n public getBatchIdMap(): BatchedTileIdMap | undefined { return undefined; }\r\n public get isContentUnbounded(): boolean { return false; }\r\n public get containsPointClouds(): boolean { return this._containsPointClouds; }\r\n public get parentsAndChildrenExclusive(): boolean { return true; }\r\n public forceTileLoad(_tile: Tile): boolean { return false; }\r\n\r\n public processSelectedTiles(selected: Tile[], _args: TileDrawArgs): Tile[] { return selected; }\r\n\r\n // NB: The isCanceled arg is chiefly for tests...in usual case it just returns false if the tile is no longer in 'loading' state.\r\n public async loadTileContent(tile: Tile, data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<RealityTileContent> {\r\n assert(data instanceof Uint8Array);\r\n const blob = data;\r\n const streamBuffer = ByteStream.fromUint8Array(blob);\r\n const realityTile = tile as RealityTile;\r\n return this._produceGeometry ? this.loadGeometryFromStream(realityTile, streamBuffer, system) : this.loadGraphicsFromStream(realityTile, streamBuffer, system, isCanceled);\r\n }\r\n\r\n private _getFormat(streamBuffer: ByteStream) {\r\n const position = streamBuffer.curPos;\r\n const format = streamBuffer.nextUint32;\r\n streamBuffer.curPos = position;\r\n return format;\r\n\r\n }\r\n\r\n public async loadGeometryFromStream(tile: RealityTile, streamBuffer: ByteStream, system: RenderSystem): Promise<RealityTileContent> {\r\n const format = this._getFormat(streamBuffer);\r\n if (format !== TileFormat.B3dm)\r\n return {};\r\n\r\n const { is3d, yAxisUp, iModel, modelId } = tile.realityRoot;\r\n const reader = B3dmReader.create(streamBuffer, iModel, modelId, is3d, tile.contentRange, system, yAxisUp, tile.isLeaf, tile.center, tile.transformToRoot, undefined, this.getBatchIdMap());\r\n return { geometry: reader?.readGltfAndCreateGeometry(tile.tree.iModelTransform) };\r\n }\r\n\r\n private async loadGraphicsFromStream(tile: RealityTile, streamBuffer: ByteStream, system: RenderSystem, isCanceled?: () => boolean): Promise<TileContent> {\r\n const format = this._getFormat(streamBuffer);\r\n if (undefined === isCanceled)\r\n isCanceled = () => !tile.isLoading;\r\n\r\n const { is3d, yAxisUp, iModel, modelId } = tile.realityRoot;\r\n let reader: GltfReader | undefined;\r\n switch (format) {\r\n case TileFormat.Pnts:\r\n this._containsPointClouds = true;\r\n let graphic = await readPointCloudTileContent(streamBuffer, iModel, modelId, is3d, tile.contentRange, system);\r\n if (graphic && tile.transformToRoot && !tile.transformToRoot.isIdentity) {\r\n const transformBranch = new GraphicBranch(true);\r\n transformBranch.add(graphic);\r\n graphic = system.createBranch(transformBranch, tile.transformToRoot);\r\n }\r\n\r\n return { graphic };\r\n\r\n case TileFormat.B3dm:\r\n reader = B3dmReader.create(streamBuffer, iModel, modelId, is3d, tile.contentRange, system, yAxisUp, tile.isLeaf, tile.center, tile.transformToRoot, isCanceled, this.getBatchIdMap(), this.wantDeduplicatedVertices);\r\n break;\r\n case TileFormat.I3dm:\r\n reader = I3dmReader.create(streamBuffer, iModel, modelId, is3d, tile.contentRange, system, yAxisUp, tile.isLeaf, isCanceled, undefined, this.wantDeduplicatedVertices);\r\n break;\r\n case TileFormat.Cmpt:\r\n const header = new CompositeTileHeader(streamBuffer);\r\n if (!header.isValid) return {};\r\n const branch = new GraphicBranch(true);\r\n for (let i = 0; i < header.tileCount; i++) {\r\n const tilePosition = streamBuffer.curPos;\r\n streamBuffer.advance(8); // Skip magic and version.\r\n const tileBytes = streamBuffer.nextUint32;\r\n streamBuffer.curPos = tilePosition;\r\n const result = await this.loadGraphicsFromStream(tile, streamBuffer, system, isCanceled);\r\n if (result.graphic)\r\n branch.add(result.graphic);\r\n streamBuffer.curPos = tilePosition + tileBytes;\r\n }\r\n return { graphic: branch.isEmpty ? undefined : system.createBranch(branch, Transform.createIdentity()), isLeaf: tile.isLeaf };\r\n\r\n default:\r\n assert(false, `unknown tile format ${format}`);\r\n break;\r\n }\r\n\r\n let content: TileContent = {};\r\n if (undefined !== reader) {\r\n try {\r\n content = await reader.read();\r\n } catch (_err) {\r\n // Failure to load should prevent us from trying to load children\r\n content.isLeaf = true;\r\n }\r\n }\r\n\r\n return content;\r\n }\r\n\r\n public get viewFlagOverrides(): ViewFlagOverrides { return defaultViewFlagOverrides; }\r\n\r\n public static computeTileClosestToEyePriority(tile: Tile, viewports: Iterable<Viewport>, location: Transform): number {\r\n // Prioritize tiles closer to eye.\r\n // NB: In NPC coords, 0 = far plane, 1 = near plane.\r\n const center = location.multiplyPoint3d(tile.center, scratchTileCenterWorld);\r\n let minDistance = 1.0;\r\n for (const viewport of viewports) {\r\n const npc = viewport.worldToNpc(center, scratchTileCenterView);\r\n const distance = 1.0 - npc.z;\r\n minDistance = Math.min(distance, minDistance);\r\n }\r\n\r\n return minDistance;\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/core-frontend",
3
- "version": "3.1.0-dev.11",
3
+ "version": "3.1.0-dev.15",
4
4
  "description": "iTwin.js frontend components",
5
5
  "main": "lib/cjs/core-frontend.js",
6
6
  "module": "lib/esm/core-frontend.js",
@@ -23,29 +23,29 @@
23
23
  "url": "http://www.bentley.com"
24
24
  },
25
25
  "peerDependencies": {
26
- "@itwin/appui-abstract": "^3.1.0-dev.11",
27
- "@itwin/core-bentley": "^3.1.0-dev.11",
28
- "@itwin/core-common": "^3.1.0-dev.11",
29
- "@itwin/core-geometry": "^3.1.0-dev.11",
30
- "@itwin/core-orbitgt": "^3.1.0-dev.11",
31
- "@itwin/core-quantity": "^3.1.0-dev.11",
32
- "@itwin/webgl-compatibility": "^3.1.0-dev.11"
26
+ "@itwin/appui-abstract": "^3.1.0-dev.15",
27
+ "@itwin/core-bentley": "^3.1.0-dev.15",
28
+ "@itwin/core-common": "^3.1.0-dev.15",
29
+ "@itwin/core-geometry": "^3.1.0-dev.15",
30
+ "@itwin/core-orbitgt": "^3.1.0-dev.15",
31
+ "@itwin/core-quantity": "^3.1.0-dev.15",
32
+ "@itwin/webgl-compatibility": "^3.1.0-dev.15"
33
33
  },
34
34
  "//devDependencies": [
35
35
  "NOTE: All peerDependencies should also be listed as devDependencies since peerDependencies are not considered by npm install",
36
36
  "NOTE: All tools used by scripts in this package must be listed as devDependencies"
37
37
  ],
38
38
  "devDependencies": {
39
- "@itwin/appui-abstract": "3.1.0-dev.11",
40
- "@itwin/build-tools": "3.1.0-dev.11",
41
- "@itwin/core-bentley": "3.1.0-dev.11",
42
- "@itwin/core-common": "3.1.0-dev.11",
43
- "@itwin/core-geometry": "3.1.0-dev.11",
44
- "@itwin/core-orbitgt": "3.1.0-dev.11",
45
- "@itwin/core-quantity": "3.1.0-dev.11",
46
- "@itwin/certa": "3.1.0-dev.11",
47
- "@itwin/eslint-plugin": "3.1.0-dev.11",
48
- "@itwin/webgl-compatibility": "3.1.0-dev.11",
39
+ "@itwin/appui-abstract": "3.1.0-dev.15",
40
+ "@itwin/build-tools": "3.1.0-dev.15",
41
+ "@itwin/core-bentley": "3.1.0-dev.15",
42
+ "@itwin/core-common": "3.1.0-dev.15",
43
+ "@itwin/core-geometry": "3.1.0-dev.15",
44
+ "@itwin/core-orbitgt": "3.1.0-dev.15",
45
+ "@itwin/core-quantity": "3.1.0-dev.15",
46
+ "@itwin/certa": "3.1.0-dev.15",
47
+ "@itwin/eslint-plugin": "3.1.0-dev.15",
48
+ "@itwin/webgl-compatibility": "3.1.0-dev.15",
49
49
  "@types/chai": "^4.1.4",
50
50
  "@types/chai-as-promised": "^7",
51
51
  "@types/deep-assign": "^0.1.0",
@@ -74,8 +74,10 @@
74
74
  "NOTE: core-frontend should remain UI technology agnostic, so no react/angular dependencies are allowed"
75
75
  ],
76
76
  "dependencies": {
77
- "@itwin/core-i18n": "3.1.0-dev.11",
78
- "@itwin/core-telemetry": "3.1.0-dev.11",
77
+ "@itwin/core-i18n": "3.1.0-dev.15",
78
+ "@itwin/core-telemetry": "3.1.0-dev.15",
79
+ "@loaders.gl/core": "^3.1.6",
80
+ "@loaders.gl/draco": "^3.1.6",
79
81
  "deep-assign": "^2.0.0",
80
82
  "fuse.js": "^3.3.0",
81
83
  "lodash": "^4.17.10",
@@ -1,20 +0,0 @@
1
- import { QParams3d } from "@itwin/core-common";
2
- import { Mesh } from "../render/primitives/mesh/MeshPrimitives";
3
- export interface DecodedPointCloud {
4
- qParams: QParams3d;
5
- qPoints: Uint16Array;
6
- colors?: Uint8Array;
7
- }
8
- /** @internal */
9
- export declare class DracoDecoder {
10
- private static _dracoDecoderModule;
11
- static readDracoPointCloud(bufferData: Uint8Array, attributeId: number, colorAttributeId?: number): undefined | DecodedPointCloud;
12
- static readDracoMesh(mesh: Mesh, _primitive: any, bufferData: Uint8Array, attributes: any): Mesh | undefined;
13
- private static decodeVertices;
14
- private static decodeBatchIds;
15
- private static decodeUVParams;
16
- private static decodeNormals;
17
- private static decodeTriangles;
18
- private static decodeAndQuantize;
19
- }
20
- //# sourceMappingURL=DracoDecoder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DracoDecoder.d.ts","sourceRoot":"","sources":["../../../src/tile/DracoDecoder.ts"],"names":[],"mappings":"AASA,OAAO,EAAoB,SAAS,EAA0B,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,IAAI,EAAE,MAAM,0CAA0C,CAAC;AAIhE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,gBAAgB;AAChB,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAM;WAE1B,mBAAmB,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,iBAAiB;WA2C1H,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,GAAG,IAAI,GAAG,SAAS;IAgCnH,OAAO,CAAC,MAAM,CAAC,cAAc;IAQ7B,OAAO,CAAC,MAAM,CAAC,cAAc;IAe7B,OAAO,CAAC,MAAM,CAAC,cAAc;IAa7B,OAAO,CAAC,MAAM,CAAC,aAAa;IAY5B,OAAO,CAAC,MAAM,CAAC,eAAe;IAqB9B,OAAO,CAAC,MAAM,CAAC,iBAAiB;CA0BjC"}
@@ -1,169 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DracoDecoder = void 0;
4
- /*---------------------------------------------------------------------------------------------
5
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
6
- * See LICENSE.md in the project root for license terms and full copyright notice.
7
- *--------------------------------------------------------------------------------------------*/
8
- /** @packageDocumentation
9
- * @module Tiles
10
- */
11
- const draco3d_1 = require("draco3d");
12
- const core_geometry_1 = require("@itwin/core-geometry");
13
- const core_common_1 = require("@itwin/core-common");
14
- const Primitives_1 = require("../render/primitives/Primitives");
15
- const core_bentley_1 = require("@itwin/core-bentley");
16
- /** @internal */
17
- class DracoDecoder {
18
- static readDracoPointCloud(bufferData, attributeId, colorAttributeId) {
19
- if (!DracoDecoder._dracoDecoderModule)
20
- DracoDecoder._dracoDecoderModule = (0, draco3d_1.createDecoderModule)(undefined);
21
- const dracoModule = DracoDecoder._dracoDecoderModule;
22
- const dracoDecoder = new dracoModule.Decoder();
23
- const buffer = new dracoModule.DecoderBuffer();
24
- buffer.Init(bufferData, bufferData.length);
25
- const geometryType = dracoDecoder.GetEncodedGeometryType(buffer);
26
- if (geometryType !== dracoModule.POINT_CLOUD)
27
- return undefined;
28
- const dracoPointCloud = new dracoModule.PointCloud();
29
- const decodingStatus = dracoDecoder.DecodeBufferToPointCloud(buffer, dracoPointCloud);
30
- dracoModule.destroy(buffer);
31
- if (!decodingStatus.ok() || dracoPointCloud.ptr === 0)
32
- return undefined;
33
- const quantizedPoints = DracoDecoder.decodeAndQuantize(dracoPointCloud, dracoDecoder, attributeId);
34
- let decodedPointCloud;
35
- if (quantizedPoints) {
36
- decodedPointCloud = quantizedPoints;
37
- if (undefined !== colorAttributeId) {
38
- const colorDracoAttribute = dracoDecoder.GetAttributeByUniqueId(dracoPointCloud, colorAttributeId);
39
- if (colorDracoAttribute) {
40
- const dracoColors = new DracoDecoder._dracoDecoderModule.DracoUInt8Array();
41
- dracoDecoder.GetAttributeUInt8ForAllPoints(dracoPointCloud, colorDracoAttribute, dracoColors);
42
- const length = 3 * dracoPointCloud.num_points();
43
- const attrLength = dracoColors.size();
44
- (0, core_bentley_1.assert)(length === attrLength);
45
- decodedPointCloud.colors = new Uint8Array(length);
46
- for (let i = 0; i < length; i++)
47
- decodedPointCloud.colors[i] = dracoColors.GetValue(i);
48
- }
49
- }
50
- }
51
- dracoModule.destroy(dracoPointCloud);
52
- dracoModule.destroy(dracoDecoder);
53
- return decodedPointCloud;
54
- }
55
- static readDracoMesh(mesh, _primitive, bufferData, attributes) {
56
- if (!DracoDecoder._dracoDecoderModule)
57
- DracoDecoder._dracoDecoderModule = (0, draco3d_1.createDecoderModule)(undefined);
58
- const dracoModule = DracoDecoder._dracoDecoderModule;
59
- const dracoDecoder = new dracoModule.Decoder();
60
- const buffer = new dracoModule.DecoderBuffer();
61
- buffer.Init(bufferData, bufferData.length);
62
- const geometryType = dracoDecoder.GetEncodedGeometryType(buffer);
63
- if (geometryType !== dracoModule.TRIANGULAR_MESH)
64
- return undefined;
65
- const dracoGeometry = new dracoModule.Mesh();
66
- const decodingStatus = dracoDecoder.DecodeBufferToMesh(buffer, dracoGeometry);
67
- dracoModule.destroy(buffer);
68
- if (!decodingStatus.ok() || dracoGeometry.ptr === 0)
69
- return undefined;
70
- if (!DracoDecoder.decodeTriangles(mesh, dracoGeometry, dracoDecoder) ||
71
- !DracoDecoder.decodeVertices(mesh.points, dracoGeometry, dracoDecoder, attributes.POSITION))
72
- return undefined;
73
- DracoDecoder.decodeUVParams(mesh.uvParams, dracoGeometry, dracoDecoder, attributes.TEXCOORD_0);
74
- DracoDecoder.decodeNormals(mesh.normals, dracoGeometry, dracoDecoder, attributes.NORMAL);
75
- if (attributes._BATCHID !== undefined && mesh.features !== undefined)
76
- DracoDecoder.decodeBatchIds(mesh.features, dracoGeometry, dracoDecoder, attributes._BATCHID);
77
- dracoModule.destroy(dracoGeometry);
78
- dracoModule.destroy(dracoDecoder);
79
- return mesh;
80
- }
81
- static decodeVertices(qPoints, dracoGeometry, dracoDecoder, attributeId) {
82
- const dracoAttribute = dracoDecoder.GetAttributeByUniqueId(dracoGeometry, attributeId);
83
- if (undefined === dracoAttribute)
84
- return false;
85
- const quantized = DracoDecoder.decodeAndQuantize(dracoGeometry, dracoDecoder, attributeId);
86
- qPoints.fromTypedArray(quantized.range, quantized.qPoints);
87
- return true;
88
- }
89
- static decodeBatchIds(features, dracoGeometry, dracoDecoder, attributeId) {
90
- const dracoAttribute = dracoDecoder.GetAttributeByUniqueId(dracoGeometry, attributeId);
91
- if (undefined === dracoAttribute)
92
- return false;
93
- const unquantizedValues = new DracoDecoder._dracoDecoderModule.DracoFloat32Array();
94
- const numPoints = dracoGeometry.num_points();
95
- dracoDecoder.GetAttributeFloatForAllPoints(dracoGeometry, dracoAttribute, unquantizedValues);
96
- const featureIndices = [];
97
- featureIndices.length = numPoints;
98
- for (let i = 0; i < numPoints; i++)
99
- featureIndices[i] = unquantizedValues.GetValue(i);
100
- features.setIndices(featureIndices);
101
- return true;
102
- }
103
- static decodeUVParams(points, dracoGeometry, dracoDecoder, attributeId) {
104
- const dracoAttribute = dracoDecoder.GetAttributeByUniqueId(dracoGeometry, attributeId);
105
- if (undefined === dracoAttribute)
106
- return false;
107
- const numPoints = dracoGeometry.num_points();
108
- const unquantizedValues = new DracoDecoder._dracoDecoderModule.DracoFloat32Array();
109
- dracoDecoder.GetAttributeFloatForAllPoints(dracoGeometry, dracoAttribute, unquantizedValues);
110
- for (let i = 0, j = 0; i < numPoints; i++)
111
- points.push(new core_geometry_1.Point2d(unquantizedValues.GetValue(j++), unquantizedValues.GetValue(j++)));
112
- DracoDecoder._dracoDecoderModule.destroy(unquantizedValues);
113
- return true;
114
- }
115
- static decodeNormals(normals, dracoGeometry, dracoDecoder, attributeId) {
116
- const dracoAttribute = dracoDecoder.GetAttributeByUniqueId(dracoGeometry, attributeId);
117
- if (undefined === dracoAttribute)
118
- return false;
119
- const numPoints = dracoGeometry.num_points();
120
- const unquantizedValues = new DracoDecoder._dracoDecoderModule.DracoFloat32Array();
121
- dracoDecoder.GetAttributeFloatForAllPoints(dracoGeometry, dracoAttribute, unquantizedValues);
122
- for (let i = 0, j = 0; i < numPoints; i++)
123
- normals.push(core_common_1.OctEncodedNormal.fromVector({ x: unquantizedValues.GetValue(j++), y: unquantizedValues.GetValue(j++), z: unquantizedValues.GetValue(j++) }));
124
- DracoDecoder._dracoDecoderModule.destroy(unquantizedValues);
125
- return true;
126
- }
127
- static decodeTriangles(mesh, dracoGeometry, dracoDecoder) {
128
- const numFaces = dracoGeometry.num_faces();
129
- const faceIndices = new DracoDecoder._dracoDecoderModule.DracoInt32Array();
130
- const numIndices = numFaces * 3;
131
- const indexArray = new Uint32Array();
132
- const triangle = new Primitives_1.Triangle();
133
- for (let i = 0; i < numFaces; ++i) {
134
- dracoDecoder.GetFaceFromMesh(dracoGeometry, i, faceIndices);
135
- triangle.setIndices(faceIndices.GetValue(0), faceIndices.GetValue(1), faceIndices.GetValue(2));
136
- mesh.addTriangle(triangle);
137
- }
138
- DracoDecoder._dracoDecoderModule.destroy(faceIndices);
139
- return {
140
- typedArray: indexArray,
141
- numberOfIndices: numIndices,
142
- };
143
- }
144
- static decodeAndQuantize(dracoGeometry, dracoDecoder, attributeId) {
145
- const dracoModule = DracoDecoder._dracoDecoderModule;
146
- const dracoAttribute = dracoDecoder.GetAttributeByUniqueId(dracoGeometry, attributeId);
147
- const numPoints = dracoGeometry.num_points();
148
- const unquantizedValues = new DracoDecoder._dracoDecoderModule.DracoFloat32Array();
149
- const range = core_geometry_1.Range3d.createNull();
150
- dracoDecoder.GetAttributeFloatForAllPoints(dracoGeometry, dracoAttribute, unquantizedValues);
151
- for (let i = 0, j = 0; i < numPoints; i++)
152
- range.extendXYZ(unquantizedValues.GetValue(j++), unquantizedValues.GetValue(j++), unquantizedValues.GetValue(j++));
153
- const qParams = core_common_1.QParams3d.fromRange(range);
154
- const qPoints = new Uint16Array(3 * numPoints);
155
- const point = core_geometry_1.Point3d.createZero();
156
- const qPoint = core_common_1.QPoint3d.create(point, qParams);
157
- for (let i = 0, j = 0; i < numPoints; i++) {
158
- point.set(unquantizedValues.GetValue(j), unquantizedValues.GetValue(j + 1), unquantizedValues.GetValue(j + 2));
159
- qPoint.init(point, qParams);
160
- qPoints[j++] = qPoint.x;
161
- qPoints[j++] = qPoint.y;
162
- qPoints[j++] = qPoint.z;
163
- }
164
- dracoModule.destroy(unquantizedValues);
165
- return { qParams, range, qPoints };
166
- }
167
- }
168
- exports.DracoDecoder = DracoDecoder;
169
- //# sourceMappingURL=DracoDecoder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DracoDecoder.js","sourceRoot":"","sources":["../../../src/tile/DracoDecoder.ts"],"names":[],"mappings":";;;AAAA;;;+FAG+F;AAC/F;;GAEG;AACH,qCAA8C;AAC9C,wDAAiE;AACjE,oDAAyF;AAEzF,gEAA2D;AAC3D,sDAA6C;AAQ7C,gBAAgB;AAChB,MAAa,YAAY;IAGhB,MAAM,CAAC,mBAAmB,CAAC,UAAsB,EAAE,WAAmB,EAAE,gBAAyB;QACtG,IAAI,CAAC,YAAY,CAAC,mBAAmB;YACnC,YAAY,CAAC,mBAAmB,GAAG,IAAA,6BAAmB,EAAC,SAAS,CAAC,CAAC;QAEpE,MAAM,WAAW,GAAG,YAAY,CAAC,mBAAmB,CAAC;QACrD,MAAM,YAAY,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QAE/C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,aAAa,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,YAAY,GAAG,YAAY,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,YAAY,KAAK,WAAW,CAAC,WAAW;YAC1C,OAAO,SAAS,CAAC;QAEnB,MAAM,eAAe,GAAG,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;QACrD,MAAM,cAAc,GAAG,YAAY,CAAC,wBAAwB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACtF,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,IAAI,eAAe,CAAC,GAAG,KAAK,CAAC;YACnD,OAAO,SAAS,CAAC;QAEnB,MAAM,eAAe,GAAG,YAAY,CAAC,iBAAiB,CAAC,eAAe,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QACnG,IAAI,iBAAgD,CAAC;QACrD,IAAI,eAAe,EAAE;YACnB,iBAAiB,GAAG,eAAe,CAAC;YACpC,IAAI,SAAS,KAAK,gBAAgB,EAAE;gBAClC,MAAM,mBAAmB,GAAG,YAAY,CAAC,sBAAsB,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;gBACnG,IAAI,mBAAmB,EAAE;oBACvB,MAAM,WAAW,GAAG,IAAI,YAAY,CAAC,mBAAmB,CAAC,eAAe,EAAE,CAAC;oBAC3E,YAAY,CAAC,6BAA6B,CAAC,eAAe,EAAE,mBAAmB,EAAE,WAAW,CAAC,CAAC;oBAC9F,MAAM,MAAM,GAAG,CAAC,GAAG,eAAe,CAAC,UAAU,EAAE,CAAC;oBAChD,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;oBACtC,IAAA,qBAAM,EAAC,MAAM,KAAK,UAAU,CAAC,CAAC;oBAC9B,iBAAiB,CAAC,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;oBAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE;wBAC7B,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;iBACzD;aACF;SACF;QACD,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACrC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAClC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAEM,MAAM,CAAC,aAAa,CAAC,IAAU,EAAE,UAAe,EAAE,UAAsB,EAAE,UAAe;QAC9F,IAAI,CAAC,YAAY,CAAC,mBAAmB;YACnC,YAAY,CAAC,mBAAmB,GAAG,IAAA,6BAAmB,EAAC,SAAS,CAAC,CAAC;QAEpE,MAAM,WAAW,GAAG,YAAY,CAAC,mBAAmB,CAAC;QACrD,MAAM,YAAY,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QAE/C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,aAAa,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,YAAY,GAAG,YAAY,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,YAAY,KAAK,WAAW,CAAC,eAAe;YAC9C,OAAO,SAAS,CAAC;QAEnB,MAAM,aAAa,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;QAC7C,MAAM,cAAc,GAAG,YAAY,CAAC,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAC9E,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,IAAI,aAAa,CAAC,GAAG,KAAK,CAAC;YACjD,OAAO,SAAS,CAAC;QAEnB,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,YAAY,CAAC;YAClE,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC;YAC3F,OAAO,SAAS,CAAC;QACnB,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;QAC/F,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACzF,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAClE,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/F,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACnC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAElC,OAAO,IAAI,CAAC;IACd,CAAC;IACO,MAAM,CAAC,cAAc,CAAC,OAAqB,EAAE,aAAkB,EAAE,YAAiB,EAAE,WAAmB;QAC7G,MAAM,cAAc,GAAG,YAAY,CAAC,sBAAsB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QACvF,IAAI,SAAS,KAAK,cAAc;YAAE,OAAO,KAAK,CAAC;QAE/C,MAAM,SAAS,GAAG,YAAY,CAAC,iBAAiB,CAAC,aAAa,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QAC3F,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IACO,MAAM,CAAC,cAAc,CAAC,QAAuB,EAAE,aAAkB,EAAE,YAAiB,EAAE,WAAmB;QAC/G,MAAM,cAAc,GAAG,YAAY,CAAC,sBAAsB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QACvF,IAAI,SAAS,KAAK,cAAc;YAAE,OAAO,KAAK,CAAC;QAE/C,MAAM,iBAAiB,GAAG,IAAI,YAAY,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,CAAC;QACnF,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,EAAE,CAAC;QAC7C,YAAY,CAAC,6BAA6B,CAAC,aAAa,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;QAC7F,MAAM,cAAc,GAAG,EAAE,CAAC;QAC1B,cAAc,CAAC,MAAM,GAAG,SAAS,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;YAChC,cAAc,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEpD,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IACO,MAAM,CAAC,cAAc,CAAC,MAAiB,EAAE,aAAkB,EAAE,YAAiB,EAAE,WAAmB;QACzG,MAAM,cAAc,GAAG,YAAY,CAAC,sBAAsB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QACvF,IAAI,SAAS,KAAK,cAAc;YAAE,OAAO,KAAK,CAAC;QAE/C,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,EAAE,CAAC;QAC7C,MAAM,iBAAiB,GAAG,IAAI,YAAY,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,CAAC;QACnF,YAAY,CAAC,6BAA6B,CAAC,aAAa,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;QAC7F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;YACvC,MAAM,CAAC,IAAI,CAAC,IAAI,uBAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7F,YAAY,CAAC,mBAAmB,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,MAAM,CAAC,aAAa,CAAC,OAA2B,EAAE,aAAkB,EAAE,YAAiB,EAAE,WAAmB;QAClH,MAAM,cAAc,GAAG,YAAY,CAAC,sBAAsB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QACvF,IAAI,SAAS,KAAK,cAAc;YAAE,OAAO,KAAK,CAAC;QAE/C,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,EAAE,CAAC;QAC7C,MAAM,iBAAiB,GAAG,IAAI,YAAY,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,CAAC;QACnF,YAAY,CAAC,6BAA6B,CAAC,aAAa,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;QAC7F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;YACvC,OAAO,CAAC,IAAI,CAAC,8BAAgB,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5J,YAAY,CAAC,mBAAmB,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IACO,MAAM,CAAC,eAAe,CAAC,IAAU,EAAE,aAAkB,EAAE,YAAiB;QAC9E,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,YAAY,CAAC,mBAAmB,CAAC,eAAe,EAAE,CAAC;QAC3E,MAAM,UAAU,GAAG,QAAQ,GAAG,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,qBAAQ,EAAE,CAAC;QAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,EAAE,CAAC,EAAE;YACjC,YAAY,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;YAC5D,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/F,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;SAC5B;QAED,YAAY,CAAC,mBAAmB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAEtD,OAAO;YACL,UAAU,EAAE,UAAU;YACtB,eAAe,EAAE,UAAU;SAC5B,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,iBAAiB,CAAC,aAAkB,EAAE,YAAiB,EAAE,WAAmB;QACzF,MAAM,WAAW,GAAG,YAAY,CAAC,mBAAmB,CAAC;QACrD,MAAM,cAAc,GAAG,YAAY,CAAC,sBAAsB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QACvF,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,EAAE,CAAC;QAE7C,MAAM,iBAAiB,GAAG,IAAI,YAAY,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,CAAC;QACnF,MAAM,KAAK,GAAG,uBAAO,CAAC,UAAU,EAAE,CAAC;QACnC,YAAY,CAAC,6BAA6B,CAAC,aAAa,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;QAC7F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;YACvC,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAErH,MAAM,OAAO,GAAG,uBAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,uBAAO,CAAC,UAAU,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,sBAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;YACzC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/G,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;YACxB,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;YACxB,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;SACzB;QAED,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACvC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACrC,CAAC;CACF;AA7KD,oCA6KC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\nimport { createDecoderModule } from \"draco3d\";\r\nimport { Point2d, Point3d, Range3d } from \"@itwin/core-geometry\";\r\nimport { OctEncodedNormal, QParams3d, QPoint3d, QPoint3dList } from \"@itwin/core-common\";\r\nimport { Mesh } from \"../render/primitives/mesh/MeshPrimitives\";\r\nimport { Triangle } from \"../render/primitives/Primitives\";\r\nimport { assert } from \"@itwin/core-bentley\";\r\n\r\nexport interface DecodedPointCloud {\r\n qParams: QParams3d;\r\n qPoints: Uint16Array;\r\n colors?: Uint8Array;\r\n}\r\n\r\n/** @internal */\r\nexport class DracoDecoder {\r\n private static _dracoDecoderModule: any;\r\n\r\n public static readDracoPointCloud(bufferData: Uint8Array, attributeId: number, colorAttributeId?: number): undefined | DecodedPointCloud {\r\n if (!DracoDecoder._dracoDecoderModule)\r\n DracoDecoder._dracoDecoderModule = createDecoderModule(undefined);\r\n\r\n const dracoModule = DracoDecoder._dracoDecoderModule;\r\n const dracoDecoder = new dracoModule.Decoder();\r\n\r\n const buffer = new dracoModule.DecoderBuffer();\r\n buffer.Init(bufferData, bufferData.length);\r\n\r\n const geometryType = dracoDecoder.GetEncodedGeometryType(buffer);\r\n if (geometryType !== dracoModule.POINT_CLOUD)\r\n return undefined;\r\n\r\n const dracoPointCloud = new dracoModule.PointCloud();\r\n const decodingStatus = dracoDecoder.DecodeBufferToPointCloud(buffer, dracoPointCloud);\r\n dracoModule.destroy(buffer);\r\n if (!decodingStatus.ok() || dracoPointCloud.ptr === 0)\r\n return undefined;\r\n\r\n const quantizedPoints = DracoDecoder.decodeAndQuantize(dracoPointCloud, dracoDecoder, attributeId);\r\n let decodedPointCloud: DecodedPointCloud | undefined;\r\n if (quantizedPoints) {\r\n decodedPointCloud = quantizedPoints;\r\n if (undefined !== colorAttributeId) {\r\n const colorDracoAttribute = dracoDecoder.GetAttributeByUniqueId(dracoPointCloud, colorAttributeId);\r\n if (colorDracoAttribute) {\r\n const dracoColors = new DracoDecoder._dracoDecoderModule.DracoUInt8Array();\r\n dracoDecoder.GetAttributeUInt8ForAllPoints(dracoPointCloud, colorDracoAttribute, dracoColors);\r\n const length = 3 * dracoPointCloud.num_points();\r\n const attrLength = dracoColors.size();\r\n assert(length === attrLength);\r\n decodedPointCloud.colors = new Uint8Array(length);\r\n for (let i = 0; i < length; i++)\r\n decodedPointCloud.colors[i] = dracoColors.GetValue(i);\r\n }\r\n }\r\n }\r\n dracoModule.destroy(dracoPointCloud);\r\n dracoModule.destroy(dracoDecoder);\r\n return decodedPointCloud;\r\n }\r\n\r\n public static readDracoMesh(mesh: Mesh, _primitive: any, bufferData: Uint8Array, attributes: any): Mesh | undefined {\r\n if (!DracoDecoder._dracoDecoderModule)\r\n DracoDecoder._dracoDecoderModule = createDecoderModule(undefined);\r\n\r\n const dracoModule = DracoDecoder._dracoDecoderModule;\r\n const dracoDecoder = new dracoModule.Decoder();\r\n\r\n const buffer = new dracoModule.DecoderBuffer();\r\n buffer.Init(bufferData, bufferData.length);\r\n\r\n const geometryType = dracoDecoder.GetEncodedGeometryType(buffer);\r\n if (geometryType !== dracoModule.TRIANGULAR_MESH)\r\n return undefined;\r\n\r\n const dracoGeometry = new dracoModule.Mesh();\r\n const decodingStatus = dracoDecoder.DecodeBufferToMesh(buffer, dracoGeometry);\r\n dracoModule.destroy(buffer);\r\n if (!decodingStatus.ok() || dracoGeometry.ptr === 0)\r\n return undefined;\r\n\r\n if (!DracoDecoder.decodeTriangles(mesh, dracoGeometry, dracoDecoder) ||\r\n !DracoDecoder.decodeVertices(mesh.points, dracoGeometry, dracoDecoder, attributes.POSITION))\r\n return undefined;\r\n DracoDecoder.decodeUVParams(mesh.uvParams, dracoGeometry, dracoDecoder, attributes.TEXCOORD_0);\r\n DracoDecoder.decodeNormals(mesh.normals, dracoGeometry, dracoDecoder, attributes.NORMAL);\r\n if (attributes._BATCHID !== undefined && mesh.features !== undefined)\r\n DracoDecoder.decodeBatchIds(mesh.features, dracoGeometry, dracoDecoder, attributes._BATCHID);\r\n dracoModule.destroy(dracoGeometry);\r\n dracoModule.destroy(dracoDecoder);\r\n\r\n return mesh;\r\n }\r\n private static decodeVertices(qPoints: QPoint3dList, dracoGeometry: any, dracoDecoder: any, attributeId: number): boolean {\r\n const dracoAttribute = dracoDecoder.GetAttributeByUniqueId(dracoGeometry, attributeId);\r\n if (undefined === dracoAttribute) return false;\r\n\r\n const quantized = DracoDecoder.decodeAndQuantize(dracoGeometry, dracoDecoder, attributeId);\r\n qPoints.fromTypedArray(quantized.range, quantized.qPoints);\r\n return true;\r\n }\r\n private static decodeBatchIds(features: Mesh.Features, dracoGeometry: any, dracoDecoder: any, attributeId: number): boolean {\r\n const dracoAttribute = dracoDecoder.GetAttributeByUniqueId(dracoGeometry, attributeId);\r\n if (undefined === dracoAttribute) return false;\r\n\r\n const unquantizedValues = new DracoDecoder._dracoDecoderModule.DracoFloat32Array();\r\n const numPoints = dracoGeometry.num_points();\r\n dracoDecoder.GetAttributeFloatForAllPoints(dracoGeometry, dracoAttribute, unquantizedValues);\r\n const featureIndices = [];\r\n featureIndices.length = numPoints;\r\n for (let i = 0; i < numPoints; i++)\r\n featureIndices[i] = unquantizedValues.GetValue(i);\r\n\r\n features.setIndices(featureIndices);\r\n return true;\r\n }\r\n private static decodeUVParams(points: Point2d[], dracoGeometry: any, dracoDecoder: any, attributeId: number): boolean {\r\n const dracoAttribute = dracoDecoder.GetAttributeByUniqueId(dracoGeometry, attributeId);\r\n if (undefined === dracoAttribute) return false;\r\n\r\n const numPoints = dracoGeometry.num_points();\r\n const unquantizedValues = new DracoDecoder._dracoDecoderModule.DracoFloat32Array();\r\n dracoDecoder.GetAttributeFloatForAllPoints(dracoGeometry, dracoAttribute, unquantizedValues);\r\n for (let i = 0, j = 0; i < numPoints; i++)\r\n points.push(new Point2d(unquantizedValues.GetValue(j++), unquantizedValues.GetValue(j++)));\r\n DracoDecoder._dracoDecoderModule.destroy(unquantizedValues);\r\n return true;\r\n }\r\n\r\n private static decodeNormals(normals: OctEncodedNormal[], dracoGeometry: any, dracoDecoder: any, attributeId: number): boolean {\r\n const dracoAttribute = dracoDecoder.GetAttributeByUniqueId(dracoGeometry, attributeId);\r\n if (undefined === dracoAttribute) return false;\r\n\r\n const numPoints = dracoGeometry.num_points();\r\n const unquantizedValues = new DracoDecoder._dracoDecoderModule.DracoFloat32Array();\r\n dracoDecoder.GetAttributeFloatForAllPoints(dracoGeometry, dracoAttribute, unquantizedValues);\r\n for (let i = 0, j = 0; i < numPoints; i++)\r\n normals.push(OctEncodedNormal.fromVector({ x: unquantizedValues.GetValue(j++), y: unquantizedValues.GetValue(j++), z: unquantizedValues.GetValue(j++) }));\r\n DracoDecoder._dracoDecoderModule.destroy(unquantizedValues);\r\n return true;\r\n }\r\n private static decodeTriangles(mesh: Mesh, dracoGeometry: any, dracoDecoder: any) {\r\n const numFaces = dracoGeometry.num_faces();\r\n const faceIndices = new DracoDecoder._dracoDecoderModule.DracoInt32Array();\r\n const numIndices = numFaces * 3;\r\n const indexArray = new Uint32Array();\r\n const triangle = new Triangle();\r\n\r\n for (let i = 0; i < numFaces; ++i) {\r\n dracoDecoder.GetFaceFromMesh(dracoGeometry, i, faceIndices);\r\n triangle.setIndices(faceIndices.GetValue(0), faceIndices.GetValue(1), faceIndices.GetValue(2));\r\n mesh.addTriangle(triangle);\r\n }\r\n\r\n DracoDecoder._dracoDecoderModule.destroy(faceIndices);\r\n\r\n return {\r\n typedArray: indexArray,\r\n numberOfIndices: numIndices,\r\n };\r\n }\r\n\r\n private static decodeAndQuantize(dracoGeometry: any, dracoDecoder: any, attributeId: number): { qParams: QParams3d, range: Range3d, qPoints: Uint16Array } {\r\n const dracoModule = DracoDecoder._dracoDecoderModule;\r\n const dracoAttribute = dracoDecoder.GetAttributeByUniqueId(dracoGeometry, attributeId);\r\n const numPoints = dracoGeometry.num_points();\r\n\r\n const unquantizedValues = new DracoDecoder._dracoDecoderModule.DracoFloat32Array();\r\n const range = Range3d.createNull();\r\n dracoDecoder.GetAttributeFloatForAllPoints(dracoGeometry, dracoAttribute, unquantizedValues);\r\n for (let i = 0, j = 0; i < numPoints; i++)\r\n range.extendXYZ(unquantizedValues.GetValue(j++), unquantizedValues.GetValue(j++), unquantizedValues.GetValue(j++));\r\n\r\n const qParams = QParams3d.fromRange(range);\r\n const qPoints = new Uint16Array(3 * numPoints);\r\n const point = Point3d.createZero();\r\n const qPoint = QPoint3d.create(point, qParams);\r\n for (let i = 0, j = 0; i < numPoints; i++) {\r\n point.set(unquantizedValues.GetValue(j), unquantizedValues.GetValue(j + 1), unquantizedValues.GetValue(j + 2));\r\n qPoint.init(point, qParams);\r\n qPoints[j++] = qPoint.x;\r\n qPoints[j++] = qPoint.y;\r\n qPoints[j++] = qPoint.z;\r\n }\r\n\r\n dracoModule.destroy(unquantizedValues);\r\n return { qParams, range, qPoints };\r\n }\r\n}\r\n"]}