16 #define TACHYON_INTERNAL 1    23 #define CYLINDER_PRIVATE     28   (
void (*)(
const void *, 
const void *, 
const void *, 
void *))(
cylinder_normal),
    35   (
void (*)(
const void *, 
const void *, 
const void *, 
void *))(
cylinder_normal),
    44   c=(cylinder *) malloc(
sizeof(cylinder));
    45   memset(c, 0, 
sizeof(cylinder));
    48   c->tex=(texture *) tex;
    61   flt t, s, tin, tout, ln, d; 
    63   rc.x = ry->o.x - cyl->ctr.x;
    64   rc.y = ry->o.y - cyl->ctr.y;
    65   rc.z = ry->o.z - cyl->ctr.z; 
    67   VCross(&ry->d, &cyl->axis, &n);
    69   ln=
SQRT(n.x*n.x + n.y*n.y + n.z*n.z);    
    72     VDOT(d, rc, cyl->axis);         
    73     D.x = rc.x - d * cyl->axis.x; 
    74     D.y = rc.y - d * cyl->axis.y;
    75     D.z = rc.z - d * cyl->axis.z;
    91     VCross(&rc, &cyl->axis, &O);
    94     VCross(&n, &cyl->axis, &O); 
    96     ln = 
SQRT(O.x*O.x + O.y*O.y + O.z*O.z);
   102     s = 
FABS(
SQRT(cyl->rad*cyl->rad - d*d) / s);
   104     ry->add_intersection(tin, (
object *) cyl, ry); 
   106     ry->add_intersection(tout, (
object *) cyl, ry);
   110 static void cylinder_normal(
const cylinder * cyl, 
const vector * pnt, 
const ray * incident, vector * N) {
   112   flt t, invlen, invlen2;
   114   a.x = pnt->x - cyl->ctr.x;
   115   a.y = pnt->y - cyl->ctr.y;
   116   a.z = pnt->z - cyl->ctr.z;
   120   invlen = 1.0 / 
SQRT(b.x*b.x + b.y*b.y + b.z*b.z);
   127   N->x = pnt->x - (b.x * t + cyl->ctr.x); 
   128   N->y = pnt->y - (b.y * t + cyl->ctr.y);
   129   N->z = pnt->z - (b.z * t + cyl->ctr.z);
   131   invlen2 = 1.0 / 
SQRT(N->x*N->x + N->y*N->y + N->z*N->z);
   137   if (
VDot(N, &(incident->d)) > 0.0)  {
   147   c=(cylinder *) malloc(
sizeof(cylinder));
   148   memset(c, 0, 
sizeof(cylinder));
   151   c->tex=(texture *) tex;
   160   cylinder * c = (cylinder *) obj;
   161   vector mintmp, maxtmp;
   166   maxtmp.x = c->ctr.x + c->axis.x;
   167   maxtmp.y = c->ctr.y + c->axis.y;
   168   maxtmp.z = c->ctr.z + c->axis.z;
   170   min->x = 
MYMIN(mintmp.x, maxtmp.x);
   171   min->y = 
MYMIN(mintmp.y, maxtmp.y);
   172   min->z = 
MYMIN(mintmp.z, maxtmp.z);
   177   max->x = 
MYMAX(mintmp.x, maxtmp.x);
   178   max->y = 
MYMAX(mintmp.y, maxtmp.y);
   179   max->z = 
MYMAX(mintmp.z, maxtmp.z);
   189   vector rc, n, O, hit, tmp2, ctmp4;
   190   flt t, s, tin, tout, ln, d, tmp, tmp3;
   192   rc.x = ry->o.x - cyl->ctr.x;  
   193   rc.y = ry->o.y - cyl->ctr.y;
   194   rc.z = ry->o.z - cyl->ctr.z;
   196   VCross(&ry->d, &cyl->axis, &n);
   198   ln=
SQRT(n.x*n.x + n.y*n.y + n.z*n.z);    
   212     VCross(&rc, &cyl->axis, &O);
   215     VCross(&n, &cyl->axis, &O);
   217     ln = 
SQRT(O.x*O.x + O.y*O.y + O.z*O.z);
   223     s = 
FABS(
SQRT(cyl->rad*cyl->rad - d*d) / s);
   231     tmp2.x = hit.x - cyl->ctr.x;   
   232     tmp2.y = hit.y - cyl->ctr.y;   
   233     tmp2.z = hit.z - cyl->ctr.z;   
   235     VDOT(tmp,  tmp2, ctmp4);
   236     VDOT(tmp3, cyl->axis, cyl->axis);
   238     if ((tmp > 0.0) && (tmp < 
SQRT(tmp3))) 
   239       ry->add_intersection(tin, (
object *) cyl, ry);
   244     tmp2.x = hit.x - cyl->ctr.x;   
   245     tmp2.y = hit.y - cyl->ctr.y;   
   246     tmp2.z = hit.z - cyl->ctr.z;   
   248     VDOT(tmp,  tmp2, ctmp4); 
   249     VDOT(tmp3, cyl->axis, cyl->axis);
   251     if ((tmp > 0.0) && (tmp < 
SQRT(tmp3))) 
   252       ry->add_intersection(tout, (
object *) cyl, ry);
 
static void fcylinder_intersect(const cylinder *cyl, ray *ry)
 
flt VDot(apivector *a, apivector *b)
 
static void cylinder_normal(const cylinder *cyl, const vector *pnt, const ray *incident, vector *N)
 
double flt
generic floating point number, using double 
 
static object_methods cylinder_methods
 
void VCross(apivector *a, apivector *b, apivector *c)
 
static int fcylinder_bbox(void *obj, vector *min, vector *max)
 
#define VDOT(return, a, b)
 
static void cylinder_intersect(const cylinder *cyl, ray *ry)
 
Tachyon cross-platform timers, special math function wrappers, and RNGs. 
 
object * newcylinder(void *tex, vector ctr, vector axis, flt rad)
 
Tachyon public API function prototypes and declarations used to drive the ray tracing engine...
 
object * newfcylinder(void *tex, vector ctr, vector axis, flt rad)
 
static object_methods fcylinder_methods
 
static int cylinder_bbox(void *obj, vector *min, vector *max)