summaryrefslogtreecommitdiff
path: root/Runtime/Serialize/TransferFunctions/YAMLSerializeTraits.cpp
blob: 4dfffb8516ca5faa804dd6a17c01541310abc07b (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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include "UnityPrefix.h"
#include "TransferNameConversions.h"
#include "YAMLRead.h"
#include "YAMLWrite.h"
#include "Runtime/BaseClasses/BaseObject.h"
#include "Editor/Src/GUIDPersistentManager.h"
#include "Runtime/Serialize/SerializedFile.h"
/*
@TODO:

- Meta file for texture importer has additional unnecessary settings: 
 TextureImporter:
	fileIDToRecycleName: {}

- Add line offsets to SerializedFile ObjectInfo, so we can have proper line numbers in YAML errors.

*/
 
// Text transfer of Unity References:
// If NeedsInstanceIDRemapping() is false or for null references:
// {instanceID: id}
// For local objects in same file:
// {fileID: id}
// For objects from other file with GUID:
// {fileID: id, guid: g, type: t}

template<class T>
void TransferYAMLPtr (T& data, YAMLRead& transfer)
{
	SInt32 instanceID = 0;
	if (!transfer.NeedsInstanceIDRemapping())
	{
		transfer.Transfer (instanceID, "instanceID");
		data.SetInstanceID (instanceID);	
	}
	else
	{
		bool allowLocalIdentifier = (transfer.GetFlags () & kYamlGlobalPPtrReference) == 0;

		LocalIdentifierInFileType fileID = 0;
		TRANSFER (fileID);
		
		if (transfer.HasNode("guid"))
		{
			FileIdentifier id;
			transfer.Transfer (id.guid, "guid");
			transfer.Transfer (id.type, "type");
			
			id.Fix_3_5_BackwardsCompatibility ();
			PersistentManager& pm = GetPersistentManager();
			SInt32 globalIndex = pm.InsertFileIdentifierInternal(id, true);
			SerializedObjectIdentifier identifier (globalIndex, fileID);

			#if SUPPORT_INSTANCE_ID_REMAP_ON_LOAD
			pm.ApplyInstanceIDRemap (identifier);
			#endif
			
			instanceID = pm.SerializedObjectIdentifierToInstanceID (identifier);
		}
		else if (allowLocalIdentifier)
		{
			// local fileID
			LocalSerializedObjectIdentifier identifier;
			identifier.localIdentifierInFile = fileID;
			identifier.localSerializedFileIndex = 0;
			LocalSerializedObjectIdentifierToInstanceID (identifier, instanceID);	
		}
		
		data.SetInstanceID (instanceID);
	}
}

template<class T>
void TransferYAMLPtr (T& data, YAMLWrite& transfer)
{
	transfer.AddMetaFlag(kTransferUsingFlowMappingStyle);
	SInt32 instanceID = data.GetInstanceID();
	if (!transfer.NeedsInstanceIDRemapping())
		transfer.Transfer (instanceID, "instanceID");
	else
	{
		// By default we allow writing self references that exclude guid & type.
		// This way references inside of the file will never be lost even if the guid of the file changes
		bool allowLocalIdentifier = (transfer.GetFlags () & kYamlGlobalPPtrReference) == 0;
		if (allowLocalIdentifier)
		{
			LocalSerializedObjectIdentifier localIdentifier;
			InstanceIDToLocalSerializedObjectIdentifier (instanceID, localIdentifier);
			if (localIdentifier.localSerializedFileIndex == 0)
			{	
				transfer.Transfer (localIdentifier.localIdentifierInFile, "fileID");
				return;
			}
		}
		
		GUIDPersistentManager& pm = GetGUIDPersistentManager();
		pm.Lock();
		SerializedObjectIdentifier identifier;
		if (pm.InstanceIDToSerializedObjectIdentifier(instanceID, identifier))
		{
			FileIdentifier id = pm.PathIDToFileIdentifierInternal(identifier.serializedFileIndex);
			transfer.Transfer (identifier.localIdentifierInFile, "fileID");
			transfer.Transfer (id.guid, "guid");
			transfer.Transfer (id.type, "type");
		}
		else
		{
			instanceID = 0;
			transfer.Transfer (instanceID, "instanceID");
		}
		pm.Unlock();
	}
}

template<>
void TransferYAMLPPtr (PPtr<Object> &data, YAMLRead& transfer) { TransferYAMLPtr (data, transfer); }
template<>
void TransferYAMLPPtr (PPtr<Object> &data, YAMLWrite& transfer) { TransferYAMLPtr (data, transfer); }
template<>
void TransferYAMLPPtr (ImmediatePtr<Object> &data, YAMLRead& transfer) { TransferYAMLPtr (data, transfer); }
template<>
void TransferYAMLPPtr (ImmediatePtr<Object> &data, YAMLWrite& transfer) { TransferYAMLPtr (data, transfer); }


template<>
void YAMLSerializeTraits<UnityGUID>::Transfer (UnityGUID& data, YAMLRead& transfer)
{
	std::string str;
	transfer.TransferStringData(str);
	data = StringToGUID(str);
}

template<>
void YAMLSerializeTraits<UnityGUID>::Transfer (UnityGUID& data, YAMLWrite& transfer)
{
	std::string str = GUIDToString(data);
	transfer.TransferStringData(str);
}