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

87 lines
2.9 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2002.
// -------------------------------------------------------------------------
// File name: decalmanager.h
// Version: v1.00
// Created: 28/5/2001 by Vladimir Kajalin
// Compilers: Visual Studio.NET
// Description:
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#ifndef DECAL_MANAGER
#define DECAL_MANAGER
#define DECAL_COUNT (512)
#define ENTITY_DECAL_DIST_FACTOR (200)
class C3DEngine;
class CDecal
{
public:
// cur state
Vec3d m_vPos;
Vec3d m_vRight, m_vUp, m_vFront;
float m_fSize;
Vec3d m_vWSPos;
float m_fWSSize;
// life style
float m_fLifeEndTime;
int m_nTexId;
float m_fAngle;
IStatObj * m_pStatObj;
uint m_nDynLMask;
Vec3d m_vAmbient;
IEntityRender * m_pDecalOwner;
int m_nDecalOwnerComponentId;
bool m_bOnTheGround;
float m_fGrowTime;
float m_fLifeBeginTime;
// todo: move it into separate structure
CLeafBuffer * m_pBigDecalLeafBuffer;
float m_arrBigDecalCustomData[16];
CDecal() { ZeroStruct(*this); }
void Process(bool & active, IRenderer * pIRenderer, const float fFrameTime, C3DEngine * p3DEngine, IShader * pShader, CCamera* pCamera, float fSortOffset);
void DrawBigDecalOnTerrain(C3DEngine * p3DEngine, IRenderer * pIRenderer, float fCurrTime);
void Render3DObject();
void DrawComplexDecal(IRenderer * pIRenderer);
};
class CDecalManager : public Cry3DEngineBase
{
CDecal m_arrDecals[DECAL_COUNT];
bool m_arrbActiveDecals[DECAL_COUNT];
int m_nCurDecal;
C3DEngine * m_p3DEngine;
list2<CDecal> m_LightHoles;
IShader * m_pShader_ParticleLight, * m_pShader_Decal_VP, * m_pShader_Decal_2D_VP;
public:
CDecalManager(C3DEngine * p3DEngine);
void Spawn(CryEngineDecalInfo Decal, float fMaxViewDistance, CTerrain * pTerrain);
void Render();
void SubmitLightHolesToRenderer();
void DrawBigDecalsOnTerrain();
void OnEntityDeleted(IEntityRender * pEntityRS);
// complex decals
void FillBigDecalIndices(CLeafBuffer * pLeafBuffer, Vec3d vPos, float fRadius, Vec3d vProjDir, list2<ushort> * plstIndices);
CLeafBuffer * MakeBigDecalLeafBuffer(CLeafBuffer * pSourceLeafBuffer, Vec3d vPos, float fRadius, Vec3d vProjDir, int nTexID);
void GetMemoryUsage(ICrySizer*pSizer);
void Reset() { memset(m_arrbActiveDecals,0,sizeof(m_arrbActiveDecals)); m_nCurDecal=0; }
void DeleteDecalsInRange( Vec3d vBoxMin, Vec3d vBoxMax, bool bDeleteBigTerrainDecals);
bool AdjustDecalPosition( CryEngineDecalInfo & DecalInfo, bool bMakeFatTest );
bool RayLeafBufferIntersection(CLeafBuffer * pLeafBuffer, const Vec3d & vInPos, const Vec3d & vInDir, Vec3d & vOutPos, Vec3d & vOutNormal);
};
#endif // DECAL_MANAGER