/* Affiche toutes les faces visibles (faces pointant vers l'observateur) de l'objet spécifié. 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 DrawVisibleFaces(struct Object * ObjectToXform) { int i, j, NumFaces = ObjectToXform->NumFaces, NumVertices; int * VertNumsPtr; struct Face * FacePtr = ObjectToXform->FaceList; struct Point * ScreenPoints = ObjectToXform->ScreenVertexList; long v1,v2,w1,w2; struct Point Vertices[MAX_POLY_LENGTH]; struct PointListHeader Polygon; /* Affiche l'une après l'autre chaque face visible(polygone) de l'objet */ for (i=0; iNumVerts; /* Copie les points de la 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 cette page ultérieurement */ for (j=0; j EraseRect[NonDisplayedPage].Right) if (Vertices[j].X < SCREEN_WIDTH) EraseRect[NonDisplayedPage].Right = Vertices[j].X; else EraseRect[NonDisplayedPage].Right = SCREEN_WIDTH; if (Vertices[j].Y > EraseRect[NonDisplayedPage].Bottom) if (Vertices[j].Y < SCREEN_HEIGHT) EraseRect[NonDisplayedPage].Bottom = Vertices[j].Y; else EraseRect[NonDisplayedPage].Bottom=SCREEN_HEIGHT; if (Vertices[j].X < EraseRect[NonDisplayedPage].Left) if (Vertices[j].X > 0) EraseRect[NonDisplayedPage].Left = Vertices[j].X; else EraseRect[NonDisplayedPage].Left = 0; if (Vertices[j].Y < EraseRect[NonDisplayedPage].Top) if (Vertices[j].Y > 0) EraseRect[NonDisplayedPage].Top = Vertices[j].Y; else EraseRect[NonDisplayedPage].Top = 0; } /* Affiche le polygone */ DRAW_POLYGON(Vertices, NumVertices, FacePtr->Color, 0, 0); } } }