diff options
Diffstat (limited to 'source/blender/bpython/intern/BPY_object.c')
-rw-r--r-- | source/blender/bpython/intern/BPY_object.c | 503 |
1 files changed, 0 insertions, 503 deletions
diff --git a/source/blender/bpython/intern/BPY_object.c b/source/blender/bpython/intern/BPY_object.c deleted file mode 100644 index 054891dc9a5..00000000000 --- a/source/blender/bpython/intern/BPY_object.c +++ /dev/null @@ -1,503 +0,0 @@ -/** Object module; access to Object objects in Blender - * $Id$ - * - * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** - * - * 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 - * of the License, or (at your option) any later version. The Blender - * Foundation also sells licenses for use in proprietary software under - * the Blender License. See http://www.blender.org/BL/ for information - * about this. - * - * 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. - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - * - */ -#include "Python.h" -#include "BPY_macros.h" -#include "MEM_guardedalloc.h" -#include "opy_vector.h" /* matrix datatypes */ - -#include "b_interface.h" // most datatypes - -#include "opy_datablock.h" - -#include "BLI_arithb.h" /* Mat4Invert */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -/* PROTOS */ - - -/* ------------------------------------------------------------------------ */ - -/**************************************************/ -/* Object properties for access by datablock code */ - -#define NULLFUNC 0 -#define NULLHANDLING 0 - -/* structure: see opy_datablock.h */ -/* attrname, DNA_membername, type stype, min, max, index,dlist, - handlingflag, extra1Ptr, extra2Ptr, extra3Ptr */ - -DataBlockProperty Object_Properties[]= { - {"LocX", "loc[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {0}, {3, -sizeof(float)}}, - {"LocY", "loc[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {1}, {3, -sizeof(float)}}, - {"LocZ", "loc[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {2}, {3, -sizeof(float)}}, - {"loc", "loc[3]", DBP_TYPE_VEC, 0, 3.0}, - - {"dLocX", "dloc[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {0}, {3, -sizeof(float)}}, - {"dLocY", "dloc[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {1}, {3, -sizeof(float)}}, - {"dLocZ", "dloc[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {2}, {3, -sizeof(float)}}, - {"dloc", "dloc[3]", DBP_TYPE_VEC, 0, 3.0}, - - {"RotX", "rot[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {0}, {3, -sizeof(float)}}, - {"RotY", "rot[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {1}, {3, -sizeof(float)}}, - {"RotZ", "rot[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {2}, {3, -sizeof(float)}}, - {"rot", "rot[3]", DBP_TYPE_VEC, 0, 3.0}, - - {"dRotX", "drot[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {0}, {3, -sizeof(float)}}, - {"dRotY", "drot[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {1}, {3, -sizeof(float)}}, - {"dRotZ", "drot[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {2}, {3, -sizeof(float)}}, - {"drot", "drot[3]", DBP_TYPE_VEC, 0, 3.0}, - - {"SizeX", "size[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {0}, {3, -sizeof(float)}}, - {"SizeY", "size[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {1}, {3, -sizeof(float)}}, - {"SizeZ", "size[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {2}, {3, -sizeof(float)}}, - {"size", "size[3]", DBP_TYPE_VEC, 0, 3.0}, - - {"dSizeX", "dsize[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {0}, {3, -sizeof(float)}}, - {"dSizeY", "dsize[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {1}, {3, -sizeof(float)}}, - {"dSizeZ", "dsize[3]", DBP_TYPE_FLO, 0, 0.0, 0.0, {2}, {3, -sizeof(float)}}, - {"dsize", "dsize[3]", DBP_TYPE_VEC, 0, 3.0}, - - {"EffX", "effx", DBP_TYPE_FLO, DBP_TYPE_FUN, 0.0, 0.0, {0}, {0}, DBP_HANDLING_FUNC, Object_special_getattr, 0, Object_special_setattr}, - {"EffY", "effy", DBP_TYPE_FLO, DBP_TYPE_FUN, 0.0, 0.0, {0}, {0}, DBP_HANDLING_FUNC, Object_special_getattr, 0, Object_special_setattr}, - {"EffZ", "effz", DBP_TYPE_FLO, DBP_TYPE_FUN, 0.0, 0.0, {0}, {0}, DBP_HANDLING_FUNC, Object_special_getattr, 0, Object_special_setattr}, - - {"Layer", "layer", DBP_TYPE_INT, DBP_TYPE_FUN, 0.0, 0.0, {0}, {0}, DBP_HANDLING_FUNC, Object_special_getattr, 0, Object_special_setattr}, - {"layer", "layer", DBP_TYPE_INT, DBP_TYPE_FUN, 0.0, 0.0, {0}, {0}, DBP_HANDLING_FUNC, Object_special_getattr, 0, Object_special_setattr}, - - {"parent", "*parent", DBP_TYPE_FUN, 0, 0.0, 0.0, {0}, {0}, 0, 0, get_DataBlock_func}, - {"track", "*track", DBP_TYPE_FUN, 0, 0.0, 0.0, {0}, {0}, 0, 0, get_DataBlock_func}, - {"data", "*data", DBP_TYPE_FUN, 0, 0.0, 0.0, {0}, {0}, 0, 0, get_DataBlock_func}, - {"ipo", "*ipo", DBP_TYPE_FUN, 0, 0.0, 0.0, {0}, {0}, 0, 0, get_DataBlock_func}, - - {"mat", "matrix", DBP_TYPE_FUN, 0, 0.0, 0.0, {0}, {0}, DBP_HANDLING_FUNC, Object_special_getattr, newMatrixObject}, - {"matrix", "matrix", DBP_TYPE_FUN, 0, 0.0, 0.0, {0}, {0}, DBP_HANDLING_FUNC, Object_special_getattr, newMatrixObject}, - - {"colbits", "colbits", DBP_TYPE_SHO, 0, 0.0, 0.0}, - {"drawType", "dt", DBP_TYPE_CHA, 0, 0.0, 0.0}, - {"drawMode", "dtx", DBP_TYPE_CHA, 0, 0.0, 0.0}, - - {NULL} -}; - -/*************************/ -/* Object module methods */ - -DATABLOCK_GET(Objectmodule, object, getObjectList()) - -char Objectmodule_New_doc[] = "(type) - Add a new object of type 'type' in the current scene"; -static PyObject *Objectmodule_New(PyObject *self, PyObject *args) -{ - Object *ob; - int type; - - if (!PyArg_ParseTuple(args, "i", &type)) { - PyErr_SetString(PyExc_TypeError, "type expected"); - return 0; - } - /* add object */ - ob = object_new(type); - return DataBlock_fromData(ob); -} - -static char Objectmodule_getSelected_doc[]= -"() - Returns a list of selected Objects in the active layer(s)\n\ -The active object is the first in the list, if visible"; - -static PyObject *Objectmodule_getSelected (PyObject *self, PyObject *args) -{ - PyObject *ob, *list; - Base *base; - Object *tmp; - - list= PyList_New(0); - - if (ActiveBase && SelectedAndLayer(ActiveBase)) { - tmp = ActiveObject; /* active object is first in list */ - if (!tmp) goto no_selection; - ob = DataBlock_fromData(tmp); - PyList_Append(list, ob); Py_DECREF(ob); // because previous call increfs - } - - base = FirstBase; - while (base) { - if (SelectedAndLayer(base) && base != ActiveBase) { - PyObject *ob = DataBlock_fromData(ObjectfromBase(base)); - if (!ob) goto no_selection; - PyList_Append(list, ob); Py_DECREF(ob); - } - base= base->next; - } - return list; -no_selection: - Py_DECREF(list); - Py_INCREF(Py_None); - return Py_None; - -} - - -struct PyMethodDef Objectmodule_methods[] = { - {"New", Objectmodule_New, METH_VARARGS, Objectmodule_New_doc}, - // emulation : - {"Get", Objectmodule_get, METH_VARARGS, Objectmodule_get_doc}, // XXX - {"get", Objectmodule_get, METH_VARARGS, Objectmodule_get_doc}, - {"getSelected", Objectmodule_getSelected, METH_VARARGS, Objectmodule_getSelected_doc}, - {NULL, NULL} -}; - -/*************************/ -/* Object object methods */ - -/* Object_get is defined as macro; see opy_datablock.h */ - - -static char Object_getType_doc[] = "() - returns Object type"; - -static PyObject *Object_getType(PyObject *self, PyObject *args) -{ - Object *ob= PYBLOCK_AS_OBJECT(self); - return Py_BuildValue("i", (short) ob->type); -} - -static char Object_getMatrix_doc[] = "() - returns 4D matrix of object"; - -static PyObject *Object_getMatrix(PyObject *self, PyObject *args) -{ - Object *ob= PYBLOCK_AS_OBJECT(self); - return newMatrixObject(ob->obmat); -} - -static char Object_getInverseMatrix_doc[] = "() - returns inverse 4D matrix of object"; - -static PyObject *Object_getInverseMatrix(PyObject *self, PyObject *args) -{ - Object *ob= PYBLOCK_AS_OBJECT(self); - float inverse[4][4]; - Mat4Invert(inverse, ob->obmat); - return newMatrixObject(inverse); -} - -static char Object_clrParent_doc[]= -"(mode = 0, fast = 0) - clears parent object.\n\ -If specified:\n\ - mode 2: keep object transform\n\ - fast > 0: don't update scene hierarchy (faster)\n\ -"; - -static PyObject *Object_clrParent(PyObject *self, PyObject *args) -{ - int mode = 0, ret; - int fast = 0; - Object *ob= PYBLOCK_AS_OBJECT(self); - - BPY_TRY(PyArg_ParseTuple(args, "|ii", &mode, &fast)); - ret = object_clrParent(ob, mode, fast); - return Py_BuildValue("i", ret); -} - -DATABLOCK_ASSIGN_IPO(Object, object) // defines Object_assignIpo - -static char Object_makeParent_doc[]= -"([obj1, obj2, ...], mode = 0, fast = 0) - makes 'self' a parent of the\n\ -objects in the list.\n\ -If specified:\n\ - mode <> 0: do not clear parent inverse\n\ - fast <> 0 : do not update scene hierarchy (faster)\n\ -\n\ -If fast is set, you will have to call Scene.getCurrent.update() before\n\ -redraw."; - -static PyObject *Object_makeParent(PyObject *self, PyObject *args) -{ - int i, ret; - PyObject *list; - int noninverse = 0; - int fast = 0; - - DataBlock *parblk = (DataBlock*) self; - - BPY_TRY(PyArg_ParseTuple(args, "O|ii", &list, &noninverse, &fast)); - if (!PySequence_Check(list)){ - PyErr_SetString(PyExc_TypeError, "expects a list of objects"); - return 0; - } - - for (i = 0; i < PySequence_Length(list); i ++) { - DataBlock *childblk = (DataBlock *) PySequence_GetItem(list, i); - - if (!DataBlock_Check(childblk)) { - PyErr_SetString(PyExc_TypeError, "Object Type expected"); - return 0; - } - ret = object_makeParent((Object *) parblk->data, (Object *) childblk->data, noninverse, fast); - - Py_DECREF((PyObject *) childblk); // don't need it anymore - if (ret == 0) { // could not parent - PyErr_SetString(PyExc_RuntimeError, "parenting failed!"); - return 0; - } - } - - if (PyErr_Occurred()) { - PyErr_Print(); - } - return Py_BuildValue("i", 1); -} - -static char Object_getMaterials_doc[] = "() - returns a list of object materials"; - -static PyObject *Object_getMaterials(PyObject *self, PyObject *args) -{ - DataBlock *objectblk = (DataBlock*) self; - Object *object = PYBLOCK_AS_OBJECT(objectblk); - return PyList_fromMaterialList(object->mat, object->totcol); -} - -static char Object_setMaterials_doc[] = "(materialList) - sets object materials"; - -static PyObject *Object_setMaterials(PyObject *self, PyObject *args) -{ - int len; - int ret; - DataBlock *objectblk = (DataBlock*) self; - Object *object = PYBLOCK_AS_OBJECT(objectblk); - PyObject *list; - Material **matlist; - - BPY_TRY(PyArg_ParseTuple(args, "O!", &PyList_Type, &list)); - len = PySequence_Length(list); - if (len) { - matlist = newMaterialList_fromPyList(list); - if (!matlist) { - PyErr_SetString(PyExc_TypeError, - "materialList must be a list of valid materials!"); - return 0; - } - ret = object_setMaterials(object, matlist, len); - } else { - ret = 0; - } - return Py_BuildValue("i", ret); -} - -static char Object_copy_doc[] = "() - returns a copy of the object, sharing the same data"; - -static PyObject *Object_copy(PyObject *self, PyObject *args) -{ - Object *new; - - DataBlock *objectblk = (DataBlock*) self; - Object *object = PYBLOCK_AS_OBJECT(objectblk); - - new = object_copy(object); - return DataBlock_fromData(new); -} - -static char Object_shareFrom_doc[] = "(obj) - link data of 'self' with data of 'obj' -- \n\ -only if of same type!"; - -static PyObject *Object_shareFrom(PyObject *self, PyObject *args) -{ - DataBlock *blockA = (DataBlock*) self; - DataBlock *blockB; - Object *object, *other; - int t; - - BPY_TRY(PyArg_ParseTuple(args, "O!", &DataBlock_Type, &blockB)); - - if (!DataBlock_isType(blockB, ID_OB)) { - PyErr_SetString(PyExc_TypeError, "Argument 1 is not of type 'Object'"); - return NULL; - } - - object = PYBLOCK_AS_OBJECT(blockA); - other = PYBLOCK_AS_OBJECT(blockB); - - if (other->type != object->type) { - PyErr_SetString(PyExc_TypeError, "Objects are not of same data type"); - return NULL; - } - t = object->type; - switch (t) { - case OB_MESH: - return Py_BuildValue("i", object_linkdata(object, other->data)); - default: - PyErr_SetString(PyExc_TypeError, "Type not supported"); - return NULL; - } -} - -/******************/ -/* get & set attr */ - -static float g_zero_float= 0.0; - -/* Object attributes functions which require getter/setter C functions - different from the access provided by DataBlock support */ - -/* get special attributes through datablock property structure */ - -void *Object_special_getattr(void *vdata, char *name) -{ - Object *ob= (Object *) vdata; - int scriptflag; - - if (STREQ(name, "layer")) { - return &ob->lay; - - } else if (strncmp(name, "eff", 3)==0) { - Ika *ika= ob->data; - - if (ob->type==OB_IKA && ika) { - if (name[3]=='x') return &ika->effg[0]; - else if (name[3]=='y') return &ika->effg[1]; - else if (name[3]=='z') return &ika->effg[2]; - } - - return &g_zero_float; - /* these only for compatibiliy... XXX */ - } else if (STREQ(name, "matrix")) { - scriptflag = during_script(); - disable_where_script(1); - where_is_object(ob); - disable_where_script(scriptflag); - - return &ob->obmat; - } else if (STREQ(name, "inverse") || STREQ(name, "inverseMatrix")) { - return Object_getInverseMatrix(vdata, 0); - } - /* end compatibility */ - - PyErr_SetString(PyExc_AttributeError, name); - return NULL; -} - -int Object_special_setattr(void *vdata, char *name, PyObject *py_ob) -{ - Object *ob= (Object *) vdata; - - if (STREQ(name, "layer")) { - Base *base; - int ival; - - if (!PyArg_Parse(py_ob, "i", &ival)) return -1; - - ob->lay= ival; - // TODO this is old stuff, maybe move to update routine at end of - // script execution ? - base= (G.scene->base.first); - while (base) { - if (base->object == ob) base->lay= ob->lay; - base= base->next; - } - // end TODO - - return 0; - } else if (strncmp(name, "eff", 3)==0) { - Ika *ika= ob->data; - float fval; - - if (!PyArg_Parse(py_ob, "f", &fval)) return -1; - - if (ob->type==OB_IKA && ika) { - if (name[3]=='x') ika->effg[0]= fval; - else if (name[3]=='y') ika->effg[1]= fval; - else if (name[3]=='z') ika->effg[2]= fval; - - itterate_ika(ob); - } - return 0; - } - - PyErr_SetString(PyExc_AttributeError, name); - return -1; -} - - - -#undef MethodDef -#define MethodDef(func) _MethodDef(func, Object) - -struct PyMethodDef Object_methods[] = { - MethodDef(makeParent), - MethodDef(copy), - MethodDef(shareFrom), - MethodDef(getMatrix), - MethodDef(getType), - MethodDef(getInverseMatrix), - MethodDef(clrParent), - MethodDef(assignIpo), - MethodDef(clrIpo), - MethodDef(getMaterials), - MethodDef(setMaterials), - {NULL, NULL} -}; - -#undef BPY_ADDCONST -#define BPY_ADDCONST(dict, name) insertConst(dict, #name, PyInt_FromLong(OB_##name)) - -PyObject *initObject(void) -{ - PyObject *mod, *dict, *d; - - mod= Py_InitModule(MODNAME(BLENDERMODULE) ".Object", Objectmodule_methods); - dict= PyModule_GetDict(mod); - d = ConstObject_New(); - PyDict_SetItemString(dict, "Types", d); - BPY_ADDCONST(d, EMPTY); - BPY_ADDCONST(d, MESH); - BPY_ADDCONST(d, LAMP); - BPY_ADDCONST(d, CAMERA); - - d = ConstObject_New(); - PyDict_SetItemString(dict, "DrawTypes", d); - /* dt flags */ - BPY_ADDCONST(d, BOUNDBOX); - BPY_ADDCONST(d, WIRE); - BPY_ADDCONST(d, SOLID); - BPY_ADDCONST(d, SHADED); - BPY_ADDCONST(d, TEXTURE); - d = ConstObject_New(); - PyDict_SetItemString(dict, "DrawModes", d); - /* dtx flags */ - BPY_ADDCONST(d, BOUNDBOX); - BPY_ADDCONST(d, AXIS); - BPY_ADDCONST(d, TEXSPACE); - insertConst(d, "NAME", PyInt_FromLong(OB_DRAWNAME)); - return mod; -} - |