Global Variables
// Application instance handle (set in WinMain). 
 
static HINSTANCE               hAppInstance              = NULL; 
 
// Running in debug mode? 
 
static BOOL                    fDebug                    = FALSE; 
 
// Is the application active? 
 
static BOOL                    fActive                   = TRUE; 
 
// Has the application been suspended? 
 
static BOOL                    fSuspended                = FALSE; 
 
// DirectDraw interfaces 
 
static LPDIRECTDRAW            lpdd                      = NULL; 
static LPDIRECTDRAWSURFACE     lpddPrimary               = NULL; 
static LPDIRECTDRAWSURFACE     lpddDevice                = NULL; 
static LPDIRECTDRAWSURFACE     lpddZBuffer               = NULL; 
static LPDIRECTDRAWPALETTE     lpddPalette               = NULL; 
 
// Direct3D interfaces 
 
static LPDIRECT3D              lpd3d                     = NULL; 
static LPDIRECT3DDEVICE        lpd3dDevice               = NULL; 
static LPDIRECT3DMATERIAL      lpd3dMaterial             = NULL; 
static LPDIRECT3DMATERIAL      lpd3dBackgroundMaterial   = NULL; 
static LPDIRECT3DVIEWPORT      lpd3dViewport             = NULL; 
static LPDIRECT3DLIGHT         lpd3dLight                = NULL; 
static LPDIRECT3DEXECUTEBUFFER lpd3dExecuteBuffer        = NULL; 
 
// Direct3D handles 
 
static D3DMATRIXHANDLE         hd3dWorldMatrix           = 0; 
static D3DMATRIXHANDLE         hd3dViewMatrix            = 0; 
static D3DMATRIXHANDLE         hd3dProjMatrix            = 0; 
static D3DMATERIALHANDLE       hd3dSurfaceMaterial       = 0; 
static D3DMATERIALHANDLE       hd3dBackgroundMaterial    = 0; 
 
// Globals used for selecting the Direct3D device. They are 
// globals because this makes it easy for the enumeration callback 
// function to read and write from them. 
 
static BOOL                    fDeviceFound              = FALSE; 
static DWORD                   dwDeviceBitDepth          = 0; 
static GUID                    guidDevice; 
static char                    szDeviceName[MAX_DEVICE_NAME]; 
static char                    szDeviceDesc[MAX_DEVICE_DESC]; 
static D3DDEVICEDESC           d3dHWDeviceDesc; 
static D3DDEVICEDESC           d3dSWDeviceDesc; 
 
// The screen coordinates of the client area of the window. This 
// rectangle defines the destination into which we blit to update 
// the client area of the window with the results of the 3-D rendering. 
 
static RECT                    rDstRect; 
 
// This rectangle defines the portion of the rendering target surface 
// into which we render. The top-left coordinates of this rectangle 
// are always zero; the right and bottom coordinates give the size of 
// the viewport. 
 
static RECT                    rSrcRect; 
 
// Angle of rotation of the world matrix. 
 
static double                  dAngleOfRotation          = 0.0; 
 
// Predefined transformations. 
 
static D3DMATRIX d3dWorldMatrix = 
{ 
    D3DVAL( 1.0), D3DVAL( 0.0), D3DVAL( 0.0), D3DVAL( 0.0), 
    D3DVAL( 0.0), D3DVAL( 1.0), D3DVAL( 0.0), D3DVAL( 0.0), 
    D3DVAL( 0.0), D3DVAL( 0.0), D3DVAL( 1.0), D3DVAL( 0.0), 
    D3DVAL( 0.0), D3DVAL( 0.0), D3DVAL( 0.0), D3DVAL( 1.0) 
}; 
 
static D3DMATRIX d3dViewMatrix = 
{ 
    D3DVAL( 1.0), D3DVAL( 0.0), D3DVAL( 0.0), D3DVAL( 0.0), 
    D3DVAL( 0.0), D3DVAL( 1.0), D3DVAL( 0.0), D3DVAL( 0.0), 
    D3DVAL( 0.0), D3DVAL( 0.0), D3DVAL( 1.0), D3DVAL( 0.0), 
    D3DVAL( 0.0), D3DVAL( 0.0), D3DVAL( 5.0), D3DVAL( 1.0) 
}; 
 
static D3DMATRIX d3dProjMatrix = 
{ 
    D3DVAL( 2.0), D3DVAL( 0.0), D3DVAL( 0.0), D3DVAL( 0.0), 
    D3DVAL( 0.0), D3DVAL( 2.0), D3DVAL( 0.0), D3DVAL( 0.0), 
    D3DVAL( 0.0), D3DVAL( 0.0), D3DVAL( 1.0), D3DVAL( 1.0), 
    D3DVAL( 0.0), D3DVAL( 0.0), D3DVAL(-1.0), D3DVAL( 0.0) 
};