This commit is contained in:
parent
e9835c718d
commit
80cb6d30d8
17 changed files with 282 additions and 349 deletions
|
@ -16,63 +16,44 @@
|
|||
/*****************************************************************************/
|
||||
/*****************************************************************************/
|
||||
/*****************************************************************************/
|
||||
int CTexCache::GetTexIdx(char *Name,int Flags)
|
||||
int CTexCache::GetTexIdx(char *Filename,int Flags)
|
||||
{
|
||||
int ListSize=TexList.size();
|
||||
|
||||
for (int Count=0;Count<ListSize;Count++)
|
||||
{
|
||||
if (strcmp(Name,TexList[Count].Name)==0 && TexList[Count].Flags==Flags)
|
||||
{
|
||||
return(Count);
|
||||
}
|
||||
}
|
||||
|
||||
return(-1);
|
||||
sTex Tex;
|
||||
strcpy(Tex.Filename,Filename);
|
||||
Tex.Flags=Flags;
|
||||
return(TexList.Find(Tex));
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int CTexCache::ProcessTexture(char *TexName,char *Path,int Flags,sRGBData *RGBData)
|
||||
// Checks loaded files for dups, assumes all passed RGB is unique
|
||||
int CTexCache::ProcessTexture(char *Filename,int Flags,sRGBData *RGBData)
|
||||
{
|
||||
int ListSize=TexList.size();
|
||||
int Idx;
|
||||
char Name[_MAX_FNAME];
|
||||
|
||||
_splitpath(TexName,0,0,Name,0);
|
||||
|
||||
// Check if Tex exists
|
||||
/* for (int Count=0;Count<ListSize;Count++)
|
||||
{
|
||||
if (strcmp(Name,TexList[Count].Name)==0 && TexList[Count].Flags==Flags)
|
||||
{
|
||||
return(Count);
|
||||
}
|
||||
}
|
||||
*/
|
||||
Idx=GetTexIdx(Name,Flags);
|
||||
if (Idx!=-1) return(Idx);
|
||||
|
||||
sTex NewTex;
|
||||
sRGBData ThisRGB;
|
||||
|
||||
strcpy(NewTex.Name,Name);
|
||||
strcpy(NewTex.Path,Path);
|
||||
strcpy(NewTex.Filename,Filename);
|
||||
NewTex.Flags=Flags;
|
||||
|
||||
NewTex.Flags=Flags;
|
||||
|
||||
if (!RGBData) // Need to load file
|
||||
{
|
||||
char Filename[_MAX_PATH];
|
||||
|
||||
sprintf(Filename,"%s%s.Bmp",Path,Name);
|
||||
TRACE1("Loading Texture %s\n",Filename);
|
||||
LoadBMP(Filename,ThisRGB);
|
||||
int Idx=GetTexIdx(NewTex); // Is already loaded?
|
||||
if (Idx!=-1) return(Idx);
|
||||
// sprintf(NewTex.Filename,"%s%s",Path,TexName);
|
||||
TRACE1("Loading Texture %s\n",NewTex.Filename);
|
||||
LoadBMP(NewTex.Filename,ThisRGB);
|
||||
RGBData=&ThisRGB;
|
||||
LoadTex(NewTex,RGBData);
|
||||
FreeBMP(ThisRGB);
|
||||
NewTex.Loaded=TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
LoadTex(NewTex,RGBData);
|
||||
NewTex.Loaded=FALSE;
|
||||
}
|
||||
|
||||
TexList.push_back(NewTex);
|
||||
|
@ -82,6 +63,20 @@ sRGBData ThisRGB;
|
|||
|
||||
/**************************************************************************************/
|
||||
/**************************************************************************************/
|
||||
/**************************************************************************************/
|
||||
const int TexAlignTable[]={1,2,4,8,16,32,64,128,256};
|
||||
const int TexAlignTableSize=sizeof(TexAlignTable)/sizeof(int);
|
||||
int CTexCache::AlignSize(int Size)
|
||||
{
|
||||
for (int i=0;i<TexAlignTableSize-1; i++)
|
||||
{
|
||||
if (Size>TexAlignTable[i] && Size<TexAlignTable[i+1]) return(TexAlignTable[i+1]);
|
||||
}
|
||||
|
||||
return(Size);
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************************/
|
||||
void CTexCache::LoadBMP(char *Filename,sRGBData &RGBData)
|
||||
{
|
||||
|
@ -105,16 +100,7 @@ void CTexCache::FreeBMP(sRGBData &RGBData)
|
|||
}
|
||||
|
||||
/**************************************************************************************/
|
||||
void CTexCache::LoadTex(sTex &ThisTex,sRGBData *TexData)
|
||||
{
|
||||
std::vector<u8> Buffer;
|
||||
int Width=TexData->Width;
|
||||
int Height=TexData->Height;
|
||||
int Size=Width*Height;
|
||||
// create RGB & alpha texture
|
||||
Buffer.resize(Size*4);
|
||||
u8 *RgbPtr=TexData->RGB;
|
||||
|
||||
/*
|
||||
for (int i=0;i<Size;i++)
|
||||
{
|
||||
u8 R=*RgbPtr++;
|
||||
|
@ -131,15 +117,65 @@ u8 *RgbPtr=TexData->RGB;
|
|||
Buffer[(i*4)+2]=B;
|
||||
Buffer[(i*4)+3]=A;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
ThisTex.Width=Width;
|
||||
ThisTex.Height=Height;
|
||||
void CTexCache::LoadTex(sTex &ThisTex,sRGBData *TexData)
|
||||
{
|
||||
std::vector<u8> Buffer;
|
||||
int TexWidth=TexData->Width;
|
||||
int TexHeight=TexData->Height;
|
||||
int GLWidth=AlignSize(TexWidth);
|
||||
int GLHeight=AlignSize(TexHeight);
|
||||
u8 *Src,*Dst;
|
||||
u8 R,G,B,A;
|
||||
// create RGB & alpha texture & ensuse texture is correct size for GL
|
||||
|
||||
Buffer.resize(GLWidth*GLHeight*4);
|
||||
Dst=&Buffer[0];
|
||||
for (int Y=0; Y<GLHeight; Y++)
|
||||
{
|
||||
for (int X=0; X<GLWidth; X++)
|
||||
{
|
||||
|
||||
if (X<=TexWidth && Y<=TexHeight)
|
||||
{
|
||||
Src=(u8*)&TexData->RGB[((Y*TexWidth)+X)*3];
|
||||
R=*Src++;
|
||||
G=*Src++;
|
||||
B=*Src++;
|
||||
A=255;
|
||||
if ((R==BlankRGB.rgbRed && G==BlankRGB.rgbGreen && B==BlankRGB.rgbBlue)) // Create alpha for transparent pixels (flagged with PINK!!)
|
||||
{
|
||||
A=0;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
R=255;
|
||||
G=0;
|
||||
B=255;
|
||||
A=255;
|
||||
}
|
||||
*Dst++=R;
|
||||
*Dst++=G;
|
||||
*Dst++=B;
|
||||
*Dst++=A;
|
||||
}
|
||||
}
|
||||
|
||||
ThisTex.TexWidth=TexWidth;
|
||||
ThisTex.TexHeight=TexHeight;
|
||||
ThisTex.GLWidth=GLWidth;
|
||||
ThisTex.GLHeight=GLHeight;
|
||||
ThisTex.dW=1.0f/(GLWidth/16);
|
||||
ThisTex.dW=((float)TexWidth/(float)GLWidth)/(GLWidth/16);
|
||||
ThisTex.dH=((float)TexHeight/(float)GLHeight)/(GLHeight/16);
|
||||
|
||||
glGenTextures(1, &ThisTex.TexID);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, ThisTex.TexID);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, 4, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &Buffer[0]);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, 4, GLWidth, GLHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, &Buffer[0]);
|
||||
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
|
@ -148,7 +184,6 @@ u8 *RgbPtr=TexData->RGB;
|
|||
/**************************************************************************************/
|
||||
/**************************************************************************************/
|
||||
/**************************************************************************************/
|
||||
|
||||
void CTexCache::Purge()
|
||||
{
|
||||
int ListSize=TexList.size();
|
||||
|
@ -161,4 +196,6 @@ int ListSize=TexList.size();
|
|||
}
|
||||
|
||||
TexList.clear();
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************************************/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue