1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
5 #include <CrySchematyc2/Env/IEnvRegistry.h>
6 #include <CrySchematyc2/Script/IScriptFile.h>
8 #include "Script/ScriptUserDocumentation.h"
9 #include "Script/ScriptVariableDeclaration.h"
10 #include "Script/Elements/ScriptAbstractInterface.h"
11 #include "Script/Elements/ScriptAbstractInterfaceFunction.h"
12 #include "Script/Elements/ScriptAbstractInterfaceImplementation.h"
13 #include "Script/Elements/ScriptAbstractInterfaceTask.h"
14 #include "Script/Elements/ScriptActionInstance.h"
15 #include "Script/Elements/ScriptClass.h"
16 #include "Script/Elements/ScriptClassBase.h"
17 #include "Script/Elements/ScriptComponentInstance.h"
18 #include "Script/Elements/ScriptContainer.h"
19 #include "Script/Elements/ScriptEnumeration.h"
20 #include "Script/Elements/ScriptGroup.h"
21 #include "Script/Elements/ScriptInclude.h"
22 #include "Script/Elements/ScriptProperty.h"
23 #include "Script/Elements/ScriptSignal.h"
24 #include "Script/Elements/ScriptState.h"
25 #include "Script/Elements/ScriptStateMachine.h"
26 #include "Script/Elements/ScriptStructure.h"
27 #include "Script/Elements/ScriptTimer.h"
28 #include "Script/Elements/ScriptVariable.h"
34 DECLARE_SHARED_POINTERS(IScriptElement
)
36 class CScriptFile
: public IScriptFile
40 enum class EElementOrigin
46 typedef std::unordered_map
<SGUID
, IScriptElementPtr
> Elements
;
47 typedef std::multimap
<SGUID
, IScriptElement
*> ElementsScopeGuidMap
;
48 typedef std::map
<string
, ElementsScopeGuidMap
> ElementsToSave
;
52 SNewElement(const IScriptElementPtr
& _pElement
, const XmlNodeRef
& _xml
);
54 IScriptElementPtr pElement
;
58 typedef std::vector
<SNewElement
> NewElements
;
62 CScriptFile(const char* szFileName
, const SGUID
& guid
, EScriptFileFlags flags
);
65 virtual const char* GetFileName() const override
;
66 virtual SGUID
GetGUID() const override
;
67 virtual void SetFlags(EScriptFileFlags flags
) override
;
68 virtual EScriptFileFlags
GetFlags() const override
;
69 virtual IScriptInclude
* AddInclude(const SGUID
& scopeGUID
, const char* szFileName
, const SGUID
& refGUID
) override
;
70 virtual IScriptInclude
* GetInclude(const SGUID
& guid
) override
;
71 virtual const IScriptInclude
* GetInclude(const SGUID
& guid
) const override
;
72 virtual EVisitStatus
VisitIncludes(const ScriptIncludeVisitor
& visitor
) override
;
73 virtual EVisitStatus
VisitIncludes(const ScriptIncludeVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
74 virtual EVisitStatus
VisitIncludes(const ScriptIncludeConstVisitor
& visitor
) const override
;
75 virtual EVisitStatus
VisitIncludes(const ScriptIncludeConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
76 virtual IScriptGroup
* AddGroup(const SGUID
& scopeGUID
, const char* szName
) override
;
77 virtual IScriptGroup
* GetGroup(const SGUID
& guid
) override
;
78 virtual const IScriptGroup
* GetGroup(const SGUID
& guid
) const override
;
79 virtual EVisitStatus
VisitGroups(const ScriptGroupVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
80 virtual EVisitStatus
VisitGroups(const ScriptGroupConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
81 virtual IScriptEnumeration
* AddEnumeration(const SGUID
& scopeGUID
, const char* szName
) override
;
82 virtual IScriptEnumeration
* GetEnumeration(const SGUID
& guid
) override
;
83 virtual const IScriptEnumeration
* GetEnumeration(const SGUID
& guid
) const override
;
84 virtual EVisitStatus
VisitEnumerations(const ScriptEnumerationVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
85 virtual EVisitStatus
VisitEnumerations(const ScriptEnumerationConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
86 virtual IScriptStructure
* AddStructure(const SGUID
& scopeGUID
, const char* szName
) override
;
87 virtual IScriptStructure
* GetStructure(const SGUID
& guid
) override
;
88 virtual const IScriptStructure
* GetStructure(const SGUID
& guid
) const override
;
89 virtual EVisitStatus
VisitStructures(const ScriptStructureVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
90 virtual EVisitStatus
VisitStructures(const ScriptStructureConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
91 virtual IScriptSignal
* AddSignal(const SGUID
& scopeGUID
, const char* szName
) override
;
92 virtual IScriptSignal
* GetSignal(const SGUID
& guid
) override
;
93 virtual const IScriptSignal
* GetSignal(const SGUID
& guid
) const override
;
94 virtual EVisitStatus
VisitSignals(const ScriptSignalVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
95 virtual EVisitStatus
VisitSignals(const ScriptSignalConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
96 virtual IScriptAbstractInterface
* AddAbstractInterface(const SGUID
& scopeGUID
, const char* szName
) override
;
97 virtual IScriptAbstractInterface
* GetAbstractInterface(const SGUID
& guid
) override
;
98 virtual const IScriptAbstractInterface
* GetAbstractInterface(const SGUID
& guid
) const override
;
99 virtual EVisitStatus
VisitAbstractInterfaces(const ScriptAbstractInterfaceVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
100 virtual EVisitStatus
VisitAbstractInterfaces(const ScriptAbstractInterfaceConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
101 virtual IScriptAbstractInterfaceFunction
* AddAbstractInterfaceFunction(const SGUID
& scopeGUID
, const char* szName
) override
;
102 virtual IScriptAbstractInterfaceFunction
* GetAbstractInterfaceFunction(const SGUID
& guid
) override
;
103 virtual const IScriptAbstractInterfaceFunction
* GetAbstractInterfaceFunction(const SGUID
& guid
) const override
;
104 virtual EVisitStatus
VisitAbstractInterfaceFunctions(const ScriptAbstractInterfaceFunctionVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
105 virtual EVisitStatus
VisitAbstractInterfaceFunctions(const ScriptAbstractInterfaceFunctionConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
106 virtual IScriptAbstractInterfaceTask
* AddAbstractInterfaceTask(const SGUID
& scopeGUID
, const char* szName
) override
;
107 virtual IScriptAbstractInterfaceTask
* GetAbstractInterfaceTask(const SGUID
& guid
) override
;
108 virtual const IScriptAbstractInterfaceTask
* GetAbstractInterfaceTask(const SGUID
& guid
) const override
;
109 virtual EVisitStatus
VisitAbstractInterfaceTasks(const ScriptAbstractInterfaceTaskVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
110 virtual EVisitStatus
VisitAbstractInterfaceTasks(const ScriptAbstractInterfaceTaskConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
111 virtual IScriptClass
* AddClass(const SGUID
& scopeGUID
, const char* szName
, const SGUID
& foundationGUID
) override
;
112 virtual IScriptClass
* GetClass(const SGUID
& guid
) override
;
113 virtual const IScriptClass
* GetClass(const SGUID
& guid
) const override
;
114 virtual EVisitStatus
VisitClasses(const ScriptClassVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
115 virtual EVisitStatus
VisitClasses(const ScriptClassConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
116 virtual IScriptClassBase
* AddClassBase(const SGUID
& scopeGUID
, const SGUID
& refGUID
) override
;
117 virtual IScriptClassBase
* GetClassBase(const SGUID
& guid
) override
;
118 virtual const IScriptClassBase
* GetClassBase(const SGUID
& guid
) const override
;
119 virtual EVisitStatus
VisitClassBases(const ScriptClassBaseVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
120 virtual EVisitStatus
VisitClassBases(const ScriptClassBaseConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
121 virtual IScriptStateMachine
* AddStateMachine(const SGUID
& scopeGUID
, const char* szName
, EStateMachineLifetime lifetime
, const SGUID
& contextGUID
, const SGUID
& partnerGUID
) override
;
122 virtual IScriptStateMachine
* GetStateMachine(const SGUID
& guid
) override
;
123 virtual const IScriptStateMachine
* GetStateMachine(const SGUID
& guid
) const override
;
124 virtual EVisitStatus
VisitStateMachines(const ScriptStateMachineVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
125 virtual EVisitStatus
VisitStateMachines(const ScriptStateMachineConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
126 virtual IScriptState
* AddState(const SGUID
& scopeGUID
, const char* szName
, const SGUID
& partnerGUID
) override
;
127 virtual IScriptState
* GetState(const SGUID
& guid
) override
;
128 virtual const IScriptState
* GetState(const SGUID
& guid
) const override
;
129 virtual EVisitStatus
VisitStates(const ScriptStateVisitor
& visitor
) override
;
130 virtual EVisitStatus
VisitStates(const ScriptStateVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
131 virtual EVisitStatus
VisitStates(const ScriptStateConstVisitor
& visitor
) const override
;
132 virtual EVisitStatus
VisitStates(const ScriptStateConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
133 virtual IScriptVariable
* AddVariable(const SGUID
& scopeGUID
, const char* szName
, const CAggregateTypeId
& typeId
) override
;
134 virtual IScriptVariable
* GetVariable(const SGUID
& guid
) override
;
135 virtual const IScriptVariable
* GetVariable(const SGUID
& guid
) const override
;
136 virtual EVisitStatus
VisitVariables(const ScriptVariableVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
137 virtual EVisitStatus
VisitVariables(const ScriptVariableConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
138 virtual IScriptProperty
* AddProperty(const SGUID
& scopeGUID
, const char* szName
, const SGUID
& refGUID
, const CAggregateTypeId
& typeId
) override
;
139 virtual IScriptProperty
* GetProperty(const SGUID
& guid
) override
;
140 virtual const IScriptProperty
* GetProperty(const SGUID
& guid
) const override
;
141 virtual EVisitStatus
VisitProperties(const ScriptPropertyVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
142 virtual EVisitStatus
VisitProperties(const ScriptPropertyConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
143 virtual IScriptContainer
* AddContainer(const SGUID
& scopeGUID
, const char* szName
, const SGUID
& typeGUID
) override
;
144 virtual IScriptContainer
* GetContainer(const SGUID
& guid
) override
;
145 virtual const IScriptContainer
* GetContainer(const SGUID
& guid
) const override
;
146 virtual EVisitStatus
VisitContainers(const ScriptContainerVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
147 virtual EVisitStatus
VisitContainers(const ScriptContainerConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
148 virtual IScriptTimer
* AddTimer(const SGUID
& scopeGUID
, const char* szName
) override
;
149 virtual IScriptTimer
* GetTimer(const SGUID
& guid
) override
;
150 virtual const IScriptTimer
* GetTimer(const SGUID
& guid
) const override
;
151 virtual EVisitStatus
VisitTimers(const ScriptTimerVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
152 virtual EVisitStatus
VisitTimers(const ScriptTimerConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
153 virtual IScriptAbstractInterfaceImplementation
* AddAbstractInterfaceImplementation(const SGUID
& scopeGUID
, EDomain domain
, const SGUID
& refGUID
) override
;
154 virtual IScriptAbstractInterfaceImplementation
* GetAbstractInterfaceImplementation(const SGUID
& guid
) override
;
155 virtual const IScriptAbstractInterfaceImplementation
* GetAbstractInterfaceImplementation(const SGUID
& guid
) const override
;
156 virtual EVisitStatus
VisitAbstractInterfaceImplementations(const ScriptAbstractInterfaceImplementationVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
157 virtual EVisitStatus
VisitAbstractInterfaceImplementations(const ScriptAbstractInterfaceImplementationConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
158 virtual IScriptComponentInstance
* AddComponentInstance(const SGUID
& scopeGUID
, const char* szName
, const SGUID
& componentGUID
, EScriptComponentInstanceFlags flags
) override
;
159 virtual IScriptComponentInstance
* GetComponentInstance(const SGUID
& guid
) override
;
160 virtual const IScriptComponentInstance
* GetComponentInstance(const SGUID
& guid
) const override
;
161 virtual EVisitStatus
VisitComponentInstances(const ScriptComponentInstanceVisitor
& visitor
) override
;
162 virtual EVisitStatus
VisitComponentInstances(const ScriptComponentInstanceVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
163 virtual EVisitStatus
VisitComponentInstances(const ScriptComponentInstanceConstVisitor
& visitor
) const override
;
164 virtual EVisitStatus
VisitComponentInstances(const ScriptComponentInstanceConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
165 virtual IScriptActionInstance
* AddActionInstance(const SGUID
& scopeGUID
, const char* szName
, const SGUID
& actionGUID
, const SGUID
& componentInstanceGUID
) override
;
166 virtual IScriptActionInstance
* GetActionInstance(const SGUID
& guid
) override
;
167 virtual const IScriptActionInstance
* GetActionInstance(const SGUID
& guid
) const override
;
168 virtual EVisitStatus
VisitActionInstances(const ScriptActionInstanceVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
169 virtual EVisitStatus
VisitActionInstances(const ScriptActionInstanceConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
170 virtual IDocGraph
* AddGraph(const SScriptGraphParams
& params
) override
;
171 virtual IDocGraph
* GetGraph(const SGUID
& guid
) override
;
172 virtual const IDocGraph
* GetGraph(const SGUID
& guid
) const override
;
173 virtual EVisitStatus
VisitGraphs(const DocGraphVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
174 virtual EVisitStatus
VisitGraphs(const DocGraphConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
175 virtual void RemoveElement(const SGUID
& guid
, bool clearScope
) override
;
176 virtual IScriptElement
* GetElement(const SGUID
& guid
) override
;
177 virtual const IScriptElement
* GetElement(const SGUID
& guid
) const override
;
178 virtual IScriptElement
* GetElement(const SGUID
& guid
, EScriptElementType elementType
) override
;
179 virtual const IScriptElement
* GetElement(const SGUID
& guid
, EScriptElementType elementType
) const override
;
180 virtual EVisitStatus
VisitElements(const ScriptElementVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) override
;
181 virtual EVisitStatus
VisitElements(const ScriptElementConstVisitor
& visitor
, const SGUID
& scopeGUID
, bool bRecurseHierarchy
) const override
;
182 virtual bool IsElementNameUnique(const SGUID
& scopeGUID
, const char* szName
) const override
; // #SchematycTODO : Move to separate utils class!!!
183 virtual XmlNodeRef
CopyElementsToXml(const SGUID
& guid
, bool bRecurseHierarchy
) const override
;
184 virtual void PasteElementsFromXml(const SGUID
& scopeGUID
, const XmlNodeRef
& xml
) override
;
185 virtual void Load() override
;
186 virtual void Save() override
;
187 virtual void Refresh(const SScriptRefreshParams
& params
) override
;
188 virtual bool GetClipboardInfo(const XmlNodeRef
& xml
, SScriptElementClipboardInfo
& clipboardInfo
) const override
; // #SchematycTODO : Move to separate utils class!!!
193 void AttachElement(IScriptElement
& element
, const SGUID
& scopeGUID
);
194 template <typename TYPE
> TYPE
* GetElement(EScriptElementType type
, const SGUID
& guid
);
195 template <typename TYPE
> const TYPE
* GetElement(EScriptElementType type
, const SGUID
& guid
) const;
196 EVisitStatus
VisitElements(const ScriptElementVisitor
& visitor
, IScriptElement
& parentElement
, bool bRecurseHierarchy
);
197 template <typename TYPE
> EVisitStatus
VisitElements(EScriptElementType type
, const TemplateUtils::CDelegate
<EVisitStatus (TYPE
&)>& visitor
);
198 template <typename TYPE
> EVisitStatus
VisitElements(EScriptElementType type
, const TemplateUtils::CDelegate
<EVisitStatus (TYPE
&)>& visitor
, IScriptElement
& parentElement
, bool bRecurseHierarchy
);
199 EVisitStatus
VisitElements(const ScriptElementConstVisitor
& visitor
, const IScriptElement
& parentElement
, bool bRecurseHierarchy
) const;
200 template <typename TYPE
> EVisitStatus
VisitElements(EScriptElementType type
, const TemplateUtils::CDelegate
<EVisitStatus (const TYPE
&)>& visitor
) const;
201 template <typename TYPE
> EVisitStatus
VisitElements(EScriptElementType type
, const TemplateUtils::CDelegate
<EVisitStatus (const TYPE
&)>& visitor
, const IScriptElement
& parentElement
, bool bRecurseHierarchy
) const;
202 void CopyElementsToXmlRecursive(const IScriptElement
& element
, const XmlNodeRef
& xmlElements
, bool bRecurseHierarchy
) const;
203 void CreateElementsFromXml(const SGUID
& scopeGUID
, const XmlNodeRef
& xml
, EElementOrigin origin
);
204 void GatherElementsToSave(EScriptElementType type
, ElementsToSave
& elementsToSave
);
205 XmlNodeRef
SaveElements(EScriptElementType type
, const char* szTag
);
206 XmlNodeRef
SaveGraphs();
208 void MakeElementNameUnique(const SGUID
& scopeGUID
, stack_string
& name
) const; // #SchematycTODO : Move to separate utils class!!!
209 const char* GetElementTypeName(EScriptElementType elementType
) const; // #SchematycTODO : Move to separate utils class!!!
210 EScriptElementType
GetElementType(const char* szElementTypeName
) const; // #SchematycTODO : Move to separate utils class!!!
211 void ClearScope(const SGUID
& scopeGUID
);
215 EScriptFileFlags m_flags
;
217 std::unique_ptr
<CScriptRoot
> m_pRoot
;
220 DECLARE_SHARED_POINTERS(CScriptFile
)