Luz_Ciudad.c



// VARIOS MUROS ILUMINADOS   

#include <GL/glut.h>
#include <unistd.h>


GLfloat mat_color [] = {0.0,1.0,1.0,1.0};		// El color ambiental y difuso del material
GLfloat Luz_Dif_Espe [] = {1.0,1.0,1.0,1.0};	// El color difuso y especular de la luz
GLfloat Luz_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 

GLfloat normalPiso [] =		{0.0,  0.0, 1.0};
GLfloat normalMuroIzq [] =	{1.0,  0.0, 0.0};
GLfloat normalMuroFondo [] =	{0.0, -1.0, 0.0};
GLfloat normalMuroDer [] =	{-1.0, 0.0, 0.0};

GLfloat Luz0Pos [] = {0, 0, 10, 1};		// Posicion (x=0,y=0,z=0) Tipo(w=1) ... w=1(posicional) o 2(direccional)
GLfloat Luz0Dir[] = {0, 0, -1};			// DirecciOn (hacia donde apunta)
GLfloat Luz0Ang = 10;				// Angulo de apertura de la luz en grados ( mitad )
GLfloat Luz0Aten = 0;				// AtenuaciOn de la luz conforme se hacerca
GLfloat Luz0Brillo = 0.4;			// Brillo del material

float Luz_Foco [] = {0.0,0.0,0.8,1.0};		// Luz mOvil
float PosX = -7.0; float PosY = -5;		// Posicion del foco

float DIM = 10;

void PintaEjes()
{
	glBegin(GL_LINES);
		glColor3f(1,0,0); glVertex3f(-DIM, 0, 0); glVertex3f(DIM, 0, 0);	// X
		glColor3f(0,1,0); glVertex3f(0, -DIM, 0); glVertex3f(0, DIM, 0);	// Y
		glColor3f(0,0,1); glVertex3f(0, 0, -DIM); glVertex3f(0, 0, DIM);	// Z
	glEnd();
	glPushMatrix();glColor3f(1,0,0); glTranslatef(DIM, 0.0f, 0.0f); glutWireSphere(0.20, 20, 20);glPopMatrix();
	glPushMatrix();glColor3f(0,1,0); glTranslatef(0.0f, DIM, 0.0f); glutWireSphere(0.20, 20, 20);glPopMatrix();
	glPushMatrix();glColor3f(0,0,1); glTranslatef(0.0f, 0.0f, DIM); glutWireSphere(0.20, 20, 20);glPopMatrix();
}

void Gradua  ( )
{
	int k=0, x1,y1,x2,y2;

	glBegin(GL_LINES);
		glColor3f(1,0,0); for(k=1; k<DIM*2; k++) { glVertex3f(-10+k, 0.2, 0); glVertex3f(-10+k, -0.2, 0); }
		glColor3f(0,1,0); for(k=1; k<DIM*2; k++) { glVertex3f(0.2, -10+k, 0); glVertex3f(-0.2, -10+k, 0); }
		glColor3f(0,1,0); for(k=1; k<DIM*2; k++) { glVertex3f(0.2, 0, -10+k); glVertex3f(-0.2, 0, -10+k); }
	glEnd();
}

void Rejilla()
{
	int k=0;
	
	glColor3f(1,1,1); glLineWidth(5);
	for(k=0; k<DIM*2+1; k++)
	{
		glBegin(GL_LINES);
			glVertex3f(-DIM+k, -DIM, 0); glVertex3f(-DIM+k, DIM, 0);
		glEnd();
	}
	for(k=0; k<DIM*2+1; k++)
	{
		glBegin(GL_LINES);
			glVertex3f(-DIM, -DIM+k, 0); glVertex3f(DIM, -DIM+k, 0);
		glEnd();
	}
	glLineWidth(1);
}

