diff --git a/RTProtocol.cpp b/RTProtocol.cpp index 1e25d02..9176fc7 100644 --- a/RTProtocol.cpp +++ b/RTProtocol.cpp @@ -1742,7 +1742,13 @@ bool CRTProtocol::Read6DOFSettings(bool& bDataAvailable) } SettingsDeserializer deserializer(data, mMajorVersion, mMinorVersion); - return deserializer.Deserialize6DOFSettings(m6DOFSettings, mGeneralSettings, bDataAvailable); + if (!deserializer.Deserialize6DOFSettings(m6DOFSettings, mGeneralSettings, bDataAvailable)) + { + sprintf(mErrorStr, "Failed to parse 6D settings for protocol version %d.%d.", mMajorVersion, mMinorVersion); + return false; + } + + return true; } bool CRTProtocol::ReadGazeVectorSettings(bool& bDataAvailable) diff --git a/SettingsDeserializer.cpp b/SettingsDeserializer.cpp index f674c5a..f83400a 100644 --- a/SettingsDeserializer.cpp +++ b/SettingsDeserializer.cpp @@ -1197,9 +1197,9 @@ namespace bool TryReadSetPointsOld(Deserializer& deserializer, std::vector& target) { target.clear(); - for (auto pointElem : ChildElementRange{deserializer, "Bone"}) + for (auto pointElem : ChildElementRange{deserializer, "Point"}) { - SBodyPoint point; + SBodyPoint point{}; if (!pointElem.TryReadElementFloat("X", point.fX)) { @@ -1231,7 +1231,8 @@ namespace && elem.TryReadElementString("Third", targetThird); } - return false; + // Optional element; complete or absent. + return true; } } @@ -1304,12 +1305,12 @@ bool SettingsDeserializer::Deserialize6DOFSettings(std::vectorFindChild("Bodies")) + if (!sixDofElem.FindChild("Bodies")) { return false; } - for (auto bodyElem : ChildElementRange{*mDeserializer, "Body"}) + for (auto bodyElem : ChildElementRange{sixDofElem, "Body"}) { SSettings6DOFBody bodySettings6Dof{}; @@ -1320,18 +1321,19 @@ bool SettingsDeserializer::Deserialize6DOFSettings(std::vector 1 || mMinorVersion > 15) + settings6Dof.push_back(bodySettings6Dof); + } + + if (mMajorVersion > 1 || mMinorVersion > 15) + { + if (!TryReadSetEuler(sixDofElem, generalSettings.eulerRotations[0], + generalSettings.eulerRotations[1], generalSettings.eulerRotations[2])) { - if (!TryReadSetEuler(*mDeserializer, generalSettings.eulerRotations[0], - generalSettings.eulerRotations[1], generalSettings.eulerRotations[2])) - { - return false; - } + return false; } - - settings6Dof.push_back(bodySettings6Dof); - dataAvailable = true; } + + dataAvailable = true; } return true;