Files
FC1/CryCommon/CREOcLeaf.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

145 lines
3.7 KiB
C++

#ifndef __CREOCLEAF_H__
#define __CREOCLEAF_H__
//=============================================================
struct SLightIndicies
{
CDLight m_AssociatedLight;
TArray<ushort> m_pIndicies;
TArray<ushort> m_pIndiciesAttenFrustr;
SVertexStream m_IndexBuffer; // used for DirectX only
unsigned short *GetIndices(int& nInds)
{
if (m_AssociatedLight.m_NumCM & 2)
{
nInds = m_pIndiciesAttenFrustr.Num();
if (nInds)
return &m_pIndiciesAttenFrustr[0];
return NULL;
}
else
{
nInds = m_pIndicies.Num();
if (nInds)
return &m_pIndicies[0];
return NULL;
}
}
SVertexStream *GetIndexBuffer()
{
return &m_IndexBuffer;
}
};
struct SMeshFace
{
Vec3 m_Normal;
Vec3 m_Middle;
};
#define FCEF_CALCCENTER 0x10000
#define FCEF_DYNAMIC 0x20000
class CREOcLeaf : public CRendElement
{
friend class CRenderer;
int mFrameCalcLight;
int mFrameCalcLightNoAtt;
int mFrameCalcAtten;
int mFrameCalcRefract;
int mFrameCalcHalfAngle;
int mFrameCalcHalfAngleNoAtt;
int mFrameCalcProject;
int mFrameCalcLAttenSpec0;
int mFrameCalcLAttenSpec1;
int mMaskLight0; // Light Vectors
int mMaskLight1; // HalfAngle Vectors
int mMaskLight2; // Light Attenuation ( LightVector/(brightness*2.0)+0.5 )
int mMaskLight3; // Light Attenuation ( (LightVector*0.5)+0.5 )
int mMaskLight4; // Attenuation
int mMaskLight5;
Vec3 m_Center;
public:
static CREOcLeaf *m_pLastRE;
struct CMatInfo *m_pChunk;
struct CLeafBuffer * m_pBuffer;
TArray<SMeshFace> *m_Faces;
TArray<SLightIndicies *> *m_LIndicies;
CREOcLeaf()
{
mfSetType(eDATA_OcLeaf);
mfUpdateFlags(FCEF_TRANSFORM);
m_Faces = NULL;
m_LIndicies = NULL;
m_pChunk = NULL;
m_pBuffer = NULL;
mFrameCalcLight = -1;
mFrameCalcAtten = -1;
mFrameCalcRefract = -1;
mFrameCalcHalfAngle = -1;
mMaskLight0 = 0;
mMaskLight1 = 0;
mMaskLight2 = 0;
m_Center.Set(0,0,0);
}
SLightIndicies *mfGetIndiciesForLight(CDLight *pDLight);
void mfGenerateIndicesInsideFrustrum(SLightIndicies *li, CDLight *pDLight);
void mfGenerateIndicesForAttenuation(SLightIndicies *li, CDLight *pDLight);
void mfFillRB(CCObject *pObj);
virtual ~CREOcLeaf()
{
SAFE_DELETE(m_Faces);
if (m_LIndicies)
{
for (int i=0; i<m_LIndicies->Num(); i++)
{
SLightIndicies *li = m_LIndicies->Get(i);
SAFE_DELETE(li);
}
SAFE_DELETE(m_LIndicies);
}
}
virtual struct CMatInfo *mfGetMatInfo();
virtual list2<struct CMatInfo> *mfGetMatInfoList();
virtual int mfGetMatId();
virtual bool mfPreDraw(SShaderPass *sl);
virtual void mfGetPlane(Plane& pl);
virtual void mfPrepare();
virtual bool mfCullByClipPlane(CCObject *pObj);
virtual void mfCenter(Vec3& Pos, CCObject*pObj);
virtual bool mfDraw(SShader *ef, SShaderPass *sfm);
virtual void *mfGetPointer(ESrcPointer ePT, int *Stride, int Type, ESrcPointer Dst, int Flags);
virtual void mfEndFlush();
virtual float mfMinDistanceToCamera(CCObject *pObj);
virtual float mfDistanceToCameraSquared(const CCObject & thisObject);
virtual bool mfCheckUpdate(int nVertFormat, int Flags);
virtual void mfGetBBox(Vec3& vMins, Vec3& vMaxs);
virtual int Size()
{
int nSize = sizeof(*this);
if (m_Faces)
nSize += m_Faces->GetMemoryUsage();
if (m_LIndicies)
{
nSize += m_LIndicies->GetMemoryUsage();
for (int i=0; i<m_LIndicies->Num(); i++)
{
SLightIndicies *li = m_LIndicies->Get(i);
nSize += sizeof(*li);
nSize += li->m_pIndicies.GetMemoryUsage();
nSize += li->m_pIndiciesAttenFrustr.GetMemoryUsage();
}
}
return nSize;
}
};
#endif // __CREOCLEAF_H__