ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/ot/sphere.c
(Generate patch)

Comparing ray/src/ot/sphere.c (file contents):
Revision 1.1 by greg, Thu Feb 2 10:33:06 1989 UTC vs.
Revision 2.5 by schorsch, Tue Mar 30 16:13:00 2004 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1986 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   *  sphere.c - routines for creating octrees for spheres.
6   *
# Line 53 | Line 50 | static char SCCSid[] = "$SunId$ LBL";
50   */
51  
52  
53 < o_sphere(o, cu)                 /* determine if sphere intersects cube */
54 < OBJREC  *o;
55 < register CUBE  *cu;
53 > int
54 > o_sphere(                       /* determine if sphere intersects cube */
55 >        OBJREC  *o,
56 >        register CUBE  *cu
57 > )
58   {
59          FVECT  v1;
60          double  d1, d2;
61 <        register double  *fa;
61 >        register RREAL  *fa;
62          register int  i;
63   #define  cent           fa
64   #define  rad            fa[3]
65                                          /* get arguments */
66 +        if (o->oargs.nfargs != 4)
67 +                objerror(o, USER, "bad # arguments");
68          fa = o->oargs.farg;
69 <        if (o->oargs.nfargs != 4 || rad <= FTINY)
70 <                objerror(o, USER, "bad arguments");
69 >        if (rad < -FTINY) {
70 >                objerror(o, WARNING, "negative radius");
71 >                o->otype = o->otype == OBJ_SPHERE ?
72 >                                OBJ_BUBBLE : OBJ_SPHERE;
73 >                rad = -rad;
74 >        } else if (rad <= FTINY)
75 >                objerror(o, USER, "zero radius");
76  
77          d1 = ROOT3/2.0 * cu->cusize;    /* bounding radius for cube */
78  
# Line 76 | Line 82 | register CUBE  *cu;
82          d2 = DOT(v1,v1);
83  
84          if (d2 > (rad+d1+FTINY)*(rad+d1+FTINY)) /* quick test */
85 <                return(0);                      /* cube outside */
85 >                return(O_MISS);                 /* cube outside */
86          
87                                          /* check sphere interior */
88          if (d1 < rad) {
89                  if (d2 < (rad-d1-FTINY)*(rad-d1-FTINY))
90 <                        return(0);              /* cube inside sphere */
90 >                        return(O_MISS);         /* cube inside sphere */
91                  if (d2 < (rad+FTINY)*(rad+FTINY))
92 <                        return(1);              /* cube center inside */
92 >                        return(O_HIT);          /* cube center inside */
93          }
94                                          /* find closest distance */
95          for (i = 0; i < 3; i++)
# Line 95 | Line 101 | register CUBE  *cu;
101                          v1[i] = 0;
102                                          /* final intersection check */
103          if (DOT(v1,v1) <= (rad+FTINY)*(rad+FTINY))
104 <                return(1);
104 >                return(O_HIT);
105          else
106 <                return(0);
106 >                return(O_MISS);
107   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines