!B (Sandbox) (CE-21795) Importing models with multisubmaterials via fbx switches...
[CRYENGINE.git] / Code / CryEngine / CrySchematyc2 / Deprecated / DocGraphNodes / DocGraphReturnNode.cpp
blobdc14571ac1c8e3086be157c29fb8c268c63db31e
1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
3 #include "StdAfx.h"
4 #include "Deprecated/DocGraphNodes/DocGraphReturnNode.h"
6 #include <CrySchematyc2/ICompiler.h>
7 #include <CrySchematyc2/Deprecated/Variant.h>
9 namespace Schematyc2
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)
25 return INVALID_INDEX;
28 //////////////////////////////////////////////////////////////////////////
29 void CDocGraphReturnNode::EnumerateOptionalOutputs(const ScriptGraphNodeOptionalOutputEnumerator& enumerator) {}
31 //////////////////////////////////////////////////////////////////////////
32 size_t CDocGraphReturnNode::AddOptionalOutput(const char* szName, EScriptGraphPortFlags flags, const CAggregateTypeId& typeId)
34 return INVALID_INDEX;
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);
53 if(pGraphOutputValue)
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);
76 if(pGraphOutputValue)
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];
90 if(pOutputValue)
92 const char* szName = graph.GetOutputName(graphOutputIdx);
93 archive(*pOutputValue, szName, szName);
97 if(archive.isValidation())
99 Validate(archive);
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
112 switch(sequenceStep)
114 case EDocGraphSequenceStep::BeginInput:
116 Return(compiler);
117 break;
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!");
131 else
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];
149 if(pOutputValue)
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));
156 else
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());