|
Blender
V2.59
|
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