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)