PhysRigidBody.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "PhysRigidBody.h"
  2. #include "PhysMasterContainer.h"
  3. #include "Scene.h"
  4. #include "PhysMotionState.h"
  5. namespace Phys {
  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(MasterContainer& masterContainer_, const Initializer& init):
  21. btRigidBody(btRigidBody::btRigidBodyConstructionInfo(0.0, NULL, NULL, btVector3(0.0, 0.0, 0.0))), // dummy init
  22. masterContainer(masterContainer_)
  23. {
  24. ASSERT(init.shape != NULL && init.shape->getShapeType() != INVALID_SHAPE_PROXYTYPE);
  25. bool isDynamic = (init.mass != 0.0);
  26. btVector3 localInertia;
  27. if(isDynamic)
  28. {
  29. init.shape->calculateLocalInertia(init.mass, localInertia);
  30. }
  31. else
  32. {
  33. localInertia = btVector3(0.0, 0.0, 0.0);
  34. }
  35. motionState.reset(new MotionState(init.startTrf, init.sceneNode));
  36. btRigidBody::btRigidBodyConstructionInfo cInfo(init.mass, motionState.get(), init.shape, localInertia);
  37. setupRigidBody(cInfo);
  38. setContactProcessingThreshold(masterContainer.defaultContactProcessingThreshold);
  39. forceActivationState(ISLAND_SLEEPING);
  40. // register
  41. if(init.mask == -1 || init.group == -1)
  42. {
  43. masterContainer.dynamicsWorld->addRigidBody(this);
  44. }
  45. else
  46. {
  47. masterContainer.dynamicsWorld->addRigidBody(this, init.group, init.mask);
  48. }
  49. }
  50. //======================================================================================================================
  51. // Destructor =
  52. //======================================================================================================================
  53. RigidBody::~RigidBody()
  54. {
  55. masterContainer.dynamicsWorld->removeRigidBody(this);
  56. }
  57. } // end namespace