@loaders.gl/tile-converter 3.2.0-alpha.2 → 3.2.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/3d-tiles-attributes-worker.js +1 -1
  2. package/dist/3d-tiles-converter/3d-tiles-converter.d.ts +1 -1
  3. package/dist/3d-tiles-converter/3d-tiles-converter.d.ts.map +1 -1
  4. package/dist/converter-cli.d.ts +2 -0
  5. package/dist/converter-cli.d.ts.map +1 -0
  6. package/dist/converter-cli.js +232 -0
  7. package/dist/converter.min.js +68 -68
  8. package/dist/deps-installer/deps-installer.d.ts +11 -1
  9. package/dist/deps-installer/deps-installer.d.ts.map +1 -1
  10. package/dist/deps-installer/deps-installer.js +10 -0
  11. package/dist/dist.min.js +95 -162
  12. package/dist/es5/3d-tiles-attributes-worker.js +1 -1
  13. package/dist/es5/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
  14. package/dist/es5/converter-cli.js +306 -0
  15. package/dist/es5/converter-cli.js.map +1 -0
  16. package/dist/es5/deps-installer/deps-installer.js.map +1 -1
  17. package/dist/es5/i3s-attributes-worker.js +1 -1
  18. package/dist/es5/i3s-converter/helpers/geometry-converter.js +4 -4
  19. package/dist/es5/i3s-converter/helpers/geometry-converter.js.map +1 -1
  20. package/dist/es5/i3s-converter/i3s-converter.js +64 -43
  21. package/dist/es5/i3s-converter/i3s-converter.js.map +1 -1
  22. package/dist/es5/index.js +0 -24
  23. package/dist/es5/index.js.map +1 -1
  24. package/dist/es5/pgm-loader.js +1 -1
  25. package/dist/esm/3d-tiles-attributes-worker.js +1 -1
  26. package/dist/esm/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
  27. package/dist/esm/converter-cli.js +230 -0
  28. package/dist/esm/converter-cli.js.map +1 -0
  29. package/dist/esm/deps-installer/deps-installer.js.map +1 -1
  30. package/dist/esm/i3s-attributes-worker.js +1 -1
  31. package/dist/esm/i3s-converter/helpers/geometry-converter.js +4 -4
  32. package/dist/esm/i3s-converter/helpers/geometry-converter.js.map +1 -1
  33. package/dist/esm/i3s-converter/i3s-converter.js +44 -26
  34. package/dist/esm/i3s-converter/i3s-converter.js.map +1 -1
  35. package/dist/esm/index.js +0 -3
  36. package/dist/esm/index.js.map +1 -1
  37. package/dist/esm/pgm-loader.js +1 -1
  38. package/dist/i3s-attributes-worker.js +1 -1
  39. package/dist/i3s-attributes-worker.js.map +2 -2
  40. package/dist/i3s-converter/helpers/geometry-converter.js +3 -3
  41. package/dist/i3s-converter/i3s-converter.d.ts +0 -2
  42. package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
  43. package/dist/i3s-converter/i3s-converter.js +34 -16
  44. package/dist/index.d.ts +0 -3
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -7
  47. package/package.json +16 -17
  48. package/src/3d-tiles-converter/3d-tiles-converter.ts +1 -1
  49. package/src/converter-cli.ts +310 -0
  50. package/src/deps-installer/{deps-installer.js → deps-installer.ts} +11 -1
  51. package/src/i3s-converter/helpers/geometry-converter.ts +4 -4
  52. package/src/i3s-converter/i3s-converter.ts +37 -25
  53. package/src/index.ts +0 -5
  54. package/dist/es5/deps-installer/deps-installer.d.ts +0 -10
  55. package/dist/esm/deps-installer/deps-installer.d.ts +0 -10
  56. package/src/deps-installer/deps-installer.d.ts +0 -10
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/i3s-converter/helpers/geometry-converter.ts"],"names":["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","Vector3","convertB3dmToI3sGeometry","tileContent","nodeId","featuresHashArray","attributeStorageInfo","draco","generateBoundingVolumes","geoidHeightModel","workerSource","useCartesianPositions","materialAndTextureList","convertMaterials","gltf","materials","dataForAttributesConversion","convertAttributes","convertedAttributesMap","_generateBoundingVolumesFromGeometry","has","push","material","getDefaultMaterial","result","nodesCounter","length","id","i","sourceMaterial","convertedAttributes","get","texture","_makeNodeResources","values","attributes","boundingVolumes","positions","cartographicOrigin","obb","center","index","vertex","subarray","Ellipsoid","WGS84","cartesianToCartographic","Array","from","getHeight","subtract","set","vertexCount","faceRange","featureIds","normals","colors","texCoords","featureCount","batchTableJson","makeFeatureIdsUnique","featureIndices","header","Uint32Array","typedFeatureIds","generateBigUint64Array","fileBuffer","Uint8Array","buffer","ArrayBuffer","compressedGeometry","generateCompressedGeometry","Float32Array","convertBatchTableToAttributeBuffers","geometry","sharedResources","getSharedResources","meshMaterial","attributesData","gltfMaterials","nodes","cartesianModelMatrix","attributesMap","Map","featureIndicesGroups","convertNodes","keys","attrKey","delete","reduce","acc","value","concat","matrix","Matrix4","node","convertNode","getCompositeTransformationMatrix","transformationMatrix","nodeMatrix","rotation","scale","translation","multiplyRight","rotateXYZ","translate","mesh","convertMesh","children","primitives","primitive","outputAttributes","transformVertexArray","vertices","POSITION","indices","attributeSpecificTransformation","transformVertexPositions","NORMAL","transformVertexNormals","flattenTexCoords","TEXCOORD_0","flattenColors","COLOR_0","flattenBatchIds","getBatchIdsByAttributeName","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","convertMaterial","doubleSided","emissiveFactor","map","c","Math","round","alphaMode","convertAlphaMode","pbrMetallicRoughness","roughnessFactor","metallicFactor","baseColorTexture","source","textureSetDefinitionId","emissiveTexture","baseColorFactor","undefined","gltfAlphaMode","i3sResources","materialDefinitionInfos","gltfMaterial","convertGLTFMaterialToI3sSharedResources","materialDefinitionInfo","textureDefinitionInfo","textureDefinitionInfos","extractSharedResourcesTextureInfo","colorFactor","extractSharedResourcesMaterialInfo","matDielectricColorComponent","black","Vector4","unitVector","dielectricSpecular","baseColorVector","firstOperand","multiply","diffuse","lerp","specular","params","toArray","renderMode","encoding","mimeType","images","generateImageId","size","image","width","data","height","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","batchTableWithFeatureIds","OBJECTID","type","getAttributeType","attributeBuffer","generateShortIntegerAttributeBuffer","generateDoubleAttributeBuffer","generateStringAttributeBuffer","attribute","find","attr","name","attributeValues","valueType","count","valuesArray","padding","Float64Array","batchAttributes","stringCountArray","totalNumberOfBytes","stringSizesArray","stringBufferArray","currentString","String","currentStringBuffer","Buffer","currentStringSize","totalBytes","concatenateArrayBuffers","BigUint64Array","dracoWorkerSoure","featureIndex","generateFeatureIndexAttribute","compressedAttributes","attributesMetadata","Int32Array","DracoWriterWorker","options","reuseWorkers","_nodeWorkers","method","orderedFeatureIndices","fillIndex","startIndex","endIndex"],"mappings":"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","sourcesContent":["import {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 {generateAttributes} from './geometry-attributes';\nimport {createBoundingVolumesFromGeometry} from './coordinate-converter';\nimport {\n ConvertedAttributes,\n I3SConvertedResources,\n I3SMaterialWithTexture,\n SharedResourcesArrays\n} from '../types';\nimport {B3DMContent} from '@loaders.gl/3d-tiles';\nimport {GLTFMaterialPostprocessed, GLTFNodePostprocessed} from '@loaders.gl/gltf';\nimport {\n AttributeStorageInfo,\n I3SMaterialDefinition,\n MaterialDefinitionInfo,\n TextureDefinitionInfo\n} from '@loaders.gl/i3s';\nimport {TypedArray} from '@loaders.gl/schema';\nimport {Geoid} from '@math.gl/geoid';\nimport {\n GLTFAccessorPostprocessed,\n GLTFMeshPostprocessed,\n GLTFTexturePostprocessed\n} from 'modules/gltf/src/lib/types/gltf-types';\nimport {B3DMAttributesData /*transformI3SAttributesOnWorker */} from '../../i3s-attributes-worker';\nimport {prepareDataForAttributesConversion} from './gltf-attributes';\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 nodeId - target nodeId. If a few nodes will be created - ids will be nodeId+n where n - index in the resulting array\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 geoidHeightModel - model to convert elevation from elipsoidal to geoid\n * @returns Array of node resources to create one or more i3s nodes\n */\nexport default async function convertB3dmToI3sGeometry(\n tileContent: B3DMContent,\n nodeId: number,\n featuresHashArray: string[],\n attributeStorageInfo: AttributeStorageInfo[] | undefined,\n draco: boolean,\n generateBoundingVolumes: boolean,\n geoidHeightModel: Geoid,\n workerSource: {[key: string]: string}\n) {\n const useCartesianPositions = generateBoundingVolumes;\n const materialAndTextureList: I3SMaterialWithTexture[] = convertMaterials(\n tileContent.gltf?.materials\n );\n\n const dataForAttributesConversion = prepareDataForAttributesConversion(tileContent);\n\n const convertedAttributesMap: Map<string, ConvertedAttributes> = await convertAttributes(\n dataForAttributesConversion,\n useCartesianPositions\n );\n // TODO uncomment it when worker will be published on CDN.\n /*\n const convertedAttributesMap: Map<string, ConvertedAttributes> =\n await transformI3SAttributesOnWorker(dataForAttributesConversion, {\n useCartesianPositions,\n source: workerSource.I3SAttributes\n });\n */\n\n if (generateBoundingVolumes) {\n _generateBoundingVolumesFromGeometry(convertedAttributesMap, geoidHeightModel);\n }\n\n if (convertedAttributesMap.has('default')) {\n materialAndTextureList.push({\n material: getDefaultMaterial()\n });\n }\n\n const result: I3SConvertedResources[] = [];\n let nodesCounter = nodeId;\n let {materials = []} = tileContent.gltf || {materials: []};\n if (!materials?.length) {\n materials.push({id: 'default'});\n }\n for (let i = 0; i < materials.length; i++) {\n const sourceMaterial = materials[i];\n if (!convertedAttributesMap.has(sourceMaterial.id)) {\n continue; // eslint-disable-line no-continue\n }\n const convertedAttributes = convertedAttributesMap.get(sourceMaterial.id);\n if (!convertedAttributes) {\n continue;\n }\n const {material, texture} = materialAndTextureList[i];\n result.push(\n await _makeNodeResources({\n convertedAttributes,\n material,\n texture,\n tileContent,\n nodeId: nodesCounter,\n featuresHashArray,\n attributeStorageInfo,\n draco,\n workerSource\n })\n );\n nodesCounter++;\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 - B3DM 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.attributesStorageInfo - attributes metadata from 3DSceneLayer json\n * @param params.draco - is converter should create draco compressed geometry\n * @returns Array of I3S node resources\n */\nasync function _makeNodeResources({\n convertedAttributes,\n material,\n texture,\n tileContent,\n nodeId,\n featuresHashArray,\n attributeStorageInfo,\n draco,\n workerSource\n}: {\n convertedAttributes: ConvertedAttributes;\n material: I3SMaterialDefinition;\n texture?: {};\n tileContent: B3DMContent;\n nodeId: number;\n featuresHashArray: string[];\n attributeStorageInfo?: AttributeStorageInfo[];\n draco: boolean;\n workerSource: {[key: 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, texCoords, featureCount} =\n generateAttributes(convertedAttributes);\n\n if (tileContent.batchTableJson) {\n makeFeatureIdsUnique(\n featureIds,\n convertedAttributes.featureIndices,\n featuresHashArray,\n tileContent.batchTableJson\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 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 featureIds,\n faceRange\n },\n workerSource.draco\n )\n : null;\n\n const attributes = convertBatchTableToAttributeBuffers(\n tileContent.batchTableJson,\n featureIds,\n attributeStorageInfo\n );\n\n return {\n geometry: fileBuffer,\n compressedGeometry,\n texture,\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 tileContent - 3d tile 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 * @returns map of converted geometry attributes\n */\nexport async function convertAttributes(\n attributesData: B3DMAttributesData,\n useCartesianPositions: boolean\n): Promise<Map<string, ConvertedAttributes>> {\n const {gltfMaterials, nodes, cartographicOrigin, cartesianModelMatrix} = attributesData;\n const attributesMap = new Map<string, ConvertedAttributes>();\n\n for (const material of gltfMaterials || [{id: 'default'}]) {\n attributesMap.set(material.id, {\n positions: new Float32Array(0),\n normals: new Float32Array(0),\n texCoords: new Float32Array(0),\n colors: new Uint8Array(0),\n featureIndicesGroups: [],\n featureIndices: [],\n boundingVolumes: null\n });\n }\n\n convertNodes(\n nodes,\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions\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 tileContent - 3d tile content\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 * @returns {void}\n */\nfunction convertNodes(\n nodes: GLTFNodePostprocessed[],\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) {\n if (nodes) {\n for (const node of nodes) {\n convertNode(\n node,\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions,\n matrix\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, matrix) {\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 (rotation) {\n transformationMatrix = transformationMatrix.rotateXYZ(rotation);\n }\n\n if (scale) {\n transformationMatrix = transformationMatrix.scale(scale);\n }\n\n if (translation) {\n transformationMatrix = transformationMatrix.translate(translation);\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 {Object} tileContent - 3d tile content\n * @param {Map} 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 {Matrix4} matrix - transformation matrix - cumulative transformation matrix formed from all parent node matrices\n */\nfunction convertNode(\n node: GLTFNodePostprocessed,\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) {\n const transformationMatrix = getCompositeTransformationMatrix(node, matrix);\n\n const mesh = node.mesh;\n if (mesh) {\n convertMesh(\n mesh,\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions,\n transformationMatrix\n );\n }\n\n convertNodes(\n node.children || [],\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions,\n transformationMatrix\n );\n}\n\n/**\n * Convert all primitives of node and all children nodes\n * @param mesh - gltf node\n * @param content - 3d tile 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 attributesMap Map<{positions: Float32Array, normals: Float32Array, texCoords: Float32Array, colors: Uint8Array, featureIndices: Array}> - for recursive concatenation of\n * attributes\n \n * @param {Matrix4} matrix - transformation matrix - cumulative transformation matrix formed from all parent node matrices\n */\nfunction convertMesh(\n mesh: GLTFMeshPostprocessed,\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) {\n for (const primitive of mesh.primitives) {\n let outputAttributes: ConvertedAttributes | null | undefined = null;\n if (primitive.material) {\n outputAttributes = attributesMap.get(primitive.material.id);\n } else if (attributesMap.has('default')) {\n outputAttributes = attributesMap.get('default');\n }\n assert(outputAttributes !== null, 'Primitive - material mapping failed');\n const attributes = primitive.attributes;\n if (!outputAttributes) {\n continue;\n }\n outputAttributes.positions = concatenateTypedArrays(\n outputAttributes.positions,\n transformVertexArray({\n vertices: attributes.POSITION.value,\n cartographicOrigin,\n cartesianModelMatrix,\n nodeMatrix: matrix,\n indices: primitive.indices?.value,\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: primitive.indices?.value,\n attributeSpecificTransformation: transformVertexNormals,\n useCartesianPositions: false\n })\n );\n outputAttributes.texCoords = concatenateTypedArrays(\n outputAttributes.texCoords,\n flattenTexCoords(\n attributes.TEXCOORD_0 && attributes.TEXCOORD_0.value,\n primitive.indices?.value\n )\n );\n\n outputAttributes.colors = concatenateTypedArrays(\n outputAttributes.colors,\n flattenColors(attributes.COLOR_0, primitive.indices?.value)\n );\n\n outputAttributes.featureIndicesGroups = outputAttributes.featureIndicesGroups || [];\n outputAttributes.featureIndicesGroups.push(\n flattenBatchIds(getBatchIdsByAttributeName(attributes), primitive.indices?.value)\n );\n }\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 {Float32Array}\n */\nfunction transformVertexArray(args: {\n vertices: Float32Array;\n cartographicOrigin: number[];\n cartesianModelMatrix: number[];\n nodeMatrix: Matrix4;\n indices: Uint8Array;\n attributeSpecificTransformation: Function;\n useCartesianPositions: boolean;\n}) {\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: Float32Array, indices: Uint8Array): 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: Uint8Array\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 * 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: number[], indices: Uint8Array): 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 * Return batchIds based on possible attribute names for different kind of maps.\n * @param attributes - the gltf primitive attributes\n * @returns batch ids attribute\n */\nfunction getBatchIdsByAttributeName(attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n}): number[] {\n let batchIds: number[] = [];\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 batchIds = attributes[possibleBatchIdAttributeName].value;\n break;\n }\n }\n\n return batchIds;\n}\n\n/**\n * Convert GLTF material to I3S material definitions and textures\n * @param sourceMaterials Source GLTF materials\n * @returns Array of Couples I3SMaterialDefinition + texture content\n */\nfunction convertMaterials(\n sourceMaterials: GLTFMaterialPostprocessed[] = []\n): I3SMaterialWithTexture[] {\n const result: I3SMaterialWithTexture[] = [];\n for (const sourceMaterial of sourceMaterials) {\n result.push(convertMaterial(sourceMaterial));\n }\n return result;\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 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 }\n\n return {material, texture};\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 diffuse: diffuse.toArray(),\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]\n }\n ]\n };\n}\n\n/**\n * Formula for counting 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) {\n const {width, height} = texture.source?.image;\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 {void}\n */\nfunction makeFeatureIdsUnique(\n featureIds: number[],\n featureIndices: number[],\n featuresHashArray: string[],\n batchTable: {[key: string]: any}\n) {\n const replaceMap = getFeaturesReplaceMap(featureIds, batchTable, featuresHashArray);\n replaceIndicesByUnique(featureIndices, replaceMap);\n replaceIndicesByUnique(featureIds, replaceMap);\n}\n\n/**\n * Generate replace map to make featureIds unique.\n * @param {Array} featureIds\n * @param {Object} batchTable\n * @param {Array} featuresHashArray\n * @returns {Object}\n */\nfunction getFeaturesReplaceMap(featureIds, batchTable, featuresHashArray) {\n const featureMap = {};\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 {Object} batchTable\n * @param {Number} index\n * @returns {String}\n */\nfunction generateStringFromBatchTableByIndex(batchTable, index) {\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 {Number} index\n * @param {Object} batchTable\n * @param {Array} featuresHashArray\n * @returns {Number}\n */\nfunction getOrCreateUniqueFeatureId(index, batchTable, featuresHashArray) {\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 {Array} indicesArray\n * @param {Object} featureMap\n * @returns {void}\n */\nfunction replaceIndicesByUnique(indicesArray, featureMap) {\n for (let index = 0; index < indicesArray.length; index++) {\n indicesArray[index] = featureMap[indicesArray[index]];\n }\n}\n\n/**\n * Convert batch table data to attribute buffers.\n * @param {Object} batchTable - table with metadata for particular feature.\n * @param {Array} featureIds\n * @param {Array} attributeStorageInfo\n * @returns {Array} - Array of file buffers.\n */\nfunction convertBatchTableToAttributeBuffers(batchTable, featureIds, attributeStorageInfo) {\n const attributeBuffers: ArrayBuffer[] = [];\n\n if (batchTable) {\n const batchTableWithFeatureIds = {\n OBJECTID: featureIds,\n ...batchTable\n };\n\n for (const key in batchTableWithFeatureIds) {\n const type = getAttributeType(key, attributeStorageInfo);\n\n let attributeBuffer: ArrayBuffer | null = null;\n\n switch (type) {\n case OBJECT_ID_TYPE:\n case SHORT_INT_TYPE:\n attributeBuffer = generateShortIntegerAttributeBuffer(batchTableWithFeatureIds[key]);\n break;\n case DOUBLE_TYPE:\n attributeBuffer = generateDoubleAttributeBuffer(batchTableWithFeatureIds[key]);\n break;\n case STRING_TYPE:\n attributeBuffer = generateStringAttributeBuffer(batchTableWithFeatureIds[key]);\n break;\n default:\n attributeBuffer = generateStringAttributeBuffer(batchTableWithFeatureIds[key]);\n }\n\n if (attributeBuffer) {\n attributeBuffers.push(attributeBuffer);\n }\n }\n }\n\n return attributeBuffers;\n}\n/**\n * Return attribute type.\n * @param {String} key\n * @param {Array} attributeStorageInfo\n * @returns {String} attribute type.\n */\nfunction getAttributeType(key, attributeStorageInfo) {\n const attribute = attributeStorageInfo.find((attr) => attr.name === key);\n return attribute.attributeValues.valueType;\n}\n\n/**\n * Convert short integer to attribute arrayBuffer.\n * @param {Array} featureIds\n * @returns {ArrayBuffer} - Buffer with objectId data.\n */\nfunction generateShortIntegerAttributeBuffer(featureIds): 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 {Array} featureIds\n * @returns {ArrayBuffer} - Buffer with objectId data.\n */\nfunction generateDoubleAttributeBuffer(featureIds): 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 {Array} batchAttributes\n * @returns {ArrayBuffer} - Buffer with batch table data.\n */\nfunction generateStringAttributeBuffer(batchAttributes): 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 {Array} featureIds\n * @returns {BigUint64Array} - Array of feature ids in BigUint64 format.\n */\nfunction generateBigUint64Array(featureIds) {\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 {Number} vertexCount\n * @param {Object} convertedAttributes - get rid of this argument here\n * @param {Object} attributes - geometry attributes to compress\n * @param {string} dracoWorkerSoure - draco worker source code\n * @returns {Promise<object>} - COmpressed geometry.\n */\nasync function generateCompressedGeometry(\n vertexCount,\n convertedAttributes,\n attributes,\n dracoWorkerSoure\n) {\n const {positions, normals, texCoords, colors, 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 } = {\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 return encode({attributes: compressedAttributes, indices}, DracoWriterWorker, {\n ...DracoWriterWorker.options,\n source: dracoWorkerSoure,\n reuseWorkers: true,\n _nodeWorkers: true,\n draco: {\n method: 'MESH_SEQUENTIAL_ENCODING',\n attributesMetadata\n }\n });\n}\n\n/**\n * Generates ordered feature indices based on face range\n * @param {Uint32Array} featureIndex\n * @param {Uint32Array} faceRange\n * @returns {Uint32Array}\n */\nfunction generateFeatureIndexAttribute(featureIndex, faceRange) {\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"],"file":"geometry-converter.js"}
1
+ {"version":3,"sources":["../../../../src/i3s-converter/helpers/geometry-converter.ts"],"names":["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","Vector3","convertB3dmToI3sGeometry","tileContent","nodeId","featuresHashArray","attributeStorageInfo","draco","generateBoundingVolumes","geoidHeightModel","workerSource","useCartesianPositions","materialAndTextureList","convertMaterials","gltf","materials","dataForAttributesConversion","convertAttributes","convertedAttributesMap","_generateBoundingVolumesFromGeometry","has","push","material","getDefaultMaterial","result","nodesCounter","length","id","i","sourceMaterial","convertedAttributes","get","texture","_makeNodeResources","values","attributes","boundingVolumes","positions","cartographicOrigin","obb","center","index","vertex","subarray","Ellipsoid","WGS84","cartesianToCartographic","Array","from","getHeight","subtract","set","vertexCount","faceRange","featureIds","normals","colors","texCoords","featureCount","batchTableJson","makeFeatureIdsUnique","featureIndices","header","Uint32Array","typedFeatureIds","generateBigUint64Array","fileBuffer","Uint8Array","buffer","ArrayBuffer","compressedGeometry","generateCompressedGeometry","Float32Array","convertBatchTableToAttributeBuffers","geometry","sharedResources","getSharedResources","meshMaterial","attributesData","gltfMaterials","nodes","cartesianModelMatrix","attributesMap","Map","featureIndicesGroups","convertNodes","keys","attrKey","delete","reduce","acc","value","concat","matrix","Matrix4","node","convertNode","getCompositeTransformationMatrix","transformationMatrix","nodeMatrix","rotation","scale","translation","multiplyRight","translate","rotateXYZ","mesh","convertMesh","children","primitives","primitive","outputAttributes","transformVertexArray","vertices","POSITION","indices","attributeSpecificTransformation","transformVertexPositions","NORMAL","transformVertexNormals","flattenTexCoords","TEXCOORD_0","flattenColors","COLOR_0","flattenBatchIds","getBatchIdsByAttributeName","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","convertMaterial","doubleSided","emissiveFactor","map","c","Math","round","alphaMode","convertAlphaMode","pbrMetallicRoughness","roughnessFactor","metallicFactor","baseColorTexture","source","textureSetDefinitionId","emissiveTexture","baseColorFactor","undefined","gltfAlphaMode","i3sResources","materialDefinitionInfos","gltfMaterial","convertGLTFMaterialToI3sSharedResources","materialDefinitionInfo","textureDefinitionInfo","textureDefinitionInfos","extractSharedResourcesTextureInfo","colorFactor","extractSharedResourcesMaterialInfo","matDielectricColorComponent","black","Vector4","unitVector","dielectricSpecular","baseColorVector","firstOperand","multiply","diffuse","lerp","specular","params","toArray","renderMode","encoding","mimeType","images","generateImageId","size","image","width","data","height","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","batchTableWithFeatureIds","OBJECTID","type","getAttributeType","attributeBuffer","generateShortIntegerAttributeBuffer","generateDoubleAttributeBuffer","generateStringAttributeBuffer","attribute","find","attr","name","attributeValues","valueType","count","valuesArray","padding","Float64Array","batchAttributes","stringCountArray","totalNumberOfBytes","stringSizesArray","stringBufferArray","currentString","String","currentStringBuffer","Buffer","currentStringSize","totalBytes","concatenateArrayBuffers","BigUint64Array","dracoWorkerSoure","featureIndex","generateFeatureIndexAttribute","compressedAttributes","attributesMetadata","Int32Array","DracoWriterWorker","options","reuseWorkers","_nodeWorkers","method","orderedFeatureIndices","fillIndex","startIndex","endIndex"],"mappings":"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","sourcesContent":["import {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 {generateAttributes} from './geometry-attributes';\nimport {createBoundingVolumesFromGeometry} from './coordinate-converter';\nimport {\n ConvertedAttributes,\n I3SConvertedResources,\n I3SMaterialWithTexture,\n SharedResourcesArrays\n} from '../types';\nimport {B3DMContent} from '@loaders.gl/3d-tiles';\nimport {GLTFMaterialPostprocessed, GLTFNodePostprocessed} from '@loaders.gl/gltf';\nimport {\n AttributeStorageInfo,\n I3SMaterialDefinition,\n MaterialDefinitionInfo,\n TextureDefinitionInfo\n} from '@loaders.gl/i3s';\nimport {TypedArray} from '@loaders.gl/schema';\nimport {Geoid} from '@math.gl/geoid';\nimport {\n GLTFAccessorPostprocessed,\n GLTFMeshPostprocessed,\n GLTFTexturePostprocessed\n} from 'modules/gltf/src/lib/types/gltf-types';\nimport {B3DMAttributesData /*transformI3SAttributesOnWorker */} from '../../i3s-attributes-worker';\nimport {prepareDataForAttributesConversion} from './gltf-attributes';\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 nodeId - target nodeId. If a few nodes will be created - ids will be nodeId+n where n - index in the resulting array\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 geoidHeightModel - model to convert elevation from elipsoidal to geoid\n * @returns Array of node resources to create one or more i3s nodes\n */\nexport default async function convertB3dmToI3sGeometry(\n tileContent: B3DMContent,\n nodeId: number,\n featuresHashArray: string[],\n attributeStorageInfo: AttributeStorageInfo[] | undefined,\n draco: boolean,\n generateBoundingVolumes: boolean,\n geoidHeightModel: Geoid,\n workerSource: {[key: string]: string}\n) {\n const useCartesianPositions = generateBoundingVolumes;\n const materialAndTextureList: I3SMaterialWithTexture[] = convertMaterials(\n tileContent.gltf?.materials\n );\n\n const dataForAttributesConversion = prepareDataForAttributesConversion(tileContent);\n\n const convertedAttributesMap: Map<string, ConvertedAttributes> = await convertAttributes(\n dataForAttributesConversion,\n useCartesianPositions\n );\n // TODO uncomment it when worker will be published on CDN.\n /*\n const convertedAttributesMap: Map<string, ConvertedAttributes> =\n await transformI3SAttributesOnWorker(dataForAttributesConversion, {\n useCartesianPositions,\n source: workerSource.I3SAttributes\n });\n */\n\n if (generateBoundingVolumes) {\n _generateBoundingVolumesFromGeometry(convertedAttributesMap, geoidHeightModel);\n }\n\n if (convertedAttributesMap.has('default')) {\n materialAndTextureList.push({\n material: getDefaultMaterial()\n });\n }\n\n const result: I3SConvertedResources[] = [];\n let nodesCounter = nodeId;\n let {materials = []} = tileContent.gltf || {materials: []};\n if (!materials?.length) {\n materials.push({id: 'default'});\n }\n for (let i = 0; i < materials.length; i++) {\n const sourceMaterial = materials[i];\n if (!convertedAttributesMap.has(sourceMaterial.id)) {\n continue; // eslint-disable-line no-continue\n }\n const convertedAttributes = convertedAttributesMap.get(sourceMaterial.id);\n if (!convertedAttributes) {\n continue;\n }\n const {material, texture} = materialAndTextureList[i];\n result.push(\n await _makeNodeResources({\n convertedAttributes,\n material,\n texture,\n tileContent,\n nodeId: nodesCounter,\n featuresHashArray,\n attributeStorageInfo,\n draco,\n workerSource\n })\n );\n nodesCounter++;\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 - B3DM 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.attributesStorageInfo - attributes metadata from 3DSceneLayer json\n * @param params.draco - is converter should create draco compressed geometry\n * @returns Array of I3S node resources\n */\nasync function _makeNodeResources({\n convertedAttributes,\n material,\n texture,\n tileContent,\n nodeId,\n featuresHashArray,\n attributeStorageInfo,\n draco,\n workerSource\n}: {\n convertedAttributes: ConvertedAttributes;\n material: I3SMaterialDefinition;\n texture?: {};\n tileContent: B3DMContent;\n nodeId: number;\n featuresHashArray: string[];\n attributeStorageInfo?: AttributeStorageInfo[];\n draco: boolean;\n workerSource: {[key: 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, texCoords, featureCount} =\n generateAttributes(convertedAttributes);\n\n if (tileContent.batchTableJson) {\n makeFeatureIdsUnique(\n featureIds,\n convertedAttributes.featureIndices,\n featuresHashArray,\n tileContent.batchTableJson\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 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 featureIds,\n faceRange\n },\n workerSource.draco\n )\n : null;\n\n const attributes = convertBatchTableToAttributeBuffers(\n tileContent.batchTableJson,\n featureIds,\n attributeStorageInfo\n );\n\n return {\n geometry: fileBuffer,\n compressedGeometry,\n texture,\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 tileContent - 3d tile 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 * @returns map of converted geometry attributes\n */\nexport async function convertAttributes(\n attributesData: B3DMAttributesData,\n useCartesianPositions: boolean\n): Promise<Map<string, ConvertedAttributes>> {\n const {gltfMaterials, nodes, cartographicOrigin, cartesianModelMatrix} = attributesData;\n const attributesMap = new Map<string, ConvertedAttributes>();\n\n for (const material of gltfMaterials || [{id: 'default'}]) {\n attributesMap.set(material.id, {\n positions: new Float32Array(0),\n normals: new Float32Array(0),\n texCoords: new Float32Array(0),\n colors: new Uint8Array(0),\n featureIndicesGroups: [],\n featureIndices: [],\n boundingVolumes: null\n });\n }\n\n convertNodes(\n nodes,\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions\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 tileContent - 3d tile content\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 * @returns {void}\n */\nfunction convertNodes(\n nodes: GLTFNodePostprocessed[],\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) {\n if (nodes) {\n for (const node of nodes) {\n convertNode(\n node,\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions,\n matrix\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, matrix) {\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 {Object} tileContent - 3d tile content\n * @param {Map} 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 {Matrix4} matrix - transformation matrix - cumulative transformation matrix formed from all parent node matrices\n */\nfunction convertNode(\n node: GLTFNodePostprocessed,\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) {\n const transformationMatrix = getCompositeTransformationMatrix(node, matrix);\n\n const mesh = node.mesh;\n if (mesh) {\n convertMesh(\n mesh,\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions,\n transformationMatrix\n );\n }\n\n convertNodes(\n node.children || [],\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions,\n transformationMatrix\n );\n}\n\n/**\n * Convert all primitives of node and all children nodes\n * @param mesh - gltf node\n * @param content - 3d tile 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 attributesMap Map<{positions: Float32Array, normals: Float32Array, texCoords: Float32Array, colors: Uint8Array, featureIndices: Array}> - for recursive concatenation of\n * attributes\n \n * @param {Matrix4} matrix - transformation matrix - cumulative transformation matrix formed from all parent node matrices\n */\nfunction convertMesh(\n mesh: GLTFMeshPostprocessed,\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) {\n for (const primitive of mesh.primitives) {\n let outputAttributes: ConvertedAttributes | null | undefined = null;\n if (primitive.material) {\n outputAttributes = attributesMap.get(primitive.material.id);\n } else if (attributesMap.has('default')) {\n outputAttributes = attributesMap.get('default');\n }\n assert(outputAttributes !== null, 'Primitive - material mapping failed');\n const attributes = primitive.attributes;\n if (!outputAttributes) {\n continue;\n }\n outputAttributes.positions = concatenateTypedArrays(\n outputAttributes.positions,\n transformVertexArray({\n vertices: attributes.POSITION.value,\n cartographicOrigin,\n cartesianModelMatrix,\n nodeMatrix: matrix,\n indices: primitive.indices?.value,\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: primitive.indices?.value,\n attributeSpecificTransformation: transformVertexNormals,\n useCartesianPositions: false\n })\n );\n outputAttributes.texCoords = concatenateTypedArrays(\n outputAttributes.texCoords,\n flattenTexCoords(\n attributes.TEXCOORD_0 && attributes.TEXCOORD_0.value,\n primitive.indices?.value\n )\n );\n\n outputAttributes.colors = concatenateTypedArrays(\n outputAttributes.colors,\n flattenColors(attributes.COLOR_0, primitive.indices?.value)\n );\n\n outputAttributes.featureIndicesGroups = outputAttributes.featureIndicesGroups || [];\n outputAttributes.featureIndicesGroups.push(\n flattenBatchIds(getBatchIdsByAttributeName(attributes), primitive.indices?.value)\n );\n }\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 {Float32Array}\n */\nfunction transformVertexArray(args: {\n vertices: Float32Array;\n cartographicOrigin: number[];\n cartesianModelMatrix: number[];\n nodeMatrix: Matrix4;\n indices: Uint8Array;\n attributeSpecificTransformation: Function;\n useCartesianPositions: boolean;\n}) {\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: Float32Array, indices: Uint8Array): 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: Uint8Array\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 * 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: number[], indices: Uint8Array): 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 * Return batchIds based on possible attribute names for different kind of maps.\n * @param attributes - the gltf primitive attributes\n * @returns batch ids attribute\n */\nfunction getBatchIdsByAttributeName(attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n}): number[] {\n let batchIds: number[] = [];\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 batchIds = attributes[possibleBatchIdAttributeName].value;\n break;\n }\n }\n\n return batchIds;\n}\n\n/**\n * Convert GLTF material to I3S material definitions and textures\n * @param sourceMaterials Source GLTF materials\n * @returns Array of Couples I3SMaterialDefinition + texture content\n */\nfunction convertMaterials(\n sourceMaterials: GLTFMaterialPostprocessed[] = []\n): I3SMaterialWithTexture[] {\n const result: I3SMaterialWithTexture[] = [];\n for (const sourceMaterial of sourceMaterials) {\n result.push(convertMaterial(sourceMaterial));\n }\n return result;\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 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 }\n\n return {material, texture};\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 diffuse: diffuse.toArray(),\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]\n }\n ]\n };\n}\n\n/**\n * Formula for counting 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) {\n const {width, height} = texture.source?.image;\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 {void}\n */\nfunction makeFeatureIdsUnique(\n featureIds: number[],\n featureIndices: number[],\n featuresHashArray: string[],\n batchTable: {[key: string]: any}\n) {\n const replaceMap = getFeaturesReplaceMap(featureIds, batchTable, featuresHashArray);\n replaceIndicesByUnique(featureIndices, replaceMap);\n replaceIndicesByUnique(featureIds, replaceMap);\n}\n\n/**\n * Generate replace map to make featureIds unique.\n * @param {Array} featureIds\n * @param {Object} batchTable\n * @param {Array} featuresHashArray\n * @returns {Object}\n */\nfunction getFeaturesReplaceMap(featureIds, batchTable, featuresHashArray) {\n const featureMap = {};\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 {Object} batchTable\n * @param {Number} index\n * @returns {String}\n */\nfunction generateStringFromBatchTableByIndex(batchTable, index) {\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 {Number} index\n * @param {Object} batchTable\n * @param {Array} featuresHashArray\n * @returns {Number}\n */\nfunction getOrCreateUniqueFeatureId(index, batchTable, featuresHashArray) {\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 {Array} indicesArray\n * @param {Object} featureMap\n * @returns {void}\n */\nfunction replaceIndicesByUnique(indicesArray, featureMap) {\n for (let index = 0; index < indicesArray.length; index++) {\n indicesArray[index] = featureMap[indicesArray[index]];\n }\n}\n\n/**\n * Convert batch table data to attribute buffers.\n * @param {Object} batchTable - table with metadata for particular feature.\n * @param {Array} featureIds\n * @param {Array} attributeStorageInfo\n * @returns {Array} - Array of file buffers.\n */\nfunction convertBatchTableToAttributeBuffers(batchTable, featureIds, attributeStorageInfo) {\n const attributeBuffers: ArrayBuffer[] = [];\n\n if (batchTable) {\n const batchTableWithFeatureIds = {\n OBJECTID: featureIds,\n ...batchTable\n };\n\n for (const key in batchTableWithFeatureIds) {\n const type = getAttributeType(key, attributeStorageInfo);\n\n let attributeBuffer: ArrayBuffer | null = null;\n\n switch (type) {\n case OBJECT_ID_TYPE:\n case SHORT_INT_TYPE:\n attributeBuffer = generateShortIntegerAttributeBuffer(batchTableWithFeatureIds[key]);\n break;\n case DOUBLE_TYPE:\n attributeBuffer = generateDoubleAttributeBuffer(batchTableWithFeatureIds[key]);\n break;\n case STRING_TYPE:\n attributeBuffer = generateStringAttributeBuffer(batchTableWithFeatureIds[key]);\n break;\n default:\n attributeBuffer = generateStringAttributeBuffer(batchTableWithFeatureIds[key]);\n }\n\n if (attributeBuffer) {\n attributeBuffers.push(attributeBuffer);\n }\n }\n }\n\n return attributeBuffers;\n}\n/**\n * Return attribute type.\n * @param {String} key\n * @param {Array} attributeStorageInfo\n * @returns {String} attribute type.\n */\nfunction getAttributeType(key, attributeStorageInfo) {\n const attribute = attributeStorageInfo.find((attr) => attr.name === key);\n return attribute.attributeValues.valueType;\n}\n\n/**\n * Convert short integer to attribute arrayBuffer.\n * @param {Array} featureIds\n * @returns {ArrayBuffer} - Buffer with objectId data.\n */\nfunction generateShortIntegerAttributeBuffer(featureIds): 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 {Array} featureIds\n * @returns {ArrayBuffer} - Buffer with objectId data.\n */\nfunction generateDoubleAttributeBuffer(featureIds): 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 {Array} batchAttributes\n * @returns {ArrayBuffer} - Buffer with batch table data.\n */\nfunction generateStringAttributeBuffer(batchAttributes): 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 {Array} featureIds\n * @returns {BigUint64Array} - Array of feature ids in BigUint64 format.\n */\nfunction generateBigUint64Array(featureIds) {\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 {Number} vertexCount\n * @param {Object} convertedAttributes - get rid of this argument here\n * @param {Object} attributes - geometry attributes to compress\n * @param {string} dracoWorkerSoure - draco worker source code\n * @returns {Promise<object>} - COmpressed geometry.\n */\nasync function generateCompressedGeometry(\n vertexCount,\n convertedAttributes,\n attributes,\n dracoWorkerSoure\n) {\n const {positions, normals, texCoords, colors, 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 } = {\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 return encode({attributes: compressedAttributes, indices}, DracoWriterWorker, {\n ...DracoWriterWorker.options,\n source: dracoWorkerSoure,\n reuseWorkers: true,\n _nodeWorkers: true,\n draco: {\n method: 'MESH_SEQUENTIAL_ENCODING',\n attributesMetadata\n }\n });\n}\n\n/**\n * Generates ordered feature indices based on face range\n * @param {Uint32Array} featureIndex\n * @param {Uint32Array} faceRange\n * @returns {Uint32Array}\n */\nfunction generateFeatureIndexAttribute(featureIndex, faceRange) {\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"],"file":"geometry-converter.js"}
@@ -182,10 +182,11 @@ var I3SConverter = function () {
182
182
  return this.loadWorkers();
183
183
 
184
184
  case 17:
185
- _context.next = 19;
185
+ _context.prev = 17;
186
+ _context.next = 20;
186
187
  return this._fetchPreloadOptions();
187
188
 
188
- case 19:
189
+ case 20:
189
190
  preloadOptions = _context.sent;
190
191
  tilesetOptions = {
191
192
  loadOptions: {
@@ -202,34 +203,43 @@ var I3SConverter = function () {
202
203
  }
203
204
 
204
205
  Object.assign(tilesetOptions, preloadOptions);
205
- _context.next = 25;
206
+ _context.next = 26;
206
207
  return (0, _core.load)(inputUrl, this.Loader, tilesetOptions.loadOptions);
207
208
 
208
- case 25:
209
+ case 26:
209
210
  sourceTilesetJson = _context.sent;
210
211
  this.sourceTileset = new _tiles.Tileset3D(sourceTilesetJson, tilesetOptions);
211
- _context.next = 29;
212
+ _context.next = 30;
212
213
  return this._createAndSaveTileset(outputPath, tilesetName);
213
214
 
214
- case 29:
215
- _context.next = 31;
215
+ case 30:
216
+ _context.next = 32;
216
217
  return this._finishConversion({
217
218
  slpk: Boolean(slpk),
218
219
  outputPath: outputPath,
219
220
  tilesetName: tilesetName
220
221
  });
221
222
 
222
- case 31:
223
+ case 32:
224
+ return _context.abrupt("return", sourceTilesetJson);
225
+
226
+ case 35:
227
+ _context.prev = 35;
228
+ _context.t0 = _context["catch"](17);
229
+ throw _context.t0;
230
+
231
+ case 38:
232
+ _context.prev = 38;
223
233
  workerFarm = _workerUtils.WorkerFarm.getWorkerFarm({});
224
234
  workerFarm.destroy();
225
- return _context.abrupt("return", sourceTilesetJson);
235
+ return _context.finish(38);
226
236
 
227
- case 34:
237
+ case 42:
228
238
  case "end":
229
239
  return _context.stop();
230
240
  }
231
241
  }
232
- }, _callee, this);
242
+ }, _callee, this, [[17, 35, 38, 42]]);
233
243
  }));
