Moved pauseState from CelestiaCore to Simulation

Removed timeScale from CelestiaCore
Fixed pause behaviour with urls [bug 1819753]
Fixed track handling in urls when body with empty name exists [bug 1824833]
Fixed timeScale display in overlay
Added localization to numbers in flash messages
ver1_5_1
Christophe Teyssier 2007-11-03 09:49:29 +00:00
parent 0e9e7ffb7b
commit c60504c07a
6 changed files with 130 additions and 70 deletions

View File

@ -19,6 +19,8 @@ using namespace std;
Simulation::Simulation(Universe* _universe) :
realTime(0.0),
timeScale(1.0),
storedTimeScale(1.0),
pauseState(false),
syncTime(true),
universe(_universe),
closestSolarSystem(NULL),
@ -478,12 +480,19 @@ vector<std::string> Simulation::getObjectCompletion(string s, bool withLocations
double Simulation::getTimeScale() const
{
return timeScale;
return pauseState?storedTimeScale:timeScale;
}
void Simulation::setTimeScale(double _timeScale)
{
timeScale = _timeScale;
if (pauseState == true)
{
storedTimeScale = _timeScale;
}
else
{
timeScale = _timeScale;
}
}
bool Simulation::getSyncTime() const
@ -496,6 +505,27 @@ void Simulation::setSyncTime(bool sync)
syncTime = sync;
}
bool Simulation::getPauseState() const
{
return pauseState;
}
void Simulation::setPauseState(bool state)
{
if (pauseState == state) return;
pauseState = state;
if (pauseState == true)
{
storedTimeScale = timeScale;
timeScale = 0.0;
}
else
{
timeScale = storedTimeScale;
}
}
// Synchronize all observers to active observer time
void Simulation::synchronizeTime()
{

View File

@ -98,6 +98,8 @@ class Simulation
bool getSyncTime() const;
void setSyncTime(bool);
void synchronizeTime();
bool getPauseState() const;
void setPauseState(bool);
float getFaintestVisible() const;
void setFaintestVisible(float);
@ -126,6 +128,8 @@ class Simulation
std::vector<Observer*> observers;
float faintestVisible;
double storedTimeScale;
bool pauseState;
};
#endif // _CELENGINE_SIMULATION_H_

View File

