2 * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com
4 * This software is provided 'as-is', without any express or implied
5 * warranty. In no event will the authors be held liable for any damages
6 * 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
9 * freely, subject to the following restrictions:
10 * 1. The origin of this software must not be misrepresented; you must not
11 * claim that you wrote the original software. If you use this software
12 * in a product, an acknowledgment in the product documentation would be
13 * appreciated but is not required.
14 * 2. Altered source versions must be plainly marked as such, and must not be
15 * misrepresented as being the original software.
16 * 3. This notice may not be removed or altered from any source distribution.
22 #include "../../Common/b2Math.h"
27 class b2BlockAllocator;
56 void Set(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2);
57 float32 Compute(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2);
60 /// A joint edge is used to connect bodies and joints together
61 /// in a joint graph where each body is a node and each joint
62 /// is an edge. A joint edge belongs to a doubly linked list
63 /// maintained in each attached body. Each joint has two joint
64 /// nodes, one for each attached body.
67 b2Body* other; ///< provides quick access to the other body attached.
68 b2Joint* joint; ///< the joint
69 b2JointEdge* prev; ///< the previous joint edge in the body's joint list
70 b2JointEdge* next; ///< the next joint edge in the body's joint list
73 /// Joint definitions are used to construct joints.
78 type = e_unknownJoint;
82 collideConnected = false;
85 /// The joint type is set automatically for concrete joint types.
88 /// Use this to attach application specific data to your joints.
91 /// The first attached body.
94 /// The second attached body.
97 /// Set this flag to true if the attached bodies should collide.
98 bool collideConnected;
101 /// The base joint class. Joints are used to constraint two bodies together in
102 /// various fashions. Some joints also feature limits and motors.
107 /// Get the type of the concrete joint.
108 b2JointType GetType() const;
110 /// Get the first body attached to this joint.
113 /// Get the second body attached to this joint.
116 /// Get the anchor point on body1 in world coordinates.
117 virtual b2Vec2 GetAnchor1() const = 0;
119 /// Get the anchor point on body2 in world coordinates.
120 virtual b2Vec2 GetAnchor2() const = 0;
122 /// Get the reaction force on body2 at the joint anchor.
123 virtual b2Vec2 GetReactionForce() const = 0;
125 /// Get the reaction torque on body2.
126 virtual float32 GetReactionTorque() const = 0;
128 /// Get the next joint the world joint list.
131 /// Get the user data pointer.
134 /// Set the user data pointer.
135 void SetUserData(void* data);
137 //--------------- Internals Below -------------------
139 friend class b2World;
141 friend class b2Island;
143 static b2Joint* Create(const b2JointDef* def, b2BlockAllocator* allocator);
144 static void Destroy(b2Joint* joint, b2BlockAllocator* allocator);
146 b2Joint(const b2JointDef* def);
147 virtual ~b2Joint() {}
149 virtual void InitVelocityConstraints(const b2TimeStep& step) = 0;
150 virtual void SolveVelocityConstraints(const b2TimeStep& step) = 0;
152 // This returns true if the position errors are within tolerance.
153 virtual void InitPositionConstraints() {}
154 virtual bool SolvePositionConstraints() = 0;
167 bool m_collideConnected;
172 inline void b2Jacobian::SetZero()
174 linear1.SetZero(); angular1 = 0.0f;
175 linear2.SetZero(); angular2 = 0.0f;
178 inline void b2Jacobian::Set(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2)
180 linear1 = x1; angular1 = a1;
181 linear2 = x2; angular2 = a2;
184 inline float32 b2Jacobian::Compute(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2)
186 return b2Dot(linear1, x1) + angular1 * a1 + b2Dot(linear2, x2) + angular2 * a2;
189 inline b2JointType b2Joint::GetType() const
194 inline b2Body* b2Joint::GetBody1()
199 inline b2Body* b2Joint::GetBody2()
204 inline b2Joint* b2Joint::GetNext()
209 inline void* b2Joint::GetUserData()
214 inline void b2Joint::SetUserData(void* data)