History

Merge pull request #7827 from AndrewMeadows/threadsafe-viewfrustum

resurrection of threadsafe ViewFrustum

Brad Hefta-Gaub committed 10 years ago

Commit d7eee982 parents 466b535 db9a4d651 files · +622 −552Browse files

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

Unified · Split

interface/src/Application.cpp+66−61
@@ -1481,10 +1481,17 @@ void Application::paintGL() { · 1480 unmodified lines
14811481
14821482 auto lodManager = DependencyManager::get<LODManager>();
14831483
1484−
1485− RenderArgs renderArgs(_gpuContext, getEntities(), getViewFrustum(), lodManager->getOctreeSizeScale(),
1484+ {
1485+ QMutexLocker viewLocker(&_viewMutex);
1486+ _viewFrustum.calculate();
1487+ }
1488+ RenderArgs renderArgs(_gpuContext, getEntities(), lodManager->getOctreeSizeScale(),
14861489 lodManager->getBoundaryLevelAdjust(), RenderArgs::DEFAULT_RENDER_MODE,
14871490 RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE);
1491+ {
1492+ QMutexLocker viewLocker(&_viewMutex);
1493+ renderArgs.setViewFrustum(_viewFrustum);
1494+ }
14881495
14891496 PerformanceWarning::setSuppressShortTimings(Menu::getInstance()->isOptionChecked(MenuOption::SuppressShortTimings));
14901497 bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings);
@@ -1651,7 +1658,7 @@ void Application::paintGL() { · 160 unmodified lines
16511658 renderArgs._context->enableStereo(true);
16521659 mat4 eyeOffsets[2];
16531660 mat4 eyeProjections[2];
1654− auto baseProjection = renderArgs._viewFrustum->getProjection();
1661+ auto baseProjection = renderArgs.getViewFrustum().getProjection();
16551662 auto hmdInterface = DependencyManager::get<HMDScriptingInterface>();
16561663 float IPDScale = hmdInterface->getIPDScale();
16571664 mat4 headPose = displayPlugin->getHeadPose();
@@ -1781,7 +1788,10 @@ void Application::resizeGL() { · 123 unmodified lines
17811788 _myCamera.setProjection(glm::perspective(glm::radians(_fieldOfView.get()), aspectRatio,
17821789 DEFAULT_NEAR_CLIP, DEFAULT_FAR_CLIP));
17831790 // Possible change in aspect ratio
1784− loadViewFrustum(_myCamera, _viewFrustum);
1791+ {
1792+ QMutexLocker viewLocker(&_viewMutex);
1793+ loadViewFrustum(_myCamera, _viewFrustum);
1794+ }
17851795
17861796 auto offscreenUi = DependencyManager::get<OffscreenUi>();
17871797 auto uiSize = displayPlugin->getRecommendedUiSize();
@@ -2108,6 +2118,7 @@ void Application::keyPressEvent(QKeyEvent* event) { · 320 unmodified lines
21082118
21092119 case Qt::Key_J:
21102120 if (isShifted) {
2121+ QMutexLocker viewLocker(&_viewMutex);
21112122 _viewFrustum.setFocalLength(_viewFrustum.getFocalLength() - 0.1f);
21122123 } else {
21132124 _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(-0.001, 0, 0));
@@ -2117,6 +2128,7 @@ void Application::keyPressEvent(QKeyEvent* event) { · 3 unmodified lines
21172128
21182129 case Qt::Key_M:
21192130 if (isShifted) {
2131+ QMutexLocker viewLocker(&_viewMutex);
21202132 _viewFrustum.setFocalLength(_viewFrustum.getFocalLength() + 0.1f);
21212133 } else {
21222134 _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0.001, 0, 0));
@@ -2965,7 +2977,10 @@ void Application::init() { · 842 unmodified lines
29652977 DependencyManager::get<NodeList>()->sendDomainServerCheckIn();
29662978
29672979 getEntities()->init();
2968− getEntities()->setViewFrustum(getViewFrustum());
2980+ {
2981+ QMutexLocker viewLocker(&_viewMutex);
2982+ getEntities()->setViewFrustum(_viewFrustum);
2983+ }
29692984
29702985 ObjectMotionState::setShapeManager(&_shapeManager);
29712986 _physicsEngine->init();
@@ -2985,7 +3000,10 @@ void Application::init() { · 13 unmodified lines
29853000 getEntities()->connectSignalsToSlots(entityScriptingInterface.data());
29863001
29873002 _entityClipboardRenderer.init();
2988− _entityClipboardRenderer.setViewFrustum(getViewFrustum());
3003+ {
3004+ QMutexLocker viewLocker(&_viewMutex);
3005+ _entityClipboardRenderer.setViewFrustum(_viewFrustum);
3006+ }
29893007 _entityClipboardRenderer.setTree(_entityClipboard);
29903008
29913009 // Make sure any new sounds are loaded as soon as know about them.
@@ -3199,9 +3217,12 @@ void Application::resetPhysicsReadyInformation() { · 207 unmodified lines
31993217
32003218 void Application::reloadResourceCaches() {
32013219 resetPhysicsReadyInformation();
3220+ {
3221+ QMutexLocker viewLocker(&_viewMutex);
3222+ _viewFrustum.setPosition(glm::vec3(0.0f, 0.0f, TREE_SCALE));
3223+ _viewFrustum.setOrientation(glm::quat());
3224+ }
32023225 // Clear entities out of view frustum
3203− _viewFrustum.setPosition(glm::vec3(0.0f, 0.0f, TREE_SCALE));
3204− _viewFrustum.setOrientation(glm::quat());
32053226 queryOctree(NodeType::EntityServer, PacketType::EntityQuery, _entityServerJurisdictions);
32063227
32073228 DependencyManager::get<AssetClient>()->clearCache();
@@ -3490,7 +3511,7 @@ void Application::update(float deltaTime) { · 282 unmodified lines
34903511 // actually need to calculate the view frustum planes to send these details
34913512 // to the server.
34923513 {
3493− PerformanceTimer perfTimer("loadViewFrustum");
3514+ QMutexLocker viewLocker(&_viewMutex);
34943515 loadViewFrustum(_myCamera, _viewFrustum);
34953516 }
34963517
@@ -3499,6 +3520,7 @@ void Application::update(float deltaTime) { · 2 unmodified lines
34993520 // Update my voxel servers with my current voxel query...
35003521 {
35013522 PROFILE_RANGE_EX("QueryOctree", 0xffff0000, (uint64_t)getActiveDisplayPlugin()->presentCount());
3523+ QMutexLocker viewLocker(&_viewMutex);
35023524 PerformanceTimer perfTimer("queryOctree");
35033525 quint64 sinceLastQuery = now - _lastQueriedTime;
35043526 const quint64 TOO_LONG_SINCE_LAST_QUERY = 3 * USECS_PER_SECOND;
@@ -3610,14 +3632,16 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node · 105 unmodified lines
36103632 //qCDebug(interfaceapp) << ">>> inside... queryOctree()... _viewFrustum.getFieldOfView()=" << _viewFrustum.getFieldOfView();
36113633 bool wantExtraDebugging = getLogger()->extraDebugging();
36123634
3613− _octreeQuery.setCameraPosition(_viewFrustum.getPosition());
3614− _octreeQuery.setCameraOrientation(_viewFrustum.getOrientation());
3615− _octreeQuery.setCameraFov(_viewFrustum.getFieldOfView());
3616− _octreeQuery.setCameraAspectRatio(_viewFrustum.getAspectRatio());
3617− _octreeQuery.setCameraNearClip(_viewFrustum.getNearClip());
3618− _octreeQuery.setCameraFarClip(_viewFrustum.getFarClip());
3635+ ViewFrustum viewFrustum;
3636+ copyViewFrustum(viewFrustum);
3637+ _octreeQuery.setCameraPosition(viewFrustum.getPosition());
3638+ _octreeQuery.setCameraOrientation(viewFrustum.getOrientation());
3639+ _octreeQuery.setCameraFov(viewFrustum.getFieldOfView());
3640+ _octreeQuery.setCameraAspectRatio(viewFrustum.getAspectRatio());
3641+ _octreeQuery.setCameraNearClip(viewFrustum.getNearClip());
3642+ _octreeQuery.setCameraFarClip(viewFrustum.getFarClip());
36193643 _octreeQuery.setCameraEyeOffsetPosition(glm::vec3());
3620− _octreeQuery.setCameraCenterRadius(_viewFrustum.getCenterRadius());
3644+ _octreeQuery.setCameraCenterRadius(viewFrustum.getCenterRadius());
36213645 auto lodManager = DependencyManager::get<LODManager>();
36223646 _octreeQuery.setOctreeSizeScale(lodManager->getOctreeSizeScale());
36233647 _octreeQuery.setBoundaryLevelAdjust(lodManager->getBoundaryLevelAdjust());
@@ -3653,7 +3677,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node · 29 unmodified lines
36533677 rootDetails.y * TREE_SCALE,
36543678 rootDetails.z * TREE_SCALE) - glm::vec3(HALF_TREE_SCALE),
36553679 rootDetails.s * TREE_SCALE);
3656− if (_viewFrustum.cubeIntersectsKeyhole(serverBounds)) {
3680+ if (viewFrustum.cubeIntersectsKeyhole(serverBounds)) {
36573681 inViewServers++;
36583682 }
36593683 }
@@ -3719,11 +3743,9 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node · 59 unmodified lines
37193743 rootDetails.s * TREE_SCALE);
37203744
37213745
3722− inView = _viewFrustum.cubeIntersectsKeyhole(serverBounds);
3723− } else {
3724− if (wantExtraDebugging) {
3725− qCDebug(interfaceapp) << "Jurisdiction without RootCode for node " << *node << ". That's unusual!";
3726− }
3746+ inView = viewFrustum.cubeIntersectsKeyhole(serverBounds);
3747+ } else if (wantExtraDebugging) {
3748+ qCDebug(interfaceapp) << "Jurisdiction without RootCode for node " << *node << ". That's unusual!";
37273749 }
37283750 }
37293751
@@ -3814,6 +3836,7 @@ QRect Application::getDesirableApplicationGeometry() const { · 84 unmodified lines
38143836 // or the "myCamera".
38153837 //
38163838 void Application::loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum) {
3839+ PerformanceTimer perfTimer("loadViewFrustum");
38173840 PROFILE_RANGE(__FUNCTION__);
38183841 // We will use these below, from either the camera or head vectors calculated above
38193842 viewFrustum.setProjection(camera.getProjection());
@@ -3842,7 +3865,8 @@ PickRay Application::computePickRay(float x, float y) const { · 22 unmodified lines
38423865 getApplicationCompositor().computeHmdPickRay(pickPoint, result.origin, result.direction);
38433866 } else {
38443867 pickPoint /= getCanvasSize();
3845− getViewFrustum()->computePickRay(pickPoint.x, pickPoint.y, result.origin, result.direction);
3868+ QMutexLocker viewLocker(&_viewMutex);
3869+ _viewFrustum.computePickRay(pickPoint.x, pickPoint.y, result.origin, result.direction);
38463870 }
38473871 return result;
38483872 }
@@ -3855,44 +3879,19 @@ glm::vec3 Application::getAvatarPosition() const { · 6 unmodified lines
38553879 return getMyAvatar()->getPosition();
38563880 }
38573881
3858−ViewFrustum* Application::getViewFrustum() {
3859−#ifdef DEBUG
3860− if (QThread::currentThread() == activeRenderingThread) {
3861− // FIXME, figure out a better way to do this
3862− //qWarning() << "Calling Application::getViewFrustum() from the active rendering thread, did you mean Application::getDisplayViewFrustum()?";
3863− }
3864−#endif
3865− return &_viewFrustum;
3866−}
3867−
3868−const ViewFrustum* Application::getViewFrustum() const {
3869−#ifdef DEBUG
3870− if (QThread::currentThread() == activeRenderingThread) {
3871− // FIXME, figure out a better way to do this
3872− //qWarning() << "Calling Application::getViewFrustum() from the active rendering thread, did you mean Application::getDisplayViewFrustum()?";
3873− }
3874−#endif
3875− return &_viewFrustum;
3882+void Application::copyViewFrustum(ViewFrustum& viewOut) const {
3883+ QMutexLocker viewLocker(&_viewMutex);
3884+ viewOut = _viewFrustum;
38763885 }
38773886
3878−ViewFrustum* Application::getDisplayViewFrustum() {
3879−#ifdef DEBUG
3880− if (QThread::currentThread() != activeRenderingThread) {
3881− // FIXME, figure out a better way to do this
3882− // qWarning() << "Calling Application::getDisplayViewFrustum() from outside the active rendering thread or outside rendering, did you mean Application::getViewFrustum()?";
3883− }
3884−#endif
3885− return &_displayViewFrustum;
3887+void Application::copyDisplayViewFrustum(ViewFrustum& viewOut) const {
3888+ QMutexLocker viewLocker(&_viewMutex);
3889+ viewOut = _displayViewFrustum;
38863890 }
38873891
3888−const ViewFrustum* Application::getDisplayViewFrustum() const {
3889−#ifdef DEBUG
3890− if (QThread::currentThread() != activeRenderingThread) {
3891− // FIXME, figure out a better way to do this
3892− // qWarning() << "Calling Application::getDisplayViewFrustum() from outside the active rendering thread or outside rendering, did you mean Application::getViewFrustum()?";
3893− }
3894−#endif
3895− return &_displayViewFrustum;
3892+void Application::copyShadowViewFrustum(ViewFrustum& viewOut) const {
3893+ QMutexLocker viewLocker(&_viewMutex);
3894+ viewOut = _shadowViewFrustum;
38963895 }
38973896
38983897 // WorldBox Render Data & rendering functions
@@ -3957,7 +3956,7 @@ namespace render { · 58 unmodified lines
39573956 auto skybox = skyStage->getSkybox();
39583957 if (skybox) {
39593958 PerformanceTimer perfTimer("skybox");
3960− skybox->render(batch, *(args->_viewFrustum));
3959+ skybox->render(batch, args->getViewFrustum());
39613960 break;
39623961 }
39633962 }
@@ -4001,7 +4000,10 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se · 37 unmodified lines
40014000 PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::displaySide()");
40024001
40034002 // load the view frustum
4004− loadViewFrustum(theCamera, _displayViewFrustum);
4003+ {
4004+ QMutexLocker viewLocker(&_viewMutex);
4005+ loadViewFrustum(theCamera, _displayViewFrustum);
4006+ }
40054007
40064008 // TODO fix shadows and make them use the GPU library
40074009
@@ -4069,7 +4071,10 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se · 61 unmodified lines
40694071 {
40704072 PerformanceTimer perfTimer("EngineRun");
40714073
4072− renderArgs->_viewFrustum = getDisplayViewFrustum();
4074+ {
4075+ QMutexLocker viewLocker(&_viewMutex);
4076+ renderArgs->setViewFrustum(_displayViewFrustum);
4077+ }
40734078 _renderEngine->getRenderContext()->args = renderArgs;
40744079
40754080 // Before the deferred pass, let's try to use the render engine
@@ -5199,10 +5204,10 @@ void Application::updateInputModes() { · 1123 unmodified lines
51995204 }
52005205
52015206 mat4 Application::getEyeProjection(int eye) const {
5207+ QMutexLocker viewLocker(&_viewMutex);
52025208 if (isHMDMode()) {
52035209 return getActiveDisplayPlugin()->getEyeProjection((Eye)eye, _viewFrustum.getProjection());
52045210 }
5205−
52065211 return _viewFrustum.getProjection();
52075212 }
52085213