RigidBody.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "anki/physics/RigidBody.h"
  2. #include "anki/physics/PhysWorld.h"
  3. #include "anki/scene/Scene.h"
  4. #include "anki/physics/MotionState.h"
  5. namespace anki {
  6. //==============================================================================
  7. // Constructor =
  8. //==============================================================================
  9. RigidBody::Initializer::Initializer():
  10. mass(0.0),
  11. startTrf(Transform::getIdentity()),
  12. shape(NULL),
  13. sceneNode(NULL),
  14. group(-1),
  15. mask(-1)
  16. {}
  17. //==============================================================================
  18. // Constructor =
  19. //==============================================================================
  20. RigidBody::RigidBody(PhysWorld& masterContainer_,
  21. const Initializer& init)
  22. : btRigidBody(btRigidBody::btRigidBodyConstructionInfo(0.0, NULL, NULL,
  23. btVector3(0.0, 0.0, 0.0))), // dummy init
  24. masterContainer(masterContainer_)
  25. {
  26. ANKI_ASSERT(init.shape != NULL &&
  27. init.shape->getShapeType() != INVALID_SHAPE_PROXYTYPE);
  28. bool isDynamic = (init.mass != 0.0);
  29. btVector3 localInertia;
  30. if(isDynamic)
  31. {
  32. init.shape->calculateLocalInertia(init.mass, localInertia);
  33. }
  34. else
  35. {
  36. localInertia = btVector3(0.0, 0.0, 0.0);
  37. }
  38. motionState.reset(new MotionState(init.startTrf, init.sceneNode));
  39. btRigidBody::btRigidBodyConstructionInfo cInfo(init.mass,
  40. motionState.get(), init.shape, localInertia);
  41. setupRigidBody(cInfo);
  42. setContactProcessingThreshold(
  43. masterContainer.defaultContactProcessingThreshold);
  44. forceActivationState(ISLAND_SLEEPING);
  45. // register
  46. if(init.mask == -1 || init.group == -1)
  47. {
  48. masterContainer.dynamicsWorld->addRigidBody(this);
  49. }
  50. else
  51. {
  52. masterContainer.dynamicsWorld->addRigidBody(this, init.group,
  53. init.mask);
  54. }
  55. }
  56. //==============================================================================
  57. // Destructor =
  58. //==============================================================================
  59. RigidBody::~RigidBody()
  60. {
  61. masterContainer.dynamicsWorld->removeRigidBody(this);
  62. }
  63. } // end namespace