Bullet Collision Detection & Physics Library
btCollisionObject.h
Go to the documentation of this file.
1/*
2Bullet Continuous Collision Detection and Physics Library
3Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
4
5This software is provided 'as-is', without any express or implied warranty.
6In no event will the authors be held liable for any damages arising from the use of this software.
7Permission is granted to anyone to use this software for any purpose,
8including commercial applications, and to alter it and redistribute it freely,
9subject to the following restrictions:
10
111. 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.
122. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
133. This notice may not be removed or altered from any source distribution.
14*/
15
16#ifndef BT_COLLISION_OBJECT_H
17#define BT_COLLISION_OBJECT_H
18
20
21//island management, m_activationState1
22#define ACTIVE_TAG 1
23#define ISLAND_SLEEPING 2
24#define WANTS_DEACTIVATION 3
25#define DISABLE_DEACTIVATION 4
26#define DISABLE_SIMULATION 5
27
34
36
37#ifdef BT_USE_DOUBLE_PRECISION
38#define btCollisionObjectData btCollisionObjectDoubleData
39#define btCollisionObjectDataName "btCollisionObjectDoubleData"
40#else
41#define btCollisionObjectData btCollisionObjectFloatData
42#define btCollisionObjectDataName "btCollisionObjectFloatData"
43#endif
44
45
50{
51
52protected:
53
55
59 //those two are experimental: just added for bullet time effect, so you can still apply impulses (directly modifying velocities)
60 //without destroying the continuous interpolated motion (which uses this interpolation velocities)
63
67
72
77
79
82 int m_worldArrayIndex; // index of object in world's collisionObjects array
83
84 mutable int m_activationState1;
86
89 btScalar m_rollingFriction;//torsional friction orthogonal to contact normal (useful to stop spheres rolling forever)
90 btScalar m_spinningFriction; // torsional friction around the contact normal (useful for grasping)
93
94
95
99
101
103
105
107
110
113
116
119
121
124
126
127public:
128
130
145
158
165
171
173 {
175 }
176 void setAnisotropicFriction(const btVector3& anisotropicFriction, int frictionMode = CF_ANISOTROPIC_FRICTION)
177 {
178 m_anisotropicFriction = anisotropicFriction;
179 bool isUnity = (anisotropicFriction[0]!=1.f) || (anisotropicFriction[1]!=1.f) || (anisotropicFriction[2]!=1.f);
180 m_hasAnisotropicFriction = isUnity?frictionMode : 0;
181 }
182 bool hasAnisotropicFriction(int frictionMode = CF_ANISOTROPIC_FRICTION) const
183 {
184 return (m_hasAnisotropicFriction&frictionMode)!=0;
185 }
186
189 void setContactProcessingThreshold( btScalar contactProcessingThreshold)
190 {
191 m_contactProcessingThreshold = contactProcessingThreshold;
192 }
197
199 return (m_collisionFlags & CF_STATIC_OBJECT) != 0;
200 }
201
203 {
205 }
206
211
215
216
218
219 virtual ~btCollisionObject();
220
221 virtual void setCollisionShape(btCollisionShape* collisionShape)
222 {
224 m_collisionShape = collisionShape;
225 m_rootCollisionShape = collisionShape;
226 }
227
232
237
238 void setIgnoreCollisionCheck(const btCollisionObject* co, bool ignoreCollisionCheck)
239 {
240 if (ignoreCollisionCheck)
241 {
242 //We don't check for duplicates. Is it ok to leave that up to the user of this API?
243 //int index = m_objectsWithoutCollisionCheck.findLinearSearch(co);
244 //if (index == m_objectsWithoutCollisionCheck.size())
245 //{
246 m_objectsWithoutCollisionCheck.push_back(co);
247 //}
248 }
249 else
250 {
252 }
254 }
255
256 virtual bool checkCollideWithOverride(const btCollisionObject* co) const
257 {
258 int index = m_objectsWithoutCollisionCheck.findLinearSearch(co);
259 if (index < m_objectsWithoutCollisionCheck.size())
260 {
261 return false;
262 }
263 return true;
264 }
265
266
267
268
272 {
273 return m_extensionPointer;
274 }
275
277 void internalSetExtensionPointer(void* pointer)
278 {
279 m_extensionPointer = pointer;
280 }
281
283
284 void setActivationState(int newState) const;
285
287 {
288 m_deactivationTime = time;
289 }
291 {
292 return m_deactivationTime;
293 }
294
295 void forceActivationState(int newState) const;
296
297 void activate(bool forceActivation = false) const;
298
303
305 {
307 m_restitution = rest;
308 }
310 {
311 return m_restitution;
312 }
314 {
316 m_friction = frict;
317 }
319 {
320 return m_friction;
321 }
322
324 {
326 m_rollingFriction = frict;
327 }
329 {
330 return m_rollingFriction;
331 }
333 {
335 m_spinningFriction = frict;
336 }
338 {
339 return m_spinningFriction;
340 }
342 {
344 m_contactStiffness = stiffness;
345 m_contactDamping = damping;
346
348
349 //avoid divisions by zero...
351 {
353 }
354 }
355
357 {
358 return m_contactStiffness;
359 }
360
362 {
363 return m_contactDamping;
364 }
365
367 int getInternalType() const
368 {
369 return m_internalType;
370 }
371
376
378 {
379 return m_worldTransform;
380 }
381
382 void setWorldTransform(const btTransform& worldTrans)
383 {
385 m_worldTransform = worldTrans;
386 }
387
388
393
398
400 {
401 m_broadphaseHandle = handle;
402 }
403
404
409
414
420
426
432
437
442
444 {
445 return m_islandTag1;
446 }
447
448 void setIslandTag(int tag)
449 {
450 m_islandTag1 = tag;
451 }
452
454 {
455 return m_companionId;
456 }
457
458 void setCompanionId(int id)
459 {
460 m_companionId = id;
461 }
462
464 {
465 return m_worldArrayIndex;
466 }
467
468 // only should be called by CollisionWorld
470 {
472 }
473
478
479 void setHitFraction(btScalar hitFraction)
480 {
481 m_hitFraction = hitFraction;
482 }
483
484
486 {
487 return m_collisionFlags;
488 }
489
490 void setCollisionFlags(int flags)
491 {
492 m_collisionFlags = flags;
493 }
494
500
503 {
504 m_ccdSweptSphereRadius = radius;
505 }
506
508 {
510 }
511
516
517
518
520 void setCcdMotionThreshold(btScalar ccdMotionThreshold)
521 {
522 m_ccdMotionThreshold = ccdMotionThreshold;
523 }
524
526 void* getUserPointer() const
527 {
528 return m_userObjectPointer;
529 }
530
531 int getUserIndex() const
532 {
533 return m_userIndex;
534 }
535
536 int getUserIndex2() const
537 {
538 return m_userIndex2;
539 }
540
542 void setUserPointer(void* userPointer)
543 {
544 m_userObjectPointer = userPointer;
545 }
546
548 void setUserIndex(int index)
549 {
550 m_userIndex = index;
551 }
552
553 void setUserIndex2(int index)
554 {
555 m_userIndex2 = index;
556 }
557
559 {
560 return m_updateRevision;
561 }
562
568
573
574 bool getCustomDebugColor(btVector3& colorRGB) const
575 {
576 bool hasCustomColor = (0!=(m_collisionFlags&CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR));
577 if (hasCustomColor)
578 {
579 colorRGB = m_customDebugColorRGB;
580 }
581 return hasCustomColor;
582 }
583
584 inline bool checkCollideWith(const btCollisionObject* co) const
585 {
587 return checkCollideWithOverride(co);
588
589 return true;
590 }
591
592 virtual int calculateSerializeBufferSize() const;
593
595 virtual const char* serialize(void* dataBuffer, class btSerializer* serializer) const;
596
597 virtual void serializeSingleObject(class btSerializer* serializer) const;
598
599};
600
635
669
670
671
676
677
678
679#endif //BT_COLLISION_OBJECT_H
#define btCollisionObjectData
btAlignedObjectArray< class btCollisionObject * > btCollisionObjectArray
#define ISLAND_SLEEPING
#define DISABLE_SIMULATION
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition btScalar.h:292
#define ATTRIBUTE_ALIGNED16(a)
Definition btScalar.h:82
#define SIMD_FORCE_INLINE
Definition btScalar.h:81
#define SIMD_EPSILON
Definition btScalar.h:521
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
btCollisionObject can be used to manage collision detection objects.
btScalar getContactStiffness() const
const btBroadphaseProxy * getBroadphaseHandle() const
void setRestitution(btScalar rest)
int m_updateRevision
internal update revision number. It will be increased when the object changes. This allows some subsy...
virtual bool checkCollideWithOverride(const btCollisionObject *co) const
void setSpinningFriction(btScalar frict)
const btTransform & getWorldTransform() const
bool isStaticOrKinematicObject() const
btScalar getHitFraction() const
void setAnisotropicFriction(const btVector3 &anisotropicFriction, int frictionMode=CF_ANISOTROPIC_FRICTION)
@ CO_GHOST_OBJECT
CO_GHOST_OBJECT keeps track of all objects overlapping its AABB and that pass its collision filter It...
void setWorldArrayIndex(int ix)
void setCollisionFlags(int flags)
btTransform & getWorldTransform()
int m_checkCollideWith
If some object should have elaborate collision filtering by sub-classes.
btBroadphaseProxy * getBroadphaseHandle()
const btVector3 & getAnisotropicFriction() const
btTransform m_worldTransform
btCollisionShape * m_collisionShape
void setUserPointer(void *userPointer)
users can point to their objects, userPointer is not used by Bullet
int getInternalType() const
reserved for Bullet internal usage
virtual void setCollisionShape(btCollisionShape *collisionShape)
btScalar getDeactivationTime() const
bool hasContactResponse() const
btVector3 m_interpolationLinearVelocity
void setIgnoreCollisionCheck(const btCollisionObject *co, bool ignoreCollisionCheck)
btScalar getSpinningFriction() const
void * getUserPointer() const
users can point to their objects, userPointer is not used by Bullet
bool isStaticObject() const
void setContactProcessingThreshold(btScalar contactProcessingThreshold)
the constraint solver can discard solving contacts, if the distance is above this threshold.
btCollisionShape * m_rootCollisionShape
m_rootCollisionShape is temporarily used to store the original collision shape The m_collisionShape m...
void * m_extensionPointer
m_extensionPointer is used by some internal low-level Bullet extensions.
btTransform & getInterpolationWorldTransform()
bool checkCollideWith(const btCollisionObject *co) const
btVector3 m_interpolationAngularVelocity
bool getCustomDebugColor(btVector3 &colorRGB) const
int m_internalType
m_internalType is reserved to distinguish Bullet's btCollisionObject, btRigidBody,...
void setWorldTransform(const btTransform &worldTrans)
void * m_userObjectPointer
users can point to their objects, m_userPointer is not used by Bullet, see setUserPointer/getUserPoin...
void setCustomDebugColor(const btVector3 &colorRGB)
btScalar getFriction() const
btVector3 m_anisotropicFriction
btScalar getContactProcessingThreshold() const
int getWorldArrayIndex() const
btCollisionShape * getCollisionShape()
void setCcdMotionThreshold(btScalar ccdMotionThreshold)
Don't do continuous collision detection if the motion (in one step) is less then m_ccdMotionThreshold...
btScalar m_ccdSweptSphereRadius
Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
bool hasAnisotropicFriction(int frictionMode=CF_ANISOTROPIC_FRICTION) const
virtual int calculateSerializeBufferSize() const
btTransform m_interpolationWorldTransform
m_interpolationWorldTransform is used for CCD and interpolation it can be either previous or future (...
void setCompanionId(int id)
bool isKinematicObject() const
const btTransform & getInterpolationWorldTransform() const
btScalar getContactDamping() const
const btCollisionShape * getCollisionShape() const
void setUserIndex2(int index)
void setFriction(btScalar frict)
void internalSetExtensionPointer(void *pointer)
Avoid using this internal API call, the extension pointer is used by some Bullet extensions If you ne...
btAlignedObjectArray< const btCollisionObject * > m_objectsWithoutCollisionCheck
void setCcdSweptSphereRadius(btScalar radius)
Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
void setContactStiffnessAndDamping(btScalar stiffness, btScalar damping)
void setDeactivationTime(btScalar time)
bool mergesSimulationIslands() const
btScalar m_ccdMotionThreshold
Don't do continuous collision detection if the motion (in one step) is less then m_ccdMotionThreshold...
btScalar m_contactProcessingThreshold
void setRollingFriction(btScalar frict)
void setIslandTag(int tag)
void setBroadphaseHandle(btBroadphaseProxy *handle)
btBroadphaseProxy * m_broadphaseHandle
int getCollisionFlags() const
void setInterpolationAngularVelocity(const btVector3 &angvel)
const btVector3 & getInterpolationAngularVelocity() const
btScalar getCcdMotionThreshold() const
void setHitFraction(btScalar hitFraction)
btVector3 m_customDebugColorRGB
void * internalGetExtensionPointer() const
Avoid using this internal API call, the extension pointer is used by some Bullet extensions.
void setInterpolationLinearVelocity(const btVector3 &linvel)
btScalar m_hitFraction
time of impact calculation
int getUpdateRevisionInternal() const
void setUserIndex(int index)
users can point to their objects, userPointer is not used by Bullet
btScalar getRestitution() const
int getActivationState() const
btScalar getRollingFriction() const
btScalar getCcdSquareMotionThreshold() const
void setInterpolationWorldTransform(const btTransform &trans)
const btVector3 & getInterpolationLinearVelocity() const
btScalar getCcdSweptSphereRadius() const
Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
The btCollisionShape class provides an interface for collision shapes that can be shared among btColl...
The btTransform class supports rigid transforms with only translation and rotation and no scaling/she...
Definition btTransform.h:34
btVector3 can be used to represent 3D points and vectors.
Definition btVector3.h:84
The btBroadphaseProxy is the main class that can be used with the Bullet broadphases.
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
btVector3DoubleData m_anisotropicFriction
btVector3DoubleData m_interpolationLinearVelocity
btTransformDoubleData m_interpolationWorldTransform
btTransformDoubleData m_worldTransform
btVector3DoubleData m_interpolationAngularVelocity
btCollisionShapeData * m_rootCollisionShape
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
btVector3FloatData m_interpolationLinearVelocity
btVector3FloatData m_anisotropicFriction
btTransformFloatData m_interpolationWorldTransform
btVector3FloatData m_interpolationAngularVelocity
btTransformFloatData m_worldTransform
btCollisionShapeData * m_rootCollisionShape
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
for serialization