It’s all quite integrated into a large application, but here is a bit of code:
int main( int argc, char *argv[] )
{
pthread_t sm_thread;
int sm_rc;
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH );
glutInitWindowSize( CM_WIDTH, CM_HEIGHT );
glutInitWindowPosition( 100, 100 );
glutCreateWindow( "Window" );
glInit();
// Additional thread to do some non-opengl stuff.
sm_rc = pthread_create( &sm_thread, NULL, smMain, NULL );
if( sm_rc )
{
printf( "main.c main: %d
", sm_rc );
exit( -1 );
}
glutDisplayFunc( glDisplay );
glutReshapeFunc( glReshape );
glutIdleFunc( glIdle );
glutMainLoop();
return 0;
}
GLvoid glInit( GLvoid )
{
// initialise quadrics etc (depth test and what not enabled too)
disk_quadric = gluNewQuadric();
cylinder_quadric = gluNewQuadric();
sphere_quadric = gluNewQuadric();
// set up framebuffer
...
// set up display lists
...
... etc ...
}
GLvoid glDisplay( GLvoid )
{
if( stuff_to_render )
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_MODELVIEW );
cmRenderToFrameBuffer();
glPushMatrix();
{
... then render contents of texture bound to framebuffer
(via display list)...
}
glPopMatrix();
glutSwapBuffers();
}
}
GLvoid glReshape( GLint width, GLint height )
{
GLfloat w, h;
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
w = ( ( GLfloat ) width / ( GLfloat ) height );
h = ( ( GLfloat ) height / ( GLfloat ) width );
glFrustum( -w, w, -h, h, 5.0f, 60.0f );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 0.0f, 0.0f, -10.0f );
}
GLvoid glIdle( GLvoid )
{
glutPostRedisplay();
}
GLvoid cmRenderToFrameBuffer()
{
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb );
glClear( GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_MODELVIEW );
glPushMatrix();
{
glCallList( cylinder );
.. etc ..
}
glPopMatrix();
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
}
GLvoid cmCylinder( GLvoid )
{
glRotated( 90.0, 1.0, 0.0, 0.0 );
gluCylinder( cylinder_quadric, 0.2, 0.2, 0.15, 20, 1 );
gluDisk( disk_quadric, 0.0, 0.2, 25, 5 );
glTranslatef( 0.0f, 0.0f, 0.15f );
gluDisk( disk_quadric, 0.0, 0.2, 25, 5 );
}
GLvoid cmSphere( GLvoid )
{
gluSphere( sphere_quadric, 0.2, 20, 20 );
}
GLvoid cmQuadFace( GLvoid )
{
glPushMatrix();
{
glBegin( GL_QUADS );
{
glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 0.0f, 0.0f, 0.0f );
glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 1.0, 0.0f, 0.0f );
glTexCoord2f( 1.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, 0.0f );
glTexCoord2f( 0.0f, 1.0f ); glVertex3f( 0.0f, 1.0f, 0.0f );
}
glEnd();
}
glPopMatrix();
}
Thanks again,
-Ross