X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2FBody.hpp;h=d90806584b0e43d37f1202d0dcddce7e8afe3d23;hb=3989da924c4e33c52f500aead5ae62bb40294781;hp=1b9e2e3a2a65036b75f370aa47a58b3730374545;hpb=c5556cf5f6813887a3503433c021ccd2e7fae865;p=blobs.git diff --git a/src/world/Body.hpp b/src/world/Body.hpp index 1b9e2e3..d908065 100644 --- a/src/world/Body.hpp +++ b/src/world/Body.hpp @@ -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 #include @@ -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 &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; } @@ -69,15 +78,35 @@ public: double GravitationalParameter() const noexcept; double OrbitalPeriod() const noexcept; double RotationalPeriod() 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; } - glm::dmat4 LocalTransform() const noexcept; - glm::dmat4 InverseTransform() const noexcept; + const glm::dmat4 &LocalTransform() const noexcept { return local; } + const glm::dmat4 &InverseTransform() const noexcept { return inverse_local; } - glm::dmat4 ToParent() const noexcept; - glm::dmat4 FromParent() const noexcept; + const glm::dmat4 &ToParent() const noexcept { return inverse_orbital; } + const glm::dmat4 &FromParent() const noexcept { return orbital; } + + 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 &Creatures() noexcept { return creatures; } + const std::vector &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,6 +115,7 @@ private: Simulation *sim; Body *parent; std::vector children; + std::string name; double mass; double radius; Orbit orbit; @@ -94,6 +124,14 @@ private: double rotation; double angular; + glm::dmat4 orbital; + glm::dmat4 inverse_orbital; + glm::dmat4 local; + glm::dmat4 inverse_local; + + std::vector creatures; + int atmosphere; + }; }