Showing the changes to interface/src/Application.cpp (1 of 127 files). Show all
Unified · Split
| @@ -87,6 +87,7 @@ · 86 unmodified lines | ||
| 87 | 87 | |
| 88 | 88 | #include "Application.h" |
| 89 | 89 | #include "AudioClient.h" |
| 90 | +#include "DiscoverabilityManager.h" | |
| 90 | 91 | #include "InterfaceVersion.h" |
| 91 | 92 | #include "LODManager.h" |
| 92 | 93 | #include "Menu.h" |
| @@ -141,7 +142,7 @@ using namespace std; · 48 unmodified lines | ||
| 141 | 142 | static unsigned STARFIELD_NUM_STARS = 50000; |
| 142 | 143 | static unsigned STARFIELD_SEED = 1; |
| 143 | 144 | |
| 144 | −const qint64 MAXIMUM_CACHE_SIZE = 10737418240; // 10GB | |
| 145 | +const qint64 MAXIMUM_CACHE_SIZE = 10 * BYTES_PER_GIGABYTES; // 10GB | |
| 145 | 146 | |
| 146 | 147 | static QTimer* locationUpdateTimer = NULL; |
| 147 | 148 | static QTimer* balanceUpdateTimer = NULL; |
| @@ -151,7 +152,7 @@ static QTimer* billboardPacketTimer = NULL; · 3 unmodified lines | ||
| 151 | 152 | static QTimer* checkFPStimer = NULL; |
| 152 | 153 | static QTimer* idleTimer = NULL; |
| 153 | 154 | |
| 154 | −const QString CHECK_VERSION_URL = "https://highfidelity.io/latestVersion.xml"; | |
| 155 | +const QString CHECK_VERSION_URL = "https://highfidelity.com/latestVersion.xml"; | |
| 155 | 156 | const QString SKIP_FILENAME = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/hifi.skipversion"; |
| 156 | 157 | |
| 157 | 158 | const QString DEFAULT_SCRIPTS_JS_URL = "http://s3.amazonaws.com/hifi-public/scripts/defaultScripts.js"; |
| @@ -246,6 +247,7 @@ bool setupEssentials(int& argc, char** argv) { · 88 unmodified lines | ||
| 246 | 247 | #if defined(Q_OS_MAC) || defined(Q_OS_WIN) |
| 247 | 248 | auto speechRecognizer = DependencyManager::set<SpeechRecognizer>(); |
| 248 | 249 | #endif |
| 250 | + auto discoverabilityManager = DependencyManager::set<DiscoverabilityManager>(); | |
| 249 | 251 | |
| 250 | 252 | return true; |
| 251 | 253 | } |
| @@ -367,11 +369,12 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : · 115 unmodified lines | ||
| 367 | 369 | connect(&domainHandler, &DomainHandler::hostnameChanged, |
| 368 | 370 | DependencyManager::get<AddressManager>().data(), &AddressManager::storeCurrentAddress); |
| 369 | 371 | |
| 370 | − // update our location every 5 seconds in the data-server, assuming that we are authenticated with one | |
| 372 | + // update our location every 5 seconds in the metaverse server, assuming that we are authenticated with one | |
| 371 | 373 | const qint64 DATA_SERVER_LOCATION_CHANGE_UPDATE_MSECS = 5 * 1000; |
| 372 | 374 | |
| 373 | 375 | locationUpdateTimer = new QTimer(this); |
| 374 | − connect(locationUpdateTimer, &QTimer::timeout, this, &Application::updateLocationInServer); | |
| 376 | + auto discoverabilityManager = DependencyManager::get<DiscoverabilityManager>(); | |
| 377 | + connect(locationUpdateTimer, &QTimer::timeout, discoverabilityManager.data(), &DiscoverabilityManager::updateLocation); | |
| 375 | 378 | locationUpdateTimer->start(DATA_SERVER_LOCATION_CHANGE_UPDATE_MSECS); |
| 376 | 379 | |
| 377 | 380 | connect(nodeList.data(), &NodeList::nodeAdded, this, &Application::nodeAdded); |
| @@ -445,7 +448,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : · 67 unmodified lines | ||
| 445 | 448 | cache->setMaximumCacheSize(MAXIMUM_CACHE_SIZE); |
| 446 | 449 | cache->setCacheDirectory(!cachePath.isEmpty() ? cachePath : "interfaceCache"); |
| 447 | 450 | networkAccessManager.setCache(cache); |
| 448 | − | |
| 451 | + | |
| 449 | 452 | ResourceCache::setRequestLimit(3); |
| 450 | 453 | |
| 451 | 454 | _window->setCentralWidget(_glWidget); |
| @@ -496,6 +499,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : · 44 unmodified lines | ||
| 496 | 499 | connect(nodeList.data(), SIGNAL(dataReceived(const quint8, const int)), |
| 497 | 500 | bandwidthRecorder.data(), SLOT(updateInboundData(const quint8, const int))); |
| 498 | 501 | |
| 502 | + connect(&_myAvatar->getSkeletonModel(), &SkeletonModel::skeletonLoaded, | |
| 503 | + this, &Application::checkSkeleton, Qt::QueuedConnection); | |
| 504 | + | |
| 499 | 505 | // check first run... |
| 500 | 506 | if (_firstRun.get()) { |
| 501 | 507 | qDebug() << "This is a first run..."; |
| @@ -778,13 +784,10 @@ void Application::paintGL() { · 276 unmodified lines | ||
| 778 | 784 | |
| 779 | 785 | DependencyManager::get<GlowEffect>()->render(); |
| 780 | 786 | |
| 781 | − { | |
| 787 | + if (Menu::getInstance()->isOptionChecked(MenuOption::UserInterface)) { | |
| 782 | 788 | PerformanceTimer perfTimer("renderOverlay"); |
| 783 | − // PrioVR will only work if renderOverlay is called, calibration is connected to Application::renderingOverlay() | |
| 784 | 789 | _applicationOverlay.renderOverlay(true); |
| 785 | − if (Menu::getInstance()->isOptionChecked(MenuOption::UserInterface)) { | |
| 786 | − _applicationOverlay.displayOverlayTexture(); | |
| 787 | − } | |
| 790 | + _applicationOverlay.displayOverlayTexture(); | |
| 788 | 791 | } |
| 789 | 792 | } |
| 790 | 793 | |
| @@ -1149,6 +1152,10 @@ void Application::keyPressEvent(QKeyEvent* event) { · 358 unmodified lines | ||
| 1149 | 1152 | |
| 1150 | 1153 | break; |
| 1151 | 1154 | } |
| 1155 | + | |
| 1156 | + case Qt::Key_Comma: { | |
| 1157 | + _myAvatar->togglePhysicsEnabled(); | |
| 1158 | + } | |
| 1152 | 1159 | |
| 1153 | 1160 | default: |
| 1154 | 1161 | event->ignore(); |
| @@ -1684,10 +1691,50 @@ void Application::setActiveFaceTracker() { · 529 unmodified lines | ||
| 1684 | 1691 | #endif |
| 1685 | 1692 | } |
| 1686 | 1693 | |
| 1694 | +bool Application::exportEntities(const QString& filename, const QVector<EntityItemID>& entityIDs) { | |
| 1695 | + QVector<EntityItem*> entities; | |
| 1696 | + | |
| 1697 | + auto entityTree = _entities.getTree(); | |
| 1698 | + EntityTree exportTree; | |
| 1699 | + | |
| 1700 | + glm::vec3 root(TREE_SCALE, TREE_SCALE, TREE_SCALE); | |
| 1701 | + for (auto entityID : entityIDs) { | |
| 1702 | + auto entityItem = entityTree->findEntityByEntityItemID(entityID); | |
| 1703 | + if (!entityItem) { | |
| 1704 | + continue; | |
| 1705 | + } | |
| 1706 | + | |
| 1707 | + auto properties = entityItem->getProperties(); | |
| 1708 | + auto position = properties.getPosition(); | |
| 1709 | + | |
| 1710 | + root.x = glm::min(root.x, position.x); | |
| 1711 | + root.y = glm::min(root.y, position.y); | |
| 1712 | + root.z = glm::min(root.z, position.z); | |
| 1713 | + | |
| 1714 | + entities << entityItem; | |
| 1715 | + } | |
| 1716 | + | |
| 1717 | + if (entities.size() == 0) { | |
| 1718 | + return false; | |
| 1719 | + } | |
| 1720 | + | |
| 1721 | + for (auto entityItem : entities) { | |
| 1722 | + auto properties = entityItem->getProperties(); | |
| 1723 | + | |
| 1724 | + properties.setPosition(properties.getPosition() - root); | |
| 1725 | + exportTree.addEntity(entityItem->getEntityItemID(), properties); | |
| 1726 | + } | |
| 1727 | + | |
| 1728 | + exportTree.writeToSVOFile(filename.toLocal8Bit().constData()); | |
| 1729 | + | |
| 1730 | + // restore the main window's active state | |
| 1731 | + _window->activateWindow(); | |
| 1732 | + return true; | |
| 1733 | +} | |
| 1734 | + | |
| 1687 | 1735 | bool Application::exportEntities(const QString& filename, float x, float y, float z, float scale) { |
| 1688 | 1736 | QVector<EntityItem*> entities; |
| 1689 | − _entities.getTree()->findEntities(AACube(glm::vec3(x / (float)TREE_SCALE, | |
| 1690 | − y / (float)TREE_SCALE, z / (float)TREE_SCALE), scale / (float)TREE_SCALE), entities); | |
| 1737 | + _entities.getTree()->findEntities(AACube(glm::vec3(x, y, z), scale), entities); | |
| 1691 | 1738 | |
| 1692 | 1739 | if (entities.size() > 0) { |
| 1693 | 1740 | glm::vec3 root(x, y, z); |
| @@ -1734,8 +1781,8 @@ bool Application::importEntities(const QString& filename) { · 40 unmodified lines | ||
| 1734 | 1781 | return success; |
| 1735 | 1782 | } |
| 1736 | 1783 | |
| 1737 | −void Application::pasteEntities(float x, float y, float z) { | |
| 1738 | − _entityClipboard.sendEntities(&_entityEditSender, _entities.getTree(), x, y, z); | |
| 1784 | +QVector<EntityItemID> Application::pasteEntities(float x, float y, float z) { | |
| 1785 | + return _entityClipboard.sendEntities(&_entityEditSender, _entities.getTree(), x, y, z); | |
| 1739 | 1786 | } |
| 1740 | 1787 | |
| 1741 | 1788 | void Application::initDisplay() { |
| @@ -1818,6 +1865,9 @@ void Application::init() { · 76 unmodified lines | ||
| 1818 | 1865 | tree->setSimulation(&_physicsEngine); |
| 1819 | 1866 | _physicsEngine.init(&_entityEditSender); |
| 1820 | 1867 | |
| 1868 | + | |
| 1869 | + _physicsEngine.setAvatarData(_myAvatar); | |
| 1870 | + | |
| 1821 | 1871 | auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>(); |
| 1822 | 1872 | |
| 1823 | 1873 | connect(&_physicsEngine, &EntitySimulation::entityCollisionWithEntity, |
| @@ -2314,7 +2364,6 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node · 490 unmodified lines | ||
| 2314 | 2364 | VoxelPositionSize rootDetails; |
| 2315 | 2365 | voxelDetailsForCode(rootCode, rootDetails); |
| 2316 | 2366 | AACube serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s); |
| 2317 | − serverBounds.scale(TREE_SCALE); | |
| 2318 | 2367 | |
| 2319 | 2368 | ViewFrustum::location serverFrustumLocation = _viewFrustum.cubeInFrustum(serverBounds); |
| 2320 | 2369 | |
| @@ -2378,7 +2427,6 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node · 57 unmodified lines | ||
| 2378 | 2427 | VoxelPositionSize rootDetails; |
| 2379 | 2428 | voxelDetailsForCode(rootCode, rootDetails); |
| 2380 | 2429 | AACube serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s); |
| 2381 | − serverBounds.scale(TREE_SCALE); | |
| 2382 | 2430 | |
| 2383 | 2431 | ViewFrustum::location serverFrustumLocation = _viewFrustum.cubeInFrustum(serverBounds); |
| 2384 | 2432 | if (serverFrustumLocation != ViewFrustum::OUTSIDE) { |
| @@ -3197,45 +3245,6 @@ void Application::updateWindowTitle(){ · 812 unmodified lines | ||
| 3197 | 3245 | _window->setWindowTitle(title); |
| 3198 | 3246 | } |
| 3199 | 3247 | |
| 3200 | −void Application::updateLocationInServer() { | |
| 3201 | − | |
| 3202 | − AccountManager& accountManager = AccountManager::getInstance(); | |
| 3203 | − auto addressManager = DependencyManager::get<AddressManager>(); | |
| 3204 | − DomainHandler& domainHandler = DependencyManager::get<NodeList>()->getDomainHandler(); | |
| 3205 | − | |
| 3206 | − if (accountManager.isLoggedIn() && domainHandler.isConnected() | |
| 3207 | − && (!addressManager->getRootPlaceID().isNull() || !domainHandler.getUUID().isNull())) { | |
| 3208 | − | |
| 3209 | − // construct a QJsonObject given the user's current address information | |
| 3210 | − QJsonObject rootObject; | |
| 3211 | − | |
| 3212 | − QJsonObject locationObject; | |
| 3213 | − | |
| 3214 | − QString pathString = addressManager->currentPath(); | |
| 3215 | − | |
| 3216 | − const QString LOCATION_KEY_IN_ROOT = "location"; | |
| 3217 | − | |
| 3218 | − const QString PATH_KEY_IN_LOCATION = "path"; | |
| 3219 | − locationObject.insert(PATH_KEY_IN_LOCATION, pathString); | |
| 3220 | − | |
| 3221 | − if (!addressManager->getRootPlaceID().isNull()) { | |
| 3222 | − const QString PLACE_ID_KEY_IN_LOCATION = "place_id"; | |
| 3223 | − locationObject.insert(PLACE_ID_KEY_IN_LOCATION, | |
| 3224 | − uuidStringWithoutCurlyBraces(addressManager->getRootPlaceID())); | |
| 3225 | − | |
| 3226 | − } else { | |
| 3227 | − const QString DOMAIN_ID_KEY_IN_LOCATION = "domain_id"; | |
| 3228 | − locationObject.insert(DOMAIN_ID_KEY_IN_LOCATION, | |
| 3229 | − uuidStringWithoutCurlyBraces(domainHandler.getUUID())); | |
| 3230 | − } | |
| 3231 | − | |
| 3232 | − rootObject.insert(LOCATION_KEY_IN_ROOT, locationObject); | |
| 3233 | − | |
| 3234 | − accountManager.authenticatedRequest("/api/v1/user/location", QNetworkAccessManager::PutOperation, | |
| 3235 | − JSONCallbackParameters(), QJsonDocument(rootObject).toJson()); | |
| 3236 | − } | |
| 3237 | −} | |
| 3238 | − | |
| 3239 | 3248 | void Application::clearDomainOctreeDetails() { |
| 3240 | 3249 | qDebug() << "Clearing domain octree details..."; |
| 3241 | 3250 | // reset the environment so that we don't erroneously end up with multiple |
| @@ -3921,8 +3930,8 @@ void Application::takeSnapshot() { · 679 unmodified lines | ||
| 3921 | 3930 | } |
| 3922 | 3931 | |
| 3923 | 3932 | void Application::setVSyncEnabled() { |
| 3924 | − bool vsyncOn = Menu::getInstance()->isOptionChecked(MenuOption::RenderTargetFramerateVSyncOn); | |
| 3925 | 3933 | #if defined(Q_OS_WIN) |
| 3934 | + bool vsyncOn = Menu::getInstance()->isOptionChecked(MenuOption::RenderTargetFramerateVSyncOn); | |
| 3926 | 3935 | if (wglewGetExtension("WGL_EXT_swap_control")) { |
| 3927 | 3936 | wglSwapIntervalEXT(vsyncOn); |
| 3928 | 3937 | int swapInterval = wglGetSwapIntervalEXT(); |
| @@ -3945,7 +3954,6 @@ void Application::setVSyncEnabled() { · 16 unmodified lines | ||
| 3945 | 3954 | #else |
| 3946 | 3955 | qDebug("V-Sync is FORCED ON on this system\n"); |
| 3947 | 3956 | #endif |
| 3948 | − vsyncOn = true; // Turns off unused variable warning | |
| 3949 | 3957 | } |
| 3950 | 3958 | |
| 3951 | 3959 | bool Application::isVSyncOn() const { |
| @@ -4057,3 +4065,19 @@ void Application::notifyPacketVersionMismatch() { · 105 unmodified lines | ||
| 4057 | 4065 | msgBox.exec(); |
| 4058 | 4066 | } |
| 4059 | 4067 | } |
| 4068 | + | |
| 4069 | +void Application::checkSkeleton() { | |
| 4070 | + if (_myAvatar->getSkeletonModel().isActive() && !_myAvatar->getSkeletonModel().hasSkeleton()) { | |
| 4071 | + qDebug() << "MyAvatar model has no skeleton"; | |
| 4072 | + | |
| 4073 | + QString message = "Your selected avatar body has no skeleton.\n\nThe default body will be loaded..."; | |
| 4074 | + QMessageBox msgBox; | |
| 4075 | + msgBox.setText(message); | |
| 4076 | + msgBox.setStandardButtons(QMessageBox::Ok); | |
| 4077 | + msgBox.setIcon(QMessageBox::Warning); | |
| 4078 | + msgBox.exec(); | |
| 4079 | + | |
| 4080 | + _myAvatar->setSkeletonModelURL(DEFAULT_BODY_MODEL_URL); | |
| 4081 | + _myAvatar->sendIdentityPacket(); | |
| 4082 | + } | |
| 4083 | +} | |