//Caculate the click location using one of the sixense controllers. Scale is not applied QPoint ApplicationOverlay::getPalmClickLocation(const PalmData *palm) const { Application* application = Application::getInstance(); GLCanvas* glWidget = application->getGLWidget(); MyAvatar* myAvatar = application->getAvatar(); glm::vec3 tip = myAvatar->getLaserPointerTipPosition(palm); glm::vec3 eyePos = myAvatar->getHead()->getEyePosition(); glm::quat invOrientation = glm::inverse(myAvatar->getOrientation()); //direction of ray goes towards camera glm::vec3 dir = invOrientation * glm::normalize(application->getCamera()->getPosition() - tip); glm::vec3 tipPos = invOrientation * (tip - eyePos); QPoint rv; if (OculusManager::isConnected()) { float t; //We back the ray up by dir to ensure that it will not start inside the UI. glm::vec3 adjustedPos = tipPos - dir; //Find intersection of crosshair ray. if (raySphereIntersect(dir, adjustedPos, _oculusUIRadius * myAvatar->getScale(), &t)){ glm::vec3 collisionPos = adjustedPos + dir * t; //Normalize it in case its not a radius of 1 collisionPos = glm::normalize(collisionPos); //If we hit the back hemisphere, mark it as not a collision if (collisionPos.z > 0) { rv.setX(INT_MAX); rv.setY(INT_MAX); } else { float u = asin(collisionPos.x) / (_textureFov)+0.5f; float v = 1.0 - (asin(collisionPos.y) / (_textureFov)+0.5f); rv.setX(u * glWidget->width()); rv.setY(v * glWidget->height()); } } else { //if they did not click on the overlay, just set the coords to INT_MAX rv.setX(INT_MAX); rv.setY(INT_MAX); } } else { glm::dmat4 projection; application->getProjectionMatrix(&projection); glm::vec4 clipSpacePos = glm::vec4(projection * glm::dvec4(tipPos, 1.0)); glm::vec3 ndcSpacePos; if (clipSpacePos.w != 0) { ndcSpacePos = glm::vec3(clipSpacePos) / clipSpacePos.w; } rv.setX(((ndcSpacePos.x + 1.0) / 2.0) * glWidget->width()); rv.setY((1.0 - ((ndcSpacePos.y + 1.0) / 2.0)) * glWidget->height()); } return rv; }
void PreferencesDialog::savePreferences() { MyAvatar* myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar(); bool shouldDispatchIdentityPacket = false; QString displayNameStr(ui.displayNameEdit->text()); if (displayNameStr != _displayNameString) { myAvatar->setDisplayName(displayNameStr); UserActivityLogger::getInstance().changedDisplayName(displayNameStr); shouldDispatchIdentityPacket = true; } if (shouldDispatchIdentityPacket) { myAvatar->sendIdentityPacket(); } myAvatar->setCollisionSoundURL(ui.collisionSoundURLEdit->text()); if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableActivityLogger) != ui.sendDataCheckBox->isChecked()) { Menu::getInstance()->triggerOption(MenuOption::DisableActivityLogger); } if (!ui.snapshotLocationEdit->text().isEmpty() && QDir(ui.snapshotLocationEdit->text()).exists()) { Snapshot::snapshotsLocation.set(ui.snapshotLocationEdit->text()); } if (!ui.scriptsLocationEdit->text().isEmpty() && QDir(ui.scriptsLocationEdit->text()).exists()) { qApp->setScriptsLocation(ui.scriptsLocationEdit->text()); } myAvatar->getHead()->setPupilDilation(ui.pupilDilationSlider->value() / (float)ui.pupilDilationSlider->maximum()); myAvatar->setLeanScale(ui.leanScaleSpin->value()); myAvatar->setClampedTargetScale(ui.avatarScaleSpin->value()); DependencyManager::get<AvatarManager>()->getMyAvatar()->setRealWorldFieldOfView(ui.realWorldFieldOfViewSpin->value()); qApp->setFieldOfView(ui.fieldOfViewSpin->value()); auto dde = DependencyManager::get<DdeFaceTracker>(); dde->setEyeClosingThreshold(ui.ddeEyeClosingThresholdSlider->value() / (float)ui.ddeEyeClosingThresholdSlider->maximum()); FaceTracker::setEyeDeflection(ui.faceTrackerEyeDeflectionSider->value() / (float)ui.faceTrackerEyeDeflectionSider->maximum()); auto faceshift = DependencyManager::get<Faceshift>(); faceshift->setHostname(ui.faceshiftHostnameEdit->text()); qApp->setMaxOctreePacketsPerSecond(ui.maxOctreePPSSpin->value()); qApp->getApplicationCompositor().setHmdUIAngularSize(ui.oculusUIAngularSizeSpin->value()); SixenseManager& sixense = SixenseManager::getInstance(); sixense.setReticleMoveSpeed(ui.sixenseReticleMoveSpeedSpin->value()); sixense.setInvertButtons(ui.invertSixenseButtonsCheckBox->isChecked()); auto audio = DependencyManager::get<AudioClient>(); MixedProcessedAudioStream& stream = audio->getReceivedAudioStream(); stream.setDynamicJitterBuffers(ui.dynamicJitterBuffersCheckBox->isChecked()); stream.setStaticDesiredJitterBufferFrames(ui.staticDesiredJitterBufferFramesSpin->value()); stream.setMaxFramesOverDesired(ui.maxFramesOverDesiredSpin->value()); stream.setUseStDevForJitterCalc(ui.useStdevForJitterCalcCheckBox->isChecked()); stream.setWindowStarveThreshold(ui.windowStarveThresholdSpin->value()); stream.setWindowSecondsForDesiredCalcOnTooManyStarves(ui.windowSecondsForDesiredCalcOnTooManyStarvesSpin->value()); stream.setWindowSecondsForDesiredReduction(ui.windowSecondsForDesiredReductionSpin->value()); stream.setRepetitionWithFade(ui.repetitionWithFadeCheckBox->isChecked()); QMetaObject::invokeMethod(audio.data(), "setOutputBufferSize", Q_ARG(int, ui.outputBufferSizeSpinner->value())); audio->setOutputStarveDetectionEnabled(ui.outputStarveDetectionCheckBox->isChecked()); audio->setOutputStarveDetectionThreshold(ui.outputStarveDetectionThresholdSpinner->value()); audio->setOutputStarveDetectionPeriod(ui.outputStarveDetectionPeriodSpinner->value()); Application::getInstance()->resizeGL(); // LOD items auto lodManager = DependencyManager::get<LODManager>(); lodManager->setDesktopLODDecreaseFPS(ui.desktopMinimumFPSSpin->value()); lodManager->setHMDLODDecreaseFPS(ui.hmdMinimumFPSSpin->value()); }
void PreferencesDialog::loadPreferences() { MyAvatar* myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar(); Menu* menuInstance = Menu::getInstance(); _displayNameString = myAvatar->getDisplayName(); ui.displayNameEdit->setText(_displayNameString); ui.collisionSoundURLEdit->setText(myAvatar->getCollisionSoundURL()); ui.sendDataCheckBox->setChecked(!menuInstance->isOptionChecked(MenuOption::DisableActivityLogger)); ui.snapshotLocationEdit->setText(Snapshot::snapshotsLocation.get()); ui.scriptsLocationEdit->setText(qApp->getScriptsLocation()); ui.pupilDilationSlider->setValue(myAvatar->getHead()->getPupilDilation() * ui.pupilDilationSlider->maximum()); auto dde = DependencyManager::get<DdeFaceTracker>(); ui.ddeEyeClosingThresholdSlider->setValue(dde->getEyeClosingThreshold() * ui.ddeEyeClosingThresholdSlider->maximum()); ui.faceTrackerEyeDeflectionSider->setValue(FaceTracker::getEyeDeflection() * ui.faceTrackerEyeDeflectionSider->maximum()); auto faceshift = DependencyManager::get<Faceshift>(); ui.faceshiftHostnameEdit->setText(faceshift->getHostname()); auto audio = DependencyManager::get<AudioClient>(); MixedProcessedAudioStream& stream = audio->getReceivedAudioStream(); ui.dynamicJitterBuffersCheckBox->setChecked(stream.getDynamicJitterBuffers()); ui.staticDesiredJitterBufferFramesSpin->setValue(stream.getDesiredJitterBufferFrames()); ui.maxFramesOverDesiredSpin->setValue(stream.getMaxFramesOverDesired()); ui.useStdevForJitterCalcCheckBox->setChecked(stream.getUseStDevForJitterCalc()); ui.windowStarveThresholdSpin->setValue(stream.getWindowStarveThreshold()); ui.windowSecondsForDesiredCalcOnTooManyStarvesSpin->setValue( stream.getWindowSecondsForDesiredCalcOnTooManyStarves()); ui.windowSecondsForDesiredReductionSpin->setValue(stream.getWindowSecondsForDesiredReduction()); ui.repetitionWithFadeCheckBox->setChecked(stream.getRepetitionWithFade()); ui.outputBufferSizeSpinner->setValue(audio->getOutputBufferSize()); ui.outputStarveDetectionCheckBox->setChecked(audio->getOutputStarveDetectionEnabled()); ui.outputStarveDetectionThresholdSpinner->setValue(audio->getOutputStarveDetectionThreshold()); ui.outputStarveDetectionPeriodSpinner->setValue(audio->getOutputStarveDetectionPeriod()); ui.realWorldFieldOfViewSpin->setValue(DependencyManager::get<AvatarManager>()->getMyAvatar()->getRealWorldFieldOfView()); ui.fieldOfViewSpin->setValue(qApp->getFieldOfView()); ui.leanScaleSpin->setValue(myAvatar->getLeanScale()); ui.avatarScaleSpin->setValue(myAvatar->getScale()); ui.maxOctreePPSSpin->setValue(qApp->getMaxOctreePacketsPerSecond()); ui.oculusUIAngularSizeSpin->setValue(qApp->getApplicationCompositor().getHmdUIAngularSize()); SixenseManager& sixense = SixenseManager::getInstance(); ui.sixenseReticleMoveSpeedSpin->setValue(sixense.getReticleMoveSpeed()); ui.invertSixenseButtonsCheckBox->setChecked(sixense.getInvertButtons()); // LOD items auto lodManager = DependencyManager::get<LODManager>(); ui.desktopMinimumFPSSpin->setValue(lodManager->getDesktopLODDecreaseFPS()); ui.hmdMinimumFPSSpin->setValue(lodManager->getHMDLODDecreaseFPS()); }
void setupPreferences() { auto preferences = DependencyManager::get<Preferences>(); MyAvatar* myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar(); static const QString AVATAR_BASICS { "Avatar Basics" }; { auto getter = [=]()->QString {return myAvatar->getDisplayName(); }; auto setter = [=](const QString& value) { myAvatar->setDisplayName(value); }; const QString label = "Avatar display name <font color=\"#909090\">(optional)</font>"; auto preference = new EditPreference(AVATAR_BASICS, label, getter, setter); preference->setPlaceholderText("Not showing a name"); preferences->addPreference(preference); } { auto getter = [=]()->QString {return myAvatar->getCollisionSoundURL(); }; auto setter = [=](const QString& value) { myAvatar->setCollisionSoundURL(value); }; const QString label = "Avatar collision sound URL <font color=\"#909090\">(optional)</font>"; auto preference = new EditPreference(AVATAR_BASICS, label, getter, setter); preference->setPlaceholderText("Enter the URL of a sound to play when you bump into something"); preferences->addPreference(preference); } { auto getter = [=]()->QString { return myAvatar->getFullAvatarURLFromPreferences().toString(); }; auto setter = [=](const QString& value) { myAvatar->useFullAvatarURL(value, ""); }; auto preference = new AvatarPreference(AVATAR_BASICS, "Appearance: ", getter, setter); preferences->addPreference(preference); } { auto getter = []()->QString { return Snapshot::snapshotsLocation.get(); }; auto setter = [](const QString& value) { Snapshot::snapshotsLocation.set(value); }; auto preference = new BrowsePreference("Snapshots", "Place my Snapshots here:", getter, setter); preferences->addPreference(preference); } // Scripts { auto getter = []()->QString { return DependencyManager::get<ScriptEngines>()->getScriptsLocation(); }; auto setter = [](const QString& value) { DependencyManager::get<ScriptEngines>()->setScriptsLocation(value); }; preferences->addPreference(new BrowsePreference("Scripts", "Load scripts from this directory:", getter, setter)); } preferences->addPreference(new ButtonPreference("Scripts", "Load Default Scripts", [] { DependencyManager::get<ScriptEngines>()->loadDefaultScripts(); })); { auto getter = []()->bool {return !Menu::getInstance()->isOptionChecked(MenuOption::DisableActivityLogger); }; auto setter = [](bool value) { Menu::getInstance()->setIsOptionChecked(MenuOption::DisableActivityLogger, !value); }; preferences->addPreference(new CheckPreference("Privacy", "Send Data", getter, setter)); } static const QString LOD_TUNING("Level of Detail Tuning"); CheckPreference* acuityToggle; { auto getter = []()->bool { return DependencyManager::get<LODManager>()->getUseAcuity(); }; auto setter = [](bool value) { DependencyManager::get<LODManager>()->setUseAcuity(value); }; preferences->addPreference(acuityToggle = new CheckPreference(LOD_TUNING, "Render based on visual acuity", getter, setter)); } { auto getter = []()->float { return DependencyManager::get<LODManager>()->getDesktopLODDecreaseFPS(); }; auto setter = [](float value) { DependencyManager::get<LODManager>()->setDesktopLODDecreaseFPS(value); }; auto preference = new SpinnerPreference(LOD_TUNING, "Minimum Desktop FPS", getter, setter); preference->setMin(0); preference->setMax(120); preference->setStep(1); preference->setEnabler(acuityToggle); preferences->addPreference(preference); } { auto getter = []()->float { return DependencyManager::get<LODManager>()->getHMDLODDecreaseFPS(); }; auto setter = [](float value) { DependencyManager::get<LODManager>()->setHMDLODDecreaseFPS(value); }; auto preference = new SpinnerPreference(LOD_TUNING, "Minimum HMD FPS", getter, setter); preference->setMin(0); preference->setMax(120); preference->setStep(1); preference->setEnabler(acuityToggle); preferences->addPreference(preference); } { auto getter = []()->float { return 1.0f / DependencyManager::get<LODManager>()->getRenderDistanceInverseHighLimit(); }; auto setter = [](float value) { DependencyManager::get<LODManager>()->setRenderDistanceInverseHighLimit(1.0f / value); }; auto preference = new SpinnerPreference(LOD_TUNING, "Minimum Display Distance", getter, setter); preference->setMin(5); preference->setMax(32768); preference->setStep(1); preference->setEnabler(acuityToggle, true); preferences->addPreference(preference); } static const QString AVATAR_TUNING { "Avatar Tuning" }; { auto getter = [=]()->float { return myAvatar->getRealWorldFieldOfView(); }; auto setter = [=](float value) { myAvatar->setRealWorldFieldOfView(value); }; auto preference = new SpinnerPreference(AVATAR_TUNING, "Real world vertical field of view (angular size of monitor)", getter, setter); preference->setMin(1); preference->setMax(180); preferences->addPreference(preference); } { auto getter = []()->float { return qApp->getFieldOfView(); }; auto setter = [](float value) { qApp->setFieldOfView(value); }; auto preference = new SpinnerPreference(AVATAR_TUNING, "Vertical field of view", getter, setter); preference->setMin(1); preference->setMax(180); preference->setStep(1); preferences->addPreference(preference); } { auto getter = [=]()->float { return myAvatar->getLeanScale(); }; auto setter = [=](float value) { myAvatar->setLeanScale(value); }; auto preference = new SpinnerPreference(AVATAR_TUNING, "Lean scale (applies to Faceshift users)", getter, setter); preference->setMin(0); preference->setMax(99.9f); preference->setDecimals(2); preference->setStep(1); preferences->addPreference(preference); } { auto getter = [=]()->float { return myAvatar->getUniformScale(); }; auto setter = [=](float value) { myAvatar->setTargetScaleVerbose(value); }; // The hell? auto preference = new SpinnerPreference(AVATAR_TUNING, "Avatar scale <font color=\"#909090\">(default is 1.0)</font>", getter, setter); preference->setMin(0.01f); preference->setMax(99.9f); preference->setDecimals(2); preference->setStep(1); preferences->addPreference(preference); } { auto getter = [=]()->float { return myAvatar->getHead()->getPupilDilation(); }; auto setter = [=](float value) { myAvatar->getHead()->setPupilDilation(value); }; preferences->addPreference(new SliderPreference(AVATAR_TUNING, "Pupil dilation", getter, setter)); } { auto getter = []()->float { return DependencyManager::get<DdeFaceTracker>()->getEyeClosingThreshold(); }; auto setter = [](float value) { DependencyManager::get<DdeFaceTracker>()->setEyeClosingThreshold(value); }; preferences->addPreference(new SliderPreference(AVATAR_TUNING, "Camera binary eyelid threshold", getter, setter)); } { auto getter = []()->float { return FaceTracker::getEyeDeflection(); }; auto setter = [](float value) { FaceTracker::setEyeDeflection(value); }; preferences->addPreference(new SliderPreference(AVATAR_TUNING, "Face tracker eye deflection", getter, setter)); } { auto getter = []()->QString { return DependencyManager::get<Faceshift>()->getHostname(); }; auto setter = [](const QString& value) { DependencyManager::get<Faceshift>()->setHostname(value); }; auto preference = new EditPreference(AVATAR_TUNING, "Faceshift hostname", getter, setter); preference->setPlaceholderText("localhost"); preferences->addPreference(preference); } { auto getter = [=]()->QString { return myAvatar->getAnimGraphUrl().toString(); }; auto setter = [=](const QString& value) { myAvatar->setAnimGraphUrl(value); }; auto preference = new EditPreference(AVATAR_TUNING, "Avatar Animation JSON", getter, setter); preference->setPlaceholderText("default"); preferences->addPreference(preference); } static const QString AUDIO("Audio"); { auto getter = []()->bool {return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getDynamicJitterBuffers(); }; auto setter = [](bool value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setDynamicJitterBuffers(value); }; preferences->addPreference(new CheckPreference(AUDIO, "Enable Dynamic Jitter Buffers", getter, setter)); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getDesiredJitterBufferFrames(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setStaticDesiredJitterBufferFrames(value); }; auto preference = new SpinnerPreference(AUDIO, "Static Jitter Buffer Frames", getter, setter); preference->setMin(0); preference->setMax(10000); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getMaxFramesOverDesired(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setMaxFramesOverDesired(value); }; auto preference = new SpinnerPreference(AUDIO, "Max Frames Over Desired", getter, setter); preference->setMax(10000); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->bool {return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getUseStDevForJitterCalc(); }; auto setter = [](bool value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setUseStDevForJitterCalc(value); }; preferences->addPreference(new CheckPreference(AUDIO, "Use Stddev for Dynamic Jitter Calc", getter, setter)); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getWindowStarveThreshold(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setWindowStarveThreshold(value); }; auto preference = new SpinnerPreference(AUDIO, "Window A Starve Threshold", getter, setter); preference->setMax(10000); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getWindowSecondsForDesiredCalcOnTooManyStarves(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setWindowSecondsForDesiredCalcOnTooManyStarves(value); }; auto preference = new SpinnerPreference(AUDIO, "Window A (raise desired on N starves) Seconds)", getter, setter); preference->setMax(10000); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getWindowSecondsForDesiredReduction(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setWindowSecondsForDesiredReduction(value); }; auto preference = new SpinnerPreference(AUDIO, "Window B (desired ceiling) Seconds", getter, setter); preference->setMax(10000); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->bool {return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getRepetitionWithFade(); }; auto setter = [](bool value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setRepetitionWithFade(value); }; preferences->addPreference(new CheckPreference(AUDIO, "Repetition with Fade", getter, setter)); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getOutputBufferSize(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->setOutputBufferSize(value); }; auto preference = new SpinnerPreference(AUDIO, "Output Buffer Size (frames)", getter, setter); preference->setMin(1); preference->setMax(20); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->bool {return DependencyManager::get<AudioClient>()->getOutputStarveDetectionEnabled(); }; auto setter = [](bool value) { DependencyManager::get<AudioClient>()->setOutputStarveDetectionEnabled(value); }; auto preference = new CheckPreference(AUDIO, "Output Starve Detection (Automatic Buffer Size Increase)", getter, setter); preferences->addPreference(preference); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getOutputStarveDetectionThreshold(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->setOutputStarveDetectionThreshold(value); }; auto preference = new SpinnerPreference(AUDIO, "Output Starve Detection Threshold", getter, setter); preference->setMin(1); preference->setMax(500); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getOutputStarveDetectionPeriod(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->setOutputStarveDetectionPeriod(value); }; auto preference = new SpinnerPreference(AUDIO, "Output Starve Detection Period (ms)", getter, setter); preference->setMin(1); preference->setMax((float)999999999); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->float { return qApp->getMaxOctreePacketsPerSecond(); }; auto setter = [](float value) { qApp->setMaxOctreePacketsPerSecond(value); }; auto preference = new SpinnerPreference("Octree", "Max packets sent each second", getter, setter); preference->setMin(60); preference->setMax(6000); preference->setStep(10); preferences->addPreference(preference); } { auto getter = []()->float { return qApp->getApplicationCompositor().getHmdUIAngularSize(); }; auto setter = [](float value) { qApp->getApplicationCompositor().setHmdUIAngularSize(value); }; auto preference = new SpinnerPreference("HMD", "User Interface Horizontal Angular Size (degrees)", getter, setter); preference->setMin(30); preference->setMax(160); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->float { return controller::InputDevice::getReticleMoveSpeed(); }; auto setter = [](float value) { controller::InputDevice::setReticleMoveSpeed(value); }; auto preference = new SpinnerPreference("Sixense Controllers", "Reticle Movement Speed", getter, setter); preference->setMin(0); preference->setMax(100); preference->setStep(1); preferences->addPreference(preference); } { static const QString RENDER("Graphics"); auto renderConfig = qApp->getRenderEngine()->getConfiguration(); { auto getter = [renderConfig]()->bool { return renderConfig->isJobEnabled<AmbientOcclusionEffect>(); }; auto setter = [renderConfig](bool enable) { renderConfig->setJobEnabled<AmbientOcclusionEffect>(enable); }; auto preference = new CheckPreference(RENDER, "Ambient Occlusion", getter, setter); preferences->addPreference(preference); } { auto getter = [renderConfig]()->bool { return renderConfig->isJobEnabled<Antialiasing>(); }; auto setter = [renderConfig](bool enable) { renderConfig->setJobEnabled<Antialiasing>(enable); }; auto preference = new CheckPreference(RENDER, "Antialiasing", getter, setter); preferences->addPreference(preference); } { auto getter = [renderConfig]()->bool { return renderConfig->isJobEnabled<RenderShadowTask>(); }; auto setter = [renderConfig](bool enable) { renderConfig->setJobEnabled<RenderShadowTask>(enable); }; auto preference = new CheckPreference(RENDER, "Shadows", getter, setter); preferences->addPreference(preference); } } }
void setupPreferences() { auto preferences = DependencyManager::get<Preferences>(); MyAvatar* myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar(); static const QString AVATAR_BASICS { "Avatar Basics" }; { auto getter = [=]()->QString {return myAvatar->getDisplayName(); }; auto setter = [=](const QString& value) { myAvatar->setDisplayName(value); }; auto preference = new EditPreference(AVATAR_BASICS, "Avatar display name (optional)", getter, setter); preference->setPlaceholderText("Not showing a name"); preferences->addPreference(preference); } { auto getter = [=]()->QString {return myAvatar->getCollisionSoundURL(); }; auto setter = [=](const QString& value) { myAvatar->setCollisionSoundURL(value); }; auto preference = new EditPreference(AVATAR_BASICS, "Avatar collision sound URL (optional)", getter, setter); preference->setPlaceholderText("Enter the URL of a sound to play when you bump into something"); preferences->addPreference(preference); } { auto getter = [=]()->QString { return myAvatar->getFullAvatarURLFromPreferences().toString(); }; auto setter = [=](const QString& value) { myAvatar->useFullAvatarURL(value, ""); }; auto preference = new AvatarPreference(AVATAR_BASICS, "Appearance", getter, setter); preferences->addPreference(preference); } { auto getter = [=]()->bool {return myAvatar->getSnapTurn(); }; auto setter = [=](bool value) { myAvatar->setSnapTurn(value); }; preferences->addPreference(new CheckPreference(AVATAR_BASICS, "Snap turn when in HMD", getter, setter)); } { auto getter = []()->QString { return Snapshot::snapshotsLocation.get(); }; auto setter = [](const QString& value) { Snapshot::snapshotsLocation.set(value); }; auto preference = new BrowsePreference("Snapshots", "Put my snapshots here", getter, setter); preferences->addPreference(preference); } // Scripts { auto getter = []()->QString { return DependencyManager::get<ScriptEngines>()->getScriptsLocation(); }; auto setter = [](const QString& value) { DependencyManager::get<ScriptEngines>()->setScriptsLocation(value); }; preferences->addPreference(new BrowsePreference("Scripts", "Load scripts from this directory", getter, setter)); } preferences->addPreference(new ButtonPreference("Scripts", "Load Default Scripts", [] { DependencyManager::get<ScriptEngines>()->loadDefaultScripts(); })); { auto getter = []()->bool {return !Menu::getInstance()->isOptionChecked(MenuOption::DisableActivityLogger); }; auto setter = [](bool value) { Menu::getInstance()->setIsOptionChecked(MenuOption::DisableActivityLogger, !value); }; preferences->addPreference(new CheckPreference("Privacy", "Send data", getter, setter)); } static const QString LOD_TUNING("Level of Detail Tuning"); { auto getter = []()->float { return DependencyManager::get<LODManager>()->getDesktopLODDecreaseFPS(); }; auto setter = [](float value) { DependencyManager::get<LODManager>()->setDesktopLODDecreaseFPS(value); }; auto preference = new SpinnerPreference(LOD_TUNING, "Minimum desktop FPS", getter, setter); preference->setMin(0); preference->setMax(120); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->float { return DependencyManager::get<LODManager>()->getHMDLODDecreaseFPS(); }; auto setter = [](float value) { DependencyManager::get<LODManager>()->setHMDLODDecreaseFPS(value); }; auto preference = new SpinnerPreference(LOD_TUNING, "Minimum HMD FPS", getter, setter); preference->setMin(0); preference->setMax(120); preference->setStep(1); preferences->addPreference(preference); } static const QString AVATAR_TUNING { "Avatar Tuning" }; { auto getter = [=]()->float { return myAvatar->getRealWorldFieldOfView(); }; auto setter = [=](float value) { myAvatar->setRealWorldFieldOfView(value); }; auto preference = new SpinnerPreference(AVATAR_TUNING, "Real world vertical field of view (angular size of monitor)", getter, setter); preference->setMin(1); preference->setMax(180); preferences->addPreference(preference); } { auto getter = []()->float { return qApp->getFieldOfView(); }; auto setter = [](float value) { qApp->setFieldOfView(value); }; auto preference = new SpinnerPreference(AVATAR_TUNING, "Vertical field of view", getter, setter); preference->setMin(1); preference->setMax(180); preference->setStep(1); preferences->addPreference(preference); } { auto getter = [=]()->float { return myAvatar->getLeanScale(); }; auto setter = [=](float value) { myAvatar->setLeanScale(value); }; auto preference = new SpinnerPreference(AVATAR_TUNING, "Lean scale (applies to Faceshift users)", getter, setter); preference->setMin(0); preference->setMax(99.9f); preference->setDecimals(2); preference->setStep(1); preferences->addPreference(preference); } { auto getter = [=]()->float { return myAvatar->getUniformScale(); }; auto setter = [=](float value) { myAvatar->setTargetScaleVerbose(value); }; // The hell? auto preference = new SpinnerPreference(AVATAR_TUNING, "Avatar scale (default is 1.0)", getter, setter); preference->setMin(0.01f); preference->setMax(99.9f); preference->setDecimals(2); preference->setStep(1); preferences->addPreference(preference); } { auto getter = [=]()->float { return myAvatar->getHead()->getPupilDilation(); }; auto setter = [=](float value) { myAvatar->getHead()->setPupilDilation(value); }; preferences->addPreference(new SliderPreference(AVATAR_TUNING, "Pupil dilation", getter, setter)); } { auto getter = []()->float { return DependencyManager::get<DdeFaceTracker>()->getEyeClosingThreshold(); }; auto setter = [](float value) { DependencyManager::get<DdeFaceTracker>()->setEyeClosingThreshold(value); }; preferences->addPreference(new SliderPreference(AVATAR_TUNING, "Camera binary eyelid threshold", getter, setter)); } { auto getter = []()->float { return FaceTracker::getEyeDeflection(); }; auto setter = [](float value) { FaceTracker::setEyeDeflection(value); }; preferences->addPreference(new SliderPreference(AVATAR_TUNING, "Face tracker eye deflection", getter, setter)); } { auto getter = []()->QString { return DependencyManager::get<Faceshift>()->getHostname(); }; auto setter = [](const QString& value) { DependencyManager::get<Faceshift>()->setHostname(value); }; auto preference = new EditPreference(AVATAR_TUNING, "Faceshift hostname", getter, setter); preference->setPlaceholderText("localhost"); preferences->addPreference(preference); } { auto getter = [=]()->QString { return myAvatar->getAnimGraphUrl().toString(); }; auto setter = [=](const QString& value) { myAvatar->setAnimGraphUrl(value); }; auto preference = new EditPreference(AVATAR_TUNING, "Avatar animation JSON", getter, setter); preference->setPlaceholderText("default"); preferences->addPreference(preference); } static const QString AVATAR_CAMERA { "Avatar Camera" }; { auto getter = [=]()->float { return myAvatar->getPitchSpeed(); }; auto setter = [=](float value) { myAvatar->setPitchSpeed(value); }; auto preference = new SpinnerPreference(AVATAR_CAMERA, "Camera pitch speed (degrees/second)", getter, setter); preference->setMin(1.0f); preference->setMax(360.0f); preferences->addPreference(preference); } { auto getter = [=]()->float { return myAvatar->getYawSpeed(); }; auto setter = [=](float value) { myAvatar->setYawSpeed(value); }; auto preference = new SpinnerPreference(AVATAR_CAMERA, "Camera yaw speed (degrees/second)", getter, setter); preference->setMin(1.0f); preference->setMax(360.0f); preferences->addPreference(preference); } static const QString AUDIO("Audio"); { auto getter = []()->bool {return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getDynamicJitterBuffers(); }; auto setter = [](bool value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setDynamicJitterBuffers(value); }; preferences->addPreference(new CheckPreference(AUDIO, "Enable dynamic jitter buffers", getter, setter)); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getDesiredJitterBufferFrames(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setStaticDesiredJitterBufferFrames(value); }; auto preference = new SpinnerPreference(AUDIO, "Static jitter buffer frames", getter, setter); preference->setMin(0); preference->setMax(10000); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getMaxFramesOverDesired(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setMaxFramesOverDesired(value); }; auto preference = new SpinnerPreference(AUDIO, "Max frames over desired", getter, setter); preference->setMax(10000); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->bool {return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getUseStDevForJitterCalc(); }; auto setter = [](bool value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setUseStDevForJitterCalc(value); }; preferences->addPreference(new CheckPreference(AUDIO, "Use standard deviation for dynamic jitter calc", getter, setter)); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getWindowStarveThreshold(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setWindowStarveThreshold(value); }; auto preference = new SpinnerPreference(AUDIO, "Window A starve threshold", getter, setter); preference->setMax(10000); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getWindowSecondsForDesiredCalcOnTooManyStarves(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setWindowSecondsForDesiredCalcOnTooManyStarves(value); }; auto preference = new SpinnerPreference(AUDIO, "Window A (raise desired on N starves) seconds", getter, setter); preference->setMax(10000); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getWindowSecondsForDesiredReduction(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setWindowSecondsForDesiredReduction(value); }; auto preference = new SpinnerPreference(AUDIO, "Window B (desired ceiling) seconds", getter, setter); preference->setMax(10000); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->bool {return DependencyManager::get<AudioClient>()->getReceivedAudioStream().getRepetitionWithFade(); }; auto setter = [](bool value) { DependencyManager::get<AudioClient>()->getReceivedAudioStream().setRepetitionWithFade(value); }; preferences->addPreference(new CheckPreference(AUDIO, "Repetition with fade", getter, setter)); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getOutputBufferSize(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->setOutputBufferSize(value); }; auto preference = new SpinnerPreference(AUDIO, "Output buffer initial size (frames)", getter, setter); preference->setMin(1); preference->setMax(20); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->bool {return DependencyManager::get<AudioClient>()->getOutputStarveDetectionEnabled(); }; auto setter = [](bool value) { DependencyManager::get<AudioClient>()->setOutputStarveDetectionEnabled(value); }; auto preference = new CheckPreference(AUDIO, "Output starve detection (automatic buffer size increase)", getter, setter); preferences->addPreference(preference); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getOutputStarveDetectionThreshold(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->setOutputStarveDetectionThreshold(value); }; auto preference = new SpinnerPreference(AUDIO, "Output starve detection threshold", getter, setter); preference->setMin(1); preference->setMax(500); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->float { return DependencyManager::get<AudioClient>()->getOutputStarveDetectionPeriod(); }; auto setter = [](float value) { DependencyManager::get<AudioClient>()->setOutputStarveDetectionPeriod(value); }; auto preference = new SpinnerPreference(AUDIO, "Output starve detection period (ms)", getter, setter); preference->setMin(1); preference->setMax((float)999999999); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->float { return qApp->getMaxOctreePacketsPerSecond(); }; auto setter = [](float value) { qApp->setMaxOctreePacketsPerSecond(value); }; auto preference = new SpinnerPreference("Octree", "Max packets sent each second", getter, setter); preference->setMin(60); preference->setMax(6000); preference->setStep(10); preferences->addPreference(preference); } { auto getter = []()->float { return qApp->getApplicationCompositor().getHmdUIAngularSize(); }; auto setter = [](float value) { qApp->getApplicationCompositor().setHmdUIAngularSize(value); }; auto preference = new SpinnerPreference("HMD", "UI horizontal angular size (degrees)", getter, setter); preference->setMin(30); preference->setMax(160); preference->setStep(1); preferences->addPreference(preference); } { auto getter = []()->float { return controller::InputDevice::getReticleMoveSpeed(); }; auto setter = [](float value) { controller::InputDevice::setReticleMoveSpeed(value); }; auto preference = new SpinnerPreference("Sixense Controllers", "Reticle movement speed", getter, setter); preference->setMin(0); preference->setMax(100); preference->setStep(1); preferences->addPreference(preference); } { static const QString RENDER("Graphics"); auto renderConfig = qApp->getRenderEngine()->getConfiguration(); auto ambientOcclusionConfig = renderConfig->getConfig<AmbientOcclusionEffect>(); { auto getter = [ambientOcclusionConfig]()->QString { return ambientOcclusionConfig->getPreset(); }; auto setter = [ambientOcclusionConfig](QString preset) { ambientOcclusionConfig->setPreset(preset); }; auto preference = new ComboBoxPreference(RENDER, "Ambient occlusion", getter, setter); preference->setItems(ambientOcclusionConfig->getPresetList()); preferences->addPreference(preference); } auto shadowConfig = renderConfig->getConfig<RenderShadowTask>(); { auto getter = [shadowConfig]()->QString { return shadowConfig->getPreset(); }; auto setter = [shadowConfig](QString preset) { shadowConfig->setPreset(preset); }; auto preference = new ComboBoxPreference(RENDER, "Shadows", getter, setter); preference->setItems(shadowConfig->getPresetList()); preferences->addPreference(preference); } } }
void PreferencesDialog::savePreferences() { MyAvatar* myAvatar = Application::getInstance()->getAvatar(); bool shouldDispatchIdentityPacket = false; QString displayNameStr(ui.displayNameEdit->text()); if (displayNameStr != _displayNameString) { myAvatar->setDisplayName(displayNameStr); UserActivityLogger::getInstance().changedDisplayName(displayNameStr); shouldDispatchIdentityPacket = true; } QUrl faceModelURL(ui.faceURLEdit->text()); QString faceModelURLString = faceModelURL.toString(); if (faceModelURLString != _faceURLString) { if (faceModelURLString.isEmpty() || faceModelURLString.toLower().endsWith(".fst")) { // change the faceModelURL in the profile, it will also update this user's BlendFace myAvatar->setFaceModelURL(faceModelURL); UserActivityLogger::getInstance().changedModel("head", faceModelURLString); shouldDispatchIdentityPacket = true; } else { qDebug() << "ERROR: Head model not FST or blank - " << faceModelURLString; } } QUrl skeletonModelURL(ui.skeletonURLEdit->text()); QString skeletonModelURLString = skeletonModelURL.toString(); if (skeletonModelURLString != _skeletonURLString) { if (skeletonModelURLString.isEmpty() || skeletonModelURLString.toLower().endsWith(".fst")) { // change the skeletonModelURL in the profile, it will also update this user's Body myAvatar->setSkeletonModelURL(skeletonModelURL); UserActivityLogger::getInstance().changedModel("skeleton", skeletonModelURLString); shouldDispatchIdentityPacket = true; } else { qDebug() << "ERROR: Skeleton model not FST or blank - " << skeletonModelURLString; } } if (shouldDispatchIdentityPacket) { myAvatar->sendIdentityPacket(); } if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableActivityLogger) != ui.sendDataCheckBox->isChecked()) { Menu::getInstance()->triggerOption(MenuOption::DisableActivityLogger); } if (!ui.snapshotLocationEdit->text().isEmpty() && QDir(ui.snapshotLocationEdit->text()).exists()) { SettingHandles::snapshotsLocation.set(ui.snapshotLocationEdit->text()); } if (!ui.scriptsLocationEdit->text().isEmpty() && QDir(ui.scriptsLocationEdit->text()).exists()) { qApp->setScriptsLocation(ui.scriptsLocationEdit->text()); } myAvatar->getHead()->setPupilDilation(ui.pupilDilationSlider->value() / (float)ui.pupilDilationSlider->maximum()); myAvatar->setLeanScale(ui.leanScaleSpin->value()); myAvatar->setClampedTargetScale(ui.avatarScaleSpin->value()); auto glCanvas = DependencyManager::get<GLCanvas>(); Application::getInstance()->resizeGL(glCanvas->width(), glCanvas->height()); qApp->getViewFrustum()->setRealWorldFieldOfView(ui.realWorldFieldOfViewSpin->value()); qApp->getViewFrustum()->setFieldOfView(ui.fieldOfViewSpin->value()); auto faceshift = DependencyManager::get<Faceshift>(); faceshift->setEyeDeflection(ui.faceshiftEyeDeflectionSider->value() / (float)ui.faceshiftEyeDeflectionSider->maximum()); faceshift->setHostname(ui.faceshiftHostnameEdit->text()); qApp->getOctreeQuery().setMaxOctreePacketsPerSecond(ui.maxOctreePPSSpin->value()); qApp->getApplicationOverlay().setOculusUIAngularSize(ui.oculusUIAngularSizeSpin->value()); SixenseManager& sixense = SixenseManager::getInstance(); sixense.setReticleMoveSpeed(ui.sixenseReticleMoveSpeedSpin->value()); sixense.setInvertButtons(ui.invertSixenseButtonsCheckBox->isChecked()); auto audio = DependencyManager::get<Audio>(); MixedProcessedAudioStream& stream = audio->getReceivedAudioStream(); stream.setDynamicJitterBuffers(ui.dynamicJitterBuffersCheckBox->isChecked()); stream.setStaticDesiredJitterBufferFrames(ui.staticDesiredJitterBufferFramesSpin->value()); stream.setMaxFramesOverDesired(ui.maxFramesOverDesiredSpin->value()); stream.setUseStDevForJitterCalc(ui.useStdevForJitterCalcCheckBox->isChecked()); stream.setWindowStarveThreshold(ui.windowStarveThresholdSpin->value()); stream.setWindowSecondsForDesiredCalcOnTooManyStarves(ui.windowSecondsForDesiredCalcOnTooManyStarvesSpin->value()); stream.setWindowSecondsForDesiredReduction(ui.windowSecondsForDesiredReductionSpin->value()); stream.setRepetitionWithFade(ui.repetitionWithFadeCheckBox->isChecked()); QMetaObject::invokeMethod(audio.data(), "setOutputBufferSize", Q_ARG(int, ui.outputBufferSizeSpinner->value())); audio->setOutputStarveDetectionEnabled(ui.outputStarveDetectionCheckBox->isChecked()); audio->setOutputStarveDetectionThreshold(ui.outputStarveDetectionThresholdSpinner->value()); audio->setOutputStarveDetectionPeriod(ui.outputStarveDetectionPeriodSpinner->value()); Application::getInstance()->resizeGL(glCanvas->width(), glCanvas->height()); }
void PreferencesDialog::loadPreferences() { MyAvatar* myAvatar = Application::getInstance()->getAvatar(); Menu* menuInstance = Menu::getInstance(); _displayNameString = myAvatar->getDisplayName(); ui.displayNameEdit->setText(_displayNameString); _faceURLString = myAvatar->getHead()->getFaceModel().getURL().toString(); ui.faceURLEdit->setText(_faceURLString); _skeletonURLString = myAvatar->getSkeletonModel().getURL().toString(); ui.skeletonURLEdit->setText(_skeletonURLString); ui.sendDataCheckBox->setChecked(!menuInstance->isOptionChecked(MenuOption::DisableActivityLogger)); ui.snapshotLocationEdit->setText(SettingHandles::snapshotsLocation.get()); ui.scriptsLocationEdit->setText(qApp->getScriptsLocation()); ui.pupilDilationSlider->setValue(myAvatar->getHead()->getPupilDilation() * ui.pupilDilationSlider->maximum()); auto faceshift = DependencyManager::get<Faceshift>(); ui.faceshiftEyeDeflectionSider->setValue(faceshift->getEyeDeflection() * ui.faceshiftEyeDeflectionSider->maximum()); ui.faceshiftHostnameEdit->setText(faceshift->getHostname()); auto audio = DependencyManager::get<Audio>(); MixedProcessedAudioStream& stream = audio->getReceivedAudioStream(); ui.dynamicJitterBuffersCheckBox->setChecked(stream.getDynamicJitterBuffers()); ui.staticDesiredJitterBufferFramesSpin->setValue(stream.getDesiredJitterBufferFrames()); ui.maxFramesOverDesiredSpin->setValue(stream.getMaxFramesOverDesired()); ui.useStdevForJitterCalcCheckBox->setChecked(stream.getUseStDevForJitterCalc()); ui.windowStarveThresholdSpin->setValue(stream.getWindowStarveThreshold()); ui.windowSecondsForDesiredCalcOnTooManyStarvesSpin->setValue( stream.getWindowSecondsForDesiredCalcOnTooManyStarves()); ui.windowSecondsForDesiredReductionSpin->setValue(stream.getWindowSecondsForDesiredReduction()); ui.repetitionWithFadeCheckBox->setChecked(stream.getRepetitionWithFade()); ui.outputBufferSizeSpinner->setValue(audio->getOutputBufferSize()); ui.outputStarveDetectionCheckBox->setChecked(audio->getOutputStarveDetectionEnabled()); ui.outputStarveDetectionThresholdSpinner->setValue(audio->getOutputStarveDetectionThreshold()); ui.outputStarveDetectionPeriodSpinner->setValue(audio->getOutputStarveDetectionPeriod()); ui.realWorldFieldOfViewSpin->setValue(qApp->getViewFrustum()->getRealWorldFieldOfView()); ui.fieldOfViewSpin->setValue(qApp->getViewFrustum()->getFieldOfView()); ui.leanScaleSpin->setValue(myAvatar->getLeanScale()); ui.avatarScaleSpin->setValue(myAvatar->getScale()); ui.maxOctreePPSSpin->setValue(qApp->getOctreeQuery().getMaxOctreePacketsPerSecond()); ui.oculusUIAngularSizeSpin->setValue(qApp->getApplicationOverlay().getOculusUIAngularSize()); SixenseManager& sixense = SixenseManager::getInstance(); ui.sixenseReticleMoveSpeedSpin->setValue(sixense.getReticleMoveSpeed()); ui.invertSixenseButtonsCheckBox->setChecked(sixense.getInvertButtons()); }