2 * Random rendering, to check for crashes, hangs, etc.
18 static GLboolean Anim
= GL_TRUE
;
19 static int Width
= 200, Height
= 200;
21 static int MinVertexCount
= 0, MaxVertexCount
= 1000;
30 static int BufferSize
= 10000;
31 static struct vertex
*Vbuffer
= NULL
;
32 static int Vcount
, Vprim
;
52 * This can be called from within gdb after a crash:
53 * (gdb) call ReportState()
63 { GL_ALPHA_TEST
, "GL_ALPHA_TEST", GL_INT
},
64 { GL_BLEND
, "GL_BLEND", GL_INT
},
65 { GL_CLIP_PLANE0
, "GL_CLIP_PLANE0", GL_INT
},
66 { GL_DEPTH_TEST
, "GL_DEPTH_TEST", GL_INT
},
67 { GL_LIGHTING
, "GL_LIGHTING", GL_INT
},
68 { GL_LINE_WIDTH
, "GL_LINE_WIDTH", GL_FLOAT
},
69 { GL_POINT_SIZE
, "GL_POINT_SIZE", GL_FLOAT
},
70 { GL_SHADE_MODEL
, "GL_SHADE_MODEL", GL_INT
},
71 { GL_SCISSOR_TEST
, "GL_SCISSOR_TEST", GL_INT
},
77 for (i
= 0; state
[i
].token
; i
++) {
78 if (state
[i
].type
== GL_INT
) {
80 glGetIntegerv(state
[i
].token
, &v
);
81 printf("%s = %d\n", state
[i
].str
, v
);
85 glGetFloatv(state
[i
].token
, &v
);
86 printf("%s = %f\n", state
[i
].str
, v
);
92 PrintVertex(const char *f
, const struct vertex
*v
, int sz
)
96 for (i
= 0; i
< sz
; i
++) {
97 printf("%g%s", v
->v
[i
], (i
== sz
-1) ? "" : ", ");
103 * This can be called from within gdb after a crash:
104 * (gdb) call ReportState()
110 for (i
= 0; i
< Vcount
; i
++) {
111 switch (Vbuffer
[i
].type
) {
113 printf("glBegin(%d);\n", (int) Vbuffer
[i
].v
[0]);
116 printf("glEnd();\n");
119 PrintVertex("glVertex2f", Vbuffer
+ i
, 2);
122 PrintVertex("glVertex3f", Vbuffer
+ i
, 3);
125 PrintVertex("glVertex4f", Vbuffer
+ i
, 4);
128 PrintVertex("glColor3f", Vbuffer
+ i
, 3);
131 PrintVertex("glColor4f", Vbuffer
+ i
, 4);
134 PrintVertex("glTexCoord2f", Vbuffer
+ i
, 2);
137 PrintVertex("glTexCoord3f", Vbuffer
+ i
, 3);
140 PrintVertex("glTexCoord4f", Vbuffer
+ i
, 4);
143 PrintVertex("glSecondaryColor3f", Vbuffer
+ i
, 3);
146 PrintVertex("glNormal3f", Vbuffer
+ i
, 3);
164 RandomFloat(float min
, float max
)
166 int k
= rand() % 10000;
167 float x
= min
+ (max
- min
) * k
/ 10000.0;
172 * Return true if random number in [0,1] is <= percentile.
175 RandomChoice(float percentile
)
177 return RandomFloat(0.0, 1.0) <= percentile
;
181 RandomStateChange(void)
183 int k
= RandomInt(19);
192 glEnable(GL_ALPHA_TEST
);
195 glEnable(GL_ALPHA_TEST
);
198 glEnable(GL_DEPTH_TEST
);
201 glEnable(GL_DEPTH_TEST
);
204 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
219 glEnable(GL_LIGHTING
);
222 glDisable(GL_LIGHTING
);
225 glEnable(GL_SCISSOR_TEST
);
228 glDisable(GL_SCISSOR_TEST
);
231 glEnable(GL_CLIP_PLANE0
);
234 glDisable(GL_CLIP_PLANE0
);
237 glShadeModel(GL_FLAT
);
240 glShadeModel(GL_SMOOTH
);
247 RandomPrimitive(void)
250 int len
= MinVertexCount
+ RandomInt(MaxVertexCount
- MinVertexCount
);
252 Vprim
= RandomInt(10);
255 Vbuffer
[Vcount
].type
= BEGIN
;
256 Vbuffer
[Vcount
].v
[0] = Vprim
;
259 for (i
= 0; i
< len
; i
++) {
260 int k
= RandomInt(9);
261 Vbuffer
[Vcount
].v
[0] = RandomFloat(-3, 3);
262 Vbuffer
[Vcount
].v
[1] = RandomFloat(-3, 3);
263 Vbuffer
[Vcount
].v
[2] = RandomFloat(-3, 3);
264 Vbuffer
[Vcount
].v
[3] = RandomFloat(-3, 3);
267 glVertex2fv(Vbuffer
[Vcount
].v
);
268 Vbuffer
[Vcount
].type
= VERTEX2
;
271 glVertex3fv(Vbuffer
[Vcount
].v
);
272 Vbuffer
[Vcount
].type
= VERTEX3
;
275 glVertex4fv(Vbuffer
[Vcount
].v
);
276 Vbuffer
[Vcount
].type
= VERTEX4
;
279 glColor3fv(Vbuffer
[Vcount
].v
);
280 Vbuffer
[Vcount
].type
= COLOR3
;
283 glColor4fv(Vbuffer
[Vcount
].v
);
284 Vbuffer
[Vcount
].type
= COLOR4
;
287 glTexCoord2fv(Vbuffer
[Vcount
].v
);
288 Vbuffer
[Vcount
].type
= TEX2
;
291 glTexCoord3fv(Vbuffer
[Vcount
].v
);
292 Vbuffer
[Vcount
].type
= TEX3
;
295 glTexCoord4fv(Vbuffer
[Vcount
].v
);
296 Vbuffer
[Vcount
].type
= TEX4
;
299 glSecondaryColor3fv(Vbuffer
[Vcount
].v
);
300 Vbuffer
[Vcount
].type
= SECCOLOR3
;
303 glNormal3fv(Vbuffer
[Vcount
].v
);
304 Vbuffer
[Vcount
].type
= NORMAL3
;
311 if (Vcount
>= BufferSize
- 2) {
317 Vbuffer
[Vcount
++].type
= END
;
327 GLboolean dlist
= RandomChoice(0.1);
329 glNewList(1, GL_COMPILE
);
330 for (i
= 0; i
< 3; i
++) {
356 /* cut & paste temp code here */
359 assert(glGetError() == 0);
369 Reshape(int width
, int height
)
373 glViewport(0, 0, width
, height
);
374 glScissor(20, 20, Width
-40, Height
-40);
375 glMatrixMode(GL_PROJECTION
);
377 glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
378 glMatrixMode(GL_MODELVIEW
);
380 glTranslatef(0.0, 0.0, -15.0);
385 Key(unsigned char key
, int x
, int y
)
391 glutDestroyWindow(Win
);
402 static const GLdouble plane
[4] = {1, 1, 0, 0};
403 glDrawBuffer(GL_FRONT
);
404 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
406 glClipPlane(GL_CLIP_PLANE0
, plane
);
408 Vbuffer
= (struct vertex
*)
409 malloc(BufferSize
* sizeof(struct vertex
));
411 /* silence warnings */
418 ParseArgs(int argc
, char *argv
[])
421 for (i
= 1; i
< argc
; i
++) {
422 if (strcmp(argv
[i
], "-s") == 0) {
423 int j
= atoi(argv
[i
+ 1]);
424 printf("Random seed value: %d\n", j
);
428 else if (strcmp(argv
[i
], "-a") == 0) {
430 MinVertexCount
= atoi(argv
[i
]);
432 else if (strcmp(argv
[i
], "-b") == 0) {
434 MaxVertexCount
= atoi(argv
[i
]);
441 main(int argc
, char *argv
[])
443 glutInit(&argc
, argv
);
444 glutInitWindowPosition(0, 0);
445 glutInitWindowSize(Width
, Height
);
446 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
| GLUT_DEPTH
);
447 Win
= glutCreateWindow(argv
[0]);
449 ParseArgs(argc
, argv
);
450 glutReshapeFunc(Reshape
);
451 glutKeyboardFunc(Key
);
452 glutDisplayFunc(Draw
);