1 /*
2 * Python SWIG interface file for Box2D (www.box2d.org)
3 *
4 * Copyright (c) 2008 kne / sirkne at gmail dot com
5 *
6 * This software is provided 'as-is', without any express or implied
7 * warranty.  In no event will the authors be held liable for any damages
8 * arising from the use of this software.
9 * Permission is granted to anyone to use this software for any purpose,
10 * including commercial applications, and to alter it and redistribute it
11 * freely, subject to the following restrictions:
12 * 1. The origin of this software must not be misrepresented; you must not
13 * claim that you wrote the original software. If you use this software
14 * in a product, an acknowledgment in the product documentation would be
15 * appreciated but is not required.
16 * 2. Altered source versions must be plainly marked as such, and must not be
17 * misrepresented as being the original software.
18 * 3. This notice may not be removed or altered from any source distribution.
19 */
20 
21 /* Note: Given that we have a definition (b2BodyDef) that takes the userData, then
22    passes it onto the factory output (b2Body) upon creation, it's necessary
23    to intercept the CreateBody/Joint/Shape functions to increase the refcount
24    for each of those functions.
25 
26    And upon being destroyed, the userData refcount must be decreased.
27  */
28 
29 %extend b2World {
30 public:
__CreateBody(b2BodyDef * defn)31     b2Body* __CreateBody(b2BodyDef* defn) {
32         b2Body* ret;
33         if (defn)
34             Py_XINCREF((PyObject*)defn->userData);
35         ret=self->CreateBody(defn);
36         return ret;
37     }
__CreateJoint(b2JointDef * defn)38     b2Joint* __CreateJoint(b2JointDef* defn) {
39         if (defn)
40             Py_XINCREF((PyObject*)defn->userData);
41 
42         return self->CreateJoint(defn);
43     }
44 
DestroyBody(b2Body * body)45     void DestroyBody(b2Body* body) {
46         Py_XDECREF((PyObject*)body->GetUserData());
47         self->DestroyBody(body);
48     }
49 
DestroyJoint(b2Joint * joint)50     void DestroyJoint(b2Joint* joint) {
51         Py_XDECREF((PyObject*)joint->GetUserData());
52         self->DestroyJoint(joint);
53     }
54 }
55 
56 %extend b2Body {
57 public:
DestroyFixture(b2Fixture * fixture)58     void DestroyFixture(b2Fixture* fixture) {
59         Py_XDECREF((PyObject*)fixture->GetUserData());
60         self->DestroyFixture(fixture);
61     }
__CreateFixture(b2FixtureDef * defn)62     b2Fixture* __CreateFixture(b2FixtureDef* defn) {
63         b2Fixture* ret;
64         if (defn)
65             Py_XINCREF((PyObject*)defn->userData);
66         ret=self->CreateFixture(defn);
67         return ret;
68     }
__GetUserData()69     PyObject* __GetUserData() {
70         PyObject* ret=(PyObject*)self->GetUserData();
71         if (!ret) ret=Py_None;
72         Py_XINCREF(ret);
73         return ret;
74     }
__SetUserData(PyObject * data)75     void __SetUserData(PyObject* data) {
76         Py_XDECREF((PyObject*)self->GetUserData());
77         Py_INCREF(data);
78         self->SetUserData(data);
79     }
ClearUserData()80     void ClearUserData() {
81         Py_XDECREF((PyObject*)self->GetUserData());
82         self->SetUserData(NULL);
83     }
84     %pythoncode %{
85         userData = property(__GetUserData, __SetUserData)
86     %}
87 }
88 
89 %extend b2Joint {
90 public:
__GetUserData()91     PyObject* __GetUserData() {
92         PyObject* ret=(PyObject*)self->GetUserData();
93         if (!ret) ret=Py_None;
94         Py_XINCREF(ret);
95         return ret;
96     }
__SetUserData(PyObject * data)97     void __SetUserData(PyObject* data) {
98         Py_XDECREF((PyObject*)self->GetUserData());
99         Py_INCREF(data);
100         self->SetUserData(data);
101     }
ClearUserData()102     void ClearUserData() {
103         Py_XDECREF((PyObject*)self->GetUserData());
104         self->SetUserData(NULL);
105     }
106     %pythoncode %{
107         userData = property(__GetUserData, __SetUserData)
108     %}
109 }
110 
111 %extend b2Fixture {
112 public:
__GetUserData()113     PyObject* __GetUserData() {
114         PyObject* ret=(PyObject*)self->GetUserData();
115         if (!ret) ret=Py_None;
116         Py_XINCREF(ret);
117         return ret;
118     }
__SetUserData(PyObject * data)119     void __SetUserData(PyObject* data) {
120         Py_XDECREF((PyObject*)self->GetUserData());
121         Py_INCREF(data);
122         self->SetUserData(data);
123     }
ClearUserData()124     void ClearUserData() {
125         Py_XDECREF((PyObject*)self->GetUserData());
126         self->SetUserData(NULL);
127     }
128     %pythoncode %{
129         userData = property(__GetUserData, __SetUserData)
130     %}
131 }
132 
133 //Allow access to userData in definitions, with proper destruction
134 %extend b2JointDef {
135 public:
__GetUserData()136     PyObject* __GetUserData() {
137         PyObject* ret;
138         if (!self->userData)
139             ret=Py_None;
140         else
141             ret=(PyObject*)self->userData;
142         Py_INCREF((PyObject*)ret);
143         return ret;
144     }
__SetUserData(PyObject * data)145     void __SetUserData(PyObject* data) {
146         Py_XDECREF((PyObject*)self->userData);
147         Py_INCREF(data);
148         self->userData=(void*)data;
149     }
ClearUserData()150     void ClearUserData() {
151         Py_XDECREF((PyObject*)self->userData);
152         self->userData=NULL;
153     }
154     %pythoncode %{
155         userData = property(__GetUserData, __SetUserData)
156         def __del__(self):
157             self.ClearUserData()
158     %}
159 }
160 
161 %extend b2BodyDef {
162 public:
__GetUserData()163     PyObject* __GetUserData() {
164         PyObject* ret;
165         if (!self->userData)
166             ret=Py_None;
167         else
168             ret=(PyObject*)self->userData;
169         Py_INCREF((PyObject*)ret);
170         return ret;
171     }
__SetUserData(PyObject * data)172     void __SetUserData(PyObject* data) {
173         Py_XDECREF((PyObject*)self->userData);
174         Py_INCREF(data);
175         self->userData=(void*)data;
176     }
ClearUserData()177     void ClearUserData() {
178         Py_XDECREF((PyObject*)self->userData);
179         self->userData=NULL;
180     }
181     %pythoncode %{
182         userData = property(__GetUserData, __SetUserData)
183         def __del__(self):
184             self.ClearUserData()
185     %}
186 }
187 
188 %extend b2FixtureDef {
189 public:
__GetUserData()190     PyObject* __GetUserData() {
191         PyObject* ret;
192         if (!self->userData)
193             ret=Py_None;
194         else
195             ret=(PyObject*)self->userData;
196         Py_INCREF((PyObject*)ret);
197         return ret;
198     }
__SetUserData(PyObject * data)199     void __SetUserData(PyObject* data) {
200         Py_XDECREF((PyObject*)self->userData);
201         Py_INCREF(data);
202         self->userData=(void*)data;
203     }
ClearUserData()204     void ClearUserData() {
205         Py_XDECREF((PyObject*)self->userData);
206         self->userData=NULL;
207     }
208     %pythoncode %{
209         userData = property(__GetUserData, __SetUserData)
210         def __del__(self):
211             self.ClearUserData()
212     %}
213 }
214 
215 // These renames are intentionally below the above CreateBody, as they will rename the
216 // original C++ versions and not the ones I have written.
217 %ignore SetUserData;
218 %ignore GetUserData;
219 %ignore userData;
220 
221 %newobject b2World::__CreateBody;
222 %newobject b2World::__CreateJoint;
223 %newobject b2Body::__CreateFixture;
224 %rename (__CreateFixture) b2Body::CreateFixture(const b2Shape* shape, float32 density);
225 
226 %ignore b2World::CreateBody;
227 %ignore b2World::CreateJoint;
228 %ignore b2Body::CreateFixture;
229 
230 %ignore b2World::DestroyBody;
231 %ignore b2World::DestroyJoint;
232 %ignore b2Body::DestroyFixture;
233