Index: source/blender/makesdna/DNA_userdef_types.h =================================================================== --- source/blender/makesdna/DNA_userdef_types.h (revisión: 20952) +++ source/blender/makesdna/DNA_userdef_types.h (copia de trabajo) @@ -313,6 +313,7 @@ #define USER_DUP_TEX (1 << 8) #define USER_DUP_ARM (1 << 9) #define USER_DUP_ACT (1 << 10) +#define USER_DUP_PSYS (1 << 11) /* gameflags */ #define USER_DEPRECATED_FLAG 1 Index: source/blender/python/api2_2x/doc/Lamp.py =================================================================== --- source/blender/python/api2_2x/doc/Lamp.py (revisión: 20952) +++ source/blender/python/api2_2x/doc/Lamp.py (copia de trabajo) @@ -46,6 +46,11 @@ - 'NoDiffuse' - 'NoSpecular' - 'RayShadow' +@type BufferTypes: read-only dictionary +@var BufferTypes: The lamp shadowbuffer types. + - 'Regular' + - 'Irregular' + - 'Halfway' Example:: from Blender import Lamp, Object @@ -101,6 +106,8 @@ @ivar bufferSize: Lamp shadow buffer size. Value is clamped to the range [512,5120]. @type bufferSize: int + @ivar bufferType: Lamp shadowbuffer type. See L{BufferTypes} for values. + @type bufferType: int @ivar clipEnd: Lamp shadow map clip end. Value is clamped to the range [1.0,5000.0]. @type clipEnd: float Index: source/blender/python/api2_2x/doc/Material.py =================================================================== --- source/blender/python/api2_2x/doc/Material.py (revisión: 20952) +++ source/blender/python/api2_2x/doc/Material.py (copia de trabajo) @@ -408,6 +408,24 @@ @type textures: a tuple of Blender MTex objects. @ivar textures: the Material's Texture list. Empty texture channels contains None. + @ivar strandTanShad: Uses direction of strands as normal for tangent-shading + @type strandTanShad: int + @ivar strandSurfDiff: Make diffuse shading more similar to shading the surface + @type strandSurfDiff: int + @ivar strandDist: Distance in Blender units over which to blend in the surface normal + @type strandDist: float + @ivar strandBlendUnit: Use actual Blender units for widths instead of pixels + @type strandBlendUnit: int + @ivar strandStart: Start size of strands + @type strandStart: float + @ivar strandEnd: End size of strands + @type strandEnd: float + @ivar strandMin: Minimum size of strands in pixels + @type strandMin: float + @ivar strandShape: Shape of strands, positive value makes it rounder, negative makes it spiky + @type strandShape: float + @ivar strandFade: Transparency along the width of the strand + @type strandFade: float @ivar enableSSS: If True, subsurface scattering will be rendered on this material. @type enableSSS: bool @ivar sssScale: If True, subsurface scattering will be rendered on this material. Index: source/blender/python/api2_2x/doc/Object.py =================================================================== --- source/blender/python/api2_2x/doc/Object.py (revisión: 20952) +++ source/blender/python/api2_2x/doc/Object.py (copia de trabajo) @@ -205,7 +205,7 @@ """ -def Duplicate (mesh=0, surface=0, curve=0, text=0, metaball=0, armature=0, lamp=0, material=0, texture=0, ipo=0): +def Duplicate (mesh=0, surface=0, curve=0, text=0, metaball=0, armature=0, lamp=0, material=0, texture=0, ipo=0, psys=0): """ Duplicate selected objects on visible layers from Blenders current scene, de-selecting the currently visible, selected objects and making a copy where all new objects are selected. @@ -234,6 +234,8 @@ @param texture: When non-zero, texture data used by the object's materials will be duplicated with the objects. @type ipo: bool @param ipo: When non-zero, Ipo data linked to the object will be duplicated with the objects. + @type psys: bool + @param psys: When non-zero, particle systems used by the object or its object data will be duplicated with the objects. I{B{Example:}} @@ -663,6 +665,7 @@ particle system with that name exists, it is linked to the object. @type name: string @param name: The name of the requested Particle system (optional). + @return: The particle system linked. """ def addVertexGroupsFromArmature(object): Index: source/blender/python/api2_2x/doc/Particle.py =================================================================== --- source/blender/python/api2_2x/doc/Particle.py (revisión: 20952) +++ source/blender/python/api2_2x/doc/Particle.py (copia de trabajo) @@ -69,6 +69,20 @@ - NONE: No particle angular velocity - SPIN: Spin particle angular velocity - RANDOM: Random particle angular velocity +@type VERTEXGROUPS: readonly dictionary +@var VERTEXGROUPS: Constant dict used for with L{Particle.VERTEXGROUP} + - DENSITY: VertexGroup affect to particles density + - VELOCITY: VertexGroup affect to particles velocity + - LENGHT: VertexGroup affect to particles lenght + - CLUMP: VertexGroup affect to particles clump + - KINK: VertexGroup affect to particles kink + - ROUGH1: VertexGroup affect to particles rough1 + - ROUGH2: VertexGroup affect to particles rough2 + - ROUGHE: VertexGroup affect to particles roughE + - SIZE: VertexGroup affect to particles size + - TANVEL: VertexGroup affect to particles tangent velocity + - TANROT: VertexGroup affect to particles tangent rotation + - EFFECTOR: VertexGroup affect to particles effector @type CHILDTYPE: readonly dictionary @var CHILDTYPE: Constant dict used for with L{Particle.CHILDTYPE} - NONE: set no children @@ -171,6 +185,10 @@ @type renderDied: int @ivar renderMaterial: Specify material used for the particles. @type renderMaterial: int + @ivar strandRender: Use the strand primitive to render. + @type strandRender: int + @ivar strandRenderAngle: How many degrees path has to curve to make another render segment. + @type strandRenderAngle: int @ivar displayPercentage: Particle display percentage. @type displayPercentage: int @ivar hairDisplayStep: How many steps paths are drawn with (power of 2) in visu mode. @@ -179,7 +197,7 @@ @type hairRenderStep: int @ivar duplicateObject: Get the duplicate object. @type duplicateObject: Blender Object - @ivar drawAs: Get draw type Particle.DRAWAS([ 'NONE' | 'OBJECT' | 'POINT' | ... ]). + @ivar drawAs: Draw type Particle.DRAWAS([ 'NONE' | 'OBJECT' | 'POINT' | ... ]). @type drawAs: int @ivar physics: Select particle physics type Particle.PHYSICS([ 'BOIDS' | 'KEYED' | 'NEWTONIAN' | 'NONE' ]) @type physics: int @@ -276,6 +294,18 @@ @ivar childBranch: Threshold of branching @type childBranch: float """ + def getName(): + """ + Get the name of this Particle System object. + @rtype: string + """ + + def setName(name): + """ + Set the name of this Particle System object. + @type name: string + @param name: The new name. + """ def freeEdit(): """ Index: source/blender/python/api2_2x/doc/Texture.py =================================================================== --- source/blender/python/api2_2x/doc/Texture.py (revisión: 20952) +++ source/blender/python/api2_2x/doc/Texture.py (copia de trabajo) @@ -393,6 +393,8 @@ each color a list of 5 floats [0 - 1], [r,g,b,a,pos]. The colorband can have between 1 and 31 colors. @type colorband: list + @ivar useColorband: Use colorband for this texture. + @type colorband: int @ivar autoRefresh: Refresh image on frame changes enabled. @type autoRefresh: boolean """ Index: source/blender/python/api2_2x/Lamp.c =================================================================== --- source/blender/python/api2_2x/Lamp.c (revisión: 20952) +++ source/blender/python/api2_2x/Lamp.c (copia de trabajo) @@ -125,6 +125,8 @@ #define EXPP_LAMP_COL_MAX 1.0 #define EXPP_LAMP_FALLOFF_MIN LA_FALLOFF_CONSTANT #define EXPP_LAMP_FALLOFF_MAX LA_FALLOFF_SLIDERS +#define EXPP_LAMP_BUFFERTYPE_MIN LA_SHADBUF_REGULAR +#define EXPP_LAMP_BUFFERTYPE_MAX LA_SHADBUF_HALFWAY /* Raytracing settings */ #define EXPP_LAMP_RAYSAMPLES_MIN 1 @@ -268,6 +270,8 @@ static int Lamp_setComponent( BPy_Lamp * self, PyObject * value, void * closure ); static PyObject *Lamp_getFalloffType( BPy_Lamp * self ); static int Lamp_setFalloffType( BPy_Lamp * self, PyObject * value ); +static PyObject *Lamp_getBufferType( BPy_Lamp * self ); +static int Lamp_setBufferType( BPy_Lamp * self, PyObject * value ); /*****************************************************************************/ /* Python BPy_Lamp methods table: */ @@ -489,6 +493,10 @@ (getter)Lamp_getFalloffType, (setter)Lamp_setFalloffType, "Lamp falloff type", NULL}, + {"bufferType", + (getter)Lamp_getBufferType, (setter)Lamp_setBufferType, + "Lamp buffer type", + NULL}, {"R", (getter)Lamp_getComponent, (setter)Lamp_setComponent, "Lamp color red component", @@ -828,13 +836,31 @@ return Falloffs; } +static PyObject *Lamp_BufferTypesDict( void ) +{ /* create the Blender.Lamp.BufferTypes constant dict */ + PyObject *Types = PyConstant_New( ); + + if( Types ) { + BPy_constant *c = ( BPy_constant * ) Types; + + PyConstant_Insert( c, "REGULAR", + PyInt_FromLong( LA_SHADBUF_REGULAR ) ); + PyConstant_Insert( c, "IRREGULAR", + PyInt_FromLong( LA_SHADBUF_IRREGULAR ) ); + PyConstant_Insert( c, "HALFWAY", + PyInt_FromLong( LA_SHADBUF_HALFWAY ) ); + } + + return Types; +} + /*****************************************************************************/ /* Function: Lamp_Init */ /*****************************************************************************/ /* Needed by the Blender module, to register the Blender.Lamp submodule */ PyObject *Lamp_Init( void ) { - PyObject *submodule, *Types, *Modes, *Falloffs; + PyObject *submodule, *Types, *Modes, *Falloffs, *BufferTypes; if( PyType_Ready( &Lamp_Type ) < 0) return NULL; @@ -842,6 +868,7 @@ Types = Lamp_TypesDict( ); Modes = Lamp_ModesDict( ); Falloffs = Lamp_FalloffsDict( ); + BufferTypes = Lamp_BufferTypesDict( ); submodule = Py_InitModule3( "Blender.Lamp", M_Lamp_methods, M_Lamp_doc ); @@ -852,6 +879,8 @@ PyModule_AddObject( submodule, "Modes", Modes ); if( Falloffs ) PyModule_AddObject( submodule, "Falloffs", Falloffs ); + if( BufferTypes ) + PyModule_AddObject( submodule, "BufferTypes", BufferTypes ); PyModule_AddIntConstant( submodule, "RGB", IPOKEY_RGB ); PyModule_AddIntConstant( submodule, "ENERGY", IPOKEY_ENERGY ); @@ -1029,6 +1058,11 @@ return PyInt_FromLong( (int)self->lamp->falloff_type ); } +static PyObject *Lamp_getBufferType( BPy_Lamp * self ) +{ + return PyInt_FromLong( (int)self->lamp->buftype ); +} + static int Lamp_setType( BPy_Lamp * self, PyObject * value ) { return EXPP_setIValueRange ( value, &self->lamp->type, @@ -1217,6 +1251,11 @@ EXPP_LAMP_FALLOFF_MIN, EXPP_LAMP_FALLOFF_MAX, 'h' ); } +static int Lamp_setBufferType( BPy_Lamp * self, PyObject * value ) +{ + return EXPP_setIValueRange ( value, &self->lamp->buftype, + EXPP_LAMP_BUFFERTYPE_MIN, EXPP_LAMP_BUFFERTYPE_MAX, 'h' ); +} static PyObject *Lamp_getComponent( BPy_Lamp * self, void * closure ) { Index: source/blender/python/api2_2x/Material.c =================================================================== --- source/blender/python/api2_2x/Material.c (revisión: 20952) +++ source/blender/python/api2_2x/Material.c (copia de trabajo) @@ -747,6 +747,26 @@ static int Material_setColorbandDiffuseInput ( BPy_Material * self, PyObject * value); static int Material_setColorbandSpecularInput ( BPy_Material * self, PyObject * value); +static PyObject *Material_getStrandTangentShad( BPy_Material * self ); +static int Material_setStrandTangentShad( BPy_Material * self, PyObject * value); +static PyObject *Material_getStrandSurfDiff( BPy_Material * self ); +static int Material_setStrandSurfDiff( BPy_Material * self, PyObject * value); +static PyObject *Material_getStrandDist( BPy_Material * self ); +static int Material_setStrandDist( BPy_Material * self, PyObject * value); +static PyObject *Material_getStrandBlendUnit( BPy_Material * self ); +static int Material_setStrandBlendUnit( BPy_Material * self, PyObject * value); +static PyObject *Material_getStrandStart( BPy_Material * self ); +static int Material_setStrandStart( BPy_Material * self, PyObject * value); +static PyObject *Material_getStrandEnd( BPy_Material * self ); +static int Material_setStrandEnd( BPy_Material * self, PyObject * value); +static PyObject *Material_getStrandMin( BPy_Material * self ); +static int Material_setStrandMin( BPy_Material * self, PyObject * value); +static PyObject *Material_getStrandShape( BPy_Material * self ); +static int Material_setStrandShape( BPy_Material * self, PyObject * value); +static PyObject *Material_getStrandWidthFad( BPy_Material * self ); +static int Material_setStrandWidthFad( BPy_Material * self, PyObject * value); +static PyObject *Material_getStrandUV( BPy_Material * self ); +static int Material_setStrandUV( BPy_Material * self, PyObject * value); /*****************************************************************************/ @@ -1313,6 +1333,46 @@ (getter)Material_getColorbandDiffuseInput, (setter)Material_setColorbandDiffuseInput, "The diffuse colorband input for this material", NULL}, + {"strandTanShad", + (getter)Material_getStrandTangentShad, (setter)Material_setStrandTangentShad, + "Uses direction of strands as normal for tangent-shading", + NULL}, + {"strandSurfDiff", + (getter)Material_getStrandSurfDiff, (setter)Material_setStrandSurfDiff, + "Make diffuse shading more similar to shading the surface", + NULL}, + {"strandDist", + (getter)Material_getStrandDist, (setter)Material_setStrandDist, + "Distance in Blender units over which to blend in the surface normal", + NULL}, + {"strandBlendUnit", + (getter)Material_getStrandBlendUnit, (setter)Material_setStrandBlendUnit, + "Use actual Blender units for widths instead of pixels", + NULL}, + {"strandStart", + (getter)Material_getStrandStart, (setter)Material_setStrandStart, + "Start size of strands", + NULL}, + {"strandEnd", + (getter)Material_getStrandEnd, (setter)Material_setStrandEnd, + "End size of strands", + NULL}, + {"strandMin", + (getter)Material_getStrandMin, (setter)Material_setStrandMin, + "Minimum size of strands in pixels", + NULL}, + {"strandShape", + (getter)Material_getStrandShape, (setter)Material_setStrandShape, + "Shape of strands, positive value makes it rounder, negative makes it spiky", + NULL}, + {"strandFade", + (getter)Material_getStrandWidthFad, (setter)Material_setStrandWidthFad, + "Transparency along the width of the strand", + NULL}, + {"strandUV", + (getter)Material_getStrandUV, (setter)Material_setStrandUV, + "Set name of UV layer to override", + NULL}, /* SSS settings */ {"enableSSS", @@ -3582,3 +3642,146 @@ return EXPP_setIValueClamped(value, &self->material->rampin_spec, MA_RAMP_IN_SHADER, MA_RAMP_IN_RESULT, 'b'); } + +/* Strand */ + +static PyObject *Material_getStrandTangentShad( BPy_Material * self ) +{ + return PyInt_FromLong( ((long)( self->material->mode & MA_TANGENT_STR )) > 0 ); +} + +static int Material_setStrandTangentShad( BPy_Material * self, PyObject * value) +{ + int number; + + if( !PyInt_Check( value ) ) + return EXPP_ReturnIntError( PyExc_TypeError, "expected int argument" ); + + number = PyInt_AS_LONG( value ); + + if (number){ + self->material->mode |= MA_TANGENT_STR; + }else{ + self->material->mode &= ~MA_TANGENT_STR; + } + + return 0; +} + +static PyObject *Material_getStrandSurfDiff( BPy_Material * self ) +{ + return PyInt_FromLong( ((long)( self->material->mode & MA_STR_SURFDIFF )) > 0 ); +} + +static int Material_setStrandSurfDiff( BPy_Material * self, PyObject * value) +{ + int number; + + if( !PyInt_Check( value ) ) + return EXPP_ReturnIntError( PyExc_TypeError, "expected int argument" ); + + number = PyInt_AS_LONG( value ); + + if (number){ + self->material->mode |= MA_STR_SURFDIFF; + }else{ + self->material->mode &= ~MA_STR_SURFDIFF; + } + + return 0; +} + +static PyObject *Material_getStrandDist( BPy_Material * self ) +{ + return PyFloat_FromDouble( ((float)( self->material->strand_surfnor )) ); +} + +static int Material_setStrandDist( BPy_Material * self, PyObject * value) +{ + return EXPP_setFloatRange( value, &self->material->strand_surfnor, 0.0, 10.0 ); +} + +static PyObject *Material_getStrandBlendUnit( BPy_Material * self ) +{ + return PyInt_FromLong( ((long)( self->material->mode & MA_STR_B_UNITS )) > 0 ); +} + +static int Material_setStrandBlendUnit( BPy_Material * self, PyObject * value) +{ + int number; + + if( !PyInt_Check( value ) ) + return EXPP_ReturnIntError( PyExc_TypeError, "expected int argument" ); + + number = PyInt_AS_LONG( value ); + + if (number){ + self->material->mode |= MA_STR_B_UNITS; + }else{ + self->material->mode &= ~MA_STR_B_UNITS; + } + + return 0; +} + +static PyObject *Material_getStrandStart( BPy_Material * self ) +{ + return PyFloat_FromDouble( ((float)( self->material->strand_sta )) ); +} + +static int Material_setStrandStart( BPy_Material * self, PyObject * value) +{ + return EXPP_setFloatRange( value, &self->material->strand_sta, 0.0001, 2.0 ); +} + +static PyObject *Material_getStrandEnd( BPy_Material * self ) +{ + return PyFloat_FromDouble( ((float)( self->material->strand_end )) ); +} + +static int Material_setStrandEnd( BPy_Material * self, PyObject * value) +{ + return EXPP_setFloatRange( value, &self->material->strand_end, 0.0001, 1.0 ); +} + +static PyObject *Material_getStrandMin( BPy_Material * self ) +{ + return PyFloat_FromDouble( ((float)( self->material->strand_min )) ); +} + +static int Material_setStrandMin( BPy_Material * self, PyObject * value) +{ + return EXPP_setFloatRange( value, &self->material->strand_min, 0.0001, 10.0 ); +} + +static PyObject *Material_getStrandShape( BPy_Material * self ) +{ + return PyFloat_FromDouble( ((float)( self->material->strand_ease )) ); +} + +static int Material_setStrandShape( BPy_Material * self, PyObject * value) +{ + return EXPP_setFloatRange( value, &self->material->strand_ease, -0.9, 0.9 ); +} + +static PyObject *Material_getStrandWidthFad( BPy_Material * self ) +{ + return PyFloat_FromDouble( ((float)( self->material->strand_widthfade )) ); +} + +static int Material_setStrandWidthFad( BPy_Material * self, PyObject * value) +{ + return EXPP_setFloatRange( value, &self->material->strand_widthfade, 0.0, 2.0 ); +} + +static PyObject *Material_getStrandUV( BPy_Material * self ) +{ + return EXPP_ReturnPyObjError( PyExc_NotImplementedError, + "Material.strandUV not implemented" ); +} + +static int Material_setStrandUV( BPy_Material * self, PyObject * value) +{ + return EXPP_ReturnPyObjError( PyExc_NotImplementedError, + "Material.strandUV not implemented" ); +} Index: source/blender/python/api2_2x/Object.c =================================================================== --- source/blender/python/api2_2x/Object.c (revisión: 20952) +++ source/blender/python/api2_2x/Object.c (copia de trabajo) @@ -1001,9 +1001,10 @@ int material_dupe = 0; int texture_dupe = 0; int ipo_dupe = 0; + int psys_dupe = 0; static char *kwlist[] = {"mesh", "surface", "curve", - "text", "metaball", "armature", "lamp", "material", "texture", "ipo", NULL}; + "text", "metaball", "armature", "lamp", "material", "texture", "ipo", "psys", NULL}; /* duplicating in background causes segfaults */ if( G.background == 1 ) @@ -1011,11 +1012,11 @@ "cannot duplicate objects in background mode" ); - if (!PyArg_ParseTupleAndKeywords(args, kwd, "|iiiiiiiiii", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kwd, "|iiiiiiiiiii", kwlist, &mesh_dupe, &surface_dupe, &curve_dupe, &text_dupe, &metaball_dupe, - &armature_dupe, &lamp_dupe, &material_dupe, &texture_dupe, &ipo_dupe)) + &armature_dupe, &lamp_dupe, &material_dupe, &texture_dupe, &ipo_dupe, &psys_dupe)) return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing or bool keywords 'mesh', 'surface', 'curve', 'text', 'metaball', 'armature', 'lamp' 'material', 'texture' and 'ipo' as arguments" ); + "expected nothing or bool keywords 'mesh', 'surface', 'curve', 'text', 'metaball', 'armature', 'lamp' 'material', 'texture', 'ipo' and 'psys' as arguments" ); /* USER_DUP_ACT for actions is not supported in the UI so dont support it here */ if (mesh_dupe) dupflag |= USER_DUP_MESH; @@ -1028,6 +1029,7 @@ if (material_dupe) dupflag |= USER_DUP_MAT; if (texture_dupe) dupflag |= USER_DUP_TEX; if (ipo_dupe) dupflag |= USER_DUP_IPO; + if (psys_dupe) dupflag |= USER_DUP_PSYS; adduplicate(2, dupflag); /* 2 is a mode with no transform and no redraw, Duplicate the current selection, context sensitive */ Py_RETURN_NONE; } Index: source/blender/python/api2_2x/Particle.c =================================================================== --- source/blender/python/api2_2x/Particle.c (revisión: 20952) +++ source/blender/python/api2_2x/Particle.c (copia de trabajo) @@ -42,6 +42,7 @@ #include "BKE_utildefines.h" #include "BKE_pointcache.h" #include "BKE_DerivedMesh.h" +#include "BKE_library.h" #include "BIF_editparticle.h" #include "BIF_space.h" #include "blendef.h" @@ -70,6 +71,9 @@ static PyObject *Part_GetSize( BPy_PartSys * self, PyObject * args ); static PyObject *Part_GetVertGroup( BPy_PartSys * self, PyObject * args ); static PyObject *Part_SetVertGroup( BPy_PartSys * self, PyObject * args ); +static int Part_SetName( BPy_PartSys * self, PyObject * args ); +static PyObject *Part_SetNameWithMethod( BPy_PartSys * self, PyObject * args ); +static PyObject *Part_GetName( BPy_PartSys * self, PyObject * args ); static int Part_setSeed( BPy_PartSys * self, PyObject * args ); static PyObject *Part_getSeed( BPy_PartSys * self ); static int Part_setType( BPy_PartSys * self, PyObject * args ); @@ -141,11 +145,16 @@ static PyObject *Part_getRenderDied( BPy_PartSys * self ); static int Part_setRenderMaterialIndex( BPy_PartSys * self, PyObject * args ); static PyObject *Part_getRenderMaterialIndex( BPy_PartSys * self ); +static int Part_setStrandRender( BPy_PartSys * self, PyObject * args ); +static PyObject *Part_getStrandRender( BPy_PartSys * self ); +static int Part_setStrandRenderAn( BPy_PartSys * self, PyObject * args ); +static PyObject *Part_getStrandRenderAn( BPy_PartSys * self ); static int Part_setStep( BPy_PartSys * self, PyObject * args ); static PyObject *Part_getStep( BPy_PartSys * self ); static int Part_setRenderStep( BPy_PartSys * self, PyObject * args ); static PyObject *Part_getRenderStep( BPy_PartSys * self ); static PyObject *Part_getDupOb( BPy_PartSys * self ); +static int Part_setDrawAs( BPy_PartSys * self, PyObject * args ); static PyObject *Part_getDrawAs( BPy_PartSys * self ); static int Part_setPhysType( BPy_PartSys * self, PyObject * args ); static PyObject *Part_getPhysType( BPy_PartSys * self ); @@ -283,6 +292,10 @@ METH_VARARGS, "() - Get the vertex group which affects a particles attribute"}, {"setVertGroup", ( PyCFunction ) Part_SetVertGroup, METH_VARARGS, "() - Set the vertex group to affect a particles attribute"}, + {"getName", ( PyCFunction ) Part_GetName, METH_NOARGS, + "() - Return particle system's name"}, + {"setName", ( PyCFunction ) Part_SetNameWithMethod, METH_VARARGS, + "(s) - Change particle system's name"}, {NULL, NULL, 0, NULL} }; @@ -430,6 +443,14 @@ (getter)Part_getRenderMaterialIndex, (setter)Part_setRenderMaterialIndex, "Specify material index used for the particles", NULL}, + {"strandRender", + (getter)Part_getStrandRender, (setter)Part_setStrandRender, + "Use the strand primitive to render", + NULL}, + {"strandRenderAngle", + (getter)Part_getStrandRenderAn, (setter)Part_setStrandRenderAn, + "How many degrees path has to curve to make another render segment", + NULL}, {"displayPercentage", (getter)Part_getParticleDisp, (setter)Part_setParticleDisp, "Particle display percentage", @@ -447,8 +468,8 @@ "Get the duplicate ob", NULL}, {"drawAs", - (getter)Part_getDrawAs, NULL, - "Get draw type Particle.DRAWAS([ 'NONE' | 'OBJECT' | 'POINT' | ... ] )", + (getter)Part_getDrawAs, (setter)Part_setDrawAs, + "Draw type Particle.DRAWAS([ 'NONE' | 'OBJECT' | 'POINT' | ... ] )", NULL}, /* Newtonian Physics */ {"physics", @@ -2008,7 +2029,34 @@ Py_RETURN_NONE; } +PyObject *Part_GetName( BPy_PartSys * self, PyObject * args ) +{ + ID *id = (ID*) self->psys->part; + if (!id) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "data has been removed" ) ); + return PyString_FromString( id->name + 2 ); +} +int Part_SetName( BPy_PartSys * self, PyObject * args ) +{ + ID *id = (ID*) self->psys->part; + char *name = NULL; + if (!id) return ( EXPP_ReturnIntError( PyExc_RuntimeError, "data has been removed" ) ); + + name = PyString_AsString ( args ); + if( !name ) + return EXPP_ReturnIntError( PyExc_TypeError, + "expected string argument" ); + + rename_id( id, name ); + + return 0; +} + +PyObject * Part_SetNameWithMethod( BPy_PartSys *self, PyObject *args ) +{ + return EXPP_setterWrapper( (void *)self, args, (setter)Part_SetName ); +} + /*****************************************************************************/ /* Function: Set/Get Seed */ /*****************************************************************************/ @@ -2714,6 +2762,44 @@ return PyInt_FromLong( ((long)( self->psys->part->flag & PART_DIED )) > 0 ); } +static int Part_setStrandRender( BPy_PartSys * self, PyObject * args ) +{ + int number; + + if( !PyInt_Check( args ) ) + return EXPP_ReturnIntError( PyExc_TypeError, "expected int argument" ); + + number = PyInt_AS_LONG( args ); + + if (number){ + self->psys->part->draw |= PART_DRAW_REN_STRAND; + }else{ + self->psys->part->draw &= ~PART_DRAW_REN_STRAND; + } + + return 0; +} + +static PyObject *Part_getStrandRender( BPy_PartSys * self ) +{ + return PyInt_FromLong( ((long)( self->psys->part->draw & PART_DRAW_REN_STRAND )) > 0 ); +} + +static int Part_setStrandRenderAn( BPy_PartSys * self, PyObject * args ) +{ + int res = EXPP_setIValueRange( args, &self->psys->part->adapt_angle, + 0, 45, 'i' ); + + psys_flush_settings( self->psys->part, PSYS_ALLOC, 1 ); + + return res; +} + +static PyObject *Part_getStrandRenderAn( BPy_PartSys * self ) +{ + return PyInt_FromLong( ((int)( self->psys->part->adapt_angle )) ); +} + static int Part_setParticleDisp( BPy_PartSys * self, PyObject * args ) { int res = EXPP_setIValueRange( args, &self->psys->part->disp, @@ -2762,6 +2848,16 @@ return PyInt_FromLong( ((short)( self->psys->part->ren_step )) ); } +static int Part_setDrawAs( BPy_PartSys * self, PyObject * args ) +{ + int res = EXPP_setIValueRange( args, &self->psys->part->draw_as, + 0, 9, 'h' ); + + psys_flush_settings( self->psys->part, PSYS_ALLOC, 1 ); + + return res; +} + static PyObject *Part_getDrawAs( BPy_PartSys * self ) { return PyInt_FromLong( (long)( self->psys->part->draw_as ) ); Index: source/blender/python/api2_2x/Texture.c =================================================================== --- source/blender/python/api2_2x/Texture.c (revisión: 20952) +++ source/blender/python/api2_2x/Texture.c (copia de trabajo) @@ -511,6 +511,8 @@ static PyObject *Texture_getColorband( BPy_Texture * self); int Texture_setColorband( BPy_Texture * self, PyObject * value); +static PyObject *Texture_getUseColorband( BPy_Texture * self); +int Texture_setUseColorband( BPy_Texture * self, PyObject * value); static PyObject *Texture_evaluate( BPy_Texture *self, PyObject *value ); static PyObject *Texture_copy( BPy_Texture *self ); @@ -791,6 +793,10 @@ (getter)Texture_getColorband, (setter)Texture_setColorband, "The colorband for this texture", NULL}, + {"useColorband", + (getter)Texture_getUseColorband, (setter)Texture_setUseColorband, + "Use colorband for this texture", + NULL}, {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ }; @@ -2525,6 +2531,29 @@ return EXPP_Colorband_fromPyList( &self->texture->coba, value ); } +static PyObject *Texture_getUseColorband( BPy_Texture * self) +{ + return PyInt_FromLong( ((long)( self->texture->flag & TEX_COLORBAND )) > 0 ); +} + +int Texture_setUseColorband( BPy_Texture * self, PyObject * value) +{ + int number; + + if( !PyInt_Check( value ) ) + return EXPP_ReturnIntError( PyExc_TypeError, "expected int argument" ); + + number = PyInt_AS_LONG( value ); + + if (number){ + self->texture->flag |= TEX_COLORBAND; + }else{ + self->texture->flag &= ~TEX_COLORBAND; + } + + return 0; +} + static PyObject *Texture_evaluate( BPy_Texture * self, PyObject * value ) { TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL}; Index: source/blender/src/editobject.c =================================================================== --- source/blender/src/editobject.c (revisión: 20952) +++ source/blender/src/editobject.c (copia de trabajo) @@ -5185,6 +5185,7 @@ Object *ob, *obn; ID *id; int a, didit; + ParticleSystem *psys; if(G.scene->id.lib) return; clear_id_newpoins(); @@ -5260,6 +5261,16 @@ } } } + if(dupflag & USER_DUP_PSYS) { + for(psys=obn->particlesystem.first; psys; psys=psys->next) { + id= (ID*) psys->part; + if(id) { + ID_NEW_US(psys->part) + else psys->part= psys_copy_settings(psys->part); + id->us--; + } + } + } id= obn->data; didit= 0;