@niivue/niivue
Version:
minimal webgl2 nifti image viewer
41 lines (37 loc) • 1.27 kB
text/typescript
import { mat4, vec3, vec4 } from 'gl-matrix'
export function swizzleVec3(vec: vec3, order = [0, 1, 2]): vec3 {
const vout = vec3.create()
vout[0] = vec[order[0]]
vout[1] = vec[order[1]]
vout[2] = vec[order[2]]
return vout
}
// return boolean is 2D slice view is radiological
// n.b. ambiguous for pure sagittal views
export function isRadiological(mtx: mat4): number {
const vRight = vec4.fromValues(1, 0, 0, 0) // pure right vector
const vRotated = vec4.create()
vec4.transformMat4(vRotated, vRight, mtx)
return vRotated[0]
}
export function unProject(winX: number, winY: number, winZ: number, mvpMatrix: mat4): vec4 {
// https://github.com/bringhurst/webgl-unproject
const inp = vec4.fromValues(winX, winY, winZ, 1.0)
const finalMatrix = mat4.clone(mvpMatrix)
// mat.mat4.multiply(finalMatrix, model, proj);
mat4.invert(finalMatrix, finalMatrix)
// view is leftTopWidthHeight
/* Map to range -1 to 1 */
inp[0] = inp[0] * 2 - 1
inp[1] = inp[1] * 2 - 1
inp[2] = inp[2] * 2 - 1
const out = vec4.create()
vec4.transformMat4(out, inp, finalMatrix)
if (out[3] === 0.0) {
return out
} // error
out[0] /= out[3]
out[1] /= out[3]
out[2] /= out[3]
return out
}