class proxyIDirect3DDevice9 : public IDirect3DDevice9
{
public:
   proxyIDirect3DDevice9(IDirect3DDevice9 *pOriginal);
   virtual ~proxyIDirect3DDevice9(void);

   HRESULT __stdcall QueryInterface(REFIID riid, void **ppvObj);
   ULONG   __stdcall AddRef(void);
   ULONG   __stdcall Release(void);
   HRESULT __stdcall TestCooperativeLevel(void);
   UINT    __stdcall GetAvailableTextureMem(void);
   HRESULT __stdcall EvictManagedResources(void);
   HRESULT __stdcall GetDirect3D(IDirect3D9 **ppD3D9);
   HRESULT __stdcall GetDeviceCaps(D3DCAPS9 *pCaps);
   HRESULT __stdcall GetDisplayMode(UINT iSwapChain, D3DDISPLAYMODE *pMode);
   HRESULT __stdcall GetCreationParameters(D3DDEVICE_CREATION_PARAMETERS *pParameters);
   HRESULT __stdcall SetCursorProperties(UINT XHotSpot, UINT YHotSpot, IDirect3DSurface9 *pCursorBitmap);
   void    __stdcall SetCursorPosition(int X, int Y, DWORD Flags);
   BOOL    __stdcall ShowCursor(BOOL bShow);
   HRESULT __stdcall CreateAdditionalSwapChain(D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DSwapChain9 **pSwapChain);
   HRESULT __stdcall GetSwapChain(UINT iSwapChain, IDirect3DSwapChain9 **pSwapChain);
   UINT    __stdcall GetNumberOfSwapChains(void);
   HRESULT __stdcall Reset(D3DPRESENT_PARAMETERS *pPresentationParameters);
   HRESULT __stdcall Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion);
   HRESULT __stdcall GetBackBuffer(UINT iSwapChain, UINT iBackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface9 **ppBackBuffer);
   HRESULT __stdcall GetRasterStatus(UINT iSwapChain, D3DRASTER_STATUS *pRasterStatus);
   HRESULT __stdcall SetDialogBoxMode(BOOL bEnableDialogs);
   void    __stdcall SetGammaRamp(UINT iSwapChain, DWORD Flags, CONST D3DGAMMARAMP *pRamp);
   void    __stdcall GetGammaRamp(UINT iSwapChain, D3DGAMMARAMP *pRamp);
   HRESULT __stdcall CreateTexture(UINT Width, UINT Height, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9 **ppTexture, HANDLE *pSharedHandle);
   HRESULT __stdcall CreateVolumeTexture(UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DVolumeTexture9 **ppVolumeTexture, HANDLE *pSharedHandle);
   HRESULT __stdcall CreateCubeTexture(UINT EdgeLength, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture9 **ppCubeTexture, HANDLE *pSharedHandle);
   HRESULT __stdcall CreateVertexBuffer(UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9 **ppVertexBuffer, HANDLE *pSharedHandle);
   HRESULT __stdcall CreateIndexBuffer(UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9 **ppIndexBuffer, HANDLE *pSharedHandle);
   HRESULT __stdcall CreateRenderTarget(UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Lockable, IDirect3DSurface9 **ppSurface, HANDLE *pSharedHandle);
   HRESULT __stdcall CreateDepthStencilSurface(UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Discard, IDirect3DSurface9 **ppSurface, HANDLE *pSharedHandle);
   HRESULT __stdcall UpdateSurface(IDirect3DSurface9 *pSourceSurface, CONST RECT *pSourceRect, IDirect3DSurface9 *pDestinationSurface, CONST POINT *pDestPoint);
   HRESULT __stdcall UpdateTexture(IDirect3DBaseTexture9 *pSourceTexture, IDirect3DBaseTexture9 *pDestinationTexture);
   HRESULT __stdcall GetRenderTargetData(IDirect3DSurface9 *pRenderTarget, IDirect3DSurface9 *pDestSurface);
   HRESULT __stdcall GetFrontBufferData(UINT iSwapChain, IDirect3DSurface9 *pDestSurface);
   HRESULT __stdcall StretchRect(IDirect3DSurface9 *pSourceSurface, CONST RECT *pSourceRect, IDirect3DSurface9 *pDestSurface, CONST RECT *pDestRect, D3DTEXTUREFILTERTYPE Filter);
   HRESULT __stdcall ColorFill(IDirect3DSurface9 *pSurface, CONST RECT *pRect, D3DCOLOR color);
   HRESULT __stdcall CreateOffscreenPlainSurface(UINT Width, UINT Height, D3DFORMAT Format, D3DPOOL Pool, IDirect3DSurface9 **ppSurface, HANDLE *pSharedHandle);
   HRESULT __stdcall SetRenderTarget(DWORD RenderTargetIndex, IDirect3DSurface9 *pRenderTarget);
   HRESULT __stdcall GetRenderTarget(DWORD RenderTargetIndex, IDirect3DSurface9 **ppRenderTarget);
   HRESULT __stdcall SetDepthStencilSurface(IDirect3DSurface9 *pNewZStencil);
   HRESULT __stdcall GetDepthStencilSurface(IDirect3DSurface9 **ppZStencilSurface);
   HRESULT __stdcall BeginScene(void);
   HRESULT __stdcall EndScene(void);
   HRESULT __stdcall Clear(DWORD Count, CONST D3DRECT *pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil);
   HRESULT __stdcall SetTransform(D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX *pMatrix);
   HRESULT __stdcall GetTransform(D3DTRANSFORMSTATETYPE State, D3DMATRIX *pMatrix);
   HRESULT __stdcall MultiplyTransform(D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX *pMatrix);
   HRESULT __stdcall SetViewport(CONST D3DVIEWPORT9 *pViewport);
   HRESULT __stdcall GetViewport(D3DVIEWPORT9 *pViewport);
   HRESULT __stdcall SetMaterial(CONST D3DMATERIAL9 *pMaterial);
   HRESULT __stdcall GetMaterial(D3DMATERIAL9 *pMaterial);
   HRESULT __stdcall SetLight(DWORD Index, CONST D3DLIGHT9 *pLight);
   HRESULT __stdcall GetLight(DWORD Index, D3DLIGHT9 *pLight);
   HRESULT __stdcall LightEnable(DWORD Index, BOOL Enable);
   HRESULT __stdcall GetLightEnable(DWORD Index, BOOL *pEnable);
   HRESULT __stdcall SetClipPlane(DWORD Index, CONST float *pPlane);
   HRESULT __stdcall GetClipPlane(DWORD Index, float *pPlane);
   HRESULT __stdcall SetRenderState(D3DRENDERSTATETYPE State, DWORD Value);
   HRESULT __stdcall GetRenderState(D3DRENDERSTATETYPE State, DWORD *pValue);
   HRESULT __stdcall CreateStateBlock(D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9 **ppSB);
   HRESULT __stdcall BeginStateBlock(void);
   HRESULT __stdcall EndStateBlock(IDirect3DStateBlock9 **ppSB);
   HRESULT __stdcall SetClipStatus(CONST D3DCLIPSTATUS9 *pClipStatus);
   HRESULT __stdcall GetClipStatus(D3DCLIPSTATUS9 *pClipStatus);
   HRESULT __stdcall GetTexture(DWORD Stage, IDirect3DBaseTexture9 **ppTexture);
   HRESULT __stdcall SetTexture(DWORD Stage, IDirect3DBaseTexture9 *pTexture);
   HRESULT __stdcall GetTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD *pValue);
   HRESULT __stdcall SetTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value);
   HRESULT __stdcall GetSamplerState(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD *pValue);
   HRESULT __stdcall SetSamplerState(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value);
   HRESULT __stdcall ValidateDevice(DWORD *pNumPasses);
   HRESULT __stdcall SetPaletteEntries(UINT PaletteNumber, CONST PALETTEENTRY *pEntries);
   HRESULT __stdcall GetPaletteEntries(UINT PaletteNumber, PALETTEENTRY *pEntries);
   HRESULT __stdcall SetCurrentTexturePalette(UINT PaletteNumber);
   HRESULT __stdcall GetCurrentTexturePalette(UINT *PaletteNumber);
   HRESULT __stdcall SetScissorRect(CONST RECT *pRect);
   HRESULT __stdcall GetScissorRect(RECT *pRect);
   HRESULT __stdcall SetSoftwareVertexProcessing(BOOL bSoftware);
   BOOL    __stdcall GetSoftwareVertexProcessing(void);
   HRESULT __stdcall SetNPatchMode(float nSegments);
   float   __stdcall GetNPatchMode(void);
   HRESULT __stdcall DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount);
   HRESULT __stdcall DrawIndexedPrimitive(D3DPRIMITIVETYPE PrimitiveType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount);
   HRESULT __stdcall DrawPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, CONST void *pVertexStreamZeroData, UINT VertexStreamZeroStride);
   HRESULT __stdcall DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT MinVertexIndex, UINT NumVertices, UINT PrimitiveCount, CONST void *pIndexData, D3DFORMAT IndexDataFormat, CONST void *pVertexStreamZeroData, UINT VertexStreamZeroStride);
   HRESULT __stdcall ProcessVertices(UINT SrcStartIndex, UINT DestIndex, UINT VertexCount, IDirect3DVertexBuffer9 *pDestBuffer, IDirect3DVertexDeclaration9 *pVertexDecl, DWORD Flags);
   HRESULT __stdcall CreateVertexDeclaration(CONST D3DVERTEXELEMENT9 *pVertexElements, IDirect3DVertexDeclaration9 **ppDecl);
   HRESULT __stdcall SetVertexDeclaration(IDirect3DVertexDeclaration9 *pDecl);
   HRESULT __stdcall GetVertexDeclaration(IDirect3DVertexDeclaration9 **ppDecl);
   HRESULT __stdcall SetFVF(DWORD FVF);
   HRESULT __stdcall GetFVF(DWORD *pFVF);
   HRESULT __stdcall CreateVertexShader(CONST DWORD *pFunction, IDirect3DVertexShader9 **ppShader);
   HRESULT __stdcall SetVertexShader(IDirect3DVertexShader9 *pShader);
   HRESULT __stdcall GetVertexShader(IDirect3DVertexShader9 **ppShader);
   HRESULT __stdcall SetVertexShaderConstantF(UINT StartRegister, CONST float *pConstantData, UINT Vector4fCount);
   HRESULT __stdcall GetVertexShaderConstantF(UINT StartRegister, float *pConstantData, UINT Vector4fCount);
   HRESULT __stdcall SetVertexShaderConstantI(UINT StartRegister, CONST int *pConstantData, UINT Vector4iCount);
   HRESULT __stdcall GetVertexShaderConstantI(UINT StartRegister, int *pConstantData, UINT Vector4iCount);
   HRESULT __stdcall SetVertexShaderConstantB(UINT StartRegister, CONST BOOL *pConstantData, UINT BoolCount);
   HRESULT __stdcall GetVertexShaderConstantB(UINT StartRegister, BOOL *pConstantData, UINT BoolCount);
   HRESULT __stdcall SetStreamSource(UINT StreamNumber, IDirect3DVertexBuffer9 *pStreamData, UINT OffsetInBytes, UINT Stride);
   HRESULT __stdcall GetStreamSource(UINT StreamNumber, IDirect3DVertexBuffer9 **ppStreamData, UINT *OffsetInBytes, UINT *pStride);
   HRESULT __stdcall SetStreamSourceFreq(UINT StreamNumber, UINT Divider);
   HRESULT __stdcall GetStreamSourceFreq(UINT StreamNumber, UINT *Divider);
   HRESULT __stdcall SetIndices(IDirect3DIndexBuffer9 *pIndexData);
   HRESULT __stdcall GetIndices(IDirect3DIndexBuffer9 **ppIndexData);
   HRESULT __stdcall CreatePixelShader(CONST DWORD *pFunction, IDirect3DPixelShader9 **ppShader);
   HRESULT __stdcall SetPixelShader(IDirect3DPixelShader9 *pShader);
   HRESULT __stdcall GetPixelShader(IDirect3DPixelShader9 **ppShader);
   HRESULT __stdcall SetPixelShaderConstantF(UINT StartRegister, CONST float *pConstantData, UINT Vector4fCount);
   HRESULT __stdcall GetPixelShaderConstantF(UINT StartRegister, float *pConstantData, UINT Vector4fCount);
   HRESULT __stdcall SetPixelShaderConstantI(UINT StartRegister, CONST int *pConstantData, UINT Vector4iCount);
   HRESULT __stdcall GetPixelShaderConstantI(UINT StartRegister, int *pConstantData, UINT Vector4iCount);
   HRESULT __stdcall SetPixelShaderConstantB(UINT StartRegister, CONST BOOL *pConstantData, UINT BoolCount);
   HRESULT __stdcall GetPixelShaderConstantB(UINT StartRegister, BOOL *pConstantData, UINT BoolCount);
   HRESULT __stdcall DrawRectPatch(UINT Handle, CONST float *pNumSegs, CONST D3DRECTPATCH_INFO *pRectPatchInfo);
   HRESULT __stdcall DrawTriPatch(UINT Handle, CONST float *pNumSegs, CONST D3DTRIPATCH_INFO *pTriPatchInfo);
   HRESULT __stdcall DeletePatch(UINT Handle);
   HRESULT __stdcall CreateQuery(D3DQUERYTYPE Type, IDirect3DQuery9 **ppQuery);

private:
   void proxyIDirect3DDevice9::render_map_dot(const float self_matrix[16], const float matrix[16]);
   void proxyIDirect3DDevice9::render_map(void);
   void proxyIDirect3DDevice9::render_box(int x, int y, int w, int h, D3DCOLOR color);
   void proxyIDirect3DDevice9::render_box_border(int x, int y, int w, int h, D3DCOLOR border_color, D3DCOLOR color);
   void proxyIDirect3DDevice9::render_debug(void);
   void proxyIDirect3DDevice9::render_menu(void);

   IDirect3DDevice9 *origIDirect3DDevice9;

 	D3DPRESENT_PARAMETERS pPresentParam;

   bool bD3DRenderInit;
};
