Build materials.
This commit is contained in:
parent
7e8663604b
commit
ac4548f4c2
@ -207,7 +207,13 @@ namespace Components
|
|||||||
|
|
||||||
// Register asset interfaces
|
// Register asset interfaces
|
||||||
AssetHandler::RegisterInterface(new Assets::IRawFile());
|
AssetHandler::RegisterInterface(new Assets::IRawFile());
|
||||||
|
AssetHandler::RegisterInterface(new Assets::IGfxImage());
|
||||||
|
AssetHandler::RegisterInterface(new Assets::IMaterial());
|
||||||
AssetHandler::RegisterInterface(new Assets::ILocalizedEntry());
|
AssetHandler::RegisterInterface(new Assets::ILocalizedEntry());
|
||||||
|
AssetHandler::RegisterInterface(new Assets::IMaterialPixelShader());
|
||||||
|
AssetHandler::RegisterInterface(new Assets::IMaterialTechniqueSet());
|
||||||
|
AssetHandler::RegisterInterface(new Assets::IMaterialVertexShader());
|
||||||
|
AssetHandler::RegisterInterface(new Assets::IMaterialVertexDeclaration());
|
||||||
}
|
}
|
||||||
|
|
||||||
AssetHandler::~AssetHandler()
|
AssetHandler::~AssetHandler()
|
||||||
|
@ -50,5 +50,13 @@ namespace Components
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define Assert_AssetStruct(x, size) static_assert(sizeof(x) == size, STRINGIZE(x) " structure is invalid.");
|
||||||
|
|
||||||
#include "AssetInterfaces\IRawFile.hpp"
|
#include "AssetInterfaces\IRawFile.hpp"
|
||||||
|
#include "AssetInterfaces\IGfxImage.hpp"
|
||||||
|
#include "AssetInterfaces\IMaterial.hpp"
|
||||||
#include "AssetInterfaces\ILocalizedEntry.hpp"
|
#include "AssetInterfaces\ILocalizedEntry.hpp"
|
||||||
|
#include "AssetInterfaces\IMaterialPixelShader.hpp"
|
||||||
|
#include "AssetInterfaces\IMaterialTechniqueSet.hpp"
|
||||||
|
#include "AssetInterfaces\IMaterialVertexShader.hpp"
|
||||||
|
#include "AssetInterfaces\IMaterialVertexDeclaration.hpp"
|
||||||
|
47
src/Components/Modules/AssetInterfaces/IGfxImage.cpp
Normal file
47
src/Components/Modules/AssetInterfaces/IGfxImage.cpp
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#include <STDInclude.hpp>
|
||||||
|
|
||||||
|
namespace Assets
|
||||||
|
{
|
||||||
|
void IGfxImage::Save_GfxImageLoadDef(Components::ZoneBuilder::Zone* builder, const char* name)
|
||||||
|
{
|
||||||
|
Game::GfxImageLoadDef loadDef;
|
||||||
|
ZeroMemory(&loadDef, sizeof(loadDef));
|
||||||
|
|
||||||
|
Utils::Stream* buffer = builder->GetBuffer();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void IGfxImage::Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
|
||||||
|
{
|
||||||
|
Assert_AssetStruct(Game::GfxImage, 32);
|
||||||
|
|
||||||
|
Utils::Stream* buffer = builder->GetBuffer();
|
||||||
|
Game::GfxImage* asset = header.image;
|
||||||
|
Game::GfxImage* dest = (Game::GfxImage*)buffer->At();
|
||||||
|
buffer->Save(asset, sizeof(Game::GfxImage));
|
||||||
|
|
||||||
|
buffer->PushBlock(Game::XFILE_BLOCK_VIRTUAL);
|
||||||
|
|
||||||
|
if (asset->name)
|
||||||
|
{
|
||||||
|
buffer->SaveString(builder->GetAssetName(this->GetType(), asset->name));
|
||||||
|
dest->name = (char *)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asset->texture)
|
||||||
|
{
|
||||||
|
buffer->Align(Utils::Stream::ALIGN_4);
|
||||||
|
|
||||||
|
Game::GfxImageLoadDef* destTexture = (Game::GfxImageLoadDef*)buffer->At();
|
||||||
|
buffer->Save(asset->texture, 16);
|
||||||
|
|
||||||
|
// Zero the size!
|
||||||
|
destTexture->dataSize = 0;
|
||||||
|
|
||||||
|
dest->texture = (Game::GfxImageLoadDef*)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer->PopBlock();
|
||||||
|
}
|
||||||
|
}
|
12
src/Components/Modules/AssetInterfaces/IGfxImage.hpp
Normal file
12
src/Components/Modules/AssetInterfaces/IGfxImage.hpp
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
namespace Assets
|
||||||
|
{
|
||||||
|
class IGfxImage : public Components::AssetHandler::IAsset
|
||||||
|
{
|
||||||
|
virtual Game::XAssetType GetType() override { return Game::XAssetType::ASSET_TYPE_IMAGE; };
|
||||||
|
|
||||||
|
virtual void Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void Save_GfxImageLoadDef(Components::ZoneBuilder::Zone* builder, const char* name);
|
||||||
|
};
|
||||||
|
}
|
@ -4,6 +4,8 @@ namespace Assets
|
|||||||
{
|
{
|
||||||
void ILocalizedEntry::Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
|
void ILocalizedEntry::Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
|
||||||
{
|
{
|
||||||
|
Assert_AssetStruct(Game::LocalizedEntry, 8);
|
||||||
|
|
||||||
Utils::Stream* buffer = builder->GetBuffer();
|
Utils::Stream* buffer = builder->GetBuffer();
|
||||||
Game::LocalizedEntry* asset = header.localize;
|
Game::LocalizedEntry* asset = header.localize;
|
||||||
Game::LocalizedEntry* dest = (Game::LocalizedEntry*)buffer->At();
|
Game::LocalizedEntry* dest = (Game::LocalizedEntry*)buffer->At();
|
||||||
@ -19,7 +21,7 @@ namespace Assets
|
|||||||
|
|
||||||
if (asset->name)
|
if (asset->name)
|
||||||
{
|
{
|
||||||
buffer->SaveString(asset->name);
|
buffer->SaveString(builder->GetAssetName(this->GetType(), asset->name));
|
||||||
dest->name = (char *)-1;
|
dest->name = (char *)-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
133
src/Components/Modules/AssetInterfaces/IMaterial.cpp
Normal file
133
src/Components/Modules/AssetInterfaces/IMaterial.cpp
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
#include <STDInclude.hpp>
|
||||||
|
|
||||||
|
namespace Assets
|
||||||
|
{
|
||||||
|
void IMaterial::Mark(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
|
||||||
|
{
|
||||||
|
Game::Material* asset = header.material;
|
||||||
|
|
||||||
|
if (asset->techniqueSet)
|
||||||
|
{
|
||||||
|
builder->LoadAsset(Game::XAssetType::ASSET_TYPE_TECHSET, asset->techniqueSet->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asset->textureTable)
|
||||||
|
{
|
||||||
|
for (char i = 0; i < asset->textureCount; i++)
|
||||||
|
{
|
||||||
|
if (asset->textureTable[i].info.image)
|
||||||
|
{
|
||||||
|
if (asset->textureTable[i].semantic == SEMANTIC_WATER_MAP)
|
||||||
|
{
|
||||||
|
if (asset->textureTable[i].info.water->image)
|
||||||
|
{
|
||||||
|
builder->LoadAsset(Game::XAssetType::ASSET_TYPE_IMAGE, asset->textureTable[i].info.water->image->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
builder->LoadAsset(Game::XAssetType::ASSET_TYPE_IMAGE, asset->textureTable[i].info.image->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IMaterial::Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
|
||||||
|
{
|
||||||
|
Assert_AssetStruct(Game::Material, 96);
|
||||||
|
|
||||||
|
Utils::Stream* buffer = builder->GetBuffer();
|
||||||
|
Game::Material* asset = header.material;
|
||||||
|
Game::Material* dest = (Game::Material*)buffer->At();
|
||||||
|
buffer->Save(asset, sizeof(Game::Material));
|
||||||
|
|
||||||
|
buffer->PushBlock(Game::XFILE_BLOCK_VIRTUAL);
|
||||||
|
|
||||||
|
if (asset->name)
|
||||||
|
{
|
||||||
|
buffer->SaveString(builder->GetAssetName(this->GetType(), asset->name));
|
||||||
|
dest->name = (char *)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asset->techniqueSet)
|
||||||
|
{
|
||||||
|
dest->techniqueSet = builder->RequireAsset(Game::XAssetType::ASSET_TYPE_TECHSET, asset->techniqueSet->name).materialTechset;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asset->textureTable)
|
||||||
|
{
|
||||||
|
Assert_AssetStruct(Game::MaterialTextureDef, 12);
|
||||||
|
|
||||||
|
buffer->Align(Utils::Stream::ALIGN_4);
|
||||||
|
|
||||||
|
Game::MaterialTextureDef* destTextureTable = (Game::MaterialTextureDef*)buffer->At();
|
||||||
|
buffer->SaveArray(asset->textureTable, asset->textureCount);
|
||||||
|
|
||||||
|
for (char i = 0; i < asset->textureCount; i++)
|
||||||
|
{
|
||||||
|
Game::MaterialTextureDef* destTextureDef = &destTextureTable[i];
|
||||||
|
Game::MaterialTextureDef* textureDef = &asset->textureTable[i];
|
||||||
|
|
||||||
|
if (textureDef->semantic == SEMANTIC_WATER_MAP)
|
||||||
|
{
|
||||||
|
Assert_AssetStruct(Game::water_t, 68);
|
||||||
|
|
||||||
|
Game::water_t* destWater = (Game::water_t*)buffer->At();
|
||||||
|
Game::water_t* water = textureDef->info.water;
|
||||||
|
|
||||||
|
if (water)
|
||||||
|
{
|
||||||
|
buffer->Align(Utils::Stream::ALIGN_4);
|
||||||
|
buffer->Save(water, sizeof(Game::water_t));
|
||||||
|
destTextureDef->info.water = (Game::water_t *)-1;
|
||||||
|
|
||||||
|
// Save_water_t
|
||||||
|
if (water->H0X)
|
||||||
|
{
|
||||||
|
buffer->Align(Utils::Stream::ALIGN_4);
|
||||||
|
buffer->Save(water->H0X, 8, water->M * water->N);
|
||||||
|
destWater->H0X = (float *)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (water->H0Y)
|
||||||
|
{
|
||||||
|
buffer->Align(Utils::Stream::ALIGN_4);
|
||||||
|
buffer->Save(water->H0Y, 4, water->M * water->N);
|
||||||
|
destWater->H0Y = (float *)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (water->image)
|
||||||
|
{
|
||||||
|
destWater->image = builder->RequireAsset(Game::XAssetType::ASSET_TYPE_IMAGE, water->image->name).image;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(textureDef->info.image)
|
||||||
|
{
|
||||||
|
destTextureDef->info.image = builder->RequireAsset(Game::XAssetType::ASSET_TYPE_IMAGE, textureDef->info.image->name).image;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dest->textureTable = (Game::MaterialTextureDef*)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asset->constantTable)
|
||||||
|
{
|
||||||
|
Assert_AssetStruct(Game::MaterialConstantDef, 32);
|
||||||
|
|
||||||
|
buffer->Align(Utils::Stream::ALIGN_16);
|
||||||
|
buffer->SaveArray(asset->constantTable, asset->constantCount);
|
||||||
|
dest->constantTable = (Game::MaterialConstantDef *)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asset->stateBitTable)
|
||||||
|
{
|
||||||
|
buffer->Align(Utils::Stream::ALIGN_4);
|
||||||
|
buffer->Save(asset->stateBitTable, 8, asset->stateBitsCount);
|
||||||
|
dest->stateBitTable = (void *)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer->PopBlock();
|
||||||
|
}
|
||||||
|
}
|
10
src/Components/Modules/AssetInterfaces/IMaterial.hpp
Normal file
10
src/Components/Modules/AssetInterfaces/IMaterial.hpp
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
namespace Assets
|
||||||
|
{
|
||||||
|
class IMaterial : public Components::AssetHandler::IAsset
|
||||||
|
{
|
||||||
|
virtual Game::XAssetType GetType() override { return Game::XAssetType::ASSET_TYPE_MATERIAL; };
|
||||||
|
|
||||||
|
virtual void Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder) override;
|
||||||
|
virtual void Mark(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder) override;
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
#include <STDInclude.hpp>
|
||||||
|
|
||||||
|
namespace Assets
|
||||||
|
{
|
||||||
|
void IMaterialPixelShader::Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
|
||||||
|
{
|
||||||
|
Assert_AssetStruct(Game::MaterialPixelShader, 16);
|
||||||
|
|
||||||
|
Utils::Stream* buffer = builder->GetBuffer();
|
||||||
|
Game::MaterialPixelShader* asset = header.pixelShader;
|
||||||
|
Game::MaterialPixelShader* dest = (Game::MaterialPixelShader*)buffer->At();
|
||||||
|
buffer->Save(asset, sizeof(Game::MaterialPixelShader));
|
||||||
|
|
||||||
|
buffer->PushBlock(Game::XFILE_BLOCK_VIRTUAL);
|
||||||
|
|
||||||
|
if (asset->name)
|
||||||
|
{
|
||||||
|
buffer->SaveString(builder->GetAssetName(this->GetType(), asset->name));
|
||||||
|
dest->name = (char *)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asset->loadDef.physicalPart)
|
||||||
|
{
|
||||||
|
buffer->Align(Utils::Stream::ALIGN_4);
|
||||||
|
buffer->Save(asset->loadDef.physicalPart, 4, asset->loadDef.cachedPartSize & 0xFFFF);
|
||||||
|
dest->loadDef.physicalPart = (char*)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer->PopBlock();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
namespace Assets
|
||||||
|
{
|
||||||
|
class IMaterialPixelShader : public Components::AssetHandler::IAsset
|
||||||
|
{
|
||||||
|
virtual Game::XAssetType GetType() override { return Game::XAssetType::ASSET_TYPE_PIXELSHADER; };
|
||||||
|
|
||||||
|
virtual void Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder) override;
|
||||||
|
};
|
||||||
|
}
|
118
src/Components/Modules/AssetInterfaces/IMaterialTechniqueSet.cpp
Normal file
118
src/Components/Modules/AssetInterfaces/IMaterialTechniqueSet.cpp
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
#include <STDInclude.hpp>
|
||||||
|
|
||||||
|
namespace Assets
|
||||||
|
{
|
||||||
|
void IMaterialTechniqueSet::Mark(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
|
||||||
|
{
|
||||||
|
Game::MaterialTechniqueSet* asset = header.materialTechset;
|
||||||
|
|
||||||
|
for (int i = 0; i < ARR_SIZE(Game::MaterialTechniqueSet::techniques); i++)
|
||||||
|
{
|
||||||
|
Game::MaterialTechnique* technique = asset->techniques[i];
|
||||||
|
|
||||||
|
if (!technique) continue;
|
||||||
|
|
||||||
|
for (short i = 0; i < technique->numPasses; i++)
|
||||||
|
{
|
||||||
|
Game::MaterialPass* pass = &technique->passes[i];
|
||||||
|
|
||||||
|
if (pass->vertexDecl)
|
||||||
|
{
|
||||||
|
builder->LoadAsset(Game::XAssetType::ASSET_TYPE_VERTEXDECL, pass->vertexDecl->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pass->vertexShader)
|
||||||
|
{
|
||||||
|
builder->LoadAsset(Game::XAssetType::ASSET_TYPE_VERTEXSHADER, pass->vertexShader->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pass->pixelShader)
|
||||||
|
{
|
||||||
|
builder->LoadAsset(Game::XAssetType::ASSET_TYPE_PIXELSHADER, pass->pixelShader->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IMaterialTechniqueSet::Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
|
||||||
|
{
|
||||||
|
Assert_AssetStruct(Game::MaterialTechniqueSet, 204);
|
||||||
|
|
||||||
|
Utils::Stream* buffer = builder->GetBuffer();
|
||||||
|
Game::MaterialTechniqueSet* asset = header.materialTechset;
|
||||||
|
Game::MaterialTechniqueSet* dest = (Game::MaterialTechniqueSet*)buffer->At();
|
||||||
|
buffer->Save(asset, sizeof(Game::MaterialTechniqueSet));
|
||||||
|
|
||||||
|
buffer->PushBlock(Game::XFILE_BLOCK_VIRTUAL);
|
||||||
|
|
||||||
|
if (asset->name)
|
||||||
|
{
|
||||||
|
buffer->SaveString(builder->GetAssetName(this->GetType(), asset->name));
|
||||||
|
dest->name = (char *)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save_MaterialTechniquePtrArray
|
||||||
|
static_assert(ARR_SIZE(Game::MaterialTechniqueSet::techniques) == 48, "Techniques array invalid!");
|
||||||
|
|
||||||
|
for (int i = 0; i < ARR_SIZE(Game::MaterialTechniqueSet::techniques); i++)
|
||||||
|
{
|
||||||
|
Game::MaterialTechnique* technique = asset->techniques[i];
|
||||||
|
|
||||||
|
if (technique)
|
||||||
|
{
|
||||||
|
// Size-check is obsolete, as the structure is dynamic
|
||||||
|
buffer->Align(Utils::Stream::ALIGN_4);
|
||||||
|
|
||||||
|
Game::MaterialTechnique* destTechnique = (Game::MaterialTechnique*)buffer->At();
|
||||||
|
buffer->Save(technique, 8);
|
||||||
|
dest->techniques[i] = (Game::MaterialTechnique*) - 1;
|
||||||
|
|
||||||
|
// Save_MaterialPassArray
|
||||||
|
for (short i = 0; i < technique->numPasses; i++)
|
||||||
|
{
|
||||||
|
Assert_AssetStruct(Game::MaterialPass, 20);
|
||||||
|
|
||||||
|
Game::MaterialPass* destPass = (Game::MaterialPass*)buffer->At();
|
||||||
|
Game::MaterialPass* pass = &technique->passes[i];
|
||||||
|
buffer->Save(pass, sizeof(Game::MaterialPass));
|
||||||
|
|
||||||
|
if (pass->vertexDecl)
|
||||||
|
{
|
||||||
|
destPass->vertexDecl = builder->RequireAsset(Game::XAssetType::ASSET_TYPE_VERTEXDECL, pass->vertexDecl->name).vertexDecl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pass->vertexShader)
|
||||||
|
{
|
||||||
|
destPass->vertexShader = builder->RequireAsset(Game::XAssetType::ASSET_TYPE_VERTEXSHADER, pass->vertexShader->name).vertexShader;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pass->pixelShader)
|
||||||
|
{
|
||||||
|
destPass->pixelShader = builder->RequireAsset(Game::XAssetType::ASSET_TYPE_PIXELSHADER, pass->pixelShader->name).pixelShader;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pass->argumentDef)
|
||||||
|
{
|
||||||
|
buffer->Align(Utils::Stream::ALIGN_4);
|
||||||
|
buffer->SaveArray(pass->argumentDef, pass->argCount1 + pass->argCount2 + pass->argCount3);
|
||||||
|
destPass->argumentDef = (Game::ShaderArgumentDef*)-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We absolutely have to write something here!
|
||||||
|
if (technique->name)
|
||||||
|
{
|
||||||
|
buffer->SaveString(technique->name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buffer->SaveString("");
|
||||||
|
}
|
||||||
|
|
||||||
|
destTechnique->name = (char*)-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer->PopBlock();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
namespace Assets
|
||||||
|
{
|
||||||
|
class IMaterialTechniqueSet : public Components::AssetHandler::IAsset
|
||||||
|
{
|
||||||
|
virtual Game::XAssetType GetType() override { return Game::XAssetType::ASSET_TYPE_TECHSET; };
|
||||||
|
|
||||||
|
virtual void Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder) override;
|
||||||
|
virtual void Mark(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder) override;
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
#include <STDInclude.hpp>
|
||||||
|
|
||||||
|
namespace Assets
|
||||||
|
{
|
||||||
|
void IMaterialVertexDeclaration::Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
|
||||||
|
{
|
||||||
|
Assert_AssetStruct(Game::MaterialVertexDeclaration, 100);
|
||||||
|
|
||||||
|
Utils::Stream* buffer = builder->GetBuffer();
|
||||||
|
Game::MaterialVertexDeclaration* asset = header.vertexDecl;
|
||||||
|
Game::MaterialVertexDeclaration* dest = (Game::MaterialVertexDeclaration*)buffer->At();
|
||||||
|
buffer->Save(asset, sizeof(Game::MaterialVertexDeclaration));
|
||||||
|
|
||||||
|
buffer->PushBlock(Game::XFILE_BLOCK_VIRTUAL);
|
||||||
|
|
||||||
|
if (asset->name)
|
||||||
|
{
|
||||||
|
buffer->SaveString(builder->GetAssetName(this->GetType(), asset->name));
|
||||||
|
dest->name = (char *)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer->PopBlock();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
namespace Assets
|
||||||
|
{
|
||||||
|
class IMaterialVertexDeclaration : public Components::AssetHandler::IAsset
|
||||||
|
{
|
||||||
|
virtual Game::XAssetType GetType() override { return Game::XAssetType::ASSET_TYPE_VERTEXDECL; };
|
||||||
|
|
||||||
|
virtual void Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder) override;
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
#include <STDInclude.hpp>
|
||||||
|
|
||||||
|
namespace Assets
|
||||||
|
{
|
||||||
|
void IMaterialVertexShader::Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
|
||||||
|
{
|
||||||
|
Assert_AssetStruct(Game::MaterialVertexShader, 16);
|
||||||
|
|
||||||
|
Utils::Stream* buffer = builder->GetBuffer();
|
||||||
|
Game::MaterialVertexShader* asset = header.vertexShader;
|
||||||
|
Game::MaterialVertexShader* dest = (Game::MaterialVertexShader*)buffer->At();
|
||||||
|
buffer->Save(asset, sizeof(Game::MaterialVertexShader));
|
||||||
|
|
||||||
|
buffer->PushBlock(Game::XFILE_BLOCK_VIRTUAL);
|
||||||
|
|
||||||
|
if (asset->name)
|
||||||
|
{
|
||||||
|
buffer->SaveString(builder->GetAssetName(this->GetType(), asset->name));
|
||||||
|
dest->name = (char *)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asset->loadDef.physicalPart)
|
||||||
|
{
|
||||||
|
buffer->Align(Utils::Stream::ALIGN_4);
|
||||||
|
buffer->Save(asset->loadDef.physicalPart, 4, asset->loadDef.cachedPartSize & 0xFFFF);
|
||||||
|
dest->loadDef.physicalPart = (char*)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer->PopBlock();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
namespace Assets
|
||||||
|
{
|
||||||
|
class IMaterialVertexShader : public Components::AssetHandler::IAsset
|
||||||
|
{
|
||||||
|
virtual Game::XAssetType GetType() override { return Game::XAssetType::ASSET_TYPE_VERTEXSHADER; };
|
||||||
|
|
||||||
|
virtual void Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder) override;
|
||||||
|
};
|
||||||
|
}
|
@ -4,6 +4,8 @@ namespace Assets
|
|||||||
{
|
{
|
||||||
void IRawFile::Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
|
void IRawFile::Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
|
||||||
{
|
{
|
||||||
|
Assert_AssetStruct(Game::RawFile, 16);
|
||||||
|
|
||||||
Utils::Stream* buffer = builder->GetBuffer();
|
Utils::Stream* buffer = builder->GetBuffer();
|
||||||
Game::RawFile* asset = header.rawfile;
|
Game::RawFile* asset = header.rawfile;
|
||||||
Game::RawFile* dest = (Game::RawFile*)buffer->At();
|
Game::RawFile* dest = (Game::RawFile*)buffer->At();
|
||||||
@ -13,7 +15,7 @@ namespace Assets
|
|||||||
|
|
||||||
if (asset->name)
|
if (asset->name)
|
||||||
{
|
{
|
||||||
buffer->SaveString(asset->name);
|
buffer->SaveString(builder->GetAssetName(this->GetType(), asset->name));
|
||||||
dest->name = (char *)-1;
|
dest->name = (char *)-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ namespace Components
|
|||||||
{
|
{
|
||||||
Localization::ClearTemp();
|
Localization::ClearTemp();
|
||||||
|
|
||||||
ZoneBuilder::Zone::Assets.clear();
|
ZoneBuilder::Zone::LoadedAssets.clear();
|
||||||
ZoneBuilder::Zone::ScriptStrings.clear();
|
ZoneBuilder::Zone::ScriptStrings.clear();
|
||||||
ZoneBuilder::Zone::ScriptStringMap.clear();
|
ZoneBuilder::Zone::ScriptStringMap.clear();
|
||||||
}
|
}
|
||||||
@ -133,15 +133,15 @@ namespace Components
|
|||||||
// Handle script strings and referenced assets
|
// Handle script strings and referenced assets
|
||||||
AssetHandler::ZoneMark(asset, this);
|
AssetHandler::ZoneMark(asset, this);
|
||||||
|
|
||||||
ZoneBuilder::Zone::Assets.push_back(asset);
|
ZoneBuilder::Zone::LoadedAssets.push_back(asset);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZoneBuilder::Zone::FindAsset(Game::XAssetType type, const char* name)
|
int ZoneBuilder::Zone::FindAsset(Game::XAssetType type, const char* name)
|
||||||
{
|
{
|
||||||
for (unsigned int i = 0; i < ZoneBuilder::Zone::Assets.size(); i++)
|
for (unsigned int i = 0; i < ZoneBuilder::Zone::LoadedAssets.size(); i++)
|
||||||
{
|
{
|
||||||
Game::XAsset* asset = &ZoneBuilder::Zone::Assets[i];
|
Game::XAsset* asset = &ZoneBuilder::Zone::LoadedAssets[i];
|
||||||
|
|
||||||
if (asset->type != type) continue;
|
if (asset->type != type) continue;
|
||||||
|
|
||||||
@ -158,9 +158,9 @@ namespace Components
|
|||||||
|
|
||||||
Game::XAsset* ZoneBuilder::Zone::GetAsset(int index)
|
Game::XAsset* ZoneBuilder::Zone::GetAsset(int index)
|
||||||
{
|
{
|
||||||
if ((uint32_t)index < ZoneBuilder::Zone::Assets.size())
|
if ((uint32_t)index < ZoneBuilder::Zone::LoadedAssets.size())
|
||||||
{
|
{
|
||||||
return &ZoneBuilder::Zone::Assets[index];
|
return &ZoneBuilder::Zone::LoadedAssets[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -211,14 +211,14 @@ namespace Components
|
|||||||
Utils::WriteFile(outFile, outBuffer);
|
Utils::WriteFile(outFile, outBuffer);
|
||||||
|
|
||||||
Logger::Print("done.\n");
|
Logger::Print("done.\n");
|
||||||
Logger::Print("Zone '%s' written with %d assets\n", outFile.c_str(), ZoneBuilder::Zone::Assets.size());
|
Logger::Print("Zone '%s' written with %d assets\n", outFile.c_str(), ZoneBuilder::Zone::LoadedAssets.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZoneBuilder::Zone::SaveData()
|
void ZoneBuilder::Zone::SaveData()
|
||||||
{
|
{
|
||||||
// Add header
|
// Add header
|
||||||
Game::ZoneHeader zoneHeader = { 0 };
|
Game::ZoneHeader zoneHeader = { 0 };
|
||||||
zoneHeader.assetList.assetCount = Assets.size();
|
zoneHeader.assetList.assetCount = ZoneBuilder::Zone::LoadedAssets.size();
|
||||||
zoneHeader.assetList.assets = (Game::XAsset *)-1;
|
zoneHeader.assetList.assets = (Game::XAsset *)-1;
|
||||||
|
|
||||||
// Increment ScriptStrings count (for empty script string) if available
|
// Increment ScriptStrings count (for empty script string) if available
|
||||||
@ -260,7 +260,7 @@ namespace Components
|
|||||||
ZoneBuilder::Zone::IndexStart = ZoneBuilder::Zone::Buffer.GetBlockSize(Game::XFILE_BLOCK_VIRTUAL); // Mark AssetTable offset
|
ZoneBuilder::Zone::IndexStart = ZoneBuilder::Zone::Buffer.GetBlockSize(Game::XFILE_BLOCK_VIRTUAL); // Mark AssetTable offset
|
||||||
|
|
||||||
// AssetTable
|
// AssetTable
|
||||||
for (auto asset : Assets)
|
for (auto asset : ZoneBuilder::Zone::LoadedAssets)
|
||||||
{
|
{
|
||||||
Game::XAsset entry;
|
Game::XAsset entry;
|
||||||
entry.type = asset.type;
|
entry.type = asset.type;
|
||||||
@ -270,9 +270,10 @@ namespace Components
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Assets
|
// Assets
|
||||||
for (auto asset : Assets)
|
for (auto asset : ZoneBuilder::Zone::LoadedAssets)
|
||||||
{
|
{
|
||||||
ZoneBuilder::Zone::Buffer.PushBlock(Game::XFILE_BLOCK_TEMP);
|
ZoneBuilder::Zone::Buffer.PushBlock(Game::XFILE_BLOCK_TEMP);
|
||||||
|
ZoneBuilder::Zone::Buffer.Align(Utils::Stream::ALIGN_4);
|
||||||
|
|
||||||
AssetHandler::ZoneSave(asset, this);
|
AssetHandler::ZoneSave(asset, this);
|
||||||
|
|
||||||
@ -304,7 +305,7 @@ namespace Components
|
|||||||
|
|
||||||
Game::XAssetHeader header = { &branding };
|
Game::XAssetHeader header = { &branding };
|
||||||
Game::XAsset brandingAsset = { Game::XAssetType::ASSET_TYPE_RAWFILE, header };
|
Game::XAsset brandingAsset = { Game::XAssetType::ASSET_TYPE_RAWFILE, header };
|
||||||
Assets.push_back(brandingAsset);
|
ZoneBuilder::Zone::LoadedAssets.push_back(brandingAsset);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the given pointer has already been mapped
|
// Check if the given pointer has already been mapped
|
||||||
@ -430,9 +431,24 @@ namespace Components
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (ZoneBuilder::IsEnabled())
|
if (ZoneBuilder::IsEnabled())
|
||||||
{
|
{
|
||||||
|
// Prevent loading textures (preserves loaddef)
|
||||||
|
Utils::Hook::Set<BYTE>(0x51F4E0, 0xC3);
|
||||||
|
|
||||||
|
//r_loadForrenderer = 0
|
||||||
|
Utils::Hook::Set<BYTE>(0x519DDF, 0);
|
||||||
|
|
||||||
|
//r_delayloadimage retn
|
||||||
|
Utils::Hook::Set<BYTE>(0x51F450, 0xC3);
|
||||||
|
|
||||||
|
// r_registerDvars hack
|
||||||
|
Utils::Hook::Set<BYTE>(0x51B1CD, 0xC3);
|
||||||
|
|
||||||
|
// Prevent destroying textures
|
||||||
|
Utils::Hook::Set<BYTE>(0x51F03D, 0xEB);
|
||||||
|
|
||||||
Command::Add("build", [] (Command::Params params)
|
Command::Add("build", [] (Command::Params params)
|
||||||
{
|
{
|
||||||
if (params.Length() < 2) return;
|
if (params.Length() < 2) return;
|
||||||
@ -442,8 +458,34 @@ namespace Components
|
|||||||
|
|
||||||
Zone(zoneName).Build();
|
Zone(zoneName).Build();
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
|
Command::Add("listassets", [] (Command::Params params)
|
||||||
|
{
|
||||||
|
if (params.Length() < 2) return;
|
||||||
|
Game::XAssetType type = Game::DB_GetXAssetNameType(params[1]);
|
||||||
|
|
||||||
|
if (type != Game::XAssetType::ASSET_TYPE_INVALID)
|
||||||
|
{
|
||||||
|
Game::DB_EnumXAssets(type, [] (Game::XAssetHeader header, void* data)
|
||||||
|
{
|
||||||
|
Logger::Print("%s\n", Game::DB_GetXAssetNameHandlers[*(Game::XAssetType*)data](&header));
|
||||||
|
}, &type, false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
//else
|
||||||
//Utils::Hook(0x4546DF, TestZoneLoading, HOOK_CALL).Install()->Quick();
|
//Utils::Hook(0x4546DF, TestZoneLoading, HOOK_CALL).Install()->Quick();
|
||||||
|
|
||||||
|
Command::Add("loadzone", [] (Command::Params params)
|
||||||
|
{
|
||||||
|
if (params.Length() < 2) return;
|
||||||
|
|
||||||
|
Game::XZoneInfo info;
|
||||||
|
info.name = params[1];
|
||||||
|
info.allocFlags = 0x01000000;
|
||||||
|
info.freeFlags = 0;
|
||||||
|
|
||||||
|
Game::DB_LoadXAssets(&info, 1, true);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ namespace Components
|
|||||||
std::string ZoneName;
|
std::string ZoneName;
|
||||||
Utils::CSV DataMap;
|
Utils::CSV DataMap;
|
||||||
|
|
||||||
std::vector<Game::XAsset> Assets;
|
std::vector<Game::XAsset> LoadedAssets;
|
||||||
std::vector<std::string> ScriptStrings;
|
std::vector<std::string> ScriptStrings;
|
||||||
std::map<unsigned short, unsigned int> ScriptStringMap;
|
std::map<unsigned short, unsigned int> ScriptStringMap;
|
||||||
std::map<std::string, std::string> RenameMap[Game::XAssetType::ASSET_TYPE_COUNT];
|
std::map<std::string, std::string> RenameMap[Game::XAssetType::ASSET_TYPE_COUNT];
|
||||||
|
@ -19,6 +19,7 @@ namespace Game
|
|||||||
Com_Milliseconds_t Com_Milliseconds = (Com_Milliseconds_t)0x42A660;
|
Com_Milliseconds_t Com_Milliseconds = (Com_Milliseconds_t)0x42A660;
|
||||||
Com_ParseExt_t Com_ParseExt = (Com_ParseExt_t)0x474D60;
|
Com_ParseExt_t Com_ParseExt = (Com_ParseExt_t)0x474D60;
|
||||||
|
|
||||||
|
DB_EnumXAssets_t DB_EnumXAssets = (DB_EnumXAssets_t)0x4B76D0;
|
||||||
DB_FindXAssetHeader_t DB_FindXAssetHeader = (DB_FindXAssetHeader_t)0x407930;
|
DB_FindXAssetHeader_t DB_FindXAssetHeader = (DB_FindXAssetHeader_t)0x407930;
|
||||||
DB_GetXAssetNameHandler_t* DB_GetXAssetNameHandlers = (DB_GetXAssetNameHandler_t*)0x799328;
|
DB_GetXAssetNameHandler_t* DB_GetXAssetNameHandlers = (DB_GetXAssetNameHandler_t*)0x799328;
|
||||||
DB_GetXAssetSizeHandler_t* DB_GetXAssetSizeHandlers = (DB_GetXAssetSizeHandler_t*)0x799488;
|
DB_GetXAssetSizeHandler_t* DB_GetXAssetSizeHandlers = (DB_GetXAssetSizeHandler_t*)0x799488;
|
||||||
|
@ -36,6 +36,9 @@ namespace Game
|
|||||||
typedef char* (__cdecl * Com_ParseExt_t)(const char**);
|
typedef char* (__cdecl * Com_ParseExt_t)(const char**);
|
||||||
extern Com_ParseExt_t Com_ParseExt;
|
extern Com_ParseExt_t Com_ParseExt;
|
||||||
|
|
||||||
|
typedef void(__cdecl * DB_EnumXAssets_t)(XAssetType type, void(*)(XAssetHeader, void *), void* userdata, bool overrides);
|
||||||
|
extern DB_EnumXAssets_t DB_EnumXAssets;
|
||||||
|
|
||||||
typedef XAssetHeader (__cdecl * DB_FindXAssetHeader_t)(XAssetType type, const char* name);
|
typedef XAssetHeader (__cdecl * DB_FindXAssetHeader_t)(XAssetType type, const char* name);
|
||||||
extern DB_FindXAssetHeader_t DB_FindXAssetHeader;
|
extern DB_FindXAssetHeader_t DB_FindXAssetHeader;
|
||||||
|
|
||||||
|
@ -176,7 +176,7 @@ namespace Game
|
|||||||
short dimensions[3];
|
short dimensions[3];
|
||||||
int format; // usually the compression Magic
|
int format; // usually the compression Magic
|
||||||
int dataSize; // set to zero to load from IWD
|
int dataSize; // set to zero to load from IWD
|
||||||
//char * data;
|
char data[1];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GfxImage
|
struct GfxImage
|
||||||
@ -202,7 +202,7 @@ namespace Game
|
|||||||
float floatTime;
|
float floatTime;
|
||||||
float *H0X; // Count = M * N
|
float *H0X; // Count = M * N
|
||||||
float *H0Y; // Count = M * N
|
float *H0Y; // Count = M * N
|
||||||
float *wTerm; // Count = M * N
|
//float *wTerm; // Count = M * N
|
||||||
int M;
|
int M;
|
||||||
int N;
|
int N;
|
||||||
float Lx;
|
float Lx;
|
||||||
@ -215,6 +215,8 @@ namespace Game
|
|||||||
GfxImage *image;
|
GfxImage *image;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define SEMANTIC_WATER_MAP 11
|
||||||
|
|
||||||
union MaterialTextureDefInfo
|
union MaterialTextureDefInfo
|
||||||
{
|
{
|
||||||
GfxImage *image; // MaterialTextureDef->semantic != SEMANTIC_WATER_MAP
|
GfxImage *image; // MaterialTextureDef->semantic != SEMANTIC_WATER_MAP
|
||||||
@ -239,7 +241,7 @@ namespace Game
|
|||||||
short more;
|
short more;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct VertexDecl
|
struct MaterialVertexDeclaration
|
||||||
{
|
{
|
||||||
const char* name;
|
const char* name;
|
||||||
int unknown;
|
int unknown;
|
||||||
@ -247,27 +249,39 @@ namespace Game
|
|||||||
/*IDirect3DVertexDeclaration9**/void* declarations[16];
|
/*IDirect3DVertexDeclaration9**/void* declarations[16];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PixelShader
|
struct GfxPixelShaderLoadDef
|
||||||
{
|
{
|
||||||
const char* name;
|
char *cachedPart;
|
||||||
/*IDirect3DPixelShader9*/void* shader;
|
char *physicalPart;
|
||||||
DWORD* bytecode;
|
unsigned __int16 cachedPartSize;
|
||||||
int codeLen;
|
unsigned __int16 physicalPartSize;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct VertexShader
|
struct MaterialPixelShader
|
||||||
{
|
{
|
||||||
const char* name;
|
const char* name;
|
||||||
void * /*IDirect3DVertexShader9**/ shader;
|
GfxPixelShaderLoadDef loadDef;
|
||||||
DWORD* bytecode;
|
};
|
||||||
int codeLen;
|
|
||||||
|
struct GfxVertexShaderLoadDef
|
||||||
|
{
|
||||||
|
char *cachedPart;
|
||||||
|
char *physicalPart;
|
||||||
|
unsigned __int16 cachedPartSize;
|
||||||
|
unsigned __int16 physicalPartSize;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MaterialVertexShader
|
||||||
|
{
|
||||||
|
const char* name;
|
||||||
|
GfxVertexShaderLoadDef loadDef;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MaterialPass
|
struct MaterialPass
|
||||||
{
|
{
|
||||||
VertexDecl* vertexDecl;
|
MaterialVertexDeclaration* vertexDecl;
|
||||||
VertexShader* vertexShader;
|
MaterialVertexShader* vertexShader;
|
||||||
PixelShader* pixelShader;
|
MaterialPixelShader* pixelShader;
|
||||||
char argCount1;
|
char argCount1;
|
||||||
char argCount2;
|
char argCount2;
|
||||||
char argCount3;
|
char argCount3;
|
||||||
@ -1204,7 +1218,12 @@ namespace Game
|
|||||||
StringTable *stringTable;
|
StringTable *stringTable;
|
||||||
MapEnts* mapEnts;
|
MapEnts* mapEnts;
|
||||||
RawFile* rawfile;
|
RawFile* rawfile;
|
||||||
|
GfxImage* image;
|
||||||
Font* font;
|
Font* font;
|
||||||
|
MaterialTechniqueSet *materialTechset;
|
||||||
|
MaterialVertexDeclaration *vertexDecl;
|
||||||
|
MaterialVertexShader *vertexShader;
|
||||||
|
MaterialPixelShader *pixelShader;
|
||||||
structuredDataDef_t* structuredData;
|
structuredDataDef_t* structuredData;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -34,6 +34,10 @@ namespace Utils
|
|||||||
char* Save(const void * _str, size_t size, size_t count = 1);
|
char* Save(const void * _str, size_t size, size_t count = 1);
|
||||||
char* Save(Game::XFILE_BLOCK_TYPES stream, const void * _str, size_t size, size_t count);
|
char* Save(Game::XFILE_BLOCK_TYPES stream, const void * _str, size_t size, size_t count);
|
||||||
char* Save(Game::XFILE_BLOCK_TYPES stream, int value, size_t count);
|
char* Save(Game::XFILE_BLOCK_TYPES stream, int value, size_t count);
|
||||||
|
template <typename T> char* SaveArray(T* array, size_t count)
|
||||||
|
{
|
||||||
|
return Save(array, sizeof(T), count);
|
||||||
|
}
|
||||||
|
|
||||||
char* SaveString(std::string string);
|
char* SaveString(std::string string);
|
||||||
char* SaveString(const char* string);
|
char* SaveString(const char* string);
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#define ARR_SIZE(x) (sizeof(x) / sizeof(x[0]))
|
||||||
|
|
||||||
namespace Utils
|
namespace Utils
|
||||||
{
|
{
|
||||||
const char *VA(const char *fmt, ...);
|
const char *VA(const char *fmt, ...);
|
||||||
|
Loading…
Reference in New Issue
Block a user