Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef BT_POINT2POINTCONSTRAINT_H
00017 #define BT_POINT2POINTCONSTRAINT_H
00018
00019 #include "LinearMath/btVector3.h"
00020 #include "btJacobianEntry.h"
00021 #include "btTypedConstraint.h"
00022
00023 class btRigidBody;
00024
00025
00026 #ifdef BT_USE_DOUBLE_PRECISION
00027 #define btPoint2PointConstraintData btPoint2PointConstraintDoubleData
00028 #define btPoint2PointConstraintDataName "btPoint2PointConstraintDoubleData"
00029 #else
00030 #define btPoint2PointConstraintData btPoint2PointConstraintFloatData
00031 #define btPoint2PointConstraintDataName "btPoint2PointConstraintFloatData"
00032 #endif //BT_USE_DOUBLE_PRECISION
00033
00034 struct btConstraintSetting
00035 {
00036 btConstraintSetting() :
00037 m_tau(btScalar(0.3)),
00038 m_damping(btScalar(1.)),
00039 m_impulseClamp(btScalar(0.))
00040 {
00041 }
00042 btScalar m_tau;
00043 btScalar m_damping;
00044 btScalar m_impulseClamp;
00045 };
00046
00047 enum btPoint2PointFlags
00048 {
00049 BT_P2P_FLAGS_ERP = 1,
00050 BT_P2P_FLAGS_CFM = 2
00051 };
00052
00054 ATTRIBUTE_ALIGNED16(class) btPoint2PointConstraint : public btTypedConstraint
00055 {
00056 #ifdef IN_PARALLELL_SOLVER
00057 public:
00058 #endif
00059 btJacobianEntry m_jac[3];
00060
00061 btVector3 m_pivotInA;
00062 btVector3 m_pivotInB;
00063
00064 int m_flags;
00065 btScalar m_erp;
00066 btScalar m_cfm;
00067
00068 public:
00069
00071 bool m_useSolveConstraintObsolete;
00072
00073 btConstraintSetting m_setting;
00074
00075 btPoint2PointConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB);
00076
00077 btPoint2PointConstraint(btRigidBody& rbA,const btVector3& pivotInA);
00078
00079
00080 virtual void buildJacobian();
00081
00082 virtual void getInfo1 (btConstraintInfo1* info);
00083
00084 void getInfo1NonVirtual (btConstraintInfo1* info);
00085
00086 virtual void getInfo2 (btConstraintInfo2* info);
00087
00088 void getInfo2NonVirtual (btConstraintInfo2* info, const btTransform& body0_trans, const btTransform& body1_trans);
00089
00090 void updateRHS(btScalar timeStep);
00091
00092 void setPivotA(const btVector3& pivotA)
00093 {
00094 m_pivotInA = pivotA;
00095 }
00096
00097 void setPivotB(const btVector3& pivotB)
00098 {
00099 m_pivotInB = pivotB;
00100 }
00101
00102 const btVector3& getPivotInA() const
00103 {
00104 return m_pivotInA;
00105 }
00106
00107 const btVector3& getPivotInB() const
00108 {
00109 return m_pivotInB;
00110 }
00111
00114 virtual void setParam(int num, btScalar value, int axis = -1);
00116 virtual btScalar getParam(int num, int axis = -1) const;
00117
00118 virtual int calculateSerializeBufferSize() const;
00119
00121 virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
00122
00123
00124 };
00125
00127 struct btPoint2PointConstraintFloatData
00128 {
00129 btTypedConstraintData m_typeConstraintData;
00130 btVector3FloatData m_pivotInA;
00131 btVector3FloatData m_pivotInB;
00132 };
00133
00135 struct btPoint2PointConstraintDoubleData
00136 {
00137 btTypedConstraintData m_typeConstraintData;
00138 btVector3DoubleData m_pivotInA;
00139 btVector3DoubleData m_pivotInB;
00140 };
00141
00142
00143 SIMD_FORCE_INLINE int btPoint2PointConstraint::calculateSerializeBufferSize() const
00144 {
00145 return sizeof(btPoint2PointConstraintData);
00146
00147 }
00148
00150 SIMD_FORCE_INLINE const char* btPoint2PointConstraint::serialize(void* dataBuffer, btSerializer* serializer) const
00151 {
00152 btPoint2PointConstraintData* p2pData = (btPoint2PointConstraintData*)dataBuffer;
00153
00154 btTypedConstraint::serialize(&p2pData->m_typeConstraintData,serializer);
00155 m_pivotInA.serialize(p2pData->m_pivotInA);
00156 m_pivotInB.serialize(p2pData->m_pivotInB);
00157
00158 return btPoint2PointConstraintDataName;
00159 }
00160
00161 #endif //BT_POINT2POINTCONSTRAINT_H