Changeset 10355 in orxonox.OLD for branches/ODE/src/world_entities/world_entity.cc
- Timestamp:
- Jan 24, 2007, 8:48:26 PM (19 years ago)
- Location:
- branches/ODE
- Files:
-
- 1 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/ODE/src/world_entities/world_entity.cc
r10147 r10355 1 1 2 2 3 3 /* … … 45 45 46 46 #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 47 62 48 63 SHELL_COMMAND(model, WorldEntity, loadModel) … … 283 298 bool WorldEntity::buildObbTree(int depth) 284 299 { 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 309 if(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 { 356 if(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 366 if(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 376 else 377 { 378 if(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 387 if(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 285 401 if( this->obbTree != NULL) 286 402 { … … 317 433 return false; 318 434 } 435 319 436 return true; 320 437 } 438 439 440 441 void 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 454 if( (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 534 if(this->isA("Terrain")) 535 { 536 PRINTF(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 621 if(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 } 636 else { 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 321 657 322 658
Note: See TracChangeset
for help on using the changeset viewer.