Updated examples to work with 1.1
[qml-box2d:qml-box2d-folibis.git] / box2dbody.h
1 /*
2  * box2dbody.h
3  * Copyright (c) 2010-2011 Thorbjørn Lindeijer <thorbjorn@lindeijer.nl>
4  * Copyright (c) 2011 Daker Fernandes Pinheiro <daker.pinheiro@openbossa.org>
5  * Copyright (c) 2011 Tan Miaoqing <miaoqing.tan@nokia.com>
6  * Copyright (c) 2011 Antonio Aloisio <antonio.aloisio@nokia.com>
7  * Copyright (c) 2011 Joonas Erkinheimo <joonas.erkinheimo@nokia.com>
8  * Copyright (c) 2011 Antti Krats <antti.krats@digia.com>
9  *
10  * This file is part of the Box2D QML plugin.
11  *
12  * This software is provided 'as-is', without any express or implied warranty.
13  * In no event will the authors be held liable for any damages arising from
14  * the use of this software.
15  *
16  * Permission is granted to anyone to use this software for any purpose,
17  * including commercial applications, and to alter it and redistribute it
18  * freely, subject to the following restrictions:
19  *
20  * 1. The origin of this software must not be misrepresented; you must not
21  *    claim that you wrote the original software. If you use this software in
22  *    a product, an acknowledgment in the product documentation would be
23  *    appreciated but is not required.
24  *
25  * 2. Altered source versions must be plainly marked as such, and must not be
26  *    misrepresented as being the original software.
27  *
28  * 3. This notice may not be removed or altered from any source distribution.
29  */
30
31 #ifndef BOX2DBODY_H
32 #define BOX2DBODY_H
33
34 #include <QQuickItem>
35 #include <Box2D.h>
36
37 class Box2DFixture;
38 class Box2DWorld;
39
40 class b2Body;
41 class b2BodyDef;
42 class b2World;
43
44 /**
45  * The Box2D body, build up from a list of shapes.
46  */
47 class Box2DBody : public QQuickItem
48 {
49     Q_OBJECT
50
51     Q_ENUMS(BodyType)
52     Q_PROPERTY(qreal linearDamping READ linearDamping WRITE setLinearDamping NOTIFY linearDampingChanged)
53     Q_PROPERTY(qreal angularDamping READ angularDamping WRITE setAngularDamping NOTIFY angularDampingChanged)
54     Q_PROPERTY(BodyType bodyType READ bodyType WRITE setBodyType NOTIFY bodyTypeChanged)
55     Q_PROPERTY(bool bullet READ isBullet WRITE setBullet NOTIFY bulletChanged)
56     Q_PROPERTY(bool sleepingAllowed READ sleepingAllowed WRITE setSleepingAllowed NOTIFY sleepingAllowedChanged)
57     Q_PROPERTY(bool fixedRotation READ fixedRotation WRITE setFixedRotation NOTIFY fixedRotationChanged)
58     Q_PROPERTY(bool active READ active WRITE setActive)
59     Q_PROPERTY(bool awake READ awake WRITE setAwake)
60     Q_PROPERTY(QPointF linearVelocity READ linearVelocity WRITE setLinearVelocity NOTIFY linearVelocityChanged)
61     Q_PROPERTY(QQmlListProperty<Box2DFixture> fixtures READ fixtures)
62     Q_PROPERTY(qreal gravityScale READ gravityScale WRITE setGravityScale NOTIFY gravityScaleChanged)
63
64 public:
65     enum BodyType {
66         Static = 0,
67         Kinematic,
68         Dynamic
69     };
70
71     explicit Box2DBody(QQuickItem *parent = 0);
72     ~Box2DBody();
73
74     qreal linearDamping() const;
75     void setLinearDamping(qreal _linearDamping);
76
77     qreal angularDamping() const;
78     void setAngularDamping(qreal _angularDamping);
79
80     BodyType bodyType() const;
81     void setBodyType(BodyType _bodyType);
82
83     bool isBullet() const;
84     void setBullet(bool _bullet);
85
86     bool sleepingAllowed() const;
87     void setSleepingAllowed(bool allowed);
88
89     bool fixedRotation() const;
90     void setFixedRotation(bool _fixedRotation);
91
92     bool active() const;
93     void setActive(bool _active);
94
95     bool awake() const;
96     void setAwake(bool _awake);
97
98     QPointF linearVelocity() const;
99     void setLinearVelocity(const QPointF &_linearVelocity);
100
101     qreal gravityScale() const;
102     void setGravityScale(qreal _gravityScale);
103
104     QQmlListProperty<Box2DFixture> fixtures();
105
106     void initialize(b2World *world);
107     void synchronize();
108     void cleanup(b2World *world);
109
110     Q_INVOKABLE void applyForce(const QPointF &force,const QPointF &point);
111     Q_INVOKABLE void applyTorque(qreal torque);
112     Q_INVOKABLE void applyLinearImpulse(const QPointF &impulse, const QPointF &point);
113     Q_INVOKABLE QPointF getWorldCenter() const;
114     Q_INVOKABLE float getMass() const;
115     Q_INVOKABLE float GetInertia() const;
116     Q_INVOKABLE QPointF GetLinearVelocityFromWorldPoint(const QPointF &point);
117     Q_INVOKABLE QPointF GetLinearVelocityFromLocalPoint (const QPointF &point);
118
119     void componentComplete();
120     b2Body *body() const;
121
122 protected:
123     void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
124 signals:
125     void linearDampingChanged();
126     void angularDampingChanged();
127     void bodyTypeChanged();
128     void bulletChanged();
129     void sleepingAllowedChanged();
130     void fixedRotationChanged();
131     void linearVelocityChanged();
132     void bodyCreated();
133     void gravityScaleChanged();
134
135 private slots:
136     void onRotationChanged();
137
138 private:
139     b2Body *mBody;
140     b2World *mWorld;
141     b2BodyDef mBodyDef;
142     bool mSynchronizing;
143     bool mInitializePending;
144     QList<Box2DFixture*> mFixtures;
145
146     static void append_fixture(QQmlListProperty<Box2DFixture> *list,
147                                Box2DFixture *fixture);
148     static int count_fixture(QQmlListProperty<Box2DFixture> *list);
149     static Box2DFixture * at_fixture(QQmlListProperty<Box2DFixture> *list,int index);
150     qreal mGravityScale;
151
152 };
153
154 #endif // BOX2DBODY_H