mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-06-10 23:08:05 -05:00
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:
@ -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);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
Reference in New Issue
Block a user