| /* San Angeles Observation OpenGL ES version example |
| * Copyright 2004-2005 Jetro Lauha |
| * All rights reserved. |
| * Web: http://iki.fi/jetro/ |
| * |
| * This source is free software; you can redistribute it and/or |
| * modify it under the terms of EITHER: |
| * (1) The GNU Lesser General Public License as published by the Free |
| * Software Foundation; either version 2.1 of the License, or (at |
| * your option) any later version. The text of the GNU Lesser |
| * General Public License is included with this source in the |
| * file LICENSE-LGPL.txt. |
| * (2) The BSD-style license that is included with this source in |
| * the file LICENSE-BSD.txt. |
| * |
| * This source is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files |
| * LICENSE-LGPL.txt and LICENSE-BSD.txt for more details. |
| * |
| * $Id: app-win32.c,v 1.6 2005/02/24 20:29:00 tonic Exp $ |
| * $Revision: 1.6 $ |
| */ |
| |
| #define WIN32_LEAN_AND_MEAN |
| #include <windows.h> |
| #include <tchar.h> |
| #ifdef UNDER_CE |
| #include <aygshell.h> |
| #endif |
| |
| #include <stdio.h> |
| |
| #include "importgl.h" |
| |
| #include "app.h" |
| |
| |
| int gAppAlive = 1; |
| |
| static HINSTANCE sInstance; |
| |
| static const _TCHAR sAppName[] = |
| _T("San Angeles Observation OpenGL ES version example (Win32)"); |
| static HWND sWnd; |
| static int sWindowWidth = WINDOW_DEFAULT_WIDTH; |
| static int sWindowHeight = WINDOW_DEFAULT_HEIGHT; |
| static EGLDisplay sEglDisplay = EGL_NO_DISPLAY; |
| static EGLConfig sEglConfig; |
| static EGLContext sEglContext = EGL_NO_CONTEXT; |
| static EGLSurface sEglSurface = EGL_NO_SURFACE; |
| |
| |
| static void checkGLErrors() |
| { |
| GLenum error = glGetError(); |
| if (error != GL_NO_ERROR) |
| { |
| _TCHAR errorString[32]; |
| _stprintf(errorString, _T("0x%04x"), error); |
| MessageBox(NULL, errorString, _T("GL Error"), MB_OK); |
| } |
| } |
| |
| |
| static void checkEGLErrors() |
| { |
| EGLint error = eglGetError(); |
| if (error != EGL_SUCCESS) |
| { |
| _TCHAR errorString[32]; |
| _stprintf(errorString, _T("0x%04x"), error); |
| MessageBox(NULL, errorString, _T("EGL Initialization Error"), MB_OK); |
| } |
| } |
| |
| |
| static BOOL initEGL(HWND wnd) |
| { |
| static const EGLint configAttribs[] = |
| { |
| #if (WINDOW_BPP == 16) |
| EGL_RED_SIZE, 5, |
| EGL_GREEN_SIZE, 5, |
| EGL_BLUE_SIZE, 5, |
| #elif (WINDOW_BPP == 32) |
| EGL_RED_SIZE, 8, |
| EGL_GREEN_SIZE, 8, |
| EGL_BLUE_SIZE, 8, |
| #else |
| #error WINDOW_BPP must be 16 or 32 |
| #endif |
| EGL_DEPTH_SIZE, 16, |
| EGL_ALPHA_SIZE, EGL_DONT_CARE, |
| EGL_STENCIL_SIZE, EGL_DONT_CARE, |
| EGL_SURFACE_TYPE, EGL_WINDOW_BIT, |
| EGL_NONE |
| }; |
| EGLBoolean success; |
| EGLint numConfigs; |
| EGLint majorVersion; |
| EGLint minorVersion; |
| #ifdef PVRSDK |
| HDC dc; |
| #endif // PVRSDK |
| |
| #ifndef DISABLE_IMPORTGL |
| int importGLResult; |
| importGLResult = importGLInit(); |
| if (!importGLResult) |
| return FALSE; |
| #endif // !DISABLE_IMPORTGL |
| |
| #ifdef PVRSDK |
| dc = GetDC(sWnd); |
| sEglDisplay = eglGetDisplay(dc); |
| #else |
| sEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); |
| #endif // !PVRSDK |
| success = eglInitialize(sEglDisplay, &majorVersion, &minorVersion); |
| if (success != EGL_FALSE) |
| success = eglGetConfigs(sEglDisplay, NULL, 0, &numConfigs); |
| if (success != EGL_FALSE) |
| success = eglChooseConfig(sEglDisplay, configAttribs, |
| &sEglConfig, 1, &numConfigs); |
| if (success != EGL_FALSE) |
| { |
| sEglSurface = eglCreateWindowSurface(sEglDisplay, sEglConfig, |
| wnd, NULL); |
| if (sEglSurface == EGL_NO_SURFACE) |
| success = EGL_FALSE; |
| } |
| if (success != EGL_FALSE) |
| { |
| sEglContext = eglCreateContext(sEglDisplay, sEglConfig, NULL, NULL); |
| if (sEglContext == EGL_NO_CONTEXT) |
| success = EGL_FALSE; |
| } |
| if (success != EGL_FALSE) |
| success = eglMakeCurrent(sEglDisplay, sEglSurface, |
| sEglSurface, sEglContext); |
| |
| if (success == EGL_FALSE) |
| checkEGLErrors(); |
| |
| return success; |
| } |
| |
| |
| static void deinitEGL() |
| { |
| eglMakeCurrent(sEglDisplay, NULL, NULL, NULL); |
| eglDestroyContext(sEglDisplay, sEglContext); |
| eglDestroySurface(sEglDisplay, sEglSurface); |
| eglTerminate(sEglDisplay); |
| #ifndef DISABLE_IMPORTGL |
| importGLDeinit(); |
| #endif // !DISABLE_IMPORTGL |
| } |
| |
| |
| static LRESULT CALLBACK wndProc(HWND wnd, UINT message, |
| WPARAM wParam, LPARAM lParam) |
| { |
| RECT rc; |
| int useDefWindowProc = 0; |
| |
| switch (message) |
| { |
| case WM_CLOSE: |
| DestroyWindow(wnd); |
| gAppAlive = 0; |
| break; |
| |
| case WM_DESTROY: |
| PostQuitMessage(0); |
| gAppAlive = 0; |
| break; |
| |
| case WM_KEYDOWN: |
| if (wParam == VK_ESCAPE || wParam == VK_RETURN) |
| gAppAlive = 0; |
| useDefWindowProc = 1; |
| break; |
| |
| case WM_KEYUP: |
| useDefWindowProc = 1; |
| break; |
| |
| case WM_SIZE: |
| GetClientRect(sWnd, &rc); |
| sWindowWidth = rc.right; |
| sWindowHeight = rc.bottom; |
| break; |
| |
| default: |
| useDefWindowProc = 1; |
| } |
| |
| if (useDefWindowProc) |
| return DefWindowProc(wnd, message, wParam, lParam); |
| return 0; |
| } |
| |
| |
| int WINAPI WinMain(HINSTANCE instance, HINSTANCE prevInstance, |
| LPTSTR cmdLine, int cmdShow) |
| { |
| MSG msg; |
| WNDCLASS wc; |
| DWORD windowStyle; |
| int windowX, windowY; |
| |
| // not referenced: |
| prevInstance = prevInstance; |
| cmdLine = cmdLine; |
| |
| |
| sInstance = instance; |
| |
| // register class |
| wc.style = CS_HREDRAW | CS_VREDRAW; |
| wc.lpfnWndProc = (WNDPROC)wndProc; |
| wc.cbClsExtra = 0; |
| wc.cbWndExtra = 0; |
| wc.hInstance = sInstance; |
| wc.hIcon = NULL; |
| wc.hCursor = 0; |
| wc.hbrBackground = GetStockObject(BLACK_BRUSH); |
| wc.lpszMenuName = NULL; |
| wc.lpszClassName = sAppName; |
| if (!RegisterClass(&wc)) |
| return FALSE; |
| |
| // init instance |
| windowStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE; |
| #ifdef UNDER_CE |
| sWindowWidth = GetSystemMetrics(SM_CXSCREEN); |
| sWindowHeight = GetSystemMetrics(SM_CYSCREEN); |
| windowX = windowY = 0; |
| #else |
| windowStyle |= WS_OVERLAPPEDWINDOW; |
| windowX = CW_USEDEFAULT; |
| windowY = 0; |
| #endif |
| sWnd = CreateWindow(sAppName, sAppName, windowStyle, |
| windowX, windowY, |
| sWindowWidth, sWindowHeight, |
| NULL, NULL, instance, NULL); |
| if (!sWnd) |
| return FALSE; |
| |
| ShowWindow(sWnd, cmdShow); |
| |
| #ifdef UNDER_CE |
| SHFullScreen(sWnd, |
| SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON); |
| MoveWindow(sWnd, 0, 0, sWindowWidth, sWindowHeight, TRUE); |
| #endif |
| |
| UpdateWindow(sWnd); |
| |
| if (!initEGL(sWnd)) |
| return FALSE; |
| |
| appInit(sWindowWidth, sWindowHeight); |
| |
| while (gAppAlive) |
| { |
| while (PeekMessage(&msg, sWnd, 0, 0, PM_NOREMOVE)) |
| { |
| if (GetMessage(&msg, sWnd, 0, 0)) |
| { |
| TranslateMessage(&msg); |
| DispatchMessage(&msg); |
| } |
| else |
| gAppAlive = 0; |
| } |
| |
| if (gAppAlive) |
| { |
| appRender(GetTickCount(), sWindowWidth, sWindowHeight); |
| checkGLErrors(); |
| eglSwapBuffers(sEglDisplay, sEglSurface); |
| checkEGLErrors(); |
| } |
| } |
| |
| appDeinit(); |
| deinitEGL(); |
| |
| return 0; |
| } |