Skip to content

Commit

Permalink
Added wrapper for FrictionJoint
Browse files Browse the repository at this point in the history
  • Loading branch information
folibis committed Jan 17, 2014
1 parent e03a395 commit a517291
Show file tree
Hide file tree
Showing 5 changed files with 246 additions and 5 deletions.
8 changes: 5 additions & 3 deletions box2d-static.pri
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ SOURCES += $$PWD/box2dplugin.cpp \
$$PWD/box2ddestructionlistener.cpp \
$$PWD/box2dmotorjoint.cpp \
$$PWD/box2dweldjoint.cpp \
$$PWD/box2dpulleyjoint.cpp
$$PWD/box2dpulleyjoint.cpp \
$$PWD/box2dfrictionjoint.cpp \



Expand All @@ -46,6 +47,7 @@ HEADERS += \
$$PWD/box2dprismaticjoint.h \
$$PWD/box2ddestructionlistener.h \
$$PWD/box2dmotorjoint.h \
$$PWD/box2dweldjoint.h \
$$PWD/box2dpulleyjoint.h
$$PWD/box2dweldjoint.h \
$$PWD/box2dpulleyjoint.h \
$$PWD/box2dfrictionjoint.h \

6 changes: 4 additions & 2 deletions box2d.pro
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ SOURCES += box2dplugin.cpp \
box2ddestructionlistener.cpp \
box2dmotorjoint.cpp \
box2dweldjoint.cpp \
box2dpulleyjoint.cpp
box2dpulleyjoint.cpp \
box2dfrictionjoint.cpp \

HEADERS += \
box2dplugin.h \
Expand All @@ -49,4 +50,5 @@ HEADERS += \
box2ddestructionlistener.h \
box2dmotorjoint.h \
box2dweldjoint.h \
box2dpulleyjoint.h
box2dpulleyjoint.h \
box2dfrictionjoint.h
154 changes: 154 additions & 0 deletions box2dfrictionjoint.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
/*
* box2dprismaticjoint.cpp
* Copyright (c) 2011 Joonas Erkinheimo <joonas.erkinheimo@nokia.com>
*
* This file is part of the Box2D QML plugin.
*
* 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.
*/

#include "box2dfrictionjoint.h"

#include "box2dworld.h"
#include "box2dbody.h"

Box2DFrictionJoint::Box2DFrictionJoint(QObject *parent) :
Box2DJoint(parent),
mFrictionJointDef(),
mFrictionJoint(0),
anchorsAuto(true)
{
}

Box2DFrictionJoint::~Box2DFrictionJoint()
{
cleanup(world());
}

float Box2DFrictionJoint::maxForce() const
{
if(mFrictionJoint) return mFrictionJoint->GetMaxForce();
return mFrictionJointDef.maxForce;
}

void Box2DFrictionJoint::setMaxForce(float maxForce)
{
if(mFrictionJoint && mFrictionJoint->GetMaxForce() == maxForce) return;
if(mFrictionJoint) mFrictionJoint->SetMaxForce(maxForce);
else mFrictionJointDef.maxForce = maxForce;
emit maxForceChanged();
}

float Box2DFrictionJoint::maxTorque() const
{
if(mFrictionJoint) return mFrictionJoint->GetMaxTorque();
return mFrictionJointDef.maxTorque;
}

void Box2DFrictionJoint::setMaxTorque(float maxTorque)
{
if(mFrictionJoint && mFrictionJoint->GetMaxTorque() == maxTorque) return;
if(mFrictionJoint) mFrictionJoint->SetMaxForce(maxTorque);
else mFrictionJointDef.maxTorque = maxTorque;
emit maxTorqueChanged();
}

QPointF Box2DFrictionJoint::localAnchorA() const
{
if(mFrictionJoint) QPointF(mFrictionJoint->GetAnchorA().x * scaleRatio,
-mFrictionJoint->GetAnchorA().y * scaleRatio);
return QPointF(mFrictionJointDef.localAnchorA.x * scaleRatio,
mFrictionJointDef.localAnchorA.y * scaleRatio);
}

void Box2DFrictionJoint::setLocalAnchorA(const QPointF &localAnchorA)
{
mFrictionJointDef.localAnchorA = b2Vec2(localAnchorA.x() / scaleRatio
,-localAnchorA.y() / scaleRatio);
anchorsAuto = true;
emit localAnchorAChanged();
}

QPointF Box2DFrictionJoint::localAnchorB() const
{
if(mFrictionJoint) QPointF(mFrictionJoint->GetAnchorB().x * scaleRatio,
-mFrictionJoint->GetAnchorB().y * scaleRatio);
return QPointF(mFrictionJointDef.localAnchorB.x * scaleRatio,
mFrictionJointDef.localAnchorB.y * scaleRatio);
}

