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
}