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.
34 #pragma warning (disable : 4786)
37 #ifndef DISABLE_PYTHON
40 #include "bpy_internal_import.h" /* from the blender python api, but we want to import text too! */
41 #include "mathutils.h" // Blender.Mathutils module copied here so the blenderlayer can use.
42 #include "geometry.h" // Blender.Geometry module copied here so the blenderlayer can use.
46 #include "marshal.h" /* python header for loading/saving dicts */
50 #include "KX_PythonInit.h"
52 // directory header for py function getBlendFileList
58 #include "BLI_winstuff.h"
61 //python physics binding
62 #include "KX_PyConstraintBinding.h"
64 #include "KX_KetsjiEngine.h"
65 #include "KX_RadarSensor.h"
66 #include "KX_RaySensor.h"
67 #include "KX_ArmatureSensor.h"
68 #include "KX_SceneActuator.h"
69 #include "KX_GameActuator.h"
70 #include "KX_ParentActuator.h"
71 #include "KX_SCA_DynamicActuator.h"
73 #include "SCA_IInputDevice.h"
74 #include "SCA_PropertySensor.h"
75 #include "SCA_RandomActuator.h"
76 #include "SCA_KeyboardSensor.h" /* IsPrintable, ToCharacter */
77 #include "SCA_PythonKeyboard.h"
78 #include "SCA_PythonMouse.h"
79 #include "KX_ConstraintActuator.h"
80 #include "KX_IpoActuator.h"
81 #include "KX_SoundActuator.h"
82 #include "KX_StateActuator.h"
83 #include "BL_ActionActuator.h"
84 #include "BL_ArmatureObject.h"
85 #include "RAS_IRasterizer.h"
86 #include "RAS_ICanvas.h"
87 #include "RAS_BucketManager.h"
88 #include "RAS_2DFilterManager.h"
89 #include "MT_Vector3.h"
90 #include "MT_Point3.h"
91 #include "ListValue.h"
92 #include "InputParser.h"
95 #include "NG_NetworkScene.h" //Needed for sendMessage()
97 #include "BL_Shader.h"
99 #include "KX_PyMath.h"
101 #include "PyObjectPlus.h"
103 #include "KX_PythonInitTypes.h"
105 /* we only need this to get a list of libraries from the main struct */
107 #include "DNA_scene_types.h"
109 #include "PHY_IPhysicsEnvironment.h"
110 #include "BKE_main.h"
111 #include "BKE_utildefines.h"
112 #include "BKE_global.h"
113 #include "BLI_blenlib.h"
114 #include "GPU_material.h"
115 #include "MEM_guardedalloc.h"
117 /* for converting new scenes */
118 #include "KX_BlenderSceneConverter.h"
119 #include "KX_MeshProxy.h" /* for creating a new library of mesh objects */
121 #include "BLO_readfile.h"
124 #include "NG_NetworkScene.h" //Needed for sendMessage()
126 // 'local' copy of canvas ptr, for window height/width python scripts
128 #ifndef DISABLE_PYTHON
130 static RAS_ICanvas* gp_Canvas = NULL;
131 static char gp_GamePythonPath[FILE_MAXDIR + FILE_MAXFILE] = "";
132 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
134 #endif // DISABLE_PYTHON
136 static KX_Scene* gp_KetsjiScene = NULL;
137 static KX_KetsjiEngine* gp_KetsjiEngine = NULL;
138 static RAS_IRasterizer* gp_Rasterizer = NULL;
140 void KX_SetActiveScene(class KX_Scene* scene)
142 gp_KetsjiScene = scene;
145 class KX_Scene* KX_GetActiveScene()
147 return gp_KetsjiScene;
150 class KX_KetsjiEngine* KX_GetActiveEngine()
152 return gp_KetsjiEngine;
155 /* why is this in python? */
156 void KX_RasterizerDrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color)
159 gp_Rasterizer->DrawDebugLine(from,to,color);
162 #ifndef DISABLE_PYTHON
164 static PyObject *gp_OrigPythonSysPath= NULL;
165 static PyObject *gp_OrigPythonSysModules= NULL;
167 /* Macro for building the keyboard translation */
168 //#define KX_MACRO_addToDict(dict, name) PyDict_SetItemString(dict, #name, PyLong_FromSsize_t(SCA_IInputDevice::KX_##name))
169 #define KX_MACRO_addToDict(dict, name) PyDict_SetItemString(dict, #name, item=PyLong_FromSsize_t(name)); Py_DECREF(item)
170 /* For the defines for types from logic bricks, we do stuff explicitly... */
171 #define KX_MACRO_addTypesToDict(dict, name, name2) PyDict_SetItemString(dict, #name, item=PyLong_FromSsize_t(name2)); Py_DECREF(item)
174 // temporarily python stuff, will be put in another place later !
175 #include "KX_Python.h"
176 #include "SCA_PythonController.h"
177 // List of methods defined in the module
179 static PyObject* ErrorObject;
180 static const char *gPyGetRandomFloat_doc="getRandomFloat returns a random floating point value in the range [0..1]";
182 static PyObject* gPyGetRandomFloat(PyObject*)
184 return PyFloat_FromDouble(MT_random());
187 static PyObject* gPySetGravity(PyObject*, PyObject* value)
190 if (!PyVecTo(value, vec))
194 gp_KetsjiScene->SetGravity(vec);
199 static char gPyExpandPath_doc[] =
200 "(path) - Converts a blender internal path into a proper file system path.\n\
201 path - the string path to convert.\n\n\
202 Use / as directory separator in path\n\
203 You can use '//' at the start of the string to define a relative path;\n\
204 Blender replaces that string by the directory of the startup .blend or runtime\n\
205 file to make a full path name (doesn't change during the game, even if you load\n\
207 The function also converts the directory separator to the local file system format.";
209 static PyObject* gPyExpandPath(PyObject*, PyObject* args)
211 char expanded[FILE_MAXDIR + FILE_MAXFILE];
214 if (!PyArg_ParseTuple(args,"s:ExpandPath",&filename))
217 BLI_strncpy(expanded, filename, FILE_MAXDIR + FILE_MAXFILE);
218 BLI_path_abs(expanded, gp_GamePythonPath);
219 return PyUnicode_FromString(expanded);
222 static char gPyStartGame_doc[] =
224 Loads the blend file";
226 static PyObject* gPyStartGame(PyObject*, PyObject* args)
230 if (!PyArg_ParseTuple(args, "s:startGame", &blendfile))
233 gp_KetsjiEngine->RequestExit(KX_EXIT_REQUEST_START_OTHER_GAME);
234 gp_KetsjiEngine->SetNameNextGame(blendfile);
239 static char gPyEndGame_doc[] =
241 Ends the current game";
243 static PyObject* gPyEndGame(PyObject*)
245 gp_KetsjiEngine->RequestExit(KX_EXIT_REQUEST_QUIT_GAME);
247 //printf("%s\n", gp_GamePythonPath);
252 static char gPyRestartGame_doc[] =
254 Restarts the current game by reloading the .blend file";
256 static PyObject* gPyRestartGame(PyObject*)
258 gp_KetsjiEngine->RequestExit(KX_EXIT_REQUEST_RESTART_GAME);
259 gp_KetsjiEngine->SetNameNextGame(gp_GamePythonPath);
264 static char gPySaveGlobalDict_doc[] =
266 Saves GameLogic.globalDict to a file";
268 static PyObject* gPySaveGlobalDict(PyObject*)
270 char marshal_path[512];
271 char *marshal_buffer = NULL;
272 unsigned int marshal_length;
275 pathGamePythonConfig(marshal_path);
276 marshal_length = saveGamePythonConfig(&marshal_buffer);
278 if (marshal_length && marshal_buffer)
280 fp = fopen(marshal_path, "wb");
284 if (fwrite(marshal_buffer, 1, marshal_length, fp) != marshal_length)
285 printf("Warning: could not write marshal data\n");
289 printf("Warning: could not open marshal file\n");
292 printf("Warning: could not create marshal buffer\n");
296 delete [] marshal_buffer;
301 static char gPyLoadGlobalDict_doc[] =
303 Loads GameLogic.globalDict from a file";
305 static PyObject* gPyLoadGlobalDict(PyObject*)
307 char marshal_path[512];
308 char *marshal_buffer = NULL;
309 unsigned int marshal_length;
313 pathGamePythonConfig(marshal_path);
315 fp = fopen(marshal_path, "rb");
319 fseek (fp, 0, SEEK_END);
320 marshal_length = ftell(fp);
323 marshal_buffer = (char*)malloc (sizeof(char)*marshal_length);
325 result = fread(marshal_buffer, 1, marshal_length, fp);
327 if (result == marshal_length) {
328 loadGamePythonConfig(marshal_buffer, marshal_length);
330 printf("Warning: could not read all of '%s'\n", marshal_path);
333 free(marshal_buffer);
336 printf("Warning: could not open '%s'\n", marshal_path);
342 static char gPySendMessage_doc[] =
343 "sendMessage(subject, [body, to, from])\n\
344 sends a message in same manner as a message actuator\
345 subject = Subject of the message\
347 to = Name of object to send the message to\
348 from = Name of object to send the string from";
350 static PyObject* gPySendMessage(PyObject*, PyObject* args)
353 char* body = (char *)"";
354 char* to = (char *)"";
355 char* from = (char *)"";
357 if (!PyArg_ParseTuple(args, "s|sss:sendMessage", &subject, &body, &to, &from))
360 gp_KetsjiScene->GetNetworkScene()->SendMessage(to, from, subject, body);
365 // this gets a pointer to an array filled with floats
366 static PyObject* gPyGetSpectrum(PyObject*)
368 PyObject* resultlist = PyList_New(512);
370 for (int index = 0; index < 512; index++)
372 PyList_SET_ITEM(resultlist, index, PyFloat_FromDouble(0.0));
379 static PyObject* gPyStopDSP(PyObject*, PyObject* args)
381 PyErr_SetString(PyExc_RuntimeError, "no audio device available");
387 static PyObject* gPySetLogicTicRate(PyObject*, PyObject* args)
390 if (!PyArg_ParseTuple(args, "f:setLogicTicRate", &ticrate))
393 KX_KetsjiEngine::SetTicRate(ticrate);
397 static PyObject* gPyGetLogicTicRate(PyObject*)
399 return PyFloat_FromDouble(KX_KetsjiEngine::GetTicRate());
402 static PyObject* gPySetMaxLogicFrame(PyObject*, PyObject* args)
405 if (!PyArg_ParseTuple(args, "i:setMaxLogicFrame", &frame))
408 KX_KetsjiEngine::SetMaxLogicFrame(frame);
412 static PyObject* gPyGetMaxLogicFrame(PyObject*)
414 return PyLong_FromSsize_t(KX_KetsjiEngine::GetMaxLogicFrame());
417 static PyObject* gPySetMaxPhysicsFrame(PyObject*, PyObject* args)
420 if (!PyArg_ParseTuple(args, "i:setMaxPhysicsFrame", &frame))
423 KX_KetsjiEngine::SetMaxPhysicsFrame(frame);
427 static PyObject* gPyGetMaxPhysicsFrame(PyObject*)
429 return PyLong_FromSsize_t(KX_KetsjiEngine::GetMaxPhysicsFrame());
432 static PyObject* gPySetPhysicsTicRate(PyObject*, PyObject* args)
435 if (!PyArg_ParseTuple(args, "f:setPhysicsTicRate", &ticrate))
438 PHY_GetActiveEnvironment()->setFixedTimeStep(true,ticrate);
442 static PyObject* gPySetPhysicsDebug(PyObject*, PyObject* args)
445 if (!PyArg_ParseTuple(args, "i:setPhysicsDebug", &debugMode))
448 PHY_GetActiveEnvironment()->setDebugMode(debugMode);
454 static PyObject* gPyGetPhysicsTicRate(PyObject*)
456 return PyFloat_FromDouble(PHY_GetActiveEnvironment()->getFixedTimeStep());
459 static PyObject* gPyGetAverageFrameRate(PyObject*)
461 return PyFloat_FromDouble(KX_KetsjiEngine::GetAverageFrameRate());
464 static PyObject* gPyGetBlendFileList(PyObject*, PyObject* args)
466 char cpath[sizeof(gp_GamePythonPath)];
467 char *searchpath = NULL;
468 PyObject* list, *value;
473 if (!PyArg_ParseTuple(args, "|s:getBlendFileList", &searchpath))
476 list = PyList_New(0);
479 BLI_strncpy(cpath, searchpath, FILE_MAXDIR + FILE_MAXFILE);
480 BLI_path_abs(cpath, gp_GamePythonPath);
482 /* Get the dir only */
483 BLI_split_dirfile(gp_GamePythonPath, cpath, NULL);
486 if((dp = opendir(cpath)) == NULL) {
487 /* todo, show the errno, this shouldnt happen anyway if the blendfile is readable */
488 fprintf(stderr, "Could not read directoty (%s) failed, code %d (%s)\n", cpath, errno, strerror(errno));
492 while ((dirp = readdir(dp)) != NULL) {
493 if (BLI_testextensie(dirp->d_name, ".blend")) {
494 value = PyUnicode_FromString(dirp->d_name);
495 PyList_Append(list, value);
504 static char gPyAddScene_doc[] =
505 "addScene(name, [overlay])\n\
506 adds a scene to the game engine\n\
507 name = Name of the scene\n\
508 overlay = Overlay or underlay";
509 static PyObject* gPyAddScene(PyObject*, PyObject* args)
514 if (!PyArg_ParseTuple(args, "s|i:addScene", &name , &overlay))
517 gp_KetsjiEngine->ConvertAndAddScene(name, (overlay != 0));
522 static const char *gPyGetCurrentScene_doc =
523 "getCurrentScene()\n"
524 "Gets a reference to the current scene.\n";
525 static PyObject* gPyGetCurrentScene(PyObject* self)
527 return gp_KetsjiScene->GetProxy();
530 static const char *gPyGetSceneList_doc =
532 "Return a list of converted scenes.\n";
533 static PyObject* gPyGetSceneList(PyObject* self)
535 KX_KetsjiEngine* m_engine = KX_GetActiveEngine();
537 KX_SceneList* scenes = m_engine->CurrentScenes();
538 int numScenes = scenes->size();
541 list = PyList_New(numScenes);
543 for (i=0;i<numScenes;i++)
545 KX_Scene* scene = scenes->at(i);
546 PyList_SET_ITEM(list, i, scene->GetProxy());
552 static PyObject *pyPrintStats(PyObject *,PyObject *,PyObject *)
554 gp_KetsjiScene->GetSceneConverter()->PrintStats();
558 static PyObject *pyPrintExt(PyObject *,PyObject *,PyObject *)
560 #define pprint(x) std::cout << x << std::endl;
563 pprint("Supported Extensions...");
564 pprint(" GL_ARB_shader_objects supported? "<< (GLEW_ARB_shader_objects?"yes.":"no."));
567 support= GLEW_ARB_vertex_shader;
568 pprint(" GL_ARB_vertex_shader supported? "<< (support?"yes.":"no."));
571 pprint(" ----------Details----------");
573 glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, (GLint*)&max);
574 pprint(" Max uniform components." << max);
576 glGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, (GLint*)&max);
577 pprint(" Max varying floats." << max);
579 glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, (GLint*)&max);
580 pprint(" Max vertex texture units." << max);
582 glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB, (GLint*)&max);
583 pprint(" Max combined texture units." << max);
587 support=GLEW_ARB_fragment_shader;
588 pprint(" GL_ARB_fragment_shader supported? "<< (support?"yes.":"no."));
591 pprint(" ----------Details----------");
593 glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB, (GLint*)&max);
594 pprint(" Max uniform components." << max);
598 support = GLEW_ARB_texture_cube_map;
599 pprint(" GL_ARB_texture_cube_map supported? "<< (support?"yes.":"no."));
602 pprint(" ----------Details----------");
604 glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB, (GLint*)&size);
605 pprint(" Max cubemap size." << size);
609 support = GLEW_ARB_multitexture;
611 pprint(" GL_ARB_multitexture supported? "<< (support?"yes.":"no."));
613 pprint(" ----------Details----------");
615 glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, (GLint*)&units);
616 pprint(" Max texture units available. " << units);
620 pprint(" GL_ARB_texture_env_combine supported? "<< (GLEW_ARB_texture_env_combine?"yes.":"no."));
624 pprint("No extenstions are used in this build");
629 static PyObject *gLibLoad(PyObject*, PyObject* args)
631 KX_Scene *kx_scene= gp_KetsjiScene;
636 if (!PyArg_ParseTuple(args,"ss:LibLoad",&path, &group))
639 if(kx_scene->GetSceneConverter()->LinkBlendFile(path, group, kx_scene, &err_str)) {
644 PyErr_SetString(PyExc_ValueError, err_str);
651 static PyObject *gLibNew(PyObject*, PyObject* args)
653 KX_Scene *kx_scene= gp_KetsjiScene;
660 if (!PyArg_ParseTuple(args,"ssO!:LibNew",&path, &group, &PyList_Type, &names))
663 if(kx_scene->GetSceneConverter()->GetMainDynamicPath(path))
665 PyErr_SetString(PyExc_KeyError, "the name of the path given exists");
669 idcode= BLO_idcode_from_name(group);
671 PyErr_Format(PyExc_ValueError, "invalid group given \"%s\"", group);
675 Main *maggie= (Main *)MEM_callocN( sizeof(Main), "BgeMain");
676 kx_scene->GetSceneConverter()->GetMainDynamic().push_back(maggie);
677 strncpy(maggie->name, path, sizeof(maggie->name)-1);
679 /* Copy the object into main */
681 PyObject *ret= PyList_New(0);
683 for(int i= 0; i < PyList_GET_SIZE(names); i++) {
684 name= _PyUnicode_AsString(PyList_GET_ITEM(names, i));
686 RAS_MeshObject *meshobj= kx_scene->GetSceneConverter()->ConvertMeshSpecial(kx_scene, maggie, name);
688 KX_MeshProxy* meshproxy = new KX_MeshProxy(meshobj);
689 item= meshproxy->NewProxy(true);
690 PyList_Append(ret, item);
695 PyErr_Clear(); /* wasnt a string, ignore for now */
702 PyErr_Format(PyExc_ValueError, "only \"Mesh\" group currently supported");
709 static PyObject *gLibFree(PyObject*, PyObject* args)
711 KX_Scene *kx_scene= gp_KetsjiScene;
714 if (!PyArg_ParseTuple(args,"s:LibFree",&path))
717 if (kx_scene->GetSceneConverter()->FreeBlendFile(path))
726 static PyObject *gLibList(PyObject*, PyObject* args)
728 vector<Main*> &dynMaggie = gp_KetsjiScene->GetSceneConverter()->GetMainDynamic();
730 PyObject *list= PyList_New(dynMaggie.size());
732 for (vector<Main*>::iterator it=dynMaggie.begin(); !(it==dynMaggie.end()); it++)
734 PyList_SET_ITEM(list, i++, PyUnicode_FromString( (*it)->name) );
740 static struct PyMethodDef game_methods[] = {
741 {"expandPath", (PyCFunction)gPyExpandPath, METH_VARARGS, (const char *)gPyExpandPath_doc},
742 {"startGame", (PyCFunction)gPyStartGame, METH_VARARGS, (const char *)gPyStartGame_doc},
743 {"endGame", (PyCFunction)gPyEndGame, METH_NOARGS, (const char *)gPyEndGame_doc},
744 {"restartGame", (PyCFunction)gPyRestartGame, METH_NOARGS, (const char *)gPyRestartGame_doc},
745 {"saveGlobalDict", (PyCFunction)gPySaveGlobalDict, METH_NOARGS, (const char *)gPySaveGlobalDict_doc},
746 {"loadGlobalDict", (PyCFunction)gPyLoadGlobalDict, METH_NOARGS, (const char *)gPyLoadGlobalDict_doc},
747 {"sendMessage", (PyCFunction)gPySendMessage, METH_VARARGS, (const char *)gPySendMessage_doc},
748 {"getCurrentController", (PyCFunction) SCA_PythonController::sPyGetCurrentController, METH_NOARGS, SCA_PythonController::sPyGetCurrentController__doc__},
749 {"getCurrentScene", (PyCFunction) gPyGetCurrentScene, METH_NOARGS, gPyGetCurrentScene_doc},
750 {"getSceneList", (PyCFunction) gPyGetSceneList, METH_NOARGS, (const char *)gPyGetSceneList_doc},
751 {"addScene", (PyCFunction)gPyAddScene, METH_VARARGS, (const char *)gPyAddScene_doc},
752 {"getRandomFloat",(PyCFunction) gPyGetRandomFloat, METH_NOARGS, (const char *)gPyGetRandomFloat_doc},
753 {"setGravity",(PyCFunction) gPySetGravity, METH_O, (const char *)"set Gravitation"},
754 {"getSpectrum",(PyCFunction) gPyGetSpectrum, METH_NOARGS, (const char *)"get audio spectrum"},
755 {"stopDSP",(PyCFunction) gPyStopDSP, METH_VARARGS, (const char *)"stop using the audio dsp (for performance reasons)"},
756 {"getMaxLogicFrame", (PyCFunction) gPyGetMaxLogicFrame, METH_NOARGS, (const char *)"Gets the max number of logic frame per render frame"},
757 {"setMaxLogicFrame", (PyCFunction) gPySetMaxLogicFrame, METH_VARARGS, (const char *)"Sets the max number of logic frame per render frame"},
758 {"getMaxPhysicsFrame", (PyCFunction) gPyGetMaxPhysicsFrame, METH_NOARGS, (const char *)"Gets the max number of physics frame per render frame"},
759 {"setMaxPhysicsFrame", (PyCFunction) gPySetMaxPhysicsFrame, METH_VARARGS, (const char *)"Sets the max number of physics farme per render frame"},
760 {"getLogicTicRate", (PyCFunction) gPyGetLogicTicRate, METH_NOARGS, (const char *)"Gets the logic tic rate"},
761 {"setLogicTicRate", (PyCFunction) gPySetLogicTicRate, METH_VARARGS, (const char *)"Sets the logic tic rate"},
762 {"getPhysicsTicRate", (PyCFunction) gPyGetPhysicsTicRate, METH_NOARGS, (const char *)"Gets the physics tic rate"},
763 {"setPhysicsTicRate", (PyCFunction) gPySetPhysicsTicRate, METH_VARARGS, (const char *)"Sets the physics tic rate"},
764 {"getAverageFrameRate", (PyCFunction) gPyGetAverageFrameRate, METH_NOARGS, (const char *)"Gets the estimated average frame rate"},
765 {"getBlendFileList", (PyCFunction)gPyGetBlendFileList, METH_VARARGS, (const char *)"Gets a list of blend files in the same directory as the current blend file"},
766 {"PrintGLInfo", (PyCFunction)pyPrintExt, METH_NOARGS, (const char *)"Prints GL Extension Info"},
767 {"PrintMemInfo", (PyCFunction)pyPrintStats, METH_NOARGS, (const char *)"Print engine stastics"},
769 /* library functions */
770 {"LibLoad", (PyCFunction)gLibLoad, METH_VARARGS, (const char *)""},
771 {"LibNew", (PyCFunction)gLibNew, METH_VARARGS, (const char *)""},
772 {"LibFree", (PyCFunction)gLibFree, METH_VARARGS, (const char *)""},
773 {"LibList", (PyCFunction)gLibList, METH_VARARGS, (const char *)""},
775 {NULL, (PyCFunction) NULL, 0, NULL }
778 static PyObject* gPyGetWindowHeight(PyObject*, PyObject* args)
780 return PyLong_FromSsize_t((gp_Canvas ? gp_Canvas->GetHeight() : 0));
785 static PyObject* gPyGetWindowWidth(PyObject*, PyObject* args)
787 return PyLong_FromSsize_t((gp_Canvas ? gp_Canvas->GetWidth() : 0));
792 // temporarility visibility thing, will be moved to rasterizer/renderer later
793 bool gUseVisibilityTemp = false;
795 static PyObject* gPyEnableVisibility(PyObject*, PyObject* args)
798 if (!PyArg_ParseTuple(args,"i:enableVisibility",&visible))
801 gUseVisibilityTemp = (visible != 0);
807 static PyObject* gPyShowMouse(PyObject*, PyObject* args)
810 if (!PyArg_ParseTuple(args,"i:showMouse",&visible))
816 gp_Canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
820 gp_Canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
828 static PyObject* gPySetMousePosition(PyObject*, PyObject* args)
831 if (!PyArg_ParseTuple(args,"ii:setMousePosition",&x,&y))
835 gp_Canvas->SetMousePosition(x,y);
840 static PyObject* gPySetEyeSeparation(PyObject*, PyObject* args)
843 if (!PyArg_ParseTuple(args, "f:setEyeSeparation", &sep))
846 if (!gp_Rasterizer) {
847 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setEyeSeparation(float), Rasterizer not available");
851 gp_Rasterizer->SetEyeSeparation(sep);
856 static PyObject* gPyGetEyeSeparation(PyObject*)
858 if (!gp_Rasterizer) {
859 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.getEyeSeparation(), Rasterizer not available");
863 return PyFloat_FromDouble(gp_Rasterizer->GetEyeSeparation());
866 static PyObject* gPySetFocalLength(PyObject*, PyObject* args)
869 if (!PyArg_ParseTuple(args, "f:setFocalLength", &focus))
872 if (!gp_Rasterizer) {
873 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setFocalLength(float), Rasterizer not available");
877 gp_Rasterizer->SetFocalLength(focus);
882 static PyObject* gPyGetFocalLength(PyObject*, PyObject*, PyObject*)
884 if (!gp_Rasterizer) {
885 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.getFocalLength(), Rasterizer not available");
889 return PyFloat_FromDouble(gp_Rasterizer->GetFocalLength());
894 static PyObject* gPySetBackgroundColor(PyObject*, PyObject* value)
898 if (!PyVecTo(value, vec))
903 gp_Rasterizer->SetBackColor(vec[0], vec[1], vec[2], vec[3]);
910 static PyObject* gPySetMistColor(PyObject*, PyObject* value)
914 if (!PyVecTo(value, vec))
917 if (!gp_Rasterizer) {
918 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setMistColor(color), Rasterizer not available");
921 gp_Rasterizer->SetFogColor(vec[0], vec[1], vec[2]);
926 static PyObject* gPyDisableMist(PyObject*)
929 if (!gp_Rasterizer) {
930 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setMistColor(color), Rasterizer not available");
933 gp_Rasterizer->DisableFog();
939 static PyObject* gPySetMistStart(PyObject*, PyObject* args)
943 if (!PyArg_ParseTuple(args,"f:setMistStart",&miststart))
946 if (!gp_Rasterizer) {
947 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setMistStart(float), Rasterizer not available");
951 gp_Rasterizer->SetFogStart(miststart);
958 static PyObject* gPySetMistEnd(PyObject*, PyObject* args)
962 if (!PyArg_ParseTuple(args,"f:setMistEnd",&mistend))
965 if (!gp_Rasterizer) {
966 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setMistEnd(float), Rasterizer not available");
970 gp_Rasterizer->SetFogEnd(mistend);
976 static PyObject* gPySetAmbientColor(PyObject*, PyObject* value)
980 if (!PyVecTo(value, vec))
983 if (!gp_Rasterizer) {
984 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setAmbientColor(color), Rasterizer not available");
987 gp_Rasterizer->SetAmbientColor(vec[0], vec[1], vec[2]);
995 static PyObject* gPyMakeScreenshot(PyObject*, PyObject* args)
998 if (!PyArg_ParseTuple(args,"s:makeScreenshot",&filename))
1003 gp_Canvas->MakeScreenShot(filename);
1009 static PyObject* gPyEnableMotionBlur(PyObject*, PyObject* args)
1011 float motionblurvalue;
1012 if (!PyArg_ParseTuple(args,"f:enableMotionBlur",&motionblurvalue))
1015 if (!gp_Rasterizer) {
1016 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.enableMotionBlur(float), Rasterizer not available");
1020 gp_Rasterizer->EnableMotionBlur(motionblurvalue);
1025 static PyObject* gPyDisableMotionBlur(PyObject*)
1027 if (!gp_Rasterizer) {
1028 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.disableMotionBlur(), Rasterizer not available");
1032 gp_Rasterizer->DisableMotionBlur();
1037 int getGLSLSettingFlag(char *setting)
1039 if(strcmp(setting, "lights") == 0)
1040 return GAME_GLSL_NO_LIGHTS;
1041 else if(strcmp(setting, "shaders") == 0)
1042 return GAME_GLSL_NO_SHADERS;
1043 else if(strcmp(setting, "shadows") == 0)
1044 return GAME_GLSL_NO_SHADOWS;
1045 else if(strcmp(setting, "ramps") == 0)
1046 return GAME_GLSL_NO_RAMPS;
1047 else if(strcmp(setting, "nodes") == 0)
1048 return GAME_GLSL_NO_NODES;
1049 else if(strcmp(setting, "extra_textures") == 0)
1050 return GAME_GLSL_NO_EXTRA_TEX;
1055 static PyObject* gPySetGLSLMaterialSetting(PyObject*,
1059 GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
1061 int enable, flag, sceneflag;
1063 if (!PyArg_ParseTuple(args,"si:setGLSLMaterialSetting",&setting,&enable))
1066 flag = getGLSLSettingFlag(setting);
1069 PyErr_SetString(PyExc_ValueError, "Rasterizer.setGLSLMaterialSetting(string): glsl setting is not known");
1073 sceneflag= gm->flag;
1080 /* display lists and GLSL materials need to be remade */
1081 if(sceneflag != gm->flag) {
1082 GPU_materials_free();
1083 if(gp_KetsjiEngine) {
1084 KX_SceneList *scenes = gp_KetsjiEngine->CurrentScenes();
1085 KX_SceneList::iterator it;
1087 for(it=scenes->begin(); it!=scenes->end(); it++)
1088 if((*it)->GetBucketManager()) {
1089 (*it)->GetBucketManager()->ReleaseDisplayLists();
1090 (*it)->GetBucketManager()->ReleaseMaterials();
1098 static PyObject* gPyGetGLSLMaterialSetting(PyObject*,
1102 GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
1104 int enabled = 0, flag;
1106 if (!PyArg_ParseTuple(args,"s:getGLSLMaterialSetting",&setting))
1109 flag = getGLSLSettingFlag(setting);
1112 PyErr_SetString(PyExc_ValueError, "Rasterizer.getGLSLMaterialSetting(string): glsl setting is not known");
1116 enabled = ((gm->flag & flag) != 0);
1117 return PyLong_FromSsize_t(enabled);
1120 #define KX_TEXFACE_MATERIAL 0
1121 #define KX_BLENDER_MULTITEX_MATERIAL 1
1122 #define KX_BLENDER_GLSL_MATERIAL 2
1124 static PyObject* gPySetMaterialType(PyObject*,
1128 GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
1131 if (!PyArg_ParseTuple(args,"i:setMaterialType",&type))
1134 if(type == KX_BLENDER_GLSL_MATERIAL)
1135 gm->matmode= GAME_MAT_GLSL;
1136 else if(type == KX_BLENDER_MULTITEX_MATERIAL)
1137 gm->matmode= GAME_MAT_MULTITEX;
1138 else if(type == KX_TEXFACE_MATERIAL)
1139 gm->matmode= GAME_MAT_TEXFACE;
1141 PyErr_SetString(PyExc_ValueError, "Rasterizer.setMaterialType(int): material type is not known");
1148 static PyObject* gPyGetMaterialType(PyObject*)
1150 GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
1153 if(gm->matmode == GAME_MAT_GLSL)
1154 flag = KX_BLENDER_GLSL_MATERIAL;
1155 else if(gm->matmode == GAME_MAT_MULTITEX)
1156 flag = KX_BLENDER_MULTITEX_MATERIAL;
1158 flag = KX_TEXFACE_MATERIAL;
1160 return PyLong_FromSsize_t(flag);
1163 static PyObject* gPyDrawLine(PyObject*, PyObject* args)
1169 if (!gp_Rasterizer) {
1170 PyErr_SetString(PyExc_RuntimeError, "Rasterizer.drawLine(obFrom, obTo, color): Rasterizer not available");
1174 if (!PyArg_ParseTuple(args,"OOO:drawLine",&ob_from,&ob_to,&ob_color))
1180 if (!PyVecTo(ob_from, from))
1182 if (!PyVecTo(ob_to, to))
1184 if (!PyVecTo(ob_color, color))
1187 gp_Rasterizer->DrawDebugLine(from,to,color);
1192 static struct PyMethodDef rasterizer_methods[] = {
1193 {"getWindowWidth",(PyCFunction) gPyGetWindowWidth,
1194 METH_VARARGS, "getWindowWidth doc"},
1195 {"getWindowHeight",(PyCFunction) gPyGetWindowHeight,
1196 METH_VARARGS, "getWindowHeight doc"},
1197 {"makeScreenshot",(PyCFunction)gPyMakeScreenshot,
1198 METH_VARARGS, "make Screenshot doc"},
1199 {"enableVisibility",(PyCFunction) gPyEnableVisibility,
1200 METH_VARARGS, "enableVisibility doc"},
1201 {"showMouse",(PyCFunction) gPyShowMouse,
1202 METH_VARARGS, "showMouse(bool visible)"},
1203 {"setMousePosition",(PyCFunction) gPySetMousePosition,
1204 METH_VARARGS, "setMousePosition(int x,int y)"},
1205 {"setBackgroundColor",(PyCFunction)gPySetBackgroundColor,METH_O,"set Background Color (rgb)"},
1206 {"setAmbientColor",(PyCFunction)gPySetAmbientColor,METH_O,"set Ambient Color (rgb)"},
1207 {"disableMist",(PyCFunction)gPyDisableMist,METH_NOARGS,"turn off mist"},
1208 {"setMistColor",(PyCFunction)gPySetMistColor,METH_O,"set Mist Color (rgb)"},
1209 {"setMistStart",(PyCFunction)gPySetMistStart,METH_VARARGS,"set Mist Start(rgb)"},
1210 {"setMistEnd",(PyCFunction)gPySetMistEnd,METH_VARARGS,"set Mist End(rgb)"},
1211 {"enableMotionBlur",(PyCFunction)gPyEnableMotionBlur,METH_VARARGS,"enable motion blur"},
1212 {"disableMotionBlur",(PyCFunction)gPyDisableMotionBlur,METH_NOARGS,"disable motion blur"},
1215 {"setEyeSeparation", (PyCFunction) gPySetEyeSeparation, METH_VARARGS, "set the eye separation for stereo mode"},
1216 {"getEyeSeparation", (PyCFunction) gPyGetEyeSeparation, METH_NOARGS, "get the eye separation for stereo mode"},
1217 {"setFocalLength", (PyCFunction) gPySetFocalLength, METH_VARARGS, "set the focal length for stereo mode"},
1218 {"getFocalLength", (PyCFunction) gPyGetFocalLength, METH_VARARGS, "get the focal length for stereo mode"},
1219 {"setMaterialMode",(PyCFunction) gPySetMaterialType,
1220 METH_VARARGS, "set the material mode to use for OpenGL rendering"},
1221 {"getMaterialMode",(PyCFunction) gPyGetMaterialType,
1222 METH_NOARGS, "get the material mode being used for OpenGL rendering"},
1223 {"setGLSLMaterialSetting",(PyCFunction) gPySetGLSLMaterialSetting,
1224 METH_VARARGS, "set the state of a GLSL material setting"},
1225 {"getGLSLMaterialSetting",(PyCFunction) gPyGetGLSLMaterialSetting,
1226 METH_VARARGS, "get the state of a GLSL material setting"},
1227 {"drawLine", (PyCFunction) gPyDrawLine,
1228 METH_VARARGS, "draw a line on the screen"},
1229 { NULL, (PyCFunction) NULL, 0, NULL }
1232 // Initialization function for the module (*must* be called initGameLogic)
1234 static char GameLogic_module_documentation[] =
1235 "This is the Python API for the game engine of GameLogic"
1238 static char Rasterizer_module_documentation[] =
1239 "This is the Python API for the game engine of Rasterizer"
1242 static struct PyModuleDef GameLogic_module_def = {
1244 "GameLogic", /* m_name */
1245 GameLogic_module_documentation, /* m_doc */
1247 game_methods, /* m_methods */
1254 PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack to get gravity hook
1258 PyObject* item; /* temp PyObject* storage */
1260 gp_KetsjiEngine = engine;
1261 gp_KetsjiScene = scene;
1263 gUseVisibilityTemp=false;
1265 PyObjectPlus::ClearDeprecationWarning(); /* Not that nice to call here but makes sure warnings are reset between loading scenes */
1267 /* Use existing module where possible
1268 * be careful not to init any runtime vars after this */
1269 m = PyImport_ImportModule( "GameLogic" );
1276 // Create the module and add the functions
1277 m = PyModule_Create(&GameLogic_module_def);
1278 PyDict_SetItemString(PySys_GetObject("modules"), GameLogic_module_def.m_name, m);
1281 // Add some symbolic constants to the module
1282 d = PyModule_GetDict(m);
1284 // can be overwritten later for gameEngine instances that can load new blend files and re-initialize this module
1285 // for now its safe to make sure it exists for other areas such as the web plugin
1287 PyDict_SetItemString(d, "globalDict", item=PyDict_New()); Py_DECREF(item);
1289 // Add keyboard and mouse attributes to this module
1290 SCA_PythonKeyboard* pykeyb = new SCA_PythonKeyboard(gp_KetsjiEngine->GetKeyboardDevice());
1291 PyDict_SetItemString(d, "keyboard", pykeyb->NewProxy(true));
1293 SCA_PythonMouse* pymouse = new SCA_PythonMouse(gp_KetsjiEngine->GetMouseDevice(), gp_Canvas);
1294 PyDict_SetItemString(d, "mouse", pymouse->NewProxy(true));
1296 ErrorObject = PyUnicode_FromString("GameLogic.error");
1297 PyDict_SetItemString(d, "error", ErrorObject);
1298 Py_DECREF(ErrorObject);
1300 // XXXX Add constants here
1301 /* To use logic bricks, we need some sort of constants. Here, we associate */
1302 /* constants and sumbolic names. Add them to dictionary d. */
1304 /* 1. true and false: needed for everyone */
1305 KX_MACRO_addTypesToDict(d, KX_TRUE, SCA_ILogicBrick::KX_TRUE);
1306 KX_MACRO_addTypesToDict(d, KX_FALSE, SCA_ILogicBrick::KX_FALSE);
1308 /* 2. Property sensor */
1309 KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_EQUAL, SCA_PropertySensor::KX_PROPSENSOR_EQUAL);
1310 KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_NOTEQUAL, SCA_PropertySensor::KX_PROPSENSOR_NOTEQUAL);
1311 KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_INTERVAL, SCA_PropertySensor::KX_PROPSENSOR_INTERVAL);
1312 KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_CHANGED, SCA_PropertySensor::KX_PROPSENSOR_CHANGED);
1313 KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_EXPRESSION, SCA_PropertySensor::KX_PROPSENSOR_EXPRESSION);
1315 /* 3. Constraint actuator */
1316 /* XXX, TODO NXBGE, move constants names from KX_ACT_CONSTRAINT_foo to KX_CONSTRAINTACT_foo */
1317 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCX);
1318 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCY);
1319 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCZ);
1320 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ROTX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTX);
1321 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ROTY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTY);
1322 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ROTZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTZ);
1323 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRPX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPX);
1324 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRPY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPY);
1325 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRPZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPZ);
1326 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRNX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNX);
1327 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRNY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNY);
1328 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DIRNZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNZ);
1329 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ORIX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIX);
1330 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ORIY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIY);
1331 KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ORIZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIZ);
1332 KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHPX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPX);
1333 KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHPY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPY);
1334 KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHPZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPZ);
1335 KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHNX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNX);
1336 KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHNY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNY);
1337 KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHNZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNZ);
1338 KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_NORMAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_NORMAL);
1339 KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_MATERIAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_MATERIAL);
1340 KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_PERMANENT, KX_ConstraintActuator::KX_ACT_CONSTRAINT_PERMANENT);
1341 KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_DISTANCE, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DISTANCE);
1342 KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_LOCAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCAL);
1343 KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_DOROTFH, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DOROTFH);
1345 /* 4. Ipo actuator, simple part */
1346 KX_MACRO_addTypesToDict(d, KX_IPOACT_PLAY, KX_IpoActuator::KX_ACT_IPO_PLAY);
1347 KX_MACRO_addTypesToDict(d, KX_IPOACT_PINGPONG, KX_IpoActuator::KX_ACT_IPO_PINGPONG);
1348 KX_MACRO_addTypesToDict(d, KX_IPOACT_FLIPPER, KX_IpoActuator::KX_ACT_IPO_FLIPPER);
1349 KX_MACRO_addTypesToDict(d, KX_IPOACT_LOOPSTOP, KX_IpoActuator::KX_ACT_IPO_LOOPSTOP);
1350 KX_MACRO_addTypesToDict(d, KX_IPOACT_LOOPEND, KX_IpoActuator::KX_ACT_IPO_LOOPEND);
1351 KX_MACRO_addTypesToDict(d, KX_IPOACT_FROM_PROP,KX_IpoActuator::KX_ACT_IPO_FROM_PROP);
1353 /* 5. Random distribution types */
1354 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_BOOL_CONST, SCA_RandomActuator::KX_RANDOMACT_BOOL_CONST);
1355 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_BOOL_UNIFORM, SCA_RandomActuator::KX_RANDOMACT_BOOL_UNIFORM);
1356 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_BOOL_BERNOUILLI, SCA_RandomActuator::KX_RANDOMACT_BOOL_BERNOUILLI);
1357 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_INT_CONST, SCA_RandomActuator::KX_RANDOMACT_INT_CONST);
1358 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_INT_UNIFORM, SCA_RandomActuator::KX_RANDOMACT_INT_UNIFORM);
1359 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_INT_POISSON, SCA_RandomActuator::KX_RANDOMACT_INT_POISSON);
1360 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_FLOAT_CONST, SCA_RandomActuator::KX_RANDOMACT_FLOAT_CONST);
1361 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_FLOAT_UNIFORM, SCA_RandomActuator::KX_RANDOMACT_FLOAT_UNIFORM);
1362 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_FLOAT_NORMAL, SCA_RandomActuator::KX_RANDOMACT_FLOAT_NORMAL);
1363 KX_MACRO_addTypesToDict(d, KX_RANDOMACT_FLOAT_NEGATIVE_EXPONENTIAL, SCA_RandomActuator::KX_RANDOMACT_FLOAT_NEGATIVE_EXPONENTIAL);
1365 /* 6. Sound actuator */
1366 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_PLAYSTOP, KX_SoundActuator::KX_SOUNDACT_PLAYSTOP);
1367 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_PLAYEND, KX_SoundActuator::KX_SOUNDACT_PLAYEND);
1368 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPSTOP, KX_SoundActuator::KX_SOUNDACT_LOOPSTOP);
1369 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPEND, KX_SoundActuator::KX_SOUNDACT_LOOPEND);
1370 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPBIDIRECTIONAL, KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL);
1371 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP, KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP);
1373 /* 7. Action actuator */
1374 KX_MACRO_addTypesToDict(d, KX_ACTIONACT_PLAY, ACT_ACTION_PLAY);
1375 KX_MACRO_addTypesToDict(d, KX_ACTIONACT_FLIPPER, ACT_ACTION_FLIPPER);
1376 KX_MACRO_addTypesToDict(d, KX_ACTIONACT_LOOPSTOP, ACT_ACTION_LOOP_STOP);
1377 KX_MACRO_addTypesToDict(d, KX_ACTIONACT_LOOPEND, ACT_ACTION_LOOP_END);
1378 KX_MACRO_addTypesToDict(d, KX_ACTIONACT_PROPERTY, ACT_ACTION_FROM_PROP);
1380 /*8. GL_BlendFunc */
1381 KX_MACRO_addTypesToDict(d, BL_ZERO, GL_ZERO);
1382 KX_MACRO_addTypesToDict(d, BL_ONE, GL_ONE);
1383 KX_MACRO_addTypesToDict(d, BL_SRC_COLOR, GL_SRC_COLOR);
1384 KX_MACRO_addTypesToDict(d, BL_ONE_MINUS_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
1385 KX_MACRO_addTypesToDict(d, BL_DST_COLOR, GL_DST_COLOR);
1386 KX_MACRO_addTypesToDict(d, BL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_DST_COLOR);
1387 KX_MACRO_addTypesToDict(d, BL_SRC_ALPHA, GL_SRC_ALPHA);
1388 KX_MACRO_addTypesToDict(d, BL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1389 KX_MACRO_addTypesToDict(d, BL_DST_ALPHA, GL_DST_ALPHA);
1390 KX_MACRO_addTypesToDict(d, BL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
1391 KX_MACRO_addTypesToDict(d, BL_SRC_ALPHA_SATURATE, GL_SRC_ALPHA_SATURATE);
1394 /* 9. UniformTypes */
1395 KX_MACRO_addTypesToDict(d, SHD_TANGENT, BL_Shader::SHD_TANGENT);
1396 KX_MACRO_addTypesToDict(d, MODELVIEWMATRIX, BL_Shader::MODELVIEWMATRIX);
1397 KX_MACRO_addTypesToDict(d, MODELVIEWMATRIX_TRANSPOSE, BL_Shader::MODELVIEWMATRIX_TRANSPOSE);
1398 KX_MACRO_addTypesToDict(d, MODELVIEWMATRIX_INVERSE, BL_Shader::MODELVIEWMATRIX_INVERSE);
1399 KX_MACRO_addTypesToDict(d, MODELVIEWMATRIX_INVERSETRANSPOSE, BL_Shader::MODELVIEWMATRIX_INVERSETRANSPOSE);
1400 KX_MACRO_addTypesToDict(d, MODELMATRIX, BL_Shader::MODELMATRIX);
1401 KX_MACRO_addTypesToDict(d, MODELMATRIX_TRANSPOSE, BL_Shader::MODELMATRIX_TRANSPOSE);
1402 KX_MACRO_addTypesToDict(d, MODELMATRIX_INVERSE, BL_Shader::MODELMATRIX_INVERSE);
1403 KX_MACRO_addTypesToDict(d, MODELMATRIX_INVERSETRANSPOSE, BL_Shader::MODELMATRIX_INVERSETRANSPOSE);
1404 KX_MACRO_addTypesToDict(d, VIEWMATRIX, BL_Shader::VIEWMATRIX);
1405 KX_MACRO_addTypesToDict(d, VIEWMATRIX_TRANSPOSE, BL_Shader::VIEWMATRIX_TRANSPOSE);
1406 KX_MACRO_addTypesToDict(d, VIEWMATRIX_INVERSE, BL_Shader::VIEWMATRIX_INVERSE);
1407 KX_MACRO_addTypesToDict(d, VIEWMATRIX_INVERSETRANSPOSE, BL_Shader::VIEWMATRIX_INVERSETRANSPOSE);
1408 KX_MACRO_addTypesToDict(d, CAM_POS, BL_Shader::CAM_POS);
1409 KX_MACRO_addTypesToDict(d, CONSTANT_TIMER, BL_Shader::CONSTANT_TIMER);
1411 /* 10 state actuator */
1412 KX_MACRO_addTypesToDict(d, KX_STATE1, (1<<0));
1413 KX_MACRO_addTypesToDict(d, KX_STATE2, (1<<1));
1414 KX_MACRO_addTypesToDict(d, KX_STATE3, (1<<2));
1415 KX_MACRO_addTypesToDict(d, KX_STATE4, (1<<3));
1416 KX_MACRO_addTypesToDict(d, KX_STATE5, (1<<4));
1417 KX_MACRO_addTypesToDict(d, KX_STATE6, (1<<5));
1418 KX_MACRO_addTypesToDict(d, KX_STATE7, (1<<6));
1419 KX_MACRO_addTypesToDict(d, KX_STATE8, (1<<7));
1420 KX_MACRO_addTypesToDict(d, KX_STATE9, (1<<8));
1421 KX_MACRO_addTypesToDict(d, KX_STATE10, (1<<9));
1422 KX_MACRO_addTypesToDict(d, KX_STATE11, (1<<10));
1423 KX_MACRO_addTypesToDict(d, KX_STATE12, (1<<11));
1424 KX_MACRO_addTypesToDict(d, KX_STATE13, (1<<12));
1425 KX_MACRO_addTypesToDict(d, KX_STATE14, (1<<13));
1426 KX_MACRO_addTypesToDict(d, KX_STATE15, (1<<14));
1427 KX_MACRO_addTypesToDict(d, KX_STATE16, (1<<15));
1428 KX_MACRO_addTypesToDict(d, KX_STATE17, (1<<16));
1429 KX_MACRO_addTypesToDict(d, KX_STATE18, (1<<17));
1430 KX_MACRO_addTypesToDict(d, KX_STATE19, (1<<18));
1431 KX_MACRO_addTypesToDict(d, KX_STATE20, (1<<19));
1432 KX_MACRO_addTypesToDict(d, KX_STATE21, (1<<20));
1433 KX_MACRO_addTypesToDict(d, KX_STATE22, (1<<21));
1434 KX_MACRO_addTypesToDict(d, KX_STATE23, (1<<22));
1435 KX_MACRO_addTypesToDict(d, KX_STATE24, (1<<23));
1436 KX_MACRO_addTypesToDict(d, KX_STATE25, (1<<24));
1437 KX_MACRO_addTypesToDict(d, KX_STATE26, (1<<25));
1438 KX_MACRO_addTypesToDict(d, KX_STATE27, (1<<26));
1439 KX_MACRO_addTypesToDict(d, KX_STATE28, (1<<27));
1440 KX_MACRO_addTypesToDict(d, KX_STATE29, (1<<28));
1441 KX_MACRO_addTypesToDict(d, KX_STATE30, (1<<29));
1444 KX_MACRO_addTypesToDict(d, KX_SENSOR_JUST_ACTIVATED, SCA_ISensor::KX_SENSOR_JUST_ACTIVATED);
1445 KX_MACRO_addTypesToDict(d, KX_SENSOR_ACTIVE, SCA_ISensor::KX_SENSOR_ACTIVE);
1446 KX_MACRO_addTypesToDict(d, KX_SENSOR_JUST_DEACTIVATED, SCA_ISensor::KX_SENSOR_JUST_DEACTIVATED);
1447 KX_MACRO_addTypesToDict(d, KX_SENSOR_INACTIVE, SCA_ISensor::KX_SENSOR_INACTIVE);
1450 KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_POS_X, KX_RadarSensor::KX_RADAR_AXIS_POS_X);
1451 KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_POS_Y, KX_RadarSensor::KX_RADAR_AXIS_POS_Y);
1452 KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_POS_Z, KX_RadarSensor::KX_RADAR_AXIS_POS_Z);
1453 KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_NEG_X, KX_RadarSensor::KX_RADAR_AXIS_NEG_Y);
1454 KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_NEG_Y, KX_RadarSensor::KX_RADAR_AXIS_NEG_X);
1455 KX_MACRO_addTypesToDict(d, KX_RADAR_AXIS_NEG_Z, KX_RadarSensor::KX_RADAR_AXIS_NEG_Z);
1458 KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_POS_X, KX_RaySensor::KX_RAY_AXIS_POS_X);
1459 KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_POS_Y, KX_RaySensor::KX_RAY_AXIS_POS_Y);
1460 KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_POS_Z, KX_RaySensor::KX_RAY_AXIS_POS_Z);
1461 KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_NEG_X, KX_RaySensor::KX_RAY_AXIS_NEG_Y);
1462 KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_NEG_Y, KX_RaySensor::KX_RAY_AXIS_NEG_X);
1463 KX_MACRO_addTypesToDict(d, KX_RAY_AXIS_NEG_Z, KX_RaySensor::KX_RAY_AXIS_NEG_Z);
1465 /* Dynamic actuator */
1466 KX_MACRO_addTypesToDict(d, KX_DYN_RESTORE_DYNAMICS, KX_SCA_DynamicActuator::KX_DYN_RESTORE_DYNAMICS);
1467 KX_MACRO_addTypesToDict(d, KX_DYN_DISABLE_DYNAMICS, KX_SCA_DynamicActuator::KX_DYN_DISABLE_DYNAMICS);
1468 KX_MACRO_addTypesToDict(d, KX_DYN_ENABLE_RIGID_BODY, KX_SCA_DynamicActuator::KX_DYN_ENABLE_RIGID_BODY);
1469 KX_MACRO_addTypesToDict(d, KX_DYN_DISABLE_RIGID_BODY, KX_SCA_DynamicActuator::KX_DYN_DISABLE_RIGID_BODY);
1470 KX_MACRO_addTypesToDict(d, KX_DYN_SET_MASS, KX_SCA_DynamicActuator::KX_DYN_SET_MASS);
1472 /* Input & Mouse Sensor */
1473 KX_MACRO_addTypesToDict(d, KX_INPUT_NONE, SCA_InputEvent::KX_NO_INPUTSTATUS);
1474 KX_MACRO_addTypesToDict(d, KX_INPUT_JUST_ACTIVATED, SCA_InputEvent::KX_JUSTACTIVATED);
1475 KX_MACRO_addTypesToDict(d, KX_INPUT_ACTIVE, SCA_InputEvent::KX_ACTIVE);
1476 KX_MACRO_addTypesToDict(d, KX_INPUT_JUST_RELEASED, SCA_InputEvent::KX_JUSTRELEASED);
1478 KX_MACRO_addTypesToDict(d, KX_MOUSE_BUT_LEFT, SCA_IInputDevice::KX_LEFTMOUSE);
1479 KX_MACRO_addTypesToDict(d, KX_MOUSE_BUT_MIDDLE, SCA_IInputDevice::KX_MIDDLEMOUSE);
1480 KX_MACRO_addTypesToDict(d, KX_MOUSE_BUT_RIGHT, SCA_IInputDevice::KX_RIGHTMOUSE);
1482 /* 2D Filter Actuator */
1483 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_ENABLED, RAS_2DFilterManager::RAS_2DFILTER_ENABLED);
1484 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_DISABLED, RAS_2DFilterManager::RAS_2DFILTER_DISABLED);
1485 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_NOFILTER, RAS_2DFilterManager::RAS_2DFILTER_NOFILTER);
1486 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_MOTIONBLUR, RAS_2DFilterManager::RAS_2DFILTER_MOTIONBLUR);
1487 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_BLUR, RAS_2DFilterManager::RAS_2DFILTER_BLUR);
1488 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_SHARPEN, RAS_2DFilterManager::RAS_2DFILTER_SHARPEN);
1489 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_DILATION, RAS_2DFilterManager::RAS_2DFILTER_DILATION);
1490 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_EROSION, RAS_2DFilterManager::RAS_2DFILTER_EROSION);
1491 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_LAPLACIAN, RAS_2DFilterManager::RAS_2DFILTER_LAPLACIAN);
1492 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_SOBEL, RAS_2DFilterManager::RAS_2DFILTER_SOBEL);
1493 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_PREWITT, RAS_2DFilterManager::RAS_2DFILTER_PREWITT);
1494 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_GRAYSCALE, RAS_2DFilterManager::RAS_2DFILTER_GRAYSCALE);
1495 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_SEPIA, RAS_2DFilterManager::RAS_2DFILTER_SEPIA);
1496 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_INVERT, RAS_2DFilterManager::RAS_2DFILTER_INVERT);
1497 KX_MACRO_addTypesToDict(d, RAS_2DFILTER_CUSTOMFILTER, RAS_2DFilterManager::RAS_2DFILTER_CUSTOMFILTER);
1499 /* Sound Actuator */
1500 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_PLAYSTOP, KX_SoundActuator::KX_SOUNDACT_PLAYSTOP);
1501 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_PLAYEND, KX_SoundActuator::KX_SOUNDACT_PLAYEND);
1502 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPSTOP, KX_SoundActuator::KX_SOUNDACT_LOOPSTOP);
1503 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPEND, KX_SoundActuator:: KX_SOUNDACT_LOOPEND);
1504 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPBIDIRECTIONAL, KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL);
1505 KX_MACRO_addTypesToDict(d, KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP, KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP);
1507 /* State Actuator */
1508 KX_MACRO_addTypesToDict(d, KX_STATE_OP_CPY, KX_StateActuator::OP_CPY);
1509 KX_MACRO_addTypesToDict(d, KX_STATE_OP_SET, KX_StateActuator::OP_SET);
1510 KX_MACRO_addTypesToDict(d, KX_STATE_OP_CLR, KX_StateActuator::OP_CLR);
1511 KX_MACRO_addTypesToDict(d, KX_STATE_OP_NEG, KX_StateActuator::OP_NEG);
1513 /* Game Actuator Modes */
1514 KX_MACRO_addTypesToDict(d, KX_GAME_LOAD, KX_GameActuator::KX_GAME_LOAD);
1515 KX_MACRO_addTypesToDict(d, KX_GAME_START, KX_GameActuator::KX_GAME_START);
1516 KX_MACRO_addTypesToDict(d, KX_GAME_RESTART, KX_GameActuator::KX_GAME_RESTART);
1517 KX_MACRO_addTypesToDict(d, KX_GAME_QUIT, KX_GameActuator::KX_GAME_QUIT);
1518 KX_MACRO_addTypesToDict(d, KX_GAME_SAVECFG, KX_GameActuator::KX_GAME_SAVECFG);
1519 KX_MACRO_addTypesToDict(d, KX_GAME_LOADCFG, KX_GameActuator::KX_GAME_LOADCFG);
1521 /* Scene Actuator Modes */
1522 KX_MACRO_addTypesToDict(d, KX_SCENE_RESTART, KX_SceneActuator::KX_SCENE_RESTART);
1523 KX_MACRO_addTypesToDict(d, KX_SCENE_SET_SCENE, KX_SceneActuator::KX_SCENE_SET_SCENE);
1524 KX_MACRO_addTypesToDict(d, KX_SCENE_SET_CAMERA, KX_SceneActuator::KX_SCENE_SET_CAMERA);
1525 KX_MACRO_addTypesToDict(d, KX_SCENE_ADD_FRONT_SCENE, KX_SceneActuator::KX_SCENE_ADD_FRONT_SCENE);
1526 KX_MACRO_addTypesToDict(d, KX_SCENE_ADD_BACK_SCENE, KX_SceneActuator::KX_SCENE_ADD_BACK_SCENE);
1527 KX_MACRO_addTypesToDict(d, KX_SCENE_REMOVE_SCENE, KX_SceneActuator::KX_SCENE_REMOVE_SCENE);
1528 KX_MACRO_addTypesToDict(d, KX_SCENE_SUSPEND, KX_SceneActuator::KX_SCENE_SUSPEND);
1529 KX_MACRO_addTypesToDict(d, KX_SCENE_RESUME, KX_SceneActuator::KX_SCENE_RESUME);
1531 /* Parent Actuator Modes */
1532 KX_MACRO_addTypesToDict(d, KX_PARENT_SET, KX_ParentActuator::KX_PARENT_SET);
1533 KX_MACRO_addTypesToDict(d, KX_PARENT_REMOVE, KX_ParentActuator::KX_PARENT_REMOVE);
1535 /* BL_ArmatureConstraint type */
1536 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_TRACKTO, CONSTRAINT_TYPE_TRACKTO);
1537 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_KINEMATIC, CONSTRAINT_TYPE_KINEMATIC);
1538 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_ROTLIKE, CONSTRAINT_TYPE_ROTLIKE);
1539 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_LOCLIKE, CONSTRAINT_TYPE_LOCLIKE);
1540 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_MINMAX, CONSTRAINT_TYPE_MINMAX);
1541 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_SIZELIKE, CONSTRAINT_TYPE_SIZELIKE);
1542 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_LOCKTRACK, CONSTRAINT_TYPE_LOCKTRACK);
1543 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_STRETCHTO, CONSTRAINT_TYPE_STRETCHTO);
1544 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_CLAMPTO, CONSTRAINT_TYPE_CLAMPTO);
1545 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_TRANSFORM, CONSTRAINT_TYPE_TRANSFORM);
1546 KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_DISTLIMIT, CONSTRAINT_TYPE_DISTLIMIT);
1547 /* BL_ArmatureConstraint ik_type */
1548 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_COPYPOSE, CONSTRAINT_IK_COPYPOSE);
1549 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_DISTANCE, CONSTRAINT_IK_DISTANCE);
1550 /* BL_ArmatureConstraint ik_mode */
1551 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_MODE_INSIDE, LIMITDIST_INSIDE);
1552 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_MODE_OUTSIDE, LIMITDIST_OUTSIDE);
1553 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_MODE_ONSURFACE, LIMITDIST_ONSURFACE);
1554 /* BL_ArmatureConstraint ik_flag */
1555 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_TIP, CONSTRAINT_IK_TIP);
1556 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_ROT, CONSTRAINT_IK_ROT);
1557 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_STRETCH, CONSTRAINT_IK_STRETCH);
1558 KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_POS, CONSTRAINT_IK_POS);
1559 /* KX_ArmatureSensor type */
1560 KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_STATE_CHANGED, SENS_ARM_STATE_CHANGED);
1561 KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_LIN_ERROR_BELOW, SENS_ARM_LIN_ERROR_BELOW);
1562 KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_LIN_ERROR_ABOVE, SENS_ARM_LIN_ERROR_ABOVE);
1563 KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_ROT_ERROR_BELOW, SENS_ARM_ROT_ERROR_BELOW);
1564 KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_ROT_ERROR_ABOVE, SENS_ARM_ROT_ERROR_ABOVE);
1566 /* BL_ArmatureActuator type */
1567 KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_RUN, ACT_ARM_RUN);
1568 KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_ENABLE, ACT_ARM_ENABLE);
1569 KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_DISABLE, ACT_ARM_DISABLE);
1570 KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_SETTARGET, ACT_ARM_SETTARGET);
1571 KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_SETWEIGHT, ACT_ARM_SETWEIGHT);
1573 /* BL_Armature Channel rotation_mode */
1574 KX_MACRO_addTypesToDict(d, ROT_MODE_QUAT, ROT_MODE_QUAT);
1575 KX_MACRO_addTypesToDict(d, ROT_MODE_XYZ, ROT_MODE_XYZ);
1576 KX_MACRO_addTypesToDict(d, ROT_MODE_XZY, ROT_MODE_XZY);
1577 KX_MACRO_addTypesToDict(d, ROT_MODE_YXZ, ROT_MODE_YXZ);
1578 KX_MACRO_addTypesToDict(d, ROT_MODE_YZX, ROT_MODE_YZX);
1579 KX_MACRO_addTypesToDict(d, ROT_MODE_ZXY, ROT_MODE_ZXY);
1580 KX_MACRO_addTypesToDict(d, ROT_MODE_ZYX, ROT_MODE_ZYX);
1583 if (PyErr_Occurred())
1585 Py_FatalError("can't initialize module GameLogic");
1591 // Python Sandbox code
1592 // override builtin functions import() and open()
1595 PyObject *KXpy_open(PyObject *self, PyObject *args) {
1596 PyErr_SetString(PyExc_RuntimeError, "Sandbox: open() function disabled!\nGame Scripts should not use this function.");
1600 PyObject *KXpy_file(PyObject *self, PyObject *args) {
1601 PyErr_SetString(PyExc_RuntimeError, "Sandbox: file() function disabled!\nGame Scripts should not use this function.");
1605 PyObject *KXpy_execfile(PyObject *self, PyObject *args) {
1606 PyErr_SetString(PyExc_RuntimeError, "Sandbox: execfile() function disabled!\nGame Scripts should not use this function.");
1610 PyObject *KXpy_compile(PyObject *self, PyObject *args) {
1611 PyErr_SetString(PyExc_RuntimeError, "Sandbox: compile() function disabled!\nGame Scripts should not use this function.");
1615 PyObject *KXpy_import(PyObject *self, PyObject *args)
1619 PyObject *globals = NULL;
1620 PyObject *locals = NULL;
1621 PyObject *fromlist = NULL;
1622 PyObject *l, *m, *n;
1623 int level; /* not used yet */
1625 if (!PyArg_ParseTuple(args, "s|OOOi:m_import",
1626 &name, &globals, &locals, &fromlist, &level))
1629 /* check for builtin modules */
1630 m = PyImport_AddModule("sys");
1631 l = PyObject_GetAttrString(m, "builtin_module_names");
1632 n = PyUnicode_FromString(name);
1634 if (PySequence_Contains(l, n)) {
1635 return PyImport_ImportModuleEx(name, globals, locals, fromlist);
1638 /* quick hack for GamePython modules
1639 TODO: register builtin modules properly by ExtendInittab */
1640 if (!strcmp(name, "GameLogic") || !strcmp(name, "GameKeys") || !strcmp(name, "PhysicsConstraints") ||
1641 !strcmp(name, "Rasterizer") || !strcmp(name, "mathutils") || !strcmp(name, "bgl") || !strcmp(name, "geometry")) {
1642 return PyImport_ImportModuleEx(name, globals, locals, fromlist);
1645 /* Import blender texts as python modules */
1646 m= bpy_text_import_name(name, &found);
1650 if(found==0) /* if its found but could not import then it has its own error */
1651 PyErr_Format(PyExc_ImportError, "Import of external Module %.20s not allowed.", name);
1657 PyObject *KXpy_reload(PyObject *self, PyObject *args) {
1659 /* Used to be sandboxed, bettet to allow importing of internal text only */
1661 PyErr_SetString(PyExc_RuntimeError, "Sandbox: reload() function disabled!\nGame Scripts should not use this function.");
1665 PyObject *module = NULL;
1666 PyObject *newmodule = NULL;
1668 /* check for a module arg */
1669 if( !PyArg_ParseTuple( args, "O:bpy_reload_meth", &module ) )
1672 newmodule= bpy_text_reimport( module, &found );
1676 if (found==0) /* if its found but could not import then it has its own error */
1677 PyErr_SetString(PyExc_ImportError, "reload(module): failed to reload from blenders internal text");
1682 /* override python file type functions */
1685 file_init(PyObject *self, PyObject *args, PyObject *kwds)
1687 KXpy_file(NULL, NULL);
1692 file_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1694 return KXpy_file(NULL, NULL);
1698 static PyMethodDef meth_open[] = {{ "open", KXpy_open, METH_VARARGS, "(disabled)"}};
1699 static PyMethodDef meth_reload[] = {{ "reload", KXpy_reload, METH_VARARGS, "(disabled)"}};
1700 static PyMethodDef meth_file[] = {{ "file", KXpy_file, METH_VARARGS, "(disabled)"}};
1701 static PyMethodDef meth_execfile[] = {{ "execfile", KXpy_execfile, METH_VARARGS, "(disabled)"}};
1702 static PyMethodDef meth_compile[] = {{ "compile", KXpy_compile, METH_VARARGS, "(disabled)"}};
1704 static PyMethodDef meth_import[] = {{ "import", KXpy_import, METH_VARARGS, "our own import"}};
1706 //static PyObject *g_oldopen = 0;
1707 //static PyObject *g_oldimport = 0;
1708 //static int g_security = 0;
1710 static void setSandbox(TPythonSecurityLevel level)
1712 PyObject *m = PyImport_AddModule("__builtin__");
1713 PyObject *d = PyModule_GetDict(m);
1717 //if (!g_security) {
1718 //g_oldopen = PyDict_GetItemString(d, "open");
1720 // functions we cant trust
1721 PyDict_SetItemString(d, "open", item=PyCFunction_New(meth_open, NULL)); Py_DECREF(item);
1722 PyDict_SetItemString(d, "reload", item=PyCFunction_New(meth_reload, NULL)); Py_DECREF(item);
1723 PyDict_SetItemString(d, "file", item=PyCFunction_New(meth_file, NULL)); Py_DECREF(item);
1724 PyDict_SetItemString(d, "execfile", item=PyCFunction_New(meth_execfile, NULL)); Py_DECREF(item);
1725 PyDict_SetItemString(d, "compile", item=PyCFunction_New(meth_compile, NULL)); Py_DECREF(item);
1728 PyDict_SetItemString(d, "__import__", PyCFunction_New(meth_import, NULL));
1729 //g_security = level;
1731 // Overiding file dosnt stop it being accessed if your sneaky
1732 // f = [ t for t in (1).__class__.__mro__[-1].__subclasses__() if t.__name__ == 'file'][0]('/some_file.txt', 'w')
1734 // so overwrite the file types functions. be very careful here still, since python uses python.
1735 // ps - python devs frown deeply upon this.
1737 /* this could mess up pythons internals, if we are serious about sandboxing
1738 * issues like the one above need to be solved, possibly modify __subclasses__ is safer? */
1740 PyFile_Type.tp_init = file_init;
1741 PyFile_Type.tp_new = file_new;
1748 PyDict_SetItemString(d, "open", g_oldopen);
1749 PyDict_SetItemString(d, "__import__", g_oldimport);
1754 /* Allow importing internal text, from bpy_internal_import.py */
1755 PyDict_SetItemString(d, "reload", item=PyCFunction_New(bpy_reload_meth, NULL)); Py_DECREF(item);
1756 PyDict_SetItemString(d, "__import__", item=PyCFunction_New(bpy_import_meth, NULL)); Py_DECREF(item);
1763 * - backupPySysObjects() : stores sys.path in gp_OrigPythonSysPath
1764 * - initPySysObjects(main) : initializes the blendfile and library paths
1765 * - restorePySysObjects() : restores sys.path from gp_OrigPythonSysPath
1767 * These exist so the current blend dir "//" can always be used to import modules from.
1768 * the reason we need a few functions for this is that python is not only used by the game engine
1769 * so we cant just add to sys.path all the time, it would leave pythons state in a mess.
1770 * It would also be incorrect since loading blend files for new levels etc would alwasy add to sys.path
1772 * To play nice with blenders python, the sys.path is backed up and the current blendfile along
1773 * with all its lib paths are added to the sys path.
1774 * When loading a new blendfile, the original sys.path is restored and the new paths are added over the top.
1778 * So we can have external modules mixed with our blend files.
1780 static void backupPySysObjects(void)
1782 PyObject *sys_path= PySys_GetObject("path"); /* should never fail */
1783 PyObject *sys_mods= PySys_GetObject("modules"); /* should never fail */
1786 Py_XDECREF(gp_OrigPythonSysPath); /* just incase its set */
1787 gp_OrigPythonSysPath = PyList_GetSlice(sys_path, 0, INT_MAX); /* copy the list */
1790 Py_XDECREF(gp_OrigPythonSysModules); /* just incase its set */
1791 gp_OrigPythonSysModules = PyDict_Copy(sys_mods); /* copy the list */
1795 /* for initPySysObjects only,
1796 * takes a blend path and adds a scripts dir from it
1798 * "/home/me/foo.blend" -> "/home/me/scripts"
1800 static void initPySysObjects__append(PyObject *sys_path, char *filename)
1803 char expanded[FILE_MAXDIR + FILE_MAXFILE];
1805 BLI_split_dirfile(filename, expanded, NULL); /* get the dir part of filename only */
1806 BLI_path_abs(expanded, gp_GamePythonPath); /* filename from lib->filename is (always?) absolute, so this may not be needed but it wont hurt */
1807 BLI_cleanup_file(gp_GamePythonPath, expanded); /* Dont use BLI_cleanup_dir because it adds a slash - BREAKS WIN32 ONLY */
1808 item= PyUnicode_FromString(expanded);
1810 // printf("SysPath - '%s', '%s', '%s'\n", expanded, filename, gp_GamePythonPath);
1812 if(PySequence_Index(sys_path, item) == -1) {
1813 PyErr_Clear(); /* PySequence_Index sets a ValueError */
1814 PyList_Insert(sys_path, 0, item);
1819 static void initPySysObjects(Main *maggie)
1821 PyObject *sys_path= PySys_GetObject("path"); /* should never fail */
1823 if (gp_OrigPythonSysPath==NULL) {
1825 backupPySysObjects();
1828 /* get the original sys path when the BGE started */
1829 PyList_SetSlice(sys_path, 0, INT_MAX, gp_OrigPythonSysPath);
1832 Library *lib= (Library *)maggie->library.first;
1835 /* lib->name wont work in some cases (on win32),
1836 * even when expanding with gp_GamePythonPath, using lib->filename is less trouble */
1837 initPySysObjects__append(sys_path, lib->filepath);
1838 lib= (Library *)lib->id.next;
1841 initPySysObjects__append(sys_path, gp_GamePythonPath);
1843 // fprintf(stderr, "\nNew Path: %d ", PyList_Size(sys_path));
1844 // PyObject_Print(sys_path, stderr, 0);
1847 static void restorePySysObjects(void)
1849 if (gp_OrigPythonSysPath==NULL)
1852 PyObject *sys_path= PySys_GetObject("path"); /* should never fail */
1853 PyObject *sys_mods= PySys_GetObject("modules"); /* should never fail */
1856 PyList_SetSlice(sys_path, 0, INT_MAX, gp_OrigPythonSysPath);
1857 Py_DECREF(gp_OrigPythonSysPath);
1858 gp_OrigPythonSysPath= NULL;
1861 PyDict_Clear(sys_mods);
1862 PyDict_Update(sys_mods, gp_OrigPythonSysModules);
1863 Py_DECREF(gp_OrigPythonSysModules);
1864 gp_OrigPythonSysModules= NULL;
1867 // fprintf(stderr, "\nRestore Path: %d ", PyList_Size(sys_path));
1868 // PyObject_Print(sys_path, stderr, 0);
1872 * Python is not initialised.
1874 PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecurityLevel level, Main *maggie, int argc, char** argv)
1876 /* Yet another gotcha in the py api
1877 * Cant run PySys_SetArgv more then once because this adds the
1878 * binary dir to the sys.path each time.
1879 * Id have thaught python being totally restarted would make this ok but
1880 * somehow it remembers the sys.path - Campbell
1882 static bool first_time = true;
1885 STR_String pname = progname;
1886 Py_SetProgramName(pname.Ptr());
1892 if(argv && first_time) { /* browser plugins dont currently set this */
1893 // Until python support ascii again, we use our own.
1894 // PySys_SetArgv(argc, argv);
1896 PyObject *py_argv= PyList_New(argc);
1898 for (i=0; i<argc; i++)
1899 PyList_SET_ITEM(py_argv, i, PyUnicode_FromString(argv[i]));
1901 PySys_SetObject("argv", py_argv);
1908 bpy_import_main_set(maggie);
1910 initPySysObjects(maggie);
1914 PyObjectPlus::ClearDeprecationWarning();
1916 PyObject* moduleobj = PyImport_AddModule("__main__");
1917 return PyModule_GetDict(moduleobj);
1920 void exitGamePlayerPythonScripting()
1922 /* since python restarts we cant let the python backup of the sys.path hang around in a global pointer */
1923 restorePySysObjects(); /* get back the original sys.path and clear the backup */
1926 bpy_import_main_set(NULL);
1927 PyObjectPlus::ClearDeprecationWarning();
1933 * Python is already initialized.
1935 PyObject* initGamePythonScripting(const STR_String& progname, TPythonSecurityLevel level, Main *maggie)
1937 #if 0 // XXX TODO Py3
1938 STR_String pname = progname;
1939 Py_SetProgramName(pname.Ptr());
1947 bpy_import_main_set(maggie);
1949 initPySysObjects(maggie);
1951 PyObjectPlus::NullDeprecationWarning();
1953 PyObject* moduleobj = PyImport_AddModule("__main__");
1954 return PyModule_GetDict(moduleobj);
1957 void exitGamePythonScripting()
1959 restorePySysObjects(); /* get back the original sys.path and clear the backup */
1960 bpy_import_main_set(NULL);
1961 PyObjectPlus::ClearDeprecationWarning();
1964 /* similar to the above functions except it sets up the namespace
1965 * and other more general things */
1966 void setupGamePython(KX_KetsjiEngine* ketsjiengine, KX_Scene* startscene, Main *blenderdata, PyObject * pyGlobalDict, PyObject **gameLogic, PyObject **gameLogic_keys, int argc, char** argv)
1968 PyObject* dictionaryobject;
1970 if(argv) /* player only */
1971 dictionaryobject= initGamePlayerPythonScripting("Ketsji", psl_Lowest, blenderdata, argc, argv);
1973 dictionaryobject= initGamePythonScripting("Ketsji", psl_Lowest, blenderdata);
1975 ketsjiengine->SetPyNamespace(dictionaryobject);
1976 initRasterizer(ketsjiengine->GetRasterizer(), ketsjiengine->GetCanvas());
1977 *gameLogic = initGameLogic(ketsjiengine, startscene);
1979 /* is set in initGameLogic so only set here if we want it to persist between scenes */
1981 PyDict_SetItemString(PyModule_GetDict(*gameLogic), "globalDict", pyGlobalDict); // Same as importing the module.
1983 *gameLogic_keys = PyDict_Keys(PyModule_GetDict(*gameLogic));
1984 PyDict_SetItemString(dictionaryobject, "GameLogic", *gameLogic); // Same as importing the module.
1987 initPythonConstraintBinding();
1997 /* could be done a lot more nicely, but for now a quick way to get bge.* working */
1998 PyRun_SimpleString("__import__('sys').modules['bge']=[mod for mod in (type(__builtins__)('bge'), ) if mod.__dict__.update({'logic':__import__('GameLogic'), 'render':__import__('Rasterizer'), 'events':__import__('GameKeys'), 'constraints':__import__('PhysicsConstraints'), 'types':__import__('GameTypes')}) is None][0]");
2001 static struct PyModuleDef Rasterizer_module_def = {
2003 "Rasterizer", /* m_name */
2004 Rasterizer_module_documentation, /* m_doc */
2006 rasterizer_methods, /* m_methods */
2013 PyObject* initRasterizer(RAS_IRasterizer* rasty,RAS_ICanvas* canvas)
2016 gp_Rasterizer = rasty;
2023 /* Use existing module where possible
2024 * be careful not to init any runtime vars after this */
2025 m = PyImport_ImportModule( "Rasterizer" );
2033 // Create the module and add the functions
2034 m = PyModule_Create(&Rasterizer_module_def);
2035 PyDict_SetItemString(PySys_GetObject("modules"), Rasterizer_module_def.m_name, m);
2038 // Add some symbolic constants to the module
2039 d = PyModule_GetDict(m);
2040 ErrorObject = PyUnicode_FromString("Rasterizer.error");
2041 PyDict_SetItemString(d, "error", ErrorObject);
2042 Py_DECREF(ErrorObject);
2044 /* needed for get/setMaterialType */
2045 KX_MACRO_addTypesToDict(d, KX_TEXFACE_MATERIAL, KX_TEXFACE_MATERIAL);
2046 KX_MACRO_addTypesToDict(d, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL);
2047 KX_MACRO_addTypesToDict(d, KX_BLENDER_GLSL_MATERIAL, KX_BLENDER_GLSL_MATERIAL);
2049 // XXXX Add constants here
2052 if (PyErr_Occurred())
2054 Py_FatalError("can't initialize module Rasterizer");
2062 /* ------------------------------------------------------------------------- */
2063 /* GameKeys: symbolic constants for key mapping */
2064 /* ------------------------------------------------------------------------- */
2066 static char GameKeys_module_documentation[] =
2067 "This modules provides defines for key-codes"
2070 static char gPyEventToString_doc[] =
2071 "EventToString(event) - Take a valid event from the GameKeys module or Keyboard Sensor and return a name"
2074 static PyObject* gPyEventToString(PyObject*, PyObject* value)
2076 PyObject* mod, *dict, *key, *val, *ret = NULL;
2079 mod = PyImport_ImportModule( "GameKeys" );
2083 dict = PyModule_GetDict(mod);
2085 while (PyDict_Next(dict, &pos, &key, &val)) {
2086 if (PyObject_RichCompareBool(value, val, Py_EQ)) {
2092 PyErr_Clear(); // incase there was an error clearing
2094 if (!ret) PyErr_SetString(PyExc_ValueError, "GameKeys.EventToString(int): expected a valid int keyboard event");
2095 else Py_INCREF(ret);
2100 static char gPyEventToCharacter_doc[] =
2101 "EventToCharacter(event, is_shift) - Take a valid event from the GameKeys module or Keyboard Sensor and return a character"
2104 static PyObject* gPyEventToCharacter(PyObject*, PyObject* args)
2107 if (!PyArg_ParseTuple(args,"ii:EventToCharacter", &event, &shift))
2110 if(IsPrintable(event)) {
2111 char ch[2] = {'\0', '\0'};
2112 ch[0] = ToCharacter(event, (bool)shift);
2113 return PyUnicode_FromString(ch);
2116 return PyUnicode_FromString("");
2121 static struct PyMethodDef gamekeys_methods[] = {
2122 {"EventToCharacter", (PyCFunction)gPyEventToCharacter, METH_VARARGS, (const char *)gPyEventToCharacter_doc},
2123 {"EventToString", (PyCFunction)gPyEventToString, METH_O, (const char *)gPyEventToString_doc},
2124 { NULL, (PyCFunction) NULL, 0, NULL }
2127 static struct PyModuleDef GameKeys_module_def = {
2129 "GameKeys", /* m_name */
2130 GameKeys_module_documentation, /* m_doc */
2132 gamekeys_methods, /* m_methods */
2139 PyObject* initGameKeys()
2145 /* Use existing module where possible */
2146 m = PyImport_ImportModule( "GameKeys" );
2154 // Create the module and add the functions
2155 m = PyModule_Create(&GameKeys_module_def);
2156 PyDict_SetItemString(PySys_GetObject("modules"), GameKeys_module_def.m_name, m);
2159 // Add some symbolic constants to the module
2160 d = PyModule_GetDict(m);
2162 // XXXX Add constants here
2164 KX_MACRO_addTypesToDict(d, AKEY, SCA_IInputDevice::KX_AKEY);
2165 KX_MACRO_addTypesToDict(d, BKEY, SCA_IInputDevice::KX_BKEY);
2166 KX_MACRO_addTypesToDict(d, CKEY, SCA_IInputDevice::KX_CKEY);
2167 KX_MACRO_addTypesToDict(d, DKEY, SCA_IInputDevice::KX_DKEY);
2168 KX_MACRO_addTypesToDict(d, EKEY, SCA_IInputDevice::KX_EKEY);
2169 KX_MACRO_addTypesToDict(d, FKEY, SCA_IInputDevice::KX_FKEY);
2170 KX_MACRO_addTypesToDict(d, GKEY, SCA_IInputDevice::KX_GKEY);
2171 KX_MACRO_addTypesToDict(d, HKEY, SCA_IInputDevice::KX_HKEY);
2172 KX_MACRO_addTypesToDict(d, IKEY, SCA_IInputDevice::KX_IKEY);
2173 KX_MACRO_addTypesToDict(d, JKEY, SCA_IInputDevice::KX_JKEY);
2174 KX_MACRO_addTypesToDict(d, KKEY, SCA_IInputDevice::KX_KKEY);
2175 KX_MACRO_addTypesToDict(d, LKEY, SCA_IInputDevice::KX_LKEY);
2176 KX_MACRO_addTypesToDict(d, MKEY, SCA_IInputDevice::KX_MKEY);
2177 KX_MACRO_addTypesToDict(d, NKEY, SCA_IInputDevice::KX_NKEY);
2178 KX_MACRO_addTypesToDict(d, OKEY, SCA_IInputDevice::KX_OKEY);
2179 KX_MACRO_addTypesToDict(d, PKEY, SCA_IInputDevice::KX_PKEY);
2180 KX_MACRO_addTypesToDict(d, QKEY, SCA_IInputDevice::KX_QKEY);
2181 KX_MACRO_addTypesToDict(d, RKEY, SCA_IInputDevice::KX_RKEY);
2182 KX_MACRO_addTypesToDict(d, SKEY, SCA_IInputDevice::KX_SKEY);
2183 KX_MACRO_addTypesToDict(d, TKEY, SCA_IInputDevice::KX_TKEY);
2184 KX_MACRO_addTypesToDict(d, UKEY, SCA_IInputDevice::KX_UKEY);
2185 KX_MACRO_addTypesToDict(d, VKEY, SCA_IInputDevice::KX_VKEY);
2186 KX_MACRO_addTypesToDict(d, WKEY, SCA_IInputDevice::KX_WKEY);
2187 KX_MACRO_addTypesToDict(d, XKEY, SCA_IInputDevice::KX_XKEY);
2188 KX_MACRO_addTypesToDict(d, YKEY, SCA_IInputDevice::KX_YKEY);
2189 KX_MACRO_addTypesToDict(d, ZKEY, SCA_IInputDevice::KX_ZKEY);
2191 KX_MACRO_addTypesToDict(d, ZEROKEY, SCA_IInputDevice::KX_ZEROKEY);
2192 KX_MACRO_addTypesToDict(d, ONEKEY, SCA_IInputDevice::KX_ONEKEY);
2193 KX_MACRO_addTypesToDict(d, TWOKEY, SCA_IInputDevice::KX_TWOKEY);
2194 KX_MACRO_addTypesToDict(d, THREEKEY, SCA_IInputDevice::KX_THREEKEY);
2195 KX_MACRO_addTypesToDict(d, FOURKEY, SCA_IInputDevice::KX_FOURKEY);
2196 KX_MACRO_addTypesToDict(d, FIVEKEY, SCA_IInputDevice::KX_FIVEKEY);
2197 KX_MACRO_addTypesToDict(d, SIXKEY, SCA_IInputDevice::KX_SIXKEY);
2198 KX_MACRO_addTypesToDict(d, SEVENKEY, SCA_IInputDevice::KX_SEVENKEY);
2199 KX_MACRO_addTypesToDict(d, EIGHTKEY, SCA_IInputDevice::KX_EIGHTKEY);
2200 KX_MACRO_addTypesToDict(d, NINEKEY, SCA_IInputDevice::KX_NINEKEY);
2202 KX_MACRO_addTypesToDict(d, CAPSLOCKKEY, SCA_IInputDevice::KX_CAPSLOCKKEY);
2204 KX_MACRO_addTypesToDict(d, LEFTCTRLKEY, SCA_IInputDevice::KX_LEFTCTRLKEY);
2205 KX_MACRO_addTypesToDict(d, LEFTALTKEY, SCA_IInputDevice::KX_LEFTALTKEY);
2206 KX_MACRO_addTypesToDict(d, RIGHTALTKEY, SCA_IInputDevice::KX_RIGHTALTKEY);
2207 KX_MACRO_addTypesToDict(d, RIGHTCTRLKEY, SCA_IInputDevice::KX_RIGHTCTRLKEY);
2208 KX_MACRO_addTypesToDict(d, RIGHTSHIFTKEY, SCA_IInputDevice::KX_RIGHTSHIFTKEY);
2209 KX_MACRO_addTypesToDict(d, LEFTSHIFTKEY, SCA_IInputDevice::KX_LEFTSHIFTKEY);
2211 KX_MACRO_addTypesToDict(d, ESCKEY, SCA_IInputDevice::KX_ESCKEY);
2212 KX_MACRO_addTypesToDict(d, TABKEY, SCA_IInputDevice::KX_TABKEY);
2213 KX_MACRO_addTypesToDict(d, RETKEY, SCA_IInputDevice::KX_RETKEY);
2214 KX_MACRO_addTypesToDict(d, SPACEKEY, SCA_IInputDevice::KX_SPACEKEY);
2215 KX_MACRO_addTypesToDict(d, LINEFEEDKEY, SCA_IInputDevice::KX_LINEFEEDKEY);
2216 KX_MACRO_addTypesToDict(d, BACKSPACEKEY, SCA_IInputDevice::KX_BACKSPACEKEY);
2217 KX_MACRO_addTypesToDict(d, DELKEY, SCA_IInputDevice::KX_DELKEY);
2218 KX_MACRO_addTypesToDict(d, SEMICOLONKEY, SCA_IInputDevice::KX_SEMICOLONKEY);
2219 KX_MACRO_addTypesToDict(d, PERIODKEY, SCA_IInputDevice::KX_PERIODKEY);
2220 KX_MACRO_addTypesToDict(d, COMMAKEY, SCA_IInputDevice::KX_COMMAKEY);
2221 KX_MACRO_addTypesToDict(d, QUOTEKEY, SCA_IInputDevice::KX_QUOTEKEY);
2222 KX_MACRO_addTypesToDict(d, ACCENTGRAVEKEY, SCA_IInputDevice::KX_ACCENTGRAVEKEY);
2223 KX_MACRO_addTypesToDict(d, MINUSKEY, SCA_IInputDevice::KX_MINUSKEY);
2224 KX_MACRO_addTypesToDict(d, SLASHKEY, SCA_IInputDevice::KX_SLASHKEY);
2225 KX_MACRO_addTypesToDict(d, BACKSLASHKEY, SCA_IInputDevice::KX_BACKSLASHKEY);
2226 KX_MACRO_addTypesToDict(d, EQUALKEY, SCA_IInputDevice::KX_EQUALKEY);
2227 KX_MACRO_addTypesToDict(d, LEFTBRACKETKEY, SCA_IInputDevice::KX_LEFTBRACKETKEY);
2228 KX_MACRO_addTypesToDict(d, RIGHTBRACKETKEY, SCA_IInputDevice::KX_RIGHTBRACKETKEY);
2230 KX_MACRO_addTypesToDict(d, LEFTARROWKEY, SCA_IInputDevice::KX_LEFTARROWKEY);
2231 KX_MACRO_addTypesToDict(d, DOWNARROWKEY, SCA_IInputDevice::KX_DOWNARROWKEY);
2232 KX_MACRO_addTypesToDict(d, RIGHTARROWKEY, SCA_IInputDevice::KX_RIGHTARROWKEY);
2233 KX_MACRO_addTypesToDict(d, UPARROWKEY, SCA_IInputDevice::KX_UPARROWKEY);
2235 KX_MACRO_addTypesToDict(d, PAD2 , SCA_IInputDevice::KX_PAD2);
2236 KX_MACRO_addTypesToDict(d, PAD4 , SCA_IInputDevice::KX_PAD4);
2237 KX_MACRO_addTypesToDict(d, PAD6 , SCA_IInputDevice::KX_PAD6);
2238 KX_MACRO_addTypesToDict(d, PAD8 , SCA_IInputDevice::KX_PAD8);
2240 KX_MACRO_addTypesToDict(d, PAD1 , SCA_IInputDevice::KX_PAD1);
2241 KX_MACRO_addTypesToDict(d, PAD3 , SCA_IInputDevice::KX_PAD3);
2242 KX_MACRO_addTypesToDict(d, PAD5 , SCA_IInputDevice::KX_PAD5);
2243 KX_MACRO_addTypesToDict(d, PAD7 , SCA_IInputDevice::KX_PAD7);
2244 KX_MACRO_addTypesToDict(d, PAD9 , SCA_IInputDevice::KX_PAD9);
2246 KX_MACRO_addTypesToDict(d, PADPERIOD, SCA_IInputDevice::KX_PADPERIOD);
2247 KX_MACRO_addTypesToDict(d, PADSLASHKEY, SCA_IInputDevice::KX_PADSLASHKEY);
2248 KX_MACRO_addTypesToDict(d, PADASTERKEY, SCA_IInputDevice::KX_PADASTERKEY);
2251 KX_MACRO_addTypesToDict(d, PAD0, SCA_IInputDevice::KX_PAD0);
2252 KX_MACRO_addTypesToDict(d, PADMINUS, SCA_IInputDevice::KX_PADMINUS);
2253 KX_MACRO_addTypesToDict(d, PADENTER, SCA_IInputDevice::KX_PADENTER);
2254 KX_MACRO_addTypesToDict(d, PADPLUSKEY, SCA_IInputDevice::KX_PADPLUSKEY);
2257 KX_MACRO_addTypesToDict(d, F1KEY , SCA_IInputDevice::KX_F1KEY);
2258 KX_MACRO_addTypesToDict(d, F2KEY , SCA_IInputDevice::KX_F2KEY);
2259 KX_MACRO_addTypesToDict(d, F3KEY , SCA_IInputDevice::KX_F3KEY);
2260 KX_MACRO_addTypesToDict(d, F4KEY , SCA_IInputDevice::KX_F4KEY);
2261 KX_MACRO_addTypesToDict(d, F5KEY , SCA_IInputDevice::KX_F5KEY);
2262 KX_MACRO_addTypesToDict(d, F6KEY , SCA_IInputDevice::KX_F6KEY);
2263 KX_MACRO_addTypesToDict(d, F7KEY , SCA_IInputDevice::KX_F7KEY);
2264 KX_MACRO_addTypesToDict(d, F8KEY , SCA_IInputDevice::KX_F8KEY);
2265 KX_MACRO_addTypesToDict(d, F9KEY , SCA_IInputDevice::KX_F9KEY);
2266 KX_MACRO_addTypesToDict(d, F10KEY, SCA_IInputDevice::KX_F10KEY);
2267 KX_MACRO_addTypesToDict(d, F11KEY, SCA_IInputDevice::KX_F11KEY);
2268 KX_MACRO_addTypesToDict(d, F12KEY, SCA_IInputDevice::KX_F12KEY);
2269 KX_MACRO_addTypesToDict(d, F13KEY, SCA_IInputDevice::KX_F13KEY);
2270 KX_MACRO_addTypesToDict(d, F14KEY, SCA_IInputDevice::KX_F14KEY);
2271 KX_MACRO_addTypesToDict(d, F15KEY, SCA_IInputDevice::KX_F15KEY);
2272 KX_MACRO_addTypesToDict(d, F16KEY, SCA_IInputDevice::KX_F16KEY);
2273 KX_MACRO_addTypesToDict(d, F17KEY, SCA_IInputDevice::KX_F17KEY);
2274 KX_MACRO_addTypesToDict(d, F18KEY, SCA_IInputDevice::KX_F18KEY);
2275 KX_MACRO_addTypesToDict(d, F19KEY, SCA_IInputDevice::KX_F19KEY);
2277 KX_MACRO_addTypesToDict(d, PAUSEKEY, SCA_IInputDevice::KX_PAUSEKEY);
2278 KX_MACRO_addTypesToDict(d, INSERTKEY, SCA_IInputDevice::KX_INSERTKEY);
2279 KX_MACRO_addTypesToDict(d, HOMEKEY , SCA_IInputDevice::KX_HOMEKEY);
2280 KX_MACRO_addTypesToDict(d, PAGEUPKEY, SCA_IInputDevice::KX_PAGEUPKEY);
2281 KX_MACRO_addTypesToDict(d, PAGEDOWNKEY, SCA_IInputDevice::KX_PAGEDOWNKEY);
2282 KX_MACRO_addTypesToDict(d, ENDKEY, SCA_IInputDevice::KX_ENDKEY);
2285 KX_MACRO_addTypesToDict(d, LEFTMOUSE, SCA_IInputDevice::KX_LEFTMOUSE);
2286 KX_MACRO_addTypesToDict(d, MIDDLEMOUSE, SCA_IInputDevice::KX_MIDDLEMOUSE);
2287 KX_MACRO_addTypesToDict(d, RIGHTMOUSE, SCA_IInputDevice::KX_RIGHTMOUSE);
2288 KX_MACRO_addTypesToDict(d, WHEELUPMOUSE, SCA_IInputDevice::KX_WHEELUPMOUSE);
2289 KX_MACRO_addTypesToDict(d, WHEELDOWNMOUSE, SCA_IInputDevice::KX_WHEELDOWNMOUSE);
2290 KX_MACRO_addTypesToDict(d, MOUSEX, SCA_IInputDevice::KX_MOUSEX);
2291 KX_MACRO_addTypesToDict(d, MOUSEY, SCA_IInputDevice::KX_MOUSEY);
2294 if (PyErr_Occurred())
2296 Py_FatalError("can't initialize module GameKeys");
2302 PyObject* initMathutils()
2304 return Mathutils_Init();
2307 PyObject* initGeometry()
2309 return Geometry_Init();
2322 // utility function for loading and saving the globalDict
2323 int saveGamePythonConfig( char **marshal_buffer)
2325 int marshal_length = 0;
2326 PyObject* gameLogic = PyImport_ImportModule("GameLogic");
2328 PyObject* pyGlobalDict = PyDict_GetItemString(PyModule_GetDict(gameLogic), "globalDict"); // Same as importing the module
2330 #ifdef Py_MARSHAL_VERSION
2331 PyObject* pyGlobalDictMarshal = PyMarshal_WriteObjectToString( pyGlobalDict, 2); // Py_MARSHAL_VERSION == 2 as of Py2.5
2333 PyObject* pyGlobalDictMarshal = PyMarshal_WriteObjectToString( pyGlobalDict );
2335 if (pyGlobalDictMarshal) {
2337 // PyObject_Print(pyGlobalDictMarshal, stderr, 0);
2338 char *marshal_cstring;
2340 marshal_cstring = PyBytes_AsString(pyGlobalDictMarshal); // py3 uses byte arrays
2341 marshal_length= PyBytes_Size(pyGlobalDictMarshal);
2342 *marshal_buffer = new char[marshal_length + 1];
2343 memcpy(*marshal_buffer, marshal_cstring, marshal_length);
2344 Py_DECREF(pyGlobalDictMarshal);
2346 printf("Error, GameLogic.globalDict could not be marshal'd\n");
2349 printf("Error, GameLogic.globalDict was removed\n");
2351 Py_DECREF(gameLogic);
2354 printf("Error, GameLogic failed to import GameLogic.globalDict will be lost\n");
2356 return marshal_length;
2359 int loadGamePythonConfig(char *marshal_buffer, int marshal_length)
2361 /* Restore the dict */
2362 if (marshal_buffer) {
2363 PyObject* gameLogic = PyImport_ImportModule("GameLogic");
2366 PyObject* pyGlobalDict = PyMarshal_ReadObjectFromString(marshal_buffer, marshal_length);
2368 PyObject* pyGlobalDict_orig = PyDict_GetItemString(PyModule_GetDict(gameLogic), "globalDict"); // Same as importing the module.
2369 if (pyGlobalDict_orig) {
2370 PyDict_Clear(pyGlobalDict_orig);
2371 PyDict_Update(pyGlobalDict_orig, pyGlobalDict);
2373 /* this should not happen, but cant find the original globalDict, just assign it then */
2374 PyDict_SetItemString(PyModule_GetDict(gameLogic), "globalDict", pyGlobalDict); // Same as importing the module.
2376 Py_DECREF(gameLogic);
2377 Py_DECREF(pyGlobalDict);
2380 Py_DECREF(gameLogic);
2382 printf("Error could not marshall string\n");
2386 printf("Error, GameLogic failed to import GameLogic.globalDict will be lost\n");
2392 void pathGamePythonConfig( char *path )
2394 int len = strlen(gp_GamePythonPathOrig); // Always use the first loaded blend filename
2396 BLI_strncpy(path, gp_GamePythonPathOrig, sizeof(gp_GamePythonPathOrig));
2398 /* replace extension */
2399 if (BLI_testextensie(path, ".blend")) {
2400 strcpy(path+(len-6), ".bgeconf");
2402 strcpy(path+len, ".bgeconf");
2406 void setGamePythonPath(char *path)
2408 BLI_strncpy(gp_GamePythonPath, path, sizeof(gp_GamePythonPath));
2409 BLI_cleanup_file(NULL, gp_GamePythonPath); /* not absolutely needed but makes resolving path problems less confusing later */
2411 if (gp_GamePythonPathOrig[0] == '\0')
2412 BLI_strncpy(gp_GamePythonPathOrig, path, sizeof(gp_GamePythonPathOrig));
2415 // we need this so while blender is open (not blenderplayer)
2416 // loading new blendfiles will reset this on starting the
2417 // engine but loading blend files within the BGE wont overwrite gp_GamePythonPathOrig
2418 void resetGamePythonPath()
2420 gp_GamePythonPathOrig[0] = '\0';
2423 #endif // DISABLE_PYTHON