History

Merge branch 'master' into tony/improved-avatar-debug-draw

Anthony J. Thibault committed 10 years ago

Commit 80a349c2 parents 9821c27 3507434150 files · +2127 −1244Browse files

Showing the changes to interface/src/Application.cpp (1 of 150 files). Show all

Unified · Split

interface/src/Application.cpp+95−117
@@ -163,7 +163,6 @@ extern "C" { · 162 unmodified lines
163using namespace std;163using namespace std;
164 164
165static QTimer locationUpdateTimer;165static QTimer locationUpdateTimer;
166static QTimer balanceUpdateTimer;
167static QTimer identityPacketTimer;166static QTimer identityPacketTimer;
168static QTimer pingTimer;167static QTimer pingTimer;
169 168
@@ -213,9 +212,7 @@ const QHash<QString, Application::AcceptURLMethod> Application::_acceptedExtensi · 43 unmodified lines
213 212
214class DeadlockWatchdogThread : public QThread {213class DeadlockWatchdogThread : public QThread {
215public:214public:
216 static const unsigned long HEARTBEAT_CHECK_INTERVAL_SECS = 1;
217 static const unsigned long HEARTBEAT_UPDATE_INTERVAL_SECS = 1;215 static const unsigned long HEARTBEAT_UPDATE_INTERVAL_SECS = 1;
218 static const unsigned long HEARTBEAT_REPORT_INTERVAL_USECS = 5 * USECS_PER_SECOND;
219 static const unsigned long MAX_HEARTBEAT_AGE_USECS = 30 * USECS_PER_SECOND;216 static const unsigned long MAX_HEARTBEAT_AGE_USECS = 30 * USECS_PER_SECOND;
220 static const int WARNING_ELAPSED_HEARTBEAT = 500 * USECS_PER_MSEC; // warn if elapsed heartbeat average is large217 static const int WARNING_ELAPSED_HEARTBEAT = 500 * USECS_PER_MSEC; // warn if elapsed heartbeat average is large
221 static const int HEARTBEAT_SAMPLES = 100000; // ~5 seconds worth of samples218 static const int HEARTBEAT_SAMPLES = 100000; // ~5 seconds worth of samples
@@ -242,8 +239,6 @@ public: · 20 unmodified lines
242 *crashTrigger = 0xDEAD10CC;239 *crashTrigger = 0xDEAD10CC;
243 }240 }
244 241
245 static void setSuppressStatus(bool suppress) { _suppressStatus = suppress; }
246
247 void run() override {242 void run() override {
248 while (!_quit) {243 while (!_quit) {
249 QThread::sleep(HEARTBEAT_UPDATE_INTERVAL_SECS);244 QThread::sleep(HEARTBEAT_UPDATE_INTERVAL_SECS);
@@ -251,7 +246,6 @@ public: · 1 unmodified line
251 uint64_t lastHeartbeat = _heartbeat; // sample atomic _heartbeat, because we could context switch away and have it updated on us246 uint64_t lastHeartbeat = _heartbeat; // sample atomic _heartbeat, because we could context switch away and have it updated on us
252 uint64_t now = usecTimestampNow();247 uint64_t now = usecTimestampNow();
253 auto lastHeartbeatAge = (now > lastHeartbeat) ? now - lastHeartbeat : 0;248 auto lastHeartbeatAge = (now > lastHeartbeat) ? now - lastHeartbeat : 0;
254 auto sinceLastReport = (now > _lastReport) ? now - _lastReport : 0;
255 auto elapsedMovingAverage = _movingAverage.getAverage();249 auto elapsedMovingAverage = _movingAverage.getAverage();
256 250
257 if (elapsedMovingAverage > _maxElapsedAverage) {251 if (elapsedMovingAverage > _maxElapsedAverage) {
@@ -277,21 +271,10 @@ public: · 19 unmodified lines
277 if (elapsedMovingAverage > WARNING_ELAPSED_HEARTBEAT) {271 if (elapsedMovingAverage > WARNING_ELAPSED_HEARTBEAT) {
278 qDebug() << "DEADLOCK WATCHDOG WARNING:"272 qDebug() << "DEADLOCK WATCHDOG WARNING:"
279 << "lastHeartbeatAge:" << lastHeartbeatAge273 << "lastHeartbeatAge:" << lastHeartbeatAge
280 << "elapsedMovingAverage:" << elapsedMovingAverage << "** OVER EXPECTED VALUE**"274 << "elapsedMovingAverage:" << elapsedMovingAverage << "** OVER EXPECTED VALUE **"
281 << "maxElapsed:" << _maxElapsed275 << "maxElapsed:" << _maxElapsed
282 << "maxElapsedAverage:" << _maxElapsedAverage276 << "maxElapsedAverage:" << _maxElapsedAverage
283 << "samples:" << _movingAverage.getSamples();277 << "samples:" << _movingAverage.getSamples();
284 _lastReport = now;
285 }
286
287 if (!_suppressStatus && sinceLastReport > HEARTBEAT_REPORT_INTERVAL_USECS) {
288 qDebug() << "DEADLOCK WATCHDOG STATUS:"
289 << "lastHeartbeatAge:" << lastHeartbeatAge
290 << "elapsedMovingAverage:" << elapsedMovingAverage
291 << "maxElapsed:" << _maxElapsed
292 << "maxElapsedAverage:" << _maxElapsedAverage
293 << "samples:" << _movingAverage.getSamples();
294 _lastReport = now;
295 }278 }
296 279
297 if (lastHeartbeatAge > MAX_HEARTBEAT_AGE_USECS) {280 if (lastHeartbeatAge > MAX_HEARTBEAT_AGE_USECS) {
@@ -313,9 +296,7 @@ public: · 15 unmodified lines
313 }296 }
314 }297 }
315 298
316 static std::atomic<bool> _suppressStatus;
317 static std::atomic<uint64_t> _heartbeat;299 static std::atomic<uint64_t> _heartbeat;
318 static std::atomic<uint64_t> _lastReport;
319 static std::atomic<uint64_t> _maxElapsed;300 static std::atomic<uint64_t> _maxElapsed;
320 static std::atomic<int> _maxElapsedAverage;301 static std::atomic<int> _maxElapsedAverage;
321 static ThreadSafeMovingAverage<int, HEARTBEAT_SAMPLES> _movingAverage;302 static ThreadSafeMovingAverage<int, HEARTBEAT_SAMPLES> _movingAverage;
@@ -323,17 +304,11 @@ public: · 1 unmodified line
323 bool _quit { false };304 bool _quit { false };
324};305};
325 306
326std::atomic<bool> DeadlockWatchdogThread::_suppressStatus;
327std::atomic<uint64_t> DeadlockWatchdogThread::_heartbeat;307std::atomic<uint64_t> DeadlockWatchdogThread::_heartbeat;
328std::atomic<uint64_t> DeadlockWatchdogThread::_lastReport;
329std::atomic<uint64_t> DeadlockWatchdogThread::_maxElapsed;308std::atomic<uint64_t> DeadlockWatchdogThread::_maxElapsed;
330std::atomic<int> DeadlockWatchdogThread::_maxElapsedAverage;309std::atomic<int> DeadlockWatchdogThread::_maxElapsedAverage;
331ThreadSafeMovingAverage<int, DeadlockWatchdogThread::HEARTBEAT_SAMPLES> DeadlockWatchdogThread::_movingAverage;310ThreadSafeMovingAverage<int, DeadlockWatchdogThread::HEARTBEAT_SAMPLES> DeadlockWatchdogThread::_movingAverage;
332 311
333void Application::toggleSuppressDeadlockWatchdogStatus(bool checked) {
334 DeadlockWatchdogThread::setSuppressStatus(checked);
335}
336
337#ifdef Q_OS_WIN312#ifdef Q_OS_WIN
338class MyNativeEventFilter : public QAbstractNativeEventFilter {313class MyNativeEventFilter : public QAbstractNativeEventFilter {
339public:314public:
@@ -512,6 +487,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : · 172 unmodified lines
512 _sessionRunTimer(startupTimer),487 _sessionRunTimer(startupTimer),
513 _previousSessionCrashed(setupEssentials(argc, argv)),488 _previousSessionCrashed(setupEssentials(argc, argv)),
514 _undoStackScriptingInterface(&_undoStack),489 _undoStackScriptingInterface(&_undoStack),
490 _entitySimulation(new PhysicalEntitySimulation()),
515 _physicsEngine(new PhysicsEngine(Vectors::ZERO)),491 _physicsEngine(new PhysicsEngine(Vectors::ZERO)),
516 _entityClipboardRenderer(false, this, this),492 _entityClipboardRenderer(false, this, this),
517 _entityClipboard(new EntityTree()),493 _entityClipboard(new EntityTree()),
@@ -587,12 +563,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : · 69 unmodified lines
587 // put the NodeList and datagram processing on the node thread563 // put the NodeList and datagram processing on the node thread
588 nodeList->moveToThread(nodeThread);564 nodeList->moveToThread(nodeThread);
589 565
590 // Model background downloads need to happen on the Datagram Processor Thread. The idle loop will
591 // emit checkBackgroundDownloads to cause the ModelCache to check it's queue for requested background
592 // downloads.
593 auto modelCache = DependencyManager::get<ModelCache>();
594 connect(this, &Application::checkBackgroundDownloads, modelCache.data(), &ModelCache::checkAsynchronousGets);
595
596 // put the audio processing on a separate thread566 // put the audio processing on a separate thread
597 QThread* audioThread = new QThread();567 QThread* audioThread = new QThread();
598 audioThread->setObjectName("Audio Thread");568 audioThread->setObjectName("Audio Thread");
@@ -679,6 +649,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : · 80 unmodified lines
679 connect(&nodeList->getDomainHandler(), &DomainHandler::connectedToDomain,649 connect(&nodeList->getDomainHandler(), &DomainHandler::connectedToDomain,
680 discoverabilityManager.data(), &DiscoverabilityManager::updateLocation);650 discoverabilityManager.data(), &DiscoverabilityManager::updateLocation);
681 651
652 // send a location update immediately
653 discoverabilityManager->updateLocation();
654
682 connect(nodeList.data(), &NodeList::nodeAdded, this, &Application::nodeAdded);655 connect(nodeList.data(), &NodeList::nodeAdded, this, &Application::nodeAdded);
683 connect(nodeList.data(), &NodeList::nodeKilled, this, &Application::nodeKilled);656 connect(nodeList.data(), &NodeList::nodeKilled, this, &Application::nodeKilled);
684 connect(nodeList.data(), &NodeList::nodeActivated, this, &Application::nodeActivated);657 connect(nodeList.data(), &NodeList::nodeActivated, this, &Application::nodeActivated);
@@ -690,13 +663,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : · 5 unmodified lines
690 // connect to appropriate slots on AccountManager663 // connect to appropriate slots on AccountManager
691 AccountManager& accountManager = AccountManager::getInstance();664 AccountManager& accountManager = AccountManager::getInstance();
692 665
693 const qint64 BALANCE_UPDATE_INTERVAL_MSECS = 5 * MSECS_PER_SEC;
694
695 connect(&balanceUpdateTimer, &QTimer::timeout, &accountManager, &AccountManager::updateBalance);
696 balanceUpdateTimer.start(BALANCE_UPDATE_INTERVAL_MSECS);
697
698 connect(&accountManager, &AccountManager::balanceChanged, this, &Application::updateWindowTitle);
699
700 auto dialogsManager = DependencyManager::get<DialogsManager>();666 auto dialogsManager = DependencyManager::get<DialogsManager>();
701 connect(&accountManager, &AccountManager::authRequired, dialogsManager.data(), &DialogsManager::showLoginDialog);667 connect(&accountManager, &AccountManager::authRequired, dialogsManager.data(), &DialogsManager::showLoginDialog);
702 connect(&accountManager, &AccountManager::usernameChanged, this, &Application::updateWindowTitle);668 connect(&accountManager, &AccountManager::usernameChanged, this, &Application::updateWindowTitle);
@@ -1199,7 +1165,6 @@ void Application::cleanupBeforeQuit() { · 496 unmodified lines
1199 // first stop all timers directly or by invokeMethod1165 // first stop all timers directly or by invokeMethod
1200 // depending on what thread they run in1166 // depending on what thread they run in
1201 locationUpdateTimer.stop();1167 locationUpdateTimer.stop();
1202 balanceUpdateTimer.stop();
1203 identityPacketTimer.stop();1168 identityPacketTimer.stop();
1204 pingTimer.stop();1169 pingTimer.stop();
1205 QMetaObject::invokeMethod(&_settingsTimer, "stop", Qt::BlockingQueuedConnection);1170 QMetaObject::invokeMethod(&_settingsTimer, "stop", Qt::BlockingQueuedConnection);
@@ -1513,10 +1478,17 @@ void Application::paintGL() { · 307 unmodified lines
1513 1478
1514 auto lodManager = DependencyManager::get<LODManager>();1479 auto lodManager = DependencyManager::get<LODManager>();
1515 1480
1516 1481 {
1517 RenderArgs renderArgs(_gpuContext, getEntities(), getViewFrustum(), lodManager->getOctreeSizeScale(),1482 QMutexLocker viewLocker(&_viewMutex);
1483 _viewFrustum.calculate();
1484 }
1485 RenderArgs renderArgs(_gpuContext, getEntities(), lodManager->getOctreeSizeScale(),
1518 lodManager->getBoundaryLevelAdjust(), RenderArgs::DEFAULT_RENDER_MODE,1486 lodManager->getBoundaryLevelAdjust(), RenderArgs::DEFAULT_RENDER_MODE,
1519 RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE);1487 RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE);
1488 {
1489 QMutexLocker viewLocker(&_viewMutex);
1490 renderArgs.setViewFrustum(_viewFrustum);
1491 }
1520 1492
1521 PerformanceWarning::setSuppressShortTimings(Menu::getInstance()->isOptionChecked(MenuOption::SuppressShortTimings));1493 PerformanceWarning::setSuppressShortTimings(Menu::getInstance()->isOptionChecked(MenuOption::SuppressShortTimings));
1522 bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings);1494 bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings);
@@ -1683,7 +1655,7 @@ void Application::paintGL() { · 160 unmodified lines
1683 renderArgs._context->enableStereo(true);1655 renderArgs._context->enableStereo(true);
1684 mat4 eyeOffsets[2];1656 mat4 eyeOffsets[2];
1685 mat4 eyeProjections[2];1657 mat4 eyeProjections[2];
1686 auto baseProjection = renderArgs._viewFrustum->getProjection();1658 auto baseProjection = renderArgs.getViewFrustum().getProjection();
1687 auto hmdInterface = DependencyManager::get<HMDScriptingInterface>();1659 auto hmdInterface = DependencyManager::get<HMDScriptingInterface>();
1688 float IPDScale = hmdInterface->getIPDScale();1660 float IPDScale = hmdInterface->getIPDScale();
1689 mat4 headPose = displayPlugin->getHeadPose();1661 mat4 headPose = displayPlugin->getHeadPose();
@@ -1813,7 +1785,10 @@ void Application::resizeGL() { · 123 unmodified lines
1813 _myCamera.setProjection(glm::perspective(glm::radians(_fieldOfView.get()), aspectRatio,1785 _myCamera.setProjection(glm::perspective(glm::radians(_fieldOfView.get()), aspectRatio,
1814 DEFAULT_NEAR_CLIP, DEFAULT_FAR_CLIP));1786 DEFAULT_NEAR_CLIP, DEFAULT_FAR_CLIP));
1815 // Possible change in aspect ratio1787 // Possible change in aspect ratio
1816 loadViewFrustum(_myCamera, _viewFrustum);1788 {
1789 QMutexLocker viewLocker(&_viewMutex);
1790 loadViewFrustum(_myCamera, _viewFrustum);
1791 }
1817 1792
1818 auto offscreenUi = DependencyManager::get<OffscreenUi>();1793 auto offscreenUi = DependencyManager::get<OffscreenUi>();
1819 auto uiSize = displayPlugin->getRecommendedUiSize();1794 auto uiSize = displayPlugin->getRecommendedUiSize();
@@ -2140,6 +2115,7 @@ void Application::keyPressEvent(QKeyEvent* event) { · 320 unmodified lines
2140 2115
2141 case Qt::Key_J:2116 case Qt::Key_J:
2142 if (isShifted) {2117 if (isShifted) {
2118 QMutexLocker viewLocker(&_viewMutex);
2143 _viewFrustum.setFocalLength(_viewFrustum.getFocalLength() - 0.1f);2119 _viewFrustum.setFocalLength(_viewFrustum.getFocalLength() - 0.1f);
2144 } else {2120 } else {
2145 _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(-0.001, 0, 0));2121 _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(-0.001, 0, 0));
@@ -2149,6 +2125,7 @@ void Application::keyPressEvent(QKeyEvent* event) { · 3 unmodified lines
2149 2125
2150 case Qt::Key_M:2126 case Qt::Key_M:
2151 if (isShifted) {2127 if (isShifted) {
2128 QMutexLocker viewLocker(&_viewMutex);
2152 _viewFrustum.setFocalLength(_viewFrustum.getFocalLength() + 0.1f);2129 _viewFrustum.setFocalLength(_viewFrustum.getFocalLength() + 0.1f);
2153 } else {2130 } else {
2154 _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0.001, 0, 0));2131 _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0.001, 0, 0));
@@ -2754,9 +2731,6 @@ void Application::idle(uint64_t now) { · 599 unmodified lines
2754 }2731 }
2755 2732
2756 _overlayConductor.update(secondsSinceLastUpdate);2733 _overlayConductor.update(secondsSinceLastUpdate);
2757
2758 // check for any requested background downloads.
2759 emit checkBackgroundDownloads();
2760}2734}
2761 2735
2762void Application::setLowVelocityFilter(bool lowVelocityFilter) {2736void Application::setLowVelocityFilter(bool lowVelocityFilter) {
@@ -2997,19 +2971,22 @@ void Application::init() { · 234 unmodified lines
2997 DependencyManager::get<NodeList>()->sendDomainServerCheckIn();2971 DependencyManager::get<NodeList>()->sendDomainServerCheckIn();
2998 2972
2999 getEntities()->init();2973 getEntities()->init();
3000 getEntities()->setViewFrustum(getViewFrustum());2974 {
2975 QMutexLocker viewLocker(&_viewMutex);
2976 getEntities()->setViewFrustum(_viewFrustum);
2977 }
3001 2978
3002 ObjectMotionState::setShapeManager(&_shapeManager);2979 ObjectMotionState::setShapeManager(&_shapeManager);
3003 _physicsEngine->init();2980 _physicsEngine->init();
3004 2981
3005 EntityTreePointer tree = getEntities()->getTree();2982 EntityTreePointer tree = getEntities()->getTree();
3006 _entitySimulation.init(tree, _physicsEngine, &_entityEditSender);2983 _entitySimulation->init(tree, _physicsEngine, &_entityEditSender);
3007 tree->setSimulation(&_entitySimulation);2984 tree->setSimulation(_entitySimulation);
3008 2985
3009 auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>();2986 auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>();
3010 2987
3011 // connect the _entityCollisionSystem to our EntityTreeRenderer since that's what handles running entity scripts2988 // connect the _entityCollisionSystem to our EntityTreeRenderer since that's what handles running entity scripts
3012 connect(&_entitySimulation, &EntitySimulation::entityCollisionWithEntity,2989 connect(_entitySimulation.get(), &EntitySimulation::entityCollisionWithEntity,
3013 getEntities(), &EntityTreeRenderer::entityCollisionWithEntity);2990 getEntities(), &EntityTreeRenderer::entityCollisionWithEntity);
3014 2991
3015 // connect the _entities (EntityTreeRenderer) to our script engine's EntityScriptingInterface for firing2992 // connect the _entities (EntityTreeRenderer) to our script engine's EntityScriptingInterface for firing
@@ -3017,12 +2994,26 @@ void Application::init() { · 1 unmodified line
3017 getEntities()->connectSignalsToSlots(entityScriptingInterface.data());2994 getEntities()->connectSignalsToSlots(entityScriptingInterface.data());
3018 2995
3019 _entityClipboardRenderer.init();2996 _entityClipboardRenderer.init();
3020 _entityClipboardRenderer.setViewFrustum(getViewFrustum());2997 {
2998 QMutexLocker viewLocker(&_viewMutex);
2999 _entityClipboardRenderer.setViewFrustum(_viewFrustum);
3000 }
3021 _entityClipboardRenderer.setTree(_entityClipboard);3001 _entityClipboardRenderer.setTree(_entityClipboard);
3022 3002
3023 // Make sure any new sounds are loaded as soon as know about them.3003 // Make sure any new sounds are loaded as soon as know about them.
3024 connect(tree.get(), &EntityTree::newCollisionSoundURL, DependencyManager::get<SoundCache>().data(), &SoundCache::getSound);3004 connect(tree.get(), &EntityTree::newCollisionSoundURL, this, [this](QUrl newURL, EntityItemID id) {
3025 connect(getMyAvatar(), &MyAvatar::newCollisionSoundURL, DependencyManager::get<SoundCache>().data(), &SoundCache::getSound);3005 EntityTreePointer tree = getEntities()->getTree();
3006 if (auto entity = tree->findEntityByEntityItemID(id)) {
3007 auto sound = DependencyManager::get<SoundCache>()->getSound(newURL);
3008 entity->setCollisionSound(sound);
3009 }
3010 }, Qt::QueuedConnection);
3011 connect(getMyAvatar(), &MyAvatar::newCollisionSoundURL, this, [this](QUrl newURL) {
3012 if (auto avatar = getMyAvatar()) {
3013 auto sound = DependencyManager::get<SoundCache>()->getSound(newURL);
3014 avatar->setCollisionSound(sound);
3015 }
3016 }, Qt::QueuedConnection);
3026}3017}
3027 3018
3028void Application::updateLOD() const {3019void Application::updateLOD() const {
@@ -3220,9 +3211,12 @@ void Application::resetPhysicsReadyInformation() { · 191 unmodified lines
3220 3211
3221void Application::reloadResourceCaches() {3212void Application::reloadResourceCaches() {
3222 resetPhysicsReadyInformation();3213 resetPhysicsReadyInformation();
3214 {
3215 QMutexLocker viewLocker(&_viewMutex);
3216 _viewFrustum.setPosition(glm::vec3(0.0f, 0.0f, TREE_SCALE));
3217 _viewFrustum.setOrientation(glm::quat());
3218 }
3223 // Clear entities out of view frustum3219 // Clear entities out of view frustum
3224 _viewFrustum.setPosition(glm::vec3(0.0f, 0.0f, TREE_SCALE));
3225 _viewFrustum.setOrientation(glm::quat());
3226 queryOctree(NodeType::EntityServer, PacketType::EntityQuery, _entityServerJurisdictions);3220 queryOctree(NodeType::EntityServer, PacketType::EntityQuery, _entityServerJurisdictions);
3227 3221
3228 DependencyManager::get<AssetClient>()->clearCache();3222 DependencyManager::get<AssetClient>()->clearCache();
@@ -3412,22 +3406,22 @@ void Application::update(float deltaTime) { · 183 unmodified lines
3412 3406
3413 PerformanceTimer perfTimer("updateStates)");3407 PerformanceTimer perfTimer("updateStates)");
3414 static VectorOfMotionStates motionStates;3408 static VectorOfMotionStates motionStates;
3415 _entitySimulation.getObjectsToRemoveFromPhysics(motionStates);3409 _entitySimulation->getObjectsToRemoveFromPhysics(motionStates);
3416 _physicsEngine->removeObjects(motionStates);3410 _physicsEngine->removeObjects(motionStates);
3417 _entitySimulation.deleteObjectsRemovedFromPhysics();3411 _entitySimulation->deleteObjectsRemovedFromPhysics();
3418 3412
3419 getEntities()->getTree()->withReadLock([&] {3413 getEntities()->getTree()->withReadLock([&] {
3420 _entitySimulation.getObjectsToAddToPhysics(motionStates);3414 _entitySimulation->getObjectsToAddToPhysics(motionStates);
3421 _physicsEngine->addObjects(motionStates);3415 _physicsEngine->addObjects(motionStates);
3422 3416
3423 });3417 });
3424 getEntities()->getTree()->withReadLock([&] {3418 getEntities()->getTree()->withReadLock([&] {
3425 _entitySimulation.getObjectsToChange(motionStates);3419 _entitySimulation->getObjectsToChange(motionStates);
3426 VectorOfMotionStates stillNeedChange = _physicsEngine->changeObjects(motionStates);3420 VectorOfMotionStates stillNeedChange = _physicsEngine->changeObjects(motionStates);
3427 _entitySimulation.setObjectsToChange(stillNeedChange);3421 _entitySimulation->setObjectsToChange(stillNeedChange);
3428 });3422 });
3429 3423
3430 _entitySimulation.applyActionChanges();3424 _entitySimulation->applyActionChanges();
3431 3425
3432 avatarManager->getObjectsToRemoveFromPhysics(motionStates);3426 avatarManager->getObjectsToRemoveFromPhysics(motionStates);
3433 _physicsEngine->removeObjects(motionStates);3427 _physicsEngine->removeObjects(motionStates);
@@ -3455,7 +3449,7 @@ void Application::update(float deltaTime) { · 21 unmodified lines
3455 getEntities()->getTree()->withWriteLock([&] {3449 getEntities()->getTree()->withWriteLock([&] {
3456 PerformanceTimer perfTimer("handleOutgoingChanges");3450 PerformanceTimer perfTimer("handleOutgoingChanges");
3457 const VectorOfMotionStates& outgoingChanges = _physicsEngine->getOutgoingChanges();3451 const VectorOfMotionStates& outgoingChanges = _physicsEngine->getOutgoingChanges();
3458 _entitySimulation.handleOutgoingChanges(outgoingChanges);3452 _entitySimulation->handleOutgoingChanges(outgoingChanges);
3459 avatarManager->handleOutgoingChanges(outgoingChanges);3453 avatarManager->handleOutgoingChanges(outgoingChanges);
3460 });3454 });
3461 3455
@@ -3468,7 +3462,7 @@ void Application::update(float deltaTime) { · 6 unmodified lines
3468 PerformanceTimer perfTimer("entities");3462 PerformanceTimer perfTimer("entities");
3469 // Collision events (and their scripts) must not be handled when we're locked, above. (That would risk3463 // Collision events (and their scripts) must not be handled when we're locked, above. (That would risk
3470 // deadlock.)3464 // deadlock.)
3471 _entitySimulation.handleCollisionEvents(collisionEvents);3465 _entitySimulation->handleCollisionEvents(collisionEvents);
3472 3466
3473 // NOTE: the getEntities()->update() call below will wait for lock3467 // NOTE: the getEntities()->update() call below will wait for lock
3474 // and will simulate entity motion (the EntityTree has been given an EntitySimulation).3468 // and will simulate entity motion (the EntityTree has been given an EntitySimulation).
@@ -3511,7 +3505,7 @@ void Application::update(float deltaTime) { · 36 unmodified lines
3511 // actually need to calculate the view frustum planes to send these details3505 // actually need to calculate the view frustum planes to send these details
3512 // to the server.3506 // to the server.
3513 {3507 {
3514 PerformanceTimer perfTimer("loadViewFrustum");3508 QMutexLocker viewLocker(&_viewMutex);
3515 loadViewFrustum(_myCamera, _viewFrustum);3509 loadViewFrustum(_myCamera, _viewFrustum);
3516 }3510 }
3517 3511
@@ -3520,6 +3514,7 @@ void Application::update(float deltaTime) { · 2 unmodified lines
3520 // Update my voxel servers with my current voxel query...3514 // Update my voxel servers with my current voxel query...
3521 {3515 {
3522 PROFILE_RANGE_EX("QueryOctree", 0xffff0000, (uint64_t)getActiveDisplayPlugin()->presentCount());3516 PROFILE_RANGE_EX("QueryOctree", 0xffff0000, (uint64_t)getActiveDisplayPlugin()->presentCount());
3517 QMutexLocker viewLocker(&_viewMutex);
3523 PerformanceTimer perfTimer("queryOctree");3518 PerformanceTimer perfTimer("queryOctree");
3524 quint64 sinceLastQuery = now - _lastQueriedTime;3519 quint64 sinceLastQuery = now - _lastQueriedTime;
3525 const quint64 TOO_LONG_SINCE_LAST_QUERY = 3 * USECS_PER_SECOND;3520 const quint64 TOO_LONG_SINCE_LAST_QUERY = 3 * USECS_PER_SECOND;
@@ -3635,14 +3630,16 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node · 109 unmodified lines
3635 //qCDebug(interfaceapp) << ">>> inside... queryOctree()... _viewFrustum.getFieldOfView()=" << _viewFrustum.getFieldOfView();3630 //qCDebug(interfaceapp) << ">>> inside... queryOctree()... _viewFrustum.getFieldOfView()=" << _viewFrustum.getFieldOfView();
3636 bool wantExtraDebugging = getLogger()->extraDebugging();3631 bool wantExtraDebugging = getLogger()->extraDebugging();
3637 3632
3638 _octreeQuery.setCameraPosition(_viewFrustum.getPosition());3633 ViewFrustum viewFrustum;
3639 _octreeQuery.setCameraOrientation(_viewFrustum.getOrientation());3634 copyViewFrustum(viewFrustum);
3640 _octreeQuery.setCameraFov(_viewFrustum.getFieldOfView());3635 _octreeQuery.setCameraPosition(viewFrustum.getPosition());
3641 _octreeQuery.setCameraAspectRatio(_viewFrustum.getAspectRatio());3636 _octreeQuery.setCameraOrientation(viewFrustum.getOrientation());
3642 _octreeQuery.setCameraNearClip(_viewFrustum.getNearClip());3637 _octreeQuery.setCameraFov(viewFrustum.getFieldOfView());
3643 _octreeQuery.setCameraFarClip(_viewFrustum.getFarClip());3638 _octreeQuery.setCameraAspectRatio(viewFrustum.getAspectRatio());
3639 _octreeQuery.setCameraNearClip(viewFrustum.getNearClip());
3640 _octreeQuery.setCameraFarClip(viewFrustum.getFarClip());
3644 _octreeQuery.setCameraEyeOffsetPosition(glm::vec3());3641 _octreeQuery.setCameraEyeOffsetPosition(glm::vec3());
3645 _octreeQuery.setCameraCenterRadius(_viewFrustum.getCenterRadius());3642 _octreeQuery.setCameraCenterRadius(viewFrustum.getCenterRadius());
3646 auto lodManager = DependencyManager::get<LODManager>();3643 auto lodManager = DependencyManager::get<LODManager>();
3647 _octreeQuery.setOctreeSizeScale(lodManager->getOctreeSizeScale());3644 _octreeQuery.setOctreeSizeScale(lodManager->getOctreeSizeScale());
3648 _octreeQuery.setBoundaryLevelAdjust(lodManager->getBoundaryLevelAdjust());3645 _octreeQuery.setBoundaryLevelAdjust(lodManager->getBoundaryLevelAdjust());
@@ -3678,7 +3675,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node · 29 unmodified lines
3678 rootDetails.y * TREE_SCALE,3675 rootDetails.y * TREE_SCALE,
3679 rootDetails.z * TREE_SCALE) - glm::vec3(HALF_TREE_SCALE),3676 rootDetails.z * TREE_SCALE) - glm::vec3(HALF_TREE_SCALE),
3680 rootDetails.s * TREE_SCALE);3677 rootDetails.s * TREE_SCALE);
3681 if (_viewFrustum.cubeIntersectsKeyhole(serverBounds)) {3678 if (viewFrustum.cubeIntersectsKeyhole(serverBounds)) {
3682 inViewServers++;3679 inViewServers++;
3683 }3680 }
3684 }3681 }
@@ -3744,11 +3741,9 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node · 59 unmodified lines
3744 rootDetails.s * TREE_SCALE);3741 rootDetails.s * TREE_SCALE);
3745 3742
3746 3743
3747 inView = _viewFrustum.cubeIntersectsKeyhole(serverBounds);3744 inView = viewFrustum.cubeIntersectsKeyhole(serverBounds);
3748 } else {3745 } else if (wantExtraDebugging) {
3749 if (wantExtraDebugging) {3746 qCDebug(interfaceapp) << "Jurisdiction without RootCode for node " << *node << ". That's unusual!";
3750 qCDebug(interfaceapp) << "Jurisdiction without RootCode for node " << *node << ". That's unusual!";
3751 }
3752 }3747 }
3753 }3748 }
3754 3749
@@ -3839,6 +3834,7 @@ QRect Application::getDesirableApplicationGeometry() const { · 84 unmodified lines
3839// or the "myCamera".3834// or the "myCamera".
3840//3835//
3841void Application::loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum) {3836void Application::loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum) {
3837 PerformanceTimer perfTimer("loadViewFrustum");
3842 PROFILE_RANGE(__FUNCTION__);3838 PROFILE_RANGE(__FUNCTION__);
3843 // We will use these below, from either the camera or head vectors calculated above3839 // We will use these below, from either the camera or head vectors calculated above
3844 viewFrustum.setProjection(camera.getProjection());3840 viewFrustum.setProjection(camera.getProjection());
@@ -3867,7 +3863,8 @@ PickRay Application::computePickRay(float x, float y) const { · 22 unmodified lines
3867 getApplicationCompositor().computeHmdPickRay(pickPoint, result.origin, result.direction);3863 getApplicationCompositor().computeHmdPickRay(pickPoint, result.origin, result.direction);
3868 } else {3864 } else {
3869 pickPoint /= getCanvasSize();3865 pickPoint /= getCanvasSize();
3870 getViewFrustum()->computePickRay(pickPoint.x, pickPoint.y, result.origin, result.direction);3866 QMutexLocker viewLocker(&_viewMutex);
3867 _viewFrustum.computePickRay(pickPoint.x, pickPoint.y, result.origin, result.direction);
3871 }3868 }
3872 return result;3869 return result;
3873}3870}
@@ -3880,44 +3877,19 @@ glm::vec3 Application::getAvatarPosition() const { · 6 unmodified lines
3880 return getMyAvatar()->getPosition();3877 return getMyAvatar()->getPosition();
3881}3878}
3882 3879
3883ViewFrustum* Application::getViewFrustum() {3880void Application::copyViewFrustum(ViewFrustum& viewOut) const {
3884#ifdef DEBUG3881 QMutexLocker viewLocker(&_viewMutex);
3885 if (QThread::currentThread() == activeRenderingThread) {3882 viewOut = _viewFrustum;
3886 // FIXME, figure out a better way to do this
3887 //qWarning() << "Calling Application::getViewFrustum() from the active rendering thread, did you mean Application::getDisplayViewFrustum()?";
3888 }
3889#endif
3890 return &_viewFrustum;
3891}
3892
3893const ViewFrustum* Application::getViewFrustum() const {
3894#ifdef DEBUG
3895 if (QThread::currentThread() == activeRenderingThread) {
3896 // FIXME, figure out a better way to do this
3897 //qWarning() << "Calling Application::getViewFrustum() from the active rendering thread, did you mean Application::getDisplayViewFrustum()?";
3898 }
3899#endif
3900 return &_viewFrustum;
3901}3883}
3902 3884
3903ViewFrustum* Application::getDisplayViewFrustum() {3885void Application::copyDisplayViewFrustum(ViewFrustum& viewOut) const {
3904#ifdef DEBUG3886 QMutexLocker viewLocker(&_viewMutex);
3905 if (QThread::currentThread() != activeRenderingThread) {3887 viewOut = _displayViewFrustum;
3906 // FIXME, figure out a better way to do this
3907 // qWarning() << "Calling Application::getDisplayViewFrustum() from outside the active rendering thread or outside rendering, did you mean Application::getViewFrustum()?";
3908 }
3909#endif
3910 return &_displayViewFrustum;
3911}3888}
3912 3889
3913const ViewFrustum* Application::getDisplayViewFrustum() const {3890void Application::copyShadowViewFrustum(ViewFrustum& viewOut) const {
3914#ifdef DEBUG3891 QMutexLocker viewLocker(&_viewMutex);
3915 if (QThread::currentThread() != activeRenderingThread) {3892 viewOut = _shadowViewFrustum;
3916 // FIXME, figure out a better way to do this
3917 // qWarning() << "Calling Application::getDisplayViewFrustum() from outside the active rendering thread or outside rendering, did you mean Application::getViewFrustum()?";
3918 }
3919#endif
3920 return &_displayViewFrustum;
3921}3893}
3922 3894
3923// WorldBox Render Data & rendering functions3895// WorldBox Render Data & rendering functions
@@ -3982,7 +3954,7 @@ namespace render { · 58 unmodified lines
3982 auto skybox = skyStage->getSkybox();3954 auto skybox = skyStage->getSkybox();
3983 if (skybox) {3955 if (skybox) {
3984 PerformanceTimer perfTimer("skybox");3956 PerformanceTimer perfTimer("skybox");
3985 skybox->render(batch, *(args->_viewFrustum));3957 skybox->render(batch, args->getViewFrustum());
3986 break;3958 break;
3987 }3959 }
3988 }3960 }
@@ -4023,7 +3995,10 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se · 34 unmodified lines
4023 PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::displaySide()");3995 PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::displaySide()");
4024 3996
4025 // load the view frustum3997 // load the view frustum
4026 loadViewFrustum(theCamera, _displayViewFrustum);3998 {
3999 QMutexLocker viewLocker(&_viewMutex);
4000 loadViewFrustum(theCamera, _displayViewFrustum);
4001 }
4027 4002
4028 // TODO fix shadows and make them use the GPU library4003 // TODO fix shadows and make them use the GPU library
4029 4004
@@ -4091,7 +4066,10 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se · 61 unmodified lines
4091 {4066 {
4092 PerformanceTimer perfTimer("EngineRun");4067 PerformanceTimer perfTimer("EngineRun");
4093 4068
4094 renderArgs->_viewFrustum = getDisplayViewFrustum();4069 {
4070 QMutexLocker viewLocker(&_viewMutex);
4071 renderArgs->setViewFrustum(_displayViewFrustum);
4072 }
4095 _renderEngine->getRenderContext()->args = renderArgs;4073 _renderEngine->getRenderContext()->args = renderArgs;
4096 4074
4097 // Before the deferred pass, let's try to use the render engine4075 // Before the deferred pass, let's try to use the render engine
@@ -5221,10 +5199,10 @@ void Application::updateInputModes() { · 1123 unmodified lines
5221}5199}
5222 5200
5223mat4 Application::getEyeProjection(int eye) const {5201mat4 Application::getEyeProjection(int eye) const {
5202 QMutexLocker viewLocker(&_viewMutex);
5224 if (isHMDMode()) {5203 if (isHMDMode()) {
5225 return getActiveDisplayPlugin()->getEyeProjection((Eye)eye, _viewFrustum.getProjection());5204 return getActiveDisplayPlugin()->getEyeProjection((Eye)eye, _viewFrustum.getProjection());
5226 }5205 }
5227
5228 return _viewFrustum.getProjection();5206 return _viewFrustum.getProjection();
5229}5207}
5230 5208