!B (Sandbox) (CE-21795) Importing models with multisubmaterials via fbx switches...
[CRYENGINE.git] / Code / CryEngine / CrySchematyc2 / Script / Elements / ScriptClass.cpp
blob08b6718b7dfc960d9bead6080e082defaaa1dbf1
1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
3 #include "StdAfx.h"
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>
15 namespace Schematyc2
17 //////////////////////////////////////////////////////////////////////////
18 CScriptClass::CScriptClass(IScriptFile& file, const SGUID& guid, const SGUID& scopeGUID, const char* szName, const SGUID& foundationGUID)
19 : CScriptElementBase(EScriptElementType::Class, file)
20 , m_guid(guid)
21 , m_scopeGUID(scopeGUID)
22 , m_name(szName)
23 , m_foundationGUID(foundationGUID)
26 //////////////////////////////////////////////////////////////////////////
27 EAccessor CScriptClass::GetAccessor() const
29 return EAccessor::Private;
32 //////////////////////////////////////////////////////////////////////////
33 SGUID CScriptClass::GetGUID() const
35 return m_guid;
38 //////////////////////////////////////////////////////////////////////////
39 SGUID CScriptClass::GetScopeGUID() const
41 return m_scopeGUID;
44 //////////////////////////////////////////////////////////////////////////
45 bool CScriptClass::SetName(const char* szName)
47 m_name = szName;
48 return true;
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)
63 switch(params.reason)
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();
76 break;
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");
110 break;
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");
122 break;
124 case ESerializationPass::Validate:
126 Validate(archive);
127 break;
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();
167 if(m_foundationGUID)
169 IFoundationConstPtr pFoundation = gEnv->pSchematyc2->GetEnvRegistry().GetFoundation(m_foundationGUID);
170 SCHEMATYC2_SYSTEM_ASSERT(pFoundation);
171 if(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);
188 if(pFoundation)
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;
229 break;
232 if(!bComponentExists)
234 file.AddComponentInstance(m_guid, pComponentFactory->GetName(), componentGUID, EScriptComponentInstanceFlags::Foundation);
240 //////////////////////////////////////////////////////////////////////////
241 void CScriptClass::Validate(Serialization::IArchive& archive)
243 if(m_foundationGUID)
245 IFoundationConstPtr pFoundation = gEnv->pSchematyc2->GetEnvRegistry().GetFoundation(m_foundationGUID);
246 if(!pFoundation)
248 archive.error(*this, "Unable to retrieve foundation!");