1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- #ifndef BT_FEATHERSTONE_LINK_COLLIDER_H
- #define BT_FEATHERSTONE_LINK_COLLIDER_H
- #include "bullet/BulletCollision//CollisionDispatch/btCollisionObject.h"
- #include "btMultiBody.h"
- class btMultiBodyLinkCollider : public btCollisionObject
- {
- public:
- btMultiBody* m_multiBody;
- int m_link;
- btMultiBodyLinkCollider (btMultiBody* multiBody,int link)
- :m_multiBody(multiBody),
- m_link(link)
- {
- m_checkCollideWith = true;
-
-
-
- {
- m_collisionFlags &= (~btCollisionObject::CF_STATIC_OBJECT);
- }
-
-
-
-
- m_internalType = CO_FEATHERSTONE_LINK;
- }
- static btMultiBodyLinkCollider* upcast(btCollisionObject* colObj)
- {
- if (colObj->getInternalType()&btCollisionObject::CO_FEATHERSTONE_LINK)
- return (btMultiBodyLinkCollider*)colObj;
- return 0;
- }
- static const btMultiBodyLinkCollider* upcast(const btCollisionObject* colObj)
- {
- if (colObj->getInternalType()&btCollisionObject::CO_FEATHERSTONE_LINK)
- return (btMultiBodyLinkCollider*)colObj;
- return 0;
- }
- virtual bool checkCollideWithOverride(const btCollisionObject* co) const
- {
- const btMultiBodyLinkCollider* other = btMultiBodyLinkCollider::upcast(co);
- if (!other)
- return true;
- if (other->m_multiBody != this->m_multiBody)
- return true;
- if (!m_multiBody->hasSelfCollision())
- return false;
-
- if (m_link>=0)
- {
- const btMultibodyLink& link = m_multiBody->getLink(this->m_link);
- if ((link.m_flags&BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION) && link.parent == other->m_link)
- return false;
- }
-
- if (other->m_link>=0)
- {
- const btMultibodyLink& otherLink = other->m_multiBody->getLink(other->m_link);
- if ((otherLink.m_flags& BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION) && otherLink.parent == this->m_link)
- return false;
- }
- return true;
- }
- };
- #endif
|