perspective and orthographic functions and options

This commit is contained in:
MindSpunk 2018-12-14 16:24:18 +11:00 committed by Sébastien Crozet
parent 53632cd1b4
commit 21ecb5a370
7 changed files with 1074 additions and 121 deletions

View File

@ -12,6 +12,22 @@ categories = [ "science" ]
keywords = [ "linear", "algebra", "matrix", "vector", "math" ] keywords = [ "linear", "algebra", "matrix", "vector", "math" ]
license = "BSD-3-Clause" license = "BSD-3-Clause"
[features]
default = ["opengl_projection"]
opengl_projection = ["right_hand_default", "negone_to_one_clip_default"]
vulkan_projection = ["right_hand_default", "zero_to_one_clip_default", "projection_y_flip"]
directx_projection = ["left_hand_default", "zero_to_one_clip_default"]
projection_y_flip = []
left_hand_default = []
right_hand_default = []
zero_to_one_clip_default = []
negone_to_one_clip_default = []
[dependencies] [dependencies]
num-traits = { version = "0.2", default-features = false } num-traits = { version = "0.2", default-features = false }
approx = { version = "0.3", default-features = false } approx = { version = "0.3", default-features = false }

File diff suppressed because it is too large Load Diff

View File

@ -24,7 +24,8 @@ pub fn pick_matrix<N: Real>(center: &TVec2<N>, delta: &TVec2<N>, viewport: &TVec
)) ))
} }
/// Map the specified object coordinates `(obj.x, obj.y, obj.z)` into window coordinates using OpenGL near and far clip planes definition. /// Map the specified object coordinates `(obj.x, obj.y, obj.z)` into window coordinates using
/// the default configured depth range
/// ///
/// # Parameters: /// # Parameters:
/// ///
@ -33,6 +34,15 @@ pub fn pick_matrix<N: Real>(center: &TVec2<N>, delta: &TVec2<N>, viewport: &TVec
/// * `proj` - Specifies the current projection matrix. /// * `proj` - Specifies the current projection matrix.
/// * `viewport` - Specifies the current viewport. /// * `viewport` - Specifies the current viewport.
/// ///
/// # Compile Options
///
/// There are 2 compile options that change the behaviour of the function:
/// 1. zero_to_one_clip_default/negone_to_one_clip_default
///
/// ##### zero_to_one_clip_default/negone_to_one_clip_default
/// Depending on which option is set the function will return a point un-projected with the depth
/// range of either 0 to 1 or -1 to 1
///
/// # See also: /// # See also:
/// ///
/// * [`project_no`](fn.project_no.html) /// * [`project_no`](fn.project_no.html)
@ -47,7 +57,13 @@ pub fn project<N: Real>(
viewport: TVec4<N>, viewport: TVec4<N>,
) -> TVec3<N> ) -> TVec3<N>
{ {
if cfg!(feature="negone_to_one_clip_default") {
project_no(obj, model, proj, viewport) project_no(obj, model, proj, viewport)
} else if cfg!(feature="zero_to_one_clip_default") {
project_zo(obj, model, proj, viewport)
} else {
unimplemented!()
}
} }
/// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates. /// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates.
@ -114,7 +130,8 @@ pub fn project_zo<N: Real>(
) )
} }
/// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates using OpenGL near and far clip planes definition. /// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates using the
/// default configured depth range
/// ///
/// # Parameters: /// # Parameters:
/// ///
@ -123,6 +140,15 @@ pub fn project_zo<N: Real>(
/// * `proj` - Specifies the current projection matrix. /// * `proj` - Specifies the current projection matrix.
/// * `viewport` - Specifies the current viewport. /// * `viewport` - Specifies the current viewport.
/// ///
/// # Compile Options
///
/// There are 2 compile options that change the behaviour of the function:
/// 1. zero_to_one_clip_default/negone_to_one_clip_default
///
/// ##### zero_to_one_clip_default/negone_to_one_clip_default
/// Depending on which option is set the function will return a point un-projected with the depth
/// range of either 0 to 1 or -1 to 1
///
/// # See also: /// # See also:
/// ///
/// * [`project`](fn.project.html) /// * [`project`](fn.project.html)
@ -137,7 +163,13 @@ pub fn unproject<N: Real>(
viewport: TVec4<N>, viewport: TVec4<N>,
) -> TVec3<N> ) -> TVec3<N>
{ {
if cfg!(feature="negone_to_one_clip_default") {
unproject_no(win, model, proj, viewport) unproject_no(win, model, proj, viewport)
} else if cfg!(feature="zero_to_one_clip_default") {
unproject_zo(win, model, proj, viewport)
} else {
unimplemented!()
}
} }
/// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates. /// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates.

