Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Jan 24, 2007, 8:48:26 PM (19 years ago)
Author:
bottac
Message:

Here comes the updated version.

Location:
branches/ODE
Files:
1 edited
1 copied

Legend:

Unmodified
Added
Removed
  • branches/ODE/src/world_entities/world_entity.cc

    r10147 r10355  
    1 
     1       
    22
    33/*
     
    4545
    4646#include "projectiles/projectile.h"
     47
     48
     49#include "class_id.h"
     50#include "aabb.h"
     51#include "cr_defs.h"
     52#include "cd_engine.h"
     53#include "collision_tube.h"
     54
     55#include "static_model.h"
     56
     57
     58
     59#ifdef WITH_ODE
     60#include  <ode/ode.h>
     61#endif
    4762
    4863SHELL_COMMAND(model, WorldEntity, loadModel)
     
    283298bool WorldEntity::buildObbTree(int depth)
    284299{
     300
     301#ifdef WITH_ODE
     302        this->world =  dWorldCreate(); // the World will be Static for mor efficiency
     303        this->space = dSimpleSpaceCreate(0); // same for the space
     304        contactgroup = dJointGroupCreate (0);
     305        dWorldSetGravity (world,0,0,-0.5);
     306        dWorldSetCFM (world,1e-5);
     307
     308 
     309if(this->getModel(0)!=0)
     310        {
     311 if(this->getModel(0)->isA( StaticModel::staticClassID() ) )
     312        {
     313
     314
     315
     316        StaticModelData::Pointer   ModelData = ((StaticModel*)this->getModel())->dataPointer();
     317        //ModelData->buildTriangleList();
     318
     319        PRINTF(0)(" Dieses Model hat %i Vertices \n", ModelData->getVertices().size());
     320        PRINTF(0)(" Dieses Model hat %i Dreiecke \n",((ModelData->getTriangles()).size()  ));
     321        this->Ind = new unsigned int [(ModelData->getTriangles()).size()*3];
     322        for(int i = 0 ; i < (ModelData->getTriangles()).size(); i++)
     323                {
     324                        Ind[3*i]    = (ModelData->getTrianglesExt())[i].indexToVertices[0] / 3 ;
     325                        Ind[3*i +1] = (ModelData->getTrianglesExt())[i].indexToVertices[1] / 3;
     326                        Ind[3*i +2] = (ModelData->getTrianglesExt())[i].indexToVertices[2] / 3;
     327               
     328                }
     329       
     330        //((StaticModel*)(this->getModel()))->acquireData(ModelData);
     331        this->ODE_Geometry = dGeomTriMeshDataCreate();
     332        dGeomTriMeshDataBuildSingle(this->ODE_Geometry,&((ModelData->getVertices())[0]), 3*sizeof(float),(ModelData->getVertices().size() /3 )  , &Ind[0] ,((ModelData->getTriangles()).size() *3 ),  3*sizeof(unsigned int) );
     333    // Create ODE-Data here!
     334       
     335
     336        //!fixme
     337        for (int i=0; i<30; i++) {
     338                contact[i].surface.mode = dContactBounce | dContactSoftCFM;
     339                contact[i].surface.mu = dInfinity;
     340                contact[i].surface.mu2 = 0;
     341                contact[i].surface.bounce = 0.1;
     342                contact[i].surface.bounce_vel = 0.1;
     343                contact[i].surface.soft_cfm = 0.01;
     344        }
     345
     346       
     347        this->ODE_Geom_ID = dCreateTriMesh(space,this->ODE_Geometry,0 , 0, 0);
     348
     349               
     350        //CDEngine::getInstance()->setTerrain(this);
     351        //this->loaded = true;
     352        //this->toList(OM_ENVIRON);
     353
     354} else
     355{
     356if(this->getModelAABB() == NULL )
     357{
     358        this->ODE_Geom_ID  = dCreateBox (space, 20.0f, 40.0f  ,20.0f);
     359        //dGeomID BBOX = dCreateBox (space,box->halfLength[0]*2.0f, box->halfLength[1]*2.0f  ,2.0f* box->halfLength[2]);
     360        dGeomSetPosition (this->ODE_Geom_ID, this->getAbsCoor().x  ,this->getAbsCoor().y, this->getAbsCoor().z);
     361        //dGeomSetPosition (BBOX, worldEntity->getAbsCoor().x + box->center.x ,worldEntity->getAbsCoor().y+box->center.y, worldEntity->getAbsCoor().z+box->center.z);
     362}
     363}
     364
     365
     366if(this->getModelAABB() != NULL )
     367{
     368        AABB* box = this->getModelAABB();
     369        //this->ODE_Geom_ID  = dCreateBox (space, 2.0f, 4.0f  ,2.0f);
     370        this->ODE_Geom_ID = dCreateBox (space,box->halfLength[0]*2.0f, box->halfLength[1]*2.0f  ,2.0f* box->halfLength[2]);
     371        dGeomSetPosition (this->ODE_Geom_ID, this->getAbsCoor().x  ,this->getAbsCoor().y, this->getAbsCoor().z);
     372        //dGeomSetPosition (BBOX, worldEntity->getAbsCoor().x + box->center.x ,worldEntity->getAbsCoor().y+box->center.y, worldEntity->getAbsCoor().z+box->center.z);
     373}
     374        }
     375
     376else
     377{
     378if(this->getModelAABB() != NULL )
     379{
     380        AABB* box = this->getModelAABB();
     381        //this->ODE_Geom_ID  = dCreateBox (space, 2.0f, 4.0f  ,2.0f);
     382        this->ODE_Geom_ID = dCreateBox (space,box->halfLength[0]*2.0f, box->halfLength[1]*2.0f  ,2.0f* box->halfLength[2]);
     383        dGeomSetPosition (this->ODE_Geom_ID, this->getAbsCoor().x  ,this->getAbsCoor().y, this->getAbsCoor().z);
     384        //dGeomSetPosition (BBOX, worldEntity->getAbsCoor().x + box->center.x ,worldEntity->getAbsCoor().y+box->center.y, worldEntity->getAbsCoor().z+box->center.z);
     385}
     386
     387if(this->getModelAABB() == NULL )
     388{
     389        this->ODE_Geom_ID  = dCreateBox (space, 20.0f, 40.0f  ,20.0f);
     390        //dGeomID BBOX = dCreateBox (space,box->halfLength[0]*2.0f, box->halfLength[1]*2.0f  ,2.0f* box->halfLength[2]);
     391        dGeomSetPosition (this->ODE_Geom_ID, this->getAbsCoor().x  ,this->getAbsCoor().y, this->getAbsCoor().z);
     392        //dGeomSetPosition (BBOX, worldEntity->getAbsCoor().x + box->center.x ,worldEntity->getAbsCoor().y+box->center.y, worldEntity->getAbsCoor().z+box->center.z);
     393}
     394}
     395
     396
     397
     398#endif
     399
     400
    285401  if( this->obbTree != NULL)
    286402  {
     
    317433    return false;
    318434  }
     435 
    319436  return true;
    320437}
     438
     439
     440
     441void WorldEntity::checkCollision(WorldEntity* worldEntity) {
     442
     443#ifndef WITH_ODE
     444        return;
     445#endif
     446#ifdef WITH_ODE
     447        //if(!this->loaded) return;
     448        //dWorldSetQuickStepNumIterations (this->world, 1);
     449        //dWorldQuickStep (this->world, 0.1);
     450
     451         AABB* box = worldEntity->getModelAABB();
     452   dReal  aabbox [6];
     453
     454if(   (this->getModel(0)!= 0) && (this->getModel(0)->isA( StaticModel::staticClassID())) )  {
     455       
     456        dGeomSetPosition (this->ODE_Geom_ID, this->getAbsCoor().x  ,this->getAbsCoor().y, this->getAbsCoor().z);
     457        if(box != NULL )
     458        {
     459        //PRINTF(0)("Do have abb-box! :_)\n");
     460        dGeomID RayX =    dCreateRay(space,box->halfLength[0] *2.0f);
     461        dGeomRaySet (RayX, worldEntity->getAbsCoor().x  - box->halfLength[0]  ,worldEntity->getAbsCoor().y, worldEntity->getAbsCoor().z,
     462                  1.0f, 0.0f, 0.0f);
     463        dGeomID RayY =    dCreateRay(space,box->halfLength[1] * 10000.0f);
     464        dGeomRaySet (RayY, worldEntity->getAbsCoor().x    ,worldEntity->getAbsCoor().y - 5000.0f*box->halfLength[1], worldEntity->getAbsCoor().z,
     465                  0.0f, 1.0f, 0.0f);
     466        dGeomID RayZ =    dCreateRay(space,box->halfLength[2] *2.0f);
     467        dGeomRaySet (RayZ, worldEntity->getAbsCoor().x    ,worldEntity->getAbsCoor().y, worldEntity->getAbsCoor().z - box->halfLength[2],
     468                  0.0f, 0.0f, 1.0f);
     469
     470        dGeomID RayXPos =    dCreateRay(space,box->halfLength[0]);
     471        dGeomRaySet (RayX, worldEntity->getAbsCoor().x    ,worldEntity->getAbsCoor().y, worldEntity->getAbsCoor().z,
     472                  1.0f, 0.0f, 0.0f);
     473        dGeomID RayYPos =    dCreateRay(space,box->halfLength[1] * 1100.0 );
     474        dGeomRaySet (RayY, worldEntity->getAbsCoor().x    ,worldEntity->getAbsCoor().y, worldEntity->getAbsCoor().z,
     475                  0.0f, 1.0f, 0.0f);
     476        dGeomID RayZPos =    dCreateRay(space,box->halfLength[2] );
     477        dGeomRaySet (RayZ, worldEntity->getAbsCoor().x    ,worldEntity->getAbsCoor().y, worldEntity->getAbsCoor().z,
     478                  0.0f, 0.0f, 1.0f);
     479
     480        dGeomID RayXNeg =    dCreateRay(space,box->halfLength[0]  );
     481        dGeomRaySet (RayX, worldEntity->getAbsCoor().x    ,worldEntity->getAbsCoor().y, worldEntity->getAbsCoor().z,
     482                  -1.0f, 0.0f, 0.0f);
     483        dGeomID RayYNeg =    dCreateRay(space, box->halfLength[1] *  1100.0f );
     484        dGeomRaySet (RayY, worldEntity->getAbsCoor().x    ,worldEntity->getAbsCoor().y , worldEntity->getAbsCoor().z,
     485                  0.0f, -1.0f, 0.0f);
     486        dGeomID RayZNeg =    dCreateRay(space,box->halfLength[2] );
     487        dGeomRaySet (RayZ, worldEntity->getAbsCoor().x    ,worldEntity->getAbsCoor().y, worldEntity->getAbsCoor().z ,
     488                  0.0f, 0.0f, -1.0f);
     489
     490        //dGeomID BBOX = dCreateBox (space, 2.0f, 4.0f  ,2.0f);
     491        dGeomID BBOX = dCreateBox (space,box->halfLength[0]*0.003f, box->halfLength[1]*500.0f  ,0.0030f* box->halfLength[2]);
     492        dGeomSetPosition (BBOX, worldEntity->getAbsCoor().x  ,worldEntity->getAbsCoor().y, worldEntity->getAbsCoor().z);
     493        //dGeomSetPosition (BBOX, worldEntity->getAbsCoor().x + box->center.x ,worldEntity->getAbsCoor().y+box->center.y, worldEntity->getAbsCoor().z+box->center.z);
     494
     495       
     496       
     497 
     498
     499   int g;
     500   bool collision = false;
     501
     502 
     503                        // dGeomGetAABB (this->bspFile->ODE_Geom_IDs[i],aabbox );
     504                        // BBOX2 = dCreateBox (space, aabbox[1]-aabbox[0], aabbox[3]-aabbox[2], aabbox[5]-aabbox[4]);
     505                        //  dGeomSetPosition (BBOX2,(aabbox[1]+ aabbox[0])/2, (aabbox[3]+ aabbox[2])/2, (aabbox[4]+ aabbox[5])/2);
     506                        // dGeomDestroy(BBOX2);
     507                         g = 0;
     508                         if( dCollide(this->ODE_Geom_ID,BBOX, 2, &contact[0].geom, sizeof(dContact)) ) {
     509                       
     510                                PRINTF(0)("%s :Collision wit %s at %f , %f , %f : height: %f. \n", this->getCName(),worldEntity->getCName(), contact[0].geom.pos[0],contact[0].geom.pos[1]+2.1,contact[0].geom.pos[2], (worldEntity->getAbsCoorY() - contact[0].geom.pos[1]) );
     511                                for(int i = 0; i <1 ; i++)
     512                                        {
     513                                CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_Y_NEG , worldEntity, this, Vector(0.0f, 1.0f, 0.0f), Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]),  false);
     514                                        }
     515                                       
     516                                if(dCollide(this->ODE_Geom_ID,RayX, 1, &contact[0].geom, sizeof(dContact)))  {
     517                                                if(dCollide(this->ODE_Geom_ID,RayXPos, 1, &contact[0].geom, sizeof(dContact)))  {
     518                                                        // worldEntity->registerCollision(COLLISION_TYPE_AXIS_X , this, worldEntity, Vector(1.0f, 0.0f, 0.0f),
     519                                                        // Vector((float)contact[0].geom.pos[0],(float)contact[0].geom.pos[1],contact[0].geom.pos[2]), false); 
     520                                                       
     521                                                }//if           
     522                                                if(dCollide(this->ODE_Geom_ID,RayXNeg, 1, &contact[0].geom, sizeof(dContact)))  {
     523                                                        //  worldEntity->registerCollision(COLLISION_TYPE_AXIS_X_NEG , this, worldEntity, //Vector(1.0f, 0.0f, 0.0f),
     524                                                        // Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     525                                                         
     526                                                }//if
     527                                        }//if
     528                               
     529                        if(this->isA("Terrain")) //ClassList::StringToID)
     530                                        {
     531                                       
     532
     533
     534if(this->isA("Terrain"))
     535{
     536PRINTF(0)("Ich bin ein %s \n",this->getClassCName() );
     537}
     538
     539                                        if( dCollide(this->ODE_Geom_ID,RayY, 1, &contact[0].geom, sizeof(dContact)))  {
     540                                               
     541                                                /*
     542                                                if(false && dCollide(this->ODE_Geom_ID,RayYNeg, 1, &contact[0].geom, sizeof(dContact)))  {
     543                                                        // worldEntity->registerCollision(COLLISION_TYPE_AXIS_Y_NEG , this, worldEntity, Vector(0.0f, ,this1.0f, 0.0f),
     544                                                       //  Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     545                                                        CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_Y_NEG , worldEntity,this,  Vector(0.0f, 1.0f, 0.0f), Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     546                                                        PRINTF(0)("Kooomische  ................Collision");
     547                                                       
     548                                                }//if
     549                                         if( false && dCollide(this->ODE_Geom_ID,RayYPos, 1, &contact[0].geom, sizeof(dContact)))  {
     550
     551                                                                CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_Y_NEG , worldEntity,this,  Vector(0.0f, -1.0f, 0.0f), Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     552                                                        PRINTF(0)("Kooomische  ................Collision");
     553                                                         // worldEntity->registerCollision(COLLISION_TYPE_AXIS_Y_NEG , this, worldEntity, Vector(0.0f, 1.0f, 0.0f),
     554                                                         //Vector(contact[0].geom.pos[0],contact[0].geom.pos[1] ,contact[0].geom.pos[2]), false);
     555                                                       
     556                                                }//if
     557                                                else { */
     558
     559                                                //CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_Y_NEG , worldEntity,this,  Vector(0.0f, 1.0f, 0.0f), Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     560                                                        PRINTF(0)("Kooomische  ................Collision");
     561
     562                                                //worldEntity->registerCollision(COLLISION_TYPE_AXIS_Y_NEG , this, worldEntity, Vector(0.0f, 1.0f, 0.0f),
     563                                                 //       Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     564
     565                                                //}
     566
     567                                        }//if
     568                               
     569                                        if(dCollide(this->ODE_Geom_ID,RayZ, 1, &contact[0].geom, sizeof(dContact)))  {
     570                                                if(dCollide(this->ODE_Geom_ID,RayZPos, 1, &contact[0].geom, sizeof(dContact)))  {
     571                                                CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_Z , worldEntity,this,  Vector(0.0f, 1.0f, 0.0f), Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     572                                                        PRINTF(0)("Kooomische  ................Collision");
     573                                                //        worldEntity->registerCollision(COLLISION_TYPE_AXIS_Z , this, worldEntity, Vector(0.0f, 0.0f, 1.0f),
     574                                                  //       Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     575                                                       
     576                                                }//if
     577                                                if(dCollide(this->ODE_Geom_ID,RayZNeg, 1, &contact[0].geom, sizeof(dContact)))  {
     578                                                CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_Z_NEG , worldEntity,this,  Vector(0.0f, 1.0f, 0.0f), Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     579                                                        PRINTF(0)("Kooomische  ................Collision");
     580                                                        //  worldEntity->registerCollision(COLLISION_TYPE_AXIS_Z_NEG , this, worldEntity, Vector(0.0f, 0.0f, 1.0f),
     581                                                         // Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     582                                                       
     583                                                }//if
     584                       
     585                                               
     586                                                if(dCollide(this->ODE_Geom_ID,RayXPos, 1, &contact[0].geom, sizeof(dContact)))  {
     587                                                CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_X , worldEntity,this,  Vector(0.0f, 1.0f, 0.0f), Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     588                                                        PRINTF(0)("Kooomische  ................Collision");
     589                                                //        worldEntity->registerCollision(COLLISION_TYPE_AXIS_Z , this, worldEntity, Vector(0.0f, 0.0f, 1.0f),
     590                                                  //       Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     591                                                       
     592                                                }//if
     593                                                if(dCollide(this->ODE_Geom_ID,RayXNeg, 1, &contact[0].geom, sizeof(dContact)))  {
     594                                                CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_X_NEG , worldEntity,this,  Vector(0.0f, 1.0f, 0.0f), Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     595                                                        PRINTF(0)("Kooomische  ................Collision");
     596                                                        //  worldEntity->registerCollision(COLLISION_TYPE_AXIS_Z_NEG , this, worldEntity, Vector(0.0f, 0.0f, 1.0f),
     597                                                         // Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     598                                                       
     599                                                }//if
     600
     601
     602                                        }//if
     603                                }//if
     604                       
     605                        } //if
     606               
     607                       
     608      dGeomDestroy(RayX);
     609      dGeomDestroy(RayY);
     610      dGeomDestroy(RayZ);
     611      dGeomDestroy(RayXPos);
     612      dGeomDestroy(RayYPos);
     613      dGeomDestroy(RayZPos);
     614      dGeomDestroy(RayXNeg);
     615      dGeomDestroy(RayYNeg);
     616      dGeomDestroy(RayZNeg);
     617       
     618     dGeomDestroy(BBOX);
     619} // if(bbox != 0)
     620
     621if(box == NULL)
     622{
     623        dGeomID BBOX = dCreateBox (space, 20.0f, 40.0f  ,20.0f);
     624        dGeomSetPosition (BBOX, worldEntity->getAbsCoor().x  ,worldEntity->getAbsCoor().y, worldEntity->getAbsCoor().z);
     625        //dGeomSetPosition (BBOX, worldEntity->getAbsCoor().x + box->center.x ,worldEntity->getAbsCoor().y+box->center.y, worldEntity->getAbsCoor().z+box->center.z);
     626        if(dCollide(this->ODE_Geom_ID,BBOX, 1, &contact[0].geom, sizeof(dContact)))
     627                                                {
     628                                                       
     629                                                PRINTF(0)("Collision wit %s at %f , %f , %f . \n", worldEntity->getCName(), contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2] );     
     630
     631                                                CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_Y_NEG , this, worldEntity, Vector(1.0f, 0.0f, 0.0f), Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     632                                                }
     633        dGeomDestroy(BBOX);
     634}
     635}
     636else {
     637        dGeomSetPosition (this->ODE_Geom_ID, this->getAbsCoor().x  ,this->getAbsCoor().y, this->getAbsCoor().z);
     638        //if(box != NULL )
     639        dGeomID BBOX = dCreateBox (space, 10.0f, 40.0f  ,10.0f);
     640        dGeomSetPosition (BBOX, worldEntity->getAbsCoor().x  ,worldEntity->getAbsCoor().y, worldEntity->getAbsCoor().z);
     641        //dGeomSetPosition (BBOX, worldEntity->getAbsCoor().x + box->center.x ,worldEntity->getAbsCoor().y+box->center.y, worldEntity->getAbsCoor().z+box->center.z);
     642        if(dCollide(this->ODE_Geom_ID,BBOX, 1, &contact[0].geom, sizeof(dContact)))
     643                                                {
     644                                                       
     645                                                PRINTF(5)("Collision wit %s at %f , %f , %f . \n", worldEntity->getCName(), contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2] );
     646
     647                                                CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_Y_NEG , worldEntity, this, Vector(1.0f, 0.0f, 0.0f), Vector(contact[0].geom.pos[0],contact[0].geom.pos[1],contact[0].geom.pos[2]), false);
     648                                                }
     649        dGeomDestroy(BBOX);
     650
     651}
     652
     653#endif
     654 
     655}
     656
    321657
    322658
Note: See TracChangeset for help on using the changeset viewer.