PhysicsTrigger.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. #pragma once
  6. #include <AnKi/Physics/PhysicsObject.h>
  7. #include <AnKi/Util/WeakArray.h>
  8. #include <AnKi/Util/ClassWrapper.h>
  9. #include <AnKi/Util/HashMap.h>
  10. namespace anki {
  11. /// @addtogroup physics
  12. /// @{
  13. /// An interface to process contacts.
  14. /// @memberof PhysicsTrigger
  15. class PhysicsTriggerProcessContactCallback
  16. {
  17. public:
  18. /// Will be called whenever a contact first touches a trigger.
  19. virtual void onTriggerEnter(PhysicsTrigger& trigger, PhysicsFilteredObject& obj)
  20. {
  21. }
  22. /// Will be called whenever a contact touches a trigger.
  23. virtual void onTriggerInside(PhysicsTrigger& trigger, PhysicsFilteredObject& obj)
  24. {
  25. }
  26. /// Will be called whenever a contact stops touching a trigger.
  27. virtual void onTriggerExit(PhysicsTrigger& trigger, PhysicsFilteredObject& obj)
  28. {
  29. }
  30. };
  31. /// A trigger that uses a PhysicsShape and its purpose is to collect collision events.
  32. class PhysicsTrigger : public PhysicsFilteredObject
  33. {
  34. ANKI_PHYSICS_OBJECT(PhysicsObjectType::TRIGGER)
  35. public:
  36. Transform getTransform() const
  37. {
  38. return toAnki(m_ghostShape->getWorldTransform());
  39. }
  40. void setTransform(const Transform& trf)
  41. {
  42. m_ghostShape->setWorldTransform(toBt(trf));
  43. }
  44. void setContactProcessCallback(PhysicsTriggerProcessContactCallback* cb)
  45. {
  46. m_contactCallback = cb;
  47. }
  48. private:
  49. PhysicsCollisionShapePtr m_shape;
  50. ClassWrapper<btGhostObject> m_ghostShape;
  51. DynamicArray<PhysicsTriggerFilteredPair*> m_pairs;
  52. PhysicsTriggerProcessContactCallback* m_contactCallback = nullptr;
  53. U64 m_processContactsFrame = 0;
  54. PhysicsTrigger(PhysicsWorld* world, PhysicsCollisionShapePtr shape);
  55. ~PhysicsTrigger();
  56. void registerToWorld() override;
  57. void unregisterFromWorld() override;
  58. void processContacts();
  59. };
  60. /// @}
  61. } // end namespace anki