This commit is contained in:
Daveo 2000-11-30 22:17:55 +00:00
parent e9835c718d
commit 80cb6d30d8
17 changed files with 282 additions and 349 deletions

View file

@ -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();
}
}
/**************************************************************************************/