Add support for cast using bytemuck crate
This commit is contained in:
parent
78c082e944
commit
11a5346291
8 changed files with 45 additions and 0 deletions
|
@ -29,6 +29,7 @@ rand = { version = "0.8", features = ["small_rng"], optional = true }
|
||||||
serde = { version = "1.0", features = ["serde_derive"], optional = true }
|
serde = { version = "1.0", features = ["serde_derive"], optional = true }
|
||||||
# works only in rust toolchain up to 1.32, disabled indefinitely
|
# works only in rust toolchain up to 1.32, disabled indefinitely
|
||||||
#simd = { version = "0.2", optional = true }
|
#simd = { version = "0.2", optional = true }
|
||||||
|
bytemuck = { version = "1.0", optional = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
|
|
|
@ -224,3 +224,6 @@ impl<S: Clone, A: Angle + Into<S>> From<Euler<A>> for MintEuler<S> {
|
||||||
MintEuler::from([v.x.into(), v.y.into(), v.z.into()])
|
MintEuler::from([v.x.into(), v.y.into(), v.z.into()])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "bytemuck")]
|
||||||
|
impl_bytemuck_cast!(Euler);
|
||||||
|
|
|
@ -55,6 +55,9 @@
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate approx;
|
extern crate approx;
|
||||||
|
|
||||||
|
#[cfg(feature = "bytemuck")]
|
||||||
|
extern crate bytemuck;
|
||||||
|
|
||||||
#[cfg(feature = "mint")]
|
#[cfg(feature = "mint")]
|
||||||
pub extern crate mint;
|
pub extern crate mint;
|
||||||
|
|
||||||
|
|
|
@ -380,4 +380,13 @@ macro_rules! impl_mint_conversions {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Generate implementation required to cast using `bytemuck`
|
||||||
|
#[cfg(feature = "bytemuck")]
|
||||||
|
macro_rules! impl_bytemuck_cast {
|
||||||
|
($ArrayN:ident) => {
|
||||||
|
unsafe impl<S: bytemuck::Pod> bytemuck::Pod for $ArrayN<S> {}
|
||||||
|
unsafe impl<S: bytemuck::Zeroable> bytemuck::Zeroable for $ArrayN<S> {}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
include!(concat!(env!("OUT_DIR"), "/swizzle_operator_macro.rs"));
|
include!(concat!(env!("OUT_DIR"), "/swizzle_operator_macro.rs"));
|
||||||
|
|
|
@ -1572,6 +1572,13 @@ mint_conversions!(Matrix3 { x, y, z }, ColumnMatrix3);
|
||||||
#[cfg(feature = "mint")]
|
#[cfg(feature = "mint")]
|
||||||
mint_conversions!(Matrix4 { x, y, z, w }, ColumnMatrix4);
|
mint_conversions!(Matrix4 { x, y, z, w }, ColumnMatrix4);
|
||||||
|
|
||||||
|
#[cfg(feature = "bytemuck")]
|
||||||
|
impl_bytemuck_cast!(Matrix2);
|
||||||
|
#[cfg(feature = "bytemuck")]
|
||||||
|
impl_bytemuck_cast!(Matrix3);
|
||||||
|
#[cfg(feature = "bytemuck")]
|
||||||
|
impl_bytemuck_cast!(Matrix4);
|
||||||
|
|
||||||
impl<S: BaseNum> From<Matrix2<S>> for Matrix3<S> {
|
impl<S: BaseNum> From<Matrix2<S>> for Matrix3<S> {
|
||||||
/// Clone the elements of a 2-dimensional matrix into the top-left corner
|
/// Clone the elements of a 2-dimensional matrix into the top-left corner
|
||||||
/// of a 3-dimensional identity matrix.
|
/// of a 3-dimensional identity matrix.
|
||||||
|
|
|
@ -368,6 +368,13 @@ impl_mint_conversions!(Point2 { x, y }, Point2);
|
||||||
#[cfg(feature = "mint")]
|
#[cfg(feature = "mint")]
|
||||||
impl_mint_conversions!(Point3 { x, y, z }, Point3);
|
impl_mint_conversions!(Point3 { x, y, z }, Point3);
|
||||||
|
|
||||||
|
#[cfg(feature = "bytemuck")]
|
||||||
|
impl_bytemuck_cast!(Point1);
|
||||||
|
#[cfg(feature = "bytemuck")]
|
||||||
|
impl_bytemuck_cast!(Point2);
|
||||||
|
#[cfg(feature = "bytemuck")]
|
||||||
|
impl_bytemuck_cast!(Point3);
|
||||||
|
|
||||||
impl<S: fmt::Debug> fmt::Debug for Point1<S> {
|
impl<S: fmt::Debug> fmt::Debug for Point1<S> {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
write!(f, "Point1 ")?;
|
write!(f, "Point1 ")?;
|
||||||
|
|
|
@ -690,6 +690,9 @@ impl <S: Clone> mint::IntoMint for Quaternion<S> {
|
||||||
type MintType = mint::Quaternion<S>;
|
type MintType = mint::Quaternion<S>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "bytemuck")]
|
||||||
|
impl_bytemuck_cast!(Quaternion);
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use quaternion::*;
|
use quaternion::*;
|
||||||
|
|
|
@ -597,6 +597,18 @@ impl<S: fmt::Debug> fmt::Debug for Vector4<S> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "bytemuck")]
|
||||||
|
impl_bytemuck_cast!(Vector1);
|
||||||
|
|
||||||
|
#[cfg(feature = "bytemuck")]
|
||||||
|
impl_bytemuck_cast!(Vector2);
|
||||||
|
|
||||||
|
#[cfg(feature = "bytemuck")]
|
||||||
|
impl_bytemuck_cast!(Vector3);
|
||||||
|
|
||||||
|
#[cfg(feature = "bytemuck")]
|
||||||
|
impl_bytemuck_cast!(Vector4);
|
||||||
|
|
||||||
#[cfg(feature = "mint")]
|
#[cfg(feature = "mint")]
|
||||||
impl_mint_conversions!(Vector2 { x, y }, Vector2);
|
impl_mint_conversions!(Vector2 { x, y }, Vector2);
|
||||||
#[cfg(feature = "mint")]
|
#[cfg(feature = "mint")]
|
||||||
|
|
Loading…
Reference in a new issue