Exemplo n.º 1
0
        static public Shader create_some_setup_shader()
        {
            var some_setup = new Shader(Client, Shader.ShaderType.Material)
            {
                Name   = "some_setup ",
                UseMis = false,
                UseTransparentShadow = true,
                HeterogeneousVolume  = false
            };


            var brick_texture = new BrickTexture();

            brick_texture.ins.Vector.Value     = new float4(0.000f, 0.000f, 0.000f);
            brick_texture.ins.Color1.Value     = new float4(0.800f, 0.800f, 0.800f);
            brick_texture.ins.Color2.Value     = new float4(0.200f, 0.200f, 0.200f);
            brick_texture.ins.Mortar.Value     = new float4(0.000f, 0.000f, 0.000f);
            brick_texture.ins.Scale.Value      = 1.000f;
            brick_texture.ins.MortarSize.Value = 0.020f;
            brick_texture.ins.Bias.Value       = 0.000f;
            brick_texture.ins.BrickWidth.Value = 0.500f;
            brick_texture.ins.RowHeight.Value  = 0.250f;

            var checker_texture = new CheckerTexture();

            checker_texture.ins.Vector.Value = new float4(0.000f, 0.000f, 0.000f);
            checker_texture.ins.Color1.Value = new float4(0.000f, 0.004f, 0.800f);
            checker_texture.ins.Color2.Value = new float4(0.200f, 0.000f, 0.007f);
            checker_texture.ins.Scale.Value  = 5.000f;

            var diffuse_bsdf = new DiffuseBsdfNode();

            diffuse_bsdf.ins.Color.Value     = new float4(0.800f, 0.800f, 0.800f);
            diffuse_bsdf.ins.Roughness.Value = 0.000f;
            diffuse_bsdf.ins.Normal.Value    = new float4(0.000f, 0.000f, 0.000f);

            var texture_coordinate = new TextureCoordinateNode();


            some_setup.AddNode(brick_texture);
            some_setup.AddNode(checker_texture);
            some_setup.AddNode(diffuse_bsdf);
            some_setup.AddNode(texture_coordinate);

            brick_texture.outs.Color.Connect(diffuse_bsdf.ins.Color);
            checker_texture.outs.Color.Connect(brick_texture.ins.Mortar);
            texture_coordinate.outs.Normal.Connect(checker_texture.ins.Vector);
            texture_coordinate.outs.UV.Connect(brick_texture.ins.Vector);

            diffuse_bsdf.outs.BSDF.Connect(some_setup.Output.ins.Surface);

            some_setup.FinalizeGraph();

            return(some_setup);
        }
