diff options
author | Brian Paul <[email protected]> | 2010-02-04 16:43:08 -0700 |
---|---|---|
committer | Michal Krol <[email protected]> | 2010-02-09 15:32:47 +0100 |
commit | 86921aaf3ff96fd4828964e37bd66cf2ea8035b1 (patch) | |
tree | 41400b9282bd081935994af55c253e22038f544c /progs/tests/cylwrap.c | |
parent | ae4dde6598eacb64bf865037bdaea2041499aa27 (diff) |
progs/tests: new test program for exercising cylindrical tex wrap mode
Diffstat (limited to 'progs/tests/cylwrap.c')
-rw-r--r-- | progs/tests/cylwrap.c | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/progs/tests/cylwrap.c b/progs/tests/cylwrap.c new file mode 100644 index 00000000000..9d541e319f8 --- /dev/null +++ b/progs/tests/cylwrap.c @@ -0,0 +1,204 @@ +/* + * Test cylindrical texcoord wrapping + */ + + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <GL/glut.h> + +static int Win; +static int WinWidth = 600, WinHeight = 400; +static GLboolean CylWrap = GL_TRUE; + + + +static void +PrintString(const char *s) +{ + while (*s) { + glutBitmapCharacter(GLUT_BITMAP_8_BY_13, (int) *s); + s++; + } +} + + +static void +DrawSample(GLboolean wrap) +{ + float p; + + glEnable(GL_TEXTURE_2D); + + /* texured quad */ + glBegin(GL_QUAD_STRIP); + for (p = 0.0; p <= 1.001; p += 0.1) { + float x = -2.0 + p * 4.0; + float s = p + 0.5; + if (wrap && s > 1.0) + s -= 1.0; + glTexCoord2f(s, 0); glVertex2f(x, -1); + glTexCoord2f(s, 1); glVertex2f(x, +1); + } + glEnd(); + + glDisable(GL_TEXTURE_2D); + + /* hash marks */ + glColor3f(0,0,0); + glBegin(GL_LINES); + for (p = 0.0; p <= 1.001; p += 0.1) { + float x = -2.0 + p * 4.0; + glVertex2f(x, -1.1); + glVertex2f(x, -0.8); + } + glEnd(); + + /* labels */ + glColor3f(1,1,1); + for (p = 0.0; p <= 1.001; p += 0.1) { + char str[100]; + float x = -2.0 + p * 4.0; + float s = p + 0.5; + + if (wrap && s > 1.0) + s -= 1.0; + + sprintf(str, "%3.1f", s); + glRasterPos2f(x, -1.2); + glBitmap(0, 0, 0, 0, -11, 0, NULL); + PrintString(str); + if (p == 0.0) { + glBitmap(0, 0, 0, 0, -55, 0, NULL); + PrintString("s ="); + } + } +} + + +static void +Draw(void) +{ + glClear(GL_COLOR_BUFFER_BIT); + + glPushMatrix(); + glTranslatef(0, +1.2, 0); + DrawSample(GL_FALSE); + glPopMatrix(); + + /* set Mesa back-door state for testing cylindrical wrap mode */ + if (CylWrap) + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, 0.125); + + glPushMatrix(); + glTranslatef(0, -1.2, 0); + DrawSample(GL_TRUE); + glPopMatrix(); + + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, 1.0); + + glutSwapBuffers(); +} + + +static void +Reshape(int width, int height) +{ + WinWidth = width; + WinHeight = height; + glViewport(0, 0, width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.0, 0.0, -15.0); +} + + +static void +Key(unsigned char key, int x, int y) +{ + const GLfloat step = 3.0; + (void) x; + (void) y; + switch (key) { + case 'c': + case 'C': + CylWrap = !CylWrap; + if (CylWrap) + printf("Cylindrical wrap on.\n"); + else + printf("Cylindrical wrap off.\n"); + break; + case 27: + glutDestroyWindow(Win); + exit(0); + break; + } + glutPostRedisplay(); +} + + +static void +MakeSineWaveTexture(void) +{ + GLubyte tex[128][512][4]; + int i, j; + + for (j = 0; j < 128; j++) { + for (i = 0; i < 512; i++) { + float x = i / 511.0 * 2.0 * M_PI + M_PI * 0.5; + float y0 = sin(x) * 0.5 + 0.5; + int jy0 = y0 * 128; + float y1 = sin(x + M_PI) * 0.5 + 0.5; + int jy1 = y1 * 128; + if (j < jy0) + tex[j][i][0] = 0xff; + else + tex[j][i][0] = 0; + if (j < jy1) + tex[j][i][1] = 0xff; + else + tex[j][i][1] = 0; + tex[j][i][2] = 0; + tex[j][i][3] = 0xff; + } + } + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 128, 0, + GL_RGBA, GL_UNSIGNED_BYTE, tex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); +} + + +static void +Init(void) +{ + glBindTexture(GL_TEXTURE_2D, 5); + MakeSineWaveTexture(); + + glClearColor(0.5, 0.5, 0.5, 0.0); + glPointSize(3.0); + + printf("Press 'c' to toggle cylindrical wrap mode.\n"); +} + + +int +main(int argc, char *argv[]) +{ + glutInit(&argc, argv); + glutInitWindowSize(WinWidth, WinHeight); + glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); + Win = glutCreateWindow(argv[0]); + glutReshapeFunc(Reshape); + glutKeyboardFunc(Key); + glutDisplayFunc(Draw); + Init(); + glutMainLoop(); + return 0; +} |