/* Programme d'animation 3D affichant 12 cubes en rotation. Utilise la virgule fixe. Testé avec Borland C++ 4.02 en modèle small par Jim Mischel 12/16/94. */ #include #include #include "polygon.h" /* Offset de base de la page dans laquelle afficher */ unsigned int CurrentPageBase = 0; /* Rectangle de clipping; clippe l'écran */ int ClipMinX = 0, ClipMinY = 0; int ClipMaxX = SCREEN_WIDTH, ClipMaxY = SCREEN_HEIGHT; static unsigned int PageStartOffsets[2] = {PAGE0_START_OFFSET,PAGE1_START_OFFSET}; int DisplayedPage, NonDisplayedPage; int RecalcAllXforms = 1, NumObjects = 0; Xform WorldViewXform; /* initialisé avec les valeurs flottantes */ /* Pointeurs sur les objets */ Object *ObjectList[MAX_OBJECTS]; void main() { int Done = 0, i; Object *ObjectPtr; union REGS regset; InitializeFixedPoint(); /* paramètre les données en virgule fixe */ InitializeCubes(); /* configure les cubes et les ajoutes dans la liste des objets; les autres objets, s'il y en a, devraient être initialisés maintenant */ Set320x240Mode(); /* configure l'écran en mode X */ ShowPage(PageStartOffsets[DisplayedPage = 0]); /* La transformation du cube se poursuit, en le traçant dans la page offscreen. et en permutant la page pour l'afficher */ do { /* Pour chaque objet, régénère l'info de visualisation, si nécessaire */ for (i=0; iRecalcXform || RecalcAllXforms) { ObjectPtr->RecalcFunc(ObjectPtr); ObjectPtr->RecalcXform = 0; } } RecalcAllXforms = 0; CurrentPageBase = /* sélectionne une autre page pour afficher */ PageStartOffsets[NonDisplayedPage = DisplayedPage ^ 1]; /* Pour chaque objet, vide la partie de la page offscreen qui a été affichée en dernier, puis réinitialise la superficie à effacer */ for (i=0; iEraseRect[NonDisplayedPage].Left, ObjectPtr->EraseRect[NonDisplayedPage].Top, ObjectPtr->EraseRect[NonDisplayedPage].Right, ObjectPtr->EraseRect[NonDisplayedPage].Bottom, CurrentPageBase, 0); ObjectPtr->EraseRect[NonDisplayedPage].Left = ObjectPtr->EraseRect[NonDisplayedPage].Top = 0x7FFF; ObjectPtr->EraseRect[NonDisplayedPage].Right = ObjectPtr->EraseRect[NonDisplayedPage].Bottom = 0; } /* Affiche tous les objets */ for (i=0; iDrawFunc(ObjectList[i]); /* Permute pour afficher la page dans laquelle nous venons d'afficher */ ShowPage(PageStartOffsets[DisplayedPage = NonDisplayedPage]); /* Déplace et réoriente chaque objet */ for (i=0; iMoveFunc(ObjectList[i]); if (kbhit()) if (getch() == 0x1B) Done = 1; /* Esc pour quitter */ } while (!Done); /* Return to text mode and exit */ regset.x.ax = 0x0003; /* AL = 3 sélectionne le mode texte 80x25 */ int86(0x10, ®set, ®set); exit(1); }