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);