From 5be945715f584cfa8ad9f2547f9e933f805f39be Mon Sep 17 00:00:00 2001
From: David Rowe <david@ctrlaltstudio.com>
Date: Fri, 3 Aug 2018 08:22:36 +1200
Subject: [PATCH] Include the teleporter target in the occlusion

---
 interface/src/raypick/PathPointer.cpp           | 17 ++++++++++++++++-
 interface/src/raypick/PathPointer.h             |  2 ++
 .../src/raypick/PointerScriptingInterface.cpp   |  4 ++++
 .../src/raypick/PointerScriptingInterface.h     |  7 +++++++
 interface/src/raypick/StylusPointer.cpp         |  8 +++++++-
 interface/src/raypick/StylusPointer.h           |  2 ++
 libraries/pointers/src/Pointer.h                |  2 ++
 libraries/pointers/src/PointerManager.cpp       | 11 ++++++++++-
 libraries/pointers/src/PointerManager.h         |  2 ++
 .../controllers/controllerModules/teleport.js   | 11 +++++++++++
 10 files changed, 63 insertions(+), 3 deletions(-)

diff --git a/interface/src/raypick/PathPointer.cpp b/interface/src/raypick/PathPointer.cpp
index 685611d77b..d0f66cd240 100644
--- a/interface/src/raypick/PathPointer.cpp
+++ b/interface/src/raypick/PathPointer.cpp
@@ -350,4 +350,19 @@ glm::vec2 PathPointer::findPos2D(const PickedObject& pickedObject, const glm::ve
     default:
         return glm::vec2(NAN);
     }
-}
\ No newline at end of file
+}
+
+QVector<QUuid> PathPointer::getOverlayIDs() {
+    QVector<QUuid> result;
+    for (auto& state : _renderStates) {
+        QUuid uuid = state.second->getStartID();
+        if (!uuid.isNull()) {
+            result.append(uuid);
+        }
+        uuid = state.second->getEndID();
+        if (!uuid.isNull()) {
+            result.append(uuid);
+        }
+    }
+    return result;
+}
diff --git a/interface/src/raypick/PathPointer.h b/interface/src/raypick/PathPointer.h
index 44c1b7f82b..92d221aeb9 100644
--- a/interface/src/raypick/PathPointer.h
+++ b/interface/src/raypick/PathPointer.h
@@ -76,6 +76,8 @@ public:
     // You cannot use editRenderState to change the type of any part of the pointer.  You can only edit the properties of the existing overlays.
     void editRenderState(const std::string& state, const QVariant& startProps, const QVariant& pathProps, const QVariant& endProps) override;
 
+    QVector<QUuid> getOverlayIDs() override;
+
     void setLength(float length) override;
     void setLockEndUUID(const QUuid& objectID, bool isOverlay, const glm::mat4& offsetMat = glm::mat4()) override;
 
diff --git a/interface/src/raypick/PointerScriptingInterface.cpp b/interface/src/raypick/PointerScriptingInterface.cpp
index 5bb4293ef3..259c02d943 100644
--- a/interface/src/raypick/PointerScriptingInterface.cpp
+++ b/interface/src/raypick/PointerScriptingInterface.cpp
@@ -374,4 +374,8 @@ QVariantMap PointerScriptingInterface::getPrevPickResult(unsigned int uid) const
         result = pickResult->toVariantMap();
     }
     return result;
+}
+
+QVector<QUuid> PointerScriptingInterface::getOverlayIDs(unsigned int uid) {
+    return DependencyManager::get<PointerManager>()->getOverlayIDs(uid);
 }
\ No newline at end of file
diff --git a/interface/src/raypick/PointerScriptingInterface.h b/interface/src/raypick/PointerScriptingInterface.h
index 9fe05182c7..65036c3104 100644
--- a/interface/src/raypick/PointerScriptingInterface.h
+++ b/interface/src/raypick/PointerScriptingInterface.h
@@ -203,6 +203,13 @@ public:
      */
     Q_INVOKABLE bool isMouse(unsigned int uid) { return DependencyManager::get<PointerManager>()->isMouse(uid); }
 
+    /**jsdoc
+     * Get the IDs of the overlays used by a Pointer.
+     * @function Pointers.getOverlayIDs
+     * @param {number} uid The ID of the Pointer, as returned by {@link Pointers.createPointer}.
+     * @returns {Uuid[]} The overlay IDs used by the Pointer.
+     */
+    Q_INVOKABLE QVector<QUuid> getOverlayIDs(unsigned int uid);
 };
 
 #endif // hifi_PointerScriptingInterface_h
