2002-10-12 11:37:38 +00:00
/**
* $ Id $
*
2008-04-16 22:40:48 +00:00
* * * * * * BEGIN GPL LICENSE BLOCK * * * * *
2002-10-12 11:37:38 +00:00
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
2008-04-16 22:40:48 +00:00
* of the License , or ( at your option ) any later version .
2002-10-12 11:37:38 +00:00
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software Foundation ,
* Inc . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
*
* The Original Code is Copyright ( C ) 2001 - 2002 by NaN Holding BV .
* All rights reserved .
*
* The Original Code is : all of this file .
*
* Contributor ( s ) : none yet .
*
2008-04-16 22:40:48 +00:00
* * * * * * END GPL LICENSE BLOCK * * * * *
2002-10-12 11:37:38 +00:00
*/
2002-11-25 11:16:17 +00:00
2002-10-12 11:37:38 +00:00
# ifndef NO_EXP_PYTHON_EMBEDDING
# ifndef _adr_py_lib_h_ // only process once,
# define _adr_py_lib_h_ // even if multiply included
# ifndef __cplusplus // c++ only
# error Must be compiled with C++
# endif
# include "KX_Python.h"
2004-05-16 13:05:15 +00:00
# include "STR_String.h"
2002-10-12 11:37:38 +00:00
/*------------------------------
* Python defines
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
2008-09-06 14:13:31 +00:00
/*
Py_RETURN_NONE
Python 2.4 macro .
defined here until we switch to 2.4
also in api2_2x / gen_utils . h
*/
# ifndef Py_RETURN_NONE
# define Py_RETURN_NONE return Py_BuildValue("O", Py_None)
# endif
# ifndef Py_RETURN_FALSE
# define Py_RETURN_FALSE return PyBool_FromLong(0)
# endif
# ifndef Py_RETURN_TRUE
# define Py_RETURN_TRUE return PyBool_FromLong(1)
# endif
/* for pre Py 2.5 */
# if PY_VERSION_HEX < 0x02050000
typedef int Py_ssize_t ;
2009-04-04 08:20:52 +00:00
typedef Py_ssize_t ( * lenfunc ) ( PyObject * ) ;
2008-09-06 14:13:31 +00:00
# define PY_SSIZE_T_MAX INT_MAX
# define PY_SSIZE_T_MIN INT_MIN
2008-10-02 00:22:28 +00:00
# define PY_METHODCHAR char *
2008-09-06 14:13:31 +00:00
# else
/* Py 2.5 and later */
# define intargfunc ssizeargfunc
# define intintargfunc ssizessizeargfunc
2008-10-02 00:22:28 +00:00
# define PY_METHODCHAR const char *
2008-09-06 14:13:31 +00:00
# endif
2009-04-03 14:51:06 +00:00
# include "descrobject.h"
2009-04-04 08:20:52 +00:00
2008-09-20 11:08:35 +00:00
static inline void Py_Fatal ( const char * M ) {
2009-02-25 03:26:02 +00:00
fprintf ( stderr , " %s \n " , M ) ;
2002-10-12 11:37:38 +00:00
exit ( - 1 ) ;
} ;
// This must be the first line of each
// PyC++ class
# define Py_Header \
public : \
static PyTypeObject Type ; \
static PyMethodDef Methods [ ] ; \
2008-12-31 20:35:20 +00:00
static PyAttributeDef Attributes [ ] ; \
2002-10-12 11:37:38 +00:00
static PyParentObject Parents [ ] ; \
virtual PyTypeObject * GetType ( void ) { return & Type ; } ; \
virtual PyParentObject * GetParents ( void ) { return Parents ; }
2008-07-08 17:57:31 +00:00
2009-02-26 09:04:06 +00:00
2009-04-03 14:51:06 +00:00
// This defines the py_getattro_up macro
2002-10-12 11:37:38 +00:00
// which allows attribute and method calls
// to be properly passed up the hierarchy.
2009-04-03 14:51:06 +00:00
# define py_getattro_up(Parent) \
2009-04-07 11:06:35 +00:00
\
2009-04-03 14:51:06 +00:00
PyObject * descr = PyDict_GetItem ( Type . tp_dict , attr ) ; \
2009-02-26 09:04:06 +00:00
\
2009-04-07 11:06:35 +00:00
if ( descr ) { \
if ( PyCObject_Check ( descr ) ) { \
return py_get_attrdef ( ( void * ) this , ( const PyAttributeDef * ) PyCObject_AsVoidPtr ( descr ) ) ; \
2009-04-07 16:00:32 +00:00
} else if ( descr - > ob_type - > tp_descr_get ) { \
2009-04-07 11:06:35 +00:00
return PyCFunction_New ( ( ( PyMethodDescrObject * ) descr ) - > d_method , ( PyObject * ) this ) ; \
2009-04-07 16:00:32 +00:00
} else { \
fprintf ( stderr , " unknown attribute type " ) ; \
return descr ; \
2009-04-07 11:06:35 +00:00
} \
2009-04-03 14:51:06 +00:00
} else { \
2009-04-07 11:06:35 +00:00
PyErr_Clear ( ) ; \
PyObject * rvalue = Parent : : py_getattro ( attr ) ; \
\
if ( strcmp ( PyString_AsString ( attr ) , " __dict__ " ) = = 0 ) { \
2009-04-07 16:00:32 +00:00
return py_getattr_dict ( rvalue , Type . tp_dict ) ; \
2009-04-07 11:06:35 +00:00
} \
\
return rvalue ; \
2009-02-26 09:04:06 +00:00
} \
2009-04-07 11:06:35 +00:00
return NULL ;
2009-04-12 09:56:30 +00:00
/*
* nonzero values are an error for setattr
* however because of the nested lookups we need to know if the errors
* was because the attribute didnt exits of if there was some problem setting the value
*/
2009-04-12 14:22:51 +00:00
# define PY_SET_ATTR_COERCE_FAIL 2
2009-04-12 09:56:30 +00:00
# define PY_SET_ATTR_FAIL 1
2009-04-12 14:22:51 +00:00
# define PY_SET_ATTR_MISSING -1
# define PY_SET_ATTR_SUCCESS 0
2009-04-12 09:56:30 +00:00
2009-04-07 11:06:35 +00:00
# define py_setattro_up(Parent) \
PyObject * descr = PyDict_GetItem ( Type . tp_dict , attr ) ; \
\
if ( descr ) { \
if ( PyCObject_Check ( descr ) ) { \
2009-04-09 16:00:45 +00:00
const PyAttributeDef * attrdef = reinterpret_cast < const PyAttributeDef * > ( PyCObject_AsVoidPtr ( descr ) ) ; \
if ( attrdef - > m_access = = KX_PYATTRIBUTE_RO ) { \
PyErr_Format ( PyExc_AttributeError , " \" %s \" is read only " , PyString_AsString ( attr ) ) ; \
2009-04-12 09:56:30 +00:00
return PY_SET_ATTR_FAIL ; \
2009-04-09 16:00:45 +00:00
} \
else { \
return py_set_attrdef ( ( void * ) this , attrdef , value ) ; \
} \
2009-04-07 11:06:35 +00:00
} else { \
PyErr_Format ( PyExc_AttributeError , " \" %s \" cannot be set " , PyString_AsString ( attr ) ) ; \
2009-04-12 09:56:30 +00:00
return PY_SET_ATTR_FAIL ; \
2009-04-07 11:06:35 +00:00
} \
} else { \
PyErr_Clear ( ) ; \
return Parent : : py_setattro ( attr , value ) ; \
}
2002-10-12 11:37:38 +00:00
2009-04-03 14:51:06 +00:00
2004-06-07 11:03:12 +00:00
/**
* These macros are helpfull when embedding Python routines . The second
* macro is one that also requires a documentation string
*/
# define KX_PYMETHOD(class_name, method_name) \
PyObject * Py # # method_name ( PyObject * self , PyObject * args , PyObject * kwds ) ; \
static PyObject * sPy # # method_name ( PyObject * self , PyObject * args , PyObject * kwds ) { \
return ( ( class_name * ) self ) - > Py # # method_name ( self , args , kwds ) ; \
} ; \
2008-08-27 03:34:53 +00:00
# define KX_PYMETHOD_VARARGS(class_name, method_name) \
PyObject * Py # # method_name ( PyObject * self , PyObject * args ) ; \
static PyObject * sPy # # method_name ( PyObject * self , PyObject * args ) { \
return ( ( class_name * ) self ) - > Py # # method_name ( self , args ) ; \
} ; \
2008-07-04 00:05:50 +00:00
# define KX_PYMETHOD_NOARGS(class_name, method_name) \
PyObject * Py # # method_name ( PyObject * self ) ; \
static PyObject * sPy # # method_name ( PyObject * self ) { \
return ( ( class_name * ) self ) - > Py # # method_name ( self ) ; \
} ; \
# define KX_PYMETHOD_O(class_name, method_name) \
PyObject * Py # # method_name ( PyObject * self , PyObject * value ) ; \
static PyObject * sPy # # method_name ( PyObject * self , PyObject * value ) { \
return ( ( class_name * ) self ) - > Py # # method_name ( self , value ) ; \
} ; \
2004-06-07 11:03:12 +00:00
# define KX_PYMETHOD_DOC(class_name, method_name) \
PyObject * Py # # method_name ( PyObject * self , PyObject * args , PyObject * kwds ) ; \
static PyObject * sPy # # method_name ( PyObject * self , PyObject * args , PyObject * kwds ) { \
return ( ( class_name * ) self ) - > Py # # method_name ( self , args , kwds ) ; \
} ; \
2008-09-20 11:08:35 +00:00
static const char method_name # # _doc [ ] ; \
2004-06-07 11:03:12 +00:00
2008-08-14 08:58:25 +00:00
# define KX_PYMETHOD_DOC_VARARGS(class_name, method_name) \
PyObject * Py # # method_name ( PyObject * self , PyObject * args ) ; \
static PyObject * sPy # # method_name ( PyObject * self , PyObject * args ) { \
return ( ( class_name * ) self ) - > Py # # method_name ( self , args ) ; \
} ; \
2008-09-20 11:08:35 +00:00
static const char method_name # # _doc [ ] ; \
2008-08-14 08:58:25 +00:00
2008-07-04 00:05:50 +00:00
# define KX_PYMETHOD_DOC_O(class_name, method_name) \
PyObject * Py # # method_name ( PyObject * self , PyObject * value ) ; \
static PyObject * sPy # # method_name ( PyObject * self , PyObject * value ) { \
return ( ( class_name * ) self ) - > Py # # method_name ( self , value ) ; \
} ; \
2008-09-20 11:08:35 +00:00
static const char method_name # # _doc [ ] ; \
2008-07-04 00:05:50 +00:00
# define KX_PYMETHOD_DOC_NOARGS(class_name, method_name) \
PyObject * Py # # method_name ( PyObject * self ) ; \
static PyObject * sPy # # method_name ( PyObject * self ) { \
return ( ( class_name * ) self ) - > Py # # method_name ( self ) ; \
} ; \
2008-09-20 11:08:35 +00:00
static const char method_name # # _doc [ ] ; \
2008-07-04 00:05:50 +00:00
2004-06-07 11:03:12 +00:00
/* The line above should remain empty */
/**
* Method table macro ( with doc )
*/
# define KX_PYMETHODTABLE(class_name, method_name) \
2008-10-02 00:22:28 +00:00
{ # method_name , ( PyCFunction ) class_name : : sPy # # method_name , METH_VARARGS , ( PY_METHODCHAR ) class_name : : method_name # # _doc }
2004-06-07 11:03:12 +00:00
2008-12-29 16:36:58 +00:00
# define KX_PYMETHODTABLE_O(class_name, method_name) \
{ # method_name , ( PyCFunction ) class_name : : sPy # # method_name , METH_O , ( PY_METHODCHAR ) class_name : : method_name # # _doc }
# define KX_PYMETHODTABLE_NOARGS(class_name, method_name) \
2008-10-02 00:22:28 +00:00
{ # method_name , ( PyCFunction ) class_name : : sPy # # method_name , METH_NOARGS , ( PY_METHODCHAR ) class_name : : method_name # # _doc }
BGE patch: KX_GameObject::rayCast() improvements to have X-Ray option, return true face normal and hit polygon information.
rayCast(to,from,dist,prop,face,xray,poly):
The face paremeter determines the orientation of the normal:
0 or omitted => hit normal is always oriented towards the ray origin (as if you casted the ray from outside)
1 => hit normal is the real face normal (only for mesh object, otherwise face has no effect)
The ray has X-Ray capability if xray parameter is 1, otherwise the first object hit (other than self object) stops the ray.
The prop and xray parameters interact as follow:
prop off, xray off: return closest hit or no hit if there is no object on the full extend of the ray.
prop off, xray on : idem.
prop on, xray off: return closest hit if it matches prop, no hit otherwise.
prop on, xray on : return closest hit matching prop or no hit if there is no object matching prop on the full extend of the ray.
if poly is 0 or omitted, returns a 3-tuple with object reference, hit point and hit normal or (None,None,None) if no hit.
if poly is 1, returns a 4-tuple with in addition a KX_PolyProxy as 4th element.
The KX_PolyProxy object holds information on the polygon hit by the ray: the index of the vertex forming the poylgon, material, etc.
Attributes (read-only):
matname: The name of polygon material, empty if no material.
material: The material of the polygon
texture: The texture name of the polygon.
matid: The material index of the polygon, use this to retrieve vertex proxy from mesh proxy
v1: vertex index of the first vertex of the polygon, use this to retrieve vertex proxy from mesh proxy
v2: vertex index of the second vertex of the polygon, use this to retrieve vertex proxy from mesh proxy
v3: vertex index of the third vertex of the polygon, use this to retrieve vertex proxy from mesh proxy
v4: vertex index of the fourth vertex of the polygon, 0 if polygon has only 3 vertex
use this to retrieve vertex proxy from mesh proxy
visible: visible state of the polygon: 1=visible, 0=invisible
collide: collide state of the polygon: 1=receives collision, 0=collision free.
Methods:
getMaterialName(): Returns the polygon material name with MA prefix
getMaterial(): Returns the polygon material
getTextureName(): Returns the polygon texture name
getMaterialIndex(): Returns the material bucket index of the polygon.
getNumVertex(): Returns the number of vertex of the polygon.
isVisible(): Returns whether the polygon is visible or not
isCollider(): Returns whether the polygon is receives collision or not
getVertexIndex(vertex): Returns the mesh vertex index of a polygon vertex
getMesh(): Returns a mesh proxy
New methods of KX_MeshProxy have been implemented to retrieve KX_PolyProxy objects:
getNumPolygons(): Returns the number of polygon in the mesh.
getPolygon(index): Gets the specified polygon from the mesh.
More details in PyDoc.
2008-08-27 19:34:19 +00:00
2004-06-07 11:03:12 +00:00
/**
* Function implementation macro
*/
# define KX_PYMETHODDEF_DOC(class_name, method_name, doc_string) \
2008-09-20 11:08:35 +00:00
const char class_name : : method_name # # _doc [ ] = doc_string ; \
2004-07-17 05:28:23 +00:00
PyObject * class_name : : Py # # method_name ( PyObject * , PyObject * args , PyObject * )
2004-06-07 11:03:12 +00:00
2008-12-29 16:36:58 +00:00
# define KX_PYMETHODDEF_DOC_VARARGS(class_name, method_name, doc_string) \
const char class_name : : method_name # # _doc [ ] = doc_string ; \
PyObject * class_name : : Py # # method_name ( PyObject * , PyObject * args )
# define KX_PYMETHODDEF_DOC_O(class_name, method_name, doc_string) \
const char class_name : : method_name # # _doc [ ] = doc_string ; \
PyObject * class_name : : Py # # method_name ( PyObject * , PyObject * value )
# define KX_PYMETHODDEF_DOC_NOARGS(class_name, method_name, doc_string) \
2008-09-20 11:08:35 +00:00
const char class_name : : method_name # # _doc [ ] = doc_string ; \
BGE patch: KX_GameObject::rayCast() improvements to have X-Ray option, return true face normal and hit polygon information.
rayCast(to,from,dist,prop,face,xray,poly):
The face paremeter determines the orientation of the normal:
0 or omitted => hit normal is always oriented towards the ray origin (as if you casted the ray from outside)
1 => hit normal is the real face normal (only for mesh object, otherwise face has no effect)
The ray has X-Ray capability if xray parameter is 1, otherwise the first object hit (other than self object) stops the ray.
The prop and xray parameters interact as follow:
prop off, xray off: return closest hit or no hit if there is no object on the full extend of the ray.
prop off, xray on : idem.
prop on, xray off: return closest hit if it matches prop, no hit otherwise.
prop on, xray on : return closest hit matching prop or no hit if there is no object matching prop on the full extend of the ray.
if poly is 0 or omitted, returns a 3-tuple with object reference, hit point and hit normal or (None,None,None) if no hit.
if poly is 1, returns a 4-tuple with in addition a KX_PolyProxy as 4th element.
The KX_PolyProxy object holds information on the polygon hit by the ray: the index of the vertex forming the poylgon, material, etc.
Attributes (read-only):
matname: The name of polygon material, empty if no material.
material: The material of the polygon
texture: The texture name of the polygon.
matid: The material index of the polygon, use this to retrieve vertex proxy from mesh proxy
v1: vertex index of the first vertex of the polygon, use this to retrieve vertex proxy from mesh proxy
v2: vertex index of the second vertex of the polygon, use this to retrieve vertex proxy from mesh proxy
v3: vertex index of the third vertex of the polygon, use this to retrieve vertex proxy from mesh proxy
v4: vertex index of the fourth vertex of the polygon, 0 if polygon has only 3 vertex
use this to retrieve vertex proxy from mesh proxy
visible: visible state of the polygon: 1=visible, 0=invisible
collide: collide state of the polygon: 1=receives collision, 0=collision free.
Methods:
getMaterialName(): Returns the polygon material name with MA prefix
getMaterial(): Returns the polygon material
getTextureName(): Returns the polygon texture name
getMaterialIndex(): Returns the material bucket index of the polygon.
getNumVertex(): Returns the number of vertex of the polygon.
isVisible(): Returns whether the polygon is visible or not
isCollider(): Returns whether the polygon is receives collision or not
getVertexIndex(vertex): Returns the mesh vertex index of a polygon vertex
getMesh(): Returns a mesh proxy
New methods of KX_MeshProxy have been implemented to retrieve KX_PolyProxy objects:
getNumPolygons(): Returns the number of polygon in the mesh.
getPolygon(index): Gets the specified polygon from the mesh.
More details in PyDoc.
2008-08-27 19:34:19 +00:00
PyObject * class_name : : Py # # method_name ( PyObject * )
2002-10-12 11:37:38 +00:00
2008-12-31 20:35:20 +00:00
/**
* Attribute management
*/
enum KX_PYATTRIBUTE_TYPE {
KX_PYATTRIBUTE_TYPE_BOOL ,
2009-01-02 17:43:56 +00:00
KX_PYATTRIBUTE_TYPE_ENUM ,
2008-12-31 20:35:20 +00:00
KX_PYATTRIBUTE_TYPE_SHORT ,
KX_PYATTRIBUTE_TYPE_INT ,
KX_PYATTRIBUTE_TYPE_FLOAT ,
KX_PYATTRIBUTE_TYPE_STRING ,
KX_PYATTRIBUTE_TYPE_DUMMY ,
2009-03-22 21:36:48 +00:00
KX_PYATTRIBUTE_TYPE_FUNCTION ,
2008-12-31 20:35:20 +00:00
} ;
enum KX_PYATTRIBUTE_ACCESS {
KX_PYATTRIBUTE_RW ,
KX_PYATTRIBUTE_RO
} ;
2009-01-02 17:43:56 +00:00
struct KX_PYATTRIBUTE_DEF ;
2009-03-22 21:36:48 +00:00
typedef int ( * KX_PYATTRIBUTE_CHECK_FUNCTION ) ( void * self , const struct KX_PYATTRIBUTE_DEF * attrdef ) ;
typedef int ( * KX_PYATTRIBUTE_SET_FUNCTION ) ( void * self , const struct KX_PYATTRIBUTE_DEF * attrdef , PyObject * value ) ;
typedef PyObject * ( * KX_PYATTRIBUTE_GET_FUNCTION ) ( void * self , const struct KX_PYATTRIBUTE_DEF * attrdef ) ;
2008-12-31 20:35:20 +00:00
typedef struct KX_PYATTRIBUTE_DEF {
const char * m_name ; // name of the python attribute
KX_PYATTRIBUTE_TYPE m_type ; // type of value
KX_PYATTRIBUTE_ACCESS m_access ; // read/write access or read-only
2009-01-02 17:43:56 +00:00
int m_imin ; // minimum value in case of integer attributes (for string: minimum string length)
int m_imax ; // maximum value in case of integer attributes (for string: maximum string length)
2008-12-31 20:35:20 +00:00
float m_fmin ; // minimum value in case of float attributes
float m_fmax ; // maximum value in case of float attributes
2009-01-02 17:43:56 +00:00
bool m_clamp ; // enforce min/max value by clamping
2008-12-31 20:35:20 +00:00
size_t m_offset ; // position of field in structure
2009-01-02 17:43:56 +00:00
size_t m_size ; // size of field for runtime verification (enum only)
2008-12-31 20:35:20 +00:00
size_t m_length ; // length of array, 1=simple attribute
2009-03-22 21:36:48 +00:00
KX_PYATTRIBUTE_CHECK_FUNCTION m_checkFunction ; // static function to check the assignment, returns 0 if no error
KX_PYATTRIBUTE_SET_FUNCTION m_setFunction ; // static function to check the assignment, returns 0 if no error
KX_PYATTRIBUTE_GET_FUNCTION m_getFunction ; // static function to check the assignment, returns 0 if no error
2008-12-31 20:35:20 +00:00
// The following pointers are just used to have compile time check for attribute type.
// It would have been good to use a union but that would require C99 compatibility
// to initialize specific union fields through designated initializers.
struct {
bool * m_boolPtr ;
short int * m_shortPtr ;
int * m_intPtr ;
float * m_floatPtr ;
STR_String * m_stringPtr ;
} m_typeCheck ;
} PyAttributeDef ;
# define KX_PYATTRIBUTE_DUMMY(name) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
# define KX_PYATTRIBUTE_BOOL_RW(name,object,field) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
# define KX_PYATTRIBUTE_BOOL_RW_CHECK(name,object,field,function) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
# define KX_PYATTRIBUTE_BOOL_RO(name,object,field) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-01-02 17:43:56 +00:00
// enum field cannot be mapped to pointer (because we would need a pointer for each enum)
// use field size to verify mapping at runtime only, assuming enum size is equal to int size.
# define KX_PYATTRIBUTE_ENUM_RW(name,min,max,clamp,object,field) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-01-02 17:43:56 +00:00
# define KX_PYATTRIBUTE_ENUM_RW_CHECK(name,min,max,clamp,object,field,function) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-01-02 17:43:56 +00:00
# define KX_PYATTRIBUTE_ENUM_RO(name,object,field) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-01-02 17:43:56 +00:00
# define KX_PYATTRIBUTE_SHORT_RW(name,min,max,clamp,object,field) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-01-02 17:43:56 +00:00
# define KX_PYATTRIBUTE_SHORT_RW_CHECK(name,min,max,clamp,object,field,function) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
# define KX_PYATTRIBUTE_SHORT_RO(name,object,field) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-01-02 17:43:56 +00:00
# define KX_PYATTRIBUTE_SHORT_ARRAY_RW(name,min,max,clamp,object,field,length) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-01-02 17:43:56 +00:00
# define KX_PYATTRIBUTE_SHORT_ARRAY_RW_CHECK(name,min,max,clamp,object,field,length,function) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
# define KX_PYATTRIBUTE_SHORT_ARRAY_RO(name,object,field,length) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-02-19 23:13:41 +00:00
// SHORT_LIST
# define KX_PYATTRIBUTE_SHORT_LIST_RW(name,min,max,clamp,object,field,length) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-02-19 23:13:41 +00:00
# define KX_PYATTRIBUTE_SHORT_LIST_RW_CHECK(name,min,max,clamp,object,field,length,function) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-02-19 23:13:41 +00:00
# define KX_PYATTRIBUTE_SHORT_LIST_RO(name,object,field,length) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
2009-01-02 17:43:56 +00:00
# define KX_PYATTRIBUTE_INT_RW(name,min,max,clamp,object,field) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-01-02 17:43:56 +00:00
# define KX_PYATTRIBUTE_INT_RW_CHECK(name,min,max,clamp,object,field,function) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
# define KX_PYATTRIBUTE_INT_RO(name,object,field) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-01-02 17:43:56 +00:00
# define KX_PYATTRIBUTE_INT_ARRAY_RW(name,min,max,clamp,object,field,length) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-01-02 17:43:56 +00:00
# define KX_PYATTRIBUTE_INT_ARRAY_RW_CHECK(name,min,max,clamp,object,field,length,function) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
# define KX_PYATTRIBUTE_INT_ARRAY_RO(name,object,field,length) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-02-19 23:13:41 +00:00
// INT_LIST
# define KX_PYATTRIBUTE_INT_LIST_RW(name,min,max,clamp,object,field,length) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-02-19 23:13:41 +00:00
# define KX_PYATTRIBUTE_INT_LIST_RW_CHECK(name,min,max,clamp,object,field,length,function) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-02-19 23:13:41 +00:00
# define KX_PYATTRIBUTE_INT_LIST_RO(name,object,field,length) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
2009-01-02 17:43:56 +00:00
// always clamp for float
2008-12-31 20:35:20 +00:00
# define KX_PYATTRIBUTE_FLOAT_RW(name,min,max,object,field) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
# define KX_PYATTRIBUTE_FLOAT_RW_CHECK(name,min,max,object,field,function) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
# define KX_PYATTRIBUTE_FLOAT_RO(name,object,field) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
# define KX_PYATTRIBUTE_FLOAT_ARRAY_RW(name,min,max,object,field,length) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
# define KX_PYATTRIBUTE_FLOAT_ARRAY_RW_CHECK(name,min,max,object,field,length,function) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
# define KX_PYATTRIBUTE_FLOAT_ARRAY_RO(name,object,field,length) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
2009-01-02 17:43:56 +00:00
# define KX_PYATTRIBUTE_STRING_RW(name,min,max,clamp,object,field) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-01-02 17:43:56 +00:00
# define KX_PYATTRIBUTE_STRING_RW_CHECK(name,min,max,clamp,object,field,function) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2008-12-31 20:35:20 +00:00
# define KX_PYATTRIBUTE_STRING_RO(name,object,field) \
2009-03-22 21:36:48 +00:00
{ 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 } }
2009-03-24 19:37:17 +00:00
# define KX_PYATTRIBUTE_RW_FUNCTION(name,object,getfunction,setfunction) \
2009-03-22 21:36:48 +00:00
{ 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 } }
# define KX_PYATTRIBUTE_RO_FUNCTION(name,object,getfunction) \
{ 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 } }
2009-03-24 19:37:17 +00:00
# define KX_PYATTRIBUTE_ARRAY_RW_FUNCTION(name,object,length,getfunction,setfunction) \
2009-03-22 21:36:48 +00:00
{ 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 } }
# define KX_PYATTRIBUTE_ARRAY_RO_FUNCTION(name,object,length,getfunction) \
{ 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 } }
2008-12-31 20:35:20 +00:00
2009-02-19 23:13:41 +00:00
2002-10-12 11:37:38 +00:00
/*------------------------------
* PyObjectPlus
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
typedef PyTypeObject * PyParentObject ; // Define the PyParent Object
2004-11-22 10:19:19 +00:00
class PyObjectPlus : public PyObject
{ // The PyObjectPlus abstract class
Py_Header ; // Always start with Py_Header
public :
PyObjectPlus ( PyTypeObject * T ) ;
2009-04-17 20:06:06 +00:00
bool m_zombie ;
2004-11-22 10:19:19 +00:00
2005-12-20 09:13:06 +00:00
virtual ~ PyObjectPlus ( ) ; // destructor
2004-11-22 10:19:19 +00:00
static void PyDestructor ( PyObject * P ) // python wrapper
2009-04-17 20:06:06 +00:00
{
2004-11-22 10:19:19 +00:00
delete ( ( PyObjectPlus * ) P ) ;
} ;
2005-12-20 09:13:06 +00:00
// void INCREF(void) {
// Py_INCREF(this);
// }; // incref method
// void DECREF(void) {
// Py_DECREF(this);
// }; // decref method
2004-11-22 10:19:19 +00:00
2009-04-03 14:51:06 +00:00
virtual PyObject * py_getattro ( PyObject * attr ) ; // py_getattro method
2009-04-11 20:58:09 +00:00
static PyObject * py_base_getattro ( PyObject * self , PyObject * attr ) // This should be the entry in Type.
2004-11-22 10:19:19 +00:00
{
2009-04-17 20:06:06 +00:00
if ( ( ( PyObjectPlus * ) self ) - > IsZombie ( ) ) {
if ( ! strcmp ( PyString_AsString ( attr ) , " isValid " ) ) {
Py_RETURN_FALSE ;
}
( ( PyObjectPlus * ) self ) - > IsZombiePyErr ( ) ; /* raise an error */
return NULL ;
}
2009-04-11 20:58:09 +00:00
return ( ( PyObjectPlus * ) self ) - > py_getattro ( attr ) ;
2004-11-22 10:19:19 +00:00
}
2009-04-07 11:06:35 +00:00
static PyObject * py_get_attrdef ( void * self , const PyAttributeDef * attrdef ) ;
static int py_set_attrdef ( void * self , const PyAttributeDef * attrdef , PyObject * value ) ;
#if 0
2009-04-03 14:51:06 +00:00
static PyObject * py_getattro_self ( const PyAttributeDef attrlist [ ] , void * self , PyObject * attr ) ;
static int py_setattro_self ( const PyAttributeDef attrlist [ ] , void * self , PyObject * attr , PyObject * value ) ;
2009-04-07 11:06:35 +00:00
# endif
2004-11-22 10:19:19 +00:00
2009-04-03 14:51:06 +00:00
virtual int py_delattro ( PyObject * attr ) ;
virtual int py_setattro ( PyObject * attr , PyObject * value ) ; // py_setattro method
2009-04-11 20:58:09 +00:00
static int py_base_setattro ( PyObject * self , PyObject * attr , PyObject * value ) // the PyType should reference this
{
2009-04-17 20:06:06 +00:00
if ( ( ( PyObjectPlus * ) self ) - > IsZombie ( ) ) {
/* you cant set isValid anyway */
( ( PyObjectPlus * ) self ) - > IsZombiePyErr ( ) ;
return - 1 ;
}
2009-04-03 14:51:06 +00:00
if ( value = = NULL )
2009-04-17 20:06:06 +00:00
return ( ( PyObjectPlus * ) self ) - > py_delattro ( attr ) ;
2009-04-11 20:58:09 +00:00
2009-04-17 20:06:06 +00:00
return ( ( PyObjectPlus * ) self ) - > py_setattro ( attr , value ) ;
2004-11-22 10:19:19 +00:00
}
2009-04-03 14:51:06 +00:00
virtual PyObject * py_repr ( void ) ; // py_repr method
static PyObject * py_base_repr ( PyObject * PyObj ) // This should be the entry in Type.
2004-11-22 10:19:19 +00:00
{
2009-04-03 14:51:06 +00:00
return ( ( PyObjectPlus * ) PyObj ) - > py_repr ( ) ;
2004-11-22 10:19:19 +00:00
}
// isA methods
bool isA ( PyTypeObject * T ) ;
bool isA ( const char * mytypename ) ;
2009-02-21 12:43:24 +00:00
PyObject * Py_isA ( PyObject * value ) ;
static PyObject * sPy_isA ( PyObject * self , PyObject * value )
2004-11-22 10:19:19 +00:00
{
2009-02-21 12:43:24 +00:00
return ( ( PyObjectPlus * ) self ) - > Py_isA ( value ) ;
2004-11-22 10:19:19 +00:00
}
2009-04-17 20:06:06 +00:00
/* Kindof dumb, always returns True, the false case is checked for, before this function gets accessed */
static PyObject * pyattr_get_is_valid ( void * self_v , const KX_PYATTRIBUTE_DEF * attrdef ) ;
bool IsZombie ( )
{
return m_zombie ;
}
bool IsZombiePyErr ( )
{
if ( m_zombie ) {
/*
PyObject * this_pystr = PyObject_Repr ( this ) ;
PyErr_Format (
PyExc_RuntimeError ,
" \" %s \" of type \" %s \" has been freed by the blender game engine, "
" scripts cannot access this anymore, check for this case with the \" isValid \" attribute " ,
PyString_AsString ( this_pystr ) , ob_type - > tp_name ) ;
Py_DECREF ( this_pystr ) ;
*/
PyErr_SetString ( PyExc_RuntimeError , " This value has been freed by the blender game engine but python is still holding a reference, this value cant be used. " ) ;
}
return m_zombie ;
}
void SetZombie ( bool is_zombie )
{
m_zombie = is_zombie ;
}
2002-10-12 11:37:38 +00:00
} ;
2009-04-07 16:00:32 +00:00
PyObject * py_getattr_dict ( PyObject * pydict , PyObject * tp_dict ) ;
2009-02-26 09:04:06 +00:00
2002-10-12 11:37:38 +00:00
# endif // _adr_py_lib_h_
# endif //NO_EXP_PYTHON_EMBEDDING