2006-04-23 02:34:50 +00:00
/*
2008-03-03 03:21:25 +00:00
* $ Id $
2006-04-23 02:34:50 +00:00
*
* * * * * * BEGIN GPL / BL DUAL LICENSE BLOCK * * * * *
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version . The Blender
* Foundation also sells licenses for use in proprietary software under
* the Blender License . See http : //www.blender.org/BL/ for information
* about this .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software Foundation ,
* Inc . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
*
* This is a new part of Blender .
*
2006-04-28 20:32:41 +00:00
* Contributor ( s ) : Ken Hughes , Campbell Barton
2006-04-23 02:34:50 +00:00
*
* * * * * * END GPL / BL DUAL LICENSE BLOCK * * * * *
*/
2006-09-24 08:30:38 +00:00
/* TODO, accessing a modifier sequence of a deleted object will crash blender at the moment, not sure how to fix this. */
2006-04-23 02:34:50 +00:00
# include "Modifier.h" /*This must come first*/
# include "DNA_object_types.h"
# include "DNA_effect_types.h"
2006-06-14 04:41:31 +00:00
# include "DNA_armature_types.h"
2006-04-23 02:34:50 +00:00
# include "DNA_vec_types.h"
# include "BKE_main.h"
# include "BKE_global.h"
# include "BKE_modifier.h"
# include "BKE_library.h"
# include "BLI_blenlib.h"
2007-04-05 16:04:40 +00:00
# include "BLI_arithb.h"
2006-04-23 02:34:50 +00:00
# include "MEM_guardedalloc.h"
2008-03-03 03:21:25 +00:00
# include "BDR_editobject.h"
2006-04-23 02:34:50 +00:00
# include "butspace.h"
# include "blendef.h"
# include "mydevice.h"
# include "Object.h"
2007-03-04 11:48:37 +00:00
# include "Texture.h"
2006-09-17 02:31:16 +00:00
# include "Mathutils.h"
2006-04-23 02:34:50 +00:00
# include "gen_utils.h"
2007-03-11 04:05:45 +00:00
# include "gen_library.h"
2006-04-23 02:34:50 +00:00
2006-09-24 08:30:38 +00:00
/* checks for the scene being removed */
# define MODIFIER_DEL_CHECK_PY(bpy_modifier) if (!(bpy_modifier->md)) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "Modifier has been removed" ) )
# define MODIFIER_DEL_CHECK_INT(bpy_modifier) if (!(bpy_modifier->md)) return ( EXPP_ReturnIntError( PyExc_RuntimeError, "Modifier has been removed" ) )
2006-04-23 02:34:50 +00:00
enum mod_constants {
2006-04-25 13:01:19 +00:00
/*Apply to all modifiers*/
2006-04-23 02:34:50 +00:00
EXPP_MOD_RENDER = 0 ,
EXPP_MOD_REALTIME ,
EXPP_MOD_EDITMODE ,
EXPP_MOD_ONCAGE ,
2006-04-25 13:01:19 +00:00
/*GENERIC*/
EXPP_MOD_OBJECT , /*ARMATURE, LATTICE, CURVE, BOOLEAN, ARRAY*/
2007-04-29 18:13:55 +00:00
EXPP_MOD_VERTGROUP , /*ARMATURE, LATTICE, CURVE, SMOOTH, CAST*/
2006-04-25 13:01:19 +00:00
EXPP_MOD_LIMIT , /*ARRAY, MIRROR*/
EXPP_MOD_FLAG , /*MIRROR, WAVE*/
EXPP_MOD_COUNT , /*DECIMATOR, ARRAY*/
2006-09-17 02:31:16 +00:00
EXPP_MOD_LENGTH , /*BUILD, ARRAY*/
2007-04-29 18:13:55 +00:00
EXPP_MOD_FACTOR , /*SMOOTH, CAST*/
EXPP_MOD_ENABLE_X , /*SMOOTH, CAST*/
EXPP_MOD_ENABLE_Y , /*SMOOTH, CAST*/
EXPP_MOD_ENABLE_Z , /*SMOOTH, CAST*/
EXPP_MOD_TYPES , /*SUBSURF, CAST*/
2006-04-25 13:01:19 +00:00
2007-05-22 17:41:32 +00:00
/*SUBSURF SPECIFIC*/
2006-04-25 13:01:19 +00:00
EXPP_MOD_LEVELS ,
EXPP_MOD_RENDLEVELS ,
EXPP_MOD_OPTIMAL ,
EXPP_MOD_UV ,
2007-05-22 17:41:32 +00:00
/*ARMATURE SPECIFIC*/
2006-04-25 13:01:19 +00:00
EXPP_MOD_ENVELOPES ,
2007-05-22 17:41:32 +00:00
/*ARRAY SPECIFIC*/
2006-09-17 02:31:16 +00:00
EXPP_MOD_OBJECT_OFFSET ,
EXPP_MOD_OBJECT_CURVE ,
EXPP_MOD_OFFSET_VEC ,
EXPP_MOD_SCALE_VEC ,
EXPP_MOD_MERGE_DIST ,
2007-05-22 17:41:32 +00:00
/*BUILD SPECIFIC*/
2006-04-25 13:01:19 +00:00
EXPP_MOD_START ,
EXPP_MOD_SEED ,
EXPP_MOD_RANDOMIZE ,
2007-05-22 17:41:32 +00:00
/*MIRROR SPECIFIC*/
EXPP_MOD_AXIS_X ,
EXPP_MOD_AXIS_Y ,
EXPP_MOD_AXIS_Z ,
2006-04-25 13:01:19 +00:00
2007-05-22 17:41:32 +00:00
/*DECIMATE SPECIFIC*/
2006-04-25 13:01:19 +00:00
EXPP_MOD_RATIO ,
2007-05-22 17:41:32 +00:00
/*WAVE SPECIFIC*/
2006-04-25 13:01:19 +00:00
EXPP_MOD_STARTX ,
EXPP_MOD_STARTY ,
EXPP_MOD_HEIGHT ,
EXPP_MOD_WIDTH ,
EXPP_MOD_NARROW ,
EXPP_MOD_SPEED ,
EXPP_MOD_DAMP ,
EXPP_MOD_LIFETIME ,
EXPP_MOD_TIMEOFFS ,
2007-05-22 17:41:32 +00:00
/*BOOLEAN SPECIFIC*/
2007-01-26 15:43:11 +00:00
EXPP_MOD_OPERATION ,
2007-05-22 17:41:32 +00:00
/*EDGE SPLIT SPECIFIC */
2007-01-26 15:43:11 +00:00
EXPP_MOD_EDGESPLIT_ANGLE ,
EXPP_MOD_EDGESPLIT_FROM_ANGLE ,
2007-03-04 11:48:37 +00:00
EXPP_MOD_EDGESPLIT_FROM_SHARP ,
/* DISPLACE */
EXPP_MOD_UVLAYER ,
EXPP_MOD_MID_LEVEL ,
EXPP_MOD_STRENGTH ,
EXPP_MOD_TEXTURE ,
EXPP_MOD_MAPPING ,
2007-04-29 18:13:55 +00:00
EXPP_MOD_DIRECTION ,
/* SMOOTH */
EXPP_MOD_REPEAT ,
/* CAST */
EXPP_MOD_RADIUS ,
EXPP_MOD_SIZE ,
EXPP_MOD_USE_OB_TRANSFORM ,
EXPP_MOD_SIZE_FROM_RADIUS
2007-03-04 11:48:37 +00:00
2006-04-23 02:34:50 +00:00
/* yet to be implemented */
2006-04-25 13:01:19 +00:00
/* EXPP_MOD_HOOK_,*/
2006-09-17 02:31:16 +00:00
/* , */
2006-04-23 02:34:50 +00:00
} ;
/*****************************************************************************/
/* Python BPy_Modifier methods declarations: */
/*****************************************************************************/
static PyObject * Modifier_getName ( BPy_Modifier * self ) ;
static int Modifier_setName ( BPy_Modifier * self , PyObject * arg ) ;
2006-04-23 17:01:04 +00:00
static PyObject * Modifier_getType ( BPy_Modifier * self ) ;
2007-04-05 16:04:40 +00:00
static PyObject * Modifier_reset ( BPy_Modifier * self ) ;
2006-04-23 02:34:50 +00:00
static PyObject * Modifier_getData ( BPy_Modifier * self , PyObject * key ) ;
static int Modifier_setData ( BPy_Modifier * self , PyObject * key ,
PyObject * value ) ;
/*****************************************************************************/
/* Python BPy_Modifier methods table: */
/*****************************************************************************/
static PyMethodDef BPy_Modifier_methods [ ] = {
/* name, method, flags, doc */
2007-04-05 16:04:40 +00:00
{ " reset " , ( PyCFunction ) Modifier_reset , METH_NOARGS ,
" resets a hook modifier location " } ,
2006-04-23 02:34:50 +00:00
{ NULL , NULL , 0 , NULL }
} ;
/*****************************************************************************/
/* Python BPy_Modifier attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef BPy_Modifier_getseters [ ] = {
{ " name " ,
( getter ) Modifier_getName , ( setter ) Modifier_setName ,
" Modifier name " , NULL } ,
2006-04-23 17:01:04 +00:00
{ " type " ,
( getter ) Modifier_getType , ( setter ) NULL ,
2006-04-25 13:01:19 +00:00
" Modifier type (read only) " , NULL } ,
2006-04-23 02:34:50 +00:00
{ NULL , NULL , NULL , NULL , NULL } /* Sentinel */
} ;
/*****************************************************************************/
/* Python Modifier_Type Mapping Methods table: */
/*****************************************************************************/
static PyMappingMethods Modifier_as_mapping = {
NULL , /* mp_length */
( binaryfunc ) Modifier_getData , /* mp_subscript */
( objobjargproc ) Modifier_setData , /* mp_ass_subscript */
} ;
/*****************************************************************************/
/* Python Modifier_Type callback function prototypes: */
/*****************************************************************************/
static PyObject * Modifier_repr ( BPy_Modifier * self ) ;
/*****************************************************************************/
/* Python Modifier_Type structure definition: */
/*****************************************************************************/
PyTypeObject Modifier_Type = {
PyObject_HEAD_INIT ( NULL ) /* required py macro */
0 , /* ob_size */
/* For printing, in format "<module>.<name>" */
" Blender Modifier " , /* char *tp_name; */
sizeof ( BPy_Modifier ) , /* int tp_basicsize; */
0 , /* tp_itemsize; For allocation */
/* Methods to implement standard operations */
2007-03-15 01:47:53 +00:00
NULL , /* destructor tp_dealloc; */
2006-04-23 02:34:50 +00:00
NULL , /* printfunc tp_print; */
NULL , /* getattrfunc tp_getattr; */
NULL , /* setattrfunc tp_setattr; */
NULL , /* cmpfunc tp_compare; */
( reprfunc ) Modifier_repr , /* reprfunc tp_repr; */
/* Method suites for standard classes */
NULL , /* PyNumberMethods *tp_as_number; */
NULL , /* PySequenceMethods *tp_as_sequence; */
& Modifier_as_mapping , /* PyMappingMethods *tp_as_mapping; */
/* More standard operations (here for binary compatibility) */
NULL , /* hashfunc tp_hash; */
NULL , /* ternaryfunc tp_call; */
NULL , /* reprfunc tp_str; */
NULL , /* getattrofunc tp_getattro; */
NULL , /* setattrofunc tp_setattro; */
/* Functions to access object as input/output buffer */
NULL , /* PyBufferProcs *tp_as_buffer; */
/*** Flags to define presence of optional/expanded features ***/
Py_TPFLAGS_DEFAULT , /* long tp_flags; */
NULL , /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
/* call function for all accessible objects */
NULL , /* traverseproc tp_traverse; */
/* delete references to contained objects */
NULL , /* inquiry tp_clear; */
/*** Assigned meaning in release 2.1 ***/
/*** rich comparisons ***/
NULL , /* richcmpfunc tp_richcompare; */
/*** weak reference enabler ***/
0 , /* long tp_weaklistoffset; */
/*** Added in release 2.2 ***/
/* Iterators */
NULL , /* getiterfunc tp_iter; */
NULL , /* iternextfunc tp_iternext; */
/*** Attribute descriptor and subclassing stuff ***/
BPy_Modifier_methods , /* struct PyMethodDef *tp_methods; */
NULL , /* struct PyMemberDef *tp_members; */
BPy_Modifier_getseters , /* struct PyGetSetDef *tp_getset; */
NULL , /* struct _typeobject *tp_base; */
NULL , /* PyObject *tp_dict; */
NULL , /* descrgetfunc tp_descr_get; */
NULL , /* descrsetfunc tp_descr_set; */
0 , /* long tp_dictoffset; */
NULL , /* initproc tp_init; */
NULL , /* allocfunc tp_alloc; */
NULL , /* newfunc tp_new; */
/* Low-level free-memory routine */
NULL , /* freefunc tp_free; */
/* For PyObject_IS_GC */
NULL , /* inquiry tp_is_gc; */
NULL , /* PyObject *tp_bases; */
/* method resolution order */
NULL , /* PyObject *tp_mro; */
NULL , /* PyObject *tp_cache; */
NULL , /* PyObject *tp_subclasses; */
NULL , /* PyObject *tp_weaklist; */
NULL
} ;
/*****************************************************************************/
/* Python BPy_Modifier methods: */
/*****************************************************************************/
/*
* return the name of this modifier
*/
static PyObject * Modifier_getName ( BPy_Modifier * self )
{
2006-09-24 08:30:38 +00:00
MODIFIER_DEL_CHECK_PY ( self ) ;
2006-04-23 02:34:50 +00:00
return PyString_FromString ( self - > md - > name ) ;
}
/*
* set the name of this modifier
*/
static int Modifier_setName ( BPy_Modifier * self , PyObject * attr )
{
char * name = PyString_AsString ( attr ) ;
if ( ! name )
return EXPP_ReturnIntError ( PyExc_TypeError , " expected string arg " ) ;
2006-09-24 08:30:38 +00:00
MODIFIER_DEL_CHECK_INT ( self ) ;
2006-04-23 08:01:02 +00:00
2006-04-23 02:34:50 +00:00
BLI_strncpy ( self - > md - > name , name , sizeof ( self - > md - > name ) ) ;
return 0 ;
}
2006-04-23 17:01:04 +00:00
/*
* return the type of this modifier
*/
static PyObject * Modifier_getType ( BPy_Modifier * self )
{
2006-09-24 08:30:38 +00:00
MODIFIER_DEL_CHECK_PY ( self ) ;
2006-04-23 17:01:04 +00:00
return PyInt_FromLong ( self - > md - > type ) ;
}
2006-04-25 13:01:19 +00:00
static PyObject * subsurf_getter ( BPy_Modifier * self , int type )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
SubsurfModifierData * md = ( SubsurfModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
switch ( type ) {
2006-04-25 13:01:19 +00:00
case EXPP_MOD_TYPES :
2006-04-23 02:34:50 +00:00
return PyInt_FromLong ( ( long ) md - > subdivType ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_LEVELS :
2006-04-23 02:34:50 +00:00
return PyInt_FromLong ( ( long ) md - > levels ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_RENDLEVELS :
2006-04-23 02:34:50 +00:00
return PyInt_FromLong ( ( long ) md - > renderLevels ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_OPTIMAL :
2006-04-23 02:34:50 +00:00
return PyBool_FromLong ( ( long )
( md - > flags & eSubsurfModifierFlag_ControlEdges ) ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_UV :
2006-04-23 02:34:50 +00:00
return PyBool_FromLong ( ( long )
( md - > flags & eSubsurfModifierFlag_SubsurfUv ) ) ;
default :
return EXPP_ReturnPyObjError ( PyExc_KeyError ,
" key not found " ) ;
}
}
2006-04-25 13:01:19 +00:00
static int subsurf_setter ( BPy_Modifier * self , int type ,
2006-04-23 02:34:50 +00:00
PyObject * value )
{
2006-04-25 13:01:19 +00:00
SubsurfModifierData * md = ( SubsurfModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
switch ( type ) {
2006-04-25 13:01:19 +00:00
case EXPP_MOD_TYPES :
2006-04-23 02:34:50 +00:00
return EXPP_setIValueRange ( value , & md - > subdivType , 0 , 1 , ' h ' ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_LEVELS :
2006-04-23 02:34:50 +00:00
return EXPP_setIValueClamped ( value , & md - > levels , 1 , 6 , ' h ' ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_RENDLEVELS :
2006-04-23 02:34:50 +00:00
return EXPP_setIValueClamped ( value , & md - > renderLevels , 1 , 6 , ' h ' ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_OPTIMAL :
2006-04-23 02:34:50 +00:00
return EXPP_setBitfield ( value , & md - > flags ,
eSubsurfModifierFlag_ControlEdges , ' h ' ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_UV :
2006-04-23 02:34:50 +00:00
return EXPP_setBitfield ( value , & md - > flags ,
eSubsurfModifierFlag_SubsurfUv , ' h ' ) ;
default :
return EXPP_ReturnIntError ( PyExc_KeyError , " key not found " ) ;
}
}
2006-04-25 13:01:19 +00:00
static PyObject * armature_getter ( BPy_Modifier * self , int type )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
ArmatureModifierData * md = ( ArmatureModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
switch ( type ) {
2006-04-25 13:01:19 +00:00
case EXPP_MOD_OBJECT :
2006-04-23 02:34:50 +00:00
return Object_CreatePyObject ( md - > object ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_VERTGROUP :
2006-04-23 02:34:50 +00:00
return PyBool_FromLong ( ( long ) ( md - > deformflag & 1 ) ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_ENVELOPES :
2006-04-23 02:34:50 +00:00
return PyBool_FromLong ( ( long ) ( md - > deformflag & 2 ) ) ;
default :
return EXPP_ReturnPyObjError ( PyExc_KeyError , " key not found " ) ;
}
}
2006-04-25 13:01:19 +00:00
static int armature_setter ( BPy_Modifier * self , int type , PyObject * value )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
ArmatureModifierData * md = ( ArmatureModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
switch ( type ) {
2007-03-08 14:37:34 +00:00
case EXPP_MOD_OBJECT :
return GenericLib_assignData ( value , ( void * * ) & md - > object , 0 , 0 , ID_OB , OB_ARMATURE ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_VERTGROUP :
2006-04-23 02:34:50 +00:00
return EXPP_setBitfield ( value , & md - > deformflag , 1 , ' h ' ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_ENVELOPES :
2006-04-23 02:34:50 +00:00
return EXPP_setBitfield ( value , & md - > deformflag , 2 , ' h ' ) ;
default :
return EXPP_ReturnIntError ( PyExc_KeyError , " key not found " ) ;
}
}
2006-04-25 13:01:19 +00:00
static PyObject * lattice_getter ( BPy_Modifier * self , int type )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
LatticeModifierData * md = ( LatticeModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
switch ( type ) {
2006-04-25 13:01:19 +00:00
case EXPP_MOD_OBJECT :
2006-04-23 02:34:50 +00:00
return Object_CreatePyObject ( md - > object ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_VERTGROUP :
2006-04-23 02:34:50 +00:00
return PyString_FromString ( md - > name ) ;
default :
return EXPP_ReturnPyObjError ( PyExc_KeyError , " key not found " ) ;
}
}
2006-04-25 13:01:19 +00:00
static int lattice_setter ( BPy_Modifier * self , int type , PyObject * value )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
LatticeModifierData * md = ( LatticeModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
switch ( type ) {
2007-03-08 14:37:34 +00:00
case EXPP_MOD_OBJECT :
return GenericLib_assignData ( value , ( void * * ) & md - > object , ( void * * ) & self - > object , 0 , ID_OB , OB_LATTICE ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_VERTGROUP : {
2006-04-23 02:34:50 +00:00
char * name = PyString_AsString ( value ) ;
if ( ! name )
return EXPP_ReturnIntError ( PyExc_TypeError ,
" expected string arg " ) ;
BLI_strncpy ( md - > name , name , sizeof ( md - > name ) ) ;
break ;
}
default :
return EXPP_ReturnIntError ( PyExc_KeyError , " key not found " ) ;
}
return 0 ;
}
2006-04-25 13:01:19 +00:00
static PyObject * curve_getter ( BPy_Modifier * self , int type )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
CurveModifierData * md = ( CurveModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
switch ( type ) {
2006-04-25 13:01:19 +00:00
case EXPP_MOD_OBJECT :
2006-04-23 02:34:50 +00:00
return Object_CreatePyObject ( md - > object ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_VERTGROUP :
2006-04-23 02:34:50 +00:00
return PyString_FromString ( md - > name ) ;
default :
return EXPP_ReturnPyObjError ( PyExc_KeyError , " key not found " ) ;
}
}
2006-04-25 13:01:19 +00:00
static int curve_setter ( BPy_Modifier * self , int type , PyObject * value )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
CurveModifierData * md = ( CurveModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
switch ( type ) {
2007-03-08 14:37:34 +00:00
case EXPP_MOD_OBJECT :
return GenericLib_assignData ( value , ( void * * ) & md - > object , ( void * * ) & self - > object , 0 , ID_OB , OB_CURVE ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_VERTGROUP : {
2006-04-23 02:34:50 +00:00
char * name = PyString_AsString ( value ) ;
if ( ! name )
return EXPP_ReturnIntError ( PyExc_TypeError ,
" expected string arg " ) ;
BLI_strncpy ( md - > name , name , sizeof ( md - > name ) ) ;
break ;
}
default :
return EXPP_ReturnIntError ( PyExc_KeyError , " key not found " ) ;
}
return 0 ;
}
2006-04-25 13:01:19 +00:00
static PyObject * build_getter ( BPy_Modifier * self , int type )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
BuildModifierData * md = ( BuildModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
switch ( type ) {
2006-04-25 13:01:19 +00:00
case EXPP_MOD_START :
2006-04-23 02:34:50 +00:00
return PyFloat_FromDouble ( ( float ) md - > start ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_LENGTH :
2006-04-23 02:34:50 +00:00
return PyFloat_FromDouble ( ( float ) md - > length ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_SEED :
2006-04-23 02:34:50 +00:00
return PyInt_FromLong ( ( long ) md - > seed ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_RANDOMIZE :
2006-04-23 02:34:50 +00:00
return PyBool_FromLong ( ( long ) md - > randomize ) ;
default :
return EXPP_ReturnPyObjError ( PyExc_KeyError , " key not found " ) ;
}
}
2006-04-25 13:01:19 +00:00
static int build_setter ( BPy_Modifier * self , int type , PyObject * value )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
BuildModifierData * md = ( BuildModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
switch ( type ) {
2006-04-25 13:01:19 +00:00
case EXPP_MOD_START :
2006-04-23 02:34:50 +00:00
return EXPP_setFloatClamped ( value , & md - > start , 1.0 , MAXFRAMEF ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_LENGTH :
2006-04-23 02:34:50 +00:00
return EXPP_setFloatClamped ( value , & md - > length , 1.0 , MAXFRAMEF ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_SEED :
2006-04-23 02:34:50 +00:00
return EXPP_setIValueClamped ( value , & md - > seed , 1 , MAXFRAME , ' i ' ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_RANDOMIZE :
2006-04-23 02:34:50 +00:00
return EXPP_setBitfield ( value , & md - > randomize , 1 , ' i ' ) ;
default :
return EXPP_ReturnIntError ( PyExc_KeyError , " key not found " ) ;
}
}
2006-04-25 13:01:19 +00:00
static PyObject * mirror_getter ( BPy_Modifier * self , int type )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
MirrorModifierData * md = ( MirrorModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
switch ( type ) {
2006-04-25 13:01:19 +00:00
case EXPP_MOD_LIMIT :
2006-04-23 02:34:50 +00:00
return PyFloat_FromDouble ( ( double ) md - > tolerance ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_FLAG :
2006-04-23 02:34:50 +00:00
return PyBool_FromLong ( ( long ) ( md - > flag & MOD_MIR_CLIPPING ) ) ;
2007-05-22 17:41:32 +00:00
case EXPP_MOD_AXIS_X :
return PyBool_FromLong ( ( long )
( md - > flag & MOD_MIR_AXIS_X ) ) ;
case EXPP_MOD_AXIS_Y :
return PyBool_FromLong ( ( long )
( md - > flag & MOD_MIR_AXIS_Y ) ) ;
case EXPP_MOD_AXIS_Z :
return PyBool_FromLong ( ( long )
( md - > flag & MOD_MIR_AXIS_Z ) ) ;
2006-04-23 02:34:50 +00:00
default :
return EXPP_ReturnPyObjError ( PyExc_KeyError , " key not found " ) ;
}
}
2006-04-25 13:01:19 +00:00
static int mirror_setter ( BPy_Modifier * self , int type , PyObject * value )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
MirrorModifierData * md = ( MirrorModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
switch ( type ) {
2006-04-25 13:01:19 +00:00
case EXPP_MOD_LIMIT :
2006-04-23 02:34:50 +00:00
return EXPP_setFloatClamped ( value , & md - > tolerance , 0.0 , 1.0 ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_FLAG :
2006-04-23 02:34:50 +00:00
return EXPP_setBitfield ( value , & md - > flag , MOD_MIR_CLIPPING , ' i ' ) ;
2007-05-22 17:41:32 +00:00
case EXPP_MOD_AXIS_X :
return EXPP_setBitfield ( value , & md - > flag , MOD_MIR_AXIS_X , ' h ' ) ;
case EXPP_MOD_AXIS_Y :
return EXPP_setBitfield ( value , & md - > flag , MOD_MIR_AXIS_Y , ' h ' ) ;
case EXPP_MOD_AXIS_Z :
return EXPP_setBitfield ( value , & md - > flag , MOD_MIR_AXIS_Z , ' h ' ) ;
2006-04-23 02:34:50 +00:00
default :
return EXPP_ReturnIntError ( PyExc_KeyError , " key not found " ) ;
}
}
2006-04-25 13:01:19 +00:00
static PyObject * decimate_getter ( BPy_Modifier * self , int type )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
DecimateModifierData * md = ( DecimateModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
2006-04-25 13:01:19 +00:00
if ( type = = EXPP_MOD_RATIO )
2006-04-23 02:34:50 +00:00
return PyFloat_FromDouble ( ( double ) md - > percent ) ;
2006-04-25 13:01:19 +00:00
else if ( type = = EXPP_MOD_COUNT )
2006-04-23 02:34:50 +00:00
return PyInt_FromLong ( ( long ) md - > faceCount ) ;
return EXPP_ReturnPyObjError ( PyExc_KeyError , " key not found " ) ;
}
2006-04-25 13:01:19 +00:00
static int decimate_setter ( BPy_Modifier * self , int type , PyObject * value )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
DecimateModifierData * md = ( DecimateModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
2006-04-25 13:01:19 +00:00
if ( type = = EXPP_MOD_RATIO )
2006-04-23 02:34:50 +00:00
return EXPP_setFloatClamped ( value , & md - > percent , 0.0 , 1.0 ) ;
2006-04-25 13:01:19 +00:00
else if ( type = = EXPP_MOD_COUNT )
2006-04-23 02:34:50 +00:00
return EXPP_ReturnIntError ( PyExc_AttributeError ,
" value is read-only " ) ;
return EXPP_ReturnIntError ( PyExc_KeyError , " key not found " ) ;
}
2007-04-29 18:13:55 +00:00
static PyObject * smooth_getter ( BPy_Modifier * self , int type )
{
SmoothModifierData * md = ( SmoothModifierData * ) ( self - > md ) ;
switch ( type ) {
case EXPP_MOD_FACTOR :
return PyFloat_FromDouble ( ( double ) md - > fac ) ;
case EXPP_MOD_REPEAT :
return PyInt_FromLong ( ( long ) md - > repeat ) ;
case EXPP_MOD_VERTGROUP :
return PyString_FromString ( md - > defgrp_name ) ;
case EXPP_MOD_ENABLE_X :
return EXPP_getBitfield ( & md - > flag , MOD_SMOOTH_X , ' h ' ) ;
case EXPP_MOD_ENABLE_Y :
return EXPP_getBitfield ( & md - > flag , MOD_SMOOTH_Y , ' h ' ) ;
case EXPP_MOD_ENABLE_Z :
return EXPP_getBitfield ( & md - > flag , MOD_SMOOTH_Z , ' h ' ) ;
default :
return EXPP_ReturnPyObjError ( PyExc_KeyError , " key not found " ) ;
}
}
static int smooth_setter ( BPy_Modifier * self , int type , PyObject * value )
{
SmoothModifierData * md = ( SmoothModifierData * ) ( self - > md ) ;
switch ( type ) {
case EXPP_MOD_FACTOR :
return EXPP_setFloatClamped ( value , & md - > fac , - 10.0 , 10.0 ) ;
case EXPP_MOD_REPEAT :
return EXPP_setIValueRange ( value , & md - > repeat , 0 , 30 , ' h ' ) ;
case EXPP_MOD_VERTGROUP : {
char * name = PyString_AsString ( value ) ;
if ( ! name ) return EXPP_ReturnIntError ( PyExc_TypeError , " expected string arg " ) ;
BLI_strncpy ( md - > defgrp_name , name , sizeof ( md - > defgrp_name ) ) ;
return 0 ;
}
case EXPP_MOD_ENABLE_X :
return EXPP_setBitfield ( value , & md - > flag , MOD_SMOOTH_X , ' h ' ) ;
case EXPP_MOD_ENABLE_Y :
return EXPP_setBitfield ( value , & md - > flag , MOD_SMOOTH_Y , ' h ' ) ;
case EXPP_MOD_ENABLE_Z :
return EXPP_setBitfield ( value , & md - > flag , MOD_SMOOTH_Z , ' h ' ) ;
default :
return EXPP_ReturnIntError ( PyExc_KeyError , " key not found " ) ;
}
}
static PyObject * cast_getter ( BPy_Modifier * self , int type )
{
CastModifierData * md = ( CastModifierData * ) ( self - > md ) ;
switch ( type ) {
case EXPP_MOD_TYPES :
return PyInt_FromLong ( ( long ) md - > type ) ;
case EXPP_MOD_FACTOR :
return PyFloat_FromDouble ( ( double ) md - > fac ) ;
case EXPP_MOD_RADIUS :
return PyFloat_FromDouble ( ( double ) md - > radius ) ;
case EXPP_MOD_SIZE :
return PyFloat_FromDouble ( ( double ) md - > size ) ;
case EXPP_MOD_OBJECT :
return Object_CreatePyObject ( md - > object ) ;
case EXPP_MOD_VERTGROUP :
return PyString_FromString ( md - > defgrp_name ) ;
case EXPP_MOD_ENABLE_X :
return EXPP_getBitfield ( & md - > flag , MOD_CAST_X , ' h ' ) ;
case EXPP_MOD_ENABLE_Y :
return EXPP_getBitfield ( & md - > flag , MOD_CAST_Y , ' h ' ) ;
case EXPP_MOD_ENABLE_Z :
return EXPP_getBitfield ( & md - > flag , MOD_CAST_Z , ' h ' ) ;
case EXPP_MOD_USE_OB_TRANSFORM :
return EXPP_getBitfield ( & md - > flag , MOD_CAST_USE_OB_TRANSFORM , ' h ' ) ;
case EXPP_MOD_SIZE_FROM_RADIUS :
return EXPP_getBitfield ( & md - > flag , MOD_CAST_SIZE_FROM_RADIUS , ' h ' ) ;
default :
return EXPP_ReturnPyObjError ( PyExc_KeyError , " key not found " ) ;
}
}
static int cast_setter ( BPy_Modifier * self , int type , PyObject * value )
{
CastModifierData * md = ( CastModifierData * ) ( self - > md ) ;
switch ( type ) {
case EXPP_MOD_TYPES :
return EXPP_setIValueRange ( value , & md - > type , 0 , MOD_CAST_TYPE_CUBOID , ' h ' ) ;
case EXPP_MOD_FACTOR :
return EXPP_setFloatClamped ( value , & md - > fac , - 10.0 , 10.0 ) ;
case EXPP_MOD_RADIUS :
return EXPP_setFloatClamped ( value , & md - > radius , 0.0 , 100.0 ) ;
case EXPP_MOD_SIZE :
return EXPP_setFloatClamped ( value , & md - > size , 0.0 , 100.0 ) ;
case EXPP_MOD_OBJECT : {
Object * ob_new = NULL ;
if ( value = = Py_None ) {
md - > object = NULL ;
} else if ( BPy_Object_Check ( value ) ) {
ob_new = ( ( ( BPy_Object * ) value ) - > object ) ;
md - > object = ob_new ;
} else {
return EXPP_ReturnIntError ( PyExc_TypeError ,
" Expected an Object or None value " ) ;
}
return 0 ;
}
case EXPP_MOD_VERTGROUP : {
char * name = PyString_AsString ( value ) ;
if ( ! name ) return EXPP_ReturnIntError ( PyExc_TypeError , " expected string arg " ) ;
BLI_strncpy ( md - > defgrp_name , name , sizeof ( md - > defgrp_name ) ) ;
return 0 ;
}
case EXPP_MOD_ENABLE_X :
return EXPP_setBitfield ( value , & md - > flag , MOD_CAST_X , ' h ' ) ;
case EXPP_MOD_ENABLE_Y :
return EXPP_setBitfield ( value , & md - > flag , MOD_CAST_Y , ' h ' ) ;
case EXPP_MOD_ENABLE_Z :
return EXPP_setBitfield ( value , & md - > flag , MOD_CAST_Z , ' h ' ) ;
case EXPP_MOD_USE_OB_TRANSFORM :
return EXPP_setBitfield ( value , & md - > flag , MOD_CAST_USE_OB_TRANSFORM , ' h ' ) ;
case EXPP_MOD_SIZE_FROM_RADIUS :
return EXPP_setBitfield ( value , & md - > flag , MOD_CAST_SIZE_FROM_RADIUS , ' h ' ) ;
default :
return EXPP_ReturnIntError ( PyExc_KeyError , " key not found " ) ;
}
}
2006-04-25 13:01:19 +00:00
static PyObject * wave_getter ( BPy_Modifier * self , int type )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
WaveModifierData * md = ( WaveModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
switch ( type ) {
2006-04-25 13:01:19 +00:00
case EXPP_MOD_STARTX :
2006-04-23 02:34:50 +00:00
return PyFloat_FromDouble ( ( double ) md - > startx ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_STARTY :
2006-04-23 02:34:50 +00:00
return PyFloat_FromDouble ( ( double ) md - > starty ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_HEIGHT :
2006-04-23 02:34:50 +00:00
return PyFloat_FromDouble ( ( double ) md - > height ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_WIDTH :
2006-04-23 02:34:50 +00:00
return PyFloat_FromDouble ( ( double ) md - > width ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_NARROW :
2006-04-23 02:34:50 +00:00
return PyFloat_FromDouble ( ( double ) md - > narrow ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_SPEED :
2006-04-23 02:34:50 +00:00
return PyFloat_FromDouble ( ( double ) md - > speed ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_DAMP :
2006-04-23 02:34:50 +00:00
return PyFloat_FromDouble ( ( double ) md - > damp ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_LIFETIME :
2006-04-23 02:34:50 +00:00
return PyFloat_FromDouble ( ( double ) md - > lifetime ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_TIMEOFFS :
2006-04-23 02:34:50 +00:00
return PyFloat_FromDouble ( ( double ) md - > timeoffs ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_FLAG :
2006-04-23 02:34:50 +00:00
return PyInt_FromLong ( ( long ) md - > flag ) ;
default :
return EXPP_ReturnPyObjError ( PyExc_KeyError , " key not found " ) ;
}
}
2006-04-25 13:01:19 +00:00
static int wave_setter ( BPy_Modifier * self , int type , PyObject * value )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
WaveModifierData * md = ( WaveModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
switch ( type ) {
2006-04-25 13:01:19 +00:00
case EXPP_MOD_STARTX :
2006-04-23 02:34:50 +00:00
return EXPP_setFloatClamped ( value , & md - > startx , - 100.0 , 100.0 ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_STARTY :
2006-04-23 02:34:50 +00:00
return EXPP_setFloatClamped ( value , & md - > starty , - 100.0 , 100.0 ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_HEIGHT :
2006-04-23 02:34:50 +00:00
return EXPP_setFloatClamped ( value , & md - > height , - 2.0 , 2.0 ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_WIDTH :
2006-04-23 02:34:50 +00:00
return EXPP_setFloatClamped ( value , & md - > width , 0.0 , 5.0 ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_NARROW :
2006-04-23 02:34:50 +00:00
return EXPP_setFloatClamped ( value , & md - > width , 0.0 , 5.0 ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_SPEED :
2006-04-23 02:34:50 +00:00
return EXPP_setFloatClamped ( value , & md - > speed , - 2.0 , 2.0 ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_DAMP :
2007-09-27 23:42:21 +00:00
return EXPP_setFloatClamped ( value , & md - > damp , - MAXFRAMEF , MAXFRAMEF ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_LIFETIME :
2007-09-27 23:42:21 +00:00
return EXPP_setFloatClamped ( value , & md - > lifetime , - MAXFRAMEF , MAXFRAMEF ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_TIMEOFFS :
2007-09-27 23:42:21 +00:00
return EXPP_setFloatClamped ( value , & md - > timeoffs , - MAXFRAMEF , MAXFRAMEF ) ;
2006-04-25 13:01:19 +00:00
case EXPP_MOD_FLAG :
2006-04-23 02:34:50 +00:00
return EXPP_setIValueRange ( value , & md - > flag , 0 ,
2007-04-30 16:49:12 +00:00
MOD_WAVE_X | MOD_WAVE_Y | MOD_WAVE_CYCL , ' h ' ) ;
2006-04-23 02:34:50 +00:00
default :
return EXPP_ReturnIntError ( PyExc_KeyError , " key not found " ) ;
}
}
2006-09-17 02:31:16 +00:00
static PyObject * array_getter ( BPy_Modifier * self , int type )
{
ArrayModifierData * md = ( ArrayModifierData * ) ( self - > md ) ;
if ( type = = EXPP_MOD_OBJECT_OFFSET )
return Object_CreatePyObject ( md - > offset_ob ) ;
else if ( type = = EXPP_MOD_OBJECT_CURVE )
return Object_CreatePyObject ( md - > curve_ob ) ;
else if ( type = = EXPP_MOD_COUNT )
return PyInt_FromLong ( ( long ) md - > count ) ;
else if ( type = = EXPP_MOD_LENGTH )
return PyFloat_FromDouble ( md - > length ) ;
else if ( type = = EXPP_MOD_MERGE_DIST )
return PyFloat_FromDouble ( md - > merge_dist ) ;
else if ( type = = EXPP_MOD_OFFSET_VEC )
return newVectorObject ( md - > offset , 3 , Py_NEW ) ;
else if ( type = = EXPP_MOD_SCALE_VEC )
return newVectorObject ( md - > scale , 3 , Py_NEW ) ;
return EXPP_ReturnPyObjError ( PyExc_KeyError , " key not found " ) ;
}
static int array_setter ( BPy_Modifier * self , int type , PyObject * value )
{
ArrayModifierData * md = ( ArrayModifierData * ) ( self - > md ) ;
switch ( type ) {
2007-03-08 14:37:34 +00:00
case EXPP_MOD_OBJECT_OFFSET :
return GenericLib_assignData ( value , ( void * * ) & md - > offset_ob , ( void * * ) & self - > object , 0 , ID_OB , 0 ) ;
case EXPP_MOD_OBJECT_CURVE :
return GenericLib_assignData ( value , ( void * * ) & md - > curve_ob , 0 , 0 , ID_OB , OB_CURVE ) ;
2006-09-17 02:31:16 +00:00
case EXPP_MOD_COUNT :
return EXPP_setIValueClamped ( value , & md - > count , 1 , 1000 , ' i ' ) ;
case EXPP_MOD_LENGTH :
return EXPP_setFloatClamped ( value , & md - > length , 0.0 , 1000.0 ) ;
case EXPP_MOD_MERGE_DIST :
return EXPP_setFloatClamped ( value , & md - > merge_dist , 0.0 , 1000.0 ) ;
case EXPP_MOD_OFFSET_VEC :
2006-09-20 17:30:47 +00:00
return EXPP_setVec3Clamped ( value , md - > offset , - 10000.0 , 10000.0 ) ;
2006-09-17 02:31:16 +00:00
case EXPP_MOD_SCALE_VEC :
2006-09-20 17:30:47 +00:00
return EXPP_setVec3Clamped ( value , md - > scale , - 10000.0 , 10000.0 ) ;
2006-09-17 02:31:16 +00:00
default :
return EXPP_ReturnIntError ( PyExc_KeyError , " key not found " ) ;
}
}
2006-04-25 13:01:19 +00:00
static PyObject * boolean_getter ( BPy_Modifier * self , int type )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
BooleanModifierData * md = ( BooleanModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
2006-04-25 13:01:19 +00:00
if ( type = = EXPP_MOD_OBJECT )
2006-04-23 02:34:50 +00:00
return Object_CreatePyObject ( md - > object ) ;
2006-04-25 13:01:19 +00:00
else if ( type = = EXPP_MOD_OPERATION )
2006-04-23 02:34:50 +00:00
return PyInt_FromLong ( ( long ) md - > operation ) ;
return EXPP_ReturnPyObjError ( PyExc_KeyError , " key not found " ) ;
}
2006-04-25 13:01:19 +00:00
static int boolean_setter ( BPy_Modifier * self , int type , PyObject * value )
2006-04-23 02:34:50 +00:00
{
2006-04-25 13:01:19 +00:00
BooleanModifierData * md = ( BooleanModifierData * ) ( self - > md ) ;
2006-04-23 02:34:50 +00:00
2007-03-08 14:37:34 +00:00
if ( type = = EXPP_MOD_OBJECT )
return GenericLib_assignData ( value , ( void * * ) & md - > object , ( void * * ) & self - > object , 0 , ID_OB , OB_MESH ) ;
else if ( type = = EXPP_MOD_OPERATION )
2006-04-23 02:34:50 +00:00
return EXPP_setIValueRange ( value , & md - > operation ,
eBooleanModifierOp_Intersect , eBooleanModifierOp_Difference ,
' h ' ) ;
return EXPP_ReturnIntError ( PyExc_KeyError , " key not found " ) ;
}
2007-01-26 15:43:11 +00:00
static PyObject * edgesplit_getter ( BPy_Modifier * self , int type )
{
EdgeSplitModifierData * md = ( EdgeSplitModifierData * ) ( self - > md ) ;
switch ( type ) {
case EXPP_MOD_EDGESPLIT_ANGLE :
return PyFloat_FromDouble ( ( double ) md - > split_angle ) ;
case EXPP_MOD_EDGESPLIT_FROM_ANGLE :
return PyBool_FromLong ( ( long )
( md - > flags & MOD_EDGESPLIT_FROMANGLE ) ) ;
case EXPP_MOD_EDGESPLIT_FROM_SHARP :
return PyBool_FromLong ( ( long )
( md - > flags & MOD_EDGESPLIT_FROMFLAG ) ) ;
default :
return EXPP_ReturnPyObjError ( PyExc_KeyError , " key not found " ) ;
}
}
static int edgesplit_setter ( BPy_Modifier * self , int type , PyObject * value )
{
EdgeSplitModifierData * md = ( EdgeSplitModifierData * ) ( self - > md ) ;
switch ( type ) {
case EXPP_MOD_EDGESPLIT_ANGLE :
return EXPP_setFloatClamped ( value , & md - > split_angle , 0.0 , 180.0 ) ;
case EXPP_MOD_EDGESPLIT_FROM_ANGLE :
return EXPP_setBitfield ( value , & md - > flags ,
MOD_EDGESPLIT_FROMANGLE , ' h ' ) ;
case EXPP_MOD_EDGESPLIT_FROM_SHARP :
return EXPP_setBitfield ( value , & md - > flags ,
MOD_EDGESPLIT_FROMFLAG , ' h ' ) ;
default :
return EXPP_ReturnIntError ( PyExc_KeyError , " key not found " ) ;
}
}
2007-03-04 11:48:37 +00:00
static PyObject * displace_getter ( BPy_Modifier * self , int type )
{
DisplaceModifierData * md = ( DisplaceModifierData * ) ( self - > md ) ;
switch ( type ) {
case EXPP_MOD_TEXTURE :
if ( md - > texture ) Texture_CreatePyObject ( md - > texture ) ;
else Py_RETURN_NONE ;
case EXPP_MOD_STRENGTH :
return PyFloat_FromDouble ( ( double ) md - > strength ) ;
case EXPP_MOD_DIRECTION :
PyInt_FromLong ( md - > direction ) ;
case EXPP_MOD_VERTGROUP :
return PyString_FromString ( md - > defgrp_name ) ;
case EXPP_MOD_MID_LEVEL :
return PyFloat_FromDouble ( ( double ) md - > midlevel ) ;
case EXPP_MOD_MAPPING :
PyInt_FromLong ( md - > texmapping ) ;
case EXPP_MOD_OBJECT :
return Object_CreatePyObject ( md - > map_object ) ;
case EXPP_MOD_UVLAYER :
return PyString_FromString ( md - > uvlayer_name ) ;
default :
return EXPP_ReturnPyObjError ( PyExc_KeyError , " key not found " ) ;
}
}
static int displace_setter ( BPy_Modifier * self , int type , PyObject * value )
{
DisplaceModifierData * md = ( DisplaceModifierData * ) ( self - > md ) ;
switch ( type ) {
case EXPP_MOD_TEXTURE :
2007-03-08 14:37:34 +00:00
return GenericLib_assignData ( value , ( void * * ) & md - > texture , 0 , 1 , ID_TE , 0 ) ;
2007-03-04 11:48:37 +00:00
case EXPP_MOD_STRENGTH :
return EXPP_setFloatClamped ( value , & md - > strength , - 1000.0 , 1000.0 ) ;
case EXPP_MOD_DIRECTION :
return EXPP_setIValueClamped ( value , & md - > direction ,
MOD_DISP_DIR_X , MOD_DISP_DIR_RGB_XYZ , ' i ' ) ;
case EXPP_MOD_VERTGROUP : {
char * name = PyString_AsString ( value ) ;
if ( ! name ) return EXPP_ReturnIntError ( PyExc_TypeError , " expected string arg " ) ;
BLI_strncpy ( md - > defgrp_name , name , sizeof ( md - > defgrp_name ) ) ;
return 0 ;
}
case EXPP_MOD_MID_LEVEL :
return EXPP_setFloatClamped ( value , & md - > midlevel , 0.0 , 1.0 ) ;
case EXPP_MOD_MAPPING :
return EXPP_setIValueClamped ( value , & md - > texmapping ,
MOD_DISP_MAP_LOCAL , MOD_DISP_MAP_UV , ' i ' ) ;
case EXPP_MOD_OBJECT : {
Object * ob_new = NULL ;
if ( value = = Py_None ) {
md - > map_object = NULL ;
} else if ( BPy_Object_Check ( value ) ) {
ob_new = ( ( ( BPy_Object * ) value ) - > object ) ;
md - > map_object = ob_new ;
} else {
return EXPP_ReturnIntError ( PyExc_TypeError ,
" Expected an Object or None value " ) ;
}
return 0 ;
}
case EXPP_MOD_UVLAYER : {
char * name = PyString_AsString ( value ) ;
if ( ! name ) return EXPP_ReturnIntError ( PyExc_TypeError , " expected string arg " ) ;
BLI_strncpy ( md - > uvlayer_name , name , sizeof ( md - > uvlayer_name ) ) ;
return 0 ;
}
default :
return EXPP_ReturnIntError ( PyExc_KeyError , " key not found " ) ;
}
}
2007-01-26 15:43:11 +00:00
2007-03-04 11:48:37 +00:00
/* static PyObject *uvproject_getter( BPy_Modifier * self, int type )
{
DisplaceModifierData * md = ( DisplaceModifierData * ) ( self - > md ) ;
switch ( type ) {
case EXPP_MOD_MID_LEVEL :
return PyFloat_FromDouble ( ( double ) md - > midlevel ) ;
default :
return EXPP_ReturnPyObjError ( PyExc_KeyError , " key not found " ) ;
}
}
static int uvproject_setter ( BPy_Modifier * self , int type , PyObject * value )
{
DisplaceModifierData * md = ( DisplaceModifierData * ) ( self - > md ) ;
switch ( type ) {
case EXPP_MOD_TEXTURE :
return 0 ;
default :
return EXPP_ReturnIntError ( PyExc_KeyError , " key not found " ) ;
}
} */
2007-01-26 15:43:11 +00:00
2006-04-23 17:01:04 +00:00
/*
* get data from a modifier
*/
2006-04-23 02:34:50 +00:00
static PyObject * Modifier_getData ( BPy_Modifier * self , PyObject * key )
{
2006-04-25 13:01:19 +00:00
int setting ;
2006-04-23 02:34:50 +00:00
2007-07-01 05:41:23 +00:00
if ( ! PyInt_Check ( key ) )
2006-04-23 02:34:50 +00:00
return EXPP_ReturnPyObjError ( PyExc_TypeError ,
2006-04-25 13:01:19 +00:00
" expected an int arg as stored in Blender.Modifier.Settings " ) ;
2006-04-23 02:34:50 +00:00
2006-09-24 08:30:38 +00:00
MODIFIER_DEL_CHECK_PY ( self ) ;
2006-04-25 13:01:19 +00:00
setting = PyInt_AsLong ( key ) ;
switch ( setting ) {
2006-04-23 02:34:50 +00:00
case EXPP_MOD_RENDER :
return EXPP_getBitfield ( & self - > md - > mode , eModifierMode_Render , ' h ' ) ;
case EXPP_MOD_REALTIME :
return EXPP_getBitfield ( & self - > md - > mode , eModifierMode_Realtime , ' h ' ) ;
case EXPP_MOD_EDITMODE :
return EXPP_getBitfield ( & self - > md - > mode , eModifierMode_Editmode , ' h ' ) ;
case EXPP_MOD_ONCAGE :
return EXPP_getBitfield ( & self - > md - > mode , eModifierMode_OnCage , ' h ' ) ;
default :
switch ( self - > md - > type ) {
case eModifierType_Subsurf :
2006-04-25 13:01:19 +00:00
return subsurf_getter ( self , setting ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Armature :
2006-04-25 13:01:19 +00:00
return armature_getter ( self , setting ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Lattice :
2006-04-25 13:01:19 +00:00
return lattice_getter ( self , setting ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Curve :
2006-04-25 13:01:19 +00:00
return curve_getter ( self , setting ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Build :
2006-04-25 13:01:19 +00:00
return build_getter ( self , setting ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Mirror :
2006-04-25 13:01:19 +00:00
return mirror_getter ( self , setting ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Decimate :
2006-04-25 13:01:19 +00:00
return decimate_getter ( self , setting ) ;
2007-04-29 18:13:55 +00:00
case eModifierType_Smooth :
return smooth_getter ( self , setting ) ;
case eModifierType_Cast :
return cast_getter ( self , setting ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Wave :
2006-04-25 13:01:19 +00:00
return wave_getter ( self , setting ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Boolean :
2006-04-25 13:01:19 +00:00
return boolean_getter ( self , setting ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Array :
2006-09-17 02:31:16 +00:00
return array_getter ( self , setting ) ;
2007-01-26 15:43:11 +00:00
case eModifierType_EdgeSplit :
return edgesplit_getter ( self , setting ) ;
2007-03-04 11:48:37 +00:00
case eModifierType_Displace :
return displace_getter ( self , setting ) ;
/*case eModifierType_UVProject:
return uvproject_getter ( self , setting ) ; */
2006-09-19 10:52:56 +00:00
case eModifierType_Hook :
case eModifierType_Softbody :
2006-04-23 02:34:50 +00:00
case eModifierType_None :
Py_RETURN_NONE ;
}
}
return EXPP_ReturnPyObjError ( PyExc_KeyError ,
" unknown key or modifier type " ) ;
}
static int Modifier_setData ( BPy_Modifier * self , PyObject * key ,
PyObject * arg )
{
2006-04-25 13:01:19 +00:00
int key_int ;
2006-04-23 02:34:50 +00:00
if ( ! PyNumber_Check ( key ) )
return EXPP_ReturnIntError ( PyExc_TypeError ,
2006-04-25 13:01:19 +00:00
" expected an int arg as stored in Blender.Modifier.Settings " ) ;
2006-09-24 08:30:38 +00:00
MODIFIER_DEL_CHECK_INT ( self ) ;
2006-04-25 13:01:19 +00:00
key_int = PyInt_AsLong ( key ) ;
2006-08-26 03:18:55 +00:00
/* Chach for standard modifier settings */
switch ( key_int ) {
case EXPP_MOD_RENDER :
return EXPP_setBitfield ( arg , & self - > md - > mode ,
eModifierMode_Render , ' h ' ) ;
case EXPP_MOD_REALTIME :
return EXPP_setBitfield ( arg , & self - > md - > mode ,
eModifierMode_Realtime , ' h ' ) ;
case EXPP_MOD_EDITMODE :
return EXPP_setBitfield ( arg , & self - > md - > mode ,
eModifierMode_Editmode , ' h ' ) ;
case EXPP_MOD_ONCAGE :
return EXPP_setBitfield ( arg , & self - > md - > mode ,
eModifierMode_OnCage , ' h ' ) ;
}
2006-04-23 02:34:50 +00:00
switch ( self - > md - > type ) {
case eModifierType_Subsurf :
2006-04-25 13:01:19 +00:00
return subsurf_setter ( self , key_int , arg ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Armature :
2006-04-25 13:01:19 +00:00
return armature_setter ( self , key_int , arg ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Lattice :
2006-04-25 13:01:19 +00:00
return lattice_setter ( self , key_int , arg ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Curve :
2006-04-25 13:01:19 +00:00
return curve_setter ( self , key_int , arg ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Build :
2006-04-25 13:01:19 +00:00
return build_setter ( self , key_int , arg ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Mirror :
2006-04-25 13:01:19 +00:00
return mirror_setter ( self , key_int , arg ) ;
2006-09-17 02:31:16 +00:00
case eModifierType_Array :
return array_setter ( self , key_int , arg ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Decimate :
2006-04-25 13:01:19 +00:00
return decimate_setter ( self , key_int , arg ) ;
2007-04-29 18:13:55 +00:00
case eModifierType_Smooth :
return smooth_setter ( self , key_int , arg ) ;
case eModifierType_Cast :
return cast_setter ( self , key_int , arg ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Wave :
2006-04-25 13:01:19 +00:00
return wave_setter ( self , key_int , arg ) ;
2006-04-23 02:34:50 +00:00
case eModifierType_Boolean :
2006-04-25 13:01:19 +00:00
return boolean_setter ( self , key_int , arg ) ;
2007-01-26 15:43:11 +00:00
case eModifierType_EdgeSplit :
return edgesplit_setter ( self , key_int , arg ) ;
2007-03-04 11:48:37 +00:00
case eModifierType_Displace :
return displace_setter ( self , key_int , arg ) ;
/*case eModifierType_UVProject:
return uvproject_setter ( self , key_int , arg ) ; */
2006-04-23 17:01:04 +00:00
case eModifierType_Hook :
case eModifierType_Softbody :
2006-04-23 02:34:50 +00:00
case eModifierType_None :
return 0 ;
}
return EXPP_ReturnIntError ( PyExc_RuntimeError ,
2006-04-25 13:01:19 +00:00
" unsupported modifier setting " ) ;
2006-04-23 17:01:04 +00:00
}
2006-04-23 02:34:50 +00:00
2007-04-05 16:04:40 +00:00
static PyObject * Modifier_reset ( BPy_Modifier * self )
{
Object * ob = self - > object ;
ModifierData * md = self - > md ;
HookModifierData * hmd = ( HookModifierData * ) md ;
MODIFIER_DEL_CHECK_PY ( self ) ;
if ( md - > type ! = eModifierType_Hook )
return EXPP_ReturnPyObjError ( PyExc_TypeError ,
" can only reset hooks " ) ;
if ( hmd - > object ) {
Mat4Invert ( hmd - > object - > imat , hmd - > object - > obmat ) ;
Mat4MulSerie ( hmd - > parentinv , hmd - > object - > imat , ob - > obmat , NULL , NULL , NULL , NULL , NULL , NULL ) ;
}
Py_RETURN_NONE ;
}
2006-04-23 02:34:50 +00:00
/*****************************************************************************/
/* Function: Modifier_repr */
/* Description: This is a callback function for the BPy_Modifier type. It */
/* builds a meaningful string to represent modifier objects. */
/*****************************************************************************/
static PyObject * Modifier_repr ( BPy_Modifier * self )
{
2006-04-23 08:01:02 +00:00
ModifierTypeInfo * mti ;
if ( self - > md = = NULL )
return PyString_FromString ( " [Modifier - Removed " ) ;
mti = modifierType_getInfo ( self - > md - > type ) ;
return PyString_FromFormat ( " [Modifier \" %s \" , Type \" %s \" ] " , self - > md - > name , mti - > name ) ;
2006-04-23 02:34:50 +00:00
}
/* Three Python Modifier_Type helper functions needed by the Object module: */
/*****************************************************************************/
/* Function: Modifier_CreatePyObject */
/* Description: This function will create a new BPy_Modifier from an */
/* existing Blender modifier structure. */
/*****************************************************************************/
2006-12-28 06:47:56 +00:00
PyObject * Modifier_CreatePyObject ( Object * ob , ModifierData * md )
2006-04-23 02:34:50 +00:00
{
BPy_Modifier * pymod ;
pymod = ( BPy_Modifier * ) PyObject_NEW ( BPy_Modifier , & Modifier_Type ) ;
if ( ! pymod )
return EXPP_ReturnPyObjError ( PyExc_MemoryError ,
" couldn't create BPy_Modifier object " ) ;
pymod - > md = md ;
2006-12-28 06:47:56 +00:00
pymod - > object = ob ;
2006-04-23 02:34:50 +00:00
return ( PyObject * ) pymod ;
}
/*****************************************************************************/
/* Function: Modifier_FromPyObject */
/* Description: This function returns the Blender modifier from the given */
/* PyObject. */
/*****************************************************************************/
ModifierData * Modifier_FromPyObject ( PyObject * pyobj )
{
return ( ( BPy_Modifier * ) pyobj ) - > md ;
}
/*****************************************************************************/
/* Modifier Sequence wrapper */
/*****************************************************************************/
/*
* Initialize the interator
*/
2006-12-28 06:47:56 +00:00
static PyObject * ModSeq_getIter ( BPy_ModSeq * self )
2006-04-23 02:34:50 +00:00
{
2006-09-24 08:30:38 +00:00
if ( ! self - > iter ) {
2006-12-28 06:47:56 +00:00
self - > iter = ( ModifierData * ) self - > object - > modifiers . first ;
2006-09-24 08:30:38 +00:00
return EXPP_incr_ret ( ( PyObject * ) self ) ;
} else {
2006-12-28 06:47:56 +00:00
return ModSeq_CreatePyObject ( self - > object , ( ModifierData * ) self - > object - > modifiers . first ) ;
2006-09-24 08:30:38 +00:00
}
2006-04-23 02:34:50 +00:00
}
/*
* Get the next Modifier
*/
2006-12-28 06:47:56 +00:00
static PyObject * ModSeq_nextIter ( BPy_ModSeq * self )
2006-04-23 02:34:50 +00:00
{
2006-09-24 08:30:38 +00:00
ModifierData * iter = self - > iter ;
if ( iter ) {
self - > iter = iter - > next ;
2006-12-28 06:47:56 +00:00
return Modifier_CreatePyObject ( self - > object , iter ) ;
2006-04-23 02:34:50 +00:00
}
2006-09-24 08:30:38 +00:00
self - > iter = NULL ; /* mark as not iterating */
2006-04-23 02:34:50 +00:00
return EXPP_ReturnPyObjError ( PyExc_StopIteration ,
" iterator at end " ) ;
}
/* return the number of modifiers */
2006-12-28 06:47:56 +00:00
static int ModSeq_length ( BPy_ModSeq * self )
2006-04-23 02:34:50 +00:00
{
2006-12-28 06:47:56 +00:00
return BLI_countlist ( & self - > object - > modifiers ) ;
2006-04-23 02:34:50 +00:00
}
/* return a modifier */
2006-12-28 06:47:56 +00:00
static PyObject * ModSeq_item ( BPy_ModSeq * self , int i )
2006-04-23 02:34:50 +00:00
{
ModifierData * md = NULL ;
/* if index is negative, start counting from the end of the list */
if ( i < 0 )
2006-12-28 06:47:56 +00:00
i + = ModSeq_length ( self ) ;
2006-04-23 02:34:50 +00:00
/* skip through the list until we get the modifier or end of list */
2006-12-28 06:47:56 +00:00
for ( md = self - > object - > modifiers . first ; i & & md ; - - i ) md = md - > next ;
2006-04-23 02:34:50 +00:00
if ( md )
2006-12-28 06:47:56 +00:00
return Modifier_CreatePyObject ( self - > object , md ) ;
2006-04-23 02:34:50 +00:00
else
return EXPP_ReturnPyObjError ( PyExc_IndexError ,
" array index out of range " ) ;
}
/*****************************************************************************/
2006-12-28 06:47:56 +00:00
/* Python BPy_ModSeq sequence table: */
2006-04-23 02:34:50 +00:00
/*****************************************************************************/
2006-12-28 06:47:56 +00:00
static PySequenceMethods ModSeq_as_sequence = {
( inquiry ) ModSeq_length , /* sq_length */
2006-04-23 02:34:50 +00:00
( binaryfunc ) 0 , /* sq_concat */
( intargfunc ) 0 , /* sq_repeat */
2006-12-28 06:47:56 +00:00
( intargfunc ) ModSeq_item , /* sq_item */
2006-04-23 02:34:50 +00:00
( intintargfunc ) 0 , /* sq_slice */
( intobjargproc ) 0 , /* sq_ass_item */
( intintobjargproc ) 0 , /* sq_ass_slice */
( objobjproc ) 0 , /* sq_contains */
( binaryfunc ) 0 , /* sq_inplace_concat */
( intargfunc ) 0 , /* sq_inplace_repeat */
} ;
2006-06-14 04:41:31 +00:00
/*
* helper function to check for a valid modifier argument
*/
2007-06-16 13:17:41 +00:00
static ModifierData * locate_modifier ( BPy_ModSeq * self , BPy_Modifier * value )
2006-06-14 04:41:31 +00:00
{
ModifierData * md ;
/* check that argument is a modifier */
2007-06-16 13:17:41 +00:00
if ( ! BPy_Modifier_Check ( value ) )
2006-06-14 04:41:31 +00:00
return ( ModifierData * ) EXPP_ReturnPyObjError ( PyExc_TypeError ,
" expected an modifier as an argument " ) ;
/* check whether modifier has been removed */
2007-06-16 13:17:41 +00:00
if ( ! value - > md )
2006-06-14 04:41:31 +00:00
return ( ModifierData * ) EXPP_ReturnPyObjError ( PyExc_RuntimeError ,
" This modifier has been removed! " ) ;
/* find the modifier in the object's list */
2006-12-28 06:47:56 +00:00
for ( md = self - > object - > modifiers . first ; md ; md = md - > next )
2007-06-16 13:17:41 +00:00
if ( md = = value - > md )
2006-06-14 04:41:31 +00:00
return md ;
/* return exception if we can't find the modifier */
return ( ModifierData * ) EXPP_ReturnPyObjError ( PyExc_AttributeError ,
" This modifier is not in the object's stack " ) ;
}
2006-04-23 02:34:50 +00:00
/* create a new modifier at the end of the list */
2007-06-16 13:17:41 +00:00
static PyObject * ModSeq_append ( BPy_ModSeq * self , PyObject * value )
2006-04-23 02:34:50 +00:00
{
2007-06-16 13:17:41 +00:00
int type = PyInt_AsLong ( value ) ;
2006-06-14 04:41:31 +00:00
/* type 0 is eModifierType_None, should we be able to add one of these? */
if ( type < = 0 | | type > = NUM_MODIFIER_TYPES )
return EXPP_ReturnPyObjError ( PyExc_ValueError ,
2007-06-16 13:17:41 +00:00
" Not an int or argument out of range, expected an int from Blender.Modifier.Type " ) ;
2006-04-23 02:34:50 +00:00
2006-12-28 06:47:56 +00:00
BLI_addtail ( & self - > object - > modifiers , modifier_new ( type ) ) ;
return Modifier_CreatePyObject ( self - > object , self - > object - > modifiers . last ) ;
2006-04-23 02:34:50 +00:00
}
2006-04-23 17:01:04 +00:00
/* remove an existing modifier */
2007-06-16 13:17:41 +00:00
static PyObject * ModSeq_remove ( BPy_ModSeq * self , BPy_Modifier * value )
2006-04-23 08:01:02 +00:00
{
2007-06-16 13:17:41 +00:00
ModifierData * md = locate_modifier ( self , value ) ;
2006-04-23 17:01:04 +00:00
2006-06-14 04:41:31 +00:00
/* if we can't locate the modifier, return (exception already set) */
if ( ! md )
return ( PyObject * ) NULL ;
2006-04-23 17:01:04 +00:00
2006-06-14 04:41:31 +00:00
/* do the actual removal */
2006-12-28 06:47:56 +00:00
BLI_remlink ( & self - > object - > modifiers , md ) ;
2006-06-14 04:41:31 +00:00
modifier_free ( md ) ;
2006-04-23 17:01:04 +00:00
2006-06-14 04:41:31 +00:00
/* erase the link to the modifier */
2007-06-16 13:17:41 +00:00
value - > md = NULL ;
2006-04-23 17:01:04 +00:00
2006-06-14 04:41:31 +00:00
Py_RETURN_NONE ;
}
2006-04-23 17:01:04 +00:00
2006-06-14 04:41:31 +00:00
/* move the modifier up in the stack */
2007-06-16 13:17:41 +00:00
static PyObject * ModSeq_moveUp ( BPy_ModSeq * self , BPy_Modifier * value )
2006-06-14 04:41:31 +00:00
{
2007-06-16 13:17:41 +00:00
ModifierData * md = locate_modifier ( self , value ) ;
2006-06-14 04:41:31 +00:00
/* if we can't locate the modifier, return (exception already set) */
if ( ! md )
return ( PyObject * ) NULL ;
2006-12-28 06:47:56 +00:00
if ( mod_moveUp ( self - > object , md ) )
2006-04-23 17:01:04 +00:00
return EXPP_ReturnPyObjError ( PyExc_RuntimeError ,
2006-06-14 04:41:31 +00:00
" cannot move above a modifier requiring original data " ) ;
Py_RETURN_NONE ;
}
/* move the modifier down in the stack */
2007-06-16 13:17:41 +00:00
static PyObject * ModSeq_moveDown ( BPy_ModSeq * self , BPy_Modifier * value )
2006-06-14 04:41:31 +00:00
{
2007-06-16 13:17:41 +00:00
ModifierData * md = locate_modifier ( self , value ) ;
2006-06-14 04:41:31 +00:00
/* if we can't locate the modifier, return (exception already set) */
if ( ! md )
return ( PyObject * ) NULL ;
2006-12-28 06:47:56 +00:00
if ( mod_moveDown ( self - > object , md ) )
2006-04-23 17:01:04 +00:00
return EXPP_ReturnPyObjError ( PyExc_RuntimeError ,
2006-06-14 04:41:31 +00:00
" cannot move beyond a non-deforming modifier " ) ;
2006-04-23 17:01:04 +00:00
Py_RETURN_NONE ;
2006-04-23 02:34:50 +00:00
}
2008-03-03 03:21:25 +00:00
/* quick hack for ZanQdo: add new hook modifier for selected verts */
static PyObject * ModSeq_ZanQdoHack ( BPy_ModSeq * self )
{
/* this should add the hook (assumes that modifier stack is on same ob!) */
if ( ( self ) & & ( G . obedit ) & & ( self - > object = = G . obedit ) ) {
add_hook ( 1 ) ;
}
Py_RETURN_NONE ;
}
2006-04-23 02:34:50 +00:00
/*****************************************************************************/
2006-12-28 06:47:56 +00:00
/* Python BPy_ModSeq methods table: */
2006-04-23 02:34:50 +00:00
/*****************************************************************************/
2006-12-28 06:47:56 +00:00
static PyMethodDef BPy_ModSeq_methods [ ] = {
2006-04-23 02:34:50 +00:00
/* name, method, flags, doc */
2007-06-16 13:17:41 +00:00
{ " append " , ( PyCFunction ) ModSeq_append , METH_O ,
2006-04-23 08:01:02 +00:00
" (type) - add a new modifier, where type is the type of modifier " } ,
2007-06-16 13:17:41 +00:00
{ " remove " , ( PyCFunction ) ModSeq_remove , METH_O ,
2006-04-23 08:01:02 +00:00
" (modifier) - remove an existing modifier, where modifier is a modifier from this object. " } ,
2007-06-16 13:17:41 +00:00
{ " moveUp " , ( PyCFunction ) ModSeq_moveUp , METH_O ,
2006-06-14 04:41:31 +00:00
" (modifier) - Move a modifier up in stack " } ,
2007-06-16 13:17:41 +00:00
{ " moveDown " , ( PyCFunction ) ModSeq_moveDown , METH_O ,
2006-06-14 04:41:31 +00:00
" (modifier) - Move a modifier down in stack " } ,
2008-03-03 03:21:25 +00:00
{ " ZanQdoHack " , ( PyCFunction ) ModSeq_ZanQdoHack , METH_NOARGS ,
" while in editmode, adds a hook for the selected verts (adds new modifier, and deselects object) " } ,
2006-04-23 02:34:50 +00:00
{ NULL , NULL , 0 , NULL }
} ;
/*****************************************************************************/
2006-12-28 06:47:56 +00:00
/* Python ModSeq_Type structure definition: */
2006-04-23 02:34:50 +00:00
/*****************************************************************************/
2006-12-28 06:47:56 +00:00
PyTypeObject ModSeq_Type = {
2006-04-23 02:34:50 +00:00
PyObject_HEAD_INIT ( NULL ) /* required py macro */
0 , /* ob_size */
/* For printing, in format "<module>.<name>" */
2006-06-14 04:41:31 +00:00
" Blender.Modifiers " , /* char *tp_name; */
2006-12-28 06:47:56 +00:00
sizeof ( BPy_ModSeq ) , /* int tp_basicsize; */
2006-04-23 02:34:50 +00:00
0 , /* tp_itemsize; For allocation */
/* Methods to implement standard operations */
2007-03-15 01:47:53 +00:00
NULL , /* destructor tp_dealloc; */
2006-04-23 02:34:50 +00:00
NULL , /* printfunc tp_print; */
NULL , /* getattrfunc tp_getattr; */
NULL , /* setattrfunc tp_setattr; */
NULL , /* cmpfunc tp_compare; */
( reprfunc ) NULL , /* reprfunc tp_repr; */
/* Method suites for standard classes */
NULL , /* PyNumberMethods *tp_as_number; */
2006-12-28 06:47:56 +00:00
& ModSeq_as_sequence , /* PySequenceMethods *tp_as_sequence; */
2006-04-23 02:34:50 +00:00
NULL , /* PyMappingMethods *tp_as_mapping; */
/* More standard operations (here for binary compatibility) */
NULL , /* hashfunc tp_hash; */
NULL , /* ternaryfunc tp_call; */
NULL , /* reprfunc tp_str; */
NULL , /* getattrofunc tp_getattro; */
NULL , /* setattrofunc tp_setattro; */
/* Functions to access object as input/output buffer */
NULL , /* PyBufferProcs *tp_as_buffer; */
/*** Flags to define presence of optional/expanded features ***/
Py_TPFLAGS_DEFAULT , /* long tp_flags; */
NULL , /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
/* call function for all accessible objects */
NULL , /* traverseproc tp_traverse; */
/* delete references to contained objects */
NULL , /* inquiry tp_clear; */
/*** Assigned meaning in release 2.1 ***/
/*** rich comparisons ***/
NULL , /* richcmpfunc tp_richcompare; */
/*** weak reference enabler ***/
0 , /* long tp_weaklistoffset; */
/*** Added in release 2.2 ***/
/* Iterators */
2006-12-28 06:47:56 +00:00
( getiterfunc ) ModSeq_getIter , /* getiterfunc tp_iter; */
( iternextfunc ) ModSeq_nextIter , /* iternextfunc tp_iternext; */
2006-04-23 02:34:50 +00:00
/*** Attribute descriptor and subclassing stuff ***/
2006-12-28 06:47:56 +00:00
BPy_ModSeq_methods , /* struct PyMethodDef *tp_methods; */
2006-04-23 02:34:50 +00:00
NULL , /* struct PyMemberDef *tp_members; */
2006-04-23 17:01:04 +00:00
NULL , /* struct PyGetSetDef *tp_getset; */
2006-04-23 02:34:50 +00:00
NULL , /* struct _typeobject *tp_base; */
NULL , /* PyObject *tp_dict; */
NULL , /* descrgetfunc tp_descr_get; */
NULL , /* descrsetfunc tp_descr_set; */
0 , /* long tp_dictoffset; */
NULL , /* initproc tp_init; */
NULL , /* allocfunc tp_alloc; */
NULL , /* newfunc tp_new; */
/* Low-level free-memory routine */
NULL , /* freefunc tp_free; */
/* For PyObject_IS_GC */
NULL , /* inquiry tp_is_gc; */
NULL , /* PyObject *tp_bases; */
/* method resolution order */
NULL , /* PyObject *tp_mro; */
NULL , /* PyObject *tp_cache; */
NULL , /* PyObject *tp_subclasses; */
NULL , /* PyObject *tp_weaklist; */
NULL
} ;
/*****************************************************************************/
2006-12-28 06:47:56 +00:00
/* Function: ModSeq_CreatePyObject */
/* Description: This function will create a new BPy_ModSeq from an */
2006-06-14 04:41:31 +00:00
/* existing ListBase structure. */
2006-04-23 02:34:50 +00:00
/*****************************************************************************/
2006-12-28 06:47:56 +00:00
PyObject * ModSeq_CreatePyObject ( Object * ob , ModifierData * iter )
2006-04-23 02:34:50 +00:00
{
2006-12-28 06:47:56 +00:00
BPy_ModSeq * pymod ;
pymod = ( BPy_ModSeq * ) PyObject_NEW ( BPy_ModSeq , & ModSeq_Type ) ;
2006-04-23 02:34:50 +00:00
if ( ! pymod )
return EXPP_ReturnPyObjError ( PyExc_MemoryError ,
2006-12-28 06:47:56 +00:00
" couldn't create BPy_ModSeq object " ) ;
pymod - > object = ob ;
2006-09-24 08:30:38 +00:00
pymod - > iter = iter ;
2006-04-23 02:34:50 +00:00
return ( PyObject * ) pymod ;
}
2006-04-23 17:01:04 +00:00
2006-04-25 13:01:19 +00:00
static PyObject * M_Modifier_TypeDict ( void )
2006-04-23 17:01:04 +00:00
{
PyObject * S = PyConstant_New ( ) ;
if ( S ) {
BPy_constant * d = ( BPy_constant * ) S ;
PyConstant_Insert ( d , " SUBSURF " ,
PyInt_FromLong ( eModifierType_Subsurf ) ) ;
PyConstant_Insert ( d , " ARMATURE " ,
PyInt_FromLong ( eModifierType_Armature ) ) ;
PyConstant_Insert ( d , " LATTICE " ,
PyInt_FromLong ( eModifierType_Lattice ) ) ;
PyConstant_Insert ( d , " CURVE " ,
PyInt_FromLong ( eModifierType_Curve ) ) ;
PyConstant_Insert ( d , " BUILD " ,
PyInt_FromLong ( eModifierType_Build ) ) ;
PyConstant_Insert ( d , " MIRROR " ,
PyInt_FromLong ( eModifierType_Mirror ) ) ;
PyConstant_Insert ( d , " DECIMATE " ,
PyInt_FromLong ( eModifierType_Decimate ) ) ;
PyConstant_Insert ( d , " WAVE " ,
PyInt_FromLong ( eModifierType_Wave ) ) ;
PyConstant_Insert ( d , " BOOLEAN " ,
PyInt_FromLong ( eModifierType_Boolean ) ) ;
2006-09-17 02:31:16 +00:00
PyConstant_Insert ( d , " ARRAY " ,
PyInt_FromLong ( eModifierType_Array ) ) ;
2007-01-26 15:43:11 +00:00
PyConstant_Insert ( d , " EDGESPLIT " ,
PyInt_FromLong ( eModifierType_EdgeSplit ) ) ;
2007-04-29 18:13:55 +00:00
PyConstant_Insert ( d , " SMOOTH " ,
PyInt_FromLong ( eModifierType_Smooth ) ) ;
PyConstant_Insert ( d , " CAST " ,
PyInt_FromLong ( eModifierType_Cast ) ) ;
2007-12-11 01:58:22 +00:00
PyConstant_Insert ( d , " DISPLACE " ,
PyInt_FromLong ( eModifierType_Displace ) ) ;
2006-04-23 17:01:04 +00:00
}
return S ;
}
2007-01-26 15:43:11 +00:00
2006-04-25 13:01:19 +00:00
static PyObject * M_Modifier_SettingsDict ( void )
{
PyObject * S = PyConstant_New ( ) ;
if ( S ) {
BPy_constant * d = ( BPy_constant * ) S ;
/*
# The lines below are a python script that uses the enum variables to create
# the lines below
# START PYSCRIPT
st = ' ' '
EXPP_MOD_RENDER = 0 ,
EXPP_MOD_REALTIME ,
EXPP_MOD_EDITMODE ,
2006-09-17 02:31:16 +00:00
etc . . copy from above
2006-04-25 13:01:19 +00:00
' ' '
base = ' ' '
PyConstant_Insert ( d , " %s " ,
PyInt_FromLong ( EXPP_MOD_ % s ) ) ;
' ' '
for var in st . replace ( ' , ' , ' ' ) . split ( ' \n ' ) :
var = var . split ( )
if not var : continue
var = var [ 0 ]
if ( not var ) or var . startswith ( ' / ' ) : continue
2006-09-17 02:31:16 +00:00
var = ' _ ' . join ( var . split ( ' _ ' ) [ 2 : ] )
2006-04-25 13:01:19 +00:00
print base % ( var , var ) ,
# END PYSCRIPT
*/
/*Auto generated from the above script*/
PyConstant_Insert ( d , " RENDER " ,
PyInt_FromLong ( EXPP_MOD_RENDER ) ) ;
PyConstant_Insert ( d , " REALTIME " ,
PyInt_FromLong ( EXPP_MOD_REALTIME ) ) ;
PyConstant_Insert ( d , " EDITMODE " ,
PyInt_FromLong ( EXPP_MOD_EDITMODE ) ) ;
PyConstant_Insert ( d , " ONCAGE " ,
PyInt_FromLong ( EXPP_MOD_ONCAGE ) ) ;
PyConstant_Insert ( d , " OBJECT " ,
PyInt_FromLong ( EXPP_MOD_OBJECT ) ) ;
PyConstant_Insert ( d , " VERTGROUP " ,
PyInt_FromLong ( EXPP_MOD_VERTGROUP ) ) ;
PyConstant_Insert ( d , " LIMIT " ,
PyInt_FromLong ( EXPP_MOD_LIMIT ) ) ;
PyConstant_Insert ( d , " FLAG " ,
PyInt_FromLong ( EXPP_MOD_FLAG ) ) ;
PyConstant_Insert ( d , " COUNT " ,
PyInt_FromLong ( EXPP_MOD_COUNT ) ) ;
2006-09-17 02:31:16 +00:00
PyConstant_Insert ( d , " LENGTH " ,
PyInt_FromLong ( EXPP_MOD_LENGTH ) ) ;
2007-04-29 18:13:55 +00:00
PyConstant_Insert ( d , " FACTOR " ,
PyInt_FromLong ( EXPP_MOD_FACTOR ) ) ;
PyConstant_Insert ( d , " ENABLE_X " ,
PyInt_FromLong ( EXPP_MOD_ENABLE_X ) ) ;
PyConstant_Insert ( d , " ENABLE_Y " ,
PyInt_FromLong ( EXPP_MOD_ENABLE_Y ) ) ;
PyConstant_Insert ( d , " ENABLE_Z " ,
PyInt_FromLong ( EXPP_MOD_ENABLE_Z ) ) ;
2006-04-25 13:01:19 +00:00
PyConstant_Insert ( d , " TYPES " ,
PyInt_FromLong ( EXPP_MOD_TYPES ) ) ;
PyConstant_Insert ( d , " LEVELS " ,
PyInt_FromLong ( EXPP_MOD_LEVELS ) ) ;
PyConstant_Insert ( d , " RENDLEVELS " ,
PyInt_FromLong ( EXPP_MOD_RENDLEVELS ) ) ;
PyConstant_Insert ( d , " OPTIMAL " ,
PyInt_FromLong ( EXPP_MOD_OPTIMAL ) ) ;
PyConstant_Insert ( d , " UV " ,
PyInt_FromLong ( EXPP_MOD_UV ) ) ;
PyConstant_Insert ( d , " ENVELOPES " ,
PyInt_FromLong ( EXPP_MOD_ENVELOPES ) ) ;
2006-09-17 02:31:16 +00:00
PyConstant_Insert ( d , " OBJECT_OFFSET " ,
PyInt_FromLong ( EXPP_MOD_OBJECT_OFFSET ) ) ;
PyConstant_Insert ( d , " OBJECT_CURVE " ,
PyInt_FromLong ( EXPP_MOD_OBJECT_CURVE ) ) ;
PyConstant_Insert ( d , " OFFSET_VEC " ,
PyInt_FromLong ( EXPP_MOD_OFFSET_VEC ) ) ;
PyConstant_Insert ( d , " SCALE_VEC " ,
PyInt_FromLong ( EXPP_MOD_SCALE_VEC ) ) ;
PyConstant_Insert ( d , " MERGE_DIST " ,
PyInt_FromLong ( EXPP_MOD_MERGE_DIST ) ) ;
2006-04-25 13:01:19 +00:00
PyConstant_Insert ( d , " START " ,
PyInt_FromLong ( EXPP_MOD_START ) ) ;
PyConstant_Insert ( d , " SEED " ,
PyInt_FromLong ( EXPP_MOD_SEED ) ) ;
PyConstant_Insert ( d , " RANDOMIZE " ,
PyInt_FromLong ( EXPP_MOD_RANDOMIZE ) ) ;
2007-05-22 17:41:32 +00:00
PyConstant_Insert ( d , " AXIS_X " ,
PyInt_FromLong ( EXPP_MOD_AXIS_X ) ) ;
PyConstant_Insert ( d , " AXIS_Y " ,
PyInt_FromLong ( EXPP_MOD_AXIS_Y ) ) ;
PyConstant_Insert ( d , " AXIS_Z " ,
PyInt_FromLong ( EXPP_MOD_AXIS_Z ) ) ;
2006-04-25 13:01:19 +00:00
PyConstant_Insert ( d , " RATIO " ,
PyInt_FromLong ( EXPP_MOD_RATIO ) ) ;
PyConstant_Insert ( d , " STARTX " ,
PyInt_FromLong ( EXPP_MOD_STARTX ) ) ;
PyConstant_Insert ( d , " STARTY " ,
PyInt_FromLong ( EXPP_MOD_STARTY ) ) ;
PyConstant_Insert ( d , " HEIGHT " ,
PyInt_FromLong ( EXPP_MOD_HEIGHT ) ) ;
PyConstant_Insert ( d , " WIDTH " ,
PyInt_FromLong ( EXPP_MOD_WIDTH ) ) ;
PyConstant_Insert ( d , " NARROW " ,
PyInt_FromLong ( EXPP_MOD_NARROW ) ) ;
PyConstant_Insert ( d , " SPEED " ,
PyInt_FromLong ( EXPP_MOD_SPEED ) ) ;
PyConstant_Insert ( d , " DAMP " ,
PyInt_FromLong ( EXPP_MOD_DAMP ) ) ;
PyConstant_Insert ( d , " LIFETIME " ,
PyInt_FromLong ( EXPP_MOD_LIFETIME ) ) ;
PyConstant_Insert ( d , " TIMEOFFS " ,
PyInt_FromLong ( EXPP_MOD_TIMEOFFS ) ) ;
PyConstant_Insert ( d , " OPERATION " ,
PyInt_FromLong ( EXPP_MOD_OPERATION ) ) ;
2007-01-26 15:43:11 +00:00
PyConstant_Insert ( d , " EDGESPLIT_ANGLE " ,
PyInt_FromLong ( EXPP_MOD_EDGESPLIT_ANGLE ) ) ;
PyConstant_Insert ( d , " EDGESPLIT_FROM_ANGLE " ,
PyInt_FromLong ( EXPP_MOD_EDGESPLIT_FROM_ANGLE ) ) ;
PyConstant_Insert ( d , " EDGESPLIT_FROM_SHARP " ,
PyInt_FromLong ( EXPP_MOD_EDGESPLIT_FROM_SHARP ) ) ;
2007-03-04 11:48:37 +00:00
PyConstant_Insert ( d , " UVLAYER " ,
PyInt_FromLong ( EXPP_MOD_UVLAYER ) ) ;
PyConstant_Insert ( d , " MID_LEVEL " ,
PyInt_FromLong ( EXPP_MOD_MID_LEVEL ) ) ;
PyConstant_Insert ( d , " STRENGTH " ,
PyInt_FromLong ( EXPP_MOD_STRENGTH ) ) ;
2007-04-29 18:13:55 +00:00
PyConstant_Insert ( d , " TEXTURE " ,
PyInt_FromLong ( EXPP_MOD_TEXTURE ) ) ;
PyConstant_Insert ( d , " MAPPING " ,
PyInt_FromLong ( EXPP_MOD_MAPPING ) ) ;
PyConstant_Insert ( d , " DIRECTION " ,
PyInt_FromLong ( EXPP_MOD_DIRECTION ) ) ;
PyConstant_Insert ( d , " REPEAT " ,
PyInt_FromLong ( EXPP_MOD_REPEAT ) ) ;
PyConstant_Insert ( d , " RADIUS " ,
PyInt_FromLong ( EXPP_MOD_RADIUS ) ) ;
PyConstant_Insert ( d , " SIZE " ,
PyInt_FromLong ( EXPP_MOD_SIZE ) ) ;
PyConstant_Insert ( d , " USE_OB_TRANSFORM " ,
PyInt_FromLong ( EXPP_MOD_USE_OB_TRANSFORM ) ) ;
PyConstant_Insert ( d , " SIZE_FROM_RADIUS " ,
PyInt_FromLong ( EXPP_MOD_SIZE_FROM_RADIUS ) ) ;
2006-04-25 13:01:19 +00:00
/*End Auto generated code*/
}
return S ;
}
2006-04-23 17:01:04 +00:00
/*****************************************************************************/
/* Function: Modifier_Init */
/*****************************************************************************/
PyObject * Modifier_Init ( void )
{
PyObject * submodule ;
2006-04-25 13:01:19 +00:00
PyObject * TypeDict = M_Modifier_TypeDict ( ) ;
PyObject * SettingsDict = M_Modifier_SettingsDict ( ) ;
2006-04-23 17:01:04 +00:00
2006-12-28 06:47:56 +00:00
if ( PyType_Ready ( & ModSeq_Type ) < 0 | |
2006-06-14 04:41:31 +00:00
PyType_Ready ( & Modifier_Type ) < 0 )
2006-04-23 17:01:04 +00:00
return NULL ;
2006-06-14 04:41:31 +00:00
submodule = Py_InitModule3 ( " Blender.Modifier " , NULL ,
" Modifer module for accessing and creating object modifier data " ) ;
2006-04-23 17:01:04 +00:00
2007-01-26 15:43:11 +00:00
if ( TypeDict ) {
PyModule_AddObject ( submodule , " Type " , TypeDict ) ; /* deprecated */
2007-02-05 05:09:15 +00:00
/* since PyModule_AddObject() steals a reference, we need to
incref TypeDict to use it again */
Py_INCREF ( TypeDict ) ;
2007-01-26 15:43:11 +00:00
PyModule_AddObject ( submodule , " Types " , TypeDict ) ;
}
2006-04-25 13:01:19 +00:00
if ( SettingsDict )
PyModule_AddObject ( submodule , " Settings " , SettingsDict ) ;
2006-04-23 17:01:04 +00:00
return submodule ;
}