UGDK  0.5.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
physicsbody.h
Go to the documentation of this file.
1 #ifndef UGDK_ACTION_3D_COMPONENT_PHYSICSBODY_H
2 #define UGDK_ACTION_3D_COMPONENT_PHYSICSBODY_H
3 
5 #include <LinearMath/btTransform.h>
6 #include <unordered_map>
7 
8 class btCollisionShape;
9 class btRigidBody;
10 
11 namespace ugdk {
12 namespace action {
13 namespace mode3d {
14 
15 class Physics;
16 
17 namespace component {
18 
19 class PhysicsBody final : public Body {
20  public:
21  using Body::ApplyImpulse;
22 
23  struct PhysicsData {
25  double mass;
31  btCollisionShape* shape;
33  btTransform initial;
35  btTransform offset;
38  PhysicsData();
39  };
40 
41  PhysicsBody(Physics &physics, const PhysicsData &physics_data);
42  ~PhysicsBody();
43 
44  double mass() const override;
45  short collision_group() const override;
46  short collides_with() const override;
47  void set_angular_factor(double x_axis, double y_axis, double z_axis) override;
48  void set_restitution(double factor) override;
49  void set_friction(double frict) override;
50  void set_damping(double linear, double angular) override;
51  void SetRespondsOnContact(bool has_response) override;
52  void SetContinuousCollisionDetection(double speed_threshold, double sphere_radius) override;
53 
54  Ogre::Vector3 position() const override;
55  Ogre::Quaternion orientation() const override;
56  void set_orientation(const Ogre::Vector3& dir) override;
57  Ogre::Vector3 linear_velocity() const override;
58  void set_linear_velocity(const Ogre::Vector3& velocity) override;
59  Ogre::Vector3 angular_velocity() const override;
60  Ogre::Vector3 GetVelocityInPoint(const Ogre::Vector3& point) const override;
61 
62  void Translate(double move_x, double move_y, double move_z) override;
63  void ApplyImpulse(double imp_x, double imp_y, double imp_z) override;
64  void ApplyImpulse(const Ogre::Vector3& imp, const Ogre::Vector3& relative_pos) override;
65  void Rotate(double yaw, double pitch, double roll) override;
66  void Scale(double factor_x, double factor_y, double factor_z) override;
67 
68  void AddCollisionAction(short target_mask, const CollisionAction& action) override;
69 
70  protected:
71  void OnTaken() override;
72 
73  private:
74  friend class ::ugdk::action::mode3d::Physics;
75 
76  Physics &physics_;
77  PhysicsData physics_data_;
78  btRigidBody *body_;
79  std::unordered_map<short, CollisionAction> action_map_;
80 };
81 
82 inline PhysicsBody::PhysicsBody(Physics &physics, const PhysicsData &physics_data)
83  : physics_(physics), physics_data_(physics_data) {}
84 
85 inline double PhysicsBody::mass() const {
86  return physics_data_.mass;
87 }
88 
89 inline short PhysicsBody::collision_group() const {
90  return physics_data_.collision_group;
91 }
92 inline short PhysicsBody::collides_with() const {
93  return physics_data_.collides_with;
94 }
95 
96 template <>
97 class NullComponent<PhysicsBody> : public NullComponent<Body> {};
98 
99 } // namespace component
100 } // namespace mode3d
101 } // namespace action
102 } // namespace ugdk
103 
104 #endif // BULLETWORKS_COMPONENT_PHYSICSBODY_H
void Rotate(double yaw, double pitch, double roll) override
void SetContinuousCollisionDetection(double speed_threshold, double sphere_radius) override
btCollisionShape * shape
Definition: physicsbody.h:31
Ogre::Quaternion orientation() const override
void Translate(double move_x, double move_y, double move_z) override
short collides_with() const override
Definition: physicsbody.h:92
btTransform initial
Definition: physicsbody.h:33
Ogre::Vector3 GetVelocityInPoint(const Ogre::Vector3 &point) const override
void Scale(double factor_x, double factor_y, double factor_z) override
void SetRespondsOnContact(bool has_response) override
void ApplyImpulse(const Ogre::Vector3 &imp)
Definition: body.h:86
void set_angular_factor(double x_axis, double y_axis, double z_axis) override
Definition: animation.h:11
void set_restitution(double factor) override
void AddCollisionAction(short target_mask, const CollisionAction &action) override
double mass() const override
Definition: physicsbody.h:85
void set_linear_velocity(const Ogre::Vector3 &velocity) override
short collision_group() const override
Definition: physicsbody.h:89
void OnTaken() override
TODO: Make this not accessible from Object.
std::function< void(const ElementPtr &, const ElementPtr &, const ContactPointVector &) > CollisionAction
Definition: body.h:34
void set_damping(double linear, double angular) override
btTransform offset
Definition: physicsbody.h:35
void ApplyImpulse(double imp_x, double imp_y, double imp_z) override
Ogre::Vector3 linear_velocity() const override
void set_friction(double frict) override
Definition: physics.h:31
Ogre::Vector3 position() const override
PhysicsBody(Physics &physics, const PhysicsData &physics_data)
Definition: physicsbody.h:82
void set_orientation(const Ogre::Vector3 &dir) override
Ogre::Vector3 angular_velocity() const override