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