source: trunk/test/physicobject.h @ 2879

Last change on this file since 2879 was 2879, checked in by touky, 6 years ago

btPhysTest : Added a new test mode called "CAT_MODE". Try it out at your own risks.

  • Property svn:eol-style set to LF
File size: 11.5 KB
Line 
1//
2// Orbital
3//
4// Copyright: (c) 2009-2013 Cédric Lecacheur <jordx@free.fr>
5//            (c) 2009-2013 Benjamin "Touky" 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/easyphysics.h"
17#include "physics/easycharactercontroller.h"
18#include "physics/easyconstraint.h"
19
20using namespace lol;
21using namespace lol::phys;
22
23#if CAT_MODE
24#define USE_SPHERE          1
25#else
26#define USE_BOX             1
27#define USE_SPHERE          1
28#define USE_CONE            1
29#define USE_CYLINDER        1
30#define USE_CAPSULE         1
31#endif
32
33class PhysicsObject : public WorldEntity
34{
35public:
36    PhysicsObject(Simulation* new_sim, const vec3 &base_location, const quat &base_rotation)
37        : m_ready(false), m_should_render(true), m_is_character(false), m_custom_shader(0)
38    {
39#if CAT_MODE
40        m_is_phys = false;
41#endif //CAT_MODE
42        m_physics = new EasyPhysic(this);
43
44        m_mesh.Compile("[sc#ddd afcb 60 1 60 -.1]");
45        vec3 BoxSize = vec3(60.f, 1.f, 60.f);
46        m_physics->SetCollisionChannel(0, 0xFF);
47        m_physics->SetShapeToBox(BoxSize);
48        m_physics->SetMass(.0f);
49        m_physics->SetTransform(base_location, base_rotation);
50        m_physics->InitBodyToRigid(true);
51        m_physics->AddToSimulation(new_sim);
52    }
53
54    PhysicsObject(Simulation* new_sim, const vec3 &base_location, const quat &base_rotation, int dummy)
55        : m_ready(false), m_should_render(true), m_is_character(false), m_custom_shader(0)
56    {
57#if CAT_MODE
58        m_is_phys = false;
59#endif //CAT_MODE
60        if (dummy == 1) //for platform purpose
61        {
62            m_physics = new EasyPhysic(this);
63
64            m_mesh.Compile("[sc#ddd afcb 20 1 20 -.1]");
65            vec3 BoxSize = vec3(20.f, 1.f, 20.f);
66            m_physics->SetCollisionChannel(0, 0xFF);
67            m_physics->SetShapeToBox(BoxSize);
68            m_physics->SetMass(.0f);
69            m_physics->SetTransform(base_location, base_rotation);
70            m_physics->InitBodyToRigid(true);
71            m_physics->AddToSimulation(new_sim);
72        }
73        else if (dummy == 2) //for character purpose
74        {
75            m_character = new EasyCharacterController(this);
76            m_is_character = true;
77            //m_mesh.Compile("[sc#f00 afcb10 10 10 -.1]");
78            m_mesh.Compile(
79                "[sc#000 scb#000"
80                //"[sc#aaa scb#aaa"
81                "[ad8 2 0 rx180 ty-1]"
82                "[asph8 .5 ty1]"
83                "[ac32 2 .5 .5 0 0]"
84                "[asph6 .1 ty.9 tx.5 tz.15]"
85                "[asph6 .1 ty.9 tx.5 tz-.15]"
86                "[asph8 .05 sy10 ty.6 tz.5]"
87                "[asph8 .05 sy10 ty.6 tz-.5]"
88                "]"
89                "[sc#fd0 scb#fd0"
90                "[ac8 .4 .1 0 0 0 ty.25 rz-90 ty.7 tx.5]"
91                "]"
92                "["
93                "[sc#fff scb#fff"
94                "[ad8 2 0 rx180 ty-1]"
95                "[asph8 .5 ty1]"
96                "[ac32 1.9 .5 .5 0 0]"
97                "]"
98                " ty-.1 tx.05]"
99                );
100            vec3 BoxSize = vec3(1.f, 2.f, 1.f);
101            m_character->SetCollisionChannel(0, 0xFF);
102            m_character->SetShapeToCapsule(BoxSize.x, BoxSize.y);
103            m_character->SetMass(.0f);
104            //m_character->SetStepHeight(1.f);
105            m_character->SetTransform(base_location, base_rotation);
106            m_character->InitBodyToGhost();
107            m_character->AddToSimulation(new_sim);
108        }
109        else if (dummy == 3) //for Stairs purpose
110        {
111            m_physics = new EasyPhysic(this);
112
113            m_mesh.Compile("[sc#aae afcb4 .25 4 -.01]");
114            vec3 BoxSize = vec3(4.f, .25f, 4.f);
115            m_physics->SetCollisionChannel(0, 0xFF);
116            m_physics->SetShapeToBox(BoxSize);
117            m_physics->SetMass(.0f);
118            m_physics->SetTransform(base_location, base_rotation);
119            m_physics->InitBodyToRigid(true);
120            m_physics->AddToSimulation(new_sim);
121        }
122    }
123
124    PhysicsObject(Simulation* new_sim, float base_mass, const vec3 &base_location, int RandValue = -1)
125        : m_ready(false), m_should_render(true), m_is_character(false), m_custom_shader(0)
126    {
127        Array<char const *> MeshRand;
128        Array<int> MeshLimit;
129        Array<int> MeshType;
130
131#if CAT_MODE
132        m_is_phys = true;
133#endif //CAT_MODE
134
135        MeshLimit << 0;
136
137#if USE_BOX
138        MeshRand << "[sc#add afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]";
139        MeshRand << "[sc#dad afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]";
140        MeshRand << "[sc#dda afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]";
141        MeshRand << "[sc#daa afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]";
142        MeshRand << "[sc#ada afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]";
143        MeshRand << "[sc#aad afcb1.7 1.7 1.7 0.4][sc#000 tsw afcb1.9 1.9 1.9 0.4 sx-1 sy-1 sz-1]";
144
145        MeshLimit << MeshRand.Count();
146        MeshType << 0;
147#endif //USE_BOX
148
149
150#if USE_SPHERE
151#if CAT_MODE
152        int nb_sprite = 4;
153        //SPRITE
154        vec2 start_point = vec2((float)rand(nb_sprite), (float)rand(nb_sprite)) / vec2((float)nb_sprite);
155        vec2 size = vec2(1.f) / vec2((float)nb_sprite);
156        m_mesh.BD()->SetTexCoordCustomBuild(MeshType::Quad, MeshFaceType::QuadDefault,
157                                            start_point, start_point + size);
158        m_mesh.BD()->SetTexCoordCustomBuild2(MeshType::Quad, MeshFaceType::QuadDefault,
159                                             vec2(-4.f), vec2(4.f));
160        MeshRand << "[sc#ffff aq 0 0]";
161        MeshRand << "[sc#ffff aq 0 0]";
162        MeshRand << "[sc#ffff aq 0 0]";
163        MeshRand << "[sc#fbbf aq 0 0]";
164        MeshRand << "[sc#bbff aq 0 0]";
165        MeshRand << "[sc#bfbf aq 0 0]";
166#else
167        MeshRand << "[sc#add asph1 2]";
168        MeshRand << "[sc#dad asph1 2]";
169        MeshRand << "[sc#dda asph1 2]";
170        MeshRand << "[sc#daa asph1 2]";
171        MeshRand << "[sc#ada asph1 2]";
172        MeshRand << "[sc#aad asph1 2]";
173#endif
174
175        MeshLimit << MeshRand.Count();
176        MeshType << 1;
177#endif //USE_SPHERE
178
179#if USE_CONE
180        MeshRand << "[sc#add scb#add ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]";
181        MeshRand << "[sc#dad scb#dad ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]";
182        MeshRand << "[sc#dda scb#dda ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]";
183        MeshRand << "[sc#daa scb#daa ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]";
184        MeshRand << "[sc#ada scb#ada ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]";
185        MeshRand << "[sc#aad scb#aad ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]";
186
187        MeshLimit << MeshRand.Count();
188        MeshType << 2;
189#endif //USE_CONE
190
191#if USE_CYLINDER
192        MeshRand << "[sc#add scb#add ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]";
193        MeshRand << "[sc#dad scb#dad ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]";
194        MeshRand << "[sc#dda scb#dda ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]";
195        MeshRand << "[sc#daa scb#daa ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]";
196        MeshRand << "[sc#ada scb#ada ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]";
197        MeshRand << "[sc#aad scb#aad ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]";
198
199        MeshLimit << MeshRand.Count();
200        MeshType << 3;
201#endif //USE_CYLINDER
202
203#if USE_CAPSULE
204        MeshRand << "[sc#add scb#add acap1 2 1]";
205        MeshRand << "[sc#dad scb#dad acap1 2 1]";
206        MeshRand << "[sc#dda scb#dda acap1 2 1]";
207        MeshRand << "[sc#daa scb#daa acap1 2 1]";
208        MeshRand << "[sc#ada scb#ada acap1 2 1]";
209        MeshRand << "[sc#aad scb#aad acap1 2 1]";
210
211        MeshLimit << MeshRand.Count();
212        MeshType << 4;
213#endif //USE_CAPSULE
214
215        int RandLimit = RandValue;
216        if (MeshLimit.Count() <= RandValue || RandValue < 0)
217            RandLimit = rand(MeshLimit.Count() - 1);
218        RandValue = rand(MeshLimit[RandLimit], MeshLimit[RandLimit + 1]);
219
220        m_physics = new EasyPhysic(this);
221
222        m_mesh.Compile(MeshRand[RandValue]);
223        m_mesh.Scale(vec3(OBJ_SIZE));
224        vec3 BoxSize = vec3(2.0f) * OBJ_SIZE;
225        int ColGroup = 1;
226
227        switch (MeshType[RandLimit])
228        {
229            case 0:
230            {
231                m_physics->SetShapeToBox(BoxSize);
232                ColGroup += 0;
233                break;
234            }
235            case 1:
236            {
237                m_physics->SetShapeToSphere(BoxSize.x);
238                ColGroup += 1;
239                break;
240            }
241            case 2:
242            {
243                m_physics->SetShapeToCone(BoxSize.x, BoxSize.y);
244                ColGroup += 2;
245                break;
246            }
247            case 3:
248            {
249                m_physics->SetShapeToCylinder(BoxSize);
250                ColGroup += 3;
251                break;
252            }
253            case 4:
254            {
255                m_physics->SetShapeToCapsule(BoxSize.x, BoxSize.y);
256                ColGroup += 4;
257                break;
258            }
259            default:
260            {
261            }
262        }
263
264        m_physics->SetHitRestitution(1.0f);
265        m_physics->SetCollisionChannel(0, 0xFF);
266        //m_physics->SetCollisionChannel(ColGroup, (1 << ColGroup)|(1));
267        m_physics->SetMass(base_mass);
268        m_physics->SetTransform(base_location);
269        m_physics->InitBodyToRigid();
270        m_physics->AddToSimulation(new_sim);
271    }
272
273    void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation=lol::quat(lol::mat4(1.0f)))
274    {
275        if (m_is_character)
276            m_character->SetTransform(base_location, base_rotation);
277        else
278            m_physics->SetTransform(base_location, base_rotation);
279    }
280
281    lol::mat4 GetTransform()
282    {
283        if (m_is_character)
284            return m_character->GetTransform();
285        else
286            return m_physics->GetTransform();
287    }
288
289    void SetRender(bool should_render)
290    {
291        m_should_render = should_render;
292    }
293
294    void SetCustomShaderData(GpuShaderData* custom_shader)
295    {
296        m_custom_shader = custom_shader;
297    }
298
299    EasyMesh *GetMesh() { return &m_mesh; }
300    EasyPhysic *GetPhysic() { return m_physics; }
301    EasyCharacterController *GetCharacter() { return m_character; }
302
303    ~PhysicsObject()
304    {
305    }
306
307    char const *GetName() { return "<PhysicsObject>"; }
308
309protected:
310    virtual void TickGame(float seconds)
311    {
312        WorldEntity::TickGame(seconds);
313    }
314
315    virtual void TickDraw(float seconds)
316    {
317        WorldEntity::TickDraw(seconds);
318
319#if CAT_MODE
320        if (!m_is_phys || m_custom_shader)
321#endif //CAT_MODE
322        {
323            if (!m_ready)
324            {
325                if (m_custom_shader)
326                    m_mesh.MeshConvert(m_custom_shader);
327                else
328                    m_mesh.MeshConvert();
329                m_ready = true;
330            }
331            else if (m_should_render)
332            {
333                if (m_is_character)
334                    m_mesh.Render(m_character->GetTransform());
335                else
336                    m_mesh.Render(m_physics->GetTransform());
337            }
338        }
339    }
340
341private:
342    //Base datas
343    EasyMesh                    m_mesh;
344    EasyPhysic*                 m_physics;
345    EasyCharacterController*    m_character;
346    GpuShaderData*              m_custom_shader;
347
348    bool                        m_ready;
349    bool                        m_should_render;
350    bool                        m_is_character;
351#if CAT_MODE
352    bool                        m_is_phys;
353#endif //CAT_MODE
354};
355
356#endif /* __PHYSICOBJECT_H__ */
357
Note: See TracBrowser for help on using the repository browser.