2
Bullet Continuous Collision Detection and Physics Library
3
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
5
This software is provided 'as-is', without any express or implied warranty.
6
In no event will the authors be held liable for any damages arising from the use of this software.
7
Permission is granted to anyone to use this software for any purpose,
8
including commercial applications, and to alter it and redistribute it freely,
9
subject to the following restrictions:
11
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.
12
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13
3. This notice may not be removed or altered from any source distribution.
17
#include "btTypedConstraint.h"
18
#include "BulletDynamics/Dynamics/btRigidBody.h"
19
#include "LinearMath/btSerializer.h"
22
#define DEFAULT_DEBUGDRAW_SIZE btScalar(0.3f)
24
btTypedConstraint::btTypedConstraint(btTypedConstraintType type, btRigidBody& rbA)
26
m_userConstraintType(-1),
27
m_userConstraintId(-1),
28
m_needsFeedback(false),
30
m_rbB(getFixedBody()),
31
m_appliedImpulse(btScalar(0.)),
32
m_dbgDrawSize(DEFAULT_DEBUGDRAW_SIZE),
33
m_breakingImpulseThreshold(SIMD_INFINITY),
39
btTypedConstraint::btTypedConstraint(btTypedConstraintType type, btRigidBody& rbA,btRigidBody& rbB)
41
m_userConstraintType(-1),
42
m_userConstraintId(-1),
43
m_needsFeedback(false),
46
m_appliedImpulse(btScalar(0.)),
47
m_dbgDrawSize(DEFAULT_DEBUGDRAW_SIZE),
48
m_breakingImpulseThreshold(SIMD_INFINITY),
56
btScalar btTypedConstraint::getMotorFactor(btScalar pos, btScalar lowLim, btScalar uppLim, btScalar vel, btScalar timeFact)
60
return btScalar(1.0f);
62
else if(lowLim == uppLim)
64
return btScalar(0.0f);
66
btScalar lim_fact = btScalar(1.0f);
67
btScalar delta_max = vel / timeFact;
68
if(delta_max < btScalar(0.0f))
70
if((pos >= lowLim) && (pos < (lowLim - delta_max)))
72
lim_fact = (lowLim - pos) / delta_max;
76
lim_fact = btScalar(0.0f);
80
lim_fact = btScalar(1.0f);
83
else if(delta_max > btScalar(0.0f))
85
if((pos <= uppLim) && (pos > (uppLim - delta_max)))
87
lim_fact = (uppLim - pos) / delta_max;
91
lim_fact = btScalar(0.0f);
95
lim_fact = btScalar(1.0f);
100
lim_fact = btScalar(0.0f);
105
///fills the dataBuffer and returns the struct name (and 0 on failure)
106
const char* btTypedConstraint::serialize(void* dataBuffer, btSerializer* serializer) const
108
btTypedConstraintData* tcd = (btTypedConstraintData*) dataBuffer;
110
tcd->m_rbA = (btRigidBodyData*)serializer->getUniquePointer(&m_rbA);
111
tcd->m_rbB = (btRigidBodyData*)serializer->getUniquePointer(&m_rbB);
112
char* name = (char*) serializer->findNameForPointer(this);
113
tcd->m_name = (char*)serializer->getUniquePointer(name);
116
serializer->serializeName(name);
119
tcd->m_objectType = m_objectType;
120
tcd->m_needsFeedback = m_needsFeedback;
121
tcd->m_userConstraintId =m_userConstraintId;
122
tcd->m_userConstraintType =m_userConstraintType;
124
tcd->m_appliedImpulse = float(m_appliedImpulse);
125
tcd->m_dbgDrawSize = float(m_dbgDrawSize );
127
tcd->m_disableCollisionsBetweenLinkedBodies = false;
130
for (i=0;i<m_rbA.getNumConstraintRefs();i++)
131
if (m_rbA.getConstraintRef(i) == this)
132
tcd->m_disableCollisionsBetweenLinkedBodies = true;
133
for (i=0;i<m_rbB.getNumConstraintRefs();i++)
134
if (m_rbB.getConstraintRef(i) == this)
135
tcd->m_disableCollisionsBetweenLinkedBodies = true;
137
return "btTypedConstraintData";
140
btRigidBody& btTypedConstraint::getFixedBody()
142
static btRigidBody s_fixed(0, 0,0);
143
s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.)));
148
void btAngularLimit::set(btScalar low, btScalar high, btScalar _softness, btScalar _biasFactor, btScalar _relaxationFactor)
150
m_halfRange = (high - low) / 2.0f;
151
m_center = btNormalizeAngle(low + m_halfRange);
152
m_softness = _softness;
153
m_biasFactor = _biasFactor;
154
m_relaxationFactor = _relaxationFactor;
157
void btAngularLimit::test(const btScalar angle)
161
m_solveLimit = false;
163
if (m_halfRange >= 0.0f)
165
btScalar deviation = btNormalizeAngle(angle - m_center);
166
if (deviation < -m_halfRange)
169
m_correction = - (deviation + m_halfRange);
172
else if (deviation > m_halfRange)
175
m_correction = m_halfRange - deviation;
182
btScalar btAngularLimit::getError() const
184
return m_correction * m_sign;
187
void btAngularLimit::fit(btScalar& angle) const
189
if (m_halfRange > 0.0f)
191
btScalar relativeAngle = btNormalizeAngle(angle - m_center);
192
if (!btEqual(relativeAngle, m_halfRange))
194
if (relativeAngle > 0.0f)
206
btScalar btAngularLimit::getLow() const
208
return btNormalizeAngle(m_center - m_halfRange);
211
btScalar btAngularLimit::getHigh() const
213
return btNormalizeAngle(m_center + m_halfRange);