diff options
author | Campbell Barton <ideasman42@gmail.com> | 2007-05-25 20:43:25 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2007-05-25 20:43:25 +0400 |
commit | f231bd0d5715ac67767f96f3a8d20ebf618f7b03 (patch) | |
tree | 34c05572641b2eafad9fa8e342724e0b05b6b3d8 /source/blender | |
parent | a21f8292d9aeff54153fc65560d56b3d4f33575a (diff) |
Many long standing memory leaks fixed in the BPY api.
Data from Armature.c and logic.c still leaks.
Mostly todo with PyList_Append adding a refcount and the bpython api not decrefing.
Also added some features needed to fix a bug in mesh_clean.py (ob.pinShape and ob.activeShape)
Diffstat (limited to 'source/blender')
25 files changed, 364 insertions, 218 deletions
diff --git a/source/blender/python/BPY_interface.c b/source/blender/python/BPY_interface.c index be4bc690d97..cef83c327ab 100644 --- a/source/blender/python/BPY_interface.c +++ b/source/blender/python/BPY_interface.c @@ -877,6 +877,7 @@ int BPY_menu_do_python( short menutype, int event ) if( !setup_armature_weakrefs()){ printf("Oops - weakref dict\n"); + MEM_freeN( buffer ); return 0; } diff --git a/source/blender/python/api2_2x/Armature.c b/source/blender/python/api2_2x/Armature.c index 98b64d7554c..a4c9221639f 100644 --- a/source/blender/python/api2_2x/Armature.c +++ b/source/blender/python/api2_2x/Armature.c @@ -118,17 +118,18 @@ static PyMethodDef BPy_BonesDict_methods[] = { //-----------------(internal) static int BoneMapping_Init(PyObject *dictionary, ListBase *bones){ Bone *bone = NULL; - PyObject *py_bone = NULL; + PyObject *py_bone = NULL, *str; for (bone = bones->first; bone; bone = bone->next){ py_bone = PyBone_FromBone(bone); if (!py_bone) return -1; - - if(PyDict_SetItem(dictionary, - PyString_FromString(bone->name), py_bone) == -1){ + + str = PyString_FromString(bone->name); + if(PyDict_SetItem(dictionary, str, py_bone) == -1) return -1; - } + + Py_DECREF(str); Py_DECREF(py_bone); if (bone->childbase.first) BoneMapping_Init(dictionary, &bone->childbase); @@ -138,17 +139,18 @@ static int BoneMapping_Init(PyObject *dictionary, ListBase *bones){ //-----------------(internal) static int EditBoneMapping_Init(PyObject *dictionary, ListBase *editbones){ EditBone *editbone = NULL; - PyObject *py_editbone = NULL; + PyObject *py_editbone = NULL, *str; for (editbone = editbones->first; editbone; editbone = editbone->next){ py_editbone = PyEditBone_FromEditBone(editbone); if (!py_editbone) return -1; - - if(PyDict_SetItem(dictionary, - PyString_FromString(editbone->name), py_editbone) == -1){ + + str = PyString_FromString(editbone->name); + if(PyDict_SetItem(dictionary, str, py_editbone) == -1) return -1; - } + + Py_DECREF(str); Py_DECREF(py_editbone); } return 0; @@ -215,7 +217,7 @@ static void BonesDict_dealloc(BPy_BonesDict * self) Py_DECREF(self->bonesMap); Py_DECREF(self->editbonesMap); BLI_freelistN(&self->editbones); - BonesDict_Type.tp_free(self); + PyObject_DEL( self ); return; } //------------------------mp_length @@ -422,10 +424,7 @@ PyTypeObject BonesDict_Type = { //-----------------------PyBonesDict_FromPyArmature static PyObject *PyBonesDict_FromPyArmature(BPy_Armature *py_armature) { - BPy_BonesDict *py_BonesDict = NULL; - - //create py object - py_BonesDict = (BPy_BonesDict *)BonesDict_Type.tp_alloc(&BonesDict_Type, 0); + BPy_BonesDict *py_BonesDict = (BPy_BonesDict *)PyObject_NEW( BPy_BonesDict, &BonesDict_Type ); if (!py_BonesDict) goto RuntimeError; @@ -1067,9 +1066,9 @@ static void Armature_dealloc(BPy_Armature * self) { if (self->weaklist != NULL) PyObject_ClearWeakRefs((PyObject *) self); + Py_DECREF(self->Bones); - Armature_Type.tp_free(self); - return; + PyObject_DEL( self ); } //------------------TYPE_OBECT DEFINITION-------------------------- PyTypeObject Armature_Type = { @@ -1126,7 +1125,7 @@ PyTypeObject Armature_Type = { //----------------Blender.Armature.Get() /* This function will return a Py_Armature when a single string is passed * or else it will return a {key:value} dictionary when mutliple strings are passed -* or it will return a {key:value} dictionary of all armatures when nothing is passed*/ +* or it will return a {key:value} dictionary of all armatures when nothing is passed */ static PyObject *M_Armature_Get(PyObject * self, PyObject * args) { PyObject *seq = NULL, *item = NULL, *dict = NULL, *py_armature = NULL; @@ -1291,8 +1290,12 @@ PyObject *Armature_RebuildBones(PyObject *pyarmature) { return Armature_update((BPy_Armature*)pyarmature); } -//-----------------(internal) -//Converts a bArmature to a PyArmature +/*-----------------(internal) + * Converts a bArmature to a PyArmature + * + * WARNING!!! - MEMORY LEAK HERE, Run in a loop and loose your ram. + * cannot find out why but dosnt seam to be the weakref */ + PyObject *Armature_CreatePyObject(struct bArmature *armature) { BPy_Armature *py_armature = NULL; @@ -1300,15 +1303,16 @@ PyObject *Armature_CreatePyObject(struct bArmature *armature) PyObject *armlist = NULL; /* list of armature weak refs */ char *list_name = ARM_WEAKREF_LIST_NAME; - //create armature type - py_armature = (BPy_Armature*)Armature_Type.tp_alloc(&Armature_Type, 0); /*new*/ + /*create armature type*/ + py_armature = PyObject_NEW( BPy_Armature, &Armature_Type ); + if (!py_armature){ printf("Oops - can't create py armature\n"); goto RuntimeError; } - py_armature->weaklist = NULL; //init the weaklist py_armature->armature = armature; + py_armature->weaklist = NULL; //init the weaklist //create armature.bones py_armature->Bones = (BPy_BonesDict*)PyBonesDict_FromPyArmature(py_armature); diff --git a/source/blender/python/api2_2x/Bone.c b/source/blender/python/api2_2x/Bone.c index feb43cc7405..8795bb7d984 100644 --- a/source/blender/python/api2_2x/Bone.c +++ b/source/blender/python/api2_2x/Bone.c @@ -88,9 +88,9 @@ static PyObject *EditBone_hasParent(BPy_EditBone *self) { if (self->editbone){ if (self->editbone->parent) - return EXPP_incr_ret(Py_True); + Py_RETURN_TRUE; else - return EXPP_incr_ret(Py_False); + Py_RETURN_FALSE; }else{ goto AttributeError; } @@ -105,7 +105,7 @@ static PyObject *EditBone_clearParent(BPy_EditBone *self) if (self->editbone){ if (self->editbone->parent) self->editbone->parent = NULL; - return EXPP_incr_ret(Py_None); + Py_RETURN_NONE; }else{ goto AttributeError; } @@ -406,9 +406,10 @@ static PyObject *EditBone_getOptions(BPy_EditBone *self, void *closure) goto RuntimeError; } - return EXPP_incr_ret(list); + return list; RuntimeError: + Py_XDECREF( list ); return EXPP_objError(PyExc_RuntimeError, "%s%s%s", sEditBoneError, ".options: ", "Internal failure!"); } @@ -515,9 +516,9 @@ static PyObject *EditBone_getParent(BPy_EditBone *self, void *closure) if (self->editbone->parent) return PyEditBone_FromEditBone(self->editbone->parent); else - return EXPP_incr_ret(Py_None); + Py_RETURN_NONE; }else{ - return EXPP_incr_ret(Py_None); //not in the list yet can't have a parent + Py_RETURN_NONE; //not in the list yet can't have a parent } } //------------------------EditBone.parent (set) @@ -878,45 +879,47 @@ static int PyBone_ChildrenAsList(PyObject *list, ListBase *bones){ py_bone = PyBone_FromBone(bone); if (py_bone == NULL) return 0; - + if(PyList_Append(list, py_bone) == -1){ - goto RuntimeError; + return 0; } + Py_DECREF(py_bone); if (bone->childbase.first) - PyBone_ChildrenAsList(list, &bone->childbase); + if (!PyBone_ChildrenAsList(list, &bone->childbase)) + return 0; } return 1; - -RuntimeError: - return EXPP_intError(PyExc_RuntimeError, "%s%s", - sBoneError, "Internal error trying to wrap blender bones!"); } //-------------------------Bone.hasParent() static PyObject *Bone_hasParent(BPy_Bone *self) { if (self->bone->parent) - return EXPP_incr_ret(Py_True); + Py_RETURN_TRUE; else - return EXPP_incr_ret(Py_False); + Py_RETURN_FALSE; } //-------------------------Bone.hasChildren() static PyObject *Bone_hasChildren(BPy_Bone *self) { if (self->bone->childbase.first) - return EXPP_incr_ret(Py_True); + Py_RETURN_TRUE; else - return EXPP_incr_ret(Py_False); + Py_RETURN_FALSE; } //-------------------------Bone.getAllChildren() static PyObject *Bone_getAllChildren(BPy_Bone *self) { PyObject *list = PyList_New(0); - - if (self->bone->childbase.first) - if (!PyBone_ChildrenAsList(list, &self->bone->childbase)) - return NULL; - return EXPP_incr_ret(list); + if (!self->bone->childbase.first) { + /* do nothing */ + } else if (!PyBone_ChildrenAsList(list, &self->bone->childbase)) { + Py_XDECREF(list); + EXPP_objError(PyExc_RuntimeError, "%s%s", + sBoneError, "Internal error trying to wrap blender bones!"); + } + return list; } + //------------------ATTRIBUTE IMPLEMENTATIONS----------------------------- //------------------------Bone.name (get) static PyObject *Bone_getName(BPy_Bone *self, void *closure) @@ -1044,9 +1047,10 @@ static PyObject *Bone_getOptions(BPy_Bone *self, void *closure) EXPP_GetModuleConstant("Blender.Armature", "TIP_SELECTED")) == -1) goto RuntimeError; - return EXPP_incr_ret(list); - + return list; + RuntimeError: + Py_XDECREF(list); return EXPP_objError(PyExc_RuntimeError, "%s%s%s", sBoneError, "getOptions(): ", "Internal failure!"); } @@ -1062,7 +1066,7 @@ static PyObject *Bone_getParent(BPy_Bone *self, void *closure) if (self->bone->parent) return PyBone_FromBone(self->bone->parent); else - return EXPP_incr_ret(Py_None); + Py_RETURN_NONE; } //------------------------Bone.parent (set) static int Bone_setParent(BPy_Bone *self, PyObject *value, void *closure) @@ -1081,15 +1085,17 @@ static PyObject *Bone_getChildren(BPy_Bone *self, void *closure) for (bone = self->bone->childbase.first; bone; bone = bone->next){ py_bone = PyBone_FromBone(bone); if (py_bone == NULL) - return 0; - if(PyList_Append(list, py_bone) == -1){ goto RuntimeError; - } + if (PyList_Append(list, py_bone) == -1) + goto RuntimeError; + Py_DECREF(py_bone); } } - return EXPP_incr_ret(list); + return list; RuntimeError: + Py_XDECREF(list); + Py_XDECREF(py_bone); return EXPP_objError(PyExc_RuntimeError, "%s%s", sBoneError, "Internal error trying to wrap blender bones!"); } @@ -1309,19 +1315,11 @@ RuntimeError: //Converts a struct Bone to a BPy_Bone PyObject *PyBone_FromBone(struct Bone *bone) { - BPy_Bone *py_Bone = NULL; - - py_Bone = (BPy_Bone*)Bone_Type.tp_alloc(&Bone_Type, 0); //*new* - if (py_Bone == NULL) - goto RuntimeError; - + BPy_Bone *py_Bone = ( BPy_Bone * ) PyObject_NEW( BPy_Bone, &Bone_Type ); + py_Bone->bone = bone; return (PyObject *) py_Bone; - -RuntimeError: - return EXPP_objError(PyExc_RuntimeError, "%s%s%s", - sBoneError, "PyBone_FromBone: ", "Internal Error Ocurred"); } //-----------------(internal) //Converts a PyBone to a bBone diff --git a/source/blender/python/api2_2x/CurNurb.c b/source/blender/python/api2_2x/CurNurb.c index b244d24e37f..9d930fee1ca 100644 --- a/source/blender/python/api2_2x/CurNurb.c +++ b/source/blender/python/api2_2x/CurNurb.c @@ -947,8 +947,7 @@ PyObject *CurNurb_pointAtIndex( Nurb * nurb, int index ) for( i = 0; i < 4; i++ ) { PyList_SetItem( pyo, i, - PyFloat_FromDouble( nurb->bp[index]. - vec[i] ) ); + PyFloat_FromDouble( nurb->bp[index].vec[i] ) ); } /* add Tilt only if curve is 3D */ diff --git a/source/blender/python/api2_2x/Curve.c b/source/blender/python/api2_2x/Curve.c index b107992f77e..04ed142f4dd 100644 --- a/source/blender/python/api2_2x/Curve.c +++ b/source/blender/python/api2_2x/Curve.c @@ -1396,7 +1396,7 @@ static PyObject *M_Curve_Get( PyObject * self, PyObject * args ) &Curve_Type ); found_cur->curve = curv_iter; PyList_Append( curvlist, ( PyObject * ) found_cur ); - + Py_DECREF(found_cur); curv_iter = curv_iter->id.next; } diff --git a/source/blender/python/api2_2x/Draw.c b/source/blender/python/api2_2x/Draw.c index 331415dc849..ede780294ef 100644 --- a/source/blender/python/api2_2x/Draw.c +++ b/source/blender/python/api2_2x/Draw.c @@ -787,9 +787,11 @@ static void exec_but_callback(void *pyobj, void *data) } case BUT: pyvalue = Py_None; + Py_INCREF(pyvalue); break; default: pyvalue = Py_None; + Py_INCREF(pyvalue); printf("Error, no button type matched."); } @@ -802,6 +804,7 @@ static void exec_but_callback(void *pyobj, void *data) result = PyObject_CallObject( callback, arg ); if (!result) { + Py_DECREF(pyvalue); PyErr_Print( ); error( "Python script error: check console" ); } diff --git a/source/blender/python/api2_2x/Effect.c b/source/blender/python/api2_2x/Effect.c index 560b67c1933..156c3bb26a6 100644 --- a/source/blender/python/api2_2x/Effect.c +++ b/source/blender/python/api2_2x/Effect.c @@ -1494,7 +1494,7 @@ static PyObject *Effect_getParticlesLoc( BPy_Effect * self ) Effect *eff; PartEff *paf; Particle *pa=0; - PyObject *list, *strand_list; + PyObject *list, *strand_list, *pyvec; float p_time, c_time, vec[3], vec1[3], cfra, m_time, s_time; int a; short disp=100 ; @@ -1545,12 +1545,17 @@ static PyObject *Effect_getParticlesLoc( BPy_Effect * self ) for(c_time= pa->time; c_time<m_time; c_time+=paf->staticstep) { where_is_particle(paf, pa, c_time, vec); MTC_Mat4MulVecfl(ob->obmat, vec); /* make worldspace like the others */ - if( PyList_Append( strand_list, newVectorObject(vec, 3, Py_NEW)) < 0 ) { + pyvec = newVectorObject(vec, 3, Py_NEW); + if( PyList_Append( strand_list, pyvec) < 0 ) { Py_DECREF( list ); Py_DECREF( strand_list ); + Py_XDECREF( pyvec ); + return EXPP_ReturnPyObjError( PyExc_RuntimeError, "Couldn't append item to PyList" ); } + Py_DECREF( pyvec ); + } if( PyList_Append( list, strand_list) < 0 ) { @@ -1589,12 +1594,14 @@ static PyObject *Effect_getParticlesLoc( BPy_Effect * self ) } } else { /* not a vector */ where_is_particle(paf, pa, c_time, vec); - if( PyList_Append( list, - newVectorObject(vec, 3, Py_NEW)) < 0 ) { + pyvec = newVectorObject(vec, 3, Py_NEW); + if( PyList_Append( list, pyvec) < 0 ) { Py_DECREF( list ); + Py_XDECREF( pyvec ); return EXPP_ReturnPyObjError( PyExc_RuntimeError, "Couldn't append item to PyList" ); } + Py_DECREF( pyvec ); } } } diff --git a/source/blender/python/api2_2x/Font.c b/source/blender/python/api2_2x/Font.c index 667dc6d4e0d..f87e19294ca 100644 --- a/source/blender/python/api2_2x/Font.c +++ b/source/blender/python/api2_2x/Font.c @@ -374,7 +374,7 @@ static PyObject *Font_repr( BPy_Font * self ) return PyString_FromFormat( "[Font \"%s\"]", self->font->id.name+2 ); else - return PyString_FromString( "NULL" ); + return PyString_FromString( "[Font - no data]" ); } /*--------------- compare------------------------------------------*/ diff --git a/source/blender/python/api2_2x/Ipo.c b/source/blender/python/api2_2x/Ipo.c index 8ef4babb415..37098400216 100644 --- a/source/blender/python/api2_2x/Ipo.c +++ b/source/blender/python/api2_2x/Ipo.c @@ -197,7 +197,7 @@ static PyGetSetDef BPy_Ipo_getseters[] = { (getter)Ipo_getBlocktype, (setter)NULL, "Ipo block type", NULL}, - {"rcft", + {"rctf", (getter)Ipo_getRctf, (setter)Ipo_setRctf, "Ipo type", NULL}, @@ -830,11 +830,11 @@ static int Ipo_setBlocktype( BPy_Ipo * self, PyObject * args ) static PyObject *Ipo_getRctf( BPy_Ipo * self ) { - PyObject *l = PyList_New( 0 ); - PyList_Append( l, PyFloat_FromDouble( self->ipo->cur.xmin ) ); - PyList_Append( l, PyFloat_FromDouble( self->ipo->cur.xmax ) ); - PyList_Append( l, PyFloat_FromDouble( self->ipo->cur.ymin ) ); - PyList_Append( l, PyFloat_FromDouble( self->ipo->cur.ymax ) ); + PyObject *l = PyList_New( 4 ); + PyList_SET_ITEM( l, 0, PyFloat_FromDouble( self->ipo->cur.xmin ) ); + PyList_SET_ITEM( l, 1, PyFloat_FromDouble( self->ipo->cur.xmax ) ); + PyList_SET_ITEM( l, 2, PyFloat_FromDouble( self->ipo->cur.ymin ) ); + PyList_SET_ITEM( l, 3, PyFloat_FromDouble( self->ipo->cur.ymax ) ); return l; } @@ -1018,12 +1018,14 @@ typeError: static PyObject *Ipo_getCurves( BPy_Ipo * self ) { - PyObject *attr = PyList_New( 0 ); + PyObject *attr = PyList_New( 0 ), *pyipo; IpoCurve *icu; - for( icu = self->ipo->curve.first; icu; icu = icu->next ) - PyList_Append( attr, IpoCurve_CreatePyObject( icu ) ); - + for( icu = self->ipo->curve.first; icu; icu = icu->next ) { + pyipo = IpoCurve_CreatePyObject( icu ); + PyList_Append( attr, pyipo ); + Py_DECREF(pyipo); + } return attr; } @@ -1110,14 +1112,16 @@ static PyObject *Ipo_getCurveNames( BPy_Ipo * self ) /* find the ipo in the keylist */ for( key = G.main->key.first; key; key = key->id.next ) { if( key->ipo == self->ipo ) { + PyObject *tmpstr; KeyBlock *block = key->block.first; attr = PyList_New( 0 ); - + /* add each name to the list */ - for( block = key->block.first; block; block = block->next ) - PyList_Append( attr, - PyString_FromString( block->name ) ); - + for( block = key->block.first; block; block = block->next ) { + tmpstr = PyString_FromString( block->name ); + PyList_Append( attr, tmpstr); + Py_DECREF(tmpstr); + } return attr; } } @@ -1674,7 +1678,7 @@ static PyObject *Ipo_getCurveBeztriple( BPy_Ipo * self, PyObject * args ) struct BezTriple *ptrbt; int num = 0, pos, i, j; IpoCurve *icu; - PyObject *l = PyList_New( 0 ); + PyObject *l = PyList_New( 0 ), *pyfloat; if( !PyArg_ParseTuple( args, "ii", &num, &pos ) ) return ( EXPP_ReturnPyObjError @@ -1698,11 +1702,13 @@ static PyObject *Ipo_getCurveBeztriple( BPy_Ipo * self, PyObject * args ) return EXPP_ReturnPyObjError( PyExc_TypeError, "No bez triple" ); - for( i = 0; i < 3; i++ ) - for( j = 0; j < 3; j++ ) - PyList_Append( l, - PyFloat_FromDouble( ptrbt-> - vec[i][j] ) ); + for( i = 0; i < 3; i++ ) { + for( j = 0; j < 3; j++ ) { + pyfloat = PyFloat_FromDouble( ptrbt->vec[i][j] ); + PyList_Append( l, pyfloat ); + Py_DECREF(pyfloat); + } + } return l; } @@ -1823,8 +1829,7 @@ static PyObject *Ipo_getCurvecurval( BPy_Ipo * self, PyObject * args ) if( icu ) return PyFloat_FromDouble( icu->curval ); - Py_INCREF( Py_None ); - return Py_None; + Py_RETURN_NONE; } /* diff --git a/source/blender/python/api2_2x/Key.c b/source/blender/python/api2_2x/Key.c index d1231daba5f..460bab347a0 100644 --- a/source/blender/python/api2_2x/Key.c +++ b/source/blender/python/api2_2x/Key.c @@ -64,6 +64,7 @@ static int Key_compare( BPy_Key * a, BPy_Key * b ); static PyObject *Key_repr( BPy_Key * self ); +static void Key_dealloc( BPy_Key * self ); static PyObject *Key_getBlocks( BPy_Key * self ); static PyObject *Key_getType( BPy_Key * self ); @@ -106,6 +107,10 @@ static int KeyBlock_setVgroup( BPy_KeyBlock *, PyObject * args ); static int KeyBlock_setSlidermin( BPy_KeyBlock *, PyObject * args ); static int KeyBlock_setSlidermax( BPy_KeyBlock *, PyObject * args ); +static void KeyBlock_dealloc( BPy_KeyBlock * self ); +static int KeyBlock_compare( BPy_KeyBlock * a, BPy_KeyBlock * b ); +static PyObject *KeyBlock_repr( BPy_KeyBlock * self ); + static struct PyMethodDef KeyBlock_methods[] = { { "getData", (PyCFunction) KeyBlock_getData, METH_NOARGS, "Get keyblock data" }, @@ -136,7 +141,7 @@ PyTypeObject Key_Type = { sizeof( BPy_Key ), /*tp_basicsize */ 0, /*tp_itemsize */ /* methods */ - NULL, /*tp_dealloc */ + ( destructor ) Key_dealloc,/* destructor tp_dealloc; */ ( printfunc ) 0, /*tp_print */ ( getattrfunc ) 0, /*tp_getattr */ ( setattrfunc ) 0, /*tp_setattr */ @@ -213,12 +218,12 @@ PyTypeObject KeyBlock_Type = { sizeof( BPy_KeyBlock ), /*tp_basicsize */ 0, /*tp_itemsize */ /* methods */ - NULL, /*tp_dealloc */ - NULL, /*tp_print */ - NULL, /*tp_getattr */ - NULL, /*tp_setattr */ - NULL, /*tp_compare*/ - NULL, /* tp_repr */ + ( destructor ) KeyBlock_dealloc,/* destructor tp_dealloc; */ + ( printfunc ) 0, /*tp_print */ + ( getattrfunc ) 0, /*tp_getattr */ + ( setattrfunc ) 0, /*tp_setattr */ + ( cmpfunc) KeyBlock_compare, /*tp_compare*/ + ( reprfunc ) KeyBlock_repr, /* tp_repr */ /* Method suites for standard classes */ NULL, /* PyNumberMethods *tp_as_number; */ @@ -303,6 +308,10 @@ PyObject *Key_CreatePyObject( Key * k ) return ( PyObject * ) key; } +static void Key_dealloc( BPy_Key * self ) +{ + PyObject_DEL( self ); +} static int Key_compare( BPy_Key * a, BPy_Key * b ) { @@ -378,14 +387,12 @@ static PyObject *Key_getBlocks( BPy_Key * self ) { Key *key = self->key; KeyBlock *kb; - PyObject *keyblock_object; - PyObject *l = PyList_New( 0 ); - - for (kb = key->block.first; kb; kb = kb->next) { - keyblock_object = KeyBlock_CreatePyObject( kb, key ); - PyList_Append( l, keyblock_object ); - } + int i=0; + PyObject *l = PyList_New( BLI_countlist( &(key->block)) ); + for (kb = key->block.first; kb; kb = kb->next, i++) + PyList_SET_ITEM( l, i, KeyBlock_CreatePyObject( kb, key ) ); + return l; } @@ -398,17 +405,11 @@ static PyObject *Key_getValue( BPy_Key * self ) /* ------------ Key Block Functions -------------- */ -static PyObject *new_KeyBlock( KeyBlock * oldkeyBlock, Key *parentKey) +static PyObject *new_KeyBlock( KeyBlock * keyblock, Key *key) { BPy_KeyBlock *kb = PyObject_NEW( BPy_KeyBlock, &KeyBlock_Type ); - - kb->key = parentKey; - - if( !oldkeyBlock ) { - kb->keyblock = 0; - } else { - kb->keyblock = oldkeyBlock; - } + kb->key = key; + kb->keyblock = keyblock; /* keyblock maye be NULL, thats ok */ return ( PyObject * ) kb; } @@ -478,6 +479,22 @@ static int KeyBlock_setSlidermax( BPy_KeyBlock * self, PyObject * args ){ 10.0f ); } +static void KeyBlock_dealloc( BPy_KeyBlock * self ) +{ + PyObject_DEL( self ); +} + +static int KeyBlock_compare( BPy_KeyBlock * a, BPy_KeyBlock * b ) +{ + return ( a->keyblock == b->keyblock ) ? 0 : -1; +} + +static PyObject *KeyBlock_repr( BPy_KeyBlock * self ) +{ + return PyString_FromFormat( "[KeyBlock \"%s\"]", self->keyblock->name ); +} + + static Curve *find_curve( Key *key ) { Curve *cu; diff --git a/source/blender/python/api2_2x/Lattice.c b/source/blender/python/api2_2x/Lattice.c index 7b2ed57bf75..5c8df29d5d0 100644 --- a/source/blender/python/api2_2x/Lattice.c +++ b/source/blender/python/api2_2x/Lattice.c @@ -166,11 +166,11 @@ static PyObject *M_Lattice_New( PyObject * self, PyObject * args ) "expected string and int arguments (or nothing)" ); bl_Lattice = add_lattice( "Lattice" ); - bl_Lattice->id.us = 0; - if( bl_Lattice ) + if( bl_Lattice ) { + bl_Lattice->id.us = 0; py_Lattice = Lattice_CreatePyObject( bl_Lattice ); - else + } else return EXPP_ReturnPyObjError( PyExc_RuntimeError, "couldn't create Lattice Object in Blender" ); if( !py_Lattice ) diff --git a/source/blender/python/api2_2x/Mesh.c b/source/blender/python/api2_2x/Mesh.c index 85feedf86ba..212298e3dce 100644 --- a/source/blender/python/api2_2x/Mesh.c +++ b/source/blender/python/api2_2x/Mesh.c @@ -4972,15 +4972,15 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args, tmpface->flag = ME_FACE_SEL; - if( return_list ) - PyList_Append( return_list, - PyInt_FromLong( mesh->totface ) ); - + if( return_list ) { + tmp = PyInt_FromLong( mesh->totface ); + PyList_Append( return_list, tmp ); + Py_DECREF(tmp); + } mesh->totface++; ++tmpface; --good_faces; } else if( return_list ) { - Py_INCREF( Py_None ); PyList_Append( return_list, Py_None ); --good_faces; } @@ -5385,9 +5385,44 @@ static PyObject *Mesh_vertexShade( BPy_Mesh * self ) * force display list update */ -static PyObject *Mesh_Update( BPy_Mesh * self ) +static PyObject *Mesh_Update( BPy_Mesh * self, PyObject *args, PyObject *kwd ) { - mesh_update( self->mesh ); + + char *blockname= NULL; + static char *kwlist[] = {"key", NULL}; + + if( !PyArg_ParseTupleAndKeywords(args, kwd, "|s", kwlist, &blockname) ) + return EXPP_ReturnPyObjError( PyExc_TypeError, + "Expected nothing or the name of a shapeKey"); + + if (blockname) { + Mesh *me = self->mesh; + MVert *mv = me->mvert; + Key *key= me->key; + KeyBlock *kb; + float (*co)[3]; + int i; + + if (!key) + return EXPP_ReturnPyObjError( PyExc_RuntimeError, + "Cannot update the key for this mesh, it has no shape keys"); + + for (kb = key->block.first; kb; kb=kb->next) + if (strcmp(blockname, kb->name)) + break; + + if (!kb) + return EXPP_ReturnPyObjError( PyExc_ValueError, + "This requested key to update does not exist"); + + printf("KEYBLOCKNAME %s\n", kb->name); + + for(i=0, co= kb->data; i<me->totvert; i++, mv++, co++) + VECCOPY(*co, mv->co); + } else { + /* Normal operation */ + mesh_update( self->mesh ); + } Py_RETURN_NONE; } @@ -5893,7 +5928,6 @@ static PyObject *Mesh_addVertGroup( PyObject * self, PyObject * args ) { char *groupStr; struct Object *object; - PyObject *tempStr; if( !PyArg_ParseTuple( args, "s", &groupStr ) ) return EXPP_ReturnPyObjError( PyExc_TypeError, @@ -5905,10 +5939,7 @@ static PyObject *Mesh_addVertGroup( PyObject * self, PyObject * args ) object = ( ( BPy_Mesh * ) self )->object; - /*get clamped name*/ - tempStr = PyString_FromStringAndSize( groupStr, 32 ); - groupStr = PyString_AsString( tempStr ); - + /* add_defgroup_name clamps the name to 32, make sure that dosnt change */ add_defgroup_name( object, groupStr ); EXPP_allqueue( REDRAWBUTSALL, 1 ); @@ -6502,7 +6533,7 @@ static PyObject *Mesh_getLayerNames_internal( BPy_Mesh * self, int type ) { CustomData *data; CustomDataLayer *layer; - PyObject *list = PyList_New( 0 ); + PyObject *str, *list = PyList_New( 0 ); Mesh *mesh = self->mesh; int i; data = &mesh->fdata; @@ -6511,7 +6542,9 @@ static PyObject *Mesh_getLayerNames_internal( BPy_Mesh * self, int type ) for(i=0; i<data->totlayer; i++) { layer = &data->layers[i]; if(layer->type == type) { - PyList_Append( list, PyString_FromString(layer->name) ); + str = PyString_FromString(layer->name); + PyList_Append( list, str ); + Py_DECREF(str); } } return list; @@ -6990,7 +7023,7 @@ static struct PyMethodDef BPy_Mesh_methods[] = { "find indices of an multiple edges in the mesh"}, {"getFromObject", (PyCFunction)Mesh_getFromObject, METH_VARARGS, "Get a mesh by name"}, - {"update", (PyCFunction)Mesh_Update, METH_NOARGS, + {"update", (PyCFunction)Mesh_Update, METH_VARARGS | METH_KEYWORDS, "Update display lists after changes to mesh"}, {"transform", (PyCFunction)Mesh_transform, METH_VARARGS | METH_KEYWORDS, "Applies a transformation matrix to mesh's vertices"}, diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c index ffc74289510..0eb90d348ce 100644 --- a/source/blender/python/api2_2x/NMesh.c +++ b/source/blender/python/api2_2x/NMesh.c @@ -1275,10 +1275,10 @@ static PyObject *NMesh_getSelectedFaces( PyObject * self, PyObject * args ) BPy_NMesh *nm = ( BPy_NMesh * ) self; Mesh *me = nm->mesh; int flag = 0; - + MTFace *tf; int i; - PyObject *l = PyList_New( 0 ); + PyObject *l = PyList_New( 0 ), *pyval; if( me == NULL ) return NULL; @@ -1292,15 +1292,16 @@ static PyObject *NMesh_getSelectedFaces( PyObject * self, PyObject * args ) if( flag ) { for( i = 0; i < me->totface; i++ ) { - if( tf[i].flag & TF_SELECT ) - PyList_Append( l, PyInt_FromLong( i ) ); + if( tf[i].flag & TF_SELECT ) { + pyval = PyInt_FromLong( i ); + PyList_Append( l, pyval ); + Py_DECREF(pyval); + } } } else { for( i = 0; i < me->totface; i++ ) { if( tf[i].flag & TF_SELECT ) - PyList_Append( l, - PyList_GetItem( nm->faces, - i ) ); + PyList_Append( l, PyList_GetItem( nm->faces, i ) ); } } return l; @@ -2434,11 +2435,13 @@ static PyObject *M_NMesh_GetRaw( PyObject * self, PyObject * args ) static PyObject *M_NMesh_GetNames(PyObject *self) { - PyObject *names = PyList_New(0); + PyObject *names = PyList_New(0), *tmpstr; Mesh *me = G.main->mesh.first; while (me) { - PyList_Append(names, PyString_FromString(me->id.name+2)); + tmpstr = PyString_FromString(me->id.name+2); + PyList_Append(names, tmpstr); + Py_DECREF(tmpstr); me = me->id.next; } @@ -4095,7 +4098,7 @@ static PyObject *NMesh_renameVertGroup( PyObject * self, PyObject * args ) static PyObject *NMesh_getVertGroupNames( PyObject * self ) { bDeformGroup *defGroup; - PyObject *list; + PyObject *list, *tmpstr; if( !( ( BPy_NMesh * ) self )->object ) return EXPP_ReturnPyObjError( PyExc_RuntimeError, @@ -4103,11 +4106,15 @@ static PyObject *NMesh_getVertGroupNames( PyObject * self ) list = PyList_New( 0 ); for( defGroup = ( ( ( BPy_NMesh * ) self )->object )->defbase.first; - defGroup; defGroup = defGroup->next ) { - if( PyList_Append - ( list, PyString_FromString( defGroup->name ) ) < 0 ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Couldn't add item to list" ); + defGroup; defGroup = defGroup->next ) { + + tmpstr = PyString_FromString( defGroup->name ); + if( PyList_Append( list, tmpstr) < 0 ) { + Py_XDECREF(list); + Py_XDECREF(tmpstr); + return EXPP_ReturnPyObjError( PyExc_RuntimeError, "Couldn't add item to list" ); + } + Py_XDECREF(tmpstr); } return list; diff --git a/source/blender/python/api2_2x/Object.c b/source/blender/python/api2_2x/Object.c index b30ce00239d..c8d42dfa842 100644 --- a/source/blender/python/api2_2x/Object.c +++ b/source/blender/python/api2_2x/Object.c @@ -44,6 +44,7 @@ struct rctf; #include "DNA_view3d_types.h" #include "DNA_object_force.h" #include "DNA_userdef_types.h" +#include "DNA_key_types.h" /* for pinShape and activeShape */ #include "BKE_action.h" #include "BKE_anim.h" /* used for dupli-objects */ @@ -68,6 +69,7 @@ struct rctf; #include "BKE_modifier.h" #include "BKE_idprop.h" #include "BKE_object.h" +#include "BKE_key.h" /* for setting the activeShape */ #include "BSE_editipo.h" #include "BSE_edit.h" @@ -174,6 +176,7 @@ enum obj_consts { EXPP_OBJ_ATTR_PARENT_TYPE, EXPP_OBJ_ATTR_PASSINDEX, EXPP_OBJ_ATTR_ACT_MATERIAL, + EXPP_OBJ_ATTR_ACT_SHAPE, EXPP_OBJ_ATTR_PI_SURFACEDAMP, /* these need to stay together */ EXPP_OBJ_ATTR_PI_RANDOMDAMP, /* and in order */ @@ -331,7 +334,6 @@ struct PyMethodDef M_Object_methods[] = { static int setupSB(Object* ob); /*Make sure Softbody Pointer is initialized */ static int setupPI(Object* ob); -static PyObject *Object_GetProperties(BPy_Object * self); static PyObject *Object_buildParts( BPy_Object * self ); static PyObject *Object_clearIpo( BPy_Object * self ); static PyObject *Object_clrParent( BPy_Object * self, PyObject * args ); @@ -756,8 +758,6 @@ works only if self and the object specified are of the same type."}, "([s1<,s2,s3...>]) - Delete specified scriptlinks from this object."}, {"insertShapeKey", ( PyCFunction ) Object_insertShapeKey, METH_NOARGS, "() - Insert a Shape Key in the current object"}, - {"getProperties", ( PyCFunction ) Object_GetProperties, METH_NOARGS, - "() return a reference to the ID properties associated with this object."}, {"__copy__", ( PyCFunction ) Object_copy, METH_NOARGS, "() - Return a copy of this object."}, {"copy", ( PyCFunction ) Object_copy, METH_NOARGS, @@ -1021,12 +1021,6 @@ static PyObject *M_Object_Duplicate( PyObject * self_unused, /* Python BPy_Object methods: */ /*****************************************************************************/ -static PyObject *Object_GetProperties(BPy_Object * self) -{ - return BPy_Wrap_IDProperty( (ID*)self->object, IDP_GetProperties((ID*)self->object, 1), NULL ); - -} - static PyObject *Object_buildParts( BPy_Object * self ) { build_particle_system( self->object ); @@ -2733,14 +2727,16 @@ static PyObject *Object_shareFrom( BPy_Object * self, PyObject * args ) static PyObject *Object_getAllProperties( BPy_Object * self ) { - PyObject *prop_list; + PyObject *prop_list, *pyval; bProperty *prop = NULL; prop_list = PyList_New( 0 ); prop = self->object->prop.first; while( prop ) { - PyList_Append( prop_list, Property_CreatePyObject( prop ) ); + pyval = Property_CreatePyObject( prop ); + PyList_Append( prop_list, pyval ); + Py_DECREF(pyval); prop = prop->next; } return prop_list; @@ -3019,7 +3015,7 @@ static int Object_setDupliGroup( BPy_Object * self, PyObject * value ) static PyObject *Object_getEffects( BPy_Object * self ) { - PyObject *effect_list; + PyObject *effect_list, *pyval; Effect *eff; effect_list = PyList_New( 0 ); @@ -3030,7 +3026,9 @@ static PyObject *Object_getEffects( BPy_Object * self ) eff = self->object->effect.first; while( eff ) { - PyList_Append( effect_list, EffectCreatePyObject( eff, self->object ) ); + pyval = EffectCreatePyObject( eff, self->object ); + PyList_Append( effect_list, pyval ); + Py_DECREF(pyval); eff = eff->next; } return effect_list; @@ -3571,6 +3569,9 @@ static PyObject *getIntAttr( BPy_Object *self, void *type ) case EXPP_OBJ_ATTR_ACT_MATERIAL: param = object->actcol; break; + case EXPP_OBJ_ATTR_ACT_SHAPE: + param = object->shapenr; + break; default: return EXPP_ReturnPyObjError( PyExc_RuntimeError, "undefined type in getIntAttr" ); @@ -3632,6 +3633,20 @@ static int setIntAttrClamp( BPy_Object *self, PyObject *value, void *type ) size = 'b'; /* in case max is later made > 128 */ param = (void *)&object->actcol; break; + case EXPP_OBJ_ATTR_ACT_SHAPE: + { + Key *key= ob_get_key(object); + KeyBlock *kb; + min = 1; + max = 0; + if (key) { + max= 1; + for (kb = key->block.first; kb; kb=kb->next, max++); + } + size = 'h'; /* in case max is later made > 128 */ + param = (void *)&object->shapenr; + break; + } default: return EXPP_ReturnIntError( PyExc_RuntimeError, "undefined type in setIntAttrClamp"); @@ -4144,6 +4159,26 @@ static int setFloat3Attr( BPy_Object *self, PyObject *value, void *type ) /* BPy_Object methods and attribute handlers */ /*****************************************************************************/ +static PyObject *Object_getShapeFlag( BPy_Object *self, void *type ) +{ + if (self->object->shapeflag & (int)type) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; +} + +static int Object_setShapeFlag( BPy_Object *self, PyObject *value, + void *type ) +{ + if (PyObject_IsTrue(value) ) + self->object->shapeflag |= (int)type; + else + self->object->shapeflag &= ~(int)type; + + self->object->recalc |= OB_RECALC_OB; + return 0; +} + static PyObject *Object_getRestricted( BPy_Object *self, void *type ) { if (self->object->restrictflag & (int)type) @@ -5013,8 +5048,16 @@ static PyGetSetDef BPy_Object_getseters[] = { "Toggle object restrictions", (void *)OB_RESTRICT_RENDER}, - {"properties", (getter)Object_GetProperties, (setter)NULL, - "Get the ID properties associated with this object"}, + {"pinShape", + (getter)Object_getShapeFlag, (setter)Object_setShapeFlag, + "Set the state for pinning this object", + (void *)OB_SHAPE_LOCK}, + {"activeShape", + (getter)getIntAttr, (setter)setIntAttrClamp, + "set the index for the active shape key", + (void *)EXPP_OBJ_ATTR_ACT_SHAPE}, + + {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ }; diff --git a/source/blender/python/api2_2x/Text.c b/source/blender/python/api2_2x/Text.c index 8741cab1a7f..ea1f5aeb8f1 100644 --- a/source/blender/python/api2_2x/Text.c +++ b/source/blender/python/api2_2x/Text.c @@ -452,6 +452,7 @@ static PyObject *Text_asLines( BPy_Text * self ) while( line ) { ob = Py_BuildValue( "s", line->line ); PyList_Append( list, ob ); + Py_DECREF(ob); line = line->next; } diff --git a/source/blender/python/api2_2x/Text3d.c b/source/blender/python/api2_2x/Text3d.c index df152217524..287eec4a7b1 100644 --- a/source/blender/python/api2_2x/Text3d.c +++ b/source/blender/python/api2_2x/Text3d.c @@ -544,7 +544,7 @@ PyObject *M_Text3d_Get( PyObject * self, PyObject * args ) &Text3d_Type ); found_text3d->curve = curv_iter; PyList_Append( curvlist, ( PyObject * ) found_text3d ); - + Py_DECREF(found_text3d); curv_iter = curv_iter->id.next; } return ( curvlist ); diff --git a/source/blender/python/api2_2x/Types.c b/source/blender/python/api2_2x/Types.c index d37881bf25b..bff227e440a 100644 --- a/source/blender/python/api2_2x/Types.c +++ b/source/blender/python/api2_2x/Types.c @@ -121,7 +121,7 @@ void types_InitAll( void ) Text_Type.ob_type = &PyType_Type; Text3d_Type.ob_type = &PyType_Type; Texture_Type.ob_type = &PyType_Type; - TimeLine_Type.ob_type = &PyType_Type; + //TimeLine_Type.ob_type = &PyType_Type; World_Type.ob_type = &PyType_Type; buffer_Type.ob_type = &PyType_Type; constant_Type.ob_type = &PyType_Type; diff --git a/source/blender/python/api2_2x/World.c b/source/blender/python/api2_2x/World.c index c321fccb044..ec73caa962b 100644 --- a/source/blender/python/api2_2x/World.c +++ b/source/blender/python/api2_2x/World.c @@ -439,7 +439,8 @@ static PyObject *M_World_Get( PyObject * self, PyObject * args ) &World_Type ); found_world->world = world_iter; PyList_Append( worldlist, ( PyObject * ) found_world ); - + Py_DECREF(found_world); + world_iter = world_iter->id.next; } return ( worldlist ); @@ -673,13 +674,13 @@ static PyObject *World_oldsetMistype( BPy_World * self, PyObject * args ) static PyObject *World_getHor( BPy_World * self ) { - PyObject *attr = PyList_New( 0 ); + PyObject *attr = PyList_New( 3 ); if( !attr ) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "couldn't create list" ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->horr ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->horg ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->horb ) ); + PyList_SET_ITEM( attr, 0, PyFloat_FromDouble( self->world->horr ) ); + PyList_SET_ITEM( attr, 1, PyFloat_FromDouble( self->world->horg ) ); + PyList_SET_ITEM( attr, 2, PyFloat_FromDouble( self->world->horb ) ); return attr; } @@ -705,13 +706,13 @@ static PyObject *World_oldsetHor( BPy_World * self, PyObject * args ) static PyObject *World_getZen( BPy_World * self ) { - PyObject *attr = PyList_New( 0 ); + PyObject *attr = PyList_New( 3 ); if( !attr ) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "couldn't create list" ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->zenr ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->zeng ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->zenb ) ); + PyList_SET_ITEM( attr, 0, PyFloat_FromDouble( self->world->zenr ) ); + PyList_SET_ITEM( attr, 1, PyFloat_FromDouble( self->world->zeng ) ); + PyList_SET_ITEM( attr, 2, PyFloat_FromDouble( self->world->zenb ) ); return attr; } @@ -738,13 +739,13 @@ static PyObject *World_oldsetZen( BPy_World * self, PyObject * args ) static PyObject *World_getAmb( BPy_World * self ) { - PyObject *attr = PyList_New( 0 ); + PyObject *attr = PyList_New( 3 ); if( !attr ) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "couldn't create list" ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->ambr ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->ambg ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->ambb ) ); + PyList_SET_ITEM( attr, 0, PyFloat_FromDouble( self->world->ambr ) ); + PyList_SET_ITEM( attr, 1, PyFloat_FromDouble( self->world->ambg ) ); + PyList_SET_ITEM( attr, 2, PyFloat_FromDouble( self->world->ambb ) ); return attr; } @@ -770,17 +771,17 @@ static PyObject *World_oldsetAmb( BPy_World * self, PyObject * args ) static PyObject *World_getStar( BPy_World * self ) { - PyObject *attr = PyList_New( 0 ); + PyObject *attr = PyList_New( 7 ); if( !attr ) return ( EXPP_ReturnPyObjError ( PyExc_RuntimeError, "couldn't create list" ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->starr ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->starg ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->starb ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->starsize ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->starmindist ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->stardist ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->starcolnoise ) ); + PyList_SET_ITEM( attr, 0, PyFloat_FromDouble( self->world->starr ) ); + PyList_SET_ITEM( attr, 1, PyFloat_FromDouble( self->world->starg ) ); + PyList_SET_ITEM( attr, 2, PyFloat_FromDouble( self->world->starb ) ); + PyList_SET_ITEM( attr, 3, PyFloat_FromDouble( self->world->starsize ) ); + PyList_SET_ITEM( attr, 4, PyFloat_FromDouble( self->world->starmindist ) ); + PyList_SET_ITEM( attr, 5, PyFloat_FromDouble( self->world->stardist ) ); + PyList_SET_ITEM( attr, 6, PyFloat_FromDouble( self->world->starcolnoise ) ); return attr; } @@ -815,18 +816,17 @@ static PyObject *World_oldsetStar( BPy_World * self, PyObject * args ) static PyObject *World_getMist( BPy_World * self ) { - PyObject *attr = PyList_New( 0 ); + PyObject *attr = PyList_New( 4 ); if( !attr ) return ( EXPP_ReturnPyObjError ( PyExc_RuntimeError, "couldn't create list" ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->misi ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->miststa ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->mistdist ) ); - PyList_Append( attr, PyFloat_FromDouble( self->world->misthi ) ); + PyList_SET_ITEM( attr, 0, PyFloat_FromDouble( self->world->misi ) ); + PyList_SET_ITEM( attr, 1, PyFloat_FromDouble( self->world->miststa ) ); + PyList_SET_ITEM( attr, 2, PyFloat_FromDouble( self->world->mistdist ) ); + PyList_SET_ITEM( attr, 3, PyFloat_FromDouble( self->world->misthi ) ); return attr; } - static int World_setMist( BPy_World * self, PyObject * value ) { if( !PyList_Check( value ) ) diff --git a/source/blender/python/api2_2x/constant.c b/source/blender/python/api2_2x/constant.c index 2f74007f617..3a64de610f1 100644 --- a/source/blender/python/api2_2x/constant.c +++ b/source/blender/python/api2_2x/constant.c @@ -144,11 +144,13 @@ static PyObject *constant_getAttro(BPy_constant * self, PyObject *value) static PyObject *constant_repr(BPy_constant * self) { char str[4096]; - PyObject *key, *value; + PyObject *key, *value, *tempstr; int pos = 0; BLI_strncpy(str,"[Constant: ",4096); - value = PyDict_GetItem( self->dict, PyString_FromString("name") ); + tempstr = PyString_FromString("name"); + value = PyDict_GetItem( self->dict, tempstr ); + Py_DECREF(tempstr); if(value) { strcat(str, PyString_AsString(value)); } else { diff --git a/source/blender/python/api2_2x/doc/Mesh.py b/source/blender/python/api2_2x/doc/Mesh.py index ae4c4370e3f..2b858ab7748 100644 --- a/source/blender/python/api2_2x/doc/Mesh.py +++ b/source/blender/python/api2_2x/doc/Mesh.py @@ -885,12 +885,20 @@ class Mesh: @param object: The Blender Object linked to the mesh. """ - def update(): + def update(key=None): """ Update display lists after changes to mesh. B{Note}: with changes taking place for using a directed acyclic graph (DAG) for scene and object updating, this method may be only temporary and may be removed in future releases. + @type key: string + @param key: Use this optional argument to write the current vertex + locations to the a shape key. the name must match an existing shape key for this mesh + See L{Mesh.Mesh.key} and L{Key.Key.blocks} to get a list of the named shape keys, setting the active keys is + done from the object with L{Object.Object.pinShape}, L{Object.Object.activeShape}. + + + @warn: Since Blender 2.42 this function has changed; now it won't recalculate vertex normals (seen when faces are smooth). See L{Mesh.calcNormals()}. """ diff --git a/source/blender/python/api2_2x/doc/Object.py b/source/blender/python/api2_2x/doc/Object.py index a837fd058c1..34c06c5a4d8 100644 --- a/source/blender/python/api2_2x/doc/Object.py +++ b/source/blender/python/api2_2x/doc/Object.py @@ -465,6 +465,17 @@ class Object: Value is clamped to [1,len(ob.materials)]. - [0,0] when there is no materials applied to the object. @type activeMaterial: int + @ivar activeShape: The active shape key index for this object. + + The active index is used to select the material to edit in the material buttons, + new data created will also use the active material. + + Value is clamped to [1,len(ob.data.key.blocks)]. - [0,0] when there are no keys. + + @type activeShape: int + + @ivar pinShape: If True, only the activeShape will be displayed. + @type pinShape: bool @ivar drawSize: The size to display the Empty. Value clamped to [0.01,10.0]. @type drawSize: float diff --git a/source/blender/python/api2_2x/gen_utils.c b/source/blender/python/api2_2x/gen_utils.c index 4cebcfcb056..93ceeda13f1 100644 --- a/source/blender/python/api2_2x/gen_utils.c +++ b/source/blender/python/api2_2x/gen_utils.c @@ -386,7 +386,7 @@ void EXPP_allqueue(unsigned short event, short val) PyObject *EXPP_getScriptLinks( ScriptLink * slink, PyObject * args, int is_scene ) { - PyObject *list = NULL; + PyObject *list = NULL, *tmpstr; char *eventname = NULL; int i, event = 0; @@ -414,15 +414,18 @@ PyObject *EXPP_getScriptLinks( ScriptLink * slink, PyObject * args, event = SCRIPT_ONLOAD; else if( is_scene && !strcmp( eventname, "OnSave" ) ) event = SCRIPT_ONSAVE; - else + else { + Py_XDECREF(list); return EXPP_ReturnPyObjError( PyExc_AttributeError, "invalid event name" ); - + } + for( i = 0; i < slink->totscript; i++ ) { - if( ( slink->flag[i] == event ) && slink->scripts[i] ) - PyList_Append( list, - PyString_FromString( slink->scripts[i]-> - name + 2 ) ); + if( ( slink->flag[i] == event ) && slink->scripts[i] ) { + tmpstr =PyString_FromString( slink->scripts[i]->name + 2 ); + PyList_Append( list, tmpstr ); + Py_DECREF(tmpstr); + } } return list; diff --git a/source/blender/python/api2_2x/logic.c b/source/blender/python/api2_2x/logic.c index a6bac521152..f7e8e27c2f5 100644 --- a/source/blender/python/api2_2x/logic.c +++ b/source/blender/python/api2_2x/logic.c @@ -152,7 +152,8 @@ int updateProperyData( BPy_Property * self ) static int checkValidData_ptr( BPy_Property * self ) { int length; - //test pointer to see if data was removed (oops) + /* test pointer to see if data was removed (oops) */ + /* WARNING!!! - MEMORY LEAK HERE, why not free this??? */ length = MEM_allocN_len( self->property ); if( length != sizeof( bProperty ) ) { //data was freed self->property = NULL; @@ -312,11 +313,9 @@ static int Property_compare( BPy_Property * a, BPy_Property * b ) property-> data ) ) ); } else if( py_propB->property->type == PROP_STRING ) { - retval = PyObject_Compare( py_propA->data, - PyString_FromString - ( py_propB-> - property-> - poin ) ); + PyObject *tmpstr = PyString_FromString( py_propB->property->poin ); + retval = PyObject_Compare( py_propA->data, tmpstr ); + Py_DECREF(tmpstr); } } else retval = -1; diff --git a/source/blender/python/api2_2x/sceneTimeLine.c b/source/blender/python/api2_2x/sceneTimeLine.c index 0a68c63752c..ab74115574e 100644 --- a/source/blender/python/api2_2x/sceneTimeLine.c +++ b/source/blender/python/api2_2x/sceneTimeLine.c @@ -170,7 +170,7 @@ static PyObject *TimeLine_getFramesMarked (BPy_TimeLine *self, PyObject *args) { PyObject *marker_dict= NULL; TimeMarker *marker_it= NULL; - PyObject *tmarker= NULL, *pyo= NULL; + PyObject *tmarker= NULL, *pyo= NULL, *tmpstr; if (!PyArg_ParseTuple (args, "|O", &tmarker)) return EXPP_ReturnPyObjError (PyExc_AttributeError, @@ -196,13 +196,16 @@ static PyObject *TimeLine_getFramesMarked (BPy_TimeLine *self, PyObject *args) { for (marker_it= self->marker_list->first; marker_it; marker_it= marker_it->next){ if (marker_it->frame==frm) { pyo= PyDict_GetItem ((PyObject*)marker_dict, PyInt_FromLong ((long int)marker_it->frame)); + tmpstr = PyString_FromString(marker_it->name); if (pyo) { - PyList_Append (pyo, PyString_FromString (marker_it->name)); - Py_INCREF (pyo); + PyList_Append (pyo, tmpstr); + Py_INCREF(pyo); }else{ - pyo = PyList_New (0); - PyList_Append (pyo, PyString_FromString (marker_it->name)); + pyo = PyList_New(0); + PyList_Append (pyo, tmpstr); } + Py_DECREF(tmpstr); + PyDict_SetItem (marker_dict, PyInt_FromLong ((long int)marker_it->frame), pyo); if (pyo) { Py_DECREF (pyo); @@ -216,13 +219,16 @@ static PyObject *TimeLine_getFramesMarked (BPy_TimeLine *self, PyObject *args) { marker_dict= PyDict_New (); for (marker_it= self->marker_list->first; marker_it; marker_it= marker_it->next) { pyo=PyDict_GetItem ((PyObject*)marker_dict, PyInt_FromLong ((long int)marker_it->frame)); + tmpstr = PyString_FromString(marker_it->name); if (pyo) { - PyList_Append (pyo, PyString_FromString (marker_it->name)); + PyList_Append (pyo, tmpstr); Py_INCREF (pyo); }else{ pyo= PyList_New (0); - PyList_Append (pyo, PyString_FromString (marker_it->name)); + PyList_Append (pyo, tmpstr); } + Py_DECREF(tmpstr); + PyDict_SetItem (marker_dict, PyInt_FromLong ((long int)marker_it->frame), pyo); if (pyo) { Py_DECREF (pyo); diff --git a/source/blender/python/api2_2x/windowTheme.c b/source/blender/python/api2_2x/windowTheme.c index 237cf1d0dae..813507e5188 100644 --- a/source/blender/python/api2_2x/windowTheme.c +++ b/source/blender/python/api2_2x/windowTheme.c @@ -685,8 +685,7 @@ static PyObject *Theme_get( BPy_Theme * self, PyObject * args ) while( type < EXPP_THEME_NUMBEROFTHEMES ) { PyList_SET_ITEM( ret, type, - PyString_FromString( themes_map[type]. - sval ) ); + PyString_FromString( themes_map[type].sval ) ); type++; } |