From 09770920a87459db513d3a795979aec6852f18e2 Mon Sep 17 00:00:00 2001 From: Wayne Chen Date: Mon, 28 Jan 2019 11:12:12 -0800 Subject: [PATCH 1/6] only initialize plugin if oculus store starting --- plugins/oculus/src/OculusPlatformPlugin.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/oculus/src/OculusPlatformPlugin.cpp b/plugins/oculus/src/OculusPlatformPlugin.cpp index 27fb98c8b5..6b9ed05fc0 100644 --- a/plugins/oculus/src/OculusPlatformPlugin.cpp +++ b/plugins/oculus/src/OculusPlatformPlugin.cpp @@ -17,11 +17,15 @@ QString OculusAPIPlugin::NAME { "Oculus Rift" }; OculusAPIPlugin::OculusAPIPlugin() { - _session = hifi::ovr::acquireRenderSession(); + if (isRunning()) { + _session = hifi::ovr::acquireRenderSession(); + } } OculusAPIPlugin::~OculusAPIPlugin() { - hifi::ovr::releaseRenderSession(_session); + if (isRunning()) { + hifi::ovr::releaseRenderSession(_session); + } } bool OculusAPIPlugin::isRunning() const { From c06f2f337ea706a87174f5651e6b819b4ed21291 Mon Sep 17 00:00:00 2001 From: Wayne Chen Date: Mon, 28 Jan 2019 14:20:03 -0800 Subject: [PATCH 2/6] adding code for if oculus is running --- plugins/oculus/src/OculusPlatformPlugin.cpp | 134 ++++++++++---------- 1 file changed, 70 insertions(+), 64 deletions(-) diff --git a/plugins/oculus/src/OculusPlatformPlugin.cpp b/plugins/oculus/src/OculusPlatformPlugin.cpp index 6b9ed05fc0..52bb167acf 100644 --- a/plugins/oculus/src/OculusPlatformPlugin.cpp +++ b/plugins/oculus/src/OculusPlatformPlugin.cpp @@ -17,23 +17,27 @@ QString OculusAPIPlugin::NAME { "Oculus Rift" }; OculusAPIPlugin::OculusAPIPlugin() { - if (isRunning()) { + if (hifi::ovr::available()) { _session = hifi::ovr::acquireRenderSession(); } } OculusAPIPlugin::~OculusAPIPlugin() { - if (isRunning()) { + if (hifi::ovr::available() && isRunning()) { hifi::ovr::releaseRenderSession(_session); } } bool OculusAPIPlugin::isRunning() const { - return (qApp->property(hifi::properties::OCULUS_STORE).toBool()); + return _session; } void OculusAPIPlugin::requestNonceAndUserID(NonceUserIDCallback callback) { #ifdef OCULUS_APP_ID + if (!isRunning()) { + return; + } + _nonceUserIDCallback = callback; ovr_User_GetUserProof(); ovr_User_GetLoggedInUser(); @@ -42,72 +46,74 @@ void OculusAPIPlugin::requestNonceAndUserID(NonceUserIDCallback callback) { void OculusAPIPlugin::handleOVREvents() { #ifdef OCULUS_APP_ID - if (qApp->property(hifi::properties::OCULUS_STORE).toBool()) { - // pop messages to see if we got a return for an entitlement check - ovrMessageHandle message { nullptr }; + if (!isRunning()) { + return; + } - // pop the next message to check, if there is one - while ((message = ovr_PopMessage())) { - switch (ovr_Message_GetType(message)) { - case ovrMessage_Entitlement_GetIsViewerEntitled: { - if (!ovr_Message_IsError(message)) { - // this viewer is entitled, no need to flag anything - qCDebug(oculusLog) << "Oculus Platform entitlement check succeeded, proceeding normally"; - } else { - // we failed the entitlement check, quit - qCDebug(oculusLog) << "Oculus Platform entitlement check failed, app will now quit" << OCULUS_APP_ID; - QMetaObject::invokeMethod(qApp, "quit"); - } - break; - } - case ovrMessage_User_Get: { - if (!ovr_Message_IsError(message)) { - qCDebug(oculusLog) << "Oculus Platform user retrieval succeeded"; - ovrUserHandle user = ovr_Message_GetUser(message); - _user = ovr_User_GetOculusID(user); - // went all the way through the `requestNonceAndUserID()` pipeline successfully. - } else { - qCDebug(oculusLog) << "Oculus Platform user retrieval failed" << QString(ovr_Error_GetMessage(ovr_Message_GetError(message))); - // emit the signal so we don't hang for it anywhere else. - _user = ""; - } - break; - } - case ovrMessage_User_GetLoggedInUser: { - if (!ovr_Message_IsError(message)) { - ovrUserHandle user = ovr_Message_GetUser(message); - _userID = ovr_User_GetID(user); - ovr_User_Get(_userID); - } else { - qCDebug(oculusLog) << "Oculus Platform user ID retrieval failed" << QString(ovr_Error_GetMessage(ovr_Message_GetError(message))); - // emit the signal so we don't hang for it anywhere else. - } - _userIDChanged = true; - break; - } - case ovrMessage_User_GetUserProof: { - if (!ovr_Message_IsError(message)) { - ovrUserProofHandle userProof = ovr_Message_GetUserProof(message); - _nonce = ovr_UserProof_GetNonce(userProof); - qCDebug(oculusLog) << "Oculus Platform nonce retrieval succeeded: " << _nonce; - } else { - qCDebug(oculusLog) << "Oculus Platform nonce retrieval failed" << QString(ovr_Error_GetMessage(ovr_Message_GetError(message))); - _nonce = ""; - // emit the signal so we don't hang for it anywhere else. - } - _nonceChanged = true; - break; + // pop messages to see if we got a return for an entitlement check + ovrMessageHandle message { nullptr }; + + // pop the next message to check, if there is one + while ((message = ovr_PopMessage())) { + switch (ovr_Message_GetType(message)) { + case ovrMessage_Entitlement_GetIsViewerEntitled: { + if (!ovr_Message_IsError(message)) { + // this viewer is entitled, no need to flag anything + qCDebug(oculusLog) << "Oculus Platform entitlement check succeeded, proceeding normally"; + } else { + // we failed the entitlement check, quit + qCDebug(oculusLog) << "Oculus Platform entitlement check failed, app will now quit" << OCULUS_APP_ID; + QMetaObject::invokeMethod(qApp, "quit"); } + break; } - - if (_nonceChanged && _userIDChanged) { - _nonceUserIDCallback(_nonce, QString::number(_userID)); - _nonceChanged = _userIDChanged = false; + case ovrMessage_User_Get: { + if (!ovr_Message_IsError(message)) { + qCDebug(oculusLog) << "Oculus Platform user retrieval succeeded"; + ovrUserHandle user = ovr_Message_GetUser(message); + _user = ovr_User_GetOculusID(user); + // went all the way through the `requestNonceAndUserID()` pipeline successfully. + } else { + qCDebug(oculusLog) << "Oculus Platform user retrieval failed" << QString(ovr_Error_GetMessage(ovr_Message_GetError(message))); + // emit the signal so we don't hang for it anywhere else. + _user = ""; + } + break; + } + case ovrMessage_User_GetLoggedInUser: { + if (!ovr_Message_IsError(message)) { + ovrUserHandle user = ovr_Message_GetUser(message); + _userID = ovr_User_GetID(user); + ovr_User_Get(_userID); + } else { + qCDebug(oculusLog) << "Oculus Platform user ID retrieval failed" << QString(ovr_Error_GetMessage(ovr_Message_GetError(message))); + // emit the signal so we don't hang for it anywhere else. + } + _userIDChanged = true; + break; + } + case ovrMessage_User_GetUserProof: { + if (!ovr_Message_IsError(message)) { + ovrUserProofHandle userProof = ovr_Message_GetUserProof(message); + _nonce = ovr_UserProof_GetNonce(userProof); + qCDebug(oculusLog) << "Oculus Platform nonce retrieval succeeded: " << _nonce; + } else { + qCDebug(oculusLog) << "Oculus Platform nonce retrieval failed" << QString(ovr_Error_GetMessage(ovr_Message_GetError(message))); + _nonce = ""; + // emit the signal so we don't hang for it anywhere else. + } + _nonceChanged = true; + break; } - - // free the message handle to cleanup and not leak - ovr_FreeMessage(message); } + + if (_nonceChanged && _userIDChanged) { + _nonceUserIDCallback(_nonce, QString::number(_userID)); + _nonceChanged = _userIDChanged = false; + } + + // free the message handle to cleanup and not leak + ovr_FreeMessage(message); } #endif } From 0f1aebea82025728575c744713324daa5100f341 Mon Sep 17 00:00:00 2001 From: Wayne Chen Date: Mon, 28 Jan 2019 14:35:41 -0800 Subject: [PATCH 3/6] adding init/shutdown for plugin init --- interface/src/Application.cpp | 8 ++++++++ .../plugins/src/plugins/OculusPlatformPlugin.h | 3 +++ plugins/oculus/src/OculusPlatformPlugin.cpp | 13 +++++++++---- plugins/oculus/src/OculusPlatformPlugin.h | 4 ++++ 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2db440291d..2135014ca4 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -800,6 +800,10 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) { if (auto steamClient = pluginManager->getSteamClientPlugin()) { steamClient->init(); } + if (auto oculusPlatform = pluginManager->getOculusPlatformPlugin()) { + oculusPlatform->init(); + } + PROFILE_SET_THREAD_NAME("Main Thread"); #if defined(Q_OS_WIN) @@ -2667,6 +2671,10 @@ Application::~Application() { steamClient->shutdown(); } + if (auto oculusPlatform = PluginManager::getInstance()->getOculusPlatformPlugin()) { + oculusPlatform->shutdown(); + } + DependencyManager::destroy(); DependencyManager::destroy(); // must be destroyed before the FramebufferCache diff --git a/libraries/plugins/src/plugins/OculusPlatformPlugin.h b/libraries/plugins/src/plugins/OculusPlatformPlugin.h index 93bf534c6e..d5e54f30f1 100644 --- a/libraries/plugins/src/plugins/OculusPlatformPlugin.h +++ b/libraries/plugins/src/plugins/OculusPlatformPlugin.h @@ -20,6 +20,9 @@ public: virtual QString getName() const = 0; virtual QString getOculusUserID() const = 0; + virtual bool init() = 0; + virtual void shutdown() = 0; + virtual bool isRunning() const = 0; virtual void requestNonceAndUserID(NonceUserIDCallback callback) = 0; diff --git a/plugins/oculus/src/OculusPlatformPlugin.cpp b/plugins/oculus/src/OculusPlatformPlugin.cpp index 52bb167acf..1fbf08d0bd 100644 --- a/plugins/oculus/src/OculusPlatformPlugin.cpp +++ b/plugins/oculus/src/OculusPlatformPlugin.cpp @@ -17,13 +17,18 @@ QString OculusAPIPlugin::NAME { "Oculus Rift" }; OculusAPIPlugin::OculusAPIPlugin() { - if (hifi::ovr::available()) { - _session = hifi::ovr::acquireRenderSession(); - } } OculusAPIPlugin::~OculusAPIPlugin() { - if (hifi::ovr::available() && isRunning()) { +} + +bool OculusAPIPlugin::init() { + _session = hifi::ovr::acquireRenderSession(); + return _session; +} + +void OculusAPIPlugin::shutdown() { + if (isRunning()) { hifi::ovr::releaseRenderSession(_session); } } diff --git a/plugins/oculus/src/OculusPlatformPlugin.h b/plugins/oculus/src/OculusPlatformPlugin.h index 3d80540419..fd4f9763e3 100644 --- a/plugins/oculus/src/OculusPlatformPlugin.h +++ b/plugins/oculus/src/OculusPlatformPlugin.h @@ -23,6 +23,10 @@ public: bool isRunning() const; + bool init(); + + void shutdown(); + virtual void requestNonceAndUserID(NonceUserIDCallback callback); virtual void handleOVREvents(); From e4c3011a0b23ac837a8b79d508c826b192f50379 Mon Sep 17 00:00:00 2001 From: Wayne Chen Date: Mon, 28 Jan 2019 14:37:18 -0800 Subject: [PATCH 4/6] only init platform if oculus store is running --- plugins/oculus/src/OculusPlatformPlugin.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/oculus/src/OculusPlatformPlugin.cpp b/plugins/oculus/src/OculusPlatformPlugin.cpp index 1fbf08d0bd..91ca4abe22 100644 --- a/plugins/oculus/src/OculusPlatformPlugin.cpp +++ b/plugins/oculus/src/OculusPlatformPlugin.cpp @@ -23,7 +23,9 @@ OculusAPIPlugin::~OculusAPIPlugin() { } bool OculusAPIPlugin::init() { - _session = hifi::ovr::acquireRenderSession(); + if (qApp->property(hifi::properties::OCULUS_STORE).toBool()) { + _session = hifi::ovr::acquireRenderSession(); + } return _session; } From 28ab4096d0bdfbedeb721c85377b4ed66354ef73 Mon Sep 17 00:00:00 2001 From: Wayne Chen Date: Mon, 28 Jan 2019 14:44:00 -0800 Subject: [PATCH 5/6] optimizing ctor/dtor --- plugins/oculus/src/OculusPlatformPlugin.cpp | 6 ------ plugins/oculus/src/OculusPlatformPlugin.h | 4 ++-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/plugins/oculus/src/OculusPlatformPlugin.cpp b/plugins/oculus/src/OculusPlatformPlugin.cpp index 91ca4abe22..8a5fcf496c 100644 --- a/plugins/oculus/src/OculusPlatformPlugin.cpp +++ b/plugins/oculus/src/OculusPlatformPlugin.cpp @@ -16,12 +16,6 @@ QString OculusAPIPlugin::NAME { "Oculus Rift" }; -OculusAPIPlugin::OculusAPIPlugin() { -} - -OculusAPIPlugin::~OculusAPIPlugin() { -} - bool OculusAPIPlugin::init() { if (qApp->property(hifi::properties::OCULUS_STORE).toBool()) { _session = hifi::ovr::acquireRenderSession(); diff --git a/plugins/oculus/src/OculusPlatformPlugin.h b/plugins/oculus/src/OculusPlatformPlugin.h index fd4f9763e3..d466014c68 100644 --- a/plugins/oculus/src/OculusPlatformPlugin.h +++ b/plugins/oculus/src/OculusPlatformPlugin.h @@ -16,8 +16,8 @@ class OculusAPIPlugin : public OculusPlatformPlugin { public: - OculusAPIPlugin(); - virtual ~OculusAPIPlugin(); + OculusAPIPlugin() = default; + virtual ~OculusAPIPlugin() = default; QString getName() const { return NAME; } QString getOculusUserID() const { return _user; }; From 0cbaea4e275860c350dc5a15f69f1f83b7204058 Mon Sep 17 00:00:00 2001 From: Wayne Chen Date: Mon, 28 Jan 2019 14:46:50 -0800 Subject: [PATCH 6/6] callback return upon request if not running --- plugins/oculus/src/OculusPlatformPlugin.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/oculus/src/OculusPlatformPlugin.cpp b/plugins/oculus/src/OculusPlatformPlugin.cpp index 8a5fcf496c..02807f85b2 100644 --- a/plugins/oculus/src/OculusPlatformPlugin.cpp +++ b/plugins/oculus/src/OculusPlatformPlugin.cpp @@ -36,6 +36,8 @@ bool OculusAPIPlugin::isRunning() const { void OculusAPIPlugin::requestNonceAndUserID(NonceUserIDCallback callback) { #ifdef OCULUS_APP_ID if (!isRunning()) { + qCWarning(oculusLog) << "Oculus request failed: Oculus platform plugin not running"; + callback("", ""); return; }