PhysicsTrigger.h 1.9 KB

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