@loaders.gl/tile-converter 4.2.0-alpha.3 → 4.2.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-converter/3d-tiles-converter.d.ts +3 -3
- package/dist/3d-tiles-converter/3d-tiles-converter.d.ts.map +1 -1
- package/dist/3d-tiles-converter/3d-tiles-converter.js +329 -293
- package/dist/3d-tiles-converter/helpers/b3dm-converter.js +257 -200
- package/dist/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js +14 -5
- package/dist/3d-tiles-converter/helpers/load-i3s.js +106 -75
- package/dist/3d-tiles-converter/helpers/texture-atlas.js +44 -21
- package/dist/3d-tiles-converter/json-templates/tileset.js +32 -33
- package/dist/constants.js +0 -1
- package/dist/converter-cli.js +255 -234
- package/dist/converter.min.cjs +80 -90
- package/dist/deps-installer/deps-installer.js +73 -59
- package/dist/i3s-converter/helpers/attribute-metadata-info.js +207 -153
- package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts +1 -1
- package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/batch-ids-extensions.js +145 -103
- package/dist/i3s-converter/helpers/coordinate-converter.js +100 -65
- package/dist/i3s-converter/helpers/create-scene-server-path.js +14 -9
- package/dist/i3s-converter/helpers/feature-attributes.js +168 -105
- package/dist/i3s-converter/helpers/geometry-attributes.d.ts +1 -1
- package/dist/i3s-converter/helpers/geometry-attributes.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/geometry-attributes.js +204 -212
- package/dist/i3s-converter/helpers/geometry-converter.d.ts +2 -2
- package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/geometry-converter.js +1148 -829
- package/dist/i3s-converter/helpers/gltf-attributes.d.ts +1 -1
- package/dist/i3s-converter/helpers/gltf-attributes.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/gltf-attributes.js +111 -97
- package/dist/i3s-converter/helpers/load-3d-tiles.js +103 -66
- package/dist/i3s-converter/helpers/node-debug.js +98 -54
- package/dist/i3s-converter/helpers/node-index-document.d.ts +3 -3
- package/dist/i3s-converter/helpers/node-index-document.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/node-index-document.js +248 -177
- package/dist/i3s-converter/helpers/node-pages.d.ts +1 -1
- package/dist/i3s-converter/helpers/node-pages.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/node-pages.js +299 -194
- package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts +1 -1
- package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/preprocess-3d-tiles.js +92 -60
- package/dist/i3s-converter/helpers/progress.js +134 -83
- package/dist/i3s-converter/helpers/tileset-traversal.d.ts +1 -1
- package/dist/i3s-converter/helpers/tileset-traversal.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/tileset-traversal.js +24 -13
- package/dist/i3s-converter/i3s-converter.d.ts +7 -7
- package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
- package/dist/i3s-converter/i3s-converter.js +1044 -898
- package/dist/i3s-converter/json-templates/geometry-definitions.js +70 -79
- package/dist/i3s-converter/json-templates/layers.js +120 -121
- package/dist/i3s-converter/json-templates/metadata.js +19 -20
- package/dist/i3s-converter/json-templates/node.js +73 -71
- package/dist/i3s-converter/json-templates/scene-server.js +25 -26
- package/dist/i3s-converter/json-templates/shared-resources.js +107 -108
- package/dist/i3s-converter/json-templates/store.js +96 -94
- package/dist/i3s-converter/types.js +35 -23
- package/dist/i3s-server/app.js +15 -12
- package/dist/i3s-server/bin/www.js +14 -7
- package/dist/i3s-server/controllers/index-controller.js +18 -15
- package/dist/i3s-server/controllers/slpk-controller.js +22 -11
- package/dist/i3s-server/routes/index.js +9 -8
- package/dist/i3s-server/routes/slpk-router.js +18 -17
- package/dist/i3s-server/utils/create-scene-server.js +15 -10
- package/dist/i3s-server/utils/server-utils.js +49 -32
- package/dist/index.cjs +292 -851
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/lib/json-schemas/conversion-dump-json-schema.js +243 -421
- package/dist/lib/utils/cli-utils.js +63 -36
- package/dist/lib/utils/compress-util.js +20 -15
- package/dist/lib/utils/conversion-dump.d.ts +1 -1
- package/dist/lib/utils/conversion-dump.d.ts.map +1 -1
- package/dist/lib/utils/conversion-dump.js +209 -187
- package/dist/lib/utils/file-utils.js +122 -74
- package/dist/lib/utils/geometry-utils.js +13 -7
- package/dist/lib/utils/lod-conversion-utils.js +65 -33
- package/dist/lib/utils/queue.js +12 -13
- package/dist/lib/utils/statistic-utills.d.ts +6 -23
- package/dist/lib/utils/statistic-utills.js +64 -59
- package/dist/lib/utils/write-queue.d.ts +2 -2
- package/dist/lib/utils/write-queue.d.ts.map +1 -1
- package/dist/lib/utils/write-queue.js +68 -86
- package/dist/pgm-loader.js +17 -13
- package/dist/slpk-extractor/slpk-extractor.js +59 -50
- package/dist/slpk-extractor-cli.js +82 -59
- package/package.json +18 -18
- package/dist/3d-tiles-converter/3d-tiles-converter.js.map +0 -1
- package/dist/3d-tiles-converter/helpers/b3dm-converter.js.map +0 -1
- package/dist/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js.map +0 -1
- package/dist/3d-tiles-converter/helpers/load-i3s.js.map +0 -1
- package/dist/3d-tiles-converter/helpers/texture-atlas.js.map +0 -1
- package/dist/3d-tiles-converter/json-templates/tileset.js.map +0 -1
- package/dist/constants.js.map +0 -1
- package/dist/converter-cli.js.map +0 -1
- package/dist/deps-installer/deps-installer.js.map +0 -1
- package/dist/i3s-converter/helpers/attribute-metadata-info.js.map +0 -1
- package/dist/i3s-converter/helpers/batch-ids-extensions.js.map +0 -1
- package/dist/i3s-converter/helpers/coordinate-converter.js.map +0 -1
- package/dist/i3s-converter/helpers/create-scene-server-path.js.map +0 -1
- package/dist/i3s-converter/helpers/feature-attributes.js.map +0 -1
- package/dist/i3s-converter/helpers/geometry-attributes.js.map +0 -1
- package/dist/i3s-converter/helpers/geometry-converter.js.map +0 -1
- package/dist/i3s-converter/helpers/gltf-attributes.js.map +0 -1
- package/dist/i3s-converter/helpers/load-3d-tiles.js.map +0 -1
- package/dist/i3s-converter/helpers/node-debug.js.map +0 -1
- package/dist/i3s-converter/helpers/node-index-document.js.map +0 -1
- package/dist/i3s-converter/helpers/node-pages.js.map +0 -1
- package/dist/i3s-converter/helpers/preprocess-3d-tiles.js.map +0 -1
- package/dist/i3s-converter/helpers/progress.js.map +0 -1
- package/dist/i3s-converter/helpers/tileset-traversal.js.map +0 -1
- package/dist/i3s-converter/i3s-converter.js.map +0 -1
- package/dist/i3s-converter/json-templates/geometry-definitions.js.map +0 -1
- package/dist/i3s-converter/json-templates/layers.js.map +0 -1
- package/dist/i3s-converter/json-templates/metadata.js.map +0 -1
- package/dist/i3s-converter/json-templates/node.js.map +0 -1
- package/dist/i3s-converter/json-templates/scene-server.js.map +0 -1
- package/dist/i3s-converter/json-templates/shared-resources.js.map +0 -1
- package/dist/i3s-converter/json-templates/store.js.map +0 -1
- package/dist/i3s-converter/types.js.map +0 -1
- package/dist/i3s-server/README.md +0 -63
- package/dist/i3s-server/app.js.map +0 -1
- package/dist/i3s-server/bin/www.js.map +0 -1
- package/dist/i3s-server/certs/cert.pem +0 -19
- package/dist/i3s-server/certs/key.pem +0 -27
- package/dist/i3s-server/controllers/index-controller.js.map +0 -1
- package/dist/i3s-server/controllers/slpk-controller.js.map +0 -1
- package/dist/i3s-server/routes/index.js.map +0 -1
- package/dist/i3s-server/routes/slpk-router.js.map +0 -1
- package/dist/i3s-server/utils/create-scene-server.js.map +0 -1
- package/dist/i3s-server/utils/server-utils.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/json-schemas/conversion-dump-json-schema.js.map +0 -1
- package/dist/lib/utils/cli-utils.js.map +0 -1
- package/dist/lib/utils/compress-util.js.map +0 -1
- package/dist/lib/utils/conversion-dump.js.map +0 -1
- package/dist/lib/utils/file-utils.js.map +0 -1
- package/dist/lib/utils/geometry-utils.js.map +0 -1
- package/dist/lib/utils/lod-conversion-utils.js.map +0 -1
- package/dist/lib/utils/queue.js.map +0 -1
- package/dist/lib/utils/statistic-utills.js.map +0 -1
- package/dist/lib/utils/write-queue.js.map +0 -1
- package/dist/pgm-loader.js.map +0 -1
- package/dist/slpk-extractor/slpk-extractor.js.map +0 -1
- package/dist/slpk-extractor-cli.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"geometry-converter.js","names":["Vector3","Matrix4","Vector4","Ellipsoid","DracoWriterWorker","assert","encode","concatenateArrayBuffers","concatenateTypedArrays","md5","v4","uuidv4","generateAttributes","createBoundingVolumesFromGeometry","prepareDataForAttributesConversion","getTextureByMetadataClass","handleBatchIdsExtensions","checkPropertiesLength","flattenPropertyTableByFeatureIds","GL","generateSyntheticIndices","EXT_FEATURE_METADATA","EXT_STRUCTURAL_METADATA","DEFAULT_ROUGHNESS_FACTOR","DEFAULT_METALLIC_FACTOR","VALUES_PER_VERTEX","VALUES_PER_TEX_COORD","VALUES_PER_COLOR_ELEMENT","STRING_TYPE","SHORT_INT_TYPE","DOUBLE_TYPE","OBJECT_ID_TYPE","BATCHED_ID_POSSIBLE_ATTRIBUTE_NAMES","scratchVector","convertB3dmToI3sGeometry","tileContent","tileTransform","tileBoundingVolume","addNodeToNodePage","propertyTable","featuresHashArray","attributeStorageInfo","draco","generateBoundingVolumes","shouldMergeMaterials","geoidHeightModel","libraries","metadataClass","_tileContent$gltf","useCartesianPositions","materialAndTextureList","convertMaterials","gltf","materials","dataForAttributesConversion","featureTexture","convertedAttributesMap","convertAttributes","_generateBoundingVolumesFromGeometry","result","materialAndTexture","originarMaterialId","mergedMaterials","originalMaterialId","has","convertedAttributes","get","material","texture","nodeId","push","_makeNodeResources","length","attributes","values","boundingVolumes","positions","cartographicOrigin","obb","center","index","vertex","subarray","WGS84","cartesianToCartographic","Array","from","getHeight","subtract","set","_ref","_tileContent$gltf2","vertexCount","faceRange","featureIds","normals","colors","uvRegions","texCoords","featureCount","featureIdsMap","makeFeatureIdsUnique","featureIndices","header","Uint32Array","typedFeatureIds","generateBigUint64Array","fileBuffer","Uint8Array","buffer","ArrayBuffer","compressedGeometry","generateCompressedGeometry","Float32Array","convertPropertyTableToAttributeBuffers","geometry","hasUvRegions","Boolean","sharedResources","getSharedResources","meshMaterial","attributesData","nodes","images","cartesianModelMatrix","attributesMap","Map","Uint16Array","featureIndicesGroups","mergedMaterial","convertNodes","undefined","attrKey","keys","delete","reduce","acc","value","concat","matrix","arguments","node","convertNode","getCompositeTransformationMatrix","transformationMatrix","nodeMatrix","rotation","scale","translation","multiplyRight","translate","rotateXYZ","mesh","convertMesh","children","primitive","primitives","outputAttributes","materialUvRegion","_outputAttributes","_outputAttributes$mer","id","find","_ref2","_primitive$material","uvRegion","mode","TRIANGLES","TRIANGLE_STRIP","indices","normalizeIndices","transformVertexArray","vertices","POSITION","attributeSpecificTransformation","transformVertexPositions","NORMAL","transformVertexNormals","flattenTexCoords","TEXCOORD_0","flattenColors","COLOR_0","createUvRegion","flattenBatchIds","getBatchIds","_primitive$indices","TypedArrayConstructor","constructor","newIndices","triangleIndex","currentTriangle","slice","i","reverse","args","newVertices","coordIndex","vertexVector","x","y","z","calleeArgs","transform","transformAsVector","newTexCoords","fill","texCoord","colorsAttribute","components","newColors","colorIndex","color","colorUint8","j","batchedIds","newBatchIds","batchIds","possibleBatchIdAttributeName","sourceMaterials","sourceMaterial","convertMaterial","mergeAllMaterials","newMaterial","splice","mergedIndices","mergeMaterials","_newMaterial$mergedMa","_newMaterial$mergedMa2","newWidth","accum","_ref3","textureSize","width","newHeight","_ref4","Math","max","height","currentX","aTextureMetadata","newX","BYTES_PER_ELEMENT","image","getDefaultMaterial","material1","material2","_material1$texture","_material2$texture","bufferView","buffer1","Buffer","data","buffer2","joinImages","sharpData","direction","toFormat","mimeType","toBuffer","error","console","log","pbrMetallicRoughness","baseColorTexture","textureSetDefinitionId","_sourceMaterial$emiss","_sourceMaterial$pbrMe","_sourceMaterial$pbrMe2","_sourceMaterial$pbrMe3","doubleSided","emissiveFactor","map","c","round","alphaMode","convertAlphaMode","roughnessFactor","metallicFactor","source","emissiveTexture","Number","isFinite","_sourceMaterial$pbrMe4","baseColorFactor","gltfAlphaMode","gltfMaterials","i3sResources","materialDefinitionInfos","gltfMaterial","materialDefinitionInfo","textureDefinitionInfo","convertGLTFMaterialToI3sSharedResources","textureDefinitionInfos","_gltfMaterial$pbrMeta","extractSharedResourcesTextureInfo","colorFactor","extractSharedResourcesMaterialInfo","matDielectricColorComponent","black","unitVector","dielectricSpecular","baseColorVector","firstOperand","multiply","diffuse","lerp","specular","params","toArray","renderMode","_texture$source","_texture$source2","_texture$source3","_texture$source4","encoding","generateImageId","size","_texture$source5","levelCountOfTexture","indexOfLevel","indexOfTextureInStore","zerosCount","toString","rightHalf","repeat","shiftedLevelCountOfTexture","shiftedIndexOfLevel","shiftedWidth","shiftedHeight","leftHalf","imageId","BigInt","batchTable","replaceMap","getFeaturesReplaceMap","replaceIndicesByUnique","featureMap","oldFeatureId","uniqueFeatureId","getOrCreateUniqueFeatureId","generateStringFromBatchTableByIndex","str","key","batchTableStr","hash","includes","indexOf","indicesArray","attributeBuffers","needFlattenPropertyTable","properties","propertyTableWithObjectIds","OBJECTID","propertyName","type","getAttributeType","attributeBuffer","generateAttributeBuffer","generateShortIntegerAttributeBuffer","generateDoubleAttributeBuffer","generateStringAttributeBuffer","attribute","attr","name","JSON","stringify","attributeValues","valueType","count","valuesArray","padding","Float64Array","batchAttributes","stringCountArray","totalNumberOfBytes","stringSizesArray","stringBufferArray","currentString","String","currentStringBuffer","currentStringSize","totalBytes","BigUint64Array","featureIndex","generateFeatureIndexAttribute","compressedAttributes","attributesMetadata","Int32Array","options","reuseWorkers","_nodeWorkers","modules","useLocalLibraries","method","workerUrl","orderedFeatureIndices","fillIndex","startIndex","endIndex","getPropertyTable","batchTableJson","extensionName","extension","getPropertyTableExtension","getPropertyTableFromExtStructuralMetadata","getPropertyTableFromExtFeatureMetadata","propertyTables","class","getPropertyData","propertyTextures","propertyTexture","featureTables","featureTableName","featureTable","featureTextures","featureTextureName","featureObject","propertyTableWithData","_tileContent$gltf3","_tileContent$gltf5","_tileContent$gltf5$ex","extensionsWithPropertyTables","extensionsUsed","extensionItem","_tileContent$gltf4","extensions"],"sources":["../../../src/i3s-converter/helpers/geometry-converter.ts"],"sourcesContent":["import type {FeatureTableJson, Tiles3DTileContent} from '@loaders.gl/3d-tiles';\nimport type {\n GLTFAccessorPostprocessed,\n GLTFMaterialPostprocessed,\n GLTFNodePostprocessed,\n GLTFMeshPrimitivePostprocessed,\n GLTFMeshPostprocessed,\n GLTFTexturePostprocessed,\n GLTF_EXT_feature_metadata_GLTF,\n GLTF_EXT_feature_metadata_FeatureTable,\n GLTF_EXT_feature_metadata_FeatureTexture,\n GLTF_EXT_structural_metadata_GLTF,\n GLTF_EXT_structural_metadata_PropertyTable,\n GLTF_EXT_structural_metadata_PropertyTexture\n} from '@loaders.gl/gltf';\n\nimport {Vector3, Matrix4, Vector4} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\n\nimport {DracoWriterWorker} from '@loaders.gl/draco';\nimport {assert, encode} from '@loaders.gl/core';\nimport {concatenateArrayBuffers, concatenateTypedArrays} from '@loaders.gl/loader-utils';\nimport md5 from 'md5';\nimport {v4 as uuidv4} from 'uuid';\nimport {generateAttributes} from './geometry-attributes';\nimport {createBoundingVolumesFromGeometry} from './coordinate-converter';\nimport {\n ConvertedAttributes,\n I3SConvertedResources,\n I3SMaterialWithTexture,\n MergedMaterial,\n SharedResourcesArrays\n} from '../types';\nimport {\n AttributeStorageInfo,\n I3SMaterialDefinition,\n MaterialDefinitionInfo,\n TextureDefinitionInfo\n} from '@loaders.gl/i3s';\nimport {NumberArray, TypedArray} from '@loaders.gl/loader-utils';\nimport {Geoid} from '@math.gl/geoid';\nimport {prepareDataForAttributesConversion} from './gltf-attributes';\nimport {getTextureByMetadataClass, handleBatchIdsExtensions} from './batch-ids-extensions';\nimport {checkPropertiesLength, flattenPropertyTableByFeatureIds} from './feature-attributes';\nimport {GL} from '@loaders.gl/math';\n\n/*\n At the moment of writing the type TypedArrayConstructor is not exported in '@math.gl/types'.\n So the following import is replaced with the local import\n import type {TypedArrayConstructor} from '@math.gl/types'; \n*/\nimport type {GLTFAttributesData, TextureImageProperties, TypedArrayConstructor} from '../types';\nimport {generateSyntheticIndices} from '../../lib/utils/geometry-utils';\nimport {BoundingSphere, OrientedBoundingBox} from '@math.gl/culling';\n\nimport {EXT_FEATURE_METADATA, EXT_STRUCTURAL_METADATA} from '@loaders.gl/gltf';\n\n// Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.7/pbrMetallicRoughness.cmn.md\nconst DEFAULT_ROUGHNESS_FACTOR = 1;\nconst DEFAULT_METALLIC_FACTOR = 1;\n\nconst VALUES_PER_VERTEX = 3;\nconst VALUES_PER_TEX_COORD = 2;\nconst VALUES_PER_COLOR_ELEMENT = 4;\n\nconst STRING_TYPE = 'string';\nconst SHORT_INT_TYPE = 'Int32';\nconst DOUBLE_TYPE = 'Float64';\nconst OBJECT_ID_TYPE = 'Oid32';\n/*\n * 'CUSTOM_ATTRIBUTE_2' - Attribute name which includes batch info and used by New York map.\n * _BATCHID - Default attribute name which includes batch info.\n * BATCHID - Legacy attribute name which includes batch info.\n */\nconst BATCHED_ID_POSSIBLE_ATTRIBUTE_NAMES = ['CUSTOM_ATTRIBUTE_2', '_BATCHID', 'BATCHID'];\n\nlet scratchVector = new Vector3();\n\n/**\n * Convert binary data from b3dm file to i3s resources\n *\n * @param tileContent - 3d tile content\n * @param tileTransform - transformation matrix of the tile, calculated recursively multiplying\n * transform of all parent tiles and transform of the current tile\n * @param tileBoundingVolume - initialized bounding volume of the source tile\n * @param addNodeToNodePage - function to add new node to node pages\n * @param propertyTable - batch table (corresponding to feature attributes data)\n * @param featuresHashArray - hash array of features that is needed to not to mix up same features in parent and child nodes\n * @param attributeStorageInfo - attributes metadata from 3DSceneLayer json\n * @param draco - is converter should create draco compressed geometry\n * @param generateBoundingVolumes - is converter should create accurate bounding voulmes from geometry attributes\n * @param shouldMergeMaterials - Try to merge similar materials to be able to merge meshes into one node\n * @param geoidHeightModel - model to convert elevation from elipsoidal to geoid\n * @param libraries - dynamicaly loaded 3rd-party libraries\n * @param metadataClass `- user selected feature metadata class name`\n * @returns Array of node resources to create one or more i3s nodes\n */\nexport default async function convertB3dmToI3sGeometry(\n tileContent: Tiles3DTileContent,\n tileTransform: Matrix4,\n tileBoundingVolume: OrientedBoundingBox | BoundingSphere,\n addNodeToNodePage: () => Promise<number>,\n propertyTable: FeatureTableJson | null,\n featuresHashArray: string[],\n attributeStorageInfo: AttributeStorageInfo[] | undefined,\n draco: boolean,\n generateBoundingVolumes: boolean,\n shouldMergeMaterials: boolean,\n geoidHeightModel: Geoid,\n libraries: Record<string, string>,\n metadataClass?: string\n): Promise<I3SConvertedResources[] | null> {\n const useCartesianPositions = generateBoundingVolumes;\n const materialAndTextureList: I3SMaterialWithTexture[] = await convertMaterials(\n tileContent.gltf?.materials,\n shouldMergeMaterials\n );\n\n const dataForAttributesConversion = prepareDataForAttributesConversion(\n tileContent,\n tileTransform,\n tileBoundingVolume\n );\n const featureTexture = getTextureByMetadataClass(tileContent, metadataClass);\n const convertedAttributesMap: Map<string, ConvertedAttributes> = await convertAttributes(\n dataForAttributesConversion,\n materialAndTextureList,\n useCartesianPositions,\n featureTexture\n );\n /** Usage of worker here brings more overhead than advantage */\n // const convertedAttributesMap: Map<string, ConvertedAttributes> =\n // await transformI3SAttributesOnWorker(dataForAttributesConversion, {\n // reuseWorkers: true,\n // _nodeWorkers: true,\n // useCartesianPositions,\n // source: workerSource.I3SAttributes\n // });\n\n if (generateBoundingVolumes) {\n _generateBoundingVolumesFromGeometry(convertedAttributesMap, geoidHeightModel);\n }\n\n const result: I3SConvertedResources[] = [];\n for (const materialAndTexture of materialAndTextureList) {\n const originarMaterialId = materialAndTexture.mergedMaterials[0].originalMaterialId;\n if (!convertedAttributesMap.has(originarMaterialId)) {\n continue; // eslint-disable-line no-continue\n }\n const convertedAttributes = convertedAttributesMap.get(originarMaterialId);\n if (!convertedAttributes) {\n continue;\n }\n const {material, texture} = materialAndTexture;\n const nodeId = await addNodeToNodePage();\n result.push(\n await _makeNodeResources({\n convertedAttributes,\n material,\n texture,\n tileContent,\n nodeId,\n featuresHashArray,\n propertyTable,\n attributeStorageInfo,\n draco,\n libraries\n })\n );\n }\n\n if (!result.length) {\n return null;\n }\n return result;\n}\n\n/**\n * Create bounding volumes based on positions\n * @param convertedAttributesMap - geometry attributes map\n * @param geoidHeightModel - geoid height model to convert elevation from elipsoidal to geoid\n */\nfunction _generateBoundingVolumesFromGeometry(\n convertedAttributesMap: Map<string, ConvertedAttributes>,\n geoidHeightModel: Geoid\n) {\n for (const attributes of convertedAttributesMap.values()) {\n const boundingVolumes = createBoundingVolumesFromGeometry(\n attributes.positions,\n geoidHeightModel\n );\n\n attributes.boundingVolumes = boundingVolumes;\n const cartographicOrigin = boundingVolumes.obb.center;\n\n for (let index = 0; index < attributes.positions.length; index += VALUES_PER_VERTEX) {\n const vertex = attributes.positions.subarray(index, index + VALUES_PER_VERTEX);\n Ellipsoid.WGS84.cartesianToCartographic(Array.from(vertex), scratchVector);\n scratchVector[2] =\n scratchVector[2] - geoidHeightModel.getHeight(scratchVector[1], scratchVector[0]);\n scratchVector = scratchVector.subtract(cartographicOrigin);\n attributes.positions.set(scratchVector, index);\n }\n }\n}\n\n/**\n *\n * @param params\n * @param params.convertedAttributes - Converted geometry attributes\n * @param params.material - I3S PBR-like material definition\n * @param params.texture - texture content\n * @param params.tileContent - 3DTiles decoded content\n * @param params.nodeId - new node ID\n * @param params.featuresHashArray - hash array of features that is needed to not to mix up same features in parent and child nodes\n * @param params.propertyTable - batch table (corresponding to feature attributes data)\n * @param params.attributeStorageInfo - attributes metadata from 3DSceneLayer json\n * @param params.draco - is converter should create draco compressed geometry\n * @param libraries - dynamicaly loaded 3rd-party libraries\n * @returns Array of I3S node resources\n */\nasync function _makeNodeResources({\n convertedAttributes,\n material,\n texture,\n tileContent,\n nodeId,\n featuresHashArray,\n propertyTable,\n attributeStorageInfo,\n draco,\n libraries\n}: {\n convertedAttributes: ConvertedAttributes;\n material: I3SMaterialDefinition;\n texture?: {};\n tileContent: Tiles3DTileContent;\n nodeId: number;\n featuresHashArray: string[];\n propertyTable: FeatureTableJson | null;\n attributeStorageInfo?: AttributeStorageInfo[];\n draco: boolean;\n libraries: Record<string, string>;\n}): Promise<I3SConvertedResources> {\n const boundingVolumes = convertedAttributes.boundingVolumes;\n const vertexCount = convertedAttributes.positions.length / VALUES_PER_VERTEX;\n const {faceRange, featureIds, positions, normals, colors, uvRegions, texCoords, featureCount} =\n generateAttributes(convertedAttributes);\n\n let featureIdsMap: Record<string, number> = {};\n if (propertyTable) {\n /**\n * 3DTiles has featureIndices unique only for one tile.\n * In I3S featureIds are unique layer-wide. We create featureIds from all feature properties.\n * If 3DTiles features has equal set of properties they are considered as same feature in I3S.\n */\n featureIdsMap = makeFeatureIdsUnique(\n featureIds,\n convertedAttributes.featureIndices,\n featuresHashArray,\n propertyTable\n );\n }\n\n const header = new Uint32Array(2);\n const typedFeatureIds = generateBigUint64Array(featureIds);\n\n header.set([vertexCount, featureCount], 0);\n const fileBuffer = new Uint8Array(\n concatenateArrayBuffers(\n header.buffer,\n positions.buffer,\n normals.buffer,\n texture ? texCoords.buffer : new ArrayBuffer(0),\n colors.buffer,\n uvRegions,\n typedFeatureIds.buffer,\n faceRange.buffer\n )\n );\n const compressedGeometry = draco\n ? generateCompressedGeometry(\n vertexCount,\n convertedAttributes,\n {\n positions,\n normals,\n texCoords: texture ? texCoords : new Float32Array(0),\n colors,\n uvRegions,\n featureIds,\n faceRange\n },\n libraries\n )\n : null;\n\n let attributes: ArrayBuffer[] = [];\n\n if (attributeStorageInfo && propertyTable) {\n attributes = convertPropertyTableToAttributeBuffers(\n featureIds,\n featureIdsMap,\n propertyTable,\n attributeStorageInfo\n );\n }\n\n return {\n nodeId,\n geometry: fileBuffer,\n compressedGeometry,\n texture,\n hasUvRegions: Boolean(uvRegions.length),\n sharedResources: getSharedResources(tileContent.gltf?.materials || [], nodeId),\n meshMaterial: material,\n vertexCount,\n attributes,\n featureCount,\n boundingVolumes\n };\n}\n\n/**\n * Convert attributes from the gltf nodes tree to i3s plain geometry\n * @param attributesData - geometry attributes from gltf\n * @param materialAndTextureList - array of data about materials and textures of the content\n * @param useCartesianPositions - convert positions to absolute cartesian coordinates instead of cartographic offsets.\n * Cartesian coordinates will be required for creating bounding voulmest from geometry positions\n * @param featureTexture - feature texture key\n * @returns map of converted geometry attributes\n */\nexport async function convertAttributes(\n attributesData: GLTFAttributesData,\n materialAndTextureList: I3SMaterialWithTexture[],\n useCartesianPositions: boolean,\n featureTexture: string | null\n): Promise<Map<string, ConvertedAttributes>> {\n const {nodes, images, cartographicOrigin, cartesianModelMatrix} = attributesData;\n const attributesMap = new Map<string, ConvertedAttributes>();\n\n for (const materialAndTexture of materialAndTextureList) {\n const attributes = {\n positions: new Float32Array(0),\n normals: new Float32Array(0),\n texCoords: new Float32Array(0),\n colors: new Uint8Array(0),\n uvRegions: new Uint16Array(0),\n featureIndicesGroups: [],\n featureIndices: [],\n boundingVolumes: null,\n mergedMaterials: materialAndTexture.mergedMaterials\n };\n for (const mergedMaterial of materialAndTexture.mergedMaterials) {\n attributesMap.set(mergedMaterial.originalMaterialId, attributes);\n }\n }\n\n convertNodes(\n nodes,\n images,\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions,\n undefined,\n featureTexture\n );\n\n for (const attrKey of attributesMap.keys()) {\n const attributes = attributesMap.get(attrKey);\n if (!attributes) {\n continue;\n }\n if (attributes.positions.length === 0) {\n attributesMap.delete(attrKey);\n continue; // eslint-disable-line no-continue\n }\n if (attributes.featureIndicesGroups) {\n attributes.featureIndices = attributes.featureIndicesGroups.reduce((acc, value) =>\n acc.concat(value)\n );\n delete attributes.featureIndicesGroups;\n }\n }\n\n return attributesMap;\n}\n\n/**\n * glTF has hierarchical structure of nodes. This function converts nodes starting from those which are in gltf scene object.\n * The goal is applying tranformation matrix for all children. Functions \"convertNodes\" and \"convertNode\" work together recursively.\n * @param nodes - gltf nodes array\n * @param images - gltf images array\n * @param cartographicOrigin - cartographic origin of bounding volume\n * @param cartesianModelMatrix - cartesian model matrix to convert coordinates to cartographic\n * @param attributesMap - for recursive concatenation of attributes\n * @param useCartesianPositions - convert positions to absolute cartesian coordinates instead of cartographic offsets.\n * Cartesian coordinates will be required for creating bounding voulmest from geometry positions\n * @param matrix - transformation matrix - cumulative transformation matrix formed from all parent node matrices\n * @param featureTexture - feature texture key\n * @returns {void}\n */\nfunction convertNodes(\n nodes: GLTFNodePostprocessed[],\n images: (TextureImageProperties | null)[],\n cartographicOrigin: Vector3,\n cartesianModelMatrix: Matrix4,\n attributesMap: Map<string, ConvertedAttributes>,\n useCartesianPositions: boolean,\n matrix: Matrix4 = new Matrix4([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n featureTexture: string | null\n) {\n if (nodes) {\n for (const node of nodes) {\n convertNode(\n node,\n images,\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions,\n matrix,\n featureTexture\n );\n }\n }\n}\n\n/**\n * Generate transformation matrix for node\n * Aapply all gltf transformations to initial transformation matrix.\n * @param node\n * @param matrix\n */\nfunction getCompositeTransformationMatrix(node: GLTFNodePostprocessed, matrix: Matrix4) {\n let transformationMatrix = matrix;\n\n const {matrix: nodeMatrix, rotation, scale, translation} = node;\n\n if (nodeMatrix) {\n transformationMatrix = matrix.multiplyRight(nodeMatrix);\n }\n\n if (translation) {\n transformationMatrix = transformationMatrix.translate(translation);\n }\n\n if (rotation) {\n transformationMatrix = transformationMatrix.rotateXYZ(rotation);\n }\n\n if (scale) {\n transformationMatrix = transformationMatrix.scale(scale);\n }\n\n return transformationMatrix;\n}\n\n/**\n * Convert all primitives of node and all children nodes\n * @param node - gltf node\n * @param images - gltf images array\n * @param cartographicOrigin - cartographic origin of bounding volume\n * @param cartesianModelMatrix - cartesian model matrix to convert coordinates to cartographic\n * @param attributesMap Map<{positions: Float32Array, normals: Float32Array, texCoords: Float32Array, colors: Uint8Array, featureIndices: Array}> - for recursive concatenation of\n * attributes\n * @param useCartesianPositions - convert positions to absolute cartesian coordinates instead of cartographic offsets.\n * Cartesian coordinates will be required for creating bounding voulmest from geometry positions\n * @param matrix - transformation matrix - cumulative transformation matrix formed from all parent node matrices\n * @param featureTexture - feature texture key\n */\nfunction convertNode(\n node: GLTFNodePostprocessed,\n images: (TextureImageProperties | null)[],\n cartographicOrigin: Vector3,\n cartesianModelMatrix: Matrix4,\n attributesMap: Map<string, ConvertedAttributes>,\n useCartesianPositions,\n matrix = new Matrix4([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n featureTexture: string | null\n) {\n const transformationMatrix = getCompositeTransformationMatrix(node, matrix);\n\n const mesh = node.mesh;\n\n if (mesh) {\n convertMesh(\n mesh,\n images,\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions,\n transformationMatrix,\n featureTexture\n );\n }\n\n convertNodes(\n node.children || [],\n images,\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions,\n transformationMatrix,\n featureTexture\n );\n}\n\n/**\n * Convert all primitives of the mesh\n * @param mesh - gltf mesh data\n * @param images - gltf images array\n * @param cartographicOrigin - cartographic origin of bounding volume\n * @param cartesianModelMatrix - cartesian model matrix to convert coordinates to cartographic\n * @param attributesMap Map<{positions: Float32Array, normals: Float32Array, texCoords: Float32Array, colors: Uint8Array, featureIndices: Array}> - for recursive concatenation of\n * attributes\n * @param useCartesianPositions - convert positions to absolute cartesian coordinates instead of cartographic offsets.\n * Cartesian coordinates will be required for creating bounding voulmest from geometry positions\n * @param attributesMap Map<{positions: Float32Array, normals: Float32Array, texCoords: Float32Array, colors: Uint8Array, featureIndices: Array}> - for recursive concatenation of\n * attributes\n * @param matrix - transformation matrix - cumulative transformation matrix formed from all parent node matrices\n * @param featureTexture - feature texture key\n */\nfunction convertMesh(\n mesh: GLTFMeshPostprocessed,\n images: (TextureImageProperties | null)[],\n cartographicOrigin: Vector3,\n cartesianModelMatrix: Matrix4,\n attributesMap: Map<string, ConvertedAttributes>,\n useCartesianPositions = false,\n matrix = new Matrix4([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n featureTexture: string | null\n) {\n for (const primitive of mesh.primitives) {\n let outputAttributes: ConvertedAttributes | null | undefined = null;\n let materialUvRegion: Uint16Array | undefined;\n if (primitive.material) {\n outputAttributes = attributesMap.get(primitive.material.id);\n materialUvRegion = outputAttributes?.mergedMaterials.find(\n ({originalMaterialId}) => originalMaterialId === primitive.material?.id\n )?.uvRegion;\n } else if (attributesMap.has('default')) {\n outputAttributes = attributesMap.get('default');\n }\n assert(outputAttributes !== null, 'Primitive - material mapping failed');\n // Per the spec https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_mesh_primitive_mode\n // GL.TRIANGLES is default. So in case `mode` is `undefined`, it is 'TRIANGLES'\n assert(\n primitive.mode === undefined ||\n primitive.mode === GL.TRIANGLES ||\n primitive.mode === GL.TRIANGLE_STRIP,\n `Primitive - unsupported mode ${primitive.mode}`\n );\n const attributes = primitive.attributes;\n if (!outputAttributes) {\n continue;\n }\n\n const indices = normalizeIndices(primitive);\n outputAttributes.positions = concatenateTypedArrays(\n outputAttributes.positions,\n transformVertexArray({\n vertices: attributes.POSITION.value,\n cartographicOrigin,\n cartesianModelMatrix,\n nodeMatrix: matrix,\n indices,\n attributeSpecificTransformation: transformVertexPositions,\n useCartesianPositions\n })\n );\n outputAttributes.normals = concatenateTypedArrays(\n outputAttributes.normals,\n transformVertexArray({\n vertices: attributes.NORMAL && attributes.NORMAL.value,\n cartographicOrigin,\n cartesianModelMatrix,\n nodeMatrix: matrix,\n indices,\n attributeSpecificTransformation: transformVertexNormals,\n useCartesianPositions: false\n })\n );\n outputAttributes.texCoords = concatenateTypedArrays(\n outputAttributes.texCoords,\n flattenTexCoords(attributes.TEXCOORD_0 && attributes.TEXCOORD_0.value, indices)\n );\n\n outputAttributes.colors = concatenateTypedArrays(\n outputAttributes.colors,\n flattenColors(attributes.COLOR_0, indices)\n );\n\n if (materialUvRegion) {\n outputAttributes.uvRegions = concatenateTypedArrays(\n outputAttributes.uvRegions,\n createUvRegion(materialUvRegion, indices)\n );\n }\n\n outputAttributes.featureIndicesGroups = outputAttributes.featureIndicesGroups || [];\n outputAttributes.featureIndicesGroups.push(\n flattenBatchIds(getBatchIds(attributes, primitive, images, featureTexture), indices)\n );\n }\n}\n/**\n * Converts TRIANGLE-STRIPS to independent TRIANGLES\n * @param primitive - the primitive to get the indices from\n * @returns indices of vertices of the independent triangles\n */\nfunction normalizeIndices(primitive: GLTFMeshPrimitivePostprocessed): TypedArray {\n let indices: TypedArray | undefined = primitive.indices?.value;\n if (!indices) {\n const positions = primitive.attributes.POSITION.value;\n return generateSyntheticIndices(positions.length / VALUES_PER_VERTEX);\n }\n\n if (indices && primitive.mode === GL.TRIANGLE_STRIP) {\n /*\n TRIANGLE_STRIP geometry contains n+2 vertices for n triangles;\n TRIANGLE geometry contains n*3 vertices for n triangles.\n The conversion from TRIANGLE_STRIP to TRIANGLE implies duplicating adjacent vertices.\n */\n const TypedArrayConstructor = indices.constructor as TypedArrayConstructor;\n const newIndices = new TypedArrayConstructor((indices.length - 2) * 3);\n\n // Copy the first triangle indices with no modification like [i0, i1, i2, ...] -> [i0, i1, i2, ...]\n let triangleIndex = 0;\n let currentTriangle = indices.slice(0, 3);\n newIndices.set(currentTriangle, 0);\n\n // The rest triangle indices are being taken from strips using the following logic:\n // [i1, i2, i3, i4, i5, i6, ...] -> [i3, i2, i1, i2, i3, i4, i5, i4, i3, i4, i5, i6, ...]\n for (let i = 1; i + 2 < indices.length; i++) {\n triangleIndex += 3;\n currentTriangle = indices.slice(i, i + 3);\n if (i % 2 === 0) {\n newIndices.set(currentTriangle, triangleIndex);\n } else {\n // The following \"reverce\" is necessary to calculate normals correctly\n newIndices.set(currentTriangle.reverse(), triangleIndex);\n }\n }\n indices = newIndices;\n }\n return indices as TypedArray;\n}\n\n/**\n * Convert vertices attributes (POSITIONS or NORMALS) to i3s compatible format\n * @param args\n * @param args.vertices - gltf primitive POSITION or NORMAL attribute\n * @param args.cartographicOrigin - cartographic origin coordinates\n * @param args.cartesianModelMatrix - a cartesian model matrix to transform coordnates from cartesian to cartographic format\n * @param args.nodeMatrix - a gltf node transformation matrix - cumulative transformation matrix formed from all parent node matrices\n * @param args.indices - gltf primitive indices\n * @param args.attributeSpecificTransformation - function to do attribute - specific transformations\n * @param args.useCartesianPositions - use coordinates as it is.\n * @returns\n */\nfunction transformVertexArray(args: {\n vertices: TypedArray;\n cartographicOrigin: number[];\n cartesianModelMatrix: number[];\n nodeMatrix: Matrix4;\n indices: TypedArray;\n attributeSpecificTransformation: Function;\n useCartesianPositions: boolean;\n}): Float32Array {\n const {vertices, indices, attributeSpecificTransformation} = args;\n const newVertices = new Float32Array(indices.length * VALUES_PER_VERTEX);\n if (!vertices) {\n return newVertices;\n }\n for (let i = 0; i < indices.length; i++) {\n const coordIndex = indices[i] * VALUES_PER_VERTEX;\n const vertex = vertices.subarray(coordIndex, coordIndex + VALUES_PER_VERTEX);\n let vertexVector = new Vector3(Array.from(vertex));\n\n vertexVector = attributeSpecificTransformation(vertexVector, args);\n\n newVertices[i * VALUES_PER_VERTEX] = vertexVector.x;\n newVertices[i * VALUES_PER_VERTEX + 1] = vertexVector.y;\n newVertices[i * VALUES_PER_VERTEX + 2] = vertexVector.z;\n }\n return newVertices;\n}\n\n/**\n * Trasform positions vector with the attribute specific transformations\n * @param vertexVector - source positions vector to transform\n * @param calleeArgs\n * @param calleeArgs.cartesianModelMatrix - a cartesian model matrix to transform coordnates from cartesian to cartographic format\n * @param calleeArgs.cartographicOrigin - cartographic origin coordinates\n * @param calleeArgs.nodeMatrix - a gltf node transformation matrix - cumulative transformation matrix formed from all parent node matrices\n * @param calleeArgs.useCartesianPositions - use coordinates as it is.\n * @returns transformed positions vector\n */\nfunction transformVertexPositions(vertexVector, calleeArgs): number[] {\n const {cartesianModelMatrix, cartographicOrigin, nodeMatrix, useCartesianPositions} = calleeArgs;\n\n if (nodeMatrix) {\n vertexVector = vertexVector.transform(nodeMatrix);\n }\n\n vertexVector = vertexVector.transform(cartesianModelMatrix);\n\n if (useCartesianPositions) {\n return vertexVector;\n }\n\n Ellipsoid.WGS84.cartesianToCartographic(\n [vertexVector[0], vertexVector[1], vertexVector[2]],\n vertexVector\n );\n vertexVector = vertexVector.subtract(cartographicOrigin);\n return vertexVector;\n}\n\n/**\n * Trasform normals vector with the attribute specific transformations\n * @param vertexVector - source normals vector to transform\n * @param calleeArgs\n * @param calleeArgs.cartesianModelMatrix - a cartesian model matrix to transform coordnates from cartesian to cartographic format\n * @param calleeArgs.nodeMatrix - a gltf node transformation matrix - cumulative transformation matrix formed from all parent node matrices\n * @returns transformed normals vector\n */\nfunction transformVertexNormals(vertexVector, calleeArgs): number[] {\n const {cartesianModelMatrix, nodeMatrix} = calleeArgs;\n\n if (nodeMatrix) {\n vertexVector = vertexVector.transformAsVector(nodeMatrix);\n }\n\n vertexVector = vertexVector.transformAsVector(cartesianModelMatrix);\n return vertexVector;\n}\n\n/**\n * Convert uv0 (texture coordinates) from coords based on indices to plain arrays, compatible with i3s\n * @param texCoords - gltf primitive TEXCOORD_0 attribute\n * @param indices - gltf primitive indices\n * @returns flattened texture coordinates\n */\nfunction flattenTexCoords(texCoords: TypedArray, indices: TypedArray): Float32Array {\n const newTexCoords = new Float32Array(indices.length * VALUES_PER_TEX_COORD);\n if (!texCoords) {\n // We need dummy UV0s because it is required in 1.6\n // https://github.com/Esri/i3s-spec/blob/master/docs/1.6/vertexAttribute.cmn.md\n newTexCoords.fill(1);\n return newTexCoords;\n }\n for (let i = 0; i < indices.length; i++) {\n const coordIndex = indices[i] * VALUES_PER_TEX_COORD;\n const texCoord = texCoords.subarray(coordIndex, coordIndex + VALUES_PER_TEX_COORD);\n newTexCoords[i * VALUES_PER_TEX_COORD] = texCoord[0];\n newTexCoords[i * VALUES_PER_TEX_COORD + 1] = texCoord[1];\n }\n return newTexCoords;\n}\n\n/**\n * Convert color from COLOR_0 based on indices to plain arrays, compatible with i3s\n * @param colorsAttribute - gltf primitive COLOR_0 attribute\n * @param indices - gltf primitive indices\n * @returns flattened colors attribute\n */\nfunction flattenColors(\n colorsAttribute: GLTFAccessorPostprocessed,\n indices: TypedArray\n): Uint8Array {\n const components = colorsAttribute?.components || VALUES_PER_COLOR_ELEMENT;\n const newColors = new Uint8Array(indices.length * components);\n if (!colorsAttribute) {\n // Vertex color multiplies by material color so it must be normalized 1 by default\n newColors.fill(255);\n return newColors;\n }\n const colors = colorsAttribute.value;\n for (let i = 0; i < indices.length; i++) {\n const colorIndex = indices[i] * components;\n const color = colors.subarray(colorIndex, colorIndex + components);\n const colorUint8 = new Uint8Array(components);\n for (let j = 0; j < color.length; j++) {\n colorUint8[j] = color[j] * 255;\n }\n newColors.set(colorUint8, i * components);\n }\n return newColors;\n}\n\n/**\n * Create per-vertex uv-region array\n * @param materialUvRegion - uv-region fragment for a single vertex\n * @param indices - geometry indices data\n * @returns - uv-region array\n */\nfunction createUvRegion(materialUvRegion: Uint16Array, indices: TypedArray): Uint16Array {\n const result = new Uint16Array(indices.length * 4);\n for (let i = 0; i < result.length; i += 4) {\n result.set(materialUvRegion, i);\n }\n return result;\n}\n\n/**\n * Flatten batchedIds list based on indices to right ordered array, compatible with i3s\n * @param batchedIds - gltf primitive\n * @param indices - gltf primitive indices\n * @returns flattened batch ids\n */\nfunction flattenBatchIds(batchedIds: NumberArray, indices: TypedArray): number[] {\n if (!batchedIds.length || !indices.length) {\n return [];\n }\n const newBatchIds: number[] = [];\n for (let i = 0; i < indices.length; i++) {\n const coordIndex = indices[i];\n newBatchIds.push(batchedIds[coordIndex]);\n }\n return newBatchIds;\n}\n\n/**\n * Get batchIds for featureIds creation\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 batch IDs\n */\nfunction getBatchIds(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n primitive: GLTFMeshPrimitivePostprocessed,\n images: (TextureImageProperties | null)[],\n featureTexture: string | null\n): NumberArray {\n const batchIds: NumberArray = handleBatchIdsExtensions(\n attributes,\n primitive,\n images,\n featureTexture\n );\n\n if (batchIds.length) {\n return batchIds;\n }\n\n for (let index = 0; index < BATCHED_ID_POSSIBLE_ATTRIBUTE_NAMES.length; index++) {\n const possibleBatchIdAttributeName = BATCHED_ID_POSSIBLE_ATTRIBUTE_NAMES[index];\n if (\n attributes[possibleBatchIdAttributeName] &&\n attributes[possibleBatchIdAttributeName].value\n ) {\n return attributes[possibleBatchIdAttributeName].value;\n }\n }\n\n return [];\n}\n\n/**\n * Convert GLTF material to I3S material definitions and textures\n * @param sourceMaterials Source GLTF materials\n * @param shouldMergeMaterials - if true - the converter will try to merge similar materials\n * to be able to merge primitives having those materials\n * @returns Array of Couples I3SMaterialDefinition + texture content\n */\nasync function convertMaterials(\n sourceMaterials: GLTFMaterialPostprocessed[] = [],\n shouldMergeMaterials: boolean\n): Promise<I3SMaterialWithTexture[]> {\n let materials: I3SMaterialWithTexture[] = [];\n for (const sourceMaterial of sourceMaterials) {\n materials.push(convertMaterial(sourceMaterial));\n }\n\n if (shouldMergeMaterials) {\n materials = await mergeAllMaterials(materials);\n }\n\n return materials;\n}\n\n/**\n * Merge materials when possible\n * @param materials materials array\n * @returns merged materials array\n */\nasync function mergeAllMaterials(\n materials: I3SMaterialWithTexture[]\n): Promise<I3SMaterialWithTexture[]> {\n const result: I3SMaterialWithTexture[] = [];\n while (materials.length > 0) {\n let newMaterial = materials.splice(0, 1)[0];\n const mergedIndices: number[] = [];\n for (let i = 0; i < materials.length; i++) {\n const material = materials[i];\n if (\n (newMaterial.texture && material.texture) ||\n (!newMaterial.texture && !material.texture)\n ) {\n newMaterial = await mergeMaterials(newMaterial, material);\n mergedIndices.push(i);\n }\n }\n if (newMaterial.texture && mergedIndices.length) {\n const newWidth = newMaterial.mergedMaterials?.reduce(\n (accum, {textureSize}) => accum + (textureSize?.width || 0),\n 0\n );\n const newHeight = newMaterial.mergedMaterials?.reduce(\n (accum, {textureSize}) => Math.max(accum, textureSize?.height || 0),\n 0\n );\n let currentX = -1;\n for (const aTextureMetadata of newMaterial.mergedMaterials) {\n if (aTextureMetadata.textureSize) {\n const newX =\n currentX +\n 1 +\n (aTextureMetadata.textureSize.width / newWidth) *\n 2 ** (Uint16Array.BYTES_PER_ELEMENT * 8) -\n 1;\n aTextureMetadata.uvRegion = new Uint16Array([\n currentX + 1,\n 0,\n newX,\n (aTextureMetadata.textureSize.height / newHeight) *\n 2 ** (Uint16Array.BYTES_PER_ELEMENT * 8) -\n 1\n ]);\n currentX = newX;\n }\n }\n\n newMaterial.texture.image.width = newWidth;\n newMaterial.texture.image.height = newHeight;\n }\n for (const index of mergedIndices.reverse()) {\n materials.splice(index, 1);\n }\n result.push(newMaterial);\n }\n\n if (!result.length) {\n result.push({\n material: getDefaultMaterial(),\n mergedMaterials: [{originalMaterialId: 'default'}]\n });\n }\n return result;\n}\n\n/**\n * Merge 2 materials including texture\n * @param material1\n * @param material2\n * @returns\n */\nasync function mergeMaterials(\n material1: I3SMaterialWithTexture,\n material2: I3SMaterialWithTexture\n): Promise<I3SMaterialWithTexture> {\n if (\n material1.texture?.bufferView &&\n material2.texture?.bufferView &&\n material1.mergedMaterials &&\n material2.mergedMaterials\n ) {\n const buffer1 = Buffer.from(material1.texture.bufferView.data);\n const buffer2 = Buffer.from(material2.texture.bufferView.data);\n try {\n // @ts-ignore\n const {joinImages} = await import('join-images');\n const sharpData = await joinImages([buffer1, buffer2], {direction: 'horizontal'});\n material1.texture.bufferView.data = await sharpData\n .toFormat(material1.texture.mimeType === 'image/png' ? 'png' : 'jpeg')\n .toBuffer();\n } catch (error) {\n console.log(\n 'Join images into a texture atlas has failed. Consider usage `--split-nodes` option. (See documentation https://loaders.gl/modules/tile-converter/docs/cli-reference/tile-converter)'\n );\n throw error;\n }\n // @ts-ignore\n material1.material.pbrMetallicRoughness.baseColorTexture.textureSetDefinitionId = 1;\n }\n material1.mergedMaterials = material1.mergedMaterials.concat(material2.mergedMaterials);\n return material1;\n}\n\n/**\n * Convert texture and material from gltf 2.0 material object\n * @param sourceMaterial - material object\n * @returns I3S material definition and texture\n */\nfunction convertMaterial(sourceMaterial: GLTFMaterialPostprocessed): I3SMaterialWithTexture {\n const material: I3SMaterialDefinition = {\n doubleSided: sourceMaterial.doubleSided,\n emissiveFactor: sourceMaterial.emissiveFactor?.map((c) => Math.round(c * 255)) as [\n number,\n number,\n number\n ],\n // It is in upper case in GLTF: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#alpha-coverage\n // But it is in lower case in I3S: https://github.com/Esri/i3s-spec/blob/master/docs/1.7/materialDefinitions.cmn.md\n alphaMode: convertAlphaMode(sourceMaterial.alphaMode),\n pbrMetallicRoughness: {\n roughnessFactor:\n sourceMaterial?.pbrMetallicRoughness?.roughnessFactor || DEFAULT_ROUGHNESS_FACTOR,\n metallicFactor:\n sourceMaterial?.pbrMetallicRoughness?.metallicFactor || DEFAULT_METALLIC_FACTOR\n }\n };\n\n let texture;\n if (sourceMaterial?.pbrMetallicRoughness?.baseColorTexture) {\n texture = sourceMaterial.pbrMetallicRoughness.baseColorTexture.texture.source;\n material.pbrMetallicRoughness.baseColorTexture = {\n textureSetDefinitionId: 0\n };\n } else if (sourceMaterial.emissiveTexture) {\n texture = sourceMaterial.emissiveTexture.texture.source;\n // ArcGIS webscene doesn't show emissiveTexture but shows baseColorTexture\n material.pbrMetallicRoughness.baseColorTexture = {\n textureSetDefinitionId: 0\n };\n }\n\n sourceMaterial.id = Number.isFinite(sourceMaterial.id) ? sourceMaterial.id : uuidv4();\n let mergedMaterials: MergedMaterial[] = [{originalMaterialId: sourceMaterial.id}];\n if (!texture) {\n // Should use default baseColorFactor if it is not present in source material\n // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#reference-pbrmetallicroughness\n const baseColorFactor = sourceMaterial?.pbrMetallicRoughness?.baseColorFactor;\n material.pbrMetallicRoughness.baseColorFactor =\n ((baseColorFactor && baseColorFactor.map((c) => Math.round(c * 255))) as [\n number,\n number,\n number,\n number\n ]) || undefined;\n } else {\n mergedMaterials[0].textureSize = {width: texture.image.width, height: texture.image.height};\n }\n\n return {material, texture, mergedMaterials};\n}\n\n/**\n * Converts from `alphaMode` material property from GLTF to I3S format\n * @param gltfAlphaMode glTF material `alphaMode` property\n * @returns I3SMaterialDefinition.alphaMode property\n */\nfunction convertAlphaMode(\n gltfAlphaMode?: 'OPAQUE' | 'MASK' | 'BLEND' | string\n): 'opaque' | 'mask' | 'blend' {\n switch (gltfAlphaMode) {\n case 'OPAQUE':\n return 'opaque';\n case 'MASK':\n return 'mask';\n case 'BLEND':\n return 'blend';\n default:\n return 'opaque';\n }\n}\n\n/**\n * Form default I3SMaterialDefinition\n * @returns I3S material definition\n */\nfunction getDefaultMaterial(): I3SMaterialDefinition {\n return {\n alphaMode: 'opaque',\n pbrMetallicRoughness: {\n metallicFactor: 1,\n roughnessFactor: 1\n }\n };\n}\n\n/**\n * Form \"sharedResources\" from gltf materials array\n * @param gltfMaterials - GLTF materials array\n * @param nodeId - I3S node ID\n * @returns {materialDefinitionInfos: Object[], textureDefinitionInfos: Object[]} -\n * 2 arrays in format of i3s sharedResources data https://github.com/Esri/i3s-spec/blob/master/docs/1.7/sharedResource.cmn.md\n */\nfunction getSharedResources(\n gltfMaterials: GLTFMaterialPostprocessed[],\n nodeId: number\n): SharedResourcesArrays {\n const i3sResources: SharedResourcesArrays = {};\n\n if (!gltfMaterials || !gltfMaterials.length) {\n return i3sResources;\n }\n\n i3sResources.materialDefinitionInfos = [];\n for (const gltfMaterial of gltfMaterials) {\n const {materialDefinitionInfo, textureDefinitionInfo} = convertGLTFMaterialToI3sSharedResources(\n gltfMaterial,\n nodeId\n );\n i3sResources.materialDefinitionInfos.push(materialDefinitionInfo);\n if (textureDefinitionInfo) {\n i3sResources.textureDefinitionInfos = i3sResources.textureDefinitionInfos || [];\n i3sResources.textureDefinitionInfos.push(textureDefinitionInfo);\n }\n }\n return i3sResources;\n}\n\n/**\n * Convert gltf material into I3S sharedResources data\n * @param gltfMaterial - gltf material data\n * @param nodeId - I3S node ID\n * @returns - Couple {materialDefinitionInfo, textureDefinitionInfo} extracted from gltf material data\n */\nfunction convertGLTFMaterialToI3sSharedResources(\n gltfMaterial: GLTFMaterialPostprocessed,\n nodeId: number\n): {\n materialDefinitionInfo: MaterialDefinitionInfo;\n textureDefinitionInfo: TextureDefinitionInfo | null;\n} {\n const texture =\n gltfMaterial?.pbrMetallicRoughness?.baseColorTexture || gltfMaterial.emissiveTexture;\n let textureDefinitionInfo: TextureDefinitionInfo | null = null;\n if (texture) {\n textureDefinitionInfo = extractSharedResourcesTextureInfo(texture.texture, nodeId);\n }\n const {baseColorFactor, metallicFactor} = gltfMaterial?.pbrMetallicRoughness || {};\n let colorFactor = baseColorFactor;\n // If alpha channel is 0 try to get emissive factor from gltf material.\n if ((!baseColorFactor || baseColorFactor[3] === 0) && gltfMaterial.emissiveFactor) {\n colorFactor = gltfMaterial.emissiveFactor;\n colorFactor[3] = colorFactor[3] || 1;\n }\n\n return {\n materialDefinitionInfo: extractSharedResourcesMaterialInfo(\n colorFactor || [1, 1, 1, 1],\n metallicFactor\n ),\n textureDefinitionInfo\n };\n}\n\n/**\n * Form \"materialDefinition\" which is part of \"sharedResouces\"\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#materials\n * See formulas in appendix \"Appendix B: BRDF Implementation\":\n * const dielectricSpecular = rgb(0.04, 0.04, 0.04)\n * const black = rgb(0, 0, 0)\n * cdiff = lerp(baseColor.rgb * (1 - dielectricSpecular.r), black, metallic)\n * F0 = lerp(dieletricSpecular, baseColor.rgb, metallic)\n *\n * Assumption: F0 - specular in i3s (\"specular reflection\" <-> \"reflectance value at normal incidence\")\n * cdiff - diffuse in i3s (\"Diffuse color\" <-> \"'c' diffuse\" (c means color?))\n * @param baseColorFactor - RGBA color in 0..1 format\n * @param metallicFactor - \"metallicFactor\" attribute of gltf material object\n * @returns material definition info for I3S shared resource\n */\nfunction extractSharedResourcesMaterialInfo(\n baseColorFactor: number[],\n metallicFactor: number = 1\n): MaterialDefinitionInfo {\n const matDielectricColorComponent = 0.04 / 255; // Color from rgb (255) to 0..1 resolution\n // All color resolutions are 0..1\n const black = new Vector4(0, 0, 0, 1);\n const unitVector = new Vector4(1, 1, 1, 1);\n const dielectricSpecular = new Vector4(\n matDielectricColorComponent,\n matDielectricColorComponent,\n matDielectricColorComponent,\n 0\n );\n const baseColorVector = new Vector4(baseColorFactor);\n // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n // Formulas for Cdiff & F0\n const firstOperand = unitVector.subtract(dielectricSpecular).multiply(baseColorVector);\n const diffuse = firstOperand.lerp(firstOperand, black, metallicFactor);\n dielectricSpecular[3] = 1;\n const specular = dielectricSpecular.lerp(dielectricSpecular, baseColorVector, metallicFactor);\n return {\n params: {\n // @ts-expect-error NumericArray\n diffuse: diffuse.toArray(),\n // @ts-expect-error NumericArray\n specular: specular.toArray(),\n renderMode: 'solid'\n }\n };\n}\n\n/**\n * Form \"textureDefinition\" which is part of \"sharedResouces\"\n * @param texture - texture image info\n * @param nodeId - I3S node ID\n * @returns texture definition infor for shared resource\n */\nfunction extractSharedResourcesTextureInfo(\n texture: GLTFTexturePostprocessed,\n nodeId: number\n): TextureDefinitionInfo {\n return {\n encoding: texture?.source?.mimeType ? [texture.source.mimeType] : undefined,\n images: [\n {\n // 'i3s' has just size which is width of the image. Images are supposed to be square.\n // https://github.com/Esri/i3s-spec/blob/master/docs/1.7/image.cmn.md\n id: generateImageId(texture, nodeId),\n size: texture.source?.image.width,\n length: texture.source?.image.data.length ? [texture.source?.image.data.length] : undefined\n }\n ]\n };\n}\n\n/**\n * Formula for calculating imageId:\n * https://github.com/Esri/i3s-spec/blob/0a6366a9249b831db8436c322f8d27521e86cf07/format/Indexed%203d%20Scene%20Layer%20Format%20Specification.md#generating-image-ids\n * @param texture - texture image info\n * @param nodeId - I3S node ID\n * @returns calculate image ID according to the spec\n */\nfunction generateImageId(texture: GLTFTexturePostprocessed, nodeId: number) {\n const {width, height} = texture.source?.image || {};\n if (!width || !height) {\n return '';\n }\n const levelCountOfTexture = 1;\n const indexOfLevel = 0;\n const indexOfTextureInStore = nodeId + 1;\n\n const zerosCount = 32 - indexOfTextureInStore.toString(2).length;\n const rightHalf = '0'.repeat(zerosCount).concat(indexOfTextureInStore.toString(2));\n\n const shiftedLevelCountOfTexture = levelCountOfTexture << 28;\n const shiftedIndexOfLevel = indexOfLevel << 24;\n const shiftedWidth = (width - 1) << 12;\n const shiftedHeight = (height - 1) << 0;\n\n const leftHalf = shiftedLevelCountOfTexture + shiftedIndexOfLevel + shiftedWidth + shiftedHeight;\n const imageId = BigInt(`0b${leftHalf.toString(2)}${rightHalf}`);\n return imageId.toString();\n}\n\n/**\n * Make all feature ids unique through all nodes in layout.\n * @param featureIds\n * @param featureIndices\n * @param featuresHashArray\n * @param batchTable\n * @returns propertyTable indices to map featureIds\n */\nfunction makeFeatureIdsUnique(\n featureIds: number[],\n featureIndices: number[],\n featuresHashArray: string[],\n batchTable: {[key: string]: any}\n): Record<string, number> {\n const replaceMap = getFeaturesReplaceMap(featureIds, batchTable, featuresHashArray);\n replaceIndicesByUnique(featureIndices, replaceMap);\n replaceIndicesByUnique(featureIds, replaceMap);\n return replaceMap;\n}\n\n/**\n * Generate replace map to make featureIds unique.\n * @param featureIds\n * @param batchTable\n * @param featuresHashArray\n * @returns\n */\nfunction getFeaturesReplaceMap(\n featureIds: any[],\n batchTable: object,\n featuresHashArray: any[]\n): Record<string, number> {\n const featureMap: Record<string, number> = {};\n\n for (let index = 0; index < featureIds.length; index++) {\n const oldFeatureId = featureIds[index];\n const uniqueFeatureId = getOrCreateUniqueFeatureId(index, batchTable, featuresHashArray);\n featureMap[oldFeatureId.toString()] = uniqueFeatureId;\n }\n\n return featureMap;\n}\n\n/**\n * Generates string for unique batch id creation.\n * @param batchTable\n * @param index\n * @returns\n */\nfunction generateStringFromBatchTableByIndex(batchTable: object, index: number): string {\n let str = '';\n for (const key in batchTable) {\n str += batchTable[key][index];\n }\n return str;\n}\n\n/**\n * Return already exited featureId or creates and returns new to support unique feature ids throw nodes.\n * @param index\n * @param batchTable\n * @param featuresHashArray\n * @returns\n */\nfunction getOrCreateUniqueFeatureId(\n index: number,\n batchTable: object,\n featuresHashArray: any[]\n): number {\n const batchTableStr = generateStringFromBatchTableByIndex(batchTable, index);\n const hash = md5(batchTableStr);\n\n if (featuresHashArray.includes(hash)) {\n return featuresHashArray.indexOf(hash);\n }\n return featuresHashArray.push(hash) - 1;\n}\n\n/**\n * Do replacement of indices for making them unique through all nodes.\n * @param indicesArray\n * @param featureMap\n * @returns\n */\nfunction replaceIndicesByUnique(indicesArray: number[], featureMap: Record<string, number>) {\n for (let index = 0; index < indicesArray.length; index++) {\n indicesArray[index] = featureMap[indicesArray[index]];\n }\n}\n\n/**\n * Convert property table data to attribute buffers.\n * @param featureIds\n * @param propertyTable - table with metadata for particular feature.\n * @param attributeStorageInfo\n * @returns - Array of file buffers.\n */\nfunction convertPropertyTableToAttributeBuffers(\n featureIds: number[],\n featureIdsMap: Record<string, number>,\n propertyTable: FeatureTableJson,\n attributeStorageInfo: AttributeStorageInfo[]\n): any[] {\n const attributeBuffers: ArrayBuffer[] = [];\n\n const needFlattenPropertyTable = checkPropertiesLength(featureIds, propertyTable);\n const properties = needFlattenPropertyTable\n ? flattenPropertyTableByFeatureIds(featureIdsMap, propertyTable)\n : propertyTable;\n\n const propertyTableWithObjectIds = {\n OBJECTID: featureIds,\n ...properties\n };\n\n for (const propertyName in propertyTableWithObjectIds) {\n const type = getAttributeType(propertyName, attributeStorageInfo);\n if (type) {\n const value = propertyTableWithObjectIds[propertyName];\n const attributeBuffer = generateAttributeBuffer(type, value);\n\n attributeBuffers.push(attributeBuffer);\n }\n }\n\n return attributeBuffers;\n}\n\n/**\n * Generates attribute buffer based on attribute type\n * @param type\n * @param value\n */\nfunction generateAttributeBuffer(type: string, value: any): ArrayBuffer {\n let attributeBuffer: ArrayBuffer;\n\n switch (type) {\n case OBJECT_ID_TYPE:\n case SHORT_INT_TYPE:\n attributeBuffer = generateShortIntegerAttributeBuffer(value);\n break;\n case DOUBLE_TYPE:\n attributeBuffer = generateDoubleAttributeBuffer(value);\n break;\n case STRING_TYPE:\n attributeBuffer = generateStringAttributeBuffer(value);\n break;\n default:\n attributeBuffer = generateStringAttributeBuffer(value);\n }\n\n return attributeBuffer;\n}\n\n/**\n * Return attribute type.\n * @param key\n * @param attributeStorageInfo\n * @returns attribute type.\n */\nfunction getAttributeType(key: string, attributeStorageInfo: any[]): string {\n const attribute = attributeStorageInfo.find((attr) => attr.name === key);\n if (!attribute) {\n console.error(\n `attribute is null, key=${key}, attributeStorageInfo=${JSON.stringify(\n attributeStorageInfo,\n null,\n 2\n )}`\n );\n return '';\n }\n if (!attribute.attributeValues) {\n console.error(`attributeValues is null, attribute=${attribute}`);\n return '';\n }\n return attribute.attributeValues.valueType;\n}\n\n/**\n * Convert short integer to attribute arrayBuffer.\n * @param featureIds\n * @returns - Buffer with objectId data.\n */\nfunction generateShortIntegerAttributeBuffer(featureIds: any[]): ArrayBuffer {\n const count = new Uint32Array([featureIds.length]);\n const valuesArray = new Uint32Array(featureIds);\n return concatenateArrayBuffers(count.buffer, valuesArray.buffer);\n}\n\n/**\n * Convert double to attribute arrayBuffer.\n * @param featureIds\n * @returns - Buffer with objectId data.\n */\nfunction generateDoubleAttributeBuffer(featureIds: any[]): ArrayBuffer {\n const count = new Uint32Array([featureIds.length]);\n const padding = new Uint8Array(4);\n const valuesArray = new Float64Array(featureIds);\n\n return concatenateArrayBuffers(count.buffer, padding.buffer, valuesArray.buffer);\n}\n\n/**\n * Convert batch table attributes to array buffer with batch table data.\n * @param batchAttributes\n * @returns - Buffer with batch table data.\n */\nfunction generateStringAttributeBuffer(batchAttributes: any[]): ArrayBuffer {\n const stringCountArray = new Uint32Array([batchAttributes.length]);\n let totalNumberOfBytes = 0;\n const stringSizesArray = new Uint32Array(batchAttributes.length);\n const stringBufferArray: ArrayBuffer[] = [];\n\n for (let index = 0; index < batchAttributes.length; index++) {\n const currentString = `${String(batchAttributes[index])}\\0`;\n const currentStringBuffer = Buffer.from(currentString);\n const currentStringSize = currentStringBuffer.length;\n totalNumberOfBytes += currentStringSize;\n stringSizesArray[index] = currentStringSize;\n stringBufferArray.push(currentStringBuffer);\n }\n\n const totalBytes = new Uint32Array([totalNumberOfBytes]);\n\n return concatenateArrayBuffers(\n stringCountArray.buffer,\n totalBytes.buffer,\n stringSizesArray.buffer,\n ...stringBufferArray\n );\n}\n\n/**\n * Convert featureIds to BigUint64Array.\n * @param featureIds\n * @returns - Array of feature ids in BigUint64 format.\n */\nfunction generateBigUint64Array(featureIds: any[]): BigUint64Array {\n const typedFeatureIds = new BigUint64Array(featureIds.length);\n for (let index = 0; index < featureIds.length; index++) {\n typedFeatureIds[index] = BigInt(featureIds[index]);\n }\n return typedFeatureIds;\n}\n\n/**\n * Generates draco compressed geometry\n * @param vertexCount\n * @param convertedAttributes - get rid of this argument here\n * @param attributes - geometry attributes to compress\n * @param libraries - dynamicaly loaded 3rd-party libraries\n * @returns - Compressed geometry.\n */\nasync function generateCompressedGeometry(\n vertexCount: number,\n convertedAttributes: Record<string, any>,\n attributes: Record<string, any>,\n libraries: Record<string, string>\n): Promise<ArrayBuffer> {\n const {positions, normals, texCoords, colors, uvRegions, featureIds, faceRange} = attributes;\n const indices = new Uint32Array(vertexCount);\n\n for (let index = 0; index < indices.length; index++) {\n indices.set([index], index);\n }\n\n const featureIndices = new Uint32Array(\n convertedAttributes.featureIndices.length ? convertedAttributes.featureIndices : vertexCount\n );\n\n const featureIndex = generateFeatureIndexAttribute(featureIndices, faceRange);\n\n const compressedAttributes: {\n positions: TypedArray;\n normals: TypedArray;\n colors: TypedArray;\n 'feature-index': TypedArray;\n texCoords?: TypedArray;\n 'uv-region'?: TypedArray;\n } = {\n positions,\n normals,\n colors,\n 'feature-index': featureIndex\n };\n\n if (texCoords.length) {\n compressedAttributes.texCoords = texCoords;\n }\n\n const attributesMetadata = {\n 'feature-index': {\n 'i3s-attribute-type': 'feature-index',\n 'i3s-feature-ids': new Int32Array(featureIds)\n }\n };\n\n if (uvRegions.length) {\n compressedAttributes['uv-region'] = uvRegions;\n attributesMetadata['uv-region'] = {\n 'i3s-attribute-type': 'uv-region'\n };\n }\n\n return encode(\n {attributes: compressedAttributes, indices},\n // @ts-expect-error if encoded supports worker writer, we should update its type signature\n DracoWriterWorker,\n {\n ...DracoWriterWorker.options,\n reuseWorkers: true,\n _nodeWorkers: true,\n modules: libraries,\n useLocalLibraries: true,\n draco: {\n method: 'MESH_SEQUENTIAL_ENCODING',\n attributesMetadata\n },\n ['draco-writer']: {\n // We need to load local fs workers because nodejs can't load workers from the Internet\n workerUrl: './modules/draco/dist/draco-writer-worker-node.js'\n }\n }\n );\n}\n\n/**\n * Generates ordered feature indices based on face range\n * @param featureIndex\n * @param faceRange\n * @returns\n */\nfunction generateFeatureIndexAttribute(\n featureIndex: Uint32Array,\n faceRange: Uint32Array\n): Uint32Array {\n const orderedFeatureIndices = new Uint32Array(featureIndex.length);\n let fillIndex = 0;\n let startIndex = 0;\n\n for (let index = 1; index < faceRange.length; index += 2) {\n const endIndex = (faceRange[index] + 1) * VALUES_PER_VERTEX;\n\n orderedFeatureIndices.fill(fillIndex, startIndex, endIndex);\n\n fillIndex++;\n startIndex = endIndex + 1;\n }\n\n return orderedFeatureIndices;\n}\n\n/**\n * Find property table in tile\n * For example it can be batchTable for b3dm files or property table in gLTF extension.\n * @param tileContent - 3DTiles tile content\n * @param metadataClass - user selected feature metadata class name\n * @return batch table from b3dm / feature properties from EXT_FEATURE_METADATA or EXT_STRUCTURAL_METADATA.\n */\nexport function getPropertyTable(\n tileContent: Tiles3DTileContent | null,\n metadataClass?: string\n): FeatureTableJson | null {\n if (!tileContent) {\n return null;\n }\n let propertyTable: FeatureTableJson | null;\n const batchTableJson = tileContent.batchTableJson;\n\n if (batchTableJson) {\n return batchTableJson;\n }\n\n const {extensionName, extension} = getPropertyTableExtension(tileContent);\n\n switch (extensionName) {\n case EXT_STRUCTURAL_METADATA: {\n propertyTable = getPropertyTableFromExtStructuralMetadata(\n extension as GLTF_EXT_structural_metadata_GLTF,\n metadataClass\n );\n return propertyTable;\n }\n case EXT_FEATURE_METADATA: {\n propertyTable = getPropertyTableFromExtFeatureMetadata(\n extension as GLTF_EXT_feature_metadata_GLTF,\n metadataClass\n );\n return propertyTable;\n }\n default:\n return null;\n }\n}\n\n/**\n * Handles EXT_structural_metadata to get property table.\n * @param extension - Global level of EXT_STRUCTURAL_METADATA extension.\n * @param metadataClass - User selected feature metadata class name.\n * @returns {FeatureTableJson | null} Property table or null if the extension can't be handled properly.\n */\nfunction getPropertyTableFromExtStructuralMetadata(\n extension: GLTF_EXT_structural_metadata_GLTF,\n metadataClass?: string\n): FeatureTableJson | null {\n /**\n * Note, 3dTiles is able to have multiple featureId attributes and multiple feature tables.\n * In I3S we should decide which featureIds attribute will be passed to geometry data.\n * So, we take only the feature table / feature texture to generate attributes storage info object.\n * If the user has selected the metadataClass, the table with the corresponding class will be used,\n * or just the first one otherwise.\n */\n if (extension.propertyTables) {\n for (const propertyTable of extension.propertyTables) {\n if (propertyTable.class === metadataClass || !metadataClass) {\n return getPropertyData(propertyTable);\n }\n }\n }\n\n if (extension.propertyTextures) {\n for (const propertyTexture of extension.propertyTextures) {\n if (propertyTexture.class === metadataClass || !metadataClass) {\n return getPropertyData(propertyTexture);\n }\n }\n }\n\n return null;\n}\n\n/**\n * Handles EXT_feature_metadata to get property table.\n * @param extension - Global level of EXT_FEATURE_METADATA extension.\n * @param metadataClass - User selected feature metadata class name.\n * @returns {FeatureTableJson | null} Property table or null if the extension can't be handled properly.\n */\nfunction getPropertyTableFromExtFeatureMetadata(\n extension: GLTF_EXT_feature_metadata_GLTF,\n metadataClass?: string\n): FeatureTableJson | null {\n /**\n * Note, 3dTiles is able to have multiple featureId attributes and multiple feature tables.\n * In I3S we should decide which featureIds attribute will be passed to geometry data.\n * So, we take only the feature table / feature texture to generate attributes storage info object.\n * If the user has selected the metadataClass, the table with the corresponding class will be used,\n * or just the first one otherwise.\n */\n if (extension.featureTables) {\n for (const featureTableName in extension.featureTables) {\n const featureTable = extension.featureTables[featureTableName];\n if (featureTable.class === metadataClass || !metadataClass) {\n return getPropertyData(featureTable);\n }\n }\n }\n\n if (extension.featureTextures) {\n for (const featureTextureName in extension.featureTextures) {\n const featureTexture = extension.featureTextures[featureTextureName];\n if (featureTexture.class === metadataClass || !metadataClass) {\n return getPropertyData(featureTexture);\n }\n }\n }\n\n return null;\n}\n\n/**\n * Gets data from Property Table or Property Texture\n * @param featureObject - property table or texture from the extension\n * @returns Table containing property data\n */\nfunction getPropertyData<\n Type extends\n | GLTF_EXT_structural_metadata_PropertyTable\n | GLTF_EXT_structural_metadata_PropertyTexture\n | GLTF_EXT_feature_metadata_FeatureTable\n | GLTF_EXT_feature_metadata_FeatureTexture\n>(featureObject: Type) {\n const propertyTableWithData = {};\n for (const propertyName in featureObject.properties) {\n propertyTableWithData[propertyName] = featureObject.properties[propertyName].data;\n }\n return propertyTableWithData;\n}\n\n/**\n * Check extensions which can be with property table inside.\n * @param tileContent - 3DTiles tile content\n */\nfunction getPropertyTableExtension(tileContent: Tiles3DTileContent): {\n extensionName: null | string;\n extension: string | GLTF_EXT_feature_metadata_GLTF | GLTF_EXT_structural_metadata_GLTF | null;\n} {\n const extensionsWithPropertyTables = [EXT_FEATURE_METADATA, EXT_STRUCTURAL_METADATA];\n const extensionsUsed = tileContent?.gltf?.extensionsUsed;\n\n if (!extensionsUsed) {\n return {extensionName: null, extension: null};\n }\n\n let extensionName: string = '';\n for (const extensionItem of tileContent?.gltf?.extensionsUsed || []) {\n if (extensionsWithPropertyTables.includes(extensionItem)) {\n extensionName = extensionItem;\n /*\n It returns the first extension containing the property table.\n We assume that there can be only one extension containing the property table:\n either EXT_FEATURE_METADATA, which is a depricated extension,\n or EXT_STRUCTURAL_METADATA.\n */\n break;\n }\n }\n\n if (!extensionName) {\n return {extensionName: null, extension: null};\n }\n\n const extension = tileContent?.gltf?.extensions?.[extensionName] as\n | string // EXT_mesh_features doesn't have global metadata\n | GLTF_EXT_feature_metadata_GLTF\n | GLTF_EXT_structural_metadata_GLTF;\n\n return {extensionName, extension};\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gltf-attributes.js","names":["Matrix4","Vector3","Ellipsoid","prepareDataForAttributesConversion","tileContent","tileTransform","boundingVolume","_tileContent$gltf","_tileContent$gltf$sce","_tileContent$gltf2","_tileContent$gltf2$sc","_tileContent$gltf2$sc2","_tileContent$gltf3","_tileContent$gltf4","_tileContent$gltf4$im","nodes","gltf","scene","scenes","images","map","imageObject","_imageObject$image","image","compressed","_imageObject$image2","data","dataCopy","Uint8Array","length","set","height","width","components","mimeType","prepareNodes","cartographicOrigin","modelMatrix","cartesianModelMatrix","calculateTransformProps","getB3DMAttributesWithoutBufferView","attributes","attributesWithoutBufferView","attributeName","value","rtcCenter","gltfUpAxis","center","translate","rotationY","rotateX","Math","PI","multiplyRight","rotationX","rotateY","cartesianOrigin","WGS84","cartesianToCartographic","index","node","mesh","_node$mesh","primitives","primitive","_primitive$indices","_primitive$material","_primitive$material2","indices","material","id","uniqueId","children"],"sources":["../../../src/i3s-converter/helpers/gltf-attributes.ts"],"sourcesContent":["import type {Tiles3DTileContent} from '@loaders.gl/3d-tiles';\nimport type {GLTFAccessorPostprocessed, GLTFNodePostprocessed} from '@loaders.gl/gltf';\nimport {Matrix4, TypedArray, Vector3} from '@math.gl/core';\nimport {BoundingSphere, OrientedBoundingBox} from '@math.gl/culling';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {GLTFAttributesData} from '../types';\n\n/**\n * Prepare attributes for conversion to avoid binary data breaking in worker thread.\n * @param tileContent - 3DTiles tile content\n * @param tileTransform - transformation matrix of the tile, calculated recursively multiplying\n * transform of all parent tiles and transform of the current tile\n * @param boundingVolume - initialized bounding volume of the source tile\n * @returns 3DTiles content data, prepared for conversion\n */\nexport function prepareDataForAttributesConversion(\n tileContent: Tiles3DTileContent,\n tileTransform: Matrix4,\n boundingVolume: OrientedBoundingBox | BoundingSphere\n): GLTFAttributesData {\n let nodes =\n tileContent.gltf?.scene?.nodes ||\n tileContent.gltf?.scenes?.[0]?.nodes ||\n tileContent.gltf?.nodes ||\n [];\n\n const images =\n tileContent.gltf?.images?.map((imageObject) => {\n // Need data only for uncompressed images because we can't get batchIds from compressed textures.\n if (imageObject?.image?.compressed) {\n return null;\n } else {\n const data = imageObject?.image?.data;\n const dataCopy = new Uint8Array(data.length);\n dataCopy.set(data);\n return {\n data: dataCopy,\n compressed: false,\n height: imageObject.image.height,\n width: imageObject.image.width,\n components: imageObject.image.components,\n mimeType: imageObject.mimeType\n };\n }\n }) || [];\n\n prepareNodes(nodes);\n\n const {cartographicOrigin, modelMatrix: cartesianModelMatrix} = calculateTransformProps(\n tileContent,\n tileTransform,\n boundingVolume\n );\n\n return {\n nodes,\n images,\n cartographicOrigin,\n cartesianModelMatrix\n };\n}\n\n/**\n * Keep only values for glTF attributes to pass data to worker thread.\n * @param attributes - geometry attributes\n * @returns attributes with only `value` item\n */\nfunction getB3DMAttributesWithoutBufferView(\n attributes: Record<string, GLTFAccessorPostprocessed>\n): Record<string, {value: TypedArray}> {\n const attributesWithoutBufferView: Record<string, {value: TypedArray}> = {};\n\n for (const attributeName in attributes) {\n attributesWithoutBufferView[attributeName] = {\n value: attributes[attributeName].value\n };\n }\n\n return attributesWithoutBufferView;\n}\n\n/**\n * Calculate transformation properties to transform vertex attributes (POSITION, NORMAL, etc.)\n * from METER_OFFSET coorditantes to LNGLAT_OFFSET coordinates\n * @param tileContent - 3DTiles tile content\n * @param tileTransform - transformation matrix of the tile, calculated recursively multiplying\n * transform of all parent tiles and transform of the current tile\n * @param boundingVolume - initialized bounding volume of the source tile\n * @returns modelMatrix - transformation matrix to transform coordinates to cartographic coordinates\n * cartographicOrigin - tile origin coordinates to calculate offsets\n */\nexport function calculateTransformProps(\n tileContent: Tiles3DTileContent,\n tileTransform: Matrix4,\n boundingVolume: OrientedBoundingBox | BoundingSphere\n): {modelMatrix: Matrix4; cartographicOrigin: Vector3} {\n const {rtcCenter, gltfUpAxis} = tileContent;\n const {center} = boundingVolume;\n\n let modelMatrix = new Matrix4(tileTransform);\n\n // Translate if appropriate\n if (rtcCenter) {\n modelMatrix.translate(rtcCenter);\n }\n\n // glTF models need to be rotated from Y to Z up\n // https://github.com/AnalyticalGraphicsInc/3d-tiles/tree/master/specification#y-up-to-z-up\n switch (gltfUpAxis) {\n case 'Z':\n break;\n case 'Y':\n const rotationY = new Matrix4().rotateX(Math.PI / 2);\n modelMatrix = modelMatrix.multiplyRight(rotationY);\n break;\n case 'X':\n const rotationX = new Matrix4().rotateY(-Math.PI / 2);\n modelMatrix = modelMatrix.multiplyRight(rotationX);\n break;\n default:\n break;\n }\n\n const cartesianOrigin = new Vector3(center);\n const cartographicOrigin = Ellipsoid.WGS84.cartesianToCartographic(\n cartesianOrigin,\n new Vector3()\n );\n return {modelMatrix, cartographicOrigin};\n}\n\n/**\n * Traverse all nodes to replace all sensible data with copy to avoid data corruption in worker.\n * @param nodes\n */\nfunction prepareNodes(nodes: GLTFNodePostprocessed[]): void {\n for (let index = 0; index < nodes.length; index++) {\n const node = nodes[index] as any;\n\n if (node.mesh) {\n nodes[index] = {\n ...node,\n mesh: {\n ...node.mesh,\n primitives: node.mesh?.primitives.map((primitive) => ({\n ...primitive,\n indices: {value: primitive?.indices?.value},\n attributes: getB3DMAttributesWithoutBufferView(primitive.attributes),\n material: {\n id: primitive?.material?.id,\n uniqueId: primitive?.material?.uniqueId\n }\n }))\n }\n };\n }\n\n if (node.children) {\n prepareNodes(node.children);\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"load-3d-tiles.js","names":["Tiles3DArchive","load","FileHandleFile","CD_HEADER_SIGNATURE","ZipFileSystem","parseHashTable","parseZipCDFileHeader","parseZipLocalFileHeader","searchFromTheEnd","loadNestedTileset","sourceTileset","sourceTile","tilesetLoadOptions","isTileset","isNestedTileset","contentUrl","loadOptions","loader","id","assetGltfUpAxis","asset","gltfUpAxis","tileContent","loadFromArchive","root","children","loadTile3DContent","url","tz3UrlParts","split","filename","length","slice","Error","tz3Path","fileProvider","hashTable","loadHashTable","archive","fileSystem","content","fetch","bind","destroy","tile","type","hashCDOffset","cdFileHeader","fileName","localFileHeader","localHeaderOffset","fileDataOffset","hashFile","compressedSize"],"sources":["../../../src/i3s-converter/helpers/load-3d-tiles.ts"],"sourcesContent":["import type {\n Tiles3DLoaderOptions,\n Tiles3DTileContent,\n Tiles3DTileJSONPostprocessed,\n Tiles3DTilesetJSONPostprocessed\n} from '@loaders.gl/3d-tiles';\nimport {Tiles3DArchive} from '@loaders.gl/3d-tiles';\nimport {LoaderWithParser, load} from '@loaders.gl/core';\nimport {FileHandleFile, FileProvider} from '@loaders.gl/loader-utils';\nimport {\n CD_HEADER_SIGNATURE,\n ZipFileSystem,\n parseHashTable,\n parseZipCDFileHeader,\n parseZipLocalFileHeader,\n searchFromTheEnd\n} from '@loaders.gl/zip';\n\n/**\n * Load nested 3DTiles tileset. If the sourceTile is not nested tileset - do nothing\n * @param sourceTileset - source root tileset JSON\n * @param sourceTile - source tile JSON that is supposed to has link to nested tileset\n * @param tilesetLoadOptions - load options for Tiles3DLoader\n * @returns nothing\n */\nexport const loadNestedTileset = async (\n sourceTileset: Tiles3DTilesetJSONPostprocessed | null,\n sourceTile: Tiles3DTileJSONPostprocessed,\n tilesetLoadOptions: Tiles3DLoaderOptions\n): Promise<void> => {\n const isTileset = isNestedTileset(sourceTile);\n if (!sourceTileset || !sourceTile.contentUrl || !isTileset) {\n return;\n }\n\n const loadOptions = {\n ...tilesetLoadOptions,\n [sourceTileset.loader.id]: {\n isTileset,\n assetGltfUpAxis: (sourceTileset.asset && sourceTileset.asset.gltfUpAxis) || 'Y'\n }\n };\n const tileContent = await loadFromArchive(\n sourceTile.contentUrl,\n sourceTileset.loader,\n loadOptions\n );\n\n if (tileContent.root) {\n sourceTile.children = [tileContent.root];\n }\n};\n\n/**\n * Load 3DTiles tile content, that includes glTF object\n * @param sourceTileset - source root tileset JSON\n * @param sourceTile - source tile JSON that has link to content data\n * @param tilesetLoadOptions - load options for Tiles3DLoader\n * @returns - 3DTiles tile content or null\n */\nexport const loadTile3DContent = async (\n sourceTileset: Tiles3DTilesetJSONPostprocessed | null,\n sourceTile: Tiles3DTileJSONPostprocessed,\n tilesetLoadOptions: Tiles3DLoaderOptions\n): Promise<Tiles3DTileContent | null> => {\n const isTileset = isNestedTileset(sourceTile);\n if (!sourceTileset || !sourceTile.contentUrl || isTileset) {\n return null;\n }\n\n const loadOptions = {\n ...tilesetLoadOptions,\n [sourceTileset.loader.id]: {\n // @ts-ignore\n ...(tilesetLoadOptions[sourceTileset.loader.id] || {}),\n isTileset,\n assetGltfUpAxis: (sourceTileset.asset && sourceTileset.asset.gltfUpAxis) || 'Y'\n }\n };\n const tileContent = await loadFromArchive(\n sourceTile.contentUrl,\n sourceTileset.loader,\n loadOptions\n );\n\n return tileContent;\n};\n\n/**\n * Load a resource with load options and .3tz format support\n * @param url - resource URL\n * @param loader - loader to parse data (Tiles3DLoader / CesiumIonLoader)\n * @param loadOptions - 3d-tiles loader options\n * @returns 3d-tiles resource\n */\nexport async function loadFromArchive(\n url: string,\n loader: LoaderWithParser,\n loadOptions: Tiles3DLoaderOptions\n) {\n const tz3UrlParts = url.split('.3tz');\n let filename: string | null;\n // No '.3tz'. The file will be loaded with global fetch function\n if (tz3UrlParts.length === 1) {\n filename = null;\n } else if (tz3UrlParts.length === 2) {\n filename = tz3UrlParts[1].slice(1);\n if (filename === '') {\n filename = 'tileset.json';\n }\n } else {\n throw new Error('Unexpected URL format');\n }\n if (filename) {\n const tz3Path = `${tz3UrlParts[0]}.3tz`;\n const fileProvider = new FileHandleFile(tz3Path);\n const hashTable = await loadHashTable(fileProvider);\n const archive = new Tiles3DArchive(fileProvider, hashTable, tz3Path);\n const fileSystem = new ZipFileSystem(archive);\n const content = await load(filename, loader, {\n ...loadOptions,\n fetch: fileSystem.fetch.bind(fileSystem)\n });\n await fileSystem.destroy();\n return content;\n }\n return await load(url, loader, loadOptions);\n}\n\n/**\n * Check if tile is nested tileset\n * @param tile - 3DTiles header data\n * @returns true if tile is nested tileset\n */\nexport function isNestedTileset(tile: Tiles3DTileJSONPostprocessed) {\n return tile?.type === 'json' || tile?.type === '3tz';\n}\n\n/**\n * Load hash file from 3TZ\n * @param fileProvider - binary reader of 3TZ\n * @returns hash table of the 3TZ file content or undefined if the hash file is not presented inside\n */\nasync function loadHashTable(\n fileProvider: FileProvider\n): Promise<undefined | Record<string, bigint>> {\n let hashTable: undefined | Record<string, bigint>;\n\n const hashCDOffset = await searchFromTheEnd(fileProvider, CD_HEADER_SIGNATURE);\n\n const cdFileHeader = await parseZipCDFileHeader(hashCDOffset, fileProvider);\n\n // '@3dtilesIndex1@' is index file that must be the last in the archive. It allows\n // to improve load and read performance when the archive contains a very large number\n // of files.\n if (cdFileHeader?.fileName === '@3dtilesIndex1@') {\n const localFileHeader = await parseZipLocalFileHeader(\n cdFileHeader.localHeaderOffset,\n fileProvider\n );\n if (!localFileHeader) {\n throw new Error('corrupted 3tz');\n }\n\n const fileDataOffset = localFileHeader.fileDataOffset;\n const hashFile = await fileProvider.slice(\n fileDataOffset,\n fileDataOffset + localFileHeader.compressedSize\n );\n\n hashTable = parseHashTable(hashFile);\n }\n\n return hashTable;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node-debug.js","names":["OrientedBoundingBox","BoundingSphere","Vector3","Ellipsoid","CUBE_POSITIONS","Float32Array","validateNodeBoundingVolumes","node","_node$parentNode","_node$parentNode2","parentNode","obb","mbs","tileWarnings","validateObb","validateMbs","_node$parentNode3","parentObb","createBoundingBoxFromTileObb","tileVertices","getTileObbVertices","isTileObbInsideParentObb","isAllVerticesInsideBoundingVolume","title","id","push","tileMbs","createBoundingSphereFromTileMbs","parentMbs","distanceBetweenCenters","center","distanceTo","radius","_node$parentNode4","halfSize","quaternion","fromCenterHalfSizeQuaternion","positions","obbCenterCartesian","WGS84","cartographicToCartesian","vertices","i","length","positionsVector","rotatedPositions","transformByQuaternion","add","concat","boundingVolume","isVerticesInsideObb","index","point","cartographicPoint","cartesianToCartographic","distance"],"sources":["../../../src/i3s-converter/helpers/node-debug.ts"],"sourcesContent":["import type {Mbs, Node3DIndexDocument, Obb} from '@loaders.gl/i3s';\nimport {OrientedBoundingBox, BoundingSphere} from '@math.gl/culling';\nimport {Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\n\n// prettier-ignore\nconst CUBE_POSITIONS = new Float32Array([\n -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1,\n -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1,\n -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1,\n -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1,\n 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1,\n -1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1\n]);\n\n// TODO Unite Tile validation logic in i3s-17-and-debug with this code.\n\n/**\n * Do validation of bounding volumes for particular node.\n * Generates special warnings if there are some issues.\n * @param node\n */\nexport function validateNodeBoundingVolumes(node: Node3DIndexDocument): string[] {\n if (!node?.parentNode?.obb || !node?.parentNode?.mbs) {\n return [];\n }\n\n const tileWarnings: string[] = [];\n\n validateObb(tileWarnings, node);\n validateMbs(tileWarnings, node);\n\n return tileWarnings;\n}\n\n/**\n * Check if child Obb fit into parent Obb.\n * @param tileWarnings\n * @param node\n */\nfunction validateObb(tileWarnings: string[], node: Node3DIndexDocument): void {\n // @ts-expect-error\n const parentObb = createBoundingBoxFromTileObb(node.parentNode.obb);\n const tileVertices = getTileObbVertices(node);\n const isTileObbInsideParentObb = isAllVerticesInsideBoundingVolume(parentObb, tileVertices);\n\n if (isTileObbInsideParentObb) {\n return;\n }\n\n const title = `OBB of Tile (${node.id}) doesn't fit into Parent (${node.parentNode?.id}) tile OBB`;\n tileWarnings.push(title);\n}\n\n/**\n * Check if child Mbs fit into parent Mbs.\n * @param tileWarnings\n * @param node\n */\nfunction validateMbs(tileWarnings: string[], node: Node3DIndexDocument): void {\n // @ts-expect-error\n const tileMbs = createBoundingSphereFromTileMbs(node.mbs);\n // @ts-expect-error\n const parentMbs = createBoundingSphereFromTileMbs(node.parentNode.mbs);\n const distanceBetweenCenters = tileMbs.center.distanceTo(parentMbs.center);\n\n if (distanceBetweenCenters + tileMbs.radius > parentMbs.radius) {\n const title = `MBS of Tile (${node.id}) doesn't fit into Parent (${node.parentNode?.id}) tile MBS`;\n tileWarnings.push(title);\n }\n}\n\n/**\n * Generates bounding sphere from mbs\n * @param mbs\n */\nfunction createBoundingSphereFromTileMbs(mbs: Mbs): BoundingSphere {\n return new BoundingSphere([mbs[0], mbs[1], mbs[2]], mbs[3]);\n}\n\n/**\n * Generates oriented bounding box from tile obb\n * @param obb\n * @returns\n */\nfunction createBoundingBoxFromTileObb(obb: Obb): OrientedBoundingBox {\n const {center, halfSize, quaternion} = obb;\n return new OrientedBoundingBox().fromCenterHalfSizeQuaternion(center, halfSize, quaternion);\n}\n\n/**\n * Get vertices fromnode obb\n * TODO check if Obb generates properly\n * @param node\n */\nfunction getTileObbVertices(node: Node3DIndexDocument): number[] {\n // @ts-expect-error\n const halfSize = node.obb.halfSize;\n const positions = CUBE_POSITIONS;\n // @ts-expect-error\n const obbCenterCartesian = Ellipsoid.WGS84.cartographicToCartesian(node.obb.center);\n\n let vertices = [];\n\n for (let i = 0; i < positions.length; i += 3) {\n const positionsVector = new Vector3(\n (positions[i] *= halfSize[0]),\n (positions[i + 1] *= halfSize[1]),\n (positions[i + 2] *= halfSize[2])\n );\n const rotatedPositions = positionsVector\n // @ts-expect-error\n .transformByQuaternion(node.obb.quaternion)\n .add(obbCenterCartesian);\n // @ts-expect-error\n vertices = vertices.concat(rotatedPositions);\n }\n\n return vertices;\n}\n\n/**\n * Check if all vertices inside bounding volume\n * @param boundingVolume\n * @param positions\n */\nfunction isAllVerticesInsideBoundingVolume(\n boundingVolume: OrientedBoundingBox,\n positions: number[]\n): boolean {\n let isVerticesInsideObb = true;\n\n for (let index = 0; index < positions.length / 3; index += 3) {\n const point = [positions[index], positions[index + 1], positions[index + 2]];\n const cartographicPoint = Ellipsoid.WGS84.cartesianToCartographic(point);\n\n const distance = boundingVolume.distanceTo(cartographicPoint);\n\n if (distance > 0) {\n isVerticesInsideObb = false;\n break;\n }\n }\n\n return isVerticesInsideObb;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node-index-document.js","names":["join","transform","v4","uuidv4","openJson","writeFile","writeFileForSlpk","NODE","nodeTemplate","NodeIndexDocument","finalized","_finalized","constructor","id","converter","inPageId","data","children","toString","addData","options","instantNodeWriting","write","addChildren","childNodes","newChildren","node","nodeData","load","push","href","obb","mbs","concat","_data$children","addNeighbors","childNode","_childNodeData$neighb","_nodeData$children","childNodeData","neighbors","Number","length","neighbor","console","warn","save","finalize","child","flush","path","layers0Path","slpk","writeQueue","enqueue","archiveKey","writePromise","JSON","stringify","compressList","parentNodePath","parentNodeFileName","createRootNode","boundingVolumes","rootData","createRootNodeIndexDocument","rootNode","createNode","parentNode","lodSelection","nodeInPage","resources","createNodeIndexDocument","index","root0data","version","toUpperCase","level","metricType","maxError","nodeId","parentNodeData","mesh","_parentNode$converter","_parentNode$converter2","_parentNode$converter3","_parentNode$converter4","geometryData","sharedResource","texture","texelCountHint","textureData","attributes","layers0","attributeStorageInfo","attributesCount","_resources$attributes","attributesLength","attributeData","minimumLength","folderName","key"],"sources":["../../../src/i3s-converter/helpers/node-index-document.ts"],"sourcesContent":["import {join} from 'path';\nimport {\n BoundingVolumes,\n LodSelection,\n Node3DIndexDocument,\n NodeInPage,\n NodeReference\n} from '@loaders.gl/i3s';\nimport transform from 'json-map-transform';\nimport {v4 as uuidv4} from 'uuid';\nimport {openJson, writeFile, writeFileForSlpk} from '../../lib/utils/file-utils';\nimport I3SConverter from '../i3s-converter';\nimport {NODE as nodeTemplate} from '../json-templates/node';\nimport {I3SConvertedResources} from '../types';\nimport {DumpMetadata} from '../../lib/utils/conversion-dump';\n\n/**\n * Wrapper for https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md data\n * The class allows working with 3DNodeIndexDocument in 2 modes:\n * in memory: the data is stored in `data` field\n * on disk: the data is written on disk in a file. The file can be rewritten when new childrend or neighbors have to be added\n */\nexport class NodeIndexDocument {\n /** Node id */\n public id: string;\n /** Id in node pages */\n public inPageId: number;\n /** 3DNodeIndexDocument data */\n public data: Node3DIndexDocument | null = null;\n /** children */\n public children: NodeIndexDocument[] = [];\n /** converter instance */\n private converter: I3SConverter;\n\n /**\n * Finalized property. It means that all child nodes are saved and their data\n * is unloaded\n */\n private _finalized: boolean = false;\n get finalized(): boolean {\n return this._finalized;\n }\n\n /**\n * Constructor\n * @param id - id of the node in node pages\n * @param converter - converter instance\n */\n constructor(id: number, converter: I3SConverter) {\n this.inPageId = id;\n this.id = id === 0 ? 'root' : id.toString();\n this.converter = converter;\n }\n\n /**\n * Add Node3DIndexDocument data to the node\n * @param data Node3DIndexDocument data\n * @returns this NodeIndexDocument instance (to recurring with constructor)\n */\n public async addData(data: Node3DIndexDocument): Promise<NodeIndexDocument> {\n if (this.converter.options.instantNodeWriting) {\n await this.write(data);\n } else {\n this.data = data;\n }\n return this;\n }\n\n /**\n * Add child node references\n * @param childNodes - child NodeIndexDocument instances\n */\n public async addChildren(childNodes: NodeIndexDocument[]): Promise<void> {\n const newChildren: NodeReference[] = [];\n for (const node of childNodes) {\n const nodeData = await node.load();\n newChildren.push({\n id: node.id,\n href: `../${node.id}`,\n obb: nodeData.obb,\n mbs: nodeData.mbs\n });\n }\n this.children = this.children.concat(childNodes);\n\n let data: Node3DIndexDocument | null = this.data;\n if (this.converter.options.instantNodeWriting) {\n data = (await this.load()) as Node3DIndexDocument;\n }\n if (data) {\n data.children = data.children ?? [];\n data.children = data.children.concat(newChildren);\n }\n if (this.converter.options.instantNodeWriting && data) {\n await this.write(data);\n }\n }\n\n /**\n * Add neighbors to child nodes of this node\n */\n public async addNeighbors(): Promise<void> {\n if (this.finalized) {\n return;\n }\n const nodeData = await this.load();\n for (const childNode of this.children) {\n const childNodeData = await childNode.load();\n childNodeData.neighbors = childNodeData.neighbors ?? [];\n\n // Don't do large amount of \"neightbors\" to avoid big memory consumption\n if (Number(nodeData?.children?.length) < 1000) {\n for (const neighbor of nodeData.children || []) {\n if (childNode.id === neighbor.id) {\n continue; // eslint-disable-line\n }\n\n childNodeData.neighbors.push({...neighbor});\n }\n } else {\n // eslint-disable-next-line no-console, no-undef\n console.warn(\n `Node ${childNode.id}: neighbors attribute is omited because of large number of neigbors`\n );\n delete childNodeData.neighbors;\n }\n\n if (this.converter.options.instantNodeWriting && childNodeData) {\n await childNode.write(childNodeData);\n }\n await childNode.save();\n }\n // The save after adding neighbors is the last one. Finalize the the node\n this.finalize();\n }\n\n /** Save 3DNodeIndexDocument in file on disk */\n public async save(): Promise<void> {\n if (this.data) {\n await this.write(this.data);\n }\n }\n\n /** Finalize the node */\n private finalize(): void {\n this._finalized = true;\n for (const child of this.children) {\n child.flush();\n }\n }\n\n /**\n * Write 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md\n * @param node - Node3DIndexDocument object\n */\n private async write(node: Node3DIndexDocument): Promise<void> {\n const path = join(this.converter.layers0Path, 'nodes', this.id);\n if (this.converter.options.slpk) {\n await this.converter.writeQueue.enqueue(\n {\n archiveKey: `nodes/${this.id}/3dNodeIndexDocument.json.gz`,\n writePromise: () =>\n writeFileForSlpk(\n path,\n JSON.stringify(node),\n '3dNodeIndexDocument.json',\n true,\n this.converter.compressList\n )\n },\n true\n );\n } else {\n await this.converter.writeQueue.enqueue(\n {writePromise: () => writeFile(path, JSON.stringify(node))},\n true\n );\n }\n }\n\n /**\n * Load 3DNodeIndexDocument data from file on disk\n * @returns 3DNodeIndexDocument object\n */\n private async load(): Promise<Node3DIndexDocument> {\n if (this.data) {\n return this.data;\n }\n const path = this.id;\n const parentNodePath = join(this.converter.layers0Path, 'nodes', path);\n let parentNodeFileName = 'index.json';\n if (this.converter.options.slpk) {\n parentNodeFileName = '3dNodeIndexDocument.json';\n }\n return (await openJson(parentNodePath, parentNodeFileName)) as Node3DIndexDocument;\n }\n\n /**\n * Unload the Node data\n */\n private flush(): void {\n this.data = null;\n }\n\n /**\n * Create root node of the tree\n * @param boundingVolumes - MBS and OOB bounding volumes data\n * @param converter - I3SConverter instance\n * @returns instance of NodeIndexDocument\n */\n static async createRootNode(\n boundingVolumes: BoundingVolumes,\n converter: I3SConverter\n ): Promise<NodeIndexDocument> {\n const rootData = NodeIndexDocument.createRootNodeIndexDocument(boundingVolumes);\n const rootNode = await new NodeIndexDocument(0, converter).addData(rootData);\n return rootNode;\n }\n\n /**\n * Create NodeIndexDocument instance\n * @param parentNode - parent NodeIndexDocument\n * @param boundingVolumes - MBS and OOB bounding volumes data\n * @param lodSelection - LOD metrics data\n * @param nodeInPage - node data in node pages\n * @param resources - resources extracted from gltf/b3dm file\n * @param converter - I3SConverter instance\n * @returns NodeIndexDocument instance\n */\n static async createNode(\n parentNode: NodeIndexDocument,\n boundingVolumes: BoundingVolumes,\n lodSelection: LodSelection[],\n nodeInPage: NodeInPage,\n resources: I3SConvertedResources,\n converter: I3SConverter\n ): Promise<NodeIndexDocument> {\n const data = await NodeIndexDocument.createNodeIndexDocument(\n parentNode,\n boundingVolumes,\n lodSelection,\n nodeInPage,\n resources\n );\n const node = await new NodeIndexDocument(nodeInPage.index, converter).addData(data);\n return node;\n }\n\n /**\n * Form 3DNodeIndexDocument data for the root node\n * @param boundingVolumes - mbs and obb data about node's bounding volume\n * @return 3DNodeIndexDocument data https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md\n */\n static createRootNodeIndexDocument(boundingVolumes: BoundingVolumes): Node3DIndexDocument {\n const root0data = {\n version: `{${uuidv4().toUpperCase()}}`,\n id: 'root',\n level: 0,\n lodSelection: [\n {\n metricType: 'maxScreenThresholdSQ',\n maxError: 0\n },\n {\n metricType: 'maxScreenThreshold',\n maxError: 0\n }\n ],\n ...boundingVolumes,\n children: []\n };\n return transform(root0data, nodeTemplate());\n }\n\n /**\n * Create a new Node3DIndexDocument\n * @param parentNode - 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md object of the parent node\n * @param boundingVolumes - Bounding volumes\n * @param lodSelection - Level of Details (LOD) metrics\n * @param nodeInPage - corresponding node object in a node page\n * @param resources - the node resources data\n * @param resources.texture - texture image\n * @param resources.attributes - feature attributes\n * @return 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md object\n */\n static async createNodeIndexDocument(\n parentNode: NodeIndexDocument,\n boundingVolumes: BoundingVolumes,\n lodSelection: LodSelection[],\n nodeInPage: NodeInPage,\n resources: I3SConvertedResources | DumpMetadata\n ): Promise<Node3DIndexDocument> {\n const nodeId = nodeInPage.index!;\n const parentNodeData = await parentNode.load();\n const nodeData = {\n version: parentNodeData.version,\n id: nodeId.toString(),\n level: parentNodeData.level! + 1,\n ...boundingVolumes,\n lodSelection,\n parentNode: {\n id: parentNode.id,\n href: `../${parentNode.id}`,\n mbs: parentNodeData.mbs,\n obb: parentNodeData.obb\n },\n children: [],\n neighbors: []\n };\n const node = transform(nodeData, nodeTemplate());\n\n if (nodeInPage.mesh) {\n node.geometryData = [{href: './geometries/0'}];\n node.sharedResource = {href: './shared'};\n\n if (\n ('texture' in resources && resources.texture) ||\n ('texelCountHint' in resources && resources.texelCountHint)\n ) {\n node.textureData = [{href: './textures/0'}, {href: './textures/1'}];\n }\n\n if (\n ('attributes' in resources &&\n resources.attributes &&\n resources.attributes.length &&\n parentNode.converter.layers0?.attributeStorageInfo?.length) ||\n ('attributesCount' in resources &&\n resources.attributesCount &&\n parentNode.converter.layers0?.attributeStorageInfo?.length)\n ) {\n const attributesLength =\n ('attributes' in resources ? resources.attributes?.length : resources.attributesCount) ||\n 0;\n node.attributeData = [];\n const minimumLength =\n attributesLength < parentNode.converter.layers0.attributeStorageInfo.length\n ? attributesLength\n : parentNode.converter.layers0.attributeStorageInfo.length;\n for (let index = 0; index < minimumLength; index++) {\n const folderName = parentNode.converter.layers0.attributeStorageInfo[index].key;\n node.attributeData.push({href: `./attributes/${folderName}/0`});\n }\n }\n }\n\n return node;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node-pages.js","names":["join","transform","METADATA","metadataTemplate","isFileExists","openJson","NodePages","constructor","writeFileFunc","nodesPerPage","converter","nodesCounter","writeFile","nodePages","length","nodes","useWriteFunction","func","getNodePageFileName","nodePageId","filePath","fileName","options","slpk","layers0Path","toString","loadNodePage","fullName","console","log","getPageIndexByNodeId","id","Math","floor","getPageByNodeId","pageIndex","instantNodeWriting","getNodeById","nodePage","nodeIndex","addChildRelation","parentId","childId","_parentNode$children","undefined","parentNode","children","push","saveNode","node","index","currentNodePage","updateResourceInMesh","nodePageIndex","nodeToUpdate","updateAll","nodePageStr","JSON","stringify","writeQueue","enqueue","archiveKey","writePromise","compressList","saveMetadata","metadata","nodeCount","compress","save","entries","slpkPath","nodePagePath","mesh","isFinite","geometry","resource","data","Object","assign","updateMaterialByNodeId","materialId","material","definition","updateVertexCountByNodeId","vertexCount","updateNodeAttributeByNodeId","attribute","updateFeatureCountByNodeId","featureCount","updateTexelCountHintByNodeId","texelCountHint"],"sources":["../../../src/i3s-converter/helpers/node-pages.ts"],"sourcesContent":["import {join} from 'path';\nimport transform from 'json-map-transform';\nimport {METADATA as metadataTemplate} from '../json-templates/metadata';\nimport {NodeInPage} from '@loaders.gl/i3s';\nimport {isFileExists, openJson} from '../../lib/utils/file-utils';\nimport I3SConverter from '../i3s-converter';\n\n/**\n * class NodePages - wrapper of nodePages array\n *\n * @example\n * import {writeFile} from './helpers/write-file';\n *\n * // create an instance of the class\n * const nodePages = new NodePages(writeFile, HARDCODED_NODES_PER_PAGE);\n * ...\n * // push root node\n * const parent = await nodePages.push({\n lodThreshold: HARDCODED_MAX_SCREEN_THRESHOLD_SQ,\n obb: coordinates.obb,\n children: []\n });\n * ...\n * // push node with parent relation\n * const nodeInPage = {\n lodThreshold: HARDCODED_MAX_SCREEN_THRESHOLD_SQ,\n obb: coordinates.obb,\n children: [],\n mesh: {\n geometry: {\n definition: 0\n }\n }\n };\n * const node = await this.nodePages.push(nodeInPage, parent.index);\n * ...\n * // save all the nodePages in the end of pushing all the nodes\n * await this.nodePages.save(layers0path);\n */\nexport default class NodePages {\n readonly nodesPerPage: number;\n nodesCounter: number;\n writeFile: (...args) => Promise<null | string>;\n converter: I3SConverter;\n readonly nodePages: {nodes: NodeInPage[]}[];\n readonly length: number = 0;\n\n /**\n * @constructs\n * Create a nodePages instance.\n * @param writeFileFunc - function to save one nodePage into a file\n * @param nodesPerPage - length limit for one nodePage. An additional nodePage is created when this limit is met\n */\n constructor(writeFileFunc, nodesPerPage, converter: I3SConverter) {\n this.nodesPerPage = nodesPerPage;\n this.nodesCounter = 0;\n // @ts-expect-error\n this.nodePages = [{}];\n this.nodePages[0].nodes = [];\n this.writeFile = writeFileFunc;\n this.converter = converter;\n this.length = 0;\n }\n\n /**\n * Setup function to save node pages\n * @param func - function which should be used to save node pages\n */\n useWriteFunction(func: (...args) => Promise<null | string>): void {\n this.writeFile = func;\n }\n\n /**\n * Get file path and file name of the node page with the particular id\n * @param nodePageId - node page id\n * @returns file path and file name\n */\n private getNodePageFileName(nodePageId): {filePath: string; fileName: string} {\n let filePath;\n let fileName;\n if (this.converter.options.slpk) {\n filePath = join(this.converter.layers0Path, 'nodepages');\n fileName = `${nodePageId.toString()}.json`;\n } else {\n filePath = join(this.converter.layers0Path, 'nodepages', nodePageId.toString());\n fileName = 'index.json';\n }\n return {filePath, fileName};\n }\n\n /**\n * Load node page from a file on the disk\n * @param nodePageId - node page id\n * @returns - node page data\n */\n private async loadNodePage(nodePageId: number): Promise<{nodes: NodeInPage[]}> {\n const {filePath, fileName} = this.getNodePageFileName(nodePageId);\n const fullName = join(filePath, fileName);\n if (await isFileExists(fullName)) {\n console.log(`load ${fullName}.`); // eslint-disable-line\n return (await openJson(filePath, fileName)) as {nodes: NodeInPage[]};\n } else {\n return {nodes: []};\n }\n }\n\n /**\n * Get nodepage id by node id\n * @param id node id\n * @returns node page id\n */\n private getPageIndexByNodeId(id: number): number {\n return Math.floor(id / this.nodesPerPage);\n }\n\n /**\n * Get node page data by node id\n * @param id node id\n * @returns node page data\n */\n private async getPageByNodeId(id: number): Promise<{nodes: NodeInPage[]}> {\n const pageIndex = this.getPageIndexByNodeId(id);\n if (this.converter.options.instantNodeWriting) {\n return await this.loadNodePage(pageIndex);\n }\n return this.nodePages[pageIndex];\n }\n\n /**\n * Get the node by its end-to-end index\n * @param id - end-to-end index of the node\n * @return the node object\n */\n async getNodeById(id: number, nodePage?: {nodes: NodeInPage[]}): Promise<NodeInPage> {\n const nodeIndex = id % this.nodesPerPage;\n nodePage = nodePage || (await this.getPageByNodeId(id));\n return nodePage.nodes[nodeIndex];\n }\n\n /**\n * Add a child id into the parent node.children array\n * @param parentId - end-to-end parent node index\n * @param childId - end-to-end child node index\n */\n private async addChildRelation(parentId: number | undefined, childId: number): Promise<void> {\n if (parentId === null || parentId === undefined) {\n return;\n }\n const parentNode = await this.getNodeById(parentId);\n parentNode.children?.push(childId);\n await this.saveNode(parentNode);\n }\n\n /**\n * Put new node in nodePages array\n * @param node - node object\n * @param parentId - index of parent node\n * @return\n */\n async push(node: NodeInPage, parentId?: number): Promise<NodeInPage> {\n node.index = this.nodesCounter++;\n if (!this.converter.options.instantNodeWriting) {\n let currentNodePage = this.nodePages[this.nodePages.length - 1];\n if (currentNodePage.nodes.length === this.nodesPerPage) {\n currentNodePage = {nodes: []};\n this.nodePages.push(currentNodePage);\n }\n currentNodePage.nodes.push(node);\n }\n await this.addChildRelation(parentId, node.index);\n NodePages.updateResourceInMesh(node);\n await this.saveNode(node);\n return node;\n }\n\n /**\n * Save node to the file on the disk\n * @param node - node data\n */\n async saveNode(node: NodeInPage): Promise<void> {\n if (!this.converter.options.instantNodeWriting) {\n return;\n } else {\n const nodePageIndex = this.getPageIndexByNodeId(node.index);\n const nodePage = await this.getPageByNodeId(node.index);\n const {filePath, fileName} = this.getNodePageFileName(nodePageIndex);\n const nodeToUpdate = await this.getNodeById(node.index, nodePage);\n if (nodeToUpdate) {\n NodePages.updateAll(nodeToUpdate, node);\n } else {\n nodePage.nodes.push(node);\n }\n const nodePageStr = JSON.stringify(nodePage);\n if (this.converter.options.slpk) {\n await this.converter.writeQueue.enqueue(\n {\n archiveKey: `nodePages/${nodePageIndex.toString()}.json.gz`,\n writePromise: () =>\n this.writeFile(filePath, nodePageStr, fileName, true, this.converter.compressList)\n },\n true\n );\n } else {\n await this.converter.writeQueue.enqueue(\n {\n writePromise: () => this.writeFile(filePath, nodePageStr)\n },\n true\n );\n }\n }\n }\n\n /**\n * Save metadata file (for slpk only)\n */\n async saveMetadata(): Promise<void> {\n const metadata = transform({nodeCount: this.nodesCounter}, metadataTemplate());\n const compress = false;\n await this.converter.writeQueue.enqueue({\n archiveKey: 'metadata.json',\n writePromise: () =>\n this.writeFile(\n this.converter.layers0Path,\n JSON.stringify(metadata),\n 'metadata.json',\n compress\n )\n });\n }\n\n /**\n * Save all the node pages\n * Run this method when all nodes is pushed in nodePages\n */\n async save(): Promise<void> {\n if (this.converter.options.instantNodeWriting) {\n await this.saveMetadata();\n return;\n }\n if (this.converter.options.slpk) {\n for (const [index, nodePage] of this.nodePages.entries()) {\n const nodePageStr = JSON.stringify(nodePage);\n const slpkPath = join(this.converter.layers0Path, 'nodepages');\n await this.converter.writeQueue.enqueue({\n archiveKey: `nodePages/${index.toString()}.json.gz`,\n writePromise: () => this.writeFile(slpkPath, nodePageStr, `${index.toString()}.json`)\n });\n }\n await this.saveMetadata();\n } else {\n for (const [index, nodePage] of this.nodePages.entries()) {\n const nodePageStr = JSON.stringify(nodePage);\n const nodePagePath = join(this.converter.layers0Path, 'nodepages', index.toString());\n await this.converter.writeQueue.enqueue({\n writePromise: () => this.writeFile(nodePagePath, nodePageStr)\n });\n }\n }\n }\n\n /**\n * Update resource index in node.mesh object\n * @param node - node object\n */\n static updateResourceInMesh(node: NodeInPage): void {\n if (node.mesh && isFinite(node.index)) {\n node.mesh.geometry.resource = node.index;\n }\n }\n\n /**\n * Update all fields in the node excluding id\n * @param node - node object\n * @param data - NodeInPage data to replace original data\n */\n static updateAll(node: NodeInPage, data: NodeInPage): NodeInPage {\n Object.assign(node, data, {index: node.index});\n NodePages.updateResourceInMesh(node);\n return node;\n }\n\n /**\n * Update material in node.mesh object by node id\n * @param id - end-to-end index of the node\n * @param materialId - id from scene layer materialDefinitions\n */\n static updateMaterialByNodeId(node: NodeInPage, materialId: number): void {\n if (!node.mesh) {\n return;\n }\n node.mesh.material = {\n definition: materialId,\n resource: node.index\n };\n }\n\n /**\n * Update vertexCount in node.mesh.geometry object by node id\n * @param id - end-to-end index of the node\n * @param vertexCount - vertex count for particular node\n */\n static updateVertexCountByNodeId(node: NodeInPage, vertexCount: number): void {\n if (!node.mesh) {\n return;\n }\n node.mesh.geometry.vertexCount = vertexCount;\n }\n\n /**\n * Update resource in node.mesh.attribute object by node id\n * @param node - node object\n */\n static updateNodeAttributeByNodeId(node: NodeInPage): void {\n if (!node.mesh || !node.index) {\n return;\n }\n node.mesh.attribute.resource = node.index;\n }\n\n /**\n * Update featureCount in node.mesh.geometry object by node id\n * @param node - node object\n * @param featureCount - features count of the node\n */\n static updateFeatureCountByNodeId(node: NodeInPage, featureCount: number): void {\n if (!node.mesh) {\n return;\n }\n node.mesh.geometry.featureCount = featureCount;\n }\n\n /**\n * Update texelCountHint in node.mesh.material object by node id\n * @param node - node object\n * @param texelCountHint - texelCountHint of particular node\n */\n static updateTexelCountHintByNodeId(node: NodeInPage, texelCountHint: number): void {\n if (!node.mesh || !node.mesh.material) {\n return;\n }\n node.mesh.material.texelCountHint = texelCountHint;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preprocess-3d-tiles.js","names":["GLTFPrimitiveModeString","EXT_STRUCTURAL_METADATA","GLTFLoader","parse","EXT_FEATURE_METADATA","GLTF_PRIMITIVE_MODES","POINTS","LINES","LINE_LOOP","LINE_STRIP","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN","analyzeTileContent","tileContent","defaultResult","meshTopologyTypes","Set","metadataClasses","gltfArrayBuffer","gltfData","gltf","normalize","loadBuffers","loadImages","decompressMeshes","json","getMeshTypesFromGLTF","getMetadataClassesFromGLTF","gltfJson","result","mesh","meshes","primitive","primitives","mode","add","_gltfJson$extensions","_gltfJson$extensions$","_gltfJson$extensions$2","_gltfJson$extensions2","_gltfJson$extensions3","_gltfJson$extensions4","extFeatureMetadataClasses","extensions","schema","classes","classKey","Object","keys","extStructuralMetadataClasses","mergePreprocessData","object1","object2","type","metadataClass"],"sources":["../../../src/i3s-converter/helpers/preprocess-3d-tiles.ts"],"sourcesContent":["import {Tiles3DTileContent} from '@loaders.gl/3d-tiles';\nimport {GLTFPrimitiveModeString, PreprocessData} from '../types';\nimport {\n EXT_STRUCTURAL_METADATA,\n GLTF,\n GLTFLoader,\n GLTF_EXT_feature_metadata_GLTF,\n GLTF_EXT_structural_metadata_GLTF\n} from '@loaders.gl/gltf';\nimport {parse} from '@loaders.gl/core';\nimport {EXT_FEATURE_METADATA} from '@loaders.gl/gltf';\n\n/**\n * glTF primitive modes\n * @see https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_mesh_primitive_mode\n */\nexport const GLTF_PRIMITIVE_MODES = [\n GLTFPrimitiveModeString.POINTS, // 0\n GLTFPrimitiveModeString.LINES, // 1\n GLTFPrimitiveModeString.LINE_LOOP, // 2\n GLTFPrimitiveModeString.LINE_STRIP, // 3\n GLTFPrimitiveModeString.TRIANGLES, // 4\n GLTFPrimitiveModeString.TRIANGLE_STRIP, // 5\n GLTFPrimitiveModeString.TRIANGLE_FAN // 6\n];\n\n/**\n * Analyze tile content. This function is used during preprocess stage of\n * conversion\n * @param tileContent - 3DTiles tile content ArrayBuffer\n * @returns\n */\nexport const analyzeTileContent = async (\n tileContent: Tiles3DTileContent | null\n): Promise<PreprocessData> => {\n const defaultResult = {\n meshTopologyTypes: new Set<GLTFPrimitiveModeString>(),\n metadataClasses: new Set<string>()\n };\n if (!tileContent?.gltfArrayBuffer) {\n return defaultResult;\n }\n\n const gltfData = await parse(tileContent.gltfArrayBuffer, GLTFLoader, {\n gltf: {normalize: false, loadBuffers: false, loadImages: false, decompressMeshes: false}\n });\n const gltf = gltfData.json;\n\n if (!gltf) {\n return defaultResult;\n }\n const meshTopologyTypes = getMeshTypesFromGLTF(gltf);\n const metadataClasses = getMetadataClassesFromGLTF(gltf);\n return {\n meshTopologyTypes,\n metadataClasses\n };\n};\n\n/**\n * Get mesh topology types that the glb content has\n * @param gltfJson - JSON part of GLB content\n * @returns array of mesh types found\n */\nconst getMeshTypesFromGLTF = (gltfJson: GLTF): Set<GLTFPrimitiveModeString> => {\n const result: Set<GLTFPrimitiveModeString> = new Set();\n for (const mesh of gltfJson.meshes || []) {\n for (const primitive of mesh.primitives) {\n let {mode} = primitive;\n if (typeof mode !== 'number') {\n mode = 4; // Default is 4 - TRIANGLES\n }\n result.add(GLTF_PRIMITIVE_MODES[mode]);\n }\n }\n return result;\n};\n\n/**\n * Get feature metadata classes from glTF\n * The tileset might contain multiple metadata classes provided by EXT_feature_metadata and EXT_structural_metadata extensions.\n * Every class is a set of properties. But I3S can consume only one set of properties.\n * On the pre-process we collect all classes from the tileset in order to show the prompt to select one class for conversion to I3S.\n * @param gltfJson - JSON part of GLB content\n * @returns array of classes\n */\nconst getMetadataClassesFromGLTF = (gltfJson: GLTF): Set<string> => {\n const result: Set<string> = new Set();\n\n // Try to parse from EXT_feature_metadata\n const extFeatureMetadataClasses = (\n gltfJson.extensions?.[EXT_FEATURE_METADATA] as GLTF_EXT_feature_metadata_GLTF\n )?.schema?.classes;\n\n if (extFeatureMetadataClasses) {\n for (const classKey of Object.keys(extFeatureMetadataClasses)) {\n result.add(classKey);\n }\n }\n\n // Try to parse from EXT_structural_metadata\n const extStructuralMetadataClasses = (\n gltfJson.extensions?.[EXT_STRUCTURAL_METADATA] as GLTF_EXT_structural_metadata_GLTF\n )?.schema?.classes;\n if (extStructuralMetadataClasses) {\n for (const classKey of Object.keys(extStructuralMetadataClasses)) {\n result.add(classKey);\n }\n }\n\n return result;\n};\n\n/**\n * Merge object2 into object1\n * @param object1\n * @param object2\n * @returns nothing\n */\nexport const mergePreprocessData = (object1: PreprocessData, object2: PreprocessData): void => {\n // Merge topology mesh types info\n for (const type of object2.meshTopologyTypes) {\n object1.meshTopologyTypes.add(type);\n }\n\n // Merge feature metadata classes\n for (const metadataClass of object2.metadataClasses) {\n object1.metadataClasses.add(metadataClass);\n }\n};\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","names":["process","timeConverter","THRESHOLD_DEFAULT","Progress","constructor","options","arguments","length","undefined","_stepsTotal","_stepsDone","startTime","stopTime","timeOfUpdatingStepsDone","milliSecForOneStep","trust","numberOfDigitsInPercentage","threshold","getTime","hrtime","bigint","stepsTotal","Math","ceil","log10","stepsDone","getCurrentTimeInMilliSeconds","diff","isVelocityTrust","startMonitoring","stopMonitoring","getPercent","percent","getPercentString","toFixed","getTimeCurrentlyElapsed","currentTime","getTimeRemaining","timeRemainingInMilliSeconds","timeRemaining","getTimeRemainingString","timeRemainingObject","current","previous","dev","abs","Number","BigInt"],"sources":["../../../src/i3s-converter/helpers/progress.ts"],"sourcesContent":["import process from 'process';\nimport {timeConverter} from '../../lib/utils/statistic-utills';\n\n/** Defines a threshold that is used to check if the process velocity can be consifered trust. */\nconst THRESHOLD_DEFAULT = 0.2;\n\n/**\n * Implements methods to keep track on the progress of a long process.\n */\nexport class Progress {\n /** Total amount of work, e.g. number of files to save or number of bytes to send */\n private _stepsTotal: number = 0;\n /** Amount of work already done */\n private _stepsDone: number = 0;\n /** Time in milli-seconds when the process started */\n private startTime: number = 0;\n /** Time in milli-seconds when the process stopped */\n private stopTime: number = 0;\n /** Time in milli-seconds when stepsDone was updated */\n private timeOfUpdatingStepsDone: number = 0;\n /** Time in milli-seconds spent for performing one step*/\n private milliSecForOneStep: number = 0;\n private trust: boolean = false;\n /**\n * The number of digits to appear after decimal point in the string representation of the count of steps already done.\n * It's calculated based on the total count of steps.\n */\n private numberOfDigitsInPercentage: number = 0;\n /** Defines a threshold that is used to check if the process velocity can be consifered trust. */\n private threshold: number;\n /** Function that is used to get the time stamp */\n private getTime: () => bigint;\n\n constructor(options: {threshold?: number; getTime?: () => bigint} = {}) {\n this.getTime = options.getTime || process.hrtime.bigint;\n this.threshold = options.threshold || THRESHOLD_DEFAULT;\n }\n\n /** Total amount of work, e.g. number of files to save or number of bytes to send */\n get stepsTotal() {\n return this._stepsTotal;\n }\n\n set stepsTotal(stepsTotal) {\n this._stepsTotal = stepsTotal;\n this.numberOfDigitsInPercentage =\n this.stepsTotal > 100 ? Math.ceil(Math.log10(this.stepsTotal)) - 2 : 0;\n }\n\n /** Amount of work already done */\n get stepsDone() {\n return this._stepsDone;\n }\n\n set stepsDone(stepsDone) {\n this._stepsDone = stepsDone;\n this.timeOfUpdatingStepsDone = this.getCurrentTimeInMilliSeconds();\n if (this._stepsDone) {\n const diff = this.timeOfUpdatingStepsDone - this.startTime;\n const milliSecForOneStep = diff / this._stepsDone;\n\n this.trust = this.isVelocityTrust(milliSecForOneStep, this.milliSecForOneStep);\n this.milliSecForOneStep = milliSecForOneStep;\n }\n }\n\n /**\n * Saves the current time as we start monitoring the process.\n */\n startMonitoring() {\n this.startTime = this.getCurrentTimeInMilliSeconds();\n this.milliSecForOneStep = 0;\n this.trust = false;\n this.timeOfUpdatingStepsDone = 0;\n this.stopTime = 0;\n this.stepsDone = 0;\n }\n\n /**\n * Saves the current time as we stop monitoring the process.\n */\n stopMonitoring() {\n this.stopTime = this.getCurrentTimeInMilliSeconds();\n }\n\n /**\n * Gets percentage of the work already done.\n * @returns percentage of the work already done.\n */\n getPercent(): number | null {\n if (!this._stepsTotal) {\n return null;\n }\n const percent = (this._stepsDone / this._stepsTotal) * 100.0;\n return percent;\n }\n\n /**\n * Gets string representation of percentage of the work already done.\n * @returns string representation of percentage or an empty string if the percetage value cannot be calculated.\n */\n getPercentString() {\n const percent = this.getPercent();\n return percent !== null ? percent.toFixed(this.numberOfDigitsInPercentage) : '';\n }\n\n /**\n * Gets the time elapsed since the monitoring started\n * @returns Number of milliseconds elapsed\n */\n getTimeCurrentlyElapsed(): number {\n const currentTime = this.stopTime ? this.stopTime : this.getCurrentTimeInMilliSeconds();\n const diff = currentTime - this.startTime;\n return diff;\n }\n\n /**\n * Gets the time remaining (expected at the moment of updating 'stepsDone') to complete the work.\n * @returns Number of milliseconds remaining\n */\n getTimeRemaining(): {timeRemaining: number; trust: boolean} | null {\n if (!this._stepsTotal || !this._stepsDone || !this.startTime) {\n return null;\n }\n\n const timeRemainingInMilliSeconds =\n (this._stepsTotal - this._stepsDone) * this.milliSecForOneStep;\n return {timeRemaining: timeRemainingInMilliSeconds, trust: this.trust};\n }\n\n /**\n * Gets the string representation of the time remaining (expected at the moment of updating 'stepsDone') to complete the work.\n * @returns string representation of the time remaining.\n * It's an empty string if the time cannot be pedicted or it's still being calculated.\n */\n getTimeRemainingString(): string {\n const timeRemainingObject = this.getTimeRemaining();\n return timeRemainingObject?.trust ? timeConverter(timeRemainingObject.timeRemaining) : '';\n }\n\n /**\n * Check if the computed velociy of the process can be considered trust.\n * At the beginning of the process the number of samples collected ('time necessary to perform one step' averaged) is too small,\n * which results in huge deviation of the cumputed velocity of the process.\n * It makes sense to perform the check before reporting the time remainig so the end user is not confused.\n * @param current - current value\n * @param previous - previous value\n * @returns true if the computed velociy can be considered trust, or false otherwise\n */\n private isVelocityTrust(current: number, previous: number): boolean {\n if (previous) {\n const dev = Math.abs((current - previous) / previous);\n return dev < this.threshold;\n }\n return false;\n }\n\n /**\n * Gets current time in milliseconds.\n * @returns current time in milliseconds.\n */\n private getCurrentTimeInMilliSeconds(): number {\n // process.hrtime.bigint() returns the time in nanoseconds. We need the time in milliseconds.\n return Number(this.getTime() / BigInt(1e6));\n }\n}\n"],"mappings":"AAAA,OAAOA,OAAO,MAAM,SAAS;AAAC,SACtBC,aAAa;AAGrB,MAAMC,iBAAiB,GAAG,GAAG;AAK7B,OAAO,MAAMC,QAAQ,CAAC;EAwBpBC,WAAWA,CAAA,EAA6D;IAAA,IAA5DC,OAAqD,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;IAAA,KAtB9DG,WAAW,GAAW,CAAC;IAAA,KAEvBC,UAAU,GAAW,CAAC;IAAA,KAEtBC,SAAS,GAAW,CAAC;IAAA,KAErBC,QAAQ,GAAW,CAAC;IAAA,KAEpBC,uBAAuB,GAAW,CAAC;IAAA,KAEnCC,kBAAkB,GAAW,CAAC;IAAA,KAC9BC,KAAK,GAAY,KAAK;IAAA,KAKtBC,0BAA0B,GAAW,CAAC;IAAA,KAEtCC,SAAS;IAAA,KAETC,OAAO;IAGb,IAAI,CAACA,OAAO,GAAGb,OAAO,CAACa,OAAO,IAAIlB,OAAO,CAACmB,MAAM,CAACC,MAAM;IACvD,IAAI,CAACH,SAAS,GAAGZ,OAAO,CAACY,SAAS,IAAIf,iBAAiB;EACzD;EAGA,IAAImB,UAAUA,CAAA,EAAG;IACf,OAAO,IAAI,CAACZ,WAAW;EACzB;EAEA,IAAIY,UAAUA,CAACA,UAAU,EAAE;IACzB,IAAI,CAACZ,WAAW,GAAGY,UAAU;IAC7B,IAAI,CAACL,0BAA0B,GAC7B,IAAI,CAACK,UAAU,GAAG,GAAG,GAAGC,IAAI,CAACC,IAAI,CAACD,IAAI,CAACE,KAAK,CAAC,IAAI,CAACH,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;EAC1E;EAGA,IAAII,SAASA,CAAA,EAAG;IACd,OAAO,IAAI,CAACf,UAAU;EACxB;EAEA,IAAIe,SAASA,CAACA,SAAS,EAAE;IACvB,IAAI,CAACf,UAAU,GAAGe,SAAS;IAC3B,IAAI,CAACZ,uBAAuB,GAAG,IAAI,CAACa,4BAA4B,CAAC,CAAC;IAClE,IAAI,IAAI,CAAChB,UAAU,EAAE;MACnB,MAAMiB,IAAI,GAAG,IAAI,CAACd,uBAAuB,GAAG,IAAI,CAACF,SAAS;MAC1D,MAAMG,kBAAkB,GAAGa,IAAI,GAAG,IAAI,CAACjB,UAAU;MAEjD,IAAI,CAACK,KAAK,GAAG,IAAI,CAACa,eAAe,CAACd,kBAAkB,EAAE,IAAI,CAACA,kBAAkB,CAAC;MAC9E,IAAI,CAACA,kBAAkB,GAAGA,kBAAkB;IAC9C;EACF;EAKAe,eAAeA,CAAA,EAAG;IAChB,IAAI,CAAClB,SAAS,GAAG,IAAI,CAACe,4BAA4B,CAAC,CAAC;IACpD,IAAI,CAACZ,kBAAkB,GAAG,CAAC;IAC3B,IAAI,CAACC,KAAK,GAAG,KAAK;IAClB,IAAI,CAACF,uBAAuB,GAAG,CAAC;IAChC,IAAI,CAACD,QAAQ,GAAG,CAAC;IACjB,IAAI,CAACa,SAAS,GAAG,CAAC;EACpB;EAKAK,cAAcA,CAAA,EAAG;IACf,IAAI,CAAClB,QAAQ,GAAG,IAAI,CAACc,4BAA4B,CAAC,CAAC;EACrD;EAMAK,UAAUA,CAAA,EAAkB;IAC1B,IAAI,CAAC,IAAI,CAACtB,WAAW,EAAE;MACrB,OAAO,IAAI;IACb;IACA,MAAMuB,OAAO,GAAI,IAAI,CAACtB,UAAU,GAAG,IAAI,CAACD,WAAW,GAAI,KAAK;IAC5D,OAAOuB,OAAO;EAChB;EAMAC,gBAAgBA,CAAA,EAAG;IACjB,MAAMD,OAAO,GAAG,IAAI,CAACD,UAAU,CAAC,CAAC;IACjC,OAAOC,OAAO,KAAK,IAAI,GAAGA,OAAO,CAACE,OAAO,CAAC,IAAI,CAAClB,0BAA0B,CAAC,GAAG,EAAE;EACjF;EAMAmB,uBAAuBA,CAAA,EAAW;IAChC,MAAMC,WAAW,GAAG,IAAI,CAACxB,QAAQ,GAAG,IAAI,CAACA,QAAQ,GAAG,IAAI,CAACc,4BAA4B,CAAC,CAAC;IACvF,MAAMC,IAAI,GAAGS,WAAW,GAAG,IAAI,CAACzB,SAAS;IACzC,OAAOgB,IAAI;EACb;EAMAU,gBAAgBA,CAAA,EAAmD;IACjE,IAAI,CAAC,IAAI,CAAC5B,WAAW,IAAI,CAAC,IAAI,CAACC,UAAU,IAAI,CAAC,IAAI,CAACC,SAAS,EAAE;MAC5D,OAAO,IAAI;IACb;IAEA,MAAM2B,2BAA2B,GAC/B,CAAC,IAAI,CAAC7B,WAAW,GAAG,IAAI,CAACC,UAAU,IAAI,IAAI,CAACI,kBAAkB;IAChE,OAAO;MAACyB,aAAa,EAAED,2BAA2B;MAAEvB,KAAK,EAAE,IAAI,CAACA;IAAK,CAAC;EACxE;EAOAyB,sBAAsBA,CAAA,EAAW;IAC/B,MAAMC,mBAAmB,GAAG,IAAI,CAACJ,gBAAgB,CAAC,CAAC;IACnD,OAAOI,mBAAmB,aAAnBA,mBAAmB,eAAnBA,mBAAmB,CAAE1B,KAAK,GAAGd,aAAa,CAACwC,mBAAmB,CAACF,aAAa,CAAC,GAAG,EAAE;EAC3F;EAWQX,eAAeA,CAACc,OAAe,EAAEC,QAAgB,EAAW;IAClE,IAAIA,QAAQ,EAAE;MACZ,MAAMC,GAAG,GAAGtB,IAAI,CAACuB,GAAG,CAAC,CAACH,OAAO,GAAGC,QAAQ,IAAIA,QAAQ,CAAC;MACrD,OAAOC,GAAG,GAAG,IAAI,CAAC3B,SAAS;IAC7B;IACA,OAAO,KAAK;EACd;EAMQS,4BAA4BA,CAAA,EAAW;IAE7C,OAAOoB,MAAM,CAAC,IAAI,CAAC5B,OAAO,CAAC,CAAC,GAAG6B,MAAM,CAAC,GAAG,CAAC,CAAC;EAC7C;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tileset-traversal.js","names":["traverseDatasetWith","tile","traversalProps","processTile","postprocessTile","maxDepth","level","arguments","length","undefined","processResults","newTraversalProps","push","childTile","children"],"sources":["../../../src/i3s-converter/helpers/tileset-traversal.ts"],"sourcesContent":["import {Tiles3DTileJSONPostprocessed} from '@loaders.gl/3d-tiles';\nimport {NodeIndexDocument} from './node-index-document';\nimport {Matrix4} from '@math.gl/core';\n\n/** Traversal props for the conversion stage */\nexport type TraversalConversionProps = {\n /** Transformation matrix for the specific tile */\n transform: Matrix4;\n /** Parent nodes of the converted tile. Multiple nodes can be if one tile is converted to multiple nodes*/\n parentNodes: NodeIndexDocument[];\n};\n\n/**\n * Travesal of 3DTile tiles tree with making specific actions with each tile\n * @param tile - 3DTiles tile JSON metadata\n * @param traversalProps - traversal props used to pass data through recursive calls\n * @param processTile - callback to make some actions with the current tile\n * @param postprocessTile - callback to make some action after processing of the current tile and all the subtree\n * @param maxDepth - max recursive calls number the travesal function will do. If not set, the traversal function will\n * go through all the tree.\n * This value is used to limit the convertion with only partial number of levels of the tileset\n * @param level - counter to keep recursive calls number of the tiles tree. This value used to be able to break\n * traversal at the some level of the tree\n * @returns void\n */\nexport const traverseDatasetWith = async <TProps>(\n tile: Tiles3DTileJSONPostprocessed,\n traversalProps: TProps,\n processTile: (tile: Tiles3DTileJSONPostprocessed, traversalProps: TProps) => Promise<TProps>,\n postprocessTile?: (processResults: TProps[], currentTraversalProps: TProps) => Promise<void>,\n maxDepth?: number,\n level = 0\n): Promise<void> => {\n if (maxDepth && level > maxDepth) {\n return;\n }\n const processResults: TProps[] = [];\n const newTraversalProps: TProps = await processTile(tile, traversalProps);\n processResults.push(newTraversalProps);\n for (const childTile of tile.children) {\n await traverseDatasetWith(\n childTile,\n newTraversalProps,\n processTile,\n postprocessTile,\n maxDepth,\n level + 1\n );\n }\n postprocessTile && (await postprocessTile(processResults, traversalProps));\n};\n"],"mappings":"AAyBA,OAAO,MAAMA,mBAAmB,GAAG,eAAAA,CACjCC,IAAkC,EAClCC,cAAsB,EACtBC,WAA4F,EAC5FC,eAA4F,EAC5FC,QAAiB,EAEC;EAAA,IADlBC,KAAK,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC;EAET,IAAIF,QAAQ,IAAIC,KAAK,GAAGD,QAAQ,EAAE;IAChC;EACF;EACA,MAAMK,cAAwB,GAAG,EAAE;EACnC,MAAMC,iBAAyB,GAAG,MAAMR,WAAW,CAACF,IAAI,EAAEC,cAAc,CAAC;EACzEQ,cAAc,CAACE,IAAI,CAACD,iBAAiB,CAAC;EACtC,KAAK,MAAME,SAAS,IAAIZ,IAAI,CAACa,QAAQ,EAAE;IACrC,MAAMd,mBAAmB,CACvBa,SAAS,EACTF,iBAAiB,EACjBR,WAAW,EACXC,eAAe,EACfC,QAAQ,EACRC,KAAK,GAAG,CACV,CAAC;EACH;EACAF,eAAe,KAAK,MAAMA,eAAe,CAACM,cAAc,EAAER,cAAc,CAAC,CAAC;AAC5E,CAAC"}
|