source: trunk/test/Physics/Include/EasyConstraint.h @ 1749

Last change on this file since 1749 was 1749, checked in by touky, 8 years ago

Reverted last CL

File size: 6.4 KB
Line 
1//
2// Lol Engine
3//
4// Copyright: (c) 2010-2012 Sam Hocevar <sam@hocevar.net>
5//            (c) 2009-2012 Benjamin Huet <huet.benjamin@gmail.com>
6//   This program is free software; you can redistribute it and/or
7//   modify it under the terms of the Do What The Fuck You Want To
8//   Public License, Version 2, as published by Sam Hocevar. See
9//   http://sam.zoy.org/projects/COPYING.WTFPL for more details.
10//
11
12//
13// The EasyPhysic class
14// ------------------
15//
16
17#if !defined __EASYCONSTRAINT_EASYCONSTRAINT_H__
18#define __EASYCONSTRAINT_EASYCONSTRAINT_H__
19
20#ifdef HAVE_PHYS_USE_BULLET
21#include "core.h"
22#include "EasyPhysics.h"
23#endif
24
25namespace lol
26{
27
28namespace phys
29{
30
31class EasyConstraint
32{
33#ifdef HAVE_PHYS_USE_BULLET
34
35public:
36        EasyConstraint() :
37                m_typed_constraint(NULL),
38                m_p2p_constraint(NULL),
39                m_hinge_constraint(NULL),
40                m_slider_constraint(NULL),
41                m_cone_twist_constraint(NULL),
42                m_6dof_constraint(NULL),
43                m_a_physobj(NULL),
44                m_b_physobj(NULL),
45                m_a_transform(lol::mat4(1.f)),
46                m_b_transform(lol::mat4(1.f)),
47                m_using_ref_a(false),
48                m_disable_a2b_collision(false)
49
50        {
51        }
52        ~EasyConstraint()
53        {
54                delete m_typed_constraint;
55                m_p2p_constraint = NULL;
56                m_hinge_constraint = NULL;
57                m_slider_constraint = NULL;
58                m_cone_twist_constraint = NULL;
59                m_6dof_constraint = NULL;
60        }
61
62        void AddToSimulation(class Simulation* current_simulation);
63        void RemoveFromSimulation(class Simulation* current_simulation);
64
65private:
66
67        //check if Init can be done
68        bool CanProceedWithInit()
69        {
70                if (!m_a_physobj || !m_b_physobj)
71                        return false;
72
73                if (!m_a_physobj->m_rigid_body || !m_b_physobj->m_rigid_body)
74                        return false;
75
76                return true;
77        }
78
79        //-------------------------------------------------------------------------
80        //Init constraint functions
81        //--
82        void CustomInitConstraintToPoint2Point()
83        {
84                m_p2p_constraint = new btPoint2PointConstraint(*m_a_physobj->m_rigid_body, *m_b_physobj->m_rigid_body,
85                                                                                                                LOL2BT_VEC3(m_a_transform.v3.xyz * LOL2BT_UNIT), LOL2BT_VEC3(m_b_transform.v3.xyz * LOL2BT_UNIT));
86                m_typed_constraint = m_p2p_constraint;
87        }
88
89        void CustomInitConstraintToHinge()
90        {
91                m_hinge_constraint = new btHingeConstraint(*m_a_physobj->m_rigid_body, *m_b_physobj->m_rigid_body,
92                                                                                                                btTransform(LOL2BT_QUAT(quat(m_a_transform)), LOL2BT_VEC3(m_a_transform.v3.xyz * LOL2BT_UNIT)),
93                                                                                                                btTransform(LOL2BT_QUAT(quat(m_b_transform)), LOL2BT_VEC3(m_b_transform.v3.xyz * LOL2BT_UNIT)),
94                                                                                                                m_using_ref_a);
95                m_typed_constraint = m_hinge_constraint;
96        }
97
98        void CustomInitConstraintToSlider()
99        {
100                m_slider_constraint = new btSliderConstraint(*m_a_physobj->m_rigid_body, *m_b_physobj->m_rigid_body,
101                                                                                                                btTransform(LOL2BT_QUAT(quat(m_a_transform)), LOL2BT_VEC3(m_a_transform.v3.xyz * LOL2BT_UNIT)),
102                                                                                                                btTransform(LOL2BT_QUAT(quat(m_b_transform)), LOL2BT_VEC3(m_b_transform.v3.xyz * LOL2BT_UNIT)),
103                                                                                                                m_using_ref_a);
104                m_typed_constraint = m_slider_constraint;
105        }
106
107        void CustomInitConstraintToConeTwist()
108        {
109                m_cone_twist_constraint = new btConeTwistConstraint(*m_a_physobj->m_rigid_body, *m_b_physobj->m_rigid_body,
110                                                                                                                btTransform(LOL2BT_QUAT(quat(m_a_transform)), LOL2BT_VEC3(m_a_transform.v3.xyz * LOL2BT_UNIT)),
111                                                                                                                btTransform(LOL2BT_QUAT(quat(m_b_transform)), LOL2BT_VEC3(m_b_transform.v3.xyz * LOL2BT_UNIT)));
112                m_typed_constraint = m_cone_twist_constraint;
113        }
114
115        void CustomInitConstraintTo6Dof()
116        {
117                m_6dof_constraint = new btGeneric6DofConstraint(*m_a_physobj->m_rigid_body, *m_b_physobj->m_rigid_body,
118                                                                                                                btTransform(LOL2BT_QUAT(quat(m_a_transform)), LOL2BT_VEC3(m_a_transform.v3.xyz * LOL2BT_UNIT)),
119                                                                                                                btTransform(LOL2BT_QUAT(quat(m_b_transform)), LOL2BT_VEC3(m_b_transform.v3.xyz * LOL2BT_UNIT)),
120                                                                                                                m_using_ref_a);
121                m_typed_constraint = m_6dof_constraint;
122        }
123
124        btTypedConstraint*                      m_typed_constraint;
125        btPoint2PointConstraint*        m_p2p_constraint;
126        btHingeConstraint*                      m_hinge_constraint;
127        btSliderConstraint*                     m_slider_constraint;
128        btConeTwistConstraint*          m_cone_twist_constraint;
129        btGeneric6DofConstraint*        m_6dof_constraint;
130
131#else  // NO PHYSIC IMPLEMENTATION
132
133public:
134        EasyConstraint() :
135                m_a_physobj(NULL),
136                m_b_physobj(NULL),
137                m_a_transform(lol::mat4(1.f)),
138                m_b_transform(lol::mat4(1.f)),
139                m_using_ref_a(false),
140                m_disable_a2b_collision(false)
141        {
142        }
143
144private:
145
146        void AddToSimulation(class Simulation* current_simulation) { }
147        void RemoveFromSimulation(class Simulation* current_simulation) { }
148
149        //check if Init can be done
150        bool CanProceedWithInit() { return false; }
151        void CustomInitConstraintToPoint2Point() { }
152        void CustomInitConstraintToHinge() { }
153        void CustomInitConstraintToSlider() { }
154        void CustomInitConstraintToConeTwist() { }
155        void CustomInitConstraintTo6Dof() { }
156
157#endif // PHYSIC IMPLEMENTATION
158
159public:
160        void InitConstraintToPoint2Point()      { if (CanProceedWithInit()) CustomInitConstraintToPoint2Point(); }
161        void InitConstraintToHinge()            { if (CanProceedWithInit()) CustomInitConstraintToHinge(); }
162        void InitConstraintToSlider()           { if (CanProceedWithInit()) CustomInitConstraintToSlider(); }
163        void InitConstraintToConeTwist()        { if (CanProceedWithInit()) CustomInitConstraintToConeTwist(); }
164        void InitConstraintTo6Dof()                     { if (CanProceedWithInit()) CustomInitConstraintTo6Dof(); }
165
166        //Set given physic object to the proper slot.
167        void SetPhysObjA(EasyPhysic* NewPhysObj, lol::mat4 NewTransform) { SetPhysObj(false, NewPhysObj, NewTransform); }
168        void SetPhysObjB(EasyPhysic* NewPhysObj, lol::mat4 NewTransform) { SetPhysObj(true, NewPhysObj, NewTransform); }
169        void SetPhysObj(bool SetToB, EasyPhysic* NewPhysObj, lol::mat4 NewTransform)
170        {
171                if (SetToB)
172                {
173                        m_b_physobj = NewPhysObj;
174                        m_b_transform = NewTransform;
175                }
176                else
177                {
178                        m_a_physobj = NewPhysObj;
179                        m_a_transform = NewTransform;
180                }
181        }
182
183        //Set whether or not the physic engine should use the A object as the reference (most constraint transform are local).
184        void SetRefAsA(bool NewUseRefA)
185        {
186                m_using_ref_a = NewUseRefA;
187        }
188
189        //Set whether or not to disable the collision between the bodies
190        void DisableCollisionBetweenObjs(bool DisableCollision)
191        {
192                m_disable_a2b_collision = DisableCollision;
193        }
194
195private:
196        EasyPhysic*                                     m_a_physobj;
197        EasyPhysic*                                     m_b_physobj;
198        lol::mat4                                       m_a_transform;
199        lol::mat4                                       m_b_transform;
200        bool                                            m_using_ref_a;
201        bool                                            m_disable_a2b_collision;
202
203};
204
205} /* namespace phys */
206
207} /* namespace lol */
208
209#endif /* __EASYCONSTRAINT_EASYCONSTRAINT_H__ */
210
Note: See TracBrowser for help on using the repository browser.