add serialization for btGearConstraint
support 'linearFactor' and 'angularFactor' for btRigidBody world importer
This commit is contained in:
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user