diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c index 5999040a2ab..3a46c6971cf 100644 --- a/source/blender/python/generic/bpy_internal_import.c +++ b/source/blender/python/generic/bpy_internal_import.c @@ -52,6 +52,7 @@ #include "BKE_main.h" static Main *bpy_import_main = NULL; +static ListBase bpy_import_main_list; /* 'builtins' is most likely PyEval_GetBuiltins() */ void bpy_import_init(PyObject *builtins) @@ -92,6 +93,16 @@ void bpy_import_main_set(struct Main *maggie) bpy_import_main = maggie; } +void bpy_import_main_extra_add(struct Main *maggie) +{ + BLI_addhead(&bpy_import_main_list, maggie); +} + +void bpy_import_main_extra_remove(struct Main *maggie) +{ + BLI_remlink_safe(&bpy_import_main_list, maggie); +} + /* returns a dummy filename for a textblock so we can tell what file a text block comes from */ void bpy_text_filename_get(char *fn, size_t fn_len, Text *text) { @@ -150,6 +161,18 @@ PyObject *bpy_text_import_name(const char *name, int *found) text = BLI_findstring(&maggie->text, txtname, offsetof(ID, name) + 2); + if (text) { + *found = 1; + return bpy_text_import(text); + } + + /* If we still haven't found the module try additional modules form bpy_import_main_list */ + maggie = bpy_import_main_list.first; + while (maggie && !text) { + text = BLI_findstring(&maggie->text, txtname, offsetof(ID, name) + 2); + maggie = maggie->next; + } + if (!text) return NULL; else diff --git a/source/blender/python/generic/bpy_internal_import.h b/source/blender/python/generic/bpy_internal_import.h index 8b41a575d96..980e6edca03 100644 --- a/source/blender/python/generic/bpy_internal_import.h +++ b/source/blender/python/generic/bpy_internal_import.h @@ -62,4 +62,8 @@ extern PyMethodDef bpy_reload_meth; struct Main *bpy_import_main_get(void); void bpy_import_main_set(struct Main *maggie); +/* This is used for importing text from dynamically loaded libraries in the game engine */ +void bpy_import_main_extra_add(struct Main *maggie); +void bpy_import_main_extra_remove(struct Main *maggie); + #endif /* __BPY_INTERNAL_IMPORT_H__ */ diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp index 78e5d7b32c2..3961e6554a7 100644 --- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp +++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp @@ -42,6 +42,7 @@ #include "KX_PhysicsEngineEnums.h" #include "PHY_IPhysicsEnvironment.h" #include "KX_KetsjiEngine.h" +#include "KX_PythonInit.h" // So we can handle adding new text datablocks for Python to import #include "KX_IPhysicsController.h" #include "BL_Material.h" #include "BL_ActionActuator.h" @@ -173,9 +174,9 @@ KX_BlenderSceneConverter::~KX_BlenderSceneConverter() #endif /* free any data that was dynamically loaded */ - for (vector::iterator it=m_DynamicMaggie.begin(); !(it==m_DynamicMaggie.end()); it++) { - Main *main= *it; - free_main(main); + while (m_DynamicMaggie.size() != 0) + { + FreeBlendFile(m_DynamicMaggie[0]); } m_DynamicMaggie.clear(); @@ -987,6 +988,11 @@ bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const cha load_datablocks(main_newlib, bpy_openlib, path, idcode); + if (idcode==ID_SCE) { + /* assume we want text blocks too */ + load_datablocks(main_newlib, bpy_openlib, path, ID_TXT); + } + /* now do another round of linking for Scenes so all actions are properly loaded */ if (idcode==ID_SCE && options & LIB_LOAD_LOAD_ACTIONS) { load_datablocks(main_newlib, bpy_openlib, path, ID_AC); @@ -1038,6 +1044,10 @@ bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const cha delete other; } + /* Handle any text datablocks */ + + addImportMain(main_newlib); + /* Now handle all the actions */ if (options & LIB_LOAD_LOAD_ACTIONS) { ID *action; @@ -1330,6 +1340,9 @@ bool KX_BlenderSceneConverter::FreeBlendFile(struct Main *maggie) } } + /* make sure this maggie is removed from the import list if it's there (this operation is safe if it isn't in the list) */ + removeImportMain(maggie); + free_main(maggie); return true; diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp index 28c4630c43e..2a648303c52 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.cpp +++ b/source/gameengine/Ketsji/KX_PythonInit.cpp @@ -1821,6 +1821,16 @@ static void restorePySysObjects(void) // PyObject_Print(sys_path, stderr, 0); } +void addImportMain(struct Main *maggie) +{ + bpy_import_main_extra_add(maggie); +} + +void removeImportMain(struct Main *maggie) +{ + bpy_import_main_extra_remove(maggie); +} + // Copied from bpy_interface.c static struct _inittab bge_internal_modules[]= { {(char *)"mathutils", PyInit_mathutils}, diff --git a/source/gameengine/Ketsji/KX_PythonInit.h b/source/gameengine/Ketsji/KX_PythonInit.h index d8346018b55..866681b9da7 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.h +++ b/source/gameengine/Ketsji/KX_PythonInit.h @@ -61,6 +61,9 @@ int saveGamePythonConfig( char **marshal_buffer); int loadGamePythonConfig(char *marshal_buffer, int marshal_length); #endif +void addImportMain(struct Main *maggie); +void removeImportMain(struct Main *maggie); + class KX_KetsjiEngine; class KX_Scene;