11 static int null_isect(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit);
12 static void null_sample(struct erb_surf *surf, cgm_vec3 *pos);
13 static void null_bbox(struct erb_surf *surf, struct erb_aabb *bb);
15 static int sph_isect(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit);
16 static void sph_sample(struct erb_surf *surf, cgm_vec3 *pos);
17 static void sph_bbox(struct erb_surf *surf, struct erb_aabb *bb);
19 static int box_isect(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit);
20 static void box_sample(struct erb_surf *surf, cgm_vec3 *pos);
21 static void box_bbox(struct erb_surf *surf, struct erb_aabb *bb);
24 struct erb_surf *erb_surface(int datasz)
26 struct erb_surf *surf;
28 if(!(surf = calloc(1, sizeof *surf - sizeof surf->data + datasz))) {
29 fprintf(stderr, "failed to allocate surface\n");
32 surf->isect = null_isect;
33 surf->sample = null_sample;
34 surf->calc_bbox = null_bbox;
38 void erb_free_surface(struct erb_surf *surf)
41 erb_node_rmsurf(surf->node, surf);
46 struct erb_surf *erb_surf_sphere(float rad)
48 struct erb_surf *surf;
49 struct sph_data *sdata;
51 if(!(surf = erb_surface(sizeof *sdata))) {
54 surf->isect = sph_isect;
55 surf->sample = sph_sample;
56 surf->calc_bbox = sph_bbox;
57 sdata = (struct sph_data*)surf->data;
62 struct erb_surf *erb_surf_box(float xsz, float ysz, float zsz)
64 struct erb_surf *surf;
65 struct box_data *bdata;
67 if(!(surf = erb_surface(sizeof *bdata))) {
70 surf->isect = box_isect;
71 surf->sample = box_sample;
72 surf->calc_bbox = box_bbox;
73 bdata = (struct box_data*)surf->data;
74 cgm_vcons(&bdata->sz, xsz, ysz, zsz);
79 static int null_isect(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit)
84 static void null_sample(struct erb_surf *surf, cgm_vec3 *pos)
86 pos->x = pos->y = pos->z = 0;
89 static void null_bbox(struct erb_surf *surf, struct erb_aabb *bb)
91 bb->pos.x = bb->pos.y = bb->pos.z = 0;
92 bb->sz.x = bb->sz.y = bb->sz.z = 0;
95 static int sph_isect(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit)
100 static void sph_sample(struct erb_surf *surf, cgm_vec3 *pos)
104 static void sph_bbox(struct erb_surf *surf, struct erb_aabb *bb)
108 static int box_isect(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit)
113 static void box_sample(struct erb_surf *surf, cgm_vec3 *pos)
117 static void box_bbox(struct erb_surf *surf, struct erb_aabb *bb)