X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=erebus2020;a=blobdiff_plain;f=liberebus%2Fsrc%2Fsurf.c;fp=liberebus%2Fsrc%2Fsurf.c;h=7d8d38aba9007e939b83b33e573c9f5104090490;hp=0000000000000000000000000000000000000000;hb=2e09068ea0c58f8a464f8584b2bb4e9f23241e95;hpb=b5cff57ff6e83f7660e31636a986d2fcedf786e5 diff --git a/liberebus/src/surf.c b/liberebus/src/surf.c new file mode 100644 index 0000000..7d8d38a --- /dev/null +++ b/liberebus/src/surf.c @@ -0,0 +1,119 @@ +#include +#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) +{ +}