2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2026-01-12 11:41:50 +00:00

feat: report on unlinking progress

This commit is contained in:
Jan Laupetin
2025-10-14 23:20:56 +01:00
parent 9fa41ca0d3
commit c6e9cbedda
159 changed files with 686 additions and 802 deletions

View File

@@ -4,25 +4,32 @@
template<class T> class AbstractAssetDumper : public IAssetDumper<T>
{
public:
[[nodiscard]] size_t GetProgressTotalCount(const AssetPool<T>& pool) const override
{
return pool.m_asset_lookup.size();
}
void DumpPool(AssetDumpingContext& context, const AssetPool<T>& pool) override
{
for (const auto* assetInfo : pool)
{
if (assetInfo->m_name[0] == ',' || !ShouldDump(*assetInfo))
{
context.IncrementProgress();
continue;
}
DumpAsset(context, *assetInfo);
context.IncrementProgress();
}
}
protected:
virtual bool ShouldDump(XAssetInfo<T>* asset)
virtual bool ShouldDump(const XAssetInfo<T>& asset)
{
return true;
}
virtual void DumpAsset(AssetDumpingContext& context, XAssetInfo<T>* asset) = 0;
public:
void DumpPool(AssetDumpingContext& context, AssetPool<T>* pool) override
{
for (auto assetInfo : *pool)
{
if (assetInfo->m_name[0] == ',' || !ShouldDump(assetInfo))
{
continue;
}
DumpAsset(context, assetInfo);
}
}
virtual void DumpAsset(AssetDumpingContext& context, const XAssetInfo<T>& asset) = 0;
};

View File

@@ -1,18 +1,43 @@
#include "AssetDumpingContext.h"
#include <filesystem>
#include <format>
#include <fstream>
AssetDumpingContext::AssetDumpingContext(const Zone& zone, const std::string& basePath, IOutputPath& outputPath, ISearchPath& objSearchPath)
AssetDumpingContext::AssetDumpingContext(const Zone& zone,
const std::string& basePath,
IOutputPath& outputPath,
ISearchPath& objSearchPath,
std::optional<std::unique_ptr<ProgressCallback>> progressCallback)
: m_zone(zone),
m_base_path(basePath),
m_output_path(outputPath),
m_obj_search_path(objSearchPath)
m_obj_search_path(objSearchPath),
m_current_progress(0uz),
m_total_progress(0uz)
{
if (progressCallback)
m_progress_callback = *std::move(progressCallback);
}
std::unique_ptr<std::ostream> AssetDumpingContext::OpenAssetFile(const std::string& fileName) const
{
return m_output_path.Open(fileName);
}
void AssetDumpingContext::IncrementProgress()
{
if (m_progress_callback)
{
m_current_progress++;
m_progress_callback->OnProgress(m_current_progress, m_total_progress);
}
}
void AssetDumpingContext::SetTotalProgress(const size_t value)
{
m_total_progress = value;
}
bool AssetDumpingContext::ShouldTrackProgress() const
{
return static_cast<bool>(m_progress_callback);
}

View File

@@ -4,6 +4,7 @@
#include "Obj/Gdt/GdtStream.h"
#include "SearchPath/IOutputPath.h"
#include "SearchPath/ISearchPath.h"
#include "Utils/ProgressCallback.h"
#include "Zone/Zone.h"
#include <memory>
@@ -14,10 +15,18 @@
class AssetDumpingContext
{
public:
AssetDumpingContext(const Zone& zone, const std::string& basePath, IOutputPath& outputPath, ISearchPath& objSearchPath);
AssetDumpingContext(const Zone& zone,
const std::string& basePath,
IOutputPath& outputPath,
ISearchPath& objSearchPath,
std::optional<std::unique_ptr<ProgressCallback>> progressCallback);
[[nodiscard]] std::unique_ptr<std::ostream> OpenAssetFile(const std::string& fileName) const;
void IncrementProgress();
void SetTotalProgress(size_t value);
[[nodiscard]] bool ShouldTrackProgress() const;
template<typename T> T* GetZoneAssetDumperState()
{
static_assert(std::is_base_of_v<IZoneAssetDumperState, T>, "T must inherit IZoneAssetDumperState");
@@ -42,4 +51,7 @@ public:
private:
std::unordered_map<std::type_index, std::unique_ptr<IZoneAssetDumperState>> m_zone_asset_dumper_states;
std::unique_ptr<ProgressCallback> m_progress_callback;
size_t m_current_progress;
size_t m_total_progress;
};

View File

@@ -13,5 +13,6 @@ public:
IAssetDumper& operator=(const IAssetDumper& other) = default;
IAssetDumper& operator=(IAssetDumper&& other) noexcept = default;
virtual void DumpPool(AssetDumpingContext& context, AssetPool<T>* pool) = 0;
[[nodiscard]] virtual size_t GetProgressTotalCount(const AssetPool<T>& pool) const = 0;
virtual void DumpPool(AssetDumpingContext& context, const AssetPool<T>& pool) = 0;
};