Bullet Collision Detection & Physics Library
btCollisionObject.cpp
Go to the documentation of this file.
1 /*
2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
4 
5 This software is provided 'as-is', without any express or implied warranty.
6 In no event will the authors be held liable for any damages arising from the use of this software.
7 Permission is granted to anyone to use this software for any purpose,
8 including commercial applications, and to alter it and redistribute it freely,
9 subject to the following restrictions:
10 
11 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.
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13 3. This notice may not be removed or altered from any source distribution.
14 */
15 
16 
17 #include "btCollisionObject.h"
20 
22  : m_interpolationLinearVelocity(0.f, 0.f, 0.f),
23  m_interpolationAngularVelocity(0.f, 0.f, 0.f),
24  m_anisotropicFriction(1.f,1.f,1.f),
25  m_hasAnisotropicFriction(false),
26  m_contactProcessingThreshold(BT_LARGE_FLOAT),
27  m_broadphaseHandle(0),
28  m_collisionShape(0),
29  m_extensionPointer(0),
30  m_rootCollisionShape(0),
31  m_collisionFlags(btCollisionObject::CF_STATIC_OBJECT),
32  m_islandTag1(-1),
33  m_companionId(-1),
34  m_worldArrayIndex(-1),
35  m_activationState1(1),
36  m_deactivationTime(btScalar(0.)),
37  m_friction(btScalar(0.5)),
38  m_restitution(btScalar(0.)),
39  m_rollingFriction(0.0f),
40  m_spinningFriction(0.f),
41  m_contactDamping(.1),
42  m_contactStiffness(BT_LARGE_FLOAT),
43  m_internalType(CO_COLLISION_OBJECT),
44  m_userObjectPointer(0),
45  m_userIndex2(-1),
46  m_userIndex(-1),
47  m_hitFraction(btScalar(1.)),
48  m_ccdSweptSphereRadius(btScalar(0.)),
49  m_ccdMotionThreshold(btScalar(0.)),
50  m_checkCollideWith(false),
51  m_updateRevision(0)
52 {
55 }
56 
58 {
59 }
60 
61 void btCollisionObject::setActivationState(int newState) const
62 {
64  m_activationState1 = newState;
65 }
66 
68 {
69  m_activationState1 = newState;
70 }
71 
72 void btCollisionObject::activate(bool forceActivation) const
73 {
74  if (forceActivation || !(m_collisionFlags & (CF_STATIC_OBJECT|CF_KINEMATIC_OBJECT)))
75  {
78  }
79 }
80 
81 const char* btCollisionObject::serialize(void* dataBuffer, btSerializer* serializer) const
82 {
83 
84  btCollisionObjectData* dataOut = (btCollisionObjectData*)dataBuffer;
85 
86  m_worldTransform.serialize(dataOut->m_worldTransform);
87  m_interpolationWorldTransform.serialize(dataOut->m_interpolationWorldTransform);
88  m_interpolationLinearVelocity.serialize(dataOut->m_interpolationLinearVelocity);
89  m_interpolationAngularVelocity.serialize(dataOut->m_interpolationAngularVelocity);
90  m_anisotropicFriction.serialize(dataOut->m_anisotropicFriction);
91  dataOut->m_hasAnisotropicFriction = m_hasAnisotropicFriction;
92  dataOut->m_contactProcessingThreshold = m_contactProcessingThreshold;
93  dataOut->m_broadphaseHandle = 0;
94  dataOut->m_collisionShape = serializer->getUniquePointer(m_collisionShape);
95  dataOut->m_rootCollisionShape = 0;//@todo
96  dataOut->m_collisionFlags = m_collisionFlags;
97  dataOut->m_islandTag1 = m_islandTag1;
98  dataOut->m_companionId = m_companionId;
99  dataOut->m_activationState1 = m_activationState1;
100  dataOut->m_deactivationTime = m_deactivationTime;
101  dataOut->m_friction = m_friction;
102  dataOut->m_rollingFriction = m_rollingFriction;
103  dataOut->m_contactDamping = m_contactDamping;
104  dataOut->m_contactStiffness = m_contactStiffness;
105  dataOut->m_restitution = m_restitution;
106  dataOut->m_internalType = m_internalType;
107 
108  char* name = (char*) serializer->findNameForPointer(this);
109  dataOut->m_name = (char*)serializer->getUniquePointer(name);
110  if (dataOut->m_name)
111  {
112  serializer->serializeName(name);
113  }
114  dataOut->m_hitFraction = m_hitFraction;
115  dataOut->m_ccdSweptSphereRadius = m_ccdSweptSphereRadius;
116  dataOut->m_ccdMotionThreshold = m_ccdMotionThreshold;
117  dataOut->m_checkCollideWith = m_checkCollideWith;
118  if (m_broadphaseHandle)
119  {
120  dataOut->m_collisionFilterGroup = m_broadphaseHandle->m_collisionFilterGroup;
121  dataOut->m_collisionFilterMask = m_broadphaseHandle->m_collisionFilterMask;
122  dataOut->m_uniqueId = m_broadphaseHandle->m_uniqueId;
123  }
124  else
125  {
126  dataOut->m_collisionFilterGroup = 0;
127  dataOut->m_collisionFilterMask = 0;
128  dataOut->m_uniqueId = -1;
129  }
131 }
132 
133 
135 {
136  int len = calculateSerializeBufferSize();
137  btChunk* chunk = serializer->allocate(len,1);
138  const char* structType = serialize(chunk->m_oldPtr, serializer);
139  serializer->finalizeChunk(chunk,structType,BT_COLLISIONOBJECT_CODE,(void*)this);
140 }
#define ACTIVE_TAG
#define BT_LARGE_FLOAT
Definition: btScalar.h:294
btScalar m_ccdMotionThreshold
Don't do continuous collision detection if the motion (in one step) is less then m_ccdMotionThreshold...
btTransform m_interpolationWorldTransform
m_interpolationWorldTransform is used for CCD and interpolation it can be either previous or future (...
btScalar m_ccdSweptSphereRadius
Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
virtual int calculateSerializeBufferSize() const
virtual void * getUniquePointer(void *oldPtr)=0
void setIdentity()
Set this transformation to the identity.
Definition: btTransform.h:172
btScalar m_hitFraction
time of impact calculation
#define btCollisionObjectData
btTransform m_worldTransform
btCollisionShape * m_collisionShape
void forceActivationState(int newState) const
btVector3 m_anisotropicFriction
virtual const char * serialize(void *dataBuffer, class btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
void setActivationState(int newState) const
#define btCollisionObjectDataName
int m_internalType
m_internalType is reserved to distinguish Bullet's btCollisionObject, btRigidBody, btSoftBody, btGhostObject etc.
void serialize(struct btVector3Data &dataOut) const
Definition: btVector3.h:1352
btCollisionObject can be used to manage collision detection objects.
#define DISABLE_SIMULATION
btScalar m_contactProcessingThreshold
#define BT_COLLISIONOBJECT_CODE
Definition: btSerializer.h:121
void activate(bool forceActivation=false) const
virtual void finalizeChunk(btChunk *chunk, const char *structType, int chunkCode, void *oldPtr)=0
virtual void serializeName(const char *ptr)=0
btVector3 m_interpolationAngularVelocity
int m_checkCollideWith
If some object should have elaborate collision filtering by sub-classes.
#define DISABLE_DEACTIVATION
virtual void serializeSingleObject(class btSerializer *serializer) const
virtual const char * findNameForPointer(const void *ptr) const =0
btBroadphaseProxy * m_broadphaseHandle
void serialize(struct btTransformData &dataOut) const
Definition: btTransform.h:267
btVector3 m_interpolationLinearVelocity
void * m_oldPtr
Definition: btSerializer.h:56
virtual btChunk * allocate(size_t size, int numElements)=0
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition: btScalar.h:292