Cleaned up custom type conversion code
This commit is contained in:
@@ -134,6 +134,7 @@ private:
|
|||||||
void predictComponentAllocation();
|
void predictComponentAllocation();
|
||||||
void parseEntityGraph();
|
void parseEntityGraph();
|
||||||
std::size_t getTypeStride(std::string typeName);
|
std::size_t getTypeStride(std::string typeName);
|
||||||
|
float getFloatAttribute(const xercesc::DOMElement* element, const char* attribute) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -266,73 +266,31 @@ void EntityXMLFile::parseDefaults()
|
|||||||
if (dataType == XSValue::DataType::dt_MAXCOUNT) {
|
if (dataType == XSValue::DataType::dt_MAXCOUNT) {
|
||||||
if (fieldType == "Vector") {
|
if (fieldType == "Vector") {
|
||||||
glm::vec3 vec;
|
glm::vec3 vec;
|
||||||
|
vec.x = getFloatAttribute(fieldElement, "X");
|
||||||
XSValue::Status status;
|
vec.y = getFloatAttribute(fieldElement, "Y");
|
||||||
XSValue* val;
|
vec.z = getFloatAttribute(fieldElement, "Z");
|
||||||
|
|
||||||
val = XSValue::getActualValue(fieldElement->getAttribute(XSTR("X")), XSValue::DataType::dt_float, status);
|
|
||||||
vec.x = val->fData.fValue.f_float;
|
|
||||||
val = XSValue::getActualValue(fieldElement->getAttribute(XSTR("Y")), XSValue::DataType::dt_float, status);
|
|
||||||
vec.y = val->fData.fValue.f_float;
|
|
||||||
val = XSValue::getActualValue(fieldElement->getAttribute(XSTR("Z")), XSValue::DataType::dt_float, status);
|
|
||||||
vec.z = val->fData.fValue.f_float;
|
|
||||||
|
|
||||||
memcpy(ci.second.Defaults.get() + fieldOffset, reinterpret_cast<char*>(&vec), getTypeStride(fieldType));
|
memcpy(ci.second.Defaults.get() + fieldOffset, reinterpret_cast<char*>(&vec), getTypeStride(fieldType));
|
||||||
} else if (fieldType == "Color") {
|
} else if (fieldType == "Color") {
|
||||||
glm::vec4 vec;
|
glm::vec4 vec;
|
||||||
|
vec.r = getFloatAttribute(fieldElement, "R");
|
||||||
XSValue::Status status;
|
vec.g = getFloatAttribute(fieldElement, "G");
|
||||||
XSValue* val;
|
vec.b = getFloatAttribute(fieldElement, "B");
|
||||||
|
vec.a = getFloatAttribute(fieldElement, "A");
|
||||||
val = XSValue::getActualValue(fieldElement->getAttribute(XSTR("R")), XSValue::DataType::dt_float, status);
|
|
||||||
vec.r = val->fData.fValue.f_float;
|
|
||||||
val = XSValue::getActualValue(fieldElement->getAttribute(XSTR("G")), XSValue::DataType::dt_float, status);
|
|
||||||
vec.g = val->fData.fValue.f_float;
|
|
||||||
val = XSValue::getActualValue(fieldElement->getAttribute(XSTR("B")), XSValue::DataType::dt_float, status);
|
|
||||||
vec.b = val->fData.fValue.f_float;
|
|
||||||
val = XSValue::getActualValue(fieldElement->getAttribute(XSTR("A")), XSValue::DataType::dt_float, status);
|
|
||||||
vec.a = val->fData.fValue.f_float;
|
|
||||||
|
|
||||||
memcpy(ci.second.Defaults.get() + fieldOffset, reinterpret_cast<char*>(&vec), getTypeStride(fieldType));
|
memcpy(ci.second.Defaults.get() + fieldOffset, reinterpret_cast<char*>(&vec), getTypeStride(fieldType));
|
||||||
} else if (fieldType == "Quaternion") {
|
} else if (fieldType == "Quaternion") {
|
||||||
glm::quat q;
|
glm::quat q;
|
||||||
|
q.x = getFloatAttribute(fieldElement, "X");
|
||||||
XSValue::Status status;
|
q.y = getFloatAttribute(fieldElement, "Y");
|
||||||
XSValue* val;
|
q.z = getFloatAttribute(fieldElement, "Z");
|
||||||
|
q.w = getFloatAttribute(fieldElement, "W");
|
||||||
val = XSValue::getActualValue(fieldElement->getAttribute(XSTR("X")), XSValue::DataType::dt_float, status);
|
|
||||||
if (val == nullptr) {
|
|
||||||
LOG_ERROR("Default field \"%s\" for component \"%s\" missing \"%s\" attribute!", fieldName.c_str(), componentName.c_str(), "X");
|
|
||||||
} else {
|
|
||||||
q.x = val->fData.fValue.f_float;
|
|
||||||
}
|
|
||||||
val = XSValue::getActualValue(fieldElement->getAttribute(XSTR("Y")), XSValue::DataType::dt_float, status);
|
|
||||||
if (val == nullptr) {
|
|
||||||
LOG_ERROR("Default field \"%s\" for component \"%s\" missing \"%s\" attribute!", fieldName.c_str(), componentName.c_str(), "Y");
|
|
||||||
} else {
|
|
||||||
q.y = val->fData.fValue.f_float;
|
|
||||||
}
|
|
||||||
val = XSValue::getActualValue(fieldElement->getAttribute(XSTR("Z")), XSValue::DataType::dt_float, status);
|
|
||||||
if (val == nullptr) {
|
|
||||||
LOG_ERROR("Default field \"%s\" for component \"%s\" missing \"%s\" attribute!", fieldName.c_str(), componentName.c_str(), "Z");
|
|
||||||
} else {
|
|
||||||
q.z = val->fData.fValue.f_float;
|
|
||||||
}
|
|
||||||
val = XSValue::getActualValue(fieldElement->getAttribute(XSTR("W")), XSValue::DataType::dt_float, status);
|
|
||||||
if (val == nullptr) {
|
|
||||||
LOG_ERROR("Default field \"%s\" for component \"%s\" missing \"%s\" attribute!", fieldName.c_str(), componentName.c_str(), "W");
|
|
||||||
} else {
|
|
||||||
q.w = val->fData.fValue.f_float;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(ci.second.Defaults.get() + fieldOffset, reinterpret_cast<char*>(&q), getTypeStride(fieldType));
|
memcpy(ci.second.Defaults.get() + fieldOffset, reinterpret_cast<char*>(&q), getTypeStride(fieldType));
|
||||||
}
|
}
|
||||||
} else if (dataType == XSValue::DataType::dt_string) {
|
} else if (dataType == XSValue::DataType::dt_string) {
|
||||||
char* str = XMLString::transcode(fieldElement->getTextContent());
|
char* str = XMLString::transcode(fieldElement->getTextContent());
|
||||||
std::string standardString(str);
|
std::string standardString(str);
|
||||||
new (ci.second.Defaults.get() + fieldOffset) std::string(str);
|
//new (ci.second.Defaults.get() + fieldOffset) std::string(str);
|
||||||
XMLString::release(&str);
|
XMLString::release(&str);
|
||||||
//memcpy(ci.second.Defaults.get() + fieldOffset, &standardString, getTypeStride(fieldType));
|
memcpy(ci.second.Defaults.get() + fieldOffset, &standardString, getTypeStride(fieldType));
|
||||||
} else {
|
} else {
|
||||||
XSValue::Status status;
|
XSValue::Status status;
|
||||||
XSValue* val = XSValue::getActualValue(fieldElement->getTextContent(), dataType, status);
|
XSValue* val = XSValue::getActualValue(fieldElement->getTextContent(), dataType, status);
|
||||||
@@ -373,14 +331,6 @@ void EntityXMLFile::predictComponentAllocation()
|
|||||||
stride += getTypeStride(field.second);
|
stride += getTypeStride(field.second);
|
||||||
}
|
}
|
||||||
std::cout << " Stride: " << ci.Meta.Stride << std::endl;
|
std::cout << " Stride: " << ci.Meta.Stride << std::endl;
|
||||||
|
|
||||||
// TODO: ALLOCATE HERE
|
|
||||||
/*ComponentPool cs;
|
|
||||||
cs.ComponentName = ci.Name;
|
|
||||||
cs.Stride = stride;
|
|
||||||
cs.Info = ci;
|
|
||||||
cs.Data = new char[stride*ci.Meta.Allocation];
|
|
||||||
m_ComponentStore[cs.ComponentName] = cs;*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -463,3 +413,16 @@ std::size_t EntityXMLFile::getTypeStride(std::string typeName)
|
|||||||
auto it = typeStrides.find(typeName);
|
auto it = typeStrides.find(typeName);
|
||||||
return (it != typeStrides.end()) ? it->second : 0;
|
return (it != typeStrides.end()) ? it->second : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float EntityXMLFile::getFloatAttribute(const xercesc::DOMElement* element, const char* attribute) const
|
||||||
|
{
|
||||||
|
using namespace xercesc;
|
||||||
|
XSValue::Status status;
|
||||||
|
XSValue* val = XSValue::getActualValue(element->getAttribute(XSTR(attribute)), xercesc::XSValue::DataType::dt_float, status);
|
||||||
|
if (val == nullptr) {
|
||||||
|
LOG_ERROR("Element \"%s\" doesn't have an \"%s\" attribute!", XSTR(element->getTagName()), attribute);
|
||||||
|
return 0.f;
|
||||||
|
} else {
|
||||||
|
return val->fData.fValue.f_float;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user