Pioneer
Loading...
Searching...
No Matches
Frame.h
Go to the documentation of this file.
1// Copyright © 2008-2023 Pioneer Developers. See AUTHORS.txt for details
2// Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3
4#ifndef _FRAME_H
5#define _FRAME_H
6
7#include "FrameId.h"
8
9#include "IterationProxy.h"
10#include "JsonFwd.h"
11#include "matrix3x3.h"
12#include "matrix4x4.h"
13#include "vector3.h"
14#include <list>
15#include <string>
16
17class Body;
18class CollisionSpace;
19class Geom;
20class SystemBody;
21class SfxManager;
22class Space;
23
24struct CollisionContact;
25
26// Frame of reference.
27
28class Frame {
29 // Used to avoid direct instantiation of Frames: use factory methods instead.
30 // TODO: Find a better way, as checking it at compile time
31 struct Dummy;
32
33public:
34 Frame() = delete;
35 Frame(const Dummy &d, FrameId parent, const char *label, unsigned int flags = FLAG_DEFAULT, double radius = 0.0);
36 // Used *only* for Camera frame:
37 // it doesn't set up CollisionSpace, and use default values for label, flags and radius
38 Frame(const Dummy &d, FrameId parent);
39
40 Frame(const Frame &) = delete;
41 Frame(Frame &&) noexcept;
42 Frame &operator=(Frame &&);
43
44 ~Frame();
45
46 enum { FLAG_DEFAULT = (0),
47 FLAG_ROTATING = (1 << 1),
48 FLAG_HAS_ROT = (1 << 2) };
49
50 static FrameId CreateFrame(FrameId parent, const char *label, unsigned int flags = FLAG_DEFAULT, double radius = 0.0);
51 static FrameId FromJson(const Json &jsonObj, Space *space, FrameId parent, double at_time);
52
53 // Used to speed up creation/deletion of Frame for camera
54 static FrameId CreateCameraFrame(FrameId parent);
55 static void DeleteCameraFrame(FrameId camera);
56
57 static void ToJson(Json &jsonObj, FrameId fId, Space *space);
58 static void PostUnserializeFixup(FrameId fId, Space *space);
59
60 static void DeleteFrames();
61
62 static Frame *GetFrame(FrameId FId);
63
64 FrameId GetId() const { return m_thisId; }
65
66 const std::string &GetLabel() const { return m_label; }
67 void SetLabel(const char *label) { m_label = label; }
68
69 void SetPosition(const vector3d &pos) { m_pos = pos; }
70 vector3d GetPosition() const { return m_pos; }
71 void SetInitialOrient(const matrix3x3d &m, double time);
72 void SetOrient(const matrix3x3d &m, double time);
73 const matrix3x3d &GetOrient() const { return m_orient; }
74 const matrix3x3d &GetInterpOrient() const { return m_interpOrient; }
75 void SetVelocity(const vector3d &vel) { m_vel = vel; }
76 vector3d GetVelocity() const { return m_vel; }
77 void SetAngSpeed(const double angspeed) { m_angSpeed = angspeed; }
78 double GetAngSpeed() const { return m_angSpeed; }
79 void SetRadius(double radius) { m_radius = radius; }
80 double GetRadius() const { return m_radius; }
81 bool IsRotFrame() const { return m_flags & FLAG_ROTATING; }
82 bool HasRotFrame() const { return m_flags & FLAG_HAS_ROT; }
83
84 FrameId GetParent() const { return m_parent; }
85 FrameId GetNonRotFrame() const { return IsRotFrame() ? m_parent : m_thisId; }
86 FrameId GetRotFrame() const { return HasRotFrame() ? m_children.front() : m_thisId; }
87
89 {
90 m_sbody = s;
91 m_astroBody = b;
92 }
93 SystemBody *GetSystemBody() const { return m_sbody; }
94 Body *GetBody() const { return m_astroBody; }
95
96 void AddChild(FrameId fId) { m_children.push_back(fId); }
97 void RemoveChild(FrameId fId);
98 bool HasChildren() const { return !m_children.empty(); }
99 unsigned GetNumChildren() const { return static_cast<Uint32>(m_children.size()); }
102
103 void AddGeom(Geom *);
104 void RemoveGeom(Geom *);
105 void AddStaticGeom(Geom *);
106 void RemoveStaticGeom(Geom *);
107 // TODO: Should be a Planet or there's a needs for a Body?
108 void SetPlanetGeom(double radius, Body *);
110
111 static void UpdateOrbitRails(double time, double timestep);
112 static void CollideFrames(void (*callback)(CollisionContact *));
113 void UpdateInterpTransform(double alpha);
114 void ClearMovement();
115
116 // For an object in a rotating frame, relative to non-rotating frames it
117 // must attain this velocity within rotating frame to be stationary.
118 vector3d GetStasisVelocity(const vector3d &pos) const { return -vector3d(0, m_angSpeed, 0).Cross(pos); }
119
120 vector3d GetPositionRelTo(FrameId relTo) const;
121 vector3d GetVelocityRelTo(FrameId relTo) const;
122 matrix3x3d GetOrientRelTo(FrameId relTo) const;
124
125 // Same as above except it does interpolation between
126 // physics ticks so rendering is smooth above physics hz
130
131 static void GetFrameTransform(FrameId fFrom, FrameId fTo, matrix4x4d &m);
132
133 std::unique_ptr<SfxManager> m_sfx; // the last survivor. actually m_children is pretty grim too.
134
135private:
136 FrameId m_thisId;
137
138 void UpdateRootRelativeVars();
139
140 FrameId m_parent; // if parent is null then frame position is absolute
141 std::vector<FrameId> m_children; // child frames, first may be rotating
142 SystemBody *m_sbody; // points to SBodies in Pi::current_system
143 Body *m_astroBody; // if frame contains a star or planet or something
144
145 vector3d m_pos;
146 vector3d m_oldPos;
147 vector3d m_interpPos;
148 matrix3x3d m_initialOrient;
149 matrix3x3d m_orient;
150 matrix3x3d m_interpOrient;
151 vector3d m_vel; // note we don't use this to move frame. rather,
152 // orbital rails determine velocity.
153 double m_angSpeed; // this however *is* directly applied (for rotating frames)
154 double m_oldAngDisplacement;
155 std::string m_label;
156 double m_radius;
157 int m_flags;
158 int m_collisionSpace;
159
160 vector3d m_rootVel; // velocity, position and orient relative to root frame
161 vector3d m_rootPos; // updated by UpdateOrbitRails
162 matrix3x3d m_rootOrient;
163 vector3d m_rootInterpPos; // interp position and orient relative to root frame
164 matrix3x3d m_rootInterpOrient; // updated by UpdateInterpTransform
165
166 int m_astroBodyIndex; // deserialisation
167
168 static std::vector<Frame> s_frames;
169 static std::vector<CollisionSpace> s_collisionSpaces;
170
171 // A trick in order to avoid a direct call of ctor or dtor: use factory methods instead
172 struct Dummy {
173 Dummy() :
174 madeWithFactory(false)
175 {}
176 bool madeWithFactory;
177 };
178
179 Dummy d;
180};
181
182#endif /* _FRAME_H */
IterationProxy< Container > MakeIterationProxy(Container &container)
Definition IterationProxy.h:51
nlohmann::json Json
Definition Json.h:8
Definition Body.h:57
Definition CollisionSpace.h:27
Definition Frame.h:28
void SetPosition(const vector3d &pos)
Definition Frame.h:69
static FrameId FromJson(const Json &jsonObj, Space *space, FrameId parent, double at_time)
Definition Frame.cpp:177
void UpdateInterpTransform(double alpha)
Definition Frame.cpp:434
void AddStaticGeom(Geom *)
Definition Frame.cpp:321
static void CollideFrames(void(*callback)(CollisionContact *))
Definition Frame.cpp:299
void SetBodies(SystemBody *s, Body *b)
Definition Frame.h:88
FrameId GetParent() const
Definition Frame.h:84
vector3d GetPositionRelTo(FrameId relTo) const
Definition Frame.cpp:349
const IterationProxy< const std::vector< FrameId > > GetChildren() const
Definition Frame.h:101
static Frame * GetFrame(FrameId FId)
Definition Frame.cpp:247
double GetAngSpeed() const
Definition Frame.h:78
CollisionSpace * GetCollisionSpace() const
Definition Frame.cpp:328
const std::string & GetLabel() const
Definition Frame.h:66
vector3d GetVelocityRelTo(FrameId relTo) const
Definition Frame.cpp:337
vector3d GetPosition() const
Definition Frame.h:70
vector3d GetInterpPositionRelTo(FrameId relTo) const
Definition Frame.cpp:378
void SetRadius(double radius)
Definition Frame.h:79
vector3d GetStasisVelocity(const vector3d &pos) const
Definition Frame.h:118
matrix3x3d GetOrientRelTo(FrameId relTo) const
Definition Frame.cpp:405
void RemoveChild(FrameId fId)
Definition Frame.cpp:308
void SetPlanetGeom(double radius, Body *)
Definition Frame.cpp:323
Body * GetBody() const
Definition Frame.h:94
matrix4x4d GetTransformRelTo(FrameId relTo) const
Definition Frame.cpp:424
static void GetFrameTransform(FrameId fFrom, FrameId fTo, matrix4x4d &m)
Definition Frame.cpp:460
std::unique_ptr< SfxManager > m_sfx
Definition Frame.h:133
void SetVelocity(const vector3d &vel)
Definition Frame.h:75
bool HasChildren() const
Definition Frame.h:98
FrameId GetNonRotFrame() const
Definition Frame.h:85
void ClearMovement()
Definition Frame.cpp:468
void RemoveStaticGeom(Geom *)
Definition Frame.cpp:322
bool HasRotFrame() const
Definition Frame.h:82
Frame(const Frame &)=delete
double GetRadius() const
Definition Frame.h:80
@ FLAG_DEFAULT
Definition Frame.h:46
@ FLAG_ROTATING
Definition Frame.h:47
@ FLAG_HAS_ROT
Definition Frame.h:48
void RemoveGeom(Geom *)
Definition Frame.cpp:320
unsigned GetNumChildren() const
Definition Frame.h:99
const matrix3x3d & GetOrient() const
Definition Frame.h:73
static void DeleteCameraFrame(FrameId camera)
Definition Frame.cpp:266
vector3d GetVelocity() const
Definition Frame.h:76
static void PostUnserializeFixup(FrameId fId, Space *space)
Definition Frame.cpp:288
static FrameId CreateCameraFrame(FrameId parent)
Definition Frame.cpp:257
void AddChild(FrameId fId)
Definition Frame.h:96
matrix3x3d GetInterpOrientRelTo(FrameId relTo) const
Definition Frame.cpp:411
void SetAngSpeed(const double angspeed)
Definition Frame.h:77
FrameId GetRotFrame() const
Definition Frame.h:86
void SetLabel(const char *label)
Definition Frame.h:67
static void DeleteFrames()
Definition Frame.cpp:234
void SetOrient(const matrix3x3d &m, double time)
Definition Frame.cpp:523
void AddGeom(Geom *)
Definition Frame.cpp:319
static FrameId CreateFrame(FrameId parent, const char *label, unsigned int flags=FLAG_DEFAULT, double radius=0.0)
Definition Frame.cpp:168
IterationProxy< std::vector< FrameId > > GetChildren()
Definition Frame.h:100
matrix4x4d GetInterpTransformRelTo(FrameId relTo) const
Definition Frame.cpp:429
FrameId GetId() const
Definition Frame.h:64
void SetInitialOrient(const matrix3x3d &m, double time)
Definition Frame.cpp:511
SystemBody * GetSystemBody() const
Definition Frame.h:93
bool IsRotFrame() const
Definition Frame.h:81
Frame()=delete
static void ToJson(Json &jsonObj, FrameId fId, Space *space)
Definition Frame.cpp:132
static void UpdateOrbitRails(double time, double timestep)
Definition Frame.cpp:478
const matrix3x3d & GetInterpOrient() const
Definition Frame.h:74
Definition Geom.h:16
Definition IterationProxy.h:13
Definition Sfx.h:47
Definition Space.h:19
Definition SystemBody.h:19
vector3 Cross(const vector3 &b) const
Definition vector3.h:117
Definition CollisionContact.h:9
Definition FrameId.h:9
vector3< double > vector3d
Definition vector3.h:290