#include <cgmath/cgmath.h>
+struct erb_rend;
struct erb_node;
struct erb_surf;
struct erb_ray;
struct erb_aabb;
typedef int (*erb_intersect_func)(struct erb_surf *surf, struct erb_ray *ray, struct erb_hit *hit);
+typedef void (*erb_hitgeom_func)(struct erb_surf *surf, struct erb_hit *hit);
typedef void (*erb_sample_func)(struct erb_surf *surf, cgm_vec3 *pos);
typedef void (*erb_bbox_func)(struct erb_surf *surf, struct erb_aabb *bb);
int bbox_valid;
erb_intersect_func isect; /* intersection routine */
+ erb_hitgeom_func hitgeom; /* calculate derived values of the erb_hit structure */
erb_sample_func sample; /* random sample generation */
erb_bbox_func calc_bbox; /* bounds calculation */
struct erb_hit {
float t, err;
+ cgm_vec3 pos, lpos; /* global and local space hit positions */
struct erb_surf *surf;
+ float total_dist;
+
+ /* derived by calc_hit */
+ cgm_vec3 norm, tang;
+ float u, v;
};
-int erb_init(void);
-void erb_cleanup(void);
+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);
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);
-void erb_node_mulxform(struct erb_node *n, float *mat);
-void erb_node_translate(struct erb_node *n, float x, float y, float z);
-/* TODO ... more ... */
/* surfaces */
struct erb_surf *erb_surface(int datasz);
struct erb_surf *erb_surf_box(float xsz, float ysz, float zsz);
/* utility functions */
-void erb_xform_ray(struct erb_ray *ray, float *mat);
+void erb_xform_ray(struct erb_ray *inray, float *mat, cgm_vec3 *org, cgm_vec3 *dir);
#endif /* RENDLIB_H_ */