static extract2dSliceFromTiled3dTexture()

in src/engine/loaders/voltools.js [700:825]


  static extract2dSliceFromTiled3dTexture(xDim, yDim, zDim, pixelsSrc, sliceType, sliceIndex, pixelsDst, isRoi) {
    const BYTES_IN_DWORD = 4;
    //const zDimSqrt = Math.ceil(Math.sqrt(zDim));
    const TWO = 2;
    const ONE = 1;
    const zDimSqrt = TWO ** (ONE + Math.floor(Math.log(Math.sqrt(zDim)) / Math.log(TWO)));
    const lenSrc = pixelsSrc.length;
    const xSize = xDim * zDimSqrt;
    const ySize = yDim * zDimSqrt;
    if (lenSrc !== xSize * ySize * BYTES_IN_DWORD) {
      console.log(`Wrong 2d tiled vol size. Size = ${lenSrc}`);
    }
    const X_SLICE = 0;
    const Y_SLICE = 1;
    const Z_SLICE = 2;
    const OFF_0 = 0;
    const OFF_1 = 1;
    const OFF_2 = 2;
    const OFF_3 = 3;
    const VAL255 = 255;
    if (sliceType === X_SLICE) {
      const fx = sliceIndex / xDim;
      console.log(`extract2dSlice... fx = ${fx}`);
      let cx, cy;
      const w = yDim;
      const h = zDim;
      let j = 0;
      for (cy = 0; cy < h; cy++) {
        const fz = cy / h;
        for (cx = 0; cx < w; cx++) {
          const fy = cx / w;
          const vec2coord = {
            x: 0.0,
            y: 0.0,
          };
          VolumeTools.get2dCoordFromTiled3dCoord(xDim, yDim, zDim, zDimSqrt, fx, fy, fz, vec2coord);
          const ux = Math.floor(vec2coord.x * xSize);
          const uy = Math.floor(vec2coord.y * ySize);
          const off = ux + uy * xSize;
          const off4 = off * BYTES_IN_DWORD;
          if (isRoi) {
            pixelsDst[j + OFF_0] = pixelsSrc[off4 + OFF_0];
            pixelsDst[j + OFF_1] = pixelsSrc[off4 + OFF_1];
            pixelsDst[j + OFF_2] = pixelsSrc[off4 + OFF_2];
            pixelsDst[j + OFF_3] = VAL255;
          } else {
            pixelsDst[j + OFF_0] = pixelsSrc[off4 + OFF_3];
            pixelsDst[j + OFF_1] = pixelsSrc[off4 + OFF_3];
            pixelsDst[j + OFF_2] = pixelsSrc[off4 + OFF_3];
            pixelsDst[j + OFF_3] = VAL255;
          }
          j += BYTES_IN_DWORD;
        }
      }
    } // if x slice
    if (sliceType === Y_SLICE) {
      const fy = sliceIndex / yDim;
      console.log(`extract2dSlice... fy = ${fy}`);
      let cx, cy;
      const w = xDim;
      const h = zDim;
      let j = 0;
      for (cy = 0; cy < h; cy++) {
        const fz = cy / h;
        for (cx = 0; cx < w; cx++) {
          const fx = cx / w;
          const vec2coord = {
            x: 0.0,
            y: 0.0,
          };
          VolumeTools.get2dCoordFromTiled3dCoord(xDim, yDim, zDim, zDimSqrt, fx, fy, fz, vec2coord);
          const ux = Math.floor(vec2coord.x * xSize);
          const uy = Math.floor(vec2coord.y * ySize);
          const off = ux + uy * xSize;
          const off4 = off * BYTES_IN_DWORD;
          if (isRoi) {
            pixelsDst[j + OFF_0] = pixelsSrc[off4 + OFF_0];
            pixelsDst[j + OFF_1] = pixelsSrc[off4 + OFF_1];
            pixelsDst[j + OFF_2] = pixelsSrc[off4 + OFF_2];
            pixelsDst[j + OFF_3] = VAL255;
          } else {
            pixelsDst[j + OFF_0] = pixelsSrc[off4 + OFF_3];
            pixelsDst[j + OFF_1] = pixelsSrc[off4 + OFF_3];
            pixelsDst[j + OFF_2] = pixelsSrc[off4 + OFF_3];
            pixelsDst[j + OFF_3] = VAL255;
          }
          j += BYTES_IN_DWORD;
        }
      }
    } // if y slice
    if (sliceType === Z_SLICE) {
      const fz = sliceIndex / zDim;
      console.log(`extract2dSlice... fz = ${fz}. dim = ${xDim}*${yDim}*${zDim}. zDimSqrt = ${zDimSqrt}`);
      let cx, cy;
      const w = xDim;
      const h = yDim;
      let j = 0;
      for (cy = 0; cy < h; cy++) {
        const fy = cy / h;
        for (cx = 0; cx < w; cx++) {
          const fx = cx / w;
          const vec2coord = {
            x: 0.0,
            y: 0.0,
          };
          VolumeTools.get2dCoordFromTiled3dCoord(xDim, yDim, zDim, zDimSqrt, fx, fy, fz, vec2coord);
          const ux = Math.floor(vec2coord.x * xSize);
          const uy = Math.floor(vec2coord.y * ySize);
          const off = ux + uy * xSize;
          const off4 = off * BYTES_IN_DWORD;
          if (isRoi) {
            pixelsDst[j + OFF_0] = pixelsSrc[off4 + OFF_0];
            pixelsDst[j + OFF_1] = pixelsSrc[off4 + OFF_1];
            pixelsDst[j + OFF_2] = pixelsSrc[off4 + OFF_2];
            pixelsDst[j + OFF_3] = VAL255;
          } else {
            pixelsDst[j + OFF_0] = pixelsSrc[off4 + OFF_3];
            pixelsDst[j + OFF_1] = pixelsSrc[off4 + OFF_3];
            pixelsDst[j + OFF_2] = pixelsSrc[off4 + OFF_3];
            pixelsDst[j + OFF_3] = VAL255;
          }
          j += BYTES_IN_DWORD;
        }
      }
    } // if z slice
  }