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);
 | 
						|
}
 |