2 * Test vertex arrays with GL_NV_vertex_program
4 * Based on a stripped-down version of the isosurf demo.
5 * The vertex program is trivial: compute the resulting
6 * RGB color as a linear function of vertex XYZ.
18 #define MAXVERTS 10000
19 static float data
[MAXVERTS
][6];
20 static GLint numverts
;
24 static GLboolean useArrays
= GL_TRUE
;
25 static GLboolean useProgram
= GL_TRUE
;
26 static GLboolean useList
= GL_FALSE
;
29 static void read_surface( char *filename
)
33 f
= fopen(filename
,"r");
35 printf("couldn't read %s\n", filename
);
40 while (!feof(f
) && numverts
< MAXVERTS
) {
41 fscanf( f
, "%f %f %f %f %f %f",
42 &data
[numverts
][0], &data
[numverts
][1], &data
[numverts
][2],
43 &data
[numverts
][3], &data
[numverts
][4], &data
[numverts
][5] );
48 printf("%d vertices, %d triangles\n", numverts
, numverts
-2);
49 printf("data = %p\n", (void *) data
);
56 static void Display(void)
59 glEnable(GL_VERTEX_PROGRAM_NV
);
61 glDisable(GL_VERTEX_PROGRAM_NV
);
63 glClear( GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
66 glRotatef(xrot
, 1, 0, 0);
67 glRotatef(yrot
, 0, 1, 0);
71 glVertexAttribPointerNV( 0, 3, GL_FLOAT
, 6 * sizeof(GLfloat
), data
);
72 glEnableClientState( GL_VERTEX_ATTRIB_ARRAY0_NV
);
73 glVertexAttribPointerNV( 2, 3, GL_FLOAT
, 6 * sizeof(GLfloat
), ((GLfloat
*) data
) + 3);
74 glEnableClientState( GL_VERTEX_ATTRIB_ARRAY2_NV
);
77 glVertexPointer( 3, GL_FLOAT
, 6 * sizeof(GLfloat
), data
);
78 glEnableClientState( GL_VERTEX_ARRAY
);
79 glNormalPointer( GL_FLOAT
, 6 * sizeof(GLfloat
), ((GLfloat
*) data
) + 3);
80 glEnableClientState( GL_NORMAL_ARRAY
);
84 /* dumb, but a good test */
85 glNewList(1,GL_COMPILE
);
86 glDrawArrays(GL_TRIANGLE_STRIP
, 0, numverts
);
91 glDrawArrays(GL_TRIANGLE_STRIP
, 0, numverts
);
94 glDisableClientState( GL_VERTEX_ATTRIB_ARRAY0_NV
);
95 glDisableClientState( GL_VERTEX_ATTRIB_ARRAY2_NV
);
96 glDisableClientState( GL_VERTEX_ARRAY
);
97 glDisableClientState( GL_NORMAL_ARRAY
);
101 glBegin(GL_TRIANGLE_STRIP
);
102 for (i
= 0; i
< numverts
; i
++) {
103 glNormal3fv( data
[i
] + 3 );
104 glVertex3fv( data
[i
] + 0 );
117 static void InitMaterials(void)
119 static float ambient
[] = {0.1, 0.1, 0.1, 1.0};
120 static float diffuse
[] = {0.5, 1.0, 1.0, 1.0};
121 static float position0
[] = {0.0, 0.0, 20.0, 0.0};
122 static float position1
[] = {0.0, 0.0, -20.0, 0.0};
123 static float front_mat_shininess
[] = {60.0};
124 static float front_mat_specular
[] = {0.2, 0.2, 0.2, 1.0};
125 static float front_mat_diffuse
[] = {0.5, 0.28, 0.38, 1.0};
127 static float back_mat_shininess[] = {60.0};
128 static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
129 static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
131 static float lmodel_ambient
[] = {1.0, 1.0, 1.0, 1.0};
132 static float lmodel_twoside
[] = {GL_FALSE
};
134 glLightfv(GL_LIGHT0
, GL_AMBIENT
, ambient
);
135 glLightfv(GL_LIGHT0
, GL_DIFFUSE
, diffuse
);
136 glLightfv(GL_LIGHT0
, GL_POSITION
, position0
);
139 glLightfv(GL_LIGHT1
, GL_AMBIENT
, ambient
);
140 glLightfv(GL_LIGHT1
, GL_DIFFUSE
, diffuse
);
141 glLightfv(GL_LIGHT1
, GL_POSITION
, position1
);
144 glLightModelfv(GL_LIGHT_MODEL_AMBIENT
, lmodel_ambient
);
145 glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE
, lmodel_twoside
);
147 glMaterialfv(GL_FRONT_AND_BACK
, GL_SHININESS
, front_mat_shininess
);
148 glMaterialfv(GL_FRONT_AND_BACK
, GL_SPECULAR
, front_mat_specular
);
149 glMaterialfv(GL_FRONT_AND_BACK
, GL_DIFFUSE
, front_mat_diffuse
);
150 glEnable(GL_LIGHTING
);
154 static void init_program(void)
157 * c[0..3] = modelview matrix
158 * c[4..7] = inverse modelview matrix
159 * c[30] = color scale
162 static const char prog
[] =
165 "# RGB is proportional to XYZ \n"
167 "MUL R0, v[OPOS], c[30]; \n"
168 "ADD o[COL0], R0, c[31]; \n"
170 "# Continue with typical modelview/projection\n"
171 "MOV R3, v[OPOS]; \n"
172 "DP4 o[HPOS].x, c[0], R3 ; # object x MVP -> clip\n"
173 "DP4 o[HPOS].y, c[1], R3 ;\n"
174 "DP4 o[HPOS].z, c[2], R3 ;\n"
175 "DP4 o[HPOS].w, c[3], R3 ;\n"
179 static const GLfloat scale
[4] = {2.0, 2.0, 2.0, 0.0};
180 static const GLfloat bias
[4] = {1.0, 1.0, 1.0, 0.0};
182 if (!glutExtensionSupported("GL_NV_vertex_program")) {
183 printf("Sorry, this program requires GL_NV_vertex_program");
187 glLoadProgramNV(GL_VERTEX_PROGRAM_NV
, 1,
188 strlen(prog
), (const GLubyte
*) prog
);
189 assert(glIsProgramNV(1));
190 glBindProgramNV(GL_VERTEX_PROGRAM_NV
, 1);
192 /* Load the program registers */
193 glTrackMatrixNV(GL_VERTEX_PROGRAM_NV
, 0, GL_MODELVIEW_PROJECTION_NV
, GL_IDENTITY_NV
);
194 glTrackMatrixNV(GL_VERTEX_PROGRAM_NV
, 4, GL_MODELVIEW
, GL_INVERSE_TRANSPOSE_NV
);
196 glProgramParameter4fvNV(GL_VERTEX_PROGRAM_NV
, 30, scale
);
197 glProgramParameter4fvNV(GL_VERTEX_PROGRAM_NV
, 31, bias
);
201 static void init(void)
205 glClearColor(0.0, 0.0, 1.0, 0.0);
206 glEnable( GL_DEPTH_TEST
);
207 glEnable(GL_NORMALIZE
);
209 read_surface( "../demos/isosurf.dat" );
214 static void Reshape(int width
, int height
)
216 glViewport(0, 0, (GLint
)width
, (GLint
)height
);
217 glMatrixMode(GL_PROJECTION
);
219 glFrustum( -1.0, 1.0, -1.0, 1.0, 5, 25 );
220 glMatrixMode(GL_MODELVIEW
);
222 glTranslatef(0, 0, -15);
227 static void Key( unsigned char key
, int x
, int y
)
235 useArrays
= !useArrays
;
236 printf("use arrays: %s\n", useArrays
? "yes" : "no");
240 printf("use list: %s\n", useList
? "yes" : "no");
243 useProgram
= !useProgram
;
244 printf("use program: %s\n", useProgram
? "yes" : "no");
251 static void SpecialKey( int key
, int x
, int y
)
276 int main(int argc
, char **argv
)
278 glutInit(&argc
, argv
);
279 glutInitDisplayMode( GLUT_DEPTH
| GLUT_RGB
| GLUT_DOUBLE
);
280 glutInitWindowPosition(0, 0);
281 glutInitWindowSize(400, 400);
282 if (glutCreateWindow("Isosurface") <= 0) {
286 glutReshapeFunc(Reshape
);
287 glutKeyboardFunc(Key
);
288 glutSpecialFunc(SpecialKey
);
289 glutDisplayFunc(Display
);