diff --git a/interface/src/raypick/StylusPointer.cpp b/interface/src/raypick/StylusPointer.cpp
index 8c0fb59106..0d376bf3f1 100644
--- a/interface/src/raypick/StylusPointer.cpp
+++ b/interface/src/raypick/StylusPointer.cpp
@@ -225,4 +225,10 @@ glm::vec2 StylusPointer::findPos2D(const PickedObject& pickedObject, const glm::
         default:
             return glm::vec2(NAN);
     }
-}
\ No newline at end of file
+}
+
+QVector<QUuid> StylusPointer::getOverlayIDs() {
+    QVector<QUuid> result;
+    result.append(_stylusOverlay);
+    return result;
+}
diff --git a/interface/src/raypick/StylusPointer.h b/interface/src/raypick/StylusPointer.h
index 950b03b7c9..a4778ffd97 100644
--- a/interface/src/raypick/StylusPointer.h
+++ b/interface/src/raypick/StylusPointer.h
@@ -33,6 +33,8 @@ public:
     void setRenderState(const std::string& state) override;
     void editRenderState(const std::string& state, const QVariant& startProps, const QVariant& pathProps, const QVariant& endProps) override {}
 
+    QVector<QUuid> getOverlayIDs() override;
+
     static OverlayID buildStylusOverlay(const QVariantMap& properties);
 
 protected:
diff --git a/libraries/pointers/src/Pointer.h b/libraries/pointers/src/Pointer.h
index 0c842dbd88..96b43e317b 100644
--- a/libraries/pointers/src/Pointer.h
+++ b/libraries/pointers/src/Pointer.h
@@ -50,6 +50,8 @@ public:
     virtual void setRenderState(const std::string& state) = 0;
     virtual void editRenderState(const std::string& state, const QVariant& startProps, const QVariant& pathProps, const QVariant& endProps) = 0;
     
+    virtual QVector<QUuid> getOverlayIDs() = 0;
+
     virtual void setPrecisionPicking(bool precisionPicking);
     virtual void setIgnoreItems(const QVector<QUuid>& ignoreItems) const;
     virtual void setIncludeItems(const QVector<QUuid>& includeItems) const;
diff --git a/libraries/pointers/src/PointerManager.cpp b/libraries/pointers/src/PointerManager.cpp
index be890da392..6a395ecac2 100644
--- a/libraries/pointers/src/PointerManager.cpp
+++ b/libraries/pointers/src/PointerManager.cpp
@@ -144,4 +144,13 @@ bool PointerManager::isMouse(unsigned int uid) {
         return pointer->isMouse();
     }
     return false;
-}
\ No newline at end of file
+}
+
+QVector<QUuid> PointerManager::getOverlayIDs(unsigned int uid) {
+    auto pointer = find(uid);
+    if (pointer) {
+        return pointer->getOverlayIDs();
+    }
+    QVector<QUuid> empty;
+    return empty;
+}
diff --git a/libraries/pointers/src/PointerManager.h b/libraries/pointers/src/PointerManager.h
index b98558622f..0b6dcd6eae 100644
--- a/libraries/pointers/src/PointerManager.h
+++ b/libraries/pointers/src/PointerManager.h
@@ -44,6 +44,8 @@ public:
     bool isRightHand(unsigned int uid);
     bool isMouse(unsigned int uid);
 
+    QVector<QUuid> getOverlayIDs(unsigned int uid);
+
     static const unsigned int MOUSE_POINTER_ID { PointerEvent::INVALID_POINTER_ID + 1 };
 
 private:
diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js
index 2b273c60d6..a2d1c30793 100644
--- a/scripts/system/controllers/controllerModules/teleport.js
+++ b/scripts/system/controllers/controllerModules/teleport.js
@@ -199,6 +199,17 @@ Script.include("/~/system/libraries/controllers.js");
             maxDistance: 8.0
         });
 
+        this.addToSelectedItemsList = function (overlays) {
+            for (var i = 0, length = overlays.length; i < length; i++) {
+                Selection.addToSelectedItemsList(this.teleporterSelectionName, "overlay", overlays[i]);
+            }
+        };
+
+        this.addToSelectedItemsList(Pointers.getOverlayIDs(this.teleportParabolaHandVisible));
+        this.addToSelectedItemsList(Pointers.getOverlayIDs(this.teleportParabolaHandInvisible));
+        this.addToSelectedItemsList(Pointers.getOverlayIDs(this.teleportParabolaHeadVisible));
+        this.addToSelectedItemsList(Pointers.getOverlayIDs(this.teleportParabolaHeadInvisible));
+
 
         this.PLAY_AREA_OVERLAY_MODEL = Script.resolvePath("../../assets/models/trackingSpacev2.fbx");
         this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS = { x: 2, y: 0.2, z: 2 };