BPython API

added a function - GenericLib_assignData for assigning blender data, to assign an ipo to a camera or world to a scene for instance.
Using this function removed ~300 lines of code.
also fixes user count error in some places that didnt check.

also made it possible to clear the colorband by setting it to []
This commit is contained in:
2007-03-08 14:37:34 +00:00
parent 51c16edabc
commit 5eaf9f90c1
16 changed files with 184 additions and 619 deletions

View File

@@ -1818,49 +1818,10 @@ static PyObject *Material_getTextures( BPy_Material * self )
static int Material_setIpo( BPy_Material * self, PyObject * value )
{
Ipo *ipo = NULL;
Ipo *oldipo = self->material->ipo;
ID *id;
/* if parameter is not None, check for valid Ipo */
if ( value != Py_None ) {
if ( !Ipo_CheckPyObject( value ) )
return EXPP_ReturnIntError( PyExc_RuntimeError,
"expected an Ipo object" );
ipo = Ipo_FromPyObject( value );
if( !ipo )
return EXPP_ReturnIntError( PyExc_RuntimeError,
"null ipo!" );
if( ipo->blocktype != ID_MA )
return EXPP_ReturnIntError( PyExc_TypeError,
"Ipo is not a material data Ipo" );
}
/* if already linked to Ipo, delete link */
if ( oldipo ) {
id = &oldipo->id;
if( id->us > 0 )
id->us--;
}
/* assign new Ipo and increment user count, or set to NULL if deleting */
self->material->ipo = ipo;
if ( ipo ) {
id = &ipo->id;
id_us_plus(id);
}
return 0;
return GenericLib_assignData(value, (void **) &self->material->ipo, 0, 1, ID_IP, ID_MA);
}
/*
* Material_insertIpoKey( key )
* inserts Material IPO key at current frame
@@ -2084,18 +2045,9 @@ static int Material_setZOffset( BPy_Material * self, PyObject * value )
EXPP_MAT_ZOFFS_MAX );
}
static int Material_setLightGroup( BPy_Material * self, PyObject * value ) {
BPy_Group *pygrp=NULL;
if ( PyObject_TypeCheck(value, &Group_Type) ) {
pygrp= (BPy_Group *)value;
self->material->group= pygrp->group;
} else if (value==Py_None) {
self->material->group= NULL;
} else {
return EXPP_ReturnIntError( PyExc_TypeError,
"expected a group or None" );
}
return 0;
static int Material_setLightGroup( BPy_Material * self, PyObject * value )
{
return GenericLib_assignData(value, (void **) &self->material->group, NULL, 1, ID_GR, 0);
}
static int Material_setAdd( BPy_Material * self, PyObject * value )
@@ -2505,22 +2457,31 @@ PyObject *EXPP_PyList_fromColorband( ColorBand *coba )
}
/* make sure you coba is not none before calling this */
int EXPP_Colorband_fromPyList( ColorBand *coba, PyObject * value )
int EXPP_Colorband_fromPyList( ColorBand **coba, PyObject * value )
{
short totcol, i;
PyObject *colseq;
PyObject *pyflt;
float f;
if ( !PySequence_Check( value ) )
if ( !PySequence_Check( value ) )
return ( EXPP_ReturnIntError( PyExc_TypeError,
"Colorband must be a sequence" ) );
totcol = PySequence_Size(value);
if (totcol < 1 || totcol > 31)
if ( totcol > 31)
return ( EXPP_ReturnIntError( PyExc_ValueError,
"Colorband must be between 1 and 31 in length" ) );
if (totcol==0) {
MEM_freeN(*coba);
*coba = NULL;
return 0;
}
if (!*coba)
*coba = MEM_callocN( sizeof(ColorBand), "colorband");
for (i=0; i<totcol; i++) {
colseq = PySequence_GetItem( value, i );
if ( !PySequence_Check( colseq ) || PySequence_Size( colseq ) != 5) {
@@ -2542,38 +2503,38 @@ int EXPP_Colorband_fromPyList( ColorBand *coba, PyObject * value )
}
/* ok, continue - should check for 5 floats, will ignore non floats for now */
coba->tot = totcol;
(*coba)->tot = totcol;
for (i=0; i<totcol; i++) {
colseq = PySequence_GetItem( value, i );
pyflt = PySequence_GetItem( colseq, 0 );
f = (float)PyFloat_AsDouble( pyflt );
CLAMP(f, 0.0, 1.0);
coba->data[i].r = f;
(*coba)->data[i].r = f;
Py_DECREF ( pyflt );
pyflt = PySequence_GetItem( colseq, 1 );
f = (float)PyFloat_AsDouble( pyflt );
CLAMP(f, 0.0, 1.0);
coba->data[i].g = f;
(*coba)->data[i].g = f;
Py_DECREF ( pyflt );
pyflt = PySequence_GetItem( colseq, 2 );
f = (float)PyFloat_AsDouble( pyflt );
CLAMP(f, 0.0, 1.0);
coba->data[i].b = f;
(*coba)->data[i].b = f;
Py_DECREF ( pyflt );
pyflt = PySequence_GetItem( colseq, 3 );
f = (float)PyFloat_AsDouble( pyflt );
CLAMP(f, 0.0, 1.0);
coba->data[i].a = f;
(*coba)->data[i].a = f;
Py_DECREF ( pyflt );
pyflt = PySequence_GetItem( colseq, 4 );
f = (float)PyFloat_AsDouble( pyflt );
CLAMP(f, 0.0, 1.0);
coba->data[i].pos = f;
(*coba)->data[i].pos = f;
Py_DECREF ( pyflt );
Py_DECREF ( colseq );
@@ -2814,13 +2775,9 @@ int Material_setColorband( BPy_Material * self, PyObject * value, void * type)
{
switch( (long)type ) {
case 0: /* these are backwards, but that how it works */
if (!self->material->ramp_col)
self->material->ramp_col = MEM_callocN( sizeof(ColorBand), "colorband");
return EXPP_Colorband_fromPyList( self->material->ramp_col, value );
return EXPP_Colorband_fromPyList( &self->material->ramp_col, value );
case 1:
if (!self->material->ramp_spec)
self->material->ramp_spec = MEM_callocN( sizeof(ColorBand), "colorband");
return EXPP_Colorband_fromPyList( self->material->ramp_spec, value );
return EXPP_Colorband_fromPyList( &self->material->ramp_spec, value );
}
return 0;
}