From e12ed1c5d62fc9ba15aac1919e000a34237665d6 Mon Sep 17 00:00:00 2001 From: Roxanne Skelly Date: Thu, 30 May 2019 14:17:19 -0700 Subject: [PATCH 01/15] high_resolution_clock behaves differently on windows and linux on linux, time_since_epoch returns time since linux epoch, on windows, it returns time since system start. Math between those values on two different types of machines was coming out bad. --- domain-server/src/DomainServer.cpp | 4 ++-- libraries/networking/src/NodeList.cpp | 13 ++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 9a2aaca18b..3613b5e886 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1174,8 +1174,8 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, quint64 r extendedHeaderStream << node->getPermissions(); extendedHeaderStream << limitedNodeList->getAuthenticatePackets(); extendedHeaderStream << nodeData->getLastDomainCheckinTimestamp(); - extendedHeaderStream << requestPacketReceiveTime; - extendedHeaderStream << quint64(duration_cast(p_high_resolution_clock::now().time_since_epoch()).count()); + extendedHeaderStream << duration_cast(system_clock::now().time_since_epoch()).count(); + extendedHeaderStream << quint64(duration_cast(p_high_resolution_clock::now().time_since_epoch()).count()) - requestPacketReceiveTime; auto domainListPackets = NLPacketList::create(PacketType::DomainList, extendedHeader); // always send the node their own UUID back diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index ae2a495431..038d656dbb 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -416,7 +416,7 @@ void NodeList::sendDomainServerCheckIn() { packetStream << FingerprintUtils::getMachineFingerprint(); } - packetStream << quint64(duration_cast(p_high_resolution_clock::now().time_since_epoch()).count()); + packetStream << quint64(duration_cast(system_clock::now().time_since_epoch()).count()); // pack our data to send to the domain-server including // the hostname information (so the domain-server can see which place name we came in on) @@ -649,21 +649,20 @@ void NodeList::processDomainServerList(QSharedPointer message) bool isAuthenticated; packetStream >> isAuthenticated; - qint64 now = qint64(duration_cast(p_high_resolution_clock::now().time_since_epoch()).count()); + qint64 now = qint64(duration_cast(system_clock::now().time_since_epoch()).count()); quint64 connectRequestTimestamp; packetStream >> connectRequestTimestamp; - quint64 domainServerRequestReceiveTime; - packetStream >> domainServerRequestReceiveTime; - quint64 domainServerPingSendTime; packetStream >> domainServerPingSendTime; + quint64 domainServerCheckinProcessingTime; + packetStream >> domainServerCheckinProcessingTime; + qint64 pingLagTime = (now - qint64(connectRequestTimestamp)) / qint64(USECS_PER_MSEC); - qint64 domainServerRequestLag = (qint64(domainServerRequestReceiveTime) - qint64(connectRequestTimestamp)) / qint64(USECS_PER_MSEC); - quint64 domainServerCheckinProcessingTime = domainServerPingSendTime - domainServerRequestReceiveTime; + qint64 domainServerRequestLag = (qint64(domainServerPingSendTime - domainServerCheckinProcessingTime) - qint64(connectRequestTimestamp)) / qint64(USECS_PER_MSEC);; qint64 domainServerResponseLag = (now - qint64(domainServerPingSendTime)) / qint64(USECS_PER_MSEC); if (_domainHandler.getSockAddr().isNull()) { From 4d8607a937b7ddc4541bff6b1361c3b45be49d19 Mon Sep 17 00:00:00 2001 From: Roxanne Skelly Date: Thu, 30 May 2019 14:54:54 -0700 Subject: [PATCH 02/15] linux build issue --- domain-server/src/DomainServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 3613b5e886..1941ef19b6 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1174,7 +1174,7 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, quint64 r extendedHeaderStream << node->getPermissions(); extendedHeaderStream << limitedNodeList->getAuthenticatePackets(); extendedHeaderStream << nodeData->getLastDomainCheckinTimestamp(); - extendedHeaderStream << duration_cast(system_clock::now().time_since_epoch()).count(); + extendedHeaderStream << quint64(duration_cast(system_clock::now().time_since_epoch()).count()); extendedHeaderStream << quint64(duration_cast(p_high_resolution_clock::now().time_since_epoch()).count()) - requestPacketReceiveTime; auto domainListPackets = NLPacketList::create(PacketType::DomainList, extendedHeader); From 0c916e0c03a9bead84bc74a0f949b98a12a05275 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 30 May 2019 16:08:47 -0700 Subject: [PATCH 03/15] guard MyAvatar::_scriptEngine with mutex --- interface/src/avatar/MyAvatar.cpp | 18 +++++++++++++----- interface/src/avatar/MyAvatar.h | 1 + 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 7ac2103543..b8042f1ce7 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1598,6 +1598,7 @@ void MyAvatar::handleChangedAvatarEntityData() { blobFailed = true; // blob doesn't exist return; } + std::lock_guard guard(_myScriptEngineLock); if (!EntityItemProperties::blobToProperties(*_myScriptEngine, itr.value(), properties)) { blobFailed = true; // blob is corrupt } @@ -1630,6 +1631,7 @@ void MyAvatar::handleChangedAvatarEntityData() { skip = true; return; } + std::lock_guard guard(_myScriptEngineLock); if (!EntityItemProperties::blobToProperties(*_myScriptEngine, itr.value(), properties)) { skip = true; } @@ -1737,7 +1739,10 @@ bool MyAvatar::updateStaleAvatarEntityBlobs() const { if (found) { ++numFound; QByteArray blob; - EntityItemProperties::propertiesToBlob(*_myScriptEngine, getID(), properties, blob); + { + std::lock_guard guard(_myScriptEngineLock); + EntityItemProperties::propertiesToBlob(*_myScriptEngine, getID(), properties, blob); + } _avatarEntitiesLock.withWriteLock([&] { _cachedAvatarEntityBlobs[id] = blob; }); @@ -2476,15 +2481,18 @@ QVariantList MyAvatar::getAvatarEntitiesVariant() { if (!entity) { continue; } - QVariantMap avatarEntityData; EncodeBitstreamParams params; auto desiredProperties = entity->getEntityProperties(params); desiredProperties += PROP_LOCAL_POSITION; desiredProperties += PROP_LOCAL_ROTATION; - EntityItemProperties entityProperties = entity->getProperties(desiredProperties); - QScriptValue scriptProperties = EntityItemPropertiesToScriptValue(_myScriptEngine, entityProperties); + QVariantMap avatarEntityData; avatarEntityData["id"] = entityID; - avatarEntityData["properties"] = scriptProperties.toVariant(); + { + std::lock_guard guard(_myScriptEngineLock); + EntityItemProperties entityProperties = entity->getProperties(desiredProperties); + QScriptValue scriptProperties = EntityItemPropertiesToScriptValue(_myScriptEngine, entityProperties); + avatarEntityData["properties"] = scriptProperties.toVariant(); + } avatarEntitiesData.append(QVariant(avatarEntityData)); } } diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 5b12885d1f..ee14ad1fda 100755 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -2741,6 +2741,7 @@ private: mutable std::set _staleCachedAvatarEntityBlobs; // // keep a ScriptEngine around so we don't have to instantiate on the fly (these are very slow to create/delete) + mutable std::mutex _myScriptEngineLock; QScriptEngine* _myScriptEngine { nullptr }; bool _needToSaveAvatarEntitySettings { false }; }; From 4bcc81b49ba3c6ef30812068bfeceeb2cb3d4369 Mon Sep 17 00:00:00 2001 From: Clement Date: Thu, 30 May 2019 17:56:40 -0700 Subject: [PATCH 04/15] Add logging for silent node kills --- libraries/networking/src/LimitedNodeList.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 563d6e7ad1..0eda2ee2e0 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -869,6 +869,8 @@ void LimitedNodeList::removeSilentNodes() { QSet killedNodes; + auto startedAt = usecTimestampNow(); + eachNodeHashIterator([&](NodeHash::iterator& it){ SharedNodePointer node = it->second; node->getMutex().lock(); @@ -889,7 +891,15 @@ void LimitedNodeList::removeSilentNodes() { }); foreach(const SharedNodePointer& killedNode, killedNodes) { - qCDebug(networking_ice) << "Removing silent node" << killedNode; + auto now = usecTimestampNow(); + qCDebug(networking_ice) << "Removing silent node" << *killedNode << "\n" + << " Now: " << now << "\n" + << " Started at: " << startedAt << " (" << (now - startedAt) << "us ago)\n" + << " Last Heard Microstamp: " << killedNode->getLastHeardMicrostamp() << " (" << (now - killedNode->getLastHeardMicrostamp()) << "us ago)\n" + << " Forced Never Silent: " << killedNode->isForcedNeverSilent() << "\n" + << " Inbound PPS: " << killedNode->getInboundPPS() << "\n" + << " Inbound Kbps: " << killedNode->getInboundKbps() << "\n" + << " Ping: " << killedNode->getPingMs(); handleNodeKill(killedNode); } } From 5f9262cf5e7263b2412b3b7d96aae21cf8731228 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 31 May 2019 11:03:11 -0700 Subject: [PATCH 05/15] change data member names to not poke other devs in the eye --- interface/src/avatar/MyAvatar.cpp | 24 ++++++++++++------------ interface/src/avatar/MyAvatar.h | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index b8042f1ce7..613d7f81ef 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -325,8 +325,8 @@ MyAvatar::MyAvatar(QThread* thread) : MyAvatar::~MyAvatar() { _lookAtTargetAvatar.reset(); - delete _myScriptEngine; - _myScriptEngine = nullptr; + delete _scriptEngine; + _scriptEngine = nullptr; } QString MyAvatar::getDominantHand() const { @@ -1598,8 +1598,8 @@ void MyAvatar::handleChangedAvatarEntityData() { blobFailed = true; // blob doesn't exist return; } - std::lock_guard guard(_myScriptEngineLock); - if (!EntityItemProperties::blobToProperties(*_myScriptEngine, itr.value(), properties)) { + std::lock_guard guard(_scriptEngineLock); + if (!EntityItemProperties::blobToProperties(*_scriptEngine, itr.value(), properties)) { blobFailed = true; // blob is corrupt } }); @@ -1631,8 +1631,8 @@ void MyAvatar::handleChangedAvatarEntityData() { skip = true; return; } - std::lock_guard guard(_myScriptEngineLock); - if (!EntityItemProperties::blobToProperties(*_myScriptEngine, itr.value(), properties)) { + std::lock_guard guard(_scriptEngineLock); + if (!EntityItemProperties::blobToProperties(*_scriptEngine, itr.value(), properties)) { skip = true; } }); @@ -1740,8 +1740,8 @@ bool MyAvatar::updateStaleAvatarEntityBlobs() const { ++numFound; QByteArray blob; { - std::lock_guard guard(_myScriptEngineLock); - EntityItemProperties::propertiesToBlob(*_myScriptEngine, getID(), properties, blob); + std::lock_guard guard(_scriptEngineLock); + EntityItemProperties::propertiesToBlob(*_scriptEngine, getID(), properties, blob); } _avatarEntitiesLock.withWriteLock([&] { _cachedAvatarEntityBlobs[id] = blob; @@ -1888,8 +1888,8 @@ void MyAvatar::avatarEntityDataToJson(QJsonObject& root) const { } void MyAvatar::loadData() { - if (!_myScriptEngine) { - _myScriptEngine = new QScriptEngine(); + if (!_scriptEngine) { + _scriptEngine = new QScriptEngine(); } getHead()->setBasePitch(_headPitchSetting.get()); @@ -2488,9 +2488,9 @@ QVariantList MyAvatar::getAvatarEntitiesVariant() { QVariantMap avatarEntityData; avatarEntityData["id"] = entityID; { - std::lock_guard guard(_myScriptEngineLock); + std::lock_guard guard(_scriptEngineLock); EntityItemProperties entityProperties = entity->getProperties(desiredProperties); - QScriptValue scriptProperties = EntityItemPropertiesToScriptValue(_myScriptEngine, entityProperties); + QScriptValue scriptProperties = EntityItemPropertiesToScriptValue(_scriptEngine, entityProperties); avatarEntityData["properties"] = scriptProperties.toVariant(); } avatarEntitiesData.append(QVariant(avatarEntityData)); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index ee14ad1fda..058603f320 100755 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -2741,8 +2741,8 @@ private: mutable std::set _staleCachedAvatarEntityBlobs; // // keep a ScriptEngine around so we don't have to instantiate on the fly (these are very slow to create/delete) - mutable std::mutex _myScriptEngineLock; - QScriptEngine* _myScriptEngine { nullptr }; + mutable std::mutex _scriptEngineLock; + QScriptEngine* _scriptEngine { nullptr }; bool _needToSaveAvatarEntitySettings { false }; }; From 297517c85d256041834a68aa56f430ac02703f94 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 31 May 2019 11:06:16 -0700 Subject: [PATCH 06/15] minimize lock duration --- interface/src/avatar/MyAvatar.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 613d7f81ef..ad39b6663a 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -2487,12 +2487,13 @@ QVariantList MyAvatar::getAvatarEntitiesVariant() { desiredProperties += PROP_LOCAL_ROTATION; QVariantMap avatarEntityData; avatarEntityData["id"] = entityID; + EntityItemProperties entityProperties = entity->getProperties(desiredProperties); + QScriptValue scriptProperties; { std::lock_guard guard(_scriptEngineLock); - EntityItemProperties entityProperties = entity->getProperties(desiredProperties); - QScriptValue scriptProperties = EntityItemPropertiesToScriptValue(_scriptEngine, entityProperties); - avatarEntityData["properties"] = scriptProperties.toVariant(); + scriptProperties = EntityItemPropertiesToScriptValue(_scriptEngine, entityProperties); } + avatarEntityData["properties"] = scriptProperties.toVariant(); avatarEntitiesData.append(QVariant(avatarEntityData)); } } From 8e5c94abb0f17215753c0415f359d063789561fb Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 31 May 2019 11:08:51 -0700 Subject: [PATCH 07/15] BUGZ-447: New performance preset API --- .../settingsApp/general/General.qml | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/interface/resources/qml/hifi/simplifiedUI/settingsApp/general/General.qml b/interface/resources/qml/hifi/simplifiedUI/settingsApp/general/General.qml index e32890a2dd..76aa35d4ea 100644 --- a/interface/resources/qml/hifi/simplifiedUI/settingsApp/general/General.qml +++ b/interface/resources/qml/hifi/simplifiedUI/settingsApp/general/General.qml @@ -101,7 +101,7 @@ Flickable { HifiStylesUit.GraphikRegular { id: performanceTitle - text: "Performance" + text: "Graphics Preset" Layout.maximumWidth: parent.width height: paintedHeight size: 22 @@ -115,28 +115,28 @@ Flickable { SimplifiedControls.RadioButton { id: performanceLow - text: "Eco" - checked: Performance.getRefreshRateProfile() === RefreshRate.ECO + text: "Low" + checked: Performance.getPerformancePreset() === PerformacePreset.LOW onClicked: { - Performance.setRefreshRateProfile(RefreshRate.ECO); + Performance.setPerformancePreset(PerformacePreset.LOW); } } SimplifiedControls.RadioButton { id: performanceMedium - text: "Interactive" - checked: Performance.getRefreshRateProfile() === RefreshRate.INTERACTIVE + text: "Medium" + checked: Performance.getPerformancePreset() === PerformacePreset.MID onClicked: { - Performance.setRefreshRateProfile(RefreshRate.INTERACTIVE); + Performance.setPerformancePreset(PerformacePreset.MID); } } SimplifiedControls.RadioButton { id: performanceHigh - text: "Realtime" - checked: Performance.getRefreshRateProfile() === RefreshRate.REALTIME + text: "High" + checked: Performance.getPerformancePreset() === PerformacePreset.HIGH onClicked: { - Performance.setRefreshRateProfile(RefreshRate.REALTIME); + Performance.setPerformancePreset(PerformacePreset.HIGH); } } } From fa79d0ec18c198f52b03cfb18dd4724d699db79a Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Fri, 31 May 2019 11:36:26 -0700 Subject: [PATCH 08/15] Fix Application not checking window minimize state properly --- interface/src/Application.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ae226598d1..6232821489 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4155,8 +4155,14 @@ bool Application::eventFilter(QObject* object, QEvent* event) { } if (event->type() == QEvent::WindowStateChange) { - if (getWindow()->windowState() == Qt::WindowMinimized) { + if (getWindow()->windowState() & Qt::WindowMinimized) { getRefreshRateManager().setRefreshRateRegime(RefreshRateManager::RefreshRateRegime::MINIMIZED); + } else { + auto* windowStateChangeEvent = static_cast(event); + if (windowStateChangeEvent->oldState() & Qt::WindowMinimized) { + getRefreshRateManager().setRefreshRateRegime(RefreshRateManager::RefreshRateRegime::FOCUS_ACTIVE); + getRefreshRateManager().resetInactiveTimer(); + } } } From b9b320d01c89ac2dca1726e0f95d0c8f74437b7f Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 31 May 2019 11:43:13 -0700 Subject: [PATCH 09/15] DEV-92: Add a Home button to the Avatar app --- .../hifi/simplifiedUI/avatarApp/AvatarApp.qml | 21 +++++++++++++++++++ .../avatarApp/images/homeIcon.svg | 4 ++++ 2 files changed, 25 insertions(+) create mode 100644 interface/resources/qml/hifi/simplifiedUI/avatarApp/images/homeIcon.svg diff --git a/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml b/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml index d6ee593edd..b7186b885c 100644 --- a/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml +++ b/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml @@ -99,6 +99,27 @@ Rectangle { } } + Image { + id: homeButton + source: "images/homeIcon.svg" + opacity: homeButtonMouseArea.containsMouse ? 1.0 : 0.7 + anchors.top: parent.top + anchors.topMargin: 15 + anchors.right: parent.right + anchors.rightMargin: 24 + width: 14 + height: 13 + + MouseArea { + id: homeButtonMouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: { + Window.location = LocationBookmarks.getHomeLocationAddress(); + } + } + } + AvatarAppComponents.DisplayNameHeader { id: displayNameHeader previewUrl: root.avatarPreviewUrl diff --git a/interface/resources/qml/hifi/simplifiedUI/avatarApp/images/homeIcon.svg b/interface/resources/qml/hifi/simplifiedUI/avatarApp/images/homeIcon.svg new file mode 100644 index 0000000000..1aae14e2dd --- /dev/null +++ b/interface/resources/qml/hifi/simplifiedUI/avatarApp/images/homeIcon.svg @@ -0,0 +1,4 @@ + + + + From 25725bb91e6dd64101a9f533a48029dc2855e27d Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 31 May 2019 11:46:13 -0700 Subject: [PATCH 10/15] Change 'your avatars' to 'your profile' --- scripts/simplifiedUI/ui/simplifiedUI.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/simplifiedUI/ui/simplifiedUI.js b/scripts/simplifiedUI/ui/simplifiedUI.js index a6183c5ab9..38d1059da7 100644 --- a/scripts/simplifiedUI/ui/simplifiedUI.js +++ b/scripts/simplifiedUI/ui/simplifiedUI.js @@ -98,7 +98,7 @@ function onAvatarAppClosed() { var AVATAR_APP_QML_PATH = Script.resourcesPath() + "qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml"; -var AVATAR_APP_WINDOW_TITLE = "Your Avatars"; +var AVATAR_APP_WINDOW_TITLE = "Your Profile"; var AVATAR_APP_PRESENTATION_MODE = Desktop.PresentationMode.NATIVE; var AVATAR_APP_WIDTH_PX = 480; var AVATAR_APP_HEIGHT_PX = 615; From f4a7b2704295a608c2c91bfd094f49a808e60768 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Thu, 30 May 2019 17:26:06 -0700 Subject: [PATCH 11/15] cleaning up name lookups --- .../entities/src/EntityItemProperties.cpp | 475 +++++++----------- libraries/entities/src/EntityItemProperties.h | 9 - libraries/shared/src/ComponentMode.cpp | 37 ++ libraries/shared/src/ComponentMode.h | 20 + 4 files changed, 244 insertions(+), 297 deletions(-) create mode 100644 libraries/shared/src/ComponentMode.cpp diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index ce4387a006..e5205e86e8 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -104,41 +104,199 @@ bool EntityItemProperties::constructFromBuffer(const unsigned char* data, int da return true; } -QHash stringToShapeTypeLookup; - -void addShapeType(ShapeType type) { - stringToShapeTypeLookup[ShapeInfo::getNameForShapeType(type)] = type; +inline void addShapeType(QHash& lookup, ShapeType type) { lookup[ShapeInfo::getNameForShapeType(type)] = type; } +QHash stringToShapeTypeLookup = [] { + QHash toReturn; + addShapeType(toReturn, SHAPE_TYPE_NONE); + addShapeType(toReturn, SHAPE_TYPE_BOX); + addShapeType(toReturn, SHAPE_TYPE_SPHERE); + addShapeType(toReturn, SHAPE_TYPE_CAPSULE_X); + addShapeType(toReturn, SHAPE_TYPE_CAPSULE_Y); + addShapeType(toReturn, SHAPE_TYPE_CAPSULE_Z); + addShapeType(toReturn, SHAPE_TYPE_CYLINDER_X); + addShapeType(toReturn, SHAPE_TYPE_CYLINDER_Y); + addShapeType(toReturn, SHAPE_TYPE_CYLINDER_Z); + addShapeType(toReturn, SHAPE_TYPE_HULL); + addShapeType(toReturn, SHAPE_TYPE_PLANE); + addShapeType(toReturn, SHAPE_TYPE_COMPOUND); + addShapeType(toReturn, SHAPE_TYPE_SIMPLE_HULL); + addShapeType(toReturn, SHAPE_TYPE_SIMPLE_COMPOUND); + addShapeType(toReturn, SHAPE_TYPE_STATIC_MESH); + addShapeType(toReturn, SHAPE_TYPE_ELLIPSOID); + addShapeType(toReturn, SHAPE_TYPE_CIRCLE); + return toReturn; +}(); +QString EntityItemProperties::getShapeTypeAsString() const { return ShapeInfo::getNameForShapeType(_shapeType); } +void EntityItemProperties::setShapeTypeFromString(const QString& shapeName) { + auto shapeTypeItr = stringToShapeTypeLookup.find(shapeName.toLower()); + if (shapeTypeItr != stringToShapeTypeLookup.end()) { + _shapeType = shapeTypeItr.value(); + _shapeTypeChanged = true; + } } -void buildStringToShapeTypeLookup() { - addShapeType(SHAPE_TYPE_NONE); - addShapeType(SHAPE_TYPE_BOX); - addShapeType(SHAPE_TYPE_SPHERE); - addShapeType(SHAPE_TYPE_CAPSULE_X); - addShapeType(SHAPE_TYPE_CAPSULE_Y); - addShapeType(SHAPE_TYPE_CAPSULE_Z); - addShapeType(SHAPE_TYPE_CYLINDER_X); - addShapeType(SHAPE_TYPE_CYLINDER_Y); - addShapeType(SHAPE_TYPE_CYLINDER_Z); - addShapeType(SHAPE_TYPE_HULL); - addShapeType(SHAPE_TYPE_PLANE); - addShapeType(SHAPE_TYPE_COMPOUND); - addShapeType(SHAPE_TYPE_SIMPLE_HULL); - addShapeType(SHAPE_TYPE_SIMPLE_COMPOUND); - addShapeType(SHAPE_TYPE_STATIC_MESH); - addShapeType(SHAPE_TYPE_ELLIPSOID); - addShapeType(SHAPE_TYPE_CIRCLE); +inline void addMaterialMappingMode(QHash& lookup, MaterialMappingMode mode) { lookup[MaterialMappingModeHelpers::getNameForMaterialMappingMode(mode)] = mode; } +const QHash stringToMaterialMappingModeLookup = [] { + QHash toReturn; + addMaterialMappingMode(toReturn, UV); + addMaterialMappingMode(toReturn, PROJECTED); + return toReturn; +}(); +QString EntityItemProperties::getMaterialMappingModeAsString() const { return MaterialMappingModeHelpers::getNameForMaterialMappingMode(_materialMappingMode); } +void EntityItemProperties::setMaterialMappingModeFromString(const QString& materialMappingMode) { + auto materialMappingModeItr = stringToMaterialMappingModeLookup.find(materialMappingMode.toLower()); + if (materialMappingModeItr != stringToMaterialMappingModeLookup.end()) { + _materialMappingMode = materialMappingModeItr.value(); + _materialMappingModeChanged = true; + } } -QHash stringToMaterialMappingModeLookup; - -void addMaterialMappingMode(MaterialMappingMode mode) { - stringToMaterialMappingModeLookup[MaterialMappingModeHelpers::getNameForMaterialMappingMode(mode)] = mode; +inline void addBillboardMode(QHash& lookup, BillboardMode mode) { lookup[BillboardModeHelpers::getNameForBillboardMode(mode)] = mode; } +const QHash stringToBillboardModeLookup = [] { + QHash toReturn; + addBillboardMode(toReturn, BillboardMode::NONE); + addBillboardMode(toReturn, BillboardMode::YAW); + addBillboardMode(toReturn, BillboardMode::FULL); + return toReturn; +}(); +QString EntityItemProperties::getBillboardModeAsString() const { return BillboardModeHelpers::getNameForBillboardMode(_billboardMode); } +void EntityItemProperties::setBillboardModeFromString(const QString& billboardMode) { + auto billboardModeItr = stringToBillboardModeLookup.find(billboardMode.toLower()); + if (billboardModeItr != stringToBillboardModeLookup.end()) { + _billboardMode = billboardModeItr.value(); + _billboardModeChanged = true; + } } -void buildStringToMaterialMappingModeLookup() { - addMaterialMappingMode(UV); - addMaterialMappingMode(PROJECTED); +inline void addRenderLayer(QHash& lookup, RenderLayer mode) { lookup[RenderLayerHelpers::getNameForRenderLayer(mode)] = mode; } +const QHash stringToRenderLayerLookup = [] { + QHash toReturn; + addRenderLayer(toReturn, RenderLayer::WORLD); + addRenderLayer(toReturn, RenderLayer::FRONT); + addRenderLayer(toReturn, RenderLayer::HUD); + return toReturn; +}(); +QString EntityItemProperties::getRenderLayerAsString() const { return RenderLayerHelpers::getNameForRenderLayer(_renderLayer); } +void EntityItemProperties::setRenderLayerFromString(const QString& renderLayer) { + auto renderLayerItr = stringToRenderLayerLookup.find(renderLayer.toLower()); + if (renderLayerItr != stringToRenderLayerLookup.end()) { + _renderLayer = renderLayerItr.value(); + _renderLayerChanged = true; + } +} + +inline void addPrimitiveMode(QHash& lookup, PrimitiveMode mode) { lookup[PrimitiveModeHelpers::getNameForPrimitiveMode(mode)] = mode; } +const QHash stringToPrimitiveModeLookup = [] { + QHash toReturn; + addPrimitiveMode(toReturn, PrimitiveMode::SOLID); + addPrimitiveMode(toReturn, PrimitiveMode::LINES); + return toReturn; +}(); +QString EntityItemProperties::getPrimitiveModeAsString() const { return PrimitiveModeHelpers::getNameForPrimitiveMode(_primitiveMode); } +void EntityItemProperties::setPrimitiveModeFromString(const QString& primitiveMode) { + auto primitiveModeItr = stringToPrimitiveModeLookup.find(primitiveMode.toLower()); + if (primitiveModeItr != stringToPrimitiveModeLookup.end()) { + _primitiveMode = primitiveModeItr.value(); + _primitiveModeChanged = true; + } +} + +inline void addWebInputMode(QHash& lookup, WebInputMode mode) { lookup[WebInputModeHelpers::getNameForWebInputMode(mode)] = mode; } +const QHash stringToWebInputModeLookup = [] { + QHash toReturn; + addWebInputMode(toReturn, WebInputMode::TOUCH); + addWebInputMode(toReturn, WebInputMode::MOUSE); + return toReturn; +}(); +QString EntityItemProperties::getInputModeAsString() const { return WebInputModeHelpers::getNameForWebInputMode(_inputMode); } +void EntityItemProperties::setInputModeFromString(const QString& webInputMode) { + auto webInputModeItr = stringToWebInputModeLookup.find(webInputMode.toLower()); + if (webInputModeItr != stringToWebInputModeLookup.end()) { + _inputMode = webInputModeItr.value(); + _inputModeChanged = true; + } +} + +inline void addGizmoType(QHash& lookup, GizmoType mode) { lookup[GizmoTypeHelpers::getNameForGizmoType(mode)] = mode; } +const QHash stringToGizmoTypeLookup = [] { + QHash toReturn; + addGizmoType(toReturn, GizmoType::RING); + return toReturn; +}(); +QString EntityItemProperties::getGizmoTypeAsString() const { return GizmoTypeHelpers::getNameForGizmoType(_gizmoType); } +void EntityItemProperties::setGizmoTypeFromString(const QString& gizmoType) { + auto gizmoTypeItr = stringToGizmoTypeLookup.find(gizmoType.toLower()); + if (gizmoTypeItr != stringToGizmoTypeLookup.end()) { + _gizmoType = gizmoTypeItr.value(); + _gizmoTypeChanged = true; + } +} + +inline void addComponentMode(QHash& lookup, ComponentMode mode) { lookup[ComponentModeHelpers::getNameForComponentMode(mode)] = mode; } +const QHash stringToComponentMode = [] { + QHash toReturn; + addComponentMode(toReturn, ComponentMode::COMPONENT_MODE_INHERIT); + addComponentMode(toReturn, ComponentMode::COMPONENT_MODE_DISABLED); + addComponentMode(toReturn, ComponentMode::COMPONENT_MODE_ENABLED); + return toReturn; +}(); +QString EntityItemProperties::getComponentModeAsString(uint32_t mode) { return ComponentModeHelpers::getNameForComponentMode((ComponentMode)mode); } +QString EntityItemProperties::getSkyboxModeAsString() const { return getComponentModeAsString(_skyboxMode); } +QString EntityItemProperties::getKeyLightModeAsString() const { return getComponentModeAsString(_keyLightMode); } +QString EntityItemProperties::getAmbientLightModeAsString() const { return getComponentModeAsString(_ambientLightMode); } +QString EntityItemProperties::getHazeModeAsString() const { return getComponentModeAsString(_hazeMode); } +QString EntityItemProperties::getBloomModeAsString() const { return getComponentModeAsString(_bloomMode); } +void EntityItemProperties::setSkyboxModeFromString(const QString& mode) { + auto modeItr = stringToComponentMode.find(mode.toLower()); + if (modeItr != stringToComponentMode.end()) { + _skyboxMode = modeItr.value(); + _skyboxModeChanged = true; + } +} +void EntityItemProperties::setKeyLightModeFromString(const QString& mode) { + auto modeItr = stringToComponentMode.find(mode.toLower()); + if (modeItr != stringToComponentMode.end()) { + _keyLightMode = modeItr.value(); + _keyLightModeChanged = true; + } +} +void EntityItemProperties::setAmbientLightModeFromString(const QString& mode) { + auto modeItr = stringToComponentMode.find(mode.toLower()); + if (modeItr != stringToComponentMode.end()) { + _ambientLightMode = modeItr.value(); + _ambientLightModeChanged = true; + } +} +void EntityItemProperties::setHazeModeFromString(const QString& mode) { + auto modeItr = stringToComponentMode.find(mode.toLower()); + if (modeItr != stringToComponentMode.end()) { + _hazeMode = modeItr.value(); + _hazeModeChanged = true; + } +} +void EntityItemProperties::setBloomModeFromString(const QString& mode) { + auto modeItr = stringToComponentMode.find(mode.toLower()); + if (modeItr != stringToComponentMode.end()) { + _bloomMode = modeItr.value(); + _bloomModeChanged = true; + } +} + +inline void addAvatarPriorityMode(QHash& lookup, AvatarPriorityMode mode) { lookup[AvatarPriorityModeHelpers::getNameForAvatarPriorityMode(mode)] = mode; } +const QHash stringToAvatarPriority = [] { + QHash toReturn; + addAvatarPriorityMode(toReturn, AvatarPriorityMode::AVATAR_PRIORITY_INHERIT); + addAvatarPriorityMode(toReturn, AvatarPriorityMode::AVATAR_PRIORITY_CROWD); + addAvatarPriorityMode(toReturn, AvatarPriorityMode::AVATAR_PRIORITY_HERO); + return toReturn; +}(); +QString EntityItemProperties::getAvatarPriorityAsString() const { return AvatarPriorityModeHelpers::getNameForAvatarPriorityMode((AvatarPriorityMode)_avatarPriority); } +void EntityItemProperties::setAvatarPriorityFromString(const QString& mode) { + auto modeItr = stringToAvatarPriority.find(mode.toLower()); + if (modeItr != stringToAvatarPriority.end()) { + _avatarPriority = modeItr.value(); + _avatarPriorityChanged = true; + } } QString getCollisionGroupAsString(uint16_t group) { @@ -194,134 +352,6 @@ void EntityItemProperties::setCollisionMaskFromString(const QString& maskString) _collisionMaskChanged = true; } -QString EntityItemProperties::getShapeTypeAsString() const { - return ShapeInfo::getNameForShapeType(_shapeType); -} - -void EntityItemProperties::setShapeTypeFromString(const QString& shapeName) { - if (stringToShapeTypeLookup.empty()) { - buildStringToShapeTypeLookup(); - } - auto shapeTypeItr = stringToShapeTypeLookup.find(shapeName.toLower()); - if (shapeTypeItr != stringToShapeTypeLookup.end()) { - _shapeType = shapeTypeItr.value(); - _shapeTypeChanged = true; - } -} - -QString EntityItemProperties::getComponentModeAsString(uint32_t mode) { - // return "inherit" if mode is not valid - if (mode < COMPONENT_MODE_ITEM_COUNT) { - return COMPONENT_MODES[mode].second; - } else { - return COMPONENT_MODES[COMPONENT_MODE_INHERIT].second; - } -} - -QString EntityItemProperties::getHazeModeAsString() const { - return getComponentModeAsString(_hazeMode); -} - -QString EntityItemProperties::getBloomModeAsString() const { - return getComponentModeAsString(_bloomMode); -} - -namespace { - const QStringList AVATAR_PRIORITIES_AS_STRING - { "inherit", "crowd", "hero" }; -} - -QString EntityItemProperties::getAvatarPriorityAsString() const { - return AVATAR_PRIORITIES_AS_STRING.value(_avatarPriority); -} - -std::array::const_iterator EntityItemProperties::findComponent(const QString& mode) { - return std::find_if(COMPONENT_MODES.begin(), COMPONENT_MODES.end(), [&](const ComponentPair& pair) { - return (pair.second == mode); - }); -} - -void EntityItemProperties::setHazeModeFromString(const QString& hazeMode) { - auto result = findComponent(hazeMode); - - if (result != COMPONENT_MODES.end()) { - _hazeMode = result->first; - _hazeModeChanged = true; - } -} - -void EntityItemProperties::setBloomModeFromString(const QString& bloomMode) { - auto result = findComponent(bloomMode); - - if (result != COMPONENT_MODES.end()) { - _bloomMode = result->first; - _bloomModeChanged = true; - } -} - -void EntityItemProperties::setAvatarPriorityFromString(QString const& avatarPriority) { - auto result = AVATAR_PRIORITIES_AS_STRING.indexOf(avatarPriority); - - if (result != -1) { - _avatarPriority = result; - _avatarPriorityChanged = true; - } -} - -QString EntityItemProperties::getKeyLightModeAsString() const { - return getComponentModeAsString(_keyLightMode); -} - -void EntityItemProperties::setKeyLightModeFromString(const QString& keyLightMode) { - auto result = findComponent(keyLightMode); - - if (result != COMPONENT_MODES.end()) { - _keyLightMode = result->first; - _keyLightModeChanged = true; - } -} - -QString EntityItemProperties::getAmbientLightModeAsString() const { - return getComponentModeAsString(_ambientLightMode); -} - -void EntityItemProperties::setAmbientLightModeFromString(const QString& ambientLightMode) { - auto result = findComponent(ambientLightMode); - - if (result != COMPONENT_MODES.end()) { - _ambientLightMode = result->first; - _ambientLightModeChanged = true; - } -} - -QString EntityItemProperties::getSkyboxModeAsString() const { - return getComponentModeAsString(_skyboxMode); -} - -void EntityItemProperties::setSkyboxModeFromString(const QString& skyboxMode) { - auto result = findComponent(skyboxMode); - - if (result != COMPONENT_MODES.end()) { - _skyboxMode = result->first; - _skyboxModeChanged = true; - } -} - -QString EntityItemProperties::getMaterialMappingModeAsString() const { - return MaterialMappingModeHelpers::getNameForMaterialMappingMode(_materialMappingMode); -} - -void EntityItemProperties::setMaterialMappingModeFromString(const QString& materialMappingMode) { - if (stringToMaterialMappingModeLookup.empty()) { - buildStringToMaterialMappingModeLookup(); - } - auto materialMappingModeItr = stringToMaterialMappingModeLookup.find(materialMappingMode.toLower()); - if (materialMappingModeItr != stringToMaterialMappingModeLookup.end()) { - _materialMappingMode = materialMappingModeItr.value(); - _materialMappingModeChanged = true; - } -} - QString EntityItemProperties::getEntityHostTypeAsString() const { switch (_entityHostType) { case entity::HostType::DOMAIN: @@ -345,137 +375,6 @@ void EntityItemProperties::setEntityHostTypeFromString(const QString& entityHost } } -QHash stringToBillboardModeLookup; - -void addBillboardMode(BillboardMode mode) { - stringToBillboardModeLookup[BillboardModeHelpers::getNameForBillboardMode(mode)] = mode; -} - -void buildStringToBillboardModeLookup() { - addBillboardMode(BillboardMode::NONE); - addBillboardMode(BillboardMode::YAW); - addBillboardMode(BillboardMode::FULL); -} - -QString EntityItemProperties::getBillboardModeAsString() const { - return BillboardModeHelpers::getNameForBillboardMode(_billboardMode); -} - -void EntityItemProperties::setBillboardModeFromString(const QString& billboardMode) { - if (stringToBillboardModeLookup.empty()) { - buildStringToBillboardModeLookup(); - } - auto billboardModeItr = stringToBillboardModeLookup.find(billboardMode.toLower()); - if (billboardModeItr != stringToBillboardModeLookup.end()) { - _billboardMode = billboardModeItr.value(); - _billboardModeChanged = true; - } -} - -QHash stringToRenderLayerLookup; - -void addRenderLayer(RenderLayer mode) { - stringToRenderLayerLookup[RenderLayerHelpers::getNameForRenderLayer(mode)] = mode; -} - -void buildStringToRenderLayerLookup() { - addRenderLayer(RenderLayer::WORLD); - addRenderLayer(RenderLayer::FRONT); - addRenderLayer(RenderLayer::HUD); -} - -QString EntityItemProperties::getRenderLayerAsString() const { - return RenderLayerHelpers::getNameForRenderLayer(_renderLayer); -} - -void EntityItemProperties::setRenderLayerFromString(const QString& renderLayer) { - if (stringToRenderLayerLookup.empty()) { - buildStringToRenderLayerLookup(); - } - auto renderLayerItr = stringToRenderLayerLookup.find(renderLayer.toLower()); - if (renderLayerItr != stringToRenderLayerLookup.end()) { - _renderLayer = renderLayerItr.value(); - _renderLayerChanged = true; - } -} - -QHash stringToPrimitiveModeLookup; - -void addPrimitiveMode(PrimitiveMode mode) { - stringToPrimitiveModeLookup[PrimitiveModeHelpers::getNameForPrimitiveMode(mode)] = mode; -} - -void buildStringToPrimitiveModeLookup() { - addPrimitiveMode(PrimitiveMode::SOLID); - addPrimitiveMode(PrimitiveMode::LINES); -} - -QString EntityItemProperties::getPrimitiveModeAsString() const { - return PrimitiveModeHelpers::getNameForPrimitiveMode(_primitiveMode); -} - -void EntityItemProperties::setPrimitiveModeFromString(const QString& primitiveMode) { - if (stringToPrimitiveModeLookup.empty()) { - buildStringToPrimitiveModeLookup(); - } - auto primitiveModeItr = stringToPrimitiveModeLookup.find(primitiveMode.toLower()); - if (primitiveModeItr != stringToPrimitiveModeLookup.end()) { - _primitiveMode = primitiveModeItr.value(); - _primitiveModeChanged = true; - } -} - -QHash stringToWebInputModeLookup; - -void addWebInputMode(WebInputMode mode) { - stringToWebInputModeLookup[WebInputModeHelpers::getNameForWebInputMode(mode)] = mode; -} - -void buildStringToWebInputModeLookup() { - addWebInputMode(WebInputMode::TOUCH); - addWebInputMode(WebInputMode::MOUSE); -} - -QString EntityItemProperties::getInputModeAsString() const { - return WebInputModeHelpers::getNameForWebInputMode(_inputMode); -} - -void EntityItemProperties::setInputModeFromString(const QString& webInputMode) { - if (stringToWebInputModeLookup.empty()) { - buildStringToWebInputModeLookup(); - } - auto webInputModeItr = stringToWebInputModeLookup.find(webInputMode.toLower()); - if (webInputModeItr != stringToWebInputModeLookup.end()) { - _inputMode = webInputModeItr.value(); - _inputModeChanged = true; - } -} - -QHash stringToGizmoTypeLookup; - -void addGizmoType(GizmoType mode) { - stringToGizmoTypeLookup[GizmoTypeHelpers::getNameForGizmoType(mode)] = mode; -} - -void buildStringToGizmoTypeLookup() { - addGizmoType(GizmoType::RING); -} - -QString EntityItemProperties::getGizmoTypeAsString() const { - return GizmoTypeHelpers::getNameForGizmoType(_gizmoType); -} - -void EntityItemProperties::setGizmoTypeFromString(const QString& gizmoType) { - if (stringToGizmoTypeLookup.empty()) { - buildStringToGizmoTypeLookup(); - } - auto gizmoTypeItr = stringToGizmoTypeLookup.find(gizmoType.toLower()); - if (gizmoTypeItr != stringToGizmoTypeLookup.end()) { - _gizmoType = gizmoTypeItr.value(); - _gizmoTypeChanged = true; - } -} - EntityPropertyFlags EntityItemProperties::getChangedProperties() const { EntityPropertyFlags changedProperties; diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index af945a89de..619af97ee5 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -67,13 +67,6 @@ const quint64 UNKNOWN_CREATED_TIME = 0; -using ComponentPair = std::pair; -const std::array COMPONENT_MODES = { { - ComponentPair { COMPONENT_MODE_INHERIT, { "inherit" } }, - ComponentPair { COMPONENT_MODE_DISABLED, { "disabled" } }, - ComponentPair { COMPONENT_MODE_ENABLED, { "enabled" } } -} }; - using vec3Color = glm::vec3; using u8vec3Color = glm::u8vec3; @@ -400,8 +393,6 @@ public: static QString getComponentModeAsString(uint32_t mode); - std::array::const_iterator findComponent(const QString& mode); - public: float getMaxDimension() const { return glm::compMax(_dimensions); } diff --git a/libraries/shared/src/ComponentMode.cpp b/libraries/shared/src/ComponentMode.cpp new file mode 100644 index 0000000000..5b3a42e9ae --- /dev/null +++ b/libraries/shared/src/ComponentMode.cpp @@ -0,0 +1,37 @@ +// +// Created by Sam Gondelman on 5/31/19 +// Copyright 2019 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "ComponentMode.h" + +const char* componentModeNames[] = { + "inherit", + "disabled", + "enabled" +}; + +QString ComponentModeHelpers::getNameForComponentMode(ComponentMode mode) { + if (((int)mode <= 0) || ((int)mode >= (int)COMPONENT_MODE_ITEM_COUNT)) { + mode = (ComponentMode)0; + } + + return componentModeNames[(int)mode]; +} + +const char* avatarPriorityModeNames[] = { + "inherit", + "crowd", + "hero" +}; + +QString AvatarPriorityModeHelpers::getNameForAvatarPriorityMode(AvatarPriorityMode mode) { + if (((int)mode <= 0) || ((int)mode >= (int)AVATAR_PRIORITY_ITEM_COUNT)) { + mode = (AvatarPriorityMode)0; + } + + return avatarPriorityModeNames[(int)mode]; +} \ No newline at end of file diff --git a/libraries/shared/src/ComponentMode.h b/libraries/shared/src/ComponentMode.h index 03721c6a45..f1d030cefd 100644 --- a/libraries/shared/src/ComponentMode.h +++ b/libraries/shared/src/ComponentMode.h @@ -12,6 +12,8 @@ #ifndef hifi_ComponentMode_h #define hifi_ComponentMode_h +#include + enum ComponentMode { COMPONENT_MODE_INHERIT, COMPONENT_MODE_DISABLED, @@ -20,5 +22,23 @@ enum ComponentMode { COMPONENT_MODE_ITEM_COUNT }; +enum AvatarPriorityMode { + AVATAR_PRIORITY_INHERIT, + AVATAR_PRIORITY_CROWD, + AVATAR_PRIORITY_HERO, + + AVATAR_PRIORITY_ITEM_COUNT +}; + +class ComponentModeHelpers { +public: + static QString getNameForComponentMode(ComponentMode mode); +}; + +class AvatarPriorityModeHelpers { +public: + static QString getNameForAvatarPriorityMode(AvatarPriorityMode mode); +}; + #endif // hifi_ComponentMode_h From 8b085c79addbf051e78600df137a676b14716c4a Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 31 May 2019 12:36:28 -0700 Subject: [PATCH 12/15] Can't use window.location in QML --- .../resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml b/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml index b7186b885c..66bbc99ad4 100644 --- a/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml +++ b/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml @@ -115,7 +115,9 @@ Rectangle { anchors.fill: parent hoverEnabled: true onClicked: { - Window.location = LocationBookmarks.getHomeLocationAddress(); + // Can't use `Window.location` in QML, so just use what setting `Window.location` actually calls under the hood: + // AddressManager.handleLookupString(). + AddressManager.handleLookupString(LocationBookmarks.getHomeLocationAddress()); } } } From 7b04a6d361e78f0f0b27eb509f84db7fd555d03b Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 31 May 2019 12:37:35 -0700 Subject: [PATCH 13/15] Sounds --- .../resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml b/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml index 66bbc99ad4..4c6615ebdc 100644 --- a/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml +++ b/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml @@ -12,6 +12,7 @@ import QtQuick 2.10 import "../simplifiedConstants" as SimplifiedConstants import "./components" as AvatarAppComponents import stylesUit 1.0 as HifiStylesUit +import TabletScriptingInterface 1.0 import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere. Rectangle { @@ -114,7 +115,11 @@ Rectangle { id: homeButtonMouseArea anchors.fill: parent hoverEnabled: true + onEntered: { + Tablet.playSound(TabletEnums.ButtonHover); + } onClicked: { + Tablet.playSound(TabletEnums.ButtonClick); // Can't use `Window.location` in QML, so just use what setting `Window.location` actually calls under the hood: // AddressManager.handleLookupString(). AddressManager.handleLookupString(LocationBookmarks.getHomeLocationAddress()); From 97bd0d5413ad57e3393e6a1d8f2a06b7bb07d41e Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 31 May 2019 12:50:32 -0700 Subject: [PATCH 14/15] Make this work! --- .../simplifiedUI/settingsApp/general/General.qml | 12 ++++++------ .../src/scripting/PerformanceScriptingInterface.cpp | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/interface/resources/qml/hifi/simplifiedUI/settingsApp/general/General.qml b/interface/resources/qml/hifi/simplifiedUI/settingsApp/general/General.qml index 76aa35d4ea..9c3a33412e 100644 --- a/interface/resources/qml/hifi/simplifiedUI/settingsApp/general/General.qml +++ b/interface/resources/qml/hifi/simplifiedUI/settingsApp/general/General.qml @@ -116,27 +116,27 @@ Flickable { SimplifiedControls.RadioButton { id: performanceLow text: "Low" - checked: Performance.getPerformancePreset() === PerformacePreset.LOW + checked: Performance.getPerformancePreset() === PerformanceEnums.LOW onClicked: { - Performance.setPerformancePreset(PerformacePreset.LOW); + Performance.setPerformancePreset(PerformanceEnums.LOW); } } SimplifiedControls.RadioButton { id: performanceMedium text: "Medium" - checked: Performance.getPerformancePreset() === PerformacePreset.MID + checked: Performance.getPerformancePreset() === PerformanceEnums.MID onClicked: { - Performance.setPerformancePreset(PerformacePreset.MID); + Performance.setPerformancePreset(PerformanceEnums.MID); } } SimplifiedControls.RadioButton { id: performanceHigh text: "High" - checked: Performance.getPerformancePreset() === PerformacePreset.HIGH + checked: Performance.getPerformancePreset() === PerformanceEnums.HIGH onClicked: { - Performance.setPerformancePreset(PerformacePreset.HIGH); + Performance.setPerformancePreset(PerformanceEnums.HIGH); } } } diff --git a/interface/src/scripting/PerformanceScriptingInterface.cpp b/interface/src/scripting/PerformanceScriptingInterface.cpp index 4f7c2b0fda..d47404a601 100644 --- a/interface/src/scripting/PerformanceScriptingInterface.cpp +++ b/interface/src/scripting/PerformanceScriptingInterface.cpp @@ -15,7 +15,7 @@ std::once_flag PerformanceScriptingInterface::registry_flag; PerformanceScriptingInterface::PerformanceScriptingInterface() { std::call_once(registry_flag, [] { - qmlRegisterType("PerformanceEnums", 1, 0, "RefreshRate"); + qmlRegisterType("PerformanceEnums", 1, 0, "PerformanceEnums"); }); } From e29bf376a488606063180be902b0dbcbc83c7d88 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Fri, 31 May 2019 14:01:58 -0700 Subject: [PATCH 15/15] fix address manager crash --- interface/src/Application.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ae226598d1..ad29906889 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1311,8 +1311,16 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo accountManager->setAuthURL(NetworkingConstants::METAVERSE_SERVER_URL()); // use our MyAvatar position and quat for address manager path - addressManager->setPositionGetter([this]{ return getMyAvatar()->getWorldFeetPosition(); }); - addressManager->setOrientationGetter([this]{ return getMyAvatar()->getWorldOrientation(); }); + addressManager->setPositionGetter([this] { + auto avatarManager = DependencyManager::get(); + auto myAvatar = avatarManager ? avatarManager->getMyAvatar() : nullptr; + return myAvatar ? myAvatar->getWorldFeetPosition() : Vectors::ZERO; + }); + addressManager->setOrientationGetter([this] { + auto avatarManager = DependencyManager::get(); + auto myAvatar = avatarManager ? avatarManager->getMyAvatar() : nullptr; + return myAvatar ? myAvatar->getWorldOrientation() : glm::quat(); + }); connect(addressManager.data(), &AddressManager::hostChanged, this, &Application::updateWindowTitle); connect(this, &QCoreApplication::aboutToQuit, addressManager.data(), &AddressManager::storeCurrentAddress);