]> git.localhorst.tv Git - blobs.git/commitdiff
real days
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 15 Dec 2017 17:40:54 +0000 (18:40 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 15 Dec 2017 17:40:54 +0000 (18:40 +0100)
src/ui/ui.cpp
src/world/Body.hpp
src/world/world.cpp

index c361df55b06858c9d1271cf9c0fc37aa320c4f02..05fd499f376a333dc0b8d0e477fef48bfd9a4ca1 100644 (file)
@@ -546,7 +546,7 @@ void TimePanel::Draw(graphics::Viewport &viewport) noexcept {
        live->Text(NumberString(sim.LiveCreatures().size()));
        time->Text(TimeString(sim.Time()));
        if (body) {
-               clock->Text(TimeString(std::fmod(sim.Time(), body->RotationalPeriod())));
+               clock->Text(TimeString(std::fmod(sim.Time(), body->DayLength())) + " / " + TimeString(body->DayLength()));
        } else {
                clock->Text("no reference");
        }
index d90806584b0e43d37f1202d0dcddce7e8afe3d23..6f85efd97b4946db46f224ef143e9b91ea1ec1b5 100644 (file)
@@ -78,6 +78,10 @@ public:
        double GravitationalParameter() const noexcept;
        double OrbitalPeriod() const noexcept;
        double RotationalPeriod() const noexcept;
+       /// day length relative to parent, not neccessarily a sun
+       /// gives absolute value in seconds
+       /// returns sidereal day for parent-less bodies
+       double DayLength() const noexcept;
        double SphereOfInfluence() const noexcept;
 
        math::Sphere CollisionBounds() const noexcept { return math::Sphere{ glm::dvec3(0.0), Radius() }; }
index 1758c5e431ea4ebfb862dde58b4290408b5dd0e5..525222f284b77c9c6bc57cd3a40df77849be5fd8 100644 (file)
@@ -115,6 +115,16 @@ double Body::RotationalPeriod() const noexcept {
        }
 }
 
+double Body::DayLength() const noexcept {
+       if (!HasParent()) {
+               return RotationalPeriod();
+       }
+       double year = OrbitalPeriod();
+       double sidereal = RotationalPeriod();
+       double grade = (angular < 0.0 ? -1.0 : 1.0) * (std::abs(axis_tilt.x) > PI * 0.5 ? -1.0 : 1.0);
+       return std::abs((year * sidereal) / ( year + (grade * sidereal)));
+}
+
 double Body::SphereOfInfluence() const noexcept {
        if (HasParent()) {
                return orbit.SemiMajorAxis() * std::pow(Mass() / Parent().Mass(), 2.0 / 5.0);