Fixed RevoluteJoint (adjusted linear units to pixels), added OnInitialized event...
[qml-box2d:qml-box2d-folibis.git] / box2dworld.h
1 /*
2  * box2dworld.h
3  * Copyright (c) 2010 Thorbjørn Lindeijer <thorbjorn@lindeijer.nl>
4  * Copyright (c) 2011 Joonas Erkinheimo <joonas.erkinheimo@nokia.com>
5  * Copyright (c) 2012 Adriano Rezende <atdrez@gmail.com>
6  *
7  * This file is part of the Box2D QML plugin.
8  *
9  * This software is provided 'as-is', without any express or implied warranty.
10  * In no event will the authors be held liable for any damages arising from
11  * the use of this software.
12  *
13  * Permission is granted to anyone to use this software for any purpose,
14  * including commercial applications, and to alter it and redistribute it
15  * freely, subject to the following restrictions:
16  *
17  * 1. The origin of this software must not be misrepresented; you must not
18  *    claim that you wrote the original software. If you use this software in
19  *    a product, an acknowledgment in the product documentation would be
20  *    appreciated but is not required.
21  *
22  * 2. Altered source versions must be plainly marked as such, and must not be
23  *    misrepresented as being the original software.
24  *
25  * 3. This notice may not be removed or altered from any source distribution.
26  */
27
28 #ifndef BOX2DWORLD_H
29 #define BOX2DWORLD_H
30
31 #include <QQuickItem>
32 #include <QList>
33 #include <QBasicTimer>
34
35 class Box2DBody;
36 class Box2DFixture;
37 class Box2DJoint;
38 class ContactListener;
39 class Box2DDestructionListener;
40
41 class b2World;
42
43 // TODO: Maybe turn this into a property of the world, though it can't be
44 // changed dynamically.
45 static const float scaleRatio = 32.0f; // 32 pixels in one meter
46
47 /**
48  * Wrapper class around a Box2D world.
49  */
50 class Box2DWorld : public QQuickItem
51 {
52     Q_OBJECT
53     Q_PROPERTY(bool running READ isRunning WRITE setRunning NOTIFY runningChanged)
54     Q_PROPERTY(float timeStep READ timeStep WRITE setTimeStep)
55     Q_PROPERTY(int velocityIterations READ velocityIterations WRITE setVelocityIterations)
56     Q_PROPERTY(int positionIterations READ positionIterations WRITE setPositionIterations)
57     Q_PROPERTY(int frameTime READ frameTime WRITE setFrameTime)
58     Q_PROPERTY(QPointF gravity READ gravity WRITE setGravity NOTIFY gravityChanged)
59
60 public:
61     explicit Box2DWorld(QQuickItem *parent = 0);
62     ~Box2DWorld();
63
64     /**
65      * The amount of time to step through each frame in seconds.
66      * By default it is 1 / 60.
67      */
68     float timeStep() const { return mTimeStep; }
69     void setTimeStep(float timeStep) { mTimeStep = timeStep; }
70
71     bool isRunning() const { return mIsRunning; }
72     void setRunning(bool running);
73
74     /**
75      * The number of velocity iterations used to process one step.
76      * 10 by default.
77      */
78     int velocityIterations() const
79     { return mVelocityIterations; }
80
81     void setVelocityIterations(int iterations)
82     { mVelocityIterations = iterations; }
83
84
85     /**
86      * The number of position iterations used to process one step.
87      * 10 by default.
88      */
89     int positionIterations() const
90     { return mPositionIterations; }
91
92     void setPositionIterations(int iterations)
93     { mPositionIterations = iterations; }
94
95     /**
96      * The amount of time each frame takes in milliseconds.
97      * By default it is 1000 / 60.
98      */
99     int frameTime() const { return mFrameTime; }
100     void setFrameTime(int frameTime) { mFrameTime = frameTime; }
101
102     QPointF gravity() const { return mGravity; }
103     void setGravity(const QPointF &gravity);
104
105     void componentComplete();
106
107     void registerBody(Box2DBody *body);
108
109     b2World *world() const { return mWorld; }
110
111 private slots:
112     void unregisterBody();
113     void fixtureDestroyed(Box2DFixture *fixture);
114
115 signals:
116     void gravityChanged();
117     void runningChanged();
118     void stepped();
119     void initialized();
120
121 protected:
122     void timerEvent(QTimerEvent *);
123     void itemChange(ItemChange, const ItemChangeData &);
124
125 private:
126     b2World *mWorld;
127     ContactListener *mContactListener;
128     Box2DDestructionListener *mDestructionListener;
129     float mTimeStep;
130     int mVelocityIterations;
131     int mPositionIterations;
132     int mFrameTime;
133     QPointF mGravity;
134     bool mIsRunning;
135     QBasicTimer mTimer;
136     QList<Box2DBody*> mBodies;
137 };
138
139 QML_DECLARE_TYPE(Box2DWorld)
140
141 #endif // BOX2DWORLD_H