2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2026-01-13 20:21:48 +00:00

feat: add fill in ContentWriter classes for writing with x64 hosts

This commit is contained in:
Jan Laupetin
2026-01-09 23:29:42 +00:00
parent 6ad71bd7a9
commit 0e7f86c489
9 changed files with 259 additions and 95 deletions

View File

@@ -57,10 +57,7 @@ void ContentWriter::CreateXAssetList(XAssetList& xAssetList, MemoryManager& memo
void ContentWriter::WriteScriptStringList(const bool atStreamStart)
{
m_stream->PushBlock(XFILE_BLOCK_VIRTUAL);
if (atStreamStart)
varScriptStringListWritten = m_stream->Write(varScriptStringList);
assert(!atStreamStart);
if (varScriptStringList->strings != nullptr)
{
@@ -71,10 +68,8 @@ void ContentWriter::WriteScriptStringList(const bool atStreamStart)
#ifdef ARCH_x86
static_assert(offsetof(ScriptStringList, strings) == 4u);
#endif
m_stream->MarkFollowing(varScriptStringListWritten.WithInnerOffset(4));
m_stream->MarkFollowing(varScriptStringListWritten.AtOffset(4));
}
m_stream->PopBlock();
}
void ContentWriter::WriteXAsset(const bool atStreamStart)
@@ -86,7 +81,7 @@ void ContentWriter::WriteXAsset(const bool atStreamStart)
case type_index: \
{ \
Writer_##typeName writer(varXAsset->header.headerEntry, m_zone, *m_stream); \
writer.Write(varXAsset->header.headerEntry, varXAssetWritten.WithInnerOffset(4)); \
writer.Write(varXAsset->header.headerEntry, varXAssetWritten.AtOffset(4)); \
break; \
}
#define SKIP_ASSET(type_index, typeName, headerEntry) \
@@ -148,17 +143,27 @@ void ContentWriter::WriteXAssetArray(const bool atStreamStart, const size_t coun
{
assert(varXAsset != nullptr);
#ifdef ARCH_x86
static_assert(sizeof(XAsset) == 8u);
#endif
if (atStreamStart)
{
#ifdef ARCH_x86
varXAssetWritten = m_stream->Write(varXAsset, count);
#else
const auto fill = m_stream->WriteWithFill(8u * count);
varXAssetWritten = fill.Offset();
for (size_t index = 0; index < count; index++)
fill.Fill(varXAsset[index].type, 8u * index);
#endif
}
for (size_t index = 0; index < count; index++)
{
WriteXAsset(false);
varXAsset++;
#ifdef ARCH_x86
static_assert(sizeof(XAsset) == 8u);
#endif
varXAssetWritten.Inc(8u);
}
}
@@ -167,21 +172,34 @@ void ContentWriter::WriteContent(ZoneOutputStream& stream)
{
m_stream = &stream;
m_stream->PushBlock(XFILE_BLOCK_VIRTUAL);
MemoryManager memory;
XAssetList assetList{};
CreateXAssetList(assetList, memory);
varXAssetList = &assetList;
#ifdef ARCH_x86
static_assert(sizeof(XAssetList) == 16);
static_assert(offsetof(XAssetList, assetCount) == 8u);
varXAssetListWritten = m_stream->WriteDataRaw(&assetList, sizeof(assetList));
#else
const auto fillAccessor = m_stream->WriteWithFill(16u);
varXAssetListWritten = fillAccessor.Offset();
varScriptStringList = &varXAssetList->stringList;
fillAccessor.Fill(varScriptStringList->count, 0u);
fillAccessor.Fill(varXAssetList->assetCount, 8u);
#endif
m_stream->PushBlock(XFILE_BLOCK_VIRTUAL);
#ifdef ARCH_x86
static_assert(offsetof(XAssetList, stringList) == 0u);
#endif
varScriptStringList = &varXAssetList->stringList;
varScriptStringListWritten = varXAssetListWritten.WithInnerOffset(0);
varScriptStringListWritten = varXAssetListWritten.AtOffset(0);
WriteScriptStringList(false);
if (varXAssetList->assets != nullptr)
@@ -193,7 +211,7 @@ void ContentWriter::WriteContent(ZoneOutputStream& stream)
#ifdef ARCH_x86
static_assert(offsetof(XAssetList, assets) == 12u);
#endif
m_stream->MarkFollowing(varXAssetListWritten.WithInnerOffset(12));
m_stream->MarkFollowing(varXAssetListWritten.AtOffset(12));
}
m_stream->PopBlock();