16 #define TACHYON_INTERNAL 1    23 #define SPHERE_PRIVATE    28   (
void (*)(
const void *, 
const void *, 
const void *, 
void *))(
sphere_normal),
    36   s=(sphere *) malloc(
sizeof(sphere));
    37   memset(s, 0, 
sizeof(sphere));
    47 static int sphere_bbox(
void * obj, vector * min, vector * max) {
    48   sphere * s = (sphere *) obj;
    50   min->x = s->ctr.x - s->rad;
    51   min->y = s->ctr.y - s->rad;
    52   min->z = s->ctr.z - s->rad;
    53   max->x = s->ctr.x + s->rad;
    54   max->y = s->ctr.y + s->rad;
    55   max->z = s->ctr.z + s->rad;
    63   flt b, disc, t1, t2, temp;
    66   VSUB(spr->ctr, ry->o, V);
    70   disc=b*b + spr->rad*spr->rad - temp;
    72   if (disc<=0.0) 
return;
    78   ry->add_intersection(t2, (
object *) spr, ry);  
    82     ry->add_intersection(t1, (
object *) spr, ry);  
    90   vector deltap, remedyTerm;
    93   VSUB(spr->ctr, ry->o, deltap);
    94   VDOT(ddp, ry->d, deltap);
    95   remedyTerm.x = deltap.x - ddp * ry->d.x; 
    96   remedyTerm.y = deltap.y - ddp * ry->d.y; 
    97   remedyTerm.z = deltap.z - ddp * ry->d.z;
    98   disc = spr->rad*spr->rad - (remedyTerm.x * remedyTerm.x + remedyTerm.y * remedyTerm.y + remedyTerm.z * remedyTerm.z);
   101     float t2 = ddp + disc_root;
   102     float t1 = ddp - disc_root;
   105     ry->add_intersection(t2, (
object *) spr, ry); 
   108       ry->add_intersection(t1, (
object *) spr, ry); 
   113 static void sphere_normal(
const sphere * spr, 
const vector * pnt, 
const ray * incident, vector * N) {
   116   N->x = pnt->x - spr->ctr.x;
   117   N->y = pnt->y - spr->ctr.y;
   118   N->z = pnt->z - spr->ctr.z;
   120   invlen = 1.0 / 
SQRT(N->x*N->x + N->y*N->y + N->z*N->z);
   126   if (
VDot(N, &(incident->d)) > 0.0)  {
 
static int sphere_bbox(void *obj, vector *min, vector *max)
 
static void sphere_normal(const sphere *spr, 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 sphere_intersect(const sphere *spr, ray *ry)
 
object * newsphere(void *tex, vector ctr, flt rad)
 
Tachyon public API function prototypes and declarations used to drive the ray tracing engine...
 
static object_methods sphere_methods