PolyCollisionSceneEntity.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. Terrain *terrain = dynamic_cast<Terrain*>(entity);
  61. if(terrain != NULL) {
  62. // btHeightfieldTerrainShape *hf = new btHeightfieldTerrainShape(ter
  63. btTriangleMesh *btMesh = new btTriangleMesh();
  64. for(int i=0; i < terrain->getMesh()->getPolygonCount(); i++) {
  65. Polygon *poly = terrain->getMesh()->getPolygon(i);
  66. btVector3 v0 = btVector3(btScalar(poly->getVertex(0)->x),btScalar(poly->getVertex(0)->y),btScalar(poly->getVertex(0)->z));
  67. btVector3 v1= btVector3(btScalar(poly->getVertex(1)->x),btScalar(poly->getVertex(1)->y),btScalar(poly->getVertex(1)->z));
  68. btVector3 v2= btVector3(btScalar(poly->getVertex(2)->x),btScalar(poly->getVertex(2)->y),btScalar(poly->getVertex(2)->z));
  69. btMesh->addTriangle(v2,v1,v0);
  70. }
  71. btBvhTriangleMeshShape *concaveShape = new btBvhTriangleMeshShape(btMesh, true);
  72. collisionObject->setCollisionShape(concaveShape);
  73. } else {
  74. Logger::log("Tried to make a terrain collision object from a non-terrain\n");
  75. box = new btBoxShape(btVector3(entity->bBox.x/2.0f, entity->bBox.y/2.0f,entity->bBox.z/2.0f));
  76. collisionObject->setCollisionShape(box);
  77. shape = box;
  78. }
  79. break;
  80. }
  81. gVelocity.set(0,0,0);
  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(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. }