PhysicsPlayerController.cpp 2.1 KB

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