Pioneer
DynamicBody.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 _DYNAMICBODY_H
5 #define _DYNAMICBODY_H
6 
7 #include "ModelBody.h"
8 #include "matrix4x4.h"
9 #include "vector3.h"
10 
11 class Propulsion;
12 class FixedGuns;
13 class Orbit;
14 
15 class DynamicBody : public ModelBody {
16 private:
17  friend class Propulsion;
18  friend class FixedGuns;
19 
20 public:
22  DynamicBody();
23  DynamicBody(const Json &jsonObj, Space *space);
24  virtual ~DynamicBody();
25 
26  virtual vector3d GetVelocity() const override;
27  virtual void SetVelocity(const vector3d &v) override;
28  virtual void SetFrame(FrameId fId) override;
29  vector3d GetAngVelocity() const override;
30  void SetAngVelocity(const vector3d &v) override;
31  virtual bool OnCollision(Body *o, Uint32 flags, double relVel) override;
33  double GetAngularInertia() const { return m_angInertia; }
35  void SetMoving(bool isMoving);
36  bool IsMoving() const { return m_isMoving; }
37  virtual double GetMass() const override { return m_mass; } // XXX don't override this
38  virtual void TimeStepUpdate(const float timeStep) override;
39  double CalcAtmosphericDrag(double velSqr, double area, double coeff) const;
40  void CalcExternalForce();
41 
42  void SetMass(double);
43  void AddForce(const vector3d &);
44  void AddTorque(const vector3d &);
45  void SetForce(const vector3d &);
46  void SetTorque(const vector3d &);
47  vector3d GetLastForce() const { return m_lastForce; }
48  vector3d GetLastTorque() const { return m_lastTorque; }
49  // body-relative forces
50  void AddRelForce(const vector3d &);
51  void AddRelTorque(const vector3d &);
52  vector3d GetExternalForce() const { return m_externalForce; }
53  vector3d GetAtmosForce() const { return m_atmosForce; }
54  vector3d GetGravityForce() const { return m_gravityForce; }
55  virtual void UpdateInterpTransform(double alpha) override;
56 
57  virtual void PostLoadFixup(Space *space) override;
58 
59  Orbit ComputeOrbit() const;
60 
61  /* TODO: This is a big simplification...
62  * something better because AI on dynamic is
63  * a "loose" thing (also see AIError m_aiMessage
64  * in line 83)
65  */
66  enum AIError { // <enum scope='Ship' name=ShipAIError prefix=AIERROR_ public>
72  };
74  {
75  AIError tmp = m_aiMessage;
76  m_aiMessage = msg;
77  return tmp;
78  }
79 
80  void SetDecelerating(bool decel) { m_decelerating = decel; }
81 
82 protected:
83  virtual void SaveToJson(Json &jsonObj, Space *space) override;
84 
85  void GetCurrentAtmosphericState(double &pressure, double &density) const;
86 
87  virtual vector3d CalcAtmosphericForce() const;
88 
89  static const double DEFAULT_DRAG_COEFF;
90 
91  double m_dragCoeff;
92 
95 
96 private:
97  vector3d m_oldPos;
98  vector3d m_oldAngDisplacement;
99 
100  vector3d m_force;
101  vector3d m_torque;
102  vector3d m_vel;
103  vector3d m_angVel;
104  double m_mass;
105  double m_massRadius; // set in a mickey-mouse fashion from the collision mesh and used to calculate m_angInertia
106  double m_angInertia; // always sphere mass distribution
107  bool m_isMoving;
108 
109  vector3d m_externalForce;
110  vector3d m_atmosForce;
111  vector3d m_gravityForce;
112  // for time accel reduction fudge
113  vector3d m_lastForce;
114  vector3d m_lastTorque;
115 };
116 
117 #endif /* _DYNAMICBODY_H */
nlohmann::json Json
Definition: Json.h:8
Definition: Body.h:57
Definition: DynamicBody.h:15
virtual double GetMass() const override
Definition: DynamicBody.h:37
bool IsMoving() const
Definition: DynamicBody.h:36
vector3d GetAngVelocity() const override
Definition: DynamicBody.cpp:303
void SetMass(double)
Definition: DynamicBody.cpp:157
virtual vector3d GetVelocity() const override
Definition: DynamicBody.cpp:293
void SetDecelerating(bool decel)
Definition: DynamicBody.h:80
DynamicBody()
Definition: DynamicBody.cpp:18
virtual vector3d CalcAtmosphericForce() const
Definition: DynamicBody.cpp:180
Orbit ComputeOrbit() const
Definition: DynamicBody.cpp:340
void GetCurrentAtmosphericState(double &pressure, double &density) const
Definition: DynamicBody.cpp:104
void SetAngVelocity(const vector3d &v) override
Definition: DynamicBody.cpp:308
void AddRelTorque(const vector3d &)
Definition: DynamicBody.cpp:147
void SetMassDistributionFromModel()
Definition: DynamicBody.cpp:279
double CalcAtmosphericDrag(double velSqr, double area, double coeff) const
Definition: DynamicBody.cpp:171
void SetForce(const vector3d &)
Definition: DynamicBody.cpp:127
void CalcExternalForce()
Definition: DynamicBody.cpp:189
vector3d GetLastForce() const
Definition: DynamicBody.h:47
virtual ~DynamicBody()
Definition: DynamicBody.cpp:123
vector3d GetAtmosForce() const
Definition: DynamicBody.h:53
void SetMoving(bool isMoving)
Definition: DynamicBody.cpp:74
virtual void SetFrame(FrameId fId) override
Definition: DynamicBody.cpp:164
vector3d GetExternalForce() const
Definition: DynamicBody.h:52
OBJDEF(DynamicBody, ModelBody, DYNAMICBODY)
bool m_decelerating
Definition: DynamicBody.h:93
AIError AIMessage(AIError msg=AIERROR_NONE)
Definition: DynamicBody.h:73
virtual void SaveToJson(Json &jsonObj, Space *space) override
Definition: DynamicBody.cpp:86
double GetAngularInertia() const
Definition: DynamicBody.h:33
void AddTorque(const vector3d &)
Definition: DynamicBody.cpp:137
virtual void SetVelocity(const vector3d &v) override
Definition: DynamicBody.cpp:298
static const double DEFAULT_DRAG_COEFF
Definition: DynamicBody.h:89
void AddRelForce(const vector3d &)
Definition: DynamicBody.cpp:142
vector3d GetLastTorque() const
Definition: DynamicBody.h:48
void AddForce(const vector3d &)
Definition: DynamicBody.cpp:132
virtual bool OnCollision(Body *o, Uint32 flags, double relVel) override
Definition: DynamicBody.cpp:313
double m_dragCoeff
Definition: DynamicBody.h:91
virtual void TimeStepUpdate(const float timeStep) override
Definition: DynamicBody.cpp:230
AIError
Definition: DynamicBody.h:66
@ AIERROR_GRAV_TOO_HIGH
Definition: DynamicBody.h:68
@ AIERROR_ORBIT_IMPOSSIBLE
Definition: DynamicBody.h:71
@ AIERROR_NONE
Definition: DynamicBody.h:67
@ AIERROR_REFUSED_PERM
Definition: DynamicBody.h:69
@ AIERROR_PRESS_TOO_HIGH
Definition: DynamicBody.h:70
AIError m_aiMessage
Definition: DynamicBody.h:94
virtual void PostLoadFixup(Space *space) override
Definition: DynamicBody.cpp:116
vector3d GetAngularMomentum() const
Definition: DynamicBody.cpp:288
vector3d GetGravityForce() const
Definition: DynamicBody.h:54
void SetTorque(const vector3d &)
Definition: DynamicBody.cpp:152
virtual void UpdateInterpTransform(double alpha) override
Definition: DynamicBody.cpp:266
Definition: FixedGuns.h:21
Definition: ModelBody.h:25
Definition: Orbit.h:11
Definition: Propulsion.h:25
Definition: Space.h:19
Definition: FrameId.h:9