/*
 * Variables shared by the various libraries:
 */

Float
RSAbstmp

	Temporary variable used by the fabs() macro to keep
	expressions from being evaluated twice (e.g.,
	fabs(cos(x)) is expanded to ((x=cos(x) < 0 ? -x : x)
	rather than ((x=cos(x) < 0 ? -cos(x) : cos(x))	).
	Could be removed by making fabs a function or not minding
	if expressions are evaluated twice.

SampleInfo
Sampling

	Variables used to control sampling.
	Used in conjunction with a ray's sample number
	(ray->sample) to determine how to sample, for example,
	extended light sources.

/*
 * Variables shared by modules in the rayshade application:
 */
RSCamera
Camera
	Camera definition.  Used in viewing, setup, and parsing.

RSScreen
Screen
	Screen information.  Used in viewing, setup, and parsing.

RSOptions
Options
	
	Options of all sorts.

RSStats
Stats

	Statistical information.

Medium
TopMedium

	"Air" description (index of refraction and atmospheric effects).
	Used in viewing, parsing, and ShadeRay.

Light *
Lights

	Array of defined lights.  Used in parsing and in shade().

/*
 * Application-provided functions:
 */
Surface *
GetShadingSurf(hitlist)
HitList *hitlist

	Given a hitlist, return the surface to be used in shading.

int
TraceRay(ray, hitlist, mindist, maxdist)
Ray *ray;
HitList *hitlist;
Float mindist, *maxdist;

	Intersect the top-level object with the given ray.
	Probably as simple as:
		return intersect(World, ray, hitlist, mindist, maxdist)

void
RLerror(level, pattern, arg1, arg2, arg3)
int level;
char *pattern, *arg1, *arg2, *arg3;

	Error-reporting function.  'level' indicates the severity of
	the error (see libcommon/error.h).  'pattern' and the
	args are suitable for printing via:
		fprintf(stderr, patter, arg1, arg2, arg3);
	Note that as the args are cast to char *'s, printing, for
	example, several doubles, will not work.  (Being more
	rigorous about it would require varargs or something similar.)
