Made joints easier to create
[qml-box2d:anubhavtiwaris-qml-box2d.git] / box2dprismaticjoint.cpp
1 /*
2  * Box2D QML plugin
3  * Copyright (C) 2010 Nokia Corporation
4  *
5  * This file is part of the Box2D QML plugin.
6  *
7  * This library is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU Lesser General Public License as published by
9  * the Free Software Foundation; either version 2.1 of the License, or (at
10  * your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15  * License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this library;  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include "box2dprismaticjoint.h"
22
23 #include "box2dworld.h"
24 #include "box2dbody.h"
25
26 Box2DPrismaticJoint::Box2DPrismaticJoint(QDeclarativeItem *parent) :
27     Box2DJoint(parent),
28     mPrismaticJointDef(),
29     mPrismaticJoint(0)
30 {
31 }
32
33 float Box2DPrismaticJoint::lowerTranslation() const
34 {
35     return mPrismaticJointDef.lowerTranslation;
36 }
37
38 void Box2DPrismaticJoint::setLowerTranslation(float lowerTranslation)
39 {
40     if (mPrismaticJointDef.lowerTranslation == lowerTranslation)
41         return;
42
43     mPrismaticJointDef.lowerTranslation = lowerTranslation;
44     if (mPrismaticJoint)
45         mPrismaticJoint->SetLimits(lowerTranslation,
46                                    mPrismaticJointDef.upperTranslation);
47     emit lowerTranslationChanged();
48 }
49
50 float Box2DPrismaticJoint::upperTranslation() const
51 {
52     return mPrismaticJointDef.upperTranslation;
53 }
54
55 void Box2DPrismaticJoint::setUpperTranslation(float upperTranslation)
56 {
57     if (mPrismaticJointDef.upperTranslation == upperTranslation)
58         return;
59
60     mPrismaticJointDef.upperTranslation = upperTranslation;
61     if (mPrismaticJoint)
62         mPrismaticJoint->SetLimits(mPrismaticJointDef.lowerTranslation,
63                                    upperTranslation);
64     emit upperTranslationChanged();
65 }
66
67 float Box2DPrismaticJoint::maxMotorForce() const
68 {
69     return mPrismaticJointDef.maxMotorForce;
70 }
71
72 void Box2DPrismaticJoint::setMaxMotorForce(float maxMotorForce)
73 {
74     if (mPrismaticJointDef.maxMotorForce == maxMotorForce)
75         return;
76
77     mPrismaticJointDef.maxMotorForce = maxMotorForce;
78     if (mPrismaticJoint)
79         mPrismaticJoint->SetMaxMotorForce(maxMotorForce);
80     emit maxMotorForceChanged();
81 }
82
83 float Box2DPrismaticJoint::motorSpeed() const
84 {
85     return mPrismaticJointDef.motorSpeed;
86 }
87
88 void Box2DPrismaticJoint::setMotorSpeed(float motorSpeed)
89 {
90     if (mPrismaticJointDef.motorSpeed == motorSpeed)
91         return;
92
93     mPrismaticJointDef.motorSpeed = motorSpeed;
94     if (mPrismaticJoint)
95         mPrismaticJoint->SetMotorSpeed(motorSpeed);
96     emit motorSpeedChanged();
97 }
98
99 bool Box2DPrismaticJoint::enableLimit() const
100 {
101     return mPrismaticJointDef.enableLimit;
102 }
103
104 void Box2DPrismaticJoint::setEnableLimit(bool enableLimit)
105 {
106     if (mPrismaticJointDef.enableLimit == enableLimit)
107         return;
108
109     mPrismaticJointDef.enableLimit = enableLimit;
110     if (mPrismaticJoint)
111         mPrismaticJoint->EnableLimit(enableLimit);
112     emit enableLimitChanged();
113 }
114
115 bool Box2DPrismaticJoint::enableMotor() const
116 {
117     return mPrismaticJointDef.enableMotor;
118 }
119
120 void Box2DPrismaticJoint::setEnableMotor(bool enableMotor)
121 {
122     if (mPrismaticJointDef.enableMotor == enableMotor)
123         return;
124
125     mPrismaticJointDef.enableMotor = enableMotor;
126     if (mPrismaticJoint)
127         mPrismaticJoint->EnableMotor(enableMotor);
128     emit enableMotorChanged();
129 }
130
131 QPointF Box2DPrismaticJoint::axis() const
132 {
133     return QPointF(mPrismaticJointDef.localAxis1.x,
134                    -mPrismaticJointDef.localAxis1.y);
135 }
136
137 void Box2DPrismaticJoint::setAxis(const QPointF &axis)
138 {
139     if (mPrismaticJointDef.localAxis1 == b2Vec2(axis.x(), -axis.y()))
140         return;
141
142     mPrismaticJointDef.localAxis1 = b2Vec2(axis.x(), -axis.y());
143
144     emit axisChanged();
145 }
146
147 void Box2DPrismaticJoint::createJoint()
148 {
149     mPrismaticJointDef.Initialize(bodyA()->body(), bodyB()->body(),
150                                  bodyA()->body()->GetWorldCenter(),
151                                   mPrismaticJointDef.localAxis1);
152     mPrismaticJointDef.collideConnected = collideConnected();
153
154     mPrismaticJoint = static_cast<b2PrismaticJoint*>
155             (world()->CreateJoint(&mPrismaticJointDef));
156     mInitializePending = false;
157 }
158
159 void Box2DPrismaticJoint::cleanup(b2World *world)
160 {
161     world->DestroyJoint(mPrismaticJoint);
162     mPrismaticJoint = 0;
163 }