home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / newopg.zip / STENCIL.C < prev    next >
Text File  |  1995-03-04  |  2KB  |  126 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>
  4. #include "tk.h"
  5.  
  6.  
  7. GLenum directRender;
  8.  
  9.  
  10. static void Init(void)
  11. {
  12.  
  13.     glClearColor(0.0, 0.0, 0.0, 0.0);
  14.  
  15.     glClearStencil(0);
  16.     glStencilMask(1);
  17.     glEnable(GL_STENCIL_TEST);
  18. }
  19.  
  20. static void Reshape(int width, int height)
  21. {
  22.  
  23.     glViewport(0, 0, (GLint)width, (GLint)height);
  24.  
  25.     glMatrixMode(GL_PROJECTION);
  26.     glLoadIdentity();
  27.     glOrtho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0);
  28.     glMatrixMode(GL_MODELVIEW);
  29. }
  30.  
  31. static GLenum Key(int key, GLenum mask)
  32. {
  33.  
  34.     switch (key) {
  35.       case TK_ESCAPE:
  36.     tkQuit();
  37.     }
  38.     return GL_FALSE;
  39. }
  40.  
  41. static void Draw(void)
  42. {
  43.  
  44.     glClear(GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
  45.  
  46.     glStencilFunc(GL_ALWAYS, 1, 1);
  47.     glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
  48.  
  49.     glColor3ub(200, 0, 0);
  50.     glBegin(GL_POLYGON);        
  51.     glVertex3i(-4, -4, 0);
  52.     glVertex3i( 4, -4, 0);
  53.     glVertex3i( 0,  4, 0);
  54.     glEnd();
  55.  
  56.     glStencilFunc(GL_EQUAL, 1, 1);
  57.     glStencilOp(GL_INCR, GL_KEEP, GL_DECR);
  58.  
  59.     glColor3ub(0, 200, 0);
  60.     glBegin(GL_POLYGON);
  61.     glVertex3i(3, 3, 0);
  62.     glVertex3i(-3, 3, 0);
  63.     glVertex3i(-3, -3, 0);
  64.     glVertex3i(3, -3, 0);
  65.     glEnd();
  66.  
  67.     glStencilFunc(GL_EQUAL, 1, 1);
  68.     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
  69.  
  70.     glColor3ub(0, 0, 200);
  71.     glBegin(GL_POLYGON);
  72.     glVertex3i(3, 3, 0);
  73.     glVertex3i(-3, 3, 0);
  74.     glVertex3i(-3, -3, 0);
  75.     glVertex3i(3, -3, 0);
  76.     glEnd();
  77.  
  78.     glFlush();
  79.     tkSwapBuffers();
  80. }
  81.  
  82. static GLenum Args(int argc, char **argv)
  83. {
  84.     GLint i;
  85.  
  86.     directRender = GL_TRUE;
  87.  
  88.     for (i = 1; i < argc; i++) {
  89.     if (strcmp(argv[i], "-dr") == 0) {
  90.         directRender = GL_TRUE;
  91.     } else if (strcmp(argv[i], "-ir") == 0) {
  92.         directRender = GL_FALSE;
  93.     } else {
  94.         printf("%s (Bad option).\n", argv[i]);
  95.     }
  96.     }
  97.     return GL_TRUE;
  98. }
  99.  
  100. void main(int argc, char **argv)
  101. {
  102.     GLenum type;
  103.  
  104.     if (Args(argc, argv) == GL_FALSE) {
  105.     tkQuit();
  106.     }
  107.  
  108.     tkInitPosition(0, 0, 300, 300);
  109.  
  110.     type = TK_RGB | TK_DOUBLE | TK_STENCIL;
  111.     type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  112.     tkInitDisplayMode(type);
  113.  
  114.     if (tkInitWindow("Stencil Test") == GL_FALSE) {
  115.     tkQuit();
  116.     }
  117.  
  118.     Init();
  119.  
  120.     tkExposeFunc(Reshape);
  121.     tkReshapeFunc(Reshape);
  122.     tkKeyDownFunc(Key);
  123.     tkDisplayFunc(Draw);
  124.     tkExec();
  125. }
  126.