blob: 1fdb1b6782c856fc7b87bcf654820221df0692d6 [file] [log] [blame]
/*************************************************************************/
/* */
/* Copyright (c) 1994 Stanford University */
/* */
/* All rights reserved. */
/* */
/* Permission is given to use, copy, and modify this software for any */
/* non-commercial purpose as long as this copyright notice is not */
/* removed. All other uses, including redistribution in whole or in */
/* part, are forbidden without prior written permission. */
/* */
/* This software is provided with absolutely no warranty and no */
/* support. */
/* */
/*************************************************************************/
/*
* NAME
* isect.c
*
* DESCRIPTION
* This file contains routines that walk the model object list,
* intersecting both standard rays and shadow rays with objects in the
* list.
*/
#include <stdio.h>
#include <math.h>
#include "rt.h"
/*
* NAME
* Intersect - intersect ray with objects in linked list
*
* SYNOPSIS
* VOID Intersect(pr, hit)
* RAY *pr; // Ptr to incident ray.
* IRECORD *hit; // Intersection record.
*
* RETURNS
* TRUE if ray intersects an object, FALSE otherwise.
*/
BOOL Intersect(pr, hit)
RAY *pr;
IRECORD *hit;
{
OBJECT *po; /* Ptr to the object. */
IRECORD newhit; /* New intersection. */
po = gm->modelroot;
hit->t = HUGE_REAL;
hit->pelem = NULL;
while (po)
{
if ((*po->procs->intersect)(pr, po, &newhit))
if (newhit.t < hit[0].t)
*hit = newhit;
po = po->next;
}
if (hit->t < HUGE_REAL)
return (TRUE);
else
return (FALSE);
}
/*
* NAME
* ShadowIntersect - intersect a shadow ray with objects in linked list
*
* SYNOPSIS
* REAL ShadowIntersect(pr, lightlength, pe)
* RAY *pr; // Ptr to incident ray.
* REAL lightdist; // Distance to light.
* ELEMENT *pe; // Ptr to element of ray origin.
*
* RETURNS
* The transparency value from ray origin to light source.
*
* 0.0 -> Fully obscured.
* 1.0 -> Fully visible.
*/
REAL ShadowIntersect(pr, lightdist, pe)
RAY *pr;
REAL lightdist;
ELEMENT *pe;
{
REAL trans; /* Transparency factor. */
OBJECT *po; /* Ptr to the object. */
IRECORD newhit; /* New hit record. */
trans = 1.0;
po = gm->modelroot;
while (po && trans > 0.0)
{
if ((*po->procs->intersect)(pr, po, &newhit) && newhit.pelem != pe && newhit.t < lightdist)
trans *= newhit.pelem->parent->surf->ktran;
po = po->next;
}
return (trans);
}