home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Resource Library: Graphics
/
graphics-16000.iso
/
msdos
/
raytrace
/
rayshade
/
src
/
objdef.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-07-18
|
3KB
|
115 lines
/*
* objdef.c
*
* Copyright (C) 1989, 1991, Craig E. Kolb
* All rights reserved.
*
* This software may be freely copied, modified, and redistributed
* provided that this copyright notice is preserved on all copies.
*
* You may not distribute this software, in whole or in part, as part of
* any commercial product without the express consent of the authors.
*
* There is no warranty or other guarantee of fitness of this software
* for any purpose. It is provided solely "as is".
*
* $Id: objdef.c,v 4.0 91/07/17 14:46:38 kolb Exp Locker: kolb $
*
* $Log: objdef.c,v $
* Revision 4.0 91/07/17 14:46:38 kolb
* Initial version.
*
*/
#include "rayshade.h"
#include "options.h"
#include "stats.h"
static Geom *Objects = NULL; /* named objects */
Geom *World; /* top-level object */
/*
* Return pointer to named object, NULL if no such object has been defined.
*/
Geom *
GeomGetNamed(name)
char *name;
{
Geom *otmp;
for (otmp = Objects; otmp; otmp = otmp->next)
if (strcmp(name, otmp->name) == 0)
return otmp;
return (Geom *)NULL;
}
/*
* Add object to list of defined objects. At this point, the object has
* been converted to the correct type, and obj->next is either NULL or
* garbage.
*/
void
GeomAddToDefined(obj)
Geom *obj;
{
obj->next = Objects;
Objects = obj;
if (Options.verbose)
AggregatePrintInfo(obj, Stats.fstats);
else
AggregatePrintInfo(obj, (FILE *)NULL);
}
/*
* Return a copy of the named object.
*/
Geom *
GeomCopyNamed(name)
char *name;
{
Geom *child;
child = GeomGetNamed(name);
if (child == (Geom *)NULL)
RLerror(RL_PANIC, "There is no object named \"%s\".", name);
child = GeomCopy(child);
return child;
}
void
WorldSetup()
{
extern GeomList *Defstack;
/*
* Define World object, if not done previously.
*/
if (World == (Geom *)NULL) {
World = Defstack->obj; /* World is topmost object on stack */
if (Defstack->next)
RLerror(RL_ABORT, "Geom def stack is screwey.\n");
World->prims = AggregateConvert(World, World->next);
}
GeomComputeBounds(World);
/*
* Complain if there are no primitives to be rendered.
*/
if (World->prims == 0) {
RLerror(RL_PANIC, "Nothing to be rendered.\n");
}
}
/*
* Main ray-spwaning routine required by libray
*/
int
TraceRay(ray, hitlist, mindist, maxdist)
Ray *ray;
HitList *hitlist;
Float mindist, *maxdist;
{
return intersect(World, ray, hitlist, mindist, maxdist);
}