working sockets
This commit is contained in:
@@ -1275,6 +1275,92 @@ namespace Gen
|
||||
assert(isOk);
|
||||
return isOk;
|
||||
}
|
||||
bool Save(const CardSocket* obj, uint32_t count, Serializer& serializer)
|
||||
{
|
||||
bool isOk = true;
|
||||
for (uint32_t i = 0; i < count; ++i)
|
||||
{
|
||||
isOk = Save(&obj[i].Model, 1, serializer) && isOk;
|
||||
}
|
||||
return isOk;
|
||||
}
|
||||
bool Load(CardSocket* obj, uint32_t count, Deserializer& serializer)
|
||||
{
|
||||
const char* typeName = Meta::Metadata.TypeDefinitions[CardSocket::TypeIdx].Name;
|
||||
|
||||
// Quick match
|
||||
int32_t matchedHashIdx =
|
||||
serializer.TypeBuf.FindHash(Meta::Metadata.TypeDefinitions[CardSocket::TypeIdx].Hash);
|
||||
if (matchedHashIdx >= 0)
|
||||
{
|
||||
assert(bx::strCmp(serializer.TypeBuf.Defs[matchedHashIdx].Name, typeName) == 0);
|
||||
bool isOk = true;
|
||||
for (uint32_t i = 0; i < count; ++i)
|
||||
{
|
||||
isOk = Load(&obj[i].Model, 1, serializer) && isOk;
|
||||
}
|
||||
// if we're not ok here, something went really wrong
|
||||
assert(isOk);
|
||||
return isOk;
|
||||
}
|
||||
|
||||
// Failed to resolve hash, the type definition chaned since the file was saved! try to match by name.
|
||||
int32_t nameMatchIdx = serializer.TypeBuf.FindDefByName(typeName);
|
||||
if (nameMatchIdx < 0)
|
||||
{
|
||||
// Name match failed, caller has to handle this and potentially skip some bytes
|
||||
return false;
|
||||
}
|
||||
|
||||
// Successfully matched name, but we need to follow the definition of the file now!
|
||||
const Meta::TypeDef& matchedDef = serializer.TypeBuf.Defs[nameMatchIdx];
|
||||
|
||||
// Figure out new member mapping
|
||||
uint64_t WriteDestinations[64];
|
||||
for (int32_t i = 0; i < BX_COUNTOF(WriteDestinations); ++i)
|
||||
{
|
||||
WriteDestinations[i] = UINT64_MAX;
|
||||
}
|
||||
for (uint32_t i = 0; i < matchedDef.ChildCount; ++i)
|
||||
{
|
||||
const bx::StringView memberName = {&serializer.MemberNameBuf[matchedDef.MemberNameIndices[i].Offset], matchedDef.MemberNameIndices[i].Size};
|
||||
const char* memberTypeName = serializer.TypeBuf.Defs[matchedDef.ChildIndices[i]].Name;
|
||||
if (bx::strCmp(memberName, "Model") == 0 && bx::strCmp(memberTypeName, "ModelHandle") == 0)
|
||||
{
|
||||
WriteDestinations[i] = offsetof(CardSocket, Model);
|
||||
}
|
||||
}
|
||||
|
||||
// Start reading in file order, skipping things that we don't know by name and type
|
||||
bool isOk = true;
|
||||
for (uint32_t i = 0; i < count; ++i)
|
||||
{
|
||||
uint8_t* objBasePtr = reinterpret_cast<uint8_t*>(&obj[i]);
|
||||
|
||||
for (uint32_t j = 0; j < matchedDef.ChildCount; ++j)
|
||||
{
|
||||
const Meta::TypeDef& childDef = serializer.TypeBuf.Defs[matchedDef.ChildIndices[j]];
|
||||
const bx::StringView memberName = {&serializer.MemberNameBuf[matchedDef.MemberNameIndices[j].Offset], matchedDef.MemberNameIndices[j].Size};
|
||||
if (WriteDestinations[j] == UINT64_MAX)
|
||||
{
|
||||
// Unknown member name or type changed
|
||||
uint16_t count = bx::max(1, matchedDef.ChildArraySizes[matchedDef.ChildIndices[j]]);
|
||||
serializer.Skip(childDef.Size * count);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (bx::strCmp(memberName, "Model") == 0)
|
||||
{
|
||||
auto* fieldPtr = reinterpret_cast<ModelHandle*>(objBasePtr + WriteDestinations[j]);
|
||||
isOk = Load(fieldPtr, 1, serializer) && isOk;
|
||||
continue;
|
||||
}
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
assert(isOk);
|
||||
return isOk;
|
||||
}
|
||||
bool Save(const StaticPuzzleCard* obj, uint32_t count, Serializer& serializer)
|
||||
{
|
||||
bool isOk = true;
|
||||
@@ -1286,6 +1372,7 @@ namespace Gen
|
||||
isOk = Save(&obj[i].EastCoverHandle, 1, serializer) && isOk;
|
||||
isOk = Save(&obj[i].SouthCoverHandle, 1, serializer) && isOk;
|
||||
isOk = Save(&obj[i].WestCoverHandle, 1, serializer) && isOk;
|
||||
isOk = Save(obj[i].Sockets, 16, serializer) && isOk;
|
||||
isOk = Save(&obj[i].ModelTextureHandle, 1, serializer) && isOk;
|
||||
isOk = Save(&obj[i].BoardTextureHandle, 1, serializer) && isOk;
|
||||
}
|
||||
@@ -1310,6 +1397,7 @@ namespace Gen
|
||||
isOk = Load(&obj[i].EastCoverHandle, 1, serializer) && isOk;
|
||||
isOk = Load(&obj[i].SouthCoverHandle, 1, serializer) && isOk;
|
||||
isOk = Load(&obj[i].WestCoverHandle, 1, serializer) && isOk;
|
||||
isOk = Load(obj[i].Sockets, 16, serializer) && isOk;
|
||||
isOk = Load(&obj[i].ModelTextureHandle, 1, serializer) && isOk;
|
||||
isOk = Load(&obj[i].BoardTextureHandle, 1, serializer) && isOk;
|
||||
}
|
||||
@@ -1363,6 +1451,10 @@ namespace Gen
|
||||
{
|
||||
WriteDestinations[i] = offsetof(StaticPuzzleCard, WestCoverHandle);
|
||||
}
|
||||
if (bx::strCmp(memberName, "Sockets") == 0 && bx::strCmp(memberTypeName, "CardSocket") == 0)
|
||||
{
|
||||
WriteDestinations[i] = offsetof(StaticPuzzleCard, Sockets);
|
||||
}
|
||||
if (bx::strCmp(memberName, "ModelTextureHandle") == 0 && bx::strCmp(memberTypeName, "TextureHandle") == 0)
|
||||
{
|
||||
WriteDestinations[i] = offsetof(StaticPuzzleCard, ModelTextureHandle);
|
||||
@@ -1427,6 +1519,12 @@ namespace Gen
|
||||
isOk = Load(fieldPtr, 1, serializer) && isOk;
|
||||
continue;
|
||||
}
|
||||
if (bx::strCmp(memberName, "Sockets") == 0)
|
||||
{
|
||||
auto* fieldPtr = reinterpret_cast<CardSocket*>(objBasePtr + WriteDestinations[j]);
|
||||
isOk = Load(fieldPtr, 16, serializer) && isOk;
|
||||
continue;
|
||||
}
|
||||
if (bx::strCmp(memberName, "ModelTextureHandle") == 0)
|
||||
{
|
||||
auto* fieldPtr = reinterpret_cast<TextureHandle*>(objBasePtr + WriteDestinations[j]);
|
||||
|
||||
Reference in New Issue
Block a user