Made joints easier to create
[qml-box2d:anubhavtiwaris-qml-box2d.git] / box2dfixture.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 BOX2DFIXTURE_H
22 #define BOX2DFIXTURE_H
23
24 #include <QDeclarativeItem>
25 #include <QFlags>
26 #include <Box2D.h>
27
28 #include "box2dfixture.h"
29
30 class b2Body;
31 class b2Fixture;
32 struct b2FixtureDef;
33 class b2Shape;
34
35 class Box2DFixture : public QDeclarativeItem
36 {
37     Q_OBJECT
38
39     Q_PROPERTY(float density READ density WRITE setDensity NOTIFY densityChanged)
40     Q_PROPERTY(float friction READ friction WRITE setFriction NOTIFY frictionChanged)
41     Q_PROPERTY(float restitution READ restitution WRITE setRestitution NOTIFY restitutionChanged)
42     Q_PROPERTY(bool sensor READ isSensor WRITE setSensor NOTIFY sensorChanged)
43     Q_PROPERTY(CategoryFlags categories READ categories WRITE setCategories NOTIFY categoriesChanged)
44     Q_PROPERTY(CategoryFlags collidesWith READ collidesWith WRITE setCollidesWith NOTIFY collidesWithChanged)
45     Q_PROPERTY(int groupIndex READ groupIndex WRITE setGroupIndex NOTIFY groupIndexChanged)
46
47     Q_ENUMS(CategoryFlag)
48     Q_FLAGS(CategoryFlags)
49
50 public:
51
52     explicit Box2DFixture(QDeclarativeItem *parent = 0);
53
54     enum CategoryFlag {Category1 = 0x0001, Category2 = 0x0002, Category3 = 0x0004, Category4 = 0x0008,
55                 Category5 = 0x0010, Category6 = 0x0020, Category7 = 0x0040, Category8 = 0x0080,
56                 Category9 = 0x0100, Category10 = 0x0200, Category11 = 0x0400, Category12 = 0x0800,
57                 Category13 = 0x1000, Category14 = 0x2000, Category15 = 0x4000, Category16 = 0x8000,
58                 All = 0xFFFF, None=0x0000};
59
60     Q_DECLARE_FLAGS(CategoryFlags, CategoryFlag)
61
62     float density() const;
63     void setDensity(float density);
64
65     float friction() const;
66     void setFriction(float friction);
67
68     float restitution() const;
69     void setRestitution(float restitution);
70
71     bool isSensor() const;
72     void setSensor(bool sensor);
73
74     CategoryFlags categories() const;
75     void setCategories(CategoryFlags layers);
76
77     CategoryFlags collidesWith() const;
78     void setCollidesWith(CategoryFlags layers);
79
80     int groupIndex() const;
81     void setGroupIndex(int groupIndex);
82
83     void createFixture(b2Body *body);
84
85 protected:
86     virtual b2Shape *createShape() = 0;
87
88 signals:
89     void densityChanged();
90     void frictionChanged();
91     void restitutionChanged();
92     void sensorChanged();
93     void categoriesChanged();
94     void collidesWithChanged();
95     void groupIndexChanged();
96
97     void beginContact(Box2DFixture *other);
98     void contactChanged(Box2DFixture *other);
99     void endContact(Box2DFixture *other);
100
101 private:
102     friend class Box2DWorld;
103
104     void emitBeginContact(Box2DFixture *other);
105     void emitContactChanged(Box2DFixture *other);
106     void emitEndContact(Box2DFixture *other);
107
108     b2FixtureDef mFixtureDef;
109     b2Fixture *mFixture;
110 };
111
112 Q_DECLARE_OPERATORS_FOR_FLAGS(Box2DFixture::CategoryFlags)
113
114 class Box2DBox : public Box2DFixture
115 {
116     Q_OBJECT
117
118 public:
119     explicit Box2DBox(QDeclarativeItem *parent = 0) :
120         Box2DFixture(parent)
121     { }
122
123 protected:
124     b2Shape *createShape();
125 };
126
127 class Box2DCircle : public Box2DFixture
128 {
129     Q_OBJECT
130
131     Q_PROPERTY(float radius READ radius WRITE setRadius NOTIFY radiusChanged)
132
133 public:
134     explicit Box2DCircle(QDeclarativeItem *parent = 0) :
135         Box2DFixture(parent)
136     { }
137
138     float radius() const { return mRadius; }
139     void setRadius(float radius) {
140         if (mRadius == radius)
141             return;
142         mRadius = radius;
143         emit radiusChanged();
144     }
145
146 signals:
147     void radiusChanged();
148
149 protected:
150     b2Shape *createShape();
151
152 private:
153     float mRadius;
154 };
155
156 class Box2DPolygon : public Box2DFixture
157 {
158     Q_OBJECT
159
160     Q_PROPERTY(QVariantList vertices READ vertices WRITE setVertices NOTIFY verticesChanged)
161
162 public:
163     explicit Box2DPolygon(QDeclarativeItem *parent = 0) :
164         Box2DFixture(parent)
165     { }
166
167     QVariantList vertices() const { return mVertices; }
168     void setVertices(const QVariantList &vertices) {
169         if (vertices == mVertices)
170             return;
171         mVertices = vertices;
172         emit verticesChanged();
173     }
174
175 signals:
176     void verticesChanged();
177
178 protected:
179     b2Shape *createShape();
180
181 private:
182     QVariantList mVertices;
183 };
184
185 #endif // BOX2DFIXTURE_H