Is there any difference between calling glutPostRedisplay() at the end of my display function and using an idle function callback that does nothing but call my display function? I have seen both ways used in examples and cannot tell the difference by observation.
1 Answers
A main loop generally looks like this:
Process and handle events
calling stuff like
glutKeyboardFunc
/glutMouseFunc
.Advance/update 3D state (physics/animation etc)
typically in
glutIdleFunc
Re-draw the scene if needed
use
glutDisplayFunc
glutPostRedisplay
simply sets a flag, that tells glut to call the display callback on the next loop iteration. It doesn't actually call display [1] [2].
If you have a game, which always updates every frame this might not be that useful. Maybe if you're alt-tabbed or dragging the window you don't need to be calling display. Or you might be frame limiting by dropping frames (although I'd suggest this).
void idle()
{
...
animatedThing.value += deltaTime
glutPostRedisplay(); //scene is always changing. always call display
}
Having a "dirty" flag becomes more useful when you don't need to re-render continuously. Maybe in something like a 3D modelling package where there isn't any animation and you only move the camera occasionally. Or a GUI where you only need to update when you hover and click on stuff.
void mousedown(int button, int state, int x, int y)
{
if (clickedGUI(x, y))
glutPostRedisplay();
}
void idle()
{
...
if (myKeys[MOVE_VIEW_FORWARD])
{
view.z -= deltaTime;
glutPostRedisplay();
}
}
Anyway, to answer your question, no, there's probably not much difference. However...
I'd put the
glutPostRedisplay
inidle
as above. Calling from withindisplay
works but gives up some control you might want later. It's essentially this:bool shouldDraw = true; while (1) { // check events, input etc // idle/update state if (shouldDraw) { shouldDraw = false; // draw shouldDraw = true; } }
I also wouldn't call
display
fromidle
from a design perspective as it removes some control from glut. For example if there's a case where glut needs to override the post-redisplay (not that I know of one) it won't be able to.
-
Awesome, thanks. I actually use GLUT more for sketching out animated scenes so I am interested in the most-minimal form of a graphics program. For now, that is just displayFunc and keyboardFunc. I also use CGLSetParameter(kCGLCPSwapInterval) to lock rendering to 60Hz on the vsync. I appreciate reading about other, more elaborate uses of GLUT though! – Aug 25 '15 at 18:46