2019-03-23 21:29:07 +08:00
|
|
|
use crate::aliases::TMat4;
|
2019-03-25 18:21:41 +08:00
|
|
|
use na::{RealField};
|
2018-09-22 19:18:59 +08:00
|
|
|
|
2019-03-25 18:21:41 +08:00
|
|
|
//pub fn frustum<N: RealField>(left: N, right: N, bottom: N, top: N, near: N, far: N) -> TMat4<N> {
|
2018-09-22 19:18:59 +08:00
|
|
|
// unimplemented!()
|
|
|
|
//}
|
|
|
|
|
2019-03-25 18:21:41 +08:00
|
|
|
//pub fn frustum_lh<N: RealField>(left: N, right: N, bottom: N, top: N, near: N, far: N) -> TMat4<N> {
|
2018-09-22 19:18:59 +08:00
|
|
|
// unimplemented!()
|
|
|
|
//}
|
|
|
|
//
|
2019-03-25 18:21:41 +08:00
|
|
|
//pub fn frustum_lr_no<N: RealField>(left: N, right: N, bottom: N, top: N, near: N, far: N) -> TMat4<N> {
|
2018-09-22 19:18:59 +08:00
|
|
|
// unimplemented!()
|
|
|
|
//}
|
|
|
|
//
|
2019-03-25 18:21:41 +08:00
|
|
|
//pub fn frustum_lh_zo<N: RealField>(left: N, right: N, bottom: N, top: N, near: N, far: N) -> TMat4<N> {
|
2018-09-22 19:18:59 +08:00
|
|
|
// unimplemented!()
|
|
|
|
//}
|
|
|
|
//
|
2019-03-25 18:21:41 +08:00
|
|
|
//pub fn frustum_no<N: RealField>(left: N, right: N, bottom: N, top: N, near: N, far: N) -> TMat4<N> {
|
2018-09-22 19:18:59 +08:00
|
|
|
// unimplemented!()
|
|
|
|
//}
|
|
|
|
//
|
2019-03-25 18:21:41 +08:00
|
|
|
//pub fn frustum_rh<N: RealField>(left: N, right: N, bottom: N, top: N, near: N, far: N) -> TMat4<N> {
|
2018-09-22 19:18:59 +08:00
|
|
|
// unimplemented!()
|
|
|
|
//}
|
|
|
|
//
|
2019-03-25 18:21:41 +08:00
|
|
|
//pub fn frustum_rh_no<N: RealField>(left: N, right: N, bottom: N, top: N, near: N, far: N) -> TMat4<N> {
|
2018-09-22 19:18:59 +08:00
|
|
|
// unimplemented!()
|
|
|
|
//}
|
|
|
|
//
|
2019-03-25 18:21:41 +08:00
|
|
|
//pub fn frustum_rh_zo<N: RealField>(left: N, right: N, bottom: N, top: N, near: N, far: N) -> TMat4<N> {
|
2018-09-22 19:18:59 +08:00
|
|
|
// unimplemented!()
|
|
|
|
//}
|
|
|
|
//
|
2019-03-25 18:21:41 +08:00
|
|
|
//pub fn frustum_zo<N: RealField>(left: N, right: N, bottom: N, top: N, near: N, far: N) -> TMat4<N> {
|
2018-09-22 19:18:59 +08:00
|
|
|
// unimplemented!()
|
|
|
|
//}
|
|
|
|
|
2019-03-25 18:21:41 +08:00
|
|
|
//pub fn infinite_perspective<N: RealField>(fovy: N, aspect: N, near: N) -> TMat4<N> {
|
2018-09-22 19:18:59 +08:00
|
|
|
// unimplemented!()
|
|
|
|
//}
|
|
|
|
//
|
2019-03-25 18:21:41 +08:00
|
|
|
//pub fn infinite_perspective_lh<N: RealField>(fovy: N, aspect: N, near: N) -> TMat4<N> {
|
2018-09-22 19:18:59 +08:00
|
|
|
// unimplemented!()
|
2019-04-03 01:59:22 +08:00
|
|
|
//}
|
2018-09-22 19:18:59 +08:00
|
|
|
//
|
2019-03-25 18:21:41 +08:00
|
|
|
//pub fn infinite_ortho<N: RealField>(left: N, right: N, bottom: N, top: N) -> TMat4<N> {
|
2018-09-22 19:18:59 +08:00
|
|
|
// unimplemented!()
|
|
|
|
//}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a right hand orthographic-view frustum with a depth range of -1 to 1
|
2018-12-14 18:57:37 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `left` - Coordinate for left bound of matrix
|
|
|
|
/// * `right` - Coordinate for right bound of matrix
|
|
|
|
/// * `bottom` - Coordinate for bottom bound of matrix
|
|
|
|
/// * `top` - Coordinate for top bound of matrix
|
|
|
|
/// * `znear` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `zfar` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn ortho<N: RealField>(left: N, right: N, bottom: N, top: N, znear: N, zfar: N) -> TMat4<N> {
|
2018-12-19 11:01:09 +08:00
|
|
|
ortho_rh_no(left, right, bottom, top, znear, zfar)
|
2018-09-22 19:18:59 +08:00
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a left hand matrix for a orthographic-view frustum with a depth range of -1 to 1
|
2018-12-14 18:57:37 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `left` - Coordinate for left bound of matrix
|
|
|
|
/// * `right` - Coordinate for right bound of matrix
|
|
|
|
/// * `bottom` - Coordinate for bottom bound of matrix
|
|
|
|
/// * `top` - Coordinate for top bound of matrix
|
|
|
|
/// * `znear` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `zfar` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn ortho_lh<N: RealField>(left: N, right: N, bottom: N, top: N, znear: N, zfar: N) -> TMat4<N> {
|
2018-12-19 11:01:09 +08:00
|
|
|
ortho_lh_no(left, right, bottom, top, znear, zfar)
|
2018-12-14 13:24:18 +08:00
|
|
|
}
|
|
|
|
|
2018-12-14 18:57:37 +08:00
|
|
|
/// Creates a left hand matrix for a orthographic-view frustum with a depth range of -1 to 1
|
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `left` - Coordinate for left bound of matrix
|
|
|
|
/// * `right` - Coordinate for right bound of matrix
|
|
|
|
/// * `bottom` - Coordinate for bottom bound of matrix
|
|
|
|
/// * `top` - Coordinate for top bound of matrix
|
|
|
|
/// * `znear` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `zfar` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn ortho_lh_no<N: RealField>(left: N, right: N, bottom: N, top: N, znear: N, zfar: N) -> TMat4<N> {
|
2019-03-23 21:29:07 +08:00
|
|
|
let two : N = crate::convert(2.0);
|
2018-12-19 11:01:09 +08:00
|
|
|
let mut mat : TMat4<N> = TMat4::<N>::identity();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
mat[(0, 0)] = two / (right - left);
|
|
|
|
mat[(0, 3)] = -(right + left) / (right - left);
|
|
|
|
mat[(1, 1)] = two / (top-bottom);
|
|
|
|
mat[(1, 3)] = -(top + bottom) / (top - bottom);
|
|
|
|
mat[(2, 2)] = two / (zfar - znear);
|
|
|
|
mat[(2, 3)] = -(zfar + znear) / (zfar - znear);
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a left hand orthographic-view frustum with a depth range of 0 to 1
|
2018-12-14 18:57:37 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `left` - Coordinate for left bound of matrix
|
|
|
|
/// * `right` - Coordinate for right bound of matrix
|
|
|
|
/// * `bottom` - Coordinate for bottom bound of matrix
|
|
|
|
/// * `top` - Coordinate for top bound of matrix
|
|
|
|
/// * `znear` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `zfar` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn ortho_lh_zo<N: RealField>(left: N, right: N, bottom: N, top: N, znear: N, zfar: N) -> TMat4<N> {
|
2018-12-19 11:01:09 +08:00
|
|
|
let one : N = N::one();
|
2019-03-23 21:29:07 +08:00
|
|
|
let two : N = crate::convert(2.0);
|
2018-12-19 11:01:09 +08:00
|
|
|
let mut mat : TMat4<N> = TMat4::<N>::identity();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
mat[(0, 0)] = two / (right - left);
|
|
|
|
mat[(0, 3)] = - (right + left) / (right - left);
|
|
|
|
mat[(1, 1)] = two / (top - bottom);
|
|
|
|
mat[(1, 3)] = - (top + bottom) / (top - bottom);
|
|
|
|
mat[(2, 2)] = one / (zfar - znear);
|
|
|
|
mat[(2, 3)] = - znear / (zfar - znear);
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2018-12-19 11:11:49 +08:00
|
|
|
/// Creates a matrix for a right hand orthographic-view frustum with a depth range of -1 to 1
|
2018-12-14 18:57:37 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `left` - Coordinate for left bound of matrix
|
|
|
|
/// * `right` - Coordinate for right bound of matrix
|
|
|
|
/// * `bottom` - Coordinate for bottom bound of matrix
|
|
|
|
/// * `top` - Coordinate for top bound of matrix
|
|
|
|
/// * `znear` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `zfar` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn ortho_no<N: RealField>(left: N, right: N, bottom: N, top: N, znear: N, zfar: N) -> TMat4<N> {
|
2018-12-19 11:01:09 +08:00
|
|
|
ortho_rh_no(left, right, bottom, top, znear, zfar)
|
2018-12-14 13:24:18 +08:00
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a right hand orthographic-view frustum with a depth range of -1 to 1
|
2018-12-14 18:57:37 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `left` - Coordinate for left bound of matrix
|
|
|
|
/// * `right` - Coordinate for right bound of matrix
|
|
|
|
/// * `bottom` - Coordinate for bottom bound of matrix
|
|
|
|
/// * `top` - Coordinate for top bound of matrix
|
|
|
|
/// * `znear` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `zfar` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn ortho_rh<N: RealField>(left: N, right: N, bottom: N, top: N, znear: N, zfar: N) -> TMat4<N> {
|
2018-12-19 11:01:09 +08:00
|
|
|
ortho_rh_no(left, right, bottom, top, znear, zfar)
|
2018-12-14 13:24:18 +08:00
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a right hand orthographic-view frustum with a depth range of -1 to 1
|
2018-12-14 18:57:37 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `left` - Coordinate for left bound of matrix
|
|
|
|
/// * `right` - Coordinate for right bound of matrix
|
|
|
|
/// * `bottom` - Coordinate for bottom bound of matrix
|
|
|
|
/// * `top` - Coordinate for top bound of matrix
|
|
|
|
/// * `znear` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `zfar` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn ortho_rh_no<N: RealField>(left: N, right: N, bottom: N, top: N, znear: N, zfar: N) -> TMat4<N> {
|
2019-03-23 21:29:07 +08:00
|
|
|
let two : N = crate::convert(2.0);
|
2018-12-19 11:01:09 +08:00
|
|
|
let mut mat : TMat4<N> = TMat4::<N>::identity();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
mat[(0, 0)] = two / (right - left);
|
|
|
|
mat[(0, 3)] = - (right + left) / (right - left);
|
|
|
|
mat[(1, 1)] = two/(top-bottom);
|
|
|
|
mat[(1, 3)] = - (top + bottom) / (top - bottom);
|
|
|
|
mat[(2, 2)] = - two / (zfar - znear);
|
|
|
|
mat[(2, 3)] = - (zfar + znear) / (zfar - znear);
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2018-12-14 18:57:37 +08:00
|
|
|
/// Creates a right hand matrix for a orthographic-view frustum with a depth range of 0 to 1
|
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `left` - Coordinate for left bound of matrix
|
|
|
|
/// * `right` - Coordinate for right bound of matrix
|
|
|
|
/// * `bottom` - Coordinate for bottom bound of matrix
|
|
|
|
/// * `top` - Coordinate for top bound of matrix
|
|
|
|
/// * `znear` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `zfar` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn ortho_rh_zo<N: RealField>(left: N, right: N, bottom: N, top: N, znear: N, zfar: N) -> TMat4<N> {
|
2018-12-19 11:01:09 +08:00
|
|
|
let one : N = N::one();
|
2019-03-23 21:29:07 +08:00
|
|
|
let two : N = crate::convert(2.0);
|
2018-12-19 11:01:09 +08:00
|
|
|
let mut mat : TMat4<N> = TMat4::<N>::identity();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
mat[(0, 0)] = two / (right - left);
|
|
|
|
mat[(0, 3)] = - (right + left) / (right - left);
|
|
|
|
mat[(1, 1)] = two/(top-bottom);
|
|
|
|
mat[(1, 3)] = - (top + bottom) / (top - bottom);
|
|
|
|
mat[(2, 2)] = - one / (zfar - znear);
|
|
|
|
mat[(2, 3)] = - znear / (zfar - znear);
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a right hand matrix for a orthographic-view frustum with a depth range of 0 to 1
|
2018-12-14 18:57:37 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `left` - Coordinate for left bound of matrix
|
|
|
|
/// * `right` - Coordinate for right bound of matrix
|
|
|
|
/// * `bottom` - Coordinate for bottom bound of matrix
|
|
|
|
/// * `top` - Coordinate for top bound of matrix
|
|
|
|
/// * `znear` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `zfar` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn ortho_zo<N: RealField>(left: N, right: N, bottom: N, top: N, znear: N, zfar: N) -> TMat4<N> {
|
2018-12-19 11:01:09 +08:00
|
|
|
ortho_rh_zo(left, right, bottom, top, znear, zfar)
|
2018-12-14 13:24:18 +08:00
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a right hand perspective-view frustum with a depth range of -1 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fov` - Field of view, in radians
|
|
|
|
/// * `width` - Width of the viewport
|
|
|
|
/// * `height` - Height of the viewport
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_fov<N: RealField>(fov: N, width: N, height: N, near: N, far: N) -> TMat4<N> {
|
2018-12-19 11:01:09 +08:00
|
|
|
perspective_fov_rh_no(fov, width, height, near, far)
|
2018-12-14 13:24:18 +08:00
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a left hand perspective-view frustum with a depth range of -1 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fov` - Field of view, in radians
|
|
|
|
/// * `width` - Width of the viewport
|
|
|
|
/// * `height` - Height of the viewport
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_fov_lh<N: RealField>(fov: N, width: N, height: N, near: N, far: N) -> TMat4<N> {
|
2018-12-19 11:01:09 +08:00
|
|
|
perspective_fov_lh_no(fov, width, height, near, far)
|
2018-12-14 13:24:18 +08:00
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a left hand perspective-view frustum with a depth range of -1 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fov` - Field of view, in radians
|
|
|
|
/// * `width` - Width of the viewport
|
|
|
|
/// * `height` - Height of the viewport
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_fov_lh_no<N: RealField>(fov: N, width: N, height: N, near: N, far: N) -> TMat4<N> {
|
2018-12-14 13:24:18 +08:00
|
|
|
assert!(
|
|
|
|
width > N::zero(),
|
|
|
|
"The width must be greater than zero"
|
|
|
|
);
|
|
|
|
assert!(
|
|
|
|
height > N::zero(),
|
|
|
|
"The height must be greater than zero."
|
|
|
|
);
|
|
|
|
assert!(
|
|
|
|
fov > N::zero(),
|
|
|
|
"The fov must be greater than zero"
|
|
|
|
);
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
let mut mat = TMat4::zeros();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
let rad = fov;
|
2019-03-23 21:29:07 +08:00
|
|
|
let h = (rad * crate::convert(0.5)).cos() / (rad * crate::convert(0.5)).sin();
|
2018-12-14 13:24:18 +08:00
|
|
|
let w = h * height / width;
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
mat[(0, 0)] = w;
|
|
|
|
mat[(1, 1)] = h;
|
|
|
|
mat[(2, 2)] = (far + near) / (far - near);
|
2019-03-23 21:29:07 +08:00
|
|
|
mat[(2, 3)] = - (far * near * crate::convert(2.0)) / (far - near);
|
2018-12-29 18:43:56 +08:00
|
|
|
mat[(3, 2)] = N::one();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a left hand perspective-view frustum with a depth range of 0 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fov` - Field of view, in radians
|
|
|
|
/// * `width` - Width of the viewport
|
|
|
|
/// * `height` - Height of the viewport
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_fov_lh_zo<N: RealField>(fov: N, width: N, height: N, near: N, far: N) -> TMat4<N> {
|
2018-12-14 13:24:18 +08:00
|
|
|
assert!(
|
|
|
|
width > N::zero(),
|
|
|
|
"The width must be greater than zero"
|
|
|
|
);
|
|
|
|
assert!(
|
|
|
|
height > N::zero(),
|
|
|
|
"The height must be greater than zero."
|
|
|
|
);
|
|
|
|
assert!(
|
|
|
|
fov > N::zero(),
|
|
|
|
"The fov must be greater than zero"
|
|
|
|
);
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
let mut mat = TMat4::zeros();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
let rad = fov;
|
2019-03-23 21:29:07 +08:00
|
|
|
let h = (rad * crate::convert(0.5)).cos() / (rad * crate::convert(0.5)).sin();
|
2018-12-14 13:24:18 +08:00
|
|
|
let w = h * height / width;
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
mat[(0, 0)] = w;
|
|
|
|
mat[(1, 1)] = h;
|
|
|
|
mat[(2, 2)] = far / (far - near);
|
|
|
|
mat[(2, 3)] = -(far * near) / (far - near);
|
|
|
|
mat[(3, 2)] = N::one();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a right hand perspective-view frustum with a depth range of -1 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fov` - Field of view, in radians
|
|
|
|
/// * `width` - Width of the viewport
|
|
|
|
/// * `height` - Height of the viewport
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_fov_no<N: RealField>(fov: N, width: N, height: N, near: N, far: N) -> TMat4<N> {
|
2018-12-19 11:01:09 +08:00
|
|
|
perspective_fov_rh_no(fov, width, height, near, far)
|
2018-12-14 13:24:18 +08:00
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a right hand perspective-view frustum with a depth range of -1 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fov` - Field of view, in radians
|
|
|
|
/// * `width` - Width of the viewport
|
|
|
|
/// * `height` - Height of the viewport
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_fov_rh<N: RealField>(fov: N, width: N, height: N, near: N, far: N) -> TMat4<N> {
|
2018-12-19 11:01:09 +08:00
|
|
|
perspective_fov_rh_no(fov, width, height, near, far)
|
2018-12-14 13:24:18 +08:00
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a right hand perspective-view frustum with a depth range of -1 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fov` - Field of view, in radians
|
|
|
|
/// * `width` - Width of the viewport
|
|
|
|
/// * `height` - Height of the viewport
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_fov_rh_no<N: RealField>(fov: N, width: N, height: N, near: N, far: N) -> TMat4<N> {
|
2018-12-14 13:24:18 +08:00
|
|
|
assert!(
|
|
|
|
width > N::zero(),
|
|
|
|
"The width must be greater than zero"
|
|
|
|
);
|
|
|
|
assert!(
|
|
|
|
height > N::zero(),
|
|
|
|
"The height must be greater than zero."
|
|
|
|
);
|
|
|
|
assert!(
|
|
|
|
fov > N::zero(),
|
|
|
|
"The fov must be greater than zero"
|
|
|
|
);
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
let mut mat = TMat4::zeros();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
let rad = fov;
|
2019-03-23 21:29:07 +08:00
|
|
|
let h = (rad * crate::convert(0.5)).cos() / (rad * crate::convert(0.5)).sin();
|
2018-12-14 13:24:18 +08:00
|
|
|
let w = h * height / width;
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
mat[(0, 0)] = w;
|
|
|
|
mat[(1, 1)] = h;
|
|
|
|
mat[(2, 2)] = - (far + near) / (far - near);
|
2019-03-23 21:29:07 +08:00
|
|
|
mat[(2, 3)] = - (far * near * crate::convert(2.0)) / (far - near);
|
2018-12-29 18:43:56 +08:00
|
|
|
mat[(3, 2)] = -N::one();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a right hand perspective-view frustum with a depth range of 0 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fov` - Field of view, in radians
|
|
|
|
/// * `width` - Width of the viewport
|
|
|
|
/// * `height` - Height of the viewport
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_fov_rh_zo<N: RealField>(fov: N, width: N, height: N, near: N, far: N) -> TMat4<N> {
|
2018-12-14 13:24:18 +08:00
|
|
|
assert!(
|
|
|
|
width > N::zero(),
|
|
|
|
"The width must be greater than zero"
|
|
|
|
);
|
|
|
|
assert!(
|
|
|
|
height > N::zero(),
|
|
|
|
"The height must be greater than zero."
|
|
|
|
);
|
|
|
|
assert!(
|
|
|
|
fov > N::zero(),
|
|
|
|
"The fov must be greater than zero"
|
|
|
|
);
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
let mut mat = TMat4::zeros();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
let rad = fov;
|
2019-03-23 21:29:07 +08:00
|
|
|
let h = (rad * crate::convert(0.5)).cos() / (rad * crate::convert(0.5)).sin();
|
2018-12-14 13:24:18 +08:00
|
|
|
let w = h * height / width;
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
mat[(0, 0)] = w;
|
|
|
|
mat[(1, 1)] = h;
|
|
|
|
mat[(2, 2)] = far / (near - far);
|
|
|
|
mat[(2, 3)] = -(far * near) / (far - near);
|
|
|
|
mat[(3, 2)] = -N::one();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a right hand perspective-view frustum with a depth range of 0 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fov` - Field of view, in radians
|
|
|
|
/// * `width` - Width of the viewport
|
|
|
|
/// * `height` - Height of the viewport
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_fov_zo<N: RealField>(fov: N, width: N, height: N, near: N, far: N) -> TMat4<N> {
|
2018-12-19 11:01:09 +08:00
|
|
|
perspective_fov_rh_zo(fov, width, height, near, far)
|
2018-12-14 13:24:18 +08:00
|
|
|
}
|
2018-09-22 19:18:59 +08:00
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a right hand perspective-view frustum with a depth range of -1 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fovy` - Field of view, in radians
|
|
|
|
/// * `aspect` - Ratio of viewport width to height (width/height)
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2018-12-29 18:43:56 +08:00
|
|
|
/// # Important note
|
|
|
|
/// The `aspect` and `fovy` argument are interchanged compared to the original GLM API.
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective<N: RealField>(aspect: N, fovy: N, near: N, far: N) -> TMat4<N> {
|
2018-12-29 18:43:56 +08:00
|
|
|
// TODO: Breaking change - revert back to proper glm conventions?
|
2018-12-14 20:03:13 +08:00
|
|
|
//
|
|
|
|
// Prior to changes to support configuring the behaviour of this function it was simply
|
|
|
|
// a wrapper around Perspective3::new(). The argument order for that function is different
|
|
|
|
// than the glm convention, but reordering the arguments would've caused pointlessly
|
|
|
|
// un-optimal code to be generated so they were rearranged so the function would just call
|
|
|
|
// straight through.
|
|
|
|
//
|
|
|
|
// Now this call to Perspective3::new() is no longer made so the functions can have their
|
|
|
|
// arguments reordered to the glm convention. Unfortunately this is a breaking change so
|
|
|
|
// can't be cleanly integrated into the existing library version without breaking other
|
|
|
|
// people's code. Reordering to glm isn't a huge deal but if it is done it will have to be
|
|
|
|
// in a major API breaking update.
|
|
|
|
//
|
2018-12-19 11:01:09 +08:00
|
|
|
perspective_rh_no(aspect, fovy, near, far)
|
2018-12-14 13:24:18 +08:00
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a left hand perspective-view frustum with a depth range of -1 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fovy` - Field of view, in radians
|
|
|
|
/// * `aspect` - Ratio of viewport width to height (width/height)
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2018-12-29 18:43:56 +08:00
|
|
|
/// # Important note
|
|
|
|
/// The `aspect` and `fovy` argument are interchanged compared to the original GLM API.
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_lh<N: RealField>(aspect: N, fovy: N, near: N, far: N) -> TMat4<N> {
|
2018-12-29 18:43:56 +08:00
|
|
|
perspective_lh_no(aspect, fovy, near, far)
|
2018-12-14 13:24:18 +08:00
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a left hand perspective-view frustum with a depth range of -1 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fovy` - Field of view, in radians
|
|
|
|
/// * `aspect` - Ratio of viewport width to height (width/height)
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2018-12-29 18:43:56 +08:00
|
|
|
/// # Important note
|
|
|
|
/// The `aspect` and `fovy` argument are interchanged compared to the original GLM API.
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_lh_no<N: RealField>(aspect: N, fovy: N, near: N, far: N) -> TMat4<N> {
|
2018-12-14 13:24:18 +08:00
|
|
|
assert!(
|
|
|
|
!relative_eq!(far - near, N::zero()),
|
|
|
|
"The near-plane and far-plane must not be superimposed."
|
|
|
|
);
|
|
|
|
assert!(
|
|
|
|
!relative_eq!(aspect, N::zero()),
|
|
|
|
"The apsect ratio must not be zero."
|
|
|
|
);
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
let one = N::one();
|
2019-03-23 21:29:07 +08:00
|
|
|
let two: N = crate::convert( 2.0);
|
2018-12-29 18:43:56 +08:00
|
|
|
let mut mat : TMat4<N> = TMat4::zeros();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
let tan_half_fovy = (fovy / two).tan();
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
mat[(0, 0)] = one / (aspect * tan_half_fovy);
|
|
|
|
mat[(1, 1)] = one / tan_half_fovy;
|
|
|
|
mat[(2, 2)] = (far + near) / (far - near);
|
|
|
|
mat[(2, 3)] = -(two * far * near) / (far - near);
|
|
|
|
mat[(3, 2)] = one;
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a left hand perspective-view frustum with a depth range of 0 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fovy` - Field of view, in radians
|
|
|
|
/// * `aspect` - Ratio of viewport width to height (width/height)
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2018-12-29 18:43:56 +08:00
|
|
|
/// # Important note
|
|
|
|
/// The `aspect` and `fovy` argument are interchanged compared to the original GLM API.
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_lh_zo<N: RealField>(aspect: N, fovy: N, near: N, far: N) -> TMat4<N> {
|
2018-12-14 13:24:18 +08:00
|
|
|
assert!(
|
|
|
|
!relative_eq!(far - near, N::zero()),
|
|
|
|
"The near-plane and far-plane must not be superimposed."
|
|
|
|
);
|
|
|
|
assert!(
|
|
|
|
!relative_eq!(aspect, N::zero()),
|
|
|
|
"The apsect ratio must not be zero."
|
|
|
|
);
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
let one = N::one();
|
2019-03-23 21:29:07 +08:00
|
|
|
let two: N = crate::convert( 2.0);
|
2018-12-29 18:43:56 +08:00
|
|
|
let mut mat: TMat4<N> = TMat4::zeros();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
let tan_half_fovy = (fovy / two).tan();
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
mat[(0, 0)] = one / (aspect * tan_half_fovy);
|
|
|
|
mat[(1, 1)] = one / tan_half_fovy;
|
|
|
|
mat[(2, 2)] = far / (far - near);
|
|
|
|
mat[(2, 3)] = -(far * near) / (far - near);
|
|
|
|
mat[(3, 2)] = one;
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a right hand perspective-view frustum with a depth range of -1 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fovy` - Field of view, in radians
|
|
|
|
/// * `aspect` - Ratio of viewport width to height (width/height)
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2018-12-29 18:43:56 +08:00
|
|
|
/// # Important note
|
|
|
|
/// The `aspect` and `fovy` argument are interchanged compared to the original GLM API.
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_no<N: RealField>(aspect: N, fovy: N, near: N, far: N) -> TMat4<N> {
|
2018-12-19 11:01:09 +08:00
|
|
|
perspective_rh_no(aspect, fovy, near, far)
|
2018-12-14 13:24:18 +08:00
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a right hand perspective-view frustum with a depth range of -1 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fovy` - Field of view, in radians
|
|
|
|
/// * `aspect` - Ratio of viewport width to height (width/height)
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2018-12-29 18:43:56 +08:00
|
|
|
/// # Important note
|
|
|
|
/// The `aspect` and `fovy` argument are interchanged compared to the original GLM API.
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_rh<N: RealField>(aspect: N, fovy: N, near: N, far: N) -> TMat4<N> {
|
2018-12-19 11:01:09 +08:00
|
|
|
perspective_rh_no(aspect, fovy, near, far)
|
2018-12-14 13:24:18 +08:00
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a right hand perspective-view frustum with a depth range of -1 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fovy` - Field of view, in radians
|
|
|
|
/// * `aspect` - Ratio of viewport width to height (width/height)
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2018-12-29 18:43:56 +08:00
|
|
|
/// # Important note
|
|
|
|
/// The `aspect` and `fovy` argument are interchanged compared to the original GLM API.
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_rh_no<N: RealField>(aspect: N, fovy: N, near: N, far: N) -> TMat4<N> {
|
2018-12-14 13:24:18 +08:00
|
|
|
assert!(
|
|
|
|
!relative_eq!(far - near, N::zero()),
|
|
|
|
"The near-plane and far-plane must not be superimposed."
|
|
|
|
);
|
|
|
|
assert!(
|
|
|
|
!relative_eq!(aspect, N::zero()),
|
|
|
|
"The apsect ratio must not be zero."
|
|
|
|
);
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
let negone = -N::one();
|
|
|
|
let one = N::one();
|
2019-03-23 21:29:07 +08:00
|
|
|
let two: N = crate::convert( 2.0);
|
2018-12-29 18:43:56 +08:00
|
|
|
let mut mat = TMat4::zeros();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
let tan_half_fovy = (fovy / two).tan();
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
mat[(0, 0)] = one / (aspect * tan_half_fovy);
|
|
|
|
mat[(1, 1)] = one / tan_half_fovy;
|
|
|
|
mat[(2, 2)] = - (far + near) / (far - near);
|
|
|
|
mat[(2, 3)] = -(two * far * near) / (far - near);
|
|
|
|
mat[(3, 2)] = negone;
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a right hand perspective-view frustum with a depth range of 0 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fovy` - Field of view, in radians
|
|
|
|
/// * `aspect` - Ratio of viewport width to height (width/height)
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2018-12-29 18:43:56 +08:00
|
|
|
/// # Important note
|
|
|
|
/// The `aspect` and `fovy` argument are interchanged compared to the original GLM API.
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_rh_zo<N: RealField>(aspect: N, fovy: N, near: N, far: N) -> TMat4<N> {
|
2018-12-14 13:24:18 +08:00
|
|
|
assert!(
|
|
|
|
!relative_eq!(far - near, N::zero()),
|
|
|
|
"The near-plane and far-plane must not be superimposed."
|
|
|
|
);
|
|
|
|
assert!(
|
|
|
|
!relative_eq!(aspect, N::zero()),
|
|
|
|
"The apsect ratio must not be zero."
|
|
|
|
);
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
let negone = -N::one();
|
|
|
|
let one = N::one();
|
2019-03-23 21:29:07 +08:00
|
|
|
let two = crate::convert( 2.0);
|
2018-12-29 18:43:56 +08:00
|
|
|
let mut mat = TMat4::zeros();
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
let tan_half_fovy = (fovy / two).tan();
|
|
|
|
|
2018-12-29 18:43:56 +08:00
|
|
|
mat[(0, 0)] = one / (aspect * tan_half_fovy);
|
|
|
|
mat[(1, 1)] = one / tan_half_fovy;
|
|
|
|
mat[(2, 2)] = far / (near - far);
|
|
|
|
mat[(2, 3)] = -(far * near) / (far - near);
|
|
|
|
mat[(3, 2)] = negone;
|
2018-12-14 13:24:18 +08:00
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2018-12-19 11:01:09 +08:00
|
|
|
/// Creates a matrix for a right hand perspective-view frustum with a depth range of 0 to 1
|
2018-12-14 13:24:18 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fovy` - Field of view, in radians
|
|
|
|
/// * `aspect` - Ratio of viewport width to height (width/height)
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
2018-12-29 18:43:56 +08:00
|
|
|
/// # Important note
|
|
|
|
/// The `aspect` and `fovy` argument are interchanged compared to the original GLM API.
|
2019-03-25 18:21:41 +08:00
|
|
|
pub fn perspective_zo<N: RealField>(aspect: N, fovy: N, near: N, far: N) -> TMat4<N> {
|
2018-12-19 11:01:09 +08:00
|
|
|
perspective_rh_zo(aspect, fovy, near, far)
|
2018-09-22 19:18:59 +08:00
|
|
|
}
|
|
|
|
|
2019-04-03 01:51:43 +08:00
|
|
|
/// Build infinite right-handed perspective projection matrix with [-1,1] depth range.
|
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fovy` - Field of view, in radians
|
|
|
|
/// * `aspect` - Ratio of viewport width to height (width/height)
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane.
|
|
|
|
///
|
|
|
|
/// # Important note
|
|
|
|
/// The `aspect` and `fovy` argument are interchanged compared to the original GLM API.
|
|
|
|
pub fn infinite_perspective_rh_no<N: RealField>(aspect: N, fovy: N, near: N) -> TMat4<N> {
|
|
|
|
let f = N::one() / (fovy * na::convert(0.5)).tan();
|
|
|
|
let mut mat = TMat4::zeros();
|
|
|
|
|
|
|
|
mat[(0, 0)] = f / aspect;
|
|
|
|
mat[(1, 1)] = f;
|
|
|
|
mat[(2, 2)] = -N::one();
|
|
|
|
mat[(2, 3)] = -near * na::convert(2.0);
|
|
|
|
mat[(3, 2)] = -N::one();
|
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Build infinite right-handed perspective projection matrix with [0,1] depth range.
|
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fovy` - Field of view, in radians
|
|
|
|
/// * `aspect` - Ratio of viewport width to height (width/height)
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane.
|
|
|
|
///
|
|
|
|
/// # Important note
|
|
|
|
/// The `aspect` and `fovy` argument are interchanged compared to the original GLM API.
|
2019-04-03 01:56:56 +08:00
|
|
|
///
|
|
|
|
// https://discourse.nphysics.org/t/reversed-z-and-infinite-zfar-in-projections/341/2
|
2019-04-03 01:51:43 +08:00
|
|
|
pub fn infinite_perspective_rh_zo<N: RealField>(aspect: N, fovy: N, near: N) -> TMat4<N> {
|
|
|
|
let f = N::one() / (fovy * na::convert(0.5)).tan();
|
|
|
|
let mut mat = TMat4::zeros();
|
|
|
|
|
|
|
|
mat[(0, 0)] = f / aspect;
|
|
|
|
mat[(1, 1)] = f;
|
|
|
|
mat[(2, 2)] = -N::one();
|
|
|
|
mat[(2, 3)] = -near;
|
|
|
|
mat[(3, 2)] = -N::one();
|
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2019-04-03 01:59:22 +08:00
|
|
|
/// Creates a matrix for a right hand perspective-view frustum with a reversed depth range of -1 to 1.
|
2019-04-03 01:56:56 +08:00
|
|
|
///
|
2019-04-03 01:51:43 +08:00
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fovy` - Field of view, in radians
|
|
|
|
/// * `aspect` - Ratio of viewport width to height (width/height)
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
|
|
|
/// # Important note
|
|
|
|
/// The `aspect` and `fovy` argument are interchanged compared to the original GLM API.
|
|
|
|
pub fn reversed_perspective_rh_no<N: RealField>(aspect: N, fovy: N, near: N, far: N) -> TMat4<N> {
|
|
|
|
let one = N::one();
|
|
|
|
let two: N = crate::convert(2.0);
|
|
|
|
let mut mat = TMat4::zeros();
|
|
|
|
|
|
|
|
let tan_half_fovy = (fovy / two).tan();
|
|
|
|
|
|
|
|
mat[(0, 0)] = one / (aspect * tan_half_fovy);
|
|
|
|
mat[(1, 1)] = one / tan_half_fovy;
|
|
|
|
mat[(2, 2)] = (far + near) / (far - near) - one;
|
|
|
|
mat[(2, 3)] = (two * far * near) / (far - near);
|
|
|
|
mat[(3, 2)] = -one;
|
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2019-04-03 01:56:56 +08:00
|
|
|
/// Creates a matrix for a right hand perspective-view frustum with a reversed depth range of 0 to 1.
|
|
|
|
///
|
2019-04-03 01:51:43 +08:00
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fovy` - Field of view, in radians
|
|
|
|
/// * `aspect` - Ratio of viewport width to height (width/height)
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
/// * `far` - Distance from the viewer to the far clipping plane
|
|
|
|
///
|
|
|
|
/// # Important note
|
|
|
|
/// The `aspect` and `fovy` argument are interchanged compared to the original GLM API.
|
|
|
|
pub fn reversed_perspective_rh_zo<N: RealField>(aspect: N, fovy: N, near: N, far: N) -> TMat4<N> {
|
|
|
|
let one = N::one();
|
|
|
|
let two = crate::convert(2.0);
|
|
|
|
let mut mat = TMat4::zeros();
|
|
|
|
|
|
|
|
let tan_half_fovy = (fovy / two).tan();
|
|
|
|
|
|
|
|
mat[(0, 0)] = one / (aspect * tan_half_fovy);
|
|
|
|
mat[(1, 1)] = one / tan_half_fovy;
|
|
|
|
mat[(2, 2)] = -far / (near - far) - one;
|
|
|
|
mat[(2, 3)] = (far * near) / (far - near);
|
|
|
|
mat[(3, 2)] = -one;
|
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2019-04-03 01:59:22 +08:00
|
|
|
/// Build an infinite perspective projection matrix with a reversed [-1, 1] depth range.
|
2019-04-03 01:51:43 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fovy` - Field of view, in radians
|
|
|
|
/// * `aspect` - Ratio of viewport width to height (width/height)
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane
|
|
|
|
///
|
|
|
|
/// # Important note
|
|
|
|
/// The `aspect` and `fovy` argument are interchanged compared to the original GLM API.
|
|
|
|
pub fn reversed_infinite_perspective_rh_no<N: RealField>(aspect: N, fovy: N, near: N) -> TMat4<N> {
|
|
|
|
let f = N::one() / (fovy * na::convert(0.5)).tan();
|
|
|
|
let mut mat = TMat4::zeros();
|
|
|
|
|
|
|
|
mat[(0, 0)] = f / aspect;
|
|
|
|
mat[(1, 1)] = f;
|
2019-04-03 02:04:44 +08:00
|
|
|
mat[(2, 3)] = near * crate::convert(2.0);
|
2019-04-03 01:51:43 +08:00
|
|
|
mat[(3, 2)] = -N::one();
|
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2019-04-03 01:59:22 +08:00
|
|
|
/// Build an infinite perspective projection matrix with a reversed [0, 1] depth range.
|
2019-04-03 01:51:43 +08:00
|
|
|
///
|
|
|
|
/// # Parameters
|
|
|
|
///
|
|
|
|
/// * `fovy` - Field of view, in radians
|
|
|
|
/// * `aspect` - Ratio of viewport width to height (width/height)
|
|
|
|
/// * `near` - Distance from the viewer to the near clipping plane.
|
|
|
|
///
|
|
|
|
/// # Important note
|
|
|
|
/// The `aspect` and `fovy` argument are interchanged compared to the original GLM API.
|
2019-04-03 01:56:56 +08:00
|
|
|
// Credit: https://discourse.nphysics.org/t/reversed-z-and-infinite-zfar-in-projections/341/2
|
2019-04-03 01:51:43 +08:00
|
|
|
pub fn reversed_infinite_perspective_rh_zo<N: RealField>(aspect: N, fovy: N, near: N) -> TMat4<N> {
|
|
|
|
let f = N::one() / (fovy * na::convert(0.5)).tan();
|
|
|
|
let mut mat = TMat4::zeros();
|
|
|
|
|
|
|
|
mat[(0, 0)] = f / aspect;
|
|
|
|
mat[(1, 1)] = f;
|
|
|
|
mat[(2, 3)] = near;
|
|
|
|
mat[(3, 2)] = -N::one();
|
|
|
|
|
|
|
|
mat
|
|
|
|
}
|
|
|
|
|
2019-03-25 18:21:41 +08:00
|
|
|
//pub fn tweaked_infinite_perspective<N: RealField>(fovy: N, aspect: N, near: N) -> TMat4<N> {
|
2018-09-22 19:18:59 +08:00
|
|
|
// unimplemented!()
|
|
|
|
//}
|
|
|
|
//
|
2019-03-25 18:21:41 +08:00
|
|
|
//pub fn tweaked_infinite_perspective_ep<N: RealField>(fovy: N, aspect: N, near: N, ep: N) -> TMat4<N> {
|
2018-09-22 19:18:59 +08:00
|
|
|
// unimplemented!()
|
2019-04-03 01:51:43 +08:00
|
|
|
//}
|