2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2026-01-25 17:33:04 +00:00

chore: add possibility to provide loading progress callback when loading zones

This commit is contained in:
Jan Laupetin
2025-10-14 16:48:20 +01:00
parent fa7fd26db6
commit 5b3664ad8c
22 changed files with 451 additions and 246 deletions

View File

@@ -50,7 +50,8 @@ namespace
std::vector<XBlock*>& blocks,
const block_t insertBlock,
ILoadingStream& stream,
MemoryManager& memory)
MemoryManager& memory,
std::optional<std::unique_ptr<ProgressCallback>> progressCallback)
: m_blocks(blocks),
m_stream(stream),
m_memory(memory),
@@ -58,7 +59,11 @@ namespace
m_block_mask((std::numeric_limits<uintptr_t>::max() >> (sizeof(uintptr_t) * 8 - blockBitCount)) << (pointerBitCount - blockBitCount)),
m_block_shift(pointerBitCount - blockBitCount),
m_offset_mask(std::numeric_limits<uintptr_t>::max() >> (sizeof(uintptr_t) * 8 - (pointerBitCount - blockBitCount))),
m_last_fill_size(0)
m_last_fill_size(0),
m_has_progress_callback(progressCallback.has_value()),
m_progress_callback(std::move(progressCallback).value_or(nullptr)),
m_progress_current_size(0uz),
m_progress_total_size(0uz)
{
assert(pointerBitCount % 8u == 0u);
assert(insertBlock < static_cast<block_t>(blocks.size()));
@@ -68,6 +73,8 @@ namespace
std::memset(m_block_offsets.get(), 0, sizeof(size_t) * blockCount);
m_insert_block = blocks[insertBlock];
m_progress_total_size = CalculateTotalSize();
}
[[nodiscard]] unsigned GetPointerBitCount() const override
@@ -444,6 +451,12 @@ namespace
void IncBlockPos(const XBlock& block, const size_t size)
{
m_block_offsets[block.m_index] += size;
if (m_has_progress_callback)
{
m_progress_current_size += size;
m_progress_callback->OnProgress(m_progress_current_size, m_progress_total_size);
}
}
void Align(const XBlock& block, const unsigned align)
@@ -455,6 +468,16 @@ namespace
}
}
[[nodiscard]] size_t CalculateTotalSize() const
{
size_t result = 0uz;
for (const auto& block : m_blocks)
result += block->m_buffer_size;
return result;
}
std::vector<XBlock*>& m_blocks;
std::unique_ptr<size_t[]> m_block_offsets;
@@ -475,6 +498,11 @@ namespace
// These lookups map a block offset to a pointer in case of a platform mismatch
std::unordered_map<uintptr_t, void*> m_pointer_redirect_lookup;
std::unordered_map<uintptr_t, void*> m_alias_redirect_lookup;
bool m_has_progress_callback;
std::unique_ptr<ProgressCallback> m_progress_callback;
size_t m_progress_current_size;
size_t m_progress_total_size;
};
} // namespace
@@ -483,7 +511,8 @@ std::unique_ptr<ZoneInputStream> ZoneInputStream::Create(const unsigned pointerB
std::vector<XBlock*>& blocks,
const block_t insertBlock,
ILoadingStream& stream,
MemoryManager& memory)
MemoryManager& memory,
std::optional<std::unique_ptr<ProgressCallback>> progressCallback)
{
return std::make_unique<XBlockInputStream>(pointerBitCount, blockBitCount, blocks, insertBlock, stream, memory);
return std::make_unique<XBlockInputStream>(pointerBitCount, blockBitCount, blocks, insertBlock, stream, memory, std::move(progressCallback));
}