227 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			227 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
| * Copyright (c) 2006-2007 Erin Catto http://www.box2d.org
 | |
| *
 | |
| * This software is provided 'as-is', without any express or implied
 | |
| * warranty.  In no event will the authors be held liable for any damages
 | |
| * arising from the use of this software.
 | |
| * Permission is granted to anyone to use this software for any purpose,
 | |
| * including commercial applications, and to alter it and redistribute it
 | |
| * freely, subject to the following restrictions:
 | |
| * 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.
 | |
| * 2. Altered source versions must be plainly marked as such, and must not be
 | |
| * misrepresented as being the original software.
 | |
| * 3. This notice may not be removed or altered from any source distribution.
 | |
| */
 | |
| 
 | |
| #ifndef B2_JOINT_H
 | |
| #define B2_JOINT_H
 | |
| 
 | |
| #include "Box2D/Common/b2Math.h"
 | |
| 
 | |
| class b2Body;
 | |
| class b2Joint;
 | |
| struct b2SolverData;
 | |
| class b2BlockAllocator;
 | |
| 
 | |
| enum b2JointType
 | |
| {
 | |
| 	e_unknownJoint,
 | |
| 	e_revoluteJoint,
 | |
| 	e_prismaticJoint,
 | |
| 	e_distanceJoint,
 | |
| 	e_pulleyJoint,
 | |
| 	e_mouseJoint,
 | |
| 	e_gearJoint,
 | |
| 	e_wheelJoint,
 | |
|     e_weldJoint,
 | |
| 	e_frictionJoint,
 | |
| 	e_ropeJoint,
 | |
| 	e_motorJoint
 | |
| };
 | |
| 
 | |
| enum b2LimitState
 | |
| {
 | |
| 	e_inactiveLimit,
 | |
| 	e_atLowerLimit,
 | |
| 	e_atUpperLimit,
 | |
| 	e_equalLimits
 | |
| };
 | |
| 
 | |
| struct b2Jacobian
 | |
| {
 | |
| 	b2Vec2 linear;
 | |
| 	float32 angularA;
 | |
| 	float32 angularB;
 | |
| };
 | |
| 
 | |
| /// A joint edge is used to connect bodies and joints together
 | |
| /// in a joint graph where each body is a node and each joint
 | |
| /// is an edge. A joint edge belongs to a doubly linked list
 | |
| /// maintained in each attached body. Each joint has two joint
 | |
| /// nodes, one for each attached body.
 | |
| struct b2JointEdge
 | |
| {
 | |
| 	b2Body* other;			///< provides quick access to the other body attached.
 | |
| 	b2Joint* joint;			///< the joint
 | |
| 	b2JointEdge* prev;		///< the previous joint edge in the body's joint list
 | |
| 	b2JointEdge* next;		///< the next joint edge in the body's joint list
 | |
| };
 | |
| 
 | |
| /// Joint definitions are used to construct joints.
 | |
| struct b2JointDef
 | |
| {
 | |
| 	b2JointDef()
 | |
| 	{
 | |
| 		type = e_unknownJoint;
 | |
| 		userData = nullptr;
 | |
| 		bodyA = nullptr;
 | |
| 		bodyB = nullptr;
 | |
| 		collideConnected = false;
 | |
| 	}
 | |
| 
 | |
| 	/// The joint type is set automatically for concrete joint types.
 | |
| 	b2JointType type;
 | |
| 
 | |
| 	/// Use this to attach application specific data to your joints.
 | |
| 	void* userData;
 | |
| 
 | |
| 	/// The first attached body.
 | |
| 	b2Body* bodyA;
 | |
| 
 | |
| 	/// The second attached body.
 | |
| 	b2Body* bodyB;
 | |
| 
 | |
| 	/// Set this flag to true if the attached bodies should collide.
 | |
| 	bool collideConnected;
 | |
| };
 | |
| 
 | |
| /// The base joint class. Joints are used to constraint two bodies together in
 | |
| /// various fashions. Some joints also feature limits and motors.
 | |
| class b2Joint
 | |
