Fixed component type resolution order to prioritize custom types before native ones, since namespace information doesn't exist at that stage.
This commit is contained in:
@@ -1,6 +0,0 @@
|
|||||||
<c:Test>
|
|
||||||
<Integer>1</Integer>
|
|
||||||
<Float>1.333</Float>
|
|
||||||
<Vector X="1.33333" Y="2.33333" Z="3.33333"/>
|
|
||||||
<Quaternion X="1.33333" Y="2.33333" Z="3.33333" W="4.44444"/>
|
|
||||||
</c:Test>
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
|
|
||||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types">
|
|
||||||
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
|
|
||||||
|
|
||||||
<xs:element name="Test">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>ECS Test Component</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
<xs:complexType>
|
|
||||||
<xs:all>
|
|
||||||
<xs:element name="Integer" type="t:int" minOccurs="0"/>
|
|
||||||
<xs:element name="Double" type="t:double" minOccurs="0"/>
|
|
||||||
<xs:element name="String" type="t:string" minOccurs="0"/>
|
|
||||||
<xs:element name="Vector" type="t:Vector" minOccurs="0"/>
|
|
||||||
<xs:element name="Quaternion" type="t:Quaternion" minOccurs="0"/>
|
|
||||||
</xs:all>
|
|
||||||
</xs:complexType>
|
|
||||||
</xs:element>
|
|
||||||
</xs:schema>
|
|
||||||
@@ -415,6 +415,7 @@ std::size_t EntityXMLFile::getTypeStride(std::string typeName)
|
|||||||
std::map<std::string, size_t> typeStrides{
|
std::map<std::string, size_t> typeStrides{
|
||||||
{ "bool", sizeof(bool) },
|
{ "bool", sizeof(bool) },
|
||||||
{ "int", sizeof(int) },
|
{ "int", sizeof(int) },
|
||||||
|
{ "float", sizeof(float) },
|
||||||
{ "double", sizeof(double) },
|
{ "double", sizeof(double) },
|
||||||
{ "string", sizeof(std::string) },
|
{ "string", sizeof(std::string) },
|
||||||
{ "Vector", sizeof(glm::vec3) },
|
{ "Vector", sizeof(glm::vec3) },
|
||||||
@@ -443,39 +444,52 @@ void EntityXMLFile::writeData(const xercesc::DOMElement* element, std::string ty
|
|||||||
{
|
{
|
||||||
using namespace xercesc;
|
using namespace xercesc;
|
||||||
|
|
||||||
XSValue::DataType dataType = XSValue::getDataType(XSTR(typeName.c_str()));
|
if (typeName == "Vector") {
|
||||||
if (dataType == XSValue::DataType::dt_MAXCOUNT) {
|
glm::vec3 vec;
|
||||||
if (typeName == "Vector") {
|
vec.x = getFloatAttribute(element, "X");
|
||||||
glm::vec3 vec;
|
vec.y = getFloatAttribute(element, "Y");
|
||||||
vec.x = getFloatAttribute(element, "X");
|
vec.z = getFloatAttribute(element, "Z");
|
||||||
vec.y = getFloatAttribute(element, "Y");
|
memcpy(outData, reinterpret_cast<char*>(&vec), getTypeStride(typeName));
|
||||||
vec.z = getFloatAttribute(element, "Z");
|
} else if (typeName == "Color") {
|
||||||
memcpy(outData, reinterpret_cast<char*>(&vec), getTypeStride(typeName));
|
glm::vec4 vec;
|
||||||
} else if (typeName == "Color") {
|
vec.r = getFloatAttribute(element, "R");
|
||||||
glm::vec4 vec;
|
vec.g = getFloatAttribute(element, "G");
|
||||||
vec.r = getFloatAttribute(element, "R");
|
vec.b = getFloatAttribute(element, "B");
|
||||||
vec.g = getFloatAttribute(element, "G");
|
vec.a = getFloatAttribute(element, "A");
|
||||||
vec.b = getFloatAttribute(element, "B");
|
memcpy(outData, reinterpret_cast<char*>(&vec), getTypeStride(typeName));
|
||||||
vec.a = getFloatAttribute(element, "A");
|
} else if (typeName == "Quaternion") {
|
||||||
memcpy(outData, reinterpret_cast<char*>(&vec), getTypeStride(typeName));
|
glm::quat q;
|
||||||
} else if (typeName == "Quaternion") {
|
q.x = getFloatAttribute(element, "X");
|
||||||
glm::quat q;
|
q.y = getFloatAttribute(element, "Y");
|
||||||
q.x = getFloatAttribute(element, "X");
|
q.z = getFloatAttribute(element, "Z");
|
||||||
q.y = getFloatAttribute(element, "Y");
|
q.w = getFloatAttribute(element, "W");
|
||||||
q.z = getFloatAttribute(element, "Z");
|
memcpy(outData, reinterpret_cast<char*>(&q), getTypeStride(typeName));
|
||||||
q.w = getFloatAttribute(element, "W");
|
} else if (typeName == "float") {
|
||||||
memcpy(outData, reinterpret_cast<char*>(&q), getTypeStride(typeName));
|
|
||||||
}
|
|
||||||
} else if (dataType == XSValue::DataType::dt_string) {
|
|
||||||
char* str = XMLString::transcode(element->getTextContent());
|
|
||||||
std::string standardString(str);
|
|
||||||
new (outData) std::string(str);
|
|
||||||
XMLString::release(&str);
|
|
||||||
//memcpy(outData, reinterpret_cast<char*>(&standardString), getTypeStride(typeName));
|
|
||||||
} else {
|
|
||||||
XSValue::Status status;
|
XSValue::Status status;
|
||||||
XSValue* val = XSValue::getActualValue(element->getTextContent(), dataType, status);
|
XSValue* val = XSValue::getActualValue(element->getTextContent(), xercesc::XSValue::DataType::dt_float, status);
|
||||||
memcpy(outData, reinterpret_cast<char*>(&val->fData.fValue), getTypeStride(typeName));
|
memcpy(outData, reinterpret_cast<char*>(&val->fData.fValue.f_float), getTypeStride(typeName));
|
||||||
|
} else if (typeName == "double") {
|
||||||
|
XSValue::Status status;
|
||||||
|
XSValue* val = XSValue::getActualValue(element->getTextContent(), xercesc::XSValue::DataType::dt_double, status);
|
||||||
|
memcpy(outData, reinterpret_cast<char*>(&val->fData.fValue.f_double), getTypeStride(typeName));
|
||||||
|
} else if (typeName == "bool") {
|
||||||
|
XSValue::Status status;
|
||||||
|
XSValue* val = XSValue::getActualValue(element->getTextContent(), xercesc::XSValue::DataType::dt_boolean, status);
|
||||||
|
memcpy(outData, reinterpret_cast<char*>(&val->fData.fValue.f_bool), getTypeStride(typeName));
|
||||||
|
} else {
|
||||||
|
XSValue::DataType dataType = XSValue::getDataType(XSTR(typeName.c_str()));
|
||||||
|
if (dataType == XSValue::DataType::dt_string) {
|
||||||
|
char* str = XMLString::transcode(element->getTextContent());
|
||||||
|
std::string standardString(str);
|
||||||
|
new (outData) std::string(str);
|
||||||
|
XMLString::release(&str);
|
||||||
|
//memcpy(outData, reinterpret_cast<char*>(&standardString), getTypeStride(typeName));
|
||||||
|
} else {
|
||||||
|
//XSValue::Status status;
|
||||||
|
//XSValue* val = XSValue::getActualValue(element->getTextContent(), dataType, status);
|
||||||
|
//memcpy(outData, reinterpret_cast<char*>(&val->fData.fValue), getTypeStride(typeName));
|
||||||
|
LOG_WARNING("Unknown native data type: %s", typeName.c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user