Pioneer
Loading...
Searching...
No Matches
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
11class Propulsion;
12class FixedGuns;
13class Orbit;
14
15class DynamicBody : public ModelBody {
16private:
17 friend class Propulsion;
18 friend class FixedGuns;
19
20public:
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
82protected:
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
92
95
96private:
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