From ab4f110ea4e68aea09eb6b4da01d281c0a941ec9 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 22 Mar 2018 11:07:06 -0700 Subject: [PATCH 01/98] add single quote tests to JS baking tests --- tests/baking/src/JSBakerTest.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/baking/src/JSBakerTest.cpp b/tests/baking/src/JSBakerTest.cpp index 082ffb047f..e39ccc6b9a 100644 --- a/tests/baking/src/JSBakerTest.cpp +++ b/tests/baking/src/JSBakerTest.cpp @@ -66,12 +66,14 @@ void JSBakerTest::setTestCases() { _testCases.emplace_back("'abcd1234$%^&[](){}'\na", "'abcd1234$%^&[](){}'\na"); _testCases.emplace_back("\"abcd1234$%^&[](){}\"\na", "\"abcd1234$%^&[](){}\"\na"); _testCases.emplace_back("`abcd1234$%^&[](){}`\na", "`abcd1234$%^&[](){}`a"); + _testCases.emplace_back("\' \';", "\' \';"); + _testCases.emplace_back("\'//single line comment\nvar b=2;\';", "\'//single line comment\nvar b=2;\';"); // Edge Cases //No semicolon to terminate an expression, instead a new line used for termination _testCases.emplace_back("var x=5\nvar y=6;", "var x=5\nvar y=6;"); - + //a + ++b is minified as a+ ++b. _testCases.emplace_back("a + ++b", "a + ++b"); From 6d078f41e783007a1c51f16a34a9746e569621d7 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Mon, 2 Apr 2018 17:32:18 -0700 Subject: [PATCH 02/98] Use unique IDs for log strings that should have repeats supressed --- libraries/networking/src/LimitedNodeList.cpp | 15 ++++--- libraries/shared/src/LogHandler.cpp | 41 +++++++++++++++++++- libraries/shared/src/LogHandler.h | 5 +++ 3 files changed, 54 insertions(+), 7 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 0803e380f2..d73ea8ca9c 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -345,12 +345,17 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe return true; } else { - static const QString UNKNOWN_REGEX = "Packet of type \\d+ \\([\\sa-zA-Z:]+\\) received from unknown node with UUID"; - static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex(UNKNOWN_REGEX); + //static const QString UNKNOWN_REGEX = "Packet of type \\d+ \\([\\sa-zA-Z:]+\\) received from unknown node with UUID"; + //static QString repeatedMessage + // = LogHandler::getInstance().addRepeatedMessageRegex(UNKNOWN_REGEX); + //qCDebug(networking) << "Packet of type" << headerType + // << "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(sourceID); - qCDebug(networking) << "Packet of type" << headerType - << "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(sourceID); + static const int repeatedIDUnknownNode = LogHandler::getInstance().newRepeatedMessageID(); + QString logString; + QDebug debugString(&logString); + debugString << "Packet of type" << headerType << "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(sourceID); + LogHandler::getInstance().printRepeatedMessage(repeatedIDUnknownNode, LogDebug, QMessageLogContext(), logString); } } diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index 49927a325b..6b89307ddf 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -25,7 +25,7 @@ #include #include -QMutex LogHandler::_mutex; +QMutex LogHandler::_mutex(QMutex::Recursive); LogHandler& LogHandler::getInstance() { static LogHandler staticInstance; @@ -107,13 +107,25 @@ void LogHandler::flushRepeatedMessages() { message.messageCount = 0; } + + // New repeat-supress scheme: + for (int m = 0; m < (int)_repeatCounts.size(); ++m) { + int repeatCount = _repeatCounts[m]; + if (m > 1) { + QString repeatLogMessage = QString(m) + " repeated log entries - Last entry: \"" + _repeatedMessageStrings[m] + + "\""; + printMessage(LogSuppressed, QMessageLogContext(), repeatLogMessage); + _repeatCounts[m] = 0; + _repeatedMessageStrings[m] = QString(); + } + } } QString LogHandler::printMessage(LogMsgType type, const QMessageLogContext& context, const QString& message) { - QMutexLocker lock(&_mutex); if (message.isEmpty()) { return QString(); } + QMutexLocker lock(&_mutex); if (type == LogDebug) { // for debug messages, check if this matches any of our regexes for repeated log messages @@ -217,3 +229,28 @@ const QString& LogHandler::addOnlyOnceMessageRegex(const QString& regexString) { _onetimeMessages.push_back(onetimeMessage); return regexString; } + +int LogHandler::newRepeatedMessageID() { + QMutexLocker lock(&_mutex); + int newMessageId = _currentMessageID; + ++_currentMessageID; + _repeatCounts.push_back(0); + _repeatedMessageStrings.resize(_currentMessageID); + return newMessageId; +} + +void LogHandler::printRepeatedMessage(int messageID, LogMsgType type, const QMessageLogContext & context, + const QString & message) { + QMutexLocker lock(&_mutex); + if (messageID >= _currentMessageID) { + return; + } + + if (_repeatCounts[messageID] == 0) { + printMessage(type, context, message); + } else { + _repeatedMessageStrings[messageID] = message; + } + + ++_repeatCounts[messageID]; +} diff --git a/libraries/shared/src/LogHandler.h b/libraries/shared/src/LogHandler.h index 2e64f16c1e..7b459538ad 100644 --- a/libraries/shared/src/LogHandler.h +++ b/libraries/shared/src/LogHandler.h @@ -53,6 +53,8 @@ public: const QString& addRepeatedMessageRegex(const QString& regexString); const QString& addOnlyOnceMessageRegex(const QString& regexString); + int newRepeatedMessageID(); + void printRepeatedMessage(int messageID, LogMsgType type, const QMessageLogContext& context, const QString &message); private slots: void setupRepeatedMessageFlusher(); @@ -81,6 +83,9 @@ private: }; std::vector _onetimeMessages; + int _currentMessageID { 0 }; + std::vector _repeatCounts; + std::vector _repeatedMessageStrings; static QMutex _mutex; }; From d1cb4aab89a0220e82a76f301d16ebc8b555e6d5 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Mon, 2 Apr 2018 17:55:23 -0700 Subject: [PATCH 03/98] Make BakedAssetType a scoped enum --- assignment-client/src/assets/AssetServer.cpp | 26 ++++++++++---------- assignment-client/src/assets/AssetServer.h | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index 1eb43a45a5..b2fb74f77d 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -61,13 +61,13 @@ static const ScriptBakeVersion CURRENT_SCRIPT_BAKE_VERSION = (ScriptBakeVersion) BakedAssetType assetTypeForExtension(const QString& extension) { auto extensionLower = extension.toLower(); if (BAKEABLE_MODEL_EXTENSIONS.contains(extensionLower)) { - return Model; + return BakedAssetType::Model; } else if (BAKEABLE_TEXTURE_EXTENSIONS.contains(extensionLower.toLocal8Bit())) { - return Texture; + return BakedAssetType::Texture; } else if (BAKEABLE_SCRIPT_EXTENSIONS.contains(extensionLower)) { - return Script; + return BakedAssetType::Script; } - return Undefined; + return BakedAssetType::Undefined; } BakedAssetType assetTypeForFilename(const QString& filename) { @@ -82,11 +82,11 @@ BakedAssetType assetTypeForFilename(const QString& filename) { QString bakedFilenameForAssetType(BakedAssetType type) { switch (type) { - case Model: + case BakedAssetType::Model: return BAKED_MODEL_SIMPLE_NAME; - case Texture: + case BakedAssetType::Texture: return BAKED_TEXTURE_SIMPLE_NAME; - case Script: + case BakedAssetType::Script: return BAKED_SCRIPT_SIMPLE_NAME; default: return ""; @@ -95,11 +95,11 @@ QString bakedFilenameForAssetType(BakedAssetType type) { BakeVersion currentBakeVersionForAssetType(BakedAssetType type) { switch (type) { - case Model: + case BakedAssetType::Model: return (BakeVersion)CURRENT_MODEL_BAKE_VERSION; - case Texture: + case BakedAssetType::Texture: return (BakeVersion)CURRENT_TEXTURE_BAKE_VERSION; - case Script: + case BakedAssetType::Script: return (BakeVersion)CURRENT_SCRIPT_BAKE_VERSION; default: return 0; @@ -222,7 +222,7 @@ bool AssetServer::needsToBeBaked(const AssetUtils::AssetPath& path, const AssetU BakedAssetType type = assetTypeForFilename(path); - if (type == Undefined) { + if (type == BakedAssetType::Undefined) { return false; } @@ -241,7 +241,7 @@ bool AssetServer::needsToBeBaked(const AssetUtils::AssetPath& path, const AssetU AssetMeta meta; std::tie(loaded, meta) = readMetaFile(assetHash); - if (type == Texture && !loaded) { + if (type == BakedAssetType::Texture && !loaded) { return false; } @@ -1546,7 +1546,7 @@ bool AssetServer::setBakingEnabled(const AssetUtils::AssetPathList& paths, bool auto it = _fileMappings.find(path); if (it != _fileMappings.end()) { auto type = assetTypeForFilename(path); - if (type == Undefined) { + if (type == BakedAssetType::Undefined) { continue; } QString bakedFilename = bakedFilenameForAssetType(type); diff --git a/assignment-client/src/assets/AssetServer.h b/assignment-client/src/assets/AssetServer.h index a55a15e6fc..fb88df0171 100644 --- a/assignment-client/src/assets/AssetServer.h +++ b/assignment-client/src/assets/AssetServer.h @@ -27,7 +27,7 @@ using BakeVersion = int; static const BakeVersion INITIAL_BAKE_VERSION = 0; static const BakeVersion NEEDS_BAKING_BAKE_VERSION = -1; -enum BakedAssetType : int { +enum class BakedAssetType : int { Model = 0, Texture, Script, From a7fc6a299176109a669329beff643b54199798f5 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 3 Apr 2018 10:44:53 -0700 Subject: [PATCH 04/98] Repeated logs - use #define to replace qCDebug --- libraries/networking/src/LimitedNodeList.cpp | 7 ++----- libraries/networking/src/NetworkLogging.h | 11 +++++++++++ libraries/shared/src/LogHandler.cpp | 4 ++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index d73ea8ca9c..c6451fa955 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -351,11 +351,8 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe //qCDebug(networking) << "Packet of type" << headerType // << "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(sourceID); - static const int repeatedIDUnknownNode = LogHandler::getInstance().newRepeatedMessageID(); - QString logString; - QDebug debugString(&logString); - debugString << "Packet of type" << headerType << "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(sourceID); - LogHandler::getInstance().printRepeatedMessage(repeatedIDUnknownNode, LogDebug, QMessageLogContext(), logString); + HIFI_FDEBUG(networking, + "Packet of type" << headerType << "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(sourceID)); } } diff --git a/libraries/networking/src/NetworkLogging.h b/libraries/networking/src/NetworkLogging.h index 518c600efe..6b54dd2640 100644 --- a/libraries/networking/src/NetworkLogging.h +++ b/libraries/networking/src/NetworkLogging.h @@ -20,4 +20,15 @@ Q_DECLARE_LOGGING_CATEGORY(asset_client) Q_DECLARE_LOGGING_CATEGORY(entity_script_client) Q_DECLARE_LOGGING_CATEGORY(messages_client) +#define HIFI_FDEBUG(category, msg) \ + do { \ + if (category().isDebugEnabled()) { \ + static int repeatedMessageID_ = LogHandler::getInstance().newRepeatedMessageID(); \ + QString logString_; \ + QDebug debugString_(&logString_); \ + debugString_ << msg; \ + LogHandler::getInstance().printRepeatedMessage(repeatedMessageID_, LogDebug, QMessageLogContext(), logString_); \ + } \ + } while (false) + #endif // hifi_NetworkLogging_h diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index 6b89307ddf..2494711613 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -111,8 +111,8 @@ void LogHandler::flushRepeatedMessages() { // New repeat-supress scheme: for (int m = 0; m < (int)_repeatCounts.size(); ++m) { int repeatCount = _repeatCounts[m]; - if (m > 1) { - QString repeatLogMessage = QString(m) + " repeated log entries - Last entry: \"" + _repeatedMessageStrings[m] + if (repeatCount > 1) { + QString repeatLogMessage = QString(repeatCount) + " repeated log entries - Last entry: \"" + _repeatedMessageStrings[m] + "\""; printMessage(LogSuppressed, QMessageLogContext(), repeatLogMessage); _repeatCounts[m] = 0; From 5b0bcd76e3de36379d2c08a9dd871992429861d0 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 3 Apr 2018 12:23:21 -0700 Subject: [PATCH 05/98] Repeated logging - Fixes and clean-up --- libraries/networking/src/NetworkLogging.h | 3 ++- libraries/shared/src/LogHandler.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/libraries/networking/src/NetworkLogging.h b/libraries/networking/src/NetworkLogging.h index 6b54dd2640..fa2b24462a 100644 --- a/libraries/networking/src/NetworkLogging.h +++ b/libraries/networking/src/NetworkLogging.h @@ -27,7 +27,8 @@ Q_DECLARE_LOGGING_CATEGORY(messages_client) QString logString_; \ QDebug debugString_(&logString_); \ debugString_ << msg; \ - LogHandler::getInstance().printRepeatedMessage(repeatedMessageID_, LogDebug, QMessageLogContext(), logString_); \ + LogHandler::getInstance().printRepeatedMessage(repeatedMessageID_, LogDebug, QMessageLogContext(__FILE__, \ + __LINE__, __func__, category().categoryName()), logString_); \ } \ } while (false) diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index 2494711613..b5a0f069e9 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -112,8 +112,8 @@ void LogHandler::flushRepeatedMessages() { for (int m = 0; m < (int)_repeatCounts.size(); ++m) { int repeatCount = _repeatCounts[m]; if (repeatCount > 1) { - QString repeatLogMessage = QString(repeatCount) + " repeated log entries - Last entry: \"" + _repeatedMessageStrings[m] - + "\""; + QString repeatLogMessage = QString().setNum(repeatCount) + " repeated log entries - Last entry: \"" + + _repeatedMessageStrings[m] + "\""; printMessage(LogSuppressed, QMessageLogContext(), repeatLogMessage); _repeatCounts[m] = 0; _repeatedMessageStrings[m] = QString(); @@ -239,8 +239,8 @@ int LogHandler::newRepeatedMessageID() { return newMessageId; } -void LogHandler::printRepeatedMessage(int messageID, LogMsgType type, const QMessageLogContext & context, - const QString & message) { +void LogHandler::printRepeatedMessage(int messageID, LogMsgType type, const QMessageLogContext& context, + const QString& message) { QMutexLocker lock(&_mutex); if (messageID >= _currentMessageID) { return; From d4ab06b1d4b95df3ede52eac8c8ecd9190f17dc1 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 3 Apr 2018 15:53:12 -0700 Subject: [PATCH 06/98] Move HIFI_FDEBUG macro to LogHandler.h Not all uses of repeated log messages include NetworkLogging.h, but if they use addRepeatedMessageRegex() they must include LogHandler.h. Also add second macro for client-supplied message ID. --- libraries/networking/src/NetworkLogging.h | 12 ------------ libraries/shared/src/LogHandler.h | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/libraries/networking/src/NetworkLogging.h b/libraries/networking/src/NetworkLogging.h index fa2b24462a..518c600efe 100644 --- a/libraries/networking/src/NetworkLogging.h +++ b/libraries/networking/src/NetworkLogging.h @@ -20,16 +20,4 @@ Q_DECLARE_LOGGING_CATEGORY(asset_client) Q_DECLARE_LOGGING_CATEGORY(entity_script_client) Q_DECLARE_LOGGING_CATEGORY(messages_client) -#define HIFI_FDEBUG(category, msg) \ - do { \ - if (category().isDebugEnabled()) { \ - static int repeatedMessageID_ = LogHandler::getInstance().newRepeatedMessageID(); \ - QString logString_; \ - QDebug debugString_(&logString_); \ - debugString_ << msg; \ - LogHandler::getInstance().printRepeatedMessage(repeatedMessageID_, LogDebug, QMessageLogContext(__FILE__, \ - __LINE__, __func__, category().categoryName()), logString_); \ - } \ - } while (false) - #endif // hifi_NetworkLogging_h diff --git a/libraries/shared/src/LogHandler.h b/libraries/shared/src/LogHandler.h index 7b459538ad..8ca8158ec0 100644 --- a/libraries/shared/src/LogHandler.h +++ b/libraries/shared/src/LogHandler.h @@ -89,4 +89,27 @@ private: static QMutex _mutex; }; +#define HIFI_FDEBUG(category, message) \ + do { \ + if (category().isDebugEnabled()) { \ + static int repeatedMessageID_ = LogHandler::getInstance().newRepeatedMessageID(); \ + QString logString_; \ + QDebug debugStringReceiver_(&logString_); \ + debugStringReceiver_ << message; \ + LogHandler::getInstance().printRepeatedMessage(repeatedMessageID_, LogDebug, QMessageLogContext(__FILE__, \ + __LINE__, __func__, category().categoryName()), logString_); \ + } \ + } while (false) + +#define HIFI_FDEBUG_ID(category, messageID, message) \ + do { \ + if (category().isDebugEnabled()) { \ + QString logString_; \ + QDebug debugStringReceiver_(&logString_); \ + debugStringReceiver_ << message; \ + LogHandler::getInstance().printRepeatedMessage(messageID, LogDebug, QMessageLogContext(__FILE__, \ + __LINE__, __func__, category().categoryName()), logString_); \ + } \ + } while (false) + #endif // hifi_LogHandler_h From 7d16ca9c1c66f3215441624c60aaf91dd55a626e Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 3 Apr 2018 17:54:01 -0700 Subject: [PATCH 07/98] Remove uses of addRepeatedMessageRegex() and its implementation Change to new log-message ID scheme. --- domain-server/src/DomainServer.cpp | 22 +++------- interface/src/Application.cpp | 4 +- interface/src/InterfaceDynamicFactory.cpp | 6 +-- libraries/audio/src/AudioRingBuffer.cpp | 12 +++--- libraries/audio/src/PositionalAudioStream.cpp | 6 +-- libraries/entities/src/EntityItem.cpp | 6 +-- libraries/entities/src/EntityTree.cpp | 6 +-- libraries/fbx/src/FBXReader_Mesh.cpp | 6 +-- libraries/networking/src/LimitedNodeList.cpp | 17 ++------ .../networking/src/SequenceNumberStats.cpp | 10 +---- libraries/networking/src/udt/Packet.cpp | 3 +- libraries/networking/src/udt/SendQueue.cpp | 3 +- libraries/networking/src/udt/Socket.cpp | 12 +----- libraries/octree/src/Octree.cpp | 41 ++++--------------- libraries/octree/src/OctreeElement.cpp | 6 +-- libraries/octree/src/OctreeSceneStats.cpp | 8 +--- .../src/ObjectConstraintBallSocket.cpp | 7 +--- .../physics/src/ObjectConstraintConeTwist.cpp | 7 +--- .../physics/src/ObjectConstraintHinge.cpp | 7 +--- .../physics/src/ObjectConstraintSlider.cpp | 7 +--- .../render-utils/src/BackgroundStage.cpp | 3 -- libraries/render/src/render/DrawTask.cpp | 8 +--- libraries/shared/src/LogHandler.cpp | 41 ------------------- libraries/shared/src/LogHandler.h | 10 +---- 24 files changed, 52 insertions(+), 206 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 197ac7eac2..0965ef7bca 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -611,22 +611,14 @@ bool DomainServer::isPacketVerified(const udt::Packet& packet) { // let the NodeList do its checks now (but pass it the sourceNode so it doesn't need to look it up again) return nodeList->isPacketVerifiedWithSource(packet, sourceNode.data()); } else { - static const QString UNKNOWN_REGEX = "Packet of type \\d+ \\([\\sa-zA-Z:]+\\) received from unmatched IP for UUID"; - static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex(UNKNOWN_REGEX); - - qDebug() << "Packet of type" << headerType - << "received from unmatched IP for UUID" << uuidStringWithoutCurlyBraces(sourceID); + HIFI_FDEBUG((*QLoggingCategory::defaultCategory()), "Packet of type" << headerType + << "received from unmatched IP for UUID" << uuidStringWithoutCurlyBraces(sourceID)); return false; } } else { - static const QString UNKNOWN_REGEX = "Packet of type \\d+ \\([\\sa-zA-Z:]+\\) received from unknown node with UUID"; - static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex(UNKNOWN_REGEX); - - qDebug() << "Packet of type" << headerType - << "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(sourceID); + HIFI_FDEBUG((*QLoggingCategory::defaultCategory()), "Packet of type" << headerType + << "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(sourceID)); return false; } @@ -1276,10 +1268,8 @@ void DomainServer::processRequestAssignmentPacket(QSharedPointershouldBePhysical() && !entity->isReadyToComputeShape()) { - static QString repeatedMessage = - LogHandler::getInstance().addRepeatedMessageRegex("Physics disabled until entity loads: .*"); - qCDebug(interfaceapp) << "Physics disabled until entity loads: " << entity->getID() << entity->getName(); + HIFI_FDEBUG(interfaceapp(), "Physics disabled until entity loads: " << entity->getID() << entity->getName()); // don't break here because we want all the relevant entities to start their downloads result = false; } diff --git a/interface/src/InterfaceDynamicFactory.cpp b/interface/src/InterfaceDynamicFactory.cpp index e51f63d01b..dc8a789d32 100644 --- a/interface/src/InterfaceDynamicFactory.cpp +++ b/interface/src/InterfaceDynamicFactory.cpp @@ -87,10 +87,8 @@ EntityDynamicPointer InterfaceDynamicFactory::factoryBA(EntityItemPointer ownerE if (dynamic) { dynamic->deserialize(data); if (dynamic->lifetimeIsOver()) { - static QString repeatedMessage = - LogHandler::getInstance().addRepeatedMessageRegex(".*factoryBA lifetimeIsOver during dynamic creation.*"); - qDebug() << "InterfaceDynamicFactory::factoryBA lifetimeIsOver during dynamic creation --" - << dynamic->getExpires() << "<" << usecTimestampNow(); + HIFI_FDEBUG((*QLoggingCategory::defaultCategory()), "InterfaceDynamicFactory::factoryBA lifetimeIsOver during dynamic creation --" + << dynamic->getExpires() << "<" << usecTimestampNow()); return nullptr; } } diff --git a/libraries/audio/src/AudioRingBuffer.cpp b/libraries/audio/src/AudioRingBuffer.cpp index 59b3e874d7..ded390a4db 100644 --- a/libraries/audio/src/AudioRingBuffer.cpp +++ b/libraries/audio/src/AudioRingBuffer.cpp @@ -39,9 +39,6 @@ AudioRingBufferTemplate::AudioRingBufferTemplate(int numFrameSamples, int num _nextOutput = _buffer; _endOfLastWrite = _buffer; } - - static QString repeatedOverflowMessage = LogHandler::getInstance().addRepeatedMessageRegex(RING_BUFFER_OVERFLOW_DEBUG); - static QString repeatedDroppedMessage = LogHandler::getInstance().addRepeatedMessageRegex(DROPPED_SILENT_DEBUG); } template @@ -167,7 +164,8 @@ int AudioRingBufferTemplate::writeData(const char* data, int maxSize) { _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, samplesToDelete); _overflowCount++; - qCDebug(audio) << qPrintable(RING_BUFFER_OVERFLOW_DEBUG); + HIFI_FDEBUG(audio(), RING_BUFFER_OVERFLOW_DEBUG); + qPrintable(RING_BUFFER_OVERFLOW_DEBUG); } if (_endOfLastWrite + numWriteSamples > _buffer + _bufferLength) { @@ -224,7 +222,7 @@ int AudioRingBufferTemplate::addSilentSamples(int silentSamples) { if (numWriteSamples > samplesRoomFor) { numWriteSamples = samplesRoomFor; - qCDebug(audio) << qPrintable(DROPPED_SILENT_DEBUG); + HIFI_FDEBUG(audio(), DROPPED_SILENT_DEBUG); } if (_endOfLastWrite + numWriteSamples > _buffer + _bufferLength) { @@ -275,7 +273,7 @@ int AudioRingBufferTemplate::writeSamples(ConstIterator source, int maxSample int samplesToDelete = samplesToCopy - samplesRoomFor; _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, samplesToDelete); _overflowCount++; - qCDebug(audio) << qPrintable(RING_BUFFER_OVERFLOW_DEBUG); + HIFI_FDEBUG(audio(), RING_BUFFER_OVERFLOW_DEBUG); } Sample* bufferLast = _buffer + _bufferLength - 1; @@ -297,7 +295,7 @@ int AudioRingBufferTemplate::writeSamplesWithFade(ConstIterator source, int m int samplesToDelete = samplesToCopy - samplesRoomFor; _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, samplesToDelete); _overflowCount++; - qCDebug(audio) << qPrintable(RING_BUFFER_OVERFLOW_DEBUG); + HIFI_FDEBUG(audio(), RING_BUFFER_OVERFLOW_DEBUG); } Sample* bufferLast = _buffer + _bufferLength - 1; diff --git a/libraries/audio/src/PositionalAudioStream.cpp b/libraries/audio/src/PositionalAudioStream.cpp index 49b34a894e..f006f370c8 100644 --- a/libraries/audio/src/PositionalAudioStream.cpp +++ b/libraries/audio/src/PositionalAudioStream.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -80,10 +81,7 @@ int PositionalAudioStream::parsePositionalData(const QByteArray& positionalByteA // if the client sends us a bad position, flag it so that we don't consider this stream for mixing if (glm::isnan(_position.x) || glm::isnan(_position.y) || glm::isnan(_position.z)) { - static const QString INVALID_POSITION_REGEX = "PositionalAudioStream unpacked invalid position for node"; - static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex(INVALID_POSITION_REGEX); - - qDebug() << "PositionalAudioStream unpacked invalid position for node" << uuidStringWithoutCurlyBraces(getNodeID()); + HIFI_FDEBUG((*QLoggingCategory::defaultCategory()), "PositionalAudioStream unpacked invalid position for node" << uuidStringWithoutCurlyBraces(getNodeID()) ); _hasValidPosition = false; } else { diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 5d056e17d8..22341298c8 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -2197,10 +2197,8 @@ void EntityItem::deserializeActionsInternal() { entity->addActionInternal(simulation, action); updated << actionID; } else { - static QString repeatedMessage = - LogHandler::getInstance().addRepeatedMessageRegex(".*action creation failed for.*"); - qCDebug(entities) << "EntityItem::deserializeActionsInternal -- action creation failed for" - << getID() << _name; // getName(); + HIFI_FDEBUG(entities(), "EntityItem::deserializeActionsInternal -- action creation failed for" + << getID() << _name); // getName(); removeActionInternal(actionID, nullptr); } } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 75f024d0b9..a8be7e89e9 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1630,11 +1630,9 @@ int EntityTree::processEditPacketData(ReceivedMessage& message, const unsigned c _recentlyDeletedEntityItemIDs.insert(usecTimestampNow(), entityItemID); } } else { - static QString repeatedMessage = - LogHandler::getInstance().addRepeatedMessageRegex("^Edit failed.*"); - qCDebug(entities) << "Edit failed. [" << message.getType() <<"] " << + HIFI_FDEBUG(entities(), "Edit failed. [" << message.getType() <<"] " << "entity id:" << entityItemID << - "existingEntity pointer:" << existingEntity.get(); + "existingEntity pointer:" << existingEntity.get()); } } diff --git a/libraries/fbx/src/FBXReader_Mesh.cpp b/libraries/fbx/src/FBXReader_Mesh.cpp index b0e2faa600..a71f467b94 100644 --- a/libraries/fbx/src/FBXReader_Mesh.cpp +++ b/libraries/fbx/src/FBXReader_Mesh.cpp @@ -566,20 +566,18 @@ glm::vec3 FBXReader::normalizeDirForPacking(const glm::vec3& dir) { } void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) { - static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex("buildModelMesh failed -- .*"); - unsigned int totalSourceIndices = 0; foreach(const FBXMeshPart& part, extractedMesh.parts) { totalSourceIndices += (part.quadTrianglesIndices.size() + part.triangleIndices.size()); } if (!totalSourceIndices) { - qCDebug(modelformat) << "buildModelMesh failed -- no indices, url = " << url; + HIFI_FDEBUG(modelformat(), "buildModelMesh failed -- no indices, url = " << url); return; } if (extractedMesh.vertices.size() == 0) { - qCDebug(modelformat) << "buildModelMesh failed -- no vertices, url = " << url; + HIFI_FDEBUG(modelformat(), "buildModelMesh failed -- no vertices, url = " << url); return; } diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index c6451fa955..685e775688 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -277,13 +277,8 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe emit dataReceived(sendingNodeType, packet.getPayloadSize()); return true; } else { - static const QString UNSOLICITED_REPLICATED_REGEX = - "Replicated packet of type \\d+ \\([\\sa-zA-Z:]+\\) received from unknown upstream"; - static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex(UNSOLICITED_REPLICATED_REGEX); - - qCDebug(networking) << "Replicated packet of type" << headerType - << "received from unknown upstream" << packet.getSenderSockAddr(); + HIFI_FDEBUG(networking(), "Replicated packet of type" << headerType + << "received from unknown upstream" << packet.getSenderSockAddr()); return false; } @@ -345,13 +340,7 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe return true; } else { - //static const QString UNKNOWN_REGEX = "Packet of type \\d+ \\([\\sa-zA-Z:]+\\) received from unknown node with UUID"; - //static QString repeatedMessage - // = LogHandler::getInstance().addRepeatedMessageRegex(UNKNOWN_REGEX); - //qCDebug(networking) << "Packet of type" << headerType - // << "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(sourceID); - - HIFI_FDEBUG(networking, + HIFI_FDEBUG(networking(), "Packet of type" << headerType << "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(sourceID)); } } diff --git a/libraries/networking/src/SequenceNumberStats.cpp b/libraries/networking/src/SequenceNumberStats.cpp index 6d7b271606..49d555f2eb 100644 --- a/libraries/networking/src/SequenceNumberStats.cpp +++ b/libraries/networking/src/SequenceNumberStats.cpp @@ -89,10 +89,7 @@ SequenceNumberStats::ArrivalInfo SequenceNumberStats::sequenceNumberReceived(qui } else if (absGap > MAX_REASONABLE_SEQUENCE_GAP) { arrivalInfo._status = Unreasonable; - static const QString UNREASONABLE_SEQUENCE_REGEX { "unreasonable sequence number: \\d+ previous: \\d+" }; - static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex(UNREASONABLE_SEQUENCE_REGEX); - - qCDebug(networking) << "unreasonable sequence number:" << incoming << "previous:" << _lastReceivedSequence; + HIFI_FDEBUG(networking(), "unreasonable sequence number:" << incoming << "previous:" << _lastReceivedSequence); _stats._unreasonable++; @@ -154,10 +151,7 @@ SequenceNumberStats::ArrivalInfo SequenceNumberStats::sequenceNumberReceived(qui arrivalInfo._status = Unreasonable; - static const QString UNREASONABLE_SEQUENCE_REGEX { "unreasonable sequence number: \\d+ \\(possible duplicate\\)" }; - static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex(UNREASONABLE_SEQUENCE_REGEX); - - qCDebug(networking) << "unreasonable sequence number:" << incoming << "(possible duplicate)"; + HIFI_FDEBUG(networking(), "unreasonable sequence number:" << incoming << "(possible duplicate)"); _stats._unreasonable++; diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index f07ea63994..942c676fe3 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -107,8 +107,7 @@ Packet::Packet(std::unique_ptr data, qint64 size, const HifiSockAddr& se QString::number(getMessagePartNumber())); } - static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex("^Unobfuscating packet .*"); - qCDebug(networking) << qPrintable(debugString); + HIFI_FDEBUG(networking(), debugString); #endif obfuscate(NoObfuscation); // Undo obfuscation diff --git a/libraries/networking/src/udt/SendQueue.cpp b/libraries/networking/src/udt/SendQueue.cpp index b62624aab9..e437104495 100644 --- a/libraries/networking/src/udt/SendQueue.cpp +++ b/libraries/networking/src/udt/SendQueue.cpp @@ -479,8 +479,7 @@ bool SendQueue::maybeResendPacket() { debugString = debugString.arg(QString::number(resendPacket.getMessageNumber()), QString::number(resendPacket.getMessagePartNumber())); } - static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex("^Obfuscating packet .*"); - qCritical() << qPrintable(debugString); + HIFI_FDEBUG((*QLoggingCategory::defaultCategory()), debugString); #endif // Create copy of the packet diff --git a/libraries/networking/src/udt/Socket.cpp b/libraries/networking/src/udt/Socket.cpp index 4189cb613c..e29aab0a64 100644 --- a/libraries/networking/src/udt/Socket.cpp +++ b/libraries/networking/src/udt/Socket.cpp @@ -229,11 +229,7 @@ qint64 Socket::writeDatagram(const QByteArray& datagram, const HifiSockAddr& soc if (bytesWritten < 0) { // when saturating a link this isn't an uncommon message - suppress it so it doesn't bomb the debug - static const QString WRITE_ERROR_REGEX = "Socket::writeDatagram QAbstractSocket::NetworkError - Unable to send a message"; - static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex(WRITE_ERROR_REGEX); - - qCDebug(networking) << "Socket::writeDatagram" << _udpSocket.error() << "-" << qPrintable(_udpSocket.errorString()); + HIFI_FDEBUG(networking(), "Socket::writeDatagram" << _udpSocket.error() << "-" << qPrintable(_udpSocket.errorString()) ); } return bytesWritten; @@ -517,11 +513,7 @@ std::vector Socket::getConnectionSockAddrs() { } void Socket::handleSocketError(QAbstractSocket::SocketError socketError) { - static const QString SOCKET_REGEX = "udt::Socket error - "; - static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex(SOCKET_REGEX); - - qCDebug(networking) << "udt::Socket error - " << socketError << _udpSocket.errorString(); + HIFI_FDEBUG(networking(), "udt::Socket error - " << socketError << _udpSocket.errorString()); } void Socket::handleStateChanged(QAbstractSocket::SocketState socketState) { diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index dafdfd5bf4..f2fb984da1 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -121,11 +121,7 @@ void Octree::recurseTreeWithPostOperation(const RecurseOctreeOperation& operatio void Octree::recurseElementWithOperation(const OctreeElementPointer& element, const RecurseOctreeOperation& operation, void* extraData, int recursionCount) { if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { - static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex( - "Octree::recurseElementWithOperation\\(\\) reached DANGEROUSLY_DEEP_RECURSION, bailing!"); - - qCDebug(octree) << "Octree::recurseElementWithOperation() reached DANGEROUSLY_DEEP_RECURSION, bailing!"; + HIFI_FDEBUG(octree(), "Octree::recurseElementWithOperation() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); return; } @@ -143,11 +139,7 @@ void Octree::recurseElementWithOperation(const OctreeElementPointer& element, co void Octree::recurseElementWithPostOperation(const OctreeElementPointer& element, const RecurseOctreeOperation& operation, void* extraData, int recursionCount) { if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { - static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex( - "Octree::recurseElementWithPostOperation\\(\\) reached DANGEROUSLY_DEEP_RECURSION, bailing!"); - - qCDebug(octree) << "Octree::recurseElementWithPostOperation() reached DANGEROUSLY_DEEP_RECURSION, bailing!"; + HIFI_FDEBUG(octree(), "Octree::recurseElementWithPostOperation() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); return; } @@ -173,11 +165,7 @@ void Octree::recurseElementWithOperationDistanceSorted(const OctreeElementPointe const glm::vec3& point, void* extraData, int recursionCount) { if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { - static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex( - "Octree::recurseElementWithOperationDistanceSorted\\(\\) reached DANGEROUSLY_DEEP_RECURSION, bailing!"); - - qCDebug(octree) << "Octree::recurseElementWithOperationDistanceSorted() reached DANGEROUSLY_DEEP_RECURSION, bailing!"; + HIFI_FDEBUG(octree(), "Octree::recurseElementWithOperationDistanceSorted() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); return; } @@ -215,11 +203,7 @@ void Octree::recurseTreeWithOperator(RecurseOctreeOperator* operatorObject) { bool Octree::recurseElementWithOperator(const OctreeElementPointer& element, RecurseOctreeOperator* operatorObject, int recursionCount) { if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { - static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex( - "Octree::recurseElementWithOperator\\(\\) reached DANGEROUSLY_DEEP_RECURSION, bailing!"); - - qCDebug(octree) << "Octree::recurseElementWithOperator() reached DANGEROUSLY_DEEP_RECURSION, bailing!"; + HIFI_FDEBUG(octree(), "Octree::recurseElementWithOperator() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); return false; } @@ -285,11 +269,7 @@ OctreeElementPointer Octree::createMissingElement(const OctreeElementPointer& la const unsigned char* codeToReach, int recursionCount) { if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { - static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex( - "Octree::createMissingElement\\(\\) reached DANGEROUSLY_DEEP_RECURSION, bailing!"); - - qCDebug(octree) << "Octree::createMissingElement() reached DANGEROUSLY_DEEP_RECURSION, bailing!"; + HIFI_FDEBUG(octree(), "Octree::createMissingElement() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); return lastParentElement; } int indexOfNewChild = branchIndexWithDescendant(lastParentElement->getOctalCode(), codeToReach); @@ -446,16 +426,9 @@ void Octree::readBitstreamToTree(const unsigned char * bitstream, uint64_t buffe (unsigned char *)bitstreamAt, NULL); int numberOfThreeBitSectionsInStream = numberOfThreeBitSectionsInCode(bitstreamAt, bufferSizeBytes); if (numberOfThreeBitSectionsInStream > UNREASONABLY_DEEP_RECURSION) { - static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex( - "UNEXPECTED: parsing of the octal code would make UNREASONABLY_DEEP_RECURSION... " - "numberOfThreeBitSectionsInStream: \\d+ This buffer is corrupt. Returning." - ); - - - qCDebug(octree) << "UNEXPECTED: parsing of the octal code would make UNREASONABLY_DEEP_RECURSION... " + HIFI_FDEBUG(octree(), "UNEXPECTED: parsing of the octal code would make UNREASONABLY_DEEP_RECURSION... " "numberOfThreeBitSectionsInStream:" << numberOfThreeBitSectionsInStream << - "This buffer is corrupt. Returning."; + "This buffer is corrupt. Returning."); return; } diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index 989951b661..18226f0ffb 100644 --- a/libraries/octree/src/OctreeElement.cpp +++ b/libraries/octree/src/OctreeElement.cpp @@ -401,11 +401,7 @@ OctreeElementPointer OctreeElement::addChildAtIndex(int childIndex) { bool OctreeElement::safeDeepDeleteChildAtIndex(int childIndex, int recursionCount) { bool deleteApproved = false; if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { - static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex( - "OctreeElement::safeDeepDeleteChildAtIndex\\(\\) reached DANGEROUSLY_DEEP_RECURSION, bailing!"); - - qCDebug(octree) << "OctreeElement::safeDeepDeleteChildAtIndex() reached DANGEROUSLY_DEEP_RECURSION, bailing!"; + HIFI_FDEBUG(octree(), "OctreeElement::safeDeepDeleteChildAtIndex() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); return deleteApproved; } OctreeElementPointer childToDelete = getChildAtIndex(childIndex); diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index 054603440d..3253a4dc07 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -636,12 +636,8 @@ void OctreeSceneStats::trackIncomingOctreePacket(ReceivedMessage& message, bool const qint64 MAX_RESONABLE_FLIGHT_TIME = 200 * USECS_PER_SECOND; // 200 seconds is more than enough time for a packet to arrive const qint64 MIN_RESONABLE_FLIGHT_TIME = -1 * (qint64)USECS_PER_SECOND; // more than 1 second of "reverse flight time" would be unreasonable if (flightTime > MAX_RESONABLE_FLIGHT_TIME || flightTime < MIN_RESONABLE_FLIGHT_TIME) { - static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex( - "ignoring unreasonable packet... flightTime: -?\\d+ nodeClockSkewUsec: -?\\d+ usecs"); - - qCDebug(octree) << "ignoring unreasonable packet... flightTime:" << flightTime - << "nodeClockSkewUsec:" << nodeClockSkewUsec << "usecs";; + HIFI_FDEBUG(octree(), "ignoring unreasonable packet... flightTime:" << flightTime + << "nodeClockSkewUsec:" << nodeClockSkewUsec << "usecs"); return; // ignore any packets that are unreasonable } diff --git a/libraries/physics/src/ObjectConstraintBallSocket.cpp b/libraries/physics/src/ObjectConstraintBallSocket.cpp index 70613d46ae..4a9ef0f1ac 100644 --- a/libraries/physics/src/ObjectConstraintBallSocket.cpp +++ b/libraries/physics/src/ObjectConstraintBallSocket.cpp @@ -85,12 +85,9 @@ btTypedConstraint* ObjectConstraintBallSocket::getConstraint() { return constraint; } - static QString repeatedBallSocketNoRigidBody = LogHandler::getInstance().addRepeatedMessageRegex( - "ObjectConstraintBallSocket::getConstraint -- no rigidBody.*"); - btRigidBody* rigidBodyA = getRigidBody(); if (!rigidBodyA) { - qCDebug(physics) << "ObjectConstraintBallSocket::getConstraint -- no rigidBodyA"; + HIFI_FDEBUG(physics(), "ObjectConstraintBallSocket::getConstraint -- no rigidBodyA"); return nullptr; } @@ -99,7 +96,7 @@ btTypedConstraint* ObjectConstraintBallSocket::getConstraint() { btRigidBody* rigidBodyB = getOtherRigidBody(otherEntityID); if (!rigidBodyB) { - qCDebug(physics) << "ObjectConstraintBallSocket::getConstraint -- no rigidBodyB"; + HIFI_FDEBUG(physics(), "ObjectConstraintBallSocket::getConstraint -- no rigidBodyB"); return nullptr; } diff --git a/libraries/physics/src/ObjectConstraintConeTwist.cpp b/libraries/physics/src/ObjectConstraintConeTwist.cpp index 86f1f21c63..01972805d3 100644 --- a/libraries/physics/src/ObjectConstraintConeTwist.cpp +++ b/libraries/physics/src/ObjectConstraintConeTwist.cpp @@ -96,12 +96,9 @@ btTypedConstraint* ObjectConstraintConeTwist::getConstraint() { return constraint; } - static QString repeatedConeTwistNoRigidBody = LogHandler::getInstance().addRepeatedMessageRegex( - "ObjectConstraintConeTwist::getConstraint -- no rigidBody.*"); - btRigidBody* rigidBodyA = getRigidBody(); if (!rigidBodyA) { - qCDebug(physics) << "ObjectConstraintConeTwist::getConstraint -- no rigidBodyA"; + HIFI_FDEBUG(physics(), "ObjectConstraintConeTwist::getConstraint -- no rigidBodyA"); return nullptr; } @@ -130,7 +127,7 @@ btTypedConstraint* ObjectConstraintConeTwist::getConstraint() { btRigidBody* rigidBodyB = getOtherRigidBody(otherEntityID); if (!rigidBodyB) { - qCDebug(physics) << "ObjectConstraintConeTwist::getConstraint -- no rigidBodyB"; + HIFI_FDEBUG(physics(), "ObjectConstraintConeTwist::getConstraint -- no rigidBodyB"); return nullptr; } diff --git a/libraries/physics/src/ObjectConstraintHinge.cpp b/libraries/physics/src/ObjectConstraintHinge.cpp index 99ddd45abd..8fb1ca19a8 100644 --- a/libraries/physics/src/ObjectConstraintHinge.cpp +++ b/libraries/physics/src/ObjectConstraintHinge.cpp @@ -95,12 +95,9 @@ btTypedConstraint* ObjectConstraintHinge::getConstraint() { return constraint; } - static QString repeatedHingeNoRigidBody = LogHandler::getInstance().addRepeatedMessageRegex( - "ObjectConstraintHinge::getConstraint -- no rigidBody.*"); - btRigidBody* rigidBodyA = getRigidBody(); if (!rigidBodyA) { - qCDebug(physics) << "ObjectConstraintHinge::getConstraint -- no rigidBodyA"; + HIFI_FDEBUG(physics(), "ObjectConstraintHinge::getConstraint -- no rigidBodyA"); return nullptr; } @@ -115,7 +112,7 @@ btTypedConstraint* ObjectConstraintHinge::getConstraint() { // This hinge is between two entities... find the other rigid body. btRigidBody* rigidBodyB = getOtherRigidBody(otherEntityID); if (!rigidBodyB) { - qCDebug(physics) << "ObjectConstraintHinge::getConstraint -- no rigidBodyB"; + HIFI_FDEBUG(physics(), "ObjectConstraintHinge::getConstraint -- no rigidBodyB"); return nullptr; } diff --git a/libraries/physics/src/ObjectConstraintSlider.cpp b/libraries/physics/src/ObjectConstraintSlider.cpp index c236afc10d..73ec59eb7c 100644 --- a/libraries/physics/src/ObjectConstraintSlider.cpp +++ b/libraries/physics/src/ObjectConstraintSlider.cpp @@ -87,12 +87,9 @@ btTypedConstraint* ObjectConstraintSlider::getConstraint() { return constraint; } - static QString repeatedSliderNoRigidBody = LogHandler::getInstance().addRepeatedMessageRegex( - "ObjectConstraintSlider::getConstraint -- no rigidBody.*"); - btRigidBody* rigidBodyA = getRigidBody(); if (!rigidBodyA) { - qCDebug(physics) << "ObjectConstraintSlider::getConstraint -- no rigidBodyA"; + HIFI_FDEBUG(physics(), "ObjectConstraintSlider::getConstraint -- no rigidBodyA"); return nullptr; } @@ -121,7 +118,7 @@ btTypedConstraint* ObjectConstraintSlider::getConstraint() { btRigidBody* rigidBodyB = getOtherRigidBody(otherEntityID); if (!rigidBodyB) { - qCDebug(physics) << "ObjectConstraintSlider::getConstraint -- no rigidBodyB"; + HIFI_FDEBUG(physics(), "ObjectConstraintSlider::getConstraint -- no rigidBodyB"); return nullptr; } diff --git a/libraries/render-utils/src/BackgroundStage.cpp b/libraries/render-utils/src/BackgroundStage.cpp index 886795ec79..d9115c7943 100644 --- a/libraries/render-utils/src/BackgroundStage.cpp +++ b/libraries/render-utils/src/BackgroundStage.cpp @@ -126,9 +126,6 @@ void DrawBackgroundStage::run(const render::RenderContextPointer& renderContext, if (defaultSkyboxAmbientTexture) { sceneKeyLight->setAmbientSphere(defaultSkyboxAmbientTexture->getIrradiance()); sceneKeyLight->setAmbientMap(defaultSkyboxAmbientTexture); - } else { - static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex( - "Failed to get a valid Default Skybox Ambient Texture ? probably because it couldn't be find during initialization step"); } // fall through: render defaults skybox } else { diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index bdff97c1c1..1d6c0edab5 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -55,9 +55,7 @@ void renderShape(RenderArgs* args, const ShapePlumberPointer& shapeContext, cons } else if (key.hasOwnPipeline()) { item.render(args); } else { - qCDebug(renderlogging) << "Item could not be rendered with invalid key" << key; - static QString repeatedCouldNotBeRendered = LogHandler::getInstance().addRepeatedMessageRegex( - "Item could not be rendered with invalid key.*"); + HIFI_FDEBUG(renderlogging(), "Item could not be rendered with invalid key" << key); } args->_itemShapeKey = 0; } @@ -108,9 +106,7 @@ void render::renderStateSortShapes(const RenderContextPointer& renderContext, } else if (key.hasOwnPipeline()) { ownPipelineBucket.push_back( std::make_tuple(item, key) ); } else { - static QString repeatedCouldNotBeRendered = LogHandler::getInstance().addRepeatedMessageRegex( - "Item could not be rendered with invalid key.*"); - qCDebug(renderlogging) << "Item could not be rendered with invalid key" << key; + HIFI_FDEBUG(renderlogging(), "Item could not be rendered with invalid key" << key); } } } diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index b5a0f069e9..06287e4d81 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -91,22 +91,6 @@ void LogHandler::setShouldDisplayMilliseconds(bool shouldDisplayMilliseconds) { void LogHandler::flushRepeatedMessages() { QMutexLocker lock(&_mutex); - for(auto& message: _repeatedMessages) { - - if (message.messageCount > 1) { - QString repeatMessage = QString("%1 repeated log entries matching \"%2\" - Last entry: \"%3\"") - .arg(message.messageCount - 1) - .arg(message.regexp.pattern()) - .arg(message.lastMessage); - - QMessageLogContext emptyContext; - lock.unlock(); - printMessage(LogSuppressed, emptyContext, repeatMessage); - lock.relock(); - } - - message.messageCount = 0; - } // New repeat-supress scheme: for (int m = 0; m < (int)_repeatCounts.size(); ++m) { @@ -127,20 +111,6 @@ QString LogHandler::printMessage(LogMsgType type, const QMessageLogContext& cont } QMutexLocker lock(&_mutex); - if (type == LogDebug) { - // for debug messages, check if this matches any of our regexes for repeated log messages - for (auto& repeatRegex : _repeatedMessages) { - if (repeatRegex.regexp.indexIn(message) != -1) { - // If we've printed the first one then return out. - if (repeatRegex.messageCount++ == 0) { - break; - } - repeatRegex.lastMessage = message; - return QString(); - } - } - } - if (type == LogDebug) { // see if this message is one we should only print once for (auto& onceOnly : _onetimeMessages) { @@ -211,17 +181,6 @@ void LogHandler::setupRepeatedMessageFlusher() { }); } -const QString& LogHandler::addRepeatedMessageRegex(const QString& regexString) { - // make sure we setup the repeated message flusher, but do it on the LogHandler thread - QMetaObject::invokeMethod(this, "setupRepeatedMessageFlusher"); - - QMutexLocker lock(&_mutex); - RepeatedMessage repeatRecord; - repeatRecord.regexp = QRegExp(regexString); - _repeatedMessages.push_back(repeatRecord); - return regexString; -} - const QString& LogHandler::addOnlyOnceMessageRegex(const QString& regexString) { QMutexLocker lock(&_mutex); OnceOnlyMessage onetimeMessage; diff --git a/libraries/shared/src/LogHandler.h b/libraries/shared/src/LogHandler.h index 8ca8158ec0..a84ce96df9 100644 --- a/libraries/shared/src/LogHandler.h +++ b/libraries/shared/src/LogHandler.h @@ -51,7 +51,6 @@ public: /// prints various process, message type, and time information static void verboseMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString &message); - const QString& addRepeatedMessageRegex(const QString& regexString); const QString& addOnlyOnceMessageRegex(const QString& regexString); int newRepeatedMessageID(); void printRepeatedMessage(int messageID, LogMsgType type, const QMessageLogContext& context, const QString &message); @@ -70,13 +69,6 @@ private: bool _shouldOutputThreadID { false }; bool _shouldDisplayMilliseconds { false }; - struct RepeatedMessage { - QRegExp regexp; - int messageCount { 0 }; - QString lastMessage; - }; - std::vector _repeatedMessages; - struct OnceOnlyMessage { QRegExp regexp; int messageCount { 0 }; @@ -91,7 +83,7 @@ private: #define HIFI_FDEBUG(category, message) \ do { \ - if (category().isDebugEnabled()) { \ + if (category.isDebugEnabled()) { \ static int repeatedMessageID_ = LogHandler::getInstance().newRepeatedMessageID(); \ QString logString_; \ QDebug debugStringReceiver_(&logString_); \ From c9c3d8f3327711ecb15b5500fcf0b1f523544d0a Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 4 Apr 2018 08:07:35 -0700 Subject: [PATCH 08/98] adding entity selection for far grabbing --- .../controllers/controllerDispatcher.js | 9 +- .../controllerModules/farActionGrabEntity.js | 83 ++++++++++++------- .../libraries/controllerDispatcherUtils.js | 18 +++- 3 files changed, 78 insertions(+), 32 deletions(-) diff --git a/scripts/system/controllers/controllerDispatcher.js b/scripts/system/controllers/controllerDispatcher.js index 4f041d3067..86b7a98b2d 100644 --- a/scripts/system/controllers/controllerDispatcher.js +++ b/scripts/system/controllers/controllerDispatcher.js @@ -7,11 +7,12 @@ /* jslint bitwise: true */ -/* global Script, Entities, Overlays, Controller, Vec3, Quat, getControllerWorldLocation, +/* global Script, Entities, Overlays, Controller, Vec3, Quat, getControllerWorldLocation, controllerDispatcherPlugins:true, controllerDispatcherPluginsNeedSort:true, LEFT_HAND, RIGHT_HAND, NEAR_GRAB_PICK_RADIUS, DEFAULT_SEARCH_SPHERE_DISTANCE, DISPATCHER_PROPERTIES, getGrabPointSphereOffset, HMD, MyAvatar, Messages, findHandChildEntities, Picks, PickType, Pointers, COLORS_GRAB_SEARCHING_HALF_SQUEEZE - COLORS_GRAB_SEARCHING_FULL_SQUEEZE, COLORS_GRAB_DISTANCE_HOLD, TRIGGER_ON_VALUE, PointerManager + COLORS_GRAB_SEARCHING_FULL_SQUEEZE, COLORS_GRAB_DISTANCE_HOLD, TRIGGER_ON_VALUE, PointerManager, print + Selection, DISPATCHER_HOVERING_LIST, DISPATCHER_HOVERING_STYLE */ controllerDispatcherPlugins = {}; @@ -123,6 +124,8 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); return getControllerWorldLocation(Controller.Standard.RightHand, true); }; + Selection.enableListHighlight(DISPATCHER_HOVERING_LIST, DISPATCHER_HOVERING_STYLE); + this.updateTimings = function () { _this.intervalCount++; var thisInterval = Date.now(); @@ -157,7 +160,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); this.update = function () { try { _this.updateInternal(); - } catch (e) { + } catch (e) { print(e); } Script.setTimeout(_this.update, BASIC_TIMER_INTERVAL_MS); diff --git a/scripts/system/controllers/controllerModules/farActionGrabEntity.js b/scripts/system/controllers/controllerModules/farActionGrabEntity.js index 53272c324d..9dd82e0363 100644 --- a/scripts/system/controllers/controllerModules/farActionGrabEntity.js +++ b/scripts/system/controllers/controllerModules/farActionGrabEntity.js @@ -14,7 +14,7 @@ PICK_MAX_DISTANCE, COLORS_GRAB_SEARCHING_HALF_SQUEEZE, COLORS_GRAB_SEARCHING_FULL_SQUEEZE, COLORS_GRAB_DISTANCE_HOLD, DEFAULT_SEARCH_SPHERE_DISTANCE, TRIGGER_OFF_VALUE, TRIGGER_ON_VALUE, ZERO_VEC, ensureDynamic, getControllerWorldLocation, projectOntoEntityXYPlane, ContextOverlay, HMD, Reticle, Overlays, isPointingAtUI - Picks, makeLaserLockInfo Xform, makeLaserParams, AddressManager, getEntityParents, Selection + Picks, makeLaserLockInfo Xform, makeLaserParams, AddressManager, getEntityParents, Selection, DISPATCHER_HOVERING_LIST */ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); @@ -103,6 +103,7 @@ Script.include("/~/system/libraries/Xform.js"); this.contextOverlayTimer = false; this.previousCollisionStatus = false; this.locked = false; + this.highlightedEntity = null; this.reticleMinX = MARGIN; this.reticleMaxX; this.reticleMinY = MARGIN; @@ -449,7 +450,9 @@ Script.include("/~/system/libraries/Xform.js"); if (rayPickInfo.type === Picks.INTERSECTED_ENTITY) { if (controllerData.triggerClicks[this.hand]) { var entityID = rayPickInfo.objectID; - + Selection.removeFromSelectedItemsList(DISPATCHER_HOVERING_LIST, "entity", + this.highlightedEntity); + this.highlightedEntity = null; var targetProps = Entities.getEntityProperties(entityID, [ "dynamic", "shapeType", "position", "rotation", "dimensions", "density", @@ -497,38 +500,62 @@ Script.include("/~/system/libraries/Xform.js"); this.startFarGrabAction(controllerData, targetProps); } } - } else if (!this.entityWithContextOverlay) { - var _this = this; + } else { + var targetEntityID = rayPickInfo.objectID; + if (this.highlightedEntity !== targetEntityID) { + Selection.removeFromSelectedItemsList(DISPATCHER_HOVERING_LIST, "entity", + this.highlightedEntity); + var selectionTargetProps = Entities.getEntityProperties(targetEntityID, [ + "dynamic", "shapeType", "position", + "rotation", "dimensions", "density", + "userData", "locked", "type", "href" + ]); - if (_this.potentialEntityWithContextOverlay !== rayPickInfo.objectID) { - if (_this.contextOverlayTimer) { - Script.clearTimeout(_this.contextOverlayTimer); + var selectionTargetObject = new TargetObject(targetEntityID, selectionTargetProps); + selectionTargetObject.parentProps = getEntityParents(selectionTargetProps); + var selectionTargetEntity = selectionTargetObject.getTargetEntity(); + + if (entityIsGrabbable(selectionTargetEntity.props) || + entityIsGrabbable(selectionTargetObject.entityProps)) { + + Selection.addToSelectedItemsList(DISPATCHER_HOVERING_LIST, "entity", rayPickInfo.objectID); } - _this.contextOverlayTimer = false; - _this.potentialEntityWithContextOverlay = rayPickInfo.objectID; + this.highlightedEntity = rayPickInfo.objectID; } - if (!_this.contextOverlayTimer) { - _this.contextOverlayTimer = Script.setTimeout(function () { - if (!_this.entityWithContextOverlay && - _this.contextOverlayTimer && - _this.potentialEntityWithContextOverlay === rayPickInfo.objectID) { - var props = Entities.getEntityProperties(rayPickInfo.objectID); - var pointerEvent = { - type: "Move", - id: _this.hand + 1, // 0 is reserved for hardware mouse - pos2D: projectOntoEntityXYPlane(rayPickInfo.objectID, rayPickInfo.intersection, props), - pos3D: rayPickInfo.intersection, - normal: rayPickInfo.surfaceNormal, - direction: Vec3.subtract(ZERO_VEC, rayPickInfo.surfaceNormal), - button: "Secondary" - }; - if (ContextOverlay.createOrDestroyContextOverlay(rayPickInfo.objectID, pointerEvent)) { - _this.entityWithContextOverlay = rayPickInfo.objectID; - } + if (!this.entityWithContextOverlay) { + var _this = this; + + if (_this.potentialEntityWithContextOverlay !== rayPickInfo.objectID) { + if (_this.contextOverlayTimer) { + Script.clearTimeout(_this.contextOverlayTimer); } _this.contextOverlayTimer = false; - }, 500); + _this.potentialEntityWithContextOverlay = rayPickInfo.objectID; + } + + if (!_this.contextOverlayTimer) { + _this.contextOverlayTimer = Script.setTimeout(function () { + if (!_this.entityWithContextOverlay && + _this.contextOverlayTimer && + _this.potentialEntityWithContextOverlay === rayPickInfo.objectID) { + var props = Entities.getEntityProperties(rayPickInfo.objectID); + var pointerEvent = { + type: "Move", + id: _this.hand + 1, // 0 is reserved for hardware mouse + pos2D: projectOntoEntityXYPlane(rayPickInfo.objectID, rayPickInfo.intersection, props), + pos3D: rayPickInfo.intersection, + normal: rayPickInfo.surfaceNormal, + direction: Vec3.subtract(ZERO_VEC, rayPickInfo.surfaceNormal), + button: "Secondary" + }; + if (ContextOverlay.createOrDestroyContextOverlay(rayPickInfo.objectID, pointerEvent)) { + _this.entityWithContextOverlay = rayPickInfo.objectID; + } + } + _this.contextOverlayTimer = false; + }, 500); + } } } } else if (this.distanceRotating) { diff --git a/scripts/system/libraries/controllerDispatcherUtils.js b/scripts/system/libraries/controllerDispatcherUtils.js index 75e1d6668b..05f6aa9fbf 100644 --- a/scripts/system/libraries/controllerDispatcherUtils.js +++ b/scripts/system/libraries/controllerDispatcherUtils.js @@ -22,6 +22,8 @@ DISPATCHER_PROPERTIES:true, HAPTIC_PULSE_STRENGTH:true, HAPTIC_PULSE_DURATION:true, + DISPATCHER_HOVERING_LIST:true, + DISPATCHER_HOVERING_STYLE:true, Entities, makeDispatcherModuleParameters:true, makeRunningValues:true, @@ -88,6 +90,19 @@ NEAR_GRAB_RADIUS = 1.0; TEAR_AWAY_DISTANCE = 0.1; // ungrab an entity if its bounding-box moves this far from the hand TEAR_AWAY_COUNT = 2; // multiply by TEAR_AWAY_CHECK_TIME to know how long the item must be away TEAR_AWAY_CHECK_TIME = 0.15; // seconds, duration between checks +DISPATCHER_HOVERING_LIST = "dispactherHoveringList"; +DISPATCHER_HOVERING_STYLE = { + isOutlineSmooth: true, + outlineWidth: 5, + outlineUnoccludedColor: {red: 255, green: 128, blue: 128}, + outlineUnoccludedAlpha: 0.88, + outlineOccludedColor: {red: 255, green: 128, blue: 128}, + outlineOccludedAlpha:0.5, + fillUnoccludedColor: {red: 26, green: 0, blue: 0}, + fillUnoccludedAlpha: 0.0, + fillOccludedColor: {red: 26, green: 0, blue: 0}, + fillOccludedAlpha: 0.0 +}; DISPATCHER_PROPERTIES = [ "position", @@ -400,6 +415,7 @@ if (typeof module !== 'undefined') { projectOntoOverlayXYPlane: projectOntoOverlayXYPlane, projectOntoEntityXYPlane: projectOntoEntityXYPlane, TRIGGER_OFF_VALUE: TRIGGER_OFF_VALUE, - TRIGGER_ON_VALUE: TRIGGER_ON_VALUE + TRIGGER_ON_VALUE: TRIGGER_ON_VALUE, + DISPATCHER_HOVERING_LIST: DISPATCHER_HOVERING_LIST }; } From 692ccfc09b9051abbac8ff4f72d98a05fc7e18d0 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 4 Apr 2018 09:49:15 -0700 Subject: [PATCH 09/98] Create HIFI_FCDEBUG(_ID) variants that require a category Original macros use default settings. --- domain-server/src/DomainServer.cpp | 6 +++--- interface/src/Application.cpp | 2 +- interface/src/InterfaceDynamicFactory.cpp | 2 +- libraries/audio/src/AudioRingBuffer.cpp | 8 ++++---- libraries/audio/src/PositionalAudioStream.cpp | 2 +- libraries/entities/src/EntityItem.cpp | 2 +- libraries/entities/src/EntityTree.cpp | 2 +- libraries/fbx/src/FBXReader_Mesh.cpp | 4 ++-- libraries/networking/src/LimitedNodeList.cpp | 4 ++-- libraries/networking/src/SequenceNumberStats.cpp | 4 ++-- libraries/networking/src/udt/Packet.cpp | 2 +- libraries/networking/src/udt/SendQueue.cpp | 2 +- libraries/networking/src/udt/Socket.cpp | 4 ++-- libraries/octree/src/Octree.cpp | 12 ++++++------ libraries/octree/src/OctreeElement.cpp | 2 +- libraries/octree/src/OctreeSceneStats.cpp | 2 +- libraries/physics/src/ObjectConstraintBallSocket.cpp | 4 ++-- libraries/physics/src/ObjectConstraintConeTwist.cpp | 4 ++-- libraries/physics/src/ObjectConstraintHinge.cpp | 4 ++-- libraries/physics/src/ObjectConstraintSlider.cpp | 4 ++-- libraries/render/src/render/DrawTask.cpp | 4 ++-- libraries/shared/src/LogHandler.h | 10 +++++++--- 22 files changed, 47 insertions(+), 43 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 0965ef7bca..b1f996c9b2 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -611,13 +611,13 @@ bool DomainServer::isPacketVerified(const udt::Packet& packet) { // let the NodeList do its checks now (but pass it the sourceNode so it doesn't need to look it up again) return nodeList->isPacketVerifiedWithSource(packet, sourceNode.data()); } else { - HIFI_FDEBUG((*QLoggingCategory::defaultCategory()), "Packet of type" << headerType + HIFI_FDEBUG("Packet of type" << headerType << "received from unmatched IP for UUID" << uuidStringWithoutCurlyBraces(sourceID)); return false; } } else { - HIFI_FDEBUG((*QLoggingCategory::defaultCategory()), "Packet of type" << headerType + HIFI_FDEBUG("Packet of type" << headerType << "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(sourceID)); return false; @@ -1268,7 +1268,7 @@ void DomainServer::processRequestAssignmentPacket(QSharedPointershouldBePhysical() && !entity->isReadyToComputeShape()) { - HIFI_FDEBUG(interfaceapp(), "Physics disabled until entity loads: " << entity->getID() << entity->getName()); + HIFI_FCDEBUG(interfaceapp(), "Physics disabled until entity loads: " << entity->getID() << entity->getName()); // don't break here because we want all the relevant entities to start their downloads result = false; } diff --git a/interface/src/InterfaceDynamicFactory.cpp b/interface/src/InterfaceDynamicFactory.cpp index dc8a789d32..b7861b56c8 100644 --- a/interface/src/InterfaceDynamicFactory.cpp +++ b/interface/src/InterfaceDynamicFactory.cpp @@ -87,7 +87,7 @@ EntityDynamicPointer InterfaceDynamicFactory::factoryBA(EntityItemPointer ownerE if (dynamic) { dynamic->deserialize(data); if (dynamic->lifetimeIsOver()) { - HIFI_FDEBUG((*QLoggingCategory::defaultCategory()), "InterfaceDynamicFactory::factoryBA lifetimeIsOver during dynamic creation --" + HIFI_FDEBUG("InterfaceDynamicFactory::factoryBA lifetimeIsOver during dynamic creation --" << dynamic->getExpires() << "<" << usecTimestampNow()); return nullptr; } diff --git a/libraries/audio/src/AudioRingBuffer.cpp b/libraries/audio/src/AudioRingBuffer.cpp index ded390a4db..7b1f24e519 100644 --- a/libraries/audio/src/AudioRingBuffer.cpp +++ b/libraries/audio/src/AudioRingBuffer.cpp @@ -164,7 +164,7 @@ int AudioRingBufferTemplate::writeData(const char* data, int maxSize) { _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, samplesToDelete); _overflowCount++; - HIFI_FDEBUG(audio(), RING_BUFFER_OVERFLOW_DEBUG); + HIFI_FCDEBUG(audio(), RING_BUFFER_OVERFLOW_DEBUG); qPrintable(RING_BUFFER_OVERFLOW_DEBUG); } @@ -222,7 +222,7 @@ int AudioRingBufferTemplate::addSilentSamples(int silentSamples) { if (numWriteSamples > samplesRoomFor) { numWriteSamples = samplesRoomFor; - HIFI_FDEBUG(audio(), DROPPED_SILENT_DEBUG); + HIFI_FCDEBUG(audio(), DROPPED_SILENT_DEBUG); } if (_endOfLastWrite + numWriteSamples > _buffer + _bufferLength) { @@ -273,7 +273,7 @@ int AudioRingBufferTemplate::writeSamples(ConstIterator source, int maxSample int samplesToDelete = samplesToCopy - samplesRoomFor; _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, samplesToDelete); _overflowCount++; - HIFI_FDEBUG(audio(), RING_BUFFER_OVERFLOW_DEBUG); + HIFI_FCDEBUG(audio(), RING_BUFFER_OVERFLOW_DEBUG); } Sample* bufferLast = _buffer + _bufferLength - 1; @@ -295,7 +295,7 @@ int AudioRingBufferTemplate::writeSamplesWithFade(ConstIterator source, int m int samplesToDelete = samplesToCopy - samplesRoomFor; _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, samplesToDelete); _overflowCount++; - HIFI_FDEBUG(audio(), RING_BUFFER_OVERFLOW_DEBUG); + HIFI_FCDEBUG(audio(), RING_BUFFER_OVERFLOW_DEBUG); } Sample* bufferLast = _buffer + _bufferLength - 1; diff --git a/libraries/audio/src/PositionalAudioStream.cpp b/libraries/audio/src/PositionalAudioStream.cpp index f006f370c8..a6bbc71a65 100644 --- a/libraries/audio/src/PositionalAudioStream.cpp +++ b/libraries/audio/src/PositionalAudioStream.cpp @@ -81,7 +81,7 @@ int PositionalAudioStream::parsePositionalData(const QByteArray& positionalByteA // if the client sends us a bad position, flag it so that we don't consider this stream for mixing if (glm::isnan(_position.x) || glm::isnan(_position.y) || glm::isnan(_position.z)) { - HIFI_FDEBUG((*QLoggingCategory::defaultCategory()), "PositionalAudioStream unpacked invalid position for node" << uuidStringWithoutCurlyBraces(getNodeID()) ); + HIFI_FDEBUG("PositionalAudioStream unpacked invalid position for node" << uuidStringWithoutCurlyBraces(getNodeID()) ); _hasValidPosition = false; } else { diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 22341298c8..813be9dace 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -2197,7 +2197,7 @@ void EntityItem::deserializeActionsInternal() { entity->addActionInternal(simulation, action); updated << actionID; } else { - HIFI_FDEBUG(entities(), "EntityItem::deserializeActionsInternal -- action creation failed for" + HIFI_FCDEBUG(entities(), "EntityItem::deserializeActionsInternal -- action creation failed for" << getID() << _name); // getName(); removeActionInternal(actionID, nullptr); } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index a8be7e89e9..8f158edecd 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1630,7 +1630,7 @@ int EntityTree::processEditPacketData(ReceivedMessage& message, const unsigned c _recentlyDeletedEntityItemIDs.insert(usecTimestampNow(), entityItemID); } } else { - HIFI_FDEBUG(entities(), "Edit failed. [" << message.getType() <<"] " << + HIFI_FCDEBUG(entities(), "Edit failed. [" << message.getType() <<"] " << "entity id:" << entityItemID << "existingEntity pointer:" << existingEntity.get()); } diff --git a/libraries/fbx/src/FBXReader_Mesh.cpp b/libraries/fbx/src/FBXReader_Mesh.cpp index a71f467b94..2cb9d3ed9f 100644 --- a/libraries/fbx/src/FBXReader_Mesh.cpp +++ b/libraries/fbx/src/FBXReader_Mesh.cpp @@ -572,12 +572,12 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) { } if (!totalSourceIndices) { - HIFI_FDEBUG(modelformat(), "buildModelMesh failed -- no indices, url = " << url); + HIFI_FCDEBUG(modelformat(), "buildModelMesh failed -- no indices, url = " << url); return; } if (extractedMesh.vertices.size() == 0) { - HIFI_FDEBUG(modelformat(), "buildModelMesh failed -- no vertices, url = " << url); + HIFI_FCDEBUG(modelformat(), "buildModelMesh failed -- no vertices, url = " << url); return; } diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 685e775688..fa934b5539 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -277,7 +277,7 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe emit dataReceived(sendingNodeType, packet.getPayloadSize()); return true; } else { - HIFI_FDEBUG(networking(), "Replicated packet of type" << headerType + HIFI_FCDEBUG(networking(), "Replicated packet of type" << headerType << "received from unknown upstream" << packet.getSenderSockAddr()); return false; @@ -340,7 +340,7 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe return true; } else { - HIFI_FDEBUG(networking(), + HIFI_FCDEBUG(networking(), "Packet of type" << headerType << "received from unknown node with UUID" << uuidStringWithoutCurlyBraces(sourceID)); } } diff --git a/libraries/networking/src/SequenceNumberStats.cpp b/libraries/networking/src/SequenceNumberStats.cpp index 49d555f2eb..7f1ee39554 100644 --- a/libraries/networking/src/SequenceNumberStats.cpp +++ b/libraries/networking/src/SequenceNumberStats.cpp @@ -89,7 +89,7 @@ SequenceNumberStats::ArrivalInfo SequenceNumberStats::sequenceNumberReceived(qui } else if (absGap > MAX_REASONABLE_SEQUENCE_GAP) { arrivalInfo._status = Unreasonable; - HIFI_FDEBUG(networking(), "unreasonable sequence number:" << incoming << "previous:" << _lastReceivedSequence); + HIFI_FCDEBUG(networking(), "unreasonable sequence number:" << incoming << "previous:" << _lastReceivedSequence); _stats._unreasonable++; @@ -151,7 +151,7 @@ SequenceNumberStats::ArrivalInfo SequenceNumberStats::sequenceNumberReceived(qui arrivalInfo._status = Unreasonable; - HIFI_FDEBUG(networking(), "unreasonable sequence number:" << incoming << "(possible duplicate)"); + HIFI_FCDEBUG(networking(), "unreasonable sequence number:" << incoming << "(possible duplicate)"); _stats._unreasonable++; diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 942c676fe3..0456fa1223 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -107,7 +107,7 @@ Packet::Packet(std::unique_ptr data, qint64 size, const HifiSockAddr& se QString::number(getMessagePartNumber())); } - HIFI_FDEBUG(networking(), debugString); + HIFI_FCDEBUG(networking(), debugString); #endif obfuscate(NoObfuscation); // Undo obfuscation diff --git a/libraries/networking/src/udt/SendQueue.cpp b/libraries/networking/src/udt/SendQueue.cpp index e437104495..0df54d539d 100644 --- a/libraries/networking/src/udt/SendQueue.cpp +++ b/libraries/networking/src/udt/SendQueue.cpp @@ -479,7 +479,7 @@ bool SendQueue::maybeResendPacket() { debugString = debugString.arg(QString::number(resendPacket.getMessageNumber()), QString::number(resendPacket.getMessagePartNumber())); } - HIFI_FDEBUG((*QLoggingCategory::defaultCategory()), debugString); + HIFI_FDEBUG(debugString); #endif // Create copy of the packet diff --git a/libraries/networking/src/udt/Socket.cpp b/libraries/networking/src/udt/Socket.cpp index e29aab0a64..4d4303698b 100644 --- a/libraries/networking/src/udt/Socket.cpp +++ b/libraries/networking/src/udt/Socket.cpp @@ -229,7 +229,7 @@ qint64 Socket::writeDatagram(const QByteArray& datagram, const HifiSockAddr& soc if (bytesWritten < 0) { // when saturating a link this isn't an uncommon message - suppress it so it doesn't bomb the debug - HIFI_FDEBUG(networking(), "Socket::writeDatagram" << _udpSocket.error() << "-" << qPrintable(_udpSocket.errorString()) ); + HIFI_FCDEBUG(networking(), "Socket::writeDatagram" << _udpSocket.error() << "-" << qPrintable(_udpSocket.errorString()) ); } return bytesWritten; @@ -513,7 +513,7 @@ std::vector Socket::getConnectionSockAddrs() { } void Socket::handleSocketError(QAbstractSocket::SocketError socketError) { - HIFI_FDEBUG(networking(), "udt::Socket error - " << socketError << _udpSocket.errorString()); + HIFI_FCDEBUG(networking(), "udt::Socket error - " << socketError << _udpSocket.errorString()); } void Socket::handleStateChanged(QAbstractSocket::SocketState socketState) { diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index f2fb984da1..e34ba34c8f 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -121,7 +121,7 @@ void Octree::recurseTreeWithPostOperation(const RecurseOctreeOperation& operatio void Octree::recurseElementWithOperation(const OctreeElementPointer& element, const RecurseOctreeOperation& operation, void* extraData, int recursionCount) { if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { - HIFI_FDEBUG(octree(), "Octree::recurseElementWithOperation() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); + HIFI_FCDEBUG(octree(), "Octree::recurseElementWithOperation() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); return; } @@ -139,7 +139,7 @@ void Octree::recurseElementWithOperation(const OctreeElementPointer& element, co void Octree::recurseElementWithPostOperation(const OctreeElementPointer& element, const RecurseOctreeOperation& operation, void* extraData, int recursionCount) { if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { - HIFI_FDEBUG(octree(), "Octree::recurseElementWithPostOperation() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); + HIFI_FCDEBUG(octree(), "Octree::recurseElementWithPostOperation() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); return; } @@ -165,7 +165,7 @@ void Octree::recurseElementWithOperationDistanceSorted(const OctreeElementPointe const glm::vec3& point, void* extraData, int recursionCount) { if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { - HIFI_FDEBUG(octree(), "Octree::recurseElementWithOperationDistanceSorted() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); + HIFI_FCDEBUG(octree(), "Octree::recurseElementWithOperationDistanceSorted() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); return; } @@ -203,7 +203,7 @@ void Octree::recurseTreeWithOperator(RecurseOctreeOperator* operatorObject) { bool Octree::recurseElementWithOperator(const OctreeElementPointer& element, RecurseOctreeOperator* operatorObject, int recursionCount) { if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { - HIFI_FDEBUG(octree(), "Octree::recurseElementWithOperator() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); + HIFI_FCDEBUG(octree(), "Octree::recurseElementWithOperator() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); return false; } @@ -269,7 +269,7 @@ OctreeElementPointer Octree::createMissingElement(const OctreeElementPointer& la const unsigned char* codeToReach, int recursionCount) { if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { - HIFI_FDEBUG(octree(), "Octree::createMissingElement() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); + HIFI_FCDEBUG(octree(), "Octree::createMissingElement() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); return lastParentElement; } int indexOfNewChild = branchIndexWithDescendant(lastParentElement->getOctalCode(), codeToReach); @@ -426,7 +426,7 @@ void Octree::readBitstreamToTree(const unsigned char * bitstream, uint64_t buffe (unsigned char *)bitstreamAt, NULL); int numberOfThreeBitSectionsInStream = numberOfThreeBitSectionsInCode(bitstreamAt, bufferSizeBytes); if (numberOfThreeBitSectionsInStream > UNREASONABLY_DEEP_RECURSION) { - HIFI_FDEBUG(octree(), "UNEXPECTED: parsing of the octal code would make UNREASONABLY_DEEP_RECURSION... " + HIFI_FCDEBUG(octree(), "UNEXPECTED: parsing of the octal code would make UNREASONABLY_DEEP_RECURSION... " "numberOfThreeBitSectionsInStream:" << numberOfThreeBitSectionsInStream << "This buffer is corrupt. Returning."); return; diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index 18226f0ffb..ef45e8b7ba 100644 --- a/libraries/octree/src/OctreeElement.cpp +++ b/libraries/octree/src/OctreeElement.cpp @@ -401,7 +401,7 @@ OctreeElementPointer OctreeElement::addChildAtIndex(int childIndex) { bool OctreeElement::safeDeepDeleteChildAtIndex(int childIndex, int recursionCount) { bool deleteApproved = false; if (recursionCount > DANGEROUSLY_DEEP_RECURSION) { - HIFI_FDEBUG(octree(), "OctreeElement::safeDeepDeleteChildAtIndex() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); + HIFI_FCDEBUG(octree(), "OctreeElement::safeDeepDeleteChildAtIndex() reached DANGEROUSLY_DEEP_RECURSION, bailing!"); return deleteApproved; } OctreeElementPointer childToDelete = getChildAtIndex(childIndex); diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index 3253a4dc07..117f3e0385 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -636,7 +636,7 @@ void OctreeSceneStats::trackIncomingOctreePacket(ReceivedMessage& message, bool const qint64 MAX_RESONABLE_FLIGHT_TIME = 200 * USECS_PER_SECOND; // 200 seconds is more than enough time for a packet to arrive const qint64 MIN_RESONABLE_FLIGHT_TIME = -1 * (qint64)USECS_PER_SECOND; // more than 1 second of "reverse flight time" would be unreasonable if (flightTime > MAX_RESONABLE_FLIGHT_TIME || flightTime < MIN_RESONABLE_FLIGHT_TIME) { - HIFI_FDEBUG(octree(), "ignoring unreasonable packet... flightTime:" << flightTime + HIFI_FCDEBUG(octree(), "ignoring unreasonable packet... flightTime:" << flightTime << "nodeClockSkewUsec:" << nodeClockSkewUsec << "usecs"); return; // ignore any packets that are unreasonable } diff --git a/libraries/physics/src/ObjectConstraintBallSocket.cpp b/libraries/physics/src/ObjectConstraintBallSocket.cpp index 4a9ef0f1ac..1f1cb2487d 100644 --- a/libraries/physics/src/ObjectConstraintBallSocket.cpp +++ b/libraries/physics/src/ObjectConstraintBallSocket.cpp @@ -87,7 +87,7 @@ btTypedConstraint* ObjectConstraintBallSocket::getConstraint() { btRigidBody* rigidBodyA = getRigidBody(); if (!rigidBodyA) { - HIFI_FDEBUG(physics(), "ObjectConstraintBallSocket::getConstraint -- no rigidBodyA"); + HIFI_FCDEBUG(physics(), "ObjectConstraintBallSocket::getConstraint -- no rigidBodyA"); return nullptr; } @@ -96,7 +96,7 @@ btTypedConstraint* ObjectConstraintBallSocket::getConstraint() { btRigidBody* rigidBodyB = getOtherRigidBody(otherEntityID); if (!rigidBodyB) { - HIFI_FDEBUG(physics(), "ObjectConstraintBallSocket::getConstraint -- no rigidBodyB"); + HIFI_FCDEBUG(physics(), "ObjectConstraintBallSocket::getConstraint -- no rigidBodyB"); return nullptr; } diff --git a/libraries/physics/src/ObjectConstraintConeTwist.cpp b/libraries/physics/src/ObjectConstraintConeTwist.cpp index 01972805d3..714fd662e1 100644 --- a/libraries/physics/src/ObjectConstraintConeTwist.cpp +++ b/libraries/physics/src/ObjectConstraintConeTwist.cpp @@ -98,7 +98,7 @@ btTypedConstraint* ObjectConstraintConeTwist::getConstraint() { btRigidBody* rigidBodyA = getRigidBody(); if (!rigidBodyA) { - HIFI_FDEBUG(physics(), "ObjectConstraintConeTwist::getConstraint -- no rigidBodyA"); + HIFI_FCDEBUG(physics(), "ObjectConstraintConeTwist::getConstraint -- no rigidBodyA"); return nullptr; } @@ -127,7 +127,7 @@ btTypedConstraint* ObjectConstraintConeTwist::getConstraint() { btRigidBody* rigidBodyB = getOtherRigidBody(otherEntityID); if (!rigidBodyB) { - HIFI_FDEBUG(physics(), "ObjectConstraintConeTwist::getConstraint -- no rigidBodyB"); + HIFI_FCDEBUG(physics(), "ObjectConstraintConeTwist::getConstraint -- no rigidBodyB"); return nullptr; } diff --git a/libraries/physics/src/ObjectConstraintHinge.cpp b/libraries/physics/src/ObjectConstraintHinge.cpp index 8fb1ca19a8..18014cddca 100644 --- a/libraries/physics/src/ObjectConstraintHinge.cpp +++ b/libraries/physics/src/ObjectConstraintHinge.cpp @@ -97,7 +97,7 @@ btTypedConstraint* ObjectConstraintHinge::getConstraint() { btRigidBody* rigidBodyA = getRigidBody(); if (!rigidBodyA) { - HIFI_FDEBUG(physics(), "ObjectConstraintHinge::getConstraint -- no rigidBodyA"); + HIFI_FCDEBUG(physics(), "ObjectConstraintHinge::getConstraint -- no rigidBodyA"); return nullptr; } @@ -112,7 +112,7 @@ btTypedConstraint* ObjectConstraintHinge::getConstraint() { // This hinge is between two entities... find the other rigid body. btRigidBody* rigidBodyB = getOtherRigidBody(otherEntityID); if (!rigidBodyB) { - HIFI_FDEBUG(physics(), "ObjectConstraintHinge::getConstraint -- no rigidBodyB"); + HIFI_FCDEBUG(physics(), "ObjectConstraintHinge::getConstraint -- no rigidBodyB"); return nullptr; } diff --git a/libraries/physics/src/ObjectConstraintSlider.cpp b/libraries/physics/src/ObjectConstraintSlider.cpp index 73ec59eb7c..9ae34e1124 100644 --- a/libraries/physics/src/ObjectConstraintSlider.cpp +++ b/libraries/physics/src/ObjectConstraintSlider.cpp @@ -89,7 +89,7 @@ btTypedConstraint* ObjectConstraintSlider::getConstraint() { btRigidBody* rigidBodyA = getRigidBody(); if (!rigidBodyA) { - HIFI_FDEBUG(physics(), "ObjectConstraintSlider::getConstraint -- no rigidBodyA"); + HIFI_FCDEBUG(physics(), "ObjectConstraintSlider::getConstraint -- no rigidBodyA"); return nullptr; } @@ -118,7 +118,7 @@ btTypedConstraint* ObjectConstraintSlider::getConstraint() { btRigidBody* rigidBodyB = getOtherRigidBody(otherEntityID); if (!rigidBodyB) { - HIFI_FDEBUG(physics(), "ObjectConstraintSlider::getConstraint -- no rigidBodyB"); + HIFI_FCDEBUG(physics(), "ObjectConstraintSlider::getConstraint -- no rigidBodyB"); return nullptr; } diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 1d6c0edab5..18335a1296 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -55,7 +55,7 @@ void renderShape(RenderArgs* args, const ShapePlumberPointer& shapeContext, cons } else if (key.hasOwnPipeline()) { item.render(args); } else { - HIFI_FDEBUG(renderlogging(), "Item could not be rendered with invalid key" << key); + HIFI_FCDEBUG(renderlogging(), "Item could not be rendered with invalid key" << key); } args->_itemShapeKey = 0; } @@ -106,7 +106,7 @@ void render::renderStateSortShapes(const RenderContextPointer& renderContext, } else if (key.hasOwnPipeline()) { ownPipelineBucket.push_back( std::make_tuple(item, key) ); } else { - HIFI_FDEBUG(renderlogging(), "Item could not be rendered with invalid key" << key); + HIFI_FCDEBUG(renderlogging(), "Item could not be rendered with invalid key" << key); } } } diff --git a/libraries/shared/src/LogHandler.h b/libraries/shared/src/LogHandler.h index a84ce96df9..dfdfee6c3d 100644 --- a/libraries/shared/src/LogHandler.h +++ b/libraries/shared/src/LogHandler.h @@ -81,7 +81,7 @@ private: static QMutex _mutex; }; -#define HIFI_FDEBUG(category, message) \ +#define HIFI_FCDEBUG(category, message) \ do { \ if (category.isDebugEnabled()) { \ static int repeatedMessageID_ = LogHandler::getInstance().newRepeatedMessageID(); \ @@ -93,9 +93,11 @@ private: } \ } while (false) -#define HIFI_FDEBUG_ID(category, messageID, message) \ +#define HIFI_FDEBUG(message) HIFI_FCDEBUG((*QLoggingCategory::defaultCategory()), message) + +#define HIFI_FCDEBUG_ID(category, messageID, message) \ do { \ - if (category().isDebugEnabled()) { \ + if (category.isDebugEnabled()) { \ QString logString_; \ QDebug debugStringReceiver_(&logString_); \ debugStringReceiver_ << message; \ @@ -104,4 +106,6 @@ private: } \ } while (false) +#define HIFI_FDEBUG_ID(message) HIFI_FCDEBUG_ID((*QLoggingCategory::defaultCategory()), message) + #endif // hifi_LogHandler_h From 42149e295d2dc4a7ac606a8c3b397628a1f72a3d Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 4 Apr 2018 12:55:28 -0700 Subject: [PATCH 10/98] editing seletion style --- .../controllerModules/farActionGrabEntity.js | 4 ++++ .../system/libraries/controllerDispatcherUtils.js | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/scripts/system/controllers/controllerModules/farActionGrabEntity.js b/scripts/system/controllers/controllerModules/farActionGrabEntity.js index 9dd82e0363..58f032de08 100644 --- a/scripts/system/controllers/controllerModules/farActionGrabEntity.js +++ b/scripts/system/controllers/controllerModules/farActionGrabEntity.js @@ -402,6 +402,8 @@ Script.include("/~/system/libraries/Xform.js"); if (controllerData.triggerValues[this.hand] < TRIGGER_OFF_VALUE || this.notPointingAtEntity(controllerData) || this.targetIsNull()) { this.endNearGrabAction(); + Selection.removeFromSelectedItemsList(DISPATCHER_HOVERING_LIST, "entity", + this.highlightedEntity); return makeRunningValues(false, [], []); } this.intersectionDistance = controllerData.rayPicks[this.hand].distance; @@ -571,6 +573,8 @@ Script.include("/~/system/libraries/Xform.js"); if (disableModule) { if (disableModule.disableModules) { this.endNearGrabAction(); + Selection.removeFromSelectedItemsList(DISPATCHER_HOVERING_LIST, "entity", + this.highlightedEntity); return makeRunningValues(false, [], []); } } diff --git a/scripts/system/libraries/controllerDispatcherUtils.js b/scripts/system/libraries/controllerDispatcherUtils.js index 05f6aa9fbf..f82de4b71d 100644 --- a/scripts/system/libraries/controllerDispatcherUtils.js +++ b/scripts/system/libraries/controllerDispatcherUtils.js @@ -93,14 +93,14 @@ TEAR_AWAY_CHECK_TIME = 0.15; // seconds, duration between checks DISPATCHER_HOVERING_LIST = "dispactherHoveringList"; DISPATCHER_HOVERING_STYLE = { isOutlineSmooth: true, - outlineWidth: 5, + outlineWidth: 0, outlineUnoccludedColor: {red: 255, green: 128, blue: 128}, - outlineUnoccludedAlpha: 0.88, + outlineUnoccludedAlpha: 0, outlineOccludedColor: {red: 255, green: 128, blue: 128}, - outlineOccludedAlpha:0.5, - fillUnoccludedColor: {red: 26, green: 0, blue: 0}, - fillUnoccludedAlpha: 0.0, - fillOccludedColor: {red: 26, green: 0, blue: 0}, + outlineOccludedAlpha:0.0, + fillUnoccludedColor: {red: 255, green: 255, blue: 255}, + fillUnoccludedAlpha: 0.15, + fillOccludedColor: {red: 255, green: 255, blue: 255}, fillOccludedAlpha: 0.0 }; From ed3347a89b76003be9d58071b0b74a76e397104c Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 4 Apr 2018 14:11:10 -0700 Subject: [PATCH 11/98] Repeated logging - reviewer fixes --- libraries/audio/src/AudioRingBuffer.cpp | 23 +++++++++++++++---- libraries/fbx/src/FBXReader_Mesh.cpp | 6 +++-- .../src/ObjectConstraintBallSocket.cpp | 6 +++-- .../physics/src/ObjectConstraintConeTwist.cpp | 6 +++-- .../physics/src/ObjectConstraintHinge.cpp | 6 +++-- .../physics/src/ObjectConstraintSlider.cpp | 6 +++-- libraries/render/src/render/DrawTask.cpp | 15 ++++++++++-- libraries/shared/src/LogHandler.cpp | 22 +++++++++--------- libraries/shared/src/LogHandler.h | 9 +++++--- 9 files changed, 69 insertions(+), 30 deletions(-) diff --git a/libraries/audio/src/AudioRingBuffer.cpp b/libraries/audio/src/AudioRingBuffer.cpp index 7b1f24e519..683211aac6 100644 --- a/libraries/audio/src/AudioRingBuffer.cpp +++ b/libraries/audio/src/AudioRingBuffer.cpp @@ -151,6 +151,11 @@ int AudioRingBufferTemplate::appendData(char *data, int maxSize) { return numReadSamples * SampleSize; } +namespace { + int repeatedOverflowMessageID = 0; + std::atomic messageIDInit = 0; +} + template int AudioRingBufferTemplate::writeData(const char* data, int maxSize) { // only copy up to the number of samples we have capacity for @@ -164,8 +169,10 @@ int AudioRingBufferTemplate::writeData(const char* data, int maxSize) { _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, samplesToDelete); _overflowCount++; - HIFI_FCDEBUG(audio(), RING_BUFFER_OVERFLOW_DEBUG); - qPrintable(RING_BUFFER_OVERFLOW_DEBUG); + if (++messageIDInit == 1) { + repeatedOverflowMessageID = LogHandler::getInstance().newRepeatedMessageID(); + } + HIFI_FCDEBUG_ID(audio(), repeatedOverflowMessageID, RING_BUFFER_OVERFLOW_DEBUG); } if (_endOfLastWrite + numWriteSamples > _buffer + _bufferLength) { @@ -273,7 +280,11 @@ int AudioRingBufferTemplate::writeSamples(ConstIterator source, int maxSample int samplesToDelete = samplesToCopy - samplesRoomFor; _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, samplesToDelete); _overflowCount++; - HIFI_FCDEBUG(audio(), RING_BUFFER_OVERFLOW_DEBUG); + + if (++messageIDInit == 1) { + repeatedOverflowMessageID = LogHandler::getInstance().newRepeatedMessageID(); + } + HIFI_FCDEBUG_ID(audio(), repeatedOverflowMessageID, RING_BUFFER_OVERFLOW_DEBUG); } Sample* bufferLast = _buffer + _bufferLength - 1; @@ -295,7 +306,11 @@ int AudioRingBufferTemplate::writeSamplesWithFade(ConstIterator source, int m int samplesToDelete = samplesToCopy - samplesRoomFor; _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, samplesToDelete); _overflowCount++; - HIFI_FCDEBUG(audio(), RING_BUFFER_OVERFLOW_DEBUG); + + if (++messageIDInit == 1) { + repeatedOverflowMessageID = LogHandler::getInstance().newRepeatedMessageID(); + } + HIFI_FCDEBUG_ID(audio(), repeatedOverflowMessageID, RING_BUFFER_OVERFLOW_DEBUG); } Sample* bufferLast = _buffer + _bufferLength - 1; diff --git a/libraries/fbx/src/FBXReader_Mesh.cpp b/libraries/fbx/src/FBXReader_Mesh.cpp index 2cb9d3ed9f..e8365e38b7 100644 --- a/libraries/fbx/src/FBXReader_Mesh.cpp +++ b/libraries/fbx/src/FBXReader_Mesh.cpp @@ -571,13 +571,15 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) { totalSourceIndices += (part.quadTrianglesIndices.size() + part.triangleIndices.size()); } + static int repeatMessageID = LogHandler::getInstance().newRepeatedMessageID(); + if (!totalSourceIndices) { - HIFI_FCDEBUG(modelformat(), "buildModelMesh failed -- no indices, url = " << url); + HIFI_FCDEBUG_ID(modelformat(), repeatMessageID, "buildModelMesh failed -- no indices, url = " << url); return; } if (extractedMesh.vertices.size() == 0) { - HIFI_FCDEBUG(modelformat(), "buildModelMesh failed -- no vertices, url = " << url); + HIFI_FCDEBUG_ID(modelformat(), repeatMessageID, "buildModelMesh failed -- no vertices, url = " << url); return; } diff --git a/libraries/physics/src/ObjectConstraintBallSocket.cpp b/libraries/physics/src/ObjectConstraintBallSocket.cpp index 1f1cb2487d..4736f2c9e2 100644 --- a/libraries/physics/src/ObjectConstraintBallSocket.cpp +++ b/libraries/physics/src/ObjectConstraintBallSocket.cpp @@ -85,9 +85,11 @@ btTypedConstraint* ObjectConstraintBallSocket::getConstraint() { return constraint; } + static int repeatMessageID = LogHandler::getInstance().newRepeatedMessageID(); + btRigidBody* rigidBodyA = getRigidBody(); if (!rigidBodyA) { - HIFI_FCDEBUG(physics(), "ObjectConstraintBallSocket::getConstraint -- no rigidBodyA"); + HIFI_FCDEBUG_ID(physics(), repeatMessageID, "ObjectConstraintBallSocket::getConstraint -- no rigidBodyA"); return nullptr; } @@ -96,7 +98,7 @@ btTypedConstraint* ObjectConstraintBallSocket::getConstraint() { btRigidBody* rigidBodyB = getOtherRigidBody(otherEntityID); if (!rigidBodyB) { - HIFI_FCDEBUG(physics(), "ObjectConstraintBallSocket::getConstraint -- no rigidBodyB"); + HIFI_FCDEBUG_ID(physics(), repeatMessageID, "ObjectConstraintBallSocket::getConstraint -- no rigidBodyB"); return nullptr; } diff --git a/libraries/physics/src/ObjectConstraintConeTwist.cpp b/libraries/physics/src/ObjectConstraintConeTwist.cpp index 714fd662e1..47228c1c16 100644 --- a/libraries/physics/src/ObjectConstraintConeTwist.cpp +++ b/libraries/physics/src/ObjectConstraintConeTwist.cpp @@ -96,9 +96,11 @@ btTypedConstraint* ObjectConstraintConeTwist::getConstraint() { return constraint; } + static int repeatMessageID = LogHandler::getInstance().newRepeatedMessageID(); + btRigidBody* rigidBodyA = getRigidBody(); if (!rigidBodyA) { - HIFI_FCDEBUG(physics(), "ObjectConstraintConeTwist::getConstraint -- no rigidBodyA"); + HIFI_FCDEBUG_ID(physics(), repeatMessageID, "ObjectConstraintConeTwist::getConstraint -- no rigidBodyA"); return nullptr; } @@ -127,7 +129,7 @@ btTypedConstraint* ObjectConstraintConeTwist::getConstraint() { btRigidBody* rigidBodyB = getOtherRigidBody(otherEntityID); if (!rigidBodyB) { - HIFI_FCDEBUG(physics(), "ObjectConstraintConeTwist::getConstraint -- no rigidBodyB"); + HIFI_FCDEBUG_ID(physics(), repeatMessageID, "ObjectConstraintConeTwist::getConstraint -- no rigidBodyB"); return nullptr; } diff --git a/libraries/physics/src/ObjectConstraintHinge.cpp b/libraries/physics/src/ObjectConstraintHinge.cpp index 18014cddca..4793741391 100644 --- a/libraries/physics/src/ObjectConstraintHinge.cpp +++ b/libraries/physics/src/ObjectConstraintHinge.cpp @@ -94,10 +94,12 @@ btTypedConstraint* ObjectConstraintHinge::getConstraint() { if (constraint) { return constraint; } + + static int repeatMessageID = LogHandler::getInstance().newRepeatedMessageID(); btRigidBody* rigidBodyA = getRigidBody(); if (!rigidBodyA) { - HIFI_FCDEBUG(physics(), "ObjectConstraintHinge::getConstraint -- no rigidBodyA"); + HIFI_FCDEBUG_ID(physics(), repeatMessageID, "ObjectConstraintHinge::getConstraint -- no rigidBodyA"); return nullptr; } @@ -112,7 +114,7 @@ btTypedConstraint* ObjectConstraintHinge::getConstraint() { // This hinge is between two entities... find the other rigid body. btRigidBody* rigidBodyB = getOtherRigidBody(otherEntityID); if (!rigidBodyB) { - HIFI_FCDEBUG(physics(), "ObjectConstraintHinge::getConstraint -- no rigidBodyB"); + HIFI_FCDEBUG_ID(physics(), repeatMessageID, "ObjectConstraintHinge::getConstraint -- no rigidBodyB"); return nullptr; } diff --git a/libraries/physics/src/ObjectConstraintSlider.cpp b/libraries/physics/src/ObjectConstraintSlider.cpp index 9ae34e1124..da5bba7f4d 100644 --- a/libraries/physics/src/ObjectConstraintSlider.cpp +++ b/libraries/physics/src/ObjectConstraintSlider.cpp @@ -87,9 +87,11 @@ btTypedConstraint* ObjectConstraintSlider::getConstraint() { return constraint; } + static int repeatMessageID = LogHandler::getInstance().newRepeatedMessageID(); + btRigidBody* rigidBodyA = getRigidBody(); if (!rigidBodyA) { - HIFI_FCDEBUG(physics(), "ObjectConstraintSlider::getConstraint -- no rigidBodyA"); + HIFI_FCDEBUG_ID(physics(), repeatMessageID, "ObjectConstraintSlider::getConstraint -- no rigidBodyA"); return nullptr; } @@ -118,7 +120,7 @@ btTypedConstraint* ObjectConstraintSlider::getConstraint() { btRigidBody* rigidBodyB = getOtherRigidBody(otherEntityID); if (!rigidBodyB) { - HIFI_FCDEBUG(physics(), "ObjectConstraintSlider::getConstraint -- no rigidBodyB"); + HIFI_FCDEBUG_ID(physics(), repeatMessageID, "ObjectConstraintSlider::getConstraint -- no rigidBodyB"); return nullptr; } diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 18335a1296..86a6dee145 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -41,6 +41,11 @@ void render::renderItems(const RenderContextPointer& renderContext, const ItemBo } } +namespace { + int repeatedInvalidKeyMessageID = 0; + std::atomic messageIDInit = 0; +} + void renderShape(RenderArgs* args, const ShapePlumberPointer& shapeContext, const Item& item, const ShapeKey& globalKey) { assert(item.getKey().isShape()); auto key = item.getShapeKey() | globalKey; @@ -55,7 +60,10 @@ void renderShape(RenderArgs* args, const ShapePlumberPointer& shapeContext, cons } else if (key.hasOwnPipeline()) { item.render(args); } else { - HIFI_FCDEBUG(renderlogging(), "Item could not be rendered with invalid key" << key); + if (++messageIDInit == 1) { + repeatedInvalidKeyMessageID = LogHandler::getInstance().newRepeatedMessageID(); + } + HIFI_FCDEBUG_ID(renderlogging(), repeatedInvalidKeyMessageID, "Item could not be rendered with invalid key" << key); } args->_itemShapeKey = 0; } @@ -106,7 +114,10 @@ void render::renderStateSortShapes(const RenderContextPointer& renderContext, } else if (key.hasOwnPipeline()) { ownPipelineBucket.push_back( std::make_tuple(item, key) ); } else { - HIFI_FCDEBUG(renderlogging(), "Item could not be rendered with invalid key" << key); + if (++messageIDInit == 1) { + repeatedInvalidKeyMessageID = LogHandler::getInstance().newRepeatedMessageID(); + } + HIFI_FCDEBUG_ID(renderlogging(), repeatedInvalidKeyMessageID, "Item could not be rendered with invalid key" << key); } } } diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index 06287e4d81..70e41b8304 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -92,15 +92,15 @@ void LogHandler::setShouldDisplayMilliseconds(bool shouldDisplayMilliseconds) { void LogHandler::flushRepeatedMessages() { QMutexLocker lock(&_mutex); - // New repeat-supress scheme: - for (int m = 0; m < (int)_repeatCounts.size(); ++m) { - int repeatCount = _repeatCounts[m]; + // New repeat-suppress scheme: + for (int m = 0; m < (int)_repeatedMessageRecords.size(); ++m) { + int repeatCount = _repeatedMessageRecords[m].repeatCount; if (repeatCount > 1) { QString repeatLogMessage = QString().setNum(repeatCount) + " repeated log entries - Last entry: \"" - + _repeatedMessageStrings[m] + "\""; + + _repeatedMessageRecords[m].repeatString + "\""; printMessage(LogSuppressed, QMessageLogContext(), repeatLogMessage); - _repeatCounts[m] = 0; - _repeatedMessageStrings[m] = QString(); + _repeatedMessageRecords[m].repeatCount = 0; + _repeatedMessageRecords[m].repeatString = QString(); } } } @@ -193,8 +193,8 @@ int LogHandler::newRepeatedMessageID() { QMutexLocker lock(&_mutex); int newMessageId = _currentMessageID; ++_currentMessageID; - _repeatCounts.push_back(0); - _repeatedMessageStrings.resize(_currentMessageID); + RepeatedMessageRecord newRecord { 0 }; + _repeatedMessageRecords.push_back(newRecord); return newMessageId; } @@ -205,11 +205,11 @@ void LogHandler::printRepeatedMessage(int messageID, LogMsgType type, const QMes return; } - if (_repeatCounts[messageID] == 0) { + if (_repeatedMessageRecords[messageID].repeatCount == 0) { printMessage(type, context, message); } else { - _repeatedMessageStrings[messageID] = message; + _repeatedMessageRecords[messageID].repeatString = message; } - ++_repeatCounts[messageID]; + ++_repeatedMessageRecords[messageID].repeatCount; } diff --git a/libraries/shared/src/LogHandler.h b/libraries/shared/src/LogHandler.h index dfdfee6c3d..2b1f9c47aa 100644 --- a/libraries/shared/src/LogHandler.h +++ b/libraries/shared/src/LogHandler.h @@ -76,8 +76,11 @@ private: std::vector _onetimeMessages; int _currentMessageID { 0 }; - std::vector _repeatCounts; - std::vector _repeatedMessageStrings; + struct RepeatedMessageRecord { + int repeatCount; + QString repeatString; + }; + std::vector _repeatedMessageRecords; static QMutex _mutex; }; @@ -106,6 +109,6 @@ private: } \ } while (false) -#define HIFI_FDEBUG_ID(message) HIFI_FCDEBUG_ID((*QLoggingCategory::defaultCategory()), message) +#define HIFI_FDEBUG_ID(messageID, message) HIFI_FCDEBUG_ID((*QLoggingCategory::defaultCategory()), messageID, message) #endif // hifi_LogHandler_h From ce5f6da6ca897c92ec94bba981dc73f5a753be11 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 4 Apr 2018 14:43:26 -0700 Subject: [PATCH 12/98] Restore setup of flush timer that was inadvertently lost --- libraries/shared/src/LogHandler.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index 70e41b8304..a5c8cfd420 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -36,6 +36,9 @@ LogHandler::LogHandler() { // when the log handler is first setup we should print our timezone QString timezoneString = "Time zone: " + QDateTime::currentDateTime().toString("t"); printMessage(LogMsgType::LogInfo, QMessageLogContext(), timezoneString); + + // make sure we setup the repeated message flusher, but do it on the LogHandler thread + QMetaObject::invokeMethod(this, "setupRepeatedMessageFlusher"); } LogHandler::~LogHandler() { From d05f0600d474e48f00ef1e1066c513085d9a3b37 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 4 Apr 2018 15:44:47 -0700 Subject: [PATCH 13/98] Handle one-time messages outside LogHandler class Also change to std::call_once for the file-scope message IDs. --- domain-server/src/DomainServer.cpp | 26 +++++++++++++----------- libraries/render/src/render/DrawTask.cpp | 12 +++++------ libraries/shared/src/LogHandler.cpp | 23 --------------------- libraries/shared/src/LogHandler.h | 7 ------- 4 files changed, 19 insertions(+), 49 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index b1f996c9b2..f48ef80048 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1284,10 +1284,10 @@ void DomainServer::processRequestAssignmentPacket(QSharedPointer NOISY_MESSAGE_INTERVAL_MSECS) { - static QString repeatedMessage = LogHandler::getInstance().addOnlyOnceMessageRegex - ("Received a request for assignment type [^ ]+ from [^ ]+"); + static bool printedAssignmentTypeMessage = false; + if (!printedAssignmentTypeMessage && (requestAssignment.getType() != Assignment::AgentType + || noisyMessageTimer.elapsed() > NOISY_MESSAGE_INTERVAL_MSECS)) { + printedAssignmentTypeMessage = true; qDebug() << "Received a request for assignment type" << requestAssignment.getType() << "from" << message->getSenderSockAddr(); noisyMessageTimer.restart(); @@ -1324,10 +1324,10 @@ void DomainServer::processRequestAssignmentPacket(QSharedPointergetUUID(), requestAssignment.getWalletUUID(), requestAssignment.getNodeVersion()); } else { - if (requestAssignment.getType() != Assignment::AgentType - || noisyMessageTimer.elapsed() > NOISY_MESSAGE_INTERVAL_MSECS) { - static QString repeatedMessage = LogHandler::getInstance().addOnlyOnceMessageRegex - ("Unable to fulfill assignment request of type [^ ]+ from [^ ]+"); + static bool printedAssignmentRequestMessage = false; + if (!printedAssignmentRequestMessage && (requestAssignment.getType() != Assignment::AgentType + || noisyMessageTimer.elapsed() > NOISY_MESSAGE_INTERVAL_MSECS)) { + printedAssignmentRequestMessage = true; qDebug() << "Unable to fulfill assignment request of type" << requestAssignment.getType() << "from" << message->getSenderSockAddr(); noisyMessageTimer.restart(); @@ -1576,10 +1576,12 @@ void DomainServer::sendICEServerAddressToMetaverseAPI() { callbackParameters.jsonCallbackReceiver = this; callbackParameters.jsonCallbackMethod = "handleSuccessfulICEServerAddressUpdate"; - static QString repeatedMessage = LogHandler::getInstance().addOnlyOnceMessageRegex - ("Updating ice-server address in High Fidelity Metaverse API to [^ \n]+"); - qDebug() << "Updating ice-server address in High Fidelity Metaverse API to" - << (_iceServerSocket.isNull() ? "" : _iceServerSocket.getAddress().toString()); + static bool printedIceServerMessage = false; + if (!printedIceServerMessage) { + printedIceServerMessage = true; + qDebug() << "Updating ice-server address in High Fidelity Metaverse API to" + << (_iceServerSocket.isNull() ? "" : _iceServerSocket.getAddress().toString()); + } static const QString DOMAIN_ICE_ADDRESS_UPDATE = "/api/v1/domains/%1/ice_server_address"; diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 86a6dee145..ac0adb54ff 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -43,7 +43,7 @@ void render::renderItems(const RenderContextPointer& renderContext, const ItemBo namespace { int repeatedInvalidKeyMessageID = 0; - std::atomic messageIDInit = 0; + std::once_flag messageIDFlag; } void renderShape(RenderArgs* args, const ShapePlumberPointer& shapeContext, const Item& item, const ShapeKey& globalKey) { @@ -60,9 +60,8 @@ void renderShape(RenderArgs* args, const ShapePlumberPointer& shapeContext, cons } else if (key.hasOwnPipeline()) { item.render(args); } else { - if (++messageIDInit == 1) { - repeatedInvalidKeyMessageID = LogHandler::getInstance().newRepeatedMessageID(); - } + std::call_once(messageIDFlag, [](int& id) { id = LogHandler::getInstance().newRepeatedMessageID(); }, + repeatedInvalidKeyMessageID); HIFI_FCDEBUG_ID(renderlogging(), repeatedInvalidKeyMessageID, "Item could not be rendered with invalid key" << key); } args->_itemShapeKey = 0; @@ -114,9 +113,8 @@ void render::renderStateSortShapes(const RenderContextPointer& renderContext, } else if (key.hasOwnPipeline()) { ownPipelineBucket.push_back( std::make_tuple(item, key) ); } else { - if (++messageIDInit == 1) { - repeatedInvalidKeyMessageID = LogHandler::getInstance().newRepeatedMessageID(); - } + std::call_once(messageIDFlag, [](int& id) { id = LogHandler::getInstance().newRepeatedMessageID(); }, + repeatedInvalidKeyMessageID); HIFI_FCDEBUG_ID(renderlogging(), repeatedInvalidKeyMessageID, "Item could not be rendered with invalid key" << key); } } diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index a5c8cfd420..8cd43e8c0a 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -114,21 +114,6 @@ QString LogHandler::printMessage(LogMsgType type, const QMessageLogContext& cont } QMutexLocker lock(&_mutex); - if (type == LogDebug) { - // see if this message is one we should only print once - for (auto& onceOnly : _onetimeMessages) { - if (onceOnly.regexp.indexIn(message) != -1) { - if (onceOnly.messageCount++ == 0) { - // we have a match and haven't yet printed this message. - break; - } else { - // We've already printed this message, don't print it again. - return QString(); - } - } - } - } - // log prefix is in the following format // [TIMESTAMP] [DEBUG] [PID] [TID] [TARGET] logged string @@ -184,14 +169,6 @@ void LogHandler::setupRepeatedMessageFlusher() { }); } -const QString& LogHandler::addOnlyOnceMessageRegex(const QString& regexString) { - QMutexLocker lock(&_mutex); - OnceOnlyMessage onetimeMessage; - onetimeMessage.regexp = QRegExp(regexString); - _onetimeMessages.push_back(onetimeMessage); - return regexString; -} - int LogHandler::newRepeatedMessageID() { QMutexLocker lock(&_mutex); int newMessageId = _currentMessageID; diff --git a/libraries/shared/src/LogHandler.h b/libraries/shared/src/LogHandler.h index 2b1f9c47aa..56450768ff 100644 --- a/libraries/shared/src/LogHandler.h +++ b/libraries/shared/src/LogHandler.h @@ -51,7 +51,6 @@ public: /// prints various process, message type, and time information static void verboseMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString &message); - const QString& addOnlyOnceMessageRegex(const QString& regexString); int newRepeatedMessageID(); void printRepeatedMessage(int messageID, LogMsgType type, const QMessageLogContext& context, const QString &message); @@ -69,12 +68,6 @@ private: bool _shouldOutputThreadID { false }; bool _shouldDisplayMilliseconds { false }; - struct OnceOnlyMessage { - QRegExp regexp; - int messageCount { 0 }; - }; - std::vector _onetimeMessages; - int _currentMessageID { 0 }; struct RepeatedMessageRecord { int repeatCount; From 104788de508e9b0ce134beed50b069142fcb2667 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 4 Apr 2018 16:03:56 -0700 Subject: [PATCH 14/98] Take out useless noisy message timer --- domain-server/src/DomainServer.cpp | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index f48ef80048..432a9a83a9 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1273,24 +1273,11 @@ void DomainServer::processRequestAssignmentPacket(QSharedPointer NOISY_MESSAGE_INTERVAL_MSECS)) { + if (!printedAssignmentTypeMessage && requestAssignment.getType() != Assignment::AgentType) { printedAssignmentTypeMessage = true; qDebug() << "Received a request for assignment type" << requestAssignment.getType() << "from" << message->getSenderSockAddr(); - noisyMessageTimer.restart(); } SharedAssignmentPointer assignmentToDeploy = deployableAssignmentForRequest(requestAssignment); @@ -1325,12 +1312,10 @@ void DomainServer::processRequestAssignmentPacket(QSharedPointer NOISY_MESSAGE_INTERVAL_MSECS)) { + if (!printedAssignmentRequestMessage && requestAssignment.getType() != Assignment::AgentType) { printedAssignmentRequestMessage = true; qDebug() << "Unable to fulfill assignment request of type" << requestAssignment.getType() << "from" << message->getSenderSockAddr(); - noisyMessageTimer.restart(); } } } From a370d287c3db5fad8c5e2d9fd2af56d312d19bc1 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 4 Apr 2018 16:42:10 -0700 Subject: [PATCH 15/98] Change AudioRingBuffer.cpp to use std::call_once --- libraries/audio/src/AudioRingBuffer.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/libraries/audio/src/AudioRingBuffer.cpp b/libraries/audio/src/AudioRingBuffer.cpp index 683211aac6..8f41ca8947 100644 --- a/libraries/audio/src/AudioRingBuffer.cpp +++ b/libraries/audio/src/AudioRingBuffer.cpp @@ -153,7 +153,7 @@ int AudioRingBufferTemplate::appendData(char *data, int maxSize) { namespace { int repeatedOverflowMessageID = 0; - std::atomic messageIDInit = 0; + std::once_flag messageIDFlag; } template @@ -169,9 +169,8 @@ int AudioRingBufferTemplate::writeData(const char* data, int maxSize) { _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, samplesToDelete); _overflowCount++; - if (++messageIDInit == 1) { - repeatedOverflowMessageID = LogHandler::getInstance().newRepeatedMessageID(); - } + std::call_once(messageIDFlag, [](int& id) { id = LogHandler::getInstance().newRepeatedMessageID(); }, + repeatedOverflowMessageID); HIFI_FCDEBUG_ID(audio(), repeatedOverflowMessageID, RING_BUFFER_OVERFLOW_DEBUG); } @@ -281,9 +280,8 @@ int AudioRingBufferTemplate::writeSamples(ConstIterator source, int maxSample _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, samplesToDelete); _overflowCount++; - if (++messageIDInit == 1) { - repeatedOverflowMessageID = LogHandler::getInstance().newRepeatedMessageID(); - } + std::call_once(messageIDFlag, [](int& id) { id = LogHandler::getInstance().newRepeatedMessageID(); }, + repeatedOverflowMessageID); HIFI_FCDEBUG_ID(audio(), repeatedOverflowMessageID, RING_BUFFER_OVERFLOW_DEBUG); } @@ -307,9 +305,8 @@ int AudioRingBufferTemplate::writeSamplesWithFade(ConstIterator source, int m _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, samplesToDelete); _overflowCount++; - if (++messageIDInit == 1) { - repeatedOverflowMessageID = LogHandler::getInstance().newRepeatedMessageID(); - } + std::call_once(messageIDFlag, [](int& id) { id = LogHandler::getInstance().newRepeatedMessageID(); }, + repeatedOverflowMessageID); HIFI_FCDEBUG_ID(audio(), repeatedOverflowMessageID, RING_BUFFER_OVERFLOW_DEBUG); } From 93bcd1df2008f8b9ab4689878467d3b0f0206f3f Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 4 Apr 2018 17:55:45 -0700 Subject: [PATCH 16/98] Fix Linux build for std::call_once with lambda MacOS & Ubuntu don't like the combination of std::call_once and lambda w/ reference param, for some reason. Change to pointer param. --- libraries/audio/src/AudioRingBuffer.cpp | 12 ++++++------ libraries/render/src/render/DrawTask.cpp | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/libraries/audio/src/AudioRingBuffer.cpp b/libraries/audio/src/AudioRingBuffer.cpp index 8f41ca8947..518fdd3c17 100644 --- a/libraries/audio/src/AudioRingBuffer.cpp +++ b/libraries/audio/src/AudioRingBuffer.cpp @@ -169,8 +169,8 @@ int AudioRingBufferTemplate::writeData(const char* data, int maxSize) { _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, samplesToDelete); _overflowCount++; - std::call_once(messageIDFlag, [](int& id) { id = LogHandler::getInstance().newRepeatedMessageID(); }, - repeatedOverflowMessageID); + std::call_once(messageIDFlag, [](int* id) { *id = LogHandler::getInstance().newRepeatedMessageID(); }, + &repeatedOverflowMessageID); HIFI_FCDEBUG_ID(audio(), repeatedOverflowMessageID, RING_BUFFER_OVERFLOW_DEBUG); } @@ -280,8 +280,8 @@ int AudioRingBufferTemplate::writeSamples(ConstIterator source, int maxSample _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, samplesToDelete); _overflowCount++; - std::call_once(messageIDFlag, [](int& id) { id = LogHandler::getInstance().newRepeatedMessageID(); }, - repeatedOverflowMessageID); + std::call_once(messageIDFlag, [](int* id) { *id = LogHandler::getInstance().newRepeatedMessageID(); }, + &repeatedOverflowMessageID); HIFI_FCDEBUG_ID(audio(), repeatedOverflowMessageID, RING_BUFFER_OVERFLOW_DEBUG); } @@ -305,8 +305,8 @@ int AudioRingBufferTemplate::writeSamplesWithFade(ConstIterator source, int m _nextOutput = shiftedPositionAccomodatingWrap(_nextOutput, samplesToDelete); _overflowCount++; - std::call_once(messageIDFlag, [](int& id) { id = LogHandler::getInstance().newRepeatedMessageID(); }, - repeatedOverflowMessageID); + std::call_once(messageIDFlag, [](int* id) { *id = LogHandler::getInstance().newRepeatedMessageID(); }, + &repeatedOverflowMessageID); HIFI_FCDEBUG_ID(audio(), repeatedOverflowMessageID, RING_BUFFER_OVERFLOW_DEBUG); } diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index ac0adb54ff..8aabffea46 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -60,8 +60,8 @@ void renderShape(RenderArgs* args, const ShapePlumberPointer& shapeContext, cons } else if (key.hasOwnPipeline()) { item.render(args); } else { - std::call_once(messageIDFlag, [](int& id) { id = LogHandler::getInstance().newRepeatedMessageID(); }, - repeatedInvalidKeyMessageID); + std::call_once(messageIDFlag, [](int* id) { *id = LogHandler::getInstance().newRepeatedMessageID(); }, + &repeatedInvalidKeyMessageID); HIFI_FCDEBUG_ID(renderlogging(), repeatedInvalidKeyMessageID, "Item could not be rendered with invalid key" << key); } args->_itemShapeKey = 0; @@ -113,8 +113,8 @@ void render::renderStateSortShapes(const RenderContextPointer& renderContext, } else if (key.hasOwnPipeline()) { ownPipelineBucket.push_back( std::make_tuple(item, key) ); } else { - std::call_once(messageIDFlag, [](int& id) { id = LogHandler::getInstance().newRepeatedMessageID(); }, - repeatedInvalidKeyMessageID); + std::call_once(messageIDFlag, [](int* id) { *id = LogHandler::getInstance().newRepeatedMessageID(); }, + &repeatedInvalidKeyMessageID); HIFI_FCDEBUG_ID(renderlogging(), repeatedInvalidKeyMessageID, "Item could not be rendered with invalid key" << key); } } From f10bbce5575cda902ced8bdca784e316b590b8ef Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 4 Apr 2018 18:32:40 -0700 Subject: [PATCH 17/98] Squelch initialization warning --- libraries/shared/src/LogHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index 8cd43e8c0a..45cf01510d 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -173,7 +173,7 @@ int LogHandler::newRepeatedMessageID() { QMutexLocker lock(&_mutex); int newMessageId = _currentMessageID; ++_currentMessageID; - RepeatedMessageRecord newRecord { 0 }; + RepeatedMessageRecord newRecord { 0, QString() }; _repeatedMessageRecords.push_back(newRecord); return newMessageId; } From cc341e8ad7c14b7b74b6819da3bb17dcd742c458 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Thu, 5 Apr 2018 15:38:56 -0700 Subject: [PATCH 18/98] highlight nearby entities --- .../controllerModules/farActionGrabEntity.js | 2 + .../highlightNearbyEntities.js | 88 +++++++++++++++++++ .../controllerModules/nearActionGrabEntity.js | 3 +- .../controllerModules/nearParentGrabEntity.js | 11 ++- .../controllerModules/nearTrigger.js | 3 +- .../system/controllers/controllerScripts.js | 1 + .../libraries/controllerDispatcherUtils.js | 24 ++++- 7 files changed, 126 insertions(+), 6 deletions(-) create mode 100644 scripts/system/controllers/controllerModules/highlightNearbyEntities.js diff --git a/scripts/system/controllers/controllerModules/farActionGrabEntity.js b/scripts/system/controllers/controllerModules/farActionGrabEntity.js index 58f032de08..b7fdacfe38 100644 --- a/scripts/system/controllers/controllerModules/farActionGrabEntity.js +++ b/scripts/system/controllers/controllerModules/farActionGrabEntity.js @@ -404,6 +404,7 @@ Script.include("/~/system/libraries/Xform.js"); this.endNearGrabAction(); Selection.removeFromSelectedItemsList(DISPATCHER_HOVERING_LIST, "entity", this.highlightedEntity); + this.highlightedEntity = null; return makeRunningValues(false, [], []); } this.intersectionDistance = controllerData.rayPicks[this.hand].distance; @@ -575,6 +576,7 @@ Script.include("/~/system/libraries/Xform.js"); this.endNearGrabAction(); Selection.removeFromSelectedItemsList(DISPATCHER_HOVERING_LIST, "entity", this.highlightedEntity); + this.highlightedEntity = null; return makeRunningValues(false, [], []); } } diff --git a/scripts/system/controllers/controllerModules/highlightNearbyEntities.js b/scripts/system/controllers/controllerModules/highlightNearbyEntities.js new file mode 100644 index 0000000000..de58c5a388 --- /dev/null +++ b/scripts/system/controllers/controllerModules/highlightNearbyEntities.js @@ -0,0 +1,88 @@ +"use strict"; + +// highlightNearbyEntities.js +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html + + +/* global Script, Controller, RIGHT_HAND, LEFT_HAND, MyAvatar, getGrabPointSphereOffset, + makeRunningValues, Entities, enableDispatcherModule, disableDispatcherModule, makeDispatcherModuleParameters, + PICK_MAX_DISTANCE, COLORS_GRAB_SEARCHING_HALF_SQUEEZE, COLORS_GRAB_SEARCHING_FULL_SQUEEZE, COLORS_GRAB_DISTANCE_HOLD, + DEFAULT_SEARCH_SPHERE_DISTANCE, getGrabbableData, makeLaserParams +*/ + +(function () { + Script.include("/~/system/libraries/controllerDispatcherUtils.js"); + Script.include("/~/system/libraries/controllers.js"); + var dispatcherUtils = Script.require("/~/system/libraries/controllerDispatcherUtils.js"); + function HighlightNearbyEntities(hand) { + this.hand = hand; + this.highlightedEntities = []; + + this.parameters = dispatcherUtils.makeDispatcherModuleParameters( + 480, + this.hand === dispatcherUtils.RIGHT_HAND ? ["rightHand"] : ["leftHand"], + [], + 100); + + + this.isGrabable = function(controllerData, props) { + if (dispatcherUtils.entityIsGrabbable(props) || dispatcherUtils.entityIsCloneable(props)) { + // if we've attempted to grab a child, roll up to the root of the tree + var groupRootProps = dispatcherUtils.findGroupParent(controllerData, props); + if (dispatcherUtils.entityIsGrabbable(groupRootProps)) { + return true; + } + return true; + } + return false; + }; + + this.hasHyperLink = function(props) { + return (props.href !== "" && props.href !== undefined); + }; + + this.highlightEntities = function(controllerData) { + if (this.highlightedEntities.length > 0) { + dispatcherUtils.clearHighlightedEntities(); + this.highlightedEntities = []; + } + + var nearbyEntitiesProperties = controllerData.nearbyEntityProperties[this.hand]; + var sensorScaleFactor = MyAvatar.sensorToWorldScale; + for (var i = 0; i < nearbyEntitiesProperties.length; i++) { + var props = nearbyEntitiesProperties[i]; + if (props.distance > dispatcherUtils.NEAR_GRAB_RADIUS * sensorScaleFactor) { + continue; + } + if (this.isGrabable(controllerData, props) || this.hasHyperLink(props)) { + dispatcherUtils.highlightTargetEntity(props.id); + this.highlightedEntities.push(props.id); + } + } + }; + + this.isReady = function(controllerData) { + this.highlightEntities(controllerData); + return dispatcherUtils.makeRunningValues(false, [], []); + }; + + this.run = function(controllerData) { + return this.isReady(controllerData); + }; + } + + var leftHighlightNearbyEntities = new HighlightNearbyEntities(dispatcherUtils.LEFT_HAND); + var rightHighlightNearbyEntities = new HighlightNearbyEntities(dispatcherUtils.RIGHT_HAND); + + dispatcherUtils.enableDispatcherModule("LeftHighlightNearbyEntities", leftHighlightNearbyEntities); + dispatcherUtils.enableDispatcherModule("RightHighlightNearbyEntities", rightHighlightNearbyEntities); + + function cleanup() { + dispatcherUtils.disableDispatcherModule("LeftHighlightNearbyEntities"); + dispatcherUtils.disableDispatcherModule("RightHighlightNearbyEntities"); + } + + Script.scriptEnding.connect(cleanup); +}()); diff --git a/scripts/system/controllers/controllerModules/nearActionGrabEntity.js b/scripts/system/controllers/controllerModules/nearActionGrabEntity.js index 147d6b807f..da9cafbe07 100644 --- a/scripts/system/controllers/controllerModules/nearActionGrabEntity.js +++ b/scripts/system/controllers/controllerModules/nearActionGrabEntity.js @@ -10,7 +10,7 @@ propsArePhysical, Messages, HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, entityIsGrabbable, Quat, Vec3, MSECS_PER_SEC, getControllerWorldLocation, makeDispatcherModuleParameters, makeRunningValues, TRIGGER_OFF_VALUE, NEAR_GRAB_RADIUS, findGroupParent, entityIsCloneable, propsAreCloneDynamic, cloneEntity, - HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, BUMPER_ON_VALUE + HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, BUMPER_ON_VALUE, unhighlightTargetEntity */ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); @@ -114,6 +114,7 @@ Script.include("/~/system/libraries/cloneEntityUtils.js"); var args = [this.hand === RIGHT_HAND ? "right" : "left", MyAvatar.sessionUUID]; Entities.callEntityMethod(this.targetEntityID, "startNearGrab", args); + unhighlightTargetEntity(this.targetEntityID); }; // this is for when the action is going to time-out diff --git a/scripts/system/controllers/controllerModules/nearParentGrabEntity.js b/scripts/system/controllers/controllerModules/nearParentGrabEntity.js index 01c8424e0c..945c091f7e 100644 --- a/scripts/system/controllers/controllerModules/nearParentGrabEntity.js +++ b/scripts/system/controllers/controllerModules/nearParentGrabEntity.js @@ -11,7 +11,8 @@ TRIGGER_OFF_VALUE, makeDispatcherModuleParameters, entityIsGrabbable, makeRunningValues, NEAR_GRAB_RADIUS, findGroupParent, Vec3, cloneEntity, entityIsCloneable, propsAreCloneDynamic, HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, BUMPER_ON_VALUE, findHandChildEntities, TEAR_AWAY_DISTANCE, MSECS_PER_SEC, TEAR_AWAY_CHECK_TIME, - TEAR_AWAY_COUNT, distanceBetweenPointAndEntityBoundingBox + TEAR_AWAY_COUNT, distanceBetweenPointAndEntityBoundingBox, print, Selection, DISPATCHER_HOVERING_LIST, Uuid, + highlightTargetEntity, unhighlightTargetEntity */ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); @@ -34,6 +35,7 @@ Script.include("/~/system/libraries/cloneEntityUtils.js"); this.autoUnequipCounter = 0; this.lastUnexpectedChildrenCheckTime = 0; this.robbed = false; + this.highlightedEntity = null; this.parameters = makeDispatcherModuleParameters( 500, @@ -87,7 +89,7 @@ Script.include("/~/system/libraries/cloneEntityUtils.js"); this.startNearParentingGrabEntity = function (controllerData, targetProps) { Controller.triggerHapticPulse(HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, this.hand); - + unhighlightTargetEntity(this.targetEntityID); var handJointIndex; // if (this.ignoreIK) { // handJointIndex = this.controllerJointIndex; @@ -158,6 +160,7 @@ Script.include("/~/system/libraries/cloneEntityUtils.js"); grabbedEntity: this.targetEntityID, joint: this.hand === RIGHT_HAND ? "RightHand" : "LeftHand" })); + unhighlightTargetEntity(this.targetEntityID); this.grabbing = false; this.targetEntityID = null; this.robbed = false; @@ -280,6 +283,8 @@ Script.include("/~/system/libraries/cloneEntityUtils.js"); return makeRunningValues(false, [], []); // let nearActionGrabEntity handle it } else { this.targetEntityID = targetProps.id; + this.highlightedEntity = this.targetEntityID; + highlightTargetEntity(this.targetEntityID); return makeRunningValues(true, [this.targetEntityID], []); } } else { @@ -300,6 +305,7 @@ Script.include("/~/system/libraries/cloneEntityUtils.js"); var props = controllerData.nearbyEntityPropertiesByID[this.targetEntityID]; if (!props) { // entity was deleted + unhighlightTargetEntity(this.targetEntityID); this.grabbing = false; this.targetEntityID = null; this.hapticTargetID = null; @@ -321,6 +327,7 @@ Script.include("/~/system/libraries/cloneEntityUtils.js"); var readiness = this.isReady(controllerData); if (!readiness.active) { this.robbed = false; + unhighlightTargetEntity(this.highlightedEntity); return readiness; } if (controllerData.triggerClicks[this.hand] || controllerData.secondaryValues[this.hand] > BUMPER_ON_VALUE) { diff --git a/scripts/system/controllers/controllerModules/nearTrigger.js b/scripts/system/controllers/controllerModules/nearTrigger.js index 42db3d6f61..6a9cd9fbcd 100644 --- a/scripts/system/controllers/controllerModules/nearTrigger.js +++ b/scripts/system/controllers/controllerModules/nearTrigger.js @@ -7,7 +7,7 @@ /* global Script, Entities, MyAvatar, RIGHT_HAND, LEFT_HAND, enableDispatcherModule, disableDispatcherModule, getGrabbableData, - Vec3, TRIGGER_OFF_VALUE, makeDispatcherModuleParameters, makeRunningValues, NEAR_GRAB_RADIUS + Vec3, TRIGGER_OFF_VALUE, makeDispatcherModuleParameters, makeRunningValues, NEAR_GRAB_RADIUS, unhighlightTargetEntity */ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); @@ -55,6 +55,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); this.startNearTrigger = function (controllerData) { var args = [this.hand === RIGHT_HAND ? "right" : "left", MyAvatar.sessionUUID]; Entities.callEntityMethod(this.targetEntityID, "startNearTrigger", args); + unhighlightTargetEntity(this.targetEntityID); }; this.continueNearTrigger = function (controllerData) { diff --git a/scripts/system/controllers/controllerScripts.js b/scripts/system/controllers/controllerScripts.js index 8db8e29f37..058c99349d 100644 --- a/scripts/system/controllers/controllerScripts.js +++ b/scripts/system/controllers/controllerScripts.js @@ -32,6 +32,7 @@ var CONTOLLER_SCRIPTS = [ "controllerModules/hudOverlayPointer.js", "controllerModules/mouseHMD.js", "controllerModules/scaleEntity.js", + "controllerModules/highlightNearbyEntities.js", "controllerModules/nearGrabHyperLinkEntity.js" ]; diff --git a/scripts/system/libraries/controllerDispatcherUtils.js b/scripts/system/libraries/controllerDispatcherUtils.js index f82de4b71d..827b29e78a 100644 --- a/scripts/system/libraries/controllerDispatcherUtils.js +++ b/scripts/system/libraries/controllerDispatcherUtils.js @@ -7,6 +7,7 @@ /* global module, Camera, HMD, MyAvatar, controllerDispatcherPlugins:true, Quat, Vec3, Overlays, Xform, + Selection, MSECS_PER_SEC:true , LEFT_HAND:true, RIGHT_HAND:true, FORBIDDEN_GRAB_TYPES:true, HAPTIC_PULSE_STRENGTH:true, HAPTIC_PULSE_DURATION:true, ZERO_VEC:true, ONE_VEC:true, DEFAULT_REGISTRATION_POINT:true, INCHES_TO_METERS:true, @@ -51,7 +52,10 @@ TEAR_AWAY_DISTANCE:true, TEAR_AWAY_COUNT:true, TEAR_AWAY_CHECK_TIME:true, - distanceBetweenPointAndEntityBoundingBox:true + distanceBetweenPointAndEntityBoundingBox:true, + highlightTargetEntity:true, + clearHighlightedEntities:true, + unhighlightTargetEntity:true */ MSECS_PER_SEC = 1000.0; @@ -95,7 +99,7 @@ DISPATCHER_HOVERING_STYLE = { isOutlineSmooth: true, outlineWidth: 0, outlineUnoccludedColor: {red: 255, green: 128, blue: 128}, - outlineUnoccludedAlpha: 0, + outlineUnoccludedAlpha: 0.0, outlineOccludedColor: {red: 255, green: 128, blue: 128}, outlineOccludedAlpha:0.0, fillUnoccludedColor: {red: 255, green: 255, blue: 255}, @@ -235,6 +239,18 @@ entityIsGrabbable = function (props) { return true; }; +clearHighlightedEntities = function() { + Selection.clearSelectedItemsList(DISPATCHER_HOVERING_LIST); +}; + +highlightTargetEntity = function(entityID) { + Selection.addToSelectedItemsList(DISPATCHER_HOVERING_LIST, "entity", entityID); +}; + +unhighlightTargetEntity = function(entityID) { + Selection.removeFromSelectedItemsList(DISPATCHER_HOVERING_LIST, "entity", entityID); +}; + entityIsDistanceGrabbable = function(props) { if (!entityIsGrabbable(props)) { return false; @@ -404,7 +420,11 @@ if (typeof module !== 'undefined') { makeDispatcherModuleParameters: makeDispatcherModuleParameters, enableDispatcherModule: enableDispatcherModule, disableDispatcherModule: disableDispatcherModule, + highlightTargetEntity: highlightTargetEntity, + unhighlightTargetEntity: unhighlightTargetEntity, + clearHighlightedEntities: clearHighlightedEntities, makeRunningValues: makeRunningValues, + findGroupParent: findGroupParent, LEFT_HAND: LEFT_HAND, RIGHT_HAND: RIGHT_HAND, BUMPER_ON_VALUE: BUMPER_ON_VALUE, From 07b1a6be01365304f44cfdc5f7ba735175e715a3 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Fri, 6 Apr 2018 11:01:40 -0700 Subject: [PATCH 19/98] saving work --- .../controllers/controllerDispatcher.js | 2 +- .../controllerModules/equipEntity.js | 50 ++++++++++++++++++- .../highlightNearbyEntities.js | 3 +- 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/scripts/system/controllers/controllerDispatcher.js b/scripts/system/controllers/controllerDispatcher.js index 86b7a98b2d..f4fd933ce4 100644 --- a/scripts/system/controllers/controllerDispatcher.js +++ b/scripts/system/controllers/controllerDispatcher.js @@ -30,7 +30,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); var BASIC_TIMER_INTERVAL_MS = 1000 / TARGET_UPDATE_HZ; var PROFILE = false; - var DEBUG = false; + var DEBUG = true; if (typeof Test !== "undefined") { PROFILE = true; diff --git a/scripts/system/controllers/controllerModules/equipEntity.js b/scripts/system/controllers/controllerModules/equipEntity.js index 252f6efa9e..c5ec76ccfd 100644 --- a/scripts/system/controllers/controllerModules/equipEntity.js +++ b/scripts/system/controllers/controllerModules/equipEntity.js @@ -23,6 +23,27 @@ var DEFAULT_SPHERE_MODEL_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/eq var EQUIP_SPHERE_SCALE_FACTOR = 0.65; +var EQUIPPING_OUTER_COLOR = { red: 0, green: 100, blue: 0 }; +var EQUIPPING_INNER_COLOR = { red: 0, green: 150, blue: 0 }; +var UNEQUIPPING_OUTER_COLOR = { red: 100, green: 0, blue: 0 }; +var UNEQUIPPING_INNER_COLOR = { red: 150, green: 0, blue: 0 }; + +var CIRCLE_3D_PROPERTIES = { + solid: true, + innerRadius: 0.0, + outerRadius: 1.0, + startAt: 0, + endAt: 180, + outerColor: EQUIPPING_OUTER_COLOR, + innerColor: EQUIPPING_INNER_COLOR, + alpha: 1.0, + innerAlpha: 0.9, + Alpha: 1.0 +}; + +var EQUIP_TIME = 3000; +var UNEQUIP_TIME = 4000; + // Each overlayInfoSet describes a single equip hotspot. // It is an object with the following keys: // timestamp - last time this object was updated, used to delete stale hotspot overlays. @@ -158,6 +179,29 @@ EquipHotspotBuddy.prototype.update = function(deltaTime, timestamp, controllerDa } }; + +function EquipTimer(hand) { + this.hand = hand; + this.controllerTriggerPressed = false; + this.equipTime = EQUIP_TIME; + this.currentTimeLapse = 0; + this.equip = true; + this.finished = false; + this.circle3dProperties = CIRCLE_3D_PROPERTIES; + this.circle3dOverlay = Overlays.addOverlay("circle3d", this.circle3dProperties); +} + +EquipTimer.prototype.update = function(deltaTime, timestamp, controllerData) { +}; + +EquipTimer.prototype.finished = function() { + return this.finished; +}; + +EquipTimer.prototype.cleanup = function() { + Overlays.deleteOverlay(this.circle3dOverlay); +}; + (function() { var ATTACH_POINT_SETTINGS = "io.highfidelity.attachPoints"; @@ -279,6 +323,8 @@ EquipHotspotBuddy.prototype.update = function(deltaTime, timestamp, controllerDa var equipHotspotBuddy = new EquipHotspotBuddy(); + this.equipTimer = new EquipTimer(this.hand); + this.setMessageGrabData = function(entityProperties) { if (entityProperties) { this.messageGrabEntity = true; @@ -621,8 +667,8 @@ EquipHotspotBuddy.prototype.update = function(deltaTime, timestamp, controllerDa // if the potentialHotspot os not cloneable and locked return null if (potentialEquipHotspot && - (((this.triggerSmoothedSqueezed() || this.secondarySmoothedSqueezed()) && !this.waitForTriggerRelease) || - this.messageGrabEntity)) { + (((this.triggerSmoothedSqueezed() || this.secondarySmoothedSqueezed()) && !this.waitForTriggerRelease && + this.equipTimer.finished()) || this.messageGrabEntity)) { this.grabbedHotspot = potentialEquipHotspot; this.targetEntityID = this.grabbedHotspot.entityID; this.startEquipEntity(controllerData); diff --git a/scripts/system/controllers/controllerModules/highlightNearbyEntities.js b/scripts/system/controllers/controllerModules/highlightNearbyEntities.js index de58c5a388..d204499c05 100644 --- a/scripts/system/controllers/controllerModules/highlightNearbyEntities.js +++ b/scripts/system/controllers/controllerModules/highlightNearbyEntities.js @@ -45,7 +45,8 @@ this.highlightEntities = function(controllerData) { if (this.highlightedEntities.length > 0) { - dispatcherUtils.clearHighlightedEntities(); + //print("-----> clearing + //dispatcherUtils.clearHighlightedEntities(); this.highlightedEntities = []; } From fd478328579c3d6a95188c3103943e88cf22a7af Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Fri, 6 Apr 2018 11:47:09 -0700 Subject: [PATCH 20/98] saving changes --- scripts/system/controllers/controllerDispatcher.js | 1 + .../controllers/controllerModules/equipEntity.js | 14 ++++++++++++-- .../controllerModules/highlightNearbyEntities.js | 3 +-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/scripts/system/controllers/controllerDispatcher.js b/scripts/system/controllers/controllerDispatcher.js index f4fd933ce4..12f9fdbba0 100644 --- a/scripts/system/controllers/controllerDispatcher.js +++ b/scripts/system/controllers/controllerDispatcher.js @@ -125,6 +125,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); }; Selection.enableListHighlight(DISPATCHER_HOVERING_LIST, DISPATCHER_HOVERING_STYLE); + Selection.enableListToScene(DISPATCHER_HOVERING_LIST); this.updateTimings = function () { _this.intervalCount++; diff --git a/scripts/system/controllers/controllerModules/equipEntity.js b/scripts/system/controllers/controllerModules/equipEntity.js index c5ec76ccfd..60a36ea06d 100644 --- a/scripts/system/controllers/controllerModules/equipEntity.js +++ b/scripts/system/controllers/controllerModules/equipEntity.js @@ -30,6 +30,7 @@ var UNEQUIPPING_INNER_COLOR = { red: 150, green: 0, blue: 0 }; var CIRCLE_3D_PROPERTIES = { solid: true, + visible: false, innerRadius: 0.0, outerRadius: 1.0, startAt: 0, @@ -182,7 +183,8 @@ EquipHotspotBuddy.prototype.update = function(deltaTime, timestamp, controllerDa function EquipTimer(hand) { this.hand = hand; - this.controllerTriggerPressed = false; + this.primaryTriggerPressed = false; + this.secondaryTriggerPressed = false; this.equipTime = EQUIP_TIME; this.currentTimeLapse = 0; this.equip = true; @@ -192,6 +194,14 @@ function EquipTimer(hand) { } EquipTimer.prototype.update = function(deltaTime, timestamp, controllerData) { + /*var TRIGGER_ON_VALUE = 0.105; + var BUMPER_ON_VALUE = 0.5; + var primaryTriggerPressed = controllerData.triggerValues[this.hand] > TRIGGER_ON_VALUE; + var secondaryTriggerPressed = controllerData.secondaryValues[this.hand] > BUMPER_ON_VALUE; + + if (primaryTriggerPressed || secondaryTriggerPressed) { + if (primaryTriggerPressed === this.primaryTriggerPressed && + */ }; EquipTimer.prototype.finished = function() { @@ -662,7 +672,7 @@ EquipTimer.prototype.cleanup = function() { } equipHotspotBuddy.update(deltaTime, timestamp, controllerData); - + this.equiptTimer.update(deltaTime, timestamp, controllerData); // if the potentialHotspot is cloneable, clone it and return it // if the potentialHotspot os not cloneable and locked return null diff --git a/scripts/system/controllers/controllerModules/highlightNearbyEntities.js b/scripts/system/controllers/controllerModules/highlightNearbyEntities.js index d204499c05..de58c5a388 100644 --- a/scripts/system/controllers/controllerModules/highlightNearbyEntities.js +++ b/scripts/system/controllers/controllerModules/highlightNearbyEntities.js @@ -45,8 +45,7 @@ this.highlightEntities = function(controllerData) { if (this.highlightedEntities.length > 0) { - //print("-----> clearing - //dispatcherUtils.clearHighlightedEntities(); + dispatcherUtils.clearHighlightedEntities(); this.highlightedEntities = []; } From 2c20593b6defe3a4bf1a421518a2e6a46976edbd Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Fri, 6 Apr 2018 16:30:45 -0700 Subject: [PATCH 21/98] editing equip code --- .../controllers/controllerDispatcher.js | 2 +- .../controllerModules/equipEntity.js | 74 +++++++++++++++---- .../highlightNearbyEntities.js | 5 +- 3 files changed, 65 insertions(+), 16 deletions(-) diff --git a/scripts/system/controllers/controllerDispatcher.js b/scripts/system/controllers/controllerDispatcher.js index 12f9fdbba0..04f9b3e43a 100644 --- a/scripts/system/controllers/controllerDispatcher.js +++ b/scripts/system/controllers/controllerDispatcher.js @@ -30,7 +30,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); var BASIC_TIMER_INTERVAL_MS = 1000 / TARGET_UPDATE_HZ; var PROFILE = false; - var DEBUG = true; + var DEBUG = false; if (typeof Test !== "undefined") { PROFILE = true; diff --git a/scripts/system/controllers/controllerModules/equipEntity.js b/scripts/system/controllers/controllerModules/equipEntity.js index 60a36ea06d..2d74bbe9ae 100644 --- a/scripts/system/controllers/controllerModules/equipEntity.js +++ b/scripts/system/controllers/controllerModules/equipEntity.js @@ -183,31 +183,62 @@ EquipHotspotBuddy.prototype.update = function(deltaTime, timestamp, controllerDa function EquipTimer(hand) { this.hand = hand; + this.timelapsed = 0; this.primaryTriggerPressed = false; this.secondaryTriggerPressed = false; - this.equipTime = EQUIP_TIME; - this.currentTimeLapse = 0; - this.equip = true; + this.targetTime = EQUIP_TIME; this.finished = false; this.circle3dProperties = CIRCLE_3D_PROPERTIES; this.circle3dOverlay = Overlays.addOverlay("circle3d", this.circle3dProperties); } -EquipTimer.prototype.update = function(deltaTime, timestamp, controllerData) { - /*var TRIGGER_ON_VALUE = 0.105; +EquipTimer.prototype.update = function(deltaTime, targetEntityID, controllerData) { + var TRIGGER_ON_VALUE = 0.105; var BUMPER_ON_VALUE = 0.5; var primaryTriggerPressed = controllerData.triggerValues[this.hand] > TRIGGER_ON_VALUE; var secondaryTriggerPressed = controllerData.secondaryValues[this.hand] > BUMPER_ON_VALUE; if (primaryTriggerPressed || secondaryTriggerPressed) { - if (primaryTriggerPressed === this.primaryTriggerPressed && - */ + if ((primaryTriggerPressed === this.primaryTriggerPressed) && + (secondaryTriggerPressed === this.secondaryTriggerPressed)) { + this.timelapsed += deltaTime * 1000; // convert to ms + // update overlay + + var entityProperties = Entities.getEntityProperties(targetEntityID, ["position", "rotation"]); + if (entityProperties) { + var PI = 3.14159; + var TWO_PI = PI * 2; + var FORWARD_OFFSET = 0.1 * MyAvatar.sensorToWorldScale; + var direction = Vec3.subtract(entityProperties.position - HMD.position); + var overlayPosition = Vec3.sum(entityProperties.position, Vec3.multiply(FORWARD_OFFSET, direction)); + } + if (this.timelapsed >= this.targetTime) { + print("finished"); + this.finished = true; + } + + return; + } + + this.reset(); + this.primaryTriggerPressed = primaryTriggerPressed; + this.secondaryTriggerPressed = secondaryTriggerPressed; + } else { + this.reset(); + } }; -EquipTimer.prototype.finished = function() { +EquipTimer.prototype.done = function() { return this.finished; }; +EquipTimer.prototype.reset = function() { + this.finished = false; + this.timelapsed = 0; + this.primaryTriggerPressed = false; + this.secondaryTriggerPressed = false; +}; + EquipTimer.prototype.cleanup = function() { Overlays.deleteOverlay(this.circle3dOverlay); }; @@ -324,6 +355,7 @@ EquipTimer.prototype.cleanup = function() { this.shouldSendStart = false; this.equipedWithSecondary = false; this.handHasBeenRightsideUp = false; + this.equipAtRun = false; this.parameters = makeDispatcherModuleParameters( 300, @@ -672,20 +704,23 @@ EquipTimer.prototype.cleanup = function() { } equipHotspotBuddy.update(deltaTime, timestamp, controllerData); - this.equiptTimer.update(deltaTime, timestamp, controllerData); // if the potentialHotspot is cloneable, clone it and return it // if the potentialHotspot os not cloneable and locked return null if (potentialEquipHotspot && - (((this.triggerSmoothedSqueezed() || this.secondarySmoothedSqueezed()) && !this.waitForTriggerRelease && - this.equipTimer.finished()) || this.messageGrabEntity)) { + (((this.triggerSmoothedSqueezed() || this.secondarySmoothedSqueezed()) && !this.waitForTriggerRelease) || this.messageGrabEntity)) { this.grabbedHotspot = potentialEquipHotspot; this.targetEntityID = this.grabbedHotspot.entityID; - this.startEquipEntity(controllerData); + this.equipAtRun = true; this.messageGrabEntity = false; - this.equipedWithSecondary = this.secondarySmoothedSqueezed(); + if (this.messageGrabEntity) { + this.startEquipEntity(controllerData); + this.equipedWithSecondary = this.secondarySmoothedSqueezed(); + this.equipAtRun = false; + } return makeRunningValues(true, [potentialEquipHotspot.entityID], []); } else { + this.equipAtRun = false; return makeRunningValues(false, [], []); } }; @@ -706,6 +741,19 @@ EquipTimer.prototype.cleanup = function() { var timestamp = Date.now(); this.updateInputs(controllerData); + if (this.equipAtRun) { + if ((this.triggerSmoothedSqueezed() || this.secondarySmoothedSqueezed()) && !this.waitForTriggerRelease) { + this.equipTimer.update(deltaTime, this.targetEntityID, controllerData); + if (this.equipTimer.done()) { + this.equipAtRun = false; + this.startEquipEntity(controllerData); + this.equipedWithSecondary = this.secondarySmoothedSqueezed(); + this.equipTimer.reset(); + } + return makeRunningValues(true, [], []); + } + } + if (!this.isTargetIDValid(controllerData)) { this.endEquipEntity(); return makeRunningValues(false, [], []); diff --git a/scripts/system/controllers/controllerModules/highlightNearbyEntities.js b/scripts/system/controllers/controllerModules/highlightNearbyEntities.js index de58c5a388..2b9b79578f 100644 --- a/scripts/system/controllers/controllerModules/highlightNearbyEntities.js +++ b/scripts/system/controllers/controllerModules/highlightNearbyEntities.js @@ -9,12 +9,13 @@ /* global Script, Controller, RIGHT_HAND, LEFT_HAND, MyAvatar, getGrabPointSphereOffset, makeRunningValues, Entities, enableDispatcherModule, disableDispatcherModule, makeDispatcherModuleParameters, PICK_MAX_DISTANCE, COLORS_GRAB_SEARCHING_HALF_SQUEEZE, COLORS_GRAB_SEARCHING_FULL_SQUEEZE, COLORS_GRAB_DISTANCE_HOLD, - DEFAULT_SEARCH_SPHERE_DISTANCE, getGrabbableData, makeLaserParams + DEFAULT_SEARCH_SPHERE_DISTANCE, getGrabbableData, makeLaserParams, entityIsCloneable */ (function () { Script.include("/~/system/libraries/controllerDispatcherUtils.js"); Script.include("/~/system/libraries/controllers.js"); + Script.include("/~/system/libraries/cloneEntityUtils.js"); var dispatcherUtils = Script.require("/~/system/libraries/controllerDispatcherUtils.js"); function HighlightNearbyEntities(hand) { this.hand = hand; @@ -28,7 +29,7 @@ this.isGrabable = function(controllerData, props) { - if (dispatcherUtils.entityIsGrabbable(props) || dispatcherUtils.entityIsCloneable(props)) { + if (dispatcherUtils.entityIsGrabbable(props) || entityIsCloneable(props)) { // if we've attempted to grab a child, roll up to the root of the tree var groupRootProps = dispatcherUtils.findGroupParent(controllerData, props); if (dispatcherUtils.entityIsGrabbable(groupRootProps)) { From 1113202a906783a492dccf9c3581a7f9d0ea038e Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Mon, 9 Apr 2018 16:51:20 -0700 Subject: [PATCH 22/98] reverting file --- .../controllerModules/equipEntity.js | 114 +----------------- 1 file changed, 5 insertions(+), 109 deletions(-) diff --git a/scripts/system/controllers/controllerModules/equipEntity.js b/scripts/system/controllers/controllerModules/equipEntity.js index 2d74bbe9ae..252f6efa9e 100644 --- a/scripts/system/controllers/controllerModules/equipEntity.js +++ b/scripts/system/controllers/controllerModules/equipEntity.js @@ -23,28 +23,6 @@ var DEFAULT_SPHERE_MODEL_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/eq var EQUIP_SPHERE_SCALE_FACTOR = 0.65; -var EQUIPPING_OUTER_COLOR = { red: 0, green: 100, blue: 0 }; -var EQUIPPING_INNER_COLOR = { red: 0, green: 150, blue: 0 }; -var UNEQUIPPING_OUTER_COLOR = { red: 100, green: 0, blue: 0 }; -var UNEQUIPPING_INNER_COLOR = { red: 150, green: 0, blue: 0 }; - -var CIRCLE_3D_PROPERTIES = { - solid: true, - visible: false, - innerRadius: 0.0, - outerRadius: 1.0, - startAt: 0, - endAt: 180, - outerColor: EQUIPPING_OUTER_COLOR, - innerColor: EQUIPPING_INNER_COLOR, - alpha: 1.0, - innerAlpha: 0.9, - Alpha: 1.0 -}; - -var EQUIP_TIME = 3000; -var UNEQUIP_TIME = 4000; - // Each overlayInfoSet describes a single equip hotspot. // It is an object with the following keys: // timestamp - last time this object was updated, used to delete stale hotspot overlays. @@ -180,69 +158,6 @@ EquipHotspotBuddy.prototype.update = function(deltaTime, timestamp, controllerDa } }; - -function EquipTimer(hand) { - this.hand = hand; - this.timelapsed = 0; - this.primaryTriggerPressed = false; - this.secondaryTriggerPressed = false; - this.targetTime = EQUIP_TIME; - this.finished = false; - this.circle3dProperties = CIRCLE_3D_PROPERTIES; - this.circle3dOverlay = Overlays.addOverlay("circle3d", this.circle3dProperties); -} - -EquipTimer.prototype.update = function(deltaTime, targetEntityID, controllerData) { - var TRIGGER_ON_VALUE = 0.105; - var BUMPER_ON_VALUE = 0.5; - var primaryTriggerPressed = controllerData.triggerValues[this.hand] > TRIGGER_ON_VALUE; - var secondaryTriggerPressed = controllerData.secondaryValues[this.hand] > BUMPER_ON_VALUE; - - if (primaryTriggerPressed || secondaryTriggerPressed) { - if ((primaryTriggerPressed === this.primaryTriggerPressed) && - (secondaryTriggerPressed === this.secondaryTriggerPressed)) { - this.timelapsed += deltaTime * 1000; // convert to ms - // update overlay - - var entityProperties = Entities.getEntityProperties(targetEntityID, ["position", "rotation"]); - if (entityProperties) { - var PI = 3.14159; - var TWO_PI = PI * 2; - var FORWARD_OFFSET = 0.1 * MyAvatar.sensorToWorldScale; - var direction = Vec3.subtract(entityProperties.position - HMD.position); - var overlayPosition = Vec3.sum(entityProperties.position, Vec3.multiply(FORWARD_OFFSET, direction)); - } - if (this.timelapsed >= this.targetTime) { - print("finished"); - this.finished = true; - } - - return; - } - - this.reset(); - this.primaryTriggerPressed = primaryTriggerPressed; - this.secondaryTriggerPressed = secondaryTriggerPressed; - } else { - this.reset(); - } -}; - -EquipTimer.prototype.done = function() { - return this.finished; -}; - -EquipTimer.prototype.reset = function() { - this.finished = false; - this.timelapsed = 0; - this.primaryTriggerPressed = false; - this.secondaryTriggerPressed = false; -}; - -EquipTimer.prototype.cleanup = function() { - Overlays.deleteOverlay(this.circle3dOverlay); -}; - (function() { var ATTACH_POINT_SETTINGS = "io.highfidelity.attachPoints"; @@ -355,7 +270,6 @@ EquipTimer.prototype.cleanup = function() { this.shouldSendStart = false; this.equipedWithSecondary = false; this.handHasBeenRightsideUp = false; - this.equipAtRun = false; this.parameters = makeDispatcherModuleParameters( 300, @@ -365,8 +279,6 @@ EquipTimer.prototype.cleanup = function() { var equipHotspotBuddy = new EquipHotspotBuddy(); - this.equipTimer = new EquipTimer(this.hand); - this.setMessageGrabData = function(entityProperties) { if (entityProperties) { this.messageGrabEntity = true; @@ -704,23 +616,20 @@ EquipTimer.prototype.cleanup = function() { } equipHotspotBuddy.update(deltaTime, timestamp, controllerData); + // if the potentialHotspot is cloneable, clone it and return it // if the potentialHotspot os not cloneable and locked return null if (potentialEquipHotspot && - (((this.triggerSmoothedSqueezed() || this.secondarySmoothedSqueezed()) && !this.waitForTriggerRelease) || this.messageGrabEntity)) { + (((this.triggerSmoothedSqueezed() || this.secondarySmoothedSqueezed()) && !this.waitForTriggerRelease) || + this.messageGrabEntity)) { this.grabbedHotspot = potentialEquipHotspot; this.targetEntityID = this.grabbedHotspot.entityID; - this.equipAtRun = true; + this.startEquipEntity(controllerData); this.messageGrabEntity = false; - if (this.messageGrabEntity) { - this.startEquipEntity(controllerData); - this.equipedWithSecondary = this.secondarySmoothedSqueezed(); - this.equipAtRun = false; - } + this.equipedWithSecondary = this.secondarySmoothedSqueezed(); return makeRunningValues(true, [potentialEquipHotspot.entityID], []); } else { - this.equipAtRun = false; return makeRunningValues(false, [], []); } }; @@ -741,19 +650,6 @@ EquipTimer.prototype.cleanup = function() { var timestamp = Date.now(); this.updateInputs(controllerData); - if (this.equipAtRun) { - if ((this.triggerSmoothedSqueezed() || this.secondarySmoothedSqueezed()) && !this.waitForTriggerRelease) { - this.equipTimer.update(deltaTime, this.targetEntityID, controllerData); - if (this.equipTimer.done()) { - this.equipAtRun = false; - this.startEquipEntity(controllerData); - this.equipedWithSecondary = this.secondarySmoothedSqueezed(); - this.equipTimer.reset(); - } - return makeRunningValues(true, [], []); - } - } - if (!this.isTargetIDValid(controllerData)) { this.endEquipEntity(); return makeRunningValues(false, [], []); From 2e1ebac03ffcfb7b7180330c1d51b9ecd6b226e9 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Mon, 9 Apr 2018 18:07:03 -0700 Subject: [PATCH 23/98] clean up functionality --- .../controllerModules/equipEntity.js | 4 +- .../highlightNearbyEntities.js | 41 ++++++++++++++++--- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/scripts/system/controllers/controllerModules/equipEntity.js b/scripts/system/controllers/controllerModules/equipEntity.js index 252f6efa9e..8ad5c80cb8 100644 --- a/scripts/system/controllers/controllerModules/equipEntity.js +++ b/scripts/system/controllers/controllerModules/equipEntity.js @@ -10,7 +10,7 @@ getControllerJointIndex, enableDispatcherModule, disableDispatcherModule, Messages, makeDispatcherModuleParameters, makeRunningValues, Settings, entityHasActions, Vec3, Overlays, flatten, Xform, getControllerWorldLocation, ensureDynamic, entityIsCloneable, - cloneEntity, DISPATCHER_PROPERTIES, TEAR_AWAY_DISTANCE, Uuid + cloneEntity, DISPATCHER_PROPERTIES, TEAR_AWAY_DISTANCE, Uuid, unhighlightTargetEntity */ Script.include("/~/system/libraries/Xform.js"); @@ -483,7 +483,7 @@ EquipHotspotBuddy.prototype.update = function(deltaTime, timestamp, controllerDa this.dropGestureReset(); this.clearEquipHaptics(); Controller.triggerHapticPulse(HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, this.hand); - + unhighlightTargetEntity(this.targetEntityID); var grabbedProperties = Entities.getEntityProperties(this.targetEntityID); // if an object is "equipped" and has a predefined offset, use it. diff --git a/scripts/system/controllers/controllerModules/highlightNearbyEntities.js b/scripts/system/controllers/controllerModules/highlightNearbyEntities.js index 2b9b79578f..44d48138d2 100644 --- a/scripts/system/controllers/controllerModules/highlightNearbyEntities.js +++ b/scripts/system/controllers/controllerModules/highlightNearbyEntities.js @@ -17,8 +17,21 @@ Script.include("/~/system/libraries/controllers.js"); Script.include("/~/system/libraries/cloneEntityUtils.js"); var dispatcherUtils = Script.require("/~/system/libraries/controllerDispatcherUtils.js"); + + function differenceInArrays(firstArray, secondArray) { + print("first " + firstArray); + print("second " + secondArray); + var differenceArray = firstArray.filter(function(element) { + return secondArray.indexOf(element) < 0; + }); + + return differenceArray; + } + function HighlightNearbyEntities(hand) { this.hand = hand; + this.otherHand = hand === dispatcherUtils.RIGHT_HAND ? dispatcherUtils.LEFT_HAND : + dispatcherUtils.RIGHT_HAND; this.highlightedEntities = []; this.parameters = dispatcherUtils.makeDispatcherModuleParameters( @@ -44,13 +57,20 @@ return (props.href !== "" && props.href !== undefined); }; - this.highlightEntities = function(controllerData) { - if (this.highlightedEntities.length > 0) { - dispatcherUtils.clearHighlightedEntities(); - this.highlightedEntities = []; - } + this.getOtherModule = function() { + var otherModule = this.hand === dispatcherUtils.RIGHT_HAND ? leftHighlightNearbyEntities : + rightHighlightNearbyEntities; + return otherModule; + }; + this.getOtherHandHighlightedEntities = function() { + return this.getOtherModule().highlightedEntities; + }; + + this.highlightEntities = function(controllerData) { var nearbyEntitiesProperties = controllerData.nearbyEntityProperties[this.hand]; + var otherHandHighlightedEntities = this.getOtherHandHighlightedEntities(); + var newHighlightedEntities = []; var sensorScaleFactor = MyAvatar.sensorToWorldScale; for (var i = 0; i < nearbyEntitiesProperties.length; i++) { var props = nearbyEntitiesProperties[i]; @@ -59,9 +79,18 @@ } if (this.isGrabable(controllerData, props) || this.hasHyperLink(props)) { dispatcherUtils.highlightTargetEntity(props.id); - this.highlightedEntities.push(props.id); + newHighlightedEntities.push(props.id); } } + + var unhighlightEntities = differenceInArrays(this.highlightedEntities, newHighlightedEntities); + + unhighlightEntities.forEach(function(entityID) { + if (otherHandHighlightedEntities.indexOf(entityID) < 0 ) { + dispatcherUtils.unhighlightTargetEntity(entityID); + } + }); + this.highlightedEntities = newHighlightedEntities; }; this.isReady = function(controllerData) { From 447163bd07e40b62bd832ac7271bd71a5e1b8285 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Tue, 10 Apr 2018 09:23:40 -0700 Subject: [PATCH 24/98] clean up scripts --- .../controllerModules/equipEntity.js | 6 ++++ .../highlightNearbyEntities.js | 33 ++++++++++++++++--- .../controllerModules/nearActionGrabEntity.js | 6 ++++ .../controllerModules/nearParentGrabEntity.js | 6 ++++ 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/scripts/system/controllers/controllerModules/equipEntity.js b/scripts/system/controllers/controllerModules/equipEntity.js index 8ad5c80cb8..09d64b5d05 100644 --- a/scripts/system/controllers/controllerModules/equipEntity.js +++ b/scripts/system/controllers/controllerModules/equipEntity.js @@ -484,6 +484,12 @@ EquipHotspotBuddy.prototype.update = function(deltaTime, timestamp, controllerDa this.clearEquipHaptics(); Controller.triggerHapticPulse(HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, this.hand); unhighlightTargetEntity(this.targetEntityID); + var message = { + hand: this.hand, + entityID: this.targetEntityID + }; + + Messages.sendMessage('Hifi-unhighlight-entity', JSON.stringify(message)); var grabbedProperties = Entities.getEntityProperties(this.targetEntityID); // if an object is "equipped" and has a predefined offset, use it. diff --git a/scripts/system/controllers/controllerModules/highlightNearbyEntities.js b/scripts/system/controllers/controllerModules/highlightNearbyEntities.js index 44d48138d2..a102a5d735 100644 --- a/scripts/system/controllers/controllerModules/highlightNearbyEntities.js +++ b/scripts/system/controllers/controllerModules/highlightNearbyEntities.js @@ -9,7 +9,7 @@ /* global Script, Controller, RIGHT_HAND, LEFT_HAND, MyAvatar, getGrabPointSphereOffset, makeRunningValues, Entities, enableDispatcherModule, disableDispatcherModule, makeDispatcherModuleParameters, PICK_MAX_DISTANCE, COLORS_GRAB_SEARCHING_HALF_SQUEEZE, COLORS_GRAB_SEARCHING_FULL_SQUEEZE, COLORS_GRAB_DISTANCE_HOLD, - DEFAULT_SEARCH_SPHERE_DISTANCE, getGrabbableData, makeLaserParams, entityIsCloneable + DEFAULT_SEARCH_SPHERE_DISTANCE, getGrabbableData, makeLaserParams, entityIsCloneable, Messages, print */ (function () { @@ -19,8 +19,6 @@ var dispatcherUtils = Script.require("/~/system/libraries/controllerDispatcherUtils.js"); function differenceInArrays(firstArray, secondArray) { - print("first " + firstArray); - print("second " + secondArray); var differenceArray = firstArray.filter(function(element) { return secondArray.indexOf(element) < 0; }); @@ -57,6 +55,13 @@ return (props.href !== "" && props.href !== undefined); }; + this.removeEntityFromHighlightList = function(entityID) { + var index = this.highlightedEntities.indexOf(entityID); + if (index > -1) { + this.highlightedEntities.splice(index, 1); + } + }; + this.getOtherModule = function() { var otherModule = this.hand === dispatcherUtils.RIGHT_HAND ? leftHighlightNearbyEntities : rightHighlightNearbyEntities; @@ -103,6 +108,25 @@ }; } + var handleMessage = function(channel, message, sender) { + var data; + if (sender === MyAvatar.sessionUUID) { + if (channel === 'Hifi-unhighlight-entity') { + try { + data = JSON.parse(message); + + var hand = data.hand; + if (hand === dispatcherUtils.LEFT_HAND) { + leftHighlightNearbyEntities.removeEntityFromHighlightList(data.entityID); + } else if (hand === dispatcherUtils.RIGHT_HAND) { + rightHighlightNearbyEntities.removeEntityFromHighlightList(data.entityID); + } + } catch (e) { + print("Failed to parse message"); + } + } + } + }; var leftHighlightNearbyEntities = new HighlightNearbyEntities(dispatcherUtils.LEFT_HAND); var rightHighlightNearbyEntities = new HighlightNearbyEntities(dispatcherUtils.RIGHT_HAND); @@ -113,6 +137,7 @@ dispatcherUtils.disableDispatcherModule("LeftHighlightNearbyEntities"); dispatcherUtils.disableDispatcherModule("RightHighlightNearbyEntities"); } - + Messages.subscribe('Hifi-unhighlight-entity'); + Messages.messageReceived.connect(handleMessage); Script.scriptEnding.connect(cleanup); }()); diff --git a/scripts/system/controllers/controllerModules/nearActionGrabEntity.js b/scripts/system/controllers/controllerModules/nearActionGrabEntity.js index da9cafbe07..a1e4cff40d 100644 --- a/scripts/system/controllers/controllerModules/nearActionGrabEntity.js +++ b/scripts/system/controllers/controllerModules/nearActionGrabEntity.js @@ -115,6 +115,12 @@ Script.include("/~/system/libraries/cloneEntityUtils.js"); var args = [this.hand === RIGHT_HAND ? "right" : "left", MyAvatar.sessionUUID]; Entities.callEntityMethod(this.targetEntityID, "startNearGrab", args); unhighlightTargetEntity(this.targetEntityID); + var message = { + hand: this.hand, + entityID: this.targetEntityID + }; + + Messages.sendMessage('Hifi-unhighlight-entity', JSON.stringify(message)); }; // this is for when the action is going to time-out diff --git a/scripts/system/controllers/controllerModules/nearParentGrabEntity.js b/scripts/system/controllers/controllerModules/nearParentGrabEntity.js index 945c091f7e..55dde21f46 100644 --- a/scripts/system/controllers/controllerModules/nearParentGrabEntity.js +++ b/scripts/system/controllers/controllerModules/nearParentGrabEntity.js @@ -90,6 +90,12 @@ Script.include("/~/system/libraries/cloneEntityUtils.js"); this.startNearParentingGrabEntity = function (controllerData, targetProps) { Controller.triggerHapticPulse(HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, this.hand); unhighlightTargetEntity(this.targetEntityID); + var message = { + hand: this.hand, + entityID: this.targetEntityID + }; + + Messages.sendMessage('Hifi-unhighlight-entity', JSON.stringify(message)); var handJointIndex; // if (this.ignoreIK) { // handJointIndex = this.controllerJointIndex; From f81836c8300ee89146f07b4757d392f3f79bcc3a Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 9 Apr 2018 18:28:59 -0700 Subject: [PATCH 25/98] support specification of named landing-points in serverless-domain json files --- interface/src/Application.cpp | 3 +++ libraries/entities/src/EntityTree.cpp | 12 ++++++++++++ libraries/entities/src/EntityTree.h | 4 ++++ libraries/networking/src/AddressManager.cpp | 12 ++++++++++-- libraries/networking/src/DomainHandler.cpp | 15 +++++++++++---- libraries/networking/src/DomainHandler.h | 6 +++++- libraries/networking/src/NodeList.cpp | 20 ++++++++++++++++---- 7 files changed, 61 insertions(+), 11 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 18ba881573..9a97e9a42f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3146,6 +3146,9 @@ void Application::loadServerlessDomain(QUrl domainURL) { tmpTree->sendEntities(&_entityEditSender, getEntities()->getTree(), 0, 0, 0); } + std::map namedPaths = tmpTree->getNamedPaths(); + nodeList->getDomainHandler().setIsConnected(true, namedPaths); + _fullSceneReceivedCounter++; } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 2cf66911a4..d5c7b9c2d6 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -2303,6 +2303,18 @@ bool EntityTree::readFromMap(QVariantMap& map) { _persistDataVersion = map["DataVersion"].toInt(); } + _namedPaths.clear(); + if (map.contains("Paths")) { + QVariantMap namedPathsMap = map["Paths"].toMap(); + for(QVariantMap::const_iterator iter = namedPathsMap.begin(); iter != namedPathsMap.end(); ++iter) { + QString namedPathName = iter.key(); + QString namedPathViewPoint = iter.value().toString(); + _namedPaths[namedPathName] = namedPathViewPoint; + } + } else { + _namedPaths["/"] = "/"; + } + // map will have a top-level list keyed as "Entities". This will be extracted // and iterated over. Each member of this list is converted to a QVariantMap, then // to a QScriptValue, and then to EntityItemProperties. These properties are used diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 5f69714432..791c030fc8 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -301,6 +301,8 @@ public: static bool addMaterialToOverlay(const QUuid& overlayID, graphics::MaterialLayer material, const std::string& parentMaterialName); static bool removeMaterialFromOverlay(const QUuid& overlayID, graphics::MaterialPointer material, const std::string& parentMaterialName); + std::map getNamedPaths() const { return _namedPaths; } + signals: void deletingEntity(const EntityItemID& entityID); void deletingEntityPointer(EntityItem* entityID); @@ -417,6 +419,8 @@ private: static std::function _removeMaterialFromOverlayOperator; bool _serverlessDomain { false }; + + std::map _namedPaths; }; #endif // hifi_EntityTree_h diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 3c24cc796c..56b148a43c 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -29,7 +29,7 @@ #include "UserActivityLogger.h" #include "udt/PacketHeaders.h" -const QString DEFAULT_HIFI_ADDRESS = "file:///~/serverless/tutorial.json"; +const QString DEFAULT_HIFI_ADDRESS = "file:///~/serverless/tutorial.json?location=/"; const QString ADDRESS_MANAGER_SETTINGS_GROUP = "AddressManager"; const QString SETTINGS_CURRENT_ADDRESS_KEY = "address"; @@ -312,7 +312,15 @@ bool AddressManager::handleUrl(const QUrl& lookupUrl, LookupTrigger trigger) { _shareablePlaceName.clear(); setDomainInfo(lookupUrl, trigger); emit lookupResultsFinished(); - handlePath(DOMAIN_SPAWNING_POINT, LookupTrigger::Internal, false); + + QString path = DOMAIN_SPAWNING_POINT; + QUrlQuery queryArgs(lookupUrl); + const QString LOCATION_QUERY_KEY = "location"; + if (queryArgs.hasQueryItem(LOCATION_QUERY_KEY)) { + path = queryArgs.queryItemValue(LOCATION_QUERY_KEY); + } + + handlePath(path, LookupTrigger::Internal, false); return true; } diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index c20d6d73be..fe3b0abcb7 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -173,9 +173,7 @@ void DomainHandler::setURLAndID(QUrl domainURL, QUuid domainID) { QString previousHost = _domainURL.host(); _domainURL = domainURL; - if (domainURL.scheme() != URL_SCHEME_HIFI) { - setIsConnected(true); - } else if (previousHost != domainURL.host()) { + if (previousHost != domainURL.host()) { qCDebug(networking) << "Updated domain hostname to" << domainURL.host(); if (!domainURL.host().isEmpty()) { @@ -250,6 +248,14 @@ void DomainHandler::activateICEPublicSocket() { emit completedSocketDiscovery(); } +QString DomainHandler::getViewPointFromNamedPath(QString namedPath) { + auto lookup = _namedPaths.find(namedPath); + if (lookup != _namedPaths.end()) { + return lookup->second; + } + return DOMAIN_SPAWNING_POINT; +} + void DomainHandler::completedHostnameLookup(const QHostInfo& hostInfo) { for (int i = 0; i < hostInfo.addresses().size(); i++) { if (hostInfo.addresses()[i].protocol() == QAbstractSocket::IPv4Protocol) { @@ -279,7 +285,8 @@ void DomainHandler::completedIceServerHostnameLookup() { emit iceSocketAndIDReceived(); } -void DomainHandler::setIsConnected(bool isConnected) { +void DomainHandler::setIsConnected(bool isConnected, std::map namedPaths) { + _namedPaths = namedPaths; if (_isConnected != isConnected) { _isConnected = isConnected; diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index fbc60e2492..760b2f8235 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -73,9 +73,11 @@ public: void activateICEPublicSocket(); bool isConnected() const { return _isConnected; } - void setIsConnected(bool isConnected); + void setIsConnected(bool isConnected, std::map namedPaths = std::map()); bool isServerless() const { return _domainURL.scheme() != URL_SCHEME_HIFI; } + QString getViewPointFromNamedPath(QString namedPath); + bool hasSettings() const { return !_settingsObject.isEmpty(); } void requestDomainSettings(); const QJsonObject& getSettingsObject() const { return _settingsObject; } @@ -200,6 +202,8 @@ private: int _checkInPacketsSinceLastReply { 0 }; QTimer _apiRefreshTimer; + + std::map _namedPaths; }; const QString DOMAIN_SPAWNING_POINT { "/0, -10, 0" }; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index cb0d2e4cd5..3c2b4cd336 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -413,7 +413,14 @@ void NodeList::sendDomainServerCheckIn() { } void NodeList::handleDSPathQuery(const QString& newPath) { - if (_domainHandler.isSocketKnown()) { + if (_domainHandler.isServerless()) { + if (_domainHandler.isConnected()) { + auto viewpoint = _domainHandler.getViewPointFromNamedPath(newPath); + DependencyManager::get()->goToViewpointForPath(viewpoint, newPath); + } else { + _domainHandler.setPendingPath(newPath); + } + } else if (_domainHandler.isSocketKnown()) { // if we have a DS socket we assume it will get this packet and send if off right away sendDSPathQuery(newPath); } else { @@ -427,10 +434,15 @@ void NodeList::sendPendingDSPathQuery() { QString pendingPath = _domainHandler.getPendingPath(); if (!pendingPath.isEmpty()) { - qCDebug(networking) << "Attempting to send pending query to DS for path" << pendingPath; - // this is a slot triggered if we just established a network link with a DS and want to send a path query - sendDSPathQuery(_domainHandler.getPendingPath()); + if (_domainHandler.isServerless()) { + auto viewpoint = _domainHandler.getViewPointFromNamedPath(pendingPath); + DependencyManager::get()->goToViewpointForPath(viewpoint, pendingPath); + } else { + qCDebug(networking) << "Attempting to send pending query to DS for path" << pendingPath; + // this is a slot triggered if we just established a network link with a DS and want to send a path query + sendDSPathQuery(_domainHandler.getPendingPath()); + } // clear whatever the pending path was _domainHandler.clearPendingPath(); From ee3e8093e18bd06f1564e594bd6b882aeea228d4 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 10 Apr 2018 10:19:35 -0700 Subject: [PATCH 26/98] update tutorial content to include default landing-point --- cmake/externals/serverless-content/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/externals/serverless-content/CMakeLists.txt b/cmake/externals/serverless-content/CMakeLists.txt index 4d0773f5f5..6235205aad 100644 --- a/cmake/externals/serverless-content/CMakeLists.txt +++ b/cmake/externals/serverless-content/CMakeLists.txt @@ -4,8 +4,8 @@ set(EXTERNAL_NAME serverless-content) ExternalProject_Add( ${EXTERNAL_NAME} - URL http://cdn.highfidelity.com/content-sets/serverless-tutorial-RC66-v2.zip - URL_MD5 d76bdb3e2bf7ae5d20115bd97b0c44a8 + URL http://cdn.highfidelity.com/content-sets/serverless-tutorial-RC67.zip + URL_MD5 3fc4b7332be771d71b43b6d688de9aa7 CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" From a9b9a1cb105016be5160f7b634c7dfd9f0a75901 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Tue, 10 Apr 2018 15:54:19 -0700 Subject: [PATCH 27/98] Commerce: Gifts --- .../fonts/hifi-glyphs.eot | Bin 31678 -> 33642 bytes .../fonts/hifi-glyphs.svg | 11 +- .../fonts/hifi-glyphs.ttf | Bin 31500 -> 33464 bytes .../hifi-glyphs-1.31/fonts/hifi-glyphs.woff | Bin 0 -> 21496 bytes .../icons-reference.html | 90 +- .../styles.css | 33 +- interface/resources/fonts/hifi-glyphs.ttf | Bin 32544 -> 33464 bytes .../fonts/hifi-glyphs/fonts/hifi-glyphs.woff | Bin 20032 -> 0 bytes .../qml/hifi/commerce/checkout/Checkout.qml | 57 +- .../hifi/commerce/common/CommerceLightbox.qml | 28 +- .../sendAsset}/ConnectionItem.qml | 6 +- .../sendAsset}/RecipientDisplay.qml | 4 +- .../sendAsset/SendAsset.qml} | 519 ++++++----- .../sendAsset}/images/connection.svg | 0 .../sendAsset}/images/nearby.svg | 0 .../sendAsset}/images/p2p-nearby-selected.svg | 0 .../images/p2p-nearby-unselected.svg | 0 .../images/send-money-effect-sm.jpg | Bin .../hifi/commerce/purchases/PurchasedItem.qml | 781 ++++++++-------- .../qml/hifi/commerce/purchases/Purchases.qml | 204 +++-- .../hifi/commerce/wallet/PassphraseModal.qml | 4 +- .../qml/hifi/commerce/wallet/Wallet.qml | 12 +- .../qml/hifi/commerce/wallet/WalletChoice.qml | 17 +- .../qml/hifi/commerce/wallet/WalletSetup.qml | 4 +- .../qml/styles-uit/HifiConstants.qml | 5 + interface/src/Application.cpp | 2 +- interface/src/commerce/Ledger.cpp | 26 +- interface/src/commerce/Ledger.h | 16 +- interface/src/commerce/QmlCommerce.cpp | 16 +- interface/src/commerce/QmlCommerce.h | 8 +- .../entities/src/EntityScriptingInterface.cpp | 2 +- scripts/system/commerce/wallet.js | 196 ++-- scripts/system/libraries/connectionUtils.js | 94 ++ scripts/system/marketplaces/marketplaces.js | 836 +++++++++++++++--- 34 files changed, 1995 insertions(+), 976 deletions(-) rename interface/resources/fonts/{hifi-glyphs => hifi-glyphs-1.31}/fonts/hifi-glyphs.eot (82%) rename interface/resources/fonts/{hifi-glyphs => hifi-glyphs-1.31}/fonts/hifi-glyphs.svg (92%) rename interface/resources/fonts/{hifi-glyphs => hifi-glyphs-1.31}/fonts/hifi-glyphs.ttf (82%) create mode 100644 interface/resources/fonts/hifi-glyphs-1.31/fonts/hifi-glyphs.woff rename interface/resources/fonts/{hifi-glyphs => hifi-glyphs-1.31}/icons-reference.html (93%) rename interface/resources/fonts/{hifi-glyphs => hifi-glyphs-1.31}/styles.css (94%) delete mode 100644 interface/resources/fonts/hifi-glyphs/fonts/hifi-glyphs.woff rename interface/resources/qml/hifi/commerce/{wallet/sendMoney => common/sendAsset}/ConnectionItem.qml (97%) rename interface/resources/qml/hifi/commerce/{wallet/sendMoney => common/sendAsset}/RecipientDisplay.qml (97%) rename interface/resources/qml/hifi/commerce/{wallet/sendMoney/SendMoney.qml => common/sendAsset/SendAsset.qml} (77%) rename interface/resources/qml/hifi/commerce/{wallet/sendMoney => common/sendAsset}/images/connection.svg (100%) rename interface/resources/qml/hifi/commerce/{wallet/sendMoney => common/sendAsset}/images/nearby.svg (100%) rename interface/resources/qml/hifi/commerce/{wallet/sendMoney => common/sendAsset}/images/p2p-nearby-selected.svg (100%) rename interface/resources/qml/hifi/commerce/{wallet/sendMoney => common/sendAsset}/images/p2p-nearby-unselected.svg (100%) rename interface/resources/qml/hifi/commerce/{wallet/sendMoney => common/sendAsset}/images/send-money-effect-sm.jpg (100%) create mode 100644 scripts/system/libraries/connectionUtils.js diff --git a/interface/resources/fonts/hifi-glyphs/fonts/hifi-glyphs.eot b/interface/resources/fonts/hifi-glyphs-1.31/fonts/hifi-glyphs.eot similarity index 82% rename from interface/resources/fonts/hifi-glyphs/fonts/hifi-glyphs.eot rename to interface/resources/fonts/hifi-glyphs-1.31/fonts/hifi-glyphs.eot index d3591e6499c6afaf63e4a2c0f144f4722c2f8d9f..1be5435ced839789c55bbeb6584a2ae2d04400fd 100644 GIT binary patch delta 3467 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 QIOC1+r~f&WfB6IQ2jFE`i~s-t delta 1504 zcmYjRYfO`86n@_Kd%sJ+ek}#suca*o3barzr56eaPDBLc?hO$U?c^p>ZIn6W*3CKG zyd-K(w(JKn%R-jS7$cJyV+=9=Fw2se#Vw1vgqZyxY8*dYwq#3K+OTBrc~8!B&Uv4c z^Zt2W&eHpT65;+NpiEvCLTsh$f$ehb>DZ}=`VTO%3c%i2zqJ8(ApjGP0c3aV^!hvQ zwMGHb4WR2#BpiLO@Fy=op8#}lD10KiwgwKEcmzNi8a*|5XHSO+2;IQwo#BCSzrO8u zA%N!qLc_xYVOB<#0b&G@Hyjy@jc2{F7yxn;AkNWahr*pzkzs(Z0f;>k9*^P`=>te* zVxgnq$iS-&i(SBp1ZN?7?8I3AmfLn<>>(f!5Fp{U2VE-%QfmHymLhR}{_L*$UtD_z z(EMaw0*x;bFS!_BCHqNHyqz`@Yy2wxJ(hUPt-C!r733heB(j5%`own={N(tV<)XE< zB+6OFI!f*V0ZRZjpc*yUh)tM8EgDgWE!cquG+`T>QHBl_p#`lN#1OV(Gv4V$1u7B3 zF0`Q?yJ1Hrve1ugai15aK!sr zzRv^|W>}B`D{Sb(K6GO*_MjL0(T4*#h%ny8Aq-#`hj9d>@p~*IcLGzG#tdTk03YHs zKEfG%jB}X9S$u*|aRKM!67TNYP+hZe(`0R9-Ig5>kfKRah6;>^vAL#7aUca--!7*MCC5^0AbovxSYFfI{q?#=m zR$JG;?!EEL{A~OhFT~A4UaVJhPfnBj`N{Gt`X! zjO!V1tvijETeof2cEvVldt_U+JM5$OCHrcoGxK=N5pw*NRhRWTyEEr#&a!hN zw>Ix)eoy{Wm*nbl>)oa9dG{^%efP@(N5NvjUxm$u-+B~J)bqCJTJcEn=f#gp3QE2% zZ77{6oiBai9rby9i@t}xAN^(iUjL1N9HIz=HttfqVlDIy*stR5LNb;i$+o1_L>46=;Q8?V&^#7?UVRDXY_oQp}*}QZ?eVUX&zJucS&MIZinp z157WAae#OMdX>v36v4aM5>WQN(f<+hNq;xmk}Z` zC0kT@N%=~Y6rI6fkt9LZ>Le*uk!3L<3_+AHoU#19cR@R;C1LQ{uFRYjgh=@Kk%5IPGnK3{DH|YbYoJMW(F3p~ bi;0}W1rRV`U1<{fhVM6i`9mW9U)BBv{ diff --git a/interface/resources/fonts/hifi-glyphs/fonts/hifi-glyphs.svg b/interface/resources/fonts/hifi-glyphs-1.31/fonts/hifi-glyphs.svg similarity index 92% rename from interface/resources/fonts/hifi-glyphs/fonts/hifi-glyphs.svg rename to interface/resources/fonts/hifi-glyphs-1.31/fonts/hifi-glyphs.svg index 43c4932879..c68cb63a0d 100644 --- a/interface/resources/fonts/hifi-glyphs/fonts/hifi-glyphs.svg +++ b/interface/resources/fonts/hifi-glyphs-1.31/fonts/hifi-glyphs.svg @@ -25,7 +25,6 @@ - @@ -145,4 +144,14 @@ + + + + + + + + + + diff --git a/interface/resources/fonts/hifi-glyphs/fonts/hifi-glyphs.ttf b/interface/resources/fonts/hifi-glyphs-1.31/fonts/hifi-glyphs.ttf similarity index 82% rename from interface/resources/fonts/hifi-glyphs/fonts/hifi-glyphs.ttf rename to interface/resources/fonts/hifi-glyphs-1.31/fonts/hifi-glyphs.ttf index 8907cf7858dd304cdad024bfa1ff4ca5cd94caf9..edc447c13245b74845bcce8687c7432f37872c39 100644 GIT binary patch delta 3470 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 Fe*ppxP9FdO delta 1526 zcmYLJdrXs86#w1(-S5$_{YruMYiUb?0xc9M^g#i^7a|~npdtby+R00x+5swptZwtM z`ACdivS)}{7P4f<7@5Qnvl!zaW?3?0wqXXjN&=z1xRJ$LWjbU z{^x5JI)L#+&3yFm_(b2Pn|5I09w3n9a0Ia3?RdH`rRGm)DH8J2hl}cKOBdD4WG%TE zUq|+mqWEW|fmq{D$RDvpnp@rWWFL_I;F6vljMOCtgoM`(-&!hKSxL6eS;DG^BaL4ffgJZlPN*Y38UVP8mqKVQ4m7OPfr4k=~uYnEuiz8IKwlOkUHlX--wusCw7j zZvMm)vdmf@WT+W^8CNr2S(~gA)~nVRwocm_+hyCV?Y?c5BSZh*+IT@LMb5}Av`4<;TYoy<5`*_nyR+uQ-$%2BfO4M z#xcg^o;!@EgiyjsqRffBrkaU~8jgxgV=$0|R)JQi)gDS@fia14l(Jeylwt;*lByAB z^r9q*dR?j{k}=9Dlou$caMZ|i3MU$rRKiG#MwSWX6qz#?$eck+5qYL^0%e3Uk!mE7 z5<-}y;VIeH!w3HMmWToP zPy%0kWZJ_5z7k*j^Y0V(f3{mx{{zrIB&PrX diff --git a/interface/resources/fonts/hifi-glyphs-1.31/fonts/hifi-glyphs.woff b/interface/resources/fonts/hifi-glyphs-1.31/fonts/hifi-glyphs.woff new file mode 100644 index 0000000000000000000000000000000000000000..f26000caf42cd88ba2e2ba3ac079299b43515ce3 GIT binary patch literal 21496 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

HiFi Glyphs

-

This font was created for use inHigh Fidelity

+

This font was created for use in High Fidelity

CSS mapping

  • @@ -87,10 +87,6 @@
  • -
  • -
    - -
  • @@ -567,6 +563,46 @@
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +

Character mapping

    @@ -642,10 +678,6 @@
    -
  • -
    - -
  • @@ -1122,6 +1154,46 @@
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +