123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691 |
- /*
- Bullet Continuous Collision Detection and Physics Library
- Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
- This software is provided 'as-is', without any express or implied warranty.
- In no event will the authors be held liable for any damages arising from the use of this software.
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it freely,
- subject to the following restrictions:
- 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
- */
- #ifndef BT_COLLISION_OBJECT_H
- #define BT_COLLISION_OBJECT_H
- #include "LinearMath/btTransform.h"
- //island management, m_activationState1
- #define ACTIVE_TAG 1
- #define ISLAND_SLEEPING 2
- #define WANTS_DEACTIVATION 3
- #define DISABLE_DEACTIVATION 4
- #define DISABLE_SIMULATION 5
- #define FIXED_BASE_MULTI_BODY 6
- struct btBroadphaseProxy;
- class btCollisionShape;
- struct btCollisionShapeData;
- #include "LinearMath/btMotionState.h"
- #include "LinearMath/btAlignedAllocator.h"
- #include "LinearMath/btAlignedObjectArray.h"
- typedef btAlignedObjectArray<class btCollisionObject*> btCollisionObjectArray;
- #ifdef BT_USE_DOUBLE_PRECISION
- #define btCollisionObjectData btCollisionObjectDoubleData
- #define btCollisionObjectDataName "btCollisionObjectDoubleData"
- #else
- #define btCollisionObjectData btCollisionObjectFloatData
- #define btCollisionObjectDataName "btCollisionObjectFloatData"
- #endif
- /// btCollisionObject can be used to manage collision detection objects.
- /// btCollisionObject maintains all information that is needed for a collision detection: Shape, Transform and AABB proxy.
- /// They can be added to the btCollisionWorld.
- ATTRIBUTE_ALIGNED16(class)
- btCollisionObject
- {
- protected:
- btTransform m_worldTransform;
- ///m_interpolationWorldTransform is used for CCD and interpolation
- ///it can be either previous or future (predicted) transform
- btTransform m_interpolationWorldTransform;
- //those two are experimental: just added for bullet time effect, so you can still apply impulses (directly modifying velocities)
- //without destroying the continuous interpolated motion (which uses this interpolation velocities)
- btVector3 m_interpolationLinearVelocity;
- btVector3 m_interpolationAngularVelocity;
- btVector3 m_anisotropicFriction;
- int m_hasAnisotropicFriction;
- btScalar m_contactProcessingThreshold;
- btBroadphaseProxy* m_broadphaseHandle;
- btCollisionShape* m_collisionShape;
- ///m_extensionPointer is used by some internal low-level Bullet extensions.
- void* m_extensionPointer;
- ///m_rootCollisionShape is temporarily used to store the original collision shape
- ///The m_collisionShape might be temporarily replaced by a child collision shape during collision detection purposes
- ///If it is NULL, the m_collisionShape is not temporarily replaced.
- btCollisionShape* m_rootCollisionShape;
- int m_collisionFlags;
- int m_islandTag1;
- int m_companionId;
- int m_worldArrayIndex; // index of object in world's collisionObjects array
- mutable int m_activationState1;
- mutable btScalar m_deactivationTime;
- btScalar m_friction;
- btScalar m_restitution;
- btScalar m_rollingFriction; //torsional friction orthogonal to contact normal (useful to stop spheres rolling forever)
- btScalar m_spinningFriction; // torsional friction around the contact normal (useful for grasping)
- btScalar m_contactDamping;
- btScalar m_contactStiffness;
- ///m_internalType is reserved to distinguish Bullet's btCollisionObject, btRigidBody, btSoftBody, btGhostObject etc.
- ///do not assign your own m_internalType unless you write a new dynamics object class.
- int m_internalType;
- ///users can point to their objects, m_userPointer is not used by Bullet, see setUserPointer/getUserPointer
- void* m_userObjectPointer;
- int m_userIndex2;
- int m_userIndex;
- int m_userIndex3;
- ///time of impact calculation
- btScalar m_hitFraction;
- ///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
- btScalar m_ccdSweptSphereRadius;
- /// Don't do continuous collision detection if the motion (in one step) is less then m_ccdMotionThreshold
- btScalar m_ccdMotionThreshold;
- /// If some object should have elaborate collision filtering by sub-classes
- int m_checkCollideWith;
- btAlignedObjectArray<const btCollisionObject*> m_objectsWithoutCollisionCheck;
- ///internal update revision number. It will be increased when the object changes. This allows some subsystems to perform lazy evaluation.
- int m_updateRevision;
- btVector3 m_customDebugColorRGB;
- public:
- BT_DECLARE_ALIGNED_ALLOCATOR();
- enum CollisionFlags
- {
- CF_DYNAMIC_OBJECT = 0,
- CF_STATIC_OBJECT = 1,
- CF_KINEMATIC_OBJECT = 2,
- CF_NO_CONTACT_RESPONSE = 4,
- CF_CUSTOM_MATERIAL_CALLBACK = 8, //this allows per-triangle material (friction/restitution)
- CF_CHARACTER_OBJECT = 16,
- CF_DISABLE_VISUALIZE_OBJECT = 32, //disable debug drawing
- CF_DISABLE_SPU_COLLISION_PROCESSING = 64, //disable parallel/SPU processing
- CF_HAS_CONTACT_STIFFNESS_DAMPING = 128,
- CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR = 256,
- CF_HAS_FRICTION_ANCHOR = 512,
- CF_HAS_COLLISION_SOUND_TRIGGER = 1024
- };
- enum CollisionObjectTypes
- {
- CO_COLLISION_OBJECT = 1,
- CO_RIGID_BODY = 2,
- ///CO_GHOST_OBJECT keeps track of all objects overlapping its AABB and that pass its collision filter
- ///It is useful for collision sensors, explosion objects, character controller etc.
- CO_GHOST_OBJECT = 4,
- CO_SOFT_BODY = 8,
- CO_HF_FLUID = 16,
- CO_USER_TYPE = 32,
- CO_FEATHERSTONE_LINK = 64
- };
- enum AnisotropicFrictionFlags
- {
- CF_ANISOTROPIC_FRICTION_DISABLED = 0,
- CF_ANISOTROPIC_FRICTION = 1,
- CF_ANISOTROPIC_ROLLING_FRICTION = 2
- };
- SIMD_FORCE_INLINE bool mergesSimulationIslands() const
- {
- ///static objects, kinematic and object without contact response don't merge islands
- return ((m_collisionFlags & (CF_STATIC_OBJECT | CF_KINEMATIC_OBJECT | CF_NO_CONTACT_RESPONSE)) == 0);
- }
- const btVector3& getAnisotropicFriction() const
- {
- return m_anisotropicFriction;
- }
- void setAnisotropicFriction(const btVector3& anisotropicFriction, int frictionMode = CF_ANISOTROPIC_FRICTION)
- {
- m_anisotropicFriction = anisotropicFriction;
- bool isUnity = (anisotropicFriction[0] != 1.f) || (anisotropicFriction[1] != 1.f) || (anisotropicFriction[2] != 1.f);
- m_hasAnisotropicFriction = isUnity ? frictionMode : 0;
- }
- bool hasAnisotropicFriction(int frictionMode = CF_ANISOTROPIC_FRICTION) const
- {
- return (m_hasAnisotropicFriction & frictionMode) != 0;
- }
- ///the constraint solver can discard solving contacts, if the distance is above this threshold. 0 by default.
- ///Note that using contacts with positive distance can improve stability. It increases, however, the chance of colliding with degerate contacts, such as 'interior' triangle edges
- void setContactProcessingThreshold(btScalar contactProcessingThreshold)
- {
- m_contactProcessingThreshold = contactProcessingThreshold;
- }
- btScalar getContactProcessingThreshold() const
- {
- return m_contactProcessingThreshold;
- }
- SIMD_FORCE_INLINE bool isStaticObject() const
- {
- return (m_collisionFlags & CF_STATIC_OBJECT) != 0;
- }
- SIMD_FORCE_INLINE bool isKinematicObject() const
- {
- return (m_collisionFlags & CF_KINEMATIC_OBJECT) != 0;
- }
- SIMD_FORCE_INLINE bool isStaticOrKinematicObject() const
- {
- return (m_collisionFlags & (CF_KINEMATIC_OBJECT | CF_STATIC_OBJECT)) != 0;
- }
- SIMD_FORCE_INLINE bool hasContactResponse() const
- {
- return (m_collisionFlags & CF_NO_CONTACT_RESPONSE) == 0;
- }
- btCollisionObject();
- virtual ~btCollisionObject();
- virtual void setCollisionShape(btCollisionShape * collisionShape)
- {
- m_updateRevision++;
- m_collisionShape = collisionShape;
- m_rootCollisionShape = collisionShape;
- }
- SIMD_FORCE_INLINE const btCollisionShape* getCollisionShape() const
- {
- return m_collisionShape;
- }
- SIMD_FORCE_INLINE btCollisionShape* getCollisionShape()
- {
- return m_collisionShape;
- }
- void setIgnoreCollisionCheck(const btCollisionObject* co, bool ignoreCollisionCheck)
- {
- if (ignoreCollisionCheck)
- {
- //We don't check for duplicates. Is it ok to leave that up to the user of this API?
- //int index = m_objectsWithoutCollisionCheck.findLinearSearch(co);
- //if (index == m_objectsWithoutCollisionCheck.size())
- //{
- m_objectsWithoutCollisionCheck.push_back(co);
- //}
- }
- else
- {
- m_objectsWithoutCollisionCheck.remove(co);
- }
- m_checkCollideWith = m_objectsWithoutCollisionCheck.size() > 0;
- }
- int getNumObjectsWithoutCollision() const
- {
- return m_objectsWithoutCollisionCheck.size();
- }
- const btCollisionObject* getObjectWithoutCollision(int index)
- {
- return m_objectsWithoutCollisionCheck[index];
- }
- virtual bool checkCollideWithOverride(const btCollisionObject* co) const
- {
- int index = m_objectsWithoutCollisionCheck.findLinearSearch(co);
- if (index < m_objectsWithoutCollisionCheck.size())
- {
- return false;
- }
- return true;
- }
- ///Avoid using this internal API call, the extension pointer is used by some Bullet extensions.
- ///If you need to store your own user pointer, use 'setUserPointer/getUserPointer' instead.
- void* internalGetExtensionPointer() const
- {
- return m_extensionPointer;
- }
- ///Avoid using this internal API call, the extension pointer is used by some Bullet extensions
- ///If you need to store your own user pointer, use 'setUserPointer/getUserPointer' instead.
- void internalSetExtensionPointer(void* pointer)
- {
- m_extensionPointer = pointer;
- }
- SIMD_FORCE_INLINE int getActivationState() const { return m_activationState1; }
- void setActivationState(int newState) const;
- void setDeactivationTime(btScalar time)
- {
- m_deactivationTime = time;
- }
- btScalar getDeactivationTime() const
- {
- return m_deactivationTime;
- }
- void forceActivationState(int newState) const;
- void activate(bool forceActivation = false) const;
- SIMD_FORCE_INLINE bool isActive() const
- {
- return ((getActivationState() != FIXED_BASE_MULTI_BODY) && (getActivationState() != ISLAND_SLEEPING) && (getActivationState() != DISABLE_SIMULATION));
- }
- void setRestitution(btScalar rest)
- {
- m_updateRevision++;
- m_restitution = rest;
- }
- btScalar getRestitution() const
- {
- return m_restitution;
- }
- void setFriction(btScalar frict)
- {
- m_updateRevision++;
- m_friction = frict;
- }
- btScalar getFriction() const
- {
- return m_friction;
- }
- void setRollingFriction(btScalar frict)
- {
- m_updateRevision++;
- m_rollingFriction = frict;
- }
- btScalar getRollingFriction() const
- {
- return m_rollingFriction;
- }
- void setSpinningFriction(btScalar frict)
- {
- m_updateRevision++;
- m_spinningFriction = frict;
- }
- btScalar getSpinningFriction() const
- {
- return m_spinningFriction;
- }
- void setContactStiffnessAndDamping(btScalar stiffness, btScalar damping)
- {
- m_updateRevision++;
- m_contactStiffness = stiffness;
- m_contactDamping = damping;
- m_collisionFlags |= CF_HAS_CONTACT_STIFFNESS_DAMPING;
- //avoid divisions by zero...
- if (m_contactStiffness < SIMD_EPSILON)
- {
- m_contactStiffness = SIMD_EPSILON;
- }
- }
- btScalar getContactStiffness() const
- {
- return m_contactStiffness;
- }
- btScalar getContactDamping() const
- {
- return m_contactDamping;
- }
- ///reserved for Bullet internal usage
- int getInternalType() const
- {
- return m_internalType;
- }
- btTransform& getWorldTransform()
- {
- return m_worldTransform;
- }
- const btTransform& getWorldTransform() const
- {
- return m_worldTransform;
- }
- void setWorldTransform(const btTransform& worldTrans)
- {
- m_updateRevision++;
- m_worldTransform = worldTrans;
- }
- SIMD_FORCE_INLINE btBroadphaseProxy* getBroadphaseHandle()
- {
- return m_broadphaseHandle;
- }
- SIMD_FORCE_INLINE const btBroadphaseProxy* getBroadphaseHandle() const
- {
- return m_broadphaseHandle;
- }
- void setBroadphaseHandle(btBroadphaseProxy * handle)
- {
- m_broadphaseHandle = handle;
- }
- const btTransform& getInterpolationWorldTransform() const
- {
- return m_interpolationWorldTransform;
- }
- btTransform& getInterpolationWorldTransform()
- {
- return m_interpolationWorldTransform;
- }
- void setInterpolationWorldTransform(const btTransform& trans)
- {
- m_updateRevision++;
- m_interpolationWorldTransform = trans;
- }
- void setInterpolationLinearVelocity(const btVector3& linvel)
- {
- m_updateRevision++;
- m_interpolationLinearVelocity = linvel;
- }
- void setInterpolationAngularVelocity(const btVector3& angvel)
- {
- m_updateRevision++;
- m_interpolationAngularVelocity = angvel;
- }
- const btVector3& getInterpolationLinearVelocity() const
- {
- return m_interpolationLinearVelocity;
- }
- const btVector3& getInterpolationAngularVelocity() const
- {
- return m_interpolationAngularVelocity;
- }
- SIMD_FORCE_INLINE int getIslandTag() const
- {
- return m_islandTag1;
- }
- void setIslandTag(int tag)
- {
- m_islandTag1 = tag;
- }
- SIMD_FORCE_INLINE int getCompanionId() const
- {
- return m_companionId;
- }
- void setCompanionId(int id)
- {
- m_companionId = id;
- }
- SIMD_FORCE_INLINE int getWorldArrayIndex() const
- {
- return m_worldArrayIndex;
- }
- // only should be called by CollisionWorld
- void setWorldArrayIndex(int ix)
- {
- m_worldArrayIndex = ix;
- }
- SIMD_FORCE_INLINE btScalar getHitFraction() const
- {
- return m_hitFraction;
- }
- void setHitFraction(btScalar hitFraction)
- {
- m_hitFraction = hitFraction;
- }
- SIMD_FORCE_INLINE int getCollisionFlags() const
- {
- return m_collisionFlags;
- }
- void setCollisionFlags(int flags)
- {
- m_collisionFlags = flags;
- }
- ///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
- btScalar getCcdSweptSphereRadius() const
- {
- return m_ccdSweptSphereRadius;
- }
- ///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
- void setCcdSweptSphereRadius(btScalar radius)
- {
- m_ccdSweptSphereRadius = radius;
- }
- btScalar getCcdMotionThreshold() const
- {
- return m_ccdMotionThreshold;
- }
- btScalar getCcdSquareMotionThreshold() const
- {
- return m_ccdMotionThreshold * m_ccdMotionThreshold;
- }
- /// Don't do continuous collision detection if the motion (in one step) is less then m_ccdMotionThreshold
- void setCcdMotionThreshold(btScalar ccdMotionThreshold)
- {
- m_ccdMotionThreshold = ccdMotionThreshold;
- }
- ///users can point to their objects, userPointer is not used by Bullet
- void* getUserPointer() const
- {
- return m_userObjectPointer;
- }
- int getUserIndex() const
- {
- return m_userIndex;
- }
- int getUserIndex2() const
- {
- return m_userIndex2;
- }
- int getUserIndex3() const
- {
- return m_userIndex3;
- }
- ///users can point to their objects, userPointer is not used by Bullet
- void setUserPointer(void* userPointer)
- {
- m_userObjectPointer = userPointer;
- }
- ///users can point to their objects, userPointer is not used by Bullet
- void setUserIndex(int index)
- {
- m_userIndex = index;
- }
- void setUserIndex2(int index)
- {
- m_userIndex2 = index;
- }
- void setUserIndex3(int index)
- {
- m_userIndex3 = index;
- }
- int getUpdateRevisionInternal() const
- {
- return m_updateRevision;
- }
- void setCustomDebugColor(const btVector3& colorRGB)
- {
- m_customDebugColorRGB = colorRGB;
- m_collisionFlags |= CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR;
- }
- void removeCustomDebugColor()
- {
- m_collisionFlags &= ~CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR;
- }
- bool getCustomDebugColor(btVector3 & colorRGB) const
- {
- bool hasCustomColor = (0 != (m_collisionFlags & CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR));
- if (hasCustomColor)
- {
- colorRGB = m_customDebugColorRGB;
- }
- return hasCustomColor;
- }
- inline bool checkCollideWith(const btCollisionObject* co) const
- {
- if (m_checkCollideWith)
- return checkCollideWithOverride(co);
- return true;
- }
- virtual int calculateSerializeBufferSize() const;
- ///fills the dataBuffer and returns the struct name (and 0 on failure)
- virtual const char* serialize(void* dataBuffer, class btSerializer* serializer) const;
- virtual void serializeSingleObject(class btSerializer * serializer) const;
- };
- // clang-format off
- ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
- struct btCollisionObjectDoubleData
- {
- void *m_broadphaseHandle;
- void *m_collisionShape;
- btCollisionShapeData *m_rootCollisionShape;
- char *m_name;
- btTransformDoubleData m_worldTransform;
- btTransformDoubleData m_interpolationWorldTransform;
- btVector3DoubleData m_interpolationLinearVelocity;
- btVector3DoubleData m_interpolationAngularVelocity;
- btVector3DoubleData m_anisotropicFriction;
- double m_contactProcessingThreshold;
- double m_deactivationTime;
- double m_friction;
- double m_rollingFriction;
- double m_contactDamping;
- double m_contactStiffness;
- double m_restitution;
- double m_hitFraction;
- double m_ccdSweptSphereRadius;
- double m_ccdMotionThreshold;
- int m_hasAnisotropicFriction;
- int m_collisionFlags;
- int m_islandTag1;
- int m_companionId;
- int m_activationState1;
- int m_internalType;
- int m_checkCollideWith;
- int m_collisionFilterGroup;
- int m_collisionFilterMask;
- int m_uniqueId;//m_uniqueId is introduced for paircache. could get rid of this, by calculating the address offset etc.
- };
- ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
- struct btCollisionObjectFloatData
- {
- void *m_broadphaseHandle;
- void *m_collisionShape;
- btCollisionShapeData *m_rootCollisionShape;
- char *m_name;
- btTransformFloatData m_worldTransform;
- btTransformFloatData m_interpolationWorldTransform;
- btVector3FloatData m_interpolationLinearVelocity;
- btVector3FloatData m_interpolationAngularVelocity;
- btVector3FloatData m_anisotropicFriction;
- float m_contactProcessingThreshold;
- float m_deactivationTime;
- float m_friction;
- float m_rollingFriction;
- float m_contactDamping;
- float m_contactStiffness;
- float m_restitution;
- float m_hitFraction;
- float m_ccdSweptSphereRadius;
- float m_ccdMotionThreshold;
- int m_hasAnisotropicFriction;
- int m_collisionFlags;
- int m_islandTag1;
- int m_companionId;
- int m_activationState1;
- int m_internalType;
- int m_checkCollideWith;
- int m_collisionFilterGroup;
- int m_collisionFilterMask;
- int m_uniqueId;
- };
- // clang-format on
- SIMD_FORCE_INLINE int btCollisionObject::calculateSerializeBufferSize() const
- {
- return sizeof(btCollisionObjectData);
- }
- #endif //BT_COLLISION_OBJECT_H
|