embree3_arm/
triangle_mesh.rs

1use cgmath::{Vector3, Vector4};
2
3use buffer::Buffer;
4use device::Device;
5use geometry::Geometry;
6use sys::*;
7use {BufferType, Format, GeometryType};
8
9pub struct TriangleMesh<'a> {
10    device: &'a Device,
11    pub(crate) handle: RTCGeometry,
12    pub vertex_buffer: Buffer<'a, Vector4<f32>>,
13    pub index_buffer: Buffer<'a, Vector3<u32>>,
14}
15
16impl<'a> TriangleMesh<'a> {
17    pub fn unanimated(device: &'a Device, num_tris: usize, num_verts: usize) -> TriangleMesh<'a> {
18        let h = unsafe { rtcNewGeometry(device.handle, GeometryType::TRIANGLE) };
19        let mut vertex_buffer = Buffer::new(device, num_verts);
20        let mut index_buffer = Buffer::new(device, num_tris);
21        unsafe {
22            rtcSetGeometryBuffer(
23                h,
24                BufferType::VERTEX,
25                0,
26                Format::FLOAT3,
27                vertex_buffer.handle,
28                0,
29                16,
30                num_verts,
31            );
32            vertex_buffer.set_attachment(h, BufferType::VERTEX, 0);
33
34            rtcSetGeometryBuffer(
35                h,
36                BufferType::INDEX,
37                0,
38                Format::UINT3,
39                index_buffer.handle,
40                0,
41                12,
42                num_tris,
43            );
44            index_buffer.set_attachment(h, BufferType::INDEX, 0);
45        }
46        TriangleMesh {
47            device: device,
48            handle: h,
49            vertex_buffer: vertex_buffer,
50            index_buffer: index_buffer,
51        }
52    }
53}
54
55unsafe impl<'a> Sync for TriangleMesh<'a> {}