Showing the changes to interface/src/Application.cpp (1 of 80 files). Show all
Unified · Split
| @@ -58,6 +58,8 @@ · 57 unmodified lines | ||
| 58 | 58 | #include <AutoUpdater.h> |
| 59 | 59 | #include <DeferredLightingEffect.h> |
| 60 | 60 | #include <DependencyManager.h> |
| 61 | +#include <plugins/PluginContainer.h> | |
| 62 | +#include <plugins/PluginManager.h> | |
| 61 | 63 | #include <display-plugins/DisplayPlugin.h> |
| 62 | 64 | |
| 63 | 65 | #include <EntityScriptingInterface.h> |
| @@ -148,6 +150,8 @@ · 84 unmodified lines | ||
| 148 | 150 | |
| 149 | 151 | #include "ui/overlays/Cube3DOverlay.h" |
| 150 | 152 | |
| 153 | +#include "PluginContainerProxy.h" | |
| 154 | + | |
| 151 | 155 | // ON WIndows PC, NVidia Optimus laptop, we want to enable NVIDIA GPU |
| 152 | 156 | // FIXME seems to be broken. |
| 153 | 157 | #if defined(Q_OS_WIN) |
| @@ -301,7 +305,7 @@ bool setupEssentials(int& argc, char** argv) { · 147 unmodified lines | ||
| 301 | 305 | // continuing to overburden Application.cpp |
| 302 | 306 | Cube3DOverlay* _keyboardFocusHighlight{ nullptr }; |
| 303 | 307 | int _keyboardFocusHighlightID{ -1 }; |
| 304 | − | |
| 308 | +PluginContainer* _pluginContainer; | |
| 305 | 309 | |
| 306 | 310 | Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : |
| 307 | 311 | QApplication(argc, argv), |
| @@ -351,7 +355,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : · 43 unmodified lines | ||
| 351 | 355 | _applicationOverlay() |
| 352 | 356 | { |
| 353 | 357 | setInstance(this); |
| 354 | − Plugin::setContainer(this); | |
| 358 | + | |
| 359 | + _pluginContainer = new PluginContainerProxy(); | |
| 360 | + Plugin::setContainer(_pluginContainer); | |
| 355 | 361 | #ifdef Q_OS_WIN |
| 356 | 362 | installNativeEventFilter(&MyNativeEventFilter::getInstance()); |
| 357 | 363 | #endif |
| @@ -995,6 +1001,8 @@ void Application::paintGL() { · 637 unmodified lines | ||
| 995 | 1001 | auto displayPlugin = getActiveDisplayPlugin(); |
| 996 | 1002 | displayPlugin->preRender(); |
| 997 | 1003 | _offscreenContext->makeCurrent(); |
| 1004 | + // update the avatar with a fresh HMD pose | |
| 1005 | + _myAvatar->updateFromHMDSensorMatrix(getHMDSensorPose()); | |
| 998 | 1006 | |
| 999 | 1007 | auto lodManager = DependencyManager::get<LODManager>(); |
| 1000 | 1008 | |
| @@ -1091,7 +1099,6 @@ void Application::paintGL() { · 90 unmodified lines | ||
| 1091 | 1099 | glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror); |
| 1092 | 1100 | renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; |
| 1093 | 1101 | } |
| 1094 | − | |
| 1095 | 1102 | // Update camera position |
| 1096 | 1103 | if (!isHMDMode()) { |
| 1097 | 1104 | _myCamera.update(1.0f / _fps); |
| @@ -1100,64 +1107,46 @@ void Application::paintGL() { · 2 unmodified lines | ||
| 1100 | 1107 | |
| 1101 | 1108 | // Primary rendering pass |
| 1102 | 1109 | auto framebufferCache = DependencyManager::get<FramebufferCache>(); |
| 1103 | − QSize size = framebufferCache->getFrameBufferSize(); | |
| 1110 | + const QSize size = framebufferCache->getFrameBufferSize(); | |
| 1104 | 1111 | { |
| 1105 | 1112 | PROFILE_RANGE(__FUNCTION__ "/mainRender"); |
| 1106 | 1113 | // Viewport is assigned to the size of the framebuffer |
| 1107 | − QSize size = DependencyManager::get<FramebufferCache>()->getFrameBufferSize(); | |
| 1108 | − renderArgs._viewport = glm::ivec4(0, 0, size.width(), size.height()); | |
| 1109 | − | |
| 1110 | − { | |
| 1111 | − PROFILE_RANGE(__FUNCTION__ "/clear"); | |
| 1112 | − doInBatch(&renderArgs, [&](gpu::Batch& batch) { | |
| 1113 | − auto primaryFbo = DependencyManager::get<FramebufferCache>()->getPrimaryFramebuffer(); | |
| 1114 | − batch.setFramebuffer(primaryFbo); | |
| 1115 | − // clear the normal and specular buffers | |
| 1116 | − batch.clearFramebuffer( | |
| 1117 | − gpu::Framebuffer::BUFFER_COLOR0 | | |
| 1118 | − gpu::Framebuffer::BUFFER_COLOR1 | | |
| 1119 | − gpu::Framebuffer::BUFFER_COLOR2 | | |
| 1120 | − gpu::Framebuffer::BUFFER_DEPTH, | |
| 1121 | − vec4(vec3(0), 1), 1.0, 0.0); | |
| 1122 | − }); | |
| 1123 | − } | |
| 1124 | − | |
| 1114 | + renderArgs._viewport = ivec4(0, 0, size.width(), size.height()); | |
| 1125 | 1115 | if (displayPlugin->isStereo()) { |
| 1126 | − PROFILE_RANGE(__FUNCTION__ "/stereoRender"); | |
| 1127 | − QRect currentViewport(QPoint(0, 0), QSize(size.width() / 2, size.height())); | |
| 1128 | − glEnable(GL_SCISSOR_TEST); | |
| 1129 | − for_each_eye([&](Eye eye){ | |
| 1130 | − // Load the view frustum, used by meshes | |
| 1131 | − Camera eyeCamera; | |
| 1132 | − if (qApp->isHMDMode()) { | |
| 1133 | − // Allow the displayPlugin to compose the final eye transform, based on the most up-to-date head motion. | |
| 1134 | − eyeCamera.setTransform(displayPlugin->getModelview(eye, _myAvatar->getSensorToWorldMatrix())); | |
| 1135 | − } else { | |
| 1136 | − eyeCamera.setTransform(displayPlugin->getModelview(eye, _myCamera.getTransform())); | |
| 1137 | − } | |
| 1138 | − eyeCamera.setProjection(displayPlugin->getProjection(eye, _myCamera.getProjection())); | |
| 1139 | − renderArgs._viewport = toGlm(currentViewport); | |
| 1140 | − doInBatch(&renderArgs, [&](gpu::Batch& batch) { | |
| 1141 | − batch.setViewportTransform(renderArgs._viewport); | |
| 1142 | − batch.setStateScissorRect(renderArgs._viewport); | |
| 1143 | − }); | |
| 1144 | − displaySide(&renderArgs, eyeCamera); | |
| 1145 | − }, [&] { | |
| 1146 | − currentViewport.moveLeft(currentViewport.width()); | |
| 1147 | − }); | |
| 1148 | − glDisable(GL_SCISSOR_TEST); | |
| 1149 | − } else { | |
| 1150 | − PROFILE_RANGE(__FUNCTION__ "/monoRender"); | |
| 1151 | − renderArgs._viewport = gpu::Vec4i(0, 0, size.width(), size.height()); | |
| 1152 | − // Viewport is assigned to the size of the framebuffer | |
| 1153 | − doInBatch(&renderArgs, [&](gpu::Batch& batch) { | |
| 1154 | − batch.setViewportTransform(renderArgs._viewport); | |
| 1155 | − batch.setStateScissorRect(renderArgs._viewport); | |
| 1116 | + // Stereo modes will typically have a larger projection matrix overall, | |
| 1117 | + // so we ask for the 'mono' projection matrix, which for stereo and HMD | |
| 1118 | + // plugins will imply the combined projection for both eyes. | |
| 1119 | + // | |
| 1120 | + // This is properly implemented for the Oculus plugins, but for OpenVR | |
| 1121 | + // and Stereo displays I'm not sure how to get / calculate it, so we're | |
| 1122 | + // just relying on the left FOV in each case and hoping that the | |
| 1123 | + // overall culling margin of error doesn't cause popping in the | |
| 1124 | + // right eye. There are FIXMEs in the relevant plugins | |
| 1125 | + _myCamera.setProjection(displayPlugin->getProjection(Mono, _myCamera.getProjection())); | |
| 1126 | + renderArgs._context->enableStereo(true); | |
| 1127 | + mat4 eyeViews[2]; | |
| 1128 | + mat4 eyeProjections[2]; | |
| 1129 | + auto baseProjection = renderArgs._viewFrustum->getProjection(); | |
| 1130 | + // FIXME we probably don't need to set the projection matrix every frame, | |
| 1131 | + // only when the display plugin changes (or in non-HMD modes when the user | |
| 1132 | + // changes the FOV manually, which right now I don't think they can. | |
| 1133 | + for_each_eye([&](Eye eye) { | |
| 1134 | + // For providing the stereo eye views, the HMD head pose has already been | |
| 1135 | + // applied to the avatar, so we need to get the difference between the head | |
| 1136 | + // pose applied to the avatar and the per eye pose, and use THAT as | |
| 1137 | + // the per-eye stereo matrix adjustment. | |
| 1138 | + mat4 eyePose = displayPlugin->getEyePose(eye); | |
| 1139 | + mat4 headPose = displayPlugin->getHeadPose(); | |
| 1140 | + mat4 eyeView = glm::inverse(eyePose) * headPose; | |
| 1141 | + eyeViews[eye] = eyeView; | |
| 1142 | + eyeProjections[eye] = displayPlugin->getProjection(eye, baseProjection); | |
| 1156 | 1143 | }); |
| 1157 | − displaySide(&renderArgs, _myCamera); | |
| 1144 | + renderArgs._context->setStereoProjections(eyeProjections); | |
| 1145 | + renderArgs._context->setStereoViews(eyeViews); | |
| 1158 | 1146 | } |
| 1159 | − | |
| 1160 | − doInBatch(&renderArgs, [](gpu::Batch& batch){ | |
| 1147 | + displaySide(&renderArgs, _myCamera); | |
| 1148 | + renderArgs._context->enableStereo(false); | |
| 1149 | + doInBatch(&renderArgs, [](gpu::Batch& batch) { | |
| 1161 | 1150 | batch.setFramebuffer(nullptr); |
| 1162 | 1151 | }); |
| 1163 | 1152 | } |
| @@ -1191,7 +1180,6 @@ void Application::paintGL() { · 27 unmodified lines | ||
| 1191 | 1180 | PROFILE_RANGE(__FUNCTION__ "/pluginOutput"); |
| 1192 | 1181 | auto primaryFbo = framebufferCache->getPrimaryFramebuffer(); |
| 1193 | 1182 | GLuint finalTexture = gpu::GLBackend::getTextureID(primaryFbo->getRenderBuffer(0)); |
| 1194 | − uvec2 finalSize = toGlm(size); | |
| 1195 | 1183 | // Ensure the rendering context commands are completed when rendering |
| 1196 | 1184 | GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); |
| 1197 | 1185 | // Ensure the sync object is flushed to the driver thread before releasing the context |
| @@ -1207,7 +1195,7 @@ void Application::paintGL() { · 9 unmodified lines | ||
| 1207 | 1195 | |
| 1208 | 1196 | { |
| 1209 | 1197 | PROFILE_RANGE(__FUNCTION__ "/pluginDisplay"); |
| 1210 | − displayPlugin->display(finalTexture, finalSize); | |
| 1198 | + displayPlugin->display(finalTexture, toGlm(size)); | |
| 1211 | 1199 | } |
| 1212 | 1200 | |
| 1213 | 1201 | { |
| @@ -1280,6 +1268,7 @@ void Application::resizeGL() { · 66 unmodified lines | ||
| 1280 | 1268 | // Possible change in aspect ratio |
| 1281 | 1269 | loadViewFrustum(_myCamera, _viewFrustum); |
| 1282 | 1270 | float fov = glm::radians(DEFAULT_FIELD_OF_VIEW_DEGREES); |
| 1271 | + // FIXME the aspect ratio for stereo displays is incorrect based on this. | |
| 1283 | 1272 | float aspectRatio = aspect(_renderResolution); |
| 1284 | 1273 | _myCamera.setProjection(glm::perspective(fov, aspectRatio, DEFAULT_NEAR_CLIP, DEFAULT_FAR_CLIP)); |
| 1285 | 1274 | } |
| @@ -1439,7 +1428,15 @@ void Application::keyPressEvent(QKeyEvent* event) { · 153 unmodified lines | ||
| 1439 | 1428 | break; |
| 1440 | 1429 | case Qt::Key_Enter: |
| 1441 | 1430 | case Qt::Key_Return: |
| 1442 | − Menu::getInstance()->triggerOption(MenuOption::AddressBar); | |
| 1431 | + if (isOption) { | |
| 1432 | + if (_window->isFullScreen()) { | |
| 1433 | + _pluginContainer->unsetFullscreen(); | |
| 1434 | + } else { | |
| 1435 | + _pluginContainer->setFullscreen(nullptr); | |
| 1436 | + } | |
| 1437 | + } else { | |
| 1438 | + Menu::getInstance()->triggerOption(MenuOption::AddressBar); | |
| 1439 | + } | |
| 1443 | 1440 | break; |
| 1444 | 1441 | |
| 1445 | 1442 | case Qt::Key_B: |
| @@ -2705,9 +2702,6 @@ void Application::update(float deltaTime) { · 1259 unmodified lines | ||
| 2705 | 2702 | updateLOD(); |
| 2706 | 2703 | updateMouseRay(); // check what's under the mouse and update the mouse voxel |
| 2707 | 2704 | |
| 2708 | − // update the avatar with a fresh HMD pose | |
| 2709 | − _myAvatar->updateFromHMDSensorMatrix(getHMDSensorPose()); | |
| 2710 | − | |
| 2711 | 2705 | { |
| 2712 | 2706 | PerformanceTimer perfTimer("devices"); |
| 2713 | 2707 | DeviceTracker::updateAll(); |
| @@ -4638,10 +4632,6 @@ void Application::checkSkeleton() { · 1924 unmodified lines | ||
| 4638 | 4632 | } |
| 4639 | 4633 | } |
| 4640 | 4634 | |
| 4641 | −bool Application::isForeground() { | |
| 4642 | − return _isForeground && !getWindow()->isMinimized(); | |
| 4643 | −} | |
| 4644 | − | |
| 4645 | 4635 | void Application::activeChanged(Qt::ApplicationState state) { |
| 4646 | 4636 | switch (state) { |
| 4647 | 4637 | case Qt::ApplicationActive: |
| @@ -4747,6 +4737,10 @@ const DisplayPlugin * Application::getActiveDisplayPlugin() const { · 99 unmodified lines | ||
| 4747 | 4737 | return ((Application*)this)->getActiveDisplayPlugin(); |
| 4748 | 4738 | } |
| 4749 | 4739 | |
| 4740 | +bool _activatingDisplayPlugin{ false }; | |
| 4741 | +QVector<QPair<QString, QString>> _currentDisplayPluginActions; | |
| 4742 | +QVector<QPair<QString, QString>> _currentInputPluginActions; | |
| 4743 | + | |
| 4750 | 4744 | |
| 4751 | 4745 | static void addDisplayPluginToMenu(DisplayPluginPointer displayPlugin, bool active = false) { |
| 4752 | 4746 | auto menu = Menu::getInstance(); |
| @@ -4768,9 +4762,6 @@ static void addDisplayPluginToMenu(DisplayPluginPointer displayPlugin, bool acti · 15 unmodified lines | ||
| 4768 | 4762 | Q_ASSERT(menu->menuItemExists(MenuOption::OutputMenu, name)); |
| 4769 | 4763 | } |
| 4770 | 4764 | |
| 4771 | −static QVector<QPair<QString, QString>> _currentDisplayPluginActions; | |
| 4772 | −static bool _activatingDisplayPlugin{false}; | |
| 4773 | − | |
| 4774 | 4765 | void Application::updateDisplayMode() { |
| 4775 | 4766 | auto menu = Menu::getInstance(); |
| 4776 | 4767 | auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins(); |
| @@ -4837,7 +4828,7 @@ void Application::updateDisplayMode() { · 60 unmodified lines | ||
| 4837 | 4828 | // Only show the hmd tools after the correct plugin has |
| 4838 | 4829 | // been activated so that it's UI is setup correctly |
| 4839 | 4830 | if (newPluginWantsHMDTools) { |
| 4840 | − showDisplayPluginsTools(); | |
| 4831 | + _pluginContainer->showDisplayPluginsTools(); | |
| 4841 | 4832 | } |
| 4842 | 4833 | |
| 4843 | 4834 | if (oldDisplayPlugin) { |
| @@ -4855,9 +4846,6 @@ void Application::updateDisplayMode() { · 11 unmodified lines | ||
| 4855 | 4846 | Q_ASSERT_X(_displayPlugin, "Application::updateDisplayMode", "could not find an activated display plugin"); |
| 4856 | 4847 | } |
| 4857 | 4848 | |
| 4858 | −static QVector<QPair<QString, QString>> _currentInputPluginActions; | |
| 4859 | − | |
| 4860 | − | |
| 4861 | 4849 | static void addInputPluginToMenu(InputPluginPointer inputPlugin, bool active = false) { |
| 4862 | 4850 | auto menu = Menu::getInstance(); |
| 4863 | 4851 | QString name = inputPlugin->getName(); |
| @@ -4931,42 +4919,6 @@ void Application::updateInputModes() { · 67 unmodified lines | ||
| 4931 | 4919 | //} |
| 4932 | 4920 | } |
| 4933 | 4921 | |
| 4934 | −void Application::addMenu(const QString& menuName) { | |
| 4935 | − Menu::getInstance()->addMenu(menuName); | |
| 4936 | −} | |
| 4937 | − | |
| 4938 | −void Application::removeMenu(const QString& menuName) { | |
| 4939 | − Menu::getInstance()->removeMenu(menuName); | |
| 4940 | −} | |
| 4941 | − | |
| 4942 | −void Application::addMenuItem(const QString& path, const QString& name, std::function<void(bool)> onClicked, bool checkable, bool checked, const QString& groupName) { | |
| 4943 | − auto menu = Menu::getInstance(); | |
| 4944 | − MenuWrapper* parentItem = menu->getMenu(path); | |
| 4945 | − QAction* action = menu->addActionToQMenuAndActionHash(parentItem, name); | |
| 4946 | − connect(action, &QAction::triggered, [=] { | |
| 4947 | − onClicked(action->isChecked()); | |
| 4948 | − }); | |
| 4949 | − action->setCheckable(checkable); | |
| 4950 | − action->setChecked(checked); | |
| 4951 | − if (_activatingDisplayPlugin) { | |
| 4952 | − _currentDisplayPluginActions.push_back({ path, name }); | |
| 4953 | − } else { | |
| 4954 | − _currentInputPluginActions.push_back({ path, name }); | |
| 4955 | − } | |
| 4956 | −} | |
| 4957 | − | |
| 4958 | −void Application::removeMenuItem(const QString& menuName, const QString& menuItem) { | |
| 4959 | − Menu::getInstance()->removeMenuItem(menuName, menuItem); | |
| 4960 | −} | |
| 4961 | − | |
| 4962 | −bool Application::isOptionChecked(const QString& name) { | |
| 4963 | − return Menu::getInstance()->isOptionChecked(name); | |
| 4964 | −} | |
| 4965 | − | |
| 4966 | −void Application::setIsOptionChecked(const QString& path, bool checked) { | |
| 4967 | − Menu::getInstance()->setIsOptionChecked(path, checked); | |
| 4968 | −} | |
| 4969 | − | |
| 4970 | 4922 | mat4 Application::getEyeProjection(int eye) const { |
| 4971 | 4923 | if (isHMDMode()) { |
| 4972 | 4924 | return getActiveDisplayPlugin()->getProjection((Eye)eye, _viewFrustum.getProjection()); |
| @@ -4986,7 +4938,7 @@ mat4 Application::getEyePose(int eye) const { · 13 unmodified lines | ||
| 4986 | 4938 | mat4 Application::getEyeOffset(int eye) const { |
| 4987 | 4939 | if (isHMDMode()) { |
| 4988 | 4940 | mat4 identity; |
| 4989 | − return getActiveDisplayPlugin()->getModelview((Eye)eye, identity); | |
| 4941 | + return getActiveDisplayPlugin()->getView((Eye)eye, identity); | |
| 4990 | 4942 | } |
| 4991 | 4943 | |
| 4992 | 4944 | return mat4(); |
| @@ -4999,84 +4951,6 @@ mat4 Application::getHMDSensorPose() const { · 6 unmodified lines | ||
| 4999 | 4951 | return mat4(); |
| 5000 | 4952 | } |
| 5001 | 4953 | |
| 5002 | −void Application::setFullscreen(const QScreen* target) { | |
| 5003 | − if (!_window->isFullScreen()) { | |
| 5004 | − _savedGeometry = _window->geometry(); | |
| 5005 | − } | |
| 5006 | −#ifdef Q_OS_MAC | |
| 5007 | − _window->setGeometry(target->availableGeometry()); | |
| 5008 | −#endif | |
| 5009 | − _window->windowHandle()->setScreen((QScreen*)target); | |
| 5010 | − _window->showFullScreen(); | |
| 5011 | − | |
| 5012 | −#ifndef Q_OS_MAC | |
| 5013 | − // also hide the QMainWindow's menuBar | |
| 5014 | − QMenuBar* menuBar = _window->menuBar(); | |
| 5015 | − if (menuBar) { | |
| 5016 | − menuBar->setVisible(false); | |
| 5017 | − } | |
| 5018 | −#endif | |
| 5019 | −} | |
| 5020 | − | |
| 5021 | −void Application::unsetFullscreen(const QScreen* avoid) { | |
| 5022 | − _window->showNormal(); | |
| 5023 | − | |
| 5024 | − QRect targetGeometry = _savedGeometry; | |
| 5025 | − if (avoid != nullptr) { | |
| 5026 | − QRect avoidGeometry = avoid->geometry(); | |
| 5027 | − if (avoidGeometry.contains(targetGeometry.topLeft())) { | |
| 5028 | − QScreen* newTarget = primaryScreen(); | |
| 5029 | − if (newTarget == avoid) { | |
| 5030 | − foreach(auto screen, screens()) { | |
| 5031 | − if (screen != avoid) { | |
| 5032 | − newTarget = screen; | |
| 5033 | − break; | |
| 5034 | − } | |
| 5035 | − } | |
| 5036 | − } | |
| 5037 | − targetGeometry = newTarget->availableGeometry(); | |
| 5038 | − } | |
| 5039 | − } | |
| 5040 | −#ifdef Q_OS_MAC | |
| 5041 | − QTimer* timer = new QTimer(); | |
| 5042 | − timer->singleShot(2000, [=] { | |
| 5043 | − _window->setGeometry(targetGeometry); | |
| 5044 | − timer->deleteLater(); | |
| 5045 | − }); | |
| 5046 | −#else | |
| 5047 | − _window->setGeometry(targetGeometry); | |
| 5048 | −#endif | |
| 5049 | − | |
| 5050 | −#ifndef Q_OS_MAC | |
| 5051 | − // also show the QMainWindow's menuBar | |
| 5052 | − QMenuBar* menuBar = _window->menuBar(); | |
| 5053 | − if (menuBar) { | |
| 5054 | − menuBar->setVisible(true); | |
| 5055 | − } | |
| 5056 | −#endif | |
| 5057 | −} | |
| 5058 | − | |
| 5059 | − | |
| 5060 | −void Application::showDisplayPluginsTools() { | |
| 5061 | − DependencyManager::get<DialogsManager>()->hmdTools(true); | |
| 5062 | −} | |
| 5063 | − | |
| 5064 | −QGLWidget* Application::getPrimarySurface() { | |
| 5065 | − return _glWidget; | |
| 5066 | −} | |
| 5067 | − | |
| 5068 | −void Application::setActiveDisplayPlugin(const QString& pluginName) { | |
| 5069 | − auto menu = Menu::getInstance(); | |
| 5070 | − foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) { | |
| 5071 | − QString name = displayPlugin->getName(); | |
| 5072 | − QAction* action = menu->getActionForOption(name); | |
| 5073 | − if (pluginName == name) { | |
| 5074 | − action->setChecked(true); | |
| 5075 | − } | |
| 5076 | − } | |
| 5077 | − updateDisplayMode(); | |
| 5078 | −} | |
| 5079 | − | |
| 5080 | 4954 | void Application::setPalmData(Hand* hand, UserInputMapper::PoseValue pose, float deltaTime, int index) { |
| 5081 | 4955 | PalmData* palm; |
| 5082 | 4956 | bool foundHand = false; |