updating changes for response to pull request
Removed the compile configs based on cargo features and updated docs
This commit is contained in:
parent
ffd3dd5b68
commit
55b599e52c
|
@ -12,32 +12,6 @@ categories = [ "science" ]
|
||||||
keywords = [ "linear", "algebra", "matrix", "vector", "math" ]
|
keywords = [ "linear", "algebra", "matrix", "vector", "math" ]
|
||||||
license = "BSD-3-Clause"
|
license = "BSD-3-Clause"
|
||||||
|
|
||||||
[features]
|
|
||||||
|
|
||||||
## Default to produce opengl compatible matrices and conventions
|
|
||||||
default = ["opengl_projection"]
|
|
||||||
|
|
||||||
## Produce projection matrices and default to coordinate space behaviour that is compatible with OpenGL's NDC space
|
|
||||||
opengl_projection = ["right_hand_default", "negone_to_one_clip_default"]
|
|
||||||
|
|
||||||
## Produce projection matrices and default to coordinate space behaviour that is compatible with Vulkan's NDC space
|
|
||||||
vulkan_projection = ["right_hand_default", "zero_to_one_clip_default", "projection_y_flip"]
|
|
||||||
|
|
||||||
## Produce projection matrices and default to coordinate space behaviour that is compatible with DirectX's NDC space
|
|
||||||
directx_projection = ["left_hand_default", "zero_to_one_clip_default"]
|
|
||||||
|
|
||||||
## Applies an implicit `mat[(1,1)] *= -1` to all projection matrices. Essentially flips the output of using the matrix
|
|
||||||
## about the x axis (vertical flip)
|
|
||||||
projection_y_flip = []
|
|
||||||
|
|
||||||
## Whether to default to left hand (DirectX) or right hand (OpenGL/Vulkan) coordinate system behaviour
|
|
||||||
left_hand_default = []
|
|
||||||
right_hand_default = []
|
|
||||||
|
|
||||||
## Whether to default to 0 to 1 depth range (DirectX, Vulkan, Metal) or -1 to 1 (OpenGL) behaviour
|
|
||||||
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
|
@ -24,8 +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
|
/// Map the specified object coordinates `(obj.x, obj.y, obj.z)` into window coordinates with a
|
||||||
/// the default configured depth range
|
/// depth range of -1 to 1
|
||||||
///
|
///
|
||||||
/// # Parameters:
|
/// # Parameters:
|
||||||
///
|
///
|
||||||
|
@ -34,15 +34,6 @@ 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)
|
||||||
|
@ -57,13 +48,7 @@ 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.
|
||||||
|
@ -130,8 +115,8 @@ pub fn project_zo<N: Real>(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates using the
|
/// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates using a
|
||||||
/// default configured depth range
|
/// depth range of -1 to 1
|
||||||
///
|
///
|
||||||
/// # Parameters:
|
/// # Parameters:
|
||||||
///
|
///
|
||||||
|
@ -140,15 +125,6 @@ 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)
|
||||||
|
@ -163,13 +139,7 @@ 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.
|
||||||
|
|
|
@ -9,9 +9,7 @@ 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
|
/// Build a right hand look at view matrix
|
||||||
/// at compile time.
|
|
||||||
/// Build a look at view matrix based on the right handedness.
|
|
||||||
///
|
///
|
||||||
/// # Parameters:
|
/// # Parameters:
|
||||||
///
|
///
|
||||||
|
@ -19,27 +17,12 @@ 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.
|
||||||
|
|
|
@ -34,30 +34,15 @@ pub fn quat_cast<N: Real>(x: &Qua<N>) -> TMat4<N> {
|
||||||
::quat_to_mat4(x)
|
::quat_to_mat4(x)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Computes a look-at quaternion based on the defaults configured for the library at build time
|
/// Computes a right hand look-at quaternion
|
||||||
///
|
///
|
||||||
/// # Parameters
|
/// # Parameters
|
||||||
///
|
///
|
||||||
/// * `direction` - Direction vector point at where to look
|
/// * `direction` - Direction vector point at where to look
|
||||||
/// * `up` - Object up vector
|
/// * `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).
|
||||||
|
|
|
@ -91,74 +91,6 @@
|
||||||
This must be used with care! This is actually the recommended method to convert between homogeneous transformations generated by `nalgebra-glm` and
|
This must be used with care! This is actually the recommended method to convert between homogeneous transformations generated by `nalgebra-glm` and
|
||||||
specific transformation types from **nalgebra** like `Isometry3`. Just be careful you know your conversions make sense.
|
specific transformation types from **nalgebra** like `Isometry3`. Just be careful you know your conversions make sense.
|
||||||
|
|
||||||
### Compile Features/Options
|
|
||||||
There are a few compile features that alters the default behaviour of some functions. The current set of compile options includes:
|
|
||||||
* opengl_projection
|
|
||||||
* vulkan_projection
|
|
||||||
* directx_projection
|
|
||||||
* projection_y_flip
|
|
||||||
* left_hand_default
|
|
||||||
* right_hand_default
|
|
||||||
* zero_to_one_clip_default
|
|
||||||
* negone_to_one_clip_default
|
|
||||||
|
|
||||||
The default is to compile with the `opengl_projection` feature enabled
|
|
||||||
|
|
||||||
#### opengl_projection
|
|
||||||
This is a "macro" feature that exists as an alias to `right_hand_default` and
|
|
||||||
`negone_to_one_clip_default`
|
|
||||||
|
|
||||||
#### vulkan_projection
|
|
||||||
This is a "macro" feature that exists as an alias to `right_hand_default`,
|
|
||||||
`zero_to_one_clip_default` and `projection_y_flip`
|
|
||||||
|
|
||||||
#### directx_projection
|
|
||||||
This is a "macro" feature that exists as an alias to `left_hand_default` and
|
|
||||||
`zero_to_one_clip_default`
|
|
||||||
|
|
||||||
#### projection_y_flip
|
|
||||||
Applies an implicit `mat[(1,1)] *= -1` to all projection matrices created through the
|
|
||||||
nalgebra-glm interface. This feature should be enabled when using Vulkan so the generated
|
|
||||||
matrices conform to Vulkan's NDC (normalized device coordinates).
|
|
||||||
|
|
||||||
#### left_hand_default / right_hand_default
|
|
||||||
These two options are used to change the default handedness of the coordinate system the library
|
|
||||||
will use. Depending on which option is set it would cause a function like `ortho` to switch
|
|
||||||
between using `ortho_rh` and `ortho_lh`.
|
|
||||||
|
|
||||||
DO NOT set both of these options at the same time. There is no guarantee that all functions will
|
|
||||||
follow the same convention if you were to do so
|
|
||||||
|
|
||||||
#### zero_to_one_clip_default / negone_to_one_clip_default
|
|
||||||
These options are used to change the default depth range for projection matrices generated by
|
|
||||||
the nalgebra-glm interface. Depending on which option is set functions like `ortho` will
|
|
||||||
statically switch between calling `ortho_zo` and `ortho_no`.
|
|
||||||
|
|
||||||
DO NOT set both of these options at the same time. There is no guarantee that all functions will
|
|
||||||
follow the same convention if you were to do so
|
|
||||||
|
|
||||||
#### Functions Affected
|
|
||||||
|
|
||||||
* [`perspective`](fn.perspective.html)
|
|
||||||
* [`perspective_no`](fn.perspective_no.html)
|
|
||||||
* [`perspective_zo`](fn.perspective_zo.html)
|
|
||||||
* [`perspective_rh`](fn.perspective_rh.html)
|
|
||||||
* [`perspective_lh`](fn.perspective_lh.html)
|
|
||||||
* [`perspective_fov`](fn.perspective_fov.html)
|
|
||||||
* [`perspective_fov_no`](fn.perspective_fov_no.html)
|
|
||||||
* [`perspective_fov_zo`](fn.perspective_fov_zo.html)
|
|
||||||
* [`perspective_fov_rh`](fn.perspective_fov_rh.html)
|
|
||||||
* [`perspective_fov_lh`](fn.perspective_fov_lh.html)
|
|
||||||
* [`ortho`](fn.ortho.html)
|
|
||||||
* [`ortho_no`](fn.ortho_no.html)
|
|
||||||
* [`ortho_zo`](fn.ortho_zo.html)
|
|
||||||
* [`ortho_rh`](fn.ortho_rh.html)
|
|
||||||
* [`ortho_lh`](fn.ortho_lh.html)
|
|
||||||
* [`project`](fn.project.html)
|
|
||||||
* [`unproject`](fn.unproject.html)
|
|
||||||
* [`look_at`](fn.look_at.html)
|
|
||||||
* [`quat_look_at`](fn.quat_look_at.html)
|
|
||||||
|
|
||||||
### Should I use nalgebra or nalgebra-glm?
|
### Should I use nalgebra or nalgebra-glm?
|
||||||
Well that depends on your tastes and your background. **nalgebra** is more powerful overall since it allows stronger typing,
|
Well that depends on your tastes and your background. **nalgebra** is more powerful overall since it allows stronger typing,
|
||||||
and goes much further than simple computer graphics math. However, has a bit of a learning curve for
|
and goes much further than simple computer graphics math. However, has a bit of a learning curve for
|
||||||
|
|
|
@ -6,47 +6,31 @@ use na::Orthographic3;
|
||||||
use glm::Mat4;
|
use glm::Mat4;
|
||||||
use glm::Vec4;
|
use glm::Vec4;
|
||||||
|
|
||||||
// Ensure that under default conditions the library doesn't break interface with old convention
|
|
||||||
#[test]
|
#[test]
|
||||||
pub fn orthographic_glm_nalgebra_same()
|
pub fn orthographic_glm_nalgebra_same()
|
||||||
{
|
{
|
||||||
let na_mat : Mat4 = Orthographic3::new(-100.0f32,100.0f32, -50.0f32, 50.0f32, 0.1f32, 100.0f32).unwrap();
|
let na_mat : Mat4 = Orthographic3::new(-100.0f32,100.0f32, -50.0f32, 50.0f32, 0.1f32, 100.0f32).unwrap();
|
||||||
let gl_mat : Mat4 = glm::ortho_rh_no(-100.0f32,100.0f32, -50.0f32, 50.0f32, 0.1f32, 100.0f32);
|
let gl_mat : Mat4 = glm::ortho(-100.0f32,100.0f32, -50.0f32, 50.0f32, 0.1f32, 100.0f32);
|
||||||
|
|
||||||
// ortho_rh_no is the same as the standard nalgebra orthographic matrix
|
|
||||||
//
|
|
||||||
// we cant use plain ortho here as the library could be configured to produce different values
|
|
||||||
|
|
||||||
assert_eq!(na_mat, gl_mat);
|
assert_eq!(na_mat, gl_mat);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure that under default conditions the library doesn't break interface with old convention
|
|
||||||
#[test]
|
#[test]
|
||||||
pub fn perspective_glm_nalgebra_same()
|
pub fn perspective_glm_nalgebra_same()
|
||||||
{
|
{
|
||||||
let na_mat : Mat4 = Perspective3::new(16.0f32/9.0f32, 3.14f32/2.0f32, 0.1f32, 100.0f32).unwrap();
|
let na_mat : Mat4 = Perspective3::new(16.0f32/9.0f32, 3.14f32/2.0f32, 0.1f32, 100.0f32).unwrap();
|
||||||
let gl_mat : Mat4 = glm::perspective_rh_no(16.0f32/9.0f32, 3.14f32/2.0f32, 0.1f32, 100.0f32);
|
let gl_mat : Mat4 = glm::perspective(16.0f32/9.0f32, 3.14f32/2.0f32, 0.1f32, 100.0f32);
|
||||||
|
|
||||||
// perspective_rh_no is the same as the standard nalgebra perspective matrix
|
|
||||||
//
|
|
||||||
// we cant use plain perspective here as the library could be configured to produce different
|
|
||||||
// values
|
|
||||||
|
|
||||||
assert_eq!(na_mat, gl_mat);
|
assert_eq!(na_mat, gl_mat);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure that under default conditions the library doesn't break interface with old convention
|
|
||||||
#[test]
|
#[test]
|
||||||
pub fn orthographic_glm_nalgebra_project_same()
|
pub fn orthographic_glm_nalgebra_project_same()
|
||||||
{
|
{
|
||||||
let point = Vec4::new(1.0,0.0,-20.0,1.0);
|
let point = Vec4::new(1.0,0.0,-20.0,1.0);
|
||||||
|
|
||||||
let na_mat : Mat4 = Orthographic3::new(-100.0f32,100.0f32, -50.0f32, 50.0f32, 0.1f32, 100.0f32).unwrap();
|
let na_mat : Mat4 = Orthographic3::new(-100.0f32,100.0f32, -50.0f32, 50.0f32, 0.1f32, 100.0f32).unwrap();
|
||||||
let gl_mat : Mat4 = glm::ortho_rh_no(-100.0f32,100.0f32, -50.0f32, 50.0f32, 0.1f32, 100.0f32);
|
let gl_mat : Mat4 = glm::ortho(-100.0f32,100.0f32, -50.0f32, 50.0f32, 0.1f32, 100.0f32);
|
||||||
|
|
||||||
// ortho_rh_no is the same as the standard nalgebra orthographic matrix
|
|
||||||
//
|
|
||||||
// we cant use plain ortho here as the library could be configured to produce different values
|
|
||||||
|
|
||||||
let na_pt = na_mat * point;
|
let na_pt = na_mat * point;
|
||||||
let gl_pt = gl_mat * point;
|
let gl_pt = gl_mat * point;
|
||||||
|
@ -55,19 +39,13 @@ pub fn orthographic_glm_nalgebra_project_same()
|
||||||
assert_eq!(na_pt, gl_pt);
|
assert_eq!(na_pt, gl_pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure that under default conditions the library doesn't break interface with old convention
|
|
||||||
#[test]
|
#[test]
|
||||||
pub fn perspective_glm_nalgebra_project_same()
|
pub fn perspective_glm_nalgebra_project_same()
|
||||||
{
|
{
|
||||||
let point = Vec4::new(1.0,0.0,-20.0,1.0);
|
let point = Vec4::new(1.0,0.0,-20.0,1.0);
|
||||||
|
|
||||||
let na_mat : Mat4 = Perspective3::new(16.0f32/9.0f32, 3.14f32/2.0f32, 0.1f32, 100.0f32).unwrap();
|
let na_mat : Mat4 = Perspective3::new(16.0f32/9.0f32, 3.14f32/2.0f32, 0.1f32, 100.0f32).unwrap();
|
||||||
let gl_mat : Mat4 = glm::perspective_rh_no(16.0f32/9.0f32, 3.14f32/2.0f32, 0.1f32, 100.0f32);
|
let gl_mat : Mat4 = glm::perspective(16.0f32/9.0f32, 3.14f32/2.0f32, 0.1f32, 100.0f32);
|
||||||
|
|
||||||
// perspective_rh_no is the same as the standard nalgebra perspective matrix
|
|
||||||
//
|
|
||||||
// we cant use plain perspective here as the library could be configured to produce different
|
|
||||||
// values
|
|
||||||
|
|
||||||
let na_pt = na_mat * point;
|
let na_pt = na_mat * point;
|
||||||
let gl_pt = gl_mat * point;
|
let gl_pt = gl_mat * point;
|
||||||
|
|
Loading…
Reference in New Issue