196 lines
6.3 KiB
C++
196 lines
6.3 KiB
C++
////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Crytek Engine Source File.
|
|
// Copyright (C), Crytek Studios, 2002.
|
|
// -------------------------------------------------------------------------
|
|
// File name: terrain_sector.h
|
|
// Version: v1.00
|
|
// Created: 28/5/2001 by Vladimir Kajalin
|
|
// Compilers: Visual Studio.NET
|
|
// Description:
|
|
// -------------------------------------------------------------------------
|
|
// History:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef SECINFO_H
|
|
#define SECINFO_H
|
|
|
|
#define SHADOW_SHIFT_K 0.57f
|
|
|
|
#define ZERO_MML_LEVEL 0
|
|
#define MAX_MML_LEVEL 3
|
|
#define MAX_TEX_MML_LEVEL 1
|
|
|
|
#define DETAIL_TEX_DISTANCE (0.065f*m_fMaxViewDist)//64
|
|
|
|
#define MIN_ALLOWED_MERGED_SECTORS_DISTANCE 512
|
|
|
|
#define MAX_DETAIL_LAYERS_IN_SECTOR 7
|
|
|
|
#include "basicarea.h"
|
|
|
|
struct CSectorBeachInfo
|
|
{
|
|
bool m_bBeachPresent;
|
|
|
|
struct BeachPairStruct
|
|
{
|
|
BeachPairStruct () { ZeroStruct(*this); }
|
|
Vec3d pos, water_dir; float distance; int busy;
|
|
Vec3d pos1,posm,pos2;
|
|
};
|
|
#define MAX_BEACH_GROUPS 16
|
|
list2<BeachPairStruct> m_arrlistBeachVerts[MAX_BEACH_GROUPS];
|
|
list2<BeachPairStruct> m_lstUnsortedBeachVerts; // tmp
|
|
|
|
CLeafBuffer * m_pLeafBufferBeach;
|
|
};
|
|
|
|
struct CSectorInfo : public CBasicArea, CSectorBeachInfo
|
|
{
|
|
public:
|
|
CSectorInfo(CTerrain * pTerrain );
|
|
~CSectorInfo();
|
|
|
|
CTerrain * m_pTerrain;
|
|
float m_fDistance; // curr distance to sector
|
|
int m_nOriginX, m_nOriginY; // sector origin
|
|
float m_fMaxZ,m_fMidZ,m_fMinZ; // sector bounds
|
|
uchar m_cGeometryMML, m_cTextureMML, m_cNewTextMML; // calculated lods
|
|
uchar m_bGroundVisible; // for finer occlusion
|
|
unsigned int m_nTextureID, m_nLowLodTextureID; // curr texture id and always loaded low lod texture id
|
|
int m_cLastTimeUsed, m_cLastTimeRendered; // unload sector after x sec of not in use
|
|
bool m_bAllStaticsInFrustum; // entire sector is visible, but maybe not dynamics
|
|
OcclusionTestClient m_OcclusionTestClient;
|
|
uchar m_cLastFrameUsed;
|
|
bool m_bHasHoles; // sector has holes in the ground
|
|
|
|
void SetTextures(bool bMakeUncompressedForEditing=false);
|
|
void SetLOD();
|
|
void SetMinMaxMidZ();
|
|
void InitSectorBoundsAndErrorLevels(int _x1, int _y1, FILE * geom_file_to_read, FILE * geom_file_to_write);
|
|
void CheckGeomCompWithLOD(int minMML);
|
|
void RenderSector(CCObject * pTerrainCCObject);
|
|
void MergeSectorIntoLowResTerrain(bool bCalcFarTerrain);
|
|
void RenderEntities(CObjManager * pObjManager, bool bNotAllInFrustum, char*fake, int nStatics);
|
|
|
|
void ReleaseHeightMapVertBuffer();
|
|
int GetSecIndex() { return (m_nOriginX/CTerrain::GetSectorSize())*CTerrain::GetSectorsTableSize() + (m_nOriginY/CTerrain::GetSectorSize()); }
|
|
|
|
protected:
|
|
|
|
float m_arrGeomErrors[MAX_MML_LEVEL+1]; // precalculated errors for each lod level
|
|
|
|
int m_nSecVertsCount;
|
|
|
|
struct CStripInfo {int begin,end;};
|
|
|
|
struct CArrayInfo
|
|
{
|
|
list2<CStripInfo> strip_info; list2<unsigned short> idx_array;
|
|
inline void Clear() { strip_info.Clear(); idx_array.Clear(); }
|
|
inline void AddIndex(int _x, int _y, int _step)
|
|
{
|
|
unsigned short id = _x/_step*(CTerrain::GetSectorSize()/_step+1) + _y/_step;
|
|
idx_array.Add(id);
|
|
}
|
|
|
|
inline void BeginStrip()
|
|
{
|
|
CStripInfo si;
|
|
si.begin = idx_array.Count();
|
|
si.end = 0;
|
|
strip_info.Add(si);
|
|
}
|
|
|
|
inline void EndStrip()
|
|
{
|
|
assert(strip_info.Count());
|
|
strip_info.Last().end = idx_array.Count();
|
|
}
|
|
|
|
void GetMemoryUsage(ICrySizer* pSizer)
|
|
{
|
|
pSizer->AddContainer (strip_info);
|
|
pSizer->AddContainer (idx_array);
|
|
}
|
|
};
|
|
|
|
CArrayInfo m_ArrayInfo;//, low_array;
|
|
void DrawArray(CArrayInfo * pArrayInfo, CCObject * pTerrainCCObject);
|
|
void UpdateVarBuffer();
|
|
void FillBuffer(int step);
|
|
int GetMML(int dist, int mmMin, int mmMax);
|
|
|
|
int MakeSectorTextureDDS( int sec_id, int mml, bool bMakeUncompressedForEditing );
|
|
|
|
public:
|
|
|
|
uint m_nDynLightMaskNoSun;
|
|
uint m_nDynLightMask;
|
|
|
|
void RenderBeach(IShader * pShader, float fZoomFactor, float fCamZ);
|
|
void MakeBeachStage1();
|
|
void MakeBeachStage2(FILE * hFileToSave);
|
|
void LoadBeach(FILE * hFileToLoad);
|
|
|
|
CLeafBuffer * m_pLeafBuffer;
|
|
#define ARR_TEX_OFFSETS_SIZE 64
|
|
float m_arrTexOffsets[ARR_TEX_OFFSETS_SIZE];
|
|
IShader * m_pCurShader;
|
|
|
|
struct VolumeInfo * m_pFogVolume;
|
|
|
|
list2<unsigned short> m_lstLowResTerrainIdxArray[2];
|
|
uint m_nLowResTerrainIdxRange[2][2]; // for dx optimizations
|
|
void AddLowResSectorIndex(int _x, int _y, int _step, int _lod);
|
|
|
|
int m_nLastMergedFrameID;
|
|
void RemoveSectorTextures(bool bRemoveLowLod);
|
|
void GenerateIndicesForQuad(int x1, int y1, int x2, int y2, CArrayInfo * pArrayInfo, ShadowMapFrustum * pFrustum, Vec3d * pvFrustPos, float fFrustScale);
|
|
CLeafBuffer * MakeSubAreaLeafBuffer(const Vec3d & vPos, float fRadius, CLeafBuffer * pPrevLeafBuffer, IShader * pShader, bool bRecalcLeafBufferconst, const char * szLSourceName, ShadowMapFrustum * pFrustum, Vec3d * pvFrustPos, float fFrustScale);
|
|
CArrayInfo m_ArrayInfo_MSALB;
|
|
int LockSectorTexture(int & nTexDim);
|
|
bool m_bLockTexture; // for editor
|
|
|
|
uint GetLastTimeUsed() { return m_cLastTimeUsed; }
|
|
uint GetLastTimeRendered() { return m_cLastTimeRendered; }
|
|
void GetMemoryUsage(ICrySizer*pSizer);
|
|
|
|
DetailTexInfo * m_arrDetailTexInfo[MAX_DETAIL_LAYERS_IN_SECTOR];
|
|
void SetDetailLayersPalette();
|
|
void UnloadHeighFieldTexture(float fDistanse, float fMaxViewDist);
|
|
|
|
const void * GetShoreGeometry(int & nPosStride, int & nVertCount);
|
|
|
|
uchar m_cPrevGeomMML; // current mml code
|
|
uchar m_cCurrBoundCode;
|
|
};
|
|
|
|
struct CTerrainNode : public CSectorInfo
|
|
{
|
|
CTerrainNode(CTerrain * pTerrain, int x1, int y1, int nNodeSize, int nTreeLevel, CTerrainNode * pParent) : CSectorInfo(pTerrain)
|
|
{
|
|
m_pParent = pParent;
|
|
|
|
InitSectorBoundsAndErrorLevels(x1, y1, NULL, NULL);
|
|
|
|
if(nNodeSize == CTerrain::GetSectorSize())
|
|
memset(m_arrChilds,0,sizeof(m_arrChilds));
|
|
else
|
|
{
|
|
int nSize = nNodeSize / 2;
|
|
m_arrChilds[0] = new CTerrainNode(pTerrain, x1 , y1 , nSize, nTreeLevel, this);
|
|
m_arrChilds[1] = new CTerrainNode(pTerrain, x1+nSize, y1 , nSize, nTreeLevel, this);
|
|
m_arrChilds[2] = new CTerrainNode(pTerrain, x1 , y1+nSize, nSize, nTreeLevel, this);
|
|
m_arrChilds[3] = new CTerrainNode(pTerrain, x1+nSize, y1+nSize, nSize, nTreeLevel, this);
|
|
}
|
|
}
|
|
|
|
CTerrainNode * m_arrChilds[4];
|
|
CTerrainNode * m_pParent;
|
|
};
|
|
|
|
#endif SECINFO_H
|