volRenderer = {
let cameraUp = [0, 1, 0];
let cameraAt = [0, 0, 0];
let boxDim = [1, 1, 1];
let boxDiag = twgl.v3.length(boxDim);
let M = twgl.m4.axisRotation(cameraUp, deg2rad(1));
let cameraU, cameraV, cameraW, cameraEye;
let eyeVector = [0, 0, 1];
const computeEyePosition = () => {
return [
2 * boxDiag * eyeVector[0] + cameraAt[0],
2 * boxDiag * eyeVector[1] + cameraAt[1],
2 * boxDiag * eyeVector[2] + cameraAt[2]
];
};
const computeUVW = () => {
cameraEye = computeEyePosition();
cameraW = eyeVector.slice();
cameraU = twgl.v3.normalize(twgl.v3.cross(cameraUp, cameraW));
cameraV = twgl.v3.normalize(twgl.v3.cross(cameraW, cameraU));
};
const rotateCamera = () => {
eyeVector = twgl.m4.transformDirection(M, eyeVector);
computeUVW();
return cameraEye;
};
computeUVW();
function render(isoValue, isoSurfaceColor) {
gl.clear(gl.COLOR_BUFFER_BIT);
const uniforms = {
resolution: [gl.canvas.width, gl.canvas.height],
cameraU: cameraU,
cameraV: cameraV,
cameraW: cameraW,
cameraEye: cameraEye,
fov: deg2rad(20),
vTex: volume.texture,
isoColor: hex2rgb(isoSurfaceColor),
volDim: [volume.width, volume.height, volume.slices],
isoValue: isoValue
};
gl.useProgram(programInfo.program);
twgl.setBuffersAndAttributes(gl, programInfo, bufferInfo);
twgl.setUniforms(programInfo, uniforms);
twgl.drawBufferInfo(gl, bufferInfo);
}
return {
computeUVW: computeUVW,
render: render,
rotate: rotateCamera
};
}