diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index 8035f9d701..0b6ff49d71 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -510,16 +510,14 @@ Cursor = (function(params) { }); } var editobject = {}; - //if (MyAvatar.getHeadFinalYaw() <= VIEW_ANGLE_BY_TWO && MyAvatar.getHeadFinalYaw() >= -1 * VIEW_ANGLE_BY_TWO) { - //angle = ((-1 * MyAvatar.getHeadFinalYaw()) + VIEW_ANGLE_BY_TWO) / VIEW_ANGLE; - tthis.x = HMD.getHUDLookAtPositionX;//angle * windowDimensions.x; + if (tthis.x !== HMD.getHUDLookAtPosition2D.x) { + tthis.x = HMD.getHUDLookAtPosition2D.x; editobject.x = tthis.x - (CURSOR_WIDTH / 2); - // } - // if (MyAvatar.getHeadFinalPitch() <= VIEW_ANGLE_BY_TWO && MyAvatar.getHeadFinalPitch() >= -1 * VIEW_ANGLE_BY_TWO) { - // angle = ((-1 * MyAvatar.getHeadFinalPitch()) + VIEW_ANGLE_BY_TWO) / VIEW_ANGLE; - tthis.y = HMD.getHUDLookAtPositionY;//angle * windowDimensions.y; + } + if (tthis.y !== HMD.getHUDLookAtPosition2D.y) { + tthis.y = HMD.getHUDLookAtPosition2D.y; editobject.y = tthis.y - (CURSOR_HEIGHT / 2); - // } + } if (Object.keys(editobject).length > 0) { Overlays.editOverlay(tthis.overlay, editobject); if (tthis.onUpdate != null) { diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index 256c09f602..47279a40f9 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -685,7 +685,7 @@ void OculusManager::getEulerAngles(float& yaw, float& pitch, float& roll) { roll = 0.0f; #endif } - + glm::vec3 OculusManager::getRelativePosition() { #if (defined(__APPLE__) || defined(_WIN32)) && HAVE_LIBOVR ovrTrackingState trackingState = ovrHmd_GetTrackingState(_ovrHmd, ovr_GetTimeInSeconds()); diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index b9b9b103e4..caf37e27be 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -15,3 +15,30 @@ HMDScriptingInterface& HMDScriptingInterface::getInstance() { static HMDScriptingInterface sharedInstance; return sharedInstance; } + +glm::vec3 HMDScriptingInterface::getHUDLookAtPosition3D() const { + Camera* camera = Application::getInstance()->getCamera(); + glm::vec3 position = camera->getPosition(); + glm::quat orientation = camera->getOrientation(); + + glm::vec3 direction = orientation * glm::vec3(0.0f, 0.0f, -1.0f); + + ApplicationOverlay& applicationOverlay = Application::getInstance()->getApplicationOverlay(); + + glm::vec3 result; + applicationOverlay.calculateRayUICollisionPoint(position, direction, result); + return result; +} + +glm::vec2 HMDScriptingInterface::getHUDLookAtPosition2D() const { + MyAvatar* myAvatar = Application::getInstance()->getAvatar(); + glm::vec3 sphereCenter = myAvatar->getDefaultEyePosition(); + + glm::vec3 hudIntersection = getHUDLookAtPosition3D(); + + glm::vec3 direction = glm::inverse(myAvatar->getOrientation()) * (hudIntersection - sphereCenter); + glm::quat rotation = ::rotationBetween(glm::vec3(0.0f, 0.0f, -1.0f), direction); + glm::vec3 eulers = ::safeEulerAngles(rotation); + + return Application::getInstance()->getApplicationOverlay().sphericalToOverlay(glm::vec2(eulers.y, -eulers.x));; +} diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h index a4950008eb..cc148d5d5d 100644 --- a/interface/src/scripting/HMDScriptingInterface.h +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -21,8 +21,8 @@ class HMDScriptingInterface : public QObject { Q_OBJECT Q_PROPERTY(bool magnifier READ getMagnifier) Q_PROPERTY(bool active READ isHMDMode) - Q_PROPERTY(float getHUDLookAtPositionX READ getHUDLookAtPositionX) - Q_PROPERTY(float getHUDLookAtPositionY READ getHUDLookAtPositionY) + Q_PROPERTY(glm::vec3 HUDLookAtPosition3D READ getHUDLookAtPosition3D) + Q_PROPERTY(glm::vec2 HUDLookAtPosition2D READ getHUDLookAtPosition2D) public: static HMDScriptingInterface& getInstance(); @@ -33,22 +33,9 @@ private: HMDScriptingInterface() {}; bool getMagnifier() const { return Application::getInstance()->getApplicationOverlay().hasMagnifier(); }; bool isHMDMode() const { return Application::getInstance()->isHMDMode(); } - float getHUDLookAtPositionX() const { - float pitch, yaw, roll; - OculusManager::getEulerAngles(yaw, pitch, roll); - glm::vec3 relativePos = OculusManager::getRelativePosition(); - glm::quat rotation = ::rotationBetween(glm::vec3(), relativePos); - glm::vec2 screenPos = Application::getInstance()->getApplicationOverlay().sphericalToOverlay(glm::vec2(yaw, -pitch)); - - return screenPos.x; - } - float getHUDLookAtPositionY() const { - float pitch, yaw, roll; - OculusManager::getEulerAngles(yaw, pitch, roll); - glm::vec2 screenPos = Application::getInstance()->getApplicationOverlay().sphericalToOverlay(glm::vec2(yaw, -pitch)); - return screenPos.y; - } + glm::vec3 getHUDLookAtPosition3D() const; + glm::vec2 getHUDLookAtPosition2D() const; }; #endif // hifi_HMDScriptingInterface_h