mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-02-25 22:39:04 -06:00
270 lines
8.2 KiB
C++
270 lines
8.2 KiB
C++
/*****************************************************************************************
|
|
* *
|
|
* OpenSpace *
|
|
* *
|
|
* Copyright (c) 2014-2016 *
|
|
* *
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of this *
|
|
* software and associated documentation files (the "Software"), to deal in the Software *
|
|
* without restriction, including without limitation the rights to use, copy, modify, *
|
|
* merge, publish, distribute, sublicense, and/or sell copies of the Software, and to *
|
|
* permit persons to whom the Software is furnished to do so, subject to the following *
|
|
* conditions: *
|
|
* *
|
|
* The above copyright notice and this permission notice shall be included in all copies *
|
|
* or substantial portions of the Software. *
|
|
* *
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, *
|
|
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A *
|
|
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT *
|
|
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF *
|
|
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE *
|
|
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
|
|
****************************************************************************************/
|
|
|
|
#include <openspace/util/time.h>
|
|
|
|
#include <time.h>
|
|
|
|
#include "time_lua.inl"
|
|
|
|
#include <openspace/util/spicemanager.h>
|
|
#include <openspace/util/syncbuffer.h>
|
|
|
|
#include <ghoul/filesystem/filesystem.h>
|
|
#include <ghoul/misc/assert.h>
|
|
|
|
|
|
|
|
|
|
namespace openspace {
|
|
|
|
Time* Time::_instance = nullptr;
|
|
|
|
Time::Time(double secondsJ2000)
|
|
{
|
|
local.time = secondsJ2000;
|
|
}
|
|
|
|
|
|
Time::Time(const Time& other)
|
|
: local(other.local)
|
|
, synced(other.synced)
|
|
{
|
|
|
|
}
|
|
|
|
void Time::initialize() {
|
|
ghoul_assert(_instance == nullptr, "Static time must not have been ininitialized");
|
|
_instance = new Time();
|
|
}
|
|
|
|
void Time::deinitialize() {
|
|
ghoul_assert(_instance, "Static time must have been ininitialized");
|
|
delete _instance;
|
|
_instance = nullptr;
|
|
}
|
|
|
|
Time& Time::ref() {
|
|
ghoul_assert(_instance, "Static time must have been ininitialized");
|
|
return *_instance;
|
|
}
|
|
|
|
Time Time::now() {
|
|
Time now;
|
|
time_t secondsSince1970;
|
|
secondsSince1970 = time(nullptr);
|
|
time_t secondsInAYear = 365.25 * 24 * 60 * 60;
|
|
double secondsSince2000 = (double)(secondsSince1970 - 30*secondsInAYear);
|
|
now.setTime(secondsSince2000);
|
|
return now;
|
|
}
|
|
|
|
|
|
bool Time::isInitialized() {
|
|
return (_instance != nullptr);
|
|
}
|
|
|
|
void Time::setTime(double value, bool requireJump) {
|
|
local.time = value;
|
|
local.timeJumped = requireJump;
|
|
}
|
|
|
|
double Time::j2000Seconds() const {
|
|
return local.time;
|
|
}
|
|
|
|
double Time::advanceTime(double tickTime) {
|
|
if (_timePaused)
|
|
return local.time;
|
|
else
|
|
return local.time += local.dt * tickTime;
|
|
}
|
|
|
|
void Time::setDeltaTime(double deltaT) {
|
|
local.dt = deltaT;
|
|
}
|
|
|
|
double Time::deltaTime() const {
|
|
return local.dt;
|
|
}
|
|
|
|
void Time::setPause(bool pause) {
|
|
_timePaused = pause;
|
|
}
|
|
|
|
bool Time::togglePause() {
|
|
_timePaused = !_timePaused;
|
|
return _timePaused;
|
|
}
|
|
|
|
void Time::setTime(std::string time, bool requireJump) {
|
|
local.time = SpiceManager::ref().ephemerisTimeFromDate(std::move(time));
|
|
local.timeJumped = requireJump;
|
|
}
|
|
|
|
std::string Time::UTC() const {
|
|
return SpiceManager::ref().dateFromEphemerisTime(local.time);
|
|
}
|
|
|
|
std::string Time::ISO8601() const {
|
|
std::string datetime = SpiceManager::ref().dateFromEphemerisTime(local.time);
|
|
std::string month = datetime.substr(5, 3);
|
|
|
|
std::string MM = "";
|
|
if (month == "JAN") MM = "01";
|
|
else if (month == "FEB") MM = "02";
|
|
else if (month == "MAR") MM = "03";
|
|
else if (month == "APR") MM = "04";
|
|
else if (month == "MAY") MM = "05";
|
|
else if (month == "JUN") MM = "06";
|
|
else if (month == "JUL") MM = "07";
|
|
else if (month == "AUG") MM = "08";
|
|
else if (month == "SEP") MM = "09";
|
|
else if (month == "OCT") MM = "10";
|
|
else if (month == "NOV") MM = "11";
|
|
else if (month == "DEC") MM = "12";
|
|
else ghoul_assert(false, "Bad month");
|
|
|
|
datetime.replace(4, 5, "-" + MM + "-");
|
|
return datetime;
|
|
}
|
|
|
|
void Time::serialize(SyncBuffer* syncBuffer) {
|
|
_syncMutex.lock();
|
|
local.serialize(syncBuffer);
|
|
_syncMutex.unlock();
|
|
}
|
|
|
|
void Time::deserialize(SyncBuffer* syncBuffer, bool useDoubleBuffering) {
|
|
_syncMutex.lock();
|
|
if (useDoubleBuffering) {
|
|
synced.deserialize(syncBuffer);
|
|
}
|
|
else {
|
|
local.deserialize(syncBuffer);
|
|
}
|
|
_syncMutex.unlock();
|
|
}
|
|
|
|
bool Time::timeJumped() const {
|
|
return local.timeJumped;
|
|
}
|
|
|
|
void Time::setTimeJumped(bool jumped) {
|
|
local.timeJumped = jumped;
|
|
}
|
|
|
|
bool Time::paused() const {
|
|
return _timePaused;
|
|
}
|
|
void Time::updateDoubleBuffer() {
|
|
_syncMutex.lock();
|
|
local = synced;
|
|
_syncMutex.unlock();
|
|
}
|
|
|
|
void Time::SyncData::serialize(SyncBuffer* syncBuffer) {
|
|
syncBuffer->encode(time);
|
|
syncBuffer->encode(dt);
|
|
syncBuffer->encode(timeJumped);
|
|
};
|
|
|
|
void Time::SyncData::deserialize(SyncBuffer* syncBuffer) {
|
|
syncBuffer->decode(time);
|
|
syncBuffer->decode(dt);
|
|
syncBuffer->decode(timeJumped);
|
|
}
|
|
|
|
|
|
scripting::LuaLibrary Time::luaLibrary() {
|
|
return {
|
|
"time",
|
|
{
|
|
{
|
|
"setDeltaTime",
|
|
&luascriptfunctions::time_setDeltaTime,
|
|
"number",
|
|
"Sets the amount of simulation time that happens "
|
|
"in one second of real time",
|
|
true
|
|
},
|
|
{
|
|
"deltaTime",
|
|
&luascriptfunctions::time_deltaTime,
|
|
"",
|
|
"Returns the amount of simulated time that passes in one "
|
|
"second of real time"
|
|
},
|
|
{
|
|
"setPause",
|
|
&luascriptfunctions::time_setPause,
|
|
"bool",
|
|
"Pauses the simulation time or restores the delta time",
|
|
true
|
|
},
|
|
{
|
|
"togglePause",
|
|
&luascriptfunctions::time_togglePause,
|
|
"",
|
|
"Toggles the pause function, i.e. temporarily setting the delta time to 0"
|
|
" and restoring it afterwards",
|
|
true
|
|
},
|
|
{
|
|
"setTime",
|
|
&luascriptfunctions::time_setTime,
|
|
"{number, string}",
|
|
"Sets the current simulation time to the "
|
|
"specified value. If the parameter is a number, the value is the number "
|
|
"of seconds past the J2000 epoch. If it is a string, it has to be a "
|
|
"valid ISO 8601 date string (YYYY-MM-DDTHH:MN:SS)",
|
|
true
|
|
},
|
|
{
|
|
"currentTime",
|
|
&luascriptfunctions::time_currentTime,
|
|
"",
|
|
"Returns the current time as the number of seconds since "
|
|
"the J2000 epoch"
|
|
},
|
|
{
|
|
"UTC",
|
|
&luascriptfunctions::time_currentTimeUTC,
|
|
"",
|
|
"Returns the current time as an ISO 8601 date string "
|
|
"(YYYY-MM-DDTHH:MN:SS)"
|
|
},
|
|
{
|
|
"currentWallTime",
|
|
&luascriptfunctions::time_currentWallTime,
|
|
"",
|
|
"Returns the current wall time as an ISO 8601 date string "
|
|
"(YYYY-MM-DDTHH-MN-SS) in the UTC timezone"
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
} // namespace openspace
|