home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 2000 April & May / AMIGA_2000_04.iso / patches / mesa3.1 / test / trianglesdb.c < prev    next >
C/C++ Source or Header  |  1999-07-04  |  6KB  |  219 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. struct Window *window;
  46. amigaMesaContext context;
  47.  
  48. #define WIDTH    300
  49. #define HEIGHT   200
  50.  
  51. void handle_window_events(struct Window *window)
  52. {
  53.   struct IntuiMessage *msg;
  54.   int done = 0;
  55.  
  56.   while (!done) {
  57.     Wait(1L << window->UserPort->mp_SigBit);
  58.     while ((!done) && (msg = (struct IntuiMessage *)GetMsg(window->UserPort))) {
  59.       switch (msg->Class) {
  60.     case IDCMP_CLOSEWINDOW:
  61.       done = 1;
  62.     default:
  63.       break;
  64.       }
  65.       ReplyMsg((struct Message *)msg);
  66.     }
  67.   }
  68. }
  69.  
  70. void drawTriangles(amigaMesaContext context, int num)
  71. {
  72.   amigaMesaBuffer buffer = NULL;
  73.   int count;
  74.   struct timeval startTime, stopTime;
  75.   double secs;
  76.  
  77.   /* we have changed the context (maybe the buffer too, so
  78.    * make it the current again
  79.    */
  80.   amigaMesaGetContextTags(context, AMA_Buffer, &buffer, TAG_DONE);
  81.   if (buffer)
  82.     amigaMesaMakeCurrent(context, buffer);
  83.  
  84.   glEnable(GL_DEPTH_TEST);
  85.   glEnable(GL_DITHER);
  86.   glShadeModel(GL_SMOOTH);
  87.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  88.  
  89.   glMatrixMode(GL_PROJECTION);
  90.   glLoadIdentity();
  91.  
  92.   glOrtho(-400.0, 400.0, -300.0, 300.0, 500.0, -500.0);
  93.  
  94.   srand(42);
  95.  
  96.   gettimeofday(&startTime, NULL);
  97.   for (count = 0; count < num; count++) {
  98.     glBegin(GL_TRIANGLES);
  99.     glColor3ub(rand() % 256, rand() % 256, rand() % 256);
  100.     glVertex3i(rand() % 800 - 400, rand() % 600 - 300, rand() % 1000 - 500);
  101.     glColor3ub(rand() % 256, rand() % 256, rand() % 256);
  102.     glVertex3i(rand() % 800 - 400, rand() % 600 - 300, rand() % 1000 - 500);
  103.     glColor3ub(rand() % 256, rand() % 256, rand() % 256);
  104.     glVertex3i(rand() % 800 - 400, rand() % 600 - 300, rand() % 1000 - 500);
  105.     glEnd();
  106.   }
  107.   glFlush();
  108.   amigaMesaSwapBuffers(context);
  109.   gettimeofday(&stopTime, NULL);
  110.   
  111.   secs  = (double)stopTime.tv_micro  / 1000000 + stopTime.tv_secs ;
  112.   secs -= (double)startTime.tv_micro / 1000000 + startTime.tv_secs;
  113.   if (secs == 0.0)
  114.     secs = 0.1;
  115.  
  116.   printf("%g triangles/s (%g secs)\n", (double)num / secs, secs);
  117. }
  118.  
  119. void drawTrianglesIndexModes2(amigaMesaContext context, int num) {
  120.   amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_GREY_MATCH, TAG_DONE);
  121.   printf("   PaletteMode : grey\n");
  122.   drawTriangles(context, num);
  123.  
  124.   amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_TRUECOLOR_MATCH, TAG_DONE);
  125.   printf("   PaletteMode : color match\n");
  126.   drawTriangles(context, num);
  127.  
  128.   amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_WEIGHTED_MATCH, TAG_DONE);
  129.   printf("   PaletteMode : weighted color\n");
  130.   drawTriangles(context, num);
  131.  
  132.   amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_HPCR_MATCH, TAG_DONE);
  133.   printf("   PaletteMode : hpcr color\n");
  134.   drawTriangles(context, num);
  135. }
  136.  
  137. void drawTrianglesIndexModes1(amigaMesaContext context, int num) {
  138.   amigaMesaChangeContextTags(context, AMA_PaletteCache, GL_FALSE, TAG_DONE);
  139.   printf("  PaletteCache : off\n");
  140.   drawTrianglesIndexModes2(context, num);
  141.  
  142.   amigaMesaChangeContextTags(context, AMA_PaletteCache, GL_TRUE, TAG_DONE);
  143.   printf("  PaletteCache : on\n");
  144.   drawTrianglesIndexModes2(context, num);
  145. }
  146.  
  147. void drawTrianglesIndexModes0(amigaMesaContext context, int num) {
  148.   amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_TRUECOLOR_SHIFT, TAG_DONE);
  149.   printf(" PaletteDither : off\n");
  150.   printf("  PaletteCache : off\n");
  151.   printf("   PaletteMode : color shift\n");
  152.   drawTriangles(context, num);
  153.  
  154.   amigaMesaChangeContextTags(context, AMA_PaletteDither, GL_FALSE, TAG_DONE);
  155.   printf(" PaletteDither : off\n");
  156.   drawTrianglesIndexModes1(context, num);
  157.  
  158.   amigaMesaChangeContextTags(context, AMA_PaletteDither, GL_TRUE, TAG_DONE);
  159.   printf(" PaletteDither : on\n");
  160.   drawTrianglesIndexModes1(context, num);
  161. }
  162.  
  163. void drawTrianglesRGBAModes(amigaMesaContext context, int num) {
  164.   printf("   PaletteMode : off\n");
  165.   drawTriangles(context, num);
  166. }
  167.  
  168. void exitT(void) {
  169.   if (context)
  170.     amigaMesaDestroyContext(context);
  171.   if (window)
  172.     CloseWindow(window);
  173.   if (screen)
  174.     UnlockPubScreen(NULL, screen);
  175.   if (IntuitionBase)
  176.     CloseLibrary(IntuitionBase);
  177. }
  178.  
  179. int main(int argc, char **argv)
  180. {
  181.   atexit(exitT);
  182.  
  183.   if ((IntuitionBase = OpenLibrary("intuition.library", 1))) {
  184.     if (!(screen = LockPubScreen("Mesa")))
  185.       screen = LockPubScreen(NULL);
  186.     if ((window = OpenWindowTags(NULL,
  187.                  WA_InnerWidth, WIDTH,
  188.                  WA_InnerHeight, HEIGHT,
  189.                  WA_Title, "Triangles",
  190.                  WA_PubScreen, screen,
  191.                  WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_VANILLAKEY,
  192.                  WA_CloseGadget, TRUE,
  193.                  WA_DepthGadget, TRUE,
  194.                  WA_DragBar, TRUE,
  195.                  WA_Activate, TRUE,
  196.                  TAG_END))) {
  197.       if ((context = amigaMesaCreateContextTags(AMA_Window, window,
  198.                         AMA_RastPort, (unsigned long)window->RPort,
  199.                         AMA_Screen, (unsigned long)window->WScreen,
  200.                         AMA_Left, window->BorderLeft,
  201.                         AMA_Bottom, window->BorderBottom,
  202.                         AMA_Width, WIDTH,
  203.                         AMA_Height, HEIGHT,
  204.                         AMA_RGBMode, GL_TRUE,
  205.                         AMA_DoubleBuffer, GL_TRUE,
  206.                         TAG_END))) {
  207.     if (window->WScreen->RastPort.BitMap->Depth <= 8)
  208.       drawTrianglesIndexModes0(context, argc == 2 ? atoi(argv[1]) : 500);
  209.     else
  210.       drawTrianglesRGBAModes(context, argc == 2 ? atoi(argv[1]) : 500);
  211.  
  212.     handle_window_events(window);
  213.       }
  214.     }
  215.   }
  216.   
  217.   return 0;
  218. }
  219.