PhysicsPlayerController.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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/PhysicsPlayerController.h>
  6. #include <AnKi/Physics/PhysicsWorld.h>
  7. namespace anki {
  8. PhysicsPlayerController::PhysicsPlayerController(const PhysicsPlayerControllerInitInfo& init)
  9. : PhysicsFilteredObject(kClassType)
  10. {
  11. const btTransform trf = toBt(Transform(init.m_position.xyz0(), Mat3x4::getIdentity(), Vec4(1.0f, 1.0f, 1.0f, 0.0f)));
  12. m_convexShape.construct(init.m_outerRadius, init.m_height);
  13. m_ghostObject.construct();
  14. m_ghostObject->setWorldTransform(trf);
  15. m_ghostObject->setCollisionShape(m_convexShape.get());
  16. m_ghostObject->setUserPointer(static_cast<PhysicsObject*>(this));
  17. setMaterialGroup(PhysicsMaterialBit::kPlayer);
  18. setMaterialMask(PhysicsMaterialBit::kAll);
  19. m_controller.construct(m_ghostObject.get(), m_convexShape.get(), init.m_stepHeight, btVector3(0, 1, 0));
  20. // Need to call this else the player is upside down
  21. moveToPosition(init.m_position);
  22. }
  23. PhysicsPlayerController::~PhysicsPlayerController()
  24. {
  25. m_controller.destroy();
  26. m_ghostObject.destroy();
  27. m_convexShape.destroy();
  28. }
  29. void PhysicsPlayerController::registerToWorld()
  30. {
  31. btDynamicsWorld& btworld = PhysicsWorld::getSingleton().getBtWorld();
  32. btworld.addCollisionObject(m_ghostObject.get(), btBroadphaseProxy::CharacterFilter,
  33. btBroadphaseProxy::StaticFilter | btBroadphaseProxy::DefaultFilter);
  34. btworld.addAction(m_controller.get());
  35. }
  36. void PhysicsPlayerController::unregisterFromWorld()
  37. {
  38. PhysicsWorld::getSingleton().getBtWorld().removeAction(m_controller.get());
  39. PhysicsWorld::getSingleton().getBtWorld().removeCollisionObject(m_ghostObject.get());
  40. }
  41. void PhysicsPlayerController::moveToPositionForReal()
  42. {
  43. if(m_moveToPosition.x() == kMaxF32)
  44. {
  45. return;
  46. }
  47. btDynamicsWorld& btworld = PhysicsWorld::getSingleton().getBtWorld();
  48. btworld.getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(m_ghostObject->getBroadphaseHandle(), btworld.getDispatcher());
  49. m_controller->reset(&btworld);
  50. m_controller->warp(toBt(m_moveToPosition));
  51. m_moveToPosition.x() = kMaxF32;
  52. }
  53. } // end namespace anki