1 |
- {"ast":null,"code":"import { Vector3 } from \"../Maths/math.vector.js\";\nimport { VertexBuffer } from \"../Buffers/buffer.js\";\nimport { SubMesh } from \"../Meshes/subMesh.js\";\nimport { Mesh } from \"../Meshes/mesh.js\";\nimport { AsyncLoop } from \"../Misc/tools.js\";\nimport { Epsilon } from \"../Maths/math.constants.js\";\n/**\n * Class used to specify simplification options\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\n */\nexport class SimplificationSettings {\n /**\n * Creates a SimplificationSettings\n * @param quality expected quality\n * @param distance distance when this optimized version should be used\n * @param optimizeMesh already optimized mesh\n */\n constructor( /** expected quality */\n quality, /** distance when this optimized version should be used */\n distance, /** already optimized mesh */\n optimizeMesh) {\n this.quality = quality;\n this.distance = distance;\n this.optimizeMesh = optimizeMesh;\n }\n}\n/**\n * Queue used to order the simplification tasks\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\n */\nexport class SimplificationQueue {\n /**\n * Creates a new queue\n */\n constructor() {\n this.running = false;\n this._simplificationArray = [];\n }\n /**\n * Adds a new simplification task\n * @param task defines a task to add\n */\n addTask(task) {\n this._simplificationArray.push(task);\n }\n /**\n * Execute next task\n */\n executeNext() {\n const task = this._simplificationArray.pop();\n if (task) {\n this.running = true;\n this.runSimplification(task);\n } else {\n this.running = false;\n }\n }\n /**\n * Execute a simplification task\n * @param task defines the task to run\n */\n runSimplification(task) {\n if (task.parallelProcessing) {\n //parallel simplifier\n task.settings.forEach(setting => {\n const simplifier = this._getSimplifier(task);\n simplifier.simplify(setting, newMesh => {\n if (setting.distance !== undefined) {\n task.mesh.addLODLevel(setting.distance, newMesh);\n }\n newMesh.isVisible = true;\n //check if it is the last\n if (setting.quality === task.settings[task.settings.length - 1].quality && task.successCallback) {\n //all done, run the success callback.\n task.successCallback();\n }\n this.executeNext();\n });\n });\n } else {\n //single simplifier.\n const simplifier = this._getSimplifier(task);\n const runDecimation = (setting, callback) => {\n simplifier.simplify(setting, newMesh => {\n if (setting.distance !== undefined) {\n task.mesh.addLODLevel(setting.distance, newMesh);\n }\n newMesh.isVisible = true;\n //run the next quality level\n callback();\n });\n };\n AsyncLoop.Run(task.settings.length, loop => {\n runDecimation(task.settings[loop.index], () => {\n loop.executeNext();\n });\n }, () => {\n //execution ended, run the success callback.\n if (task.successCallback) {\n task.successCallback();\n }\n this.executeNext();\n });\n }\n }\n _getSimplifier(task) {\n switch (task.simplificationType) {\n case 0 /* SimplificationType.QUADRATIC */:\n default:\n return new QuadraticErrorSimplification(task.mesh);\n }\n }\n}\n/**\n * The implemented types of simplification\n * At the moment only Quadratic Error Decimation is implemented\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\n */\nexport var SimplificationType;\n(function (SimplificationType) {\n /** Quadratic error decimation */\n SimplificationType[SimplificationType[\"QUADRATIC\"] = 0] = \"QUADRATIC\";\n})(SimplificationType || (SimplificationType = {}));\nclass DecimationTriangle {\n constructor(_vertices) {\n this._vertices = _vertices;\n this.error = new Array(4);\n this.deleted = false;\n this.isDirty = false;\n this.deletePending = false;\n this.borderFactor = 0;\n }\n}\nclass DecimationVertex {\n constructor(position, id) {\n this.position = position;\n this.id = id;\n this.isBorder = true;\n this.q = new QuadraticMatrix();\n this.triangleCount = 0;\n this.triangleStart = 0;\n this.originalOffsets = [];\n }\n updatePosition(newPosition) {\n this.position.copyFrom(newPosition);\n }\n}\nclass QuadraticMatrix {\n constructor(data) {\n this.data = new Array(10);\n for (let i = 0; i < 10; ++i) {\n if (data && data[i]) {\n this.data[i] = data[i];\n } else {\n this.data[i] = 0;\n }\n }\n }\n det(a11, a12, a13, a21, a22, a23, a31, a32, a33) {\n const det = this.data[a11] * this.data[a22] * this.data[a33] + this.data[a13] * this.data[a21] * this.data[a32] + this.data[a12] * this.data[a23] * this.data[a31] - this.data[a13] * this.data[a22] * this.data[a31] - this.data[a11] * this.data[a23] * this.data[a32] - this.data[a12] * this.data[a21] * this.data[a33];\n return det;\n }\n addInPlace(matrix) {\n for (let i = 0; i < 10; ++i) {\n this.data[i] += matrix.data[i];\n }\n }\n addArrayInPlace(data) {\n for (let i = 0; i < 10; ++i) {\n this.data[i] += data[i];\n }\n }\n add(matrix) {\n const m = new QuadraticMatrix();\n for (let i = 0; i < 10; ++i) {\n m.data[i] = this.data[i] + matrix.data[i];\n }\n return m;\n }\n static FromData(a, b, c, d) {\n return new QuadraticMatrix(QuadraticMatrix.DataFromNumbers(a, b, c, d));\n }\n //returning an array to avoid garbage collection\n static DataFromNumbers(a, b, c, d) {\n return [a * a, a * b, a * c, a * d, b * b, b * c, b * d, c * c, c * d, d * d];\n }\n}\nclass Reference {\n constructor(vertexId, triangleId) {\n this.vertexId = vertexId;\n this.triangleId = triangleId;\n }\n}\n/**\n * An implementation of the Quadratic Error simplification algorithm.\n * Original paper : http://www1.cs.columbia.edu/~cs4162/html05s/garland97.pdf\n * Ported mostly from QSlim and http://voxels.blogspot.de/2014/05/quadric-mesh-simplification-with-source.html to babylon JS\n * @author RaananW\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\n */\nexport class QuadraticErrorSimplification {\n /**\n * Creates a new QuadraticErrorSimplification\n * @param _mesh defines the target mesh\n */\n constructor(_mesh) {\n this._mesh = _mesh;\n /** Gets or sets the number pf sync iterations */\n this.syncIterations = 5000;\n this.aggressiveness = 7;\n this.decimationIterations = 100;\n this.boundingBoxEpsilon = Epsilon;\n }\n /**\n * Simplification of a given mesh according to the given settings.\n * Since this requires computation, it is assumed that the function runs async.\n * @param settings The settings of the simplification, including quality and distance\n * @param successCallback A callback that will be called after the mesh was simplified.\n */\n simplify(settings, successCallback) {\n this._initDecimatedMesh();\n //iterating through the submeshes array, one after the other.\n AsyncLoop.Run(this._mesh.subMeshes.length, loop => {\n this._initWithMesh(loop.index, () => {\n this._runDecimation(settings, loop.index, () => {\n loop.executeNext();\n });\n }, settings.optimizeMesh);\n }, () => {\n setTimeout(() => {\n successCallback(this._reconstructedMesh);\n }, 0);\n });\n }\n _runDecimation(settings, submeshIndex, successCallback) {\n const targetCount = ~~(this._triangles.length * settings.quality);\n let deletedTriangles = 0;\n const triangleCount = this._triangles.length;\n const iterationFunction = (iteration, callback) => {\n setTimeout(() => {\n if (iteration % 5 === 0) {\n this._updateMesh(iteration === 0);\n }\n for (let i = 0; i < this._triangles.length; ++i) {\n this._triangles[i].isDirty = false;\n }\n const threshold = 0.000000001 * Math.pow(iteration + 3, this.aggressiveness);\n const trianglesIterator = i => {\n const tIdx = ~~((this._triangles.length / 2 + i) % this._triangles.length);\n const t = this._triangles[tIdx];\n if (!t) {\n return;\n }\n if (t.error[3] > threshold || t.deleted || t.isDirty) {\n return;\n }\n for (let j = 0; j < 3; ++j) {\n if (t.error[j] < threshold) {\n const deleted0 = [];\n const deleted1 = [];\n const v0 = t._vertices[j];\n const v1 = t._vertices[(j + 1) % 3];\n if (v0.isBorder || v1.isBorder) {\n continue;\n }\n const p = Vector3.Zero();\n // var n = Vector3.Zero();\n // var uv = Vector2.Zero();\n // var color = new Color4(0, 0, 0, 1);\n this._calculateError(v0, v1, p);\n const delTr = [];\n if (this._isFlipped(v0, v1, p, deleted0, delTr)) {\n continue;\n }\n if (this._isFlipped(v1, v0, p, deleted1, delTr)) {\n continue;\n }\n if (deleted0.indexOf(true) < 0 || deleted1.indexOf(true) < 0) {\n continue;\n }\n const uniqueArray = [];\n delTr.forEach(deletedT => {\n if (uniqueArray.indexOf(deletedT) === -1) {\n deletedT.deletePending = true;\n uniqueArray.push(deletedT);\n }\n });\n if (uniqueArray.length % 2 !== 0) {\n continue;\n }\n v0.q = v1.q.add(v0.q);\n v0.updatePosition(p);\n const tStart = this._references.length;\n deletedTriangles = this._updateTriangles(v0, v0, deleted0, deletedTriangles);\n deletedTriangles = this._updateTriangles(v0, v1, deleted1, deletedTriangles);\n const tCount = this._references.length - tStart;\n if (tCount <= v0.triangleCount) {\n if (tCount) {\n for (let c = 0; c < tCount; c++) {\n this._references[v0.triangleStart + c] = this._references[tStart + c];\n }\n }\n } else {\n v0.triangleStart = tStart;\n }\n v0.triangleCount = tCount;\n break;\n }\n }\n };\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, trianglesIterator, callback, () => {\n return triangleCount - deletedTriangles <= targetCount;\n });\n }, 0);\n };\n AsyncLoop.Run(this.decimationIterations, loop => {\n if (triangleCount - deletedTriangles <= targetCount) {\n loop.breakLoop();\n } else {\n iterationFunction(loop.index, () => {\n loop.executeNext();\n });\n }\n }, () => {\n setTimeout(() => {\n //reconstruct this part of the mesh\n this._reconstructMesh(submeshIndex);\n successCallback();\n }, 0);\n });\n }\n _initWithMesh(submeshIndex, callback, optimizeMesh) {\n this._vertices = [];\n this._triangles = [];\n const positionData = this._mesh.getVerticesData(VertexBuffer.PositionKind);\n const indices = this._mesh.getIndices();\n const submesh = this._mesh.subMeshes[submeshIndex];\n const findInVertices = positionToSearch => {\n if (optimizeMesh) {\n for (let ii = 0; ii < this._vertices.length; ++ii) {\n if (this._vertices[ii].position.equalsWithEpsilon(positionToSearch, 0.0001)) {\n return this._vertices[ii];\n }\n }\n }\n return null;\n };\n const vertexReferences = [];\n const vertexInit = i => {\n if (!positionData) {\n return;\n }\n const offset = i + submesh.verticesStart;\n const position = Vector3.FromArray(positionData, offset * 3);\n const vertex = findInVertices(position) || new DecimationVertex(position, this._vertices.length);\n vertex.originalOffsets.push(offset);\n if (vertex.id === this._vertices.length) {\n this._vertices.push(vertex);\n }\n vertexReferences.push(vertex.id);\n };\n //var totalVertices = mesh.getTotalVertices();\n const totalVertices = submesh.verticesCount;\n AsyncLoop.SyncAsyncForLoop(totalVertices, this.syncIterations / 4 >> 0, vertexInit, () => {\n const indicesInit = i => {\n if (!indices) {\n return;\n }\n const offset = submesh.indexStart / 3 + i;\n const pos = offset * 3;\n const i0 = indices[pos + 0];\n const i1 = indices[pos + 1];\n const i2 = indices[pos + 2];\n const v0 = this._vertices[vertexReferences[i0 - submesh.verticesStart]];\n const v1 = this._vertices[vertexReferences[i1 - submesh.verticesStart]];\n const v2 = this._vertices[vertexReferences[i2 - submesh.verticesStart]];\n const triangle = new DecimationTriangle([v0, v1, v2]);\n triangle.originalOffset = pos;\n this._triangles.push(triangle);\n };\n AsyncLoop.SyncAsyncForLoop(submesh.indexCount / 3, this.syncIterations, indicesInit, () => {\n this._init(callback);\n });\n });\n }\n _init(callback) {\n const triangleInit1 = i => {\n const t = this._triangles[i];\n t.normal = Vector3.Cross(t._vertices[1].position.subtract(t._vertices[0].position), t._vertices[2].position.subtract(t._vertices[0].position)).normalize();\n for (let j = 0; j < 3; j++) {\n t._vertices[j].q.addArrayInPlace(QuadraticMatrix.DataFromNumbers(t.normal.x, t.normal.y, t.normal.z, -Vector3.Dot(t.normal, t._vertices[0].position)));\n }\n };\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit1, () => {\n const triangleInit2 = i => {\n const t = this._triangles[i];\n for (let j = 0; j < 3; ++j) {\n t.error[j] = this._calculateError(t._vertices[j], t._vertices[(j + 1) % 3]);\n }\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\n };\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit2, () => {\n callback();\n });\n });\n }\n _reconstructMesh(submeshIndex) {\n const newTriangles = [];\n let i;\n for (i = 0; i < this._vertices.length; ++i) {\n this._vertices[i].triangleCount = 0;\n }\n let t;\n let j;\n for (i = 0; i < this._triangles.length; ++i) {\n if (!this._triangles[i].deleted) {\n t = this._triangles[i];\n for (j = 0; j < 3; ++j) {\n t._vertices[j].triangleCount = 1;\n }\n newTriangles.push(t);\n }\n }\n const newPositionData = this._reconstructedMesh.getVerticesData(VertexBuffer.PositionKind) || [];\n const newNormalData = this._reconstructedMesh.getVerticesData(VertexBuffer.NormalKind) || [];\n const newUVsData = this._reconstructedMesh.getVerticesData(VertexBuffer.UVKind) || [];\n const newColorsData = this._reconstructedMesh.getVerticesData(VertexBuffer.ColorKind) || [];\n const normalData = this._mesh.getVerticesData(VertexBuffer.NormalKind);\n const uvs = this._mesh.getVerticesData(VertexBuffer.UVKind);\n const colorsData = this._mesh.getVerticesData(VertexBuffer.ColorKind);\n let vertexCount = 0;\n for (i = 0; i < this._vertices.length; ++i) {\n const vertex = this._vertices[i];\n vertex.id = vertexCount;\n if (vertex.triangleCount) {\n vertex.originalOffsets.forEach(originalOffset => {\n newPositionData.push(vertex.position.x);\n newPositionData.push(vertex.position.y);\n newPositionData.push(vertex.position.z);\n if (normalData && normalData.length) {\n newNormalData.push(normalData[originalOffset * 3]);\n newNormalData.push(normalData[originalOffset * 3 + 1]);\n newNormalData.push(normalData[originalOffset * 3 + 2]);\n }\n if (uvs && uvs.length) {\n newUVsData.push(uvs[originalOffset * 2]);\n newUVsData.push(uvs[originalOffset * 2 + 1]);\n }\n if (colorsData && colorsData.length) {\n newColorsData.push(colorsData[originalOffset * 4]);\n newColorsData.push(colorsData[originalOffset * 4 + 1]);\n newColorsData.push(colorsData[originalOffset * 4 + 2]);\n newColorsData.push(colorsData[originalOffset * 4 + 3]);\n }\n ++vertexCount;\n });\n }\n }\n const startingIndex = this._reconstructedMesh.getTotalIndices();\n const startingVertex = this._reconstructedMesh.getTotalVertices();\n const submeshesArray = this._reconstructedMesh.subMeshes;\n this._reconstructedMesh.subMeshes = [];\n const newIndicesArray = this._reconstructedMesh.getIndices(); //[];\n const originalIndices = this._mesh.getIndices();\n for (i = 0; i < newTriangles.length; ++i) {\n t = newTriangles[i]; //now get the new referencing point for each vertex\n [0, 1, 2].forEach(idx => {\n const id = originalIndices[t.originalOffset + idx];\n let offset = t._vertices[idx].originalOffsets.indexOf(id);\n if (offset < 0) {\n offset = 0;\n }\n newIndicesArray.push(t._vertices[idx].id + offset + startingVertex);\n });\n }\n //overwriting the old vertex buffers and indices.\n this._reconstructedMesh.setIndices(newIndicesArray);\n this._reconstructedMesh.setVerticesData(VertexBuffer.PositionKind, newPositionData);\n if (newNormalData.length > 0) {\n this._reconstructedMesh.setVerticesData(VertexBuffer.NormalKind, newNormalData);\n }\n if (newUVsData.length > 0) {\n this._reconstructedMesh.setVerticesData(VertexBuffer.UVKind, newUVsData);\n }\n if (newColorsData.length > 0) {\n this._reconstructedMesh.setVerticesData(VertexBuffer.ColorKind, newColorsData);\n }\n //create submesh\n const originalSubmesh = this._mesh.subMeshes[submeshIndex];\n if (submeshIndex > 0) {\n this._reconstructedMesh.subMeshes = [];\n submeshesArray.forEach(submesh => {\n SubMesh.AddToMesh(submesh.materialIndex, submesh.verticesStart, submesh.verticesCount, /* 0, newPositionData.length/3, */submesh.indexStart, submesh.indexCount, submesh.getMesh());\n });\n SubMesh.AddToMesh(originalSubmesh.materialIndex, startingVertex, vertexCount, /* 0, newPositionData.length / 3, */startingIndex, newTriangles.length * 3, this._reconstructedMesh);\n }\n }\n _initDecimatedMesh() {\n this._reconstructedMesh = new Mesh(this._mesh.name + \"Decimated\", this._mesh.getScene());\n this._reconstructedMesh.material = this._mesh.material;\n this._reconstructedMesh.parent = this._mesh.parent;\n this._reconstructedMesh.isVisible = false;\n this._reconstructedMesh.renderingGroupId = this._mesh.renderingGroupId;\n }\n _isFlipped(vertex1, vertex2, point, deletedArray, delTr) {\n for (let i = 0; i < vertex1.triangleCount; ++i) {\n const t = this._triangles[this._references[vertex1.triangleStart + i].triangleId];\n if (t.deleted) {\n continue;\n }\n const s = this._references[vertex1.triangleStart + i].vertexId;\n const v1 = t._vertices[(s + 1) % 3];\n const v2 = t._vertices[(s + 2) % 3];\n if (v1 === vertex2 || v2 === vertex2) {\n deletedArray[i] = true;\n delTr.push(t);\n continue;\n }\n let d1 = v1.position.subtract(point);\n d1 = d1.normalize();\n let d2 = v2.position.subtract(point);\n d2 = d2.normalize();\n if (Math.abs(Vector3.Dot(d1, d2)) > 0.999) {\n return true;\n }\n const normal = Vector3.Cross(d1, d2).normalize();\n deletedArray[i] = false;\n if (Vector3.Dot(normal, t.normal) < 0.2) {\n return true;\n }\n }\n return false;\n }\n _updateTriangles(origVertex, vertex, deletedArray, deletedTriangles) {\n let newDeleted = deletedTriangles;\n for (let i = 0; i < vertex.triangleCount; ++i) {\n const ref = this._references[vertex.triangleStart + i];\n const t = this._triangles[ref.triangleId];\n if (t.deleted) {\n continue;\n }\n if (deletedArray[i] && t.deletePending) {\n t.deleted = true;\n newDeleted++;\n continue;\n }\n t._vertices[ref.vertexId] = origVertex;\n t.isDirty = true;\n t.error[0] = this._calculateError(t._vertices[0], t._vertices[1]) + t.borderFactor / 2;\n t.error[1] = this._calculateError(t._vertices[1], t._vertices[2]) + t.borderFactor / 2;\n t.error[2] = this._calculateError(t._vertices[2], t._vertices[0]) + t.borderFactor / 2;\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\n this._references.push(ref);\n }\n return newDeleted;\n }\n _identifyBorder() {\n for (let i = 0; i < this._vertices.length; ++i) {\n const vCount = [];\n const vId = [];\n const v = this._vertices[i];\n let j;\n for (j = 0; j < v.triangleCount; ++j) {\n const triangle = this._triangles[this._references[v.triangleStart + j].triangleId];\n for (let ii = 0; ii < 3; ii++) {\n let ofs = 0;\n const vv = triangle._vertices[ii];\n while (ofs < vCount.length) {\n if (vId[ofs] === vv.id) {\n break;\n }\n ++ofs;\n }\n if (ofs === vCount.length) {\n vCount.push(1);\n vId.push(vv.id);\n } else {\n vCount[ofs]++;\n }\n }\n }\n for (j = 0; j < vCount.length; ++j) {\n if (vCount[j] === 1) {\n this._vertices[vId[j]].isBorder = true;\n } else {\n this._vertices[vId[j]].isBorder = false;\n }\n }\n }\n }\n _updateMesh(identifyBorders = false) {\n let i;\n if (!identifyBorders) {\n const newTrianglesVector = [];\n for (i = 0; i < this._triangles.length; ++i) {\n if (!this._triangles[i].deleted) {\n newTrianglesVector.push(this._triangles[i]);\n }\n }\n this._triangles = newTrianglesVector;\n }\n for (i = 0; i < this._vertices.length; ++i) {\n this._vertices[i].triangleCount = 0;\n this._vertices[i].triangleStart = 0;\n }\n let t;\n let j;\n let v;\n for (i = 0; i < this._triangles.length; ++i) {\n t = this._triangles[i];\n for (j = 0; j < 3; ++j) {\n v = t._vertices[j];\n v.triangleCount++;\n }\n }\n let tStart = 0;\n for (i = 0; i < this._vertices.length; ++i) {\n this._vertices[i].triangleStart = tStart;\n tStart += this._vertices[i].triangleCount;\n this._vertices[i].triangleCount = 0;\n }\n const newReferences = new Array(this._triangles.length * 3);\n for (i = 0; i < this._triangles.length; ++i) {\n t = this._triangles[i];\n for (j = 0; j < 3; ++j) {\n v = t._vertices[j];\n newReferences[v.triangleStart + v.triangleCount] = new Reference(j, i);\n v.triangleCount++;\n }\n }\n this._references = newReferences;\n if (identifyBorders) {\n this._identifyBorder();\n }\n }\n _vertexError(q, point) {\n const x = point.x;\n const y = point.y;\n const z = point.z;\n return q.data[0] * x * x + 2 * q.data[1] * x * y + 2 * q.data[2] * x * z + 2 * q.data[3] * x + q.data[4] * y * y + 2 * q.data[5] * y * z + 2 * q.data[6] * y + q.data[7] * z * z + 2 * q.data[8] * z + q.data[9];\n }\n _calculateError(vertex1, vertex2, pointResult) {\n const q = vertex1.q.add(vertex2.q);\n const border = vertex1.isBorder && vertex2.isBorder;\n let error = 0;\n const qDet = q.det(0, 1, 2, 1, 4, 5, 2, 5, 7);\n if (qDet !== 0 && !border) {\n if (!pointResult) {\n pointResult = Vector3.Zero();\n }\n pointResult.x = -1 / qDet * q.det(1, 2, 3, 4, 5, 6, 5, 7, 8);\n pointResult.y = 1 / qDet * q.det(0, 2, 3, 1, 5, 6, 2, 7, 8);\n pointResult.z = -1 / qDet * q.det(0, 1, 3, 1, 4, 6, 2, 5, 8);\n error = this._vertexError(q, pointResult);\n } else {\n const p3 = vertex1.position.add(vertex2.position).divide(new Vector3(2, 2, 2));\n //var norm3 = (vertex1.normal.add(vertex2.normal)).divide(new Vector3(2, 2, 2)).normalize();\n const error1 = this._vertexError(q, vertex1.position);\n const error2 = this._vertexError(q, vertex2.position);\n const error3 = this._vertexError(q, p3);\n error = Math.min(error1, error2, error3);\n if (error === error1) {\n if (pointResult) {\n pointResult.copyFrom(vertex1.position);\n }\n } else if (error === error2) {\n if (pointResult) {\n pointResult.copyFrom(vertex2.position);\n }\n } else {\n if (pointResult) {\n pointResult.copyFrom(p3);\n }\n }\n }\n return error;\n }\n}","map":{"version":3,"names":["Vector3","VertexBuffer","SubMesh","Mesh","AsyncLoop","Epsilon","SimplificationSettings","constructor","quality","distance","optimizeMesh","SimplificationQueue","running","_simplificationArray","addTask","task","push","executeNext","pop","runSimplification","parallelProcessing","settings","forEach","setting","simplifier","_getSimplifier","simplify","newMesh","undefined","mesh","addLODLevel","isVisible","length","successCallback","runDecimation","callback","Run","loop","index","simplificationType","QuadraticErrorSimplification","SimplificationType","DecimationTriangle","_vertices","error","Array","deleted","isDirty","deletePending","borderFactor","DecimationVertex","position","id","isBorder","q","QuadraticMatrix","triangleCount","triangleStart","originalOffsets","updatePosition","newPosition","copyFrom","data","i","det","a11","a12","a13","a21","a22","a23","a31","a32","a33","addInPlace","matrix","addArrayInPlace","add","m","FromData","a","b","c","d","DataFromNumbers","Reference","vertexId","triangleId","_mesh","syncIterations","aggressiveness","decimationIterations","boundingBoxEpsilon","_initDecimatedMesh","subMeshes","_initWithMesh","_runDecimation","setTimeout","_reconstructedMesh","submeshIndex","targetCount","_triangles","deletedTriangles","iterationFunction","iteration","_updateMesh","threshold","Math","pow","trianglesIterator","tIdx","t","j","deleted0","deleted1","v0","v1","p","Zero","_calculateError","delTr","_isFlipped","indexOf","uniqueArray","deletedT","tStart","_references","_updateTriangles","tCount","SyncAsyncForLoop","breakLoop","_reconstructMesh","positionData","getVerticesData","PositionKind","indices","getIndices","submesh","findInVertices","positionToSearch","ii","equalsWithEpsilon","vertexReferences","vertexInit","offset","verticesStart","FromArray","vertex","totalVertices","verticesCount","indicesInit","indexStart","pos","i0","i1","i2","v2","triangle","originalOffset","indexCount","_init","triangleInit1","normal","Cross","subtract","normalize","x","y","z","Dot","triangleInit2","min","newTriangles","newPositionData","newNormalData","NormalKind","newUVsData","UVKind","newColorsData","ColorKind","normalData","uvs","colorsData","vertexCount","startingIndex","getTotalIndices","startingVertex","getTotalVertices","submeshesArray","newIndicesArray","originalIndices","idx","setIndices","setVerticesData","originalSubmesh","AddToMesh","materialIndex","getMesh","name","getScene","material","parent","renderingGroupId","vertex1","vertex2","point","deletedArray","s","d1","d2","abs","origVertex","newDeleted","ref","_identifyBorder","vCount","vId","v","ofs","vv","identifyBorders","newTrianglesVector","newReferences","_vertexError","pointResult","border","qDet","p3","divide","error1","error2","error3"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/core/Meshes/meshSimplification.js"],"sourcesContent":["import { Vector3 } from \"../Maths/math.vector.js\";\nimport { VertexBuffer } from \"../Buffers/buffer.js\";\nimport { SubMesh } from \"../Meshes/subMesh.js\";\nimport { Mesh } from \"../Meshes/mesh.js\";\nimport { AsyncLoop } from \"../Misc/tools.js\";\nimport { Epsilon } from \"../Maths/math.constants.js\";\n/**\n * Class used to specify simplification options\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\n */\nexport class SimplificationSettings {\n /**\n * Creates a SimplificationSettings\n * @param quality expected quality\n * @param distance distance when this optimized version should be used\n * @param optimizeMesh already optimized mesh\n */\n constructor(\n /** expected quality */\n quality, \n /** distance when this optimized version should be used */\n distance, \n /** already optimized mesh */\n optimizeMesh) {\n this.quality = quality;\n this.distance = distance;\n this.optimizeMesh = optimizeMesh;\n }\n}\n/**\n * Queue used to order the simplification tasks\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\n */\nexport class SimplificationQueue {\n /**\n * Creates a new queue\n */\n constructor() {\n this.running = false;\n this._simplificationArray = [];\n }\n /**\n * Adds a new simplification task\n * @param task defines a task to add\n */\n addTask(task) {\n this._simplificationArray.push(task);\n }\n /**\n * Execute next task\n */\n executeNext() {\n const task = this._simplificationArray.pop();\n if (task) {\n this.running = true;\n this.runSimplification(task);\n }\n else {\n this.running = false;\n }\n }\n /**\n * Execute a simplification task\n * @param task defines the task to run\n */\n runSimplification(task) {\n if (task.parallelProcessing) {\n //parallel simplifier\n task.settings.forEach((setting) => {\n const simplifier = this._getSimplifier(task);\n simplifier.simplify(setting, (newMesh) => {\n if (setting.distance !== undefined) {\n task.mesh.addLODLevel(setting.distance, newMesh);\n }\n newMesh.isVisible = true;\n //check if it is the last\n if (setting.quality === task.settings[task.settings.length - 1].quality && task.successCallback) {\n //all done, run the success callback.\n task.successCallback();\n }\n this.executeNext();\n });\n });\n }\n else {\n //single simplifier.\n const simplifier = this._getSimplifier(task);\n const runDecimation = (setting, callback) => {\n simplifier.simplify(setting, (newMesh) => {\n if (setting.distance !== undefined) {\n task.mesh.addLODLevel(setting.distance, newMesh);\n }\n newMesh.isVisible = true;\n //run the next quality level\n callback();\n });\n };\n AsyncLoop.Run(task.settings.length, (loop) => {\n runDecimation(task.settings[loop.index], () => {\n loop.executeNext();\n });\n }, () => {\n //execution ended, run the success callback.\n if (task.successCallback) {\n task.successCallback();\n }\n this.executeNext();\n });\n }\n }\n _getSimplifier(task) {\n switch (task.simplificationType) {\n case 0 /* SimplificationType.QUADRATIC */:\n default:\n return new QuadraticErrorSimplification(task.mesh);\n }\n }\n}\n/**\n * The implemented types of simplification\n * At the moment only Quadratic Error Decimation is implemented\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\n */\nexport var SimplificationType;\n(function (SimplificationType) {\n /** Quadratic error decimation */\n SimplificationType[SimplificationType[\"QUADRATIC\"] = 0] = \"QUADRATIC\";\n})(SimplificationType || (SimplificationType = {}));\nclass DecimationTriangle {\n constructor(_vertices) {\n this._vertices = _vertices;\n this.error = new Array(4);\n this.deleted = false;\n this.isDirty = false;\n this.deletePending = false;\n this.borderFactor = 0;\n }\n}\nclass DecimationVertex {\n constructor(position, id) {\n this.position = position;\n this.id = id;\n this.isBorder = true;\n this.q = new QuadraticMatrix();\n this.triangleCount = 0;\n this.triangleStart = 0;\n this.originalOffsets = [];\n }\n updatePosition(newPosition) {\n this.position.copyFrom(newPosition);\n }\n}\nclass QuadraticMatrix {\n constructor(data) {\n this.data = new Array(10);\n for (let i = 0; i < 10; ++i) {\n if (data && data[i]) {\n this.data[i] = data[i];\n }\n else {\n this.data[i] = 0;\n }\n }\n }\n det(a11, a12, a13, a21, a22, a23, a31, a32, a33) {\n const det = this.data[a11] * this.data[a22] * this.data[a33] +\n this.data[a13] * this.data[a21] * this.data[a32] +\n this.data[a12] * this.data[a23] * this.data[a31] -\n this.data[a13] * this.data[a22] * this.data[a31] -\n this.data[a11] * this.data[a23] * this.data[a32] -\n this.data[a12] * this.data[a21] * this.data[a33];\n return det;\n }\n addInPlace(matrix) {\n for (let i = 0; i < 10; ++i) {\n this.data[i] += matrix.data[i];\n }\n }\n addArrayInPlace(data) {\n for (let i = 0; i < 10; ++i) {\n this.data[i] += data[i];\n }\n }\n add(matrix) {\n const m = new QuadraticMatrix();\n for (let i = 0; i < 10; ++i) {\n m.data[i] = this.data[i] + matrix.data[i];\n }\n return m;\n }\n static FromData(a, b, c, d) {\n return new QuadraticMatrix(QuadraticMatrix.DataFromNumbers(a, b, c, d));\n }\n //returning an array to avoid garbage collection\n static DataFromNumbers(a, b, c, d) {\n return [a * a, a * b, a * c, a * d, b * b, b * c, b * d, c * c, c * d, d * d];\n }\n}\nclass Reference {\n constructor(vertexId, triangleId) {\n this.vertexId = vertexId;\n this.triangleId = triangleId;\n }\n}\n/**\n * An implementation of the Quadratic Error simplification algorithm.\n * Original paper : http://www1.cs.columbia.edu/~cs4162/html05s/garland97.pdf\n * Ported mostly from QSlim and http://voxels.blogspot.de/2014/05/quadric-mesh-simplification-with-source.html to babylon JS\n * @author RaananW\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes\n */\nexport class QuadraticErrorSimplification {\n /**\n * Creates a new QuadraticErrorSimplification\n * @param _mesh defines the target mesh\n */\n constructor(_mesh) {\n this._mesh = _mesh;\n /** Gets or sets the number pf sync iterations */\n this.syncIterations = 5000;\n this.aggressiveness = 7;\n this.decimationIterations = 100;\n this.boundingBoxEpsilon = Epsilon;\n }\n /**\n * Simplification of a given mesh according to the given settings.\n * Since this requires computation, it is assumed that the function runs async.\n * @param settings The settings of the simplification, including quality and distance\n * @param successCallback A callback that will be called after the mesh was simplified.\n */\n simplify(settings, successCallback) {\n this._initDecimatedMesh();\n //iterating through the submeshes array, one after the other.\n AsyncLoop.Run(this._mesh.subMeshes.length, (loop) => {\n this._initWithMesh(loop.index, () => {\n this._runDecimation(settings, loop.index, () => {\n loop.executeNext();\n });\n }, settings.optimizeMesh);\n }, () => {\n setTimeout(() => {\n successCallback(this._reconstructedMesh);\n }, 0);\n });\n }\n _runDecimation(settings, submeshIndex, successCallback) {\n const targetCount = ~~(this._triangles.length * settings.quality);\n let deletedTriangles = 0;\n const triangleCount = this._triangles.length;\n const iterationFunction = (iteration, callback) => {\n setTimeout(() => {\n if (iteration % 5 === 0) {\n this._updateMesh(iteration === 0);\n }\n for (let i = 0; i < this._triangles.length; ++i) {\n this._triangles[i].isDirty = false;\n }\n const threshold = 0.000000001 * Math.pow(iteration + 3, this.aggressiveness);\n const trianglesIterator = (i) => {\n const tIdx = ~~((this._triangles.length / 2 + i) % this._triangles.length);\n const t = this._triangles[tIdx];\n if (!t) {\n return;\n }\n if (t.error[3] > threshold || t.deleted || t.isDirty) {\n return;\n }\n for (let j = 0; j < 3; ++j) {\n if (t.error[j] < threshold) {\n const deleted0 = [];\n const deleted1 = [];\n const v0 = t._vertices[j];\n const v1 = t._vertices[(j + 1) % 3];\n if (v0.isBorder || v1.isBorder) {\n continue;\n }\n const p = Vector3.Zero();\n // var n = Vector3.Zero();\n // var uv = Vector2.Zero();\n // var color = new Color4(0, 0, 0, 1);\n this._calculateError(v0, v1, p);\n const delTr = [];\n if (this._isFlipped(v0, v1, p, deleted0, delTr)) {\n continue;\n }\n if (this._isFlipped(v1, v0, p, deleted1, delTr)) {\n continue;\n }\n if (deleted0.indexOf(true) < 0 || deleted1.indexOf(true) < 0) {\n continue;\n }\n const uniqueArray = [];\n delTr.forEach((deletedT) => {\n if (uniqueArray.indexOf(deletedT) === -1) {\n deletedT.deletePending = true;\n uniqueArray.push(deletedT);\n }\n });\n if (uniqueArray.length % 2 !== 0) {\n continue;\n }\n v0.q = v1.q.add(v0.q);\n v0.updatePosition(p);\n const tStart = this._references.length;\n deletedTriangles = this._updateTriangles(v0, v0, deleted0, deletedTriangles);\n deletedTriangles = this._updateTriangles(v0, v1, deleted1, deletedTriangles);\n const tCount = this._references.length - tStart;\n if (tCount <= v0.triangleCount) {\n if (tCount) {\n for (let c = 0; c < tCount; c++) {\n this._references[v0.triangleStart + c] = this._references[tStart + c];\n }\n }\n }\n else {\n v0.triangleStart = tStart;\n }\n v0.triangleCount = tCount;\n break;\n }\n }\n };\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, trianglesIterator, callback, () => {\n return triangleCount - deletedTriangles <= targetCount;\n });\n }, 0);\n };\n AsyncLoop.Run(this.decimationIterations, (loop) => {\n if (triangleCount - deletedTriangles <= targetCount) {\n loop.breakLoop();\n }\n else {\n iterationFunction(loop.index, () => {\n loop.executeNext();\n });\n }\n }, () => {\n setTimeout(() => {\n //reconstruct this part of the mesh\n this._reconstructMesh(submeshIndex);\n successCallback();\n }, 0);\n });\n }\n _initWithMesh(submeshIndex, callback, optimizeMesh) {\n this._vertices = [];\n this._triangles = [];\n const positionData = this._mesh.getVerticesData(VertexBuffer.PositionKind);\n const indices = this._mesh.getIndices();\n const submesh = this._mesh.subMeshes[submeshIndex];\n const findInVertices = (positionToSearch) => {\n if (optimizeMesh) {\n for (let ii = 0; ii < this._vertices.length; ++ii) {\n if (this._vertices[ii].position.equalsWithEpsilon(positionToSearch, 0.0001)) {\n return this._vertices[ii];\n }\n }\n }\n return null;\n };\n const vertexReferences = [];\n const vertexInit = (i) => {\n if (!positionData) {\n return;\n }\n const offset = i + submesh.verticesStart;\n const position = Vector3.FromArray(positionData, offset * 3);\n const vertex = findInVertices(position) || new DecimationVertex(position, this._vertices.length);\n vertex.originalOffsets.push(offset);\n if (vertex.id === this._vertices.length) {\n this._vertices.push(vertex);\n }\n vertexReferences.push(vertex.id);\n };\n //var totalVertices = mesh.getTotalVertices();\n const totalVertices = submesh.verticesCount;\n AsyncLoop.SyncAsyncForLoop(totalVertices, (this.syncIterations / 4) >> 0, vertexInit, () => {\n const indicesInit = (i) => {\n if (!indices) {\n return;\n }\n const offset = submesh.indexStart / 3 + i;\n const pos = offset * 3;\n const i0 = indices[pos + 0];\n const i1 = indices[pos + 1];\n const i2 = indices[pos + 2];\n const v0 = this._vertices[vertexReferences[i0 - submesh.verticesStart]];\n const v1 = this._vertices[vertexReferences[i1 - submesh.verticesStart]];\n const v2 = this._vertices[vertexReferences[i2 - submesh.verticesStart]];\n const triangle = new DecimationTriangle([v0, v1, v2]);\n triangle.originalOffset = pos;\n this._triangles.push(triangle);\n };\n AsyncLoop.SyncAsyncForLoop(submesh.indexCount / 3, this.syncIterations, indicesInit, () => {\n this._init(callback);\n });\n });\n }\n _init(callback) {\n const triangleInit1 = (i) => {\n const t = this._triangles[i];\n t.normal = Vector3.Cross(t._vertices[1].position.subtract(t._vertices[0].position), t._vertices[2].position.subtract(t._vertices[0].position)).normalize();\n for (let j = 0; j < 3; j++) {\n t._vertices[j].q.addArrayInPlace(QuadraticMatrix.DataFromNumbers(t.normal.x, t.normal.y, t.normal.z, -Vector3.Dot(t.normal, t._vertices[0].position)));\n }\n };\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit1, () => {\n const triangleInit2 = (i) => {\n const t = this._triangles[i];\n for (let j = 0; j < 3; ++j) {\n t.error[j] = this._calculateError(t._vertices[j], t._vertices[(j + 1) % 3]);\n }\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\n };\n AsyncLoop.SyncAsyncForLoop(this._triangles.length, this.syncIterations, triangleInit2, () => {\n callback();\n });\n });\n }\n _reconstructMesh(submeshIndex) {\n const newTriangles = [];\n let i;\n for (i = 0; i < this._vertices.length; ++i) {\n this._vertices[i].triangleCount = 0;\n }\n let t;\n let j;\n for (i = 0; i < this._triangles.length; ++i) {\n if (!this._triangles[i].deleted) {\n t = this._triangles[i];\n for (j = 0; j < 3; ++j) {\n t._vertices[j].triangleCount = 1;\n }\n newTriangles.push(t);\n }\n }\n const newPositionData = (this._reconstructedMesh.getVerticesData(VertexBuffer.PositionKind) || []);\n const newNormalData = (this._reconstructedMesh.getVerticesData(VertexBuffer.NormalKind) || []);\n const newUVsData = (this._reconstructedMesh.getVerticesData(VertexBuffer.UVKind) || []);\n const newColorsData = (this._reconstructedMesh.getVerticesData(VertexBuffer.ColorKind) || []);\n const normalData = this._mesh.getVerticesData(VertexBuffer.NormalKind);\n const uvs = this._mesh.getVerticesData(VertexBuffer.UVKind);\n const colorsData = this._mesh.getVerticesData(VertexBuffer.ColorKind);\n let vertexCount = 0;\n for (i = 0; i < this._vertices.length; ++i) {\n const vertex = this._vertices[i];\n vertex.id = vertexCount;\n if (vertex.triangleCount) {\n vertex.originalOffsets.forEach((originalOffset) => {\n newPositionData.push(vertex.position.x);\n newPositionData.push(vertex.position.y);\n newPositionData.push(vertex.position.z);\n if (normalData && normalData.length) {\n newNormalData.push(normalData[originalOffset * 3]);\n newNormalData.push(normalData[originalOffset * 3 + 1]);\n newNormalData.push(normalData[originalOffset * 3 + 2]);\n }\n if (uvs && uvs.length) {\n newUVsData.push(uvs[originalOffset * 2]);\n newUVsData.push(uvs[originalOffset * 2 + 1]);\n }\n if (colorsData && colorsData.length) {\n newColorsData.push(colorsData[originalOffset * 4]);\n newColorsData.push(colorsData[originalOffset * 4 + 1]);\n newColorsData.push(colorsData[originalOffset * 4 + 2]);\n newColorsData.push(colorsData[originalOffset * 4 + 3]);\n }\n ++vertexCount;\n });\n }\n }\n const startingIndex = this._reconstructedMesh.getTotalIndices();\n const startingVertex = this._reconstructedMesh.getTotalVertices();\n const submeshesArray = this._reconstructedMesh.subMeshes;\n this._reconstructedMesh.subMeshes = [];\n const newIndicesArray = this._reconstructedMesh.getIndices(); //[];\n const originalIndices = this._mesh.getIndices();\n for (i = 0; i < newTriangles.length; ++i) {\n t = newTriangles[i]; //now get the new referencing point for each vertex\n [0, 1, 2].forEach((idx) => {\n const id = originalIndices[t.originalOffset + idx];\n let offset = t._vertices[idx].originalOffsets.indexOf(id);\n if (offset < 0) {\n offset = 0;\n }\n newIndicesArray.push(t._vertices[idx].id + offset + startingVertex);\n });\n }\n //overwriting the old vertex buffers and indices.\n this._reconstructedMesh.setIndices(newIndicesArray);\n this._reconstructedMesh.setVerticesData(VertexBuffer.PositionKind, newPositionData);\n if (newNormalData.length > 0) {\n this._reconstructedMesh.setVerticesData(VertexBuffer.NormalKind, newNormalData);\n }\n if (newUVsData.length > 0) {\n this._reconstructedMesh.setVerticesData(VertexBuffer.UVKind, newUVsData);\n }\n if (newColorsData.length > 0) {\n this._reconstructedMesh.setVerticesData(VertexBuffer.ColorKind, newColorsData);\n }\n //create submesh\n const originalSubmesh = this._mesh.subMeshes[submeshIndex];\n if (submeshIndex > 0) {\n this._reconstructedMesh.subMeshes = [];\n submeshesArray.forEach((submesh) => {\n SubMesh.AddToMesh(submesh.materialIndex, submesh.verticesStart, submesh.verticesCount, \n /* 0, newPositionData.length/3, */ submesh.indexStart, submesh.indexCount, submesh.getMesh());\n });\n SubMesh.AddToMesh(originalSubmesh.materialIndex, startingVertex, vertexCount, \n /* 0, newPositionData.length / 3, */ startingIndex, newTriangles.length * 3, this._reconstructedMesh);\n }\n }\n _initDecimatedMesh() {\n this._reconstructedMesh = new Mesh(this._mesh.name + \"Decimated\", this._mesh.getScene());\n this._reconstructedMesh.material = this._mesh.material;\n this._reconstructedMesh.parent = this._mesh.parent;\n this._reconstructedMesh.isVisible = false;\n this._reconstructedMesh.renderingGroupId = this._mesh.renderingGroupId;\n }\n _isFlipped(vertex1, vertex2, point, deletedArray, delTr) {\n for (let i = 0; i < vertex1.triangleCount; ++i) {\n const t = this._triangles[this._references[vertex1.triangleStart + i].triangleId];\n if (t.deleted) {\n continue;\n }\n const s = this._references[vertex1.triangleStart + i].vertexId;\n const v1 = t._vertices[(s + 1) % 3];\n const v2 = t._vertices[(s + 2) % 3];\n if (v1 === vertex2 || v2 === vertex2) {\n deletedArray[i] = true;\n delTr.push(t);\n continue;\n }\n let d1 = v1.position.subtract(point);\n d1 = d1.normalize();\n let d2 = v2.position.subtract(point);\n d2 = d2.normalize();\n if (Math.abs(Vector3.Dot(d1, d2)) > 0.999) {\n return true;\n }\n const normal = Vector3.Cross(d1, d2).normalize();\n deletedArray[i] = false;\n if (Vector3.Dot(normal, t.normal) < 0.2) {\n return true;\n }\n }\n return false;\n }\n _updateTriangles(origVertex, vertex, deletedArray, deletedTriangles) {\n let newDeleted = deletedTriangles;\n for (let i = 0; i < vertex.triangleCount; ++i) {\n const ref = this._references[vertex.triangleStart + i];\n const t = this._triangles[ref.triangleId];\n if (t.deleted) {\n continue;\n }\n if (deletedArray[i] && t.deletePending) {\n t.deleted = true;\n newDeleted++;\n continue;\n }\n t._vertices[ref.vertexId] = origVertex;\n t.isDirty = true;\n t.error[0] = this._calculateError(t._vertices[0], t._vertices[1]) + t.borderFactor / 2;\n t.error[1] = this._calculateError(t._vertices[1], t._vertices[2]) + t.borderFactor / 2;\n t.error[2] = this._calculateError(t._vertices[2], t._vertices[0]) + t.borderFactor / 2;\n t.error[3] = Math.min(t.error[0], t.error[1], t.error[2]);\n this._references.push(ref);\n }\n return newDeleted;\n }\n _identifyBorder() {\n for (let i = 0; i < this._vertices.length; ++i) {\n const vCount = [];\n const vId = [];\n const v = this._vertices[i];\n let j;\n for (j = 0; j < v.triangleCount; ++j) {\n const triangle = this._triangles[this._references[v.triangleStart + j].triangleId];\n for (let ii = 0; ii < 3; ii++) {\n let ofs = 0;\n const vv = triangle._vertices[ii];\n while (ofs < vCount.length) {\n if (vId[ofs] === vv.id) {\n break;\n }\n ++ofs;\n }\n if (ofs === vCount.length) {\n vCount.push(1);\n vId.push(vv.id);\n }\n else {\n vCount[ofs]++;\n }\n }\n }\n for (j = 0; j < vCount.length; ++j) {\n if (vCount[j] === 1) {\n this._vertices[vId[j]].isBorder = true;\n }\n else {\n this._vertices[vId[j]].isBorder = false;\n }\n }\n }\n }\n _updateMesh(identifyBorders = false) {\n let i;\n if (!identifyBorders) {\n const newTrianglesVector = [];\n for (i = 0; i < this._triangles.length; ++i) {\n if (!this._triangles[i].deleted) {\n newTrianglesVector.push(this._triangles[i]);\n }\n }\n this._triangles = newTrianglesVector;\n }\n for (i = 0; i < this._vertices.length; ++i) {\n this._vertices[i].triangleCount = 0;\n this._vertices[i].triangleStart = 0;\n }\n let t;\n let j;\n let v;\n for (i = 0; i < this._triangles.length; ++i) {\n t = this._triangles[i];\n for (j = 0; j < 3; ++j) {\n v = t._vertices[j];\n v.triangleCount++;\n }\n }\n let tStart = 0;\n for (i = 0; i < this._vertices.length; ++i) {\n this._vertices[i].triangleStart = tStart;\n tStart += this._vertices[i].triangleCount;\n this._vertices[i].triangleCount = 0;\n }\n const newReferences = new Array(this._triangles.length * 3);\n for (i = 0; i < this._triangles.length; ++i) {\n t = this._triangles[i];\n for (j = 0; j < 3; ++j) {\n v = t._vertices[j];\n newReferences[v.triangleStart + v.triangleCount] = new Reference(j, i);\n v.triangleCount++;\n }\n }\n this._references = newReferences;\n if (identifyBorders) {\n this._identifyBorder();\n }\n }\n _vertexError(q, point) {\n const x = point.x;\n const y = point.y;\n const z = point.z;\n return (q.data[0] * x * x +\n 2 * q.data[1] * x * y +\n 2 * q.data[2] * x * z +\n 2 * q.data[3] * x +\n q.data[4] * y * y +\n 2 * q.data[5] * y * z +\n 2 * q.data[6] * y +\n q.data[7] * z * z +\n 2 * q.data[8] * z +\n q.data[9]);\n }\n _calculateError(vertex1, vertex2, pointResult) {\n const q = vertex1.q.add(vertex2.q);\n const border = vertex1.isBorder && vertex2.isBorder;\n let error = 0;\n const qDet = q.det(0, 1, 2, 1, 4, 5, 2, 5, 7);\n if (qDet !== 0 && !border) {\n if (!pointResult) {\n pointResult = Vector3.Zero();\n }\n pointResult.x = (-1 / qDet) * q.det(1, 2, 3, 4, 5, 6, 5, 7, 8);\n pointResult.y = (1 / qDet) * q.det(0, 2, 3, 1, 5, 6, 2, 7, 8);\n pointResult.z = (-1 / qDet) * q.det(0, 1, 3, 1, 4, 6, 2, 5, 8);\n error = this._vertexError(q, pointResult);\n }\n else {\n const p3 = vertex1.position.add(vertex2.position).divide(new Vector3(2, 2, 2));\n //var norm3 = (vertex1.normal.add(vertex2.normal)).divide(new Vector3(2, 2, 2)).normalize();\n const error1 = this._vertexError(q, vertex1.position);\n const error2 = this._vertexError(q, vertex2.position);\n const error3 = this._vertexError(q, p3);\n error = Math.min(error1, error2, error3);\n if (error === error1) {\n if (pointResult) {\n pointResult.copyFrom(vertex1.position);\n }\n }\n else if (error === error2) {\n if (pointResult) {\n pointResult.copyFrom(vertex2.position);\n }\n }\n else {\n if (pointResult) {\n pointResult.copyFrom(p3);\n }\n }\n }\n return error;\n }\n}\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}
|