Luz_Basica.c



/*   INTRODUCCION A LAS LUCES
	========================
	Parametros de glLight*()
	========================
Parameter Name			Default Value			Meaning
	TIPOS DE LUZ
	============
GL_AMBIENT			(0.0, 0.0, 0.0, 1.0)		ambient RGBA intensity of light
GL_DIFFUSE			(1.0, 1.0, 1.0, 1.0)		diffuse RGBA intensity of light
GL_SPECULAR			(1.0, 1.0, 1.0, 1.0)		specular RGBA intensity of light
	ambiental.-	Restos de la luz
	difusa.-		Incide sobre un objeto y proviene de un determinado punto
	especular.-	Al incidir se ve reflejada con un angulo similar al de incidencia
	emitida.-	Emitida por el objeto

GL_POSITION			(0.0, 0.0, 1.0, 0.0)		(x, y, z, w) position of light
GL_SPOT_DIRECTION		(0.0, 0.0, -1.0)			(x, y, z) direction of spotlight
GL_SPOFOT_EXPONENT		0.0				spotlight exponent
GL_SPOT_CUTF			180.0				spotlight cutoff angle
GL_CONSTANT_ATTENUATION		1.0				constant attenuation factor
GL_LINEAR_ATTENUATION		0.0				linear attenuation factor
GL_QUADRATIC_ATTENUATION		0.0				quadratic attenuation factor

	posicion.-	Indica si la luz es posicional o direccional
			-glLightfv(LIGHTn, GL_POSITION, V)-
			V = (x, y, y, w); si w=0 es direccional. si w=1 es posicional
	direccion
	del foco.-	Si la luz es focal -glLightfv(LIGHTn, GL_SPOT_DIRECTION, V)- V=(x, y, z)
	
	atenuacion
	del foco.-	Degradacion de la intensidad. -glLightf(LIGHTn, GL_SPOT_EXPONENT, Val)-

	apertura
	del foco.-	-glLightf(LIGHTn, GL_SPOT_CUTOFF, Val)- Val=angulo/2 (grados)

	intensidad	Color ambiental, difuso y especular
	de la luz.-	-glLightfv(LIGHTn, GL_[AMBIENT | DIFFUSE | SPECULAR], V)- V=(r, g, b, a)

	atenuacion	Perdida de la intensidad de la luz
	de la luz.-	-glLightf(LIGHTn, GL_[CONSTANT | LINEAR | QUADRATIC]_ATTENUATION, Val)- 

NOTA:
1)	El color de un objeto se define por su material no por el color de sus vertices
2)	La iluminacion se calcula a nivel de vertice (material activo, luces activas e incidencia sobre ellos)
=================================================================================
=================================================================================
RESPECTO AL MATERIAL -glMaterial*()-
	color.-
		glMaterialfv(GL_FRONT[_AND_BACK], [GL_AMBIENT | GL_DIFUSSE | GL_AMBIENT_AND_DIFUSSE | GL_SPECULAR], V)
		V=(r, g, b, a)
	intensidad del brillo.-
		glMaterialf(GL_FRONT[_AND_BACK], GL_SHININESS, Val)

	Si se desea cambiar el color de un material:
	--------------------------------------------
		glEnable(GL_COLOR_MATERIAL)
		glColorMaterial(GL_FRONT[_AND_BACK], [GL_AMBIENT | GL_DIFUSSE | GL_AMBIENT_AND_DIFUSSE | GL_SPECULAR])
		glColor3f(r, g, b)
			-se usa-
		glDisable(GL_COLOR_MATERIAL)

=================================================================================
=================================================================================
	PASOS PARA LA ILUMINACION
	1.- Activar la iluminaciOn
		glEnable (GL_LIGHTING);
	2.- Establecer las propiedades de cada luz y activarlas
		glLight*()
		glEnable(GL_LIGHTn)	0 <= n <= N, (N=8)
=================================================================================
=================================================================================

*/

#include <GL/glut.h>

	// Definicion de arreglos que se van a utilizar
	// --------------------------------------------
GLfloat mat_color [] = {1.0,0.0,0.0,1.0};		// El color ambiental y difuso del material
GLfloat light_color [] = {1.0,1.0,1.0,1.0};	// El color difuso y especular de la luz
GLfloat light_ambient [] = {0.0,0.0,0.0,1.0};	// El color ambiental de la luz (si algo estA fuera de la luz, no se ilumina)
GLfloat normal [] = {0.0,1.0,0.0};		// Valor de las normales (como el cuadrado estA en el plano (x,z), las
						// normales van hacia arriba)
//GLfloat normal2[] = {1.0,1.0,-1.0};		// prueba 1
GLfloat normal2[] = {0.0,-1.0,-1.0};		// prueba 2
//GLfloat normal2[] = {1.0,-1.0,-1.0};		// prueba 3
//GLfloat normal2[] = {-1.0,-1.0,-1.0};		// prueba 4
GLfloat light_dir [] = {0.0,1.0,0.0,0.0};		// El valor de la direcciOn de la luz (es una luz situada en el eje Y, en el
						// infinito, luego sus rayos irIan hacia abajo en el eje Y)


void display(void)
{
				//Dibujamos el cuadrado, y antes de cada vertice, establecemos su normal.
	glBegin(GL_QUADS);

		glNormal3fv(normal2);	glVertex3f(-1.0, 0.0, -1.0);
		glNormal3fv(normal);	glVertex3f(-1.0, 0.0,  1.0);
		glNormal3fv(normal2);	glVertex3f( 1.0, 0.0,  1.0);
		glNormal3fv(normal);	glVertex3f( 1.0, 0.0, -1.0);
	glEnd();

	glFlush();
	sleep(20);
	exit(0);
}


void initgl(void)
{
					// Activamos la luz, y sus caracterI­sticas, excepto la direcciOn:
	glEnable(GL_LIGHTING);
		glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
		glLightfv(GL_LIGHT0,GL_DIFFUSE,light_color);
		glLightfv(GL_LIGHT0,GL_SPECULAR,light_color);
	glEnable(GL_LIGHT0);
		glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_color);	// Seleccionamos el color del material

					//Establecemos la perspectiva y posicionamos al observador:
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(60.0,1.0,1.0,100.0);
	glMatrixMode(GL_MODELVIEW);
	glTranslatef(-0.3,-0.6,-4.0);

	glLightfv(GL_LIGHT0,GL_POSITION,light_dir);	// Establecemos la direcciOn de la luz
							// (sometida a la posicion de la camara)
	glClearColor(0.0,0.0,0.0,0.0);			// Seleccionamos el color de fondo
	glClear(GL_COLOR_BUFFER_BIT);			// borramos la pantalla
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize (600, 600);
	glutInitWindowPosition (100, 100);
	glutCreateWindow (argv[0]);
	initgl();
	glutDisplayFunc(display);		// REGISTRAR FUNCION Callback
	glutMainLoop();
	return 0;
}