// 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 #include #include #define PI 3.14159265 #define SCALE_FACTOR 0.5 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); const char *className = "OpenGL"; const 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); }