#ifndef D3DWIN_H
#define D3DWIN_H
/*
**-----------------------------------------------------------------------------
** Name: D3DWin.h
** Purpose: Sample D3D framework
**-----------------------------------------------------------------------------
*/
/*
**-----------------------------------------------------------------------------
** Includes
**-----------------------------------------------------------------------------
*/
#include "Common.h"
#include "DrvMgr.h"
/*
**-----------------------------------------------------------------------------
** Defines
**-----------------------------------------------------------------------------
*/
// Windows messages
#define D3DWIN_GET_VALID (WM_USER+1000)
#define D3DWIN_GET_POINTER (WM_USER+1001)
#define D3DWIN_GET_SURFACE (WM_USER+1002)
// Notification messages
#define D3DWIN_INIT (WM_USER+2000)
#define D3DWIN_FINI (WM_USER+2001)
#define D3DWIN_CHANGED_DRIVER (WM_USER+2002)
#define D3DWIN_CHANGED_MODE (WM_USER+2003)
#define D3DWIN_CHANGED_DEVICE (WM_USER+2004)
// Minimum surface size
#define D3DWIN_MIN_SIZE 64
#define D3DWIN_DEF_SIZE 256
/*
**-----------------------------------------------------------------------------
** Typedefs
**-----------------------------------------------------------------------------
*/
class D3DScene;// Prevent having to include D3DScene.h
typedef D3DScene * LPD3DScene;
class D3DWindow; // Forward declaration
typedef D3DWindow * LPD3DWindow;
/*
**-----------------------------------------------------------------------------
** Classes
**-----------------------------------------------------------------------------
*/
/*
**-----------------------------------------------------------------------------
** Name: D3DWindow
** Purpose: Encapsulates D3D rendering info for a window
**-----------------------------------------------------------------------------
*/
class D3DWindow {
protected:
//
// Flags
//
enum {
DWF_VISIBLE= 0x00000002,
DWF_ZBUFFER= 0x00000004,
DWF_ACTIVE= 0x00000008,
} Attributes;
enum {
DWF_VALID_INTERFACE = 0x00000001,
DWF_VALID_PRIMARY= 0x00000002,
DWF_VALID_RENDER = 0x00000004,
DWF_VALID_VIEWPORT = 0x00000008,
DWF_VALID_SCENE= 0x00000010,
DWF_RECALC_RECTS = 0x00000020,
DWF_PAINT = 0x00000040,
DWF_VALID = 0x00000007, // DWF_VALID_INTERFACE | DWF_VALID_PRIMARY | DWF_VALID_RENDER
} Checks;
public:
//
// Creation Methods
//
D3DWindow (void);
~D3DWindow (void);
HRESULT D3DWindow::Create (
HWND hWnd,
LPGUID lpDDGuid= NULL,
DWORD dwW= 0L,
DWORD dwH= 0L,
DWORD dwBPP= 0L,
DWORD dwRefresh= 0L,
LPGUID lpGuidD3D= NULL,
BOOL fUseZBuffer= TRUE,
LPRECT lprSurf= NULL);
HRESULT Init (void);
HRESULT Fini (void);
//
// Window Methods
//
HRESULT DrawFrame (void);
HRESULT Move (long x, long y);
HRESULT Resize (DWORD w, DWORD h);
HRESULT RealizePalette (void);
BOOL isPaused (void) { return (dwPaused != 0); }
HRESULT Pause (BOOL fOn);
BOOL isActive (void){ return ((fAttribs & DWF_ACTIVE) ? TRUE : FALSE); }
voidturnActiveOn (void){ fAttribs |= DWF_ACTIVE; }
voidturnActiveOff (void){ fAttribs &= ~DWF_ACTIVE; }
HRESULT Restore (void );
//
// Scene Methods
//
HRESULT AttachScene (LPD3DScene lpNewScene);
HRESULT DetachScene (void);
//
// Driver Methods
//
HRESULT ChangeDesktop (void);
HRESULT ChangeDriver (LPGUIDlpGuidDD,
LPD3DDevInfolpDevHint);
HRESULT ChangeDevice (LPGUIDlpGuidD3D);
//
// Misc. Methods
//
BOOL isValid (void) { return (((fChecks & DWF_VALID) == DWF_VALID) ? TRUE : FALSE); }
BOOL isCreateZBuffer (void) { return (fAttribs & DWF_ZBUFFER); }
void createZBufferOn (void) { fAttribs |= DWF_ZBUFFER; }
void createZBufferOff (void){ fAttribs &= ~DWF_ZBUFFER; }
//
// Member methods
//
HWND GetWindow (void){ return hWindow; }
LPDDDrvInfo GetDriverInfo (void){ return lpCurrDriver; }
LPDDModeInfo GetModeInfo (void){ return lpCurrMode; }
LPD3DDevInfo GetDeviceInfo (void){ return lpCurrDevice; }
LPGUID GetDDGuid (void){ return ((lpCurrDriver) ? lpCurrDriver->GetGuid () : NULL); }
BOOL GetModeInfo (DWORD & w, DWORD & h,
DWORD & bpp, DWORD & refresh)
{
if (! lpCurrMode)
return FALSE;
lpCurrMode->GetMode (w, h , bpp, refresh);
return TRUE;
}
LPGUID GetD3DGuid (void){ return ((lpCurrDevice) ? &(lpCurrDevice->guid) : NULL); }
LPDIRECTDRAW GetDD (void){ return lpDD; }
LPDIRECTDRAW2 GetDD2 (void){ return lpDD2; }
LPDIRECT3D2 GetD3D (void){ return lpD3D; }
LPDIRECTDRAWSURFACE GetPrimary (void){ return lpddsPrimary; }
LPDIRECTDRAWSURFACE GetFrontBuffer (void){ return lpddsPrimary; }
LPDIRECTDRAWSURFACE GetBackBuffer (void){ return lpddsRender; }
LPDIRECTDRAWPALETTEGetPalette (void){ return lpddpPalette; }
LPDIRECTDRAWSURFACE GetRender (void){ return lpddsRender; }
LPDIRECTDRAWSURFACE GetZBuffer (void){ return lpddsZBuff; }
LPDIRECT3DDEVICE2 GetD3DDevice (void){ return lpd3dDevice; }
LPDIRECT3DVIEWPORT2GetViewport (void){ return lpd3dViewport; }
HRESULT GetSurfaceRect (RECT & rSurface);
HRESULT GetPrimaryRect (RECT & rPrimary);
HRESULT GetSrcRect (RECT & rSrc);
HRESULT GetDestRect (RECT & rDest);
LPD3DScene GetScene (void){ return lpd3dScene; }
protected:
//
// Protected Methods
//
HRESULT ValidateDefaults (void);
HRESULT CreateInterfaces (LPGUID lpGuidDD);
HRESULT InitInterfaces (void);
HRESULT FiniInterfaces (void);
HRESULT InitWindow (void);
HRESULT FiniWindow (void);
HRESULT InitPrimary (void);
HRESULT FiniPrimary (void);
HRESULT InitPalette (void);
HRESULT FiniPalette (void);
HRESULT ValidateSize (void);
HRESULT CreateRender (LPGUID lpD3DGuid, LPRECT lprSurf);
HRESULT InitRender (void);
HRESULT FiniRender (void);
HRESULT InitViewport (void);
HRESULT FiniViewport (void);
HRESULT UpdateViewport (void);
// Recalculate src,dest drawing rectangles
BOOL checkCalcRects (void){ return (fChecks & DWF_RECALC_RECTS); }
void turnCalcRectsOn (void) { fChecks |= DWF_RECALC_RECTS; }
void turnCalcRectsOff(void) { fChecks &= ~DWF_RECALC_RECTS; }
// Nothing to draw
BOOL checkPaint (void){ return (fChecks & DWF_PAINT); }
void turnPaintOn (void){ fChecks |= DWF_PAINT; }
void turnPaintOff(void){ fChecks &= ~DWF_PAINT; }
// Track initialization
void turnValidInterfaceOn (void){ fChecks |= DWF_VALID_INTERFACE; }
void turnValidInterfaceOff(void){ fChecks &= ~DWF_VALID_INTERFACE; }
void turnValidPrimaryOn (void){ fChecks |= DWF_VALID_PRIMARY; }
void turnValidPrimaryOff (void){ fChecks &= ~DWF_VALID_PRIMARY; }
void turnValidRenderOn (void){ fChecks |= DWF_VALID_RENDER; }
void turnValidRenderOff(void){ fChecks &= ~DWF_VALID_RENDER; }
void turnValidViewportOn (void){ fChecks |= DWF_VALID_VIEWPORT; }
void turnValidViewportOff(void){ fChecks &= ~DWF_VALID_VIEWPORT; }
void turnValidSceneOn (void){ fChecks |= DWF_VALID_SCENE; }
void turnValidSceneOff (void){ fChecks &= ~DWF_VALID_SCENE;}
// Flags
BOOL isValidDefaults (void){ return ((lpCurrDriver && lpCurrMode && lpCurrDevice) ? TRUE : FALSE); }
BOOL isValidInterface (void){ return ((fChecks & DWF_VALID_INTERFACE) ? TRUE : FALSE); }
BOOL isValidPrimary (void) { return ((fChecks & DWF_VALID_PRIMARY) ? TRUE : FALSE); }
BOOL isValidRender (void) { return ((fChecks & DWF_VALID_RENDER) ? TRUE : FALSE); }
BOOL isValidViewport (void) { return ((fChecks & DWF_VALID_VIEWPORT) ? TRUE : FALSE); }
BOOL isValidScene (void){ return ((fChecks & DWF_VALID_SCENE) ? TRUE : FALSE); }
HRESULT CalcRects (void);
//
// Data members
//
DWORD dwSize; // Structure Size
DWORD fAttribs; // Attribute Flags
DWORD fChecks; // Programming flags
// Window Data
HWND hWindow; // Window handle
DWORD dwPaused; // Paused Semaphore
// Driver Defaults
LPDDDrvInfolpCurrDriver;// Current Driver
LPDDModeInfolpCurrMode;// Current Mode
LPD3DDevInfolpCurrDevice;// Current Device
// Interfaces
LPDIRECTDRAW lpDD; // DirectDraw Interface
LPDIRECTDRAW2 lpDD2; // DirectDraw2 Interface
LPDIRECT3D2 lpD3D; // Direct3D2 Interface
// Primary Surface
LPDIRECTDRAWSURFACE lpddsPrimary; // Primary Surface
LPDIRECTDRAWPALETTE lpddpPalette; // Primary Palette
PALETTEENTRY * lppePalette; // Saved System palette entries
// Render Surface
LPDIRECTDRAWSURFACE lpddsRender; // Rendering surface
LPDIRECTDRAWSURFACE lpddsZBuff; // Z-Buffer surface
LPDIRECT3DDEVICE2 lpd3dDevice;// D3D Device
LPDIRECT3DVIEWPORT2 lpd3dViewport;// D3D Viewport
// Misc.
RECT rPrim; // Current primary pos,size
RECT rSurf; // Current surface pos,size
RECT rDrawDest;// Destination rectangle
RECT rDrawSrc;// Source Rectangle
// D3D Scene
LPD3DScenelpd3dScene;// D3D Scene
// Friends
friendclass D3DScene;
}; // End D3DWindow
/*
**-----------------------------------------------------------------------------
** End of File
**-----------------------------------------------------------------------------
*/
#endif // D3DWIN_H