Blender  V3.3
btTypedConstraint.cpp
Go to the documentation of this file.
1 /*
2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
4 
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:
10 
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.
14 */
15 
16 #include "btTypedConstraint.h"
19 
20 #define DEFAULT_DEBUGDRAW_SIZE btScalar(0.05f)
21 
24  m_userConstraintType(-1),
27  m_isEnabled(true),
28  m_needsFeedback(false),
30  m_rbA(rbA),
35 {
36 }
37 
40  m_userConstraintType(-1),
43  m_isEnabled(true),
44  m_needsFeedback(false),
46  m_rbA(rbA),
47  m_rbB(rbB),
51 {
52 }
53 
55 {
56  if (lowLim > uppLim)
57  {
58  return btScalar(1.0f);
59  }
60  else if (lowLim == uppLim)
61  {
62  return btScalar(0.0f);
63  }
64  btScalar lim_fact = btScalar(1.0f);
65  btScalar delta_max = vel / timeFact;
66  if (delta_max < btScalar(0.0f))
67  {
68  if ((pos >= lowLim) && (pos < (lowLim - delta_max)))
69  {
70  lim_fact = (lowLim - pos) / delta_max;
71  }
72  else if (pos < lowLim)
73  {
74  lim_fact = btScalar(0.0f);
75  }
76  else
77  {
78  lim_fact = btScalar(1.0f);
79  }
80  }
81  else if (delta_max > btScalar(0.0f))
82  {
83  if ((pos <= uppLim) && (pos > (uppLim - delta_max)))
84  {
85  lim_fact = (uppLim - pos) / delta_max;
86  }
87  else if (pos > uppLim)
88  {
89  lim_fact = btScalar(0.0f);
90  }
91  else
92  {
93  lim_fact = btScalar(1.0f);
94  }
95  }
96  else
97  {
98  lim_fact = btScalar(0.0f);
99  }
100  return lim_fact;
101 }
102 
104 const char* btTypedConstraint::serialize(void* dataBuffer, btSerializer* serializer) const
105 {
107 
108  tcd->m_rbA = (btRigidBodyData*)serializer->getUniquePointer(&m_rbA);
109  tcd->m_rbB = (btRigidBodyData*)serializer->getUniquePointer(&m_rbB);
110  char* name = (char*)serializer->findNameForPointer(this);
111  tcd->m_name = (char*)serializer->getUniquePointer(name);
112  if (tcd->m_name)
113  {
114  serializer->serializeName(name);
115  }
116 
117  tcd->m_objectType = m_objectType;
118  tcd->m_needsFeedback = m_needsFeedback;
119  tcd->m_overrideNumSolverIterations = m_overrideNumSolverIterations;
120  tcd->m_breakingImpulseThreshold = m_breakingImpulseThreshold;
121  tcd->m_isEnabled = m_isEnabled ? 1 : 0;
122 
123  tcd->m_userConstraintId = m_userConstraintId;
124  tcd->m_userConstraintType = m_userConstraintType;
125 
126  tcd->m_appliedImpulse = m_appliedImpulse;
127  tcd->m_dbgDrawSize = m_dbgDrawSize;
128 
129  tcd->m_disableCollisionsBetweenLinkedBodies = false;
130 
131  int i;
132  for (i = 0; i < m_rbA.getNumConstraintRefs(); i++)
133  if (m_rbA.getConstraintRef(i) == this)
134  tcd->m_disableCollisionsBetweenLinkedBodies = true;
135  for (i = 0; i < m_rbB.getNumConstraintRefs(); i++)
136  if (m_rbB.getConstraintRef(i) == this)
137  tcd->m_disableCollisionsBetweenLinkedBodies = true;
138 
140 }
141 
143 {
144  static btRigidBody s_fixed(0, 0, 0);
145  s_fixed.setMassProps(btScalar(0.), btVector3(btScalar(0.), btScalar(0.), btScalar(0.)));
146  return s_fixed;
147 }
148 
149 void btAngularLimit::set(btScalar low, btScalar high, btScalar _softness, btScalar _biasFactor, btScalar _relaxationFactor)
150 {
151  m_halfRange = (high - low) / 2.0f;
152  m_center = btNormalizeAngle(low + m_halfRange);
153  m_softness = _softness;
154  m_biasFactor = _biasFactor;
155  m_relaxationFactor = _relaxationFactor;
156 }
157 
159 {
160  m_correction = 0.0f;
161  m_sign = 0.0f;
162  m_solveLimit = false;
163 
164  if (m_halfRange >= 0.0f)
165  {
166  btScalar deviation = btNormalizeAngle(angle - m_center);
167  if (deviation < -m_halfRange)
168  {
169  m_solveLimit = true;
170  m_correction = -(deviation + m_halfRange);
171  m_sign = +1.0f;
172  }
173  else if (deviation > m_halfRange)
174  {
175  m_solveLimit = true;
176  m_correction = m_halfRange - deviation;
177  m_sign = -1.0f;
178  }
179  }
180 }
181 
183 {
184  return m_correction * m_sign;
185 }
186 
188 {
189  if (m_halfRange > 0.0f)
190  {
191  btScalar relativeAngle = btNormalizeAngle(angle - m_center);
192  if (!btEqual(relativeAngle, m_halfRange))
193  {
194  if (relativeAngle > 0.0f)
195  {
196  angle = getHigh();
197  }
198  else
199  {
200  angle = getLow();
201  }
202  }
203  }
204 }
205 
207 {
208  return btNormalizeAngle(m_center - m_halfRange);
209 }
210 
212 {
213  return btNormalizeAngle(m_center + m_halfRange);
214 }
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
__forceinline ssef low(const avxf &a)
Definition: avxf.h:264
__forceinline ssef high(const avxf &a)
Definition: avxf.h:268
btFixedConstraint btRigidBody & rbB
virtual bool serialize(void *o_alignedDataBuffer, unsigned i_dataBufferSize, bool i_swapEndian) const
Data buffer MUST be 16 byte aligned.
#define btRigidBodyData
Definition: btRigidBody.h:35
SIMD_FORCE_INLINE bool btEqual(btScalar a, btScalar eps)
Definition: btScalar.h:574
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition: btScalar.h:314
SIMD_FORCE_INLINE btScalar btNormalizeAngle(btScalar angleInRadians)
Definition: btScalar.h:781
#define SIMD_INFINITY
Definition: btScalar.h:544
btSimdScalar m_appliedImpulse
int m_overrideNumSolverIterations
#define DEFAULT_DEBUGDRAW_SIZE
btScalar m_breakingImpulseThreshold
int m_userConstraintId
btScalar m_dbgDrawSize
#define btTypedConstraintData2
btScalar getMotorFactor(btScalar pos, btScalar lowLim, btScalar uppLim, btScalar vel, btScalar timeFact)
internal method used by the constraint solver, don't use them directly
bool m_isEnabled
void * m_userConstraintPtr
btRigidBody & m_rbA
#define btTypedConstraintDataName
bool m_needsFeedback
btTypedConstraint(btTypedConstraintType type, btRigidBody &rbA)
btRigidBody & m_rbB
static btRigidBody & getFixedBody()
btJointFeedback * m_jointFeedback
btTypedConstraintType
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
Definition: btVector3.h:356
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
Definition: btVector3.h:82
btScalar getLow() const
btScalar getHigh() const
btScalar getError() const
Returns correction value multiplied by sign value.
void test(const btScalar angle)
void set(btScalar low, btScalar high, btScalar _softness=0.9f, btScalar _biasFactor=0.3f, btScalar _relaxationFactor=1.0f)
void fit(btScalar &angle) const
int getNumConstraintRefs() const
Definition: btRigidBody.h:598
btTypedConstraint * getConstraintRef(int index)
Definition: btRigidBody.h:593
virtual const char * findNameForPointer(const void *ptr) const =0
virtual void serializeName(const char *ptr)=0
virtual void * getUniquePointer(void *oldPtr)=0
SyclQueue void void size_t num_bytes void
uint pos
rudimentary class to provide type info
Definition: btScalar.h:800