+#include <stdio.h>
+#include "erebus.h"
+
+struct sph_data {
+ float rad;
+};
+struct box_data {
+ cgm_vec3 sz;
+};
+
+static int null_isect(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit);
+static void null_sample(struct erb_surf *surf, cgm_vec3 *pos);
+static void null_bbox(struct erb_surf *surf, struct erb_aabb *bb);
+
+static int sph_isect(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit);
+static void sph_sample(struct erb_surf *surf, cgm_vec3 *pos);
+static void sph_bbox(struct erb_surf *surf, struct erb_aabb *bb);
+
+static int box_isect(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit);
+static void box_sample(struct erb_surf *surf, cgm_vec3 *pos);
+static void box_bbox(struct erb_surf *surf, struct erb_aabb *bb);
+
+
+struct erb_surf *erb_surface(int datasz)
+{
+ struct erb_surf *surf;
+
+ if(!(surf = calloc(1, sizeof *surf - sizeof surf->data + datasz))) {
+ fprintf(stderr, "failed to allocate surface\n");
+ return 0;
+ }
+ surf->isect = null_isect;
+ surf->sample = null_sample;
+ surf->calc_bbox = null_bbox;
+ return surf;
+}
+
+void erb_free_surface(struct erb_surf *surf)
+{
+ if(surf->node) {
+ erb_node_rmsurf(surf->node, surf);
+ }
+ free(surf);
+}
+
+struct erb_surf *erb_surf_sphere(float rad)
+{
+ struct erb_surf *surf;
+ struct sph_data *sdata;
+
+ if(!(surf = erb_surface(sizeof *sdata))) {
+ return 0;
+ }
+ surf->isect = sph_isect;
+ surf->sample = sph_sample;
+ surf->calc_bbox = sph_bbox;
+ sdata = (struct sph_data*)surf->data;
+ sdata->rad = rad;
+ return surf;
+}
+
+struct erb_surf *erb_surf_box(float xsz, float ysz, float zsz)
+{
+ struct erb_surf *surf;
+ struct box_data *bdata;
+
+ if(!(surf = erb_surface(sizeof *bdata))) {
+ return 0;
+ }
+ surf->isect = box_isect;
+ surf->sample = box_sample;
+ surf->calc_bbox = box_bbox;
+ bdata = (struct box_data*)surf->data;
+ cgm_vcons(&bdata->sz, xsz, ysz, zsz);
+ return surf;
+}
+
+
+static int null_isect(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit)
+{
+ return 0;
+}
+
+static void null_sample(struct erb_surf *surf, cgm_vec3 *pos)
+{
+ pos->x = pos->y = pos->z = 0;
+}
+
+static void null_bbox(struct erb_surf *surf, struct erb_aabb *bb)
+{
+ bb->pos.x = bb->pos.y = bb->pos.z = 0;
+ bb->sz.x = bb->sz.y = bb->sz.z = 0;
+}
+
+static int sph_isect(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit)
+{
+ return 0;
+}
+
+static void sph_sample(struct erb_surf *surf, cgm_vec3 *pos)
+{
+}
+
+static void sph_bbox(struct erb_surf *surf, struct erb_aabb *bb)
+{
+}
+
+static int box_isect(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit)
+{
+ return 0;
+}
+
+static void box_sample(struct erb_surf *surf, cgm_vec3 *pos)
+{
+}
+
+static void box_bbox(struct erb_surf *surf, struct erb_aabb *bb)
+{
+}