View File

@ -9,6 +9,8 @@ where DefaultAllocator: Alloc<N, D, D> {
TMat::<N, D, D>::identity() TMat::<N, D, D>::identity()
} }
/// Build a look at view matrix with a handedness based on the defaults configured for the library
/// at compile time.
/// Build a look at view matrix based on the right handedness. /// Build a look at view matrix based on the right handedness.
/// ///
/// # Parameters: /// # Parameters:
@ -17,12 +19,27 @@ where DefaultAllocator: Alloc<N, D, D> {
/// * `center` Position where the camera is looking at. /// * `center` Position where the camera is looking at.
/// * `u` Normalized up vector, how the camera is oriented. Typically `(0, 1, 0)`. /// * `u` Normalized up vector, how the camera is oriented. Typically `(0, 1, 0)`.
/// ///
/// # Compile Options
///
/// There is 1 compile option that changes the behaviour of the function:
/// 1. left_hand_default/right_hand_default
///
/// #### left_hand_default/right_hand_default
/// Depending on which option is set the function will return either a left hand or a right
/// hand matrix. It switches between using look_at_lh and look_at_rh.
///
/// # See also: /// # See also:
/// ///
/// * [`look_at_lh`](fn.look_at_lh.html) /// * [`look_at_lh`](fn.look_at_lh.html)
/// * [`look_at_rh`](fn.look_at_rh.html) /// * [`look_at_rh`](fn.look_at_rh.html)
pub fn look_at<N: Real>(eye: &TVec3<N>, center: &TVec3<N>, up: &TVec3<N>) -> TMat4<N> { pub fn look_at<N: Real>(eye: &TVec3<N>, center: &TVec3<N>, up: &TVec3<N>) -> TMat4<N> {
if cfg!(feature="right_hand_default") {
look_at_rh(eye, center, up) look_at_rh(eye, center, up)
} else if cfg!(feature="left_hand_default") {
look_at_lh(eye, center, up)
} else {
unimplemented!()
}
} }
/// Build a left handed look at view matrix. /// Build a left handed look at view matrix.

View File

@ -1,6 +1,16 @@
//! (Reexported) Additional features not specified by GLSL specification //! (Reexported) Additional features not specified by GLSL specification
pub use self::matrix_clip_space::{ortho, perspective}; pub use self::matrix_clip_space::{
ortho, ortho_lh, ortho_lh_no, ortho_lh_zo, ortho_no, ortho_rh, ortho_rh_no, ortho_rh_zo,
ortho_zo,
perspective, perspective_lh, perspective_lh_no, perspective_lh_zo, perspective_no,
perspective_rh, perspective_rh_no, perspective_rh_zo, perspective_zo,
perspective_fov, perspective_fov_lh,perspective_fov_lh_no, perspective_fov_lh_zo,
perspective_fov_no, perspective_fov_rh, perspective_fov_rh_no, perspective_fov_rh_zo,
perspective_fov_zo,
};
pub use self::matrix_projection::{ pub use self::matrix_projection::{
pick_matrix, project, project_no, project_zo, unproject, unproject_no, unproject_zo, pick_matrix, project, project_no, project_zo, unproject, unproject_no, unproject_zo,
}; };

View File

@ -5,7 +5,7 @@ use aliases::{Qua, TMat4, TVec, TVec3};
/// Euler angles of the quaternion `q` as (pitch, yaw, roll). /// Euler angles of the quaternion `q` as (pitch, yaw, roll).
pub fn quat_euler_angles<N: Real>(x: &Qua<N>) -> TVec3<N> { pub fn quat_euler_angles<N: Real>(x: &Qua<N>) -> TVec3<N> {
let q = UnitQuaternion::new_unchecked(*x); let q = UnitQuaternion::new_unchecked(*x);
let a = q.to_euler_angles(); let a = q.euler_angles();
TVec3::new(a.2, a.1, a.0) TVec3::new(a.2, a.1, a.0)
} }
@ -34,9 +34,30 @@ pub fn quat_cast<N: Real>(x: &Qua<N>) -> TMat4<N> {
::quat_to_mat4(x) ::quat_to_mat4(x)
} }
/// Computes a right-handed look-at quaternion (equivalent to a right-handed look-at matrix). /// Computes a look-at quaternion based on the defaults configured for the library at build time
///
/// # Parameters
///
/// * `direction` - Direction vector point at where to look
/// * `up` - Object up vector
///
/// # Compile Options
///
/// There is 1 compile option that changes the behaviour of the function:
/// 1. left_hand_default/right_hand_default
///
/// ##### left_hand_default/right_hand_default
/// Depending on which option is set the function will return either a left hand or a right
/// hand look at quaternion.
///
pub fn quat_look_at<N: Real>(direction: &TVec3<N>, up: &TVec3<N>) -> Qua<N> { pub fn quat_look_at<N: Real>(direction: &TVec3<N>, up: &TVec3<N>) -> Qua<N> {
if cfg!(feature="right_hand_default") {
quat_look_at_rh(direction, up) quat_look_at_rh(direction, up)
} else if cfg!(feature="left_hand_default") {
quat_look_at_lh(direction, up)
} else {
unimplemented!()
}
} }
/// Computes a left-handed look-at quaternion (equivalent to a left-handed look-at matrix). /// Computes a left-handed look-at quaternion (equivalent to a left-handed look-at matrix).

