diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h index 54d9c0e1aef1d1ecf19bf948f129b533bc06b4e4..45a95b39a004d5d7b34b047ec47d2de3fe27fd78 100644 --- a/source/blender/python/BPY_extern.h +++ b/source/blender/python/BPY_extern.h @@ -46,7 +46,7 @@ struct _object; // forward declaration for PyObject ! extern "C" { #endif - void BPY_start_python( void ); + void BPY_start_python( int argc, char **argv ); void BPY_end_python( void ); void BPY_post_start_python( void ); int BPY_Err_getLinenumber( void ); @@ -75,7 +75,7 @@ extern "C" { void BPY_clear_script( struct Script *script ); void BPY_free_finished_script( struct Script *script ); - void init_syspath( void ); + void init_syspath( int first_time ); void syspath_append( char *dir ); char *bpy_gethome( void ); diff --git a/source/blender/python/BPY_interface.c b/source/blender/python/BPY_interface.c index 6ce4b969d8a4dedfb41f188369def269a0241fc6..ee318ddaca720f71784eab16d82b5fac7b3d2216 100644 --- a/source/blender/python/BPY_interface.c +++ b/source/blender/python/BPY_interface.c @@ -26,7 +26,7 @@ * This is a new part of Blender. * * Contributor(s): Michel Selten, Willian P. Germano, Stephen Swaney, - * Chris Keith + * Chris Keith, Chris Want * * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ @@ -114,14 +114,26 @@ PyObject *blender_import( PyObject * self, PyObject * args ); * api variations. * Notes: Currently only the api for 2.2x will be initialised. ****************************************************************************/ -void BPY_start_python( void ) +void BPY_start_python( int argc, char **argv ) { - bpy_registryDict = PyDict_New( ); /* check comment at start of this file */ + static int argc_copy = 0; + static char **argv_copy = NULL; + int first_time = argc; + + /* we keep a copy of the values of argc and argv so that the game engine + * can call BPY_start_python(0, NULL) whenever a game ends, without having + * to know argc and argv there (in source/blender/src/space.c) */ + + if( first_time ) { + argc_copy = argc; + argv_copy = argv; + } + + bpy_registryDict = PyDict_New( );/* check comment at start of this file */ if( !bpy_registryDict ) printf( "Error: Couldn't create the Registry Python Dictionary!" ); -/* TODO: Shouldn't "blender" be replaced by PACKAGE ?? (config.h) */ Py_SetProgramName( "blender" ); /* @@ -130,16 +142,19 @@ void BPY_start_python( void ) * rest of our init msgs. */ - printf( "Checking for Python install...\n" ); - fflush( stdout ); + if( first_time ) { /* so it only prints msg on first_time */ + printf( "Checking for Python install...\n" ); + fflush( stdout ); + } Py_Initialize( ); + PySys_SetArgv( argc_copy, argv_copy ); init_ourImport( ); initBlenderApi2_2x( ); - init_syspath( ); + init_syspath( first_time ); /* not first_time: some msgs are suppressed */ return; } @@ -187,7 +202,7 @@ void syspath_append( char *dirname ) Py_DECREF( mod_sys ); } -void init_syspath( void ) +void init_syspath( int first_time ) { PyObject *path; PyObject *mod, *d; @@ -238,7 +253,7 @@ void init_syspath( void ) int size = 0; int index; - printf( "Installed Python found!\n" ); + if( first_time ) printf( "Installed Python found!\n" ); /* get the value of 'sitedirs' from the module */ @@ -260,15 +275,16 @@ void init_syspath( void ) Py_DECREF( mod ); } else { /* import 'site' failed */ PyErr_Clear( ); - printf( "No installed Python found.\n" ); - printf( "Only built-in modules are available. Some scripts may not run.\n" ); - printf( "Continuing happily.\n" ); + if( first_time ) { + printf( "No installed Python found.\n" ); + printf( "Only built-in modules are available. Some scripts may not run.\n" ); + printf( "Continuing happily.\n" ); + } } /* * initialize the sys module * set sys.executable to the Blender exe - * set argv[0] to the Blender exe */ mod = PyImport_ImportModule( "sys" ); /* new ref */ @@ -277,9 +293,6 @@ void init_syspath( void ) d = PyModule_GetDict( mod ); /* borrowed ref */ PyDict_SetItemString( d, "executable", Py_BuildValue( "s", bprogname ) ); - /* in the future this can be extended to have more argv's if needed: */ - PyDict_SetItemString( d, "argv", - Py_BuildValue( "[s]", bprogname ) ); Py_DECREF( mod ); } } diff --git a/source/blender/python/api2_2x/Image.c b/source/blender/python/api2_2x/Image.c index 02a2a47b8ba14837fd6809eefeae948b73e1aab4..ce70db0cf75c86d0ee5519a38f029fd9099a87df 100644 --- a/source/blender/python/api2_2x/Image.c +++ b/source/blender/python/api2_2x/Image.c @@ -34,6 +34,7 @@ #include "BLI_winstuff.h" #endif /* WIN32 */ +#include <BDR_drawmesh.h> /* free_realtime_image */ #include <BKE_main.h> #include <BKE_global.h> #include <BKE_library.h> @@ -250,6 +251,7 @@ static PyObject *Image_setXRep( BPy_Image * self, PyObject * args ); static PyObject *Image_setYRep( BPy_Image * self, PyObject * args ); static PyObject *Image_reload( BPy_Image * self ); /* by Campbell */ static PyObject *Image_glLoad( BPy_Image * self ); +static PyObject *Image_glFree( BPy_Image * self ); /*****************************************************************************/ /* Python BPy_Image methods table: */ @@ -275,6 +277,9 @@ static PyMethodDef BPy_Image_methods[] = { {"glLoad", ( PyCFunction ) Image_glLoad, METH_NOARGS, "() - Load the image data in OpenGL texture memory.\n\ The bindcode (int) is returned."}, + {"glFree", ( PyCFunction ) Image_glFree, METH_NOARGS, + "() - Free the image data from OpenGL texture memory only,\n\ + see also image.glLoad()."}, {"setName", ( PyCFunction ) Image_setName, METH_VARARGS, "(str) - Change Image object name"}, {"setXRep", ( PyCFunction ) Image_setXRep, METH_VARARGS, @@ -482,6 +487,14 @@ static PyObject *Image_reload( BPy_Image * self ) return Py_None; } +static PyObject *Image_glFree( BPy_Image * self ) +{ + Image *img = self->image; + + free_realtime_image( img ); + return EXPP_incr_ret( Py_None ); +} + static PyObject *Image_glLoad( BPy_Image * self ) { Image *img = self->image; diff --git a/source/blender/python/api2_2x/Object.c b/source/blender/python/api2_2x/Object.c index bdb3ad33a51c71a873b4040e80df0e1d775985d6..6311f2be933a4bac07695fc351f2927c1c5b8d59 100644 --- a/source/blender/python/api2_2x/Object.c +++ b/source/blender/python/api2_2x/Object.c @@ -196,9 +196,14 @@ hierarchy (faster)"}, "(i = 0) - Returns list of materials assigned to the object.\n\ if i is nonzero, empty slots are not ignored: they are returned as None's."}, {"getMatrix", ( PyCFunction ) Object_getMatrix, METH_VARARGS, - "(str = 'localspace') - Returns the object matrix.\n\ -(str = 'localspace') - the wanted matrix: worldspace, localspace (default)\n\ -or oldlocal (not updated, it was the only choice before Blender 2.34)."}, + "(str = 'worldspace') - Returns the object matrix.\n\ +(str = 'localspace') - the wanted matrix: worldspace (default), localspace\n\ +or old_worldspace.\n\ +\n\ +'old_worldspace' was the only behavior before Blender 2.34. With it the\n\ +matrix is not updated for changes made by the script itself\n\ +(like obj.LocX = 10) until a redraw happens, either called by the script or\n\ +automatic when the script finishes."}, {"getName", ( PyCFunction ) Object_getName, METH_NOARGS, "Returns the name of the object"}, {"getParent", ( PyCFunction ) Object_getParent, METH_NOARGS, @@ -952,7 +957,7 @@ static PyObject *Object_getMaterials( BPy_Object * self, PyObject * args ) static PyObject *Object_getMatrix( BPy_Object * self, PyObject * args ) { PyObject *matrix; - char *space = "localspace"; /* default to local */ + char *space = "worldspace"; /* default to local */ if( !PyArg_ParseTuple( args, "|s", &space ) ) { return ( EXPP_ReturnPyObjError( PyExc_AttributeError, @@ -970,13 +975,14 @@ static PyObject *Object_getMatrix( BPy_Object * self, PyObject * args ) } else if( BLI_streq( space, "localspace" ) ) { /* Localspace matrix */ object_to_mat4( self->object, *( ( MatrixObject * ) matrix )->matrix ); - } else if( BLI_streq( space, "oldlocal" ) ) { /* old behavior, prior to 2.34 */ + /* old behavior, prior to 2.34, check this method's doc string: */ + } else if( BLI_streq( space, "old_worldspace" ) ) { Mat4CpyMat4( *( ( MatrixObject * ) matrix )->matrix, self->object->obmat ); } else { return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "wrong parameter, expected nothing or either 'localspace' (default),\n\ -'worldspace' or 'oldlocal'" ) ); + "wrong parameter, expected nothing or either 'worldspace' (default),\n\ +'localspace' or 'old_worldspace'" ) ); } return matrix; } @@ -2199,7 +2205,7 @@ static PyObject *Object_getAttr( BPy_Object * obj, char *name ) } if( StringEqual( name, "mat" ) || StringEqual( name, "matrix" ) ) return ( Object_getMatrix - ( obj, Py_BuildValue( "(s)", "localspace" ) ) ); + ( obj, Py_BuildValue( "(s)", "worldspace" ) ) ); if( StringEqual( name, "matrixWorld" ) ) return ( Object_getMatrix ( obj, Py_BuildValue( "(s)", "worldspace" ) ) ); diff --git a/source/blender/python/api2_2x/Sound.c b/source/blender/python/api2_2x/Sound.c index ca5b24c8a3d9d8838c0075008c89c6743a1491da..eb8b5094b5878462d10ce267bcacad0a9db36c69 100644 --- a/source/blender/python/api2_2x/Sound.c +++ b/source/blender/python/api2_2x/Sound.c @@ -48,11 +48,16 @@ /* Python BPy_Sound defaults: */ /*****************************************************************************/ +#define EXPP_SND_volume_MIN 0.0 +#define EXPP_SND_volume_MAX 1.0 +#define EXPP_SND_pitch_MIN -12.0 +#define EXPP_SND_pitch_MAX 12.0 +#define EXPP_SND_attenuation_MIN 0.0 +#define EXPP_SND_attenuation_MAX 5.0 + /*****************************************************************************/ /* Python API function prototypes for the Sound module. */ /*****************************************************************************/ -static PyObject *M_Sound_New( PyObject * self, PyObject * args, - PyObject * keywords ); static PyObject *M_Sound_Get( PyObject * self, PyObject * args ); static PyObject *M_Sound_Load( PyObject * self, PyObject * args ); @@ -63,26 +68,20 @@ static PyObject *M_Sound_Load( PyObject * self, PyObject * args ); /************************************************************************/ static char M_Sound_doc[] = "The Blender Sound module\n\n"; -static char M_Sound_New_doc[] = - "() - return a new Sound object -- unimplemented"; - static char M_Sound_Get_doc[] = "(name) - return the sound with the name 'name', \ returns None if not found.\n If 'name' is not specified, \ it returns a list of all sounds in the\ncurrent scene."; static char M_Sound_Load_doc[] = - "(filename, redraw = 0) - return sound from file filename as Sound Object,\n\ + "(filename) - return sound from file filename as a Sound Object,\n\ returns None if not found."; /*****************************************************************************/ /* Python method structure definition for Blender.Sound module: */ /*****************************************************************************/ struct PyMethodDef M_Sound_methods[] = { - {"New", ( PyCFunction ) M_Sound_New, METH_VARARGS | METH_KEYWORDS, - M_Sound_New_doc}, {"Get", M_Sound_Get, METH_VARARGS, M_Sound_Get_doc}, - {"get", M_Sound_Get, METH_VARARGS, M_Sound_Get_doc}, {"Load", M_Sound_Load, METH_VARARGS, M_Sound_Load_doc}, {NULL, NULL, 0, NULL} }; @@ -109,7 +108,8 @@ static PyObject *Sound_set ## funcname(BPy_Sound *self, PyObject *args) { \ if (!PyArg_ParseTuple(args, "f", &f)) \ return (EXPP_ReturnPyObjError (PyExc_TypeError, \ "expected float argument")); \ - self->sound->varname = f; \ + self->sound->varname = EXPP_ClampFloat(f,\ + EXPP_SND_##varname##_MIN, EXPP_SND_##varname##_MAX);\ Py_INCREF(Py_None); \ return Py_None; \ } @@ -127,14 +127,18 @@ static PyObject *Sound_set ## funcname(BPy_Sound *self, PyObject *args) { \ static PyObject *Sound_getName( BPy_Sound * self ); static PyObject *Sound_getFilename( BPy_Sound * self ); static PyObject *Sound_play( BPy_Sound * self ); -static PyObject *Sound_makeActive( BPy_Sound * self ); +static PyObject *Sound_setCurrent( BPy_Sound * self ); +//static PyObject *Sound_reload ( BPy_Sound * self ); SOUND_FLOAT_METHODS( Volume, volume ) - SOUND_FLOAT_METHODS( Panning, panning ) - SOUND_FLOAT_METHODS( Attenuation, attenuation ) - SOUND_FLOAT_METHODS( Pitch, pitch ) - SOUND_FLOAT_METHODS( MinGain, min_gain ) - SOUND_FLOAT_METHODS( MaxGain, max_gain ) - SOUND_FLOAT_METHODS( Distance, distance ) +SOUND_FLOAT_METHODS( Attenuation, attenuation ) +SOUND_FLOAT_METHODS( Pitch, pitch ) +/* these can't be set via interface, removed for now */ +/* +SOUND_FLOAT_METHODS( Panning, panning ) +SOUND_FLOAT_METHODS( MinGain, min_gain ) +SOUND_FLOAT_METHODS( MaxGain, max_gain ) +SOUND_FLOAT_METHODS( Distance, distance ) +*/ /*****************************************************************************/ /* Python BPy_Sound methods table: */ @@ -147,15 +151,21 @@ static PyMethodDef BPy_Sound_methods[] = { "() - Return Sound object filename"}, {"play", ( PyCFunction ) Sound_play, METH_NOARGS, "() - play this sound"}, - {"makeActive", ( PyCFunction ) Sound_makeActive, METH_NOARGS, + {"setCurrent", ( PyCFunction ) Sound_setCurrent, METH_NOARGS, "() - make this the active sound in the sound buttons win (also redraws)"}, + //{"reload", ( PyCFunction ) Sound_setCurrent, METH_NOARGS, + //"() - reload this Sound object's sample.\n\ +//This is only useful if the original sound file has changed."}, SOUND_FLOAT_METHOD_FUNCS( Volume ) - SOUND_FLOAT_METHOD_FUNCS( Panning ) - SOUND_FLOAT_METHOD_FUNCS( Attenuation ) - SOUND_FLOAT_METHOD_FUNCS( Pitch ) - SOUND_FLOAT_METHOD_FUNCS( MinGain ) - SOUND_FLOAT_METHOD_FUNCS( MaxGain ) - SOUND_FLOAT_METHOD_FUNCS( Distance ) {NULL, NULL, 0, NULL} + SOUND_FLOAT_METHOD_FUNCS( Attenuation ) + SOUND_FLOAT_METHOD_FUNCS( Pitch ) + /* + SOUND_FLOAT_METHOD_FUNCS( Panning ) + SOUND_FLOAT_METHOD_FUNCS( MinGain ) + SOUND_FLOAT_METHOD_FUNCS( MaxGain ) + SOUND_FLOAT_METHOD_FUNCS( Distance ) + */ + {NULL, NULL, 0, NULL} }; /*****************************************************************************/ @@ -185,19 +195,6 @@ PyTypeObject Sound_Type = { 0, /* tp_members */ }; -/*****************************************************************************/ -/* Function: M_Sound_New */ -/* Python equivalent: Blender.Sound.New */ -/*****************************************************************************/ -static PyObject *M_Sound_New( PyObject * self, PyObject * args, - PyObject * keywords ) -{ - printf( "In Sound_New() - unimplemented in 2.34\n" ); - - Py_INCREF( Py_None ); - return Py_None; -} - /* NOTE: these were copied and modified from image.h. To Be Done TBD: * macro-ize them, or C++ templates eventually? */ @@ -417,7 +414,7 @@ static PyObject *Sound_play( BPy_Sound * self ) return Py_None; } -static PyObject *Sound_makeActive( BPy_Sound * self ) +static PyObject *Sound_setCurrent( BPy_Sound * self ) { bSound *snd_ptr = self->sound; @@ -433,6 +430,19 @@ static PyObject *Sound_makeActive( BPy_Sound * self ) Py_INCREF( Py_None ); return Py_None; } +/* +static PyObject *Sound_reload( BPy_Sound * self) +{ + sound_free_sample(); + + if (sound->snd_sound) { + SND_RemoveSound(ghSoundScene, sound->snd_sound); + sound->snd_sound = NULL; + } + + return EXPP_incr_ret( Py_None ); +} +*/ /*****************************************************************************/ /* Function: Sound_getAttr */ diff --git a/source/blender/python/api2_2x/Window.c b/source/blender/python/api2_2x/Window.c index 84b3a5974bbba99ac1d76e618b27221c20e3593a..067bfc8d33a7f33a16dbc5b583d8e82c61aac9be 100644 --- a/source/blender/python/api2_2x/Window.c +++ b/source/blender/python/api2_2x/Window.c @@ -25,7 +25,7 @@ * * This is a new part of Blender. * - * Contributor(s): Willian P. Germano + * Contributor(s): Willian P. Germano, Tom Musgrove * * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ @@ -47,6 +47,7 @@ #include <BIF_screen.h> #include <BIF_space.h> #include <BIF_drawtext.h> +#include <BIF_mywindow.h> /* L/M/R_MOUSE bitflags */ #include <BIF_spacetypes.h> #include <mydevice.h> #include <DNA_view3d_types.h> @@ -85,6 +86,7 @@ static PyObject *M_Window_SetViewQuat( PyObject * self, PyObject * args ); static PyObject *M_Window_GetViewOffset( PyObject * self ); static PyObject *M_Window_SetViewOffset( PyObject * self, PyObject * args ); static PyObject *M_Window_GetViewMatrix( PyObject * self ); +static PyObject *M_Window_GetPerspMatrix( PyObject * self ); static PyObject *M_Window_FileSelector( PyObject * self, PyObject * args ); static PyObject *M_Window_ImageSelector( PyObject * self, PyObject * args ); static PyObject *M_Window_EditMode( PyObject * self, PyObject * args ); @@ -164,6 +166,9 @@ static char M_Window_GetViewVector_doc[] = static char M_Window_GetViewMatrix_doc[] = "() - Get the current 3d view matrix."; +static char M_Window_GetPerspMatrix_doc[] = + "() - Get the current 3d Persp matrix."; + static char M_Window_EditMode_doc[] = "() - Get the current status -- 0: not in edit mode; 1: in edit mode.\n\ (status) - if 1: enter edit mode; if 0: leave edit mode.\n\ @@ -228,7 +233,7 @@ static char M_Window_SetMouseCoords_doc[] = (x,y) - ints ([x, y] also accepted): the new x, y coordinates."; static char M_Window_GetMouseButtons_doc[] = - "() - Get the current mouse button state (see Blender.Draw.LEFTMOUSE, etc)."; + "() - Get the current mouse button state (see Blender.Window.MButs dict)."; static char M_Window_GetKeyQualifiers_doc[] = "() - Get the current qualifier keys state.\n\ @@ -306,6 +311,8 @@ struct PyMethodDef M_Window_methods[] = { M_Window_SetViewOffset_doc}, {"GetViewMatrix", ( PyCFunction ) M_Window_GetViewMatrix, METH_NOARGS, M_Window_GetViewMatrix_doc}, + {"GetPerspMatrix", ( PyCFunction ) M_Window_GetPerspMatrix, METH_NOARGS, + M_Window_GetPerspMatrix_doc}, {"EditMode", ( PyCFunction ) M_Window_EditMode, METH_VARARGS, M_Window_EditMode_doc}, {"ViewLayer", ( PyCFunction ) M_Window_ViewLayer, METH_VARARGS, @@ -784,6 +791,30 @@ static PyObject *M_Window_GetViewMatrix( PyObject * self ) return viewmat; } +/*****************************************************************************/ +/* Function: M_Window_GetPerspMatrix */ +/* Python equivalent: Blender.Window.GetPerspMatrix */ +/*****************************************************************************/ +static PyObject *M_Window_GetPerspMatrix( PyObject * self ) +{ + PyObject *perspmat; + + if( !G.vd ) { + Py_INCREF( Py_None ); + return Py_None; + } + + perspmat = + ( PyObject * ) newMatrixObject( ( float * ) G.vd->persmat, 4, + 4 ); + + if( !perspmat ) + return EXPP_ReturnPyObjError( PyExc_MemoryError, + "GetPerspMatrix: couldn't create matrix pyobject" ); + + return perspmat; +} + static PyObject *M_Window_EditMode( PyObject * self, PyObject * args ) { short status = -1; @@ -1214,7 +1245,7 @@ static PyObject *M_Window_GetScreenInfo( PyObject * self, PyObject * args, /*****************************************************************************/ PyObject *Window_Init( void ) { - PyObject *submodule, *Types, *Qual, *dict; + PyObject *submodule, *Types, *Qual, *MButs, *dict; submodule = Py_InitModule3( "Blender.Window", M_Window_methods, @@ -1226,6 +1257,7 @@ PyObject *Window_Init( void ) Types = M_constant_New( ); Qual = M_constant_New( ); + MButs = M_constant_New( ); if( Types ) { BPy_constant *d = ( BPy_constant * ) Types; @@ -1264,5 +1296,15 @@ PyObject *Window_Init( void ) PyModule_AddObject( submodule, "Qual", Qual ); } + if( MButs ) { + BPy_constant *d = ( BPy_constant * ) MButs; + + constant_insert( d, "L", PyInt_FromLong( L_MOUSE ) ); + constant_insert( d, "M", PyInt_FromLong( M_MOUSE ) ); + constant_insert( d, "R", PyInt_FromLong( R_MOUSE ) ); + + PyModule_AddObject( submodule, "MButs", MButs ); + } + return submodule; } diff --git a/source/blender/python/api2_2x/World.c b/source/blender/python/api2_2x/World.c index 89af766c354a45acb18bdeef57b975d3e875e40e..d35dbef5145fa9d41cf2539537293d595ddc337e 100644 --- a/source/blender/python/api2_2x/World.c +++ b/source/blender/python/api2_2x/World.c @@ -85,7 +85,7 @@ static PyObject *World_setMist( BPy_World * self, PyObject * args ); static PyObject *World_getScriptLinks( BPy_World * self, PyObject * args ); static PyObject *World_addScriptLink( BPy_World * self, PyObject * args ); static PyObject *World_clearScriptLinks( BPy_World * self ); -static PyObject *World_makeActive( BPy_World * self ); +static PyObject *World_setCurrent( BPy_World * self ); /*****************************************************************************/ @@ -94,7 +94,7 @@ static PyObject *World_makeActive( BPy_World * self ); static PyObject *M_World_New( PyObject * self, PyObject * args, PyObject * keywords ); static PyObject *M_World_Get( PyObject * self, PyObject * args ); -static PyObject *M_World_GetActive( PyObject * self ); +static PyObject *M_World_GetCurrent( PyObject * self ); /*****************************************************************************/ @@ -123,7 +123,7 @@ static char M_World_Get_doc[] = "(name) - return the world with the name 'name', \ returns None if not found.\n If 'name' is not specified, \ it returns a list of all worlds in the\ncurrent scene."; -static char M_World_GetActive_doc[] = "() - returns the current world, or \ +static char M_World_GetCurrent_doc[] = "() - returns the current world, or \ None if the Scene has no world"; @@ -135,8 +135,10 @@ struct PyMethodDef M_World_methods[] = { {"New", ( PyCFunction ) M_World_New, METH_VARARGS | METH_KEYWORDS, M_World_New_doc}, {"Get", M_World_Get, METH_VARARGS, M_World_Get_doc}, - {"GetActive", ( PyCFunction ) M_World_GetActive, METH_NOARGS, - M_World_GetActive_doc}, + {"GetActive", ( PyCFunction ) M_World_GetCurrent, METH_NOARGS, + M_World_GetCurrent_doc}, + {"GetCurrent", ( PyCFunction ) M_World_GetCurrent, METH_NOARGS, + M_World_GetCurrent_doc}, {"get", M_World_Get, METH_VARARGS, M_World_Get_doc}, {NULL, NULL, 0, NULL} }; @@ -200,8 +202,10 @@ static PyMethodDef BPy_World_methods[] = { {"clearScriptLinks", ( PyCFunction ) World_clearScriptLinks, METH_NOARGS, "() - Delete all scriptlinks from this world :)."}, - {"makeActive", ( PyCFunction ) World_makeActive, METH_NOARGS, + {"setCurrent", ( PyCFunction ) World_setCurrent, METH_NOARGS, "() - Makes this world the active world for the current scene."}, + {"makeActive", ( PyCFunction ) World_setCurrent, METH_NOARGS, + "please use setCurrent instead, this alias will be removed."}, {NULL, NULL, 0, NULL} }; @@ -357,7 +361,7 @@ static PyObject *M_World_Get( PyObject * self, PyObject * args ) -static PyObject *M_World_GetActive( PyObject * self ) +static PyObject *M_World_GetCurrent( PyObject * self ) { BPy_World *w = NULL; if( !G.scene->world ) { @@ -864,8 +868,8 @@ static PyObject *World_getScriptLinks( BPy_World * self, PyObject * args ) -/* world.makeActive */ -static PyObject *World_makeActive( BPy_World * self ) +/* world.setCurrent */ +static PyObject *World_setCurrent( BPy_World * self ) { World *world = self->world; /* If there is a world then it now has one less user */ diff --git a/source/blender/python/api2_2x/doc/API_intro.py b/source/blender/python/api2_2x/doc/API_intro.py index 94f583211fc6b41c23c80b00cd21e102a16a673b..8f684c791447cabd9a1096faafd061f102358c05 100644 --- a/source/blender/python/api2_2x/doc/API_intro.py +++ b/source/blender/python/api2_2x/doc/API_intro.py @@ -34,11 +34,13 @@ The Blender Python API Reference - L{Scene} (*) - L{Radio} - L{Render} + - L{Sound} (new) - L{Text} - L{Texture} - L{Types} - - L{Window} - - L{World} + - L{Window} (*) + - L{Theme} (new) + - L{World} (*) - L{sys<Sys>} (*) - marks updated. diff --git a/source/blender/python/api2_2x/doc/BGL.py b/source/blender/python/api2_2x/doc/BGL.py index cbb8b455b19ca9c28d75d5789b2140cb6a076c4e..6c20e4ec7b4394ca15af11f25fa5ba58205aeb7e 100644 --- a/source/blender/python/api2_2x/doc/BGL.py +++ b/source/blender/python/api2_2x/doc/BGL.py @@ -74,6 +74,9 @@ Example:: # Draw.Register(show_win, ev, None) # start the main loop +@note: you can use the L{Image} module and L{Image.Image} bpy object to load + and set textures. See L{Image.Image.glLoad} and L{Image.Image.glFree}, + for example. @see: U{www.opengl.org} @see: U{nehe.gamedev.net} """ diff --git a/source/blender/python/api2_2x/doc/Image.py b/source/blender/python/api2_2x/doc/Image.py index f09a5fbcc69e855400c861363ab9ae346e796ab9..df4b5c6a65c43ff2b7c318dd6f8b9d8c8d78bf37 100644 --- a/source/blender/python/api2_2x/doc/Image.py +++ b/source/blender/python/api2_2x/doc/Image.py @@ -6,7 +6,7 @@ The Blender.Image submodule. Image ===== -B{New}: L{Image.reload}, L{Image.getBindCode}. +B{New}: L{Image.glLoad}, L{Image.glFree}. This module provides access to B{Image} objects in Blender. @@ -110,8 +110,8 @@ class Image: def getBindCode(): """ - Get the Image's bindcode. This is for texture loading using BGL calls, - see for example L{BGL.glBindTexture}. + Get the Image's bindcode. This is for texture loading using BGL calls. + See, for example, L{BGL.glBindTexture} and L{glLoad}. @rtype: int """ @@ -125,6 +125,29 @@ class Image: @returns: None """ + def glLoad(): + """ + Load this image's data into OpenGL texture memory, if it is not already + loaded (image.bindcode is 0 if it is not loaded yet). + @note: Usually you don't need to call this method. It is only necessary + if you want to draw textured objects in the Scripts window and the + image's bind code is zero at that moment, otherwise Blender itself can + take care of binding / unbinding textures. Calling this method for an + image with nonzero bind code simply returns the image's bind code value + (see L{getBindCode}). + @rtype: int + @returns: the texture's bind code. + """ + + def glFree(): + """ + Delete this image's data from OpenGL texture memory, only (the image itself + is not removed from Blender's memory). Internally, glDeleteTextures (see + L{BGL.glDeleteTextures}) is used, but this method also updates Blender's + Image object so that its bind code is set to 0. See also L{Image.glLoad}, + L{Image.getBindCode}. + """ + def setName(name): """ Set the name of this Image object. diff --git a/source/blender/python/api2_2x/doc/Object.py b/source/blender/python/api2_2x/doc/Object.py index 07c674b9dbea57d14e317d2b20b18dfbf2369daf..c2d1db093ca27213a9ddc4a0ab80435dffdc6b3e 100644 --- a/source/blender/python/api2_2x/doc/Object.py +++ b/source/blender/python/api2_2x/doc/Object.py @@ -3,7 +3,8 @@ """ The Blender.Object submodule -B{New}: 'oldlocal' parameter in L{Object.Object.getMatrix}. +B{New}: 'old_worldspace' parameter in L{Object.Object.getMatrix}, which now +defaults to 'worldspace'. Object ====== @@ -146,7 +147,7 @@ class Object: @cvar data: The data of the object. (Read-only) @cvar ipo: The ipo data associated with the object. (Read-only) @cvar mat: The matrix of the object relative to its parent. (Read-only) - @cvar matrix: The matrix of the object relative to its parent. (Read-only) + @cvar matrix: The matrix of the object in world space. (Read-only) @cvar matrixLocal: The matrix of the object relative to its parent. (Read-only) @cvar matrixWorld: The matrix of the object in world space. (Read-only) @cvar colbits: The Material usage mask. A set bit #n means: the Material @@ -287,17 +288,17 @@ class Object: @return: list of Material Objects assigned to the object. """ - def getMatrix(space = 'localspace'): + def getMatrix(space = 'worldspace'): """ Returns the object matrix. @type space: string @param space: The desired matrix: - - localspace (default): relative to the object's parent; - - worldspace: absolute, taking vertex parents, tracking and ipo's into - account; - - oldlocal: old behavior, prior to Blender 2.34, where eventual changes - made by the script itself were not taken into account until the - script finished executing. + - worldspace (default): absolute, taking vertex parents, tracking and + ipo's into account; + - localspace: relative to the object's parent; + - old_worldspace: old behavior, prior to Blender 2.34, where eventual + changes made by the script itself were not taken into account until + a redraw happened, either called by the script or upon its exit. Returns the object matrix. @rtype: Py_Matrix @return: a python 4x4 matrix object diff --git a/source/blender/python/api2_2x/doc/Sound.py b/source/blender/python/api2_2x/doc/Sound.py new file mode 100644 index 0000000000000000000000000000000000000000..6cc72f471cf02cdb37c42197d7745eaed635b17b --- /dev/null +++ b/source/blender/python/api2_2x/doc/Sound.py @@ -0,0 +1,112 @@ +# Blender.Sound module and the Sound PyType object + +""" +The Blender.Sound submodule. + +Sound +===== + +This module provides access to B{Sound} objects in Blender. + +Example:: + import Blender + from Blender import Sound + # + sound = Sound.Load("/path/to/my/sound.wav") # load a sound file + print "Sound from", sound.getFilename(), + print "loaded to obj", sound.getName()) + print "All Sounds available now:", Sound.Get() +""" + +def Load (filename): + """ + Load the sound called 'filename' into a Sound object. + @type filename: string + @param filename: The full path to the sound file. + @rtype: Blender Sound + @return: A Blender Sound object with the data from I{filename}. + """ + +def Get (name = None): + """ + Get the Sound object(s) from Blender. + @type name: string + @param name: The name of the Sound object. + @rtype: Blender Sound or a list of Blender Sounds + @return: It depends on the I{name} parameter: + - (name): The Sound object called I{name}, None if not found; + - (): A list with all Sound objects in the current scene. + """ + + +class Sound: + """ + The Sound object + ================ + This object gives access to Sounds in Blender. + @cvar name: The name of this Sound object. + @cvar filename: The filename (path) to the sound file loaded into this Sound + object. + """ + + def getName(): + """ + Get the name of this Sound object. + @rtype: string + """ + + def getFilename(): + """ + Get the filename of the sound file loaded into this Sound object. + @rtype: string + """ + + def play(): + """ + Play this sound. + """ + + def setCurrent(): + """ + Make this the active sound in the sound buttons window (also redraws). + """ + + def getVolume(): + """ + Get this sound's volume. + rtype: float + """ + + def setVolume(f): + """ + Set this sound's volume. + @type f: float + @param f: the new volume value in the range [0.0, 1.0]. + """ + + def getAttenuation(): + """ + Get this sound's attenuation value. + rtype: float + """ + + def setAttenuation(f): + """ + Set this sound's attenuation. + @type f: float + @param f: the new attenuation value in the range [0.0, 5.0]. + """ + + def getPitch(): + """ + Get this sound's pitch value. + rtype: float + """ + + def setPitch(f): + """ + Set this sound's pitch. + @type f: float + @param f: the new pitch value in the range [-12.0, 12.0]. + """ + diff --git a/source/blender/python/api2_2x/doc/Theme.py b/source/blender/python/api2_2x/doc/Theme.py new file mode 100644 index 0000000000000000000000000000000000000000..facfee068c232c2b74d71e1db14f103c99a3780b --- /dev/null +++ b/source/blender/python/api2_2x/doc/Theme.py @@ -0,0 +1,188 @@ +# Blender.Window.Theme submodule and the Theme PyType object + +""" +The Blender.Window.Theme submodule. + +Theme +===== + +This module provides access to B{Theme} objects in Blender. + +Example:: + # this is a simplified version of the save_theme.py script + # shipped with Blender: + import Blender + from Blender.Window import Theme, FileSelector + + theme = Theme.Get()[0] # get current theme + + def write_theme(filename): + "Write the current theme as a bpython script" + + f = file(filename, "w") + + f.write("import Blender") + f.write("from Blender.Window import Theme") + f.write("theme = Theme.New('%s')" % theme.name) + + for tsp in theme.get(): # write each theme space + command = "\\n%s = theme.get('%s')" % (tsp, tsp) + f.write(command + "\\n") + exec(command) + exec("vars = dir(%s)" % tsp) + vars.remove('theme') + + for var in vars: # write each variable from each theme space + v = "%s.%s" % (tsp, var) + exec("value = %s" % v) + f.write("%s = %s\\n" % (v, value)) + + f.write('\\nBlender.Redraw(-1)') # redraw to update the screen + f.close() + + FileSelector(write_theme, "Save Current Theme", default_fname) +""" + +def New (name = "New Theme", theme = '<default>'): + """ + Create a new Theme object. + @type name: string + @param name: The name of the new theme. + @type theme: Blender Theme + @param theme: a base theme to copy all data from. It defaults to the current + one. + @rtype: Blender Theme + @return: A new Blender Theme object. + """ + +def Get (name = None): + """ + Get the Theme object(s) from Blender. + @type name: string + @param name: The name of the Theme object. + @rtype: Blender Theme or a list of Blender Themes + @return: It depends on the I{name} parameter: + - (name): The Theme object called I{name}, None if not found; + - (): A list with all Theme objects currently in Blender. + """ + + +class Theme: + """ + The Theme object + ================ + This object gives access to Themes in Blender. Each Theme object is + composed of one UI (Use Interface) theme and many Space themes + (3d view, Text Editor, Buttons window, etc). + @cvar name: The name of this Theme object. + """ + + def getName(): + """ + Get the name of this Theme object. + @rtype: string + @return: the name of this Theme object. + """ + + def setName(s): + """ + Rename this theme. + @type s: string + @param s: the new name. + """ + + def get(t = None): + """ + Get a space or the ui (sub)theme from this Theme. + @type t: string, int or None + @param t: the wanted sub-theme as either: + - int: -1 for UI or the types in L{Window.Types} for the others; + - string: use get() to know them (they are case insensitive); + - nothing: as written above, get() returns a list of names. + @rtype: Blender ThemeSpace or ThemeUI or list of sub-theme types as strings. + @return: It depends on the given parameter: + - (): a list with all available types, as strings; + - (type): the chosen sub-theme. + """ + + class ThemeUI: + """ + The User Interface sub-theme + ============================ + This can be accessed with theme.get(t), where t can be 'ui' or -1. + The available variables follow the internal (C coded) ThemeUI struct in + Blender. Most of them represent rgba (red, green, blue, alpha) colors, + with each component in the range [0, 255]. There is more than one way to + access them. + + Examples:: + print outline.R + outline.r = 180 # it's case insensitive + outline[0] = 94 # 0 for red, 1 for green, ... + outline = [200, 200, 200, 255] # setting all components at once + @type theme: string + @cvar theme: the parent Theme for this object. + @cvar outline: theme rgba var. + @cvar neutral: theme rgba var. + @cvar action: theme rgba var. + @cvar setting: theme rgba var. + @cvar setting1: theme rgba var. + @cvar setting2: theme rgba var. + @cvar num: theme rgba var. + @cvar textfield: theme rgba var. + @cvar popup: theme rgba var. + @cvar text: theme rgba var. + @cvar text_hi: theme rgba var. + @cvar menu_back: theme rgba var. + @cvar menu_item: theme rgba var. + @cvar menu_hilite: theme rgba var. + @cvar menu_text: theme rgba var. + @cvar menu_text_hi: theme rgba var. + @type drawType: int + @cvar drawType: the draw type (minimal, rounded, etc) in the range [1, 4]. + """ + + class ThemeSpace: + """ + The Space sub-themes + ==================== + There is a sub-theme for each space in Blender (except for the Scripts + window, but it will be added soon). Please read the information about + L{Theme.ThemeUI}, since it is also relevant here. In Blender, + all theme spaces share the same C structure. For this reason, all of + them here share the same variables, event though some spaces only use + a few of them. This lower-level access is acceptable because generally + users will prefer to use the interface to change single theme options + and only use scripting to save or restore themes. But anyway, checking + the Themes tab in the User Preferences space in Blender and using the + bundled "Save current theme" script (or its simplified version written + on the top of this page) can help you finding out any specific info you + may need. + @type theme: string + @cvar theme: the parent Theme for this object. + @cvar back: theme rgba var. + @cvar text: theme rgba var. + @cvar text_hi: theme rgba var. + @cvar header: theme rgba var. + @cvar panel: theme rgba var. + @cvar shade1: theme rgba var. + @cvar shade2: theme rgba var. + @cvar hilite: theme rgba var. + @cvar grid: theme rgba var. + @cvar wire: theme rgba var. + @cvar select: theme rgba var. + @cvar active: theme rgba var. + @cvar transform: theme rgba var. + @cvar vertex: theme rgba var. + @cvar vertex_select: theme rgba var. + @cvar edge: theme rgba var. + @cvar edge_select: theme rgba var. + @cvar edge_seam: theme rgba var. + @cvar edge_facesel: theme rgba var. + @cvar face: theme rgba var. + @cvar face_select: theme rgba var. + @cvar normal: theme rgba var. + @type vertex_size: int + @cvar vertex_size: size of the vertices dots on screen in the range [1, 10]. + """ + diff --git a/source/blender/python/api2_2x/doc/Window.py b/source/blender/python/api2_2x/doc/Window.py index 9cc17a26a2e5e85b12f899ddd09d837f3cc5227c..60f1396dbce845c4900bd83e6c60759eab9f428e 100644 --- a/source/blender/python/api2_2x/doc/Window.py +++ b/source/blender/python/api2_2x/doc/Window.py @@ -8,7 +8,7 @@ Window This module provides access to B{Window} functions in Blender. -B{New}: many new functions related to screens and events. +B{New}: L{GetPerspMatrix}. Example: -------- @@ -81,6 +81,12 @@ DrawProgressBar:: - LSHIFT - RSHIFT - SHIFT + +@type MButs: readonly dictionary +@var MButs: Mouse buttons. + - L: left mouse button + - M: middle mouse button + - R: right mouse button """ def Redraw (spacetype = '<Types.VIEW3D>'): @@ -201,6 +207,13 @@ def GetViewMatrix (): @return: the current matrix. """ +def GetPerspMatrix (): + """ + Get the current 3d perspective matrix. + @rtype: 4x4 float matrix + @return: the current matrix. + """ + def EditMode(enable = -1, undo_msg = 'From script'): """ Get and optionally set the current edit mode status: in or out. @@ -358,7 +371,7 @@ def SetMouseCoords (coords): def GetMouseButtons (): """ - Get the current mouse button state (compare with events from L{Draw}). + Get the current mouse button state (see / compare against L{MButs}). @rtype: int @return: an or'ed flag with the currently pressed buttons. """ diff --git a/source/blender/python/api2_2x/doc/World.py b/source/blender/python/api2_2x/doc/World.py index a8d10ce7073acf88eb730a70d4d9bf4d49e3dbe6..cd2edd922ebe345223287e5a7f6a0369c56299de 100644 --- a/source/blender/python/api2_2x/doc/World.py +++ b/source/blender/python/api2_2x/doc/World.py @@ -3,7 +3,7 @@ """ The Blender.World submodule -B{New}: scriptLink methods: L{World.getScriptLinks}, ... +B{New}: L{GetCurrent}, L{World.setCurrent}. INTRODUCTION ============ @@ -44,7 +44,7 @@ def New (name): @type name: string @param name: World's name (optionnal). @rtype: Blender World - @return: The created World. If the "name" paraeter has not been provided, it will be automatically be set by blender. + @return: The created World. If the "name" parameter has not been provided, it will be automatically be set by blender. """ def Get (name): @@ -59,7 +59,7 @@ def Get (name): """ -def GetActive (): +def GetCurrent (): """ Get the active world of the scene. @rtype: Blender World or None @@ -315,7 +315,7 @@ class World: @param event: "FrameChanged" or "Redraw". """ - def makeActive (): + def setCurrent (): """ Make this world active in the current scene. @rtype: PyNone diff --git a/source/blender/python/api2_2x/windowTheme.c b/source/blender/python/api2_2x/windowTheme.c index 3bd7ac1a1c7d08146544ae3becdf34fce7ebfe91..0cb3c08cb10b19d52539781fe81fa182d680450d 100644 --- a/source/blender/python/api2_2x/windowTheme.c +++ b/source/blender/python/api2_2x/windowTheme.c @@ -67,8 +67,12 @@ static PyObject *M_Theme_Get( PyObject * self, PyObject * args ); static char M_Theme_doc[] = "The Blender Theme module\n\n\ This module provides access to UI Theme data in Blender"; -static char M_Theme_New_doc[] = "Theme.New (name = 'New Theme'):\n\ - Return a new Theme Data object with the given type and name."; +static char M_Theme_New_doc[] = "Theme.New (name = 'New Theme',\ +theme = <default>):\n\ + Return a new Theme Data object.\n\ +(name) - string: the Theme's name, it defaults to 'New Theme';\n\ +(theme) - bpy Theme: a base Theme to copy all data from, it defaults to the\n\ +current one."; static char M_Theme_Get_doc[] = "Theme.Get (name = None):\n\ Return the theme data with the given 'name', None if not found, or\n\ diff --git a/source/blender/src/space.c b/source/blender/src/space.c index c53649c0f376f94d10a35b1a63bac869cdc88c82..58027003a9ccbc904568b28c60b0b021b1fc8375 100644 --- a/source/blender/src/space.c +++ b/source/blender/src/space.c @@ -473,7 +473,7 @@ void start_game(void) /* Restart BPY - unload the game engine modules. */ BPY_end_python(); - BPY_start_python(); + BPY_start_python(0, NULL); /* argc, argv stored there already */ BPY_post_start_python(); /* userpref path and menus init */ restore_all_scene_cfra(scene_cfra_store); diff --git a/source/creator/creator.c b/source/creator/creator.c index baf18468b12c9782e52c79b5e5d71ad110b459c1..51340b49a5c425188862c3fa3e5b0e609b6d0a1f 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -440,7 +440,7 @@ int main(int argc, char **argv) } } - BPY_start_python(); + BPY_start_python(argc, argv); /** * NOTE: sound_init_audio() *must be* after start_python, @@ -452,7 +452,7 @@ int main(int argc, char **argv) } else { - BPY_start_python(); + BPY_start_python(argc, argv); // (ton) Commented out. I have no idea whats thisfor... will mail around! // SYS_WriteCommandLineInt(syshandle,"noaudio",1);