4
typedef struct
{
double r,g,b; /* red,green,blue */
} t_color;
constants.h contains a variety of constants
definitions. First, the sizes of the light, object, and surface
type arrays are defined. The array sizes must be increased
as you render images with more objects (or lights or
surfaces types) in them. Only the mais program should
required recompilation when these sizes are changed.
Next the screen size is defined. It should not change
unless you move to a frame buffer with a different
resolution or aspect ratio. The gamma correction constant
is likewise frame buffer dependent.
Finally, object type constants are specified. These
constants relate the object type to the routines used to find
intersections and normals. The constants (0-n) correspond
to the order of the intersection and normal routines in the
objint and objnrm arrays in maindecl.h.
/*** constants.h ***/
#define LIGHTS 4
#define OBJECTS 50
#define SURFACES 50
#define SCREENWIDTH 512
#define SCREENHEIGHT 512
#define ASPECTRATIO 1.0
#define GAMMA 1.8
#define OTYPSPHERE 0
#define OTYPBOX 1
#define OTYPTRIANGLE 2
#define OTYPSUPERQ 3
maindecl.h contains the declaration of the global
variables and is included in the main program.
Global information has been minimized. This tends to
lessen unforseen interactions among routines. The global
variables consist mainly of values which define the ray
tracing world.
First, the object intersection routine and object normal
routine pointer arrays are declared. The objint array has
pointers to the ray-object intersection routine for each type
of object. The objnrm array has pointers to the surface
normal routine for each object type.
Next, the arrays for objects, lights, and surfaces types
are declared. A maximum size for each array is kept, along
with a count of how many itens in each array are currently
being used.
The viewing parameters are declared next. They
include the size of the image to be produced, the eye point,
look point, up vector, and horizontal and vertical fields of
view. Section 2.5 describes these parameters.
The current level and maximum level of reflection are
used in the full system to limit the number of levels of
reflection which are rendered.
The string for the pixel output file name is then
declared. Finally, the background color is defined. It is
used when a ray does not hit any object.
/*** maindecl.h ***/
#include "constants.h"
#include "funcdefs.h"
/* intersection routines */
double (*objint[])()={intsph,intbox,
inttri,intsup};
/* normal routines */
int (*objnrm[])()={nrmsph,nrmbox,
nrmtri,nrmsup};
/* global variables */
int nlight; /* presently in use */
int lightlim=LIGHTS; /* maximum declared */
t_light light[LIGHTS]; /* array of lights */
int nobject; /* presently in use */
int objectlim=OBJECTS; /* maximun declared */
t_object object[OBJECTS]; /* array of objects */
int nsurface; /* presently in use */
int surfacelim=SURFACES; /* maximum declared */
t_surface surface[SURFACES]; /* array surfaces */
int sizex,sizey; /* image sizes */
t_3d eyep,lookp,up; /* view definition */
double hfov,vfov; /* field of view */
int level,maxlevel; /* reflection levels */
char *outfilename[]; /* pixel file name */
t_color background; /* background color */
globalvar.h contains the definition of the global
variables and is included in routines which access the
global variables.
/*** globalvar.h ***/
extern double (*objint[])();
extern int (*objnrm[])();
extern int nlight,lightlim;
extern t_light light[];
extern int nobject,objectlim;
extern t_object object[];
extern int nsurface,surfacelim;
extern t_surface surface[];
extern int sizex,sizey;
extern t_3d eyep,lookp,up;
extern double hfov,vfov;
extern int level,maxlevel;
extern char *outfilename[];
extern t_color background;
funcdefs.h defines the names and types for all of the
routines in the ray tracer. It is included in all routines which
have calls to other routines.
/*** funcdefs ***/
double brightness();
int crossp();
double dotp();
int endpic();
int gammacorrect();
double intersect();
int lightray();
int linepic();
double normalize();
int setup();
int shade();
int startpic();
int viewing();
int yyparse();