Make asset dumpers not provide different implementations for dumping to gdt and raw so any dumper can decide itself how many raw files and gdt entries it wants to make use of

This commit is contained in:
Jan
2021-07-31 12:34:22 +02:00
parent e544d043bd
commit e324c20641
79 changed files with 667 additions and 979 deletions

View File

@ -2,10 +2,6 @@
#include "IAssetDumper.h"
#include <fstream>
#include <filesystem>
#include <iostream>
template<class T>
class AbstractAssetDumper : public IAssetDumper<T>
{
@ -15,77 +11,19 @@ protected:
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();
}
virtual void DumpAsset(AssetDumpingContext& context, XAssetInfo<T>* asset) = 0;
public:
void DumpPool(AssetDumpingContext& context, AssetPool<T>* pool) override
{
if(context.m_gdt && CanDumpAsGdtEntry())
for (auto assetInfo : *pool)
{
for (auto assetInfo : *pool)
if (assetInfo->m_name[0] == ',' || !ShouldDump(assetInfo))
{
if (assetInfo->m_name[0] == ','
|| !ShouldDump(assetInfo))
{
continue;
}
auto entry = DumpGdtEntry(context, assetInfo);
context.m_gdt->WriteEntry(entry);
continue;
}
}
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";
}
}
DumpAsset(context, assetInfo);
}
}
};

View File

@ -1,6 +1,29 @@
#include "AssetDumpingContext.h"
#include <filesystem>
#include <fstream>
AssetDumpingContext::AssetDumpingContext()
: m_zone(nullptr)
{
}
std::unique_ptr<std::ostream> AssetDumpingContext::OpenAssetFile(const std::string& fileName) const
{
std::filesystem::path assetFilePath(m_base_path);
assetFilePath.append(fileName);
auto assetFileFolder(assetFilePath);
assetFileFolder.replace_filename("");
create_directories(assetFileFolder);
auto file = std::make_unique<std::ofstream>(assetFilePath, std::fstream::out | std::fstream::binary);
if (!file->is_open())
{
std::cout << "Failed to open file '" << assetFilePath.string() << "' to dump asset '" << fileName << "'\n";
return nullptr;
}
return std::move(file);
}

View File

@ -1,7 +1,10 @@
#pragma once
#include <string>
#include <ostream>
#include <memory>
#include "Utils/ClassUtils.h"
#include "Obj/Gdt/GdtStream.h"
#include "Zone/Zone.h"
@ -13,4 +16,6 @@ public:
std::unique_ptr<GdtOutputStream> m_gdt;
AssetDumpingContext();
_NODISCARD std::unique_ptr<std::ostream> OpenAssetFile(const std::string& fileName) const;
};