void Box2DFrictionJoint::setLocalAnchorB(const QPointF &localAnchorB)
{
mFrictionJointDef.localAnchorB = b2Vec2(localAnchorB.x() / scaleRatio,
-localAnchorB.y() / scaleRatio);
anchorsAuto = true;
emit localAnchorBChanged();
}

void Box2DFrictionJoint::nullifyJoint()
{
mFrictionJoint = 0;
}

void Box2DFrictionJoint::createJoint()
{
if(anchorsAuto)
{
mFrictionJointDef.bodyA = bodyA()->body();
mFrictionJointDef.bodyB = bodyB()->body();
}
else
mFrictionJointDef.Initialize(bodyA()->body(),
bodyB()->body(),
bodyA()->body()->GetWorldCenter());
mFrictionJointDef.collideConnected = collideConnected();
mFrictionJoint = static_cast<b2FrictionJoint *>(world()->CreateJoint(&mFrictionJointDef));
mFrictionJoint->SetUserData(this);
mInitializePending = false;
}

void Box2DFrictionJoint::cleanup(b2World *world)
{
if(!world) {
qWarning() << "FrictionJoint: There is no world connected";
return;
}
if (mFrictionJoint && bodyA() && bodyB()) {
mFrictionJoint->SetUserData(0);
world->DestroyJoint(mFrictionJoint);
mFrictionJoint = 0;
}
}

QPointF Box2DFrictionJoint::GetReactionForce(float32 inv_dt) const
{
if(mFrictionJoint)
{
b2Vec2 point = mFrictionJoint->GetReactionForce(inv_dt);
return QPointF(point.x * scaleRatio,point.y * scaleRatio);
}
return QPointF();
}

float Box2DFrictionJoint::GetReactionTorque(float32 inv_dt) const
{
if(mFrictionJoint) return mFrictionJoint->GetReactionTorque(inv_dt);
return 0.0f;
}

81 changes: 81 additions & 0 deletions box2dfrictionjoint.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*
* box2dprismaticjoint.h
* Copyright (c) 2011 Joonas Erkinheimo <joonas.erkinheimo@nokia.com>
*
* This file is part of the Box2D QML plugin.
*
* 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 BOX2FRICTIONJOINT_H
#define BOX2FRICTIONJOINT_H

#include "box2djoint.h"
#include <Box2D.h>

class b2World;
class b2FrictionJoint;
class b2FrictionJointDef;

class Box2DFrictionJoint : public Box2DJoint
{
Q_OBJECT
Q_PROPERTY(float maxForce READ maxForce WRITE setMaxForce NOTIFY maxForceChanged)
Q_PROPERTY(float maxTorque READ maxTorque WRITE setMaxTorque NOTIFY maxTorqueChanged)
Q_PROPERTY(QPointF localAnchorA READ localAnchorA WRITE setLocalAnchorA NOTIFY localAnchorAChanged)
Q_PROPERTY(QPointF localAnchorB READ localAnchorB WRITE setLocalAnchorB NOTIFY localAnchorBChanged)

public:
explicit Box2DFrictionJoint(QObject *parent = 0);
~Box2DFrictionJoint();

float maxForce() const;
void setMaxForce(float maxForce);

float maxTorque() const;
void setMaxTorque(float maxTorque);

QPointF localAnchorA() const;
void setLocalAnchorA(const QPointF &localAnchorA);

QPointF localAnchorB() const;
void setLocalAnchorB(const QPointF &localAnchorB);

void nullifyJoint();
void createJoint();
void cleanup(b2World *world);

Q_INVOKABLE QPointF GetReactionForce(float32 inv_dt) const;
Q_INVOKABLE float GetReactionTorque(float32 inv_dt) const;

signals:
void maxForceChanged();
void maxTorqueChanged();
void localAnchorAChanged();
void localAnchorBChanged();

private:
b2FrictionJointDef mFrictionJointDef;
b2FrictionJoint * mFrictionJoint;
bool anchorsAuto;
};



#endif // BOX2FRICTIONJOINT_H
2 changes: 2 additions & 0 deletions box2dplugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include "box2dmotorjoint.h"
#include "box2dweldjoint.h"
#include "box2dpulleyjoint.h"
#include "box2dfrictionjoint.h"

Box2DPlugin::Box2DPlugin(QObject *parent) :
QQmlExtensionPlugin(parent)
Expand Down Expand Up @@ -66,4 +67,5 @@ void Box2DPlugin::registerTypes(const char *uri)
qmlRegisterType<Box2DMotorJoint>(uri, 1, 0, "MotorJoint");
qmlRegisterType<Box2DWeldJoint>(uri, 1, 0, "WeldJoint");
qmlRegisterType<Box2DPulleyJoint>(uri, 1, 0, "PulleyJoint");
qmlRegisterType<Box2DFrictionJoint>(uri, 1, 0, "FrictionJoint");
}

0 comments on commit a517291

Please sign in to comment.