| // 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); | |
| } |