home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 2000 April & May / AMIGA_2000_04.iso / patches / mesa3.1 / test / triangles.c < prev    next >
C/C++ Source or Header  |  1999-07-04  |  6KB  |  217 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.   gettimeofday(&stopTime, NULL);
  109.   
  110.   secs  = (double)stopTime.tv_micro  / 1000000 + stopTime.tv_secs ;
  111.   secs -= (double)startTime.tv_micro / 1000000 + startTime.tv_secs;
  112.   if (secs == 0.0)
  113.     secs = 0.1;
  114.  
  115.   printf("%g triangles/s (%g secs)\n", (double)num / secs, secs);
  116. }
  117.  
  118. void drawTrianglesIndexModes2(amigaMesaContext context, int num) {
  119.   amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_GREY_MATCH, TAG_DONE);
  120.   printf("   PaletteMode : grey\n");
  121.   drawTriangles(context, num);
  122.  
  123.   amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_TRUECOLOR_MATCH, TAG_DONE);
  124.   printf("   PaletteMode : color match\n");
  125.   drawTriangles(context, num);
  126.  
  127.   amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_WEIGHTED_MATCH, TAG_DONE);
  128.   printf("   PaletteMode : weighted color\n");
  129.   drawTriangles(context, num);
  130.  
  131.   amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_HPCR_MATCH, TAG_DONE);
  132.   printf("   PaletteMode : hpcr color\n");
  133.   drawTriangles(context, num);
  134. }
  135.  
  136. void drawTrianglesIndexModes1(amigaMesaContext context, int num) {
  137.   amigaMesaChangeContextTags(context, AMA_PaletteCache, GL_FALSE, TAG_DONE);
  138.   printf("  PaletteCache : off\n");
  139.   drawTrianglesIndexModes2(context, num);
  140.  
  141.   amigaMesaChangeContextTags(context, AMA_PaletteCache, GL_TRUE, TAG_DONE);
  142.   printf("  PaletteCache : on\n");
  143.   drawTrianglesIndexModes2(context, num);
  144. }
  145.  
  146. void drawTrianglesIndexModes0(amigaMesaContext context, int num) {
  147.   amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_TRUECOLOR_SHIFT, TAG_DONE);
  148.   printf(" PaletteDither : off\n");
  149.   printf("  PaletteCache : off\n");
  150.   printf("   PaletteMode : color shift\n");
  151.   drawTriangles(context, num);
  152.  
  153.   amigaMesaChangeContextTags(context, AMA_PaletteDither, GL_FALSE, TAG_DONE);
  154.   printf(" PaletteDither : off\n");
  155.   drawTrianglesIndexModes1(context, num);
  156.  
  157.   amigaMesaChangeContextTags(context, AMA_PaletteDither, GL_TRUE, TAG_DONE);
  158.   printf(" PaletteDither : on\n");
  159.   drawTrianglesIndexModes1(context, num);
  160. }
  161.  
  162. void drawTrianglesRGBAModes(amigaMesaContext context, int num) {
  163.   printf("   PaletteMode : off\n");
  164.   drawTriangles(context, num);
  165. }
  166.  
  167. void exitT(void) {
  168.   if (context)
  169.     amigaMesaDestroyContext(context);
  170.   if (window)
  171.     CloseWindow(window);
  172.   if (screen)
  173.     UnlockPubScreen(NULL, screen);
  174.   if (IntuitionBase)
  175.     CloseLibrary(IntuitionBase);
  176. }
  177.  
  178. int main(int argc, char **argv)
  179. {
  180.   atexit(exitT);
  181.  
  182.   if ((IntuitionBase = OpenLibrary("intuition.library", 1))) {
  183.     if (!(screen = LockPubScreen("Mesa")))
  184.       screen = LockPubScreen(NULL);
  185.     if ((window = OpenWindowTags(NULL,
  186.                  WA_InnerWidth, WIDTH,
  187.                  WA_InnerHeight, HEIGHT,
  188.                  WA_Title, "Triangles",
  189.                  WA_PubScreen, screen,
  190.                  WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_VANILLAKEY,
  191.                  WA_CloseGadget, TRUE,
  192.                  WA_DepthGadget, TRUE,
  193.                  WA_DragBar, TRUE,
  194.                  WA_Activate, TRUE,
  195.                  TAG_END))) {
  196.       if ((context = amigaMesaCreateContextTags(AMA_Window, window,
  197.                         AMA_RastPort, (unsigned long)window->RPort,
  198.                         AMA_Screen, (unsigned long)window->WScreen,
  199.                         AMA_Left, window->BorderLeft,
  200.                         AMA_Bottom, window->BorderBottom,
  201.                         AMA_Width, WIDTH,
  202.                         AMA_Height, HEIGHT,
  203.                         AMA_RGBMode, GL_TRUE,
  204.                         TAG_END))) {
  205.     if (window->WScreen->RastPort.BitMap->Depth <= 8)
  206.       drawTrianglesIndexModes0(context, argc == 2 ? atoi(argv[1]) : 500);
  207.     else
  208.       drawTrianglesRGBAModes(context, argc == 2 ? atoi(argv[1]) : 500);
  209.  
  210.     handle_window_events(window);
  211.       }
  212.     }
  213.   }
  214.   
  215.   return 0;
  216. }
  217.