Home | History | Annotate | Download | only in OGLSimpleCube
      1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //    http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 /******************************************************************************
     16 
     17 @File			OGLSimpleCube.cpp
     18 
     19 @Title			OpenGL Simple cube application
     20 
     21 @Version		1.0
     22 
     23 @Platform		Windows
     24 
     25 @Description	Basic window with a cube drawn in it, using libGL (opengl32).
     26 Inspired by http://www.cs.rit.edu/~ncs/Courses/570/UserGuide/OpenGLonWin-11.html
     27 
     28 ******************************************************************************/
     29 #include <windows.h>
     30 #include <math.h>
     31 
     32 #include <gl\GL.h>
     33 
     34 #define PI 3.14159265
     35 #define SCALE_FACTOR 0.5
     36 
     37 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
     38 
     39 const char *className = "OpenGL";
     40 const char *windowName = "OpenGL Cube";
     41 int winX = 0, winY = 0;
     42 int winWidth = 300, winHeight = 300;
     43 float angle = 0.1f;
     44 double theta = angle * PI / 180.0;
     45 int listIndex;
     46 
     47 // Rotation matrix
     48 GLfloat R[16] = { 1, 0, 0, 0, 0, cos(theta), -sin(theta), 0, 0, sin(theta), cos(theta), 0, 0, 0, 0, 1 };
     49 
     50 // Scaling matrix
     51 GLfloat S[16] = { SCALE_FACTOR, 0, 0, 0, 0, SCALE_FACTOR, 0, 0, 0, 0, SCALE_FACTOR, 0, 0, 0, 0, 1 };
     52 
     53 HDC hDC;
     54 HGLRC hGLRC;
     55 HPALETTE hPalette;
     56 
     57 GLfloat vertices1[] = {
     58 	0.5F, 0.5F, 0.5F, -0.5F, 0.5F, 0.5F, -0.5F, -0.5F, 0.5F, 0.5F, -0.5F, 0.5F,
     59 	-0.5F, -0.5F, -0.5F, -0.5F, 0.5F, -0.5F, 0.5F, 0.5F, -0.5F, 0.5F, -0.5F, -0.5F,
     60 	0.5F, 0.5F, 0.5F, 0.5F, 0.5F, -0.5F, -0.5F, 0.5F, -0.5F, -0.5F, 0.5F, 0.5F,
     61 	-0.5F, -0.5F, -0.5F, 0.5F, -0.5F, -0.5F, 0.5F, -0.5F, 0.5F, -0.5F, -0.5F, 0.5F,
     62 	0.5F, 0.5F, 0.5F, 0.5F, -0.5F, 0.5F, 0.5F, -0.5F, -0.5F, 0.5F, 0.5F, -0.5F,
     63 	-0.5F, -0.5F, -0.5F, -0.5F, -0.5F, 0.5F, -0.5F, 0.5F, 0.5F, -0.5F, 0.5F, -0.5F
     64 };
     65 
     66 GLfloat normals1[] = {
     67 	0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1,
     68 	0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1,
     69 	0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0,
     70 	0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0,
     71 	1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0,
     72 	-1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0
     73 };
     74 
     75 GLfloat colors1[] = {
     76 	1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0,
     77 	0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0,
     78 	1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0,
     79 	0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1,
     80 	1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0,
     81 	0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1
     82 };
     83 
     84 void initializeView(void)
     85 {
     86 	// Set viewing projection
     87 	glMatrixMode(GL_PROJECTION);
     88 	glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0);
     89 
     90 	// Position viewer
     91 	glMatrixMode(GL_MODELVIEW);
     92 	glTranslatef(0.0F, 0.0F, -2.0F);
     93 
     94 	// Position object
     95 	glRotatef(30.0F, 1.0F, 0.0F, 0.0F);
     96 	glRotatef(30.0F, 0.0F, 1.0F, 0.0F);
     97 
     98 	glEnable(GL_DEPTH_TEST);
     99 	glEnable(GL_COLOR_MATERIAL);
    100 }
    101 
    102 void initDisplayList(void)
    103 {
    104 	listIndex = glGenLists(1);
    105 	glNewList(listIndex, GL_COMPILE);
    106 	glNormalPointer(GL_FLOAT, 0, normals1);
    107 	glColorPointer(3, GL_FLOAT, 0, colors1);
    108 	glVertexPointer(3, GL_FLOAT, 0, vertices1);
    109 
    110 	glEnableClientState(GL_NORMAL_ARRAY);
    111 	glEnableClientState(GL_COLOR_ARRAY);
    112 	glEnableClientState(GL_VERTEX_ARRAY);
    113 
    114 	glPushMatrix();
    115 	glMultMatrixf(S);
    116 	glDrawArrays(GL_QUADS, 0, 24);
    117 	glPopMatrix();
    118 
    119 	glDisableClientState(GL_VERTEX_ARRAY);
    120 	glDisableClientState(GL_COLOR_ARRAY);
    121 	glDisableClientState(GL_NORMAL_ARRAY);
    122 	glEndList();
    123 }
    124 
    125 void redraw(void)
    126 {
    127 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    128 	glCallList(listIndex);
    129 
    130 	// Rotation
    131 	glMultMatrixf(R);
    132 
    133 	SwapBuffers(hDC);
    134 }
    135 
    136 void resize(void)
    137 {
    138 	// Set viewport to cover the window
    139 	glViewport(0, 0, winWidth, winHeight);
    140 }
    141 
    142 void setupPixelFormat(HDC hDC)
    143 {
    144 	PIXELFORMATDESCRIPTOR pfd = {
    145 		sizeof(PIXELFORMATDESCRIPTOR),  // Size
    146 		1,                              // Version
    147 		PFD_SUPPORT_OPENGL |
    148 		PFD_DRAW_TO_WINDOW |
    149 		PFD_DOUBLEBUFFER,               // Support double-buffering
    150 		PFD_TYPE_RGBA,                  // Color type
    151 		16,                             // Prefered color depth
    152 		0, 0, 0, 0, 0, 0,               // Color bits (ignored)
    153 		0,                              // No alpha buffer
    154 		0,                              // Alpha bits (ignored)
    155 		0,                              // No accumulation buffer
    156 		0, 0, 0, 0,                     // Accum bits (ignored)
    157 		16,                             // Depth buffer
    158 		0,                              // No stencil buffer
    159 		0,                              // No auxiliary buffers
    160 		PFD_MAIN_PLANE,                 // Main layer
    161 		0,                              // Reserved
    162 		0, 0, 0,                        // No layer, visible, damage masks
    163 	};
    164 	int pixelFormat;
    165 
    166 	pixelFormat = ChoosePixelFormat(hDC, &pfd);
    167 	if(pixelFormat == 0) {
    168 		MessageBox(WindowFromDC(hDC), L"ChoosePixelFormat failed.", L"Error",
    169 			MB_ICONERROR | MB_OK);
    170 		exit(1);
    171 	}
    172 
    173 	if(SetPixelFormat(hDC, pixelFormat, &pfd) != TRUE) {
    174 		MessageBox(WindowFromDC(hDC), L"SetPixelFormat failed.", L"Error",
    175 			MB_ICONERROR | MB_OK);
    176 		exit(1);
    177 	}
    178 }
    179 
    180 int __stdcall WinMain(__in HINSTANCE hCurrentInst, __in_opt HINSTANCE hPreviousInst, __in_opt LPSTR lpCmdLine, __in int nShowCmd)
    181 {
    182 	WNDCLASS wndClass;
    183 	HWND hWnd;
    184 	MSG msg;
    185 
    186 	// Register window class
    187 	wndClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
    188 	wndClass.lpfnWndProc = WndProc;
    189 	wndClass.cbClsExtra = 0;
    190 	wndClass.cbWndExtra = 0;
    191 	wndClass.hInstance = hCurrentInst;
    192 	wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    193 	wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    194 	wndClass.hbrBackground = (HBRUSH)BLACK_BRUSH;
    195 	wndClass.lpszMenuName = NULL;
    196 	wndClass.lpszClassName = L"OpenGL cube";
    197 	RegisterClass(&wndClass);
    198 
    199 	// Create window
    200 	hWnd = CreateWindow(
    201 		L"OpenGL cube", L"OpenGL",
    202 		WS_OVERLAPPEDWINDOW,
    203 		winX, winY, winWidth, winHeight,
    204 		NULL, NULL, hCurrentInst, NULL);
    205 
    206 	// Display window
    207 	ShowWindow(hWnd, nShowCmd);
    208 
    209 	hDC = GetDC(hWnd);
    210 	setupPixelFormat(hDC);
    211 	hGLRC = wglCreateContext(hDC);
    212 	wglMakeCurrent(hDC, hGLRC);
    213 	initializeView();
    214 	initDisplayList();
    215 
    216 	while(true)
    217 	{
    218 		if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    219 		{
    220 			if(msg.message == WM_QUIT)
    221 			{
    222 				break;
    223 			}
    224 
    225 			TranslateMessage(&msg);
    226 			DispatchMessage(&msg);
    227 		}
    228 		else
    229 		{
    230 			redraw();
    231 		}
    232 	}
    233 
    234 	wglMakeCurrent(NULL, NULL);
    235 	wglDeleteContext(hGLRC);
    236 	ReleaseDC(hWnd, hDC);
    237 
    238 	return msg.wParam;
    239 }
    240 
    241 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    242 {
    243 	switch(message) {
    244 	case WM_DESTROY:
    245 		// Finish OpenGL rendering
    246 		if(hGLRC) {
    247 			wglMakeCurrent(NULL, NULL);
    248 			wglDeleteContext(hGLRC);
    249 		}
    250 		if(hPalette) {
    251 			DeleteObject(hPalette);
    252 		}
    253 		ReleaseDC(hWnd, hDC);
    254 		PostQuitMessage(0);
    255 		return 0;
    256 	case WM_SIZE:
    257 		// Track window size changes
    258 		if(hGLRC) {
    259 			winWidth = (int)LOWORD(lParam);
    260 			winHeight = (int)HIWORD(lParam);
    261 			resize();
    262 			return 0;
    263 		}
    264 	case WM_PALETTECHANGED:
    265 		// Realize palette if this is *not* the current window
    266 		if(hGLRC && hPalette && (HWND)wParam != hWnd) {
    267 			UnrealizeObject(hPalette);
    268 			SelectPalette(hDC, hPalette, FALSE);
    269 			RealizePalette(hDC);
    270 			redraw();
    271 			break;
    272 		}
    273 		break;
    274 	case WM_QUERYNEWPALETTE:
    275 		// Realize palette if this is the current window
    276 		if(hGLRC && hPalette) {
    277 			UnrealizeObject(hPalette);
    278 			SelectPalette(hDC, hPalette, FALSE);
    279 			RealizePalette(hDC);
    280 			return TRUE;
    281 		}
    282 		break;
    283 	default:
    284 		break;
    285 	}
    286 
    287 	return DefWindowProc(hWnd, message, wParam, lParam);
    288 }