protected override void SolveInstance(IGH_DataAccess da) { base.SolveInstance(da); Message = ""; // create our code shader var theshader = new ccl.CodeShader(ccl.Shader.ShaderType.Material); // determine all nodes used for this shader var usednodes = UsedNodes(this, da.Iteration); bool isBg = false; // add all nodes to the shader foreach (var n in usednodes) { if (n is CyclesNode cn) { isBg |= (cn is BSDF.BackgroundNode); theshader.AddNode(cn.ShaderNode); } } // finalize the shader theshader.FinalizeGraph(); var xmlgraph = theshader.Xml.Trim().Replace("\n", "").Replace(">", ">\n") + ShaderNode.CreateConnectXml().Trim().Replace("\n", "").Replace(">", ">\n"); var codegraph = theshader.Code.Trim().Replace("\n", "").Replace(";", ";\n") + ShaderNode.CreateConnectCode().Trim().Replace("\n", "").Replace(";", ";\n"); var xmlcode = xmlgraph + "<!--\n" + codegraph + "\n-->"; // Update XmlMaterial with shader. if (matId.Count() > 0 && xmlgraph.Length > 0) { var midx = da.Iteration < matId.Count ? da.Iteration : matId.Count - 1; if (Rhino.RhinoDoc.ActiveDoc.RenderMaterials.Where(i => i.Id.Equals(matId[midx])).FirstOrDefault() is XmlMaterial m) { m.BeginChange(Rhino.Render.RenderContent.ChangeContexts.Program); m.SetParameter("xmlcode", xmlgraph); m.EndChange(); if (matId.Count() > 1) { Message = "multiple materials set"; } else { Message = m.Name; } } else { Message = "NO MATERIAL"; } } da.SetData(0, xmlcode); }