From f061ff91f5d4f09d9d1efe6272138d649555abd0 Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 22 Jan 2022 14:35:43 +0100 Subject: [PATCH] Create default StructuredDataDef struct when none was specified so there is always a root struct --- .../AssetLoaderStructuredDataDefSet.cpp | 2 +- .../StructuredDataDefDefScopeSequences.cpp | 28 +++++++++++++++---- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderStructuredDataDefSet.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderStructuredDataDefSet.cpp index b3fcf72b..dc702015 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderStructuredDataDefSet.cpp +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderStructuredDataDefSet.cpp @@ -95,7 +95,7 @@ void AssetLoaderStructuredDataDefSet::ConvertStruct(StructuredDataStruct* output outputProperty.name = memory->Dup(inputProperty.m_name.c_str()); outputProperty.type = ConvertType(inputProperty.m_type); - if(outputProperty.type.type != DATA_BOOL) + if (outputProperty.type.type != DATA_BOOL) { assert(inputProperty.m_offset_in_bits % 8 == 0); outputProperty.offset = inputProperty.m_offset_in_bits / 8; diff --git a/src/ObjLoading/Parsing/StructuredDataDef/Sequence/StructuredDataDefDefScopeSequences.cpp b/src/ObjLoading/Parsing/StructuredDataDef/Sequence/StructuredDataDefDefScopeSequences.cpp index 81985500..3dfd7eef 100644 --- a/src/ObjLoading/Parsing/StructuredDataDef/Sequence/StructuredDataDefDefScopeSequences.cpp +++ b/src/ObjLoading/Parsing/StructuredDataDef/Sequence/StructuredDataDefDefScopeSequences.cpp @@ -101,18 +101,34 @@ namespace sdd::def_scope_sequences }); } + private: + static void CreateDefaultStructWhenNoStructsSpecified(const StructuredDataDefParserState* state) + { + if (state->m_current_def->m_structs.empty()) + { + state->m_current_def->m_structs.emplace_back(std::make_unique()); + state->m_current_def->m_root_type = CommonStructuredDataDefType(CommonStructuredDataDefTypeCategory::STRUCT, 0u); + } + } + + static void SetDefSizeFromRootStruct(const StructuredDataDefParserState* state) + { + if (state->m_current_def->m_root_type.m_category == CommonStructuredDataDefTypeCategory::STRUCT + && state->m_current_def->m_root_type.m_info.type_index < state->m_current_def->m_structs.size()) + { + const auto* _struct = state->m_current_def->m_structs[state->m_current_def->m_root_type.m_info.type_index].get(); + state->m_current_def->m_size_in_byte = _struct->m_size_in_byte; + } + } + protected: void ProcessMatch(StructuredDataDefParserState* state, SequenceResult& result) const override { assert(state->m_current_enum == nullptr); assert(state->m_current_struct == nullptr); - if(state->m_current_def->m_root_type.m_category == CommonStructuredDataDefTypeCategory::STRUCT - && state->m_current_def->m_root_type.m_info.type_index < state->m_current_def->m_structs.size()) - { - const auto* _struct = state->m_current_def->m_structs[state->m_current_def->m_root_type.m_info.type_index].get(); - state->m_current_def->m_size_in_byte = _struct->m_size_in_byte; - } + CreateDefaultStructWhenNoStructsSpecified(state); + SetDefSizeFromRootStruct(state); state->m_current_def = nullptr; state->m_def_types_by_name.clear();