示例#1
0
        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);
        }