This is plcombine.c in view mode; [Download] [Up]
/* * plcombine.c * author: Celeste Fowler * date: June 12, 1992 */ #include <stdlib.h> #include "polylistP.h" #include "hpoint3.h" #include "point3.h" #include "plutil.h" static char msg[] = "plcombine.c"; /* * PolyList combiner. * A minor sideshow. If a and b differ in some fundamental way in terms * of per vertex / per face colors / normals, the colors / normals will * be eliminated in the result. If one polylist is three-d and the other * is four-d, the result will be three-d */ Geom *PLCombine(Geom *a1, Geom *b1) { PolyList *a = (PolyList *)a1, *b = (PolyList *)b1; int i, j, k; HPoint3 *point4; ColorA *color, *polycolor; Point3 *normal, *polynormal; int *vert, nvertices, *nvert; Vertex *maxverta = NULL, *maxvertb = NULL; Geom *new; int flags, fourd = 0; if (a == NULL) return(GeomCopy((Geom *)b)); if (b == NULL) return(GeomCopy((Geom *)a)); if (strcmp(GeomName(a1), "polylist") || strcmp(GeomName(b1), "polylist")) OOGLError(0, "Arguements to PLCombine() not of polylist type."); nvertices = a->n_verts + b->n_verts; /* Copy points, normals, colors. */ point4 = (HPoint3 *)OOG_NewE(nvertices * sizeof(HPoint3), msg); color = (ColorA *)OOG_NewE(nvertices * sizeof(ColorA), msg); normal = (Point3 *)OOG_NewE(nvertices * sizeof(Point3), msg); for (i = 0; i < a->n_verts; i++) { HPt3Copy(&a->vl[i].pt, &point4[i]); bcopy(&a->vl[i].vcol, &color[i], sizeof(ColorA)); Pt3Copy(&a->vl[i].vn, &normal[i]); } for (i = 0; i < b->n_verts; i++) { HPt3Copy(&b->vl[i].pt, &point4[a->n_verts + i]); bcopy(&b->vl[i].vcol, &color[a->n_verts + i], sizeof(ColorA)); Pt3Copy(&b->vl[i].vn, &normal[a->n_verts + i]); } /* Create polygons */ nvert = (int *)OOG_NewE((a->n_polys + b->n_polys) * sizeof(int), msg); polycolor = (ColorA *)OOG_NewE((a->n_polys + b->n_polys) * sizeof(ColorA), msg); polynormal = (Point3 *)OOG_NewE((a->n_polys + b->n_polys) * sizeof(Point3), msg); for (i = j = 0; i < a->n_polys; i++) j += a->p[i].n_vertices; for (i = 0; i < b->n_polys; i++) j += b->p[i].n_vertices; vert = (int *)OOG_NewE(j * sizeof(int), msg); for (i = k = 0; i < a->n_polys; i++) { nvert[i] = a->p[i].n_vertices; bcopy(&a->p[i].pcol, &polycolor[i], sizeof(ColorA)); Pt3Copy(&a->p[i].pn, &polynormal[i]); for (j = 0; j < a->p[i].n_vertices; j++) vert[k++] = a->p[i].v[j] - a->vl; } for (i = 0; i < b->n_polys; i++) { nvert[a->n_polys + i] = b->p[i].n_vertices; bcopy(&b->p[i].pcol, &polycolor[a->n_polys + i], sizeof(ColorA)); Pt3Copy(&b->p[i].pn, &polynormal[a->n_polys + i]); for (j = 0; j < b->p[i].n_vertices; j++) vert[k++] = a->n_verts + b->p[i].v[j] - b->vl; } flags = a->flags; fourd = (a->geomflags & VERT_4D) ? 1 : 0; if ((a->flags & PL_HASVCOL) && !(b->flags & PL_HASVCOL)) { if (b->flags & PL_HASPCOL) { for (i = 0; i < a->n_polys; i++) bcopy(&a->p[i].v[0]->vcol, &polycolor[i], sizeof(ColorA)); flags ^= PL_HASVCOL; flags |= PL_HASPCOL; } else for (i = 0; i < b->n_verts; i++) { color[a->n_verts + i].r = color[a->n_verts + i].g = color[a->n_verts + i].b = 0.15; color[a->n_verts + i].a = 1.0; } } if ((a->flags & PL_HASPCOL) && !(b->flags & PL_HASPCOL)) { if (b->flags & PL_HASVCOL) { for (i = 0; i < b->n_polys; i++) bcopy(&b->p[i].v[0]->vcol, &polycolor[a->n_polys + i], sizeof(ColorA)); } else for (i = 0; i < b->n_polys; i++) { polycolor[a->n_polys + i].r = polycolor[a->n_polys + i].g = polycolor[a->n_polys + i].b = 0.15; polycolor[a->n_polys + i].a = 1.0; } } if (!(flags & PL_HASVCOL) && !(flags & PL_HASPCOL)) { if (b->flags & PL_HASPCOL) { for (i = 0; i < a->n_polys; i++) { polycolor[i].r = polycolor[i].g = polycolor[i].b = 0.15; polycolor[i].a = 1.0; } flags |= PL_HASPCOL; } if (b->flags & PL_HASVCOL) { for (i = 0; i < a->n_verts; i++) { color[i].r = color[i].g = color[i].b = 0.15; color[i].a = 1.0; } flags |= PL_HASVCOL; } } if ((a->flags & PL_HASVN) && !(b->flags & PL_HASVN)) flags ^= PL_HASVN; if ((a->flags & PL_HASPN) && !(b->flags & PL_HASPN)) flags ^= PL_HASPN; if ((a->geomflags & VERT_4D) && !(b->geomflags & VERT_4D)) fourd = 0; new = GeomCreate("polylist", CR_NPOLY, a->n_polys + b->n_polys, CR_POINT4, point4, CR_NORMAL, normal, CR_COLOR, color, CR_NVERT, nvert, CR_VERT, vert, CR_POLYNORMAL, polynormal, CR_POLYCOLOR, polycolor, CR_FLAG, flags, CR_4D, fourd, CR_END); OOGLFree(point4); OOGLFree(color); OOGLFree(normal); OOGLFree(nvert); OOGLFree(polycolor); OOGLFree(polynormal); OOGLFree(vert); return(new); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.