@ -333,8 +333,6 @@ CelestiaCore::CelestiaCore() :
zoomTime(0.0),
sysTime(0.0),
currentTime(0.0),
timeScale(1.0),
paused(false),
joystickRotation(0.0f, 0.0f, 0.0f),
KeyAccel(1.0),
movieCapture(NULL),
@ -565,7 +563,7 @@ void CelestiaCore::runScript(const string& filename)
else
{
runningScript = new Execution(*script, *execEnv);
scriptState = ScriptRunning;
scriptState = sim->getPauseState()?ScriptPaused:ScriptRunning;
}
}
}
@ -614,7 +612,7 @@ void CelestiaCore::runScript(const string& filename)
}
else
{
scriptState = ScriptRunning;
scriptState = sim->getPauseState()?ScriptPaused:ScriptRunning;
}
}
}
@ -1553,17 +1551,15 @@ void CelestiaCore::charEntered(const char *c_p, int /*modifiers*/)
break;
case ' ':
if (paused)
if (sim->getPauseState() == true)
{
sim->setTimeScale(timeScale);
if (scriptState == ScriptPaused)
scriptState = ScriptRunning;
paused = false;
sim->setPauseState(false);
}
else
{
sim->setTimeScale(0.0);
paused = true;
sim->setPauseState(true);
// If there's a script running then pause it. This has the
// potentially confusing side effect of rendering nonfunctional
@ -1584,7 +1580,7 @@ void CelestiaCore::charEntered(const char *c_p, int /*modifiers*/)
}
}
if (paused)
if (sim->getPauseState() == true)
{
if (scriptState == ScriptPaused)
flash(_("Time and script are paused"));
@ -1724,7 +1720,9 @@ void CelestiaCore::charEntered(const char *c_p, int /*modifiers*/)
{
setFaintestAutoMag();
char buf[128];
setlocale(LC_NUMERIC, "");
sprintf(buf, _("Magnitude limit: %.2f"), sim->getFaintestVisible());
setlocale(LC_NUMERIC, "C");
flash(buf);
}
}
@ -1740,7 +1738,9 @@ void CelestiaCore::charEntered(const char *c_p, int /*modifiers*/)
{
setFaintestAutoMag();
char buf[128];
setlocale(LC_NUMERIC, "");
sprintf(buf, _("Magnitude limit: %.2f"), sim->getFaintestVisible());
setlocale(LC_NUMERIC, "C");
flash(buf);
}
}
@ -1842,10 +1842,8 @@ void CelestiaCore::charEntered(const char *c_p, int /*modifiers*/)
case 'J':
addToHistory();
timeScale = -timeScale;
if (!paused)
sim->setTimeScale(timeScale);
if (timeScale >= 0)
sim->setTimeScale(-sim->getTimeScale());
if (sim->getTimeScale() >= 0)
flash(_("Time: Forward"));
else
flash(_("Time: Backward"));
@ -1853,32 +1851,32 @@ void CelestiaCore::charEntered(const char *c_p, int /*modifiers*/)
case 'K':
addToHistory();
if (abs(timeScale) > MinimumTimeRate)
if (abs(sim->getTimeScale()) > MinimumTimeRate)
{
if (c == 'k')
timeScale /= CoarseTimeScaleFactor;
sim->setTimeScale(sim->getTimeScale() / CoarseTimeScaleFactor);
else
timeScale /= FineTimeScaleFactor;
if (!paused)
sim->setTimeScale(timeScale);
sim->setTimeScale(sim->getTimeScale() / FineTimeScaleFactor);
char buf[128];
sprintf(buf, _("Time rate: %g"), timeScale);
setlocale(LC_NUMERIC, "");
sprintf(buf, _("Time rate: %'.12g"), sim->getTimeScale());
setlocale(LC_NUMERIC, "C");
flash(buf);
}
break;
case 'L':
addToHistory();
if (abs(timeScale) < MaximumTimeRate)
if (abs(sim->getTimeScale()) < MaximumTimeRate)
{
if (c == 'l')
timeScale *= CoarseTimeScaleFactor;
sim->setTimeScale(sim->getTimeScale() * CoarseTimeScaleFactor);
else
timeScale *= FineTimeScaleFactor;
if (!paused)
sim->setTimeScale(timeScale);
sim->setTimeScale(sim->getTimeScale() * FineTimeScaleFactor);
char buf[128];
sprintf(buf, _("Time rate: %g"), timeScale);
setlocale(LC_NUMERIC, "");
sprintf(buf, _("Time rate: %'.12g"), sim->getTimeScale());
setlocale(LC_NUMERIC, "C");
flash(buf);
}
break;
@ -1987,7 +1985,9 @@ void CelestiaCore::charEntered(const char *c_p, int /*modifiers*/)
setFaintest(sim->getFaintestVisible() - 0.2f);
notifyWatchers(FaintestChanged);
char buf[128];
setlocale(LC_NUMERIC, "");
sprintf(buf, _("Magnitude limit: %.2f"),sim->getFaintestVisible());
setlocale(LC_NUMERIC, "C");
flash(buf);
}
}
@ -1996,16 +1996,16 @@ void CelestiaCore::charEntered(const char *c_p, int /*modifiers*/)
renderer->setFaintestAM45deg(renderer->getFaintestAM45deg() - 0.1f);
setFaintestAutoMag();
char buf[128];
setlocale(LC_NUMERIC, "");
sprintf(buf, _("Auto magnitude limit at 45 degrees: %.2f"),renderer->getFaintestAM45deg());
setlocale(LC_NUMERIC, "C");
flash(buf);
}
break;
case '\\':
addToHistory();
timeScale = 1.0f;
if (!paused)
sim->setTimeScale(timeScale);
sim->setTimeScale(1.0f);
break;
case ']':
@ -2016,7 +2016,9 @@ void CelestiaCore::charEntered(const char *c_p, int /*modifiers*/)
setFaintest(sim->getFaintestVisible() + 0.2f);
notifyWatchers(FaintestChanged);
char buf[128];
sprintf(buf, _("Magnitude limit: %.2f"),sim->getFaintestVisible());
setlocale(LC_NUMERIC, "");
sprintf(buf, _("Magnitude limit: %.2f"),sim->getFaintestVisible());
setlocale(LC_NUMERIC, "C");
flash(buf);
}
}
@ -2025,7 +2027,9 @@ void CelestiaCore::charEntered(const char *c_p, int /*modifiers*/)
renderer->setFaintestAM45deg(renderer->getFaintestAM45deg() + 0.1f);
setFaintestAutoMag();
char buf[128];
setlocale(LC_NUMERIC, "");
sprintf(buf, _("Auto magnitude limit at 45 degrees: %.2f"),renderer->getFaintestAM45deg());
setlocale(LC_NUMERIC, "C");
flash(buf);
}
break;
@ -2042,9 +2046,11 @@ void CelestiaCore::charEntered(const char *c_p, int /*modifiers*/)
renderer->setAmbientLightLevel(0.0f);
notifyWatchers(AmbientLightChanged);
char buf[128];
setlocale(LC_NUMERIC, "");
sprintf(buf, _("Ambient light level: %.2f"),renderer->getAmbientLightLevel());
flash(buf);
}
setlocale(LC_NUMERIC, "C");
flash(buf);
}
break;
case '}':
@ -2055,16 +2061,20 @@ void CelestiaCore::charEntered(const char *c_p, int /*modifiers*/)
renderer->setAmbientLightLevel(1.0f);
notifyWatchers(AmbientLightChanged);
char buf[128];
setlocale(LC_NUMERIC, "");
sprintf(buf, _("Ambient light level: %.2f"),renderer->getAmbientLightLevel());
flash(buf);
}
setlocale(LC_NUMERIC, "C");
flash(buf);
}
break;
case '(':
{
char buf[128];
Galaxy::decreaseLightGain();
setlocale(LC_NUMERIC, "");
sprintf(buf, "%s: %3.2f %%", _("Light gain"), Galaxy::getLightGain() * 100.0f);
setlocale(LC_NUMERIC, "C");
flash(buf);
notifyWatchers(GalaxyLightGainChanged);
}
@ -2074,7 +2084,9 @@ void CelestiaCore::charEntered(const char *c_p, int /*modifiers*/)
{
char buf[128];
Galaxy::increaseLightGain();
setlocale(LC_NUMERIC, "");
sprintf(buf, "%s: %3.2f %%", _("Light gain"), Galaxy::getLightGain() * 100.0f);
setlocale(LC_NUMERIC, "C");
flash(buf);
notifyWatchers(GalaxyLightGainChanged);
}
@ -2181,10 +2193,6 @@ void CelestiaCore::tick()
currentTime += dt;
// synchronize timeScale if it was changed by a script:
if (!paused && (timeScale != sim->getTimeScale()))
timeScale = sim->getTimeScale();
// Mouse wheel zoom
if (zoomMotion != 0.0f)
{
@ -3234,28 +3242,29 @@ void CelestiaCore::renderOverlay()
}
{
if (abs(abs(timeScale) - 1) < 1e-6)
if (abs(abs(sim->getTimeScale()) - 1) < 1e-6)
{
if (sign(timeScale) == 1)
if (sign(sim->getTimeScale()) == 1)
*overlay << _("Real time");
else
*overlay << _("-Real time");
}
else if (abs(timeScale) < MinimumTimeRate)
else if (abs(sim->getTimeScale()) < MinimumTimeRate)
{
*overlay << _("Time stopped");
}
else if (abs(timeScale) > 1.0)
else if (abs(sim->getTimeScale()) > 1.0)
{
*overlay << FormattedNumber(timeScale, 0, FormattedNumber::GroupThousands)
<< UTF8_MULTIPLICATION_SIGN << _(" faster");
overlay->oprintf("%'.12g", sim->getTimeScale());
*overlay << UTF8_MULTIPLICATION_SIGN << _(" faster");
}
else
{
*overlay << SigDigitNum(1.0 / timeScale, 1) << UTF8_MULTIPLICATION_SIGN << _(" slower");
overlay->oprintf("%'.12g", 1.0 / sim->getTimeScale());
*overlay << UTF8_MULTIPLICATION_SIGN << _(" slower");
}
if (paused)
if (sim->getPauseState() == true)
{
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
*overlay << _(" (Paused)");
@ -4417,7 +4426,6 @@ void CelestiaCore::goToUrl(const string& urlStr)
{
Url url(urlStr, this);
url.goTo();
timeScale = sim->getTimeScale();
notifyWatchers(RenderFlagsChanged | LabelFlagsChanged);
}
@ -4449,7 +4457,6 @@ void CelestiaCore::back()
}
historyCurrent--;
history[historyCurrent].goTo();
timeScale = sim->getTimeScale();
notifyWatchers(HistoryChanged|RenderFlagsChanged|LabelFlagsChanged);
}
@ -4460,7 +4467,6 @@ void CelestiaCore::forward()
if (historyCurrent == history.size()-1) return;
historyCurrent++;
history[historyCurrent].goTo();
timeScale = sim->getTimeScale();
notifyWatchers(HistoryChanged|RenderFlagsChanged|LabelFlagsChanged);
}

