Title: Graphics Programming
1Graphics Programming
Input and Interaction
2Interaction
- Early 60s, Ivan Sutherlands Project Sketchpad
- Basic Paradigm User see an image, reacts with an
interactive device, image changes in response to
input, . . .
3Interaction
- OpenGL does not support interaction directly
- Increase portability work in a variety of
environments - Windowing and input functions left out of API
emphasis on rendering - Use toolkits, GLUT
4Physical Input Devices
- Pointing Device indicates position on screen
- Keyboard Device return character codes to a
program
5Logical Input Devices
- Major Characteristics
- What measurements the device returns to the
program - When the device returns those measurements
6Application Input
- Measure - what the device returns to the program
- Trigger signal send to the computer
- Three distinct modes defined by the relationship
between the measure process and the trigger. - Request Mode, Sample Mode, Event Mode
7Request Mode
- The measure of the device is not returned to the
program until the device is triggered
8Sample Mode
- Measure is returned immediately after the
function is called in the user program (device
sample). - No trigger needed
- Useful in apps where the program guides the user
9Event Mode
- Can handle multiple inputs
- When device triggered an event is generated
- Identifier for device placed in the event queue
- Event queue process is independent of the
application, asynchronous - A callback function associated with a specific
type of event
10Event-Driven Programming
- Callback functions implement how the application
program responds to events - Examples, each of the events below needs a
callback function to handle it.Pointing
EventsWindow EventsKeyboard EventsDisplay
Idle Events
11Pointing Device
- Almost always a mouse
- Move event when mouse is moved with button
depressed - Passive Move Event move without pressing
button - Mouse Event mouse button is depressed or
released glutMouseFunc (mouse)
12Pointing Device Mouse Callback
void mouse(int btn, int state, int x, int y)
if (btnGLUT_RIGHT_BUTTON
stateGLUT_DOWN) exit(0)
Depressing the right Button terminates the program
13Register callbacks
int main(int argc, char argv)
glutInit(argc,argv)
glutInitDisplayMode (GLUT_SINGLE
GLUT_RGB) glutCreateWindow("square")
myinit () glutReshapeFunc (myReshape)
glutMouseFunc (mouse) glutMotionFunc(drawSqu
are) glutDisplayFunc(display)
glutMainLoop()
Called whenever thewindow is resized
14Window Events(Resizing Dragging)
- Redraw all the objects?
- How do we handle aspect ratio?
- Change size of attributes and primitives?
15Square Program Example
- This program illustrates the use of the glut
library for interfacing with a Window System - The program opens a window, clears it to
black,then draws a box at the location of the
mouse each time the left button is clicked. The
right button exits the program - The program also reacts correctly when the window
is moved or resized by clearing the new window to
black
16Global Variables
/ globals / GLsizei wh 500, ww 500 /
initial window size / GLfloat size 3.0 /
half side length of square /
- Size of window
- Viewport position and size
- Size of clipping window
17Window Event Reshape Examplechange clipping
wndw to match screen wndw, viewport matches new
aspect ratio, whole screen wndw
void myReshape(GLsizei w, GLsizei h) / adjust
clipping box / glMatrixMode(GL_PROJECTION)
glLoadIdentity() glOrtho(0.0,
(GLdouble)w, 0.0, (GLdouble)h, -1.0, 1.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity() / adjust viewport and clear
/ glViewport(0,0,w,h) glClearColor (0.0,
0.0, 0.0, 1.0) glClear(GL_COLOR_BUFFER_BIT)
glFlush() / set global size for use by
drawing routine / ww w wh h
reshaping routine called with glutReshapeFunc
(myReshape) whenever window is resized or moved
18Pointing Device Motion Callback
Examplewhenever mouse dragged and button down
draw random color square at the mouse position
Called with glutMotionFunc(drawSquare)if
button held down
void drawSquare(int x, int y) ywh-y
glColor3ub( (char) rand()256, (char) rand()256,
(char) rand()256) glBegin(GL_POLYGON)
glVertex2f(xsize, ysize) glVertex2f(x-size,
ysize) glVertex2f(x-size, y-size)
glVertex2f(xsize, y-size) glEnd()
glFlush()
19Keyboard Events
void keyboard(unsigned char key, int x, int y)
if (key'q' key'Q') exit(0) glutKe
yboardFunc(keyboard)
20Window Management
idglutCreateWindow(second window) glutSetWind
ow(id)
21Menus
- Pop-up menus
- Common Steps
- Define the entries
- Link the menu to a mouse button
- Define callback function
22Registering a menu callback and defining a menu
identifier passed to callback
- glutCreateMenu(demo_menu)
- glutAddMenuEntry(quit, 1)
- glutAddMenuEntry(increase square size, 2)
- glutAddMenuEntry(decrease square size, 3)
- glutAttachMenu(GLUT_RIGHT_BUTTON)
- demo_menu is the callback function for the menu
- The menu appears on right-button mouse click
23Menus
void demo_menu(int id) if (id1)
exit (0) if (id2) size 2
size else if (size gt 1) size
size/2 glutPostRedisplay( )
24Hierarchical Menus
top_menu
size_menu
25Hierarchical Menus
- GLint sub_menu glutCreateMenu(size_menu)
- glutAddMenuEntry(increase square size, 1)
- glutAddMenuEntry(decrease square size, 2)
- glutCreateMenu(top_menu)
- glutAddMenuEntry(quit, 1)
- glutAddSubMenu(Resize, sub_menu)
- glutAttachMenu(GLUT_RIGHT_BUTTON)
- top_menu and size_menu are callback functions for
the top- and the sub-menus, respectively
26Picking
- Picking identify an object on the display
- Dont return an x,y position, pick an object
- NOT an easy process
- Two methods selection and bounding rectangles.
27Selection
- Adjusting the clipping region and viewport to
keep track of which primitives in a small
clipping region are rendered into a region near
the cursor. Primitives are entered into a hit
list to be examined by the user program later on.
28Animation Using idle callback and double
bufferingExample Rotating Cube Program
- We want to create animation
- We continuously keep changing the value of
29Spin the square globals
- define PI 3.141592
- GLdouble theta 0 // rotation
angle - GLsizei wnd_w 500 // display window
width - GLsizei wnd_h 500 // display window
height - GLfloat spin_speed PI/180 // incerement for
angle in rad
30Spin square prototypes
- void help()
//print instructions - void myinit()
// OpenGL init - void display()
// display callback - void myreshape(GLsizei, GLsizei) // reshape
callback - void update_angle() //
idle callback - void control_speed(GLubyte, GLint, GLint) //
keybrd callback
31Spin square reshape callback
- / keep the viewport aspect ratio 1, so square
does not get distorted / - void myreshape(GLsizei w, GLsizei h)
-
- wnd_w w wnd_h h
-
- if (h lt w)
- wh
- // adjust viewport (to preserve aspect ratio 1),
and clear. - glViewport(0, 0, w, w)
-
- glutPostRedisplay()
-
32Spin square keyboard callback
- // keyboard callback increase speed, decrease
speed or quit - void control_speed(GLubyte key, GLint x, GLint y)
-
- switch (key)
- case('q')
- case('Q') exit (0) break
- case('s')
- case('S') spin_speed 2 break
- case('d')
- case( 'D') spin_speed / 2
-
- glutPostRedisplay( )
33Spin square idle callback
- // idle callback
- void update_angle(void)
-
- theta spin_speed
- if (thetagt2PI) theta- 2PI
-
- glutPostRedisplay()
-
- glutIdleFunc(update_angle)
34Double Buffering
- A complex display may not be drawn in a single
refresh cycle - Double Buffering solves the problem
- Assume two frame buffers front buffer and back
buffer - Swap these from the application program invoking
a display callback
35Double Buffering
void display(void) / display callback, clear
frame buffer and z buffer, / / rotate cube
and draw, swap buffers / glClear(GL_COLOR_BU
FFER_BIT GL_DEPTH_BUFFER_BIT) . . .
glRotatef(theta2, 0.0, 0.0, 1.0)
colorcube() glFlush()
glutSwapBuffers() glutInitDisplayMode(GLUT_DO
UBLE GLUT_RGB)
Updating back buffer and swapping
36Spin square double buffering
- void display()
-
- glClear(GL_COLOR_BUFFER_BIT)
-
- glBegin(GL_POLYGON)
- glColor3f(1.0, 0.0, 0.0)
- glVertex2d(cos(theta), sin(theta))
- glColor3f(0.0, 0.1, 0.0)
- glVertex2d(-sin(theta), cos(theta))
- glColor3f(1.0, 0.0, 1.0)
- glVertex2d(-cos(theta), -sin(theta))
- glColor3f(1.0, 1.0, 0.0)
- glVertex2d(sin(theta), -cos(theta))
- glEnd()
-
- glutSwapBuffers()
37Spin square register callbacks
- int main(int argc, char argv)
-
- glutInit(argc, argv)
- glutInitDisplayMode(GLUT_DOUBLEGLUT_RGB)
- glutInitWindowSize(wnd_w,wnd_h)
- glutInitWindowPosition(0,0)
- glutCreateWindow("spinning square, speed control
with menu") -
- myinit()
-
- glutDisplayFunc(display)
- glutReshapeFunc(myreshape)
- glutIdleFunc(update_angle)
- glutKeyboardFunc(control_speed)
-
- glutMainLoop()
- return 0
38Good Interactive Programs
- Smooth display
- Interactive devices
- Variety of methods to input data
- Easy-to-use interface
- Feedback to user (help)
- Human consideration (HCI)