home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 2000 April & May / AMIGA_2000_04.iso / patches / mesa3.1 / test / triangless.c < prev   
C/C++ Source or Header  |  1999-07-04  |  5KB  |  188 lines

  1. /*
  2.  * triangles.c
  3.  *
  4.  * Modified  27 Jun 1998
  5.  * by Jarno van der Linden
  6.  * jarno@kcbbs.gen.nz
  7.  *
  8.  * Based on triangles.c from CyberGL
  9.  * Changes to work with AmigaMesaRTL
  10.  *
  11.  * Original copyright notice follows:
  12.  */
  13.  
  14. /*
  15.  *   $VER: triangles.c 1.0 (20.03.1997)
  16.  *
  17.  *   This is an example program for CyberGL
  18.  *
  19.  *      Written by Frank Gerberding
  20.  *
  21.  *   Copyright © 1996-1997 by phase5 digital products
  22.  *      All Rights reserved.
  23.  *
  24.  */
  25.  
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <math.h>
  29. //#include <sys/time.h>
  30.  
  31. #include <intuition/intuition.h>
  32.  
  33. #include <inline/exec.h>
  34. #include <inline/graphics.h>
  35. #include <inline/intuition.h>
  36.  
  37. #include <GL/amigamesa.h>
  38. #include <GL/gl.h>
  39. #include <GL/glu.h>
  40.  
  41. extern struct ExecBase *SysBase;
  42. extern struct DOSBase *DOSBase;
  43. struct Library *IntuitionBase;
  44. struct Screen *screen;
  45. amigaMesaContext context;
  46.  
  47. #define WIDTH    300
  48. #define HEIGHT   200
  49.  
  50. void drawTriangles(amigaMesaContext context, int num)
  51. {
  52.   amigaMesaBuffer buffer = NULL;
  53.   int count;
  54.   struct timeval startTime, stopTime;
  55.   double secs;
  56.  
  57.   /* we have changed the context (maybe the buffer too, so
  58.    * make it the current again
  59.    */
  60.   amigaMesaGetContextTags(context, AMA_Buffer, &buffer, TAG_DONE);
  61.   if (buffer)
  62.     amigaMesaMakeCurrent(context, buffer);
  63.  
  64.   glEnable(GL_DEPTH_TEST);
  65.   glEnable(GL_DITHER);
  66.   glShadeModel(GL_SMOOTH);
  67.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  68.  
  69.   glMatrixMode(GL_PROJECTION);
  70.   glLoadIdentity();
  71.  
  72.   glOrtho(-400.0, 400.0, -300.0, 300.0, 500.0, -500.0);
  73.  
  74.   srand(42);
  75.  
  76.   gettimeofday(&startTime, NULL);
  77.   for (count = 0; count < num; count++) {
  78.     glBegin(GL_TRIANGLES);
  79.     glColor3ub(rand() % 256, rand() % 256, rand() % 256);
  80.     glVertex3i(rand() % 800 - 400, rand() % 600 - 300, rand() % 1000 - 500);
  81.     glColor3ub(rand() % 256, rand() % 256, rand() % 256);
  82.     glVertex3i(rand() % 800 - 400, rand() % 600 - 300, rand() % 1000 - 500);
  83.     glColor3ub(rand() % 256, rand() % 256, rand() % 256);
  84.     glVertex3i(rand() % 800 - 400, rand() % 600 - 300, rand() % 1000 - 500);
  85.     glEnd();
  86.   }
  87.   glFlush();
  88.   gettimeofday(&stopTime, NULL);
  89.   
  90.   secs  = (double)stopTime.tv_micro  / 1000000 + stopTime.tv_secs ;
  91.   secs -= (double)startTime.tv_micro / 1000000 + startTime.tv_secs;
  92.   if (secs == 0.0)
  93.     secs = 0.1;
  94.  
  95.   printf("%g triangles/s (%g secs)\n", (double)num / secs, secs);
  96. }
  97.  
  98. void drawTrianglesIndexModes2(amigaMesaContext context, int num) {
  99.   amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_GREY_MATCH, TAG_DONE);
  100.   printf("   PaletteMode : grey\n");
  101.   drawTriangles(context, num);
  102.  
  103.   amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_TRUECOLOR_MATCH, TAG_DONE);
  104.   printf("   PaletteMode : color match\n");
  105.   drawTriangles(context, num);
  106.  
  107.   amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_WEIGHTED_MATCH, TAG_DONE);
  108.   printf("   PaletteMode : weighted color\n");
  109.   drawTriangles(context, num);
  110.  
  111.   amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_HPCR_MATCH, TAG_DONE);
  112.   printf("   PaletteMode : hpcr color\n");
  113.   drawTriangles(context, num);
  114. }
  115.  
  116. void drawTrianglesIndexModes1(amigaMesaContext context, int num) {
  117.   amigaMesaChangeContextTags(context, AMA_PaletteCache, GL_FALSE, TAG_DONE);
  118.   printf("  PaletteCache : off\n");
  119.   drawTrianglesIndexModes2(context, num);
  120.  
  121.   amigaMesaChangeContextTags(context, AMA_PaletteCache, GL_TRUE, TAG_DONE);
  122.   printf("  PaletteCache : on\n");
  123.   drawTrianglesIndexModes2(context, num);
  124. }
  125.  
  126. void drawTrianglesIndexModes0(amigaMesaContext context, int num) {
  127.   amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_TRUECOLOR_SHIFT, TAG_DONE);
  128.   printf(" PaletteDither : off\n");
  129.   printf("  PaletteCache : off\n");
  130.   printf("   PaletteMode : color shift\n");
  131.   drawTriangles(context, num);
  132.  
  133.   amigaMesaChangeContextTags(context, AMA_PaletteDither, GL_FALSE, TAG_DONE);
  134.   printf(" PaletteDither : off\n");
  135.   drawTrianglesIndexModes1(context, num);
  136.  
  137.   amigaMesaChangeContextTags(context, AMA_PaletteDither, GL_TRUE, TAG_DONE);
  138.   printf(" PaletteDither : on\n");
  139.   drawTrianglesIndexModes1(context, num);
  140. }
  141.  
  142. void drawTrianglesRGBAModes(amigaMesaContext context, int num) {
  143.   printf("   PaletteMode : off\n");
  144.   drawTriangles(context, num);
  145. }
  146.  
  147. void exitT(void) {
  148.   if (context)
  149.     amigaMesaDestroyContext(context);
  150.   if (screen)
  151.     CloseScreen(screen);
  152.   if (IntuitionBase)
  153.     CloseLibrary(IntuitionBase);
  154. }
  155.  
  156. int main(int argc, char **argv)
  157. {
  158.   atexit(exitT);
  159.  
  160.   if ((IntuitionBase = OpenLibrary("intuition.library", 1))) {
  161.     if ((screen = OpenScreenTags(NULL,
  162.                  SA_Width, WIDTH,
  163.                  SA_Height, HEIGHT,
  164.                  SA_Depth, 8,
  165.                  SA_SysFont, 1,
  166.                  SA_Type, PUBLICSCREEN,
  167.                  SA_ShowTitle, TRUE,
  168.                  SA_PubName, "Triangles",
  169.                  SA_Title, "Triangles",
  170.                  TAG_END))) {
  171.       if ((context = amigaMesaCreateContextTags(AMA_RastPort, (ULONG)&screen->RastPort,
  172.                         AMA_Screen, (ULONG)screen,
  173.                         AMA_Top, screen->BarHeight + 1,
  174.                         AMA_Width, WIDTH,
  175.                         AMA_Height, HEIGHT,
  176.                         AMA_RGBMode, GL_TRUE,
  177.                         TAG_END))) {
  178.     if (screen->RastPort.BitMap->Depth <= 8)
  179.       drawTrianglesIndexModes0(context, argc == 2 ? atoi(argv[1]) : 500);
  180.     else
  181.       drawTrianglesRGBAModes(context, argc == 2 ? atoi(argv[1]) : 500);
  182.       }
  183.     }
  184.   }
  185.   
  186.   return 0;
  187. }
  188.