/* * mesacube - THE spinning cube * * Build: * cc -O2 -I$HOME/mesa/include -I$HOME -o cube cube.c \ * $HOME/mesa/lib/libGL.a -lm * * Run: VERITE_UCODE=$HOME/v2000gl.uc \ * ./cube [seconds] (0 = spin until ^C) */ #include #include #include #include #include #include #include static volatile sig_atomic_t stop; static void onint(int sig) { (void)sig; stop = 1; } static const GLfloat faces[6][4][3] = { { {-1,-1,-1},{-1, 1,-1},{ 1, 1,-1},{ 1,-1,-1} }, /* -Z */ { {-1,-1, 1},{ 1,-1, 1},{ 1, 1, 1},{-1, 1, 1} }, /* +Z */ { {-1,-1,-1},{-1,-1, 1},{-1, 1, 1},{-1, 1,-1} }, /* -X */ { { 1,-1,-1},{ 1, 1,-1},{ 1, 1, 1},{ 1,-1, 1} }, /* +X */ { {-1,-1,-1},{ 1,-1,-1},{ 1,-1, 1},{-1,-1, 1} }, /* -Y */ { {-1, 1,-1},{-1, 1, 1},{ 1, 1, 1},{ 1, 1,-1} }, /* +Y */ }; int main(int argc, char **argv) { vrMesaContext ctx; struct timeval t0, t1, tstart; float a = 20.0f, b = 30.0f; double secs = 30.0; int frame = 0, f, i; if (argc > 1) secs = atof(argv[1]); signal(SIGINT, onint); ctx = vrMesaCreateContext(NULL); if (ctx == NULL) return 1; vrMesaMakeCurrent(ctx); printf("GL_RENDERER: %s (%s)\n", glGetString(GL_RENDERER), glGetString(GL_VERSION)); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glClearColor(0.06f, 0.07f, 0.12f, 1); glViewport(0, 0, 640, 480); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-1.0, 1.0, -0.75, 0.75, 1.0, 50.0); gettimeofday(&tstart, NULL); t0 = tstart; while (!stop) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0, 0, -4.5f); glRotatef(a, 1, 0, 0); glRotatef(b, 0, 1, 0); glBegin(GL_QUADS); for (f = 0; f < 6; f++) for (i = 0; i < 4; i++) { const GLfloat *v = faces[f][i]; /* corner color = position in RGB space */ glColor3f((v[0] + 1) * 0.5f, (v[1] + 1) * 0.5f, (v[2] + 1) * 0.5f); glVertex3fv(v); } glEnd(); vrMesaSwapBuffers(); a += 1.1f; b += 1.7f; if (++frame % 100 == 0) { double dt; gettimeofday(&t1, NULL); dt = (t1.tv_sec - t0.tv_sec) + (t1.tv_usec - t0.tv_usec) / 1e6; printf("%d frames, %.1f fps\n", frame, 100.0 / dt); t0 = t1; } if (secs > 0) { gettimeofday(&t1, NULL); if ((t1.tv_sec - tstart.tv_sec) + (t1.tv_usec - tstart.tv_usec) / 1e6 >= secs) break; } } printf("mesacube done after %d frames\n", frame); vrMesaDestroyContext(ctx); return 0; }