| // Copyright 2016 The SwiftShader Authors. All Rights Reserved. | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | // you may not use this file except in compliance with the License. | 
 | // You may obtain a copy of the License at | 
 | // | 
 | //    http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, software | 
 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | // See the License for the specific language governing permissions and | 
 | // limitations under the License. | 
 |  | 
 | /****************************************************************************** | 
 |  | 
 | @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 __stdcall 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); | 
 | } |