From c1d40fd78158a8eb82ae66beb885b6355cacb2d1 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Wed, 22 Mar 2017 16:25:45 +0000 Subject: [PATCH 01/33] add file placeholder --- scripts/system/avatarBookmarks.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 scripts/system/avatarBookmarks.js diff --git a/scripts/system/avatarBookmarks.js b/scripts/system/avatarBookmarks.js new file mode 100644 index 0000000000..e69de29bb2 From bda1d542095bf8b760a921faf1d793ba6fedeb84 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Fri, 24 Mar 2017 22:58:36 +0000 Subject: [PATCH 02/33] create AvatarBookmarks derive AvatarBookMarks and LocationBookmarks from Bookmarks, first pass at integration, QML issues noted --- .../dialogs/preferences/AvatarPreference.qml | 34 +++- interface/src/Application.cpp | 3 +- interface/src/Application.h | 9 +- interface/src/AvatarBookmarks.cpp | 116 +++++++++++++ interface/src/AvatarBookmarks.h | 38 ++++ interface/src/Bookmarks.cpp | 163 +++++------------- interface/src/Bookmarks.h | 22 +-- interface/src/LocationBookmarks.cpp | 108 ++++++++++++ interface/src/LocationBookmarks.h | 40 +++++ interface/src/Menu.cpp | 6 +- interface/src/Menu.h | 5 +- interface/src/ui/AddressBarDialog.cpp | 2 +- scripts/system/avatarBookmarks.js | 0 13 files changed, 392 insertions(+), 154 deletions(-) create mode 100644 interface/src/AvatarBookmarks.cpp create mode 100644 interface/src/AvatarBookmarks.h create mode 100644 interface/src/LocationBookmarks.cpp create mode 100644 interface/src/LocationBookmarks.h delete mode 100644 scripts/system/avatarBookmarks.js diff --git a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml index 0c5c5bf630..e3db8364f2 100644 --- a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml +++ b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml @@ -15,8 +15,9 @@ import "../../controls-uit" Preference { id: root + objectName: "avatarPreferencesRoot" + signal bookmarkAvatarSignal() property alias text: dataTextField.text - property alias buttonText: button.text property alias placeholderText: dataTextField.placeholderText property var browser; height: control.height + hifi.dimensions.controlInterlineHeight @@ -58,7 +59,7 @@ Preference { right: parent.right bottom: parent.bottom } - height: Math.max(dataTextField.controlHeight, button.height) + height: dataTextField.controlHeight + bookmarkAvatarButton.height + hifi.dimensions.contentSpacing.y TextField { id: dataTextField @@ -67,19 +68,33 @@ Preference { label: root.label anchors { left: parent.left - right: button.left - rightMargin: hifi.dimensions.contentSpacing.x - bottom: parent.bottom + right: parent.right + bottom: bookmarkAvatarButton.top + bottomMargin: hifi.dimensions.contentSpacing.y } colorScheme: hifi.colorSchemes.dark } Button { - id: button - text: "Browse" + id: bookmarkAvatarButton + text: "Bookmark Avatar" + width: 140 anchors { - right: parent.right - verticalCenter: dataTextField.verticalCenter + left: parent.left + bottom: parent.bottom + rightMargin: hifi.dimensions.contentSpacing.x + } + onClicked: root.bookmarkAvatarSignal() + } + + Button { + id: browseAvatarsButton + text: "Browse Avatars" + width: 140 + anchors { + left: bookmarkAvatarButton.right + bottom: parent.bottom + leftMargin: hifi.dimensions.contentSpacing.x } onClicked: { // Load dialog via OffscreenUi so that JavaScript EventBridge is available. @@ -89,5 +104,6 @@ Preference { }); } } + } } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 4b274906e7..33e2d03116 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -691,7 +691,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo usleep(USECS_PER_MSEC * 50); // 20hz } - _bookmarks = new Bookmarks(); // Before setting up the menu + _locationBookmarks = new LocationBookmarks(); // Before setting up the menu + _avatarBookmarks = new AvatarBookmarks(); // start the nodeThread so its event loop is running QThread* nodeThread = new QThread(this); diff --git a/interface/src/Application.h b/interface/src/Application.h index 7ae4160f8b..f07dc5ace6 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -52,7 +52,8 @@ #include "avatar/MyAvatar.h" #include "BandwidthRecorder.h" -#include "Bookmarks.h" +#include "LocationBookmarks.h" +#include "AvatarBookmarks.h" #include "Camera.h" #include "ConnectionMonitor.h" #include "gpu/Context.h" @@ -263,7 +264,8 @@ public: glm::mat4 getEyeProjection(int eye) const; QRect getDesirableApplicationGeometry() const; - Bookmarks* getBookmarks() const { return _bookmarks; } + LocationBookmarks* getLocationBookmarks() const { return _locationBookmarks; } + AvatarBookmarks* getAvatarBookmarks() const { return _avatarBookmarks; } virtual bool canAcceptURL(const QString& url) const override; virtual bool acceptURL(const QString& url, bool defaultUpload = false) override; @@ -596,7 +598,8 @@ private: bool _aboutToQuit; - Bookmarks* _bookmarks; + QPointer _locationBookmarks; + QPointer _avatarBookmarks; bool _notifiedPacketVersionMismatchThisDomain; diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp new file mode 100644 index 0000000000..c799fb9ef2 --- /dev/null +++ b/interface/src/AvatarBookmarks.cpp @@ -0,0 +1,116 @@ +// +// AvatarBookmarks.cpp +// interface/src +// +// Created by Triplelexx on 23/03/17. +// Copyright 2017 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 +#include + +#include "MainWindow.h" +#include "Menu.h" + +#include + +#include "AvatarBookmarks.h" +#include + +AvatarBookmarks::AvatarBookmarks() { + _bookmarksFilename = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/" + AvatarBookmarks_FILENAME; + readFromFile(); +} + +void AvatarBookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { + // Add menus/actions + auto bookmarkAction = menubar->addActionToQMenuAndActionHash(menu, MenuOption::BookmarkAvatar); + QObject::connect(bookmarkAction, SIGNAL(triggered()), this, SLOT(addBookmark()), Qt::QueuedConnection); + _bookmarksMenu = menu->addMenu(MenuOption::AvatarBookmarks); + _deleteBookmarksAction = menubar->addActionToQMenuAndActionHash(menu, MenuOption::DeleteAvatarBookmark); + QObject::connect(_deleteBookmarksAction, SIGNAL(triggered()), this, SLOT(deleteBookmark()), Qt::QueuedConnection); + + Bookmarks::setupMenus(menubar, menu); + + // connect bookmarkAvatarButton in AvatarPreferencesDialog.qml + + // TODO: attempt at connecting to bookmarkAvatarSignal in AvatarPreferencesDialog.qml + // the OffscreenUi doesn't seem available this early to recurse through to find the root object where the signal is declared + // I've added a delay for now + + // The OffscreenUi also doesn't create the object till it is shown first, so I'm forcing it to show so the object exists + QTimer::singleShot(2000, [&] { + auto offscreenUi = DependencyManager::get(); + offscreenUi->show(QString("hifi/dialogs/AvatarPreferencesDialog.qml"), "AvatarPreferencesDialog"); + auto bookmarkAvatarButton = offscreenUi->getRootItem()->findChild("avatarPreferencesRoot"); + if (bookmarkAvatarButton) { + QObject::connect(bookmarkAvatarButton, SIGNAL(bookmarkAvatarSignal()), this, SLOT(addBookmark())); + } + }); +} + +void AvatarBookmarks::changeToBookmarkedAvatar() { + QAction* action = qobject_cast(sender()); + const QString& address = action->data().toString(); + + auto myAvatar = DependencyManager::get()->getMyAvatar(); + myAvatar->useFullAvatarURL(address); +} + +void AvatarBookmarks::addBookmark() { + // TODO: if you press the Bookmark Avatar button in the dialog it seems to maintain focus. + // Clicking afterwards results in multiple calls + // hide enforced till cause is determined + DependencyManager::get()->hide(QString("AvatarPreferencesDialog")); + + bool ok = false; + auto bookmarkName = OffscreenUi::getText(OffscreenUi::ICON_PLACEMARK, "Bookmark Avatar", "Name", QString(), &ok); + if (!ok) { + return; + } + + bookmarkName = bookmarkName.trimmed().replace(QRegExp("(\r\n|[\r\n\t\v ])+"), " "); + if (bookmarkName.length() == 0) { + return; + } + + auto myAvatar = DependencyManager::get()->getMyAvatar(); + const QString& bookmarkAddress = myAvatar->getSkeletonModelURL().toString(); + + Menu* menubar = Menu::getInstance(); + if (contains(bookmarkName)) { + auto offscreenUi = DependencyManager::get(); + auto duplicateBookmarkMessage = offscreenUi->createMessageBox(OffscreenUi::ICON_WARNING, "Duplicate Bookmark", + "The bookmark name you entered already exists in your list.", + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + duplicateBookmarkMessage->setProperty("informativeText", "Would you like to overwrite it?"); + + auto result = offscreenUi->waitForMessageBoxResult(duplicateBookmarkMessage); + if (result != QMessageBox::Yes) { + return; + } + removeBookmarkFromMenu(menubar, bookmarkName); + } + + addBookmarkToMenu(menubar, bookmarkName, bookmarkAddress); + insert(bookmarkName, bookmarkAddress); // Overwrites any item with the same bookmarkName. + + enableMenuItems(true); +} + +void AvatarBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) { + QAction* changeAction = _bookmarksMenu->newAction(); + changeAction->setData(address); + connect(changeAction, SIGNAL(triggered()), this, SLOT(changeToBookmarkedAvatar())); + + menubar->addActionToQMenuAndActionHash(_bookmarksMenu, changeAction, + name, 0, QAction::NoRole); +} diff --git a/interface/src/AvatarBookmarks.h b/interface/src/AvatarBookmarks.h new file mode 100644 index 0000000000..9dfe274f65 --- /dev/null +++ b/interface/src/AvatarBookmarks.h @@ -0,0 +1,38 @@ +// +// AvatarBookmarks.h +// interface/src +// +// Created by Triplelexx on 23/03/17. +// Copyright 2017 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_AvatarBookmarks_h +#define hifi_AvatarBookmarks_h + +#include "Bookmarks.h" + +class AvatarBookmarks: public Bookmarks { + Q_OBJECT + +public: + AvatarBookmarks(); + + virtual void setupMenus(Menu* menubar, MenuWrapper* menu) override; + +public slots: + virtual void addBookmark() override; + +protected: + virtual void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) override; + +private slots: +void changeToBookmarkedAvatar(); + +private: + const QString AvatarBookmarks_FILENAME = "avatarbookmarks.json"; +}; + +#endif // hifi_AvatarBookmarks_h diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index 476925a0c5..d63d3d6bef 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -11,14 +11,10 @@ #include #include -#include -#include #include -#include #include #include -#include #include #include @@ -27,15 +23,47 @@ #include "InterfaceLogging.h" #include "Bookmarks.h" -#include - - -const QString Bookmarks::HOME_BOOKMARK = "Home"; Bookmarks::Bookmarks() { - _bookmarksFilename = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/" + BOOKMARKS_FILENAME; - readFromFile(); +} + +void Bookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { + // Enable/Disable menus as needed + enableMenuItems(_bookmarks.count() > 0); + + // Load Bookmarks + for (auto it = _bookmarks.begin(); it != _bookmarks.end(); ++it) { + QString bookmarkName = it.key(); + QString bookmarkAddress = it.value().toString(); + addBookmarkToMenu(menubar, bookmarkName, bookmarkAddress); + } +} + +void Bookmarks::deleteBookmark() { + QStringList bookmarkList; + QList menuItems = _bookmarksMenu->actions(); + for (int i = 0; i < menuItems.count(); i += 1) { + bookmarkList.append(menuItems[i]->text()); + } + + bool ok = false; + auto bookmarkName = OffscreenUi::getItem(OffscreenUi::ICON_PLACEMARK, "Delete Bookmark", "Select the bookmark to delete", bookmarkList, 0, false, &ok); + if (!ok) { + return; + } + + bookmarkName = bookmarkName.trimmed(); + if (bookmarkName.length() == 0) { + return; + } + + removeBookmarkFromMenu(Menu::getInstance(), bookmarkName); + remove(bookmarkName); + + if (_bookmarksMenu->actions().count() == 0) { + enableMenuItems(false); + } } void Bookmarks::insert(const QString& name, const QString& address) { @@ -99,108 +127,6 @@ void Bookmarks::persistToFile() { saveFile.write(data); } -void Bookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { - // Add menus/actions - auto bookmarkAction = menubar->addActionToQMenuAndActionHash(menu, MenuOption::BookmarkLocation); - QObject::connect(bookmarkAction, SIGNAL(triggered()), this, SLOT(bookmarkLocation()), Qt::QueuedConnection); - auto setHomeAction = menubar->addActionToQMenuAndActionHash(menu, MenuOption::SetHomeLocation); - QObject::connect(setHomeAction, SIGNAL(triggered()), this, SLOT(setHomeLocation()), Qt::QueuedConnection); - _bookmarksMenu = menu->addMenu(MenuOption::Bookmarks); - _deleteBookmarksAction = menubar->addActionToQMenuAndActionHash(menu, MenuOption::DeleteBookmark); - QObject::connect(_deleteBookmarksAction, SIGNAL(triggered()), this, SLOT(deleteBookmark()), Qt::QueuedConnection); - - // Enable/Disable menus as needed - enableMenuItems(_bookmarks.count() > 0); - - // Load bookmarks - for (auto it = _bookmarks.begin(); it != _bookmarks.end(); ++it ) { - QString bookmarkName = it.key(); - QString bookmarkAddress = it.value().toString(); - addLocationToMenu(menubar, bookmarkName, bookmarkAddress); - } -} - -void Bookmarks::bookmarkLocation() { - bool ok = false; - auto bookmarkName = OffscreenUi::getText(OffscreenUi::ICON_PLACEMARK, "Bookmark Location", "Name", QString(), &ok); - if (!ok) { - return; - } - - bookmarkName = bookmarkName.trimmed().replace(QRegExp("(\r\n|[\r\n\t\v ])+"), " "); - if (bookmarkName.length() == 0) { - return; - } - - auto addressManager = DependencyManager::get(); - QString bookmarkAddress = addressManager->currentAddress().toString(); - - Menu* menubar = Menu::getInstance(); - if (contains(bookmarkName)) { - auto offscreenUi = DependencyManager::get(); - auto duplicateBookmarkMessage = offscreenUi->createMessageBox(OffscreenUi::ICON_WARNING, "Duplicate Bookmark", - "The bookmark name you entered already exists in your list.", - QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); - duplicateBookmarkMessage->setProperty("informativeText", "Would you like to overwrite it?"); - - auto result = offscreenUi->waitForMessageBoxResult(duplicateBookmarkMessage); - if (result != QMessageBox::Yes) { - return; - } - removeLocationFromMenu(menubar, bookmarkName); - } - - addLocationToMenu(menubar, bookmarkName, bookmarkAddress); - insert(bookmarkName, bookmarkAddress); // Overwrites any item with the same bookmarkName. - - enableMenuItems(true); -} - -void Bookmarks::setHomeLocation() { - Menu* menubar = Menu::getInstance(); - QString bookmarkName = HOME_BOOKMARK; - auto addressManager = DependencyManager::get(); - QString bookmarkAddress = addressManager->currentAddress().toString(); - - addLocationToMenu(menubar, bookmarkName, bookmarkAddress); - insert(bookmarkName, bookmarkAddress); // Overwrites any item with the same bookmarkName. - - enableMenuItems(true); -} - -void Bookmarks::teleportToBookmark() { - QAction* action = qobject_cast(sender()); - QString address = action->data().toString(); - DependencyManager::get()->handleLookupString(address); -} - -void Bookmarks::deleteBookmark() { - - QStringList bookmarkList; - QList menuItems = _bookmarksMenu->actions(); - for (int i = 0; i < menuItems.count(); i += 1) { - bookmarkList.append(menuItems[i]->text()); - } - - bool ok = false; - auto bookmarkName = OffscreenUi::getItem(OffscreenUi::ICON_PLACEMARK, "Delete Bookmark", "Select the bookmark to delete", bookmarkList, 0, false, &ok); - if (!ok) { - return; - } - - bookmarkName = bookmarkName.trimmed(); - if (bookmarkName.length() == 0) { - return; - } - - removeLocationFromMenu(Menu::getInstance(), bookmarkName); - remove(bookmarkName); - - if (_bookmarksMenu->actions().count() == 0) { - enableMenuItems(false); - } -} - void Bookmarks::enableMenuItems(bool enabled) { if (_bookmarksMenu) { _bookmarksMenu->setEnabled(enabled); @@ -210,17 +136,6 @@ void Bookmarks::enableMenuItems(bool enabled) { } } -void Bookmarks::addLocationToMenu(Menu* menubar, QString& name, QString& address) { - QAction* teleportAction = _bookmarksMenu->newAction(); - teleportAction->setData(address); - connect(teleportAction, SIGNAL(triggered()), this, SLOT(teleportToBookmark())); - - menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, - name, 0, QAction::NoRole); -} - -void Bookmarks::removeLocationFromMenu(Menu* menubar, QString& name) { +void Bookmarks::removeBookmarkFromMenu(Menu* menubar, const QString& name) { menubar->removeAction(_bookmarksMenu, name); } - - diff --git a/interface/src/Bookmarks.h b/interface/src/Bookmarks.h index fd9598b7db..fbc0d41f33 100644 --- a/interface/src/Bookmarks.h +++ b/interface/src/Bookmarks.h @@ -27,25 +27,21 @@ class Bookmarks: public QObject { public: Bookmarks(); - void setupMenus(Menu* menubar, MenuWrapper* menu); - + virtual void setupMenus(Menu* menubar, MenuWrapper* menu); QString addressForBookmark(const QString& name) const; - static const QString HOME_BOOKMARK; +public slots: + virtual void addBookmark() = 0; -private slots: - void bookmarkLocation(); - void setHomeLocation(); - void teleportToBookmark(); +protected slots: void deleteBookmark(); -private: - QVariantMap _bookmarks; // { name: address, ... } +protected: + QVariantMap _bookmarks; // { name: url, ... } QPointer _bookmarksMenu; QPointer _deleteBookmarksAction; - const QString BOOKMARKS_FILENAME = "bookmarks.json"; QString _bookmarksFilename; void insert(const QString& name, const QString& address); // Overwrites any existing entry with same name. @@ -56,8 +52,8 @@ private: void persistToFile(); void enableMenuItems(bool enabled); - void addLocationToMenu(Menu* menubar, QString& name, QString& address); - void removeLocationFromMenu(Menu* menubar, QString& name); + virtual void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) = 0; + void removeBookmarkFromMenu(Menu* menubar, const QString& name); }; -#endif // hifi_Bookmarks_h \ No newline at end of file +#endif // hifi_Bookmarks_h diff --git a/interface/src/LocationBookmarks.cpp b/interface/src/LocationBookmarks.cpp new file mode 100644 index 0000000000..14bee4314c --- /dev/null +++ b/interface/src/LocationBookmarks.cpp @@ -0,0 +1,108 @@ +// +// LocationBookmarks.cpp +// interface/src +// +// Created by Triplelexx on 23/03/17. +// Copyright 2017 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 +#include +#include + +#include "MainWindow.h" +#include "Menu.h" + +#include "LocationBookmarks.h" +#include + +const QString LocationBookmarks::HOME_BOOKMARK = "Home"; + +LocationBookmarks::LocationBookmarks() { + _bookmarksFilename = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/" + LocationBookmarks_FILENAME; + readFromFile(); +} + +void LocationBookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { + // Add menus/actions + auto bookmarkAction = menubar->addActionToQMenuAndActionHash(menu, MenuOption::BookmarkLocation); + QObject::connect(bookmarkAction, SIGNAL(triggered()), this, SLOT(addBookmark()), Qt::QueuedConnection); + auto setHomeAction = menubar->addActionToQMenuAndActionHash(menu, MenuOption::SetHomeLocation); + QObject::connect(setHomeAction, SIGNAL(triggered()), this, SLOT(setHomeLocation()), Qt::QueuedConnection); + _bookmarksMenu = menu->addMenu(MenuOption::LocationBookmarks); + _deleteBookmarksAction = menubar->addActionToQMenuAndActionHash(menu, MenuOption::DeleteBookmark); + QObject::connect(_deleteBookmarksAction, SIGNAL(triggered()), this, SLOT(deleteBookmark()), Qt::QueuedConnection); + + Bookmarks::setupMenus(menubar, menu); +} + +void LocationBookmarks::setHomeLocation() { + Menu* menubar = Menu::getInstance(); + QString bookmarkName = HOME_BOOKMARK; + auto addressManager = DependencyManager::get(); + QString bookmarkAddress = addressManager->currentAddress().toString(); + + addBookmarkToMenu(menubar, bookmarkName, bookmarkAddress); + insert(bookmarkName, bookmarkAddress); // Overwrites any item with the same bookmarkName. + + enableMenuItems(true); +} + +void LocationBookmarks::teleportToBookmark() { + QAction* action = qobject_cast(sender()); + QString address = action->data().toString(); + DependencyManager::get()->handleLookupString(address); +} + +void LocationBookmarks::addBookmark() { + bool ok = false; + auto bookmarkName = OffscreenUi::getText(OffscreenUi::ICON_PLACEMARK, "Bookmark Location", "Name", QString(), &ok); + if (!ok) { + return; + } + + bookmarkName = bookmarkName.trimmed().replace(QRegExp("(\r\n|[\r\n\t\v ])+"), " "); + if (bookmarkName.length() == 0) { + return; + } + + auto addressManager = DependencyManager::get(); + QString bookmarkAddress = addressManager->currentAddress().toString(); + + Menu* menubar = Menu::getInstance(); + if (contains(bookmarkName)) { + auto offscreenUi = DependencyManager::get(); + auto duplicateBookmarkMessage = offscreenUi->createMessageBox(OffscreenUi::ICON_WARNING, "Duplicate Bookmark", + "The bookmark name you entered already exists in your list.", + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + duplicateBookmarkMessage->setProperty("informativeText", "Would you like to overwrite it?"); + + auto result = offscreenUi->waitForMessageBoxResult(duplicateBookmarkMessage); + if (result != QMessageBox::Yes) { + return; + } + removeBookmarkFromMenu(menubar, bookmarkName); + } + + addBookmarkToMenu(menubar, bookmarkName, bookmarkAddress); + insert(bookmarkName, bookmarkAddress); // Overwrites any item with the same bookmarkName. + + enableMenuItems(true); +} + +void LocationBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) { + QAction* teleportAction = _bookmarksMenu->newAction(); + teleportAction->setData(address); + connect(teleportAction, SIGNAL(triggered()), this, SLOT(teleportToBookmark())); + + menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, + name, 0, QAction::NoRole); +} diff --git a/interface/src/LocationBookmarks.h b/interface/src/LocationBookmarks.h new file mode 100644 index 0000000000..19059098e1 --- /dev/null +++ b/interface/src/LocationBookmarks.h @@ -0,0 +1,40 @@ +// +// LocationBookmarks.h +// interface/src +// +// Created by Triplelexx on 23/03/17. +// Copyright 2017 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_LocationBookmarks_h +#define hifi_LocationBookmarks_h + +#include "Bookmarks.h" + +class LocationBookmarks: public Bookmarks { + Q_OBJECT + +public: + LocationBookmarks(); + + virtual void setupMenus(Menu* menubar, MenuWrapper* menu) override; + static const QString HOME_BOOKMARK; + +public slots: + virtual void addBookmark() override; + +protected: + virtual void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) override; + +private slots: + void setHomeLocation(); + void teleportToBookmark(); + +private: + const QString LocationBookmarks_FILENAME = "bookmarks.json"; +}; + +#endif // hifi_LocationBookmarks_h diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index a48ee4e7db..05271e3b4d 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -194,6 +194,8 @@ Menu::Menu() { 0, // QML Qt::Key_Apostrophe, qApp, SLOT(resetSensors())); + // Avatar > AvatarBookmarks related menus -- Note: the AvatarBookmarks class adds its own submenus here. + qApp->getAvatarBookmarks()->setupMenus(this, avatarMenu); // Display menu ---------------------------------- // FIXME - this is not yet matching Alan's spec because it doesn't have @@ -256,8 +258,8 @@ Menu::Menu() { addActionToQMenuAndActionHash(navigateMenu, MenuOption::AddressBar, Qt::CTRL | Qt::Key_L, dialogsManager.data(), SLOT(toggleAddressBar())); - // Navigate > Bookmark related menus -- Note: the Bookmark class adds its own submenus here. - qApp->getBookmarks()->setupMenus(this, navigateMenu); + // Navigate > LocationBookmarks related menus -- Note: the LocationBookmarks class adds its own submenus here. + qApp->getLocationBookmarks()->setupMenus(this, navigateMenu); // Navigate > Copy Address [advanced] auto addressManager = DependencyManager::get(); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index b4eaf56758..7c2ad58b06 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -47,10 +47,11 @@ namespace MenuOption { const QString AudioTools = "Show Level Meter"; const QString AutoMuteAudio = "Auto Mute Microphone"; const QString AvatarReceiveStats = "Show Receive Stats"; + const QString AvatarBookmarks = "Avatar Bookmarks"; const QString Back = "Back"; const QString BinaryEyelidControl = "Binary Eyelid Control"; + const QString BookmarkAvatar = "Bookmark Avatar"; const QString BookmarkLocation = "Bookmark Location"; - const QString Bookmarks = "Bookmarks"; const QString CalibrateCamera = "Calibrate Camera"; const QString CameraEntityMode = "Entity Mode"; const QString CenterPlayerInView = "Center Player In View"; @@ -78,6 +79,7 @@ namespace MenuOption { const QString DeadlockInterface = "Deadlock Interface"; const QString DecreaseAvatarSize = "Decrease Avatar Size"; const QString DefaultSkybox = "Default Skybox"; + const QString DeleteAvatarBookmark = "Delete Avatar Bookmark..."; const QString DeleteBookmark = "Delete Bookmark..."; const QString DisableActivityLogger = "Disable Activity Logger"; const QString DisableEyelidAdjustment = "Disable Eyelid Adjustment"; @@ -89,6 +91,7 @@ namespace MenuOption { const QString DisplayModelElementChildProxies = "Display Model Element Children"; const QString DisplayModelElementProxy = "Display Model Element Bounds"; const QString DisplayDebugTimingDetails = "Display Timing Details"; + const QString LocationBookmarks = "Bookmarks"; const QString DontDoPrecisionPicking = "Don't Do Precision Picking"; const QString DontRenderEntitiesAsScene = "Don't Render Entities as Scene"; const QString EchoLocalAudio = "Echo Local Audio"; diff --git a/interface/src/ui/AddressBarDialog.cpp b/interface/src/ui/AddressBarDialog.cpp index ac566d68c7..0534a9f456 100644 --- a/interface/src/ui/AddressBarDialog.cpp +++ b/interface/src/ui/AddressBarDialog.cpp @@ -52,7 +52,7 @@ void AddressBarDialog::loadAddress(const QString& address, bool fromSuggestions) void AddressBarDialog::loadHome() { qDebug() << "Called LoadHome"; - QString homeLocation = qApp->getBookmarks()->addressForBookmark(Bookmarks::HOME_BOOKMARK); + QString homeLocation = qApp->getLocationBookmarks()->addressForBookmark(LocationBookmarks::HOME_BOOKMARK); const QString DEFAULT_HOME_LOCATION = "localhost"; if (homeLocation == "") { homeLocation = DEFAULT_HOME_LOCATION; diff --git a/scripts/system/avatarBookmarks.js b/scripts/system/avatarBookmarks.js deleted file mode 100644 index e69de29bb2..0000000000 From d1eee19d7dec23f21bfa873d70f848822cc76470 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Sat, 25 Mar 2017 01:01:25 +0000 Subject: [PATCH 03/33] move more Bookmark functionality into base class --- interface/src/AvatarBookmarks.cpp | 25 +++---------------------- interface/src/AvatarBookmarks.h | 8 ++++---- interface/src/Bookmarks.cpp | 22 ++++++++++++++++++++++ interface/src/Bookmarks.h | 2 +- interface/src/LocationBookmarks.cpp | 21 +-------------------- interface/src/LocationBookmarks.h | 6 +++--- 6 files changed, 34 insertions(+), 50 deletions(-) diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp index c799fb9ef2..8afddf1b83 100644 --- a/interface/src/AvatarBookmarks.cpp +++ b/interface/src/AvatarBookmarks.cpp @@ -46,7 +46,7 @@ void AvatarBookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { // the OffscreenUi doesn't seem available this early to recurse through to find the root object where the signal is declared // I've added a delay for now - // The OffscreenUi also doesn't create the object till it is shown first, so I'm forcing it to show so the object exists + // The OffscreenUi also doesn't create the object until it is shown first, so I'm forcing it to show so the object exists QTimer::singleShot(2000, [&] { auto offscreenUi = DependencyManager::get(); offscreenUi->show(QString("hifi/dialogs/AvatarPreferencesDialog.qml"), "AvatarPreferencesDialog"); @@ -68,7 +68,7 @@ void AvatarBookmarks::changeToBookmarkedAvatar() { void AvatarBookmarks::addBookmark() { // TODO: if you press the Bookmark Avatar button in the dialog it seems to maintain focus. // Clicking afterwards results in multiple calls - // hide enforced till cause is determined + // hide enforced until cause is determined DependencyManager::get()->hide(QString("AvatarPreferencesDialog")); bool ok = false; @@ -84,26 +84,7 @@ void AvatarBookmarks::addBookmark() { auto myAvatar = DependencyManager::get()->getMyAvatar(); const QString& bookmarkAddress = myAvatar->getSkeletonModelURL().toString(); - - Menu* menubar = Menu::getInstance(); - if (contains(bookmarkName)) { - auto offscreenUi = DependencyManager::get(); - auto duplicateBookmarkMessage = offscreenUi->createMessageBox(OffscreenUi::ICON_WARNING, "Duplicate Bookmark", - "The bookmark name you entered already exists in your list.", - QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); - duplicateBookmarkMessage->setProperty("informativeText", "Would you like to overwrite it?"); - - auto result = offscreenUi->waitForMessageBoxResult(duplicateBookmarkMessage); - if (result != QMessageBox::Yes) { - return; - } - removeBookmarkFromMenu(menubar, bookmarkName); - } - - addBookmarkToMenu(menubar, bookmarkName, bookmarkAddress); - insert(bookmarkName, bookmarkAddress); // Overwrites any item with the same bookmarkName. - - enableMenuItems(true); + Bookmarks::addBookmark(bookmarkName, bookmarkAddress); } void AvatarBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) { diff --git a/interface/src/AvatarBookmarks.h b/interface/src/AvatarBookmarks.h index 9dfe274f65..6c58ea7861 100644 --- a/interface/src/AvatarBookmarks.h +++ b/interface/src/AvatarBookmarks.h @@ -20,16 +20,16 @@ class AvatarBookmarks: public Bookmarks { public: AvatarBookmarks(); - virtual void setupMenus(Menu* menubar, MenuWrapper* menu) override; + void setupMenus(Menu* menubar, MenuWrapper* menu) override; public slots: - virtual void addBookmark() override; + void addBookmark(); protected: - virtual void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) override; + void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) override; private slots: -void changeToBookmarkedAvatar(); + void changeToBookmarkedAvatar(); private: const QString AvatarBookmarks_FILENAME = "avatarbookmarks.json"; diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index d63d3d6bef..4462cb048c 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -66,6 +66,28 @@ void Bookmarks::deleteBookmark() { } } +void Bookmarks::addBookmark(const QString& bookmarkName, const QString& bookmarkAddress) { + Menu* menubar = Menu::getInstance(); + if (contains(bookmarkName)) { + auto offscreenUi = DependencyManager::get(); + auto duplicateBookmarkMessage = offscreenUi->createMessageBox(OffscreenUi::ICON_WARNING, "Duplicate Bookmark", + "The bookmark name you entered already exists in your list.", + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + duplicateBookmarkMessage->setProperty("informativeText", "Would you like to overwrite it?"); + + auto result = offscreenUi->waitForMessageBoxResult(duplicateBookmarkMessage); + if (result != QMessageBox::Yes) { + return; + } + removeBookmarkFromMenu(menubar, bookmarkName); + } + + addBookmarkToMenu(menubar, bookmarkName, bookmarkAddress); + insert(bookmarkName, bookmarkAddress); // Overwrites any item with the same bookmarkName. + + enableMenuItems(true); +} + void Bookmarks::insert(const QString& name, const QString& address) { _bookmarks.insert(name, address); diff --git a/interface/src/Bookmarks.h b/interface/src/Bookmarks.h index fbc0d41f33..8e6adb6d61 100644 --- a/interface/src/Bookmarks.h +++ b/interface/src/Bookmarks.h @@ -31,7 +31,7 @@ public: QString addressForBookmark(const QString& name) const; public slots: - virtual void addBookmark() = 0; + virtual void addBookmark(const QString& bookmarkName, const QString& bookmarkAddress); protected slots: void deleteBookmark(); diff --git a/interface/src/LocationBookmarks.cpp b/interface/src/LocationBookmarks.cpp index 14bee4314c..52bcc94c9f 100644 --- a/interface/src/LocationBookmarks.cpp +++ b/interface/src/LocationBookmarks.cpp @@ -76,26 +76,7 @@ void LocationBookmarks::addBookmark() { auto addressManager = DependencyManager::get(); QString bookmarkAddress = addressManager->currentAddress().toString(); - - Menu* menubar = Menu::getInstance(); - if (contains(bookmarkName)) { - auto offscreenUi = DependencyManager::get(); - auto duplicateBookmarkMessage = offscreenUi->createMessageBox(OffscreenUi::ICON_WARNING, "Duplicate Bookmark", - "The bookmark name you entered already exists in your list.", - QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); - duplicateBookmarkMessage->setProperty("informativeText", "Would you like to overwrite it?"); - - auto result = offscreenUi->waitForMessageBoxResult(duplicateBookmarkMessage); - if (result != QMessageBox::Yes) { - return; - } - removeBookmarkFromMenu(menubar, bookmarkName); - } - - addBookmarkToMenu(menubar, bookmarkName, bookmarkAddress); - insert(bookmarkName, bookmarkAddress); // Overwrites any item with the same bookmarkName. - - enableMenuItems(true); + Bookmarks::addBookmark(bookmarkName, bookmarkAddress); } void LocationBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) { diff --git a/interface/src/LocationBookmarks.h b/interface/src/LocationBookmarks.h index 19059098e1..40d08e57e9 100644 --- a/interface/src/LocationBookmarks.h +++ b/interface/src/LocationBookmarks.h @@ -20,14 +20,14 @@ class LocationBookmarks: public Bookmarks { public: LocationBookmarks(); - virtual void setupMenus(Menu* menubar, MenuWrapper* menu) override; + void setupMenus(Menu* menubar, MenuWrapper* menu) override; static const QString HOME_BOOKMARK; public slots: - virtual void addBookmark() override; + void addBookmark(); protected: - virtual void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) override; + void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) override; private slots: void setHomeLocation(); From 96f905362b0aefff289be4ac0650503397afae08 Mon Sep 17 00:00:00 2001 From: humbletim Date: Sat, 25 Mar 2017 01:17:27 -0400 Subject: [PATCH 04/33] alternative way to connect the button? --- .../qml/dialogs/preferences/AvatarPreference.qml | 2 +- interface/src/AvatarBookmarks.cpp | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml index e3db8364f2..8c10ffd352 100644 --- a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml +++ b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml @@ -84,7 +84,7 @@ Preference { bottom: parent.bottom rightMargin: hifi.dimensions.contentSpacing.x } - onClicked: root.bookmarkAvatarSignal() + onClicked: { console.info('calling avatarBookmarks.addBookmark'); avatarBookmarks.addBookmark() } } Button { diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp index 8afddf1b83..25fbc5216d 100644 --- a/interface/src/AvatarBookmarks.cpp +++ b/interface/src/AvatarBookmarks.cpp @@ -16,6 +16,7 @@ #include #include +#include #include "MainWindow.h" #include "Menu.h" @@ -46,15 +47,9 @@ void AvatarBookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { // the OffscreenUi doesn't seem available this early to recurse through to find the root object where the signal is declared // I've added a delay for now - // The OffscreenUi also doesn't create the object until it is shown first, so I'm forcing it to show so the object exists - QTimer::singleShot(2000, [&] { - auto offscreenUi = DependencyManager::get(); - offscreenUi->show(QString("hifi/dialogs/AvatarPreferencesDialog.qml"), "AvatarPreferencesDialog"); - auto bookmarkAvatarButton = offscreenUi->getRootItem()->findChild("avatarPreferencesRoot"); - if (bookmarkAvatarButton) { - QObject::connect(bookmarkAvatarButton, SIGNAL(bookmarkAvatarSignal()), this, SLOT(addBookmark())); - } - }); + auto offscreenUi = DependencyManager::get(); + auto context = offscreenUi->getRootContext(); + context->setContextProperty("avatarBookmarks", this); } void AvatarBookmarks::changeToBookmarkedAvatar() { From 630afb716f6d60532ebeb9e25d8884344679eaff Mon Sep 17 00:00:00 2001 From: humbletim Date: Sat, 25 Mar 2017 03:01:35 -0400 Subject: [PATCH 05/33] consolidate QML->C++ triggering workaround to help compartmentalize the problem for later fixin' --- .../resources/qml/controls-uit/Button.qml | 27 ++++++++++++++++++- .../dialogs/preferences/AvatarPreference.qml | 2 +- .../qml/hifi/dialogs/RunningScripts.qml | 27 ++----------------- 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/interface/resources/qml/controls-uit/Button.qml b/interface/resources/qml/controls-uit/Button.qml index 59f8a63238..3755312128 100644 --- a/interface/resources/qml/controls-uit/Button.qml +++ b/interface/resources/qml/controls-uit/Button.qml @@ -23,8 +23,33 @@ Original.Button { HifiConstants { id: hifi } - style: ButtonStyle { + // FIXME: THIS WORKAROUND MIGRATED/CONSOLIDATED FROM RUNNINGSCRIPTS.QML + // For some reason trigginer an API that enters + // an internal event loop directly from the button clicked + // trigger below causes the appliction to behave oddly. + // Most likely because the button onClicked handling is never + // completed until the function returns. + // FIXME find a better way of handling the input dialogs that + // doesn't trigger this. + + // NOTE: dialogs that need to use this workaround can connect via + // onQueuedClicked: ... + // instead of: + // onClicked: ... + + onClicked: fromTimer.running = true + signal queuedClicked() + Timer { + id: fromTimer + interval: 5 + repeat: false + running: false + onTriggered: { console.info('onQueuedClicked->onTriggered'); queuedClicked() } + } + onQueuedClicked: console.info('HifiControls.Button -- please define onClicked: or onQueuedClicked:') + + style: ButtonStyle { background: Rectangle { radius: hifi.buttons.radius diff --git a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml index 8c10ffd352..b98b706c37 100644 --- a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml +++ b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml @@ -84,7 +84,7 @@ Preference { bottom: parent.bottom rightMargin: hifi.dimensions.contentSpacing.x } - onClicked: { console.info('calling avatarBookmarks.addBookmark'); avatarBookmarks.addBookmark() } + onQueuedClicked: avatarBookmarks.addBookmark() } Button { diff --git a/interface/resources/qml/hifi/dialogs/RunningScripts.qml b/interface/resources/qml/hifi/dialogs/RunningScripts.qml index 29807d9646..5321aacd25 100644 --- a/interface/resources/qml/hifi/dialogs/RunningScripts.qml +++ b/interface/resources/qml/hifi/dialogs/RunningScripts.qml @@ -223,37 +223,14 @@ ScrollingWindow { text: "from URL" color: hifi.buttons.black height: 26 - onClicked: fromUrlTimer.running = true - - // For some reason trigginer an API that enters - // an internal event loop directly from the button clicked - // trigger below causes the appliction to behave oddly. - // Most likely because the button onClicked handling is never - // completed until the function returns. - // FIXME find a better way of handling the input dialogs that - // doesn't trigger this. - Timer { - id: fromUrlTimer - interval: 5 - repeat: false - running: false - onTriggered: ApplicationInterface.loadScriptURLDialog(); - } + onQueuedClicked: ApplicationInterface.loadScriptURLDialog() } HifiControls.Button { text: "from Disk" color: hifi.buttons.black height: 26 - onClicked: fromDiskTimer.running = true - - Timer { - id: fromDiskTimer - interval: 5 - repeat: false - running: false - onTriggered: ApplicationInterface.loadDialog(); - } + onQueuedClicked: ApplicationInterface.loadDialog() } HifiControls.Button { From 5d5d947ddbf327cbb62cd67510ae97374d2c13f3 Mon Sep 17 00:00:00 2001 From: humbletim Date: Sat, 25 Mar 2017 04:01:02 -0400 Subject: [PATCH 06/33] updates per discussion with triplelexx --- .../resources/qml/controls-uit/Button.qml | 27 +----------- .../qml/controls-uit/QueuedButton.qml | 43 +++++++++++++++++++ .../dialogs/preferences/AvatarPreference.qml | 4 +- .../qml/hifi/dialogs/RunningScripts.qml | 8 ++-- 4 files changed, 50 insertions(+), 32 deletions(-) create mode 100644 interface/resources/qml/controls-uit/QueuedButton.qml diff --git a/interface/resources/qml/controls-uit/Button.qml b/interface/resources/qml/controls-uit/Button.qml index 3755312128..59f8a63238 100644 --- a/interface/resources/qml/controls-uit/Button.qml +++ b/interface/resources/qml/controls-uit/Button.qml @@ -23,33 +23,8 @@ Original.Button { HifiConstants { id: hifi } - // FIXME: THIS WORKAROUND MIGRATED/CONSOLIDATED FROM RUNNINGSCRIPTS.QML - - // For some reason trigginer an API that enters - // an internal event loop directly from the button clicked - // trigger below causes the appliction to behave oddly. - // Most likely because the button onClicked handling is never - // completed until the function returns. - // FIXME find a better way of handling the input dialogs that - // doesn't trigger this. - - // NOTE: dialogs that need to use this workaround can connect via - // onQueuedClicked: ... - // instead of: - // onClicked: ... - - onClicked: fromTimer.running = true - signal queuedClicked() - Timer { - id: fromTimer - interval: 5 - repeat: false - running: false - onTriggered: { console.info('onQueuedClicked->onTriggered'); queuedClicked() } - } - onQueuedClicked: console.info('HifiControls.Button -- please define onClicked: or onQueuedClicked:') - style: ButtonStyle { + background: Rectangle { radius: hifi.buttons.radius diff --git a/interface/resources/qml/controls-uit/QueuedButton.qml b/interface/resources/qml/controls-uit/QueuedButton.qml new file mode 100644 index 0000000000..36ffbe582f --- /dev/null +++ b/interface/resources/qml/controls-uit/QueuedButton.qml @@ -0,0 +1,43 @@ +// +// QueuedButton.qml +// -- original Button.qml + signal timer workaround --ht +// Created by David Rowe on 16 Feb 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 as Original +import QtQuick.Controls.Styles 1.4 + +import "../styles-uit" +import "." as HifiControls + +HifiControls.Button { + // FIXME: THIS WORKAROUND MIGRATED/CONSOLIDATED FROM RUNNINGSCRIPTS.QML + + // For some reason trigginer an API that enters + // an internal event loop directly from the button clicked + // trigger below causes the appliction to behave oddly. + // Most likely because the button onClicked handling is never + // completed until the function returns. + // FIXME find a better way of handling the input dialogs that + // doesn't trigger this. + + // NOTE: dialogs that need to use this workaround can connect via + // onQueuedClicked: ... + // instead of: + // onClicked: ... + + signal clickedQueued() + Timer { + id: fromTimer + interval: 5 + repeat: false + running: false + onTriggered: clickedQueued() + } + onClicked: fromTimer.running = true +} diff --git a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml index b98b706c37..9e2ac34c64 100644 --- a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml +++ b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml @@ -75,7 +75,7 @@ Preference { colorScheme: hifi.colorSchemes.dark } - Button { + QueuedButton { id: bookmarkAvatarButton text: "Bookmark Avatar" width: 140 @@ -84,7 +84,7 @@ Preference { bottom: parent.bottom rightMargin: hifi.dimensions.contentSpacing.x } - onQueuedClicked: avatarBookmarks.addBookmark() + onClickedQueued: avatarBookmarks.addBookmark() } Button { diff --git a/interface/resources/qml/hifi/dialogs/RunningScripts.qml b/interface/resources/qml/hifi/dialogs/RunningScripts.qml index 5321aacd25..d95dbc2e55 100644 --- a/interface/resources/qml/hifi/dialogs/RunningScripts.qml +++ b/interface/resources/qml/hifi/dialogs/RunningScripts.qml @@ -219,18 +219,18 @@ ScrollingWindow { Row { spacing: hifi.dimensions.contentSpacing.x - HifiControls.Button { + HifiControls.QueuedButton { text: "from URL" color: hifi.buttons.black height: 26 - onQueuedClicked: ApplicationInterface.loadScriptURLDialog() + onClickedQueued: ApplicationInterface.loadScriptURLDialog() } - HifiControls.Button { + HifiControls.QueuedButton { text: "from Disk" color: hifi.buttons.black height: 26 - onQueuedClicked: ApplicationInterface.loadDialog() + onClickedQueued: ApplicationInterface.loadDialog() } HifiControls.Button { From c4bcacf0e056b8850bb63a9e5746ef7cf4b05587 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Sat, 25 Mar 2017 19:04:40 +0000 Subject: [PATCH 07/33] use QueuedButton for upload dialog --- interface/resources/qml/AssetServer.qml | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/interface/resources/qml/AssetServer.qml b/interface/resources/qml/AssetServer.qml index cf61a2ae4a..0e096cde22 100644 --- a/interface/resources/qml/AssetServer.qml +++ b/interface/resources/qml/AssetServer.qml @@ -542,7 +542,7 @@ ScrollingWindow { Item { height: parent.height width: parent.width - HifiControls.Button { + HifiControls.QueuedButton { id: uploadButton anchors.right: parent.right @@ -552,22 +552,7 @@ ScrollingWindow { height: 30 width: 155 - onClicked: uploadClickedTimer.running = true - - // For some reason trigginer an API that enters - // an internal event loop directly from the button clicked - // trigger below causes the appliction to behave oddly. - // Most likely because the button onClicked handling is never - // completed until the function returns. - // FIXME find a better way of handling the input dialogs that - // doesn't trigger this. - Timer { - id: uploadClickedTimer - interval: 5 - repeat: false - running: false - onTriggered: uploadClicked(); - } + onClickedQueued: uploadClicked() } Item { From 8f507942cffbc653d0957126b9163ef6fa1f3c1a Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Sat, 25 Mar 2017 19:10:12 +0000 Subject: [PATCH 08/33] change storage location still unsure what is best. this is consistent and doesn't require login --- .../resources/qml/dialogs/preferences/AvatarPreference.qml | 2 -- interface/src/AvatarBookmarks.cpp | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml index 9e2ac34c64..9a2d9f3edb 100644 --- a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml +++ b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml @@ -15,8 +15,6 @@ import "../../controls-uit" Preference { id: root - objectName: "avatarPreferencesRoot" - signal bookmarkAvatarSignal() property alias text: dataTextField.text property alias placeholderText: dataTextField.placeholderText property var browser; diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp index 25fbc5216d..4dba46b266 100644 --- a/interface/src/AvatarBookmarks.cpp +++ b/interface/src/AvatarBookmarks.cpp @@ -27,7 +27,7 @@ #include AvatarBookmarks::AvatarBookmarks() { - _bookmarksFilename = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/" + AvatarBookmarks_FILENAME; + _bookmarksFilename = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/" + AvatarBookmarks_FILENAME; readFromFile(); } From a1db20c5fcd0d06440ead35896a0316265d9b88c Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Sun, 26 Mar 2017 22:18:37 +0100 Subject: [PATCH 09/33] cleanup for QA added sorting --- interface/src/AvatarBookmarks.cpp | 20 ++++---------------- interface/src/AvatarBookmarks.h | 6 +++--- interface/src/Bookmarks.cpp | 17 +++++++++++++++-- interface/src/Bookmarks.h | 22 ++++++++++++---------- interface/src/LocationBookmarks.cpp | 17 ++++++----------- interface/src/LocationBookmarks.h | 6 +++--- 6 files changed, 43 insertions(+), 45 deletions(-) diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp index 4dba46b266..69559cc5c9 100644 --- a/interface/src/AvatarBookmarks.cpp +++ b/interface/src/AvatarBookmarks.cpp @@ -13,16 +13,15 @@ #include #include #include +#include #include #include -#include +#include #include "MainWindow.h" #include "Menu.h" -#include - #include "AvatarBookmarks.h" #include @@ -41,12 +40,6 @@ void AvatarBookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { Bookmarks::setupMenus(menubar, menu); - // connect bookmarkAvatarButton in AvatarPreferencesDialog.qml - - // TODO: attempt at connecting to bookmarkAvatarSignal in AvatarPreferencesDialog.qml - // the OffscreenUi doesn't seem available this early to recurse through to find the root object where the signal is declared - // I've added a delay for now - auto offscreenUi = DependencyManager::get(); auto context = offscreenUi->getRootContext(); context->setContextProperty("avatarBookmarks", this); @@ -61,11 +54,6 @@ void AvatarBookmarks::changeToBookmarkedAvatar() { } void AvatarBookmarks::addBookmark() { - // TODO: if you press the Bookmark Avatar button in the dialog it seems to maintain focus. - // Clicking afterwards results in multiple calls - // hide enforced until cause is determined - DependencyManager::get()->hide(QString("AvatarPreferencesDialog")); - bool ok = false; auto bookmarkName = OffscreenUi::getText(OffscreenUi::ICON_PLACEMARK, "Bookmark Avatar", "Name", QString(), &ok); if (!ok) { @@ -87,6 +75,6 @@ void AvatarBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, cons changeAction->setData(address); connect(changeAction, SIGNAL(triggered()), this, SLOT(changeToBookmarkedAvatar())); - menubar->addActionToQMenuAndActionHash(_bookmarksMenu, changeAction, - name, 0, QAction::NoRole); + menubar->addActionToQMenuAndActionHash(_bookmarksMenu, changeAction, name, 0, QAction::NoRole); + Bookmarks::sortActions(_bookmarksMenu); } diff --git a/interface/src/AvatarBookmarks.h b/interface/src/AvatarBookmarks.h index 6c58ea7861..78f2930106 100644 --- a/interface/src/AvatarBookmarks.h +++ b/interface/src/AvatarBookmarks.h @@ -28,11 +28,11 @@ public slots: protected: void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) override; -private slots: - void changeToBookmarkedAvatar(); - private: const QString AvatarBookmarks_FILENAME = "avatarbookmarks.json"; + +private slots: + void changeToBookmarkedAvatar(); }; #endif // hifi_AvatarBookmarks_h diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index 4462cb048c..0e0dbb58c1 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -24,7 +24,6 @@ #include "Bookmarks.h" - Bookmarks::Bookmarks() { } @@ -84,7 +83,6 @@ void Bookmarks::addBookmark(const QString& bookmarkName, const QString& bookmark addBookmarkToMenu(menubar, bookmarkName, bookmarkAddress); insert(bookmarkName, bookmarkAddress); // Overwrites any item with the same bookmarkName. - enableMenuItems(true); } @@ -114,6 +112,21 @@ bool Bookmarks::contains(const QString& name) const { return _bookmarks.contains(name); } +bool Bookmarks::sortOrder(QAction* a, QAction* b) { + return a->text().toLower() < b->text().toLower(); +} + +void Bookmarks::sortActions(MenuWrapper* menuWrapper) { + QList tmpActions = menuWrapper->actions(); + qSort(tmpActions.begin(), tmpActions.end(), sortOrder); + for (QAction* action : menuWrapper->actions()) { + menuWrapper->removeAction(action); + } + for (QAction* action : tmpActions) { + menuWrapper->addAction(action); + } +} + QString Bookmarks::addressForBookmark(const QString& name) const { return _bookmarks.value(name).toString(); } diff --git a/interface/src/Bookmarks.h b/interface/src/Bookmarks.h index 8e6adb6d61..d998a201ae 100644 --- a/interface/src/Bookmarks.h +++ b/interface/src/Bookmarks.h @@ -33,26 +33,28 @@ public: public slots: virtual void addBookmark(const QString& bookmarkName, const QString& bookmarkAddress); -protected slots: - void deleteBookmark(); - protected: + virtual void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) = 0; + void enableMenuItems(bool enabled); + void readFromFile(); + void insert(const QString& name, const QString& address); // Overwrites any existing entry with same name. + void sortActions(MenuWrapper* menuWrapper); + QVariantMap _bookmarks; // { name: url, ... } - QPointer _bookmarksMenu; QPointer _deleteBookmarksAction; - QString _bookmarksFilename; - - void insert(const QString& name, const QString& address); // Overwrites any existing entry with same name. + +protected slots: + void deleteBookmark(); + +private: void remove(const QString& name); bool contains(const QString& name) const; + static bool sortOrder(QAction* a, QAction* b); - void readFromFile(); void persistToFile(); - void enableMenuItems(bool enabled); - virtual void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) = 0; void removeBookmarkFromMenu(Menu* menubar, const QString& name); }; diff --git a/interface/src/LocationBookmarks.cpp b/interface/src/LocationBookmarks.cpp index 52bcc94c9f..7b39ed2926 100644 --- a/interface/src/LocationBookmarks.cpp +++ b/interface/src/LocationBookmarks.cpp @@ -40,20 +40,15 @@ void LocationBookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { _bookmarksMenu = menu->addMenu(MenuOption::LocationBookmarks); _deleteBookmarksAction = menubar->addActionToQMenuAndActionHash(menu, MenuOption::DeleteBookmark); QObject::connect(_deleteBookmarksAction, SIGNAL(triggered()), this, SLOT(deleteBookmark()), Qt::QueuedConnection); - + Bookmarks::setupMenus(menubar, menu); } void LocationBookmarks::setHomeLocation() { - Menu* menubar = Menu::getInstance(); - QString bookmarkName = HOME_BOOKMARK; auto addressManager = DependencyManager::get(); QString bookmarkAddress = addressManager->currentAddress().toString(); - - addBookmarkToMenu(menubar, bookmarkName, bookmarkAddress); - insert(bookmarkName, bookmarkAddress); // Overwrites any item with the same bookmarkName. - - enableMenuItems(true); + Bookmarks::addBookmark(HOME_BOOKMARK, bookmarkAddress); + Bookmarks::sortActions(_bookmarksMenu); } void LocationBookmarks::teleportToBookmark() { @@ -83,7 +78,7 @@ void LocationBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, co QAction* teleportAction = _bookmarksMenu->newAction(); teleportAction->setData(address); connect(teleportAction, SIGNAL(triggered()), this, SLOT(teleportToBookmark())); - - menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, - name, 0, QAction::NoRole); + + menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, name, 0, QAction::NoRole); + Bookmarks::sortActions(_bookmarksMenu); } diff --git a/interface/src/LocationBookmarks.h b/interface/src/LocationBookmarks.h index 40d08e57e9..d1eeb87329 100644 --- a/interface/src/LocationBookmarks.h +++ b/interface/src/LocationBookmarks.h @@ -29,12 +29,12 @@ public slots: protected: void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) override; +private: + const QString LocationBookmarks_FILENAME = "bookmarks.json"; + private slots: void setHomeLocation(); void teleportToBookmark(); - -private: - const QString LocationBookmarks_FILENAME = "bookmarks.json"; }; #endif // hifi_LocationBookmarks_h From 07e6b766b564307f6d261d9bed8d0a27cc01c7b1 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Sun, 26 Mar 2017 23:10:50 +0100 Subject: [PATCH 10/33] rename FILENAME constants --- .../qml/dialogs/preferences/AvatarPreference.qml | 12 ++++++++---- interface/src/AvatarBookmarks.cpp | 2 +- interface/src/AvatarBookmarks.h | 2 +- interface/src/LocationBookmarks.cpp | 2 +- interface/src/LocationBookmarks.h | 2 +- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml index 9a2d9f3edb..c176370717 100644 --- a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml +++ b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml @@ -61,22 +61,26 @@ Preference { TextField { id: dataTextField + label: root.label placeholderText: root.placeholderText text: preference.value - label: root.label + colorScheme: dataTextField.acceptableInput ? hifi.colorSchemes.dark : hifi.colorSchemes.light + validator: RegExpValidator { + regExp: /.*\.(?:fst).*\?*/ig + } anchors { left: parent.left right: parent.right bottom: bookmarkAvatarButton.top bottomMargin: hifi.dimensions.contentSpacing.y } - colorScheme: hifi.colorSchemes.dark } QueuedButton { id: bookmarkAvatarButton text: "Bookmark Avatar" width: 140 + visible: dataTextField.acceptableInput anchors { left: parent.left bottom: parent.bottom @@ -90,9 +94,9 @@ Preference { text: "Browse Avatars" width: 140 anchors { - left: bookmarkAvatarButton.right + left: dataTextField.acceptableInput ? bookmarkAvatarButton.right : parent.left bottom: parent.bottom - leftMargin: hifi.dimensions.contentSpacing.x + leftMargin: dataTextField.acceptableInput ? hifi.dimensions.contentSpacing.x : 0 } onClicked: { // Load dialog via OffscreenUi so that JavaScript EventBridge is available. diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp index 69559cc5c9..b45a262093 100644 --- a/interface/src/AvatarBookmarks.cpp +++ b/interface/src/AvatarBookmarks.cpp @@ -26,7 +26,7 @@ #include AvatarBookmarks::AvatarBookmarks() { - _bookmarksFilename = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/" + AvatarBookmarks_FILENAME; + _bookmarksFilename = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/" + AVATARBOOKMARKS_FILENAME; readFromFile(); } diff --git a/interface/src/AvatarBookmarks.h b/interface/src/AvatarBookmarks.h index 78f2930106..958e0e891c 100644 --- a/interface/src/AvatarBookmarks.h +++ b/interface/src/AvatarBookmarks.h @@ -29,7 +29,7 @@ protected: void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) override; private: - const QString AvatarBookmarks_FILENAME = "avatarbookmarks.json"; + const QString AVATARBOOKMARKS_FILENAME = "avatarbookmarks.json"; private slots: void changeToBookmarkedAvatar(); diff --git a/interface/src/LocationBookmarks.cpp b/interface/src/LocationBookmarks.cpp index 7b39ed2926..f9719db18d 100644 --- a/interface/src/LocationBookmarks.cpp +++ b/interface/src/LocationBookmarks.cpp @@ -27,7 +27,7 @@ const QString LocationBookmarks::HOME_BOOKMARK = "Home"; LocationBookmarks::LocationBookmarks() { - _bookmarksFilename = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/" + LocationBookmarks_FILENAME; + _bookmarksFilename = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/" + LOCATIONBOOKMARKS_FILENAME; readFromFile(); } diff --git a/interface/src/LocationBookmarks.h b/interface/src/LocationBookmarks.h index d1eeb87329..b762a0be9d 100644 --- a/interface/src/LocationBookmarks.h +++ b/interface/src/LocationBookmarks.h @@ -30,7 +30,7 @@ protected: void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) override; private: - const QString LocationBookmarks_FILENAME = "bookmarks.json"; + const QString LOCATIONBOOKMARKS_FILENAME = "bookmarks.json"; private slots: void setHomeLocation(); From 255e781cc7ca796e620ea84da54b86a99df17103 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Wed, 29 Mar 2017 00:48:14 +0100 Subject: [PATCH 11/33] check-in after menu experiments https://highfidelity.fogbugz.com/f/cases/3714 --- interface/src/AvatarBookmarks.cpp | 16 +++++++++++--- interface/src/Bookmarks.cpp | 34 ++++++++++++++++++++++++----- interface/src/Bookmarks.h | 5 ++++- interface/src/LocationBookmarks.cpp | 16 +++++++++++--- 4 files changed, 58 insertions(+), 13 deletions(-) diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp index b45a262093..a794c147c3 100644 --- a/interface/src/AvatarBookmarks.cpp +++ b/interface/src/AvatarBookmarks.cpp @@ -14,6 +14,7 @@ #include #include #include +//#include #include #include @@ -39,7 +40,7 @@ void AvatarBookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { QObject::connect(_deleteBookmarksAction, SIGNAL(triggered()), this, SLOT(deleteBookmark()), Qt::QueuedConnection); Bookmarks::setupMenus(menubar, menu); - + Bookmarks::sortActions(menubar, _bookmarksMenu); auto offscreenUi = DependencyManager::get(); auto context = offscreenUi->getRootContext(); context->setContextProperty("avatarBookmarks", this); @@ -74,7 +75,16 @@ void AvatarBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, cons QAction* changeAction = _bookmarksMenu->newAction(); changeAction->setData(address); connect(changeAction, SIGNAL(triggered()), this, SLOT(changeToBookmarkedAvatar())); + if (!_isMenuSorted) { + menubar->addActionToQMenuAndActionHash(_bookmarksMenu, changeAction, name, 0, QAction::NoRole); + } else { + // TODO: this is aggressive but all other alternative have proved less fruitful so far. + // having experimented with various pointer types, It is possible the issues are deeper routed in the MenuWrapper/Menu Qt/QML architecture + // further research did not produce better results - menubar->addActionToQMenuAndActionHash(_bookmarksMenu, changeAction, name, 0, QAction::NoRole); - Bookmarks::sortActions(_bookmarksMenu); + //menubar->addActionToQMenuAndActionHash(_bookmarksMenu, changeAction, name, 0, QAction::NoRole, + //Bookmarks::getMenuItemLocation(_bookmarksMenu->actions(), name)); + menubar->addActionToQMenuAndActionHash(_bookmarksMenu, changeAction, name, 0, QAction::NoRole); + Bookmarks::sortActions(menubar, _bookmarksMenu); + } } diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index 0e0dbb58c1..172bfd29ca 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -24,7 +24,9 @@ #include "Bookmarks.h" -Bookmarks::Bookmarks() { +Bookmarks::Bookmarks() : +_isMenuSorted(false) +{ } void Bookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { @@ -113,18 +115,38 @@ bool Bookmarks::contains(const QString& name) const { } bool Bookmarks::sortOrder(QAction* a, QAction* b) { - return a->text().toLower() < b->text().toLower(); + return a->text().toLower().localeAwareCompare(b->text().toLower()) < 0; } -void Bookmarks::sortActions(MenuWrapper* menuWrapper) { - QList tmpActions = menuWrapper->actions(); - qSort(tmpActions.begin(), tmpActions.end(), sortOrder); +// TODO: inconsistent naming? +void Bookmarks::sortActions(Menu* menubar, MenuWrapper* menuWrapper) { + QList actions = menuWrapper->actions(); + qSort(actions.begin(), actions.end(), sortOrder); for (QAction* action : menuWrapper->actions()) { menuWrapper->removeAction(action); + //removeBookmarkFromMenu(menubar, action->text()); } - for (QAction* action : tmpActions) { + for (QAction* action : actions) { menuWrapper->addAction(action); +// for (int i = 0; i < _bookmarks.size() ; i++) { +// if (_bookmarks.keys().at(i) == action->text()) { +// addBookmarkToMenu(menubar, action->text(), _bookmarks.values().at(i).toString()); +// } +// } } + _isMenuSorted = true; +} + +int Bookmarks::getMenuItemLocation(QList actions, const QString& name) const { + int menuItemLocation = 0; + for (QAction* action : actions) { + if (name.toLower().localeAwareCompare(action->text().toLower()) < 0) { + menuItemLocation = actions.indexOf(action); + break; + + } + } + return menuItemLocation; } QString Bookmarks::addressForBookmark(const QString& name) const { diff --git a/interface/src/Bookmarks.h b/interface/src/Bookmarks.h index d998a201ae..9ba2e4f45a 100644 --- a/interface/src/Bookmarks.h +++ b/interface/src/Bookmarks.h @@ -38,12 +38,15 @@ protected: void enableMenuItems(bool enabled); void readFromFile(); void insert(const QString& name, const QString& address); // Overwrites any existing entry with same name. - void sortActions(MenuWrapper* menuWrapper); + void sortActions(Menu* menubar, MenuWrapper* menu); + int getMenuItemLocation(QList actions, const QString& name) const; QVariantMap _bookmarks; // { name: url, ... } + //QSharedPointer _bookmarksMenu; QPointer _bookmarksMenu; QPointer _deleteBookmarksAction; QString _bookmarksFilename; + bool _isMenuSorted; protected slots: void deleteBookmark(); diff --git a/interface/src/LocationBookmarks.cpp b/interface/src/LocationBookmarks.cpp index f9719db18d..436b435bc4 100644 --- a/interface/src/LocationBookmarks.cpp +++ b/interface/src/LocationBookmarks.cpp @@ -13,6 +13,7 @@ #include #include #include +//#include #include #include @@ -42,13 +43,13 @@ void LocationBookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { QObject::connect(_deleteBookmarksAction, SIGNAL(triggered()), this, SLOT(deleteBookmark()), Qt::QueuedConnection); Bookmarks::setupMenus(menubar, menu); + Bookmarks::sortActions(menubar, _bookmarksMenu); } void LocationBookmarks::setHomeLocation() { auto addressManager = DependencyManager::get(); QString bookmarkAddress = addressManager->currentAddress().toString(); Bookmarks::addBookmark(HOME_BOOKMARK, bookmarkAddress); - Bookmarks::sortActions(_bookmarksMenu); } void LocationBookmarks::teleportToBookmark() { @@ -78,7 +79,16 @@ void LocationBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, co QAction* teleportAction = _bookmarksMenu->newAction(); teleportAction->setData(address); connect(teleportAction, SIGNAL(triggered()), this, SLOT(teleportToBookmark())); + if (!_isMenuSorted) { + menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, name, 0, QAction::NoRole); + } else { + // TODO: this is aggressive but all other alternative have proved less fruitful so far. + // having experimented with various pointer types, It is possible the issues are deeper routed in the MenuWrapper/Menu Qt/QML architecture + // further research did not produce better results - menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, name, 0, QAction::NoRole); - Bookmarks::sortActions(_bookmarksMenu); + //menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, name, 0, QAction::NoRole, + //Bookmarks::getMenuItemLocation(_bookmarksMenu->actions(), name)); + menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, name, 0, QAction::NoRole); + Bookmarks::sortActions(menubar, _bookmarksMenu); + } } From bec70976d8b562acbb00e8ac09595151d6320deb Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Thu, 30 Mar 2017 12:07:19 +0100 Subject: [PATCH 12/33] change hidden overloading --- interface/src/AvatarBookmarks.cpp | 3 ++- interface/src/Bookmarks.cpp | 2 +- interface/src/Bookmarks.h | 4 +--- interface/src/LocationBookmarks.cpp | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp index a794c147c3..6b21065328 100644 --- a/interface/src/AvatarBookmarks.cpp +++ b/interface/src/AvatarBookmarks.cpp @@ -41,6 +41,7 @@ void AvatarBookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { Bookmarks::setupMenus(menubar, menu); Bookmarks::sortActions(menubar, _bookmarksMenu); + auto offscreenUi = DependencyManager::get(); auto context = offscreenUi->getRootContext(); context->setContextProperty("avatarBookmarks", this); @@ -68,7 +69,7 @@ void AvatarBookmarks::addBookmark() { auto myAvatar = DependencyManager::get()->getMyAvatar(); const QString& bookmarkAddress = myAvatar->getSkeletonModelURL().toString(); - Bookmarks::addBookmark(bookmarkName, bookmarkAddress); + Bookmarks::addBookmarkToFile(bookmarkName, bookmarkAddress); } void AvatarBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) { diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index 172bfd29ca..bb109ddc0b 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -67,7 +67,7 @@ void Bookmarks::deleteBookmark() { } } -void Bookmarks::addBookmark(const QString& bookmarkName, const QString& bookmarkAddress) { +void Bookmarks::addBookmarkToFile(const QString& bookmarkName, const QString& bookmarkAddress) { Menu* menubar = Menu::getInstance(); if (contains(bookmarkName)) { auto offscreenUi = DependencyManager::get(); diff --git a/interface/src/Bookmarks.h b/interface/src/Bookmarks.h index 9ba2e4f45a..09481d7db4 100644 --- a/interface/src/Bookmarks.h +++ b/interface/src/Bookmarks.h @@ -30,10 +30,8 @@ public: virtual void setupMenus(Menu* menubar, MenuWrapper* menu); QString addressForBookmark(const QString& name) const; -public slots: - virtual void addBookmark(const QString& bookmarkName, const QString& bookmarkAddress); - protected: + virtual void addBookmarkToFile(const QString& bookmarkName, const QString& bookmarkAddress); virtual void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) = 0; void enableMenuItems(bool enabled); void readFromFile(); diff --git a/interface/src/LocationBookmarks.cpp b/interface/src/LocationBookmarks.cpp index 436b435bc4..d0c5c4cd8a 100644 --- a/interface/src/LocationBookmarks.cpp +++ b/interface/src/LocationBookmarks.cpp @@ -49,7 +49,7 @@ void LocationBookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { void LocationBookmarks::setHomeLocation() { auto addressManager = DependencyManager::get(); QString bookmarkAddress = addressManager->currentAddress().toString(); - Bookmarks::addBookmark(HOME_BOOKMARK, bookmarkAddress); + Bookmarks::addBookmarkToFile(HOME_BOOKMARK, bookmarkAddress); } void LocationBookmarks::teleportToBookmark() { @@ -72,7 +72,7 @@ void LocationBookmarks::addBookmark() { auto addressManager = DependencyManager::get(); QString bookmarkAddress = addressManager->currentAddress().toString(); - Bookmarks::addBookmark(bookmarkName, bookmarkAddress); + Bookmarks::addBookmarkToFile(bookmarkName, bookmarkAddress); } void LocationBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) { From aa9a2532a99406a13ea5b55667996ffd61f7bcce Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Thu, 30 Mar 2017 13:54:33 +0100 Subject: [PATCH 13/33] fix for displaying "Bookmark Avatar" dialog in tablet ui --- .../qml/dialogs/preferences/AvatarPreference.qml | 2 +- interface/src/Application.cpp | 10 +++++++++- interface/src/Application.h | 1 + interface/src/AvatarBookmarks.cpp | 4 ---- interface/src/AvatarBookmarks.h | 4 +++- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml index 598b367995..bcc5a1d9e6 100644 --- a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml +++ b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml @@ -86,7 +86,7 @@ Preference { bottom: parent.bottom rightMargin: hifi.dimensions.contentSpacing.x } - onClickedQueued: avatarBookmarks.addBookmark() + onClickedQueued: ApplicationInterface.loadAddAvatarBookmarkDialog() } Button { diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c8b01706fe..58d0042322 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -59,6 +59,7 @@ #include #include #include +#include #include #include #include @@ -522,6 +523,7 @@ bool setupEssentials(int& argc, char** argv) { DependencyManager::set(); DependencyManager::set(); DependencyManager::set(nullptr, qApp->getOcteeSceneStats()); + DependencyManager::set(); return previousSessionCrashed; } @@ -2000,6 +2002,7 @@ void Application::initializeUi() { rootContext->setContextProperty("Settings", SettingsScriptingInterface::getInstance()); rootContext->setContextProperty("ScriptDiscoveryService", DependencyManager::get().data()); rootContext->setContextProperty("AudioDevice", AudioDeviceScriptingInterface::getInstance()); + rootContext->setContextProperty("AvatarBookmarks", DependencyManager::get().data()); // Caches rootContext->setContextProperty("AnimationCache", DependencyManager::get().data()); @@ -5481,6 +5484,7 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri scriptEngine->registerGlobalObject("AudioDevice", AudioDeviceScriptingInterface::getInstance()); scriptEngine->registerGlobalObject("AudioStats", DependencyManager::get()->getStats().data()); scriptEngine->registerGlobalObject("AudioScope", DependencyManager::get().data()); + scriptEngine->registerGlobalObject("AvatarBookmarks", DependencyManager::get().data()); // Caches scriptEngine->registerGlobalObject("AnimationCache", DependencyManager::get().data()); @@ -6352,7 +6356,6 @@ void Application::loadLODToolsDialog() { } else { tablet->pushOntoStack("../../hifi/dialogs/TabletLODTools.qml"); } - } @@ -6402,6 +6405,11 @@ void Application::toggleEntityScriptServerLogDialog() { } } +void Application::loadAddAvatarBookmarkDialog() const { + auto avatarBookmarks = DependencyManager::get(); + avatarBookmarks->addBookmark(); +} + void Application::takeSnapshot(bool notify, bool includeAnimated, float aspectRatio) { postLambdaEvent([notify, includeAnimated, aspectRatio, this] { QMediaPlayer* player = new QMediaPlayer(); diff --git a/interface/src/Application.h b/interface/src/Application.h index 0123bdaf59..aeb4966066 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -334,6 +334,7 @@ public slots: void toggleEntityScriptServerLogDialog(); void toggleRunningScriptsWidget() const; Q_INVOKABLE void showAssetServerWidget(QString filePath = ""); + Q_INVOKABLE void loadAddAvatarBookmarkDialog() const; void showDialog(const QString& desktopURL, const QString& tabletURL, const QString& name) const; diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp index 6b21065328..f9d9a18bc9 100644 --- a/interface/src/AvatarBookmarks.cpp +++ b/interface/src/AvatarBookmarks.cpp @@ -41,10 +41,6 @@ void AvatarBookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { Bookmarks::setupMenus(menubar, menu); Bookmarks::sortActions(menubar, _bookmarksMenu); - - auto offscreenUi = DependencyManager::get(); - auto context = offscreenUi->getRootContext(); - context->setContextProperty("avatarBookmarks", this); } void AvatarBookmarks::changeToBookmarkedAvatar() { diff --git a/interface/src/AvatarBookmarks.h b/interface/src/AvatarBookmarks.h index 958e0e891c..725af88b0d 100644 --- a/interface/src/AvatarBookmarks.h +++ b/interface/src/AvatarBookmarks.h @@ -12,10 +12,12 @@ #ifndef hifi_AvatarBookmarks_h #define hifi_AvatarBookmarks_h +#include #include "Bookmarks.h" -class AvatarBookmarks: public Bookmarks { +class AvatarBookmarks: public Bookmarks, public Dependency { Q_OBJECT + SINGLETON_DEPENDENCY public: AvatarBookmarks(); From ae3f04288d446ebc8b1091ff9e36b7ffe2ccf0a0 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Thu, 30 Mar 2017 14:56:04 +0100 Subject: [PATCH 14/33] cleanup --- interface/src/AvatarBookmarks.cpp | 4 +--- interface/src/Bookmarks.cpp | 11 +++++------ interface/src/LocationBookmarks.cpp | 8 +++----- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp index f9d9a18bc9..85534d6be9 100644 --- a/interface/src/AvatarBookmarks.cpp +++ b/interface/src/AvatarBookmarks.cpp @@ -75,9 +75,7 @@ void AvatarBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, cons if (!_isMenuSorted) { menubar->addActionToQMenuAndActionHash(_bookmarksMenu, changeAction, name, 0, QAction::NoRole); } else { - // TODO: this is aggressive but all other alternative have proved less fruitful so far. - // having experimented with various pointer types, It is possible the issues are deeper routed in the MenuWrapper/Menu Qt/QML architecture - // further research did not produce better results + // TODO: this is aggressive but other alternatives have proved less fruitful so far. //menubar->addActionToQMenuAndActionHash(_bookmarksMenu, changeAction, name, 0, QAction::NoRole, //Bookmarks::getMenuItemLocation(_bookmarksMenu->actions(), name)); diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index bb109ddc0b..b378b0b00f 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -118,16 +118,15 @@ bool Bookmarks::sortOrder(QAction* a, QAction* b) { return a->text().toLower().localeAwareCompare(b->text().toLower()) < 0; } -// TODO: inconsistent naming? -void Bookmarks::sortActions(Menu* menubar, MenuWrapper* menuWrapper) { - QList actions = menuWrapper->actions(); +void Bookmarks::sortActions(Menu* menubar, MenuWrapper* menu) { + QList actions = menu->actions(); qSort(actions.begin(), actions.end(), sortOrder); - for (QAction* action : menuWrapper->actions()) { - menuWrapper->removeAction(action); + for (QAction* action : menu->actions()) { + menu->removeAction(action); //removeBookmarkFromMenu(menubar, action->text()); } for (QAction* action : actions) { - menuWrapper->addAction(action); + menu->addAction(action); // for (int i = 0; i < _bookmarks.size() ; i++) { // if (_bookmarks.keys().at(i) == action->text()) { // addBookmarkToMenu(menubar, action->text(), _bookmarks.values().at(i).toString()); diff --git a/interface/src/LocationBookmarks.cpp b/interface/src/LocationBookmarks.cpp index d0c5c4cd8a..99d9219730 100644 --- a/interface/src/LocationBookmarks.cpp +++ b/interface/src/LocationBookmarks.cpp @@ -82,13 +82,11 @@ void LocationBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, co if (!_isMenuSorted) { menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, name, 0, QAction::NoRole); } else { - // TODO: this is aggressive but all other alternative have proved less fruitful so far. - // having experimented with various pointer types, It is possible the issues are deeper routed in the MenuWrapper/Menu Qt/QML architecture - // further research did not produce better results + // TODO: this is aggressive but other alternatives have proved less fruitful so far. //menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, name, 0, QAction::NoRole, //Bookmarks::getMenuItemLocation(_bookmarksMenu->actions(), name)); - menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, name, 0, QAction::NoRole); - Bookmarks::sortActions(menubar, _bookmarksMenu); + menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, name, 0, QAction::NoRole); + Bookmarks::sortActions(menubar, _bookmarksMenu); } } From 57d6213175675b77e7cf8bf248b19e752372e297 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Thu, 30 Mar 2017 19:42:25 +0100 Subject: [PATCH 15/33] remove dead code --- interface/src/AvatarBookmarks.cpp | 3 --- interface/src/Bookmarks.cpp | 6 ------ interface/src/LocationBookmarks.cpp | 3 --- 3 files changed, 12 deletions(-) diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp index 85534d6be9..4ca928bc25 100644 --- a/interface/src/AvatarBookmarks.cpp +++ b/interface/src/AvatarBookmarks.cpp @@ -76,9 +76,6 @@ void AvatarBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, cons menubar->addActionToQMenuAndActionHash(_bookmarksMenu, changeAction, name, 0, QAction::NoRole); } else { // TODO: this is aggressive but other alternatives have proved less fruitful so far. - - //menubar->addActionToQMenuAndActionHash(_bookmarksMenu, changeAction, name, 0, QAction::NoRole, - //Bookmarks::getMenuItemLocation(_bookmarksMenu->actions(), name)); menubar->addActionToQMenuAndActionHash(_bookmarksMenu, changeAction, name, 0, QAction::NoRole); Bookmarks::sortActions(menubar, _bookmarksMenu); } diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index b378b0b00f..776ac3dbb0 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -123,15 +123,9 @@ void Bookmarks::sortActions(Menu* menubar, MenuWrapper* menu) { qSort(actions.begin(), actions.end(), sortOrder); for (QAction* action : menu->actions()) { menu->removeAction(action); - //removeBookmarkFromMenu(menubar, action->text()); } for (QAction* action : actions) { menu->addAction(action); -// for (int i = 0; i < _bookmarks.size() ; i++) { -// if (_bookmarks.keys().at(i) == action->text()) { -// addBookmarkToMenu(menubar, action->text(), _bookmarks.values().at(i).toString()); -// } -// } } _isMenuSorted = true; } diff --git a/interface/src/LocationBookmarks.cpp b/interface/src/LocationBookmarks.cpp index 99d9219730..b571637610 100644 --- a/interface/src/LocationBookmarks.cpp +++ b/interface/src/LocationBookmarks.cpp @@ -83,9 +83,6 @@ void LocationBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, co menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, name, 0, QAction::NoRole); } else { // TODO: this is aggressive but other alternatives have proved less fruitful so far. - - //menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, name, 0, QAction::NoRole, - //Bookmarks::getMenuItemLocation(_bookmarksMenu->actions(), name)); menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, name, 0, QAction::NoRole); Bookmarks::sortActions(menubar, _bookmarksMenu); } From 8aa3e56ad459ccae10cc5f20230c68bbacdbf5c8 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Thu, 30 Mar 2017 19:47:50 +0100 Subject: [PATCH 16/33] remove dead code --- interface/src/AvatarBookmarks.cpp | 1 - interface/src/Bookmarks.h | 1 - interface/src/LocationBookmarks.cpp | 1 - 3 files changed, 3 deletions(-) diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp index 4ca928bc25..5cdfc8213f 100644 --- a/interface/src/AvatarBookmarks.cpp +++ b/interface/src/AvatarBookmarks.cpp @@ -14,7 +14,6 @@ #include #include #include -//#include #include #include diff --git a/interface/src/Bookmarks.h b/interface/src/Bookmarks.h index 09481d7db4..6c322197cc 100644 --- a/interface/src/Bookmarks.h +++ b/interface/src/Bookmarks.h @@ -40,7 +40,6 @@ protected: int getMenuItemLocation(QList actions, const QString& name) const; QVariantMap _bookmarks; // { name: url, ... } - //QSharedPointer _bookmarksMenu; QPointer _bookmarksMenu; QPointer _deleteBookmarksAction; QString _bookmarksFilename; diff --git a/interface/src/LocationBookmarks.cpp b/interface/src/LocationBookmarks.cpp index b571637610..b79adcf1b7 100644 --- a/interface/src/LocationBookmarks.cpp +++ b/interface/src/LocationBookmarks.cpp @@ -13,7 +13,6 @@ #include #include #include -//#include #include #include From 01b13d7032d51985c965bc14c362c43610d36724 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Tue, 4 Apr 2017 18:05:00 +0100 Subject: [PATCH 17/33] fix crash when pressing "Bookmark Avatar" button also modified LocationBookmarks for consistency --- interface/src/Application.cpp | 7 ++++--- interface/src/Application.h | 7 ------- interface/src/Bookmarks.cpp | 1 - interface/src/LocationBookmarks.h | 4 +++- interface/src/Menu.cpp | 8 ++++++-- interface/src/ui/AddressBarDialog.cpp | 4 +++- 6 files changed, 16 insertions(+), 15 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 58d0042322..36c1dfccdc 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -82,6 +82,7 @@ #include #include #include +#include "LocationBookmarks.h" #include #include #include @@ -524,6 +525,7 @@ bool setupEssentials(int& argc, char** argv) { DependencyManager::set(); DependencyManager::set(nullptr, qApp->getOcteeSceneStats()); DependencyManager::set(); + DependencyManager::set(); return previousSessionCrashed; } @@ -698,9 +700,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo usleep(USECS_PER_MSEC * 50); // 20hz } - _locationBookmarks = new LocationBookmarks(); // Before setting up the menu - _avatarBookmarks = new AvatarBookmarks(); - // start the nodeThread so its event loop is running QThread* nodeThread = new QThread(this); nodeThread->setObjectName("NodeList Thread"); @@ -2003,6 +2002,7 @@ void Application::initializeUi() { rootContext->setContextProperty("ScriptDiscoveryService", DependencyManager::get().data()); rootContext->setContextProperty("AudioDevice", AudioDeviceScriptingInterface::getInstance()); rootContext->setContextProperty("AvatarBookmarks", DependencyManager::get().data()); + rootContext->setContextProperty("LocationBookmarks", DependencyManager::get().data()); // Caches rootContext->setContextProperty("AnimationCache", DependencyManager::get().data()); @@ -5485,6 +5485,7 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri scriptEngine->registerGlobalObject("AudioStats", DependencyManager::get()->getStats().data()); scriptEngine->registerGlobalObject("AudioScope", DependencyManager::get().data()); scriptEngine->registerGlobalObject("AvatarBookmarks", DependencyManager::get().data()); + scriptEngine->registerGlobalObject("LocationBookmarks", DependencyManager::get().data()); // Caches scriptEngine->registerGlobalObject("AnimationCache", DependencyManager::get().data()); diff --git a/interface/src/Application.h b/interface/src/Application.h index aeb4966066..0c06c086bc 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -52,8 +52,6 @@ #include "avatar/MyAvatar.h" #include "BandwidthRecorder.h" -#include "LocationBookmarks.h" -#include "AvatarBookmarks.h" #include "Camera.h" #include "ConnectionMonitor.h" #include "gpu/Context.h" @@ -264,8 +262,6 @@ public: glm::mat4 getEyeProjection(int eye) const; QRect getDesirableApplicationGeometry() const; - LocationBookmarks* getLocationBookmarks() const { return _locationBookmarks; } - AvatarBookmarks* getAvatarBookmarks() const { return _avatarBookmarks; } virtual bool canAcceptURL(const QString& url) const override; virtual bool acceptURL(const QString& url, bool defaultUpload = false) override; @@ -605,9 +601,6 @@ private: bool _aboutToQuit; - QPointer _locationBookmarks; - QPointer _avatarBookmarks; - bool _notifiedPacketVersionMismatchThisDomain; QThread _settingsThread; diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index 776ac3dbb0..e7af7ea2c9 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -136,7 +136,6 @@ int Bookmarks::getMenuItemLocation(QList actions, const QString& name) if (name.toLower().localeAwareCompare(action->text().toLower()) < 0) { menuItemLocation = actions.indexOf(action); break; - } } return menuItemLocation; diff --git a/interface/src/LocationBookmarks.h b/interface/src/LocationBookmarks.h index b762a0be9d..1324e96574 100644 --- a/interface/src/LocationBookmarks.h +++ b/interface/src/LocationBookmarks.h @@ -12,10 +12,12 @@ #ifndef hifi_LocationBookmarks_h #define hifi_LocationBookmarks_h +#include #include "Bookmarks.h" -class LocationBookmarks: public Bookmarks { +class LocationBookmarks : public Bookmarks, public Dependency { Q_OBJECT + SINGLETON_DEPENDENCY public: LocationBookmarks(); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index e63f87bc99..109900f4a6 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -32,6 +32,7 @@ #include "assets/ATPAssetMigrator.h" #include "audio/AudioScope.h" #include "avatar/AvatarManager.h" +#include "AvatarBookmarks.h" #include "devices/DdeFaceTracker.h" #include "devices/Faceshift.h" #include "MainWindow.h" @@ -40,6 +41,7 @@ #include "ui/DialogsManager.h" #include "ui/StandAloneJSConsole.h" #include "InterfaceLogging.h" +#include "LocationBookmarks.h" #if defined(Q_OS_MAC) || defined(Q_OS_WIN) #include "SpeechRecognizer.h" @@ -195,7 +197,8 @@ Menu::Menu() { qApp, SLOT(resetSensors())); // Avatar > AvatarBookmarks related menus -- Note: the AvatarBookmarks class adds its own submenus here. - qApp->getAvatarBookmarks()->setupMenus(this, avatarMenu); + auto avatarBookmarks = DependencyManager::get(); + avatarBookmarks->setupMenus(this, avatarMenu); // Display menu ---------------------------------- // FIXME - this is not yet matching Alan's spec because it doesn't have @@ -259,7 +262,8 @@ Menu::Menu() { dialogsManager.data(), SLOT(toggleAddressBar())); // Navigate > LocationBookmarks related menus -- Note: the LocationBookmarks class adds its own submenus here. - qApp->getLocationBookmarks()->setupMenus(this, navigateMenu); + auto locationBookmarks = DependencyManager::get(); + locationBookmarks->setupMenus(this, navigateMenu); // Navigate > Copy Address [advanced] auto addressManager = DependencyManager::get(); diff --git a/interface/src/ui/AddressBarDialog.cpp b/interface/src/ui/AddressBarDialog.cpp index 0534a9f456..8aaaac1a57 100644 --- a/interface/src/ui/AddressBarDialog.cpp +++ b/interface/src/ui/AddressBarDialog.cpp @@ -17,6 +17,7 @@ #include "DependencyManager.h" #include "AddressManager.h" #include "DialogsManager.h" +#include "LocationBookmarks.h" HIFI_QML_DEF(AddressBarDialog) @@ -52,7 +53,8 @@ void AddressBarDialog::loadAddress(const QString& address, bool fromSuggestions) void AddressBarDialog::loadHome() { qDebug() << "Called LoadHome"; - QString homeLocation = qApp->getLocationBookmarks()->addressForBookmark(LocationBookmarks::HOME_BOOKMARK); + auto locationBookmarks = DependencyManager::get(); + QString homeLocation = locationBookmarks->addressForBookmark(LocationBookmarks::HOME_BOOKMARK); const QString DEFAULT_HOME_LOCATION = "localhost"; if (homeLocation == "") { homeLocation = DEFAULT_HOME_LOCATION; From b4b5d4fe9bb8ee5675bf089be1ce03cb6d26bf77 Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Tue, 4 Apr 2017 18:15:12 +0100 Subject: [PATCH 18/33] resolve merge conflict --- interface/src/Application.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 36c1dfccdc..fbd8c9e8c3 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -526,6 +526,7 @@ bool setupEssentials(int& argc, char** argv) { DependencyManager::set(nullptr, qApp->getOcteeSceneStats()); DependencyManager::set(); DependencyManager::set(); + return previousSessionCrashed; } From 4c2823b42df7a724e8bd978be27c10f7680cba6c Mon Sep 17 00:00:00 2001 From: Triplelexx Date: Fri, 7 Apr 2017 18:21:43 +0100 Subject: [PATCH 19/33] change increment operator --- interface/src/Bookmarks.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index e7af7ea2c9..4cbc17f8ce 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -44,7 +44,7 @@ void Bookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { void Bookmarks::deleteBookmark() { QStringList bookmarkList; QList menuItems = _bookmarksMenu->actions(); - for (int i = 0; i < menuItems.count(); i += 1) { + for (int i = 0; i < menuItems.count(); ++i) { bookmarkList.append(menuItems[i]->text()); } From 1137bd1436a3c9032cdce05e26ddca6d441eef81 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Mon, 10 Apr 2017 17:28:21 -0700 Subject: [PATCH 20/33] pull qApp spaghetti out of Avatar class some ends of spaghetti get pushed into AvatarManger class split Camera class into Camera base and FancyCamera derivation Application::getCamera() returns Camera by refence instead of pointer --- interface/src/Application.cpp | 10 ++--- interface/src/Application.h | 8 ++-- interface/src/Camera.cpp | 17 ++------ interface/src/Camera.h | 10 ----- interface/src/FancyCamera.cpp | 31 ++++++++++++++ interface/src/FancyCamera.h | 40 +++++++++++++++++++ interface/src/avatar/Avatar.cpp | 31 +++++++------- interface/src/avatar/Avatar.h | 12 +++--- interface/src/avatar/AvatarManager.cpp | 7 ++-- interface/src/avatar/MyAvatar.cpp | 32 +++++++-------- interface/src/avatar/MyAvatar.h | 4 +- .../src/scripting/HMDScriptingInterface.cpp | 6 +-- interface/src/ui/overlays/Billboardable.cpp | 2 +- 13 files changed, 131 insertions(+), 79 deletions(-) create mode 100644 interface/src/FancyCamera.cpp create mode 100644 interface/src/FancyCamera.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0d3d8ece8d..6cc318af06 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1124,19 +1124,19 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo return qApp->isHMDMode() ? 1 : 0; }); _applicationStateDevice->setInputVariant(STATE_CAMERA_FULL_SCREEN_MIRROR, []() -> float { - return qApp->getCamera()->getMode() == CAMERA_MODE_MIRROR ? 1 : 0; + return qApp->getCamera().getMode() == CAMERA_MODE_MIRROR ? 1 : 0; }); _applicationStateDevice->setInputVariant(STATE_CAMERA_FIRST_PERSON, []() -> float { - return qApp->getCamera()->getMode() == CAMERA_MODE_FIRST_PERSON ? 1 : 0; + return qApp->getCamera().getMode() == CAMERA_MODE_FIRST_PERSON ? 1 : 0; }); _applicationStateDevice->setInputVariant(STATE_CAMERA_THIRD_PERSON, []() -> float { - return qApp->getCamera()->getMode() == CAMERA_MODE_THIRD_PERSON ? 1 : 0; + return qApp->getCamera().getMode() == CAMERA_MODE_THIRD_PERSON ? 1 : 0; }); _applicationStateDevice->setInputVariant(STATE_CAMERA_ENTITY, []() -> float { - return qApp->getCamera()->getMode() == CAMERA_MODE_ENTITY ? 1 : 0; + return qApp->getCamera().getMode() == CAMERA_MODE_ENTITY ? 1 : 0; }); _applicationStateDevice->setInputVariant(STATE_CAMERA_INDEPENDENT, []() -> float { - return qApp->getCamera()->getMode() == CAMERA_MODE_INDEPENDENT ? 1 : 0; + return qApp->getCamera().getMode() == CAMERA_MODE_INDEPENDENT ? 1 : 0; }); _applicationStateDevice->setInputVariant(STATE_SNAP_TURN, []() -> float { return qApp->getMyAvatar()->getSnapTurn() ? 1 : 0; diff --git a/interface/src/Application.h b/interface/src/Application.h index cf79a2dfd8..12b2fbfd6e 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -52,7 +52,7 @@ #include "avatar/MyAvatar.h" #include "BandwidthRecorder.h" -#include "Camera.h" +#include "FancyCamera.h" #include "ConnectionMonitor.h" #include "gpu/Context.h" #include "Menu.h" @@ -174,8 +174,8 @@ public: bool isThrottleRendering() const; - Camera* getCamera() { return &_myCamera; } - const Camera* getCamera() const { return &_myCamera; } + Camera& getCamera() { return _myCamera; } + const Camera& getCamera() const { return _myCamera; } // Represents the current view frustum of the avatar. void copyViewFrustum(ViewFrustum& viewOut) const; // Represents the view frustum of the current rendering pass, @@ -558,7 +558,7 @@ private: SimpleMovingAverage _avatarSimsPerSecond {10}; int _avatarSimsPerSecondReport {0}; quint64 _lastAvatarSimsPerSecondUpdate {0}; - Camera _myCamera; // My view onto the world + FancyCamera _myCamera; // My view onto the world Setting::Handle _previousScriptLocation; Setting::Handle _fieldOfView; diff --git a/interface/src/Camera.cpp b/interface/src/Camera.cpp index cf3261ee88..a9578f8c0a 100644 --- a/interface/src/Camera.cpp +++ b/interface/src/Camera.cpp @@ -98,18 +98,7 @@ void Camera::setMode(CameraMode mode) { emit modeUpdated(modeToString(mode)); } -QUuid Camera::getCameraEntity() const { - if (_cameraEntity != nullptr) { - return _cameraEntity->getID(); - } - return QUuid(); -}; - -void Camera::setCameraEntity(QUuid entityID) { - _cameraEntity = qApp->getEntities()->getTree()->findEntityByID(entityID); -} - -void Camera::setProjection(const glm::mat4& projection) { +void Camera::setProjection(const glm::mat4& projection) { _projection = projection; } @@ -119,7 +108,7 @@ PickRay Camera::computePickRay(float x, float y) { void Camera::setModeString(const QString& mode) { CameraMode targetMode = stringToMode(mode); - + switch (targetMode) { case CAMERA_MODE_FIRST_PERSON: Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, true); @@ -139,7 +128,7 @@ void Camera::setModeString(const QString& mode) { default: break; } - + qApp->cameraMenuChanged(); if (_mode != targetMode) { diff --git a/interface/src/Camera.h b/interface/src/Camera.h index cedfb3f185..932a34d98c 100644 --- a/interface/src/Camera.h +++ b/interface/src/Camera.h @@ -43,15 +43,11 @@ class Camera : public QObject { * @property position {Vec3} The position of the camera. * @property orientation {Quat} The orientation of the camera. * @property mode {string} The current camera mode. - * @property cameraEntity {EntityID} The position and rotation properties of - * the entity specified by this ID are then used as the camera's position and - * orientation. Only works when mode is "entity". * @property frustum {Object} The frustum of the camera. */ Q_PROPERTY(glm::vec3 position READ getPosition WRITE setPosition) Q_PROPERTY(glm::quat orientation READ getOrientation WRITE setOrientation) Q_PROPERTY(QString mode READ getModeString WRITE setModeString) - Q_PROPERTY(QUuid cameraEntity READ getCameraEntity WRITE setCameraEntity) Q_PROPERTY(QVariantMap frustum READ getViewFrustum CONSTANT) public: @@ -67,8 +63,6 @@ public: void loadViewFrustum(ViewFrustum& frustum) const; ViewFrustum toViewFrustum() const; - EntityItemPointer getCameraEntityPointer() const { return _cameraEntity; } - const glm::mat4& getTransform() const { return _transform; } void setTransform(const glm::mat4& transform); @@ -87,9 +81,6 @@ public slots: glm::quat getOrientation() const { return _orientation; } void setOrientation(const glm::quat& orientation); - QUuid getCameraEntity() const; - void setCameraEntity(QUuid entityID); - /**jsdoc * Compute a {PickRay} based on the current camera configuration and the position x,y on the screen. * @function Camera.computePickRay @@ -143,7 +134,6 @@ private: glm::quat _orientation; bool _isKeepLookingAt{ false }; glm::vec3 _lookingAt; - EntityItemPointer _cameraEntity; }; #endif // hifi_Camera_h diff --git a/interface/src/FancyCamera.cpp b/interface/src/FancyCamera.cpp new file mode 100644 index 0000000000..d22a1ba56c --- /dev/null +++ b/interface/src/FancyCamera.cpp @@ -0,0 +1,31 @@ +// +// Camera.cpp +// interface/src +// +// Copyright 2017 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 "Application.h" +#include "FancyCamera.h" +//#include "Menu.h" +//#include "Util.h" + + +QUuid FancyCamera::getCameraEntity() const { + if (_cameraEntity != nullptr) { + return _cameraEntity->getID(); + } + return QUuid(); +}; + +void FancyCamera::setCameraEntity(QUuid entityID) { + _cameraEntity = qApp->getEntities()->getTree()->findEntityByID(entityID); +} diff --git a/interface/src/FancyCamera.h b/interface/src/FancyCamera.h new file mode 100644 index 0000000000..9ffa6cafd8 --- /dev/null +++ b/interface/src/FancyCamera.h @@ -0,0 +1,40 @@ +// +// FancyCamera.h +// interface/src +// +// Copyright 2017 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_FancyCamera_h +#define hifi_FancyCamera_h + +#include "Camera.h" + +class FancyCamera : public Camera { + Q_OBJECT + + /**jsdoc + * @namespace Camera + * @property cameraEntity {EntityID} The position and rotation properties of + * the entity specified by this ID are then used as the camera's position and + * orientation. Only works when mode is "entity". + */ + Q_PROPERTY(QUuid cameraEntity READ getCameraEntity WRITE setCameraEntity) + +public: + FancyCamera() : Camera() {} + + EntityItemPointer getCameraEntityPointer() const { return _cameraEntity; } + +public slots: + QUuid getCameraEntity() const; + void setCameraEntity(QUuid entityID); + +private: + EntityItemPointer _cameraEntity; +}; + +#endif // hifi_FancyCamera_h diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index b4d5fea360..260359da51 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -46,7 +47,6 @@ #include "InterfaceLogging.h" #include "SceneScriptingInterface.h" #include "SoftAttachmentModel.h" -#include using namespace std; @@ -71,7 +71,7 @@ namespace render { auto avatarPtr = static_pointer_cast(avatar); if (avatarPtr->isInitialized() && args) { PROFILE_RANGE_BATCH(*args->_batch, "renderAvatarPayload"); - avatarPtr->render(args, qApp->getCamera()->getPosition()); + avatarPtr->render(args, qApp->getMain3DScene(), qApp->getCamera()); } } template <> uint32_t metaFetchMetaSubItems(const AvatarSharedPointer& avatar, ItemIDs& subItems) { @@ -85,7 +85,7 @@ namespace render { } } -Avatar::Avatar(RigPointer rig) : +Avatar::Avatar(QThread* thread, RigPointer rig) : AvatarData(), _skeletonOffset(0.0f), _bodyYawDelta(0.0f), @@ -108,7 +108,7 @@ Avatar::Avatar(RigPointer rig) : _voiceSphereID(GeometryCache::UNKNOWN_ID) { // we may have been created in the network thread, but we live in the main thread - moveToThread(qApp->thread()); + moveToThread(thread); setScale(glm::vec3(1.0f)); // avatar scale is uniform @@ -128,7 +128,7 @@ Avatar::Avatar(RigPointer rig) : Avatar::~Avatar() { assert(isDead()); // mark dead before calling the dtor - auto treeRenderer = qApp->getEntities(); + auto treeRenderer = DependencyManager::get(); EntityTreePointer entityTree = treeRenderer ? treeRenderer->getTree() : nullptr; if (entityTree) { entityTree->withWriteLock([&] { @@ -237,7 +237,7 @@ void Avatar::updateAvatarEntities() { return; // wait until MyAvatar gets an ID before doing this. } - auto treeRenderer = qApp->getEntities(); + auto treeRenderer = DependencyManager::get(); EntityTreePointer entityTree = treeRenderer ? treeRenderer->getTree() : nullptr; if (!entityTree) { return; @@ -578,7 +578,7 @@ void Avatar::postUpdate(float deltaTime) { } } -void Avatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition) { +void Avatar::render(RenderArgs* renderArgs, render::ScenePointer scene, const Camera& camera) { auto& batch = *renderArgs->_batch; PROFILE_RANGE_BATCH(batch, __FUNCTION__); @@ -653,11 +653,11 @@ void Avatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition) { } } - glm::vec3 toTarget = cameraPosition - getPosition(); + glm::vec3 toTarget = camera.getPosition() - getPosition(); float distanceToTarget = glm::length(toTarget); { - fixupModelsInScene(); + fixupModelsInScene(scene); if (renderArgs->_renderMode != RenderArgs::SHADOW_RENDER_MODE) { // add local lights @@ -686,7 +686,7 @@ void Avatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition) { const float DISPLAYNAME_DISTANCE = 20.0f; setShowDisplayName(distanceToTarget < DISPLAYNAME_DISTANCE); - auto cameraMode = qApp->getCamera()->getMode(); + auto cameraMode = camera.getMode(); if (!isMyAvatar() || cameraMode != CAMERA_MODE_FIRST_PERSON) { auto& frustum = renderArgs->getViewFrustum(); auto textPosition = getDisplayNamePosition(); @@ -712,12 +712,11 @@ glm::quat Avatar::computeRotationFromBodyToWorldUp(float proportion) const { return glm::angleAxis(angle * proportion, axis); } -void Avatar::fixupModelsInScene() { +void Avatar::fixupModelsInScene(render::ScenePointer scene) { _attachmentsToDelete.clear(); // check to see if when we added our models to the scene they were ready, if they were not ready, then // fix them up in the scene - render::ScenePointer scene = qApp->getMain3DScene(); render::Transaction transaction; if (_skeletonModel->isRenderable() && _skeletonModel->needsFixupInScene()) { _skeletonModel->removeFromScene(scene, transaction); @@ -1490,8 +1489,7 @@ QList Avatar::getSkeleton() { return QList(); } -void Avatar::addToScene(AvatarSharedPointer myHandle) { - render::ScenePointer scene = qApp->getMain3DScene(); +void Avatar::addToScene(AvatarSharedPointer myHandle, render::ScenePointer scene) { if (scene) { render::Transaction transaction; auto nodelist = DependencyManager::get(); @@ -1505,8 +1503,9 @@ void Avatar::addToScene(AvatarSharedPointer myHandle) { qCWarning(interfaceapp) << "AvatarManager::addAvatar() : Unexpected null scene, possibly during application shutdown"; } } -void Avatar::ensureInScene(AvatarSharedPointer self) { + +void Avatar::ensureInScene(AvatarSharedPointer self, render::ScenePointer scene) { if (!render::Item::isValidID(_renderItemID)) { - addToScene(self); + addToScene(self, scene); } } diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 7b9d331048..d054f9a342 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -22,6 +22,8 @@ #include + +#include "Camera.h" #include "Head.h" #include "SkeletonModel.h" #include "world.h" @@ -68,7 +70,7 @@ class Avatar : public AvatarData { Q_PROPERTY(glm::vec3 skeletonOffset READ getSkeletonOffset WRITE setSkeletonOffset) public: - explicit Avatar(RigPointer rig = nullptr); + explicit Avatar(QThread* thread, RigPointer rig = nullptr); ~Avatar(); typedef render::Payload Payload; @@ -79,7 +81,7 @@ public: void simulate(float deltaTime, bool inView); virtual void simulateAttachments(float deltaTime); - virtual void render(RenderArgs* renderArgs, const glm::vec3& cameraPosition); + virtual void render(RenderArgs* renderArgs, render::ScenePointer scene, const Camera& camera); void addToScene(AvatarSharedPointer self, std::shared_ptr scene, render::Transaction& transaction); @@ -305,7 +307,7 @@ protected: Transform calculateDisplayNameTransform(const ViewFrustum& view, const glm::vec3& textPosition) const; void renderDisplayName(gpu::Batch& batch, const ViewFrustum& view, const glm::vec3& textPosition) const; virtual bool shouldRenderHead(const RenderArgs* renderArgs) const; - virtual void fixupModelsInScene(); + virtual void fixupModelsInScene(render::ScenePointer scene); virtual void updatePalms(); @@ -316,8 +318,8 @@ protected: ThreadSafeValueCache _rightPalmPositionCache { glm::vec3() }; ThreadSafeValueCache _rightPalmRotationCache { glm::quat() }; - void addToScene(AvatarSharedPointer self); - void ensureInScene(AvatarSharedPointer self); + void addToScene(AvatarSharedPointer self, render::ScenePointer scene); + void ensureInScene(AvatarSharedPointer self, render::ScenePointer scene); bool isInScene() const { return render::Item::isValidID(_renderItemID); } // Some rate tracking support diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index f1170a7085..4ed9d83b8c 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -69,7 +69,7 @@ void AvatarManager::registerMetaTypes(QScriptEngine* engine) { AvatarManager::AvatarManager(QObject* parent) : _avatarsToFade(), - _myAvatar(std::make_shared(std::make_shared())) + _myAvatar(std::make_shared(qApp->thread(), std::make_shared())) { // register a meta type for the weak pointer we'll use for the owning avatar mixer for each avatar qRegisterMetaType >("NodeWeakPointer"); @@ -198,7 +198,8 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { // for ALL avatars... if (_shouldRender) { - avatar->ensureInScene(avatar); + render::ScenePointer scene = qApp->getMain3DScene(); + avatar->ensureInScene(avatar, scene); } if (!avatar->getMotionState()) { ShapeInfo shapeInfo; @@ -329,7 +330,7 @@ void AvatarManager::simulateAvatarFades(float deltaTime) { } AvatarSharedPointer AvatarManager::newSharedAvatar() { - return std::make_shared(std::make_shared()); + return std::make_shared(qApp->thread(), std::make_shared()); } void AvatarManager::processAvatarDataPacket(QSharedPointer message, SharedNodePointer sendingNode) { diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index da09bfba7e..4dd28076c5 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -83,8 +83,8 @@ const float MyAvatar::ZOOM_MIN = 0.5f; const float MyAvatar::ZOOM_MAX = 25.0f; const float MyAvatar::ZOOM_DEFAULT = 1.5f; -MyAvatar::MyAvatar(RigPointer rig) : - Avatar(rig), +MyAvatar::MyAvatar(QThread* thread, RigPointer rig) : + Avatar(thread, rig), _wasPushing(false), _isPushing(false), _isBeingPushed(false), @@ -260,7 +260,7 @@ void MyAvatar::simulateAttachments(float deltaTime) { } QByteArray MyAvatar::toByteArrayStateful(AvatarDataDetail dataDetail) { - CameraMode mode = qApp->getCamera()->getMode(); + CameraMode mode = qApp->getCamera().getMode(); _globalPosition = getPosition(); _globalBoundingBoxDimensions.x = _characterController.getCapsuleRadius(); _globalBoundingBoxDimensions.y = _characterController.getCapsuleHalfHeight(); @@ -752,13 +752,13 @@ controller::Pose MyAvatar::getRightHandTipPose() const { } // virtual -void MyAvatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition) { +void MyAvatar::render(RenderArgs* renderArgs, render::ScenePointer scene, const Camera& camera) { // don't render if we've been asked to disable local rendering if (!_shouldRender) { return; // exit early } - Avatar::render(renderArgs, cameraPosition); + Avatar::render(renderArgs, scene, camera); } void MyAvatar::overrideAnimation(const QString& url, float fps, bool loop, float firstFrame, float lastFrame) { @@ -1079,7 +1079,7 @@ void MyAvatar::updateLookAtTargetAvatar() { _targetAvatarPosition = glm::vec3(0.0f); glm::vec3 lookForward = getHead()->getFinalOrientationInWorldFrame() * IDENTITY_FORWARD; - glm::vec3 cameraPosition = qApp->getCamera()->getPosition(); + glm::vec3 cameraPosition = qApp->getCamera().getPosition(); float smallestAngleTo = glm::radians(DEFAULT_FIELD_OF_VIEW_DEGREES) / 2.0f; const float KEEP_LOOKING_AT_CURRENT_ANGLE_FACTOR = 1.3f; @@ -1275,7 +1275,7 @@ void MyAvatar::setAttachmentData(const QVector& attachmentData) } glm::vec3 MyAvatar::getSkeletonPosition() const { - CameraMode mode = qApp->getCamera()->getMode(); + CameraMode mode = qApp->getCamera().getMode(); if (mode == CAMERA_MODE_THIRD_PERSON || mode == CAMERA_MODE_INDEPENDENT) { // The avatar is rotated PI about the yAxis, so we have to correct for it // to get the skeleton offset contribution in the world-frame. @@ -1704,13 +1704,13 @@ void MyAvatar::preDisplaySide(RenderArgs* renderArgs) { const float RENDER_HEAD_CUTOFF_DISTANCE = 0.3f; bool MyAvatar::cameraInsideHead() const { - const glm::vec3 cameraPosition = qApp->getCamera()->getPosition(); + const glm::vec3 cameraPosition = qApp->getCamera().getPosition(); return glm::length(cameraPosition - getHeadPosition()) < (RENDER_HEAD_CUTOFF_DISTANCE * getUniformScale()); } bool MyAvatar::shouldRenderHead(const RenderArgs* renderArgs) const { bool defaultMode = renderArgs->_renderMode == RenderArgs::DEFAULT_RENDER_MODE; - bool firstPerson = qApp->getCamera()->getMode() == CAMERA_MODE_FIRST_PERSON; + bool firstPerson = qApp->getCamera().getMode() == CAMERA_MODE_FIRST_PERSON; bool insideHead = cameraInsideHead(); return !defaultMode || !firstPerson || !insideHead; } @@ -2265,7 +2265,7 @@ glm::vec3 MyAvatar::getPositionForAudio() { case AudioListenerMode::FROM_HEAD: return getHead()->getPosition(); case AudioListenerMode::FROM_CAMERA: - return qApp->getCamera()->getPosition(); + return qApp->getCamera().getPosition(); case AudioListenerMode::CUSTOM: return _customListenPosition; } @@ -2277,7 +2277,7 @@ glm::quat MyAvatar::getOrientationForAudio() { case AudioListenerMode::FROM_HEAD: return getHead()->getFinalOrientationInWorldFrame(); case AudioListenerMode::FROM_CAMERA: - return qApp->getCamera()->getOrientation(); + return qApp->getCamera().getOrientation(); case AudioListenerMode::CUSTOM: return _customListenOrientation; } @@ -2367,7 +2367,7 @@ void MyAvatar::FollowHelper::decrementTimeRemaining(float dt) { } bool MyAvatar::FollowHelper::shouldActivateRotation(const MyAvatar& myAvatar, const glm::mat4& desiredBodyMatrix, const glm::mat4& currentBodyMatrix) const { - auto cameraMode = qApp->getCamera()->getMode(); + auto cameraMode = qApp->getCamera().getMode(); if (cameraMode == CAMERA_MODE_THIRD_PERSON) { return false; } else { @@ -2515,8 +2515,8 @@ void MyAvatar::setAway(bool value) { glm::mat4 MyAvatar::computeCameraRelativeHandControllerMatrix(const glm::mat4& controllerSensorMatrix) const { // Fetch the current camera transform. - glm::mat4 cameraWorldMatrix = qApp->getCamera()->getTransform(); - if (qApp->getCamera()->getMode() == CAMERA_MODE_MIRROR) { + glm::mat4 cameraWorldMatrix = qApp->getCamera().getTransform(); + if (qApp->getCamera().getMode() == CAMERA_MODE_MIRROR) { cameraWorldMatrix *= createMatFromScaleQuatAndPos(vec3(-1.0f, 1.0f, 1.0f), glm::quat(), glm::vec3()); } @@ -2561,7 +2561,7 @@ glm::quat MyAvatar::getAbsoluteJointRotationInObjectFrame(int index) const { Transform avatarTransform; Transform::mult(avatarTransform, getParentTransform(success), getLocalTransform()); glm::mat4 invAvatarMat = avatarTransform.getInverseMatrix(); - return glmExtractRotation(invAvatarMat * qApp->getCamera()->getTransform()); + return glmExtractRotation(invAvatarMat * qApp->getCamera().getTransform()); } default: { return Avatar::getAbsoluteJointRotationInObjectFrame(index); @@ -2598,7 +2598,7 @@ glm::vec3 MyAvatar::getAbsoluteJointTranslationInObjectFrame(int index) const { Transform avatarTransform; Transform::mult(avatarTransform, getParentTransform(success), getLocalTransform()); glm::mat4 invAvatarMat = avatarTransform.getInverseMatrix(); - return extractTranslation(invAvatarMat * qApp->getCamera()->getTransform()); + return extractTranslation(invAvatarMat * qApp->getCamera().getTransform()); } default: { return Avatar::getAbsoluteJointTranslationInObjectFrame(index); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 097d3a1059..d732471a64 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -146,7 +146,7 @@ public: }; Q_ENUM(DriveKeys) - explicit MyAvatar(RigPointer rig); + explicit MyAvatar(QThread* thread, RigPointer rig); ~MyAvatar(); void registerMetaTypes(QScriptEngine* engine); @@ -525,7 +525,7 @@ private: void simulate(float deltaTime); void updateFromTrackers(float deltaTime); - virtual void render(RenderArgs* renderArgs, const glm::vec3& cameraPositio) override; + virtual void render(RenderArgs* renderArgs, render::ScenePointer scene, const Camera& camera) override; virtual bool shouldRenderHead(const RenderArgs* renderArgs) const override; void setShouldRenderLocally(bool shouldRender) { _shouldRender = shouldRender; setEnableMeshVisible(shouldRender); } bool getShouldRenderLocally() const { return _shouldRender; } diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index e2fed40a6d..95bf5eb028 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -105,9 +105,9 @@ QScriptValue HMDScriptingInterface::getHUDLookAtPosition3D(QScriptContext* conte } bool HMDScriptingInterface::getHUDLookAtPosition3D(glm::vec3& result) const { - Camera* camera = qApp->getCamera(); - glm::vec3 position = camera->getPosition(); - glm::quat orientation = camera->getOrientation(); + const Camera& camera = qApp->getCamera(); + glm::vec3 position = camera.getPosition(); + glm::quat orientation = camera.getOrientation(); glm::vec3 direction = orientation * glm::vec3(0.0f, 0.0f, -1.0f); diff --git a/interface/src/ui/overlays/Billboardable.cpp b/interface/src/ui/overlays/Billboardable.cpp index a6226a46b0..a01d62bfd1 100644 --- a/interface/src/ui/overlays/Billboardable.cpp +++ b/interface/src/ui/overlays/Billboardable.cpp @@ -31,7 +31,7 @@ QVariant Billboardable::getProperty(const QString &property) { void Billboardable::pointTransformAtCamera(Transform& transform, glm::quat offsetRotation) { if (isFacingAvatar()) { glm::vec3 billboardPos = transform.getTranslation(); - glm::vec3 cameraPos = qApp->getCamera()->getPosition(); + glm::vec3 cameraPos = qApp->getCamera().getPosition(); glm::vec3 look = cameraPos - billboardPos; float elevation = -asinf(look.y / glm::length(look)); float azimuth = atan2f(look.x, look.z); From 272cf07c31081c161fdda5c847bc9ed218415152 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 11 Apr 2017 13:09:24 -0700 Subject: [PATCH 21/33] removed cruft: unused Camera::toViewFrustum() --- interface/src/Camera.cpp | 6 ------ interface/src/Camera.h | 1 - 2 files changed, 7 deletions(-) diff --git a/interface/src/Camera.cpp b/interface/src/Camera.cpp index a9578f8c0a..37f53e3cc2 100644 --- a/interface/src/Camera.cpp +++ b/interface/src/Camera.cpp @@ -166,12 +166,6 @@ void Camera::loadViewFrustum(ViewFrustum& frustum) const { frustum.calculate(); } -ViewFrustum Camera::toViewFrustum() const { - ViewFrustum result; - loadViewFrustum(result); - return result; -} - QVariantMap Camera::getViewFrustum() { ViewFrustum frustum; loadViewFrustum(frustum); diff --git a/interface/src/Camera.h b/interface/src/Camera.h index 932a34d98c..c5a3b192ba 100644 --- a/interface/src/Camera.h +++ b/interface/src/Camera.h @@ -61,7 +61,6 @@ public: void setMode(CameraMode m); void loadViewFrustum(ViewFrustum& frustum) const; - ViewFrustum toViewFrustum() const; const glm::mat4& getTransform() const { return _transform; } void setTransform(const glm::mat4& transform); From 9cddbbc42ad48aef1f435cf10c68e1bded6d14af Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 11 Apr 2017 13:11:11 -0700 Subject: [PATCH 22/33] more interface-only spaghetti out of Avatar --- interface/src/Application.cpp | 26 ++++---------------------- interface/src/Application.h | 1 - interface/src/avatar/Avatar.cpp | 17 ++++++----------- 3 files changed, 10 insertions(+), 34 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6cc318af06..f28d09ef51 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2440,7 +2440,7 @@ void Application::resizeGL() { // Possible change in aspect ratio { QMutexLocker viewLocker(&_viewMutex); - loadViewFrustum(_myCamera, _viewFrustum); + _myCamera.loadViewFrustum(_viewFrustum); } auto offscreenUi = DependencyManager::get(); @@ -4525,7 +4525,7 @@ void Application::update(float deltaTime) { // to the server. { QMutexLocker viewLocker(&_viewMutex); - loadViewFrustum(_myCamera, _viewFrustum); + _myCamera.loadViewFrustum(_viewFrustum); } quint64 now = usecTimestampNow(); @@ -4853,24 +4853,6 @@ QRect Application::getDesirableApplicationGeometry() const { return applicationGeometry; } -///////////////////////////////////////////////////////////////////////////////////// -// loadViewFrustum() -// -// Description: this will load the view frustum bounds for EITHER the head -// or the "myCamera". -// -void Application::loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum) { - // We will use these below, from either the camera or head vectors calculated above - viewFrustum.setProjection(camera.getProjection()); - - // Set the viewFrustum up with the correct position and orientation of the camera - viewFrustum.setPosition(camera.getPosition()); - viewFrustum.setOrientation(camera.getOrientation()); - - // Ask the ViewFrustum class to calculate our corners - viewFrustum.calculate(); -} - glm::vec3 Application::getSunDirection() const { // Sun direction is in fact just the location of the sun relative to the origin auto skyStage = DependencyManager::get()->getSkyStage(); @@ -5042,7 +5024,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se // load the view frustum { QMutexLocker viewLocker(&_viewMutex); - loadViewFrustum(theCamera, _displayViewFrustum); + theCamera.loadViewFrustum(_displayViewFrustum); } // TODO fix shadows and make them use the GPU library @@ -5059,7 +5041,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se transaction.resetItem(BackgroundRenderData::_item, backgroundRenderPayload); } - // Assuming nothing get's rendered through that + // Assuming nothing gets rendered through that if (!selfAvatarOnly) { if (DependencyManager::get()->shouldRenderEntities()) { // render models... diff --git a/interface/src/Application.h b/interface/src/Application.h index 12b2fbfd6e..c8856f1026 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -462,7 +462,6 @@ private: void updateDialogs(float deltaTime) const; void queryOctree(NodeType_t serverType, PacketType packetType, NodeToJurisdictionMap& jurisdictions, bool forceResend = false); - static void loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum); glm::vec3 getSunDirection() const; diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 260359da51..9b99aa5d34 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -71,6 +71,7 @@ namespace render { auto avatarPtr = static_pointer_cast(avatar); if (avatarPtr->isInitialized() && args) { PROFILE_RANGE_BATCH(*args->_batch, "renderAvatarPayload"); + // TODO AVATARS_RENDERER: remove need for qApp avatarPtr->render(args, qApp->getMain3DScene(), qApp->getCamera()); } } @@ -641,19 +642,12 @@ void Avatar::render(RenderArgs* renderArgs, render::ScenePointer scene, const Ca } } - { // simple frustum check - ViewFrustum frustum; - if (renderArgs->_renderMode == RenderArgs::SHADOW_RENDER_MODE) { - qApp->copyShadowViewFrustum(frustum); - } else { - qApp->copyDisplayViewFrustum(frustum); - } - if (!frustum.sphereIntersectsFrustum(getPosition(), getBoundingRadius())) { - return; - } + ViewFrustum frustum = renderArgs->getViewFrustum(); + if (!frustum.sphereIntersectsFrustum(getPosition(), getBoundingRadius())) { + return; } - glm::vec3 toTarget = camera.getPosition() - getPosition(); + glm::vec3 toTarget = frustum.getPosition() - getPosition(); float distanceToTarget = glm::length(toTarget); { @@ -686,6 +680,7 @@ void Avatar::render(RenderArgs* renderArgs, render::ScenePointer scene, const Ca const float DISPLAYNAME_DISTANCE = 20.0f; setShowDisplayName(distanceToTarget < DISPLAYNAME_DISTANCE); + // TODO AVATARS_RENDERER: remove need for 'camera' in this context auto cameraMode = camera.getMode(); if (!isMyAvatar() || cameraMode != CAMERA_MODE_FIRST_PERSON) { auto& frustum = renderArgs->getViewFrustum(); From fbacbd74f7c4a8de747b04ebd2f80926fb584d95 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 12 Apr 2017 10:14:14 -0700 Subject: [PATCH 23/33] pass shared pointers by ref in Avatar::render() --- interface/src/avatar/Avatar.cpp | 2 +- interface/src/avatar/Avatar.h | 2 +- interface/src/avatar/MyAvatar.cpp | 2 +- interface/src/avatar/MyAvatar.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 9b99aa5d34..4e2c2b036b 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -579,7 +579,7 @@ void Avatar::postUpdate(float deltaTime) { } } -void Avatar::render(RenderArgs* renderArgs, render::ScenePointer scene, const Camera& camera) { +void Avatar::render(RenderArgs* renderArgs, const render::ScenePointer& scene, const Camera& camera) { auto& batch = *renderArgs->_batch; PROFILE_RANGE_BATCH(batch, __FUNCTION__); diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index d054f9a342..95b682e715 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -81,7 +81,7 @@ public: void simulate(float deltaTime, bool inView); virtual void simulateAttachments(float deltaTime); - virtual void render(RenderArgs* renderArgs, render::ScenePointer scene, const Camera& camera); + virtual void render(RenderArgs* renderArgs, const render::ScenePointer& scene, const Camera& camera); void addToScene(AvatarSharedPointer self, std::shared_ptr scene, render::Transaction& transaction); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 4dd28076c5..f3ba812e1f 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -752,7 +752,7 @@ controller::Pose MyAvatar::getRightHandTipPose() const { } // virtual -void MyAvatar::render(RenderArgs* renderArgs, render::ScenePointer scene, const Camera& camera) { +void MyAvatar::render(RenderArgs* renderArgs, const render::ScenePointer& scene, const Camera& camera) { // don't render if we've been asked to disable local rendering if (!_shouldRender) { return; // exit early diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index d732471a64..2b2a88a9b0 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -525,7 +525,7 @@ private: void simulate(float deltaTime); void updateFromTrackers(float deltaTime); - virtual void render(RenderArgs* renderArgs, render::ScenePointer scene, const Camera& camera) override; + virtual void render(RenderArgs* renderArgs, const render::ScenePointer& scene, const Camera& camera) override; virtual bool shouldRenderHead(const RenderArgs* renderArgs) const override; void setShouldRenderLocally(bool shouldRender) { _shouldRender = shouldRender; setEnableMeshVisible(shouldRender); } bool getShouldRenderLocally() const { return _shouldRender; } From 685a01482c07ea446f6ace293f3cf0a94f14471c Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 12 Apr 2017 11:25:39 -0700 Subject: [PATCH 24/33] remove Camera argument from Avatar::render() --- interface/src/Application.cpp | 1 + interface/src/avatar/Avatar.cpp | 8 +++----- interface/src/avatar/Avatar.h | 2 +- interface/src/avatar/MyAvatar.cpp | 4 ++-- interface/src/avatar/MyAvatar.h | 2 +- libraries/shared/src/RenderArgs.h | 1 + 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f28d09ef51..4659e58d37 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5097,6 +5097,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se QMutexLocker viewLocker(&_viewMutex); renderArgs->setViewFrustum(_displayViewFrustum); } + renderArgs->_cameraMode = (int8_t)theCamera.getMode(); // HACK _renderEngine->getRenderContext()->args = renderArgs; // Before the deferred pass, let's try to use the render engine diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 4e2c2b036b..cf9bb45bc0 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -72,7 +72,7 @@ namespace render { if (avatarPtr->isInitialized() && args) { PROFILE_RANGE_BATCH(*args->_batch, "renderAvatarPayload"); // TODO AVATARS_RENDERER: remove need for qApp - avatarPtr->render(args, qApp->getMain3DScene(), qApp->getCamera()); + avatarPtr->render(args, qApp->getMain3DScene()); } } template <> uint32_t metaFetchMetaSubItems(const AvatarSharedPointer& avatar, ItemIDs& subItems) { @@ -579,7 +579,7 @@ void Avatar::postUpdate(float deltaTime) { } } -void Avatar::render(RenderArgs* renderArgs, const render::ScenePointer& scene, const Camera& camera) { +void Avatar::render(RenderArgs* renderArgs, const render::ScenePointer& scene) { auto& batch = *renderArgs->_batch; PROFILE_RANGE_BATCH(batch, __FUNCTION__); @@ -680,9 +680,7 @@ void Avatar::render(RenderArgs* renderArgs, const render::ScenePointer& scene, c const float DISPLAYNAME_DISTANCE = 20.0f; setShowDisplayName(distanceToTarget < DISPLAYNAME_DISTANCE); - // TODO AVATARS_RENDERER: remove need for 'camera' in this context - auto cameraMode = camera.getMode(); - if (!isMyAvatar() || cameraMode != CAMERA_MODE_FIRST_PERSON) { + if (!isMyAvatar() || renderArgs->_cameraMode != (int8_t)CAMERA_MODE_FIRST_PERSON) { auto& frustum = renderArgs->getViewFrustum(); auto textPosition = getDisplayNamePosition(); if (frustum.pointIntersectsFrustum(textPosition)) { diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 95b682e715..816e800641 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -81,7 +81,7 @@ public: void simulate(float deltaTime, bool inView); virtual void simulateAttachments(float deltaTime); - virtual void render(RenderArgs* renderArgs, const render::ScenePointer& scene, const Camera& camera); + virtual void render(RenderArgs* renderArgs, const render::ScenePointer& scene); void addToScene(AvatarSharedPointer self, std::shared_ptr scene, render::Transaction& transaction); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index f3ba812e1f..1e491eaea2 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -752,13 +752,13 @@ controller::Pose MyAvatar::getRightHandTipPose() const { } // virtual -void MyAvatar::render(RenderArgs* renderArgs, const render::ScenePointer& scene, const Camera& camera) { +void MyAvatar::render(RenderArgs* renderArgs, const render::ScenePointer& scene) { // don't render if we've been asked to disable local rendering if (!_shouldRender) { return; // exit early } - Avatar::render(renderArgs, scene, camera); + Avatar::render(renderArgs, scene); } void MyAvatar::overrideAnimation(const QString& url, float fps, bool loop, float firstFrame, float lastFrame) { diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 2b2a88a9b0..599411e38a 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -525,7 +525,7 @@ private: void simulate(float deltaTime); void updateFromTrackers(float deltaTime); - virtual void render(RenderArgs* renderArgs, const render::ScenePointer& scene, const Camera& camera) override; + virtual void render(RenderArgs* renderArgs, const render::ScenePointer& scene) override; virtual bool shouldRenderHead(const RenderArgs* renderArgs) const override; void setShouldRenderLocally(bool shouldRender) { _shouldRender = shouldRender; setEnableMeshVisible(shouldRender); } bool getShouldRenderLocally() const { return _shouldRender; } diff --git a/libraries/shared/src/RenderArgs.h b/libraries/shared/src/RenderArgs.h index 50722c0deb..29cd007a4c 100644 --- a/libraries/shared/src/RenderArgs.h +++ b/libraries/shared/src/RenderArgs.h @@ -126,6 +126,7 @@ public: bool _enableTexturing { true }; RenderDetails _details; + int8_t _cameraMode { -1 }; // HACK }; #endif // hifi_RenderArgs_h From 5a458c9923a9dd3b4a997b5687de73d3ec2f022f Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 12 Apr 2017 12:20:12 -0700 Subject: [PATCH 25/33] remove last qApp usage from Avatar class --- interface/src/Application.cpp | 1 + interface/src/Application.h | 4 ++-- interface/src/avatar/Avatar.cpp | 6 +++--- interface/src/avatar/Avatar.h | 2 +- interface/src/avatar/MyAvatar.cpp | 5 ++--- interface/src/avatar/MyAvatar.h | 2 +- libraries/shared/src/RenderArgs.h | 5 +++++ 7 files changed, 15 insertions(+), 10 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 4659e58d37..87da8e6aa1 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5098,6 +5098,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se renderArgs->setViewFrustum(_displayViewFrustum); } renderArgs->_cameraMode = (int8_t)theCamera.getMode(); // HACK + renderArgs->_scene = getMain3DScene(); _renderEngine->getRenderContext()->args = renderArgs; // Before the deferred pass, let's try to use the render engine diff --git a/interface/src/Application.h b/interface/src/Application.h index c8856f1026..9f429b0433 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -268,7 +268,7 @@ public: int getMaxOctreePacketsPerSecond() const; render::ScenePointer getMain3DScene() override { return _main3DScene; } - render::ScenePointer getMain3DScene() const { return _main3DScene; } + const render::ScenePointer& getMain3DScene() const { return _main3DScene; } render::EnginePointer getRenderEngine() override { return _renderEngine; } gpu::ContextPointer getGPUContext() const { return _gpuContext; } @@ -278,7 +278,7 @@ public: float getAvatarSimrate() const { return _avatarSimCounter.rate(); } float getAverageSimsPerSecond() const { return _simCounter.rate(); } - + void takeSnapshot(bool notify, bool includeAnimated = false, float aspectRatio = 0.0f); void shareSnapshot(const QString& filename, const QUrl& href = QUrl("")); diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index cf9bb45bc0..73ca149461 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -72,7 +72,7 @@ namespace render { if (avatarPtr->isInitialized() && args) { PROFILE_RANGE_BATCH(*args->_batch, "renderAvatarPayload"); // TODO AVATARS_RENDERER: remove need for qApp - avatarPtr->render(args, qApp->getMain3DScene()); + avatarPtr->render(args); } } template <> uint32_t metaFetchMetaSubItems(const AvatarSharedPointer& avatar, ItemIDs& subItems) { @@ -579,7 +579,7 @@ void Avatar::postUpdate(float deltaTime) { } } -void Avatar::render(RenderArgs* renderArgs, const render::ScenePointer& scene) { +void Avatar::render(RenderArgs* renderArgs) { auto& batch = *renderArgs->_batch; PROFILE_RANGE_BATCH(batch, __FUNCTION__); @@ -651,7 +651,7 @@ void Avatar::render(RenderArgs* renderArgs, const render::ScenePointer& scene) { float distanceToTarget = glm::length(toTarget); { - fixupModelsInScene(scene); + fixupModelsInScene(renderArgs->_scene); if (renderArgs->_renderMode != RenderArgs::SHADOW_RENDER_MODE) { // add local lights diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 816e800641..50edb4e947 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -81,7 +81,7 @@ public: void simulate(float deltaTime, bool inView); virtual void simulateAttachments(float deltaTime); - virtual void render(RenderArgs* renderArgs, const render::ScenePointer& scene); + virtual void render(RenderArgs* renderArgs); void addToScene(AvatarSharedPointer self, std::shared_ptr scene, render::Transaction& transaction); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 1e491eaea2..8ff93660ac 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -752,13 +752,12 @@ controller::Pose MyAvatar::getRightHandTipPose() const { } // virtual -void MyAvatar::render(RenderArgs* renderArgs, const render::ScenePointer& scene) { +void MyAvatar::render(RenderArgs* renderArgs) { // don't render if we've been asked to disable local rendering if (!_shouldRender) { return; // exit early } - - Avatar::render(renderArgs, scene); + Avatar::render(renderArgs); } void MyAvatar::overrideAnimation(const QString& url, float fps, bool loop, float firstFrame, float lastFrame) { diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 599411e38a..b5d26b435e 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -525,7 +525,7 @@ private: void simulate(float deltaTime); void updateFromTrackers(float deltaTime); - virtual void render(RenderArgs* renderArgs, const render::ScenePointer& scene) override; + virtual void render(RenderArgs* renderArgs) override; virtual bool shouldRenderHead(const RenderArgs* renderArgs) const override; void setShouldRenderLocally(bool shouldRender) { _shouldRender = shouldRender; setEnableMeshVisible(shouldRender); } bool getShouldRenderLocally() const { return _shouldRender; } diff --git a/libraries/shared/src/RenderArgs.h b/libraries/shared/src/RenderArgs.h index 29cd007a4c..10a9a20287 100644 --- a/libraries/shared/src/RenderArgs.h +++ b/libraries/shared/src/RenderArgs.h @@ -23,6 +23,10 @@ class AABox; class OctreeRenderer; +namespace render { + class Scene; + using ScenePointer = std::shared_ptr; +} namespace gpu { class Batch; @@ -126,6 +130,7 @@ public: bool _enableTexturing { true }; RenderDetails _details; + render::ScenePointer _scene; // HACK int8_t _cameraMode { -1 }; // HACK }; From a3682a1a0ea5725136bf8bc038731d11a5463c98 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 12 Apr 2017 13:30:08 -0700 Subject: [PATCH 26/33] cleanup includes in Avatar.cpp and remove cruft --- interface/src/Physics.cpp | 44 ------------------------ interface/src/Physics.h | 18 ---------- interface/src/avatar/Avatar.cpp | 24 ++++--------- interface/src/avatar/Avatar.h | 4 --- interface/src/avatar/AvatarManager.h | 4 ++- interface/src/avatar/AvatarMotionState.h | 2 -- interface/src/avatar/MyAvatar.cpp | 1 - 7 files changed, 9 insertions(+), 88 deletions(-) delete mode 100644 interface/src/Physics.cpp delete mode 100644 interface/src/Physics.h diff --git a/interface/src/Physics.cpp b/interface/src/Physics.cpp deleted file mode 100644 index 7efa520571..0000000000 --- a/interface/src/Physics.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// -// Physics.cpp -// interface/src -// -// Copyright 2013 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 "Util.h" -#include "world.h" -#include "Physics.h" - -// -// Applies static friction: maxVelocity is the largest velocity for which there -// there is friction, and strength is the amount of friction force applied to reduce -// velocity. -// -void applyStaticFriction(float deltaTime, glm::vec3& velocity, float maxVelocity, float strength) { - float v = glm::length(velocity); - if (v < maxVelocity) { - velocity *= glm::clamp((1.0f - deltaTime * strength * (1.0f - v / maxVelocity)), 0.0f, 1.0f); - } -} - -// -// Applies velocity damping, with a strength value for linear and squared velocity damping -// - -void applyDamping(float deltaTime, glm::vec3& velocity, float linearStrength, float squaredStrength) { - if (squaredStrength == 0.0f) { - velocity *= glm::clamp(1.0f - deltaTime * linearStrength, 0.0f, 1.0f); - } else { - velocity *= glm::clamp(1.0f - deltaTime * (linearStrength + glm::length(velocity) * squaredStrength), 0.0f, 1.0f); - } -} - -void applyDampedSpring(float deltaTime, glm::vec3& velocity, glm::vec3& position, glm::vec3& targetPosition, float k, float damping) { - -} diff --git a/interface/src/Physics.h b/interface/src/Physics.h deleted file mode 100644 index 97e873d920..0000000000 --- a/interface/src/Physics.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// Physics.h -// interface/src -// -// Created by Philip on 4/25/13. -// Copyright 2013 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_Physics_h -#define hifi_Physics_h - -void applyStaticFriction(float deltaTime, glm::vec3& velocity, float maxVelocity, float strength); -void applyDamping(float deltaTime, glm::vec3& velocity, float linearStrength, float squaredStrength); - -#endif // hifi_Physics_h diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 73ca149461..78ffd22540 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -9,20 +9,14 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include +#include "Avatar.h" -#include -#include - -#include -#include -#include -#include +#include +#include #include #include -#include -#include +#include #include #include #include @@ -31,19 +25,13 @@ #include #include #include -#include #include #include -#include "Application.h" -#include "Avatar.h" #include "AvatarManager.h" #include "AvatarMotionState.h" -#include "Head.h" +#include "Camera.h" #include "Menu.h" -#include "Physics.h" -#include "Util.h" -#include "world.h" #include "InterfaceLogging.h" #include "SceneScriptingInterface.h" #include "SoftAttachmentModel.h" @@ -583,7 +571,7 @@ void Avatar::render(RenderArgs* renderArgs) { auto& batch = *renderArgs->_batch; PROFILE_RANGE_BATCH(batch, __FUNCTION__); - if (glm::distance(DependencyManager::get()->getMyAvatar()->getPosition(), getPosition()) < 10.0f) { + if (glm::distance(DependencyManager::get()->getMyAvatarPosition(), getPosition()) < 10.0f) { auto geometryCache = DependencyManager::get(); // render pointing lasers diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 50edb4e947..e8a5366586 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -14,19 +14,15 @@ #include #include -#include #include #include #include - #include -#include "Camera.h" #include "Head.h" #include "SkeletonModel.h" -#include "world.h" #include "Rig.h" #include diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index b86de68894..6eabbd081f 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -23,6 +23,7 @@ #include #include "Avatar.h" +#include "MyAvatar.h" #include "AvatarMotionState.h" #include "ScriptAvatar.h" @@ -42,6 +43,7 @@ public: void init(); std::shared_ptr getMyAvatar() { return _myAvatar; } + glm::vec3 getMyAvatarPosition() const { return _myAvatar->getPosition(); } // Null/Default-constructed QUuids will return MyAvatar Q_INVOKABLE virtual ScriptAvatarData* getAvatar(QUuid avatarID) override { return new ScriptAvatar(getAvatarBySessionID(avatarID)); } @@ -110,7 +112,7 @@ private: QVector _avatarsToFade; - SetOfAvatarMotionStates _motionStatesThatMightUpdate; + QSet _motionStatesThatMightUpdate; VectorOfMotionStates _motionStatesToRemoveFromPhysics; SetOfMotionStates _motionStatesToAddToPhysics; diff --git a/interface/src/avatar/AvatarMotionState.h b/interface/src/avatar/AvatarMotionState.h index 66824d6e37..98b2b69373 100644 --- a/interface/src/avatar/AvatarMotionState.h +++ b/interface/src/avatar/AvatarMotionState.h @@ -83,6 +83,4 @@ protected: uint32_t _dirtyFlags; }; -typedef QSet SetOfAvatarMotionStates; - #endif // hifi_AvatarMotionState_h diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 8ff93660ac..af54f08d54 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -48,7 +48,6 @@ #include "AvatarActionHold.h" #include "Menu.h" #include "MyAvatar.h" -#include "Physics.h" #include "Util.h" #include "InterfaceLogging.h" #include "DebugDraw.h" From e60a28620da6b6320c363efcc1e630a53e72d68e Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 12 Apr 2017 13:38:14 -0700 Subject: [PATCH 27/33] cleanup FancyCamera implementation --- interface/src/FancyCamera.cpp | 10 ++-------- interface/src/FancyCamera.h | 1 + 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/interface/src/FancyCamera.cpp b/interface/src/FancyCamera.cpp index d22a1ba56c..7bb64a4a8e 100644 --- a/interface/src/FancyCamera.cpp +++ b/interface/src/FancyCamera.cpp @@ -1,5 +1,5 @@ // -// Camera.cpp +// FancyCamera.cpp // interface/src // // Copyright 2017 High Fidelity, Inc. @@ -8,15 +8,9 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -//#include - -//#include -//#include +#include "FancyCamera.h" #include "Application.h" -#include "FancyCamera.h" -//#include "Menu.h" -//#include "Util.h" QUuid FancyCamera::getCameraEntity() const { diff --git a/interface/src/FancyCamera.h b/interface/src/FancyCamera.h index 9ffa6cafd8..98bba131f3 100644 --- a/interface/src/FancyCamera.h +++ b/interface/src/FancyCamera.h @@ -13,6 +13,7 @@ #include "Camera.h" +// TODO: come up with a better name than "FancyCamera" class FancyCamera : public Camera { Q_OBJECT From 0cc67636171e1b65f90d1a277eb89d88a0a76e17 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 12 Apr 2017 14:45:57 -0700 Subject: [PATCH 28/33] fix build by including EntityItem.h --- interface/src/FancyCamera.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/src/FancyCamera.h b/interface/src/FancyCamera.h index 98bba131f3..cd231cd929 100644 --- a/interface/src/FancyCamera.h +++ b/interface/src/FancyCamera.h @@ -13,6 +13,8 @@ #include "Camera.h" +#include + // TODO: come up with a better name than "FancyCamera" class FancyCamera : public Camera { Q_OBJECT From 31bfc98b877afdef508e46430bb74063e728018e Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 12 Apr 2017 14:46:31 -0700 Subject: [PATCH 29/33] use const reference for ScenePointer when possible --- interface/src/avatar/Avatar.cpp | 10 ++--- interface/src/avatar/Avatar.h | 10 ++--- interface/src/avatar/MyAvatar.cpp | 11 ++---- interface/src/avatar/MyAvatar.h | 2 +- interface/src/ui/overlays/ModelOverlay.cpp | 4 +- interface/src/ui/overlays/ModelOverlay.h | 4 +- interface/src/ui/overlays/Overlay.cpp | 4 +- interface/src/ui/overlays/Overlay.h | 4 +- .../src/RenderableEntityItem.h | 8 ++-- .../src/RenderableLightEntityItem.cpp | 4 +- .../src/RenderableLightEntityItem.h | 4 +- .../src/RenderableModelEntityItem.cpp | 37 +++++++++---------- .../src/RenderableModelEntityItem.h | 4 +- .../RenderableParticleEffectEntityItem.cpp | 6 +-- .../src/RenderableParticleEffectEntityItem.h | 4 +- .../src/RenderablePolyVoxEntityItem.cpp | 4 +- .../src/RenderablePolyVoxEntityItem.h | 4 +- .../src/RenderableZoneEntityItem.cpp | 4 +- .../src/RenderableZoneEntityItem.h | 4 +- libraries/entities/src/EntityItem.h | 4 +- libraries/render-utils/src/Model.cpp | 16 ++++---- libraries/render-utils/src/Model.h | 12 +++--- 22 files changed, 79 insertions(+), 85 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 78ffd22540..48aef547c9 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -507,7 +507,7 @@ static TextRenderer3D* textRenderer(TextRendererType type) { return displayNameRenderer; } -void Avatar::addToScene(AvatarSharedPointer self, std::shared_ptr scene, render::Transaction& transaction) { +void Avatar::addToScene(AvatarSharedPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { auto avatarPayload = new render::Payload(self); auto avatarPayloadPointer = Avatar::PayloadPointer(avatarPayload); _renderItemID = scene->allocateID(); @@ -519,7 +519,7 @@ void Avatar::addToScene(AvatarSharedPointer self, std::shared_ptr } } -void Avatar::removeFromScene(AvatarSharedPointer self, std::shared_ptr scene, render::Transaction& transaction) { +void Avatar::removeFromScene(AvatarSharedPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { transaction.removeItem(_renderItemID); render::Item::clearID(_renderItemID); _skeletonModel->removeFromScene(scene, transaction); @@ -693,7 +693,7 @@ glm::quat Avatar::computeRotationFromBodyToWorldUp(float proportion) const { return glm::angleAxis(angle * proportion, axis); } -void Avatar::fixupModelsInScene(render::ScenePointer scene) { +void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { _attachmentsToDelete.clear(); // check to see if when we added our models to the scene they were ready, if they were not ready, then @@ -1470,7 +1470,7 @@ QList Avatar::getSkeleton() { return QList(); } -void Avatar::addToScene(AvatarSharedPointer myHandle, render::ScenePointer scene) { +void Avatar::addToScene(AvatarSharedPointer myHandle, const render::ScenePointer& scene) { if (scene) { render::Transaction transaction; auto nodelist = DependencyManager::get(); @@ -1485,7 +1485,7 @@ void Avatar::addToScene(AvatarSharedPointer myHandle, render::ScenePointer scene } } -void Avatar::ensureInScene(AvatarSharedPointer self, render::ScenePointer scene) { +void Avatar::ensureInScene(AvatarSharedPointer self, const render::ScenePointer& scene) { if (!render::Item::isValidID(_renderItemID)) { addToScene(self, scene); } diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index e8a5366586..8c055885fd 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -79,10 +79,10 @@ public: virtual void render(RenderArgs* renderArgs); - void addToScene(AvatarSharedPointer self, std::shared_ptr scene, + void addToScene(AvatarSharedPointer self, const render::ScenePointer& scene, render::Transaction& transaction); - void removeFromScene(AvatarSharedPointer self, std::shared_ptr scene, + void removeFromScene(AvatarSharedPointer self, const render::ScenePointer& scene, render::Transaction& transaction); void updateRenderItem(render::Transaction& transaction); @@ -303,7 +303,7 @@ protected: Transform calculateDisplayNameTransform(const ViewFrustum& view, const glm::vec3& textPosition) const; void renderDisplayName(gpu::Batch& batch, const ViewFrustum& view, const glm::vec3& textPosition) const; virtual bool shouldRenderHead(const RenderArgs* renderArgs) const; - virtual void fixupModelsInScene(render::ScenePointer scene); + virtual void fixupModelsInScene(const render::ScenePointer& scene); virtual void updatePalms(); @@ -314,8 +314,8 @@ protected: ThreadSafeValueCache _rightPalmPositionCache { glm::vec3() }; ThreadSafeValueCache _rightPalmRotationCache { glm::quat() }; - void addToScene(AvatarSharedPointer self, render::ScenePointer scene); - void ensureInScene(AvatarSharedPointer self, render::ScenePointer scene); + void addToScene(AvatarSharedPointer self, const render::ScenePointer& scene); + void ensureInScene(AvatarSharedPointer self, const render::ScenePointer& scene); bool isInScene() const { return render::Item::isValidID(_renderItemID); } // Some rate tracking support diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index af54f08d54..f4f078c9e5 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -925,8 +925,7 @@ void MyAvatar::setEnableDebugDrawIKTargets(bool isEnabled) { } void MyAvatar::setEnableMeshVisible(bool isEnabled) { - render::ScenePointer scene = qApp->getMain3DScene(); - _skeletonModel->setVisibleInScene(isEnabled, scene); + _skeletonModel->setVisibleInScene(isEnabled, qApp->getMain3DScene()); } void MyAvatar::setUseAnimPreAndPostRotations(bool isEnabled) { @@ -1223,8 +1222,7 @@ void MyAvatar::clearJointsData() { void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { Avatar::setSkeletonModelURL(skeletonModelURL); - render::ScenePointer scene = qApp->getMain3DScene(); - _skeletonModel->setVisibleInScene(true, scene); + _skeletonModel->setVisibleInScene(true, qApp->getMain3DScene()); _headBoneSet.clear(); } @@ -1538,7 +1536,7 @@ void MyAvatar::attach(const QString& modelURL, const QString& jointName, Avatar::attach(modelURL, jointName, translation, rotation, scale, isSoft, allowDuplicates, useSaved); } -void MyAvatar::setVisibleInSceneIfReady(Model* model, render::ScenePointer scene, bool visible) { +void MyAvatar::setVisibleInSceneIfReady(Model* model, const render::ScenePointer& scene, bool visible) { if (model->isActive() && model->isRenderable()) { model->setVisibleInScene(visible, scene); } @@ -1632,8 +1630,7 @@ void MyAvatar::postUpdate(float deltaTime) { Avatar::postUpdate(deltaTime); - render::ScenePointer scene = qApp->getMain3DScene(); - if (DependencyManager::get()->shouldRenderAvatars() && _skeletonModel->initWhenReady(scene)) { + if (DependencyManager::get()->shouldRenderAvatars() && _skeletonModel->initWhenReady(qApp->getMain3DScene())) { initHeadBones(); _skeletonModel->setCauterizeBoneSet(_headBoneSet); _fstAnimGraphOverrideUrl = _skeletonModel->getGeometry()->getAnimGraphOverrideUrl(); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index b5d26b435e..74af44c99a 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -551,7 +551,7 @@ private: // These are made private for MyAvatar so that you will use the "use" methods instead virtual void setSkeletonModelURL(const QUrl& skeletonModelURL) override; - void setVisibleInSceneIfReady(Model* model, render::ScenePointer scene, bool visiblity); + void setVisibleInSceneIfReady(Model* model, const render::ScenePointer& scene, bool visiblity); // derive avatar body position and orientation from the current HMD Sensor location. // results are in HMD frame diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 98ca7110ae..ccaa1d4fbc 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -58,13 +58,13 @@ void ModelOverlay::update(float deltatime) { _isLoaded = _model->isActive(); } -bool ModelOverlay::addToScene(Overlay::Pointer overlay, std::shared_ptr scene, render::Transaction& transaction) { +bool ModelOverlay::addToScene(Overlay::Pointer overlay, const render::ScenePointer& scene, render::Transaction& transaction) { Volume3DOverlay::addToScene(overlay, scene, transaction); _model->addToScene(scene, transaction); return true; } -void ModelOverlay::removeFromScene(Overlay::Pointer overlay, std::shared_ptr scene, render::Transaction& transaction) { +void ModelOverlay::removeFromScene(Overlay::Pointer overlay, const render::ScenePointer& scene, render::Transaction& transaction) { Volume3DOverlay::removeFromScene(overlay, scene, transaction); _model->removeFromScene(scene, transaction); } diff --git a/interface/src/ui/overlays/ModelOverlay.h b/interface/src/ui/overlays/ModelOverlay.h index 245688156f..a3ddeed480 100644 --- a/interface/src/ui/overlays/ModelOverlay.h +++ b/interface/src/ui/overlays/ModelOverlay.h @@ -36,8 +36,8 @@ public: virtual ModelOverlay* createClone() const override; - virtual bool addToScene(Overlay::Pointer overlay, std::shared_ptr scene, render::Transaction& transaction) override; - virtual void removeFromScene(Overlay::Pointer overlay, std::shared_ptr scene, render::Transaction& transaction) override; + virtual bool addToScene(Overlay::Pointer overlay, const render::ScenePointer& scene, render::Transaction& transaction) override; + virtual void removeFromScene(Overlay::Pointer overlay, const render::ScenePointer& scene, render::Transaction& transaction) override; void locationChanged(bool tellPhysics) override; diff --git a/interface/src/ui/overlays/Overlay.cpp b/interface/src/ui/overlays/Overlay.cpp index e3004bd9c6..b650da3522 100644 --- a/interface/src/ui/overlays/Overlay.cpp +++ b/interface/src/ui/overlays/Overlay.cpp @@ -196,13 +196,13 @@ float Overlay::updatePulse() { return _pulse; } -bool Overlay::addToScene(Overlay::Pointer overlay, std::shared_ptr scene, render::Transaction& transaction) { +bool Overlay::addToScene(Overlay::Pointer overlay, const render::ScenePointer& scene, render::Transaction& transaction) { _renderItemID = scene->allocateID(); transaction.resetItem(_renderItemID, std::make_shared(overlay)); return true; } -void Overlay::removeFromScene(Overlay::Pointer overlay, std::shared_ptr scene, render::Transaction& transaction) { +void Overlay::removeFromScene(Overlay::Pointer overlay, const render::ScenePointer& scene, render::Transaction& transaction) { transaction.removeItem(_renderItemID); render::Item::clearID(_renderItemID); } diff --git a/interface/src/ui/overlays/Overlay.h b/interface/src/ui/overlays/Overlay.h index 9849c71a1f..4ad1b070b1 100644 --- a/interface/src/ui/overlays/Overlay.h +++ b/interface/src/ui/overlays/Overlay.h @@ -48,8 +48,8 @@ public: virtual AABox getBounds() const = 0; virtual bool supportsGetProperty() const { return true; } - virtual bool addToScene(Overlay::Pointer overlay, std::shared_ptr scene, render::Transaction& transaction); - virtual void removeFromScene(Overlay::Pointer overlay, std::shared_ptr scene, render::Transaction& transaction); + virtual bool addToScene(Overlay::Pointer overlay, const render::ScenePointer& scene, render::Transaction& transaction); + virtual void removeFromScene(Overlay::Pointer overlay, const render::ScenePointer& scene, render::Transaction& transaction); virtual const render::ShapeKey getShapeKey() { return render::ShapeKey::Builder::ownPipeline(); } diff --git a/libraries/entities-renderer/src/RenderableEntityItem.h b/libraries/entities-renderer/src/RenderableEntityItem.h index 2f053924ab..1c08707e82 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.h +++ b/libraries/entities-renderer/src/RenderableEntityItem.h @@ -54,7 +54,7 @@ namespace render { // Mixin class for implementing basic single item rendering class SimpleRenderableEntityItem { public: - bool addToScene(EntityItemPointer self, std::shared_ptr scene, render::Transaction& transaction) { + bool addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { _myItem = scene->allocateID(); auto renderData = std::make_shared(self, _myItem); @@ -69,7 +69,7 @@ public: return true; } - void removeFromScene(EntityItemPointer self, std::shared_ptr scene, render::Transaction& transaction) { + void removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { transaction.removeItem(_myItem); render::Item::clearID(_myItem); } @@ -99,8 +99,8 @@ private: #define SIMPLE_RENDERABLE() \ public: \ - virtual bool addToScene(EntityItemPointer self, std::shared_ptr scene, render::Transaction& transaction) override { return _renderHelper.addToScene(self, scene, transaction); } \ - virtual void removeFromScene(EntityItemPointer self, std::shared_ptr scene, render::Transaction& transaction) override { _renderHelper.removeFromScene(self, scene, transaction); } \ + virtual bool addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override { return _renderHelper.addToScene(self, scene, transaction); } \ + virtual void removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override { _renderHelper.removeFromScene(self, scene, transaction); } \ virtual void locationChanged(bool tellPhysics = true) override { EntityItem::locationChanged(tellPhysics); _renderHelper.notifyChanged(); } \ virtual void dimensionsChanged() override { EntityItem::dimensionsChanged(); _renderHelper.notifyChanged(); } \ void checkFading() { \ diff --git a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp index 0b8592e678..cc292759f0 100644 --- a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp @@ -27,7 +27,7 @@ RenderableLightEntityItem::RenderableLightEntityItem(const EntityItemID& entityI { } -bool RenderableLightEntityItem::addToScene(EntityItemPointer self, std::shared_ptr scene, render::Transaction& transaction) { +bool RenderableLightEntityItem::addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { _myItem = scene->allocateID(); auto renderItem = std::make_shared(); @@ -51,7 +51,7 @@ void RenderableLightEntityItem::somethingChangedNotification() { LightEntityItem::somethingChangedNotification(); } -void RenderableLightEntityItem::removeFromScene(EntityItemPointer self, std::shared_ptr scene, render::Transaction& transaction) { +void RenderableLightEntityItem::removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { transaction.removeItem(_myItem); render::Item::clearID(_myItem); } diff --git a/libraries/entities-renderer/src/RenderableLightEntityItem.h b/libraries/entities-renderer/src/RenderableLightEntityItem.h index 42a5dbc91a..3676023bed 100644 --- a/libraries/entities-renderer/src/RenderableLightEntityItem.h +++ b/libraries/entities-renderer/src/RenderableLightEntityItem.h @@ -30,10 +30,10 @@ public: void updateLightFromEntity(render::Transaction& transaction); - virtual bool addToScene(EntityItemPointer self, std::shared_ptr scene, render::Transaction& transaction) override; + virtual bool addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; virtual void somethingChangedNotification() override; - virtual void removeFromScene(EntityItemPointer self, std::shared_ptr scene, render::Transaction& transaction) override; + virtual void removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; virtual void locationChanged(bool tellPhysics = true) override; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 99669ef3bf..8b1ba75259 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -91,13 +91,13 @@ bool RenderableModelEntityItem::setProperties(const EntityItemProperties& proper return somethingChanged; } -int RenderableModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, +int RenderableModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) { QString oldModelURL = getModelURL(); - int bytesRead = ModelEntityItem::readEntitySubclassDataFromBuffer(data, bytesLeftToRead, - args, propertyFlags, + int bytesRead = ModelEntityItem::readEntitySubclassDataFromBuffer(data, bytesLeftToRead, + args, propertyFlags, overwriteLocalData, somethingChanged); if (oldModelURL != getModelURL()) { _needsModelReload = true; @@ -137,7 +137,7 @@ void RenderableModelEntityItem::remapTextures() { if (!_model) { return; // nothing to do if we don't have a model } - + if (!_model->isLoaded()) { return; // nothing to do if the model has not yet loaded } @@ -189,16 +189,16 @@ public: RenderableModelEntityItemMeta(EntityItemPointer entity) : entity(entity){ } typedef render::Payload Payload; typedef Payload::DataPointer Pointer; - + EntityItemPointer entity; }; namespace render { - template <> const ItemKey payloadGetKey(const RenderableModelEntityItemMeta::Pointer& payload) { + template <> const ItemKey payloadGetKey(const RenderableModelEntityItemMeta::Pointer& payload) { return ItemKey::Builder::opaqueShape().withTypeMeta(); } - - template <> const Item::Bound payloadGetBound(const RenderableModelEntityItemMeta::Pointer& payload) { + + template <> const Item::Bound payloadGetBound(const RenderableModelEntityItemMeta::Pointer& payload) { if (payload && payload->entity) { bool success; auto result = payload->entity->getAABox(success); @@ -228,7 +228,7 @@ namespace render { } } -bool RenderableModelEntityItem::addToScene(EntityItemPointer self, std::shared_ptr scene, +bool RenderableModelEntityItem::addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { _myMetaItem = scene->allocateID(); @@ -249,7 +249,7 @@ bool RenderableModelEntityItem::addToScene(EntityItemPointer self, std::shared_p return true; } -void RenderableModelEntityItem::removeFromScene(EntityItemPointer self, std::shared_ptr scene, +void RenderableModelEntityItem::removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { transaction.removeItem(_myMetaItem); render::Item::clearID(_myMetaItem); @@ -437,7 +437,7 @@ void RenderableModelEntityItem::render(RenderArgs* args) { _model->renderDebugMeshBoxes(batch); #endif - render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene(); + const render::ScenePointer& scene = AbstractViewStateInterface::instance()->getMain3DScene(); // FIXME: this seems like it could be optimized if we tracked our last known visible state in // the renderable item. As it stands now the model checks it's visible/invisible state @@ -502,11 +502,11 @@ ModelPointer RenderableModelEntityItem::getModel(QSharedPointerthread()) { return _model; } - + _needsModelReload = false; // this is the reload // If we have a URL, then we will want to end up returning a model... @@ -526,7 +526,7 @@ ModelPointer RenderableModelEntityItem::getModel(QSharedPointergetMain3DScene(); + const render::ScenePointer& scene = AbstractViewStateInterface::instance()->getMain3DScene(); render::Transaction transaction; _model->removeFromScene(scene, transaction); scene->enqueueTransaction(transaction); @@ -552,7 +552,7 @@ void RenderableModelEntityItem::update(const quint64& now) { properties.setLastEdited(usecTimestampNow()); // we must set the edit time since we're editing it auto extents = _model->getMeshExtents(); properties.setDimensions(extents.maximum - extents.minimum); - qCDebug(entitiesrenderer) << "Autoresizing" << (!getName().isEmpty() ? getName() : getModelURL()) + qCDebug(entitiesrenderer) << "Autoresizing" << (!getName().isEmpty() ? getName() : getModelURL()) << "from mesh extents"; QMetaObject::invokeMethod(DependencyManager::get().data(), "editEntity", Qt::QueuedConnection, @@ -594,8 +594,8 @@ bool RenderableModelEntityItem::supportsDetailedRayIntersection() const { return _model && _model->isLoaded(); } -bool RenderableModelEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - bool& keepSearching, OctreeElementPointer& element, float& distance, BoxFace& face, +bool RenderableModelEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, + bool& keepSearching, OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, void** intersectedObject, bool precisionPicking) const { if (!_model) { return true; @@ -1239,11 +1239,10 @@ void RenderableModelEntityItem::locationChanged(bool tellPhysics) { return; } - render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene(); render::Transaction transaction; transaction.updateItem(myMetaItem); - scene->enqueueTransaction(transaction); + AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction); }); } } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 7eab5172d8..b440aacd7e 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -40,8 +40,8 @@ public: void doInitialModelSimulation(); - virtual bool addToScene(EntityItemPointer self, std::shared_ptr scene, render::Transaction& transaction) override; - virtual void removeFromScene(EntityItemPointer self, std::shared_ptr scene, render::Transaction& transaction) override; + virtual bool addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; + virtual void removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; void updateModelBounds(); diff --git a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp index fdf9ba888f..34dc86d92a 100644 --- a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp @@ -161,7 +161,7 @@ RenderableParticleEffectEntityItem::RenderableParticleEffectEntityItem(const Ent } bool RenderableParticleEffectEntityItem::addToScene(EntityItemPointer self, - render::ScenePointer scene, + const render::ScenePointer& scene, render::Transaction& transaction) { _scene = scene; _renderItemId = _scene->allocateID(); @@ -176,7 +176,7 @@ bool RenderableParticleEffectEntityItem::addToScene(EntityItemPointer self, } void RenderableParticleEffectEntityItem::removeFromScene(EntityItemPointer self, - render::ScenePointer scene, + const render::ScenePointer& scene, render::Transaction& transaction) { transaction.removeItem(_renderItemId); _scene = nullptr; @@ -323,4 +323,4 @@ void RenderableParticleEffectEntityItem::notifyBoundChanged() { }); _scene->enqueueTransaction(transaction); -} \ No newline at end of file +} diff --git a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.h b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.h index 9b31c92b07..daa6ba0691 100644 --- a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.h +++ b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.h @@ -25,8 +25,8 @@ public: void updateRenderItem(); - virtual bool addToScene(EntityItemPointer self, render::ScenePointer scene, render::Transaction& transaction) override; - virtual void removeFromScene(EntityItemPointer self, render::ScenePointer scene, render::Transaction& transaction) override; + virtual bool addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; + virtual void removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; protected: virtual void locationChanged(bool tellPhysics = true) override { EntityItem::locationChanged(tellPhysics); notifyBoundChanged(); } diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index ee3b068af9..fd5346093b 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -816,7 +816,7 @@ void RenderablePolyVoxEntityItem::render(RenderArgs* args) { } bool RenderablePolyVoxEntityItem::addToScene(EntityItemPointer self, - std::shared_ptr scene, + const render::ScenePointer& scene, render::Transaction& transaction) { _myItem = scene->allocateID(); @@ -834,7 +834,7 @@ bool RenderablePolyVoxEntityItem::addToScene(EntityItemPointer self, } void RenderablePolyVoxEntityItem::removeFromScene(EntityItemPointer self, - std::shared_ptr scene, + const render::ScenePointer& scene, render::Transaction& transaction) { transaction.removeItem(_myItem); render::Item::clearID(_myItem); diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h index c0bc8ba610..ff97f09ee1 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -106,10 +106,10 @@ public: virtual void setZTextureURL(const QString& zTextureURL) override; virtual bool addToScene(EntityItemPointer self, - std::shared_ptr scene, + const render::ScenePointer& scene, render::Transaction& transaction) override; virtual void removeFromScene(EntityItemPointer self, - std::shared_ptr scene, + const render::ScenePointer& scene, render::Transaction& transaction) override; virtual void setXNNeighborID(const EntityItemID& xNNeighborID) override; diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index c9a45465c2..66495a7054 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -217,7 +217,7 @@ namespace render { } } -bool RenderableZoneEntityItem::addToScene(EntityItemPointer self, std::shared_ptr scene, +bool RenderableZoneEntityItem::addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { _myMetaItem = scene->allocateID(); @@ -232,7 +232,7 @@ bool RenderableZoneEntityItem::addToScene(EntityItemPointer self, std::shared_pt return true; } -void RenderableZoneEntityItem::removeFromScene(EntityItemPointer self, std::shared_ptr scene, +void RenderableZoneEntityItem::removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { transaction.removeItem(_myMetaItem); render::Item::clearID(_myMetaItem); diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.h b/libraries/entities-renderer/src/RenderableZoneEntityItem.h index d86a22509b..c81afdab08 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.h +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.h @@ -38,8 +38,8 @@ public: virtual void render(RenderArgs* args) override; virtual bool contains(const glm::vec3& point) const override; - virtual bool addToScene(EntityItemPointer self, std::shared_ptr scene, render::Transaction& transaction) override; - virtual void removeFromScene(EntityItemPointer self, std::shared_ptr scene, render::Transaction& transaction) override; + virtual bool addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; + virtual void removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) override; render::ItemID getRenderItemID() const { return _myMetaItem; } diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 1ce916de66..3f75c595a5 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -151,9 +151,9 @@ public: bool& somethingChanged) { somethingChanged = false; return 0; } - virtual bool addToScene(EntityItemPointer self, std::shared_ptr scene, + virtual bool addToScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { return false; } // by default entity items don't add to scene - virtual void removeFromScene(EntityItemPointer self, std::shared_ptr scene, + virtual void removeFromScene(EntityItemPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { } // by default entity items don't add to scene virtual void render(RenderArgs* args) { } // by default entity items don't know how to render diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index c274d69af6..309182b25e 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -231,8 +231,6 @@ void Model::updateRenderItems() { // We need to update them here so we can correctly update the bounding box. self->updateClusterMatrices(); - render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene(); - uint32_t deleteGeometryCounter = self->_deleteGeometryCounter; render::Transaction transaction; @@ -266,7 +264,7 @@ void Model::updateRenderItems() { }); } - scene->enqueueTransaction(transaction); + AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction); }); } @@ -534,7 +532,7 @@ void Model::calculateTriangleSets() { } } -void Model::setVisibleInScene(bool newValue, std::shared_ptr scene) { +void Model::setVisibleInScene(bool newValue, const render::ScenePointer& scene) { if (_isVisible != newValue) { _isVisible = newValue; @@ -550,7 +548,7 @@ void Model::setVisibleInScene(bool newValue, std::shared_ptr scen } -void Model::setLayeredInFront(bool layered, std::shared_ptr scene) { +void Model::setLayeredInFront(bool layered, const render::ScenePointer& scene) { if (_isLayeredInFront != layered) { _isLayeredInFront = layered; @@ -565,7 +563,7 @@ void Model::setLayeredInFront(bool layered, std::shared_ptr scene } } -bool Model::addToScene(std::shared_ptr scene, +bool Model::addToScene(const render::ScenePointer& scene, render::Transaction& transaction, render::Item::Status::Getters& statusGetters) { bool readyToRender = _collisionGeometry || isLoaded(); @@ -622,7 +620,7 @@ bool Model::addToScene(std::shared_ptr scene, return somethingAdded; } -void Model::removeFromScene(std::shared_ptr scene, render::Transaction& transaction) { +void Model::removeFromScene(const render::ScenePointer& scene, render::Transaction& transaction) { foreach (auto item, _modelMeshRenderItemsMap.keys()) { transaction.removeItem(item); } @@ -795,7 +793,7 @@ void Model::setURL(const QUrl& url) { { render::Transaction transaction; - render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene(); + const render::ScenePointer& scene = AbstractViewStateInterface::instance()->getMain3DScene(); if (scene) { removeFromScene(scene, transaction); scene->enqueueTransaction(transaction); @@ -1271,7 +1269,7 @@ bool Model::isRenderable() const { return !_meshStates.isEmpty() || (isLoaded() && _renderGeometry->getMeshes().empty()); } -bool Model::initWhenReady(render::ScenePointer scene) { +bool Model::initWhenReady(const render::ScenePointer& scene) { // NOTE: this only called by SkeletonModel if (_addedToScene || !isRenderable()) { return false; diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index e852358bc4..62e045a3c1 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -81,21 +81,21 @@ public: const QUrl& getURL() const { return _url; } // new Scene/Engine rendering support - void setVisibleInScene(bool newValue, std::shared_ptr scene); - void setLayeredInFront(bool layered, std::shared_ptr scene); + void setVisibleInScene(bool newValue, const render::ScenePointer& scene); + void setLayeredInFront(bool layered, const render::ScenePointer& scene); bool needsFixupInScene() const; bool needsReload() const { return _needsReload; } - bool initWhenReady(render::ScenePointer scene); - bool addToScene(std::shared_ptr scene, + bool initWhenReady(const render::ScenePointer& scene); + bool addToScene(const render::ScenePointer& scene, render::Transaction& transaction) { auto getters = render::Item::Status::Getters(0); return addToScene(scene, transaction, getters); } - bool addToScene(std::shared_ptr scene, + bool addToScene(const render::ScenePointer& scene, render::Transaction& transaction, render::Item::Status::Getters& statusGetters); - void removeFromScene(std::shared_ptr scene, render::Transaction& transaction); + void removeFromScene(const render::ScenePointer& scene, render::Transaction& transaction); bool isRenderable() const; bool isVisible() const { return _isVisible; } From 71c5644c23a5f1fb54e1a06a6c3d59081851dfc4 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 13 Apr 2017 16:54:02 -0700 Subject: [PATCH 30/33] more shared_ptr by const reference --- interface/src/avatar/AvatarManager.cpp | 43 ++++++++++---------------- 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 4ed9d83b8c..ec47bcd0fe 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -105,7 +105,7 @@ void AvatarManager::init() { this, &AvatarManager::updateAvatarRenderStatus, Qt::QueuedConnection); if (_shouldRender) { - render::ScenePointer scene = qApp->getMain3DScene(); + const render::ScenePointer& scene = qApp->getMain3DScene(); render::Transaction transaction; _myAvatar->addToScene(_myAvatar, scene, transaction); scene->enqueueTransaction(transaction); @@ -198,8 +198,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { // for ALL avatars... if (_shouldRender) { - render::ScenePointer scene = qApp->getMain3DScene(); - avatar->ensureInScene(avatar, scene); + avatar->ensureInScene(avatar, qApp->getMain3DScene()); } if (!avatar->getMotionState()) { ShapeInfo shapeInfo; @@ -307,12 +306,10 @@ void AvatarManager::simulateAvatarFades(float deltaTime) { if (avatar->getTargetScale() <= MIN_FADE_SCALE) { // fading to zero is such a rare event we push unique transaction for each one if (avatar->isInScene()) { - render::ScenePointer scene = qApp->getMain3DScene(); + const render::ScenePointer& scene = qApp->getMain3DScene(); render::Transaction transaction; avatar->removeFromScene(*itr, scene, transaction); - if (scene) { - scene->enqueueTransaction(transaction); - } + scene->enqueueTransaction(transaction); } // only remove from _avatarsToFade if we're sure its motionState has been removed from PhysicsEngine @@ -344,21 +341,17 @@ void AvatarManager::processAvatarDataPacket(QSharedPointer mess if (avatar->isInScene()) { if (!_shouldRender) { // rare transition so we process the transaction immediately - render::ScenePointer scene = qApp->getMain3DScene(); - if (scene) { - render::Transaction transaction; - avatar->removeFromScene(avatar, scene, transaction); - scene->enqueueTransaction(transaction); - } + const render::ScenePointer& scene = qApp->getMain3DScene(); + render::Transaction transaction; + avatar->removeFromScene(avatar, scene, transaction); + scene->enqueueTransaction(transaction); } } else if (_shouldRender) { // very rare transition so we process the transaction immediately - render::ScenePointer scene = qApp->getMain3DScene(); - if (scene) { - render::Transaction transaction; - avatar->addToScene(avatar, scene, transaction); - scene->enqueueTransaction(transaction); - } + const render::ScenePointer& scene = qApp->getMain3DScene(); + render::Transaction transaction; + avatar->addToScene(avatar, scene, transaction); + scene->enqueueTransaction(transaction); } } } @@ -395,7 +388,7 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar void AvatarManager::clearOtherAvatars() { // Remove other avatars from the world but don't actually remove them from _avatarHash // each will either be removed on timeout or will re-added to the world on receipt of update. - render::ScenePointer scene = qApp->getMain3DScene(); + const render::ScenePointer& scene = qApp->getMain3DScene(); render::Transaction transaction; QReadLocker locker(&_hashLock); @@ -415,9 +408,7 @@ void AvatarManager::clearOtherAvatars() { } ++avatarIterator; } - if (scene) { - scene->enqueueTransaction(transaction); - } + scene->enqueueTransaction(transaction); _myAvatar->clearLookAtTargetAvatar(); } @@ -523,7 +514,7 @@ void AvatarManager::handleCollisionEvents(const CollisionEvents& collisionEvents void AvatarManager::updateAvatarRenderStatus(bool shouldRenderAvatars) { _shouldRender = shouldRenderAvatars; - render::ScenePointer scene = qApp->getMain3DScene(); + const render::ScenePointer& scene = qApp->getMain3DScene(); render::Transaction transaction; if (_shouldRender) { for (auto avatarData : _avatarHash) { @@ -536,9 +527,7 @@ void AvatarManager::updateAvatarRenderStatus(bool shouldRenderAvatars) { avatar->removeFromScene(avatar, scene, transaction); } } - if (scene) { - scene->enqueueTransaction(transaction); - } + scene->enqueueTransaction(transaction); } AvatarSharedPointer AvatarManager::getAvatarBySessionID(const QUuid& sessionID) const { From 014d7b8d8d2ad83deb0a3e7da9c08a8d1f11af64 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Mon, 17 Apr 2017 11:09:52 -0700 Subject: [PATCH 31/33] use viewFrustum position for laser pointer render filtering --- interface/src/avatar/Avatar.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 48aef547c9..5b996a3cdf 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -568,10 +568,12 @@ void Avatar::postUpdate(float deltaTime) { } void Avatar::render(RenderArgs* renderArgs) { - auto& batch = *renderArgs->_batch; + auto& batch = *(renderArgs->_batch); PROFILE_RANGE_BATCH(batch, __FUNCTION__); - if (glm::distance(DependencyManager::get()->getMyAvatarPosition(), getPosition()) < 10.0f) { + glm::vec3 viewPos = renderArgs->getViewFrustum().getPosition(); + const float MAX_DISTANCE_SQUARED_FOR_SHOWING_POINTING_LASERS = 100.0f; // 10^2 + if (glm::distance2(viewPos, getPosition()) < MAX_DISTANCE_SQUARED_FOR_SHOWING_POINTING_LASERS) { auto geometryCache = DependencyManager::get(); // render pointing lasers From da55c96c4cc9a05f474b30e014e59d0e9d2956c0 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Mon, 17 Apr 2017 11:51:10 -0700 Subject: [PATCH 32/33] protect against crash on invalid scene on shutdown --- interface/src/Application.cpp | 25 +++++++++++++------------ interface/src/avatar/AvatarManager.cpp | 8 ++++++-- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 87da8e6aa1..7763c3fb0b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1785,14 +1785,23 @@ void Application::cleanupBeforeQuit() { DependencyManager::destroy(); DependencyManager::destroy(); - // shutdown render engine - _main3DScene = nullptr; - _renderEngine = nullptr; - qCDebug(interfaceapp) << "Application::cleanupBeforeQuit() complete"; } Application::~Application() { + // remove avatars from physics engine + DependencyManager::get()->clearOtherAvatars(); + VectorOfMotionStates motionStates; + DependencyManager::get()->getObjectsToRemoveFromPhysics(motionStates); + _physicsEngine->removeObjects(motionStates); + DependencyManager::get()->deleteAllAvatars(); + + _physicsEngine->setCharacterController(nullptr); + + // shutdown render engine + _main3DScene = nullptr; + _renderEngine = nullptr; + DependencyManager::destroy(); _entityClipboard->eraseAllOctreeElements(); @@ -1804,14 +1813,6 @@ Application::~Application() { _octreeProcessor.terminate(); _entityEditSender.terminate(); - _physicsEngine->setCharacterController(nullptr); - - // remove avatars from physics engine - DependencyManager::get()->clearOtherAvatars(); - VectorOfMotionStates motionStates; - DependencyManager::get()->getObjectsToRemoveFromPhysics(motionStates); - _physicsEngine->removeObjects(motionStates); - DependencyManager::get()->deleteAllAvatars(); DependencyManager::destroy(); DependencyManager::destroy(); diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index ec47bcd0fe..585776b395 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -344,14 +344,18 @@ void AvatarManager::processAvatarDataPacket(QSharedPointer mess const render::ScenePointer& scene = qApp->getMain3DScene(); render::Transaction transaction; avatar->removeFromScene(avatar, scene, transaction); - scene->enqueueTransaction(transaction); + if (scene) { + scene->enqueueTransaction(transaction); + } } } else if (_shouldRender) { // very rare transition so we process the transaction immediately const render::ScenePointer& scene = qApp->getMain3DScene(); render::Transaction transaction; avatar->addToScene(avatar, scene, transaction); - scene->enqueueTransaction(transaction); + if (scene) { + scene->enqueueTransaction(transaction); + } } } } From 3113dced7b900741fe00c25d0d7b18b47461db8c Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Tue, 18 Apr 2017 12:06:44 -0700 Subject: [PATCH 33/33] Be sure to callback even on profile failure. --- scripts/system/pal.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 5fbea90025..ae64065216 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -400,6 +400,7 @@ function getProfilePicture(username, callback) { // callback(url) if successfull var matched = !error && html.match(/img class="users-img" src="([^"]*)"/); if (!matched) { print('Error: Unable to get profile picture for', username, error); + callback(''); return; } callback(matched[1]);