/****************************************************************************
snow.cpp
This demo program demonstrates a simple snowstorm particle effect
Author : Dave Astle
Date : 3/17/2001
Written for OpenGL Game Programming
*****************************************************************************/
/********************************* Includes *********************************/
#define WIN32_LEAN_AND_MEAN // get rid of Windows things we don't need
#include <windows.h> // included in all Windows apps
#include <winuser.h> // Windows constants
#include <gl/gl.h> // OpenGL include
#include <gl/glu.h> // OpenGL utilty library
#include "snowstorm.h"
#include "HiResTimer.h"
#define WND_CLASS_NAME "OpenGL Window Class"
/*************************** Constants and Macros ***************************/
const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;
const int SCREEN_BPP = 32;
const bool USE_FULLSCREEN = false;
const char *APP_TITLE = "Snowstorm Demo";
/********************************* Globals **********************************/
HDC g_hdc; // device context
HGLRC g_hrc; // rendering context
BOOL g_isFullscreen = TRUE; // toggles fullscreen and windowed display
BOOL g_isActive = TRUE; // false if window is minimized
HWND g_hwnd = NULL; // main window handle
HINSTANCE g_hInstance; // application instance
CSnowstorm g_snowstorm(5000, vector3_t(0.0, 0.0, -5.0), 5.0, 5.0, 5.0);
CHiResTimer g_timer;
/******************************** Prototypes ********************************/
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL SetupWindow(const char *title, int width, int height, int bits, bool isFullscreen);
BOOL KillWindow();
GLvoid ResizeScene(GLsizei width, GLsizei height);
BOOL InitializeScene();
BOOL DisplayScene(float elapsedTime);
BOOL Cleanup();
/*****************************************************************************
WinMain()
Windows entry point
*****************************************************************************/
int WINAPI WinMain(HINSTANCE g_hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
MSG msg; // message
BOOL isDone; // flag indicatingen the app is done
// if the window is set up correctly, we can proceed with the message loop
if (SetupWindow(APP_TITLE, SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, USE_FULLSCREEN))
isDone = FALSE;
// otherwise, we need to never enter the loop and proceed to exit
else
isDone = TRUE;
g_timer.Init();
// main message loop
while (!isDone)
{
if(PeekMessage(&msg, g_hwnd, NULL, NULL, PM_REMOVE))
{
if (msg.message == WM_QUIT) // do we receive a WM_QUIT message?
{
isDone = TRUE; // if so, time to quit the application
}
else
{
TranslateMessage(&msg); // translate and dispatch to event queue
DispatchMessage(&msg);
}
}
// don't update the scene if the app is minimized
if (g_isActive)
{
// update the scene every time through the loop
DisplayScene(g_timer.GetElapsedSeconds());
// switch the front and back buffers to display the updated scene
SwapBuffers(g_hdc);
}
}
Cleanup();
KillWindow();
return msg.wParam;
} // end WinMain()
/*****************************************************************************
WndProc()
Windows message handler
*****************************************************************************/
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_ACTIVATE: // watch for the window being minimized and restored
{
if (!HIWORD(wParam))
{
// program was restored or maximized
g_isActive = TRUE;
}
else
{
// program was minimized
g_isActive=FALSE;
}
return 0;
}
case WM_SYSCOMMAND: // look for screensavers and powersave mode
{
switch (wParam)
{
case SC_SCREENSAVE: // screensaver trying to start
case SC_MONITORPOWER: // monitor going to powersave mode
// returning 0 prevents either from happening
return 0;
default:
break;
}
} break;
case WM_CLOSE: // window is being closed
{
// send WM_QUIT to message queue
PostQuitMessage(0);
return 0;
}
case WM_SIZE:
{
// update perspective with new width and height
ResizeScene(LOWORD(lParam), HIWORD(lParam));
return 0;
}
case WM_CHAR:
{
switch (toupper(wParam))
{
case VK_ESCAPE:
{
// send WM_QUIT to message queue
PostQuitMessage(0);
return 0;
}
default:
break;
};
} break;
case WM_MOVE:
{
// avoid a jump when the window is moved
g_timer.GetElapsedSeconds();
break;
}
default:
break;
}
return (DefWindowProc(hwnd, message, wParam, lParam));
} // end WndProc()
/*****************************************************************************
SetupWindow()
Create the window and everything else we need, including the device and
rendering context. If a fullscreen window has been requested but can't be
created, the user will be prompted to attempt windowed mode. Finally,
InitializeScene is called for application-specific setup.
Returns TRUE if everything goes well, or FALSE if an unrecoverable error
occurs. Note that if this is called twice within a program, KillWindow needs
to be called before subsequent calls to SetupWindow.
*****************************************************************************/
BOOL SetupWindow(const char *title, int width, int height, int bits, bool isFullscreen)
{
// set the global flag
g_isFullscreen = isFullscreen;
// get our instance handle
g_hInstance = GetModuleHandle(NULL);
WNDCLASSEX wc; // window class
// fill out the window class structure
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = g_hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // default icon
wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // windows logo small icon
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // default arrow
wc.hbrBackground = NULL; // no background needed
wc.lpszMenuName = NULL; // no menu
wc.lpszClassName = WND_CLASS_NAME;
// register the windows class
if (!RegisterClassEx(&wc))
{
MessageBox(NULL,"Unable to register the window class", "Error", MB_OK | MB_ICONEXCLAMATION);
// exit and return FALSE
return FALSE;
}
// if we're in fullscreen mode, set the display up for it
if (g_isFullscreen)
{
// set up the device mode structure
DEVMODE screenSettings;
memset(&screenSettings,0,sizeof(screenSettings));
screenSettings.dmSize = sizeof(screenSettings);
screenSettings.dmPelsWidth = width; // screen width
screenSettings.dmPelsHeight = height; // screen height
screenSettings.dmBitsPerPel = bits; // bits per pixel
screenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
// attempt to switch to the resolution and bit depth we've selected
if (ChangeDisplaySettings(&screenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
{
// if we can't get fullscreen, let them choose to quit or try windowed mode
if (MessageBox(NULL, "Cannot run in the
评论0
最新资源