Index: Object.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/python/api2_2x/Object.c,v retrieving revision 1.81 diff -u -r1.81 Object.c --- Object.c 3 Jul 2004 05:17:01 -0000 1.81 +++ Object.c 19 Jul 2004 13:54:16 -0000 @@ -46,7 +46,7 @@ /*****************************************************************************/ -/* Python API function prototypes for the Blender module. */ +/* Python API function prototypes for the Blender module. */ /*****************************************************************************/ static PyObject *M_Object_New(PyObject *self, PyObject *args); PyObject *M_Object_Get(PyObject *self, PyObject *args); @@ -55,9 +55,9 @@ static PyObject *M_Object_getSelected (PyObject *self, PyObject *args); /*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Object.__doc__ */ +/* The following string definitions are used for documentation strings. */ +/* In Python these will be written to the console when doing a */ +/* Blender.Object.__doc__ */ /*****************************************************************************/ char M_Object_doc[] = "The Blender Object module\n\n\ @@ -77,7 +77,7 @@ The active object is the first in the list, if visible"; /*****************************************************************************/ -/* Python method structure definition for Blender.Object module: */ +/* Python method structure definition for Blender.Object module: */ /*****************************************************************************/ struct PyMethodDef M_Object_methods[] = { {"New", (PyCFunction)M_Object_New, METH_VARARGS, @@ -291,10 +291,9 @@ /* PythonTypeObject callback function prototypes */ /*****************************************************************************/ static void Object_dealloc (BPy_Object *obj); -static PyObject* Object_getAttr (BPy_Object *obj, char *name); -static int Object_setAttr (BPy_Object *obj, char *name, PyObject *v); static PyObject* Object_repr (BPy_Object *obj); static int Object_compare (BPy_Object *a, BPy_Object *b); +static PyGetSetDef BPy_Object_getset[]; /*****************************************************************************/ /* Python TypeObject structure definition. */ @@ -302,26 +301,28 @@ PyTypeObject Object_Type = { PyObject_HEAD_INIT(NULL) - 0, /* ob_size */ - "Blender Object", /* tp_name */ + 0, /* ob_size */ + "Blender Object", /* tp_name */ sizeof (BPy_Object), /* tp_basicsize */ - 0, /* tp_itemsize */ + 0, /* tp_itemsize */ /* methods */ - (destructor)Object_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - (getattrfunc)Object_getAttr, /* tp_getattr */ - (setattrfunc)Object_setAttr, /* tp_setattr */ + (destructor)Object_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + NULL, /* tp_getattr */ + NULL, /* tp_setattr */ (cmpfunc)Object_compare, /* tp_compare */ (reprfunc)Object_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_as_hash */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_as_hash */ 0,0,0,0,0,0, - 0, /* tp_doc */ + 0, /* tp_doc */ 0,0,0,0,0,0, BPy_Object_methods, /* tp_methods */ - 0, /* tp_members */ + 0, /* tp_members */ + .tp_getset = BPy_Object_getset, + .tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, }; /*****************************************************************************/ @@ -576,7 +577,8 @@ { PyObject * module; - Object_Type.ob_type = &PyType_Type; + if (PyType_Ready(&Object_Type) < 0) + return NULL; module = Py_InitModule3("Blender.Object", M_Object_methods, M_Object_doc); @@ -1986,6 +1988,11 @@ { BPy_Object * blen_object; + if (obj == NULL) + { + return (NULL); + } + blen_object = (BPy_Object*)PyObject_NEW (BPy_Object, &Object_Type); if (blen_object == NULL) @@ -2055,356 +2062,181 @@ PyObject_DEL (obj); } -/*****************************************************************************/ -/* Function: Object_getAttr */ -/* Description: This is a callback function for the BlenObject type. It is */ -/* the function that retrieves any value from Blender and */ -/* passes it to Python. */ -/*****************************************************************************/ -static PyObject* Object_getAttr (BPy_Object *obj, char *name) -{ - struct Object * object; - struct Ika * ika; - - object = obj->object; - if (StringEqual (name, "LocX")) - return (PyFloat_FromDouble(object->loc[0])); - if (StringEqual (name, "LocY")) - return (PyFloat_FromDouble(object->loc[1])); - if (StringEqual (name, "LocZ")) - return (PyFloat_FromDouble(object->loc[2])); - if (StringEqual (name, "loc")) - return (Py_BuildValue ("fff", object->loc[0], object->loc[1], - object->loc[2])); - if (StringEqual (name, "dLocX")) - return (PyFloat_FromDouble(object->dloc[0])); - if (StringEqual (name, "dLocY")) - return (PyFloat_FromDouble(object->dloc[1])); - if (StringEqual (name, "dLocZ")) - return (PyFloat_FromDouble(object->dloc[2])); - if (StringEqual (name, "dloc")) - return (Py_BuildValue ("fff", object->dloc[0], object->dloc[1], - object->dloc[2])); - if (StringEqual (name, "RotX")) - return (PyFloat_FromDouble(object->rot[0])); - if (StringEqual (name, "RotY")) - return (PyFloat_FromDouble(object->rot[1])); - if (StringEqual (name, "RotZ")) - return (PyFloat_FromDouble(object->rot[2])); - if (StringEqual (name, "rot")) - return (Py_BuildValue ("fff", object->rot[0], object->rot[1], - object->rot[2])); - if (StringEqual (name, "dRotX")) - return (PyFloat_FromDouble(object->drot[0])); - if (StringEqual (name, "dRotY")) - return (PyFloat_FromDouble(object->drot[1])); - if (StringEqual (name, "dRotZ")) - return (PyFloat_FromDouble(object->drot[2])); - if (StringEqual (name, "drot")) - return (Py_BuildValue ("fff", object->drot[0], object->drot[1], - object->drot[2])); - if (StringEqual (name, "SizeX")) - return (PyFloat_FromDouble(object->size[0])); - if (StringEqual (name, "SizeY")) - return (PyFloat_FromDouble(object->size[1])); - if (StringEqual (name, "SizeZ")) - return (PyFloat_FromDouble(object->size[2])); - if (StringEqual (name, "size")) - return (Py_BuildValue ("fff", object->size[0], object->size[1], - object->size[2])); - if (StringEqual (name, "dSizeX")) - return (PyFloat_FromDouble(object->dsize[0])); - if (StringEqual (name, "dSizeY")) - return (PyFloat_FromDouble(object->dsize[1])); - if (StringEqual (name, "dSizeZ")) - return (PyFloat_FromDouble(object->dsize[2])); - if (StringEqual (name, "dsize")) - return (Py_BuildValue ("fff", object->dsize[0], object->dsize[1], - object->dsize[2])); - if (strncmp (name,"Eff", 3) == 0) - { - if ( (object->type == OB_IKA) && (object->data != NULL) ) - { - ika = object->data; - switch (name[3]) - { - case 'X': - return (PyFloat_FromDouble (ika->effg[0])); - case 'Y': - return (PyFloat_FromDouble (ika->effg[1])); - case 'Z': - return (PyFloat_FromDouble (ika->effg[2])); - default: - /* Do we need to display a sensible error message here? */ - return (NULL); - } - } - return (NULL); - } - if (StringEqual (name, "Layer")) - return (PyInt_FromLong(object->lay)); - if (StringEqual (name, "parent")) - { - if (object->parent) - return (Object_CreatePyObject (object->parent)); - else - { - Py_INCREF (Py_None); - return (Py_None); - } - } +/* Attribute getter functions */ +#define OBJECT_ATTR_GET_AXIS(attr) \ +static PyObject* Object_get_##attr(PyObject *self, void *axis_gen) \ +{ \ + BPy_Object *obj = (BPy_Object*) self; \ + int axis = (int)axis_gen; \ + struct Object *object = obj->object; \ + \ + return PyFloat_FromDouble(object->attr[axis]); \ +} + +#define OBJECT_ATTR_GET3(attr) \ +static PyObject* Object_get3_##attr(PyObject *self, void *unused) \ +{ \ + BPy_Object *obj = (BPy_Object*) self; \ + struct Object *object = obj->object; \ + \ + return Py_BuildValue ("fff", \ + object->attr[0], object->attr[1], object->attr[2]); \ +} +OBJECT_ATTR_GET_AXIS(loc) +OBJECT_ATTR_GET_AXIS(dloc) +OBJECT_ATTR_GET3(dloc) +OBJECT_ATTR_GET_AXIS(rot) +OBJECT_ATTR_GET3(rot) +OBJECT_ATTR_GET_AXIS(drot) +OBJECT_ATTR_GET3(drot) +OBJECT_ATTR_GET_AXIS(size) +OBJECT_ATTR_GET_AXIS(dsize) +OBJECT_ATTR_GET3(dsize) +#define OBJECT_ATTR_GET_INT(attr) \ +static PyObject* Object_get_##attr(PyObject *self, void *unused) \ +{ \ + BPy_Object *obj = (BPy_Object*) self; \ + struct Object *object = obj->object; \ + \ + return PyInt_FromLong(object->attr); \ +} +OBJECT_ATTR_GET_INT(lay) +OBJECT_ATTR_GET_INT(colbits) +static PyObject* Object_get_eff(PyObject *self, void *axis_gen) +{ + BPy_Object *obj = (BPy_Object*) self; + struct Object *object = obj->object; + int axis = (int)axis_gen; - if (StringEqual (name, "track")) - return (Object_CreatePyObject (object->track)); - if (StringEqual (name, "data")) - return (Object_getData (obj)); - if (StringEqual (name, "ipo")) + if ( (object->type == OB_IKA) && (object->data != NULL) ) { - if (object->ipo == NULL) - { - /* There's no ipo linked to the object, return Py_None. */ - Py_INCREF (Py_None); - return (Py_None); - } - return (Ipo_CreatePyObject (object->ipo)); + struct Ika *ika = object->data; + return (PyFloat_FromDouble (ika->effg[axis])); } - if (StringEqual (name, "mat") || StringEqual (name, "matrix")) - return (Object_getMatrix (obj, Py_BuildValue("(s)","localspace"))); - if (StringEqual (name, "matrixWorld")) - return (Object_getMatrix (obj, Py_BuildValue("(s)","worldspace"))); - if (StringEqual (name, "matrixLocal")) - return (Object_getMatrix (obj, Py_BuildValue("(s)","localspace"))); - if (StringEqual (name, "colbits")) - return (Py_BuildValue ("h", object->colbits)); - if (StringEqual (name, "drawType")) - return (Py_BuildValue ("b", object->dt)); - if (StringEqual (name, "drawMode")) - return (Py_BuildValue ("b", object->dtx)); - if (StringEqual (name, "name")) - return (Py_BuildValue ("s", object->id.name+2)); - if (StringEqual (name, "sel")) - return (Object_isSelected (obj)); - - /* not an attribute, search the methods table */ - return Py_FindMethod(BPy_Object_methods, (PyObject *)obj, name); + else + return EXPP_incr_ret (Py_None); } - -/*****************************************************************************/ -/* Function: Object_setAttr */ -/* Description: This is a callback function for the BlenObject type. It is */ -/* the function that retrieves any value from Python and sets */ -/* it accordingly in Blender. */ -/*****************************************************************************/ -static int Object_setAttr (BPy_Object *obj, char *name, PyObject *value) +static PyObject* Object_get_matrix(PyObject *self, void *which) { - PyObject * valtuple; - struct Object * object; - struct Ika * ika; + BPy_Object *obj = (BPy_Object*) self; + return (Object_getMatrix (obj, Py_BuildValue("(s)",which))); +} - /* First put the value(s) in a tuple. For some variables, we want to */ - /* pass the values to a function, and these functions only accept */ - /* PyTuples. */ - valtuple = Py_BuildValue ("(O)", value); - if (!valtuple) - { - return EXPP_ReturnIntError(PyExc_MemoryError, - "Object_setAttr: couldn't create PyTuple"); - } - - object = obj->object; - if (StringEqual (name, "LocX")) - return (!PyArg_Parse (value, "f", &(object->loc[0]))); - if (StringEqual (name, "LocY")) - return (!PyArg_Parse (value, "f", &(object->loc[1]))); - if (StringEqual (name, "LocZ")) - return (!PyArg_Parse (value, "f", &(object->loc[2]))); - if (StringEqual (name, "loc")) - { - if (Object_setLocation (obj, valtuple) != Py_None) - return (-1); - else - return (0); - } - if (StringEqual (name, "dLocX")) - return (!PyArg_Parse (value, "f", &(object->dloc[0]))); - if (StringEqual (name, "dLocY")) - return (!PyArg_Parse (value, "f", &(object->dloc[1]))); - if (StringEqual (name, "dLocZ")) - return (!PyArg_Parse (value, "f", &(object->dloc[2]))); - if (StringEqual (name, "dloc")) - { - if (Object_setDeltaLocation (obj, valtuple) != Py_None) - return (-1); - else - return (0); - } - if (StringEqual (name, "RotX")) - return (!PyArg_Parse (value, "f", &(object->rot[0]))); - if (StringEqual (name, "RotY")) - return (!PyArg_Parse (value, "f", &(object->rot[1]))); - if (StringEqual (name, "RotZ")) - return (!PyArg_Parse (value, "f", &(object->rot[2]))); - if (StringEqual (name, "rot")) - { - if (Object_setEuler (obj, valtuple) != Py_None) - return (-1); - else - return (0); - } - if (StringEqual (name, "dRotX")) - return (!PyArg_Parse (value, "f", &(object->drot[0]))); - if (StringEqual (name, "dRotY")) - return (!PyArg_Parse (value, "f", &(object->drot[1]))); - if (StringEqual (name, "dRotZ")) - return (!PyArg_Parse (value, "f", &(object->drot[2]))); - if (StringEqual (name, "drot")) - return (!PyArg_ParseTuple (value, "fff", &(object->drot[0]), - &(object->drot[1]), &(object->drot[2]))); - if (StringEqual (name, "SizeX")) - return (!PyArg_Parse (value, "f", &(object->size[0]))); - if (StringEqual (name, "SizeY")) - return (!PyArg_Parse (value, "f", &(object->size[1]))); - if (StringEqual (name, "SizeZ")) - return (!PyArg_Parse (value, "f", &(object->size[2]))); - if (StringEqual (name, "size")) - return (!PyArg_ParseTuple (value, "fff", &(object->size[0]), - &(object->size[1]), &(object->size[2]))); - if (StringEqual (name, "dSizeX")) - return (!PyArg_Parse (value, "f", &(object->dsize[0]))); - if (StringEqual (name, "dSizeY")) - return (!PyArg_Parse (value, "f", &(object->dsize[1]))); - if (StringEqual (name, "dSizeZ")) - return (!PyArg_Parse (value, "f", &(object->dsize[2]))); - if (StringEqual (name, "dsize")) - return (!PyArg_ParseTuple (value, "fff", &(object->dsize[0]), - &(object->dsize[1]), &(object->dsize[2]))); - if (strncmp (name,"Eff", 3) == 0) - { - if ( (object->type == OB_IKA) && (object->data != NULL) ) - { - ika = object->data; - switch (name[3]) - { - case 'X': - return (!PyArg_Parse (value, "f", &(ika->effg[0]))); - case 'Y': - return (!PyArg_Parse (value, "f", &(ika->effg[1]))); - case 'Z': - return (!PyArg_Parse (value, "f", &(ika->effg[2]))); - default: - /* Do we need to display a sensible error message here? */ - return (0); - } - } - return (0); - } - if (StringEqual (name, "Layer")) - { + +/* Attribute setter functions */ + +#define OBJECT_ATTR_SET_AXIS(attr) \ +static PyObject* Object_set_##attr(PyObject *self, PyObject *value, void *axis_gen) \ +{ \ + BPy_Object *obj = (BPy_Object*) self; \ + int axis = axis_gen; \ + struct Object *object = obj->object; \ + \ + return !PyArg_Parse(value, "f", &(object->attr[axis])); \ +} +#define OBJECT_SETTER_WRAP(attr) \ +static PyObject* Object_setwrap_##attr(PyObject *self, PyObject *value, void *unused) \ +{ \ + BPy_Object *obj = (BPy_Object*) self; \ + \ + if (Object_##attr (obj, value) != Py_None) \ + return (-1); \ + else \ + { \ + Py_DECREF (Py_None); \ + return (0); \ + } \ +} +#define OBJECT_ATTR_SET3(attr) \ +static PyObject* Object_set3_##attr(PyObject *self, PyObject *value, void *unused) \ +{ \ + BPy_Object *obj = (BPy_Object*) self; \ + struct Object *object = obj->object; \ + \ + return !PyArg_Parse(value, "fff", \ + &(object->attr[0]), &(object->attr[1]), &(object->attr[2])); \ +} +OBJECT_ATTR_SET_AXIS(loc) +OBJECT_SETTER_WRAP(setLocation) +OBJECT_ATTR_SET_AXIS(dloc) +OBJECT_SETTER_WRAP(setDeltaLocation) +OBJECT_ATTR_SET_AXIS(rot) +OBJECT_SETTER_WRAP(setEuler) +OBJECT_ATTR_SET_AXIS(drot) +OBJECT_ATTR_SET3(drot) +OBJECT_ATTR_SET_AXIS(size) +OBJECT_ATTR_SET3(size) +OBJECT_ATTR_SET_AXIS(dsize) +OBJECT_ATTR_SET3(dsize) + +static PyObject* Object_set_eff(PyObject *self, PyObject *value, void *axis_gen) +{ + BPy_Object *obj = (BPy_Object*) self; + struct Object *object = obj->object; + int axis = (int)axis_gen; + + if ( (object->type == OB_IKA) && (object->data != NULL) ) + { + struct Ika *ika = object->data; + return (!PyArg_Parse (value, "f", &(ika->effg[axis]))); + } + else + return EXPP_ReturnIntError(PyExc_AttributeError, + "Object has no Ika data"); +} +static PyObject* Object_set_Layer(PyObject *self, PyObject *value, void *unused) +{ /* usage note: caller of this func needs to do a Blender.Redraw(-1) to update and redraw the interface */ + BPy_Object *obj = (BPy_Object*) self; + struct Object *object = obj->object; - Base *base; - int newLayer; - int local; - if(PyArg_Parse (value, "i", &newLayer)){ - /* uppper 2 bytes are for local view */ - newLayer &= 0x00FFFFFF; - if( newLayer == 0 ) /* bail if nothing to do */ - return( 0 ); - - /* update any bases pointing to our object */ - base = FIRSTBASE; - if( base->object == obj->object ){ - local = base->lay &= 0xFF000000; - base->lay = local | newLayer; - object->lay = base->lay; - } - countall(); - } - else{ - return EXPP_ReturnIntError(PyExc_AttributeError, - "expected int as bitmask"); + Base *base; + int newLayer; + int local; + if(PyArg_Parse (value, "i", &newLayer)) + { + /* upper 2 bytes are for local view */ + newLayer &= 0x00FFFFFF; + if( newLayer == 0 ) /* bail if nothing to do */ + return( 0 ); + + /* update any bases pointing to our object */ + base = FIRSTBASE; + if( base->object == obj->object ) + { + local = base->lay &= 0xFF000000; + base->lay = local | newLayer; + object->lay = base->lay; } - + countall(); return( 0 ); } - if (StringEqual (name, "parent")) - { - /* This is not allowed. */ - EXPP_ReturnPyObjError (PyExc_AttributeError, - "Setting the parent is not allowed."); - return (0); - } - if (StringEqual (name, "track")) - { - if (Object_makeTrack (obj, valtuple) != Py_None) - return (-1); - else - return (0); - } - if (StringEqual (name, "data")) - { - /* This is not allowed. */ - EXPP_ReturnPyObjError (PyExc_AttributeError, - "Setting the data is not allowed."); - return (0); - } - if (StringEqual (name, "ipo")) - { - /* This is not allowed. */ - EXPP_ReturnPyObjError (PyExc_AttributeError, - "Setting the ipo is not allowed."); - return (0); - } - if (StringEqual (name, "mat")) - { - /* This is not allowed. */ - EXPP_ReturnPyObjError (PyExc_AttributeError, - "Setting the matrix is not allowed."); - return (0); - } - if (StringEqual (name, "matrix")) - { - /* This is not allowed. */ - EXPP_ReturnPyObjError (PyExc_AttributeError, - "Please use .setMatrix(matrix)"); - return (0); - } - if (StringEqual (name, "colbits")) - return (!PyArg_Parse (value, "h", &(object->colbits))); - if (StringEqual (name, "drawType")) - { - if (Object_setDrawType (obj, valtuple) != Py_None) - return (-1); - else - return (0); - } - if (StringEqual (name, "drawMode")) - { - if (Object_setDrawMode (obj, valtuple) != Py_None) - return (-1); - else - return (0); - } - if (StringEqual (name, "name")) - { - if (Object_setName (obj, valtuple) != Py_None) - return (-1); - else - return (0); - } - - if (StringEqual (name, "sel")) + else { - if (Object_Select (obj, valtuple) != Py_None) - return (-1); - else - return (0); + return EXPP_ReturnIntError(PyExc_TypeError, + "expected int as bitmask"); } - - printf ("Unknown variable.\n"); - return (0); } +OBJECT_SETTER_WRAP(makeTrack) +#if 0 +static PyObject* Object_set_attrexception(PyObject *self, PyObject *value, void *string) +{ + return EXPP_ReturnIntError(PyExc_AttributeError, string); +} +#endif +static PyObject* Object_set_colbits(PyObject *self, PyObject *value, void *unused) +{ + BPy_Object *obj = (BPy_Object*) self; + struct Object *object = obj->object; + + return (!PyArg_Parse (value, "h", &(object->colbits))); +} +OBJECT_SETTER_WRAP(setDrawType) +OBJECT_SETTER_WRAP(setDrawMode) +OBJECT_SETTER_WRAP(setName) +OBJECT_SETTER_WRAP(Select) + /*****************************************************************************/ /* Function: Object_compare */ @@ -2429,3 +2261,53 @@ { return PyString_FromFormat("[Object \"%s\"]", self->object->id.name+2); } + +/* Moved this down here, as it's horribly tedious to copy prototypes */ +static PyGetSetDef BPy_Object_getset[] = +{ + /* Many of these functions (particularly getters not starting with Object_get_ or + * Object_get3_) are incompatible pointers. Check your system's calling convention, + * it works on most but is not guaranteed to be portable. */ + {"LocX", Object_get_loc, Object_set_loc, "Location along X-axis", 0}, + {"LocY", Object_get_loc, Object_set_loc, "Location along Y-axis", 1}, + {"LocZ", Object_get_loc, Object_set_loc, "Location along Z-axis", 2}, + {"loc", Object_getLocation, Object_setwrap_setLocation, "Location [x,y,z]", NULL}, + {"dLocX", Object_get_dloc, Object_set_dloc, "Delta location along X-axis", 0}, + {"dLocY", Object_get_dloc, Object_set_dloc, "Delta location along Y-axis", 1}, + {"dLocZ", Object_get_dloc, Object_set_dloc, "Delta location along Z-axis", 2}, + {"dloc", Object_get3_dloc, Object_setwrap_setDeltaLocation, "Delta location [x,y,z]", NULL}, + {"RotX", Object_get_rot, Object_set_rot, "Rotation around X-axis", 0}, + {"RotY", Object_get_rot, Object_set_rot, "Rotation around Y-axis", 1}, + {"RotZ", Object_get_rot, Object_set_rot, "Rotation around Z-axis", 2}, + {"rot", Object_get3_rot, Object_setwrap_setEuler, "Rotation [x,y,z]", NULL}, + {"dRotX", Object_get_drot, Object_set_drot, "Delta rotation around X-axis", 0}, + {"dRotY", Object_get_drot, Object_set_drot, "Delta rotation around Y-axis", 1}, + {"dRotZ", Object_get_drot, Object_set_drot, "Delta rotation around Z-axis", 2}, + {"drot", Object_get3_drot, Object_set3_drot, "Delta rotation [x,y,z]", NULL}, + {"SizeX", Object_get_size, Object_set_size, "Scaling in X-axis", 0}, + {"SizeY", Object_get_size, Object_set_size, "Scaling in Y-axis", 1}, + {"SizeZ", Object_get_size, Object_set_size, "Scaling in Z-axis", 2}, + {"size", Object_getSize, Object_set3_size, "Scaling [x,y,z]", NULL}, + {"dSizeX", Object_get_dsize, Object_set_dsize, "Delta scaling in X-axis", 0}, + {"dSizeY", Object_get_dsize, Object_set_dsize, "Delta scaling in Y-axis", 1}, + {"dSizeZ", Object_get_dsize, Object_set_dsize, "Delta scaling in Z-axis", 2}, + {"dsize", Object_get3_dsize, Object_set3_dsize, "Delta scaling [x,y,z]", NULL}, + {"EffX", Object_get_eff, Object_set_eff, "Effector for X-axis", 0}, + {"EffY", Object_get_eff, Object_set_eff, "Effector for Y-axis", 1}, + {"EffZ", Object_get_eff, Object_set_eff, "Effector for Z-axis", 2}, + {"Layer", Object_get_lay, Object_set_Layer, "Object layers", NULL}, + {"parent", Object_getParent, NULL, "parent Object", NULL}, + {"track", Object_getTracked, Object_setwrap_makeTrack, "Object being tracked", NULL}, + {"data", Object_getData, NULL, "ObData", NULL}, + {"ipo", Object_getIpo, NULL, "Object Ipo", NULL}, + {"mat", Object_get_matrix, NULL, "localspace matrix", "localspace"}, + {"matrixLocal", Object_get_matrix, NULL, "localspace matrix", "localspace"}, + {"matrixWorld", Object_get_matrix, NULL, "worldspace matrix", "worldspace"}, + {"colbits", Object_get_colbits, Object_set_colbits, "Bitmask for Object Materials vs Data Materials", NULL}, + {"drawType", Object_getDrawType, Object_setwrap_setDrawType, "drawing type", NULL}, + {"drawMode", Object_getDrawMode, Object_setwrap_setDrawMode, "drawing mode", NULL}, + {"name", Object_getName, Object_setwrap_setName, "Object name", NULL}, + {"sel", Object_isSelected, Object_setwrap_Select, "whether object is selected", NULL}, + {NULL} +}; +