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
|