Showing the changes to interface/src/Application.cpp (1 of 158 files). Show all
Unified · Split
| @@ -335,10 +335,10 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : · 334 unmodified lines | |||
| 335 | _frameCount(0), | 335 | _frameCount(0), |
| 336 | _fps(60.0f), | 336 | _fps(60.0f), |
| 337 | _justStarted(true), | 337 | _justStarted(true), |
| 338 | _physicsEngine(glm::vec3(0.0f)), | 338 | _physicsEngine(new PhysicsEngine(Vectors::ZERO)), |
| 339 | _entities(true, this, this), | 339 | _entities(true, this, this), |
| 340 | _entityClipboardRenderer(false, this, this), | 340 | _entityClipboardRenderer(false, this, this), |
| 341 | _entityClipboard(), | 341 | _entityClipboard(new EntityTree()), |
| 342 | _viewFrustum(), | 342 | _viewFrustum(), |
| 343 | _lastQueriedViewFrustum(), | 343 | _lastQueriedViewFrustum(), |
| 344 | _lastQueriedTime(usecTimestampNow()), | 344 | _lastQueriedTime(usecTimestampNow()), |
| @@ -372,6 +372,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : · 27 unmodified lines | |||
| 372 | { | 372 | { |
| 373 | setInstance(this); | 373 | setInstance(this); |
| 374 | 374 | ||
| 375 | _entityClipboard->createRootElement(); | ||
| 376 | |||
| 375 | _pluginContainer = new PluginContainerProxy(); | 377 | _pluginContainer = new PluginContainerProxy(); |
| 376 | Plugin::setContainer(_pluginContainer); | 378 | Plugin::setContainer(_pluginContainer); |
| 377 | #ifdef Q_OS_WIN | 379 | #ifdef Q_OS_WIN |
| @@ -861,17 +863,15 @@ void Application::emptyLocalCache() { · 483 unmodified lines | |||
| 861 | } | 863 | } |
| 862 | 864 | ||
| 863 | Application::~Application() { | 865 | Application::~Application() { |
| 864 | EntityTree* tree = _entities.getTree(); | 866 | EntityTreePointer tree = _entities.getTree(); |
| 865 | tree->lockForWrite(); | 867 | tree->setSimulation(NULL); |
| 866 | _entities.getTree()->setSimulation(NULL); | ||
| 867 | tree->unlock(); | ||
| 868 | 868 | ||
| 869 | _octreeProcessor.terminate(); | 869 | _octreeProcessor.terminate(); |
| 870 | _entityEditSender.terminate(); | 870 | _entityEditSender.terminate(); |
| 871 | 871 | ||
| 872 | Menu::getInstance()->deleteLater(); | 872 | Menu::getInstance()->deleteLater(); |
| 873 | 873 | ||
| 874 | _physicsEngine.setCharacterController(NULL); | 874 | _physicsEngine->setCharacterController(NULL); |
| 875 | _myAvatar = NULL; | 875 | _myAvatar = NULL; |
| 876 | 876 | ||
| 877 | ModelEntityItem::cleanupLoadedAnimations(); | 877 | ModelEntityItem::cleanupLoadedAnimations(); |
| @@ -886,7 +886,9 @@ Application::~Application() { · 8 unmodified lines | |||
| 886 | 886 | ||
| 887 | // remove avatars from physics engine | 887 | // remove avatars from physics engine |
| 888 | DependencyManager::get<AvatarManager>()->clearOtherAvatars(); | 888 | DependencyManager::get<AvatarManager>()->clearOtherAvatars(); |
| 889 | _physicsEngine.deleteObjects(DependencyManager::get<AvatarManager>()->getObjectsToDelete()); | 889 | VectorOfMotionStates motionStates; |
| 890 | DependencyManager::get<AvatarManager>()->getObjectsToDelete(motionStates); | ||
| 891 | _physicsEngine->deleteObjects(motionStates); | ||
| 890 | 892 | ||
| 891 | DependencyManager::destroy<OffscreenUi>(); | 893 | DependencyManager::destroy<OffscreenUi>(); |
| 892 | DependencyManager::destroy<AvatarManager>(); | 894 | DependencyManager::destroy<AvatarManager>(); |
| @@ -1513,7 +1515,7 @@ void Application::keyPressEvent(QKeyEvent* event) { · 620 unmodified lines | |||
| 1513 | break; | 1515 | break; |
| 1514 | 1516 | ||
| 1515 | case Qt::Key_F: { | 1517 | case Qt::Key_F: { |
| 1516 | _physicsEngine.dumpNextStats(); | 1518 | _physicsEngine->dumpNextStats(); |
| 1517 | break; | 1519 | break; |
| 1518 | } | 1520 | } |
| 1519 | 1521 | ||
| @@ -2395,7 +2397,7 @@ void Application::saveSettings() { · 875 unmodified lines | |||
| 2395 | } | 2397 | } |
| 2396 | 2398 | ||
| 2397 | bool Application::importEntities(const QString& urlOrFilename) { | 2399 | bool Application::importEntities(const QString& urlOrFilename) { |
| 2398 | _entityClipboard.eraseAllOctreeElements(); | 2400 | _entityClipboard->eraseAllOctreeElements(); |
| 2399 | 2401 | ||
| 2400 | QUrl url(urlOrFilename); | 2402 | QUrl url(urlOrFilename); |
| 2401 | 2403 | ||
| @@ -2404,15 +2406,15 @@ bool Application::importEntities(const QString& urlOrFilename) { · 2 unmodified lines | |||
| 2404 | url = QUrl::fromLocalFile(urlOrFilename); | 2406 | url = QUrl::fromLocalFile(urlOrFilename); |
| 2405 | } | 2407 | } |
| 2406 | 2408 | ||
| 2407 | bool success = _entityClipboard.readFromURL(url.toString()); | 2409 | bool success = _entityClipboard->readFromURL(url.toString()); |
| 2408 | if (success) { | 2410 | if (success) { |
| 2409 | _entityClipboard.reaverageOctreeElements(); | 2411 | _entityClipboard->reaverageOctreeElements(); |
| 2410 | } | 2412 | } |
| 2411 | return success; | 2413 | return success; |
| 2412 | } | 2414 | } |
| 2413 | 2415 | ||
| 2414 | QVector<EntityItemID> Application::pasteEntities(float x, float y, float z) { | 2416 | QVector<EntityItemID> Application::pasteEntities(float x, float y, float z) { |
| 2415 | return _entityClipboard.sendEntities(&_entityEditSender, _entities.getTree(), x, y, z); | 2417 | return _entityClipboard->sendEntities(&_entityEditSender, _entities.getTree(), x, y, z); |
| 2416 | } | 2418 | } |
| 2417 | 2419 | ||
| 2418 | void Application::initDisplay() { | 2420 | void Application::initDisplay() { |
| @@ -2457,10 +2459,10 @@ void Application::init() { · 38 unmodified lines | |||
| 2457 | _entities.setViewFrustum(getViewFrustum()); | 2459 | _entities.setViewFrustum(getViewFrustum()); |
| 2458 | 2460 | ||
| 2459 | ObjectMotionState::setShapeManager(&_shapeManager); | 2461 | ObjectMotionState::setShapeManager(&_shapeManager); |
| 2460 | _physicsEngine.init(); | 2462 | _physicsEngine->init(); |
| 2461 | 2463 | ||
| 2462 | EntityTree* tree = _entities.getTree(); | 2464 | EntityTreePointer tree = _entities.getTree(); |
| 2463 | _entitySimulation.init(tree, &_physicsEngine, &_entityEditSender); | 2465 | _entitySimulation.init(tree, _physicsEngine, &_entityEditSender); |
| 2464 | tree->setSimulation(&_entitySimulation); | 2466 | tree->setSimulation(&_entitySimulation); |
| 2465 | 2467 | ||
| 2466 | auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>(); | 2468 | auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>(); |
| @@ -2475,23 +2477,47 @@ void Application::init() { · 8 unmodified lines | |||
| 2475 | 2477 | ||
| 2476 | _entityClipboardRenderer.init(); | 2478 | _entityClipboardRenderer.init(); |
| 2477 | _entityClipboardRenderer.setViewFrustum(getViewFrustum()); | 2479 | _entityClipboardRenderer.setViewFrustum(getViewFrustum()); |
| 2478 | _entityClipboardRenderer.setTree(&_entityClipboard); | 2480 | _entityClipboardRenderer.setTree(_entityClipboard); |
| 2479 | 2481 | ||
| 2480 | // Make sure any new sounds are loaded as soon as know about them. | 2482 | // Make sure any new sounds are loaded as soon as know about them. |
| 2481 | connect(tree, &EntityTree::newCollisionSoundURL, DependencyManager::get<SoundCache>().data(), &SoundCache::getSound); | 2483 | connect(tree.get(), &EntityTree::newCollisionSoundURL, DependencyManager::get<SoundCache>().data(), &SoundCache::getSound); |
| 2482 | connect(_myAvatar, &MyAvatar::newCollisionSoundURL, DependencyManager::get<SoundCache>().data(), &SoundCache::getSound); | 2484 | connect(_myAvatar, &MyAvatar::newCollisionSoundURL, DependencyManager::get<SoundCache>().data(), &SoundCache::getSound); |
| 2483 | 2485 | ||
| 2484 | setAvatarUpdateThreading(Menu::getInstance()->isOptionChecked(MenuOption::EnableAvatarUpdateThreading)); | 2486 | setAvatarUpdateThreading(); |
| 2485 | } | 2487 | } |
| 2486 | 2488 | ||
| 2487 | void Application::setAvatarUpdateThreading(bool isThreaded) { | 2489 | void Application::setAvatarUpdateThreading() { |
| 2490 | setAvatarUpdateThreading(Menu::getInstance()->isOptionChecked(MenuOption::EnableAvatarUpdateThreading)); | ||
| 2491 | } | ||
| 2492 | void Application::setRawAvatarUpdateThreading() { | ||
| 2493 | setRawAvatarUpdateThreading(Menu::getInstance()->isOptionChecked(MenuOption::EnableAvatarUpdateThreading)); | ||
| 2494 | } | ||
| 2495 | void Application::setRawAvatarUpdateThreading(bool isThreaded) { | ||
| 2488 | if (_avatarUpdate) { | 2496 | if (_avatarUpdate) { |
| 2489 | getMyAvatar()->destroyAnimGraph(); | 2497 | if (_avatarUpdate->isThreaded() == isThreaded) { |
| 2498 | return; | ||
| 2499 | } | ||
| 2490 | _avatarUpdate->terminate(); | 2500 | _avatarUpdate->terminate(); |
| 2491 | } | 2501 | } |
| 2492 | _avatarUpdate = new AvatarUpdate(); | 2502 | _avatarUpdate = new AvatarUpdate(); |
| 2493 | _avatarUpdate->initialize(isThreaded); | 2503 | _avatarUpdate->initialize(isThreaded); |
| 2494 | } | 2504 | } |
| 2505 | void Application::setAvatarUpdateThreading(bool isThreaded) { | ||
| 2506 | if (_avatarUpdate && (_avatarUpdate->isThreaded() == isThreaded)) { | ||
| 2507 | return; | ||
| 2508 | } | ||
| 2509 | bool isRigEnabled = getMyAvatar()->getEnableRigAnimations(); | ||
| 2510 | bool isGraphEnabled = getMyAvatar()->getEnableAnimGraph(); | ||
| 2511 | if (_avatarUpdate) { | ||
| 2512 | _avatarUpdate->terminate(); // Must be before we shutdown anim graph. | ||
| 2513 | } | ||
| 2514 | getMyAvatar()->setEnableRigAnimations(false); | ||
| 2515 | getMyAvatar()->setEnableAnimGraph(false); | ||
| 2516 | _avatarUpdate = new AvatarUpdate(); | ||
| 2517 | _avatarUpdate->initialize(isThreaded); | ||
| 2518 | getMyAvatar()->setEnableRigAnimations(isRigEnabled); | ||
| 2519 | getMyAvatar()->setEnableAnimGraph(isGraphEnabled); | ||
| 2520 | } | ||
| 2495 | 2521 | ||
| 2496 | 2522 | ||
| 2497 | void Application::closeMirrorView() { | 2523 | void Application::closeMirrorView() { |
| @@ -2861,51 +2887,45 @@ void Application::update(float deltaTime) { · 363 unmodified lines | |||
| 2861 | PerformanceTimer perfTimer("physics"); | 2887 | PerformanceTimer perfTimer("physics"); |
| 2862 | _myAvatar->relayDriveKeysToCharacterController(); | 2888 | _myAvatar->relayDriveKeysToCharacterController(); |
| 2863 | 2889 | ||
| 2864 | _entitySimulation.lock(); | 2890 | static VectorOfMotionStates motionStates; |
| 2865 | _physicsEngine.deleteObjects(_entitySimulation.getObjectsToDelete()); | 2891 | _entitySimulation.getObjectsToDelete(motionStates); |
| 2866 | _entitySimulation.unlock(); | 2892 | _physicsEngine->deleteObjects(motionStates); |
| 2867 | 2893 | ||
| 2868 | _entities.getTree()->lockForWrite(); | 2894 | _entities.getTree()->withWriteLock([&] { |
| 2869 | _entitySimulation.lock(); | 2895 | _entitySimulation.getObjectsToAdd(motionStates); |
| 2870 | _physicsEngine.addObjects(_entitySimulation.getObjectsToAdd()); | 2896 | _physicsEngine->addObjects(motionStates); |
| 2871 | _entitySimulation.unlock(); | ||
| 2872 | _entities.getTree()->unlock(); | ||
| 2873 | 2897 | ||
| 2874 | _entities.getTree()->lockForWrite(); | 2898 | }); |
| 2875 | _entitySimulation.lock(); | 2899 | _entities.getTree()->withWriteLock([&] { |
| 2876 | VectorOfMotionStates stillNeedChange = _physicsEngine.changeObjects(_entitySimulation.getObjectsToChange()); | 2900 | _entitySimulation.getObjectsToChange(motionStates); |
| 2877 | _entitySimulation.setObjectsToChange(stillNeedChange); | 2901 | VectorOfMotionStates stillNeedChange = _physicsEngine->changeObjects(motionStates); |
| 2878 | _entitySimulation.unlock(); | 2902 | _entitySimulation.setObjectsToChange(stillNeedChange); |
| 2879 | _entities.getTree()->unlock(); | 2903 | }); |
| 2880 | 2904 | ||
| 2881 | _entitySimulation.lock(); | ||
| 2882 | _entitySimulation.applyActionChanges(); | 2905 | _entitySimulation.applyActionChanges(); |
| 2883 | _entitySimulation.unlock(); | ||
| 2884 | 2906 | ||
| 2885 | AvatarManager* avatarManager = DependencyManager::get<AvatarManager>().data(); | 2907 | AvatarManager* avatarManager = DependencyManager::get<AvatarManager>().data(); |
| 2886 | _physicsEngine.deleteObjects(avatarManager->getObjectsToDelete()); | 2908 | avatarManager->getObjectsToDelete(motionStates); |
| 2887 | _physicsEngine.addObjects(avatarManager->getObjectsToAdd()); | 2909 | _physicsEngine->deleteObjects(motionStates); |
| 2888 | _physicsEngine.changeObjects(avatarManager->getObjectsToChange()); | 2910 | avatarManager->getObjectsToAdd(motionStates); |
| 2889 | 2911 | _physicsEngine->addObjects(motionStates); | |
| 2890 | _entities.getTree()->lockForWrite(); | 2912 | avatarManager->getObjectsToChange(motionStates); |
| 2891 | _physicsEngine.stepSimulation(); | 2913 | _physicsEngine->changeObjects(motionStates); |
| 2892 | _entities.getTree()->unlock(); | 2914 | |
| 2893 | 2915 | _entities.getTree()->withWriteLock([&] { | |
| 2894 | if (_physicsEngine.hasOutgoingChanges()) { | 2916 | _physicsEngine->stepSimulation(); |
| 2895 | _entities.getTree()->lockForWrite(); | 2917 | }); |
| 2896 | _entitySimulation.lock(); | 2918 | |
| 2897 | _entitySimulation.handleOutgoingChanges(_physicsEngine.getOutgoingChanges(), _physicsEngine.getSessionID()); | 2919 | if (_physicsEngine->hasOutgoingChanges()) { |
| 2898 | _entitySimulation.unlock(); | 2920 | _entities.getTree()->withWriteLock([&] { |
| 2899 | _entities.getTree()->unlock(); | 2921 | _entitySimulation.handleOutgoingChanges(_physicsEngine->getOutgoingChanges(), _physicsEngine->getSessionID()); |
| 2900 | 2922 | avatarManager->handleOutgoingChanges(_physicsEngine->getOutgoingChanges()); | |
| 2901 | _entities.getTree()->lockForWrite(); | 2923 | }); |
| 2902 | avatarManager->handleOutgoingChanges(_physicsEngine.getOutgoingChanges()); | 2924 | |
| 2903 | _entities.getTree()->unlock(); | 2925 | auto collisionEvents = _physicsEngine->getCollisionEvents(); |
| 2904 | |||
| 2905 | auto collisionEvents = _physicsEngine.getCollisionEvents(); | ||
| 2906 | avatarManager->handleCollisionEvents(collisionEvents); | 2926 | avatarManager->handleCollisionEvents(collisionEvents); |
| 2907 | 2927 | ||
| 2908 | _physicsEngine.dumpStatsIfNecessary(); | 2928 | _physicsEngine->dumpStatsIfNecessary(); |
| 2909 | 2929 | ||
| 2910 | if (!_aboutToQuit) { | 2930 | if (!_aboutToQuit) { |
| 2911 | PerformanceTimer perfTimer("entities"); | 2931 | PerformanceTimer perfTimer("entities"); |
| @@ -3019,27 +3039,21 @@ int Application::sendNackPackets() { · 107 unmodified lines | |||
| 3019 | return; | 3039 | return; |
| 3020 | } | 3040 | } |
| 3021 | 3041 | ||
| 3022 | _octreeSceneStatsLock.lockForRead(); | 3042 | QSet<OCTREE_PACKET_SEQUENCE> missingSequenceNumbers; |
| 3043 | _octreeServerSceneStats.withReadLock([&] { | ||
| 3044 | // retreive octree scene stats of this node | ||
| 3045 | if (_octreeServerSceneStats.find(nodeUUID) == _octreeServerSceneStats.end()) { | ||
| 3046 | return; | ||
| 3047 | } | ||
| 3048 | // get sequence number stats of node, prune its missing set, and make a copy of the missing set | ||
| 3049 | SequenceNumberStats& sequenceNumberStats = _octreeServerSceneStats[nodeUUID].getIncomingOctreeSequenceNumberStats(); | ||
| 3050 | sequenceNumberStats.pruneMissingSet(); | ||
| 3051 | missingSequenceNumbers = sequenceNumberStats.getMissingSet(); | ||
| 3052 | }); | ||
| 3023 | 3053 | ||
| 3024 | // retreive octree scene stats of this node | ||
| 3025 | if (_octreeServerSceneStats.find(nodeUUID) == _octreeServerSceneStats.end()) { | ||
| 3026 | _octreeSceneStatsLock.unlock(); | ||
| 3027 | return; | ||
| 3028 | } | ||
| 3029 | |||
| 3030 | // get sequence number stats of node, prune its missing set, and make a copy of the missing set | ||
| 3031 | SequenceNumberStats& sequenceNumberStats = _octreeServerSceneStats[nodeUUID].getIncomingOctreeSequenceNumberStats(); | ||
| 3032 | sequenceNumberStats.pruneMissingSet(); | ||
| 3033 | const QSet<OCTREE_PACKET_SEQUENCE> missingSequenceNumbers = sequenceNumberStats.getMissingSet(); | ||
| 3034 | |||
| 3035 | _octreeSceneStatsLock.unlock(); | ||
| 3036 | |||
| 3037 | // construct nack packet(s) for this node | 3054 | // construct nack packet(s) for this node |
| 3038 | auto it = missingSequenceNumbers.constBegin(); | 3055 | foreach(const OCTREE_PACKET_SEQUENCE& missingNumber, missingSequenceNumbers) { |
| 3039 | while (it != missingSequenceNumbers.constEnd()) { | ||
| 3040 | OCTREE_PACKET_SEQUENCE missingNumber = *it; | ||
| 3041 | nackPacketList->writePrimitive(missingNumber); | 3056 | nackPacketList->writePrimitive(missingNumber); |
| 3042 | ++it; | ||
| 3043 | } | 3057 | } |
| 3044 | 3058 | ||
| 3045 | if (nackPacketList->getNumPackets()) { | 3059 | if (nackPacketList->getNumPackets()) { |
| @@ -3772,13 +3786,13 @@ void Application::clearDomainOctreeDetails() { · 726 unmodified lines | |||
| 3772 | // reset the environment so that we don't erroneously end up with multiple | 3786 | // reset the environment so that we don't erroneously end up with multiple |
| 3773 | 3787 | ||
| 3774 | // reset our node to stats and node to jurisdiction maps... since these must be changing... | 3788 | // reset our node to stats and node to jurisdiction maps... since these must be changing... |
| 3775 | _entityServerJurisdictions.lockForWrite(); | 3789 | _entityServerJurisdictions.withWriteLock([&] { |
| 3776 | _entityServerJurisdictions.clear(); | 3790 | _entityServerJurisdictions.clear(); |
| 3777 | _entityServerJurisdictions.unlock(); | 3791 | }); |
| 3778 | 3792 | ||
| 3779 | _octreeSceneStatsLock.lockForWrite(); | 3793 | _octreeServerSceneStats.withWriteLock([&] { |
| 3780 | _octreeServerSceneStats.clear(); | 3794 | _octreeServerSceneStats.clear(); |
| 3781 | _octreeSceneStatsLock.unlock(); | 3795 | }); |
| 3782 | 3796 | ||
| 3783 | // reset the model renderer | 3797 | // reset the model renderer |
| 3784 | _entities.clear(); | 3798 | _entities.clear(); |
| @@ -3848,29 +3862,31 @@ void Application::nodeKilled(SharedNodePointer node) { · 63 unmodified lines | |||
| 3848 | 3862 | ||
| 3849 | QUuid nodeUUID = node->getUUID(); | 3863 | QUuid nodeUUID = node->getUUID(); |
| 3850 | // see if this is the first we've heard of this node... | 3864 | // see if this is the first we've heard of this node... |
| 3851 | _entityServerJurisdictions.lockForRead(); | 3865 | _entityServerJurisdictions.withReadLock([&] { |
| 3852 | if (_entityServerJurisdictions.find(nodeUUID) != _entityServerJurisdictions.end()) { | 3866 | if (_entityServerJurisdictions.find(nodeUUID) == _entityServerJurisdictions.end()) { |
| 3867 | return; | ||
| 3868 | } | ||
| 3869 | |||
| 3853 | unsigned char* rootCode = _entityServerJurisdictions[nodeUUID].getRootOctalCode(); | 3870 | unsigned char* rootCode = _entityServerJurisdictions[nodeUUID].getRootOctalCode(); |
| 3854 | VoxelPositionSize rootDetails; | 3871 | VoxelPositionSize rootDetails; |
| 3855 | voxelDetailsForCode(rootCode, rootDetails); | 3872 | voxelDetailsForCode(rootCode, rootDetails); |
| 3856 | _entityServerJurisdictions.unlock(); | ||
| 3857 | 3873 | ||
| 3858 | qCDebug(interfaceapp, "model server going away...... v[%f, %f, %f, %f]", | 3874 | qCDebug(interfaceapp, "model server going away...... v[%f, %f, %f, %f]", |
| 3859 | (double)rootDetails.x, (double)rootDetails.y, (double)rootDetails.z, (double)rootDetails.s); | 3875 | (double)rootDetails.x, (double)rootDetails.y, (double)rootDetails.z, (double)rootDetails.s); |
| 3876 | |||
| 3877 | }); | ||
| 3860 | 3878 | ||
| 3861 | // If the model server is going away, remove it from our jurisdiction map so we don't send voxels to a dead server | 3879 | // If the model server is going away, remove it from our jurisdiction map so we don't send voxels to a dead server |
| 3862 | _entityServerJurisdictions.lockForWrite(); | 3880 | _entityServerJurisdictions.withWriteLock([&] { |
| 3863 | _entityServerJurisdictions.erase(_entityServerJurisdictions.find(nodeUUID)); | 3881 | _entityServerJurisdictions.erase(_entityServerJurisdictions.find(nodeUUID)); |
| 3864 | } | 3882 | }); |
| 3865 | _entityServerJurisdictions.unlock(); | ||
| 3866 | 3883 | ||
| 3867 | // also clean up scene stats for that server | 3884 | // also clean up scene stats for that server |
| 3868 | _octreeSceneStatsLock.lockForWrite(); | 3885 | _octreeServerSceneStats.withWriteLock([&] { |
| 3869 | if (_octreeServerSceneStats.find(nodeUUID) != _octreeServerSceneStats.end()) { | 3886 | if (_octreeServerSceneStats.find(nodeUUID) != _octreeServerSceneStats.end()) { |
| 3870 | _octreeServerSceneStats.erase(nodeUUID); | 3887 | _octreeServerSceneStats.erase(nodeUUID); |
| 3871 | } | 3888 | } |
| 3872 | _octreeSceneStatsLock.unlock(); | 3889 | }); |
| 3873 | |||
| 3874 | } else if (node->getType() == NodeType::AvatarMixer) { | 3890 | } else if (node->getType() == NodeType::AvatarMixer) { |
| 3875 | // our avatar mixer has gone away - clear the hash of avatars | 3891 | // our avatar mixer has gone away - clear the hash of avatars |
| 3876 | DependencyManager::get<AvatarManager>()->clearOtherAvatars(); | 3892 | DependencyManager::get<AvatarManager>()->clearOtherAvatars(); |
| @@ -3888,12 +3904,12 @@ void Application::trackIncomingOctreePacket(NLPacket& packet, SharedNodePointer · 11 unmodified lines | |||
| 3888 | const QUuid& nodeUUID = sendingNode->getUUID(); | 3904 | const QUuid& nodeUUID = sendingNode->getUUID(); |
| 3889 | 3905 | ||
| 3890 | // now that we know the node ID, let's add these stats to the stats for that node... | 3906 | // now that we know the node ID, let's add these stats to the stats for that node... |
| 3891 | _octreeSceneStatsLock.lockForWrite(); | 3907 | _octreeServerSceneStats.withWriteLock([&] { |
| 3892 | if (_octreeServerSceneStats.find(nodeUUID) != _octreeServerSceneStats.end()) { | 3908 | if (_octreeServerSceneStats.find(nodeUUID) != _octreeServerSceneStats.end()) { |
| 3893 | OctreeSceneStats& stats = _octreeServerSceneStats[nodeUUID]; | 3909 | OctreeSceneStats& stats = _octreeServerSceneStats[nodeUUID]; |
| 3894 | stats.trackIncomingOctreePacket(packet, wasStatsPacket, sendingNode->getClockSkewUsec()); | 3910 | stats.trackIncomingOctreePacket(packet, wasStatsPacket, sendingNode->getClockSkewUsec()); |
| 3895 | } | 3911 | } |
| 3896 | _octreeSceneStatsLock.unlock(); | 3912 | }); |
| 3897 | } | 3913 | } |
| 3898 | } | 3914 | } |
| 3899 | 3915 | ||
| @@ -3907,43 +3923,42 @@ int Application::processOctreeStats(NLPacket& packet, SharedNodePointer sendingN · 7 unmodified lines | |||
| 3907 | const QUuid& nodeUUID = sendingNode->getUUID(); | 3923 | const QUuid& nodeUUID = sendingNode->getUUID(); |
| 3908 | 3924 | ||
| 3909 | // now that we know the node ID, let's add these stats to the stats for that node... | 3925 | // now that we know the node ID, let's add these stats to the stats for that node... |
| 3910 | _octreeSceneStatsLock.lockForWrite(); | 3926 | _octreeServerSceneStats.withWriteLock([&] { |
| 3911 | 3927 | OctreeSceneStats& octreeStats = _octreeServerSceneStats[nodeUUID]; | |
| 3912 | OctreeSceneStats& octreeStats = _octreeServerSceneStats[nodeUUID]; | 3928 | statsMessageLength = octreeStats.unpackFromPacket(packet); |
| 3913 | statsMessageLength = octreeStats.unpackFromPacket(packet); | ||
| 3914 | |||
| 3915 | _octreeSceneStatsLock.unlock(); | ||
| 3916 | 3929 | ||
| 3917 | // see if this is the first we've heard of this node... | 3930 | // see if this is the first we've heard of this node... |
| 3918 | NodeToJurisdictionMap* jurisdiction = NULL; | 3931 | NodeToJurisdictionMap* jurisdiction = NULL; |
| 3919 | QString serverType; | 3932 | QString serverType; |
| 3920 | if (sendingNode->getType() == NodeType::EntityServer) { | 3933 | if (sendingNode->getType() == NodeType::EntityServer) { |
| 3921 | jurisdiction = &_entityServerJurisdictions; | 3934 | jurisdiction = &_entityServerJurisdictions; |
| 3922 | serverType = "Entity"; | 3935 | serverType = "Entity"; |
| 3923 | } | 3936 | } |
| 3924 | 3937 | ||
| 3925 | jurisdiction->lockForRead(); | 3938 | jurisdiction->withReadLock([&] { |
| 3926 | if (jurisdiction->find(nodeUUID) == jurisdiction->end()) { | 3939 | if (jurisdiction->find(nodeUUID) != jurisdiction->end()) { |
| 3927 | jurisdiction->unlock(); | 3940 | return; |
| 3928 | 3941 | } | |
| 3929 | VoxelPositionSize rootDetails; | ||
| 3930 | voxelDetailsForCode(octreeStats.getJurisdictionRoot(), rootDetails); | ||
| 3931 | 3942 | ||
| 3932 | qCDebug(interfaceapp, "stats from new %s server... [%f, %f, %f, %f]", | 3943 | VoxelPositionSize rootDetails; |
| 3944 | voxelDetailsForCode(octreeStats.getJurisdictionRoot(), rootDetails); | ||
| 3945 | |||
| 3946 | qCDebug(interfaceapp, "stats from new %s server... [%f, %f, %f, %f]", | ||
| 3933 | qPrintable(serverType), | 3947 | qPrintable(serverType), |
| 3934 | (double)rootDetails.x, (double)rootDetails.y, (double)rootDetails.z, (double)rootDetails.s); | 3948 | (double)rootDetails.x, (double)rootDetails.y, (double)rootDetails.z, (double)rootDetails.s); |
| 3935 | } else { | 3949 | }); |
| 3936 | jurisdiction->unlock(); | 3950 | // store jurisdiction details for later use |
| 3937 | } | 3951 | // This is bit of fiddling is because JurisdictionMap assumes it is the owner of the values used to construct it |
| 3938 | // store jurisdiction details for later use | 3952 | // but OctreeSceneStats thinks it's just returning a reference to its contents. So we need to make a copy of the |
| 3939 | // This is bit of fiddling is because JurisdictionMap assumes it is the owner of the values used to construct it | 3953 | // details from the OctreeSceneStats to construct the JurisdictionMap |
| 3940 | // but OctreeSceneStats thinks it's just returning a reference to its contents. So we need to make a copy of the | 3954 | JurisdictionMap jurisdictionMap; |
| 3941 | // details from the OctreeSceneStats to construct the JurisdictionMap | 3955 | jurisdictionMap.copyContents(octreeStats.getJurisdictionRoot(), octreeStats.getJurisdictionEndNodes()); |
| 3942 | JurisdictionMap jurisdictionMap; | 3956 | jurisdiction->withWriteLock([&] { |
| 3943 | jurisdictionMap.copyContents(octreeStats.getJurisdictionRoot(), octreeStats.getJurisdictionEndNodes()); | 3957 | (*jurisdiction)[nodeUUID] = jurisdictionMap; |
| 3944 | jurisdiction->lockForWrite(); | 3958 | }); |
| 3945 | (*jurisdiction)[nodeUUID] = jurisdictionMap; | 3959 | }); |
| 3946 | jurisdiction->unlock(); | 3960 | |
| 3961 | |||
| 3947 | 3962 | ||
| 3948 | return statsMessageLength; | 3963 | return statsMessageLength; |
| 3949 | } | 3964 | } |
| @@ -4134,7 +4149,7 @@ bool Application::acceptURL(const QString& urlString) { · 184 unmodified lines | |||
| 4134 | } | 4149 | } |
| 4135 | 4150 | ||
| 4136 | void Application::setSessionUUID(const QUuid& sessionUUID) { | 4151 | void Application::setSessionUUID(const QUuid& sessionUUID) { |
| 4137 | _physicsEngine.setSessionUUID(sessionUUID); | 4152 | _physicsEngine->setSessionUUID(sessionUUID); |
| 4138 | } | 4153 | } |
| 4139 | 4154 | ||
| 4140 | bool Application::askToSetAvatarUrl(const QString& url) { | 4155 | bool Application::askToSetAvatarUrl(const QString& url) { |
| @@ -4389,7 +4404,7 @@ void Application::openUrl(const QUrl& url) { · 248 unmodified lines | |||
| 4389 | void Application::updateMyAvatarTransform() { | 4404 | void Application::updateMyAvatarTransform() { |
| 4390 | const float SIMULATION_OFFSET_QUANTIZATION = 16.0f; // meters | 4405 | const float SIMULATION_OFFSET_QUANTIZATION = 16.0f; // meters |
| 4391 | glm::vec3 avatarPosition = _myAvatar->getPosition(); | 4406 | glm::vec3 avatarPosition = _myAvatar->getPosition(); |
| 4392 | glm::vec3 physicsWorldOffset = _physicsEngine.getOriginOffset(); | 4407 | glm::vec3 physicsWorldOffset = _physicsEngine->getOriginOffset(); |
| 4393 | if (glm::distance(avatarPosition, physicsWorldOffset) > SIMULATION_OFFSET_QUANTIZATION) { | 4408 | if (glm::distance(avatarPosition, physicsWorldOffset) > SIMULATION_OFFSET_QUANTIZATION) { |
| 4394 | glm::vec3 newOriginOffset = avatarPosition; | 4409 | glm::vec3 newOriginOffset = avatarPosition; |
| 4395 | int halfExtent = (int)HALF_SIMULATION_EXTENT; | 4410 | int halfExtent = (int)HALF_SIMULATION_EXTENT; |
| @@ -4398,7 +4413,7 @@ void Application::updateMyAvatarTransform() { · 2 unmodified lines | |||
| 4398 | ((int)(avatarPosition[i] / SIMULATION_OFFSET_QUANTIZATION)) * (int)SIMULATION_OFFSET_QUANTIZATION)); | 4413 | ((int)(avatarPosition[i] / SIMULATION_OFFSET_QUANTIZATION)) * (int)SIMULATION_OFFSET_QUANTIZATION)); |
| 4399 | } | 4414 | } |
| 4400 | // TODO: Andrew to replace this with method that actually moves existing object positions in PhysicsEngine | 4415 | // TODO: Andrew to replace this with method that actually moves existing object positions in PhysicsEngine |
| 4401 | _physicsEngine.setOriginOffset(newOriginOffset); | 4416 | _physicsEngine->setOriginOffset(newOriginOffset); |
| 4402 | } | 4417 | } |
| 4403 | } | 4418 | } |
| 4404 | 4419 | ||
| @@ -4596,7 +4611,7 @@ void Application::checkSkeleton() { · 191 unmodified lines | |||
| 4596 | 4611 | ||
| 4597 | _myAvatar->useFullAvatarURL(AvatarData::defaultFullAvatarModelUrl(), DEFAULT_FULL_AVATAR_MODEL_NAME); | 4612 | _myAvatar->useFullAvatarURL(AvatarData::defaultFullAvatarModelUrl(), DEFAULT_FULL_AVATAR_MODEL_NAME); |
| 4598 | } else { | 4613 | } else { |
| 4599 | _physicsEngine.setCharacterController(_myAvatar->getCharacterController()); | 4614 | _physicsEngine->setCharacterController(_myAvatar->getCharacterController()); |
| 4600 | } | 4615 | } |
| 4601 | } | 4616 | } |
| 4602 | 4617 | ||
| @@ -5036,7 +5051,7 @@ void Application::emulateMouse(Hand* hand, float click, float shift, int index) · 433 unmodified lines | |||
| 5036 | glm::vec3 direction = glm::inverse(_myAvatar->getOrientation()) * palm->getFingerDirection(); | 5051 | glm::vec3 direction = glm::inverse(_myAvatar->getOrientation()) * palm->getFingerDirection(); |
| 5037 | 5052 | ||
| 5038 | // Get the angles, scaled between (-0.5,0.5) | 5053 | // Get the angles, scaled between (-0.5,0.5) |
| 5039 | float xAngle = (atan2(direction.z, direction.x) + M_PI_2); | 5054 | float xAngle = (atan2f(direction.z, direction.x) + (float)M_PI_2); |
| 5040 | float yAngle = 0.5f - ((atan2f(direction.z, direction.y) + (float)M_PI_2)); | 5055 | float yAngle = 0.5f - ((atan2f(direction.z, direction.y) + (float)M_PI_2)); |
| 5041 | auto canvasSize = qApp->getCanvasSize(); | 5056 | auto canvasSize = qApp->getCanvasSize(); |
| 5042 | // Get the pixel range over which the xAngle and yAngle are scaled | 5057 | // Get the pixel range over which the xAngle and yAngle are scaled |