- Blender.Window: added function GetPerspMatrix() (Tom Musgrave's patch, thanks);
- added Chris Want's patch to tell argc, argv to the Python interpreter (thanks, Hos);
- Blender.Image: added image.glFree() to free textures bound by the recently added
  image.glLoad() (both suggested by Campbell Barton -- thanks, with these Blender can
  be used to load textures for scripts);
- Blender.Sound: removed for now at least a few get/set methods of vars that can't be
  accessed via interface;
- renamed Get/makeActive to Get/setCurrent in Blender.World (actually added alias for
  now), same in Blender.Sound: renamed makeActive to setCurrent.  Stephen Swaney
  pointed this some weeks ago, we should stick to one naming convention.
- added documentation for Sound and Window.Theme modules and the other added
  functions, made other small updates.
- Blender.Object: made 'worldspace' become the default output of .getMatrix and .mat/.matrix:
  after reading a discussion on blender.org's Python forum where eeshlo mentioned the
  pre 2.34 default was worldspace, I took a better look at Blender's relevant code,
  confirmed, talked to Theeth about this and as he suggested am changing the default
  back to 'worldspace'.
This commit is contained in:
Willian Padovani Germano 2004-10-20 05:51:24 +00:00
parent f2f004af2d
commit fa9135385a
18 changed files with 535 additions and 101 deletions

@ -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 );

@ -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 );
}
}

@ -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;

@ -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" ) ) );

@ -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 */

@ -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;
}

@ -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 */

@ -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.

@ -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}
"""

@ -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.

@ -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

@ -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].
"""

@ -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].
"""

@ -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.
"""

@ -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

@ -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\

@ -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);

@ -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);