Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Bolsee <benoit.bolsee@online.be>2009-11-16 02:58:56 +0300
committerBenoit Bolsee <benoit.bolsee@online.be>2009-11-16 02:58:56 +0300
commitb45ab480e07931406785c8fc877e7cee849c8998 (patch)
tree88dbf52d49d1a3c26a5f4683517cfd3d7d7adcbf /source/gameengine/Ketsji/KX_PythonInit.cpp
parent349fa813eaf413cd2f472e545e7ce2cb6b087b1c (diff)
BGE: dynamic loading patch commited. API and demo files available here: https://projects.blender.org/tracker/?func=detail&aid=19492&group_id=9&atid=127
Diffstat (limited to 'source/gameengine/Ketsji/KX_PythonInit.cpp')
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.cpp155
1 files changed, 146 insertions, 9 deletions
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index 1339200a740..ae4f3498471 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -30,9 +30,6 @@
#include "GL/glew.h"
-// directory header for py function getBlendFileList
-#include <stdlib.h>
-
#ifdef WIN32
#pragma warning (disable : 4786)
#endif //WIN32
@@ -50,6 +47,16 @@ extern "C" {
#endif
#include "KX_PythonInit.h"
+
+// directory header for py function getBlendFileList
+#ifndef WIN32
+ #include <dirent.h>
+ #include <stdlib.h>
+#else
+ #include <io.h>
+ #include "BLI_winstuff.h"
+#endif
+
//python physics binding
#include "KX_PyConstraintBinding.h"
@@ -82,6 +89,8 @@ extern "C" {
#include "InputParser.h"
#include "KX_Scene.h"
+#include "NG_NetworkScene.h" //Needed for sendMessage()
+
#include "BL_Shader.h"
#include "KX_PyMath.h"
@@ -100,12 +109,16 @@ extern "C" {
#include "BKE_global.h"
#include "BLI_blenlib.h"
#include "GPU_material.h"
+#include "MEM_guardedalloc.h"
+
+/* for converting new scenes */
+#include "KX_BlenderSceneConverter.h"
+#include "KX_MeshProxy.h" /* for creating a new library of mesh objects */
+extern "C" {
+ #include "BLO_readfile.h"
+}
+
-#ifndef WIN32
- #include <dirent.h>
-#else
- #include "BLI_winstuff.h"
-#endif
#include "NG_NetworkScene.h" //Needed for sendMessage()
static void setSandbox(TPythonSecurityLevel level);
@@ -509,10 +522,16 @@ static PyObject* gPyGetSceneList(PyObject* self)
KX_Scene* scene = scenes->at(i);
PyList_SET_ITEM(list, i, scene->GetProxy());
}
-
+
return list;
}
+static PyObject *pyPrintStats(PyObject *,PyObject *,PyObject *)
+{
+ gp_KetsjiScene->GetSceneConverter()->PrintStats();
+ Py_RETURN_NONE;
+}
+
static PyObject *pyPrintExt(PyObject *,PyObject *,PyObject *)
{
#define pprint(x) std::cout << x << std::endl;
@@ -584,6 +603,116 @@ static PyObject *pyPrintExt(PyObject *,PyObject *,PyObject *)
Py_RETURN_NONE;
}
+static PyObject *gLibLoad(PyObject*, PyObject* args)
+{
+ KX_Scene *kx_scene= gp_KetsjiScene;
+ char *path;
+ char *group;
+ char *err_str= NULL;
+
+ if (!PyArg_ParseTuple(args,"ss:LibLoad",&path, &group))
+ return NULL;
+
+ if(kx_scene->GetSceneConverter()->LinkBlendFile(path, group, kx_scene, &err_str)) {
+ Py_RETURN_TRUE;
+ }
+
+ if(err_str) {
+ PyErr_SetString(PyExc_ValueError, err_str);
+ return NULL;
+ }
+
+ Py_RETURN_FALSE;
+}
+
+static PyObject *gLibNew(PyObject*, PyObject* args)
+{
+ KX_Scene *kx_scene= gp_KetsjiScene;
+ char *path;
+ char *group;
+ char *name;
+ PyObject *names;
+ int idcode;
+
+ if (!PyArg_ParseTuple(args,"ssO!:LibNew",&path, &group, &PyList_Type, &names))
+ return NULL;
+
+ if(kx_scene->GetSceneConverter()->GetMainDynamicPath(path))
+ {
+ PyErr_SetString(PyExc_KeyError, "the name of the path given exists");
+ return NULL;
+ }
+
+ idcode= BLO_idcode_from_name(group);
+ if(idcode==0) {
+ PyErr_Format(PyExc_ValueError, "invalid group given \"%s\"", group);
+ return NULL;
+ }
+
+ Main *maggie= (Main *)MEM_callocN( sizeof(Main), "BgeMain");
+ kx_scene->GetSceneConverter()->GetMainDynamic().push_back(maggie);
+ strncpy(maggie->name, path, sizeof(maggie->name)-1);
+
+ /* Copy the object into main */
+ if(idcode==ID_ME) {
+ PyObject *ret= PyList_New(0);
+ PyObject *item;
+ for(int i= 0; i < PyList_GET_SIZE(names); i++) {
+ name= _PyUnicode_AsString(PyList_GET_ITEM(names, i));
+ if(name) {
+ RAS_MeshObject *meshobj= kx_scene->GetSceneConverter()->ConvertMeshSpecial(kx_scene, maggie, name);
+ if(meshobj) {
+ KX_MeshProxy* meshproxy = new KX_MeshProxy(meshobj);
+ item= meshproxy->NewProxy(true);
+ PyList_Append(ret, item);
+ Py_DECREF(item);
+ }
+ }
+ else {
+ PyErr_Clear(); /* wasnt a string, ignore for now */
+ }
+ }
+
+ return ret;
+ }
+ else {
+ PyErr_Format(PyExc_ValueError, "only \"Mesh\" group currently supported");
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
+
+static PyObject *gLibFree(PyObject*, PyObject* args)
+{
+ KX_Scene *kx_scene= gp_KetsjiScene;
+ char *path;
+
+ if (!PyArg_ParseTuple(args,"s:LibFree",&path))
+ return NULL;
+
+ if (kx_scene->GetSceneConverter()->FreeBlendFile(path))
+ {
+ Py_RETURN_TRUE;
+ }
+ else {
+ Py_RETURN_FALSE;
+ }
+}
+
+static PyObject *gLibList(PyObject*, PyObject* args)
+{
+ vector<Main*> &dynMaggie = gp_KetsjiScene->GetSceneConverter()->GetMainDynamic();
+ int i= 0;
+ PyObject *list= PyList_New(dynMaggie.size());
+
+ for (vector<Main*>::iterator it=dynMaggie.begin(); !(it==dynMaggie.end()); it++)
+ {
+ PyList_SET_ITEM(list, i++, PyUnicode_FromString( (*it)->name) );
+ }
+
+ return list;
+}
static struct PyMethodDef game_methods[] = {
{"expandPath", (PyCFunction)gPyExpandPath, METH_VARARGS, (const char *)gPyExpandPath_doc},
@@ -616,6 +745,14 @@ static struct PyMethodDef game_methods[] = {
{"getAverageFrameRate", (PyCFunction) gPyGetAverageFrameRate, METH_NOARGS, (const char *)"Gets the estimated average frame rate"},
{"getBlendFileList", (PyCFunction)gPyGetBlendFileList, METH_VARARGS, (const char *)"Gets a list of blend files in the same directory as the current blend file"},
{"PrintGLInfo", (PyCFunction)pyPrintExt, METH_NOARGS, (const char *)"Prints GL Extension Info"},
+ {"PrintMemInfo", (PyCFunction)pyPrintStats, METH_NOARGS, (const char *)"Print engine stastics"},
+
+ /* library functions */
+ {"LibLoad", (PyCFunction)gLibLoad, METH_VARARGS, (const char *)""},
+ {"LibNew", (PyCFunction)gLibNew, METH_VARARGS, (const char *)""},
+ {"LibFree", (PyCFunction)gLibFree, METH_VARARGS, (const char *)""},
+ {"LibList", (PyCFunction)gLibList, METH_VARARGS, (const char *)""},
+
{NULL, (PyCFunction) NULL, 0, NULL }
};