1052 lines
27 KiB
C++
1052 lines
27 KiB
C++
/*=============================================================================
|
|
TexMan.h : Common texture manager declarations.
|
|
Copyright (c) 2001 Crytek Studios. All Rights Reserved.
|
|
|
|
Revision history:
|
|
* Created by Khonich Andrey
|
|
|
|
=============================================================================*/
|
|
|
|
|
|
#ifndef TEXMAN_INCLUDED
|
|
#define TEXMAN_INCLUDED
|
|
|
|
#include "Image/CImage.h"
|
|
#include <Names.h>
|
|
#include "../ResFile.h"
|
|
|
|
#define TX_FIRSTBIND 0x1000
|
|
#define TX_LASTBIND 0x4000
|
|
#define TO_NORMALIZE_CUBE_MAP 0xfff
|
|
#define TO_GLARE 0xffe
|
|
#define TO_ENVIRONMENT_LIGHTCUBE_MAP 0xffd
|
|
#define TO_ENVIRONMENT_CUBE_MAP 0xffc
|
|
#define TO_TEXTURE_WATERMAP 0xffb
|
|
#define TO_ENVIRONMENT_TEX 0xff9
|
|
#define TO_FROMLIGHT 0xff8
|
|
#define TO_LIGHTMAP 0xfeb
|
|
#define TO_ENVIRONMENT_SCR 0xfea
|
|
#define TO_FOG 0xfe9
|
|
#define TO_FROMOBJ 0xfe8
|
|
|
|
#define TO_FROMRE0 0xff0
|
|
#define TO_FROMRE1 0xff1
|
|
#define TO_FROMRE2 0xff2
|
|
#define TO_FROMRE3 0xff3
|
|
#define TO_FROMRE4 0xff4
|
|
#define TO_FROMRE5 0xff5
|
|
#define TO_FROMRE6 0xff6
|
|
#define TO_FROMRE7 0xff7
|
|
|
|
#define TO_CUSTOM_CUBE_MAP_FIRST 0xfe0 // 8 environment cube textures
|
|
#define TO_CUSTOM_CUBE_MAP_LAST 0xfe7
|
|
|
|
#define TO_LIGHT_CUBE_MAP 0xfef
|
|
|
|
#define TO_CUSTOM_TEXTURE_FIRST 0xfb0
|
|
#define TO_CUSTOM_TEXTURE_LAST 0xfbf
|
|
|
|
#define TO_RAINMAP 0xfa0 // Rain texture map
|
|
#define TO_FLASHBANGMAP 0xfa1 // FlashBang texture map
|
|
#define TO_GHOST 0xfa2 // Ghost texture map
|
|
|
|
#define TO_SCREENMAP 0xfa3 // Screen texture map
|
|
#define TO_PREVSCREENMAP 0xfa4 // Previous screen texture map
|
|
#define TO_SCREENLUMINOSITYMAP 0xfa5 // Screen luminosity map
|
|
#define TO_SCREENCURRLUMINOSITYMAP 0xfa6 // Screen luminosity map
|
|
#define TO_SCREENLOWMAP 0xfc0 // lowres - screen size /4
|
|
#define TO_SCREENAVGMAP 0xfc1 // average screen color, 2x2
|
|
#define TO_DOFMAP 0xfc2 // dof map - contains focal distance
|
|
|
|
#define TO_REFRACTMAP 0xfa8
|
|
#define TO_REFRACTSCREENMAP 0xfa9
|
|
|
|
#define TO_ENVIRONMENT_LIGHTCUBE_MAP_REAL 0xf00
|
|
#define TO_ENVIRONMENT_LIGHTCUBE_MAP_REAL_MAX TO_ENVIRONMENT_LIGHTCUBE_MAP_REAL + MAX_ENVLIGHTCUBEMAPS
|
|
|
|
#define TO_ENVIRONMENT_CUBE_MAP_REAL 0xf40
|
|
#define TO_ENVIRONMENT_CUBE_MAP_REAL_MAX TO_ENVIRONMENT_CUBE_MAP_REAL + MAX_ENVCUBEMAPS
|
|
|
|
#define TO_ENVIRONMENT_TEX_MAP_REAL 0xf80
|
|
#define TO_ENVIRONMENT_TEX_MAP_REAL_MAX 0xf80 + MAX_ENVTEXTURES
|
|
|
|
#define TF_USEPAL 1
|
|
|
|
#define NUM_HDR_TONEMAP_TEXTURES 4
|
|
#define NUM_HDR_BLOOM_TEXTURES 3
|
|
#define NUM_HDR_STAR_TEXTURES 12
|
|
|
|
_inline int ilog2( int n )
|
|
{
|
|
int k, c;
|
|
|
|
if (n<=0)
|
|
return 0;
|
|
k = c = 0;
|
|
while (true)
|
|
{
|
|
if (n & 1)
|
|
c++;
|
|
if (!(n>>=1))
|
|
break;
|
|
k++;
|
|
}
|
|
if (c <= 1)
|
|
return 1<<k;
|
|
else
|
|
return 1<<(k+1);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
// CBaseMap: Base class so that different implementations can be stored together //
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
class CBaseMap
|
|
{
|
|
protected:
|
|
uint m_dwWidth, m_dwHeight;
|
|
uint m_dwLevels;
|
|
|
|
public:
|
|
STexPic *m_pTex;
|
|
CBaseMap()
|
|
{
|
|
m_dwWidth = m_dwHeight = 1;
|
|
m_dwLevels = 0;
|
|
m_pTex = NULL;
|
|
}
|
|
~CBaseMap()
|
|
{
|
|
m_pTex = NULL;
|
|
}
|
|
|
|
virtual HRESULT Initialize() = 0;
|
|
};
|
|
|
|
struct SBoxCol
|
|
{
|
|
UCol m_Colors[6];
|
|
};
|
|
|
|
struct SRefTex
|
|
{
|
|
SRefTex()
|
|
{
|
|
memset(this, 0, sizeof(SRefTex));
|
|
#ifndef _XBOX
|
|
m_Pal = -1;
|
|
#endif
|
|
}
|
|
void *m_VidTex;
|
|
int m_Type;
|
|
byte bRepeats, bProjected;
|
|
int m_MipFilter;
|
|
int m_MinFilter;
|
|
int m_MagFilter;
|
|
int m_AnisLevel;
|
|
#ifndef _XBOX
|
|
int m_Pal;
|
|
#else
|
|
D3DPalette* m_pPal;
|
|
#endif
|
|
};
|
|
|
|
struct STexLoaded
|
|
{
|
|
int m_NumTextures;
|
|
STexPic * m_Textures[7];
|
|
};
|
|
|
|
typedef std::map<long,STexLoaded*> LoadedTexsMap;
|
|
typedef LoadedTexsMap::iterator LoadedTexsMapItor;
|
|
|
|
#define TEXTGT_2D 0
|
|
#define TEXTGT_CUBEMAP 1
|
|
#define TEXTGT_3D 2
|
|
|
|
struct SDtex
|
|
{
|
|
char m_Name[32];
|
|
int m_Width, m_Height;
|
|
int m_Offset; // source data stored
|
|
char m_AnimName[32]; // next frame in animation chain
|
|
ETEX_Format m_ETF;
|
|
int m_Flags;
|
|
int m_InFlags;
|
|
int m_Contents;
|
|
int m_Value;
|
|
int m_Color[3];
|
|
};
|
|
|
|
struct STexPool;
|
|
|
|
struct STexPoolItem
|
|
{
|
|
STexPic *m_pTex;
|
|
STexPool *m_pOwner;
|
|
STexPoolItem *m_Next;
|
|
STexPoolItem *m_Prev;
|
|
STexPoolItem *m_NextFree;
|
|
STexPoolItem *m_PrevFree;
|
|
void *m_pAPITexture;
|
|
float m_fLastTimeUsed;
|
|
|
|
STexPoolItem ()
|
|
{
|
|
m_pTex = NULL;
|
|
m_pAPITexture = NULL;
|
|
m_pOwner = NULL;
|
|
m_Next = NULL;
|
|
m_Prev = NULL;
|
|
m_NextFree = NULL;
|
|
m_PrevFree = NULL;
|
|
}
|
|
|
|
_inline void Unlink()
|
|
{
|
|
if (!m_Next || !m_Prev)
|
|
return;
|
|
m_Next->m_Prev = m_Prev;
|
|
m_Prev->m_Next = m_Next;
|
|
m_Next = m_Prev = NULL;
|
|
}
|
|
|
|
_inline void Link( STexPoolItem* Before )
|
|
{
|
|
if (m_Next || m_Prev)
|
|
return;
|
|
m_Next = Before->m_Next;
|
|
Before->m_Next->m_Prev = this;
|
|
Before->m_Next = this;
|
|
m_Prev = Before;
|
|
}
|
|
|
|
_inline void UnlinkFree()
|
|
{
|
|
if (!m_NextFree || !m_PrevFree)
|
|
return;
|
|
m_NextFree->m_PrevFree = m_PrevFree;
|
|
m_PrevFree->m_NextFree = m_NextFree;
|
|
m_NextFree = m_PrevFree = NULL;
|
|
}
|
|
_inline void LinkFree( STexPoolItem* Before )
|
|
{
|
|
if (m_NextFree || m_PrevFree)
|
|
return;
|
|
m_NextFree = Before->m_NextFree;
|
|
Before->m_NextFree->m_PrevFree = this;
|
|
Before->m_NextFree = this;
|
|
m_PrevFree = Before;
|
|
}
|
|
};
|
|
|
|
struct STexPool
|
|
{
|
|
int m_Width;
|
|
int m_Height;
|
|
int m_Format;
|
|
ETexType m_eTT;
|
|
int m_nMips;
|
|
int m_Size;
|
|
void *m_pSysTexture; // System texture for updating
|
|
TArray <void *> m_SysSurfaces; // List of system surfaces for updating
|
|
STexPoolItem m_ItemsList;
|
|
};
|
|
|
|
struct STexUploadInfo
|
|
{
|
|
int nStartMip;
|
|
int nEndMip;
|
|
int m_TexId;
|
|
STexPic *m_pTex;
|
|
int m_LoadedSize;
|
|
};
|
|
|
|
#define TEXCACHE_VERSION 1
|
|
|
|
struct STexCacheFileHeader
|
|
{
|
|
int m_Version;
|
|
int m_SizeOf;
|
|
byte m_nSides;
|
|
byte m_nMips;
|
|
char m_sExt[6];
|
|
char m_sETF[16];
|
|
int m_DstFormat;
|
|
bool m_bPolyBump;
|
|
bool m_bCloneSpace;
|
|
FILETIME m_WriteTime[2];
|
|
};
|
|
|
|
struct STexCacheMipHeader
|
|
{
|
|
int m_SizeOf;
|
|
short m_USize;
|
|
short m_VSize;
|
|
int m_Size;
|
|
int m_SizeWithMips;
|
|
};
|
|
|
|
//
|
|
// Base mipmap.
|
|
//
|
|
struct SMipmapBase
|
|
{
|
|
public:
|
|
byte* DataPtr; // Pointer to data, valid only when locked.
|
|
int USize, VSize; // Power of two tile dimensions.
|
|
int DXTSize;
|
|
SMipmapBase(int InUSize, int InVSize) : DataPtr(0), USize(InUSize), VSize(InVSize) {}
|
|
SMipmapBase() {}
|
|
virtual ~SMipmapBase() { DataPtr = NULL; }
|
|
};
|
|
|
|
//
|
|
// Texture mipmap.
|
|
//
|
|
struct SMipmap : public SMipmapBase
|
|
{
|
|
public:
|
|
TArray<byte> DataArray; // Data.
|
|
bool m_bUploaded;
|
|
bool m_bLoading;
|
|
SMipmap()
|
|
{
|
|
m_bUploaded = false;
|
|
m_bLoading = false;
|
|
}
|
|
SMipmap(int InUSize, int InVSize) : SMipmapBase(InUSize, InVSize), m_bUploaded(false), m_bLoading(false) {}
|
|
SMipmap(int InUSize, int InVSize, int InSize) : SMipmapBase(InUSize, InVSize), DataArray(InSize), m_bUploaded(false), m_bLoading(false) {}
|
|
virtual ~SMipmap() { DataArray.Free(); }
|
|
void Clear()
|
|
{
|
|
DataArray.Clear();
|
|
m_bUploaded = false;
|
|
m_bLoading = false;
|
|
}
|
|
void Init(int InUSize, int InVSize, int InSize)
|
|
{
|
|
DataArray.Reserve(InSize);
|
|
USize = InUSize;
|
|
VSize = InVSize;
|
|
DataPtr = NULL;
|
|
m_bUploaded = false;
|
|
m_bLoading = false;
|
|
}
|
|
};
|
|
|
|
struct STexShadow
|
|
{
|
|
STexShadow();
|
|
~STexShadow();
|
|
|
|
bool Init(byte *pHeightMap, int Width, int Height, bool bHeightmap);
|
|
void BuildBasisMap(byte *pBasis, float PrimAngle, float fAngle2);
|
|
void BuildHorizonMap_FromHeightmap(BYTE *pHor, byte* pHeight, FLOAT dx, FLOAT dy, INT iStepLength, INT iWidth,INT iHeight,BOOL bWrapU,BOOL bWrapV);
|
|
void BuildHorizonMap_FromNormalmap(BYTE *pHor, byte* pHeight, FLOAT dx, FLOAT dy, INT iStepLength, INT iWidth,INT iHeight,BOOL bWrapU,BOOL bWrapV);
|
|
bool BuildInterleavedMap(UCol *newTex, BYTE *r, BYTE *g, BYTE *b, BYTE *a, INT width, INT height);
|
|
|
|
// scratch space for loading/computing the textures
|
|
static STexPic *m_pBasisTex[2];
|
|
STexPic *m_pHorizonTex[2];
|
|
};
|
|
|
|
class CTextureStreamCallback : public IStreamCallback
|
|
{
|
|
virtual void StreamOnComplete (IReadStream* pStream, unsigned nError);
|
|
};
|
|
|
|
struct STexCacheInfo
|
|
{
|
|
CTextureStreamCallback m_Callback;
|
|
int m_TexId;
|
|
int m_nStartLoadMip;
|
|
int m_nEndLoadMip;
|
|
int m_nSizeToLoad;
|
|
int m_nCubeSide;
|
|
void *m_pTempBufferToStream;
|
|
float m_fStartTime;
|
|
STexCacheInfo()
|
|
{
|
|
memset(&m_TexId, 0, sizeof(*this)-sizeof(CTextureStreamCallback));
|
|
}
|
|
~STexCacheInfo()
|
|
{
|
|
SAFE_DELETE_ARRAY(m_pTempBufferToStream);
|
|
}
|
|
};
|
|
|
|
#ifdef WIN64
|
|
#pragma warning( push ) //AMD Port
|
|
#pragma warning( disable : 4267 ) // conversion from 'size_t' to 'int', possible loss of data
|
|
#endif
|
|
|
|
struct STexPic : ITexPic
|
|
{
|
|
STexPic()
|
|
{
|
|
if (!m_Root.m_Next)
|
|
{
|
|
m_Root.m_Next = &m_Root;
|
|
m_Root.m_Prev = &m_Root;
|
|
}
|
|
m_CacheID = -1;
|
|
m_Depth = 1;
|
|
}
|
|
int Size(int Flags)
|
|
{
|
|
int nSize = sizeof(*this);
|
|
nSize += m_SourceName.size();
|
|
nSize += m_Name.size();
|
|
if (m_pPalette)
|
|
nSize += sizeof(SRGBPixel) * 256;
|
|
if (m_pData32)
|
|
nSize += m_Width * m_Height * 4;
|
|
if (m_p8to24table)
|
|
nSize += 256 * sizeof(uint);
|
|
if (m_p15to8table)
|
|
nSize += 32768;
|
|
|
|
return nSize;
|
|
}
|
|
|
|
virtual void AddRef()
|
|
{
|
|
m_nRefCounter++;
|
|
}
|
|
virtual void Release(int bForce);
|
|
virtual void ReleaseDriverTexture();
|
|
|
|
virtual void SetClamp(bool bEnable);
|
|
virtual void SetFilter();
|
|
virtual void SetWrapping();
|
|
|
|
virtual const char *GetName();
|
|
|
|
virtual void Set(int nTexSlot=-1);
|
|
|
|
virtual int GetWidth();
|
|
virtual int GetHeight();
|
|
virtual int GetOriginalWidth()
|
|
{
|
|
return m_WidthOriginal;
|
|
}
|
|
virtual int GetOriginalHeight()
|
|
{
|
|
return m_HeightOriginal;
|
|
}
|
|
virtual int GetTextureID();
|
|
virtual bool IsTextureLoaded();
|
|
virtual int GetFlags()
|
|
{
|
|
return m_Flags;
|
|
}
|
|
virtual int GetFlags2()
|
|
{
|
|
return m_Flags2;
|
|
}
|
|
virtual byte *GetData32();
|
|
|
|
virtual void SaveTGA(const char *name, bool bMips);
|
|
virtual void SaveJPG(const char *name, bool bMips);
|
|
virtual void PrecacheAsynchronously(float fDist, int Flags);
|
|
virtual void Preload (int Flags);
|
|
virtual int DstFormatFromTexFormat(ETEX_Format eTF);
|
|
virtual int TexSize(int Width, int Height, int DstFormat);
|
|
virtual bool SetFilter(int nFilter);
|
|
|
|
void Unload();
|
|
void Restore();
|
|
|
|
int GetFileNames(char *name0, char *name1, int nLen);
|
|
void GetCacheName(char *name);
|
|
void SaveToCache();
|
|
void LoadFromCache(int Flags, float fDist);
|
|
void CreateMips();
|
|
void RemoveMips(int nFromEnd);
|
|
|
|
bool AddToPool(int nStartMip, int nMips);
|
|
void RemoveFromPool();
|
|
|
|
void RemoveFromSearchHash();
|
|
void AddToSearchHash();
|
|
|
|
STexPic *LoadFromCache(STexPic *ti, int flags, int flags2, char *texName, const char *szModelName);
|
|
bool CreateCacheFile();
|
|
|
|
virtual void BuildMips();
|
|
virtual bool UploadMips(int nStartMip, int nEndMip);
|
|
void FakeUploadMips(int nStartMip, int nEndMip);
|
|
|
|
_inline void Relink(STexPic* Before)
|
|
{
|
|
if (!IsStreamed())
|
|
return;
|
|
if (m_Next && m_Prev)
|
|
{
|
|
m_Next->m_Prev = m_Prev;
|
|
m_Prev->m_Next = m_Next;
|
|
}
|
|
m_Next = Before->m_Next;
|
|
Before->m_Next->m_Prev = this;
|
|
Before->m_Next = this;
|
|
m_Prev = Before;
|
|
}
|
|
_inline void Unlink()
|
|
{
|
|
if (!m_Next || !m_Prev)
|
|
return;
|
|
m_Next->m_Prev = m_Prev;
|
|
m_Prev->m_Next = m_Next;
|
|
m_Next = m_Prev = NULL;
|
|
}
|
|
_inline void Link( STexPic* Before )
|
|
{
|
|
if (m_Next || m_Prev)
|
|
return;
|
|
m_Next = Before->m_Next;
|
|
Before->m_Next->m_Prev = this;
|
|
Before->m_Next = this;
|
|
m_Prev = Before;
|
|
}
|
|
_inline bool IsStreamed()
|
|
{
|
|
if (m_ETF == eTF_Index || m_ETF == eTF_DSDT_MAG)
|
|
return false;
|
|
if (!m_Size || !m_Id || (m_Flags & FT_NOSTREAM))
|
|
return false;
|
|
return true;
|
|
}
|
|
int UpdateMip(float fDist);
|
|
bool ValidateMipsData(int nStartMip, int nEndMip);
|
|
|
|
STexPic *m_Next;
|
|
STexPic *m_Prev;
|
|
|
|
uint m_Bind;
|
|
uint m_TargetType;
|
|
int m_AccessFrame;
|
|
SRefTex m_RefTex;
|
|
uint m_Flags;
|
|
uint m_Flags2;
|
|
int m_Size;
|
|
|
|
ETexType m_eTT;
|
|
int m_nMips;
|
|
|
|
CBaseMap *m_pFuncMap;
|
|
STexLoaded *m_TL;
|
|
STexShadow *m_pSH;
|
|
int m_Id;
|
|
bool m_bBusy;
|
|
string m_SourceName;
|
|
string m_Name;
|
|
CName m_SearchName;
|
|
int m_DXTSize;
|
|
int m_CubeSide;
|
|
int m_Width;
|
|
int m_Height;
|
|
int m_Depth;
|
|
int m_WidthOriginal;
|
|
int m_HeightOriginal;
|
|
float m_fAnimSpeed;
|
|
float m_fAmount1;
|
|
float m_fAmount2;
|
|
int m_DstFormat;
|
|
ETEX_Format m_ETF;
|
|
STexPic *m_NextTxt;
|
|
STexPic *m_NextCMSide;
|
|
float *m_Matrix;
|
|
byte *m_pData32;
|
|
int m_nRefCounter;
|
|
|
|
// Used for Caching/Streaming
|
|
int m_nFrameCache;
|
|
float m_fMinDistance;
|
|
STexPoolItem *m_pPoolItem;
|
|
int m_CacheID;
|
|
short m_nBaseMip;
|
|
short m_nCustomMip;
|
|
FILETIME m_WriteTime;
|
|
int m_LoadFrame;
|
|
int m_LoadedSize;
|
|
SMipmap **m_Mips[6]; // Mipmaps in native format.
|
|
STexCacheFileHeader m_CacheFileHeader;
|
|
STexCacheMipHeader *m_pFileTexMips;
|
|
|
|
// For paletted textures
|
|
SRGBPixel *m_pPalette;
|
|
byte *m_pData;
|
|
bool m_bAlphaPal;
|
|
uint *m_p8to24table;
|
|
uchar *m_p15to8table;
|
|
|
|
static STexPic m_Root;
|
|
|
|
#ifdef DEBUGALLOC
|
|
#undef new
|
|
#endif
|
|
void* operator new( size_t Size )
|
|
{
|
|
void *ptr = malloc(Size);
|
|
memset(ptr, 0, Size);
|
|
return ptr;
|
|
}
|
|
void operator delete( void *ptr )
|
|
{
|
|
free (ptr);
|
|
}
|
|
static bool SaveTga(unsigned char *sourcedata,int sourceformat,int w,int h,const char *filename,bool flip);
|
|
};
|
|
|
|
struct STexGrid
|
|
{
|
|
int m_Width;
|
|
int m_Height;
|
|
STexPic *m_TP;
|
|
};
|
|
|
|
class CTexMan
|
|
{
|
|
friend struct STexPic;
|
|
protected:
|
|
int m_MinFilter;
|
|
int m_MagFilter;
|
|
int m_MipFilter;
|
|
|
|
int m_CurTexMaxSize;
|
|
int m_CurTexMinSize;
|
|
int m_CurTexSkyResolution;
|
|
int m_CurTexSkyQuality;
|
|
int m_CurTexResolution;
|
|
int m_CurTexQuality;
|
|
int m_CurTexBumpResolution;
|
|
int m_CurTexBumpQuality;
|
|
int m_CurTexNormalMapCompressed;
|
|
|
|
LoadedTexsMap m_TexsMap;
|
|
int m_CurCubemapBind;
|
|
int m_CurMotionId;
|
|
int m_CurMotionTexSize;
|
|
|
|
private:
|
|
|
|
_inline void FillRGBA_32to32(byte *dst, byte *src, int width, int height)
|
|
{
|
|
int Size = width*height;
|
|
for(int i=0; i<Size; i++)
|
|
{
|
|
dst[0] = src[2];
|
|
dst[1] = src[1];
|
|
dst[2] = src[0];
|
|
dst[3] = src[3];
|
|
src += 4;
|
|
dst += 4;
|
|
}
|
|
}
|
|
_inline void FillRGBA_32to32(byte *dst, byte *src, int Size)
|
|
{
|
|
for(int i=0; i<Size; i++)
|
|
{
|
|
dst[0] = src[2];
|
|
dst[1] = src[1];
|
|
dst[2] = src[0];
|
|
dst[3] = src[3];
|
|
src += 4;
|
|
dst += 4;
|
|
}
|
|
}
|
|
|
|
_inline void FillBGRA_32to32(byte *dst, byte *src, int width, int height)
|
|
{
|
|
int Size = width*height;
|
|
for(int i=0; i<Size; i++)
|
|
{
|
|
dst[0] = src[2];
|
|
dst[1] = src[1];
|
|
dst[2] = src[0];
|
|
dst[3] = src[3];
|
|
src += 4;
|
|
dst += 4;
|
|
}
|
|
}
|
|
_inline void FillBGRA_32to32(byte *dst, byte *src, int Size)
|
|
{
|
|
for(int i=0; i<Size; i++)
|
|
{
|
|
dst[0] = src[2];
|
|
dst[1] = src[1];
|
|
dst[2] = src[0];
|
|
dst[3] = src[3];
|
|
src += 4;
|
|
dst += 4;
|
|
}
|
|
}
|
|
|
|
_inline void FillRGBA_24to32(byte *dst, byte *src, int width, int height)
|
|
{
|
|
int Size = width*height;
|
|
for(int i=0; i<Size; i++)
|
|
{
|
|
dst[0] = src[0];
|
|
dst[1] = src[1];
|
|
dst[2] = src[2];
|
|
dst[3] = 255;
|
|
src += 3;
|
|
dst += 4;
|
|
}
|
|
}
|
|
_inline void FillRGBA_24to32(byte *dst, byte *src, int Size)
|
|
{
|
|
for(int i=0; i<Size; i++)
|
|
{
|
|
dst[0] = src[0];
|
|
dst[1] = src[1];
|
|
dst[2] = src[2];
|
|
dst[3] = 255;
|
|
src += 3;
|
|
dst += 4;
|
|
}
|
|
}
|
|
|
|
_inline void FillBGRA_24to32(byte *dst, byte *src, int width, int height)
|
|
{
|
|
int Size = width*height;
|
|
for(int i=0; i<Size; i++)
|
|
{
|
|
dst[0] = src[2];
|
|
dst[1] = src[1];
|
|
dst[2] = src[0];
|
|
dst[3] = 255;
|
|
src += 3;
|
|
dst += 4;
|
|
}
|
|
}
|
|
_inline void FillBGRA_24to32(byte *dst, byte *src, int Size)
|
|
{
|
|
for(int i=0; i<Size; i++)
|
|
{
|
|
dst[0] = src[2];
|
|
dst[1] = src[1];
|
|
dst[2] = src[0];
|
|
dst[3] = 255;
|
|
src += 3;
|
|
dst += 4;
|
|
}
|
|
}
|
|
|
|
_inline void FillRGBA_8to32(byte *dst, byte *src, byte pal[256][4], int width, int height, STexPic *ti)
|
|
{
|
|
int l;
|
|
int a = 255;
|
|
int Size = width*height;
|
|
for(int i=0; i<Size; i++)
|
|
{
|
|
l = src[i];
|
|
dst[0] = pal[l][0];
|
|
dst[1] = pal[l][1];
|
|
dst[2] = pal[l][2];
|
|
dst[3] = pal[l][3];
|
|
a &= pal[l][3];
|
|
dst += 4;
|
|
}
|
|
|
|
if (a != 255)
|
|
ti->m_Flags |= FT_HASALPHA;
|
|
}
|
|
_inline void FillRGBA_8to32(byte *dst, byte *src, byte pal[256][4], int Size, STexPic *ti)
|
|
{
|
|
int l;
|
|
int a = 255;
|
|
for(int i=0; i<Size; i++)
|
|
{
|
|
l = src[i];
|
|
dst[0] = pal[l][0];
|
|
dst[1] = pal[l][1];
|
|
dst[2] = pal[l][2];
|
|
dst[3] = pal[l][3];
|
|
a &= pal[l][3];
|
|
dst += 4;
|
|
}
|
|
|
|
if (a != 255)
|
|
ti->m_Flags |= FT_HASALPHA;
|
|
}
|
|
|
|
_inline void FillBGRA_8to32(byte *dst, byte *src, byte pal[256][4], int width, int height, STexPic *ti)
|
|
{
|
|
int l;
|
|
int a = 255;
|
|
int Size = width*height;
|
|
for(int i=0; i<Size; i++)
|
|
{
|
|
l = src[i];
|
|
dst[0] = pal[l][2];
|
|
dst[1] = pal[l][1];
|
|
dst[2] = pal[l][0];
|
|
dst[3] = pal[l][3];
|
|
a &= pal[l][3];
|
|
dst += 4;
|
|
}
|
|
|
|
if (a != 255)
|
|
ti->m_Flags |= FT_HASALPHA;
|
|
}
|
|
_inline void FillBGRA_8to32(byte *dst, byte *src, byte pal[256][4], int Size, STexPic *ti)
|
|
{
|
|
int l;
|
|
int a = 255;
|
|
for(int i=0; i<Size; i++)
|
|
{
|
|
l = src[i];
|
|
dst[0] = pal[l][2];
|
|
dst[1] = pal[l][1];
|
|
dst[2] = pal[l][0];
|
|
dst[3] = pal[l][3];
|
|
a &= pal[l][3];
|
|
dst += 4;
|
|
}
|
|
|
|
if (a != 255)
|
|
ti->m_Flags |= FT_HASALPHA;
|
|
}
|
|
|
|
protected:
|
|
|
|
void MipMap8Bit (STexPic *ti, byte *in, byte *out, int width, int height);
|
|
void MipMap32Bit (STexPic *ti, byte *in, byte *out, int width, int height);
|
|
void ImgResample(uint *out, int ox, int oy, uint *in, int ix, int iy);
|
|
void ImgResample8(byte *out, int ox, int oy, byte *in, int ix, int iy);
|
|
|
|
void ImagePreprocessing(CImageFile* im, uint flags, uint flags2, byte eTT, STexPic *ti);
|
|
void GenerateNormalMap(CImageFile** im, uint flags, uint flags2, byte eTT, float fAmount1, float fAmount2, STexPic *ti);
|
|
byte *GenerateNormalMap(byte *src, int width, int height, uint flags, uint flags2, byte eTT, float fAmount, STexPic *ti, int& nMips, int& nSize, ETEX_Format eTF);
|
|
void MergeNormalMaps(byte *src[2], CImageFile *im[2], int nMips[2]);
|
|
|
|
STexPic *TextureInfoForName(const char *nameTex, int numT, byte eTT, uint flags, uint flags2, int bind);
|
|
STexPic *LoadFromImage (const char *name, uint flags, uint flags2, byte eTT, int bind, STexPic *ti, float fAmount1=-1.0f, float fAmount2=-1.0f);
|
|
STexPic *UploadImage(CImageFile* im, const char *name, uint flags, uint flags2, byte eTT, int bind, STexPic *ti, float fAmount1=-1.0f, float fAmount2=-1.0f);
|
|
byte *ConvertRGB_Gray(byte *src, STexPic *ti, int flags, ETEX_Format eTF);
|
|
void BuildImageGamma(int wdt, int hgt, byte *dst, bool bHasAlpha);
|
|
|
|
public:
|
|
CTexMan();
|
|
virtual ~CTexMan() {};
|
|
int GetMinFilter() {return m_MinFilter;}
|
|
int GetMagFilter() {return m_MagFilter;}
|
|
int GetMipFilter() {return m_MipFilter;}
|
|
|
|
byte *ImgConvertDXT_RGBA(byte *dst, STexPic *ti, int DXTSize);
|
|
byte *ImgConvertRGBA_DXT(byte *dst, STexPic *ti, int& DXTSize, int& nMips, int bits, bool bUseExistingMips);
|
|
|
|
void Shutdown(void);
|
|
virtual bool GetCubeColor(Vec3 *Pos, CFColor *cols);
|
|
virtual bool SetFilter(char *filt)=0;
|
|
virtual void UpdateTextureData(STexPic *pic, byte *data, int USize, int VSize, bool bProc, int State, bool bPal)=0;
|
|
virtual void UpdateTextureRegion(STexPic *pic, byte *data, int X, int Y, int USize, int VSize)=0;
|
|
virtual STexPic *CreateTexture()=0;
|
|
virtual STexPic *CreateTexture(const char *name, int wdt, int hgt, int depth, uint flags, uint flags2, byte *dst, ETexType eTT, float fAmount1=-1.0f, float fAmount2=-1.0f, int DXTSize=0, STexPic *ti=NULL, int bind=0, ETEX_Format eTF=eTF_8888, const char *szSourceName=NULL)=0;
|
|
virtual STexPic *CopyTexture(const char *name, STexPic *ti, int CubeSide=-1)=0;
|
|
virtual byte *GenerateDXT_HW(STexPic *ti, EImFormat eF, byte *dst, int *numMips, int *DXTSize, bool bMips=true) = 0;
|
|
virtual bool IsTextureLoaded(const char *pName);
|
|
virtual void ReloadTextures ();
|
|
virtual void PreloadTextures (int Flags);
|
|
|
|
virtual void DrawToTexture(Plane& Pl, STexPic *Tex, int RendFlags)=0;
|
|
virtual void DrawToTextureForGlare(int Id)=0;
|
|
virtual void DrawToTextureForRainMap(int Id)=0;
|
|
virtual void StartHeatMap(int Id)=0;
|
|
virtual void EndHeatMap()=0;
|
|
virtual void StartRefractMap(int Id)=0;
|
|
virtual void EndRefractMap()=0;
|
|
virtual void StartNightMap(int Id)=0;
|
|
virtual void EndNightMap()=0;
|
|
virtual void DrawFlashBangMap(int Id, int RendFlags, CREFlashBang *pRE)=0;
|
|
virtual void StartScreenMap(int Id)=0;
|
|
virtual void EndScreenMap()=0;
|
|
virtual void StartScreenTexMap(int Id)=0;
|
|
virtual void EndScreenTexMap()=0;
|
|
virtual void DrawToTextureForDof(int Id)=0;
|
|
virtual bool PreloadScreenFxMaps(void)=0;
|
|
|
|
virtual bool ScanEnvironmentCM (const char *name, int size, Vec3d& Pos)=0;
|
|
virtual void GetAverageColor(SEnvTexture *cm, int nSide)=0;
|
|
virtual void ScanEnvironmentCube(SEnvTexture *cm, int RendFlags, int Size, bool bLightCube)=0;
|
|
virtual void ScanEnvironmentTexture(SEnvTexture *cm, SShader *pSH, SRenderShaderResources *pRes, int RendFlags, bool bUseExistingREs)=0;
|
|
virtual void EndCubeSide(CCObject *obj, bool bNeedClear)=0;
|
|
virtual void StartCubeSide(CCObject *obj)=0;
|
|
virtual void Update()=0;
|
|
virtual void SetGridTexture(STexPic *tp);
|
|
|
|
void UnloadOldTextures(STexPic *pExclude);
|
|
bool CreateCacheFile();
|
|
STexPic *LoadFromCache(STexPic *ti, int flags, int flags2, char *texName, const char *szModelName, ETexType eTT);
|
|
void CreatePools();
|
|
STexPool *CreatePool(int nWidth, int nHeight, int nMips, int nFormat, ETexType eTT);
|
|
|
|
virtual STexPic *GetByID(int Id)=0;
|
|
virtual STexPic *GetByName(const char *szName);
|
|
virtual STexPic *AddToHash(int Id, STexPic *ti) {return NULL;}
|
|
virtual void RemoveFromHash(int Id, STexPic *ti) {};
|
|
virtual void SetTexture(int Id, ETexType eTT) {};
|
|
virtual void GenerateFuncTextures()=0;
|
|
virtual void LoadDefaultTextures();
|
|
|
|
STexPic *LoadTexture(const char* nameTex, uint flags, uint flags2, byte eTT=eTT_Base, float fAmount1=-1.0f, float fAmount2=-1.0f, int bind=0, int numT=-1);
|
|
STexPic *LoadCubeTex(const char *mapname, uint flags, uint flags2, int State, byte eTT, int RState, int Id, int BindId, float fAmount=-1.0f);
|
|
|
|
void ClearAll(int nFlags);
|
|
void ReloadAll(int nFlags);
|
|
bool ReloadFile(const char *fileName, int nFlags);
|
|
_inline int GetCurTMU() { return m_CurStage; }
|
|
void ValidateTexSize();
|
|
void CheckTexLimits(STexPic *pExclude);
|
|
|
|
byte *ConvertNMToPalettedFormat(byte *src, STexPic *ti, ETEX_Format eTF=eTF_0888);
|
|
void GenerateNMPalette();
|
|
|
|
public:
|
|
static bool m_bRGBA;
|
|
|
|
static int m_CurStage;
|
|
static int m_nCurStages;
|
|
|
|
short m_nEnvCX, m_nEnvCY, m_nEnvCZ;
|
|
SBoxCol *m_EnvGridColors;
|
|
|
|
STexPic *m_LastTex;
|
|
char m_CurTexFilter[128];
|
|
int m_CurAnisotropic;
|
|
SRGBPixel m_NMPalette[16][16];
|
|
byte m_NMPaletteLookup[256];
|
|
bool m_bPaletteWasLoaded;
|
|
|
|
void *m_pCurCubeTexture;
|
|
STexPic *m_CurCubeFaces[6];
|
|
|
|
TArray<STexGrid> m_TGrids;
|
|
int m_nTexSizeHistory;
|
|
int m_TexSizeHistory[8];
|
|
int m_nProcessedTextureID1;
|
|
STexPic *m_pProcessedTexture1;
|
|
int m_nProcessedTextureID2;
|
|
STexPic *m_pProcessedTexture2;
|
|
int m_nPhaseProcessingTextures;
|
|
int m_nCustomMip;
|
|
|
|
byte m_TexData[256*256*4];
|
|
|
|
int m_StatsCurTexMem;
|
|
TArray<STexPic *>m_Textures;
|
|
TArray<int> m_FreeSlots;
|
|
STexPic *m_FirstCMSide;
|
|
STexPic *m_LastCMSide;
|
|
STexPic *m_LastCMStreamed;
|
|
|
|
CResFile *m_TexCache;
|
|
int m_LoadBytes;
|
|
int m_UpLoadBytes;
|
|
int m_Streamed;
|
|
float m_fStreamDistFactor;
|
|
|
|
STexPic *m_Text_White;
|
|
STexPic *m_Text_WhiteShadow;
|
|
STexPic *m_Text_WhiteBump;
|
|
STexPic *m_Text_Gradient;
|
|
STexPic *m_Text_Depth;
|
|
STexPic *m_Text_Atten2D;
|
|
STexPic *m_Text_Atten1D;
|
|
STexPic *m_Text_Edge;
|
|
STexPic *m_Text_NoTexture;
|
|
STexPic *m_Text_NoiseVolumeMap;
|
|
STexPic *m_Text_NormalizeCMap;
|
|
STexPic *m_Text_EnvLCMap; // Use for scan environment to CubeMap
|
|
STexPic *m_Text_EnvCMap; // Use for scan environment to CubeMap
|
|
STexPic *m_Text_EnvTex; // Use for scan environment to Texture
|
|
STexPic *m_Text_EnvScr; // Use for scan environment to Texture
|
|
STexPic *m_Text_Glare;
|
|
STexPic *m_Text_HeatMap;
|
|
STexPic *m_Text_FurNormalMap;
|
|
STexPic *m_Text_FurLightMap;
|
|
STexPic *m_Text_Fur;
|
|
STexPic *m_Text_RefractMap;
|
|
STexPic *m_Text_WaterMap;
|
|
STexPic *m_Text_MotionBlurMap;
|
|
STexPic *m_Text_NightVisMap;
|
|
STexPic *m_Text_FlashBangMap;
|
|
STexPic *m_Text_RainMap;
|
|
STexPic *m_Text_LightCMap;
|
|
STexPic *m_Text_FromRE[8];
|
|
STexPic *m_Text_FromObj;
|
|
STexPic *m_Text_FromLight;
|
|
STexPic *m_Text_Fog;
|
|
STexPic *m_Text_Fog_Enter;
|
|
STexPic *m_Text_VFog;
|
|
STexPic *m_Text_Flare;
|
|
STexPic *m_Text_Ghost;
|
|
STexPic *m_Text_DepthLookup;
|
|
STexPic *m_Text_FlashBangFlash; // flash texture used in flasgbang fx
|
|
STexPic *m_Text_ScreenNoise; // screen noise texture
|
|
STexPic *m_Text_HeatPalete; // heat vision pallete texture
|
|
STexPic *m_Text_ScreenMap; // screen buffer
|
|
STexPic *m_Text_ScreenMap_HDR; // screen buffer
|
|
STexPic *m_Text_PrevScreenMap; // previous screen buffer
|
|
STexPic *m_Text_ScreenLuminosityMap; // screen luminosity map
|
|
STexPic *m_Text_ScreenCurrLuminosityMap; // current screen luminosity map
|
|
STexPic *m_Text_ScreenLowMap; // screen buffer size/4
|
|
STexPic *m_Text_ScreenAvg1x1; // average screen buffer 2x2
|
|
STexPic *m_Text_DofMap; // depth of field texture
|
|
|
|
STexPic *m_Text_Gray;
|
|
|
|
STexPic *m_Text_HDRTarget;
|
|
//STexPic *m_Text_HDRTarget_K;
|
|
STexPic *m_Text_HDRTarget_Temp;
|
|
STexPic *m_Text_HDRTargetScaled[2];
|
|
STexPic *m_Text_HDRBrightPass;
|
|
STexPic *m_Text_HDRStarSource;
|
|
STexPic *m_Text_HDRBloomSource;
|
|
STexPic *m_Text_HDRAdaptedLuminanceCur;
|
|
STexPic *m_Text_HDRAdaptedLuminanceLast;
|
|
STexPic *m_Text_HDRToneMaps[NUM_HDR_TONEMAP_TEXTURES];
|
|
STexPic *m_Text_HDRBloomMaps[NUM_HDR_BLOOM_TEXTURES];
|
|
STexPic *m_Text_HDRStarMaps[NUM_HDR_STAR_TEXTURES][2];
|
|
|
|
SEnvTexture m_EnvLCMaps[MAX_ENVLIGHTCUBEMAPS];
|
|
SEnvTexture m_EnvCMaps[MAX_ENVCUBEMAPS];
|
|
SEnvTexture m_EnvTexts[MAX_ENVTEXTURES];
|
|
|
|
SEnvTexture m_CustomCMaps[16];
|
|
SEnvTexture m_CustomTextures[16];
|
|
|
|
TArray<STexPool *> m_TexPools;
|
|
STexPoolItem m_FreeTexPoolItems;
|
|
|
|
STexPic m_Templates[EFTT_MAX];
|
|
|
|
#ifdef DEBUGALLOC
|
|
#undef new
|
|
#endif
|
|
void* operator new( size_t Size ) { void *ptr = malloc(Size); memset(ptr, 0, Size); return ptr; }
|
|
void operator delete( void *Ptr ) { free(Ptr); }
|
|
#ifdef DEBUGALLOC
|
|
#define new DEBUG_CLIENTBLOCK
|
|
#endif
|
|
};
|
|
|
|
|
|
void WriteJPG(byte *dat, int wdt, int hgt, char *name);
|
|
void WriteTGA(byte *dat, int wdt, int hgt, char *name, int dest_bits_per_pixel=24);
|
|
_inline void WriteTGA32(byte *dat, int wdt, int hgt, char *name)
|
|
{
|
|
WriteTGA(dat, wdt, hgt, name, 32);
|
|
}
|
|
void WriteDDS(byte *dat, int wdt, int hgt, int Size, const char *name, EImFormat eF, int NumMips);
|
|
ETEX_Format sImageFormat2TexFormat(EImFormat eImF);
|
|
|
|
#ifdef WIN64
|
|
#pragma warning( pop ) //AMD Port
|
|
#endif
|
|
|
|
#endif
|
|
|