Files
firestorm/Gameleap/code/mw4/Libraries/Compost/TexturePool.cpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

673 lines
13 KiB
C++

#include "CompostHeaders.hpp"
#include <GameOS\ToolOS.hpp>
TexturePool *TexturePool::Instance=NULL;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
TexturePool::TexturePool()
: imageTable(
NULL,
true
)
{
texturePath = NULL;
changed = false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
TexturePool::~TexturePool()
{
Stuff::TableIteratorOf<Feature_Texture*, int> images(&imageTable);
Feature_Texture *fettext=NULL;
while(NULL!=(fettext=images.ReadAndNext()))
{
if(fettext->GetLoadedMode())
{
Compost::DestroyTextureData(fettext);
}
}
images.DeletePlugs();
if(texturePath)
{
Unregister_Pointer(texturePath);
delete texturePath;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
TexturePool::SetTexturePath(const char *pName)
{
Verify(gos_GetCurrentHeap() == Heap);
Check_Pointer(this);
if(pName==NULL)
{
return;
}
if(texturePath)
{
Unregister_Pointer(texturePath);
delete texturePath;
}
texturePath = new char [strlen(pName)+1];
Register_Pointer(texturePath);
strcpy(texturePath, pName);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
TexturePool::SetTexturePath(const char *pName, const char *tcf_filename)
{
Verify(gos_GetCurrentHeap() == Heap);
Check_Pointer(this);
if(pName==NULL)
{
return;
}
if(texturePath)
{
Unregister_Pointer(texturePath);
delete texturePath;
}
texturePath = new char [strlen(pName)+1];
Register_Pointer(texturePath);
strcpy(texturePath, pName);
LoadIndex(tcf_filename);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
int
TexturePool::GetMask(int value)
{
int i, first=-1;
int mask=1;
for(i=0;i<8*sizeof(int);i++)
{
if(value & mask)
{
if(first<0)
{
first = i;
}
else
{
return 0xffffffff;
}
}
mask <<= 1;
}
if(first<0)
{
return 0;
}
mask = 1;
for(i=1;i<first;i++)
{
mask <<= 1;
mask |= 1;
}
return mask;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
int
TexturePool::Add(
Stuff::MString name,
int width,
int height,
Feature_Texture::TextureMode type
)
{
Verify(gos_GetCurrentHeap() == Heap);
Check_Object(this);
Verify(name.GetLength() > 0);
name.ToLower();
int index = name.GetHashValue();
Feature_Texture *image;
if ((image = imageTable.Find(index)) == NULL)
{
image = new Tool_Feature_Texture();
Check_Object(image);
((Tool_Feature_Texture *)image)->name = name;
image->SetTextureMode(type);
switch(type)
{
case Feature_Texture::TextureMode::FTT_555:
image->SetTextureDepth(2);
break;
case Feature_Texture::TextureMode::FTT_4444:
image->SetTextureDepth(2);
break;
case Feature_Texture::TextureMode::FTT_1:
image->SetTextureDepth(1);
break;
case Feature_Texture::TextureMode::FTT_1_1:
image->SetTextureDepth(1);
break;
case Feature_Texture::TextureMode::FTT_1_M:
image->SetTextureDepth(1);
break;
}
image->width = width;
image->height = height;
image->width_mask = GetMask(width);
image->height_mask = GetMask(height);
imageTable.AddValue(image, index);
changed = true;
return name.GetHashValue();
}
return 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
int
TexturePool::Add(
int index,
int width,
int height,
Feature_Texture::TextureMode type
)
{
Verify(gos_GetCurrentHeap() == Heap);
Check_Object(this);
Feature_Texture *image;
if ((image = imageTable.Find(index)) == NULL)
{
image = new Feature_Texture();
Check_Object(image);
image->SetTextureMode(type);
switch(type)
{
case Feature_Texture::TextureMode::FTT_555:
image->SetTextureDepth(2);
break;
case Feature_Texture::TextureMode::FTT_4444:
image->SetTextureDepth(2);
break;
case Feature_Texture::TextureMode::FTT_1:
image->SetTextureDepth(1);
break;
case Feature_Texture::TextureMode::FTT_1_1:
image->SetTextureDepth(1);
break;
case Feature_Texture::TextureMode::FTT_1_M:
image->SetTextureDepth(1);
break;
}
image->width = width;
image->height = height;
image->width_mask = GetMask(width);
image->height_mask = GetMask(height);
imageTable.AddValue(image, index);
changed = true;
return index;
}
else
{
return 0;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Feature_Texture*
TexturePool::Get(const char* image_name)
{
Check_Object(this);
Stuff::MString imageName = image_name;
Verify(imageName.GetLength() > 0);
//
//---------------------------
// Get the image for the name
//---------------------------
//
MString name(image_name);
name.ToLower();
return Get(name.GetHashValue());
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Feature_Texture*
TexturePool::Get(int index)
{
Check_Pointer(this);
Feature_Texture *image;
if ((image = imageTable.Find(index)) == NULL)
{
return NULL;
}
Check_Pointer(image);
return image;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
int
TexturePool::GetIndex(Feature_Texture *ft)
{
if(imageTable.IsEmpty() || ft==NULL)
{
return 0;
}
TableIteratorOf<Feature_Texture*, int> imageTableIterator(&imageTable);
Feature_Texture *featureTexture;
do
{
featureTexture = imageTableIterator.GetCurrent();
if(featureTexture==NULL)
{
break;
}
if(ft==featureTexture)
{
return imageTableIterator.GetValue();
}
} while(NULL!=imageTableIterator.ReadAndNext());
return 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
TexturePool::Remove(Feature_Texture *image)
{
Check_Pointer(this);
Unregister_Pointer(image);
delete image;
changed = true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
TexturePool::Remove(const char* name)
{
Check_Pointer(this);
Remove(Get(name));
changed = true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
TexturePool::Load(const char* , int)
{
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
TexturePool::Load(int index , int type)
{
if(index==0)
{
return false;
}
Feature_Texture *tex = Get(index);
if(tex->GetLoadedMode())
{
return true;
}
MString *name = tex->GetName();
if(name)
{
MString fileName(texturePath);
fileName += "\\";
fileName += *name;
FetchTextureData(tex, fileName, type);
}
else
{
FetchTextureData(tex, index, type);
}
if(tex->data)
{
tex->SetLoadedOn();
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
TexturePool::Load(Feature_Texture *tex)
{
if(tex==NULL)
{
return false;
}
if(tex->GetLoadedMode())
{
return true;
}
MString *name = tex->GetName();
if(name)
{
MString fileName(texturePath);
fileName += "\\";
fileName += *name;
FetchTextureData(tex, fileName, tex->flags);
}
else
{
// FetchTexture(tex, index, tex->type);
}
if(tex->data)
{
tex->SetLoadedOn();
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
TexturePool::LoadIndex()
{
TableIteratorOf<Feature_Texture*, int> imageTableIterator(&imageTable);
imageTableIterator.DeletePlugs();
MString files(texturePath);
files += "\\*.tcf";
char *tmpfile_name=gos_FindFiles(files);
while(tmpfile_name)
{
MString fileName(texturePath);
fileName +="\\";
fileName +=tmpfile_name;
if(!gos_DoesFileExist(fileName))
{
return;
}
NotationFile index(fileName);
const char *textureName;
int width, height, type;
NotationFile::PageIterator *page_list = index.MakePageIterator();
Page *tex_page;
while((tex_page = page_list->ReadAndNext()) != NULL)
{
Check_Object(tex_page);
if( tex_page->GetEntry("Type", &type) &&
tex_page->GetEntry("Width", &width) &&
tex_page->GetEntry("Height", &height)
)
{
if(!tex_page->GetEntry("Name", &textureName))
{
int number;
tex_page->GetEntry("Index", &number, true);
Add(
number,
static_cast<unsigned short>(width),
static_cast<unsigned short>(height),
static_cast<Feature_Texture::TextureMode>(type)
);
}
else
{
Add(
textureName,
static_cast<unsigned short>(width),
static_cast<unsigned short>(height),
static_cast<Feature_Texture::TextureMode>(type)
);
}
}
}
delete page_list;
tmpfile_name=gos_FindFilesNext();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
TexturePool::LoadIndex(const char *tcf_filename)
{
TableIteratorOf<Feature_Texture*, int> imageTableIterator(&imageTable);
imageTableIterator.DeletePlugs();
if(!gos_DoesFileExist(tcf_filename))
{
return;
}
NotationFile index(tcf_filename);
const char *textureName;
int width, height, type;
NotationFile::PageIterator *page_list = index.MakePageIterator();
Page *tex_page;
while((tex_page = page_list->ReadAndNext()) != NULL)
{
Check_Object(tex_page);
if( tex_page->GetEntry("Type", &type) &&
tex_page->GetEntry("Width", &width) &&
tex_page->GetEntry("Height", &height)
)
{
if(!tex_page->GetEntry("Name", &textureName))
{
int number;
tex_page->GetEntry("Index", &number, true);
Add(
number,
static_cast<unsigned short>(width),
static_cast<unsigned short>(height),
static_cast<Feature_Texture::TextureMode>(type)
);
}
else
{
Add(
textureName,
static_cast<unsigned short>(width),
static_cast<unsigned short>(height),
static_cast<Feature_Texture::TextureMode>(type)
);
}
}
}
delete page_list;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
TexturePool::LoadIndex(NotationFile *index)
{
TableIteratorOf<Feature_Texture*, int> imageTableIterator(&imageTable);
imageTableIterator.DeletePlugs();
const char *textureName;
int width, height, type;
NotationFile::PageIterator *page_list = index->MakePageIterator();
Page *tex_page;
while((tex_page = page_list->ReadAndNext()) != NULL)
{
Check_Object(tex_page);
if( tex_page->GetEntry("Type", &type) &&
tex_page->GetEntry("Width", &width) &&
tex_page->GetEntry("Height", &height)
)
{
if(!tex_page->GetEntry("Name", &textureName))
{
int number;
tex_page->GetEntry("Index", &number, true);
Add(
number,
static_cast<unsigned short>(width),
static_cast<unsigned short>(height),
static_cast<Feature_Texture::TextureMode>(type)
);
}
else
{
Add(
textureName,
static_cast<unsigned short>(width),
static_cast<unsigned short>(height),
static_cast<Feature_Texture::TextureMode>(type)
);
}
}
}
delete page_list;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
TexturePool::SaveIndex(const char*)
{
if(imageTable.IsEmpty())
{
changed = false;
return true;
}
TableIteratorOf<Feature_Texture*, int> imageTableIterator(&imageTable);
MString fileName(texturePath);
fileName += "\\index.tcf";
if(gos_FileReadOnly(fileName)) return false;
NotationFile index;
char numberString[8];
const char *str;
int number = 0;
MString *name;
Feature_Texture *featureTexture;
str = numberString;
do
{
featureTexture = imageTableIterator.GetCurrent();
if(featureTexture==NULL)
{
break;
}
sprintf(numberString, "%d", number);
Page *page = index.AddPage(str);
Check_Object(page);
name = featureTexture->GetName();
if(name)
{
page->SetEntry("Name", *name);
}
else
{
int value = imageTableIterator.GetValue();
page->SetEntry("Index", value);
}
page->SetEntry("Type", featureTexture->GetTextureMode());
page->SetEntry("Width", featureTexture->width);
page->SetEntry("Height", featureTexture->height);
number++;
} while(NULL!=imageTableIterator.ReadAndNext());
index.SaveAs(fileName);
changed = false;
return true;
}