PolyCollisionSceneEntity.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /*
  2. * PolyCollisionSceneEntity.cpp
  3. * Poly
  4. *
  5. * Created by Ivan Safrin on 6/17/08.
  6. * Copyright 2008 __MyCompanyName__. All rights reserved.
  7. *
  8. */
  9. #include "PolyCollisionSceneEntity.h"
  10. using namespace Polycode;
  11. CollisionSceneEntity::CollisionSceneEntity(SceneEntity *entity, bool autoCollide, int type) {
  12. gravityEnabled = false;
  13. this->autoCollide = autoCollide;
  14. sceneEntity = entity;
  15. gravityVector.y = -1.0f;
  16. this->type = type;
  17. enabled = true;
  18. gravityStrength = 5.0f;
  19. lastPosition = entity->getPosition();
  20. btMatrix3x3 basisA;
  21. basisA.setIdentity();
  22. collisionObject = new btCollisionObject();
  23. collisionObject->getWorldTransform().setBasis(basisA);
  24. shape = createCollisionShape(entity, type);;
  25. if(shape) {
  26. collisionObject->setCollisionShape(shape);
  27. }
  28. // if(type == SHAPE_MESH) {
  29. // concaveShape = dynamic_cast<btConcaveShape*>(shape);
  30. // } else {
  31. convexShape = dynamic_cast<btConvexShape*>(shape);
  32. // }
  33. gVelocity.set(0,0,0);
  34. }
  35. btCollisionShape *CollisionSceneEntity::createCollisionShape(SceneEntity *entity, int type) {
  36. btCollisionShape *collisionShape = NULL;
  37. switch(type) {
  38. case SHAPE_CAPSULE:
  39. case CHARACTER_CONTROLLER:
  40. collisionShape = new btCapsuleShape(entity->bBox.x/2.0f, entity->bBox.y/2.0f);
  41. break;
  42. case SHAPE_PLANE:
  43. collisionShape = new btBoxShape(btVector3(entity->bBox.x/2.0f, entity->bBox.y/2.0f,0.1f));
  44. break;
  45. case SHAPE_BOX:
  46. collisionShape = new btBoxShape(btVector3(entity->bBox.x/2.0f, entity->bBox.y/2.0f,entity->bBox.z/2.0f));
  47. break;
  48. case SHAPE_SPHERE:
  49. collisionShape = new btSphereShape(entity->bBox.x/2.0f);
  50. break;
  51. case SHAPE_MESH:
  52. {
  53. SceneMesh* sceneMesh = dynamic_cast<SceneMesh*>(entity);
  54. if(sceneMesh != NULL) {
  55. /*
  56. btTriangleMesh *btMesh = new btTriangleMesh();
  57. for(int i=0; i < sceneMesh->getMesh()->getPolygonCount(); i++) {
  58. Polygon *poly = sceneMesh->getMesh()->getPolygon(i);
  59. btVector3 v0 = btVector3(btScalar(poly->getVertex(0)->x),btScalar(poly->getVertex(0)->y),btScalar(poly->getVertex(0)->z));
  60. btVector3 v1= btVector3(btScalar(poly->getVertex(1)->x),btScalar(poly->getVertex(1)->y),btScalar(poly->getVertex(1)->z));
  61. btVector3 v2= btVector3(btScalar(poly->getVertex(2)->x),btScalar(poly->getVertex(2)->y),btScalar(poly->getVertex(2)->z));
  62. btMesh->addTriangle(v2,v1,v0);
  63. }
  64. collisionShape = new btBvhTriangleMeshShape(btMesh, true);
  65. */
  66. btConvexHullShape *hullShape = new btConvexHullShape();
  67. for(int i=0; i < sceneMesh->getMesh()->getPolygonCount(); i++) {
  68. Polygon *poly = sceneMesh->getMesh()->getPolygon(i);
  69. for(int j=0; j < poly->getVertexCount(); j++) {
  70. hullShape->addPoint(btVector3((btScalar)poly->getVertex(j)->x, (btScalar)poly->getVertex(j)->y,(btScalar)poly->getVertex(j)->z));
  71. }
  72. }
  73. collisionShape = hullShape;
  74. } else {
  75. Logger::log("Tried to make a mesh collision object from a non-mesh\n");
  76. collisionShape = new btBoxShape(btVector3(entity->bBox.x/2.0f, entity->bBox.y/2.0f,entity->bBox.z/2.0f));
  77. }
  78. }
  79. break;
  80. }
  81. return collisionShape;
  82. }
  83. void CollisionSceneEntity::Update() {
  84. // lastPosition = *getSceneEntity()->getPosition();
  85. if(gravityEnabled) {
  86. float elapsed = CoreServices::getInstance()->getCore()->getElapsed();
  87. Vector3 elapsedGrav = gravityVector;
  88. elapsedGrav * elapsed * gravityStrength;
  89. gVelocity = gVelocity+(elapsedGrav);
  90. sceneEntity->Translate(gVelocity.x * elapsed, gVelocity.y * elapsed,gVelocity.z * elapsed);
  91. sceneEntity->rebuildTransformMatrix();
  92. }
  93. btQuaternion orn;
  94. // collisionObject->getCollisionShape()->setLocalScaling
  95. collisionObject->getWorldTransform().setFromOpenGLMatrix((float*)sceneEntity->getConcatenatedMatrix().ml);
  96. /*
  97. float rads = PI/180.0f;
  98. orn.setEuler(sceneEntity->getCombinedYaw()*rads,sceneEntity->getCombinedPitch()*rads,sceneEntity->getCombinedRoll()*rads);
  99. collisionObject->getWorldTransform().setRotation(orn);
  100. collisionObject->getWorldTransform().setOrigin(btVector3(sceneEntity->getCombinedPosition().x, sceneEntity->getCombinedPosition().y, sceneEntity->getCombinedPosition().z));
  101. */
  102. }
  103. SceneEntity *CollisionSceneEntity::getSceneEntity() {
  104. return sceneEntity;
  105. }
  106. CollisionSceneEntity::~CollisionSceneEntity() {
  107. }