fix enum upgrades

This commit is contained in:
Asuro
2025-04-13 00:24:03 +02:00
parent c9db7e7e8f
commit adbe518c6e
6 changed files with 58 additions and 51 deletions

View File

@@ -16,7 +16,6 @@ namespace WriteTemplates
constexpr char FileHeaderStart[] = constexpr char FileHeaderStart[] =
R"END(#pragma once R"END(#pragma once
#include <cstdint> #include <cstdint>
#include <cassert>
namespace Gen namespace Gen
{ {
@@ -47,7 +46,7 @@ namespace Gen
constexpr char EnumHeader4[] = constexpr char EnumHeader4[] =
R"END( struct %s R"END( struct %s
{ {
static constexpr uint16_t EnumIdx = %u; static constexpr uint16_t TypeIdx = %u;
static constexpr int32_t EntryCount = %u; static constexpr int32_t EntryCount = %u;
enum Enum : %s enum Enum : %s
{ {
@@ -221,12 +220,6 @@ namespace Gen
StrRef MemberNameIndices[64]{0}; StrRef MemberNameIndices[64]{0};
}; };
struct EnumDef
{
uint32_t Size = 0;
uint32_t Hash = 0;
};
struct MetadataTable struct MetadataTable
{ {
TypeDef TypeDefinitions[%u] TypeDef TypeDefinitions[%u]
@@ -234,12 +227,6 @@ namespace Gen
)END"; )END";
constexpr char MetadataTypeEntry6[] = R"END( TypeDef{sizeof(%s), %u, "%s", %u, {%s}, {%s}}, constexpr char MetadataTypeEntry6[] = R"END( TypeDef{sizeof(%s), %u, "%s", %u, {%s}, {%s}},
)END";
constexpr char MetadataEnumStart1[] = R"END( };
EnumDef EnumDefinitions[%u]
{
)END";
constexpr char MetadataEnumEntry2[] = R"END( EnumDef{sizeof(%s::Enum), %u},
)END"; )END";
constexpr char MetadataEnd1[] = R"END( }; constexpr char MetadataEnd1[] = R"END( };
char MemberNameBuffer[64*64*64]{"%s"}; char MemberNameBuffer[64*64*64]{"%s"};
@@ -300,7 +287,8 @@ void CppFileWriter::WriteInternal(WriteBuffer& buf, const char* templateStr, va_
buf.WrittenBytes += bx::vsnprintf(&buf.Data[buf.WrittenBytes], BufferRequestSize, templateStr, args); buf.WrittenBytes += bx::vsnprintf(&buf.Data[buf.WrittenBytes], BufferRequestSize, templateStr, args);
} }
void CppFileWriter::PrintTypeName(char* buf, int32_t bufSize, Def::TypeRef type, const Def::DefinitionFile& definitions) void CppFileWriter::PrintTypeName(
char* buf, int32_t bufSize, Def::TypeRef type, const Def::DefinitionFile& definitions, bool printActualEnumType)
{ {
if (buf == nullptr || bufSize == 0 || !IsValid(type)) if (buf == nullptr || bufSize == 0 || !IsValid(type))
{ {
@@ -322,8 +310,11 @@ void CppFileWriter::PrintTypeName(char* buf, int32_t bufSize, Def::TypeRef type,
else if (type.FieldKind == Def::EFieldType::DefinedEnum) else if (type.FieldKind == Def::EFieldType::DefinedEnum)
{ {
bx::strCopy(buf, bufSize, definitions.Enums[type.TypeIdx].Name); bx::strCopy(buf, bufSize, definitions.Enums[type.TypeIdx].Name);
if (printActualEnumType)
{
bx::strCat(buf, bufSize, "::Enum"); bx::strCat(buf, bufSize, "::Enum");
} }
}
} }
void CppFileWriter::WriteEnums(const Def::DefinitionFile& definitions) void CppFileWriter::WriteEnums(const Def::DefinitionFile& definitions)
@@ -340,7 +331,7 @@ void CppFileWriter::WriteEnums(const Def::DefinitionFile& definitions)
char Buf[Def::MaxNameLength]{0}; char Buf[Def::MaxNameLength]{0};
PrintTypeName(Buf, sizeof(Buf), e.EnumType, definitions); PrintTypeName(Buf, sizeof(Buf), e.EnumType, definitions);
Write(WriteTemplates::EnumHeader4, e.Name, enumIdx, e.EntryCount, Buf); Write(WriteTemplates::EnumHeader4, e.Name, definitions.TypeCount + enumIdx, e.EntryCount, Buf);
for (int32_t entryIdx = 0; entryIdx < e.EntryCount; ++entryIdx) for (int32_t entryIdx = 0; entryIdx < e.EntryCount; ++entryIdx)
{ {
Write(WriteTemplates::EnumField1, e.EntryNames[entryIdx]); Write(WriteTemplates::EnumField1, e.EntryNames[entryIdx]);
@@ -458,7 +449,7 @@ void CppFileWriter::WriteSaveLoadMethods(const Def::DefinitionFile& definitions)
for (int32_t fieldIdx = 0; fieldIdx < t.FieldCount; ++fieldIdx) for (int32_t fieldIdx = 0; fieldIdx < t.FieldCount; ++fieldIdx)
{ {
const char* fieldName = t.FieldNames[fieldIdx]; const char* fieldName = t.FieldNames[fieldIdx];
PrintTypeName(fieldTypeName, sizeof(fieldTypeName), t.FieldTypes[fieldIdx], definitions); PrintTypeName(fieldTypeName, sizeof(fieldTypeName), t.FieldTypes[fieldIdx], definitions, false);
WriteCpp(WriteTemplates::LoadFuncBodyMemberCheck4, fieldName, fieldTypeName, typeName, fieldName); WriteCpp(WriteTemplates::LoadFuncBodyMemberCheck4, fieldName, fieldTypeName, typeName, fieldName);
} }
WriteCpp(WriteTemplates::LoadFuncBodyTypeUpgradeStart); WriteCpp(WriteTemplates::LoadFuncBodyTypeUpgradeStart);
@@ -483,7 +474,7 @@ namespace
void CppFileWriter::WriteMetadata(const Def::DefinitionFile& definitions) void CppFileWriter::WriteMetadata(const Def::DefinitionFile& definitions)
{ {
uint32_t memberNameBufferIdx = 0; uint32_t memberNameBufferIdx = 0;
Write(WriteTemplates::MetadataStart1, definitions.TypeCount); Write(WriteTemplates::MetadataStart1, definitions.TypeCount + definitions.EnumCount);
for (uint16_t i = 0; i < definitions.TypeCount; ++i) for (uint16_t i = 0; i < definitions.TypeCount; ++i)
{ {
auto& type = definitions.Types[i]; auto& type = definitions.Types[i];
@@ -493,7 +484,9 @@ void CppFileWriter::WriteMetadata(const Def::DefinitionFile& definitions)
{ {
if (j != 0) bx::strCat(fieldStr, sizeof(fieldStr), ", "); if (j != 0) bx::strCat(fieldStr, sizeof(fieldStr), ", ");
char numBuf[8]{0}; char numBuf[8]{0};
bx::snprintf(numBuf, sizeof(numBuf), "%u", type.FieldTypes[j].TypeIdx); int32_t idx = type.FieldTypes[j].TypeIdx;
if (type.FieldTypes[j].FieldKind == Def::EFieldType::DefinedEnum) idx += definitions.TypeCount;
bx::snprintf(numBuf, sizeof(numBuf), "%u", idx);
bx::strCat(fieldStr, sizeof(fieldStr), numBuf); bx::strCat(fieldStr, sizeof(fieldStr), numBuf);
} }
@@ -515,10 +508,14 @@ void CppFileWriter::WriteMetadata(const Def::DefinitionFile& definitions)
Write( Write(
WriteTemplates::MetadataTypeEntry6, typeStr, type.Hash, type.Name, type.FieldCount, fieldStr, memberIdxStr); WriteTemplates::MetadataTypeEntry6, typeStr, type.Hash, type.Name, type.FieldCount, fieldStr, memberIdxStr);
} }
Write(WriteTemplates::MetadataEnumStart1, definitions.EnumCount); for (uint16_t i = 0; i < definitions.EnumCount; ++i)
for (int32_t i = 0; i < definitions.EnumCount; ++i)
{ {
Write(WriteTemplates::MetadataEnumEntry2, definitions.Enums[i].Name, definitions.Enums[i].Hash); auto& enumType = definitions.Enums[i];
char typeStr[Def::MaxNameLength]{0};
PrintTypeName(typeStr, sizeof(typeStr), {i, Def::EFieldType::DefinedEnum}, definitions);
Write(WriteTemplates::MetadataTypeEntry6, typeStr, enumType.Hash, enumType.Name, 0, "", "");
} }
Write(WriteTemplates::MetadataEnd1, MemberNameBuffer); Write(WriteTemplates::MetadataEnd1, MemberNameBuffer);
} }

View File

@@ -21,7 +21,11 @@ struct CppFileWriter
void WriteInternal(WriteBuffer& buf, const char* templateStr, va_list args); void WriteInternal(WriteBuffer& buf, const char* templateStr, va_list args);
public: public:
void PrintTypeName(char* buf, int32_t bufSize, Def::TypeRef type, const Def::DefinitionFile& definitions); void PrintTypeName(char* buf,
int32_t bufSize,
Def::TypeRef type,
const Def::DefinitionFile& definitions,
bool printActualEnumType = true);
void WriteEnums(const Def::DefinitionFile& definitions); void WriteEnums(const Def::DefinitionFile& definitions);
void WriteTypes(const Def::DefinitionFile& definitions); void WriteTypes(const Def::DefinitionFile& definitions);
void WriteSaveLoadMethods(const Def::DefinitionFile& definitions); void WriteSaveLoadMethods(const Def::DefinitionFile& definitions);

View File

@@ -111,6 +111,8 @@ namespace Game
needReset |= LevelEntities.Setup(storagePtr, needReset); needReset |= LevelEntities.Setup(storagePtr, needReset);
Puzzle::Setup(); Puzzle::Setup();
UIQuads.Count = 0;
PuzzleTiles.Count = 0;
bx::Error err; bx::Error err;
bx::DirectoryReader dirIter; bx::DirectoryReader dirIter;

View File

@@ -86,6 +86,7 @@ type StaticPuzzleCard
{ {
PuzzleElementType Elements Arr(4) PuzzleElementType Elements Arr(4)
ModelHandle ModelHandle ModelHandle ModelHandle
TextureHandle ModelTextureHandle
TextureHandle BoardTextureHandle TextureHandle BoardTextureHandle
} }

View File

@@ -1272,6 +1272,7 @@ namespace Gen
{ {
isOk = Save(obj[i].Elements, 4, serializer) && isOk; isOk = Save(obj[i].Elements, 4, serializer) && isOk;
isOk = Save(&obj[i].ModelHandle, 1, serializer) && isOk; isOk = Save(&obj[i].ModelHandle, 1, serializer) && isOk;
isOk = Save(&obj[i].ModelTextureHandle, 1, serializer) && isOk;
isOk = Save(&obj[i].BoardTextureHandle, 1, serializer) && isOk; isOk = Save(&obj[i].BoardTextureHandle, 1, serializer) && isOk;
} }
return isOk; return isOk;
@@ -1291,6 +1292,7 @@ namespace Gen
{ {
isOk = Load(obj[i].Elements, 4, serializer) && isOk; isOk = Load(obj[i].Elements, 4, serializer) && isOk;
isOk = Load(&obj[i].ModelHandle, 1, serializer) && isOk; isOk = Load(&obj[i].ModelHandle, 1, serializer) && isOk;
isOk = Load(&obj[i].ModelTextureHandle, 1, serializer) && isOk;
isOk = Load(&obj[i].BoardTextureHandle, 1, serializer) && isOk; isOk = Load(&obj[i].BoardTextureHandle, 1, serializer) && isOk;
} }
// if we're not ok here, something went really wrong // if we're not ok here, something went really wrong
@@ -1319,7 +1321,7 @@ namespace Gen
{ {
const bx::StringView memberName = {&serializer.MemberNameBuf[matchedDef.MemberNameIndices[i].Offset], matchedDef.MemberNameIndices[i].Size}; const bx::StringView memberName = {&serializer.MemberNameBuf[matchedDef.MemberNameIndices[i].Offset], matchedDef.MemberNameIndices[i].Size};
const char* memberTypeName = serializer.TypeBuf.Defs[matchedDef.ChildIndices[i]].Name; const char* memberTypeName = serializer.TypeBuf.Defs[matchedDef.ChildIndices[i]].Name;
if (bx::strCmp(memberName, "Elements") == 0 && bx::strCmp(memberTypeName, "PuzzleElementType::Enum") == 0) if (bx::strCmp(memberName, "Elements") == 0 && bx::strCmp(memberTypeName, "PuzzleElementType") == 0)
{ {
WriteDestinations[i] = offsetof(StaticPuzzleCard, Elements); WriteDestinations[i] = offsetof(StaticPuzzleCard, Elements);
} }
@@ -1327,6 +1329,10 @@ namespace Gen
{ {
WriteDestinations[i] = offsetof(StaticPuzzleCard, ModelHandle); WriteDestinations[i] = offsetof(StaticPuzzleCard, ModelHandle);
} }
if (bx::strCmp(memberName, "ModelTextureHandle") == 0 && bx::strCmp(memberTypeName, "TextureHandle") == 0)
{
WriteDestinations[i] = offsetof(StaticPuzzleCard, ModelTextureHandle);
}
if (bx::strCmp(memberName, "BoardTextureHandle") == 0 && bx::strCmp(memberTypeName, "TextureHandle") == 0) if (bx::strCmp(memberName, "BoardTextureHandle") == 0 && bx::strCmp(memberTypeName, "TextureHandle") == 0)
{ {
WriteDestinations[i] = offsetof(StaticPuzzleCard, BoardTextureHandle); WriteDestinations[i] = offsetof(StaticPuzzleCard, BoardTextureHandle);
@@ -1362,6 +1368,12 @@ namespace Gen
isOk = Load(fieldPtr, 1, serializer) && isOk; isOk = Load(fieldPtr, 1, serializer) && isOk;
continue; continue;
} }
if (bx::strCmp(memberName, "ModelTextureHandle") == 0)
{
auto* fieldPtr = reinterpret_cast<TextureHandle*>(objBasePtr + WriteDestinations[j]);
isOk = Load(fieldPtr, 1, serializer) && isOk;
continue;
}
if (bx::strCmp(memberName, "BoardTextureHandle") == 0) if (bx::strCmp(memberName, "BoardTextureHandle") == 0)
{ {
auto* fieldPtr = reinterpret_cast<TextureHandle*>(objBasePtr + WriteDestinations[j]); auto* fieldPtr = reinterpret_cast<TextureHandle*>(objBasePtr + WriteDestinations[j]);
@@ -2003,7 +2015,7 @@ namespace Gen
{ {
WriteDestinations[i] = offsetof(PuzzleData, PlacedCards); WriteDestinations[i] = offsetof(PuzzleData, PlacedCards);
} }
if (bx::strCmp(memberName, "BackgroundTiles") == 0 && bx::strCmp(memberTypeName, "PuzzleElementType::Enum") == 0) if (bx::strCmp(memberName, "BackgroundTiles") == 0 && bx::strCmp(memberTypeName, "PuzzleElementType") == 0)
{ {
WriteDestinations[i] = offsetof(PuzzleData, BackgroundTiles); WriteDestinations[i] = offsetof(PuzzleData, BackgroundTiles);
} }
@@ -2174,7 +2186,7 @@ namespace Gen
{ {
WriteDestinations[i] = offsetof(SavedEntityRenderData, TF); WriteDestinations[i] = offsetof(SavedEntityRenderData, TF);
} }
if (bx::strCmp(memberName, "Material") == 0 && bx::strCmp(memberTypeName, "EMaterial::Enum") == 0) if (bx::strCmp(memberName, "Material") == 0 && bx::strCmp(memberTypeName, "EMaterial") == 0)
{ {
WriteDestinations[i] = offsetof(SavedEntityRenderData, Material); WriteDestinations[i] = offsetof(SavedEntityRenderData, Material);
} }

View File

@@ -1,6 +1,5 @@
#pragma once #pragma once
#include <cstdint> #include <cstdint>
#include <cassert>
namespace Gen namespace Gen
{ {
@@ -8,7 +7,7 @@ namespace Gen
struct Deserializer; struct Deserializer;
struct PuzzleElementType struct PuzzleElementType
{ {
static constexpr uint16_t EnumIdx = 0; static constexpr uint16_t TypeIdx = 30;
static constexpr int32_t EntryCount = 8; static constexpr int32_t EntryCount = 8;
enum Enum : uint8_t enum Enum : uint8_t
{ {
@@ -57,7 +56,7 @@ namespace Gen
}; };
struct EMaterial struct EMaterial
{ {
static constexpr uint16_t EnumIdx = 1; static constexpr uint16_t TypeIdx = 31;
static constexpr int32_t EntryCount = 2; static constexpr int32_t EntryCount = 2;
enum Enum : int32_t enum Enum : int32_t
{ {
@@ -147,6 +146,7 @@ namespace Gen
static constexpr uint16_t TypeIdx = 22; static constexpr uint16_t TypeIdx = 22;
PuzzleElementType::Enum Elements[4] = {}; PuzzleElementType::Enum Elements[4] = {};
ModelHandle ModelHandle = {}; ModelHandle ModelHandle = {};
TextureHandle ModelTextureHandle = {};
TextureHandle BoardTextureHandle = {}; TextureHandle BoardTextureHandle = {};
}; };
struct StaticPuzzleCardHandle struct StaticPuzzleCardHandle
@@ -290,15 +290,9 @@ namespace Gen
StrRef MemberNameIndices[64]{0}; StrRef MemberNameIndices[64]{0};
}; };
struct EnumDef
{
uint32_t Size = 0;
uint32_t Hash = 0;
};
struct MetadataTable struct MetadataTable
{ {
TypeDef TypeDefinitions[30] TypeDef TypeDefinitions[32]
{ {
TypeDef{sizeof(int8_t), 0, "i8", 0, {}, {}}, TypeDef{sizeof(int8_t), 0, "i8", 0, {}, {}},
TypeDef{sizeof(int16_t), 1, "i16", 0, {}, {}}, TypeDef{sizeof(int16_t), 1, "i16", 0, {}, {}},
@@ -322,21 +316,18 @@ namespace Gen
TypeDef{sizeof(ModelHandle), 298089627, "ModelHandle", 2, {5, 18}, {{38, 8}, {46, 5}}}, TypeDef{sizeof(ModelHandle), 298089627, "ModelHandle", 2, {5, 18}, {{38, 8}, {46, 5}}},
TypeDef{sizeof(TextureHandle), 1633273761, "TextureHandle", 2, {5, 18}, {{51, 10}, {61, 5}}}, TypeDef{sizeof(TextureHandle), 1633273761, "TextureHandle", 2, {5, 18}, {{51, 10}, {61, 5}}},
TypeDef{sizeof(PuzPos), 1834398141, "PuzPos", 2, {0, 0}, {{66, 1}, {67, 1}}}, TypeDef{sizeof(PuzPos), 1834398141, "PuzPos", 2, {0, 0}, {{66, 1}, {67, 1}}},
TypeDef{sizeof(StaticPuzzleCard), 3413177578, "StaticPuzzleCard", 3, {0, 19, 20}, {{68, 8}, {76, 11}, {87, 18}}}, TypeDef{sizeof(StaticPuzzleCard), 1466565767, "StaticPuzzleCard", 4, {30, 19, 20, 20}, {{68, 8}, {76, 11}, {87, 18}, {105, 18}}},
TypeDef{sizeof(StaticPuzzleCardHandle), 1742502768, "StaticPuzzleCardHandle", 1, {5}, {{105, 3}}}, TypeDef{sizeof(StaticPuzzleCardHandle), 1742502768, "StaticPuzzleCardHandle", 1, {5}, {{123, 3}}},
TypeDef{sizeof(PuzzleVisualSettings), 2302077481, "PuzzleVisualSettings", 4, {14, 14, 13, 14}, {{108, 13}, {121, 12}, {133, 4}, {137, 16}}}, TypeDef{sizeof(PuzzleVisualSettings), 2302077481, "PuzzleVisualSettings", 4, {14, 14, 13, 14}, {{126, 13}, {139, 12}, {151, 4}, {155, 16}}},
TypeDef{sizeof(StaticPuzzleData), 3618749873, "StaticPuzzleData", 2, {22, 24}, {{153, 5}, {158, 7}}}, TypeDef{sizeof(StaticPuzzleData), 1131370538, "StaticPuzzleData", 2, {22, 24}, {{171, 5}, {176, 7}}},
TypeDef{sizeof(PuzzleCardStack), 53538532, "PuzzleCardStack", 3, {23, 4, 4}, {{165, 7}, {172, 17}, {189, 9}}}, TypeDef{sizeof(PuzzleCardStack), 53538532, "PuzzleCardStack", 3, {23, 4, 4}, {{183, 7}, {190, 17}, {207, 9}}},
TypeDef{sizeof(PlacedPuzzleCard), 3555575973, "PlacedPuzzleCard", 4, {23, 21, 4, 8}, {{198, 7}, {205, 8}, {213, 8}, {221, 8}}}, TypeDef{sizeof(PlacedPuzzleCard), 3555575973, "PlacedPuzzleCard", 4, {23, 21, 4, 8}, {{216, 7}, {223, 8}, {231, 8}, {239, 8}}},
TypeDef{sizeof(PuzzleData), 3349686056, "PuzzleData", 10, {5, 11, 4, 4, 6, 26, 27, 0, 6, 21}, {{229, 2}, {231, 10}, {241, 10}, {251, 11}, {262, 18}, {280, 14}, {294, 11}, {305, 15}, {320, 17}, {337, 13}}}, TypeDef{sizeof(PuzzleData), 3349686056, "PuzzleData", 10, {5, 11, 4, 4, 6, 26, 27, 30, 6, 21}, {{247, 2}, {249, 10}, {259, 10}, {269, 11}, {280, 18}, {298, 14}, {312, 11}, {323, 15}, {338, 17}, {355, 13}}},
TypeDef{sizeof(SavedEntityRenderData), 3172756855, "SavedEntityRenderData", 7, {14, 14, 17, 1, 20, 19, 8}, {{350, 9}, {359, 14}, {373, 2}, {375, 8}, {383, 7}, {390, 5}, {395, 7}}}, TypeDef{sizeof(SavedEntityRenderData), 3172756855, "SavedEntityRenderData", 7, {14, 14, 17, 31, 20, 19, 8}, {{368, 9}, {377, 14}, {391, 2}, {393, 8}, {401, 7}, {408, 5}, {413, 7}}},
TypeDef{sizeof(PuzzleElementType::Enum), 2983807453, "PuzzleElementType", 0, {}, {}},
TypeDef{sizeof(EMaterial::Enum), 2024002654, "EMaterial", 0, {}, {}},
}; };
EnumDef EnumDefinitions[2] char MemberNameBuffer[64*64*64]{"xyxyzxyzwMMMMIPositionRotationScaleIdxModelIdxAssetTextureIdxAssetXYElementsModelHandleModelTextureHandleBoardTextureHandleIdxTileBaseColorTileDotColorTestDisabledCardTintCardsVisualsRefCardMaxAvailableCountUsedCountRefCardPositionRotationIsLockedIDPuzzleNameWidthTilesHeightTilesAvailableCardCountAvailableCardsPlacedCardsBackgroundTilesGoalPositionCountGoalPositionsBaseColorHighlightColorTFMaterialTextureModelVisible"};
{
EnumDef{sizeof(PuzzleElementType::Enum), 2983807453},
EnumDef{sizeof(EMaterial::Enum), 2024002654},
};
char MemberNameBuffer[64*64*64]{"xyxyzxyzwMMMMIPositionRotationScaleIdxModelIdxAssetTextureIdxAssetXYElementsModelHandleBoardTextureHandleIdxTileBaseColorTileDotColorTestDisabledCardTintCardsVisualsRefCardMaxAvailableCountUsedCountRefCardPositionRotationIsLockedIDPuzzleNameWidthTilesHeightTilesAvailableCardCountAvailableCardsPlacedCardsBackgroundTilesGoalPositionCountGoalPositionsBaseColorHighlightColorTFMaterialTextureModelVisible"};
}; };
constexpr MetadataTable Metadata; constexpr MetadataTable Metadata;