@loaders.gl/tile-converter 3.3.0-alpha.3 → 3.3.0-alpha.5
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-attributes-worker.d.ts +1 -1
- package/dist/3d-tiles-attributes-worker.js +2 -2
- package/dist/3d-tiles-attributes-worker.js.map +2 -2
- package/dist/3d-tiles-converter/3d-tiles-converter.d.ts +8 -0
- package/dist/3d-tiles-converter/3d-tiles-converter.d.ts.map +1 -1
- package/dist/3d-tiles-converter/3d-tiles-converter.js +57 -43
- package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts +5 -5
- package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts.map +1 -1
- package/dist/3d-tiles-converter/helpers/b3dm-converter.js +21 -17
- package/dist/converter.min.js +21 -21
- package/dist/deps-installer/deps-installer.d.ts +5 -1
- package/dist/deps-installer/deps-installer.d.ts.map +1 -1
- package/dist/deps-installer/deps-installer.js +21 -1
- package/dist/dist.min.js +662 -1018
- package/dist/es5/3d-tiles-attributes-worker.js +2 -2
- package/dist/es5/3d-tiles-attributes-worker.js.map +1 -1
- package/dist/es5/3d-tiles-converter/3d-tiles-converter.js +115 -101
- package/dist/es5/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
- package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js +27 -19
- package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
- package/dist/es5/deps-installer/deps-installer.js +70 -6
- package/dist/es5/deps-installer/deps-installer.js.map +1 -1
- package/dist/es5/i3s-attributes-worker.js +1 -1
- package/dist/es5/i3s-attributes-worker.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js +4 -0
- package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/coordinate-converter.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/feature-attributes.js +153 -0
- package/dist/es5/i3s-converter/helpers/feature-attributes.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/geometry-converter.js +40 -44
- package/dist/es5/i3s-converter/helpers/geometry-converter.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/gltf-attributes.js +55 -36
- package/dist/es5/i3s-converter/helpers/gltf-attributes.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/node-pages.js +10 -2
- package/dist/es5/i3s-converter/helpers/node-pages.js.map +1 -1
- package/dist/es5/i3s-converter/i3s-converter.js +364 -435
- package/dist/es5/i3s-converter/i3s-converter.js.map +1 -1
- package/dist/es5/pgm-loader.js +1 -1
- package/dist/es5/workers/3d-tiles-attributes-worker.js +1 -1
- package/dist/es5/workers/3d-tiles-attributes-worker.js.map +1 -1
- package/dist/esm/3d-tiles-attributes-worker.js +2 -2
- package/dist/esm/3d-tiles-attributes-worker.js.map +1 -1
- package/dist/esm/3d-tiles-converter/3d-tiles-converter.js +59 -44
- package/dist/esm/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
- package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js +25 -15
- package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
- package/dist/esm/deps-installer/deps-installer.js +21 -2
- package/dist/esm/deps-installer/deps-installer.js.map +1 -1
- package/dist/esm/i3s-attributes-worker.js +1 -1
- package/dist/esm/i3s-attributes-worker.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js +4 -0
- package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/coordinate-converter.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/feature-attributes.js +138 -0
- package/dist/esm/i3s-converter/helpers/feature-attributes.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/geometry-converter.js +19 -21
- package/dist/esm/i3s-converter/helpers/geometry-converter.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/gltf-attributes.js +55 -36
- package/dist/esm/i3s-converter/helpers/gltf-attributes.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/node-pages.js +9 -2
- package/dist/esm/i3s-converter/helpers/node-pages.js.map +1 -1
- package/dist/esm/i3s-converter/i3s-converter.js +93 -183
- package/dist/esm/i3s-converter/i3s-converter.js.map +1 -1
- package/dist/esm/pgm-loader.js +1 -1
- package/dist/esm/workers/3d-tiles-attributes-worker.js +1 -1
- package/dist/esm/workers/3d-tiles-attributes-worker.js.map +1 -1
- package/dist/i3s-attributes-worker.d.ts +5 -1
- package/dist/i3s-attributes-worker.d.ts.map +1 -1
- package/dist/i3s-attributes-worker.js +3 -3
- package/dist/i3s-attributes-worker.js.map +2 -2
- package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts +2 -3
- package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/batch-ids-extensions.js +3 -0
- package/dist/i3s-converter/helpers/coordinate-converter.d.ts +2 -2
- package/dist/i3s-converter/helpers/coordinate-converter.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/feature-attributes.d.ts +32 -0
- package/dist/i3s-converter/helpers/feature-attributes.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/feature-attributes.js +162 -1
- package/dist/i3s-converter/helpers/geometry-converter.d.ts +5 -4
- package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/geometry-converter.js +29 -27
- package/dist/i3s-converter/helpers/gltf-attributes.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/gltf-attributes.js +50 -30
- package/dist/i3s-converter/helpers/node-pages.d.ts +4 -0
- package/dist/i3s-converter/helpers/node-pages.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/node-pages.js +9 -2
- package/dist/i3s-converter/i3s-converter.d.ts +24 -48
- package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
- package/dist/i3s-converter/i3s-converter.js +88 -186
- package/dist/i3s-converter/types.d.ts +4 -0
- package/dist/i3s-converter/types.d.ts.map +1 -1
- package/dist/workers/3d-tiles-attributes-worker.js +1 -1
- package/package.json +15 -15
- package/src/3d-tiles-attributes-worker.ts +1 -1
- package/src/3d-tiles-converter/3d-tiles-converter.ts +71 -55
- package/src/3d-tiles-converter/helpers/b3dm-converter.ts +25 -18
- package/src/deps-installer/deps-installer.ts +29 -2
- package/src/i3s-attributes-worker.ts +5 -1
- package/src/i3s-converter/helpers/batch-ids-extensions.ts +13 -6
- package/src/i3s-converter/helpers/coordinate-converter.ts +2 -2
- package/src/i3s-converter/helpers/feature-attributes.ts +182 -0
- package/src/i3s-converter/helpers/geometry-converter.ts +45 -36
- package/src/i3s-converter/helpers/gltf-attributes.ts +54 -33
- package/src/i3s-converter/helpers/node-pages.ts +10 -2
- package/src/i3s-converter/i3s-converter.ts +125 -210
- package/src/i3s-converter/types.ts +4 -0
- package/src/workers/3d-tiles-attributes-worker.ts +1 -1
|
@@ -57,7 +57,7 @@ var B3dmConverter = function () {
|
|
|
57
57
|
case 0:
|
|
58
58
|
featureAttributes = _args.length > 1 && _args[1] !== undefined ? _args[1] : null;
|
|
59
59
|
_context.next = 3;
|
|
60
|
-
return this.buildGltf(i3sAttributesData);
|
|
60
|
+
return this.buildGltf(i3sAttributesData, featureAttributes);
|
|
61
61
|
|
|
62
62
|
case 3:
|
|
63
63
|
gltf = _context.sent;
|
|
@@ -86,7 +86,7 @@ var B3dmConverter = function () {
|
|
|
86
86
|
}, {
|
|
87
87
|
key: "buildGltf",
|
|
88
88
|
value: function () {
|
|
89
|
-
var _buildGltf = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee2(i3sAttributesData) {
|
|
89
|
+
var _buildGltf = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee2(i3sAttributesData, featureAttributes) {
|
|
90
90
|
var tileContent, textureFormat, material, attributes, originalIndices, cartesianOrigin, cartographicOrigin, modelMatrix, gltfBuilder, textureIndex, pbrMaterialInfo, materialIndex, positions, positionsValue, indices, meshIndex, transformMatrix, nodeIndex, sceneIndex, gltfBuffer;
|
|
91
91
|
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
92
92
|
while (1) {
|
|
@@ -111,6 +111,8 @@ var B3dmConverter = function () {
|
|
|
111
111
|
|
|
112
112
|
attributes.positions.value = this._normalizePositions(positionsValue, cartesianOrigin, cartographicOrigin, modelMatrix);
|
|
113
113
|
|
|
114
|
+
this._createBatchIds(tileContent, featureAttributes);
|
|
115
|
+
|
|
114
116
|
if (attributes.normals && !this._checkNormals(attributes.normals.value)) {
|
|
115
117
|
delete attributes.normals;
|
|
116
118
|
}
|
|
@@ -135,7 +137,7 @@ var B3dmConverter = function () {
|
|
|
135
137
|
gltfBuffer = (0, _core.encodeSync)(gltfBuilder.gltf, _gltf.GLTFWriter);
|
|
136
138
|
return _context2.abrupt("return", gltfBuffer);
|
|
137
139
|
|
|
138
|
-
case
|
|
140
|
+
case 23:
|
|
139
141
|
case "end":
|
|
140
142
|
return _context2.stop();
|
|
141
143
|
}
|
|
@@ -143,7 +145,7 @@ var B3dmConverter = function () {
|
|
|
143
145
|
}, _callee2, this);
|
|
144
146
|
}));
|
|
145
147
|
|
|
146
|
-
function buildGltf(_x2) {
|
|
148
|
+
function buildGltf(_x2, _x3) {
|
|
147
149
|
return _buildGltf.apply(this, arguments);
|
|
148
150
|
}
|
|
149
151
|
|
|
@@ -185,7 +187,7 @@ var B3dmConverter = function () {
|
|
|
185
187
|
}, _callee3, this);
|
|
186
188
|
}));
|
|
187
189
|
|
|
188
|
-
function _addI3sTextureToGltf(
|
|
190
|
+
function _addI3sTextureToGltf(_x4, _x5, _x6) {
|
|
189
191
|
return _addI3sTextureToGltf2.apply(this, arguments);
|
|
190
192
|
}
|
|
191
193
|
|
|
@@ -217,22 +219,28 @@ var B3dmConverter = function () {
|
|
|
217
219
|
return result;
|
|
218
220
|
}
|
|
219
221
|
}, {
|
|
220
|
-
key: "
|
|
221
|
-
value: function
|
|
222
|
-
var
|
|
223
|
-
|
|
224
|
-
var
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
222
|
+
key: "_createBatchIds",
|
|
223
|
+
value: function _createBatchIds(i3sContent, featureAttributes) {
|
|
224
|
+
var featureIds = i3sContent.featureIds;
|
|
225
|
+
|
|
226
|
+
var _ref = featureAttributes || {},
|
|
227
|
+
objectIds = _ref.OBJECTID;
|
|
228
|
+
|
|
229
|
+
if (!featureIds || !objectIds) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
for (var i = 0; i < featureIds.length; i++) {
|
|
234
|
+
var featureId = featureIds[i];
|
|
235
|
+
var batchId = objectIds.indexOf(featureId);
|
|
236
|
+
featureIds[i] = batchId;
|
|
233
237
|
}
|
|
234
238
|
|
|
235
|
-
|
|
239
|
+
i3sContent.attributes._BATCHID = {
|
|
240
|
+
size: 1,
|
|
241
|
+
byteOffset: 0,
|
|
242
|
+
value: featureIds
|
|
243
|
+
};
|
|
236
244
|
}
|
|
237
245
|
}, {
|
|
238
246
|
key: "_generateSynteticIndices",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/3d-tiles-converter/helpers/b3dm-converter.ts"],"names":["Z_UP_TO_Y_UP_MATRIX","Matrix4","scratchVector","Vector3","B3dmConverter","i3sAttributesData","featureAttributes","buildGltf","gltf","b3dm","gltfEncoded","Uint8Array","type","featuresLength","_getFeaturesLength","batchTable","Tile3DWriter","tileContent","textureFormat","material","attributes","originalIndices","indices","cartesianOrigin","cartographicOrigin","modelMatrix","gltfBuilder","GLTFScenegraph","_addI3sTextureToGltf","textureIndex","pbrMaterialInfo","_convertI3sMaterialToGltfMaterial","materialIndex","addMaterial","positions","positionsValue","value","uvRegions","texCoords","_normalizePositions","normals","_checkNormals","_generateSynteticIndices","length","size","meshIndex","addMesh","mode","transformMatrix","_generateTransformMatrix","nodeIndex","addNode","matrix","sceneIndex","addScene","nodeIndices","setDefaultScene","createBinaryChunk","gltfBuffer","GLTFWriter","texture","selectedTexture","pbrMetallicRoughness","baseColorTexture","source","image","mimeType","_deduceMimeTypeFromFormat","imageIndex","addImage","addTexture","colors","newPositionsValue","Float32Array","index","vertex","subarray","cartesianOriginVector","vertexVector","Array","from","transform","add","Ellipsoid","WGS84","cartographicToCartesian","subtract","set","translateOriginMatrix","translate","result","multiplyLeft","faceRanges","batchIdArraySize","batchId","rangeIndex","currentBatchId","fromIndex","untilPosition","fill","vertexCount","Uint32Array","format","console","warn","isTextureIndexExists","alphaMode","doubleSided","metallicFactor","roughnessFactor","texCoord","baseColorFactor","_setGltfTexture","materialDefinition","emissiveTexture","metallicRoughnessTexture","normalTexture","occlusionTexture","firstKey","Object","keys","find"],"mappings":"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","sourcesContent":["import type {I3SAttributesData} from '../../3d-tiles-attributes-worker';\n\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';\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\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);\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(i3sAttributesData: I3SAttributesData): Promise<ArrayBuffer> {\n const {tileContent, textureFormat} = i3sAttributesData;\n const {\n material,\n attributes,\n indices: originalIndices,\n cartesianOrigin,\n cartographicOrigin,\n modelMatrix\n } = 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 attributes.positions.value = this._normalizePositions(\n positionsValue,\n cartesianOrigin,\n cartographicOrigin,\n modelMatrix\n );\n if (attributes.normals && !this._checkNormals(attributes.normals.value)) {\n delete attributes.normals;\n }\n const indices =\n originalIndices || this._generateSynteticIndices(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 * Generate batchId attribute from faceRanges.\n * @param {Uint32Array} faceRanges - the source array\n * @returns {Float32Array} batchId list.\n */\n _generateBatchId(faceRanges) {\n const batchIdArraySize = (faceRanges[faceRanges.length - 1] + 1) * 3;\n const batchId = new Float32Array(batchIdArraySize);\n let rangeIndex = 0;\n let currentBatchId = 0;\n\n for (let index = 0; index < faceRanges.length / 2; index++) {\n const fromIndex = faceRanges[rangeIndex] * 3;\n const untilPosition = (faceRanges[rangeIndex + 1] + 1) * 3;\n\n batchId.fill(currentBatchId, fromIndex, untilPosition);\n rangeIndex += 2;\n currentBatchId += 1;\n }\n return batchId;\n }\n\n /**\n * luma.gl can not work without indices now:\n * https://github.com/visgl/luma.gl/blob/d8cad75b9f8ca3e578cf078ed9d19e619c2ddbc9/modules/experimental/src/gltf/gltf-instantiator.js#L115\n * This method generates syntetic indices array: [0, 1, 2, 3, .... , vertexCount-1]\n * @param {number} vertexCount - vertex count in the geometry\n * @returns {Uint32Array} indices array.\n */\n _generateSynteticIndices(vertexCount) {\n const result = new Uint32Array(vertexCount);\n for (let index = 0; index < vertexCount; index++) {\n result.set([index], index);\n }\n return result;\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"],"file":"b3dm-converter.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/3d-tiles-converter/helpers/b3dm-converter.ts"],"names":["Z_UP_TO_Y_UP_MATRIX","Matrix4","scratchVector","Vector3","B3dmConverter","i3sAttributesData","featureAttributes","buildGltf","gltf","b3dm","gltfEncoded","Uint8Array","type","featuresLength","_getFeaturesLength","batchTable","Tile3DWriter","tileContent","textureFormat","material","attributes","originalIndices","indices","cartesianOrigin","cartographicOrigin","modelMatrix","gltfBuilder","GLTFScenegraph","_addI3sTextureToGltf","textureIndex","pbrMaterialInfo","_convertI3sMaterialToGltfMaterial","materialIndex","addMaterial","positions","positionsValue","value","uvRegions","texCoords","_normalizePositions","_createBatchIds","normals","_checkNormals","_generateSynteticIndices","length","size","meshIndex","addMesh","mode","transformMatrix","_generateTransformMatrix","nodeIndex","addNode","matrix","sceneIndex","addScene","nodeIndices","setDefaultScene","createBinaryChunk","gltfBuffer","GLTFWriter","texture","selectedTexture","pbrMetallicRoughness","baseColorTexture","source","image","mimeType","_deduceMimeTypeFromFormat","imageIndex","addImage","addTexture","colors","newPositionsValue","Float32Array","index","vertex","subarray","cartesianOriginVector","vertexVector","Array","from","transform","add","Ellipsoid","WGS84","cartographicToCartesian","subtract","set","translateOriginMatrix","translate","result","multiplyLeft","i3sContent","featureIds","objectIds","OBJECTID","i","featureId","batchId","indexOf","_BATCHID","byteOffset","vertexCount","Uint32Array","format","console","warn","isTextureIndexExists","alphaMode","doubleSided","metallicFactor","roughnessFactor","texCoord","baseColorFactor","_setGltfTexture","materialDefinition","emissiveTexture","metallicRoughnessTexture","normalTexture","occlusionTexture","firstKey","Object","keys","find"],"mappings":"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","sourcesContent":["import type {I3SAttributesData} from '../../3d-tiles-attributes-worker';\n\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';\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\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} = i3sAttributesData;\n const {\n material,\n attributes,\n indices: originalIndices,\n cartesianOrigin,\n cartographicOrigin,\n modelMatrix\n } = 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 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 || this._generateSynteticIndices(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 * luma.gl can not work without indices now:\n * https://github.com/visgl/luma.gl/blob/d8cad75b9f8ca3e578cf078ed9d19e619c2ddbc9/modules/experimental/src/gltf/gltf-instantiator.js#L115\n * This method generates syntetic indices array: [0, 1, 2, 3, .... , vertexCount-1]\n * @param {number} vertexCount - vertex count in the geometry\n * @returns {Uint32Array} indices array.\n */\n _generateSynteticIndices(vertexCount) {\n const result = new Uint32Array(vertexCount);\n for (let index = 0; index < vertexCount; index++) {\n result.set([index], index);\n }\n return result;\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"],"file":"b3dm-converter.js"}
|
|
@@ -23,6 +23,7 @@ var _fileUtils = require("../lib/utils/file-utils");
|
|
|
23
23
|
|
|
24
24
|
var _path = require("path");
|
|
25
25
|
|
|
26
|
+
var VERSION = typeof "3.3.0-alpha.5" !== 'undefined' ? "3.3.0-alpha.5" : 'beta';
|
|
26
27
|
var PGM_LINK = 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/egm/egm2008-5.zip';
|
|
27
28
|
|
|
28
29
|
var DepsInstaller = function () {
|
|
@@ -35,6 +36,7 @@ var DepsInstaller = function () {
|
|
|
35
36
|
value: function () {
|
|
36
37
|
var _install = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee() {
|
|
37
38
|
var path,
|
|
39
|
+
workersPath,
|
|
38
40
|
fileMap,
|
|
39
41
|
depsPath,
|
|
40
42
|
_args = arguments;
|
|
@@ -43,11 +45,12 @@ var DepsInstaller = function () {
|
|
|
43
45
|
switch (_context.prev = _context.next) {
|
|
44
46
|
case 0:
|
|
45
47
|
path = _args.length > 0 && _args[0] !== undefined ? _args[0] : '';
|
|
48
|
+
workersPath = _args.length > 1 && _args[1] !== undefined ? _args[1] : '';
|
|
46
49
|
console.log('Installing "EGM2008-5" model...');
|
|
47
|
-
_context.next =
|
|
50
|
+
_context.next = 5;
|
|
48
51
|
return (0, _core.load)(PGM_LINK, _zip.ZipLoader, {});
|
|
49
52
|
|
|
50
|
-
case
|
|
53
|
+
case 5:
|
|
51
54
|
fileMap = _context.sent;
|
|
52
55
|
depsPath = process.cwd();
|
|
53
56
|
|
|
@@ -55,18 +58,33 @@ var DepsInstaller = function () {
|
|
|
55
58
|
depsPath = (0, _path.join)(depsPath, path);
|
|
56
59
|
}
|
|
57
60
|
|
|
58
|
-
_context.next =
|
|
61
|
+
_context.next = 10;
|
|
59
62
|
return (0, _fileUtils.writeFile)(depsPath, new Uint8Array(fileMap['geoids/egm2008-5.pgm']), 'egm2008-5.pgm');
|
|
60
63
|
|
|
61
|
-
case
|
|
64
|
+
case 10:
|
|
65
|
+
console.log('Installing "I3S Content Loader worker"');
|
|
66
|
+
_context.next = 13;
|
|
67
|
+
return this.installWorker('i3s', 'i3s-content-nodejs-worker.js', workersPath);
|
|
68
|
+
|
|
69
|
+
case 13:
|
|
70
|
+
console.log('Installing "Draco Loader worker"');
|
|
71
|
+
_context.next = 16;
|
|
72
|
+
return this.installWorker('draco', 'draco-nodejs-worker.js', workersPath);
|
|
73
|
+
|
|
74
|
+
case 16:
|
|
75
|
+
console.log('Installing "Basis Loader worker"');
|
|
76
|
+
_context.next = 19;
|
|
77
|
+
return this.installWorker('textures', 'basis-nodejs-worker.js', workersPath);
|
|
78
|
+
|
|
79
|
+
case 19:
|
|
62
80
|
console.log('All dependencies were installed succesfully.');
|
|
63
81
|
|
|
64
|
-
case
|
|
82
|
+
case 20:
|
|
65
83
|
case "end":
|
|
66
84
|
return _context.stop();
|
|
67
85
|
}
|
|
68
86
|
}
|
|
69
|
-
}, _callee);
|
|
87
|
+
}, _callee, this);
|
|
70
88
|
}));
|
|
71
89
|
|
|
72
90
|
function install() {
|
|
@@ -75,6 +93,52 @@ var DepsInstaller = function () {
|
|
|
75
93
|
|
|
76
94
|
return install;
|
|
77
95
|
}()
|
|
96
|
+
}, {
|
|
97
|
+
key: "installWorker",
|
|
98
|
+
value: function () {
|
|
99
|
+
var _installWorker = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee2(module, name, extraPath) {
|
|
100
|
+
var fileResponse, fileData, path;
|
|
101
|
+
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
102
|
+
while (1) {
|
|
103
|
+
switch (_context2.prev = _context2.next) {
|
|
104
|
+
case 0:
|
|
105
|
+
_context2.next = 2;
|
|
106
|
+
return (0, _core.fetchFile)("https://unpkg.com/@loaders.gl/".concat(module, "@").concat(VERSION, "/dist/").concat(name));
|
|
107
|
+
|
|
108
|
+
case 2:
|
|
109
|
+
fileResponse = _context2.sent;
|
|
110
|
+
_context2.next = 5;
|
|
111
|
+
return fileResponse.arrayBuffer();
|
|
112
|
+
|
|
113
|
+
case 5:
|
|
114
|
+
fileData = _context2.sent;
|
|
115
|
+
|
|
116
|
+
if (fileData) {
|
|
117
|
+
_context2.next = 8;
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return _context2.abrupt("return");
|
|
122
|
+
|
|
123
|
+
case 8:
|
|
124
|
+
path = (0, _path.join)(process.cwd(), extraPath, 'modules', module, 'dist');
|
|
125
|
+
_context2.next = 11;
|
|
126
|
+
return (0, _fileUtils.writeFile)(path, fileData, name);
|
|
127
|
+
|
|
128
|
+
case 11:
|
|
129
|
+
case "end":
|
|
130
|
+
return _context2.stop();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}, _callee2);
|
|
134
|
+
}));
|
|
135
|
+
|
|
136
|
+
function installWorker(_x, _x2, _x3) {
|
|
137
|
+
return _installWorker.apply(this, arguments);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return installWorker;
|
|
141
|
+
}()
|
|
78
142
|
}]);
|
|
79
143
|
return DepsInstaller;
|
|
80
144
|
}();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/deps-installer/deps-installer.ts"],"names":["PGM_LINK","DepsInstaller","path","console","log","ZipLoader","fileMap","depsPath","process","cwd","Uint8Array"],"mappings":";;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;
|
|
1
|
+
{"version":3,"sources":["../../../src/deps-installer/deps-installer.ts"],"names":["VERSION","PGM_LINK","DepsInstaller","path","workersPath","console","log","ZipLoader","fileMap","depsPath","process","cwd","Uint8Array","installWorker","module","name","extraPath","fileResponse","arrayBuffer","fileData"],"mappings":";;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AAGA,IAAMA,OAAO,GAAG,2BAAuB,WAAvB,qBAAmD,MAAnE;AAEA,IAAMC,QAAQ,GAAG,+EAAjB;;IAQaC,a;;;;;;;;+EAQX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAcC,gBAAAA,IAAd,2DAA6B,EAA7B;AAAiCC,gBAAAA,WAAjC,2DAAuD,EAAvD;AACEC,gBAAAA,OAAO,CAACC,GAAR,CAAY,iCAAZ;AADF;AAAA,uBAEwB,gBAAKL,QAAL,EAAeM,cAAf,EAA0B,EAA1B,CAFxB;;AAAA;AAEQC,gBAAAA,OAFR;AAIMC,gBAAAA,QAJN,GAIiBC,OAAO,CAACC,GAAR,EAJjB;;AAKE,oBAAIR,IAAJ,EAAU;AACRM,kBAAAA,QAAQ,GAAG,gBAAKA,QAAL,EAAeN,IAAf,CAAX;AACD;;AAPH;AAAA,uBASQ,0BAAUM,QAAV,EAAoB,IAAIG,UAAJ,CAAeJ,OAAO,CAAC,sBAAD,CAAtB,CAApB,EAAqE,eAArE,CATR;;AAAA;AAWEH,gBAAAA,OAAO,CAACC,GAAR,CAAY,wCAAZ;AAXF;AAAA,uBAYQ,KAAKO,aAAL,CAAmB,KAAnB,EAA0B,8BAA1B,EAA0DT,WAA1D,CAZR;;AAAA;AAcEC,gBAAAA,OAAO,CAACC,GAAR,CAAY,kCAAZ;AAdF;AAAA,uBAeQ,KAAKO,aAAL,CAAmB,OAAnB,EAA4B,wBAA5B,EAAsDT,WAAtD,CAfR;;AAAA;AAiBEC,gBAAAA,OAAO,CAACC,GAAR,CAAY,kCAAZ;AAjBF;AAAA,uBAkBQ,KAAKO,aAAL,CAAmB,UAAnB,EAA+B,wBAA/B,EAAyDT,WAAzD,CAlBR;;AAAA;AAoBEC,gBAAAA,OAAO,CAACC,GAAR,CAAY,8CAAZ;;AApBF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;;;;qFAuBA,kBAA4BQ,MAA5B,EAA4CC,IAA5C,EAA0DC,SAA1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAC6B,6DACQF,MADR,cACkBd,OADlB,mBACkCe,IADlC,EAD7B;;AAAA;AACQE,gBAAAA,YADR;AAAA;AAAA,uBAIyBA,YAAY,CAACC,WAAb,EAJzB;;AAAA;AAIQC,gBAAAA,QAJR;;AAAA,oBAKOA,QALP;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAQQhB,gBAAAA,IARR,GAQe,gBAAKO,OAAO,CAACC,GAAR,EAAL,EAAoBK,SAApB,EAA+B,SAA/B,EAA0CF,MAA1C,EAAkD,MAAlD,CARf;AAAA;AAAA,uBASQ,0BAAUX,IAAV,EAAgBgB,QAAhB,EAA0BJ,IAA1B,CATR;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O","sourcesContent":["import {load, fetchFile} from '@loaders.gl/core';\nimport {ZipLoader} from '@loaders.gl/zip';\nimport {writeFile} from '../lib/utils/file-utils';\nimport {join} from 'path';\n\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'beta';\n\nconst PGM_LINK = 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/egm/egm2008-5.zip';\n\n/**\n * Install external dependencies for converter:\n * * PGM file (implemented);\n * * Draco library (not implemented);\n * * 7z archiver (not implemented);\n */\nexport class DepsInstaller {\n /**\n * Run instalation\n * @param path destination folder\n * @param workersPath destination folder for workers.\n * This path is '' by default and is not used by tile-converter.\n * It is used in tests to prevent rewriting actual workers during tests running\n */\n async install(path: string = '', workersPath: string = ''): Promise<void> {\n console.log('Installing \"EGM2008-5\" model...'); // eslint-disable-line no-console\n const fileMap = await load(PGM_LINK, ZipLoader, {});\n\n let depsPath = process.cwd();\n if (path) {\n depsPath = join(depsPath, path);\n }\n\n await writeFile(depsPath, new Uint8Array(fileMap['geoids/egm2008-5.pgm']), 'egm2008-5.pgm');\n\n console.log('Installing \"I3S Content Loader worker\"'); // eslint-disable-line no-console\n await this.installWorker('i3s', 'i3s-content-nodejs-worker.js', workersPath);\n\n console.log('Installing \"Draco Loader worker\"'); // eslint-disable-line no-console\n await this.installWorker('draco', 'draco-nodejs-worker.js', workersPath);\n\n console.log('Installing \"Basis Loader worker\"'); // eslint-disable-line no-console\n await this.installWorker('textures', 'basis-nodejs-worker.js', workersPath);\n\n console.log('All dependencies were installed succesfully.'); // eslint-disable-line no-console\n }\n\n private async installWorker(module: string, name: string, extraPath: string) {\n const fileResponse = await fetchFile(\n `https://unpkg.com/@loaders.gl/${module}@${VERSION}/dist/${name}`\n );\n const fileData = await fileResponse.arrayBuffer();\n if (!fileData) {\n return;\n }\n const path = join(process.cwd(), extraPath, 'modules', module, 'dist');\n await writeFile(path, fileData, name);\n }\n}\n"],"file":"deps-installer.js"}
|
|
@@ -8,7 +8,7 @@ exports._typecheckI3SAttributesWorker = exports.I3SAttributesWorker = void 0;
|
|
|
8
8
|
|
|
9
9
|
var _workerUtils = require("@loaders.gl/worker-utils");
|
|
10
10
|
|
|
11
|
-
var VERSION = typeof "3.3.0-alpha.
|
|
11
|
+
var VERSION = typeof "3.3.0-alpha.5" !== 'undefined' ? "3.3.0-alpha.5" : 'latest';
|
|
12
12
|
var I3SAttributesWorker = {
|
|
13
13
|
id: 'i3s-attributes',
|
|
14
14
|
name: 'I3S Attributes Worker',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/i3s-attributes-worker.ts"],"names":["VERSION","I3SAttributesWorker","id","name","module","version","options","useCartesianPositions","transformI3SAttributesOnWorker","attributesData","_typecheckI3SAttributesWorker"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../../src/i3s-attributes-worker.ts"],"names":["VERSION","I3SAttributesWorker","id","name","module","version","options","useCartesianPositions","transformI3SAttributesOnWorker","attributesData","_typecheckI3SAttributesWorker"],"mappings":";;;;;;;;AAKA;;AAIA,IAAMA,OAAO,GAAG,2BAAuB,WAAvB,qBAAmD,QAAnE;AAoBO,IAAMC,mBAAmB,GAAG;AACjCC,EAAAA,EAAE,EAAE,gBAD6B;AAEjCC,EAAAA,IAAI,EAAE,uBAF2B;AAGjCC,EAAAA,MAAM,EAAE,gBAHyB;AAIjCC,EAAAA,OAAO,EAAEL,OAJwB;AAKjCM,EAAAA,OAAO,EAAE;AACPC,IAAAA,qBAAqB,EAAE;AADhB;AALwB,CAA5B;;;AAaA,SAASC,8BAAT,CACLC,cADK,EAELH,OAFK,EAGsC;AAC3C,SAAO,kCAAgBL,mBAAhB,EAAqCQ,cAArC,EAAqDH,OAArD,CAAP;AACD;;AAEM,IAAMI,6BAA2C,GAAGT,mBAApD","sourcesContent":["import type {WorkerObject} from '@loaders.gl/worker-utils';\nimport type {ConvertedAttributes} from './i3s-converter/types';\nimport type {Matrix4, Vector3} from '@math.gl/core';\nimport type {GLTFImagePostprocessed, GLTFNodePostprocessed} from '@loaders.gl/gltf';\n\nimport {processOnWorker} from '@loaders.gl/worker-utils';\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 type I3SAttributesWorkerOptions = {\n _nodeWorkers: boolean;\n reuseWorkers: boolean;\n useCartesianPositions: boolean;\n source: string;\n};\n\nexport type B3DMAttributesData = {\n gltfMaterials?: {id: string}[];\n nodes: GLTFNodePostprocessed[];\n images: GLTFImagePostprocessed[];\n cartographicOrigin: Vector3;\n cartesianModelMatrix: Matrix4;\n};\n\n/**\n * I3S Attributes Worker to handle B3DM object\n */\nexport const I3SAttributesWorker = {\n id: 'i3s-attributes',\n name: 'I3S Attributes Worker',\n module: 'tile-converter',\n version: VERSION,\n options: {\n useCartesianPositions: false\n }\n};\n\n/**\n * Performs I3S attributes transformation\n */\nexport function transformI3SAttributesOnWorker(\n attributesData: B3DMAttributesData,\n options: I3SAttributesWorkerOptions\n): Promise<Map<string, ConvertedAttributes>> {\n return processOnWorker(I3SAttributesWorker, attributesData, options);\n}\n\nexport const _typecheckI3SAttributesWorker: WorkerObject = I3SAttributesWorker;\n"],"file":"i3s-attributes-worker.js"}
|
|
@@ -106,6 +106,10 @@ function generateImplicitFeatureIds(featuresCount) {
|
|
|
106
106
|
function generateBatchIdsFromTexture(featureIdTexture, textureCoordinates, images) {
|
|
107
107
|
var _featureIdTexture$fea3, _featureIdTexture$fea4, _featureIdTexture$fea5;
|
|
108
108
|
|
|
109
|
+
if (!(images !== null && images !== void 0 && images.length)) {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
|
|
109
113
|
var CHANNELS_MAP = {
|
|
110
114
|
r: 0,
|
|
111
115
|
g: 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/i3s-converter/helpers/batch-ids-extensions.ts"],"names":["EXT_MESH_FEATURES","EXT_FEATURE_METADATA","handleBatchIdsExtensions","attributes","primitive","images","extensions","Object","entries","extensionName","extensionData","handleExtFeatureMetadataExtension","console","warn","extFeatureMetadata","featureIdAttribute","featureIdAttributes","featureIds","attribute","batchIdsAttribute","value","hasOwnProperty","featuresCount","POSITIONS","length","generateImplicitFeatureIds","constant","divisor","featureIdTexture","featureIdTextures","textureAttributeIndex","texture","texCoord","textCoordAttribute","textureCoordinates","generateBatchIdsFromTexture","featureTexture","featureTextures","currentValue","devisorCounter","index","push","Array","fill","CHANNELS_MAP","r","g","b","a","textureIndex","featureChannel","channels","undefined","image","batchIds","compressed","u","v","tx","Math","min","emod","width","ty","height","offset","components","batchId","Uint8Array","data","mimeType","n"],"mappings":";;;;;;;;;;;AAOA,IAAMA,iBAAiB,GAAG,mBAA1B;AACA,IAAMC,oBAAoB,GAAG,sBAA7B;;AAQO,SAASC,wBAAT,CACLC,UADK,EAILC,SAJK,EAKLC,MALK,EAMK;AACV,MAAMC,UAAU,GAAGF,SAAH,aAAGA,SAAH,uBAAGA,SAAS,CAAEE,UAA9B;;AAEA,MAAI,CAACA,UAAL,EAAiB;AACf,WAAO,EAAP;AACD;;AAED,qCAA6CC,MAAM,CAACC,OAAP,CAAeF,UAAU,IAAI,EAA7B,CAA7C,qCAA+E;AAA1E;AAAA,QAAOG,aAAP;AAAA,QAAsBC,aAAtB;;AACH,YAAQD,aAAR;AACE,WAAKR,oBAAL;AACE,eAAOU,iCAAiC,CACtCR,UADsC,EAEtCO,aAFsC,EAGtCL,MAHsC,CAAxC;;AAKF,WAAKL,iBAAL;AACEY,QAAAA,OAAO,CAACC,IAAR,CAAa,kDAAb;AACA,eAAO,EAAP;;AACF;AACE,eAAO,EAAP;AAXJ;AAaD;;AAED,SAAO,EAAP;AACD;;AASD,SAASF,iCAAT,CACER,UADF,EAIEW,kBAJF,EAKET,MALF,EAMY;AAAA;;AAEV,MAAMU,kBAAkB,GAAGD,kBAAH,aAAGA,kBAAH,gDAAGA,kBAAkB,CAAEE,mBAAvB,0DAAG,sBAA0C,CAA1C,CAA3B;;AAEA,MAAID,kBAAJ,aAAIA,kBAAJ,wCAAIA,kBAAkB,CAAEE,UAAxB,kDAAI,sBAAgCC,SAApC,EAA+C;AAC7C,QAAMC,iBAAiB,GAAGhB,UAAU,CAACY,kBAAkB,CAACE,UAAnB,CAA8BC,SAA/B,CAApC;AACA,WAAOC,iBAAiB,CAACC,KAAzB;AACD;;AAED,MACEL,kBAAkB,SAAlB,IAAAA,kBAAkB,WAAlB,8BAAAA,kBAAkB,CAAEE,UAApB,0EAAgCI,cAAhC,CAA+C,UAA/C,KACAN,kBADA,aACAA,kBADA,yCACAA,kBAAkB,CAAEE,UADpB,mDACA,uBAAgCI,cAAhC,CAA+C,SAA/C,CAFF,EAGE;AAAA;;AACA,QAAMC,aAAa,GAAG,CAAAnB,UAAU,SAAV,IAAAA,UAAU,WAAV,qCAAAA,UAAU,CAAEoB,SAAZ,gFAAuBH,KAAvB,CAA6BI,MAA7B,IAAsC,CAAtC,IAA2C,CAAjE;AACA,WAAOC,0BAA0B,CAC/BH,aAD+B,EAE/BP,kBAAkB,CAACE,UAAnB,CAA8BS,QAFC,EAG/BX,kBAAkB,CAACE,UAAnB,CAA8BU,OAHC,CAAjC;AAKD;;AAGD,MAAMC,gBAAgB,GACpB,CAAAd,kBAAkB,SAAlB,IAAAA,kBAAkB,WAAlB,YAAAA,kBAAkB,CAAEe,iBAApB,MAAyCf,kBAAzC,aAAyCA,kBAAzC,uBAAyCA,kBAAkB,CAAEe,iBAApB,CAAsC,CAAtC,CAAzC,CADF;;AAGA,MAAID,gBAAJ,EAAsB;AAAA;;AACpB,QAAME,qBAAqB,GAAG,CAAAF,gBAAgB,SAAhB,IAAAA,gBAAgB,WAAhB,qCAAAA,gBAAgB,CAAEX,UAAlB,0GAA8Bc,OAA9B,kFAAuCC,QAAvC,KAAmD,CAAjF;AACA,QAAMC,kBAAkB,sBAAeH,qBAAf,CAAxB;AACA,QAAMI,kBAAkB,GAAG/B,UAAU,CAAC8B,kBAAD,CAAV,CAA+Bb,KAA1D;AACA,WAAOe,2BAA2B,CAACP,gBAAD,EAAmBM,kBAAnB,EAAuC7B,MAAvC,CAAlC;AACD;;AAGD,MAAM+B,cAAc,GAClB,CAAAtB,kBAAkB,SAAlB,IAAAA,kBAAkB,WAAlB,YAAAA,kBAAkB,CAAEuB,eAApB,MAAuCvB,kBAAvC,aAAuCA,kBAAvC,uBAAuCA,kBAAkB,CAAEuB,eAApB,CAAoC,CAApC,CAAvC,CADF;;AAMA,MAAID,cAAJ,EAAoB;AAClBxB,IAAAA,OAAO,CAACC,IAAR,CAAa,uEAAb;AACA,WAAO,EAAP;AACD;;AAED,SAAO,EAAP;AACD;;AASD,SAASY,0BAAT,CACEH,aADF,EAIY;AAAA,MAFVI,QAEU,uEAFS,CAET;AAAA,MADVC,OACU,uEADQ,CACR;AACV,MAAIV,UAAoB,GAAG,EAA3B;;AAEA,MAAIU,OAAO,GAAG,CAAd,EAAiB;AACf,QAAIW,YAAY,GAAGZ,QAAnB;AACA,QAAIa,cAAc,GAAGZ,OAArB;;AAEA,SAAK,IAAIa,KAAK,GAAG,CAAjB,EAAoBA,KAAK,GAAGlB,aAA5B,EAA2CkB,KAAK,EAAhD,EAAoD;AAClDvB,MAAAA,UAAU,CAACwB,IAAX,CAAgBH,YAAhB;AAEAC,MAAAA,cAAc,IAAI,CAAlB;;AAEA,UAAIA,cAAc,KAAK,CAAvB,EAA0B;AACxBD,QAAAA,YAAY;AACZC,QAAAA,cAAc,GAAGZ,OAAjB;AACD;AACF;AACF,GAdD,MAcO;AACLV,IAAAA,UAAU,GAAGyB,KAAK,CAASpB,aAAT,CAAL,CAA6BqB,IAA7B,CAAkCjB,QAAlC,EAA4C,CAA5C,EAA+CJ,aAA/C,CAAb;AACD;;AAED,SAAOL,UAAP;AACD;;AAOD,SAASkB,2BAAT,CACEP,gBADF,EAEEM,kBAFF,EAGE7B,MAHF,EAIE;AAAA;;AACA,MAAMuC,YAAY,GAAG;AACnBC,IAAAA,CAAC,EAAE,CADgB;AAEnBC,IAAAA,CAAC,EAAE,CAFgB;AAGnBC,IAAAA,CAAC,EAAE,CAHgB;AAInBC,IAAAA,CAAC,EAAE;AAJgB,GAArB;AAOA,MAAMC,YAAY,GAAGrB,gBAAH,aAAGA,gBAAH,iDAAGA,gBAAgB,CAAEX,UAArB,qFAAG,uBAA8Bc,OAAjC,2DAAG,uBAAuCS,KAA5D;AACA,MAAMU,cAAc,GAAGtB,gBAAH,aAAGA,gBAAH,iDAAGA,gBAAgB,CAAEX,UAArB,2DAAG,uBAA8BkC,QAArD;;AAEA,MAAI,CAACD,cAAD,IAAmBD,YAAY,KAAKG,SAAxC,EAAmD;AACjD,WAAO,EAAP;AACD;;AAED,MAAMC,KAAK,GAAGhD,MAAM,CAAC4C,YAAD,CAApB;AACA,MAAMK,QAAkB,GAAG,EAA3B;AACA,MAAMH,QAAQ,GAAGP,YAAY,CAACM,cAAD,CAA7B;;AAEA,MAAI,CAACG,KAAK,CAACE,UAAX,EAAuB;AACrB,SAAK,IAAIf,KAAK,GAAG,CAAjB,EAAoBA,KAAK,GAAGN,kBAAkB,CAACV,MAA/C,EAAuDgB,KAAK,IAAI,CAAhE,EAAmE;AACjE,UAAMgB,CAAC,GAAGtB,kBAAkB,CAACM,KAAD,CAA5B;AACA,UAAMiB,CAAC,GAAGvB,kBAAkB,CAACM,KAAK,GAAG,CAAT,CAA5B;AAEA,UAAMkB,EAAE,GAAGC,IAAI,CAACC,GAAL,CAAUC,IAAI,CAACL,CAAD,CAAJ,GAAUH,KAAK,CAACS,KAAjB,GAA0B,CAAnC,EAAsCT,KAAK,CAACS,KAAN,GAAc,CAApD,CAAX;AACA,UAAMC,EAAE,GAAGJ,IAAI,CAACC,GAAL,CAAUC,IAAI,CAACJ,CAAD,CAAJ,GAAUJ,KAAK,CAACW,MAAjB,GAA2B,CAApC,EAAuCX,KAAK,CAACW,MAAN,GAAe,CAAtD,CAAX;AAEA,UAAMC,MAAM,GAAG,CAACF,EAAE,GAAGV,KAAK,CAACS,KAAX,GAAmBJ,EAApB,IAA0BL,KAAK,CAACa,UAAhC,GAA6Cf,QAA5D;AACA,UAAMgB,OAAO,GAAG,IAAIC,UAAJ,CAAef,KAAK,CAACgB,IAArB,EAA2BJ,MAA3B,CAAhB;AAEAX,MAAAA,QAAQ,CAACb,IAAT,CAAc0B,OAAd;AACD;AACF,GAbD,MAaO;AACLvD,IAAAA,OAAO,CAACC,IAAR,oCAAyCwC,KAAK,CAACiB,QAA/C;AACD;;AAED,SAAOhB,QAAP;AACD;;AAOD,SAASO,IAAT,CAAcU,CAAd,EAAiC;AAC/B,SAAO,CAAEA,CAAC,GAAG,CAAL,GAAU,CAAX,IAAgB,CAAvB;AACD","sourcesContent":["import type {GLTFAccessorPostprocessed} from 'modules/gltf/src/lib/types/gltf-types';\nimport type {Image, MeshPrimitive} from 'modules/gltf/src/lib/types/gltf-postprocessed-schema';\nimport type {\n GLTF_EXT_feature_metadata_attribute,\n GLTF_EXT_feature_metadata_primitive\n} from 'modules/gltf/src/lib/types/gltf-json-schema';\n\nconst EXT_MESH_FEATURES = 'EXT_mesh_features';\nconst EXT_FEATURE_METADATA = 'EXT_feature_metadata';\n\n/**\n * Getting batchIds from 3DTilesNext extensions.\n * @param attributes\n * @param primitive\n * @param textures\n */\nexport function handleBatchIdsExtensions(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n primitive: MeshPrimitive,\n images: Image[]\n): number[] {\n const extensions = primitive?.extensions;\n\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 );\n case EXT_MESH_FEATURES:\n console.warn('EXT_mesh_features extension is not supported yet');\n return [];\n default:\n return [];\n }\n }\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\n * @param extFeatureMetadata\n * @param textures\n */\nfunction handleExtFeatureMetadataExtension(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n extFeatureMetadata: GLTF_EXT_feature_metadata_primitive,\n images: Image[]\n): number[] {\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 // Take only first extension texture to get batchIds from the root EXT_feature_metadata object.\n const featureTexture =\n extFeatureMetadata?.featureTextures && extFeatureMetadata?.featureTextures[0];\n\n /**\n * TODO need to get batchIds from root extension\n */\n if (featureTexture) {\n console.warn(\"EXT_feature_metadata doesn't yet support featureTextures in primitive\");\n return [];\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_attribute,\n textureCoordinates: Float32Array,\n images: Image[]\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.compressed) {\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\n/**\n * Handle UVs if they are out of range [0,1].\n * @param n\n * @param m\n */\nfunction emod(n: number): number {\n return ((n % 1) + 1) % 1;\n}\n"],"file":"batch-ids-extensions.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/i3s-converter/helpers/batch-ids-extensions.ts"],"names":["EXT_MESH_FEATURES","EXT_FEATURE_METADATA","handleBatchIdsExtensions","attributes","primitive","images","extensions","Object","entries","extensionName","extensionData","handleExtFeatureMetadataExtension","console","warn","extFeatureMetadata","featureIdAttribute","featureIdAttributes","featureIds","attribute","batchIdsAttribute","value","hasOwnProperty","featuresCount","POSITIONS","length","generateImplicitFeatureIds","constant","divisor","featureIdTexture","featureIdTextures","textureAttributeIndex","texture","texCoord","textCoordAttribute","textureCoordinates","generateBatchIdsFromTexture","featureTexture","featureTextures","currentValue","devisorCounter","index","push","Array","fill","CHANNELS_MAP","r","g","b","a","textureIndex","featureChannel","channels","undefined","image","batchIds","compressed","u","v","tx","Math","min","emod","width","ty","height","offset","components","batchId","Uint8Array","data","mimeType","n"],"mappings":"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","sourcesContent":["import {\n GLTFAccessorPostprocessed,\n GLTFImagePostprocessed,\n GLTFMeshPrimitivePostprocessed\n} from '@loaders.gl/gltf';\nimport type {\n GLTF_EXT_feature_metadata_attribute,\n GLTF_EXT_feature_metadata_primitive\n} from 'modules/gltf/src/lib/types/gltf-json-schema';\n\nconst EXT_MESH_FEATURES = 'EXT_mesh_features';\nconst EXT_FEATURE_METADATA = 'EXT_feature_metadata';\n\n/**\n * Getting batchIds from 3DTilesNext extensions.\n * @param attributes\n * @param primitive\n * @param textures\n */\nexport function handleBatchIdsExtensions(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n primitive: GLTFMeshPrimitivePostprocessed,\n images: GLTFImagePostprocessed[]\n): number[] {\n const extensions = primitive?.extensions;\n\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 );\n case EXT_MESH_FEATURES:\n console.warn('EXT_mesh_features extension is not supported yet');\n return [];\n default:\n return [];\n }\n }\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\n * @param extFeatureMetadata\n * @param textures\n */\nfunction handleExtFeatureMetadataExtension(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n extFeatureMetadata: GLTF_EXT_feature_metadata_primitive,\n images: GLTFImagePostprocessed[]\n): number[] {\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 // Take only first extension texture to get batchIds from the root EXT_feature_metadata object.\n const featureTexture =\n extFeatureMetadata?.featureTextures && extFeatureMetadata?.featureTextures[0];\n\n /**\n * TODO need to get batchIds from root extension\n */\n if (featureTexture) {\n console.warn(\"EXT_feature_metadata doesn't yet support featureTextures in primitive\");\n return [];\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_attribute,\n textureCoordinates: Float32Array,\n images: GLTFImagePostprocessed[]\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.compressed) {\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\n/**\n * Handle UVs if they are out of range [0,1].\n * @param n\n * @param m\n */\nfunction emod(n: number): number {\n return ((n % 1) + 1) % 1;\n}\n"],"file":"batch-ids-extensions.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/i3s-converter/helpers/coordinate-converter.ts"],"names":["createBoundingVolumes","tile","geoidHeightModel","radius","halfSize","quaternion","boundingVolume","cartographicCenter","Ellipsoid","WGS84","cartesianToCartographic","center","Vector3","getHeight","OrientedBoundingBox","len","Quaternion","fromMatrix3","Matrix3","normalize","mbs","obb","createBoundingVolumesFromGeometry","cartesianPositions","positionVectors","convertPositionsToVectors","geometryObb","geometryMbs","mbsCenter","obbCenter","positions","result","i","length","positionVector","push","convertBoundingVolumeToI3SFullExtent","sphere","BoundingSphere","getBoundingSphere","vertexMax","vertexMin","xmin","xmax","ymin","ymax","zmin","zmax","createObbFromMbs","halfAxex"],"mappings":";;;;;;;;;;;AAEA;;AACA;;AACA;;AAeO,SAASA,qBAAT,CAA+BC,IAA/B,
|
|
1
|
+
{"version":3,"sources":["../../../../src/i3s-converter/helpers/coordinate-converter.ts"],"names":["createBoundingVolumes","tile","geoidHeightModel","radius","halfSize","quaternion","boundingVolume","cartographicCenter","Ellipsoid","WGS84","cartesianToCartographic","center","Vector3","getHeight","OrientedBoundingBox","len","Quaternion","fromMatrix3","Matrix3","normalize","mbs","obb","createBoundingVolumesFromGeometry","cartesianPositions","positionVectors","convertPositionsToVectors","geometryObb","geometryMbs","mbsCenter","obbCenter","positions","result","i","length","positionVector","push","convertBoundingVolumeToI3SFullExtent","sphere","BoundingSphere","getBoundingSphere","vertexMax","vertexMin","xmin","xmax","ymin","ymax","zmin","zmax","createObbFromMbs","halfAxex"],"mappings":"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","sourcesContent":["import type {BoundingVolumes, FullExtent, Mbs, Obb} from '@loaders.gl/i3s';\n\nimport {Matrix3, Quaternion, Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {\n OrientedBoundingBox,\n makeOrientedBoundingBoxFromPoints,\n makeBoundingSphereFromPoints,\n BoundingSphere\n} from '@math.gl/culling';\nimport {Tile3D} from '@loaders.gl/tiles';\nimport {Geoid} from '@math.gl/geoid';\n\n/**\n * Create bounding volumes object from tile and geoid height model.\n * @param tile\n * @param geoidHeightModel\n * @returns - Bounding volumes object\n */\nexport function createBoundingVolumes(tile: Tile3D, geoidHeightModel: Geoid): BoundingVolumes {\n let radius;\n let halfSize;\n let quaternion;\n\n const boundingVolume = tile.boundingVolume;\n const cartographicCenter = Ellipsoid.WGS84.cartesianToCartographic(\n boundingVolume.center,\n new Vector3()\n );\n cartographicCenter[2] =\n cartographicCenter[2] -\n geoidHeightModel.getHeight(cartographicCenter[1], cartographicCenter[0]);\n if (boundingVolume instanceof OrientedBoundingBox) {\n halfSize = boundingVolume.halfSize;\n radius = new Vector3(halfSize[0], halfSize[1], halfSize[2]).len();\n quaternion = boundingVolume.quaternion;\n } else {\n radius = tile.boundingVolume.radius;\n halfSize = [radius, radius, radius];\n quaternion = new Quaternion()\n .fromMatrix3(new Matrix3([halfSize[0], 0, 0, 0, halfSize[1], 0, 0, 0, halfSize[2]]))\n .normalize();\n }\n\n return {\n mbs: [cartographicCenter[0], cartographicCenter[1], cartographicCenter[2], radius],\n obb: {\n center: [cartographicCenter[0], cartographicCenter[1], cartographicCenter[2]],\n halfSize,\n quaternion\n }\n };\n}\n\n/**\n * Generates bounding volumes from geometry positions\n * @param cartesianPositions\n * @param geoidHeightModel\n */\nexport function createBoundingVolumesFromGeometry(\n cartesianPositions: Float32Array,\n geoidHeightModel: Geoid\n): {mbs: Mbs; obb: Obb} {\n const positionVectors = convertPositionsToVectors(cartesianPositions);\n\n const geometryObb = makeOrientedBoundingBoxFromPoints(positionVectors);\n const geometryMbs = makeBoundingSphereFromPoints(positionVectors);\n\n let mbsCenter = Ellipsoid.WGS84.cartesianToCartographic(geometryMbs.center, new Vector3());\n let obbCenter = Ellipsoid.WGS84.cartesianToCartographic(geometryObb.center, new Vector3());\n\n mbsCenter[2] = mbsCenter[2] - geoidHeightModel.getHeight(mbsCenter[1], mbsCenter[0]);\n obbCenter[2] = obbCenter[2] - geoidHeightModel.getHeight(obbCenter[1], obbCenter[0]);\n\n return {\n mbs: [mbsCenter[0], mbsCenter[1], mbsCenter[2], geometryMbs.radius],\n obb: {\n center: obbCenter,\n halfSize: geometryObb.halfSize,\n quaternion: geometryObb.quaternion\n }\n };\n}\n\n/**\n * Create array of posisitons where each vertex is vector\n * @param {array} positions\n * @returns {Vector3[]}\n */\nexport function convertPositionsToVectors(positions: Float32Array): Vector3[] {\n const result: Vector3[] = [];\n\n for (let i = 0; i < positions.length; i += 3) {\n // TODO: (perf) new Vector3 is not optimal but required in `makeOrientedBoundingBoxFromPoints`.\n // modify `makeOrientedBoundingBoxFromPoints` to use scratch vectors\n const positionVector = new Vector3([positions[i], positions[i + 1], positions[i + 2]]);\n result.push(positionVector);\n }\n\n return result;\n}\n\n/**\n * Convert common coordinate to fullExtent https://github.com/Esri/i3s-spec/blob/master/docs/1.8/fullExtent.cmn.md\n * @param\n * @param boundingVolume\n * @returns - fullExtent object\n */\nexport function convertBoundingVolumeToI3SFullExtent(\n boundingVolume: OrientedBoundingBox | BoundingSphere\n): FullExtent {\n let sphere: BoundingSphere;\n if (boundingVolume instanceof BoundingSphere) {\n sphere = boundingVolume;\n } else {\n sphere = boundingVolume.getBoundingSphere();\n }\n const center: Vector3 = sphere.center;\n const radius: number = sphere.radius;\n const vertexMax = Ellipsoid.WGS84.cartesianToCartographic(\n new Vector3(center[0] + radius, center[1] + radius, center[2] + radius),\n new Vector3()\n );\n const vertexMin = Ellipsoid.WGS84.cartesianToCartographic(\n new Vector3(center[0] - radius, center[1] - radius, center[2] - radius),\n new Vector3()\n );\n\n return {\n xmin: vertexMin[0],\n xmax: vertexMax[0],\n ymin: vertexMin[1],\n ymax: vertexMax[1],\n zmin: vertexMin[2],\n zmax: vertexMax[2]\n };\n}\n\n/**\n * Creates oriented boundinb box from mbs.\n * @param mbs - Minimum Bounding Sphere\n * @returns - Oriented BOunding Box\n */\nexport function createObbFromMbs(mbs: Mbs): Obb {\n const radius = mbs[3];\n const center = new Vector3(mbs[0], mbs[1], mbs[2]);\n const halfAxex = new Matrix3([radius, 0, 0, 0, radius, 0, 0, 0, radius]);\n return new OrientedBoundingBox(center, halfAxex);\n}\n"],"file":"coordinate-converter.js"}
|