From fa674a1ec408a42763e418ce77501e12d1cbbc57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Miguel=20S=C3=A1nchez=20Garc=C3=ADa?= Date: Sat, 15 Feb 2020 19:57:46 +0100 Subject: [PATCH 1/2] Add VertexMember implementations for cgmath types --- vulkano/Cargo.toml | 4 + vulkano/src/pipeline/vertex/impl_vertex.rs | 163 +++++++++++++++++++++ 2 files changed, 167 insertions(+) diff --git a/vulkano/Cargo.toml b/vulkano/Cargo.toml index 1221600f8a..185db683de 100644 --- a/vulkano/Cargo.toml +++ b/vulkano/Cargo.toml @@ -14,9 +14,13 @@ build = "build.rs" [dependencies] crossbeam = "0.7" +cgmath = { version = "0.17", optional = true } fnv = "1.0" shared_library = "0.1" smallvec = "1.2" lazy_static = "1.4" vk-sys = { version = "0.5.1", path = "../vk-sys" } half = "1.5" + +[features] +cgmath-vertex = ["cgmath"] diff --git a/vulkano/src/pipeline/vertex/impl_vertex.rs b/vulkano/src/pipeline/vertex/impl_vertex.rs index 21bc592c97..3e3dd4e314 100644 --- a/vulkano/src/pipeline/vertex/impl_vertex.rs +++ b/vulkano/src/pipeline/vertex/impl_vertex.rs @@ -192,3 +192,166 @@ impl_vm_array!(15); impl_vm_array!(16); impl_vm_array!(32); impl_vm_array!(64); + +#[cfg(feature = "cgmath-vertex")] +unsafe impl VertexMember for cgmath::Basis2 + where T: VertexMember +{ + #[inline] + fn format() -> (VertexMemberTy, usize) { + as VertexMember>::format() + } +} + +#[cfg(feature = "cgmath-vertex")] +unsafe impl VertexMember for cgmath::Basis3 + where T: VertexMember +{ + #[inline] + fn format() -> (VertexMemberTy, usize) { + as VertexMember>::format() + } +} + +#[cfg(feature = "cgmath-vertex")] +unsafe impl VertexMember for cgmath::Deg + where T: VertexMember +{ + #[inline] + fn format() -> (VertexMemberTy, usize) { + let (ty, sz) = ::format(); + (ty, sz) + } +} + +#[cfg(feature = "cgmath-vertex")] +unsafe impl VertexMember for cgmath::Matrix2 + where T: VertexMember +{ + #[inline] + fn format() -> (VertexMemberTy, usize) { + let (ty, sz) = as VertexMember>::format(); + (ty, sz * 2) + } +} + +#[cfg(feature = "cgmath-vertex")] +unsafe impl VertexMember for cgmath::Matrix3 + where T: VertexMember +{ + #[inline] + fn format() -> (VertexMemberTy, usize) { + let (ty, sz) = as VertexMember>::format(); + (ty, sz * 3) + } +} + +#[cfg(feature = "cgmath-vertex")] +unsafe impl VertexMember for cgmath::Matrix4 + where T: VertexMember +{ + #[inline] + fn format() -> (VertexMemberTy, usize) { + let (ty, sz) = as VertexMember>::format(); + (ty, sz * 4) + } +} + +#[cfg(feature = "cgmath-vertex")] +unsafe impl VertexMember for cgmath::Point1 + where T: VertexMember +{ + #[inline] + fn format() -> (VertexMemberTy, usize) { + let (ty, sz) = ::format(); + (ty, sz) + } +} + +#[cfg(feature = "cgmath-vertex")] +unsafe impl VertexMember for cgmath::Point2 + where T: VertexMember +{ + #[inline] + fn format() -> (VertexMemberTy, usize) { + let (ty, sz) = ::format(); + (ty, sz * 2) + } +} + +#[cfg(feature = "cgmath-vertex")] +unsafe impl VertexMember for cgmath::Point3 + where T: VertexMember +{ + #[inline] + fn format() -> (VertexMemberTy, usize) { + let (ty, sz) = ::format(); + (ty, sz * 3) + } +} + +#[cfg(feature = "cgmath-vertex")] +unsafe impl VertexMember for cgmath::Quaternion + where T: VertexMember +{ + #[inline] + fn format() -> (VertexMemberTy, usize) { + let (ty, sz) = ::format(); + (ty, sz * 4) + } +} + +#[cfg(feature = "cgmath-vertex")] +unsafe impl VertexMember for cgmath::Rad + where T: VertexMember +{ + #[inline] + fn format() -> (VertexMemberTy, usize) { + let (ty, sz) = ::format(); + (ty, sz) + } +} + +#[cfg(feature = "cgmath-vertex")] +unsafe impl VertexMember for cgmath::Vector1 + where T: VertexMember +{ + #[inline] + fn format() -> (VertexMemberTy, usize) { + let (ty, sz) = ::format(); + (ty, sz) + } +} + +#[cfg(feature = "cgmath-vertex")] +unsafe impl VertexMember for cgmath::Vector2 + where T: VertexMember +{ + #[inline] + fn format() -> (VertexMemberTy, usize) { + let (ty, sz) = ::format(); + (ty, sz * 2) + } +} + +#[cfg(feature = "cgmath-vertex")] +unsafe impl VertexMember for cgmath::Vector3 + where T: VertexMember +{ + #[inline] + fn format() -> (VertexMemberTy, usize) { + let (ty, sz) = ::format(); + (ty, sz * 3) + } +} + +#[cfg(feature = "cgmath-vertex")] +unsafe impl VertexMember for cgmath::Vector4 + where T: VertexMember +{ + #[inline] + fn format() -> (VertexMemberTy, usize) { + let (ty, sz) = ::format(); + (ty, sz * 4) + } +} From 3687f214e8c05836e64708e2160071099e525671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Miguel=20S=C3=A1nchez=20Garc=C3=ADa?= Date: Sat, 18 Apr 2020 17:08:03 +0200 Subject: [PATCH 2/2] Add info about new VertexMember impls to CHANGELOG_VULKANO.md --- CHANGELOG_VULKANO.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG_VULKANO.md b/CHANGELOG_VULKANO.md index fbd903bbd4..ab372fbfa9 100644 --- a/CHANGELOG_VULKANO.md +++ b/CHANGELOG_VULKANO.md @@ -5,6 +5,8 @@ - **Breaking** Update dependency `winit` 0.21 -> 0.22 - Update dependency `half` 1.4 -> 1.5 - Update dependency `smallvec` 0.6 -> 1.2 +- Add an optional feature, `cgmath-vertex` (which requires cgmath 0.17), which allows common cgmath types to be used inside vertex data definitions + + Types supported: `Basis`, `Deg`, `Point`, `Quaternion`, `Rad`, `Vector`, `Matrix` # Version 0.17.0 (2020-02-09)