embree3_arm/
geometry.rs

1use sys::*;
2
3use bezier_curve;
4use bspline_curve;
5use catmull_rom_curve;
6use hermite_curve;
7use instance;
8use linear_curve;
9use quad_mesh;
10use triangle_mesh;
11
12pub enum Geometry<'a> {
13    Triangle(triangle_mesh::TriangleMesh<'a>),
14    Quad(quad_mesh::QuadMesh<'a>),
15    Instance(instance::Instance<'a>),
16    LinearCurve(linear_curve::LinearCurve<'a>),
17    BsplineCurve(bspline_curve::BsplineCurve<'a>),
18    BezierCurve(bezier_curve::BezierCurve<'a>),
19    HermiteCurve(hermite_curve::HermiteCurve<'a>),
20    CatmullRomCurve(catmull_rom_curve::CatmullRomCurve<'a>),
21}
22
23/// Geometry trait implemented by all Embree Geometry types
24impl<'a> Geometry<'a> {
25    pub fn handle(&self) -> RTCGeometry {
26        match self {
27            &Geometry::Triangle(ref m) => m.handle,
28            &Geometry::Quad(ref q) => q.handle,
29            &Geometry::Instance(ref i) => i.handle,
30            &Geometry::LinearCurve(ref lc) => lc.handle,
31            &Geometry::BsplineCurve(ref bsc) => bsc.handle,
32            &Geometry::BezierCurve(ref bzc) => bzc.handle,
33            &Geometry::HermiteCurve(ref hc) => hc.handle,
34            &Geometry::CatmullRomCurve(ref crc) => crc.handle,
35        }
36    }
37    pub fn commit(&mut self) {
38        unsafe {
39            rtcCommitGeometry(self.handle());
40        }
41    }
42}
43
44impl<'a> Drop for Geometry<'a> {
45    fn drop(&mut self) {
46        unsafe {
47            rtcReleaseGeometry(self.handle());
48        }
49    }
50}
51
52impl<'a> PartialEq<Geometry<'a>> for Geometry<'a> {
53    fn eq(&self, other: &Geometry) -> bool {
54        self.handle() == other.handle()
55    }
56}
57
58impl<'a> Eq for Geometry<'a> {}