2011-02-23 10:52:22 +00:00
/*
2010-09-04 19:06:15 +00:00
* $ Id $
*
* * * * * * BEGIN GPL LICENSE BLOCK * * * * *
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software Foundation ,
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
*
* The Original Code is Copyright ( C ) 2001 - 2002 by NaN Holding BV .
* All rights reserved .
*
* The Original Code is : all of this file .
*
* Contributor ( s ) : none yet .
*
* * * * * * END GPL LICENSE BLOCK * * * * *
* Initialize Python thingies .
*/
2011-02-25 13:35:59 +00:00
/** \file gameengine/Ketsji/KX_PythonInit.cpp
* \ ingroup ketsji
*/
2010-09-04 19:06:15 +00:00
# include "GL/glew.h"
2010-09-15 16:13:32 +00:00
# if defined(WIN32) && !defined(FREE_WINDOWS)
2010-09-04 19:06:15 +00:00
# pragma warning (disable : 4786)
# endif //WIN32
2010-10-31 04:11:39 +00:00
# ifdef WITH_PYTHON
2009-09-29 21:42:40 +00:00
2010-10-27 06:05:22 +00:00
# ifdef _POSIX_C_SOURCE
# undef _POSIX_C_SOURCE
# endif
# ifdef _XOPEN_SOURCE
# undef _XOPEN_SOURCE
# endif
# include <Python.h>
2010-09-04 19:06:15 +00:00
extern " C " {
# include "bpy_internal_import.h" /* from the blender python api, but we want to import text too! */
2010-09-18 19:38:27 +00:00
# include "py_capi_utils.h"
2010-09-04 19:06:15 +00:00
# include "mathutils.h" // Blender.Mathutils module copied here so the blenderlayer can use.
# include "bgl.h"
2010-12-09 17:31:42 +00:00
# include "blf_py_api.h"
2010-09-04 19:06:15 +00:00
# include "marshal.h" /* python header for loading/saving dicts */
}
# include "AUD_PyInit.h"
# endif
# include "KX_PythonInit.h"
// directory header for py function getBlendFileList
# ifndef WIN32
# include <dirent.h>
# include <stdlib.h>
# else
# include <io.h>
# include "BLI_winstuff.h"
# endif
//python physics binding
# include "KX_PyConstraintBinding.h"
# include "KX_KetsjiEngine.h"
# include "KX_RadarSensor.h"
# include "KX_RaySensor.h"
# include "KX_ArmatureSensor.h"
# include "KX_SceneActuator.h"
# include "KX_GameActuator.h"
# include "KX_ParentActuator.h"
# include "KX_SCA_DynamicActuator.h"
# include "SCA_IInputDevice.h"
# include "SCA_PropertySensor.h"
# include "SCA_RandomActuator.h"
# include "SCA_KeyboardSensor.h" /* IsPrintable, ToCharacter */
# include "SCA_PythonKeyboard.h"
# include "SCA_PythonMouse.h"
# include "KX_ConstraintActuator.h"
# include "KX_IpoActuator.h"
# include "KX_SoundActuator.h"
# include "KX_StateActuator.h"
# include "BL_ActionActuator.h"
# include "BL_ArmatureObject.h"
# include "RAS_IRasterizer.h"
# include "RAS_ICanvas.h"
# include "RAS_BucketManager.h"
# include "RAS_2DFilterManager.h"
# include "MT_Vector3.h"
# include "MT_Point3.h"
# include "ListValue.h"
# include "InputParser.h"
# include "KX_Scene.h"
# include "NG_NetworkScene.h" //Needed for sendMessage()
# include "BL_Shader.h"
# include "KX_PyMath.h"
# include "PyObjectPlus.h"
# include "KX_PythonInitTypes.h"
/* we only need this to get a list of libraries from the main struct */
# include "DNA_ID.h"
# include "DNA_scene_types.h"
# include "PHY_IPhysicsEnvironment.h"
# include "BKE_main.h"
# include "BKE_utildefines.h"
# include "BKE_global.h"
# include "BLI_blenlib.h"
# include "GPU_material.h"
# include "MEM_guardedalloc.h"
/* for converting new scenes */
# include "KX_BlenderSceneConverter.h"
# include "KX_MeshProxy.h" /* for creating a new library of mesh objects */
extern " C " {
# include "BKE_idcode.h"
}
# include "NG_NetworkScene.h" //Needed for sendMessage()
// 'local' copy of canvas ptr, for window height/width python scripts
2010-10-31 04:11:39 +00:00
# ifdef WITH_PYTHON
2010-09-04 19:06:15 +00:00
static RAS_ICanvas * gp_Canvas = NULL ;
static char gp_GamePythonPath [ FILE_MAXDIR + FILE_MAXFILE ] = " " ;
static char gp_GamePythonPathOrig [ FILE_MAXDIR + FILE_MAXFILE ] = " " ; // not super happy about this, but we need to remember the first loaded file for the global/dict load save
2010-10-10 20:59:30 +00:00
static SCA_PythonKeyboard * gp_PythonKeyboard = NULL ;
static SCA_PythonMouse * gp_PythonMouse = NULL ;
2010-10-31 04:11:39 +00:00
# endif // WITH_PYTHON
2010-09-04 19:06:15 +00:00
static KX_Scene * gp_KetsjiScene = NULL ;
static KX_KetsjiEngine * gp_KetsjiEngine = NULL ;
static RAS_IRasterizer * gp_Rasterizer = NULL ;
2002-10-12 11:37:38 +00:00
2010-09-04 19:06:15 +00:00
void KX_SetActiveScene ( class KX_Scene * scene )
{
gp_KetsjiScene = scene ;
}
class KX_Scene * KX_GetActiveScene ( )
{
return gp_KetsjiScene ;
}
class KX_KetsjiEngine * KX_GetActiveEngine ( )
{
return gp_KetsjiEngine ;
}
/* why is this in python? */
void KX_RasterizerDrawDebugLine ( const MT_Vector3 & from , const MT_Vector3 & to , const MT_Vector3 & color )
{
if ( gp_Rasterizer )
gp_Rasterizer - > DrawDebugLine ( from , to , color ) ;
}
2010-10-31 04:11:39 +00:00
# ifdef WITH_PYTHON
2010-09-04 19:06:15 +00:00
static PyObject * gp_OrigPythonSysPath = NULL ;
static PyObject * gp_OrigPythonSysModules = NULL ;
/* Macro for building the keyboard translation */
//#define KX_MACRO_addToDict(dict, name) PyDict_SetItemString(dict, #name, PyLong_FromSsize_t(SCA_IInputDevice::KX_##name))
# define KX_MACRO_addToDict(dict, name) PyDict_SetItemString(dict, #name, item=PyLong_FromSsize_t(name)); Py_DECREF(item)
/* For the defines for types from logic bricks, we do stuff explicitly... */
# define KX_MACRO_addTypesToDict(dict, name, name2) PyDict_SetItemString(dict, #name, item=PyLong_FromSsize_t(name2)); Py_DECREF(item)
// temporarily python stuff, will be put in another place later !
# include "KX_Python.h"
# include "SCA_PythonController.h"
// List of methods defined in the module
static PyObject * ErrorObject ;
static const char * gPyGetRandomFloat_doc = " getRandomFloat returns a random floating point value in the range [0..1] " ;
static PyObject * gPyGetRandomFloat ( PyObject * )
{
return PyFloat_FromDouble ( MT_random ( ) ) ;
}
static PyObject * gPySetGravity ( PyObject * , PyObject * value )
{
MT_Vector3 vec ;
if ( ! PyVecTo ( value , vec ) )
return NULL ;
if ( gp_KetsjiScene )
gp_KetsjiScene - > SetGravity ( vec ) ;
Py_RETURN_NONE ;
}
static char gPyExpandPath_doc [ ] =
" (path) - Converts a blender internal path into a proper file system path. \n \
path - the string path to convert . \ n \ n \
Use / as directory separator in path \ n \
You can use ' / / ' at the start of the string to define a relative path ; \ n \
Blender replaces that string by the directory of the startup . blend or runtime \ n \
file to make a full path name ( doesn ' t change during the game , even if you load \ n \
other . blend ) . \ n \
The function also converts the directory separator to the local file system format . " ;
static PyObject * gPyExpandPath ( PyObject * , PyObject * args )
{
char expanded [ FILE_MAXDIR + FILE_MAXFILE ] ;
char * filename ;
if ( ! PyArg_ParseTuple ( args , " s:ExpandPath " , & filename ) )
return NULL ;
BLI_strncpy ( expanded , filename , FILE_MAXDIR + FILE_MAXFILE ) ;
BLI_path_abs ( expanded , gp_GamePythonPath ) ;
2011-01-06 05:04:07 +00:00
return PyUnicode_DecodeFSDefault ( expanded ) ;
2010-09-04 19:06:15 +00:00
}
static char gPyStartGame_doc [ ] =
" startGame(blend) \n \
Loads the blend file " ;
static PyObject * gPyStartGame ( PyObject * , PyObject * args )
{
char * blendfile ;
if ( ! PyArg_ParseTuple ( args , " s:startGame " , & blendfile ) )
return NULL ;
gp_KetsjiEngine - > RequestExit ( KX_EXIT_REQUEST_START_OTHER_GAME ) ;
gp_KetsjiEngine - > SetNameNextGame ( blendfile ) ;
Py_RETURN_NONE ;
}
static char gPyEndGame_doc [ ] =
" endGame() \n \
Ends the current game " ;
static PyObject * gPyEndGame ( PyObject * )
{
gp_KetsjiEngine - > RequestExit ( KX_EXIT_REQUEST_QUIT_GAME ) ;
//printf("%s\n", gp_GamePythonPath);
Py_RETURN_NONE ;
}
static char gPyRestartGame_doc [ ] =
" restartGame() \n \
Restarts the current game by reloading the . blend file " ;
static PyObject * gPyRestartGame ( PyObject * )
{
gp_KetsjiEngine - > RequestExit ( KX_EXIT_REQUEST_RESTART_GAME ) ;
gp_KetsjiEngine - > SetNameNextGame ( gp_GamePythonPath ) ;
Py_RETURN_NONE ;
}
static char gPySaveGlobalDict_doc [ ] =
" saveGlobalDict() \n "
" Saves bge.logic.globalDict to a file " ;
static PyObject * gPySaveGlobalDict ( PyObject * )
{
char marshal_path [ 512 ] ;
char * marshal_buffer = NULL ;
unsigned int marshal_length ;
FILE * fp = NULL ;
pathGamePythonConfig ( marshal_path ) ;
marshal_length = saveGamePythonConfig ( & marshal_buffer ) ;
if ( marshal_length & & marshal_buffer )
{
fp = fopen ( marshal_path , " wb " ) ;
if ( fp )
{
if ( fwrite ( marshal_buffer , 1 , marshal_length , fp ) ! = marshal_length )
printf ( " Warning: could not write marshal data \n " ) ;
fclose ( fp ) ;
} else {
printf ( " Warning: could not open marshal file \n " ) ;
}
} else {
printf ( " Warning: could not create marshal buffer \n " ) ;
}
if ( marshal_buffer )
delete [ ] marshal_buffer ;
Py_RETURN_NONE ;
}
static char gPyLoadGlobalDict_doc [ ] =
" LoadGlobalDict() \n "
" Loads bge.logic.globalDict from a file " ;
static PyObject * gPyLoadGlobalDict ( PyObject * )
{
char marshal_path [ 512 ] ;
char * marshal_buffer = NULL ;
unsigned int marshal_length ;
FILE * fp = NULL ;
int result ;
pathGamePythonConfig ( marshal_path ) ;
fp = fopen ( marshal_path , " rb " ) ;
if ( fp ) {
// obtain file size:
fseek ( fp , 0 , SEEK_END ) ;
marshal_length = ftell ( fp ) ;
rewind ( fp ) ;
marshal_buffer = ( char * ) malloc ( sizeof ( char ) * marshal_length ) ;
result = fread ( marshal_buffer , 1 , marshal_length , fp ) ;
if ( result = = marshal_length ) {
loadGamePythonConfig ( marshal_buffer , marshal_length ) ;
} else {
printf ( " Warning: could not read all of '%s' \n " , marshal_path ) ;
}
free ( marshal_buffer ) ;
fclose ( fp ) ;
} else {
printf ( " Warning: could not open '%s' \n " , marshal_path ) ;
}
Py_RETURN_NONE ;
}
static char gPySendMessage_doc [ ] =
" sendMessage(subject, [body, to, from]) \n \
sends a message in same manner as a message actuator \
subject = Subject of the message \
body = Message body \
to = Name of object to send the message to \
from = Name of object to send the string from " ;
static PyObject * gPySendMessage ( PyObject * , PyObject * args )
{
char * subject ;
char * body = ( char * ) " " ;
char * to = ( char * ) " " ;
char * from = ( char * ) " " ;
if ( ! PyArg_ParseTuple ( args , " s|sss:sendMessage " , & subject , & body , & to , & from ) )
return NULL ;
gp_KetsjiScene - > GetNetworkScene ( ) - > SendMessage ( to , from , subject , body ) ;
Py_RETURN_NONE ;
}
// this gets a pointer to an array filled with floats
static PyObject * gPyGetSpectrum ( PyObject * )
{
PyObject * resultlist = PyList_New ( 512 ) ;
for ( int index = 0 ; index < 512 ; index + + )
{
PyList_SET_ITEM ( resultlist , index , PyFloat_FromDouble ( 0.0 ) ) ;
}
return resultlist ;
}
static PyObject * gPySetLogicTicRate ( PyObject * , PyObject * args )
{
float ticrate ;
if ( ! PyArg_ParseTuple ( args , " f:setLogicTicRate " , & ticrate ) )
return NULL ;
KX_KetsjiEngine : : SetTicRate ( ticrate ) ;
Py_RETURN_NONE ;
}
static PyObject * gPyGetLogicTicRate ( PyObject * )
{
return PyFloat_FromDouble ( KX_KetsjiEngine : : GetTicRate ( ) ) ;
}
static PyObject * gPySetMaxLogicFrame ( PyObject * , PyObject * args )
{
int frame ;
if ( ! PyArg_ParseTuple ( args , " i:setMaxLogicFrame " , & frame ) )
return NULL ;
KX_KetsjiEngine : : SetMaxLogicFrame ( frame ) ;
Py_RETURN_NONE ;
}
static PyObject * gPyGetMaxLogicFrame ( PyObject * )
{
return PyLong_FromSsize_t ( KX_KetsjiEngine : : GetMaxLogicFrame ( ) ) ;
}
static PyObject * gPySetMaxPhysicsFrame ( PyObject * , PyObject * args )
{
int frame ;
if ( ! PyArg_ParseTuple ( args , " i:setMaxPhysicsFrame " , & frame ) )
return NULL ;
KX_KetsjiEngine : : SetMaxPhysicsFrame ( frame ) ;
Py_RETURN_NONE ;
}
static PyObject * gPyGetMaxPhysicsFrame ( PyObject * )
{
return PyLong_FromSsize_t ( KX_KetsjiEngine : : GetMaxPhysicsFrame ( ) ) ;
}
static PyObject * gPySetPhysicsTicRate ( PyObject * , PyObject * args )
{
float ticrate ;
if ( ! PyArg_ParseTuple ( args , " f:setPhysicsTicRate " , & ticrate ) )
return NULL ;
PHY_GetActiveEnvironment ( ) - > setFixedTimeStep ( true , ticrate ) ;
Py_RETURN_NONE ;
}
#if 0 // unused
static PyObject * gPySetPhysicsDebug ( PyObject * , PyObject * args )
{
int debugMode ;
if ( ! PyArg_ParseTuple ( args , " i:setPhysicsDebug " , & debugMode ) )
return NULL ;
PHY_GetActiveEnvironment ( ) - > setDebugMode ( debugMode ) ;
Py_RETURN_NONE ;
}
# endif
static PyObject * gPyGetPhysicsTicRate ( PyObject * )
{
return PyFloat_FromDouble ( PHY_GetActiveEnvironment ( ) - > getFixedTimeStep ( ) ) ;
}
static PyObject * gPyGetAverageFrameRate ( PyObject * )
{
return PyFloat_FromDouble ( KX_KetsjiEngine : : GetAverageFrameRate ( ) ) ;
}
static PyObject * gPyGetBlendFileList ( PyObject * , PyObject * args )
{
char cpath [ sizeof ( gp_GamePythonPath ) ] ;
char * searchpath = NULL ;
PyObject * list , * value ;
DIR * dp ;
struct dirent * dirp ;
if ( ! PyArg_ParseTuple ( args , " |s:getBlendFileList " , & searchpath ) )
return NULL ;
list = PyList_New ( 0 ) ;
if ( searchpath ) {
BLI_strncpy ( cpath , searchpath , FILE_MAXDIR + FILE_MAXFILE ) ;
BLI_path_abs ( cpath , gp_GamePythonPath ) ;
} else {
/* Get the dir only */
BLI_split_dirfile ( gp_GamePythonPath , cpath , NULL ) ;
}
if ( ( dp = opendir ( cpath ) ) = = NULL ) {
/* todo, show the errno, this shouldnt happen anyway if the blendfile is readable */
fprintf ( stderr , " Could not read directoty (%s) failed, code %d (%s) \n " , cpath , errno , strerror ( errno ) ) ;
return list ;
}
while ( ( dirp = readdir ( dp ) ) ! = NULL ) {
if ( BLI_testextensie ( dirp - > d_name , " .blend " ) ) {
2011-01-06 05:04:07 +00:00
value = PyUnicode_DecodeFSDefault ( dirp - > d_name ) ;
2010-09-04 19:06:15 +00:00
PyList_Append ( list , value ) ;
Py_DECREF ( value ) ;
}
}
closedir ( dp ) ;
return list ;
}
static char gPyAddScene_doc [ ] =
" addScene(name, [overlay]) \n \
adds a scene to the game engine \ n \
name = Name of the scene \ n \
overlay = Overlay or underlay " ;
static PyObject * gPyAddScene ( PyObject * , PyObject * args )
{
char * name ;
int overlay = 1 ;
if ( ! PyArg_ParseTuple ( args , " s|i:addScene " , & name , & overlay ) )
return NULL ;
gp_KetsjiEngine - > ConvertAndAddScene ( name , ( overlay ! = 0 ) ) ;
Py_RETURN_NONE ;
}
static const char * gPyGetCurrentScene_doc =
" getCurrentScene() \n "
" Gets a reference to the current scene. \n " ;
static PyObject * gPyGetCurrentScene ( PyObject * self )
{
return gp_KetsjiScene - > GetProxy ( ) ;
}
static const char * gPyGetSceneList_doc =
" getSceneList() \n "
" Return a list of converted scenes. \n " ;
static PyObject * gPyGetSceneList ( PyObject * self )
{
KX_KetsjiEngine * m_engine = KX_GetActiveEngine ( ) ;
PyObject * list ;
KX_SceneList * scenes = m_engine - > CurrentScenes ( ) ;
int numScenes = scenes - > size ( ) ;
int i ;
list = PyList_New ( numScenes ) ;
for ( i = 0 ; i < numScenes ; i + + )
{
KX_Scene * scene = scenes - > at ( i ) ;
PyList_SET_ITEM ( list , i , scene - > GetProxy ( ) ) ;
}
return list ;
}
static PyObject * pyPrintStats ( PyObject * , PyObject * , PyObject * )
{
gp_KetsjiScene - > GetSceneConverter ( ) - > PrintStats ( ) ;
Py_RETURN_NONE ;
}
static PyObject * pyPrintExt ( PyObject * , PyObject * , PyObject * )
{
# define pprint(x) std::cout << x << std::endl;
bool count = 0 ;
bool support = 0 ;
pprint ( " Supported Extensions... " ) ;
pprint ( " GL_ARB_shader_objects supported? " < < ( GLEW_ARB_shader_objects ? " yes. " : " no. " ) ) ;
count = 1 ;
support = GLEW_ARB_vertex_shader ;
pprint ( " GL_ARB_vertex_shader supported? " < < ( support ? " yes. " : " no. " ) ) ;
count = 1 ;
if ( support ) {
pprint ( " ----------Details---------- " ) ;
int max = 0 ;
glGetIntegerv ( GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB , ( GLint * ) & max ) ;
pprint ( " Max uniform components. " < < max ) ;
glGetIntegerv ( GL_MAX_VARYING_FLOATS_ARB , ( GLint * ) & max ) ;
pprint ( " Max varying floats. " < < max ) ;
glGetIntegerv ( GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB , ( GLint * ) & max ) ;
pprint ( " Max vertex texture units. " < < max ) ;
glGetIntegerv ( GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB , ( GLint * ) & max ) ;
pprint ( " Max combined texture units. " < < max ) ;
pprint ( " " ) ;
}
support = GLEW_ARB_fragment_shader ;
pprint ( " GL_ARB_fragment_shader supported? " < < ( support ? " yes. " : " no. " ) ) ;
count = 1 ;
if ( support ) {
pprint ( " ----------Details---------- " ) ;
int max = 0 ;
glGetIntegerv ( GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB , ( GLint * ) & max ) ;
pprint ( " Max uniform components. " < < max ) ;
pprint ( " " ) ;
}
support = GLEW_ARB_texture_cube_map ;
pprint ( " GL_ARB_texture_cube_map supported? " < < ( support ? " yes. " : " no. " ) ) ;
count = 1 ;
if ( support ) {
pprint ( " ----------Details---------- " ) ;
int size = 0 ;
glGetIntegerv ( GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB , ( GLint * ) & size ) ;
pprint ( " Max cubemap size. " < < size ) ;
pprint ( " " ) ;
}
support = GLEW_ARB_multitexture ;
count = 1 ;
pprint ( " GL_ARB_multitexture supported? " < < ( support ? " yes. " : " no. " ) ) ;
if ( support ) {
pprint ( " ----------Details---------- " ) ;
int units = 0 ;
glGetIntegerv ( GL_MAX_TEXTURE_UNITS_ARB , ( GLint * ) & units ) ;
pprint ( " Max texture units available. " < < units ) ;
pprint ( " " ) ;
}
pprint ( " GL_ARB_texture_env_combine supported? " < < ( GLEW_ARB_texture_env_combine ? " yes. " : " no. " ) ) ;
count = 1 ;
if ( ! count )
pprint ( " No extenstions are used in this build " ) ;
Py_RETURN_NONE ;
}
static PyObject * gLibLoad ( PyObject * , PyObject * args )
{
KX_Scene * kx_scene = gp_KetsjiScene ;
char * path ;
char * group ;
Py_buffer py_buffer ;
py_buffer . buf = NULL ;
char * err_str = NULL ;
if ( ! PyArg_ParseTuple ( args , " ss|y*:LibLoad " , & path , & group , & py_buffer ) )
return NULL ;
if ( ! py_buffer . buf )
{
if ( kx_scene - > GetSceneConverter ( ) - > LinkBlendFilePath ( path , group , kx_scene , & err_str ) ) {
Py_RETURN_TRUE ;
}
}
else
{
if ( kx_scene - > GetSceneConverter ( ) - > LinkBlendFileMemory ( py_buffer . buf , py_buffer . len , path , group , kx_scene , & err_str ) ) {
PyBuffer_Release ( & py_buffer ) ;
Py_RETURN_TRUE ;
}
PyBuffer_Release ( & py_buffer ) ;
}
if ( err_str ) {
PyErr_SetString ( PyExc_ValueError , err_str ) ;
return NULL ;
}
Py_RETURN_FALSE ;
}
static PyObject * gLibNew ( PyObject * , PyObject * args )
{
KX_Scene * kx_scene = gp_KetsjiScene ;
char * path ;
char * group ;
char * name ;
PyObject * names ;
int idcode ;
if ( ! PyArg_ParseTuple ( args , " ssO!:LibNew " , & path , & group , & PyList_Type , & names ) )
return NULL ;
if ( kx_scene - > GetSceneConverter ( ) - > GetMainDynamicPath ( path ) )
{
PyErr_SetString ( PyExc_KeyError , " the name of the path given exists " ) ;
return NULL ;
}
idcode = BKE_idcode_from_name ( group ) ;
if ( idcode = = 0 ) {
PyErr_Format ( PyExc_ValueError , " invalid group given \" %s \" " , group ) ;
return NULL ;
}
Main * maggie = ( Main * ) MEM_callocN ( sizeof ( Main ) , " BgeMain " ) ;
kx_scene - > GetSceneConverter ( ) - > GetMainDynamic ( ) . push_back ( maggie ) ;
strncpy ( maggie - > name , path , sizeof ( maggie - > name ) - 1 ) ;
/* Copy the object into main */
if ( idcode = = ID_ME ) {
PyObject * ret = PyList_New ( 0 ) ;
PyObject * item ;
for ( int i = 0 ; i < PyList_GET_SIZE ( names ) ; i + + ) {
name = _PyUnicode_AsString ( PyList_GET_ITEM ( names , i ) ) ;
if ( name ) {
RAS_MeshObject * meshobj = kx_scene - > GetSceneConverter ( ) - > ConvertMeshSpecial ( kx_scene , maggie , name ) ;
if ( meshobj ) {
KX_MeshProxy * meshproxy = new KX_MeshProxy ( meshobj ) ;
item = meshproxy - > NewProxy ( true ) ;
PyList_Append ( ret , item ) ;
Py_DECREF ( item ) ;
}
}
else {
PyErr_Clear ( ) ; /* wasnt a string, ignore for now */
}
}
return ret ;
}
else {
PyErr_Format ( PyExc_ValueError , " only \" Mesh \" group currently supported " ) ;
return NULL ;
}
Py_RETURN_NONE ;
}
static PyObject * gLibFree ( PyObject * , PyObject * args )
{
KX_Scene * kx_scene = gp_KetsjiScene ;
char * path ;
if ( ! PyArg_ParseTuple ( args , " s:LibFree " , & path ) )
return NULL ;
if ( kx_scene - > GetSceneConverter ( ) - > FreeBlendFile ( path ) )
{
Py_RETURN_TRUE ;
}
else {
Py_RETURN_FALSE ;
}
}
static PyObject * gLibList ( PyObject * , PyObject * args )
{
vector < Main * > & dynMaggie = gp_KetsjiScene - > GetSceneConverter ( ) - > GetMainDynamic ( ) ;
int i = 0 ;
PyObject * list = PyList_New ( dynMaggie . size ( ) ) ;
for ( vector < Main * > : : iterator it = dynMaggie . begin ( ) ; ! ( it = = dynMaggie . end ( ) ) ; it + + )
{
PyList_SET_ITEM ( list , i + + , PyUnicode_FromString ( ( * it ) - > name ) ) ;
}
return list ;
}
static struct PyMethodDef game_methods [ ] = {
{ " expandPath " , ( PyCFunction ) gPyExpandPath , METH_VARARGS , ( const char * ) gPyExpandPath_doc } ,
{ " startGame " , ( PyCFunction ) gPyStartGame , METH_VARARGS , ( const char * ) gPyStartGame_doc } ,
{ " endGame " , ( PyCFunction ) gPyEndGame , METH_NOARGS , ( const char * ) gPyEndGame_doc } ,
{ " restartGame " , ( PyCFunction ) gPyRestartGame , METH_NOARGS , ( const char * ) gPyRestartGame_doc } ,
{ " saveGlobalDict " , ( PyCFunction ) gPySaveGlobalDict , METH_NOARGS , ( const char * ) gPySaveGlobalDict_doc } ,
{ " loadGlobalDict " , ( PyCFunction ) gPyLoadGlobalDict , METH_NOARGS , ( const char * ) gPyLoadGlobalDict_doc } ,
{ " sendMessage " , ( PyCFunction ) gPySendMessage , METH_VARARGS , ( const char * ) gPySendMessage_doc } ,
{ " getCurrentController " , ( PyCFunction ) SCA_PythonController : : sPyGetCurrentController , METH_NOARGS , SCA_PythonController : : sPyGetCurrentController__doc__ } ,
{ " getCurrentScene " , ( PyCFunction ) gPyGetCurrentScene , METH_NOARGS , gPyGetCurrentScene_doc } ,
{ " getSceneList " , ( PyCFunction ) gPyGetSceneList , METH_NOARGS , ( const char * ) gPyGetSceneList_doc } ,
{ " addScene " , ( PyCFunction ) gPyAddScene , METH_VARARGS , ( const char * ) gPyAddScene_doc } ,
{ " getRandomFloat " , ( PyCFunction ) gPyGetRandomFloat , METH_NOARGS , ( const char * ) gPyGetRandomFloat_doc } ,
{ " setGravity " , ( PyCFunction ) gPySetGravity , METH_O , ( const char * ) " set Gravitation " } ,
{ " getSpectrum " , ( PyCFunction ) gPyGetSpectrum , METH_NOARGS , ( const char * ) " get audio spectrum " } ,
{ " getMaxLogicFrame " , ( PyCFunction ) gPyGetMaxLogicFrame , METH_NOARGS , ( const char * ) " Gets the max number of logic frame per render frame " } ,
{ " setMaxLogicFrame " , ( PyCFunction ) gPySetMaxLogicFrame , METH_VARARGS , ( const char * ) " Sets the max number of logic frame per render frame " } ,
{ " getMaxPhysicsFrame " , ( PyCFunction ) gPyGetMaxPhysicsFrame , METH_NOARGS , ( const char * ) " Gets the max number of physics frame per render frame " } ,
{ " setMaxPhysicsFrame " , ( PyCFunction ) gPySetMaxPhysicsFrame , METH_VARARGS , ( const char * ) " Sets the max number of physics farme per render frame " } ,
{ " getLogicTicRate " , ( PyCFunction ) gPyGetLogicTicRate , METH_NOARGS , ( const char * ) " Gets the logic tic rate " } ,
{ " setLogicTicRate " , ( PyCFunction ) gPySetLogicTicRate , METH_VARARGS , ( const char * ) " Sets the logic tic rate " } ,
{ " getPhysicsTicRate " , ( PyCFunction ) gPyGetPhysicsTicRate , METH_NOARGS , ( const char * ) " Gets the physics tic rate " } ,
{ " setPhysicsTicRate " , ( PyCFunction ) gPySetPhysicsTicRate , METH_VARARGS , ( const char * ) " Sets the physics tic rate " } ,
{ " getAverageFrameRate " , ( PyCFunction ) gPyGetAverageFrameRate , METH_NOARGS , ( const char * ) " Gets the estimated average frame rate " } ,
{ " getBlendFileList " , ( PyCFunction ) gPyGetBlendFileList , METH_VARARGS , ( const char * ) " Gets a list of blend files in the same directory as the current blend file " } ,
{ " PrintGLInfo " , ( PyCFunction ) pyPrintExt , METH_NOARGS , ( const char * ) " Prints GL Extension Info " } ,
{ " PrintMemInfo " , ( PyCFunction ) pyPrintStats , METH_NOARGS , ( const char * ) " Print engine stastics " } ,
/* library functions */
{ " LibLoad " , ( PyCFunction ) gLibLoad , METH_VARARGS , ( const char * ) " " } ,
{ " LibNew " , ( PyCFunction ) gLibNew , METH_VARARGS , ( const char * ) " " } ,
{ " LibFree " , ( PyCFunction ) gLibFree , METH_VARARGS , ( const char * ) " " } ,
{ " LibList " , ( PyCFunction ) gLibList , METH_VARARGS , ( const char * ) " " } ,
{ NULL , ( PyCFunction ) NULL , 0 , NULL }
} ;
static PyObject * gPyGetWindowHeight ( PyObject * , PyObject * args )
{
return PyLong_FromSsize_t ( ( gp_Canvas ? gp_Canvas - > GetHeight ( ) : 0 ) ) ;
}
static PyObject * gPyGetWindowWidth ( PyObject * , PyObject * args )
{
return PyLong_FromSsize_t ( ( gp_Canvas ? gp_Canvas - > GetWidth ( ) : 0 ) ) ;
}
// temporarility visibility thing, will be moved to rasterizer/renderer later
bool gUseVisibilityTemp = false ;
static PyObject * gPyEnableVisibility ( PyObject * , PyObject * args )
{
int visible ;
if ( ! PyArg_ParseTuple ( args , " i:enableVisibility " , & visible ) )
return NULL ;
gUseVisibilityTemp = ( visible ! = 0 ) ;
Py_RETURN_NONE ;
}
static PyObject * gPyShowMouse ( PyObject * , PyObject * args )
{
int visible ;
if ( ! PyArg_ParseTuple ( args , " i:showMouse " , & visible ) )
return NULL ;
if ( visible )
{
if ( gp_Canvas )
gp_Canvas - > SetMouseState ( RAS_ICanvas : : MOUSE_NORMAL ) ;
} else
{
if ( gp_Canvas )
gp_Canvas - > SetMouseState ( RAS_ICanvas : : MOUSE_INVISIBLE ) ;
}
Py_RETURN_NONE ;
}
static PyObject * gPySetMousePosition ( PyObject * , PyObject * args )
{
int x , y ;
if ( ! PyArg_ParseTuple ( args , " ii:setMousePosition " , & x , & y ) )
return NULL ;
if ( gp_Canvas )
gp_Canvas - > SetMousePosition ( x , y ) ;
Py_RETURN_NONE ;
}
static PyObject * gPySetEyeSeparation ( PyObject * , PyObject * args )
{
float sep ;
if ( ! PyArg_ParseTuple ( args , " f:setEyeSeparation " , & sep ) )
return NULL ;
if ( ! gp_Rasterizer ) {
PyErr_SetString ( PyExc_RuntimeError , " Rasterizer.setEyeSeparation(float), Rasterizer not available " ) ;
return NULL ;
}
gp_Rasterizer - > SetEyeSeparation ( sep ) ;
Py_RETURN_NONE ;
}
static PyObject * gPyGetEyeSeparation ( PyObject * )
{
if ( ! gp_Rasterizer ) {
PyErr_SetString ( PyExc_RuntimeError , " Rasterizer.getEyeSeparation(), Rasterizer not available " ) ;
return NULL ;
}
return PyFloat_FromDouble ( gp_Rasterizer - > GetEyeSeparation ( ) ) ;
}
static PyObject * gPySetFocalLength ( PyObject * , PyObject * args )
{
float focus ;
if ( ! PyArg_ParseTuple ( args , " f:setFocalLength " , & focus ) )
return NULL ;
if ( ! gp_Rasterizer ) {
PyErr_SetString ( PyExc_RuntimeError , " Rasterizer.setFocalLength(float), Rasterizer not available " ) ;
return NULL ;
}
gp_Rasterizer - > SetFocalLength ( focus ) ;
Py_RETURN_NONE ;
}
static PyObject * gPyGetFocalLength ( PyObject * , PyObject * , PyObject * )
{
if ( ! gp_Rasterizer ) {
PyErr_SetString ( PyExc_RuntimeError , " Rasterizer.getFocalLength(), Rasterizer not available " ) ;
return NULL ;
}
return PyFloat_FromDouble ( gp_Rasterizer - > GetFocalLength ( ) ) ;
Py_RETURN_NONE ;
}
static PyObject * gPySetBackgroundColor ( PyObject * , PyObject * value )
{
MT_Vector4 vec ;
if ( ! PyVecTo ( value , vec ) )
return NULL ;
if ( gp_Canvas )
{
gp_Rasterizer - > SetBackColor ( vec [ 0 ] , vec [ 1 ] , vec [ 2 ] , vec [ 3 ] ) ;
}
2011-01-18 22:27:18 +00:00
KX_WorldInfo * wi = gp_KetsjiScene - > GetWorldInfo ( ) ;
if ( wi - > hasWorld ( ) )
wi - > setBackColor ( vec [ 0 ] , vec [ 1 ] , vec [ 2 ] ) ;
2010-09-04 19:06:15 +00:00
Py_RETURN_NONE ;
}
static PyObject * gPySetMistColor ( PyObject * , PyObject * value )
{
MT_Vector3 vec ;
if ( ! PyVecTo ( value , vec ) )
return NULL ;
if ( ! gp_Rasterizer ) {
PyErr_SetString ( PyExc_RuntimeError , " Rasterizer.setMistColor(color), Rasterizer not available " ) ;
return NULL ;
}
gp_Rasterizer - > SetFogColor ( vec [ 0 ] , vec [ 1 ] , vec [ 2 ] ) ;
Py_RETURN_NONE ;
}
static PyObject * gPyDisableMist ( PyObject * )
{
if ( ! gp_Rasterizer ) {
PyErr_SetString ( PyExc_RuntimeError , " Rasterizer.setMistColor(color), Rasterizer not available " ) ;
return NULL ;
}
gp_Rasterizer - > DisableFog ( ) ;
Py_RETURN_NONE ;
}
static PyObject * gPySetMistStart ( PyObject * , PyObject * args )
{
float miststart ;
if ( ! PyArg_ParseTuple ( args , " f:setMistStart " , & miststart ) )
return NULL ;
if ( ! gp_Rasterizer ) {
PyErr_SetString ( PyExc_RuntimeError , " Rasterizer.setMistStart(float), Rasterizer not available " ) ;
return NULL ;
}
gp_Rasterizer - > SetFogStart ( miststart ) ;
Py_RETURN_NONE ;
}
static PyObject * gPySetMistEnd ( PyObject * , PyObject * args )
{
float mistend ;
if ( ! PyArg_ParseTuple ( args , " f:setMistEnd " , & mistend ) )
return NULL ;
if ( ! gp_Rasterizer ) {
PyErr_SetString ( PyExc_RuntimeError , " Rasterizer.setMistEnd(float), Rasterizer not available " ) ;
return NULL ;
}
gp_Rasterizer - > SetFogEnd ( mistend ) ;
Py_RETURN_NONE ;
}
static PyObject * gPySetAmbientColor ( PyObject * , PyObject * value )
{
MT_Vector3 vec ;
if ( ! PyVecTo ( value , vec ) )
return NULL ;
if ( ! gp_Rasterizer ) {
PyErr_SetString ( PyExc_RuntimeError , " Rasterizer.setAmbientColor(color), Rasterizer not available " ) ;
return NULL ;
}
gp_Rasterizer - > SetAmbientColor ( vec [ 0 ] , vec [ 1 ] , vec [ 2 ] ) ;
Py_RETURN_NONE ;
}
static PyObject * gPyMakeScreenshot ( PyObject * , PyObject * args )
{
char * filename ;
if ( ! PyArg_ParseTuple ( args , " s:makeScreenshot " , & filename ) )
return NULL ;
if ( gp_Canvas )
{
gp_Canvas - > MakeScreenShot ( filename ) ;
}
Py_RETURN_NONE ;
}
static PyObject * gPyEnableMotionBlur ( PyObject * , PyObject * args )
{
float motionblurvalue ;
if ( ! PyArg_ParseTuple ( args , " f:enableMotionBlur " , & motionblurvalue ) )
return NULL ;
if ( ! gp_Rasterizer ) {
PyErr_SetString ( PyExc_RuntimeError , " Rasterizer.enableMotionBlur(float), Rasterizer not available " ) ;
return NULL ;
}
gp_Rasterizer - > EnableMotionBlur ( motionblurvalue ) ;
Py_RETURN_NONE ;
}
static PyObject * gPyDisableMotionBlur ( PyObject * )
{
if ( ! gp_Rasterizer ) {
PyErr_SetString ( PyExc_RuntimeError , " Rasterizer.disableMotionBlur(), Rasterizer not available " ) ;
return NULL ;
}
gp_Rasterizer - > DisableMotionBlur ( ) ;
Py_RETURN_NONE ;
}
int getGLSLSettingFlag ( char * setting )
{
if ( strcmp ( setting , " lights " ) = = 0 )
return GAME_GLSL_NO_LIGHTS ;
else if ( strcmp ( setting , " shaders " ) = = 0 )
return GAME_GLSL_NO_SHADERS ;
else if ( strcmp ( setting , " shadows " ) = = 0 )
return GAME_GLSL_NO_SHADOWS ;
else if ( strcmp ( setting , " ramps " ) = = 0 )
return GAME_GLSL_NO_RAMPS ;
else if ( strcmp ( setting , " nodes " ) = = 0 )
return GAME_GLSL_NO_NODES ;
else if ( strcmp ( setting , " extra_textures " ) = = 0 )
return GAME_GLSL_NO_EXTRA_TEX ;
else
return - 1 ;
}
static PyObject * gPySetGLSLMaterialSetting ( PyObject * ,
PyObject * args ,
PyObject * )
{
GameData * gm = & ( gp_KetsjiScene - > GetBlenderScene ( ) - > gm ) ;
char * setting ;
int enable , flag , sceneflag ;
if ( ! PyArg_ParseTuple ( args , " si:setGLSLMaterialSetting " , & setting , & enable ) )
return NULL ;
flag = getGLSLSettingFlag ( setting ) ;
if ( flag = = - 1 ) {
PyErr_SetString ( PyExc_ValueError , " Rasterizer.setGLSLMaterialSetting(string): glsl setting is not known " ) ;
return NULL ;
}
sceneflag = gm - > flag ;
if ( enable )
gm - > flag & = ~ flag ;
else
gm - > flag | = flag ;
/* display lists and GLSL materials need to be remade */
if ( sceneflag ! = gm - > flag ) {
GPU_materials_free ( ) ;
if ( gp_KetsjiEngine ) {
KX_SceneList * scenes = gp_KetsjiEngine - > CurrentScenes ( ) ;
KX_SceneList : : iterator it ;
for ( it = scenes - > begin ( ) ; it ! = scenes - > end ( ) ; it + + )
if ( ( * it ) - > GetBucketManager ( ) ) {
( * it ) - > GetBucketManager ( ) - > ReleaseDisplayLists ( ) ;
( * it ) - > GetBucketManager ( ) - > ReleaseMaterials ( ) ;
}
}
}
Py_RETURN_NONE ;
}
static PyObject * gPyGetGLSLMaterialSetting ( PyObject * ,
PyObject * args ,
PyObject * )
{
GameData * gm = & ( gp_KetsjiScene - > GetBlenderScene ( ) - > gm ) ;
char * setting ;
int enabled = 0 , flag ;
if ( ! PyArg_ParseTuple ( args , " s:getGLSLMaterialSetting " , & setting ) )
return NULL ;
flag = getGLSLSettingFlag ( setting ) ;
if ( flag = = - 1 ) {
PyErr_SetString ( PyExc_ValueError , " Rasterizer.getGLSLMaterialSetting(string): glsl setting is not known " ) ;
return NULL ;
}
enabled = ( ( gm - > flag & flag ) ! = 0 ) ;
return PyLong_FromSsize_t ( enabled ) ;
}
# define KX_TEXFACE_MATERIAL 0
# define KX_BLENDER_MULTITEX_MATERIAL 1
# define KX_BLENDER_GLSL_MATERIAL 2
static PyObject * gPySetMaterialType ( PyObject * ,
PyObject * args ,
PyObject * )
{
GameData * gm = & ( gp_KetsjiScene - > GetBlenderScene ( ) - > gm ) ;
int type ;
if ( ! PyArg_ParseTuple ( args , " i:setMaterialType " , & type ) )
return NULL ;
if ( type = = KX_BLENDER_GLSL_MATERIAL )
gm - > matmode = GAME_MAT_GLSL ;
else if ( type = = KX_BLENDER_MULTITEX_MATERIAL )
gm - > matmode = GAME_MAT_MULTITEX ;
else if ( type = = KX_TEXFACE_MATERIAL )
gm - > matmode = GAME_MAT_TEXFACE ;
else {
PyErr_SetString ( PyExc_ValueError , " Rasterizer.setMaterialType(int): material type is not known " ) ;
return NULL ;
}
Py_RETURN_NONE ;
}
static PyObject * gPyGetMaterialType ( PyObject * )
{
GameData * gm = & ( gp_KetsjiScene - > GetBlenderScene ( ) - > gm ) ;
int flag ;
if ( gm - > matmode = = GAME_MAT_GLSL )
flag = KX_BLENDER_GLSL_MATERIAL ;
else if ( gm - > matmode = = GAME_MAT_MULTITEX )
flag = KX_BLENDER_MULTITEX_MATERIAL ;
else
flag = KX_TEXFACE_MATERIAL ;
return PyLong_FromSsize_t ( flag ) ;
}
static PyObject * gPyDrawLine ( PyObject * , PyObject * args )
{
PyObject * ob_from ;
PyObject * ob_to ;
PyObject * ob_color ;
if ( ! gp_Rasterizer ) {
PyErr_SetString ( PyExc_RuntimeError , " Rasterizer.drawLine(obFrom, obTo, color): Rasterizer not available " ) ;
return NULL ;
}
if ( ! PyArg_ParseTuple ( args , " OOO:drawLine " , & ob_from , & ob_to , & ob_color ) )
return NULL ;
MT_Vector3 from ;
MT_Vector3 to ;
MT_Vector3 color ;
if ( ! PyVecTo ( ob_from , from ) )
return NULL ;
if ( ! PyVecTo ( ob_to , to ) )
return NULL ;
if ( ! PyVecTo ( ob_color , color ) )
return NULL ;
gp_Rasterizer - > DrawDebugLine ( from , to , color ) ;
Py_RETURN_NONE ;
}
static struct PyMethodDef rasterizer_methods [ ] = {
{ " getWindowWidth " , ( PyCFunction ) gPyGetWindowWidth ,
METH_VARARGS , " getWindowWidth doc " } ,
{ " getWindowHeight " , ( PyCFunction ) gPyGetWindowHeight ,
METH_VARARGS , " getWindowHeight doc " } ,
{ " makeScreenshot " , ( PyCFunction ) gPyMakeScreenshot ,
METH_VARARGS , " make Screenshot doc " } ,
{ " enableVisibility " , ( PyCFunction ) gPyEnableVisibility ,
METH_VARARGS , " enableVisibility doc " } ,
{ " showMouse " , ( PyCFunction ) gPyShowMouse ,
METH_VARARGS , " showMouse(bool visible) " } ,
{ " setMousePosition " , ( PyCFunction ) gPySetMousePosition ,
METH_VARARGS , " setMousePosition(int x,int y) " } ,
{ " setBackgroundColor " , ( PyCFunction ) gPySetBackgroundColor , METH_O , " set Background Color (rgb) " } ,
{ " setAmbientColor " , ( PyCFunction ) gPySetAmbientColor , METH_O , " set Ambient Color (rgb) " } ,
{ " disableMist " , ( PyCFunction ) gPyDisableMist , METH_NOARGS , " turn off mist " } ,
{ " setMistColor " , ( PyCFunction ) gPySetMistColor , METH_O , " set Mist Color (rgb) " } ,
{ " setMistStart " , ( PyCFunction ) gPySetMistStart , METH_VARARGS , " set Mist Start(rgb) " } ,
{ " setMistEnd " , ( PyCFunction ) gPySetMistEnd , METH_VARARGS , " set Mist End(rgb) " } ,
{ " enableMotionBlur " , ( PyCFunction ) gPyEnableMotionBlur , METH_VARARGS , " enable motion blur " } ,
{ " disableMotionBlur " , ( PyCFunction ) gPyDisableMotionBlur , METH_NOARGS , " disable motion blur " } ,
{ " setEyeSeparation " , ( PyCFunction ) gPySetEyeSeparation , METH_VARARGS , " set the eye separation for stereo mode " } ,
{ " getEyeSeparation " , ( PyCFunction ) gPyGetEyeSeparation , METH_NOARGS , " get the eye separation for stereo mode " } ,
{ " setFocalLength " , ( PyCFunction ) gPySetFocalLength , METH_VARARGS , " set the focal length for stereo mode " } ,
{ " getFocalLength " , ( PyCFunction ) gPyGetFocalLength , METH_VARARGS , " get the focal length for stereo mode " } ,
{ " setMaterialMode " , ( PyCFunction ) gPySetMaterialType ,
METH_VARARGS , " set the material mode to use for OpenGL rendering " } ,
{ " getMaterialMode " , ( PyCFunction ) gPyGetMaterialType ,
METH_NOARGS , " get the material mode being used for OpenGL rendering " } ,
{ " setGLSLMaterialSetting " , ( PyCFunction ) gPySetGLSLMaterialSetting ,
METH_VARARGS , " set the state of a GLSL material setting " } ,
{ " getGLSLMaterialSetting " , ( PyCFunction ) gPyGetGLSLMaterialSetting ,
METH_VARARGS , " get the state of a GLSL material setting " } ,
{ " drawLine " , ( PyCFunction ) gPyDrawLine ,
METH_VARARGS , " draw a line on the screen " } ,
{ NULL , ( PyCFunction ) NULL , 0 , NULL }
} ;
// Initialization function for the module (*must* be called initGameLogic)
static char GameLogic_module_documentation [ ] =
" This is the Python API for the game engine of bge.logic "
;
static char Rasterizer_module_documentation [ ] =
" This is the Python API for the game engine of Rasterizer "
;
static struct PyModuleDef GameLogic_module_def = {
{ } , /* m_base */
" GameLogic " , /* m_name */
GameLogic_module_documentation , /* m_doc */
0 , /* m_size */
game_methods , /* m_methods */
0 , /* m_reload */
0 , /* m_traverse */
0 , /* m_clear */
0 , /* m_free */
} ;
PyObject * initGameLogic ( KX_KetsjiEngine * engine , KX_Scene * scene ) // quick hack to get gravity hook
{
PyObject * m ;
PyObject * d ;
PyObject * item ; /* temp PyObject* storage */
gp_KetsjiEngine = engine ;
gp_KetsjiScene = scene ;
gUseVisibilityTemp = false ;
PyObjectPlus : : ClearDeprecationWarning ( ) ; /* Not that nice to call here but makes sure warnings are reset between loading scenes */
/* Use existing module where possible
* be careful not to init any runtime vars after this */
m = PyImport_ImportModule ( " GameLogic " ) ;
if ( m ) {
Py_DECREF ( m ) ;
return m ;
}
else {
PyErr_Clear ( ) ;
// Create the module and add the functions
m = PyModule_Create ( & GameLogic_module_def ) ;
PyDict_SetItemString ( PySys_GetObject ( " modules " ) , GameLogic_module_def . m_name , m ) ;
}
// Add some symbolic constants to the module
d = PyModule_GetDict ( m ) ;
// can be overwritten later for gameEngine instances that can load new blend files and re-initialize this module
// for now its safe to make sure it exists for other areas such as the web plugin
PyDict_SetItemString ( d , " globalDict " , item = PyDict_New ( ) ) ; Py_DECREF ( item ) ;
// Add keyboard and mouse attributes to this module
2010-10-09 01:31:20 +00:00
MT_assert ( ! gp_PythonKeyboard ) ;
gp_PythonKeyboard = new SCA_PythonKeyboard ( gp_KetsjiEngine - > GetKeyboardDevice ( ) ) ;
PyDict_SetItemString ( d , " keyboard " , gp_PythonKeyboard - > NewProxy ( true ) ) ;
2010-09-04 19:06:15 +00:00
2010-10-09 01:31:20 +00:00
MT_assert ( ! gp_PythonMouse ) ;
gp_PythonMouse = new SCA_PythonMouse ( gp_KetsjiEngine - > GetMouseDevice ( ) , gp_Canvas ) ;
PyDict_SetItemString ( d , " mouse " , gp_PythonMouse - > NewProxy ( true ) ) ;
2010-09-04 19:06:15 +00:00
ErrorObject = PyUnicode_FromString ( " GameLogic.error " ) ;
PyDict_SetItemString ( d , " error " , ErrorObject ) ;
Py_DECREF ( ErrorObject ) ;
// XXXX Add constants here
/* To use logic bricks, we need some sort of constants. Here, we associate */
/* constants and sumbolic names. Add them to dictionary d. */
/* 1. true and false: needed for everyone */
KX_MACRO_addTypesToDict ( d , KX_TRUE , SCA_ILogicBrick : : KX_TRUE ) ;
KX_MACRO_addTypesToDict ( d , KX_FALSE , SCA_ILogicBrick : : KX_FALSE ) ;
/* 2. Property sensor */
KX_MACRO_addTypesToDict ( d , KX_PROPSENSOR_EQUAL , SCA_PropertySensor : : KX_PROPSENSOR_EQUAL ) ;
KX_MACRO_addTypesToDict ( d , KX_PROPSENSOR_NOTEQUAL , SCA_PropertySensor : : KX_PROPSENSOR_NOTEQUAL ) ;
KX_MACRO_addTypesToDict ( d , KX_PROPSENSOR_INTERVAL , SCA_PropertySensor : : KX_PROPSENSOR_INTERVAL ) ;
KX_MACRO_addTypesToDict ( d , KX_PROPSENSOR_CHANGED , SCA_PropertySensor : : KX_PROPSENSOR_CHANGED ) ;
KX_MACRO_addTypesToDict ( d , KX_PROPSENSOR_EXPRESSION , SCA_PropertySensor : : KX_PROPSENSOR_EXPRESSION ) ;
/* 3. Constraint actuator */
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_LOCX , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_LOCX ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_LOCY , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_LOCY ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_LOCZ , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_LOCZ ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_ROTX , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_ROTX ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_ROTY , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_ROTY ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_ROTZ , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_ROTZ ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_DIRPX , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_DIRPX ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_DIRPY , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_DIRPY ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_DIRPZ , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_DIRPZ ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_DIRNX , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_DIRNX ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_DIRNY , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_DIRNY ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_DIRNZ , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_DIRNZ ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_ORIX , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_ORIX ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_ORIY , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_ORIY ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_ORIZ , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_ORIZ ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_FHPX , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_FHPX ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_FHPY , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_FHPY ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_FHPZ , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_FHPZ ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_FHNX , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_FHNX ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_FHNY , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_FHNY ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_FHNZ , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_FHNZ ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_NORMAL , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_NORMAL ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_MATERIAL , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_MATERIAL ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_PERMANENT , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_PERMANENT ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_DISTANCE , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_DISTANCE ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_LOCAL , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_LOCAL ) ;
KX_MACRO_addTypesToDict ( d , KX_CONSTRAINTACT_DOROTFH , KX_ConstraintActuator : : KX_ACT_CONSTRAINT_DOROTFH ) ;
/* 4. Ipo actuator, simple part */
KX_MACRO_addTypesToDict ( d , KX_IPOACT_PLAY , KX_IpoActuator : : KX_ACT_IPO_PLAY ) ;
KX_MACRO_addTypesToDict ( d , KX_IPOACT_PINGPONG , KX_IpoActuator : : KX_ACT_IPO_PINGPONG ) ;
KX_MACRO_addTypesToDict ( d , KX_IPOACT_FLIPPER , KX_IpoActuator : : KX_ACT_IPO_FLIPPER ) ;
KX_MACRO_addTypesToDict ( d , KX_IPOACT_LOOPSTOP , KX_IpoActuator : : KX_ACT_IPO_LOOPSTOP ) ;
KX_MACRO_addTypesToDict ( d , KX_IPOACT_LOOPEND , KX_IpoActuator : : KX_ACT_IPO_LOOPEND ) ;
KX_MACRO_addTypesToDict ( d , KX_IPOACT_FROM_PROP , KX_IpoActuator : : KX_ACT_IPO_FROM_PROP ) ;
/* 5. Random distribution types */
KX_MACRO_addTypesToDict ( d , KX_RANDOMACT_BOOL_CONST , SCA_RandomActuator : : KX_RANDOMACT_BOOL_CONST ) ;
KX_MACRO_addTypesToDict ( d , KX_RANDOMACT_BOOL_UNIFORM , SCA_RandomActuator : : KX_RANDOMACT_BOOL_UNIFORM ) ;
KX_MACRO_addTypesToDict ( d , KX_RANDOMACT_BOOL_BERNOUILLI , SCA_RandomActuator : : KX_RANDOMACT_BOOL_BERNOUILLI ) ;
KX_MACRO_addTypesToDict ( d , KX_RANDOMACT_INT_CONST , SCA_RandomActuator : : KX_RANDOMACT_INT_CONST ) ;
KX_MACRO_addTypesToDict ( d , KX_RANDOMACT_INT_UNIFORM , SCA_RandomActuator : : KX_RANDOMACT_INT_UNIFORM ) ;
KX_MACRO_addTypesToDict ( d , KX_RANDOMACT_INT_POISSON , SCA_RandomActuator : : KX_RANDOMACT_INT_POISSON ) ;
KX_MACRO_addTypesToDict ( d , KX_RANDOMACT_FLOAT_CONST , SCA_RandomActuator : : KX_RANDOMACT_FLOAT_CONST ) ;
KX_MACRO_addTypesToDict ( d , KX_RANDOMACT_FLOAT_UNIFORM , SCA_RandomActuator : : KX_RANDOMACT_FLOAT_UNIFORM ) ;
KX_MACRO_addTypesToDict ( d , KX_RANDOMACT_FLOAT_NORMAL , SCA_RandomActuator : : KX_RANDOMACT_FLOAT_NORMAL ) ;
KX_MACRO_addTypesToDict ( d , KX_RANDOMACT_FLOAT_NEGATIVE_EXPONENTIAL , SCA_RandomActuator : : KX_RANDOMACT_FLOAT_NEGATIVE_EXPONENTIAL ) ;
/* 6. Sound actuator */
KX_MACRO_addTypesToDict ( d , KX_SOUNDACT_PLAYSTOP , KX_SoundActuator : : KX_SOUNDACT_PLAYSTOP ) ;
KX_MACRO_addTypesToDict ( d , KX_SOUNDACT_PLAYEND , KX_SoundActuator : : KX_SOUNDACT_PLAYEND ) ;
KX_MACRO_addTypesToDict ( d , KX_SOUNDACT_LOOPSTOP , KX_SoundActuator : : KX_SOUNDACT_LOOPSTOP ) ;
KX_MACRO_addTypesToDict ( d , KX_SOUNDACT_LOOPEND , KX_SoundActuator : : KX_SOUNDACT_LOOPEND ) ;
KX_MACRO_addTypesToDict ( d , KX_SOUNDACT_LOOPBIDIRECTIONAL , KX_SoundActuator : : KX_SOUNDACT_LOOPBIDIRECTIONAL ) ;
KX_MACRO_addTypesToDict ( d , KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP , KX_SoundActuator : : KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP ) ;
/* 7. Action actuator */
KX_MACRO_addTypesToDict ( d , KX_ACTIONACT_PLAY , ACT_ACTION_PLAY ) ;
2011-02-16 19:53:39 +00:00
KX_MACRO_addTypesToDict ( d , KX_ACTIONACT_PINGPONG , ACT_ACTION_PINGPONG ) ;
2010-09-04 19:06:15 +00:00
KX_MACRO_addTypesToDict ( d , KX_ACTIONACT_FLIPPER , ACT_ACTION_FLIPPER ) ;
KX_MACRO_addTypesToDict ( d , KX_ACTIONACT_LOOPSTOP , ACT_ACTION_LOOP_STOP ) ;
KX_MACRO_addTypesToDict ( d , KX_ACTIONACT_LOOPEND , ACT_ACTION_LOOP_END ) ;
KX_MACRO_addTypesToDict ( d , KX_ACTIONACT_PROPERTY , ACT_ACTION_FROM_PROP ) ;
/*8. GL_BlendFunc */
KX_MACRO_addTypesToDict ( d , BL_ZERO , GL_ZERO ) ;
KX_MACRO_addTypesToDict ( d , BL_ONE , GL_ONE ) ;
KX_MACRO_addTypesToDict ( d , BL_SRC_COLOR , GL_SRC_COLOR ) ;
KX_MACRO_addTypesToDict ( d , BL_ONE_MINUS_SRC_COLOR , GL_ONE_MINUS_SRC_COLOR ) ;
KX_MACRO_addTypesToDict ( d , BL_DST_COLOR , GL_DST_COLOR ) ;
KX_MACRO_addTypesToDict ( d , BL_ONE_MINUS_DST_COLOR , GL_ONE_MINUS_DST_COLOR ) ;
KX_MACRO_addTypesToDict ( d , BL_SRC_ALPHA , GL_SRC_ALPHA ) ;
KX_MACRO_addTypesToDict ( d , BL_ONE_MINUS_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ) ;
KX_MACRO_addTypesToDict ( d , BL_DST_ALPHA , GL_DST_ALPHA ) ;
KX_MACRO_addTypesToDict ( d , BL_ONE_MINUS_DST_ALPHA , GL_ONE_MINUS_DST_ALPHA ) ;
KX_MACRO_addTypesToDict ( d , BL_SRC_ALPHA_SATURATE , GL_SRC_ALPHA_SATURATE ) ;
/* 9. UniformTypes */
KX_MACRO_addTypesToDict ( d , SHD_TANGENT , BL_Shader : : SHD_TANGENT ) ;
KX_MACRO_addTypesToDict ( d , MODELVIEWMATRIX , BL_Shader : : MODELVIEWMATRIX ) ;
KX_MACRO_addTypesToDict ( d , MODELVIEWMATRIX_TRANSPOSE , BL_Shader : : MODELVIEWMATRIX_TRANSPOSE ) ;
KX_MACRO_addTypesToDict ( d , MODELVIEWMATRIX_INVERSE , BL_Shader : : MODELVIEWMATRIX_INVERSE ) ;
KX_MACRO_addTypesToDict ( d , MODELVIEWMATRIX_INVERSETRANSPOSE , BL_Shader : : MODELVIEWMATRIX_INVERSETRANSPOSE ) ;
KX_MACRO_addTypesToDict ( d , MODELMATRIX , BL_Shader : : MODELMATRIX ) ;
KX_MACRO_addTypesToDict ( d , MODELMATRIX_TRANSPOSE , BL_Shader : : MODELMATRIX_TRANSPOSE ) ;
KX_MACRO_addTypesToDict ( d , MODELMATRIX_INVERSE , BL_Shader : : MODELMATRIX_INVERSE ) ;
KX_MACRO_addTypesToDict ( d , MODELMATRIX_INVERSETRANSPOSE , BL_Shader : : MODELMATRIX_INVERSETRANSPOSE ) ;
KX_MACRO_addTypesToDict ( d , VIEWMATRIX , BL_Shader : : VIEWMATRIX ) ;
KX_MACRO_addTypesToDict ( d , VIEWMATRIX_TRANSPOSE , BL_Shader : : VIEWMATRIX_TRANSPOSE ) ;
KX_MACRO_addTypesToDict ( d , VIEWMATRIX_INVERSE , BL_Shader : : VIEWMATRIX_INVERSE ) ;
KX_MACRO_addTypesToDict ( d , VIEWMATRIX_INVERSETRANSPOSE , BL_Shader : : VIEWMATRIX_INVERSETRANSPOSE ) ;
KX_MACRO_addTypesToDict ( d , CAM_POS , BL_Shader : : CAM_POS ) ;
KX_MACRO_addTypesToDict ( d , CONSTANT_TIMER , BL_Shader : : CONSTANT_TIMER ) ;
/* 10 state actuator */
KX_MACRO_addTypesToDict ( d , KX_STATE1 , ( 1 < < 0 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE2 , ( 1 < < 1 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE3 , ( 1 < < 2 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE4 , ( 1 < < 3 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE5 , ( 1 < < 4 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE6 , ( 1 < < 5 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE7 , ( 1 < < 6 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE8 , ( 1 < < 7 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE9 , ( 1 < < 8 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE10 , ( 1 < < 9 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE11 , ( 1 < < 10 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE12 , ( 1 < < 11 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE13 , ( 1 < < 12 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE14 , ( 1 < < 13 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE15 , ( 1 < < 14 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE16 , ( 1 < < 15 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE17 , ( 1 < < 16 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE18 , ( 1 < < 17 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE19 , ( 1 < < 18 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE20 , ( 1 < < 19 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE21 , ( 1 < < 20 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE22 , ( 1 < < 21 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE23 , ( 1 < < 22 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE24 , ( 1 < < 23 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE25 , ( 1 < < 24 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE26 , ( 1 < < 25 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE27 , ( 1 < < 26 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE28 , ( 1 < < 27 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE29 , ( 1 < < 28 ) ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE30 , ( 1 < < 29 ) ) ;
/* All Sensors */
KX_MACRO_addTypesToDict ( d , KX_SENSOR_JUST_ACTIVATED , SCA_ISensor : : KX_SENSOR_JUST_ACTIVATED ) ;
KX_MACRO_addTypesToDict ( d , KX_SENSOR_ACTIVE , SCA_ISensor : : KX_SENSOR_ACTIVE ) ;
KX_MACRO_addTypesToDict ( d , KX_SENSOR_JUST_DEACTIVATED , SCA_ISensor : : KX_SENSOR_JUST_DEACTIVATED ) ;
KX_MACRO_addTypesToDict ( d , KX_SENSOR_INACTIVE , SCA_ISensor : : KX_SENSOR_INACTIVE ) ;
/* Radar Sensor */
KX_MACRO_addTypesToDict ( d , KX_RADAR_AXIS_POS_X , KX_RadarSensor : : KX_RADAR_AXIS_POS_X ) ;
KX_MACRO_addTypesToDict ( d , KX_RADAR_AXIS_POS_Y , KX_RadarSensor : : KX_RADAR_AXIS_POS_Y ) ;
KX_MACRO_addTypesToDict ( d , KX_RADAR_AXIS_POS_Z , KX_RadarSensor : : KX_RADAR_AXIS_POS_Z ) ;
KX_MACRO_addTypesToDict ( d , KX_RADAR_AXIS_NEG_X , KX_RadarSensor : : KX_RADAR_AXIS_NEG_Y ) ;
KX_MACRO_addTypesToDict ( d , KX_RADAR_AXIS_NEG_Y , KX_RadarSensor : : KX_RADAR_AXIS_NEG_X ) ;
KX_MACRO_addTypesToDict ( d , KX_RADAR_AXIS_NEG_Z , KX_RadarSensor : : KX_RADAR_AXIS_NEG_Z ) ;
/* Ray Sensor */
KX_MACRO_addTypesToDict ( d , KX_RAY_AXIS_POS_X , KX_RaySensor : : KX_RAY_AXIS_POS_X ) ;
KX_MACRO_addTypesToDict ( d , KX_RAY_AXIS_POS_Y , KX_RaySensor : : KX_RAY_AXIS_POS_Y ) ;
KX_MACRO_addTypesToDict ( d , KX_RAY_AXIS_POS_Z , KX_RaySensor : : KX_RAY_AXIS_POS_Z ) ;
KX_MACRO_addTypesToDict ( d , KX_RAY_AXIS_NEG_X , KX_RaySensor : : KX_RAY_AXIS_NEG_Y ) ;
KX_MACRO_addTypesToDict ( d , KX_RAY_AXIS_NEG_Y , KX_RaySensor : : KX_RAY_AXIS_NEG_X ) ;
KX_MACRO_addTypesToDict ( d , KX_RAY_AXIS_NEG_Z , KX_RaySensor : : KX_RAY_AXIS_NEG_Z ) ;
/* Dynamic actuator */
KX_MACRO_addTypesToDict ( d , KX_DYN_RESTORE_DYNAMICS , KX_SCA_DynamicActuator : : KX_DYN_RESTORE_DYNAMICS ) ;
KX_MACRO_addTypesToDict ( d , KX_DYN_DISABLE_DYNAMICS , KX_SCA_DynamicActuator : : KX_DYN_DISABLE_DYNAMICS ) ;
KX_MACRO_addTypesToDict ( d , KX_DYN_ENABLE_RIGID_BODY , KX_SCA_DynamicActuator : : KX_DYN_ENABLE_RIGID_BODY ) ;
KX_MACRO_addTypesToDict ( d , KX_DYN_DISABLE_RIGID_BODY , KX_SCA_DynamicActuator : : KX_DYN_DISABLE_RIGID_BODY ) ;
KX_MACRO_addTypesToDict ( d , KX_DYN_SET_MASS , KX_SCA_DynamicActuator : : KX_DYN_SET_MASS ) ;
/* Input & Mouse Sensor */
KX_MACRO_addTypesToDict ( d , KX_INPUT_NONE , SCA_InputEvent : : KX_NO_INPUTSTATUS ) ;
KX_MACRO_addTypesToDict ( d , KX_INPUT_JUST_ACTIVATED , SCA_InputEvent : : KX_JUSTACTIVATED ) ;
KX_MACRO_addTypesToDict ( d , KX_INPUT_ACTIVE , SCA_InputEvent : : KX_ACTIVE ) ;
KX_MACRO_addTypesToDict ( d , KX_INPUT_JUST_RELEASED , SCA_InputEvent : : KX_JUSTRELEASED ) ;
KX_MACRO_addTypesToDict ( d , KX_MOUSE_BUT_LEFT , SCA_IInputDevice : : KX_LEFTMOUSE ) ;
KX_MACRO_addTypesToDict ( d , KX_MOUSE_BUT_MIDDLE , SCA_IInputDevice : : KX_MIDDLEMOUSE ) ;
KX_MACRO_addTypesToDict ( d , KX_MOUSE_BUT_RIGHT , SCA_IInputDevice : : KX_RIGHTMOUSE ) ;
/* 2D Filter Actuator */
KX_MACRO_addTypesToDict ( d , RAS_2DFILTER_ENABLED , RAS_2DFilterManager : : RAS_2DFILTER_ENABLED ) ;
KX_MACRO_addTypesToDict ( d , RAS_2DFILTER_DISABLED , RAS_2DFilterManager : : RAS_2DFILTER_DISABLED ) ;
KX_MACRO_addTypesToDict ( d , RAS_2DFILTER_NOFILTER , RAS_2DFilterManager : : RAS_2DFILTER_NOFILTER ) ;
KX_MACRO_addTypesToDict ( d , RAS_2DFILTER_MOTIONBLUR , RAS_2DFilterManager : : RAS_2DFILTER_MOTIONBLUR ) ;
KX_MACRO_addTypesToDict ( d , RAS_2DFILTER_BLUR , RAS_2DFilterManager : : RAS_2DFILTER_BLUR ) ;
KX_MACRO_addTypesToDict ( d , RAS_2DFILTER_SHARPEN , RAS_2DFilterManager : : RAS_2DFILTER_SHARPEN ) ;
KX_MACRO_addTypesToDict ( d , RAS_2DFILTER_DILATION , RAS_2DFilterManager : : RAS_2DFILTER_DILATION ) ;
KX_MACRO_addTypesToDict ( d , RAS_2DFILTER_EROSION , RAS_2DFilterManager : : RAS_2DFILTER_EROSION ) ;
KX_MACRO_addTypesToDict ( d , RAS_2DFILTER_LAPLACIAN , RAS_2DFilterManager : : RAS_2DFILTER_LAPLACIAN ) ;
KX_MACRO_addTypesToDict ( d , RAS_2DFILTER_SOBEL , RAS_2DFilterManager : : RAS_2DFILTER_SOBEL ) ;
KX_MACRO_addTypesToDict ( d , RAS_2DFILTER_PREWITT , RAS_2DFilterManager : : RAS_2DFILTER_PREWITT ) ;
KX_MACRO_addTypesToDict ( d , RAS_2DFILTER_GRAYSCALE , RAS_2DFilterManager : : RAS_2DFILTER_GRAYSCALE ) ;
KX_MACRO_addTypesToDict ( d , RAS_2DFILTER_SEPIA , RAS_2DFilterManager : : RAS_2DFILTER_SEPIA ) ;
KX_MACRO_addTypesToDict ( d , RAS_2DFILTER_INVERT , RAS_2DFilterManager : : RAS_2DFILTER_INVERT ) ;
KX_MACRO_addTypesToDict ( d , RAS_2DFILTER_CUSTOMFILTER , RAS_2DFilterManager : : RAS_2DFILTER_CUSTOMFILTER ) ;
/* Sound Actuator */
KX_MACRO_addTypesToDict ( d , KX_SOUNDACT_PLAYSTOP , KX_SoundActuator : : KX_SOUNDACT_PLAYSTOP ) ;
KX_MACRO_addTypesToDict ( d , KX_SOUNDACT_PLAYEND , KX_SoundActuator : : KX_SOUNDACT_PLAYEND ) ;
KX_MACRO_addTypesToDict ( d , KX_SOUNDACT_LOOPSTOP , KX_SoundActuator : : KX_SOUNDACT_LOOPSTOP ) ;
KX_MACRO_addTypesToDict ( d , KX_SOUNDACT_LOOPEND , KX_SoundActuator : : KX_SOUNDACT_LOOPEND ) ;
KX_MACRO_addTypesToDict ( d , KX_SOUNDACT_LOOPBIDIRECTIONAL , KX_SoundActuator : : KX_SOUNDACT_LOOPBIDIRECTIONAL ) ;
KX_MACRO_addTypesToDict ( d , KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP , KX_SoundActuator : : KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP ) ;
/* State Actuator */
KX_MACRO_addTypesToDict ( d , KX_STATE_OP_CPY , KX_StateActuator : : OP_CPY ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE_OP_SET , KX_StateActuator : : OP_SET ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE_OP_CLR , KX_StateActuator : : OP_CLR ) ;
KX_MACRO_addTypesToDict ( d , KX_STATE_OP_NEG , KX_StateActuator : : OP_NEG ) ;
/* Game Actuator Modes */
KX_MACRO_addTypesToDict ( d , KX_GAME_LOAD , KX_GameActuator : : KX_GAME_LOAD ) ;
KX_MACRO_addTypesToDict ( d , KX_GAME_START , KX_GameActuator : : KX_GAME_START ) ;
KX_MACRO_addTypesToDict ( d , KX_GAME_RESTART , KX_GameActuator : : KX_GAME_RESTART ) ;
KX_MACRO_addTypesToDict ( d , KX_GAME_QUIT , KX_GameActuator : : KX_GAME_QUIT ) ;
KX_MACRO_addTypesToDict ( d , KX_GAME_SAVECFG , KX_GameActuator : : KX_GAME_SAVECFG ) ;
KX_MACRO_addTypesToDict ( d , KX_GAME_LOADCFG , KX_GameActuator : : KX_GAME_LOADCFG ) ;
/* Scene Actuator Modes */
KX_MACRO_addTypesToDict ( d , KX_SCENE_RESTART , KX_SceneActuator : : KX_SCENE_RESTART ) ;
KX_MACRO_addTypesToDict ( d , KX_SCENE_SET_SCENE , KX_SceneActuator : : KX_SCENE_SET_SCENE ) ;
KX_MACRO_addTypesToDict ( d , KX_SCENE_SET_CAMERA , KX_SceneActuator : : KX_SCENE_SET_CAMERA ) ;
KX_MACRO_addTypesToDict ( d , KX_SCENE_ADD_FRONT_SCENE , KX_SceneActuator : : KX_SCENE_ADD_FRONT_SCENE ) ;
KX_MACRO_addTypesToDict ( d , KX_SCENE_ADD_BACK_SCENE , KX_SceneActuator : : KX_SCENE_ADD_BACK_SCENE ) ;
KX_MACRO_addTypesToDict ( d , KX_SCENE_REMOVE_SCENE , KX_SceneActuator : : KX_SCENE_REMOVE_SCENE ) ;
KX_MACRO_addTypesToDict ( d , KX_SCENE_SUSPEND , KX_SceneActuator : : KX_SCENE_SUSPEND ) ;
KX_MACRO_addTypesToDict ( d , KX_SCENE_RESUME , KX_SceneActuator : : KX_SCENE_RESUME ) ;
/* Parent Actuator Modes */
KX_MACRO_addTypesToDict ( d , KX_PARENT_SET , KX_ParentActuator : : KX_PARENT_SET ) ;
KX_MACRO_addTypesToDict ( d , KX_PARENT_REMOVE , KX_ParentActuator : : KX_PARENT_REMOVE ) ;
/* BL_ArmatureConstraint type */
KX_MACRO_addTypesToDict ( d , CONSTRAINT_TYPE_TRACKTO , CONSTRAINT_TYPE_TRACKTO ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_TYPE_KINEMATIC , CONSTRAINT_TYPE_KINEMATIC ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_TYPE_ROTLIKE , CONSTRAINT_TYPE_ROTLIKE ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_TYPE_LOCLIKE , CONSTRAINT_TYPE_LOCLIKE ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_TYPE_MINMAX , CONSTRAINT_TYPE_MINMAX ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_TYPE_SIZELIKE , CONSTRAINT_TYPE_SIZELIKE ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_TYPE_LOCKTRACK , CONSTRAINT_TYPE_LOCKTRACK ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_TYPE_STRETCHTO , CONSTRAINT_TYPE_STRETCHTO ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_TYPE_CLAMPTO , CONSTRAINT_TYPE_CLAMPTO ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_TYPE_TRANSFORM , CONSTRAINT_TYPE_TRANSFORM ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_TYPE_DISTLIMIT , CONSTRAINT_TYPE_DISTLIMIT ) ;
/* BL_ArmatureConstraint ik_type */
KX_MACRO_addTypesToDict ( d , CONSTRAINT_IK_COPYPOSE , CONSTRAINT_IK_COPYPOSE ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_IK_DISTANCE , CONSTRAINT_IK_DISTANCE ) ;
/* BL_ArmatureConstraint ik_mode */
KX_MACRO_addTypesToDict ( d , CONSTRAINT_IK_MODE_INSIDE , LIMITDIST_INSIDE ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_IK_MODE_OUTSIDE , LIMITDIST_OUTSIDE ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_IK_MODE_ONSURFACE , LIMITDIST_ONSURFACE ) ;
/* BL_ArmatureConstraint ik_flag */
KX_MACRO_addTypesToDict ( d , CONSTRAINT_IK_FLAG_TIP , CONSTRAINT_IK_TIP ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_IK_FLAG_ROT , CONSTRAINT_IK_ROT ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_IK_FLAG_STRETCH , CONSTRAINT_IK_STRETCH ) ;
KX_MACRO_addTypesToDict ( d , CONSTRAINT_IK_FLAG_POS , CONSTRAINT_IK_POS ) ;
/* KX_ArmatureSensor type */
KX_MACRO_addTypesToDict ( d , KX_ARMSENSOR_STATE_CHANGED , SENS_ARM_STATE_CHANGED ) ;
KX_MACRO_addTypesToDict ( d , KX_ARMSENSOR_LIN_ERROR_BELOW , SENS_ARM_LIN_ERROR_BELOW ) ;
KX_MACRO_addTypesToDict ( d , KX_ARMSENSOR_LIN_ERROR_ABOVE , SENS_ARM_LIN_ERROR_ABOVE ) ;
KX_MACRO_addTypesToDict ( d , KX_ARMSENSOR_ROT_ERROR_BELOW , SENS_ARM_ROT_ERROR_BELOW ) ;
KX_MACRO_addTypesToDict ( d , KX_ARMSENSOR_ROT_ERROR_ABOVE , SENS_ARM_ROT_ERROR_ABOVE ) ;
/* BL_ArmatureActuator type */
KX_MACRO_addTypesToDict ( d , KX_ACT_ARMATURE_RUN , ACT_ARM_RUN ) ;
KX_MACRO_addTypesToDict ( d , KX_ACT_ARMATURE_ENABLE , ACT_ARM_ENABLE ) ;
KX_MACRO_addTypesToDict ( d , KX_ACT_ARMATURE_DISABLE , ACT_ARM_DISABLE ) ;
KX_MACRO_addTypesToDict ( d , KX_ACT_ARMATURE_SETTARGET , ACT_ARM_SETTARGET ) ;
KX_MACRO_addTypesToDict ( d , KX_ACT_ARMATURE_SETWEIGHT , ACT_ARM_SETWEIGHT ) ;
/* BL_Armature Channel rotation_mode */
KX_MACRO_addTypesToDict ( d , ROT_MODE_QUAT , ROT_MODE_QUAT ) ;
KX_MACRO_addTypesToDict ( d , ROT_MODE_XYZ , ROT_MODE_XYZ ) ;
KX_MACRO_addTypesToDict ( d , ROT_MODE_XZY , ROT_MODE_XZY ) ;
KX_MACRO_addTypesToDict ( d , ROT_MODE_YXZ , ROT_MODE_YXZ ) ;
KX_MACRO_addTypesToDict ( d , ROT_MODE_YZX , ROT_MODE_YZX ) ;
KX_MACRO_addTypesToDict ( d , ROT_MODE_ZXY , ROT_MODE_ZXY ) ;
KX_MACRO_addTypesToDict ( d , ROT_MODE_ZYX , ROT_MODE_ZYX ) ;
// Check for errors
if ( PyErr_Occurred ( ) )
{
Py_FatalError ( " can't initialize module bge.logic " ) ;
}
return m ;
}
// Python Sandbox code
// override builtin functions import() and open()
PyObject * KXpy_open ( PyObject * self , PyObject * args ) {
PyErr_SetString ( PyExc_RuntimeError , " Sandbox: open() function disabled! \n Game Scripts should not use this function. " ) ;
return NULL ;
}
PyObject * KXpy_file ( PyObject * self , PyObject * args ) {
PyErr_SetString ( PyExc_RuntimeError , " Sandbox: file() function disabled! \n Game Scripts should not use this function. " ) ;
return NULL ;
}
PyObject * KXpy_execfile ( PyObject * self , PyObject * args ) {
PyErr_SetString ( PyExc_RuntimeError , " Sandbox: execfile() function disabled! \n Game Scripts should not use this function. " ) ;
return NULL ;
}
PyObject * KXpy_compile ( PyObject * self , PyObject * args ) {
PyErr_SetString ( PyExc_RuntimeError , " Sandbox: compile() function disabled! \n Game Scripts should not use this function. " ) ;
return NULL ;
}
PyObject * KXpy_import ( PyObject * self , PyObject * args )
{
char * name ;
int found ;
PyObject * globals = NULL ;
PyObject * locals = NULL ;
PyObject * fromlist = NULL ;
PyObject * l , * m , * n ;
int level ; /* not used yet */
if ( ! PyArg_ParseTuple ( args , " s|OOOi:m_import " ,
& name , & globals , & locals , & fromlist , & level ) )
return NULL ;
/* check for builtin modules */
m = PyImport_AddModule ( " sys " ) ;
l = PyObject_GetAttrString ( m , " builtin_module_names " ) ;
n = PyUnicode_FromString ( name ) ;
if ( PySequence_Contains ( l , n ) ) {
return PyImport_ImportModuleEx ( name , globals , locals , fromlist ) ;
}
/* quick hack for GamePython modules
TODO : register builtin modules properly by ExtendInittab */
if ( ! strcmp ( name , " GameLogic " ) | | ! strcmp ( name , " GameKeys " ) | | ! strcmp ( name , " PhysicsConstraints " ) | |
! strcmp ( name , " Rasterizer " ) | | ! strcmp ( name , " mathutils " ) | | ! strcmp ( name , " bgl " ) | | ! strcmp ( name , " geometry " ) ) {
return PyImport_ImportModuleEx ( name , globals , locals , fromlist ) ;
}
/* Import blender texts as python modules */
m = bpy_text_import_name ( name , & found ) ;
if ( m )
return m ;
if ( found = = 0 ) /* if its found but could not import then it has its own error */
PyErr_Format ( PyExc_ImportError , " Import of external Module %.20s not allowed. " , name ) ;
return NULL ;
}
PyObject * KXpy_reload ( PyObject * self , PyObject * args ) {
/* Used to be sandboxed, bettet to allow importing of internal text only */
#if 0
PyErr_SetString ( PyExc_RuntimeError , " Sandbox: reload() function disabled! \n Game Scripts should not use this function. " ) ;
return NULL ;
# endif
int found ;
PyObject * module = NULL ;
PyObject * newmodule = NULL ;
/* check for a module arg */
if ( ! PyArg_ParseTuple ( args , " O:bpy_reload_meth " , & module ) )
return NULL ;
newmodule = bpy_text_reimport ( module , & found ) ;
if ( newmodule )
return newmodule ;
if ( found = = 0 ) /* if its found but could not import then it has its own error */
PyErr_SetString ( PyExc_ImportError , " reload(module): failed to reload from blenders internal text " ) ;
return newmodule ;
}
/* override python file type functions */
#if 0
static int
file_init ( PyObject * self , PyObject * args , PyObject * kwds )
{
KXpy_file ( NULL , NULL ) ;
return - 1 ;
}
static PyObject *
file_new ( PyTypeObject * type , PyObject * args , PyObject * kwds )
{
return KXpy_file ( NULL , NULL ) ;
}
# endif
static PyMethodDef meth_open [ ] = { { " open " , KXpy_open , METH_VARARGS , " (disabled) " } } ;
static PyMethodDef meth_reload [ ] = { { " reload " , KXpy_reload , METH_VARARGS , " (disabled) " } } ;
static PyMethodDef meth_file [ ] = { { " file " , KXpy_file , METH_VARARGS , " (disabled) " } } ;
static PyMethodDef meth_execfile [ ] = { { " execfile " , KXpy_execfile , METH_VARARGS , " (disabled) " } } ;
static PyMethodDef meth_compile [ ] = { { " compile " , KXpy_compile , METH_VARARGS , " (disabled) " } } ;
static PyMethodDef meth_import [ ] = { { " import " , KXpy_import , METH_VARARGS , " our own import " } } ;
//static PyObject *g_oldopen = 0;
//static PyObject *g_oldimport = 0;
//static int g_security = 0;
static void setSandbox ( TPythonSecurityLevel level )
{
PyObject * m = PyImport_AddModule ( " __builtin__ " ) ;
PyObject * d = PyModule_GetDict ( m ) ;
PyObject * item ;
switch ( level ) {
case psl_Highest :
//if (!g_security) {
//g_oldopen = PyDict_GetItemString(d, "open");
// functions we cant trust
PyDict_SetItemString ( d , " open " , item = PyCFunction_New ( meth_open , NULL ) ) ; Py_DECREF ( item ) ;
PyDict_SetItemString ( d , " reload " , item = PyCFunction_New ( meth_reload , NULL ) ) ; Py_DECREF ( item ) ;
PyDict_SetItemString ( d , " file " , item = PyCFunction_New ( meth_file , NULL ) ) ; Py_DECREF ( item ) ;
PyDict_SetItemString ( d , " execfile " , item = PyCFunction_New ( meth_execfile , NULL ) ) ; Py_DECREF ( item ) ;
PyDict_SetItemString ( d , " compile " , item = PyCFunction_New ( meth_compile , NULL ) ) ; Py_DECREF ( item ) ;
// our own import
PyDict_SetItemString ( d , " __import__ " , PyCFunction_New ( meth_import , NULL ) ) ;
//g_security = level;
// Overiding file dosnt stop it being accessed if your sneaky
// f = [ t for t in (1).__class__.__mro__[-1].__subclasses__() if t.__name__ == 'file'][0]('/some_file.txt', 'w')
// f.write('...')
// so overwrite the file types functions. be very careful here still, since python uses python.
// ps - python devs frown deeply upon this.
/* this could mess up pythons internals, if we are serious about sandboxing
* issues like the one above need to be solved , possibly modify __subclasses__ is safer ? */
#if 0
PyFile_Type . tp_init = file_init ;
PyFile_Type . tp_new = file_new ;
# endif
//}
break ;
/*
case psl_Lowest :
if ( g_security ) {
PyDict_SetItemString ( d , " open " , g_oldopen ) ;
PyDict_SetItemString ( d , " __import__ " , g_oldimport ) ;
g_security = level ;
}
*/
default :
/* Allow importing internal text, from bpy_internal_import.py */
2010-10-03 20:00:22 +00:00
PyDict_SetItemString ( d , " reload " , item = PyCFunction_New ( & bpy_reload_meth , NULL ) ) ; Py_DECREF ( item ) ;
PyDict_SetItemString ( d , " __import__ " , item = PyCFunction_New ( & bpy_import_meth , NULL ) ) ; Py_DECREF ( item ) ;
2010-09-04 19:06:15 +00:00
break ;
}
}
/* Explanation of
*
* - backupPySysObjects ( ) : stores sys . path in gp_OrigPythonSysPath
* - initPySysObjects ( main ) : initializes the blendfile and library paths
* - restorePySysObjects ( ) : restores sys . path from gp_OrigPythonSysPath
*
* These exist so the current blend dir " // " can always be used to import modules from .
* the reason we need a few functions for this is that python is not only used by the game engine
* so we cant just add to sys . path all the time , it would leave pythons state in a mess .
* It would also be incorrect since loading blend files for new levels etc would alwasy add to sys . path
*
* To play nice with blenders python , the sys . path is backed up and the current blendfile along
* with all its lib paths are added to the sys path .
* When loading a new blendfile , the original sys . path is restored and the new paths are added over the top .
*/
/**
* So we can have external modules mixed with our blend files .
*/
static void backupPySysObjects ( void )
{
PyObject * sys_path = PySys_GetObject ( " path " ) ; /* should never fail */
PyObject * sys_mods = PySys_GetObject ( " modules " ) ; /* should never fail */
/* paths */
Py_XDECREF ( gp_OrigPythonSysPath ) ; /* just incase its set */
gp_OrigPythonSysPath = PyList_GetSlice ( sys_path , 0 , INT_MAX ) ; /* copy the list */
/* modules */
Py_XDECREF ( gp_OrigPythonSysModules ) ; /* just incase its set */
gp_OrigPythonSysModules = PyDict_Copy ( sys_mods ) ; /* copy the list */
}
/* for initPySysObjects only,
* takes a blend path and adds a scripts dir from it
*
* " /home/me/foo.blend " - > " /home/me/scripts "
*/
static void initPySysObjects__append ( PyObject * sys_path , char * filename )
{
PyObject * item ;
char expanded [ FILE_MAXDIR + FILE_MAXFILE ] ;
BLI_split_dirfile ( filename , expanded , NULL ) ; /* get the dir part of filename only */
BLI_path_abs ( expanded , gp_GamePythonPath ) ; /* filename from lib->filename is (always?) absolute, so this may not be needed but it wont hurt */
BLI_cleanup_file ( gp_GamePythonPath , expanded ) ; /* Dont use BLI_cleanup_dir because it adds a slash - BREAKS WIN32 ONLY */
2011-01-06 05:04:07 +00:00
item = PyUnicode_DecodeFSDefault ( expanded ) ;
2010-09-04 19:06:15 +00:00
// printf("SysPath - '%s', '%s', '%s'\n", expanded, filename, gp_GamePythonPath);
if ( PySequence_Index ( sys_path , item ) = = - 1 ) {
PyErr_Clear ( ) ; /* PySequence_Index sets a ValueError */
PyList_Insert ( sys_path , 0 , item ) ;
}
Py_DECREF ( item ) ;
}
static void initPySysObjects ( Main * maggie )
{
PyObject * sys_path = PySys_GetObject ( " path " ) ; /* should never fail */
if ( gp_OrigPythonSysPath = = NULL ) {
/* backup */
backupPySysObjects ( ) ;
}
else {
/* get the original sys path when the BGE started */
PyList_SetSlice ( sys_path , 0 , INT_MAX , gp_OrigPythonSysPath ) ;
}
Library * lib = ( Library * ) maggie - > library . first ;
while ( lib ) {
/* lib->name wont work in some cases (on win32),
* even when expanding with gp_GamePythonPath , using lib - > filename is less trouble */
initPySysObjects__append ( sys_path , lib - > filepath ) ;
lib = ( Library * ) lib - > id . next ;
}
initPySysObjects__append ( sys_path , gp_GamePythonPath ) ;
// fprintf(stderr, "\nNew Path: %d ", PyList_Size(sys_path));
// PyObject_Print(sys_path, stderr, 0);
}
static void restorePySysObjects ( void )
{
if ( gp_OrigPythonSysPath = = NULL )
return ;
PyObject * sys_path = PySys_GetObject ( " path " ) ; /* should never fail */
PyObject * sys_mods = PySys_GetObject ( " modules " ) ; /* should never fail */
/* paths */
PyList_SetSlice ( sys_path , 0 , INT_MAX , gp_OrigPythonSysPath ) ;
Py_DECREF ( gp_OrigPythonSysPath ) ;
gp_OrigPythonSysPath = NULL ;
/* modules */
PyDict_Clear ( sys_mods ) ;
PyDict_Update ( sys_mods , gp_OrigPythonSysModules ) ;
Py_DECREF ( gp_OrigPythonSysModules ) ;
gp_OrigPythonSysModules = NULL ;
// fprintf(stderr, "\nRestore Path: %d ", PyList_Size(sys_path));
// PyObject_Print(sys_path, stderr, 0);
}
/**
* Python is not initialised .
*/
PyObject * initGamePlayerPythonScripting ( const STR_String & progname , TPythonSecurityLevel level , Main * maggie , int argc , char * * argv )
{
/* Yet another gotcha in the py api
* Cant run PySys_SetArgv more then once because this adds the
* binary dir to the sys . path each time .
* Id have thaught python being totally restarted would make this ok but
* somehow it remembers the sys . path - Campbell
*/
static bool first_time = true ;
#if 0 // TODO - py3
STR_String pname = progname ;
Py_SetProgramName ( pname . Ptr ( ) ) ;
# endif
Py_NoSiteFlag = 1 ;
Py_FrozenFlag = 1 ;
Py_Initialize ( ) ;
if ( argv & & first_time ) { /* browser plugins dont currently set this */
// Until python support ascii again, we use our own.
// PySys_SetArgv(argc, argv);
int i ;
PyObject * py_argv = PyList_New ( argc ) ;
for ( i = 0 ; i < argc ; i + + )
2011-01-06 05:04:07 +00:00
PyList_SET_ITEM ( py_argv , i , PyC_UnicodeFromByte ( argv [ i ] ) ) ;
2010-09-04 19:06:15 +00:00
PySys_SetObject ( " argv " , py_argv ) ;
Py_DECREF ( py_argv ) ;
}
setSandbox ( level ) ;
initPyTypes ( ) ;
bpy_import_main_set ( maggie ) ;
initPySysObjects ( maggie ) ;
first_time = false ;
PyObjectPlus : : ClearDeprecationWarning ( ) ;
2010-09-18 19:38:27 +00:00
return PyC_DefaultNameSpace ( NULL ) ;
2010-09-04 19:06:15 +00:00
}
void exitGamePlayerPythonScripting ( )
{
2010-10-09 01:31:20 +00:00
/* Clean up the Python mouse and keyboard */
delete gp_PythonKeyboard ;
gp_PythonKeyboard = NULL ;
delete gp_PythonMouse ;
gp_PythonMouse = NULL ;
2010-09-04 19:06:15 +00:00
/* since python restarts we cant let the python backup of the sys.path hang around in a global pointer */
restorePySysObjects ( ) ; /* get back the original sys.path and clear the backup */
Py_Finalize ( ) ;
bpy_import_main_set ( NULL ) ;
PyObjectPlus : : ClearDeprecationWarning ( ) ;
}
/**
* Python is already initialized .
*/
PyObject * initGamePythonScripting ( const STR_String & progname , TPythonSecurityLevel level , Main * maggie )
{
#if 0 // XXX TODO Py3
STR_String pname = progname ;
Py_SetProgramName ( pname . Ptr ( ) ) ;
# endif
Py_NoSiteFlag = 1 ;
Py_FrozenFlag = 1 ;
setSandbox ( level ) ;
initPyTypes ( ) ;
bpy_import_main_set ( maggie ) ;
initPySysObjects ( maggie ) ;
PyObjectPlus : : NullDeprecationWarning ( ) ;
2010-09-18 19:38:27 +00:00
return PyC_DefaultNameSpace ( NULL ) ;
2010-09-04 19:06:15 +00:00
}
void exitGamePythonScripting ( )
{
2010-10-09 01:31:20 +00:00
/* Clean up the Python mouse and keyboard */
delete gp_PythonKeyboard ;
gp_PythonKeyboard = NULL ;
delete gp_PythonMouse ;
gp_PythonMouse = NULL ;
2010-09-04 19:06:15 +00:00
restorePySysObjects ( ) ; /* get back the original sys.path and clear the backup */
bpy_import_main_set ( NULL ) ;
PyObjectPlus : : ClearDeprecationWarning ( ) ;
}
/* similar to the above functions except it sets up the namespace
* and other more general things */
void setupGamePython ( KX_KetsjiEngine * ketsjiengine , KX_Scene * startscene , Main * blenderdata , PyObject * pyGlobalDict , PyObject * * gameLogic , PyObject * * gameLogic_keys , int argc , char * * argv )
{
PyObject * dictionaryobject ;
if ( argv ) /* player only */
dictionaryobject = initGamePlayerPythonScripting ( " Ketsji " , psl_Lowest , blenderdata , argc , argv ) ;
else
dictionaryobject = initGamePythonScripting ( " Ketsji " , psl_Lowest , blenderdata ) ;
ketsjiengine - > SetPyNamespace ( dictionaryobject ) ;
initRasterizer ( ketsjiengine - > GetRasterizer ( ) , ketsjiengine - > GetCanvas ( ) ) ;
* gameLogic = initGameLogic ( ketsjiengine , startscene ) ;
/* is set in initGameLogic so only set here if we want it to persist between scenes */
if ( pyGlobalDict )
PyDict_SetItemString ( PyModule_GetDict ( * gameLogic ) , " globalDict " , pyGlobalDict ) ; // Same as importing the module.
* gameLogic_keys = PyDict_Keys ( PyModule_GetDict ( * gameLogic ) ) ;
initGameKeys ( ) ;
initPythonConstraintBinding ( ) ;
initMathutils ( ) ;
initGeometry ( ) ;
initBGL ( ) ;
initBLF ( ) ;
AUD_initPython ( ) ;
initVideoTexture ( ) ;
/* could be done a lot more nicely, but for now a quick way to get bge.* working */
2011-02-27 06:19:40 +00:00
< < < < < < < . working
2010-09-04 19:06:15 +00:00
PyRun_SimpleString ( " sys = __import__('sys');mod = sys.modules['bge'] = type(sys)('bge');mod.__dict__.update({'logic':__import__('GameLogic'), 'render':__import__('Rasterizer'), 'events':__import__('GameKeys'), 'constraints':__import__('PhysicsConstraints'), 'types':__import__('GameTypes')}); " ) ;
2011-02-27 06:19:40 +00:00
= = = = = = =
2010-09-11 19:38:11 +00:00
PyRun_SimpleString ( " sys = __import__('sys');mod = sys.modules['bge'] = type(sys)('bge');mod.__dict__.update({'logic':__import__('GameLogic'), 'render':__import__('Rasterizer'), 'events':__import__('GameKeys'), 'constraints':__import__('PhysicsConstraints'), 'types':__import__('GameTypes'), 'texture':__import__('VideoTexture')}); " ) ;
2011-02-27 06:19:40 +00:00
> > > > > > > . merge - right . r35190
2010-09-04 19:06:15 +00:00
}
static struct PyModuleDef Rasterizer_module_def = {
{ } , /* m_base */
" Rasterizer " , /* m_name */
Rasterizer_module_documentation , /* m_doc */
0 , /* m_size */
rasterizer_methods , /* m_methods */
0 , /* m_reload */
0 , /* m_traverse */
0 , /* m_clear */
0 , /* m_free */
} ;
PyObject * initRasterizer ( RAS_IRasterizer * rasty , RAS_ICanvas * canvas )
{
gp_Canvas = canvas ;
gp_Rasterizer = rasty ;
PyObject * m ;
PyObject * d ;
PyObject * item ;
/* Use existing module where possible
* be careful not to init any runtime vars after this */
m = PyImport_ImportModule ( " Rasterizer " ) ;
if ( m ) {
Py_DECREF ( m ) ;
return m ;
}
else {
PyErr_Clear ( ) ;
// Create the module and add the functions
m = PyModule_Create ( & Rasterizer_module_def ) ;
PyDict_SetItemString ( PySys_GetObject ( " modules " ) , Rasterizer_module_def . m_name , m ) ;
}
// Add some symbolic constants to the module
d = PyModule_GetDict ( m ) ;
ErrorObject = PyUnicode_FromString ( " Rasterizer.error " ) ;
PyDict_SetItemString ( d , " error " , ErrorObject ) ;
Py_DECREF ( ErrorObject ) ;
/* needed for get/setMaterialType */
KX_MACRO_addTypesToDict ( d , KX_TEXFACE_MATERIAL , KX_TEXFACE_MATERIAL ) ;
KX_MACRO_addTypesToDict ( d , KX_BLENDER_MULTITEX_MATERIAL , KX_BLENDER_MULTITEX_MATERIAL ) ;
KX_MACRO_addTypesToDict ( d , KX_BLENDER_GLSL_MATERIAL , KX_BLENDER_GLSL_MATERIAL ) ;
// XXXX Add constants here
// Check for errors
if ( PyErr_Occurred ( ) )
{
Py_FatalError ( " can't initialize module Rasterizer " ) ;
}
return d ;
}
/* ------------------------------------------------------------------------- */
/* GameKeys: symbolic constants for key mapping */
/* ------------------------------------------------------------------------- */
static char GameKeys_module_documentation [ ] =
" This modules provides defines for key-codes "
;
static char gPyEventToString_doc [ ] =
" EventToString(event) - Take a valid event from the GameKeys module or Keyboard Sensor and return a name "
;
static PyObject * gPyEventToString ( PyObject * , PyObject * value )
{
PyObject * mod , * dict , * key , * val , * ret = NULL ;
Py_ssize_t pos = 0 ;
mod = PyImport_ImportModule ( " GameKeys " ) ;
if ( ! mod )
return NULL ;
dict = PyModule_GetDict ( mod ) ;
while ( PyDict_Next ( dict , & pos , & key , & val ) ) {
if ( PyObject_RichCompareBool ( value , val , Py_EQ ) ) {
ret = key ;
break ;
}
}
PyErr_Clear ( ) ; // incase there was an error clearing
Py_DECREF ( mod ) ;
if ( ! ret ) PyErr_SetString ( PyExc_ValueError , " GameKeys.EventToString(int): expected a valid int keyboard event " ) ;
else Py_INCREF ( ret ) ;
return ret ;
}
static char gPyEventToCharacter_doc [ ] =
" EventToCharacter(event, is_shift) - Take a valid event from the GameKeys module or Keyboard Sensor and return a character "
;
static PyObject * gPyEventToCharacter ( PyObject * , PyObject * args )
{
int event , shift ;
if ( ! PyArg_ParseTuple ( args , " ii:EventToCharacter " , & event , & shift ) )
return NULL ;
if ( IsPrintable ( event ) ) {
char ch [ 2 ] = { ' \0 ' , ' \0 ' } ;
ch [ 0 ] = ToCharacter ( event , ( bool ) shift ) ;
return PyUnicode_FromString ( ch ) ;
}
else {
return PyUnicode_FromString ( " " ) ;
}
}
static struct PyMethodDef gamekeys_methods [ ] = {
{ " EventToCharacter " , ( PyCFunction ) gPyEventToCharacter , METH_VARARGS , ( const char * ) gPyEventToCharacter_doc } ,
{ " EventToString " , ( PyCFunction ) gPyEventToString , METH_O , ( const char * ) gPyEventToString_doc } ,
{ NULL , ( PyCFunction ) NULL , 0 , NULL }
} ;
static struct PyModuleDef GameKeys_module_def = {
{ } , /* m_base */
" GameKeys " , /* m_name */
GameKeys_module_documentation , /* m_doc */
0 , /* m_size */
gamekeys_methods , /* m_methods */
0 , /* m_reload */
0 , /* m_traverse */
0 , /* m_clear */
0 , /* m_free */
} ;
PyObject * initGameKeys ( )
{
PyObject * m ;
PyObject * d ;
PyObject * item ;
/* Use existing module where possible */
m = PyImport_ImportModule ( " GameKeys " ) ;
if ( m ) {
Py_DECREF ( m ) ;
return m ;
}
else {
PyErr_Clear ( ) ;
// Create the module and add the functions
m = PyModule_Create ( & GameKeys_module_def ) ;
PyDict_SetItemString ( PySys_GetObject ( " modules " ) , GameKeys_module_def . m_name , m ) ;
}
// Add some symbolic constants to the module
d = PyModule_GetDict ( m ) ;
// XXXX Add constants here
KX_MACRO_addTypesToDict ( d , AKEY , SCA_IInputDevice : : KX_AKEY ) ;
KX_MACRO_addTypesToDict ( d , BKEY , SCA_IInputDevice : : KX_BKEY ) ;
KX_MACRO_addTypesToDict ( d , CKEY , SCA_IInputDevice : : KX_CKEY ) ;
KX_MACRO_addTypesToDict ( d , DKEY , SCA_IInputDevice : : KX_DKEY ) ;
KX_MACRO_addTypesToDict ( d , EKEY , SCA_IInputDevice : : KX_EKEY ) ;
KX_MACRO_addTypesToDict ( d , FKEY , SCA_IInputDevice : : KX_FKEY ) ;
KX_MACRO_addTypesToDict ( d , GKEY , SCA_IInputDevice : : KX_GKEY ) ;
KX_MACRO_addTypesToDict ( d , HKEY , SCA_IInputDevice : : KX_HKEY ) ;
KX_MACRO_addTypesToDict ( d , IKEY , SCA_IInputDevice : : KX_IKEY ) ;
KX_MACRO_addTypesToDict ( d , JKEY , SCA_IInputDevice : : KX_JKEY ) ;
KX_MACRO_addTypesToDict ( d , KKEY , SCA_IInputDevice : : KX_KKEY ) ;
KX_MACRO_addTypesToDict ( d , LKEY , SCA_IInputDevice : : KX_LKEY ) ;
KX_MACRO_addTypesToDict ( d , MKEY , SCA_IInputDevice : : KX_MKEY ) ;
KX_MACRO_addTypesToDict ( d , NKEY , SCA_IInputDevice : : KX_NKEY ) ;
KX_MACRO_addTypesToDict ( d , OKEY , SCA_IInputDevice : : KX_OKEY ) ;
KX_MACRO_addTypesToDict ( d , PKEY , SCA_IInputDevice : : KX_PKEY ) ;
KX_MACRO_addTypesToDict ( d , QKEY , SCA_IInputDevice : : KX_QKEY ) ;
KX_MACRO_addTypesToDict ( d , RKEY , SCA_IInputDevice : : KX_RKEY ) ;
KX_MACRO_addTypesToDict ( d , SKEY , SCA_IInputDevice : : KX_SKEY ) ;
KX_MACRO_addTypesToDict ( d , TKEY , SCA_IInputDevice : : KX_TKEY ) ;
KX_MACRO_addTypesToDict ( d , UKEY , SCA_IInputDevice : : KX_UKEY ) ;
KX_MACRO_addTypesToDict ( d , VKEY , SCA_IInputDevice : : KX_VKEY ) ;
KX_MACRO_addTypesToDict ( d , WKEY , SCA_IInputDevice : : KX_WKEY ) ;
KX_MACRO_addTypesToDict ( d , XKEY , SCA_IInputDevice : : KX_XKEY ) ;
KX_MACRO_addTypesToDict ( d , YKEY , SCA_IInputDevice : : KX_YKEY ) ;
KX_MACRO_addTypesToDict ( d , ZKEY , SCA_IInputDevice : : KX_ZKEY ) ;
KX_MACRO_addTypesToDict ( d , ZEROKEY , SCA_IInputDevice : : KX_ZEROKEY ) ;
KX_MACRO_addTypesToDict ( d , ONEKEY , SCA_IInputDevice : : KX_ONEKEY ) ;
KX_MACRO_addTypesToDict ( d , TWOKEY , SCA_IInputDevice : : KX_TWOKEY ) ;
KX_MACRO_addTypesToDict ( d , THREEKEY , SCA_IInputDevice : : KX_THREEKEY ) ;
KX_MACRO_addTypesToDict ( d , FOURKEY , SCA_IInputDevice : : KX_FOURKEY ) ;
KX_MACRO_addTypesToDict ( d , FIVEKEY , SCA_IInputDevice : : KX_FIVEKEY ) ;
KX_MACRO_addTypesToDict ( d , SIXKEY , SCA_IInputDevice : : KX_SIXKEY ) ;
KX_MACRO_addTypesToDict ( d , SEVENKEY , SCA_IInputDevice : : KX_SEVENKEY ) ;
KX_MACRO_addTypesToDict ( d , EIGHTKEY , SCA_IInputDevice : : KX_EIGHTKEY ) ;
KX_MACRO_addTypesToDict ( d , NINEKEY , SCA_IInputDevice : : KX_NINEKEY ) ;
KX_MACRO_addTypesToDict ( d , CAPSLOCKKEY , SCA_IInputDevice : : KX_CAPSLOCKKEY ) ;
KX_MACRO_addTypesToDict ( d , LEFTCTRLKEY , SCA_IInputDevice : : KX_LEFTCTRLKEY ) ;
KX_MACRO_addTypesToDict ( d , LEFTALTKEY , SCA_IInputDevice : : KX_LEFTALTKEY ) ;
KX_MACRO_addTypesToDict ( d , RIGHTALTKEY , SCA_IInputDevice : : KX_RIGHTALTKEY ) ;
KX_MACRO_addTypesToDict ( d , RIGHTCTRLKEY , SCA_IInputDevice : : KX_RIGHTCTRLKEY ) ;
KX_MACRO_addTypesToDict ( d , RIGHTSHIFTKEY , SCA_IInputDevice : : KX_RIGHTSHIFTKEY ) ;
KX_MACRO_addTypesToDict ( d , LEFTSHIFTKEY , SCA_IInputDevice : : KX_LEFTSHIFTKEY ) ;
KX_MACRO_addTypesToDict ( d , ESCKEY , SCA_IInputDevice : : KX_ESCKEY ) ;
KX_MACRO_addTypesToDict ( d , TABKEY , SCA_IInputDevice : : KX_TABKEY ) ;
KX_MACRO_addTypesToDict ( d , RETKEY , SCA_IInputDevice : : KX_RETKEY ) ;
2010-10-05 05:44:15 +00:00
KX_MACRO_addTypesToDict ( d , ENTERKEY , SCA_IInputDevice : : KX_RETKEY ) ;
2010-09-04 19:06:15 +00:00
KX_MACRO_addTypesToDict ( d , SPACEKEY , SCA_IInputDevice : : KX_SPACEKEY ) ;
KX_MACRO_addTypesToDict ( d , LINEFEEDKEY , SCA_IInputDevice : : KX_LINEFEEDKEY ) ;
KX_MACRO_addTypesToDict ( d , BACKSPACEKEY , SCA_IInputDevice : : KX_BACKSPACEKEY ) ;
KX_MACRO_addTypesToDict ( d , DELKEY , SCA_IInputDevice : : KX_DELKEY ) ;
KX_MACRO_addTypesToDict ( d , SEMICOLONKEY , SCA_IInputDevice : : KX_SEMICOLONKEY ) ;
KX_MACRO_addTypesToDict ( d , PERIODKEY , SCA_IInputDevice : : KX_PERIODKEY ) ;
KX_MACRO_addTypesToDict ( d , COMMAKEY , SCA_IInputDevice : : KX_COMMAKEY ) ;
KX_MACRO_addTypesToDict ( d , QUOTEKEY , SCA_IInputDevice : : KX_QUOTEKEY ) ;
KX_MACRO_addTypesToDict ( d , ACCENTGRAVEKEY , SCA_IInputDevice : : KX_ACCENTGRAVEKEY ) ;
KX_MACRO_addTypesToDict ( d , MINUSKEY , SCA_IInputDevice : : KX_MINUSKEY ) ;
KX_MACRO_addTypesToDict ( d , SLASHKEY , SCA_IInputDevice : : KX_SLASHKEY ) ;
KX_MACRO_addTypesToDict ( d , BACKSLASHKEY , SCA_IInputDevice : : KX_BACKSLASHKEY ) ;
KX_MACRO_addTypesToDict ( d , EQUALKEY , SCA_IInputDevice : : KX_EQUALKEY ) ;
KX_MACRO_addTypesToDict ( d , LEFTBRACKETKEY , SCA_IInputDevice : : KX_LEFTBRACKETKEY ) ;
KX_MACRO_addTypesToDict ( d , RIGHTBRACKETKEY , SCA_IInputDevice : : KX_RIGHTBRACKETKEY ) ;
KX_MACRO_addTypesToDict ( d , LEFTARROWKEY , SCA_IInputDevice : : KX_LEFTARROWKEY ) ;
KX_MACRO_addTypesToDict ( d , DOWNARROWKEY , SCA_IInputDevice : : KX_DOWNARROWKEY ) ;
KX_MACRO_addTypesToDict ( d , RIGHTARROWKEY , SCA_IInputDevice : : KX_RIGHTARROWKEY ) ;
KX_MACRO_addTypesToDict ( d , UPARROWKEY , SCA_IInputDevice : : KX_UPARROWKEY ) ;
KX_MACRO_addTypesToDict ( d , PAD2 , SCA_IInputDevice : : KX_PAD2 ) ;
KX_MACRO_addTypesToDict ( d , PAD4 , SCA_IInputDevice : : KX_PAD4 ) ;
KX_MACRO_addTypesToDict ( d , PAD6 , SCA_IInputDevice : : KX_PAD6 ) ;
KX_MACRO_addTypesToDict ( d , PAD8 , SCA_IInputDevice : : KX_PAD8 ) ;
KX_MACRO_addTypesToDict ( d , PAD1 , SCA_IInputDevice : : KX_PAD1 ) ;
KX_MACRO_addTypesToDict ( d , PAD3 , SCA_IInputDevice : : KX_PAD3 ) ;
KX_MACRO_addTypesToDict ( d , PAD5 , SCA_IInputDevice : : KX_PAD5 ) ;
KX_MACRO_addTypesToDict ( d , PAD7 , SCA_IInputDevice : : KX_PAD7 ) ;
KX_MACRO_addTypesToDict ( d , PAD9 , SCA_IInputDevice : : KX_PAD9 ) ;
KX_MACRO_addTypesToDict ( d , PADPERIOD , SCA_IInputDevice : : KX_PADPERIOD ) ;
KX_MACRO_addTypesToDict ( d , PADSLASHKEY , SCA_IInputDevice : : KX_PADSLASHKEY ) ;
KX_MACRO_addTypesToDict ( d , PADASTERKEY , SCA_IInputDevice : : KX_PADASTERKEY ) ;
KX_MACRO_addTypesToDict ( d , PAD0 , SCA_IInputDevice : : KX_PAD0 ) ;
KX_MACRO_addTypesToDict ( d , PADMINUS , SCA_IInputDevice : : KX_PADMINUS ) ;
KX_MACRO_addTypesToDict ( d , PADENTER , SCA_IInputDevice : : KX_PADENTER ) ;
KX_MACRO_addTypesToDict ( d , PADPLUSKEY , SCA_IInputDevice : : KX_PADPLUSKEY ) ;
KX_MACRO_addTypesToDict ( d , F1KEY , SCA_IInputDevice : : KX_F1KEY ) ;
KX_MACRO_addTypesToDict ( d , F2KEY , SCA_IInputDevice : : KX_F2KEY ) ;
KX_MACRO_addTypesToDict ( d , F3KEY , SCA_IInputDevice : : KX_F3KEY ) ;
KX_MACRO_addTypesToDict ( d , F4KEY , SCA_IInputDevice : : KX_F4KEY ) ;
KX_MACRO_addTypesToDict ( d , F5KEY , SCA_IInputDevice : : KX_F5KEY ) ;
KX_MACRO_addTypesToDict ( d , F6KEY , SCA_IInputDevice : : KX_F6KEY ) ;
KX_MACRO_addTypesToDict ( d , F7KEY , SCA_IInputDevice : : KX_F7KEY ) ;
KX_MACRO_addTypesToDict ( d , F8KEY , SCA_IInputDevice : : KX_F8KEY ) ;
KX_MACRO_addTypesToDict ( d , F9KEY , SCA_IInputDevice : : KX_F9KEY ) ;
KX_MACRO_addTypesToDict ( d , F10KEY , SCA_IInputDevice : : KX_F10KEY ) ;
KX_MACRO_addTypesToDict ( d , F11KEY , SCA_IInputDevice : : KX_F11KEY ) ;
KX_MACRO_addTypesToDict ( d , F12KEY , SCA_IInputDevice : : KX_F12KEY ) ;
KX_MACRO_addTypesToDict ( d , F13KEY , SCA_IInputDevice : : KX_F13KEY ) ;
KX_MACRO_addTypesToDict ( d , F14KEY , SCA_IInputDevice : : KX_F14KEY ) ;
KX_MACRO_addTypesToDict ( d , F15KEY , SCA_IInputDevice : : KX_F15KEY ) ;
KX_MACRO_addTypesToDict ( d , F16KEY , SCA_IInputDevice : : KX_F16KEY ) ;
KX_MACRO_addTypesToDict ( d , F17KEY , SCA_IInputDevice : : KX_F17KEY ) ;
KX_MACRO_addTypesToDict ( d , F18KEY , SCA_IInputDevice : : KX_F18KEY ) ;
KX_MACRO_addTypesToDict ( d , F19KEY , SCA_IInputDevice : : KX_F19KEY ) ;
KX_MACRO_addTypesToDict ( d , PAUSEKEY , SCA_IInputDevice : : KX_PAUSEKEY ) ;
KX_MACRO_addTypesToDict ( d , INSERTKEY , SCA_IInputDevice : : KX_INSERTKEY ) ;
KX_MACRO_addTypesToDict ( d , HOMEKEY , SCA_IInputDevice : : KX_HOMEKEY ) ;
KX_MACRO_addTypesToDict ( d , PAGEUPKEY , SCA_IInputDevice : : KX_PAGEUPKEY ) ;
KX_MACRO_addTypesToDict ( d , PAGEDOWNKEY , SCA_IInputDevice : : KX_PAGEDOWNKEY ) ;
KX_MACRO_addTypesToDict ( d , ENDKEY , SCA_IInputDevice : : KX_ENDKEY ) ;
// MOUSE
KX_MACRO_addTypesToDict ( d , LEFTMOUSE , SCA_IInputDevice : : KX_LEFTMOUSE ) ;
KX_MACRO_addTypesToDict ( d , MIDDLEMOUSE , SCA_IInputDevice : : KX_MIDDLEMOUSE ) ;
KX_MACRO_addTypesToDict ( d , RIGHTMOUSE , SCA_IInputDevice : : KX_RIGHTMOUSE ) ;
KX_MACRO_addTypesToDict ( d , WHEELUPMOUSE , SCA_IInputDevice : : KX_WHEELUPMOUSE ) ;
KX_MACRO_addTypesToDict ( d , WHEELDOWNMOUSE , SCA_IInputDevice : : KX_WHEELDOWNMOUSE ) ;
KX_MACRO_addTypesToDict ( d , MOUSEX , SCA_IInputDevice : : KX_MOUSEX ) ;
KX_MACRO_addTypesToDict ( d , MOUSEY , SCA_IInputDevice : : KX_MOUSEY ) ;
// Check for errors
if ( PyErr_Occurred ( ) )
{
Py_FatalError ( " can't initialize module GameKeys " ) ;
}
return d ;
}
PyObject * initMathutils ( )
{
2010-10-30 02:59:42 +00:00
return BPyInit_mathutils ( ) ;
2010-09-04 19:06:15 +00:00
}
PyObject * initGeometry ( )
{
2010-10-30 02:59:42 +00:00
return BPyInit_mathutils_geometry ( ) ;
2010-09-04 19:06:15 +00:00
}
PyObject * initBGL ( )
{
2010-10-30 02:59:42 +00:00
return BPyInit_bgl ( ) ;
2010-09-04 19:06:15 +00:00
}
PyObject * initBLF ( )
{
2010-10-30 02:59:42 +00:00
return BPyInit_blf ( ) ;
2010-09-04 19:06:15 +00:00
}
// utility function for loading and saving the globalDict
int saveGamePythonConfig ( char * * marshal_buffer )
{
int marshal_length = 0 ;
PyObject * gameLogic = PyImport_ImportModule ( " GameLogic " ) ;
if ( gameLogic ) {
PyObject * pyGlobalDict = PyDict_GetItemString ( PyModule_GetDict ( gameLogic ) , " globalDict " ) ; // Same as importing the module
if ( pyGlobalDict ) {
# ifdef Py_MARSHAL_VERSION
PyObject * pyGlobalDictMarshal = PyMarshal_WriteObjectToString ( pyGlobalDict , 2 ) ; // Py_MARSHAL_VERSION == 2 as of Py2.5
# else
PyObject * pyGlobalDictMarshal = PyMarshal_WriteObjectToString ( pyGlobalDict ) ;
# endif
if ( pyGlobalDictMarshal ) {
// for testing only
// PyObject_Print(pyGlobalDictMarshal, stderr, 0);
char * marshal_cstring ;
marshal_cstring = PyBytes_AsString ( pyGlobalDictMarshal ) ; // py3 uses byte arrays
marshal_length = PyBytes_Size ( pyGlobalDictMarshal ) ;
* marshal_buffer = new char [ marshal_length + 1 ] ;
memcpy ( * marshal_buffer , marshal_cstring , marshal_length ) ;
Py_DECREF ( pyGlobalDictMarshal ) ;
} else {
printf ( " Error, bge.logic.globalDict could not be marshal'd \n " ) ;
}
} else {
printf ( " Error, bge.logic.globalDict was removed \n " ) ;
}
Py_DECREF ( gameLogic ) ;
} else {
PyErr_Clear ( ) ;
printf ( " Error, bge.logic failed to import bge.logic.globalDict will be lost \n " ) ;
}
return marshal_length ;
}
int loadGamePythonConfig ( char * marshal_buffer , int marshal_length )
{
/* Restore the dict */
if ( marshal_buffer ) {
PyObject * gameLogic = PyImport_ImportModule ( " GameLogic " ) ;
if ( gameLogic ) {
PyObject * pyGlobalDict = PyMarshal_ReadObjectFromString ( marshal_buffer , marshal_length ) ;
if ( pyGlobalDict ) {
PyObject * pyGlobalDict_orig = PyDict_GetItemString ( PyModule_GetDict ( gameLogic ) , " globalDict " ) ; // Same as importing the module.
if ( pyGlobalDict_orig ) {
PyDict_Clear ( pyGlobalDict_orig ) ;
PyDict_Update ( pyGlobalDict_orig , pyGlobalDict ) ;
} else {
/* this should not happen, but cant find the original globalDict, just assign it then */
PyDict_SetItemString ( PyModule_GetDict ( gameLogic ) , " globalDict " , pyGlobalDict ) ; // Same as importing the module.
}
Py_DECREF ( gameLogic ) ;
Py_DECREF ( pyGlobalDict ) ;
return 1 ;
} else {
Py_DECREF ( gameLogic ) ;
PyErr_Clear ( ) ;
printf ( " Error could not marshall string \n " ) ;
}
} else {
PyErr_Clear ( ) ;
printf ( " Error, bge.logic failed to import bge.logic.globalDict will be lost \n " ) ;
}
}
return 0 ;
}
void pathGamePythonConfig ( char * path )
{
int len = strlen ( gp_GamePythonPathOrig ) ; // Always use the first loaded blend filename
BLI_strncpy ( path , gp_GamePythonPathOrig , sizeof ( gp_GamePythonPathOrig ) ) ;
/* replace extension */
if ( BLI_testextensie ( path , " .blend " ) ) {
strcpy ( path + ( len - 6 ) , " .bgeconf " ) ;
} else {
strcpy ( path + len , " .bgeconf " ) ;
}
}
void setGamePythonPath ( char * path )
{
BLI_strncpy ( gp_GamePythonPath , path , sizeof ( gp_GamePythonPath ) ) ;
BLI_cleanup_file ( NULL , gp_GamePythonPath ) ; /* not absolutely needed but makes resolving path problems less confusing later */
if ( gp_GamePythonPathOrig [ 0 ] = = ' \0 ' )
BLI_strncpy ( gp_GamePythonPathOrig , path , sizeof ( gp_GamePythonPathOrig ) ) ;
}
// we need this so while blender is open (not blenderplayer)
// loading new blendfiles will reset this on starting the
// engine but loading blend files within the BGE wont overwrite gp_GamePythonPathOrig
void resetGamePythonPath ( )
{
gp_GamePythonPathOrig [ 0 ] = ' \0 ' ;
}
2010-10-31 04:11:39 +00:00
# endif // WITH_PYTHON