summaryrefslogtreecommitdiff
path: root/Runtime/Serialize/TransferFunctions/YAMLSerializeTraits.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Serialize/TransferFunctions/YAMLSerializeTraits.cpp
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Serialize/TransferFunctions/YAMLSerializeTraits.cpp')
-rw-r--r--Runtime/Serialize/TransferFunctions/YAMLSerializeTraits.cpp139
1 files changed, 139 insertions, 0 deletions
diff --git a/Runtime/Serialize/TransferFunctions/YAMLSerializeTraits.cpp b/Runtime/Serialize/TransferFunctions/YAMLSerializeTraits.cpp
new file mode 100644
index 0000000..4dfffb8
--- /dev/null
+++ b/Runtime/Serialize/TransferFunctions/YAMLSerializeTraits.cpp
@@ -0,0 +1,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);
+}
+