From 1550e96826c7d9a08abb881262259b90772685c2 Mon Sep 17 00:00:00 2001 From: Ruslan Date: Wed, 1 Jan 2014 19:50:44 +1100 Subject: [PATCH] Fixed RevoluteJoint (added localAnchorB, angular units changed to use degree) --- box2dfixture.cpp | 1 + box2dmotorjoint.cpp | 14 +++++---- box2dplugin.cpp | 2 ++ box2drevolutejoint.cpp | 66 +++++++++++++++++++++--------------------- box2drevolutejoint.h | 7 +++-- 5 files changed, 49 insertions(+), 41 deletions(-) diff --git a/box2dfixture.cpp b/box2dfixture.cpp index d6d3e527..b94f7c30 100644 --- a/box2dfixture.cpp +++ b/box2dfixture.cpp @@ -187,6 +187,7 @@ b2Shape *Box2DBox::createShape() int32 count = 4; b2PolygonShape *shape = new b2PolygonShape; + //shape->SetAsBox(width()/ scaleRatio,height()/ scaleRatio ); shape->Set(vertices, count); return shape; } diff --git a/box2dmotorjoint.cpp b/box2dmotorjoint.cpp index 31091cc6..62c46780 100644 --- a/box2dmotorjoint.cpp +++ b/box2dmotorjoint.cpp @@ -43,14 +43,14 @@ Box2DMotorJoint::~Box2DMotorJoint() QPointF Box2DMotorJoint::linearOffset() const { - return QPointF(mMotorJointDef.linearOffset.x,mMotorJointDef.linearOffset.y); + return QPointF(mMotorJointDef.linearOffset.x * scaleRatio,mMotorJointDef.linearOffset.y * scaleRatio); } void Box2DMotorJoint::setLinearOffset(const QPointF &linearOffset) { if(this->linearOffset() == linearOffset) return; - mMotorJointDef.linearOffset = b2Vec2(linearOffset.x(),linearOffset.y()); + mMotorJointDef.linearOffset = b2Vec2(linearOffset.x() / scaleRatio,-linearOffset.y() / scaleRatio); if(mMotorJoint) mMotorJoint->SetLinearOffset(mMotorJointDef.linearOffset); emit linearOffsetChanged(); @@ -58,16 +58,17 @@ void Box2DMotorJoint::setLinearOffset(const QPointF &linearOffset) float Box2DMotorJoint::angularOffset() const { - return mMotorJointDef.angularOffset; + return mMotorJointDef.angularOffset * 180 / b2_pi; } void Box2DMotorJoint::setAngularOffset(const float angularOffset) { - if(mMotorJointDef.angularOffset == angularOffset) + float angularOffsetRad = angularOffset * ( b2_pi / 180); + if(mMotorJointDef.angularOffset == angularOffsetRad) return; - mMotorJointDef.angularOffset = angularOffset; + mMotorJointDef.angularOffset = angularOffsetRad; if(mMotorJoint) - mMotorJoint->SetAngularOffset(angularOffset); + mMotorJoint->SetAngularOffset(angularOffsetRad); emit angularOffsetChanged(); } @@ -123,6 +124,7 @@ void Box2DMotorJoint::nullifyJoint() void Box2DMotorJoint::createJoint() { + mMotorJointDef.Initialize(bodyA()->body(),bodyB()->body()); mMotorJointDef.collideConnected = collideConnected(); mMotorJoint = static_cast( diff --git a/box2dplugin.cpp b/box2dplugin.cpp index e804199c..afe8e7fa 100644 --- a/box2dplugin.cpp +++ b/box2dplugin.cpp @@ -35,6 +35,7 @@ #include "box2ddistancejoint.h" #include "box2dprismaticjoint.h" #include "box2drevolutejoint.h" +#include "box2dmotorjoint.h" Box2DPlugin::Box2DPlugin(QObject *parent) : QQmlExtensionPlugin(parent) @@ -58,4 +59,5 @@ void Box2DPlugin::registerTypes(const char *uri) qmlRegisterType(uri, 1, 0, "DistanceJoint"); qmlRegisterType(uri, 1, 0, "PrismaticJoint"); qmlRegisterType(uri, 1, 0, "RevoluteJoint"); + qmlRegisterType(uri, 1, 0, "MotorJoint"); } diff --git a/box2drevolutejoint.cpp b/box2drevolutejoint.cpp index f09fab36..501e28d4 100644 --- a/box2drevolutejoint.cpp +++ b/box2drevolutejoint.cpp @@ -32,8 +32,7 @@ Box2DRevoluteJoint::Box2DRevoluteJoint(QObject *parent) : Box2DJoint(parent), mRevoluteJointDef(), - mRevoluteJoint(0), - mOverrideLocalAnchorA(false) + mRevoluteJoint(0) { } @@ -44,35 +43,36 @@ Box2DRevoluteJoint::~Box2DRevoluteJoint() float Box2DRevoluteJoint::lowerAngle() const { - return mRevoluteJointDef.lowerAngle; + return mRevoluteJointDef.lowerAngle * 180 / b2_pi; } void Box2DRevoluteJoint::setLowerAngle(float lowerAngle) { - if (mRevoluteJointDef.lowerAngle == lowerAngle * b2_pi) + float lowerAngleRad = lowerAngle * b2_pi / 180; + if (mRevoluteJointDef.lowerAngle == lowerAngleRad) return; - mRevoluteJointDef.lowerAngle = lowerAngle * b2_pi; + mRevoluteJointDef.lowerAngle = lowerAngleRad; if (mRevoluteJoint) - mRevoluteJoint->SetLimits(lowerAngle * b2_pi, - mRevoluteJointDef.upperAngle); + mRevoluteJoint->SetLimits(lowerAngleRad,mRevoluteJointDef.upperAngle); emit lowerAngleChanged(); } float Box2DRevoluteJoint::upperAngle() const { - return mRevoluteJointDef.upperAngle; + return mRevoluteJointDef.upperAngle * 180 / b2_pi; } void Box2DRevoluteJoint::setUpperAngle(float upperAngle) { - if (mRevoluteJointDef.upperAngle == upperAngle * b2_pi) + float upperAngleRad = upperAngle * b2_pi / 180; + if (mRevoluteJointDef.upperAngle == upperAngleRad) return; - mRevoluteJointDef.upperAngle = upperAngle * b2_pi; + mRevoluteJointDef.upperAngle = upperAngleRad; if (mRevoluteJoint) mRevoluteJoint->SetLimits(mRevoluteJointDef.lowerAngle, - upperAngle * b2_pi); + upperAngleRad); emit upperAngleChanged(); } @@ -94,17 +94,18 @@ void Box2DRevoluteJoint::setMaxMotorTorque(float maxMotorTorque) float Box2DRevoluteJoint::motorSpeed() const { - return mRevoluteJointDef.motorSpeed; + return mRevoluteJointDef.motorSpeed * b2_pi / 180; } void Box2DRevoluteJoint::setMotorSpeed(float motorSpeed) { - if (mRevoluteJointDef.motorSpeed == motorSpeed) + float motorSpeedRad = motorSpeed * b2_pi / 180; + if (mRevoluteJointDef.motorSpeed == motorSpeedRad) return; - mRevoluteJointDef.motorSpeed = motorSpeed; + mRevoluteJointDef.motorSpeed = motorSpeedRad; if (mRevoluteJoint) - mRevoluteJoint->SetMotorSpeed(motorSpeed); + mRevoluteJoint->SetMotorSpeed(motorSpeedRad); emit motorSpeedChanged(); } @@ -142,24 +143,28 @@ void Box2DRevoluteJoint::setEnableMotor(bool enableMotor) QPointF Box2DRevoluteJoint::localAnchorA() const { - if (mOverrideLocalAnchorA) - return mLocalAnchorA; - else - return QPointF(mRevoluteJointDef.localAnchorA.x * scaleRatio, - -mRevoluteJointDef.localAnchorA.y * scaleRatio); + return QPointF(mRevoluteJointDef.localAnchorA.x * scaleRatio, mRevoluteJointDef.localAnchorA.y * scaleRatio); } -void Box2DRevoluteJoint::setLocalAnchorA(const QPointF &localAnchorA) +QPointF Box2DRevoluteJoint::localAnchorB() const { - if (mOverrideLocalAnchorA && mLocalAnchorA == localAnchorA) - return; + return QPointF(mRevoluteJointDef.localAnchorB.x * scaleRatio, mRevoluteJointDef.localAnchorB.y * scaleRatio); +} - mOverrideLocalAnchorA = true; - mLocalAnchorA = localAnchorA; +void Box2DRevoluteJoint::setLocalAnchorA(const QPointF &localAnchorA) +{ + mRevoluteJointDef.localAnchorA = b2Vec2(localAnchorA.x() / scaleRatio,-localAnchorA.y() / scaleRatio); emit localAnchorAChanged(); } +void Box2DRevoluteJoint::setLocalAnchorB(const QPointF &localAnchorB) +{ + + mRevoluteJointDef.localAnchorB = b2Vec2(localAnchorB.x() / scaleRatio,-localAnchorB.y() / scaleRatio); + emit localAnchorBChanged(); +} + void Box2DRevoluteJoint::nullifyJoint() { mRevoluteJoint = 0; @@ -167,14 +172,9 @@ void Box2DRevoluteJoint::nullifyJoint() void Box2DRevoluteJoint::createJoint() { - b2Vec2 anchor = mOverrideLocalAnchorA ? - b2Vec2(mLocalAnchorA.x() / scaleRatio, - -mLocalAnchorA.y() / scaleRatio) + - bodyA()->body()->GetPosition() : - bodyA()->body()->GetWorldCenter(); - - mRevoluteJointDef.Initialize(bodyA()->body(), bodyB()->body(), - anchor); + mRevoluteJointDef.bodyA = bodyA()->body(); + mRevoluteJointDef.bodyB = bodyB()->body(); + mRevoluteJointDef.referenceAngle = 0; mRevoluteJointDef.collideConnected = collideConnected(); mRevoluteJoint = static_cast( diff --git a/box2drevolutejoint.h b/box2drevolutejoint.h index 31f7377e..c120d9cf 100644 --- a/box2drevolutejoint.h +++ b/box2drevolutejoint.h @@ -45,6 +45,7 @@ class Box2DRevoluteJoint : public Box2DJoint Q_PROPERTY(bool enableLimit READ enableLimit WRITE setEnableLimit NOTIFY enableLimitChanged) Q_PROPERTY(bool enableMotor READ enableMotor WRITE setEnableMotor NOTIFY enableMotorChanged) Q_PROPERTY(QPointF localAnchorA READ localAnchorA WRITE setLocalAnchorA NOTIFY localAnchorAChanged) + Q_PROPERTY(QPointF localAnchorB READ localAnchorB WRITE setLocalAnchorB NOTIFY localAnchorBChanged) public: explicit Box2DRevoluteJoint(QObject *parent = 0); @@ -71,6 +72,9 @@ class Box2DRevoluteJoint : public Box2DJoint QPointF localAnchorA() const; void setLocalAnchorA(const QPointF &localAnchorA); + QPointF localAnchorB() const; + void setLocalAnchorB(const QPointF &localAnchorB); + void nullifyJoint(); void createJoint(); void cleanup(b2World *world); @@ -83,12 +87,11 @@ class Box2DRevoluteJoint : public Box2DJoint void enableLimitChanged(); void enableMotorChanged(); void localAnchorAChanged(); + void localAnchorBChanged(); private: b2RevoluteJointDef mRevoluteJointDef; b2RevoluteJoint *mRevoluteJoint; - bool mOverrideLocalAnchorA; - QPointF mLocalAnchorA; }; #endif // BOX2DREVOLUTEJOINT_H