1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use sys::*;

use bezier_curve;
use bspline_curve;
use catmull_rom_curve;
use hermite_curve;
use instance;
use linear_curve;
use quad_mesh;
use triangle_mesh;

pub enum Geometry<'a> {
    Triangle(triangle_mesh::TriangleMesh<'a>),
    Quad(quad_mesh::QuadMesh<'a>),
    Instance(instance::Instance<'a>),
    LinearCurve(linear_curve::LinearCurve<'a>),
    BsplineCurve(bspline_curve::BsplineCurve<'a>),
    BezierCurve(bezier_curve::BezierCurve<'a>),
    HermiteCurve(hermite_curve::HermiteCurve<'a>),
    CatmullRomCurve(catmull_rom_curve::CatmullRomCurve<'a>),
}

/// Geometry trait implemented by all Embree Geometry types
impl<'a> Geometry<'a> {
    pub fn handle(&self) -> RTCGeometry {
        match self {
            &Geometry::Triangle(ref m) => m.handle,
            &Geometry::Quad(ref q) => q.handle,
            &Geometry::Instance(ref i) => i.handle,
            &Geometry::LinearCurve(ref lc) => lc.handle,
            &Geometry::BsplineCurve(ref bsc) => bsc.handle,
            &Geometry::BezierCurve(ref bzc) => bzc.handle,
            &Geometry::HermiteCurve(ref hc) => hc.handle,
            &Geometry::CatmullRomCurve(ref crc) => crc.handle,
        }
    }
    pub fn commit(&mut self) {
        unsafe {
            rtcCommitGeometry(self.handle());
        }
    }
}

impl<'a> Drop for Geometry<'a> {
    fn drop(&mut self) {
        unsafe {
            rtcReleaseGeometry(self.handle());
        }
    }
}

impl<'a> PartialEq<Geometry<'a>> for Geometry<'a> {
    fn eq(&self, other: &Geometry) -> bool {
        self.handle() == other.handle()
    }
}

impl<'a> Eq for Geometry<'a> {}