forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			132 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| 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.
 | |
| */
 | |
| 
 | |
| 
 | |
| #include "btCollisionObject.h"
 | |
| #include "LinearMath/btSerializer.h"
 | |
| 
 | |
| btCollisionObject::btCollisionObject()
 | |
| 	:	m_interpolationLinearVelocity(0.f, 0.f, 0.f),
 | |
| 		m_interpolationAngularVelocity(0.f, 0.f, 0.f),
 | |
| 		m_anisotropicFriction(1.f,1.f,1.f),
 | |
| 		m_hasAnisotropicFriction(false),
 | |
| 		m_contactProcessingThreshold(BT_LARGE_FLOAT),
 | |
| 		m_broadphaseHandle(0),
 | |
| 		m_collisionShape(0),
 | |
| 		m_extensionPointer(0),
 | |
| 		m_rootCollisionShape(0),
 | |
| 		m_collisionFlags(btCollisionObject::CF_STATIC_OBJECT),
 | |
| 		m_islandTag1(-1),
 | |
| 		m_companionId(-1),
 | |
|         m_worldArrayIndex(-1),
 | |
| 		m_activationState1(1),
 | |
| 		m_deactivationTime(btScalar(0.)),
 | |
| 		m_friction(btScalar(0.5)),
 | |
| 		m_restitution(btScalar(0.)),
 | |
| 		m_rollingFriction(0.0f),
 | |
|         m_spinningFriction(0.f),
 | |
| 		m_contactDamping(.1),
 | |
| 		m_contactStiffness(1e4),
 | |
| 		m_internalType(CO_COLLISION_OBJECT),
 | |
| 		m_userObjectPointer(0),
 | |
| 		m_userIndex2(-1),
 | |
| 		m_userIndex(-1),
 | |
| 		m_hitFraction(btScalar(1.)),
 | |
| 		m_ccdSweptSphereRadius(btScalar(0.)),
 | |
| 		m_ccdMotionThreshold(btScalar(0.)),
 | |
| 		m_checkCollideWith(false),
 | |
| 		m_updateRevision(0)
 | |
| {
 | |
| 	m_worldTransform.setIdentity();
 | |
| 	m_interpolationWorldTransform.setIdentity();
 | |
| }
 | |
| 
 | |
| btCollisionObject::~btCollisionObject()
 | |
| {
 | |
| }
 | |
| 
 | |
| void btCollisionObject::setActivationState(int newState) const
 | |
| { 
 | |
| 	if ( (m_activationState1 != DISABLE_DEACTIVATION) && (m_activationState1 != DISABLE_SIMULATION))
 | |
| 		m_activationState1 = newState;
 | |
| }
 | |
| 
 | |
| void btCollisionObject::forceActivationState(int newState) const
 | |
| {
 | |
| 	m_activationState1 = newState;
 | |
| }
 | |
| 
 | |
| void btCollisionObject::activate(bool forceActivation) const
 | |
| {
 | |
| 	if (forceActivation || !(m_collisionFlags & (CF_STATIC_OBJECT|CF_KINEMATIC_OBJECT)))
 | |
| 	{
 | |
| 		setActivationState(ACTIVE_TAG);
 | |
| 		m_deactivationTime = btScalar(0.);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| const char* btCollisionObject::serialize(void* dataBuffer, btSerializer* serializer) const
 | |
| {
 | |
| 
 | |
| 	btCollisionObjectData* dataOut = (btCollisionObjectData*)dataBuffer;
 | |
| 
 | |
| 	m_worldTransform.serialize(dataOut->m_worldTransform);
 | |
| 	m_interpolationWorldTransform.serialize(dataOut->m_interpolationWorldTransform);
 | |
| 	m_interpolationLinearVelocity.serialize(dataOut->m_interpolationLinearVelocity);
 | |
| 	m_interpolationAngularVelocity.serialize(dataOut->m_interpolationAngularVelocity);
 | |
| 	m_anisotropicFriction.serialize(dataOut->m_anisotropicFriction);
 | |
| 	dataOut->m_hasAnisotropicFriction = m_hasAnisotropicFriction;
 | |
| 	dataOut->m_contactProcessingThreshold = m_contactProcessingThreshold;
 | |
| 	dataOut->m_broadphaseHandle = 0;
 | |
| 	dataOut->m_collisionShape = serializer->getUniquePointer(m_collisionShape);
 | |
| 	dataOut->m_rootCollisionShape = 0;//@todo
 | |
| 	dataOut->m_collisionFlags = m_collisionFlags;
 | |
| 	dataOut->m_islandTag1 = m_islandTag1;
 | |
| 	dataOut->m_companionId = m_companionId;
 | |
| 	dataOut->m_activationState1 = m_activationState1;
 | |
| 	dataOut->m_deactivationTime = m_deactivationTime;
 | |
| 	dataOut->m_friction = m_friction;
 | |
| 	dataOut->m_rollingFriction = m_rollingFriction;
 | |
| 	dataOut->m_contactDamping = m_contactDamping;
 | |
| 	dataOut->m_contactStiffness = m_contactStiffness;
 | |
| 	dataOut->m_restitution = m_restitution;
 | |
| 	dataOut->m_internalType = m_internalType;
 | |
| 	
 | |
| 	char* name = (char*) serializer->findNameForPointer(this);
 | |
| 	dataOut->m_name = (char*)serializer->getUniquePointer(name);
 | |
| 	if (dataOut->m_name)
 | |
| 	{
 | |
| 		serializer->serializeName(name);
 | |
| 	}
 | |
| 	dataOut->m_hitFraction = m_hitFraction;
 | |
| 	dataOut->m_ccdSweptSphereRadius = m_ccdSweptSphereRadius;
 | |
| 	dataOut->m_ccdMotionThreshold = m_ccdMotionThreshold;
 | |
| 	dataOut->m_checkCollideWith = m_checkCollideWith;
 | |
| 
 | |
| 	// Fill padding with zeros to appease msan.
 | |
| 	memset(dataOut->m_padding, 0, sizeof(dataOut->m_padding));
 | |
| 
 | |
| 	return btCollisionObjectDataName;
 | |
| }
 | |
| 
 | |
| 
 | |
| void btCollisionObject::serializeSingleObject(class btSerializer* serializer) const
 | |
| {
 | |
| 	int len = calculateSerializeBufferSize();
 | |
| 	btChunk* chunk = serializer->allocate(len,1);
 | |
| 	const char* structType = serialize(chunk->m_oldPtr, serializer);
 | |
| 	serializer->finalizeChunk(chunk,structType,BT_COLLISIONOBJECT_CODE,(void*)this);
 | |
| }
 |