Adding generic Polygon fixture support
[qml-box2d:dakerfps-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
26 #include "box2dfixture.h"
27
28 class b2Body;
29 class b2Fixture;
30 class b2Shape;
31
32 class Box2DFixture : public QDeclarativeItem
33 {
34     Q_OBJECT
35
36     Q_PROPERTY(float density READ density WRITE setDensity NOTIFY densityChanged)
37     Q_PROPERTY(float friction READ friction WRITE setFriction NOTIFY frictionChanged)
38     Q_PROPERTY(float restitution READ restitution WRITE setRestitution NOTIFY restitutionChanged)
39     Q_PROPERTY(bool sensor READ isSensor WRITE setSensor NOTIFY sensorChanged)
40
41 public:
42     explicit Box2DFixture(QDeclarativeItem *parent = 0);
43
44     float density() const { return mDensity; }
45     void setDensity(float density);
46
47     float friction() const { return mFriction; }
48     void setFriction(float friction);
49
50     float restitution() const { return mRestitution; }
51     void setRestitution(float restitution);
52
53     bool isSensor() const { return mSensor; }
54     void setSensor(bool sensor);
55
56     void createFixture(b2Body *body);
57
58 protected:
59     virtual b2Shape *createShape() = 0;
60
61 signals:
62     void densityChanged();
63     void frictionChanged();
64     void restitutionChanged();
65     void sensorChanged();
66
67     void beginContact(Box2DFixture *other);
68     void contactChanged(Box2DFixture *other);
69     void endContact(Box2DFixture *other);
70
71 private:
72     friend class Box2DWorld;
73
74     void emitBeginContact(Box2DFixture *other);
75     void emitContactChanged(Box2DFixture *other);
76     void emitEndContact(Box2DFixture *other);
77
78     b2Fixture *mFixture;
79     float mDensity;
80     float mFriction;
81     float mRestitution;
82     bool mSensor;
83 };
84
85
86 class Box2DBox : public Box2DFixture
87 {
88     Q_OBJECT
89
90 public:
91     explicit Box2DBox(QDeclarativeItem *parent = 0) :
92         Box2DFixture(parent)
93     { }
94
95 protected:
96     b2Shape *createShape();
97 };
98
99 class Box2DCircle : public Box2DFixture
100 {
101     Q_OBJECT
102
103     Q_PROPERTY(float radius READ radius WRITE setRadius NOTIFY radiusChanged)
104
105 public:
106     explicit Box2DCircle(QDeclarativeItem *parent = 0) :
107         Box2DFixture(parent)
108     { }
109
110     float radius() const { return mRadius; }
111     void setRadius(float radius) {
112         if (mRadius == radius)
113             return;
114         mRadius = radius;
115         emit radiusChanged();
116     }
117
118 signals:
119     void radiusChanged();
120
121 protected:
122     b2Shape *createShape();
123
124 private:
125     float mRadius;
126 };
127
128 class Box2DPolygon : public Box2DFixture
129 {
130     Q_OBJECT
131
132     Q_PROPERTY(QVariant vertices READ vertices WRITE setVertices NOTIFY verticesChanged)
133
134 public:
135     explicit Box2DPolygon(QDeclarativeItem *parent = 0) :
136       Box2DFixture(parent), m_vertices()
137     { }
138
139     QVariant vertices() const { return m_vertices; }
140     void setVertices(const QVariant &vertices) {
141         if (vertices == m_vertices)
142             return;
143         m_vertices = vertices;
144         emit verticesChanged(vertices);
145     }
146
147 signals:
148     void verticesChanged(const QVariant &vertices);
149
150 protected:
151     b2Shape *createShape();
152
153 private:
154     QVariant m_vertices;
155 };
156
157
158 #endif // BOX2DFIXTURE_H