progs/tests: new test program for exercising cylindrical tex wrap mode

This commit is contained in:
Brian Paul 2010-02-04 16:43:08 -07:00 committed by Michal Krol
parent ae4dde6598
commit 86921aaf3f
3 changed files with 206 additions and 0 deletions

View File

@ -41,6 +41,7 @@ SOURCES = \
copypixrate.c \
crossbar.c \
cva.c \
cylwrap.c \
drawbuffers.c \
drawbuffers2.c \
exactrast.c \

View File

@ -45,6 +45,7 @@ progs = [
'copypixrate',
'crossbar',
'cva',
'cylwrap',
'drawbuffers',
'drawbuffers2',
'exactrast',

204
progs/tests/cylwrap.c Normal file
View File

@ -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;
}