PDA

View Full Version : OpenGL Programming Guide (7th Edition) Example Not Working



Blakeasd
12-21-2012, 05:07 PM
Hello,

I am following the OpenGL Programming Guide (7th Edition) and I can't get an example to work. In the example a square should rotate after a left mouse button click. I did not copy in paste, I just followed along and wrote the code. When I run the app it works, when I click on it however, the square doesn't rotate, instead it does a tiny rotation then stops. Here is the code I used:




#include <stdio.h>
#include <OpenGL/OpenGL.h>
#include <GLUT/GLUT.h>


static GLfloat spin = 0.0;


void init(void){

glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);



}


void display(void){


glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(spin, 0.0, 0.0, 1.0);
glColor3f(1.0, 1.0, 1.0);
glRectf(-25.0, -25.0, 25.0, 25.0);
glPopMatrix();
glutSwapBuffers();


}


void spinDisplay(void){


spin = spin + 2.0;
if (spin > 360.0) {
spin = spin - 360;
glutPostRedisplay();
}


}


void reshape(int w, int h){


glViewport(0, 0, (GLsizei) w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();





}


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




switch (button) {
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(spinDisplay);

break;
case GLUT_MIDDLE_BUTTON:
if (state == GLUT_DOWN) {
glutIdleFunc(NULL);


break;
default:
break;
}


}
}


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


glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(250, 250);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}





Does anyone know why when I click on it, the square rotates a very small amount, then stops? I am using OS X 10.8 and Xcode 4.5 if that matters.

Thanks!

Aestivae
12-21-2012, 06:03 PM
In your switch statement for the mouse buttons, you've got a curly brace mismatch after GLUT_MIDDLE_BUTTON. I can't say if that's actually the problem, as it doesn't seem like it would even compile that way...

Blakeasd
12-21-2012, 06:32 PM
I fixed the curly brace mismatch, but it still doesn't have a complete rotation. It rotates to the left, very slightly, and stops. Any Ideas?

newbiecow
12-21-2012, 08:55 PM
I fixed the curly brace mismatch, but it still doesn't have a complete rotation. It rotates to the left, very slightly, and stops. Any Ideas?


See the following section in your code:


void spinDisplay(void){


spin = spin + 2.0;
if (spin > 360.0) {
spin = spin - 360;
glutPostRedisplay(); }


}


Why do you put the "glutPostRedisplay()" in the curly brace of "if(spin>360.0)", you mean only to call display function whence the spin is a little greater than 360.0?
Move it out of that curly brace and see the effects.


Best Regards,


newbiecow