/******************************************************************************

@File			OGLSimpleCube.cpp

@Title			OpenGL Simple cube application

@Version		1.0

@Platform		Windows

@Description	Basic window with a cube drawn in it, using libGL (opengl32).
Inspired by http://www.cs.rit.edu/~ncs/Courses/570/UserGuide/OpenGLonWin-11.html

******************************************************************************/
#include <windows.h>
#include <math.h>

#include <gl\GL.h>

#define PI 3.14159265
#define SCALE_FACTOR 0.5

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

const char *className = "OpenGL";
char *windowName = "OpenGL Cube";
int winX = 0, winY = 0;
int winWidth = 300, winHeight = 300;
float angle = 0.1f;
double theta = angle * PI / 180.0;
int listIndex;

// Rotation matrix
GLfloat R[16] = { 1, 0, 0, 0, 0, cos(theta), -sin(theta), 0, 0, sin(theta), cos(theta), 0, 0, 0, 0, 1 };

// Scaling matrix
GLfloat S[16] = { SCALE_FACTOR, 0, 0, 0, 0, SCALE_FACTOR, 0, 0, 0, 0, SCALE_FACTOR, 0, 0, 0, 0, 1 };

HDC hDC;
HGLRC hGLRC;
HPALETTE hPalette;

GLfloat vertices1[] = {
	0.5F, 0.5F, 0.5F, -0.5F, 0.5F, 0.5F, -0.5F, -0.5F, 0.5F, 0.5F, -0.5F, 0.5F,
	-0.5F, -0.5F, -0.5F, -0.5F, 0.5F, -0.5F, 0.5F, 0.5F, -0.5F, 0.5F, -0.5F, -0.5F,
	0.5F, 0.5F, 0.5F, 0.5F, 0.5F, -0.5F, -0.5F, 0.5F, -0.5F, -0.5F, 0.5F, 0.5F,
	-0.5F, -0.5F, -0.5F, 0.5F, -0.5F, -0.5F, 0.5F, -0.5F, 0.5F, -0.5F, -0.5F, 0.5F,
	0.5F, 0.5F, 0.5F, 0.5F, -0.5F, 0.5F, 0.5F, -0.5F, -0.5F, 0.5F, 0.5F, -0.5F,
	-0.5F, -0.5F, -0.5F, -0.5F, -0.5F, 0.5F, -0.5F, 0.5F, 0.5F, -0.5F, 0.5F, -0.5F
};

GLfloat normals1[] = {
	0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1,
	0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1,
	0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0,
	0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0,
	1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0,
	-1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0
};

GLfloat colors1[] = {
	1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0,
	0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0,
	1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0,
	0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1,
	1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0,
	0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1
};

void initializeView(void)
{
	// Set viewing projection
	glMatrixMode(GL_PROJECTION);
	glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0);

	// Position viewer
	glMatrixMode(GL_MODELVIEW);
	glTranslatef(0.0F, 0.0F, -2.0F);

	// Position object
	glRotatef(30.0F, 1.0F, 0.0F, 0.0F);
	glRotatef(30.0F, 0.0F, 1.0F, 0.0F);

	glEnable(GL_DEPTH_TEST);
	glEnable(GL_COLOR_MATERIAL);
}

void initDisplayList(void)
{
	listIndex = glGenLists(1);
	glNewList(listIndex, GL_COMPILE);
	glNormalPointer(GL_FLOAT, 0, normals1);
	glColorPointer(3, GL_FLOAT, 0, colors1);
	glVertexPointer(3, GL_FLOAT, 0, vertices1);

	glEnableClientState(GL_NORMAL_ARRAY);
	glEnableClientState(GL_COLOR_ARRAY);
	glEnableClientState(GL_VERTEX_ARRAY);

	glPushMatrix();
	glMultMatrixf(S);
	glDrawArrays(GL_QUADS, 0, 24);
	glPopMatrix();

	glDisableClientState(GL_VERTEX_ARRAY);
	glDisableClientState(GL_COLOR_ARRAY);
	glDisableClientState(GL_NORMAL_ARRAY);
	glEndList();
}

void redraw(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glCallList(listIndex);
	
	// Rotation
	glMultMatrixf(R);

	SwapBuffers(hDC);
}

void resize(void)
{
	// Set viewport to cover the window
	glViewport(0, 0, winWidth, winHeight);
}

