mirror of
https://github.com/GTAmodding/re3.git
synced 2024-11-16 12:18:59 +00:00
159 lines
3.2 KiB
C++
159 lines
3.2 KiB
C++
|
#include "common.h"
|
||
|
#include "patcher.h"
|
||
|
#include "templates.h"
|
||
|
#include "Streaming.h"
|
||
|
#include "TxdStore.h"
|
||
|
|
||
|
CPool<TxdDef,TxdDef> *&CTxdStore::ms_pTxdPool = *(CPool<TxdDef,TxdDef>**)0x8F5FB8;
|
||
|
RwTexDictionary *&CTxdStore::ms_pStoredTxd = *(RwTexDictionary**)0x9405BC;
|
||
|
|
||
|
void
|
||
|
CTxdStore::Initialize(void)
|
||
|
{
|
||
|
if(ms_pTxdPool == nil)
|
||
|
ms_pTxdPool = new CPool<TxdDef,TxdDef>(TXDSTORESIZE);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CTxdStore::Shutdown(void)
|
||
|
{
|
||
|
if(ms_pTxdPool)
|
||
|
delete ms_pTxdPool;
|
||
|
}
|
||
|
|
||
|
int
|
||
|
CTxdStore::AddTxdSlot(const char *name)
|
||
|
{
|
||
|
TxdDef *def = ms_pTxdPool->New();
|
||
|
assert(def);
|
||
|
def->texDict = nil;
|
||
|
def->refCount = 0;
|
||
|
strcpy(def->name, name);
|
||
|
return ms_pTxdPool->GetJustIndex(def);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
CTxdStore::FindTxdSlot(const char *name)
|
||
|
{
|
||
|
char *defname;
|
||
|
int size = ms_pTxdPool->GetSize();
|
||
|
for(int i = 0; i < size; i++){
|
||
|
defname = GetTxdName(i);
|
||
|
if(defname && _strcmpi(defname, name) == 0)
|
||
|
return i;
|
||
|
}
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
char*
|
||
|
CTxdStore::GetTxdName(int slot)
|
||
|
{
|
||
|
TxdDef *def = GetSlot(slot);
|
||
|
return def ? def->name : nil;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CTxdStore::PushCurrentTxd(void)
|
||
|
{
|
||
|
ms_pStoredTxd = RwTexDictionaryGetCurrent();
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CTxdStore::PopCurrentTxd(void)
|
||
|
{
|
||
|
RwTexDictionarySetCurrent(ms_pStoredTxd);
|
||
|
ms_pStoredTxd = nil;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CTxdStore::SetCurrentTxd(int slot)
|
||
|
{
|
||
|
TxdDef *def = GetSlot(slot);
|
||
|
if(def)
|
||
|
RwTexDictionarySetCurrent(def->texDict);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CTxdStore::Create(int slot)
|
||
|
{
|
||
|
GetSlot(slot)->texDict = RwTexDictionaryCreate();
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CTxdStore::AddRef(int slot)
|
||
|
{
|
||
|
GetSlot(slot)->refCount++;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CTxdStore::RemoveRef(int slot)
|
||
|
{
|
||
|
if(--GetSlot(slot)->refCount <= 0)
|
||
|
CStreaming::RemoveModel(slot + STREAM_OFFSET_TXD);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CTxdStore::RemoveRefWithoutDelete(int slot)
|
||
|
{
|
||
|
GetSlot(slot)->refCount--;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
bool
|
||
|
CTxdStore::LoadTxd(int slot, RwStream *stream)
|
||
|
{
|
||
|
TxdDef *def = GetSlot(slot);
|
||
|
if(!rw::findChunk(stream, rw::ID_TEXDICTIONARY, nil, nil)){
|
||
|
return false;
|
||
|
}else{
|
||
|
def->texDict = rw::TexDictionary::streamRead(stream);
|
||
|
convertTxd(def->texDict);
|
||
|
return def->texDict != nil;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
CTxdStore::LoadTxd(int slot, const char *filename)
|
||
|
{
|
||
|
rw::StreamFile stream;
|
||
|
if(stream.open(getPath(filename), "rb")){
|
||
|
LoadTxd(slot, &stream);
|
||
|
stream.close();
|
||
|
return true;
|
||
|
}
|
||
|
printf("Failed to open TXD\n");
|
||
|
return false;
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
void
|
||
|
CTxdStore::RemoveTxd(int slot)
|
||
|
{
|
||
|
TxdDef *def = GetSlot(slot);
|
||
|
if(def->texDict)
|
||
|
RwTexDictionaryDestroy(def->texDict);
|
||
|
def->texDict = nil;
|
||
|
}
|
||
|
|
||
|
//bool
|
||
|
//CTxdStore::isTxdLoaded(int slot)
|
||
|
//{
|
||
|
// return GetSlot(slot)->texDict != nil;
|
||
|
//}
|
||
|
|
||
|
STARTPATCHES
|
||
|
InjectHook(0x527440, CTxdStore::Initialize, PATCH_JUMP);
|
||
|
InjectHook(0x527470, CTxdStore::Shutdown, PATCH_JUMP);
|
||
|
InjectHook(0x5274E0, CTxdStore::AddTxdSlot, PATCH_JUMP);
|
||
|
InjectHook(0x5275D0, CTxdStore::FindTxdSlot, PATCH_JUMP);
|
||
|
InjectHook(0x527590, CTxdStore::GetTxdName, PATCH_JUMP);
|
||
|
InjectHook(0x527900, CTxdStore::PushCurrentTxd, PATCH_JUMP);
|
||
|
InjectHook(0x527910, CTxdStore::PopCurrentTxd, PATCH_JUMP);
|
||
|
InjectHook(0x5278C0, CTxdStore::SetCurrentTxd, PATCH_JUMP);
|
||
|
InjectHook(0x527830, CTxdStore::Create, PATCH_JUMP);
|
||
|
InjectHook(0x527930, CTxdStore::AddRef, PATCH_JUMP);
|
||
|
InjectHook(0x527970, CTxdStore::RemoveRef, PATCH_JUMP);
|
||
|
InjectHook(0x5279C0, CTxdStore::RemoveRefWithoutDelete, PATCH_JUMP);
|
||
|
InjectHook(0x527870, CTxdStore::RemoveTxd, PATCH_JUMP);
|
||
|
ENDPATCHES
|