1 /* Test glGenProgramsNV(), glIsProgramNV(), glLoadProgramNV() */
13 #define GL_GLEXT_PROTOTYPES
19 static PFNGLBINDPROGRAMARBPROC glBindProgramARB
= NULL
;
20 static PFNGLGENPROGRAMSARBPROC glGenProgramsARB
= NULL
;
21 static PFNGLPROGRAMSTRINGARBPROC glProgramStringARB
= NULL
;
22 static PFNGLISPROGRAMARBPROC glIsProgramARB
= NULL
;
24 static PFNGLBINDPROGRAMNVPROC glBindProgramNV
= NULL
;
25 static PFNGLGENPROGRAMSNVPROC glGenProgramsNV
= NULL
;
26 static PFNGLLOADPROGRAMNVPROC glLoadProgramNV
= NULL
;
27 static PFNGLISPROGRAMNVPROC glIsProgramNV
= NULL
;
30 static const char *filename
= NULL
;
31 static GLuint nr_steps
= 4;
33 static void usage( char *name
)
35 fprintf( stderr
, "usage: %s [ options ] shader_filename\n", name
);
36 fprintf( stderr
, "\n" );
37 fprintf( stderr
, "options:\n" );
38 fprintf( stderr
, " -f flat shaded\n" );
39 fprintf( stderr
, " -nNr subdivision steps\n" );
40 fprintf( stderr
, " -fps show frames per second\n" );
43 unsigned show_fps
= 0;
44 unsigned int frame_cnt
= 0;
48 void alarmhandler(int);
50 void alarmhandler (int sig
)
53 printf("%d frames in 5.0 seconds = %.3f FPS\n", frame_cnt
,
58 signal(SIGALRM
, alarmhandler
);
64 static void args(int argc
, char *argv
[])
68 for (i
= 1; i
< argc
; i
++) {
69 if (strncmp(argv
[i
], "-n", 2) == 0) {
70 nr_steps
= atoi((argv
[i
]) + 2);
72 else if (strcmp(argv
[i
], "-f") == 0) {
73 glShadeModel(GL_FLAT
);
75 else if (strcmp(argv
[i
], "-fps") == 0) {
78 else if (i
== argc
- 1) {
95 static void Init( void )
103 if ((f
= fopen(filename
, "r")) == NULL
) {
104 fprintf(stderr
, "couldn't open %s\n", filename
);
108 sz
= (GLuint
) fread(buf
, 1, sizeof(buf
), f
);
110 fprintf(stderr
, "file too long\n");
114 fprintf(stderr
, "%.*s\n", sz
, buf
);
116 if (strncmp( buf
, "!!VP", 4 ) == 0) {
118 glBindProgramNV
= (PFNGLBINDPROGRAMNVPROC
) wglGetProcAddress( "glBindProgramNV" );
119 glGenProgramsNV
= (PFNGLGENPROGRAMSNVPROC
) wglGetProcAddress( "glGenProgramsNV" );
120 glLoadProgramNV
= (PFNGLLOADPROGRAMNVPROC
) wglGetProcAddress( "glLoadProgramNV" );
121 glIsProgramNV
= (PFNGLISPROGRAMNVPROC
) wglGetProcAddress( "glIsProgramNV" );
124 glEnable( GL_VERTEX_PROGRAM_NV
);
125 glGenProgramsNV( 1, &prognum
);
126 glBindProgramNV( GL_VERTEX_PROGRAM_NV
, prognum
);
127 glLoadProgramNV( GL_VERTEX_PROGRAM_NV
, prognum
, sz
, (const GLubyte
*) buf
);
128 assert( glIsProgramNV( prognum
) );
132 glBindProgramARB
= (PFNGLBINDPROGRAMARBPROC
) wglGetProcAddress( "glBindProgramARB" );
133 glGenProgramsARB
= (PFNGLGENPROGRAMSARBPROC
) wglGetProcAddress( "glGenProgramsARB" );
134 glProgramStringARB
= (PFNGLPROGRAMSTRINGARBPROC
) wglGetProcAddress( "glProgramStringARB" );
135 glIsProgramARB
= (PFNGLISPROGRAMARBPROC
) wglGetProcAddress( "glIsProgramARB" );
138 glEnable(GL_VERTEX_PROGRAM_ARB
);
140 glGenProgramsARB(1, &prognum
);
142 glBindProgramARB(GL_VERTEX_PROGRAM_ARB
, prognum
);
143 glProgramStringARB(GL_VERTEX_PROGRAM_ARB
, GL_PROGRAM_FORMAT_ASCII_ARB
,
144 sz
, (const GLubyte
*) buf
);
145 assert(glIsProgramARB(prognum
));
148 errno
= glGetError();
149 printf("glGetError = %d\n", errno
);
150 if (errno
!= GL_NO_ERROR
)
154 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB
, &errorpos
);
155 printf("errorpos: %d\n", errorpos
);
156 printf("%s\n", (char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB
));
169 static void make_midpoint( union vert
*out
,
170 const union vert
*v0
,
171 const union vert
*v1
)
174 for (i
= 0; i
< 6; i
++)
175 out
->f
[i
] = v0
->f
[i
] + .5 * (v1
->f
[i
] - v0
->f
[i
]);
178 static void subdiv( union vert
*v0
,
184 glColor3fv(v0
->v
.color
);
185 glVertex3fv(v0
->v
.pos
);
186 glColor3fv(v1
->v
.color
);
187 glVertex3fv(v1
->v
.pos
);
188 glColor3fv(v2
->v
.color
);
189 glVertex3fv(v2
->v
.pos
);
194 make_midpoint(&m
[0], v0
, v1
);
195 make_midpoint(&m
[1], v1
, v2
);
196 make_midpoint(&m
[2], v2
, v0
);
198 subdiv(&m
[0], &m
[2], v0
, depth
-1);
199 subdiv(&m
[1], &m
[0], v1
, depth
-1);
200 subdiv(&m
[2], &m
[1], v2
, depth
-1);
201 subdiv(&m
[0], &m
[1], &m
[2], depth
-1);
206 #define ASSIGN_3V( V, V0, V1, V2 ) \
213 static void Display( void )
215 glClearColor(0.3, 0.3, 0.3, 1);
216 glClear( GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
218 glBegin(GL_TRIANGLES
);
224 ASSIGN_3V(v
[0].v
.color
, 0,0,1);
225 ASSIGN_3V(v
[0].v
.pos
, 0.9, -0.9, 0.0);
226 ASSIGN_3V(v
[1].v
.color
, 1,0,0);
227 ASSIGN_3V(v
[1].v
.pos
, 0.9, 0.9, 0.0);
228 ASSIGN_3V(v
[2].v
.color
, 0,1,0);
229 ASSIGN_3V(v
[2].v
.pos
, -0.9, 0, 0.0);
231 subdiv(&v
[0], &v
[1], &v
[2], nr_steps
);
245 static void Reshape( int width
, int height
)
247 glViewport( 0, 0, width
, height
);
248 glMatrixMode( GL_PROJECTION
);
250 glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
251 glMatrixMode( GL_MODELVIEW
);
253 /*glTranslatef( 0.0, 0.0, -15.0 );*/
257 static void Key( unsigned char key
, int x
, int y
)
272 int main( int argc
, char *argv
[] )
274 glutInit( &argc
, argv
);
275 glutInitWindowPosition( 0, 0 );
276 glutInitWindowSize( 250, 250 );
277 glutInitDisplayMode( GLUT_RGB
| GLUT_SINGLE
| GLUT_DEPTH
);
278 glutCreateWindow(argv
[argc
-1]);
279 glutReshapeFunc( Reshape
);
280 glutKeyboardFunc( Key
);
281 glutDisplayFunc( Display
);
286 signal(SIGALRM
, alarmhandler
);