123
This commit is contained in:
281
CryCommon/IEntityRenderState.h
Normal file
281
CryCommon/IEntityRenderState.h
Normal file
@@ -0,0 +1,281 @@
|
||||
#ifndef IENTITYRENDERSTATE_H
|
||||
#define IENTITYRENDERSTATE_H
|
||||
|
||||
template <class T> class list2;
|
||||
|
||||
// !!! don't change the type !!!
|
||||
typedef unsigned short EntityId; //! unique identifier for each entity instance
|
||||
|
||||
struct IMatInfo;
|
||||
struct IVisArea;
|
||||
|
||||
enum EERType
|
||||
{
|
||||
eERType_Unknown,
|
||||
eERType_Brush,
|
||||
eERType_Vegetation
|
||||
};
|
||||
|
||||
struct OcclusionTestClient
|
||||
{
|
||||
OcclusionTestClient() { memset(this,0,sizeof(OcclusionTestClient)); bLastResult = true; }
|
||||
unsigned char ucOcclusionByTerrainFrames;
|
||||
unsigned char ucOcclusionByObjectsFrames;
|
||||
bool bLastResult;
|
||||
int nLastVisibleFrameID;
|
||||
// class CREOcclusionQuery * arrREOcclusionQuery[2];
|
||||
};
|
||||
|
||||
//! rendering properties/state of entity
|
||||
//! 3dengine/indoor/ should not have access to the game specific actual IEntity
|
||||
//! 3dengine only needs access to some functions
|
||||
//! this is begin of big code cleaning
|
||||
//! structure and names of classes not finilized
|
||||
|
||||
struct IEntityRenderState
|
||||
{
|
||||
IEntityRenderState()
|
||||
{ // init vars
|
||||
pShadowMapInfo = 0;
|
||||
// nScissorX1=nScissorY1=nScissorX2=nScissorY2=0;
|
||||
}
|
||||
|
||||
virtual ~IEntityRenderState()
|
||||
{
|
||||
delete pShadowMapInfo;
|
||||
pShadowMapInfo=0;
|
||||
}
|
||||
|
||||
// used for shadow maps
|
||||
struct ShadowMapInfo{
|
||||
ShadowMapInfo() { memset(this,0,sizeof(ShadowMapInfo)); }
|
||||
void Release(enum EERType eEntType, struct IRenderer * pRenderer);
|
||||
list2<struct ShadowMapLightSourceInstance> * pShadowMapCasters;
|
||||
struct ShadowMapLightSource * pShadowMapFrustumContainer;
|
||||
struct ShadowMapLightSource * pShadowMapFrustumContainerPassiveCasters;
|
||||
list2<struct CLeafBuffer *> * pShadowMapLeafBuffersList;
|
||||
Vec3 vPrevTerShadowPos;
|
||||
float fPrevTerShadowRadius;
|
||||
} * pShadowMapInfo;
|
||||
|
||||
// tmp flaot (distance to the light source, used for sorting)
|
||||
float fTmpDistance;
|
||||
|
||||
// unsigned short nScissorX1, nScissorY1, nScissorX2, nScissorY2;
|
||||
|
||||
unsigned int nStrongestLightId;
|
||||
};
|
||||
|
||||
//! EntityRender flags
|
||||
#define ERF_SELFSHADOW 0x1
|
||||
#define ERF_CASTSHADOWVOLUME 0x2
|
||||
#define ERF_RECVSHADOWMAPS 0x4
|
||||
#define ERF_CASTSHADOWMAPS 0x8
|
||||
#define ERF_DONOTCHECKVIS 0x10
|
||||
#define ERF_CASTSHADOWINTOLIGHTMAP 0x20
|
||||
#define ERF_HIDABLE 0x40
|
||||
#define ERF_HIDDEN 0x80
|
||||
#define ERF_SELECTED 0x100
|
||||
#define ERF_USELIGHTMAPS 0x200
|
||||
#define ERF_OUTDOORONLY 0x400
|
||||
#define ERF_UPDATE_IF_PV 0x800
|
||||
#define ERF_EXCLUDE_FROM_TRIANGULATION 0x1000
|
||||
#define ERF_MERGED 0x2000
|
||||
#define ERF_RECVSHADOWMAPS_ACTIVE 0x4000
|
||||
#define ERF_PHYS_NONCOLL 0x8000
|
||||
#define ERF_MERGED_NEW 0x10000
|
||||
#define ERF_FIRST_PERSON_CAMERA_OWNER 0x20000
|
||||
|
||||
// Should be the same as FOB_ flags
|
||||
#define ERF_NOTRANS_ROTATE 0x10000000
|
||||
#define ERF_NOTRANS_SCALE 0x20000000
|
||||
#define ERF_NOTRANS_TRANSLATE 0x40000000
|
||||
#define ERF_NOTRANS_MASK (ERF_NOTRANS_ROTATE | ERF_NOTRANS_SCALE | ERF_NOTRANS_TRANSLATE)
|
||||
|
||||
struct IEntityRender
|
||||
{
|
||||
IEntityRender()
|
||||
{
|
||||
m_dwRndFlags = 0;
|
||||
m_pEntityRenderState = 0;
|
||||
m_narrDrawFrames[0] = m_narrDrawFrames[1] = 0;
|
||||
m_narrShadowFrames[0] = m_narrShadowFrames[1] = 0;
|
||||
ucViewDistRatio=100;
|
||||
ucLodRatio=100;
|
||||
m_pSector = 0;
|
||||
m_pVisArea=0;
|
||||
m_vWSBoxMin=m_vWSBoxMax=Vec3(0,0,0);
|
||||
m_fWSMaxViewDist=m_fWSRadius=0;
|
||||
m_arrfDistance[0] = m_arrfDistance[1] = 0;
|
||||
m_nFogVolumeID = 0;
|
||||
m_bForceBBox = 0;
|
||||
}
|
||||
|
||||
virtual const char * GetEntityClassName() const = 0;
|
||||
virtual const Vec3 & GetPos(bool bWorldOnly = true) const = 0;
|
||||
virtual const Vec3 & GetAngles(int realA=0) const = 0;
|
||||
virtual float GetScale() const = 0;
|
||||
virtual const char *GetName() const = 0;
|
||||
virtual void GetRenderBBox( Vec3 &mins,Vec3 &maxs ) = 0;
|
||||
virtual void GetBBox( Vec3 &mins,Vec3 &maxs ) { GetRenderBBox( mins, maxs ); }
|
||||
virtual float GetRenderRadius() const = 0;
|
||||
virtual bool HasChanged() { return false; }
|
||||
virtual bool DrawEntity(const struct SRendParams & EntDrawParams) = 0;
|
||||
virtual bool IsStatic() const = 0;
|
||||
virtual struct IStatObj * GetEntityStatObj( unsigned int nSlot, Matrix44 * pMatrix = NULL, bool bReturnOnlyVisible = false) { return 0; }
|
||||
virtual void SetEntityStatObj( unsigned int nSlot, IStatObj * pStatObj, Matrix44 * pMatrix = NULL ) {};
|
||||
virtual struct ICryCharInstance* GetEntityCharacter( unsigned int nSlot, Matrix44 * pMatrix = NULL ) { return 0; }
|
||||
virtual void Physicalize(bool bInstant=false) {}
|
||||
virtual class CDLight * GetLight() { return 0; }
|
||||
virtual struct IEntityContainer* GetContainer() const { return 0; }
|
||||
|
||||
float m_fWSMaxViewDist;
|
||||
|
||||
// rendering flags
|
||||
virtual void SetRndFlags(unsigned int dwFlags) { m_dwRndFlags = dwFlags; }
|
||||
virtual void SetRndFlags(unsigned int dwFlags, bool bEnable)
|
||||
{ if(bEnable) m_dwRndFlags |= dwFlags; else m_dwRndFlags &= ~dwFlags; }
|
||||
virtual unsigned int GetRndFlags() { return m_dwRndFlags; }
|
||||
int m_dwRndFlags;
|
||||
|
||||
// object draw frames (set if was drawn)
|
||||
void SetDrawFrame( int nFrameID, int nRecursionLevel ) { m_narrDrawFrames[nRecursionLevel] = nFrameID; }
|
||||
int GetDrawFrame( int nRecursionLevel = 0 ) const{ return m_narrDrawFrames[nRecursionLevel]; }
|
||||
int m_narrDrawFrames[2];
|
||||
|
||||
// shadow draw frames (set if was drawn)
|
||||
void SetShadowFrame( unsigned short nFrameID, int nRecursionLevel ) { m_narrShadowFrames[nRecursionLevel] = nFrameID; }
|
||||
unsigned short GetShadowFrame( int nRecursionLevel = 0 ) const{ return m_narrShadowFrames[nRecursionLevel]; }
|
||||
|
||||
// current distance to the camera (with reqursioin)
|
||||
float m_arrfDistance[2];
|
||||
|
||||
//! contains rendering properties, not 0 only if entity going to be rendered
|
||||
struct IEntityRenderState * m_pEntityRenderState;
|
||||
|
||||
unsigned short m_narrShadowFrames[2];
|
||||
|
||||
Vec3 m_vWSBoxMin, m_vWSBoxMax;
|
||||
float m_fWSRadius;
|
||||
//## float m_fMaxViewDist;
|
||||
unsigned char m_bForceBBox;
|
||||
unsigned char ucViewDistRatio;
|
||||
unsigned char ucLodRatio;
|
||||
unsigned char m_nFogVolumeID;
|
||||
|
||||
// cur areas info
|
||||
struct CSectorInfo* m_pSector;
|
||||
struct CVisArea * m_pVisArea;
|
||||
|
||||
// Used for occlusion culling
|
||||
OcclusionTestClient OcclState;
|
||||
|
||||
//! Access to the EntityRenderState for 3dengine
|
||||
IEntityRenderState * & GetEntityRS() { return m_pEntityRenderState; }
|
||||
|
||||
//## Lightmaps (here dot3lightmaps only)
|
||||
|
||||
// Summary:
|
||||
// Assigns a texture set reference for dot3 lightmapping. The object will Release() it at the end of its lifetime
|
||||
virtual void SetLightmap(struct RenderLMData * pLMData, float *pTexCoords, UINT iNumTexCoords, int nLod=0) {};
|
||||
|
||||
// Summary:
|
||||
// Assigns a texture set reference for dot3 lightmapping. The object will Release() it at the end of its lifetime, special call from lightmap serializer/compiler to set occlusion map values
|
||||
virtual void SetLightmap(RenderLMData *pLMData, float *pTexCoords, UINT iNumTexCoords, const unsigned char cucOcclIDCount, const std::vector<std::pair<EntityId, EntityId> >& aIDs){};
|
||||
|
||||
// Returns:
|
||||
// true if there are lightmap texture coodinates and a lightmap texture assignment
|
||||
virtual bool HasLightmap(int nLod) { return false; };
|
||||
// Returns:
|
||||
// Lightmap texture set for this object, or NULL if there's none assigned. Don't release obtained copy, it's not a reference
|
||||
// See Also:
|
||||
// SetLightmap
|
||||
virtual RenderLMData * GetLightmap(int nLod) { return 0; };
|
||||
// Summary:
|
||||
// Returns vertex buffer holding instance specific texture coordinate set for dot3 lightmaps
|
||||
virtual struct CLeafBuffer * GetLightmapTexCoord(int nLod) { return 0; };
|
||||
|
||||
|
||||
virtual bool IsEntityHasSomethingToRender() = 0;
|
||||
|
||||
virtual bool IsEntityAreasVisible() = 0;
|
||||
|
||||
// Returns:
|
||||
// Current VisArea or null if in outdoors or entity was not registered in 3dengine
|
||||
IVisArea * GetEntityVisArea() { return (IVisArea*)m_pVisArea; }
|
||||
|
||||
/* Allows to adjust defailt max view distance settings,
|
||||
if fMaxViewDistRatio is 100 - default max view distance is used */
|
||||
void SetViewDistRatio(int nViewDistRatio) { ucViewDistRatio = min(254,max(0,nViewDistRatio)); }
|
||||
|
||||
/*! Makes object visible at any distance */
|
||||
void SetViewDistUnlimited() { ucViewDistRatio = 255; }
|
||||
|
||||
// Summary:
|
||||
// Retrieves the view distance settings
|
||||
int GetViewDistRatio() { return (ucViewDistRatio==255) ? 1000l : ucViewDistRatio; }
|
||||
|
||||
//! return max view distance ratio
|
||||
virtual float GetViewDistRatioNormilized() { return 0.01f*GetViewDistRatio(); }
|
||||
|
||||
/*! Allows to adjust defailt lod distance settings,
|
||||
if fLodRatio is 100 - default lod distance is used */
|
||||
void SetLodRatio(int nLodRatio) { ucLodRatio = min(255,max(0,nLodRatio)); }
|
||||
|
||||
//! return lod distance ratio
|
||||
float GetLodRatioNormilized() { return 0.01f*ucLodRatio; }
|
||||
|
||||
// get/set physical entity
|
||||
virtual class IPhysicalEntity* GetPhysics() const = 0;
|
||||
virtual void SetPhysics( IPhysicalEntity* pPhys ) = 0;
|
||||
|
||||
virtual ~IEntityRender() {};
|
||||
|
||||
//! Set override material for this instance.
|
||||
virtual void SetMaterial( IMatInfo *pMatInfo ) = 0;
|
||||
//! Query override material of this instance.
|
||||
virtual IMatInfo* GetMaterial() const = 0;
|
||||
virtual int GetEditorObjectId() { return 0; }
|
||||
virtual void SetEditorObjectId(int nEditorObjectId) {}
|
||||
|
||||
//! Physicalize if it isn't already
|
||||
virtual void CheckPhysicalized() {};
|
||||
|
||||
virtual int DestroyPhysicalEntityCallback(IPhysicalEntity *pent) { return 0; }
|
||||
|
||||
virtual void SetStatObjGroupId(int nStatObjInstanceGroupId) { }
|
||||
|
||||
virtual float GetMaxViewDist() { return 0; }
|
||||
|
||||
virtual void Serialize(bool bSave, struct ICryPak * pPak, FILE * f) {}
|
||||
virtual EERType GetEntityRenderType() { return eERType_Unknown; }
|
||||
virtual void Dephysicalize( ) {}
|
||||
virtual void Dematerialize( ) {}
|
||||
virtual int GetMemoryUsage() { return 0; }
|
||||
|
||||
virtual list2<struct ShadowMapLightSourceInstance> * GetShadowMapCasters()
|
||||
{
|
||||
if(m_pEntityRenderState && m_pEntityRenderState->pShadowMapInfo)
|
||||
return m_pEntityRenderState->pShadowMapInfo->pShadowMapCasters;
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual struct ShadowMapLightSource * GetShadowMapFrustumContainer()
|
||||
{
|
||||
if(m_pEntityRenderState && m_pEntityRenderState->pShadowMapInfo)
|
||||
return m_pEntityRenderState->pShadowMapInfo->pShadowMapFrustumContainer;
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual struct ShadowMapLightSource * GetShadowMapFrustumContainerPassiveCasters()
|
||||
{
|
||||
if(m_pEntityRenderState && m_pEntityRenderState->pShadowMapInfo)
|
||||
return m_pEntityRenderState->pShadowMapInfo->pShadowMapFrustumContainerPassiveCasters;
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual void PreloadInstanceResources(Vec3d vPrevPortalPos, float fPrevPortalDistance, float fTime) = 0;
|
||||
virtual void Precache() {};
|
||||
};
|
||||
|
||||
#endif // IENTITYRENDERSTATE_H
|
||||
Reference in New Issue
Block a user