/* Affiche toutes les faces visibles d'un objet spécifié, basé sur des polygones. L'objet doit avoir été au préalable transformé et projeté, afin que le tableau ScreenVertexList soit rempli. Testé avec Borland C++ 4.02 en modèle small par Jim Mischel 12/16/94. */ #include "polygon.h" void DrawPObject(PObject * ObjectToXform) { int i, j, NumFaces = ObjectToXform->NumFaces, NumVertices; int * VertNumsPtr; Face * FacePtr = ObjectToXform->FaceList; Point * ScreenPoints = ObjectToXform->ScreenVertexList; long v1, v2, w1, w2; Point Vertices[MAX_POLY_LENGTH]; PointListHeader Polygon; /* Affiche l'une après l'autre chaque face visible (polygone) de l'objet */ for (i=0; iNumVerts; /* Copie les points d'une face dans la liste des points */ for (j=0, VertNumsPtr=FacePtr->VertNums; j 0) { /*Elle est face à l'écran, affichons */ /* Ajuste la superficie du rectangle utilisé pour effacer cet objet ultérieurement */ for (j=0; j ObjectToXform->EraseRect[NonDisplayedPage].Right) if (Vertices[j].X < SCREEN_WIDTH) ObjectToXform->EraseRect[NonDisplayedPage].Right = Vertices[j].X; else ObjectToXform->EraseRect[NonDisplayedPage].Right = SCREEN_WIDTH; if (Vertices[j].Y > ObjectToXform->EraseRect[NonDisplayedPage].Bottom) if (Vertices[j].Y < SCREEN_HEIGHT) ObjectToXform->EraseRect[NonDisplayedPage].Bottom = Vertices[j].Y; else ObjectToXform->EraseRect[NonDisplayedPage].Bottom= SCREEN_HEIGHT; if (Vertices[j].X < ObjectToXform->EraseRect[NonDisplayedPage].Left) if (Vertices[j].X > 0) ObjectToXform->EraseRect[NonDisplayedPage].Left = Vertices[j].X; else ObjectToXform->EraseRect[NonDisplayedPage].Left=0; if (Vertices[j].Y < ObjectToXform->EraseRect[NonDisplayedPage].Top) if (Vertices[j].Y > 0) ObjectToXform->EraseRect[NonDisplayedPage].Top = Vertices[j].Y; else ObjectToXform->EraseRect[NonDisplayedPage].Top=0; } /* Affiche le polygone */ DRAW_POLYGON(Vertices, NumVertices, FacePtr->Color, 0, 0); } } }