| {
 | |
| public:
 | |
| 
 | |
| 	/// Get the type of the concrete joint.
 | |
| 	b2JointType GetType() const;
 | |
| 
 | |
| 	/// Get the first body attached to this joint.
 | |
| 	b2Body* GetBodyA();
 | |
| 
 | |
| 	/// Get the second body attached to this joint.
 | |
| 	b2Body* GetBodyB();
 | |
| 
 | |
| 	/// Get the anchor point on bodyA in world coordinates.
 | |
| 	virtual b2Vec2 GetAnchorA() const = 0;
 | |
| 
 | |
| 	/// Get the anchor point on bodyB in world coordinates.
 | |
| 	virtual b2Vec2 GetAnchorB() const = 0;
 | |
| 
 | |
| 	/// Get the reaction force on bodyB at the joint anchor in Newtons.
 | |
| 	virtual b2Vec2 GetReactionForce(float32 inv_dt) const = 0;
 | |
| 
 | |
| 	/// Get the reaction torque on bodyB in N*m.
 | |
| 	virtual float32 GetReactionTorque(float32 inv_dt) const = 0;
 | |
| 
 | |
| 	/// Get the next joint the world joint list.
 | |
| 	b2Joint* GetNext();
 | |
| 	const b2Joint* GetNext() const;
 | |
| 
 | |
| 	/// Get the user data pointer.
 | |
| 	void* GetUserData() const;
 | |
| 
 | |
| 	/// Set the user data pointer.
 | |
| 	void SetUserData(void* data);
 | |
| 
 | |
| 	/// Short-cut function to determine if either body is inactive.
 | |
| 	bool IsActive() const;
 | |
| 
 | |
| 	/// Get collide connected.
 | |
| 	/// Note: modifying the collide connect flag won't work correctly because
 | |
| 	/// the flag is only checked when fixture AABBs begin to overlap.
 | |
| 	bool GetCollideConnected() const;
 | |
| 
 | |
| 	/// Dump this joint to the log file.
 | |
| 	virtual void Dump() { b2Log("// Dump is not supported for this joint type.\n"); }
 | |
| 
 | |
| 	/// Shift the origin for any points stored in world coordinates.
 | |
| 	virtual void ShiftOrigin(const b2Vec2& newOrigin) { B2_NOT_USED(newOrigin);  }
 | |
| 
 | |
| protected:
 | |
| 	friend class b2World;
 | |
| 	friend class b2Body;
 | |
| 	friend class b2Island;
 | |
| 	friend class b2GearJoint;
 | |
| 
 | |
| 	static b2Joint* Create(const b2JointDef* def, b2BlockAllocator* allocator);
 | |
| 	static void Destroy(b2Joint* joint, b2BlockAllocator* allocator);
 | |
| 
 | |
| 	b2Joint(const b2JointDef* def);
 | |
| 	virtual ~b2Joint() {}
 | |
| 
 | |
| 	virtual void InitVelocityConstraints(const b2SolverData& data) = 0;
 | |
| 	virtual void SolveVelocityConstraints(const b2SolverData& data) = 0;
 | |
| 
 | |
| 	// This returns true if the position errors are within tolerance.
 | |
| 	virtual bool SolvePositionConstraints(const b2SolverData& data) = 0;
 | |
| 
 | |
| 	b2JointType m_type;
 | |
| 	b2Joint* m_prev;
 | |
| 	b2Joint* m_next;
 | |
| 	b2JointEdge m_edgeA;
 | |
| 	b2JointEdge m_edgeB;
 | |
| 	b2Body* m_bodyA;
 | |
| 	b2Body* m_bodyB;
 | |
| 
 | |
| 	int32 m_index;
 | |
| 
 | |
| 	bool m_islandFlag;
 | |
| 	bool m_collideConnected;
 | |
| 
 | |
| 	void* m_userData;
 | |
| };
 | |
| 
 | |
| inline b2JointType b2Joint::GetType() const
 | |
| {
 | |
| 	return m_type;
 | |
| }
 | |
| 
 | |
| inline b2Body* b2Joint::GetBodyA()
 | |
| {
 | |
| 	return m_bodyA;
 | |
| }
 | |
| 
 | |
| inline b2Body* b2Joint::GetBodyB()
 | |
| {
 | |
| 	return m_bodyB;
 | |
| }
 | |
| 
 | |
| inline b2Joint* b2Joint::GetNext()
 | |
| {
 | |
| 	return m_next;
 | |
| }
 | |
| 
 | |
| inline const b2Joint* b2Joint::GetNext() const
 | |
| {
 | |
| 	return m_next;
 | |
| }
 | |
| 
 | |
| inline void* b2Joint::GetUserData() const
 | |
| {
 | |
| 	return m_userData;
 | |
| }
 | |
| 
 | |
| inline void b2Joint::SetUserData(void* data)
 | |
| {
 | |
| 	m_userData = data;
 | |
| }
 | |
| 
 | |
| inline bool b2Joint::GetCollideConnected() const
 | |
| {
 | |
| 	return m_collideConnected;
 | |
| }
 | |
| 
 | |
| #endif
 |