summaryrefslogtreecommitdiff
path: root/Runtime/BaseClasses/EditorExtension.cpp
blob: a55c92b90e6112fa8caf37bd6f010b4838b1ea95 (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
#include "UnityPrefix.h"
#include "EditorExtension.h"

#if !GAMERELEASE

#include "Editor/Src/EditorExtensionImpl.h"
#include "Runtime/Serialize/TransferFunctions/SerializeTransfer.h"
#include "Runtime/Serialize/TransferUtility.h"
#include "Runtime/Serialize/SerializationMetaFlags.h"
#include "Runtime/Utilities/dynamic_bitset.h"
#include "Editor/Src/Prefabs/Prefab.h"
#include "Editor/Src/Prefabs/PrefabBackwardsCompatibility.h"

EditorExtension::EditorExtension (MemLabelId label, ObjectCreationMode mode)
:	Super(label, mode)
{
}

EditorExtension::~EditorExtension ()
{
	Assert(m_DeprecatedExtensionPtr.GetInstanceID() == 0);
}

bool EditorExtension::IsPrefabParent () const
{
	Prefab* prefab = m_Prefab;
	return prefab != NULL && prefab->IsPrefabParent();
}

template<class TransferFunction>
void EditorExtension::Transfer (TransferFunction& transfer)
{
	Super::Transfer (transfer);
	if (!transfer.IsSerializingForGameRelease ())
	{
		if (SerializePrefabIgnoreProperties(transfer))
		{
			transfer.Transfer (m_PrefabParentObject, "m_PrefabParentObject", kHideInEditorMask | kIgnoreWithInspectorUndoMask);
			transfer.Transfer (m_Prefab, "m_PrefabInternal", kHideInEditorMask | kIgnoreWithInspectorUndoMask);
		}
		
		if (transfer.IsReadingBackwardsCompatible())
			transfer.Transfer (m_DeprecatedExtensionPtr, "m_ExtensionPtr", kHideInEditorMask | kIgnoreWithInspectorUndoMask);
	}
}

PPtr<EditorExtensionImpl> GetDeprecatedExtensionPtrIfExists (const Object& o)
{
	EditorExtension* extension = dynamic_pptr_cast<EditorExtension*> (&o);
	if (extension)
		return extension->m_DeprecatedExtensionPtr;
	else
		return NULL;
}

void EditorExtension::PatchPrefabBackwardsCompatibility ()
{
	if (m_DeprecatedExtensionPtr.IsValid ())
	{
		m_Prefab = m_DeprecatedExtensionPtr->m_DataTemplate;
		if (m_DeprecatedExtensionPtr->m_TemplateFather.IsValid())
			m_PrefabParentObject = m_DeprecatedExtensionPtr->m_TemplateFather;
		
		if (m_Prefab.IsValid() && m_PrefabParentObject.IsValid() && m_DeprecatedExtensionPtr->m_Object == PPtr<EditorExtension> (this))
			ReadOldPrefabFormat (*m_Prefab, *this, *m_PrefabParentObject, *m_DeprecatedExtensionPtr);
		
		///@TODO: DESTROY!!!
		/// DestroyObject(m_DeprecatedExtensionPtr)
	}
	m_DeprecatedExtensionPtr = NULL;
	
}


void EditorExtension::AwakeFromLoad (AwakeFromLoadMode mode)
{
	Super::AwakeFromLoad(mode);
	PatchPrefabBackwardsCompatibility ();
}

IMPLEMENT_OBJECT_SERIALIZE (EditorExtension)
IMPLEMENT_CLASS (EditorExtension)
INSTANTIATE_TEMPLATE_TRANSFER (EditorExtension)

#else

IMPLEMENT_CLASS (EditorExtension)

EditorExtension::~EditorExtension ()
{

}

#endif