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:
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user