Brian Paul | 797ea81 | 2001-12-14 03:03:38 +0000 | [diff] [blame] | 1 | /* Test glGenProgramsNV(), glIsProgramNV(), glLoadProgramNV() */ |
| 2 | |
| 3 | #include <assert.h> |
| 4 | #include <string.h> |
| 5 | #include <stdio.h> |
| 6 | #include <stdlib.h> |
| 7 | #include <math.h> |
Keith Whitwell | a58065d | 2009-03-10 13:11:23 +0000 | [diff] [blame] | 8 | #include <GL/glew.h> |
Brian Paul | 797ea81 | 2001-12-14 03:03:38 +0000 | [diff] [blame] | 9 | #include <GL/glut.h> |
| 10 | |
| 11 | |
| 12 | |
| 13 | static void Display( void ) |
| 14 | { |
| 15 | glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); |
| 16 | |
| 17 | glPushMatrix(); |
| 18 | |
| 19 | glBegin(GL_POLYGON); |
| 20 | glVertexAttrib2fNV(0, -1, -1); |
| 21 | glVertexAttrib2fNV(0, 1, -1); |
| 22 | glVertexAttrib2fNV(0, 0, 1); |
| 23 | glEnd(); |
| 24 | |
| 25 | glPopMatrix(); |
| 26 | |
| 27 | glutSwapBuffers(); |
| 28 | } |
| 29 | |
| 30 | |
| 31 | static void Reshape( int width, int height ) |
| 32 | { |
| 33 | glViewport( 0, 0, width, height ); |
| 34 | glMatrixMode( GL_PROJECTION ); |
| 35 | glLoadIdentity(); |
| 36 | glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 ); |
| 37 | glMatrixMode( GL_MODELVIEW ); |
| 38 | glLoadIdentity(); |
| 39 | glTranslatef( 0.0, 0.0, -15.0 ); |
| 40 | } |
| 41 | |
| 42 | |
| 43 | static void Key( unsigned char key, int x, int y ) |
| 44 | { |
| 45 | (void) x; |
| 46 | (void) y; |
| 47 | switch (key) { |
| 48 | case 27: |
| 49 | exit(0); |
| 50 | break; |
| 51 | } |
| 52 | glutPostRedisplay(); |
| 53 | } |
| 54 | |
| 55 | |
| 56 | static void Init( void ) |
| 57 | { |
| 58 | static const char *prog1 = |
| 59 | "!!VP1.0\n" |
| 60 | "MUL o[COL0].xyz, R0, c[35]; \n" |
| 61 | "END\n"; |
| 62 | static const char *prog2 = |
| 63 | "!!VP1.0\n" |
| 64 | "#\n" |
| 65 | "# c[0-3] = modelview projection (composite) matrix\n" |
| 66 | "# c[32] = normalized light direction in object-space\n" |
| 67 | "# c[35] = yellow diffuse material, (1.0, 1.0, 0.0, 1.0)\n" |
| 68 | "# c[64].x = 0.0\n" |
| 69 | "# c[64].z = 0.125, a scaling factor\n" |
| 70 | "#\n" |
| 71 | "# outputs diffuse illumination for color and perturbed position\n" |
| 72 | "#\n" |
| 73 | "DP3 R0, c[32], v[NRML]; # light direction DOT normal\n" |
| 74 | "MUL o[COL0].xyz, R0, c[35]; \n" |
| 75 | "MAX R0, c[64].x, R0; \n" |
| 76 | "MUL R0, R0, v[NRML]; \n" |
| 77 | "MUL R0, R0, c[64].z; \n" |
| 78 | "ADD R1, v[OPOS], -R0; # perturb object space position\n" |
| 79 | "DP4 o[HPOS].x, c[0], R1; \n" |
| 80 | "DP4 o[HPOS].y, c[1], R1; \n" |
| 81 | "DP4 o[HPOS].z, c[2], R1; \n" |
| 82 | "DP4 o[HPOS].w, c[3], R1; \n" |
| 83 | "END\n"; |
| 84 | static const char *prog3 = |
| 85 | "!!VP1.0\n" |
| 86 | "DP4 o[HPOS].x, c[0], v[OPOS];\n" |
| 87 | "DP4 o[HPOS].y, c[1], v[OPOS];\n" |
| 88 | "DP4 o[HPOS].z, c[2], v[OPOS];\n" |
| 89 | "DP4 o[HPOS].w, c[3], v[OPOS];\n" |
| 90 | "DP3 R0.x, c[4], v[NRML];\n" |
| 91 | "DP3 R0.y, c[5], v[NRML]; \n" |
| 92 | "DP3 R0.z, c[6], v[NRML]; # R0 = n' = transformed normal\n" |
| 93 | "DP3 R1.x, c[32], R0; # R1.x = Lpos DOT n'\n" |
| 94 | "DP3 R1.y, c[33], R0; # R1.y = hHat DOT n'\n" |
| 95 | "MOV R1.w, c[38].x; # R1.w = specular power\n" |
| 96 | "LIT R2, R1; # Compute lighting values\n" |
| 97 | "MAD R3, c[35].x, R2.y, c[35].y; # diffuse + emissive\n" |
| 98 | "MAD o[COL0].xyz, c[36], R2.z, R3; # + specular\n" |
| 99 | "END\n"; |
| 100 | static const char *prog4 = |
| 101 | "!!VP1.0\n" |
| 102 | "DP4 R2, R3, c[A0.x];\n" |
| 103 | "DP4 R2, R3, c[A0.x + 5];\n" |
| 104 | "DP4 o[HPOS], R3, c[A0.x - 4];\n" |
| 105 | "END\n"; |
| 106 | static const char *prog5 = |
| 107 | "!!VSP1.0\n" |
| 108 | "DP4 R2, R3, c[A0.x];\n" |
| 109 | "DP4 R2, R3, v[0];\n" |
| 110 | "DP4 c[3], R3, R2;\n" |
| 111 | "END\n"; |
| 112 | |
| 113 | |
| 114 | GLuint progs[5]; |
| 115 | |
Vinson Lee | af1052e | 2010-02-12 11:59:37 -0800 | [diff] [blame] | 116 | if (!glutExtensionSupported("GL_NV_vertex_program")) { |
| 117 | printf("Sorry, this program requires GL_NV_vertex_program\n"); |
| 118 | exit(1); |
| 119 | } |
| 120 | |
Brian Paul | 797ea81 | 2001-12-14 03:03:38 +0000 | [diff] [blame] | 121 | glGenProgramsNV(2, progs); |
| 122 | assert(progs[0]); |
| 123 | assert(progs[1]); |
| 124 | assert(progs[0] != progs[1]); |
| 125 | |
| 126 | glGenProgramsNV(3, progs + 2); |
| 127 | assert(progs[2]); |
| 128 | assert(progs[3]); |
| 129 | assert(progs[2] != progs[3]); |
| 130 | assert(progs[0] != progs[2]); |
| 131 | |
| 132 | |
| 133 | glLoadProgramNV(GL_VERTEX_PROGRAM_NV, 1, |
| 134 | strlen(prog1), |
| 135 | (const GLubyte *) prog1); |
Brian Paul | 3e750ce | 2009-04-18 10:20:26 -0600 | [diff] [blame] | 136 | assert(glIsProgramNV(1)); |
Brian Paul | 797ea81 | 2001-12-14 03:03:38 +0000 | [diff] [blame] | 137 | |
| 138 | glLoadProgramNV(GL_VERTEX_PROGRAM_NV, 2, |
| 139 | strlen(prog2), |
| 140 | (const GLubyte *) prog2); |
| 141 | assert(glIsProgramNV(2)); |
| 142 | |
| 143 | glLoadProgramNV(GL_VERTEX_PROGRAM_NV, 3, |
| 144 | strlen(prog3), |
| 145 | (const GLubyte *) prog3); |
| 146 | assert(glIsProgramNV(3)); |
| 147 | |
| 148 | glLoadProgramNV(GL_VERTEX_PROGRAM_NV, 4, |
| 149 | strlen(prog4), |
| 150 | (const GLubyte *) prog4); |
| 151 | assert(glIsProgramNV(4)); |
| 152 | |
| 153 | glLoadProgramNV(GL_VERTEX_STATE_PROGRAM_NV, 5, |
| 154 | strlen(prog5), |
| 155 | (const GLubyte *) prog5); |
| 156 | assert(glIsProgramNV(5)); |
| 157 | |
| 158 | printf("glGetError = %d\n", (int) glGetError()); |
| 159 | } |
| 160 | |
| 161 | |
| 162 | int main( int argc, char *argv[] ) |
| 163 | { |
| 164 | glutInit( &argc, argv ); |
| 165 | glutInitWindowPosition( 0, 0 ); |
| 166 | glutInitWindowSize( 250, 250 ); |
| 167 | glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); |
| 168 | glutCreateWindow(argv[0]); |
Keith Whitwell | a58065d | 2009-03-10 13:11:23 +0000 | [diff] [blame] | 169 | glewInit(); |
Brian Paul | 797ea81 | 2001-12-14 03:03:38 +0000 | [diff] [blame] | 170 | glutReshapeFunc( Reshape ); |
| 171 | glutKeyboardFunc( Key ); |
| 172 | glutDisplayFunc( Display ); |
| 173 | Init(); |
| 174 | glutMainLoop(); |
| 175 | return 0; |
| 176 | } |