From cde36dc70d0b1c791cdbf89690c6a1b6149ded30 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 26 Jun 2014 16:06:28 -0700 Subject: [PATCH 01/50] Add user locations --- interface/src/UserLocationsModel.cpp | 229 +++++++++++++++++++++++ interface/src/UserLocationsModel.h | 81 ++++++++ interface/src/ui/UserLocationsWindow.cpp | 76 ++++++++ interface/src/ui/UserLocationsWindow.h | 35 ++++ interface/ui/userLocationsWindow.ui | 130 +++++++++++++ 5 files changed, 551 insertions(+) create mode 100644 interface/src/UserLocationsModel.cpp create mode 100644 interface/src/UserLocationsModel.h create mode 100644 interface/src/ui/UserLocationsWindow.cpp create mode 100644 interface/src/ui/UserLocationsWindow.h create mode 100644 interface/ui/userLocationsWindow.ui diff --git a/interface/src/UserLocationsModel.cpp b/interface/src/UserLocationsModel.cpp new file mode 100644 index 0000000000..4ad91bed73 --- /dev/null +++ b/interface/src/UserLocationsModel.cpp @@ -0,0 +1,229 @@ +// +// UserLocationsModel.cpp +// interface/src +// +// Created by Ryan Huffman on 06/24/14. +// Copyright 2014 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 +#include +#include +#include + +#include "AccountManager.h" +#include "Application.h" +#include "UserLocationsModel.h" + +static const QString PLACES_GET = "/api/v1/places"; +static const QString PLACES_UPDATE = "/api/v1/places/%1"; +static const QString PLACES_DELETE= "/api/v1/places/%1"; + +UserLocation::UserLocation(QString id, QString name, QString location) : + _id(id), + _name(name), + _location(location), + _previousName(name), + _updating(false) { +} + +void UserLocation::requestRename(const QString& newName) { + _updating = true; + + JSONCallbackParameters callbackParams; + callbackParams.jsonCallbackReceiver = this; + callbackParams.jsonCallbackMethod = "handleRenameResponse"; + callbackParams.errorCallbackReceiver = this; + callbackParams.errorCallbackMethod = "handleRenameError"; + QJsonObject jsonNameObject; + jsonNameObject.insert("name", QJsonValue(newName)); + QJsonDocument jsonDocument(jsonNameObject); + AccountManager::getInstance().authenticatedRequest(PLACES_UPDATE.arg(_id), + QNetworkAccessManager::PutOperation, + callbackParams, + jsonDocument.toJson()); + _previousName = _name; + _name = newName; + + emit updated(_name); +} + +void UserLocation::handleRenameResponse(const QJsonObject& responseData) { + _updating = false; + + qDebug() << responseData; + QJsonValue status = responseData["status"]; + if (status.isUndefined() || status.toString() != "success") { + _name = _previousName; + qDebug() << "There was an error renaming location '" + _name + "'"; + } + + emit updated(_name); +} + +void UserLocation::handleRenameError(QNetworkReply::NetworkError error, const QString& errorString) { + _updating = false; + + QString msg = "There was an error renaming location '" + _name + "': " + errorString; + qDebug() << msg; + QMessageBox::warning(Application::getInstance()->getWindow(), "Error", msg); + + emit updated(_name); +} + +void UserLocation::requestDelete() { + _updating = true; + + JSONCallbackParameters callbackParams; + callbackParams.jsonCallbackReceiver = this; + callbackParams.jsonCallbackMethod = "handleDeleteResponse"; + callbackParams.errorCallbackReceiver = this; + callbackParams.errorCallbackMethod = "handleDeleteError"; + AccountManager::getInstance().authenticatedRequest(PLACES_DELETE.arg(_id), + QNetworkAccessManager::DeleteOperation, + callbackParams); +} + +void UserLocation::handleDeleteResponse(const QJsonObject& responseData) { + _updating = false; + + QJsonValue status = responseData["status"]; + if (!status.isUndefined() && status.toString() == "success") { + emit deleted(_name); + } else { + qDebug() << "There was an error deleting location '" + _name + "'"; + } +} + +void UserLocation::handleDeleteError(QNetworkReply::NetworkError error, const QString& errorString) { + _updating = false; + + QString msg = "There was an error deleting location '" + _name + "': " + errorString; + qDebug() << msg; + QMessageBox::warning(Application::getInstance()->getWindow(), "Error", msg); +} + +UserLocationsModel::UserLocationsModel(QObject* parent) : + QAbstractListModel(parent), + _updating(false) { + + refresh(); +} + +void UserLocationsModel::update() { + beginResetModel(); + endResetModel(); +} + +void UserLocationsModel::deleteLocation(const QModelIndex& index) { + UserLocation* location = _locations[index.row()]; + location->requestDelete(); +} + +void UserLocationsModel::renameLocation(const QModelIndex& index, const QString& newName) { + UserLocation* location = _locations[index.row()]; + location->requestRename(newName); +} + +void UserLocationsModel::refresh() { + if (!_updating) { + beginResetModel(); + _locations.clear(); + _updating = true; + endResetModel(); + + JSONCallbackParameters callbackParams; + callbackParams.jsonCallbackReceiver = this; + callbackParams.jsonCallbackMethod = "handleLocationsResponse"; + AccountManager::getInstance().authenticatedRequest(PLACES_GET, + QNetworkAccessManager::GetOperation, + callbackParams); + } +} + +void UserLocationsModel::handleLocationsResponse(const QJsonObject& responseData) { + _updating = false; + + QJsonValue status = responseData["status"]; + if (!status.isUndefined() && status.toString() == "success") { + beginResetModel(); + QJsonArray locations = responseData["data"].toObject()["places"].toArray(); + for (QJsonArray::const_iterator it = locations.constBegin(); it != locations.constEnd(); it++) { + QJsonObject location = (*it).toObject(); + QJsonObject address = location["address"].toObject(); + UserLocation* userLocation = new UserLocation(location["id"].toString(), location["name"].toString(), + "hifi://" + address["domain"].toString() + "/" + address["position"].toString() + "/" + address["orientation"].toString()); + _locations.append(userLocation); + connect(userLocation, &UserLocation::deleted, this, &UserLocationsModel::removeLocation); + connect(userLocation, &UserLocation::updated, this, &UserLocationsModel::update); + } + endResetModel(); + } else { + qDebug() << "Error loading location data"; + } +} + +void UserLocationsModel::removeLocation(const QString& name) { + beginResetModel(); + for (QList::iterator it = _locations.begin(); it != _locations.end(); it++) { + if ((*it)->name() == name) { + _locations.erase(it); + break; + } + } + endResetModel(); +} + +int UserLocationsModel::rowCount(const QModelIndex& parent) const { + if (parent.isValid()) { + return 0; + } + + if (_updating) { + return 1; + } + + return _locations.length(); +} + +QVariant UserLocationsModel::data(const QModelIndex& index, int role) const { + if (role == Qt::DisplayRole) { + if (_updating) { + return QVariant("Updating..."); + } else if (index.row() > _locations.length()) { + return QVariant(); + } else if (index.column() == NameColumn) { + return _locations[index.row()]->name(); + } else if (index.column() == LocationColumn) { + return QVariant(_locations[index.row()]->location()); + } + } + + return QVariant(); + +} +QVariant UserLocationsModel::headerData(int section, Qt::Orientation orientation, int role) const { + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { + switch (section) { + case NameColumn: return "Name"; + case LocationColumn: return "Location"; + default: return QVariant(); + } + } + + return QVariant(); +} + +Qt::ItemFlags UserLocationsModel::flags(const QModelIndex& index) const { + if (index.row() < _locations.length()) { + UserLocation* ul = _locations[index.row()]; + if (ul->isUpdating()) { + return Qt::NoItemFlags; + } + } + + return QAbstractListModel::flags(index); +} diff --git a/interface/src/UserLocationsModel.h b/interface/src/UserLocationsModel.h new file mode 100644 index 0000000000..7cf984a8ac --- /dev/null +++ b/interface/src/UserLocationsModel.h @@ -0,0 +1,81 @@ +// +// UserLocationsModel.h +// interface/src +// +// Created by Ryan Huffman on 06/24/14. +// Copyright 2014 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_UserLocationsModel_h +#define hifi_UserLocationsModel_h + +#include +#include +#include + + +class UserLocation : public QObject { + Q_OBJECT +public: + UserLocation(QString id, QString name, QString location); + bool isUpdating() { return _updating; } + void requestRename(const QString& newName); + void requestDelete(); + + QString id() { return _id; } + QString name() { return _name; } + QString location() { return _location; } + +public slots: + void handleRenameResponse(const QJsonObject& responseData); + void handleRenameError(QNetworkReply::NetworkError error, const QString& errorString); + void handleDeleteResponse(const QJsonObject& responseData); + void handleDeleteError(QNetworkReply::NetworkError error, const QString& errorString); + +signals: + void updated(const QString& name); + void deleted(const QString& name); + +private: + QString _id; + QString _name; + QString _location; + QString _previousName; + bool _updating; + +}; + +class UserLocationsModel : public QAbstractListModel { + Q_OBJECT +public: + UserLocationsModel(QObject* parent = NULL); + + virtual int rowCount(const QModelIndex& parent = QModelIndex()) const; + virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; + virtual int columnCount(const QModelIndex& parent = QModelIndex()) const { return 2; }; + virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; + virtual Qt::ItemFlags flags(const QModelIndex& index) const; + + void deleteLocation(const QModelIndex& index); + void renameLocation(const QModelIndex& index, const QString& newName); + + enum Columns { + NameColumn = 0, + LocationColumn + }; + +public slots: + void refresh(); + void update(); + void handleLocationsResponse(const QJsonObject& responseData); + void removeLocation(const QString& name); + +private: + bool _updating; + QList _locations; +}; + +#endif // hifi_UserLocationsModel_h diff --git a/interface/src/ui/UserLocationsWindow.cpp b/interface/src/ui/UserLocationsWindow.cpp new file mode 100644 index 0000000000..7e4cc57248 --- /dev/null +++ b/interface/src/ui/UserLocationsWindow.cpp @@ -0,0 +1,76 @@ +// +// UserLocationsWindow.cpp +// interface/src/ui +// +// Created by Ryan Huffman on 06/24/14. +// Copyright 2014 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 +#include +#include + +#include "Menu.h" +#include "UserLocationsWindow.h" + +UserLocationsWindow::UserLocationsWindow(QWidget* parent) : + QWidget(parent, Qt::Window), + _ui(), + _proxyModel(this), + _userLocationsModel(this) { + + _ui.setupUi(this); + + _proxyModel.setSourceModel(&_userLocationsModel); + _proxyModel.setDynamicSortFilter(true); + + _ui.locationsTreeView->setModel(&_proxyModel); + _ui.locationsTreeView->setSortingEnabled(true); + + connect(_ui.locationsTreeView->selectionModel(), &QItemSelectionModel::selectionChanged, + this, &UserLocationsWindow::updateEnabled); + connect(&_userLocationsModel, &UserLocationsModel::modelReset, this, &UserLocationsWindow::updateEnabled); + connect(&_userLocationsModel, &UserLocationsModel::modelReset, &_proxyModel, &QSortFilterProxyModel::invalidate); + connect(_ui.locationsTreeView, &QTreeView::doubleClicked, this, &UserLocationsWindow::goToModelIndex); + + connect(_ui.deleteButton, &QPushButton::clicked, this, &UserLocationsWindow::deleteSelection); + connect(_ui.renameButton, &QPushButton::clicked, this, &UserLocationsWindow::renameSelection); + connect(_ui.refreshButton, &QPushButton::clicked, &_userLocationsModel, &UserLocationsModel::refresh); + + this->setWindowTitle("My Locations"); +} + +void UserLocationsWindow::updateEnabled() { + bool enabled = _ui.locationsTreeView->selectionModel()->hasSelection(); + _ui.renameButton->setEnabled(enabled); + _ui.deleteButton->setEnabled(enabled); +} + +void UserLocationsWindow::goToModelIndex(const QModelIndex& index) { + QVariant location = _proxyModel.data(index.sibling(index.row(), UserLocationsModel::LocationColumn)); + Menu::getInstance()->goToURL(location.toString()); +} + +void UserLocationsWindow::deleteSelection() { + QModelIndex selection = _ui.locationsTreeView->selectionModel()->currentIndex(); + selection = _proxyModel.mapToSource(selection); + if (selection.isValid()) { + _userLocationsModel.deleteLocation(selection); + } +} + +void UserLocationsWindow::renameSelection() { + QModelIndex selection = _ui.locationsTreeView->selectionModel()->currentIndex(); + selection = _proxyModel.mapToSource(selection); + if (selection.isValid()) { + bool ok; + QString name = _userLocationsModel.data(selection.sibling(selection.row(), UserLocationsModel::NameColumn)).toString(); + QString newName = QInputDialog::getText(this, "Rename '" + name + "'", "Set name to:", QLineEdit::Normal, name, &ok); + if (ok && !newName.isEmpty()) { + _userLocationsModel.renameLocation(selection, newName); + } + } +} diff --git a/interface/src/ui/UserLocationsWindow.h b/interface/src/ui/UserLocationsWindow.h new file mode 100644 index 0000000000..6188f396a2 --- /dev/null +++ b/interface/src/ui/UserLocationsWindow.h @@ -0,0 +1,35 @@ +// +// UserLocationsWindow.h +// interface/src/ui +// +// Created by Ryan Huffman on 06/24/14. +// Copyright 2014 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_UserLocationsWindow_h +#define hifi_UserLocationsWindow_h + +#include "ui_userLocationsWindow.h" +#include "UserLocationsModel.h" + +class UserLocationsWindow : public QWidget { + Q_OBJECT +public: + UserLocationsWindow(QWidget* parent = NULL); + +protected slots: + void updateEnabled(); + void goToModelIndex(const QModelIndex& index); + void deleteSelection(); + void renameSelection(); + +private: + Ui::UserLocationsWindow _ui; + QSortFilterProxyModel _proxyModel; + UserLocationsModel _userLocationsModel; +}; + +#endif // hifi_UserLocationsWindow_h diff --git a/interface/ui/userLocationsWindow.ui b/interface/ui/userLocationsWindow.ui new file mode 100644 index 0000000000..61bb0149f8 --- /dev/null +++ b/interface/ui/userLocationsWindow.ui @@ -0,0 +1,130 @@ + + + UserLocationsWindow + + + + 0 + 0 + 929 + 633 + + + + Form + + + + -1 + + + 12 + + + 12 + + + 12 + + + 12 + + + + + + + + font-size: 16px + + + My Locations + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Refresh + + + + + + + + + + 0 + + + false + + + + + + + + -1 + + + 12 + + + 12 + + + 12 + + + 12 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Rename + + + + + + + Delete + + + + + + + + + + + From 33e11be3e077b72427101bacf5a25a5ea7a53c61 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 26 Jun 2014 16:06:49 -0700 Subject: [PATCH 02/50] Add user locations to menu --- interface/src/Menu.cpp | 11 +++++++++++ interface/src/Menu.h | 2 ++ 2 files changed, 13 insertions(+) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index fa30e0382b..7c9356045c 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -45,6 +45,7 @@ #include "ui/ModelsBrowser.h" #include "ui/LoginDialog.h" #include "ui/NodeBounds.h" +#include "ui/UserLocationsWindow.h" #include "devices/OculusManager.h" @@ -165,6 +166,11 @@ Menu::Menu() : Qt::CTRL | Qt::Key_N, this, SLOT(nameLocation())); + addActionToQMenuAndActionHash(fileMenu, + MenuOption::MyLocations, + Qt::CTRL | Qt::Key_L, + this, + SLOT(showLocationList())); addActionToQMenuAndActionHash(fileMenu, MenuOption::GoTo, Qt::Key_At, @@ -1179,6 +1185,11 @@ void Menu::namedLocationCreated(LocationManager::NamedLocationCreateResponse res msgBox.exec(); } +void Menu::showLocationList() { + UserLocationsWindow* window = new UserLocationsWindow(); + window->show(); +} + void Menu::nameLocation() { // check if user is logged in or show login dialog if not diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 4d2174a448..e353b420dd 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -193,6 +193,7 @@ private slots: void goToDomainDialog(); void goToLocation(); void nameLocation(); + void showLocationList(); void bandwidthDetailsClosed(); void octreeStatsDetailsClosed(); void lodToolsClosed(); @@ -387,6 +388,7 @@ namespace MenuOption { const QString MoveWithLean = "Move with Lean"; const QString MuteAudio = "Mute Microphone"; const QString MuteEnvironment = "Mute Environment"; + const QString MyLocations = "My Locations..."; const QString NameLocation = "Name this location"; const QString NewVoxelCullingMode = "New Voxel Culling Mode"; const QString OctreeStats = "Voxel and Particle Statistics"; From 50e77be406195c50392a5aea1335386bda2f348b Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 26 Jun 2014 16:07:02 -0700 Subject: [PATCH 03/50] Add DELETE to AccountManager --- libraries/networking/src/AccountManager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 918261a953..8800686178 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -204,6 +204,9 @@ void AccountManager::invokedRequest(const QString& path, QNetworkAccessManager:: } } + break; + case QNetworkAccessManager::DeleteOperation: + networkReply = _networkAccessManager->sendCustomRequest(authenticatedRequest, "DELETE"); break; default: // other methods not yet handled From f13bbdfae60e8d13b225ee2699e54e9cb513ad7c Mon Sep 17 00:00:00 2001 From: Aleric Inglewood Date: Mon, 30 Jun 2014 01:28:35 +0200 Subject: [PATCH 04/50] Compile fix for non-standard Qt5 install. When Qt5 5.2.1 is compiled from source, configured with -developer-build, and used without being installed; then compiling interface results in the following compile error: libraries/shared/src/RegisteredMetaTypes.h:17:34: fatal error: QtScript/QScriptEngine: No such file or directory This commit fixes this by explicitely adding the include directory for QtScript/QScriptEngine to libraries/shared/CMakeLists.txt Likewise we get the compile error: In file included from /opt/highfidelity/hifi/hifi/animation-server/../libraries/voxels/src/VoxelEditPacketSender.h:18:0, from /opt/highfidelity/hifi/hifi/animation-server/src/AnimationServer.cpp:26: /opt/highfidelity/hifi/hifi/animation-server/../libraries/voxels/src/VoxelDetail.h:15:34: fatal error: QtScript/QScriptEngine: No such file or directory which is fixed by added the include directory for QtScript/QScriptEngine to animation-server/CMakeLists.txt Finally, compile errors like In file included from /opt/highfidelity/hifi/hifi/libraries/audio/src/AudioInjectorOptions.h:20:0, from /opt/highfidelity/hifi/hifi/libraries/audio/src/AudioInjector.h:21, from /opt/highfidelity/hifi/hifi/libraries/audio/src/AudioInjector.cpp:22: /opt/highfidelity/hifi/hifi/assignment-client/../libraries/shared/src/RegisteredMetaTypes.h:17:34: fatal error: QtScript/QScriptEngine: No such file or directory that requires to do the same in libraries/audio/CMakeLists.txt --- animation-server/CMakeLists.txt | 5 ++++- libraries/audio/CMakeLists.txt | 5 ++++- libraries/shared/CMakeLists.txt | 8 ++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/animation-server/CMakeLists.txt b/animation-server/CMakeLists.txt index 42516d2f86..31ed5d98df 100644 --- a/animation-server/CMakeLists.txt +++ b/animation-server/CMakeLists.txt @@ -12,6 +12,9 @@ set(MACRO_DIR "${ROOT_DIR}/cmake/macros") # setup for find modules set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/") +find_package(Qt5 COMPONENTS Script) +include_directories(SYSTEM "${Qt5Script_INCLUDE_DIRS}") + # set up the external glm library include("${MACRO_DIR}/IncludeGLM.cmake") include_glm(${TARGET_NAME} "${ROOT_DIR}") @@ -35,4 +38,4 @@ link_hifi_library(networking ${TARGET_NAME} "${ROOT_DIR}") # add a definition for ssize_t so that windows doesn't bail if (WIN32) add_definitions(-Dssize_t=long) -endif () \ No newline at end of file +endif () diff --git a/libraries/audio/CMakeLists.txt b/libraries/audio/CMakeLists.txt index 60636ba051..fafdfc7e6c 100644 --- a/libraries/audio/CMakeLists.txt +++ b/libraries/audio/CMakeLists.txt @@ -12,6 +12,9 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../../cm set(TARGET_NAME audio) +find_package(Qt5 COMPONENTS Script) +include_directories(SYSTEM "${Qt5Script_INCLUDE_DIRS}") + # set up the external glm library include(${MACRO_DIR}/SetupHifiLibrary.cmake) setup_hifi_library(${TARGET_NAME}) @@ -26,4 +29,4 @@ link_hifi_library(networking ${TARGET_NAME} "${ROOT_DIR}") # add a definition for ssize_t so that windows doesn't bail if (WIN32) add_definitions(-Dssize_t=long) -endif () \ No newline at end of file +endif () diff --git a/libraries/shared/CMakeLists.txt b/libraries/shared/CMakeLists.txt index 7f9a34492d..560546473c 100644 --- a/libraries/shared/CMakeLists.txt +++ b/libraries/shared/CMakeLists.txt @@ -10,7 +10,7 @@ set(MACRO_DIR "${ROOT_DIR}/cmake/macros") set(TARGET_NAME shared) project(${TARGET_NAME}) -find_package(Qt5 COMPONENTS Network Widgets Xml) +find_package(Qt5 COMPONENTS Network Widgets Xml Script) include(${MACRO_DIR}/SetupHifiLibrary.cmake) setup_hifi_library(${TARGET_NAME}) @@ -32,4 +32,8 @@ if (UNIX AND NOT APPLE) target_link_libraries(${TARGET_NAME} "${CMAKE_THREAD_LIBS_INIT}") endif (UNIX AND NOT APPLE) -target_link_libraries(${TARGET_NAME} Qt5::Network Qt5::Widgets) \ No newline at end of file +# There is something special (bug) about Qt5Scripts, that we have to explicitly add its include +# directory when Qt5 (5.2.1) is compiled from source and is not in a standard place. +include_directories(SYSTEM "${Qt5Script_INCLUDE_DIRS}") + +target_link_libraries(${TARGET_NAME} Qt5::Network Qt5::Widgets) From 37f0635024ed56e5533ab672a37b2040569bb820 Mon Sep 17 00:00:00 2001 From: Aleric Inglewood Date: Mon, 30 Jun 2014 02:07:26 +0200 Subject: [PATCH 05/50] Fix a (possible) crash in QObject::disconnect This is https://worklist.net/19827 --- interface/src/Audio.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 65912f83e8..5a16cd80bd 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -1327,8 +1327,10 @@ bool Audio::switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceInfo) { // cleanup any previously initialized device if (_audioInput) { + // The call to stop() causes _inputDevice to be destructed. + // That in turn causes it to be disconnected (see for example + // http://stackoverflow.com/questions/9264750/qt-signals-and-slots-object-disconnect). _audioInput->stop(); - disconnect(_inputDevice); _inputDevice = NULL; delete _audioInput; From 51e42221be651a6a504a48b162965c14b2d7ef08 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 30 Jun 2014 22:24:27 -0700 Subject: [PATCH 06/50] Update menu to toggle User Locations Menu --- interface/src/Menu.cpp | 18 ++++++++++++------ interface/src/Menu.h | 4 +++- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 7c9356045c..ae3cc1b77c 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -45,7 +45,6 @@ #include "ui/ModelsBrowser.h" #include "ui/LoginDialog.h" #include "ui/NodeBounds.h" -#include "ui/UserLocationsWindow.h" #include "devices/OculusManager.h" @@ -92,6 +91,7 @@ Menu::Menu() : _jsConsole(NULL), _octreeStatsDialog(NULL), _lodToolsDialog(NULL), + _userLocationsWindow(NULL), _maxVoxels(DEFAULT_MAX_VOXELS_PER_SYSTEM), _voxelSizeScale(DEFAULT_OCTREE_SIZE_SCALE), _oculusUIAngularSize(DEFAULT_OCULUS_UI_ANGULAR_SIZE), @@ -168,9 +168,9 @@ Menu::Menu() : SLOT(nameLocation())); addActionToQMenuAndActionHash(fileMenu, MenuOption::MyLocations, - Qt::CTRL | Qt::Key_L, + Qt::CTRL | Qt::Key_K, this, - SLOT(showLocationList())); + SLOT(toggleLocationList())); addActionToQMenuAndActionHash(fileMenu, MenuOption::GoTo, Qt::Key_At, @@ -1185,9 +1185,15 @@ void Menu::namedLocationCreated(LocationManager::NamedLocationCreateResponse res msgBox.exec(); } -void Menu::showLocationList() { - UserLocationsWindow* window = new UserLocationsWindow(); - window->show(); +void Menu::toggleLocationList() { + if (!_userLocationsWindow) { + _userLocationsWindow = new UserLocationsWindow(); + } + if (_userLocationsWindow->isVisible()) { + _userLocationsWindow->hide(); + } else { + _userLocationsWindow->show(); + } } void Menu::nameLocation() { diff --git a/interface/src/Menu.h b/interface/src/Menu.h index e353b420dd..9a5e2f9d43 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -29,6 +29,7 @@ #include "ui/JSConsole.h" #include "ui/LoginDialog.h" #include "ui/ScriptEditorWindow.h" +#include "ui/UserLocationsWindow.h" const float ADJUST_LOD_DOWN_FPS = 40.0; const float ADJUST_LOD_UP_FPS = 55.0; @@ -193,7 +194,7 @@ private slots: void goToDomainDialog(); void goToLocation(); void nameLocation(); - void showLocationList(); + void toggleLocationList(); void bandwidthDetailsClosed(); void octreeStatsDetailsClosed(); void lodToolsClosed(); @@ -260,6 +261,7 @@ private: QDialog* _jsConsole; OctreeStatsDialog* _octreeStatsDialog; LodToolsDialog* _lodToolsDialog; + UserLocationsWindow* _userLocationsWindow; int _maxVoxels; float _voxelSizeScale; float _oculusUIAngularSize; From 15d60df4203f97b442c9df442fa9216194e3b441 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 30 Jun 2014 22:25:00 -0700 Subject: [PATCH 07/50] Update User Locations window to update name when it changes on update --- interface/src/UserLocationsModel.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/interface/src/UserLocationsModel.cpp b/interface/src/UserLocationsModel.cpp index 4ad91bed73..051b04eb95 100644 --- a/interface/src/UserLocationsModel.cpp +++ b/interface/src/UserLocationsModel.cpp @@ -56,9 +56,14 @@ void UserLocation::handleRenameResponse(const QJsonObject& responseData) { qDebug() << responseData; QJsonValue status = responseData["status"]; - if (status.isUndefined() || status.toString() != "success") { + if (!status.isUndefined() && status.toString() == "success") { + QString updatedName = responseData["data"].toObject()["name"].toString(); + _name = updatedName; + } else { _name = _previousName; - qDebug() << "There was an error renaming location '" + _name + "'"; + QString msg = "There was an error renaming location '" + _name + "'"; + qDebug() << msg; + QMessageBox::warning(Application::getInstance()->getWindow(), "Error", msg); } emit updated(_name); @@ -94,7 +99,9 @@ void UserLocation::handleDeleteResponse(const QJsonObject& responseData) { if (!status.isUndefined() && status.toString() == "success") { emit deleted(_name); } else { - qDebug() << "There was an error deleting location '" + _name + "'"; + QString msg = "There was an error deleting location '" + _name + "'"; + qDebug() << msg; + QMessageBox::warning(Application::getInstance()->getWindow(), "Error", msg); } } From a566f90820389d3a5443042f7266de01f9240b6e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 30 Jun 2014 22:37:13 -0700 Subject: [PATCH 08/50] Update User Location update/delete to not work simultaneously --- interface/src/UserLocationsModel.cpp | 54 +++++++++++++++------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/interface/src/UserLocationsModel.cpp b/interface/src/UserLocationsModel.cpp index 051b04eb95..539f9197a4 100644 --- a/interface/src/UserLocationsModel.cpp +++ b/interface/src/UserLocationsModel.cpp @@ -31,24 +31,26 @@ UserLocation::UserLocation(QString id, QString name, QString location) : } void UserLocation::requestRename(const QString& newName) { - _updating = true; + if (!_updating) { + _updating = true; - JSONCallbackParameters callbackParams; - callbackParams.jsonCallbackReceiver = this; - callbackParams.jsonCallbackMethod = "handleRenameResponse"; - callbackParams.errorCallbackReceiver = this; - callbackParams.errorCallbackMethod = "handleRenameError"; - QJsonObject jsonNameObject; - jsonNameObject.insert("name", QJsonValue(newName)); - QJsonDocument jsonDocument(jsonNameObject); - AccountManager::getInstance().authenticatedRequest(PLACES_UPDATE.arg(_id), - QNetworkAccessManager::PutOperation, - callbackParams, - jsonDocument.toJson()); - _previousName = _name; - _name = newName; + JSONCallbackParameters callbackParams; + callbackParams.jsonCallbackReceiver = this; + callbackParams.jsonCallbackMethod = "handleRenameResponse"; + callbackParams.errorCallbackReceiver = this; + callbackParams.errorCallbackMethod = "handleRenameError"; + QJsonObject jsonNameObject; + jsonNameObject.insert("name", QJsonValue(newName)); + QJsonDocument jsonDocument(jsonNameObject); + AccountManager::getInstance().authenticatedRequest(PLACES_UPDATE.arg(_id), + QNetworkAccessManager::PutOperation, + callbackParams, + jsonDocument.toJson()); + _previousName = _name; + _name = newName; - emit updated(_name); + emit updated(_name); + } } void UserLocation::handleRenameResponse(const QJsonObject& responseData) { @@ -80,16 +82,18 @@ void UserLocation::handleRenameError(QNetworkReply::NetworkError error, const QS } void UserLocation::requestDelete() { - _updating = true; + if (!_updating) { + _updating = true; - JSONCallbackParameters callbackParams; - callbackParams.jsonCallbackReceiver = this; - callbackParams.jsonCallbackMethod = "handleDeleteResponse"; - callbackParams.errorCallbackReceiver = this; - callbackParams.errorCallbackMethod = "handleDeleteError"; - AccountManager::getInstance().authenticatedRequest(PLACES_DELETE.arg(_id), - QNetworkAccessManager::DeleteOperation, - callbackParams); + JSONCallbackParameters callbackParams; + callbackParams.jsonCallbackReceiver = this; + callbackParams.jsonCallbackMethod = "handleDeleteResponse"; + callbackParams.errorCallbackReceiver = this; + callbackParams.errorCallbackMethod = "handleDeleteError"; + AccountManager::getInstance().authenticatedRequest(PLACES_DELETE.arg(_id), + QNetworkAccessManager::DeleteOperation, + callbackParams); + } } void UserLocation::handleDeleteResponse(const QJsonObject& responseData) { From bfde24fe121621ea22c3c0df51aa1aea96e68345 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 30 Jun 2014 22:37:32 -0700 Subject: [PATCH 09/50] Update MyLocations sort order --- interface/src/ui/UserLocationsWindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/ui/UserLocationsWindow.cpp b/interface/src/ui/UserLocationsWindow.cpp index 7e4cc57248..523d32f930 100644 --- a/interface/src/ui/UserLocationsWindow.cpp +++ b/interface/src/ui/UserLocationsWindow.cpp @@ -29,6 +29,7 @@ UserLocationsWindow::UserLocationsWindow(QWidget* parent) : _ui.locationsTreeView->setModel(&_proxyModel); _ui.locationsTreeView->setSortingEnabled(true); + _ui.locationsTreeView->sortByColumn(UserLocationsModel::NameColumn, Qt::AscendingOrder); connect(_ui.locationsTreeView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &UserLocationsWindow::updateEnabled); From 50b13c99a7e3486a200ee245692f25a09fafba45 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 30 Jun 2014 22:44:04 -0700 Subject: [PATCH 10/50] Update UserLocationsWindow derive from QDialog --- interface/src/ui/UserLocationsWindow.cpp | 2 +- interface/src/ui/UserLocationsWindow.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/UserLocationsWindow.cpp b/interface/src/ui/UserLocationsWindow.cpp index 523d32f930..f7e684fc64 100644 --- a/interface/src/ui/UserLocationsWindow.cpp +++ b/interface/src/ui/UserLocationsWindow.cpp @@ -17,7 +17,7 @@ #include "UserLocationsWindow.h" UserLocationsWindow::UserLocationsWindow(QWidget* parent) : - QWidget(parent, Qt::Window), + QDialog(parent), _ui(), _proxyModel(this), _userLocationsModel(this) { diff --git a/interface/src/ui/UserLocationsWindow.h b/interface/src/ui/UserLocationsWindow.h index 6188f396a2..215c1957f3 100644 --- a/interface/src/ui/UserLocationsWindow.h +++ b/interface/src/ui/UserLocationsWindow.h @@ -15,7 +15,7 @@ #include "ui_userLocationsWindow.h" #include "UserLocationsModel.h" -class UserLocationsWindow : public QWidget { +class UserLocationsWindow : public QDialog { Q_OBJECT public: UserLocationsWindow(QWidget* parent = NULL); From 1a1050cb06b360e1f201027dc60a5d199762b79c Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Tue, 1 Jul 2014 12:31:48 -0700 Subject: [PATCH 11/50] Added back _raiseMirror usage for mirror mode. --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7fb3ded0d8..f21fedabea 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -592,7 +592,7 @@ void Application::paintGL() { _myCamera.setTightness(0.0f); _myCamera.setDistance(MIRROR_FULLSCREEN_DISTANCE * _scaleMirror); _myCamera.setTargetRotation(_myAvatar->getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f))); - _myCamera.setTargetPosition(_myAvatar->getHead()->calculateAverageEyePosition()); + _myCamera.setTargetPosition(_myAvatar->getHead()->calculateAverageEyePosition() + glm::vec3(0, _raiseMirror * _myAvatar->getScale(), 0)); } // Update camera position From af30dc27223dd9e0a240890c95e1d65f822834be Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Tue, 1 Jul 2014 12:33:54 -0700 Subject: [PATCH 12/50] Updated oculus readme.txt for windows users --- interface/external/oculus/readme.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/interface/external/oculus/readme.txt b/interface/external/oculus/readme.txt index f689f81478..f68818d1ee 100644 --- a/interface/external/oculus/readme.txt +++ b/interface/external/oculus/readme.txt @@ -10,4 +10,7 @@ You can download the Oculus SDK from https://developer.oculusvr.com/ (account cr You may optionally choose to copy the SDK folders to a location outside the repository (so you can re-use with different checkouts and different projects). If so our CMake find module expects you to set the ENV variable 'HIFI_LIB_DIR' to a directory containing a subfolder 'oculus' that contains the three folders mentioned above. -2. Clear your build directory, run cmake and build, and you should be all set. \ No newline at end of file + NOTE: For Windows users, you should copy libovr.lib and libovrd.lib from the \oculus\Lib\Win32\VS2010 directory to the \oculus\Lib\Win32\ directory. + +2. Clear your build directory, run cmake and build, and you should be all set. + From 9953fd6d2bdcbd31f9722a14ced4296717b221d7 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 1 Jul 2014 15:29:13 -0700 Subject: [PATCH 13/50] Update MyLocations to not send rename request if unchanged --- interface/src/UserLocationsModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/UserLocationsModel.cpp b/interface/src/UserLocationsModel.cpp index 539f9197a4..000ab34703 100644 --- a/interface/src/UserLocationsModel.cpp +++ b/interface/src/UserLocationsModel.cpp @@ -31,7 +31,7 @@ UserLocation::UserLocation(QString id, QString name, QString location) : } void UserLocation::requestRename(const QString& newName) { - if (!_updating) { + if (!_updating && newName.toLower() != _name) { _updating = true; JSONCallbackParameters callbackParams; From e7e7bef5064ae18442b2b29c0d469a391c03a891 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 1 Jul 2014 15:37:10 -0700 Subject: [PATCH 14/50] Add error string on rename failure --- interface/src/UserLocationsModel.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/interface/src/UserLocationsModel.cpp b/interface/src/UserLocationsModel.cpp index 000ab34703..824c1269bd 100644 --- a/interface/src/UserLocationsModel.cpp +++ b/interface/src/UserLocationsModel.cpp @@ -63,7 +63,16 @@ void UserLocation::handleRenameResponse(const QJsonObject& responseData) { _name = updatedName; } else { _name = _previousName; + QString msg = "There was an error renaming location '" + _name + "'"; + + QJsonValue data = responseData["data"]; + if (!data.isUndefined()) { + QJsonValue nameError = data.toObject()["name"]; + if (!nameError.isUndefined()) { + msg += ": " + nameError.toString(); + } + } qDebug() << msg; QMessageBox::warning(Application::getInstance()->getWindow(), "Error", msg); } From 29976d7861f041322f11ccdf29b92bab26470c30 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 1 Jul 2014 17:17:34 -0700 Subject: [PATCH 15/50] Created base for wrapper singleton class NetworkAccessManager --- .../networking/src/NetworkAccessManager.cpp | 20 ++++++++++++++ .../networking/src/NetworkAccessManager.h | 27 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 libraries/networking/src/NetworkAccessManager.cpp create mode 100644 libraries/networking/src/NetworkAccessManager.h diff --git a/libraries/networking/src/NetworkAccessManager.cpp b/libraries/networking/src/NetworkAccessManager.cpp new file mode 100644 index 0000000000..a33817b50d --- /dev/null +++ b/libraries/networking/src/NetworkAccessManager.cpp @@ -0,0 +1,20 @@ +// +// NetworkAccessManager.cpp +// +// +// Created by Clement on 7/1/14. +// Copyright 2014 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 "NetworkAccessManager.h" + +NetworkAccessManager& NetworkAccessManager::getInstance() { + static NetworkAccessManager sharedInstance; + return sharedInstance; +} + +NetworkAccessManager::NetworkAccessManager() { +} \ No newline at end of file diff --git a/libraries/networking/src/NetworkAccessManager.h b/libraries/networking/src/NetworkAccessManager.h new file mode 100644 index 0000000000..c7cc74340a --- /dev/null +++ b/libraries/networking/src/NetworkAccessManager.h @@ -0,0 +1,27 @@ +// +// NetworkAccessManager.h +// +// +// Created by Clement on 7/1/14. +// Copyright 2014 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_NetworkAccessManager_h +#define hifi_NetworkAccessManager_h + +#include + +class NetworkAccessManager : public QNetworkAccessManager { + Q_OBJECT +public: + static NetworkAccessManager& getInstance(); + + +private: + NetworkAccessManager(); +}; + +#endif // hifi_NetworkAccessManager_h \ No newline at end of file From 231557a12c2c9a61ff6f94633811a2119b6f72e8 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 1 Jul 2014 17:35:34 -0700 Subject: [PATCH 16/50] Switched Agent to NetworkAccessManager --- assignment-client/src/Agent.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 5720ecaaf5..1805a414b5 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -13,13 +13,13 @@ #include #include #include -#include #include #include #include #include #include +#include #include #include #include @@ -208,12 +208,12 @@ void Agent::run() { scriptURL = QUrl(_payload); } - QNetworkAccessManager *networkManager = new QNetworkAccessManager(this); - QNetworkReply *reply = networkManager->get(QNetworkRequest(scriptURL)); - QNetworkDiskCache* cache = new QNetworkDiskCache(networkManager); + NetworkAccessManager& networkManager = NetworkAccessManager::getInstance(); + QNetworkReply *reply = networkManager.get(QNetworkRequest(scriptURL)); + QNetworkDiskCache* cache = new QNetworkDiskCache(&networkManager); QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation); cache->setCacheDirectory(!cachePath.isEmpty() ? cachePath : "agentCache"); - networkManager->setCache(cache); + networkManager.setCache(cache); qDebug() << "Downloading script at" << scriptURL.toString(); @@ -222,10 +222,6 @@ void Agent::run() { loop.exec(); - // let the AvatarData and ResourceCache classes use our QNetworkAccessManager - AvatarData::setNetworkAccessManager(networkManager); - ResourceCache::setNetworkAccessManager(networkManager); - QString scriptContents(reply->readAll()); qDebug() << "Downloaded script:" << scriptContents; From d6a2cea756ce33e22d35e9faca3028ccc03f0bfe Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 1 Jul 2014 17:39:45 -0700 Subject: [PATCH 17/50] Switched AudioMixer to NetworkAccessManager --- assignment-client/src/audio/AudioMixer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 663aef81a7..1c3046b9b1 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -38,11 +38,11 @@ #include #include #include -#include #include #include #include +#include #include #include #include @@ -482,8 +482,8 @@ void AudioMixer::run() { nodeList->linkedDataCreateCallback = attachNewBufferToNode; - // setup a QNetworkAccessManager to ask the domain-server for our settings - QNetworkAccessManager *networkManager = new QNetworkAccessManager(this); + // setup a NetworkAccessManager to ask the domain-server for our settings + NetworkAccessManager& networkManager = NetworkAccessManager::getInstance(); QUrl settingsJSONURL; settingsJSONURL.setScheme("http"); @@ -500,7 +500,7 @@ void AudioMixer::run() { qDebug() << "Requesting settings for assignment from domain-server at" << settingsJSONURL.toString(); while (!reply || reply->error() != QNetworkReply::NoError) { - reply = networkManager->get(QNetworkRequest(settingsJSONURL)); + reply = networkManager.get(QNetworkRequest(settingsJSONURL)); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); From c5a997a56721cebc3428cb930a805fde253c9493 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 1 Jul 2014 17:43:25 -0700 Subject: [PATCH 18/50] Switched Application to NetworkAccessManager --- interface/src/Application.cpp | 18 ++++++++---------- interface/src/Application.h | 3 --- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0f8fbbae56..10b6fc8165 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include @@ -53,17 +52,18 @@ #include #include +#include #include #include +#include #include +#include #include #include #include #include #include #include -#include -#include #include "Application.h" #include "InterfaceVersion.h" @@ -314,12 +314,11 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation); - _networkAccessManager = new QNetworkAccessManager(this); - QNetworkDiskCache* cache = new QNetworkDiskCache(_networkAccessManager); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkDiskCache* cache = new QNetworkDiskCache(&networkAccessManager); cache->setCacheDirectory(!cachePath.isEmpty() ? cachePath : "interfaceCache"); - _networkAccessManager->setCache(cache); + networkAccessManager.setCache(cache); - ResourceCache::setNetworkAccessManager(_networkAccessManager); ResourceCache::setRequestLimit(3); _window->setCentralWidget(_glWidget); @@ -441,8 +440,6 @@ Application::~Application() { _myAvatar = NULL; delete _glWidget; - - AccountManager::getInstance().destroy(); } void Application::saveSettings() { @@ -3802,7 +3799,8 @@ void Application::initAvatarAndViewFrustum() { void Application::checkVersion() { QNetworkRequest latestVersionRequest((QUrl(CHECK_VERSION_URL))); latestVersionRequest.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); - connect(Application::getInstance()->getNetworkAccessManager()->get(latestVersionRequest), SIGNAL(finished()), SLOT(parseVersionXml())); + QNetworkReply* reply = NetworkAccessManager::getInstance().get(latestVersionRequest); + connect(reply, SIGNAL(finished()), SLOT(parseVersionXml())); } void Application::parseVersionXml() { diff --git a/interface/src/Application.h b/interface/src/Application.h index 56b6f673ae..11f406abf0 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -97,7 +97,6 @@ class QActionGroup; class QGLWidget; class QKeyEvent; class QMouseEvent; -class QNetworkAccessManager; class QSettings; class QWheelEvent; @@ -236,7 +235,6 @@ public: void lockOctreeSceneStats() { _octreeSceneStatsLock.lockForRead(); } void unlockOctreeSceneStats() { _octreeSceneStatsLock.unlock(); } - QNetworkAccessManager* getNetworkAccessManager() { return _networkAccessManager; } GeometryCache* getGeometryCache() { return &_geometryCache; } AnimationCache* getAnimationCache() { return &_animationCache; } TextureCache* getTextureCache() { return &_textureCache; } @@ -423,7 +421,6 @@ private: QThread* _nodeThread; DatagramProcessor _datagramProcessor; - QNetworkAccessManager* _networkAccessManager; QMutex _settingsMutex; QSettings* _settings; int _numChangedSettings; From ab15a1487e58ba90723cc9b2b11d6dc8c289d0bc Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 1 Jul 2014 17:44:38 -0700 Subject: [PATCH 19/50] Switched BillboardOverlay to NetworkAccessManaqer --- interface/src/ui/overlays/BillboardOverlay.cpp | 16 +++++----------- interface/src/ui/overlays/BillboardOverlay.h | 3 +-- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/interface/src/ui/overlays/BillboardOverlay.cpp b/interface/src/ui/overlays/BillboardOverlay.cpp index 40de565155..8742f19c3d 100644 --- a/interface/src/ui/overlays/BillboardOverlay.cpp +++ b/interface/src/ui/overlays/BillboardOverlay.cpp @@ -14,8 +14,7 @@ #include "BillboardOverlay.h" BillboardOverlay::BillboardOverlay() -: _manager(NULL), - _scale(1.0f), +: _scale(1.0f), _isFacingAvatar(true) { } @@ -119,18 +118,13 @@ void BillboardOverlay::setProperties(const QScriptValue &properties) { } } -// TODO: handle setting image multiple times, how do we manage releasing the bound texture? void BillboardOverlay::setBillboardURL(const QUrl url) { - // TODO: are we creating too many QNetworkAccessManager() when multiple calls to setImageURL are made? - _manager->deleteLater(); - _manager = new QNetworkAccessManager(); - connect(_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); - _manager->get(QNetworkRequest(url)); + QNetworkReply* reply = NetworkAccessManager::getInstance().get(QNetworkRequest(url)); + connect(reply, &QNetworkReply::finished, this, &BillboardOverlay::replyFinished); } -void BillboardOverlay::replyFinished(QNetworkReply* reply) { +void BillboardOverlay::replyFinished() { // replace our byte array with the downloaded data + QNetworkReply* reply = static_cast(sender()); _billboard = reply->readAll(); - _manager->deleteLater(); - _manager = NULL; } diff --git a/interface/src/ui/overlays/BillboardOverlay.h b/interface/src/ui/overlays/BillboardOverlay.h index 473e8a066f..0037d1a4f7 100644 --- a/interface/src/ui/overlays/BillboardOverlay.h +++ b/interface/src/ui/overlays/BillboardOverlay.h @@ -27,12 +27,11 @@ public: virtual void setProperties(const QScriptValue& properties); private slots: - void replyFinished(QNetworkReply* reply); + void replyFinished(); private: void setBillboardURL(const QUrl url); - QNetworkAccessManager* _manager; QUrl _url; QByteArray _billboard; QSize _size; From 30644c750d350e860f23292cc57a728064b47145 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 1 Jul 2014 17:46:23 -0700 Subject: [PATCH 20/50] Switched AvatarData to NetworkAccessManager --- libraries/avatars/src/AvatarData.cpp | 30 ++++++++++++---------------- libraries/avatars/src/AvatarData.h | 5 ----- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 94066d9a1c..3f3e71c5e8 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -16,10 +16,10 @@ #include #include #include -#include #include #include +#include #include #include #include @@ -33,8 +33,6 @@ quint64 DEFAULT_FILTERED_LOG_EXPIRY = 2 * USECS_PER_SECOND; using namespace std; -QNetworkAccessManager* AvatarData::networkAccessManager = NULL; - AvatarData::AvatarData() : _sessionUUID(), _handPosition(0,0,0), @@ -751,18 +749,15 @@ void AvatarData::setBillboard(const QByteArray& billboard) { void AvatarData::setBillboardFromURL(const QString &billboardURL) { _billboardURL = billboardURL; - if (AvatarData::networkAccessManager) { - qDebug() << "Changing billboard for avatar to PNG at" << qPrintable(billboardURL); - - QNetworkRequest billboardRequest; - billboardRequest.setUrl(QUrl(billboardURL)); - - QNetworkReply* networkReply = AvatarData::networkAccessManager->get(billboardRequest); - connect(networkReply, SIGNAL(finished()), this, SLOT(setBillboardFromNetworkReply())); - - } else { - qDebug() << "Billboard PNG download requested but no network access manager is available."; - } + + qDebug() << "Changing billboard for avatar to PNG at" << qPrintable(billboardURL); + + QNetworkRequest billboardRequest; + billboardRequest.setUrl(QUrl(billboardURL)); + + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkReply* networkReply = networkAccessManager.get(billboardRequest); + connect(networkReply, SIGNAL(finished()), this, SLOT(setBillboardFromNetworkReply())); } void AvatarData::setBillboardFromNetworkReply() { @@ -839,8 +834,9 @@ void AvatarData::updateJointMappings() { _jointIndices.clear(); _jointNames.clear(); - if (networkAccessManager && _skeletonModelURL.fileName().toLower().endsWith(".fst")) { - QNetworkReply* networkReply = networkAccessManager->get(QNetworkRequest(_skeletonModelURL)); + if (_skeletonModelURL.fileName().toLower().endsWith(".fst")) { + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkReply* networkReply = networkAccessManager.get(QNetworkRequest(_skeletonModelURL)); connect(networkReply, SIGNAL(finished()), this, SLOT(setJointMappingsFromNetworkReply())); } } diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 4c7136fd0a..1b8f6e6007 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -102,7 +102,6 @@ enum KeyState { const glm::vec3 vec3Zero(0.0f); class QDataStream; -class QNetworkAccessManager; class AttachmentData; class JointData; @@ -269,8 +268,6 @@ public: QElapsedTimer& getLastUpdateTimer() { return _lastUpdateTimer; } virtual float getBoundingRadius() const { return 1.f; } - - static void setNetworkAccessManager(QNetworkAccessManager* sharedAccessManager) { networkAccessManager = sharedAccessManager; } public slots: void sendIdentityPacket(); @@ -323,8 +320,6 @@ protected: QHash _jointIndices; ///< 1-based, since zero is returned for missing keys QStringList _jointNames; ///< in order of depth-first traversal - - static QNetworkAccessManager* networkAccessManager; quint64 _errorLogExpiry; ///< time in future when to log an error From 7c3292a41b480fd7ded2cb4943bc8e897c1e6f86 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 1 Jul 2014 17:47:31 -0700 Subject: [PATCH 21/50] Switched AccountManager to NetworkAccessManager --- libraries/networking/src/AccountManager.cpp | 27 ++++++++------------- libraries/networking/src/AccountManager.h | 6 ++--- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 918261a953..82487ae1c0 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -49,7 +49,6 @@ JSONCallbackParameters::JSONCallbackParameters() : AccountManager::AccountManager() : _authURL(), - _networkAccessManager(NULL), _pendingCallbackMap(), _accountInfo() { @@ -153,9 +152,7 @@ void AccountManager::invokedRequest(const QString& path, QNetworkAccessManager:: const JSONCallbackParameters& callbackParams, const QByteArray& dataByteArray, QHttpMultiPart* dataMultiPart) { - if (!_networkAccessManager) { - _networkAccessManager = new QNetworkAccessManager(this); - } + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); if (hasValidAccessToken()) { QNetworkRequest authenticatedRequest; @@ -184,23 +181,23 @@ void AccountManager::invokedRequest(const QString& path, QNetworkAccessManager:: switch (operation) { case QNetworkAccessManager::GetOperation: - networkReply = _networkAccessManager->get(authenticatedRequest); + networkReply = networkAccessManager.get(authenticatedRequest); break; case QNetworkAccessManager::PostOperation: case QNetworkAccessManager::PutOperation: if (dataMultiPart) { if (operation == QNetworkAccessManager::PostOperation) { - networkReply = _networkAccessManager->post(authenticatedRequest, dataMultiPart); + networkReply = networkAccessManager.post(authenticatedRequest, dataMultiPart); } else { - networkReply = _networkAccessManager->put(authenticatedRequest, dataMultiPart); + networkReply = networkAccessManager.put(authenticatedRequest, dataMultiPart); } dataMultiPart->setParent(networkReply); } else { authenticatedRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); if (operation == QNetworkAccessManager::PostOperation) { - networkReply = _networkAccessManager->post(authenticatedRequest, dataByteArray); + networkReply = networkAccessManager.post(authenticatedRequest, dataByteArray); } else { - networkReply = _networkAccessManager->put(authenticatedRequest, dataByteArray); + networkReply = networkAccessManager.put(authenticatedRequest, dataByteArray); } } @@ -304,9 +301,7 @@ bool AccountManager::checkAndSignalForAccessToken() { void AccountManager::requestAccessToken(const QString& login, const QString& password) { - if (!_networkAccessManager) { - _networkAccessManager = new QNetworkAccessManager(this); - } + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request; @@ -324,7 +319,7 @@ void AccountManager::requestAccessToken(const QString& login, const QString& pas request.setUrl(grantURL); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); - QNetworkReply* requestReply = _networkAccessManager->post(request, postData); + QNetworkReply* requestReply = networkAccessManager.post(request, postData); connect(requestReply, &QNetworkReply::finished, this, &AccountManager::requestAccessTokenFinished); connect(requestReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestAccessTokenError(QNetworkReply::NetworkError))); } @@ -376,15 +371,13 @@ void AccountManager::requestAccessTokenError(QNetworkReply::NetworkError error) } void AccountManager::requestProfile() { - if (!_networkAccessManager) { - _networkAccessManager = new QNetworkAccessManager(this); - } + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QUrl profileURL = _authURL; profileURL.setPath("/api/v1/users/profile"); profileURL.setQuery("access_token=" + _accountInfo.getAccessToken().token); - QNetworkReply* profileReply = _networkAccessManager->get(QNetworkRequest(profileURL)); + QNetworkReply* profileReply = networkAccessManager.get(QNetworkRequest(profileURL)); connect(profileReply, &QNetworkReply::finished, this, &AccountManager::requestProfileFinished); connect(profileReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestProfileError(QNetworkReply::NetworkError))); } diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index c18836ca54..9ac67ee664 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -15,9 +15,10 @@ #include #include #include -#include #include +#include "NetworkAccessManager.h" + #include "DataServerAccountInfo.h" class JSONCallbackParameters { @@ -58,8 +59,6 @@ public: const DataServerAccountInfo& getAccountInfo() const { return _accountInfo; } - void destroy() { delete _networkAccessManager; } - public slots: void requestAccessTokenFinished(); void requestProfileFinished(); @@ -93,7 +92,6 @@ private: QHttpMultiPart* dataMultiPart); QUrl _authURL; - QNetworkAccessManager* _networkAccessManager; QMap _pendingCallbackMap; DataServerAccountInfo _accountInfo; From a9e352981a94de1a0949d1ecc1fa87bc1273b3f9 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 1 Jul 2014 17:59:49 -0700 Subject: [PATCH 22/50] Fix cleanup of resources for UserLocations* --- interface/src/Menu.cpp | 2 +- interface/src/UserLocationsModel.cpp | 6 ++++++ interface/src/UserLocationsModel.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index ae3cc1b77c..c3417144ee 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -1187,7 +1187,7 @@ void Menu::namedLocationCreated(LocationManager::NamedLocationCreateResponse res void Menu::toggleLocationList() { if (!_userLocationsWindow) { - _userLocationsWindow = new UserLocationsWindow(); + _userLocationsWindow = new UserLocationsWindow(Application::getInstance()->getWindow()); } if (_userLocationsWindow->isVisible()) { _userLocationsWindow->hide(); diff --git a/interface/src/UserLocationsModel.cpp b/interface/src/UserLocationsModel.cpp index 824c1269bd..90d6927e1e 100644 --- a/interface/src/UserLocationsModel.cpp +++ b/interface/src/UserLocationsModel.cpp @@ -133,6 +133,11 @@ UserLocationsModel::UserLocationsModel(QObject* parent) : refresh(); } +UserLocationsModel::~UserLocationsModel() { + qDeleteAll(_locations); + _locations.clear(); +} + void UserLocationsModel::update() { beginResetModel(); endResetModel(); @@ -151,6 +156,7 @@ void UserLocationsModel::renameLocation(const QModelIndex& index, const QString& void UserLocationsModel::refresh() { if (!_updating) { beginResetModel(); + qDeleteAll(_locations); _locations.clear(); _updating = true; endResetModel(); diff --git a/interface/src/UserLocationsModel.h b/interface/src/UserLocationsModel.h index 7cf984a8ac..d3f86faa5a 100644 --- a/interface/src/UserLocationsModel.h +++ b/interface/src/UserLocationsModel.h @@ -52,6 +52,7 @@ class UserLocationsModel : public QAbstractListModel { Q_OBJECT public: UserLocationsModel(QObject* parent = NULL); + ~UserLocationsModel(); virtual int rowCount(const QModelIndex& parent = QModelIndex()) const; virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; From aa08577c73c9fc1097f723bd2947e1a0ae814e0a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 1 Jul 2014 17:59:59 -0700 Subject: [PATCH 23/50] Fix long line --- interface/src/UserLocationsModel.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/UserLocationsModel.cpp b/interface/src/UserLocationsModel.cpp index 90d6927e1e..b69d8db748 100644 --- a/interface/src/UserLocationsModel.cpp +++ b/interface/src/UserLocationsModel.cpp @@ -181,7 +181,9 @@ void UserLocationsModel::handleLocationsResponse(const QJsonObject& responseData QJsonObject location = (*it).toObject(); QJsonObject address = location["address"].toObject(); UserLocation* userLocation = new UserLocation(location["id"].toString(), location["name"].toString(), - "hifi://" + address["domain"].toString() + "/" + address["position"].toString() + "/" + address["orientation"].toString()); + "hifi://" + address["domain"].toString() + + "/" + address["position"].toString() + + "/" + address["orientation"].toString()); _locations.append(userLocation); connect(userLocation, &UserLocation::deleted, this, &UserLocationsModel::removeLocation); connect(userLocation, &UserLocation::updated, this, &UserLocationsModel::update); From 83349e0e53e97f7e9e4eca43b23d4abcf2e043ee Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 1 Jul 2014 20:03:05 -0700 Subject: [PATCH 24/50] Rename UserLocationsWindow to UserLocationsDialog --- interface/src/Menu.cpp | 12 +++++----- interface/src/Menu.h | 4 ++-- ...ionsWindow.cpp => UserLocationsDialog.cpp} | 24 +++++++++---------- ...ocationsWindow.h => UserLocationsDialog.h} | 16 ++++++------- ...ationsWindow.ui => userLocationsDialog.ui} | 4 ++-- 5 files changed, 30 insertions(+), 30 deletions(-) rename interface/src/ui/{UserLocationsWindow.cpp => UserLocationsDialog.cpp} (82%) rename interface/src/ui/{UserLocationsWindow.h => UserLocationsDialog.h} (65%) rename interface/ui/{userLocationsWindow.ui => userLocationsDialog.ui} (97%) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index c3417144ee..a1c7ee3c08 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -91,7 +91,7 @@ Menu::Menu() : _jsConsole(NULL), _octreeStatsDialog(NULL), _lodToolsDialog(NULL), - _userLocationsWindow(NULL), + _userLocationsDialog(NULL), _maxVoxels(DEFAULT_MAX_VOXELS_PER_SYSTEM), _voxelSizeScale(DEFAULT_OCTREE_SIZE_SCALE), _oculusUIAngularSize(DEFAULT_OCULUS_UI_ANGULAR_SIZE), @@ -1186,13 +1186,13 @@ void Menu::namedLocationCreated(LocationManager::NamedLocationCreateResponse res } void Menu::toggleLocationList() { - if (!_userLocationsWindow) { - _userLocationsWindow = new UserLocationsWindow(Application::getInstance()->getWindow()); + if (!_userLocationsDialog) { + _userLocationsDialog = new UserLocationsDialog(Application::getInstance()->getWindow()); } - if (_userLocationsWindow->isVisible()) { - _userLocationsWindow->hide(); + if (_userLocationsDialog->isVisible()) { + _userLocationsDialog->hide(); } else { - _userLocationsWindow->show(); + _userLocationsDialog->show(); } } diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 9a5e2f9d43..3112607753 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -29,7 +29,7 @@ #include "ui/JSConsole.h" #include "ui/LoginDialog.h" #include "ui/ScriptEditorWindow.h" -#include "ui/UserLocationsWindow.h" +#include "ui/UserLocationsDialog.h" const float ADJUST_LOD_DOWN_FPS = 40.0; const float ADJUST_LOD_UP_FPS = 55.0; @@ -261,7 +261,7 @@ private: QDialog* _jsConsole; OctreeStatsDialog* _octreeStatsDialog; LodToolsDialog* _lodToolsDialog; - UserLocationsWindow* _userLocationsWindow; + UserLocationsDialog* _userLocationsDialog; int _maxVoxels; float _voxelSizeScale; float _oculusUIAngularSize; diff --git a/interface/src/ui/UserLocationsWindow.cpp b/interface/src/ui/UserLocationsDialog.cpp similarity index 82% rename from interface/src/ui/UserLocationsWindow.cpp rename to interface/src/ui/UserLocationsDialog.cpp index f7e684fc64..f72e66ce77 100644 --- a/interface/src/ui/UserLocationsWindow.cpp +++ b/interface/src/ui/UserLocationsDialog.cpp @@ -1,5 +1,5 @@ // -// UserLocationsWindow.cpp +// UserLocationsDialog.cpp // interface/src/ui // // Created by Ryan Huffman on 06/24/14. @@ -14,9 +14,9 @@ #include #include "Menu.h" -#include "UserLocationsWindow.h" +#include "UserLocationsDialog.h" -UserLocationsWindow::UserLocationsWindow(QWidget* parent) : +UserLocationsDialog::UserLocationsDialog(QWidget* parent) : QDialog(parent), _ui(), _proxyModel(this), @@ -32,30 +32,30 @@ UserLocationsWindow::UserLocationsWindow(QWidget* parent) : _ui.locationsTreeView->sortByColumn(UserLocationsModel::NameColumn, Qt::AscendingOrder); connect(_ui.locationsTreeView->selectionModel(), &QItemSelectionModel::selectionChanged, - this, &UserLocationsWindow::updateEnabled); - connect(&_userLocationsModel, &UserLocationsModel::modelReset, this, &UserLocationsWindow::updateEnabled); + this, &UserLocationsDialog::updateEnabled); + connect(&_userLocationsModel, &UserLocationsModel::modelReset, this, &UserLocationsDialog::updateEnabled); connect(&_userLocationsModel, &UserLocationsModel::modelReset, &_proxyModel, &QSortFilterProxyModel::invalidate); - connect(_ui.locationsTreeView, &QTreeView::doubleClicked, this, &UserLocationsWindow::goToModelIndex); + connect(_ui.locationsTreeView, &QTreeView::doubleClicked, this, &UserLocationsDialog::goToModelIndex); - connect(_ui.deleteButton, &QPushButton::clicked, this, &UserLocationsWindow::deleteSelection); - connect(_ui.renameButton, &QPushButton::clicked, this, &UserLocationsWindow::renameSelection); + connect(_ui.deleteButton, &QPushButton::clicked, this, &UserLocationsDialog::deleteSelection); + connect(_ui.renameButton, &QPushButton::clicked, this, &UserLocationsDialog::renameSelection); connect(_ui.refreshButton, &QPushButton::clicked, &_userLocationsModel, &UserLocationsModel::refresh); this->setWindowTitle("My Locations"); } -void UserLocationsWindow::updateEnabled() { +void UserLocationsDialog::updateEnabled() { bool enabled = _ui.locationsTreeView->selectionModel()->hasSelection(); _ui.renameButton->setEnabled(enabled); _ui.deleteButton->setEnabled(enabled); } -void UserLocationsWindow::goToModelIndex(const QModelIndex& index) { +void UserLocationsDialog::goToModelIndex(const QModelIndex& index) { QVariant location = _proxyModel.data(index.sibling(index.row(), UserLocationsModel::LocationColumn)); Menu::getInstance()->goToURL(location.toString()); } -void UserLocationsWindow::deleteSelection() { +void UserLocationsDialog::deleteSelection() { QModelIndex selection = _ui.locationsTreeView->selectionModel()->currentIndex(); selection = _proxyModel.mapToSource(selection); if (selection.isValid()) { @@ -63,7 +63,7 @@ void UserLocationsWindow::deleteSelection() { } } -void UserLocationsWindow::renameSelection() { +void UserLocationsDialog::renameSelection() { QModelIndex selection = _ui.locationsTreeView->selectionModel()->currentIndex(); selection = _proxyModel.mapToSource(selection); if (selection.isValid()) { diff --git a/interface/src/ui/UserLocationsWindow.h b/interface/src/ui/UserLocationsDialog.h similarity index 65% rename from interface/src/ui/UserLocationsWindow.h rename to interface/src/ui/UserLocationsDialog.h index 215c1957f3..0e596ece87 100644 --- a/interface/src/ui/UserLocationsWindow.h +++ b/interface/src/ui/UserLocationsDialog.h @@ -1,5 +1,5 @@ // -// UserLocationsWindow.h +// UserLocationsDialog.h // interface/src/ui // // Created by Ryan Huffman on 06/24/14. @@ -9,16 +9,16 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#ifndef hifi_UserLocationsWindow_h -#define hifi_UserLocationsWindow_h +#ifndef hifi_UserLocationsDialog_h +#define hifi_UserLocationsDialog_h -#include "ui_userLocationsWindow.h" +#include "ui_userLocationsDialog.h" #include "UserLocationsModel.h" -class UserLocationsWindow : public QDialog { +class UserLocationsDialog : public QDialog { Q_OBJECT public: - UserLocationsWindow(QWidget* parent = NULL); + UserLocationsDialog(QWidget* parent = NULL); protected slots: void updateEnabled(); @@ -27,9 +27,9 @@ protected slots: void renameSelection(); private: - Ui::UserLocationsWindow _ui; + Ui::UserLocationsDialog _ui; QSortFilterProxyModel _proxyModel; UserLocationsModel _userLocationsModel; }; -#endif // hifi_UserLocationsWindow_h +#endif // hifi_UserLocationsDialog_h diff --git a/interface/ui/userLocationsWindow.ui b/interface/ui/userLocationsDialog.ui similarity index 97% rename from interface/ui/userLocationsWindow.ui rename to interface/ui/userLocationsDialog.ui index 61bb0149f8..609ce1c8ab 100644 --- a/interface/ui/userLocationsWindow.ui +++ b/interface/ui/userLocationsDialog.ui @@ -1,7 +1,7 @@ - UserLocationsWindow - + UserLocationsDialog + 0 From f0c013960df8fe1267be7bc7940239b4820f0d3e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 1 Jul 2014 20:05:30 -0700 Subject: [PATCH 25/50] Remove unnecessary qDebug --- interface/src/UserLocationsModel.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/UserLocationsModel.cpp b/interface/src/UserLocationsModel.cpp index b69d8db748..87c81bbcd9 100644 --- a/interface/src/UserLocationsModel.cpp +++ b/interface/src/UserLocationsModel.cpp @@ -56,7 +56,6 @@ void UserLocation::requestRename(const QString& newName) { void UserLocation::handleRenameResponse(const QJsonObject& responseData) { _updating = false; - qDebug() << responseData; QJsonValue status = responseData["status"]; if (!status.isUndefined() && status.toString() == "success") { QString updatedName = responseData["data"].toObject()["name"].toString(); From 67ecde7d312b3652130ef536924bd1616e8df7b1 Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Tue, 1 Jul 2014 21:39:19 -0700 Subject: [PATCH 26/50] Made tree editor voxel world stationary and not crash --- interface/src/Application.cpp | 7 +-- interface/src/devices/OculusManager.cpp | 2 +- interface/src/devices/TV3DManager.cpp | 36 ++++++++++++ interface/src/ui/ApplicationOverlay.cpp | 75 ++++++++++++++++++++++++- interface/src/ui/ApplicationOverlay.h | 1 + 5 files changed, 113 insertions(+), 8 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f21fedabea..b48d35c5e8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -641,13 +641,8 @@ void Application::paintGL() { } } else if (TV3DManager::isConnected()) { - if (glowEnabled) { - _glowEffect.prepare(); - } + TV3DManager::display(whichCamera); - if (glowEnabled) { - _glowEffect.render(); - } } else { if (glowEnabled) { diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index d9549438b5..e156e148ab 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -262,7 +262,7 @@ void OculusManager::display(const glm::quat &bodyOrientation, const glm::vec3 &p ApplicationOverlay& applicationOverlay = Application::getInstance()->getApplicationOverlay(); - // We only need to render the overlays to a texture once, then we just render the texture as a quad + // We only need to render the overlays to a texture once, then we just render the texture on the hemisphere // PrioVR will only work if renderOverlay is called, calibration is connected to Application::renderingOverlay() applicationOverlay.renderOverlay(true); const bool displayOverlays = Menu::getInstance()->isOptionChecked(MenuOption::DisplayOculusOverlays); diff --git a/interface/src/devices/TV3DManager.cpp b/interface/src/devices/TV3DManager.cpp index b5cc28b07f..98fe3ac6d4 100644 --- a/interface/src/devices/TV3DManager.cpp +++ b/interface/src/devices/TV3DManager.cpp @@ -93,6 +93,18 @@ void TV3DManager::display(Camera& whichCamera) { int portalW = Application::getInstance()->getGLWidget()->width() / 2; int portalH = Application::getInstance()->getGLWidget()->height(); + const bool glowEnabled = Menu::getInstance()->isOptionChecked(MenuOption::EnableGlowEffect); + + ApplicationOverlay& applicationOverlay = Application::getInstance()->getApplicationOverlay(); + + // We only need to render the overlays to a texture once, then we just render the texture as a quad + // PrioVR will only work if renderOverlay is called, calibration is connected to Application::renderingOverlay() + applicationOverlay.renderOverlay(true); + + if (glowEnabled) { + Application::getInstance()->getGlowEffect()->prepare(); + } + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_SCISSOR_TEST); @@ -102,13 +114,24 @@ void TV3DManager::display(Camera& whichCamera) { glPushMatrix(); { + glMatrixMode(GL_PROJECTION); glLoadIdentity(); // reset projection matrix glFrustum(_leftEye.left, _leftEye.right, _leftEye.bottom, _leftEye.top, nearZ, farZ); // set left view frustum + GLfloat p[4][4]; + glGetFloatv(GL_PROJECTION_MATRIX, &(p[0][0])); + GLfloat cotangent = p[1][1]; + GLfloat fov = atan(1.0f / cotangent); glTranslatef(_leftEye.modelTranslation, 0.0, 0.0); // translate to cancel parallax + + + printf("FOV %f\n", fov); + glMatrixMode(GL_MODELVIEW); glLoadIdentity(); Application::getInstance()->displaySide(whichCamera); + + applicationOverlay.displayOverlayTexture3DTV(whichCamera, _aspect, fov); } glPopMatrix(); glDisable(GL_SCISSOR_TEST); @@ -124,14 +147,27 @@ void TV3DManager::display(Camera& whichCamera) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); // reset projection matrix glFrustum(_rightEye.left, _rightEye.right, _rightEye.bottom, _rightEye.top, nearZ, farZ); // set left view frustum + GLfloat p[4][4]; + glGetFloatv(GL_PROJECTION_MATRIX, &(p[0][0])); + GLfloat cotangent = p[1][1]; + GLfloat fov = atan(1.0f / cotangent); glTranslatef(_rightEye.modelTranslation, 0.0, 0.0); // translate to cancel parallax + + printf("FOV %f\n", fov); + glMatrixMode(GL_MODELVIEW); glLoadIdentity(); Application::getInstance()->displaySide(whichCamera); + + applicationOverlay.displayOverlayTexture3DTV(whichCamera, _aspect, fov); } glPopMatrix(); glDisable(GL_SCISSOR_TEST); // reset the viewport to how we started glViewport(0, 0, Application::getInstance()->getGLWidget()->width(), Application::getInstance()->getGLWidget()->height()); + + if (glowEnabled) { + Application::getInstance()->getGlowEffect()->render(); + } } diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 77e8986297..07582e2781 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -206,7 +206,7 @@ void ApplicationOverlay::getClickLocation(int &x, int &y) const { } } -// Draws the FBO texture for Oculus rift. TODO: Draw a curved texture instead of plane. +// Draws the FBO texture for Oculus rift. void ApplicationOverlay::displayOverlayTextureOculus(Camera& whichCamera) { if (_alpha == 0.0f) { @@ -293,6 +293,79 @@ void ApplicationOverlay::displayOverlayTextureOculus(Camera& whichCamera) { } +// Draws the FBO texture for 3DTV. +void ApplicationOverlay::displayOverlayTexture3DTV(Camera& whichCamera, float aspectRatio, float fov) { + + if (_alpha == 0.0f) { + return; + } + + Application* application = Application::getInstance(); + + MyAvatar* myAvatar = application->getAvatar(); + const glm::vec3& viewMatrixTranslation = application->getViewMatrixTranslation(); + + glActiveTexture(GL_TEXTURE0); + + glEnable(GL_BLEND); + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); + glBindTexture(GL_TEXTURE_2D, getFramebufferObject()->texture()); + glEnable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + glEnable(GL_TEXTURE_2D); + + glMatrixMode(GL_MODELVIEW); + + glPushMatrix(); + glLoadIdentity(); + // Transform to world space + glm::quat rotation = whichCamera.getRotation(); + glm::vec3 axis2 = glm::axis(rotation); + glRotatef(-glm::degrees(glm::angle(rotation)), axis2.x, axis2.y, axis2.z); + glTranslatef(viewMatrixTranslation.x, viewMatrixTranslation.y, viewMatrixTranslation.z); + + // Translate to the front of the camera + glm::vec3 pos = whichCamera.getPosition(); + glm::quat rot = myAvatar->getOrientation(); + glm::vec3 axis = glm::axis(rot); + + glTranslatef(pos.x, pos.y, pos.z); + glRotatef(glm::degrees(glm::angle(rot)), axis.x, axis.y, axis.z); + + glColor4f(1.0f, 1.0f, 1.0f, _alpha); + + //Render + const GLfloat distance = 1.0f; + + const GLfloat halfQuadHeight = atan(fov) * distance; + const GLfloat halfQuadWidth = halfQuadHeight * aspectRatio; + const GLfloat quadWidth = halfQuadWidth * 2.0f; + const GLfloat quadHeight = halfQuadHeight * 2.0f; + + const GLfloat x = -halfQuadWidth; + const GLfloat y = -halfQuadHeight; + + glBegin(GL_QUADS); + + glTexCoord2f(0.0f, 1.0f); glVertex3f(x, y + quadHeight, -distance); + glTexCoord2f(1.0f, 1.0f); glVertex3f(x + quadWidth, y + quadHeight, -distance); + glTexCoord2f(1.0f, 0.0f); glVertex3f(x + quadWidth, y, -distance); + glTexCoord2f(0.0f, 0.0f); glVertex3f(x, y, -distance); + + glEnd(); + + glPopMatrix(); + + glDepthMask(GL_TRUE); + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); + + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); + glEnable(GL_LIGHTING); + + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); +} + //Renders optional pointers void ApplicationOverlay::renderPointers() { Application* application = Application::getInstance(); diff --git a/interface/src/ui/ApplicationOverlay.h b/interface/src/ui/ApplicationOverlay.h index b9f9596ccf..7c1f87d575 100644 --- a/interface/src/ui/ApplicationOverlay.h +++ b/interface/src/ui/ApplicationOverlay.h @@ -29,6 +29,7 @@ public: void renderOverlay(bool renderToTexture = false); void displayOverlayTexture(); void displayOverlayTextureOculus(Camera& whichCamera); + void displayOverlayTexture3DTV(Camera& whichCamera, float aspectRatio, float fov); void computeOculusPickRay(float x, float y, glm::vec3& direction) const; void getClickLocation(int &x, int &y) const; From 36fb530594e679593310c97ed20748d5336fd519 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 10:26:38 -0700 Subject: [PATCH 27/50] Switched DomainServer to NetworkAccessManager --- assignment-client/src/octree/OctreeServer.cpp | 1 - domain-server/src/DomainServer.cpp | 6 ++---- domain-server/src/DomainServer.h | 2 -- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 23719b86cf..551bed795d 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -10,7 +10,6 @@ // #include -#include #include #include diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 7a2d5f4f99..366a5016f9 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -51,8 +51,6 @@ DomainServer::DomainServer(int argc, char* argv[]) : _argumentVariantMap = HifiConfigVariantMap::mergeCLParametersWithJSONConfig(arguments()); - _networkAccessManager = new QNetworkAccessManager(this); - if (optionallyReadX509KeyAndCertificate() && optionallySetupOAuth() && optionallySetupAssignmentPayment()) { // we either read a certificate and private key or were not passed one // and completed login or did not need to @@ -1196,7 +1194,7 @@ bool DomainServer::handleHTTPSRequest(HTTPSConnection* connection, const QUrl &u QNetworkRequest tokenRequest(tokenRequestUrl); tokenRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); - QNetworkReply* tokenReply = _networkAccessManager->post(tokenRequest, tokenPostBody.toLocal8Bit()); + QNetworkReply* tokenReply = NetworkAccessManager::getInstance().post(tokenRequest, tokenPostBody.toLocal8Bit()); qDebug() << "Requesting a token for user with session UUID" << uuidStringWithoutCurlyBraces(stateUUID); @@ -1233,7 +1231,7 @@ void DomainServer::handleTokenRequestFinished() { profileURL.setPath("/api/v1/users/profile"); profileURL.setQuery(QString("%1=%2").arg(OAUTH_JSON_ACCESS_TOKEN_KEY, accessToken)); - QNetworkReply* profileReply = _networkAccessManager->get(QNetworkRequest(profileURL)); + QNetworkReply* profileReply = NetworkAccessManager::getInstance().get(QNetworkRequest(profileURL)); qDebug() << "Requesting access token for user with session UUID" << uuidStringWithoutCurlyBraces(matchingSessionUUID); diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index 01f44b698e..cc44bd95a8 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -103,8 +103,6 @@ private: bool _isUsingDTLS; - QNetworkAccessManager* _networkAccessManager; - QUrl _oauthProviderURL; QString _oauthClientID; QString _oauthClientSecret; From 6489151578b34b8101e778cc5f533ee67a82b8ed Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 10:28:26 -0700 Subject: [PATCH 28/50] Switch ImageOverlay to NetworkAccessManager --- interface/src/ui/overlays/ImageOverlay.cpp | 16 ++++++---------- interface/src/ui/overlays/ImageOverlay.h | 5 ++--- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index 79b1b23de5..aeea781eb6 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -19,7 +19,6 @@ #include "ImageOverlay.h" ImageOverlay::ImageOverlay() : - _manager(NULL), _textureID(0), _renderImage(false), _textureBound(false), @@ -36,21 +35,18 @@ ImageOverlay::~ImageOverlay() { // TODO: handle setting image multiple times, how do we manage releasing the bound texture? void ImageOverlay::setImageURL(const QUrl& url) { - // TODO: are we creating too many QNetworkAccessManager() when multiple calls to setImageURL are made? - _manager->deleteLater(); - _manager = new QNetworkAccessManager(); - connect(_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); - _manager->get(QNetworkRequest(url)); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + connect(reply, &QNetworkReply::finished, this, &ImageOverlay::replyFinished); } -void ImageOverlay::replyFinished(QNetworkReply* reply) { - +void ImageOverlay::replyFinished() { + QNetworkReply* reply = static_cast(sender()); + // replace our byte array with the downloaded data QByteArray rawData = reply->readAll(); _textureImage.loadFromData(rawData); _renderImage = true; - _manager->deleteLater(); - _manager = NULL; } void ImageOverlay::render() { diff --git a/interface/src/ui/overlays/ImageOverlay.h b/interface/src/ui/overlays/ImageOverlay.h index 613cd95989..633567287d 100644 --- a/interface/src/ui/overlays/ImageOverlay.h +++ b/interface/src/ui/overlays/ImageOverlay.h @@ -16,13 +16,13 @@ #include #include -#include #include #include #include #include #include +#include #include #include "Overlay.h" @@ -46,13 +46,12 @@ public: virtual void setProperties(const QScriptValue& properties); private slots: - void replyFinished(QNetworkReply* reply); // we actually want to hide this... + void replyFinished(); // we actually want to hide this... private: QUrl _imageURL; QImage _textureImage; - QNetworkAccessManager* _manager; GLuint _textureID; QRect _fromImage; // where from in the image to sample From f6221abb71711b7913022fcb09c54425fd2abacb Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 10:52:08 -0700 Subject: [PATCH 29/50] Switch ModelUploader to NetworkAccessManager --- interface/src/ModelUploader.cpp | 2 +- interface/src/ModelUploader.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/src/ModelUploader.cpp b/interface/src/ModelUploader.cpp index 81bca0fc5a..12a4b145cc 100644 --- a/interface/src/ModelUploader.cpp +++ b/interface/src/ModelUploader.cpp @@ -396,7 +396,7 @@ void ModelUploader::uploadFailed(QNetworkReply::NetworkError errorCode, const QS void ModelUploader::checkS3() { qDebug() << "Checking S3 for " << _url; QNetworkRequest request(_url); - QNetworkReply* reply = _networkAccessManager.head(request); + QNetworkReply* reply = NetworkAccessManager::getInstance().head(request); connect(reply, SIGNAL(finished()), SLOT(processCheck())); } diff --git a/interface/src/ModelUploader.h b/interface/src/ModelUploader.h index 634de05640..2596120751 100644 --- a/interface/src/ModelUploader.h +++ b/interface/src/ModelUploader.h @@ -58,7 +58,6 @@ private: bool _readyToSend; QHttpMultiPart* _dataMultiPart; - QNetworkAccessManager _networkAccessManager; int _numberOfChecks; QTimer _timer; From da0021cc8e566a0fe71a567a845e1ed799694e7f Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 10:53:30 -0700 Subject: [PATCH 30/50] Switch ModelsBrowser to NetworkAccessManager --- interface/src/ui/ModelsBrowser.cpp | 18 ++++++++++-------- interface/src/ui/ModelsBrowser.h | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/interface/src/ui/ModelsBrowser.cpp b/interface/src/ui/ModelsBrowser.cpp index 203c54d97a..ec583a14f7 100644 --- a/interface/src/ui/ModelsBrowser.cpp +++ b/interface/src/ui/ModelsBrowser.cpp @@ -14,10 +14,11 @@ #include #include #include -#include #include #include +#include + #include "Application.h" #include "ModelsBrowser.h" @@ -210,10 +211,10 @@ void ModelHandler::update() { } for (int i = 0; i < _model.rowCount(); ++i) { QUrl url(_model.item(i,0)->data(Qt::UserRole).toString()); - QNetworkAccessManager* accessManager = new QNetworkAccessManager(this); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); - accessManager->head(request); - connect(accessManager, SIGNAL(finished(QNetworkReply*)), SLOT(downloadFinished(QNetworkReply*))); + QNetworkReply* reply = networkAccessManager.head(request); + connect(reply, SIGNAL(finished()), SLOT(processCheck())); } _lock.unlock(); } @@ -233,7 +234,8 @@ void ModelHandler::exit() { _lock.unlock(); } -void ModelHandler::downloadFinished(QNetworkReply* reply) { +void ModelHandler::downloadFinished() { + QNetworkReply* reply = static_cast(sender()); QByteArray data = reply->readAll(); if (!data.isEmpty()) { @@ -261,10 +263,10 @@ void ModelHandler::queryNewFiles(QString marker) { // Download url.setQuery(query); - QNetworkAccessManager* accessManager = new QNetworkAccessManager(this); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); - accessManager->get(request); - connect(accessManager, SIGNAL(finished(QNetworkReply*)), SLOT(downloadFinished(QNetworkReply*))); + QNetworkReply* reply = networkAccessManager.get(request); + connect(reply, SIGNAL(finished()), SLOT(processCheck())); } diff --git a/interface/src/ui/ModelsBrowser.h b/interface/src/ui/ModelsBrowser.h index 3e832c9dbe..8063fd8eeb 100644 --- a/interface/src/ui/ModelsBrowser.h +++ b/interface/src/ui/ModelsBrowser.h @@ -43,7 +43,7 @@ public slots: void exit(); private slots: - void downloadFinished(QNetworkReply* reply); + void downloadFinished(); private: bool _initiateExit; From 70121357be57dc557eb7682cfd0e4f31479483a5 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 2 Jul 2014 11:12:06 -0700 Subject: [PATCH 31/50] Update JSONCallbackParameters to take params in constructor --- interface/src/UserLocationsModel.cpp | 16 +++------------- libraries/networking/src/AccountManager.cpp | 16 +++++++++------- libraries/networking/src/AccountManager.h | 4 +++- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/interface/src/UserLocationsModel.cpp b/interface/src/UserLocationsModel.cpp index 87c81bbcd9..e84cae8f95 100644 --- a/interface/src/UserLocationsModel.cpp +++ b/interface/src/UserLocationsModel.cpp @@ -34,11 +34,7 @@ void UserLocation::requestRename(const QString& newName) { if (!_updating && newName.toLower() != _name) { _updating = true; - JSONCallbackParameters callbackParams; - callbackParams.jsonCallbackReceiver = this; - callbackParams.jsonCallbackMethod = "handleRenameResponse"; - callbackParams.errorCallbackReceiver = this; - callbackParams.errorCallbackMethod = "handleRenameError"; + JSONCallbackParameters callbackParams(this, "handleRenameResponse", this, "handleRenameError"); QJsonObject jsonNameObject; jsonNameObject.insert("name", QJsonValue(newName)); QJsonDocument jsonDocument(jsonNameObject); @@ -93,11 +89,7 @@ void UserLocation::requestDelete() { if (!_updating) { _updating = true; - JSONCallbackParameters callbackParams; - callbackParams.jsonCallbackReceiver = this; - callbackParams.jsonCallbackMethod = "handleDeleteResponse"; - callbackParams.errorCallbackReceiver = this; - callbackParams.errorCallbackMethod = "handleDeleteError"; + JSONCallbackParameters callbackParams(this, "handleDeleteResponse", this, "handleDeleteError"); AccountManager::getInstance().authenticatedRequest(PLACES_DELETE.arg(_id), QNetworkAccessManager::DeleteOperation, callbackParams); @@ -160,9 +152,7 @@ void UserLocationsModel::refresh() { _updating = true; endResetModel(); - JSONCallbackParameters callbackParams; - callbackParams.jsonCallbackReceiver = this; - callbackParams.jsonCallbackMethod = "handleLocationsResponse"; + JSONCallbackParameters callbackParams(this, "handleLocationsResponse"); AccountManager::getInstance().authenticatedRequest(PLACES_GET, QNetworkAccessManager::GetOperation, callbackParams); diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 8800686178..ce138e144e 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -37,13 +37,15 @@ Q_DECLARE_METATYPE(JSONCallbackParameters) const QString ACCOUNTS_GROUP = "accounts"; -JSONCallbackParameters::JSONCallbackParameters() : - jsonCallbackReceiver(NULL), - jsonCallbackMethod(), - errorCallbackReceiver(NULL), - errorCallbackMethod(), - updateReciever(NULL), - updateSlot() +JSONCallbackParameters::JSONCallbackParameters(QObject* jsonCallbackReceiver, const QString& jsonCallbackMethod, + QObject* errorCallbackReceiver, const QString& errorCallbackMethod, + QObject* updateReceiver, const QString& updateSlot) : + jsonCallbackReceiver(jsonCallbackReceiver), + jsonCallbackMethod(jsonCallbackMethod), + errorCallbackReceiver(errorCallbackReceiver), + errorCallbackMethod(errorCallbackMethod), + updateReciever(updateReceiver), + updateSlot(updateSlot) { } diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index c18836ca54..389f84e01f 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -22,7 +22,9 @@ class JSONCallbackParameters { public: - JSONCallbackParameters(); + JSONCallbackParameters(QObject* jsonCallbackReceiver = NULL, const QString& jsonCallbackMethod = QString(), + QObject* errorCallbackReceiver = NULL, const QString& errorCallbackMethod = QString(), + QObject* updateReceiver = NULL, const QString& updateSlot = QString()); bool isEmpty() const { return !jsonCallbackReceiver && !errorCallbackReceiver; } From 15b37ec3d1181542fb3c47e4a0efd146ab2cbf79 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 11:21:07 -0700 Subject: [PATCH 32/50] Switched ResourceCache to NetworkAccessManager --- libraries/{shared => networking}/src/ResourceCache.cpp | 8 ++++---- libraries/{shared => networking}/src/ResourceCache.h | 6 ------ 2 files changed, 4 insertions(+), 10 deletions(-) rename libraries/{shared => networking}/src/ResourceCache.cpp (97%) rename libraries/{shared => networking}/src/ResourceCache.h (94%) diff --git a/libraries/shared/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp similarity index 97% rename from libraries/shared/src/ResourceCache.cpp rename to libraries/networking/src/ResourceCache.cpp index 14998232d6..a183e2f9a1 100644 --- a/libraries/shared/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -16,6 +16,8 @@ #include #include +#include "NetworkAccessManager.h" + #include "ResourceCache.h" ResourceCache::ResourceCache(QObject* parent) : @@ -103,8 +105,6 @@ void ResourceCache::requestCompleted(Resource* resource) { } } -QNetworkAccessManager* ResourceCache::_networkAccessManager = NULL; - const int DEFAULT_REQUEST_LIMIT = 10; int ResourceCache::_requestLimit = DEFAULT_REQUEST_LIMIT; @@ -219,7 +219,7 @@ void Resource::init() { if (_url.isEmpty()) { _startedLoading = _loaded = true; - } else if (!(_url.isValid() && ResourceCache::getNetworkAccessManager())) { + } else if (!(_url.isValid())) { _startedLoading = _failedToLoad = true; } } @@ -272,7 +272,7 @@ void Resource::handleReplyTimeout() { } void Resource::makeRequest() { - _reply = ResourceCache::getNetworkAccessManager()->get(_request); + _reply = NetworkAccessManager::getInstance().get(_request); connect(_reply, SIGNAL(downloadProgress(qint64,qint64)), SLOT(handleDownloadProgress(qint64,qint64))); connect(_reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(handleReplyError())); diff --git a/libraries/shared/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h similarity index 94% rename from libraries/shared/src/ResourceCache.h rename to libraries/networking/src/ResourceCache.h index 2404485c46..1593ad45fc 100644 --- a/libraries/shared/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -22,7 +22,6 @@ #include #include -class QNetworkAccessManager; class QNetworkReply; class QTimer; @@ -33,10 +32,6 @@ class ResourceCache : public QObject { Q_OBJECT public: - - static void setNetworkAccessManager(QNetworkAccessManager* manager) { _networkAccessManager = manager; } - static QNetworkAccessManager* getNetworkAccessManager() { return _networkAccessManager; } - static void setRequestLimit(int limit) { _requestLimit = limit; } static int getRequestLimit() { return _requestLimit; } @@ -76,7 +71,6 @@ private: QHash > _resources; int _lastLRUKey; - static QNetworkAccessManager* _networkAccessManager; static int _requestLimit; static QList > _pendingRequests; static QList _loadingRequests; From 602015be661bf21e950248a8338840cd91cfa493 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 11:21:26 -0700 Subject: [PATCH 33/50] Switched ScriptModel to NetworkAccessManager --- interface/src/ScriptsModel.cpp | 16 +++++++++------- interface/src/ScriptsModel.h | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/interface/src/ScriptsModel.cpp b/interface/src/ScriptsModel.cpp index f9ed94f3fa..77a9619d43 100644 --- a/interface/src/ScriptsModel.cpp +++ b/interface/src/ScriptsModel.cpp @@ -11,14 +11,15 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include #include #include #include -#include "ScriptsModel.h" +#include + #include "Menu.h" +#include "ScriptsModel.h" static const QString S3_URL = "http://highfidelity-public.s3-us-west-1.amazonaws.com"; static const QString PUBLIC_URL = "http://public.highfidelity.io"; @@ -113,14 +114,15 @@ void ScriptsModel::requestRemoteFiles(QString marker) { } url.setQuery(query); - QNetworkAccessManager* accessManager = new QNetworkAccessManager(this); - connect(accessManager, SIGNAL(finished(QNetworkReply*)), SLOT(downloadFinished(QNetworkReply*))); - + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); - accessManager->get(request); + QNetworkReply* reply = networkAccessManager.get(request); + connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); + } -void ScriptsModel::downloadFinished(QNetworkReply* reply) { +void ScriptsModel::downloadFinished() { + QNetworkReply* reply = static_cast(sender()); bool finished = true; if (reply->error() == QNetworkReply::NoError) { diff --git a/interface/src/ScriptsModel.h b/interface/src/ScriptsModel.h index 250c7eb9a8..ca72a8d8f4 100644 --- a/interface/src/ScriptsModel.h +++ b/interface/src/ScriptsModel.h @@ -43,7 +43,7 @@ public: protected slots: void updateScriptsLocation(const QString& newPath); - void downloadFinished(QNetworkReply* reply); + void downloadFinished(); void reloadLocalFiles(); void reloadRemoteFiles(); From 9bcd4e7ac85d720a6eda839131e1c257675d5b17 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 11:21:54 -0700 Subject: [PATCH 34/50] Switched ScriptEditorWidget to NetworkAccessManager --- interface/src/ui/ScriptEditorWidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index 513bbd899a..d25408e568 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -148,8 +148,8 @@ void ScriptEditorWidget::loadFile(const QString& scriptPath) { disconnect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished); } } else { - QNetworkAccessManager* networkManager = new QNetworkAccessManager(this); - QNetworkReply* reply = networkManager->get(QNetworkRequest(url)); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); qDebug() << "Downloading included script at" << scriptPath; QEventLoop loop; QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); From 14a2bbb454aff65eb09cec82ff27bbc2f9470387 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 11:22:29 -0700 Subject: [PATCH 35/50] Switched SnapshotShareDialog to NetworkAccessManager --- interface/src/ui/SnapshotShareDialog.cpp | 18 +++--------------- interface/src/ui/SnapshotShareDialog.h | 2 -- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp index 617d5e7101..046aa4d12c 100644 --- a/interface/src/ui/SnapshotShareDialog.cpp +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -40,8 +40,7 @@ Q_DECLARE_METATYPE(QNetworkAccessManager::Operation) SnapshotShareDialog::SnapshotShareDialog(QString fileName, QWidget* parent) : QDialog(parent), - _fileName(fileName), - _networkAccessManager(NULL) + _fileName(fileName) { setAttribute(Qt::WA_DeleteOnClose); @@ -92,10 +91,6 @@ void SnapshotShareDialog::uploadSnapshot() { return; } - if (!_networkAccessManager) { - _networkAccessManager = new QNetworkAccessManager(this); - } - QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QHttpPart apiKeyPart; @@ -118,9 +113,7 @@ void SnapshotShareDialog::uploadSnapshot() { QUrl url(FORUM_UPLOADS_URL); QNetworkRequest request(url); - QNetworkReply* reply = _networkAccessManager->post(request, multiPart); - - + QNetworkReply* reply = NetworkAccessManager::getInstance().post(request, multiPart); connect(reply, &QNetworkReply::finished, this, &SnapshotShareDialog::uploadRequestFinished); QEventLoop loop; @@ -129,11 +122,6 @@ void SnapshotShareDialog::uploadSnapshot() { } void SnapshotShareDialog::sendForumPost(QString snapshotPath) { - - if (!_networkAccessManager) { - _networkAccessManager = new QNetworkAccessManager(this); - } - // post to Discourse forum QNetworkRequest request; QUrl forumUrl(FORUM_POST_URL); @@ -148,7 +136,7 @@ void SnapshotShareDialog::sendForumPost(QString snapshotPath) { request.setUrl(forumUrl); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); - QNetworkReply* requestReply = _networkAccessManager->post(request, postData); + QNetworkReply* requestReply = NetworkAccessManager::getInstance().post(request, postData); connect(requestReply, &QNetworkReply::finished, this, &SnapshotShareDialog::postRequestFinished); QEventLoop loop; diff --git a/interface/src/ui/SnapshotShareDialog.h b/interface/src/ui/SnapshotShareDialog.h index a8795d578a..ced9f2d951 100644 --- a/interface/src/ui/SnapshotShareDialog.h +++ b/interface/src/ui/SnapshotShareDialog.h @@ -14,7 +14,6 @@ #include "ui_shareSnapshot.h" -#include #include #include @@ -26,7 +25,6 @@ public: private: QString _fileName; - QNetworkAccessManager* _networkAccessManager; Ui_SnapshotShareDialog _ui; void uploadSnapshot(); From 2549b0d9465a63718cb26cc1d722c4ab28e2bb09 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 11:22:44 -0700 Subject: [PATCH 36/50] Switched ScriptEngine to NetworkAccessManager --- libraries/script-engine/src/ScriptEngine.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 55b99d6039..daf66dafbe 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -23,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -141,8 +141,8 @@ ScriptEngine::ScriptEngine(const QUrl& scriptURL, emit errorMessage("ERROR Loading file:" + fileName); } } else { - QNetworkAccessManager* networkManager = new QNetworkAccessManager(this); - QNetworkReply* reply = networkManager->get(QNetworkRequest(url)); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); qDebug() << "Downloading included script at" << url; QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); @@ -646,8 +646,8 @@ void ScriptEngine::include(const QString& includeFile) { QString includeContents; if (url.scheme() == "http" || url.scheme() == "ftp") { - QNetworkAccessManager* networkManager = new QNetworkAccessManager(this); - QNetworkReply* reply = networkManager->get(QNetworkRequest(url)); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); qDebug() << "Downloading included script at" << includeFile; QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); From 74e7e0a7bf778b84f2c6be2ee776994e71a428fb Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 11:27:32 -0700 Subject: [PATCH 37/50] Switched XMLHttpRequestClass to NetworkAccessManager --- libraries/script-engine/src/XMLHttpRequestClass.cpp | 5 +++-- libraries/script-engine/src/XMLHttpRequestClass.h | 2 -- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/libraries/script-engine/src/XMLHttpRequestClass.cpp b/libraries/script-engine/src/XMLHttpRequestClass.cpp index a81f8950fa..d9b7312bf4 100644 --- a/libraries/script-engine/src/XMLHttpRequestClass.cpp +++ b/libraries/script-engine/src/XMLHttpRequestClass.cpp @@ -14,6 +14,8 @@ #include +#include + #include "XMLHttpRequestClass.h" XMLHttpRequestClass::XMLHttpRequestClass(QScriptEngine* engine) : @@ -22,7 +24,6 @@ XMLHttpRequestClass::XMLHttpRequestClass(QScriptEngine* engine) : _url(), _method(""), _responseType(""), - _manager(this), _request(), _reply(NULL), _sendData(NULL), @@ -161,7 +162,7 @@ void XMLHttpRequestClass::send(const QString& data) { } void XMLHttpRequestClass::doSend() { - _reply = _manager.sendCustomRequest(_request, _method.toLatin1(), _sendData); + _reply = NetworkAccessManager::getInstance().sendCustomRequest(_request, _method.toLatin1(), _sendData); connectToReply(_reply); diff --git a/libraries/script-engine/src/XMLHttpRequestClass.h b/libraries/script-engine/src/XMLHttpRequestClass.h index 49a952e638..48f1a596e1 100644 --- a/libraries/script-engine/src/XMLHttpRequestClass.h +++ b/libraries/script-engine/src/XMLHttpRequestClass.h @@ -13,7 +13,6 @@ #define hifi_XMLHttpRequestClass_h #include -#include #include #include #include @@ -104,7 +103,6 @@ private: QUrl _url; QString _method; QString _responseType; - QNetworkAccessManager _manager; QNetworkRequest _request; QNetworkReply* _reply; QBuffer* _sendData; From 598c1cb516166cc3a2680d9cad87993804aae7bc Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 11:27:55 -0700 Subject: [PATCH 38/50] Switched Sound to NetworkAccessManager --- interface/src/ui/overlays/TextOverlay.h | 1 - libraries/audio/src/Sound.cpp | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/overlays/TextOverlay.h b/interface/src/ui/overlays/TextOverlay.h index 78a037762e..c2aafb24e8 100644 --- a/interface/src/ui/overlays/TextOverlay.h +++ b/interface/src/ui/overlays/TextOverlay.h @@ -16,7 +16,6 @@ #include #include -#include #include #include #include diff --git a/libraries/audio/src/Sound.cpp b/libraries/audio/src/Sound.cpp index 7ef3afdf29..03c9f6b8ee 100644 --- a/libraries/audio/src/Sound.cpp +++ b/libraries/audio/src/Sound.cpp @@ -15,12 +15,12 @@ #include #include -#include #include #include #include #include +#include #include #include "AudioRingBuffer.h" @@ -73,11 +73,11 @@ Sound::Sound(const QUrl& sampleURL, QObject* parent) : // assume we have a QApplication or QCoreApplication instance and use the // QNetworkAccess manager to grab the raw audio file at the given URL - QNetworkAccessManager *manager = new QNetworkAccessManager(this); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); qDebug() << "Requesting audio file" << sampleURL.toDisplayString(); - QNetworkReply* soundDownload = manager->get(QNetworkRequest(sampleURL)); + QNetworkReply* soundDownload = networkAccessManager.get(QNetworkRequest(sampleURL)); connect(soundDownload, &QNetworkReply::finished, this, &Sound::replyFinished); connect(soundDownload, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(replyError(QNetworkReply::NetworkError))); } From e903b1659a1f79ea2c8ab23644353d198134947d Mon Sep 17 00:00:00 2001 From: Chris Oates Date: Wed, 2 Jul 2014 13:09:16 -0700 Subject: [PATCH 39/50] Implemented Improved Perlin Noise in existing "textured voxels" option. TextureCache.cpp: modified so that permutation texture contains known permutation of 0..255 rather than random set of values. Does not noticeably affect visuals. perlin_modulate.frag: implementation of improved noise, per 2002 SIGGRAPH paper, including "turbulence" summation. --- .../resources/shaders/perlin_modulate.frag | 109 ++++++++++++++++-- interface/src/renderer/TextureCache.cpp | 37 +++++- 2 files changed, 136 insertions(+), 10 deletions(-) diff --git a/interface/resources/shaders/perlin_modulate.frag b/interface/resources/shaders/perlin_modulate.frag index 8693b14e1b..23d31ff72e 100644 --- a/interface/resources/shaders/perlin_modulate.frag +++ b/interface/resources/shaders/perlin_modulate.frag @@ -11,18 +11,114 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// the texture containing our permutations and normals -uniform sampler2D permutationNormalTexture; +// implementation based on Ken Perlin's Improved Noise reference implementation (orig. in Java) at +// http://mrl.nyu.edu/~perlin/noise/ + +uniform sampler2D permutationTexture; // the noise frequency -const float frequency = 65536.0; // looks better with current TREE_SCALE, was 1024 when TREE_SCALE was either 512 or 128 +const float frequency = 256.0; +//const float frequency = 65536.0; // looks better with current TREE_SCALE, was 1024 when TREE_SCALE was either 512 or 128 // the noise amplitude -const float amplitude = 0.1; +const float amplitude = 0.5; // the position in model space varying vec3 position; +// gradient based on gradients from cube edge centers rather than random from texture lookup +float randomEdgeGrad(int hash, vec3 position){ + int h = int(mod(hash, 16)); + float u = h < 8 ? position.x : position.y; + float v = h < 4 ? position.y : h == 12 || h == 14 ? position.x : position.z; + bool even = mod(hash, 2) == 0; + bool four = mod(hash, 4) == 0; + return (even ? u : -u) + (four ? v : -v); +} + +// still have the option to lookup based on texture +float randomTextureGrad(int hash, vec3 position){ + float u = float(hash) / 256.0; + vec3 g = -1 + 2 * texture2D(permutationTexture, vec2(u, 0.75)).rgb; + return dot(position, g); +} + +float improvedGrad(int hash, vec3 position){ +// Untested whether texture lookup is faster than math, uncomment one line or the other to try out +// cube edge gradients versus random spherical gradients sent in texture. + +// return randomTextureGrad(hash, position); + return randomEdgeGrad(hash, position); +} + +// 5th order fade function to remove 2nd order discontinuties +vec3 fade3(vec3 t){ + return t * t * t * (t * (t * 6 - 15) + 10); +} + +int permutation(int index){ + float u = float(index) / 256.0; + float t = texture2D(permutationTexture, vec2(u, 0.25)).r; + return int(t * 256); +} + +float improvedNoise(vec3 position){ + int X = int(mod(floor(position.x), 256)); + int Y = int(mod(floor(position.y), 256)); + int Z = int(mod(floor(position.z), 256)); + + vec3 fracs = fract(position); + + vec3 fades = fade3(fracs); + + int A = permutation(X + 0) + Y; + int AA = permutation(A + 0) + Z; + int AB = permutation(A + 1) + Z; + int B = permutation(X + 1) + Y; + int BA = permutation(B + 0) + Z; + int BB = permutation(B + 1) + Z; + + float gradAA0 = improvedGrad(permutation(AA + 0), vec3(fracs.x , fracs.y , fracs.z )); + float gradBA0 = improvedGrad(permutation(BA + 0), vec3(fracs.x - 1, fracs.y , fracs.z )); + float gradAB0 = improvedGrad(permutation(AB + 0), vec3(fracs.x , fracs.y - 1, fracs.z )); + float gradBB0 = improvedGrad(permutation(BB + 0), vec3(fracs.x - 1, fracs.y - 1, fracs.z )); + float gradAA1 = improvedGrad(permutation(AA + 1), vec3(fracs.x , fracs.y , fracs.z - 1)); + float gradBA1 = improvedGrad(permutation(BA + 1), vec3(fracs.x - 1, fracs.y , fracs.z - 1)); + float gradAB1 = improvedGrad(permutation(AB + 1), vec3(fracs.x , fracs.y - 1, fracs.z - 1)); + float gradBB1 = improvedGrad(permutation(BB + 1), vec3(fracs.x - 1, fracs.y - 1, fracs.z - 1)); + + return mix(mix(mix(gradAA0, gradBA0, fades.x), mix(gradAB0, gradBB0, fades.x), fades.y), mix(mix(gradAA1, gradBA1, fades.x), mix(gradAB1, gradBB1, fades.x), fades.y), fades.z); +} + +float turbulence(vec3 position, float power){ + return (1.0f / power) * improvedNoise(power * position); +} + +float turb(vec3 position){ + return turbulence(position, 1) + + turbulence(position, 2), + + turbulence(position, 4) + + turbulence(position, 8) + + turbulence(position, 16) + + turbulence(position, 32) + + turbulence(position, 64) + + turbulence(position, 128) + ; +} + + +void main(void) { + + // get noise in range 0 .. 1 + float noise = clamp(0.5f + amplitude * turb(position * frequency), 0, 1); + + // apply vertex lighting + vec3 color = gl_Color.rgb * vec3(noise, noise, noise); + gl_FragColor = vec4(color, 1); +} + + +/* old implementation // returns the gradient at a single corner of our sampling cube vec3 grad(vec3 location) { float p1 = texture2D(permutationNormalTexture, vec2(location.x / 256.0, 0.25)).r; @@ -60,7 +156,4 @@ float perlin(vec3 location) { mix(mix(ffcv, cfcv, params.x), mix(fccv, cccv, params.x), params.y), params.z); } - -void main(void) { - gl_FragColor = vec4(gl_Color.rgb * (1.0 + amplitude*(perlin(position * frequency) - 1.0)), 1.0); -} +*/ \ No newline at end of file diff --git a/interface/src/renderer/TextureCache.cpp b/interface/src/renderer/TextureCache.cpp index 0588ca70d2..c792cc59a9 100644 --- a/interface/src/renderer/TextureCache.cpp +++ b/interface/src/renderer/TextureCache.cpp @@ -51,6 +51,33 @@ TextureCache::~TextureCache() { delete _tertiaryFramebufferObject; } +// use fixed table of permutations. Could also make ordered list programmatically +// and then shuffle algorithm. For testing, this ensures consistent behavior in each run. +// this list taken from Ken Perlin's Improved Noise reference implementation (orig. in Java) at +// http://mrl.nyu.edu/~perlin/noise/ + +const int permutation[256] = +{ + 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, + 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, + 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, + 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, + 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, + 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, + 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, + 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, + 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, + 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, + 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, + 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, + 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, + 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, + 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, + 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 +}; + +#define USE_CHRIS_NOISE 0 + GLuint TextureCache::getPermutationNormalTextureID() { if (_permutationNormalTextureID == 0) { glGenTextures(1, &_permutationNormalTextureID); @@ -58,10 +85,17 @@ GLuint TextureCache::getPermutationNormalTextureID() { // the first line consists of random permutation offsets unsigned char data[256 * 2 * 3]; +#if defined(USE_CHRIS_NOISE) + for (int i = 0; i < 256; i++) { + data[3*i+0] = permutation[i]; + data[3*i+1] = permutation[i]; + data[3*i+2] = permutation[i]; +#else for (int i = 0; i < 256 * 3; i++) { data[i] = rand() % 256; +#endif } - // the next, random unit normals + for (int i = 256 * 3; i < 256 * 3 * 2; i += 3) { glm::vec3 randvec = glm::sphericalRand(1.0f); data[i] = ((randvec.x + 1.0f) / 2.0f) * 255.0f; @@ -71,7 +105,6 @@ GLuint TextureCache::getPermutationNormalTextureID() { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glBindTexture(GL_TEXTURE_2D, 0); } return _permutationNormalTextureID; From c79c5df295111060468b6fe991b0be18f0fc5889 Mon Sep 17 00:00:00 2001 From: Chris Oates Date: Wed, 2 Jul 2014 13:50:47 -0700 Subject: [PATCH 40/50] Fixing up #define / #if pair so that permutation table change can be turned of by setting #defined variable to 0 instead of having to comment it out. --- interface/src/renderer/TextureCache.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/renderer/TextureCache.cpp b/interface/src/renderer/TextureCache.cpp index 1352b2c326..01c3dc1cc1 100644 --- a/interface/src/renderer/TextureCache.cpp +++ b/interface/src/renderer/TextureCache.cpp @@ -110,7 +110,7 @@ const int permutation[256] = 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 }; -#define USE_CHRIS_NOISE 0 +#define USE_CHRIS_NOISE 1 GLuint TextureCache::getPermutationNormalTextureID() { if (_permutationNormalTextureID == 0) { @@ -119,7 +119,7 @@ GLuint TextureCache::getPermutationNormalTextureID() { // the first line consists of random permutation offsets unsigned char data[256 * 2 * 3]; -#if defined(USE_CHRIS_NOISE) +#if (USE_CHRIS_NOISE==1) for (int i = 0; i < 256; i++) { data[3*i+0] = permutation[i]; data[3*i+1] = permutation[i]; From bf520d0effdffcfb0456d033f66d666bba09b704 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 14:05:46 -0700 Subject: [PATCH 41/50] Added thread safe implementation of NetworkAccessManager main methods --- .../networking/src/NetworkAccessManager.cpp | 115 +++++++++++++++++- .../networking/src/NetworkAccessManager.h | 11 ++ 2 files changed, 125 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/NetworkAccessManager.cpp b/libraries/networking/src/NetworkAccessManager.cpp index a33817b50d..7c45dc69d5 100644 --- a/libraries/networking/src/NetworkAccessManager.cpp +++ b/libraries/networking/src/NetworkAccessManager.cpp @@ -9,6 +9,9 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include +#include + #include "NetworkAccessManager.h" NetworkAccessManager& NetworkAccessManager::getInstance() { @@ -17,4 +20,114 @@ NetworkAccessManager& NetworkAccessManager::getInstance() { } NetworkAccessManager::NetworkAccessManager() { -} \ No newline at end of file +} + +QNetworkReply* NetworkAccessManager::get(const QNetworkRequest& request) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "get", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request)); + return result; + } + return QNetworkAccessManager::get(request); +} + +QNetworkReply* NetworkAccessManager::head(const QNetworkRequest& request) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "head", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request)); + return result; + } + return QNetworkAccessManager::head(request); +} + +QNetworkReply* NetworkAccessManager::post(const QNetworkRequest& request, QIODevice* data) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "post", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request), + Q_ARG(QIODevice*, data)); + return result; + } + return QNetworkAccessManager::post(request, data); +} + +QNetworkReply* NetworkAccessManager::post(const QNetworkRequest& request, const QByteArray& data) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "post", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request), + Q_ARG(const QByteArray, data)); + return result; + } + return QNetworkAccessManager::post(request, data); +} + +QNetworkReply* NetworkAccessManager::post(const QNetworkRequest& request, QHttpMultiPart* multiPart) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "post", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request), + Q_ARG(QHttpMultiPart*, multiPart)); + return result; + } + return QNetworkAccessManager::post(request, multiPart); +} + +QNetworkReply* NetworkAccessManager::put(const QNetworkRequest& request, QIODevice* data) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "put", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request), + Q_ARG(QIODevice*, data)); + return result; + } + return QNetworkAccessManager::put(request, data); +} + +QNetworkReply* NetworkAccessManager::put(const QNetworkRequest& request, QHttpMultiPart* multiPart) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "put", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request), + Q_ARG(QHttpMultiPart*, multiPart)); + return result; + } + return QNetworkAccessManager::put(request, multiPart); +} + +QNetworkReply* NetworkAccessManager::put(const QNetworkRequest & request, const QByteArray & data) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "put", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request), + Q_ARG(const QByteArray, data)); + return result; + } + return QNetworkAccessManager::put(request, data); +} diff --git a/libraries/networking/src/NetworkAccessManager.h b/libraries/networking/src/NetworkAccessManager.h index c7cc74340a..b1df269022 100644 --- a/libraries/networking/src/NetworkAccessManager.h +++ b/libraries/networking/src/NetworkAccessManager.h @@ -13,12 +13,23 @@ #define hifi_NetworkAccessManager_h #include +#include +#include +/// Wrapper around QNetworkAccessManager wo that we only use one instance class NetworkAccessManager : public QNetworkAccessManager { Q_OBJECT public: static NetworkAccessManager& getInstance(); + Q_INVOKABLE QNetworkReply* get(const QNetworkRequest& request); + Q_INVOKABLE QNetworkReply* head(const QNetworkRequest& request); + Q_INVOKABLE QNetworkReply* post(const QNetworkRequest& request, QIODevice* data); + Q_INVOKABLE QNetworkReply* post(const QNetworkRequest& request, const QByteArray& data); + Q_INVOKABLE QNetworkReply* post(const QNetworkRequest& request, QHttpMultiPart* multiPart); + Q_INVOKABLE QNetworkReply* put(const QNetworkRequest& request, QIODevice* data); + Q_INVOKABLE QNetworkReply* put(const QNetworkRequest& request, QHttpMultiPart* multiPart); + Q_INVOKABLE QNetworkReply* put(const QNetworkRequest& request, const QByteArray& data); private: NetworkAccessManager(); From 84ea9833bb899d2439ea26796b454ef22c53c217 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 14:30:40 -0700 Subject: [PATCH 42/50] Added forgotten sendCustomRequest Method + comments --- .../networking/src/NetworkAccessManager.cpp | 16 ++++++++++++++++ libraries/networking/src/NetworkAccessManager.h | 3 +++ 2 files changed, 19 insertions(+) diff --git a/libraries/networking/src/NetworkAccessManager.cpp b/libraries/networking/src/NetworkAccessManager.cpp index 7c45dc69d5..b9eda27947 100644 --- a/libraries/networking/src/NetworkAccessManager.cpp +++ b/libraries/networking/src/NetworkAccessManager.cpp @@ -131,3 +131,19 @@ QNetworkReply* NetworkAccessManager::put(const QNetworkRequest & request, const } return QNetworkAccessManager::put(request, data); } + + +QNetworkReply* NetworkAccessManager::sendCustomRequest(const QNetworkRequest& request, const QByteArray& verb, QIODevice* data) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "sendCustomRequest", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request), + Q_ARG(const QByteArray, verb), + Q_ARG(QIODevice*, data)); + return result; + } + return QNetworkAccessManager::sendCustomRequest(request, verb, data); +} \ No newline at end of file diff --git a/libraries/networking/src/NetworkAccessManager.h b/libraries/networking/src/NetworkAccessManager.h index b1df269022..ba97f12552 100644 --- a/libraries/networking/src/NetworkAccessManager.h +++ b/libraries/networking/src/NetworkAccessManager.h @@ -17,6 +17,8 @@ #include /// Wrapper around QNetworkAccessManager wo that we only use one instance +/// For any other method you should need, make sure to be on the right thread +/// or call the method using QMetaObject::invokeMethod() class NetworkAccessManager : public QNetworkAccessManager { Q_OBJECT public: @@ -30,6 +32,7 @@ public: Q_INVOKABLE QNetworkReply* put(const QNetworkRequest& request, QIODevice* data); Q_INVOKABLE QNetworkReply* put(const QNetworkRequest& request, QHttpMultiPart* multiPart); Q_INVOKABLE QNetworkReply* put(const QNetworkRequest& request, const QByteArray& data); + Q_INVOKABLE QNetworkReply* sendCustomRequest(const QNetworkRequest& request, const QByteArray& verb, QIODevice* data = 0); private: NetworkAccessManager(); From 1ac38c9884ee83fc3a05b272d70158c8e7e63f1d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 14:31:19 -0700 Subject: [PATCH 43/50] Switched call to setCache to invokeMethod --- assignment-client/src/Agent.cpp | 10 ++++++---- interface/src/Application.cpp | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 1805a414b5..fcd983873d 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -208,12 +208,14 @@ void Agent::run() { scriptURL = QUrl(_payload); } - NetworkAccessManager& networkManager = NetworkAccessManager::getInstance(); - QNetworkReply *reply = networkManager.get(QNetworkRequest(scriptURL)); - QNetworkDiskCache* cache = new QNetworkDiskCache(&networkManager); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkReply *reply = networkAccessManager.get(QNetworkRequest(scriptURL)); + QNetworkDiskCache* cache = new QNetworkDiskCache(&networkAccessManager); QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation); cache->setCacheDirectory(!cachePath.isEmpty() ? cachePath : "agentCache"); - networkManager.setCache(cache); + QMetaObject::invokeMethod(&networkAccessManager, "setCache", + Qt::BlockingQueuedConnection, + Q_ARG(QAbstractNetworkCache*, cache)); qDebug() << "Downloading script at" << scriptURL.toString(); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 10b6fc8165..7193a06125 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -317,7 +317,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkDiskCache* cache = new QNetworkDiskCache(&networkAccessManager); cache->setCacheDirectory(!cachePath.isEmpty() ? cachePath : "interfaceCache"); - networkAccessManager.setCache(cache); + QMetaObject::invokeMethod(&networkAccessManager, "setCache", + Qt::BlockingQueuedConnection, + Q_ARG(QAbstractNetworkCache*, cache)); ResourceCache::setRequestLimit(3); From 90a27bb118dd82e31d2989089e93be9cd746b77d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 15:18:56 -0700 Subject: [PATCH 44/50] Removed json callback --- libraries/networking/src/UserActivityLogger.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/libraries/networking/src/UserActivityLogger.cpp b/libraries/networking/src/UserActivityLogger.cpp index aa18cb43ee..5b20c82263 100644 --- a/libraries/networking/src/UserActivityLogger.cpp +++ b/libraries/networking/src/UserActivityLogger.cpp @@ -83,17 +83,10 @@ void UserActivityLogger::close(int delayTime) { // In order to get the end of the session, we need to give the account manager enough time to send the packet. QEventLoop loop; - // Here we connect the callbacks to stop the event loop - JSONCallbackParameters params; - params.jsonCallbackReceiver = &loop; - params.errorCallbackReceiver = &loop; - params.jsonCallbackMethod = "quit"; - params.errorCallbackMethod = "quit"; - // In case something goes wrong, we also setup a timer so that the delai is not greater than delayTime QTimer timer; connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); // Now we can log it - logAction(ACTION_NAME, QJsonObject(), params); + logAction(ACTION_NAME, QJsonObject()); timer.start(delayTime); loop.exec(); } From 45db5e2c40b610b86a100aa6c9ea82d8b539a5b0 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 15:57:11 -0700 Subject: [PATCH 45/50] Removed Xcode warnings --- interface/src/ScriptsModel.cpp | 2 -- libraries/particles/src/ParticleCollisionSystem.cpp | 1 - 2 files changed, 3 deletions(-) diff --git a/interface/src/ScriptsModel.cpp b/interface/src/ScriptsModel.cpp index f9ed94f3fa..7e57d2971e 100644 --- a/interface/src/ScriptsModel.cpp +++ b/interface/src/ScriptsModel.cpp @@ -30,8 +30,6 @@ static const QString IS_TRUNCATED_NAME = "IsTruncated"; static const QString CONTAINER_NAME = "Contents"; static const QString KEY_NAME = "Key"; -static const int SCRIPT_PATH = Qt::UserRole; - ScriptItem::ScriptItem(const QString& filename, const QString& fullPath) : _filename(filename), _fullPath(fullPath) { diff --git a/libraries/particles/src/ParticleCollisionSystem.cpp b/libraries/particles/src/ParticleCollisionSystem.cpp index d8d5887d97..0291690c3d 100644 --- a/libraries/particles/src/ParticleCollisionSystem.cpp +++ b/libraries/particles/src/ParticleCollisionSystem.cpp @@ -183,7 +183,6 @@ void ParticleCollisionSystem::updateCollisionWithParticles(Particle* particleA) // MIN_VALID_SPEED is obtained by computing speed gained at one gravity after the shortest expected frame const float MIN_EXPECTED_FRAME_PERIOD = 0.0167f; // 1/60th of a second -const float HALTING_SPEED = 9.8 * MIN_EXPECTED_FRAME_PERIOD / (float)(TREE_SCALE); void ParticleCollisionSystem::updateCollisionWithAvatars(Particle* particle) { // particles that are in hand, don't collide with avatars From 1815472c6b99698a5bda5a47916ec3f723d81224 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 16:12:39 -0700 Subject: [PATCH 46/50] Modified recently added case to AccountManager --- libraries/networking/src/AccountManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 7cae1991a9..563d735790 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -205,7 +205,7 @@ void AccountManager::invokedRequest(const QString& path, QNetworkAccessManager:: break; case QNetworkAccessManager::DeleteOperation: - networkReply = _networkAccessManager->sendCustomRequest(authenticatedRequest, "DELETE"); + networkReply = networkAccessManager.sendCustomRequest(authenticatedRequest, "DELETE"); break; default: // other methods not yet handled From a859094d4a6e930aa718ababb89c556c6da80394 Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Wed, 2 Jul 2014 16:40:02 -0700 Subject: [PATCH 47/50] Clickable 3D UI in 3DTV --- interface/src/Application.cpp | 2 +- interface/src/devices/TV3DManager.cpp | 5 ---- interface/src/ui/ApplicationOverlay.cpp | 34 ++++++++++++++++++++++--- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b48d35c5e8..b24c3ac949 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1130,7 +1130,7 @@ void Application::mouseMoveEvent(QMouseEvent* event) { _lastMouseMove = usecTimestampNow(); - if (_mouseHidden && showMouse && !OculusManager::isConnected()) { + if (_mouseHidden && showMouse && !OculusManager::isConnected() && !TV3DManager::isConnected()) { getGLWidget()->setCursor(Qt::ArrowCursor); _mouseHidden = false; _seenMouseMove = true; diff --git a/interface/src/devices/TV3DManager.cpp b/interface/src/devices/TV3DManager.cpp index 98fe3ac6d4..25d3ff892a 100644 --- a/interface/src/devices/TV3DManager.cpp +++ b/interface/src/devices/TV3DManager.cpp @@ -124,9 +124,6 @@ void TV3DManager::display(Camera& whichCamera) { GLfloat fov = atan(1.0f / cotangent); glTranslatef(_leftEye.modelTranslation, 0.0, 0.0); // translate to cancel parallax - - printf("FOV %f\n", fov); - glMatrixMode(GL_MODELVIEW); glLoadIdentity(); Application::getInstance()->displaySide(whichCamera); @@ -153,8 +150,6 @@ void TV3DManager::display(Camera& whichCamera) { GLfloat fov = atan(1.0f / cotangent); glTranslatef(_rightEye.modelTranslation, 0.0, 0.0); // translate to cancel parallax - printf("FOV %f\n", fov); - glMatrixMode(GL_MODELVIEW); glLoadIdentity(); Application::getInstance()->displaySide(whichCamera); diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 07582e2781..44a83e164a 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -335,15 +335,17 @@ void ApplicationOverlay::displayOverlayTexture3DTV(Camera& whichCamera, float as glColor4f(1.0f, 1.0f, 1.0f, _alpha); //Render + // fov -= RADIANS_PER_DEGREE * 2.5f; //reduce by 5 degrees so it fits in the view const GLfloat distance = 1.0f; - const GLfloat halfQuadHeight = atan(fov) * distance; + const GLfloat halfQuadHeight = distance * tan(fov); const GLfloat halfQuadWidth = halfQuadHeight * aspectRatio; const GLfloat quadWidth = halfQuadWidth * 2.0f; const GLfloat quadHeight = halfQuadHeight * 2.0f; - const GLfloat x = -halfQuadWidth; - const GLfloat y = -halfQuadHeight; + GLfloat x = -halfQuadWidth; + GLfloat y = -halfQuadHeight; + glDisable(GL_DEPTH_TEST); glBegin(GL_QUADS); @@ -354,6 +356,32 @@ void ApplicationOverlay::displayOverlayTexture3DTV(Camera& whichCamera, float as glEnd(); + if (_crosshairTexture == 0) { + _crosshairTexture = Application::getInstance()->getGLWidget()->bindTexture(QImage(Application::resourcesPath() + "images/sixense-reticle.png")); + } + + //draw the mouse pointer + glBindTexture(GL_TEXTURE_2D, _crosshairTexture); + + const float reticleSize = 40.0f / application->getGLWidget()->width() * quadWidth; + x -= reticleSize / 2.0f; + y += reticleSize / 2.0f; + const float mouseX = (application->getMouseX() / (float)application->getGLWidget()->width()) * quadWidth; + const float mouseY = (1.0 - (application->getMouseY() / (float)application->getGLWidget()->height())) * quadHeight; + + glBegin(GL_QUADS); + + glColor3f(RETICLE_COLOR[0], RETICLE_COLOR[1], RETICLE_COLOR[2]); + + glTexCoord2d(0.0f, 0.0f); glVertex3f(x + mouseX, y + mouseY, -distance); + glTexCoord2d(1.0f, 0.0f); glVertex3f(x + mouseX + reticleSize, y + mouseY, -distance); + glTexCoord2d(1.0f, 1.0f); glVertex3f(x + mouseX + reticleSize, y + mouseY - reticleSize, -distance); + glTexCoord2d(0.0f, 1.0f); glVertex3f(x + mouseX, y + mouseY - reticleSize, -distance); + + glEnd(); + + glEnable(GL_DEPTH_TEST); + glPopMatrix(); glDepthMask(GL_TRUE); From ee30a446e9f21a84cf27ab2008d09cb84f9c123c Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Wed, 2 Jul 2014 16:45:05 -0700 Subject: [PATCH 48/50] Fixed 3rd person camera for non oculus --- interface/src/Application.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b24c3ac949..ab6d1d1e20 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -586,7 +586,11 @@ void Application::paintGL() { //Note, the camera distance is set in Camera::setMode() so we dont have to do it here. _myCamera.setTightness(0.0f); // Camera is directly connected to head without smoothing _myCamera.setTargetPosition(_myAvatar->getUprightHeadPosition()); - _myCamera.setTargetRotation(_myAvatar->getWorldAlignedOrientation()); + if (OculusManager::isConnected()) { + _myCamera.setTargetRotation(_myAvatar->getWorldAlignedOrientation()); + } else { + _myCamera.setTargetRotation(_myAvatar->getHead()->getOrientation()); + } } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { _myCamera.setTightness(0.0f); From edcf4d04f8f0396c119ca2668969f9c334f47ab7 Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Wed, 2 Jul 2014 17:05:06 -0700 Subject: [PATCH 49/50] Fixed bug when switching from normal view to oculus --- interface/src/Application.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ab6d1d1e20..7cfadc1ff2 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -634,6 +634,10 @@ void Application::paintGL() { //If we aren't using the glow shader, we have to clear the color and depth buffer if (!glowEnabled) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + } else if (OculusManager::isConnected()) { + //Clear the color buffer to ensure that there isnt any residual color + //Left over from when OR was not connected. + glClear(GL_COLOR_BUFFER_BIT); } if (OculusManager::isConnected()) { From 69533c25c2f3d10098566424cbac1e97ae58e88d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 17:54:21 -0700 Subject: [PATCH 50/50] Fix script not being loaded at startup --- interface/src/Application.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0f8fbbae56..6c1982f328 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -398,18 +398,19 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : } Application::~Application() { + qInstallMessageHandler(NULL); + + saveSettings(); + storeSizeAndPosition(); + saveScripts(); + int DELAY_TIME = 1000; UserActivityLogger::getInstance().close(DELAY_TIME); - qInstallMessageHandler(NULL); - // make sure we don't call the idle timer any more delete idleTimer; - + _sharedVoxelSystem.changeTree(new VoxelTree); - - saveSettings(); - delete _voxelImporter; // let the avatar mixer know we're out @@ -432,8 +433,6 @@ Application::~Application() { _particleEditSender.terminate(); _modelEditSender.terminate(); - storeSizeAndPosition(); - saveScripts(); VoxelTreeElement::removeDeleteHook(&_voxels); // we don't need to do this processing on shutdown Menu::getInstance()->deleteLater();