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 btGeneric6DofSpringConstraintDoubleData2;
|
||||||
class btSliderConstraintData;
|
class btSliderConstraintData;
|
||||||
class btSliderConstraintDoubleData;
|
class btSliderConstraintDoubleData;
|
||||||
|
class btGearConstraintFloatData;
|
||||||
|
class btGearConstraintDoubleData;
|
||||||
class btContactSolverInfoDoubleData;
|
class btContactSolverInfoDoubleData;
|
||||||
class btContactSolverInfoFloatData;
|
class btContactSolverInfoFloatData;
|
||||||
class SoftBodyMaterialData;
|
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
|
class btContactSolverInfoDoubleData
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -927,7 +927,25 @@ void btWorldImporter::convertConstraintFloat(btTypedConstraintFloatData* constra
|
|||||||
constraint = slider;
|
constraint = slider;
|
||||||
break;
|
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:
|
default:
|
||||||
{
|
{
|
||||||
printf("unknown constraint type\n");
|
printf("unknown constraint type\n");
|
||||||
@@ -1149,7 +1167,25 @@ void btWorldImporter::convertConstraintDouble(btTypedConstraintDoubleData* const
|
|||||||
constraint = slider;
|
constraint = slider;
|
||||||
break;
|
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:
|
default:
|
||||||
{
|
{
|
||||||
printf("unknown constraint type\n");
|
printf("unknown constraint type\n");
|
||||||
@@ -1690,6 +1726,12 @@ btSliderConstraint* btWorldImporter::createSliderConstraint(btRigidBody& rbB, co
|
|||||||
return slider;
|
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
|
// query for data
|
||||||
int btWorldImporter::getNumCollisionShapes() const
|
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);
|
btRigidBody* body = createRigidBody(isDynamic,mass,startTransform,shape,colObjData->m_collisionObjectData.m_name);
|
||||||
body->setFriction(colObjData->m_collisionObjectData.m_friction);
|
body->setFriction(colObjData->m_collisionObjectData.m_friction);
|
||||||
body->setRestitution(colObjData->m_collisionObjectData.m_restitution);
|
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
|
#ifdef USE_INTERNAL_EDGE_UTILITY
|
||||||
if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
|
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);
|
btRigidBody* body = createRigidBody(isDynamic,mass,startTransform,shape,colObjData->m_collisionObjectData.m_name);
|
||||||
body->setFriction(btScalar(colObjData->m_collisionObjectData.m_friction));
|
body->setFriction(btScalar(colObjData->m_collisionObjectData.m_friction));
|
||||||
body->setRestitution(btScalar(colObjData->m_collisionObjectData.m_restitution));
|
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
|
#ifdef USE_INTERNAL_EDGE_UTILITY
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ class btConeTwistConstraint;
|
|||||||
class btGeneric6DofConstraint;
|
class btGeneric6DofConstraint;
|
||||||
class btGeneric6DofSpringConstraint;
|
class btGeneric6DofSpringConstraint;
|
||||||
class btSliderConstraint;
|
class btSliderConstraint;
|
||||||
|
class btGearConstraint;
|
||||||
struct btContactSolverInfo;
|
struct btContactSolverInfo;
|
||||||
struct btTypedConstraintData;
|
struct btTypedConstraintData;
|
||||||
struct btTypedConstraintFloatData;
|
struct btTypedConstraintFloatData;
|
||||||
@@ -200,6 +201,8 @@ public:
|
|||||||
virtual btGeneric6DofSpringConstraint* createGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
|
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& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
|
||||||
virtual btSliderConstraint* createSliderConstraint(btRigidBody& rbB, 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/btGeneric6DofConstraint.h"
|
||||||
#include "BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h"
|
#include "BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h"
|
||||||
#include "BulletDynamics/ConstraintSolver/btSliderConstraint.h"
|
#include "BulletDynamics/ConstraintSolver/btSliderConstraint.h"
|
||||||
|
#include "BulletDynamics/ConstraintSolver/btGearConstraint.h"
|
||||||
#include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h"
|
#include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h"
|
||||||
#include "BulletDynamics/Dynamics/btDynamicsWorld.h"
|
#include "BulletDynamics/Dynamics/btDynamicsWorld.h"
|
||||||
|
|
||||||
@@ -192,6 +193,7 @@ char *includefiles[] = {
|
|||||||
"../../../src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h",
|
"../../../src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h",
|
||||||
"../../../src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h",
|
"../../../src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h",
|
||||||
"../../../src/BulletDynamics/ConstraintSolver/btSliderConstraint.h",
|
"../../../src/BulletDynamics/ConstraintSolver/btSliderConstraint.h",
|
||||||
|
"../../../src/BulletDynamics/ConstraintSolver/btGearConstraint.h",
|
||||||
"../../../src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h",
|
"../../../src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h",
|
||||||
"../../../src/BulletSoftBody/btSoftBodyData.h",
|
"../../../src/BulletSoftBody/btSoftBodyData.h",
|
||||||
// empty string to indicate end of includefiles
|
// empty string to indicate end of includefiles
|
||||||
|
|||||||
@@ -19,6 +19,18 @@ subject to the following restrictions:
|
|||||||
#define BT_GEAR_CONSTRAINT_H
|
#define BT_GEAR_CONSTRAINT_H
|
||||||
|
|
||||||
#include "BulletDynamics/ConstraintSolver/btTypedConstraint.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.
|
///The btGeatConstraint will couple the angular velocity for two bodies around given local axis and ratio.
|
||||||
///See Bullet/Demos/ConstraintDemo for an example use.
|
///See Bullet/Demos/ConstraintDemo for an example use.
|
||||||
class btGearConstraint : public btTypedConstraint
|
class btGearConstraint : public btTypedConstraint
|
||||||
@@ -82,6 +94,59 @@ public:
|
|||||||
return 0.f;
|
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
|
#endif //BT_GEAR_CONSTRAINT_H
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user