library: shape: triangle: add deserialization
This commit is contained in:
parent
8060262ce0
commit
ccc9eaf423
|
@ -2,6 +2,7 @@ use super::Shape;
|
||||||
use crate::{Point, Point2D, Vector};
|
use crate::{Point, Point2D, Vector};
|
||||||
use bvh::aabb::{Bounded, AABB};
|
use bvh::aabb::{Bounded, AABB};
|
||||||
use bvh::ray::Ray;
|
use bvh::ray::Ray;
|
||||||
|
use serde::{Deserialize, Deserializer};
|
||||||
|
|
||||||
/// Represent a triangle inside the scene.
|
/// Represent a triangle inside the scene.
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
|
@ -89,6 +90,31 @@ impl Shape for Triangle {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
struct SerializedTriangle {
|
||||||
|
corners: [Point; 3],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<SerializedTriangle> for Triangle {
|
||||||
|
fn from(triangle: SerializedTriangle) -> Self {
|
||||||
|
Triangle::new(
|
||||||
|
triangle.corners[0],
|
||||||
|
triangle.corners[1],
|
||||||
|
triangle.corners[2],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'de> Deserialize<'de> for Triangle {
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let cam: SerializedTriangle = Deserialize::deserialize(deserializer)?;
|
||||||
|
Ok(cam.into())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -180,4 +206,23 @@ mod test {
|
||||||
let ans = triangle.project_texel(&Point::origin());
|
let ans = triangle.project_texel(&Point::origin());
|
||||||
assert!((ans - Point2D::new(0.5, 0.5)).norm() < 1e-5);
|
assert!((ans - Point2D::new(0.5, 0.5)).norm() < 1e-5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn deserialization_works() {
|
||||||
|
let yaml = r#"
|
||||||
|
corners:
|
||||||
|
- [0.0, 0.0, 0.0]
|
||||||
|
- [0.0, 1.0, 1.0]
|
||||||
|
- [0.0, 1.0, 0.0]
|
||||||
|
"#;
|
||||||
|
let triangle: Triangle = serde_yaml::from_str(yaml).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
triangle,
|
||||||
|
Triangle::new(
|
||||||
|
Point::origin(),
|
||||||
|
Point::new(0., 1., 1.),
|
||||||
|
Point::new(0., 1., 0.)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue