// Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors. // All rights reserved. // Code licensed under the BSD License. // http://www.anki3d.org/LICENSE #pragma once #include #include #include #include namespace anki { /// @addtogroup physics /// @{ /// An interface to process contacts. /// @memberof PhysicsTrigger class PhysicsTriggerProcessContactCallback { public: /// Will be called whenever a contact first touches a trigger. virtual void onTriggerEnter(PhysicsTrigger& trigger, PhysicsFilteredObject& obj) { } /// Will be called whenever a contact touches a trigger. virtual void onTriggerInside(PhysicsTrigger& trigger, PhysicsFilteredObject& obj) { } /// Will be called whenever a contact stops touching a trigger. virtual void onTriggerExit(PhysicsTrigger& trigger, PhysicsFilteredObject& obj) { } }; /// A trigger that uses a PhysicsShape and its purpose is to collect collision events. class PhysicsTrigger : public PhysicsFilteredObject { ANKI_PHYSICS_OBJECT(PhysicsObjectType::TRIGGER) public: Transform getTransform() const { return toAnki(m_ghostShape->getWorldTransform()); } void setTransform(const Transform& trf) { m_ghostShape->setWorldTransform(toBt(trf)); } void setContactProcessCallback(PhysicsTriggerProcessContactCallback* cb) { m_contactCallback = cb; } private: PhysicsCollisionShapePtr m_shape; ClassWrapper m_ghostShape; DynamicArray m_pairs; PhysicsTriggerProcessContactCallback* m_contactCallback = nullptr; U64 m_processContactsFrame = 0; PhysicsTrigger(PhysicsWorld* world, PhysicsCollisionShapePtr shape); ~PhysicsTrigger(); void registerToWorld() override; void unregisterFromWorld() override; void processContacts(); }; /// @} } // end namespace anki