Rotates3D points. Changes points each time mouse is clicked

(courtesy of Brooks van Horn)

 

#include <glut.h>

#include <GL/gl.h>

#include <GL/glu.h>

#include <stdlib.h>

void mouse( int, int, int, int );

void display( void );

void reshape( int, int );

void keyboard( unsigned char, int, int );

void Idle( void );

void InitializeVariables( void ); // forwarding functions

 

int xdim, ydim; // screen dimensions

struct vPoint { inline float & operator [] ( int index )  {  return element[ index ];  }  float element[ 3 ]; };

 

const float X_STEP = 0.005; const float Y_STEP = 0.020; const float Z_STEP = 0.025;

bool flag;                  // flag to tell us if there is anything to draw yet

vPoint rotation; // current rotation

const int MAX_DOTS = 10;   // # of dots to generate and render

vPoint dots[ MAX_DOTS ];   // the set of points to render

 

int main( int argc, char *argv[] )

{InitializeVariables(); // nothing to do with OpenGL.  My function that zeroes variables and such stuff.

  xdim = ( argc > 1 ) ? atoi( argv[ 1 ] ) : 500;  ydim = ( argc > 2 ) ? atoi( argv[ 2 ] ) : 500;

  glutInit( &argc, argv ); /* Initialization function */

  glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB ); // Set double buffer and GRB modes

  glutInitWindowSize( xdim, ydim ); // Set the screen size

  glutCreateWindow( "This is the title of the window.");

  glClearColor( 0.0, 0.0, 0.0, 0.0 ); // clear color and alpha at each pixel

  glShadeModel( GL_FLAT ); // set shading mode to flat (constant color for each polygon)

  glutDisplayFunc( display ); // tells OpenGL what function to call when it needs to redraw

  glutReshapeFunc( reshape ); // tells OpenGL what function to call when window is reshaped

  glutMouseFunc( mouse ); // tells OpenGL what function to call when a mouse button is pressed

  glutKeyboardFunc( keyboard ); // tells OpenGL to call the keyboard function with current parameters

  glutIdleFunc( Idle );

  glutMainLoop(); // important call to include after the above 3

  return 0; }

 

void InitializeVariables( void ) {rotation[ 0 ] = rotation[ 1 ] = rotation[ 2 ] = 0.0;  flag = true; }

 

void mouse( int button, int state, int x, int y )

{ /* button: GLUT_LEFT_BUTTON or GLUT_MIDDLE_BUTTON or   GLUT_RIGHT_BUTTON,

       state: state of the button (pressed GLUT_DOWN or not GLUT_UP) ,  (x, y): position of mouse */

 if ( state == GLUT_UP ) return ; // we don't care when the mouse button is released

 for (int i = 0; i<MAX_DOTS; i++) for (int j = 0; j<3; j++) dots[i][j] = (float) rand() / (float) RAND_MAX; // Generate dots

 flag = false; // we now have something to display

glutPostRedisplay();} // need to call display again so that a new thing is put on the screen

 

void keyboard( unsigned char c, int x, int y )

/* c: ASCII character pressed (excluding shift, ctrl, alt), (x,y) = position of the mouse */

{  if ( c == 27 ) exit( 0 ); }  // "escape" key

 

void Idle( void ) {rotation[0]+=X_STEP; rotation[1]+=Y_STEP; rotation[2]+=Z_STEP; glutPostRedisplay(); }

 

void display( void )

{glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

 if ( flag ) { glutSwapBuffers(); return ; }

 glPushMatrix(); // push matrix on stack

 glColor3f( 1.0, 1.0, 1.0 ); // Here I specify a color by giving R-G-B values from 0 to 1.

 glTranslatef( 0.0, 0.0, -3.0 ); // move the dots so that we can see them

 glRotatef(rotation[0],1,0,0);  glRotatef(rotation[1],0,1,0); glRotatef(rotation[2],0,0,1); // rotate the dots

 glBegin( GL_POINTS ); 

    for ( int i = 0; i < MAX_DOTS; i++ ) glVertex3f(dots[i][0],dots[i][1],dots[i][2]);

    glEnd();

 glPopMatrix();  glutSwapBuffers();} // This says: "DRAW WHAT YOU'VE GOT!"

 

void reshape( int new_width, int new_height )

{xdim = new_width;  ydim = new_height;

  glViewport(0,0,(GLsizei) new_width, (GLsizei) new_height ); // This resets the viewing port

  glMatrixMode( GL_PROJECTION ); // This resets the use of Matrices based upon the new view

  glLoadIdentity();

  gluPerspective( 60.0, (GLfloat) xdim / (GLfloat) ydim, 0.1, 20.0 ); // reset the viewing projection

  glMatrixMode( GL_MODELVIEW ); }