1 |
- {"ast":null,"code":"import _asyncToGenerator from \"F:/workspace/202226701027/huinongbao-app/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\";\nimport { VertexBuffer } from \"../Buffers/buffer.js\";\nimport { AbstractMesh } from \"../Meshes/abstractMesh.js\";\nimport { LinesMesh, InstancedLinesMesh } from \"../Meshes/linesMesh.js\";\nimport { Vector3, TmpVectors } from \"../Maths/math.vector.js\";\nimport { Material } from \"../Materials/material.js\";\nimport { ShaderMaterial } from \"../Materials/shaderMaterial.js\";\nimport { Camera } from \"../Cameras/camera.js\";\nimport { SmartArray } from \"../Misc/smartArray.js\";\nimport { DrawWrapper } from \"../Materials/drawWrapper.js\";\nAbstractMesh.prototype.disableEdgesRendering = function () {\n if (this._edgesRenderer) {\n this._edgesRenderer.dispose();\n this._edgesRenderer = null;\n }\n return this;\n};\nAbstractMesh.prototype.enableEdgesRendering = function (epsilon = 0.95, checkVerticesInsteadOfIndices = false, options) {\n this.disableEdgesRendering();\n this._edgesRenderer = new EdgesRenderer(this, epsilon, checkVerticesInsteadOfIndices, true, options);\n return this;\n};\nObject.defineProperty(AbstractMesh.prototype, \"edgesRenderer\", {\n get: function () {\n return this._edgesRenderer;\n },\n enumerable: true,\n configurable: true\n});\nLinesMesh.prototype.enableEdgesRendering = function (epsilon = 0.95, checkVerticesInsteadOfIndices = false) {\n this.disableEdgesRendering();\n this._edgesRenderer = new LineEdgesRenderer(this, epsilon, checkVerticesInsteadOfIndices);\n return this;\n};\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nInstancedLinesMesh.prototype.enableEdgesRendering = function (epsilon = 0.95, checkVerticesInsteadOfIndices = false) {\n LinesMesh.prototype.enableEdgesRendering.apply(this, arguments);\n return this;\n};\n/**\n * FaceAdjacencies Helper class to generate edges\n */\nclass FaceAdjacencies {\n constructor() {\n this.edges = [];\n this.edgesConnectedCount = 0;\n }\n}\n/**\n * This class is used to generate edges of the mesh that could then easily be rendered in a scene.\n */\nexport class EdgesRenderer {\n /** Gets the vertices generated by the edge renderer */\n get linesPositions() {\n return this._linesPositions;\n }\n /** Gets the normals generated by the edge renderer */\n get linesNormals() {\n return this._linesNormals;\n }\n /** Gets the indices generated by the edge renderer */\n get linesIndices() {\n return this._linesIndices;\n }\n /**\n * Gets or sets the shader used to draw the lines\n */\n get lineShader() {\n return this._lineShader;\n }\n set lineShader(shader) {\n this._lineShader = shader;\n }\n static _GetShader(scene, shaderLanguage) {\n if (!scene._edgeRenderLineShader) {\n const shader = new ShaderMaterial(\"lineShader\", scene, \"line\", {\n attributes: [\"position\", \"normal\"],\n uniforms: [\"world\", \"viewProjection\", \"color\", \"width\", \"aspectRatio\"],\n uniformBuffers: [\"Scene\", \"Mesh\"],\n shaderLanguage: shaderLanguage,\n extraInitializationsAsync: function () {\n var _ref = _asyncToGenerator(function* () {\n if (shaderLanguage === 1 /* ShaderLanguage.WGSL */) {\n yield Promise.all([import(\"../ShadersWGSL/line.vertex.js\"), import(\"../ShadersWGSL/line.fragment.js\")]);\n } else {\n yield Promise.all([import(\"../Shaders/line.vertex.js\"), import(\"../Shaders/line.fragment.js\")]);\n }\n });\n return function extraInitializationsAsync() {\n return _ref.apply(this, arguments);\n };\n }()\n }, false);\n shader.disableDepthWrite = true;\n shader.backFaceCulling = false;\n shader.checkReadyOnEveryCall = scene.getEngine().isWebGPU;\n scene._edgeRenderLineShader = shader;\n }\n return scene._edgeRenderLineShader;\n }\n /**\n * Gets the shader language used.\n */\n get shaderLanguage() {\n return this._shaderLanguage;\n }\n /**\n * Creates an instance of the EdgesRenderer. It is primarily use to display edges of a mesh.\n * Beware when you use this class with complex objects as the adjacencies computation can be really long\n * @param source Mesh used to create edges\n * @param epsilon sum of angles in adjacency to check for edge\n * @param checkVerticesInsteadOfIndices bases the edges detection on vertices vs indices. Note that this parameter is not used if options.useAlternateEdgeFinder = true\n * @param generateEdgesLines - should generate Lines or only prepare resources.\n * @param options The options to apply when generating the edges\n */\n constructor(source, epsilon = 0.95, checkVerticesInsteadOfIndices = false, generateEdgesLines = true, options) {\n /**\n * Define the size of the edges with an orthographic camera\n */\n this.edgesWidthScalerForOrthographic = 1000.0;\n /**\n * Define the size of the edges with a perspective camera\n */\n this.edgesWidthScalerForPerspective = 50.0;\n this._linesPositions = new Array();\n this._linesNormals = new Array();\n this._linesIndices = new Array();\n this._buffers = {};\n this._buffersForInstances = {};\n this._checkVerticesInsteadOfIndices = false;\n /** Gets or sets a boolean indicating if the edgesRenderer is active */\n this.isEnabled = true;\n /**\n * List of instances to render in case the source mesh has instances\n */\n this.customInstances = new SmartArray(32);\n /** Shader language used*/\n this._shaderLanguage = 0 /* ShaderLanguage.GLSL */;\n this._source = source;\n this._checkVerticesInsteadOfIndices = checkVerticesInsteadOfIndices;\n this._options = options !== null && options !== void 0 ? options : null;\n this._epsilon = epsilon;\n const engine = this._source.getScene().getEngine();\n if (engine.isWebGPU) {\n this._drawWrapper = new DrawWrapper(engine);\n this._shaderLanguage = 1 /* ShaderLanguage.WGSL */;\n }\n this._prepareRessources();\n if (generateEdgesLines) {\n var _options$useAlternate;\n if ((_options$useAlternate = options === null || options === void 0 ? void 0 : options.useAlternateEdgeFinder) !== null && _options$useAlternate !== void 0 ? _options$useAlternate : true) {\n this._generateEdgesLinesAlternate();\n } else {\n this._generateEdgesLines();\n }\n }\n this._meshRebuildObserver = this._source.onRebuildObservable.add(() => {\n this._rebuild();\n });\n this._meshDisposeObserver = this._source.onDisposeObservable.add(() => {\n this.dispose();\n });\n }\n _prepareRessources() {\n if (this._lineShader) {\n return;\n }\n this._lineShader = EdgesRenderer._GetShader(this._source.getScene(), this._shaderLanguage);\n }\n /** @internal */\n _rebuild() {\n let buffer = this._buffers[VertexBuffer.PositionKind];\n if (buffer) {\n buffer._rebuild();\n }\n buffer = this._buffers[VertexBuffer.NormalKind];\n if (buffer) {\n buffer._rebuild();\n }\n const scene = this._source.getScene();\n const engine = scene.getEngine();\n this._ib = engine.createIndexBuffer(this._linesIndices);\n }\n /**\n * Releases the required resources for the edges renderer\n */\n dispose() {\n var _this$_drawWrapper;\n this._source.onRebuildObservable.remove(this._meshRebuildObserver);\n this._source.onDisposeObservable.remove(this._meshDisposeObserver);\n let buffer = this._buffers[VertexBuffer.PositionKind];\n if (buffer) {\n buffer.dispose();\n this._buffers[VertexBuffer.PositionKind] = null;\n }\n buffer = this._buffers[VertexBuffer.NormalKind];\n if (buffer) {\n buffer.dispose();\n this._buffers[VertexBuffer.NormalKind] = null;\n }\n if (this._ib) {\n this._source.getScene().getEngine()._releaseBuffer(this._ib);\n }\n this._lineShader.dispose();\n (_this$_drawWrapper = this._drawWrapper) === null || _this$_drawWrapper === void 0 || _this$_drawWrapper.dispose();\n }\n _processEdgeForAdjacencies(pa, pb, p0, p1, p2) {\n if (pa === p0 && pb === p1 || pa === p1 && pb === p0) {\n return 0;\n }\n if (pa === p1 && pb === p2 || pa === p2 && pb === p1) {\n return 1;\n }\n if (pa === p2 && pb === p0 || pa === p0 && pb === p2) {\n return 2;\n }\n return -1;\n }\n _processEdgeForAdjacenciesWithVertices(pa, pb, p0, p1, p2) {\n const eps = 1e-10;\n if (pa.equalsWithEpsilon(p0, eps) && pb.equalsWithEpsilon(p1, eps) || pa.equalsWithEpsilon(p1, eps) && pb.equalsWithEpsilon(p0, eps)) {\n return 0;\n }\n if (pa.equalsWithEpsilon(p1, eps) && pb.equalsWithEpsilon(p2, eps) || pa.equalsWithEpsilon(p2, eps) && pb.equalsWithEpsilon(p1, eps)) {\n return 1;\n }\n if (pa.equalsWithEpsilon(p2, eps) && pb.equalsWithEpsilon(p0, eps) || pa.equalsWithEpsilon(p0, eps) && pb.equalsWithEpsilon(p2, eps)) {\n return 2;\n }\n return -1;\n }\n /**\n * Checks if the pair of p0 and p1 is en edge\n * @param faceIndex\n * @param edge\n * @param faceNormals\n * @param p0\n * @param p1\n * @private\n */\n _checkEdge(faceIndex, edge, faceNormals, p0, p1) {\n let needToCreateLine;\n if (edge === undefined) {\n needToCreateLine = true;\n } else {\n const dotProduct = Vector3.Dot(faceNormals[faceIndex], faceNormals[edge]);\n needToCreateLine = dotProduct < this._epsilon;\n }\n if (needToCreateLine) {\n this.createLine(p0, p1, this._linesPositions.length / 3);\n }\n }\n /**\n * push line into the position, normal and index buffer\n * @param p0\n * @param p1\n * @param offset\n * @protected\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n createLine(p0, p1, offset) {\n // Positions\n this._linesPositions.push(p0.x, p0.y, p0.z, p0.x, p0.y, p0.z, p1.x, p1.y, p1.z, p1.x, p1.y, p1.z);\n // Normals\n this._linesNormals.push(p1.x, p1.y, p1.z, -1, p1.x, p1.y, p1.z, 1, p0.x, p0.y, p0.z, -1, p0.x, p0.y, p0.z, 1);\n // Indices\n this._linesIndices.push(offset, offset + 1, offset + 2, offset, offset + 2, offset + 3);\n }\n /**\n * See https://playground.babylonjs.com/#R3JR6V#1 for a visual display of the algorithm\n * @param edgePoints\n * @param indexTriangle\n * @param indices\n * @param remapVertexIndices\n */\n _tessellateTriangle(edgePoints, indexTriangle, indices, remapVertexIndices) {\n const makePointList = (edgePoints, pointIndices, firstIndex) => {\n if (firstIndex >= 0) {\n pointIndices.push(firstIndex);\n }\n for (let i = 0; i < edgePoints.length; ++i) {\n pointIndices.push(edgePoints[i][0]);\n }\n };\n let startEdge = 0;\n if (edgePoints[1].length >= edgePoints[0].length && edgePoints[1].length >= edgePoints[2].length) {\n startEdge = 1;\n } else if (edgePoints[2].length >= edgePoints[0].length && edgePoints[2].length >= edgePoints[1].length) {\n startEdge = 2;\n }\n for (let e = 0; e < 3; ++e) {\n if (e === startEdge) {\n edgePoints[e].sort((a, b) => a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : 0);\n } else {\n edgePoints[e].sort((a, b) => a[1] > b[1] ? -1 : a[1] < b[1] ? 1 : 0);\n }\n }\n const mainPointIndices = [],\n otherPointIndices = [];\n makePointList(edgePoints[startEdge], mainPointIndices, -1);\n const numMainPoints = mainPointIndices.length;\n for (let i = startEdge + 2; i >= startEdge + 1; --i) {\n makePointList(edgePoints[i % 3], otherPointIndices, i !== startEdge + 2 ? remapVertexIndices[indices[indexTriangle + (i + 1) % 3]] : -1);\n }\n const numOtherPoints = otherPointIndices.length;\n const idxMain = 0;\n const idxOther = 0;\n indices.push(remapVertexIndices[indices[indexTriangle + startEdge]], mainPointIndices[0], otherPointIndices[0]);\n indices.push(remapVertexIndices[indices[indexTriangle + (startEdge + 1) % 3]], otherPointIndices[numOtherPoints - 1], mainPointIndices[numMainPoints - 1]);\n const bucketIsMain = numMainPoints <= numOtherPoints;\n const bucketStep = bucketIsMain ? numMainPoints : numOtherPoints;\n const bucketLimit = bucketIsMain ? numOtherPoints : numMainPoints;\n const bucketIdxLimit = bucketIsMain ? numMainPoints - 1 : numOtherPoints - 1;\n const winding = bucketIsMain ? 0 : 1;\n let numTris = numMainPoints + numOtherPoints - 2;\n let bucketIdx = bucketIsMain ? idxMain : idxOther;\n let nbucketIdx = bucketIsMain ? idxOther : idxMain;\n const bucketPoints = bucketIsMain ? mainPointIndices : otherPointIndices;\n const nbucketPoints = bucketIsMain ? otherPointIndices : mainPointIndices;\n let bucket = 0;\n while (numTris-- > 0) {\n if (winding) {\n indices.push(bucketPoints[bucketIdx], nbucketPoints[nbucketIdx]);\n } else {\n indices.push(nbucketPoints[nbucketIdx], bucketPoints[bucketIdx]);\n }\n bucket += bucketStep;\n let lastIdx;\n if (bucket >= bucketLimit && bucketIdx < bucketIdxLimit) {\n lastIdx = bucketPoints[++bucketIdx];\n bucket -= bucketLimit;\n } else {\n lastIdx = nbucketPoints[++nbucketIdx];\n }\n indices.push(lastIdx);\n }\n indices[indexTriangle + 0] = indices[indices.length - 3];\n indices[indexTriangle + 1] = indices[indices.length - 2];\n indices[indexTriangle + 2] = indices[indices.length - 1];\n indices.length = indices.length - 3;\n }\n _generateEdgesLinesAlternate() {\n var _this$_options$useFas, _this$_options, _this$_options$epsilo, _this$_options2, _this$_options$epsilo2, _this$_options3, _this$_options4;\n const positions = this._source.getVerticesData(VertexBuffer.PositionKind);\n let indices = this._source.getIndices();\n if (!indices || !positions) {\n return;\n }\n if (!Array.isArray(indices)) {\n indices = Array.from(indices);\n }\n /**\n * Find all vertices that are at the same location (with an epsilon) and remapp them on the same vertex\n */\n const useFastVertexMerger = (_this$_options$useFas = (_this$_options = this._options) === null || _this$_options === void 0 ? void 0 : _this$_options.useFastVertexMerger) !== null && _this$_options$useFas !== void 0 ? _this$_options$useFas : true;\n const epsVertexMerge = useFastVertexMerger ? Math.round(-Math.log((_this$_options$epsilo = (_this$_options2 = this._options) === null || _this$_options2 === void 0 ? void 0 : _this$_options2.epsilonVertexMerge) !== null && _this$_options$epsilo !== void 0 ? _this$_options$epsilo : 1e-6) / Math.log(10)) : (_this$_options$epsilo2 = (_this$_options3 = this._options) === null || _this$_options3 === void 0 ? void 0 : _this$_options3.epsilonVertexMerge) !== null && _this$_options$epsilo2 !== void 0 ? _this$_options$epsilo2 : 1e-6;\n const remapVertexIndices = [];\n const uniquePositions = []; // list of unique index of vertices - needed for tessellation\n if (useFastVertexMerger) {\n const mapVertices = {};\n for (let v1 = 0; v1 < positions.length; v1 += 3) {\n const x1 = positions[v1 + 0],\n y1 = positions[v1 + 1],\n z1 = positions[v1 + 2];\n const key = x1.toFixed(epsVertexMerge) + \"|\" + y1.toFixed(epsVertexMerge) + \"|\" + z1.toFixed(epsVertexMerge);\n if (mapVertices[key] !== undefined) {\n remapVertexIndices.push(mapVertices[key]);\n } else {\n const idx = v1 / 3;\n mapVertices[key] = idx;\n remapVertexIndices.push(idx);\n uniquePositions.push(idx);\n }\n }\n } else {\n for (let v1 = 0; v1 < positions.length; v1 += 3) {\n const x1 = positions[v1 + 0],\n y1 = positions[v1 + 1],\n z1 = positions[v1 + 2];\n let found = false;\n for (let v2 = 0; v2 < v1 && !found; v2 += 3) {\n const x2 = positions[v2 + 0],\n y2 = positions[v2 + 1],\n z2 = positions[v2 + 2];\n if (Math.abs(x1 - x2) < epsVertexMerge && Math.abs(y1 - y2) < epsVertexMerge && Math.abs(z1 - z2) < epsVertexMerge) {\n remapVertexIndices.push(v2 / 3);\n found = true;\n break;\n }\n }\n if (!found) {\n remapVertexIndices.push(v1 / 3);\n uniquePositions.push(v1 / 3);\n }\n }\n }\n if ((_this$_options4 = this._options) !== null && _this$_options4 !== void 0 && _this$_options4.applyTessellation) {\n var _this$_options$epsilo3, _this$_options5;\n /**\n * Tessellate triangles if necessary:\n *\n * A\n * +\n * |\\\n * | \\\n * | \\\n * E + \\\n * /| \\\n * / | \\\n * / | \\\n * +---+-------+ B\n * D C\n *\n * For the edges to be rendered correctly, the ABC triangle has to be split into ABE and BCE, else AC is considered to be an edge, whereas only AE should be.\n *\n * The tessellation process looks for the vertices like E that are in-between two other vertices making of an edge and create new triangles as necessary\n */\n // First step: collect the triangles to tessellate\n const epsVertexAligned = (_this$_options$epsilo3 = (_this$_options5 = this._options) === null || _this$_options5 === void 0 ? void 0 : _this$_options5.epsilonVertexAligned) !== null && _this$_options$epsilo3 !== void 0 ? _this$_options$epsilo3 : 1e-6;\n const mustTesselate = []; // liste of triangles that must be tessellated\n for (let index = 0; index < indices.length; index += 3) {\n // loop over all triangles\n let triangleToTessellate;\n for (let i = 0; i < 3; ++i) {\n // loop over the 3 edges of the triangle\n const p0Index = remapVertexIndices[indices[index + i]];\n const p1Index = remapVertexIndices[indices[index + (i + 1) % 3]];\n const p2Index = remapVertexIndices[indices[index + (i + 2) % 3]];\n if (p0Index === p1Index) {\n continue;\n } // degenerated triangle - don't process\n const p0x = positions[p0Index * 3 + 0],\n p0y = positions[p0Index * 3 + 1],\n p0z = positions[p0Index * 3 + 2];\n const p1x = positions[p1Index * 3 + 0],\n p1y = positions[p1Index * 3 + 1],\n p1z = positions[p1Index * 3 + 2];\n const p0p1 = Math.sqrt((p1x - p0x) * (p1x - p0x) + (p1y - p0y) * (p1y - p0y) + (p1z - p0z) * (p1z - p0z));\n for (let v = 0; v < uniquePositions.length - 1; v++) {\n // loop over all (unique) vertices and look for the ones that would be in-between p0 and p1\n const vIndex = uniquePositions[v];\n if (vIndex === p0Index || vIndex === p1Index || vIndex === p2Index) {\n continue;\n } // don't handle the vertex if it is a vertex of the current triangle\n const x = positions[vIndex * 3 + 0],\n y = positions[vIndex * 3 + 1],\n z = positions[vIndex * 3 + 2];\n const p0p = Math.sqrt((x - p0x) * (x - p0x) + (y - p0y) * (y - p0y) + (z - p0z) * (z - p0z));\n const pp1 = Math.sqrt((x - p1x) * (x - p1x) + (y - p1y) * (y - p1y) + (z - p1z) * (z - p1z));\n if (Math.abs(p0p + pp1 - p0p1) < epsVertexAligned) {\n // vertices are aligned and p in-between p0 and p1 if distance(p0, p) + distance (p, p1) ~ distance(p0, p1)\n if (!triangleToTessellate) {\n triangleToTessellate = {\n index: index,\n edgesPoints: [[], [], []]\n };\n mustTesselate.push(triangleToTessellate);\n }\n triangleToTessellate.edgesPoints[i].push([vIndex, p0p]);\n }\n }\n }\n }\n // Second step: tesselate the triangles\n for (let t = 0; t < mustTesselate.length; ++t) {\n const triangle = mustTesselate[t];\n this._tessellateTriangle(triangle.edgesPoints, triangle.index, indices, remapVertexIndices);\n }\n mustTesselate.length = 0;\n }\n /**\n * Collect the edges to render\n */\n const edges = {};\n for (let index = 0; index < indices.length; index += 3) {\n let faceNormal;\n for (let i = 0; i < 3; ++i) {\n var _this$_options6;\n let p0Index = remapVertexIndices[indices[index + i]];\n let p1Index = remapVertexIndices[indices[index + (i + 1) % 3]];\n const p2Index = remapVertexIndices[indices[index + (i + 2) % 3]];\n if (p0Index === p1Index || (p0Index === p2Index || p1Index === p2Index) && (_this$_options6 = this._options) !== null && _this$_options6 !== void 0 && _this$_options6.removeDegeneratedTriangles) {\n continue;\n }\n TmpVectors.Vector3[0].copyFromFloats(positions[p0Index * 3 + 0], positions[p0Index * 3 + 1], positions[p0Index * 3 + 2]);\n TmpVectors.Vector3[1].copyFromFloats(positions[p1Index * 3 + 0], positions[p1Index * 3 + 1], positions[p1Index * 3 + 2]);\n TmpVectors.Vector3[2].copyFromFloats(positions[p2Index * 3 + 0], positions[p2Index * 3 + 1], positions[p2Index * 3 + 2]);\n if (!faceNormal) {\n TmpVectors.Vector3[1].subtractToRef(TmpVectors.Vector3[0], TmpVectors.Vector3[3]);\n TmpVectors.Vector3[2].subtractToRef(TmpVectors.Vector3[1], TmpVectors.Vector3[4]);\n faceNormal = Vector3.Cross(TmpVectors.Vector3[3], TmpVectors.Vector3[4]);\n faceNormal.normalize();\n }\n if (p0Index > p1Index) {\n const tmp = p0Index;\n p0Index = p1Index;\n p1Index = tmp;\n }\n const key = p0Index + \"_\" + p1Index;\n const ei = edges[key];\n if (ei) {\n if (!ei.done) {\n const dotProduct = Vector3.Dot(faceNormal, ei.normal);\n if (dotProduct < this._epsilon) {\n this.createLine(TmpVectors.Vector3[0], TmpVectors.Vector3[1], this._linesPositions.length / 3);\n }\n ei.done = true;\n }\n } else {\n edges[key] = {\n normal: faceNormal,\n done: false,\n index: index,\n i: i\n };\n }\n }\n }\n for (const key in edges) {\n const ei = edges[key];\n if (!ei.done) {\n // Orphaned edge - we must display it\n const p0Index = remapVertexIndices[indices[ei.index + ei.i]];\n const p1Index = remapVertexIndices[indices[ei.index + (ei.i + 1) % 3]];\n TmpVectors.Vector3[0].copyFromFloats(positions[p0Index * 3 + 0], positions[p0Index * 3 + 1], positions[p0Index * 3 + 2]);\n TmpVectors.Vector3[1].copyFromFloats(positions[p1Index * 3 + 0], positions[p1Index * 3 + 1], positions[p1Index * 3 + 2]);\n this.createLine(TmpVectors.Vector3[0], TmpVectors.Vector3[1], this._linesPositions.length / 3);\n }\n }\n /**\n * Merge into a single mesh\n */\n const engine = this._source.getScene().getEngine();\n this._buffers[VertexBuffer.PositionKind] = new VertexBuffer(engine, this._linesPositions, VertexBuffer.PositionKind, false);\n this._buffers[VertexBuffer.NormalKind] = new VertexBuffer(engine, this._linesNormals, VertexBuffer.NormalKind, false, false, 4);\n this._buffersForInstances[VertexBuffer.PositionKind] = this._buffers[VertexBuffer.PositionKind];\n this._buffersForInstances[VertexBuffer.NormalKind] = this._buffers[VertexBuffer.NormalKind];\n this._ib = engine.createIndexBuffer(this._linesIndices);\n this._indicesCount = this._linesIndices.length;\n }\n /**\n * Generates lines edges from adjacencjes\n * @private\n */\n _generateEdgesLines() {\n const positions = this._source.getVerticesData(VertexBuffer.PositionKind);\n const indices = this._source.getIndices();\n if (!indices || !positions) {\n return;\n }\n // First let's find adjacencies\n const adjacencies = [];\n const faceNormals = [];\n let index;\n let faceAdjacencies;\n // Prepare faces\n for (index = 0; index < indices.length; index += 3) {\n faceAdjacencies = new FaceAdjacencies();\n const p0Index = indices[index];\n const p1Index = indices[index + 1];\n const p2Index = indices[index + 2];\n faceAdjacencies.p0 = new Vector3(positions[p0Index * 3], positions[p0Index * 3 + 1], positions[p0Index * 3 + 2]);\n faceAdjacencies.p1 = new Vector3(positions[p1Index * 3], positions[p1Index * 3 + 1], positions[p1Index * 3 + 2]);\n faceAdjacencies.p2 = new Vector3(positions[p2Index * 3], positions[p2Index * 3 + 1], positions[p2Index * 3 + 2]);\n const faceNormal = Vector3.Cross(faceAdjacencies.p1.subtract(faceAdjacencies.p0), faceAdjacencies.p2.subtract(faceAdjacencies.p1));\n faceNormal.normalize();\n faceNormals.push(faceNormal);\n adjacencies.push(faceAdjacencies);\n }\n // Scan\n for (index = 0; index < adjacencies.length; index++) {\n faceAdjacencies = adjacencies[index];\n for (let otherIndex = index + 1; otherIndex < adjacencies.length; otherIndex++) {\n const otherFaceAdjacencies = adjacencies[otherIndex];\n if (faceAdjacencies.edgesConnectedCount === 3) {\n // Full\n break;\n }\n if (otherFaceAdjacencies.edgesConnectedCount === 3) {\n // Full\n continue;\n }\n const otherP0 = indices[otherIndex * 3];\n const otherP1 = indices[otherIndex * 3 + 1];\n const otherP2 = indices[otherIndex * 3 + 2];\n for (let edgeIndex = 0; edgeIndex < 3; edgeIndex++) {\n let otherEdgeIndex = 0;\n if (faceAdjacencies.edges[edgeIndex] !== undefined) {\n continue;\n }\n switch (edgeIndex) {\n case 0:\n if (this._checkVerticesInsteadOfIndices) {\n otherEdgeIndex = this._processEdgeForAdjacenciesWithVertices(faceAdjacencies.p0, faceAdjacencies.p1, otherFaceAdjacencies.p0, otherFaceAdjacencies.p1, otherFaceAdjacencies.p2);\n } else {\n otherEdgeIndex = this._processEdgeForAdjacencies(indices[index * 3], indices[index * 3 + 1], otherP0, otherP1, otherP2);\n }\n break;\n case 1:\n if (this._checkVerticesInsteadOfIndices) {\n otherEdgeIndex = this._processEdgeForAdjacenciesWithVertices(faceAdjacencies.p1, faceAdjacencies.p2, otherFaceAdjacencies.p0, otherFaceAdjacencies.p1, otherFaceAdjacencies.p2);\n } else {\n otherEdgeIndex = this._processEdgeForAdjacencies(indices[index * 3 + 1], indices[index * 3 + 2], otherP0, otherP1, otherP2);\n }\n break;\n case 2:\n if (this._checkVerticesInsteadOfIndices) {\n otherEdgeIndex = this._processEdgeForAdjacenciesWithVertices(faceAdjacencies.p2, faceAdjacencies.p0, otherFaceAdjacencies.p0, otherFaceAdjacencies.p1, otherFaceAdjacencies.p2);\n } else {\n otherEdgeIndex = this._processEdgeForAdjacencies(indices[index * 3 + 2], indices[index * 3], otherP0, otherP1, otherP2);\n }\n break;\n }\n if (otherEdgeIndex === -1) {\n continue;\n }\n faceAdjacencies.edges[edgeIndex] = otherIndex;\n otherFaceAdjacencies.edges[otherEdgeIndex] = index;\n faceAdjacencies.edgesConnectedCount++;\n otherFaceAdjacencies.edgesConnectedCount++;\n if (faceAdjacencies.edgesConnectedCount === 3) {\n break;\n }\n }\n }\n }\n // Create lines\n for (index = 0; index < adjacencies.length; index++) {\n // We need a line when a face has no adjacency on a specific edge or if all the adjacencies has an angle greater than epsilon\n const current = adjacencies[index];\n this._checkEdge(index, current.edges[0], faceNormals, current.p0, current.p1);\n this._checkEdge(index, current.edges[1], faceNormals, current.p1, current.p2);\n this._checkEdge(index, current.edges[2], faceNormals, current.p2, current.p0);\n }\n // Merge into a single mesh\n const engine = this._source.getScene().getEngine();\n this._buffers[VertexBuffer.PositionKind] = new VertexBuffer(engine, this._linesPositions, VertexBuffer.PositionKind, false);\n this._buffers[VertexBuffer.NormalKind] = new VertexBuffer(engine, this._linesNormals, VertexBuffer.NormalKind, false, false, 4);\n this._buffersForInstances[VertexBuffer.PositionKind] = this._buffers[VertexBuffer.PositionKind];\n this._buffersForInstances[VertexBuffer.NormalKind] = this._buffers[VertexBuffer.NormalKind];\n this._ib = engine.createIndexBuffer(this._linesIndices);\n this._indicesCount = this._linesIndices.length;\n }\n /**\n * Checks whether or not the edges renderer is ready to render.\n * @returns true if ready, otherwise false.\n */\n isReady() {\n return this._lineShader.isReady(this._source, this._source.hasInstances && this.customInstances.length > 0 || this._source.hasThinInstances);\n }\n /**\n * Renders the edges of the attached mesh,\n */\n render() {\n const scene = this._source.getScene();\n const currentDrawWrapper = this._lineShader._getDrawWrapper();\n if (this._drawWrapper) {\n this._lineShader._setDrawWrapper(this._drawWrapper);\n }\n if (!this.isReady() || !scene.activeCamera) {\n this._lineShader._setDrawWrapper(currentDrawWrapper);\n return;\n }\n const hasInstances = this._source.hasInstances && this.customInstances.length > 0;\n const useBuffersWithInstances = hasInstances || this._source.hasThinInstances;\n let instanceCount = 0;\n if (useBuffersWithInstances) {\n this._buffersForInstances[\"world0\"] = this._source.getVertexBuffer(\"world0\");\n this._buffersForInstances[\"world1\"] = this._source.getVertexBuffer(\"world1\");\n this._buffersForInstances[\"world2\"] = this._source.getVertexBuffer(\"world2\");\n this._buffersForInstances[\"world3\"] = this._source.getVertexBuffer(\"world3\");\n if (hasInstances) {\n const instanceStorage = this._source._instanceDataStorage;\n instanceCount = this.customInstances.length;\n if (!instanceStorage.instancesData) {\n if (!this._source.getScene()._activeMeshesFrozen) {\n this.customInstances.reset();\n }\n return;\n }\n if (!instanceStorage.isFrozen) {\n let offset = 0;\n for (let i = 0; i < instanceCount; ++i) {\n this.customInstances.data[i].copyToArray(instanceStorage.instancesData, offset);\n offset += 16;\n }\n instanceStorage.instancesBuffer.updateDirectly(instanceStorage.instancesData, 0, instanceCount);\n }\n } else {\n instanceCount = this._source.thinInstanceCount;\n }\n }\n const engine = scene.getEngine();\n this._lineShader._preBind();\n if (this._source.edgesColor.a !== 1) {\n engine.setAlphaMode(2);\n } else {\n engine.setAlphaMode(0);\n }\n // VBOs\n engine.bindBuffers(useBuffersWithInstances ? this._buffersForInstances : this._buffers, this._ib, this._lineShader.getEffect());\n scene.resetCachedMaterial();\n this._lineShader.setColor4(\"color\", this._source.edgesColor);\n if (scene.activeCamera.mode === Camera.ORTHOGRAPHIC_CAMERA) {\n this._lineShader.setFloat(\"width\", this._source.edgesWidth / this.edgesWidthScalerForOrthographic);\n } else {\n this._lineShader.setFloat(\"width\", this._source.edgesWidth / this.edgesWidthScalerForPerspective);\n }\n this._lineShader.setFloat(\"aspectRatio\", engine.getAspectRatio(scene.activeCamera));\n this._lineShader.bind(this._source.getWorldMatrix(), this._source);\n // Draw order\n engine.drawElementsType(Material.TriangleFillMode, 0, this._indicesCount, instanceCount);\n this._lineShader.unbind();\n if (useBuffersWithInstances) {\n engine.unbindInstanceAttributes();\n }\n if (!this._source.getScene()._activeMeshesFrozen) {\n this.customInstances.reset();\n }\n this._lineShader._setDrawWrapper(currentDrawWrapper);\n }\n}\n/**\n * LineEdgesRenderer for LineMeshes to remove unnecessary triangulation\n */\nexport class LineEdgesRenderer extends EdgesRenderer {\n /**\n * This constructor turns off auto generating edges line in Edges Renderer to make it here.\n * @param source LineMesh used to generate edges\n * @param epsilon not important (specified angle for edge detection)\n * @param checkVerticesInsteadOfIndices not important for LineMesh\n */\n constructor(source, epsilon = 0.95, checkVerticesInsteadOfIndices = false) {\n super(source, epsilon, checkVerticesInsteadOfIndices, false);\n this._generateEdgesLines();\n }\n /**\n * Generate edges for each line in LinesMesh. Every Line should be rendered as edge.\n */\n _generateEdgesLines() {\n const positions = this._source.getVerticesData(VertexBuffer.PositionKind);\n const indices = this._source.getIndices();\n if (!indices || !positions) {\n return;\n }\n const p0 = TmpVectors.Vector3[0];\n const p1 = TmpVectors.Vector3[1];\n const len = indices.length - 1;\n for (let i = 0, offset = 0; i < len; i += 2, offset += 4) {\n Vector3.FromArrayToRef(positions, 3 * indices[i], p0);\n Vector3.FromArrayToRef(positions, 3 * indices[i + 1], p1);\n this.createLine(p0, p1, offset);\n }\n // Merge into a single mesh\n const engine = this._source.getScene().getEngine();\n this._buffers[VertexBuffer.PositionKind] = new VertexBuffer(engine, this._linesPositions, VertexBuffer.PositionKind, false);\n this._buffers[VertexBuffer.NormalKind] = new VertexBuffer(engine, this._linesNormals, VertexBuffer.NormalKind, false, false, 4);\n this._ib = engine.createIndexBuffer(this._linesIndices);\n this._indicesCount = this._linesIndices.length;\n }\n}","map":{"version":3,"names":["VertexBuffer","AbstractMesh","LinesMesh","InstancedLinesMesh","Vector3","TmpVectors","Material","ShaderMaterial","Camera","SmartArray","DrawWrapper","prototype","disableEdgesRendering","_edgesRenderer","dispose","enableEdgesRendering","epsilon","checkVerticesInsteadOfIndices","options","EdgesRenderer","Object","defineProperty","get","enumerable","configurable","LineEdgesRenderer","apply","arguments","FaceAdjacencies","constructor","edges","edgesConnectedCount","linesPositions","_linesPositions","linesNormals","_linesNormals","linesIndices","_linesIndices","lineShader","_lineShader","shader","_GetShader","scene","shaderLanguage","_edgeRenderLineShader","attributes","uniforms","uniformBuffers","extraInitializationsAsync","_ref","_asyncToGenerator","Promise","all","disableDepthWrite","backFaceCulling","checkReadyOnEveryCall","getEngine","isWebGPU","_shaderLanguage","source","generateEdgesLines","edgesWidthScalerForOrthographic","edgesWidthScalerForPerspective","Array","_buffers","_buffersForInstances","_checkVerticesInsteadOfIndices","isEnabled","customInstances","_source","_options","_epsilon","engine","getScene","_drawWrapper","_prepareRessources","_options$useAlternate","useAlternateEdgeFinder","_generateEdgesLinesAlternate","_generateEdgesLines","_meshRebuildObserver","onRebuildObservable","add","_rebuild","_meshDisposeObserver","onDisposeObservable","buffer","PositionKind","NormalKind","_ib","createIndexBuffer","_this$_drawWrapper","remove","_releaseBuffer","_processEdgeForAdjacencies","pa","pb","p0","p1","p2","_processEdgeForAdjacenciesWithVertices","eps","equalsWithEpsilon","_checkEdge","faceIndex","edge","faceNormals","needToCreateLine","undefined","dotProduct","Dot","createLine","length","offset","push","x","y","z","_tessellateTriangle","edgePoints","indexTriangle","indices","remapVertexIndices","makePointList","pointIndices","firstIndex","i","startEdge","e","sort","a","b","mainPointIndices","otherPointIndices","numMainPoints","numOtherPoints","idxMain","idxOther","bucketIsMain","bucketStep","bucketLimit","bucketIdxLimit","winding","numTris","bucketIdx","nbucketIdx","bucketPoints","nbucketPoints","bucket","lastIdx","_this$_options$useFas","_this$_options","_this$_options$epsilo","_this$_options2","_this$_options$epsilo2","_this$_options3","_this$_options4","positions","getVerticesData","getIndices","isArray","from","useFastVertexMerger","epsVertexMerge","Math","round","log","epsilonVertexMerge","uniquePositions","mapVertices","v1","x1","y1","z1","key","toFixed","idx","found","v2","x2","y2","z2","abs","applyTessellation","_this$_options$epsilo3","_this$_options5","epsVertexAligned","epsilonVertexAligned","mustTesselate","index","triangleToTessellate","p0Index","p1Index","p2Index","p0x","p0y","p0z","p1x","p1y","p1z","p0p1","sqrt","v","vIndex","p0p","pp1","edgesPoints","t","triangle","faceNormal","_this$_options6","removeDegeneratedTriangles","copyFromFloats","subtractToRef","Cross","normalize","tmp","ei","done","normal","_indicesCount","adjacencies","faceAdjacencies","subtract","otherIndex","otherFaceAdjacencies","otherP0","otherP1","otherP2","edgeIndex","otherEdgeIndex","current","isReady","hasInstances","hasThinInstances","render","currentDrawWrapper","_getDrawWrapper","_setDrawWrapper","activeCamera","useBuffersWithInstances","instanceCount","getVertexBuffer","instanceStorage","_instanceDataStorage","instancesData","_activeMeshesFrozen","reset","isFrozen","data","copyToArray","instancesBuffer","updateDirectly","thinInstanceCount","_preBind","edgesColor","setAlphaMode","bindBuffers","getEffect","resetCachedMaterial","setColor4","mode","ORTHOGRAPHIC_CAMERA","setFloat","edgesWidth","getAspectRatio","bind","getWorldMatrix","drawElementsType","TriangleFillMode","unbind","unbindInstanceAttributes","len","FromArrayToRef"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/core/Rendering/edgesRenderer.js"],"sourcesContent":["import { VertexBuffer } from \"../Buffers/buffer.js\";\nimport { AbstractMesh } from \"../Meshes/abstractMesh.js\";\nimport { LinesMesh, InstancedLinesMesh } from \"../Meshes/linesMesh.js\";\nimport { Vector3, TmpVectors } from \"../Maths/math.vector.js\";\nimport { Material } from \"../Materials/material.js\";\nimport { ShaderMaterial } from \"../Materials/shaderMaterial.js\";\nimport { Camera } from \"../Cameras/camera.js\";\n\nimport { SmartArray } from \"../Misc/smartArray.js\";\nimport { DrawWrapper } from \"../Materials/drawWrapper.js\";\nAbstractMesh.prototype.disableEdgesRendering = function () {\n if (this._edgesRenderer) {\n this._edgesRenderer.dispose();\n this._edgesRenderer = null;\n }\n return this;\n};\nAbstractMesh.prototype.enableEdgesRendering = function (epsilon = 0.95, checkVerticesInsteadOfIndices = false, options) {\n this.disableEdgesRendering();\n this._edgesRenderer = new EdgesRenderer(this, epsilon, checkVerticesInsteadOfIndices, true, options);\n return this;\n};\nObject.defineProperty(AbstractMesh.prototype, \"edgesRenderer\", {\n get: function () {\n return this._edgesRenderer;\n },\n enumerable: true,\n configurable: true,\n});\nLinesMesh.prototype.enableEdgesRendering = function (epsilon = 0.95, checkVerticesInsteadOfIndices = false) {\n this.disableEdgesRendering();\n this._edgesRenderer = new LineEdgesRenderer(this, epsilon, checkVerticesInsteadOfIndices);\n return this;\n};\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nInstancedLinesMesh.prototype.enableEdgesRendering = function (epsilon = 0.95, checkVerticesInsteadOfIndices = false) {\n LinesMesh.prototype.enableEdgesRendering.apply(this, arguments);\n return this;\n};\n/**\n * FaceAdjacencies Helper class to generate edges\n */\nclass FaceAdjacencies {\n constructor() {\n this.edges = [];\n this.edgesConnectedCount = 0;\n }\n}\n/**\n * This class is used to generate edges of the mesh that could then easily be rendered in a scene.\n */\nexport class EdgesRenderer {\n /** Gets the vertices generated by the edge renderer */\n get linesPositions() {\n return this._linesPositions;\n }\n /** Gets the normals generated by the edge renderer */\n get linesNormals() {\n return this._linesNormals;\n }\n /** Gets the indices generated by the edge renderer */\n get linesIndices() {\n return this._linesIndices;\n }\n /**\n * Gets or sets the shader used to draw the lines\n */\n get lineShader() {\n return this._lineShader;\n }\n set lineShader(shader) {\n this._lineShader = shader;\n }\n static _GetShader(scene, shaderLanguage) {\n if (!scene._edgeRenderLineShader) {\n const shader = new ShaderMaterial(\"lineShader\", scene, \"line\", {\n attributes: [\"position\", \"normal\"],\n uniforms: [\"world\", \"viewProjection\", \"color\", \"width\", \"aspectRatio\"],\n uniformBuffers: [\"Scene\", \"Mesh\"],\n shaderLanguage: shaderLanguage,\n extraInitializationsAsync: async () => {\n if (shaderLanguage === 1 /* ShaderLanguage.WGSL */) {\n await Promise.all([import(\"../ShadersWGSL/line.vertex.js\"), import(\"../ShadersWGSL/line.fragment.js\")]);\n }\n else {\n await Promise.all([import(\"../Shaders/line.vertex.js\"), import(\"../Shaders/line.fragment.js\")]);\n }\n },\n }, false);\n shader.disableDepthWrite = true;\n shader.backFaceCulling = false;\n shader.checkReadyOnEveryCall = scene.getEngine().isWebGPU;\n scene._edgeRenderLineShader = shader;\n }\n return scene._edgeRenderLineShader;\n }\n /**\n * Gets the shader language used.\n */\n get shaderLanguage() {\n return this._shaderLanguage;\n }\n /**\n * Creates an instance of the EdgesRenderer. It is primarily use to display edges of a mesh.\n * Beware when you use this class with complex objects as the adjacencies computation can be really long\n * @param source Mesh used to create edges\n * @param epsilon sum of angles in adjacency to check for edge\n * @param checkVerticesInsteadOfIndices bases the edges detection on vertices vs indices. Note that this parameter is not used if options.useAlternateEdgeFinder = true\n * @param generateEdgesLines - should generate Lines or only prepare resources.\n * @param options The options to apply when generating the edges\n */\n constructor(source, epsilon = 0.95, checkVerticesInsteadOfIndices = false, generateEdgesLines = true, options) {\n /**\n * Define the size of the edges with an orthographic camera\n */\n this.edgesWidthScalerForOrthographic = 1000.0;\n /**\n * Define the size of the edges with a perspective camera\n */\n this.edgesWidthScalerForPerspective = 50.0;\n this._linesPositions = new Array();\n this._linesNormals = new Array();\n this._linesIndices = new Array();\n this._buffers = {};\n this._buffersForInstances = {};\n this._checkVerticesInsteadOfIndices = false;\n /** Gets or sets a boolean indicating if the edgesRenderer is active */\n this.isEnabled = true;\n /**\n * List of instances to render in case the source mesh has instances\n */\n this.customInstances = new SmartArray(32);\n /** Shader language used*/\n this._shaderLanguage = 0 /* ShaderLanguage.GLSL */;\n this._source = source;\n this._checkVerticesInsteadOfIndices = checkVerticesInsteadOfIndices;\n this._options = options ?? null;\n this._epsilon = epsilon;\n const engine = this._source.getScene().getEngine();\n if (engine.isWebGPU) {\n this._drawWrapper = new DrawWrapper(engine);\n this._shaderLanguage = 1 /* ShaderLanguage.WGSL */;\n }\n this._prepareRessources();\n if (generateEdgesLines) {\n if (options?.useAlternateEdgeFinder ?? true) {\n this._generateEdgesLinesAlternate();\n }\n else {\n this._generateEdgesLines();\n }\n }\n this._meshRebuildObserver = this._source.onRebuildObservable.add(() => {\n this._rebuild();\n });\n this._meshDisposeObserver = this._source.onDisposeObservable.add(() => {\n this.dispose();\n });\n }\n _prepareRessources() {\n if (this._lineShader) {\n return;\n }\n this._lineShader = EdgesRenderer._GetShader(this._source.getScene(), this._shaderLanguage);\n }\n /** @internal */\n _rebuild() {\n let buffer = this._buffers[VertexBuffer.PositionKind];\n if (buffer) {\n buffer._rebuild();\n }\n buffer = this._buffers[VertexBuffer.NormalKind];\n if (buffer) {\n buffer._rebuild();\n }\n const scene = this._source.getScene();\n const engine = scene.getEngine();\n this._ib = engine.createIndexBuffer(this._linesIndices);\n }\n /**\n * Releases the required resources for the edges renderer\n */\n dispose() {\n this._source.onRebuildObservable.remove(this._meshRebuildObserver);\n this._source.onDisposeObservable.remove(this._meshDisposeObserver);\n let buffer = this._buffers[VertexBuffer.PositionKind];\n if (buffer) {\n buffer.dispose();\n this._buffers[VertexBuffer.PositionKind] = null;\n }\n buffer = this._buffers[VertexBuffer.NormalKind];\n if (buffer) {\n buffer.dispose();\n this._buffers[VertexBuffer.NormalKind] = null;\n }\n if (this._ib) {\n this._source.getScene().getEngine()._releaseBuffer(this._ib);\n }\n this._lineShader.dispose();\n this._drawWrapper?.dispose();\n }\n _processEdgeForAdjacencies(pa, pb, p0, p1, p2) {\n if ((pa === p0 && pb === p1) || (pa === p1 && pb === p0)) {\n return 0;\n }\n if ((pa === p1 && pb === p2) || (pa === p2 && pb === p1)) {\n return 1;\n }\n if ((pa === p2 && pb === p0) || (pa === p0 && pb === p2)) {\n return 2;\n }\n return -1;\n }\n _processEdgeForAdjacenciesWithVertices(pa, pb, p0, p1, p2) {\n const eps = 1e-10;\n if ((pa.equalsWithEpsilon(p0, eps) && pb.equalsWithEpsilon(p1, eps)) || (pa.equalsWithEpsilon(p1, eps) && pb.equalsWithEpsilon(p0, eps))) {\n return 0;\n }\n if ((pa.equalsWithEpsilon(p1, eps) && pb.equalsWithEpsilon(p2, eps)) || (pa.equalsWithEpsilon(p2, eps) && pb.equalsWithEpsilon(p1, eps))) {\n return 1;\n }\n if ((pa.equalsWithEpsilon(p2, eps) && pb.equalsWithEpsilon(p0, eps)) || (pa.equalsWithEpsilon(p0, eps) && pb.equalsWithEpsilon(p2, eps))) {\n return 2;\n }\n return -1;\n }\n /**\n * Checks if the pair of p0 and p1 is en edge\n * @param faceIndex\n * @param edge\n * @param faceNormals\n * @param p0\n * @param p1\n * @private\n */\n _checkEdge(faceIndex, edge, faceNormals, p0, p1) {\n let needToCreateLine;\n if (edge === undefined) {\n needToCreateLine = true;\n }\n else {\n const dotProduct = Vector3.Dot(faceNormals[faceIndex], faceNormals[edge]);\n needToCreateLine = dotProduct < this._epsilon;\n }\n if (needToCreateLine) {\n this.createLine(p0, p1, this._linesPositions.length / 3);\n }\n }\n /**\n * push line into the position, normal and index buffer\n * @param p0\n * @param p1\n * @param offset\n * @protected\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n createLine(p0, p1, offset) {\n // Positions\n this._linesPositions.push(p0.x, p0.y, p0.z, p0.x, p0.y, p0.z, p1.x, p1.y, p1.z, p1.x, p1.y, p1.z);\n // Normals\n this._linesNormals.push(p1.x, p1.y, p1.z, -1, p1.x, p1.y, p1.z, 1, p0.x, p0.y, p0.z, -1, p0.x, p0.y, p0.z, 1);\n // Indices\n this._linesIndices.push(offset, offset + 1, offset + 2, offset, offset + 2, offset + 3);\n }\n /**\n * See https://playground.babylonjs.com/#R3JR6V#1 for a visual display of the algorithm\n * @param edgePoints\n * @param indexTriangle\n * @param indices\n * @param remapVertexIndices\n */\n _tessellateTriangle(edgePoints, indexTriangle, indices, remapVertexIndices) {\n const makePointList = (edgePoints, pointIndices, firstIndex) => {\n if (firstIndex >= 0) {\n pointIndices.push(firstIndex);\n }\n for (let i = 0; i < edgePoints.length; ++i) {\n pointIndices.push(edgePoints[i][0]);\n }\n };\n let startEdge = 0;\n if (edgePoints[1].length >= edgePoints[0].length && edgePoints[1].length >= edgePoints[2].length) {\n startEdge = 1;\n }\n else if (edgePoints[2].length >= edgePoints[0].length && edgePoints[2].length >= edgePoints[1].length) {\n startEdge = 2;\n }\n for (let e = 0; e < 3; ++e) {\n if (e === startEdge) {\n edgePoints[e].sort((a, b) => (a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : 0));\n }\n else {\n edgePoints[e].sort((a, b) => (a[1] > b[1] ? -1 : a[1] < b[1] ? 1 : 0));\n }\n }\n const mainPointIndices = [], otherPointIndices = [];\n makePointList(edgePoints[startEdge], mainPointIndices, -1);\n const numMainPoints = mainPointIndices.length;\n for (let i = startEdge + 2; i >= startEdge + 1; --i) {\n makePointList(edgePoints[i % 3], otherPointIndices, i !== startEdge + 2 ? remapVertexIndices[indices[indexTriangle + ((i + 1) % 3)]] : -1);\n }\n const numOtherPoints = otherPointIndices.length;\n const idxMain = 0;\n const idxOther = 0;\n indices.push(remapVertexIndices[indices[indexTriangle + startEdge]], mainPointIndices[0], otherPointIndices[0]);\n indices.push(remapVertexIndices[indices[indexTriangle + ((startEdge + 1) % 3)]], otherPointIndices[numOtherPoints - 1], mainPointIndices[numMainPoints - 1]);\n const bucketIsMain = numMainPoints <= numOtherPoints;\n const bucketStep = bucketIsMain ? numMainPoints : numOtherPoints;\n const bucketLimit = bucketIsMain ? numOtherPoints : numMainPoints;\n const bucketIdxLimit = bucketIsMain ? numMainPoints - 1 : numOtherPoints - 1;\n const winding = bucketIsMain ? 0 : 1;\n let numTris = numMainPoints + numOtherPoints - 2;\n let bucketIdx = bucketIsMain ? idxMain : idxOther;\n let nbucketIdx = bucketIsMain ? idxOther : idxMain;\n const bucketPoints = bucketIsMain ? mainPointIndices : otherPointIndices;\n const nbucketPoints = bucketIsMain ? otherPointIndices : mainPointIndices;\n let bucket = 0;\n while (numTris-- > 0) {\n if (winding) {\n indices.push(bucketPoints[bucketIdx], nbucketPoints[nbucketIdx]);\n }\n else {\n indices.push(nbucketPoints[nbucketIdx], bucketPoints[bucketIdx]);\n }\n bucket += bucketStep;\n let lastIdx;\n if (bucket >= bucketLimit && bucketIdx < bucketIdxLimit) {\n lastIdx = bucketPoints[++bucketIdx];\n bucket -= bucketLimit;\n }\n else {\n lastIdx = nbucketPoints[++nbucketIdx];\n }\n indices.push(lastIdx);\n }\n indices[indexTriangle + 0] = indices[indices.length - 3];\n indices[indexTriangle + 1] = indices[indices.length - 2];\n indices[indexTriangle + 2] = indices[indices.length - 1];\n indices.length = indices.length - 3;\n }\n _generateEdgesLinesAlternate() {\n const positions = this._source.getVerticesData(VertexBuffer.PositionKind);\n let indices = this._source.getIndices();\n if (!indices || !positions) {\n return;\n }\n if (!Array.isArray(indices)) {\n indices = Array.from(indices);\n }\n /**\n * Find all vertices that are at the same location (with an epsilon) and remapp them on the same vertex\n */\n const useFastVertexMerger = this._options?.useFastVertexMerger ?? true;\n const epsVertexMerge = useFastVertexMerger ? Math.round(-Math.log(this._options?.epsilonVertexMerge ?? 1e-6) / Math.log(10)) : (this._options?.epsilonVertexMerge ?? 1e-6);\n const remapVertexIndices = [];\n const uniquePositions = []; // list of unique index of vertices - needed for tessellation\n if (useFastVertexMerger) {\n const mapVertices = {};\n for (let v1 = 0; v1 < positions.length; v1 += 3) {\n const x1 = positions[v1 + 0], y1 = positions[v1 + 1], z1 = positions[v1 + 2];\n const key = x1.toFixed(epsVertexMerge) + \"|\" + y1.toFixed(epsVertexMerge) + \"|\" + z1.toFixed(epsVertexMerge);\n if (mapVertices[key] !== undefined) {\n remapVertexIndices.push(mapVertices[key]);\n }\n else {\n const idx = v1 / 3;\n mapVertices[key] = idx;\n remapVertexIndices.push(idx);\n uniquePositions.push(idx);\n }\n }\n }\n else {\n for (let v1 = 0; v1 < positions.length; v1 += 3) {\n const x1 = positions[v1 + 0], y1 = positions[v1 + 1], z1 = positions[v1 + 2];\n let found = false;\n for (let v2 = 0; v2 < v1 && !found; v2 += 3) {\n const x2 = positions[v2 + 0], y2 = positions[v2 + 1], z2 = positions[v2 + 2];\n if (Math.abs(x1 - x2) < epsVertexMerge && Math.abs(y1 - y2) < epsVertexMerge && Math.abs(z1 - z2) < epsVertexMerge) {\n remapVertexIndices.push(v2 / 3);\n found = true;\n break;\n }\n }\n if (!found) {\n remapVertexIndices.push(v1 / 3);\n uniquePositions.push(v1 / 3);\n }\n }\n }\n if (this._options?.applyTessellation) {\n /**\n * Tessellate triangles if necessary:\n *\n * A\n * +\n * |\\\n * | \\\n * | \\\n * E + \\\n * /| \\\n * / | \\\n * / | \\\n * +---+-------+ B\n * D C\n *\n * For the edges to be rendered correctly, the ABC triangle has to be split into ABE and BCE, else AC is considered to be an edge, whereas only AE should be.\n *\n * The tessellation process looks for the vertices like E that are in-between two other vertices making of an edge and create new triangles as necessary\n */\n // First step: collect the triangles to tessellate\n const epsVertexAligned = this._options?.epsilonVertexAligned ?? 1e-6;\n const mustTesselate = []; // liste of triangles that must be tessellated\n for (let index = 0; index < indices.length; index += 3) {\n // loop over all triangles\n let triangleToTessellate;\n for (let i = 0; i < 3; ++i) {\n // loop over the 3 edges of the triangle\n const p0Index = remapVertexIndices[indices[index + i]];\n const p1Index = remapVertexIndices[indices[index + ((i + 1) % 3)]];\n const p2Index = remapVertexIndices[indices[index + ((i + 2) % 3)]];\n if (p0Index === p1Index) {\n continue;\n } // degenerated triangle - don't process\n const p0x = positions[p0Index * 3 + 0], p0y = positions[p0Index * 3 + 1], p0z = positions[p0Index * 3 + 2];\n const p1x = positions[p1Index * 3 + 0], p1y = positions[p1Index * 3 + 1], p1z = positions[p1Index * 3 + 2];\n const p0p1 = Math.sqrt((p1x - p0x) * (p1x - p0x) + (p1y - p0y) * (p1y - p0y) + (p1z - p0z) * (p1z - p0z));\n for (let v = 0; v < uniquePositions.length - 1; v++) {\n // loop over all (unique) vertices and look for the ones that would be in-between p0 and p1\n const vIndex = uniquePositions[v];\n if (vIndex === p0Index || vIndex === p1Index || vIndex === p2Index) {\n continue;\n } // don't handle the vertex if it is a vertex of the current triangle\n const x = positions[vIndex * 3 + 0], y = positions[vIndex * 3 + 1], z = positions[vIndex * 3 + 2];\n const p0p = Math.sqrt((x - p0x) * (x - p0x) + (y - p0y) * (y - p0y) + (z - p0z) * (z - p0z));\n const pp1 = Math.sqrt((x - p1x) * (x - p1x) + (y - p1y) * (y - p1y) + (z - p1z) * (z - p1z));\n if (Math.abs(p0p + pp1 - p0p1) < epsVertexAligned) {\n // vertices are aligned and p in-between p0 and p1 if distance(p0, p) + distance (p, p1) ~ distance(p0, p1)\n if (!triangleToTessellate) {\n triangleToTessellate = {\n index: index,\n edgesPoints: [[], [], []],\n };\n mustTesselate.push(triangleToTessellate);\n }\n triangleToTessellate.edgesPoints[i].push([vIndex, p0p]);\n }\n }\n }\n }\n // Second step: tesselate the triangles\n for (let t = 0; t < mustTesselate.length; ++t) {\n const triangle = mustTesselate[t];\n this._tessellateTriangle(triangle.edgesPoints, triangle.index, indices, remapVertexIndices);\n }\n mustTesselate.length = 0;\n }\n /**\n * Collect the edges to render\n */\n const edges = {};\n for (let index = 0; index < indices.length; index += 3) {\n let faceNormal;\n for (let i = 0; i < 3; ++i) {\n let p0Index = remapVertexIndices[indices[index + i]];\n let p1Index = remapVertexIndices[indices[index + ((i + 1) % 3)]];\n const p2Index = remapVertexIndices[indices[index + ((i + 2) % 3)]];\n if (p0Index === p1Index || ((p0Index === p2Index || p1Index === p2Index) && this._options?.removeDegeneratedTriangles)) {\n continue;\n }\n TmpVectors.Vector3[0].copyFromFloats(positions[p0Index * 3 + 0], positions[p0Index * 3 + 1], positions[p0Index * 3 + 2]);\n TmpVectors.Vector3[1].copyFromFloats(positions[p1Index * 3 + 0], positions[p1Index * 3 + 1], positions[p1Index * 3 + 2]);\n TmpVectors.Vector3[2].copyFromFloats(positions[p2Index * 3 + 0], positions[p2Index * 3 + 1], positions[p2Index * 3 + 2]);\n if (!faceNormal) {\n TmpVectors.Vector3[1].subtractToRef(TmpVectors.Vector3[0], TmpVectors.Vector3[3]);\n TmpVectors.Vector3[2].subtractToRef(TmpVectors.Vector3[1], TmpVectors.Vector3[4]);\n faceNormal = Vector3.Cross(TmpVectors.Vector3[3], TmpVectors.Vector3[4]);\n faceNormal.normalize();\n }\n if (p0Index > p1Index) {\n const tmp = p0Index;\n p0Index = p1Index;\n p1Index = tmp;\n }\n const key = p0Index + \"_\" + p1Index;\n const ei = edges[key];\n if (ei) {\n if (!ei.done) {\n const dotProduct = Vector3.Dot(faceNormal, ei.normal);\n if (dotProduct < this._epsilon) {\n this.createLine(TmpVectors.Vector3[0], TmpVectors.Vector3[1], this._linesPositions.length / 3);\n }\n ei.done = true;\n }\n }\n else {\n edges[key] = { normal: faceNormal, done: false, index: index, i: i };\n }\n }\n }\n for (const key in edges) {\n const ei = edges[key];\n if (!ei.done) {\n // Orphaned edge - we must display it\n const p0Index = remapVertexIndices[indices[ei.index + ei.i]];\n const p1Index = remapVertexIndices[indices[ei.index + ((ei.i + 1) % 3)]];\n TmpVectors.Vector3[0].copyFromFloats(positions[p0Index * 3 + 0], positions[p0Index * 3 + 1], positions[p0Index * 3 + 2]);\n TmpVectors.Vector3[1].copyFromFloats(positions[p1Index * 3 + 0], positions[p1Index * 3 + 1], positions[p1Index * 3 + 2]);\n this.createLine(TmpVectors.Vector3[0], TmpVectors.Vector3[1], this._linesPositions.length / 3);\n }\n }\n /**\n * Merge into a single mesh\n */\n const engine = this._source.getScene().getEngine();\n this._buffers[VertexBuffer.PositionKind] = new VertexBuffer(engine, this._linesPositions, VertexBuffer.PositionKind, false);\n this._buffers[VertexBuffer.NormalKind] = new VertexBuffer(engine, this._linesNormals, VertexBuffer.NormalKind, false, false, 4);\n this._buffersForInstances[VertexBuffer.PositionKind] = this._buffers[VertexBuffer.PositionKind];\n this._buffersForInstances[VertexBuffer.NormalKind] = this._buffers[VertexBuffer.NormalKind];\n this._ib = engine.createIndexBuffer(this._linesIndices);\n this._indicesCount = this._linesIndices.length;\n }\n /**\n * Generates lines edges from adjacencjes\n * @private\n */\n _generateEdgesLines() {\n const positions = this._source.getVerticesData(VertexBuffer.PositionKind);\n const indices = this._source.getIndices();\n if (!indices || !positions) {\n return;\n }\n // First let's find adjacencies\n const adjacencies = [];\n const faceNormals = [];\n let index;\n let faceAdjacencies;\n // Prepare faces\n for (index = 0; index < indices.length; index += 3) {\n faceAdjacencies = new FaceAdjacencies();\n const p0Index = indices[index];\n const p1Index = indices[index + 1];\n const p2Index = indices[index + 2];\n faceAdjacencies.p0 = new Vector3(positions[p0Index * 3], positions[p0Index * 3 + 1], positions[p0Index * 3 + 2]);\n faceAdjacencies.p1 = new Vector3(positions[p1Index * 3], positions[p1Index * 3 + 1], positions[p1Index * 3 + 2]);\n faceAdjacencies.p2 = new Vector3(positions[p2Index * 3], positions[p2Index * 3 + 1], positions[p2Index * 3 + 2]);\n const faceNormal = Vector3.Cross(faceAdjacencies.p1.subtract(faceAdjacencies.p0), faceAdjacencies.p2.subtract(faceAdjacencies.p1));\n faceNormal.normalize();\n faceNormals.push(faceNormal);\n adjacencies.push(faceAdjacencies);\n }\n // Scan\n for (index = 0; index < adjacencies.length; index++) {\n faceAdjacencies = adjacencies[index];\n for (let otherIndex = index + 1; otherIndex < adjacencies.length; otherIndex++) {\n const otherFaceAdjacencies = adjacencies[otherIndex];\n if (faceAdjacencies.edgesConnectedCount === 3) {\n // Full\n break;\n }\n if (otherFaceAdjacencies.edgesConnectedCount === 3) {\n // Full\n continue;\n }\n const otherP0 = indices[otherIndex * 3];\n const otherP1 = indices[otherIndex * 3 + 1];\n const otherP2 = indices[otherIndex * 3 + 2];\n for (let edgeIndex = 0; edgeIndex < 3; edgeIndex++) {\n let otherEdgeIndex = 0;\n if (faceAdjacencies.edges[edgeIndex] !== undefined) {\n continue;\n }\n switch (edgeIndex) {\n case 0:\n if (this._checkVerticesInsteadOfIndices) {\n otherEdgeIndex = this._processEdgeForAdjacenciesWithVertices(faceAdjacencies.p0, faceAdjacencies.p1, otherFaceAdjacencies.p0, otherFaceAdjacencies.p1, otherFaceAdjacencies.p2);\n }\n else {\n otherEdgeIndex = this._processEdgeForAdjacencies(indices[index * 3], indices[index * 3 + 1], otherP0, otherP1, otherP2);\n }\n break;\n case 1:\n if (this._checkVerticesInsteadOfIndices) {\n otherEdgeIndex = this._processEdgeForAdjacenciesWithVertices(faceAdjacencies.p1, faceAdjacencies.p2, otherFaceAdjacencies.p0, otherFaceAdjacencies.p1, otherFaceAdjacencies.p2);\n }\n else {\n otherEdgeIndex = this._processEdgeForAdjacencies(indices[index * 3 + 1], indices[index * 3 + 2], otherP0, otherP1, otherP2);\n }\n break;\n case 2:\n if (this._checkVerticesInsteadOfIndices) {\n otherEdgeIndex = this._processEdgeForAdjacenciesWithVertices(faceAdjacencies.p2, faceAdjacencies.p0, otherFaceAdjacencies.p0, otherFaceAdjacencies.p1, otherFaceAdjacencies.p2);\n }\n else {\n otherEdgeIndex = this._processEdgeForAdjacencies(indices[index * 3 + 2], indices[index * 3], otherP0, otherP1, otherP2);\n }\n break;\n }\n if (otherEdgeIndex === -1) {\n continue;\n }\n faceAdjacencies.edges[edgeIndex] = otherIndex;\n otherFaceAdjacencies.edges[otherEdgeIndex] = index;\n faceAdjacencies.edgesConnectedCount++;\n otherFaceAdjacencies.edgesConnectedCount++;\n if (faceAdjacencies.edgesConnectedCount === 3) {\n break;\n }\n }\n }\n }\n // Create lines\n for (index = 0; index < adjacencies.length; index++) {\n // We need a line when a face has no adjacency on a specific edge or if all the adjacencies has an angle greater than epsilon\n const current = adjacencies[index];\n this._checkEdge(index, current.edges[0], faceNormals, current.p0, current.p1);\n this._checkEdge(index, current.edges[1], faceNormals, current.p1, current.p2);\n this._checkEdge(index, current.edges[2], faceNormals, current.p2, current.p0);\n }\n // Merge into a single mesh\n const engine = this._source.getScene().getEngine();\n this._buffers[VertexBuffer.PositionKind] = new VertexBuffer(engine, this._linesPositions, VertexBuffer.PositionKind, false);\n this._buffers[VertexBuffer.NormalKind] = new VertexBuffer(engine, this._linesNormals, VertexBuffer.NormalKind, false, false, 4);\n this._buffersForInstances[VertexBuffer.PositionKind] = this._buffers[VertexBuffer.PositionKind];\n this._buffersForInstances[VertexBuffer.NormalKind] = this._buffers[VertexBuffer.NormalKind];\n this._ib = engine.createIndexBuffer(this._linesIndices);\n this._indicesCount = this._linesIndices.length;\n }\n /**\n * Checks whether or not the edges renderer is ready to render.\n * @returns true if ready, otherwise false.\n */\n isReady() {\n return this._lineShader.isReady(this._source, (this._source.hasInstances && this.customInstances.length > 0) || this._source.hasThinInstances);\n }\n /**\n * Renders the edges of the attached mesh,\n */\n render() {\n const scene = this._source.getScene();\n const currentDrawWrapper = this._lineShader._getDrawWrapper();\n if (this._drawWrapper) {\n this._lineShader._setDrawWrapper(this._drawWrapper);\n }\n if (!this.isReady() || !scene.activeCamera) {\n this._lineShader._setDrawWrapper(currentDrawWrapper);\n return;\n }\n const hasInstances = this._source.hasInstances && this.customInstances.length > 0;\n const useBuffersWithInstances = hasInstances || this._source.hasThinInstances;\n let instanceCount = 0;\n if (useBuffersWithInstances) {\n this._buffersForInstances[\"world0\"] = this._source.getVertexBuffer(\"world0\");\n this._buffersForInstances[\"world1\"] = this._source.getVertexBuffer(\"world1\");\n this._buffersForInstances[\"world2\"] = this._source.getVertexBuffer(\"world2\");\n this._buffersForInstances[\"world3\"] = this._source.getVertexBuffer(\"world3\");\n if (hasInstances) {\n const instanceStorage = this._source._instanceDataStorage;\n instanceCount = this.customInstances.length;\n if (!instanceStorage.instancesData) {\n if (!this._source.getScene()._activeMeshesFrozen) {\n this.customInstances.reset();\n }\n return;\n }\n if (!instanceStorage.isFrozen) {\n let offset = 0;\n for (let i = 0; i < instanceCount; ++i) {\n this.customInstances.data[i].copyToArray(instanceStorage.instancesData, offset);\n offset += 16;\n }\n instanceStorage.instancesBuffer.updateDirectly(instanceStorage.instancesData, 0, instanceCount);\n }\n }\n else {\n instanceCount = this._source.thinInstanceCount;\n }\n }\n const engine = scene.getEngine();\n this._lineShader._preBind();\n if (this._source.edgesColor.a !== 1) {\n engine.setAlphaMode(2);\n }\n else {\n engine.setAlphaMode(0);\n }\n // VBOs\n engine.bindBuffers(useBuffersWithInstances ? this._buffersForInstances : this._buffers, this._ib, this._lineShader.getEffect());\n scene.resetCachedMaterial();\n this._lineShader.setColor4(\"color\", this._source.edgesColor);\n if (scene.activeCamera.mode === Camera.ORTHOGRAPHIC_CAMERA) {\n this._lineShader.setFloat(\"width\", this._source.edgesWidth / this.edgesWidthScalerForOrthographic);\n }\n else {\n this._lineShader.setFloat(\"width\", this._source.edgesWidth / this.edgesWidthScalerForPerspective);\n }\n this._lineShader.setFloat(\"aspectRatio\", engine.getAspectRatio(scene.activeCamera));\n this._lineShader.bind(this._source.getWorldMatrix(), this._source);\n // Draw order\n engine.drawElementsType(Material.TriangleFillMode, 0, this._indicesCount, instanceCount);\n this._lineShader.unbind();\n if (useBuffersWithInstances) {\n engine.unbindInstanceAttributes();\n }\n if (!this._source.getScene()._activeMeshesFrozen) {\n this.customInstances.reset();\n }\n this._lineShader._setDrawWrapper(currentDrawWrapper);\n }\n}\n/**\n * LineEdgesRenderer for LineMeshes to remove unnecessary triangulation\n */\nexport class LineEdgesRenderer extends EdgesRenderer {\n /**\n * This constructor turns off auto generating edges line in Edges Renderer to make it here.\n * @param source LineMesh used to generate edges\n * @param epsilon not important (specified angle for edge detection)\n * @param checkVerticesInsteadOfIndices not important for LineMesh\n */\n constructor(source, epsilon = 0.95, checkVerticesInsteadOfIndices = false) {\n super(source, epsilon, checkVerticesInsteadOfIndices, false);\n this._generateEdgesLines();\n }\n /**\n * Generate edges for each line in LinesMesh. Every Line should be rendered as edge.\n */\n _generateEdgesLines() {\n const positions = this._source.getVerticesData(VertexBuffer.PositionKind);\n const indices = this._source.getIndices();\n if (!indices || !positions) {\n return;\n }\n const p0 = TmpVectors.Vector3[0];\n const p1 = TmpVectors.Vector3[1];\n const len = indices.length - 1;\n for (let i = 0, offset = 0; i < len; i += 2, offset += 4) {\n Vector3.FromArrayToRef(positions, 3 * indices[i], p0);\n Vector3.FromArrayToRef(positions, 3 * indices[i + 1], p1);\n this.createLine(p0, p1, offset);\n }\n // Merge into a single mesh\n const engine = this._source.getScene().getEngine();\n this._buffers[VertexBuffer.PositionKind] = new VertexBuffer(engine, this._linesPositions, VertexBuffer.PositionKind, false);\n this._buffers[VertexBuffer.NormalKind] = new VertexBuffer(engine, this._linesNormals, VertexBuffer.NormalKind, false, false, 4);\n this._ib = engine.createIndexBuffer(this._linesIndices);\n this._indicesCount = this._linesIndices.length;\n }\n}\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}
|