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...