in src/engine/actvolume/tetra.js [262:356]
subDivideMesh(numSubdividesOfOrigTetra) {
if (numSubdividesOfOrigTetra === 0) {
return 1;
}
const triStackSrc = new TriangleStack();
triStackSrc.create(numSubdividesOfOrigTetra);
const triStackDst = new TriangleStack();
triStackDst.create(numSubdividesOfOrigTetra);
const numTriangles = this.m_triangleSet.getNumTriangles();
for (let t = 0; t < numTriangles; t++) {
const triIndices = this.m_triangleSet.m_triangles[t].m_indices;
const ia = triIndices[0];
const ib = triIndices[1];
const ic = triIndices[2];
const va = this.m_pointSet.m_points[ia].m_point;
const vb = this.m_pointSet.m_points[ib].m_point;
const vc = this.m_pointSet.m_points[ic].m_point;
const okPush = triStackSrc.push(va, vb, vc);
if (okPush < 1) {
return okPush;
}
} // for (t) all triangles, push em all
let stackSrc = triStackSrc;
let stackDst = triStackDst;
for (let iter = 0; iter < numSubdividesOfOrigTetra; iter++) {
const numStacked = stackSrc.getStackDepth();
for (let s = 0; s < numStacked; s++) {
// pop tri from stack
const triSingle = stackSrc.pop();
if (triSingle === null) {
return -1;
}
const v1 = triSingle.va;
const v2 = triSingle.vb;
const v3 = triSingle.vc;
// create additional vertices
const v12 = new THREE.Vector3();
const v23 = new THREE.Vector3();
const v31 = new THREE.Vector3();
v12.addVectors(v1, v2);
v12.normalize();
v23.addVectors(v2, v3);
v23.normalize();
v31.addVectors(v3, v1);
v31.normalize();
stackDst.push(v1, v12, v31);
stackDst.push(v2, v23, v12);
stackDst.push(v3, v31, v23);
stackDst.push(v12, v23, v31);
} // for (s) stacked triangles
// exchange stack
const stackTmp = stackSrc;
stackSrc = stackDst;
stackDst = stackTmp;
} // for (iter) all stack depth, subdivide iterations
// now we have stack src
const numTrisInStack = stackSrc.getStackDepth();
// vertices should not be more than 12/20 == 0.6
const estimateNumVertices = Math.floor(numTrisInStack * 3 * 0.6);
this.m_triangleSet.create(numTrisInStack);
this.m_pointSet.create(estimateNumVertices);
// let numTrisFromStack = 0;
while (!stackSrc.isEmpty()) {
// V3f va, vb, vc;
// stackSrc->pop(va, vb, vc);
const triSingle = stackSrc.pop();
const va = triSingle.va;
const vb = triSingle.vb;
const vc = triSingle.vc;
const indA = this.m_pointSet.addPoint(va.x, va.y, va.z);
const indB = this.m_pointSet.addPoint(vb.x, vb.y, vb.z);
const indC = this.m_pointSet.addPoint(vc.x, vc.y, vc.z);
const okAddTri = this.m_triangleSet.addTriangle(indA, indB, indC);
if (okAddTri !== 1) {
return okAddTri;
}
// numTrisFromStack++;
} // while
// assert(m_pointsSet.getNumPoints() <= estimateNumVertices);
// assert(m_triangleSet.getNumTriangles() <= numTrisInStack);
const numPts = this.m_pointSet.getNumPoints();
const numTris = this.m_triangleSet.getNumTriangles();
const ERR_ESTIMATE = -10;
if (numPts > estimateNumVertices) {
return ERR_ESTIMATE;
}
if (numTris > numTrisInStack) {
return ERR_ESTIMATE;
}
return 1;
}