PyAPI RNA/BGE
[blender.git] / source / gameengine / Expressions / PyObjectPlus.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 #ifndef NO_EXP_PYTHON_EMBEDDING
31
32 #ifndef _adr_py_lib_h_                          // only process once,
33 #define _adr_py_lib_h_                          // even if multiply included
34
35 #ifndef __cplusplus                             // c++ only
36 #error Must be compiled with C++
37 #endif
38
39 #include "KX_Python.h"
40 #include "STR_String.h"
41 #include "MT_Vector3.h"
42 #include "SG_QList.h"
43
44 /*------------------------------
45  * Python defines
46 ------------------------------*/
47
48 #ifdef USE_MATHUTILS
49 extern "C" {
50 #include "../../blender/python/generic/Mathutils.h" /* so we can have mathutils callbacks */
51 }
52 #endif
53
54 #if PY_VERSION_HEX > 0x03000000
55 #define PyString_FromString PyUnicode_FromString
56 #define PyString_FromFormat PyUnicode_FromFormat
57 #define PyString_Check PyUnicode_Check
58 #define PyString_Size PyUnicode_GetSize
59
60 #define PyInt_FromLong PyLong_FromSsize_t
61 #define PyInt_AsLong PyLong_AsSsize_t
62 #define PyString_AsString _PyUnicode_AsString
63 #define PyInt_Check PyLong_Check
64 #define PyInt_AS_LONG PyLong_AsLong // TODO - check this one
65 #endif
66
67
68
69 /*
70    Py_RETURN_NONE
71    Python 2.4 macro.
72    defined here until we switch to 2.4
73    also in api2_2x/gen_utils.h 
74 */
75 #ifndef Py_RETURN_NONE
76 #define Py_RETURN_NONE  return Py_INCREF(Py_None), Py_None
77 #endif
78 #ifndef Py_RETURN_FALSE
79 #define Py_RETURN_FALSE  return Py_INCREF(Py_False), Py_False
80 #endif
81 #ifndef Py_RETURN_TRUE
82 #define Py_RETURN_TRUE  return Py_INCREF(Py_True), Py_True
83 #endif
84
85 /*  for pre Py 2.5 */
86 #if PY_VERSION_HEX < 0x02050000
87 typedef int Py_ssize_t;
88 typedef Py_ssize_t (*lenfunc)(PyObject *);
89 #define PY_SSIZE_T_MAX INT_MAX
90 #define PY_SSIZE_T_MIN INT_MIN
91 #define PY_METHODCHAR char *
92 #else
93 /* Py 2.5 and later */
94 #define  intargfunc  ssizeargfunc
95 #define intintargfunc  ssizessizeargfunc
96 #define PY_METHODCHAR const char *
97 #endif
98
99 #include "descrobject.h"
100
101
102 static inline void Py_Fatal(const char *M) {
103         fprintf(stderr, "%s\n", M);
104         exit(-1);
105 };
106
107
108 /* Use with ShowDeprecationWarning macro */
109 typedef struct {
110         bool warn_done;
111         void *link;
112 } WarnLink;
113
114 #define ShowDeprecationWarning(old_way, new_way) \
115 { \
116         static WarnLink wlink = {false, NULL}; \
117         if ((m_ignore_deprecation_warnings || wlink.warn_done)==0) \
118         { \
119                 ShowDeprecationWarning_func(old_way, new_way); \
120  \
121                 WarnLink *wlink_last= GetDeprecationWarningLinkLast(); \
122                 wlink.warn_done = true; \
123                 wlink.link = NULL; \
124          \
125                 if(wlink_last) { \
126                         wlink_last->link= (void *)&(wlink); \
127                         SetDeprecationWarningLinkLast(&(wlink)); \
128                 } else { \
129                         SetDeprecationWarningFirst(&(wlink)); \
130                         SetDeprecationWarningLinkLast(&(wlink)); \
131                 } \
132         } \
133 } \
134
135
136
137 typedef struct {
138         PyObject_HEAD           /* required python macro   */
139         class PyObjectPlus *ref;
140         bool py_owns;
141 } PyObjectPlus_Proxy;
142
143 #define BGE_PROXY_ERROR_MSG "Blender Game Engine data has been freed, cannot use this python variable"
144 #define BGE_PROXY_REF(_self) (((PyObjectPlus_Proxy *)_self)->ref)
145 #define BGE_PROXY_PYOWNS(_self) (((PyObjectPlus_Proxy *)_self)->py_owns)
146
147 /* Note, sometimes we dont care what BGE type this is as long as its a proxy */
148 #define BGE_PROXY_CHECK_TYPE(_self) ((_self)->ob_type->tp_dealloc == PyObjectPlus::py_base_dealloc)
149
150
151                                                                 // This must be the first line of each 
152                                                                 // PyC++ class
153 #define Py_Header \
154  public: \
155   static PyTypeObject   Type; \
156   static PyMethodDef    Methods[]; \
157   static PyAttributeDef Attributes[]; \
158   static PyParentObject Parents[]; \
159   virtual PyTypeObject *GetType(void) {return &Type;}; \
160   virtual PyParentObject *GetParents(void) {return Parents;} \
161   virtual PyObject *GetProxy() {return GetProxy_Ext(this, &Type);}; \
162   virtual PyObject *NewProxy(bool py_owns) {return NewProxy_Ext(this, &Type, py_owns);}; \
163
164
165
166
167                                                                 // This defines the py_getattro_up macro
168                                                                 // which allows attribute and method calls
169                                                                 // to be properly passed up the hierarchy.
170                                                                 // 
171                                                                 // Note, PyDict_GetItem() WONT set an exception!
172                                                                 // let the py_base_getattro function do this.
173
174 #define py_getattro_up(Parent) \
175         \
176         PyObject *descr = PyDict_GetItem(Type.tp_dict, attr); \
177          \
178         if(descr) { \
179                 if (PyCObject_Check(descr)) { \
180                         return py_get_attrdef((void *)this, (const PyAttributeDef*)PyCObject_AsVoidPtr(descr)); \
181                 } else if (descr->ob_type->tp_descr_get) { \
182                         return PyCFunction_New(((PyMethodDescrObject *)descr)->d_method, this->m_proxy); \
183                 } else { \
184                         return NULL; \
185                 } \
186         } else { \
187                 return Parent::py_getattro(attr); \
188         }
189
190 #define py_getattro_dict_up(Parent) \
191         return py_getattr_dict(Parent::py_getattro_dict(), Type.tp_dict);
192
193 /*
194  * nonzero values are an error for setattr
195  * however because of the nested lookups we need to know if the errors
196  * was because the attribute didnt exits of if there was some problem setting the value
197  */
198
199 #define PY_SET_ATTR_COERCE_FAIL  2
200 #define PY_SET_ATTR_FAIL                 1
201 #define PY_SET_ATTR_MISSING             -1
202 #define PY_SET_ATTR_SUCCESS              0
203
204 #define py_setattro_up(Parent) \
205         PyObject *descr = PyDict_GetItem(Type.tp_dict, attr); \
206          \
207         if(descr) { \
208                 if (PyCObject_Check(descr)) { \
209                         const PyAttributeDef* attrdef= reinterpret_cast<const PyAttributeDef *>(PyCObject_AsVoidPtr(descr)); \
210                         if (attrdef->m_access == KX_PYATTRIBUTE_RO) { \
211                                 PyErr_Format(PyExc_AttributeError, "\"%s\" is read only", PyString_AsString(attr)); \
212                                 return PY_SET_ATTR_FAIL; \
213                         } \
214                         else { \
215                                 return py_set_attrdef((void *)this, attrdef, value); \
216                         } \
217                 } else { \
218                         PyErr_Format(PyExc_AttributeError, "\"%s\" cannot be set", PyString_AsString(attr)); \
219                         return PY_SET_ATTR_FAIL; \
220                 } \
221         } else { \
222                 PyErr_Clear(); \
223                 return Parent::py_setattro(attr, value); \
224         }
225
226
227 /**
228  * These macros are helpfull when embedding Python routines. The second
229  * macro is one that also requires a documentation string
230  */
231 #define KX_PYMETHOD(class_name, method_name)                    \
232         PyObject* Py##method_name(PyObject* args, PyObject* kwds); \
233         static PyObject* sPy##method_name( PyObject* self, PyObject* args, PyObject* kwds) { \
234                 if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \
235                 return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(args, kwds);         \
236         }; \
237
238 #define KX_PYMETHOD_VARARGS(class_name, method_name)                    \
239         PyObject* Py##method_name(PyObject* args); \
240         static PyObject* sPy##method_name( PyObject* self, PyObject* args) { \
241                 if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \
242                 return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(args);               \
243         }; \
244
245 #define KX_PYMETHOD_NOARGS(class_name, method_name)                     \
246         PyObject* Py##method_name(); \
247         static PyObject* sPy##method_name( PyObject* self) { \
248                 if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \
249                 return ((class_name*)BGE_PROXY_REF(self))->Py##method_name();           \
250         }; \
251         
252 #define KX_PYMETHOD_O(class_name, method_name)                  \
253         PyObject* Py##method_name(PyObject* value); \
254         static PyObject* sPy##method_name( PyObject* self, PyObject* value) { \
255                 if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(value) - " BGE_PROXY_ERROR_MSG); return NULL; } \
256                 return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(value);              \
257         }; \
258
259 #define KX_PYMETHOD_DOC(class_name, method_name)                        \
260         PyObject* Py##method_name(PyObject* args, PyObject* kwds); \
261         static PyObject* sPy##method_name( PyObject* self, PyObject* args, PyObject* kwds) { \
262                 if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(...) - " BGE_PROXY_ERROR_MSG); return NULL; } \
263                 return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(args, kwds);         \
264         }; \
265     static const char method_name##_doc[]; \
266
267 #define KX_PYMETHOD_DOC_VARARGS(class_name, method_name)                        \
268         PyObject* Py##method_name(PyObject* args); \
269         static PyObject* sPy##method_name( PyObject* self, PyObject* args) { \
270                 if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(...) - " BGE_PROXY_ERROR_MSG); return NULL; } \
271                 return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(args);               \
272         }; \
273     static const char method_name##_doc[]; \
274
275 #define KX_PYMETHOD_DOC_O(class_name, method_name)                      \
276         PyObject* Py##method_name(PyObject* value); \
277         static PyObject* sPy##method_name( PyObject* self, PyObject* value) { \
278                 if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(value) - " BGE_PROXY_ERROR_MSG); return NULL; } \
279                 return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(value);              \
280         }; \
281     static const char method_name##_doc[]; \
282
283 #define KX_PYMETHOD_DOC_NOARGS(class_name, method_name)                 \
284         PyObject* Py##method_name(); \
285         static PyObject* sPy##method_name( PyObject* self) { \
286                 if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \
287                 return ((class_name*)BGE_PROXY_REF(self))->Py##method_name();           \
288         }; \
289     static const char method_name##_doc[]; \
290
291
292 /* The line above should remain empty */
293 /**
294  * Method table macro (with doc)
295  */
296 #define KX_PYMETHODTABLE(class_name, method_name) \
297         {#method_name , (PyCFunction) class_name::sPy##method_name, METH_VARARGS, (PY_METHODCHAR)class_name::method_name##_doc}
298
299 #define KX_PYMETHODTABLE_O(class_name, method_name) \
300         {#method_name , (PyCFunction) class_name::sPy##method_name, METH_O, (PY_METHODCHAR)class_name::method_name##_doc}
301
302 #define KX_PYMETHODTABLE_NOARGS(class_name, method_name) \
303         {#method_name , (PyCFunction) class_name::sPy##method_name, METH_NOARGS, (PY_METHODCHAR)class_name::method_name##_doc}
304
305 /**
306  * Function implementation macro
307  */
308 #define KX_PYMETHODDEF_DOC(class_name, method_name, doc_string) \
309 const char class_name::method_name##_doc[] = doc_string; \
310 PyObject* class_name::Py##method_name(PyObject* args, PyObject*)
311
312 #define KX_PYMETHODDEF_DOC_VARARGS(class_name, method_name, doc_string) \
313 const char class_name::method_name##_doc[] = doc_string; \
314 PyObject* class_name::Py##method_name(PyObject* args)
315
316 #define KX_PYMETHODDEF_DOC_O(class_name, method_name, doc_string) \
317 const char class_name::method_name##_doc[] = doc_string; \
318 PyObject* class_name::Py##method_name(PyObject* value)
319
320 #define KX_PYMETHODDEF_DOC_NOARGS(class_name, method_name, doc_string) \
321 const char class_name::method_name##_doc[] = doc_string; \
322 PyObject* class_name::Py##method_name()
323
324 /**
325  * Attribute management
326  */
327 enum KX_PYATTRIBUTE_TYPE {
328         KX_PYATTRIBUTE_TYPE_BOOL,
329         KX_PYATTRIBUTE_TYPE_ENUM,
330         KX_PYATTRIBUTE_TYPE_SHORT,
331         KX_PYATTRIBUTE_TYPE_INT,
332         KX_PYATTRIBUTE_TYPE_FLOAT,
333         KX_PYATTRIBUTE_TYPE_STRING,
334         KX_PYATTRIBUTE_TYPE_DUMMY,
335         KX_PYATTRIBUTE_TYPE_FUNCTION,
336         KX_PYATTRIBUTE_TYPE_VECTOR,
337 };
338
339 enum KX_PYATTRIBUTE_ACCESS {
340         KX_PYATTRIBUTE_RW,
341         KX_PYATTRIBUTE_RO
342 };
343
344 struct KX_PYATTRIBUTE_DEF;
345 typedef int (*KX_PYATTRIBUTE_CHECK_FUNCTION)(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
346 typedef int (*KX_PYATTRIBUTE_SET_FUNCTION)(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
347 typedef PyObject* (*KX_PYATTRIBUTE_GET_FUNCTION)(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
348
349 typedef struct KX_PYATTRIBUTE_DEF {
350         const char *m_name;                             // name of the python attribute
351         KX_PYATTRIBUTE_TYPE m_type;             // type of value
352         KX_PYATTRIBUTE_ACCESS m_access; // read/write access or read-only
353         int m_imin;                                             // minimum value in case of integer attributes (for string: minimum string length)
354         int m_imax;                                             // maximum value in case of integer attributes (for string: maximum string length)
355         float m_fmin;                                   // minimum value in case of float attributes
356         float m_fmax;                                   // maximum value in case of float attributes
357         bool   m_clamp;                                 // enforce min/max value by clamping
358         size_t m_offset;                                // position of field in structure
359         size_t m_size;                                  // size of field for runtime verification (enum only)
360         size_t m_length;                                // length of array, 1=simple attribute
361         KX_PYATTRIBUTE_CHECK_FUNCTION m_checkFunction;  // static function to check the assignment, returns 0 if no error
362         KX_PYATTRIBUTE_SET_FUNCTION m_setFunction;      // static function to check the assignment, returns 0 if no error
363         KX_PYATTRIBUTE_GET_FUNCTION m_getFunction;      // static function to check the assignment, returns 0 if no error
364
365         // The following pointers are just used to have compile time check for attribute type.
366         // It would have been good to use a union but that would require C99 compatibility
367         // to initialize specific union fields through designated initializers.
368         struct {
369                 bool *m_boolPtr;
370                 short int *m_shortPtr;
371                 int *m_intPtr;
372                 float *m_floatPtr;
373                 STR_String *m_stringPtr;
374                 MT_Vector3 *m_vectorPtr;
375         } m_typeCheck;
376 } PyAttributeDef;
377
378 #define KX_PYATTRIBUTE_DUMMY(name) \
379         { name, KX_PYATTRIBUTE_TYPE_DUMMY, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, 0, 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL} }
380
381 #define KX_PYATTRIBUTE_BOOL_RW(name,object,field) \
382         { name, KX_PYATTRIBUTE_TYPE_BOOL, KX_PYATTRIBUTE_RW, 0, 1, 0.f, 0.f, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {&((object *)0)->field, NULL, NULL, NULL, NULL, NULL} }
383 #define KX_PYATTRIBUTE_BOOL_RW_CHECK(name,object,field,function) \
384         { name, KX_PYATTRIBUTE_TYPE_BOOL, KX_PYATTRIBUTE_RW, 0, 1, 0.f, 0.f, false, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {&((object *)0)->field, NULL, NULL, NULL, NULL, NULL} }
385 #define KX_PYATTRIBUTE_BOOL_RO(name,object,field) \
386         { name, KX_PYATTRIBUTE_TYPE_BOOL, KX_PYATTRIBUTE_RO, 0, 1, 0.f, 0.f, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {&((object *)0)->field, NULL, NULL, NULL, NULL, NULL} }
387
388 // enum field cannot be mapped to pointer (because we would need a pointer for each enum)
389 // use field size to verify mapping at runtime only, assuming enum size is equal to int size.
390 #define KX_PYATTRIBUTE_ENUM_RW(name,min,max,clamp,object,field) \
391         { name, KX_PYATTRIBUTE_TYPE_ENUM, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL} }
392 #define KX_PYATTRIBUTE_ENUM_RW_CHECK(name,min,max,clamp,object,field,function) \
393         { name, KX_PYATTRIBUTE_TYPE_ENUM, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), sizeof(((object *)0)->field), 1, &object::function, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL} }
394 #define KX_PYATTRIBUTE_ENUM_RO(name,object,field) \
395         { name, KX_PYATTRIBUTE_TYPE_ENUM, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL} }
396
397 #define KX_PYATTRIBUTE_SHORT_RW(name,min,max,clamp,object,field) \
398         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
399 #define KX_PYATTRIBUTE_SHORT_RW_CHECK(name,min,max,clamp,object,field,function) \
400         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
401 #define KX_PYATTRIBUTE_SHORT_RO(name,object,field) \
402         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
403 #define KX_PYATTRIBUTE_SHORT_ARRAY_RW(name,min,max,clamp,object,field,length) \
404         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, ((object *)0)->field, NULL, NULL, NULL, NULL} }
405 #define KX_PYATTRIBUTE_SHORT_ARRAY_RW_CHECK(name,min,max,clamp,object,field,length,function) \
406         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, ((object *)0)->field, NULL, NULL, NULL, NULL} }
407 #define KX_PYATTRIBUTE_SHORT_ARRAY_RO(name,object,field,length) \
408         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, ((object *)0)->field, NULL, NULL, NULL, NULL} }
409 // SHORT_LIST
410 #define KX_PYATTRIBUTE_SHORT_LIST_RW(name,min,max,clamp,object,field,length) \
411         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
412 #define KX_PYATTRIBUTE_SHORT_LIST_RW_CHECK(name,min,max,clamp,object,field,length,function) \
413         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
414 #define KX_PYATTRIBUTE_SHORT_LIST_RO(name,object,field,length) \
415         { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
416
417 #define KX_PYATTRIBUTE_INT_RW(name,min,max,clamp,object,field) \
418         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL} }
419 #define KX_PYATTRIBUTE_INT_RW_CHECK(name,min,max,clamp,object,field,function) \
420         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL} }
421 #define KX_PYATTRIBUTE_INT_RO(name,object,field) \
422         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL} }
423 #define KX_PYATTRIBUTE_INT_ARRAY_RW(name,min,max,clamp,object,field,length) \
424         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, ((object *)0)->field, NULL, NULL, NULL} }
425 #define KX_PYATTRIBUTE_INT_ARRAY_RW_CHECK(name,min,max,clamp,object,field,length,function) \
426         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, NULL, ((object *)0)->field, NULL, NULL, NULL} }
427 #define KX_PYATTRIBUTE_INT_ARRAY_RO(name,object,field,length) \
428         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, ((object *)0)->field, NULL, NULL, NULL} }
429 // INT_LIST
430 #define KX_PYATTRIBUTE_INT_LIST_RW(name,min,max,clamp,object,field,length) \
431         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL} }
432 #define KX_PYATTRIBUTE_INT_LIST_RW_CHECK(name,min,max,clamp,object,field,length,function) \
433         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL} }
434 #define KX_PYATTRIBUTE_INT_LIST_RO(name,object,field,length) \
435         { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL} }
436
437 // always clamp for float
438 #define KX_PYATTRIBUTE_FLOAT_RW(name,min,max,object,field) \
439         { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, &((object *)0)->field, NULL, NULL} }
440 #define KX_PYATTRIBUTE_FLOAT_RW_CHECK(name,min,max,object,field,function) \
441         { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, NULL, NULL, &((object *)0)->field, NULL, NULL} }
442 #define KX_PYATTRIBUTE_FLOAT_RO(name,object,field) \
443         { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, &((object *)0)->field, NULL, NULL} }
444 #define KX_PYATTRIBUTE_FLOAT_ARRAY_RW(name,min,max,object,field,length) \
445         { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field, NULL, NULL} }
446 #define KX_PYATTRIBUTE_FLOAT_ARRAY_RW_CHECK(name,min,max,object,field,length,function) \
447         { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field, NULL, NULL} }
448 #define KX_PYATTRIBUTE_FLOAT_ARRAY_RO(name,object,field,length) \
449         { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field, NULL, NULL} }
450
451 #define KX_PYATTRIBUTE_STRING_RW(name,min,max,clamp,object,field) \
452         { name, KX_PYATTRIBUTE_TYPE_STRING, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, &((object *)0)->field, NULL} }
453 #define KX_PYATTRIBUTE_STRING_RW_CHECK(name,min,max,clamp,object,field,function) \
454         { name, KX_PYATTRIBUTE_TYPE_STRING, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, NULL, NULL, NULL, &((object *)0)->field, NULL} }
455 #define KX_PYATTRIBUTE_STRING_RO(name,object,field) \
456         { name, KX_PYATTRIBUTE_TYPE_STRING, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, 1 , NULL, NULL, NULL, {NULL, NULL, NULL, NULL, &((object *)0)->field, NULL} }
457
458 #define KX_PYATTRIBUTE_VECTOR_RW(name,min,max,object,field) \
459         { name, KX_PYATTRIBUTE_TYPE_VECTOR, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, &((object *)0)->field} }
460 #define KX_PYATTRIBUTE_VECTOR_RW_CHECK(name,min,max,clamp,object,field,function) \
461         { name, KX_PYATTRIBUTE_TYPE_VECTOR, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, &((object *)0)->field} }
462 #define KX_PYATTRIBUTE_VECTOR_RO(name,object,field) \
463         { name, KX_PYATTRIBUTE_TYPE_VECTOR, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, 1 , NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, &((object *)0)->field} }
464
465 #define KX_PYATTRIBUTE_RW_FUNCTION(name,object,getfunction,setfunction) \
466         { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RW, 0, 0, 0.f, 0.f, false, 0, 0, 1, NULL, &object::setfunction, &object::getfunction, {NULL, NULL, NULL, NULL, NULL, NULL} }
467 #define KX_PYATTRIBUTE_RO_FUNCTION(name,object,getfunction) \
468         { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, 0, 0, 1, NULL, NULL, &object::getfunction, {NULL, NULL, NULL, NULL, NULL, NULL} }
469 #define KX_PYATTRIBUTE_ARRAY_RW_FUNCTION(name,object,length,getfunction,setfunction) \
470         { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RW, 0, 0, 0.f, 0,f, false, 0, 0, length, NULL, &object::setfunction, &object::getfunction, {NULL, NULL, NULL, NULL, NULL, NULL} }
471 #define KX_PYATTRIBUTE_ARRAY_RO_FUNCTION(name,object,length,getfunction) \
472         { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0,f, false, 0, 0, length, NULL, NULL, &object::getfunction, {NULL, NULL, NULL, NULL, NULL, NULL} }
473
474
475 /*------------------------------
476  * PyObjectPlus
477 ------------------------------*/
478 typedef PyTypeObject * PyParentObject;                          // Define the PyParent Object
479
480 // By making SG_QList the ultimate parent for PyObjectPlus objects, it
481 // allows to put them in 2 different dynamic lists at the same time
482 // The use of these links is interesting because they free of memory allocation
483 // but it's very important not to mess up with them. If you decide that 
484 // the SG_QList or SG_DList component is used for something for a certain class,
485 // they cannot can be used for anything else at a parent level!
486 // What these lists are and what they are used for must be carefully documented
487 // at the level where they are used.
488 // DON'T MAKE ANY USE OF THESE LIST AT THIS LEVEL, they are already used
489 // at SCA_IActuator, SCA_ISensor, SCA_IController level which rules out the
490 // possibility to use them at SCA_ILogicBrick, CValue and PyObjectPlus level.
491 class PyObjectPlus : public SG_QList
492 {                               // The PyObjectPlus abstract class
493         Py_Header;                                                      // Always start with Py_Header
494         
495 public:
496         PyObjectPlus(PyTypeObject *T);
497
498         PyObject *m_proxy; /* actually a PyObjectPlus_Proxy */
499         
500         virtual ~PyObjectPlus();                                        // destructor
501         
502         /* These static functions are referenced by ALL PyObjectPlus_Proxy types
503          * they take the C++ reference from the PyObjectPlus_Proxy and call
504          * its own virtual py_getattro, py_setattro etc. functions.
505          */
506         static void                     py_base_dealloc(PyObject *self);
507         static  PyObject*               py_base_getattro(PyObject * self, PyObject *attr);
508         static  int                     py_base_setattro(PyObject *self, PyObject *attr, PyObject *value);
509         static PyObject*                py_base_repr(PyObject *self);
510
511         /* These are all virtual python methods that are defined in each class
512          * Our own fake subclassing calls these on each class, then calls the parent */
513         virtual PyObject*               py_getattro(PyObject *attr);
514         virtual PyObject*               py_getattro_dict();
515         virtual int                     py_delattro(PyObject *attr);
516         virtual int                     py_setattro(PyObject *attr, PyObject *value);
517         virtual PyObject*               py_repr(void);
518
519         static PyObject*                py_get_attrdef(void *self, const PyAttributeDef *attrdef);
520         static int                              py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyObject *value);
521         
522         /* isA() methods, shonky replacement for pythons issubclass()
523          * which we cant use because we have our own subclass system  */
524         bool isA(PyTypeObject *T);
525         bool isA(const char *mytypename);
526         
527         KX_PYMETHOD_O(PyObjectPlus,isA);
528         
529         /* Kindof dumb, always returns True, the false case is checked for, before this function gets accessed */
530         static PyObject*        pyattr_get_invalid(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
531         
532         static PyObject *GetProxy_Ext(PyObjectPlus *self, PyTypeObject *tp);
533         static PyObject *NewProxy_Ext(PyObjectPlus *self, PyTypeObject *tp, bool py_owns);
534         
535         void    InvalidateProxy();
536         
537         /**
538          * Makes sure any internal data owned by this class is deep copied.
539          */
540         virtual void ProcessReplica();
541         
542         
543         static bool                     m_ignore_deprecation_warnings;
544         
545         static  WarnLink*               GetDeprecationWarningLinkFirst(void);
546         static  WarnLink*               GetDeprecationWarningLinkLast(void);
547         static  void                    SetDeprecationWarningFirst(WarnLink* wlink);
548         static  void                    SetDeprecationWarningLinkLast(WarnLink* wlink);
549         static void                     NullDeprecationWarning();
550         
551         /** enable/disable display of deprecation warnings */
552         static void                     SetDeprecationWarnings(bool ignoreDeprecationWarnings);
553         /** Shows a deprecation warning */
554         static void                     ShowDeprecationWarning_func(const char* method,const char* prop);
555         static void                     ClearDeprecationWarning();
556         
557 };
558
559
560 PyObject *py_getattr_dict(PyObject *pydict, PyObject *tp_dict);
561
562 #endif //  _adr_py_lib_h_
563
564 #endif //NO_EXP_PYTHON_EMBEDDING
565