diff options
Diffstat (limited to 'progs/tests/vpeval.c')
-rw-r--r-- | progs/tests/vpeval.c | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/progs/tests/vpeval.c b/progs/tests/vpeval.c new file mode 100644 index 000000000..8b6996d3b --- /dev/null +++ b/progs/tests/vpeval.c @@ -0,0 +1,231 @@ +/* + * Vertex program evaluators test. + * Based on book/bezmesh.c + * + * Brian Paul + * 22 June 2002 + */ + +#include <assert.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#define GL_GLEXT_PROTOTYPES +#include <GL/glut.h> + + +/* + * Transform position by modelview/projection. + * Square incoming color. + */ +static const char prog[] = +"!!VP1.0\n" + +"# Typical modelview/projection\n" +"DP4 o[HPOS].x, c[0], v[OPOS] ; # object x MVP -> clip\n" +"DP4 o[HPOS].y, c[1], v[OPOS] ;\n" +"DP4 o[HPOS].z, c[2], v[OPOS] ;\n" +"DP4 o[HPOS].w, c[3], v[OPOS] ;\n" + +"MOV R0, v[COL0];\n # square the color\n" +"MUL R0, R0, R0;\n" +"MOV o[COL0], R0;\n # store output color\n" + +"END"; + + +static int program = 1; + + +GLfloat ctrlpoints[4][4][4] = +{ + { + {-1.5, -1.5, 4.0, 1.0}, + {-0.5, -1.5, 2.0, 1.0}, + {0.5, -1.5, -1.0, 1.0}, + {1.5, -1.5, 2.0, 1.0}}, + { + {-1.5, -0.5, 1.0, 1.0}, + {-0.5, -0.5, 3.0, 1.0}, + {0.5, -0.5, 0.0, 1.0}, + {1.5, -0.5, -1.0, 1.0}}, + { + {-1.5, 0.5, 4.0, 1.0}, + {-0.5, 0.5, 0.0, 1.0}, + {0.5, 0.5, 3.0, 1.0}, + {1.5, 0.5, 4.0, 1.0}}, + { + {-1.5, 1.5, -2.0, 1.0}, + {-0.5, 1.5, -2.0, 1.0}, + {0.5, 1.5, 0.0, 1.0}, + {1.5, 1.5, -1.0, 1.0}} +}; + +/* + * +-------------+ + * |green |yellow + * | | + * | | + * |black |red + * +-------------+ + */ +GLfloat colorPoints[4][4][4] = +{ + { + {0.0, 0.0, 0.0, 1.0}, + {0.3, 0.0, 0.0, 1.0}, + {0.6, 0.0, 0.0, 1.0}, + {1.0, 0.0, 0.0, 1.0}}, + { + {0.0, 0.3, 0.0, 1.0}, + {0.3, 0.3, 0.0, 1.0}, + {0.6, 0.3, 0.0, 1.0}, + {1.0, 0.3, 0.0, 1.0}}, + { + {0.0, 0.6, 0.0, 1.0}, + {0.3, 0.6, 0.0, 1.0}, + {0.6, 0.6, 0.0, 1.0}, + {1.0, 0.6, 0.0, 1.0}}, + { + {0.0, 1.0, 0.0, 1.0}, + {0.3, 1.0, 0.0, 1.0}, + {0.6, 1.0, 0.0, 1.0}, + {1.0, 1.0, 0.0, 1.0}} +}; + + +void +initlights(void) +{ + GLfloat ambient[] = {0.2, 0.2, 0.2, 1.0}; + GLfloat position[] = {0.0, 0.0, 2.0, 1.0}; + GLfloat mat_diffuse[] = {0.6, 0.6, 0.6, 1.0}; + GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0}; + GLfloat mat_shininess[] = {50.0}; + +#if 0 /* no lighting for now */ + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT0, GL_POSITION, position); + + glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); + glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); + glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); +#endif +} + +void +display(void) +{ + glClearColor(.3, .3, .3, 0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glPushMatrix(); +#if 1 + glRotatef(85.0, 1.0, 1.0, 1.0); +#endif + glEvalMesh2(GL_FILL, 0, 8, 0, 8); + glPopMatrix(); + glFlush(); +} + +void +myinit(int argc, char *argv[]) +{ + glClearColor(0.0, 0.0, 0.0, 1.0); + glEnable(GL_DEPTH_TEST); + + initlights(); /* for lighted version only */ + + glMapGrid2f(8, 0.0, 1.0, 8, 0.0, 1.0); + + if (argc > 1) + program = 0; + + printf("Using vertex program attribs? %s\n", program ? "yes" : "no"); + + if (!program) { + glMap2f(GL_MAP2_VERTEX_4, + 0.0, 1.0, 4, 4, + 0.0, 1.0, 16, 4, &ctrlpoints[0][0][0]); + glMap2f(GL_MAP2_COLOR_4, + 0.0, 1.0, 4, 4, + 0.0, 1.0, 16, 4, &colorPoints[0][0][0]); + glEnable(GL_MAP2_VERTEX_4); + glEnable(GL_MAP2_COLOR_4); + /* + glEnable(GL_AUTO_NORMAL); + glEnable(GL_NORMALIZE); + */ + } + else { + glMap2f(GL_MAP2_VERTEX_ATTRIB0_4_NV, + 0.0, 1.0, 4, 4, + 0.0, 1.0, 16, 4, &ctrlpoints[0][0][0]); + glMap2f(GL_MAP2_VERTEX_ATTRIB3_4_NV, + 0.0, 1.0, 4, 4, + 0.0, 1.0, 16, 4, &colorPoints[0][0][0]); + glEnable(GL_MAP2_VERTEX_ATTRIB0_4_NV); + glEnable(GL_MAP2_VERTEX_ATTRIB3_4_NV); + + /* + glEnable(GL_AUTO_NORMAL); + glEnable(GL_NORMALIZE); + */ + + /* vertex program init */ + glLoadProgramNV(GL_VERTEX_PROGRAM_NV, 1, + strlen(prog), (const GLubyte *) prog); + assert(glIsProgramNV(1)); + glBindProgramNV(GL_VERTEX_PROGRAM_NV, 1); + + /* track matrices */ + glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 0, GL_MODELVIEW_PROJECTION_NV, GL_IDENTITY_NV); + glEnable(GL_VERTEX_PROGRAM_NV); + } +} + +void +myReshape(int w, int h) +{ + glViewport(0, 0, w, h); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + if (w <= h) + glOrtho(-4.0, 4.0, -4.0 * (GLfloat) h / (GLfloat) w, + 4.0 * (GLfloat) h / (GLfloat) w, -4.0, 4.0); + else + glOrtho(-4.0 * (GLfloat) w / (GLfloat) h, + 4.0 * (GLfloat) w / (GLfloat) h, -4.0, 4.0, -4.0, 4.0); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +} + +static void +key(unsigned char k, int x, int y) +{ + switch (k) { + case 27: /* Escape */ + exit(0); + break; + default: + return; + } + glutPostRedisplay(); +} + +int +main(int argc, char **argv) +{ + glutInit(&argc, argv); + glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); + glutInitWindowPosition(0, 0); + glutCreateWindow(argv[0]); + myinit(argc, argv); + glutReshapeFunc(myReshape); + glutDisplayFunc(display); + glutKeyboardFunc(key); + glutMainLoop(); + return 0; /* ANSI C requires main to return int. */ +} |