Add linear impulse example
[qml-box2d:ankrats-qml-box2d.git] / box2dworld.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 BOX2DWORLD_H
22 #define BOX2DWORLD_H
23
24 #include <QDeclarativeItem>
25 #include <QList>
26
27 class Box2DBody;
28 class ContactListener;
29
30 class b2World;
31
32 // TODO: Maybe turn this into a property of the world, though it can't be
33 // changed dynamically.
34 static const float scaleRatio = 32.0f; // 32 pixels in one meter
35
36 /**
37  * Wrapper class around a Box2D world.
38  */
39 class Box2DWorld : public QDeclarativeItem
40 {
41     Q_OBJECT
42     Q_PROPERTY(float timeStep READ timeStep WRITE setTimeStep)
43     Q_PROPERTY(int velocityIterations READ velocityIterations WRITE setVelocityIterations)
44     Q_PROPERTY(int positionIterations READ positionIterations WRITE setPositionIterations)
45     Q_PROPERTY(int frameTime READ frameTime WRITE setFrameTime)
46     Q_PROPERTY(QPointF gravity READ gravity WRITE setGravity NOTIFY gravityChanged)
47
48 public:
49     explicit Box2DWorld(QDeclarativeItem *parent = 0);
50     ~Box2DWorld();
51
52     /**
53      * The amount of time to step through each frame in seconds.
54      * By default it is 1 / 60.
55      */
56     float timeStep() const { return mTimeStep; }
57     void setTimeStep(float timeStep) { mTimeStep = timeStep; }
58
59     /**
60      * The number of velocity iterations used to process one step.
61      * 10 by default.
62      */
63     int velocityIterations() const
64     { return mVelocityIterations; }
65
66     void setVelocityIterations(int iterations)
67     { mVelocityIterations = iterations; }
68
69     /**
70      * The number of position iterations used to process one step.
71      * 10 by default.
72      */
73     int positionIterations() const
74     { return mPositionIterations; }
75
76     void setPositionIterations(int iterations)
77     { mPositionIterations = iterations; }
78
79     /**
80      * The amount of time each frame takes in milliseconds.
81      * By default it is 1000 / 60.
82      */
83     int frameTime() const { return mFrameTime; }
84     void setFrameTime(int frameTime) { mFrameTime = frameTime; }
85
86     QPointF gravity() const { return mGravity; }
87     void setGravity(const QPointF &gravity);
88
89     void componentComplete();
90
91     void registerBody(Box2DBody *body);
92     void unregisterBody(Box2DBody *body);
93
94     b2World *world() const { return mWorld; }
95
96 signals:
97     void gravityChanged();
98     void stepped();
99
100 protected:
101     void timerEvent(QTimerEvent *);
102     QVariant itemChange(GraphicsItemChange, const QVariant &);
103
104 private:
105     b2World *mWorld;
106     ContactListener *mContactListener;
107     float mTimeStep;
108     int mVelocityIterations;
109     int mPositionIterations;
110     int mFrameTime;
111     QPointF mGravity;
112     int mTimerId;
113     QList<Box2DBody*> mBodies;
114 };
115
116 QML_DECLARE_TYPE(Box2DWorld)
117
118 #endif // BOX2DWORLD_H