[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35682] trunk/blender/source/gameengine: BGE Dynamic Loading:
Mitchell Stokes
mogurijin at gmail.com
Tue Mar 22 03:39:08 CET 2011
Revision: 35682
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35682
Author: moguri
Date: 2011-03-22 02:39:08 +0000 (Tue, 22 Mar 2011)
Log Message:
-----------
BGE Dynamic Loading:
* Adding keyword arguments to LibLoad
- load_actions (Default: False) Ensures that all actions are loaded. Otherwise, just actions used by objects in the scene are loaded.
- verbose (Default: False) Turns on extra prints (eg SceneName: MyScene).
* Also making error reporting better for when an invalid group/idcode is given.
Modified Paths:
--------------
trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.h
trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
Modified: trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.cpp 2011-03-22 02:38:39 UTC (rev 35681)
+++ trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.cpp 2011-03-22 02:39:08 UTC (rev 35682)
@@ -932,23 +932,23 @@
return NULL;
}
-bool KX_BlenderSceneConverter::LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str)
+bool KX_BlenderSceneConverter::LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options)
{
BlendHandle *bpy_openlib = BLO_blendhandle_from_memory(data, length);
// Error checking is done in LinkBlendFile
- return LinkBlendFile(bpy_openlib, path, group, scene_merge, err_str);
+ return LinkBlendFile(bpy_openlib, path, group, scene_merge, err_str, options);
}
-bool KX_BlenderSceneConverter::LinkBlendFilePath(const char *path, char *group, KX_Scene *scene_merge, char **err_str)
+bool KX_BlenderSceneConverter::LinkBlendFilePath(const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options)
{
BlendHandle *bpy_openlib = BLO_blendhandle_from_file((char *)path, NULL);
// Error checking is done in LinkBlendFile
- return LinkBlendFile(bpy_openlib, path, group, scene_merge, err_str);
+ return LinkBlendFile(bpy_openlib, path, group, scene_merge, err_str, options);
}
-bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str)
+bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options)
{
bContext *C;
Main *main_newlib; /* stored as a dynamic 'main' until we free it */
@@ -962,6 +962,7 @@
/* only scene and mesh supported right now */
if(idcode!=ID_SCE && idcode!=ID_ME &&idcode!=ID_AC) {
snprintf(err_local, sizeof(err_local), "invalid ID type given \"%s\"\n", group);
+ *err_str= err_local;
BLO_blendhandle_close(bpy_openlib);
return false;
}
@@ -1000,6 +1001,26 @@
BLI_linklist_free(names, free); /* free linklist *and* each node's data */
BLO_library_append_end(C, main_tmp, &bpy_openlib, idcode, flag);
+
+ /* now do another round of linking for Scenes so all actions are properly loaded */
+ if (idcode==ID_SCE && options & LIB_LOAD_LOAD_ACTIONS) {
+ main_tmp = BLO_library_append_begin(C, &bpy_openlib, (char *)path);
+
+ int totnames_dummy;
+ names = BLO_blendhandle_get_datablock_names( bpy_openlib, ID_AC, &totnames_dummy);
+
+ int i=0;
+ LinkNode *n= names;
+ while(n) {
+ BLO_library_append_named_part(C, main_tmp, &bpy_openlib, (char *)n->link, ID_AC, 0);
+ n= (LinkNode *)n->next;
+ i++;
+ }
+ BLI_linklist_free(names, free); /* free linklist *and* each node's data */
+
+ BLO_library_append_end(C, main_tmp, &bpy_openlib, ID_AC, flag);
+ }
+
BLO_blendhandle_close(bpy_openlib);
CTX_free(C);
@@ -1016,6 +1037,8 @@
ID* mesh;
for(mesh= (ID *)main_newlib->mesh.first; mesh; mesh= (ID *)mesh->next ) {
+ if (options & LIB_LOAD_VERBOSE)
+ printf("MeshName: %s\n", mesh->name+2);
RAS_MeshObject *meshobj = BL_ConvertMesh((Mesh *)mesh, NULL, scene_merge, this);
scene_merge->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
}
@@ -1025,7 +1048,8 @@
ID *action;
for(action= (ID *)main_newlib->action.first; action; action= (ID *)action->next) {
- printf("ActionName: %s\n", action->name);
+ if (options & LIB_LOAD_VERBOSE)
+ printf("ActionName: %s\n", action->name+2);
scene_merge->GetLogicManager()->RegisterActionName(action->name+2, action);
}
}
@@ -1033,7 +1057,8 @@
/* Merge all new linked in scene into the existing one */
ID *scene;
for(scene= (ID *)main_newlib->scene.first; scene; scene= (ID *)scene->next ) {
- printf("SceneName: %s\n", scene->name);
+ if (options & LIB_LOAD_VERBOSE)
+ printf("SceneName: %s\n", scene->name+2);
/* merge into the base scene */
KX_Scene* other= m_ketsjiEngine->CreateScene((Scene *)scene);
@@ -1042,6 +1067,17 @@
// RemoveScene(other); // Dont run this, it frees the entire scene converter data, just delete the scene
delete other;
}
+
+ /* Now handle all the actions */
+ if (options & LIB_LOAD_LOAD_ACTIONS) {
+ ID *action;
+
+ for(action= (ID *)main_newlib->action.first; action; action= (ID *)action->next) {
+ if (options & LIB_LOAD_VERBOSE)
+ printf("ActionName: %s\n", action->name+2);
+ scene_merge->GetLogicManager()->RegisterActionName(action->name+2, action);
+ }
+ }
}
return true;
Modified: trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.h
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.h 2011-03-22 02:38:39 UTC (rev 35681)
+++ trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.h 2011-03-22 02:39:08 UTC (rev 35682)
@@ -147,9 +147,9 @@
struct Main* GetMainDynamicPath(const char *path);
vector<struct Main*> &GetMainDynamic();
- bool LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str);
- bool LinkBlendFilePath(const char *path, char *group, KX_Scene *scene_merge, char **err_str);
- bool LinkBlendFile(struct BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str);
+ bool LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options);
+ bool LinkBlendFilePath(const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options);
+ bool LinkBlendFile(struct BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options);
bool MergeScene(KX_Scene *to, KX_Scene *from);
RAS_MeshObject *ConvertMeshSpecial(KX_Scene* kx_scene, Main *maggie, const char *name);
bool FreeBlendFile(struct Main *maggie);
@@ -176,6 +176,13 @@
#endif
// /printf("\t m_ketsjiEngine->m_scenes: %d\n", m_ketsjiEngine->CurrentScenes()->size());
}
+
+ /* LibLoad Options */
+ enum
+ {
+ LIB_LOAD_LOAD_ACTIONS = 1,
+ LIB_LOAD_VERBOSE = 2,
+ };
Modified: trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp 2011-03-22 02:38:39 UTC (rev 35681)
+++ trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp 2011-03-22 02:39:08 UTC (rev 35682)
@@ -638,7 +638,7 @@
Py_RETURN_NONE;
}
-static PyObject *gLibLoad(PyObject*, PyObject* args)
+static PyObject *gLibLoad(PyObject*, PyObject* args, PyObject* kwds)
{
KX_Scene *kx_scene= gp_KetsjiScene;
char *path;
@@ -646,10 +646,22 @@
Py_buffer py_buffer;
py_buffer.buf = NULL;
char *err_str= NULL;
+
+ short options=0;
+ int load_actions=0, verbose=0;
+
+ static const char *kwlist[] = {"path", "group", "buffer", "load_actions", "verbose", NULL};
- if (!PyArg_ParseTuple(args,"ss|y*:LibLoad",&path, &group, &py_buffer))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "ss|y*ii:LibLoad", const_cast<char**>(kwlist),
+ &path, &group, &py_buffer, &load_actions, &verbose))
return NULL;
+ /* setup options */
+ if (load_actions != 0)
+ options |= KX_BlenderSceneConverter::LIB_LOAD_LOAD_ACTIONS;
+ if (verbose != 0)
+ options |= KX_BlenderSceneConverter::LIB_LOAD_VERBOSE;
+
if (!py_buffer.buf)
{
char abs_path[FILE_MAX];
@@ -657,14 +669,14 @@
BLI_strncpy(abs_path, path, sizeof(abs_path));
BLI_path_abs(abs_path, gp_GamePythonPath);
- if(kx_scene->GetSceneConverter()->LinkBlendFilePath(abs_path, group, kx_scene, &err_str)) {
+ if(kx_scene->GetSceneConverter()->LinkBlendFilePath(abs_path, group, kx_scene, &err_str, options)) {
Py_RETURN_TRUE;
}
}
else
{
- if(kx_scene->GetSceneConverter()->LinkBlendFileMemory(py_buffer.buf, py_buffer.len, path, group, kx_scene, &err_str)) {
+ if(kx_scene->GetSceneConverter()->LinkBlendFileMemory(py_buffer.buf, py_buffer.len, path, group, kx_scene, &err_str, options)) {
PyBuffer_Release(&py_buffer);
Py_RETURN_TRUE;
}
@@ -798,7 +810,7 @@
{"PrintMemInfo", (PyCFunction)pyPrintStats, METH_NOARGS, (const char *)"Print engine stastics"},
/* library functions */
- {"LibLoad", (PyCFunction)gLibLoad, METH_VARARGS, (const char *)""},
+ {"LibLoad", (PyCFunction)gLibLoad, METH_VARARGS|METH_KEYWORDS, (const char *)""},
{"LibNew", (PyCFunction)gLibNew, METH_VARARGS, (const char *)""},
{"LibFree", (PyCFunction)gLibFree, METH_VARARGS, (const char *)""},
{"LibList", (PyCFunction)gLibList, METH_VARARGS, (const char *)""},
More information about the Bf-blender-cvs
mailing list