16 #define TACHYON_INTERNAL 1    28   (
void (*)(
const void *, 
const void *, 
const void *, 
void *))(
ring_normal),
    33 object * 
newring(
void * tex, vector ctr, vector norm, 
flt inrad, 
flt outrad) {
    36   r=(ring *) malloc(
sizeof(ring));
    37   memset(r, 0, 
sizeof(ring));
    50 static int ring_bbox(
void * obj, vector * min, vector * max) {
    51   ring * r = (ring *) obj;
    53   min->x = r->ctr.x - r->outrad;
    54   min->y = r->ctr.y - r->outrad;
    55   min->z = r->ctr.z - r->outrad;
    56   max->x = r->ctr.x + r->outrad;
    57   max->y = r->ctr.y + r->outrad;
    58   max->z = r->ctr.z + r->outrad;
    68   d = -
VDot(&(rng->ctr), &(rng->norm));
    70   t=-(d+
VDot(&(rng->norm), &(ry->o)));
    71   td=
VDot(&(rng->norm),&(ry->d)); 
    76       VSUB(hit, rng->ctr, pnt);
    79       if ((td > rng->inrad) && (td < rng->outrad)) 
    80         ry->add_intersection(t,(
object *) rng, ry);
    85 static void ring_normal(
const ring * rng, 
const vector * pnt, 
const ray * incident, vector * N) {
    89   if (
VDot(N, &(incident->d)) > 0.0)  {
 object * newring(void *tex, vector ctr, vector norm, flt inrad, flt outrad)
 
static void ring_normal(const ring *rng, const vector *pnt, const ray *incident, vector *N)
 
flt VDot(apivector *a, apivector *b)
 
double flt
generic floating point number, using double 
 
#define VDOT(return, a, b)
 
Tachyon cross-platform timers, special math function wrappers, and RNGs. 
 
static void ring_intersect(const ring *rng, ray *ry)
 
static int ring_bbox(void *obj, vector *min, vector *max)
 
vector Raypnt(const ray *a, flt t)
 
static object_methods ring_methods
 
Tachyon public API function prototypes and declarations used to drive the ray tracing engine...