Animacion_1.c



// 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;
}