234
244
 
235
245
  function convert(_x) {
@@ -1294,7 +1304,7 @@ var I3SConverter = function () {
1294
1304
  switch (_context15.prev = _context15.next) {
1295
1305
  case 0:
1296
1306
  if (!texture) {
1297
- _context15.next = 33;
1307
+ _context15.next = 25;
1298
1308
  break;
1299
1309
  }
1300
1310
 
@@ -1302,7 +1312,7 @@ var I3SConverter = function () {
1302
1312
  formats = [];
1303
1313
  textureData = texture.bufferView.data;
1304
1314
  _context15.t0 = format;
1305
- _context15.next = _context15.t0 === 'jpg' ? 7 : _context15.t0 === 'png' ? 7 : _context15.t0 === 'ktx2' ? 20 : 32;
1315
+ _context15.next = _context15.t0 === 'jpg' ? 7 : _context15.t0 === 'png' ? 7 : _context15.t0 === 'ktx2' ? 16 : 24;
1306
1316
  break;
1307
1317
 
1308
1318
  case 7:
@@ -1315,7 +1325,7 @@ var I3SConverter = function () {
1315
1325
 
1316
1326
  case 10:
1317
1327
  if (!this.generateTextures) {
1318
- _context15.next = 19;
1328
+ _context15.next = 15;
1319
1329
  break;
1320
1330
  }
1321
1331
 
@@ -1323,30 +1333,28 @@ var I3SConverter = function () {
1323
1333
  name: '1',
1324
1334
  format: 'ktx2'
1325
1335
  });
1326
- _context15.t1 = Uint8Array;
1336
+ ktx2TextureData = (0, _core.encode)(texture.image, _textures.KTX2BasisWriterWorker, _objectSpread(_objectSpread({}, _textures.KTX2BasisWriterWorker.options), {}, {
1337
+ source: this.workerSource.ktx2,
1338
+ reuseWorkers: true,
1339
+ _nodeWorkers: true
1340
+ }));
1327
1341
  _context15.next = 15;
1328
- return (0, _core.encode)(texture.image, _textures.KTX2BasisWriter);
1329
-
1330
- case 15:
1331
- _context15.t2 = _context15.sent;
1332
- ktx2TextureData = new _context15.t1(_context15.t2);
1333
- _context15.next = 19;
1334
1342
  return this.writeTextureFile(ktx2TextureData, '1', 'ktx2', childPath, slpkChildPath);
1335
1343
 
1336
- case 19:
1337
- return _context15.abrupt("break", 32);
1344
+ case 15:
1345
+ return _context15.abrupt("break", 24);
1338
1346
 
1339
- case 20:
1347
+ case 16:
1340
1348
  formats.push({
1341
1349
  name: '1',
1342
1350
  format: format
1343
1351
  });
1344
- _context15.next = 23;
1352
+ _context15.next = 19;
1345
1353
  return this.writeTextureFile(textureData, '1', format, childPath, slpkChildPath);
1346
1354
 
1347
- case 23:
1355
+ case 19:
1348
1356
  if (!this.generateTextures) {
1349
- _context15.next = 32;
1357
+ _context15.next = 24;
1350
1358
  break;
1351
1359
  }
1352
1360
 
@@ -1354,24 +1362,18 @@ var I3SConverter = function () {
1354
1362
  name: '0',
1355
1363
  format: 'jpg'
1356
1364
  });
1357
- _context15.t3 = Uint8Array;
1358
- _context15.next = 28;
1359
- return (0, _core.encode)(texture.image.data[0], _images.ImageWriter);
1360
-
1361
- case 28:
1362
- _context15.t4 = _context15.sent;
1363
- decodedFromKTX2TextureData = new _context15.t3(_context15.t4);
1364
- _context15.next = 32;
1365
+ decodedFromKTX2TextureData = (0, _core.encode)(texture.image.data[0], _images.ImageWriter);
1366
+ _context15.next = 24;
1365
1367
  return this.writeTextureFile(decodedFromKTX2TextureData, '0', 'jpg', childPath, slpkChildPath);
1366
1368
 
1367
- case 32:
1369
+ case 24:
1368
1370
  if (!this.layers0.textureSetDefinitions.length) {
1369
1371
  this.layers0.textureSetDefinitions.push({
1370
1372
  formats: formats
1371
1373
  });
1372
1374
  }
1373
1375
 
1374
- case 33:
1376
+ case 25:
1375
1377
  case "end":
1376
1378
  return _context15.stop();
1377
1379
  }
@@ -1844,7 +1846,7 @@ var I3SConverter = function () {
1844
1846
  key: "loadWorkers",
1845
1847
  value: function () {
1846
1848
  var _loadWorkers = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee21() {
1847
- var url, _sourceResponse, _source, i3sAttributesWorkerUrl, sourceResponse, source;
1849
+ var url, _sourceResponse, _source, _url, _sourceResponse2, _source2, i3sAttributesWorkerUrl, sourceResponse, source;
1848
1850
 
1849
1851
  return _regenerator.default.wrap(function _callee21$(_context21) {
1850
1852
  while (1) {
@@ -1871,21 +1873,40 @@ var I3SConverter = function () {
1871
1873
  this.workerSource.draco = _source;
1872
1874
 
1873
1875
  case 10:
1876
+ if (!this.generateTextures) {
1877
+ _context21.next = 19;
1878
+ break;
1879
+ }
1880
+
1881
+ _url = (0, _workerUtils.getWorkerURL)(_textures.KTX2BasisWriterWorker, _objectSpread({}, (0, _core.getLoaderOptions)()));
1882
+ _context21.next = 14;
1883
+ return (0, _core.fetchFile)(_url);
1884
+
1885
+ case 14:
1886
+ _sourceResponse2 = _context21.sent;
1887
+ _context21.next = 17;
1888
+ return _sourceResponse2.text();
1889
+
1890
+ case 17:
1891
+ _source2 = _context21.sent;
1892
+ this.workerSource.ktx2 = _source2;
1893
+
1894
+ case 19:
1874
1895
  i3sAttributesWorkerUrl = (0, _workerUtils.getWorkerURL)(_i3sAttributesWorker.I3SAttributesWorker, _objectSpread({}, (0, _core.getLoaderOptions)()));
1875
- _context21.next = 13;
1896
+ _context21.next = 22;
1876
1897
  return (0, _core.fetchFile)(i3sAttributesWorkerUrl);
1877
1898
 
1878
- case 13:
1899
+ case 22:
1879
1900
  sourceResponse = _context21.sent;
1880
- _context21.next = 16;
1901
+ _context21.next = 25;
1881
1902
  return sourceResponse.text();
1882
1903
 
1883
- case 16:
1904
+ case 25:
1884
1905
  source = _context21.sent;
1885
1906
  this.workerSource.I3SAttributes = source;
1886
1907
  console.log("Loading workers source completed!");
1887
1908
 
1888
- case 19:
1909
+ case 28:
1889
1910
  case "end":
1890
1911
  return _context21.stop();
1891
1912
  }