Files
GTSchoolShit/CS4451/oglexamples/spinner.cpp
2025-06-07 01:59:34 -04:00

132 lines
4.2 KiB
C++

/* Rotates3D points. Changes points each time mouse is clicked (courtesy of Brooks van Horn) */
#ifdef _WIN32
#include <windows.h>
#endif
#include <GL/glut.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 EXIT_SUCCESS;
}
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 pressed (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 );
}