2
0

PhysicsBody.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // Copyright (C) 2009-2021, 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. {
  10. PhysicsBody::PhysicsBody(PhysicsWorld* world, const PhysicsBodyInitInfo& init)
  11. : PhysicsFilteredObject(CLASS_TYPE, world)
  12. {
  13. ANKI_ASSERT(init.m_mass >= 0.0f);
  14. const Bool dynamic = init.m_mass > 0.0f;
  15. m_shape = init.m_shape;
  16. m_mass = init.m_mass;
  17. // Create motion state
  18. m_motionState.m_body = this;
  19. // Compute inertia
  20. btCollisionShape* shape = m_shape->getBtShape(dynamic);
  21. btVector3 localInertia(0, 0, 0);
  22. if(dynamic)
  23. {
  24. shape->calculateLocalInertia(init.m_mass, localInertia);
  25. }
  26. // Create body
  27. btRigidBody::btRigidBodyConstructionInfo cInfo(init.m_mass, &m_motionState, shape, localInertia);
  28. cInfo.m_friction = init.m_friction;
  29. m_body.init(cInfo);
  30. // User pointer
  31. m_body->setUserPointer(static_cast<PhysicsObject*>(this));
  32. // Other
  33. setMaterialGroup((dynamic) ? PhysicsMaterialBit::DYNAMIC_GEOMETRY : PhysicsMaterialBit::STATIC_GEOMETRY);
  34. PhysicsMaterialBit collidesWith = PhysicsMaterialBit::ALL;
  35. if(!dynamic)
  36. {
  37. collidesWith &= ~PhysicsMaterialBit::STATIC_GEOMETRY;
  38. }
  39. setMaterialMask(collidesWith);
  40. setTransform(init.m_transform);
  41. }
  42. PhysicsBody::~PhysicsBody()
  43. {
  44. m_body.destroy();
  45. }
  46. void PhysicsBody::setMass(F32 mass)
  47. {
  48. ANKI_ASSERT(m_mass > 0.0f && "Only relevant for dynamic bodies");
  49. ANKI_ASSERT(mass > 0.0f);
  50. btVector3 inertia;
  51. m_shape->getBtShape(true)->calculateLocalInertia(mass, inertia);
  52. m_body->setMassProps(mass, inertia);
  53. m_mass = mass;
  54. }
  55. void PhysicsBody::registerToWorld()
  56. {
  57. getWorld().getBtWorld().addRigidBody(m_body.get());
  58. }
  59. void PhysicsBody::unregisterFromWorld()
  60. {
  61. getWorld().getBtWorld().removeRigidBody(m_body.get());
  62. }
  63. } // end namespace anki