PolyCollisionSceneEntity.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. btMatrix3x3 basisA;
  20. basisA.setIdentity();
  21. collisionObject = new btCollisionObject();
  22. collisionObject->getWorldTransform().setBasis(basisA);
  23. lastPosition = *entity->getPosition();
  24. shape = NULL;
  25. btBoxShape* box;
  26. btSphereShape* sphere;
  27. SceneMesh *sceneMesh;
  28. switch(type) {
  29. case SHAPE_BOX:
  30. box = new btBoxShape(btVector3(entity->bBox.x/2.0f, entity->bBox.y/2.0f,entity->bBox.z/2.0f));
  31. collisionObject->setCollisionShape(box);
  32. shape = box;
  33. break;
  34. case SHAPE_SPHERE:
  35. sphere = new btSphereShape(entity->bBox.x/2.0f);
  36. collisionObject->setCollisionShape(sphere);
  37. shape = sphere;
  38. break;
  39. case SHAPE_MESH:
  40. sceneMesh = dynamic_cast<SceneMesh*>(entity);
  41. if(sceneMesh != NULL) {
  42. btTriangleMesh *btMesh = new btTriangleMesh();
  43. for(int i=0; i < sceneMesh->getMesh()->getPolygonCount(); i++) {
  44. Polygon *poly = sceneMesh->getMesh()->getPolygon(i);
  45. btVector3 v0 = btVector3(btScalar(poly->getVertex(0)->x),btScalar(poly->getVertex(0)->y),btScalar(poly->getVertex(0)->z));
  46. btVector3 v1= btVector3(btScalar(poly->getVertex(1)->x),btScalar(poly->getVertex(1)->y),btScalar(poly->getVertex(1)->z));
  47. btVector3 v2= btVector3(btScalar(poly->getVertex(2)->x),btScalar(poly->getVertex(2)->y),btScalar(poly->getVertex(2)->z));
  48. btMesh->addTriangle(v2,v1,v0);
  49. }
  50. btBvhTriangleMeshShape *concaveShape = new btBvhTriangleMeshShape(btMesh, true);
  51. collisionObject->setCollisionShape(concaveShape);
  52. } else {
  53. Logger::log("Tried to make a mesh collision object from a non-mesh\n");
  54. box = new btBoxShape(btVector3(entity->bBox.x/2.0f, entity->bBox.y/2.0f,entity->bBox.z/2.0f));
  55. collisionObject->setCollisionShape(box);
  56. shape = box;
  57. }
  58. break;
  59. case SHAPE_TERRAIN:
  60. /*
  61. Terrain *terrain = dynamic_cast<Terrain*>(entity);
  62. if(terrain != NULL) {
  63. // btHeightfieldTerrainShape *hf = new btHeightfieldTerrainShape(ter
  64. btTriangleMesh *btMesh = new btTriangleMesh();
  65. for(int i=0; i < terrain->getMesh()->getPolygonCount(); i++) {
  66. Polygon *poly = terrain->getMesh()->getPolygon(i);
  67. btVector3 v0 = btVector3(btScalar(poly->getVertex(0)->x),btScalar(poly->getVertex(0)->y),btScalar(poly->getVertex(0)->z));
  68. btVector3 v1= btVector3(btScalar(poly->getVertex(1)->x),btScalar(poly->getVertex(1)->y),btScalar(poly->getVertex(1)->z));
  69. btVector3 v2= btVector3(btScalar(poly->getVertex(2)->x),btScalar(poly->getVertex(2)->y),btScalar(poly->getVertex(2)->z));
  70. btMesh->addTriangle(v2,v1,v0);
  71. }
  72. btBvhTriangleMeshShape *concaveShape = new btBvhTriangleMeshShape(btMesh, true);
  73. collisionObject->setCollisionShape(concaveShape);
  74. } else {
  75. Logger::log("Tried to make a terrain collision object from a non-terrain\n");
  76. box = new btBoxShape(btVector3(entity->bBox.x/2.0f, entity->bBox.y/2.0f,entity->bBox.z/2.0f));
  77. collisionObject->setCollisionShape(box);
  78. shape = box;
  79. }
  80. */
  81. break;
  82. }
  83. gVelocity.set(0,0,0);
  84. }
  85. void CollisionSceneEntity::Update() {
  86. // lastPosition = *getSceneEntity()->getPosition();
  87. if(gravityEnabled) {
  88. float elapsed = CoreServices::getInstance()->getCore()->getElapsed();
  89. Vector3 elapsedGrav = gravityVector;
  90. elapsedGrav * elapsed * gravityStrength;
  91. gVelocity = gVelocity+(elapsedGrav);
  92. sceneEntity->Translate(gVelocity.x * elapsed, gVelocity.y * elapsed,gVelocity.z * elapsed);
  93. sceneEntity->rebuildTransformMatrix();
  94. }
  95. btQuaternion orn;
  96. // collisionObject->getCollisionShape()->setLocalScaling
  97. collisionObject->getWorldTransform().setFromOpenGLMatrix(sceneEntity->getConcatenatedMatrix().ml);
  98. /*
  99. float rads = PI/180.0f;
  100. orn.setEuler(sceneEntity->getCombinedYaw()*rads,sceneEntity->getCombinedPitch()*rads,sceneEntity->getCombinedRoll()*rads);
  101. collisionObject->getWorldTransform().setRotation(orn);
  102. collisionObject->getWorldTransform().setOrigin(btVector3(sceneEntity->getCombinedPosition().x, sceneEntity->getCombinedPosition().y, sceneEntity->getCombinedPosition().z));
  103. */
  104. }
  105. SceneEntity *CollisionSceneEntity::getSceneEntity() {
  106. return sceneEntity;
  107. }
  108. CollisionSceneEntity::~CollisionSceneEntity() {
  109. }