This is polyhedron.c in view mode; [Download] [Up]
/*
* polyhedron.c: routines which operate on the polyhedron data structure
*/
/*
*/
#include "geom.h"
#include "geomclass.h"
#include "polylistP.h"
#include "ooglutil.h"
#include "point.h"
#include "winged_edge.h"
#include "extern.h"
Geom *
WEPolyhedronToVect(poly, origin)
WEpolyhedron *poly;
HPoint3 origin;
{
int i, k, ii, jj;
Geom *orbit;
HPoint3 gorigin;
static HPoint3 origin2 = {0,0,0,1};
WEface *fptr;
Transform T;
short *vnvert;
short *vncolor;
HPoint3 *p;
ColorA *c;
vnvert = OOGLNewN(short, poly->num_faces);
vncolor = OOGLNewN(short, poly->num_faces);
p = OOGLNewN(HPoint3, 2*poly->num_faces);
c = OOGLNewN(ColorA, poly->num_faces);
for (k = 0, i=0, fptr=poly->face_list; i<poly->num_faces;
++i, fptr = fptr->next)
{
vnvert[i] = 2; /* line segment! */
vncolor[i] = 1;
/* next two lines assume the indices in two sorts of groups match */
c[i] = GetCmapEntry( fptr->fill_tone);
for (ii=0; ii<4; ++ii) for (jj=0; jj<4; ++jj)
/* fptr's tforms are transposed! */
T[jj][ii] = fptr->group_element[ii][jj];
HPt3Transform( T, &origin, &gorigin);
p[2*i] = origin;
p[2*i+1] = gorigin;
}
orbit = GeomCreate("vect",
CR_NOCOPY,
CR_NVECT, poly->num_faces,
CR_NVERT, 2*poly->num_faces,
CR_NCOLR, poly->num_faces,
CR_VECTC, vnvert,
CR_COLRC, vncolor,
CR_POINT4, p,
CR_COLOR, c,
CR_4D, 1,
CR_END);
return(orbit);
}
static ColorA white = {1,1,1,1};
Geom *
WEPolyhedronToPolyList(poly)
WEpolyhedron *poly;
{
ColorA *colors = NULL;
HPoint3 *points = NULL;
int *nvert = NULL;
int *vindex = NULL;
WEvertex *vptr;
WEedge *eptr;
WEface *fptr;
int cnt, cnt2, total;
Geom *plist;
points = OOGLNewN(HPoint3, poly->num_vertices);
colors = OOGLNewN(ColorA,poly->num_faces);
nvert = OOGLNewN(int, poly->num_faces);
vptr = poly->vertex_list;
cnt = 0;
do {
points[cnt].x = vptr->x[0];
points[cnt].y = vptr->x[1];
points[cnt].z = vptr->x[2];
points[cnt].w = vptr->x[3];
vptr->ideal = cnt++;
vptr = vptr->next;
} while (vptr != NULL);
cnt = 0;
fptr = poly->face_list;
total = 0;
do {
colors[cnt] = GetCmapEntry(fptr->fill_tone);
nvert[cnt] = fptr->order;
total += nvert[cnt++];
fptr = fptr->next;
} while (fptr != NULL);
vindex = OOGLNewN(int, total);
cnt = 0;
fptr = poly->face_list;
do {
eptr = fptr->some_edge;
cnt2 = 0;
do {
if (eptr->fL == fptr) {
vindex[cnt+cnt2] = eptr->v0->ideal;
cnt2++;
eptr = eptr->e1L;
} else {
vindex[cnt+cnt2] = eptr->v1->ideal;
cnt2++;
eptr = eptr->e0R;
}
} while (eptr != fptr->some_edge);
cnt+= fptr->order;
fptr = fptr->next; }
while (fptr != NULL);
plist =
GeomCreate("polylist",
/*CR_NOCOPY, isn't supported for polylists! */
CR_4D, 1,
CR_NPOLY, poly->num_faces,
CR_NVERT, nvert,
CR_VERT, vindex,
CR_POINT4, points,
CR_POLYCOLOR, colors,
CR_FLAG, PL_HASPCOL, /* put this here or meet a bug libpolylist */
CR_END);
return(plist);
}
Geom *
WEPolyhedronToBeams( WEpolyhedron *poly, float alpha)
{
WEedge *eptr;
WEvertex *vptr;
Geom *beams;
HPoint3 *points, p0, p1, v0, v1;
ColorA *colors;
int *nvert, *vindex, vcnt, fcnt;
float omega;
static ColorA white = {1,1,1,1};
points = OOGLNewN(HPoint3, 4 * poly->num_edges);
colors = OOGLNewN(ColorA, poly->num_edges);
nvert = OOGLNewN(int, poly->num_edges);
vindex = OOGLNewN(int, 4*poly->num_edges);
omega = 1.0 - alpha;
vcnt = fcnt = 0;
eptr = poly->edge_list;
#define CCOPY( d4, hpt3) \
(hpt3)->x = d4[0]; \
(hpt3)->y = d4[1]; \
(hpt3)->z = d4[2]; \
(hpt3)->w = d4[3];
do {
CCOPY( eptr->v0->x, &v0);
if (eptr->e0L->v0 = eptr->v0) vptr = eptr->e0L->v1;
else vptr = eptr->e0L->v0;
CCOPY( vptr->x, &v1);
HPt3Scale(omega, &v0, &p0);
HPt3Scale(alpha, &v1, &p1);
HPt3Add(&p0, &p1, &points[vcnt]);
vindex[vcnt] = vcnt;
vcnt++;
if (eptr->fR == eptr->e0R->fR)
if (eptr->e0R->v0 = eptr->v0) vptr = eptr->e0R->v1;
else vptr = eptr->e0R->v0;
else
if (eptr->e0L->v0 = eptr->v0) vptr = eptr->e0L->v1;
else vptr = eptr->e0L->v0;
CCOPY( vptr->x, &v1);
HPt3Scale(alpha, &v1, &p1);
HPt3Add(&p0, &p1, &points[vcnt]);
vindex[vcnt] = vcnt;
vcnt++;
CCOPY( eptr->v1->x, &v0);
if (eptr->e1R->v0 = eptr->v1) vptr = eptr->e1R->v1;
else vptr = eptr->e1R->v0;
CCOPY( vptr->x, &v1);
HPt3Scale(omega, &v0, &p0);
HPt3Scale(alpha, &v1, &p1);
HPt3Add(&p0, &p1, &points[vcnt]);
vindex[vcnt] = vcnt;
vcnt++;
if (eptr->e1L->v0 = eptr->v1) vptr = eptr->e1L->v1;
else vptr = eptr->e1L->v0;
CCOPY( vptr->x, &v1);
HPt3Scale(alpha, &v1, &p1);
HPt3Add(&p0, &p1, &points[vcnt]);
vindex[vcnt] = vcnt;
vcnt++;
colors[fcnt] = white;
nvert[fcnt] = 4;
fcnt++;
eptr = eptr->next;
}
while (eptr != NULL);
beams = GeomCreate("polylist",
CR_NPOLY, poly->num_edges,
CR_NVERT, nvert,
CR_VERT, vindex,
CR_POINT4, points,
CR_POLYCOLOR, colors,
CR_FLAG, PL_HASPCOL, /* put this here or meet a bug libpolyli
st */
CR_END);
return(beams);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.