Skip to content

Commit

Permalink
WIP serde impl for Mat2, Mat3 and Mat4.
Browse files Browse the repository at this point in the history
Probably can't use the default derived versions because different types will be inconsistent.
  • Loading branch information
bitshifter committed Sep 14, 2019
1 parent 37540ce commit ae35ffc
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 3 deletions.
4 changes: 1 addition & 3 deletions src/f32/glam_serde.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ impl Serialize for Vec2 {
}
}

#[cfg(feature = "serde")]
impl Serialize for Vec3 {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
Expand All @@ -36,7 +35,6 @@ impl Serialize for Vec3 {
}
}

#[cfg(feature = "serde")]
impl Serialize for Vec4 {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
Expand All @@ -53,7 +51,6 @@ impl Serialize for Vec4 {
}
}

#[cfg(feature = "serde")]
impl Serialize for Quat {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
Expand All @@ -69,6 +66,7 @@ impl Serialize for Quat {
state.end()
}
}

impl<'de> Deserialize<'de> for Vec2 {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
Expand Down
1 change: 1 addition & 0 deletions src/f32/mat2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ pub fn mat2(x_axis: Vec2, y_axis: Vec2) -> Mat2 {
}

/// A 2x2 column major matrix.
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Copy, PartialEq, PartialOrd, Debug)]
pub struct Mat2(pub(crate) Vec4);

Expand Down
1 change: 1 addition & 0 deletions src/f32/mat3.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ fn quat_to_axes(rotation: Quat) -> (Vec3, Vec3, Vec3) {
/// A 3x3 column major matrix.
///
/// This type is 16 byte aligned.
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Copy, PartialEq, PartialOrd, Debug)]
pub struct Mat3 {
pub(crate) x_axis: Vec3,
Expand Down
1 change: 1 addition & 0 deletions src/f32/mat4.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ fn quat_to_axes(rotation: Quat) -> (Vec4, Vec4, Vec4) {
/// A 4x4 column major matrix.
///
/// This type is 16 byte aligned.
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Copy, PartialEq, PartialOrd, Debug)]
pub struct Mat4 {
pub(crate) x_axis: Vec4,
Expand Down
20 changes: 20 additions & 0 deletions tests/mat2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,3 +134,23 @@ fn test_mat2_ops() {
assert_ulps_eq!(Mat2::from([[1.0, 2.0], [3.0, 4.0]]), m0 * Mat2::identity());
assert_ulps_eq!(Mat2::from([[1.0, 2.0], [3.0, 4.0]]), Mat2::identity() * m0);
}

#[cfg(feature = "serde")]
#[test]
fn test_mat2_serde() {
let a = Mat2::new(vec2(1.0, 2.0), vec2(3.0, 4.0));
let serialized = serde_json::to_string(&a).unwrap();
assert_eq!(serialized, "[[1.0,2.0],[3.0,4.0]]");
let deserialized = serde_json::from_str(&serialized).unwrap();
assert_eq!(a, deserialized);
let deserialized = serde_json::from_str::<Mat2>("[]");
assert!(deserialized.is_err());
let deserialized = serde_json::from_str::<Mat2>("[1.0]");
assert!(deserialized.is_err());
let deserialized = serde_json::from_str::<Mat2>("[1.0,2.0]");
assert!(deserialized.is_err());
let deserialized = serde_json::from_str::<Mat2>("[1.0,2.0,3.0]");
assert!(deserialized.is_err());
let deserialized = serde_json::from_str::<Mat2>("[1.0,2.0,3.0,4.0,5.0]");
assert!(deserialized.is_err());
}
20 changes: 20 additions & 0 deletions tests/mat3.rs
Original file line number Diff line number Diff line change
Expand Up @@ -189,3 +189,23 @@ fn test_mat3_ops() {
assert_ulps_eq!(m0, m0 * Mat3::identity());
assert_ulps_eq!(m0, Mat3::identity() * m0);
}

#[cfg(feature = "serde")]
#[test]
fn test_mat3_serde() {
let a = Mat3::new(vec3(1.0, 2.0, 3.0), vec3(4.0, 5.0, 6.0), vec3(7.0, 8.0, 9.0));
let serialized = serde_json::to_string(&a).unwrap();
assert_eq!(serialized, "[[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]]");
let deserialized = serde_json::from_str(&serialized).unwrap();
assert_eq!(a, deserialized);
let deserialized = serde_json::from_str::<Mat3>("[]");
assert!(deserialized.is_err());
let deserialized = serde_json::from_str::<Mat3>("[1.0]");
assert!(deserialized.is_err());
let deserialized = serde_json::from_str::<Mat3>("[1.0,2.0]");
assert!(deserialized.is_err());
let deserialized = serde_json::from_str::<Mat3>("[1.0,2.0,3.0]");
assert!(deserialized.is_err());
let deserialized = serde_json::from_str::<Mat3>("[1.0,2.0,3.0,4.0,5.0]");
assert!(deserialized.is_err());
}

0 comments on commit ae35ffc

Please sign in to comment.