From a06f85faa8e5ac46ca7f2688ec7713fb3cc3133e Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Tue, 31 Jul 2018 09:25:51 -0700 Subject: [PATCH] Consolidate intersection information in CollisionPickResult to one list, and move variant conversion code to source file --- interface/src/raypick/CollisionPick.cpp | 55 +++++++++++++++++++++++++ interface/src/raypick/CollisionPick.h | 30 +------------- 2 files changed, 56 insertions(+), 29 deletions(-) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index c1fc8e9c87..0531a5a67d 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -14,6 +14,61 @@ #include "ScriptEngineLogging.h" #include "model-networking/ModelCache.h" +#include "UUIDHasher.h" + +QVariantMap CollisionPickResult::toVariantMap() const { + QVariantMap variantMap; + + variantMap["intersects"] = intersects; + + std::unordered_map intersections; + std::unordered_map collisionPointPairs; + + IntersectionType intersectionTypesToCheck[] = { ENTITY, AVATAR }; + for (int i = 0; i < 2; i++) { + IntersectionType intersectionType = intersectionTypesToCheck[i]; + + const std::vector* objectIntersections; + if (intersectionType == ENTITY) { + objectIntersections = &entityIntersections; + } + else { + objectIntersections = &avatarIntersections; + } + + for (auto& objectIntersection : *objectIntersections) { + auto at = intersections.find(objectIntersection.foundID); + if (at == intersections.end()) { + QVariantMap intersectingObject; + intersectingObject["id"] = objectIntersection.foundID; + intersectingObject["type"] = intersectionType; + intersections[objectIntersection.foundID] = intersectingObject; + + collisionPointPairs[objectIntersection.foundID] = QVariantList(); + } + + QVariantMap collisionPointPair; + collisionPointPair["pick"] = vec3toVariant(objectIntersection.testCollisionPoint); + collisionPointPair["object"] = vec3toVariant(objectIntersection.foundCollisionPoint); + + collisionPointPairs[objectIntersection.foundID].append(collisionPointPair); + } + } + + QVariantList qIntersectingObjects; + for (auto& intersectionKeyVal : intersections) { + const QUuid& id = intersectionKeyVal.first; + QVariantMap& intersection = intersectionKeyVal.second; + + intersection["collisionPointPairs"] = collisionPointPairs[id]; + qIntersectingObjects.append(intersection); + } + + variantMap["intersectingObjects"] = qIntersectingObjects; + variantMap["collisionRegion"] = pickVariant; + + return variantMap; +} bool CollisionPick::isShapeInfoReady(CollisionRegion& pick) { if (pick.shouldComputeShapeInfo()) { diff --git a/interface/src/raypick/CollisionPick.h b/interface/src/raypick/CollisionPick.h index 29990f21a7..48b3173f19 100644 --- a/interface/src/raypick/CollisionPick.h +++ b/interface/src/raypick/CollisionPick.h @@ -35,35 +35,7 @@ public: std::vector entityIntersections; std::vector avatarIntersections; - virtual QVariantMap toVariantMap() const override { - QVariantMap variantMap; - - variantMap["intersects"] = intersects; - - QVariantList qEntityIntersections; - for (auto entityIntersection : entityIntersections) { - QVariantMap qEntityIntersection; - qEntityIntersection["objectID"] = entityIntersection.foundID; - qEntityIntersection["pickCollisionPoint"] = vec3toVariant(entityIntersection.testCollisionPoint); - qEntityIntersection["entityCollisionPoint"] = vec3toVariant(entityIntersection.foundCollisionPoint); - qEntityIntersections.append(qEntityIntersection); - } - variantMap["entityIntersections"] = qEntityIntersections; - - QVariantList qAvatarIntersections; - for (auto avatarIntersection : avatarIntersections) { - QVariantMap qAvatarIntersection; - qAvatarIntersection["objectID"] = avatarIntersection.foundID; - qAvatarIntersection["pickCollisionPoint"] = vec3toVariant(avatarIntersection.testCollisionPoint); - qAvatarIntersection["entityCollisionPoint"] = vec3toVariant(avatarIntersection.foundCollisionPoint); - qAvatarIntersections.append(qAvatarIntersection); - } - variantMap["avatarIntersections"] = qAvatarIntersections; - - variantMap["collisionRegion"] = pickVariant; - - return variantMap; - } + QVariantMap CollisionPickResult::toVariantMap() const override; bool doesIntersect() const override { return intersects; } bool checkOrFilterAgainstMaxDistance(float maxDistance) override { return true; }