From d1318ae99eb48247deea1878e144bf1474c3fcc9 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Fri, 3 Nov 2017 11:51:03 -0700 Subject: [PATCH 1/6] 8495 No mirror camera in HMD mode --- interface/src/Application.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b21588958e..bd31fc398e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4441,7 +4441,7 @@ void Application::cameraModeChanged() { void Application::cameraMenuChanged() { auto menu = Menu::getInstance(); if (menu->isOptionChecked(MenuOption::FullscreenMirror)) { - if (_myCamera.getMode() != CAMERA_MODE_MIRROR) { + if (!isHMDMode() && _myCamera.getMode() != CAMERA_MODE_MIRROR) { _myCamera.setMode(CAMERA_MODE_MIRROR); getMyAvatar()->reset(false, false, false); // to reset any active MyAvatar::FollowHelpers } @@ -7271,6 +7271,10 @@ void Application::updateDisplayMode() { menu->setIsOptionChecked(MenuOption::FirstPerson, true); cameraMenuChanged(); } + + // Remove the mirror camera option from menu if in HMD mode + auto mirrorAction = menu->getActionForOption(MenuOption::FullscreenMirror); + mirrorAction->setVisible(!isHmd); Q_ASSERT_X(_displayPlugin, "Application::updateDisplayMode", "could not find an activated display plugin"); } From 8596d78aa63432e069dac144ee9ceb66f8705b52 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Mon, 6 Nov 2017 08:03:07 -0700 Subject: [PATCH 2/6] Not posible to change to mirror mode using js --- interface/src/Application.cpp | 7 ++++++- libraries/shared/src/shared/Camera.cpp | 1 + libraries/shared/src/shared/Camera.h | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index bd31fc398e..7172a3eab7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4423,7 +4423,12 @@ void Application::cameraModeChanged() { Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, true); break; case CAMERA_MODE_MIRROR: - Menu::getInstance()->setIsOptionChecked(MenuOption::FullscreenMirror, true); + if (isHMDMode()) { + _myCamera.setMode(_myCamera.getLastMode()); + qDebug() << "Mirror mode is not available"; + } else { + Menu::getInstance()->setIsOptionChecked(MenuOption::FullscreenMirror, true); + } break; case CAMERA_MODE_INDEPENDENT: Menu::getInstance()->setIsOptionChecked(MenuOption::IndependentMode, true); diff --git a/libraries/shared/src/shared/Camera.cpp b/libraries/shared/src/shared/Camera.cpp index ab841c4717..100124a416 100644 --- a/libraries/shared/src/shared/Camera.cpp +++ b/libraries/shared/src/shared/Camera.cpp @@ -85,6 +85,7 @@ void Camera::setOrientation(const glm::quat& orientation) { } void Camera::setMode(CameraMode mode) { + _lastMode = _mode; _mode = mode; emit modeUpdated(modeToString(mode)); } diff --git a/libraries/shared/src/shared/Camera.h b/libraries/shared/src/shared/Camera.h index 3ad08bd719..11d4cf4254 100644 --- a/libraries/shared/src/shared/Camera.h +++ b/libraries/shared/src/shared/Camera.h @@ -56,6 +56,7 @@ public: void update(); CameraMode getMode() const { return _mode; } + CameraMode getLastMode() const { return _lastMode; } void setMode(CameraMode m); void loadViewFrustum(ViewFrustum& frustum) const; @@ -123,6 +124,7 @@ private: void decompose(); CameraMode _mode{ CAMERA_MODE_THIRD_PERSON }; + CameraMode _lastMode{ _mode }; glm::mat4 _transform; glm::mat4 _projection; From 5d4a3b65e473a0ead7b06c1f48017a573b3eb794 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 9 Nov 2017 18:27:16 -0700 Subject: [PATCH 3/6] Allow script to change to mirror camera in HMD --- interface/src/Application.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7172a3eab7..bd31fc398e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4423,12 +4423,7 @@ void Application::cameraModeChanged() { Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, true); break; case CAMERA_MODE_MIRROR: - if (isHMDMode()) { - _myCamera.setMode(_myCamera.getLastMode()); - qDebug() << "Mirror mode is not available"; - } else { - Menu::getInstance()->setIsOptionChecked(MenuOption::FullscreenMirror, true); - } + Menu::getInstance()->setIsOptionChecked(MenuOption::FullscreenMirror, true); break; case CAMERA_MODE_INDEPENDENT: Menu::getInstance()->setIsOptionChecked(MenuOption::IndependentMode, true); From 7af1a5ca6999f74283f22f4700ddf5cd17ca7512 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Mon, 13 Nov 2017 06:10:17 -0700 Subject: [PATCH 4/6] clean up unused lastmode --- libraries/shared/src/shared/Camera.cpp | 1 - libraries/shared/src/shared/Camera.h | 2 -- 2 files changed, 3 deletions(-) diff --git a/libraries/shared/src/shared/Camera.cpp b/libraries/shared/src/shared/Camera.cpp index 100124a416..ab841c4717 100644 --- a/libraries/shared/src/shared/Camera.cpp +++ b/libraries/shared/src/shared/Camera.cpp @@ -85,7 +85,6 @@ void Camera::setOrientation(const glm::quat& orientation) { } void Camera::setMode(CameraMode mode) { - _lastMode = _mode; _mode = mode; emit modeUpdated(modeToString(mode)); } diff --git a/libraries/shared/src/shared/Camera.h b/libraries/shared/src/shared/Camera.h index 11d4cf4254..3ad08bd719 100644 --- a/libraries/shared/src/shared/Camera.h +++ b/libraries/shared/src/shared/Camera.h @@ -56,7 +56,6 @@ public: void update(); CameraMode getMode() const { return _mode; } - CameraMode getLastMode() const { return _lastMode; } void setMode(CameraMode m); void loadViewFrustum(ViewFrustum& frustum) const; @@ -124,7 +123,6 @@ private: void decompose(); CameraMode _mode{ CAMERA_MODE_THIRD_PERSON }; - CameraMode _lastMode{ _mode }; glm::mat4 _transform; glm::mat4 _projection; From 05a38a78c517db0b3c646eac24ca9b1cb7824d57 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Nov 2017 14:08:27 -0800 Subject: [PATCH 5/6] don't send octree data without first query --- assignment-client/src/octree/OctreeSendThread.cpp | 5 +++-- libraries/octree/src/OctreeQuery.h | 2 +- libraries/octree/src/OctreeQueryNode.cpp | 6 ++++++ libraries/octree/src/OctreeQueryNode.h | 6 ++++++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 89e3d403fc..024071db0a 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -82,8 +82,9 @@ bool OctreeSendThread::process() { if (auto node = _node.lock()) { OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); - // Sometimes the node data has not yet been linked, in which case we can't really do anything - if (nodeData && !nodeData->isShuttingDown()) { + // If we don't have the OctreeQueryNode or it's uninitialized because we haven't received + // a query yet from the client then we can't send an entity data packet + if (nodeData && nodeData->hasReceivedFirstQuery() && !nodeData->isShuttingDown()) { bool viewFrustumChanged = nodeData->updateCurrentViewFrustum(); packetDistributor(node, nodeData, viewFrustumChanged); } diff --git a/libraries/octree/src/OctreeQuery.h b/libraries/octree/src/OctreeQuery.h index fc9ea525e6..bbd0350baf 100644 --- a/libraries/octree/src/OctreeQuery.h +++ b/libraries/octree/src/OctreeQuery.h @@ -31,7 +31,7 @@ public: virtual ~OctreeQuery() {} int getBroadcastData(unsigned char* destinationBuffer); - int parseData(ReceivedMessage& message) override; + virtual int parseData(ReceivedMessage& message) override; // getters for camera details const glm::vec3& getCameraPosition() const { return _cameraPosition; } diff --git a/libraries/octree/src/OctreeQueryNode.cpp b/libraries/octree/src/OctreeQueryNode.cpp index c26b4ce77b..941bb6b536 100644 --- a/libraries/octree/src/OctreeQueryNode.cpp +++ b/libraries/octree/src/OctreeQueryNode.cpp @@ -18,6 +18,12 @@ #include #include +int OctreeQueryNode::parseData(ReceivedMessage& message) { + // set our flag to indicate that we've parsed for this query at least once + _hasReceivedFirstQuery = true; + + return OctreeQuery::parseData(message); +} void OctreeQueryNode::nodeKilled() { _isShuttingDown = true; diff --git a/libraries/octree/src/OctreeQueryNode.h b/libraries/octree/src/OctreeQueryNode.h index fd89a89949..fac118c628 100644 --- a/libraries/octree/src/OctreeQueryNode.h +++ b/libraries/octree/src/OctreeQueryNode.h @@ -35,6 +35,8 @@ public: void init(); // called after creation to set up some virtual items virtual PacketType getMyPacketType() const = 0; + virtual int parseData(ReceivedMessage& message) override; + void resetOctreePacket(); // resets octree packet to after "V" header void writeToPacket(const unsigned char* buffer, unsigned int bytes); // writes to end of packet @@ -106,6 +108,8 @@ public: bool shouldForceFullScene() const { return _shouldForceFullScene; } void setShouldForceFullScene(bool shouldForceFullScene) { _shouldForceFullScene = shouldForceFullScene; } + bool hasReceivedFirstQuery() const { return _hasReceivedFirstQuery; } + private: OctreeQueryNode(const OctreeQueryNode &); OctreeQueryNode& operator= (const OctreeQueryNode&); @@ -153,6 +157,8 @@ private: QJsonObject _lastCheckJSONParameters; bool _shouldForceFullScene { false }; + + bool _hasReceivedFirstQuery { false }; }; #endif // hifi_OctreeQueryNode_h From 557ee458ecf01cbfcd44a8d3d3574e065c51bcc6 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Nov 2017 17:06:46 -0800 Subject: [PATCH 6/6] wait for node active socket before constructing packets --- assignment-client/src/octree/OctreeSendThread.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 024071db0a..3ae653307f 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -82,9 +82,12 @@ bool OctreeSendThread::process() { if (auto node = _node.lock()) { OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); - // If we don't have the OctreeQueryNode or it's uninitialized because we haven't received - // a query yet from the client then we can't send an entity data packet - if (nodeData && nodeData->hasReceivedFirstQuery() && !nodeData->isShuttingDown()) { + // If we don't have the OctreeQueryNode at all + // or it's uninitialized because we haven't received a query yet from the client + // or we don't know where we should send packets for this node + // or we're shutting down + // then we can't send an entity data packet + if (nodeData && nodeData->hasReceivedFirstQuery() && node->getActiveSocket() && !nodeData->isShuttingDown()) { bool viewFrustumChanged = nodeData->updateCurrentViewFrustum(); packetDistributor(node, nodeData, viewFrustumChanged); }