1129 lines · 48.3 KB · C++
RawDownload
////  Menu.cpp//  hifi////  Created by Stephen Birarda on 8/12/13.//  Copyright (c) 2013 HighFidelity, Inc. All rights reserved.// #include <cstdlib>  #include <QBoxLayout>#include <QColorDialog>#include <QDialogButtonBox>#include <QDoubleSpinBox>#include <QFileDialog>#include <QFormLayout>#include <QInputDialog>#include <QLineEdit>#include <QMainWindow>#include <QMenuBar>#include <QSlider>#include <QStandardPaths>#include <QUuid>#include <QWindow> #include <UUID.h> #include "Application.h"#include "DataServerClient.h"#include "PairingHandler.h"#include "Menu.h"#include "Util.h"#include "InfoView.h" Menu* Menu::_instance = NULL; Menu* Menu::getInstance() {    static QMutex menuInstanceMutex;     // lock the menu instance mutex to make sure we don't race and create two menus and crash    menuInstanceMutex.lock();     if (!_instance) {        qDebug("First call to Menu::getInstance() - initing menu.");         _instance = new Menu();    }     menuInstanceMutex.unlock();     return _instance;} const ViewFrustumOffset DEFAULT_FRUSTUM_OFFSET = {-135.0f, 0.0f, 0.0f, 25.0f, 0.0f};const float DEFAULT_FACESHIFT_EYE_DEFLECTION = 0.25f; Menu::Menu() :    _actionHash(),    _audioJitterBufferSamples(0),    _bandwidthDialog(NULL),    _fieldOfView(DEFAULT_FIELD_OF_VIEW_DEGREES),    _faceshiftEyeDeflection(DEFAULT_FACESHIFT_EYE_DEFLECTION),    _frustumDrawMode(FRUSTUM_DRAW_MODE_ALL),    _viewFrustumOffset(DEFAULT_FRUSTUM_OFFSET),    _voxelModeActionsGroup(NULL),    _voxelStatsDialog(NULL),    _lodToolsDialog(NULL),    _maxVoxels(DEFAULT_MAX_VOXELS_PER_SYSTEM),    _voxelSizeScale(DEFAULT_OCTREE_SIZE_SCALE),    _boundaryLevelAdjust(0),    _maxVoxelPacketsPerSecond(DEFAULT_MAX_VOXEL_PPS){    Application *appInstance = Application::getInstance();     QMenu* fileMenu = addMenu("File"); #ifdef Q_OS_MAC    addActionToQMenuAndActionHash(fileMenu,                                  MenuOption::AboutApp,                                  0,                                  this,                                  SLOT(aboutApp()),                                  QAction::AboutRole);#endif     (addActionToQMenuAndActionHash(fileMenu,                                   MenuOption::Login,                                   0,                                   this,                                   SLOT(login())));     addDisabledActionAndSeparator(fileMenu, "Scripts");    addActionToQMenuAndActionHash(fileMenu, MenuOption::LoadScript, Qt::CTRL | Qt::Key_O, appInstance, SLOT(loadDialog()));    _activeScriptsMenu = fileMenu->addMenu("Running Scripts");     addDisabledActionAndSeparator(fileMenu, "Voxels");    addActionToQMenuAndActionHash(fileMenu, MenuOption::ExportVoxels, Qt::CTRL | Qt::Key_E, appInstance, SLOT(exportVoxels()));    addActionToQMenuAndActionHash(fileMenu, MenuOption::ImportVoxels, Qt::CTRL | Qt::Key_I, appInstance, SLOT(importVoxels()));     addDisabledActionAndSeparator(fileMenu, "Go");    addActionToQMenuAndActionHash(fileMenu,                                  MenuOption::GoHome,                                  Qt::CTRL | Qt::Key_G,                                  appInstance->getAvatar(),                                  SLOT(goHome()));    addActionToQMenuAndActionHash(fileMenu,                                  MenuOption::GoToDomain,                                  Qt::CTRL | Qt::Key_D,                                   this,                                   SLOT(goToDomain()));    addActionToQMenuAndActionHash(fileMenu,                                  MenuOption::GoToLocation,                                  Qt::CTRL | Qt::SHIFT | Qt::Key_L,                                   this,                                   SLOT(goToLocation()));    addActionToQMenuAndActionHash(fileMenu,                                  MenuOption::GoToUser,                                  Qt::Key_At,                                  this,                                  SLOT(goToUser()));      addDisabledActionAndSeparator(fileMenu, "Settings");    addActionToQMenuAndActionHash(fileMenu, MenuOption::SettingsImport, 0, this, SLOT(importSettings()));    addActionToQMenuAndActionHash(fileMenu, MenuOption::SettingsExport, 0, this, SLOT(exportSettings()));     addDisabledActionAndSeparator(fileMenu, "Devices");    addActionToQMenuAndActionHash(fileMenu, MenuOption::Pair, 0, PairingHandler::getInstance(), SLOT(sendPairRequest()));    addCheckableActionToQMenuAndActionHash(fileMenu, MenuOption::TransmitterDrive, 0, true);     addActionToQMenuAndActionHash(fileMenu,                                  MenuOption::Quit,                                  Qt::CTRL | Qt::Key_Q,                                  appInstance,                                  SLOT(quit()),                                  QAction::QuitRole);      QMenu* editMenu = addMenu("Edit");     addActionToQMenuAndActionHash(editMenu,                                  MenuOption::Preferences,                                  Qt::CTRL | Qt::Key_Comma,                                  this,                                  SLOT(editPreferences()),                                  QAction::PreferencesRole);     addDisabledActionAndSeparator(editMenu, "Voxels");     addActionToQMenuAndActionHash(editMenu, MenuOption::CutVoxels, Qt::CTRL | Qt::Key_X, appInstance, SLOT(cutVoxels()));    addActionToQMenuAndActionHash(editMenu, MenuOption::CopyVoxels, Qt::CTRL | Qt::Key_C, appInstance, SLOT(copyVoxels()));    addActionToQMenuAndActionHash(editMenu, MenuOption::PasteVoxels, Qt::CTRL | Qt::Key_V, appInstance, SLOT(pasteVoxels()));    addActionToQMenuAndActionHash(editMenu, MenuOption::NudgeVoxels, Qt::CTRL | Qt::Key_N, appInstance, SLOT(nudgeVoxels()));     #ifdef __APPLE__        addActionToQMenuAndActionHash(editMenu, MenuOption::DeleteVoxels, Qt::Key_Backspace, appInstance, SLOT(deleteVoxels()));    #else        addActionToQMenuAndActionHash(editMenu, MenuOption::DeleteVoxels, Qt::Key_Delete, appInstance, SLOT(deleteVoxels()));    #endif     addDisabledActionAndSeparator(editMenu, "Physics");    addCheckableActionToQMenuAndActionHash(editMenu, MenuOption::Gravity, Qt::SHIFT | Qt::Key_G, true);    addCheckableActionToQMenuAndActionHash(editMenu,                                           MenuOption::Collisions,                                           0,                                           true,                                           appInstance->getAvatar(),                                           SLOT(setWantCollisionsOn(bool)));        addCheckableActionToQMenuAndActionHash(editMenu, MenuOption::ClickToFly);        QMenu* toolsMenu = addMenu("Tools");     _voxelModeActionsGroup = new QActionGroup(this);    _voxelModeActionsGroup->setExclusive(false);     QAction* addVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelAddMode, Qt::Key_V);    _voxelModeActionsGroup->addAction(addVoxelMode);     QAction* deleteVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelDeleteMode, Qt::Key_R);    _voxelModeActionsGroup->addAction(deleteVoxelMode);     QAction* colorVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelColorMode, Qt::Key_B);    _voxelModeActionsGroup->addAction(colorVoxelMode);     QAction* selectVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelSelectMode, Qt::Key_O);    _voxelModeActionsGroup->addAction(selectVoxelMode);     QAction* getColorMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelGetColorMode, Qt::Key_G);    _voxelModeActionsGroup->addAction(getColorMode);      // connect each of the voxel mode actions to the updateVoxelModeActionsSlot    foreach (QAction* action, _voxelModeActionsGroup->actions()) {        connect(action, SIGNAL(triggered()), this, SLOT(updateVoxelModeActions()));    }     QAction* voxelPaintColor = addActionToQMenuAndActionHash(toolsMenu,                                                             MenuOption::VoxelPaintColor,                                                             Qt::META | Qt::Key_C,                                                             this,                                                             SLOT(chooseVoxelPaintColor()));     Application::getInstance()->getSwatch()->setAction(voxelPaintColor);     QColor paintColor(128, 128, 128);    voxelPaintColor->setData(paintColor);    voxelPaintColor->setIcon(Swatch::createIcon(paintColor));     addActionToQMenuAndActionHash(toolsMenu,                                  MenuOption::DecreaseVoxelSize,                                  QKeySequence::ZoomOut,                                  appInstance,                                  SLOT(decreaseVoxelSize()));    addActionToQMenuAndActionHash(toolsMenu,                                  MenuOption::IncreaseVoxelSize,                                  QKeySequence::ZoomIn,                                  appInstance,                                  SLOT(increaseVoxelSize()));    addActionToQMenuAndActionHash(toolsMenu, MenuOption::ResetSwatchColors, 0, this, SLOT(resetSwatchColors()));      QMenu* viewMenu = addMenu("View");     addCheckableActionToQMenuAndActionHash(viewMenu,                                           MenuOption::Fullscreen,                                           Qt::CTRL | Qt::META | Qt::Key_F,                                           false,                                           appInstance,                                           SLOT(setFullscreen(bool)));    addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FirstPerson, Qt::Key_P, true);    addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Mirror, Qt::SHIFT | Qt::Key_H);    addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FullscreenMirror, Qt::Key_H);    addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Enable3DTVMode, 0,                                           false,                                           appInstance,                                           SLOT(setEnable3DTVMode(bool)));      QMenu* avatarSizeMenu = viewMenu->addMenu("Avatar Size");     addActionToQMenuAndActionHash(avatarSizeMenu,                                  MenuOption::IncreaseAvatarSize,                                  Qt::Key_Plus,                                  appInstance->getAvatar(),                                  SLOT(increaseSize()));    addActionToQMenuAndActionHash(avatarSizeMenu,                                  MenuOption::DecreaseAvatarSize,                                  Qt::Key_Minus,                                  appInstance->getAvatar(),                                  SLOT(decreaseSize()));    addActionToQMenuAndActionHash(avatarSizeMenu,                                  MenuOption::ResetAvatarSize,                                  Qt::Key_Equal,                                  appInstance->getAvatar(),                                  SLOT(resetSize()));     addCheckableActionToQMenuAndActionHash(viewMenu,                                           MenuOption::OffAxisProjection,                                           0,                                           true);    addCheckableActionToQMenuAndActionHash(viewMenu,                                           MenuOption::TurnWithHead,                                           0,                                           true);    addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::MoveWithLean, 0, false);    addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::HeadMouse, 0, false);      addDisabledActionAndSeparator(viewMenu, "Stats");    addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Stats, Qt::Key_Slash);    addActionToQMenuAndActionHash(viewMenu, MenuOption::Log, Qt::CTRL | Qt::Key_L, appInstance, SLOT(toggleLogDialog()));    addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Oscilloscope, 0, true);    addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Bandwidth, 0, true);    addActionToQMenuAndActionHash(viewMenu, MenuOption::BandwidthDetails, 0, this, SLOT(bandwidthDetails()));    addActionToQMenuAndActionHash(viewMenu, MenuOption::VoxelStats, 0, this, SLOT(voxelStatsDetails()));     QMenu* developerMenu = addMenu("Developer");     QMenu* renderOptionsMenu = developerMenu->addMenu("Rendering Options");     addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Stars, Qt::Key_Asterisk, true);    addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Atmosphere, Qt::SHIFT | Qt::Key_A, true);    addActionToQMenuAndActionHash(renderOptionsMenu,                                  MenuOption::GlowMode,                                  0,                                  appInstance->getGlowEffect(),                                  SLOT(cycleRenderMode()));     addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::ParticleCloud, 0, false);    addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Shadows, 0, false);    addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Metavoxels, 0, false);      QMenu* voxelOptionsMenu = developerMenu->addMenu("Voxel Options");     addCheckableActionToQMenuAndActionHash(voxelOptionsMenu,                                           MenuOption::Voxels,                                           Qt::SHIFT | Qt::Key_V,                                           true,                                           appInstance,                                           SLOT(setRenderVoxels(bool)));    addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::DontRenderVoxels);    addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::DontCallOpenGLForVoxels);     _useVoxelShader = addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::UseVoxelShader, 0,                                           false, appInstance->getVoxels(), SLOT(setUseVoxelShader(bool)));     addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::VoxelsAsPoints, 0,                                           false, appInstance->getVoxels(), SLOT(setVoxelsAsPoints(bool)));     addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::VoxelTextures);    addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::AmbientOcclusion);    addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::DontFadeOnVoxelServerChanges);    addActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::LodTools, Qt::SHIFT | Qt::Key_L, this, SLOT(lodTools()));    addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::DisableLocalVoxelCache);     QMenu* voxelProtoOptionsMenu = voxelOptionsMenu->addMenu("Voxel Server Protocol Options");     addCheckableActionToQMenuAndActionHash(voxelProtoOptionsMenu, MenuOption::DisableColorVoxels);    addCheckableActionToQMenuAndActionHash(voxelProtoOptionsMenu, MenuOption::DisableLowRes);    addCheckableActionToQMenuAndActionHash(voxelProtoOptionsMenu, MenuOption::DisableDeltaSending);    addCheckableActionToQMenuAndActionHash(voxelProtoOptionsMenu, MenuOption::EnableVoxelPacketCompression);    addCheckableActionToQMenuAndActionHash(voxelProtoOptionsMenu, MenuOption::EnableOcclusionCulling);    addCheckableActionToQMenuAndActionHash(voxelProtoOptionsMenu, MenuOption::DestructiveAddVoxel);     QMenu* avatarOptionsMenu = developerMenu->addMenu("Avatar Options");     addCheckableActionToQMenuAndActionHash(avatarOptionsMenu, MenuOption::Avatars, 0, true);    addCheckableActionToQMenuAndActionHash(avatarOptionsMenu, MenuOption::CollisionProxies);     addCheckableActionToQMenuAndActionHash(avatarOptionsMenu, MenuOption::LookAtVectors, 0, true);    addCheckableActionToQMenuAndActionHash(avatarOptionsMenu, MenuOption::LookAtIndicator, 0, true);    addCheckableActionToQMenuAndActionHash(avatarOptionsMenu,                                           MenuOption::FaceshiftTCP,                                           0,                                           false,                                           appInstance->getFaceshift(),                                           SLOT(setTCPEnabled(bool)));    addCheckableActionToQMenuAndActionHash(avatarOptionsMenu, MenuOption::ChatCircling, 0, true);     QMenu* handOptionsMenu = developerMenu->addMenu("Hand Options");     addCheckableActionToQMenuAndActionHash(handOptionsMenu,                                           MenuOption::FilterSixense,                                           0,                                           true,                                           appInstance->getSixenseManager(),                                           SLOT(setFilter(bool)));    addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::DisplayLeapHands, 0, true);    addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::DisplayHandTargets, 0, false);    addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::VoxelDrumming, 0, false);    addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::PlaySlaps, 0, false);     addDisabledActionAndSeparator(developerMenu, "Testing");     QMenu* timingMenu = developerMenu->addMenu("Timing and Statistics Tools");    addCheckableActionToQMenuAndActionHash(timingMenu, MenuOption::TestPing, 0, true);    addCheckableActionToQMenuAndActionHash(timingMenu, MenuOption::FrameTimer);    addActionToQMenuAndActionHash(timingMenu, MenuOption::RunTimingTests, 0, this, SLOT(runTests()));    addActionToQMenuAndActionHash(timingMenu,                                  MenuOption::TreeStats,                                  Qt::SHIFT | Qt::Key_S,                                  appInstance->getVoxels(),                                  SLOT(collectStatsForTreesAndVBOs()));     QMenu* frustumMenu = developerMenu->addMenu("View Frustum Debugging Tools");    addCheckableActionToQMenuAndActionHash(frustumMenu, MenuOption::DisplayFrustum, Qt::SHIFT | Qt::Key_F);    addActionToQMenuAndActionHash(frustumMenu,                                  MenuOption::FrustumRenderMode,                                  Qt::SHIFT | Qt::Key_R,                                  this,                                  SLOT(cycleFrustumRenderMode()));    updateFrustumRenderModeAction();      QMenu* renderDebugMenu = developerMenu->addMenu("Render Debugging Tools");    addCheckableActionToQMenuAndActionHash(renderDebugMenu, MenuOption::PipelineWarnings, Qt::CTRL | Qt::SHIFT | Qt::Key_P);    addCheckableActionToQMenuAndActionHash(renderDebugMenu, MenuOption::SuppressShortTimings, Qt::CTRL | Qt::SHIFT | Qt::Key_S);     addCheckableActionToQMenuAndActionHash(renderDebugMenu, MenuOption::AutomaticallyAuditTree);      addActionToQMenuAndActionHash(renderDebugMenu,                                  MenuOption::ShowAllLocalVoxels,                                  Qt::CTRL | Qt::Key_A,                                  appInstance->getVoxels(),                                  SLOT(showAllLocalVoxels()));     addActionToQMenuAndActionHash(renderDebugMenu,                                  MenuOption::KillLocalVoxels,                                  Qt::CTRL | Qt::Key_K,                                  appInstance, SLOT(doKillLocalVoxels()));     addActionToQMenuAndActionHash(renderDebugMenu,                                  MenuOption::RandomizeVoxelColors,                                  Qt::CTRL | Qt::Key_R,                                  appInstance->getVoxels(),                                  SLOT(randomizeVoxelColors()));     addActionToQMenuAndActionHash(renderDebugMenu,                                  MenuOption::FalseColorRandomly,                                  0,                                  appInstance->getVoxels(),                                  SLOT(falseColorizeRandom()));     addActionToQMenuAndActionHash(renderDebugMenu,                                  MenuOption::FalseColorEveryOtherVoxel,                                  0,                                  appInstance->getVoxels(),                                  SLOT(falseColorizeRandomEveryOther()));     addActionToQMenuAndActionHash(renderDebugMenu,                                  MenuOption::FalseColorByDistance,                                  0,                                  appInstance->getVoxels(),                                  SLOT(falseColorizeDistanceFromView()));     addActionToQMenuAndActionHash(renderDebugMenu,                                  MenuOption::FalseColorOutOfView,                                  0,                                  appInstance->getVoxels(),                                  SLOT(falseColorizeInView()));     addActionToQMenuAndActionHash(renderDebugMenu,                                  MenuOption::FalseColorBySource,                                  0,                                  appInstance->getVoxels(),                                  SLOT(falseColorizeBySource()));     addActionToQMenuAndActionHash(renderDebugMenu,                                  MenuOption::ShowTrueColors,                                  Qt::CTRL | Qt::Key_T,                                  appInstance->getVoxels(),                                  SLOT(trueColorize()));     addDisabledActionAndSeparator(renderDebugMenu, "Coverage Maps");    addActionToQMenuAndActionHash(renderDebugMenu,                                  MenuOption::FalseColorOccluded,                                  0,                                  appInstance->getVoxels(),                                  SLOT(falseColorizeOccluded()));     addActionToQMenuAndActionHash(renderDebugMenu,                                  MenuOption::FalseColorOccludedV2,                                  0,                                  appInstance->getVoxels(),                                  SLOT(falseColorizeOccludedV2()));     addCheckableActionToQMenuAndActionHash(renderDebugMenu, MenuOption::CoverageMap, Qt::SHIFT | Qt::CTRL | Qt::Key_O);    addCheckableActionToQMenuAndActionHash(renderDebugMenu, MenuOption::CoverageMapV2, Qt::SHIFT | Qt::CTRL | Qt::Key_P);     QMenu* audioDebugMenu = developerMenu->addMenu("Audio Debugging Tools");    addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::EchoServerAudio);    addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::EchoLocalAudio);    addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::MuteAudio,                                           Qt::CTRL | Qt::Key_M,                                           false,                                           appInstance->getAudio(),                                           SLOT(toggleMute()));        addActionToQMenuAndActionHash(developerMenu, MenuOption::PasteToVoxel,                Qt::CTRL | Qt::SHIFT | Qt::Key_V,                this,                SLOT(pasteToVoxel()));     connect(appInstance->getAudio(), SIGNAL(muteToggled()), this, SLOT(audioMuteToggled()));    #ifndef Q_OS_MAC    QMenu* helpMenu = addMenu("Help");    QAction* helpAction = helpMenu->addAction(MenuOption::AboutApp);    connect(helpAction, SIGNAL(triggered()), this, SLOT(aboutApp()));#endif } Menu::~Menu() {    bandwidthDetailsClosed();    voxelStatsDetailsClosed();} void Menu::loadSettings(QSettings* settings) {    if (!settings) {        settings = Application::getInstance()->getSettings();    }     _audioJitterBufferSamples = loadSetting(settings, "audioJitterBufferSamples", 0);    _fieldOfView = loadSetting(settings, "fieldOfView", DEFAULT_FIELD_OF_VIEW_DEGREES);    _faceshiftEyeDeflection = loadSetting(settings, "faceshiftEyeDeflection", DEFAULT_FACESHIFT_EYE_DEFLECTION);    _maxVoxels = loadSetting(settings, "maxVoxels", DEFAULT_MAX_VOXELS_PER_SYSTEM);    _maxVoxelPacketsPerSecond = loadSetting(settings, "maxVoxelsPPS", DEFAULT_MAX_VOXEL_PPS);    _voxelSizeScale = loadSetting(settings, "voxelSizeScale", DEFAULT_OCTREE_SIZE_SCALE);    _boundaryLevelAdjust = loadSetting(settings, "boundaryLevelAdjust", 0);     settings->beginGroup("View Frustum Offset Camera");    // in case settings is corrupt or missing loadSetting() will check for NaN    _viewFrustumOffset.yaw = loadSetting(settings, "viewFrustumOffsetYaw", 0.0f);    _viewFrustumOffset.pitch = loadSetting(settings, "viewFrustumOffsetPitch", 0.0f);    _viewFrustumOffset.roll = loadSetting(settings, "viewFrustumOffsetRoll", 0.0f);

Lines 1–500 of 1129.