4 * ***** BEGIN GPL LICENSE BLOCK *****
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21 * All rights reserved.
23 * The Original Code is: all of this file.
25 * Contributor(s): none yet.
27 * ***** END GPL LICENSE BLOCK *****
28 * Initialize Python thingies.
31 /** \file gameengine/Ketsji/KX_PythonInit.cpp
38 #if defined(WIN32) && !defined(FREE_WINDOWS)
39 #pragma warning (disable : 4786)
44 #ifdef _POSIX_C_SOURCE
45 #undef _POSIX_C_SOURCE
55 #include "bpy_internal_import.h" /* from the blender python api, but we want to import text too! */
56 #include "py_capi_utils.h"
57 #include "mathutils.h" // Blender.Mathutils module copied here so the blenderlayer can use.
59 #include "blf_py_api.h"
61 #include "marshal.h" /* python header for loading/saving dicts */
64 #include "AUD_PyInit.h"
68 #include "KX_PythonInit.h"
70 // directory header for py function getBlendFileList
76 #include "BLI_winstuff.h"
79 //python physics binding
80 #include "KX_PyConstraintBinding.h"
82 #include "KX_KetsjiEngine.h"
83 #include "KX_RadarSensor.h"
84 #include "KX_RaySensor.h"
85 #include "KX_ArmatureSensor.h"
86 #include "KX_SceneActuator.h"
87 #include "KX_GameActuator.h"
88 #include "KX_ParentActuator.h"
89 #include "KX_SCA_DynamicActuator.h"
91 #include "SCA_IInputDevice.h"
92 #include "SCA_PropertySensor.h"
93 #include "SCA_RandomActuator.h"
94 #include "SCA_KeyboardSensor.h" /* IsPrintable, ToCharacter */
95 #include "SCA_PythonKeyboard.h"
96 #include "SCA_PythonMouse.h"
97 #include "KX_ConstraintActuator.h"
98 #include "KX_IpoActuator.h"
99 #include "KX_SoundActuator.h"
100 #include "KX_StateActuator.h"
101 #include "BL_ActionActuator.h"
102 #include "BL_ArmatureObject.h"
103 #include "RAS_IRasterizer.h"
104 #include "RAS_ICanvas.h"
105 #include "RAS_BucketManager.h"
106 #include "RAS_2DFilterManager.h"
107 #include "MT_Vector3.h"
108 #include "MT_Point3.h"
109 #include "ListValue.h"
110 #include "InputParser.h"
111 #include "KX_Scene.h"
113 #include "NG_NetworkScene.h" //Needed for sendMessage()
115 #include "BL_Shader.h"
117 #include "KX_PyMath.h"
119 #include "PyObjectPlus.h"
121 #include "KX_PythonInitTypes.h"
123 /* we only need this to get a list of libraries from the main struct */
125 #include "DNA_scene_types.h"
127 #include "PHY_IPhysicsEnvironment.h"
128 #include "BKE_main.h"
129 #include "BKE_utildefines.h"
130 #include "BKE_global.h"
131 #include "BLI_blenlib.h"
132 #include "GPU_material.h"
133 #include "MEM_guardedalloc.h"
135 /* for converting new scenes */
136 #include "KX_BlenderSceneConverter.h"
137 #include "KX_MeshProxy.h" /* for creating a new library of mesh objects */
139 #include "BKE_idcode.h"
142 #include "NG_NetworkScene.h" //Needed for sendMessage()
144 // 'local' copy of canvas ptr, for window height/width python scripts
148 static RAS_ICanvas* gp_Canvas = NULL;
149 static char gp_GamePythonPath[FILE_MAXDIR + FILE_MAXFILE] = "";
150 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
152 static SCA_PythonKeyboard* gp_PythonKeyboard = NULL;
153 static SCA_PythonMouse* gp_PythonMouse = NULL;
154 #endif // WITH_PYTHON
156 static KX_Scene* gp_KetsjiScene = NULL;
157 static KX_KetsjiEngine* gp_KetsjiEngine = NULL;
158 static RAS_IRasterizer* gp_Rasterizer = NULL;
161 void KX_SetActiveScene(class KX_Scene* scene)
163 gp_KetsjiScene = scene;
166 class KX_Scene* KX_GetActiveScene()
168 return gp_KetsjiScene;
171 class KX_KetsjiEngine* KX_GetActiveEngine()
173 return gp_KetsjiEngine;
176 /* why is this in python? */
177 void KX_RasterizerDrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color)
180 gp_Rasterizer->DrawDebugLine(from,to,color);
185 static PyObject *gp_OrigPythonSysPath= NULL;
186 static PyObject *gp_OrigPythonSysModules= NULL;
188 /* Macro for building the keyboard translation */
189 //#define KX_MACRO_addToDict(dict, name) PyDict_SetItemString(dict, #name, PyLong_FromSsize_t(SCA_IInputDevice::KX_##name))
190 #define KX_MACRO_addToDict(dict, name) PyDict_SetItemString(dict, #name, item=PyLong_FromSsize_t(name)); Py_DECREF(item)
191 /* For the defines for types from logic bricks, we do stuff explicitly... */
192 #define KX_MACRO_addTypesToDict(dict, name, name2) PyDict_SetItemString(dict, #name, item=PyLong_FromSsize_t(name2)); Py_DECREF(item)
195 // temporarily python stuff, will be put in another place later !
196 #include "KX_Python.h"
197 #include "SCA_PythonController.h"
198 // List of methods defined in the module
200 static PyObject* ErrorObject;
201 static const char *gPyGetRandomFloat_doc="getRandomFloat returns a random floating point value in the range [0..1]";
203 static PyObject* gPyGetRandomFloat(PyObject*)
205 return PyFloat_FromDouble(MT_random());
208 static PyObject* gPySetGravity(PyObject*, PyObject* value)
211 if (!PyVecTo(value, vec))
215 gp_KetsjiScene->SetGravity(vec);
220 static char gPyExpandPath_doc[] =
221 "(path) - Converts a blender internal path into a proper file system path.\n\
222 path - the string path to convert.\n\n\
223 Use / as directory separator in path\n\
224 You can use '//' at the start of the string to define a relative path;\n\
225 Blender replaces that string by the directory of the startup .blend or runtime\n\
226 file to make a full path name (doesn't change during the game, even if you load\n\
228 The function also converts the directory separator to the local file system format.";
230 static PyObject* gPyExpandPath(PyObject*, PyObject* args)
232 char expanded[FILE_MAXDIR + FILE_MAXFILE];
235 if (!PyArg_ParseTuple(args,"s:ExpandPath",&filename))
238 BLI_strncpy(expanded, filename, FILE_MAXDIR + FILE_MAXFILE);
239 BLI_path_abs(expanded, gp_GamePythonPath);
240 return PyUnicode_DecodeFSDefault(expanded);
243 static char gPyStartGame_doc[] =
245 Loads the blend file";
247 static PyObject* gPyStartGame(PyObject*, PyObject* args)
251 if (!PyArg_ParseTuple(args, "s:startGame", &blendfile))
254 gp_KetsjiEngine->RequestExit(KX_EXIT_REQUEST_START_OTHER_GAME);
255 gp_KetsjiEngine->SetNameNextGame(blendfile);
260 static char gPyEndGame_doc[] =
262 Ends the current game";
264 static PyObject* gPyEndGame(PyObject*)
266 gp_KetsjiEngine->RequestExit(KX_EXIT_REQUEST_QUIT_GAME);
268 //printf("%s\n", gp_GamePythonPath);
273 static char gPyRestartGame_doc[] =
275 Restarts the current game by reloading the .blend file";
277 static PyObject* gPyRestartGame(PyObject*)
279 gp_KetsjiEngine->RequestExit(KX_EXIT_REQUEST_RESTART_GAME);
280 gp_KetsjiEngine->SetNameNextGame(gp_GamePythonPath);
285 static char gPySaveGlobalDict_doc[] =
287 "Saves bge.logic.globalDict to a file";
289 static PyObject* gPySaveGlobalDict(PyObject*)
291 char marshal_path[512];
292 char *marshal_buffer = NULL;
293 unsigned int marshal_length;
296 pathGamePythonConfig(marshal_path);
297 marshal_length = saveGamePythonConfig(&marshal_buffer);
299 if (marshal_length && marshal_buffer)
301 fp = fopen(marshal_path, "wb");
305 if (fwrite(marshal_buffer, 1, marshal_length, fp) != marshal_length)
306 printf("Warning: could not write marshal data\n");
310 printf("Warning: could not open marshal file\n");
313 printf("Warning: could not create marshal buffer\n");
317 delete [] marshal_buffer;
322 static char gPyLoadGlobalDict_doc[] =
324 "Loads bge.logic.globalDict from a file";
326 static PyObject* gPyLoadGlobalDict(PyObject*)
328 char marshal_path[512];
329 char *marshal_buffer = NULL;
330 unsigned int marshal_length;
334 pathGamePythonConfig(marshal_path);
336 fp = fopen(marshal_path, "rb");
340 fseek (fp, 0, SEEK_END);
341 marshal_length = ftell(fp);
344 marshal_buffer = (char*)malloc (sizeof(char)*marshal_length);
346 result = fread(marshal_buffer, 1, marshal_length, fp);
348 if (result == marshal_length) {
349 loadGamePythonConfig(marshal_buffer, marshal_length);
351 printf("Warning: could not read all of '%s'\n", marshal_path);
354 free(marshal_buffer);
357 printf("Warning: could not open '%s'\n", marshal_path);
363 static char gPySendMessage_doc[] =
364 "sendMessage(subject, [body, to, from])\n\
365 sends a message in same manner as a message actuator\
366 subject = Subject of the message\
368 to = Name of object to send the message to\
369 from = Name of object to send the string from";
371 static PyObject* gPySendMessage(PyObject*, PyObject* args)
374 char* body = (char *)"";
375 char* to = (char *)"";
376 char* from = (char *)"";
378 if (!PyArg_ParseTuple(args, "s|sss:sendMessage", &subject, &body, &to, &from))
381 gp_KetsjiScene->GetNetworkScene()->SendMessage(to, from, subject, body);
386 // this gets a pointer to an array filled with floats
387 static PyObject* gPyGetSpectrum(PyObject*)
389 PyObject* resultlist = PyList_New(512);
391 for (int index = 0; index < 512; index++)
393 PyList_SET_ITEM(resultlist, index, PyFloat_FromDouble(0.0));
399 static PyObject* gPySetLogicTicRate(PyObject*, PyObject* args)
402 if (!PyArg_ParseTuple(args, "f:setLogicTicRate", &ticrate))
405 KX_KetsjiEngine::SetTicRate(ticrate);
409 static PyObject* gPyGetLogicTicRate(PyObject*)
411 return PyFloat_FromDouble(KX_KetsjiEngine::GetTicRate());
414 static PyObject* gPySetMaxLogicFrame(PyObject*, PyObject* args)
417 if (!PyArg_ParseTuple(args, "i:setMaxLogicFrame", &frame))
420 KX_KetsjiEngine::SetMaxLogicFrame(frame);
424 static PyObject* gPyGetMaxLogicFrame(PyObject*)
426 return PyLong_FromSsize_t(KX_KetsjiEngine::GetMaxLogicFrame());
429 static PyObject* gPySetMaxPhysicsFrame(PyObject*, PyObject* args)
432 if (!PyArg_ParseTuple(args, "i:setMaxPhysicsFrame", &frame))
435 KX_KetsjiEngine::SetMaxPhysicsFrame(frame);
439 static PyObject* gPyGetMaxPhysicsFrame(PyObject*)
441 return PyLong_FromSsize_t(KX_KetsjiEngine::GetMaxPhysicsFrame());
444 static PyObject* gPySetPhysicsTicRate(PyObject*, PyObject* args)
447 if (!PyArg_ParseTuple(args, "f:setPhysicsTicRate", &ticrate))
450 PHY_GetActiveEnvironment()->setFixedTimeStep(true,ticrate);
454 static PyObject* gPySetPhysicsDebug(PyObject*, PyObject* args)
457 if (!PyArg_ParseTuple(args, "i:setPhysicsDebug", &debugMode))
460 PHY_GetActiveEnvironment()->setDebugMode(debugMode);
466 static PyObject* gPyGetPhysicsTicRate(PyObject*)
468 return PyFloat_FromDouble(PHY_GetActiveEnvironment()->getFixedTimeStep());
471 static PyObject* gPyGetAverageFrameRate(PyObject*)
473 return PyFloat_FromDouble(KX_KetsjiEngine::GetAverageFrameRate());
476 static PyObject* gPyGetBlendFileList(PyObject*, PyObject* args)
478 char cpath[sizeof(gp_GamePythonPath)];
479 char *searchpath = NULL;
480 PyObject* list, *value;
485 if (!PyArg_ParseTuple(args, "|s:getBlendFileList", &searchpath))
488 list = PyList_New(0);
491 BLI_strncpy(cpath, searchpath, FILE_MAXDIR + FILE_MAXFILE);
492 BLI_path_abs(cpath, gp_GamePythonPath);
494 /* Get the dir only */
495 BLI_split_dirfile(gp_GamePythonPath, cpath, NULL);
498 if((dp = opendir(cpath)) == NULL) {
499 /* todo, show the errno, this shouldnt happen anyway if the blendfile is readable */
500 fprintf(stderr, "Could not read directoty (%s) failed, code %d (%s)\n", cpath, errno, strerror(errno));
504 while ((dirp = readdir(dp)) != NULL) {
505 if (BLI_testextensie(dirp->d_name, ".blend")) {
506 value= PyUnicode_DecodeFSDefault(dirp->d_name);
507 PyList_Append(list, value);
516 static char gPyAddScene_doc[] =
517 "addScene(name, [overlay])\n\
518 adds a scene to the game engine\n\
519 name = Name of the scene\n\
520 overlay = Overlay or underlay";
521 static PyObject* gPyAddScene(PyObject*, PyObject* args)
526 if (!PyArg_ParseTuple(args, "s|i:addScene", &name , &overlay))
529 gp_KetsjiEngine->ConvertAndAddScene(name, (overlay != 0));
534 static const char *gPyGetCurrentScene_doc =
535 "getCurrentScene()\n"
536 "Gets a reference to the current scene.\n";
537 static PyObject* gPyGetCurrentScene(PyObject* self)
539 return gp_KetsjiScene->GetProxy();
542 static const char *gPyGetSceneList_doc =
544 "Return a list of converted scenes.\n";
545 static PyObject* gPyGetSceneList(PyObject* self)
547 KX_KetsjiEngine* m_engine = KX_GetActiveEngine();
549 KX_SceneList* scenes = m_engine->CurrentScenes();
550 int numScenes = scenes->size();
553 list = PyList_New(numScenes);
555 for (i=0;i<numScenes;i++)
557 KX_Scene* scene = scenes->at(i);
558 PyList_SET_ITEM(list, i, scene->GetProxy());
564 static PyObject *pyPrintStats(PyObject *,PyObject *,PyObject *)
566 gp_KetsjiScene->GetSceneConverter()->PrintStats();
570 static PyObject *pyPrintExt(PyObject *,PyObject *,PyObject *)
572 #define pprint(x) std::cout << x << std::endl;
575 pprint("Supported Extensions...");
576 pprint(" GL_ARB_shader_objects supported? "<< (GLEW_ARB_shader_objects?"yes.":"no."));
579 support= GLEW_ARB_vertex_shader;
580 pprint(" GL_ARB_vertex_shader supported? "<< (support?"yes.":"no."));
583 pprint(" ----------Details----------");
585 glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, (GLint*)&max);
586 pprint(" Max uniform components." << max);
588 glGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, (GLint*)&max);
589 pprint(" Max varying floats." << max);
591 glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, (GLint*)&max);
592 pprint(" Max vertex texture units." << max);
594 glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB, (GLint*)&max);
595 pprint(" Max combined texture units." << max);
599 support=GLEW_ARB_fragment_shader;
600 pprint(" GL_ARB_fragment_shader supported? "<< (support?"yes.":"no."));
603 pprint(" ----------Details----------");
605 glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB, (GLint*)&max);
606 pprint(" Max uniform components." << max);
610 support = GLEW_ARB_texture_cube_map;
611 pprint(" GL_ARB_texture_cube_map supported? "<< (support?"yes.":"no."));
614 pprint(" ----------Details----------");
616 glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB, (GLint*)&size);
617 pprint(" Max cubemap size." << size);
621 support = GLEW_ARB_multitexture;
623 pprint(" GL_ARB_multitexture supported? "<< (support?"yes.":"no."));
625 pprint(" ----------Details----------");
627 glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, (GLint*)&units);
628 pprint(" Max texture units available. " << units);
632 pprint(" GL_ARB_texture_env_combine supported? "<< (GLEW_ARB_texture_env_combine?"yes.":"no."));
636 pprint("No extenstions are used in this build");
641 static PyObject *gLibLoad(PyObject*, PyObject* args, PyObject* kwds)
643 KX_Scene *kx_scene= gp_KetsjiScene;
647 py_buffer.buf = NULL;
651 int load_actions=0, verbose=0;
653 static const char *kwlist[] = {"path", "group", "buffer", "load_actions", "verbose", NULL};
655 if (!PyArg_ParseTupleAndKeywords(args, kwds, "ss|y*ii:LibLoad", const_cast<char**>(kwlist),
656 &path, &group, &py_buffer, &load_actions, &verbose))
660 if (load_actions != 0)
661 options |= KX_BlenderSceneConverter::LIB_LOAD_LOAD_ACTIONS;
663 options |= KX_BlenderSceneConverter::LIB_LOAD_VERBOSE;
667 char abs_path[FILE_MAX];
668 // Make the path absolute
669 BLI_strncpy(abs_path, path, sizeof(abs_path));
670 BLI_path_abs(abs_path, gp_GamePythonPath);
672 if(kx_scene->GetSceneConverter()->LinkBlendFilePath(abs_path, group, kx_scene, &err_str, options)) {
679 if(kx_scene->GetSceneConverter()->LinkBlendFileMemory(py_buffer.buf, py_buffer.len, path, group, kx_scene, &err_str, options)) {
680 PyBuffer_Release(&py_buffer);
684 PyBuffer_Release(&py_buffer);
688 PyErr_SetString(PyExc_ValueError, err_str);
695 static PyObject *gLibNew(PyObject*, PyObject* args)
697 KX_Scene *kx_scene= gp_KetsjiScene;
704 if (!PyArg_ParseTuple(args,"ssO!:LibNew",&path, &group, &PyList_Type, &names))
707 if(kx_scene->GetSceneConverter()->GetMainDynamicPath(path))
709 PyErr_SetString(PyExc_KeyError, "the name of the path given exists");
713 idcode= BKE_idcode_from_name(group);
715 PyErr_Format(PyExc_ValueError, "invalid group given \"%s\"", group);
719 Main *maggie= (Main *)MEM_callocN( sizeof(Main), "BgeMain");
720 kx_scene->GetSceneConverter()->GetMainDynamic().push_back(maggie);
721 strncpy(maggie->name, path, sizeof(maggie->name)-1);
723 /* Copy the object into main */
725 PyObject *ret= PyList_New(0);
727 for(int i= 0; i < PyList_GET_SIZE(names); i++) {
728 name= _PyUnicode_AsString(PyList_GET_ITEM(names, i));
730 RAS_MeshObject *meshobj= kx_scene->GetSceneConverter()->ConvertMeshSpecial(kx_scene, maggie, name);
732 KX_MeshProxy* meshproxy = new KX_MeshProxy(meshobj);
733 item= meshproxy->NewProxy(true);
734 PyList_Append(ret, item);
739 PyErr_Clear(); /* wasnt a string, ignore for now */
746 PyErr_Format(PyExc_ValueError, "only \"Mesh\" group currently supported");
753 static PyObject *gLibFree(PyObject*, PyObject* args)
755 KX_Scene *kx_scene= gp_KetsjiScene;
758 if (!PyArg_ParseTuple(args,"s:LibFree",&path))
761 if (kx_scene->GetSceneConverter()->FreeBlendFile(path))
770 static PyObject *gLibList(PyObject*, PyObject* args)
772 vector<Main*> &dynMaggie = gp_KetsjiScene->GetSceneConverter()->GetMainDynamic();
774 PyObject *list= PyList_New(dynMaggie.size());
776 for (vector<Main*>::iterator it=dynMaggie.begin(); !(it==dynMaggie.end()); it++)
778 PyList_SET_ITEM(list, i++, PyUnicode_FromString( (*it)->name) );
784 static struct PyMethodDef game_methods[] = {
785 {"expandPath", (PyCFunction)gPyExpandPath, METH_VARARGS, (const char *)gPyExpandPath_doc},
786 {"startGame", (PyCFunction)gPyStartGame, METH_VARARGS, (const char *)gPyStartGame_doc},
787 {"endGame", (PyCFunction)gPyEndGame, METH_NOARGS, (const char *)gPyEndGame_doc},
788 {"restartGame", (PyCFunction)gPyRestartGame, METH_NOARGS, (const char *)gPyRestartGame_doc},
789 {"saveGlobalDict", (PyCFunction)gPySaveGlobalDict, METH_NOARGS, (const char *)gPySaveGlobalDict_doc},
790 {"loadGlobalDict", (PyCFunction)gPyLoadGlobalDict, METH_NOARGS, (const char *)gPyLoadGlobalDict_doc},
791 {"sendMessage", (PyCFunction)gPySendMessage, METH_VARARGS, (const char *)gPySendMessage_doc},
792 {"getCurrentController", (PyCFunction) SCA_PythonController::sPyGetCurrentController, METH_NOARGS, SCA_PythonController::sPyGetCurrentController__doc__},
793 {"getCurrentScene", (PyCFunction) gPyGetCurrentScene, METH_NOARGS, gPyGetCurrentScene_doc},
794 {"getSceneList", (PyCFunction) gPyGetSceneList, METH_NOARGS, (const char *)gPyGetSceneList_doc},
795 {"addScene", (PyCFunction)gPyAddScene, METH_VARARGS, (const char *)gPyAddScene_doc},
796 {"getRandomFloat",(PyCFunction) gPyGetRandomFloat, METH_NOARGS, (const char *)gPyGetRandomFloat_doc},
797 {"setGravity",(PyCFunction) gPySetGravity, METH_O, (const char *)"set Gravitation"},
798 {"getSpectrum",(PyCFunction) gPyGetSpectrum, METH_NOARGS, (const char *)"get audio spectrum"},
799 {"getMaxLogicFrame", (PyCFunction) gPyGetMaxLogicFrame, METH_NOARGS, (const char *)"Gets the max number of logic frame per render frame"},
800 {"setMaxLogicFrame", (PyCFunction) gPySetMaxLogicFrame, METH_VARARGS, (const char *)"Sets the max number of logic frame per render frame"},
801 {"getMaxPhysicsFrame", (PyCFunction) gPyGetMaxPhysicsFrame, METH_NOARGS, (const char *)"Gets the max number of physics frame per render frame"},
802 {"setMaxPhysicsFrame", (PyCFunction) gPySetMaxPhysicsFrame, METH_VARARGS, (const char *)"Sets the max number of physics farme per render frame"},
803 {"getLogicTicRate", (PyCFunction) gPyGetLogicTicRate, METH_NOARGS, (const char *)"Gets the logic tic rate"},
804 {"setLogicTicRate", (PyCFunction) gPySetLogicTicRate, METH_VARARGS, (const char *)"Sets the logic tic rate"},
805 {"getPhysicsTicRate", (PyCFunction) gPyGetPhysicsTicRate, METH_NOARGS, (const char *)"Gets the physics tic rate"},
806 {"setPhysicsTicRate", (PyCFunction) gPySetPhysicsTicRate, METH_VARARGS, (const char *)"Sets the physics tic rate"},
807 {"getAverageFrameRate", (PyCFunction) gPyGetAverageFrameRate, METH_NOARGS, (const char *)"Gets the estimated average frame rate"},
808 {"getBlendFileList", (PyCFunction)gPyGetBlendFileList, METH_VARARGS, (const char *)"Gets a list of blend files in the same directory as the current blend file"},
809 {"PrintGLInfo", (PyCFunction)pyPrintExt, METH_NOARGS, (const char *)"Prints GL Extension Info"},
810 {"PrintMemInfo", (PyCFunction)pyPrintStats, METH_NOARGS, (const char *)"Print engine stastics"},
812 /* library functions */
813 {"LibLoad", (PyCFunction)gLibLoad, METH_VARARGS|METH_KEYWORDS, (const char *)""},
814 {"LibNew", (PyCFunction)gLibNew, METH_VARARGS, (const char *)""},
815 {"LibFree", (PyCFunction)gLibFree, METH_VARARGS, (const char *)""},
816 {"LibList", (PyCFunction)gLibList, METH_VARARGS, (const char *)""},
818 {NULL, (PyCFunction) NULL, 0, NULL }
821 static PyObject* gPyGetWindowHeight(PyObject*, PyObject* args)
823 return PyLong_FromSsize_t((gp_Canvas ? gp_Canvas->GetHeight() : 0));
828 static PyObject* gPyGetWindowWidth(PyObject*, PyObject* args)
830 return PyLong_FromSsize_t((gp_Canvas ? gp_Canvas->GetWidth() : 0));
835 // temporarility visibility thing, will be moved to rasterizer/renderer later
836 bool gUseVisibilityTemp = false;
838 static PyObject* gPyEnableVisibility(PyObject*, PyObject* args)
841 if (!PyArg_ParseTuple(args,"i:enableVisibility",&visible))
844 gUseVisibilityTemp = (visible != 0);
850 static PyObject* gPyShowMouse(PyObject*, PyObject* args)
853 if (!PyArg_ParseTuple(args,"i:showMouse",&visible))
859 gp_Canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
863 gp_Canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
871 static PyObject* gPySetMousePosition(PyObject*, PyObject* args)
874 if (!PyArg_ParseTuple(args,"ii:setMousePosition",&x,&y))
878 gp_Canvas->SetMousePosition(x,y);
883 static PyObject* gPySetEyeSeparation(PyObject*, PyObject* args)
886 if (!PyArg_ParseTuple(args, "f:setEyeSeparation", &sep))
889 if (!gp_Rasterizer) {
890 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setEyeSeparation(float), Rasterizer not available");
894 gp_Rasterizer->SetEyeSeparation(sep);
899 static PyObject* gPyGetEyeSeparation(PyObject*)
901 if (!gp_Rasterizer) {
902 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.getEyeSeparation(), Rasterizer not available");
906 return PyFloat_FromDouble(gp_Rasterizer->GetEyeSeparation());
909 static PyObject* gPySetFocalLength(PyObject*, PyObject* args)
912 if (!PyArg_ParseTuple(args, "f:setFocalLength", &focus))
915 if (!gp_Rasterizer) {
916 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setFocalLength(float), Rasterizer not available");
920 gp_Rasterizer->SetFocalLength(focus);
925 static PyObject* gPyGetFocalLength(PyObject*, PyObject*, PyObject*)
927 if (!gp_Rasterizer) {
928 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.getFocalLength(), Rasterizer not available");
932 return PyFloat_FromDouble(gp_Rasterizer->GetFocalLength());
937 static PyObject* gPySetBackgroundColor(PyObject*, PyObject* value)
941 if (!PyVecTo(value, vec))
946 gp_Rasterizer->SetBackColor((float)vec[0], (float)vec[1], (float)vec[2], (float)vec[3]);
949 KX_WorldInfo *wi = gp_KetsjiScene->GetWorldInfo();
951 wi->setBackColor((float)vec[0], (float)vec[1], (float)vec[2]);
958 static PyObject* gPySetMistColor(PyObject*, PyObject* value)
962 if (!PyVecTo(value, vec))
965 if (!gp_Rasterizer) {
966 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setMistColor(color), Rasterizer not available");
969 gp_Rasterizer->SetFogColor((float)vec[0], (float)vec[1], (float)vec[2]);
974 static PyObject* gPyDisableMist(PyObject*)
977 if (!gp_Rasterizer) {
978 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setMistColor(color), Rasterizer not available");
981 gp_Rasterizer->DisableFog();
986 static PyObject* gPySetMistStart(PyObject*, PyObject* args)
990 if (!PyArg_ParseTuple(args,"f:setMistStart",&miststart))
993 if (!gp_Rasterizer) {
994 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setMistStart(float), Rasterizer not available");
998 gp_Rasterizer->SetFogStart(miststart);
1005 static PyObject* gPySetMistEnd(PyObject*, PyObject* args)
1009 if (!PyArg_ParseTuple(args,"f:setMistEnd",&mistend))
1012 if (!gp_Rasterizer) {
1013 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setMistEnd(float), Rasterizer not available");
1017 gp_Rasterizer->SetFogEnd(mistend);
1023 static PyObject* gPySetAmbientColor(PyObject*, PyObject* value)
1027 if (!PyVecTo(value, vec))
1030 if (!gp_Rasterizer) {
1031 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setAmbientColor(color), Rasterizer not available");
1034 gp_Rasterizer->SetAmbientColor((float)vec[0], (float)vec[1], (float)vec[2]);
1042 static PyObject* gPyMakeScreenshot(PyObject*, PyObject* args)
1045 if (!PyArg_ParseTuple(args,"s:makeScreenshot",&filename))
1050 gp_Canvas->MakeScreenShot(filename);
1056 static PyObject* gPyEnableMotionBlur(PyObject*, PyObject* args)
1058 float motionblurvalue;
1059 if (!PyArg_ParseTuple(args,"f:enableMotionBlur",&motionblurvalue))
1062 if (!gp_Rasterizer) {
1063 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.enableMotionBlur(float), Rasterizer not available");
1067 gp_Rasterizer->EnableMotionBlur(motionblurvalue);
1072 static PyObject* gPyDisableMotionBlur(PyObject*)
1074 if (!gp_Rasterizer) {
1075 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.disableMotionBlur(), Rasterizer not available");
1079 gp_Rasterizer->DisableMotionBlur();
1084 int getGLSLSettingFlag(char *setting)
1086 if(strcmp(setting, "lights") == 0)
1087 return GAME_GLSL_NO_LIGHTS;
1088 else if(strcmp(setting, "shaders") == 0)
1089 return GAME_GLSL_NO_SHADERS;
1090 else if(strcmp(setting, "shadows") == 0)
1091 return GAME_GLSL_NO_SHADOWS;
1092 else if(strcmp(setting, "ramps") == 0)
1093 return GAME_GLSL_NO_RAMPS;
1094 else if(strcmp(setting, "nodes") == 0)
1095 return GAME_GLSL_NO_NODES;
1096 else if(strcmp(setting, "extra_textures") == 0)
1097 return GAME_GLSL_NO_EXTRA_TEX;
1102 static PyObject* gPySetGLSLMaterialSetting(PyObject*,
1106 GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
1108 int enable, flag, sceneflag;
1110 if (!PyArg_ParseTuple(args,"si:setGLSLMaterialSetting",&setting,&enable))
1113 flag = getGLSLSettingFlag(setting);
1116 PyErr_SetString(PyExc_ValueError, "Rasterizer.setGLSLMaterialSetting(string): glsl setting is not known");
1120 sceneflag= gm->flag;
1127 /* display lists and GLSL materials need to be remade */
1128 if(sceneflag != gm->flag) {
1129 GPU_materials_free();
1130 if(gp_KetsjiEngine) {
1131 KX_SceneList *scenes = gp_KetsjiEngine->CurrentScenes();
1132 KX_SceneList::iterator it;
1134 for(it=scenes->begin(); it!=scenes->end(); it++)
1135 if((*it)->GetBucketManager()) {
1136 (*it)->GetBucketManager()->ReleaseDisplayLists();
1137 (*it)->GetBucketManager()->ReleaseMaterials();
1145 static PyObject* gPyGetGLSLMaterialSetting(PyObject*,
1149 GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
1151 int enabled = 0, flag;
1153 if (!PyArg_ParseTuple(args,"s:getGLSLMaterialSetting",&setting))
1156 flag = getGLSLSettingFlag(setting);
1159 PyErr_SetString(PyExc_ValueError, "Rasterizer.getGLSLMaterialSetting(string): glsl setting is not known");
1163 enabled = ((gm->flag & flag) != 0);
1164 return PyLong_FromSsize_t(enabled);
1167 #define KX_TEXFACE_MATERIAL 0
1168 #define KX_BLENDER_MULTITEX_MATERIAL 1
1169 #define KX_BLENDER_GLSL_MATERIAL 2
1171 static PyObject* gPySetMaterialType(PyObject*,
1175 GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
1178 if (!PyArg_ParseTuple(args,"i:setMaterialType",&type))
1181 if(type == KX_BLENDER_GLSL_MATERIAL)
1182 gm->matmode= GAME_MAT_GLSL;
1183 else if(type == KX_BLENDER_MULTITEX_MATERIAL)
1184 gm->matmode= GAME_MAT_MULTITEX;
1185 else if(type == KX_TEXFACE_MATERIAL)
1186 gm->matmode= GAME_MAT_TEXFACE;
1188 PyErr_SetString(PyExc_ValueError, "Rasterizer.setMaterialType(int): material type is not known");
1195 static PyObject* gPyGetMaterialType(PyObject*)
1197 GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
1200 if(gm->matmode == GAME_MAT_GLSL)
1201 flag = KX_BLENDER_GLSL_MATERIAL;
1202 else if(gm->matmode == GAME_MAT_MULTITEX)
1203 flag = KX_BLENDER_MULTITEX_MATERIAL;
1205 flag = KX_TEXFACE_MATERIAL;
1207 return PyLong_FromSsize_t(flag);
1210 static PyObject* gPyDrawLine(PyObject*, PyObject* args)
1216 if (!gp_Rasterizer) {
1217 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.drawLine(obFrom, obTo, color): Rasterizer not available");
1221 if (!PyArg_ParseTuple(args,"OOO:drawLine",&ob_from,&ob_to,&ob_color))
1227 if (!PyVecTo(ob_from, from))
1229 if (!PyVecTo(ob_to, to))
1231 if (!PyVecTo(ob_color, color))
1234 gp_Rasterizer->DrawDebugLine(from,to,color);
1239 static struct PyMethodDef rasterizer_methods[] = {
1240 {"getWindowWidth",(PyCFunction) gPyGetWindowWidth,
1241 METH_VARARGS, "getWindowWidth doc"},
1242 {"getWindowHeight",(PyCFunction) gPyGetWindowHeight,
1243 METH_VARARGS, "getWindowHeight doc"},
1244 {"makeScreenshot",(PyCFunction)gPyMakeScreenshot,
1245 METH_VARARGS, "make Screenshot doc"},
1246 {"enableVisibility",(PyCFunction) gPyEnableVisibility,
1247 METH_VARARGS, "enableVisibility doc"},
1248 {"showMouse",(PyCFunction) gPyShowMouse,
1249 METH_VARARGS, "showMouse(bool visible)"},
1250 {"setMousePosition",(PyCFunction) gPySetMousePosition,
1251 METH_VARARGS, "setMousePosition(int x,int y)"},
1252 {"setBackgroundColor",(PyCFunction)gPySetBackgroundColor,METH_O,"set Background Color (rgb)"},
1253 {"setAmbientColor",(PyCFunction)gPySetAmbientColor,METH_O,"set Ambient Color (rgb)"},
1254 {"disableMist",(PyCFunction)gPyDisableMist,METH_NOARGS,"turn off mist"},
1255 {"setMistColor",(PyCFunction)gPySetMistColor,METH_O,"set Mist Color (rgb)"},
1256 {"setMistStart",(PyCFunction)gPySetMistStart,METH_VARARGS,"set Mist Start(rgb)"},
1257 {"setMistEnd",(PyCFunction)gPySetMistEnd,METH_VARARGS,"set Mist End(rgb)"},
1258 {"enableMotionBlur",(PyCFunction)gPyEnableMotionBlur,METH_VARARGS,"enable motion blur"},
1259 {"disableMotionBlur",(PyCFunction)gPyDisableMotionBlur,METH_NOARGS,"disable motion blur"},
1262 {"setEyeSeparation", (PyCFunction) gPySetEyeSeparation, METH_VARARGS, "set the eye separation for stereo mode"},
1263 {"getEyeSeparation", (PyCFunction) gPyGetEyeSeparation, METH_NOARGS, "get the eye separation for stereo mode"},
1264 {"setFocalLength", (PyCFunction) gPySetFocalLength, METH_VARARGS, "set the focal length for stereo mode"},
1265 {"getFocalLength", (PyCFunction) gPyGetFocalLength, METH_VARARGS, "get the focal length for stereo mode"},
1266 {"setMaterialMode",(PyCFunction) gPySetMaterialType,
1267 METH_VARARGS, "set the material mode to use for OpenGL rendering"},
1268 {"getMaterialMode",(PyCFunction) gPyGetMaterialType,
1269 METH_NOARGS, "get the material mode being used for OpenGL rendering"},
1270 {"setGLSLMaterialSetting",(PyCFunction) gPySetGLSLMaterialSetting,
1271 METH_VARARGS, "set the state of a GLSL material setting"},
1272 {"getGLSLMaterialSetting",(PyCFunction) gPyGetGLSLMaterialSetting,
1273 METH_VARARGS, "get the state of a GLSL material setting"},
1274 {"drawLine", (PyCFunction) gPyDrawLine,
1275 METH_VARARGS, "draw a line on the screen"},
1276 { NULL, (PyCFunction) NULL, 0, NULL }
1279 // Initialization function for the module (*must* be called initGameLogic)
1281 static char GameLogic_module_documentation[] =
1282 "This is the Python API for the game engine of bge.logic"
1285 static char Rasterizer_module_documentation[] =
1286 "This is the Python API for the game engine of Rasterizer"
1289 static struct PyModuleDef GameLogic_module_def = {
1291 "GameLogic", /* m_name */
1292 GameLogic_module_documentation, /* m_doc */
1294 game_methods, /* m_methods */
1301 PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack to get gravity hook
1305 PyObject* item; /* temp PyObject* storage */
1307 gp_KetsjiEngine = engine;
1308 gp_KetsjiScene = scene;
1310 gUseVisibilityTemp=false;
1312 PyObjectPlus::ClearDeprecationWarning(); /* Not that nice to call here but makes sure warnings are reset between loading scenes */
1314 /* Use existing module where possible
1315 * be careful not to init any runtime vars after this */
1316 m = PyImport_ImportModule( "GameLogic" );
1323 // Create the module and add the functions
1324 m = PyModule_Create(&GameLogic_module_def);
1325 PyDict_SetItemString(PySys_GetObject("modules"), GameLogic_module_def.m_name, m);
1328 // Add some symbolic constants to the module
1329 d = PyModule_GetDict(m);
1331 // can be overwritten later for gameEngine instances that can load new blend files and re-initialize this module
1332 // for now its safe to make sure it exists for other areas such as the web plugin
1334 PyDict_SetItemString(d, "globalDict", item=PyDict_New()); Py_DECREF(item);
1336 // Add keyboard and mouse attributes to this module
1337 MT_assert(!gp_PythonKeyboard);
1338 gp_PythonKeyboard = new SCA_PythonKeyboard(gp_KetsjiEngine->GetKeyboardDevice());
1339 PyDict_SetItemString(d, "keyboard", gp_PythonKeyboard->NewProxy(true));
1341 MT_assert(!gp_PythonMouse);
1342 gp_PythonMouse = new SCA_PythonMouse(gp_KetsjiEngine->GetMouseDevice(), gp_Canvas);
1343 PyDict_SetItemString(d, "mouse", gp_PythonMouse->NewProxy(true));
1345 ErrorObject = PyUnicode_FromString("GameLogic.error");
1346 PyDict_SetItemString(d, "error", ErrorObject);
1347 Py_DECREF(ErrorObject);
1349 // XXXX Add constants here
1350 /* To use logic bricks, we need some sort of constants. Here, we associate */
1351 /* constants and sumbolic names. Add them to dictionary d. */
1353 /* 1. true and false: needed for everyone */
1354 KX_MACRO_addTypesToDict(d, KX_TRUE, SCA_ILogicBrick::KX_TRUE);
1355 KX_MACRO_addTypesToDict(d, KX_FALSE, SCA_ILogicBrick::KX_FALSE);
1357 /* 2. Property sensor */
1358 KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_EQUAL, SCA_PropertySensor::KX_PROPSENSOR_EQUAL);
1359 KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_NOTEQUAL, SCA_PropertySensor::KX_PROPSENSOR_NOTEQUAL);
1360 KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_INTERVAL, SCA_PropertySensor::KX_PROPSENSOR_INTERVAL);
1361 KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_CHANGED, SCA_PropertySensor::KX_PROPSENSOR_CHANGED);
1362 KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_EXPRESSION, SCA_PropertySensor::KX_PROPSENSOR_EXPRESSION);
1364 /* 3. Constraint actuator */
1365 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCX);
1366 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCY);
1367 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCZ);
1368 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ROTX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTX);
1369 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ROTY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTY);
1370 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ROTZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTZ);
1371 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRPX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPX);
1372 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRPY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPY);
1373 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRPZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPZ);
1374 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRNX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNX);
1375 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRNY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNY);
1376 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRNZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNZ);
1377 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ORIX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIX);
1378 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ORIY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIY);
1379 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ORIZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIZ);
1380 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHPX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPX);
1381 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHPY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPY);
1382 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHPZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPZ);
1383 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHNX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNX);
1384 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHNY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNY);
1385 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHNZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNZ);
1386 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_NORMAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_NORMAL);
1387 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_MATERIAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_MATERIAL);
1388 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_PERMANENT, KX_ConstraintActuator::KX_ACT_CONSTRAINT_PERMANENT);
1389 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DISTANCE, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DISTANCE);
1390 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCAL);
1391 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DOROTFH, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DOROTFH);
1393 /* 4. Ipo actuator, simple part */
1394 KX_MACRO_addTypesToDict(d, KX_IPOACT_PLAY, KX_IpoActuator::KX_ACT_IPO_PLAY);
1395 KX_MACRO_addTypesToDict(d, KX_IPOACT_PINGPONG, KX_IpoActuator::KX_ACT_IPO_PINGPONG);
1396 KX_MACRO_addTypesToDict(d, KX_IPOACT_FLIPPER, KX_IpoActuator::KX_ACT_IPO_FLIPPER);
1397 KX_MACRO_addTypesToDict(d, KX_IPOACT_LOOPSTOP, KX_IpoActuator::KX_ACT_IPO_LOOPSTOP);
1398 KX_MACRO_addTypesToDict(d, KX_IPOACT_LOOPEND, KX_IpoActuator::KX_ACT_IPO_LOOPEND);
1399 KX_MACRO_addTypesToDict(d, KX_IPOACT_FROM_PROP,KX_IpoActuator::KX_ACT_IPO_FROM_PROP);
1401 /* 5. Random distribution types */
1402 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_BOOL_CONST, SCA_RandomActuator::KX_RANDOMACT_BOOL_CONST);
1403 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_BOOL_UNIFORM, SCA_RandomActuator::KX_RANDOMACT_BOOL_UNIFORM);
1404 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_BOOL_BERNOUILLI, SCA_RandomActuator::KX_RANDOMACT_BOOL_BERNOUILLI);
1405 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_INT_CONST, SCA_RandomActuator::KX_RANDOMACT_INT_CONST);
1406 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_INT_UNIFORM, SCA_RandomActuator::KX_RANDOMACT_INT_UNIFORM);
1407 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_INT_POISSON, SCA_RandomActuator::KX_RANDOMACT_INT_POISSON);
1408 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_FLOAT_CONST, SCA_RandomActuator::KX_RANDOMACT_FLOAT_CONST);
1409 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_FLOAT_UNIFORM, SCA_RandomActuator::KX_RANDOMACT_FLOAT_UNIFORM);
1410 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_FLOAT_NORMAL, SCA_RandomActuator::KX_RANDOMACT_FLOAT_NORMAL);
1411 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_FLOAT_NEGATIVE_EXPONENTIAL, SCA_RandomActuator::KX_RANDOMACT_FLOAT_NEGATIVE_EXPONENTIAL);
1413 /* 6. Sound actuator */
1414 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_PLAYSTOP, KX_SoundActuator::KX_SOUNDACT_PLAYSTOP);
1415 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_PLAYEND, KX_SoundActuator::KX_SOUNDACT_PLAYEND);
1416 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPSTOP, KX_SoundActuator::KX_SOUNDACT_LOOPSTOP);
1417 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPEND, KX_SoundActuator::KX_SOUNDACT_LOOPEND);
1418 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPBIDIRECTIONAL, KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL);
1419 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP, KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP);
1421 /* 7. Action actuator */
1422 KX_MACRO_addTypesToDict(d, KX_ACTIONACT_PLAY, ACT_ACTION_PLAY);
1423 KX_MACRO_addTypesToDict(d, KX_ACTIONACT_PINGPONG, ACT_ACTION_PINGPONG);
1424 KX_MACRO_addTypesToDict(d, KX_ACTIONACT_FLIPPER, ACT_ACTION_FLIPPER);
1425 KX_MACRO_addTypesToDict(d, KX_ACTIONACT_LOOPSTOP, ACT_ACTION_LOOP_STOP);
1426 KX_MACRO_addTypesToDict(d, KX_ACTIONACT_LOOPEND, ACT_ACTION_LOOP_END);
1427 KX_MACRO_addTypesToDict(d, KX_ACTIONACT_PROPERTY, ACT_ACTION_FROM_PROP);
1429 /*8. GL_BlendFunc */
1430 KX_MACRO_addTypesToDict(d, BL_ZERO, GL_ZERO);
1431 KX_MACRO_addTypesToDict(d, BL_ONE, GL_ONE);
1432 KX_MACRO_addTypesToDict(d, BL_SRC_COLOR, GL_SRC_COLOR);
1433 KX_MACRO_addTypesToDict(d, BL_ONE_MINUS_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
1434 KX_MACRO_addTypesToDict(d, BL_DST_COLOR, GL_DST_COLOR);
1435 KX_MACRO_addTypesToDict(d, BL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_DST_COLOR);
1436 KX_MACRO_addTypesToDict(d, BL_SRC_ALPHA, GL_SRC_ALPHA);
1437 KX_MACRO_addTypesToDict(d, BL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1438 KX_MACRO_addTypesToDict(d, BL_DST_ALPHA, GL_DST_ALPHA);
1439 KX_MACRO_addTypesToDict(d, BL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
1440 KX_MACRO_addTypesToDict(d, BL_SRC_ALPHA_SATURATE, GL_SRC_ALPHA_SATURATE);
1443 /* 9. UniformTypes */
1444 KX_MACRO_addTypesToDict(d, SHD_TANGENT, BL_Shader::SHD_TANGENT);
1445 KX_MACRO_addTypesToDict(d, MODELVIEWMATRIX, BL_Shader::MODELVIEWMATRIX);
1446 KX_MACRO_addTypesToDict(d, MODELVIEWMATRIX_TRANSPOSE, BL_Shader::MODELVIEWMATRIX_TRANSPOSE);
1447 KX_MACRO_addTypesToDict(d, MODELVIEWMATRIX_INVERSE, BL_Shader::MODELVIEWMATRIX_INVERSE);
1448 KX_MACRO_addTypesToDict(d, MODELVIEWMATRIX_INVERSETRANSPOSE, BL_Shader::MODELVIEWMATRIX_INVERSETRANSPOSE);
1449 KX_MACRO_addTypesToDict(d, MODELMATRIX, BL_Shader::MODELMATRIX);
1450 KX_MACRO_addTypesToDict(d, MODELMATRIX_TRANSPOSE, BL_Shader::MODELMATRIX_TRANSPOSE);
1451 KX_MACRO_addTypesToDict(d, MODELMATRIX_INVERSE, BL_Shader::MODELMATRIX_INVERSE);
1452 KX_MACRO_addTypesToDict(d, MODELMATRIX_INVERSETRANSPOSE, BL_Shader::MODELMATRIX_INVERSETRANSPOSE);
1453 KX_MACRO_addTypesToDict(d, VIEWMATRIX, BL_Shader::VIEWMATRIX);
1454 KX_MACRO_addTypesToDict(d, VIEWMATRIX_TRANSPOSE, BL_Shader::VIEWMATRIX_TRANSPOSE);
1455 KX_MACRO_addTypesToDict(d, VIEWMATRIX_INVERSE, BL_Shader::VIEWMATRIX_INVERSE);
1456 KX_MACRO_addTypesToDict(d, VIEWMATRIX_INVERSETRANSPOSE, BL_Shader::VIEWMATRIX_INVERSETRANSPOSE);
1457 KX_MACRO_addTypesToDict(d, CAM_POS, BL_Shader::CAM_POS);
1458 KX_MACRO_addTypesToDict(d, CONSTANT_TIMER, BL_Shader::CONSTANT_TIMER);
1460 /* 10 state actuator */
1461 KX_MACRO_addTypesToDict(d, KX_STATE1, (1<<0));
1462 KX_MACRO_addTypesToDict(d, KX_STATE2, (1<<1));
1463 KX_MACRO_addTypesToDict(d, KX_STATE3, (1<<2));
1464 KX_MACRO_addTypesToDict(d, KX_STATE4, (1<<3));
1465 KX_MACRO_addTypesToDict(d, KX_STATE5, (1<<4));
1466 KX_MACRO_addTypesToDict(d, KX_STATE6, (1<<5));
1467 KX_MACRO_addTypesToDict(d, KX_STATE7, (1<<6));
1468 KX_MACRO_addTypesToDict(d, KX_STATE8, (1<<7));
1469 KX_MACRO_addTypesToDict(d, KX_STATE9, (1<<8));
1470 KX_MACRO_addTypesToDict(d, KX_STATE10, (1<<9));
1471 KX_MACRO_addTypesToDict(d, KX_STATE11, (1<<10));
1472 KX_MACRO_addTypesToDict(d, KX_STATE12, (1<<11));
1473 KX_MACRO_addTypesToDict(d, KX_STATE13, (1<<12));
1474 KX_MACRO_addTypesToDict(d, KX_STATE14, (1<<13));
1475 KX_MACRO_addTypesToDict(d, KX_STATE15, (1<<14));
1476 KX_MACRO_addTypesToDict(d, KX_STATE16, (1<<15));
1477 KX_MACRO_addTypesToDict(d, KX_STATE17, (1<<16));
1478 KX_MACRO_addTypesToDict(d, KX_STATE18, (1<<17));
1479 KX_MACRO_addTypesToDict(d, KX_STATE19, (1<<18));
1480 KX_MACRO_addTypesToDict(d, KX_STATE20, (1<<19));
1481 KX_MACRO_addTypesToDict(d, KX_STATE21, (1<<20));
1482 KX_MACRO_addTypesToDict(d, KX_STATE22, (1<<21));
1483 KX_MACRO_addTypesToDict(d, KX_STATE23, (1<<22));
1484 KX_MACRO_addTypesToDict(d, KX_STATE24, (1<<23));
1485 KX_MACRO_addTypesToDict(d, KX_STATE25, (1<<24));
1486 KX_MACRO_addTypesToDict(d, KX_STATE26, (1<<25));
1487 KX_MACRO_addTypesToDict(d, KX_STATE27, (1<<26));
1488 KX_MACRO_addTypesToDict(d, KX_STATE28, (1<<27));
1489 KX_MACRO_addTypesToDict(d, KX_STATE29, (1<<28));
1490 KX_MACRO_addTypesToDict(d, KX_STATE30, (1<<29));
1493 KX_MACRO_addTypesToDict(d, KX_SENSOR_JUST_ACTIVATED, SCA_ISensor::KX_SENSOR_JUST_ACTIVATED);
1494 KX_MACRO_addTypesToDict(d, KX_SENSOR_ACTIVE, SCA_ISensor::KX_SENSOR_ACTIVE);
1495 KX_MACRO_addTypesToDict(d, KX_SENSOR_JUST_DEACTIVATED, SCA_ISensor::KX_SENSOR_JUST_DEACTIVATED);
1496 KX_MACRO_addTypesToDict(d, KX_SENSOR_INACTIVE, SCA_ISensor::KX_SENSOR_INACTIVE);
1499 KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_POS_X, KX_RadarSensor::KX_RADAR_AXIS_POS_X);
1500 KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_POS_Y, KX_RadarSensor::KX_RADAR_AXIS_POS_Y);
1501 KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_POS_Z, KX_RadarSensor::KX_RADAR_AXIS_POS_Z);
1502 KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_NEG_X, KX_RadarSensor::KX_RADAR_AXIS_NEG_Y);
1503 KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_NEG_Y, KX_RadarSensor::KX_RADAR_AXIS_NEG_X);
1504 KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_NEG_Z, KX_RadarSensor::KX_RADAR_AXIS_NEG_Z);
1507 KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_POS_X, KX_RaySensor::KX_RAY_AXIS_POS_X);
1508 KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_POS_Y, KX_RaySensor::KX_RAY_AXIS_POS_Y);
1509 KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_POS_Z, KX_RaySensor::KX_RAY_AXIS_POS_Z);
1510 KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_NEG_X, KX_RaySensor::KX_RAY_AXIS_NEG_Y);
1511 KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_NEG_Y, KX_RaySensor::KX_RAY_AXIS_NEG_X);
1512 KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_NEG_Z, KX_RaySensor::KX_RAY_AXIS_NEG_Z);
1514 /* Dynamic actuator */
1515 KX_MACRO_addTypesToDict(d, KX_DYN_RESTORE_DYNAMICS, KX_SCA_DynamicActuator::KX_DYN_RESTORE_DYNAMICS);
1516 KX_MACRO_addTypesToDict(d, KX_DYN_DISABLE_DYNAMICS, KX_SCA_DynamicActuator::KX_DYN_DISABLE_DYNAMICS);
1517 KX_MACRO_addTypesToDict(d, KX_DYN_ENABLE_RIGID_BODY, KX_SCA_DynamicActuator::KX_DYN_ENABLE_RIGID_BODY);
1518 KX_MACRO_addTypesToDict(d, KX_DYN_DISABLE_RIGID_BODY, KX_SCA_DynamicActuator::KX_DYN_DISABLE_RIGID_BODY);
1519 KX_MACRO_addTypesToDict(d, KX_DYN_SET_MASS, KX_SCA_DynamicActuator::KX_DYN_SET_MASS);
1521 /* Input & Mouse Sensor */
1522 KX_MACRO_addTypesToDict(d, KX_INPUT_NONE, SCA_InputEvent::KX_NO_INPUTSTATUS);
1523 KX_MACRO_addTypesToDict(d, KX_INPUT_JUST_ACTIVATED, SCA_InputEvent::KX_JUSTACTIVATED);
1524 KX_MACRO_addTypesToDict(d, KX_INPUT_ACTIVE, SCA_InputEvent::KX_ACTIVE);
1525 KX_MACRO_addTypesToDict(d, KX_INPUT_JUST_RELEASED, SCA_InputEvent::KX_JUSTRELEASED);
1527 KX_MACRO_addTypesToDict(d, KX_MOUSE_BUT_LEFT, SCA_IInputDevice::KX_LEFTMOUSE);
1528 KX_MACRO_addTypesToDict(d, KX_MOUSE_BUT_MIDDLE, SCA_IInputDevice::KX_MIDDLEMOUSE);
1529 KX_MACRO_addTypesToDict(d, KX_MOUSE_BUT_RIGHT, SCA_IInputDevice::KX_RIGHTMOUSE);
1531 /* 2D Filter Actuator */
1532 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_ENABLED, RAS_2DFilterManager::RAS_2DFILTER_ENABLED);
1533 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_DISABLED, RAS_2DFilterManager::RAS_2DFILTER_DISABLED);
1534 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_NOFILTER, RAS_2DFilterManager::RAS_2DFILTER_NOFILTER);
1535 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_MOTIONBLUR, RAS_2DFilterManager::RAS_2DFILTER_MOTIONBLUR);
1536 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_BLUR, RAS_2DFilterManager::RAS_2DFILTER_BLUR);
1537 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_SHARPEN, RAS_2DFilterManager::RAS_2DFILTER_SHARPEN);
1538 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_DILATION, RAS_2DFilterManager::RAS_2DFILTER_DILATION);
1539 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_EROSION, RAS_2DFilterManager::RAS_2DFILTER_EROSION);
1540 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_LAPLACIAN, RAS_2DFilterManager::RAS_2DFILTER_LAPLACIAN);
1541 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_SOBEL, RAS_2DFilterManager::RAS_2DFILTER_SOBEL);
1542 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_PREWITT, RAS_2DFilterManager::RAS_2DFILTER_PREWITT);
1543 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_GRAYSCALE, RAS_2DFilterManager::RAS_2DFILTER_GRAYSCALE);
1544 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_SEPIA, RAS_2DFilterManager::RAS_2DFILTER_SEPIA);
1545 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_INVERT, RAS_2DFilterManager::RAS_2DFILTER_INVERT);
1546 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_CUSTOMFILTER, RAS_2DFilterManager::RAS_2DFILTER_CUSTOMFILTER);
1548 /* Sound Actuator */
1549 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_PLAYSTOP, KX_SoundActuator::KX_SOUNDACT_PLAYSTOP);
1550 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_PLAYEND, KX_SoundActuator::KX_SOUNDACT_PLAYEND);
1551 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPSTOP, KX_SoundActuator::KX_SOUNDACT_LOOPSTOP);
1552 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPEND, KX_SoundActuator:: KX_SOUNDACT_LOOPEND);
1553 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPBIDIRECTIONAL, KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL);
1554 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP, KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP);
1556 /* State Actuator */
1557 KX_MACRO_addTypesToDict(d, KX_STATE_OP_CPY, KX_StateActuator::OP_CPY);
1558 KX_MACRO_addTypesToDict(d, KX_STATE_OP_SET, KX_StateActuator::OP_SET);
1559 KX_MACRO_addTypesToDict(d, KX_STATE_OP_CLR, KX_StateActuator::OP_CLR);
1560 KX_MACRO_addTypesToDict(d, KX_STATE_OP_NEG, KX_StateActuator::OP_NEG);
1562 /* Game Actuator Modes */
1563 KX_MACRO_addTypesToDict(d, KX_GAME_LOAD, KX_GameActuator::KX_GAME_LOAD);
1564 KX_MACRO_addTypesToDict(d, KX_GAME_START, KX_GameActuator::KX_GAME_START);
1565 KX_MACRO_addTypesToDict(d, KX_GAME_RESTART, KX_GameActuator::KX_GAME_RESTART);
1566 KX_MACRO_addTypesToDict(d, KX_GAME_QUIT, KX_GameActuator::KX_GAME_QUIT);
1567 KX_MACRO_addTypesToDict(d, KX_GAME_SAVECFG, KX_GameActuator::KX_GAME_SAVECFG);
1568 KX_MACRO_addTypesToDict(d, KX_GAME_LOADCFG, KX_GameActuator::KX_GAME_LOADCFG);
1570 /* Scene Actuator Modes */
1571 KX_MACRO_addTypesToDict(d, KX_SCENE_RESTART, KX_SceneActuator::KX_SCENE_RESTART);
1572 KX_MACRO_addTypesToDict(d, KX_SCENE_SET_SCENE, KX_SceneActuator::KX_SCENE_SET_SCENE);
1573 KX_MACRO_addTypesToDict(d, KX_SCENE_SET_CAMERA, KX_SceneActuator::KX_SCENE_SET_CAMERA);
1574 KX_MACRO_addTypesToDict(d, KX_SCENE_ADD_FRONT_SCENE, KX_SceneActuator::KX_SCENE_ADD_FRONT_SCENE);
1575 KX_MACRO_addTypesToDict(d, KX_SCENE_ADD_BACK_SCENE, KX_SceneActuator::KX_SCENE_ADD_BACK_SCENE);
1576 KX_MACRO_addTypesToDict(d, KX_SCENE_REMOVE_SCENE, KX_SceneActuator::KX_SCENE_REMOVE_SCENE);
1577 KX_MACRO_addTypesToDict(d, KX_SCENE_SUSPEND, KX_SceneActuator::KX_SCENE_SUSPEND);
1578 KX_MACRO_addTypesToDict(d, KX_SCENE_RESUME, KX_SceneActuator::KX_SCENE_RESUME);
1580 /* Parent Actuator Modes */
1581 KX_MACRO_addTypesToDict(d, KX_PARENT_SET, KX_ParentActuator::KX_PARENT_SET);
1582 KX_MACRO_addTypesToDict(d, KX_PARENT_REMOVE, KX_ParentActuator::KX_PARENT_REMOVE);
1584 /* BL_ArmatureConstraint type */
1585 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_TRACKTO, CONSTRAINT_TYPE_TRACKTO);
1586 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_KINEMATIC, CONSTRAINT_TYPE_KINEMATIC);
1587 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_ROTLIKE, CONSTRAINT_TYPE_ROTLIKE);
1588 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_LOCLIKE, CONSTRAINT_TYPE_LOCLIKE);
1589 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_MINMAX, CONSTRAINT_TYPE_MINMAX);
1590 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_SIZELIKE, CONSTRAINT_TYPE_SIZELIKE);
1591 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_LOCKTRACK, CONSTRAINT_TYPE_LOCKTRACK);
1592 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_STRETCHTO, CONSTRAINT_TYPE_STRETCHTO);
1593 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_CLAMPTO, CONSTRAINT_TYPE_CLAMPTO);
1594 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_TRANSFORM, CONSTRAINT_TYPE_TRANSFORM);
1595 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_DISTLIMIT, CONSTRAINT_TYPE_DISTLIMIT);
1596 /* BL_ArmatureConstraint ik_type */
1597 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_COPYPOSE, CONSTRAINT_IK_COPYPOSE);
1598 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_DISTANCE, CONSTRAINT_IK_DISTANCE);
1599 /* BL_ArmatureConstraint ik_mode */
1600 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_MODE_INSIDE, LIMITDIST_INSIDE);
1601 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_MODE_OUTSIDE, LIMITDIST_OUTSIDE);
1602 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_MODE_ONSURFACE, LIMITDIST_ONSURFACE);
1603 /* BL_ArmatureConstraint ik_flag */
1604 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_TIP, CONSTRAINT_IK_TIP);
1605 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_ROT, CONSTRAINT_IK_ROT);
1606 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_STRETCH, CONSTRAINT_IK_STRETCH);
1607 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_POS, CONSTRAINT_IK_POS);
1608 /* KX_ArmatureSensor type */
1609 KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_STATE_CHANGED, SENS_ARM_STATE_CHANGED);
1610 KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_LIN_ERROR_BELOW, SENS_ARM_LIN_ERROR_BELOW);
1611 KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_LIN_ERROR_ABOVE, SENS_ARM_LIN_ERROR_ABOVE);
1612 KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_ROT_ERROR_BELOW, SENS_ARM_ROT_ERROR_BELOW);
1613 KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_ROT_ERROR_ABOVE, SENS_ARM_ROT_ERROR_ABOVE);
1615 /* BL_ArmatureActuator type */
1616 KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_RUN, ACT_ARM_RUN);
1617 KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_ENABLE, ACT_ARM_ENABLE);
1618 KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_DISABLE, ACT_ARM_DISABLE);
1619 KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_SETTARGET, ACT_ARM_SETTARGET);
1620 KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_SETWEIGHT, ACT_ARM_SETWEIGHT);
1622 /* BL_Armature Channel rotation_mode */
1623 KX_MACRO_addTypesToDict(d, ROT_MODE_QUAT, ROT_MODE_QUAT);
1624 KX_MACRO_addTypesToDict(d, ROT_MODE_XYZ, ROT_MODE_XYZ);
1625 KX_MACRO_addTypesToDict(d, ROT_MODE_XZY, ROT_MODE_XZY);
1626 KX_MACRO_addTypesToDict(d, ROT_MODE_YXZ, ROT_MODE_YXZ);
1627 KX_MACRO_addTypesToDict(d, ROT_MODE_YZX, ROT_MODE_YZX);
1628 KX_MACRO_addTypesToDict(d, ROT_MODE_ZXY, ROT_MODE_ZXY);
1629 KX_MACRO_addTypesToDict(d, ROT_MODE_ZYX, ROT_MODE_ZYX);
1632 if (PyErr_Occurred())
1634 Py_FatalError("can't initialize module bge.logic");
1642 * - backupPySysObjects() : stores sys.path in gp_OrigPythonSysPath
1643 * - initPySysObjects(main) : initializes the blendfile and library paths
1644 * - restorePySysObjects() : restores sys.path from gp_OrigPythonSysPath
1646 * These exist so the current blend dir "//" can always be used to import modules from.
1647 * the reason we need a few functions for this is that python is not only used by the game engine
1648 * so we cant just add to sys.path all the time, it would leave pythons state in a mess.
1649 * It would also be incorrect since loading blend files for new levels etc would alwasy add to sys.path
1651 * To play nice with blenders python, the sys.path is backed up and the current blendfile along
1652 * with all its lib paths are added to the sys path.
1653 * When loading a new blendfile, the original sys.path is restored and the new paths are added over the top.
1657 * So we can have external modules mixed with our blend files.
1659 static void backupPySysObjects(void)
1661 PyObject *sys_path= PySys_GetObject("path"); /* should never fail */
1662 PyObject *sys_mods= PySys_GetObject("modules"); /* should never fail */
1665 Py_XDECREF(gp_OrigPythonSysPath); /* just incase its set */
1666 gp_OrigPythonSysPath = PyList_GetSlice(sys_path, 0, INT_MAX); /* copy the list */
1669 Py_XDECREF(gp_OrigPythonSysModules); /* just incase its set */
1670 gp_OrigPythonSysModules = PyDict_Copy(sys_mods); /* copy the list */
1674 /* for initPySysObjects only,
1675 * takes a blend path and adds a scripts dir from it
1677 * "/home/me/foo.blend" -> "/home/me/scripts"
1679 static void initPySysObjects__append(PyObject *sys_path, char *filename)
1682 char expanded[FILE_MAXDIR + FILE_MAXFILE];
1684 BLI_split_dirfile(filename, expanded, NULL); /* get the dir part of filename only */
1685 BLI_path_abs(expanded, gp_GamePythonPath); /* filename from lib->filename is (always?) absolute, so this may not be needed but it wont hurt */
1686 BLI_cleanup_file(gp_GamePythonPath, expanded); /* Dont use BLI_cleanup_dir because it adds a slash - BREAKS WIN32 ONLY */
1687 item= PyUnicode_DecodeFSDefault(expanded);
1689 // printf("SysPath - '%s', '%s', '%s'\n", expanded, filename, gp_GamePythonPath);
1691 if(PySequence_Index(sys_path, item) == -1) {
1692 PyErr_Clear(); /* PySequence_Index sets a ValueError */
1693 PyList_Insert(sys_path, 0, item);
1698 static void initPySysObjects(Main *maggie)
1700 PyObject *sys_path= PySys_GetObject("path"); /* should never fail */
1702 if (gp_OrigPythonSysPath==NULL) {
1704 backupPySysObjects();
1707 /* get the original sys path when the BGE started */
1708 PyList_SetSlice(sys_path, 0, INT_MAX, gp_OrigPythonSysPath);
1711 Library *lib= (Library *)maggie->library.first;
1714 /* lib->name wont work in some cases (on win32),
1715 * even when expanding with gp_GamePythonPath, using lib->filename is less trouble */
1716 initPySysObjects__append(sys_path, lib->filepath);
1717 lib= (Library *)lib->id.next;
1720 initPySysObjects__append(sys_path, gp_GamePythonPath);
1722 // fprintf(stderr, "\nNew Path: %d ", PyList_Size(sys_path));
1723 // PyObject_Print(sys_path, stderr, 0);
1726 static void restorePySysObjects(void)
1728 if (gp_OrigPythonSysPath==NULL)
1731 PyObject *sys_path= PySys_GetObject("path"); /* should never fail */
1732 PyObject *sys_mods= PySys_GetObject("modules"); /* should never fail */
1735 PyList_SetSlice(sys_path, 0, INT_MAX, gp_OrigPythonSysPath);
1736 Py_DECREF(gp_OrigPythonSysPath);
1737 gp_OrigPythonSysPath= NULL;
1740 PyDict_Clear(sys_mods);
1741 PyDict_Update(sys_mods, gp_OrigPythonSysModules);
1742 Py_DECREF(gp_OrigPythonSysModules);
1743 gp_OrigPythonSysModules= NULL;
1746 // fprintf(stderr, "\nRestore Path: %d ", PyList_Size(sys_path));
1747 // PyObject_Print(sys_path, stderr, 0);
1750 // Copied from bpy_interface.c
1751 static struct _inittab bge_internal_modules[]= {
1752 {(char *)"mathutils", BPyInit_mathutils},
1753 {(char *)"bgl", BPyInit_bgl},
1754 {(char *)"blf", BPyInit_blf},
1755 {(char *)"aud", AUD_initPython},
1760 * Python is not initialised.
1761 * see bpy_interface.c's BPY_python_start() which shares the same functionality in blender.
1763 PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecurityLevel level, Main *maggie, int argc, char** argv)
1765 /* Yet another gotcha in the py api
1766 * Cant run PySys_SetArgv more then once because this adds the
1767 * binary dir to the sys.path each time.
1768 * Id have thaught python being totally restarted would make this ok but
1769 * somehow it remembers the sys.path - Campbell
1771 static bool first_time = true;
1774 STR_String pname = progname;
1775 Py_SetProgramName(pname.Ptr());
1780 /* must run before python initializes */
1781 PyImport_ExtendInittab(bge_internal_modules);
1783 /* find local python installation */
1784 PyC_SetHomePath(BLI_get_folder(BLENDER_SYSTEM_PYTHON, NULL));
1788 if(argv && first_time) { /* browser plugins dont currently set this */
1789 // Until python support ascii again, we use our own.
1790 // PySys_SetArgv(argc, argv);
1792 PyObject *py_argv= PyList_New(argc);
1794 for (i=0; i<argc; i++)
1795 PyList_SET_ITEM(py_argv, i, PyC_UnicodeFromByte(argv[i]));
1797 PySys_SetObject("argv", py_argv);
1801 bpy_import_init(PyEval_GetBuiltins());
1803 /* mathutils types are used by the BGE even if we dont import them */
1805 PyObject *mod= PyImport_ImportModuleLevel((char *)"mathutils", NULL, NULL, NULL, 0);
1811 bpy_import_main_set(maggie);
1813 initPySysObjects(maggie);
1817 PyObjectPlus::ClearDeprecationWarning();
1819 return PyC_DefaultNameSpace(NULL);
1822 void exitGamePlayerPythonScripting()
1824 /* Clean up the Python mouse and keyboard */
1825 delete gp_PythonKeyboard;
1826 gp_PythonKeyboard = NULL;
1828 delete gp_PythonMouse;
1829 gp_PythonMouse = NULL;
1831 /* since python restarts we cant let the python backup of the sys.path hang around in a global pointer */
1832 restorePySysObjects(); /* get back the original sys.path and clear the backup */
1835 bpy_import_main_set(NULL);
1836 PyObjectPlus::ClearDeprecationWarning();
1842 * Python is already initialized.
1844 PyObject* initGamePythonScripting(const STR_String& progname, TPythonSecurityLevel level, Main *maggie)
1846 #if 0 // XXX TODO Py3
1847 STR_String pname = progname;
1848 Py_SetProgramName(pname.Ptr());
1855 bpy_import_main_set(maggie);
1857 initPySysObjects(maggie);
1859 PyObjectPlus::NullDeprecationWarning();
1861 return PyC_DefaultNameSpace(NULL);
1864 void exitGamePythonScripting()
1866 /* Clean up the Python mouse and keyboard */
1867 delete gp_PythonKeyboard;
1868 gp_PythonKeyboard = NULL;
1870 delete gp_PythonMouse;
1871 gp_PythonMouse = NULL;
1873 restorePySysObjects(); /* get back the original sys.path and clear the backup */
1874 bpy_import_main_set(NULL);
1875 PyObjectPlus::ClearDeprecationWarning();
1878 /* similar to the above functions except it sets up the namespace
1879 * and other more general things */
1880 void setupGamePython(KX_KetsjiEngine* ketsjiengine, KX_Scene* startscene, Main *blenderdata, PyObject * pyGlobalDict, PyObject **gameLogic, PyObject **gameLogic_keys, int argc, char** argv)
1882 PyObject* dictionaryobject;
1884 if(argv) /* player only */
1885 dictionaryobject= initGamePlayerPythonScripting("Ketsji", psl_Lowest, blenderdata, argc, argv);
1887 dictionaryobject= initGamePythonScripting("Ketsji", psl_Lowest, blenderdata);
1889 ketsjiengine->SetPyNamespace(dictionaryobject);
1890 initRasterizer(ketsjiengine->GetRasterizer(), ketsjiengine->GetCanvas());
1891 *gameLogic = initGameLogic(ketsjiengine, startscene);
1893 /* is set in initGameLogic so only set here if we want it to persist between scenes */
1895 PyDict_SetItemString(PyModule_GetDict(*gameLogic), "globalDict", pyGlobalDict); // Same as importing the module.
1897 *gameLogic_keys = PyDict_Keys(PyModule_GetDict(*gameLogic));
1900 initPythonConstraintBinding();
1903 /* could be done a lot more nicely, but for now a quick way to get bge.* working */
1904 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')});");
1907 static struct PyModuleDef Rasterizer_module_def = {
1909 "Rasterizer", /* m_name */
1910 Rasterizer_module_documentation, /* m_doc */
1912 rasterizer_methods, /* m_methods */
1919 PyObject* initRasterizer(RAS_IRasterizer* rasty,RAS_ICanvas* canvas)
1922 gp_Rasterizer = rasty;
1929 /* Use existing module where possible
1930 * be careful not to init any runtime vars after this */
1931 m = PyImport_ImportModule( "Rasterizer" );
1939 // Create the module and add the functions
1940 m = PyModule_Create(&Rasterizer_module_def);
1941 PyDict_SetItemString(PySys_GetObject("modules"), Rasterizer_module_def.m_name, m);
1944 // Add some symbolic constants to the module
1945 d = PyModule_GetDict(m);
1946 ErrorObject = PyUnicode_FromString("Rasterizer.error");
1947 PyDict_SetItemString(d, "error", ErrorObject);
1948 Py_DECREF(ErrorObject);
1950 /* needed for get/setMaterialType */
1951 KX_MACRO_addTypesToDict(d, KX_TEXFACE_MATERIAL, KX_TEXFACE_MATERIAL);
1952 KX_MACRO_addTypesToDict(d, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL);
1953 KX_MACRO_addTypesToDict(d, KX_BLENDER_GLSL_MATERIAL, KX_BLENDER_GLSL_MATERIAL);
1955 // XXXX Add constants here
1958 if (PyErr_Occurred())
1960 Py_FatalError("can't initialize module Rasterizer");
1968 /* ------------------------------------------------------------------------- */
1969 /* GameKeys: symbolic constants for key mapping */
1970 /* ------------------------------------------------------------------------- */
1972 static char GameKeys_module_documentation[] =
1973 "This modules provides defines for key-codes"
1976 static char gPyEventToString_doc[] =
1977 "EventToString(event) - Take a valid event from the GameKeys module or Keyboard Sensor and return a name"
1980 static PyObject* gPyEventToString(PyObject*, PyObject* value)
1982 PyObject* mod, *dict, *key, *val, *ret = NULL;
1985 mod = PyImport_ImportModule( "GameKeys" );
1989 dict = PyModule_GetDict(mod);
1991 while (PyDict_Next(dict, &pos, &key, &val)) {
1992 if (PyObject_RichCompareBool(value, val, Py_EQ)) {
1998 PyErr_Clear(); // incase there was an error clearing
2000 if (!ret) PyErr_SetString(PyExc_ValueError, "GameKeys.EventToString(int): expected a valid int keyboard event");
2001 else Py_INCREF(ret);
2006 static char gPyEventToCharacter_doc[] =
2007 "EventToCharacter(event, is_shift) - Take a valid event from the GameKeys module or Keyboard Sensor and return a character"
2010 static PyObject* gPyEventToCharacter(PyObject*, PyObject* args)
2013 if (!PyArg_ParseTuple(args,"ii:EventToCharacter", &event, &shift))
2016 if(IsPrintable(event)) {
2017 char ch[2] = {'\0', '\0'};
2018 ch[0] = ToCharacter(event, (bool)shift);
2019 return PyUnicode_FromString(ch);
2022 return PyUnicode_FromString("");
2027 static struct PyMethodDef gamekeys_methods[] = {
2028 {"EventToCharacter", (PyCFunction)gPyEventToCharacter, METH_VARARGS, (const char *)gPyEventToCharacter_doc},
2029 {"EventToString", (PyCFunction)gPyEventToString, METH_O, (const char *)gPyEventToString_doc},
2030 { NULL, (PyCFunction) NULL, 0, NULL }
2033 static struct PyModuleDef GameKeys_module_def = {
2035 "GameKeys", /* m_name */
2036 GameKeys_module_documentation, /* m_doc */
2038 gamekeys_methods, /* m_methods */
2045 PyObject* initGameKeys()
2051 /* Use existing module where possible */
2052 m = PyImport_ImportModule( "GameKeys" );
2060 // Create the module and add the functions
2061 m = PyModule_Create(&GameKeys_module_def);
2062 PyDict_SetItemString(PySys_GetObject("modules"), GameKeys_module_def.m_name, m);
2065 // Add some symbolic constants to the module
2066 d = PyModule_GetDict(m);
2068 // XXXX Add constants here
2070 KX_MACRO_addTypesToDict(d, AKEY, SCA_IInputDevice::KX_AKEY);
2071 KX_MACRO_addTypesToDict(d, BKEY, SCA_IInputDevice::KX_BKEY);
2072 KX_MACRO_addTypesToDict(d, CKEY, SCA_IInputDevice::KX_CKEY);
2073 KX_MACRO_addTypesToDict(d, DKEY, SCA_IInputDevice::KX_DKEY);
2074 KX_MACRO_addTypesToDict(d, EKEY, SCA_IInputDevice::KX_EKEY);
2075 KX_MACRO_addTypesToDict(d, FKEY, SCA_IInputDevice::KX_FKEY);
2076 KX_MACRO_addTypesToDict(d, GKEY, SCA_IInputDevice::KX_GKEY);
2077 KX_MACRO_addTypesToDict(d, HKEY, SCA_IInputDevice::KX_HKEY);
2078 KX_MACRO_addTypesToDict(d, IKEY, SCA_IInputDevice::KX_IKEY);
2079 KX_MACRO_addTypesToDict(d, JKEY, SCA_IInputDevice::KX_JKEY);
2080 KX_MACRO_addTypesToDict(d, KKEY, SCA_IInputDevice::KX_KKEY);
2081 KX_MACRO_addTypesToDict(d, LKEY, SCA_IInputDevice::KX_LKEY);
2082 KX_MACRO_addTypesToDict(d, MKEY, SCA_IInputDevice::KX_MKEY);
2083 KX_MACRO_addTypesToDict(d, NKEY, SCA_IInputDevice::KX_NKEY);
2084 KX_MACRO_addTypesToDict(d, OKEY, SCA_IInputDevice::KX_OKEY);
2085 KX_MACRO_addTypesToDict(d, PKEY, SCA_IInputDevice::KX_PKEY);
2086 KX_MACRO_addTypesToDict(d, QKEY, SCA_IInputDevice::KX_QKEY);
2087 KX_MACRO_addTypesToDict(d, RKEY, SCA_IInputDevice::KX_RKEY);
2088 KX_MACRO_addTypesToDict(d, SKEY, SCA_IInputDevice::KX_SKEY);
2089 KX_MACRO_addTypesToDict(d, TKEY, SCA_IInputDevice::KX_TKEY);
2090 KX_MACRO_addTypesToDict(d, UKEY, SCA_IInputDevice::KX_UKEY);
2091 KX_MACRO_addTypesToDict(d, VKEY, SCA_IInputDevice::KX_VKEY);
2092 KX_MACRO_addTypesToDict(d, WKEY, SCA_IInputDevice::KX_WKEY);
2093 KX_MACRO_addTypesToDict(d, XKEY, SCA_IInputDevice::KX_XKEY);
2094 KX_MACRO_addTypesToDict(d, YKEY, SCA_IInputDevice::KX_YKEY);
2095 KX_MACRO_addTypesToDict(d, ZKEY, SCA_IInputDevice::KX_ZKEY);
2097 KX_MACRO_addTypesToDict(d, ZEROKEY, SCA_IInputDevice::KX_ZEROKEY);
2098 KX_MACRO_addTypesToDict(d, ONEKEY, SCA_IInputDevice::KX_ONEKEY);
2099 KX_MACRO_addTypesToDict(d, TWOKEY, SCA_IInputDevice::KX_TWOKEY);
2100 KX_MACRO_addTypesToDict(d, THREEKEY, SCA_IInputDevice::KX_THREEKEY);
2101 KX_MACRO_addTypesToDict(d, FOURKEY, SCA_IInputDevice::KX_FOURKEY);
2102 KX_MACRO_addTypesToDict(d, FIVEKEY, SCA_IInputDevice::KX_FIVEKEY);
2103 KX_MACRO_addTypesToDict(d, SIXKEY, SCA_IInputDevice::KX_SIXKEY);
2104 KX_MACRO_addTypesToDict(d, SEVENKEY, SCA_IInputDevice::KX_SEVENKEY);
2105 KX_MACRO_addTypesToDict(d, EIGHTKEY, SCA_IInputDevice::KX_EIGHTKEY);
2106 KX_MACRO_addTypesToDict(d, NINEKEY, SCA_IInputDevice::KX_NINEKEY);
2108 KX_MACRO_addTypesToDict(d, CAPSLOCKKEY, SCA_IInputDevice::KX_CAPSLOCKKEY);
2110 KX_MACRO_addTypesToDict(d, LEFTCTRLKEY, SCA_IInputDevice::KX_LEFTCTRLKEY);
2111 KX_MACRO_addTypesToDict(d, LEFTALTKEY, SCA_IInputDevice::KX_LEFTALTKEY);
2112 KX_MACRO_addTypesToDict(d, RIGHTALTKEY, SCA_IInputDevice::KX_RIGHTALTKEY);
2113 KX_MACRO_addTypesToDict(d, RIGHTCTRLKEY, SCA_IInputDevice::KX_RIGHTCTRLKEY);
2114 KX_MACRO_addTypesToDict(d, RIGHTSHIFTKEY, SCA_IInputDevice::KX_RIGHTSHIFTKEY);
2115 KX_MACRO_addTypesToDict(d, LEFTSHIFTKEY, SCA_IInputDevice::KX_LEFTSHIFTKEY);
2117 KX_MACRO_addTypesToDict(d, ESCKEY, SCA_IInputDevice::KX_ESCKEY);
2118 KX_MACRO_addTypesToDict(d, TABKEY, SCA_IInputDevice::KX_TABKEY);
2119 KX_MACRO_addTypesToDict(d, RETKEY, SCA_IInputDevice::KX_RETKEY);
2120 KX_MACRO_addTypesToDict(d, ENTERKEY, SCA_IInputDevice::KX_RETKEY);
2121 KX_MACRO_addTypesToDict(d, SPACEKEY, SCA_IInputDevice::KX_SPACEKEY);
2122 KX_MACRO_addTypesToDict(d, LINEFEEDKEY, SCA_IInputDevice::KX_LINEFEEDKEY);
2123 KX_MACRO_addTypesToDict(d, BACKSPACEKEY, SCA_IInputDevice::KX_BACKSPACEKEY);
2124 KX_MACRO_addTypesToDict(d, DELKEY, SCA_IInputDevice::KX_DELKEY);
2125 KX_MACRO_addTypesToDict(d, SEMICOLONKEY, SCA_IInputDevice::KX_SEMICOLONKEY);
2126 KX_MACRO_addTypesToDict(d, PERIODKEY, SCA_IInputDevice::KX_PERIODKEY);
2127 KX_MACRO_addTypesToDict(d, COMMAKEY, SCA_IInputDevice::KX_COMMAKEY);
2128 KX_MACRO_addTypesToDict(d, QUOTEKEY, SCA_IInputDevice::KX_QUOTEKEY);
2129 KX_MACRO_addTypesToDict(d, ACCENTGRAVEKEY, SCA_IInputDevice::KX_ACCENTGRAVEKEY);
2130 KX_MACRO_addTypesToDict(d, MINUSKEY, SCA_IInputDevice::KX_MINUSKEY);
2131 KX_MACRO_addTypesToDict(d, SLASHKEY, SCA_IInputDevice::KX_SLASHKEY);
2132 KX_MACRO_addTypesToDict(d, BACKSLASHKEY, SCA_IInputDevice::KX_BACKSLASHKEY);
2133 KX_MACRO_addTypesToDict(d, EQUALKEY, SCA_IInputDevice::KX_EQUALKEY);
2134 KX_MACRO_addTypesToDict(d, LEFTBRACKETKEY, SCA_IInputDevice::KX_LEFTBRACKETKEY);
2135 KX_MACRO_addTypesToDict(d, RIGHTBRACKETKEY, SCA_IInputDevice::KX_RIGHTBRACKETKEY);
2137 KX_MACRO_addTypesToDict(d, LEFTARROWKEY, SCA_IInputDevice::KX_LEFTARROWKEY);
2138 KX_MACRO_addTypesToDict(d, DOWNARROWKEY, SCA_IInputDevice::KX_DOWNARROWKEY);
2139 KX_MACRO_addTypesToDict(d, RIGHTARROWKEY, SCA_IInputDevice::KX_RIGHTARROWKEY);
2140 KX_MACRO_addTypesToDict(d, UPARROWKEY, SCA_IInputDevice::KX_UPARROWKEY);
2142 KX_MACRO_addTypesToDict(d, PAD2 , SCA_IInputDevice::KX_PAD2);
2143 KX_MACRO_addTypesToDict(d, PAD4 , SCA_IInputDevice::KX_PAD4);
2144 KX_MACRO_addTypesToDict(d, PAD6 , SCA_IInputDevice::KX_PAD6);
2145 KX_MACRO_addTypesToDict(d, PAD8 , SCA_IInputDevice::KX_PAD8);
2147 KX_MACRO_addTypesToDict(d, PAD1 , SCA_IInputDevice::KX_PAD1);
2148 KX_MACRO_addTypesToDict(d, PAD3 , SCA_IInputDevice::KX_PAD3);
2149 KX_MACRO_addTypesToDict(d, PAD5 , SCA_IInputDevice::KX_PAD5);
2150 KX_MACRO_addTypesToDict(d, PAD7 , SCA_IInputDevice::KX_PAD7);
2151 KX_MACRO_addTypesToDict(d, PAD9 , SCA_IInputDevice::KX_PAD9);
2153 KX_MACRO_addTypesToDict(d, PADPERIOD, SCA_IInputDevice::KX_PADPERIOD);
2154 KX_MACRO_addTypesToDict(d, PADSLASHKEY, SCA_IInputDevice::KX_PADSLASHKEY);
2155 KX_MACRO_addTypesToDict(d, PADASTERKEY, SCA_IInputDevice::KX_PADASTERKEY);
2158 KX_MACRO_addTypesToDict(d, PAD0, SCA_IInputDevice::KX_PAD0);
2159 KX_MACRO_addTypesToDict(d, PADMINUS, SCA_IInputDevice::KX_PADMINUS);
2160 KX_MACRO_addTypesToDict(d, PADENTER, SCA_IInputDevice::KX_PADENTER);
2161 KX_MACRO_addTypesToDict(d, PADPLUSKEY, SCA_IInputDevice::KX_PADPLUSKEY);
2164 KX_MACRO_addTypesToDict(d, F1KEY , SCA_IInputDevice::KX_F1KEY);
2165 KX_MACRO_addTypesToDict(d, F2KEY , SCA_IInputDevice::KX_F2KEY);
2166 KX_MACRO_addTypesToDict(d, F3KEY , SCA_IInputDevice::KX_F3KEY);
2167 KX_MACRO_addTypesToDict(d, F4KEY , SCA_IInputDevice::KX_F4KEY);
2168 KX_MACRO_addTypesToDict(d, F5KEY , SCA_IInputDevice::KX_F5KEY);
2169 KX_MACRO_addTypesToDict(d, F6KEY , SCA_IInputDevice::KX_F6KEY);
2170 KX_MACRO_addTypesToDict(d, F7KEY , SCA_IInputDevice::KX_F7KEY);
2171 KX_MACRO_addTypesToDict(d, F8KEY , SCA_IInputDevice::KX_F8KEY);
2172 KX_MACRO_addTypesToDict(d, F9KEY , SCA_IInputDevice::KX_F9KEY);
2173 KX_MACRO_addTypesToDict(d, F10KEY, SCA_IInputDevice::KX_F10KEY);
2174 KX_MACRO_addTypesToDict(d, F11KEY, SCA_IInputDevice::KX_F11KEY);
2175 KX_MACRO_addTypesToDict(d, F12KEY, SCA_IInputDevice::KX_F12KEY);
2176 KX_MACRO_addTypesToDict(d, F13KEY, SCA_IInputDevice::KX_F13KEY);
2177 KX_MACRO_addTypesToDict(d, F14KEY, SCA_IInputDevice::KX_F14KEY);
2178 KX_MACRO_addTypesToDict(d, F15KEY, SCA_IInputDevice::KX_F15KEY);
2179 KX_MACRO_addTypesToDict(d, F16KEY, SCA_IInputDevice::KX_F16KEY);
2180 KX_MACRO_addTypesToDict(d, F17KEY, SCA_IInputDevice::KX_F17KEY);
2181 KX_MACRO_addTypesToDict(d, F18KEY, SCA_IInputDevice::KX_F18KEY);
2182 KX_MACRO_addTypesToDict(d, F19KEY, SCA_IInputDevice::KX_F19KEY);
2184 KX_MACRO_addTypesToDict(d, PAUSEKEY, SCA_IInputDevice::KX_PAUSEKEY);
2185 KX_MACRO_addTypesToDict(d, INSERTKEY, SCA_IInputDevice::KX_INSERTKEY);
2186 KX_MACRO_addTypesToDict(d, HOMEKEY , SCA_IInputDevice::KX_HOMEKEY);
2187 KX_MACRO_addTypesToDict(d, PAGEUPKEY, SCA_IInputDevice::KX_PAGEUPKEY);
2188 KX_MACRO_addTypesToDict(d, PAGEDOWNKEY, SCA_IInputDevice::KX_PAGEDOWNKEY);
2189 KX_MACRO_addTypesToDict(d, ENDKEY, SCA_IInputDevice::KX_ENDKEY);
2192 KX_MACRO_addTypesToDict(d, LEFTMOUSE, SCA_IInputDevice::KX_LEFTMOUSE);
2193 KX_MACRO_addTypesToDict(d, MIDDLEMOUSE, SCA_IInputDevice::KX_MIDDLEMOUSE);
2194 KX_MACRO_addTypesToDict(d, RIGHTMOUSE, SCA_IInputDevice::KX_RIGHTMOUSE);
2195 KX_MACRO_addTypesToDict(d, WHEELUPMOUSE, SCA_IInputDevice::KX_WHEELUPMOUSE);
2196 KX_MACRO_addTypesToDict(d, WHEELDOWNMOUSE, SCA_IInputDevice::KX_WHEELDOWNMOUSE);
2197 KX_MACRO_addTypesToDict(d, MOUSEX, SCA_IInputDevice::KX_MOUSEX);
2198 KX_MACRO_addTypesToDict(d, MOUSEY, SCA_IInputDevice::KX_MOUSEY);
2201 if (PyErr_Occurred())
2203 Py_FatalError("can't initialize module GameKeys");
2209 // utility function for loading and saving the globalDict
2210 int saveGamePythonConfig( char **marshal_buffer)
2212 int marshal_length = 0;
2213 PyObject* gameLogic = PyImport_ImportModule("GameLogic");
2215 PyObject* pyGlobalDict = PyDict_GetItemString(PyModule_GetDict(gameLogic), "globalDict"); // Same as importing the module
2217 #ifdef Py_MARSHAL_VERSION
2218 PyObject* pyGlobalDictMarshal = PyMarshal_WriteObjectToString( pyGlobalDict, 2); // Py_MARSHAL_VERSION == 2 as of Py2.5
2220 PyObject* pyGlobalDictMarshal = PyMarshal_WriteObjectToString( pyGlobalDict );
2222 if (pyGlobalDictMarshal) {
2224 // PyObject_Print(pyGlobalDictMarshal, stderr, 0);
2225 char *marshal_cstring;
2227 marshal_cstring = PyBytes_AsString(pyGlobalDictMarshal); // py3 uses byte arrays
2228 marshal_length= PyBytes_Size(pyGlobalDictMarshal);
2229 *marshal_buffer = new char[marshal_length + 1];
2230 memcpy(*marshal_buffer, marshal_cstring, marshal_length);
2231 Py_DECREF(pyGlobalDictMarshal);
2233 printf("Error, bge.logic.globalDict could not be marshal'd\n");
2236 printf("Error, bge.logic.globalDict was removed\n");
2238 Py_DECREF(gameLogic);
2241 printf("Error, bge.logic failed to import bge.logic.globalDict will be lost\n");
2243 return marshal_length;
2246 int loadGamePythonConfig(char *marshal_buffer, int marshal_length)
2248 /* Restore the dict */
2249 if (marshal_buffer) {
2250 PyObject* gameLogic = PyImport_ImportModule("GameLogic");
2253 PyObject* pyGlobalDict = PyMarshal_ReadObjectFromString(marshal_buffer, marshal_length);
2255 PyObject* pyGlobalDict_orig = PyDict_GetItemString(PyModule_GetDict(gameLogic), "globalDict"); // Same as importing the module.
2256 if (pyGlobalDict_orig) {
2257 PyDict_Clear(pyGlobalDict_orig);
2258 PyDict_Update(pyGlobalDict_orig, pyGlobalDict);
2260 /* this should not happen, but cant find the original globalDict, just assign it then */
2261 PyDict_SetItemString(PyModule_GetDict(gameLogic), "globalDict", pyGlobalDict); // Same as importing the module.
2263 Py_DECREF(gameLogic);
2264 Py_DECREF(pyGlobalDict);
2267 Py_DECREF(gameLogic);
2269 printf("Error could not marshall string\n");
2273 printf("Error, bge.logic failed to import bge.logic.globalDict will be lost\n");
2279 void pathGamePythonConfig( char *path )
2281 int len = strlen(gp_GamePythonPathOrig); // Always use the first loaded blend filename
2283 BLI_strncpy(path, gp_GamePythonPathOrig, sizeof(gp_GamePythonPathOrig));
2285 /* replace extension */
2286 if (BLI_testextensie(path, ".blend")) {
2287 strcpy(path+(len-6), ".bgeconf");
2289 strcpy(path+len, ".bgeconf");
2293 void setGamePythonPath(char *path)
2295 BLI_strncpy(gp_GamePythonPath, path, sizeof(gp_GamePythonPath));
2296 BLI_cleanup_file(NULL, gp_GamePythonPath); /* not absolutely needed but makes resolving path problems less confusing later */
2298 if (gp_GamePythonPathOrig[0] == '\0')
2299 BLI_strncpy(gp_GamePythonPathOrig, path, sizeof(gp_GamePythonPathOrig));
2302 // we need this so while blender is open (not blenderplayer)
2303 // loading new blendfiles will reset this on starting the
2304 // engine but loading blend files within the BGE wont overwrite gp_GamePythonPathOrig
2305 void resetGamePythonPath()
2307 gp_GamePythonPathOrig[0] = '\0';
2310 #endif // WITH_PYTHON