Add material export.

This commit is contained in:
Maurice Heumann 2015-05-14 00:18:07 +02:00
parent 86f3a2d9e7
commit fcc2875c79
2 changed files with 66 additions and 2 deletions

View File

@ -5,7 +5,7 @@ void XModelExport(const char* name);
void DumpStuff() void DumpStuff()
{ {
XModelExport("t5_weapon_ak74u_viewmodel"); XModelExport("t5_weapon_ak74u_viewmodel");
XModelExport("t5_weapon_galil_viewmodel"); //XModelExport("t5_weapon_galil_viewmodel");
} }
void RunStuff() void RunStuff()

View File

@ -2,6 +2,66 @@
Stream* Buffer = 0; Stream* Buffer = 0;
void fwritestr(FILE* file, const char* str)
{
while (*str)
{
fwrite(str, 1, 1, file);
str++;
}
// Not needed here
//fwrite(str, 1, 1, file);
}
void Write_TextureMaps(Material* material, FILE* fp, const char* map)
{
char first = *map;
char last = map[strlen(map) - 1];
int count = -1;
for (char i = 0; i < material->textureCount; i++)
{
if (material->textureTable[i].nameStart == first && material->textureTable[i].nameEnd == last)
{
count++;
fwritestr(fp, map);
fwritestr(fp, " ");
fwritestr(fp, material->textureTable[i].u.image->name);
fwritestr(fp, "\n");
}
}
}
void Material_Export(Material* material)
{
_mkdir("raw");
_mkdir("raw/material");
_mkdir("raw/material/mc"); // We'll most likely need that directory
std::string _name = "raw/material/";
_name += material->info.name;
_name += ".txt";
FILE* fp = fopen(_name.c_str(), "wb");
if (fp)
{
fwritestr(fp, "baseMat mc/mtl_t6_wpn_smg_peacekeeper\n"); // Use peacekeeper as base material for now
Write_TextureMaps(material, fp, "colorMap");
Write_TextureMaps(material, fp, "normalMap");
Write_TextureMaps(material, fp, "specularMap");
Write_TextureMaps(material, fp, "detailMap");
Com_Printf(0, "File '%s' written\n", _name.c_str());
}
else
{
Com_Printf(0, "Unable to write file '%s'\n", _name.c_str());
}
}
// Stuff copied from T6, might be missing some data, but who cares :P // Stuff copied from T6, might be missing some data, but who cares :P
void Write_XSurfaceVertexInfo(XSurfaceVertexInfo* vertInfo, XSurfaceVertexInfo* destVertInfo) void Write_XSurfaceVertexInfo(XSurfaceVertexInfo* vertInfo, XSurfaceVertexInfo* destVertInfo)
@ -268,6 +328,7 @@ void Write(XModel* Asset)
for (char i = 0; i < Asset->numsurfs; i++) for (char i = 0; i < Asset->numsurfs; i++)
{ {
Material_Export(Asset->materialHandles[i]);
Buffer->WriteString(Asset->materialHandles[i]->info.name); Buffer->WriteString(Asset->materialHandles[i]->info.name);
} }
@ -309,6 +370,7 @@ void Write(XModel* Asset)
} }
} }
void XModelExport(const char* name) void XModelExport(const char* name)
{ {
XModel* model = (XModel*)DB_FindXAssetHeader(ASSET_TYPE_XMODEL, name, true, -1); XModel* model = (XModel*)DB_FindXAssetHeader(ASSET_TYPE_XMODEL, name, true, -1);
@ -321,13 +383,15 @@ void XModelExport(const char* name)
Write(model); Write(model);
_mkdir("raw"); _mkdir("raw");
std::string _name = "raw/"; _mkdir("raw/xmodel");
std::string _name = "raw/xmodel/";
_name += name; _name += name;
FILE* fp = fopen(_name.c_str(), "wb"); FILE* fp = fopen(_name.c_str(), "wb");
if (fp) if (fp)
{ {
fwrite("RXME", 4, 1, fp); // Magic: Redacted XModel Export.
fwrite(_Buffer.Data(), _Buffer.Size(), 1, fp); fwrite(_Buffer.Data(), _Buffer.Size(), 1, fp);
fclose(fp); fclose(fp);
Com_Printf(0, "File '%s' written\n", _name.c_str()); Com_Printf(0, "File '%s' written\n", _name.c_str());