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