foo
[erebus2020] / liberebus / src / surf.c
1 #include <stdio.h>
2 #include "erebus.h"
3
4 struct sph_data {
5         float rad;
6 };
7 struct box_data {
8         cgm_vec3 sz;
9 };
10
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);
14
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);
18
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);
22
23
24 struct erb_surf *erb_surface(int datasz)
25 {
26         struct erb_surf *surf;
27
28         if(!(surf = calloc(1, sizeof *surf - sizeof surf->data + datasz))) {
29                 fprintf(stderr, "failed to allocate surface\n");
30                 return 0;
31         }
32         surf->isect = null_isect;
33         surf->sample = null_sample;
34         surf->calc_bbox = null_bbox;
35         return surf;
36 }
37
38 void erb_free_surface(struct erb_surf *surf)
39 {
40         if(surf->node) {
41                 erb_node_rmsurf(surf->node, surf);
42         }
43         free(surf);
44 }
45
46 struct erb_surf *erb_surf_sphere(float rad)
47 {
48         struct erb_surf *surf;
49         struct sph_data *sdata;
50
51         if(!(surf = erb_surface(sizeof *sdata))) {
52                 return 0;
53         }
54         surf->isect = sph_isect;
55         surf->sample = sph_sample;
56         surf->calc_bbox = sph_bbox;
57         sdata = (struct sph_data*)surf->data;
58         sdata->rad = rad;
59         return surf;
60 }
61
62 struct erb_surf *erb_surf_box(float xsz, float ysz, float zsz)
63 {
64         struct erb_surf *surf;
65         struct box_data *bdata;
66
67         if(!(surf = erb_surface(sizeof *bdata))) {
68                 return 0;
69         }
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);
75         return surf;
76 }
77
78
79 static int null_isect(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit)
80 {
81         return 0;
82 }
83
84 static void null_sample(struct erb_surf *surf, cgm_vec3 *pos)
85 {
86         pos->x = pos->y = pos->z = 0;
87 }
88
89 static void null_bbox(struct erb_surf *surf, struct erb_aabb *bb)
90 {
91         bb->pos.x = bb->pos.y = bb->pos.z = 0;
92         bb->sz.x = bb->sz.y = bb->sz.z = 0;
93 }
94
95 static int sph_isect(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit)
96 {
97         return 0;
98 }
99
100 static void sph_sample(struct erb_surf *surf, cgm_vec3 *pos)
101 {
102 }
103
104 static void sph_bbox(struct erb_surf *surf, struct erb_aabb *bb)
105 {
106 }
107
108 static int box_isect(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit)
109 {
110         return 0;
111 }
112
113 static void box_sample(struct erb_surf *surf, cgm_vec3 *pos)
114 {
115 }
116
117 static void box_bbox(struct erb_surf *surf, struct erb_aabb *bb)
118 {
119 }