void Display( ) { glutSetWindow( MainWindow ); glDrawBuffer( GL_BACK ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glEnable( GL_DEPTH_TEST ); glShadeModel( GL_FLAT ); GLsizei vx = glutGet( GLUT_WINDOW_WIDTH ); GLsizei vy = glutGet( GLUT_WINDOW_HEIGHT ); GLsizei v = vx < vy ? vx : vy; // minimum dimension GLint xl = ( vx - v ) / 2; GLint yb = ( vy - v ) / 2; glViewport( xl, yb, v, v ); glMatrixMode( GL_PROJECTION ); glLoadIdentity( ); if( WhichProjection == ORTHO ) glOrtho( -300., 300., -300., 300., 0.1, 2000. ); else gluPerspective( 50., 1., 0.1, 2000. ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity( ); gluLookAt( 0., -100., 800., 0., -100., 0., 0., 1., 0. ); glTranslatef( (GLfloat)TransXYZ[0], (GLfloat)TransXYZ[1], -(GLfloat)TransXYZ[2] ); glRotatef( (GLfloat)Yrot, 0., 1., 0. ); glRotatef( (GLfloat)Xrot, 1., 0., 0. ); glMultMatrixf( (const GLfloat *) RotMatrix ); glScalef( (GLfloat)Scale, (GLfloat)Scale, (GLfloat)Scale ); float scale2 = 1. + Scale2; // because glui translation starts at 0. if( scale2 < MINSCALE ) scale2 = MINSCALE; glScalef( (GLfloat)scale2, (GLfloat)scale2, (GLfloat)scale2 ); glDisable( GL_FOG ); if( AxesOn != GLUIFALSE ) glCallList( AxesList ); // **************************************** // Here is where you draw the current state of the particles: // **************************************** glBindBuffer( GL_ARRAY_BUFFER, hPobj ); glVertexPointer( 4, GL_FLOAT, 0, (void *)0 ); glEnableClientState( GL_VERTEX_ARRAY ); glBindBuffer( GL_ARRAY_BUFFER, hCobj ); glColorPointer( 4, GL_FLOAT, 0, (void *)0 ); glEnableClientState( GL_COLOR_ARRAY ); glPointSize( 3. ); glDrawArrays( GL_POINTS, 0, NUM_PARTICLES ); glPointSize( 1. ); glDisableClientState( GL_VERTEX_ARRAY ); glDisableClientState( GL_COLOR_ARRAY ); glBindBuffer( GL_ARRAY_BUFFER, 0 ); glCallList( SphereList ); if( ShowPerformance ) { char str[128]; sprintf( str, "%6.1f GigaParticles/Sec", (float)NUM_PARTICLES/ElapsedTime/1000000000. ); glDisable( GL_DEPTH_TEST ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluOrtho2D( 0., 100., 0., 100. ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glColor3f( 1., 1., 1. ); DoRasterString( 5., 5., 0., str ); } glutSwapBuffers( ); glFlush( ); }
void Display( void ) { if( DebugOn != 0 ) { fprintf( stderr, "Display\n" ); } // set which window we want to do the graphics into: glutSetWindow( MainWindow ); // erase the background: glDrawBuffer( GL_BACK ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glEnable( GL_DEPTH_TEST ); // specify shading to be flat: glShadeModel( GL_FLAT ); // set the viewport to a square centered in the window: GLsizei vx = glutGet( GLUT_WINDOW_WIDTH ); GLsizei vy = glutGet( GLUT_WINDOW_HEIGHT ); GLsizei v = vx < vy ? vx : vy; // minimum dimension GLint xl = ( vx - v ) / 2; GLint yb = ( vy - v ) / 2; glViewport( xl, yb, v, v ); // set the viewing volume: // remember that the Z clipping values are actually // given as DISTANCES IN FRONT OF THE EYE // USE gluOrtho2D( ) IF YOU ARE DOING 2D ! glMatrixMode( GL_PROJECTION ); glLoadIdentity( ); if( WhichProjection == ORTHO ) glOrtho( -3., 3., -3., 3., 0.1, 1000. ); else gluPerspective( 90., 1., 0.1, 1000. ); // place the objects into the scene: glMatrixMode( GL_MODELVIEW ); glLoadIdentity( ); // set the eye position, look-at position, and up-vector: // IF DOING 2D, REMOVE THIS -- OTHERWISE ALL YOUR 2D WILL DISAPPEAR ! gluLookAt( 0., 0., 3., 0., 0., 0., 0., 1., 0. ); // translate the objects in the scene: // note the minus sign on the z value // this is to make the appearance of the glui z translate // widget more intuitively match the translate behavior // DO NOT TRANSLATE IN Z IF YOU ARE DOING 2D ! glTranslatef( (GLfloat)TransXYZ[0], (GLfloat)TransXYZ[1], -(GLfloat)TransXYZ[2] ); // rotate the scene: // DO NOT ROTATE (EXCEPT ABOUT Z) IF YOU ARE DOING 2D ! glRotatef( (GLfloat)Yrot, 0., 1., 0. ); glRotatef( (GLfloat)Xrot, 1., 0., 0. ); glMultMatrixf( (const GLfloat *) RotMatrix ); // uniformly scale the scene: glScalef( (GLfloat)Scale, (GLfloat)Scale, (GLfloat)Scale ); GLfloat scale2 = 1. + Scale2; // because glui translation starts at 0. if( scale2 < MINSCALE ) scale2 = MINSCALE; glScalef( (GLfloat)scale2, (GLfloat)scale2, (GLfloat)scale2 ); // set the fog parameters: // DON'T NEED THIS IF DOING 2D ! if( DepthCueOn != 0 ) { glFogi( GL_FOG_MODE, FOGMODE ); glFogfv( GL_FOG_COLOR, FOGCOLOR ); glFogf( GL_FOG_DENSITY, FOGDENSITY ); glFogf( GL_FOG_START, FOGSTART ); glFogf( GL_FOG_END, FOGEND ); glEnable( GL_FOG ); } else { glDisable( GL_FOG ); } // possibly draw the axes: if( AxesOn != 0 ) { glColor3fv( &Colors[WhichColor][0] ); glCallList( AxesList ); } // set the color of the object: glColor3fv( Colors[WhichColor] ); // draw the current object: glCallList( PointList ); // draw some gratuitous text that just rotates on top of the scene: glDisable( GL_DEPTH_TEST ); glColor3f( 0., 1., 1. ); //make this Dynamic... build list of samples ( at some point ) float z; for (int i = 0; i < NUM_SAMPLES; i++){ z = 2 * (i - 0.) / (NUM_SAMPLES - 0) - 1; DoRasterString( 0., 0., z, SAMPLE_NAMES[i] ); } // draw some gratuitous text that is fixed on the screen: // // the projection matrix is reset to define a scene whose // world coordinate system goes from 0-100 in each axis // // this is called "percent units", and is just a convenience // // the modelview matrix is reset to identity as we don't // want to transform these coordinates glDisable( GL_DEPTH_TEST ); glMatrixMode( GL_PROJECTION ); glLoadIdentity( ); gluOrtho2D( 0., 100., 0., 100. ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity( ); glColor3f( 1., 1., 1. ); DoRasterString( 5., 11., 0., "X Axis: Log10(fpkm)" ); DoRasterString( 5., 6., 0., "Y Axis: Log10(CV)" ); DoRasterString( 5., 1., 0., "Z Axis: Sample Set" ); // swap the double-buffered framebuffers: glutSwapBuffers( ); // be sure the graphics buffer has been sent: // note: be sure to use glFlush( ) here, not glFinish( ) ! glFlush( ); }