summaryrefslogtreecommitdiff
path: root/Runtime/BaseClasses/ManagerContext.cpp
blob: 1824a840654e071cd1773db2fcf9385e7cee094a (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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "UnityPrefix.h"
#include "ManagerContext.h"
#include "BaseObject.h"
#include "Configuration/UnityConfigure.h"

ManagerContext::ManagerContext ()
{
	for (int i=0;i<kManagerCount;i++)
		m_Managers[i] = NULL;
}

void ManagerContext::InitializeClasses ()
{
	for (int i=0;i<kManagerCount;i++)
	{
		m_ManagerClassIDs[i] = -1;
		#if DEBUGMODE		
		m_ManagerNames[i] = "Not initialized";
		#endif
	}
	
#if DEBUGMODE
	#define INIT_MANAGER_CLASS(x) Assert(m_ManagerClassIDs[k##x] == -1); m_ManagerClassIDs[k##x] = Object::StringToClassID (#x); m_ManagerNames[k##x] = #x;
#else
	#define INIT_MANAGER_CLASS(x) m_ManagerClassIDs[k##x] = Object::StringToClassID (#x); 
#endif	
	
	INIT_MANAGER_CLASS (PlayerSettings)
	INIT_MANAGER_CLASS (InputManager)
	INIT_MANAGER_CLASS (TagManager)
	INIT_MANAGER_CLASS (AudioManager)
	INIT_MANAGER_CLASS (ScriptMapper)
	INIT_MANAGER_CLASS (MonoManager)
	INIT_MANAGER_CLASS (GraphicsSettings)
	INIT_MANAGER_CLASS (TimeManager)
	INIT_MANAGER_CLASS (DelayedCallManager)
	INIT_MANAGER_CLASS (PhysicsManager)
	INIT_MANAGER_CLASS (BuildSettings)
	INIT_MANAGER_CLASS (QualitySettings)
	INIT_MANAGER_CLASS (ResourceManager)
	INIT_MANAGER_CLASS (NetworkManager)
	INIT_MANAGER_CLASS (MasterServerInterface)
	INIT_MANAGER_CLASS (NavMeshLayers)
	#if ENABLE_2D_PHYSICS
	INIT_MANAGER_CLASS (Physics2DSettings)
	#endif

	INIT_MANAGER_CLASS (SceneSettings)
	INIT_MANAGER_CLASS (RenderSettings)
	INIT_MANAGER_CLASS (HaloManager)
	INIT_MANAGER_CLASS (LightmapSettings)
	INIT_MANAGER_CLASS (NavMeshSettings)
	
#if UNITY_EDITOR
	for (int i=0;i<kManagerCount;i++)
	{
		Assert (m_ManagerClassIDs[i] != -1);
	}

	std::vector<SInt32> allDerivedClasses;
	Object::FindAllDerivedClasses(Object::StringToClassID("GameManager"), &allDerivedClasses);
	if (allDerivedClasses.size() != kManagerCount)
	{
		ErrorString("Number of GameManager classes does not match number of game managers registered.");
	}
#endif	
	
}

static ManagerContext gContext;

Object& GetManagerFromContext (int index)
{
#if DEBUGMODE

	if( index >= ManagerContext::kManagerCount )
		FatalErrorString( "GetManagerFromContext: index for managers table is out of bounds" );

	if( gContext.m_Managers[index] == NULL )
	{
		char const* managerName = gContext.m_ManagerNames[ index ];
		FatalErrorString( Format("GetManagerFromContext: pointer to object of manager '%s' is NULL (table index %d)", managerName, index) );
	}
#endif

	return *gContext.m_Managers[index];
}

void ManagerContextInitializeClasses()
{
	gContext.InitializeClasses();
}

Object* GetManagerPtrFromContext (int index)
{
	return gContext.m_Managers[index];
}

void SetManagerPtrInContext(int index, Object* ptr)
{
	gContext.m_Managers[index] = ptr;
}

const ManagerContext& GetManagerContext ()
{
	return gContext;
}