138 lines
3.8 KiB
C++
138 lines
3.8 KiB
C++
//**************************************************************
|
|
//* OpenGLide - Glide to OpenGL Wrapper
|
|
//* http://openglide.sourceforge.net
|
|
//*
|
|
//* TexDB Class Definition
|
|
//*
|
|
//* OpenGLide is OpenSource under LGPL license
|
|
//* Originaly made by Fabio Barros
|
|
//* Modified by Paul for Glidos (http://www.glidos.net)
|
|
//* Mac version and additional features by Jens-Olaf Hemprich
|
|
//**************************************************************
|
|
|
|
#ifndef __TEXDB_H__
|
|
#define __TEXDB_H__
|
|
|
|
struct SubTexCoord_t
|
|
{
|
|
GLfloat smin; // min max values rfor s & t
|
|
GLfloat smax;
|
|
GLfloat tmin;
|
|
GLfloat tmax;
|
|
GLfloat width; // size in OpenGL tex coords
|
|
GLfloat height;
|
|
unsigned int left; // Pixel origin of the sub texture
|
|
unsigned int top;
|
|
unsigned int texImageWidth; // power of two
|
|
unsigned int texImageHeight; // power of two
|
|
};
|
|
|
|
class TexDB
|
|
{
|
|
public:
|
|
void Clear( void );
|
|
enum TextureMode
|
|
{
|
|
One = 0,
|
|
Two = 1,
|
|
SubTextureOne = 2,
|
|
SubTextureTwo = 3
|
|
};
|
|
struct SubRecord
|
|
{
|
|
public:
|
|
SubRecord *next;
|
|
public:
|
|
GLuint texNum;
|
|
GLuint tex2Num;
|
|
unsigned int left;
|
|
unsigned int top;
|
|
unsigned int texImageWidth;
|
|
unsigned int texImageHeight;
|
|
SubRecord(TexDB::TextureMode texturemode);
|
|
~SubRecord(void);
|
|
inline bool Match(const SubTexCoord_t* subtexcoords) const
|
|
{
|
|
return (subtexcoords->smin >= left &&
|
|
subtexcoords->tmin >= top &&
|
|
subtexcoords->smax <= left + texImageWidth &&
|
|
subtexcoords->tmax <= top + texImageHeight);
|
|
};
|
|
inline bool IsInside(const SubTexCoord_t* subtexcoords) const
|
|
{
|
|
return (subtexcoords->left > left &&
|
|
subtexcoords->top > top &&
|
|
subtexcoords->left + subtexcoords->texImageWidth < left + texImageWidth &&
|
|
subtexcoords->top + subtexcoords->texImageHeight < top + texImageHeight);
|
|
};
|
|
void* operator new(size_t s);
|
|
void operator delete(void* p);
|
|
static void Cleanup();
|
|
static SubRecord* s_FreeSubRecords;
|
|
private:
|
|
void* operator new[](size_t s); // not used so we don't need an implementation
|
|
void operator delete[](void* p);
|
|
};
|
|
|
|
struct RecordArray;
|
|
class Record
|
|
{
|
|
protected:
|
|
static Record* s_FreeRecords;
|
|
static RecordArray* s_RecordArrays;
|
|
static void AllocRecords();
|
|
public:
|
|
FxU32 startAddress;
|
|
FxU32 endAddress;
|
|
Record *next;
|
|
SubRecord *subrecords;
|
|
public:
|
|
GrTexInfo info;
|
|
FxU32 hash;
|
|
GLuint texNum;
|
|
GLuint tex2Num;
|
|
GLuint SClampMode;
|
|
GLuint TClampMode;
|
|
GLuint MinFilterMode;
|
|
GLuint MagFilterMode;
|
|
public:
|
|
Record(TexDB::TextureMode texturemode);
|
|
~Record(void);
|
|
inline bool Match(FxU32 stt, const GrTexInfo *inf, FxU32 h) const
|
|
{
|
|
return ((startAddress == stt) &&
|
|
(inf->largeLod == info.largeLod) &&
|
|
(inf->aspectRatio == info.aspectRatio) &&
|
|
(inf->format == info.format) &&
|
|
((hash == h) || (h == 0)));
|
|
}
|
|
void WipeInside(const SubTexCoord_t* subtexcoords);
|
|
void* operator new(size_t s);
|
|
void operator delete(void* p);
|
|
static void Init();
|
|
static void Cleanup();
|
|
private:
|
|
void* operator new[](size_t s); // not used so we don't need an implementation
|
|
void operator delete[](void* p); // not used so we don't need an implementation
|
|
};
|
|
static int RecordArraySize;
|
|
struct RecordArray
|
|
{
|
|
RecordArray* next;
|
|
Record records[1];
|
|
};
|
|
Record* Add(FxU32 startAddress, FxU32 endAddress, const GrTexInfo *info, FxU32 hash, TexDB::TextureMode texturemode, const SubTexCoord_t* subtexcoords);
|
|
Record* Find(FxU32 startAddress, const GrTexInfo *info, FxU32 hash, bool *pal_change, SubTexCoord_t* subtexcoords) const;
|
|
void WipeRange(FxU32 startAddress, FxU32 endAddress, FxU32 hash);
|
|
TexDB(unsigned int MemorySize);
|
|
virtual ~TexDB(void);
|
|
private:
|
|
unsigned int numberOfTexSections;
|
|
Record** m_first;
|
|
#ifdef OPTIMISE_TEXTURE_LOOKUP
|
|
Record** m_texmem_2_record;
|
|
#endif
|
|
};
|
|
|
|
#endif
|