5.9 Proxy and paging nodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.10 Customizing your own NodeKits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.11 The visitor design pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.12 Visiting scene graph structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.13 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6 Chapter 6: Creating Realistic Rendering Effects 59
6.1 Encapsulating the OpenGL state machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.2 Attributes and modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.3 Inheriting render states . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.4 Playing with fixed-function effects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.5 Lights and light sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.6 The Image class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
6.7 The basis of texture mapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
6.8 Handling rendering order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
6.9 Understanding graphics shaders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
6.10 Using uniforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
6.11 Working with the geometry shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.12 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
7 Chapter 7: Viewing the World 89
7.1 From world to screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.2 The Camera class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
7.3 Rendering order of cameras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
7.4 Using a single viewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
7.5 Digging into the simulation loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
7.6 Using a composite viewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
7.7 Changing global display settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
7.8 Stereo visualization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
7.9 Rendering to textures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
7.10 Frame buffer, pixel buffer, and FBO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
7.11 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
8 Chapter 8: Animating Scene Objects 113
8.1 Taking references to functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
8.2 List of callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
8.3 Avoding confilicting modifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
8.4 Understanding ease motions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
8.5 Animating the transformation nodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
8.6 Changing rendering states . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
8.7 Playing movies on textures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
8.8 Creating complex key-frame animations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
8.9 Channels and animation managers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
8.10 Loading and rendering characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
8.11 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
9 Chatper 9: Interacting with Outside Elements 143
9.1 Various events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
9.2 Handling mouse and keyboard inputs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
9.3 Adding customized events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
9.4 Picking objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
9.5 Intersection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
9.6 Windows, graphics contexts, and cameras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
9.7 The Traits class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
9.8 Integrating OSG into a window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
ii