132001f49Smrg/*
232001f49Smrg * Test cylindrical texcoord wrapping
332001f49Smrg */
432001f49Smrg
532001f49Smrg
632001f49Smrg#include <stdio.h>
732001f49Smrg#include <stdlib.h>
832001f49Smrg#include <math.h>
932001f49Smrg#include "glut_wrap.h"
1032001f49Smrg
1132001f49Smrgstatic int Win;
1232001f49Smrgstatic int WinWidth = 600, WinHeight = 400;
1332001f49Smrgstatic GLfloat Xrot = 0, Yrot = 0;
1432001f49Smrgstatic GLboolean CylWrap = GL_TRUE;
1532001f49Smrgstatic GLboolean Lines = GL_FALSE;
1632001f49Smrg
1732001f49Smrg
1832001f49Smrg
1932001f49Smrgstatic void
2032001f49SmrgPrintString(const char *s)
2132001f49Smrg{
2232001f49Smrg   while (*s) {
2332001f49Smrg      glutBitmapCharacter(GLUT_BITMAP_8_BY_13, (int) *s);
2432001f49Smrg      s++;
2532001f49Smrg   }
2632001f49Smrg}
2732001f49Smrg
2832001f49Smrg
2932001f49Smrgstatic void
3032001f49SmrgDrawSample(GLboolean wrap)
3132001f49Smrg{
3232001f49Smrg   float p;
3332001f49Smrg
3432001f49Smrg   glEnable(GL_TEXTURE_2D);
3532001f49Smrg
3632001f49Smrg   if (Lines) {
3732001f49Smrg      /* texured lines */
3832001f49Smrg      float t;
3932001f49Smrg      for (t = 0; t <= 1.0; t += 0.125) {
4032001f49Smrg         float y = -1.0 + 2.0 * t;
4132001f49Smrg         glBegin(GL_LINE_STRIP);
4232001f49Smrg         for (p = 0.0; p <= 1.001; p += 0.05) {
4332001f49Smrg            float x = -2.0 + p * 4.0;
4432001f49Smrg            float s = p + 0.5;
4532001f49Smrg            if (wrap && s > 1.0)
4632001f49Smrg               s -= 1.0;
4732001f49Smrg            glTexCoord2f(s, t);  glVertex2f(x, y);
4832001f49Smrg         }
4932001f49Smrg         glEnd();
5032001f49Smrg      }
5132001f49Smrg   }
5232001f49Smrg   else {
5332001f49Smrg      /* texured quads */
5432001f49Smrg      glBegin(GL_QUAD_STRIP);
5532001f49Smrg      for (p = 0.0; p <= 1.001; p += 0.1) {
5632001f49Smrg         float x = -2.0 + p * 4.0;
5732001f49Smrg         float s = p + 0.5;
5832001f49Smrg         if (wrap && s > 1.0)
5932001f49Smrg            s -= 1.0;
6032001f49Smrg         glTexCoord2f(s, 0);  glVertex2f(x, -1);
6132001f49Smrg         glTexCoord2f(s, 1);  glVertex2f(x, +1);
6232001f49Smrg      }
6332001f49Smrg      glEnd();
6432001f49Smrg   }
6532001f49Smrg
6632001f49Smrg   glDisable(GL_TEXTURE_2D);
6732001f49Smrg
6832001f49Smrg   /* hash marks */
6932001f49Smrg   glColor3f(0,0,0);
7032001f49Smrg   glBegin(GL_LINES);
7132001f49Smrg   for (p = 0.0; p <= 1.001; p += 0.1) {
7232001f49Smrg      float x = -2.0 + p * 4.0;
7332001f49Smrg      glVertex2f(x, -1.1);
7432001f49Smrg      glVertex2f(x, -0.8);
7532001f49Smrg   }
7632001f49Smrg   glEnd();
7732001f49Smrg
7832001f49Smrg   /* labels */
7932001f49Smrg   glColor3f(1,1,1);
8032001f49Smrg   for (p = 0.0; p <= 1.001; p += 0.1) {
8132001f49Smrg      char str[100];
8232001f49Smrg      float x = -2.0 + p * 4.0;
8332001f49Smrg      float s = p + 0.5;
8432001f49Smrg
8532001f49Smrg      if (wrap && s > 1.0)
8632001f49Smrg         s -= 1.0;
8732001f49Smrg
8832001f49Smrg      sprintf(str, "%3.1f", s);
8932001f49Smrg      glRasterPos2f(x, -1.2);
9032001f49Smrg      glBitmap(0, 0, 0, 0, -11, 0, NULL);
9132001f49Smrg      PrintString(str);
9232001f49Smrg      if (p == 0.0) {
9332001f49Smrg         glBitmap(0, 0, 0, 0, -55, 0, NULL);
9432001f49Smrg         PrintString("s =");
9532001f49Smrg      }
9632001f49Smrg   }
9732001f49Smrg}
9832001f49Smrg
9932001f49Smrg
10032001f49Smrgstatic void
10132001f49SmrgDraw(void)
10232001f49Smrg{
10332001f49Smrg   glClear(GL_COLOR_BUFFER_BIT);
10432001f49Smrg
10532001f49Smrg   glPushMatrix();
10632001f49Smrg      glRotatef(Xrot, 1, 0, 0);
10732001f49Smrg      glRotatef(Yrot, 0, 1, 0);
10832001f49Smrg
10932001f49Smrg      glPushMatrix();
11032001f49Smrg         glTranslatef(0, +1.2, 0);
11132001f49Smrg         DrawSample(GL_FALSE);
11232001f49Smrg      glPopMatrix();
11332001f49Smrg
11432001f49Smrg      /* set Mesa back-door state for testing cylindrical wrap mode */
11532001f49Smrg      if (CylWrap)
11632001f49Smrg         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, 0.125);
11732001f49Smrg
11832001f49Smrg      glPushMatrix();
11932001f49Smrg         glTranslatef(0, -1.2, 0);
12032001f49Smrg         DrawSample(GL_TRUE);
12132001f49Smrg      glPopMatrix();
12232001f49Smrg
12332001f49Smrg      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, 1.0);
12432001f49Smrg
12532001f49Smrg   glPopMatrix();
12632001f49Smrg
12732001f49Smrg   glutSwapBuffers();
12832001f49Smrg}
12932001f49Smrg
13032001f49Smrg
13132001f49Smrgstatic void
13232001f49SmrgReshape(int width, int height)
13332001f49Smrg{
13432001f49Smrg   WinWidth = width;
13532001f49Smrg   WinHeight = height;
13632001f49Smrg   glViewport(0, 0, width, height);
13732001f49Smrg   glMatrixMode(GL_PROJECTION);
13832001f49Smrg   glLoadIdentity();
13932001f49Smrg   glFrustum(-1.0, 1.0, -1.0, 1.0, 3.0, 25.0);
14032001f49Smrg   glMatrixMode(GL_MODELVIEW);
14132001f49Smrg   glLoadIdentity();
14232001f49Smrg   glTranslatef(0.0, 0.0, -10.0);
14332001f49Smrg}
14432001f49Smrg
14532001f49Smrg
14632001f49Smrgstatic void
14732001f49SmrgKey(unsigned char key, int x, int y)
14832001f49Smrg{
14932001f49Smrg   (void) x;
15032001f49Smrg   (void) y;
15132001f49Smrg   switch (key) {
15232001f49Smrg   case 'c':
15332001f49Smrg   case 'C':
15432001f49Smrg      CylWrap = !CylWrap;
15532001f49Smrg      if (CylWrap)
15632001f49Smrg         printf("Cylindrical wrap on.\n");
15732001f49Smrg      else
15832001f49Smrg         printf("Cylindrical wrap off.\n");
15932001f49Smrg      break;
16032001f49Smrg   case 'l':
16132001f49Smrg   case 'L':
16232001f49Smrg      Lines = !Lines;
16332001f49Smrg      break;
16432001f49Smrg   case 27:
16532001f49Smrg      glutDestroyWindow(Win);
16632001f49Smrg      exit(0);
16732001f49Smrg      break;
16832001f49Smrg   }
16932001f49Smrg   glutPostRedisplay();
17032001f49Smrg}
17132001f49Smrg
17232001f49Smrg
17332001f49Smrgstatic void
17432001f49SmrgSpecialKey(int key, int x, int y)
17532001f49Smrg{
17632001f49Smrg   const GLfloat step = 3.0;
17732001f49Smrg   (void) x;
17832001f49Smrg   (void) y;
17932001f49Smrg   switch (key) {
18032001f49Smrg   case GLUT_KEY_UP:
18132001f49Smrg      Xrot -= step;
18232001f49Smrg      break;
18332001f49Smrg   case GLUT_KEY_DOWN:
18432001f49Smrg      Xrot += step;
18532001f49Smrg      break;
18632001f49Smrg   case GLUT_KEY_LEFT:
18732001f49Smrg      Yrot -= step;
18832001f49Smrg      break;
18932001f49Smrg   case GLUT_KEY_RIGHT:
19032001f49Smrg      Yrot += step;
19132001f49Smrg      break;
19232001f49Smrg   }
19332001f49Smrg   glutPostRedisplay();
19432001f49Smrg}
19532001f49Smrg
19632001f49Smrg
19732001f49Smrgstatic void
19832001f49SmrgMakeSineWaveTexture(void)
19932001f49Smrg{
20032001f49Smrg   GLubyte tex[128][512][4];
20132001f49Smrg   int i, j;
20232001f49Smrg
20332001f49Smrg   for (j = 0; j < 128; j++) {
20432001f49Smrg      for (i = 0; i < 512; i++) {
20532001f49Smrg         float x = i / 511.0 * 2.0 * M_PI + M_PI * 0.5;
20632001f49Smrg         float y0 = sin(x) * 0.5 + 0.5;
20732001f49Smrg         int jy0 = y0 * 128;
20832001f49Smrg         float y1 = sin(x + M_PI) * 0.5 + 0.5;
20932001f49Smrg         int jy1 = y1 * 128;
21032001f49Smrg         if (j < jy0)
21132001f49Smrg            tex[j][i][0] = 0xff;
21232001f49Smrg         else
21332001f49Smrg            tex[j][i][0] = 0;
21432001f49Smrg         if (j < jy1)
21532001f49Smrg            tex[j][i][1] = 0xff;
21632001f49Smrg         else
21732001f49Smrg            tex[j][i][1] = 0;
21832001f49Smrg         tex[j][i][2] = 0;
21932001f49Smrg         tex[j][i][3] = 0xff;
22032001f49Smrg      }
22132001f49Smrg   }
22232001f49Smrg
22332001f49Smrg   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 128, 0,
22432001f49Smrg                GL_RGBA, GL_UNSIGNED_BYTE, tex);
22532001f49Smrg   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
22632001f49Smrg   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
22732001f49Smrg   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
22832001f49Smrg}
22932001f49Smrg
23032001f49Smrg
23132001f49Smrgstatic void
23232001f49SmrgInit(void)
23332001f49Smrg{
23432001f49Smrg   glBindTexture(GL_TEXTURE_2D, 5);
23532001f49Smrg   MakeSineWaveTexture();
23632001f49Smrg
23732001f49Smrg   glClearColor(0.5, 0.5, 0.5, 0.0);
23832001f49Smrg   glPointSize(3.0);
23932001f49Smrg
24032001f49Smrg   printf("Press 'c' to toggle cylindrical wrap mode.\n");
24132001f49Smrg   printf("Press 'l' to toggle line / quad drawing.\n");
24232001f49Smrg}
24332001f49Smrg
24432001f49Smrg
24532001f49Smrgint
24632001f49Smrgmain(int argc, char *argv[])
24732001f49Smrg{
24832001f49Smrg   glutInit(&argc, argv);
24932001f49Smrg   glutInitWindowSize(WinWidth, WinHeight);
25032001f49Smrg   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
25132001f49Smrg   Win = glutCreateWindow(argv[0]);
25232001f49Smrg   glutReshapeFunc(Reshape);
25332001f49Smrg   glutSpecialFunc(SpecialKey);
25432001f49Smrg   glutKeyboardFunc(Key);
25532001f49Smrg   glutDisplayFunc(Draw);
25632001f49Smrg   Init();
25732001f49Smrg   glutMainLoop();
25832001f49Smrg   return 0;
25932001f49Smrg}
260