2025-04-27 07:49:33 -04:00

253 lines
6.8 KiB
C++

#ifndef __D3DREND_H__
#define __D3DREND_H__
#include "rend.h"
class D3dRenderer;
class D3dExecuteBuffer : public RendExecuteBuffer
{
public:
D3dExecuteBuffer(void);
BOOL Initialize(LPDIRECT3DDEVICE pd3dev, UINT cbSize, UINT uiFlags);
~D3dExecuteBuffer(void);
virtual void Release(void);
virtual void* Lock(void);
virtual void Unlock(void);
virtual void SetData(UINT nVertices, UINT cbStart, UINT cbSize);
virtual BOOL Process(void);
LPDIRECT3DEXECUTEBUFFER _pdeb;
};
class D3dLight : public RendLight
{
public:
D3dLight(void);
BOOL Initialize(LPDIRECT3D pd3d, LPDIRECT3DVIEWPORT pdvw, int iType);
~D3dLight(void);
virtual void Release(void);
virtual void SetColor(D3DCOLORVALUE *pdcol);
virtual void SetVector(D3DVECTOR *pdvec);
virtual void SetAttenuation(float fConstant, float fLinear,
float fQuadratic);
LPDIRECT3DLIGHT _pdl;
D3DLIGHT _dl;
};
class D3dTexture : public RendTexture
{
public:
D3dTexture(void);
BOOL Initialize(D3dRenderer *pdrend,
LPDIRECTDRAW pdd, LPDIRECT3DDEVICE pd3dev,
DDSURFACEDESC *pddsd, char* pszFile, UINT uiFlags,
D3dTexture *pdtexNext);
~D3dTexture(void);
virtual void Release(void);
virtual D3DTEXTUREHANDLE Handle(void);
BOOL CreateVidTex(LPDIRECTDRAW pdd, UINT uiFlags);
BOOL RestoreSurface(void);
D3dRenderer *_pdrend;
LPDIRECTDRAWSURFACE _pddsSrc;
LPDIRECT3DTEXTURE _pdtexSrc;
D3DTEXTUREHANDLE _dthDst;
LPDIRECTDRAWSURFACE _pddsDst;
LPDIRECT3DTEXTURE _pdtexDst;
D3dTexture* _pdtexNext;
};
class D3dMatrix : public RendMatrix
{
public:
D3dMatrix(void);
BOOL Initialize(LPDIRECT3DDEVICE pd3dev);
~D3dMatrix(void);
virtual void Release(void);
virtual D3DMATRIXHANDLE Handle(void);
virtual void Get(D3DMATRIX *pdm);
virtual void Set(D3DMATRIX *pdm);
LPDIRECT3DDEVICE _pd3dev;
D3DMATRIXHANDLE _dmh;
};
class D3dMaterial : public RendMaterial
{
public:
D3dMaterial(void);
BOOL Initialize(LPDIRECT3D pd3d, LPDIRECT3DDEVICE pd3dev,
UINT nColorEntries);
~D3dMaterial(void);
virtual void Release(void);
virtual D3DMATERIALHANDLE Handle(void);
virtual void SetDiffuse(D3DCOLORVALUE* pdcol);
virtual void SetSpecular(D3DCOLORVALUE* pdcol, float fPower);
virtual void SetTexture(RendTexture *prtex);
LPDIRECT3DDEVICE _pd3dev;
LPDIRECT3DMATERIAL _pdmat;
D3DMATERIAL _dmat;
};
class D3dWindow : public RendWindow
{
public:
D3dWindow(void);
BOOL Initialize(D3dRenderer *pdrend,
LPDIRECTDRAW pdd, LPDIRECT3D pd3d, LPGUID pguid,
int x, int y, UINT uiWidth, UINT uiHeight, UINT uiBuffers);
~D3dWindow(void);
virtual void Release(void);
virtual BOOL SetViewport(int x, int y, UINT uiWidth, UINT uiHeight);
virtual RendLight* NewLight(int iType);
virtual RendTexture* NewTexture(char *pszFile, UINT uiFlags);
virtual RendExecuteBuffer* NewExecuteBuffer(UINT uiSize, UINT uiFlags);
virtual RendMatrix* NewMatrix(void);
virtual RendMaterial* NewMaterial(UINT nColorEntries);
virtual BOOL BeginScene(void);
virtual BOOL Execute(RendExecuteBuffer* preb);
virtual BOOL ExecuteClipped(RendExecuteBuffer* preb);
virtual BOOL EndScene(D3DRECT* pdrcBound);
virtual BOOL Clear(UINT uiBuffers, D3DRECT* pdrc);
virtual BOOL Flip(void);
virtual BOOL CopyForward(D3DRECT* pdrc);
virtual HWND Handle(void);
LRESULT WindowProc(HWND hwnd, UINT uiMessage, WPARAM wpm, LPARAM lpm);
BOOL CreateZBuffer(UINT uiWidth, UINT uiHeight, DWORD dwDepth,
DWORD dwMemoryType);
HWND CreateHWND(int x, int y, UINT uiWidth, UINT uiHeight);
BOOL InitDD(UINT uiWidth, UINT uiHeight, UINT uiBuffers);
BOOL InitializeTextureLoad(void);
BOOL InitD3D(LPGUID pguid, UINT uiWidth, UINT uiHeight, UINT uiBuffers);
BOOL RestoreSurfaces(void);
D3dRenderer *_pdrend;
HWND _hwnd;
LPDIRECTDRAW _pdd;
LPDIRECT3D _pd3d;
LPDIRECT3DDEVICE _pd3dev;
LPDIRECT3DVIEWPORT _pdvw;
LPDIRECT3DEXECUTEBUFFER _pdebLast;
LPDIRECT3DMATERIAL _pdmatBackground;
LPDIRECTDRAWSURFACE _pddsFrontBuffer;
LPDIRECTDRAWSURFACE _pddsBackBuffer;
LPDIRECTDRAWSURFACE _pddsZBuffer;
LPDIRECTDRAWCLIPPER _pddcClipper;
LPDIRECTDRAWPALETTE _pddpPalette;
RECT _rcClient;
D3dTexture* _pdtex;
int _nTextureFormats;
// Only use one currently
DDSURFACEDESC _ddsdTextureFormat[1];
BOOL _bHandleActivate;
BOOL _bPrimaryPalettized;
BOOL _bIgnoreWM_SIZE;
};
#define DD_DRIVER_COUNT 5
#define DD_MODE_LIST_COUNT 20
#define D3D_DRIVER_COUNT 5
struct DdDriverInfo
{
GUID guid;
DDCAPS ddcapsHw;
char achName[40];
BOOL bIsPrimary;
};
struct ModeListElement
{
int iWidth, iHeight, iDepth;
};
struct D3dDriverInfo
{
char achDesc[50];
char achName[30];
D3DDEVICEDESC d3ddHw, d3ddHel;
LPGUID pguid;
};
class D3dRenderer : public Renderer
{
public:
D3dRenderer(void);
virtual void Name(char* psz);
virtual char* LastErrorString(void);
virtual BOOL Initialize(HWND hwndParent);
virtual void Uninitialize(void);
virtual BOOL EnumDisplayDrivers(RendEnumDriversFn pfn,
void* pvArg);
virtual BOOL EnumGraphicsDrivers(RendEnumDriversFn pfn,
void* pvArg);
virtual BOOL SelectDisplayDriver(RendId rid);
virtual BOOL SelectGraphicsDriver(RendId rid);
virtual BOOL DescribeDisplay(RendDisplayDescription* prdd);
virtual BOOL DescribeGraphics(RendGraphicsDescription* prgd);
virtual BOOL FlipToDesktop(void);
virtual BOOL RestoreDesktop(void);
virtual RendWindow* NewWindow(int x, int y,
UINT uiWidth, UINT uiHeight,
UINT uiBuffers);
BOOL GetDDCaps(void);
BOOL EnumerateDisplayModes(void);
int _iDD;
int _iD3D;
LPDIRECTDRAW _pdd;
LPDIRECT3D _pd3d;
DDSCAPS _ddscapsHw;
DdDriverInfo _ddiDriver[DD_DRIVER_COUNT];
int _nDdDrivers;
ModeListElement _mleModeList[DD_MODE_LIST_COUNT];
int _nModes;
int _iCurrentMode;
BOOL _bCurrentFullscreenMode;
UINT _nD3dDrivers;
D3dDriverInfo _d3diDriver[D3D_DRIVER_COUNT];
DWORD _dwZDepth;
DWORD _dwZType;
DWORD _dwWinBpp;
};
// ATTENTION - Technically this should be on the renderer but that's a huge
// pain
extern HRESULT hrLast;
#endif