63 lines
1.5 KiB
C++
63 lines
1.5 KiB
C++
//
|
|
//
|
|
// win_stencilshadow.h
|
|
//
|
|
// Declaration for stencil shadowing class
|
|
//
|
|
//
|
|
|
|
#ifndef _WIN_STENCILSHADOW_H_
|
|
#define _WIN_STENCILSHADOW_H_
|
|
|
|
// Quick way turn off all stencilshadow code, and get back 170k of memory:
|
|
//#define DISABLE_STENCILSHADOW
|
|
|
|
// Enable this to enable Carmack's stencil reverse method
|
|
#define _STENCIL_REVERSE
|
|
|
|
typedef struct
|
|
{
|
|
// facing is only one bit, but we can't do better than 4 bytes without
|
|
// packing all the data we need into a single unsigned short, which
|
|
// isn't really worth it. (unless we REALLY need 64k at some point).
|
|
unsigned short i2;
|
|
byte facing;
|
|
} edgeDef_t;
|
|
|
|
#define MAX_EDGE_DEFS 16
|
|
|
|
|
|
class StencilShadow
|
|
{
|
|
public:
|
|
|
|
#ifndef DISABLE_STENCILSHADOW
|
|
edgeDef_t m_edgeDefs[SHADER_MAX_VERTEXES][MAX_EDGE_DEFS];
|
|
short m_numEdgeDefs[SHADER_MAX_VERTEXES];
|
|
byte m_facing[SHADER_MAX_INDEXES/3];
|
|
unsigned short m_shadowIndexes[SHADER_MAX_INDEXES];
|
|
unsigned short m_nIndexes;
|
|
float m_extrusionIndicators[SHADER_MAX_VERTEXES/2];
|
|
#ifdef _STENCIL_REVERSE
|
|
unsigned short m_shadowIndexesCap[SHADER_MAX_INDEXES];
|
|
unsigned short m_nIndexesCap;
|
|
#endif
|
|
|
|
#endif
|
|
DWORD m_dwVertexShaderShadow;
|
|
DWORD *pVerts; // For reusing vertices in multiple shadow renderings
|
|
DWORD *pExtrusions;
|
|
|
|
StencilShadow();
|
|
~StencilShadow();
|
|
bool Initialize();
|
|
void AddEdge( unsigned short i1, unsigned short i2, byte facing );
|
|
void BuildEdges();
|
|
bool BuildFromLight();
|
|
void RenderShadow();
|
|
void FinishShadows();
|
|
};
|
|
|
|
extern StencilShadow StencilShadower;
|
|
|
|
#endif |