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/btphystest.cpp

    r2838 r2879  
    2121#include "physics/lolphysics.h"
    2222#include "physics/easyphysics.h"
     23
     24#define CAT_MODE        0
     25#define OBJ_SIZE        2.f
    2326#include "physicobject.h"
     27
    2428#include "btphystest.h"
    2529
     
    2832#define CUBE_HALF_EXTENTS .5f
    2933#define EXTRA_HEIGHT 1.f
     34#define BASE_TIME 2.f
     35#define ZERO_TIME (BASE_TIME + rand(-BASE_TIME * .4f, BASE_TIME * .4f))
     36#define ZERO_SPEED 3.5f
     37#define JUMP_HEIGHT 30.f
     38#define JUMP_STRAFE .5f
    3039
    3140int gNumObjects = 64;
    3241
     42#if CAT_MODE
     43#define USE_WALL        1
     44#define USE_BODIES      1
     45#else
    3346#define USE_WALL        1
    3447#define USE_PLATFORM    1
     
    3649#define USE_BODIES      1
    3750#define USE_ROTATION    0
    38 #define USE_CHARACTER   1
    39 #define USE_STAIRS      1
     51#define USE_CHARACTER   0
     52#define USE_STAIRS      0
     53#endif
     54
     55LOLFX_RESOURCE_DECLARE(front_camera_sprite);
    4056
    4157BtPhysTest::BtPhysTest(bool editor)
    4258{
    4359    m_loop_value = .0f;
     60
     61    g_renderer->SetAlphaFunc(AlphaFunc::Greater, 0.0);
     62
     63#if CAT_MODE
     64    /* cat datas setup */
     65    m_cat_texture = Tiler::Register("data/CatsSheet.png", ivec2(0), ivec2(0,1));
     66#endif //CAT_MODE
    4467
    4568    /* Register an input controller for the keyboard */
     
    5679    /* Create a camera that matches the settings of XNA BtPhysTest */
    5780    m_camera = new Camera();
     81#if CAT_MODE
     82    m_camera->SetView(vec3(70.f, 50.f, 0.f),
     83                      vec3(0.f, 0.f, 0.f),
     84                      vec3(0, 1, 0));
     85    m_camera->SetProjection(mat4::perspective(60.f, 1280.f, 960.f, .1f, 1000.f));
     86#else
    5887    m_camera->SetView(vec3(50.f, 50.f, 0.f),
    5988                      vec3(0.f, 0.f, 0.f),
    6089                      vec3(0, 1, 0));
    6190    m_camera->SetProjection(mat4::perspective(45.f, 1280.f, 960.f, .1f, 1000.f));
     91#endif
    6292    g_scene->PushCamera(m_camera);
    6393
     
    87117    float offset = 29.5f;
    88118    vec3 pos_offset = vec3(.0f, 30.f, .0f);
    89     if (USE_STAIRS)
     119#if USE_STAIRS
    90120    {
    91121        vec3 new_offset = vec3(1.0f, .125f, .0f);
     
    119149        }
    120150    }
    121 
    122     if (USE_WALL)
     151#endif //USE_STAIRS
     152
     153#if USE_WALL
    123154    {
    124155        for (int i=0; i < 6; i++)
     
    146177        }
    147178    }
     179#endif //USE_WALL
    148180
    149181    PhysicsObject* BasePhyobj = NULL;
    150     if (USE_PLATFORM)
     182#if USE_PLATFORM
    151183    {
    152184        quat NewRotation = quat::fromeuler_xyz(0.f, 0.f, 0.f);
     
    189221        //Ticker::Ref(NewPhyobj);
    190222    }
    191 
    192     if (USE_CHARACTER)
     223#endif //USE_PLATFORM
     224
     225#if USE_CHARACTER
    193226    {
    194227        quat NewRotation = quat::fromeuler_xyz(0.f, 0.f, 0.f);
     
    202235        //NewPhyobj->GetCharacter()->AttachTo(BasePhyobj->GetPhysic(), true, true);
    203236    }
    204 
    205     if (USE_BODIES)
     237#endif //USE_CHARACTER
     238
     239#if USE_BODIES
    206240    {
    207241        for (int x=0; x < 6; x++)
    208242        {
    209             for (int y=0; y < 6; y++)
     243            for (int y=0; y < 2; y++)
    210244            {
    211245                for (int z=0; z < 5; z++)
     
    214248                        vec3(-20.f, 15.f, -20.f) +
    215249                        vec3(8.f * (float)x, 8.f * (float)y, 8.f * (float)z));
    216                     m_physobj_list << new_physobj;
     250                    m_physobj_list.Push(new_physobj, ZERO_TIME);
    217251                    Ticker::Ref(new_physobj);
    218252                }
     
    220254        }
    221255    }
    222 
    223     if (USE_ROPE)
     256#endif //USE_BODIES
     257
     258#if USE_ROPE
    224259    {
    225260        Array<PhysicsObject*> RopeElements;
     
    230265                vec3(0.f, 0.f, 2.f * (float)i), 1);
    231266            RopeElements << new_physobj;
    232             m_physobj_list << new_physobj;
     267            m_physobj_list.Push(new_physobj, ZERO_TIME);
    233268            Ticker::Ref(new_physobj);
    234269            if (RopeElements.Count() > 1)
     
    247282        }
    248283    }
     284#endif //USE_ROPE
    249285}
    250286
     
    263299    vec3 PhysObjBarycenter = vec3(.0f);
    264300    float factor = .0f;
    265 
    266     if (USE_WALL)
     301#if CAT_MODE
     302#if USE_BODIES
     303    vec3 cam_center(0.f);
     304    float cam_factor = .0f;
     305    vec2 screen_min_max[2] = { vec2(FLT_MAX), vec2(-FLT_MAX) };
     306    vec3 cam_min_max[2] = { vec3(FLT_MAX), vec3(-FLT_MAX) };
     307    mat4 world_cam = g_scene->GetCamera()->GetView();
     308    mat4 cam_screen = g_scene->GetCamera()->GetProjection();
     309
     310    for (int i = 0; i < m_physobj_list.Count(); i++)
     311    {
     312        PhysicsObject* PhysObj = m_physobj_list[i].m1;
     313        float &Timer = m_physobj_list[i].m2;
     314
     315        vec3 obj_loc = PhysObj->GetPhysic()->GetTransform().v3.xyz;
     316
     317        cam_center += obj_loc;
     318        cam_factor += 1.f;
     319
     320        mat4 LocalPos = mat4::translate(obj_loc);
     321        vec3 vpos;
     322
     323        LocalPos = world_cam * LocalPos;
     324        vpos = LocalPos.v3.xyz;
     325        cam_min_max[0] = min(vpos.xyz, cam_min_max[0]);
     326        cam_min_max[1] = max(vpos.xyz, cam_min_max[1]);
     327
     328        LocalPos = cam_screen * LocalPos;
     329        vpos = (LocalPos.v3 / LocalPos.v3.w).xyz;
     330        screen_min_max[0] = min(vpos.xy, screen_min_max[0]);
     331        screen_min_max[1] = max(vpos.xy, screen_min_max[1]);
     332
     333        //if (length(PhysObj->GetPhysic()->GetLinearVelocity()) < ZERO_SPEED)
     334        if (lol::abs(PhysObj->GetPhysic()->GetLinearVelocity().y) < ZERO_SPEED)
     335            Timer -= seconds;
     336
     337        if (Timer < .0f)
     338        {
     339            PhysObj->GetPhysic()->AddImpulse(JUMP_HEIGHT *
     340                                             vec3(JUMP_STRAFE, 1.f, JUMP_STRAFE) *
     341                                             vec3(rand(-1.f, 1.f), 1.0f, rand(-1.f, 1.f)) *
     342                                             PhysObj->GetPhysic()->GetMass());
     343            Timer = ZERO_TIME;
     344        }
     345    }
     346
     347    vec3 min_max_diff = (cam_min_max[1] - cam_min_max[0]);
     348    float screen_size = max(max(lol::abs(min_max_diff.x), lol::abs(min_max_diff.y)),
     349                        max(    lol::abs(min_max_diff.x), lol::abs(min_max_diff.y)));
     350    float fov_ratio = max(max(lol::abs(screen_min_max[0].x), lol::abs(screen_min_max[0].y)),
     351                          max(lol::abs(screen_min_max[1].x), lol::abs(screen_min_max[1].y)));
     352
     353    //m_camera->SetProjection(mat4::perspective(30.f * fov_ratio * 1.1f, 1280.f, 960.f, .1f, 1000.f));
     354    m_camera->SetView((mat4::rotate(10.f * seconds, vec3(.0f, 1.f, .0f)) * vec4(m_camera->GetPosition(), 1.0f)).xyz,
     355                      //vec3(70.f, 30.f, 0.f),
     356                      cam_center / cam_factor, vec3(0, 1, 0));
     357#endif //USE_BODIES
     358#endif //CAT_MODE
     359
     360#if USE_WALL
    267361    {
    268362        for (int i = 0; i < m_ground_list.Count(); i++)
     
    292386        }
    293387    }
    294 
    295     if (USE_ROTATION)
     388#endif //USE_WALL
     389
     390#if USE_ROTATION
    296391    {
    297392        for (int i = 0; i < m_ground_list.Count(); i++)
     
    308403        }
    309404    }
    310 
    311     if (USE_PLATFORM)
     405#endif //USE_ROTATION
     406
     407#if USE_PLATFORM
    312408    {
    313409        for (int i = 0; i < m_platform_list.Count(); i++)
     
    330426        }
    331427    }
    332 
    333     if (USE_CHARACTER)
     428#endif //USE_PLATFORM
     429
     430#if USE_CHARACTER
    334431    {
    335432        for (int i = 0; i < m_character_list.Count(); i++)
     
    359456        }
    360457    }
    361 
    362     if (USE_CHARACTER)
     458#endif //USE_CHARACTER
     459
     460#if USE_CHARACTER
    363461    {
    364462        PhysObjBarycenter = vec3(.0f);
     
    382480#endif
    383481    }
    384     else
     482#else
    385483    {
    386484        PhysObjBarycenter = vec3(.0f);
    387485        for (int i = 0; i < m_physobj_list.Count(); i++)
    388486        {
    389             PhysicsObject* PhysObj = m_physobj_list[i];
     487            PhysicsObject* PhysObj = m_physobj_list[i].m1;
    390488            mat4 GroundMat = PhysObj->GetTransform();
    391489
     
    401499#endif
    402500    }
    403 
     501#endif //USE_CHARACTER
    404502}
    405503
     
    410508    if (!m_ready)
    411509    {
     510#if CAT_MODE
     511        /* cat datas setup */
     512        m_cat_shader = Shader::Create(LOLFX_RESOURCE_NAME(front_camera_sprite));
     513#if USE_BODIES
     514        for (int i = 0; i < m_physobj_list.Count(); i++)
     515        {
     516            PhysicsObject* PhysObj = m_physobj_list[i].m1;
     517            m_cat_sdata = new CatShaderData(((1 << VertexUsage::Position) |
     518                                                (1 << VertexUsage::Color) |
     519                                                (1 << VertexUsage::TexCoord) |
     520                                                (1 << VertexUsage::TexCoordExt)),
     521                                                m_cat_shader);
     522            m_cat_sdata->m_shader_texture = m_cat_texture->GetTexture();
     523            PhysObj->SetCustomShaderData(m_cat_sdata);
     524        }
     525#endif //USE_BODIES
     526
     527
     528#endif //CAT_MODE
     529
    412530        /* FIXME: this object never cleans up */
    413531        m_ready = true;
     
    423541    Ticker::Unref(m_light1);
    424542    Ticker::Unref(m_light2);
     543
     544#if CAT_MODE
     545    /* cat datas setup */
     546    delete(m_cat_sdata);
     547    Shader::Destroy(m_cat_shader);
     548    Tiler::Deregister(m_cat_texture);
     549#endif //CAT_MODE
    425550
    426551    while (m_constraint_list.Count())
     
    461586    while (m_physobj_list.Count())
    462587    {
    463         PhysicsObject* CurPop = m_physobj_list.Last();
     588        PhysicsObject* CurPop = m_physobj_list.Last().m1;
    464589        m_physobj_list.Pop();
    465590        CurPop->GetPhysic()->RemoveFromSimulation(m_simulation);
     
    470595}
    471596
     597//-----------------------------------------------------------------------------
     598// CShaderData
     599//-----------------------------------------------------------------------------
     600CatShaderData::CatShaderData(uint32_t vert_decl_flags, Shader* shader)
     601    : GpuShaderData(vert_decl_flags, shader, DebugRenderMode::Default)
     602{
     603    SetupDefaultData();
     604}
     605
     606//-----------------------------------------------------------------------------
     607void CatShaderData::SetupDefaultData()
     608{
     609    AddUniform("in_model_view");
     610    AddUniform("in_normal_mat");
     611    AddUniform("in_proj");
     612    AddUniform("in_texture");
     613}
     614
     615//-----------------------------------------------------------------------------
     616void CatShaderData::SetupShaderDatas(mat4 const &model)
     617{
     618    mat4 proj = g_scene->GetCamera()->GetProjection();
     619    mat4 view = g_scene->GetCamera()->GetView();
     620
     621    mat4 modelview = view * model;
     622    mat3 normalmat = transpose(inverse(mat3(view)));
     623
     624    m_shader->SetUniform(*GetUniform("in_model_view"), modelview);
     625    m_shader->SetUniform(*GetUniform("in_normal_mat"), normalmat);
     626    m_shader->SetUniform(*GetUniform("in_proj"), proj);
     627}
     628
    472629int main(int argc, char **argv)
    473630{
    474631    System::Init(argc, argv);
    475632
    476     Application app("BtPhysTest", ivec2(1280, 720), 60.0f);
     633    Application app("BtPhysTest", ivec2(1280, 960), 60.0f);
    477634
    478635    new BtPhysTest(argc > 1);
Note: See TracChangeset for help on using the changeset viewer.