Python API

----------
Add Material.enabledTextures attribute; this allows users to enable and
disable textures assigned to a material.
This commit is contained in:
Ken Hughes
2008-08-18 22:39:55 +00:00
parent 17e4222230
commit deadd5ee01
2 changed files with 105 additions and 6 deletions

View File

@@ -554,6 +554,7 @@ static int Material_setSssTexScatter( BPy_Material * self, PyObject * value );
static int Material_setSssFront( BPy_Material * self, PyObject * value );
static int Material_setSssBack( BPy_Material * self, PyObject * value );
static int Material_setSssBack( BPy_Material * self, PyObject * value );
static int Material_setTexChannel( BPy_Material * self, PyObject * value );
static PyObject *Material_getColorComponent( BPy_Material * self,
void * closure );
@@ -633,6 +634,7 @@ static PyObject *Material_getSssBack( BPy_Material * self );
static PyObject *Material_getFilter( BPy_Material * self );
static PyObject *Material_getTranslucency( BPy_Material * self );
static PyObject *Material_getTextures( BPy_Material * self );
static PyObject *Material_getTexChannel( BPy_Material * self );
static PyObject *Material_clearIpo( BPy_Material * self );
static PyObject *Material_setTexture( BPy_Material * self, PyObject * args );
@@ -1140,7 +1142,11 @@ static PyGetSetDef BPy_Material_getseters[] = {
NULL},
{"lightGroup",
(getter)Material_getLightGroup, (setter)Material_setLightGroup,
"Set the light group for this material",
"The light group for this material",
NULL},
{"enabledTextures",
(getter)Material_getTexChannel, (setter)Material_setTexChannel,
"Enabled texture channels for this material",
NULL},
{"R",
(getter)Material_getColorComponent, (setter)Material_setColorComponent,
@@ -1517,6 +1523,36 @@ static PyObject *Material_getLightGroup( BPy_Material * self )
return Group_CreatePyObject( self->material->group );
}
static PyObject *Material_getTexChannel( BPy_Material * self )
{
int i;
short mask = 1;
PyObject *list = PyList_New(0);
if( !list )
return EXPP_ReturnPyObjError( PyExc_MemoryError,
"PyList_New() failed" );
for( i = 0, mask = 1; i < MAX_MTEX ; ++i, mask <<= 1 ) {
if( self->material->mtex[i] && (mask & self->material->septex) == 0 ) {
PyObject * val = PyInt_FromLong(i);
if( !val ) {
Py_DECREF( list );
return EXPP_ReturnPyObjError( PyExc_MemoryError,
"PyInt_FromLong() failed" );
}
if( PyList_Append( list, val ) < 0 ) {
Py_DECREF( val );
Py_DECREF( list );
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"PyList_Append() failed" );
}
Py_DECREF( val );
}
}
return list;
}
static PyObject *Material_getHaloSize( BPy_Material * self )
{
return PyFloat_FromDouble( ( double ) self->material->hasize );
@@ -1982,6 +2018,57 @@ 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_setTexChannel( BPy_Material * self, PyObject * value )
{
int i, mask;
short septex = 0;
int result = 1;
/* fail if input is not a standard sequence */
if( !PyList_Check( value ) && !PyTuple_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected tuple or list of integers" );
/* get a fast sequence; in Python 2.5, this just return the original
* list or tuple and INCREFs it, so we must DECREF */
value = PySequence_Fast( value, "" );
/* set the disable bit for each existing texture */
for( i= 0, mask= 1; i < MAX_MTEX; ++i, mask <<= 1 )
if( self->material->mtex[i] != NULL )
septex |= mask;
/* check the list, and build new septex value */
for( i= PySequence_Size(value)-1; i >= 0; --i ) {
long ival;
PyObject *item = PySequence_Fast_GET_ITEM( value, i );
if( !PyInt_Check( item ) ) {
PyErr_SetString ( PyExc_TypeError,
"expected tuple or list of integers" );
goto exit;
}
ival= PyInt_AsLong( item );
if(ival < 0 || ival > MAX_MTEX) {
PyErr_SetString( PyExc_ValueError,
"channel value out of range" );
goto exit;
}
ival&= (1<<MAX_MTEX)-1;
if( self->material->mtex[(int)ival] == NULL ) {
PyErr_SetString( PyExc_ValueError,
"channels must have a texture assigned" );
goto exit;
}
septex&= ~(1<<ival);
}
self->material->septex= septex;
result = 0;
exit:
Py_DECREF(value);
return result;
}
static int Material_setAdd( BPy_Material * self, PyObject * value )
{
return EXPP_setFloatClamped ( value, &self->material->add,
@@ -2313,9 +2400,6 @@ static int Material_setSssBack( BPy_Material * self, PyObject * value )
EXPP_MAT_SSS_BACK_MAX);
}
static PyObject *Material_setTexture( BPy_Material * self, PyObject * args )
{
int texnum;

View File

@@ -323,6 +323,21 @@ class Material:
each color a list of 5 floats [0 - 1], [r,g,b,a,pos].
The colorband can have between 1 and 31 colors.
@type colorbandSpecular: list
@type enabledTextures: list of integers
@ivar enabledTextures: The texture channels enabled in this material.
The attribute returns is list of integers in the range [0, 9], each
number representing the respective enabled MTex entry (see
L{getTextures()<getTextures>}). Enabling is done by assigning
a list of ints or an empty list. Attempting to enable a channel
which does not have a texture assigned to it will result in a
ValueError exception.
Example::
mat.enabledTextures = [] # no texture channels are enabled
mat.enabledTextures = [0, 6] # texture channels 0 and 6 are enabled
ch = mat.enabledTextures
ch.append(4)
mat.enabledTextures = ch
print mat.enabledTextures # will print: [0, 4, 6]
@ivar enableSSS: If True, subsurface scattering will be rendered on this material.
@type enableSSS: bool
@@ -1010,7 +1025,7 @@ class Material:
def setTexture(index, texture, texco, mapto):
"""
Assign a Blender Texture object to slot number 'number'.
Assign a Blender Texture object to channel number 'number'.
@type index: int
@param index: material's texture index in [0, 9].
@type texture: Blender Texture
@@ -1033,7 +1048,7 @@ class Material:
Get this Material's Texture list.
@rtype: list of MTex
@return: a list of Blender MTex objects. None is returned for each empty
texture slot.
texture channel.
"""
def getScriptLinks (event):