View File

@ -414,8 +414,6 @@ class CelestiaCore // : public Watchable<CelestiaCore>
double sysTime;
double currentTime;
double timeScale;
bool paused;
Vec3f joystickRotation;
bool joyButtonsPressed[JoyButtonCount];

View File

@ -26,10 +26,11 @@ static const unsigned int CurrentCelestiaURLVersion = 2;
Url::Url()
{};
Url::Url(const std::string& str, CelestiaCore *core)
Url::Url(const std::string& str, CelestiaCore *core):
urlStr(str),
appCore(core),
pauseState(false)
{
urlStr = str;
appCore = core;
std::string::size_type pos, endPrevious;
std::vector<Selection> bodies;
Simulation *sim = appCore->getSimulation();
@ -190,6 +191,9 @@ Url::Url(const std::string& str, CelestiaCore *core)
if (params["ts"] != "") {
sscanf(params["ts"].c_str(), "%f", &timeScale);
}
if (params["p"] != "") {
sscanf(params["p"].c_str(), "%d", &pauseState);
}
break;
case Settings:
break;
@ -268,9 +272,10 @@ Url::Url(CelestiaCore* core, UrlType type)
fieldOfView = radToDeg(sim->getActiveObserver()->getFOV());
timeScale = (float) sim->getTimeScale();
pauseState = sim->getPauseState();
lightTimeDelay = appCore->getLightDelayActive();
sprintf(buff, "&fov=%f&ts=%f&ltd=%c&", fieldOfView,
timeScale, lightTimeDelay?'1':'0');
sprintf(buff, "&fov=%f&ts=%f&ltd=%c&p=%c&", fieldOfView,
timeScale, lightTimeDelay?'1':'0', pauseState?'1':'0');
urlStr += buff;
case Settings: // Intentional Fall-Through
renderFlags = renderer->getRenderFlags();
@ -466,25 +471,41 @@ void Url::goTo()
sim->getActiveObserver()->setFOV(degToRad(fieldOfView));
appCore->setZoomFromFOV();
sim->setTimeScale(timeScale);
sim->setPauseState(pauseState);
appCore->setLightDelayActive(lightTimeDelay);
pos = 0;
while(pos != std::string::npos)
if (selectedStr != "")
{
pos = selectedStr.find(":", pos + 1);
if (pos != std::string::npos) selectedStr[pos]='/';
pos = 0;
while(pos != std::string::npos)
{
pos = selectedStr.find(":", pos + 1);
if (pos != std::string::npos) selectedStr[pos]='/';
}
sel = sim->findObjectFromPath(selectedStr);
sim->setSelection(sel);
}
else
{
sim->setSelection(Selection());
}
sel = sim->findObjectFromPath(selectedStr);
sim->setSelection(sel);
pos = 0;
while(pos != std::string::npos)
if (trackedStr != "")
{
pos = trackedStr.find(":", pos + 1);
if (pos != std::string::npos) trackedStr[pos]='/';
pos = 0;
while(pos != std::string::npos)
{
pos = trackedStr.find(":", pos + 1);
if (pos != std::string::npos) trackedStr[pos]='/';
}
sel = sim->findObjectFromPath(trackedStr);
sim->setTrackedObject(sel);
}
else
{
if (!sim->getTrackedObject().empty())
sim->setTrackedObject(Selection());
}
sel = sim->findObjectFromPath(trackedStr);
sim->setTrackedObject(sel);
// Intentional Fall-Through
case Settings:
renderer->setRenderFlags(renderFlags);

View File

@ -63,6 +63,7 @@ private:
int renderFlags;
int labelMode;
bool lightTimeDelay;
bool pauseState;
std::map<std::string, std::string> parseUrlParams(const std::string& url) const;
std::string getCoordSysName(astro::CoordinateSystem mode) const;