1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
4 #include "Deprecated/DocGraphNodes/DocGraphReturnNode.h"
6 #include <CrySchematyc2/ICompiler.h>
7 #include <CrySchematyc2/Deprecated/Variant.h>
11 //////////////////////////////////////////////////////////////////////////
12 CDocGraphReturnNode::CDocGraphReturnNode(IScriptFile
& file
, IDocGraph
& graph
, const SGUID
& guid
, const SGUID
& contextGUID
, const SGUID
& refGUID
, Vec2 pos
)
13 : CDocGraphNodeBase(file
, graph
, guid
, "Return", EScriptGraphNodeType::Return
, contextGUID
, refGUID
, pos
)
16 //////////////////////////////////////////////////////////////////////////
17 IAnyConstPtr
CDocGraphReturnNode::GetCustomOutputDefault() const
19 return IAnyConstPtr();
22 //////////////////////////////////////////////////////////////////////////
23 size_t CDocGraphReturnNode::AddCustomOutput(const IAny
& value
)
28 //////////////////////////////////////////////////////////////////////////
29 void CDocGraphReturnNode::EnumerateOptionalOutputs(const ScriptGraphNodeOptionalOutputEnumerator
& enumerator
) {}
31 //////////////////////////////////////////////////////////////////////////
32 size_t CDocGraphReturnNode::AddOptionalOutput(const char* szName
, EScriptGraphPortFlags flags
, const CAggregateTypeId
& typeId
)
37 //////////////////////////////////////////////////////////////////////////
38 void CDocGraphReturnNode::RemoveOutput(size_t outputIdx
) {}
40 //////////////////////////////////////////////////////////////////////////
41 void CDocGraphReturnNode::Refresh(const SScriptRefreshParams
& params
)
43 CRY_PROFILE_FUNCTION(PROFILE_LOADING_ONLY
);
45 CDocGraphNodeBase::Refresh(params
);
46 CDocGraphNodeBase::AddInput("In", EScriptGraphPortFlags::MultiLink
| EScriptGraphPortFlags::EndSequence
| EScriptGraphPortFlags::Execute
);
48 const IDocGraph
& graph
= CDocGraphNodeBase::GetGraph();
49 const size_t graphOutputCount
= graph
.GetOutputCount();
50 for(size_t graphOutputIdx
= 0; graphOutputIdx
< graphOutputCount
; ++ graphOutputIdx
)
52 IAnyConstPtr pGraphOutputValue
= graph
.GetOutputValue(graphOutputIdx
);
55 CDocGraphNodeBase::AddInput(graph
.GetOutputName(graphOutputIdx
), EScriptGraphPortFlags::None
, pGraphOutputValue
->GetTypeInfo().GetTypeId());
60 //////////////////////////////////////////////////////////////////////////
61 void CDocGraphReturnNode::Serialize(Serialization::IArchive
& archive
)
63 CRY_PROFILE_FUNCTION(PROFILE_LOADING_ONLY
);
65 CDocGraphNodeBase::Serialize(archive
);
67 const IDocGraph
& graph
= CDocGraphNodeBase::GetGraph();
68 const size_t graphOutputCount
= graph
.GetOutputCount();
70 if(graphOutputCount
!= m_outputValues
.size()) // #SchematycTODO : Move to separate function?
72 m_outputValues
.resize(graphOutputCount
);
73 for(size_t graphOutputIdx
= 0; graphOutputIdx
< graphOutputCount
; ++ graphOutputIdx
)
75 IAnyConstPtr pGraphOutputValue
= graph
.GetOutputValue(graphOutputIdx
);
78 IAnyPtr
& pOutputValue
= m_outputValues
[graphOutputIdx
];
79 if(!pOutputValue
|| (pOutputValue
->GetTypeInfo().GetTypeId() != pGraphOutputValue
->GetTypeInfo().GetTypeId()))
81 pOutputValue
= pGraphOutputValue
->Clone();
87 for(size_t graphOutputIdx
= 0; graphOutputIdx
< graphOutputCount
; ++ graphOutputIdx
)
89 IAnyPtr
& pOutputValue
= m_outputValues
[graphOutputIdx
];
92 const char* szName
= graph
.GetOutputName(graphOutputIdx
);
93 archive(*pOutputValue
, szName
, szName
);
97 if(archive
.isValidation())
103 //////////////////////////////////////////////////////////////////////////
104 void CDocGraphReturnNode::PreCompileSequence(IDocGraphSequencePreCompiler
& preCompiler
, size_t outputIdx
) const {}
106 //////////////////////////////////////////////////////////////////////////
107 void CDocGraphReturnNode::LinkSequence(IDocGraphSequenceLinker
& linker
, size_t outputIdx
, const LibFunctionId
& functionId
) const {}
109 //////////////////////////////////////////////////////////////////////////
110 void CDocGraphReturnNode::Compile(IDocGraphNodeCompiler
& compiler
, EDocGraphSequenceStep sequenceStep
, size_t portIdx
) const
114 case EDocGraphSequenceStep::BeginInput
:
122 //////////////////////////////////////////////////////////////////////////
123 void CDocGraphReturnNode::Validate(Serialization::IArchive
& archive
)
125 const IDocGraph
& graph
= CDocGraphNodeBase::GetGraph();
126 const size_t graphOutputCount
= graph
.GetOutputCount();
127 if(graphOutputCount
!= m_outputValues
.size())
129 archive
.error(*this, "Number of outputs does not match reference!");
133 for(size_t graphOutputIdx
= 0; graphOutputIdx
< graphOutputCount
; ++ graphOutputIdx
)
135 if(!m_outputValues
[graphOutputIdx
])
137 archive
.error(*this, "Failed to instantiate output value: output = %s", graph
.GetOutputName(graphOutputIdx
));
143 //////////////////////////////////////////////////////////////////////////
144 void CDocGraphReturnNode::Return(IDocGraphNodeCompiler
& compiler
) const
146 for(size_t outputIdx
= 0, outputCount
= m_outputValues
.size(), pos
= 0; outputIdx
< outputCount
; ++ outputIdx
)
148 const IAnyPtr
& pOutputValue
= m_outputValues
[outputIdx
];
151 const size_t stackPos
= compiler
.FindInputOnStack(*this, EInput::FirstParam
+ outputIdx
);
152 if(stackPos
!= INVALID_INDEX
)
154 compiler
.Copy(stackPos
, pos
, *pOutputValue
, CDocGraphNodeBase::GetGUID(), GetInputName(EInput::FirstParam
+ outputIdx
));
158 compiler
.Set(pos
, *pOutputValue
, CDocGraphNodeBase::GetGUID(), GetInputName(EInput::FirstParam
+ outputIdx
));
161 TVariantVector variants
;
162 CVariantVectorOutputArchive
archive(variants
);
163 archive(*pOutputValue
, "", "");
165 pos
+= variants
.size();
169 compiler
.Return(CDocGraphNodeBase::GetGUID());