Add linear impulse example
[qml-box2d:ankrats-qml-box2d.git] / box2dbody.h
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 #ifndef BOX2DBODY_H
22 #define BOX2DBODY_H
23
24 #include <QDeclarativeItem>
25
26 class Box2DFixture;
27 class Box2DWorld;
28
29 class b2Body;
30 class b2World;
31
32 /**
33  * The Box2D body, build up from a list of shapes.
34  */
35 class Box2DBody : public QDeclarativeItem
36 {
37     Q_OBJECT
38
39     Q_ENUMS(BodyType)
40     Q_PROPERTY(qreal linearDamping READ linearDamping WRITE setLinearDamping NOTIFY linearDampingChanged)
41     Q_PROPERTY(qreal angularDamping READ angularDamping WRITE setAngularDamping NOTIFY angularDampingChanged)
42     Q_PROPERTY(BodyType bodyType READ bodyType WRITE setBodyType NOTIFY bodyTypeChanged)
43     Q_PROPERTY(bool bullet READ isBullet WRITE setBullet NOTIFY bulletChanged)
44     Q_PROPERTY(bool sleepingAllowed READ sleepingAllowed WRITE setSleepingAllowed NOTIFY sleepingAllowedChanged)
45     Q_PROPERTY(bool fixedRotation READ fixedRotation WRITE setFixedRotation NOTIFY fixedRotationChanged)
46     Q_PROPERTY(bool active READ active WRITE setActive)
47     Q_PROPERTY(QPointF linearVelocity READ linearVelocity WRITE setLinearVelocity NOTIFY linearVelocityChanged)
48     Q_PROPERTY(QDeclarativeListProperty<Box2DFixture> fixtures READ fixtures)
49
50 public:
51     enum BodyType {
52         Static,
53         Kinematic,
54         Dynamic
55     };
56
57     explicit Box2DBody(QDeclarativeItem *parent = 0);
58     ~Box2DBody();
59
60     qreal linearDamping() const { return mLinearDamping; }
61     void setLinearDamping(qreal linearDamping);
62
63     qreal angularDamping() const { return mAngularDamping; }
64     void setAngularDamping(qreal angularDamping);
65
66     BodyType bodyType() const { return mBodyType; }
67     void setBodyType(BodyType bodyType);
68
69     bool isBullet() const { return mBullet; }
70     void setBullet(bool bullet);
71
72     bool sleepingAllowed() const { return mSleepingAllowed; }
73     void setSleepingAllowed(bool allowed);
74
75     bool fixedRotation() const { return mFixedRotation; }
76     void setFixedRotation(bool fixedRotation);
77
78     bool active() const { return mActive; }
79     void setActive(bool active);
80
81     QPointF linearVelocity() const { return mLinearVelocity; }
82     void setLinearVelocity(const QPointF &linearVelocity);
83
84     QDeclarativeListProperty<Box2DFixture> fixtures();
85
86     void initialize(b2World *world);
87     void synchronize();
88     void cleanup(b2World *world);
89
90     Q_INVOKABLE void applyLinearImpulse(const QPointF &impulse,
91                                         const QPointF &point);
92     Q_INVOKABLE QPointF getWorldCenter() const;
93
94     void componentComplete();
95
96 protected:
97     void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
98
99 signals:
100     void linearDampingChanged();
101     void angularDampingChanged();
102     void bodyTypeChanged();
103     void bulletChanged();
104     void sleepingAllowedChanged();
105     void fixedRotationChanged();
106     void linearVelocityChanged();
107
108 private slots:
109     void onRotationChanged();
110
111 private:
112     static void append_fixture(QDeclarativeListProperty<Box2DFixture> *list,
113                                Box2DFixture *fixture);
114
115     b2Body *mBody;
116     b2World *mWorld;
117     qreal mLinearDamping;
118     qreal mAngularDamping;
119     BodyType mBodyType;
120     bool mBullet;
121     bool mSleepingAllowed;
122     bool mFixedRotation;
123     bool mActive;
124     QPointF mLinearVelocity;
125     bool mSynchronizing;
126     bool mInitializePending;
127     QList<Box2DFixture*> mFixtures;
128 };
129
130 #endif // BOX2DBODY_H