{"version":3,"file":"vendor.bim-fragment-cedcb83f.b065cbe6916d66a1.bundle.js","mappings":"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","sources":["webpack://client-app/./node_modules/bim-fragment/src/fragment-mesh.js","webpack://client-app/./node_modules/bim-fragment/src/fragment.js","webpack://client-app/./node_modules/bim-fragment/src/fragments-group.js","webpack://client-app/./node_modules/bim-fragment/src/geometry-utils.js"],"sourcesContent":["import { InstancedMesh, Color, } from \"three\";\r\nimport { GLTFExporter } from \"three/examples/jsm/exporters/GLTFExporter\";\r\nimport { BufferAttribute } from \"three/src/core/BufferAttribute\";\r\nexport class FragmentMesh extends InstancedMesh {\r\n constructor(geometry, material, count, fragment) {\r\n super(geometry, material, count);\r\n this.elementCount = 0;\r\n this.exportOptions = {\r\n trs: false,\r\n onlyVisible: false,\r\n truncateDrawRange: true,\r\n binary: true,\r\n maxTextureSize: 0,\r\n };\r\n this.exporter = new GLTFExporter();\r\n this.material = FragmentMesh.newMaterialArray(material);\r\n this.geometry = this.newFragmentGeometry(geometry);\r\n this.fragment = fragment;\r\n }\r\n exportData() {\r\n const position = this.geometry.attributes.position.array;\r\n const normal = this.geometry.attributes.normal.array;\r\n const blockID = Array.from(this.geometry.attributes.blockID.array);\r\n const index = Array.from(this.geometry.index.array);\r\n const groups = [];\r\n for (const group of this.geometry.groups) {\r\n const index = group.materialIndex || 0;\r\n const { start, count } = group;\r\n groups.push(start, count, index);\r\n }\r\n const materials = [];\r\n if (Array.isArray(this.material)) {\r\n for (const material of this.material) {\r\n const opacity = material.opacity;\r\n const transparent = material.transparent ? 1 : 0;\r\n const color = new Color(material.color).toArray();\r\n materials.push(opacity, transparent, ...color);\r\n }\r\n }\r\n const matrices = Array.from(this.instanceMatrix.array);\r\n let colors;\r\n if (this.instanceColor !== null) {\r\n colors = Array.from(this.instanceColor.array);\r\n }\r\n else {\r\n colors = [];\r\n }\r\n return {\r\n position,\r\n normal,\r\n index,\r\n blockID,\r\n groups,\r\n materials,\r\n matrices,\r\n colors,\r\n };\r\n }\r\n export() {\r\n const mesh = this;\r\n return new Promise((resolve) => {\r\n this.exporter.parse(mesh, (geometry) => resolve(geometry), (error) => console.log(error), this.exportOptions);\r\n });\r\n }\r\n newFragmentGeometry(geometry) {\r\n if (!geometry.index) {\r\n throw new Error(\"The geometry must be indexed!\");\r\n }\r\n if (!geometry.attributes.blockID) {\r\n const vertexSize = geometry.attributes.position.count;\r\n const array = new Uint16Array(vertexSize);\r\n array.fill(this.elementCount++);\r\n geometry.attributes.blockID = new BufferAttribute(array, 1);\r\n }\r\n const size = geometry.index.count;\r\n FragmentMesh.initializeGroups(geometry, size);\r\n return geometry;\r\n }\r\n static initializeGroups(geometry, size) {\r\n if (!geometry.groups.length) {\r\n geometry.groups.push({\r\n start: 0,\r\n count: size,\r\n materialIndex: 0,\r\n });\r\n }\r\n }\r\n static newMaterialArray(material) {\r\n if (!Array.isArray(material))\r\n material = [material];\r\n return material;\r\n }\r\n}\r\n//# sourceMappingURL=fragment-mesh.js.map","import * as THREE from \"three\";\r\nimport { FragmentMesh } from \"./fragment-mesh\";\r\nimport { Blocks } from \"./blocks\";\r\nimport { BVH } from \"./bvh\";\r\n/*\r\n * Fragments can contain one or multiple Instances of one or multiple Blocks\r\n * Each Instance is identified by an instanceID (property of THREE.InstancedMesh)\r\n * Each Block identified by a blockID (custom bufferAttribute per vertex)\r\n * Both instanceId and blockId are unsigned integers starting at 0 and going up sequentially\r\n * A specific Block of a specific Instance is an Item, identified by an itemID\r\n *\r\n * For example:\r\n * Imagine a fragment mesh with 8 instances and 2 elements (16 items, identified from A to P)\r\n * It will have instanceIds from 0 to 8, and blockIds from 0 to 2\r\n * If we raycast it, we will get an instanceId and the index of the found triangle\r\n * We can use the index to get the blockId for that triangle\r\n * Combining instanceId and blockId using the elementMap will give us the itemId\r\n * The items will look like this:\r\n *\r\n * [ A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P ]\r\n *\r\n * Where the criteria to sort the items is the following (Y-axis is instance, X-axis is block):\r\n *\r\n * A C E G I K M O\r\n * B D F H J L N P\r\n * */\r\nexport class Fragment {\r\n get ids() {\r\n const ids = new Set();\r\n for (const id of this.items) {\r\n ids.add(id);\r\n }\r\n for (const id in this.hiddenInstances) {\r\n ids.add(id);\r\n }\r\n return ids;\r\n }\r\n constructor(geometry, material, count) {\r\n this.fragments = {};\r\n this.items = [];\r\n this.hiddenInstances = {};\r\n // When multiple instances represent the same object\r\n // this allows to create a composite ID for each instance\r\n // E.g. all the steps in a stair are a single thing\r\n // so if the ID of the stair is asdf, then each step could be\r\n // asdf.1, asdf.2, asdf.3, etc\r\n // the value is the number of instances\r\n this.composites = {};\r\n this.mesh = new FragmentMesh(geometry, material, count, this);\r\n this.id = this.mesh.uuid;\r\n this.capacity = count;\r\n this.blocks = new Blocks(this);\r\n BVH.apply(geometry);\r\n }\r\n dispose(disposeResources = true) {\r\n this.items = null;\r\n this.group = undefined;\r\n if (this.mesh) {\r\n if (disposeResources) {\r\n this.mesh.material.forEach((mat) => mat.dispose());\r\n this.mesh.material = [];\r\n BVH.dispose(this.mesh.geometry);\r\n this.mesh.geometry.dispose();\r\n this.mesh.geometry = null;\r\n }\r\n this.mesh.removeFromParent();\r\n this.mesh.dispose();\r\n this.mesh.fragment = null;\r\n this.mesh = null;\r\n }\r\n this.disposeNestedFragments();\r\n }\r\n getItemID(instanceID, blockID) {\r\n const index = this.getItemIndex(instanceID, blockID);\r\n return this.items[index];\r\n }\r\n getInstanceAndBlockID(itemID) {\r\n const index = this.items.indexOf(itemID);\r\n const instanceID = this.getInstanceIDFromIndex(index);\r\n const blockID = index % this.blocks.count;\r\n return { instanceID, blockID };\r\n }\r\n getVertexBlockID(geometry, index) {\r\n const blocks = geometry.attributes.blockID;\r\n return blocks.array[index];\r\n }\r\n getItemData(itemID) {\r\n const index = this.items.indexOf(itemID);\r\n const instanceID = Math.ceil(index / this.blocks.count);\r\n const blockID = index % this.blocks.count;\r\n return { instanceID, blockID };\r\n }\r\n getInstance(instanceID, matrix) {\r\n return this.mesh.getMatrixAt(instanceID, matrix);\r\n }\r\n setInstance(instanceID, items) {\r\n this.checkIfInstanceExist(instanceID);\r\n this.mesh.setMatrixAt(instanceID, items.transform);\r\n this.mesh.instanceMatrix.needsUpdate = true;\r\n if (items.color && this.mesh.instanceColor) {\r\n this.mesh.setColorAt(instanceID, items.color);\r\n this.mesh.instanceColor.needsUpdate = true;\r\n }\r\n if (items.ids) {\r\n this.saveItemsInMap(items.ids, instanceID);\r\n }\r\n }\r\n addInstances(items) {\r\n this.resizeCapacityIfNeeded(items.length);\r\n const start = this.mesh.count;\r\n this.mesh.count += items.length;\r\n for (let i = 0; i < items.length; i++) {\r\n this.setInstance(start + i, items[i]);\r\n }\r\n }\r\n removeInstances(itemsIDs) {\r\n if (this.mesh.count <= 1) {\r\n this.clear();\r\n return;\r\n }\r\n this.deleteAndRearrangeInstances(itemsIDs);\r\n this.mesh.count -= itemsIDs.length;\r\n this.mesh.instanceMatrix.needsUpdate = true;\r\n }\r\n clear() {\r\n this.mesh.clear();\r\n this.mesh.count = 0;\r\n this.items = [];\r\n }\r\n addFragment(id, material = this.mesh.material) {\r\n const newGeometry = this.initializeGeometry();\r\n if (material === this.mesh.material) {\r\n this.copyGroups(newGeometry);\r\n }\r\n const newFragment = new Fragment(newGeometry, material, this.capacity);\r\n newFragment.mesh.applyMatrix4(this.mesh.matrix);\r\n newFragment.mesh.updateMatrix();\r\n this.fragments[id] = newFragment;\r\n return this.fragments[id];\r\n }\r\n removeFragment(id) {\r\n const fragment = this.fragments[id];\r\n if (fragment) {\r\n fragment.dispose(false);\r\n delete this.fragments[id];\r\n }\r\n }\r\n resetVisibility() {\r\n if (this.blocks.count > 1) {\r\n this.blocks.setVisibility(true);\r\n }\r\n else {\r\n const hiddenInstances = Object.keys(this.hiddenInstances);\r\n this.makeInstancesVisible(hiddenInstances);\r\n this.hiddenInstances = {};\r\n }\r\n }\r\n setVisibility(visible, itemIDs = this.ids) {\r\n if (this.blocks.count > 1) {\r\n this.blocks.setVisibility(visible, itemIDs);\r\n }\r\n else {\r\n this.toggleInstanceVisibility(visible, itemIDs);\r\n }\r\n }\r\n resize(size) {\r\n var _a;\r\n const newMesh = this.createFragmentMeshWithNewSize(size);\r\n this.capacity = size;\r\n const oldMesh = this.mesh;\r\n (_a = oldMesh.parent) === null || _a === void 0 ? void 0 : _a.add(newMesh);\r\n oldMesh.removeFromParent();\r\n this.mesh = newMesh;\r\n oldMesh.dispose();\r\n }\r\n exportData() {\r\n const geometry = this.mesh.exportData();\r\n const ids = this.items.join(\"|\");\r\n const id = this.id;\r\n return { ...geometry, ids, id };\r\n }\r\n copyGroups(newGeometry) {\r\n newGeometry.groups = [];\r\n for (const group of this.mesh.geometry.groups) {\r\n newGeometry.groups.push({ ...group });\r\n }\r\n }\r\n initializeGeometry() {\r\n const newGeometry = new THREE.BufferGeometry();\r\n newGeometry.setAttribute(\"position\", this.mesh.geometry.attributes.position);\r\n newGeometry.setAttribute(\"normal\", this.mesh.geometry.attributes.normal);\r\n newGeometry.setAttribute(\"blockID\", this.mesh.geometry.attributes.blockID);\r\n newGeometry.setIndex(Array.from(this.mesh.geometry.index.array));\r\n return newGeometry;\r\n }\r\n saveItemsInMap(ids, instanceId) {\r\n this.checkBlockNumberValid(ids);\r\n let counter = 0;\r\n for (const id of ids) {\r\n const index = this.getItemIndex(instanceId, counter);\r\n this.items[index] = id;\r\n counter++;\r\n }\r\n }\r\n resizeCapacityIfNeeded(newSize) {\r\n const necessaryCapacity = newSize + this.mesh.count;\r\n if (necessaryCapacity > this.capacity) {\r\n this.resize(necessaryCapacity);\r\n }\r\n }\r\n createFragmentMeshWithNewSize(capacity) {\r\n const newMesh = new FragmentMesh(this.mesh.geometry, this.mesh.material, capacity, this);\r\n newMesh.count = this.mesh.count;\r\n return newMesh;\r\n }\r\n disposeNestedFragments() {\r\n const fragments = Object.values(this.fragments);\r\n for (let i = 0; i < fragments.length; i++) {\r\n fragments[i].dispose();\r\n }\r\n this.fragments = {};\r\n }\r\n checkBlockNumberValid(ids) {\r\n if (ids.length > this.blocks.count) {\r\n throw new Error(`You passed more items (${ids.length}) than blocks in this instance (${this.blocks.count})`);\r\n }\r\n }\r\n checkIfInstanceExist(index) {\r\n if (index > this.mesh.count) {\r\n throw new Error(`The given index (${index}) exceeds the instances in this fragment (${this.mesh.count})`);\r\n }\r\n }\r\n // Assigns the index of the removed instance to the last instance\r\n // F.e. let there be 6 instances: (A) (B) (C) (D) (E) (F)\r\n // If instance (C) is removed: -> (A) (B) (F) (D) (E)\r\n deleteAndRearrangeInstances(ids) {\r\n const deletedItems = [];\r\n for (const id of ids) {\r\n const deleted = this.deleteAndRearrange(id);\r\n if (deleted) {\r\n deletedItems.push(deleted);\r\n }\r\n }\r\n for (const id of ids) {\r\n delete this.hiddenInstances[id];\r\n }\r\n return deletedItems;\r\n }\r\n deleteAndRearrange(id) {\r\n const index = this.items.indexOf(id);\r\n if (index === -1)\r\n return null;\r\n this.mesh.count--;\r\n const isLastElement = index === this.mesh.count;\r\n const instanceId = this.getInstanceIDFromIndex(index);\r\n const tempMatrix = new THREE.Matrix4();\r\n const tempColor = new THREE.Color();\r\n const transform = new THREE.Matrix4();\r\n this.mesh.getMatrixAt(instanceId, transform);\r\n const result = { ids: [id], transform };\r\n if (this.mesh.instanceColor) {\r\n const color = new THREE.Color();\r\n this.mesh.getColorAt(instanceId, color);\r\n result.color = color;\r\n }\r\n if (isLastElement) {\r\n this.items.pop();\r\n return result;\r\n }\r\n const lastElement = this.mesh.count;\r\n this.items[index] = this.items[lastElement];\r\n this.items.pop();\r\n this.mesh.getMatrixAt(lastElement, tempMatrix);\r\n this.mesh.setMatrixAt(instanceId, tempMatrix);\r\n this.mesh.instanceMatrix.needsUpdate = true;\r\n if (this.mesh.instanceColor) {\r\n this.mesh.getColorAt(lastElement, tempColor);\r\n this.mesh.setColorAt(instanceId, tempColor);\r\n this.mesh.instanceColor.needsUpdate = true;\r\n }\r\n return result;\r\n }\r\n getItemIndex(instanceId, blockId) {\r\n return instanceId * this.blocks.count + blockId;\r\n }\r\n getInstanceIDFromIndex(itemIndex) {\r\n return Math.trunc(itemIndex / this.blocks.count);\r\n }\r\n toggleInstanceVisibility(visible, itemIDs) {\r\n if (visible) {\r\n this.makeInstancesVisible(itemIDs);\r\n }\r\n else {\r\n this.makeInstancesInvisible(itemIDs);\r\n }\r\n }\r\n makeInstancesInvisible(itemIDs) {\r\n itemIDs = this.filterHiddenItems(itemIDs, false);\r\n const deletedItems = this.deleteAndRearrangeInstances(itemIDs);\r\n for (const item of deletedItems) {\r\n if (item.ids) {\r\n this.hiddenInstances[item.ids[0]] = item;\r\n }\r\n }\r\n }\r\n makeInstancesVisible(itemIDs) {\r\n const items = [];\r\n itemIDs = this.filterHiddenItems(itemIDs, true);\r\n for (const id of itemIDs) {\r\n const found = this.hiddenInstances[id];\r\n if (found !== undefined) {\r\n items.push(found);\r\n delete this.hiddenInstances[id];\r\n }\r\n }\r\n this.addInstances(items);\r\n }\r\n filterHiddenItems(itemIDs, hidden) {\r\n const hiddenItems = Object.keys(this.hiddenInstances);\r\n const result = [];\r\n for (const id of itemIDs) {\r\n const isHidden = hidden && hiddenItems.includes(id);\r\n const isNotHidden = !hidden && !hiddenItems.includes(id);\r\n if (isHidden || isNotHidden) {\r\n result.push(id);\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n//# sourceMappingURL=fragment.js.map","import * as THREE from \"three\";\r\n// TODO: Document this\r\nexport class FragmentsGroup extends THREE.Group {\r\n constructor() {\r\n super(...arguments);\r\n this.items = [];\r\n this.boundingBox = new THREE.Box3();\r\n this.coordinationMatrix = new THREE.Matrix4();\r\n this.keyFragments = {};\r\n // data: [expressID: number]: [keys, rels]\r\n this.data = {};\r\n this.ifcMetadata = {\r\n name: \"\",\r\n description: \"\",\r\n schema: \"IFC2X3\",\r\n maxExpressID: 0,\r\n };\r\n }\r\n // TODO: Force all item IDs to be numbers or strings\r\n getFragmentMap(expressIDs) {\r\n const fragmentMap = {};\r\n for (const expressID of expressIDs) {\r\n const data = this.data[expressID];\r\n if (!data)\r\n continue;\r\n for (const key of data[0]) {\r\n const fragmentID = this.keyFragments[key];\r\n if (!fragmentMap[fragmentID])\r\n fragmentMap[fragmentID] = new Set();\r\n fragmentMap[fragmentID].add(expressID);\r\n }\r\n }\r\n return fragmentMap;\r\n }\r\n dispose(disposeResources = true) {\r\n for (const fragment of this.items) {\r\n fragment.dispose(disposeResources);\r\n }\r\n this.coordinationMatrix = new THREE.Matrix4();\r\n this.keyFragments = {};\r\n this.data = {};\r\n this.properties = {};\r\n }\r\n}\r\n//# sourceMappingURL=fragments-group.js.map","import { BufferAttribute, BufferGeometry } from \"three\";\r\nimport { mergeGeometries } from \"three/examples/jsm/utils/BufferGeometryUtils\";\r\nexport class GeometryUtils {\r\n static merge(geometriesByMaterial, splitByBlocks = false) {\r\n const geometriesByMat = [];\r\n const sizes = [];\r\n for (const geometries of geometriesByMaterial) {\r\n const merged = this.mergeGeomsOfSameMaterial(geometries, splitByBlocks);\r\n geometriesByMat.push(merged);\r\n sizes.push(merged.index.count);\r\n }\r\n const geometry = mergeGeometries(geometriesByMat);\r\n this.setupMaterialGroups(sizes, geometry);\r\n this.cleanUp(geometriesByMat);\r\n return geometry;\r\n }\r\n // When Three.js exports to glTF, it generates one separate mesh per material. All meshes\r\n // share the same BufferAttributes and have different indices\r\n static async mergeGltfMeshes(meshes) {\r\n const geometry = new BufferGeometry();\r\n const attributes = meshes[0].geometry.attributes;\r\n this.getMeshesAttributes(geometry, attributes);\r\n this.getMeshesIndices(geometry, meshes);\r\n return geometry;\r\n }\r\n static getMeshesAttributes(geometry, attributes) {\r\n // Three.js GLTFExporter exports custom BufferAttributes as underscore lowercase\r\n // eslint-disable-next-line no-underscore-dangle\r\n geometry.setAttribute(\"blockID\", attributes._blockid);\r\n geometry.setAttribute(\"position\", attributes.position);\r\n geometry.setAttribute(\"normal\", attributes.normal);\r\n geometry.groups = [];\r\n }\r\n static getMeshesIndices(geometry, meshes) {\r\n const counter = { index: 0, material: 0 };\r\n const indices = [];\r\n for (const mesh of meshes) {\r\n const index = mesh.geometry.index;\r\n this.getIndicesOfMesh(index, indices);\r\n this.getMeshGroup(geometry, counter, index);\r\n this.cleanUpMesh(mesh);\r\n }\r\n geometry.setIndex(indices);\r\n }\r\n static getMeshGroup(geometry, counter, index) {\r\n geometry.groups.push({\r\n start: counter.index,\r\n count: index.count,\r\n materialIndex: counter.material++,\r\n });\r\n counter.index += index.count;\r\n }\r\n static cleanUpMesh(mesh) {\r\n mesh.geometry.setIndex([]);\r\n mesh.geometry.attributes = {};\r\n mesh.geometry.dispose();\r\n }\r\n static getIndicesOfMesh(index, indices) {\r\n for (const number of index.array) {\r\n indices.push(number);\r\n }\r\n }\r\n static cleanUp(geometries) {\r\n geometries.forEach((geometry) => geometry.dispose());\r\n geometries.length = 0;\r\n }\r\n static setupMaterialGroups(sizes, geometry) {\r\n let vertexCounter = 0;\r\n let counter = 0;\r\n for (const size of sizes) {\r\n const group = {\r\n start: vertexCounter,\r\n count: size,\r\n materialIndex: counter++,\r\n };\r\n geometry.groups.push(group);\r\n vertexCounter += size;\r\n }\r\n }\r\n static mergeGeomsOfSameMaterial(geometries, splitByBlocks) {\r\n this.checkAllGeometriesAreIndexed(geometries);\r\n if (splitByBlocks) {\r\n this.splitByBlocks(geometries);\r\n }\r\n const merged = mergeGeometries(geometries);\r\n this.cleanUp(geometries);\r\n return merged;\r\n }\r\n static splitByBlocks(geometries) {\r\n let i = 0;\r\n for (const geometry of geometries) {\r\n const size = geometry.attributes.position.count;\r\n // TODO: Substitute blockID attribute by block id map\r\n const array = new Uint16Array(size).fill(i++);\r\n geometry.setAttribute(\"blockID\", new BufferAttribute(array, 1));\r\n }\r\n }\r\n static checkAllGeometriesAreIndexed(geometries) {\r\n for (const geometry of geometries) {\r\n if (!geometry.index) {\r\n throw new Error(\"All geometries must be indexed!\");\r\n }\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=geometry-utils.js.map"],"names":["FragmentMesh","InstancedMesh","constructor","geometry","material","count","fragment","super","this","elementCount","exportOptions","trs","onlyVisible","truncateDrawRange","binary","maxTextureSize","exporter","newMaterialArray","newFragmentGeometry","exportData","position","attributes","array","normal","blockID","Array","from","index","groups","group","materialIndex","start","push","materials","isArray","opacity","transparent","color","Color","toArray","matrices","instanceMatrix","colors","instanceColor","export","mesh","Promise","resolve","parse","error","console","log","Error","vertexSize","Uint16Array","fill","size","initializeGroups","static","length","Fragment","ids","Set","id","items","add","hiddenInstances","fragments","composites","uuid","capacity","blocks","dispose","disposeResources","undefined","forEach","mat","removeFromParent","disposeNestedFragments","getItemID","instanceID","getItemIndex","getInstanceAndBlockID","itemID","indexOf","getInstanceIDFromIndex","getVertexBlockID","getItemData","Math","ceil","getInstance","matrix","getMatrixAt","setInstance","checkIfInstanceExist","setMatrixAt","transform","needsUpdate","setColorAt","saveItemsInMap","addInstances","resizeCapacityIfNeeded","i","removeInstances","itemsIDs","clear","deleteAndRearrangeInstances","addFragment","newGeometry","initializeGeometry","copyGroups","newFragment","applyMatrix4","updateMatrix","removeFragment","resetVisibility","setVisibility","Object","keys","makeInstancesVisible","visible","itemIDs","toggleInstanceVisibility","resize","_a","newMesh","createFragmentMeshWithNewSize","oldMesh","parent","join","setAttribute","setIndex","instanceId","checkBlockNumberValid","counter","newSize","necessaryCapacity","values","deletedItems","deleted","deleteAndRearrange","isLastElement","tempMatrix","tempColor","result","getColorAt","pop","lastElement","blockId","itemIndex","trunc","makeInstancesInvisible","filterHiddenItems","item","found","hidden","hiddenItems","isHidden","includes","isNotHidden","FragmentsGroup","arguments","boundingBox","coordinationMatrix","keyFragments","data","ifcMetadata","name","description","schema","maxExpressID","getFragmentMap","expressIDs","fragmentMap","expressID","key","fragmentID","properties","GeometryUtils","geometriesByMaterial","splitByBlocks","geometriesByMat","sizes","geometries","merged","mergeGeomsOfSameMaterial","setupMaterialGroups","cleanUp","meshes","BufferGeometry","getMeshesAttributes","getMeshesIndices","_blockid","indices","getIndicesOfMesh","getMeshGroup","cleanUpMesh","number","vertexCounter","checkAllGeometriesAreIndexed","BufferAttribute"],"sourceRoot":""}