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

203 lines
4.9 KiB
C++

#ifndef __GLREND_H__
#define __GLREND_H__
#include "rend.h"
#include "loadppm.h"
#include "gltk.h"
// Fake value for marking processed TLVERTEX data
#define PROCESSED_TLVERTEX 0x80000000
// Fake opcode for marking processed triangle lists
#define PROCESSED_TRIANGLE 0xff
class GlExecuteBuffer : public RendExecuteBuffer
{
public:
GlExecuteBuffer(void);
BOOL Initialize(UINT cbSize, UINT uiFlags);
~GlExecuteBuffer(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);
BYTE* _pbData;
UINT _nVertices;
UINT _cbStart;
UINT _cbSize;
GLuint _dlist;
};
class GlLight : public RendLight
{
public:
GlLight(int iType, GLenum eLight);
virtual void Release(void);
virtual void SetColor(D3DCOLORVALUE* pdcol);
virtual void SetVector(D3DVECTOR* pdvec);
virtual void SetAttenuation(float fConstant, float fLinear,
float fQuadratic);
int _iType;
GLenum _eLight;
};
class GlTexture : public RendTexture
{
public:
GlTexture(void);
BOOL Initialize(char* pszFile);
~GlTexture(void);
virtual void Release(void);
virtual D3DTEXTUREHANDLE Handle(void);
GLuint _uiTexObj;
Image _im;
};
class GlWindow;
class GlMatrix : public RendMatrix
{
public:
GlMatrix(GlWindow* pgwin);
virtual void Release(void);
virtual D3DMATRIXHANDLE Handle(void);
virtual void Get(D3DMATRIX* pdm);
virtual void Set(D3DMATRIX* pdm);
GlWindow* _pgwin;
D3DMATRIX _dm;
};
class GlMaterial : public RendMaterial
{
public:
GlMaterial(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);
void Apply(void);
UINT _uiFlags;
float _afDiffuse[4];
float _afSpecular[4];
float _fPower;
};
// Default texture modes
#define DEF_TEX_MIN GL_NEAREST
#define DEF_TEX_MAG GL_NEAREST
#define DEF_TEX_MODE GL_MODULATE
class GlWindow : public RendWindow
{
public:
GlWindow(void);
BOOL Initialize(int x, int y, UINT uiWidth, UINT uiHeight, UINT uiBuffers);
~GlWindow(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 cbSize, 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);
BOOL DoExecute(RendExecuteBuffer* preb);
void ChangeWorld(float *pfMatrix);
void ChangeView(float *pfMatrix);
void ChangeProjection(float *pfMatrix);
void MatrixChanged(float *pfMatrix);
int _iLight;
D3DRECT _drcBound;
D3DMATRIX _dmView;
D3DMATRIX _dmProjection;
float *_pfWorld;
float *_pfView;
float *_pfProjection;
GLenum _eTexMin;
GLenum _eTexMag;
GLenum _eSrcBlend;
GLenum _eDstBlend;
gltkWindow _gltkw;
HGLRC _hrc;
};
class GlRenderer : public Renderer
{
public:
GlRenderer(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);
HWND _hwndParent;
HDC _hdcInit;
HGLRC _hrcInit;
PIXELFORMATDESCRIPTOR _pfd;
};
#ifdef GL_WIN_swap_hint
extern PFNGLADDSWAPHINTRECTWINPROC glAddSwapHintRectWIN;
#endif
#endif