PolyCollisionSceneEntity.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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_BOX:
  43. collisionShape = new btBoxShape(btVector3(entity->bBox.x/2.0f, entity->bBox.y/2.0f,entity->bBox.z/2.0f));
  44. break;
  45. case SHAPE_SPHERE:
  46. collisionShape = new btSphereShape(entity->bBox.x/2.0f);
  47. break;
  48. case SHAPE_MESH:
  49. {
  50. SceneMesh* sceneMesh = dynamic_cast<SceneMesh*>(entity);
  51. if(sceneMesh != NULL) {
  52. btTriangleMesh *btMesh = new btTriangleMesh();
  53. for(int i=0; i < sceneMesh->getMesh()->getPolygonCount(); i++) {
  54. Polygon *poly = sceneMesh->getMesh()->getPolygon(i);
  55. btVector3 v0 = btVector3(btScalar(poly->getVertex(0)->x),btScalar(poly->getVertex(0)->y),btScalar(poly->getVertex(0)->z));
  56. btVector3 v1= btVector3(btScalar(poly->getVertex(1)->x),btScalar(poly->getVertex(1)->y),btScalar(poly->getVertex(1)->z));
  57. btVector3 v2= btVector3(btScalar(poly->getVertex(2)->x),btScalar(poly->getVertex(2)->y),btScalar(poly->getVertex(2)->z));
  58. btMesh->addTriangle(v2,v1,v0);
  59. }
  60. collisionShape = new btBvhTriangleMeshShape(btMesh, true);
  61. } else {
  62. Logger::log("Tried to make a mesh collision object from a non-mesh\n");
  63. collisionShape = new btBoxShape(btVector3(entity->bBox.x/2.0f, entity->bBox.y/2.0f,entity->bBox.z/2.0f));
  64. }
  65. }
  66. break;
  67. }
  68. return collisionShape;
  69. }
  70. void CollisionSceneEntity::Update() {
  71. // lastPosition = *getSceneEntity()->getPosition();
  72. if(gravityEnabled) {
  73. float elapsed = CoreServices::getInstance()->getCore()->getElapsed();
  74. Vector3 elapsedGrav = gravityVector;
  75. elapsedGrav * elapsed * gravityStrength;
  76. gVelocity = gVelocity+(elapsedGrav);
  77. sceneEntity->Translate(gVelocity.x * elapsed, gVelocity.y * elapsed,gVelocity.z * elapsed);
  78. sceneEntity->rebuildTransformMatrix();
  79. }
  80. btQuaternion orn;
  81. // collisionObject->getCollisionShape()->setLocalScaling
  82. collisionObject->getWorldTransform().setFromOpenGLMatrix(sceneEntity->getConcatenatedMatrix().ml);
  83. /*
  84. float rads = PI/180.0f;
  85. orn.setEuler(sceneEntity->getCombinedYaw()*rads,sceneEntity->getCombinedPitch()*rads,sceneEntity->getCombinedRoll()*rads);
  86. collisionObject->getWorldTransform().setRotation(orn);
  87. collisionObject->getWorldTransform().setOrigin(btVector3(sceneEntity->getCombinedPosition().x, sceneEntity->getCombinedPosition().y, sceneEntity->getCombinedPosition().z));
  88. */
  89. }
  90. SceneEntity *CollisionSceneEntity::getSceneEntity() {
  91. return sceneEntity;
  92. }
  93. CollisionSceneEntity::~CollisionSceneEntity() {
  94. }