// Szablon prostej aplikacji wykorzystujacej OpenGL
// 
#include <windows.h>    //biblioteka umozliwiajaca utworzenie okna
#include <gl\gl.h>      //biblioteki OpenGL...
#include <gl\glu.h>


HDC	hDC=NULL; HGLRC hRC=NULL; HWND hWnd=NULL; HINSTANCE hInstance;

bool	keys[256];
bool	active=TRUE;

// deklaracje funkcji z pliku opengl.cpp
// dotycza one obslugi okna i innych potrzebnych windowsowi spraw
// na poczatek nie ma potrzeby tam wnikac
LRESULT	CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
GLvoid ReSizeGLScene(GLsizei width, GLsizei height);
GLvoid KillGLWindow(GLvoid);
BOOL CreateGLWindow(char* title, int width, int height, int bits);
LRESULT CALLBACK WndProc(	HWND	hWnd, UINT	uMsg, WPARAM	wParam,	LPARAM	lParam);

//*****************************************
//****** Glowna funkcja rysujaca na ekranie
int Rysujemy(GLvoid)
{
	// czyscimy okno 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // zerujemy uklad wspolrzednych
	glLoadIdentity();
	
    // miecho...
    
	glTranslatef(0.0,0.0,-6.0);        // ,,odsuwamy'' sie do tylu o 6 jednostek
	glColor3f(1.0,0.0,0.0);            // ustawiamy kolor na czerwony (Red,Green,Blue)
	
	glBegin(GL_TRIANGLES);             // zaczynamy rysowanie trojkata
		
        glVertex3f( 0.0, 1.0, 0.0);    // pierwszy wierzcholek (x,y,z)
		glVertex3f(-1.0,-1.0, 0.0);    // drugi wierzcholek
		glVertex3f( 1.0,-1.0, 0.0);    // trzeci wierzcholek
		
	glEnd();                           // koniec rysowania trojkata
			
	
	
	return TRUE;
}

//*****************************************
//****** Funkcja inicjalizujaca scene itp
int UstawiamyGL(GLsizei width, GLsizei height)
{
    //ustawianie obszaru roboczego
	glViewport(0,0,width,height);


    // Ustawianie parametrow ,,kamery''
	glMatrixMode(GL_PROJECTION);
	// zerowanie ukladu wspolrzednych
    glLoadIdentity();
	// ustawianie perspektywy
	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);


    // Ustawienia parametrow sceny 
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	// Metoda cieniowania plaszczyzn, smooth - przejscia kolorow beda plynne
	glShadeModel(GL_SMOOTH);

	// Czyszczenie ekranu danym kolorem R G B, alpha
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

	// opcja ukrywajaca niewidoczne fragmenty (zaslaniajace przez blizsze)
	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
	
	
	return TRUE;
}

//*****************************************
//**** Glowna funkcja aplikacji windowsowej
int WINAPI WinMain(	HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	MSG	msg;
	BOOL koniec=FALSE;


	// Tworzenie okna 
	if (CreateGLWindow("Pierwszy program w OpenGL",640,480,16) == FALSE)
	{
		return 0; // jesli nie utworzono okna to zakoncz program
	}

    // glowna petla ktora dziala dopoki nie zamkniemy programu
    // no albo gdy nie powstanie jakis blad
	while(!koniec)
	{  
        // jesli windows nie krzyczy
		if (!PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
        {
			if (active)
			{
                // tu wywolujemy funkcje rysujaca 
				Rysujemy(); 
				SwapBuffers(hDC);
				
			}
            
            // jesli nacisniemy ESC, niech zakonczy
			if (keys[VK_ESCAPE])
			{
                koniec = TRUE;
			}
			
		}
		else
		{
            // jesli jednak krzyczy, np. o wylaczenie programu
            if (msg.message==WM_QUIT) {	koniec = TRUE; }
			else { TranslateMessage(&msg); DispatchMessage(&msg); }
		}
	}


	KillGLWindow();	
	return (msg.wParam);
}

