D3DWIN.H

#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