summaryrefslogtreecommitdiff
path: root/Runtime/Modules/ModuleRegistration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Runtime/Modules/ModuleRegistration.cpp')
-rw-r--r--Runtime/Modules/ModuleRegistration.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/Runtime/Modules/ModuleRegistration.cpp b/Runtime/Modules/ModuleRegistration.cpp
new file mode 100644
index 0000000..960ae96
--- /dev/null
+++ b/Runtime/Modules/ModuleRegistration.cpp
@@ -0,0 +1,93 @@
+#include "UnityPrefix.h"
+#include "ModuleRegistration.h"
+#include "LoadDylib.h"
+#include "RegisterStaticallyLinkedModules.h"
+#include "Runtime/Utilities/FileUtilities.h"
+#include "Runtime/Utilities/PathNameUtility.h"
+
+#if UNITY_WINRT
+#include "PlatformDependent/MetroPlayer/MetroUtils.h"
+#endif
+
+enum { kMaxModuleCount = 10 };
+
+static int gAvailableModuleCount = 0;
+static ModuleRegistrationInfo gModuleRegistrationInfos[kMaxModuleCount];
+
+void RegisterAllAvailableModuleClasses (ClassRegistrationContext& context)
+{
+ RegisterAvailableModules ();
+
+ for(int i=0;i<gAvailableModuleCount;i++)
+ {
+ if (gModuleRegistrationInfos[i].registerClassesCallback != NULL)
+ gModuleRegistrationInfos[i].registerClassesCallback (context);
+ }
+}
+
+void RegisterAllAvailableModuleICalls ()
+{
+ RegisterAvailableModules ();
+
+ for(int i=0;i<gAvailableModuleCount;i++)
+ {
+ if (gModuleRegistrationInfos[i].registerIcallsCallback != NULL)
+ gModuleRegistrationInfos[i].registerIcallsCallback ();
+ }
+}
+
+void RegisterModuleInfo(ModuleRegistrationInfo& info)
+{
+ gModuleRegistrationInfos[gAvailableModuleCount] = info;
+ gAvailableModuleCount++;
+
+ // Bump up kMaxModuleCount if we have too many modules.
+ Assert(gAvailableModuleCount < kMaxModuleCount);
+}
+
+#if !UNITY_WP8
+
+void RegisterModuleInDynamicLibrary (const char* dllName, const char* modulename)
+{
+ std::string dllFullName = dllName;
+#if WEBPLUG
+ ErrorString ("Dynamic module loading not implemented for web plug");
+#elif UNITY_OSX
+ dllFullName = AppendPathName (GetApplicationPath (), "Contents/Frameworks/MacStandalonePlayer_"+dllFullName+".dylib");
+#elif UNITY_WIN
+ dllFullName = "StandalonePlayer_"+dllFullName+".dll";
+#elif UNITY_LINUX
+ dllFullName += "LinuxStandalonePlayer_"+dllFullName+".so";
+#endif
+
+ std::string funcName("RegisterModule_");
+ funcName.append(modulename);
+ void (*registerModuleFunction)() = (void(*)())LoadAndLookupSymbol(dllFullName, funcName);
+ if (registerModuleFunction == NULL)
+ return;
+
+ registerModuleFunction();
+}
+
+#endif
+
+static void RegisterDynamicallyLinkedModules()
+{
+ //Work in progress:
+// RegisterModuleInDynamicLibrary("GfxDeviceModule_Dynamic","GfxDevice");
+// RegisterModuleInDynamicLibrary("TerrainModule_Dynamic","Terrain");
+// RegisterModuleInDynamicLibrary("NavMeshModule_Dynamic","Navigation");
+// RegisterModuleInDynamicLibrary("AnimationModule_Dynamic","Animation");
+// RegisterModuleInDynamicLibrary("Dynamics2DModule_Dynamic","Physics2D");
+// RegisterModuleInDynamicLibrary("PhysicsModule_Dynamic","Physics");
+// RegisterModuleInDynamicLibrary("PhysicsEditorModule_Dynamic","PhysicsEditor");
+}
+
+void RegisterAvailableModules ()
+{
+ if (gAvailableModuleCount != 0)
+ return;
+
+ RegisterStaticallyLinkedModules();
+ RegisterDynamicallyLinkedModules();
+}