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.