Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2007-05-25 20:43:25 +0400
committerCampbell Barton <ideasman42@gmail.com>2007-05-25 20:43:25 +0400
commitf231bd0d5715ac67767f96f3a8d20ebf618f7b03 (patch)
tree34c05572641b2eafad9fa8e342724e0b05b6b3d8
parenta21f8292d9aeff54153fc65560d56b3d4f33575a (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)
-rw-r--r--source/blender/python/BPY_interface.c1
-rw-r--r--source/blender/python/api2_2x/Armature.c50
-rw-r--r--source/blender/python/api2_2x/Bone.c76
-rw-r--r--source/blender/python/api2_2x/CurNurb.c3
-rw-r--r--source/blender/python/api2_2x/Curve.c2
-rw-r--r--source/blender/python/api2_2x/Draw.c3
-rw-r--r--source/blender/python/api2_2x/Effect.c15
-rw-r--r--source/blender/python/api2_2x/Font.c2
-rw-r--r--source/blender/python/api2_2x/Ipo.c51
-rw-r--r--source/blender/python/api2_2x/Key.c63
-rw-r--r--source/blender/python/api2_2x/Lattice.c6
-rw-r--r--source/blender/python/api2_2x/Mesh.c63
-rw-r--r--source/blender/python/api2_2x/NMesh.c37
-rw-r--r--source/blender/python/api2_2x/Object.c73
-rw-r--r--source/blender/python/api2_2x/Text.c1
-rw-r--r--source/blender/python/api2_2x/Text3d.c2
-rw-r--r--source/blender/python/api2_2x/Types.c2
-rw-r--r--source/blender/python/api2_2x/World.c54
-rw-r--r--source/blender/python/api2_2x/constant.c6
-rw-r--r--source/blender/python/api2_2x/doc/Mesh.py10
-rw-r--r--source/blender/python/api2_2x/doc/Object.py11
-rw-r--r--source/blender/python/api2_2x/gen_utils.c17
-rw-r--r--source/blender/python/api2_2x/logic.c11
-rw-r--r--source/blender/python/api2_2x/sceneTimeLine.c20
-rw-r--r--source/blender/python/api2_2x/windowTheme.c3
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++;
}