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

154 lines
4.5 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2002.
// -------------------------------------------------------------------------
// File name: terrain_tex_pool.cpp
// Version: v1.00
// Created: 28/5/2001 by Vladimir Kajalin
// Compilers: Visual Studio.NET
// Description: terrain texture cahce
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "terrain_sector.h"
CTexturePool::CTexturePool()
{
/*
int nMaxTexSize = 128;
int nMaxTexNum = 64; // max hires textures num
// alloc tmp buff
uchar * pTmpBuff = new uchar[nMaxTexSize*nMaxTexSize*4];
memset(pTmpBuff,0,nMaxTexSize*nMaxTexSize*4);
// alloc texture pool for lods
for(int nLod=0; nLod<2; nLod++)
{
for(int i=0; i<nMaxTexNum; i++)
{
int nTexID = GetRenderer()->DownLoadToVideoMemory(pTmpBuff,
nMaxTexSize, nMaxTexSize, eTF_DXT1, eTF_DXT1, 0, false, FILTER_LINEAR);
assert(nTexID);
TexInfo info;
info.nTexId = nTexID;
info.pSectorInfo = 0;
m_TexturePool[nLod].Add(info);
}
nMaxTexSize/=2;
nMaxTexNum=1024; // max lod1 textures num
}
delete [] pTmpBuff;*/
}
int CTexturePool::MakeTexture(uchar * pData, int nTexSize, CSectorInfo * pNewSectorInfo, bool bMakeUncompressedForEditing)
{
if(!GetCVars()->e_terrain_texture_pool)
{ // if pool not used
return GetRenderer()->DownLoadToVideoMemory(pData, nTexSize, nTexSize,
eTF_DXT1, bMakeUncompressedForEditing ? eTF_8888 : eTF_DXT1, 0, false, FILTER_LINEAR);
}
int nLod = -1;
if(nTexSize == 128)
nLod = 0;
else if(nTexSize == 64)
nLod = 1;
else
GetConsole()->Exit("CTexturePool::MakeTexture: invalid nSize");
list2<TexInfo> & TexInfos = m_TexturePool[nLod];
// find first free slot
for(int i=0; i<TexInfos.Count(); i++)
if(!TexInfos[i].pSectorInfo)
{
// update slot texture
GetRenderer()->UpdateTextureInVideoMemory(TexInfos[i].nTexId,pData,0,0,nTexSize,nTexSize,eTF_DXT1);
TexInfos[i].pSectorInfo = pNewSectorInfo;
return TexInfos[i].nTexId;
}
GetLog()->Log("CTexturePool::MakeTexture: Terrain texture pool overflow");
// find oldest sector
uint nMinLastUsageTime = (uint)-1;
int nTexInfoId = -1;
for(int i=0; i<TexInfos.Count(); i++)
if(TexInfos[i].pSectorInfo && nMinLastUsageTime > (uint)TexInfos[i].pSectorInfo->m_cLastTimeUsed)
{
nMinLastUsageTime = TexInfos[i].pSectorInfo->m_cLastTimeUsed;
nTexInfoId = i;
}
// free owning sector textures
assert(TexInfos[nTexInfoId].pSectorInfo);
TexInfos[nTexInfoId].pSectorInfo->RemoveSectorTextures(nLod>0);
assert(!TexInfos[nTexInfoId].pSectorInfo);
// update slot texture with new data
TexInfos[nTexInfoId].pSectorInfo = pNewSectorInfo;
GetRenderer()->UpdateTextureInVideoMemory(TexInfos[nTexInfoId].nTexId,pData,0,0,nTexSize,nTexSize,eTF_DXT1);
return TexInfos[nTexInfoId].nTexId;
}
void CTexturePool::RemoveTexture(int nId)
{
if(!GetCVars()->e_terrain_texture_pool)
{ // if pool not used
GetRenderer()->RemoveTexture(nId);
return;
}
// find texture id and mark it as free
int bFound=0;
for(int nLod=0; nLod<2; nLod++)
{
for(int i=0; i<m_TexturePool[nLod].Count(); i++)
{
if(m_TexturePool[nLod][i].pSectorInfo && m_TexturePool[nLod][i].nTexId == nId)
{
assert(!bFound);
if(bFound)
GetLog()->Log("CTexturePool::RemoveTexture: texture id found twice");
m_TexturePool[nLod][i].pSectorInfo = 0;
bFound = true;
}
}
}
}
const char * CTexturePool::GetStatusText(CTerrain * pTerrain)
{
int nInUseTexNum[2] = {0,0};
for(int nLod=0; nLod<2; nLod++)
for(int i=0; i<m_TexturePool[nLod].Count(); i++)
if(m_TexturePool[nLod][i].pSectorInfo)
nInUseTexNum[nLod]++;
int arrTexMem[2] =
{
nInUseTexNum[0]*128*128*3/6,
nInUseTexNum[1]*64*64*3/6
};
static char szText[256]="";
if(!GetCVars()->e_terrain_texture_pool)
snprintf(szText, sizeof(szText), "TerrTexStats %d/%d", pTerrain->m_arrLoadedTexturesNum[0], pTerrain->m_arrLoadedTexturesNum[1]);
else
snprintf(szText, sizeof(szText), "TerrTexPoolStats %d/%d (%d/%d) / %d/%d (%d/%d)",
nInUseTexNum[0], m_TexturePool[0].Count(), arrTexMem[0]/1024, m_TexturePool[0].Count()*128*128*3/6/1024,
nInUseTexNum[1], m_TexturePool[1].Count(), arrTexMem[1]/1024, m_TexturePool[1].Count()* 64* 64*3/6/1024);
return szText;
}