mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-06-10 23:08:05 -05:00
Make dumpers works as gdt dumpers and raw dumpers
This commit is contained in:
91
src/ObjWriting/Dumping/AbstractAssetDumper.h
Normal file
91
src/ObjWriting/Dumping/AbstractAssetDumper.h
Normal file
@ -0,0 +1,91 @@
|
||||
#pragma once
|
||||
|
||||
#include "IAssetDumper.h"
|
||||
|
||||
#include <fstream>
|
||||
#include <filesystem>
|
||||
#include <iostream>
|
||||
|
||||
template<class T>
|
||||
class AbstractAssetDumper : public IAssetDumper<T>
|
||||
{
|
||||
protected:
|
||||
virtual bool ShouldDump(XAssetInfo<T>* asset)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool CanDumpAsRaw()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual bool CanDumpAsGdtEntry()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual std::string GetFileNameForAsset(Zone* zone, XAssetInfo<T>* asset)
|
||||
{
|
||||
return asset->m_name;
|
||||
}
|
||||
|
||||
virtual void DumpRaw(AssetDumpingContext& context, XAssetInfo<T>* asset, std::ostream& stream)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
virtual GdtEntry DumpGdtEntry(AssetDumpingContext& context, XAssetInfo<T>* asset)
|
||||
{
|
||||
return GdtEntry();
|
||||
}
|
||||
|
||||
public:
|
||||
void DumpPool(AssetDumpingContext& context, AssetPool<T>* pool) override
|
||||
{
|
||||
if(context.m_gdt && CanDumpAsGdtEntry())
|
||||
{
|
||||
for (auto assetInfo : *pool)
|
||||
{
|
||||
if (assetInfo->m_name[0] == ','
|
||||
|| !ShouldDump(assetInfo))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
auto entry = DumpGdtEntry(context, assetInfo);
|
||||
context.m_gdt->WriteEntry(entry);
|
||||
}
|
||||
}
|
||||
else if(CanDumpAsRaw())
|
||||
{
|
||||
for (auto assetInfo : *pool)
|
||||
{
|
||||
if (assetInfo->m_name[0] == ','
|
||||
|| !ShouldDump(assetInfo))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
std::filesystem::path assetFilePath(context.m_base_path);
|
||||
assetFilePath.append(GetFileNameForAsset(context.m_zone, assetInfo));
|
||||
|
||||
auto assetFileFolder(assetFilePath);
|
||||
assetFileFolder.replace_filename("");
|
||||
create_directories(assetFileFolder);
|
||||
|
||||
std::ofstream file(assetFilePath, std::fstream::out | std::fstream::binary);
|
||||
if (file.is_open())
|
||||
{
|
||||
DumpRaw(context, assetInfo, file);
|
||||
|
||||
file.close();
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Failed to open file '" << assetFilePath.string() << "' to dump asset '" << assetInfo->m_name.c_str() << "'\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
@ -1,48 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "IAssetDumper.h"
|
||||
|
||||
#include <fstream>
|
||||
#include <filesystem>
|
||||
#include <iostream>
|
||||
|
||||
template<class T>
|
||||
class AbstractFileDumper : public IAssetDumper<T>
|
||||
{
|
||||
protected:
|
||||
virtual bool ShouldDump(XAssetInfo<T>* asset) = 0;
|
||||
virtual std::string GetFileNameForAsset(Zone* zone, XAssetInfo<T>* asset) = 0;
|
||||
virtual void DumpAsset(AssetDumpingContext& context, XAssetInfo<T>* asset, std::ostream& stream) = 0;
|
||||
|
||||
public:
|
||||
void DumpPool(AssetDumpingContext& context, AssetPool<T>* pool) override
|
||||
{
|
||||
for(auto assetInfo : *pool)
|
||||
{
|
||||
if(assetInfo->m_name[0] == ','
|
||||
|| !ShouldDump(assetInfo))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
std::filesystem::path assetFilePath(context.m_base_path);
|
||||
assetFilePath.append(GetFileNameForAsset(context.m_zone, assetInfo));
|
||||
|
||||
auto assetFileFolder(assetFilePath);
|
||||
assetFileFolder.replace_filename("");
|
||||
create_directories(assetFileFolder);
|
||||
|
||||
std::ofstream file(assetFilePath, std::fstream::out | std::fstream::binary);
|
||||
if(file.is_open())
|
||||
{
|
||||
DumpAsset(context, assetInfo, file);
|
||||
|
||||
file.close();
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Failed to open file '" << assetFilePath.string() << "' to dump asset '" << assetInfo->m_name.c_str() << "'\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
Reference in New Issue
Block a user