--- ray/src/ot/o_cone.c 1991/11/12 17:00:48 2.1 +++ ray/src/ot/o_cone.c 2016/04/21 00:40:35 2.7 @@ -1,9 +1,6 @@ -/* Copyright (c) 1986 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: o_cone.c,v 2.7 2016/04/21 00:40:35 greg Exp $"; #endif - /* * o_cone.c - routines for intersecting cubes with cones. * @@ -11,13 +8,15 @@ static char SCCSid[] = "$SunId$ LBL"; */ #include "standard.h" - #include "octree.h" - #include "object.h" - #include "cone.h" +#include "plocate.h" +#ifndef STRICT +#define STRICT 1 +#endif + #define ROOT3 1.732050808 /* @@ -35,32 +34,41 @@ static char SCCSid[] = "$SunId$ LBL"; extern double mincusize; /* minimum cube size */ +static int findcseg(FVECT ep0, FVECT ep1, CONE *co, FVECT p); -o_cone(o, cu) /* determine if cone intersects cube */ -OBJREC *o; -register CUBE *cu; + + +extern int +o_cone( /* determine if cone intersects cube */ + OBJREC *o, + CUBE *cu +) { - double dist2lseg(), findcseg(); CONE *co; FVECT ep0, ep1; +#if STRICT FVECT cumin, cumax; CUBE cukid; + int j; +#endif double r; FVECT p; - register int i, j; + int i; /* get cone arguments */ co = getcone(o, 0); + if (co == NULL) /* check for degenerate case */ + return(O_MISS); /* get cube center */ r = cu->cusize * 0.5; for (i = 0; i < 3; i++) p[i] = cu->cuorg[i] + r; r *= ROOT3; /* bounding radius for cube */ - if (findcseg(ep0, ep1, co, p) > 0.0) { + if (findcseg(ep0, ep1, co, p)) { /* check min. distance to cone */ if (dist2lseg(p, ep0, ep1) > (r+FTINY)*(r+FTINY)) return(O_MISS); -#ifdef STRICT +#if STRICT /* get cube boundaries */ for (i = 0; i < 3; i++) cumax[i] = (cumin[i] = cu->cuorg[i]) + cu->cusize; @@ -91,26 +99,28 @@ register CUBE *cu; } -double -findcseg(ep0, ep1, co, p) /* find line segment from cone closest to p */ -FVECT ep0, ep1; -register CONE *co; -FVECT p; +static int +findcseg( /* find line segment from cone closest to p */ + FVECT ep0, + FVECT ep1, + CONE *co, + FVECT p +) { double d; FVECT v; - register int i; + int i; /* find direction from axis to point */ - for (i = 0; i < 3; i++) - v[i] = p[i] - CO_P0(co)[i]; + VSUB(v, p, CO_P0(co)); d = DOT(v, co->ad); for (i = 0; i < 3; i++) - v[i] = v[i] - d*co->ad[i]; - d = normalize(v); - if (d > 0.0) /* find endpoints of segment */ - for (i = 0; i < 3; i++) { - ep0[i] = CO_R0(co)*v[i] + CO_P0(co)[i]; - ep1[i] = CO_R1(co)*v[i] + CO_P1(co)[i]; - } - return(d); /* return distance from axis */ + v[i] -= d*co->ad[i]; + if (normalize(v) == 0.0) + return(0); + /* find endpoints of segment */ + for (i = 0; i < 3; i++) { + ep0[i] = CO_R0(co)*v[i] + CO_P0(co)[i]; + ep1[i] = CO_R1(co)*v[i] + CO_P1(co)[i]; + } + return(1); /* return distance from axis */ }