PhysicsBody.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Physics/PhysicsBody.h>
  6. #include <AnKi/Physics/PhysicsWorld.h>
  7. #include <AnKi/Physics/PhysicsCollisionShape.h>
  8. namespace anki {
  9. PhysicsBody::PhysicsBody(const PhysicsBodyInitInfo& init)
  10. : PhysicsFilteredObject(kClassType)
  11. {
  12. ANKI_ASSERT(init.m_mass >= 0.0f);
  13. const Bool dynamic = init.m_mass > 0.0f;
  14. m_shape = init.m_shape;
  15. m_mass = init.m_mass;
  16. // Create motion state
  17. m_motionState.m_body = this;
  18. // Compute inertia
  19. btCollisionShape* shape = m_shape->getBtShape(dynamic);
  20. btVector3 localInertia(0, 0, 0);
  21. if(dynamic)
  22. {
  23. shape->calculateLocalInertia(init.m_mass, localInertia);
  24. }
  25. // Create body
  26. btRigidBody::btRigidBodyConstructionInfo cInfo(init.m_mass, &m_motionState, shape, localInertia);
  27. cInfo.m_friction = init.m_friction;
  28. m_body.construct(cInfo);
  29. // User pointer
  30. m_body->setUserPointer(static_cast<PhysicsObject*>(this));
  31. // Other
  32. setMaterialGroup((dynamic) ? PhysicsMaterialBit::kDynamicGeometry : PhysicsMaterialBit::kStaticGeometry);
  33. PhysicsMaterialBit collidesWith = PhysicsMaterialBit::kAll;
  34. if(!dynamic)
  35. {
  36. collidesWith &= ~PhysicsMaterialBit::kStaticGeometry;
  37. }
  38. setMaterialMask(collidesWith);
  39. setTransform(init.m_transform);
  40. }
  41. PhysicsBody::~PhysicsBody()
  42. {
  43. m_body.destroy();
  44. }
  45. void PhysicsBody::setMass(F32 mass)
  46. {
  47. ANKI_ASSERT(m_mass > 0.0f && "Only relevant for dynamic bodies");
  48. ANKI_ASSERT(mass > 0.0f);
  49. btVector3 inertia;
  50. m_shape->getBtShape(true)->calculateLocalInertia(mass, inertia);
  51. m_body->setMassProps(mass, inertia);
  52. m_mass = mass;
  53. }
  54. void PhysicsBody::registerToWorld()
  55. {
  56. PhysicsWorld::getSingleton().getBtWorld().addRigidBody(m_body.get());
  57. }
  58. void PhysicsBody::unregisterFromWorld()
  59. {
  60. PhysicsWorld::getSingleton().getBtWorld().removeRigidBody(m_body.get());
  61. }
  62. } // end namespace anki