1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
4 #include "Script/Elements/ScriptClass.h"
6 #include <CrySerialization/BlackBox.h>
7 #include <CrySerialization/IArchiveHost.h>
8 #include <CrySerialization/STL.h>
9 #include <CrySchematyc2/GUIDRemapper.h>
10 #include <CrySchematyc2/Deprecated/DocUtils.h>
11 #include <CrySchematyc2/Env/IEnvRegistry.h>
12 #include <CrySchematyc2/Serialization/ISerializationContext.h>
13 #include <CrySchematyc2/Serialization/SerializationUtils.h>
17 //////////////////////////////////////////////////////////////////////////
18 CScriptClass::CScriptClass(IScriptFile
& file
, const SGUID
& guid
, const SGUID
& scopeGUID
, const char* szName
, const SGUID
& foundationGUID
)
19 : CScriptElementBase(EScriptElementType::Class
, file
)
21 , m_scopeGUID(scopeGUID
)
23 , m_foundationGUID(foundationGUID
)
26 //////////////////////////////////////////////////////////////////////////
27 EAccessor
CScriptClass::GetAccessor() const
29 return EAccessor::Private
;
32 //////////////////////////////////////////////////////////////////////////
33 SGUID
CScriptClass::GetGUID() const
38 //////////////////////////////////////////////////////////////////////////
39 SGUID
CScriptClass::GetScopeGUID() const
44 //////////////////////////////////////////////////////////////////////////
45 bool CScriptClass::SetName(const char* szName
)
51 //////////////////////////////////////////////////////////////////////////
52 const char* CScriptClass::GetName() const
54 return m_name
.c_str();
57 //////////////////////////////////////////////////////////////////////////
58 void CScriptClass::EnumerateDependencies(const ScriptDependancyEnumerator
& enumerator
) const {}
60 //////////////////////////////////////////////////////////////////////////
61 void CScriptClass::Refresh(const SScriptRefreshParams
& params
)
65 case EScriptRefreshReason::EditorAdd
:
67 RefreshFoundationProperties();
68 m_userDocumentation
.SetCurrentUserAsAuthor();
70 case EScriptRefreshReason::EditorFixUp
:
71 case EScriptRefreshReason::EditorPaste
:
72 case EScriptRefreshReason::EditorEnvModified
:
73 case EScriptRefreshReason::EditorDependencyModified
:
75 RefreshFoundationComponents();
81 //////////////////////////////////////////////////////////////////////////
82 void CScriptClass::Serialize(Serialization::IArchive
& archive
)
84 CRY_PROFILE_FUNCTION(PROFILE_LOADING_ONLY
);
86 CScriptElementBase::Serialize(archive
);
88 SerializationContext::SetValidatorLink(archive
, SValidatorLink(m_guid
)); // #SchematycTODO : Can we set this from CScriptElementBase?
89 switch(SerializationContext::GetPass(archive
))
91 case ESerializationPass::PreLoad
:
92 case ESerializationPass::Save
:
94 Serialization::SContext
fileContext(archive
, static_cast<IScriptFile
*>(&CScriptElementBase::GetFile())); // #SchematycTODO : Do we still need this?
95 Serialization::SContext
context(archive
, static_cast<IScriptClass
*>(this)); // #SchematycTODO : Do we still need this?
97 archive(m_guid
, "guid");
98 archive(m_scopeGUID
, "scope_guid");
99 archive(m_name
, "name");
100 archive(m_foundationGUID
, "foundation_guid");
101 if(archive
.isInput())
103 RefreshFoundationProperties();
105 if(m_pFoundationProperties
)
107 archive(*m_pFoundationProperties
, "foundation_properties", "Foundation Properties");
109 archive(m_userDocumentation
, "userDocumentation", "Documentation");
112 case ESerializationPass::Edit
:
114 Serialization::SContext
fileContext(archive
, static_cast<IScriptFile
*>(&CScriptElementBase::GetFile())); // #SchematycTODO : Do we still need this?
115 Serialization::SContext
context(archive
, static_cast<IScriptClass
*>(this)); // #SchematycTODO : Do we still need this?
117 if(m_pFoundationProperties
)
119 archive(*m_pFoundationProperties
, "foundation_properties", "Foundation Properties");
121 archive(m_userDocumentation
, "userDocumentation", "Documentation");
124 case ESerializationPass::Validate
:
132 //////////////////////////////////////////////////////////////////////////
133 void CScriptClass::RemapGUIDs(IGUIDRemapper
& guidRemapper
)
135 m_guid
= guidRemapper
.Remap(m_guid
);
136 m_scopeGUID
= guidRemapper
.Remap(m_scopeGUID
);
139 //////////////////////////////////////////////////////////////////////////
140 const char* CScriptClass::GetAuthor() const
142 return m_userDocumentation
.author
.c_str();
145 //////////////////////////////////////////////////////////////////////////
146 const char* CScriptClass::GetDescription() const
148 return m_userDocumentation
.description
.c_str();
151 //////////////////////////////////////////////////////////////////////////
152 SGUID
CScriptClass::GetFoundationGUID() const
154 return m_foundationGUID
;
157 //////////////////////////////////////////////////////////////////////////
158 IPropertiesConstPtr
CScriptClass::GetFoundationProperties() const
160 return m_pFoundationProperties
;
163 //////////////////////////////////////////////////////////////////////////
164 void CScriptClass::RefreshFoundationProperties()
166 m_pFoundationProperties
.reset();
169 IFoundationConstPtr pFoundation
= gEnv
->pSchematyc2
->GetEnvRegistry().GetFoundation(m_foundationGUID
);
170 SCHEMATYC2_SYSTEM_ASSERT(pFoundation
);
173 IPropertiesConstPtr pFoundationProperties
= pFoundation
->GetProperties();
174 if(pFoundationProperties
)
176 m_pFoundationProperties
= pFoundationProperties
->Clone();
182 //////////////////////////////////////////////////////////////////////////
183 void CScriptClass::RefreshFoundationComponents()
185 // #SchematycTODO : If component has 'HIDE_IN_EDITOR' flag set we don't need to serialize it!!!
186 GUIDVector requiredComponentGUIDs
;
187 IFoundationConstPtr pFoundation
= gEnv
->pSchematyc2
->GetEnvRegistry().GetFoundation(m_foundationGUID
);
190 for(size_t foundationComponentIdx
= 0, foundationComponentCount
= pFoundation
->GetComponentCount(); foundationComponentIdx
< foundationComponentCount
; ++ foundationComponentIdx
)
192 requiredComponentGUIDs
.push_back(pFoundation
->GetComponentGUID(foundationComponentIdx
));
195 IEnvRegistry
& envRegistry
= gEnv
->pSchematyc2
->GetEnvRegistry();
196 IScriptFile
& file
= CScriptElementBase::GetFile();
197 TScriptComponentInstanceConstVector componentInstances
;
198 DocUtils::CollectComponentInstances(file
, m_guid
, true, componentInstances
);
199 for(const IScriptComponentInstance
* pComponentInstance
: componentInstances
)
201 IComponentFactoryConstPtr pComponentFactory
= envRegistry
.GetComponentFactory(pComponentInstance
->GetComponentGUID());
202 SCHEMATYC2_SYSTEM_ASSERT(pComponentFactory
);
203 if(pComponentFactory
)
205 for(size_t componentDependencyIdx
= 0, componentDependencyCount
= pComponentFactory
->GetDependencyCount(); componentDependencyIdx
< componentDependencyCount
; ++ componentDependencyIdx
)
207 if(pComponentFactory
->GetDependencyType(componentDependencyIdx
) == EComponentDependencyType::Hard
)
209 requiredComponentGUIDs
.push_back(pComponentFactory
->GetDependencyGUID(componentDependencyIdx
));
214 for(size_t requiredComponentIdx
= 0, requiredComponentCount
= requiredComponentGUIDs
.size(); requiredComponentIdx
< requiredComponentCount
; ++ requiredComponentIdx
)
216 const SGUID componentGUID
= requiredComponentGUIDs
[requiredComponentIdx
];
217 IComponentFactoryConstPtr pComponentFactory
= envRegistry
.GetComponentFactory(componentGUID
);
218 SCHEMATYC2_SYSTEM_ASSERT(pComponentFactory
);
219 if(pComponentFactory
)
221 TScriptComponentInstanceConstVector componentInstances
;
222 DocUtils::CollectComponentInstances(file
, m_guid
, true, componentInstances
);
223 bool bComponentExists
= false;
224 for(const IScriptComponentInstance
* pComponentInstance
: componentInstances
)
226 if(pComponentInstance
->GetComponentGUID() == componentGUID
)
228 bComponentExists
= true;
232 if(!bComponentExists
)
234 file
.AddComponentInstance(m_guid
, pComponentFactory
->GetName(), componentGUID
, EScriptComponentInstanceFlags::Foundation
);
240 //////////////////////////////////////////////////////////////////////////
241 void CScriptClass::Validate(Serialization::IArchive
& archive
)
245 IFoundationConstPtr pFoundation
= gEnv
->pSchematyc2
->GetEnvRegistry().GetFoundation(m_foundationGUID
);
248 archive
.error(*this, "Unable to retrieve foundation!");