title: Can't rotate object around its own center on mouse click OpenGL
body: <p>I succesfully managed to rotate my object but I need to right click on the object to stop its rotation. I don't know how to make the object to rotate just around its center and then stop, I'll attach the code to see exactly what's happening with this shape. The problem, I think, is with the <code>spinDisplay()</code> function... the thing is that I need to rotate around its center on left mouse click and on the right mouse click I should change the color of the object....</p>
  
  <pre><code>#include &lt;stdlib.h&gt;
  #include &lt;math.h&gt;
  #include "dependente\freeglut\freeglut.h"
  #include "dependente\glfw\glfw3.h"
  #include &lt;stdio.h&gt; //incluziuni librarii
  
  float ORG[3] = { 0,0,0 };
  static GLfloat spin = 0.0;
  GLfloat viewangle = 0, tippangle = 0, traj[120][3]; //variabila pentru unghi camera
  
  GLfloat d[3] = { 0.1, 0.1, 0.1 }; //vector directie
  
  GLfloat  xAngle = 0.0, yAngle = 0.0, zAngle = 0.0;
  bool draw_triangle = false; //variabila desenat figuri 
  bool draw_square = false;
  bool draw_decagon = false;
  
  
  void Triangle(void) //draw the triangle shape
  {
      glBegin(GL_TRIANGLE_FAN);//triangles have a common vertex, which is the central vertex
      glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f);   //V0(red)
      glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);   //V1(green)
      glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f);   //V2(blue)
      glEnd();
  }
  void Square(void) {
      glBegin(GL_QUADS);
      glVertex2f(-1.0f, 1.0f); // top left
      glVertex2f(1.0f, 1.0f); // top right 
      glVertex2f(1.0f, -1.0f); // bottom right
      glVertex2f(-1.0f, -1.0f); // bottom left
      glEnd();
  }
  void Decagon(void) //draw the decagon shape
  {
      glBegin(GL_POLYGON);
                  glColor3f(0.0f, 0.0f, 1.0f);
                  glVertex3f(0.72f,0.8f, 0.0f); //a1
                  glVertex3f(0.52f,   0.8f,0.0f);  //z
                  glVertex3f(0.35f,   0.64f, 0.0f); //b1
                  glVertex3f(0.3f,   0.48f, 0.0f); //d1
                  glVertex3f(0.35f,   0.3f, 0.0f); //e1
                  glVertex3f(0.52f, 0.16f, 0.0f); //l1
                  glVertex3f(0.72f, 0.16f, 0.0f); //m1
                  glVertex3f(0.9f, 0.3f, 0.0f); //o1
                  glVertex3f(0.95f, 0.48f, 0.0f); //p1
                  glVertex3f(0.9f, 0.64f, 0.0f); //c1
                  glScalef(10, 10, 10);
                  glTranslatef(1, 2, 3);
      glEnd();
  }
  
  void Keyboard(unsigned char key, int x, int y) //press a key to perform actions
  {
      switch (key) {
  
      case 'd': d[0] += 0.1;  break; //camera right
      case 'a': d[0] -= 0.1;  break; //camera left
      case 'w': d[1] += 0.1;  break; //camera up 
      case 's': d[1] -= 0.1;  break; //camera down 
      case 'm': d[2] += 0.1;  break; //magnify
      case 'n': d[2] -= 0.1;  break; //minify
      case 't': draw_triangle = true; draw_decagon = false;   break; //draw pyramid when key is pressed
      case 'q': draw_square = true; draw_decagon = false; draw_triangle = false; break; //draw cube when key is pressed
      case 'l': draw_decagon = true; draw_triangle = false; draw_square = false; break; //draw prism when key is pressed
  
      case 'x': xAngle += 5;  break; //modify x axis angle
      case 'y': yAngle += 5;  break; //modify y axis angle
      case 'z': zAngle += 5;  break;  //modify z axis angle
  
      default: printf("   Keyboard %c == %d", key, key); //see what key it's pressed
      }
  
      glutPostRedisplay();
  }
  
  void spinDisplay() //here it's the problematic function
  {
      spin = spin + 0.1;
      if (spin &gt; 360.0)
      {
          spin = 0.0;
      }
      glutPostRedisplay();
  }
  void mouse(int buton, int state, int x, int y)
  {
      switch (buton) {
      case GLUT_LEFT_BUTTON:
          if (state == GLUT_DOWN)
              glutIdleFunc(spinDisplay);
          break;
      case GLUT_RIGHT_BUTTON: //here I don't know how to change the color of the shape
          glutIdleFunc(NULL);
      default:glutIdleFunc(NULL);
  
          break;
      }
  }
  void redraw(void)
  {
  
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      glEnable(GL_DEPTH_TEST);
  
      glLoadIdentity();
  
      glTranslatef(0, 0, -3);
      glRotatef(tippangle, 1, 0, 0);  // Up and down arrow keys 'tip' view.
      glRotatef(viewangle, 0, 1, 0);  // Right/left arrow keys 'turn' view.
  
      glDisable(GL_LIGHTING);
  
  
      glPushMatrix();
      glTranslatef(d[0], d[1], d[2]);    // Move box down X axis.
      glScalef(0.7f, 0.7f, 0.7f); //increase the object size
      glRotatef(zAngle, 0, 0, 1);
      glRotatef(yAngle, 0, 1, 0);
      glRotatef(xAngle, 1, 0, 0);
      glRotatef(spin, 0.0, 0.0, 1.0);
  
      if (draw_triangle)
          Triangle();
  
      if (draw_decagon)
          Decagon();
      if (draw_square)
          Square();
  
      glPopMatrix();
  
      glutSwapBuffers();
  }
  
  int main(int argc, char** argv)
  {
      glutInit(&amp;argc, argv);
      glutInitWindowSize(900, 600);
      glutInitWindowPosition(300, 300);
      glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE);
  
      glutCreateWindow("Figure Rotation");
      glutDisplayFunc(redraw);
      glutKeyboardFunc(Keyboard);
      glutMouseFunc(mouse);
      glClearColor(0.1, 0.0, 0.1, 1.0);
  
      glMatrixMode(GL_PROJECTION);//specify which matrix is the current matrix, matrix that represents your camera's lens (aperture, far-field, near-field, etc).
      gluPerspective(60, 1.5, 1, 10); //set up a perspective projection matrix
      glMatrixMode(GL_MODELVIEW); //specify which matrix is the current matrix,matrix that represents your camera (position, pointing, and up vector).
      glutMainLoop();
  
      return 1;
  }
  </code></pre>