This toy project is a tiny MIT-licensed C library of image utilities for dealing with height maps, normal maps, distance fields, and the like. It has a very low-level API, where an "image" is simply a flat array of floats. There are no dependencies and only one header file.
Heman can do stuff like this:
- Create a random height field using simplex noise and FBM.
- Generate a normal map from a height map.
- Compute ambient occlusion from a height map.
- Generate a signed distance field (SDF).
- Export a 3D mesh in PLY format.
- Apply a color gradient to a heightmap.
- Generate a color gradient, given a list of control points.
- Compute diffuse lighting with an infinite light source.
- Generate a nicely-distributed list of points according to a density field.
Heman implements some really nice 21st-century algorithms:
- Ambient occlusion is generated using Sean Barrett's efficient method that makes 16 sweeps over the height field.
- Distance field computation uses the beautiful algorithm from Distance Transforms of Sampled Functions (Felzenszwalb and Huttenlocher).
- Density field samples are generated using Robert Bridson's Fast Poisson Disk Sampling in Arbitrary Dimensions.
The images at the top were generated from code that looks like this:
// Generate an island shape using simplex noise and a distance field. heman_image* elevation = heman_generate_island_heightmap(1024, 1024, rand()); // Compute ambient occlusion from the height map. heman_image* occ = heman_lighting_compute_occlusion(elevation); // Visualize the normal vectors. heman_image* normals = heman_lighting_compute_normals(elevation); // Apply a color gradient. heman_image* gradient = heman_color_create_gradient(...); heman_image* albedo = heman_color_apply_gradient(elevation, -0.5, 0.5, grad); // Apply diffuse lighting. heman_image* final = heman_lighting_apply(elevation, albedo, ...);
For the unabridged version, see