``` 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
```
```//! Careful abstraction of geometric shapes in a ray tracer is a key
//! component of a clean system design, and shapes are the ideal
//! candidate for an object-oriented approach. All geometric
//! primitives implement a common interface, and the rest of the
//! renderer can use this interface without needing any details about
//! the underlying shape. This makes it possible to separate the
//! geometric and the shading subsystem of pbrt.
//!
//! - Cone
//! - Curve
//! - Cylinder
//! - Disk
//! - Hyperboloid
//! - Paraboloid
//! - Sphere
//! - Triangle
//!
//! ## Cones
//!
//! TODO
//!
//! ## Curves
//!
//! TODO
//!
//! ## Spheres
//!
//! Spheres are a special case of a general type of surfaces called
//! quadrics. They are the simplest type of curved surfaces that is
//! useful to a ray tracer and are a good starting point for general
//! ray intersection routines.
//!
//! ## Triangle Meshes
//!
//! While a natural representation would be to have a **Triangle**
//! shape implementation where each triangle stored the positions of
//! its three vertices, a more memory-efficient representation is to
//! separately store entire triangle meshes with an array of vertex
//! positions where each individual triangle just stores three offsets
//! into this array for its three vertices.
//!
//! ## Disks
//!
//! The disk is an interesting quadric since it has a particularly
//! straightforward intersection routine that avoids solving the
//!
//! ## Cylinders
//!
//! Another useful quadric is the cylinder. Cylinder shapes are
//! centered around the z axis.
//!
//! ## Hyperboloids
//!
//! TODO
//!
//! ## Paraboloids
//!
//! TODO
//!

pub mod curve;
pub mod cylinder;
pub mod disk;
pub mod loopsubdiv;
pub mod nurbs;
pub mod plymesh;
pub mod sphere;
pub mod triangle;
```