View File

@ -142,12 +142,17 @@ pub use ext::{
epsilon, equal_columns, equal_columns_eps, equal_columns_eps_vec, equal_eps, equal_eps_vec, epsilon, equal_columns, equal_columns_eps, equal_columns_eps_vec, equal_eps, equal_eps_vec,
identity, look_at, look_at_lh, look_at_rh, max, max2, max3, max3_scalar, max4, max4_scalar, identity, look_at, look_at_lh, look_at_rh, max, max2, max3, max3_scalar, max4, max4_scalar,
min, min2, min3, min3_scalar, min4, min4_scalar, not_equal_columns, not_equal_columns_eps, min, min2, min3, min3_scalar, min4, min4_scalar, not_equal_columns, not_equal_columns_eps,
not_equal_columns_eps_vec, not_equal_eps, not_equal_eps_vec, ortho, perspective, pi, not_equal_columns_eps_vec, not_equal_eps, not_equal_eps_vec, ortho, perspective, perspective_fov,
pick_matrix, project, project_no, project_zo, quat_angle, quat_angle_axis, quat_axis, perspective_fov_lh,perspective_fov_lh_no, perspective_fov_lh_zo, perspective_fov_no,
quat_conjugate, quat_cross, quat_dot, quat_equal, quat_equal_eps, quat_exp, quat_inverse, perspective_fov_rh, perspective_fov_rh_no, perspective_fov_rh_zo, perspective_fov_zo,
quat_length, quat_lerp, quat_log, quat_magnitude, quat_normalize, quat_not_equal, perspective_lh, perspective_lh_no, perspective_lh_zo, perspective_no, perspective_rh,
quat_not_equal_eps, quat_pow, quat_rotate, quat_slerp, rotate, rotate_x, rotate_y, rotate_z, perspective_rh_no, perspective_rh_zo, perspective_zo, ortho_lh, ortho_lh_no, ortho_lh_zo,
scale, translate, unproject, unproject_no, unproject_zo, ortho_no, ortho_rh, ortho_rh_no, ortho_rh_zo, ortho_zo, pi, pick_matrix, project, project_no,
project_zo, quat_angle, quat_angle_axis, quat_axis, quat_conjugate, quat_cross, quat_dot,
quat_equal, quat_equal_eps, quat_exp, quat_inverse, quat_length, quat_lerp, quat_log,
quat_magnitude, quat_normalize, quat_not_equal, quat_not_equal_eps, quat_pow, quat_rotate,
quat_slerp, rotate, rotate_x, rotate_y, rotate_z, scale, translate, unproject, unproject_no,
unproject_zo,
}; };
pub use gtc::{ pub use gtc::{
affine_inverse, column, e, euler, four_over_pi, golden_ratio, half_pi, inverse_transpose, affine_inverse, column, e, euler, four_over_pi, golden_ratio, half_pi, inverse_transpose,