From de8153bd750fd447b5541638a61fc634f5d54d8f Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 28 Mar 2016 12:23:23 -0700 Subject: [PATCH 01/66] on windows and osx use default scripts bundled with interface --- libraries/script-engine/src/ScriptEngines.cpp | 6 +++--- libraries/script-engine/src/ScriptsModel.cpp | 2 +- libraries/shared/src/PathUtils.cpp | 11 +++++++++++ libraries/shared/src/PathUtils.h | 2 ++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngines.cpp b/libraries/script-engine/src/ScriptEngines.cpp index f95209d880..f005368dc4 100644 --- a/libraries/script-engine/src/ScriptEngines.cpp +++ b/libraries/script-engine/src/ScriptEngines.cpp @@ -13,13 +13,14 @@ #include #include +#include #include "ScriptEngine.h" #include "ScriptEngineLogging.h" #define __STR2__(x) #x #define __STR1__(x) __STR2__(x) -#define __LOC__ __FILE__ "("__STR1__(__LINE__)") : Warning Msg: " +#define __LOC__ __FILE__ "(" __STR1__(__LINE__) ") : Warning Msg: " #ifndef __APPLE__ static const QString DESKTOP_LOCATION = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); @@ -213,10 +214,9 @@ QVariantList ScriptEngines::getRunning() { static const QString SETTINGS_KEY = "Settings"; -static const QString DEFAULT_SCRIPTS_JS_URL = "http://s3.amazonaws.com/hifi-public/scripts/defaultScripts.js"; void ScriptEngines::loadDefaultScripts() { - loadScript(DEFAULT_SCRIPTS_JS_URL); + loadScript(defaultScriptsFileName()); } void ScriptEngines::loadOneScript(const QString& scriptFilename) { diff --git a/libraries/script-engine/src/ScriptsModel.cpp b/libraries/script-engine/src/ScriptsModel.cpp index 37b2551f39..8b01c9fbed 100644 --- a/libraries/script-engine/src/ScriptsModel.cpp +++ b/libraries/script-engine/src/ScriptsModel.cpp @@ -21,7 +21,7 @@ #include "ScriptEngineLogging.h" #define __STR2__(x) #x #define __STR1__(x) __STR2__(x) -#define __LOC__ __FILE__ "("__STR1__(__LINE__)") : Warning Msg: " +#define __LOC__ __FILE__ "(" __STR1__(__LINE__) ") : Warning Msg: " static const QString S3_URL = "http://s3.amazonaws.com/hifi-public"; diff --git a/libraries/shared/src/PathUtils.cpp b/libraries/shared/src/PathUtils.cpp index 79e83e9b40..94af26db6c 100644 --- a/libraries/shared/src/PathUtils.cpp +++ b/libraries/shared/src/PathUtils.cpp @@ -53,3 +53,14 @@ QString findMostRecentFileExtension(const QString& originalFileName, QVector possibleExtensions); QString findMostRecentFileExtension(const QString& originalFileName, QVector possibleExtensions); +QString defaultScriptsFileName(); + #endif // hifi_PathUtils_h From b273d5efd329cf2a898930eedf9680927748d260 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 28 Mar 2016 13:48:19 -0700 Subject: [PATCH 02/66] fix defaultScripts filename --- libraries/shared/src/PathUtils.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/shared/src/PathUtils.cpp b/libraries/shared/src/PathUtils.cpp index 94af26db6c..bdaf467ce9 100644 --- a/libraries/shared/src/PathUtils.cpp +++ b/libraries/shared/src/PathUtils.cpp @@ -56,9 +56,9 @@ QString findMostRecentFileExtension(const QString& originalFileName, QVector Date: Mon, 28 Mar 2016 16:04:45 -0700 Subject: [PATCH 03/66] make self-reverb depend on wetDryMix --- libraries/audio-client/src/AudioClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 7e01196dc7..ce2b30d261 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -550,7 +550,7 @@ void AudioClient::configureReverb() { p.wetDryMix = 100.0f; p.preDelay = 0.0f; p.earlyGain = -96.0f; // disable ER - p.lateGain -= 12.0f; // quieter than listener reverb + p.lateGain += _reverbOptions->getWetDryMix() * (24.0f/100.0f) - 24.0f; // -0dB to -24dB, based on wetDryMix p.lateMixLeft = 0.0f; p.lateMixRight = 0.0f; From b88770228e0b91ec14fd6e12805a8297a7f94fc3 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 29 Mar 2016 10:40:56 -0700 Subject: [PATCH 04/66] convert running-scripts window to use local script files --- interface/src/Application.cpp | 1 - libraries/script-engine/src/ScriptEngines.cpp | 2 +- libraries/script-engine/src/ScriptsModel.cpp | 23 +++++++++---------- libraries/script-engine/src/ScriptsModel.h | 6 ++--- libraries/shared/src/PathUtils.cpp | 8 +++---- libraries/shared/src/PathUtils.h | 2 +- 6 files changed, 20 insertions(+), 22 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c6669303a8..901963e343 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -224,7 +224,6 @@ static const QString DESKTOP_LOCATION = QStandardPaths::writableLocation(QStanda static const QString DESKTOP_LOCATION = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation).append("/script.js"); #endif -const QString DEFAULT_SCRIPTS_JS_URL = "http://s3.amazonaws.com/hifi-public/scripts/defaultScripts.js"; Setting::Handle maxOctreePacketsPerSecond("maxOctreePPS", DEFAULT_MAX_OCTREE_PPS); const QHash Application::_acceptedExtensions { diff --git a/libraries/script-engine/src/ScriptEngines.cpp b/libraries/script-engine/src/ScriptEngines.cpp index f005368dc4..2c3f7308fa 100644 --- a/libraries/script-engine/src/ScriptEngines.cpp +++ b/libraries/script-engine/src/ScriptEngines.cpp @@ -216,7 +216,7 @@ QVariantList ScriptEngines::getRunning() { static const QString SETTINGS_KEY = "Settings"; void ScriptEngines::loadDefaultScripts() { - loadScript(defaultScriptsFileName()); + loadScript(defaultScriptsLocation() + "/defaultScripts.js"); } void ScriptEngines::loadOneScript(const QString& scriptFilename) { diff --git a/libraries/script-engine/src/ScriptsModel.cpp b/libraries/script-engine/src/ScriptsModel.cpp index 8b01c9fbed..70f0f7fa68 100644 --- a/libraries/script-engine/src/ScriptsModel.cpp +++ b/libraries/script-engine/src/ScriptsModel.cpp @@ -15,6 +15,7 @@ #include #include +#include #include "ScriptEngine.h" #include "ScriptEngines.h" @@ -23,11 +24,7 @@ #define __STR1__(x) __STR2__(x) #define __LOC__ __FILE__ "(" __STR1__(__LINE__) ") : Warning Msg: " - -static const QString S3_URL = "http://s3.amazonaws.com/hifi-public"; -static const QString PUBLIC_URL = "http://public.highfidelity.io"; static const QString MODELS_LOCATION = "scripts/"; - static const QString PREFIX_PARAMETER_NAME = "prefix"; static const QString MARKER_PARAMETER_NAME = "marker"; static const QString IS_TRUNCATED_NAME = "IsTruncated"; @@ -63,7 +60,7 @@ ScriptsModel::ScriptsModel(QObject* parent) : connect(&_fsWatcher, &QFileSystemWatcher::directoryChanged, this, &ScriptsModel::reloadLocalFiles); reloadLocalFiles(); - reloadRemoteFiles(); + reloadDefaultFiles(); } ScriptsModel::~ScriptsModel() { @@ -140,24 +137,24 @@ void ScriptsModel::updateScriptsLocation(const QString& newPath) { reloadLocalFiles(); } -void ScriptsModel::reloadRemoteFiles() { +void ScriptsModel::reloadDefaultFiles() { if (!_loadingScripts) { _loadingScripts = true; for (int i = _treeNodes.size() - 1; i >= 0; i--) { TreeNodeBase* node = _treeNodes.at(i); if (node->getType() == TREE_NODE_TYPE_SCRIPT && - static_cast(node)->getOrigin() == SCRIPT_ORIGIN_REMOTE) + static_cast(node)->getOrigin() == SCRIPT_ORIGIN_DEFAULT) { delete node; _treeNodes.removeAt(i); } } - requestRemoteFiles(); + requestDefaultFiles(); } } -void ScriptsModel::requestRemoteFiles(QString marker) { - QUrl url(S3_URL); +void ScriptsModel::requestDefaultFiles(QString marker) { + QUrl url(defaultScriptsLocation()); QUrlQuery query; query.addQueryItem(PREFIX_PARAMETER_NAME, MODELS_LOCATION); if (!marker.isEmpty()) { @@ -218,7 +215,9 @@ bool ScriptsModel::parseXML(QByteArray xmlFile) { xml.readNext(); lastKey = xml.text().toString(); if (jsRegex.exactMatch(xml.text().toString())) { - _treeNodes.append(new TreeNodeScript(lastKey.mid(MODELS_LOCATION.length()), S3_URL + "/" + lastKey, SCRIPT_ORIGIN_REMOTE)); + _treeNodes.append(new TreeNodeScript(lastKey.mid(MODELS_LOCATION.length()), + defaultScriptsLocation() + "/" + lastKey, + SCRIPT_ORIGIN_DEFAULT)); } } xml.readNext(); @@ -236,7 +235,7 @@ bool ScriptsModel::parseXML(QByteArray xmlFile) { } if (truncated) { - requestRemoteFiles(lastKey); + requestDefaultFiles(lastKey); } // If this request was not truncated, we are done. diff --git a/libraries/script-engine/src/ScriptsModel.h b/libraries/script-engine/src/ScriptsModel.h index df9716d43b..e1902f4b23 100644 --- a/libraries/script-engine/src/ScriptsModel.h +++ b/libraries/script-engine/src/ScriptsModel.h @@ -21,7 +21,7 @@ class TreeNodeFolder; enum ScriptOrigin { SCRIPT_ORIGIN_LOCAL, - SCRIPT_ORIGIN_REMOTE + SCRIPT_ORIGIN_DEFAULT }; enum TreeNodeType { @@ -84,10 +84,10 @@ protected slots: void updateScriptsLocation(const QString& newPath); void downloadFinished(); void reloadLocalFiles(); - void reloadRemoteFiles(); + void reloadDefaultFiles(); protected: - void requestRemoteFiles(QString marker = QString()); + void requestDefaultFiles(QString marker = QString()); bool parseXML(QByteArray xmlFile); void rebuildTree(); diff --git a/libraries/shared/src/PathUtils.cpp b/libraries/shared/src/PathUtils.cpp index bdaf467ce9..ebaae27eb1 100644 --- a/libraries/shared/src/PathUtils.cpp +++ b/libraries/shared/src/PathUtils.cpp @@ -54,13 +54,13 @@ QString findMostRecentFileExtension(const QString& originalFileName, QVector possibleExtensions); QString findMostRecentFileExtension(const QString& originalFileName, QVector possibleExtensions); -QString defaultScriptsFileName(); +QString defaultScriptsLocation(); #endif // hifi_PathUtils_h From 3aa1090cedf4ef95a4451963eba792da61085713 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 29 Mar 2016 11:58:21 -0700 Subject: [PATCH 05/66] working toward allowing local files in running-scripts window --- libraries/script-engine/src/ScriptsModel.cpp | 41 +++++++++++++------- libraries/shared/src/PathUtils.cpp | 8 ++-- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/libraries/script-engine/src/ScriptsModel.cpp b/libraries/script-engine/src/ScriptsModel.cpp index 70f0f7fa68..192a1f84e5 100644 --- a/libraries/script-engine/src/ScriptsModel.cpp +++ b/libraries/script-engine/src/ScriptsModel.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -155,18 +156,29 @@ void ScriptsModel::reloadDefaultFiles() { void ScriptsModel::requestDefaultFiles(QString marker) { QUrl url(defaultScriptsLocation()); - QUrlQuery query; - query.addQueryItem(PREFIX_PARAMETER_NAME, MODELS_LOCATION); - if (!marker.isEmpty()) { - query.addQueryItem(MARKER_PARAMETER_NAME, marker); - } - url.setQuery(query); - QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkRequest request(url); - request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); - QNetworkReply* reply = networkAccessManager.get(request); - connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); + if (url.isLocalFile()) { + // QDirIterator it(url.toLocalFile(), QStringList() << "*.js", QDir::Files, QDirIterator::Subdirectories); + // while (it.hasNext()) { + // QString jsFile = it.next();; + // _treeNodes.append(new TreeNodeScript(lastKey.mid(MODELS_LOCATION.length()), + // defaultScriptsLocation() + "/" + jsFile, + // SCRIPT_ORIGIN_DEFAULT)); + // } + } else { + QUrlQuery query; + query.addQueryItem(PREFIX_PARAMETER_NAME, MODELS_LOCATION); + if (!marker.isEmpty()) { + query.addQueryItem(MARKER_PARAMETER_NAME, marker); + } + url.setQuery(query); + + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkRequest request(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(request); + connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); + } } void ScriptsModel::downloadFinished() { @@ -179,8 +191,10 @@ void ScriptsModel::downloadFinished() { if (!data.isEmpty()) { finished = parseXML(data); } else { - qCDebug(scriptengine) << "Error: Received no data when loading remote scripts"; + qCDebug(scriptengine) << "Error: Received no data when loading default scripts"; } + } else { + qDebug() << "error is" << reply->error(); } reply->deleteLater(); @@ -214,6 +228,7 @@ bool ScriptsModel::parseXML(QByteArray xmlFile) { if (xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == KEY_NAME) { xml.readNext(); lastKey = xml.text().toString(); + qDebug() << "lastKey = " << lastKey; if (jsRegex.exactMatch(xml.text().toString())) { _treeNodes.append(new TreeNodeScript(lastKey.mid(MODELS_LOCATION.length()), defaultScriptsLocation() + "/" + lastKey, @@ -230,7 +245,7 @@ bool ScriptsModel::parseXML(QByteArray xmlFile) { // Error handling if (xml.hasError()) { - qCDebug(scriptengine) << "Error loading remote scripts: " << xml.errorString(); + qCDebug(scriptengine) << "Error loading default scripts: " << xml.errorString(); return true; } diff --git a/libraries/shared/src/PathUtils.cpp b/libraries/shared/src/PathUtils.cpp index ebaae27eb1..46eb61ea72 100644 --- a/libraries/shared/src/PathUtils.cpp +++ b/libraries/shared/src/PathUtils.cpp @@ -56,11 +56,11 @@ QString findMostRecentFileExtension(const QString& originalFileName, QVector Date: Tue, 29 Mar 2016 13:39:35 -0700 Subject: [PATCH 06/66] works on windows now --- libraries/script-engine/src/ScriptEngines.cpp | 2 +- libraries/script-engine/src/ScriptsModel.cpp | 14 +++++++------- libraries/shared/src/PathUtils.cpp | 7 +++---- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngines.cpp b/libraries/script-engine/src/ScriptEngines.cpp index 2c3f7308fa..339953cdb4 100644 --- a/libraries/script-engine/src/ScriptEngines.cpp +++ b/libraries/script-engine/src/ScriptEngines.cpp @@ -216,7 +216,7 @@ QVariantList ScriptEngines::getRunning() { static const QString SETTINGS_KEY = "Settings"; void ScriptEngines::loadDefaultScripts() { - loadScript(defaultScriptsLocation() + "/defaultScripts.js"); + loadScript(defaultScriptsLocation() + "/scripts/defaultScripts.js"); } void ScriptEngines::loadOneScript(const QString& scriptFilename) { diff --git a/libraries/script-engine/src/ScriptsModel.cpp b/libraries/script-engine/src/ScriptsModel.cpp index 192a1f84e5..a94ccc9771 100644 --- a/libraries/script-engine/src/ScriptsModel.cpp +++ b/libraries/script-engine/src/ScriptsModel.cpp @@ -158,13 +158,13 @@ void ScriptsModel::requestDefaultFiles(QString marker) { QUrl url(defaultScriptsLocation()); if (url.isLocalFile()) { - // QDirIterator it(url.toLocalFile(), QStringList() << "*.js", QDir::Files, QDirIterator::Subdirectories); - // while (it.hasNext()) { - // QString jsFile = it.next();; - // _treeNodes.append(new TreeNodeScript(lastKey.mid(MODELS_LOCATION.length()), - // defaultScriptsLocation() + "/" + jsFile, - // SCRIPT_ORIGIN_DEFAULT)); - // } + QString localDir = url.toLocalFile() + "/scripts"; + QDirIterator it(localDir, QStringList() << "*.js", QDir::Files, QDirIterator::Subdirectories); + while (it.hasNext()) { + QString jsFullPath = it.next(); + QString jsPartialPath = jsFullPath.mid(localDir.length() + 1); // + 1 to skip a separator + _treeNodes.append(new TreeNodeScript(jsPartialPath, jsFullPath, SCRIPT_ORIGIN_DEFAULT)); + } } else { QUrlQuery query; query.addQueryItem(PREFIX_PARAMETER_NAME, MODELS_LOCATION); diff --git a/libraries/shared/src/PathUtils.cpp b/libraries/shared/src/PathUtils.cpp index 46eb61ea72..4b4a9efa9e 100644 --- a/libraries/shared/src/PathUtils.cpp +++ b/libraries/shared/src/PathUtils.cpp @@ -56,11 +56,10 @@ QString findMostRecentFileExtension(const QString& originalFileName, QVector Date: Tue, 29 Mar 2016 13:45:09 -0700 Subject: [PATCH 07/66] cleanups --- libraries/script-engine/src/ScriptsModel.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/script-engine/src/ScriptsModel.cpp b/libraries/script-engine/src/ScriptsModel.cpp index a94ccc9771..c851f08172 100644 --- a/libraries/script-engine/src/ScriptsModel.cpp +++ b/libraries/script-engine/src/ScriptsModel.cpp @@ -194,7 +194,7 @@ void ScriptsModel::downloadFinished() { qCDebug(scriptengine) << "Error: Received no data when loading default scripts"; } } else { - qDebug() << "error is" << reply->error(); + qDebug() << "Error: when loading default scripts --" << reply->error(); } reply->deleteLater(); @@ -228,7 +228,6 @@ bool ScriptsModel::parseXML(QByteArray xmlFile) { if (xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == KEY_NAME) { xml.readNext(); lastKey = xml.text().toString(); - qDebug() << "lastKey = " << lastKey; if (jsRegex.exactMatch(xml.text().toString())) { _treeNodes.append(new TreeNodeScript(lastKey.mid(MODELS_LOCATION.length()), defaultScriptsLocation() + "/" + lastKey, From 9d8e01f2a597388779d3771947e21ec848805ae4 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 29 Mar 2016 15:01:23 -0700 Subject: [PATCH 08/66] lock entity-tree before moving entity-children of avatars --- interface/src/avatar/MyAvatar.cpp | 50 ++++++++++++++++--------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 38babc4ef0..69b23388b1 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -373,32 +373,34 @@ void MyAvatar::simulate(float deltaTime) { EntityTreeRenderer* entityTreeRenderer = qApp->getEntities(); EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr; if (entityTree) { - auto now = usecTimestampNow(); - EntityEditPacketSender* packetSender = qApp->getEntityEditPacketSender(); - MovingEntitiesOperator moveOperator(entityTree); - forEachDescendant([&](SpatiallyNestablePointer object) { - // if the queryBox has changed, tell the entity-server - if (object->computePuffedQueryAACube() && object->getNestableType() == NestableType::Entity) { - EntityItemPointer entity = std::static_pointer_cast(object); - bool success; - AACube newCube = entity->getQueryAACube(success); - if (success) { - moveOperator.addEntityToMoveList(entity, newCube); - } - if (packetSender) { - EntityItemProperties properties = entity->getProperties(); - properties.setQueryAACubeDirty(); - properties.setLastEdited(now); - packetSender->queueEditEntityMessage(PacketType::EntityEdit, entity->getID(), properties); - entity->setLastBroadcast(usecTimestampNow()); - } + entityTree->withWriteLock([&] { + auto now = usecTimestampNow(); + EntityEditPacketSender* packetSender = qApp->getEntityEditPacketSender(); + MovingEntitiesOperator moveOperator(entityTree); + forEachDescendant([&](SpatiallyNestablePointer object) { + // if the queryBox has changed, tell the entity-server + if (object->computePuffedQueryAACube() && object->getNestableType() == NestableType::Entity) { + EntityItemPointer entity = std::static_pointer_cast(object); + bool success; + AACube newCube = entity->getQueryAACube(success); + if (success) { + moveOperator.addEntityToMoveList(entity, newCube); + } + if (packetSender) { + EntityItemProperties properties = entity->getProperties(); + properties.setQueryAACubeDirty(); + properties.setLastEdited(now); + packetSender->queueEditEntityMessage(PacketType::EntityEdit, entity->getID(), properties); + entity->setLastBroadcast(usecTimestampNow()); + } + } + }); + // also update the position of children in our local octree + if (moveOperator.hasMovingEntities()) { + PerformanceTimer perfTimer("recurseTreeWithOperator"); + entityTree->recurseTreeWithOperator(&moveOperator); } }); - // also update the position of children in our local octree - if (moveOperator.hasMovingEntities()) { - PerformanceTimer perfTimer("recurseTreeWithOperator"); - entityTree->recurseTreeWithOperator(&moveOperator); - } } } From 2ad02941e4fbfb3234760981366b73d2ca3afd5d Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 29 Mar 2016 15:38:11 -0700 Subject: [PATCH 09/66] lowercase filenames/paths before they go into _treeNodes to avoid scripts being unstoppable --- libraries/script-engine/src/ScriptsModel.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptsModel.cpp b/libraries/script-engine/src/ScriptsModel.cpp index c851f08172..5a4f1734d8 100644 --- a/libraries/script-engine/src/ScriptsModel.cpp +++ b/libraries/script-engine/src/ScriptsModel.cpp @@ -163,6 +163,10 @@ void ScriptsModel::requestDefaultFiles(QString marker) { while (it.hasNext()) { QString jsFullPath = it.next(); QString jsPartialPath = jsFullPath.mid(localDir.length() + 1); // + 1 to skip a separator + #if defined(Q_OS_WIN) || defined(Q_OS_OSX) + jsFullPath = jsFullPath.toLower(); + jsPartialPath = jsPartialPath.toLower(); + #endif _treeNodes.append(new TreeNodeScript(jsPartialPath, jsFullPath, SCRIPT_ORIGIN_DEFAULT)); } } else { @@ -274,7 +278,13 @@ void ScriptsModel::reloadLocalFiles() { const QFileInfoList localFiles = _localDirectory.entryInfoList(); for (int i = 0; i < localFiles.size(); i++) { QFileInfo file = localFiles[i]; - _treeNodes.append(new TreeNodeScript(file.fileName(), file.absoluteFilePath(), SCRIPT_ORIGIN_LOCAL)); + QString fileName = file.fileName(); + QString absPath = file.absoluteFilePath(); + #if defined(Q_OS_WIN) || defined(Q_OS_OSX) + fileName = fileName.toLower(); + absPath = absPath.toLower(); + #endif + _treeNodes.append(new TreeNodeScript(fileName, absPath, SCRIPT_ORIGIN_LOCAL)); } rebuildTree(); endResetModel(); From 537c6fa3c6e4bd680ad3c79310b511c21a96bafa Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 29 Mar 2016 15:39:42 -0700 Subject: [PATCH 10/66] fix indentation --- interface/src/avatar/MyAvatar.cpp | 32 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 69b23388b1..6aa6f57e07 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -378,23 +378,23 @@ void MyAvatar::simulate(float deltaTime) { EntityEditPacketSender* packetSender = qApp->getEntityEditPacketSender(); MovingEntitiesOperator moveOperator(entityTree); forEachDescendant([&](SpatiallyNestablePointer object) { - // if the queryBox has changed, tell the entity-server - if (object->computePuffedQueryAACube() && object->getNestableType() == NestableType::Entity) { - EntityItemPointer entity = std::static_pointer_cast(object); - bool success; - AACube newCube = entity->getQueryAACube(success); - if (success) { - moveOperator.addEntityToMoveList(entity, newCube); - } - if (packetSender) { - EntityItemProperties properties = entity->getProperties(); - properties.setQueryAACubeDirty(); - properties.setLastEdited(now); - packetSender->queueEditEntityMessage(PacketType::EntityEdit, entity->getID(), properties); - entity->setLastBroadcast(usecTimestampNow()); - } + // if the queryBox has changed, tell the entity-server + if (object->computePuffedQueryAACube() && object->getNestableType() == NestableType::Entity) { + EntityItemPointer entity = std::static_pointer_cast(object); + bool success; + AACube newCube = entity->getQueryAACube(success); + if (success) { + moveOperator.addEntityToMoveList(entity, newCube); } - }); + if (packetSender) { + EntityItemProperties properties = entity->getProperties(); + properties.setQueryAACubeDirty(); + properties.setLastEdited(now); + packetSender->queueEditEntityMessage(PacketType::EntityEdit, entity->getID(), properties); + entity->setLastBroadcast(usecTimestampNow()); + } + } + }); // also update the position of children in our local octree if (moveOperator.hasMovingEntities()) { PerformanceTimer perfTimer("recurseTreeWithOperator"); From be27eaff24f42781b518e9e05bdb3a0ef586bcaa Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 29 Mar 2016 17:51:24 -0700 Subject: [PATCH 11/66] Moving the scripts for render that where in utilities/tools/render to utilities/render, adding counters for lights --- examples/utilities/{tools => }/render/BG.qml | 0 .../configSlider}/ConfigSlider.qml | 0 examples/utilities/render/configSlider/qmldir | 1 + examples/utilities/render/culling.qml | 114 ++++++++++++++++++ .../utilities/{tools => }/render/debug.js | 0 .../utilities/{tools => }/render/debugBG.js | 0 .../{tools => }/render/debugFramebuffer.js | 0 examples/utilities/render/debugRender.js | 21 ++++ .../{tools => }/render/framebuffer.qml | 0 .../utilities/{tools => }/render/main.qml | 1 + .../{tools => }/render/plotperf/PlotPerf.qml | 2 +- .../{tools => }/render/plotperf/qmldir | 0 .../{tools => }/render/renderStats.js | 0 .../utilities/{tools => }/render/stats.qml | 15 ++- .../utilities/tools/debugRenderCulling.js | 99 --------------- .../src/DeferredLightingEffect.cpp | 2 + .../render-utils/src/RenderDeferredTask.h | 3 +- libraries/render-utils/src/spot_light.slf | 3 + libraries/render/src/render/DrawSceneOctree.h | 28 +++-- libraries/render/src/render/DrawTask.cpp | 15 ++- libraries/render/src/render/DrawTask.h | 26 +++- 21 files changed, 211 insertions(+), 119 deletions(-) rename examples/utilities/{tools => }/render/BG.qml (100%) rename examples/utilities/{tools/render => render/configSlider}/ConfigSlider.qml (100%) create mode 100644 examples/utilities/render/configSlider/qmldir create mode 100644 examples/utilities/render/culling.qml rename examples/utilities/{tools => }/render/debug.js (100%) rename examples/utilities/{tools => }/render/debugBG.js (100%) rename examples/utilities/{tools => }/render/debugFramebuffer.js (100%) create mode 100644 examples/utilities/render/debugRender.js rename examples/utilities/{tools => }/render/framebuffer.qml (100%) rename examples/utilities/{tools => }/render/main.qml (99%) rename examples/utilities/{tools => }/render/plotperf/PlotPerf.qml (99%) rename examples/utilities/{tools => }/render/plotperf/qmldir (100%) rename examples/utilities/{tools => }/render/renderStats.js (100%) rename examples/utilities/{tools => }/render/stats.qml (85%) delete mode 100644 examples/utilities/tools/debugRenderCulling.js diff --git a/examples/utilities/tools/render/BG.qml b/examples/utilities/render/BG.qml similarity index 100% rename from examples/utilities/tools/render/BG.qml rename to examples/utilities/render/BG.qml diff --git a/examples/utilities/tools/render/ConfigSlider.qml b/examples/utilities/render/configSlider/ConfigSlider.qml similarity index 100% rename from examples/utilities/tools/render/ConfigSlider.qml rename to examples/utilities/render/configSlider/ConfigSlider.qml diff --git a/examples/utilities/render/configSlider/qmldir b/examples/utilities/render/configSlider/qmldir new file mode 100644 index 0000000000..6680ec9638 --- /dev/null +++ b/examples/utilities/render/configSlider/qmldir @@ -0,0 +1 @@ +ConfigSlider 1.0 ConfigSlider.qml \ No newline at end of file diff --git a/examples/utilities/render/culling.qml b/examples/utilities/render/culling.qml new file mode 100644 index 0000000000..e3f5e67bbe --- /dev/null +++ b/examples/utilities/render/culling.qml @@ -0,0 +1,114 @@ +// +// culling.qml +// examples/utilities/render +// +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html +// +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import "configSlider" + +Column { + id: root + spacing: 8 + property var sceneOctree: Render.getConfig("DrawSceneOctree"); + property var itemSelection: Render.getConfig("DrawItemSelection"); + + Component.onCompleted: { + sceneOctree.enabled = true; + itemSelection.enabled = true; + sceneOctree.showVisibleCells = false; + sceneOctree.showEmptyCells = false; + itemSelection.showInsideItems = false; + itemSelection.showInsideSubcellItems = false; + itemSelection.showPartialItems = false; + itemSelection.showPartialSubcellItems = false; + } + Component.onDestruction: { + sceneOctree.enabled = false; + itemSelection.enabled = false; + Render.getConfig("FetchSceneSelection").freezeFrustum = false; + Render.getConfig("CullSceneSelection").freezeFrustum = false; + } + + GroupBox { + title: "Culling" + Row { + spacing: 8 + Column { + spacing: 8 + + CheckBox { + text: "Freeze Culling Frustum" + checked: false + onCheckedChanged: { + Render.getConfig("FetchSceneSelection").freezeFrustum = checked; + Render.getConfig("CullSceneSelection").freezeFrustum = checked; + } + } + Label { + text: "Octree" + } + CheckBox { + text: "Visible Cells" + checked: root.sceneOctree.showVisibleCells + onCheckedChanged: { root.sceneOctree.showVisibleCells = checked } + } + CheckBox { + text: "Empty Cells" + checked: false + onCheckedChanged: { root.sceneOctree.showEmptyCells = checked } + } + } + Column { + spacing: 8 + + Label { + text: "Frustum Items" + } + CheckBox { + text: "Inside Items" + checked: false + onCheckedChanged: { root.itemSelection.showInsideItems = checked } + } + CheckBox { + text: "Inside Sub-cell Items" + checked: false + onCheckedChanged: { root.itemSelection.showInsideSubcellItems = checked } + } + CheckBox { + text: "Partial Items" + checked: false + onCheckedChanged: { root.itemSelection.showPartialItems = checked } + } + CheckBox { + text: "Partial Sub-cell Items" + checked: false + onCheckedChanged: { root.itemSelection.showPartialSubcellItems = checked } + } + } + } + } + + GroupBox { + title: "Render Items" + + Column{ + Repeater { + model: [ "Opaque:DrawOpaqueDeferred", "Transparent:DrawTransparentDeferred", "Light:DrawLight", + "Opaque Overlays:DrawOverlay3DOpaque", "Transparent Overlays:DrawOverlay3DTransparent" ] + ConfigSlider { + label: qsTr(modelData.split(":")[0]) + integral: true + config: Render.getConfig(modelData.split(":")[1]) + property: "maxDrawn" + max: config.numDrawn + min: -1 + } + } + } + } +} diff --git a/examples/utilities/tools/render/debug.js b/examples/utilities/render/debug.js similarity index 100% rename from examples/utilities/tools/render/debug.js rename to examples/utilities/render/debug.js diff --git a/examples/utilities/tools/render/debugBG.js b/examples/utilities/render/debugBG.js similarity index 100% rename from examples/utilities/tools/render/debugBG.js rename to examples/utilities/render/debugBG.js diff --git a/examples/utilities/tools/render/debugFramebuffer.js b/examples/utilities/render/debugFramebuffer.js similarity index 100% rename from examples/utilities/tools/render/debugFramebuffer.js rename to examples/utilities/render/debugFramebuffer.js diff --git a/examples/utilities/render/debugRender.js b/examples/utilities/render/debugRender.js new file mode 100644 index 0000000000..788c7cb4a0 --- /dev/null +++ b/examples/utilities/render/debugRender.js @@ -0,0 +1,21 @@ +// +// debugRender.js +// examples/utilities/render +// +// Sam Gateau, created on 3/22/2016. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +// Set up the qml ui +var qml = Script.resolvePath('culling.qml'); +var window = new OverlayWindow({ + title: 'Render Draws', + source: qml, + width: 300, + height: 200 +}); +window.setPosition(200, 50); +window.closed.connect(function() { Script.stop(); }); \ No newline at end of file diff --git a/examples/utilities/tools/render/framebuffer.qml b/examples/utilities/render/framebuffer.qml similarity index 100% rename from examples/utilities/tools/render/framebuffer.qml rename to examples/utilities/render/framebuffer.qml diff --git a/examples/utilities/tools/render/main.qml b/examples/utilities/render/main.qml similarity index 99% rename from examples/utilities/tools/render/main.qml rename to examples/utilities/render/main.qml index 22f263b2d0..aecd566207 100644 --- a/examples/utilities/tools/render/main.qml +++ b/examples/utilities/render/main.qml @@ -10,6 +10,7 @@ // import QtQuick 2.5 import QtQuick.Controls 1.4 +import "configSlider" Column { id: root diff --git a/examples/utilities/tools/render/plotperf/PlotPerf.qml b/examples/utilities/render/plotperf/PlotPerf.qml similarity index 99% rename from examples/utilities/tools/render/plotperf/PlotPerf.qml rename to examples/utilities/render/plotperf/PlotPerf.qml index 0e100e4e72..7141ea77d0 100644 --- a/examples/utilities/tools/render/plotperf/PlotPerf.qml +++ b/examples/utilities/render/plotperf/PlotPerf.qml @@ -1,6 +1,6 @@ // // PlotPerf.qml -// examples/utilities/tools/render +// examples/utilities/render/plotperf // // Created by Sam Gateau on 3//2016 // Copyright 2016 High Fidelity, Inc. diff --git a/examples/utilities/tools/render/plotperf/qmldir b/examples/utilities/render/plotperf/qmldir similarity index 100% rename from examples/utilities/tools/render/plotperf/qmldir rename to examples/utilities/render/plotperf/qmldir diff --git a/examples/utilities/tools/render/renderStats.js b/examples/utilities/render/renderStats.js similarity index 100% rename from examples/utilities/tools/render/renderStats.js rename to examples/utilities/render/renderStats.js diff --git a/examples/utilities/tools/render/stats.qml b/examples/utilities/render/stats.qml similarity index 85% rename from examples/utilities/tools/render/stats.qml rename to examples/utilities/render/stats.qml index aacc896444..ae5b433678 100644 --- a/examples/utilities/tools/render/stats.qml +++ b/examples/utilities/render/stats.qml @@ -1,6 +1,6 @@ // // stats.qml -// examples/utilities/tools/render +// examples/utilities/render // // Created by Zach Pomerantz on 2/8/2016 // Copyright 2016 High Fidelity, Inc. @@ -22,7 +22,7 @@ Item { anchors.fill:parent property var config: Render.getConfig("Stats") - + function evalEvenHeight() { // Why do we have to do that manually ? cannot seem to find a qml / anchor / layout mode that does that ? return (height - spacing * (children.length - 1)) / children.length @@ -65,5 +65,16 @@ Item { height: parent.evalEvenHeight() parameters: "1000:K:0:frameTriangleCount-frame-#E2334D:frameTriangleRate-rate-#1AC567-0.001-MT/s" } + + property var deferredTaskConfig: Render.getConfig("RenderDeferredTask") + property var drawLightConfig: deferredTaskConfig.getConfig("DrawLight") + + PlotPerf { + title: "Lights" + config: parent.drawLightConfig + height: parent.evalEvenHeight() + parameters: "1::0:numDrawn-frame-#E2334D" + } } + } diff --git a/examples/utilities/tools/debugRenderCulling.js b/examples/utilities/tools/debugRenderCulling.js deleted file mode 100644 index dbc5f07e0d..0000000000 --- a/examples/utilities/tools/debugRenderCulling.js +++ /dev/null @@ -1,99 +0,0 @@ -// -// debugRenderOctree.js -// examples/utilities/tools -// -// Sam Gateau -// Copyright 2016 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -Script.include("cookies.js"); - -var panel = new Panel(10, 300); -var drawOctree = Render.RenderDeferredTask.DrawSceneOctree; -Render.RenderDeferredTask.DrawSceneOctree.enabled = true; -Render.RenderDeferredTask.DrawItemSelection.enabled = true; - -panel.newCheckbox("Show Octree Cells", - function(value) { Render.RenderDeferredTask.DrawSceneOctree.showVisibleCells = value; }, - function() { return (Render.RenderDeferredTask.DrawSceneOctree.showVisibleCells); }, - function(value) { return (value); } -); -panel.newCheckbox("Show Empty Cells", - function(value) { Render.RenderDeferredTask.DrawSceneOctree.showEmptyCells = value; }, - function() { return (Render.RenderDeferredTask.DrawSceneOctree.showEmptyCells); }, - function(value) { return (value); } -); -panel.newCheckbox("Freeze Frustum", - function(value) { Render.RenderDeferredTask.FetchSceneSelection.freezeFrustum = value; Render.RenderDeferredTask.CullSceneSelection.freezeFrustum = value; }, - function() { return (Render.RenderDeferredTask.FetchSceneSelection.freezeFrustum); }, - function(value) { return (value); } -); -panel.newCheckbox("Show Inside Items", - function(value) { Render.RenderDeferredTask.DrawItemSelection.showInsideItems = value; }, - function() { return (Render.RenderDeferredTask.DrawItemSelection.showInsideItems); }, - function(value) { return (value); } -); - -panel.newCheckbox("Show Inside Subcell Items", - function(value) { Render.RenderDeferredTask.DrawItemSelection.showInsideSubcellItems = value; }, - function() { return (Render.RenderDeferredTask.DrawItemSelection.showInsideSubcellItems); }, - function(value) { return (value); } -); - -panel.newCheckbox("Show Partial Items", - function(value) { Render.RenderDeferredTask.DrawItemSelection.showPartialItems = value; }, - function() { return (Render.RenderDeferredTask.DrawItemSelection.showPartialItems); }, - function(value) { return (value); } -); - -panel.newCheckbox("Show Partial Subcell Items", - function(value) { Render.RenderDeferredTask.DrawItemSelection.showPartialSubcellItems = value; }, - function() { return (Render.RenderDeferredTask.DrawItemSelection.showPartialSubcellItems); }, - function(value) { return (value); } -); - -/* -panel.newSlider('Cells Free / Allocated', -1, 1, - function(value) { value; }, // setter - function() { return Render.RenderDeferredTask.DrawSceneOctree.numFreeCells; }, // getter - function(value) { return value; }); - -this.update = function () { - var numFree = Render.RenderDeferredTask.DrawSceneOctree.numFreeCells; - var numAlloc = Render.RenderDeferredTask.DrawSceneOctree.numAllocatedCells; - var title = [ - ' ' + name, - numFree + ' / ' + numAlloc - ].join('\t'); - - widget.editTitle({ text: title }); - slider.setMaxValue(numAlloc); -}; -*/ -function mouseMoveEvent(event) { - panel.mouseMoveEvent(event); -} - -function mousePressEvent(event) { - panel.mousePressEvent(event); -} - -function mouseReleaseEvent(event) { - panel.mouseReleaseEvent(event); -} - -Controller.mouseMoveEvent.connect(mouseMoveEvent); -Controller.mousePressEvent.connect(mousePressEvent); -Controller.mouseReleaseEvent.connect(mouseReleaseEvent); - -function scriptEnding() { - panel.destroy(); - Render.RenderDeferredTask.DrawSceneOctree.enabled = false; - Render.RenderDeferredTask.DrawItemSelection.enabled = false; -} -Script.scriptEnding.connect(scriptEnding); - - diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index f3fa4a43b2..74795e6735 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -437,6 +437,7 @@ void DeferredLightingEffect::render(const render::RenderContextPointer& renderCo // we should be able to draw thre same geometry use DepthClamp but for unknown reason it's s not working... if ((eyeHalfPlaneDistance > -nearRadius) && (glm::distance(eyePoint, glm::vec3(light->getPosition())) < expandedRadius + nearRadius)) { + light->setShowContour(true); coneParam.w = 0.0f; batch._glUniform4fv(_spotLightLocations->coneParam, 1, reinterpret_cast< const float* >(&coneParam)); @@ -452,6 +453,7 @@ void DeferredLightingEffect::render(const render::RenderContextPointer& renderCo batch.setProjectionTransform( projMats[side]); batch.setViewTransform(viewTransforms[side]); } else { + light->setShowContour(false); coneParam.w = 1.0f; batch._glUniform4fv(_spotLightLocations->coneParam, 1, reinterpret_cast< const float* >(&coneParam)); diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index 0125ef79fe..9fb6802992 100755 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -32,9 +32,10 @@ public: class RenderDeferred { public: + using JobModel = render::Job::Model; + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); - using JobModel = render::Job::Model; }; class DrawConfig : public render::Job::Config { diff --git a/libraries/render-utils/src/spot_light.slf b/libraries/render-utils/src/spot_light.slf index 69f8e836aa..1239628ac6 100644 --- a/libraries/render-utils/src/spot_light.slf +++ b/libraries/render-utils/src/spot_light.slf @@ -25,6 +25,7 @@ in vec4 _texCoord0; out vec4 _fragColor; void main(void) { + DeferredTransform deferredTransform = getDeferredTransform(); // Grab the fragment data from the uv @@ -36,6 +37,8 @@ void main(void) { // Kill if in front of the light volume float depth = frag.depthVal; if (depth < gl_FragCoord.z) { + _fragColor = vec4(1.0, 0.0, 0.0, 1.0); + return; discard; } diff --git a/libraries/render/src/render/DrawSceneOctree.h b/libraries/render/src/render/DrawSceneOctree.h index 60fc0bb2c4..530b7accac 100644 --- a/libraries/render/src/render/DrawSceneOctree.h +++ b/libraries/render/src/render/DrawSceneOctree.h @@ -20,17 +20,14 @@ namespace render { class DrawSceneOctreeConfig : public Job::Config { Q_OBJECT Q_PROPERTY(bool enabled MEMBER enabled NOTIFY dirty()) - Q_PROPERTY(bool showVisibleCells MEMBER showVisibleCells WRITE setShowVisibleCells) - Q_PROPERTY(bool showEmptyCells MEMBER showEmptyCells WRITE setShowEmptyCells) + Q_PROPERTY(bool showVisibleCells READ getShowVisibleCells WRITE setShowVisibleCells NOTIFY dirty()) + Q_PROPERTY(bool showEmptyCells READ getShowEmptyCells WRITE setShowEmptyCells NOTIFY dirty()) Q_PROPERTY(int numAllocatedCells READ getNumAllocatedCells) Q_PROPERTY(int numFreeCells READ getNumFreeCells) public: DrawSceneOctreeConfig() : Job::Config(false) {} - - bool showVisibleCells{ true }; - bool showEmptyCells{ false }; int numAllocatedCells{ 0 }; int numFreeCells{ 0 }; @@ -38,6 +35,12 @@ namespace render { int getNumAllocatedCells() const { return numAllocatedCells; } int getNumFreeCells() const { return numFreeCells; } + bool showVisibleCells{ true }; + bool showEmptyCells{ false }; + + bool getShowVisibleCells() { return showVisibleCells; } + bool getShowEmptyCells() { return showEmptyCells; } + public slots: void setShowVisibleCells(bool show) { showVisibleCells = show; emit dirty(); } void setShowEmptyCells(bool show) { showEmptyCells = show; emit dirty(); } @@ -79,10 +82,10 @@ namespace render { class DrawItemSelectionConfig : public Job::Config { Q_OBJECT Q_PROPERTY(bool enabled MEMBER enabled NOTIFY dirty()) - Q_PROPERTY(bool showInsideItems MEMBER showInsideItems WRITE setShowInsideItems) - Q_PROPERTY(bool showInsideSubcellItems MEMBER showInsideSubcellItems WRITE setShowInsideSubcellItems) - Q_PROPERTY(bool showPartialItems MEMBER showPartialItems WRITE setShowPartialItems) - Q_PROPERTY(bool showPartialSubcellItems MEMBER showPartialSubcellItems WRITE setShowPartialSubcellItems) + Q_PROPERTY(bool showInsideItems READ getShowInsideItems WRITE setShowInsideItems NOTIFY dirty()) + Q_PROPERTY(bool showInsideSubcellItems READ getShowInsideSubcellItems WRITE setShowInsideSubcellItems NOTIFY dirty()) + Q_PROPERTY(bool showPartialItems READ getShowPartialItems WRITE setShowPartialItems NOTIFY dirty()) + Q_PROPERTY(bool showPartialSubcellItems READ getShowPartialSubcellItems WRITE setShowPartialSubcellItems NOTIFY dirty()) public: DrawItemSelectionConfig() : Job::Config(false) {} @@ -92,7 +95,12 @@ namespace render { bool showPartialItems{ true }; bool showPartialSubcellItems{ true }; - public slots: + bool getShowInsideItems() const { return showInsideItems; }; + bool getShowInsideSubcellItems() const { return showInsideSubcellItems; }; + bool getShowPartialItems() const { return showPartialItems; }; + bool getShowPartialSubcellItems() const { return showPartialSubcellItems; }; + + public slots: void setShowInsideItems(bool show) { showInsideItems = show; emit dirty(); } void setShowInsideSubcellItems(bool show) { showInsideSubcellItems = show; emit dirty(); } void setShowPartialItems(bool show) { showPartialItems = show; emit dirty(); } diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 733f7d9e9c..08ff97fd17 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -20,12 +20,16 @@ using namespace render; -void render::renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems) { +void render::renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, int maxDrawnItems) { auto& scene = sceneContext->_scene; RenderArgs* args = renderContext->args; - for (const auto& itemDetails : inItems) { - auto& item = scene->getItem(itemDetails.id); + int numItemsToDraw = (int)inItems.size(); + if (maxDrawnItems != -1) { + numItemsToDraw = glm::min(numItemsToDraw, maxDrawnItems); + } + for (auto i = 0; i < numItemsToDraw; ++i) { + auto& item = scene->getItem(inItems[i].id); item.render(args); } } @@ -69,7 +73,10 @@ void DrawLight::run(const SceneContextPointer& sceneContext, const RenderContext // render lights gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; - renderItems(sceneContext, renderContext, inLights); + renderItems(sceneContext, renderContext, inLights, _maxDrawn); args->_batch = nullptr; }); + + auto config = std::static_pointer_cast(renderContext->jobConfig); + config->setNumDrawn((int)inLights.size()); } diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index fc2ab9682f..8a0f951028 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -16,15 +16,37 @@ namespace render { -void renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems); +void renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, int maxDrawnItems = -1); void renderShapes(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, int maxDrawnItems = -1); + + +class DrawLightConfig : public Job::Config { + Q_OBJECT + Q_PROPERTY(int numDrawn READ getNumDrawn NOTIFY numDrawnChanged) + Q_PROPERTY(int maxDrawn MEMBER maxDrawn NOTIFY dirty) +public: + int getNumDrawn() { return numDrawn; } + void setNumDrawn(int num) { numDrawn = num; emit numDrawnChanged(); } + + int maxDrawn{ -1 }; +signals: + void numDrawnChanged(); + void dirty(); + +protected: + int numDrawn{ 0 }; +}; + class DrawLight { public: - using JobModel = Job::ModelI; + using Config = DrawLightConfig; + using JobModel = Job::ModelI; + void configure(const Config& config) { _maxDrawn = config.maxDrawn; } void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inLights); protected: + int _maxDrawn; // initialized by Config }; } From 7c0bb72affad37496a437331133a1a3e42948a14 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 29 Mar 2016 18:32:46 -0700 Subject: [PATCH 12/66] started on making ~ mean the application directory in script paths --- libraries/script-engine/src/ScriptEngines.cpp | 39 +++++++++++++++++-- libraries/script-engine/src/ScriptEngines.h | 3 ++ libraries/script-engine/src/ScriptsModel.cpp | 20 +++------- libraries/shared/src/PathUtils.cpp | 4 +- 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngines.cpp b/libraries/script-engine/src/ScriptEngines.cpp index 339953cdb4..a62deb89bc 100644 --- a/libraries/script-engine/src/ScriptEngines.cpp +++ b/libraries/script-engine/src/ScriptEngines.cpp @@ -43,24 +43,55 @@ ScriptEngines::ScriptEngines() } QString normalizeScriptUrl(const QString& rawScriptUrl) { - if (!rawScriptUrl.startsWith("http:") && !rawScriptUrl.startsWith("https:") && !rawScriptUrl.startsWith("atp:")) { + if (!rawScriptUrl.startsWith("http:") && !rawScriptUrl.startsWith("https:") && !rawScriptUrl.startsWith("atp:")) { #ifdef Q_OS_LINUX if (rawScriptUrl.startsWith("file:")) { return rawScriptUrl; } return QUrl::fromLocalFile(rawScriptUrl).toString(); #else + QString fullNormal; if (rawScriptUrl.startsWith("file:")) { - return rawScriptUrl.toLower(); + fullNormal = rawScriptUrl.toLower(); + } else { + // Force lowercase on file scripts because of drive letter weirdness. + fullNormal = QUrl::fromLocalFile(rawScriptUrl).toString().toLower(); } - // Force lowercase on file scripts because of drive letter weirdness. - return QUrl::fromLocalFile(rawScriptUrl).toString().toLower(); + QString defaultScriptLoc = defaultScriptsLocation(); + if (fullNormal.startsWith(defaultScriptLoc)) { + return "~" + fullNormal.mid(defaultScriptLoc.size()); + } + return fullNormal; #endif } return QUrl(rawScriptUrl).toString(); } +QString expandScriptUrl(const QString& normalizedScriptURL) { + if (normalizedScriptURL.startsWith("http:") || + normalizedScriptURL.startsWith("https:") || + normalizedScriptURL.startsWith("atp:")) { + return QUrl(normalizedScriptURL).toString(); + } + + QUrl url; + if (normalizedScriptURL.startsWith("file:")) { + url = QUrl(normalizedScriptURL); + } else { + url = QUrl::fromLocalFile(normalizedScriptURL); + } + + QString path = url.path(); + QStringList splitPath = path.split("/"); + if (splitPath.size() > 0 && splitPath[0] == "~") { + QString defaultScriptLoc = defaultScriptsLocation(); + url.setPath(defaultScriptLoc + splitPath.mid(1).join("/")); + return url.toString(); + } +} + + QObject* scriptsModel(); void ScriptEngines::registerScriptInitializer(ScriptInitializer initializer) { diff --git a/libraries/script-engine/src/ScriptEngines.h b/libraries/script-engine/src/ScriptEngines.h index df60d6ff63..ab0d17d9f3 100644 --- a/libraries/script-engine/src/ScriptEngines.h +++ b/libraries/script-engine/src/ScriptEngines.h @@ -96,4 +96,7 @@ protected: ScriptsModelFilter _scriptsModelFilter; }; +QString normalizeScriptUrl(const QString& rawScriptUrl); +QString expandScriptUrl(const QString& normalizedScriptURL); + #endif // hifi_ScriptEngine_h diff --git a/libraries/script-engine/src/ScriptsModel.cpp b/libraries/script-engine/src/ScriptsModel.cpp index 5a4f1734d8..5b368095e0 100644 --- a/libraries/script-engine/src/ScriptsModel.cpp +++ b/libraries/script-engine/src/ScriptsModel.cpp @@ -161,12 +161,8 @@ void ScriptsModel::requestDefaultFiles(QString marker) { QString localDir = url.toLocalFile() + "/scripts"; QDirIterator it(localDir, QStringList() << "*.js", QDir::Files, QDirIterator::Subdirectories); while (it.hasNext()) { - QString jsFullPath = it.next(); - QString jsPartialPath = jsFullPath.mid(localDir.length() + 1); // + 1 to skip a separator - #if defined(Q_OS_WIN) || defined(Q_OS_OSX) - jsFullPath = jsFullPath.toLower(); - jsPartialPath = jsPartialPath.toLower(); - #endif + QString jsFullPath = normalizeScriptUrl(it.next()); + QString jsPartialPath = normalizeScriptUrl(jsFullPath.mid(localDir.length() + 1)); // + 1 to skip a separator _treeNodes.append(new TreeNodeScript(jsPartialPath, jsFullPath, SCRIPT_ORIGIN_DEFAULT)); } } else { @@ -231,7 +227,7 @@ bool ScriptsModel::parseXML(QByteArray xmlFile) { while (!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == CONTAINER_NAME)) { if (xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == KEY_NAME) { xml.readNext(); - lastKey = xml.text().toString(); + lastKey = normalizeScriptUrl(xml.text().toString()); if (jsRegex.exactMatch(xml.text().toString())) { _treeNodes.append(new TreeNodeScript(lastKey.mid(MODELS_LOCATION.length()), defaultScriptsLocation() + "/" + lastKey, @@ -278,12 +274,8 @@ void ScriptsModel::reloadLocalFiles() { const QFileInfoList localFiles = _localDirectory.entryInfoList(); for (int i = 0; i < localFiles.size(); i++) { QFileInfo file = localFiles[i]; - QString fileName = file.fileName(); - QString absPath = file.absoluteFilePath(); - #if defined(Q_OS_WIN) || defined(Q_OS_OSX) - fileName = fileName.toLower(); - absPath = absPath.toLower(); - #endif + QString fileName = normalizeScriptUrl(file.fileName()); + QString absPath = normalizeScriptUrl(file.absoluteFilePath()); _treeNodes.append(new TreeNodeScript(fileName, absPath, SCRIPT_ORIGIN_LOCAL)); } rebuildTree(); @@ -310,7 +302,7 @@ void ScriptsModel::rebuildTree() { for (pathIterator = pathList.constBegin(); pathIterator != pathList.constEnd(); ++pathIterator) { hash.append(*pathIterator + "/"); if (!folders.contains(hash)) { - folders[hash] = new TreeNodeFolder(*pathIterator, parent); + folders[hash] = new TreeNodeFolder(normalizeScriptUrl(*pathIterator), parent); } parent = folders[hash]; } diff --git a/libraries/shared/src/PathUtils.cpp b/libraries/shared/src/PathUtils.cpp index 4b4a9efa9e..2e8d4a4e6a 100644 --- a/libraries/shared/src/PathUtils.cpp +++ b/libraries/shared/src/PathUtils.cpp @@ -56,9 +56,9 @@ QString findMostRecentFileExtension(const QString& originalFileName, QVector Date: Wed, 30 Mar 2016 09:32:40 -0700 Subject: [PATCH 13/66] DUmb fix to the flickering issue by overshooting the inside volume of the light and avoid the failing region --- libraries/render-utils/src/DeferredLightingEffect.cpp | 4 ++-- libraries/render-utils/src/spot_light.slf | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 74795e6735..a0b8f0ae84 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -435,9 +435,9 @@ void DeferredLightingEffect::render(const render::RenderContextPointer& renderCo float expandedRadius = light->getMaximumRadius() * (1.0f + SCALE_EXPANSION); // TODO: We shouldn;t have to do that test and use a different volume geometry for when inside the vlight volume, // we should be able to draw thre same geometry use DepthClamp but for unknown reason it's s not working... + const float OVER_CONSERVATIVE_SCALE = 1.1; if ((eyeHalfPlaneDistance > -nearRadius) && - (glm::distance(eyePoint, glm::vec3(light->getPosition())) < expandedRadius + nearRadius)) { - light->setShowContour(true); + (glm::distance(eyePoint, glm::vec3(light->getPosition())) < (expandedRadius * OVER_CONSERVATIVE_SCALE) + nearRadius)) { coneParam.w = 0.0f; batch._glUniform4fv(_spotLightLocations->coneParam, 1, reinterpret_cast< const float* >(&coneParam)); diff --git a/libraries/render-utils/src/spot_light.slf b/libraries/render-utils/src/spot_light.slf index 1239628ac6..8355dcf91b 100644 --- a/libraries/render-utils/src/spot_light.slf +++ b/libraries/render-utils/src/spot_light.slf @@ -37,8 +37,6 @@ void main(void) { // Kill if in front of the light volume float depth = frag.depthVal; if (depth < gl_FragCoord.z) { - _fragColor = vec4(1.0, 0.0, 0.0, 1.0); - return; discard; } From d056c41e251d6586f0f0d54e013d487daee2a025 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Fri, 4 Mar 2016 13:55:24 -0800 Subject: [PATCH 14/66] Update to latest Oculus SDK, add input device support --- cmake/externals/LibOVR/CMakeLists.txt | 23 +- .../src/controllers/StandardControls.h | 3 + .../oculus/src/OculusBaseDisplayPlugin.cpp | 20 +- plugins/oculus/src/OculusBaseDisplayPlugin.h | 1 - .../oculus/src/OculusControllerManager.cpp | 218 ++++++++++++++++++ plugins/oculus/src/OculusControllerManager.h | 82 +++++++ plugins/oculus/src/OculusDisplayPlugin.cpp | 2 +- plugins/oculus/src/OculusHelpers.cpp | 39 +++- plugins/oculus/src/OculusHelpers.h | 4 +- plugins/oculus/src/OculusProvider.cpp | 4 +- 10 files changed, 354 insertions(+), 42 deletions(-) create mode 100644 plugins/oculus/src/OculusControllerManager.cpp create mode 100644 plugins/oculus/src/OculusControllerManager.h diff --git a/cmake/externals/LibOVR/CMakeLists.txt b/cmake/externals/LibOVR/CMakeLists.txt index a98745b404..5b8a689a9a 100644 --- a/cmake/externals/LibOVR/CMakeLists.txt +++ b/cmake/externals/LibOVR/CMakeLists.txt @@ -12,19 +12,16 @@ string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) # 0.5 public # URL http://static.oculus.com/sdk-downloads/ovr_sdk_win_0.5.0.1.zip # URL_MD5 d3fc4c02db9be5ff08af4ef4c97b32f9 -# 0.6 public -# URL http://static.oculus.com/sdk-downloads/0.6.0.1/Public/1435190862/ovr_sdk_win_0.6.0.1.zip -# URL_MD5 4b3ef825f9a1d6d3035c9f6820687da9 -# 0.8 public -# URL http://static.oculus.com/sdk-downloads/0.8.0.0/Public/1445451746/ovr_sdk_win_0.8.0.0.zip -# URL_MD5 54944b03b95149d6010f84eb701b9647 +# 1.3 public +# URL http://hifi-public.s3.amazonaws.com/dependencies/ovr_sdk_win_1.3.0_public.zip +# URL_MD5 4d26faba0c1f35ff80bf674c96ed9259 if (WIN32) ExternalProject_Add( ${EXTERNAL_NAME} - URL http://static.oculus.com/sdk-downloads/0.8.0.0/Public/1445451746/ovr_sdk_win_0.8.0.0.zip - URL_MD5 54944b03b95149d6010f84eb701b9647 + URL http://hifi-public.s3.amazonaws.com/dependencies/ovr_sdk_win_1.3.0_public.zip + URL_MD5 a2dcf695e0f03a70fdd1ed7480585e82 CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" @@ -33,14 +30,16 @@ if (WIN32) ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) - # FIXME need to account for different architectures - set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR}/LibOVR/Include CACHE TYPE INTERNAL) + set(LIBOVR_DIR ${SOURCE_DIR}/OculusSDK/LibOVR) if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") - set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${SOURCE_DIR}/LibOVR/Lib/Windows/x64/Release/VS2013/LibOVR.lib CACHE TYPE INTERNAL) + set(LIBOVR_LIB_DIR ${LIBOVR_DIR}/Lib/Windows/x64/Release/VS2013 CACHE TYPE INTERNAL) else() - set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${SOURCE_DIR}/LibOVR/Lib/Windows/Win32/Release/VS2013/LibOVR.lib CACHE TYPE INTERNAL) + set(LIBOVR_LIB_DIR ${LIBOVR_DIR}/Lib/Windows/Win32/Release/VS2013 CACHE TYPE INTERNAL) endif() + set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${LIBOVR_DIR}/Include CACHE TYPE INTERNAL) + set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${LIBOVR_LIB_DIR}/LibOVR.lib CACHE TYPE INTERNAL) + elseif(APPLE) ExternalProject_Add( diff --git a/libraries/controllers/src/controllers/StandardControls.h b/libraries/controllers/src/controllers/StandardControls.h index 2b0613321e..f101ba6c51 100644 --- a/libraries/controllers/src/controllers/StandardControls.h +++ b/libraries/controllers/src/controllers/StandardControls.h @@ -81,6 +81,9 @@ namespace controller { // Triggers LT, RT, + // Grips (Oculus touch squeeze) + LG, + RG, NUM_STANDARD_AXES, LZ = LT, RZ = RT diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp index e23d8cade6..8f4e8d665d 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp @@ -12,7 +12,7 @@ #include "OculusHelpers.h" void OculusBaseDisplayPlugin::resetSensors() { - ovr_RecenterPose(_session); + ovr_RecenterTrackingOrigin(_session); } void OculusBaseDisplayPlugin::updateHeadPose(uint32_t frameIndex) { @@ -42,36 +42,30 @@ bool OculusBaseDisplayPlugin::internalActivate() { _hmdDesc = ovr_GetHmdDesc(_session); - _ipd = ovr_GetFloat(_session, OVR_KEY_IPD, _ipd); - glm::uvec2 eyeSizes[2]; _viewScaleDesc.HmdSpaceToWorldScaleInMeters = 1.0f; + _ipd = 0; ovr_for_each_eye([&](ovrEyeType eye) { _eyeFovs[eye] = _hmdDesc.DefaultEyeFov[eye]; ovrEyeRenderDesc& erd = _eyeRenderDescs[eye] = ovr_GetRenderDesc(_session, eye, _eyeFovs[eye]); ovrMatrix4f ovrPerspectiveProjection = - ovrMatrix4f_Projection(erd.Fov, DEFAULT_NEAR_CLIP, DEFAULT_FAR_CLIP, ovrProjection_RightHanded); + ovrMatrix4f_Projection(erd.Fov, DEFAULT_NEAR_CLIP, DEFAULT_FAR_CLIP, ovrProjection_ClipRangeOpenGL); _eyeProjections[eye] = toGlm(ovrPerspectiveProjection); - _eyeOffsets[eye] = glm::translate(mat4(), toGlm(erd.HmdToEyeViewOffset)); + _eyeOffsets[eye] = glm::translate(mat4(), toGlm(erd.HmdToEyeOffset)); eyeSizes[eye] = toGlm(ovr_GetFovTextureSize(_session, eye, erd.Fov, 1.0f)); - _viewScaleDesc.HmdToEyeViewOffset[eye] = erd.HmdToEyeViewOffset; + _viewScaleDesc.HmdToEyeOffset[eye] = erd.HmdToEyeOffset; + _ipd += glm::abs(glm::length(toGlm(erd.HmdToEyeOffset))); }); auto combinedFov = _eyeFovs[0]; combinedFov.LeftTan = combinedFov.RightTan = std::max(combinedFov.LeftTan, combinedFov.RightTan); - _cullingProjection = toGlm(ovrMatrix4f_Projection(combinedFov, DEFAULT_NEAR_CLIP, DEFAULT_FAR_CLIP, ovrProjection_RightHanded)); + _cullingProjection = toGlm(ovrMatrix4f_Projection(combinedFov, DEFAULT_NEAR_CLIP, DEFAULT_FAR_CLIP, ovrProjection_ClipRangeOpenGL)); _renderTargetSize = uvec2( eyeSizes[0].x + eyeSizes[1].x, std::max(eyeSizes[0].y, eyeSizes[1].y)); - if (!OVR_SUCCESS(ovr_ConfigureTracking(_session, - ovrTrackingCap_Orientation | ovrTrackingCap_Position | ovrTrackingCap_MagYawCorrection, 0))) { - logWarning("Failed to attach to sensor device"); - } - - // Parent class relies on our _session intialization, so it must come after that. memset(&_sceneLayer, 0, sizeof(ovrLayerEyeFov)); _sceneLayer.Header.Type = ovrLayerType_EyeFov; _sceneLayer.Header.Flags = ovrLayerFlag_TextureOriginAtBottomLeft; diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h index d21b0561bc..b5ec0769e0 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.h +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h @@ -30,7 +30,6 @@ protected: protected: ovrSession _session; ovrGraphicsLuid _luid; - float _ipd{ OVR_DEFAULT_IPD }; ovrEyeRenderDesc _eyeRenderDescs[2]; ovrFovPort _eyeFovs[2]; ovrHmdDesc _hmdDesc; diff --git a/plugins/oculus/src/OculusControllerManager.cpp b/plugins/oculus/src/OculusControllerManager.cpp new file mode 100644 index 0000000000..0761dc1655 --- /dev/null +++ b/plugins/oculus/src/OculusControllerManager.cpp @@ -0,0 +1,218 @@ +// +// OculusControllerManager.cpp +// input-plugins/src/input-plugins +// +// Created by Bradley Austin Davis 2016/03/04. +// Copyright 2013-2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "OculusControllerManager.h" + +#include + +#include +#include +#include + +#include +#include + +#include "OculusHelpers.h" + +Q_DECLARE_LOGGING_CATEGORY(oculus) + + +static const QString MENU_PARENT = "Avatar"; +static const QString MENU_NAME = "Oculus Touch Controllers"; +static const QString MENU_PATH = MENU_PARENT + ">" + MENU_NAME; + +const QString OculusControllerManager::NAME = "Oculus"; + +bool OculusControllerManager::isSupported() const { + return oculusAvailable(); +} + +void OculusControllerManager::activate() { + InputPlugin::activate(); + if (!_session) { + _session = acquireOculusSession(); + } + Q_ASSERT(_session); + + // register with UserInputMapper + auto userInputMapper = DependencyManager::get(); + if (_remote) { + userInputMapper->registerDevice(_remote); + } + if (_touch) { + userInputMapper->registerDevice(_touch); + } +} + +void OculusControllerManager::deactivate() { + InputPlugin::deactivate(); + + if (_session) { + releaseOculusSession(); + _session = nullptr; + } + + // unregister with UserInputMapper + auto userInputMapper = DependencyManager::get(); + if (_touch) { + userInputMapper->removeDevice(_touch->getDeviceID()); + } + if (_remote) { + userInputMapper->removeDevice(_remote->getDeviceID()); + } +} + +void OculusControllerManager::pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) { + PerformanceTimer perfTimer("OculusControllerManager::TouchDevice::update"); + + if (!OVR_SUCCESS(ovr_GetInputState(_session, ovrControllerType_Touch, &_inputState))) { + qCWarning(oculus) << "Unable to read oculus input state"; + return; + } + + if (_touch) { + _touch->update(deltaTime, inputCalibrationData, jointsCaptured); + } + if (_remote) { + _remote->update(deltaTime, inputCalibrationData, jointsCaptured); + } +} + +void OculusControllerManager::pluginFocusOutEvent() { + if (_touch) { + _touch->focusOutEvent(); + } + if (_remote) { + _remote->focusOutEvent(); + } +} + +using namespace controller; + +static const std::vector> BUTTON_MAP { { + { ovrButton_X, X }, + { ovrButton_Y, Y }, + { ovrButton_A, A }, + { ovrButton_B, B }, + { ovrButton_LThumb, LS }, + { ovrButton_RThumb, RS }, + { ovrButton_LShoulder, LB }, + { ovrButton_RShoulder, RB }, +} }; + +static const std::vector> TOUCH_MAP { { + { ovrTouch_X, LEFT_SECONDARY_THUMB_TOUCH }, + { ovrTouch_Y, LEFT_SECONDARY_THUMB_TOUCH }, + { ovrTouch_A, RIGHT_SECONDARY_THUMB_TOUCH }, + { ovrTouch_B, RIGHT_SECONDARY_THUMB_TOUCH }, + { ovrTouch_LIndexTrigger, LEFT_PRIMARY_INDEX_TOUCH }, + { ovrTouch_RIndexTrigger, RIGHT_PRIMARY_INDEX_TOUCH }, + { ovrTouch_LThumb, LS_TOUCH }, + { ovrTouch_RThumb, RS_TOUCH }, + { ovrTouch_LThumbUp, LEFT_THUMB_UP }, + { ovrTouch_RThumbUp, RIGHT_THUMB_UP }, + { ovrTouch_LIndexPointing, LEFT_INDEX_POINT }, + { ovrTouch_RIndexPointing, RIGHT_INDEX_POINT }, +} }; + +void OculusControllerManager::TouchDevice::update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) { + _poseStateMap.clear(); + _buttonPressedMap.clear(); + + if (!jointsCaptured) { + int numTrackedControllers = 0; + static const auto REQUIRED_HAND_STATUS = ovrStatus_OrientationTracked & ovrStatus_PositionTracked; + auto tracking = ovr_GetTrackingState(_parent._session, 0, false); + ovr_for_each_hand([&](ovrHandType hand) { + ++numTrackedControllers; + if (REQUIRED_HAND_STATUS == (tracking.HandStatusFlags[hand] & REQUIRED_HAND_STATUS)) { + handlePose(deltaTime, inputCalibrationData, hand, tracking.HandPoses[hand]); + } + }); + } + using namespace controller; + // Axes + const auto& inputState = _parent._inputState; + _axisStateMap[LX] = inputState.Thumbstick[ovrHand_Left].x; + _axisStateMap[LY] = inputState.Thumbstick[ovrHand_Left].y; + _axisStateMap[LT] = inputState.IndexTrigger[ovrHand_Left]; + _axisStateMap[LG] = inputState.HandTrigger[ovrHand_Left]; + + _axisStateMap[RX] = inputState.Thumbstick[ovrHand_Right].x; + _axisStateMap[RY] = inputState.Thumbstick[ovrHand_Right].y; + _axisStateMap[RT] = inputState.IndexTrigger[ovrHand_Right]; + _axisStateMap[RG] = inputState.HandTrigger[ovrHand_Right]; + + // Buttons + for (const auto& pair : BUTTON_MAP) { + if (inputState.Buttons & pair.first) { + _buttonPressedMap.insert(pair.second); + } + } + // Touches + for (const auto& pair : TOUCH_MAP) { + if (inputState.Touches & pair.first) { + _buttonPressedMap.insert(pair.second); + } + } +} + +void OculusControllerManager::TouchDevice::focusOutEvent() { + _axisStateMap.clear(); + _buttonPressedMap.clear(); +}; + +void OculusControllerManager::TouchDevice::handlePose(float deltaTime, + const controller::InputCalibrationData& inputCalibrationData, ovrHandType hand, + const ovrPoseStatef& handPose) { + auto poseId = hand == ovrHand_Left ? controller::LEFT_HAND : controller::RIGHT_HAND; + auto& pose = _poseStateMap[poseId]; + pose.translation = toGlm(handPose.ThePose.Position); + pose.rotation = toGlm(handPose.ThePose.Orientation); + pose.angularVelocity = toGlm(handPose.AngularVelocity); + pose.velocity = toGlm(handPose.LinearVelocity); +} + +controller::Input::NamedVector OculusControllerManager::TouchDevice::getAvailableInputs() const { + using namespace controller; + QVector availableInputs{ + // Trackpad analogs + makePair(LX, "LX"), + makePair(LY, "LY"), + makePair(RX, "RX"), + makePair(RY, "RY"), + // trigger analogs + makePair(LT, "LT"), + makePair(RT, "RT"), + + makePair(LB, "LB"), + makePair(RB, "RB"), + + makePair(LS, "LS"), + makePair(RS, "RS"), + makePair(LEFT_HAND, "LeftHand"), + makePair(RIGHT_HAND, "RightHand"), + + makePair(LEFT_PRIMARY_THUMB, "LeftPrimaryThumb"), + makePair(LEFT_SECONDARY_THUMB, "LeftSecondaryThumb"), + makePair(RIGHT_PRIMARY_THUMB, "RightPrimaryThumb"), + makePair(RIGHT_SECONDARY_THUMB, "RightSecondaryThumb"), + }; + return availableInputs; +} + +QString OculusControllerManager::TouchDevice::getDefaultMappingConfig() const { + static const QString MAPPING_JSON = PathUtils::resourcesPath() + "/controllers/touch.json"; + return MAPPING_JSON; +} + + + diff --git a/plugins/oculus/src/OculusControllerManager.h b/plugins/oculus/src/OculusControllerManager.h new file mode 100644 index 0000000000..7a30b19aa4 --- /dev/null +++ b/plugins/oculus/src/OculusControllerManager.h @@ -0,0 +1,82 @@ +// +// Created by Bradley Austin Davis on 2016/03/04 +// Copyright 2013-2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi__OculusControllerManager +#define hifi__OculusControllerManager + +#include +#include + +#include + +#include +#include + +#include + +class OculusControllerManager : public InputPlugin { + Q_OBJECT +public: + // Plugin functions + bool isSupported() const override; + bool isJointController() const override { return true; } + const QString& getName() const override { return NAME; } + + void activate() override; + void deactivate() override; + + void pluginFocusOutEvent() override; + void pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) override; + +private: + class OculusInputDevice : public controller::InputDevice { + public: + OculusInputDevice(OculusControllerManager& parent, const QString& name) : controller::InputDevice(name), _parent(parent) {} + + OculusControllerManager& _parent; + friend class OculusControllerManager; + }; + + // Waiting on touch API + class RemoteDevice : public OculusInputDevice { + public: + using Pointer = std::shared_ptr; + RemoteDevice(OculusControllerManager& parent) : OculusInputDevice(parent, "Oculus Remote") {} + + controller::Input::NamedVector getAvailableInputs() const override; + QString getDefaultMappingConfig() const override; + void update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) override; + void focusOutEvent() override; + + friend class OculusControllerManager; + }; + + class TouchDevice : public OculusInputDevice { + public: + using Pointer = std::shared_ptr; + TouchDevice(OculusControllerManager& parent) : OculusInputDevice(parent, "Oculus Touch") {} + + controller::Input::NamedVector getAvailableInputs() const override; + QString getDefaultMappingConfig() const override; + void update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, bool jointsCaptured) override; + void focusOutEvent() override; + + private: + void handlePose(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, ovrHandType hand, const ovrPoseStatef& handPose); + int _trackedControllers { 0 }; + friend class OculusControllerManager; + }; + + ovrSession _session { nullptr }; + ovrInputState _inputState {}; + RemoteDevice::Pointer _remote; + TouchDevice::Pointer _touch; + static const QString NAME; +}; + +#endif // hifi__OculusControllerManager diff --git a/plugins/oculus/src/OculusDisplayPlugin.cpp b/plugins/oculus/src/OculusDisplayPlugin.cpp index 8c3a676c61..1a5a32ffb2 100644 --- a/plugins/oculus/src/OculusDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusDisplayPlugin.cpp @@ -70,5 +70,5 @@ void OculusDisplayPlugin::hmdPresent() { logWarning("Failed to present"); } } - _sceneFbo->Increment(); + _sceneFbo->Commit(); } diff --git a/plugins/oculus/src/OculusHelpers.cpp b/plugins/oculus/src/OculusHelpers.cpp index 170be05952..d38303919e 100644 --- a/plugins/oculus/src/OculusHelpers.cpp +++ b/plugins/oculus/src/OculusHelpers.cpp @@ -98,9 +98,8 @@ SwapFramebufferWrapper::~SwapFramebufferWrapper() { destroyColor(); } -void SwapFramebufferWrapper::Increment() { - ++color->CurrentIndex; - color->CurrentIndex %= color->TextureCount; +void SwapFramebufferWrapper::Commit() { + ovr_CommitTextureSwapChain(_session, color); } void SwapFramebufferWrapper::Resize(const uvec2 & size) { @@ -114,7 +113,7 @@ void SwapFramebufferWrapper::Resize(const uvec2 & size) { void SwapFramebufferWrapper::destroyColor() { if (color) { - ovr_DestroySwapTextureSet(_session, color); + ovr_DestroyTextureSwapChain(_session, color); color = nullptr; } } @@ -122,13 +121,30 @@ void SwapFramebufferWrapper::destroyColor() { void SwapFramebufferWrapper::initColor() { destroyColor(); - if (!OVR_SUCCESS(ovr_CreateSwapTextureSetGL(_session, GL_SRGB8_ALPHA8, size.x, size.y, &color))) { + ovrTextureSwapChainDesc desc = {}; + desc.Type = ovrTexture_2D; + desc.ArraySize = 1; + desc.Width = size.x; + desc.Height = size.y; + desc.MipLevels = 1; + desc.Format = OVR_FORMAT_R8G8B8A8_UNORM_SRGB; + desc.SampleCount = 1; + desc.StaticImage = ovrFalse; + + ovrResult result = ovr_CreateTextureSwapChainGL(_session, &desc, &color); + if (!OVR_SUCCESS(result)) { logFatal("Failed to create swap textures"); } - for (int i = 0; i < color->TextureCount; ++i) { - ovrGLTexture& ovrTex = (ovrGLTexture&)color->Textures[i]; - glBindTexture(GL_TEXTURE_2D, ovrTex.OGL.TexId); + int length = 0; + result = ovr_GetTextureSwapChainLength(_session, color, &length); + if (!OVR_SUCCESS(result) || !length) { + qFatal("Unable to count swap chain textures"); + } + for (int i = 0; i < length; ++i) { + GLuint chainTexId; + ovr_GetTextureSwapChainBufferGL(_session, color, i, &chainTexId); + glBindTexture(GL_TEXTURE_2D, chainTexId); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); @@ -141,8 +157,11 @@ void SwapFramebufferWrapper::initDone() { } void SwapFramebufferWrapper::onBind(oglplus::Framebuffer::Target target) { - ovrGLTexture& tex = (ovrGLTexture&)(color->Textures[color->CurrentIndex]); - glFramebufferTexture2D(toEnum(target), GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex.OGL.TexId, 0); + int curIndex; + ovr_GetTextureSwapChainCurrentIndex(_session, color, &curIndex); + GLuint curTexId; + ovr_GetTextureSwapChainBufferGL(_session, color, curIndex, &curTexId); + glFramebufferTexture2D(toEnum(target), GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, curTexId, 0); } void SwapFramebufferWrapper::onUnbind(oglplus::Framebuffer::Target target) { diff --git a/plugins/oculus/src/OculusHelpers.h b/plugins/oculus/src/OculusHelpers.h index e10e058ad2..2f13c45466 100644 --- a/plugins/oculus/src/OculusHelpers.h +++ b/plugins/oculus/src/OculusHelpers.h @@ -111,10 +111,10 @@ inline ovrPosef ovrPoseFromGlm(const glm::mat4 & m) { // then submit it and increment to the next texture. // The Oculus SDK manages the creation and destruction of // the textures -struct SwapFramebufferWrapper : public FramebufferWrapper { +struct SwapFramebufferWrapper : public FramebufferWrapper { SwapFramebufferWrapper(const ovrSession& session); ~SwapFramebufferWrapper(); - void Increment(); + void Commit(); void Resize(const uvec2 & size); protected: void initColor() override final; diff --git a/plugins/oculus/src/OculusProvider.cpp b/plugins/oculus/src/OculusProvider.cpp index be708db932..e723fa839a 100644 --- a/plugins/oculus/src/OculusProvider.cpp +++ b/plugins/oculus/src/OculusProvider.cpp @@ -18,6 +18,7 @@ #include "OculusDisplayPlugin.h" #include "OculusDebugDisplayPlugin.h" +#include "OculusControllerManager.h" class OculusProvider : public QObject, public DisplayProvider, InputProvider { @@ -51,8 +52,6 @@ public: } virtual InputPluginList getInputPlugins() override { - // FIXME pending full oculus input API and hardware -#if 0 static std::once_flag once; std::call_once(once, [&] { InputPluginPointer plugin(new OculusControllerManager()); @@ -60,7 +59,6 @@ public: _inputPlugins.push_back(plugin); } }); -#endif return _inputPlugins; } From bd9813bbf59c48f69a8767d3ad0d72a1830bb1ae Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 28 Mar 2016 12:00:40 -0700 Subject: [PATCH 15/66] Only enable the Oculus plugin in the presence of the 1.x runtime --- plugins/oculus/src/OculusBaseDisplayPlugin.h | 2 +- plugins/oculus/src/OculusControllerManager.h | 1 - plugins/oculus/src/OculusHelpers.cpp | 16 +++++++++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h index b5ec0769e0..41344335f3 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.h +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h @@ -28,7 +28,7 @@ protected: void internalDeactivate() override; protected: - ovrSession _session; + ovrSession _session { nullptr }; ovrGraphicsLuid _luid; ovrEyeRenderDesc _eyeRenderDescs[2]; ovrFovPort _eyeFovs[2]; diff --git a/plugins/oculus/src/OculusControllerManager.h b/plugins/oculus/src/OculusControllerManager.h index 7a30b19aa4..fb126ca2a8 100644 --- a/plugins/oculus/src/OculusControllerManager.h +++ b/plugins/oculus/src/OculusControllerManager.h @@ -42,7 +42,6 @@ private: friend class OculusControllerManager; }; - // Waiting on touch API class RemoteDevice : public OculusInputDevice { public: using Pointer = std::shared_ptr; diff --git a/plugins/oculus/src/OculusHelpers.cpp b/plugins/oculus/src/OculusHelpers.cpp index d38303919e..fdd35a06fe 100644 --- a/plugins/oculus/src/OculusHelpers.cpp +++ b/plugins/oculus/src/OculusHelpers.cpp @@ -9,7 +9,9 @@ #include "OculusHelpers.h" #include + #include +#include using Mutex = std::mutex; using Lock = std::unique_lock; @@ -38,9 +40,21 @@ void logFatal(const char* what) { qFatal(error.c_str()); } +static const QString GOOD_OCULUS_RUNTIME_FILE { "C:\\Program Files(x86)\\Oculus\\Support\\oculus - runtime\\LibOVRRT64_1.dll" }; + bool oculusAvailable() { ovrDetectResult detect = ovr_Detect(0); - return (detect.IsOculusServiceRunning && detect.IsOculusHMDConnected); + if (!detect.IsOculusServiceRunning || !detect.IsOculusHMDConnected) { + return false; + } + + // HACK Explicitly check for the presence of the 1.0 runtime DLL, and fail if it + // doesn't exist + if (!QFile(GOOD_OCULUS_RUNTIME_FILE).exists()) { + return false; + } + + return true; } ovrSession acquireOculusSession() { From 78626f793831bd603e4dbdf400cafcb18a631a92 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 28 Mar 2016 13:00:15 -0700 Subject: [PATCH 16/66] Add warning logging if we can't find a 1.x Oculus dll --- plugins/oculus/src/OculusHelpers.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/oculus/src/OculusHelpers.cpp b/plugins/oculus/src/OculusHelpers.cpp index fdd35a06fe..cfac175392 100644 --- a/plugins/oculus/src/OculusHelpers.cpp +++ b/plugins/oculus/src/OculusHelpers.cpp @@ -51,6 +51,7 @@ bool oculusAvailable() { // HACK Explicitly check for the presence of the 1.0 runtime DLL, and fail if it // doesn't exist if (!QFile(GOOD_OCULUS_RUNTIME_FILE).exists()) { + qCWarning(oculus) << "Oculus Runtime detected, but no 1.x DLL present."; return false; } From 80d397555ddb7388d8a60ea054df58b6eb30047c Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 28 Mar 2016 14:45:09 -0700 Subject: [PATCH 17/66] Fixing input API, DLL path for Oculus --- plugins/oculus/src/OculusControllerManager.cpp | 3 ++- plugins/oculus/src/OculusControllerManager.h | 2 +- plugins/oculus/src/OculusHelpers.cpp | 4 +++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/plugins/oculus/src/OculusControllerManager.cpp b/plugins/oculus/src/OculusControllerManager.cpp index 0761dc1655..f11ec18b10 100644 --- a/plugins/oculus/src/OculusControllerManager.cpp +++ b/plugins/oculus/src/OculusControllerManager.cpp @@ -35,7 +35,7 @@ bool OculusControllerManager::isSupported() const { return oculusAvailable(); } -void OculusControllerManager::activate() { +bool OculusControllerManager::activate() { InputPlugin::activate(); if (!_session) { _session = acquireOculusSession(); @@ -50,6 +50,7 @@ void OculusControllerManager::activate() { if (_touch) { userInputMapper->registerDevice(_touch); } + return true; } void OculusControllerManager::deactivate() { diff --git a/plugins/oculus/src/OculusControllerManager.h b/plugins/oculus/src/OculusControllerManager.h index fb126ca2a8..fc10dcc73d 100644 --- a/plugins/oculus/src/OculusControllerManager.h +++ b/plugins/oculus/src/OculusControllerManager.h @@ -27,7 +27,7 @@ public: bool isJointController() const override { return true; } const QString& getName() const override { return NAME; } - void activate() override; + bool activate() override; void deactivate() override; void pluginFocusOutEvent() override; diff --git a/plugins/oculus/src/OculusHelpers.cpp b/plugins/oculus/src/OculusHelpers.cpp index cfac175392..fb49d1d001 100644 --- a/plugins/oculus/src/OculusHelpers.cpp +++ b/plugins/oculus/src/OculusHelpers.cpp @@ -12,6 +12,7 @@ #include #include +#include using Mutex = std::mutex; using Lock = std::unique_lock; @@ -40,7 +41,8 @@ void logFatal(const char* what) { qFatal(error.c_str()); } -static const QString GOOD_OCULUS_RUNTIME_FILE { "C:\\Program Files(x86)\\Oculus\\Support\\oculus - runtime\\LibOVRRT64_1.dll" }; +static const QString OCULUS_RUNTIME_PATH { "C:\\Program Files (x86)\\Oculus\\Support\\oculus-runtime" }; +static const QString GOOD_OCULUS_RUNTIME_FILE { OCULUS_RUNTIME_PATH + "\\LibOVRRT64_1.dll" }; bool oculusAvailable() { ovrDetectResult detect = ovr_Detect(0); From 8123617fe1e50e695b28368a2b0beb474768f173 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 29 Mar 2016 09:41:38 -0700 Subject: [PATCH 18/66] Improve failure detection logging --- plugins/oculus/src/OculusHelpers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/oculus/src/OculusHelpers.cpp b/plugins/oculus/src/OculusHelpers.cpp index fb49d1d001..98dfa43fa2 100644 --- a/plugins/oculus/src/OculusHelpers.cpp +++ b/plugins/oculus/src/OculusHelpers.cpp @@ -53,7 +53,7 @@ bool oculusAvailable() { // HACK Explicitly check for the presence of the 1.0 runtime DLL, and fail if it // doesn't exist if (!QFile(GOOD_OCULUS_RUNTIME_FILE).exists()) { - qCWarning(oculus) << "Oculus Runtime detected, but no 1.x DLL present."; + qCWarning(oculus) << "Oculus Runtime detected, but no 1.x DLL present: \"" + GOOD_OCULUS_RUNTIME_FILE + "\""; return false; } From f569cbf70ef40c15699acb31ef374e5b31c25cee Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 30 Mar 2016 09:56:26 -0700 Subject: [PATCH 19/66] Add debugging output, fix timewarp --- interface/src/Application.cpp | 25 +++++++++++------ .../display-plugins/OpenGLDisplayPlugin.cpp | 4 +-- .../src/display-plugins/OpenGLDisplayPlugin.h | 2 +- .../display-plugins/hmd/HmdDisplayPlugin.cpp | 28 ++++++++++++++----- .../display-plugins/hmd/HmdDisplayPlugin.h | 18 +++++++++--- libraries/plugins/src/plugins/DisplayPlugin.h | 4 ++- libraries/shared/src/ThreadSafeValueCache.h | 1 + .../oculus/src/OculusBaseDisplayPlugin.cpp | 15 ++++++---- plugins/oculus/src/OculusBaseDisplayPlugin.h | 3 +- plugins/oculus/src/OculusDisplayPlugin.cpp | 28 ++++++++++++++----- plugins/oculus/src/OculusDisplayPlugin.h | 3 +- plugins/oculus/src/OculusHelpers.cpp | 3 +- .../src/OculusLegacyDisplayPlugin.cpp | 10 +++++-- .../src/OculusLegacyDisplayPlugin.h | 2 +- plugins/openvr/src/OpenVrDisplayPlugin.cpp | 22 +++++++++------ plugins/openvr/src/OpenVrDisplayPlugin.h | 2 +- 16 files changed, 117 insertions(+), 53 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index de9b134b83..895f3fd52f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1490,11 +1490,15 @@ void Application::paintGL() { // FIXME not needed anymore? _offscreenContext->makeCurrent(); - displayPlugin->updateHeadPose(_frameCount); + displayPlugin->beginFrameRender(_frameCount); // update the avatar with a fresh HMD pose getMyAvatar()->updateFromHMDSensorMatrix(getHMDSensorPose()); + // update sensorToWorldMatrix for camera and hand controllers + getMyAvatar()->updateSensorToWorldMatrix(); + + auto lodManager = DependencyManager::get(); @@ -2007,6 +2011,12 @@ void Application::keyPressEvent(QKeyEvent* event) { } break; + case Qt::Key_Y: + if (isShifted && isMeta) { + getActiveDisplayPlugin()->cycleDebugOutput(); + } + break; + case Qt::Key_B: if (isMeta) { auto offscreenUi = DependencyManager::get(); @@ -2572,11 +2582,6 @@ void Application::idle(uint64_t now) { return; // bail early, nothing to do here. } - checkChangeCursor(); - - Stats::getInstance()->updateStats(); - AvatarInputs::getInstance()->update(); - // These tasks need to be done on our first idle, because we don't want the showing of // overlay subwindows to do a showDesktop() until after the first time through static bool firstIdle = true; @@ -2625,6 +2630,11 @@ void Application::idle(uint64_t now) { // We're going to execute idle processing, so restart the last idle timer _lastTimeUpdated.start(); + checkChangeCursor(); + + Stats::getInstance()->updateStats(); + AvatarInputs::getInstance()->update(); + { static uint64_t lastIdleStart{ now }; uint64_t idleStartToStartDuration = now - lastIdleStart; @@ -3389,9 +3399,6 @@ void Application::update(float deltaTime) { qApp->updateMyAvatarLookAtPosition(); - // update sensorToWorldMatrix for camera and hand controllers - myAvatar->updateSensorToWorldMatrix(); - { PROFILE_RANGE_EX("MyAvatar", 0xffff00ff, (uint64_t)getActiveDisplayPlugin()->presentCount()); avatarManager->updateMyAvatar(deltaTime); diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 8049e2d5a5..e5d98d18f7 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -552,9 +552,9 @@ float OpenGLDisplayPlugin::presentRate() { { Lock lock(_mutex); result = _usecsPerFrame.getAverage(); - result = 1.0f / result; - result *= USECS_PER_SECOND; } + result = 1.0f / result; + result *= USECS_PER_SECOND; return result; } diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index b9628deb6c..8c4862ee3d 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -17,9 +17,9 @@ #include #include #include +#include #define THREADED_PRESENT 1 -#include class OpenGLDisplayPlugin : public DisplayPlugin { protected: diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index 5be3f0d96a..505fa004ab 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -69,10 +69,11 @@ void HmdDisplayPlugin::compositeOverlay() { // set the alpha Uniform(*_program, _alphaUniform).Set(overlayAlpha); + auto eyePoses = _currentPresentFrameInfo.eyePoses; _sphereSection->Use(); for_each_eye([&](Eye eye) { eyeViewport(eye); - auto modelView = glm::inverse(_currentRenderEyePoses[eye]); // *glm::translate(mat4(), vec3(0, 0, -1)); + auto modelView = glm::inverse(eyePoses[eye]); // *glm::translate(mat4(), vec3(0, 0, -1)); auto mvp = _eyeProjections[eye] * modelView; Uniform(*_program, _mvpUniform).Set(mvp); _sphereSection->Draw(); @@ -95,10 +96,10 @@ void HmdDisplayPlugin::compositePointer() { // Mouse pointer _plane->Use(); // Reconstruct the headpose from the eye poses - auto headPosition = (vec3(_currentRenderEyePoses[Left][3]) + vec3(_currentRenderEyePoses[Right][3])) / 2.0f; + auto headPosition = vec3(_currentPresentFrameInfo.headPose[3]); for_each_eye([&](Eye eye) { eyeViewport(eye); - auto reticleTransform = compositorHelper->getReticleTransform(_currentRenderEyePoses[eye], headPosition); + auto reticleTransform = compositorHelper->getReticleTransform(_currentPresentFrameInfo.eyePoses[eye], headPosition); auto mvp = _eyeProjections[eye] * reticleTransform; Uniform(*_program, _mvpUniform).Set(mvp); _plane->Draw(); @@ -160,15 +161,28 @@ void HmdDisplayPlugin::internalPresent() { void HmdDisplayPlugin::setEyeRenderPose(uint32_t frameIndex, Eye eye, const glm::mat4& pose) { Lock lock(_mutex); - _renderEyePoses[frameIndex][eye] = pose; + FrameInfo& frame = _frameInfos[frameIndex]; + frame.eyePoses[eye] = pose; } void HmdDisplayPlugin::updateFrameData() { + // Check if we have old frame data to discard + { + Lock lock(_mutex); + auto itr = _frameInfos.find(_currentRenderFrameIndex); + if (itr != _frameInfos.end()) { + _frameInfos.erase(itr); + } + } + Parent::updateFrameData(); - Lock lock(_mutex); - _currentRenderEyePoses = _renderEyePoses[_currentRenderFrameIndex]; + + { + Lock lock(_mutex); + _currentPresentFrameInfo = _frameInfos[_currentRenderFrameIndex]; + } } glm::mat4 HmdDisplayPlugin::getHeadPose() const { - return _headPoseCache.get(); + return _currentRenderFrameInfo.get().headPose; } diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index 080a44bc66..899dd6636a 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -28,6 +28,16 @@ public: virtual glm::mat4 getHeadPose() const override; + using EyePoses = std::array; + + struct FrameInfo { + EyePoses eyePoses; + glm::mat4 headPose; + double sensorSampleTime { 0 }; + double predictedDisplayTime { 0 }; + }; + + protected: virtual void hmdPresent() = 0; virtual bool isHmdMounted() const = 0; @@ -46,10 +56,10 @@ protected: glm::mat4 _cullingProjection; glm::uvec2 _renderTargetSize; float _ipd { 0.064f }; - using EyePoses = std::array; - QMap _renderEyePoses; - EyePoses _currentRenderEyePoses; - ThreadSafeValueCache _headPoseCache { glm::mat4() }; + + QMap _frameInfos; + FrameInfo _currentPresentFrameInfo; + ThreadSafeValueCache _currentRenderFrameInfo; private: bool _enablePreview { false }; diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index f4f28176c7..77d984f924 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -122,7 +122,7 @@ public: } // will query the underlying hmd api to compute the most recent head pose - virtual void updateHeadPose(uint32_t frameIndex) {} + virtual void beginFrameRender(uint32_t frameIndex) {} // returns a copy of the most recent head pose, computed via updateHeadPose virtual glm::mat4 getHeadPose() const { @@ -142,6 +142,8 @@ public: virtual float presentRate() { return -1.0f; } uint32_t presentCount() const { return _presentedFrameIndex; } + virtual void cycleDebugOutput() {} + static const QString& MENU_PATH(); signals: diff --git a/libraries/shared/src/ThreadSafeValueCache.h b/libraries/shared/src/ThreadSafeValueCache.h index e4e78ca3d7..37a1258aa1 100644 --- a/libraries/shared/src/ThreadSafeValueCache.h +++ b/libraries/shared/src/ThreadSafeValueCache.h @@ -23,6 +23,7 @@ template class ThreadSafeValueCache { public: + ThreadSafeValueCache() {} ThreadSafeValueCache(const T& v) : _value { v } {} // returns atomic copy of the cached value. diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp index 8f4e8d665d..52eb70134d 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp @@ -15,11 +15,16 @@ void OculusBaseDisplayPlugin::resetSensors() { ovr_RecenterTrackingOrigin(_session); } -void OculusBaseDisplayPlugin::updateHeadPose(uint32_t frameIndex) { - auto displayTime = ovr_GetPredictedDisplayTime(_session, frameIndex); - auto trackingState = ovr_GetTrackingState(_session, displayTime, true); - mat4 headPose = toGlm(trackingState.HeadPose.ThePose); - _headPoseCache.set(headPose); +void OculusBaseDisplayPlugin::beginFrameRender(uint32_t frameIndex) { + FrameInfo frame; + frame.sensorSampleTime = ovr_GetTimeInSeconds();; + frame.predictedDisplayTime = ovr_GetPredictedDisplayTime(_session, frameIndex); + auto trackingState = ovr_GetTrackingState(_session, frame.predictedDisplayTime, ovrTrue); + frame.headPose = toGlm(trackingState.HeadPose.ThePose); + + _currentRenderFrameInfo.set(frame); + Lock lock(_mutex); + _frameInfos[frameIndex] = frame; } bool OculusBaseDisplayPlugin::isSupported() const { diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h index 41344335f3..2259a4ca89 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.h +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h @@ -20,7 +20,8 @@ public: // Stereo specific methods virtual void resetSensors() override final; - virtual void updateHeadPose(uint32_t frameIndex) override; + virtual void beginFrameRender(uint32_t frameIndex) override; + protected: void customizeContext() override; diff --git a/plugins/oculus/src/OculusDisplayPlugin.cpp b/plugins/oculus/src/OculusDisplayPlugin.cpp index 1a5a32ffb2..8078e8d6ec 100644 --- a/plugins/oculus/src/OculusDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusDisplayPlugin.cpp @@ -10,6 +10,23 @@ #include "OculusHelpers.h" const QString OculusDisplayPlugin::NAME("Oculus Rift"); +static ovrPerfHudMode currentDebugMode = ovrPerfHud_Off; + +bool OculusDisplayPlugin::internalActivate() { + bool result = Parent::internalActivate(); + currentDebugMode = ovrPerfHud_Off; + if (result && _session) { + ovr_SetInt(_session, OVR_PERF_HUD_MODE, currentDebugMode); + } + return result; +} + +void OculusDisplayPlugin::cycleDebugOutput() { + if (_session) { + currentDebugMode = static_cast((currentDebugMode + 1) % ovrPerfHud_Count); + ovr_SetInt(_session, OVR_PERF_HUD_MODE, currentDebugMode); + } +} void OculusDisplayPlugin::customizeContext() { Parent::customizeContext(); @@ -48,12 +65,6 @@ void blit(const SrcFbo& srcFbo, const DstFbo& dstFbo) { }); } -void OculusDisplayPlugin::updateFrameData() { - Parent::updateFrameData(); - _sceneLayer.RenderPose[ovrEyeType::ovrEye_Left] = ovrPoseFromGlm(_currentRenderEyePoses[Left]); - _sceneLayer.RenderPose[ovrEyeType::ovrEye_Right] = ovrPoseFromGlm(_currentRenderEyePoses[Right]); -} - void OculusDisplayPlugin::hmdPresent() { PROFILE_RANGE_EX(__FUNCTION__, 0xff00ff00, (uint64_t)_currentRenderFrameIndex) @@ -63,12 +74,15 @@ void OculusDisplayPlugin::hmdPresent() { } blit(_compositeFramebuffer, _sceneFbo); + _sceneFbo->Commit(); { + _sceneLayer.SensorSampleTime = _currentPresentFrameInfo.sensorSampleTime; + _sceneLayer.RenderPose[ovrEyeType::ovrEye_Left] = ovrPoseFromGlm(_currentPresentFrameInfo.headPose); + _sceneLayer.RenderPose[ovrEyeType::ovrEye_Right] = ovrPoseFromGlm(_currentPresentFrameInfo.headPose); ovrLayerHeader* layers = &_sceneLayer.Header; ovrResult result = ovr_SubmitFrame(_session, _currentRenderFrameIndex, &_viewScaleDesc, &layers, 1); if (!OVR_SUCCESS(result)) { logWarning("Failed to present"); } } - _sceneFbo->Commit(); } diff --git a/plugins/oculus/src/OculusDisplayPlugin.h b/plugins/oculus/src/OculusDisplayPlugin.h index 9b6b922f69..e7d7791e7f 100644 --- a/plugins/oculus/src/OculusDisplayPlugin.h +++ b/plugins/oculus/src/OculusDisplayPlugin.h @@ -22,12 +22,13 @@ public: float getTargetFrameRate() override { return TARGET_RATE_Oculus; } protected: + bool internalActivate() override; void hmdPresent() override; // FIXME update with Oculus API call once it's available in the SDK bool isHmdMounted() const override { return true; } void customizeContext() override; void uncustomizeContext() override; - void updateFrameData() override; + void cycleDebugOutput() override; private: static const QString NAME; diff --git a/plugins/oculus/src/OculusHelpers.cpp b/plugins/oculus/src/OculusHelpers.cpp index 98dfa43fa2..c9e702ecd0 100644 --- a/plugins/oculus/src/OculusHelpers.cpp +++ b/plugins/oculus/src/OculusHelpers.cpp @@ -116,7 +116,8 @@ SwapFramebufferWrapper::~SwapFramebufferWrapper() { } void SwapFramebufferWrapper::Commit() { - ovr_CommitTextureSwapChain(_session, color); + auto result = ovr_CommitTextureSwapChain(_session, color); + Q_ASSERT(OVR_SUCCESS(result)); } void SwapFramebufferWrapper::Resize(const uvec2 & size) { diff --git a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp index 396f55b932..7b9dcc0b7d 100644 --- a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp +++ b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp @@ -35,10 +35,14 @@ void OculusLegacyDisplayPlugin::resetSensors() { ovrHmd_RecenterPose(_hmd); } -void OculusLegacyDisplayPlugin::updateHeadPose(uint32_t frameIndex) { +void OculusLegacyDisplayPlugin::beginFrameRender(uint32_t frameIndex) { + FrameInfo frame; + frame.predictedDisplayTime = frame.sensorSampleTime = ovr_GetTimeInSeconds(); + _trackingState = ovrHmd_GetTrackingState(_hmd, frame.predictedDisplayTime); + frame.headPose = toGlm(_trackingState.HeadPose.ThePose); + _currentRenderFrameInfo.set(frame); Lock lock(_mutex); - _trackingState = ovrHmd_GetTrackingState(_hmd, ovr_GetTimeInSeconds()); - _headPoseCache.set(toGlm(_trackingState.HeadPose.ThePose)); + _frameInfos[frameIndex] = frame; } bool OculusLegacyDisplayPlugin::isSupported() const { diff --git a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h index 187c0681e9..2710ab1335 100644 --- a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h +++ b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h @@ -26,7 +26,7 @@ public: // Stereo specific methods virtual void resetSensors() override; - virtual void updateHeadPose(uint32_t frameIndex) override; + virtual void beginFrameRender(uint32_t frameIndex) override; virtual float getTargetFrameRate() override; diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index c4d8b252f0..f968ae440e 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -121,22 +121,23 @@ void OpenVrDisplayPlugin::resetSensors() { _sensorResetMat = glm::inverse(cancelOutRollAndPitch(m)); } -void OpenVrDisplayPlugin::updateHeadPose(uint32_t frameIndex) { +void OpenVrDisplayPlugin::beginFrameRender(uint32_t frameIndex) { - float displayFrequency = _system->GetFloatTrackedDeviceProperty(vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_DisplayFrequency_Float); - float frameDuration = 1.f / displayFrequency; - float vsyncToPhotons = _system->GetFloatTrackedDeviceProperty(vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_SecondsFromVsyncToPhotons_Float); + double displayFrequency = _system->GetFloatTrackedDeviceProperty(vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_DisplayFrequency_Float); + double frameDuration = 1.f / displayFrequency; + double vsyncToPhotons = _system->GetFloatTrackedDeviceProperty(vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_SecondsFromVsyncToPhotons_Float); + FrameInfo frame; #if THREADED_PRESENT // 3 frames of prediction + vsyncToPhotons = 44ms total - const float NUM_PREDICTION_FRAMES = 3.0f; - float predictedSecondsFromNow = NUM_PREDICTION_FRAMES * frameDuration + vsyncToPhotons; + const double NUM_PREDICTION_FRAMES = 3.0f; + frame.predictedDisplayTime = NUM_PREDICTION_FRAMES * frameDuration + vsyncToPhotons; #else - float predictedSecondsFromNow = frameDuration + vsyncToPhotons; + frame.predictedDisplayTime = frameDuration + vsyncToPhotons; #endif vr::TrackedDevicePose_t predictedTrackedDevicePose[vr::k_unMaxTrackedDeviceCount]; - _system->GetDeviceToAbsoluteTrackingPose(vr::TrackingUniverseStanding, predictedSecondsFromNow, predictedTrackedDevicePose, vr::k_unMaxTrackedDeviceCount); + _system->GetDeviceToAbsoluteTrackingPose(vr::TrackingUniverseStanding, frame.predictedDisplayTime, predictedTrackedDevicePose, vr::k_unMaxTrackedDeviceCount); // copy and process predictedTrackedDevicePoses for (int i = 0; i < vr::k_unMaxTrackedDeviceCount; i++) { @@ -145,8 +146,11 @@ void OpenVrDisplayPlugin::updateHeadPose(uint32_t frameIndex) { _trackedDeviceLinearVelocities[i] = transformVectorFast(_sensorResetMat, toGlm(_trackedDevicePose[i].vVelocity)); _trackedDeviceAngularVelocities[i] = transformVectorFast(_sensorResetMat, toGlm(_trackedDevicePose[i].vAngularVelocity)); } + frame.headPose = _trackedDevicePoseMat4[0]; + _currentRenderFrameInfo.set(frame); - _headPoseCache.set(_trackedDevicePoseMat4[0]); + Lock lock(_mutex); + _frameInfos[frameIndex] = frame; } void OpenVrDisplayPlugin::hmdPresent() { diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.h b/plugins/openvr/src/OpenVrDisplayPlugin.h index 022af5b06d..0e1e7c5267 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.h +++ b/plugins/openvr/src/OpenVrDisplayPlugin.h @@ -27,7 +27,7 @@ public: // Stereo specific methods virtual void resetSensors() override; - virtual void updateHeadPose(uint32_t frameIndex) override; + virtual void beginFrameRender(uint32_t frameIndex) override; protected: bool internalActivate() override; From 24acf7584a2f336d35d8b8a2316ee8957443d5db Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 30 Mar 2016 11:10:14 -0700 Subject: [PATCH 20/66] don't respond to http other than /status --- ice-server/src/IceServer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index d7fba12f26..2d52f9fc82 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -313,7 +313,10 @@ bool IceServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url, b ? 1 : 0; connection->respond(HTTPConnection::StatusCode200, QByteArray::number(statusNumber)); + + return true; } } - return true; + + return false; } From 0ee1f039e9ba0dd52825e3fd3b2809aba8307cf6 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 30 Mar 2016 11:15:10 -0700 Subject: [PATCH 21/66] Telling like it is... --- libraries/render-utils/src/DeferredLightingEffect.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index a0b8f0ae84..ac24b09c40 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -435,7 +435,7 @@ void DeferredLightingEffect::render(const render::RenderContextPointer& renderCo float expandedRadius = light->getMaximumRadius() * (1.0f + SCALE_EXPANSION); // TODO: We shouldn;t have to do that test and use a different volume geometry for when inside the vlight volume, // we should be able to draw thre same geometry use DepthClamp but for unknown reason it's s not working... - const float OVER_CONSERVATIVE_SCALE = 1.1; + const float OVER_CONSERVATIVE_SCALE = 1.1f; if ((eyeHalfPlaneDistance > -nearRadius) && (glm::distance(eyePoint, glm::vec3(light->getPosition())) < (expandedRadius * OVER_CONSERVATIVE_SCALE) + nearRadius)) { coneParam.w = 0.0f; From 1234514e8fcabacc85d89d8aa85bdddbb6008ff4 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Wed, 30 Mar 2016 11:22:44 -0700 Subject: [PATCH 22/66] Correctly represent light fbo fmt --- libraries/gpu/src/gpu/GLBackendTexture.cpp | 11 ++++++----- libraries/gpu/src/gpu/Texture.cpp | 2 +- libraries/render-utils/src/FramebufferCache.cpp | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/libraries/gpu/src/gpu/GLBackendTexture.cpp b/libraries/gpu/src/gpu/GLBackendTexture.cpp index 09714b5542..3fc7906285 100755 --- a/libraries/gpu/src/gpu/GLBackendTexture.cpp +++ b/libraries/gpu/src/gpu/GLBackendTexture.cpp @@ -225,6 +225,12 @@ public: } break; + case gpu::R11G11B10: + texel.format = GL_RGB; + // the type should be float + texel.internalFormat = GL_R11F_G11F_B10F; + break; + case gpu::DEPTH: texel.format = GL_DEPTH_COMPONENT; // It's depth component to load it texel.internalFormat = GL_DEPTH_COMPONENT; @@ -302,11 +308,6 @@ public: case gpu::SRGBA: texel.internalFormat = GL_SRGB; // standard 2.2 gamma correction color break; - case gpu::R11G11B10: { - // the type should be float - texel.internalFormat = GL_R11F_G11F_B10F; - break; - } default: qCDebug(gpulogging) << "Unknown combination of texel format"; } diff --git a/libraries/gpu/src/gpu/Texture.cpp b/libraries/gpu/src/gpu/Texture.cpp index df93cd76a5..af740ddb65 100755 --- a/libraries/gpu/src/gpu/Texture.cpp +++ b/libraries/gpu/src/gpu/Texture.cpp @@ -285,7 +285,7 @@ Texture::Size Texture::resize(Type type, const Element& texelFormat, uint16 widt } // Here the Texture has been fully defined from the gpu point of view (size and format) - _defined = true; + _defined = true; } else { _stamp++; } diff --git a/libraries/render-utils/src/FramebufferCache.cpp b/libraries/render-utils/src/FramebufferCache.cpp index 7948dfcefe..22bfbfd869 100644 --- a/libraries/render-utils/src/FramebufferCache.cpp +++ b/libraries/render-utils/src/FramebufferCache.cpp @@ -97,7 +97,7 @@ void FramebufferCache::createPrimaryFramebuffer() { // FIXME: Decide on the proper one, let s stick to R11G11B10 for now //_lightingTexture = gpu::TexturePointer(gpu::Texture::create2D(gpu::Element::COLOR_RGBA_32, width, height, defaultSampler)); - _lightingTexture = gpu::TexturePointer(gpu::Texture::create2D(gpu::Element(gpu::VEC3, gpu::NUINT8, gpu::R11G11B10), width, height, defaultSampler)); + _lightingTexture = gpu::TexturePointer(gpu::Texture::create2D(gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::R11G11B10), width, height, defaultSampler)); //_lightingTexture = gpu::TexturePointer(gpu::Texture::create2D(gpu::Element(gpu::VEC4, gpu::HALF, gpu::RGBA), width, height, defaultSampler)); _lightingFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create()); _lightingFramebuffer->setRenderBuffer(0, _lightingTexture); From 1771875186873097789cbabdbd376b6925ae974d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 30 Mar 2016 11:31:46 -0700 Subject: [PATCH 23/66] use one QNetworkAccessManager for the ice-server --- ice-server/src/IceServer.cpp | 9 +++++---- ice-server/src/IceServer.h | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index 2d52f9fc82..ac5952ce43 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -33,7 +33,8 @@ IceServer::IceServer(int argc, char* argv[]) : _id(QUuid::createUuid()), _serverSocket(), _activePeers(), - _httpManager(QHostAddress::AnyIPv4, ICE_SERVER_MONITORING_PORT, QString("%1/web/").arg(QCoreApplication::applicationDirPath()), this) + _httpManager(QHostAddress::AnyIPv4, ICE_SERVER_MONITORING_PORT, QString("%1/web/").arg(QCoreApplication::applicationDirPath()), this), + _networkAccessManager(this) { // start the ice-server socket qDebug() << "ice-server socket is listening on" << ICE_SERVER_DEFAULT_PORT; @@ -201,8 +202,8 @@ bool IceServer::isVerifiedHeartbeat(const QUuid& domainID, const QByteArray& pla void IceServer::requestDomainPublicKey(const QUuid& domainID) { // send a request to the metaverse API for the public key for this domain - QNetworkAccessManager* manager = new QNetworkAccessManager { this }; - connect(manager, &QNetworkAccessManager::finished, this, &IceServer::publicKeyReplyFinished); + + connect(&_networkAccessManager, &QNetworkAccessManager::finished, this, &IceServer::publicKeyReplyFinished); QUrl publicKeyURL { NetworkingConstants::METAVERSE_SERVER_URL }; QString publicKeyPath = QString("/api/v1/domains/%1/public_key").arg(uuidStringWithoutCurlyBraces(domainID)); @@ -213,7 +214,7 @@ void IceServer::requestDomainPublicKey(const QUuid& domainID) { qDebug() << "Requesting public key for domain with ID" << domainID; - manager->get(publicKeyRequest); + _networkAccessManager.get(publicKeyRequest); } void IceServer::publicKeyReplyFinished(QNetworkReply* reply) { diff --git a/ice-server/src/IceServer.h b/ice-server/src/IceServer.h index 6cc33fd8fc..2f9ee9c727 100644 --- a/ice-server/src/IceServer.h +++ b/ice-server/src/IceServer.h @@ -54,6 +54,8 @@ private: HTTPManager _httpManager; + QNetworkAccessManager _networkAccessManager; + using RSAUniquePtr = std::unique_ptr>; using DomainPublicKeyHash = std::unordered_map; DomainPublicKeyHash _domainPublicKeys; From 92e9e6a3fa35879cd7282920d4a7f6f0f89ef70a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 30 Mar 2016 11:35:41 -0700 Subject: [PATCH 24/66] use the NetworkAccessManager to get a single QNetworkAccessManager --- ice-server/src/IceServer.cpp | 10 +++++----- ice-server/src/IceServer.h | 2 -- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index ac5952ce43..7bd8306e9b 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -33,8 +34,7 @@ IceServer::IceServer(int argc, char* argv[]) : _id(QUuid::createUuid()), _serverSocket(), _activePeers(), - _httpManager(QHostAddress::AnyIPv4, ICE_SERVER_MONITORING_PORT, QString("%1/web/").arg(QCoreApplication::applicationDirPath()), this), - _networkAccessManager(this) + _httpManager(QHostAddress::AnyIPv4, ICE_SERVER_MONITORING_PORT, QString("%1/web/").arg(QCoreApplication::applicationDirPath()), this) { // start the ice-server socket qDebug() << "ice-server socket is listening on" << ICE_SERVER_DEFAULT_PORT; @@ -202,8 +202,8 @@ bool IceServer::isVerifiedHeartbeat(const QUuid& domainID, const QByteArray& pla void IceServer::requestDomainPublicKey(const QUuid& domainID) { // send a request to the metaverse API for the public key for this domain - - connect(&_networkAccessManager, &QNetworkAccessManager::finished, this, &IceServer::publicKeyReplyFinished); + auto& networkAccessManager = NetworkAccessManager::getInstance(); + connect(&networkAccessManager, &QNetworkAccessManager::finished, this, &IceServer::publicKeyReplyFinished); QUrl publicKeyURL { NetworkingConstants::METAVERSE_SERVER_URL }; QString publicKeyPath = QString("/api/v1/domains/%1/public_key").arg(uuidStringWithoutCurlyBraces(domainID)); @@ -214,7 +214,7 @@ void IceServer::requestDomainPublicKey(const QUuid& domainID) { qDebug() << "Requesting public key for domain with ID" << domainID; - _networkAccessManager.get(publicKeyRequest); + networkAccessManager.get(publicKeyRequest); } void IceServer::publicKeyReplyFinished(QNetworkReply* reply) { diff --git a/ice-server/src/IceServer.h b/ice-server/src/IceServer.h index 2f9ee9c727..6cc33fd8fc 100644 --- a/ice-server/src/IceServer.h +++ b/ice-server/src/IceServer.h @@ -54,8 +54,6 @@ private: HTTPManager _httpManager; - QNetworkAccessManager _networkAccessManager; - using RSAUniquePtr = std::unique_ptr>; using DomainPublicKeyHash = std::unordered_map; DomainPublicKeyHash _domainPublicKeys; From e5adfc40b2a8f02354a851ea49fad316453fd339 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 30 Mar 2016 11:42:41 -0700 Subject: [PATCH 25/66] use the inactivity timer for ice-server lockup check --- ice-server/src/IceServer.cpp | 8 ++++---- ice-server/src/IceServer.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index 7bd8306e9b..128c2b27b0 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -69,8 +69,6 @@ bool IceServer::packetVersionMatch(const udt::Packet& packet) { void IceServer::processPacket(std::unique_ptr packet) { - _lastPacketTimestamp = QDateTime::currentMSecsSinceEpoch(); - auto nlPacket = NLPacket::fromBase(std::move(packet)); // make sure that this packet at least looks like something we can read @@ -282,6 +280,8 @@ void IceServer::sendPeerInformationPacket(const NetworkPeer& peer, const HifiSoc void IceServer::clearInactivePeers() { NetworkPeerHash::iterator peerItem = _activePeers.begin(); + _lastInactiveCheckTimestamp = QDateTime::currentMSecsSinceEpoch(); + while (peerItem != _activePeers.end()) { SharedNetworkPeer peer = peerItem.value(); @@ -310,8 +310,8 @@ bool IceServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url, b const quint64 MAX_PACKET_GAP_MS_FOR_STUCK_SOCKET = 10 * 1000; - int statusNumber = (QDateTime::currentMSecsSinceEpoch() - _lastPacketTimestamp > MAX_PACKET_GAP_MS_FOR_STUCK_SOCKET) - ? 1 : 0; + auto sinceLastInactiveCheck = QDateTime::currentMSecsSinceEpoch() - _lastInactiveCheckTimestamp; + int statusNumber = (sinceLastInactiveCheck > MAX_PACKET_GAP_MS_FOR_STUCK_SOCKET) ? 1 : 0; connection->respond(HTTPConnection::StatusCode200, QByteArray::number(statusNumber)); diff --git a/ice-server/src/IceServer.h b/ice-server/src/IceServer.h index 6cc33fd8fc..7d1d05324c 100644 --- a/ice-server/src/IceServer.h +++ b/ice-server/src/IceServer.h @@ -58,7 +58,7 @@ private: using DomainPublicKeyHash = std::unordered_map; DomainPublicKeyHash _domainPublicKeys; - quint64 _lastPacketTimestamp; + quint64 _lastInactiveCheckTimestamp; }; #endif // hifi_IceServer_h From 4210bc178e1302275a75fd2a7c8f6814e01facb3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 30 Mar 2016 11:44:55 -0700 Subject: [PATCH 26/66] default the inactive timestamp for healthy startup --- ice-server/src/IceServer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index 128c2b27b0..9d1bb58ddf 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -34,7 +34,8 @@ IceServer::IceServer(int argc, char* argv[]) : _id(QUuid::createUuid()), _serverSocket(), _activePeers(), - _httpManager(QHostAddress::AnyIPv4, ICE_SERVER_MONITORING_PORT, QString("%1/web/").arg(QCoreApplication::applicationDirPath()), this) + _httpManager(QHostAddress::AnyIPv4, ICE_SERVER_MONITORING_PORT, QString("%1/web/").arg(QCoreApplication::applicationDirPath()), this), + _lastInactiveCheckTimestamp(QDateTime::currentMSecsSinceEpoch()) { // start the ice-server socket qDebug() << "ice-server socket is listening on" << ICE_SERVER_DEFAULT_PORT; From 6bdedeb5cec21b600a88eac5d32abe3cf2fc9373 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 30 Mar 2016 11:59:49 -0700 Subject: [PATCH 27/66] change packaging parameters for Sandbox/Interface --- cmake/macros/GenerateInstallers.cmake | 4 ++-- cmake/macros/SetPackagingParameters.cmake | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cmake/macros/GenerateInstallers.cmake b/cmake/macros/GenerateInstallers.cmake index b4744aa172..8d1eca84d7 100644 --- a/cmake/macros/GenerateInstallers.cmake +++ b/cmake/macros/GenerateInstallers.cmake @@ -85,8 +85,8 @@ macro(GENERATE_INSTALLERS) set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE") - cpack_add_component(${CLIENT_COMPONENT} DISPLAY_NAME "High Fidelity Client") - cpack_add_component(${SERVER_COMPONENT} DISPLAY_NAME "High Fidelity Server") + cpack_add_component(${CLIENT_COMPONENT} DISPLAY_NAME "High Fidelity Interface") + cpack_add_component(${SERVER_COMPONENT} DISPLAY_NAME "High Fidelity Sandbox") include(CPack) endmacro() diff --git a/cmake/macros/SetPackagingParameters.cmake b/cmake/macros/SetPackagingParameters.cmake index 92e3273f67..1886ca36ac 100644 --- a/cmake/macros/SetPackagingParameters.cmake +++ b/cmake/macros/SetPackagingParameters.cmake @@ -53,7 +53,7 @@ macro(SET_PACKAGING_PARAMETERS) set(CONSOLE_INSTALL_DIR ${DMG_SUBFOLDER_NAME}) set(INTERFACE_INSTALL_DIR ${DMG_SUBFOLDER_NAME}) - set(CONSOLE_EXEC_NAME "Server Console.app") + set(CONSOLE_EXEC_NAME "Sandbox.app") set(CONSOLE_INSTALL_APP_PATH "${CONSOLE_INSTALL_DIR}/${CONSOLE_EXEC_NAME}") set(CONSOLE_APP_CONTENTS "${CONSOLE_INSTALL_APP_PATH}/Contents") @@ -64,7 +64,7 @@ macro(SET_PACKAGING_PARAMETERS) set(INTERFACE_ICON_FILENAME "${INTERFACE_ICON_PREFIX}.icns") else () if (WIN32) - set(CONSOLE_INSTALL_DIR "server-console") + set(CONSOLE_INSTALL_DIR "sandbox") else () set(CONSOLE_INSTALL_DIR ".") endif () @@ -77,18 +77,18 @@ macro(SET_PACKAGING_PARAMETERS) set(INTERFACE_EXEC_PREFIX "interface") set(INTERFACE_ICON_FILENAME "${INTERFACE_ICON_PREFIX}.ico") - set(CONSOLE_EXEC_NAME "server-console.exe") + set(CONSOLE_EXEC_NAME "sandbox.exe") set(DS_EXEC_NAME "domain-server.exe") set(AC_EXEC_NAME "assignment-client.exe") # shortcut names if (PRODUCTION_BUILD) - set(INTERFACE_SHORTCUT_NAME "High Fidelity") - set(CONSOLE_SHORTCUT_NAME "Server Console") + set(INTERFACE_SHORTCUT_NAME "Interface") + set(CONSOLE_SHORTCUT_NAME "Sandbox") else () - set(INTERFACE_SHORTCUT_NAME "High Fidelity - ${BUILD_VERSION}") - set(CONSOLE_SHORTCUT_NAME "Server Console - ${BUILD_VERSION}") + set(INTERFACE_SHORTCUT_NAME "Interface - ${BUILD_VERSION}") + set(CONSOLE_SHORTCUT_NAME "Sandbox - ${BUILD_VERSION}") endif () # check if we need to find signtool if (PRODUCTION_BUILD OR PR_BUILD) From 724c95fbd6bbd363f23ee6871bc314ea28e989a5 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 30 Mar 2016 12:05:17 -0700 Subject: [PATCH 28/66] leave executable name for server-console --- cmake/macros/SetPackagingParameters.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/macros/SetPackagingParameters.cmake b/cmake/macros/SetPackagingParameters.cmake index 1886ca36ac..cdbddf84e5 100644 --- a/cmake/macros/SetPackagingParameters.cmake +++ b/cmake/macros/SetPackagingParameters.cmake @@ -77,7 +77,7 @@ macro(SET_PACKAGING_PARAMETERS) set(INTERFACE_EXEC_PREFIX "interface") set(INTERFACE_ICON_FILENAME "${INTERFACE_ICON_PREFIX}.ico") - set(CONSOLE_EXEC_NAME "sandbox.exe") + set(CONSOLE_EXEC_NAME "server-console.exe") set(DS_EXEC_NAME "domain-server.exe") set(AC_EXEC_NAME "assignment-client.exe") From 238f9e9298cc6bf7c9c7c2d532f1208752479c17 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 30 Mar 2016 12:07:40 -0700 Subject: [PATCH 29/66] remove the Stack Manager migration section --- server-console/src/splash.html | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/server-console/src/splash.html b/server-console/src/splash.html index 30868ebb6f..b9947bcbaa 100644 --- a/server-console/src/splash.html +++ b/server-console/src/splash.html @@ -23,7 +23,7 @@ High Fidelity is now installed and your Home domain is ready for you to explore.

-You can make your home yours by uploading your own models and scripts, and adding items from the Market. +You can make your home yours by uploading your own models and scripts.

@@ -67,12 +67,6 @@ You can make your home yours by uploading your own models and scripts, and addin -
-

-

Your existing Stack Manager content is safe.

- Server Console comes with demo content but does not overwrite your data. See our guide to importing content previously managed with Stack Manager. -

-