home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: Graphics
/
Graphics.zip
/
DBWBOUND.ZIP
/
EXT.C
< prev
next >
Wrap
Text File
|
1989-04-17
|
6KB
|
230 lines
/************************************************************************
* *
* Copyright (c) 1987, David B. Wecker *
* All Rights Reserved *
* *
* This file is part of DBW_Render *
* *
* DBW_Render is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY. No author or distributor accepts *
* responsibility to anyone for the consequences of using it or for *
* whether it serves any particular purpose or works at all, unless *
* he says so in writing. Refer to the DBW_Render General Public *
* License for full details. *
* *
* Everyone is granted permission to copy, modify and redistribute *
* DBW_Render, but only under the conditions described in the *
* DBW_Render General Public License. A copy of this license is *
* supposed to have been given to you along with DBW_Render so you *
* can know your rights and responsibilities. It should be in a file *
* named COPYING. Among other things, the copyright notice and this *
* notice must be preserved on all copies. *
************************************************************************
# #
# Authors: #
# DBW - David B. Wecker #
# jhl - John H. Lowery (IBM port) #
# #
# Versions: #
# V1.0 870125 DBW - First released version #
# V2.0 880000 jhl - ported to IBM PC (MCGA/VGA display hardware) #
# #
************************************************************************/
#define MODULE_EXTENT
#include "ray.h"
node *masternp = NULL;
node **nppstack[100] =
{
&masternp,
}
;
int nppsp = 0;
/* V1.01 */
#ifdef MCH_AMIGA
#define LARGEST ((float)1.7e+38)
#else
/* V1.01 */
# ifdef IBM_PC
#define LARGEST ((float)1.7e+38)
# else
#define LARGEST HUGE
# endif
/* V1.01 */
#endif
#define curnpp (nppstack[nppsp])
#define pushnpp(npp) (nppstack[++nppsp] = npp)
#define popnpp (nppstack[nppsp--])
void sphere_rextent();
void triangle_rextent();
void quad_rextent();
void ring_rextent();
void cyl_rextent();
void cone_rextent();
void setextent(ep,re)
extent *ep;
rextent *re;
{
int i;
float t;
for (ep->radius = 0.,i = 0; i < 3; i++)
{
ep->center[i] = (re->min[i] + re->max[i]) / 2.0;
t = re->max[i] - ep->center[i];
ep->radius += t * t;
}
ep->radius = (float)sqrt(ep->radius);
}
/*
* find the bounding extent (sphere) for the current object
*/
void getextent(np,re)
node *np;
rextent *re;
{
rextent newre;
cv(LARGEST,LARGEST,LARGEST,re->min); /* V1.01 */
cv(-LARGEST,-LARGEST,-LARGEST,re->max); /* V1.01 */
while (np)
{
switch (np->kind)
{
/* user-defined extent */
case EXTENT :
getextent(eptr(np)->sub,&newre);
setextent(np,&newre);
break;
/* planar objects */
case TRIANGLE:
triangle_rextent(np,&newre);
break;
case QUAD:
quad_rextent(np,&newre);
break;
case RING:
ring_rextent(np,&newre);
break;
/* volume objects */
case SPHERE:
sphere_rextent(np,&newre);
break;
case CYLINDER:
/* in work */
cyl_rextent(np,&newre);
break;
}
unionrextent(re,&newre,re);
np = np->next;
}
}
/*
* The bounding extent for a sphere is the sphere itself.
*/
void sphere_rextent(sp,re)
sphere *sp;
rextent *re;
{
int i;
for (i = 0; i < 3; i++)
{
re->min[i] = sp->center[i] - sp->radius;
re->max[i] = sp->center[i] + sp->radius;
}
}
/*
* The bounding extent for a triangle is
*/
void triangle_rextent(tp,re)
triangle *tp;
rextent *re;
{
vector v1,v2;
cv(LARGEST,LARGEST,LARGEST,re->min); /* V1.01 */
cv(-LARGEST,-LARGEST,-LARGEST,re->max); /* V1.01 */
vecsum(tp->position,tp->ve,v1);
vecsum(tp->position,tp->vp,v2);
unionvector(re,tp->position,re);
unionvector(re,v1,re);
unionvector(re,v2,re);
}
void quad_rextent(qp,re)
quad *qp;
rextent *re;
{
vector v;
cv(LARGEST,LARGEST,LARGEST,re->min); /* V1.01 */
cv(-LARGEST,-LARGEST,-LARGEST,re->max); /* V1.01 */
unionvector(re,qp->position,re);
vecsum(qp->position,qp->ve,v);
unionvector(re,v,re);
vecsum(qp->position,qp->vp,v);
unionvector(re,v,re);
vecsum(v,qp->ve,v);
unionvector(re,v,re);
}
/*
* The bounding extent for a ring is a sphere with
* the same radius as the outside radius of the ring.
*/
void ring_rextent(rp,re)
ring *rp;
rextent *re;
{
int i;
for (i = 0; i < 3; i++)
{
re->min[i] = rp->position[i] - rp->maxrad;
re->max[i] = rp->position[i] + rp->maxrad;
}
}
/*
* The bounding extent for a cylinder is a sphere
* in which the cylinder will fit
*/
void cyl_rextent(rp,re)
cylinder *rp;
rextent *re;
{
}