1 /* Test glGenProgramsNV(), glIsProgramNV(), glLoadProgramNV() */
17 static const char *filename
= NULL
;
18 static GLuint nr_steps
= 4;
19 static GLuint prim
= GL_TRIANGLES
;
20 static GLfloat psz
= 1.0;
21 static GLboolean pointsmooth
= 0;
22 static GLboolean program_point_size
= 0;
24 static void usage( char *name
)
26 fprintf( stderr
, "usage: %s [ options ] shader_filename\n", name
);
27 fprintf( stderr
, "\n" );
28 fprintf( stderr
, "options:\n" );
29 fprintf( stderr
, " -f flat shaded\n" );
30 fprintf( stderr
, " -nNr subdivision steps\n" );
31 fprintf( stderr
, " -fps show frames per second\n" );
34 unsigned show_fps
= 0;
35 unsigned int frame_cnt
= 0;
39 void alarmhandler(int);
41 void alarmhandler (int sig
)
44 printf("%d frames in 5.0 seconds = %.3f FPS\n", frame_cnt
,
49 signal(SIGALRM
, alarmhandler
);
55 static void args(int argc
, char *argv
[])
59 for (i
= 1; i
< argc
; i
++) {
60 if (strncmp(argv
[i
], "-n", 2) == 0) {
61 nr_steps
= atoi((argv
[i
]) + 2);
63 else if (strcmp(argv
[i
], "-f") == 0) {
64 glShadeModel(GL_FLAT
);
66 else if (strcmp(argv
[i
], "-fps") == 0) {
69 else if (i
== argc
- 1) {
86 static void Init( void )
94 if ((f
= fopen(filename
, "r")) == NULL
) {
95 fprintf(stderr
, "couldn't open %s\n", filename
);
99 sz
= (GLuint
) fread(buf
, 1, sizeof(buf
) - 1, f
);
100 buf
[sizeof(buf
) - 1] = '\0';
102 fprintf(stderr
, "file too long\n");
108 fprintf(stderr
, "%.*s\n", sz
, buf
);
110 if (strncmp( buf
, "!!VP", 4 ) == 0) {
111 glEnable( GL_VERTEX_PROGRAM_NV
);
112 glGenProgramsNV( 1, &prognum
);
113 glBindProgramNV( GL_VERTEX_PROGRAM_NV
, prognum
);
114 glLoadProgramNV( GL_VERTEX_PROGRAM_NV
, prognum
, sz
, (const GLubyte
*) buf
);
115 assert( glIsProgramNV( prognum
) );
118 glEnable(GL_VERTEX_PROGRAM_ARB
);
120 glGenProgramsARB(1, &prognum
);
122 glBindProgramARB(GL_VERTEX_PROGRAM_ARB
, prognum
);
123 glProgramStringARB(GL_VERTEX_PROGRAM_ARB
, GL_PROGRAM_FORMAT_ASCII_ARB
,
124 sz
, (const GLubyte
*) buf
);
126 printf("Program failed to compile:\n%s\n", buf
);
127 printf("Error: %s\n",
128 (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB
));
131 assert(glIsProgramARB(prognum
));
134 errno
= glGetError();
135 printf("glGetError = %d\n", errno
);
136 if (errno
!= GL_NO_ERROR
)
140 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB
, &errorpos
);
141 printf("errorpos: %d\n", errorpos
);
142 printf("%s\n", (char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB
));
146 const float Ambient
[4] = { 0.0, 1.0, 0.0, 0.0 };
147 const float Diffuse
[4] = { 1.0, 0.0, 0.0, 0.0 };
148 const float Specular
[4] = { 0.0, 0.0, 1.0, 0.0 };
149 const float Emission
[4] = { 0.0, 0.0, 0.0, 1.0 };
150 glMaterialfv(GL_FRONT_AND_BACK
, GL_AMBIENT
, Ambient
);
151 glMaterialfv(GL_FRONT_AND_BACK
, GL_DIFFUSE
, Diffuse
);
152 glMaterialfv(GL_FRONT_AND_BACK
, GL_SPECULAR
, Specular
);
153 glMaterialfv(GL_FRONT_AND_BACK
, GL_EMISSION
, Emission
);
166 static void make_midpoint( union vert
*out
,
167 const union vert
*v0
,
168 const union vert
*v1
)
171 for (i
= 0; i
< 6; i
++)
172 out
->f
[i
] = v0
->f
[i
] + .5 * (v1
->f
[i
] - v0
->f
[i
]);
175 static void subdiv( union vert
*v0
,
181 glColor3fv(v0
->v
.color
);
182 glVertex3fv(v0
->v
.pos
);
183 glColor3fv(v1
->v
.color
);
184 glVertex3fv(v1
->v
.pos
);
185 glColor3fv(v2
->v
.color
);
186 glVertex3fv(v2
->v
.pos
);
191 make_midpoint(&m
[0], v0
, v1
);
192 make_midpoint(&m
[1], v1
, v2
);
193 make_midpoint(&m
[2], v2
, v0
);
195 subdiv(&m
[0], &m
[2], v0
, depth
-1);
196 subdiv(&m
[1], &m
[0], v1
, depth
-1);
197 subdiv(&m
[2], &m
[1], v2
, depth
-1);
198 subdiv(&m
[0], &m
[1], &m
[2], depth
-1);
202 static void enable( GLenum value
, GLboolean flag
)
211 #define ASSIGN_3V( V, V0, V1, V2 ) \
218 static void Display( void )
220 glClearColor(0.3, 0.3, 0.3, 1);
221 glClear( GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
224 enable( GL_POINT_SMOOTH
, pointsmooth
);
225 enable( GL_VERTEX_PROGRAM_POINT_SIZE_ARB
, program_point_size
);
233 ASSIGN_3V(v
[0].v
.color
, 0,0,1);
234 ASSIGN_3V(v
[0].v
.pos
, 0.9, -0.9, 0.0);
235 ASSIGN_3V(v
[1].v
.color
, 1,0,0);
236 ASSIGN_3V(v
[1].v
.pos
, 0.9, 0.9, 0.0);
237 ASSIGN_3V(v
[2].v
.color
, 0,1,0);
238 ASSIGN_3V(v
[2].v
.pos
, -0.9, 0, 0.0);
240 subdiv(&v
[0], &v
[1], &v
[2], nr_steps
);
254 static void Reshape( int width
, int height
)
256 glViewport( 0, 0, width
, height
);
257 glMatrixMode( GL_PROJECTION
);
259 glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
260 glMatrixMode( GL_MODELVIEW
);
262 /*glTranslatef( 0.0, 0.0, -15.0 );*/
266 static void Key( unsigned char key
, int x
, int y
)
285 pointsmooth
= !pointsmooth
;
288 program_point_size
= !program_point_size
;
312 int main( int argc
, char *argv
[] )
314 glutInit( &argc
, argv
);
315 glutInitWindowPosition( 0, 0 );
316 glutInitWindowSize( 250, 250 );
317 glutInitDisplayMode( GLUT_RGB
| GLUT_SINGLE
| GLUT_DEPTH
);
318 glutCreateWindow(argv
[argc
-1]);
320 glutReshapeFunc( Reshape
);
321 glutKeyboardFunc( Key
);
322 glutDisplayFunc( Display
);
327 signal(SIGALRM
, alarmhandler
);