]> git.localhorst.tv Git - blobs.git/blobdiff - src/world/Body.hpp
remove surface tilt
[blobs.git] / src / world / Body.hpp
index 1b9e2e3a2a65036b75f370aa47a58b3730374545..1e32e6d020a41d71392d4f7ce68865aba6d96aaf 100644 (file)
@@ -2,8 +2,10 @@
 #define BLOBS_WORLD_BODY_HPP_
 
 #include "Orbit.hpp"
-#include "../graphics/glm.hpp"
+#include "../math/geometry.hpp"
+#include "../math/glm.hpp"
 
+#include <string>
 #include <vector>
 
 
@@ -11,6 +13,9 @@ namespace blobs {
 namespace app {
        class Assets;
 }
+namespace creature {
+       class Creature;
+}
 namespace graphics {
        class Viewport;
 }
@@ -32,6 +37,7 @@ public:
 
 public:
        bool HasSimulation() const noexcept { return sim; }
+       Simulation &GetSimulation() noexcept { return *sim; }
        const Simulation &GetSimulation() const noexcept { return *sim; }
        void SetSimulation(Simulation &) noexcept;
 
@@ -43,6 +49,9 @@ public:
 
        const std::vector<Body *> &Children() const noexcept { return children; }
 
+       const std::string &Name() const noexcept { return name; }
+       void Name(const std::string &n) noexcept { name = n; }
+
        double Mass() const noexcept { return mass; }
        void Mass(double m) noexcept { mass = m; }
 
@@ -52,9 +61,6 @@ public:
        Orbit &GetOrbit() noexcept { return orbit; }
        const Orbit &GetOrbit() const noexcept { return orbit; }
 
-       const glm::dvec2 &SurfaceTilt() const noexcept { return surface_tilt; }
-       void SurfaceTilt(const glm::dvec2 &t) noexcept { surface_tilt = t; }
-
        const glm::dvec2 &AxialTilt() const noexcept { return axis_tilt; }
        void AxialTilt(const glm::dvec2 &t) noexcept { axis_tilt = t; }
 
@@ -69,15 +75,39 @@ 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() }; }
+       const glm::dmat4 &CollisionTransform() const noexcept { return local; }
+
+       const glm::dmat4 &LocalTransform() const noexcept { return local; }
+       const glm::dmat4 &InverseTransform() const noexcept { return inverse_local; }
 
-       glm::dmat4 LocalTransform() const noexcept;
-       glm::dmat4 InverseTransform() const noexcept;
+       const glm::dmat4 &ToParent() const noexcept { return inverse_orbital; }
+       const glm::dmat4 &FromParent() const noexcept { return orbital; }
 
-       glm::dmat4 ToParent() const noexcept;
-       glm::dmat4 FromParent() const noexcept;
+       glm::dmat4 ToUniverse() const noexcept;
+       glm::dmat4 FromUniverse() const noexcept;
 
        virtual void Draw(app::Assets &, graphics::Viewport &) { }
 
+       void Tick(double dt);
+       void Cache() noexcept;
+       void CheckCollision() noexcept;
+
+       void AddCreature(creature::Creature *);
+       void RemoveCreature(creature::Creature *);
+       std::vector<creature::Creature *> &Creatures() noexcept { return creatures; }
+       const std::vector<creature::Creature *> &Creatures() const noexcept { return creatures; }
+
+       void Atmosphere(int a) noexcept { atmosphere = a; }
+       int Atmosphere() const noexcept { return atmosphere; }
+       bool HasAtmosphere() const noexcept { return atmosphere >= 0; }
+
 private:
        void AddChild(Body &);
        void RemoveChild(Body &);
@@ -86,14 +116,22 @@ private:
        Simulation *sim;
        Body *parent;
        std::vector<Body *> children;
+       std::string name;
        double mass;
        double radius;
        Orbit orbit;
-       glm::dvec2 surface_tilt;
        glm::dvec2 axis_tilt;
        double rotation;
        double angular;
 
+       glm::dmat4 orbital;
+       glm::dmat4 inverse_orbital;
+       glm::dmat4 local;
+       glm::dmat4 inverse_local;
+
+       std::vector<creature::Creature *> creatures;
+       int atmosphere;
+
 };
 
 }