Ignore:
Timestamp:
Sep 9, 2013, 12:30:11 AM (6 years ago)
Author:
touky
Message:

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/test/physicobject.h

    r2816 r2879  
    2121using namespace lol::phys;
    2222
     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
    2333class PhysicsObject : public WorldEntity
    2434{
    2535public:
    2636    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     {
     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
    2942        m_physics = new EasyPhysic(this);
    3043
     
    4053
    4154    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     {
     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
    4460        if (dummy == 1) //for platform purpose
    4561        {
     
    107123
    108124    PhysicsObject(Simulation* new_sim, float base_mass, const vec3 &base_location, int RandValue = -1)
    109         : m_ready(false), m_should_render(true), m_is_character(false)
     125        : m_ready(false), m_should_render(true), m_is_character(false), m_custom_shader(0)
    110126    {
    111127        Array<char const *> MeshRand;
    112 
     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
    113138        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]";
    114139        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]";
     
    118143        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]";
    119144
    120         int SphereLimit = MeshRand.Count();
    121 
     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
    122167        MeshRand << "[sc#add asph1 2]";
    123168        MeshRand << "[sc#dad asph1 2]";
     
    126171        MeshRand << "[sc#ada asph1 2]";
    127172        MeshRand << "[sc#aad asph1 2]";
    128 
    129         int ConeLimit = MeshRand.Count();
    130 
     173#endif
     174
     175        MeshLimit << MeshRand.Count();
     176        MeshType << 1;
     177#endif //USE_SPHERE
     178
     179#if USE_CONE
    131180        MeshRand << "[sc#add scb#add ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]";
    132181        MeshRand << "[sc#dad scb#dad ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]";
     
    136185        MeshRand << "[sc#aad scb#aad ad8 2 0 rx180 ty-1 ac8 2 2 0 0 0]";
    137186
    138         int CylLimit = MeshRand.Count();
    139 
     187        MeshLimit << MeshRand.Count();
     188        MeshType << 2;
     189#endif //USE_CONE
     190
     191#if USE_CYLINDER
    140192        MeshRand << "[sc#add scb#add ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]";
    141193        MeshRand << "[sc#dad scb#dad ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]";
     
    145197        MeshRand << "[sc#aad scb#aad ad8 2 0 rx180 ty-1 my ac8 2 2 2 0 0]";
    146198
    147         int CapsLimit = MeshRand.Count();
    148 
     199        MeshLimit << MeshRand.Count();
     200        MeshType << 3;
     201#endif //USE_CYLINDER
     202
     203#if USE_CAPSULE
    149204        MeshRand << "[sc#add scb#add acap1 2 1]";
    150205        MeshRand << "[sc#dad scb#dad acap1 2 1]";
     
    154209        MeshRand << "[sc#aad scb#aad acap1 2 1]";
    155210
    156         switch (RandValue)
     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])
    157228        {
    158229            case 0:
    159230            {
    160                 RandValue = rand(SphereLimit);
     231                m_physics->SetShapeToBox(BoxSize);
     232                ColGroup += 0;
    161233                break;
    162234            }
    163235            case 1:
    164236            {
    165                 RandValue = rand(SphereLimit, ConeLimit);
     237                m_physics->SetShapeToSphere(BoxSize.x);
     238                ColGroup += 1;
    166239                break;
    167240            }
    168241            case 2:
    169242            {
    170                 RandValue = rand(ConeLimit, CylLimit);
     243                m_physics->SetShapeToCone(BoxSize.x, BoxSize.y);
     244                ColGroup += 2;
    171245                break;
    172246            }
    173247            case 3:
    174248            {
    175                 RandValue = rand(CylLimit, CapsLimit);
     249                m_physics->SetShapeToCylinder(BoxSize);
     250                ColGroup += 3;
    176251                break;
    177252            }
    178253            case 4:
    179254            {
    180                 RandValue = rand(CapsLimit, MeshRand.Count());
     255                m_physics->SetShapeToCapsule(BoxSize.x, BoxSize.y);
     256                ColGroup += 4;
    181257                break;
    182258            }
    183259            default:
    184260            {
    185                 RandValue = rand(MeshRand.Count());
    186             }
    187         }
    188 
    189         m_physics = new EasyPhysic(this);
    190 
    191         m_mesh.Compile(MeshRand[RandValue]);
    192         vec3 BoxSize = vec3(2.0f);
    193         int ColGroup = 1;
    194         if (RandValue < SphereLimit)
    195         {
    196             m_physics->SetShapeToBox(BoxSize);
    197             ColGroup += 0;
    198         }
    199         else if (RandValue < ConeLimit)
    200         {
    201             m_physics->SetShapeToSphere(BoxSize.x * 2.f);
    202             ColGroup += 1;
    203         }
    204         else if (RandValue < CylLimit)
    205         {
    206             m_physics->SetShapeToCone(BoxSize.x, BoxSize.y);
    207             ColGroup += 2;
    208         }
    209         else if (RandValue < CapsLimit)
    210         {
    211             m_physics->SetShapeToCylinder(BoxSize);
    212             ColGroup += 3;
    213         }
    214         else
    215         {
    216             m_physics->SetShapeToCapsule(BoxSize.x, BoxSize.y);
    217             ColGroup += 4;
    218         }
    219 
     261            }
     262        }
     263
     264        m_physics->SetHitRestitution(1.0f);
    220265        m_physics->SetCollisionChannel(0, 0xFF);
    221266        //m_physics->SetCollisionChannel(ColGroup, (1 << ColGroup)|(1));
     
    247292    }
    248293
     294    void SetCustomShaderData(GpuShaderData* custom_shader)
     295    {
     296        m_custom_shader = custom_shader;
     297    }
     298
    249299    EasyMesh *GetMesh() { return &m_mesh; }
    250300    EasyPhysic *GetPhysic() { return m_physics; }
     
    267317        WorldEntity::TickDraw(seconds);
    268318
    269         if (!m_ready)
    270         {
    271             m_mesh.MeshConvert();
    272             m_ready = true;
    273         }
    274 
    275         if (m_should_render)
    276         {
    277             if (m_is_character)
    278                 m_mesh.Render(m_character->GetTransform());
    279             else
    280                 m_mesh.Render(m_physics->GetTransform());
     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            }
    281338        }
    282339    }
     
    285342    //Base datas
    286343    EasyMesh                    m_mesh;
    287     EasyPhysic*                    m_physics;
     344    EasyPhysic*                 m_physics;
    288345    EasyCharacterController*    m_character;
     346    GpuShaderData*              m_custom_shader;
    289347
    290348    bool                        m_ready;
    291349    bool                        m_should_render;
    292350    bool                        m_is_character;
     351#if CAT_MODE
     352    bool                        m_is_phys;
     353#endif //CAT_MODE
    293354};
    294355
Note: See TracChangeset for help on using the changeset viewer.