prevent shuffling usedtypes when building rendering context

This commit is contained in:
Jan 2021-02-20 12:36:12 +01:00
parent fe121853e2
commit 447e729964
2 changed files with 17 additions and 23 deletions

View File

@ -36,6 +36,15 @@ RenderingContext::RenderingContext(std::string game, std::vector<const FastFileB
} }
} }
RenderingUsedType* RenderingContext::AddUsedType(std::unique_ptr<RenderingUsedType> usedType)
{
auto* result = usedType.get();
m_used_types.push_back(usedType.get());
m_used_types_lookup.emplace(std::make_pair(usedType->m_type, std::move(usedType)));
return result;
}
RenderingUsedType* RenderingContext::GetBaseType(RenderingUsedType* usedType) RenderingUsedType* RenderingContext::GetBaseType(RenderingUsedType* usedType)
{ {
if(usedType->m_type->GetType() == DataDefinitionType::TYPEDEF) if(usedType->m_type->GetType() == DataDefinitionType::TYPEDEF)
@ -47,13 +56,7 @@ RenderingUsedType* RenderingContext::GetBaseType(RenderingUsedType* usedType)
const auto foundUsedType = m_used_types_lookup.find(typedefDefinition); const auto foundUsedType = m_used_types_lookup.find(typedefDefinition);
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));
auto usedTypePtr = std::make_unique<RenderingUsedType>(typedefDefinition->m_type_declaration->m_type, nullptr);
auto* result = usedTypePtr.get();
m_used_types_lookup.emplace(std::make_pair(usedTypePtr->m_type, std::move(usedTypePtr)));
return result;
}
return foundUsedType->second.get(); return foundUsedType->second.get();
} }
@ -73,15 +76,9 @@ void RenderingContext::AddMembersToContext(StructureInformation* info)
RenderingUsedType* usedType; RenderingUsedType* usedType;
const auto existingUsedType = m_used_types_lookup.find(member->m_member->m_type_declaration->m_type); const auto existingUsedType = m_used_types_lookup.find(member->m_member->m_type_declaration->m_type);
if(existingUsedType == m_used_types_lookup.end()) if(existingUsedType == m_used_types_lookup.end())
{ usedType = AddUsedType(std::make_unique<RenderingUsedType>(member->m_member->m_type_declaration->m_type, member->m_type));
auto usedTypePtr = std::make_unique<RenderingUsedType>(member->m_member->m_type_declaration->m_type, member->m_type);
usedType = usedTypePtr.get();
m_used_types_lookup.emplace(std::make_pair(usedTypePtr->m_type, std::move(usedTypePtr)));
}
else else
{
usedType = existingUsedType->second.get(); usedType = existingUsedType->second.get();
}
auto* baseUsedType = GetBaseType(usedType); auto* baseUsedType = GetBaseType(usedType);
@ -118,28 +115,24 @@ void RenderingContext::AddMembersToContext(StructureInformation* info)
void RenderingContext::MakeAsset(StructureInformation* asset) void RenderingContext::MakeAsset(StructureInformation* asset)
{ {
m_asset = asset; m_asset = asset;
auto assetUsedType = std::make_unique<RenderingUsedType>(asset->m_definition, asset); AddUsedType(std::make_unique<RenderingUsedType>(asset->m_definition, asset));
assetUsedType->m_is_context_asset = true;
m_used_types_lookup.emplace(std::make_pair(asset->m_definition, std::move(assetUsedType)));
AddMembersToContext(asset); AddMembersToContext(asset);
} }
void RenderingContext::CreateUsedTypeCollections() void RenderingContext::CreateUsedTypeCollections()
{ {
for(const auto& [dataDef, usedType] : m_used_types_lookup) for(auto* usedType : m_used_types)
{ {
m_used_types.push_back(usedType.get());
if (usedType->m_info != nullptr) if (usedType->m_info != nullptr)
{ {
StructureComputations computations(usedType->m_info); StructureComputations computations(usedType->m_info);
if(usedType->m_info->m_definition == dataDef) if(usedType->m_info->m_definition == usedType->m_type)
m_used_structures.push_back(usedType.get()); m_used_structures.push_back(usedType);
if(computations.IsAsset() && usedType->m_info != m_asset) if(computations.IsAsset() && usedType->m_info != m_asset)
m_referenced_assets.push_back(usedType.get()); m_referenced_assets.push_back(usedType);
if (!m_has_actions) if (!m_has_actions)
{ {

View File

@ -29,6 +29,7 @@ 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* GetBaseType(RenderingUsedType* usedType); RenderingUsedType* GetBaseType(RenderingUsedType* usedType);
void AddMembersToContext(StructureInformation* info); void AddMembersToContext(StructureInformation* info);
void MakeAsset(StructureInformation* asset); void MakeAsset(StructureInformation* asset);