/************************************************************************************************
 * Small footprint OpenGL init code made by Rasmus Christian Kaae (kaae@daimi.au.dk)            *
 * Made in January 2002 - Please credit me if you use this!                                     *
 *                                                                                              *
 * Usage:                                                                                       *
 *        Make a main.c file containing two functions :                                         *
 *                                                                                              *
 *        void InitIntro()                                                                      *
 *        { /* todo: init stuff */ }                                                            *
 *        void RunIntro()                                                                       *
 *        {                                                                                     *
 *             glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);                              *
 *             /* todo: display something nice */                                               *
 *        }                                                                                     *
 *                                                                                              *
 *        Compile your DEBUG project as normal and set your RELEASE version to no-defaultlibs.  *
 *        This OpenGL init code will leave a small footprint of about 1.5kb uncompressed code.  *                            
 *        Tested with MS Visual Studio 6.0.                                                     *
 ************************************************************************************************/

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>

/************************************************************************************************/

// out-comment this to get windowed rendering
#define FULLSCREEN

/************************************************************************************************/


// implement these in your main.c file 
extern void InitIntro();
extern void RunIntro();

/************************************************************************************************/

#ifdef _DEBUG
int WINAPI WinMain(HINSTANCE i, HINSTANCE p, LPSTR cmd, int n)
#else
int WinMainCRTStartup()
#endif
{
 PIXELFORMATDESCRIPTOR pfd;
 HWND hwnd;
 HDC hdc;
 int  pixelFormat;
#ifdef FULLSCREEN
 DEVMODE dmScreenSettings;                                            // Device Mode
#endif
#ifndef _DEBUG
 HINSTANCE i = GetModuleHandle(NULL);
#endif

 /* init the pixelformat descriptor */ 
 RtlZeroMemory(&pfd,sizeof(PIXELFORMATDESCRIPTOR));                   // Clear the struct
 pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR);                             // Size 
 pfd.nVersion=1;                                                      // Version
 pfd.dwFlags=PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;  // Selected flags
 pfd.iPixelType=PFD_TYPE_RGBA;                                        // Pixelformat
 pfd.cColorBits=32;                                                   // Pixel depth
 pfd.cDepthBits=16;                                                   // Zbuffer depth
 pfd.iLayerType=PFD_MAIN_PLANE;                                       // Place the pixelformat on the main plane


#ifdef FULLSCREEN
 /* init the resolution change settings */
 RtlZeroMemory(&dmScreenSettings,sizeof(dmScreenSettings));           // Clear the struct
 dmScreenSettings.dmSize=sizeof(dmScreenSettings);                    // Size Of The Devmode Structure
 dmScreenSettings.dmPelsWidth   = 640;                                // Selected Screen Width
 dmScreenSettings.dmPelsHeight  = 480;                                // Selected Screen Height
 dmScreenSettings.dmBitsPerPel  = 32;                                 // Selected Bits Per Pixel
 dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;  // Notify which fields we have used 

 if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL) return 0;
#endif

 /* setup the window handle */
 hwnd=CreateWindowEx(WS_EX_TOOLWINDOW, "STATIC", "blipblop", WS_POPUP|WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN, 0, 0, 640, 480, 0, 0, i, 0); 

 /* select the pixel format for the current window */ 
 hdc = GetDC(hwnd);
 pixelFormat = ChoosePixelFormat(hdc, &pfd);
 SetPixelFormat(hdc, pixelFormat, &pfd);
 wglMakeCurrent( hdc, wglCreateContex(hdc) );

 /* cursor be gone */
 SetCursor(0);

 /* init the actual intro */	
 InitIntro();

 /* loop until escape is pressed all normal windows messages are ignored */
 while (!GetAsyncKeyState(VK_ESCAPE))
 {
   RunIntro();              // nifty effects here
   SwapBuffers(hdc);        // display the cool stuff
 }
  
  return 0;                 // exit to OS
}
