mirror of https://github.com/axmolengine/axmol.git
125 lines
3.5 KiB
C
125 lines
3.5 KiB
C
|
// MIT License
|
||
|
|
||
|
// Copyright (c) 2019 Erin Catto
|
||
|
|
||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
|
// of this software and associated documentation files (the "Software"), to deal
|
||
|
// in the Software without restriction, including without limitation the rights
|
||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
|
// copies of the Software, and to permit persons to whom the Software is
|
||
|
// furnished to do so, subject to the following conditions:
|
||
|
|
||
|
// The above copyright notice and this permission notice shall be included in all
|
||
|
// copies or substantial portions of the Software.
|
||
|
|
||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||
|
// SOFTWARE.
|
||
|
|
||
|
#ifndef B2_FRICTION_JOINT_H
|
||
|
#define B2_FRICTION_JOINT_H
|
||
|
|
||
|
#include "b2_api.h"
|
||
|
#include "b2_joint.h"
|
||
|
|
||
|
/// Friction joint definition.
|
||
|
struct B2_API b2FrictionJointDef : public b2JointDef
|
||
|
{
|
||
|
b2FrictionJointDef()
|
||
|
{
|
||
|
type = e_frictionJoint;
|
||
|
localAnchorA.SetZero();
|
||
|
localAnchorB.SetZero();
|
||
|
maxForce = 0.0f;
|
||
|
maxTorque = 0.0f;
|
||
|
}
|
||
|
|
||
|
/// Initialize the bodies, anchors, axis, and reference angle using the world
|
||
|
/// anchor and world axis.
|
||
|
void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor);
|
||
|
|
||
|
/// The local anchor point relative to bodyA's origin.
|
||
|
b2Vec2 localAnchorA;
|
||
|
|
||
|
/// The local anchor point relative to bodyB's origin.
|
||
|
b2Vec2 localAnchorB;
|
||
|
|
||
|
/// The maximum friction force in N.
|
||
|
float maxForce;
|
||
|
|
||
|
/// The maximum friction torque in N-m.
|
||
|
float maxTorque;
|
||
|
};
|
||
|
|
||
|
/// Friction joint. This is used for top-down friction.
|
||
|
/// It provides 2D translational friction and angular friction.
|
||
|
class B2_API b2FrictionJoint : public b2Joint
|
||
|
{
|
||
|
public:
|
||
|
b2Vec2 GetAnchorA() const override;
|
||
|
b2Vec2 GetAnchorB() const override;
|
||
|
|
||
|
b2Vec2 GetReactionForce(float inv_dt) const override;
|
||
|
float GetReactionTorque(float inv_dt) const override;
|
||
|
|
||
|
/// The local anchor point relative to bodyA's origin.
|
||
|
const b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }
|
||
|
|
||
|
/// The local anchor point relative to bodyB's origin.
|
||
|
const b2Vec2& GetLocalAnchorB() const { return m_localAnchorB; }
|
||
|
|
||
|
/// Set the maximum friction force in N.
|
||
|
void SetMaxForce(float force);
|
||
|
|
||
|
/// Get the maximum friction force in N.
|
||
|
float GetMaxForce() const;
|
||
|
|
||
|
/// Set the maximum friction torque in N*m.
|
||
|
void SetMaxTorque(float torque);
|
||
|
|
||
|
/// Get the maximum friction torque in N*m.
|
||
|
float GetMaxTorque() const;
|
||
|
|
||
|
/// Dump joint to dmLog
|
||
|
void Dump() override;
|
||
|
|
||
|
protected:
|
||
|
|
||
|
friend class b2Joint;
|
||
|
|
||
|
b2FrictionJoint(const b2FrictionJointDef* def);
|
||
|
|
||
|
void InitVelocityConstraints(const b2SolverData& data) override;
|
||
|
void SolveVelocityConstraints(const b2SolverData& data) override;
|
||
|
bool SolvePositionConstraints(const b2SolverData& data) override;
|
||
|
|
||
|
b2Vec2 m_localAnchorA;
|
||
|
b2Vec2 m_localAnchorB;
|
||
|
|
||
|
// Solver shared
|
||
|
b2Vec2 m_linearImpulse;
|
||
|
float m_angularImpulse;
|
||
|
float m_maxForce;
|
||
|
float m_maxTorque;
|
||
|
|
||
|
// Solver temp
|
||
|
int32 m_indexA;
|
||
|
int32 m_indexB;
|
||
|
b2Vec2 m_rA;
|
||
|
b2Vec2 m_rB;
|
||
|
b2Vec2 m_localCenterA;
|
||
|
b2Vec2 m_localCenterB;
|
||
|
float m_invMassA;
|
||
|
float m_invMassB;
|
||
|
float m_invIA;
|
||
|
float m_invIB;
|
||
|
b2Mat22 m_linearMass;
|
||
|
float m_angularMass;
|
||
|
};
|
||
|
|
||
|
#endif
|