add serialization for btGearConstraint

support 'linearFactor' and 'angularFactor' for btRigidBody world importer
This commit is contained in:
erwin.coumans
2013-09-14 17:51:09 +00:00
parent 6fd4738a9e
commit c28652de37
6 changed files with 783 additions and 623 deletions

View File

@@ -87,6 +87,8 @@ typedef struct bInvalidHandle {
class btGeneric6DofSpringConstraintDoubleData2;
class btSliderConstraintData;
class btSliderConstraintDoubleData;
class btGearConstraintFloatData;
class btGearConstraintDoubleData;
class btContactSolverInfoDoubleData;
class btContactSolverInfoFloatData;
class SoftBodyMaterialData;
@@ -933,6 +935,29 @@ typedef struct bInvalidHandle {
};
// -------------------------------------------------- //
class btGearConstraintFloatData
{
public:
btTypedConstraintFloatData m_typeConstraintData;
btVector3FloatData m_axisInA;
btVector3FloatData m_axisInB;
float m_ratio;
char m_padding[4];
};
// -------------------------------------------------- //
class btGearConstraintDoubleData
{
public:
btTypedConstraintDoubleData m_typeConstraintData;
btVector3DoubleData m_axisInA;
btVector3DoubleData m_axisInB;
double m_ratio;
};
// -------------------------------------------------- //
class btContactSolverInfoDoubleData
{

View File

@@ -927,7 +927,25 @@ void btWorldImporter::convertConstraintFloat(btTypedConstraintFloatData* constra
constraint = slider;
break;
}
case GEAR_CONSTRAINT_TYPE:
{
btGearConstraintFloatData* gearData = (btGearConstraintFloatData*) constraintData;
btGearConstraint* gear = 0;
if (rbA&&rbB)
{
btVector3 axisInA,axisInB;
axisInA.deSerializeFloat(gearData->m_axisInA);
axisInB.deSerializeFloat(gearData->m_axisInB);
gear = createGearConstraint(*rbA, *rbB, axisInA,axisInB, gearData->m_ratio);
} else
{
btAssert(0);
//perhaps a gear against a 'fixed' body, while the 'fixed' body is not serialized?
//btGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA,const btVector3& axisInB, btScalar ratio=1.f);
}
constraint = gear;
break;
}
default:
{
printf("unknown constraint type\n");
@@ -1149,7 +1167,25 @@ void btWorldImporter::convertConstraintDouble(btTypedConstraintDoubleData* const
constraint = slider;
break;
}
case GEAR_CONSTRAINT_TYPE:
{
btGearConstraintDoubleData* gearData = (btGearConstraintDoubleData*) constraintData;
btGearConstraint* gear = 0;
if (rbA&&rbB)
{
btVector3 axisInA,axisInB;
axisInA.deSerializeDouble(gearData->m_axisInA);
axisInB.deSerializeDouble(gearData->m_axisInB);
gear = createGearConstraint(*rbA, *rbB, axisInA,axisInB, gearData->m_ratio);
} else
{
btAssert(0);
//perhaps a gear against a 'fixed' body, while the 'fixed' body is not serialized?
//btGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA,const btVector3& axisInB, btScalar ratio=1.f);
}
constraint = gear;
break;
}
default:
{
printf("unknown constraint type\n");
@@ -1690,6 +1726,12 @@ btSliderConstraint* btWorldImporter::createSliderConstraint(btRigidBody& rbB, co
return slider;
}
btGearConstraint* btWorldImporter::createGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA,const btVector3& axisInB, btScalar ratio)
{
btGearConstraint* gear = new btGearConstraint(rbA,rbB,axisInA,axisInB,ratio);
m_allocatedConstraints.push_back(gear);
return gear;
}
// query for data
int btWorldImporter::getNumCollisionShapes() const
@@ -1806,7 +1848,11 @@ void btWorldImporter::convertRigidBodyFloat( btRigidBodyFloatData* colObjData)
btRigidBody* body = createRigidBody(isDynamic,mass,startTransform,shape,colObjData->m_collisionObjectData.m_name);
body->setFriction(colObjData->m_collisionObjectData.m_friction);
body->setRestitution(colObjData->m_collisionObjectData.m_restitution);
btVector3 linearFactor,angularFactor;
linearFactor.deSerializeFloat(colObjData->m_linearFactor);
angularFactor.deSerializeFloat(colObjData->m_angularFactor);
body->setLinearFactor(linearFactor);
body->setAngularFactor(angularFactor);
#ifdef USE_INTERNAL_EDGE_UTILITY
if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
@@ -1851,6 +1897,11 @@ void btWorldImporter::convertRigidBodyDouble( btRigidBodyDoubleData* colObjData)
btRigidBody* body = createRigidBody(isDynamic,mass,startTransform,shape,colObjData->m_collisionObjectData.m_name);
body->setFriction(btScalar(colObjData->m_collisionObjectData.m_friction));
body->setRestitution(btScalar(colObjData->m_collisionObjectData.m_restitution));
btVector3 linearFactor,angularFactor;
linearFactor.deSerializeDouble(colObjData->m_linearFactor);
angularFactor.deSerializeDouble(colObjData->m_angularFactor);
body->setLinearFactor(linearFactor);
body->setAngularFactor(angularFactor);
#ifdef USE_INTERNAL_EDGE_UTILITY

View File

@@ -43,6 +43,7 @@ class btConeTwistConstraint;
class btGeneric6DofConstraint;
class btGeneric6DofSpringConstraint;
class btSliderConstraint;
class btGearConstraint;
struct btContactSolverInfo;
struct btTypedConstraintData;
struct btTypedConstraintFloatData;
@@ -200,6 +201,8 @@ public:
virtual btGeneric6DofSpringConstraint* createGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
virtual btSliderConstraint* createSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
virtual btSliderConstraint* createSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameA);
virtual btGearConstraint* createGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA,const btVector3& axisInB, btScalar ratio);

View File

@@ -145,6 +145,7 @@ typedef unsigned long uintptr_t;
#include "BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h"
#include "BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h"
#include "BulletDynamics/ConstraintSolver/btSliderConstraint.h"
#include "BulletDynamics/ConstraintSolver/btGearConstraint.h"
#include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h"
#include "BulletDynamics/Dynamics/btDynamicsWorld.h"
@@ -192,6 +193,7 @@ char *includefiles[] = {
"../../../src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h",
"../../../src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h",
"../../../src/BulletDynamics/ConstraintSolver/btSliderConstraint.h",
"../../../src/BulletDynamics/ConstraintSolver/btGearConstraint.h",
"../../../src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h",
"../../../src/BulletSoftBody/btSoftBodyData.h",
// empty string to indicate end of includefiles

View File

@@ -19,6 +19,18 @@ subject to the following restrictions:
#define BT_GEAR_CONSTRAINT_H
#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h"
#ifdef BT_USE_DOUBLE_PRECISION
#define btGearConstraintData btGearConstraintDoubleData
#define btGearConstraintDataName "btGearConstraintDoubleData"
#else
#define btGearConstraintData btGearConstraintFloatData
#define btGearConstraintDataName "btGearConstraintFloatData"
#endif //BT_USE_DOUBLE_PRECISION
///The btGeatConstraint will couple the angular velocity for two bodies around given local axis and ratio.
///See Bullet/Demos/ConstraintDemo for an example use.
class btGearConstraint : public btTypedConstraint
@@ -82,6 +94,59 @@ public:
return 0.f;
}
virtual int calculateSerializeBufferSize() const;
///fills the dataBuffer and returns the struct name (and 0 on failure)
virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
};
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
struct btGearConstraintFloatData
{
btTypedConstraintFloatData m_typeConstraintData;
btVector3FloatData m_axisInA;
btVector3FloatData m_axisInB;
float m_ratio;
char m_padding[4];
};
struct btGearConstraintDoubleData
{
btTypedConstraintDoubleData m_typeConstraintData;
btVector3DoubleData m_axisInA;
btVector3DoubleData m_axisInB;
double m_ratio;
};
SIMD_FORCE_INLINE int btGearConstraint::calculateSerializeBufferSize() const
{
return sizeof(btGearConstraintData);
}
///fills the dataBuffer and returns the struct name (and 0 on failure)
SIMD_FORCE_INLINE const char* btGearConstraint::serialize(void* dataBuffer, btSerializer* serializer) const
{
btGearConstraintData* gear = (btGearConstraintData*)dataBuffer;
btTypedConstraint::serialize(&gear->m_typeConstraintData,serializer);
m_axisInA.serialize( gear->m_axisInA );
m_axisInB.serialize( gear->m_axisInB );
gear->m_ratio = m_ratio;
return btGearConstraintDataName;
}
#endif //BT_GEAR_CONSTRAINT_H

File diff suppressed because it is too large Load Diff