Blender V2.61 - r43446
|
00001 /* 00002 Bullet Continuous Collision Detection and Physics Library 00003 Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ 00004 00005 This software is provided 'as-is', without any express or implied warranty. 00006 In no event will the authors be held liable for any damages arising from the use of this software. 00007 Permission is granted to anyone to use this software for any purpose, 00008 including commercial applications, and to alter it and redistribute it freely, 00009 subject to the following restrictions: 00010 00011 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. 00012 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 00013 3. This notice may not be removed or altered from any source distribution. 00014 */ 00015 00016 #ifndef COLLISION_OBJECT_H 00017 #define COLLISION_OBJECT_H 00018 00019 #include "LinearMath/btTransform.h" 00020 00021 //island management, m_activationState1 00022 #define ACTIVE_TAG 1 00023 #define ISLAND_SLEEPING 2 00024 #define WANTS_DEACTIVATION 3 00025 #define DISABLE_DEACTIVATION 4 00026 #define DISABLE_SIMULATION 5 00027 00028 struct btBroadphaseProxy; 00029 class btCollisionShape; 00030 struct btCollisionShapeData; 00031 #include "LinearMath/btMotionState.h" 00032 #include "LinearMath/btAlignedAllocator.h" 00033 #include "LinearMath/btAlignedObjectArray.h" 00034 00035 typedef btAlignedObjectArray<class btCollisionObject*> btCollisionObjectArray; 00036 00037 #ifdef BT_USE_DOUBLE_PRECISION 00038 #define btCollisionObjectData btCollisionObjectDoubleData 00039 #define btCollisionObjectDataName "btCollisionObjectDoubleData" 00040 #else 00041 #define btCollisionObjectData btCollisionObjectFloatData 00042 #define btCollisionObjectDataName "btCollisionObjectFloatData" 00043 #endif 00044 00045 00049 ATTRIBUTE_ALIGNED16(class) btCollisionObject 00050 { 00051 00052 protected: 00053 00054 btTransform m_worldTransform; 00055 00058 btTransform m_interpolationWorldTransform; 00059 //those two are experimental: just added for bullet time effect, so you can still apply impulses (directly modifying velocities) 00060 //without destroying the continuous interpolated motion (which uses this interpolation velocities) 00061 btVector3 m_interpolationLinearVelocity; 00062 btVector3 m_interpolationAngularVelocity; 00063 00064 btVector3 m_anisotropicFriction; 00065 int m_hasAnisotropicFriction; 00066 btScalar m_contactProcessingThreshold; 00067 00068 btBroadphaseProxy* m_broadphaseHandle; 00069 btCollisionShape* m_collisionShape; 00071 void* m_extensionPointer; 00072 00076 btCollisionShape* m_rootCollisionShape; 00077 00078 int m_collisionFlags; 00079 00080 int m_islandTag1; 00081 int m_companionId; 00082 00083 int m_activationState1; 00084 btScalar m_deactivationTime; 00085 00086 btScalar m_friction; 00087 btScalar m_restitution; 00088 00091 int m_internalType; 00092 00094 void* m_userObjectPointer; 00095 00097 btScalar m_hitFraction; 00098 00100 btScalar m_ccdSweptSphereRadius; 00101 00103 btScalar m_ccdMotionThreshold; 00104 00106 int m_checkCollideWith; 00107 00108 virtual bool checkCollideWithOverride(btCollisionObject* /* co */) 00109 { 00110 return true; 00111 } 00112 00113 public: 00114 00115 BT_DECLARE_ALIGNED_ALLOCATOR(); 00116 00117 enum CollisionFlags 00118 { 00119 CF_STATIC_OBJECT= 1, 00120 CF_KINEMATIC_OBJECT= 2, 00121 CF_NO_CONTACT_RESPONSE = 4, 00122 CF_CUSTOM_MATERIAL_CALLBACK = 8,//this allows per-triangle material (friction/restitution) 00123 CF_CHARACTER_OBJECT = 16, 00124 CF_DISABLE_VISUALIZE_OBJECT = 32, //disable debug drawing 00125 CF_DISABLE_SPU_COLLISION_PROCESSING = 64//disable parallel/SPU processing 00126 }; 00127 00128 enum CollisionObjectTypes 00129 { 00130 CO_COLLISION_OBJECT =1, 00131 CO_RIGID_BODY=2, 00134 CO_GHOST_OBJECT=4, 00135 CO_SOFT_BODY=8, 00136 CO_HF_FLUID=16, 00137 CO_USER_TYPE=32 00138 }; 00139 00140 SIMD_FORCE_INLINE bool mergesSimulationIslands() const 00141 { 00143 return ((m_collisionFlags & (CF_STATIC_OBJECT | CF_KINEMATIC_OBJECT | CF_NO_CONTACT_RESPONSE) )==0); 00144 } 00145 00146 const btVector3& getAnisotropicFriction() const 00147 { 00148 return m_anisotropicFriction; 00149 } 00150 void setAnisotropicFriction(const btVector3& anisotropicFriction) 00151 { 00152 m_anisotropicFriction = anisotropicFriction; 00153 m_hasAnisotropicFriction = (anisotropicFriction[0]!=1.f) || (anisotropicFriction[1]!=1.f) || (anisotropicFriction[2]!=1.f); 00154 } 00155 bool hasAnisotropicFriction() const 00156 { 00157 return m_hasAnisotropicFriction!=0; 00158 } 00159 00162 void setContactProcessingThreshold( btScalar contactProcessingThreshold) 00163 { 00164 m_contactProcessingThreshold = contactProcessingThreshold; 00165 } 00166 btScalar getContactProcessingThreshold() const 00167 { 00168 return m_contactProcessingThreshold; 00169 } 00170 00171 SIMD_FORCE_INLINE bool isStaticObject() const { 00172 return (m_collisionFlags & CF_STATIC_OBJECT) != 0; 00173 } 00174 00175 SIMD_FORCE_INLINE bool isKinematicObject() const 00176 { 00177 return (m_collisionFlags & CF_KINEMATIC_OBJECT) != 0; 00178 } 00179 00180 SIMD_FORCE_INLINE bool isStaticOrKinematicObject() const 00181 { 00182 return (m_collisionFlags & (CF_KINEMATIC_OBJECT | CF_STATIC_OBJECT)) != 0 ; 00183 } 00184 00185 SIMD_FORCE_INLINE bool hasContactResponse() const { 00186 return (m_collisionFlags & CF_NO_CONTACT_RESPONSE)==0; 00187 } 00188 00189 00190 btCollisionObject(); 00191 00192 virtual ~btCollisionObject(); 00193 00194 virtual void setCollisionShape(btCollisionShape* collisionShape) 00195 { 00196 m_collisionShape = collisionShape; 00197 m_rootCollisionShape = collisionShape; 00198 } 00199 00200 SIMD_FORCE_INLINE const btCollisionShape* getCollisionShape() const 00201 { 00202 return m_collisionShape; 00203 } 00204 00205 SIMD_FORCE_INLINE btCollisionShape* getCollisionShape() 00206 { 00207 return m_collisionShape; 00208 } 00209 00210 SIMD_FORCE_INLINE const btCollisionShape* getRootCollisionShape() const 00211 { 00212 return m_rootCollisionShape; 00213 } 00214 00215 SIMD_FORCE_INLINE btCollisionShape* getRootCollisionShape() 00216 { 00217 return m_rootCollisionShape; 00218 } 00219 00222 void internalSetTemporaryCollisionShape(btCollisionShape* collisionShape) 00223 { 00224 m_collisionShape = collisionShape; 00225 } 00226 00229 void* internalGetExtensionPointer() const 00230 { 00231 return m_extensionPointer; 00232 } 00235 void internalSetExtensionPointer(void* pointer) 00236 { 00237 m_extensionPointer = pointer; 00238 } 00239 00240 SIMD_FORCE_INLINE int getActivationState() const { return m_activationState1;} 00241 00242 void setActivationState(int newState); 00243 00244 void setDeactivationTime(btScalar time) 00245 { 00246 m_deactivationTime = time; 00247 } 00248 btScalar getDeactivationTime() const 00249 { 00250 return m_deactivationTime; 00251 } 00252 00253 void forceActivationState(int newState); 00254 00255 void activate(bool forceActivation = false); 00256 00257 SIMD_FORCE_INLINE bool isActive() const 00258 { 00259 return ((getActivationState() != ISLAND_SLEEPING) && (getActivationState() != DISABLE_SIMULATION)); 00260 } 00261 00262 void setRestitution(btScalar rest) 00263 { 00264 m_restitution = rest; 00265 } 00266 btScalar getRestitution() const 00267 { 00268 return m_restitution; 00269 } 00270 void setFriction(btScalar frict) 00271 { 00272 m_friction = frict; 00273 } 00274 btScalar getFriction() const 00275 { 00276 return m_friction; 00277 } 00278 00280 int getInternalType() const 00281 { 00282 return m_internalType; 00283 } 00284 00285 btTransform& getWorldTransform() 00286 { 00287 return m_worldTransform; 00288 } 00289 00290 const btTransform& getWorldTransform() const 00291 { 00292 return m_worldTransform; 00293 } 00294 00295 void setWorldTransform(const btTransform& worldTrans) 00296 { 00297 m_worldTransform = worldTrans; 00298 } 00299 00300 00301 SIMD_FORCE_INLINE btBroadphaseProxy* getBroadphaseHandle() 00302 { 00303 return m_broadphaseHandle; 00304 } 00305 00306 SIMD_FORCE_INLINE const btBroadphaseProxy* getBroadphaseHandle() const 00307 { 00308 return m_broadphaseHandle; 00309 } 00310 00311 void setBroadphaseHandle(btBroadphaseProxy* handle) 00312 { 00313 m_broadphaseHandle = handle; 00314 } 00315 00316 00317 const btTransform& getInterpolationWorldTransform() const 00318 { 00319 return m_interpolationWorldTransform; 00320 } 00321 00322 btTransform& getInterpolationWorldTransform() 00323 { 00324 return m_interpolationWorldTransform; 00325 } 00326 00327 void setInterpolationWorldTransform(const btTransform& trans) 00328 { 00329 m_interpolationWorldTransform = trans; 00330 } 00331 00332 void setInterpolationLinearVelocity(const btVector3& linvel) 00333 { 00334 m_interpolationLinearVelocity = linvel; 00335 } 00336 00337 void setInterpolationAngularVelocity(const btVector3& angvel) 00338 { 00339 m_interpolationAngularVelocity = angvel; 00340 } 00341 00342 const btVector3& getInterpolationLinearVelocity() const 00343 { 00344 return m_interpolationLinearVelocity; 00345 } 00346 00347 const btVector3& getInterpolationAngularVelocity() const 00348 { 00349 return m_interpolationAngularVelocity; 00350 } 00351 00352 SIMD_FORCE_INLINE int getIslandTag() const 00353 { 00354 return m_islandTag1; 00355 } 00356 00357 void setIslandTag(int tag) 00358 { 00359 m_islandTag1 = tag; 00360 } 00361 00362 SIMD_FORCE_INLINE int getCompanionId() const 00363 { 00364 return m_companionId; 00365 } 00366 00367 void setCompanionId(int id) 00368 { 00369 m_companionId = id; 00370 } 00371 00372 SIMD_FORCE_INLINE btScalar getHitFraction() const 00373 { 00374 return m_hitFraction; 00375 } 00376 00377 void setHitFraction(btScalar hitFraction) 00378 { 00379 m_hitFraction = hitFraction; 00380 } 00381 00382 00383 SIMD_FORCE_INLINE int getCollisionFlags() const 00384 { 00385 return m_collisionFlags; 00386 } 00387 00388 void setCollisionFlags(int flags) 00389 { 00390 m_collisionFlags = flags; 00391 } 00392 00394 btScalar getCcdSweptSphereRadius() const 00395 { 00396 return m_ccdSweptSphereRadius; 00397 } 00398 00400 void setCcdSweptSphereRadius(btScalar radius) 00401 { 00402 m_ccdSweptSphereRadius = radius; 00403 } 00404 00405 btScalar getCcdMotionThreshold() const 00406 { 00407 return m_ccdMotionThreshold; 00408 } 00409 00410 btScalar getCcdSquareMotionThreshold() const 00411 { 00412 return m_ccdMotionThreshold*m_ccdMotionThreshold; 00413 } 00414 00415 00416 00418 void setCcdMotionThreshold(btScalar ccdMotionThreshold) 00419 { 00420 m_ccdMotionThreshold = ccdMotionThreshold; 00421 } 00422 00424 void* getUserPointer() const 00425 { 00426 return m_userObjectPointer; 00427 } 00428 00430 void setUserPointer(void* userPointer) 00431 { 00432 m_userObjectPointer = userPointer; 00433 } 00434 00435 00436 inline bool checkCollideWith(btCollisionObject* co) 00437 { 00438 if (m_checkCollideWith) 00439 return checkCollideWithOverride(co); 00440 00441 return true; 00442 } 00443 00444 virtual int calculateSerializeBufferSize() const; 00445 00447 virtual const char* serialize(void* dataBuffer, class btSerializer* serializer) const; 00448 00449 virtual void serializeSingleObject(class btSerializer* serializer) const; 00450 00451 }; 00452 00454 struct btCollisionObjectDoubleData 00455 { 00456 void *m_broadphaseHandle; 00457 void *m_collisionShape; 00458 btCollisionShapeData *m_rootCollisionShape; 00459 char *m_name; 00460 00461 btTransformDoubleData m_worldTransform; 00462 btTransformDoubleData m_interpolationWorldTransform; 00463 btVector3DoubleData m_interpolationLinearVelocity; 00464 btVector3DoubleData m_interpolationAngularVelocity; 00465 btVector3DoubleData m_anisotropicFriction; 00466 double m_contactProcessingThreshold; 00467 double m_deactivationTime; 00468 double m_friction; 00469 double m_restitution; 00470 double m_hitFraction; 00471 double m_ccdSweptSphereRadius; 00472 double m_ccdMotionThreshold; 00473 00474 int m_hasAnisotropicFriction; 00475 int m_collisionFlags; 00476 int m_islandTag1; 00477 int m_companionId; 00478 int m_activationState1; 00479 int m_internalType; 00480 int m_checkCollideWith; 00481 00482 char m_padding[4]; 00483 }; 00484 00486 struct btCollisionObjectFloatData 00487 { 00488 void *m_broadphaseHandle; 00489 void *m_collisionShape; 00490 btCollisionShapeData *m_rootCollisionShape; 00491 char *m_name; 00492 00493 btTransformFloatData m_worldTransform; 00494 btTransformFloatData m_interpolationWorldTransform; 00495 btVector3FloatData m_interpolationLinearVelocity; 00496 btVector3FloatData m_interpolationAngularVelocity; 00497 btVector3FloatData m_anisotropicFriction; 00498 float m_contactProcessingThreshold; 00499 float m_deactivationTime; 00500 float m_friction; 00501 float m_restitution; 00502 float m_hitFraction; 00503 float m_ccdSweptSphereRadius; 00504 float m_ccdMotionThreshold; 00505 00506 int m_hasAnisotropicFriction; 00507 int m_collisionFlags; 00508 int m_islandTag1; 00509 int m_companionId; 00510 int m_activationState1; 00511 int m_internalType; 00512 int m_checkCollideWith; 00513 }; 00514 00515 00516 00517 SIMD_FORCE_INLINE int btCollisionObject::calculateSerializeBufferSize() const 00518 { 00519 return sizeof(btCollisionObjectData); 00520 } 00521 00522 00523 00524 #endif //COLLISION_OBJECT_H