From 1b6f2ab9faf9bcaaa87d6cfc441f3984a198717e Mon Sep 17 00:00:00 2001 From: Jan Date: Tue, 22 Mar 2022 15:08:42 +0100 Subject: [PATCH] Calculate StructuredDataDef sizes and offsets --- .../StructuredDataDefSizeCalculator.cpp | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/ObjLoading/StructuredDataDef/Parsing/StructuredDataDefSizeCalculator.cpp b/src/ObjLoading/StructuredDataDef/Parsing/StructuredDataDefSizeCalculator.cpp index 552849dd..a68b19a1 100644 --- a/src/ObjLoading/StructuredDataDef/Parsing/StructuredDataDefSizeCalculator.cpp +++ b/src/ObjLoading/StructuredDataDef/Parsing/StructuredDataDefSizeCalculator.cpp @@ -3,6 +3,7 @@ #include #include +#include "Utils/Alignment.h" #include "Utils/ClassUtils.h" using namespace sdd; @@ -73,20 +74,34 @@ class StructuredDataDefSizeCalculatorInternal m_type_stack.emplace_back(CommonStructuredDataTypeCategory::STRUCT, index); - // TODO: Actually calculate stuff + auto currentOffset = 0u; + for(auto& property : _struct.m_properties) + { + CalculateForType(property.m_type); + currentOffset = utils::Align(currentOffset, property.m_type.GetAlignmentInBits()); + + // Currently set offset is the padding since the start of the struct + property.m_offset_in_bits += currentOffset; + + currentOffset += property.m_type.GetSizeInBits(m_def); + } + currentOffset = utils::Align(currentOffset, 8u); + _struct.m_size_in_byte += currentOffset / 8; m_struct_calculated[index] = true; m_type_stack.pop_back(); } - void CalculateForIndexedArray(size_t index, CommonStructuredDataIndexedArray& indexedArray) + void CalculateForIndexedArray(CommonStructuredDataIndexedArray& indexedArray) { - // TODO: Actually calculate stuff + CalculateForType(indexedArray.m_array_type); + indexedArray.m_element_size_in_bits = indexedArray.m_array_type.GetSizeInBits(m_def); } - void CalculateForEnumedArray(size_t index, CommonStructuredDataEnumedArray& enumedArray) + void CalculateForEnumedArray(CommonStructuredDataEnumedArray& enumedArray) { - // TODO: Actually calculate stuff + CalculateForType(enumedArray.m_array_type); + enumedArray.m_element_size_in_bits = enumedArray.m_array_type.GetSizeInBits(m_def); } void CalculateForType(const CommonStructuredDataType type) @@ -99,11 +114,11 @@ class StructuredDataDefSizeCalculatorInternal break; case CommonStructuredDataTypeCategory::INDEXED_ARRAY: assert(type.m_info.type_index < m_def.m_indexed_arrays.size()); - CalculateForIndexedArray(type.m_info.type_index, m_def.m_indexed_arrays[type.m_info.type_index]); + CalculateForIndexedArray(m_def.m_indexed_arrays[type.m_info.type_index]); break; case CommonStructuredDataTypeCategory::ENUM_ARRAY: assert(type.m_info.type_index < m_def.m_enumed_arrays.size()); - CalculateForEnumedArray(type.m_info.type_index, m_def.m_enumed_arrays[type.m_info.type_index]); + CalculateForEnumedArray(m_def.m_enumed_arrays[type.m_info.type_index]); break; default: break; @@ -125,14 +140,10 @@ public: auto index = 0u; for (auto& _struct : m_def.m_structs) CalculateForStruct(index++, *_struct); - - index = 0u; for (auto& indexedArray : m_def.m_indexed_arrays) - CalculateForIndexedArray(index++, indexedArray); - - index = 0u; + CalculateForIndexedArray(indexedArray); for (auto& enumedArray : m_def.m_enumed_arrays) - CalculateForEnumedArray(index++, enumedArray); + CalculateForEnumedArray(enumedArray); } };