// OpenGL - predefiniowane obiekty biblioteki AUX
// Rysuje obiekty szkieletowe

#include <windows.h>	// Standardowy nagłówek dla Windows
#include <gl\gl.h>		// Biblioteka OpenGL
#include <gl\glu.h>		// Biblioteka Utility
#include <gl\glaux.h>	// Biblioteka AUX

int zmiana=0;
GLfloat	 lightPos[] = { 30.0f, 40.0f, 50.0f, 1.0f };
GLfloat  whiteLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat  sourceLight[] = { 0.8f, 0.8f, 0.8f, 1.0f };

// Wywoływana przez bibliotekę AUX w momencie zmiany rozmiaru okna
void CALLBACK ChangeSize(GLsizei w, GLsizei h)
	{

	GLfloat aspect;
	// Zabezpiecznie przed dzieleniem przez zero
	if(h == 0)
		h = 1;
	
	// Ustawienie widoku oraz bryły obcinania
	glViewport(0, 0, w, h);
    aspect = (GLfloat) w / h;

	 glMatrixMode( GL_PROJECTION );
	 glLoadIdentity();
	 gluPerspective( 45.0, aspect, 0.1, 400.0 );
	 
     glMatrixMode( GL_MODELVIEW );
	 glLoadIdentity();
	 glTranslatef(0.0f,0.0f,-160.0f);
	}


// Wywoływane przez bibliotekę AUX w celu narysowania sceny
void CALLBACK RenderScene(void)
	{
	// Wyczyszczenie okna
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	// Obrót o jeden stopień wokół każdej osi
    // (Zwróć uwagę że nie wywołujemy auxLoadIdentity(), więc
	// ten obrót się kumuluje

	//glMatrixMode(GL_MODELVIEW);
	
     	 	 
	 
	 glPushMatrix();	 
	    glLightfv(GL_LIGHT0,GL_POSITION,lightPos);	 
	    glTranslatef(30.0f,40.0f,40.0f);
	    glColor3ub(255, 255, 255);
	    glDisable(GL_LIGHT0);   
		auxSolidSphere(5.0f);
		glEnable(GL_LIGHT0);
	 glPopMatrix();
	   
	 	 	
	 //glPushMatrix();
	        glRotatef(1.0f,0.0f,1.0f,0.0f);	    
		    glColor3ub(155, 155, 0);	       
			auxWireSphere(20.0f);
      //glPopMatrix();


           

    Sleep(40);
	glFlush();

	// Przerzucenie rysunku na ekran
	auxSwapBuffers();
	}


void CALLBACK KeySpace(void)
	{
	zmiana++;

	if(zmiana > 1)
		zmiana = 0;

	RenderScene();
	}



void InitLightAndMaterial()
{
    glEnable(GL_DEPTH_TEST);    // Usuwanie niewidocznych powierzchni
    glFrontFace(GL_CCW);        // Wielokąty o kierunku przeciwnym do
                                // ruchu wskazówek są widziane z przodu
    glEnable(GL_CULL_FACE);     // Nie pokazuj wnętrza obiektów

    // Włączenie oświetlenia
    glEnable(GL_LIGHTING);

    // Przygotowanie i włączenie światła 0
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight);

    glLightfv(GL_LIGHT0,GL_DIFFUSE,sourceLight);
    glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
    glEnable(GL_LIGHT0);

    // Włączenie śledzenia koloru materiału
    glEnable(GL_COLOR_MATERIAL);

    // Ustawienie właściwości materiału
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);

    // Czarne tło
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
}

// Główna funkcja programu
void main(void)
	{
	
	// Przygotowanie okna z podwójnym buforowaniem
	auxInitDisplayMode(AUX_DOUBLE | AUX_RGBA);
	auxInitPosition(100,100,450,450);
	auxInitWindow("Rzutowanie perspektywiczne");

	InitLightAndMaterial();
     		
	
	// Ustaw funkcję zmiany rozmiarów okna
	auxReshapeFunc(ChangeSize);

	// Ustaw funkcję bezczynności
	auxIdleFunc(RenderScene);

	auxKeyFunc(AUX_SPACE,KeySpace);
	
	// Rozpocznij główną pętlę
	auxMainLoop(RenderScene);
	}

