home *** CD-ROM | disk | FTP | other *** search
- /* Transforms convex polygon Poly (which has PolyLength vertices),
- performing the transformation according to Xform (which generally
- represents a transformation from object space through world space
- to view space), then projects the transformed polygon onto the
- screen and draws it in color Color. Also updates the extent of the
- rectangle (EraseRect) that's used to erase the screen later.
- Tested with Borland C++ 4.02 in small model by Jim Mischel 12/16/94.
- */
- #include "polygon.h"
-
- void XformAndProjectPoly(double Xform[4][4], struct Point3 * Poly,
- int PolyLength, int Color)
- {
- int i;
- struct Point3 XformedPoly[MAX_POLY_LENGTH];
- struct Point ProjectedPoly[MAX_POLY_LENGTH];
- struct PointListHeader Polygon;
-
- /* Transform to view space, then project to the screen */
- for (i=0; i<PolyLength; i++) {
- /* Transform to view space */
- XformVec(Xform, (double *)&Poly[i], (double *)&XformedPoly[i]);
- /* Project the X & Y coordinates to the screen, rounding to the
- nearest integral coordinates. The Y coordinate is negated to
- flip from view space, where increasing Y is up, to screen
- space, where increasing Y is down. Add in half the screen
- width and height to center on the screen */
- ProjectedPoly[i].X = ((int) (XformedPoly[i].X/XformedPoly[i].Z *
- PROJECTION_RATIO*(SCREEN_WIDTH/2.0)+0.5))+SCREEN_WIDTH/2;
- ProjectedPoly[i].Y = ((int) (XformedPoly[i].Y/XformedPoly[i].Z *
- -1.0 * PROJECTION_RATIO * (SCREEN_WIDTH / 2.0) + 0.5)) +
- SCREEN_HEIGHT/2;
- /* Appropriately adjust the extent of the rectangle used to
- erase this page later */
- if (ProjectedPoly[i].X > EraseRect[NonDisplayedPage].Right)
- if (ProjectedPoly[i].X < SCREEN_WIDTH)
- EraseRect[NonDisplayedPage].Right = ProjectedPoly[i].X;
- else EraseRect[NonDisplayedPage].Right = SCREEN_WIDTH;
- if (ProjectedPoly[i].Y > EraseRect[NonDisplayedPage].Bottom)
- if (ProjectedPoly[i].Y < SCREEN_HEIGHT)
- EraseRect[NonDisplayedPage].Bottom = ProjectedPoly[i].Y;
- else EraseRect[NonDisplayedPage].Bottom = SCREEN_HEIGHT;
- if (ProjectedPoly[i].X < EraseRect[NonDisplayedPage].Left)
- if (ProjectedPoly[i].X > 0)
- EraseRect[NonDisplayedPage].Left = ProjectedPoly[i].X;
- else EraseRect[NonDisplayedPage].Left = 0;
- if (ProjectedPoly[i].Y < EraseRect[NonDisplayedPage].Top)
- if (ProjectedPoly[i].Y > 0)
- EraseRect[NonDisplayedPage].Top = ProjectedPoly[i].Y;
- else EraseRect[NonDisplayedPage].Top = 0;
- }
- /* Draw the polygon */
- DRAW_POLYGON(ProjectedPoly, PolyLength, Color, 0, 0);
- }
-