diff --git a/android/build.gradle b/android/build.gradle index 1f2c563e1b..b1ac692517 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -138,12 +138,15 @@ def scribeLocalFile='scribe' + EXEC_SUFFIX def scribeFile='scribe_linux_x86_64' def scribeChecksum='c98678d9726bd8bbf1bab792acf3ff6c' +def scribeVersion='onfeBkJWcJiTwiGOyZPVBjlyhoYQ4Axn' if (Os.isFamily(Os.FAMILY_MAC)) { scribeFile = 'scribe_osx_x86_64' scribeChecksum='a137ad62c1bf7cca739da219544a9a16' + scribeVersion='kU.Aq512HVe65uRnkFEWQEqeQfaYF2c0' } else if (Os.isFamily(Os.FAMILY_WINDOWS)) { scribeFile = 'scribe_win32_x86_64.exe' scribeChecksum='75c2ce9ed45d17de375e3988bfaba816' + scribeVersion='24TfWFh1FBY.t6i_LdzAXZYeQOtmQNZp' } def options = [ @@ -398,7 +401,7 @@ task copyDependencies(dependsOn: [ extractDependencies ]) { } task downloadScribe(type: Download) { - src baseUrl + scribeFile + src baseUrl + scribeFile + '?versionId=' + scribeVersion dest new File(baseFolder, scribeLocalFile) onlyIfNewer true } diff --git a/assignment-client/CMakeLists.txt b/assignment-client/CMakeLists.txt index acdc1cbc53..c73e8e1d34 100644 --- a/assignment-client/CMakeLists.txt +++ b/assignment-client/CMakeLists.txt @@ -1,6 +1,6 @@ set(TARGET_NAME assignment-client) -setup_hifi_project(Core Gui Network Script Quick Widgets WebSockets) +setup_hifi_project(Core Gui Network Script Quick WebSockets) # Fix up the rpath so macdeployqt works if (APPLE) diff --git a/assignment-client/src/audio/AudioMixerSlave.cpp b/assignment-client/src/audio/AudioMixerSlave.cpp index 6d150a0dc3..29d42a9ced 100644 --- a/assignment-client/src/audio/AudioMixerSlave.cpp +++ b/assignment-client/src/audio/AudioMixerSlave.cpp @@ -129,6 +129,12 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { AvatarAudioStream* listenerAudioStream = static_cast(listener->getLinkedData())->getAvatarAudioStream(); AudioMixerClientData* listenerData = static_cast(listener->getLinkedData()); + // if we received an invalid position from this listener, then refuse to make them a mix + // because we don't know how to do it properly + if (!listenerAudioStream->hasValidPosition()) { + return false; + } + // zero out the mix for this listener memset(_mixSamples, 0, sizeof(_mixSamples)); @@ -244,12 +250,18 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { void AudioMixerSlave::throttleStream(AudioMixerClientData& listenerNodeData, const QUuid& sourceNodeID, const AvatarAudioStream& listeningNodeStream, const PositionalAudioStream& streamToAdd) { - addStream(listenerNodeData, sourceNodeID, listeningNodeStream, streamToAdd, true); + // only throttle this stream to the mix if it has a valid position, we won't know how to mix it otherwise + if (streamToAdd.hasValidPosition()) { + addStream(listenerNodeData, sourceNodeID, listeningNodeStream, streamToAdd, true); + } } void AudioMixerSlave::mixStream(AudioMixerClientData& listenerNodeData, const QUuid& sourceNodeID, const AvatarAudioStream& listeningNodeStream, const PositionalAudioStream& streamToAdd) { - addStream(listenerNodeData, sourceNodeID, listeningNodeStream, streamToAdd, false); + // only add the stream to the mix if it has a valid position, we won't know how to mix it otherwise + if (streamToAdd.hasValidPosition()) { + addStream(listenerNodeData, sourceNodeID, listeningNodeStream, streamToAdd, false); + } } void AudioMixerSlave::addStream(AudioMixerClientData& listenerNodeData, const QUuid& sourceNodeID, diff --git a/domain-server/src/DomainGatekeeper.cpp b/domain-server/src/DomainGatekeeper.cpp index c6eaa03634..3aab7b4563 100644 --- a/domain-server/src/DomainGatekeeper.cpp +++ b/domain-server/src/DomainGatekeeper.cpp @@ -161,7 +161,7 @@ NodePermissions DomainGatekeeper::setPermissionsForUser(bool isLocalUser, QStrin } else if (_server->_settingsManager.hasPermissionsForMachineFingerprint(machineFingerprint)) { userPerms = _server->_settingsManager.getPermissionsForMachineFingerprint(machineFingerprint); #ifdef WANT_DEBUG - qDebug(() << "| user-permissions: specific Machine Fingerprint matches, so: " << userPerms; + qDebug() << "| user-permissions: specific Machine Fingerprint matches, so: " << userPerms; #endif } else if (_server->_settingsManager.hasPermissionsForIP(senderAddress)) { // this user comes from an IP we have in our permissions table, apply those permissions @@ -187,7 +187,7 @@ NodePermissions DomainGatekeeper::setPermissionsForUser(bool isLocalUser, QStrin } else if (_server->_settingsManager.hasPermissionsForMachineFingerprint(machineFingerprint)) { userPerms = _server->_settingsManager.getPermissionsForMachineFingerprint(machineFingerprint); #ifdef WANT_DEBUG - qDebug(() << "| user-permissions: specific Machine Fingerprint matches, so: " << userPerms; + qDebug() << "| user-permissions: specific Machine Fingerprint matches, so: " << userPerms; #endif } else if (_server->_settingsManager.hasPermissionsForIP(senderAddress)) { // this user comes from an IP we have in our permissions table, apply those permissions @@ -393,9 +393,12 @@ SharedNodePointer DomainGatekeeper::processAgentConnectRequest(const NodeConnect QString verifiedUsername; // if this remains empty, consider this an anonymous connection attempt if (!username.isEmpty()) { - if (usernameSignature.isEmpty()) { + const QUuid& connectionToken = _connectionTokenHash.value(username.toLower()); + + if (usernameSignature.isEmpty() || connectionToken.isNull()) { // user is attempting to prove their identity to us, but we don't have enough information sendConnectionTokenPacket(username, nodeConnection.senderSockAddr); + // ask for their public key right now to make sure we have it requestUserPublicKey(username, true); getGroupMemberships(username); // optimistically get started on group memberships diff --git a/gvr-interface/CMakeLists.txt b/gvr-interface/CMakeLists.txt index 7d6655e875..72f1096881 100644 --- a/gvr-interface/CMakeLists.txt +++ b/gvr-interface/CMakeLists.txt @@ -17,9 +17,9 @@ if (ANDROID) set(BUILD_SHARED_LIBS ON) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${ANDROID_APK_OUTPUT_DIR}/libs/${ANDROID_ABI}") - setup_hifi_library(Gui Widgets AndroidExtras) + setup_hifi_library(Gui AndroidExtras) else () - setup_hifi_project(Gui Widgets) + setup_hifi_project(Gui) endif () include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS}) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 7a5d890d2a..d80bc846f0 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -78,7 +78,7 @@ endif () find_package( Qt5 COMPONENTS - Gui Multimedia Network OpenGL Qml Quick Script Svg + Gui Widgets Multimedia Network Qml Quick Script Svg ${PLATFORM_QT_COMPONENTS} WebChannel WebSockets ) @@ -269,7 +269,7 @@ endif () target_link_libraries( ${TARGET_NAME} - Qt5::Gui Qt5::Network Qt5::Multimedia Qt5::OpenGL + Qt5::Gui Qt5::Network Qt5::Multimedia Qt5::Widgets Qt5::Qml Qt5::Quick Qt5::Script Qt5::Svg Qt5::WebChannel ${PLATFORM_QT_LIBRARIES} diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 1a54c94d53..3e7dd3e223 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1046,7 +1046,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &Application::notifyPacketVersionMismatch); // you might think we could just do this in NodeList but we only want this connection for Interface - connect(nodeList.data(), &NodeList::limitOfSilentDomainCheckInsReached, nodeList.data(), &NodeList::reset); + connect(&nodeList->getDomainHandler(), SIGNAL(limitOfSilentDomainCheckInsReached()), + nodeList.data(), SLOT(reset())); auto dialogsManager = DependencyManager::get(); connect(accountManager.data(), &AccountManager::authRequired, dialogsManager.data(), &DialogsManager::showLoginDialog); diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index d419d7484b..8a7743a849 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -396,11 +396,11 @@ QString WindowScriptingInterface::protocolSignature() { } int WindowScriptingInterface::getInnerWidth() { - return qApp->getDeviceSize().x; + return qApp->getWindow()->geometry().width(); } int WindowScriptingInterface::getInnerHeight() { - return qApp->getDeviceSize().y; + return qApp->getWindow()->geometry().height() - qApp->getPrimaryMenu()->geometry().height(); } glm::vec2 WindowScriptingInterface::getDeviceSize() const { diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index a939db92aa..ba496c5cd4 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -1754,7 +1754,6 @@ void Rig::copyJointsFromJointData(const QVector& jointDataVec) { const AnimPoseVec& relativeDefaultPoses = _animSkeleton->getRelativeDefaultPoses(); for (int i = 0; i < numJoints; i++) { const JointData& data = jointDataVec.at(i); - _internalPoseSet._relativePoses[i].scale() = Vectors::ONE; _internalPoseSet._relativePoses[i].rot() = rotations[i]; if (data.translationIsDefaultPose) { _internalPoseSet._relativePoses[i].trans() = relativeDefaultPoses[i].trans(); diff --git a/libraries/audio/src/AbstractAudioInterface.cpp b/libraries/audio/src/AbstractAudioInterface.cpp index 376ecddd34..3d813eafd7 100644 --- a/libraries/audio/src/AbstractAudioInterface.cpp +++ b/libraries/audio/src/AbstractAudioInterface.cpp @@ -49,6 +49,9 @@ void AbstractAudioInterface::emitAudioPacket(const void* audioData, size_t bytes audioPacket->writePrimitive(channelFlag); } + // at this point we'd better be sending the mixer a valid position, or it won't consider us for mixing + assert(!isNaN(transform.getTranslation())); + // pack the three float positions audioPacket->writePrimitive(transform.getTranslation()); // pack the orientation diff --git a/libraries/audio/src/PositionalAudioStream.cpp b/libraries/audio/src/PositionalAudioStream.cpp index f2c1b05ef7..49b34a894e 100644 --- a/libraries/audio/src/PositionalAudioStream.cpp +++ b/libraries/audio/src/PositionalAudioStream.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -76,6 +77,19 @@ int PositionalAudioStream::parsePositionalData(const QByteArray& positionalByteA QDataStream packetStream(positionalByteArray); packetStream.readRawData(reinterpret_cast(&_position), sizeof(_position)); + + // 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()); + + _hasValidPosition = false; + } else { + _hasValidPosition = true; + } + packetStream.readRawData(reinterpret_cast(&_orientation), sizeof(_orientation)); packetStream.readRawData(reinterpret_cast(&_avatarBoundingBoxCorner), sizeof(_avatarBoundingBoxCorner)); packetStream.readRawData(reinterpret_cast(&_avatarBoundingBoxScale), sizeof(_avatarBoundingBoxScale)); diff --git a/libraries/audio/src/PositionalAudioStream.h b/libraries/audio/src/PositionalAudioStream.h index c5cfa1991e..4c48ea3386 100644 --- a/libraries/audio/src/PositionalAudioStream.h +++ b/libraries/audio/src/PositionalAudioStream.h @@ -43,12 +43,15 @@ public: bool shouldLoopbackForNode() const { return _shouldLoopbackForNode; } bool isStereo() const { return _isStereo; } + PositionalAudioStream::Type getType() const { return _type; } + const glm::vec3& getPosition() const { return _position; } const glm::quat& getOrientation() const { return _orientation; } const glm::vec3& getAvatarBoundingBoxCorner() const { return _avatarBoundingBoxCorner; } const glm::vec3& getAvatarBoundingBoxScale() const { return _avatarBoundingBoxScale; } + bool hasValidPosition() const { return _hasValidPosition; } protected: // disallow copying of PositionalAudioStream objects @@ -75,6 +78,8 @@ protected: float _quietestTrailingFrameLoudness; float _quietestFrameLoudness; int _frameCounter; + + bool _hasValidPosition { false }; }; #endif // hifi_PositionalAudioStream_h diff --git a/libraries/avatars-renderer/CMakeLists.txt b/libraries/avatars-renderer/CMakeLists.txt index 53edc692f2..1f740700c5 100644 --- a/libraries/avatars-renderer/CMakeLists.txt +++ b/libraries/avatars-renderer/CMakeLists.txt @@ -1,6 +1,6 @@ set(TARGET_NAME avatars-renderer) AUTOSCRIBE_SHADER_LIB(gpu graphics render render-utils) -setup_hifi_library(Widgets Network Script) +setup_hifi_library(Network Script) link_hifi_libraries(shared gpu graphics animation model-networking script-engine render render-utils image trackers entities-renderer) include_hifi_library_headers(avatars) include_hifi_library_headers(networking) diff --git a/libraries/display-plugins/CMakeLists.txt b/libraries/display-plugins/CMakeLists.txt index 1d9d42d579..7d34258c96 100644 --- a/libraries/display-plugins/CMakeLists.txt +++ b/libraries/display-plugins/CMakeLists.txt @@ -1,6 +1,6 @@ set(TARGET_NAME display-plugins) AUTOSCRIBE_SHADER_LIB(gpu display-plugins) -setup_hifi_library(OpenGL) +setup_hifi_library(Gui) link_hifi_libraries(shared plugins ui-plugins gl ui render-utils ${PLATFORM_GL_BACKEND}) include_hifi_library_headers(gpu) include_hifi_library_headers(model-networking) diff --git a/libraries/entities-renderer/CMakeLists.txt b/libraries/entities-renderer/CMakeLists.txt index ea75367e1e..4b94757dec 100644 --- a/libraries/entities-renderer/CMakeLists.txt +++ b/libraries/entities-renderer/CMakeLists.txt @@ -1,6 +1,6 @@ set(TARGET_NAME entities-renderer) AUTOSCRIBE_SHADER_LIB(gpu graphics procedural render render-utils) -setup_hifi_library(Widgets Network Script) +setup_hifi_library(Network Script) link_hifi_libraries(shared gpu procedural graphics model-networking script-engine render render-utils image ui pointers) include_hifi_library_headers(networking) include_hifi_library_headers(gl) diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h index db0f0b729a..1e97067795 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -165,7 +165,7 @@ public: PolyVoxEntityRenderer(const EntityItemPointer& entity); protected: - virtual ItemKey getKey() override { return ItemKey::Builder::opaqueShape(); } + virtual ItemKey getKey() override { return ItemKey::Builder::opaqueShape().withTagBits(render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1); } virtual ShapeKey getShapeKey() override; virtual bool needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const override; virtual void doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) override; diff --git a/libraries/gl/CMakeLists.txt b/libraries/gl/CMakeLists.txt index 9fc7a0c10f..925cf9b288 100644 --- a/libraries/gl/CMakeLists.txt +++ b/libraries/gl/CMakeLists.txt @@ -1,5 +1,5 @@ set(TARGET_NAME gl) -setup_hifi_library(OpenGL Qml Quick) +setup_hifi_library(Gui Widgets Qml Quick) link_hifi_libraries(shared) target_opengl() diff --git a/libraries/gpu-gles/CMakeLists.txt b/libraries/gpu-gles/CMakeLists.txt index 16575a7018..ea69919f6d 100644 --- a/libraries/gpu-gles/CMakeLists.txt +++ b/libraries/gpu-gles/CMakeLists.txt @@ -1,5 +1,5 @@ set(TARGET_NAME gpu-gles) -setup_hifi_library(Concurrent) +setup_hifi_library(Gui Concurrent) link_hifi_libraries(shared gl gpu) GroupSources("src") target_opengl() diff --git a/libraries/gpu/src/gpu/Shader.h b/libraries/gpu/src/gpu/Shader.h index 4504337789..d898411006 100755 --- a/libraries/gpu/src/gpu/Shader.h +++ b/libraries/gpu/src/gpu/Shader.h @@ -16,7 +16,7 @@ #include #include #include - +#include #include namespace gpu { diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 4e1354d3aa..e31d75e5dd 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -9,7 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include +#include #include #include #include @@ -764,7 +764,7 @@ void AddressManager::copyAddress() { } // assume that the address is being copied because the user wants a shareable address - QApplication::clipboard()->setText(currentShareableAddress().toString()); + QGuiApplication::clipboard()->setText(currentShareableAddress().toString()); } void AddressManager::copyPath() { @@ -773,7 +773,7 @@ void AddressManager::copyPath() { return; } - QApplication::clipboard()->setText(currentPath()); + QGuiApplication::clipboard()->setText(currentPath()); } QString AddressManager::getDomainID() const { diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 3c20c3798f..411f8f5be2 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -98,6 +98,7 @@ void DomainHandler::softReset() { clearSettings(); _connectionDenialsSinceKeypairRegen = 0; + _checkInPacketsSinceLastReply = 0; // cancel the failure timeout for any pending requests for settings QMetaObject::invokeMethod(&_settingsTimer, "stop"); @@ -382,6 +383,9 @@ void DomainHandler::processDomainServerConnectionDeniedPacket(QSharedPointer= MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { + // we haven't heard back from DS in MAX_SILENT_DOMAIN_SERVER_CHECK_INS + // so emit our signal that says that + qCDebug(networking) << "Limit of silent domain checkins reached"; + emit limitOfSilentDomainCheckInsReached(); + } +} diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index 42ef2f627d..b72c172c3e 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -31,6 +31,8 @@ const unsigned short DEFAULT_DOMAIN_SERVER_DTLS_PORT = 40103; const quint16 DOMAIN_SERVER_HTTP_PORT = 40100; const quint16 DOMAIN_SERVER_HTTPS_PORT = 40101; +const int MAX_SILENT_DOMAIN_SERVER_CHECK_INS = 5; + class DomainHandler : public QObject { Q_OBJECT public: @@ -84,6 +86,10 @@ public: void softReset(); + int getCheckInPacketsSinceLastReply() const { return _checkInPacketsSinceLastReply; } + void sentCheckInPacket(); + void domainListReceived() { _checkInPacketsSinceLastReply = 0; } + /**jsdoc *

The reasons that you may be refused connection to a domain are defined by numeric values:

* @@ -165,6 +171,8 @@ signals: void domainConnectionRefused(QString reasonMessage, int reason, const QString& extraInfo); + void limitOfSilentDomainCheckInsReached(); + private: bool reasonSuggestsLogin(ConnectionRefusedReason reasonCode); void sendDisconnectPacket(); @@ -187,6 +195,7 @@ private: QSet _domainConnectionRefusals; bool _hasCheckedForAccessToken { false }; int _connectionDenialsSinceKeypairRegen { 0 }; + int _checkInPacketsSinceLastReply { 0 }; QTimer _apiRefreshTimer; }; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 1c18125433..d193382bfc 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -44,7 +44,6 @@ NodeList::NodeList(char newOwnerType, int socketListenPort, int dtlsListenPort) _ownerType(newOwnerType), _nodeTypesOfInterest(), _domainHandler(this), - _numNoReplyDomainCheckIns(0), _assignmentServerSocket(), _keepAlivePingTimer(this) { @@ -75,7 +74,7 @@ NodeList::NodeList(char newOwnerType, int socketListenPort, int dtlsListenPort) connect(this, &LimitedNodeList::publicSockAddrChanged, this, &NodeList::sendDomainServerCheckIn); // clear our NodeList when the domain changes - connect(&_domainHandler, &DomainHandler::disconnectedFromDomain, this, &NodeList::reset); + connect(&_domainHandler, SIGNAL(disconnectedFromDomain()), this, SLOT(resetFromDomainHandler())); // send an ICE heartbeat as soon as we get ice server information connect(&_domainHandler, &DomainHandler::iceSocketAndIDReceived, this, &NodeList::handleICEConnectionToDomainServer); @@ -92,10 +91,10 @@ NodeList::NodeList(char newOwnerType, int socketListenPort, int dtlsListenPort) connect(accountManager.data(), &AccountManager::newKeypair, this, &NodeList::sendDomainServerCheckIn); // clear out NodeList when login is finished - connect(accountManager.data(), &AccountManager::loginComplete , this, &NodeList::reset); + connect(accountManager.data(), SIGNAL(loginComplete()) , this, SLOT(reset())); // clear our NodeList when logout is requested - connect(accountManager.data(), &AccountManager::logoutComplete , this, &NodeList::reset); + connect(accountManager.data(), SIGNAL(logoutComplete()) , this, SLOT(reset())); // anytime we get a new node we will want to attempt to punch to it connect(this, &LimitedNodeList::nodeAdded, this, &NodeList::startNodeHolePunch); @@ -231,16 +230,14 @@ void NodeList::processICEPingPacket(QSharedPointer message) { sendPacket(std::move(replyPacket), message->getSenderSockAddr()); } -void NodeList::reset() { +void NodeList::reset(bool skipDomainHandlerReset) { if (thread() != QThread::currentThread()) { - QMetaObject::invokeMethod(this, "reset"); + QMetaObject::invokeMethod(this, "reset", Q_ARG(bool, skipDomainHandlerReset)); return; } LimitedNodeList::reset(); - _numNoReplyDomainCheckIns = 0; - // lock and clear our set of ignored IDs _ignoredSetLock.lockForWrite(); _ignoredNodeIDs.clear(); @@ -255,7 +252,7 @@ void NodeList::reset() { _avatarGainMap.clear(); _avatarGainMapLock.unlock(); - if (sender() != &_domainHandler) { + if (!skipDomainHandlerReset) { // clear the domain connection information, unless they're the ones that asked us to reset _domainHandler.softReset(); } @@ -410,15 +407,8 @@ void NodeList::sendDomainServerCheckIn() { sendPacket(std::move(domainPacket), _domainHandler.getSockAddr()); - if (_numNoReplyDomainCheckIns >= MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { - // we haven't heard back from DS in MAX_SILENT_DOMAIN_SERVER_CHECK_INS - // so emit our signal that says that - qCDebug(networking) << "Limit of silent domain checkins reached"; - emit limitOfSilentDomainCheckInsReached(); - } - - // increment the count of un-replied check-ins - _numNoReplyDomainCheckIns++; + // let the domain handler know we sent another check in or connect packet + _domainHandler.sentCheckInPacket(); } } @@ -585,7 +575,7 @@ void NodeList::processDomainServerList(QSharedPointer message) } // this is a packet from the domain server, reset the count of un-replied check-ins - _numNoReplyDomainCheckIns = 0; + _domainHandler.domainListReceived(); // emit our signal so listeners know we just heard from the DS emit receivedDomainServerList(); diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 0ebc1f0b22..2dd9d3c869 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -38,8 +38,6 @@ const quint64 DOMAIN_SERVER_CHECK_IN_MSECS = 1 * 1000; -const int MAX_SILENT_DOMAIN_SERVER_CHECK_INS = 5; - using PacketOrPacketList = std::pair, std::unique_ptr>; using NodePacketOrPacketListPair = std::pair; @@ -62,7 +60,6 @@ public: Q_INVOKABLE qint64 sendStats(QJsonObject statsObject, HifiSockAddr destination); Q_INVOKABLE qint64 sendStatsToDomainServer(QJsonObject statsObject); - int getNumNoReplyDomainCheckIns() const { return _numNoReplyDomainCheckIns; } DomainHandler& getDomainHandler() { return _domainHandler; } const NodeSet& getNodeInterestSet() const { return _nodeTypesOfInterest; } @@ -96,7 +93,9 @@ public: void removeFromIgnoreMuteSets(const QUuid& nodeID); public slots: - void reset(); + void reset(bool skipDomainHandlerReset = false); + void resetFromDomainHandler() { reset(true); } + void sendDomainServerCheckIn(); void handleDSPathQuery(const QString& newPath); @@ -119,7 +118,6 @@ public slots: #endif signals: - void limitOfSilentDomainCheckInsReached(); void receivedDomainServerList(); void ignoredNode(const QUuid& nodeID, bool enabled); void ignoreRadiusEnabledChanged(bool isIgnored); @@ -161,7 +159,6 @@ private: std::atomic _ownerType; NodeSet _nodeTypesOfInterest; DomainHandler _domainHandler; - int _numNoReplyDomainCheckIns; HifiSockAddr _assignmentServerSocket; bool _isShuttingDown { false }; QTimer _keepAlivePingTimer; diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index c48c6bfc0b..d2c43b619c 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -38,7 +38,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::AvatarData: case PacketType::BulkAvatarData: case PacketType::KillAvatar: - return static_cast(AvatarMixerPacketVersion::AvatarJointDefaultPoseFlags); + return static_cast(AvatarMixerPacketVersion::FBXReaderNodeReparenting); case PacketType::MessagesData: return static_cast(MessageDataVersion::TextOrBinaryData); case PacketType::ICEServerHeartbeat: diff --git a/libraries/physics/src/ObjectActionTractor.cpp b/libraries/physics/src/ObjectActionTractor.cpp index 629d8baefe..ec34023926 100644 --- a/libraries/physics/src/ObjectActionTractor.cpp +++ b/libraries/physics/src/ObjectActionTractor.cpp @@ -128,15 +128,13 @@ bool ObjectActionTractor::prepareForTractorUpdate(btScalar deltaTimeStep) { position /= linearTractorCount; if (_positionalTargetSet) { _lastPositionTarget = _positionalTarget; - } else { - _lastPositionTarget = position; - } - _positionalTarget = position; - if (deltaTimeStep > EPSILON) { - // blend the new velocity with the old (low-pass filter) - glm::vec3 newVelocity = (1.0f / deltaTimeStep) * (position - _lastPositionTarget); - const float blend = 0.25f; - _linearVelocityTarget = (1.0f - blend) * _linearVelocityTarget + blend * newVelocity; + _positionalTarget = position; + if (deltaTimeStep > EPSILON) { + // blend the new velocity with the old (low-pass filter) + glm::vec3 newVelocity = (1.0f / deltaTimeStep) * (_positionalTarget - _lastPositionTarget); + const float blend = 0.25f; + _linearVelocityTarget = (1.0f - blend) * _linearVelocityTarget + blend * newVelocity; + } } _positionalTargetSet = true; _active = true; diff --git a/libraries/plugins/CMakeLists.txt b/libraries/plugins/CMakeLists.txt index 6067c0fbed..1c0d74c45a 100644 --- a/libraries/plugins/CMakeLists.txt +++ b/libraries/plugins/CMakeLists.txt @@ -1,4 +1,4 @@ set(TARGET_NAME plugins) -setup_hifi_library(OpenGL) +setup_hifi_library(Gui) link_hifi_libraries(shared networking) include_hifi_library_headers(gpu) diff --git a/libraries/render-utils/CMakeLists.txt b/libraries/render-utils/CMakeLists.txt index 6be3057c93..57e3572012 100644 --- a/libraries/render-utils/CMakeLists.txt +++ b/libraries/render-utils/CMakeLists.txt @@ -2,7 +2,7 @@ set(TARGET_NAME render-utils) AUTOSCRIBE_SHADER_LIB(gpu graphics render) # pull in the resources.qrc file qt5_add_resources(QT_RESOURCES_FILE "${CMAKE_CURRENT_SOURCE_DIR}/res/fonts/fonts.qrc") -setup_hifi_library(Widgets OpenGL Network Qml Quick Script) +setup_hifi_library(Gui Network Qml Quick Script) link_hifi_libraries(shared ktx gpu graphics model-networking render animation fbx image procedural) include_hifi_library_headers(networking) include_hifi_library_headers(octree) diff --git a/libraries/script-engine/CMakeLists.txt b/libraries/script-engine/CMakeLists.txt index 478e4c4765..31436bbf8b 100644 --- a/libraries/script-engine/CMakeLists.txt +++ b/libraries/script-engine/CMakeLists.txt @@ -1,4 +1,5 @@ set(TARGET_NAME script-engine) +# FIXME Move undo scripting interface to application and remove Widgets setup_hifi_library(Gui Network Script ScriptTools WebSockets Widgets) target_zlib() diff --git a/libraries/shared/CMakeLists.txt b/libraries/shared/CMakeLists.txt index a8fe14e23e..713501aa77 100644 --- a/libraries/shared/CMakeLists.txt +++ b/libraries/shared/CMakeLists.txt @@ -1,7 +1,7 @@ set(TARGET_NAME shared) # TODO: there isn't really a good reason to have Script linked here - let's get what is requiring it out (RegisteredMetaTypes.cpp) -setup_hifi_library(Gui Network Script Widgets) +setup_hifi_library(Gui Network Script) if (WIN32) target_link_libraries(${TARGET_NAME} Wbemuuid.lib) diff --git a/libraries/trackers/src/trackers/EyeTracker.cpp b/libraries/trackers/src/trackers/EyeTracker.cpp index e641abc630..a64b945c55 100644 --- a/libraries/trackers/src/trackers/EyeTracker.cpp +++ b/libraries/trackers/src/trackers/EyeTracker.cpp @@ -9,7 +9,6 @@ #include "EyeTracker.h" #include -#include #include #include diff --git a/libraries/ui-plugins/CMakeLists.txt b/libraries/ui-plugins/CMakeLists.txt index 8da0815082..8f4123c1d4 100644 --- a/libraries/ui-plugins/CMakeLists.txt +++ b/libraries/ui-plugins/CMakeLists.txt @@ -1,4 +1,4 @@ set(TARGET_NAME ui-plugins) -setup_hifi_library(OpenGL) +setup_hifi_library(Gui) link_hifi_libraries(shared plugins ui) include_hifi_library_headers(gpu) \ No newline at end of file diff --git a/libraries/ui/CMakeLists.txt b/libraries/ui/CMakeLists.txt index 2dd23f5134..d16377587c 100644 --- a/libraries/ui/CMakeLists.txt +++ b/libraries/ui/CMakeLists.txt @@ -1,5 +1,5 @@ set(TARGET_NAME ui) -setup_hifi_library(OpenGL Multimedia Network Qml Quick Script WebChannel WebSockets XmlPatterns ${PLATFORM_QT_COMPONENTS}) +setup_hifi_library(Widgets Multimedia Network Qml Quick Script WebChannel WebSockets XmlPatterns ${PLATFORM_QT_COMPONENTS}) link_hifi_libraries(shared networking gl audio audio-client plugins pointers) include_hifi_library_headers(controllers) diff --git a/plugins/hifiCodec/src/HiFiCodec.cpp b/plugins/hifiCodec/src/HiFiCodec.cpp index f78bbae2c1..99bb411539 100644 --- a/plugins/hifiCodec/src/HiFiCodec.cpp +++ b/plugins/hifiCodec/src/HiFiCodec.cpp @@ -9,12 +9,11 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include +#include "HiFiCodec.h" #include #include -#include "HiFiCodec.h" const char* HiFiCodec::NAME { "hifiAC" }; diff --git a/plugins/hifiKinect/CMakeLists.txt b/plugins/hifiKinect/CMakeLists.txt index a7088eb3b4..97f78b0c11 100644 --- a/plugins/hifiKinect/CMakeLists.txt +++ b/plugins/hifiKinect/CMakeLists.txt @@ -10,7 +10,7 @@ if (WIN32) find_package(KINECT) if (KINECT_FOUND) set(TARGET_NAME hifiKinect) - setup_hifi_plugin(Script Qml Widgets) + setup_hifi_plugin(Qml) link_hifi_libraries(shared controllers ui plugins input-plugins display-plugins) # need to setup appropriate externals... diff --git a/plugins/hifiLeapMotion/CMakeLists.txt b/plugins/hifiLeapMotion/CMakeLists.txt index 14f9bbaa17..3075107bb3 100644 --- a/plugins/hifiLeapMotion/CMakeLists.txt +++ b/plugins/hifiLeapMotion/CMakeLists.txt @@ -9,7 +9,7 @@ find_package(LEAPMOTION) if (LEAPMOTION_FOUND) set(TARGET_NAME hifiLeapMotion) - setup_hifi_plugin(Script Qml Widgets) + setup_hifi_plugin(Qml) link_hifi_libraries(shared controllers ui plugins input-plugins) target_leapmotion() endif() diff --git a/plugins/hifiNeuron/CMakeLists.txt b/plugins/hifiNeuron/CMakeLists.txt index a9ed8cca6e..dd78b52240 100644 --- a/plugins/hifiNeuron/CMakeLists.txt +++ b/plugins/hifiNeuron/CMakeLists.txt @@ -9,7 +9,7 @@ if (APPLE OR WIN32) set(TARGET_NAME hifiNeuron) - setup_hifi_plugin(Script Qml Widgets) + setup_hifi_plugin(Qml) link_hifi_libraries(shared controllers ui plugins input-plugins) target_neuron() diff --git a/plugins/hifiSdl2/CMakeLists.txt b/plugins/hifiSdl2/CMakeLists.txt index 7e499e314a..8b2bb114a0 100644 --- a/plugins/hifiSdl2/CMakeLists.txt +++ b/plugins/hifiSdl2/CMakeLists.txt @@ -7,6 +7,6 @@ # set(TARGET_NAME hifiSdl2) -setup_hifi_plugin(Script Qml Widgets) +setup_hifi_plugin(Qml) link_hifi_libraries(shared controllers ui plugins input-plugins script-engine) target_sdl2() diff --git a/plugins/hifiSdl2/src/SDL2Manager.cpp b/plugins/hifiSdl2/src/SDL2Manager.cpp index a5376af24e..664e53d115 100644 --- a/plugins/hifiSdl2/src/SDL2Manager.cpp +++ b/plugins/hifiSdl2/src/SDL2Manager.cpp @@ -9,14 +9,15 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include +#include "SDL2Manager.h" + +#include #include #include #include #include -#include "SDL2Manager.h" static_assert( (int)controller::A == (int)SDL_CONTROLLER_BUTTON_A && diff --git a/plugins/hifiSixense/CMakeLists.txt b/plugins/hifiSixense/CMakeLists.txt index 6e642fce29..e84a4587c4 100644 --- a/plugins/hifiSixense/CMakeLists.txt +++ b/plugins/hifiSixense/CMakeLists.txt @@ -12,7 +12,7 @@ # the msvcr100 runtime support, the plugin will not load. if (NOT ANDROID) set(TARGET_NAME hifiSixense) - setup_hifi_plugin(Script Qml Widgets) + setup_hifi_plugin(Qml) link_hifi_libraries(shared controllers ui plugins ui-plugins input-plugins) target_sixense() if (WIN32) diff --git a/plugins/hifiSpacemouse/CMakeLists.txt b/plugins/hifiSpacemouse/CMakeLists.txt index bcfb309a69..174d0822ec 100644 --- a/plugins/hifiSpacemouse/CMakeLists.txt +++ b/plugins/hifiSpacemouse/CMakeLists.txt @@ -10,7 +10,7 @@ if(WIN32) set(TARGET_NAME hifiSpacemouse) find_package(3DCONNEXIONCLIENT) if (3DCONNEXIONCLIENT_FOUND) - setup_hifi_plugin(Script Qml Widgets) + setup_hifi_plugin(Qml) link_hifi_libraries(shared networking controllers ui plugins input-plugins) target_include_directories(${TARGET_NAME} PUBLIC ${3DCONNEXIONCLIENT_INCLUDE_DIRS}) target_link_libraries(${TARGET_NAME} ${3DCONNEXIONCLIENT_LIBRARIES}) diff --git a/plugins/openvr/CMakeLists.txt b/plugins/openvr/CMakeLists.txt index 3581009284..487a005068 100644 --- a/plugins/openvr/CMakeLists.txt +++ b/plugins/openvr/CMakeLists.txt @@ -10,7 +10,7 @@ if (WIN32 AND (NOT USE_GLES)) # we're using static GLEW, so define GLEW_STATIC add_definitions(-DGLEW_STATIC) set(TARGET_NAME openvr) - setup_hifi_plugin(OpenGL Script Qml Widgets Multimedia) + setup_hifi_plugin(Gui Qml Multimedia) link_hifi_libraries(shared gl networking controllers ui plugins display-plugins ui-plugins input-plugins script-engine audio-client render-utils graphics gpu render model-networking fbx ktx image procedural ${PLATFORM_GL_BACKEND}) diff --git a/plugins/pcmCodec/src/PCMCodecManager.cpp b/plugins/pcmCodec/src/PCMCodecManager.cpp index 7278edaf92..051f3973a8 100644 --- a/plugins/pcmCodec/src/PCMCodecManager.cpp +++ b/plugins/pcmCodec/src/PCMCodecManager.cpp @@ -9,7 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include +#include #include diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 212cf12fda..fe8ddb394d 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -411,7 +411,7 @@ Script.include("/~/system/libraries/controllers.js"); var data = parseJSON(props.userData); if (data !== undefined && data.seat !== undefined) { var avatarUuid = Uuid.fromString(data.seat.user); - if (Uuid.isNull(avatarUuid) || !AvatarList.getAvatar(avatarUuid)) { + if (Uuid.isNull(avatarUuid) || !AvatarList.getAvatar(avatarUuid).sessionUUID) { return TARGET.SEAT; } else { return TARGET.INVALID; diff --git a/tests/gpu-test/CMakeLists.txt b/tests/gpu-test/CMakeLists.txt index 2092279159..7bc1349091 100644 --- a/tests/gpu-test/CMakeLists.txt +++ b/tests/gpu-test/CMakeLists.txt @@ -1,7 +1,7 @@ set(TARGET_NAME gpu-test) AUTOSCRIBE_SHADER_LIB(gpu graphics render-utils) # This is not a testcase -- just set it up as a regular hifi project -setup_hifi_project(Quick Gui OpenGL Script Widgets) +setup_hifi_project(Quick Gui Script) setup_memory_debugger() set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Tests/manual-tests/") link_hifi_libraries( diff --git a/tests/render-perf/CMakeLists.txt b/tests/render-perf/CMakeLists.txt index 5314f7a45b..d377b7616d 100644 --- a/tests/render-perf/CMakeLists.txt +++ b/tests/render-perf/CMakeLists.txt @@ -8,7 +8,7 @@ endif() setup_memory_debugger() # This is not a testcase -- just set it up as a regular hifi project -setup_hifi_project(Quick Gui OpenGL) +setup_hifi_project(Quick Gui) set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Tests/manual-tests/") # link in the shared libraries diff --git a/tests/render-texture-load/CMakeLists.txt b/tests/render-texture-load/CMakeLists.txt index dbfb7d33db..2ed905a3ef 100644 --- a/tests/render-texture-load/CMakeLists.txt +++ b/tests/render-texture-load/CMakeLists.txt @@ -8,7 +8,7 @@ endif() setup_memory_debugger() # This is not a testcase -- just set it up as a regular hifi project -setup_hifi_project(Quick Gui OpenGL) +setup_hifi_project(Quick Gui) set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Tests/manual-tests/") # link in the shared libraries diff --git a/tests/render-utils/CMakeLists.txt b/tests/render-utils/CMakeLists.txt index e3b1523a96..be75c53f2e 100644 --- a/tests/render-utils/CMakeLists.txt +++ b/tests/render-utils/CMakeLists.txt @@ -2,7 +2,7 @@ set(TARGET_NAME render-utils-test) # This is not a testcase -- just set it up as a regular hifi project -setup_hifi_project(Quick Gui OpenGL) +setup_hifi_project(Quick Gui) set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Tests/manual-tests/") setup_memory_debugger() diff --git a/tests/shaders/CMakeLists.txt b/tests/shaders/CMakeLists.txt index 76d2aa100c..44394db6a0 100644 --- a/tests/shaders/CMakeLists.txt +++ b/tests/shaders/CMakeLists.txt @@ -2,7 +2,7 @@ set(TARGET_NAME shaders-test) # This is not a testcase -- just set it up as a regular hifi project -setup_hifi_project(Quick Gui OpenGL) +setup_hifi_project(Quick Gui) set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Tests/manual-tests/") setup_memory_debugger() diff --git a/tools/ac-client/CMakeLists.txt b/tools/ac-client/CMakeLists.txt index 24eeadba9c..ad16187dcb 100644 --- a/tools/ac-client/CMakeLists.txt +++ b/tools/ac-client/CMakeLists.txt @@ -1,4 +1,4 @@ set(TARGET_NAME ac-client) -setup_hifi_project(Core Widgets) +setup_hifi_project(Core) setup_memory_debugger() link_hifi_libraries(shared networking) diff --git a/tools/ac-client/src/ACClientApp.h b/tools/ac-client/src/ACClientApp.h index e295b17654..d43e78eaeb 100644 --- a/tools/ac-client/src/ACClientApp.h +++ b/tools/ac-client/src/ACClientApp.h @@ -13,7 +13,7 @@ #ifndef hifi_ACClientApp_h #define hifi_ACClientApp_h -#include +#include #include #include #include diff --git a/tools/atp-client/CMakeLists.txt b/tools/atp-client/CMakeLists.txt index 4cee30bcc3..19c70597f7 100644 --- a/tools/atp-client/CMakeLists.txt +++ b/tools/atp-client/CMakeLists.txt @@ -1,4 +1,4 @@ set(TARGET_NAME atp-client) -setup_hifi_project(Core Widgets) +setup_hifi_project(Core) setup_memory_debugger() link_hifi_libraries(shared networking) diff --git a/tools/atp-client/src/ATPClientApp.h b/tools/atp-client/src/ATPClientApp.h index 42760ceca9..7ab4ec4a7a 100644 --- a/tools/atp-client/src/ATPClientApp.h +++ b/tools/atp-client/src/ATPClientApp.h @@ -13,7 +13,7 @@ #ifndef hifi_ATPClientApp_h #define hifi_ATPClientApp_h -#include +#include #include #include #include diff --git a/tools/ice-client/CMakeLists.txt b/tools/ice-client/CMakeLists.txt index ae42d79f7e..64ec6b131d 100644 --- a/tools/ice-client/CMakeLists.txt +++ b/tools/ice-client/CMakeLists.txt @@ -1,4 +1,4 @@ set(TARGET_NAME ice-client) -setup_hifi_project(Core Widgets) +setup_hifi_project(Core) setup_memory_debugger() link_hifi_libraries(shared networking) diff --git a/tools/ice-client/src/ICEClientApp.h b/tools/ice-client/src/ICEClientApp.h index de6b6abb14..642b9bc36b 100644 --- a/tools/ice-client/src/ICEClientApp.h +++ b/tools/ice-client/src/ICEClientApp.h @@ -13,7 +13,7 @@ #ifndef hifi_ICEClientApp_h #define hifi_ICEClientApp_h -#include +#include #include #include #include diff --git a/tools/skeleton-dump/CMakeLists.txt b/tools/skeleton-dump/CMakeLists.txt index 1c30e322d6..d0a6475c59 100644 --- a/tools/skeleton-dump/CMakeLists.txt +++ b/tools/skeleton-dump/CMakeLists.txt @@ -1,5 +1,5 @@ set(TARGET_NAME skeleton-dump) -setup_hifi_project(Core Widgets) +setup_hifi_project(Core) setup_memory_debugger() link_hifi_libraries(shared fbx graphics gpu gl animation) diff --git a/tools/skeleton-dump/src/SkeletonDumpApp.h b/tools/skeleton-dump/src/SkeletonDumpApp.h index 40df98eb65..272f7563fa 100644 --- a/tools/skeleton-dump/src/SkeletonDumpApp.h +++ b/tools/skeleton-dump/src/SkeletonDumpApp.h @@ -12,7 +12,7 @@ #ifndef hifi_SkeletonDumpApp_h #define hifi_SkeletonDumpApp_h -#include +#include class SkeletonDumpApp : public QCoreApplication { Q_OBJECT diff --git a/tools/vhacd-util/CMakeLists.txt b/tools/vhacd-util/CMakeLists.txt index 599561bd2d..5ba8b7d971 100644 --- a/tools/vhacd-util/CMakeLists.txt +++ b/tools/vhacd-util/CMakeLists.txt @@ -1,5 +1,5 @@ set(TARGET_NAME vhacd-util) -setup_hifi_project(Core Widgets) +setup_hifi_project(Core) link_hifi_libraries(shared fbx graphics gpu gl) add_dependency_external_projects(vhacd) diff --git a/tools/vhacd-util/src/VHACDUtilApp.h b/tools/vhacd-util/src/VHACDUtilApp.h index ebb8164634..0d75275802 100644 --- a/tools/vhacd-util/src/VHACDUtilApp.h +++ b/tools/vhacd-util/src/VHACDUtilApp.h @@ -13,7 +13,7 @@ #ifndef hifi_VHACDUtilApp_h #define hifi_VHACDUtilApp_h -#include +#include #include