This is list.c in view mode; [Download] [Up]
/*
* list.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$
*
* $Log$
*/
#include "object.h"
#include "list.h"
static Methods *iListMethods = NULL;
static char listName[] = "list";
List *
ListCreate()
{
return (List *)share_calloc(1, sizeof(List));
}
char *
ListName()
{
return listName;
}
/*
* Take a list whose DATA field points to a linked list of objects and
* turn it into a List.
*/
int
ListConvert(list, objlist)
List *list;
Object *objlist;
{
int num;
/*
* Find the unbounded objects on the list as well as the
* bounding box of the list.
*/
list->unbounded = BoundsFind(&objlist, list->bounds, &num);
list->list = objlist;
return num;
}
/*
* Intersect ray & list of objects.
*/
int
ListIntersect(list, ray, hitlist, mindist, maxdist)
List *list;
Ray *ray;
HitList *hitlist;
Float mindist, *maxdist;
{
Object *objlist;
Vector vtmp;
Float s;
int hit;
hit = FALSE;
/*
* Intersect with unbounded objects.
*/
for (objlist = list->unbounded; objlist ; objlist = objlist->next) {
if (intersect(objlist, ray, hitlist, mindist, maxdist))
hit = TRUE;
}
/*
* Check for intersection with bounding box.
*/
s = *maxdist; /* So maxdist won't be reset. */
VecAddScaled(ray->pos, mindist, ray->dir, &vtmp);
if (OutOfBounds(&vtmp, list->bounds) &&
!BoundsIntersect(ray, list->bounds, mindist, &s))
/*
* Ray never hit list.
*/
return hit;
/*
* Else the ray enters list-space before it hits an
* unbounded object. Intersect with objects on list.
*/
for (objlist = list->list; objlist ; objlist = objlist->next) {
if (intersect(objlist, ray, hitlist, mindist, maxdist))
hit = TRUE;
}
return hit;
}
Methods *
ListMethods()
{
if (iListMethods == (Methods *)NULL) {
iListMethods = MethodsCreate();
iListMethods->methods = ListMethods;
iListMethods->create = (ObjCreateFunc *)ListCreate;
iListMethods->name = ListName;
iListMethods->intersect = ListIntersect;
iListMethods->bounds = ListBounds;
iListMethods->convert = ListConvert;
iListMethods->checkbounds = FALSE;
iListMethods->closed = TRUE;
}
return iListMethods;
}
void
ListBounds(list, bounds)
List *list;
Float bounds[2][3];
{
BoundsCopy(list->bounds, bounds);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.