From cfe023cc1de3d0f688d6e1acec634e093e5a1e5c Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Tue, 19 Jan 2016 12:33:53 +0100 Subject: [PATCH] Created ComponentInfo::EnumType which defines which native type to use for enums. --- include/Engine/Core/ComponentInfo.h | 4 +++- include/Engine/Core/ComponentWrapper.h | 4 ++-- src/Engine/Core/EntityFile.cpp | 7 +++++-- src/Engine/Core/EntityFilePreprocessor.cpp | 2 +- src/Engine/Core/EntityFileWriter.cpp | 2 +- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/include/Engine/Core/ComponentInfo.h b/include/Engine/Core/ComponentInfo.h index def2a323..49ed2a3f 100644 --- a/include/Engine/Core/ComponentInfo.h +++ b/include/Engine/Core/ComponentInfo.h @@ -5,12 +5,14 @@ struct ComponentInfo { + typedef int EnumType; + struct Meta_t { std::string Annotation; unsigned int Allocation = 0; std::map FieldAnnotations; - std::map> FieldEnumDefinitions; + std::map> FieldEnumDefinitions; }; struct Field_t diff --git a/include/Engine/Core/ComponentWrapper.h b/include/Engine/Core/ComponentWrapper.h index f124d3d5..c7a32370 100644 --- a/include/Engine/Core/ComponentWrapper.h +++ b/include/Engine/Core/ComponentWrapper.h @@ -18,7 +18,7 @@ struct ComponentWrapper const ::EntityID EntityID; char* Data; - int Enum(const char* fieldName, const char* enumKey) + ComponentInfo::EnumType Enum(const char* fieldName, const char* enumKey) { return Info.Meta->FieldEnumDefinitions.at(fieldName).at(enumKey); } @@ -58,7 +58,7 @@ struct ComponentWrapper public: // Return the integer value of an enum type key for this field - int Enum(const char* enumKey) { return m_Component->Enum(m_PropertyName.c_str(), enumKey); } + ComponentInfo::EnumType Enum(const char* enumKey) { return m_Component->Enum(m_PropertyName.c_str(), enumKey); } template operator T&() { return m_Component->Field(m_PropertyName); } diff --git a/src/Engine/Core/EntityFile.cpp b/src/Engine/Core/EntityFile.cpp index d5fb4c12..7609db2b 100644 --- a/src/Engine/Core/EntityFile.cpp +++ b/src/Engine/Core/EntityFile.cpp @@ -47,7 +47,7 @@ std::size_t EntityFile::GetTypeStride(std::string typeName) { "float", sizeof(float) }, { "double", sizeof(double) }, { "string", sizeof(std::string) }, - { "enum", sizeof(int) }, + { "enum", sizeof(ComponentInfo::EnumType) }, { "Vector", sizeof(glm::vec3) }, { "Quaternion", sizeof(glm::quat) }, { "Color", sizeof(glm::vec4) } @@ -88,9 +88,12 @@ void EntityFile::WriteValueData(char* outData, const ComponentInfo::Field_t& fie { // Catch and ignore casting errors so whitespace around string enums won't mess anything up try { - if (field.Type == "int" || field.Type == "enum") { + if (field.Type == "int") { int value = boost::lexical_cast(valueData); memcpy(outData, reinterpret_cast(&value), field.Stride); + } else if (field.Type == "enum") { + ComponentInfo::EnumType value = boost::lexical_cast(valueData); + memcpy(outData, reinterpret_cast(&value), field.Stride); } else if (field.Type == "float") { float value = boost::lexical_cast(valueData); memcpy(outData, reinterpret_cast(&value), field.Stride); diff --git a/src/Engine/Core/EntityFilePreprocessor.cpp b/src/Engine/Core/EntityFilePreprocessor.cpp index 90151941..5cd56cd0 100644 --- a/src/Engine/Core/EntityFilePreprocessor.cpp +++ b/src/Engine/Core/EntityFilePreprocessor.cpp @@ -146,7 +146,7 @@ void EntityFilePreprocessor::parseComponentInfo() auto enumElement = xsChoiceParticles->elementAt(i)->getElementTerm(); std::string enumName = XS::ToString(enumElement->getName()); std::string enumValue = XS::ToString(enumElement->getConstraintValue()); - compInfo.Meta->FieldEnumDefinitions[name][enumName] = boost::lexical_cast(enumValue); + compInfo.Meta->FieldEnumDefinitions[name][enumName] = boost::lexical_cast(enumValue); LOG_DEBUG("ENUM %s = %s", enumName.c_str(), enumValue.c_str()); } } diff --git a/src/Engine/Core/EntityFileWriter.cpp b/src/Engine/Core/EntityFileWriter.cpp index 3efc9253..06a3c4ca 100644 --- a/src/Engine/Core/EntityFileWriter.cpp +++ b/src/Engine/Core/EntityFileWriter.cpp @@ -118,7 +118,7 @@ void EntityFileWriter::appentEntityComponents(xercesc::DOMElement* parentElement const int& value = c[fieldName]; fieldElement->appendChild(doc->createTextNode(X(boost::lexical_cast(value)))); } else if (field.Type == "enum") { - const int& value = c[fieldName]; + const ComponentInfo::EnumType& value = c[fieldName]; auto& enumDef = c.Info.Meta->FieldEnumDefinitions.at(fieldName); for (auto& kv : enumDef) { if (kv.second == value) {