source: trunk/test/PhysicObject.h @ 1834

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

small tweak on BtPhysTest. does not work better.

File size: 7.9 KB
Line 
1//
2// Orbital
3//
4// Copyright: (c) 2009-2012 Cédric Lecacheur <jordx@free.fr>
5//            (c) 2009-2012 Benjamin Huet <huet.benjamin@gmail.com>
6//            (c) 2012 Sam Hocevar <sam@hocevar.net>
7//
8
9/* FIXME: this file is pure crap; it's only a test. */
10
11#if !defined __PHYSICOBJECT_H__
12#define __PHYSICOBJECT_H__
13
14#include "core.h"
15#include "easymesh/easymesh.h"
16#include "Physics/Include/EasyPhysics.h"
17#include "Physics/Include/EasyCharacterController.h"
18#include "Physics/Include/EasyConstraint.h"
19
20using namespace lol;
21using namespace lol::phys;
22
23class PhysicsObject : public WorldEntity
24{
25public:
26        PhysicsObject(Simulation* new_sim, const vec3 &base_location, const quat &base_rotation)
27                : m_ready(false), m_should_render(true), m_is_character(false)
28        {
29                m_physics = new EasyPhysic(this);
30
31                m_mesh.Compile("[sc#ddd afcb60 1 60 -.1]");
32                vec3 BoxSize = vec3(60.f, 1.f, 60.f);
33                m_physics->SetCollisionChannel(0, 0xFF);
34                m_physics->SetShapeToBox(BoxSize);
35                m_physics->SetMass(.0f);
36                m_physics->SetTransform(base_location, base_rotation);
37                m_physics->InitBodyToRigid(true);
38                m_physics->AddToSimulation(new_sim);
39        }
40
41        PhysicsObject(Simulation* new_sim, const vec3 &base_location, const quat &base_rotation, int dummy)
42                : m_ready(false), m_should_render(true), m_is_character(false)
43        {
44                if (dummy == 1) //for platform purpose
45                {
46                        m_physics = new EasyPhysic(this);
47
48                        m_mesh.Compile("[sc#ddd afcb20 1 20 -.1]");
49                        vec3 BoxSize = vec3(20.f, 1.f, 20.f);
50                        m_physics->SetCollisionChannel(0, 0xFF);
51                        m_physics->SetShapeToBox(BoxSize);
52                        m_physics->SetMass(.0f);
53                        m_physics->SetTransform(base_location, base_rotation);
54                        m_physics->InitBodyToRigid(true);
55                        m_physics->AddToSimulation(new_sim);
56                }
57                else if (dummy == 2) //for character purpose
58                {
59                        m_character = new EasyCharacterController(this);
60                        m_is_character = true;
61                        //m_mesh.Compile("[sc#f00 afcb10 10 10 -.1]");
62                        m_mesh.Compile(
63                                "[sc#000 scb#000"
64                                //"[sc#aaa scb#aaa"
65                                "[ad8 2 0 rx180 ty-1]"
66                                "[asph8 .5 .5 .5 ty1]"
67                                "[ac32 2 .5 .5 0 0]"
68                                "[asph6 .1 .1 .1 ty.9 tx.5 tz.15]"
69                                "[asph6 .1 .1 .1 ty.9 tx.5 tz-.15]"
70                                "[asph8 .05 .5 .05 ty.6 tz.5]"
71                                "[asph8 .05 .5 .05 ty.6 tz-.5]"
72                                "]"
73                                "[sc#fd0 scb#fd0"
74                                "[ac8 .4 .1 0 0 0 ty.25 rz-90 ty.7 tx.5]"
75                                "]"
76                                "["
77                                "[sc#fff scb#fff"
78                                "[ad8 2 0 rx180 ty-1]"
79                                "[asph8 .5 .5 .5 ty1]"
80                                "[ac32 1.9 .5 .5 0 0]"
81                                "]"
82                                " ty-.1 tx.05]"
83                                );
84                        vec3 BoxSize = vec3(.5f, 2.f, .5f);
85                        m_character->SetCollisionChannel(0, 0xFF);
86                        m_character->SetShapeToCapsule(BoxSize.x, BoxSize.y);
87                        m_character->SetMass(.0f);
88                        m_character->SetTransform(base_location, base_rotation);
89                        m_character->InitBodyToGhost();
90                        m_character->AddToSimulation(new_sim);
91                }
92        }
93
94        PhysicsObject(Simulation* new_sim, float base_mass, const vec3 &base_location, int RandValue = -1)
95                : m_ready(false), m_should_render(true), m_is_character(false)
96        {
97                Array<char const *> MeshRand;
98
99                //MeshRand << "[sc#add afcb2 2 2 -.1]";
100                //MeshRand << "[sc#dad afcb2 2 2 -.1]";
101                //MeshRand << "[sc#dda afcb2 2 2 -.1]";
102                //MeshRand << "[sc#daa afcb2 2 2 -.1]";
103                //MeshRand << "[sc#ada afcb2 2 2 -.1]";
104                //MeshRand << "[sc#aad afcb2 2 2 -.1]";
105                MeshRand << "[sc#add afcb1.7 1.7 1.7 0][sc#000 afcb1.9 1.9 1.9 0 sx-1 sy-1 sz-1]";
106                MeshRand << "[sc#dad afcb1.7 1.7 1.7 0][sc#000 afcb1.9 1.9 1.9 0 sx-1 sy-1 sz-1]";
107                MeshRand << "[sc#dda afcb1.7 1.7 1.7 0][sc#000 afcb1.9 1.9 1.9 0 sx-1 sy-1 sz-1]";
108                MeshRand << "[sc#daa afcb1.7 1.7 1.7 0][sc#000 afcb1.9 1.9 1.9 0 sx-1 sy-1 sz-1]";
109                MeshRand << "[sc#ada afcb1.7 1.7 1.7 0][sc#000 afcb1.9 1.9 1.9 0 sx-1 sy-1 sz-1]";
110                MeshRand << "[sc#aad afcb1.7 1.7 1.7 0][sc#000 afcb1.9 1.9 1.9 0 sx-1 sy-1 sz-1]";
111
112                int SphereLimit = MeshRand.Count();
113
114                MeshRand << "[sc#add asph1 2 2 2]";
115                MeshRand << "[sc#dad asph1 2 2 2]";
116                MeshRand << "[sc#dda asph1 2 2 2]";
117                MeshRand << "[sc#daa asph1 2 2 2]";
118                MeshRand << "[sc#ada asph1 2 2 2]";
119                MeshRand << "[sc#aad asph1 2 2 2]";
120
121                int ConeLimit = MeshRand.Count();
122
123                MeshRand << "[sc#add scb#add ad1 2 0 rx180 ty-1 ac4 2 2 0 0 0]";
124                MeshRand << "[sc#dad scb#dad ad1 2 0 rx180 ty-1 ac4 2 2 0 0 0]";
125                MeshRand << "[sc#dda scb#dda ad1 2 0 rx180 ty-1 ac4 2 2 0 0 0]";
126                MeshRand << "[sc#daa scb#daa ad1 2 0 rx180 ty-1 ac4 2 2 0 0 0]";
127                MeshRand << "[sc#ada scb#ada ad1 2 0 rx180 ty-1 ac4 2 2 0 0 0]";
128                MeshRand << "[sc#aad scb#aad ad1 2 0 rx180 ty-1 ac4 2 2 0 0 0]";
129
130                int CylLimit = MeshRand.Count();
131
132                MeshRand << "[sc#add scb#add ad1 2 0 rx180 ty-1 my ac4 2 2 2 0 0]";
133                MeshRand << "[sc#dad scb#dad ad1 2 0 rx180 ty-1 my ac4 2 2 2 0 0]";
134                MeshRand << "[sc#dda scb#dda ad1 2 0 rx180 ty-1 my ac4 2 2 2 0 0]";
135                MeshRand << "[sc#daa scb#daa ad1 2 0 rx180 ty-1 my ac4 2 2 2 0 0]";
136                MeshRand << "[sc#ada scb#ada ad1 2 0 rx180 ty-1 my ac4 2 2 2 0 0]";
137                MeshRand << "[sc#aad scb#aad ad1 2 0 rx180 ty-1 my ac4 2 2 2 0 0]";
138
139                int CapsLimit = MeshRand.Count();
140
141                MeshRand << "[sc#add scb#add acap1 2 1]";
142                MeshRand << "[sc#dad scb#dad acap1 2 1]";
143                MeshRand << "[sc#dda scb#dda acap1 2 1]";
144                MeshRand << "[sc#daa scb#daa acap1 2 1]";
145                MeshRand << "[sc#ada scb#ada acap1 2 1]";
146                MeshRand << "[sc#aad scb#aad acap1 2 1]";
147
148                switch (RandValue)
149                {
150                        case 0:
151                        {
152                                RandValue = (int)(lol::RandF() * (SphereLimit - 1));
153                                break;
154                        }
155                        case 1:
156                        {
157                                RandValue = SphereLimit + (int)(lol::RandF() * ((ConeLimit - SphereLimit) - 1));
158                                break;
159                        }
160                        case 2:
161                        {
162                                RandValue = ConeLimit + (int)(lol::RandF() * ((CylLimit - ConeLimit) - 1));
163                                break;
164                        }
165                        case 3:
166                        {
167                                RandValue = CylLimit + (int)(lol::RandF() * ((CapsLimit - CylLimit) - 1));
168                                break;
169                        }
170                        case 4:
171                        {
172                                RandValue = CapsLimit + (int)(lol::RandF() * ((MeshRand.Count() - CapsLimit) - 1));
173                                break;
174                        }
175                        default:
176                        {
177                                RandValue = (int)(lol::RandF() * (MeshRand.Count() - 1));
178                        }
179                }
180
181                m_physics = new EasyPhysic(this);
182
183                m_mesh.Compile(MeshRand[RandValue]);
184                vec3 BoxSize = vec3(2.0f);
185                int ColGroup = 1;
186                if (RandValue < SphereLimit)
187                {
188                        m_physics->SetShapeToBox(BoxSize);
189                        ColGroup += 0;
190                }
191                else if (RandValue < ConeLimit)
192                {
193                        m_physics->SetShapeToSphere(BoxSize.x * 2.f);
194                        ColGroup += 1;
195                }
196                else if (RandValue < CylLimit)
197                {
198                        m_physics->SetShapeToCone(BoxSize.x, BoxSize.y);
199                        ColGroup += 2;
200                }
201                else if (RandValue < CapsLimit)
202                {
203                        m_physics->SetShapeToCylinder(BoxSize);
204                        ColGroup += 3;
205                }
206                else
207                {
208                        m_physics->SetShapeToCapsule(BoxSize.x, BoxSize.y);
209                        ColGroup += 4;
210                }
211
212                m_physics->SetCollisionChannel(0, 0xFF);
213                //m_physics->SetCollisionChannel(ColGroup, (1<<ColGroup)|(1));
214                m_physics->SetMass(base_mass);
215                m_physics->SetTransform(base_location);
216                m_physics->InitBodyToRigid();
217                m_physics->AddToSimulation(new_sim);
218        }
219
220        void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation=lol::quat(lol::mat4(1.0f)))
221        {
222                if (m_is_character)
223                        m_character->SetTransform(base_location, base_rotation);
224                else
225                        m_physics->SetTransform(base_location, base_rotation);
226        }
227
228        lol::mat4 GetTransform()
229        {
230                if (m_is_character)
231                        return m_character->GetTransform();
232                else
233                        return m_physics->GetTransform();
234        }
235
236        void SetRender(bool should_render)
237        {
238                m_should_render = should_render;
239        }
240
241        EasyMesh *GetMesh() { return &m_mesh; }
242        EasyPhysic *GetPhysic() { return m_physics; }
243        EasyCharacterController *GetCharacter() { return m_character; }
244
245        ~PhysicsObject()
246        {
247        }
248
249        char const *GetName() { return "<PhysicsObject>"; }
250
251protected:
252        virtual void TickGame(float seconds)
253        {
254                WorldEntity::TickGame(seconds);
255        }
256
257        virtual void TickDraw(float seconds)
258        {
259                WorldEntity::TickDraw(seconds);
260
261                if (!m_ready)
262                {
263                        m_mesh.MeshConvert();
264                        m_ready = true;
265                }
266
267                if (m_should_render)
268                {
269                        if (m_is_character)
270                                m_mesh.Render(m_character->GetTransform());
271                        else
272                                m_mesh.Render(m_physics->GetTransform());
273                }
274        }
275
276private:
277        //Base datas
278        EasyMesh                                        m_mesh;
279        EasyPhysic*                                     m_physics;
280        EasyCharacterController*        m_character;
281
282        bool                                            m_ready;
283        bool                                            m_should_render;
284        bool                                            m_is_character;
285};
286
287#endif /* __PHYSICOBJECT_H__ */
288
Note: See TracBrowser for help on using the repository browser.