diff options
author | Michel Selten <michel@mselten.demon.nl> | 2003-05-21 23:54:19 +0400 |
---|---|---|
committer | Michel Selten <michel@mselten.demon.nl> | 2003-05-21 23:54:19 +0400 |
commit | 000f92e204b54d117789209b00fee88f279be6e1 (patch) | |
tree | 9cde1c1fe9937ed8ec74605e7088079d4789c0f2 | |
parent | 64f0bdd9546df2662824c8a54a96db7a9bff1110 (diff) |
* Implemented more of the Object module.
* Keep a Python Object reference for parent and track objects when available.
-rw-r--r-- | source/blender/python/api2_2x/Object.c | 159 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Object.h | 10 |
2 files changed, 155 insertions, 14 deletions
diff --git a/source/blender/python/api2_2x/Object.c b/source/blender/python/api2_2x/Object.c index e83c361cbc5..3118069706c 100644 --- a/source/blender/python/api2_2x/Object.c +++ b/source/blender/python/api2_2x/Object.c @@ -173,6 +173,7 @@ PyObject *M_Object_New(PyObject *self, PyObject *args) blen_object = (C_Object*)PyObject_NEW (C_Object, &object_type); blen_object->object = object; blen_object->data = NULL; + blen_object->parent = NULL; return ((PyObject*)blen_object); } @@ -317,7 +318,6 @@ static PyObject *Object_clrParent (C_Object *self, PyObject *args) { int mode=0; int fast=0; - Object * parent; if (!PyArg_ParseTuple (args, "|ii", &mode, &fast)) { @@ -325,8 +325,9 @@ static PyObject *Object_clrParent (C_Object *self, PyObject *args) "expected one or two integers as arguments")); } - parent = self->object->parent; - self->object->parent = 0; + /* Remove the link only, the object is still in the scene. */ + self->object->parent = NULL; + self->parent = NULL; if (mode == 2) { @@ -418,7 +419,15 @@ static PyObject *Object_getDeformData (C_Object *self) static PyObject *Object_getDeltaLocation (C_Object *self) { - return (Py_None); + PyObject *attr = Py_BuildValue ("fff", + self->object->dloc[0], + self->object->dloc[1], + self->object->dloc[2]); + + if (attr) return (attr); + + return (PythonReturnErrorObject (PyExc_RuntimeError, + "couldn't get Object.dloc attributes")); } static PyObject *Object_getDrawMode (C_Object *self) @@ -428,12 +437,29 @@ static PyObject *Object_getDrawMode (C_Object *self) static PyObject *Object_getDrawType (C_Object *self) { + /* TODO: this needs to be verified, if the api is correct! */ +/* + PyObject *attr = Py_BuildValue ("b", self->object->dt); + + if (attr) return (attr); + + return (PythonReturnErrorObject (PyExc_RuntimeError, + "couldn't get Object.drawType attribute")); +*/ return (Py_None); } static PyObject *Object_getEuler (C_Object *self) { - return (Py_None); + PyObject *attr = Py_BuildValue ("fff", + self->object->drot[0], + self->object->drot[1], + self->object->drot[2]); + + if (attr) return (attr); + + return (PythonReturnErrorObject (PyExc_RuntimeError, + "couldn't get Object.drot attributes")); } static PyObject *Object_getInverseMatrix (C_Object *self) @@ -443,11 +469,20 @@ static PyObject *Object_getInverseMatrix (C_Object *self) static PyObject *Object_getLocation (C_Object *self, PyObject *args) { - return (Py_None); + PyObject *attr = Py_BuildValue ("fff", + self->object->loc[0], + self->object->loc[1], + self->object->loc[2]); + + if (attr) return (attr); + + return (PythonReturnErrorObject (PyExc_RuntimeError, + "couldn't get Object.loc attributes")); } static PyObject *Object_getMaterials (C_Object *self) { + /* TODO: Implement when the Material module is implemented. */ return (Py_None); } @@ -458,12 +493,48 @@ static PyObject *Object_getMatrix (C_Object *self) static PyObject *Object_getParent (C_Object *self) { - return (Py_None); + PyObject *attr; + + if (self->parent) + { + Py_INCREF ((PyObject*)self->parent); + return ((PyObject*)self->parent); + } + + /* TODO: what if self->object->parent==NULL? Should we return Py_None? */ + attr = M_ObjectCreatePyObject (self->object->parent); + + if (attr) + { + self->parent = (struct C_Object*)attr; + return (attr); + } + + return (PythonReturnErrorObject (PyExc_RuntimeError, + "couldn't get Object.parent attribute")); } static PyObject *Object_getTracked (C_Object *self) { - return (Py_None); + PyObject *attr; + + if (self->track) + { + Py_INCREF ((PyObject*)self->track); + return ((PyObject*)self->track); + } + + /* TODO: what if self->object->track==NULL? Should we return Py_None? */ + attr = M_ObjectCreatePyObject (self->object->track); + + if (attr) + { + self->track = (struct C_Object*)attr; + return (attr); + } + + return (PythonReturnErrorObject (PyExc_RuntimeError, + "couldn't get Object.track attribute")); } static PyObject *Object_getType (C_Object *self) @@ -543,6 +614,7 @@ static PyObject *Object_makeParent (C_Object *self, PyObject *args) { PyObject * list; PyObject * py_child; + C_Object * py_obj_child; Object * child; Object * parent; int noninverse; @@ -583,6 +655,8 @@ static PyObject *Object_makeParent (C_Object *self, PyObject *args) } child->partype = PAROBJECT; child->parent = parent; + py_obj_child = (C_Object *) py_child; + py_obj_child->parent = (struct C_Object *)self; if (noninverse == 1) { /* Parent inverse = unity */ @@ -614,6 +688,21 @@ static PyObject *Object_materialUsage (C_Object *self, PyObject *args) static PyObject *Object_setDeltaLocation (C_Object *self, PyObject *args) { + float dloc1; + float dloc2; + float dloc3; + + if (!PyArg_Parse (args, "fff", &dloc1, &dloc2, &dloc3)) + { + return (PythonReturnErrorObject (PyExc_TypeError, + "expected three float arguments")); + } + + self->object->dloc[1] = dloc1; + self->object->dloc[2] = dloc2; + self->object->dloc[3] = dloc3; + + Py_INCREF (Py_None); return (Py_None); } @@ -629,11 +718,41 @@ static PyObject *Object_setDrawType (C_Object *self, PyObject *args) static PyObject *Object_setEuler (C_Object *self, PyObject *args) { + float drot1; + float drot2; + float drot3; + + if (!PyArg_Parse (args, "fff", &drot1, &drot2, &drot3)) + { + return (PythonReturnErrorObject (PyExc_TypeError, + "expected three float arguments")); + } + + self->object->drot[1] = drot1; + self->object->drot[2] = drot2; + self->object->drot[3] = drot3; + + Py_INCREF (Py_None); return (Py_None); } static PyObject *Object_setLocation (C_Object *self, PyObject *args) { + float loc1; + float loc2; + float loc3; + + if (!PyArg_Parse (args, "fff", &loc1, &loc2, &loc3)) + { + return (PythonReturnErrorObject (PyExc_TypeError, + "expected three float arguments")); + } + + self->object->loc[1] = loc1; + self->object->loc[2] = loc2; + self->object->loc[3] = loc3; + + Py_INCREF (Py_None); return (Py_None); } @@ -840,8 +959,12 @@ static int ObjectSetAttr (C_Object *obj, char *name, PyObject *value) if (StringEqual (name, "LocZ")) return (!PyArg_Parse (value, "f", &(object->loc[2]))); if (StringEqual (name, "loc")) - return (!PyArg_Parse (value, "fff", &(object->loc[0]), - &(object->loc[1]), &(object->loc[2]))); + { + if (Object_setLocation (obj, value) != Py_None) + return (-1); + else + return (0); + } if (StringEqual (name, "dLocX")) return (!PyArg_Parse (value, "f", &(object->dloc[0]))); if (StringEqual (name, "dLocY")) @@ -849,8 +972,12 @@ static int ObjectSetAttr (C_Object *obj, char *name, PyObject *value) if (StringEqual (name, "dLocZ")) return (!PyArg_Parse (value, "f", &(object->dloc[2]))); if (StringEqual (name, "dloc")) - return (!PyArg_Parse (value, "fff", &(object->dloc[0]), - &(object->dloc[1]), &(object->dloc[2]))); + { + if (Object_setDeltaLocation (obj, value) != Py_None) + return (-1); + else + return (0); + } if (StringEqual (name, "RotX")) return (!PyArg_Parse (value, "f", &(object->rot[0]))); if (StringEqual (name, "RotY")) @@ -858,8 +985,12 @@ static int ObjectSetAttr (C_Object *obj, char *name, PyObject *value) if (StringEqual (name, "RotZ")) return (!PyArg_Parse (value, "f", &(object->rot[2]))); if (StringEqual (name, "rot")) - return (!PyArg_Parse (value, "fff", &(object->rot[0]), - &(object->rot[1]), &(object->rot[2]))); + { + if (Object_setEuler (obj, value) != Py_None) + return (-1); + else + return (0); + } if (StringEqual (name, "dRotX")) return (!PyArg_Parse (value, "f", &(object->drot[0]))); if (StringEqual (name, "dRotY")) diff --git a/source/blender/python/api2_2x/Object.h b/source/blender/python/api2_2x/Object.h index 95ece9add6e..365d63953d4 100644 --- a/source/blender/python/api2_2x/Object.h +++ b/source/blender/python/api2_2x/Object.h @@ -87,6 +87,8 @@ The active object is the first in the list, if visible"; /*****************************************************************************/ /* Python C_Object structure definition. */ /*****************************************************************************/ +struct C_Object; + typedef struct { PyObject_HEAD struct Object * object; @@ -94,6 +96,14 @@ typedef struct { /* points to the data. This only is set when there's a valid PyObject */ /* that points to the linked data. */ PyObject * data; + + /* points to the parent object. This is only set when there's a valid */ + /* PyObject (already created at some point). */ + struct C_Object * parent; + + /* points to the object that is tracking this object. This is only set */ + /* when there's a valid PyObject (already created at some point). */ + struct C_Object * track; } C_Object; /*****************************************************************************/ |