### Features:

- Three dimensional randomly generated Worley Noise.
- Worley Noise texture filtering for all natural stone.
- Worley Noise displacement mapping done to all natural stone.
- Fresnel Dielectric water surface, accentuating the displacement mapping.
- Skeleton rigged and skinned model in a pose.
- Use of multiple BRDFs, including Ashikhmin, Fresnel, and Lambertian, with cosine-weighted hemisphere ray generation.
- Loop recursive triangle subdivision.
- Axis-Aligned Bounding Box Spatial Data Structure for efficient triangle intersection.

### Worley Noise

This Worley Noise implementation uses unit cubes to subdivide a 3d volume. It then uses this 3d indices
to hash a seed for a RNG. A Poisson distribution is used to grab the probable number of feature points in
the specific cube. Those feature points are spawned, and the two closest points are selected. This specific
implementation subtracts the closest point from the second closest, generating a natural stone look.

### Worley Noise Texture Filtering:

I used the Worley Noise function to create a filtering material. This material wraps over another
material. Whenever a ray is generated or luminance is computed, the WorleyFilter uses its host's methods,
and then scales the color by the worley scale at that hit position. This creates the texture.

### Worley Displacement Mapping:

As I implemented Worley Noise for the textures, I decided to apply displacement mapping as well. To get
enough triangles, I started with the original MakeBox function for the first 12. I then created a function
'Tesselate' that uses part of the Loop triangle subdivision alogrithm. I recursed around 7 times for each
box I made, creating around 200,000 triangles each, then displaced the triangles and recalculated the
normals using Worley Noise.