void Muros()
{
	glBegin(GL_QUADS);
		glColor3f(1, 1, 0.3); // piso
		glNormal3fv(normalPiso); glVertex3f(-DIM, -DIM, 0);
		glNormal3fv(normalPiso); glVertex3f(DIM, -DIM, 0);
		glNormal3fv(normalPiso); glVertex3f(DIM, DIM, 0);
		glNormal3fv(normalPiso); glVertex3f(-DIM, DIM, 0);

		glColor3f(0, 0.3, 0);  // muro verde -IZQUIERDO-
		glNormal3fv(normalMuroIzq); glVertex3f(-DIM+1, -DIM+6, 0);
		glNormal3fv(normalMuroIzq); glVertex3f(-DIM+1, -DIM+6, 4);
		glNormal3fv(normalMuroIzq); glVertex3f(-DIM+1, DIM, 4);
		glNormal3fv(normalMuroIzq); glVertex3f(-DIM+1, DIM, 0);

		glColor3f(0.6, 0.3, 0);  // muro cafE -FONDO-
		glNormal3fv(normalMuroFondo); glVertex3f(-DIM+2, DIM-2, 0);
		glNormal3fv(normalMuroFondo); glVertex3f(-DIM+2, DIM-2, 4);
		glNormal3fv(normalMuroFondo); glVertex3f(DIM-2, DIM-2, 4);
		glNormal3fv(normalMuroFondo); glVertex3f(DIM-2, DIM-2, 0);
		
		glNormal3fv(normalMuroDer); glVertex3f(0, DIM-4, 0);
		glNormal3fv(normalMuroDer); glVertex3f(0, DIM-4, 4);
		glNormal3fv(normalMuroDer); glVertex3f(0, -DIM+4, 4);
		glNormal3fv(normalMuroDer); glVertex3f(0, -DIM+4, 0);
		
		glColor3f(0, 0.6, 1);  // muro azul
		glNormal3fv(normalMuroDer); glVertex3f(DIM-1, -DIM+1, 0);
		glNormal3fv(normalMuroDer); glVertex3f(DIM-1, -DIM+1, 4);
		glNormal3fv(normalMuroDer); glVertex3f(DIM-1, DIM-2, 4);
		glNormal3fv(normalMuroDer); glVertex3f(DIM-1, DIM-2, 0);
		
		glNormal3fv(normalMuroDer); glVertex3f(-DIM+4, DIM-4, 0);
		glNormal3fv(normalMuroDer); glVertex3f(-DIM+4, DIM-4, 4);
		glNormal3fv(normalMuroDer); glVertex3f(-DIM+4, -DIM+4, 4);
		glNormal3fv(normalMuroDer); glVertex3f(-DIM+4, -DIM+4, 0);
		
		glColor3f(1, 0.3, 0.3);  // muro rojo
		glNormal3fv(normalMuroDer); glVertex3f(5, DIM-4, 0);
		glNormal3fv(normalMuroDer); glVertex3f(5, DIM-4, 4);
		glNormal3fv(normalMuroDer); glVertex3f(5, -DIM+4, 4);
		glNormal3fv(normalMuroDer); glVertex3f(5, -DIM+4, 0);
	glEnd();
}

void Cubo()
{
	glColor3f(1, 1, 1);
	glutWireCube(0.5);
	//glutWireCube(10);
}

void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	PintaEjes( ); Gradua( );

	glPushMatrix();
	//glRotatef(40, 1, 1, 0);
	Rejilla();
	Muros();
	Cubo();
	

	glPushMatrix();
		glColorMaterial(GL_FRONT, GL_EMISSION);
		glColor4fv(Luz_Foco); glTranslatef(PosX, PosY, 3);  glutSolidCone(0.25, 1.0, 7,7);
	glPopMatrix();
	
	glPopMatrix();
	glutSwapBuffers();
	//glFlush();
	//sleep(20);
}


void Inicio(void)
{
		// propiedades
		glLightfv(GL_LIGHT0, GL_AMBIENT,			Luz_Ambient);
		glLightfv(GL_LIGHT0, GL_DIFFUSE,			Luz_Dif_Espe);
		glLightfv(GL_LIGHT0, GL_SPECULAR,			Luz_Dif_Espe);
		glLightfv(GL_LIGHT0, GL_POSITION,			Luz0Pos);
		//glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION,		Luz0Dir);
		glLightfv(GL_LIGHT0, GL_POSITION,			Luz0Dir);
		//glLightfv(GL_LIGHT0, GL_POSITION,light_dir);
		glLightf (GL_LIGHT0, GL_SPOT_CUTOFF,		Luz0Ang);
		glLightf (GL_LIGHT0, GL_LINEAR_ATTENUATION,	Luz0Aten);
		//GL_FRONT_AND_BACK
	glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_color);	// Seleccionamos el color del material
	glMaterialf (GL_FRONT, GL_SHININESS, Luz0Brillo);
	glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_FALSE);		// Sin luz las caras traseras (al inicio)
	glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHT0);	// activaciOn
	
	
	glClearColor(0.0,0.0,0.0,0.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-DIM-5, DIM+5, -DIM-5, DIM+5, -DIM-5, DIM+5);
	glMatrixMode(GL_MODELVIEW);
	gluLookAt(-1,-1,1,  2,2,-1,  0,0,1);
	glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); glClearDepth(1.0);
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowSize (800, 600);
	glutInitWindowPosition (100, 100);
	glutCreateWindow ("Control de las luces ... ");
	Inicio();
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}