/* * pickToGo.cpp * Pick objects - this program illustrates how to pick objects on the screen and * animate them in response. * * Created on: Mar 1, 2013 * Author: debure */ #include #include #include #include #include using namespace std; #define DTOR 3.14159/180.0 GLfloat theta; bool sqStart = false, // booleans for state of each object: sqGrowShrink = false; // square rotating, square changing size bool grow = true; // true if growing, false if shrinking GLfloat grFactor = 20; // scale factor for growing square GLint gsX = 100, gsY = 100; // center of growing square GLfloat rsFactor = 50; // scale factor for rotating square GLint rsX = 250, rsY = 425; // center of rotating square void myinit(void) { glClearColor(0.0, 0.0, 0.0, 1.0); glColor3f(0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 500.0, 500.0, 0.0); glMatrixMode(GL_MODELVIEW); glEnableClientState(GL_VERTEX_ARRAY); } void display(void) { // square is created at the origin GLfloat sq_vertices[4][2] = {{-1.0,-1.0},{1.0,-1.0},{1.0, 1.0},{-1.0,1.0}}; GLubyte sqIndices[4]={0,3,2,1}; GLfloat colors[8][3] = {{0.0, 0.0, 0.0},{1.0, 0.0, 0.0}, {1.0, 1.0, 0.0},{0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}, {1.0, 0.0, 1.0},{1.0, 1.0, 1.0}, {0.0, 1.0, 1.0}}; glClear(GL_COLOR_BUFFER_BIT); glVertexPointer(2, GL_FLOAT, 0, sq_vertices); glColorPointer(3, GL_FLOAT, 0, colors[2]); glEnableClientState(GL_COLOR_ARRAY); // code for rotating square glPushMatrix(); glLoadIdentity(); glTranslatef(rsX, rsY, 0.0); // center of rotating square glScalef(rsFactor, rsFactor, 0.0); glRotatef(theta*DTOR, 0.0, 0.0, 1.0); glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, sqIndices); glPopMatrix(); // code for growing square glPushMatrix(); glLoadIdentity(); glTranslatef(gsX, gsY, 0.0); // center of grow/shrink square glScalef(grFactor, grFactor, 0.0); glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, sqIndices); glPopMatrix(); glutSwapBuffers(); glFlush(); } void idle(void){ if (sqStart){ theta += 10; // modify rotation angle that is used in display } if (sqGrowShrink){ if (grFactor > 100) grow = false; else if (grFactor < -100) grow = true; if (grow) grFactor = grFactor + 0.05; else grFactor = grFactor - 0.05; } glutPostRedisplay(); } void mouse(int button, int state, int x, int y){ if (button==GLUT_LEFT_BUTTON && state==GLUT_DOWN && x >= gsX-grFactor && x <= gsX+grFactor && y >= gsY-grFactor && y <= gsY+grFactor){ // check if inside rotating sq sqGrowShrink = !sqGrowShrink; } if (button==GLUT_LEFT_BUTTON && state==GLUT_DOWN && x >= rsX-rsFactor && x <= rsX+rsFactor && y >= rsY-rsFactor && y <= rsY+rsFactor){ // check if inside scaling square sqStart = !sqStart; // already rotating: stop it } if (button==GLUT_RIGHT_BUTTON && state==GLUT_DOWN) exit(0); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB ); glutInitWindowSize(500, 500); glutInitWindowPosition(0,0); glutCreateWindow("Pick to Go"); glutDisplayFunc(display); glutMouseFunc(mouse); glutIdleFunc(idle); myinit(); glutMainLoop(); return 0; }