10ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner/* San Angeles Observation OpenGL ES version example
20ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner * Copyright 2004-2005 Jetro Lauha
30ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner * All rights reserved.
40ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner * Web: http://iki.fi/jetro/
50ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner *
60ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner * This source is free software; you can redistribute it and/or
70ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner * modify it under the terms of EITHER:
80ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner *   (1) The GNU Lesser General Public License as published by the Free
90ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner *       Software Foundation; either version 2.1 of the License, or (at
100ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner *       your option) any later version. The text of the GNU Lesser
110ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner *       General Public License is included with this source in the
120ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner *       file LICENSE-LGPL.txt.
130ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner *   (2) The BSD-style license that is included with this source in
140ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner *       the file LICENSE-BSD.txt.
150ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner *
160ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner * This source is distributed in the hope that it will be useful,
170ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner * but WITHOUT ANY WARRANTY; without even the implied warranty of
180ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files
190ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner * LICENSE-LGPL.txt and LICENSE-BSD.txt for more details.
200ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner *
210ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner * $Id: app-win32.c,v 1.6 2005/02/24 20:29:00 tonic Exp $
220ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner * $Revision: 1.6 $
230ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner */
240ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
250ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#define WIN32_LEAN_AND_MEAN
260ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#include <windows.h>
270ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#include <tchar.h>
280ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#ifdef UNDER_CE
290ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#include <aygshell.h>
300ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#endif
310ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
320ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#include <stdio.h>
330ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
340ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#include "importgl.h"
350ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
360ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#include "app.h"
370ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
380ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
390ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerint gAppAlive = 1;
400ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
410ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerstatic HINSTANCE sInstance;
420ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
430ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerstatic const _TCHAR sAppName[] =
440ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    _T("San Angeles Observation OpenGL ES version example (Win32)");
450ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerstatic HWND sWnd;
460ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerstatic int sWindowWidth = WINDOW_DEFAULT_WIDTH;
470ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerstatic int sWindowHeight = WINDOW_DEFAULT_HEIGHT;
480ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerstatic EGLDisplay sEglDisplay = EGL_NO_DISPLAY;
490ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerstatic EGLConfig sEglConfig;
500ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerstatic EGLContext sEglContext = EGL_NO_CONTEXT;
510ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerstatic EGLSurface sEglSurface = EGL_NO_SURFACE;
520ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
530ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
540ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerstatic void checkGLErrors()
550ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner{
560ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    GLenum error = glGetError();
570ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    if (error != GL_NO_ERROR)
580ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    {
590ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        _TCHAR errorString[32];
600ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        _stprintf(errorString, _T("0x%04x"), error);
610ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        MessageBox(NULL, errorString, _T("GL Error"), MB_OK);
620ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    }
630ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner}
640ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
650ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
660ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerstatic void checkEGLErrors()
670ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner{
680ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    EGLint error = eglGetError();
690ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    if (error != EGL_SUCCESS)
700ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    {
710ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        _TCHAR errorString[32];
720ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        _stprintf(errorString, _T("0x%04x"), error);
730ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        MessageBox(NULL, errorString, _T("EGL Initialization Error"), MB_OK);
740ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    }
750ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner}
760ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
770ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
780ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerstatic BOOL initEGL(HWND wnd)
790ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner{
800ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    static const EGLint configAttribs[] =
810ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    {
820ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#if (WINDOW_BPP == 16)
830ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        EGL_RED_SIZE,       5,
840ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        EGL_GREEN_SIZE,     5,
850ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        EGL_BLUE_SIZE,      5,
860ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#elif (WINDOW_BPP == 32)
870ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        EGL_RED_SIZE,       8,
880ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        EGL_GREEN_SIZE,     8,
890ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        EGL_BLUE_SIZE,      8,
900ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#else
910ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#error WINDOW_BPP must be 16 or 32
920ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#endif
930ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        EGL_DEPTH_SIZE,     16,
940ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        EGL_ALPHA_SIZE,     EGL_DONT_CARE,
950ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        EGL_STENCIL_SIZE,   EGL_DONT_CARE,
960ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        EGL_SURFACE_TYPE,   EGL_WINDOW_BIT,
970ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        EGL_NONE
980ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    };
990ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    EGLBoolean success;
1000ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    EGLint numConfigs;
1010ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    EGLint majorVersion;
1020ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    EGLint minorVersion;
1030ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#ifdef PVRSDK
1040ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    HDC dc;
1050ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#endif // PVRSDK
1060ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
1070ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#ifndef DISABLE_IMPORTGL
1080ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    int importGLResult;
1090ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    importGLResult = importGLInit();
1100ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    if (!importGLResult)
1110ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        return FALSE;
1120ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#endif // !DISABLE_IMPORTGL
1130ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
1140ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#ifdef PVRSDK
1150ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    dc = GetDC(sWnd);
1160ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    sEglDisplay = eglGetDisplay(dc);
1170ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#else
1180ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    sEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
1190ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#endif // !PVRSDK
1200ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    success = eglInitialize(sEglDisplay, &majorVersion, &minorVersion);
1210ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    if (success != EGL_FALSE)
1220ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        success = eglGetConfigs(sEglDisplay, NULL, 0, &numConfigs);
1230ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    if (success != EGL_FALSE)
1240ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        success = eglChooseConfig(sEglDisplay, configAttribs,
1250ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner                                  &sEglConfig, 1, &numConfigs);
1260ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    if (success != EGL_FALSE)
1270ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    {
1280ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        sEglSurface = eglCreateWindowSurface(sEglDisplay, sEglConfig,
1290ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner                                             wnd, NULL);
1300ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        if (sEglSurface == EGL_NO_SURFACE)
1310ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner            success = EGL_FALSE;
1320ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    }
1330ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    if (success != EGL_FALSE)
1340ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    {
1350ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        sEglContext = eglCreateContext(sEglDisplay, sEglConfig, NULL, NULL);
1360ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        if (sEglContext == EGL_NO_CONTEXT)
1370ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner            success = EGL_FALSE;
1380ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    }
1390ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    if (success != EGL_FALSE)
1400ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        success = eglMakeCurrent(sEglDisplay, sEglSurface,
1410ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner                                 sEglSurface, sEglContext);
1420ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
1430ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    if (success == EGL_FALSE)
1440ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        checkEGLErrors();
1450ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
1460ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    return success;
1470ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner}
1480ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
1490ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
1500ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerstatic void deinitEGL()
1510ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner{
1520ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    eglMakeCurrent(sEglDisplay, NULL, NULL, NULL);
1530ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    eglDestroyContext(sEglDisplay, sEglContext);
1540ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    eglDestroySurface(sEglDisplay, sEglSurface);
1550ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    eglTerminate(sEglDisplay);
1560ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#ifndef DISABLE_IMPORTGL
1570ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    importGLDeinit();
1580ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#endif // !DISABLE_IMPORTGL
1590ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner}
1600ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
1610ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
1620ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerstatic LRESULT CALLBACK wndProc(HWND wnd, UINT message,
1630ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner                                WPARAM wParam, LPARAM lParam)
1640ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner{
1650ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    RECT rc;
1660ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    int useDefWindowProc = 0;
1670ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
1680ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    switch (message)
1690ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    {
1700ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    case WM_CLOSE:
1710ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        DestroyWindow(wnd);
1720ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        gAppAlive = 0;
1730ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        break;
1740ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
1750ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    case WM_DESTROY:
1760ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        PostQuitMessage(0);
1770ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        gAppAlive = 0;
1780ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        break;
1790ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
1800ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    case WM_KEYDOWN:
1810ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        if (wParam == VK_ESCAPE || wParam == VK_RETURN)
1820ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner            gAppAlive = 0;
1830ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        useDefWindowProc = 1;
1840ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        break;
1850ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
1860ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    case WM_KEYUP:
1870ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        useDefWindowProc = 1;
1880ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        break;
1890ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
1900ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    case WM_SIZE:
1910ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        GetClientRect(sWnd, &rc);
1920ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        sWindowWidth = rc.right;
1930ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        sWindowHeight = rc.bottom;
1940ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        break;
1950ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
1960ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    default:
1970ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        useDefWindowProc = 1;
1980ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    }
1990ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2000ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    if (useDefWindowProc)
2010ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        return DefWindowProc(wnd, message, wParam, lParam);
2020ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    return 0;
2030ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner}
2040ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2050ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2060ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turnerint WINAPI WinMain(HINSTANCE instance, HINSTANCE prevInstance,
2070ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner                   LPTSTR cmdLine, int cmdShow)
2080ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner{
2090ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    MSG msg;
2100ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    WNDCLASS wc;
2110ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    DWORD windowStyle;
2120ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    int windowX, windowY;
2130ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2140ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    // not referenced:
2150ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    prevInstance = prevInstance;
2160ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    cmdLine = cmdLine;
2170ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2180ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2190ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    sInstance = instance;
2200ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2210ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    // register class
2220ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    wc.style = CS_HREDRAW | CS_VREDRAW;
2230ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    wc.lpfnWndProc = (WNDPROC)wndProc;
2240ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    wc.cbClsExtra = 0;
2250ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    wc.cbWndExtra = 0;
2260ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    wc.hInstance = sInstance;
2270ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    wc.hIcon = NULL;
2280ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    wc.hCursor = 0;
2290ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    wc.hbrBackground = GetStockObject(BLACK_BRUSH);
2300ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    wc.lpszMenuName = NULL;
2310ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    wc.lpszClassName = sAppName;
2320ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    if (!RegisterClass(&wc))
2330ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        return FALSE;
2340ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2350ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    // init instance
2360ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    windowStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE;
2370ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#ifdef UNDER_CE
2380ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    sWindowWidth = GetSystemMetrics(SM_CXSCREEN);
2390ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    sWindowHeight = GetSystemMetrics(SM_CYSCREEN);
2400ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    windowX = windowY = 0;
2410ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#else
2420ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    windowStyle |= WS_OVERLAPPEDWINDOW;
2430ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    windowX = CW_USEDEFAULT;
2440ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    windowY = 0;
2450ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#endif
2460ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    sWnd = CreateWindow(sAppName, sAppName, windowStyle,
2470ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner                        windowX, windowY,
2480ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner                        sWindowWidth, sWindowHeight,
2490ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner                        NULL, NULL, instance, NULL);
2500ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    if (!sWnd)
2510ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        return FALSE;
2520ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2530ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    ShowWindow(sWnd, cmdShow);
2540ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2550ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#ifdef UNDER_CE
2560ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    SHFullScreen(sWnd,
2570ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner                 SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON);
2580ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    MoveWindow(sWnd, 0, 0, sWindowWidth, sWindowHeight, TRUE);
2590ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner#endif
2600ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2610ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    UpdateWindow(sWnd);
2620ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2630ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    if (!initEGL(sWnd))
2640ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        return FALSE;
2650ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2660ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    appInit(sWindowWidth, sWindowHeight);
2670ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2680ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    while (gAppAlive)
2690ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    {
2700ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        while (PeekMessage(&msg, sWnd, 0, 0, PM_NOREMOVE))
2710ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        {
2720ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner            if (GetMessage(&msg, sWnd, 0, 0))
2730ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner            {
2740ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner                TranslateMessage(&msg);
2750ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner                DispatchMessage(&msg);
2760ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner            }
2770ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner            else
2780ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner                gAppAlive = 0;
2790ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        }
2800ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2810ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        if (gAppAlive)
2820ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        {
2830ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner            appRender(GetTickCount(), sWindowWidth, sWindowHeight);
2840ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner            checkGLErrors();
2850ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner            eglSwapBuffers(sEglDisplay, sEglSurface);
2860ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner            checkEGLErrors();
2870ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner        }
2880ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    }
2890ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2900ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    appDeinit();
2910ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    deinitEGL();
2920ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner
2930ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner    return 0;
2940ae5c705473be544c624e9298bbdcc5ae2b91968David 'Digit' Turner}
295