Material fixes.
This commit is contained in:
parent
9449750aab
commit
bf80c3fd61
@ -9,6 +9,8 @@ namespace Components
|
|||||||
|
|
||||||
std::map<void*, void*> AssetHandler::Relocations;
|
std::map<void*, void*> AssetHandler::Relocations;
|
||||||
|
|
||||||
|
std::map<std::string, Game::XAssetHeader> AssetHandler::TemporaryAssets[Game::XAssetType::ASSET_TYPE_COUNT];
|
||||||
|
|
||||||
void AssetHandler::RegisterInterface(IAsset* iAsset)
|
void AssetHandler::RegisterInterface(IAsset* iAsset)
|
||||||
{
|
{
|
||||||
if (!iAsset) return;
|
if (!iAsset) return;
|
||||||
@ -26,6 +28,19 @@ namespace Components
|
|||||||
AssetHandler::AssetInterfaces[iAsset->GetType()] = iAsset;
|
AssetHandler::AssetInterfaces[iAsset->GetType()] = iAsset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AssetHandler::ClearTemporaryAssets()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Game::XAssetType::ASSET_TYPE_COUNT; i++)
|
||||||
|
{
|
||||||
|
AssetHandler::TemporaryAssets[i].clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AssetHandler::StoreTemporaryAsset(Game::XAssetType type, Game::XAssetHeader asset)
|
||||||
|
{
|
||||||
|
AssetHandler::TemporaryAssets[type][Game::DB_GetXAssetNameHandlers[type](&asset)] = asset;
|
||||||
|
}
|
||||||
|
|
||||||
Game::XAssetHeader AssetHandler::FindAsset(Game::XAssetType type, const char* filename)
|
Game::XAssetHeader AssetHandler::FindAsset(Game::XAssetType type, const char* filename)
|
||||||
{
|
{
|
||||||
Game::XAssetHeader header = { 0 };
|
Game::XAssetHeader header = { 0 };
|
||||||
@ -184,6 +199,14 @@ namespace Components
|
|||||||
Game::XAssetHeader AssetHandler::FindAssetForZone(Game::XAssetType type, std::string filename, ZoneBuilder::Zone* builder)
|
Game::XAssetHeader AssetHandler::FindAssetForZone(Game::XAssetType type, std::string filename, ZoneBuilder::Zone* builder)
|
||||||
{
|
{
|
||||||
Game::XAssetHeader header = { 0 };
|
Game::XAssetHeader header = { 0 };
|
||||||
|
if (type >= Game::XAssetType::ASSET_TYPE_COUNT) return header;
|
||||||
|
|
||||||
|
auto tempPool = &AssetHandler::TemporaryAssets[type];
|
||||||
|
auto entry = tempPool->find(filename);
|
||||||
|
if (entry != tempPool->end())
|
||||||
|
{
|
||||||
|
return { entry->second };
|
||||||
|
}
|
||||||
|
|
||||||
if (AssetHandler::AssetInterfaces.find(type) != AssetHandler::AssetInterfaces.end())
|
if (AssetHandler::AssetInterfaces.find(type) != AssetHandler::AssetInterfaces.end())
|
||||||
{
|
{
|
||||||
@ -213,6 +236,8 @@ namespace Components
|
|||||||
|
|
||||||
AssetHandler::AssetHandler()
|
AssetHandler::AssetHandler()
|
||||||
{
|
{
|
||||||
|
AssetHandler::ClearTemporaryAssets();
|
||||||
|
|
||||||
// DB_FindXAssetHeader
|
// DB_FindXAssetHeader
|
||||||
Utils::Hook(Game::DB_FindXAssetHeader, AssetHandler::FindAssetStub).Install()->Quick();
|
Utils::Hook(Game::DB_FindXAssetHeader, AssetHandler::FindAssetStub).Install()->Quick();
|
||||||
|
|
||||||
@ -235,6 +260,8 @@ namespace Components
|
|||||||
|
|
||||||
AssetHandler::~AssetHandler()
|
AssetHandler::~AssetHandler()
|
||||||
{
|
{
|
||||||
|
ClearTemporaryAssets();
|
||||||
|
|
||||||
for (auto i = AssetHandler::AssetInterfaces.begin(); i != AssetHandler::AssetInterfaces.end(); i++)
|
for (auto i = AssetHandler::AssetInterfaces.begin(); i != AssetHandler::AssetInterfaces.end(); i++)
|
||||||
{
|
{
|
||||||
delete i->second;
|
delete i->second;
|
||||||
|
@ -31,6 +31,9 @@ namespace Components
|
|||||||
static Game::XAssetHeader FindOriginalAsset(Game::XAssetType type, const char* filename);
|
static Game::XAssetHeader FindOriginalAsset(Game::XAssetType type, const char* filename);
|
||||||
static Game::XAssetHeader FindAssetForZone(Game::XAssetType type, std::string filename, ZoneBuilder::Zone* builder);
|
static Game::XAssetHeader FindAssetForZone(Game::XAssetType type, std::string filename, ZoneBuilder::Zone* builder);
|
||||||
|
|
||||||
|
static void ClearTemporaryAssets();
|
||||||
|
static void StoreTemporaryAsset(Game::XAssetType type, Game::XAssetHeader asset);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static bool BypassState;
|
static bool BypassState;
|
||||||
|
|
||||||
@ -43,6 +46,8 @@ namespace Components
|
|||||||
|
|
||||||
static void OffsetToAlias(Utils::Stream::Offset* offset);
|
static void OffsetToAlias(Utils::Stream::Offset* offset);
|
||||||
|
|
||||||
|
static std::map<std::string, Game::XAssetHeader> TemporaryAssets[Game::XAssetType::ASSET_TYPE_COUNT];
|
||||||
|
|
||||||
static std::map<Game::XAssetType, IAsset*> AssetInterfaces;
|
static std::map<Game::XAssetType, IAsset*> AssetInterfaces;
|
||||||
static std::map<Game::XAssetType, Callback> TypeCallbacks;
|
static std::map<Game::XAssetType, Callback> TypeCallbacks;
|
||||||
static std::vector<RestrictCallback> RestrictCallbacks;
|
static std::vector<RestrictCallback> RestrictCallbacks;
|
||||||
|
@ -14,18 +14,59 @@ namespace Assets
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
image->semantic = 0;
|
image->name = builder->GetAllocator()->DuplicateString(name);
|
||||||
image->category = 3;
|
image->semantic = 2;
|
||||||
|
image->category = 0;
|
||||||
image->cardMemory = 0;
|
image->cardMemory = 0;
|
||||||
|
|
||||||
Game::Image_LoadFromFileWithReader(image, (Game::Reader_t)0x46CBF0);
|
image->texture = builder->GetAllocator()->AllocateArray<Game::GfxImageLoadDef>();
|
||||||
|
if (!image->texture)
|
||||||
// Free our image when done building zone
|
|
||||||
builder->GetAllocator()->Reference(image, [] (void*data)
|
|
||||||
{
|
{
|
||||||
Game::Image_Release((Game::GfxImage*)data);
|
Components::Logger::Error("Failed to allocate GfxImageLoadDef structure!");
|
||||||
});
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Components::FileSystem::File iwi(Utils::VA("images/%s.iwi", name.data()));
|
||||||
|
|
||||||
|
if (!iwi.Exists())
|
||||||
|
{
|
||||||
|
Components::Logger::Error("Loading image '%s' failed!", iwi.GetName());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Game::GfxImageFileHeader* iwiHeader = reinterpret_cast<const Game::GfxImageFileHeader*>(iwi.GetBuffer().data());
|
||||||
|
|
||||||
|
image->mapType = 3;
|
||||||
|
image->dataLen1 = iwiHeader->fileSizeForPicmip[0] - 32;
|
||||||
|
image->dataLen2 = iwiHeader->fileSizeForPicmip[0] - 32;
|
||||||
|
|
||||||
|
// TODO: Check tag
|
||||||
|
image->texture->dimensions[0] = iwiHeader->dimensions[0]; // Width
|
||||||
|
image->texture->dimensions[1] = iwiHeader->dimensions[1]; // Height
|
||||||
|
image->texture->dimensions[2] = iwiHeader->dimensions[2]; // Depth
|
||||||
|
image->texture->flags = 0;//iwiHeader->flags;
|
||||||
|
image->texture->mipLevels = 0;
|
||||||
|
|
||||||
|
switch (iwiHeader->format)
|
||||||
|
{
|
||||||
|
case Game::IWI_COMPRESSION::IWI_ARGB:
|
||||||
|
image->texture->format = 21;
|
||||||
|
break;
|
||||||
|
case Game::IWI_COMPRESSION::IWI_RGB8:
|
||||||
|
image->texture->format = 20;
|
||||||
|
break;
|
||||||
|
case Game::IWI_COMPRESSION::IWI_DXT1:
|
||||||
|
image->texture->format = 0x31545844;
|
||||||
|
break;
|
||||||
|
case Game::IWI_COMPRESSION::IWI_DXT3:
|
||||||
|
image->texture->format = 0x33545844;
|
||||||
|
break;
|
||||||
|
case Game::IWI_COMPRESSION::IWI_DXT5:
|
||||||
|
image->texture->format = 0x35545844;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Components::AssetHandler::StoreTemporaryAsset(Game::XAssetType::ASSET_TYPE_IMAGE, { image });
|
||||||
header->image = image;
|
header->image = image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,6 +66,7 @@ namespace Assets
|
|||||||
Game::MaterialTextureDef textureDef;
|
Game::MaterialTextureDef textureDef;
|
||||||
|
|
||||||
textureDef.semantic = 0; // No water image
|
textureDef.semantic = 0; // No water image
|
||||||
|
textureDef.sampleState = -30;
|
||||||
textureDef.nameEnd = map.string_value().data()[map.string_value().size() - 1];
|
textureDef.nameEnd = map.string_value().data()[map.string_value().size() - 1];
|
||||||
textureDef.nameStart = map.string_value().data()[0];
|
textureDef.nameStart = map.string_value().data()[0];
|
||||||
textureDef.nameHash = Game::R_HashString(map.string_value().data());
|
textureDef.nameHash = Game::R_HashString(map.string_value().data());
|
||||||
@ -97,6 +98,7 @@ namespace Assets
|
|||||||
material->textureCount = (char)textureList.size() & 0xFF;
|
material->textureCount = (char)textureList.size() & 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Components::AssetHandler::StoreTemporaryAsset(Game::XAssetType::ASSET_TYPE_MATERIAL, { material });
|
||||||
header->material = material;
|
header->material = material;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ namespace Components
|
|||||||
|
|
||||||
ZoneBuilder::Zone::~Zone()
|
ZoneBuilder::Zone::~Zone()
|
||||||
{
|
{
|
||||||
|
AssetHandler::ClearTemporaryAssets();
|
||||||
Localization::ClearTemp();
|
Localization::ClearTemp();
|
||||||
|
|
||||||
ZoneBuilder::Zone::LoadedAssets.clear();
|
ZoneBuilder::Zone::LoadedAssets.clear();
|
||||||
@ -448,6 +449,9 @@ namespace Components
|
|||||||
// Prevent destroying textures
|
// Prevent destroying textures
|
||||||
Utils::Hook::Set<BYTE>(0x51F03D, 0xEB);
|
Utils::Hook::Set<BYTE>(0x51F03D, 0xEB);
|
||||||
|
|
||||||
|
// Don't create default assets
|
||||||
|
Utils::Hook::Set<BYTE>(0x407BAA, 0xEB);
|
||||||
|
|
||||||
Command::Add("buildzone", [] (Command::Params params)
|
Command::Add("buildzone", [] (Command::Params params)
|
||||||
{
|
{
|
||||||
if (params.Length() < 2) return;
|
if (params.Length() < 2) return;
|
||||||
|
@ -168,6 +168,25 @@ namespace Game
|
|||||||
struct menuDef_t;
|
struct menuDef_t;
|
||||||
enum operationEnum;
|
enum operationEnum;
|
||||||
|
|
||||||
|
enum IWI_COMPRESSION
|
||||||
|
{
|
||||||
|
IWI_INVALID = 0x0,
|
||||||
|
IWI_ARGB = 0x1,
|
||||||
|
IWI_RGB8 = 0x2,
|
||||||
|
IWI_DXT1 = 0xB,
|
||||||
|
IWI_DXT3 = 0xC,
|
||||||
|
IWI_DXT5 = 0xD,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GfxImageFileHeader
|
||||||
|
{
|
||||||
|
char tag[3];
|
||||||
|
char version;
|
||||||
|
int flags;
|
||||||
|
char format;
|
||||||
|
short dimensions[3];
|
||||||
|
int fileSizeForPicmip[4];
|
||||||
|
};
|
||||||
|
|
||||||
struct GfxImageLoadDef // actually a IDirect3DTexture* but this is easier
|
struct GfxImageLoadDef // actually a IDirect3DTexture* but this is easier
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user