History

add locks and explicitly copy ViewFrustums

Andrew Meadows committed 10 years ago

Commit 71b2d641 parent bcf2cc811 files · +148 −86Browse files

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

Unified · Split

interface/src/Application.cpp+71−38
@@ -1511,12 +1511,17 @@ void Application::paintGL() { · 1510 unmodified lines
15111511
15121512 auto lodManager = DependencyManager::get<LODManager>();
15131513
1514−
1515− _viewFrustum.calculate();
1514+ {
1515+ QMutexLocker viewLocker(&_viewMutex);
1516+ _viewFrustum.calculate();
1517+ }
15161518 RenderArgs renderArgs(_gpuContext, getEntities(), lodManager->getOctreeSizeScale(),
15171519 lodManager->getBoundaryLevelAdjust(), RenderArgs::DEFAULT_RENDER_MODE,
15181520 RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE);
1519− renderArgs.setViewFrustum(getViewFrustum());
1521+ {
1522+ QMutexLocker viewLocker(&_viewMutex);
1523+ renderArgs.setViewFrustum(_viewFrustum);
1524+ }
15201525
15211526 PerformanceWarning::setSuppressShortTimings(Menu::getInstance()->isOptionChecked(MenuOption::SuppressShortTimings));
15221527 bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings);
@@ -1813,7 +1818,10 @@ void Application::resizeGL() { · 290 unmodified lines
18131818 _myCamera.setProjection(glm::perspective(glm::radians(_fieldOfView.get()), aspectRatio,
18141819 DEFAULT_NEAR_CLIP, DEFAULT_FAR_CLIP));
18151820 // Possible change in aspect ratio
1816− loadViewFrustum(_myCamera, _viewFrustum);
1821+ {
1822+ QMutexLocker viewLocker(&_viewMutex);
1823+ loadViewFrustum(_myCamera, _viewFrustum);
1824+ }
18171825
18181826 auto offscreenUi = DependencyManager::get<OffscreenUi>();
18191827 auto uiSize = displayPlugin->getRecommendedUiSize();
@@ -2140,6 +2148,7 @@ void Application::keyPressEvent(QKeyEvent* event) { · 320 unmodified lines
21402148
21412149 case Qt::Key_J:
21422150 if (isShifted) {
2151+ QMutexLocker viewLocker(&_viewMutex);
21432152 _viewFrustum.setFocalLength(_viewFrustum.getFocalLength() - 0.1f);
21442153 } else {
21452154 _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(-0.001, 0, 0));
@@ -2149,6 +2158,7 @@ void Application::keyPressEvent(QKeyEvent* event) { · 3 unmodified lines
21492158
21502159 case Qt::Key_M:
21512160 if (isShifted) {
2161+ QMutexLocker viewLocker(&_viewMutex);
21522162 _viewFrustum.setFocalLength(_viewFrustum.getFocalLength() + 0.1f);
21532163 } else {
21542164 _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0.001, 0, 0));
@@ -2997,7 +3007,10 @@ void Application::init() { · 842 unmodified lines
29973007 DependencyManager::get<NodeList>()->sendDomainServerCheckIn();
29983008
29993009 getEntities()->init();
3000− getEntities()->setViewFrustum(getViewFrustum());
3010+ {
3011+ QMutexLocker viewLocker(&_viewMutex);
3012+ getEntities()->setViewFrustum(_viewFrustum);
3013+ }
30013014
30023015 ObjectMotionState::setShapeManager(&_shapeManager);
30033016 _physicsEngine->init();
@@ -3017,7 +3030,10 @@ void Application::init() { · 13 unmodified lines
30173030 getEntities()->connectSignalsToSlots(entityScriptingInterface.data());
30183031
30193032 _entityClipboardRenderer.init();
3020− _entityClipboardRenderer.setViewFrustum(getViewFrustum());
3033+ {
3034+ QMutexLocker viewLocker(&_viewMutex);
3035+ _entityClipboardRenderer.setViewFrustum(_viewFrustum);
3036+ }
30213037 _entityClipboardRenderer.setTree(_entityClipboard);
30223038
30233039 // Make sure any new sounds are loaded as soon as know about them.
@@ -3220,9 +3236,12 @@ void Application::resetPhysicsReadyInformation() { · 196 unmodified lines
32203236
32213237 void Application::reloadResourceCaches() {
32223238 resetPhysicsReadyInformation();
3239+ {
3240+ QMutexLocker viewLocker(&_viewMutex);
3241+ _viewFrustum.setPosition(glm::vec3(0.0f, 0.0f, TREE_SCALE));
3242+ _viewFrustum.setOrientation(glm::quat());
3243+ }
32233244 // Clear entities out of view frustum
3224− _viewFrustum.setPosition(glm::vec3(0.0f, 0.0f, TREE_SCALE));
3225− _viewFrustum.setOrientation(glm::quat());
32263245 queryOctree(NodeType::EntityServer, PacketType::EntityQuery, _entityServerJurisdictions);
32273246
32283247 DependencyManager::get<AssetClient>()->clearCache();
@@ -3511,7 +3530,7 @@ void Application::update(float deltaTime) { · 282 unmodified lines
35113530 // actually need to calculate the view frustum planes to send these details
35123531 // to the server.
35133532 {
3514− PerformanceTimer perfTimer("loadViewFrustum");
3533+ QMutexLocker viewLocker(&_viewMutex);
35153534 loadViewFrustum(_myCamera, _viewFrustum);
35163535 }
35173536
@@ -3520,6 +3539,7 @@ void Application::update(float deltaTime) { · 2 unmodified lines
35203539 // Update my voxel servers with my current voxel query...
35213540 {
35223541 PROFILE_RANGE_EX("QueryOctree", 0xffff0000, (uint64_t)getActiveDisplayPlugin()->presentCount());
3542+ QMutexLocker viewLocker(&_viewMutex);
35233543 PerformanceTimer perfTimer("queryOctree");
35243544 quint64 sinceLastQuery = now - _lastQueriedTime;
35253545 const quint64 TOO_LONG_SINCE_LAST_QUERY = 3 * USECS_PER_SECOND;
@@ -3631,14 +3651,19 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node · 105 unmodified lines
36313651 //qCDebug(interfaceapp) << ">>> inside... queryOctree()... _viewFrustum.getFieldOfView()=" << _viewFrustum.getFieldOfView();
36323652 bool wantExtraDebugging = getLogger()->extraDebugging();
36333653
3634− _octreeQuery.setCameraPosition(_viewFrustum.getPosition());
3635− _octreeQuery.setCameraOrientation(_viewFrustum.getOrientation());
3636− _octreeQuery.setCameraFov(_viewFrustum.getFieldOfView());
3637− _octreeQuery.setCameraAspectRatio(_viewFrustum.getAspectRatio());
3638− _octreeQuery.setCameraNearClip(_viewFrustum.getNearClip());
3639− _octreeQuery.setCameraFarClip(_viewFrustum.getFarClip());
3654+ ViewFrustum viewFrustumCopy;
3655+ {
3656+ QMutexLocker viewLocker(&_viewMutex);
3657+ viewFrustumCopy = _viewFrustum;
3658+ }
3659+ _octreeQuery.setCameraPosition(viewFrustumCopy.getPosition());
3660+ _octreeQuery.setCameraOrientation(viewFrustumCopy.getOrientation());
3661+ _octreeQuery.setCameraFov(viewFrustumCopy.getFieldOfView());
3662+ _octreeQuery.setCameraAspectRatio(viewFrustumCopy.getAspectRatio());
3663+ _octreeQuery.setCameraNearClip(viewFrustumCopy.getNearClip());
3664+ _octreeQuery.setCameraFarClip(viewFrustumCopy.getFarClip());
36403665 _octreeQuery.setCameraEyeOffsetPosition(glm::vec3());
3641− _octreeQuery.setCameraCenterRadius(_viewFrustum.getCenterRadius());
3666+ _octreeQuery.setCameraCenterRadius(viewFrustumCopy.getCenterRadius());
36423667 auto lodManager = DependencyManager::get<LODManager>();
36433668 _octreeQuery.setOctreeSizeScale(lodManager->getOctreeSizeScale());
36443669 _octreeQuery.setBoundaryLevelAdjust(lodManager->getBoundaryLevelAdjust());
@@ -3674,7 +3699,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node · 29 unmodified lines
36743699 rootDetails.y * TREE_SCALE,
36753700 rootDetails.z * TREE_SCALE) - glm::vec3(HALF_TREE_SCALE),
36763701 rootDetails.s * TREE_SCALE);
3677− if (_viewFrustum.cubeIntersectsKeyhole(serverBounds)) {
3702+ if (viewFrustumCopy.cubeIntersectsKeyhole(serverBounds)) {
36783703 inViewServers++;
36793704 }
36803705 }
@@ -3740,7 +3765,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node · 59 unmodified lines
37403765 rootDetails.s * TREE_SCALE);
37413766
37423767
3743− inView = _viewFrustum.cubeIntersectsKeyhole(serverBounds);
3768+ inView = viewFrustumCopy.cubeIntersectsKeyhole(serverBounds);
37443769 } else {
37453770 if (wantExtraDebugging) {
37463771 qCDebug(interfaceapp) << "Jurisdiction without RootCode for node " << *node << ". That's unusual!";
@@ -3835,6 +3860,7 @@ QRect Application::getDesirableApplicationGeometry() const { · 88 unmodified lines
38353860 // or the "myCamera".
38363861 //
38373862 void Application::loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum) {
3863+ PerformanceTimer perfTimer("loadViewFrustum");
38383864 PROFILE_RANGE(__FUNCTION__);
38393865 // We will use these below, from either the camera or head vectors calculated above
38403866 viewFrustum.setProjection(camera.getProjection());
@@ -3863,7 +3889,8 @@ PickRay Application::computePickRay(float x, float y) const { · 22 unmodified lines
38633889 getApplicationCompositor().computeHmdPickRay(pickPoint, result.origin, result.direction);
38643890 } else {
38653891 pickPoint /= getCanvasSize();
3866− getViewFrustum().computePickRay(pickPoint.x, pickPoint.y, result.origin, result.direction);
3892+ QMutexLocker viewLocker(&_viewMutex);
3893+ _viewFrustum.computePickRay(pickPoint.x, pickPoint.y, result.origin, result.direction);
38673894 }
38683895 return result;
38693896 }
@@ -3876,24 +3903,19 @@ glm::vec3 Application::getAvatarPosition() const { · 6 unmodified lines
38763903 return getMyAvatar()->getPosition();
38773904 }
38783905
3879−const ViewFrustum& Application::getViewFrustum() const {
3880−#ifdef DEBUG
3881− if (QThread::currentThread() == activeRenderingThread) {
3882− // FIXME, figure out a better way to do this
3883− //qWarning() << "Calling Application::getViewFrustum() from the active rendering thread, did you mean Application::getDisplayViewFrustum()?";
3884− }
3885−#endif
3886− return _viewFrustum;
3906+void Application::copyViewFrustum(ViewFrustum& viewOut) const {
3907+ QMutexLocker viewLocker(&_viewMutex);
3908+ viewOut = _viewFrustum;
38873909 }
38883910
3889−const ViewFrustum& Application::getDisplayViewFrustum() const {
3890−#ifdef DEBUG
3891− if (QThread::currentThread() != activeRenderingThread) {
3892− // FIXME, figure out a better way to do this
3893− // qWarning() << "Calling Application::getDisplayViewFrustum() from outside the active rendering thread or outside rendering, did you mean Application::getViewFrustum()?";
3894− }
3895−#endif
3896− return _displayViewFrustum;
3911+void Application::copyDisplayViewFrustum(ViewFrustum& viewOut) const {
3912+ QMutexLocker viewLocker(&_viewMutex);
3913+ viewOut = _displayViewFrustum;
3914+}
3915+
3916+void Application::copyShadowViewFrustum(ViewFrustum& viewOut) const {
3917+ QMutexLocker viewLocker(&_viewMutex);
3918+ viewOut = _shadowViewFrustum;
38973919 }
38983920
38993921 // WorldBox Render Data & rendering functions
@@ -4002,7 +4024,10 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se · 102 unmodified lines
40024024 PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::displaySide()");
40034025
40044026 // load the view frustum
4005− loadViewFrustum(theCamera, _displayViewFrustum);
4027+ {
4028+ QMutexLocker viewLocker(&_viewMutex);
4029+ loadViewFrustum(theCamera, _displayViewFrustum);
4030+ }
40064031
40074032 // TODO fix shadows and make them use the GPU library
40084033
@@ -4070,7 +4095,10 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se · 61 unmodified lines
40704095 {
40714096 PerformanceTimer perfTimer("EngineRun");
40724097
4073− renderArgs->setViewFrustum(getDisplayViewFrustum());
4098+ {
4099+ QMutexLocker viewLocker(&_viewMutex);
4100+ renderArgs->setViewFrustum(_displayViewFrustum);
4101+ }
40744102 _renderEngine->getRenderContext()->args = renderArgs;
40754103
40764104 // Before the deferred pass, let's try to use the render engine
@@ -4496,6 +4524,11 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri · 419 unmodified lines
44964524 scriptEngine->registerGlobalObject("Reticle", getApplicationCompositor().getReticleInterface());
44974525 }
44984526
4527+void Application::copyCurrentViewFrustum(ViewFrustum& viewOut) const {
4528+ QMutexLocker viewLocker(&_viewMutex);
4529+ viewOut = _displayViewFrustum;
4530+}
4531+
44994532 bool Application::canAcceptURL(const QString& urlString) const {
45004533 QUrl url(urlString);
45014534 if (urlString.startsWith(HIFI_URL_SCHEME)) {
@@ -5200,10 +5233,10 @@ void Application::updateInputModes() { · 698 unmodified lines
52005233 }
52015234
52025235 mat4 Application::getEyeProjection(int eye) const {
5236+ QMutexLocker viewLocker(&_viewMutex);
52035237 if (isHMDMode()) {
52045238 return getActiveDisplayPlugin()->getEyeProjection((Eye)eye, _viewFrustum.getProjection());
52055239 }
5206−
52075240 return _viewFrustum.getProjection();
52085241 }
52095242