embree3_arm/
lib.rs

1//! [![Crates.io](https://img.shields.io/crates/v/embree.svg)](https://crates.io/crates/embree)
2//! [![Build Status](https://travis-ci.org/Twinklebear/embree-rs.svg?branch=master)](https://travis-ci.org/Twinklebear/embree-rs)
3//!
4//! Rust bindings to [Embree](http://embree.github.io/). These are still in
5//! development, so a range of features are in progress.
6//!
7//! # Documentation
8//!
9//! Rust doc can be found [here](https://docs.rs/embree/).
10//! Embree documentation can be found [here](https://embree.github.io/api.html).
11//! See the [examples/](https://github.com/Twinklebear/embree-rs/tree/master/examples)
12//! for some example applications using the bindings.
13
14use std::{alloc, mem};
15
16extern crate cgmath;
17
18pub mod bezier_curve;
19pub mod bspline_curve;
20pub mod buffer;
21pub mod catmull_rom_curve;
22pub mod curve;
23pub mod device;
24pub mod geometry;
25pub mod hermite_curve;
26pub mod instance;
27pub mod linear_curve;
28pub mod quad_mesh;
29pub mod ray;
30pub mod ray_packet;
31pub mod ray_stream;
32pub mod scene;
33pub mod soa_ray;
34#[allow(non_upper_case_globals)]
35#[allow(non_camel_case_types)]
36#[allow(non_snake_case)]
37pub mod sys;
38pub mod triangle_mesh;
39
40pub use bezier_curve::BezierCurve;
41pub use bspline_curve::BsplineCurve;
42pub use buffer::{Buffer, MappedBuffer};
43pub use catmull_rom_curve::CatmullRomCurve;
44pub use curve::CurveType;
45pub use device::Device;
46pub use geometry::Geometry;
47pub use hermite_curve::HermiteCurve;
48pub use instance::Instance;
49pub use linear_curve::LinearCurve;
50pub use quad_mesh::QuadMesh;
51pub use ray::{Hit, IntersectContext, Ray, RayHit};
52pub use ray_packet::{Hit4, Ray4, RayHit4};
53pub use ray_stream::{HitN, RayHitN, RayN};
54pub use scene::{CommittedScene, Scene};
55pub use soa_ray::{
56    SoAHit, SoAHitIter, SoAHitIterMut, SoAHitRef, SoARay, SoARayIter, SoARayIterMut, SoARayRef,
57    SoARayRefMut,
58};
59pub use triangle_mesh::TriangleMesh;
60
61// Pull in some cleaned up enum and bitfield types directly,
62// with prettier aliases
63pub use sys::RTCBufferType as BufferType;
64pub use sys::RTCBuildQuality as BuildQuality;
65pub use sys::RTCDeviceProperty as DeviceProperty;
66pub use sys::RTCError as Error;
67pub use sys::RTCFormat as Format;
68pub use sys::RTCGeometryType as GeometryType;
69pub use sys::RTCSubdivisionMode as SubdivisionMode;
70
71pub use sys::RTCBuildFlags as BuildFlags;
72pub use sys::RTCCurveFlags as CurveFlags;
73pub use sys::RTCIntersectContextFlags as IntersectContextFlags;
74pub use sys::RTCSceneFlags as SceneFlags;
75
76/// Utility for making specifically aligned vectors
77pub fn aligned_vector<T>(len: usize, align: usize) -> Vec<T> {
78    let t_size = mem::size_of::<T>();
79    let t_align = mem::align_of::<T>();
80    let layout = if t_align >= align {
81        alloc::Layout::from_size_align(t_size * len, t_align).unwrap()
82    } else {
83        alloc::Layout::from_size_align(t_size * len, align).unwrap()
84    };
85    unsafe {
86        let mem = alloc::alloc(layout);
87        assert_eq!((mem as usize) % 16, 0);
88        Vec::<T>::from_raw_parts(mem as *mut T, len, len)
89    }
90}
91pub fn aligned_vector_init<T: Copy>(len: usize, align: usize, init: T) -> Vec<T> {
92    let mut v = aligned_vector::<T>(len, align);
93    for x in v.iter_mut() {
94        *x = init;
95    }
96    v
97}
98
99#[test]
100fn test_aligned_vector_alloc() {
101    let v = aligned_vector_init::<f32>(24, 16, 1.0);
102    for x in v.iter() {
103        assert_eq!(*x, 1.0);
104    }
105}