--- /dev/null
+#ifndef RENDLIB_H_
+#define RENDLIB_H_
+
+#include <cgmath/cgmath.h>
+
+struct erb_node;
+struct erb_surf;
+struct erb_ray;
+struct erb_hit;
+
+typedef int (*erb_intersect_func)(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit);
+typedef void (*erb_sample_func)(struct erb_surf *surf, cgm_vec3 *pos);
+
+struct erb_node {
+ struct erb_node *par; /* parent node */
+ struct erb_node *clist; /* child nodes */
+ struct erb_surf *surflist; /* surfaces in this node */
+ float xform[16], inv_xform[16]; /* global transformation */
+ float node_xform[16], inv_node_xform[16]; /* local transformation */
+};
+
+struct erb_surf {
+ struct erb_node *node; /* transformation node for this surface */
+
+ erb_intersect_func isect; /* intersection routine */
+ erb_sample_func sample; /* random sample generation */
+};
+
+struct erb_ray {
+ cgm_vec3 o, d; /* origin and direction */
+ float tmin, tmax; /* segment bounds */
+ float ior; /* IOR of the medium through which this ray travels */
+ float total_dist; /* travel distance accumulator */
+};
+
+struct erb_hit {
+ float t, err;
+ struct erb_surf *surf;
+};
+
+int erb_init(void);
+void erb_cleanup(void);
+
+#endif /* RENDLIB_H_ */