summaryrefslogtreecommitdiff
path: root/Runtime/Serialize/AwakeFromLoadQueue.h
blob: cc8fbe201797a8c28666b198f1af69309bee68b7 (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
#ifndef AWAKE_FROM_LOAD_QUEUE_H
#define AWAKE_FROM_LOAD_QUEUE_H

#include "Runtime/BaseClasses/BaseObject.h"
#include "Runtime/Utilities/dynamic_array.h"
class TypeTree;


// Rigidbodies must run before Colliders
// Animators must come after all other components because they bind properties (eg. SkinnedMeshRenderer needs to be fully initialized to bind blendshapes)
// Terrains depend on prefabs for trees and textures to be fully prepared.
// MonoBehaviours always come last since they can call anything on any component or asset.

enum { kManagersQueue = 0, kAssetQueue, kRigidbodyQueue, kGameObjectAndComponentQueue, kAnimatorQueue, kTerrainsQueue, kMonoBehaviourQueue, kMaxQueues };

class AwakeFromLoadQueue
{
public:
	
	struct Item
	{
		Object*           registerObjectPtr;
		
		PPtr<Object>      objectPPtr;
		ClassIDType       classID;
		
#if UNITY_EDITOR
		TypeTree*         oldType;
		bool              safeBinaryLoaded;
		AwakeFromLoadMode awakeModeOverride; 
#endif
	};
	
	AwakeFromLoadQueue (MemLabelRef label);
	
	typedef dynamic_array<Item> ItemArray;
	
	typedef void SafeBinaryReadCallbackFunction (Object& object, const TypeTree& oldTypeTree);
	
	bool IsInQueue(Object& target);

	void Reserve (unsigned size);
	void Add (Object& target, TypeTree* oldType = NULL, bool safeBinaryLoaded = false, AwakeFromLoadMode awakeOverride = kDefaultAwakeFromLoadInvalid);
	
	static void PersistentManagerAwakeSingleObject (Object& o, TypeTree* oldType, AwakeFromLoadMode awakeMode, bool safeBinaryLoaded, SafeBinaryReadCallbackFunction* safeBinaryCallback);
	
	void PersistentManagerAwakeFromLoad (AwakeFromLoadMode mode, SafeBinaryReadCallbackFunction* safeBinaryCallback);
	void PersistentManagerAwakeFromLoad (int queueIndex, AwakeFromLoadMode mode, SafeBinaryReadCallbackFunction* safeBinaryCallback);

	void ClearQueue (int queueIndex);
	void Clear ();

	void AwakeFromLoad (AwakeFromLoadMode mode);
	void CheckConsistency ();
	
	void RegisterObjectInstanceIDs ();
	
	#if UNITY_EDITOR
	void PatchPrefabBackwardsCompatibility ();
	void InsertAwakeFromLoadQueue (AwakeFromLoadQueue& awakeFromLoadQueue, AwakeFromLoadMode awakeOverride);
	#endif
	
	void ExtractAllObjects (dynamic_array<PPtr<Object> >& outObjects);
	
	ItemArray& GetItemArray (int queueIndex) { return m_ItemArrays[queueIndex]; }

	static bool SortBehaviourByExecutionOrderAndInstanceID (int lhs, int rhs);

private:
	int DetermineQueueIndex(ClassIDType classID);

	static void InvokeAwakeFromLoad (Item* objects, unsigned size, AwakeFromLoadMode mode);
	static void InvokeCheckConsistency (Item* objects, unsigned size);
	static void InvokePersistentManagerAwake (Item* objects, unsigned size, AwakeFromLoadMode awakeMode, SafeBinaryReadCallbackFunction* safeBinaryCallback);
	static void RegisterObjectInstanceIDsInternal (Item* objects, unsigned size);
	
	void InsertAwakeFromLoadQueue (dynamic_array<Item>& src, dynamic_array<Item>& dst, AwakeFromLoadMode awakeOverride);

	
	ItemArray m_ItemArrays[kMaxQueues];
};

#endif