void setupPixelFormat(HDC hDC)
{
	PIXELFORMATDESCRIPTOR pfd = {
		sizeof(PIXELFORMATDESCRIPTOR),  // Size
		1,                              // Version
		PFD_SUPPORT_OPENGL |
		PFD_DRAW_TO_WINDOW |
		PFD_DOUBLEBUFFER,               // Support double-buffering
		PFD_TYPE_RGBA,                  // Color type
		16,                             // Prefered color depth
		0, 0, 0, 0, 0, 0,               // Color bits (ignored)
		0,                              // No alpha buffer
		0,                              // Alpha bits (ignored)
		0,                              // No accumulation buffer
		0, 0, 0, 0,                     // Accum bits (ignored)
		16,                             // Depth buffer
		0,                              // No stencil buffer
		0,                              // No auxiliary buffers
		PFD_MAIN_PLANE,                 // Main layer
		0,                              // Reserved
		0, 0, 0,                        // No layer, visible, damage masks
	};
	int pixelFormat;

	pixelFormat = ChoosePixelFormat(hDC, &pfd);
	if(pixelFormat == 0) {
		MessageBox(WindowFromDC(hDC), L"ChoosePixelFormat failed.", L"Error",
			MB_ICONERROR | MB_OK);
		exit(1);
	}

	if(SetPixelFormat(hDC, pixelFormat, &pfd) != TRUE) {
		MessageBox(WindowFromDC(hDC), L"SetPixelFormat failed.", L"Error",
			MB_ICONERROR | MB_OK);
		exit(1);
	}
}

int WinMain(__in HINSTANCE hCurrentInst, __in_opt HINSTANCE hPreviousInst, __in_opt LPSTR lpCmdLine, __in int nShowCmd)
{
	WNDCLASS wndClass;
	HWND hWnd;
	MSG msg;

	// Register window class
	wndClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
	wndClass.lpfnWndProc = WndProc;
	wndClass.cbClsExtra = 0;
	wndClass.cbWndExtra = 0;
	wndClass.hInstance = hCurrentInst;
	wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndClass.hbrBackground = (HBRUSH)BLACK_BRUSH;
	wndClass.lpszMenuName = NULL;
	wndClass.lpszClassName = L"OpenGL cube";
	RegisterClass(&wndClass);

	// Create window
	hWnd = CreateWindow(
		L"OpenGL cube", L"OpenGL",
		WS_OVERLAPPEDWINDOW,
		winX, winY, winWidth, winHeight,
		NULL, NULL, hCurrentInst, NULL);

	// Display window
	ShowWindow(hWnd, nShowCmd);

	hDC = GetDC(hWnd);
	setupPixelFormat(hDC);
	hGLRC = wglCreateContext(hDC);
	wglMakeCurrent(hDC, hGLRC);
	initializeView();
	initDisplayList();

	while(true)
	{
		if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			if(msg.message == WM_QUIT)
			{
				break;
			}

			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else
		{
			redraw();
		}
	}

	wglMakeCurrent(NULL, NULL);
	wglDeleteContext(hGLRC);
	ReleaseDC(hWnd, hDC);

	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message) {
	case WM_DESTROY:
		// Finish OpenGL rendering
		if(hGLRC) {
			wglMakeCurrent(NULL, NULL);
			wglDeleteContext(hGLRC);
		}
		if(hPalette) {
			DeleteObject(hPalette);
		}
		ReleaseDC(hWnd, hDC);
		PostQuitMessage(0);
		return 0;
	case WM_SIZE:
		// Track window size changes
		if(hGLRC) {
			winWidth = (int)LOWORD(lParam);
			winHeight = (int)HIWORD(lParam);
			resize();
			return 0;
		}
	case WM_PALETTECHANGED:
		// Realize palette if this is *not* the current window
		if(hGLRC && hPalette && (HWND)wParam != hWnd) {
			UnrealizeObject(hPalette);
			SelectPalette(hDC, hPalette, FALSE);
			RealizePalette(hDC);
			redraw();
			break;
		}
		break;
	case WM_QUERYNEWPALETTE:
		// Realize palette if this is the current window
		if(hGLRC && hPalette) {
			UnrealizeObject(hPalette);
			SelectPalette(hDC, hPalette, FALSE);
			RealizePalette(hDC);
			return TRUE;
		}
		break;
	default:
		break;
	}

	return DefWindowProc(hWnd, message, wParam, lParam);
}