History

Merge pull request #10604 from highfidelity/RC-42

Beta Release 42 - Includes up to Developer Release 6626

Chris Collins committed 9 years ago

Commit 6cc6cd32 parents 5db0975 52c60b385 files · +3145 −1198Browse files

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

Unified · Split

interface/src/Application.cpp+67−115
@@ -11,6 +11,9 @@ · 10 unmodified lines
11 11
12#include "Application.h"12#include "Application.h"
13 13
14#include <chrono>
15#include <thread>
16
14#include <gl/Config.h>17#include <gl/Config.h>
15#include <glm/glm.hpp>18#include <glm/glm.hpp>
16#include <glm/gtx/component_wise.hpp>19#include <glm/gtx/component_wise.hpp>
@@ -146,6 +149,7 @@ · 129 unmodified lines
146#include "InterfaceLogging.h"149#include "InterfaceLogging.h"
147#include "LODManager.h"150#include "LODManager.h"
148#include "ModelPackager.h"151#include "ModelPackager.h"
152#include "networking/CloseEventSender.h"
149#include "networking/HFWebEngineProfile.h"153#include "networking/HFWebEngineProfile.h"
150#include "networking/HFTabletWebEngineProfile.h"154#include "networking/HFTabletWebEngineProfile.h"
151#include "networking/FileTypeProfile.h"155#include "networking/FileTypeProfile.h"
@@ -438,6 +442,10 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) { · 286 unmodified lines
438 const char* portStr = getCmdOption(argc, constArgv, "--listenPort");442 const char* portStr = getCmdOption(argc, constArgv, "--listenPort");
439 const int listenPort = portStr ? atoi(portStr) : INVALID_PORT;443 const int listenPort = portStr ? atoi(portStr) : INVALID_PORT;
440 444
445 static const auto SUPPRESS_SETTINGS_RESET = "--suppress-settings-reset";
446 bool suppressPrompt = cmdOptionExists(argc, const_cast<const char**>(argv), SUPPRESS_SETTINGS_RESET);
447 bool previousSessionCrashed = CrashHandler::checkForResetSettings(runningMarkerExisted, suppressPrompt);
448
441 Setting::init();449 Setting::init();
442 450
443 if (auto steamClient = PluginManager::getInstance()->getSteamClientPlugin()) {451 if (auto steamClient = PluginManager::getInstance()->getSteamClientPlugin()) {
@@ -458,10 +466,6 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) { · 14 unmodified lines
458 QCoreApplication::addLibraryPath(audioDLLPath);466 QCoreApplication::addLibraryPath(audioDLLPath);
459#endif467#endif
460 468
461 static const auto SUPPRESS_SETTINGS_RESET = "--suppress-settings-reset";
462 bool suppressPrompt = cmdOptionExists(argc, const_cast<const char**>(argv), SUPPRESS_SETTINGS_RESET);
463 bool previousSessionCrashed = CrashHandler::checkForResetSettings(runningMarkerExisted, suppressPrompt);
464
465 DependencyManager::registerInheritance<LimitedNodeList, NodeList>();469 DependencyManager::registerInheritance<LimitedNodeList, NodeList>();
466 DependencyManager::registerInheritance<AvatarHashMap, AvatarManager>();470 DependencyManager::registerInheritance<AvatarHashMap, AvatarManager>();
467 DependencyManager::registerInheritance<EntityDynamicFactoryInterface, InterfaceDynamicFactory>();471 DependencyManager::registerInheritance<EntityDynamicFactoryInterface, InterfaceDynamicFactory>();
@@ -536,6 +540,7 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) { · 68 unmodified lines
536 DependencyManager::set<AvatarBookmarks>();540 DependencyManager::set<AvatarBookmarks>();
537 DependencyManager::set<LocationBookmarks>();541 DependencyManager::set<LocationBookmarks>();
538 DependencyManager::set<Snapshot>();542 DependencyManager::set<Snapshot>();
543 DependencyManager::set<CloseEventSender>();
539 544
540 return previousSessionCrashed;545 return previousSessionCrashed;
541}546}
@@ -1643,6 +1648,14 @@ void Application::aboutToQuit() { · 1101 unmodified lines
1643 1648
1644 getActiveDisplayPlugin()->deactivate();1649 getActiveDisplayPlugin()->deactivate();
1645 1650
1651 // use the CloseEventSender via a QThread to send an event that says the user asked for the app to close
1652 auto closeEventSender = DependencyManager::get<CloseEventSender>();
1653 QThread* closureEventThread = new QThread(this);
1654 closeEventSender->moveToThread(closureEventThread);
1655 // sendQuitEventAsync will bail immediately if the UserActivityLogger is not enabled
1656 connect(closureEventThread, &QThread::started, closeEventSender.data(), &CloseEventSender::sendQuitEventAsync);
1657 closureEventThread->start();
1658
1646 // Hide Running Scripts dialog so that it gets destroyed in an orderly manner; prevents warnings at shutdown.1659 // Hide Running Scripts dialog so that it gets destroyed in an orderly manner; prevents warnings at shutdown.
1647 DependencyManager::get<OffscreenUi>()->hide("RunningScripts");1660 DependencyManager::get<OffscreenUi>()->hide("RunningScripts");
1648 1661
@@ -1697,7 +1710,6 @@ void Application::cleanupBeforeQuit() { · 48 unmodified lines
1697 // Clear any queued processing (I/O, FBX/OBJ/Texture parsing)1710 // Clear any queued processing (I/O, FBX/OBJ/Texture parsing)
1698 QThreadPool::globalInstance()->clear();1711 QThreadPool::globalInstance()->clear();
1699 1712
1700 DependencyManager::get<ScriptEngines>()->saveScripts();
1701 DependencyManager::get<ScriptEngines>()->shutdownScripting(); // stop all currently running global scripts1713 DependencyManager::get<ScriptEngines>()->shutdownScripting(); // stop all currently running global scripts
1702 DependencyManager::destroy<ScriptEngines>();1714 DependencyManager::destroy<ScriptEngines>();
1703 1715
@@ -1808,6 +1820,15 @@ Application::~Application() { · 104 unmodified lines
1808 1820
1809 _window->deleteLater();1821 _window->deleteLater();
1810 1822
1823 // make sure that the quit event has finished sending before we take the application down
1824 auto closeEventSender = DependencyManager::get<CloseEventSender>();
1825 while (!closeEventSender->hasFinishedQuitEvent() && !closeEventSender->hasTimedOutQuitEvent()) {
1826 // sleep a little so we're not spinning at 100%
1827 std::this_thread::sleep_for(std::chrono::milliseconds(10));
1828 }
1829 // quit the thread used by the closure event sender
1830 closeEventSender->thread()->quit();
1831
1811 // Can't log to file passed this point, FileLogger about to be deleted1832 // Can't log to file passed this point, FileLogger about to be deleted
1812 qInstallMessageHandler(LogHandler::verboseMessageHandler);1833 qInstallMessageHandler(LogHandler::verboseMessageHandler);
1813}1834}
@@ -2458,15 +2479,16 @@ void Application::handleSandboxStatus(QNetworkReply* reply) { · 644 unmodified lines
2458 2479
2459 // Check HMD use (may be technically available without being in use)2480 // Check HMD use (may be technically available without being in use)
2460 bool hasHMD = PluginUtils::isHMDAvailable();2481 bool hasHMD = PluginUtils::isHMDAvailable();
2461 bool isUsingHMD = hasHMD && hasHandControllers && _displayPlugin->isHmd();2482 bool isUsingHMD = _displayPlugin->isHmd();
2483 bool isUsingHMDAndHandControllers = hasHMD && hasHandControllers && isUsingHMD;
2462 2484
2463 Setting::Handle<bool> tutorialComplete{ "tutorialComplete", false };2485 Setting::Handle<bool> tutorialComplete{ "tutorialComplete", false };
2464 Setting::Handle<bool> firstRun{ Settings::firstRun, true };2486 Setting::Handle<bool> firstRun{ Settings::firstRun, true };
2465 2487
2466 bool isTutorialComplete = tutorialComplete.get();2488 bool isTutorialComplete = tutorialComplete.get();
2467 bool shouldGoToTutorial = isUsingHMD && hasTutorialContent && !isTutorialComplete;2489 bool shouldGoToTutorial = isUsingHMDAndHandControllers && hasTutorialContent && !isTutorialComplete;
2468 2490
2469 qCDebug(interfaceapp) << "HMD:" << hasHMD << ", Hand Controllers: " << hasHandControllers << ", Using HMD: " << isUsingHMD;2491 qCDebug(interfaceapp) << "HMD:" << hasHMD << ", Hand Controllers: " << hasHandControllers << ", Using HMD: " << isUsingHMDAndHandControllers;
2470 qCDebug(interfaceapp) << "Tutorial version:" << contentVersion << ", sufficient:" << hasTutorialContent <<2492 qCDebug(interfaceapp) << "Tutorial version:" << contentVersion << ", sufficient:" << hasTutorialContent <<
2471 ", complete:" << isTutorialComplete << ", should go:" << shouldGoToTutorial;2493 ", complete:" << isTutorialComplete << ", should go:" << shouldGoToTutorial;
2472 2494
@@ -2480,10 +2502,18 @@ void Application::handleSandboxStatus(QNetworkReply* reply) { · 7 unmodified lines
2480 2502
2481 const QString TUTORIAL_PATH = "/tutorial_begin";2503 const QString TUTORIAL_PATH = "/tutorial_begin";
2482 2504
2505 static const QString SENT_TO_TUTORIAL = "tutorial";
2506 static const QString SENT_TO_PREVIOUS_LOCATION = "previous_location";
2507 static const QString SENT_TO_ENTRY = "entry";
2508 static const QString SENT_TO_SANDBOX = "sandbox";
2509
2510 QString sentTo;
2511
2483 if (shouldGoToTutorial) {2512 if (shouldGoToTutorial) {
2484 if (sandboxIsRunning) {2513 if (sandboxIsRunning) {
2485 qCDebug(interfaceapp) << "Home sandbox appears to be running, going to Home.";2514 qCDebug(interfaceapp) << "Home sandbox appears to be running, going to Home.";
2486 DependencyManager::get<AddressManager>()->goToLocalSandbox(TUTORIAL_PATH);2515 DependencyManager::get<AddressManager>()->goToLocalSandbox(TUTORIAL_PATH);
2516 sentTo = SENT_TO_TUTORIAL;
2487 } else {2517 } else {
2488 qCDebug(interfaceapp) << "Home sandbox does not appear to be running, going to Entry.";2518 qCDebug(interfaceapp) << "Home sandbox does not appear to be running, going to Entry.";
2489 if (firstRun.get()) {2519 if (firstRun.get()) {
@@ -2491,8 +2521,10 @@ void Application::handleSandboxStatus(QNetworkReply* reply) { · 1 unmodified line
2491 }2521 }
2492 if (addressLookupString.isEmpty()) {2522 if (addressLookupString.isEmpty()) {
2493 DependencyManager::get<AddressManager>()->goToEntry();2523 DependencyManager::get<AddressManager>()->goToEntry();
2524 sentTo = SENT_TO_ENTRY;
2494 } else {2525 } else {
2495 DependencyManager::get<AddressManager>()->loadSettings(addressLookupString);2526 DependencyManager::get<AddressManager>()->loadSettings(addressLookupString);
2527 sentTo = SENT_TO_PREVIOUS_LOCATION;
2496 }2528 }
2497 }2529 }
2498 } else {2530 } else {
@@ -2505,23 +2537,40 @@ void Application::handleSandboxStatus(QNetworkReply* reply) { · 6 unmodified lines
2505 2537
2506 // If this is a first run we short-circuit the address passed in2538 // If this is a first run we short-circuit the address passed in
2507 if (isFirstRun) {2539 if (isFirstRun) {
2508 if (isUsingHMD) {2540 if (isUsingHMDAndHandControllers) {
2509 if (sandboxIsRunning) {2541 if (sandboxIsRunning) {
2510 qCDebug(interfaceapp) << "Home sandbox appears to be running, going to Home.";2542 qCDebug(interfaceapp) << "Home sandbox appears to be running, going to Home.";
2511 DependencyManager::get<AddressManager>()->goToLocalSandbox();2543 DependencyManager::get<AddressManager>()->goToLocalSandbox();
2544 sentTo = SENT_TO_SANDBOX;
2512 } else {2545 } else {
2513 qCDebug(interfaceapp) << "Home sandbox does not appear to be running, going to Entry.";2546 qCDebug(interfaceapp) << "Home sandbox does not appear to be running, going to Entry.";
2514 DependencyManager::get<AddressManager>()->goToEntry();2547 DependencyManager::get<AddressManager>()->goToEntry();
2548 sentTo = SENT_TO_ENTRY;
2515 }2549 }
2516 } else {2550 } else {
2517 DependencyManager::get<AddressManager>()->goToEntry();2551 DependencyManager::get<AddressManager>()->goToEntry();
2552 sentTo = SENT_TO_ENTRY;
2518 }2553 }
2519 } else {2554 } else {
2520 qCDebug(interfaceapp) << "Not first run... going to" << qPrintable(addressLookupString.isEmpty() ? QString("previous location") : addressLookupString);2555 qCDebug(interfaceapp) << "Not first run... going to" << qPrintable(addressLookupString.isEmpty() ? QString("previous location") : addressLookupString);
2521 DependencyManager::get<AddressManager>()->loadSettings(addressLookupString);2556 DependencyManager::get<AddressManager>()->loadSettings(addressLookupString);
2557 sentTo = SENT_TO_PREVIOUS_LOCATION;
2522 }2558 }
2523 }2559 }
2524 2560
2561 UserActivityLogger::getInstance().logAction("startup_sent_to", {
2562 { "sent_to", sentTo },
2563 { "sandbox_is_running", sandboxIsRunning },
2564 { "has_hmd", hasHMD },
2565 { "has_hand_controllers", hasHandControllers },
2566 { "is_using_hmd", isUsingHMD },
2567 { "is_using_hmd_and_hand_controllers", isUsingHMDAndHandControllers },
2568 { "content_version", contentVersion },
2569 { "is_tutorial_complete", isTutorialComplete },
2570 { "has_tutorial_content", hasTutorialContent },
2571 { "should_go_to_tutorial", shouldGoToTutorial }
2572 });
2573
2525 _connectionMonitor.init();2574 _connectionMonitor.init();
2526 2575
2527 // After all of the constructor is completed, then set firstRun to false.2576 // After all of the constructor is completed, then set firstRun to false.
@@ -4439,7 +4488,11 @@ void Application::update(float deltaTime) { · 1911 unmodified lines
4439 myAvatar->getSpine2CalibrationMat(),4488 myAvatar->getSpine2CalibrationMat(),
4440 myAvatar->getHipsCalibrationMat(),4489 myAvatar->getHipsCalibrationMat(),
4441 myAvatar->getLeftFootCalibrationMat(),4490 myAvatar->getLeftFootCalibrationMat(),
4442 myAvatar->getRightFootCalibrationMat()4491 myAvatar->getRightFootCalibrationMat(),
4492 myAvatar->getRightArmCalibrationMat(),
4493 myAvatar->getLeftArmCalibrationMat(),
4494 myAvatar->getRightHandCalibrationMat(),
4495 myAvatar->getLeftHandCalibrationMat()
4443 };4496 };
4444 4497
4445 InputPluginPointer keyboardMousePlugin;4498 InputPluginPointer keyboardMousePlugin;
@@ -4495,6 +4548,10 @@ void Application::update(float deltaTime) { · 49 unmodified lines
4495 controller::Pose headPose = userInputMapper->getPoseState(controller::Action::HEAD);4548 controller::Pose headPose = userInputMapper->getPoseState(controller::Action::HEAD);
4496 myAvatar->setHeadControllerPoseInSensorFrame(headPose.transform(avatarToSensorMatrix));4549 myAvatar->setHeadControllerPoseInSensorFrame(headPose.transform(avatarToSensorMatrix));
4497 4550
4551 controller::Pose leftArmPose = userInputMapper->getPoseState(controller::Action::LEFT_ARM);
4552 controller::Pose rightArmPose = userInputMapper->getPoseState(controller::Action::RIGHT_ARM);
4553 myAvatar->setArmControllerPosesInSensorFrame(leftArmPose.transform(avatarToSensorMatrix), rightArmPose.transform(avatarToSensorMatrix));
4554
4498 updateThreads(deltaTime); // If running non-threaded, then give the threads some time to process...4555 updateThreads(deltaTime); // If running non-threaded, then give the threads some time to process...
4499 updateDialogs(deltaTime); // update various stats dialogs if present4556 updateDialogs(deltaTime); // update various stats dialogs if present
4500 4557
@@ -4949,12 +5006,6 @@ QRect Application::getDesirableApplicationGeometry() const { · 448 unmodified lines
4949 return applicationGeometry;5006 return applicationGeometry;
4950}5007}
4951 5008
4952glm::vec3 Application::getSunDirection() const {
4953 // Sun direction is in fact just the location of the sun relative to the origin
4954 auto skyStage = DependencyManager::get<SceneScriptingInterface>()->getSkyStage();
4955 return skyStage->getSunLight()->getDirection();
4956}
4957
4958// FIXME, preprocessor guard this check to occur only in DEBUG builds5009// FIXME, preprocessor guard this check to occur only in DEBUG builds
4959static QThread * activeRenderingThread = nullptr;5010static QThread * activeRenderingThread = nullptr;
4960 5011
@@ -5021,90 +5072,6 @@ namespace render { · 60 unmodified lines
5021 }5072 }
5022}5073}
5023 5074
5024// Background Render Data & rendering functions
5025class BackgroundRenderData {
5026public:
5027 typedef render::Payload<BackgroundRenderData> Payload;
5028 typedef Payload::DataPointer Pointer;
5029
5030 static render::ItemID _item; // unique WorldBoxRenderData
5031};
5032
5033render::ItemID BackgroundRenderData::_item = 0;
5034
5035namespace render {
5036 template <> const ItemKey payloadGetKey(const BackgroundRenderData::Pointer& stuff) {
5037 return ItemKey::Builder::background();
5038 }
5039
5040 template <> const Item::Bound payloadGetBound(const BackgroundRenderData::Pointer& stuff) {
5041 return Item::Bound();
5042 }
5043
5044 template <> void payloadRender(const BackgroundRenderData::Pointer& background, RenderArgs* args) {
5045 Q_ASSERT(args->_batch);
5046 gpu::Batch& batch = *args->_batch;
5047
5048 // Background rendering decision
5049 auto skyStage = DependencyManager::get<SceneScriptingInterface>()->getSkyStage();
5050 auto backgroundMode = skyStage->getBackgroundMode();
5051
5052 switch (backgroundMode) {
5053 case model::SunSkyStage::SKY_DEFAULT: {
5054 auto scene = DependencyManager::get<SceneScriptingInterface>()->getStage();
5055 auto sceneKeyLight = scene->getKeyLight();
5056
5057 scene->setSunModelEnable(false);
5058 sceneKeyLight->setColor(ColorUtils::toVec3(KeyLightPropertyGroup::DEFAULT_KEYLIGHT_COLOR));
5059 sceneKeyLight->setIntensity(KeyLightPropertyGroup::DEFAULT_KEYLIGHT_INTENSITY);
5060 sceneKeyLight->setAmbientIntensity(KeyLightPropertyGroup::DEFAULT_KEYLIGHT_AMBIENT_INTENSITY);
5061 sceneKeyLight->setDirection(KeyLightPropertyGroup::DEFAULT_KEYLIGHT_DIRECTION);
5062 // fall through: render a skybox (if available), or the defaults (if requested)
5063 }
5064
5065 case model::SunSkyStage::SKY_BOX: {
5066 auto skybox = skyStage->getSkybox();
5067 if (!skybox->empty()) {
5068 PerformanceTimer perfTimer("skybox");
5069 skybox->render(batch, args->getViewFrustum());
5070 break;
5071 }
5072 // fall through: render defaults (if requested)
5073 }
5074
5075 case model::SunSkyStage::SKY_DEFAULT_AMBIENT_TEXTURE: {
5076 if (Menu::getInstance()->isOptionChecked(MenuOption::DefaultSkybox)) {
5077 auto scene = DependencyManager::get<SceneScriptingInterface>()->getStage();
5078 auto sceneKeyLight = scene->getKeyLight();
5079 auto defaultSkyboxAmbientTexture = qApp->getDefaultSkyboxAmbientTexture();
5080 if (defaultSkyboxAmbientTexture) {
5081 sceneKeyLight->setAmbientSphere(defaultSkyboxAmbientTexture->getIrradiance());
5082 sceneKeyLight->setAmbientMap(defaultSkyboxAmbientTexture);
5083 } else {
5084 static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex(
5085 "Failed to get a valid Default Skybox Ambient Texture ? probably because it couldn't be find during initialization step");
5086 }
5087 // fall through: render defaults skybox
5088 } else {
5089 break;
5090 }
5091 }
5092
5093 case model::SunSkyStage::SKY_DEFAULT_TEXTURE:
5094 if (Menu::getInstance()->isOptionChecked(MenuOption::DefaultSkybox)) {
5095 qApp->getDefaultSkybox()->render(batch, args->getViewFrustum());
5096 }
5097 break;
5098
5099 // Any other cases require no extra rendering
5100 case model::SunSkyStage::NO_BACKGROUND:
5101 default:
5102 break;
5103 }
5104 }
5105}
5106
5107
5108void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool selfAvatarOnly) {5075void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool selfAvatarOnly) {
5109 5076
5110 // FIXME: This preDisplayRender call is temporary until we create a separate render::scene for the mirror rendering.5077 // FIXME: This preDisplayRender call is temporary until we create a separate render::scene for the mirror rendering.
@@ -5128,15 +5095,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se · 17 unmodified lines
5128 // The pending changes collecting the changes here5095 // The pending changes collecting the changes here
5129 render::Transaction transaction;5096 render::Transaction transaction;
5130 5097
5131 // FIXME: Move this out of here!, Background / skybox should be driven by the enityt content just like the other entities
5132 // Background rendering decision
5133 if (!render::Item::isValidID(BackgroundRenderData::_item)) {
5134 auto backgroundRenderData = make_shared<BackgroundRenderData>();
5135 auto backgroundRenderPayload = make_shared<BackgroundRenderData::Payload>(backgroundRenderData);
5136 BackgroundRenderData::_item = _main3DScene->allocateID();
5137 transaction.resetItem(BackgroundRenderData::_item, backgroundRenderPayload);
5138 }
5139
5140 // Assuming nothing gets rendered through that5098 // Assuming nothing gets rendered through that
5141 if (!selfAvatarOnly) {5099 if (!selfAvatarOnly) {
5142 if (DependencyManager::get<SceneScriptingInterface>()->shouldRenderEntities()) {5100 if (DependencyManager::get<SceneScriptingInterface>()->shouldRenderEntities()) {
@@ -5172,12 +5130,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se · 29 unmodified lines
5172 });5130 });
5173 }5131 }
5174 5132
5175 // Setup the current Zone Entity lighting
5176 {
5177 auto stage = DependencyManager::get<SceneScriptingInterface>()->getSkyStage();
5178 DependencyManager::get<DeferredLightingEffect>()->setGlobalLight(stage->getSunLight());
5179 }
5180
5181 {5133 {
5182 PerformanceTimer perfTimer("SceneProcessTransaction");5134 PerformanceTimer perfTimer("SceneProcessTransaction");
5183 _main3DScene->enqueueTransaction(transaction);5135 _main3DScene->enqueueTransaction(transaction);