Blender  V2.59
KX_PythonInit.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: KX_PythonInit.cpp 38409 2011-07-15 04:01:47Z campbellbarton $
00003  *
00004  * ***** BEGIN GPL LICENSE BLOCK *****
00005  *
00006  * This program is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU General Public License
00008  * as published by the Free Software Foundation; either version 2
00009  * of the License, or (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software Foundation,
00018  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019  *
00020  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
00021  * All rights reserved.
00022  *
00023  * The Original Code is: all of this file.
00024  *
00025  * Contributor(s): none yet.
00026  *
00027  * ***** END GPL LICENSE BLOCK *****
00028  * Initialize Python thingies.
00029  */
00030 
00036 #include "GL/glew.h"
00037 
00038 #if defined(WIN32) && !defined(FREE_WINDOWS)
00039 #pragma warning (disable : 4786)
00040 #endif //WIN32
00041 
00042 #ifdef WITH_PYTHON
00043 
00044 #ifdef _POSIX_C_SOURCE
00045 #undef _POSIX_C_SOURCE
00046 #endif
00047 
00048 #ifdef _XOPEN_SOURCE
00049 #undef _XOPEN_SOURCE
00050 #endif
00051 
00052 #include <Python.h>
00053 
00054 extern "C" {
00055         #include "bpy_internal_import.h"  /* from the blender python api, but we want to import text too! */
00056         #include "py_capi_utils.h"
00057         #include "mathutils.h" // 'mathutils' module copied here so the blenderlayer can use.
00058         #include "bgl.h"
00059         #include "blf_py_api.h"
00060 
00061         #include "marshal.h" /* python header for loading/saving dicts */
00062 }
00063 
00064 #include "AUD_PyInit.h"
00065 
00066 #endif
00067 
00068 #include "KX_PythonInit.h"
00069 
00070 // directory header for py function getBlendFileList
00071 #ifndef WIN32
00072   #include <dirent.h>
00073   #include <stdlib.h>
00074 #else
00075   #include <io.h>
00076   #include "BLI_winstuff.h"
00077 #endif
00078 
00079 //python physics binding
00080 #include "KX_PyConstraintBinding.h"
00081 
00082 #include "KX_KetsjiEngine.h"
00083 #include "KX_RadarSensor.h"
00084 #include "KX_RaySensor.h"
00085 #include "KX_ArmatureSensor.h"
00086 #include "KX_SceneActuator.h"
00087 #include "KX_GameActuator.h"
00088 #include "KX_ParentActuator.h"
00089 #include "KX_SCA_DynamicActuator.h"
00090 
00091 #include "SCA_IInputDevice.h"
00092 #include "SCA_PropertySensor.h"
00093 #include "SCA_RandomActuator.h"
00094 #include "SCA_KeyboardSensor.h" /* IsPrintable, ToCharacter */
00095 #include "SCA_PythonKeyboard.h"
00096 #include "SCA_PythonMouse.h"
00097 #include "KX_ConstraintActuator.h"
00098 #include "KX_IpoActuator.h"
00099 #include "KX_SoundActuator.h"
00100 #include "KX_StateActuator.h"
00101 #include "BL_ActionActuator.h"
00102 #include "BL_ArmatureObject.h"
00103 #include "RAS_IRasterizer.h"
00104 #include "RAS_ICanvas.h"
00105 #include "RAS_BucketManager.h"
00106 #include "RAS_2DFilterManager.h"
00107 #include "MT_Vector3.h"
00108 #include "MT_Point3.h"
00109 #include "ListValue.h"
00110 #include "InputParser.h"
00111 #include "KX_Scene.h"
00112 
00113 #include "NG_NetworkScene.h" //Needed for sendMessage()
00114 
00115 #include "BL_Shader.h"
00116 
00117 #include "KX_PyMath.h"
00118 
00119 #include "PyObjectPlus.h"
00120 
00121 #include "KX_PythonInitTypes.h" 
00122 
00123 /* we only need this to get a list of libraries from the main struct */
00124 #include "DNA_ID.h"
00125 #include "DNA_scene_types.h"
00126 
00127 #include "PHY_IPhysicsEnvironment.h"
00128 #include "BKE_main.h"
00129 #include "BKE_utildefines.h"
00130 #include "BKE_global.h"
00131 #include "BLI_blenlib.h"
00132 #include "GPU_material.h"
00133 #include "MEM_guardedalloc.h"
00134 
00135 /* for converting new scenes */
00136 #include "KX_BlenderSceneConverter.h"
00137 #include "KX_MeshProxy.h" /* for creating a new library of mesh objects */
00138 extern "C" {
00139         #include "BKE_idcode.h"
00140 }
00141 
00142 #include "NG_NetworkScene.h" //Needed for sendMessage()
00143 
00144 // 'local' copy of canvas ptr, for window height/width python scripts
00145 
00146 #ifdef WITH_PYTHON
00147 
00148 static RAS_ICanvas* gp_Canvas = NULL;
00149 static char gp_GamePythonPath[FILE_MAXDIR + FILE_MAXFILE] = "";
00150 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
00151 
00152 static SCA_PythonKeyboard* gp_PythonKeyboard = NULL;
00153 static SCA_PythonMouse* gp_PythonMouse = NULL;
00154 #endif // WITH_PYTHON
00155 
00156 static KX_Scene*        gp_KetsjiScene = NULL;
00157 static KX_KetsjiEngine* gp_KetsjiEngine = NULL;
00158 static RAS_IRasterizer* gp_Rasterizer = NULL;
00159 
00160 
00161 void KX_SetActiveScene(class KX_Scene* scene)
00162 {
00163         gp_KetsjiScene = scene;
00164 }
00165 
00166 class KX_Scene* KX_GetActiveScene()
00167 {
00168         return gp_KetsjiScene;
00169 }
00170 
00171 class KX_KetsjiEngine* KX_GetActiveEngine()
00172 {
00173         return gp_KetsjiEngine;
00174 }
00175 
00176 /* why is this in python? */
00177 void    KX_RasterizerDrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color)
00178 {
00179         if (gp_Rasterizer)
00180                 gp_Rasterizer->DrawDebugLine(from,to,color);
00181 }
00182 
00183 #ifdef WITH_PYTHON
00184 
00185 static PyObject *gp_OrigPythonSysPath= NULL;
00186 static PyObject *gp_OrigPythonSysModules= NULL;
00187 
00188 /* Macro for building the keyboard translation */
00189 //#define KX_MACRO_addToDict(dict, name) PyDict_SetItemString(dict, #name, PyLong_FromSsize_t(SCA_IInputDevice::KX_##name))
00190 #define KX_MACRO_addToDict(dict, name) PyDict_SetItemString(dict, #name, item=PyLong_FromSsize_t(name)); Py_DECREF(item)
00191 /* For the defines for types from logic bricks, we do stuff explicitly... */
00192 #define KX_MACRO_addTypesToDict(dict, name, name2) PyDict_SetItemString(dict, #name, item=PyLong_FromSsize_t(name2)); Py_DECREF(item)
00193 
00194 
00195 // temporarily python stuff, will be put in another place later !
00196 #include "KX_Python.h"
00197 #include "SCA_PythonController.h"
00198 // List of methods defined in the module
00199 
00200 static PyObject* ErrorObject;
00201 static const char *gPyGetRandomFloat_doc="getRandomFloat returns a random floating point value in the range [0..1]";
00202 
00203 static PyObject* gPyGetRandomFloat(PyObject*)
00204 {
00205         return PyFloat_FromDouble(MT_random());
00206 }
00207 
00208 static PyObject* gPySetGravity(PyObject*, PyObject* value)
00209 {
00210         MT_Vector3 vec;
00211         if (!PyVecTo(value, vec))
00212                 return NULL;
00213 
00214         if (gp_KetsjiScene)
00215                 gp_KetsjiScene->SetGravity(vec);
00216         
00217         Py_RETURN_NONE;
00218 }
00219 
00220 static char gPyExpandPath_doc[] =
00221 "(path) - Converts a blender internal path into a proper file system path.\n\
00222 path - the string path to convert.\n\n\
00223 Use / as directory separator in path\n\
00224 You can use '//' at the start of the string to define a relative path;\n\
00225 Blender replaces that string by the directory of the startup .blend or runtime\n\
00226 file to make a full path name (doesn't change during the game, even if you load\n\
00227 other .blend).\n\
00228 The function also converts the directory separator to the local file system format.";
00229 
00230 static PyObject* gPyExpandPath(PyObject*, PyObject* args)
00231 {
00232         char expanded[FILE_MAXDIR + FILE_MAXFILE];
00233         char* filename;
00234         
00235         if (!PyArg_ParseTuple(args,"s:ExpandPath",&filename))
00236                 return NULL;
00237 
00238         BLI_strncpy(expanded, filename, FILE_MAXDIR + FILE_MAXFILE);
00239         BLI_path_abs(expanded, gp_GamePythonPath);
00240         return PyUnicode_DecodeFSDefault(expanded);
00241 }
00242 
00243 static char gPyStartGame_doc[] =
00244 "startGame(blend)\n\
00245 Loads the blend file";
00246 
00247 static PyObject* gPyStartGame(PyObject*, PyObject* args)
00248 {
00249         char* blendfile;
00250 
00251         if (!PyArg_ParseTuple(args, "s:startGame", &blendfile))
00252                 return NULL;
00253 
00254         gp_KetsjiEngine->RequestExit(KX_EXIT_REQUEST_START_OTHER_GAME);
00255         gp_KetsjiEngine->SetNameNextGame(blendfile);
00256 
00257         Py_RETURN_NONE;
00258 }
00259 
00260 static char gPyEndGame_doc[] =
00261 "endGame()\n\
00262 Ends the current game";
00263 
00264 static PyObject* gPyEndGame(PyObject*)
00265 {
00266         gp_KetsjiEngine->RequestExit(KX_EXIT_REQUEST_QUIT_GAME);
00267 
00268         //printf("%s\n", gp_GamePythonPath);
00269 
00270         Py_RETURN_NONE;
00271 }
00272 
00273 static char gPyRestartGame_doc[] =
00274 "restartGame()\n\
00275 Restarts the current game by reloading the .blend file";
00276 
00277 static PyObject* gPyRestartGame(PyObject*)
00278 {
00279         gp_KetsjiEngine->RequestExit(KX_EXIT_REQUEST_RESTART_GAME);
00280         gp_KetsjiEngine->SetNameNextGame(gp_GamePythonPath);
00281 
00282         Py_RETURN_NONE;
00283 }
00284 
00285 static char gPySaveGlobalDict_doc[] =
00286         "saveGlobalDict()\n"
00287         "Saves bge.logic.globalDict to a file";
00288 
00289 static PyObject* gPySaveGlobalDict(PyObject*)
00290 {
00291         char marshal_path[512];
00292         char *marshal_buffer = NULL;
00293         unsigned int marshal_length;
00294         FILE *fp = NULL;
00295 
00296         pathGamePythonConfig(marshal_path);
00297         marshal_length = saveGamePythonConfig(&marshal_buffer);
00298 
00299         if (marshal_length && marshal_buffer)
00300         {
00301                 fp = fopen(marshal_path, "wb");
00302 
00303                 if (fp)
00304                 {
00305                         if (fwrite(marshal_buffer, 1, marshal_length, fp) != marshal_length)
00306                                 printf("Warning: could not write marshal data\n");
00307 
00308                         fclose(fp);
00309                 } else {
00310                         printf("Warning: could not open marshal file\n");
00311                 }
00312         } else {
00313                 printf("Warning: could not create marshal buffer\n");
00314         }
00315 
00316         if (marshal_buffer)
00317                 delete [] marshal_buffer;
00318 
00319         Py_RETURN_NONE;
00320 }
00321 
00322 static char gPyLoadGlobalDict_doc[] =
00323         "LoadGlobalDict()\n"
00324         "Loads bge.logic.globalDict from a file";
00325 
00326 static PyObject* gPyLoadGlobalDict(PyObject*)
00327 {
00328         char marshal_path[512];
00329         char *marshal_buffer = NULL;
00330         size_t marshal_length;
00331         FILE *fp = NULL;
00332         int result;
00333 
00334         pathGamePythonConfig(marshal_path);
00335 
00336         fp = fopen(marshal_path, "rb");
00337 
00338         if (fp) {
00339                 // obtain file size:
00340                 fseek (fp, 0, SEEK_END);
00341                 marshal_length = (size_t)ftell(fp);
00342                 rewind(fp);
00343 
00344                 marshal_buffer = (char*)malloc (sizeof(char)*marshal_length);
00345 
00346                 result = fread(marshal_buffer, 1, marshal_length, fp);
00347 
00348                 if (result == marshal_length) {
00349                         loadGamePythonConfig(marshal_buffer, marshal_length);
00350                 } else {
00351                         printf("Warning: could not read all of '%s'\n", marshal_path);
00352                 }
00353 
00354                 free(marshal_buffer);
00355                 fclose(fp);
00356         } else {
00357                 printf("Warning: could not open '%s'\n", marshal_path);
00358         }
00359 
00360         Py_RETURN_NONE;
00361 }
00362 
00363 static char gPySendMessage_doc[] = 
00364 "sendMessage(subject, [body, to, from])\n\
00365 sends a message in same manner as a message actuator\
00366 subject = Subject of the message\
00367 body = Message body\
00368 to = Name of object to send the message to\
00369 from = Name of object to send the string from";
00370 
00371 static PyObject* gPySendMessage(PyObject*, PyObject* args)
00372 {
00373         char* subject;
00374         char* body = (char *)"";
00375         char* to = (char *)"";
00376         char* from = (char *)"";
00377 
00378         if (!PyArg_ParseTuple(args, "s|sss:sendMessage", &subject, &body, &to, &from))
00379                 return NULL;
00380 
00381         gp_KetsjiScene->GetNetworkScene()->SendMessage(to, from, subject, body);
00382 
00383         Py_RETURN_NONE;
00384 }
00385 
00386 // this gets a pointer to an array filled with floats
00387 static PyObject* gPyGetSpectrum(PyObject*)
00388 {
00389         PyObject* resultlist = PyList_New(512);
00390 
00391         for (int index = 0; index < 512; index++)
00392         {
00393                 PyList_SET_ITEM(resultlist, index, PyFloat_FromDouble(0.0));
00394         }
00395 
00396         return resultlist;
00397 }
00398 
00399 static PyObject* gPySetLogicTicRate(PyObject*, PyObject* args)
00400 {
00401         float ticrate;
00402         if (!PyArg_ParseTuple(args, "f:setLogicTicRate", &ticrate))
00403                 return NULL;
00404         
00405         KX_KetsjiEngine::SetTicRate(ticrate);
00406         Py_RETURN_NONE;
00407 }
00408 
00409 static PyObject* gPyGetLogicTicRate(PyObject*)
00410 {
00411         return PyFloat_FromDouble(KX_KetsjiEngine::GetTicRate());
00412 }
00413 
00414 static PyObject* gPySetMaxLogicFrame(PyObject*, PyObject* args)
00415 {
00416         int frame;
00417         if (!PyArg_ParseTuple(args, "i:setMaxLogicFrame", &frame))
00418                 return NULL;
00419         
00420         KX_KetsjiEngine::SetMaxLogicFrame(frame);
00421         Py_RETURN_NONE;
00422 }
00423 
00424 static PyObject* gPyGetMaxLogicFrame(PyObject*)
00425 {
00426         return PyLong_FromSsize_t(KX_KetsjiEngine::GetMaxLogicFrame());
00427 }
00428 
00429 static PyObject* gPySetMaxPhysicsFrame(PyObject*, PyObject* args)
00430 {
00431         int frame;
00432         if (!PyArg_ParseTuple(args, "i:setMaxPhysicsFrame", &frame))
00433                 return NULL;
00434         
00435         KX_KetsjiEngine::SetMaxPhysicsFrame(frame);
00436         Py_RETURN_NONE;
00437 }
00438 
00439 static PyObject* gPyGetMaxPhysicsFrame(PyObject*)
00440 {
00441         return PyLong_FromSsize_t(KX_KetsjiEngine::GetMaxPhysicsFrame());
00442 }
00443 
00444 static PyObject* gPySetPhysicsTicRate(PyObject*, PyObject* args)
00445 {
00446         float ticrate;
00447         if (!PyArg_ParseTuple(args, "f:setPhysicsTicRate", &ticrate))
00448                 return NULL;
00449         
00450         PHY_GetActiveEnvironment()->setFixedTimeStep(true,ticrate);
00451         Py_RETURN_NONE;
00452 }
00453 #if 0 // unused
00454 static PyObject* gPySetPhysicsDebug(PyObject*, PyObject* args)
00455 {
00456         int debugMode;
00457         if (!PyArg_ParseTuple(args, "i:setPhysicsDebug", &debugMode))
00458                 return NULL;
00459         
00460         PHY_GetActiveEnvironment()->setDebugMode(debugMode);
00461         Py_RETURN_NONE;
00462 }
00463 #endif
00464 
00465 
00466 static PyObject* gPyGetPhysicsTicRate(PyObject*)
00467 {
00468         return PyFloat_FromDouble(PHY_GetActiveEnvironment()->getFixedTimeStep());
00469 }
00470 
00471 static PyObject* gPyGetAverageFrameRate(PyObject*)
00472 {
00473         return PyFloat_FromDouble(KX_KetsjiEngine::GetAverageFrameRate());
00474 }
00475 
00476 static PyObject* gPyGetBlendFileList(PyObject*, PyObject* args)
00477 {
00478         char cpath[sizeof(gp_GamePythonPath)];
00479         char *searchpath = NULL;
00480         PyObject* list, *value;
00481         
00482     DIR *dp;
00483     struct dirent *dirp;
00484         
00485         if (!PyArg_ParseTuple(args, "|s:getBlendFileList", &searchpath))
00486                 return NULL;
00487         
00488         list = PyList_New(0);
00489         
00490         if (searchpath) {
00491                 BLI_strncpy(cpath, searchpath, FILE_MAXDIR + FILE_MAXFILE);
00492                 BLI_path_abs(cpath, gp_GamePythonPath);
00493         } else {
00494                 /* Get the dir only */
00495                 BLI_split_dirfile(gp_GamePythonPath, cpath, NULL);
00496         }
00497         
00498     if((dp  = opendir(cpath)) == NULL) {
00499                 /* todo, show the errno, this shouldnt happen anyway if the blendfile is readable */
00500                 fprintf(stderr, "Could not read directoty (%s) failed, code %d (%s)\n", cpath, errno, strerror(errno));
00501                 return list;
00502     }
00503         
00504     while ((dirp = readdir(dp)) != NULL) {
00505                 if (BLI_testextensie(dirp->d_name, ".blend")) {
00506                         value= PyUnicode_DecodeFSDefault(dirp->d_name);
00507                         PyList_Append(list, value);
00508                         Py_DECREF(value);
00509                 }
00510     }
00511         
00512     closedir(dp);
00513     return list;
00514 }
00515 
00516 static char gPyAddScene_doc[] = 
00517 "addScene(name, [overlay])\n\
00518 adds a scene to the game engine\n\
00519 name = Name of the scene\n\
00520 overlay = Overlay or underlay";
00521 static PyObject* gPyAddScene(PyObject*, PyObject* args)
00522 {
00523         char* name;
00524         int overlay = 1;
00525         
00526         if (!PyArg_ParseTuple(args, "s|i:addScene", &name , &overlay))
00527                 return NULL;
00528         
00529         gp_KetsjiEngine->ConvertAndAddScene(name, (overlay != 0));
00530 
00531         Py_RETURN_NONE;
00532 }
00533 
00534 static const char *gPyGetCurrentScene_doc =
00535 "getCurrentScene()\n"
00536 "Gets a reference to the current scene.\n";
00537 static PyObject* gPyGetCurrentScene(PyObject* self)
00538 {
00539         return gp_KetsjiScene->GetProxy();
00540 }
00541 
00542 static const char *gPyGetSceneList_doc =
00543 "getSceneList()\n"
00544 "Return a list of converted scenes.\n";
00545 static PyObject* gPyGetSceneList(PyObject* self)
00546 {
00547         KX_KetsjiEngine* m_engine = KX_GetActiveEngine();
00548         PyObject* list;
00549         KX_SceneList* scenes = m_engine->CurrentScenes();
00550         int numScenes = scenes->size();
00551         int i;
00552         
00553         list = PyList_New(numScenes);
00554         
00555         for (i=0;i<numScenes;i++)
00556         {
00557                 KX_Scene* scene = scenes->at(i);
00558                 PyList_SET_ITEM(list, i, scene->GetProxy());
00559         }
00560 
00561         return list;
00562 }
00563 
00564 static PyObject *pyPrintStats(PyObject *,PyObject *,PyObject *)
00565 {
00566         gp_KetsjiScene->GetSceneConverter()->PrintStats();
00567         Py_RETURN_NONE;
00568 }
00569 
00570 static PyObject *pyPrintExt(PyObject *,PyObject *,PyObject *)
00571 {
00572 #define pprint(x) std::cout << x << std::endl;
00573         bool count=0;
00574         bool support=0;
00575         pprint("Supported Extensions...");
00576         pprint(" GL_ARB_shader_objects supported?       "<< (GLEW_ARB_shader_objects?"yes.":"no."));
00577         count = 1;
00578 
00579         support= GLEW_ARB_vertex_shader;
00580         pprint(" GL_ARB_vertex_shader supported?        "<< (support?"yes.":"no."));
00581         count = 1;
00582         if(support){
00583                 pprint(" ----------Details----------");
00584                 int max=0;
00585                 glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, (GLint*)&max);
00586                 pprint("  Max uniform components." << max);
00587 
00588                 glGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, (GLint*)&max);
00589                 pprint("  Max varying floats." << max);
00590 
00591                 glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, (GLint*)&max);
00592                 pprint("  Max vertex texture units." << max);
00593         
00594                 glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB, (GLint*)&max);
00595                 pprint("  Max combined texture units." << max);
00596                 pprint("");
00597         }
00598 
00599         support=GLEW_ARB_fragment_shader;
00600         pprint(" GL_ARB_fragment_shader supported?      "<< (support?"yes.":"no."));
00601         count = 1;
00602         if(support){
00603                 pprint(" ----------Details----------");
00604                 int max=0;
00605                 glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB, (GLint*)&max);
00606                 pprint("  Max uniform components." << max);
00607                 pprint("");
00608         }
00609 
00610         support = GLEW_ARB_texture_cube_map;
00611         pprint(" GL_ARB_texture_cube_map supported?     "<< (support?"yes.":"no."));
00612         count = 1;
00613         if(support){
00614                 pprint(" ----------Details----------");
00615                 int size=0;
00616                 glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB, (GLint*)&size);
00617                 pprint("  Max cubemap size." << size);
00618                 pprint("");
00619         }
00620 
00621         support = GLEW_ARB_multitexture;
00622         count = 1;
00623         pprint(" GL_ARB_multitexture supported?         "<< (support?"yes.":"no."));
00624         if(support){
00625                 pprint(" ----------Details----------");
00626                 int units=0;
00627                 glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, (GLint*)&units);
00628                 pprint("  Max texture units available.  " << units);
00629                 pprint("");
00630         }
00631 
00632         pprint(" GL_ARB_texture_env_combine supported?  "<< (GLEW_ARB_texture_env_combine?"yes.":"no."));
00633         count = 1;
00634 
00635         if(!count)
00636                 pprint("No extenstions are used in this build");
00637 
00638         Py_RETURN_NONE;
00639 }
00640 
00641 static PyObject *gLibLoad(PyObject*, PyObject* args, PyObject* kwds)
00642 {
00643         KX_Scene *kx_scene= gp_KetsjiScene;
00644         char *path;
00645         char *group;
00646         Py_buffer py_buffer;
00647         py_buffer.buf = NULL;
00648         char *err_str= NULL;
00649 
00650         short options=0;
00651         int load_actions=0, verbose=0;
00652 
00653         static const char *kwlist[] = {"path", "group", "buffer", "load_actions", "verbose", NULL};
00654         
00655         if (!PyArg_ParseTupleAndKeywords(args, kwds, "ss|y*ii:LibLoad", const_cast<char**>(kwlist),
00656                                                                         &path, &group, &py_buffer, &load_actions, &verbose))
00657                 return NULL;
00658 
00659         /* setup options */
00660         if (load_actions != 0)
00661                 options |= KX_BlenderSceneConverter::LIB_LOAD_LOAD_ACTIONS;
00662         if (verbose != 0)
00663                 options |= KX_BlenderSceneConverter::LIB_LOAD_VERBOSE;
00664 
00665         if (!py_buffer.buf)
00666         {
00667                 char abs_path[FILE_MAX];
00668                 // Make the path absolute
00669                 BLI_strncpy(abs_path, path, sizeof(abs_path));
00670                 BLI_path_abs(abs_path, gp_GamePythonPath);
00671 
00672                 if(kx_scene->GetSceneConverter()->LinkBlendFilePath(abs_path, group, kx_scene, &err_str, options)) {
00673                         Py_RETURN_TRUE;
00674                 }
00675         }
00676         else
00677         {
00678 
00679                 if(kx_scene->GetSceneConverter()->LinkBlendFileMemory(py_buffer.buf, py_buffer.len, path, group, kx_scene, &err_str, options))  {
00680                         PyBuffer_Release(&py_buffer);
00681                         Py_RETURN_TRUE;
00682                 }
00683 
00684                 PyBuffer_Release(&py_buffer);
00685         }
00686         
00687         if(err_str) {
00688                 PyErr_SetString(PyExc_ValueError, err_str);
00689                 return NULL;
00690         }
00691         
00692         Py_RETURN_FALSE;
00693 }
00694 
00695 static PyObject *gLibNew(PyObject*, PyObject* args)
00696 {
00697         KX_Scene *kx_scene= gp_KetsjiScene;
00698         char *path;
00699         char *group;
00700         char *name;
00701         PyObject *names;
00702         int idcode;
00703 
00704         if (!PyArg_ParseTuple(args,"ssO!:LibNew",&path, &group, &PyList_Type, &names))
00705                 return NULL;
00706         
00707         if(kx_scene->GetSceneConverter()->GetMainDynamicPath(path))
00708         {
00709                 PyErr_SetString(PyExc_KeyError, "the name of the path given exists");
00710                 return NULL;
00711         }
00712         
00713         idcode= BKE_idcode_from_name(group);
00714         if(idcode==0) {
00715                 PyErr_Format(PyExc_ValueError, "invalid group given \"%s\"", group);
00716                 return NULL;
00717         }
00718         
00719         Main *maggie= (Main *)MEM_callocN( sizeof(Main), "BgeMain");
00720         kx_scene->GetSceneConverter()->GetMainDynamic().push_back(maggie);
00721         strncpy(maggie->name, path, sizeof(maggie->name)-1);
00722         
00723         /* Copy the object into main */
00724         if(idcode==ID_ME) {
00725                 PyObject *ret= PyList_New(0);
00726                 PyObject *item;
00727                 for(int i= 0; i < PyList_GET_SIZE(names); i++) {
00728                         name= _PyUnicode_AsString(PyList_GET_ITEM(names, i));
00729                         if(name) {
00730                                 RAS_MeshObject *meshobj= kx_scene->GetSceneConverter()->ConvertMeshSpecial(kx_scene, maggie, name);
00731                                 if(meshobj) {
00732                                         KX_MeshProxy* meshproxy = new KX_MeshProxy(meshobj);
00733                                         item= meshproxy->NewProxy(true);
00734                                         PyList_Append(ret, item);
00735                                         Py_DECREF(item);
00736                                 }
00737                         }
00738                         else {
00739                                 PyErr_Clear(); /* wasnt a string, ignore for now */
00740                         }
00741                 }
00742                 
00743                 return ret;
00744         }
00745         else {
00746                 PyErr_Format(PyExc_ValueError, "only \"Mesh\" group currently supported");
00747                 return NULL;
00748         }
00749         
00750         Py_RETURN_NONE;
00751 }
00752 
00753 static PyObject *gLibFree(PyObject*, PyObject* args)
00754 {
00755         KX_Scene *kx_scene= gp_KetsjiScene;
00756         char *path;
00757 
00758         if (!PyArg_ParseTuple(args,"s:LibFree",&path))
00759                 return NULL;
00760 
00761         if (kx_scene->GetSceneConverter()->FreeBlendFile(path))
00762         {
00763                 Py_RETURN_TRUE;
00764         }
00765         else {
00766                 Py_RETURN_FALSE;
00767         }
00768 }
00769 
00770 static PyObject *gLibList(PyObject*, PyObject* args)
00771 {
00772         vector<Main*> &dynMaggie = gp_KetsjiScene->GetSceneConverter()->GetMainDynamic();
00773         int i= 0;
00774         PyObject *list= PyList_New(dynMaggie.size());
00775         
00776         for (vector<Main*>::iterator it=dynMaggie.begin(); !(it==dynMaggie.end()); it++)
00777         {
00778                 PyList_SET_ITEM(list, i++, PyUnicode_FromString( (*it)->name) );
00779         }
00780         
00781         return list;
00782 }
00783 
00784 static struct PyMethodDef game_methods[] = {
00785         {"expandPath", (PyCFunction)gPyExpandPath, METH_VARARGS, (const char *)gPyExpandPath_doc},
00786         {"startGame", (PyCFunction)gPyStartGame, METH_VARARGS, (const char *)gPyStartGame_doc},
00787         {"endGame", (PyCFunction)gPyEndGame, METH_NOARGS, (const char *)gPyEndGame_doc},
00788         {"restartGame", (PyCFunction)gPyRestartGame, METH_NOARGS, (const char *)gPyRestartGame_doc},
00789         {"saveGlobalDict", (PyCFunction)gPySaveGlobalDict, METH_NOARGS, (const char *)gPySaveGlobalDict_doc},
00790         {"loadGlobalDict", (PyCFunction)gPyLoadGlobalDict, METH_NOARGS, (const char *)gPyLoadGlobalDict_doc},
00791         {"sendMessage", (PyCFunction)gPySendMessage, METH_VARARGS, (const char *)gPySendMessage_doc},
00792         {"getCurrentController", (PyCFunction) SCA_PythonController::sPyGetCurrentController, METH_NOARGS, SCA_PythonController::sPyGetCurrentController__doc__},
00793         {"getCurrentScene", (PyCFunction) gPyGetCurrentScene, METH_NOARGS, gPyGetCurrentScene_doc},
00794         {"getSceneList", (PyCFunction) gPyGetSceneList, METH_NOARGS, (const char *)gPyGetSceneList_doc},
00795         {"addScene", (PyCFunction)gPyAddScene, METH_VARARGS, (const char *)gPyAddScene_doc},
00796         {"getRandomFloat",(PyCFunction) gPyGetRandomFloat, METH_NOARGS, (const char *)gPyGetRandomFloat_doc},
00797         {"setGravity",(PyCFunction) gPySetGravity, METH_O, (const char *)"set Gravitation"},
00798         {"getSpectrum",(PyCFunction) gPyGetSpectrum, METH_NOARGS, (const char *)"get audio spectrum"},
00799         {"getMaxLogicFrame", (PyCFunction) gPyGetMaxLogicFrame, METH_NOARGS, (const char *)"Gets the max number of logic frame per render frame"},
00800         {"setMaxLogicFrame", (PyCFunction) gPySetMaxLogicFrame, METH_VARARGS, (const char *)"Sets the max number of logic frame per render frame"},
00801         {"getMaxPhysicsFrame", (PyCFunction) gPyGetMaxPhysicsFrame, METH_NOARGS, (const char *)"Gets the max number of physics frame per render frame"},
00802         {"setMaxPhysicsFrame", (PyCFunction) gPySetMaxPhysicsFrame, METH_VARARGS, (const char *)"Sets the max number of physics farme per render frame"},
00803         {"getLogicTicRate", (PyCFunction) gPyGetLogicTicRate, METH_NOARGS, (const char *)"Gets the logic tic rate"},
00804         {"setLogicTicRate", (PyCFunction) gPySetLogicTicRate, METH_VARARGS, (const char *)"Sets the logic tic rate"},
00805         {"getPhysicsTicRate", (PyCFunction) gPyGetPhysicsTicRate, METH_NOARGS, (const char *)"Gets the physics tic rate"},
00806         {"setPhysicsTicRate", (PyCFunction) gPySetPhysicsTicRate, METH_VARARGS, (const char *)"Sets the physics tic rate"},
00807         {"getAverageFrameRate", (PyCFunction) gPyGetAverageFrameRate, METH_NOARGS, (const char *)"Gets the estimated average frame rate"},
00808         {"getBlendFileList", (PyCFunction)gPyGetBlendFileList, METH_VARARGS, (const char *)"Gets a list of blend files in the same directory as the current blend file"},
00809         {"PrintGLInfo", (PyCFunction)pyPrintExt, METH_NOARGS, (const char *)"Prints GL Extension Info"},
00810         {"PrintMemInfo", (PyCFunction)pyPrintStats, METH_NOARGS, (const char *)"Print engine stastics"},
00811         
00812         /* library functions */
00813         {"LibLoad", (PyCFunction)gLibLoad, METH_VARARGS|METH_KEYWORDS, (const char *)""},
00814         {"LibNew", (PyCFunction)gLibNew, METH_VARARGS, (const char *)""},
00815         {"LibFree", (PyCFunction)gLibFree, METH_VARARGS, (const char *)""},
00816         {"LibList", (PyCFunction)gLibList, METH_VARARGS, (const char *)""},
00817         
00818         {NULL, (PyCFunction) NULL, 0, NULL }
00819 };
00820 
00821 static PyObject* gPyGetWindowHeight(PyObject*, PyObject* args)
00822 {
00823         return PyLong_FromSsize_t((gp_Canvas ? gp_Canvas->GetHeight() : 0));
00824 }
00825 
00826 
00827 
00828 static PyObject* gPyGetWindowWidth(PyObject*, PyObject* args)
00829 {
00830         return PyLong_FromSsize_t((gp_Canvas ? gp_Canvas->GetWidth() : 0));
00831 }
00832 
00833 
00834 
00835 // temporarility visibility thing, will be moved to rasterizer/renderer later
00836 bool gUseVisibilityTemp = false;
00837 
00838 static PyObject* gPyEnableVisibility(PyObject*, PyObject* args)
00839 {
00840         int visible;
00841         if (!PyArg_ParseTuple(args,"i:enableVisibility",&visible))
00842                 return NULL;
00843         
00844         gUseVisibilityTemp = (visible != 0);
00845         Py_RETURN_NONE;
00846 }
00847 
00848 
00849 
00850 static PyObject* gPyShowMouse(PyObject*, PyObject* args)
00851 {
00852         int visible;
00853         if (!PyArg_ParseTuple(args,"i:showMouse",&visible))
00854                 return NULL;
00855         
00856         if (visible)
00857         {
00858                 if (gp_Canvas)
00859                         gp_Canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
00860         } else
00861         {
00862                 if (gp_Canvas)
00863                         gp_Canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
00864         }
00865         
00866         Py_RETURN_NONE;
00867 }
00868 
00869 
00870 
00871 static PyObject* gPySetMousePosition(PyObject*, PyObject* args)
00872 {
00873         int x,y;
00874         if (!PyArg_ParseTuple(args,"ii:setMousePosition",&x,&y))
00875                 return NULL;
00876         
00877         if (gp_Canvas)
00878                 gp_Canvas->SetMousePosition(x,y);
00879         
00880         Py_RETURN_NONE;
00881 }
00882 
00883 static PyObject* gPySetEyeSeparation(PyObject*, PyObject* args)
00884 {
00885         float sep;
00886         if (!PyArg_ParseTuple(args, "f:setEyeSeparation", &sep))
00887                 return NULL;
00888 
00889         if (!gp_Rasterizer) {
00890                 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setEyeSeparation(float), Rasterizer not available");
00891                 return NULL;
00892         }
00893         
00894         gp_Rasterizer->SetEyeSeparation(sep);
00895         
00896         Py_RETURN_NONE;
00897 }
00898 
00899 static PyObject* gPyGetEyeSeparation(PyObject*)
00900 {
00901         if (!gp_Rasterizer) {
00902                 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.getEyeSeparation(), Rasterizer not available");
00903                 return NULL;
00904         }
00905         
00906         return PyFloat_FromDouble(gp_Rasterizer->GetEyeSeparation());
00907 }
00908 
00909 static PyObject* gPySetFocalLength(PyObject*, PyObject* args)
00910 {
00911         float focus;
00912         if (!PyArg_ParseTuple(args, "f:setFocalLength", &focus))
00913                 return NULL;
00914         
00915         if (!gp_Rasterizer) {
00916                 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setFocalLength(float), Rasterizer not available");
00917                 return NULL;
00918         }
00919 
00920         gp_Rasterizer->SetFocalLength(focus);
00921         
00922         Py_RETURN_NONE;
00923 }
00924 
00925 static PyObject* gPyGetFocalLength(PyObject*, PyObject*, PyObject*)
00926 {
00927         if (!gp_Rasterizer) {
00928                 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.getFocalLength(), Rasterizer not available");
00929                 return NULL;
00930         }
00931         
00932         return PyFloat_FromDouble(gp_Rasterizer->GetFocalLength());
00933         
00934         Py_RETURN_NONE;
00935 }
00936 
00937 static PyObject* gPySetBackgroundColor(PyObject*, PyObject* value)
00938 {
00939         
00940         MT_Vector4 vec;
00941         if (!PyVecTo(value, vec))
00942                 return NULL;
00943         
00944         if (gp_Canvas)
00945         {
00946                 gp_Rasterizer->SetBackColor((float)vec[0], (float)vec[1], (float)vec[2], (float)vec[3]);
00947         }
00948 
00949         KX_WorldInfo *wi = gp_KetsjiScene->GetWorldInfo();
00950         if (wi->hasWorld())
00951                 wi->setBackColor((float)vec[0], (float)vec[1], (float)vec[2]);
00952 
00953         Py_RETURN_NONE;
00954 }
00955 
00956 
00957 
00958 static PyObject* gPySetMistColor(PyObject*, PyObject* value)
00959 {
00960         
00961         MT_Vector3 vec;
00962         if (!PyVecTo(value, vec))
00963                 return NULL;
00964         
00965         if (!gp_Rasterizer) {
00966                 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setMistColor(color), Rasterizer not available");
00967                 return NULL;
00968         }       
00969         gp_Rasterizer->SetFogColor((float)vec[0], (float)vec[1], (float)vec[2]);
00970         
00971         Py_RETURN_NONE;
00972 }
00973 
00974 static PyObject* gPyDisableMist(PyObject*)
00975 {
00976         
00977         if (!gp_Rasterizer) {
00978                 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setMistColor(color), Rasterizer not available");
00979                 return NULL;
00980         }       
00981         gp_Rasterizer->DisableFog();
00982         
00983         Py_RETURN_NONE;
00984 }
00985 
00986 static PyObject* gPySetMistStart(PyObject*, PyObject* args)
00987 {
00988 
00989         float miststart;
00990         if (!PyArg_ParseTuple(args,"f:setMistStart",&miststart))
00991                 return NULL;
00992         
00993         if (!gp_Rasterizer) {
00994                 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setMistStart(float), Rasterizer not available");
00995                 return NULL;
00996         }
00997         
00998         gp_Rasterizer->SetFogStart(miststart);
00999         
01000         Py_RETURN_NONE;
01001 }
01002 
01003 
01004 
01005 static PyObject* gPySetMistEnd(PyObject*, PyObject* args)
01006 {
01007 
01008         float mistend;
01009         if (!PyArg_ParseTuple(args,"f:setMistEnd",&mistend))
01010                 return NULL;
01011         
01012         if (!gp_Rasterizer) {
01013                 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setMistEnd(float), Rasterizer not available");
01014                 return NULL;
01015         }
01016         
01017         gp_Rasterizer->SetFogEnd(mistend);
01018         
01019         Py_RETURN_NONE;
01020 }
01021 
01022 
01023 static PyObject* gPySetAmbientColor(PyObject*, PyObject* value)
01024 {
01025         
01026         MT_Vector3 vec;
01027         if (!PyVecTo(value, vec))
01028                 return NULL;
01029         
01030         if (!gp_Rasterizer) {
01031                 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setAmbientColor(color), Rasterizer not available");
01032                 return NULL;
01033         }       
01034         gp_Rasterizer->SetAmbientColor((float)vec[0], (float)vec[1], (float)vec[2]);
01035         
01036         Py_RETURN_NONE;
01037 }
01038 
01039 
01040 
01041 
01042 static PyObject* gPyMakeScreenshot(PyObject*, PyObject* args)
01043 {
01044         char* filename;
01045         if (!PyArg_ParseTuple(args,"s:makeScreenshot",&filename))
01046                 return NULL;
01047         
01048         if (gp_Canvas)
01049         {
01050                 gp_Canvas->MakeScreenShot(filename);
01051         }
01052         
01053         Py_RETURN_NONE;
01054 }
01055 
01056 static PyObject* gPyEnableMotionBlur(PyObject*, PyObject* args)
01057 {
01058         float motionblurvalue;
01059         if (!PyArg_ParseTuple(args,"f:enableMotionBlur",&motionblurvalue))
01060                 return NULL;
01061         
01062         if (!gp_Rasterizer) {
01063                 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.enableMotionBlur(float), Rasterizer not available");
01064                 return NULL;
01065         }
01066         
01067         gp_Rasterizer->EnableMotionBlur(motionblurvalue);
01068         
01069         Py_RETURN_NONE;
01070 }
01071 
01072 static PyObject* gPyDisableMotionBlur(PyObject*)
01073 {
01074         if (!gp_Rasterizer) {
01075                 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.disableMotionBlur(), Rasterizer not available");
01076                 return NULL;
01077         }
01078         
01079         gp_Rasterizer->DisableMotionBlur();
01080         
01081         Py_RETURN_NONE;
01082 }
01083 
01084 int getGLSLSettingFlag(char *setting)
01085 {
01086         if(strcmp(setting, "lights") == 0)
01087                 return GAME_GLSL_NO_LIGHTS;
01088         else if(strcmp(setting, "shaders") == 0)
01089                 return GAME_GLSL_NO_SHADERS;
01090         else if(strcmp(setting, "shadows") == 0)
01091                 return GAME_GLSL_NO_SHADOWS;
01092         else if(strcmp(setting, "ramps") == 0)
01093                 return GAME_GLSL_NO_RAMPS;
01094         else if(strcmp(setting, "nodes") == 0)
01095                 return GAME_GLSL_NO_NODES;
01096         else if(strcmp(setting, "extra_textures") == 0)
01097                 return GAME_GLSL_NO_EXTRA_TEX;
01098         else
01099                 return -1;
01100 }
01101 
01102 static PyObject* gPySetGLSLMaterialSetting(PyObject*,
01103                                                                                         PyObject* args,
01104                                                                                         PyObject*)
01105 {
01106         GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
01107         char *setting;
01108         int enable, flag, sceneflag;
01109 
01110         if (!PyArg_ParseTuple(args,"si:setGLSLMaterialSetting",&setting,&enable))
01111                 return NULL;
01112         
01113         flag = getGLSLSettingFlag(setting);
01114         
01115         if  (flag==-1) {
01116                 PyErr_SetString(PyExc_ValueError, "Rasterizer.setGLSLMaterialSetting(string): glsl setting is not known");
01117                 return NULL;
01118         }
01119 
01120         sceneflag= gm->flag;
01121         
01122         if (enable)
01123                 gm->flag &= ~flag;
01124         else
01125                 gm->flag |= flag;
01126 
01127         /* display lists and GLSL materials need to be remade */
01128         if(sceneflag != gm->flag) {
01129                 GPU_materials_free();
01130                 if(gp_KetsjiEngine) {
01131                         KX_SceneList *scenes = gp_KetsjiEngine->CurrentScenes();
01132                         KX_SceneList::iterator it;
01133 
01134                         for(it=scenes->begin(); it!=scenes->end(); it++)
01135                                 if((*it)->GetBucketManager()) {
01136                                         (*it)->GetBucketManager()->ReleaseDisplayLists();
01137                                         (*it)->GetBucketManager()->ReleaseMaterials();
01138                                 }
01139                 }
01140         }
01141 
01142         Py_RETURN_NONE;
01143 }
01144 
01145 static PyObject* gPyGetGLSLMaterialSetting(PyObject*, 
01146                                                                          PyObject* args, 
01147                                                                          PyObject*)
01148 {
01149         GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
01150         char *setting;
01151         int enabled = 0, flag;
01152 
01153         if (!PyArg_ParseTuple(args,"s:getGLSLMaterialSetting",&setting))
01154                 return NULL;
01155         
01156         flag = getGLSLSettingFlag(setting);
01157         
01158         if  (flag==-1) {
01159                 PyErr_SetString(PyExc_ValueError, "Rasterizer.getGLSLMaterialSetting(string): glsl setting is not known");
01160                 return NULL;
01161         }
01162 
01163         enabled = ((gm->flag & flag) != 0);
01164         return PyLong_FromSsize_t(enabled);
01165 }
01166 
01167 #define KX_TEXFACE_MATERIAL                             0
01168 #define KX_BLENDER_MULTITEX_MATERIAL    1
01169 #define KX_BLENDER_GLSL_MATERIAL                2
01170 
01171 static PyObject* gPySetMaterialType(PyObject*,
01172                                                                         PyObject* args,
01173                                                                         PyObject*)
01174 {
01175         GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
01176         int type;
01177 
01178         if (!PyArg_ParseTuple(args,"i:setMaterialType",&type))
01179                 return NULL;
01180 
01181         if(type == KX_BLENDER_GLSL_MATERIAL)
01182                 gm->matmode= GAME_MAT_GLSL;
01183         else if(type == KX_BLENDER_MULTITEX_MATERIAL)
01184                 gm->matmode= GAME_MAT_MULTITEX;
01185         else if(type == KX_TEXFACE_MATERIAL)
01186                 gm->matmode= GAME_MAT_TEXFACE;
01187         else {
01188                 PyErr_SetString(PyExc_ValueError, "Rasterizer.setMaterialType(int): material type is not known");
01189                 return NULL;
01190         }
01191 
01192         Py_RETURN_NONE;
01193 }
01194 
01195 static PyObject* gPyGetMaterialType(PyObject*)
01196 {
01197         GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
01198         int flag;
01199 
01200         if(gm->matmode == GAME_MAT_GLSL)
01201                 flag = KX_BLENDER_GLSL_MATERIAL;
01202         else if(gm->matmode == GAME_MAT_MULTITEX)
01203                 flag = KX_BLENDER_MULTITEX_MATERIAL;
01204         else
01205                 flag = KX_TEXFACE_MATERIAL;
01206         
01207         return PyLong_FromSsize_t(flag);
01208 }
01209 
01210 static PyObject* gPyDrawLine(PyObject*, PyObject* args)
01211 {
01212         PyObject* ob_from;
01213         PyObject* ob_to;
01214         PyObject* ob_color;
01215 
01216         if (!gp_Rasterizer) {
01217                 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.drawLine(obFrom, obTo, color): Rasterizer not available");
01218                 return NULL;
01219         }
01220 
01221         if (!PyArg_ParseTuple(args,"OOO:drawLine",&ob_from,&ob_to,&ob_color))
01222                 return NULL;
01223 
01224         MT_Vector3 from;
01225         MT_Vector3 to;
01226         MT_Vector3 color;
01227         if (!PyVecTo(ob_from, from))
01228                 return NULL;
01229         if (!PyVecTo(ob_to, to))
01230                 return NULL;
01231         if (!PyVecTo(ob_color, color))
01232                 return NULL;
01233 
01234         gp_Rasterizer->DrawDebugLine(from,to,color);
01235         
01236         Py_RETURN_NONE;
01237 }
01238 
01239 static struct PyMethodDef rasterizer_methods[] = {
01240   {"getWindowWidth",(PyCFunction) gPyGetWindowWidth,
01241    METH_VARARGS, "getWindowWidth doc"},
01242    {"getWindowHeight",(PyCFunction) gPyGetWindowHeight,
01243    METH_VARARGS, "getWindowHeight doc"},
01244   {"makeScreenshot",(PyCFunction)gPyMakeScreenshot,
01245         METH_VARARGS, "make Screenshot doc"},
01246    {"enableVisibility",(PyCFunction) gPyEnableVisibility,
01247    METH_VARARGS, "enableVisibility doc"},
01248         {"showMouse",(PyCFunction) gPyShowMouse,
01249    METH_VARARGS, "showMouse(bool visible)"},
01250    {"setMousePosition",(PyCFunction) gPySetMousePosition,
01251    METH_VARARGS, "setMousePosition(int x,int y)"},
01252   {"setBackgroundColor",(PyCFunction)gPySetBackgroundColor,METH_O,"set Background Color (rgb)"},
01253         {"setAmbientColor",(PyCFunction)gPySetAmbientColor,METH_O,"set Ambient Color (rgb)"},
01254  {"disableMist",(PyCFunction)gPyDisableMist,METH_NOARGS,"turn off mist"},
01255  {"setMistColor",(PyCFunction)gPySetMistColor,METH_O,"set Mist Color (rgb)"},
01256   {"setMistStart",(PyCFunction)gPySetMistStart,METH_VARARGS,"set Mist Start(rgb)"},
01257   {"setMistEnd",(PyCFunction)gPySetMistEnd,METH_VARARGS,"set Mist End(rgb)"},
01258   {"enableMotionBlur",(PyCFunction)gPyEnableMotionBlur,METH_VARARGS,"enable motion blur"},
01259   {"disableMotionBlur",(PyCFunction)gPyDisableMotionBlur,METH_NOARGS,"disable motion blur"},
01260 
01261   
01262   {"setEyeSeparation", (PyCFunction) gPySetEyeSeparation, METH_VARARGS, "set the eye separation for stereo mode"},
01263   {"getEyeSeparation", (PyCFunction) gPyGetEyeSeparation, METH_NOARGS, "get the eye separation for stereo mode"},
01264   {"setFocalLength", (PyCFunction) gPySetFocalLength, METH_VARARGS, "set the focal length for stereo mode"},
01265   {"getFocalLength", (PyCFunction) gPyGetFocalLength, METH_VARARGS, "get the focal length for stereo mode"},
01266   {"setMaterialMode",(PyCFunction) gPySetMaterialType,
01267    METH_VARARGS, "set the material mode to use for OpenGL rendering"},
01268   {"getMaterialMode",(PyCFunction) gPyGetMaterialType,
01269    METH_NOARGS, "get the material mode being used for OpenGL rendering"},
01270   {"setGLSLMaterialSetting",(PyCFunction) gPySetGLSLMaterialSetting,
01271    METH_VARARGS, "set the state of a GLSL material setting"},
01272   {"getGLSLMaterialSetting",(PyCFunction) gPyGetGLSLMaterialSetting,
01273    METH_VARARGS, "get the state of a GLSL material setting"},
01274   {"drawLine", (PyCFunction) gPyDrawLine,
01275    METH_VARARGS, "draw a line on the screen"},
01276   { NULL, (PyCFunction) NULL, 0, NULL }
01277 };
01278 
01279 // Initialization function for the module (*must* be called initGameLogic)
01280 
01281 static char GameLogic_module_documentation[] =
01282 "This is the Python API for the game engine of bge.logic"
01283 ;
01284 
01285 static char Rasterizer_module_documentation[] =
01286 "This is the Python API for the game engine of Rasterizer"
01287 ;
01288 
01289 static struct PyModuleDef GameLogic_module_def = {
01290         {}, /* m_base */
01291         "GameLogic",  /* m_name */
01292         GameLogic_module_documentation,  /* m_doc */
01293         0,  /* m_size */
01294         game_methods,  /* m_methods */
01295         0,  /* m_reload */
01296         0,  /* m_traverse */
01297         0,  /* m_clear */
01298         0,  /* m_free */
01299 };
01300 
01301 PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack to get gravity hook
01302 {
01303         PyObject* m;
01304         PyObject* d;
01305         PyObject* item; /* temp PyObject* storage */
01306         
01307         gp_KetsjiEngine = engine;
01308         gp_KetsjiScene = scene;
01309 
01310         gUseVisibilityTemp=false;
01311         
01312         PyObjectPlus::ClearDeprecationWarning(); /* Not that nice to call here but makes sure warnings are reset between loading scenes */
01313         
01314         /* Use existing module where possible
01315          * be careful not to init any runtime vars after this */
01316         m = PyImport_ImportModule( "GameLogic" );
01317         if(m) {
01318                 Py_DECREF(m);
01319                 return m;
01320         }
01321         else {
01322                 PyErr_Clear();
01323                 // Create the module and add the functions      
01324                 m = PyModule_Create(&GameLogic_module_def);
01325                 PyDict_SetItemString(PySys_GetObject("modules"), GameLogic_module_def.m_name, m);
01326         }
01327         
01328         // Add some symbolic constants to the module
01329         d = PyModule_GetDict(m);
01330         
01331         // can be overwritten later for gameEngine instances that can load new blend files and re-initialize this module
01332         // for now its safe to make sure it exists for other areas such as the web plugin
01333         
01334         PyDict_SetItemString(d, "globalDict", item=PyDict_New()); Py_DECREF(item);
01335 
01336         // Add keyboard and mouse attributes to this module
01337         MT_assert(!gp_PythonKeyboard);
01338         gp_PythonKeyboard = new SCA_PythonKeyboard(gp_KetsjiEngine->GetKeyboardDevice());
01339         PyDict_SetItemString(d, "keyboard", gp_PythonKeyboard->NewProxy(true));
01340 
01341         MT_assert(!gp_PythonMouse);
01342         gp_PythonMouse = new SCA_PythonMouse(gp_KetsjiEngine->GetMouseDevice(), gp_Canvas);
01343         PyDict_SetItemString(d, "mouse", gp_PythonMouse->NewProxy(true));
01344 
01345         ErrorObject = PyUnicode_FromString("GameLogic.error");
01346         PyDict_SetItemString(d, "error", ErrorObject);
01347         Py_DECREF(ErrorObject);
01348         
01349         // XXXX Add constants here
01350         /* To use logic bricks, we need some sort of constants. Here, we associate */
01351         /* constants and sumbolic names. Add them to dictionary d.                 */
01352 
01353         /* 1. true and false: needed for everyone                                  */
01354         KX_MACRO_addTypesToDict(d, KX_TRUE,  SCA_ILogicBrick::KX_TRUE);
01355         KX_MACRO_addTypesToDict(d, KX_FALSE, SCA_ILogicBrick::KX_FALSE);
01356 
01357         /* 2. Property sensor                                                      */
01358         KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_EQUAL,      SCA_PropertySensor::KX_PROPSENSOR_EQUAL);
01359         KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_NOTEQUAL,   SCA_PropertySensor::KX_PROPSENSOR_NOTEQUAL);
01360         KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_INTERVAL,   SCA_PropertySensor::KX_PROPSENSOR_INTERVAL);
01361         KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_CHANGED,    SCA_PropertySensor::KX_PROPSENSOR_CHANGED);
01362         KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_EXPRESSION, SCA_PropertySensor::KX_PROPSENSOR_EXPRESSION);
01363 
01364         /* 3. Constraint actuator                                                  */
01365         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCX);
01366         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCY);
01367         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCZ);
01368         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ROTX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTX);
01369         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ROTY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTY);
01370         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ROTZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTZ);
01371         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRPX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPX);
01372         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRPY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPY);
01373         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRPZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPZ);
01374         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRNX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNX);
01375         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRNY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNY);
01376         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRNZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNZ);
01377         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ORIX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIX);
01378         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ORIY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIY);
01379         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ORIZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIZ);
01380         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHPX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPX);
01381         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHPY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPY);
01382         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHPZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPZ);
01383         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHNX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNX);
01384         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHNY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNY);
01385         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHNZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNZ);
01386         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_NORMAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_NORMAL);
01387         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_MATERIAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_MATERIAL);
01388         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_PERMANENT, KX_ConstraintActuator::KX_ACT_CONSTRAINT_PERMANENT);
01389         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DISTANCE, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DISTANCE);
01390         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCAL);
01391         KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DOROTFH, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DOROTFH);
01392 
01393         /* 4. Ipo actuator, simple part                                            */
01394         KX_MACRO_addTypesToDict(d, KX_IPOACT_PLAY,     KX_IpoActuator::KX_ACT_IPO_PLAY);
01395         KX_MACRO_addTypesToDict(d, KX_IPOACT_PINGPONG, KX_IpoActuator::KX_ACT_IPO_PINGPONG);
01396         KX_MACRO_addTypesToDict(d, KX_IPOACT_FLIPPER,  KX_IpoActuator::KX_ACT_IPO_FLIPPER);
01397         KX_MACRO_addTypesToDict(d, KX_IPOACT_LOOPSTOP, KX_IpoActuator::KX_ACT_IPO_LOOPSTOP);
01398         KX_MACRO_addTypesToDict(d, KX_IPOACT_LOOPEND,  KX_IpoActuator::KX_ACT_IPO_LOOPEND);
01399         KX_MACRO_addTypesToDict(d, KX_IPOACT_FROM_PROP,KX_IpoActuator::KX_ACT_IPO_FROM_PROP);
01400 
01401         /* 5. Random distribution types                                            */
01402         KX_MACRO_addTypesToDict(d, KX_RANDOMACT_BOOL_CONST,      SCA_RandomActuator::KX_RANDOMACT_BOOL_CONST);
01403         KX_MACRO_addTypesToDict(d, KX_RANDOMACT_BOOL_UNIFORM,    SCA_RandomActuator::KX_RANDOMACT_BOOL_UNIFORM);
01404         KX_MACRO_addTypesToDict(d, KX_RANDOMACT_BOOL_BERNOUILLI, SCA_RandomActuator::KX_RANDOMACT_BOOL_BERNOUILLI);
01405         KX_MACRO_addTypesToDict(d, KX_RANDOMACT_INT_CONST,       SCA_RandomActuator::KX_RANDOMACT_INT_CONST);
01406         KX_MACRO_addTypesToDict(d, KX_RANDOMACT_INT_UNIFORM,     SCA_RandomActuator::KX_RANDOMACT_INT_UNIFORM);
01407         KX_MACRO_addTypesToDict(d, KX_RANDOMACT_INT_POISSON,     SCA_RandomActuator::KX_RANDOMACT_INT_POISSON);
01408         KX_MACRO_addTypesToDict(d, KX_RANDOMACT_FLOAT_CONST,     SCA_RandomActuator::KX_RANDOMACT_FLOAT_CONST);
01409         KX_MACRO_addTypesToDict(d, KX_RANDOMACT_FLOAT_UNIFORM,   SCA_RandomActuator::KX_RANDOMACT_FLOAT_UNIFORM);
01410         KX_MACRO_addTypesToDict(d, KX_RANDOMACT_FLOAT_NORMAL,    SCA_RandomActuator::KX_RANDOMACT_FLOAT_NORMAL);
01411         KX_MACRO_addTypesToDict(d, KX_RANDOMACT_FLOAT_NEGATIVE_EXPONENTIAL, SCA_RandomActuator::KX_RANDOMACT_FLOAT_NEGATIVE_EXPONENTIAL);
01412 
01413         /* 6. Sound actuator                                                      */
01414         KX_MACRO_addTypesToDict(d, KX_SOUNDACT_PLAYSTOP,              KX_SoundActuator::KX_SOUNDACT_PLAYSTOP);
01415         KX_MACRO_addTypesToDict(d, KX_SOUNDACT_PLAYEND,               KX_SoundActuator::KX_SOUNDACT_PLAYEND);
01416         KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPSTOP,              KX_SoundActuator::KX_SOUNDACT_LOOPSTOP);
01417         KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPEND,               KX_SoundActuator::KX_SOUNDACT_LOOPEND);
01418         KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPBIDIRECTIONAL,     KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL);
01419         KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP,     KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP);
01420 
01421         /* 7. Action actuator                                                                                                      */
01422         KX_MACRO_addTypesToDict(d, KX_ACTIONACT_PLAY,        ACT_ACTION_PLAY);
01423         KX_MACRO_addTypesToDict(d, KX_ACTIONACT_PINGPONG,    ACT_ACTION_PINGPONG);
01424         KX_MACRO_addTypesToDict(d, KX_ACTIONACT_FLIPPER,     ACT_ACTION_FLIPPER);
01425         KX_MACRO_addTypesToDict(d, KX_ACTIONACT_LOOPSTOP,    ACT_ACTION_LOOP_STOP);
01426         KX_MACRO_addTypesToDict(d, KX_ACTIONACT_LOOPEND,     ACT_ACTION_LOOP_END);
01427         KX_MACRO_addTypesToDict(d, KX_ACTIONACT_PROPERTY,    ACT_ACTION_FROM_PROP);
01428         
01429         /*8. GL_BlendFunc */
01430         KX_MACRO_addTypesToDict(d, BL_ZERO, GL_ZERO);
01431         KX_MACRO_addTypesToDict(d, BL_ONE, GL_ONE);
01432         KX_MACRO_addTypesToDict(d, BL_SRC_COLOR, GL_SRC_COLOR);
01433         KX_MACRO_addTypesToDict(d, BL_ONE_MINUS_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
01434         KX_MACRO_addTypesToDict(d, BL_DST_COLOR, GL_DST_COLOR);
01435         KX_MACRO_addTypesToDict(d, BL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_DST_COLOR);
01436         KX_MACRO_addTypesToDict(d, BL_SRC_ALPHA, GL_SRC_ALPHA);
01437         KX_MACRO_addTypesToDict(d, BL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
01438         KX_MACRO_addTypesToDict(d, BL_DST_ALPHA, GL_DST_ALPHA);
01439         KX_MACRO_addTypesToDict(d, BL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
01440         KX_MACRO_addTypesToDict(d, BL_SRC_ALPHA_SATURATE, GL_SRC_ALPHA_SATURATE);
01441 
01442 
01443         /* 9. UniformTypes */
01444         KX_MACRO_addTypesToDict(d, SHD_TANGENT, BL_Shader::SHD_TANGENT);
01445         KX_MACRO_addTypesToDict(d, MODELVIEWMATRIX, BL_Shader::MODELVIEWMATRIX);
01446         KX_MACRO_addTypesToDict(d, MODELVIEWMATRIX_TRANSPOSE, BL_Shader::MODELVIEWMATRIX_TRANSPOSE);
01447         KX_MACRO_addTypesToDict(d, MODELVIEWMATRIX_INVERSE, BL_Shader::MODELVIEWMATRIX_INVERSE);
01448         KX_MACRO_addTypesToDict(d, MODELVIEWMATRIX_INVERSETRANSPOSE, BL_Shader::MODELVIEWMATRIX_INVERSETRANSPOSE);
01449         KX_MACRO_addTypesToDict(d, MODELMATRIX, BL_Shader::MODELMATRIX);
01450         KX_MACRO_addTypesToDict(d, MODELMATRIX_TRANSPOSE, BL_Shader::MODELMATRIX_TRANSPOSE);
01451         KX_MACRO_addTypesToDict(d, MODELMATRIX_INVERSE, BL_Shader::MODELMATRIX_INVERSE);
01452         KX_MACRO_addTypesToDict(d, MODELMATRIX_INVERSETRANSPOSE, BL_Shader::MODELMATRIX_INVERSETRANSPOSE);
01453         KX_MACRO_addTypesToDict(d, VIEWMATRIX, BL_Shader::VIEWMATRIX);
01454         KX_MACRO_addTypesToDict(d, VIEWMATRIX_TRANSPOSE, BL_Shader::VIEWMATRIX_TRANSPOSE);
01455         KX_MACRO_addTypesToDict(d, VIEWMATRIX_INVERSE, BL_Shader::VIEWMATRIX_INVERSE);
01456         KX_MACRO_addTypesToDict(d, VIEWMATRIX_INVERSETRANSPOSE, BL_Shader::VIEWMATRIX_INVERSETRANSPOSE);
01457         KX_MACRO_addTypesToDict(d, CAM_POS, BL_Shader::CAM_POS);
01458         KX_MACRO_addTypesToDict(d, CONSTANT_TIMER, BL_Shader::CONSTANT_TIMER);
01459 
01460         /* 10 state actuator */
01461         KX_MACRO_addTypesToDict(d, KX_STATE1, (1<<0));
01462         KX_MACRO_addTypesToDict(d, KX_STATE2, (1<<1));
01463         KX_MACRO_addTypesToDict(d, KX_STATE3, (1<<2));
01464         KX_MACRO_addTypesToDict(d, KX_STATE4, (1<<3));
01465         KX_MACRO_addTypesToDict(d, KX_STATE5, (1<<4));
01466         KX_MACRO_addTypesToDict(d, KX_STATE6, (1<<5));
01467         KX_MACRO_addTypesToDict(d, KX_STATE7, (1<<6));
01468         KX_MACRO_addTypesToDict(d, KX_STATE8, (1<<7));
01469         KX_MACRO_addTypesToDict(d, KX_STATE9, (1<<8));
01470         KX_MACRO_addTypesToDict(d, KX_STATE10, (1<<9));
01471         KX_MACRO_addTypesToDict(d, KX_STATE11, (1<<10));
01472         KX_MACRO_addTypesToDict(d, KX_STATE12, (1<<11));
01473         KX_MACRO_addTypesToDict(d, KX_STATE13, (1<<12));
01474         KX_MACRO_addTypesToDict(d, KX_STATE14, (1<<13));
01475         KX_MACRO_addTypesToDict(d, KX_STATE15, (1<<14));
01476         KX_MACRO_addTypesToDict(d, KX_STATE16, (1<<15));
01477         KX_MACRO_addTypesToDict(d, KX_STATE17, (1<<16));
01478         KX_MACRO_addTypesToDict(d, KX_STATE18, (1<<17));
01479         KX_MACRO_addTypesToDict(d, KX_STATE19, (1<<18));
01480         KX_MACRO_addTypesToDict(d, KX_STATE20, (1<<19));
01481         KX_MACRO_addTypesToDict(d, KX_STATE21, (1<<20));
01482         KX_MACRO_addTypesToDict(d, KX_STATE22, (1<<21));
01483         KX_MACRO_addTypesToDict(d, KX_STATE23, (1<<22));
01484         KX_MACRO_addTypesToDict(d, KX_STATE24, (1<<23));
01485         KX_MACRO_addTypesToDict(d, KX_STATE25, (1<<24));
01486         KX_MACRO_addTypesToDict(d, KX_STATE26, (1<<25));
01487         KX_MACRO_addTypesToDict(d, KX_STATE27, (1<<26));
01488         KX_MACRO_addTypesToDict(d, KX_STATE28, (1<<27));
01489         KX_MACRO_addTypesToDict(d, KX_STATE29, (1<<28));
01490         KX_MACRO_addTypesToDict(d, KX_STATE30, (1<<29));
01491         
01492         /* All Sensors */
01493         KX_MACRO_addTypesToDict(d, KX_SENSOR_JUST_ACTIVATED, SCA_ISensor::KX_SENSOR_JUST_ACTIVATED);
01494         KX_MACRO_addTypesToDict(d, KX_SENSOR_ACTIVE, SCA_ISensor::KX_SENSOR_ACTIVE);
01495         KX_MACRO_addTypesToDict(d, KX_SENSOR_JUST_DEACTIVATED, SCA_ISensor::KX_SENSOR_JUST_DEACTIVATED);
01496         KX_MACRO_addTypesToDict(d, KX_SENSOR_INACTIVE, SCA_ISensor::KX_SENSOR_INACTIVE);
01497         
01498         /* Radar Sensor */
01499         KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_POS_X, KX_RadarSensor::KX_RADAR_AXIS_POS_X);
01500         KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_POS_Y, KX_RadarSensor::KX_RADAR_AXIS_POS_Y);
01501         KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_POS_Z, KX_RadarSensor::KX_RADAR_AXIS_POS_Z);
01502         KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_NEG_X, KX_RadarSensor::KX_RADAR_AXIS_NEG_Y);
01503         KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_NEG_Y, KX_RadarSensor::KX_RADAR_AXIS_NEG_X);
01504         KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_NEG_Z, KX_RadarSensor::KX_RADAR_AXIS_NEG_Z);
01505 
01506         /* Ray Sensor */
01507         KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_POS_X, KX_RaySensor::KX_RAY_AXIS_POS_X);
01508         KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_POS_Y, KX_RaySensor::KX_RAY_AXIS_POS_Y);
01509         KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_POS_Z, KX_RaySensor::KX_RAY_AXIS_POS_Z);
01510         KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_NEG_X, KX_RaySensor::KX_RAY_AXIS_NEG_Y);
01511         KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_NEG_Y, KX_RaySensor::KX_RAY_AXIS_NEG_X);
01512         KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_NEG_Z, KX_RaySensor::KX_RAY_AXIS_NEG_Z);
01513 
01514         /* Dynamic actuator */
01515         KX_MACRO_addTypesToDict(d, KX_DYN_RESTORE_DYNAMICS, KX_SCA_DynamicActuator::KX_DYN_RESTORE_DYNAMICS);
01516         KX_MACRO_addTypesToDict(d, KX_DYN_DISABLE_DYNAMICS, KX_SCA_DynamicActuator::KX_DYN_DISABLE_DYNAMICS);
01517         KX_MACRO_addTypesToDict(d, KX_DYN_ENABLE_RIGID_BODY, KX_SCA_DynamicActuator::KX_DYN_ENABLE_RIGID_BODY);
01518         KX_MACRO_addTypesToDict(d, KX_DYN_DISABLE_RIGID_BODY, KX_SCA_DynamicActuator::KX_DYN_DISABLE_RIGID_BODY);
01519         KX_MACRO_addTypesToDict(d, KX_DYN_SET_MASS, KX_SCA_DynamicActuator::KX_DYN_SET_MASS);
01520 
01521         /* Input & Mouse Sensor */
01522         KX_MACRO_addTypesToDict(d, KX_INPUT_NONE, SCA_InputEvent::KX_NO_INPUTSTATUS);
01523         KX_MACRO_addTypesToDict(d, KX_INPUT_JUST_ACTIVATED, SCA_InputEvent::KX_JUSTACTIVATED);
01524         KX_MACRO_addTypesToDict(d, KX_INPUT_ACTIVE, SCA_InputEvent::KX_ACTIVE);
01525         KX_MACRO_addTypesToDict(d, KX_INPUT_JUST_RELEASED, SCA_InputEvent::KX_JUSTRELEASED);
01526         
01527         KX_MACRO_addTypesToDict(d, KX_MOUSE_BUT_LEFT, SCA_IInputDevice::KX_LEFTMOUSE);
01528         KX_MACRO_addTypesToDict(d, KX_MOUSE_BUT_MIDDLE, SCA_IInputDevice::KX_MIDDLEMOUSE);
01529         KX_MACRO_addTypesToDict(d, KX_MOUSE_BUT_RIGHT, SCA_IInputDevice::KX_RIGHTMOUSE);
01530 
01531         /* 2D Filter Actuator */
01532         KX_MACRO_addTypesToDict(d, RAS_2DFILTER_ENABLED, RAS_2DFilterManager::RAS_2DFILTER_ENABLED);
01533         KX_MACRO_addTypesToDict(d, RAS_2DFILTER_DISABLED, RAS_2DFilterManager::RAS_2DFILTER_DISABLED);
01534         KX_MACRO_addTypesToDict(d, RAS_2DFILTER_NOFILTER, RAS_2DFilterManager::RAS_2DFILTER_NOFILTER);
01535         KX_MACRO_addTypesToDict(d, RAS_2DFILTER_MOTIONBLUR, RAS_2DFilterManager::RAS_2DFILTER_MOTIONBLUR);
01536         KX_MACRO_addTypesToDict(d, RAS_2DFILTER_BLUR, RAS_2DFilterManager::RAS_2DFILTER_BLUR);
01537         KX_MACRO_addTypesToDict(d, RAS_2DFILTER_SHARPEN, RAS_2DFilterManager::RAS_2DFILTER_SHARPEN);
01538         KX_MACRO_addTypesToDict(d, RAS_2DFILTER_DILATION, RAS_2DFilterManager::RAS_2DFILTER_DILATION);
01539         KX_MACRO_addTypesToDict(d, RAS_2DFILTER_EROSION, RAS_2DFilterManager::RAS_2DFILTER_EROSION);
01540         KX_MACRO_addTypesToDict(d, RAS_2DFILTER_LAPLACIAN, RAS_2DFilterManager::RAS_2DFILTER_LAPLACIAN);
01541         KX_MACRO_addTypesToDict(d, RAS_2DFILTER_SOBEL, RAS_2DFilterManager::RAS_2DFILTER_SOBEL);
01542         KX_MACRO_addTypesToDict(d, RAS_2DFILTER_PREWITT, RAS_2DFilterManager::RAS_2DFILTER_PREWITT);
01543         KX_MACRO_addTypesToDict(d, RAS_2DFILTER_GRAYSCALE, RAS_2DFilterManager::RAS_2DFILTER_GRAYSCALE);
01544         KX_MACRO_addTypesToDict(d, RAS_2DFILTER_SEPIA, RAS_2DFilterManager::RAS_2DFILTER_SEPIA);
01545         KX_MACRO_addTypesToDict(d, RAS_2DFILTER_INVERT, RAS_2DFilterManager::RAS_2DFILTER_INVERT);
01546         KX_MACRO_addTypesToDict(d, RAS_2DFILTER_CUSTOMFILTER, RAS_2DFilterManager::RAS_2DFILTER_CUSTOMFILTER);
01547 
01548         /* Sound Actuator */
01549         KX_MACRO_addTypesToDict(d, KX_SOUNDACT_PLAYSTOP, KX_SoundActuator::KX_SOUNDACT_PLAYSTOP);
01550         KX_MACRO_addTypesToDict(d, KX_SOUNDACT_PLAYEND, KX_SoundActuator::KX_SOUNDACT_PLAYEND);
01551         KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPSTOP, KX_SoundActuator::KX_SOUNDACT_LOOPSTOP);
01552         KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPEND, KX_SoundActuator:: KX_SOUNDACT_LOOPEND);
01553         KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPBIDIRECTIONAL, KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL);
01554         KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP, KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP);
01555 
01556         /* State Actuator */
01557         KX_MACRO_addTypesToDict(d, KX_STATE_OP_CPY, KX_StateActuator::OP_CPY);
01558         KX_MACRO_addTypesToDict(d, KX_STATE_OP_SET, KX_StateActuator::OP_SET);
01559         KX_MACRO_addTypesToDict(d, KX_STATE_OP_CLR, KX_StateActuator::OP_CLR);
01560         KX_MACRO_addTypesToDict(d, KX_STATE_OP_NEG, KX_StateActuator::OP_NEG);
01561 
01562         /* Game Actuator Modes */
01563         KX_MACRO_addTypesToDict(d, KX_GAME_LOAD, KX_GameActuator::KX_GAME_LOAD);
01564         KX_MACRO_addTypesToDict(d, KX_GAME_START, KX_GameActuator::KX_GAME_START);
01565         KX_MACRO_addTypesToDict(d, KX_GAME_RESTART, KX_GameActuator::KX_GAME_RESTART);
01566         KX_MACRO_addTypesToDict(d, KX_GAME_QUIT, KX_GameActuator::KX_GAME_QUIT);
01567         KX_MACRO_addTypesToDict(d, KX_GAME_SAVECFG, KX_GameActuator::KX_GAME_SAVECFG);
01568         KX_MACRO_addTypesToDict(d, KX_GAME_LOADCFG, KX_GameActuator::KX_GAME_LOADCFG);
01569 
01570         /* Scene Actuator Modes */
01571         KX_MACRO_addTypesToDict(d, KX_SCENE_RESTART, KX_SceneActuator::KX_SCENE_RESTART);
01572         KX_MACRO_addTypesToDict(d, KX_SCENE_SET_SCENE, KX_SceneActuator::KX_SCENE_SET_SCENE);
01573         KX_MACRO_addTypesToDict(d, KX_SCENE_SET_CAMERA, KX_SceneActuator::KX_SCENE_SET_CAMERA);
01574         KX_MACRO_addTypesToDict(d, KX_SCENE_ADD_FRONT_SCENE, KX_SceneActuator::KX_SCENE_ADD_FRONT_SCENE);
01575         KX_MACRO_addTypesToDict(d, KX_SCENE_ADD_BACK_SCENE, KX_SceneActuator::KX_SCENE_ADD_BACK_SCENE);
01576         KX_MACRO_addTypesToDict(d, KX_SCENE_REMOVE_SCENE, KX_SceneActuator::KX_SCENE_REMOVE_SCENE);
01577         KX_MACRO_addTypesToDict(d, KX_SCENE_SUSPEND, KX_SceneActuator::KX_SCENE_SUSPEND);
01578         KX_MACRO_addTypesToDict(d, KX_SCENE_RESUME, KX_SceneActuator::KX_SCENE_RESUME);
01579 
01580         /* Parent Actuator Modes */
01581         KX_MACRO_addTypesToDict(d, KX_PARENT_SET, KX_ParentActuator::KX_PARENT_SET);
01582         KX_MACRO_addTypesToDict(d, KX_PARENT_REMOVE, KX_ParentActuator::KX_PARENT_REMOVE);
01583 
01584         /* BL_ArmatureConstraint type */
01585         KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_TRACKTO, CONSTRAINT_TYPE_TRACKTO);
01586         KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_KINEMATIC, CONSTRAINT_TYPE_KINEMATIC);
01587         KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_ROTLIKE, CONSTRAINT_TYPE_ROTLIKE);
01588         KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_LOCLIKE, CONSTRAINT_TYPE_LOCLIKE);
01589         KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_MINMAX, CONSTRAINT_TYPE_MINMAX);
01590         KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_SIZELIKE, CONSTRAINT_TYPE_SIZELIKE);
01591         KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_LOCKTRACK, CONSTRAINT_TYPE_LOCKTRACK);
01592         KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_STRETCHTO, CONSTRAINT_TYPE_STRETCHTO);
01593         KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_CLAMPTO, CONSTRAINT_TYPE_CLAMPTO);
01594         KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_TRANSFORM, CONSTRAINT_TYPE_TRANSFORM);
01595         KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_DISTLIMIT, CONSTRAINT_TYPE_DISTLIMIT);
01596         /* BL_ArmatureConstraint ik_type */
01597         KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_COPYPOSE, CONSTRAINT_IK_COPYPOSE);
01598         KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_DISTANCE, CONSTRAINT_IK_DISTANCE);
01599         /* BL_ArmatureConstraint ik_mode */
01600         KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_MODE_INSIDE, LIMITDIST_INSIDE);
01601         KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_MODE_OUTSIDE, LIMITDIST_OUTSIDE);
01602         KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_MODE_ONSURFACE, LIMITDIST_ONSURFACE);
01603         /* BL_ArmatureConstraint ik_flag */
01604         KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_TIP, CONSTRAINT_IK_TIP);
01605         KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_ROT, CONSTRAINT_IK_ROT);
01606         KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_STRETCH, CONSTRAINT_IK_STRETCH);
01607         KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_POS, CONSTRAINT_IK_POS);
01608         /* KX_ArmatureSensor type */
01609         KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_STATE_CHANGED, SENS_ARM_STATE_CHANGED);
01610         KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_LIN_ERROR_BELOW, SENS_ARM_LIN_ERROR_BELOW);
01611         KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_LIN_ERROR_ABOVE, SENS_ARM_LIN_ERROR_ABOVE);
01612         KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_ROT_ERROR_BELOW, SENS_ARM_ROT_ERROR_BELOW);
01613         KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_ROT_ERROR_ABOVE, SENS_ARM_ROT_ERROR_ABOVE);
01614 
01615         /* BL_ArmatureActuator type */
01616         KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_RUN, ACT_ARM_RUN);
01617         KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_ENABLE, ACT_ARM_ENABLE);
01618         KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_DISABLE, ACT_ARM_DISABLE);
01619         KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_SETTARGET, ACT_ARM_SETTARGET);
01620         KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_SETWEIGHT, ACT_ARM_SETWEIGHT);
01621 
01622         /* BL_Armature Channel rotation_mode */
01623         KX_MACRO_addTypesToDict(d, ROT_MODE_QUAT, ROT_MODE_QUAT);
01624         KX_MACRO_addTypesToDict(d, ROT_MODE_XYZ, ROT_MODE_XYZ);
01625         KX_MACRO_addTypesToDict(d, ROT_MODE_XZY, ROT_MODE_XZY);
01626         KX_MACRO_addTypesToDict(d, ROT_MODE_YXZ, ROT_MODE_YXZ);
01627         KX_MACRO_addTypesToDict(d, ROT_MODE_YZX, ROT_MODE_YZX);
01628         KX_MACRO_addTypesToDict(d, ROT_MODE_ZXY, ROT_MODE_ZXY);
01629         KX_MACRO_addTypesToDict(d, ROT_MODE_ZYX, ROT_MODE_ZYX);
01630 
01631         // Check for errors
01632         if (PyErr_Occurred())
01633     {
01634                 Py_FatalError("can't initialize module bge.logic");
01635     }
01636 
01637         return m;
01638 }
01639 
01640 /* Explanation of 
01641  * 
01642  * - backupPySysObjects()               : stores sys.path in gp_OrigPythonSysPath
01643  * - initPySysObjects(main)     : initializes the blendfile and library paths
01644  * - restorePySysObjects()              : restores sys.path from gp_OrigPythonSysPath
01645  * 
01646  * These exist so the current blend dir "//" can always be used to import modules from.
01647  * the reason we need a few functions for this is that python is not only used by the game engine
01648  * so we cant just add to sys.path all the time, it would leave pythons state in a mess.
01649  * It would also be incorrect since loading blend files for new levels etc would alwasy add to sys.path
01650  * 
01651  * To play nice with blenders python, the sys.path is backed up and the current blendfile along
01652  * with all its lib paths are added to the sys path.
01653  * When loading a new blendfile, the original sys.path is restored and the new paths are added over the top.
01654  */
01655 
01659 static void backupPySysObjects(void)
01660 {
01661         PyObject *sys_path= PySys_GetObject("path"); /* should never fail */
01662         PyObject *sys_mods= PySys_GetObject("modules"); /* should never fail */
01663         
01664         /* paths */
01665         Py_XDECREF(gp_OrigPythonSysPath); /* just incase its set */
01666         gp_OrigPythonSysPath = PyList_GetSlice(sys_path, 0, INT_MAX); /* copy the list */
01667         
01668         /* modules */
01669         Py_XDECREF(gp_OrigPythonSysModules); /* just incase its set */
01670         gp_OrigPythonSysModules = PyDict_Copy(sys_mods); /* copy the list */
01671         
01672 }
01673 
01674 /* for initPySysObjects only,
01675  * takes a blend path and adds a scripts dir from it
01676  *
01677  * "/home/me/foo.blend" -> "/home/me/scripts"
01678  */
01679 static void initPySysObjects__append(PyObject *sys_path, char *filename)
01680 {
01681         PyObject *item;
01682         char expanded[FILE_MAXDIR + FILE_MAXFILE];
01683         
01684         BLI_split_dirfile(filename, expanded, NULL); /* get the dir part of filename only */
01685         BLI_path_abs(expanded, gp_GamePythonPath); /* filename from lib->filename is (always?) absolute, so this may not be needed but it wont hurt */
01686         BLI_cleanup_file(gp_GamePythonPath, expanded); /* Dont use BLI_cleanup_dir because it adds a slash - BREAKS WIN32 ONLY */
01687         item= PyUnicode_DecodeFSDefault(expanded);
01688         
01689 //      printf("SysPath - '%s', '%s', '%s'\n", expanded, filename, gp_GamePythonPath);
01690         
01691         if(PySequence_Index(sys_path, item) == -1) {
01692                 PyErr_Clear(); /* PySequence_Index sets a ValueError */
01693                 PyList_Insert(sys_path, 0, item);
01694         }
01695         
01696         Py_DECREF(item);
01697 }
01698 static void initPySysObjects(Main *maggie)
01699 {
01700         PyObject *sys_path= PySys_GetObject("path"); /* should never fail */
01701         
01702         if (gp_OrigPythonSysPath==NULL) {
01703                 /* backup */
01704                 backupPySysObjects();
01705         }
01706         else {
01707                 /* get the original sys path when the BGE started */
01708                 PyList_SetSlice(sys_path, 0, INT_MAX, gp_OrigPythonSysPath);
01709         }
01710         
01711         Library *lib= (Library *)maggie->library.first;
01712         
01713         while(lib) {
01714                 /* lib->name wont work in some cases (on win32),
01715                  * even when expanding with gp_GamePythonPath, using lib->filename is less trouble */
01716                 initPySysObjects__append(sys_path, lib->filepath);
01717                 lib= (Library *)lib->id.next;
01718         }
01719         
01720         initPySysObjects__append(sys_path, gp_GamePythonPath);
01721         
01722 //      fprintf(stderr, "\nNew Path: %d ", PyList_Size(sys_path));
01723 //      PyObject_Print(sys_path, stderr, 0);
01724 }
01725 
01726 static void restorePySysObjects(void)
01727 {
01728         if (gp_OrigPythonSysPath==NULL)
01729                 return;
01730         
01731         PyObject *sys_path= PySys_GetObject("path"); /* should never fail */
01732         PyObject *sys_mods= PySys_GetObject("modules"); /* should never fail */
01733 
01734         /* paths */
01735         PyList_SetSlice(sys_path, 0, INT_MAX, gp_OrigPythonSysPath);
01736         Py_DECREF(gp_OrigPythonSysPath);
01737         gp_OrigPythonSysPath= NULL;
01738         
01739         /* modules */
01740         PyDict_Clear(sys_mods);
01741         PyDict_Update(sys_mods, gp_OrigPythonSysModules);
01742         Py_DECREF(gp_OrigPythonSysModules);
01743         gp_OrigPythonSysModules= NULL;  
01744         
01745         
01746 //      fprintf(stderr, "\nRestore Path: %d ", PyList_Size(sys_path));
01747 //      PyObject_Print(sys_path, stderr, 0);
01748 }
01749 
01750 // Copied from bpy_interface.c
01751 static struct _inittab bge_internal_modules[]= {
01752         {(char *)"mathutils", PyInit_mathutils},
01753         {(char *)"bgl", BPyInit_bgl},
01754         {(char *)"blf", BPyInit_blf},
01755         {(char *)"aud", AUD_initPython},
01756         {NULL, NULL}
01757 };
01758 
01763 PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecurityLevel level, Main *maggie, int argc, char** argv)
01764 {
01765         /* Yet another gotcha in the py api
01766          * Cant run PySys_SetArgv more then once because this adds the
01767          * binary dir to the sys.path each time.
01768          * Id have thaught python being totally restarted would make this ok but
01769          * somehow it remembers the sys.path - Campbell
01770          */
01771         static bool first_time = true;
01772         
01773 #if 0 // TODO - py3
01774         STR_String pname = progname;
01775         Py_SetProgramName(pname.Ptr());
01776 #endif
01777         Py_NoSiteFlag=1;
01778         Py_FrozenFlag=1;
01779 
01780         /* must run before python initializes */
01781         PyImport_ExtendInittab(bge_internal_modules);
01782 
01783         /* find local python installation */
01784         PyC_SetHomePath(BLI_get_folder(BLENDER_SYSTEM_PYTHON, NULL));
01785 
01786         Py_Initialize();
01787         
01788         if(argv && first_time) { /* browser plugins dont currently set this */
01789                 // Until python support ascii again, we use our own.
01790                 // PySys_SetArgv(argc, argv);
01791                 int i;
01792                 PyObject *py_argv= PyList_New(argc);
01793 
01794                 for (i=0; i<argc; i++)
01795                         PyList_SET_ITEM(py_argv, i, PyC_UnicodeFromByte(argv[i]));
01796 
01797                 PySys_SetObject("argv", py_argv);
01798                 Py_DECREF(py_argv);
01799         }
01800 
01801         bpy_import_init(PyEval_GetBuiltins());
01802 
01803         /* mathutils types are used by the BGE even if we dont import them */
01804         {
01805                 PyObject *mod= PyImport_ImportModuleLevel((char *)"mathutils", NULL, NULL, NULL, 0);
01806                 Py_DECREF(mod);
01807         }
01808 
01809         initPyTypes();
01810         
01811         bpy_import_main_set(maggie);
01812         
01813         initPySysObjects(maggie);
01814         
01815         first_time = false;
01816         
01817         PyObjectPlus::ClearDeprecationWarning();
01818 
01819         return PyC_DefaultNameSpace(NULL);
01820 }
01821 
01822 void exitGamePlayerPythonScripting()
01823 {       
01824         /* Clean up the Python mouse and keyboard */
01825         delete gp_PythonKeyboard;
01826         gp_PythonKeyboard = NULL;
01827 
01828         delete gp_PythonMouse;
01829         gp_PythonMouse = NULL;
01830 
01831         /* since python restarts we cant let the python backup of the sys.path hang around in a global pointer */
01832         restorePySysObjects(); /* get back the original sys.path and clear the backup */
01833         
01834         Py_Finalize();
01835         bpy_import_main_set(NULL);
01836         PyObjectPlus::ClearDeprecationWarning();
01837 }
01838 
01839 
01840 
01844 PyObject* initGamePythonScripting(const STR_String& progname, TPythonSecurityLevel level, Main *maggie)
01845 {
01846 #if 0 // XXX TODO Py3
01847         STR_String pname = progname;
01848         Py_SetProgramName(pname.Ptr());
01849 #endif
01850         Py_NoSiteFlag=1;
01851         Py_FrozenFlag=1;
01852 
01853         initPyTypes();
01854         
01855         bpy_import_main_set(maggie);
01856         
01857         initPySysObjects(maggie);
01858 
01859         PyObjectPlus::NullDeprecationWarning();
01860 
01861         return PyC_DefaultNameSpace(NULL);
01862 }
01863 
01864 void exitGamePythonScripting()
01865 {
01866         /* Clean up the Python mouse and keyboard */
01867         delete gp_PythonKeyboard;
01868         gp_PythonKeyboard = NULL;
01869 
01870         delete gp_PythonMouse;
01871         gp_PythonMouse = NULL;
01872 
01873         restorePySysObjects(); /* get back the original sys.path and clear the backup */
01874         bpy_import_main_set(NULL);
01875         PyObjectPlus::ClearDeprecationWarning();
01876 }
01877 
01878 /* similar to the above functions except it sets up the namespace
01879  * and other more general things */
01880 void setupGamePython(KX_KetsjiEngine* ketsjiengine, KX_Scene* startscene, Main *blenderdata, PyObject * pyGlobalDict, PyObject **gameLogic, PyObject **gameLogic_keys, int argc, char** argv)
01881 {
01882         PyObject* dictionaryobject;
01883 
01884         if(argv) /* player only */
01885                 dictionaryobject= initGamePlayerPythonScripting("Ketsji", psl_Lowest, blenderdata, argc, argv);
01886         else
01887                 dictionaryobject= initGamePythonScripting("Ketsji", psl_Lowest, blenderdata);
01888 
01889         ketsjiengine->SetPyNamespace(dictionaryobject);
01890         initRasterizer(ketsjiengine->GetRasterizer(), ketsjiengine->GetCanvas());
01891         *gameLogic = initGameLogic(ketsjiengine, startscene);
01892 
01893         /* is set in initGameLogic so only set here if we want it to persist between scenes */
01894         if(pyGlobalDict)
01895                 PyDict_SetItemString(PyModule_GetDict(*gameLogic), "globalDict", pyGlobalDict); // Same as importing the module.
01896 
01897         *gameLogic_keys = PyDict_Keys(PyModule_GetDict(*gameLogic));
01898 
01899         initGameKeys();
01900         initPythonConstraintBinding();
01901         initVideoTexture();
01902 
01903         /* could be done a lot more nicely, but for now a quick way to get bge.* working */
01904         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')});");
01905 }
01906 
01907 static struct PyModuleDef Rasterizer_module_def = {
01908         {}, /* m_base */
01909         "Rasterizer",  /* m_name */
01910         Rasterizer_module_documentation,  /* m_doc */
01911         0,  /* m_size */
01912         rasterizer_methods,  /* m_methods */
01913         0,  /* m_reload */
01914         0,  /* m_traverse */
01915         0,  /* m_clear */
01916         0,  /* m_free */
01917 };
01918 
01919 PyObject* initRasterizer(RAS_IRasterizer* rasty,RAS_ICanvas* canvas)
01920 {
01921         gp_Canvas = canvas;
01922         gp_Rasterizer = rasty;
01923 
01924 
01925   PyObject* m;
01926   PyObject* d;
01927   PyObject* item;
01928 
01929         /* Use existing module where possible
01930          * be careful not to init any runtime vars after this */
01931         m = PyImport_ImportModule( "Rasterizer" );
01932         if(m) {
01933                 Py_DECREF(m);
01934                 return m;
01935         }
01936         else {
01937                 PyErr_Clear();
01938         
01939                 // Create the module and add the functions
01940                 m = PyModule_Create(&Rasterizer_module_def);
01941                 PyDict_SetItemString(PySys_GetObject("modules"), Rasterizer_module_def.m_name, m);
01942         }
01943 
01944   // Add some symbolic constants to the module
01945   d = PyModule_GetDict(m);
01946   ErrorObject = PyUnicode_FromString("Rasterizer.error");
01947   PyDict_SetItemString(d, "error", ErrorObject);
01948   Py_DECREF(ErrorObject);
01949 
01950   /* needed for get/setMaterialType */
01951   KX_MACRO_addTypesToDict(d, KX_TEXFACE_MATERIAL, KX_TEXFACE_MATERIAL);
01952   KX_MACRO_addTypesToDict(d, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL);
01953   KX_MACRO_addTypesToDict(d, KX_BLENDER_GLSL_MATERIAL, KX_BLENDER_GLSL_MATERIAL);
01954 
01955   // XXXX Add constants here
01956 
01957   // Check for errors
01958   if (PyErr_Occurred())
01959     {
01960       Py_FatalError("can't initialize module Rasterizer");
01961     }
01962 
01963   return d;
01964 }
01965 
01966 
01967 
01968 /* ------------------------------------------------------------------------- */
01969 /* GameKeys: symbolic constants for key mapping                              */
01970 /* ------------------------------------------------------------------------- */
01971 
01972 static char GameKeys_module_documentation[] =
01973 "This modules provides defines for key-codes"
01974 ;
01975 
01976 static char gPyEventToString_doc[] =
01977 "EventToString(event) - Take a valid event from the GameKeys module or Keyboard Sensor and return a name"
01978 ;
01979 
01980 static PyObject* gPyEventToString(PyObject*, PyObject* value)
01981 {
01982         PyObject* mod, *dict, *key, *val, *ret = NULL;
01983         Py_ssize_t pos = 0;
01984         
01985         mod = PyImport_ImportModule( "GameKeys" );
01986         if (!mod)
01987                 return NULL;
01988         
01989         dict = PyModule_GetDict(mod);
01990         
01991         while (PyDict_Next(dict, &pos, &key, &val)) {
01992                 if (PyObject_RichCompareBool(value, val, Py_EQ)) {
01993                         ret = key;
01994                         break;
01995                 }
01996         }
01997         
01998         PyErr_Clear(); // incase there was an error clearing
01999         Py_DECREF(mod);
02000         if (!ret)       PyErr_SetString(PyExc_ValueError, "GameKeys.EventToString(int): expected a valid int keyboard event");
02001         else            Py_INCREF(ret);
02002         
02003         return ret;
02004 }
02005 
02006 static char gPyEventToCharacter_doc[] =
02007 "EventToCharacter(event, is_shift) - Take a valid event from the GameKeys module or Keyboard Sensor and return a character"
02008 ;
02009 
02010 static PyObject* gPyEventToCharacter(PyObject*, PyObject* args)
02011 {
02012         int event, shift;
02013         if (!PyArg_ParseTuple(args,"ii:EventToCharacter", &event, &shift))
02014                 return NULL;
02015         
02016         if(IsPrintable(event)) {
02017                 char ch[2] = {'\0', '\0'};
02018                 ch[0] = ToCharacter(event, (bool)shift);
02019                 return PyUnicode_FromString(ch);
02020         }
02021         else {
02022                 return PyUnicode_FromString("");
02023         }
02024 }
02025 
02026 
02027 static struct PyMethodDef gamekeys_methods[] = {
02028         {"EventToCharacter", (PyCFunction)gPyEventToCharacter, METH_VARARGS, (const char *)gPyEventToCharacter_doc},
02029         {"EventToString", (PyCFunction)gPyEventToString, METH_O, (const char *)gPyEventToString_doc},
02030         { NULL, (PyCFunction) NULL, 0, NULL }
02031 };
02032 
02033 static struct PyModuleDef GameKeys_module_def = {
02034         {}, /* m_base */
02035         "GameKeys",  /* m_name */
02036         GameKeys_module_documentation,  /* m_doc */
02037         0,  /* m_size */
02038         gamekeys_methods,  /* m_methods */
02039         0,  /* m_reload */
02040         0,  /* m_traverse */
02041         0,  /* m_clear */
02042         0,  /* m_free */
02043 };
02044 
02045 PyObject* initGameKeys()
02046 {
02047         PyObject* m;
02048         PyObject* d;
02049         PyObject* item;
02050         
02051         /* Use existing module where possible */
02052         m = PyImport_ImportModule( "GameKeys" );
02053         if(m) {
02054                 Py_DECREF(m);
02055                 return m;
02056         }
02057         else {
02058                 PyErr_Clear();
02059         
02060                 // Create the module and add the functions
02061                 m = PyModule_Create(&GameKeys_module_def);
02062                 PyDict_SetItemString(PySys_GetObject("modules"), GameKeys_module_def.m_name, m);
02063         }
02064 
02065         // Add some symbolic constants to the module
02066         d = PyModule_GetDict(m);
02067 
02068         // XXXX Add constants here
02069 
02070         KX_MACRO_addTypesToDict(d, AKEY, SCA_IInputDevice::KX_AKEY);
02071         KX_MACRO_addTypesToDict(d, BKEY, SCA_IInputDevice::KX_BKEY);
02072         KX_MACRO_addTypesToDict(d, CKEY, SCA_IInputDevice::KX_CKEY);
02073         KX_MACRO_addTypesToDict(d, DKEY, SCA_IInputDevice::KX_DKEY);
02074         KX_MACRO_addTypesToDict(d, EKEY, SCA_IInputDevice::KX_EKEY);
02075         KX_MACRO_addTypesToDict(d, FKEY, SCA_IInputDevice::KX_FKEY);
02076         KX_MACRO_addTypesToDict(d, GKEY, SCA_IInputDevice::KX_GKEY);
02077         KX_MACRO_addTypesToDict(d, HKEY, SCA_IInputDevice::KX_HKEY);
02078         KX_MACRO_addTypesToDict(d, IKEY, SCA_IInputDevice::KX_IKEY);
02079         KX_MACRO_addTypesToDict(d, JKEY, SCA_IInputDevice::KX_JKEY);
02080         KX_MACRO_addTypesToDict(d, KKEY, SCA_IInputDevice::KX_KKEY);
02081         KX_MACRO_addTypesToDict(d, LKEY, SCA_IInputDevice::KX_LKEY);
02082         KX_MACRO_addTypesToDict(d, MKEY, SCA_IInputDevice::KX_MKEY);
02083         KX_MACRO_addTypesToDict(d, NKEY, SCA_IInputDevice::KX_NKEY);
02084         KX_MACRO_addTypesToDict(d, OKEY, SCA_IInputDevice::KX_OKEY);
02085         KX_MACRO_addTypesToDict(d, PKEY, SCA_IInputDevice::KX_PKEY);
02086         KX_MACRO_addTypesToDict(d, QKEY, SCA_IInputDevice::KX_QKEY);
02087         KX_MACRO_addTypesToDict(d, RKEY, SCA_IInputDevice::KX_RKEY);
02088         KX_MACRO_addTypesToDict(d, SKEY, SCA_IInputDevice::KX_SKEY);
02089         KX_MACRO_addTypesToDict(d, TKEY, SCA_IInputDevice::KX_TKEY);
02090         KX_MACRO_addTypesToDict(d, UKEY, SCA_IInputDevice::KX_UKEY);
02091         KX_MACRO_addTypesToDict(d, VKEY, SCA_IInputDevice::KX_VKEY);
02092         KX_MACRO_addTypesToDict(d, WKEY, SCA_IInputDevice::KX_WKEY);
02093         KX_MACRO_addTypesToDict(d, XKEY, SCA_IInputDevice::KX_XKEY);
02094         KX_MACRO_addTypesToDict(d, YKEY, SCA_IInputDevice::KX_YKEY);
02095         KX_MACRO_addTypesToDict(d, ZKEY, SCA_IInputDevice::KX_ZKEY);
02096         
02097         KX_MACRO_addTypesToDict(d, ZEROKEY, SCA_IInputDevice::KX_ZEROKEY);              
02098         KX_MACRO_addTypesToDict(d, ONEKEY, SCA_IInputDevice::KX_ONEKEY);                
02099         KX_MACRO_addTypesToDict(d, TWOKEY, SCA_IInputDevice::KX_TWOKEY);                
02100         KX_MACRO_addTypesToDict(d, THREEKEY, SCA_IInputDevice::KX_THREEKEY);
02101         KX_MACRO_addTypesToDict(d, FOURKEY, SCA_IInputDevice::KX_FOURKEY);              
02102         KX_MACRO_addTypesToDict(d, FIVEKEY, SCA_IInputDevice::KX_FIVEKEY);              
02103         KX_MACRO_addTypesToDict(d, SIXKEY, SCA_IInputDevice::KX_SIXKEY);                
02104         KX_MACRO_addTypesToDict(d, SEVENKEY, SCA_IInputDevice::KX_SEVENKEY);
02105         KX_MACRO_addTypesToDict(d, EIGHTKEY, SCA_IInputDevice::KX_EIGHTKEY);
02106         KX_MACRO_addTypesToDict(d, NINEKEY, SCA_IInputDevice::KX_NINEKEY);              
02107                 
02108         KX_MACRO_addTypesToDict(d, CAPSLOCKKEY, SCA_IInputDevice::KX_CAPSLOCKKEY);
02109                 
02110         KX_MACRO_addTypesToDict(d, LEFTCTRLKEY, SCA_IInputDevice::KX_LEFTCTRLKEY);      
02111         KX_MACRO_addTypesToDict(d, LEFTALTKEY, SCA_IInputDevice::KX_LEFTALTKEY);                
02112         KX_MACRO_addTypesToDict(d, RIGHTALTKEY, SCA_IInputDevice::KX_RIGHTALTKEY);      
02113         KX_MACRO_addTypesToDict(d, RIGHTCTRLKEY, SCA_IInputDevice::KX_RIGHTCTRLKEY);    
02114         KX_MACRO_addTypesToDict(d, RIGHTSHIFTKEY, SCA_IInputDevice::KX_RIGHTSHIFTKEY);  
02115         KX_MACRO_addTypesToDict(d, LEFTSHIFTKEY, SCA_IInputDevice::KX_LEFTSHIFTKEY);
02116                 
02117         KX_MACRO_addTypesToDict(d, ESCKEY, SCA_IInputDevice::KX_ESCKEY);
02118         KX_MACRO_addTypesToDict(d, TABKEY, SCA_IInputDevice::KX_TABKEY);
02119         KX_MACRO_addTypesToDict(d, RETKEY, SCA_IInputDevice::KX_RETKEY);
02120         KX_MACRO_addTypesToDict(d, ENTERKEY, SCA_IInputDevice::KX_RETKEY);
02121         KX_MACRO_addTypesToDict(d, SPACEKEY, SCA_IInputDevice::KX_SPACEKEY);
02122         KX_MACRO_addTypesToDict(d, LINEFEEDKEY, SCA_IInputDevice::KX_LINEFEEDKEY);              
02123         KX_MACRO_addTypesToDict(d, BACKSPACEKEY, SCA_IInputDevice::KX_BACKSPACEKEY);
02124         KX_MACRO_addTypesToDict(d, DELKEY, SCA_IInputDevice::KX_DELKEY);
02125         KX_MACRO_addTypesToDict(d, SEMICOLONKEY, SCA_IInputDevice::KX_SEMICOLONKEY);
02126         KX_MACRO_addTypesToDict(d, PERIODKEY, SCA_IInputDevice::KX_PERIODKEY);          
02127         KX_MACRO_addTypesToDict(d, COMMAKEY, SCA_IInputDevice::KX_COMMAKEY);            
02128         KX_MACRO_addTypesToDict(d, QUOTEKEY, SCA_IInputDevice::KX_QUOTEKEY);            
02129         KX_MACRO_addTypesToDict(d, ACCENTGRAVEKEY, SCA_IInputDevice::KX_ACCENTGRAVEKEY);        
02130         KX_MACRO_addTypesToDict(d, MINUSKEY, SCA_IInputDevice::KX_MINUSKEY);            
02131         KX_MACRO_addTypesToDict(d, SLASHKEY, SCA_IInputDevice::KX_SLASHKEY);            
02132         KX_MACRO_addTypesToDict(d, BACKSLASHKEY, SCA_IInputDevice::KX_BACKSLASHKEY);
02133         KX_MACRO_addTypesToDict(d, EQUALKEY, SCA_IInputDevice::KX_EQUALKEY);            
02134         KX_MACRO_addTypesToDict(d, LEFTBRACKETKEY, SCA_IInputDevice::KX_LEFTBRACKETKEY);        
02135         KX_MACRO_addTypesToDict(d, RIGHTBRACKETKEY, SCA_IInputDevice::KX_RIGHTBRACKETKEY);      
02136                 
02137         KX_MACRO_addTypesToDict(d, LEFTARROWKEY, SCA_IInputDevice::KX_LEFTARROWKEY);
02138         KX_MACRO_addTypesToDict(d, DOWNARROWKEY, SCA_IInputDevice::KX_DOWNARROWKEY);
02139         KX_MACRO_addTypesToDict(d, RIGHTARROWKEY, SCA_IInputDevice::KX_RIGHTARROWKEY);  
02140         KX_MACRO_addTypesToDict(d, UPARROWKEY, SCA_IInputDevice::KX_UPARROWKEY);                
02141         
02142         KX_MACRO_addTypesToDict(d, PAD2 , SCA_IInputDevice::KX_PAD2);
02143         KX_MACRO_addTypesToDict(d, PAD4 , SCA_IInputDevice::KX_PAD4);
02144         KX_MACRO_addTypesToDict(d, PAD6 , SCA_IInputDevice::KX_PAD6);
02145         KX_MACRO_addTypesToDict(d, PAD8 , SCA_IInputDevice::KX_PAD8);
02146                 
02147         KX_MACRO_addTypesToDict(d, PAD1 , SCA_IInputDevice::KX_PAD1);
02148         KX_MACRO_addTypesToDict(d, PAD3 , SCA_IInputDevice::KX_PAD3);
02149         KX_MACRO_addTypesToDict(d, PAD5 , SCA_IInputDevice::KX_PAD5);
02150         KX_MACRO_addTypesToDict(d, PAD7 , SCA_IInputDevice::KX_PAD7);
02151         KX_MACRO_addTypesToDict(d, PAD9 , SCA_IInputDevice::KX_PAD9);
02152                 
02153         KX_MACRO_addTypesToDict(d, PADPERIOD, SCA_IInputDevice::KX_PADPERIOD);
02154         KX_MACRO_addTypesToDict(d, PADSLASHKEY, SCA_IInputDevice::KX_PADSLASHKEY);
02155         KX_MACRO_addTypesToDict(d, PADASTERKEY, SCA_IInputDevice::KX_PADASTERKEY);
02156                 
02157                 
02158         KX_MACRO_addTypesToDict(d, PAD0, SCA_IInputDevice::KX_PAD0);
02159         KX_MACRO_addTypesToDict(d, PADMINUS, SCA_IInputDevice::KX_PADMINUS);
02160         KX_MACRO_addTypesToDict(d, PADENTER, SCA_IInputDevice::KX_PADENTER);
02161         KX_MACRO_addTypesToDict(d, PADPLUSKEY, SCA_IInputDevice::KX_PADPLUSKEY);
02162                 
02163                 
02164         KX_MACRO_addTypesToDict(d, F1KEY , SCA_IInputDevice::KX_F1KEY);
02165         KX_MACRO_addTypesToDict(d, F2KEY , SCA_IInputDevice::KX_F2KEY);
02166         KX_MACRO_addTypesToDict(d, F3KEY , SCA_IInputDevice::KX_F3KEY);
02167         KX_MACRO_addTypesToDict(d, F4KEY , SCA_IInputDevice::KX_F4KEY);
02168         KX_MACRO_addTypesToDict(d, F5KEY , SCA_IInputDevice::KX_F5KEY);
02169         KX_MACRO_addTypesToDict(d, F6KEY , SCA_IInputDevice::KX_F6KEY);
02170         KX_MACRO_addTypesToDict(d, F7KEY , SCA_IInputDevice::KX_F7KEY);
02171         KX_MACRO_addTypesToDict(d, F8KEY , SCA_IInputDevice::KX_F8KEY);
02172         KX_MACRO_addTypesToDict(d, F9KEY , SCA_IInputDevice::KX_F9KEY);
02173         KX_MACRO_addTypesToDict(d, F10KEY, SCA_IInputDevice::KX_F10KEY);
02174         KX_MACRO_addTypesToDict(d, F11KEY, SCA_IInputDevice::KX_F11KEY);
02175         KX_MACRO_addTypesToDict(d, F12KEY, SCA_IInputDevice::KX_F12KEY);
02176         KX_MACRO_addTypesToDict(d, F13KEY, SCA_IInputDevice::KX_F13KEY);
02177         KX_MACRO_addTypesToDict(d, F14KEY, SCA_IInputDevice::KX_F14KEY);
02178         KX_MACRO_addTypesToDict(d, F15KEY, SCA_IInputDevice::KX_F15KEY);
02179         KX_MACRO_addTypesToDict(d, F16KEY, SCA_IInputDevice::KX_F16KEY);
02180         KX_MACRO_addTypesToDict(d, F17KEY, SCA_IInputDevice::KX_F17KEY);
02181         KX_MACRO_addTypesToDict(d, F18KEY, SCA_IInputDevice::KX_F18KEY);
02182         KX_MACRO_addTypesToDict(d, F19KEY, SCA_IInputDevice::KX_F19KEY);
02183                 
02184         KX_MACRO_addTypesToDict(d, PAUSEKEY, SCA_IInputDevice::KX_PAUSEKEY);
02185         KX_MACRO_addTypesToDict(d, INSERTKEY, SCA_IInputDevice::KX_INSERTKEY);
02186         KX_MACRO_addTypesToDict(d, HOMEKEY , SCA_IInputDevice::KX_HOMEKEY);
02187         KX_MACRO_addTypesToDict(d, PAGEUPKEY, SCA_IInputDevice::KX_PAGEUPKEY);
02188         KX_MACRO_addTypesToDict(d, PAGEDOWNKEY, SCA_IInputDevice::KX_PAGEDOWNKEY);
02189         KX_MACRO_addTypesToDict(d, ENDKEY, SCA_IInputDevice::KX_ENDKEY);
02190 
02191         // MOUSE
02192         KX_MACRO_addTypesToDict(d, LEFTMOUSE, SCA_IInputDevice::KX_LEFTMOUSE);
02193         KX_MACRO_addTypesToDict(d, MIDDLEMOUSE, SCA_IInputDevice::KX_MIDDLEMOUSE);
02194         KX_MACRO_addTypesToDict(d, RIGHTMOUSE, SCA_IInputDevice::KX_RIGHTMOUSE);
02195         KX_MACRO_addTypesToDict(d, WHEELUPMOUSE, SCA_IInputDevice::KX_WHEELUPMOUSE);
02196         KX_MACRO_addTypesToDict(d, WHEELDOWNMOUSE, SCA_IInputDevice::KX_WHEELDOWNMOUSE);
02197         KX_MACRO_addTypesToDict(d, MOUSEX, SCA_IInputDevice::KX_MOUSEX);
02198         KX_MACRO_addTypesToDict(d, MOUSEY, SCA_IInputDevice::KX_MOUSEY);
02199 
02200         // Check for errors
02201         if (PyErr_Occurred())
02202     {
02203                 Py_FatalError("can't initialize module GameKeys");
02204     }
02205 
02206         return d;
02207 }
02208 
02209 // utility function for loading and saving the globalDict
02210 int saveGamePythonConfig( char **marshal_buffer)
02211 {
02212         int marshal_length = 0;
02213         PyObject* gameLogic = PyImport_ImportModule("GameLogic");
02214         if (gameLogic) {
02215                 PyObject* pyGlobalDict = PyDict_GetItemString(PyModule_GetDict(gameLogic), "globalDict"); // Same as importing the module
02216                 if (pyGlobalDict) {
02217 #ifdef Py_MARSHAL_VERSION       
02218                         PyObject* pyGlobalDictMarshal = PyMarshal_WriteObjectToString(  pyGlobalDict, 2); // Py_MARSHAL_VERSION == 2 as of Py2.5
02219 #else
02220                         PyObject* pyGlobalDictMarshal = PyMarshal_WriteObjectToString(  pyGlobalDict ); 
02221 #endif
02222                         if (pyGlobalDictMarshal) {
02223                                 // for testing only
02224                                 // PyObject_Print(pyGlobalDictMarshal, stderr, 0);
02225                                 char *marshal_cstring;
02226                                 
02227                                 marshal_cstring = PyBytes_AsString(pyGlobalDictMarshal); // py3 uses byte arrays
02228                                 marshal_length= PyBytes_Size(pyGlobalDictMarshal);
02229                                 *marshal_buffer = new char[marshal_length + 1];
02230                                 memcpy(*marshal_buffer, marshal_cstring, marshal_length);
02231                                 Py_DECREF(pyGlobalDictMarshal);
02232                         } else {
02233                                 printf("Error, bge.logic.globalDict could not be marshal'd\n");
02234                         }
02235                 } else {
02236                         printf("Error, bge.logic.globalDict was removed\n");
02237                 }
02238                 Py_DECREF(gameLogic);
02239         } else {
02240                 PyErr_Clear();
02241                 printf("Error, bge.logic failed to import bge.logic.globalDict will be lost\n");
02242         }
02243         return marshal_length;
02244 }
02245 
02246 int loadGamePythonConfig(char *marshal_buffer, int marshal_length)
02247 {
02248         /* Restore the dict */
02249         if (marshal_buffer) {
02250                 PyObject* gameLogic = PyImport_ImportModule("GameLogic");
02251 
02252                 if (gameLogic) {
02253                         PyObject* pyGlobalDict = PyMarshal_ReadObjectFromString(marshal_buffer, marshal_length);
02254                         if (pyGlobalDict) {
02255                                 PyObject* pyGlobalDict_orig = PyDict_GetItemString(PyModule_GetDict(gameLogic), "globalDict"); // Same as importing the module.
02256                                 if (pyGlobalDict_orig) {
02257                                         PyDict_Clear(pyGlobalDict_orig);
02258                                         PyDict_Update(pyGlobalDict_orig, pyGlobalDict);
02259                                 } else {
02260                                         /* this should not happen, but cant find the original globalDict, just assign it then */
02261                                         PyDict_SetItemString(PyModule_GetDict(gameLogic), "globalDict", pyGlobalDict); // Same as importing the module.
02262                                 }
02263                                 Py_DECREF(gameLogic);
02264                                 Py_DECREF(pyGlobalDict);
02265                                 return 1;
02266                         } else {
02267                                 Py_DECREF(gameLogic);
02268                                 PyErr_Clear();
02269                                 printf("Error could not marshall string\n");
02270                         }
02271                 } else {
02272                         PyErr_Clear();
02273                         printf("Error, bge.logic failed to import bge.logic.globalDict will be lost\n");
02274                 }       
02275         }
02276         return 0;
02277 }
02278 
02279 void pathGamePythonConfig( char *path )
02280 {
02281         int len = strlen(gp_GamePythonPathOrig); // Always use the first loaded blend filename
02282         
02283         BLI_strncpy(path, gp_GamePythonPathOrig, sizeof(gp_GamePythonPathOrig));
02284 
02285         /* replace extension */
02286         if (BLI_testextensie(path, ".blend")) {
02287                 strcpy(path+(len-6), ".bgeconf");
02288         } else {
02289                 strcpy(path+len, ".bgeconf");
02290         }
02291 }
02292 
02293 void setGamePythonPath(char *path)
02294 {
02295         BLI_strncpy(gp_GamePythonPath, path, sizeof(gp_GamePythonPath));
02296         BLI_cleanup_file(NULL, gp_GamePythonPath); /* not absolutely needed but makes resolving path problems less confusing later */
02297         
02298         if (gp_GamePythonPathOrig[0] == '\0')
02299                 BLI_strncpy(gp_GamePythonPathOrig, path, sizeof(gp_GamePythonPathOrig));
02300 }
02301 
02302 // we need this so while blender is open (not blenderplayer)
02303 // loading new blendfiles will reset this on starting the
02304 // engine but loading blend files within the BGE wont overwrite gp_GamePythonPathOrig
02305 void resetGamePythonPath()
02306 {
02307         gp_GamePythonPathOrig[0] = '\0';
02308 }
02309 
02310 #endif // WITH_PYTHON