/* Transforme tous les points des polygones d'un objet spécifié dans l'espace de visualisation, puis les projette en perspective dans l'espace écran et leurs assigne des coordonnées écran, stockant le résultat dans l'objet. Recalcule la transformation objet->visualisation seulement si la transformation change. Testé avec Borland C++ 4.02 en modèle small par Jim Mischel 12/16/94. */ #include #include "polygon.h" void XformAndProjectPObject(PObject * ObjectToXform) { int i, NumPoints = ObjectToXform->NumVerts; Point3 * Points = ObjectToXform->VertexList; Point3 * XformedPoints = ObjectToXform->XformedVertexList; Point3 * ProjectedPoints = ObjectToXform->ProjectedVertexList; Point * ScreenPoints = ObjectToXform->ScreenVertexList; /* Recalcule la transformation objet->visualisation */ ConcatXforms(WorldViewXform, ObjectToXform->XformToWorld, ObjectToXform->XformToView); /* Applique cette nouvelle transformation et projette les points */ for (i=0; iXformToView, (Fixedpoint *) Points, (Fixedpoint *) XformedPoints); /* Projette en perspective vers l'espace écran */ ProjectedPoints->X = FixedMul(FixedDiv(XformedPoints->X, XformedPoints->Z), DOUBLE_TO_FIXED(PROJECTION_RATIO * (SCREEN_WIDTH/2))); ProjectedPoints->Y = FixedMul(FixedDiv(XformedPoints->Y, XformedPoints->Z), DOUBLE_TO_FIXED(PROJECTION_RATIO * (SCREEN_WIDTH/2))); ProjectedPoints->Z = XformedPoints->Z; /* Convertit en coordonnées écran. La coordonnée Y devient négative pour passer des Y croissants lorsque l'on monte au Y croissants lorsque l'on descend, comme le veut le remplisseur de polygone. Ajoute la moitié de la largeur et de la hauteur de l'écran pour centrer sur l'écran */ ScreenPoints->X = ((int) ((ProjectedPoints->X + DOUBLE_TO_FIXED(0.5)) >> 16)) + SCREEN_WIDTH/2; ScreenPoints->Y = (-((int) ((ProjectedPoints->Y + DOUBLE_TO_FIXED(0.5)) >> 16))) + SCREEN_HEIGHT/2; } }