From 3d894c38e3fe810c349dee745c7900c82f7ffb57 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Sat, 24 Sep 2016 20:28:03 +0200 Subject: [PATCH] Some work on cleaning up Missions --- include/openspace/mission/mission.h | 6 ++-- include/openspace/mission/missionmanager.h | 19 ++++++------- src/mission/mission.cpp | 6 ++-- src/mission/missionmanager.cpp | 32 ++++++++++++++-------- src/rendering/renderengine.cpp | 2 +- 5 files changed, 36 insertions(+), 29 deletions(-) diff --git a/include/openspace/mission/mission.h b/include/openspace/mission/mission.h index c879bb4837..d3ec9e1e34 100644 --- a/include/openspace/mission/mission.h +++ b/include/openspace/mission/mission.h @@ -61,12 +61,10 @@ public: */ const MissionPhase& phase(size_t i) const; - std::list phaseTrace(double time, int maxDepth = -1) const; - - //TimeRange parseTimeRange(const ghoul::Dictionary& dict); + std::vector phaseTrace(double time, int maxDepth = -1) const; protected: - bool phaseTrace(double time, std::list& trace, int maxDepth) const; + bool phaseTrace(double time, std::vector& trace, int maxDepth) const; std::string _name; std::string _description; diff --git a/include/openspace/mission/missionmanager.h b/include/openspace/mission/missionmanager.h index 52888afa81..dafc3398a2 100644 --- a/include/openspace/mission/missionmanager.h +++ b/include/openspace/mission/missionmanager.h @@ -25,18 +25,15 @@ #ifndef __MISSIONPHASEEQUENCER_H__ #define __MISSIONPHASEEQUENCER_H__ -#include -#include -#include -#include -#include #include -#include -#include +#include +#include namespace openspace { +namespace scripting { struct LuaLibrary; } + /** * Singleton class keeping track of space missions. */ @@ -58,7 +55,7 @@ public: * Sets the mission with the name as the current mission. The current * mission is what is return by `currentMission()`. */ - void setCurrentMission(const std::string missionName); + void setCurrentMission(const std::string& missionName); /** * Returns true if a current mission exists @@ -76,9 +73,11 @@ private: static scripting::LuaLibrary luaLibrary(); static MissionManager* _instance; - typedef std::unordered_map MissionMap; + //typedef std::map MissionMap; + using MissionMap = std::map; MissionMap _missionMap; - MissionMap::iterator _currentMissionIter; + + MissionMap::iterator _currentMission; // Singleton MissionManager(); diff --git a/src/mission/mission.cpp b/src/mission/mission.cpp index 20696218d9..6a4fdb4907 100644 --- a/src/mission/mission.cpp +++ b/src/mission/mission.cpp @@ -124,8 +124,8 @@ const MissionPhase& MissionPhase::phase(size_t i) const { return _subphases[i]; } -std::list MissionPhase::phaseTrace(double time, int maxDepth) const { - std::list trace; +std::vector MissionPhase::phaseTrace(double time, int maxDepth) const { + std::vector trace; if (_timeRange.includes(time)) { trace.push_back(this); phaseTrace(time, trace, maxDepth); @@ -133,7 +133,7 @@ std::list MissionPhase::phaseTrace(double time, int maxDept return std::move(trace); } -bool MissionPhase::phaseTrace(double time, std::list& trace, int maxDepth) const { +bool MissionPhase::phaseTrace(double time, std::vector& trace, int maxDepth) const { if (maxDepth == 0) { return false; } diff --git a/src/mission/missionmanager.cpp b/src/mission/missionmanager.cpp index a3b89138f9..82fc620825 100644 --- a/src/mission/missionmanager.cpp +++ b/src/mission/missionmanager.cpp @@ -22,10 +22,13 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ +#include + +#include + #include #include #include -#include #include #include @@ -44,12 +47,12 @@ namespace openspace { MissionManager* MissionManager::_instance = nullptr; MissionManager& MissionManager::ref() { - assert(_instance != nullptr); + ghoul_assert(_instance, "Instance has not been initiated"); return *_instance; } void MissionManager::initialize() { - assert(_instance == nullptr); + ghoul_assert(!_instance, "Instance has been initialized before"); _instance = new MissionManager; OsEng.scriptEngine().addLibrary(MissionManager::luaLibrary()); } @@ -59,13 +62,13 @@ void MissionManager::deinitialize() { _instance = nullptr; } -void MissionManager::setCurrentMission(const std::string missionName) { +void MissionManager::setCurrentMission(const std::string& missionName) { auto it = _missionMap.find(missionName); if (it == _missionMap.end()) { LWARNING("Mission with name \"" << missionName << "\" has not been loaded!"); } else { - _currentMissionIter = it; + _currentMission = it; } } @@ -74,23 +77,28 @@ void MissionManager::setCurrentMission(const std::string missionName) { */ bool MissionManager::hasCurrentMission() const { - return _currentMissionIter != _missionMap.end(); + return _currentMission != _missionMap.end(); } void MissionManager::loadMission(const std::string& filepath) { + // Changing the values might invalidate the _currentMission iterator + const std::string& currentMission = _currentMission->first; + Mission mission(filepath); - _missionMap[mission.name()] = mission; + _missionMap[mission.name()] = std::move(mission); if (_missionMap.size() == 1) { setCurrentMission(mission.name()); } + + setCurrentMission(currentMission); } const Mission& MissionManager::currentMission() { - if (_currentMissionIter == _missionMap.end()) { + if (_currentMission == _missionMap.end()) { LWARNING("No current mission has been specified. returning dummy mission"); return Mission(); } - return _currentMissionIter->second; + return _currentMission->second; } namespace luascriptfunctions { @@ -122,7 +130,7 @@ namespace luascriptfunctions { } // namespace luascriptfunction scripting::LuaLibrary MissionManager::luaLibrary() { - return{ + return { "", { { @@ -143,6 +151,8 @@ scripting::LuaLibrary MissionManager::luaLibrary() { // Singleton -inline MissionManager::MissionManager() : _currentMissionIter(_missionMap.end()) {} +MissionManager::MissionManager() + : _currentMission(_missionMap.end()) +{} } // namespace openspace diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 12a922476f..54f7b92a33 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -1364,7 +1364,7 @@ void RenderEngine::renderInformation() { // Add spacing RenderFontCr(*_fontInfo, penPosition, nonCurrentMissionColor, " "); - std::list phaseTrace = mission.phaseTrace(currentTime); + std::vector phaseTrace = mission.phaseTrace(currentTime); if (phaseTrace.size()) { std::string title = "Current Mission Phase: " + phaseTrace.back()->name();