Some work on cleaning up Missions

This commit is contained in:
Alexander Bock
2016-09-24 20:28:03 +02:00
parent 49308c658c
commit 3d894c38e3
5 changed files with 36 additions and 29 deletions

View File

@@ -61,12 +61,10 @@ public:
*/
const MissionPhase& phase(size_t i) const;
std::list<const MissionPhase*> phaseTrace(double time, int maxDepth = -1) const;
//TimeRange parseTimeRange(const ghoul::Dictionary& dict);
std::vector<const MissionPhase*> phaseTrace(double time, int maxDepth = -1) const;
protected:
bool phaseTrace(double time, std::list<const MissionPhase*>& trace, int maxDepth) const;
bool phaseTrace(double time, std::vector<const MissionPhase*>& trace, int maxDepth) const;
std::string _name;
std::string _description;

View File

@@ -25,18 +25,15 @@
#ifndef __MISSIONPHASEEQUENCER_H__
#define __MISSIONPHASEEQUENCER_H__
#include <vector>
#include <list>
#include <string>
#include <unordered_map>
#include <openspace/util/timerange.h>
#include <openspace/mission/mission.h>
#include <ghoul/misc/dictionary.h>
#include <ghoul/lua/ghoul_lua.h>
#include <map>
#include <string>
namespace openspace {
namespace scripting { struct LuaLibrary; }
/**
* Singleton class keeping track of space missions.
*/
@@ -58,7 +55,7 @@ public:
* Sets the mission with the name <missionName> 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<std::string, Mission> MissionMap;
//typedef std::map<std::string, Mission> MissionMap;
using MissionMap = std::map<std::string, Mission>;
MissionMap _missionMap;
MissionMap::iterator _currentMissionIter;
MissionMap::iterator _currentMission;
// Singleton
MissionManager();

View File

@@ -124,8 +124,8 @@ const MissionPhase& MissionPhase::phase(size_t i) const {
return _subphases[i];
}
std::list<const MissionPhase*> MissionPhase::phaseTrace(double time, int maxDepth) const {
std::list<const MissionPhase*> trace;
std::vector<const MissionPhase*> MissionPhase::phaseTrace(double time, int maxDepth) const {
std::vector<const MissionPhase*> trace;
if (_timeRange.includes(time)) {
trace.push_back(this);
phaseTrace(time, trace, maxDepth);
@@ -133,7 +133,7 @@ std::list<const MissionPhase*> MissionPhase::phaseTrace(double time, int maxDept
return std::move(trace);
}
bool MissionPhase::phaseTrace(double time, std::list<const MissionPhase*>& trace, int maxDepth) const {
bool MissionPhase::phaseTrace(double time, std::vector<const MissionPhase*>& trace, int maxDepth) const {
if (maxDepth == 0) {
return false;
}

View File

@@ -22,10 +22,13 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
#include <openspace/mission/missionmanager.h>
#include <ghoul/misc/assert.h>
#include <assert.h>
#include <ghoul/filesystem/filesystem.h>
#include <openspace/util/spicemanager.h>
#include <openspace/mission/missionmanager.h>
#include <openspace/engine/openspaceengine.h>
#include <openspace/scripting/scriptengine.h>
@@ -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

View File

@@ -1364,7 +1364,7 @@ void RenderEngine::renderInformation() {
// Add spacing
RenderFontCr(*_fontInfo, penPosition, nonCurrentMissionColor, " ");
std::list<const MissionPhase*> phaseTrace = mission.phaseTrace(currentTime);
std::vector<const MissionPhase*> phaseTrace = mission.phaseTrace(currentTime);
if (phaseTrace.size()) {
std::string title = "Current Mission Phase: " + phaseTrace.back()->name();