Exemplo n.º 2
0
        /// <summary>
        /// create a ccl.Scene
        /// </summary>
        /// <param name="client">Client to create scene for</param>
        /// <param name="render_device">Render device to use</param>
        /// <param name="cycles_engine">Engine instance to create for</param>
        /// <returns></returns>
        protected static Scene CreateScene(Client client, Device render_device,
                                           RenderEngine cycles_engine)
        {
            #region set up scene parameters
            var scene_params = new SceneParameters(client, ShadingSystem.SVM, BvhType.Static, false, render_device.IsCpu, false);
            #endregion

            #region create scene
            var scene = new Scene(client, scene_params, render_device)
            {
                #region integrator settings
                Integrator =
                {
                    MaxBounce               = RcCore.It.EngineSettings.MaxBounce,
                    TransparentMaxBounce    = RcCore.It.EngineSettings.TransparentMaxBounce,
                    MaxDiffuseBounce        = RcCore.It.EngineSettings.MaxDiffuseBounce,
                    MaxGlossyBounce         = RcCore.It.EngineSettings.MaxGlossyBounce,
                    MaxTransmissionBounce   = RcCore.It.EngineSettings.MaxTransmissionBounce,
                    MaxVolumeBounce         = RcCore.It.EngineSettings.MaxVolumeBounce,
                    NoCaustics              = RcCore.It.EngineSettings.NoCaustics,
                    DiffuseSamples          = RcCore.It.EngineSettings.DiffuseSamples,
                    GlossySamples           = RcCore.It.EngineSettings.GlossySamples,
                    TransmissionSamples     = RcCore.It.EngineSettings.TransmissionSamples,
                    AoSamples               = RcCore.It.EngineSettings.AoSamples,
                    MeshLightSamples        = RcCore.It.EngineSettings.MeshLightSamples,
                    SubsurfaceSamples       = RcCore.It.EngineSettings.SubsurfaceSamples,
                    VolumeSamples           = RcCore.It.EngineSettings.VolumeSamples,
                    AaSamples               = RcCore.It.EngineSettings.AaSamples,
                    FilterGlossy            = RcCore.It.EngineSettings.FilterGlossy,
                    IntegratorMethod        = RcCore.It.EngineSettings.IntegratorMethod,
                    SampleAllLightsDirect   = RcCore.It.EngineSettings.SampleAllLights,
                    SampleAllLightsIndirect = RcCore.It.EngineSettings.SampleAllLightsIndirect,
                    SampleClampDirect       = RcCore.It.EngineSettings.SampleClampDirect,
                    SampleClampIndirect     = RcCore.It.EngineSettings.SampleClampIndirect,
                    LightSamplingThreshold  = RcCore.It.EngineSettings.LightSamplingThreshold,
                    SamplingPattern         = SamplingPattern.CMJ,
                    Seed      = RcCore.It.EngineSettings.Seed,
                    NoShadows = RcCore.It.EngineSettings.NoShadows,
                }

                #endregion
            };

            scene.Film.SetFilter(FilterType.Gaussian, 1.5f);
            scene.Film.Exposure = 1.0f;
            scene.Film.Update();

            #endregion

            #region background shader

            // we add here a simple background shader. This will be repopulated with
            // other nodes whenever background changes are detected.
            var background_shader = new Shader(client, Shader.ShaderType.World)
            {
                Name = "Rhino Background"
            };

            var bgnode = new BackgroundNode("orig bg");
            bgnode.ins.Color.Value    = new float4(1.0f);
            bgnode.ins.Strength.Value = 1.0f;

            background_shader.AddNode(bgnode);
            bgnode.outs.Background.Connect(background_shader.Output.ins.Surface);
            background_shader.FinalizeGraph();

            scene.AddShader(background_shader);

            scene.Background.Shader      = background_shader;
            scene.Background.AoDistance  = 0.0f;
            scene.Background.AoFactor    = 0.0f;
            scene.Background.Visibility  = PathRay.AllVisibility;
            scene.Background.Transparent = false;

            #endregion

            return(scene);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Set image texture node and link up with correct TextureCoordinateNode output based on
        /// texture ProjectionMode.
        ///
        /// This may add new nodes to the shader!
        /// </summary>
        /// <param name="shader"></param>
        /// <param name="texture"></param>
        /// <param name="image_node"></param>
        /// <param name="texture_coordinates"></param>
        public static void SetProjectionMode(Shader shader, CyclesTextureImage texture, ImageTextureNode image_node,
                                             TextureCoordinateNode texture_coordinates)
        {
            if (!texture.HasTextureImage)
            {
                return;
            }

            Guid g = Guid.NewGuid();

            texture_coordinates.UseTransform = false;

            var tfm = new MatrixMathNode("texture transform" + g.ToString())
            {
                Transform = texture.Transform
            };

            shader.AddNode(tfm);

            image_node.Projection = TextureNode.TextureProjection.Flat;

            if (texture.ProjectionMode == TextureProjectionMode.WcsBox)
            {
                texture_coordinates.UseTransform = true;
                texture_coordinates.outs.WcsBox.Connect(tfm.ins.Vector);
                tfm.outs.Vector.Connect(image_node.ins.Vector);
            }
            else if (texture.ProjectionMode == TextureProjectionMode.Wcs)
            {
                texture_coordinates.UseTransform = true;
                texture_coordinates.outs.Object.Connect(tfm.ins.Vector);
                tfm.outs.Vector.Connect(image_node.ins.Vector);
            }
            else if (texture.ProjectionMode == TextureProjectionMode.Screen)
            {
                SeparateXyzNode sepvec  = new SeparateXyzNode();
                CombineXyzNode  combvec = new CombineXyzNode();
                MathNode        inverty = new MathNode {
                    Operation = MathNode.Operations.Subtract
                };
                inverty.ins.Value1.Value = 1.0f;
                shader.AddNode(sepvec);
                shader.AddNode(combvec);
                shader.AddNode(inverty);

                texture_coordinates.outs.Window.Connect(sepvec.ins.Vector);

                sepvec.outs.Y.Connect(inverty.ins.Value2);

                sepvec.outs.X.Connect(combvec.ins.X);
                inverty.outs.Value.Connect(combvec.ins.Y);
                sepvec.outs.Z.Connect(combvec.ins.Z);

                combvec.outs.Vector.Connect(tfm.ins.Vector);

                tfm.Transform = tfm.Transform;
                tfm.outs.Vector.Connect(image_node.ins.Vector);
            }
            else if (texture.ProjectionMode == TextureProjectionMode.View)
            {
                texture_coordinates.outs.Camera.Connect(tfm.ins.Vector);
                tfm.outs.Vector.Connect(image_node.ins.Vector);
            }
            else if (texture.ProjectionMode == TextureProjectionMode.EnvironmentMap)
            {
                texture_coordinates.UseTransform = false;
                switch (texture.EnvProjectionMode)
                {
                case TextureEnvironmentMappingMode.Spherical:
                    texture_coordinates.outs.EnvSpherical.Connect(image_node.ins.Vector);
                    break;

                case TextureEnvironmentMappingMode.EnvironmentMap:
                    texture_coordinates.outs.EnvEmap.Connect(image_node.ins.Vector);
                    break;

                case TextureEnvironmentMappingMode.Box:
                    texture_coordinates.outs.EnvBox.Connect(image_node.ins.Vector);
                    break;

                case TextureEnvironmentMappingMode.LightProbe:
                    texture_coordinates.outs.EnvLightProbe.Connect(image_node.ins.Vector);
                    break;

                case TextureEnvironmentMappingMode.Cube:
                    texture_coordinates.outs.EnvCubemap.Connect(image_node.ins.Vector);
                    break;

                case TextureEnvironmentMappingMode.VerticalCrossCube:
                    texture_coordinates.outs.EnvCubemapVerticalCross.Connect(image_node.ins.Vector);
                    break;

                case TextureEnvironmentMappingMode.HorizontalCrossCube:
                    texture_coordinates.outs.EnvCubemapHorizontalCross.Connect(image_node.ins.Vector);
                    break;

                case TextureEnvironmentMappingMode.Hemispherical:
                    texture_coordinates.outs.EnvHemispherical.Connect(image_node.ins.Vector);
                    break;

                default:
                    texture_coordinates.outs.EnvEmap.Connect(image_node.ins.Vector);
                    break;
                }
            }
            else
            {
                texture_coordinates.outs.UV.Connect(tfm.ins.Vector);
                tfm.outs.Vector.Connect(image_node.ins.Vector);
            }
        }
Exemplo n.º 4
0
        public bool GetShader(Shader sh, bool finalize)
        {
            blendit = new ccl.ShaderNodes.MixClosureNode($"blendit{Serial}");
            sh.AddNode(blendit);

            RhinoCyclesCore.Converters.ShaderConverter sconv = new RhinoCyclesCore.Converters.ShaderConverter();
            CyclesShader    mat1sh      = null;
            CyclesShader    mat2sh      = null;
            ICyclesMaterial crm1        = null;
            ICyclesMaterial crm2        = null;
            ClosureSocket   crm1closure = null;
            ClosureSocket   crm2closure = null;

            if (Mat1Rm != null)
            {
                if (Mat1Rm is ICyclesMaterial)
                {
                    crm1       = Mat1Rm as ICyclesMaterial;
                    crm1.Gamma = Gamma;
                    crm1.GetShader(sh, false);
                    crm1closure = crm1.GetClosureSocket(sh);
                }
                else
                {
                    mat1sh       = sconv.CreateCyclesShader(Mat1Rm, Gamma);
                    mat1sh.Gamma = Gamma;
                    RhinoCyclesCore.Converters.BitmapConverter.ReloadTextures(mat1sh);
                }
            }
            if (Mat2Rm != null)
            {
                if (Mat2Rm is ICyclesMaterial)
                {
                    crm2       = Mat2Rm as ICyclesMaterial;
                    crm2.Gamma = Gamma;
                    crm2.GetShader(sh, false);
                    crm2closure = crm2.GetClosureSocket(sh);
                }
                else
                {
                    mat2sh       = sconv.CreateCyclesShader(Mat2Rm, Gamma);
                    mat2sh.Gamma = Gamma;
                    RhinoCyclesCore.Converters.BitmapConverter.ReloadTextures(mat2sh);
                }
            }

            RhinoCyclesCore.Shaders.RhinoFullNxt fnMat1 = null;
            ClosureSocket fnMat1Closure = null;

            if (mat1sh != null)
            {
                fnMat1        = new RhinoCyclesCore.Shaders.RhinoFullNxt(null, mat1sh, sh, false);
                fnMat1Closure = fnMat1.GetClosureSocket();
            }

            RhinoCyclesCore.Shaders.RhinoFullNxt fnMat2 = null;
            ClosureSocket fnMat2Closure = null;

            if (mat2sh != null)
            {
                fnMat2        = new RhinoCyclesCore.Shaders.RhinoFullNxt(null, mat2sh, sh, false);
                fnMat2Closure = fnMat2.GetClosureSocket();
            }

            ccl.ShaderNodes.TextureCoordinateNode texco = new ccl.ShaderNodes.TextureCoordinateNode($"texcos{Serial}");
            sh.AddNode(texco);

            ccl.ShaderNodes.DiffuseBsdfNode diffuse1Bsdf = new ccl.ShaderNodes.DiffuseBsdfNode();
            diffuse1Bsdf.ins.Color.Value = Mat1;
            ccl.ShaderNodes.DiffuseBsdfNode diffuse2Bsdf = new ccl.ShaderNodes.DiffuseBsdfNode();
            diffuse2Bsdf.ins.Color.Value = Mat2;
            sh.AddNode(diffuse1Bsdf);
            sh.AddNode(diffuse2Bsdf);

            blendit.ins.Fac.Value = Blend;

            GraphForSlot(sh, BlendTexOn, BlendTex, blendit.ins.Fac, texco, true);

            var sock1 = fnMat1Closure ?? crm1closure ?? diffuse1Bsdf.outs.BSDF;

            sock1.Connect(blendit.ins.Closure1);
            var sock2 = fnMat2Closure ?? crm2closure ?? diffuse2Bsdf.outs.BSDF;

            sock2.Connect(blendit.ins.Closure2);

            blendit.outs.Closure.Connect(sh.Output.ins.Surface);

            if (finalize)
            {
                sh.FinalizeGraph();
            }
            return(true);
        }
        public bool GetShader(Shader sh, bool finalize)
        {
            blendit = new ccl.ShaderNodes.MixClosureNode($"blendit{Serial}");
            sh.AddNode(blendit);

            LinearWorkflow linearWorkflow = new LinearWorkflow();

            linearWorkflow.PostProcessGamma   = Gamma;
            linearWorkflow.PreProcessGamma    = Gamma;
            linearWorkflow.PostProcessGammaOn = Gamma != 1.0f;
            linearWorkflow.PreProcessColors   = linearWorkflow.PreProcessTextures = linearWorkflow.PostProcessGammaOn;

            RhinoCyclesCore.Converters.ShaderConverter sconv = new RhinoCyclesCore.Converters.ShaderConverter();
            CyclesShader    mat1sh      = null;
            CyclesShader    mat2sh      = null;
            ICyclesMaterial crm1        = null;
            ICyclesMaterial crm2        = null;
            ClosureSocket   crm1closure = null;
            ClosureSocket   crm2closure = null;

            if (Mat1Rm != null)
            {
                if (Mat1Rm is ICyclesMaterial)
                {
                    crm1       = Mat1Rm as ICyclesMaterial;
                    crm1.Gamma = Gamma;
                    crm1.GetShader(sh, false);
                    crm1closure = crm1.GetClosureSocket(sh);
                }
                else
                {
                    mat1sh       = sconv.CreateCyclesShader(Mat1Rm, linearWorkflow, Mat1Rm.RenderHashExclude(CrcRenderHashFlags.ExcludeLinearWorkflow, "", linearWorkflow), BitmapConverter, null);
                    mat1sh.Gamma = Gamma;
                    BitmapConverter.ReloadTextures(mat1sh);
                }
            }
            if (Mat2Rm != null)
            {
                if (Mat2Rm is ICyclesMaterial)
                {
                    crm2       = Mat2Rm as ICyclesMaterial;
                    crm2.Gamma = Gamma;
                    crm2.GetShader(sh, false);
                    crm2closure = crm2.GetClosureSocket(sh);
                }
                else
                {
                    mat2sh       = sconv.CreateCyclesShader(Mat2Rm, linearWorkflow, Mat2Rm.RenderHashExclude(CrcRenderHashFlags.ExcludeLinearWorkflow, "", linearWorkflow), BitmapConverter, null);
                    mat2sh.Gamma = Gamma;
                    BitmapConverter.ReloadTextures(mat2sh);
                }
            }

            RhinoCyclesCore.Shaders.RhinoFullNxt fnMat1 = null;
            ClosureSocket fnMat1Closure = null;

            if (mat1sh != null)
            {
                fnMat1        = new RhinoCyclesCore.Shaders.RhinoFullNxt(null, mat1sh, sh, false);
                fnMat1Closure = fnMat1.GetClosureSocket();
            }

            RhinoCyclesCore.Shaders.RhinoFullNxt fnMat2 = null;
            ClosureSocket fnMat2Closure = null;

            if (mat2sh != null)
            {
                fnMat2        = new RhinoCyclesCore.Shaders.RhinoFullNxt(null, mat2sh, sh, false);
                fnMat2Closure = fnMat2.GetClosureSocket();
            }

            ccl.ShaderNodes.TextureCoordinateNode texco = new ccl.ShaderNodes.TextureCoordinateNode($"texcos{Serial}");
            sh.AddNode(texco);

            ccl.ShaderNodes.DiffuseBsdfNode diffuse1Bsdf = new ccl.ShaderNodes.DiffuseBsdfNode();
            diffuse1Bsdf.ins.Color.Value = Mat1;
            ccl.ShaderNodes.DiffuseBsdfNode diffuse2Bsdf = new ccl.ShaderNodes.DiffuseBsdfNode();
            diffuse2Bsdf.ins.Color.Value = Mat2;
            sh.AddNode(diffuse1Bsdf);
            sh.AddNode(diffuse2Bsdf);

            blendit.ins.Fac.Value = Blend.Amount;

            ccl.ShaderNodes.ValueNode blendValue = new ccl.ShaderNodes.ValueNode("blendValue");
            sh.AddNode(blendValue);
            blendValue.Value = Blend.Amount;

            GraphForSlot(sh, blendValue.outs.Value, Blend.On, Blend.Amount, BlendTex, blendit.ins.Fac.ToList(), texco, true);

            var sock1 = fnMat1Closure ?? crm1closure ?? diffuse1Bsdf.outs.BSDF;

            sock1.Connect(blendit.ins.Closure1);
            var sock2 = fnMat2Closure ?? crm2closure ?? diffuse2Bsdf.outs.BSDF;

            sock2.Connect(blendit.ins.Closure2);

            blendit.outs.Closure.Connect(sh.Output.ins.Surface);

            if (finalize)
            {
                sh.FinalizeGraph();
            }
            return(true);
        }
Exemplo n.º 6
0
        static void Main(string[] args)
        {
            var file = "";

            if (args.Length < 1 || args.Length > 2)
            {
                Console.WriteLine("Wrong count parameter: csycles_tester [--quiet] file.xml");
                return;
            }

            var s = args[args.Length - 1];

            if (!File.Exists(s))
            {
                Console.WriteLine("File {0} doesn't exist.", s);
                return;
            }

            var silent = args.Length == 2 && "--quiet".Equals(args[0]);

            file = Path.GetFullPath(s);
            Console.WriteLine("We get file path: {0}", file);

            var path     = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) ?? "";
            var userpath = Path.Combine(path, "userpath");

            CSycles.path_init(path, userpath);
            CSycles.initialise();

            const uint samples = 50;

            g_update_callback             = StatusUpdateCallback;
            g_update_render_tile_callback = UpdateRenderTileCallback;
            g_write_render_tile_callback  = WriteRenderTileCallback;
            g_logger_callback             = LoggerCallback;

            var client = new Client();

            Client = client;

            /*if (!silent)
             * {
             *      CSycles.set_logger(client.Id, g_logger_callback);
             * }*/

            foreach (var adev in Device.Devices)
            {
                Console.WriteLine("{0}", adev);
            }

            Console.WriteLine("All device capabilities: {0}", Device.Capabilities);

            var dev = Device.FirstCuda;

            Console.WriteLine("Using device {0} {1}", dev.Name, dev.Description);

            var scene_params = new SceneParameters(client, ShadingSystem.SVM, BvhType.Static, false, false, false);
            var scene        = new Scene(client, scene_params, dev);

            Console.WriteLine("Default surface shader {0}", scene.DefaultSurface.Name);

            #region background shader
            var background_shader = new Shader(client, Shader.ShaderType.World)
            {
                Name = "Background shader"
            };

            var bgnode = new BackgroundNode();
            bgnode.ins.Color.Value    = new float4(0.7f);
            bgnode.ins.Strength.Value = 1.0f;

            background_shader.AddNode(bgnode);
            bgnode.outs.Background.Connect(background_shader.Output.ins.Surface);
            background_shader.FinalizeGraph();

            scene.AddShader(background_shader);

            scene.Background.Shader     = background_shader;
            scene.Background.AoDistance = 0.0f;
            scene.Background.AoFactor   = 0.0f;
            scene.Background.Visibility = PathRay.AllVisibility;
            #endregion
            #region diffuse shader

            var diffuse_shader = create_some_setup_shader();
            scene.AddShader(diffuse_shader);
            scene.DefaultSurface = diffuse_shader;
            #endregion

            #region point light shader

            var light_shader = new Shader(client, Shader.ShaderType.Material)
            {
                Name = "Tester light shader"
            };

            var emission_node = new EmissionNode();
            emission_node.ins.Color.Value    = new float4(0.8f);
            emission_node.ins.Strength.Value = 10.0f;

            light_shader.AddNode(emission_node);
            emission_node.outs.Emission.Connect(light_shader.Output.ins.Surface);
            light_shader.FinalizeGraph();
            scene.AddShader(light_shader);
            #endregion

            var xml = new XmlReader(client, file);
            xml.Parse(silent);
            var width  = (uint)scene.Camera.Size.Width;
            var height = (uint)scene.Camera.Size.Height;

            var session_params = new SessionParameters(client, dev)
            {
                Experimental      = false,
                Samples           = (int)samples,
                TileSize          = new Size(64, 64),
                StartResolution   = 64,
                Threads           = (uint)(dev.IsCpu ? 0 : 0),
                ShadingSystem     = ShadingSystem.SVM,
                Background        = true,
                ProgressiveRefine = false
            };
            Session = new Session(client, session_params, scene);
            Session.Reset(width, height, samples);

            if (!silent)
            {
                Session.UpdateCallback     = g_update_callback;
                Session.UpdateTileCallback = g_update_render_tile_callback;
                Session.WriteTileCallback  = g_write_render_tile_callback;
            }
            CSycles.set_logger(client.Id, g_logger_callback);

            Session.Start();
            Session.Wait();

            uint bufsize;
            uint bufstride;
            CSycles.session_get_buffer_info(client.Id, Session.Id, out bufsize, out bufstride);
            var pixels = CSycles.session_copy_buffer(client.Id, Session.Id, bufsize);

            var bmp = new Bitmap((int)width, (int)height);
            for (var x = 0; x < width; x++)
            {
                for (var y = 0; y < height; y++)
                {
                    var i = y * (int)width * 4 + x * 4;
                    var r = ColorClamp((int)(pixels[i] * 255.0f));
                    var g = ColorClamp((int)(pixels[i + 1] * 255.0f));
                    var b = ColorClamp((int)(pixels[i + 2] * 255.0f));
                    var a = ColorClamp((int)(pixels[i + 3] * 255.0f));
                    bmp.SetPixel(x, y, Color.FromArgb(a, r, g, b));
                }
            }
            bmp.Save("test.png", ImageFormat.Png);

            Console.WriteLine("Cleaning up :)");

            CSycles.shutdown();

            Console.WriteLine("Done");
        }