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