source: trunk/test/physicobject.h @ 2881

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

btPhysTest : Tweaked the cat sheet.

  • 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(2.f, .0f) / vec2((float)nb_sprite);
156        vec2 size = vec2(1.f) / vec2((float)nb_sprite);
157        m_mesh.BD()->SetTexCoordCustomBuild(MeshType::Quad, MeshFaceType::QuadDefault,
158                                            start_point, start_point + size);
159        m_mesh.BD()->SetTexCoordCustomBuild2(MeshType::Quad, MeshFaceType::QuadDefault,
160                                             vec2(-4.f), vec2(4.f));
161        MeshRand << "[sc#ffff aq 0 0]";
162        MeshRand << "[sc#faaf aq 0 0]";
163        MeshRand << "[sc#afaf aq 0 0]";
164        MeshRand << "[sc#aaff aq 0 0]";
165#else
166        MeshRand << "[sc#add asph1 2]";
167        MeshRand << "[sc#dad asph1 2]";
168        MeshRand << "[sc#dda asph1 2]";
169        MeshRand << "[sc#daa asph1 2]";
170        MeshRand << "[sc#ada asph1 2]";
171        MeshRand << "[sc#aad asph1 2]";
172#endif
173
174        MeshLimit << MeshRand.Count();
175        MeshType << 1;
176#endif //USE_SPHERE
177
178#if USE_CONE
179        MeshRand << "[sc#add scb#add ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]";
180        MeshRand << "[sc#dad scb#dad ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]";
181        MeshRand << "[sc#dda scb#dda ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]";
182        MeshRand << "[sc#daa scb#daa ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]";
183        MeshRand << "[sc#ada scb#ada ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]";
184        MeshRand << "[sc#aad scb#aad ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]";
185
186        MeshLimit << MeshRand.Count();
187        MeshType << 2;
188#endif //USE_CONE
189
190#if USE_CYLINDER
191        MeshRand << "[sc#add scb#add ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]";
192        MeshRand << "[sc#dad scb#dad ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]";
193        MeshRand << "[sc#dda scb#dda ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]";
194        MeshRand << "[sc#daa scb#daa ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]";
195        MeshRand << "[sc#ada scb#ada ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]";
196        MeshRand << "[sc#aad scb#aad ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]";
197
198        MeshLimit << MeshRand.Count();
199        MeshType << 3;
200#endif //USE_CYLINDER
201
202#if USE_CAPSULE
203        MeshRand << "[sc#add scb#add acap1 2 1]";
204        MeshRand << "[sc#dad scb#dad acap1 2 1]";
205        MeshRand << "[sc#dda scb#dda acap1 2 1]";
206        MeshRand << "[sc#daa scb#daa acap1 2 1]";
207        MeshRand << "[sc#ada scb#ada acap1 2 1]";
208        MeshRand << "[sc#aad scb#aad acap1 2 1]";
209
210        MeshLimit << MeshRand.Count();
211        MeshType << 4;
212#endif //USE_CAPSULE
213
214        int RandLimit = RandValue;
215        if (MeshLimit.Count() <= RandValue || RandValue < 0)
216            RandLimit = rand(MeshLimit.Count() - 1);
217        RandValue = rand(MeshLimit[RandLimit], MeshLimit[RandLimit + 1]);
218
219        m_physics = new EasyPhysic(this);
220
221        m_mesh.Compile(MeshRand[RandValue]);
222        m_mesh.Scale(vec3(OBJ_SIZE));
223        vec3 BoxSize = vec3(2.0f) * OBJ_SIZE;
224        int ColGroup = 1;
225
226        switch (MeshType[RandLimit])
227        {
228            case 0:
229            {
230                m_physics->SetShapeToBox(BoxSize);
231                ColGroup += 0;
232                break;
233            }
234            case 1:
235            {
236                m_physics->SetShapeToSphere(BoxSize.x);
237                ColGroup += 1;
238                break;
239            }
240            case 2:
241            {
242                m_physics->SetShapeToCone(BoxSize.x, BoxSize.y);
243                ColGroup += 2;
244                break;
245            }
246            case 3:
247            {
248                m_physics->SetShapeToCylinder(BoxSize);
249                ColGroup += 3;
250                break;
251            }
252            case 4:
253            {
254                m_physics->SetShapeToCapsule(BoxSize.x, BoxSize.y);
255                ColGroup += 4;
256                break;
257            }
258            default:
259            {
260            }
261        }
262
263        m_physics->SetHitRestitution(1.0f);
264        m_physics->SetCollisionChannel(0, 0xFF);
265        //m_physics->SetCollisionChannel(ColGroup, (1 << ColGroup)|(1));
266        m_physics->SetMass(base_mass);
267        m_physics->SetTransform(base_location);
268        m_physics->InitBodyToRigid();
269        m_physics->AddToSimulation(new_sim);
270    }
271
272    void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation=lol::quat(lol::mat4(1.0f)))
273    {
274        if (m_is_character)
275            m_character->SetTransform(base_location, base_rotation);
276        else
277            m_physics->SetTransform(base_location, base_rotation);
278    }
279
280    lol::mat4 GetTransform()
281    {
282        if (m_is_character)
283            return m_character->GetTransform();
284        else
285            return m_physics->GetTransform();
286    }
287
288    void SetRender(bool should_render)
289    {
290        m_should_render = should_render;
291    }
292
293    void SetCustomShaderData(GpuShaderData* custom_shader)
294    {
295        m_custom_shader = custom_shader;
296    }
297
298    EasyMesh *GetMesh() { return &m_mesh; }
299    EasyPhysic *GetPhysic() { return m_physics; }
300    EasyCharacterController *GetCharacter() { return m_character; }
301
302    ~PhysicsObject()
303    {
304    }
305
306    char const *GetName() { return "<PhysicsObject>"; }
307
308protected:
309    virtual void TickGame(float seconds)
310    {
311        WorldEntity::TickGame(seconds);
312    }
313
314    virtual void TickDraw(float seconds)
315    {
316        WorldEntity::TickDraw(seconds);
317
318#if CAT_MODE
319        if (!m_is_phys || m_custom_shader)
320#endif //CAT_MODE
321        {
322            if (!m_ready)
323            {
324                if (m_custom_shader)
325                    m_mesh.MeshConvert(m_custom_shader);
326                else
327                    m_mesh.MeshConvert();
328                m_ready = true;
329            }
330            else if (m_should_render)
331            {
332                if (m_is_character)
333                    m_mesh.Render(m_character->GetTransform());
334                else
335                    m_mesh.Render(m_physics->GetTransform());
336            }
337        }
338    }
339
340private:
341    //Base datas
342    EasyMesh                    m_mesh;
343    EasyPhysic*                 m_physics;
344    EasyCharacterController*    m_character;
345    GpuShaderData*              m_custom_shader;
346
347    bool                        m_ready;
348    bool                        m_should_render;
349    bool                        m_is_character;
350#if CAT_MODE
351    bool                        m_is_phys;
352#endif //CAT_MODE
353};
354
355#endif /* __PHYSICOBJECT_H__ */
356
Note: See TracBrowser for help on using the repository browser.