extract NDCs to new ndc.rs module
This commit is contained in:
parent
900f466e43
commit
9ebe974e56
@ -83,6 +83,7 @@ mod transform_simba;
|
|||||||
|
|
||||||
mod reflection;
|
mod reflection;
|
||||||
|
|
||||||
|
mod ndc;
|
||||||
mod orthographic;
|
mod orthographic;
|
||||||
mod perspective;
|
mod perspective;
|
||||||
|
|
||||||
@ -112,7 +113,7 @@ pub use self::transform_alias::*;
|
|||||||
|
|
||||||
pub use self::reflection::*;
|
pub use self::reflection::*;
|
||||||
|
|
||||||
|
pub use self::ndc::*;
|
||||||
pub use self::orthographic::Orthographic3;
|
pub use self::orthographic::Orthographic3;
|
||||||
pub use self::perspective::Perspective3;
|
pub use self::perspective::Perspective3;
|
||||||
pub use self::perspective::Perspective3OpenGL;
|
pub use self::perspective::Perspective3OpenGL;
|
||||||
pub use self::perspective::{OpenGL, Vulkan, VulkanX};
|
|
||||||
|
22
src/geometry/ndc.rs
Normal file
22
src/geometry/ndc.rs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/// Normalized device coordinates (NDC) system.
|
||||||
|
pub trait System {}
|
||||||
|
|
||||||
|
/// Left handed with a depth range of -1 to 1.
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct LhNo {}
|
||||||
|
|
||||||
|
impl System for LhNo {}
|
||||||
|
|
||||||
|
/// Right handed with a depth range of 0 to 1.
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct RhZo {}
|
||||||
|
|
||||||
|
impl System for RhZo {}
|
||||||
|
|
||||||
|
// Aliases for commonly used NDCs.
|
||||||
|
|
||||||
|
/// OpenGL NDC (left handed with a depth range of -1 to 1).
|
||||||
|
pub type OpenGL = LhNo;
|
||||||
|
|
||||||
|
/// Vulkan NDC (right handed with a depth range of 0 to 1).
|
||||||
|
pub type Vulkan = RhZo;
|
@ -16,32 +16,9 @@ use crate::base::helper;
|
|||||||
use crate::base::storage::Storage;
|
use crate::base::storage::Storage;
|
||||||
use crate::base::{Matrix4, Scalar, Vector, Vector3};
|
use crate::base::{Matrix4, Scalar, Vector, Vector3};
|
||||||
|
|
||||||
|
use crate::geometry::ndc::*;
|
||||||
use crate::geometry::{Point3, Projective3};
|
use crate::geometry::{Point3, Projective3};
|
||||||
|
|
||||||
/// Normalized device coordinates systems
|
|
||||||
pub trait System {}
|
|
||||||
|
|
||||||
/// OpenGL
|
|
||||||
/// Note that we will probably want to go with more generic names that encode the handedness and depth range
|
|
||||||
/// Please consider all names as placeholders
|
|
||||||
#[derive(Default)]
|
|
||||||
pub struct OpenGL {}
|
|
||||||
|
|
||||||
/// OpenGL is a System
|
|
||||||
impl System for OpenGL {}
|
|
||||||
|
|
||||||
/// Vulkan is also a System
|
|
||||||
#[derive(Default)]
|
|
||||||
pub struct Vulkan {}
|
|
||||||
|
|
||||||
/// Vulkan is also a System
|
|
||||||
impl System for Vulkan {}
|
|
||||||
|
|
||||||
/// Note that it is possible to alias systems (OpenGL and Vulkan would be aliases of generic systems)
|
|
||||||
//pub type OpenGL = RHS_NO;
|
|
||||||
//pub type OpenGL = LHS_ZO;
|
|
||||||
pub type VulkanX = Vulkan;
|
|
||||||
|
|
||||||
/// A 3D perspective projection stored as a homogeneous 4x4 matrix.
|
/// A 3D perspective projection stored as a homogeneous 4x4 matrix.
|
||||||
/// Perspective3 is now generic over System
|
/// Perspective3 is now generic over System
|
||||||
/// Note that :
|
/// Note that :
|
||||||
@ -265,11 +242,8 @@ impl<S: System, N: RealField> Perspective3<S, N> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenGL specialization
|
/// LhNo specialization (Left handed with a depth range of -1 to 1).
|
||||||
// For now not all required functions are specialized for sake of illustration.
|
impl<N: RealField> Perspective3<LhNo, N> {
|
||||||
// Specializating the other functions should be trivial.
|
|
||||||
|
|
||||||
impl<N: RealField> Perspective3<OpenGL, N> {
|
|
||||||
/// Implementation note: new() must be specialized because it calls other specialized functions.
|
/// Implementation note: new() must be specialized because it calls other specialized functions.
|
||||||
pub fn new(aspect: N, fovy: N, znear: N, zfar: N) -> Self {
|
pub fn new(aspect: N, fovy: N, znear: N, zfar: N) -> Self {
|
||||||
assert!(
|
assert!(
|
||||||
@ -318,9 +292,8 @@ impl<N: RealField> Perspective3<OpenGL, N> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Vulkan specialization
|
// RhZo specialization (right handed with a depth range of 0 to 1).
|
||||||
|
impl<N: RealField> Perspective3<RhZo, N> {
|
||||||
impl<N: RealField> Perspective3<Vulkan, N> {
|
|
||||||
/// Implementation note: new() must be specialized because it calls other specialized functions.
|
/// Implementation note: new() must be specialized because it calls other specialized functions.
|
||||||
pub fn new(aspect: N, fovy: N, znear: N, zfar: N) -> Self {
|
pub fn new(aspect: N, fovy: N, znear: N, zfar: N) -> Self {
|
||||||
assert!(
|
assert!(
|
||||||
|
Loading…
Reference in New Issue
Block a user