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