public static TranslatedMaterialGraph Translate(ScriptHelper script)
        {
            var a = new TranslatedMaterialGraph(script);

            a.Visit();
            return(a);
        }
        public static void Preprocess(ScriptHelper graph, Connection previewPin = null)
        {
            var g = new TranslatedMaterialGraph(graph);

            new PreviewPinOutput(graph).Apply(previewPin);
            new InlineFunctions(g.Script).Apply();
            g.CreateFinalPosition();
            g.SplitOutputs();
            g.JoinUniforms();
            g.JoinParameters();
            if (previewPin == null)
            {
                g.CreateFinalColors();
            }
            else
            {
                g.CreateShadowPass(graph.Nodes.FirstOrDefault(_ => _.Type == NodeTypes.PositionOutput));
            }
            g.SplitOutputs();
        }
        public ShaderGeneratorContext(ScriptHelper <TranslatedMaterialGraph.NodeInfo> graph, string name,
                                      Connection previewPin = null)
        {
            Name = name;

            Parameters = graph.Nodes.Where(_ => NodeTypes.IsParameter(_.Type)).ToList();
            Samplers   = graph.Nodes.Where(_ => NodeTypes.IsSampler(_.Type)).ToList();

            TranslatedMaterialGraph.Preprocess(graph, previewPin);

            var finalColorByPass = graph.Nodes.Where(_ => NodeTypes.IsFinalColor(_.Type)).ToLookup(_ => _.Value);

            foreach (var pass in finalColorByPass)
            {
                var passGraph = graph.Clone();
                passGraph.Nodes.RemoveWhere(_ => NodeTypes.IsFinalColor(_.Type) && _.Value != pass.Key);
                Passes.Add(new Pass {
                    Key = pass.Key, Graph = TranslatedMaterialGraph.Translate(passGraph)
                });
            }
        }