!B (Sandbox) (CE-21795) Importing models with multisubmaterials via fbx switches...
[CRYENGINE.git] / Code / CryEngine / CrySchematyc2 / Script / ScriptElementBase.h
blobd59062d464819e5b160834710312f4a7cc479ba0
1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
3 #pragma once
5 #include <CrySchematyc2/Script/IScriptElement.h>
6 #include <CrySchematyc2/Script/IScriptFile.h>
7 #include <CrySchematyc2/Services/ILog.h>
9 #include "Script/ScriptExtensionMap.h"
10 #include <CrySchematyc2/BasicTypes.h>
12 namespace Schematyc2
14 template <typename INTERFACE> class CScriptElementBase : public INTERFACE
16 public:
18 CScriptElementBase(EScriptElementType type, IScriptFile& file)
19 : m_type(type)
20 , m_file(file)
21 , m_flags(EScriptElementFlags::None)
22 , m_pNewFile(nullptr)
23 , m_pParent(nullptr)
24 , m_pFirstChild(nullptr)
25 , m_pLastChild(nullptr)
26 , m_pPrevSibling(nullptr)
27 , m_pNextSibling(nullptr)
30 ~CScriptElementBase()
32 if(m_pParent)
34 m_pParent->DetachChild(*this);
36 for(IScriptElement* pChild = m_pFirstChild; pChild; )
38 IScriptElement* pNextChild = pChild->GetNextSibling();
39 pChild->SetParent(nullptr);
40 pChild->SetPrevSibling(nullptr);
41 pChild->SetNextSibling(nullptr);
42 pChild = pNextChild;
46 // IScriptElement
48 virtual EScriptElementType GetElementType() const override
50 return m_type;
53 virtual IScriptFile& GetFile() override
55 return m_file;
58 virtual const IScriptFile& GetFile() const override
60 return m_file;
63 virtual EGraphExecutionFilter GetExecutionFilter() const override
65 return EGraphExecutionFilter::Always;
68 virtual void SetElementFlags(EScriptElementFlags flags) override
70 m_flags = flags;
73 virtual EScriptElementFlags GetElementFlags() const override
75 return m_flags;
78 virtual void SetNewFile(INewScriptFile* pNewFile) override
80 m_pNewFile = pNewFile;
83 virtual INewScriptFile* GetNewFile() override
85 return m_pNewFile;
88 virtual const INewScriptFile* GetNewFile() const override
90 return m_pNewFile;
93 virtual void AttachChild(IScriptElement& child) override
95 IScriptElement* pPrevParent = child.GetParent();
96 if(pPrevParent)
98 pPrevParent->DetachChild(child);
101 child.SetParent(this);
102 child.SetPrevSibling(m_pLastChild);
104 if(m_pFirstChild)
106 m_pLastChild->SetNextSibling(&child);
108 else
110 m_pFirstChild = &child;
112 m_pLastChild = &child;
115 virtual void DetachChild(IScriptElement& child) override
117 IScriptElement* pParent = child.GetParent();
118 SCHEMATYC2_SYSTEM_ASSERT(pParent == this);
119 if(pParent == this)
121 IScriptElement* pPrevSibling = child.GetPrevSibling();
122 IScriptElement* pNextSibling = child.GetNextSibling();
124 if(&child == m_pFirstChild)
126 SCHEMATYC2_SYSTEM_ASSERT(!pPrevSibling);
127 m_pFirstChild = pNextSibling;
129 else
131 SCHEMATYC2_SYSTEM_ASSERT(pPrevSibling);
132 pPrevSibling->SetNextSibling(pNextSibling);
135 if(&child == m_pLastChild)
137 SCHEMATYC2_SYSTEM_ASSERT(!pNextSibling);
138 m_pLastChild = pPrevSibling;
140 else
142 SCHEMATYC2_SYSTEM_ASSERT(pNextSibling);
143 pNextSibling->SetPrevSibling(pPrevSibling);
146 child.SetParent(nullptr);
147 child.SetPrevSibling(nullptr);
148 child.SetNextSibling(nullptr);
152 virtual void SetParent(IScriptElement* pParent) override
154 m_pParent = pParent;
157 virtual void SetPrevSibling(IScriptElement* pPrevSibling) override
159 m_pPrevSibling = pPrevSibling;
162 virtual void SetNextSibling(IScriptElement* pNextSibling) override
164 m_pNextSibling = pNextSibling;
167 virtual IScriptElement* GetParent() override
169 return m_pParent;
172 virtual const IScriptElement* GetParent() const override
174 return m_pParent;
177 virtual IScriptElement* GetFirstChild() override
179 return m_pFirstChild;
182 virtual const IScriptElement* GetFirstChild() const override
184 return m_pFirstChild;
187 virtual IScriptElement* GetLastChild() override
189 return m_pLastChild;
192 virtual const IScriptElement* GetLastChild() const override
194 return m_pLastChild;
197 virtual IScriptElement* GetPrevSibling() override
199 return m_pPrevSibling;
202 virtual const IScriptElement* GetPrevSibling() const override
204 return m_pPrevSibling;
207 virtual IScriptElement* GetNextSibling() override
209 return m_pNextSibling;
212 virtual const IScriptElement* GetNextSibling() const override
214 return m_pNextSibling;
217 virtual IScriptExtensionMap& GetExtensions() override
219 return m_extensions;
222 virtual const IScriptExtensionMap& GetExtensions() const override
224 return m_extensions;
227 virtual void Refresh(const SScriptRefreshParams& params) override
229 m_extensions.Refresh(params);
232 virtual void Serialize(Serialization::IArchive& archive) override
234 if(archive.isOutput())
236 EScriptElementType elementType = static_cast<const INTERFACE*>(this)->GetElementType();
237 archive(elementType, "elementType");
240 archive(m_extensions, "extensions");
243 virtual void RemapGUIDs(IGUIDRemapper& guidRemapper) override
245 m_extensions.RemapGUIDs(guidRemapper);
248 // ~IScriptElement
250 inline void AddExtension(const IScriptExtensionPtr& pExtension)
252 m_extensions.AddExtension(pExtension);
255 private:
257 EScriptElementType m_type;
258 IScriptFile& m_file;
259 EScriptElementFlags m_flags;
260 INewScriptFile* m_pNewFile;
261 IScriptElement* m_pParent;
262 IScriptElement* m_pFirstChild;
263 IScriptElement* m_pLastChild;
264 IScriptElement* m_pPrevSibling;
265 IScriptElement* m_pNextSibling;
266 CScriptExtensionMap m_extensions;