1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
4 #include "DocLogicGraph.h"
6 #include <CrySerialization/BlackBox.h>
7 #include <CrySerialization/IArchiveHost.h>
8 #include <CrySerialization/STL.h>
9 #include <CrySchematyc2/AbstractInterfaceUtils.h>
10 #include <CrySchematyc2/IAbstractInterface.h>
11 #include <CrySchematyc2/IComponentFactory.h>
12 #include <CrySchematyc2/IDomainContext.h>
13 #include <CrySchematyc2/IFramework.h>
14 #include <CrySchematyc2/Deprecated/DocUtils.h>
15 #include <CrySchematyc2/Deprecated/IGlobalFunction.h>
16 #include <CrySchematyc2/Env/IEnvRegistry.h>
17 #include <CrySchematyc2/Serialization/ISerializationContext.h>
19 #include "DomainContext.h"
20 #include "Deprecated/DocGraphNodes/DocGraphAbstractInterfaceFunctionNode.h"
21 #include "Deprecated/DocGraphNodes/DocGraphBranchNode.h"
22 #include "Deprecated/DocGraphNodes/DocGraphContainerAddNode.h"
23 #include "Deprecated/DocGraphNodes/DocGraphContainerFindByValueNode.h"
24 #include "Deprecated/DocGraphNodes/DocGraphContainerRemoveByIndexNode.h"
25 #include "Deprecated/DocGraphNodes/DocGraphContainerRemoveByValueNode.h"
26 #include "Deprecated/DocGraphNodes/DocGraphContainerSetNode.h"
27 #include "Deprecated/DocGraphNodes/DocGraphFunctionNode.h"
28 #include "Deprecated/DocGraphNodes/DocGraphConditionNode.h"
29 #include "Deprecated/DocGraphNodes/DocGraphGetNode.h"
30 #include "Deprecated/DocGraphNodes/DocGraphNodes.h"
31 #include "Deprecated/DocGraphNodes/DocGraphReturnNode.h"
32 #include "Deprecated/DocGraphNodes/DocGraphStateNode.h"
33 #include "Deprecated/DocGraphNodes/DocGraphSendSignalNode.h"
34 #include "Deprecated/DocGraphNodes/DocGraphSequenceNode.h"
35 #include "Deprecated/DocGraphNodes/DocGraphSetNode.h"
36 #include "Deprecated/DocGraphNodes/DocGraphSwitchNode.h"
38 SERIALIZATION_ENUM_BEGIN_NESTED(Schematyc2
, EGraphExecutionFilter
, "Graph Execution Filter")
39 SERIALIZATION_ENUM(Schematyc2::EGraphExecutionFilter::Always
, "Always", "Always")
40 SERIALIZATION_ENUM(Schematyc2::EGraphExecutionFilter::DevModeOrLoggingEnabled
, "DevModeOrLoggingEnabled", "Dev Mode Or Logging Enabled")
41 SERIALIZATION_ENUM(Schematyc2::EGraphExecutionFilter::DevModeOnly
, "DevModeOnly", "Dev Mode Only")
42 SERIALIZATION_ENUM_END()
46 namespace DocLogicGraphUtils
50 inline SDocVisitor(const IScriptFile
& _file
, CDocGraphBase
& _docGraph
)
55 inline void VisitSignal(const IScriptFile
& signalFile
, const IScriptSignal
& signal
) const
57 stack_string nodeName
;
58 DocUtils::GetFullElementName(file
, signal
, nodeName
);
59 nodeName
.insert(0, "Send Signal::");
60 docGraph
.AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::SendSignal
, SGUID(), signal
.GetGUID());
63 inline void VisitAbstractInterfaceFunction(const IScriptFile
& abstractInterfaceFunctionFile
, const IScriptAbstractInterfaceFunction
& abstractInterfaceFunction
) const
65 stack_string nodeName
;
66 DocUtils::GetFullElementName(abstractInterfaceFunctionFile
, abstractInterfaceFunction
.GetGUID(), nodeName
);
67 nodeName
.insert(0, "Abstract Interface Function::");
68 docGraph
.AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::AbstractInterfaceFunction
, abstractInterfaceFunction
.GetScopeGUID(), abstractInterfaceFunction
.GetGUID());
71 const IScriptFile
& file
;
72 CDocGraphBase
& docGraph
;
75 struct SClassElementVisitor
77 inline SClassElementVisitor(const IScriptFile
& _file
, CDocGraphBase
& _docGraph
)
82 inline EVisitStatus
VisitElement(const IScriptElement
& element
) const
84 const char* szElementName
= element
.GetName();
85 switch(element
.GetElementType())
87 case EScriptElementType::Group
:
88 case EScriptElementType::Class
:
90 file
.VisitElements(ScriptElementConstVisitor::FromConstMemberFunction
<SClassElementVisitor
, &SClassElementVisitor::VisitElement
>(*this), element
.GetGUID(), false);
93 case EScriptElementType::Container
: // #SchematycTODO : Use domain context to visit containers!!!
96 stack_string nodeName
= "Container Add::";
97 nodeName
.append(szElementName
);
98 docGraph
.AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::ContainerAdd
, SGUID(), element
.GetGUID());
101 stack_string nodeName
= "Container Remove By Index::";
102 nodeName
.append(szElementName
);
103 docGraph
.AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::ContainerRemoveByIndex
, SGUID(), element
.GetGUID());
106 stack_string nodeName
= "Container Remove By Value::";
107 nodeName
.append(szElementName
);
108 docGraph
.AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::ContainerRemoveByValue
, SGUID(), element
.GetGUID());
111 stack_string nodeName
= "Container Clear::";
112 nodeName
.append(szElementName
);
113 docGraph
.AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::ContainerClear
, SGUID(), element
.GetGUID());
116 stack_string nodeName
= "Container Size::";
117 nodeName
.append(szElementName
);
118 docGraph
.AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::ContainerSize
, SGUID(), element
.GetGUID());
121 stack_string nodeName
= "Container Get::";
122 nodeName
.append(szElementName
);
123 docGraph
.AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::ContainerGet
, SGUID(), element
.GetGUID());
126 stack_string nodeName
= "Container Set::";
127 nodeName
.append(szElementName
);
128 docGraph
.AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::ContainerSet
, SGUID(), element
.GetGUID());
131 stack_string nodeName
= "Container Find By Value::";
132 nodeName
.append(szElementName
);
133 docGraph
.AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::ContainerFindByValue
, SGUID(), element
.GetGUID());
137 case EScriptElementType::Timer
: // #SchematycTODO : Use domain context to visit timers!!!
140 stack_string nodeName
= "Start Timer::";
141 nodeName
.append(szElementName
);
142 docGraph
.AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::StartTimer
, SGUID(), element
.GetGUID());
145 stack_string nodeName
= "Stop Timer::";
146 nodeName
.append(szElementName
);
147 docGraph
.AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::StopTimer
, SGUID(), element
.GetGUID());
150 stack_string nodeName
= "Reset Timer::";
151 nodeName
.append(szElementName
);
152 docGraph
.AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::ResetTimer
, SGUID(), element
.GetGUID());
157 return EVisitStatus::Continue
;
160 const IScriptFile
& file
;
161 CDocGraphBase
& docGraph
;
164 inline bool FunctionIsCondition(const IGlobalFunction
& function
)
166 return (function
.GetOutputCount() == 1) && (function
.GetOutputValue(0)->GetTypeInfo().GetTypeId() == GetAggregateTypeId
<bool>());
169 inline bool FunctionIsCondition(const IComponentMemberFunction
& function
)
171 return (function
.GetOutputCount() == 1) && (function
.GetOutputValue(0)->GetTypeInfo().GetTypeId() == GetAggregateTypeId
<bool>());
174 inline bool FunctionIsCondition(const IActionMemberFunction
& function
)
176 return (function
.GetOutputCount() == 1) && (function
.GetOutputValue(0)->GetTypeInfo().GetTypeId() == GetAggregateTypeId
<bool>());
180 //////////////////////////////////////////////////////////////////////////
181 CDocLogicGraph::CDocLogicGraph(IScriptFile
& file
, const SGUID
& guid
, const SGUID
& scopeGUID
, const char* szName
, EScriptGraphType type
, const SGUID
& contextGUID
)
182 : CDocGraphBase(file
, guid
, scopeGUID
, szName
, type
, contextGUID
)
183 , m_accessor(EAccessor::Private
)
184 , m_executionFilter(EGraphExecutionFilter::Always
)
187 //////////////////////////////////////////////////////////////////////////
188 EAccessor
CDocLogicGraph::GetAccessor() const
193 //////////////////////////////////////////////////////////////////////////
194 void CDocLogicGraph::EnumerateDependencies(const ScriptDependancyEnumerator
& enumerator
) const
196 SCHEMATYC2_SYSTEM_ASSERT(enumerator
);
199 CDocGraphBase::EnumerateDependencies(enumerator
);
201 if (CDocGraphBase::GetType() == EScriptGraphType::AbstractInterfaceFunction
)
203 if (const SGUID scopeGUID
= CDocGraphBase::GetScopeGUID())
205 // scopeGUID is AbstractInterfaceImplementation
206 enumerator(scopeGUID
);
212 //////////////////////////////////////////////////////////////////////////
213 void CDocLogicGraph::Refresh(const SScriptRefreshParams
& params
)
215 CRY_PROFILE_FUNCTION(PROFILE_LOADING_ONLY
);
217 RefreshInputsAndOutputs();
218 CDocGraphBase::Refresh(params
);
221 //////////////////////////////////////////////////////////////////////////
222 void CDocLogicGraph::Serialize(Serialization::IArchive
& archive
)
224 CRY_PROFILE_FUNCTION(PROFILE_LOADING_ONLY
);
226 switch(SerializationContext::GetPass(archive
))
228 case ESerializationPass::PreLoad
:
230 CDocGraphBase::Serialize(archive
);
231 const EScriptGraphType type
= CDocGraphBase::GetType();
232 if((type
== EScriptGraphType::Function
) || (type
== EScriptGraphType::Condition
))
234 archive(m_accessor
, "accessor", "Accessor");
235 archive(m_executionFilter
, "executionFilter", "Execution Filter");
239 case ESerializationPass::Load
:
241 RefreshInputsAndOutputs();
242 CDocGraphBase::Serialize(archive
);
245 case ESerializationPass::PostLoad
:
247 CDocGraphBase::Serialize(archive
);
250 case ESerializationPass::Save
:
252 CDocGraphBase::Serialize(archive
);
253 SInfoSerializer(*this).Serialize(archive
);
256 case ESerializationPass::Edit
:
258 CDocGraphBase::Serialize(archive
);
259 SInfoSerializer(*this).Serialize(archive
);
261 Serialization::SContext
fileContext(archive
, static_cast<IScriptFile
*>(&CDocGraphBase::GetFile())); // #SchematycTODO : Do we still need this?
263 switch(CDocGraphBase::GetType())
265 case EScriptGraphType::Function
:
267 archive(CDocGraphBase::GetInputs(), "inputs", "Inputs");
268 archive(CDocGraphBase::GetOutputs(), "outputs", "Outputs");
271 case EScriptGraphType::Condition
:
273 archive(CDocGraphBase::GetInputs(), "inputs", "Inputs");
274 for(CScriptVariableDeclaration
& output
: GetOutputs())
276 const IAnyConstPtr
& pOutputValue
= output
.GetValue();
279 const char* szOutputName
= output
.GetName();
280 archive(*pOutputValue
, szOutputName
, szOutputName
);
285 case EScriptGraphType::AbstractInterfaceFunction
:
287 // #SchematycTODO : Can we display inputs and outputs in editor?
293 case ESerializationPass::Validate
:
301 //////////////////////////////////////////////////////////////////////////
302 void CDocLogicGraph::RefreshAvailableNodes(const CAggregateTypeId
& inputTypeId
)
304 CDocGraphBase::ClearAvailablNodes();
305 CDocGraphBase::AddAvailableNode("Sequence", EScriptGraphNodeType::Sequence
, SGUID(), SGUID());
306 CDocGraphBase::AddAvailableNode("Branch", EScriptGraphNodeType::Branch
, SGUID(), SGUID());
307 CDocGraphBase::AddAvailableNode("Switch", EScriptGraphNodeType::Switch
, SGUID(), SGUID());
308 CDocGraphBase::AddAvailableNode("Make Enumeration", EScriptGraphNodeType::MakeEnumeration
, SGUID(), SGUID());
309 CDocGraphBase::AddAvailableNode("For Loop", EScriptGraphNodeType::ForLoop
, SGUID(), SGUID());
310 CDocGraphBase::AddAvailableNode("Return", EScriptGraphNodeType::Return
, SGUID(), SGUID());
311 CDocGraphBase::AddAvailableNode("Comment", EScriptGraphNodeType::Comment
, SGUID(), SGUID());
313 const IScriptFile
& file
= CDocGraphBase::GetFile();
314 const SGUID scopeGUID
= CDocGraphBase::GetScopeGUID();
315 const IScriptClass
* pOwnerClass
= DocUtils::FindOwnerClass(file
, scopeGUID
);
318 CDocGraphBase::AddAvailableNode("Get Object", EScriptGraphNodeType::GetObject
, SGUID(), pOwnerClass
->GetGUID());
321 CDomainContext
domainContext(SDomainContextScope(&file
, scopeGUID
));
322 VisitEnvGlobalFunctions(domainContext
);
323 VisitEnvAbstractInterfaces(domainContext
);
324 VisitEnvComponentMemberFunctions(domainContext
);
325 VisitEnvActionMemberFunctions(domainContext
);
326 VisitVariables(domainContext
);
327 VisitProperties(domainContext
);
328 VisitGraphs(domainContext
);
330 // #SchematycTODO : Use domain context to visit everything!
332 DocLogicGraphUtils::SDocVisitor
docVisitor(file
, *this);
333 ScriptIncludeRecursionUtils::VisitSignals(file
, ScriptIncludeRecursionUtils::SignalVisitor::FromConstMemberFunction
<DocLogicGraphUtils::SDocVisitor
, &DocLogicGraphUtils::SDocVisitor::VisitSignal
>(docVisitor
), SGUID(), true);
334 ScriptIncludeRecursionUtils::VisitAbstractInterfaceFunctions(file
, ScriptIncludeRecursionUtils::AbstractInterfaceFunctionVisitor::FromConstMemberFunction
<DocLogicGraphUtils::SDocVisitor
, &DocLogicGraphUtils::SDocVisitor::VisitAbstractInterfaceFunction
>(docVisitor
), SGUID(), true);
336 DocLogicGraphUtils::SClassElementVisitor
classElementVisitor(file
, *this);
337 const IScriptElement
* pScopeElement
= file
.GetElement(scopeGUID
);
338 CRY_ASSERT(pScopeElement
);
341 file
.VisitElements(ScriptElementConstVisitor::FromConstMemberFunction
<DocLogicGraphUtils::SClassElementVisitor
, &DocLogicGraphUtils::SClassElementVisitor::VisitElement
>(classElementVisitor
), pScopeElement
->GetGUID(), false);
342 if(pScopeElement
->GetElementType() != EScriptElementType::Class
)
344 pScopeElement
= file
.GetElement(pScopeElement
->GetScopeGUID());
353 //////////////////////////////////////////////////////////////////////////
354 IScriptGraphNodePtr
CDocLogicGraph::CreateNode(const SGUID
& guid
, EScriptGraphNodeType type
, const SGUID
& contextGUID
, const SGUID
& refGUID
, Vec2 pos
)
356 MEMSTAT_CONTEXT(EMemStatContextType::Other
, "Schematyc: Create Node(Doc Logic Graph)");
359 case EScriptGraphNodeType::Begin
:
361 return IScriptGraphNodePtr(new CDocGraphBeginNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
363 case EScriptGraphNodeType::BeginConstructor
:
365 return IScriptGraphNodePtr(new CDocGraphBeginConstructorNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
367 case EScriptGraphNodeType::BeginDestructor
:
369 return IScriptGraphNodePtr(new CDocGraphBeginDestructorNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
371 case EScriptGraphNodeType::BeginSignalReceiver
:
373 return IScriptGraphNodePtr(new CDocGraphBeginSignalReceiverNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
375 case EScriptGraphNodeType::Return
:
377 return IScriptGraphNodePtr(new CDocGraphReturnNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
379 case EScriptGraphNodeType::Sequence
:
381 return IScriptGraphNodePtr(new CDocGraphSequenceNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
383 case EScriptGraphNodeType::Branch
:
385 return IScriptGraphNodePtr(new CDocGraphBranchNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
387 case EScriptGraphNodeType::Switch
:
389 return IScriptGraphNodePtr(new CDocGraphSwitchNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
391 case EScriptGraphNodeType::MakeEnumeration
:
393 return IScriptGraphNodePtr(new CDocGraphMakeEnumerationNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
395 case EScriptGraphNodeType::ForLoop
:
397 return IScriptGraphNodePtr(new CDocGraphForLoopNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
399 case EScriptGraphNodeType::ProcessSignal
:
401 return IScriptGraphNodePtr(new CDocGraphProcessSignalNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
403 case EScriptGraphNodeType::SendSignal
:
405 return IScriptGraphNodePtr(new CDocGraphSendSignalNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
407 case EScriptGraphNodeType::BroadcastSignal
:
409 return IScriptGraphNodePtr(new CDocGraphBroadcastSignalNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
411 case EScriptGraphNodeType::Function
:
413 return IScriptGraphNodePtr(new CDocGraphFunctionNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
415 case EScriptGraphNodeType::Condition
:
417 return IScriptGraphNodePtr(new CDocGraphConditionNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
419 case EScriptGraphNodeType::AbstractInterfaceFunction
:
421 return IScriptGraphNodePtr(new CDocGraphAbstractInterfaceFunctionNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
423 case EScriptGraphNodeType::GetObject
:
425 return IScriptGraphNodePtr(new CDocGraphGetObjectNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
427 case EScriptGraphNodeType::Set
:
429 return IScriptGraphNodePtr(new CDocGraphSetNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
431 case EScriptGraphNodeType::Get
:
433 return IScriptGraphNodePtr(new CDocGraphGetNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
435 case EScriptGraphNodeType::ContainerAdd
:
437 return IScriptGraphNodePtr(new CDocGraphContainerAddNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
439 case EScriptGraphNodeType::ContainerRemoveByIndex
:
441 return IScriptGraphNodePtr(new CDocGraphContainerRemoveByIndexNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
443 case EScriptGraphNodeType::ContainerRemoveByValue
:
445 return IScriptGraphNodePtr(new CDocGraphContainerRemoveByValueNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
447 case EScriptGraphNodeType::ContainerClear
:
449 return IScriptGraphNodePtr(new CDocGraphContainerClearNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
451 case EScriptGraphNodeType::ContainerSize
:
453 return IScriptGraphNodePtr(new CDocGraphContainerSizeNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
455 case EScriptGraphNodeType::ContainerGet
:
457 return IScriptGraphNodePtr(new CDocGraphContainerGetNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
459 case EScriptGraphNodeType::ContainerSet
:
461 return IScriptGraphNodePtr(new CDocGraphContainerSetNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
463 case EScriptGraphNodeType::ContainerFindByValue
:
465 return IScriptGraphNodePtr(new CDocGraphContainerFindByValueNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
467 case EScriptGraphNodeType::StartTimer
:
469 return IScriptGraphNodePtr(new CDocGraphStartTimerNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
471 case EScriptGraphNodeType::StopTimer
:
473 return IScriptGraphNodePtr(new CDocGraphStopTimerNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
475 case EScriptGraphNodeType::ResetTimer
:
477 return IScriptGraphNodePtr(new CDocGraphResetTimerNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
479 case EScriptGraphNodeType::Comment
:
481 return IScriptGraphNodePtr(new CDocGraphCommentNode(CDocGraphBase::GetFile(), *this, guid
, contextGUID
, refGUID
, pos
));
485 return IScriptGraphNodePtr();
490 //////////////////////////////////////////////////////////////////////////
491 CDocLogicGraph::SInfoSerializer::SInfoSerializer(CDocLogicGraph
& _graph
)
495 //////////////////////////////////////////////////////////////////////////
496 void CDocLogicGraph::SInfoSerializer::Serialize(Serialization::IArchive
& archive
)
498 const EScriptGraphType type
= graph
.GetType();
499 if((type
== EScriptGraphType::Function
) || (type
== EScriptGraphType::Condition
))
501 archive(graph
.m_accessor
, "accessor", "Accessor");
502 archive(graph
.m_executionFilter
, "executionFilter", "Execution Filter");
506 //////////////////////////////////////////////////////////////////////////
507 bool CDocLogicGraph::RefreshInputsAndOutputs()
509 CRY_PROFILE_FUNCTION(PROFILE_LOADING_ONLY
);
510 // #SchematycTODO : Clean up this function, there's a lot of duplicated code here.
511 switch(CDocGraphBase::GetType())
513 case EScriptGraphType::Condition
:
515 ScriptVariableDeclarationVector
& outputs
= GetOutputs();
518 outputs
.push_back(CScriptVariableDeclaration("Result", GetAggregateTypeId
<bool>(), MakeAnyShared(bool(false))));
522 case EScriptGraphType::AbstractInterfaceFunction
:
524 // Retrieve interface function.
525 // #SchematycTODO : Check that inputs and output actually need to be refreshed?
526 const IScriptFile
& file
= CDocGraphBase::GetFile();
527 const IScriptAbstractInterfaceImplementation
* pAbstractInterfaceImplementation
= file
.GetAbstractInterfaceImplementation(CDocGraphBase::GetScopeGUID());
528 if(pAbstractInterfaceImplementation
)
530 const SGUID abstractInterfaceGUID
= pAbstractInterfaceImplementation
->GetRefGUID();
531 const SGUID abstractInterfaceFunctionGUID
= CDocGraphBase::GetContextGUID();
532 switch(pAbstractInterfaceImplementation
->GetDomain())
536 IAbstractInterfaceConstPtr pAbstractInterface
= gEnv
->pSchematyc2
->GetEnvRegistry().GetAbstractInterface(abstractInterfaceGUID
);
537 if(pAbstractInterface
)
539 IAbstractInterfaceFunctionConstPtr pAbstractInterfaceFunction
= pAbstractInterface
->GetFunction(AbstractInterfaceUtils::FindFunction(*pAbstractInterface
, abstractInterfaceFunctionGUID
));
540 CRY_ASSERT(pAbstractInterfaceFunction
);
541 if(pAbstractInterfaceFunction
)
543 CDocGraphBase::SetName(pAbstractInterfaceFunction
->GetName());
545 const size_t inputCount
= pAbstractInterfaceFunction
->GetInputCount();
546 ScriptVariableDeclarationVector
& inputs
= GetInputs();
547 inputs
.resize(inputCount
);
548 for(size_t inputIdx
= 0; inputIdx
< inputCount
; ++ inputIdx
)
550 const IAnyConstPtr pNewInputValue
= pAbstractInterfaceFunction
->GetInputValue(inputIdx
);
551 inputs
[inputIdx
] = CScriptVariableDeclaration(pAbstractInterfaceFunction
->GetInputName(inputIdx
), pNewInputValue
? pNewInputValue
->Clone() : IAnyPtr());
554 const size_t outputCount
= pAbstractInterfaceFunction
->GetOutputCount();
555 ScriptVariableDeclarationVector
& outputs
= GetOutputs();
556 outputs
.resize(outputCount
);
557 for(size_t outputIdx
= 0; outputIdx
< outputCount
; ++ outputIdx
)
559 const IAnyConstPtr pNewOutputValue
= pAbstractInterfaceFunction
->GetOutputValue(outputIdx
);
560 outputs
[outputIdx
] = CScriptVariableDeclaration(pAbstractInterfaceFunction
->GetOutputName(outputIdx
), pNewOutputValue
? pNewOutputValue
->Clone() : IAnyPtr());
567 case EDomain::Script
:
569 ScriptIncludeRecursionUtils::TGetAbstractInterfaceResult abstractInterface
= ScriptIncludeRecursionUtils::GetAbstractInterface(file
, abstractInterfaceGUID
);
570 if(abstractInterface
.second
)
572 const IScriptAbstractInterfaceFunction
* pAbstractInterfaceFunction
= abstractInterface
.first
->GetAbstractInterfaceFunction(abstractInterfaceFunctionGUID
);
573 if(pAbstractInterfaceFunction
)
575 CDocGraphBase::SetName(pAbstractInterfaceFunction
->GetName());
577 const size_t inputCount
= pAbstractInterfaceFunction
->GetInputCount();
578 ScriptVariableDeclarationVector
& inputs
= GetInputs();
579 inputs
.resize(inputCount
);
580 for(size_t inputIdx
= 0; inputIdx
< inputCount
; ++ inputIdx
)
582 const IAnyConstPtr pNewInputValue
= pAbstractInterfaceFunction
->GetInputValue(inputIdx
);
583 inputs
[inputIdx
] = CScriptVariableDeclaration(pAbstractInterfaceFunction
->GetInputName(inputIdx
), pNewInputValue
? pNewInputValue
->Clone() : IAnyPtr());
586 const size_t outputCount
= pAbstractInterfaceFunction
->GetOutputCount();
587 ScriptVariableDeclarationVector
& outputs
= GetOutputs();
588 outputs
.resize(outputCount
);
589 for(size_t outputIdx
= 0; outputIdx
< outputCount
; ++ outputIdx
)
591 const IAnyConstPtr pNewOutputValue
= pAbstractInterfaceFunction
->GetOutputValue(outputIdx
);
592 outputs
[outputIdx
] = CScriptVariableDeclaration(pAbstractInterfaceFunction
->GetOutputName(outputIdx
), pNewOutputValue
? pNewOutputValue
->Clone() : IAnyPtr());
611 //////////////////////////////////////////////////////////////////////////
612 void CDocLogicGraph::Validate(Serialization::IArchive
& archive
)
614 for(CScriptVariableDeclaration
& input
: GetInputs())
616 if(!input
.GetValue())
618 archive
.error(*this, "Failed to instantiate input value: input = %s", input
.GetName());
622 for(CScriptVariableDeclaration
& output
: GetOutputs())
624 if(!output
.GetValue())
626 archive
.error(*this, "Failed to instantiate output value: output = %s", output
.GetName());
631 //////////////////////////////////////////////////////////////////////////
632 void CDocLogicGraph::VisitEnvGlobalFunctions(const IDomainContext
& domainContext
)
634 auto visitEnvGlobalFunction
= [this, &domainContext
] (const IGlobalFunctionConstPtr
& pFunction
) -> EVisitStatus
636 stack_string qualifiedFunctionName
;
637 domainContext
.QualifyName(*pFunction
, qualifiedFunctionName
);
638 const SGUID contextGUID
= SGUID();
639 const SGUID refGUID
= pFunction
->GetGUID();
640 if(DocLogicGraphUtils::FunctionIsCondition(*pFunction
))
642 stack_string nodeName
= "Condition::";
643 nodeName
.append(qualifiedFunctionName
);
644 AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::Condition
, contextGUID
, refGUID
);
647 stack_string nodeName
= "Function::";
648 nodeName
.append(qualifiedFunctionName
);
649 AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::Function
, contextGUID
, refGUID
);
651 return EVisitStatus::Continue
;
653 domainContext
.VisitEnvGlobalFunctions(EnvGlobalFunctionVisitor::FromLambdaFunction(visitEnvGlobalFunction
));
656 //////////////////////////////////////////////////////////////////////////
657 void CDocLogicGraph::VisitEnvAbstractInterfaces(const IDomainContext
& domainContext
)
659 auto visitEnvAbstractInterface
= [this, &domainContext
] (const IAbstractInterfaceConstPtr
& pAbstractInterface
) -> EVisitStatus
661 for(size_t functionIdx
= 0, functionCount
= pAbstractInterface
->GetFunctionCount(); functionIdx
< functionCount
; ++ functionIdx
)
663 IAbstractInterfaceFunctionConstPtr pFunction
= pAbstractInterface
->GetFunction(functionIdx
);
666 stack_string nodeName
;
667 domainContext
.QualifyName(*pFunction
, nodeName
);
668 nodeName
.insert(0, "Abstract Interface Function::");
669 AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::AbstractInterfaceFunction
, pAbstractInterface
->GetGUID(), pFunction
->GetGUID());
672 return EVisitStatus::Continue
;
674 domainContext
.VisitEnvAbstractInterfaces(EnvAbstractInterfaceVisitor::FromLambdaFunction(visitEnvAbstractInterface
));
677 //////////////////////////////////////////////////////////////////////////
678 void CDocLogicGraph::VisitEnvComponentMemberFunctions(const IDomainContext
& domainContext
)
680 typedef std::vector
<const IScriptComponentInstance
*> ComponentInstances
;
682 ComponentInstances componentInstances
;
683 componentInstances
.reserve(32);
684 auto visitComponentInstance
= [&componentInstances
] (const IScriptComponentInstance
& componentInstance
) -> EVisitStatus
686 componentInstances
.push_back(&componentInstance
);
687 return EVisitStatus::Continue
;
689 domainContext
.VisitScriptComponentInstances(ScriptComponentInstanceConstVisitor::FromLambdaFunction(visitComponentInstance
), EDomainScope::Local
);
691 auto visitEnvComponentMemberFunction
= [this, &domainContext
, &componentInstances
] (const IComponentMemberFunctionConstPtr
& pFunction
) -> EVisitStatus
693 const SGUID componentGUID
= pFunction
->GetComponentGUID();
694 const bool bFunctionIsCondition
= DocLogicGraphUtils::FunctionIsCondition(*pFunction
);
695 for(const IScriptComponentInstance
* pComponentInstance
: componentInstances
)
697 if(pComponentInstance
->GetComponentGUID() == componentGUID
)
699 stack_string qualifiedFunctionName
;
700 domainContext
.QualifyName(*pComponentInstance
, *pFunction
, EDomainQualifier::Global
, qualifiedFunctionName
);
701 const SGUID contextGUID
= pComponentInstance
->GetGUID();
702 const SGUID refGUID
= pFunction
->GetGUID();
703 if(bFunctionIsCondition
)
705 stack_string nodeName
= "Condition::";
706 nodeName
.append(qualifiedFunctionName
);
707 AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::Condition
, contextGUID
, refGUID
);
710 stack_string nodeName
= "Function::";
711 nodeName
.append(qualifiedFunctionName
);
712 AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::Function
, contextGUID
, refGUID
);
716 return EVisitStatus::Continue
;
718 domainContext
.VisitEnvComponentMemberFunctions(EnvComponentMemberFunctionVisitor::FromLambdaFunction(visitEnvComponentMemberFunction
));
721 //////////////////////////////////////////////////////////////////////////
722 void CDocLogicGraph::VisitEnvActionMemberFunctions(const IDomainContext
& domainContext
)
724 typedef std::vector
<const IScriptActionInstance
*> ActionInstances
;
726 ActionInstances actionInstances
;
727 actionInstances
.reserve(32);
728 auto visitActionInstance
= [&actionInstances
] (const IScriptActionInstance
& actionInstance
) -> EVisitStatus
730 actionInstances
.push_back(&actionInstance
);
731 return EVisitStatus::Continue
;
733 domainContext
.VisitScriptActionInstances(ScriptActionInstanceConstVisitor::FromLambdaFunction(visitActionInstance
), EDomainScope::Local
);
735 auto visitEnvActionMemberFunction
= [this, &domainContext
, &actionInstances
] (const IActionMemberFunctionConstPtr
& pFunction
) -> EVisitStatus
737 const SGUID actionGUID
= pFunction
->GetActionGUID();
738 const bool bFunctionIsCondition
= DocLogicGraphUtils::FunctionIsCondition(*pFunction
);
739 for(const IScriptActionInstance
* pActionInstance
: actionInstances
)
741 if(pActionInstance
->GetActionGUID() == actionGUID
)
743 stack_string qualifiedFunctionName
;
744 domainContext
.QualifyName(*pActionInstance
, *pFunction
, EDomainQualifier::Global
, qualifiedFunctionName
);
745 const SGUID contextGUID
= pActionInstance
->GetGUID();
746 const SGUID refGUID
= pFunction
->GetGUID();
747 if(bFunctionIsCondition
)
749 stack_string nodeName
= "Condition::";
750 nodeName
.append(qualifiedFunctionName
);
751 AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::Condition
, contextGUID
, refGUID
);
754 stack_string nodeName
= "Function::";
755 nodeName
.append(qualifiedFunctionName
);
756 AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::Function
, contextGUID
, refGUID
);
760 return EVisitStatus::Continue
;
762 domainContext
.VisitEnvActionMemberFunctions(EnvActionMemberFunctionVisitor::FromLambdaFunction(visitEnvActionMemberFunction
));
765 //////////////////////////////////////////////////////////////////////////
766 void CDocLogicGraph::VisitVariables(const IDomainContext
& domainContext
)
768 auto visitVariable
= [this, &domainContext
] (const IScriptVariable
& variable
) -> EVisitStatus
770 stack_string qualifiedVariableName
;
771 domainContext
.QualifyName(variable
, EDomainQualifier::Global
, qualifiedVariableName
);
772 const SGUID contextGUID
= SGUID();
773 const SGUID refGUID
= variable
.GetGUID();
775 stack_string nodeName
= "Set::";
776 nodeName
.append(qualifiedVariableName
);
777 AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::Set
, contextGUID
, refGUID
);
780 stack_string nodeName
= "Get::";
781 nodeName
.append(qualifiedVariableName
);
782 AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::Get
, contextGUID
, refGUID
);
784 return EVisitStatus::Continue
;
786 domainContext
.VisitScriptVariables(ScriptVariableConstVisitor::FromLambdaFunction(visitVariable
), EDomainScope::Derived
);
789 //////////////////////////////////////////////////////////////////////////
790 void CDocLogicGraph::VisitProperties(const IDomainContext
& domainContext
)
792 auto visitProperty
= [this, &domainContext
] (const IScriptProperty
& property
) -> EVisitStatus
794 stack_string nodeName
;
795 domainContext
.QualifyName(property
, EDomainQualifier::Global
, nodeName
);
796 nodeName
.insert(0, "Get::");
797 AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::Get
, SGUID(), property
.GetGUID());
798 return EVisitStatus::Continue
;
800 domainContext
.VisitScriptProperties(ScriptPropertyConstVisitor::FromLambdaFunction(visitProperty
), EDomainScope::Derived
);
803 //////////////////////////////////////////////////////////////////////////
804 void CDocLogicGraph::VisitGraphs(const IDomainContext
& domainContext
)
806 auto visitGraph
= [this, &domainContext
] (const IDocGraph
& graph
) -> EVisitStatus
808 switch(graph
.GetType())
810 case EScriptGraphType::Function
:
812 stack_string nodeName
;
813 domainContext
.QualifyName(graph
, EDomainQualifier::Global
, nodeName
);
814 nodeName
.insert(0, "Function::");
815 AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::Function
, SGUID(), graph
.GetGUID());
818 case EScriptGraphType::Condition
:
820 stack_string nodeName
;
821 domainContext
.QualifyName(graph
, EDomainQualifier::Global
, nodeName
);
822 nodeName
.insert(0, "Condition::");
823 AddAvailableNode(nodeName
.c_str(), EScriptGraphNodeType::Condition
, SGUID(), graph
.GetGUID());
826 return EVisitStatus::Continue
;
828 domainContext
.VisitDocGraphs(DocGraphConstVisitor::FromLambdaFunction(visitGraph
), EDomainScope::Derived
);