home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / OpenGL 1.0 SDK / Source / Examples / aux / samples / texture.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  9.1 KB  |  569 lines  |  [TEXT/CWIE]

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5. #include <math.h>
  6. #include <stdlib.h>
  7. #include "tk.h"
  8.  
  9. #if defined(__MWERKS__) || defined(__SC__)
  10.     #include <console.h>            /* ccommand */
  11. #endif
  12.  
  13. GLenum doubleBuffer, directRender;
  14.  
  15. char *texFileName = 0;
  16. TK_RGBImageRec *image;
  17.  
  18. float *minFilter, *magFilter, *sWrapMode, *tWrapMode;
  19. float decal[] = {GL_REPLACE};
  20. float modulate[] = {GL_MODULATE};
  21. float repeat[] = {GL_REPEAT};
  22. float clamp[] = {GL_CLAMP};
  23. float nr[] = {GL_NEAREST};
  24. float ln[] = {GL_LINEAR};
  25. float nr_mipmap_nr[] = {GL_NEAREST_MIPMAP_NEAREST};
  26. float nr_mipmap_ln[] = {GL_NEAREST_MIPMAP_LINEAR};
  27. float ln_mipmap_nr[] = {GL_LINEAR_MIPMAP_NEAREST};
  28. float ln_mipmap_ln[] = {GL_LINEAR_MIPMAP_LINEAR};
  29. GLint sphereMap[] = {GL_SPHERE_MAP};
  30.  
  31. GLenum doSphere = GL_FALSE;
  32. GLboolean autoRotation = GL_FALSE;
  33. GLboolean fillrate_timing = GL_FALSE;
  34. float xRotation = 0.0, yRotation = 0.0, zTranslate = -3.125;
  35.  
  36. GLint w_win = 800;
  37. GLint h_win = 600;
  38.  
  39. GLint cube;
  40.  
  41. float c[6][4][3] = {
  42.     {
  43.     {
  44.         1.0, 1.0, -1.0
  45.     },
  46.     {
  47.         -1.0, 1.0, -1.0
  48.     },
  49.     {
  50.         -1.0, -1.0, -1.0
  51.     },
  52.     {
  53.         1.0, -1.0, -1.0
  54.     }
  55.     },
  56.     {
  57.     {
  58.         1.0, 1.0, 1.0
  59.     },
  60.     {
  61.         1.0, 1.0, -1.0
  62.     },
  63.     {
  64.         1.0, -1.0, -1.0
  65.     },
  66.     {
  67.         1.0, -1.0, 1.0
  68.     }
  69.     },
  70.     {
  71.     {
  72.         -1.0, 1.0, 1.0
  73.     },
  74.     {
  75.         1.0, 1.0, 1.0
  76.     },
  77.     {
  78.         1.0, -1.0, 1.0
  79.     },
  80.     {
  81.         -1.0, -1.0, 1.0
  82.     }
  83.     },
  84.     {
  85.     {
  86.         -1.0, 1.0, -1.0
  87.     },
  88.     {
  89.         -1.0, 1.0, 1.0
  90.     },
  91.     {
  92.         -1.0, -1.0, 1.0
  93.     },
  94.     {
  95.         -1.0, -1.0, -1.0
  96.     }
  97.     },
  98.     {
  99.     {
  100.         -1.0, 1.0, 1.0
  101.     },
  102.     {
  103.         -1.0, 1.0, -1.0
  104.     },
  105.     {
  106.         1.0, 1.0, -1.0
  107.     },
  108.     {
  109.         1.0, 1.0, 1.0
  110.     }
  111.     },
  112.     {
  113.     {
  114.         -1.0, -1.0, -1.0
  115.     },
  116.     {
  117.         -1.0, -1.0, 1.0
  118.     },
  119.     {
  120.         1.0, -1.0, 1.0
  121.     },
  122.     {
  123.         1.0, -1.0, -1.0
  124.     }
  125.     }
  126. };
  127. static float n[6][3] = {
  128.     {
  129.     0.0, 0.0, -1.0
  130.     },
  131.     {
  132.     1.0, 0.0, 0.0
  133.     },
  134.     {
  135.     0.0, 0.0, 1.0
  136.     },
  137.     {
  138.     -1.0, 0.0, 0.0
  139.     },
  140.     {
  141.     0.0, 1.0, 0.0
  142.     },
  143.     {
  144.     0.0, -1.0, 0.0
  145.     }
  146. };
  147.  
  148. static float t[6][4][2] = {
  149.     {
  150.     {
  151.         1.1,  1.1
  152.     },
  153.     {
  154.         -0.1, 1.1
  155.     },
  156.     {
  157.         -0.1, -0.1
  158.     },
  159.     {
  160.         1.1,  -0.1
  161.     }
  162.     },
  163.     {
  164.     {
  165.         1.1,  1.1
  166.     },
  167.     {
  168.         -0.1, 1.1
  169.     },
  170.     {
  171.         -0.1, -0.1
  172.     },
  173.     {
  174.         1.1,  -0.1
  175.     }
  176.     },
  177.     {
  178.     {
  179.         -0.1,  1.1
  180.     },
  181.     {
  182.         1.1, 1.1
  183.     },
  184.     {
  185.         1.1, -0.1
  186.     },
  187.     {
  188.         -0.1,  -0.1
  189.     }
  190.     },
  191.     {
  192.     {
  193.         1.1,  1.1
  194.     },
  195.     {
  196.         -0.1, 1.1
  197.     },
  198.     {
  199.         -0.1, -0.1
  200.     },
  201.     {
  202.         1.1,  -0.1
  203.     }
  204.     },
  205.     {
  206.     {
  207.         1.1,  1.1
  208.     },
  209.     {
  210.         -0.1, 1.1
  211.     },
  212.     {
  213.         -0.1, -0.1
  214.     },
  215.     {
  216.         1.1,  -0.1
  217.     }
  218.     },
  219.     {
  220.     {
  221.         1.1,  1.1
  222.     },
  223.     {
  224.         -0.1, 1.1
  225.     },
  226.     {
  227.         -0.1, -0.1
  228.     },
  229.     {
  230.         1.1,  -0.1
  231.     }
  232.     },
  233. };
  234.  
  235. static double filter(double in, double *save)
  236. {
  237.     static double k1 = 0.9;
  238.     static double k2 = 0.05;
  239.  
  240.     save[3] = in;
  241.     save[1] = save[0]*k1 + k2*(save[3] + save[2]);
  242.  
  243.     save[0]=save[1];
  244.     save[2]=save[3];
  245.  
  246.     return(save[1]);
  247. }
  248.  
  249.  
  250. static void DrawStr(char *str)
  251. {
  252.     static GLuint bitmapBase = 0;
  253.     
  254.     if(bitmapBase == 0)
  255.     {
  256.         glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  257.         bitmapBase = glGenLists(256);
  258.         aglUseFont(aglGetCurrentContext(), kFontIDNewYork, normal, 10, 0, 256, bitmapBase);
  259.     }
  260.     
  261.     glListBase(bitmapBase);
  262.     glCallLists(strlen(str), GL_UNSIGNED_BYTE, (GLubyte *) str);
  263. }
  264.  
  265. static void BuildCube(void)
  266. {
  267.     GLint i;
  268.  
  269.     glNewList(cube, GL_COMPILE);
  270.     for (i = 0; i < 6; i++) {
  271.     glBegin(GL_POLYGON);
  272.         glNormal3fv(n[i]); glTexCoord2fv(t[i][0]); glVertex3fv(c[i][0]);
  273.         glNormal3fv(n[i]); glTexCoord2fv(t[i][1]); glVertex3fv(c[i][1]);
  274.         glNormal3fv(n[i]); glTexCoord2fv(t[i][2]); glVertex3fv(c[i][2]);
  275.         glNormal3fv(n[i]); glTexCoord2fv(t[i][3]); glVertex3fv(c[i][3]);
  276.     glEnd();
  277.     }
  278.     glEndList();
  279. }
  280.  
  281. static void BuildLists(void)
  282. {
  283.     cube = glGenLists(1);
  284.     BuildCube();
  285. }
  286.  
  287. static void Init(void)
  288. {
  289.     GLfloat bcolor[4] = {1.0, 1.0, 1.0, 1.0};
  290.  
  291.     magFilter = nr;
  292.     minFilter = nr;
  293.     sWrapMode = repeat;
  294.     tWrapMode = repeat;
  295.  
  296.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  297.  
  298.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, sWrapMode);
  299.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, tWrapMode);
  300.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
  301.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
  302.  
  303.     glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
  304.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, bcolor);
  305.  
  306.     gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image->sizeX, image->sizeY,
  307.         GL_RGB, GL_UNSIGNED_BYTE, image->data);
  308.  
  309.     glEnable(GL_TEXTURE_2D);
  310.  
  311.     glFrontFace(GL_CCW);
  312.     glCullFace(GL_FRONT);
  313.     glEnable(GL_CULL_FACE);
  314.     
  315.     glShadeModel(GL_FLAT);
  316.     glDisable(GL_DITHER);
  317.     
  318.     BuildLists();
  319.  
  320.     glClearColor(0.0, 0.0, 0.0, 0.0);
  321. }
  322.  
  323. static void Reshape(int width, int height)
  324. {
  325.  
  326.     glViewport(0, 0, (GLint)width, (GLint)height);
  327.  
  328.     glMatrixMode(GL_PROJECTION);
  329.     glLoadIdentity();
  330.     gluPerspective(60.0, 1.0, 0.01, 1000);
  331.     //gluPerspective(120.0, 1.0, 0.01, 1000);
  332.     //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  333.     glMatrixMode(GL_MODELVIEW);
  334.     
  335.     w_win = width;
  336.     h_win = height;
  337. }
  338.  
  339. static GLenum Key(int key, GLenum mask)
  340. {
  341.  
  342.     switch (key) {
  343.       case TK_ESCAPE:
  344.     tkQuit();
  345.      case TK_a:
  346.     autoRotation = !autoRotation;
  347.     break;
  348.       case TK_LEFT:
  349.     yRotation -= 5.0;
  350.     break;
  351.       case TK_RIGHT:
  352.     yRotation += 5.0;
  353.     break;
  354.       case TK_UP:
  355.     xRotation -= 5.0;
  356.     break;
  357.       case TK_DOWN:
  358.     xRotation += 5.0;
  359.     break;
  360.       case TK_T:
  361.     zTranslate += 0.25;
  362.     break;
  363.       case TK_t:
  364.     zTranslate -= 0.25;
  365.     break;
  366.         case TK_r:
  367.             sWrapMode = repeat;
  368.             tWrapMode = repeat;
  369.     break;
  370.         case TK_c:
  371.             sWrapMode = clamp;
  372.             tWrapMode = clamp;
  373.     break;
  374.       case TK_s:
  375.     doSphere = !doSphere;
  376.     if (doSphere) {
  377.         glTexGeniv(GL_S, GL_TEXTURE_GEN_MODE, sphereMap);
  378.         glTexGeniv(GL_T, GL_TEXTURE_GEN_MODE, sphereMap);
  379.         glEnable(GL_TEXTURE_GEN_S);
  380.         glEnable(GL_TEXTURE_GEN_T);
  381.     } else {
  382.         glDisable(GL_TEXTURE_GEN_S);
  383.         glDisable(GL_TEXTURE_GEN_T);
  384.     }
  385.     break;
  386.     case TK_f:
  387.     fillrate_timing = !fillrate_timing;
  388.     break;
  389.  
  390.       case TK_0:
  391.     magFilter = nr;
  392.     break;
  393.       case TK_1:
  394.     magFilter = ln;
  395.     break;
  396.       case TK_2:
  397.     minFilter = nr;
  398.     break;
  399.       case TK_3:
  400.     minFilter = ln;
  401.     break;
  402.       case TK_4:
  403.     minFilter = nr_mipmap_nr;
  404.     break;
  405.       case TK_5:
  406.     minFilter = nr_mipmap_ln;
  407.     break;
  408.       case TK_6:
  409.     minFilter = ln_mipmap_nr;
  410.     break;
  411.       case TK_7:
  412.     minFilter = ln_mipmap_ln;
  413.     break;
  414.  
  415.       default:
  416.     return GL_FALSE;
  417.     }
  418.     return GL_TRUE;
  419. }
  420.  
  421. static void Draw(void)
  422. {
  423.     int i;
  424.     static double t1 = 0.0, t2 = 0.0, t;
  425.     static double th[4] = {0.0, 0.0, 0.0, 0.0};
  426.     char num_str[200];
  427.     
  428.     t1 = t2;
  429.  
  430.     glClear(GL_COLOR_BUFFER_BIT);
  431.  
  432.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, sWrapMode);
  433.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, tWrapMode);
  434.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
  435.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
  436.  
  437.     glPushMatrix();
  438.  
  439.     glTranslatef(0.0, 0.0, zTranslate);
  440.     glRotatef(xRotation, 1, 0, 0);
  441.     glRotatef(yRotation, 0, 1, 0);
  442.     
  443.     if(fillrate_timing)
  444.     {
  445.         for(i = 0; i < 100; i++)
  446.             glCallList(cube);
  447.     }
  448.     else
  449.     {
  450.         glCallList(cube);
  451.     }
  452.     
  453.     glPopMatrix();
  454.  
  455.     t2 = tkNow();
  456.     t = t2 - t1;
  457.     if(t > 0.0001) t = 1.0 / t;
  458.     
  459.     glColor3f(1.0, 0.0, 0.0);
  460.     
  461.     glMatrixMode (GL_PROJECTION);
  462.     glPushMatrix();
  463.     glLoadIdentity();
  464.     glOrtho(0, w_win, 0, h_win, -10.0, 10.0);
  465.     
  466.     glDisable(GL_TEXTURE_2D);
  467.     
  468.     glRasterPos2f(5.0, 5.0);
  469.     
  470.     if(fillrate_timing)
  471.         sprintf(num_str, "%0.2f Pixels/Sec, %dx%d", t * 100.0 * w_win * h_win, w_win, h_win);
  472.     else
  473.         sprintf(num_str, "%0.2f Hz, %dx%d", filter(t, th), w_win, h_win);
  474.         
  475.     DrawStr(num_str);
  476.     
  477.     glPopMatrix();
  478.     glMatrixMode(GL_MODELVIEW);
  479.     
  480.     glEnable(GL_TEXTURE_2D);
  481.  
  482.     tkSwapBuffers();
  483. }
  484.  
  485. static void Idle(void)
  486. {
  487.     if(autoRotation)
  488.     {
  489.         yRotation += 5.0;
  490.         if(yRotation < -180.0) yRotation += 360.0;
  491.         else if(yRotation > 180.0) yRotation -= 360.0;
  492.         
  493.         xRotation -= 5.0;
  494.         if(xRotation < -180.0) xRotation += 360.0;
  495.         else if(xRotation > 180.0) xRotation -= 360.0;
  496.     }
  497. }
  498.  
  499. static GLenum Args(int argc, char **argv)
  500. {
  501.     GLint i;
  502.  
  503.     doubleBuffer = GL_TRUE;
  504.     directRender = GL_TRUE;
  505.  
  506.     for (i = 1; i < argc; i++) {
  507.     if (strcmp(argv[i], "-sb") == 0) {
  508.         doubleBuffer = GL_FALSE;
  509.     } else if (strcmp(argv[i], "-db") == 0) {
  510.         doubleBuffer = GL_TRUE;
  511.     } else if (strcmp(argv[i], "-dr") == 0) {
  512.         directRender = GL_TRUE;
  513.     } else if (strcmp(argv[i], "-ir") == 0) {
  514.         directRender = GL_FALSE;
  515.     } else if (strcmp(argv[i], "-f") == 0) {
  516.         if (i+1 >= argc || argv[i+1][0] == '-') {
  517.         printf("-f (No file name).\n");
  518.         return GL_FALSE;
  519.         } else {
  520.         texFileName = argv[++i];
  521.         }
  522.     } else {
  523.         printf("%s (Bad option).\n", argv[i]);
  524.         return GL_FALSE;
  525.     }
  526.     }
  527.     return GL_TRUE;
  528. }
  529.  
  530. void main(int argc, char **argv)
  531. {
  532.     GLenum type;
  533.     
  534.     #if defined(__MWERKS__) || defined(__SC__)
  535.         argc = ccommand(&argv);
  536.     #endif
  537.  
  538.     if (Args(argc, argv) == GL_FALSE) {
  539.     tkQuit();
  540.     }
  541.  
  542.     if (texFileName == 0) {
  543.     printf("No image file.\n");
  544.     tkQuit();
  545.     }
  546.  
  547.     image = tkRGBImageLoad(texFileName);
  548.  
  549.     tkInitPosition(30, 60, w_win, h_win);
  550.  
  551.     type = TK_RGB;
  552.     type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  553.     type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  554.     tkInitDisplayMode(type);
  555.  
  556.     if (tkInitWindow("Texture Test") == GL_FALSE) {
  557.     tkQuit();
  558.     }
  559.  
  560.     Init();
  561.  
  562.     tkExposeFunc(Reshape);
  563.     tkReshapeFunc(Reshape);
  564.     tkIdleFunc(Idle);
  565.     tkKeyDownFunc(Key);
  566.     tkDisplayFunc(Draw);
  567.     tkExec();
  568. }
  569.