]> git.localhorst.tv Git - blobs.git/blob - src/world/Body.hpp
more orbits and stuff
[blobs.git] / src / world / Body.hpp
1 #ifndef BLOBS_WORLD_BODY_HPP_
2 #define BLOBS_WORLD_BODY_HPP_
3
4 #include "Orbit.hpp"
5 #include "../graphics/glm.hpp"
6
7 #include <vector>
8
9
10 namespace blobs {
11 namespace app {
12         class Assets;
13 }
14 namespace graphics {
15         class Viewport;
16 }
17 namespace world {
18
19 class Simulation;
20
21 class Body {
22
23 public:
24         Body();
25         ~Body();
26
27         Body(const Body &) = delete;
28         Body &operator =(const Body &) = delete;
29
30         Body(Body &&) = delete;
31         Body &operator =(Body &&) = delete;
32
33 public:
34         bool HasSimulation() const noexcept { return sim; }
35         const Simulation &GetSimulation() const noexcept { return *sim; }
36         void SetSimulation(Simulation &) noexcept;
37
38         bool HasParent() const { return parent; }
39         Body &Parent() { return *parent; }
40         const Body &Parent() const { return *parent; }
41         void SetParent(Body &);
42         void UnsetParent();
43
44         const std::vector<Body *> &Children() const noexcept { return children; }
45
46         double Mass() const noexcept { return mass; }
47         void Mass(double m) noexcept { mass = m; }
48
49         double Radius() const noexcept { return radius; }
50         void Radius(double r) noexcept { radius = r; }
51
52         Orbit &GetOrbit() noexcept { return orbit; }
53         const Orbit &GetOrbit() const noexcept { return orbit; }
54
55         const glm::dvec2 &SurfaceTilt() const noexcept { return surface_tilt; }
56         void SurfaceTilt(const glm::dvec2 &t) noexcept { surface_tilt = t; }
57
58         const glm::dvec2 &AxialTilt() const noexcept { return axis_tilt; }
59         void AxialTilt(const glm::dvec2 &t) noexcept { axis_tilt = t; }
60
61         double Rotation() const noexcept { return rotation; }
62         void Rotation(double r) noexcept { rotation = r; }
63
64         double AngularMomentum() const noexcept { return angular; }
65         void AngularMomentum(double m) noexcept { angular = m; }
66
67         double Inertia() const noexcept;
68
69         double GravitationalParameter() const noexcept;
70         double OrbitalPeriod() const noexcept;
71         double RotationalPeriod() const noexcept;
72
73         glm::dmat4 LocalTransform() const noexcept;
74         glm::dmat4 InverseTransform() const noexcept;
75
76         glm::dmat4 ToParent() const noexcept;
77         glm::dmat4 FromParent() const noexcept;
78
79         virtual void Draw(app::Assets &, graphics::Viewport &) { }
80
81 private:
82         void AddChild(Body &);
83         void RemoveChild(Body &);
84
85 private:
86         Simulation *sim;
87         Body *parent;
88         std::vector<Body *> children;
89         double mass;
90         double radius;
91         Orbit orbit;
92         glm::dvec2 surface_tilt;
93         glm::dvec2 axis_tilt;
94         double rotation;
95         double angular;
96
97 };
98
99 }
100 }
101
102 #endif