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 #ifndef BT_SOLVER_BODY_H
17 #define BT_SOLVER_BODY_H
18 
19 class	btRigidBody;
20 #include "LinearMath/btVector3.h"
21 #include "LinearMath/btMatrix3x3.h"
22 #include "BulletDynamics/Dynamics/btRigidBody.h"
23 #include "LinearMath/btAlignedAllocator.h"
24 #include "LinearMath/btTransformUtil.h"
25 
26 ///Until we get other contributions, only use SIMD on Windows, when using Visual Studio 2008 or later, and not double precision
27 #ifdef BT_USE_SSE
28 #define USE_SIMD 1
29 #endif //
30 
31 
32 #ifdef USE_SIMD
33 
34 struct	btSimdScalar
35 {
btSimdScalarbtSimdScalar36 	SIMD_FORCE_INLINE	btSimdScalar()
37 	{
38 
39 	}
40 
btSimdScalarbtSimdScalar41 	SIMD_FORCE_INLINE	btSimdScalar(float	fl)
42 	:m_vec128 (_mm_set1_ps(fl))
43 	{
44 	}
45 
btSimdScalarbtSimdScalar46 	SIMD_FORCE_INLINE	btSimdScalar(__m128 v128)
47 		:m_vec128(v128)
48 	{
49 	}
50 	union
51 	{
52 		__m128		m_vec128;
53 		float		m_floats[4];
54 		int			m_ints[4];
55 		btScalar	m_unusedPadding;
56 	};
get128btSimdScalar57 	SIMD_FORCE_INLINE	__m128	get128()
58 	{
59 		return m_vec128;
60 	}
61 
get128btSimdScalar62 	SIMD_FORCE_INLINE	const __m128	get128() const
63 	{
64 		return m_vec128;
65 	}
66 
set128btSimdScalar67 	SIMD_FORCE_INLINE	void	set128(__m128 v128)
68 	{
69 		m_vec128 = v128;
70 	}
71 
__m128btSimdScalar72 	SIMD_FORCE_INLINE	operator       __m128()
73 	{
74 		return m_vec128;
75 	}
__m128btSimdScalar76 	SIMD_FORCE_INLINE	operator const __m128() const
77 	{
78 		return m_vec128;
79 	}
80 
81 	SIMD_FORCE_INLINE	operator float() const
82 	{
83 		return m_floats[0];
84 	}
85 
86 };
87 
88 ///@brief Return the elementwise product of two btSimdScalar
89 SIMD_FORCE_INLINE btSimdScalar
90 operator*(const btSimdScalar& v1, const btSimdScalar& v2)
91 {
92 	return btSimdScalar(_mm_mul_ps(v1.get128(),v2.get128()));
93 }
94 
95 ///@brief Return the elementwise product of two btSimdScalar
96 SIMD_FORCE_INLINE btSimdScalar
97 operator+(const btSimdScalar& v1, const btSimdScalar& v2)
98 {
99 	return btSimdScalar(_mm_add_ps(v1.get128(),v2.get128()));
100 }
101 
102 
103 #else
104 #define btSimdScalar btScalar
105 #endif
106 
107 ///The btSolverBody is an internal datastructure for the constraint solver. Only necessary data is packed to increase cache coherence/performance.
ATTRIBUTE_ALIGNED64(struct)108 ATTRIBUTE_ALIGNED64 (struct)	btSolverBodyObsolete
109 {
110 	BT_DECLARE_ALIGNED_ALLOCATOR();
111 	btVector3		m_deltaLinearVelocity;
112 	btVector3		m_deltaAngularVelocity;
113 	btVector3		m_angularFactor;
114 	btVector3		m_invMass;
115 	btRigidBody*	m_originalBody;
116 	btVector3		m_pushVelocity;
117 	btVector3		m_turnVelocity;
118 
119 
120 	SIMD_FORCE_INLINE void	getVelocityInLocalPointObsolete(const btVector3& rel_pos, btVector3& velocity ) const
121 	{
122 		if (m_originalBody)
123 			velocity = m_originalBody->getLinearVelocity()+m_deltaLinearVelocity + (m_originalBody->getAngularVelocity()+m_deltaAngularVelocity).cross(rel_pos);
124 		else
125 			velocity.setValue(0,0,0);
126 	}
127 
128 	SIMD_FORCE_INLINE void	getAngularVelocity(btVector3& angVel) const
129 	{
130 		if (m_originalBody)
131 			angVel = m_originalBody->getAngularVelocity()+m_deltaAngularVelocity;
132 		else
133 			angVel.setValue(0,0,0);
134 	}
135 
136 
137 	//Optimization for the iterative solver: avoid calculating constant terms involving inertia, normal, relative position
138 	SIMD_FORCE_INLINE void applyImpulse(const btVector3& linearComponent, const btVector3& angularComponent,const btScalar impulseMagnitude)
139 	{
140 		//if (m_invMass)
141 		{
142 			m_deltaLinearVelocity += linearComponent*impulseMagnitude;
143 			m_deltaAngularVelocity += angularComponent*(impulseMagnitude*m_angularFactor);
144 		}
145 	}
146 
147 	SIMD_FORCE_INLINE void internalApplyPushImpulse(const btVector3& linearComponent, const btVector3& angularComponent,btScalar impulseMagnitude)
148 	{
149 		if (m_originalBody)
150 		{
151 			m_pushVelocity += linearComponent*impulseMagnitude;
152 			m_turnVelocity += angularComponent*(impulseMagnitude*m_angularFactor);
153 		}
154 	}
155 
156 	void	writebackVelocity()
157 	{
158 		if (m_originalBody)
159 		{
160 			m_originalBody->setLinearVelocity(m_originalBody->getLinearVelocity()+ m_deltaLinearVelocity);
161 			m_originalBody->setAngularVelocity(m_originalBody->getAngularVelocity()+m_deltaAngularVelocity);
162 
163 			//m_originalBody->setCompanionId(-1);
164 		}
165 	}
166 
167 
168 	void	writebackVelocity(btScalar timeStep)
169 	{
170         (void) timeStep;
171 		if (m_originalBody)
172 		{
173 			m_originalBody->setLinearVelocity(m_originalBody->getLinearVelocity()+ m_deltaLinearVelocity);
174 			m_originalBody->setAngularVelocity(m_originalBody->getAngularVelocity()+m_deltaAngularVelocity);
175 
176 			//correct the position/orientation based on push/turn recovery
177 			btTransform newTransform;
178 			btTransformUtil::integrateTransform(m_originalBody->getWorldTransform(),m_pushVelocity,m_turnVelocity,timeStep,newTransform);
179 			m_originalBody->setWorldTransform(newTransform);
180 
181 			//m_originalBody->setCompanionId(-1);
182 		}
183 	}
184 
185 
186 
187 };
188 
189 #endif //BT_SOLVER_BODY_H
190 
191 
192