Fix types referenced via typedef not being accounted for when building rendering context

This commit is contained in:
Jan 2021-02-28 22:42:44 +01:00
parent 1164ec1777
commit 7b29d61bb5
3 changed files with 40 additions and 17 deletions

View File

@ -45,7 +45,7 @@ RenderingUsedType* RenderingContext::AddUsedType(std::unique_ptr<RenderingUsedTy
return result; return result;
} }
RenderingUsedType* RenderingContext::GetBaseType(RenderingUsedType* usedType) RenderingUsedType* RenderingContext::GetBaseType(const IDataRepository* repository, MemberComputations* computations, RenderingUsedType* usedType)
{ {
if(usedType->m_type->GetType() == DataDefinitionType::TYPEDEF) if(usedType->m_type->GetType() == DataDefinitionType::TYPEDEF)
{ {
@ -54,9 +54,18 @@ RenderingUsedType* RenderingContext::GetBaseType(RenderingUsedType* usedType)
while(typedefDefinition->m_type_declaration->m_type->GetType() == DataDefinitionType::TYPEDEF) while(typedefDefinition->m_type_declaration->m_type->GetType() == DataDefinitionType::TYPEDEF)
typedefDefinition = dynamic_cast<const TypedefDefinition*>(typedefDefinition->m_type_declaration->m_type); typedefDefinition = dynamic_cast<const TypedefDefinition*>(typedefDefinition->m_type_declaration->m_type);
const auto foundUsedType = m_used_types_lookup.find(typedefDefinition); const auto foundUsedType = m_used_types_lookup.find(typedefDefinition->m_type_declaration->m_type);
if(foundUsedType == m_used_types_lookup.end()) if(foundUsedType == m_used_types_lookup.end())
return AddUsedType(std::make_unique<RenderingUsedType>(typedefDefinition->m_type_declaration->m_type, nullptr)); {
const auto* memberDef = dynamic_cast<const DefinitionWithMembers*>(typedefDefinition->m_type_declaration->m_type);
StructureInformation* info = nullptr;
if (memberDef)
info = repository->GetInformationFor(memberDef);
auto* addedUsedType = AddUsedType(std::make_unique<RenderingUsedType>(typedefDefinition->m_type_declaration->m_type, info));
ScanUsedTypeIfNeeded(repository, computations, usedType);
return addedUsedType;
}
return foundUsedType->second.get(); return foundUsedType->second.get();
} }
@ -64,7 +73,7 @@ RenderingUsedType* RenderingContext::GetBaseType(RenderingUsedType* usedType)
return nullptr; return nullptr;
} }
void RenderingContext::AddMembersToContext(StructureInformation* info) void RenderingContext::AddMembersToContext(const IDataRepository* repository, StructureInformation* info)
{ {
for(const auto& member : info->m_ordered_members) for(const auto& member : info->m_ordered_members)
{ {
@ -80,7 +89,7 @@ void RenderingContext::AddMembersToContext(StructureInformation* info)
else else
usedType = existingUsedType->second.get(); usedType = existingUsedType->second.get();
auto* baseUsedType = GetBaseType(usedType); auto* baseUsedType = GetBaseType(repository, &computations, usedType);
if(!computations.IsInRuntimeBlock()) if(!computations.IsInRuntimeBlock())
{ {
@ -104,20 +113,25 @@ void RenderingContext::AddMembersToContext(StructureInformation* info)
usedType->m_pointer_array_reference_is_reusable = true; usedType->m_pointer_array_reference_is_reusable = true;
} }
if(usedType->m_info != nullptr && !StructureComputations(usedType->m_info).IsAsset() && !computations.IsInRuntimeBlock() && !usedType->m_members_loaded) ScanUsedTypeIfNeeded(repository, &computations, usedType);
{
usedType->m_members_loaded = true;
AddMembersToContext(usedType->m_info);
}
} }
} }
void RenderingContext::MakeAsset(StructureInformation* asset) void RenderingContext::ScanUsedTypeIfNeeded(const IDataRepository* repository, MemberComputations* computations, RenderingUsedType* usedType)
{
if (usedType->m_info != nullptr && !StructureComputations(usedType->m_info).IsAsset() && !computations->IsInRuntimeBlock() && !usedType->m_members_loaded)
{
usedType->m_members_loaded = true;
AddMembersToContext(repository, usedType->m_info);
}
}
void RenderingContext::MakeAsset(const IDataRepository* repository, StructureInformation* asset)
{ {
m_asset = asset; m_asset = asset;
AddUsedType(std::make_unique<RenderingUsedType>(asset->m_definition, asset)); AddUsedType(std::make_unique<RenderingUsedType>(asset->m_definition, asset));
AddMembersToContext(asset); AddMembersToContext(repository, asset);
} }
void RenderingContext::CreateUsedTypeCollections() void RenderingContext::CreateUsedTypeCollections()
@ -152,7 +166,7 @@ std::unique_ptr<RenderingContext> RenderingContext::BuildContext(const IDataRepo
{ {
auto context = std::make_unique<RenderingContext>(RenderingContext(repository->GetGameName(), repository->GetAllFastFileBlocks())); auto context = std::make_unique<RenderingContext>(RenderingContext(repository->GetGameName(), repository->GetAllFastFileBlocks()));
context->MakeAsset(asset); context->MakeAsset(repository, asset);
context->CreateUsedTypeCollections(); context->CreateUsedTypeCollections();
return std::move(context); return std::move(context);

View File

@ -3,6 +3,7 @@
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
#include "Domain/Computations/MemberComputations.h"
#include "Domain/Information/StructureInformation.h" #include "Domain/Information/StructureInformation.h"
#include "Persistence/IDataRepository.h" #include "Persistence/IDataRepository.h"
@ -30,9 +31,10 @@ class RenderingContext
RenderingContext(std::string game, std::vector<const FastFileBlock*> fastFileBlocks); RenderingContext(std::string game, std::vector<const FastFileBlock*> fastFileBlocks);
RenderingUsedType* AddUsedType(std::unique_ptr<RenderingUsedType> usedType); RenderingUsedType* AddUsedType(std::unique_ptr<RenderingUsedType> usedType);
RenderingUsedType* GetBaseType(RenderingUsedType* usedType); RenderingUsedType* GetBaseType(const IDataRepository* repository, MemberComputations* computations, RenderingUsedType* usedType);
void AddMembersToContext(StructureInformation* info); void AddMembersToContext(const IDataRepository* repository, StructureInformation* info);
void MakeAsset(StructureInformation* asset); void ScanUsedTypeIfNeeded(const IDataRepository* repository, MemberComputations* computations, RenderingUsedType* usedType);
void MakeAsset(const IDataRepository* repository, StructureInformation* asset);
void CreateUsedTypeCollections(); void CreateUsedTypeCollections();
public: public:

View File

@ -7,7 +7,14 @@ bool CreateMemberInformationPostProcessor::CreateMemberInformationForStructure(I
for(const auto& member : structure->m_definition->m_members) for(const auto& member : structure->m_definition->m_members)
{ {
StructureInformation* typeInfo = nullptr; StructureInformation* typeInfo = nullptr;
const auto* memberDefinition = dynamic_cast<const DefinitionWithMembers*>(member->m_type_declaration->m_type); const auto* currentDefinition = member->m_type_declaration->m_type;
while(currentDefinition->GetType() == DataDefinitionType::TYPEDEF)
{
currentDefinition = dynamic_cast<const TypedefDefinition*>(currentDefinition)->m_type_declaration->m_type;
}
const auto* memberDefinition = dynamic_cast<const DefinitionWithMembers*>(currentDefinition);
if(memberDefinition != nullptr) if(memberDefinition != nullptr)
typeInfo = repository->GetInformationFor(memberDefinition); typeInfo = repository->GetInformationFor(memberDefinition);