UGDK  0.5.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
body.h
Go to the documentation of this file.
1 #ifndef UGDK_ACTION_3D_COMPONENT_BODY_H
2 #define UGDK_ACTION_3D_COMPONENT_BODY_H
3 
5 #include <OgreVector3.h>
6 #include <LinearMath/btVector3.h>
7 #include <functional>
8 #include <vector>
9 
10 class btVector3;
11 namespace Ogre {
12 class Vector3;
13 class Quaternion;
14 }
15 
16 class btManifoldPoint;
17 
18 namespace ugdk {
19 namespace action {
20 namespace mode3d {
21 namespace component {
22 
23 struct ContactPoint {
24  btVector3 world_positionA;
25  btVector3 world_positionB;
27  double distance;
28 
29  ContactPoint(const btVector3& posA, const btVector3& posB, double impulse, double dist)
30  : world_positionA(posA), world_positionB(posB), applied_impulse(impulse), distance(dist) {}
31 };
32 using ElementPtr = std::shared_ptr < Element > ;
33 using ContactPointVector = std::vector < ContactPoint > ;
34 using CollisionAction = std::function < void(const ElementPtr&, const ElementPtr&, const ContactPointVector&) >;
35 
36 class Body : public Component {
37 
38  public:
39 
40  std::type_index type() const override;
41 
42  virtual double mass() const = 0;
43  virtual short collision_group() const = 0;
44  virtual short collides_with() const = 0;
45  virtual void set_angular_factor(double x_factor, double y_factor, double z_factor) = 0;
46  virtual void set_restitution(double factor) = 0;
47  virtual void set_friction(double frict) = 0;
48  virtual void set_damping(double linear, double angular) = 0;
49  virtual void SetRespondsOnContact(bool has_response) = 0;
50  virtual void SetContinuousCollisionDetection(double speed_threshold, double sphere_radius) = 0;
51 
52  virtual Ogre::Vector3 position() const = 0;
53  virtual Ogre::Quaternion orientation() const = 0;
54  virtual void set_orientation(const Ogre::Vector3& dir) = 0;
55  virtual Ogre::Vector3 linear_velocity() const = 0;
56  virtual void set_linear_velocity(const Ogre::Vector3& velocity) = 0;
57  virtual Ogre::Vector3 angular_velocity() const = 0;
58  virtual Ogre::Vector3 GetVelocityInPoint(const Ogre::Vector3& point) const = 0;
59 
60  void Translate(const Ogre::Vector3& move);
61  void ApplyImpulse(const Ogre::Vector3& imp);
62 
63  virtual void Translate(double move_x, double move_y, double move_z) = 0;
64  virtual void ApplyImpulse(double imp_x, double imp_y, double imp_z) = 0;
65  virtual void ApplyImpulse(const Ogre::Vector3& imp, const Ogre::Vector3& relative_pos) = 0;
66  virtual void Rotate(double yaw, double pitch, double roll) = 0;
67  virtual void Scale(double factor_x, double factor_y, double factor_z) = 0;
68 
69  virtual void AddCollisionAction(short target_mask, const CollisionAction& action) = 0;
70 
71  protected:
72 
73  Body () {}
74  void OnTaken() override;
75 
76 };
77 
78 inline std::type_index Body::type() const {
79  return typeid(Body);
80 }
81 
82 inline void Body::Translate(const Ogre::Vector3 &move) {
83  this->Translate(move.x, move.y, move.z);
84 }
85 
86 inline void Body::ApplyImpulse(const Ogre::Vector3 &delta) {
87  this->ApplyImpulse(delta.x, delta.y, delta.z);
88 }
89 
90 inline void Body::OnTaken() {}
91 
92 template <>
93 class NullComponent<Body> : public Body {
94  public:
95  const static bool is_valid = true;
96  virtual void Translate(double move_x, double move_y, double move_z) override {}
97  virtual void ApplyImpulse(double delta_x, double delta_y, double delta_z) override {}
98  virtual void Rotate(double yaw, double pitch, double roll) override {}
99  virtual void Scale(double factor_x, double factor_y, double factor_z) override {}
100 };
101 
102 } // namespace component
103 } // namespace mode3d
104 } // namespace action
105 } // namespace ugdk
106 
107 #endif // UGDK_ACTION_3D_COMPONENT_BODY_H
std::vector< ContactPoint > ContactPointVector
Definition: body.h:33
virtual short collision_group() const =0
virtual Ogre::Quaternion orientation() const =0
virtual void AddCollisionAction(short target_mask, const CollisionAction &action)=0
virtual void set_friction(double frict)=0
void ApplyImpulse(const Ogre::Vector3 &imp)
Definition: body.h:86
Definition: animation.h:11
virtual void set_linear_velocity(const Ogre::Vector3 &velocity)=0
double applied_impulse
Definition: body.h:26
std::shared_ptr< Element > ElementPtr
Definition: body.h:32
void OnTaken() override
TODO: Make this not accessible from Object.
Definition: body.h:90
Definition: component.h:14
virtual double mass() const =0
virtual void Scale(double factor_x, double factor_y, double factor_z) override
Definition: body.h:99
virtual void SetContinuousCollisionDetection(double speed_threshold, double sphere_radius)=0
virtual void Rotate(double yaw, double pitch, double roll) override
Definition: body.h:98
std::type_index type() const override
Definition: body.h:78
virtual Ogre::Vector3 GetVelocityInPoint(const Ogre::Vector3 &point) const =0
virtual void set_restitution(double factor)=0
virtual void ApplyImpulse(double delta_x, double delta_y, double delta_z) override
Definition: body.h:97
std::function< void(const ElementPtr &, const ElementPtr &, const ContactPointVector &) > CollisionAction
Definition: body.h:34
ContactPoint(const btVector3 &posA, const btVector3 &posB, double impulse, double dist)
Definition: body.h:29
btVector3 world_positionB
Definition: body.h:25
virtual void Translate(double move_x, double move_y, double move_z) override
Definition: body.h:96
virtual void Scale(double factor_x, double factor_y, double factor_z)=0
btVector3 world_positionA
Definition: body.h:24
virtual void set_angular_factor(double x_factor, double y_factor, double z_factor)=0
virtual Ogre::Vector3 position() const =0
void Translate(const Ogre::Vector3 &move)
Definition: body.h:82
virtual Ogre::Vector3 angular_velocity() const =0
virtual void Rotate(double yaw, double pitch, double roll)=0
virtual short collides_with() const =0
virtual Ogre::Vector3 linear_velocity() const =0
Definition: camera.h:8
virtual void SetRespondsOnContact(bool has_response)=0
static const bool is_valid
Definition: component.h:38
virtual void set_damping(double linear, double angular)=0
virtual void set_orientation(const Ogre::Vector3 &dir)=0