From 05f4883104d54d5e65eaaa9ac1cb5e4b051f2e2c Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Tue, 17 Oct 2017 16:15:54 -0700 Subject: [PATCH] get rid of valid --- interface/src/raypick/JointRayPick.cpp | 4 +--- interface/src/raypick/JointRayPick.h | 2 +- interface/src/raypick/MouseRayPick.cpp | 4 +--- interface/src/raypick/MouseRayPick.h | 2 +- interface/src/raypick/Pick.h | 2 +- interface/src/raypick/PickManager.h | 14 +++++--------- interface/src/raypick/StaticRayPick.cpp | 3 +-- interface/src/raypick/StaticRayPick.h | 2 +- libraries/shared/src/RegisteredMetaTypes.h | 15 +++++++++++---- 9 files changed, 23 insertions(+), 25 deletions(-) diff --git a/interface/src/raypick/JointRayPick.cpp b/interface/src/raypick/JointRayPick.cpp index d3991eac24..c2a7fb11e5 100644 --- a/interface/src/raypick/JointRayPick.cpp +++ b/interface/src/raypick/JointRayPick.cpp @@ -20,7 +20,7 @@ JointRayPick::JointRayPick(const std::string& jointName, const glm::vec3& posOff { } -const PickRay JointRayPick::getMathematicalPick(bool& valid) const { +const PickRay JointRayPick::getMathematicalPick() const { auto myAvatar = DependencyManager::get()->getMyAvatar(); int jointIndex = myAvatar->getJointIndex(QString::fromStdString(_jointName)); bool useAvatarHead = _jointName == "Avatar"; @@ -38,10 +38,8 @@ const PickRay JointRayPick::getMathematicalPick(bool& valid) const { pos = pos + (rot * (myAvatar->getSensorToWorldScale() * _posOffset)); glm::vec3 dir = rot * glm::normalize(_dirOffset); - valid = true; return PickRay(pos, dir); } - valid = false; return PickRay(); } diff --git a/interface/src/raypick/JointRayPick.h b/interface/src/raypick/JointRayPick.h index b2bffe83c4..ab44bf67c8 100644 --- a/interface/src/raypick/JointRayPick.h +++ b/interface/src/raypick/JointRayPick.h @@ -18,7 +18,7 @@ class JointRayPick : public RayPick { public: JointRayPick(const std::string& jointName, const glm::vec3& posOffset, const glm::vec3& dirOffset, const PickFilter& filter, const float maxDistance = 0.0f, const bool enabled = false); - const PickRay getMathematicalPick(bool& valid) const override; + const PickRay getMathematicalPick() const override; private: std::string _jointName; diff --git a/interface/src/raypick/MouseRayPick.cpp b/interface/src/raypick/MouseRayPick.cpp index 27080f5857..f691dafc01 100644 --- a/interface/src/raypick/MouseRayPick.cpp +++ b/interface/src/raypick/MouseRayPick.cpp @@ -18,14 +18,12 @@ MouseRayPick::MouseRayPick(const PickFilter& filter, const float maxDistance, co { } -const PickRay MouseRayPick::getMathematicalPick(bool& valid) const { +const PickRay MouseRayPick::getMathematicalPick() const { QVariant position = qApp->getApplicationCompositor().getReticleInterface()->getPosition(); if (position.isValid()) { QVariantMap posMap = position.toMap(); - valid = true; return qApp->getCamera().computePickRay(posMap["x"].toFloat(), posMap["y"].toFloat()); } - valid = false; return PickRay(); } diff --git a/interface/src/raypick/MouseRayPick.h b/interface/src/raypick/MouseRayPick.h index c565a03db7..e9eb3ccabf 100644 --- a/interface/src/raypick/MouseRayPick.h +++ b/interface/src/raypick/MouseRayPick.h @@ -18,7 +18,7 @@ class MouseRayPick : public RayPick { public: MouseRayPick(const PickFilter& filter, const float maxDistance = 0.0f, const bool enabled = false); - const PickRay getMathematicalPick(bool& valid) const override; + const PickRay getMathematicalPick() const override; }; #endif // hifi_MouseRayPick_h diff --git a/interface/src/raypick/Pick.h b/interface/src/raypick/Pick.h index c8d637bcb7..161e9779ce 100644 --- a/interface/src/raypick/Pick.h +++ b/interface/src/raypick/Pick.h @@ -104,7 +104,7 @@ class Pick : protected ReadWriteLockable { public: Pick(const PickFilter& filter, const float maxDistance, const bool enabled); - virtual const T getMathematicalPick(bool& valid) const = 0; + virtual const T getMathematicalPick() const = 0; virtual RayToEntityIntersectionResult getEntityIntersection(const T& pick, bool precisionPicking, const QVector& entitiesToInclude, const QVector& entitiesToIgnore, diff --git a/interface/src/raypick/PickManager.h b/interface/src/raypick/PickManager.h index 01cffaeb8e..424be0aa4f 100644 --- a/interface/src/raypick/PickManager.h +++ b/interface/src/raypick/PickManager.h @@ -60,7 +60,7 @@ protected: std::shared_ptr> findPick(const QUuid& uid) const; QHash>> _picks; - typedef QHash> PickCache; + typedef std::unordered_map> PickCache; // Returns true if this ray exists in the cache, and if it does, update res if the cached result is closer bool checkAndCompareCachedResults(T& pick, PickCache& cache, RayPickResult& res, const PickCacheKey& key); @@ -79,7 +79,7 @@ std::shared_ptr> PickManager::findPick(const QUuid& uid) const { template bool PickManager::checkAndCompareCachedResults(T& pick, PickCache& cache, RayPickResult& res, const PickCacheKey& key) { - if (cache.contains(pick) && cache[pick].find(key) != cache[pick].end()) { + if (cache.find(pick) != cache.end() && cache[pick].find(key) != cache[pick].end()) { if (cache[pick][key].distance < res.distance) { res = cache[pick][key]; } @@ -114,14 +114,10 @@ void PickManager::update() { continue; } - T mathematicalPick; + T mathematicalPick = pick->getMathematicalPick(); - { - bool valid; - mathematicalPick = pick->getMathematicalPick(valid); - if (!valid) { - continue; - } + if (!mathematicalPick) { + continue; } RayPickResult res = RayPickResult(mathematicalPick); diff --git a/interface/src/raypick/StaticRayPick.cpp b/interface/src/raypick/StaticRayPick.cpp index 5db054c2e4..f7803aade6 100644 --- a/interface/src/raypick/StaticRayPick.cpp +++ b/interface/src/raypick/StaticRayPick.cpp @@ -13,7 +13,6 @@ StaticRayPick::StaticRayPick(const glm::vec3& position, const glm::vec3& directi { } -const PickRay StaticRayPick::getMathematicalPick(bool& valid) const { - valid = true; +const PickRay StaticRayPick::getMathematicalPick() const { return _pickRay; } \ No newline at end of file diff --git a/interface/src/raypick/StaticRayPick.h b/interface/src/raypick/StaticRayPick.h index c26ea386d6..6dc0a809ae 100644 --- a/interface/src/raypick/StaticRayPick.h +++ b/interface/src/raypick/StaticRayPick.h @@ -15,7 +15,7 @@ class StaticRayPick : public RayPick { public: StaticRayPick(const glm::vec3& position, const glm::vec3& direction, const PickFilter& filter, const float maxDistance = 0.0f, const bool enabled = false); - const PickRay getMathematicalPick(bool& valid) const override; + const PickRay getMathematicalPick() const override; private: PickRay _pickRay; diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index c7b482a917..45813bb294 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -127,11 +127,15 @@ void aaCubeFromScriptValue(const QScriptValue &object, AACube& aaCube); class PickRay { public: - PickRay() : origin(0.0f), direction(0.0f) { } + PickRay() : origin(NAN), direction(NAN) { } PickRay(const glm::vec3& origin, const glm::vec3 direction) : origin(origin), direction(direction) {} glm::vec3 origin; glm::vec3 direction; + operator bool() const { + auto isNan = glm::isnan(origin) || glm::isnan(direction); + return !isNan.x && !isNan.y && !isNan.z; + } bool operator==(const PickRay& other) const { return (origin == other.origin && direction == other.direction); } @@ -143,9 +147,12 @@ namespace std { return ((hash()(a.x) ^ (hash()(a.y) << 1)) >> 1) ^ (hash()(a.z) << 1); } }; -} -inline uint qHash(const PickRay& a) { - return (uint)(std::hash()(a.origin) ^ (std::hash()(a.direction) << 1)); + template <> + struct hash { + size_t operator()(const PickRay& a) const { + return (hash()(a.origin) ^ (hash()(a.direction) << 1)); + } + }; } Q_DECLARE_METATYPE(PickRay) QScriptValue pickRayToScriptValue(QScriptEngine* engine, const PickRay& pickRay);