Pioneer
DynamicBody.h
Go to the documentation of this file.
1 // Copyright © 2008-2021 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;
30  void SetAngVelocity(const vector3d &v);
31  virtual bool OnCollision(Body *o, Uint32 flags, double relVel) override;
33  double GetAngularInertia() const { return m_angInertia; }
35  void SetMoving(bool isMoving) { m_isMoving = 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  enum Feature {
84  };
85 
86  bool Have(Feature f) const { return m_features[f]; };
87  void SetDecelerating(bool decel) { m_decelerating = decel; }
88  const Propulsion *GetPropulsion() const;
90  const FixedGuns *GetFixedGuns() const;
92  void AddFeature(Feature f);
93 
94 protected:
95  virtual void SaveToJson(Json &jsonObj, Space *space) override;
96 
97  void GetCurrentAtmosphericState(double &pressure, double &density) const;
98 
99  virtual vector3d CalcAtmosphericForce() const;
100 
101  static const double DEFAULT_DRAG_COEFF;
102 
103  double m_dragCoeff;
104 
107 
108 private:
109  vector3d m_oldPos;
110  vector3d m_oldAngDisplacement;
111 
112  vector3d m_force;
113  vector3d m_torque;
114  vector3d m_vel;
115  vector3d m_angVel;
116  double m_mass;
117  double m_massRadius; // set in a mickey-mouse fashion from the collision mesh and used to calculate m_angInertia
118  double m_angInertia; // always sphere mass distribution
119  bool m_isMoving;
120 
121  vector3d m_externalForce;
122  vector3d m_atmosForce;
123  vector3d m_gravityForce;
124  // for time accel reduction fudge
125  vector3d m_lastForce;
126  vector3d m_lastTorque;
127 
128  bool m_features[MAX_FEATURE];
129 
130  RefCountedPtr<Propulsion> m_propulsion;
131  RefCountedPtr<FixedGuns> m_fixedGuns;
132 };
133 
134 #endif /* _DYNAMICBODY_H */
nlohmann::json Json
Definition: Json.h:8
Definition: Body.h:54
Definition: DynamicBody.h:15
virtual double GetMass() const override
Definition: DynamicBody.h:37
bool IsMoving() const
Definition: DynamicBody.h:36
void SetMass(double)
Definition: DynamicBody.cpp:189
virtual vector3d GetVelocity() const override
Definition: DynamicBody.cpp:325
void SetDecelerating(bool decel)
Definition: DynamicBody.h:87
void AddFeature(Feature f)
Definition: DynamicBody.cpp:125
DynamicBody()
Definition: DynamicBody.cpp:18
vector3d GetAngVelocity() const
Definition: DynamicBody.cpp:335
virtual vector3d CalcAtmosphericForce() const
Definition: DynamicBody.cpp:212
Orbit ComputeOrbit() const
Definition: DynamicBody.cpp:372
void GetCurrentAtmosphericState(double &pressure, double &density) const
Definition: DynamicBody.cpp:100
void AddRelTorque(const vector3d &)
Definition: DynamicBody.cpp:155
void SetMassDistributionFromModel()
Definition: DynamicBody.cpp:311
double CalcAtmosphericDrag(double velSqr, double area, double coeff) const
Definition: DynamicBody.cpp:203
void SetForce(const vector3d &)
Definition: DynamicBody.cpp:135
void CalcExternalForce()
Definition: DynamicBody.cpp:221
vector3d GetLastForce() const
Definition: DynamicBody.h:47
virtual ~DynamicBody()
Definition: DynamicBody.cpp:119
const FixedGuns * GetFixedGuns() const
Definition: DynamicBody.cpp:172
vector3d GetAtmosForce() const
Definition: DynamicBody.h:53
void SetMoving(bool isMoving)
Definition: DynamicBody.h:35
virtual void SetFrame(FrameId fId) override
Definition: DynamicBody.cpp:196
vector3d GetExternalForce() const
Definition: DynamicBody.h:52
OBJDEF(DynamicBody, ModelBody, DYNAMICBODY)
bool m_decelerating
Definition: DynamicBody.h:105
AIError AIMessage(AIError msg=AIERROR_NONE)
Definition: DynamicBody.h:73
void SetAngVelocity(const vector3d &v)
Definition: DynamicBody.cpp:340
virtual void SaveToJson(Json &jsonObj, Space *space) override
Definition: DynamicBody.cpp:82
double GetAngularInertia() const
Definition: DynamicBody.h:33
void AddTorque(const vector3d &)
Definition: DynamicBody.cpp:145
virtual void SetVelocity(const vector3d &v) override
Definition: DynamicBody.cpp:330
static const double DEFAULT_DRAG_COEFF
Definition: DynamicBody.h:101
void AddRelForce(const vector3d &)
Definition: DynamicBody.cpp:150
vector3d GetLastTorque() const
Definition: DynamicBody.h:48
void AddForce(const vector3d &)
Definition: DynamicBody.cpp:140
virtual bool OnCollision(Body *o, Uint32 flags, double relVel) override
Definition: DynamicBody.cpp:345
double m_dragCoeff
Definition: DynamicBody.h:103
virtual void TimeStepUpdate(const float timeStep) override
Definition: DynamicBody.cpp:262
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:106
virtual void PostLoadFixup(Space *space) override
Definition: DynamicBody.cpp:112
vector3d GetAngularMomentum() const
Definition: DynamicBody.cpp:320
vector3d GetGravityForce() const
Definition: DynamicBody.h:54
void SetTorque(const vector3d &)
Definition: DynamicBody.cpp:184
virtual void UpdateInterpTransform(double alpha) override
Definition: DynamicBody.cpp:298
const Propulsion * GetPropulsion() const
Definition: DynamicBody.cpp:160
bool Have(Feature f) const
Definition: DynamicBody.h:86
Feature
Definition: DynamicBody.h:80
@ MAX_FEATURE
Definition: DynamicBody.h:83
@ PROPULSION
Definition: DynamicBody.h:81
@ FIXED_GUNS
Definition: DynamicBody.h:82
Definition: FixedGuns.h:21
Definition: ModelBody.h:25
Definition: Orbit.h:11
Definition: Propulsion.h:25
Definition: Space.h:19
Definition: FrameId.h:9