static renderTriangle()

in src/engine/actvolume/volgen.js [25:157]


  static renderTriangle(xDim, yDim, zDim, pixels, verts) {
    const xyDim = xDim * yDim;

    // outer loop:
    // [0] -> [1]
    // [0] -> [2]
    const v01 = new THREE.Vector3();
    const v02 = new THREE.Vector3();
    const v12 = new THREE.Vector3();
    v01.x = verts[1].x - verts[0].x;
    v01.y = verts[1].y - verts[0].y;
    v01.z = verts[1].z - verts[0].z;
    v02.x = verts[2].x - verts[0].x;
    v02.y = verts[2].y - verts[0].y;
    v02.z = verts[2].z - verts[0].z;

    v12.x = verts[2].x - verts[1].x;
    v12.y = verts[2].y - verts[1].y;
    v12.z = verts[2].z - verts[1].z;

    const dist01 = Math.sqrt(v01.x * v01.x + v01.y * v01.y + v01.z * v01.z);
    const dist02 = Math.sqrt(v02.x * v02.x + v02.y * v02.y + v02.z * v02.z);
    const dist12 = Math.sqrt(v12.x * v12.x + v12.y * v12.y + v12.z * v12.z);

    let distMax = dist01 > dist02 ? dist01 : dist02;
    distMax = dist12 > distMax ? dist12 : distMax;
    const ITERS_ESTIMATE = 1.2;
    const numIters = Math.floor(distMax * ITERS_ESTIMATE);

    const vLScale = new THREE.Vector3();
    const vRScale = new THREE.Vector3();

    vLScale.x = v01.x / numIters;
    vLScale.y = v01.y / numIters;
    vLScale.z = v01.z / numIters;

    vRScale.x = v02.x / numIters;
    vRScale.y = v02.y / numIters;
    vRScale.z = v02.z / numIters;

    const vL = new THREE.Vector3(verts[0].x, verts[0].y, verts[0].z);
    const vR = new THREE.Vector3(verts[0].x, verts[0].y, verts[0].z);
    const vLR = new THREE.Vector3();
    const vScale = new THREE.Vector3();
    const v = new THREE.Vector3();

    for (let iterSide = 0; iterSide <= numIters; iterSide++) {
      vLR.x = vR.x - vL.x;
      vLR.y = vR.y - vL.y;
      vLR.z = vR.z - vL.z;

      vScale.x = vLR.x / numIters;
      vScale.y = vLR.y / numIters;
      vScale.z = vLR.z / numIters;

      v.x = vL.x;
      v.y = vL.y;
      v.z = vL.z;

      const VIS = 255;
      // interpolate between vL <-> vR
      for (let i = 0; i <= numIters; i++) {
        let x = Math.floor(v.x);
        let y = Math.floor(v.y);
        let z = Math.floor(v.z);

        if (x >= 0 && y >= 0 && z >= 0 && x < xDim && y < yDim && z < zDim) {
          const off = x + y * xDim + z * xyDim;
          pixels[off] = VIS;
        }

        // try to fill neighb
        x = Math.floor(v.x) + 1;
        y = Math.floor(v.y) + 0;
        z = Math.floor(v.z) + 0;
        if (x >= 0 && y >= 0 && z >= 0 && x < xDim && y < yDim && z < zDim) {
          const off = x + y * xDim + z * xyDim;
          pixels[off] = VIS;
        }

        x = Math.floor(v.x) + 0;
        y = Math.floor(v.y) + 1;
        z = Math.floor(v.z) + 0;
        if (x >= 0 && y >= 0 && z >= 0 && x < xDim && y < yDim && z < zDim) {
          const off = x + y * xDim + z * xyDim;
          pixels[off] = VIS;
        }

        x = Math.floor(v.x) + 0;
        y = Math.floor(v.y) + 0;
        z = Math.floor(v.z) + 1;
        if (x >= 0 && y >= 0 && z >= 0 && x < xDim && y < yDim && z < zDim) {
          const off = x + y * xDim + z * xyDim;
          pixels[off] = VIS;
        }

        x = Math.floor(v.x) - 1;
        y = Math.floor(v.y) + 0;
        z = Math.floor(v.z) + 0;
        if (x >= 0 && y >= 0 && z >= 0 && x < xDim && y < yDim && z < zDim) {
          const off = x + y * xDim + z * xyDim;
          pixels[off] = VIS;
        }

        x = Math.floor(v.x) + 0;
        y = Math.floor(v.y) - 1;
        z = Math.floor(v.z) + 0;
        if (x >= 0 && y >= 0 && z >= 0 && x < xDim && y < yDim && z < zDim) {
          const off = x + y * xDim + z * xyDim;
          pixels[off] = VIS;
        }
        x = Math.floor(v.x) + 0;
        y = Math.floor(v.y) + 0;
        z = Math.floor(v.z) - 1;
        if (x >= 0 && y >= 0 && z >= 0 && x < xDim && y < yDim && z < zDim) {
          const off = x + y * xDim + z * xyDim;
          pixels[off] = VIS;
        }
        // next v
        v.x += vScale.x;
        v.y += vScale.y;
        v.z += vScale.z;
      }
      // next L, R
      vL.x += vLScale.x;
      vL.y += vLScale.y;
      vL.z += vLScale.z;

      vR.x += vRScale.x;
      vR.y += vRScale.y;
      vR.z += vRScale.z;
    }
  }