| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- /* Timer demo
- *
- * Written by John Tsiombikas <nuclear@member.fsf.org>
- *
- * Demonstrate the use of glutTimerFunc, by changing the color of the
- * framebuffer every (approximately) 1 sec.
- */
- #include <stdio.h>
- #include <GL/glut.h>
- void disp(void);
- void timer_func(int unused);
- /* color index will be advanced every time the timer expires */
- int cidx = 0;
- int pcidx = 2;
- float color[][3] = {
- {1, 0, 0},
- {0, 1, 0},
- {0, 0, 1},
- {1, 1, 0},
- {0, 1, 1},
- {1, 0, 1}
- };
- int timerInts[] = {
- 250,
- 500,
- 1000
- };
- int timerSurroundInt = 1000, timerCenterInt = 1000;
- /* menu IDs, creation/update funcs and callback */
- int menuID, subMenuSurround, subMenuCenter;
- void createMenuEntries(int which)
- {
- int i;
- for (i = 0; i < sizeof(timerInts) / sizeof(*timerInts); i++)
- {
- char temp[10] = {'\0'};
- /* flag current value */
- if ((which == 1 ? timerSurroundInt : timerCenterInt) == timerInts[i])
- temp[0] = '+';
- else
- temp[0] = '-';
- sprintf(temp + 1, " %4d ms", timerInts[i]);
- glutAddMenuEntry(temp, timerInts[i]);
- }
- }
- void updateMenuEntries(int which)
- {
- int i;
- for (i = 0; i < sizeof(timerInts) / sizeof(*timerInts); i++)
- {
- char temp[10] = { '\0' };
- /* flag current value */
- if ((which == 1 ? timerSurroundInt : timerCenterInt) == timerInts[i])
- temp[0] = '+';
- else
- temp[0] = '-';
- sprintf(temp + 1, " %4d ms", timerInts[i]);
- glutChangeToMenuEntry(i+1, temp, timerInts[i]);
- }
- }
- void MenuSurround(int timerInt)
- {
- timerSurroundInt = timerInt;
- glutSetMenu(subMenuSurround);
- updateMenuEntries(1);
- }
- void MenuCenter(int timerInt)
- {
- timerCenterInt = timerInt;
- glutSetMenu(subMenuCenter);
- updateMenuEntries(2);
- }
- int main(int argc, char **argv)
- {
- glutInit(&argc, argv);
- glutInitWindowSize(128, 128);
- glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
- glutCreateWindow("timer test");
- glutDisplayFunc(disp);
- /* get timer started, its reset in the timer function itself */
- glutTimerFunc(1000, timer_func, 1);
- glutTimerFunc(500, timer_func, 2);
- /* menus for setting timing */
- subMenuSurround = glutCreateMenu(MenuSurround);
- createMenuEntries(1);
- subMenuCenter = glutCreateMenu(MenuCenter);
- createMenuEntries(2);
- menuID = glutCreateMenu(MenuSurround); /* doesn't matter, no clickable entries in this menu */
- glutAddSubMenu("Center", subMenuCenter);
- glutAddSubMenu("Surround", subMenuSurround);
- glutAttachMenu(GLUT_RIGHT_BUTTON);
- glutMainLoop();
- return 0;
- }
- void disp(void)
- {
- glClearColor(color[cidx][0], color[cidx][1], color[cidx][2], 1);
- glClear(GL_COLOR_BUFFER_BIT);
- glPointSize(10.f);
- glColor3f(color[pcidx][0], color[pcidx][1], color[pcidx][2]);
- glBegin(GL_POINTS);
- glVertex2i(0,0);
- glEnd();
- glutSwapBuffers();
- }
- void timer_func(int which)
- {
- /* advance the color index and trigger a redisplay */
- switch (which)
- {
- case 1:
- cidx = (cidx + 1) % (sizeof color / sizeof *color);
- break;
- case 2:
- pcidx = (pcidx + 1) % (sizeof color / sizeof *color);
- break;
- }
-
- glutPostRedisplay();
- /* (re)set the timer callback and ask glut to call it in x ms */
- glutTimerFunc(which == 1 ? timerSurroundInt:timerCenterInt, timer_func, which);
- }
|