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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
#![deny(missing_docs)]
//! This crate is a fast implementation of [KD-tree](https://en.wikipedia.org/wiki/K-d_tree)
//! for raytracer (or other rendering method using ray).
//!
//! It's based on this [paper](http://www.irisa.fr/prive/kadi/Sujets_CTR/kadi/Kadi_sujet2_article_Kdtree.pdf)
//! written by *Ingo Wald* and *Vlastimil Havran*.
//!
//! # Installation
//!
//! ```toml
//! [dependencies]
//! kdtree-ray="1.2.1"
//! ```
//!
//! # Usage & Tips
//!
//! To create a [KD-tree](struct.KDtree.html) you only need to implement
//! the [BoundingBox](trait.BoundingBox.html) on the object.
//!
//! If you're doing a raytracer each mesh could contain a KD-tree of triangles.
//! Since `KDtree` his implementing `BoundingBox` itself you can create a KDtree
//! of meshes in your scene.
//!
//! # Example
//!
//! ```
//! use cgmath::*;
//! use kdtree_ray::{AABB, Bounded, KDTree};
//! struct Triangle(Vector3<f32>, Vector3<f32>, Vector3<f32>);
//!
//! // To use the KDTree on an object you need first to implement the BoundingBox trait.
//! impl Bounded for Triangle {
//! fn bound(&self) -> AABB {
//! let min = Vector3::new(
//! self.0.x.min(self.1.x).min(self.2.x),
//! self.0.y.min(self.1.y).min(self.2.y),
//! self.0.z.min(self.1.z).min(self.2.z),
//! );
//! let max = Vector3::new(
//! self.0.x.max(self.1.x).max(self.2.x),
//! self.0.y.max(self.1.y).max(self.2.y),
//! self.0.z.max(self.1.z).max(self.2.z),
//! );
//! AABB::new(min, max)
//! }
//! }
//!
//! // Kdtree creation
//! let triangle = Triangle(Vector3::zero(), Vector3::zero(), Vector3::zero());
//! let triangles: Vec<Triangle> = vec![triangle, /* ... */];
//! let kdtree = KDTree::build(&triangles);
//!
//! // Get a reduced list of triangles that a ray could intersect
//! let ray_origin = Vector3::zero();
//! let ray_direction = Vector3::new(1., 0., 0.);
//! let candidates_triangles = kdtree.intersect(&ray_origin, &ray_direction);
//! ```
mod aabb;
mod candidate;
mod config;
mod kdnode;
mod kdtree;
mod plane;
mod ray;
pub use aabb::*;
pub use config::BuilderConfig;
pub use kdtree::KDTree;
type Point3 = cgmath::Vector3<f32>;
type Vector3 = cgmath::Vector3<f32>;
#[macro_use]
extern crate enum_map;