+struct erb_rend *erb_create(void);
+void erb_destroy(struct erb_rend *erb);
+
+int erb_allocframe(struct erb_rend *erb, int width, int height);
+float *erb_getframe(struct erb_rend *erb);
+
+/* clears the framebuffer and sample counters to begin rendering a new frame */
+void erb_begin(struct erb_rend *erb);
+/* finalizes the frame, averaging samples (optional) */
+float *erb_end(struct erb_rend *erb);
+
+/* transformation nodes */
+struct erb_node *erb_node(void);
+void erb_free_node(struct erb_node *n);
+int erb_node_addchild(struct erb_node *n, struct erb_node *c);
+int erb_node_rmchild(struct erb_node *n, struct erb_node *c);
+int erb_node_addsurf(struct erb_node *n, struct erb_surf *s);
+int erb_node_rmsurf(struct erb_node *n, struct erb_surf *s);
+
+/* sets the transformation matrix and also calculates the inverse */
+void erb_node_setxform(struct erb_node *n, float *mat);
+
+/* surfaces */
+struct erb_surf *erb_surface(int datasz);
+void erb_free_surface(struct erb_surf *surf);
+struct erb_surf *erb_surf_sphere(float rad);
+struct erb_surf *erb_surf_box(float xsz, float ysz, float zsz);
+
+/* utility functions */
+void erb_xform_ray(struct erb_ray *inray, float *mat, cgm_vec3 *org, cgm_vec3 *dir);