@loaders.gl/tile-converter 4.0.0-alpha.23 → 4.0.0-alpha.25
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/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts +4 -4
- package/dist/3d-tiles-converter/helpers/load-i3s.d.ts.map +1 -1
- package/dist/converter.min.js +105 -105
- package/dist/dist.min.js +725 -652
- package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js +18 -18
- package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
- package/dist/es5/3d-tiles-converter/helpers/load-i3s.js.map +1 -1
- package/dist/es5/deps-installer/deps-installer.js +1 -1
- package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js +16 -14
- package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/feature-attributes.js +6 -18
- package/dist/es5/i3s-converter/helpers/feature-attributes.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/geometry-attributes.js +83 -44
- package/dist/es5/i3s-converter/helpers/geometry-attributes.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/geometry-converter.js +13 -83
- package/dist/es5/i3s-converter/helpers/geometry-converter.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/preprocess-3d-tiles.js +15 -8
- package/dist/es5/i3s-converter/helpers/preprocess-3d-tiles.js.map +1 -1
- package/dist/es5/i3s-converter/i3s-converter.js.map +1 -1
- package/dist/es5/i3s-converter/types.js.map +1 -1
- package/dist/es5/pgm-loader.js +11 -3
- package/dist/es5/pgm-loader.js.map +1 -1
- package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js +8 -8
- package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
- package/dist/esm/3d-tiles-converter/helpers/load-i3s.js.map +1 -1
- package/dist/esm/deps-installer/deps-installer.js +1 -1
- package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js +5 -15
- package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/feature-attributes.js +5 -5
- package/dist/esm/i3s-converter/helpers/feature-attributes.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/geometry-attributes.js +76 -34
- package/dist/esm/i3s-converter/helpers/geometry-attributes.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/geometry-converter.js +10 -80
- package/dist/esm/i3s-converter/helpers/geometry-converter.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/preprocess-3d-tiles.js +15 -9
- package/dist/esm/i3s-converter/helpers/preprocess-3d-tiles.js.map +1 -1
- package/dist/esm/i3s-converter/i3s-converter.js.map +1 -1
- package/dist/esm/i3s-converter/types.js.map +1 -1
- package/dist/esm/i3s-server/bin/i3s-server.min.js +75 -75
- package/dist/esm/pgm-loader.js +7 -4
- package/dist/esm/pgm-loader.js.map +1 -1
- package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts +4 -1
- package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/feature-attributes.d.ts +6 -6
- package/dist/i3s-converter/helpers/feature-attributes.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/geometry-attributes.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/geometry-converter.d.ts +1 -1
- package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts.map +1 -1
- package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
- package/dist/i3s-converter/types.d.ts +13 -5
- package/dist/i3s-converter/types.d.ts.map +1 -1
- package/dist/pgm-loader.d.ts +9 -2
- package/dist/pgm-loader.d.ts.map +1 -1
- package/dist/slpk-extractor.min.js +42 -42
- package/package.json +14 -14
- package/src/3d-tiles-converter/helpers/b3dm-converter.ts +8 -8
- package/src/3d-tiles-converter/helpers/load-i3s.ts +1 -0
- package/src/i3s-converter/helpers/batch-ids-extensions.ts +14 -35
- package/src/i3s-converter/helpers/feature-attributes.ts +14 -11
- package/src/i3s-converter/helpers/geometry-attributes.ts +80 -50
- package/src/i3s-converter/helpers/geometry-converter.ts +41 -177
- package/src/i3s-converter/helpers/preprocess-3d-tiles.ts +30 -9
- package/src/i3s-converter/i3s-converter.ts +0 -2
- package/src/i3s-converter/types.ts +14 -5
- package/src/pgm-loader.ts +15 -7
- package/dist/3d-tiles-converter/3d-tiles-converter.js +0 -279
- package/dist/3d-tiles-converter/helpers/b3dm-converter.js +0 -271
- package/dist/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js +0 -23
- package/dist/3d-tiles-converter/helpers/load-i3s.js +0 -42
- package/dist/3d-tiles-converter/helpers/texture-atlas.js +0 -54
- package/dist/3d-tiles-converter/json-templates/tileset.js +0 -43
- package/dist/bundle.js +0 -5
- package/dist/constants.js +0 -4
- package/dist/converter-cli.js +0 -222
- package/dist/deps-installer/deps-installer.js +0 -89
- package/dist/i3s-converter/helpers/batch-ids-extensions.js +0 -179
- package/dist/i3s-converter/helpers/coordinate-converter.js +0 -122
- package/dist/i3s-converter/helpers/create-scene-server-path.js +0 -28
- package/dist/i3s-converter/helpers/feature-attributes.js +0 -218
- package/dist/i3s-converter/helpers/geometry-attributes.js +0 -203
- package/dist/i3s-converter/helpers/geometry-converter.js +0 -1321
- package/dist/i3s-converter/helpers/gltf-attributes.js +0 -129
- package/dist/i3s-converter/helpers/load-3d-tiles.js +0 -99
- package/dist/i3s-converter/helpers/node-debug.js +0 -120
- package/dist/i3s-converter/helpers/node-index-document.js +0 -271
- package/dist/i3s-converter/helpers/node-pages.js +0 -316
- package/dist/i3s-converter/helpers/preprocess-3d-tiles.js +0 -100
- package/dist/i3s-converter/helpers/tileset-traversal.js +0 -29
- package/dist/i3s-converter/i3s-converter.js +0 -964
- package/dist/i3s-converter/json-templates/geometry-definitions.js +0 -87
- package/dist/i3s-converter/json-templates/layers.js +0 -139
- package/dist/i3s-converter/json-templates/metadata.js +0 -25
- package/dist/i3s-converter/json-templates/node.js +0 -89
- package/dist/i3s-converter/json-templates/scene-server.js +0 -31
- package/dist/i3s-converter/json-templates/shared-resources.js +0 -129
- package/dist/i3s-converter/json-templates/store.js +0 -103
- package/dist/i3s-converter/types.js +0 -17
- package/dist/i3s-server/app.js +0 -29
- package/dist/i3s-server/bin/www.js +0 -37
- package/dist/i3s-server/controllers/index-controller.js +0 -31
- package/dist/i3s-server/controllers/slpk-controller.js +0 -33
- package/dist/i3s-server/routes/index.js +0 -20
- package/dist/i3s-server/routes/slpk-router.js +0 -34
- package/dist/i3s-server/utils/create-scene-server.js +0 -22
- package/dist/i3s-server/utils/server-utils.js +0 -66
- package/dist/index.js +0 -10
- package/dist/lib/utils/cli-utils.js +0 -82
- package/dist/lib/utils/compress-util.js +0 -257
- package/dist/lib/utils/file-utils.js +0 -139
- package/dist/lib/utils/geometry-utils.js +0 -18
- package/dist/lib/utils/lod-conversion-utils.js +0 -76
- package/dist/lib/utils/queue.js +0 -18
- package/dist/lib/utils/statistic-utills.js +0 -64
- package/dist/lib/utils/write-queue.js +0 -80
- package/dist/pgm-loader.js +0 -24
- package/dist/slpk-extractor/slpk-extractor.js +0 -75
- package/dist/slpk-extractor-cli.js +0 -102
package/dist/es5/pgm-loader.js
CHANGED
|
@@ -4,11 +4,17 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
+
Object.defineProperty(exports, "Geoid", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function get() {
|
|
10
|
+
return _geoid.Geoid;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
7
13
|
exports.PGMLoader = void 0;
|
|
8
14
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
15
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
10
16
|
var _geoid = require("@math.gl/geoid");
|
|
11
|
-
var VERSION = typeof "4.0.0-alpha.
|
|
17
|
+
var VERSION = typeof "4.0.0-alpha.25" !== 'undefined' ? "4.0.0-alpha.25" : 'latest';
|
|
12
18
|
var PGMLoader = {
|
|
13
19
|
name: 'PGM - Netpbm grayscale image format',
|
|
14
20
|
id: 'pgm',
|
|
@@ -20,7 +26,7 @@ var PGMLoader = {
|
|
|
20
26
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
21
27
|
while (1) switch (_context.prev = _context.next) {
|
|
22
28
|
case 0:
|
|
23
|
-
return _context.abrupt("return", (0, _geoid.parsePGM)(new Uint8Array(arrayBuffer), options));
|
|
29
|
+
return _context.abrupt("return", (0, _geoid.parsePGM)(new Uint8Array(arrayBuffer), (options === null || options === void 0 ? void 0 : options.pgm) || {}));
|
|
24
30
|
case 1:
|
|
25
31
|
case "end":
|
|
26
32
|
return _context.stop();
|
|
@@ -34,7 +40,9 @@ var PGMLoader = {
|
|
|
34
40
|
}(),
|
|
35
41
|
extensions: ['pgm'],
|
|
36
42
|
options: {
|
|
37
|
-
|
|
43
|
+
pgm: {
|
|
44
|
+
cubic: false
|
|
45
|
+
}
|
|
38
46
|
}
|
|
39
47
|
};
|
|
40
48
|
exports.PGMLoader = PGMLoader;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pgm-loader.js","names":["_geoid","require","VERSION","PGMLoader","name","id","module","version","mimeTypes","parse","_parse","_asyncToGenerator2","default","_regenerator","mark","_callee","arrayBuffer","options","wrap","_callee$","_context","prev","next","abrupt","parsePGM","Uint8Array","stop","_x","_x2","apply","arguments","extensions","cubic","exports"],"sources":["../../src/pgm-loader.ts"],"sourcesContent":["import type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {parsePGM} from '@math.gl/geoid';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\n/**\n * Loader for PGM - Netpbm grayscale image format\n */\nexport const PGMLoader: LoaderWithParser = {\n name: 'PGM - Netpbm grayscale image format',\n id: 'pgm',\n module: 'tile-converter',\n version: VERSION,\n mimeTypes: ['image/x-portable-graymap'],\n
|
|
1
|
+
{"version":3,"file":"pgm-loader.js","names":["_geoid","require","VERSION","PGMLoader","name","id","module","version","mimeTypes","parse","_parse","_asyncToGenerator2","default","_regenerator","mark","_callee","arrayBuffer","options","wrap","_callee$","_context","prev","next","abrupt","parsePGM","Uint8Array","pgm","stop","_x","_x2","apply","arguments","extensions","cubic","exports"],"sources":["../../src/pgm-loader.ts"],"sourcesContent":["import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport {Geoid, parsePGM} from '@math.gl/geoid';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport {Geoid};\n\nexport type PGMLoaderOptions = LoaderOptions & {\n pgm?: {\n cubic?: boolean;\n };\n};\n\n/**\n * Loader for PGM - Netpbm grayscale image format\n */\nexport const PGMLoader: LoaderWithParser<Geoid, never, PGMLoaderOptions> = {\n name: 'PGM - Netpbm grayscale image format',\n id: 'pgm',\n module: 'tile-converter',\n version: VERSION,\n mimeTypes: ['image/x-portable-graymap'],\n parse: async (arrayBuffer, options) => parsePGM(new Uint8Array(arrayBuffer), options?.pgm || {}),\n extensions: ['pgm'],\n options: {\n pgm: {\n cubic: false\n }\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AAIA,IAAMC,OAAO,GAAG,uBAAkB,KAAK,WAAW,sBAAiB,QAAQ;AAapE,IAAMC,SAA2D,GAAG;EACzEC,IAAI,EAAE,qCAAqC;EAC3CC,EAAE,EAAE,KAAK;EACTC,MAAM,EAAE,gBAAgB;EACxBC,OAAO,EAAEL,OAAO;EAChBM,SAAS,EAAE,CAAC,0BAA0B,CAAC;EACvCC,KAAK;IAAA,IAAAC,MAAA,OAAAC,kBAAA,CAAAC,OAAA,EAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,CAAE,SAAAC,QAAOC,WAAW,EAAEC,OAAO;MAAA,OAAAJ,YAAA,CAAAD,OAAA,CAAAM,IAAA,UAAAC,SAAAC,QAAA;QAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;UAAA;YAAA,OAAAF,QAAA,CAAAG,MAAA,WAAK,IAAAC,eAAQ,EAAC,IAAIC,UAAU,CAACT,WAAW,CAAC,EAAE,CAAAC,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAES,GAAG,KAAI,CAAC,CAAC,CAAC;UAAA;UAAA;YAAA,OAAAN,QAAA,CAAAO,IAAA;QAAA;MAAA,GAAAZ,OAAA;IAAA;IAAA,SAAAN,MAAAmB,EAAA,EAAAC,GAAA;MAAA,OAAAnB,MAAA,CAAAoB,KAAA,OAAAC,SAAA;IAAA;IAAA,OAAAtB,KAAA;EAAA;EAChGuB,UAAU,EAAE,CAAC,KAAK,CAAC;EACnBf,OAAO,EAAE;IACPS,GAAG,EAAE;MACHO,KAAK,EAAE;IACT;EACF;AACF,CAAC;AAACC,OAAA,CAAA/B,SAAA,GAAAA,SAAA"}
|
|
@@ -15,7 +15,7 @@ export default class B3dmConverter {
|
|
|
15
15
|
}
|
|
16
16
|
async convert(i3sAttributesData) {
|
|
17
17
|
let featureAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
18
|
-
const gltf = await this.
|
|
18
|
+
const gltf = await this.buildGLTF(i3sAttributesData, featureAttributes);
|
|
19
19
|
const b3dm = encodeSync({
|
|
20
20
|
gltfEncoded: new Uint8Array(gltf),
|
|
21
21
|
type: 'b3dm',
|
|
@@ -24,7 +24,7 @@ export default class B3dmConverter {
|
|
|
24
24
|
}, Tile3DWriter);
|
|
25
25
|
return b3dm;
|
|
26
26
|
}
|
|
27
|
-
async
|
|
27
|
+
async buildGLTF(i3sAttributesData, featureAttributes) {
|
|
28
28
|
const {
|
|
29
29
|
tileContent,
|
|
30
30
|
textureFormat,
|
|
@@ -37,8 +37,8 @@ export default class B3dmConverter {
|
|
|
37
37
|
modelMatrix
|
|
38
38
|
} = tileContent;
|
|
39
39
|
const gltfBuilder = new GLTFScenegraph();
|
|
40
|
-
const textureIndex = await this.
|
|
41
|
-
const pbrMaterialInfo = this.
|
|
40
|
+
const textureIndex = await this._addI3sTextureToGLTF(tileContent, textureFormat, gltfBuilder);
|
|
41
|
+
const pbrMaterialInfo = this._convertI3sMaterialToGLTFMaterial(material, textureIndex);
|
|
42
42
|
const materialIndex = gltfBuilder.addMaterial(pbrMaterialInfo);
|
|
43
43
|
const positions = attributes.positions;
|
|
44
44
|
const positionsValue = positions.value;
|
|
@@ -72,7 +72,7 @@ export default class B3dmConverter {
|
|
|
72
72
|
const gltfBuffer = encodeSync(gltfBuilder.gltf, GLTFWriter);
|
|
73
73
|
return gltfBuffer;
|
|
74
74
|
}
|
|
75
|
-
async
|
|
75
|
+
async _addI3sTextureToGLTF(tileContent, textureFormat, gltfBuilder) {
|
|
76
76
|
const {
|
|
77
77
|
texture,
|
|
78
78
|
material,
|
|
@@ -144,7 +144,7 @@ export default class B3dmConverter {
|
|
|
144
144
|
return 'image/jpeg';
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
|
-
|
|
147
|
+
_convertI3sMaterialToGLTFMaterial(material, textureIndex) {
|
|
148
148
|
const isTextureIndexExists = textureIndex !== null;
|
|
149
149
|
if (!material) {
|
|
150
150
|
material = {
|
|
@@ -166,11 +166,11 @@ export default class B3dmConverter {
|
|
|
166
166
|
return material;
|
|
167
167
|
}
|
|
168
168
|
if (textureIndex !== null) {
|
|
169
|
-
material = this.
|
|
169
|
+
material = this._setGLTFTexture(material, textureIndex);
|
|
170
170
|
}
|
|
171
171
|
return material;
|
|
172
172
|
}
|
|
173
|
-
|
|
173
|
+
_setGLTFTexture(materialDefinition, textureIndex) {
|
|
174
174
|
const material = {
|
|
175
175
|
...materialDefinition,
|
|
176
176
|
pbrMetallicRoughness: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"b3dm-converter.js","names":["encodeSync","GLTFScenegraph","GLTFWriter","Tile3DWriter","Matrix4","Vector3","Ellipsoid","convertTextureAtlas","generateSyntheticIndices","Z_UP_TO_Y_UP_MATRIX","scratchVector","B3dmConverter","constructor","_defineProperty","convert","i3sAttributesData","featureAttributes","arguments","length","undefined","gltf","buildGltf","b3dm","gltfEncoded","Uint8Array","type","featuresLength","_getFeaturesLength","batchTable","tileContent","textureFormat","box","material","attributes","indices","originalIndices","modelMatrix","gltfBuilder","textureIndex","_addI3sTextureToGltf","pbrMaterialInfo","_convertI3sMaterialToGltfMaterial","materialIndex","addMaterial","positions","positionsValue","value","uvRegions","texCoords","cartesianOrigin","cartographicOrigin","WGS84","cartesianToCartographic","_normalizePositions","_createBatchIds","normals","_checkNormals","size","meshIndex","addMesh","mode","transformMatrix","_generateTransformMatrix","nodeIndex","addNode","matrix","sceneIndex","addScene","nodeIndices","setDefaultScene","createBinaryChunk","gltfBuffer","texture","selectedTexture","pbrMetallicRoughness","baseColorTexture","source","image","mimeType","_deduceMimeTypeFromFormat","imageIndex","addImage","addTexture","colors","newPositionsValue","Float32Array","index","vertex","subarray","cartesianOriginVector","vertexVector","Array","from","transform","add","cartographicToCartesian","subtract","set","translateOriginMatrix","translate","result","multiplyLeft","i3sContent","featureIds","OBJECTID","objectIds","i","featureId","batchId","indexOf","_BATCHID","byteOffset","format","console","warn","concat","isTextureIndexExists","alphaMode","doubleSided","metallicFactor","roughnessFactor","texCoord","baseColorFactor","_setGltfTexture","materialDefinition","emissiveTexture","metallicRoughnessTexture","normalTexture","occlusionTexture","firstKey","Object","keys","find"],"sources":["../../../../src/3d-tiles-converter/helpers/b3dm-converter.ts"],"sourcesContent":["import type {I3STileContent} from '@loaders.gl/i3s';\nimport {encodeSync} from '@loaders.gl/core';\nimport {GLTFScenegraph, GLTFWriter} from '@loaders.gl/gltf';\nimport {Tile3DWriter} from '@loaders.gl/3d-tiles';\nimport {Matrix4, Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {convertTextureAtlas} from './texture-atlas';\nimport {generateSyntheticIndices} from '../../lib/utils/geometry-utils';\n\nconst Z_UP_TO_Y_UP_MATRIX = new Matrix4([1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1]);\nconst scratchVector = new Vector3();\n\nexport type I3SAttributesData = {\n tileContent: I3STileContent;\n box: number[];\n textureFormat: string;\n};\n\n/**\n * Converts content of an I3S node to *.b3dm's file content\n */\nexport default class B3dmConverter {\n // @ts-expect-error\n rtcCenter: Float32Array;\n i3sTile: any;\n\n /**\n * The starter of content conversion\n * @param i3sTile - Tile3D instance for I3S node\n * @returns - encoded content\n */\n async convert(\n i3sAttributesData: I3SAttributesData,\n featureAttributes: any = null\n ): Promise<ArrayBuffer> {\n const gltf = await this.buildGltf(i3sAttributesData, featureAttributes);\n const b3dm = encodeSync(\n {\n gltfEncoded: new Uint8Array(gltf),\n type: 'b3dm',\n featuresLength: this._getFeaturesLength(featureAttributes),\n batchTable: featureAttributes\n },\n Tile3DWriter\n );\n return b3dm;\n }\n\n /**\n * Build and encode gltf\n * @param i3sTile - Tile3D instance for I3S node\n * @returns - encoded glb content\n */\n async buildGltf(\n i3sAttributesData: I3SAttributesData,\n featureAttributes: any\n ): Promise<ArrayBuffer> {\n const {tileContent, textureFormat, box} = i3sAttributesData;\n const {material, attributes, indices: originalIndices, modelMatrix} = tileContent;\n const gltfBuilder = new GLTFScenegraph();\n\n const textureIndex = await this._addI3sTextureToGltf(tileContent, textureFormat, gltfBuilder);\n const pbrMaterialInfo = this._convertI3sMaterialToGltfMaterial(material, textureIndex);\n const materialIndex = gltfBuilder.addMaterial(pbrMaterialInfo);\n\n const positions = attributes.positions;\n const positionsValue = positions.value;\n\n if (attributes.uvRegions && attributes.texCoords) {\n attributes.texCoords.value = convertTextureAtlas(\n attributes.texCoords.value,\n attributes.uvRegions.value\n );\n }\n\n const cartesianOrigin = new Vector3(box);\n const cartographicOrigin = Ellipsoid.WGS84.cartesianToCartographic(\n cartesianOrigin,\n new Vector3()\n );\n\n attributes.positions.value = this._normalizePositions(\n positionsValue,\n cartesianOrigin,\n cartographicOrigin,\n modelMatrix\n );\n this._createBatchIds(tileContent, featureAttributes);\n if (attributes.normals && !this._checkNormals(attributes.normals.value)) {\n delete attributes.normals;\n }\n const indices =\n originalIndices || generateSyntheticIndices(positionsValue.length / positions.size);\n const meshIndex = gltfBuilder.addMesh({\n attributes,\n indices,\n material: materialIndex,\n mode: 4\n });\n const transformMatrix = this._generateTransformMatrix(cartesianOrigin);\n const nodeIndex = gltfBuilder.addNode({meshIndex, matrix: transformMatrix});\n const sceneIndex = gltfBuilder.addScene({nodeIndices: [nodeIndex]});\n gltfBuilder.setDefaultScene(sceneIndex);\n\n gltfBuilder.createBinaryChunk();\n\n const gltfBuffer = encodeSync(gltfBuilder.gltf, GLTFWriter);\n\n return gltfBuffer;\n }\n\n /**\n * Update gltfBuilder with texture from I3S tile\n * @param {object} i3sTile - Tile3D object\n * @param {GLTFScenegraph} gltfBuilder - gltfScenegraph instance to construct GLTF\n * @returns {Promise<number | null>} - GLTF texture index\n */\n async _addI3sTextureToGltf(tileContent, textureFormat, gltfBuilder) {\n const {texture, material, attributes} = tileContent;\n let textureIndex = null;\n let selectedTexture = texture;\n if (!texture && material) {\n selectedTexture =\n material.pbrMetallicRoughness &&\n material.pbrMetallicRoughness.baseColorTexture &&\n material.pbrMetallicRoughness.baseColorTexture.texture.source.image;\n }\n if (selectedTexture) {\n const mimeType = this._deduceMimeTypeFromFormat(textureFormat);\n const imageIndex = gltfBuilder.addImage(selectedTexture, mimeType);\n textureIndex = gltfBuilder.addTexture({imageIndex});\n delete attributes.colors;\n }\n return textureIndex;\n }\n\n /**\n * Generate a positions array which is correct for 3DTiles/GLTF format\n * @param {Float64Array} positionsValue - the input geometry positions array\n * @param {number[]} cartesianOrigin - the tile center in the cartesian coordinate system\n * @param {number[]} cartographicOrigin - the tile center in the cartographic coordinate system\n * @param {number[]} modelMatrix - the model matrix of geometry\n * @returns {Float32Array} - the output geometry positions array\n */\n _normalizePositions(positionsValue, cartesianOrigin, cartographicOrigin, modelMatrix) {\n const newPositionsValue = new Float32Array(positionsValue.length);\n for (let index = 0; index < positionsValue.length; index += 3) {\n const vertex = positionsValue.subarray(index, index + 3);\n const cartesianOriginVector = new Vector3(cartesianOrigin);\n let vertexVector = new Vector3(Array.from(vertex))\n .transform(modelMatrix)\n .add(cartographicOrigin);\n Ellipsoid.WGS84.cartographicToCartesian(vertexVector, scratchVector);\n vertexVector = scratchVector.subtract(cartesianOriginVector);\n newPositionsValue.set(vertexVector, index);\n }\n return newPositionsValue;\n }\n\n /**\n * Generate the transformation matrix for GLTF node:\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#reference-node\n * 1. Create the translate transformation from cartesianOrigin (the positions array stores offsets from this cartesianOrigin)\n * 2. Create the rotation transformation to rotate model from z-up coordinates (I3S specific) to y-up coordinates (GLTF specific)\n * @param {number[]} cartesianOrigin - the tile center in the cartesian coordinate system\n * @returns {Matrix4} - an array of 16 numbers (4x4 matrix)\n */\n _generateTransformMatrix(cartesianOrigin) {\n const translateOriginMatrix = new Matrix4().translate(cartesianOrigin);\n const result = translateOriginMatrix.multiplyLeft(Z_UP_TO_Y_UP_MATRIX);\n return result;\n }\n\n /**\n * Create _BATCHID attribute\n * @param {Object} i3sContent - the source object\n * @returns {void}\n */\n _createBatchIds(i3sContent, featureAttributes) {\n const {featureIds} = i3sContent;\n const {OBJECTID: objectIds} = featureAttributes || {};\n if (!featureIds || !objectIds) {\n return;\n }\n\n for (let i = 0; i < featureIds.length; i++) {\n const featureId = featureIds[i];\n const batchId = objectIds.indexOf(featureId);\n featureIds[i] = batchId;\n }\n\n i3sContent.attributes._BATCHID = {\n size: 1,\n byteOffset: 0,\n value: featureIds\n };\n }\n\n /**\n * Deduce mime type by format from `textureSetDefinition.formats[0].format`\n * https://github.com/Esri/i3s-spec/blob/master/docs/1.7/textureSetDefinitionFormat.cmn.md\n * @param {string} format - format name\n * @returns {string} mime type.\n */\n _deduceMimeTypeFromFormat(format) {\n switch (format) {\n case 'jpg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n case 'ktx2':\n return 'image/ktx2';\n default:\n console.warn(`Unexpected texture format in I3S: ${format}`); // eslint-disable-line no-console, no-undef\n return 'image/jpeg';\n }\n }\n\n /**\n * Convert i3s material to GLTF compatible material\n * @param {object} material - i3s material definition\n * @param {number | null} textureIndex - texture index in GLTF\n * @returns {object} GLTF material\n */\n _convertI3sMaterialToGltfMaterial(material, textureIndex) {\n const isTextureIndexExists = textureIndex !== null;\n\n if (!material) {\n material = {\n alphaMode: 'OPAQUE',\n doubleSided: false,\n pbrMetallicRoughness: {\n metallicFactor: 0,\n roughnessFactor: 1\n }\n };\n\n if (isTextureIndexExists) {\n material.pbrMetallicRoughness.baseColorTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else {\n material.pbrMetallicRoughness.baseColorFactor = [1, 1, 1, 1];\n }\n\n return material;\n }\n\n if (textureIndex !== null) {\n material = this._setGltfTexture(material, textureIndex);\n }\n\n return material;\n }\n\n /**\n * Set texture properties in material with GLTF textureIndex\n * @param {object} materialDefinition - i3s material definition\n * @param {number} textureIndex - texture index in GLTF\n * @returns {void}\n */\n _setGltfTexture(materialDefinition, textureIndex) {\n const material = {\n ...materialDefinition,\n pbrMetallicRoughness: {...materialDefinition.pbrMetallicRoughness}\n };\n // I3SLoader now support loading only one texture. This elseif sequence will assign this texture to one of\n // properties defined in materialDefinition\n if (\n materialDefinition.pbrMetallicRoughness &&\n materialDefinition.pbrMetallicRoughness.baseColorTexture\n ) {\n material.pbrMetallicRoughness.baseColorTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (materialDefinition.emissiveTexture) {\n material.emissiveTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (\n materialDefinition.pbrMetallicRoughness &&\n materialDefinition.pbrMetallicRoughness.metallicRoughnessTexture\n ) {\n material.pbrMetallicRoughness.metallicRoughnessTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (materialDefinition.normalTexture) {\n material.normalTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (materialDefinition.occlusionTexture) {\n material.occlusionTexture = {\n index: textureIndex,\n texCoord: 0\n };\n }\n return material;\n }\n\n /*\n * Returns Features length based on attribute array in attribute object.\n * @param {Object} attributes\n * @returns {Number} Features length .\n */\n _getFeaturesLength(attributes) {\n if (!attributes) {\n return 0;\n }\n const firstKey = Object.keys(attributes)[0];\n return firstKey ? attributes[firstKey].length : 0;\n }\n\n /* Checks that normals buffer is correct\n * @param {TypedArray} normals\n * @returns {boolean} true - normals are correct; false - normals are incorrect\n */\n _checkNormals(normals) {\n // If all normals === 0, the resulting tileset is all in black colors on Cesium\n return normals.find((value) => value);\n }\n}\n"],"mappings":";AACA,SAAQA,UAAU,QAAO,kBAAkB;AAC3C,SAAQC,cAAc,EAAEC,UAAU,QAAO,kBAAkB;AAC3D,SAAQC,YAAY,QAAO,sBAAsB;AACjD,SAAQC,OAAO,EAAEC,OAAO,QAAO,eAAe;AAC9C,SAAQC,SAAS,QAAO,qBAAqB;AAC7C,SAAQC,mBAAmB,QAAO,iBAAiB;AACnD,SAAQC,wBAAwB,QAAO,gCAAgC;AAEvE,MAAMC,mBAAmB,GAAG,IAAIL,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1F,MAAMM,aAAa,GAAG,IAAIL,OAAO,CAAC,CAAC;AAWnC,eAAe,MAAMM,aAAa,CAAC;EAAAC,YAAA;IAAAC,eAAA;IAAAA,eAAA;EAAA;EAUjC,MAAMC,OAAOA,CACXC,iBAAoC,EAEd;IAAA,IADtBC,iBAAsB,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,IAAI;IAE7B,MAAMG,IAAI,GAAG,MAAM,IAAI,CAACC,SAAS,CAACN,iBAAiB,EAAEC,iBAAiB,CAAC;IACvE,MAAMM,IAAI,GAAGtB,UAAU,CACrB;MACEuB,WAAW,EAAE,IAAIC,UAAU,CAACJ,IAAI,CAAC;MACjCK,IAAI,EAAE,MAAM;MACZC,cAAc,EAAE,IAAI,CAACC,kBAAkB,CAACX,iBAAiB,CAAC;MAC1DY,UAAU,EAAEZ;IACd,CAAC,EACDb,YACF,CAAC;IACD,OAAOmB,IAAI;EACb;EAOA,MAAMD,SAASA,CACbN,iBAAoC,EACpCC,iBAAsB,EACA;IACtB,MAAM;MAACa,WAAW;MAAEC,aAAa;MAAEC;IAAG,CAAC,GAAGhB,iBAAiB;IAC3D,MAAM;MAACiB,QAAQ;MAAEC,UAAU;MAAEC,OAAO,EAAEC,eAAe;MAAEC;IAAW,CAAC,GAAGP,WAAW;IACjF,MAAMQ,WAAW,GAAG,IAAIpC,cAAc,CAAC,CAAC;IAExC,MAAMqC,YAAY,GAAG,MAAM,IAAI,CAACC,oBAAoB,CAACV,WAAW,EAAEC,aAAa,EAAEO,WAAW,CAAC;IAC7F,MAAMG,eAAe,GAAG,IAAI,CAACC,iCAAiC,CAACT,QAAQ,EAAEM,YAAY,CAAC;IACtF,MAAMI,aAAa,GAAGL,WAAW,CAACM,WAAW,CAACH,eAAe,CAAC;IAE9D,MAAMI,SAAS,GAAGX,UAAU,CAACW,SAAS;IACtC,MAAMC,cAAc,GAAGD,SAAS,CAACE,KAAK;IAEtC,IAAIb,UAAU,CAACc,SAAS,IAAId,UAAU,CAACe,SAAS,EAAE;MAChDf,UAAU,CAACe,SAAS,CAACF,KAAK,GAAGvC,mBAAmB,CAC9C0B,UAAU,CAACe,SAAS,CAACF,KAAK,EAC1Bb,UAAU,CAACc,SAAS,CAACD,KACvB,CAAC;IACH;IAEA,MAAMG,eAAe,GAAG,IAAI5C,OAAO,CAAC0B,GAAG,CAAC;IACxC,MAAMmB,kBAAkB,GAAG5C,SAAS,CAAC6C,KAAK,CAACC,uBAAuB,CAChEH,eAAe,EACf,IAAI5C,OAAO,CAAC,CACd,CAAC;IAED4B,UAAU,CAACW,SAAS,CAACE,KAAK,GAAG,IAAI,CAACO,mBAAmB,CACnDR,cAAc,EACdI,eAAe,EACfC,kBAAkB,EAClBd,WACF,CAAC;IACD,IAAI,CAACkB,eAAe,CAACzB,WAAW,EAAEb,iBAAiB,CAAC;IACpD,IAAIiB,UAAU,CAACsB,OAAO,IAAI,CAAC,IAAI,CAACC,aAAa,CAACvB,UAAU,CAACsB,OAAO,CAACT,KAAK,CAAC,EAAE;MACvE,OAAOb,UAAU,CAACsB,OAAO;IAC3B;IACA,MAAMrB,OAAO,GACXC,eAAe,IAAI3B,wBAAwB,CAACqC,cAAc,CAAC3B,MAAM,GAAG0B,SAAS,CAACa,IAAI,CAAC;IACrF,MAAMC,SAAS,GAAGrB,WAAW,CAACsB,OAAO,CAAC;MACpC1B,UAAU;MACVC,OAAO;MACPF,QAAQ,EAAEU,aAAa;MACvBkB,IAAI,EAAE;IACR,CAAC,CAAC;IACF,MAAMC,eAAe,GAAG,IAAI,CAACC,wBAAwB,CAACb,eAAe,CAAC;IACtE,MAAMc,SAAS,GAAG1B,WAAW,CAAC2B,OAAO,CAAC;MAACN,SAAS;MAAEO,MAAM,EAAEJ;IAAe,CAAC,CAAC;IAC3E,MAAMK,UAAU,GAAG7B,WAAW,CAAC8B,QAAQ,CAAC;MAACC,WAAW,EAAE,CAACL,SAAS;IAAC,CAAC,CAAC;IACnE1B,WAAW,CAACgC,eAAe,CAACH,UAAU,CAAC;IAEvC7B,WAAW,CAACiC,iBAAiB,CAAC,CAAC;IAE/B,MAAMC,UAAU,GAAGvE,UAAU,CAACqC,WAAW,CAACjB,IAAI,EAAElB,UAAU,CAAC;IAE3D,OAAOqE,UAAU;EACnB;EAQA,MAAMhC,oBAAoBA,CAACV,WAAW,EAAEC,aAAa,EAAEO,WAAW,EAAE;IAClE,MAAM;MAACmC,OAAO;MAAExC,QAAQ;MAAEC;IAAU,CAAC,GAAGJ,WAAW;IACnD,IAAIS,YAAY,GAAG,IAAI;IACvB,IAAImC,eAAe,GAAGD,OAAO;IAC7B,IAAI,CAACA,OAAO,IAAIxC,QAAQ,EAAE;MACxByC,eAAe,GACbzC,QAAQ,CAAC0C,oBAAoB,IAC7B1C,QAAQ,CAAC0C,oBAAoB,CAACC,gBAAgB,IAC9C3C,QAAQ,CAAC0C,oBAAoB,CAACC,gBAAgB,CAACH,OAAO,CAACI,MAAM,CAACC,KAAK;IACvE;IACA,IAAIJ,eAAe,EAAE;MACnB,MAAMK,QAAQ,GAAG,IAAI,CAACC,yBAAyB,CAACjD,aAAa,CAAC;MAC9D,MAAMkD,UAAU,GAAG3C,WAAW,CAAC4C,QAAQ,CAACR,eAAe,EAAEK,QAAQ,CAAC;MAClExC,YAAY,GAAGD,WAAW,CAAC6C,UAAU,CAAC;QAACF;MAAU,CAAC,CAAC;MACnD,OAAO/C,UAAU,CAACkD,MAAM;IAC1B;IACA,OAAO7C,YAAY;EACrB;EAUAe,mBAAmBA,CAACR,cAAc,EAAEI,eAAe,EAAEC,kBAAkB,EAAEd,WAAW,EAAE;IACpF,MAAMgD,iBAAiB,GAAG,IAAIC,YAAY,CAACxC,cAAc,CAAC3B,MAAM,CAAC;IACjE,KAAK,IAAIoE,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGzC,cAAc,CAAC3B,MAAM,EAAEoE,KAAK,IAAI,CAAC,EAAE;MAC7D,MAAMC,MAAM,GAAG1C,cAAc,CAAC2C,QAAQ,CAACF,KAAK,EAAEA,KAAK,GAAG,CAAC,CAAC;MACxD,MAAMG,qBAAqB,GAAG,IAAIpF,OAAO,CAAC4C,eAAe,CAAC;MAC1D,IAAIyC,YAAY,GAAG,IAAIrF,OAAO,CAACsF,KAAK,CAACC,IAAI,CAACL,MAAM,CAAC,CAAC,CAC/CM,SAAS,CAACzD,WAAW,CAAC,CACtB0D,GAAG,CAAC5C,kBAAkB,CAAC;MAC1B5C,SAAS,CAAC6C,KAAK,CAAC4C,uBAAuB,CAACL,YAAY,EAAEhF,aAAa,CAAC;MACpEgF,YAAY,GAAGhF,aAAa,CAACsF,QAAQ,CAACP,qBAAqB,CAAC;MAC5DL,iBAAiB,CAACa,GAAG,CAACP,YAAY,EAAEJ,KAAK,CAAC;IAC5C;IACA,OAAOF,iBAAiB;EAC1B;EAUAtB,wBAAwBA,CAACb,eAAe,EAAE;IACxC,MAAMiD,qBAAqB,GAAG,IAAI9F,OAAO,CAAC,CAAC,CAAC+F,SAAS,CAAClD,eAAe,CAAC;IACtE,MAAMmD,MAAM,GAAGF,qBAAqB,CAACG,YAAY,CAAC5F,mBAAmB,CAAC;IACtE,OAAO2F,MAAM;EACf;EAOA9C,eAAeA,CAACgD,UAAU,EAAEtF,iBAAiB,EAAE;IAC7C,MAAM;MAACuF;IAAU,CAAC,GAAGD,UAAU;IAC/B,MAAM;MAACE,QAAQ,EAAEC;IAAS,CAAC,GAAGzF,iBAAiB,IAAI,CAAC,CAAC;IACrD,IAAI,CAACuF,UAAU,IAAI,CAACE,SAAS,EAAE;MAC7B;IACF;IAEA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,UAAU,CAACrF,MAAM,EAAEwF,CAAC,EAAE,EAAE;MAC1C,MAAMC,SAAS,GAAGJ,UAAU,CAACG,CAAC,CAAC;MAC/B,MAAME,OAAO,GAAGH,SAAS,CAACI,OAAO,CAACF,SAAS,CAAC;MAC5CJ,UAAU,CAACG,CAAC,CAAC,GAAGE,OAAO;IACzB;IAEAN,UAAU,CAACrE,UAAU,CAAC6E,QAAQ,GAAG;MAC/BrD,IAAI,EAAE,CAAC;MACPsD,UAAU,EAAE,CAAC;MACbjE,KAAK,EAAEyD;IACT,CAAC;EACH;EAQAxB,yBAAyBA,CAACiC,MAAM,EAAE;IAChC,QAAQA,MAAM;MACZ,KAAK,KAAK;QACR,OAAO,YAAY;MACrB,KAAK,KAAK;QACR,OAAO,WAAW;MACpB,KAAK,MAAM;QACT,OAAO,YAAY;MACrB;QACEC,OAAO,CAACC,IAAI,sCAAAC,MAAA,CAAsCH,MAAM,CAAE,CAAC;QAC3D,OAAO,YAAY;IACvB;EACF;EAQAvE,iCAAiCA,CAACT,QAAQ,EAAEM,YAAY,EAAE;IACxD,MAAM8E,oBAAoB,GAAG9E,YAAY,KAAK,IAAI;IAElD,IAAI,CAACN,QAAQ,EAAE;MACbA,QAAQ,GAAG;QACTqF,SAAS,EAAE,QAAQ;QACnBC,WAAW,EAAE,KAAK;QAClB5C,oBAAoB,EAAE;UACpB6C,cAAc,EAAE,CAAC;UACjBC,eAAe,EAAE;QACnB;MACF,CAAC;MAED,IAAIJ,oBAAoB,EAAE;QACxBpF,QAAQ,CAAC0C,oBAAoB,CAACC,gBAAgB,GAAG;UAC/CW,KAAK,EAAEhD,YAAY;UACnBmF,QAAQ,EAAE;QACZ,CAAC;MACH,CAAC,MAAM;QACLzF,QAAQ,CAAC0C,oBAAoB,CAACgD,eAAe,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;MAC9D;MAEA,OAAO1F,QAAQ;IACjB;IAEA,IAAIM,YAAY,KAAK,IAAI,EAAE;MACzBN,QAAQ,GAAG,IAAI,CAAC2F,eAAe,CAAC3F,QAAQ,EAAEM,YAAY,CAAC;IACzD;IAEA,OAAON,QAAQ;EACjB;EAQA2F,eAAeA,CAACC,kBAAkB,EAAEtF,YAAY,EAAE;IAChD,MAAMN,QAAQ,GAAG;MACf,GAAG4F,kBAAkB;MACrBlD,oBAAoB,EAAE;QAAC,GAAGkD,kBAAkB,CAAClD;MAAoB;IACnE,CAAC;IAGD,IACEkD,kBAAkB,CAAClD,oBAAoB,IACvCkD,kBAAkB,CAAClD,oBAAoB,CAACC,gBAAgB,EACxD;MACA3C,QAAQ,CAAC0C,oBAAoB,CAACC,gBAAgB,GAAG;QAC/CW,KAAK,EAAEhD,YAAY;QACnBmF,QAAQ,EAAE;MACZ,CAAC;IACH,CAAC,MAAM,IAAIG,kBAAkB,CAACC,eAAe,EAAE;MAC7C7F,QAAQ,CAAC6F,eAAe,GAAG;QACzBvC,KAAK,EAAEhD,YAAY;QACnBmF,QAAQ,EAAE;MACZ,CAAC;IACH,CAAC,MAAM,IACLG,kBAAkB,CAAClD,oBAAoB,IACvCkD,kBAAkB,CAAClD,oBAAoB,CAACoD,wBAAwB,EAChE;MACA9F,QAAQ,CAAC0C,oBAAoB,CAACoD,wBAAwB,GAAG;QACvDxC,KAAK,EAAEhD,YAAY;QACnBmF,QAAQ,EAAE;MACZ,CAAC;IACH,CAAC,MAAM,IAAIG,kBAAkB,CAACG,aAAa,EAAE;MAC3C/F,QAAQ,CAAC+F,aAAa,GAAG;QACvBzC,KAAK,EAAEhD,YAAY;QACnBmF,QAAQ,EAAE;MACZ,CAAC;IACH,CAAC,MAAM,IAAIG,kBAAkB,CAACI,gBAAgB,EAAE;MAC9ChG,QAAQ,CAACgG,gBAAgB,GAAG;QAC1B1C,KAAK,EAAEhD,YAAY;QACnBmF,QAAQ,EAAE;MACZ,CAAC;IACH;IACA,OAAOzF,QAAQ;EACjB;EAOAL,kBAAkBA,CAACM,UAAU,EAAE;IAC7B,IAAI,CAACA,UAAU,EAAE;MACf,OAAO,CAAC;IACV;IACA,MAAMgG,QAAQ,GAAGC,MAAM,CAACC,IAAI,CAAClG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAOgG,QAAQ,GAAGhG,UAAU,CAACgG,QAAQ,CAAC,CAAC/G,MAAM,GAAG,CAAC;EACnD;EAMAsC,aAAaA,CAACD,OAAO,EAAE;IAErB,OAAOA,OAAO,CAAC6E,IAAI,CAAEtF,KAAK,IAAKA,KAAK,CAAC;EACvC;AACF"}
|
|
1
|
+
{"version":3,"file":"b3dm-converter.js","names":["encodeSync","GLTFScenegraph","GLTFWriter","Tile3DWriter","Matrix4","Vector3","Ellipsoid","convertTextureAtlas","generateSyntheticIndices","Z_UP_TO_Y_UP_MATRIX","scratchVector","B3dmConverter","constructor","_defineProperty","convert","i3sAttributesData","featureAttributes","arguments","length","undefined","gltf","buildGLTF","b3dm","gltfEncoded","Uint8Array","type","featuresLength","_getFeaturesLength","batchTable","tileContent","textureFormat","box","material","attributes","indices","originalIndices","modelMatrix","gltfBuilder","textureIndex","_addI3sTextureToGLTF","pbrMaterialInfo","_convertI3sMaterialToGLTFMaterial","materialIndex","addMaterial","positions","positionsValue","value","uvRegions","texCoords","cartesianOrigin","cartographicOrigin","WGS84","cartesianToCartographic","_normalizePositions","_createBatchIds","normals","_checkNormals","size","meshIndex","addMesh","mode","transformMatrix","_generateTransformMatrix","nodeIndex","addNode","matrix","sceneIndex","addScene","nodeIndices","setDefaultScene","createBinaryChunk","gltfBuffer","texture","selectedTexture","pbrMetallicRoughness","baseColorTexture","source","image","mimeType","_deduceMimeTypeFromFormat","imageIndex","addImage","addTexture","colors","newPositionsValue","Float32Array","index","vertex","subarray","cartesianOriginVector","vertexVector","Array","from","transform","add","cartographicToCartesian","subtract","set","translateOriginMatrix","translate","result","multiplyLeft","i3sContent","featureIds","OBJECTID","objectIds","i","featureId","batchId","indexOf","_BATCHID","byteOffset","format","console","warn","concat","isTextureIndexExists","alphaMode","doubleSided","metallicFactor","roughnessFactor","texCoord","baseColorFactor","_setGLTFTexture","materialDefinition","emissiveTexture","metallicRoughnessTexture","normalTexture","occlusionTexture","firstKey","Object","keys","find"],"sources":["../../../../src/3d-tiles-converter/helpers/b3dm-converter.ts"],"sourcesContent":["import type {I3STileContent} from '@loaders.gl/i3s';\nimport {encodeSync} from '@loaders.gl/core';\nimport {GLTFScenegraph, GLTFWriter} from '@loaders.gl/gltf';\nimport {Tile3DWriter} from '@loaders.gl/3d-tiles';\nimport {Matrix4, Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {convertTextureAtlas} from './texture-atlas';\nimport {generateSyntheticIndices} from '../../lib/utils/geometry-utils';\n\nconst Z_UP_TO_Y_UP_MATRIX = new Matrix4([1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1]);\nconst scratchVector = new Vector3();\n\nexport type I3SAttributesData = {\n tileContent: I3STileContent;\n box: number[];\n textureFormat: string;\n};\n\n/**\n * Converts content of an I3S node to *.b3dm's file content\n */\nexport default class B3dmConverter {\n // @ts-expect-error\n rtcCenter: Float32Array;\n i3sTile: any;\n\n /**\n * The starter of content conversion\n * @param i3sTile - Tile3D instance for I3S node\n * @returns - encoded content\n */\n async convert(\n i3sAttributesData: I3SAttributesData,\n featureAttributes: any = null\n ): Promise<ArrayBuffer> {\n const gltf = await this.buildGLTF(i3sAttributesData, featureAttributes);\n const b3dm = encodeSync(\n {\n gltfEncoded: new Uint8Array(gltf),\n type: 'b3dm',\n featuresLength: this._getFeaturesLength(featureAttributes),\n batchTable: featureAttributes\n },\n Tile3DWriter\n );\n return b3dm;\n }\n\n /**\n * Build and encode gltf\n * @param i3sTile - Tile3D instance for I3S node\n * @returns - encoded glb content\n */\n async buildGLTF(\n i3sAttributesData: I3SAttributesData,\n featureAttributes: any\n ): Promise<ArrayBuffer> {\n const {tileContent, textureFormat, box} = i3sAttributesData;\n const {material, attributes, indices: originalIndices, modelMatrix} = tileContent;\n const gltfBuilder = new GLTFScenegraph();\n\n const textureIndex = await this._addI3sTextureToGLTF(tileContent, textureFormat, gltfBuilder);\n const pbrMaterialInfo = this._convertI3sMaterialToGLTFMaterial(material, textureIndex);\n const materialIndex = gltfBuilder.addMaterial(pbrMaterialInfo);\n\n const positions = attributes.positions;\n const positionsValue = positions.value;\n\n if (attributes.uvRegions && attributes.texCoords) {\n attributes.texCoords.value = convertTextureAtlas(\n attributes.texCoords.value,\n attributes.uvRegions.value\n );\n }\n\n const cartesianOrigin = new Vector3(box);\n const cartographicOrigin = Ellipsoid.WGS84.cartesianToCartographic(\n cartesianOrigin,\n new Vector3()\n );\n\n attributes.positions.value = this._normalizePositions(\n positionsValue,\n cartesianOrigin,\n cartographicOrigin,\n modelMatrix\n );\n this._createBatchIds(tileContent, featureAttributes);\n if (attributes.normals && !this._checkNormals(attributes.normals.value)) {\n delete attributes.normals;\n }\n const indices =\n originalIndices || generateSyntheticIndices(positionsValue.length / positions.size);\n const meshIndex = gltfBuilder.addMesh({\n attributes,\n indices,\n material: materialIndex,\n mode: 4\n });\n const transformMatrix = this._generateTransformMatrix(cartesianOrigin);\n const nodeIndex = gltfBuilder.addNode({meshIndex, matrix: transformMatrix});\n const sceneIndex = gltfBuilder.addScene({nodeIndices: [nodeIndex]});\n gltfBuilder.setDefaultScene(sceneIndex);\n\n gltfBuilder.createBinaryChunk();\n\n const gltfBuffer = encodeSync(gltfBuilder.gltf, GLTFWriter);\n\n return gltfBuffer;\n }\n\n /**\n * Update gltfBuilder with texture from I3S tile\n * @param {object} i3sTile - Tile3D object\n * @param {GLTFScenegraph} gltfBuilder - gltfScenegraph instance to construct GLTF\n * @returns {Promise<number | null>} - GLTF texture index\n */\n async _addI3sTextureToGLTF(tileContent, textureFormat, gltfBuilder) {\n const {texture, material, attributes} = tileContent;\n let textureIndex = null;\n let selectedTexture = texture;\n if (!texture && material) {\n selectedTexture =\n material.pbrMetallicRoughness &&\n material.pbrMetallicRoughness.baseColorTexture &&\n material.pbrMetallicRoughness.baseColorTexture.texture.source.image;\n }\n if (selectedTexture) {\n const mimeType = this._deduceMimeTypeFromFormat(textureFormat);\n const imageIndex = gltfBuilder.addImage(selectedTexture, mimeType);\n textureIndex = gltfBuilder.addTexture({imageIndex});\n delete attributes.colors;\n }\n return textureIndex;\n }\n\n /**\n * Generate a positions array which is correct for 3DTiles/GLTF format\n * @param {Float64Array} positionsValue - the input geometry positions array\n * @param {number[]} cartesianOrigin - the tile center in the cartesian coordinate system\n * @param {number[]} cartographicOrigin - the tile center in the cartographic coordinate system\n * @param {number[]} modelMatrix - the model matrix of geometry\n * @returns {Float32Array} - the output geometry positions array\n */\n _normalizePositions(positionsValue, cartesianOrigin, cartographicOrigin, modelMatrix) {\n const newPositionsValue = new Float32Array(positionsValue.length);\n for (let index = 0; index < positionsValue.length; index += 3) {\n const vertex = positionsValue.subarray(index, index + 3);\n const cartesianOriginVector = new Vector3(cartesianOrigin);\n let vertexVector = new Vector3(Array.from(vertex))\n .transform(modelMatrix)\n .add(cartographicOrigin);\n Ellipsoid.WGS84.cartographicToCartesian(vertexVector, scratchVector);\n vertexVector = scratchVector.subtract(cartesianOriginVector);\n newPositionsValue.set(vertexVector, index);\n }\n return newPositionsValue;\n }\n\n /**\n * Generate the transformation matrix for GLTF node:\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#reference-node\n * 1. Create the translate transformation from cartesianOrigin (the positions array stores offsets from this cartesianOrigin)\n * 2. Create the rotation transformation to rotate model from z-up coordinates (I3S specific) to y-up coordinates (GLTF specific)\n * @param {number[]} cartesianOrigin - the tile center in the cartesian coordinate system\n * @returns {Matrix4} - an array of 16 numbers (4x4 matrix)\n */\n _generateTransformMatrix(cartesianOrigin) {\n const translateOriginMatrix = new Matrix4().translate(cartesianOrigin);\n const result = translateOriginMatrix.multiplyLeft(Z_UP_TO_Y_UP_MATRIX);\n return result;\n }\n\n /**\n * Create _BATCHID attribute\n * @param {Object} i3sContent - the source object\n * @returns {void}\n */\n _createBatchIds(i3sContent, featureAttributes) {\n const {featureIds} = i3sContent;\n const {OBJECTID: objectIds} = featureAttributes || {};\n if (!featureIds || !objectIds) {\n return;\n }\n\n for (let i = 0; i < featureIds.length; i++) {\n const featureId = featureIds[i];\n const batchId = objectIds.indexOf(featureId);\n featureIds[i] = batchId;\n }\n\n i3sContent.attributes._BATCHID = {\n size: 1,\n byteOffset: 0,\n value: featureIds\n };\n }\n\n /**\n * Deduce mime type by format from `textureSetDefinition.formats[0].format`\n * https://github.com/Esri/i3s-spec/blob/master/docs/1.7/textureSetDefinitionFormat.cmn.md\n * @param {string} format - format name\n * @returns {string} mime type.\n */\n _deduceMimeTypeFromFormat(format) {\n switch (format) {\n case 'jpg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n case 'ktx2':\n return 'image/ktx2';\n default:\n console.warn(`Unexpected texture format in I3S: ${format}`); // eslint-disable-line no-console, no-undef\n return 'image/jpeg';\n }\n }\n\n /**\n * Convert i3s material to GLTF compatible material\n * @param {object} material - i3s material definition\n * @param {number | null} textureIndex - texture index in GLTF\n * @returns {object} GLTF material\n */\n _convertI3sMaterialToGLTFMaterial(material, textureIndex) {\n const isTextureIndexExists = textureIndex !== null;\n\n if (!material) {\n material = {\n alphaMode: 'OPAQUE',\n doubleSided: false,\n pbrMetallicRoughness: {\n metallicFactor: 0,\n roughnessFactor: 1\n }\n };\n\n if (isTextureIndexExists) {\n material.pbrMetallicRoughness.baseColorTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else {\n material.pbrMetallicRoughness.baseColorFactor = [1, 1, 1, 1];\n }\n\n return material;\n }\n\n if (textureIndex !== null) {\n material = this._setGLTFTexture(material, textureIndex);\n }\n\n return material;\n }\n\n /**\n * Set texture properties in material with GLTF textureIndex\n * @param {object} materialDefinition - i3s material definition\n * @param {number} textureIndex - texture index in GLTF\n * @returns {void}\n */\n _setGLTFTexture(materialDefinition, textureIndex) {\n const material = {\n ...materialDefinition,\n pbrMetallicRoughness: {...materialDefinition.pbrMetallicRoughness}\n };\n // I3SLoader now support loading only one texture. This elseif sequence will assign this texture to one of\n // properties defined in materialDefinition\n if (\n materialDefinition.pbrMetallicRoughness &&\n materialDefinition.pbrMetallicRoughness.baseColorTexture\n ) {\n material.pbrMetallicRoughness.baseColorTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (materialDefinition.emissiveTexture) {\n material.emissiveTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (\n materialDefinition.pbrMetallicRoughness &&\n materialDefinition.pbrMetallicRoughness.metallicRoughnessTexture\n ) {\n material.pbrMetallicRoughness.metallicRoughnessTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (materialDefinition.normalTexture) {\n material.normalTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (materialDefinition.occlusionTexture) {\n material.occlusionTexture = {\n index: textureIndex,\n texCoord: 0\n };\n }\n return material;\n }\n\n /*\n * Returns Features length based on attribute array in attribute object.\n * @param {Object} attributes\n * @returns {Number} Features length .\n */\n _getFeaturesLength(attributes) {\n if (!attributes) {\n return 0;\n }\n const firstKey = Object.keys(attributes)[0];\n return firstKey ? attributes[firstKey].length : 0;\n }\n\n /* Checks that normals buffer is correct\n * @param {TypedArray} normals\n * @returns {boolean} true - normals are correct; false - normals are incorrect\n */\n _checkNormals(normals) {\n // If all normals === 0, the resulting tileset is all in black colors on Cesium\n return normals.find((value) => value);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-i3s.js","names":["load","I3SLoader","loadI3SContent","sourceTileset","sourceTile","tilesetLoadOptions","contentUrl","loadOptions","i3s","isTileset","isTileHeader","_tileOptions","attributeUrls","textureUrl","textureFormat","textureLoaderOptions","materialDefinition","isDracoGeometry","mbs","_tilesetOptions","store","attributeStorageInfo","fields","tileContent"],"sources":["../../../../src/3d-tiles-converter/helpers/load-i3s.ts"],"sourcesContent":["import {load} from '@loaders.gl/core';\nimport {\n I3STileContent,\n I3STileHeader,\n I3STilesetHeader,\n I3SLoader,\n I3SLoaderOptions\n} from '@loaders.gl/i3s';\n\n/**\n * Load I3S node content\n * @param sourceTileset - source layer JSON\n * @param sourceTile - source I3S node metadata\n * @param tilesetLoadOptions - load options for Tiles3DLoader\n * @returns - 3DTiles tile content or null\n */\nexport const loadI3SContent = async (\n sourceTileset: I3STilesetHeader | null,\n sourceTile: I3STileHeader,\n tilesetLoadOptions: I3SLoaderOptions\n): Promise<I3STileContent | null> => {\n if (!sourceTileset || !sourceTile.contentUrl) {\n return null;\n }\n\n const loadOptions = {\n ...tilesetLoadOptions,\n i3s: {\n ...tilesetLoadOptions.i3s,\n isTileset: false,\n isTileHeader: false,\n _tileOptions: {\n attributeUrls: sourceTile.attributeUrls,\n textureUrl: sourceTile.textureUrl,\n textureFormat: sourceTile.textureFormat,\n textureLoaderOptions: sourceTile.textureLoaderOptions,\n materialDefinition: sourceTile.materialDefinition,\n isDracoGeometry: sourceTile.isDracoGeometry,\n mbs: sourceTile.mbs\n },\n _tilesetOptions: {\n store: sourceTileset.store,\n attributeStorageInfo: sourceTileset.attributeStorageInfo,\n fields: sourceTileset.fields\n }\n }\n };\n const tileContent = await load(sourceTile.contentUrl, I3SLoader, loadOptions);\n\n return tileContent;\n};\n"],"mappings":"AAAA,SAAQA,IAAI,QAAO,kBAAkB;AACrC,SAIEC,SAAS,QAEJ,iBAAiB;AASxB,OAAO,MAAMC,cAAc,GAAG,MAAAA,CAC5BC,aAAsC,EACtCC,UAAyB,EACzBC,kBAAoC,KACD;EACnC,IAAI,CAACF,aAAa,IAAI,CAACC,UAAU,CAACE,UAAU,EAAE;IAC5C,OAAO,IAAI;EACb;EAEA,MAAMC,WAAW,GAAG;IAClB,GAAGF,kBAAkB;IACrBG,GAAG,EAAE;MACH,GAAGH,kBAAkB,CAACG,GAAG;MACzBC,SAAS,EAAE,KAAK;MAChBC,YAAY,EAAE,KAAK;MACnBC,YAAY,EAAE;QACZC,aAAa,EAAER,UAAU,CAACQ,aAAa;QACvCC,UAAU,EAAET,UAAU,CAACS,UAAU;QACjCC,aAAa,EAAEV,UAAU,CAACU,aAAa;QACvCC,oBAAoB,EAAEX,UAAU,CAACW,oBAAoB;QACrDC,kBAAkB,EAAEZ,UAAU,CAACY,kBAAkB;QACjDC,eAAe,EAAEb,UAAU,CAACa,eAAe;QAC3CC,GAAG,EAAEd,UAAU,CAACc;MAClB,CAAC;MACDC,eAAe,EAAE;QACfC,KAAK,EAAEjB,aAAa,CAACiB,KAAK;QAC1BC,oBAAoB,EAAElB,aAAa,CAACkB,oBAAoB;QACxDC,MAAM,EAAEnB,aAAa,CAACmB;MACxB;IACF;EACF,CAAC;EACD,MAAMC,WAAW,GAAG,MAAMvB,IAAI,CAACI,UAAU,CAACE,UAAU,EAAEL,SAAS,EAAEM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"load-i3s.js","names":["load","I3SLoader","loadI3SContent","sourceTileset","sourceTile","tilesetLoadOptions","contentUrl","loadOptions","i3s","isTileset","isTileHeader","_tileOptions","attributeUrls","textureUrl","textureFormat","textureLoaderOptions","materialDefinition","isDracoGeometry","mbs","_tilesetOptions","store","attributeStorageInfo","fields","tileContent"],"sources":["../../../../src/3d-tiles-converter/helpers/load-i3s.ts"],"sourcesContent":["import {load} from '@loaders.gl/core';\nimport {\n I3STileContent,\n I3STileHeader,\n I3STilesetHeader,\n I3SLoader,\n I3SLoaderOptions\n} from '@loaders.gl/i3s';\n\n/**\n * Load I3S node content\n * @param sourceTileset - source layer JSON\n * @param sourceTile - source I3S node metadata\n * @param tilesetLoadOptions - load options for Tiles3DLoader\n * @returns - 3DTiles tile content or null\n */\nexport const loadI3SContent = async (\n sourceTileset: I3STilesetHeader | null,\n sourceTile: I3STileHeader,\n tilesetLoadOptions: I3SLoaderOptions\n): Promise<I3STileContent | null> => {\n if (!sourceTileset || !sourceTile.contentUrl) {\n return null;\n }\n\n const loadOptions = {\n ...tilesetLoadOptions,\n i3s: {\n ...tilesetLoadOptions.i3s,\n isTileset: false,\n isTileHeader: false,\n _tileOptions: {\n attributeUrls: sourceTile.attributeUrls,\n textureUrl: sourceTile.textureUrl,\n textureFormat: sourceTile.textureFormat,\n textureLoaderOptions: sourceTile.textureLoaderOptions,\n materialDefinition: sourceTile.materialDefinition,\n isDracoGeometry: sourceTile.isDracoGeometry,\n mbs: sourceTile.mbs\n },\n _tilesetOptions: {\n store: sourceTileset.store,\n attributeStorageInfo: sourceTileset.attributeStorageInfo,\n fields: sourceTileset.fields\n }\n }\n };\n const tileContent = await load(sourceTile.contentUrl, I3SLoader, loadOptions);\n\n // @ts-expect-error\n return tileContent;\n};\n"],"mappings":"AAAA,SAAQA,IAAI,QAAO,kBAAkB;AACrC,SAIEC,SAAS,QAEJ,iBAAiB;AASxB,OAAO,MAAMC,cAAc,GAAG,MAAAA,CAC5BC,aAAsC,EACtCC,UAAyB,EACzBC,kBAAoC,KACD;EACnC,IAAI,CAACF,aAAa,IAAI,CAACC,UAAU,CAACE,UAAU,EAAE;IAC5C,OAAO,IAAI;EACb;EAEA,MAAMC,WAAW,GAAG;IAClB,GAAGF,kBAAkB;IACrBG,GAAG,EAAE;MACH,GAAGH,kBAAkB,CAACG,GAAG;MACzBC,SAAS,EAAE,KAAK;MAChBC,YAAY,EAAE,KAAK;MACnBC,YAAY,EAAE;QACZC,aAAa,EAAER,UAAU,CAACQ,aAAa;QACvCC,UAAU,EAAET,UAAU,CAACS,UAAU;QACjCC,aAAa,EAAEV,UAAU,CAACU,aAAa;QACvCC,oBAAoB,EAAEX,UAAU,CAACW,oBAAoB;QACrDC,kBAAkB,EAAEZ,UAAU,CAACY,kBAAkB;QACjDC,eAAe,EAAEb,UAAU,CAACa,eAAe;QAC3CC,GAAG,EAAEd,UAAU,CAACc;MAClB,CAAC;MACDC,eAAe,EAAE;QACfC,KAAK,EAAEjB,aAAa,CAACiB,KAAK;QAC1BC,oBAAoB,EAAElB,aAAa,CAACkB,oBAAoB;QACxDC,MAAM,EAAEnB,aAAa,CAACmB;MACxB;IACF;EACF,CAAC;EACD,MAAMC,WAAW,GAAG,MAAMvB,IAAI,CAACI,UAAU,CAACE,UAAU,EAAEL,SAAS,EAAEM,WAAW,CAAC;EAG7E,OAAOgB,WAAW;AACpB,CAAC"}
|
|
@@ -5,7 +5,7 @@ import { join } from 'path';
|
|
|
5
5
|
import { ChildProcessProxy } from '@loaders.gl/worker-utils';
|
|
6
6
|
import { DRACO_EXTERNAL_LIBRARIES, DRACO_EXTERNAL_LIBRARY_URLS } from '@loaders.gl/draco';
|
|
7
7
|
import { BASIS_EXTERNAL_LIBRARIES } from '@loaders.gl/textures';
|
|
8
|
-
const VERSION = typeof "4.0.0-alpha.
|
|
8
|
+
const VERSION = typeof "4.0.0-alpha.25" !== 'undefined' ? "4.0.0-alpha.25" : 'beta';
|
|
9
9
|
const PGM_LINK = 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/egm/egm2008-5.zip';
|
|
10
10
|
export class DepsInstaller {
|
|
11
11
|
async install() {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { emod } from '@loaders.gl/math';
|
|
2
|
-
import {
|
|
2
|
+
import { EXT_MESH_FEATURES, EXT_FEATURE_METADATA } from '@loaders.gl/gltf';
|
|
3
3
|
export function getTextureByMetadataClass(tileContent, metadataClass) {
|
|
4
4
|
var _tileContent$gltf, _tileContent$gltf$ext;
|
|
5
5
|
const extFeatureMetadata = (_tileContent$gltf = tileContent.gltf) === null || _tileContent$gltf === void 0 ? void 0 : (_tileContent$gltf$ext = _tileContent$gltf.extensions) === null || _tileContent$gltf$ext === void 0 ? void 0 : _tileContent$gltf$ext[EXT_FEATURE_METADATA];
|
|
@@ -25,27 +25,17 @@ export function handleBatchIdsExtensions(attributes, primitive, images, featureT
|
|
|
25
25
|
return handleExtFeatureMetadataExtension(attributes, extensionData, images, featureTexture);
|
|
26
26
|
case EXT_MESH_FEATURES:
|
|
27
27
|
return handleExtMeshFeaturesExtension(attributes, extensionData);
|
|
28
|
-
case EXT_STRUCTURAL_METADATA:
|
|
29
|
-
return handleExtStructuralMetadataExtension(attributes, extensionData);
|
|
30
28
|
default:
|
|
31
29
|
return [];
|
|
32
30
|
}
|
|
33
31
|
}
|
|
34
32
|
return [];
|
|
35
33
|
}
|
|
36
|
-
function handleExtStructuralMetadataExtension(attributes, extStructuralMetadata) {
|
|
37
|
-
const dataAttributeNames = extStructuralMetadata === null || extStructuralMetadata === void 0 ? void 0 : extStructuralMetadata.dataAttributeNames;
|
|
38
|
-
if (dataAttributeNames !== null && dataAttributeNames !== void 0 && dataAttributeNames.length) {
|
|
39
|
-
const batchIdsAttribute = attributes[dataAttributeNames[0]];
|
|
40
|
-
return batchIdsAttribute.value;
|
|
41
|
-
}
|
|
42
|
-
return [];
|
|
43
|
-
}
|
|
44
34
|
function handleExtMeshFeaturesExtension(attributes, extMeshFeatures) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
35
|
+
for (let ids of extMeshFeatures.featureIds) {
|
|
36
|
+
if (typeof ids.propertyTable !== 'undefined') {
|
|
37
|
+
return ids.data;
|
|
38
|
+
}
|
|
49
39
|
}
|
|
50
40
|
return [];
|
|
51
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch-ids-extensions.js","names":["emod","EXT_STRUCTURAL_METADATA","EXT_MESH_FEATURES","EXT_FEATURE_METADATA","getTextureByMetadataClass","tileContent","metadataClass","_tileContent$gltf","_tileContent$gltf$ext","extFeatureMetadata","gltf","extensions","featureTextures","textureKey","texture","class","handleBatchIdsExtensions","attributes","primitive","images","featureTexture","extensionName","extensionData","Object","entries","handleExtFeatureMetadataExtension","handleExtMeshFeaturesExtension","handleExtStructuralMetadataExtension","extStructuralMetadata","dataAttributeNames","length","batchIdsAttribute","value","extMeshFeatures","_extFeatureMetadata$f","_featureIdAttribute$f","_featureIdAttribute$f2","_featureIdAttribute$f3","featureIdAttribute","featureIdAttributes","featureIds","attribute","hasOwnProperty","_attributes$POSITIONS","featuresCount","POSITIONS","generateImplicitFeatureIds","constant","divisor","featureIdTexture","featureIdTextures","_featureIdTexture$fea","_featureIdTexture$fea2","textureAttributeIndex","texCoord","textCoordAttribute","concat","textureCoordinates","generateBatchIdsFromTexture","arguments","undefined","currentValue","devisorCounter","index","push","Array","fill","_featureIdTexture$fea3","_featureIdTexture$fea4","_featureIdTexture$fea5","CHANNELS_MAP","r","g","b","a","textureIndex","featureChannel","channels","image","batchIds","width","height","components","u","v","tx","Math","min","ty","offset","batchId","Uint8Array","data","console","warn","mimeType"],"sources":["../../../../src/i3s-converter/helpers/batch-ids-extensions.ts"],"sourcesContent":["import {GLTFAccessorPostprocessed, GLTFMeshPrimitivePostprocessed} from '@loaders.gl/gltf';\nimport type {NumericArray} from '@loaders.gl/loader-utils';\nimport type {\n GLTF_EXT_feature_metadata_FeatureIdTexture,\n GLTF_EXT_feature_metadata_GLTF,\n GLTF_EXT_feature_metadata_Primitive,\n GLTF_EXT_structural_metadata\n} from '@loaders.gl/gltf';\n\nimport type {GLTF_EXT_mesh_features} from '@loaders.gl/gltf';\n\nimport {TypedArray} from '@math.gl/core';\nimport {TextureImageProperties} from '../types';\nimport {emod} from '@loaders.gl/math';\nimport {EXT_STRUCTURAL_METADATA, EXT_MESH_FEATURES, EXT_FEATURE_METADATA} from '@loaders.gl/gltf';\nimport {Tiles3DTileContent} from '@loaders.gl/3d-tiles';\n\n/**\n * Get featureTexture by metadataClass\n * @param tileContent - 3d tile content\n * @param metadataClass - user selected feature metadata class name\n * @returns featureTexture key\n */\nexport function getTextureByMetadataClass(\n tileContent: Tiles3DTileContent,\n metadataClass?: string\n): string | null {\n const extFeatureMetadata = tileContent.gltf?.extensions?.[\n EXT_FEATURE_METADATA\n ] as GLTF_EXT_feature_metadata_GLTF;\n if (!extFeatureMetadata?.featureTextures) {\n return null;\n }\n for (const textureKey in extFeatureMetadata.featureTextures) {\n const texture = extFeatureMetadata.featureTextures[textureKey];\n if (texture.class === metadataClass) {\n return textureKey;\n }\n }\n return null;\n}\n\n/**\n * Getting batchIds from 3DTilesNext extensions.\n * @param attributes - gltf accessors\n * @param primitive - gltf primitive data\n * @param images - gltf texture images\n * @param featureTexture - feature texture key\n * @return array of batch IDs\n */\nexport function handleBatchIdsExtensions(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n primitive: GLTFMeshPrimitivePostprocessed,\n images: (TextureImageProperties | null)[],\n featureTexture: string | null\n): NumericArray {\n const extensions = primitive?.extensions;\n if (!extensions) {\n return [];\n }\n\n for (const [extensionName, extensionData] of Object.entries(extensions || {})) {\n switch (extensionName) {\n case EXT_FEATURE_METADATA:\n return handleExtFeatureMetadataExtension(\n attributes,\n extensionData as GLTF_EXT_feature_metadata_Primitive,\n images,\n featureTexture\n );\n case EXT_MESH_FEATURES:\n return handleExtMeshFeaturesExtension(attributes, extensionData as GLTF_EXT_mesh_features);\n case EXT_STRUCTURAL_METADATA:\n return handleExtStructuralMetadataExtension(\n attributes,\n extensionData as GLTF_EXT_structural_metadata\n );\n\n default:\n return [];\n }\n }\n\n return [];\n}\n\nfunction handleExtStructuralMetadataExtension(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n extStructuralMetadata: GLTF_EXT_structural_metadata\n): NumericArray {\n // Take only first extension object to get batchIds attribute name.\n const dataAttributeNames = extStructuralMetadata?.dataAttributeNames;\n if (dataAttributeNames?.length) {\n // Let's use the first element of the array\n // TODO: What to do with others if any?\n const batchIdsAttribute = attributes[dataAttributeNames[0]];\n return batchIdsAttribute.value;\n }\n return [];\n}\n\n/**\n * Getting batchIds from EXT_mesh_features extensions.\n * @param attributes - gltf accessors\n * @param extMeshFeatures - EXT_mesh_features extension\n * @returns an array of attribute values\n */\nfunction handleExtMeshFeaturesExtension(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n extMeshFeatures: GLTF_EXT_mesh_features\n): NumericArray {\n const dataAttributeNames = extMeshFeatures?.dataAttributeNames;\n if (dataAttributeNames?.length) {\n // Let's use the first element of the array\n // TODO: What to do with others if any?\n const batchIdsAttribute = attributes[dataAttributeNames[0]];\n return batchIdsAttribute.value;\n }\n return [];\n}\n\n/**\n * Get batchIds from EXT_feature_metadata extension.\n * Docs - https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_feature_metadata\n * @param attributes - glTF attributes\n * @param extFeatureMetadata - primitive-level EXT_FEATURE_METADATA extension data\n * @param textures - texture images\n * @param featureTexture - feature texture key\n */\nfunction handleExtFeatureMetadataExtension(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n extFeatureMetadata: GLTF_EXT_feature_metadata_Primitive,\n images: (TextureImageProperties | null)[],\n featureTexture: string | null\n): NumericArray {\n // Take only first extension object to get batchIds attribute name.\n const featureIdAttribute = extFeatureMetadata?.featureIdAttributes?.[0];\n\n if (featureIdAttribute?.featureIds?.attribute) {\n const batchIdsAttribute = attributes[featureIdAttribute.featureIds.attribute];\n return batchIdsAttribute.value;\n }\n\n if (\n featureIdAttribute?.featureIds?.hasOwnProperty('constant') &&\n featureIdAttribute?.featureIds?.hasOwnProperty('divisor')\n ) {\n const featuresCount = attributes?.POSITIONS?.value.length / 3 || 0;\n return generateImplicitFeatureIds(\n featuresCount,\n featureIdAttribute.featureIds.constant,\n featureIdAttribute.featureIds.divisor\n );\n }\n\n // Take only first extension object to get batchIds attribute name.\n const featureIdTexture =\n extFeatureMetadata?.featureIdTextures && extFeatureMetadata?.featureIdTextures[0];\n\n if (featureIdTexture) {\n const textureAttributeIndex = featureIdTexture?.featureIds?.texture?.texCoord || 0;\n const textCoordAttribute = `TEXCOORD_${textureAttributeIndex}`;\n const textureCoordinates = attributes[textCoordAttribute].value;\n return generateBatchIdsFromTexture(featureIdTexture, textureCoordinates, images);\n }\n\n if (featureTexture) {\n const batchIdsAttribute = attributes[featureTexture];\n return batchIdsAttribute.value;\n }\n\n return [];\n}\n\n/**\n * Generates implicit feature ids\n * Spec - https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_feature_metadata#implicit-feature-ids\n * @param featuresCount\n * @param constant\n * @param devisor\n */\nfunction generateImplicitFeatureIds(\n featuresCount: number,\n constant: number = 0,\n divisor: number = 0\n): number[] {\n let featureIds: number[] = [];\n\n if (divisor > 0) {\n let currentValue = constant;\n let devisorCounter = divisor;\n\n for (let index = 0; index < featuresCount; index++) {\n featureIds.push(currentValue);\n\n devisorCounter -= 1;\n\n if (devisorCounter === 0) {\n currentValue++;\n devisorCounter = divisor;\n }\n }\n } else {\n featureIds = Array<number>(featuresCount).fill(constant, 0, featuresCount);\n }\n\n return featureIds;\n}\n\n/**\n * Get batchIds from texture.\n * @param primitive\n * @param featureIdTextures\n */\nfunction generateBatchIdsFromTexture(\n featureIdTexture: GLTF_EXT_feature_metadata_FeatureIdTexture,\n textureCoordinates: TypedArray,\n images: (TextureImageProperties | null)[]\n) {\n if (!images?.length) {\n return [];\n }\n\n const CHANNELS_MAP = {\n r: 0,\n g: 1,\n b: 2,\n a: 3\n };\n\n const textureIndex = featureIdTexture?.featureIds?.texture?.index;\n const featureChannel = featureIdTexture?.featureIds?.channels;\n\n if (!featureChannel || textureIndex === undefined) {\n return [];\n }\n\n const image = images[textureIndex];\n const batchIds: number[] = [];\n const channels = CHANNELS_MAP[featureChannel];\n\n if (image && image?.width && image?.height && image?.components) {\n for (let index = 0; index < textureCoordinates.length; index += 2) {\n const u = textureCoordinates[index];\n const v = textureCoordinates[index + 1];\n\n const tx = Math.min((emod(u) * image.width) | 0, image.width - 1);\n const ty = Math.min((emod(v) * image.height) | 0, image.height - 1);\n\n const offset = (ty * image.width + tx) * image.components + channels;\n const batchId = new Uint8Array(image.data)[offset];\n\n batchIds.push(batchId);\n }\n } else {\n console.warn(`Can't get batch Ids from ${image?.mimeType || ''} compressed texture`);\n }\n\n return batchIds;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"batch-ids-extensions.js","names":["emod","EXT_MESH_FEATURES","EXT_FEATURE_METADATA","getTextureByMetadataClass","tileContent","metadataClass","_tileContent$gltf","_tileContent$gltf$ext","extFeatureMetadata","gltf","extensions","featureTextures","textureKey","texture","class","handleBatchIdsExtensions","attributes","primitive","images","featureTexture","extensionName","extensionData","Object","entries","handleExtFeatureMetadataExtension","handleExtMeshFeaturesExtension","extMeshFeatures","ids","featureIds","propertyTable","data","_extFeatureMetadata$f","_featureIdAttribute$f","_featureIdAttribute$f2","_featureIdAttribute$f3","featureIdAttribute","featureIdAttributes","attribute","batchIdsAttribute","value","hasOwnProperty","_attributes$POSITIONS","featuresCount","POSITIONS","length","generateImplicitFeatureIds","constant","divisor","featureIdTexture","featureIdTextures","_featureIdTexture$fea","_featureIdTexture$fea2","textureAttributeIndex","texCoord","textCoordAttribute","concat","textureCoordinates","generateBatchIdsFromTexture","arguments","undefined","currentValue","devisorCounter","index","push","Array","fill","_featureIdTexture$fea3","_featureIdTexture$fea4","_featureIdTexture$fea5","CHANNELS_MAP","r","g","b","a","textureIndex","featureChannel","channels","image","batchIds","width","height","components","u","v","tx","Math","min","ty","offset","batchId","Uint8Array","console","warn","mimeType"],"sources":["../../../../src/i3s-converter/helpers/batch-ids-extensions.ts"],"sourcesContent":["import {GLTFAccessorPostprocessed, GLTFMeshPrimitivePostprocessed} from '@loaders.gl/gltf';\nimport type {NumericArray} from '@loaders.gl/loader-utils';\nimport type {\n GLTF_EXT_feature_metadata_FeatureIdTexture,\n GLTF_EXT_feature_metadata_GLTF,\n GLTF_EXT_feature_metadata_Primitive\n} from '@loaders.gl/gltf';\n\nimport type {GLTF_EXT_mesh_features} from '@loaders.gl/gltf';\n\nimport {TypedArray} from '@math.gl/core';\nimport {TextureImageProperties} from '../types';\nimport {emod} from '@loaders.gl/math';\nimport {EXT_MESH_FEATURES, EXT_FEATURE_METADATA} from '@loaders.gl/gltf';\nimport {Tiles3DTileContent} from '@loaders.gl/3d-tiles';\n\n/**\n * Get featureTexture by a metadata class.\n * Metadata classes come from a structural metadata extesion (EXT_feature_metadata or EXT_structural_metadata).\n * The glTF might contain multiple texel-level metadata textures related to different classes. Having only one metadata class\n * selected to convert to I3S, we have to pick only one texture to convert to per-vertex property.\n * @param tileContent - 3d tile content\n * @param metadataClass - user selected feature metadata class name\n * @returns featureTexture key\n */\nexport function getTextureByMetadataClass(\n tileContent: Tiles3DTileContent,\n metadataClass?: string\n): string | null {\n const extFeatureMetadata = tileContent.gltf?.extensions?.[\n EXT_FEATURE_METADATA\n ] as GLTF_EXT_feature_metadata_GLTF;\n if (!extFeatureMetadata?.featureTextures) {\n return null;\n }\n for (const textureKey in extFeatureMetadata.featureTextures) {\n const texture = extFeatureMetadata.featureTextures[textureKey];\n if (texture.class === metadataClass) {\n return textureKey;\n }\n }\n return null;\n}\n\n/**\n * Getting batchIds from 3DTilesNext extensions.\n * @param attributes - gltf accessors\n * @param primitive - gltf primitive data\n * @param images - gltf texture images\n * @param featureTexture - feature texture key\n * @return array of batch IDs\n */\nexport function handleBatchIdsExtensions(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n primitive: GLTFMeshPrimitivePostprocessed,\n images: (TextureImageProperties | null)[],\n featureTexture: string | null\n): NumericArray {\n const extensions = primitive?.extensions;\n if (!extensions) {\n return [];\n }\n\n for (const [extensionName, extensionData] of Object.entries(extensions || {})) {\n switch (extensionName) {\n case EXT_FEATURE_METADATA:\n return handleExtFeatureMetadataExtension(\n attributes,\n extensionData as GLTF_EXT_feature_metadata_Primitive,\n images,\n featureTexture\n );\n case EXT_MESH_FEATURES:\n return handleExtMeshFeaturesExtension(attributes, extensionData as GLTF_EXT_mesh_features);\n default:\n return [];\n }\n }\n\n return [];\n}\n\n/**\n * Getting batchIds from EXT_mesh_features extensions.\n * @param attributes - gltf accessors\n * @param extMeshFeatures - EXT_mesh_features extension\n * @returns an array of attribute values\n */\nfunction handleExtMeshFeaturesExtension(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n extMeshFeatures: GLTF_EXT_mesh_features\n): NumericArray {\n for (let ids of extMeshFeatures.featureIds) {\n if (typeof ids.propertyTable !== 'undefined') {\n // propertyTable is an index that can be 0\n // return the first featureID set that corresponts to property table.\n return ids.data as NumericArray;\n }\n }\n return [];\n}\n\n/**\n * Get batchIds from EXT_feature_metadata extension.\n * @see - https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_feature_metadata\n * @param attributes - glTF attributes\n * @param extFeatureMetadata - primitive-level EXT_FEATURE_METADATA extension data\n * @param textures - texture images\n * @param featureTexture - feature texture key\n */\nfunction handleExtFeatureMetadataExtension(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n extFeatureMetadata: GLTF_EXT_feature_metadata_Primitive,\n images: (TextureImageProperties | null)[],\n featureTexture: string | null\n): NumericArray {\n // Take only first extension object to get batchIds attribute name.\n const featureIdAttribute = extFeatureMetadata?.featureIdAttributes?.[0];\n\n if (featureIdAttribute?.featureIds?.attribute) {\n const batchIdsAttribute = attributes[featureIdAttribute.featureIds.attribute];\n return batchIdsAttribute.value;\n }\n\n if (\n featureIdAttribute?.featureIds?.hasOwnProperty('constant') &&\n featureIdAttribute?.featureIds?.hasOwnProperty('divisor')\n ) {\n const featuresCount = attributes?.POSITIONS?.value.length / 3 || 0;\n return generateImplicitFeatureIds(\n featuresCount,\n featureIdAttribute.featureIds.constant,\n featureIdAttribute.featureIds.divisor\n );\n }\n\n // Take only first extension object to get batchIds attribute name.\n const featureIdTexture =\n extFeatureMetadata?.featureIdTextures && extFeatureMetadata?.featureIdTextures[0];\n\n if (featureIdTexture) {\n const textureAttributeIndex = featureIdTexture?.featureIds?.texture?.texCoord || 0;\n const textCoordAttribute = `TEXCOORD_${textureAttributeIndex}`;\n const textureCoordinates = attributes[textCoordAttribute].value;\n return generateBatchIdsFromTexture(featureIdTexture, textureCoordinates, images);\n }\n\n if (featureTexture) {\n const batchIdsAttribute = attributes[featureTexture];\n return batchIdsAttribute.value;\n }\n\n return [];\n}\n\n/**\n * Generates implicit feature ids\n * @see - https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_feature_metadata#implicit-feature-ids\n * @param featuresCount\n * @param constant\n * @param devisor\n */\nfunction generateImplicitFeatureIds(\n featuresCount: number,\n constant: number = 0,\n divisor: number = 0\n): number[] {\n let featureIds: number[] = [];\n\n if (divisor > 0) {\n let currentValue = constant;\n let devisorCounter = divisor;\n\n for (let index = 0; index < featuresCount; index++) {\n featureIds.push(currentValue);\n\n devisorCounter -= 1;\n\n if (devisorCounter === 0) {\n currentValue++;\n devisorCounter = divisor;\n }\n }\n } else {\n featureIds = Array<number>(featuresCount).fill(constant, 0, featuresCount);\n }\n\n return featureIds;\n}\n\n/**\n * Get batchIds from texture.\n * @param primitive\n * @param featureIdTextures\n */\nfunction generateBatchIdsFromTexture(\n featureIdTexture: GLTF_EXT_feature_metadata_FeatureIdTexture,\n textureCoordinates: TypedArray,\n images: (TextureImageProperties | null)[]\n) {\n if (!images?.length) {\n return [];\n }\n\n const CHANNELS_MAP = {\n r: 0,\n g: 1,\n b: 2,\n a: 3\n };\n\n const textureIndex = featureIdTexture?.featureIds?.texture?.index;\n const featureChannel = featureIdTexture?.featureIds?.channels;\n\n if (!featureChannel || textureIndex === undefined) {\n return [];\n }\n\n const image = images[textureIndex];\n const batchIds: number[] = [];\n const channels = CHANNELS_MAP[featureChannel];\n\n if (image && image?.width && image?.height && image?.components) {\n for (let index = 0; index < textureCoordinates.length; index += 2) {\n const u = textureCoordinates[index];\n const v = textureCoordinates[index + 1];\n\n const tx = Math.min((emod(u) * image.width) | 0, image.width - 1);\n const ty = Math.min((emod(v) * image.height) | 0, image.height - 1);\n\n const offset = (ty * image.width + tx) * image.components + channels;\n const batchId = new Uint8Array(image.data)[offset];\n\n batchIds.push(batchId);\n }\n } else {\n console.warn(`Can't get batch Ids from ${image?.mimeType || ''} compressed texture`);\n }\n\n return batchIds;\n}\n"],"mappings":"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"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
export function flattenPropertyTableByFeatureIds(
|
|
1
|
+
export function flattenPropertyTableByFeatureIds(featureIdsMap, propertyTable) {
|
|
2
2
|
const resultPropertyTable = {};
|
|
3
3
|
for (const propertyName in propertyTable) {
|
|
4
4
|
const properties = propertyTable[propertyName];
|
|
5
|
-
resultPropertyTable[propertyName] = getPropertiesByFeatureIds(properties,
|
|
5
|
+
resultPropertyTable[propertyName] = getPropertiesByFeatureIds(properties, featureIdsMap);
|
|
6
6
|
}
|
|
7
7
|
return resultPropertyTable;
|
|
8
8
|
}
|
|
9
|
-
function getPropertiesByFeatureIds(properties,
|
|
9
|
+
function getPropertiesByFeatureIds(properties, featureIdsMap) {
|
|
10
10
|
const resultProperties = [];
|
|
11
11
|
if (properties) {
|
|
12
|
-
for (const
|
|
13
|
-
const property = properties[
|
|
12
|
+
for (const featureIdKey in featureIdsMap) {
|
|
13
|
+
const property = properties[featureIdKey] || null;
|
|
14
14
|
resultProperties.push(property);
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-attributes.js","names":["flattenPropertyTableByFeatureIds","featureIds","propertyTable","resultPropertyTable","propertyName","properties","getPropertiesByFeatureIds","resultProperties","featureId","property","push","checkPropertiesLength","needFlatten","attribute","Object","values","length","STRING_TYPE","SHORT_INT_TYPE","DOUBLE_TYPE","OBJECT_ID_TYPE","getAttributeType","key","Number","isInteger","createdStorageAttribute","attributeIndex","attributeType","storageAttribute","concat","name","ordering","header","valueType","attributeValues","valuesPerElement","setupIdAttribute","setupStringAttribute","setupDoubleAttribute","getFieldAttributeType","createFieldAttribute","fieldAttributeType","type","alias","createPopupInfo","title","mediaInfos","fieldInfos","popupElements","expressionInfos","fieldName","visible","isEditable","label","unshift","encoding","attributeByteCounts"],"sources":["../../../../src/i3s-converter/helpers/feature-attributes.ts"],"sourcesContent":["import type {FeatureTableJson} from '@loaders.gl/3d-tiles';\nimport {\n Attribute,\n AttributeStorageInfo,\n ESRIField,\n Field,\n FieldInfo,\n PopupInfo\n} from '@loaders.gl/i3s';\n\n/**\n * Takes attributes from property table based on featureIds.\n * If there is no property value for particular featureId (index) the property will be null.\n * Example:\n * Initial data:\n * OBJECTID: [0, 1, 5]\n * component: ['Windows', 'Frames', 'Wall', 'Roof', 'Skylight']\n * Result:\n * OBJECTID: [0, 1, 5]\n * component: ['Windows', 'Frames', 'null']\n * @param featureIds\n * @param propertyTable\n */\nexport function flattenPropertyTableByFeatureIds(\n featureIds: number[],\n propertyTable: FeatureTableJson\n): FeatureTableJson {\n const resultPropertyTable: FeatureTableJson = {};\n for (const propertyName in propertyTable) {\n const properties = propertyTable[propertyName];\n resultPropertyTable[propertyName] = getPropertiesByFeatureIds(properties, featureIds);\n }\n\n return resultPropertyTable;\n}\n\n/**\n * Getting properties by featureId index\n * @param properties\n * @param featureIds\n */\nfunction getPropertiesByFeatureIds(properties: unknown[], featureIds: number[]): unknown[] {\n const resultProperties: unknown[] = [];\n\n if (properties) {\n for (const featureId of featureIds) {\n const property = properties[featureId] || null;\n resultProperties.push(property);\n }\n }\n\n return resultProperties;\n}\n\n/**\n * Check that all attributes in propertyTable have the same length as FeatureIds.\n * If there are differencies between lengths we should flatten property table based on exiesting featureIds.\n * @param featureIds\n * @param propertyTable\n * @returns\n */\nexport function checkPropertiesLength(\n featureIds: number[],\n propertyTable: FeatureTableJson\n): boolean {\n let needFlatten = false;\n\n for (const attribute of Object.values(propertyTable)) {\n if (!featureIds || !attribute || featureIds.length !== attribute.length) {\n needFlatten = true;\n }\n }\n\n return needFlatten;\n}\n\n/** String data type name for feature attributes */\nconst STRING_TYPE = 'string';\n/** Integer data type name for feature attributes */\nconst SHORT_INT_TYPE = 'Int32';\n/** Double data type name for feature attributes */\nconst DOUBLE_TYPE = 'double';\n/** Type of attribute that is linked with feature ids */\nconst OBJECT_ID_TYPE = 'OBJECTID';\n/**\n * Get the attribute type for attributeStorageInfo https://github.com/Esri/i3s-spec/blob/master/docs/1.7/attributeStorageInfo.cmn.md\n * @param key - attribute's key\n * @param attribute - attribute's type in propertyTable\n */\nexport function getAttributeType(key: string, attribute: string): string {\n if (key === OBJECT_ID_TYPE) {\n return OBJECT_ID_TYPE;\n }\n if (typeof attribute === STRING_TYPE) {\n return STRING_TYPE;\n } else if (typeof attribute === 'number') {\n return Number.isInteger(attribute) ? SHORT_INT_TYPE : DOUBLE_TYPE;\n }\n return STRING_TYPE;\n}\n\n/**\n * Generate storage attribute for map segmentation.\n * @param attributeIndex - order index of attribute (f_0, f_1 ...).\n * @param key - attribute key from propertyTable.\n * @param attributeType - attribute type.\n * @return Updated storageAttribute.\n */\nexport function createdStorageAttribute(\n attributeIndex: number,\n key: string,\n attributeType: Attribute\n): AttributeStorageInfo {\n const storageAttribute = {\n key: `f_${attributeIndex}`,\n name: key,\n ordering: ['attributeValues'],\n header: [{property: 'count', valueType: 'UInt32'}],\n attributeValues: {valueType: 'Int32', valuesPerElement: 1}\n };\n\n switch (attributeType) {\n case OBJECT_ID_TYPE:\n setupIdAttribute(storageAttribute);\n break;\n case STRING_TYPE:\n setupStringAttribute(storageAttribute);\n break;\n case DOUBLE_TYPE:\n setupDoubleAttribute(storageAttribute);\n break;\n case SHORT_INT_TYPE:\n break;\n default:\n setupStringAttribute(storageAttribute);\n }\n\n return storageAttribute;\n}\n\n/**\n * Find and return attribute type based on key form propertyTable.\n * @param attributeType\n */\nexport function getFieldAttributeType(attributeType: Attribute): ESRIField {\n switch (attributeType) {\n case OBJECT_ID_TYPE:\n return 'esriFieldTypeOID';\n case STRING_TYPE:\n return 'esriFieldTypeString';\n case SHORT_INT_TYPE:\n return 'esriFieldTypeInteger';\n case DOUBLE_TYPE:\n return 'esriFieldTypeDouble';\n default:\n return 'esriFieldTypeString';\n }\n}\n\n/**\n * Setup field attribute for map segmentation.\n * @param key - attribute for map segmentation.\n * @param fieldAttributeType - esri attribute type ('esriFieldTypeString' or 'esriFieldTypeOID').\n */\nexport function createFieldAttribute(key: string, fieldAttributeType: ESRIField): Field {\n return {\n name: key,\n type: fieldAttributeType,\n alias: key\n };\n}\n\n/**\n * Generate popup info to show metadata on the map.\n * @param propertyTable - table data with OBJECTID.\n * @return data for correct rendering of popup.\n */\nexport function createPopupInfo(propertyTable: FeatureTableJson): PopupInfo {\n const title = '{OBJECTID}';\n const mediaInfos = [];\n const fieldInfos: FieldInfo[] = [];\n const popupElements: {\n fieldInfos: FieldInfo[];\n type: string;\n }[] = [];\n const expressionInfos = [];\n\n for (const key in propertyTable) {\n fieldInfos.push({\n fieldName: key,\n visible: true,\n isEditable: false,\n label: key\n });\n }\n popupElements.push({\n fieldInfos,\n type: 'fields'\n });\n\n return {\n title,\n mediaInfos,\n popupElements,\n fieldInfos,\n expressionInfos\n };\n}\n\n/**\n * Setup storage attribute as string.\n * @param storageAttribute - attribute for map segmentation.\n */\nfunction setupStringAttribute(storageAttribute: AttributeStorageInfo): void {\n // @ts-expect-error\n storageAttribute.ordering.unshift('attributeByteCounts');\n storageAttribute.header.push({property: 'attributeValuesByteCount', valueType: 'UInt32'});\n storageAttribute.attributeValues = {\n valueType: 'String',\n encoding: 'UTF-8',\n valuesPerElement: 1\n };\n storageAttribute.attributeByteCounts = {\n valueType: 'UInt32',\n valuesPerElement: 1\n };\n}\n\n/**\n * Setup Id attribute for map segmentation.\n * @param storageAttribute - attribute for map segmentation .\n */\nfunction setupIdAttribute(storageAttribute: AttributeStorageInfo): void {\n storageAttribute.attributeValues = {\n valueType: 'Oid32',\n valuesPerElement: 1\n };\n}\n\n/**\n * Setup double attribute for map segmentation.\n * @param storageAttribute - attribute for map segmentation .\n */\nfunction setupDoubleAttribute(storageAttribute: AttributeStorageInfo): void {\n storageAttribute.attributeValues = {\n valueType: 'Float64',\n valuesPerElement: 1\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"feature-attributes.js","names":["flattenPropertyTableByFeatureIds","featureIdsMap","propertyTable","resultPropertyTable","propertyName","properties","getPropertiesByFeatureIds","resultProperties","featureIdKey","property","push","checkPropertiesLength","featureIds","needFlatten","attribute","Object","values","length","STRING_TYPE","SHORT_INT_TYPE","DOUBLE_TYPE","OBJECT_ID_TYPE","getAttributeType","key","Number","isInteger","createdStorageAttribute","attributeIndex","attributeType","storageAttribute","concat","name","ordering","header","valueType","attributeValues","valuesPerElement","setupIdAttribute","setupStringAttribute","setupDoubleAttribute","getFieldAttributeType","createFieldAttribute","fieldAttributeType","type","alias","createPopupInfo","title","mediaInfos","fieldInfos","popupElements","expressionInfos","fieldName","visible","isEditable","label","unshift","encoding","attributeByteCounts"],"sources":["../../../../src/i3s-converter/helpers/feature-attributes.ts"],"sourcesContent":["import type {FeatureTableJson} from '@loaders.gl/3d-tiles';\nimport {\n Attribute,\n AttributeStorageInfo,\n ESRIField,\n Field,\n FieldInfo,\n PopupInfo\n} from '@loaders.gl/i3s';\n\n/**\n * Takes attributes from property table based on featureIdsMap.\n * If there is no property value for particular featureId (index) the property will be null.\n * Example:\n * Initial data:\n * OBJECTID: {0: 0, 3: 33, 4: 333}\n * component: ['Windows', 'Frames', 'Wall', 'Roof', 'Skylight']\n * Result:\n * OBJECTID: [0, 33, 333]\n * component: ['Windows', 'Roof', 'Skylight']\n * @param featureIdsMap\n * @param propertyTable\n */\nexport function flattenPropertyTableByFeatureIds(\n featureIdsMap: Record<string, number>,\n propertyTable: FeatureTableJson\n): FeatureTableJson {\n const resultPropertyTable: FeatureTableJson = {};\n for (const propertyName in propertyTable) {\n const properties = propertyTable[propertyName];\n resultPropertyTable[propertyName] = getPropertiesByFeatureIds(properties, featureIdsMap);\n }\n\n return resultPropertyTable;\n}\n\n/**\n * Getting properties by featureId index\n * @param properties\n * @param featureIdsMap\n */\nfunction getPropertiesByFeatureIds(\n properties: unknown[],\n featureIdsMap: Record<string, number>\n): unknown[] {\n const resultProperties: unknown[] = [];\n\n if (properties) {\n for (const featureIdKey in featureIdsMap) {\n const property = properties[featureIdKey] || null;\n resultProperties.push(property);\n }\n }\n\n return resultProperties;\n}\n\n/**\n * Check that all attributes in propertyTable have the same length as FeatureIds.\n * If there are differencies between lengths we should flatten property table based on exiesting featureIds.\n * @param featureIds\n * @param propertyTable\n * @returns\n */\nexport function checkPropertiesLength(\n featureIds: number[],\n propertyTable: FeatureTableJson\n): boolean {\n let needFlatten = false;\n\n for (const attribute of Object.values(propertyTable)) {\n if (!featureIds || !attribute || featureIds.length !== attribute.length) {\n needFlatten = true;\n }\n }\n\n return needFlatten;\n}\n\n/** String data type name for feature attributes */\nconst STRING_TYPE = 'string';\n/** Integer data type name for feature attributes */\nconst SHORT_INT_TYPE = 'Int32';\n/** Double data type name for feature attributes */\nconst DOUBLE_TYPE = 'double';\n/** Type of attribute that is linked with feature ids */\nconst OBJECT_ID_TYPE = 'OBJECTID';\n/**\n * Get the attribute type for attributeStorageInfo https://github.com/Esri/i3s-spec/blob/master/docs/1.7/attributeStorageInfo.cmn.md\n * @param key - attribute's key\n * @param attribute - attribute's type in propertyTable\n */\nexport function getAttributeType(key: string, attribute: string): string {\n if (key === OBJECT_ID_TYPE) {\n return OBJECT_ID_TYPE;\n }\n if (typeof attribute === STRING_TYPE) {\n return STRING_TYPE;\n } else if (typeof attribute === 'number') {\n return Number.isInteger(attribute) ? SHORT_INT_TYPE : DOUBLE_TYPE;\n }\n return STRING_TYPE;\n}\n\n/**\n * Generate storage attribute for map segmentation.\n * @param attributeIndex - order index of attribute (f_0, f_1 ...).\n * @param key - attribute key from propertyTable.\n * @param attributeType - attribute type.\n * @return Updated storageAttribute.\n */\nexport function createdStorageAttribute(\n attributeIndex: number,\n key: string,\n attributeType: Attribute\n): AttributeStorageInfo {\n const storageAttribute = {\n key: `f_${attributeIndex}`,\n name: key,\n ordering: ['attributeValues'],\n header: [{property: 'count', valueType: 'UInt32'}],\n attributeValues: {valueType: 'Int32', valuesPerElement: 1}\n };\n\n switch (attributeType) {\n case OBJECT_ID_TYPE:\n setupIdAttribute(storageAttribute);\n break;\n case STRING_TYPE:\n setupStringAttribute(storageAttribute);\n break;\n case DOUBLE_TYPE:\n setupDoubleAttribute(storageAttribute);\n break;\n case SHORT_INT_TYPE:\n break;\n default:\n setupStringAttribute(storageAttribute);\n }\n\n return storageAttribute;\n}\n\n/**\n * Find and return attribute type based on key form propertyTable.\n * @param attributeType\n */\nexport function getFieldAttributeType(attributeType: Attribute): ESRIField {\n switch (attributeType) {\n case OBJECT_ID_TYPE:\n return 'esriFieldTypeOID';\n case STRING_TYPE:\n return 'esriFieldTypeString';\n case SHORT_INT_TYPE:\n return 'esriFieldTypeInteger';\n case DOUBLE_TYPE:\n return 'esriFieldTypeDouble';\n default:\n return 'esriFieldTypeString';\n }\n}\n\n/**\n * Setup field attribute for map segmentation.\n * @param key - attribute for map segmentation.\n * @param fieldAttributeType - esri attribute type ('esriFieldTypeString' or 'esriFieldTypeOID').\n */\nexport function createFieldAttribute(key: string, fieldAttributeType: ESRIField): Field {\n return {\n name: key,\n type: fieldAttributeType,\n alias: key\n };\n}\n\n/**\n * Generate popup info to show metadata on the map.\n * @param propertyTable - table data with OBJECTID.\n * @return data for correct rendering of popup.\n */\nexport function createPopupInfo(propertyTable: FeatureTableJson): PopupInfo {\n const title = '{OBJECTID}';\n const mediaInfos = [];\n const fieldInfos: FieldInfo[] = [];\n const popupElements: {\n fieldInfos: FieldInfo[];\n type: string;\n }[] = [];\n const expressionInfos = [];\n\n for (const key in propertyTable) {\n fieldInfos.push({\n fieldName: key,\n visible: true,\n isEditable: false,\n label: key\n });\n }\n popupElements.push({\n fieldInfos,\n type: 'fields'\n });\n\n return {\n title,\n mediaInfos,\n popupElements,\n fieldInfos,\n expressionInfos\n };\n}\n\n/**\n * Setup storage attribute as string.\n * @param storageAttribute - attribute for map segmentation.\n */\nfunction setupStringAttribute(storageAttribute: AttributeStorageInfo): void {\n // @ts-expect-error\n storageAttribute.ordering.unshift('attributeByteCounts');\n storageAttribute.header.push({property: 'attributeValuesByteCount', valueType: 'UInt32'});\n storageAttribute.attributeValues = {\n valueType: 'String',\n encoding: 'UTF-8',\n valuesPerElement: 1\n };\n storageAttribute.attributeByteCounts = {\n valueType: 'UInt32',\n valuesPerElement: 1\n };\n}\n\n/**\n * Setup Id attribute for map segmentation.\n * @param storageAttribute - attribute for map segmentation .\n */\nfunction setupIdAttribute(storageAttribute: AttributeStorageInfo): void {\n storageAttribute.attributeValues = {\n valueType: 'Oid32',\n valuesPerElement: 1\n };\n}\n\n/**\n * Setup double attribute for map segmentation.\n * @param storageAttribute - attribute for map segmentation .\n */\nfunction setupDoubleAttribute(storageAttribute: AttributeStorageInfo): void {\n storageAttribute.attributeValues = {\n valueType: 'Float64',\n valuesPerElement: 1\n };\n}\n"],"mappings":"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"}
|
|
@@ -91,6 +91,11 @@ function makeAttributeObjects(attributes) {
|
|
|
91
91
|
let colorsList = new Uint8Array(colors);
|
|
92
92
|
let texCoordsList = new Float32Array(texCoords);
|
|
93
93
|
let uvRegionsList = new Uint16Array(uvRegions);
|
|
94
|
+
let positionsOffset = 0;
|
|
95
|
+
let normalsOffset = 0;
|
|
96
|
+
let colorsOffset = 0;
|
|
97
|
+
let uvRegionsOffset = 0;
|
|
98
|
+
let texCoordsOffset = 0;
|
|
94
99
|
for (let index = 0; index < featureIds.length; index++) {
|
|
95
100
|
const startIndex = faceRange[index * 2];
|
|
96
101
|
const endIndex = faceRange[index * 2 + 1];
|
|
@@ -101,19 +106,19 @@ function makeAttributeObjects(attributes) {
|
|
|
101
106
|
const texCoordsCount = getSliceAttributeCount('texCoords', startIndex, endIndex);
|
|
102
107
|
groupedData.push({
|
|
103
108
|
featureId: featureIds[index],
|
|
104
|
-
positions: positionsList.
|
|
105
|
-
normals: normalsList.
|
|
106
|
-
colors: colorsList.
|
|
107
|
-
uvRegions: uvRegionsList.
|
|
108
|
-
texCoords: texCoordsList.
|
|
109
|
+
positions: positionsList.subarray(positionsOffset, positionsOffset + positionsCount),
|
|
110
|
+
normals: normalsList.subarray(normalsOffset, normalsOffset + normalsCount),
|
|
111
|
+
colors: colorsList.subarray(colorsOffset, colorsOffset + colorsCount),
|
|
112
|
+
uvRegions: uvRegionsList.subarray(uvRegionsOffset, uvRegionsOffset + uvRegionsCount),
|
|
113
|
+
texCoords: texCoordsList.subarray(texCoordsOffset, texCoordsOffset + texCoordsCount)
|
|
109
114
|
});
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
+
positionsOffset += positionsCount;
|
|
116
|
+
normalsOffset += normalsCount;
|
|
117
|
+
colorsOffset += colorsCount;
|
|
118
|
+
uvRegionsOffset += uvRegionsCount;
|
|
119
|
+
texCoordsOffset += texCoordsCount;
|
|
115
120
|
}
|
|
116
|
-
return groupedData
|
|
121
|
+
return groupedData;
|
|
117
122
|
}
|
|
118
123
|
function getSliceAttributeCount(attributeName, startIndex, endIndex) {
|
|
119
124
|
const itemsPerVertex4 = 4;
|
|
@@ -134,58 +139,95 @@ function getSliceAttributeCount(attributeName, startIndex, endIndex) {
|
|
|
134
139
|
}
|
|
135
140
|
}
|
|
136
141
|
function unifyObjectsByFeatureId(sortedData) {
|
|
137
|
-
const
|
|
138
|
-
for (
|
|
139
|
-
const
|
|
140
|
-
const existingObject = uniqueObjects.find(obj => obj.featureId === currentObject.featureId);
|
|
142
|
+
const groupedMetadata = [];
|
|
143
|
+
for (const data of sortedData) {
|
|
144
|
+
const existingObject = groupedMetadata.find(obj => obj.featureId === data.featureId);
|
|
141
145
|
if (existingObject) {
|
|
142
|
-
existingObject.
|
|
143
|
-
existingObject.normals = concatenateTypedArrays(existingObject.normals, currentObject.normals);
|
|
144
|
-
existingObject.colors = concatenateTypedArrays(existingObject.colors, currentObject.colors);
|
|
145
|
-
existingObject.texCoords = concatenateTypedArrays(existingObject.texCoords, currentObject.texCoords);
|
|
146
|
-
existingObject.uvRegions = concatenateTypedArrays(existingObject.uvRegions, currentObject.uvRegions);
|
|
146
|
+
existingObject.attributes.push(data);
|
|
147
147
|
} else {
|
|
148
|
-
|
|
148
|
+
groupedMetadata.push({
|
|
149
|
+
featureId: data.featureId,
|
|
150
|
+
attributes: [data]
|
|
151
|
+
});
|
|
149
152
|
}
|
|
150
153
|
}
|
|
154
|
+
const uniqueObjects = [];
|
|
155
|
+
for (const metatada of groupedMetadata) {
|
|
156
|
+
const attributes = concatenateAttributes(metatada.attributes);
|
|
157
|
+
uniqueObjects.push({
|
|
158
|
+
featureId: metatada.featureId,
|
|
159
|
+
...attributes
|
|
160
|
+
});
|
|
161
|
+
}
|
|
151
162
|
return uniqueObjects;
|
|
152
163
|
}
|
|
153
164
|
function groupAttributesAndRangesByFeatureId(unifiedObjects, featureCount) {
|
|
154
165
|
const firstAttributeObject = unifiedObjects[0];
|
|
155
166
|
const featureIds = [firstAttributeObject.featureId || 0];
|
|
156
|
-
let positions = new Float32Array(firstAttributeObject.positions);
|
|
157
|
-
let normals = new Float32Array(firstAttributeObject.normals);
|
|
158
|
-
let colors = new Uint8Array(firstAttributeObject.colors);
|
|
159
|
-
let uvRegions = new Uint16Array(firstAttributeObject.uvRegions);
|
|
160
|
-
let texCoords = new Float32Array(firstAttributeObject.texCoords);
|
|
161
167
|
const range = [0];
|
|
162
168
|
let objIndex = 0;
|
|
163
169
|
let sum = 0;
|
|
164
170
|
for (let index = 1; index < unifiedObjects.length; index++) {
|
|
165
171
|
const currentAttributesObject = unifiedObjects[index];
|
|
166
172
|
featureIds.push(currentAttributesObject.featureId || 0);
|
|
167
|
-
positions = concatenateTypedArrays(positions, currentAttributesObject.positions);
|
|
168
|
-
normals = concatenateTypedArrays(normals, currentAttributesObject.normals);
|
|
169
|
-
colors = concatenateTypedArrays(colors, currentAttributesObject.colors);
|
|
170
|
-
uvRegions = concatenateTypedArrays(uvRegions, currentAttributesObject.uvRegions);
|
|
171
|
-
texCoords = concatenateTypedArrays(texCoords, currentAttributesObject.texCoords);
|
|
172
173
|
const groupedObject = unifiedObjects[objIndex];
|
|
173
174
|
range.push(groupedObject.positions.length / POSITIONS_AND_NORMALS_PER_TRIANGLE - 1 + sum);
|
|
174
175
|
range.push(groupedObject.positions.length / POSITIONS_AND_NORMALS_PER_TRIANGLE + sum);
|
|
175
176
|
sum += groupedObject.positions.length / POSITIONS_AND_NORMALS_PER_TRIANGLE;
|
|
176
177
|
objIndex += 1;
|
|
177
178
|
}
|
|
178
|
-
|
|
179
|
+
const attributes = concatenateAttributes(unifiedObjects);
|
|
180
|
+
range.push(attributes.positions.length / POSITIONS_AND_NORMALS_PER_TRIANGLE - 1);
|
|
179
181
|
const faceRange = new Uint32Array(range);
|
|
180
182
|
return {
|
|
181
183
|
faceRange,
|
|
182
184
|
featureIds,
|
|
185
|
+
featureCount,
|
|
186
|
+
...attributes
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function concatenateAttributes(attributes) {
|
|
190
|
+
const positionGroups = attributes.map(_ref => {
|
|
191
|
+
let {
|
|
192
|
+
positions
|
|
193
|
+
} = _ref;
|
|
194
|
+
return positions;
|
|
195
|
+
});
|
|
196
|
+
const positions = positionGroups.length > 1 ? concatenateTypedArrays(...positionGroups) : positionGroups[0];
|
|
197
|
+
const normalGroups = attributes.map(_ref2 => {
|
|
198
|
+
let {
|
|
199
|
+
normals
|
|
200
|
+
} = _ref2;
|
|
201
|
+
return normals;
|
|
202
|
+
});
|
|
203
|
+
const normals = normalGroups.length > 1 ? concatenateTypedArrays(...normalGroups) : normalGroups[0];
|
|
204
|
+
const colorGroups = attributes.map(_ref3 => {
|
|
205
|
+
let {
|
|
206
|
+
colors
|
|
207
|
+
} = _ref3;
|
|
208
|
+
return colors;
|
|
209
|
+
});
|
|
210
|
+
const colors = colorGroups.length > 1 ? concatenateTypedArrays(...colorGroups) : colorGroups[0];
|
|
211
|
+
const texCoordGroups = attributes.map(_ref4 => {
|
|
212
|
+
let {
|
|
213
|
+
texCoords
|
|
214
|
+
} = _ref4;
|
|
215
|
+
return texCoords;
|
|
216
|
+
});
|
|
217
|
+
const texCoords = texCoordGroups.length > 1 ? concatenateTypedArrays(...texCoordGroups) : texCoordGroups[0];
|
|
218
|
+
const uvRegionGroups = attributes.map(_ref5 => {
|
|
219
|
+
let {
|
|
220
|
+
uvRegions
|
|
221
|
+
} = _ref5;
|
|
222
|
+
return uvRegions;
|
|
223
|
+
});
|
|
224
|
+
const uvRegions = uvRegionGroups.length > 1 ? concatenateTypedArrays(...uvRegionGroups) : uvRegionGroups[0];
|
|
225
|
+
return {
|
|
183
226
|
positions,
|
|
184
227
|
normals,
|
|
185
228
|
colors,
|
|
186
|
-
uvRegions,
|
|
187
229
|
texCoords,
|
|
188
|
-
|
|
230
|
+
uvRegions
|
|
189
231
|
};
|
|
190
232
|
}
|
|
191
233
|
//# sourceMappingURL=geometry-attributes.js.map
|