// CUADRO GIRANDO
#include <GL/glut.h>
//#include <stdlib.h>
static GLfloat Giro = 0.0; // VARIABLE PARA ALMACENAR EL GIRO
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT); // CAMBIAMOS LA OPCION POR DEFECTO LA TECNICA DE SOMBREADO
// DEFECTO: GL_SMOOTH (asigna diferentes colores a cada pixel)
// GL_FLAT: (selecciona el color de uno de los vErtices y se lo asigna al resto)
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(Giro, 0.0, 0.0, 1.0); // (Angulo, x, y, z)
glColor3f(1.0, 1.0, 0.0);
glRectf(-25.0, -25.0, 25.0, 25.0); // (x1, y1, x2, y2)
glPopMatrix();
glutSwapBuffers(); // CAMBIAMOS EL BUFFER OCULTO POR EL ACTIVO
}
void Giro_Display(void)
{
Giro = Giro + 2.0;
if (Giro > 360) Giro = Giro - 360.0;
glutPostRedisplay(); // HACE QUE TRAS LA ACTUALIZACION SE DIBUJE EL SIGUIENTE FRAME
}
void reshape(int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h); // (x, y, ancho, alto)
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0); // (-x, x, -y, y, -z, z)
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(Giro_Display); // REGISTRAR FUNCION Callback
break;
case GLUT_MIDDLE_BUTTON:
if (state == GLUT_DOWN) glutIdleFunc(NULL);
break;
default: break;
}
}
// SE REQUIERE EL DESPLIEGUE DE DOBLE BUFFER
// SE UTILIZA LOS EVENTOS DEL RATON
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); // INDICAMOS QUE SE VA A UTILIZAR EL DOBLE BUFFER EN LUGAR DE GLUT_SINGLE
glutInitWindowSize (300, 300);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display); // REGISTRAR FUNCION Callback
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}