Download - OpenGL Event Driven Programming

Transcript
Page 1: OpenGL Event Driven Programming

OpenGLEvent Driven Programming

Program responds to events Events are handled by user defined callback

functions Callbacks must know context and event type

(passed through variables)

Page 2: OpenGL Event Driven Programming

Event Driven Programming

MainEventLoop

DisplayHandler

KeyboardHandler

MouseHandler

Page 3: OpenGL Event Driven Programming

Simple Example

Displaying a squareint main (int argc, char *argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); int windowHandle = glutCreateWindow("Simple GLUT App");

glutDisplayFunc(redraw);

glutMainLoop();

return 0;}

Page 4: OpenGL Event Driven Programming

Display Callback

Called when window is redrawnvoid redraw(){ glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); glColor3f(1, 0, 0); glVertex3f(-0.5, 0.5, 0.5); glVertex3f(0.5, 0.5, 0.5); glVertex3f(0.5, -0.5, 0.5); glVertex3f(-0.5, -0.5, 0.5); glEnd(); // GL_QUADS glutSwapBuffers();}

Page 5: OpenGL Event Driven Programming

More GLUT

Additional GLUT functions glutPositionWindow(int x,int y); glutReshapeWindow(int w, int h);

Additional callback functions glutReshapeFunction(reshape); glutMouseFunction(mousebutton); glutMotionFunction(motion); glutKeyboardFunction(keyboardCB); glutSpecialFunction(special); glutIdleFunction(animate);

Page 6: OpenGL Event Driven Programming

Reshape Callback

Called when the window is resizedvoid reshape(int w, int h){ glViewport(0.0,0.0,w,h);

glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0,w,0.0,h, -1.0, 1.0);

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }

Page 7: OpenGL Event Driven Programming

Mouse Callbacks

Called when the mouse button is pressedvoid mousebutton(int button, int state, int x, int y){ if (button==GLUT_LEFT_BUTTON && state==GLUT_DOWN) { rx = x; ry = winHeight - y; }}

Called when the mouse is moved with button downvoid motion(int x, int y){ rx = x; ry = winHeight - y;}

Page 8: OpenGL Event Driven Programming

Keyboard Callbacks

Called when a button is pressedvoid keyboardCB(unsigned char key, int x, int y){ switch(key) { case 'a': cout<<"a Pressed"<<endl; break; }}

Called when a special button is pressedvoid special(int key, int x, int y){ switch(key) { case GLUT_F1_KEY:

cout<<“F1 Pressed"<<endl; break; }}

Page 9: OpenGL Event Driven Programming

Animation Callbacks

Called when the system is idlevoid animationCB(){ float time = glutGet(GLUT_ELAPSED_TIME); glRotated(time,0.0,1.0,0.0); glutPostRedisplay();}

Page 10: OpenGL Event Driven Programming

Menu Callbacks

Creating a menu enum { M_NONE, M_OPEN, M_SAVE, M_EXIT }; glutCreateMenu(menuFunc); glutAddMenuEntry("Open", M_OPEN); glutAddMenuEntry("-----------------------", M_NONE); glutAddMenuEntry("Exit", M_EXIT); glutAttachMenu(GLUT_RIGHT_BUTTON);

Called when a menu button is pressedvoid menuFunc(int value){ switch(value) { case M_EXIT: exit(0); break; }}