From 757ec5fff4c3f34aab2adbadacfda41b50ac0e5b Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 3 Nov 2016 16:02:39 -0700 Subject: [PATCH 1/3] normalize quaternions submitted from scriptland --- libraries/shared/src/RegisteredMetaTypes.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index 171b58de17..7324932477 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include "RegisteredMetaTypes.h" @@ -263,6 +263,14 @@ void quatFromScriptValue(const QScriptValue& object, glm::quat &quat) { quat.y = object.property("y").toVariant().toFloat(); quat.z = object.property("z").toVariant().toFloat(); quat.w = object.property("w").toVariant().toFloat(); + + // enforce normalized quaternion + float length2 = glm::length2(quat); + if (length2 > FLT_EPSILON) { + quat /= sqrtf(length2); + } else { + quat = glm::quat(); + } } glm::quat quatFromVariant(const QVariant &object, bool& isValid) { @@ -273,6 +281,14 @@ glm::quat quatFromVariant(const QVariant &object, bool& isValid) { q.y = qvec3.y(); q.z = qvec3.z(); q.w = qvec3.scalar(); + + // enforce normalized quaternion + float length2 = glm::length2(q); + if (length2 > FLT_EPSILON) { + q /= sqrtf(length2); + } else { + q = glm::quat(); + } isValid = true; } else { auto map = object.toMap(); From c9c0b9ebc48b5a0a8493aa53ede486ff64c4eb90 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 3 Nov 2016 17:01:09 -0700 Subject: [PATCH 2/3] tighten rejection of zero-length quaternions --- libraries/shared/src/RegisteredMetaTypes.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index 7324932477..8a63d53469 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include "RegisteredMetaTypes.h" @@ -265,9 +265,9 @@ void quatFromScriptValue(const QScriptValue& object, glm::quat &quat) { quat.w = object.property("w").toVariant().toFloat(); // enforce normalized quaternion - float length2 = glm::length2(quat); - if (length2 > FLT_EPSILON) { - quat /= sqrtf(length2); + float length = glm::length(quat); + if (length > FLT_EPSILON) { + quat /= sqrtf(length); } else { quat = glm::quat(); } @@ -283,9 +283,9 @@ glm::quat quatFromVariant(const QVariant &object, bool& isValid) { q.w = qvec3.scalar(); // enforce normalized quaternion - float length2 = glm::length2(q); - if (length2 > FLT_EPSILON) { - q /= sqrtf(length2); + float length = glm::length(q); + if (length > FLT_EPSILON) { + q /= sqrtf(length); } else { q = glm::quat(); } From 3ed3a74b7d2af77dc88471f17517871b2f9d1097 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 3 Nov 2016 17:08:42 -0700 Subject: [PATCH 3/3] oops, don't forget to remove the sqrt --- libraries/shared/src/RegisteredMetaTypes.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index 8a63d53469..984529c4ba 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -267,7 +267,7 @@ void quatFromScriptValue(const QScriptValue& object, glm::quat &quat) { // enforce normalized quaternion float length = glm::length(quat); if (length > FLT_EPSILON) { - quat /= sqrtf(length); + quat /= length; } else { quat = glm::quat(); } @@ -285,7 +285,7 @@ glm::quat quatFromVariant(const QVariant &object, bool& isValid) { // enforce normalized quaternion float length = glm::length(q); if (length > FLT_EPSILON) { - q /= sqrtf(length); + q /= length; } else { q = glm::quat(); }