!B (Sandbox) (CE-21795) Importing models with multisubmaterials via fbx switches...
[CRYENGINE.git] / Code / CryEngine / CrySchematyc2 / Deprecated / DocLogicGraph.cpp
blob7cec22288ab78266ae86273fa284bb6d6dca6cc0
1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
3 #include "StdAfx.h"
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()
44 namespace Schematyc2
46 namespace DocLogicGraphUtils
48 struct SDocVisitor
50 inline SDocVisitor(const IScriptFile& _file, CDocGraphBase& _docGraph)
51 : file(_file)
52 , docGraph(_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)
78 : file(_file)
79 , docGraph(_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);
91 break;
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());
135 break;
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());
154 break;
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
190 return m_accessor;
193 //////////////////////////////////////////////////////////////////////////
194 void CDocLogicGraph::EnumerateDependencies(const ScriptDependancyEnumerator& enumerator) const
196 SCHEMATYC2_SYSTEM_ASSERT(enumerator);
197 if (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");
237 break;
239 case ESerializationPass::Load:
241 RefreshInputsAndOutputs();
242 CDocGraphBase::Serialize(archive);
243 break;
245 case ESerializationPass::PostLoad:
247 CDocGraphBase::Serialize(archive);
248 break;
250 case ESerializationPass::Save:
252 CDocGraphBase::Serialize(archive);
253 SInfoSerializer(*this).Serialize(archive);
254 break;
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");
269 break;
271 case EScriptGraphType::Condition:
273 archive(CDocGraphBase::GetInputs(), "inputs", "Inputs");
274 for(CScriptVariableDeclaration& output : GetOutputs())
276 const IAnyConstPtr& pOutputValue = output.GetValue();
277 if(pOutputValue)
279 const char* szOutputName = output.GetName();
280 archive(*pOutputValue, szOutputName, szOutputName);
283 break;
285 case EScriptGraphType::AbstractInterfaceFunction:
287 // #SchematycTODO : Can we display inputs and outputs in editor?
288 break;
291 break;
293 case ESerializationPass::Validate:
295 Validate(archive);
296 break;
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);
316 if(pOwnerClass)
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);
339 while(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());
346 else
348 break;
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)");
357 switch(type)
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));
483 default:
485 return IScriptGraphNodePtr();
490 //////////////////////////////////////////////////////////////////////////
491 CDocLogicGraph::SInfoSerializer::SInfoSerializer(CDocLogicGraph& _graph)
492 : graph(_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();
516 if(outputs.empty())
518 outputs.push_back(CScriptVariableDeclaration("Result", GetAggregateTypeId<bool>(), MakeAnyShared(bool(false))));
520 return true;
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())
534 case EDomain::Env:
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());
544 // Refresh inputs.
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());
553 // Refresh outputs.
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());
562 return true;
565 break;
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());
576 // Refresh inputs.
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());
585 // Refresh outputs.
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());
594 return true;
597 break;
601 break;
603 default:
605 return true;
608 return false;
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);
664 if(pFunction)
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());
816 break;
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);