summaryrefslogtreecommitdiff
path: root/Runtime/Modules/ModuleRegistration.cpp
blob: 960ae9602ff9810864e076ef55201c20d3f3dcdc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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();
}