public void Renderer()
        {
            MyAsyncRenderContext aRC = this;
            RenderWindow         rw  = aRC.RenderWindow;

            if (null != rw)
            {
                Size size = rw.Size();
                using (RenderWindow.Channel channel = rw.OpenChannel(Rhino.Render.RenderWindow.StandardChannels.RGBA))
                {
                    for (int x = 0; x < size.Width; x++)
                    {
                        for (int y = 0; y < size.Height; y++)
                        {
                            Rhino.Display.Color4f color = new Rhino.Display.Color4f(y / (float)size.Width, x / (float)size.Height, 1.0f, 1.0f);
                            channel.SetValue(x, y, color);
                            rw.Invalidate();
                            Thread.Sleep(0);
                        }
                        float progress = x / (float)size.Width;
                        rw.SetProgress(String.Format("Rendering C# rendering {0:d}% complete", (int)(progress * 100.0f)), progress);
                        Thread.Sleep(1);

                        if (aRC.CancelRender)
                        {
                            break;
                        }
                    }
                    rw.SetProgress("Rendering complete", 1.0f);
                    Thread.Sleep(10);
                }

                rw.EndAsyncRender(RenderWindow.RenderSuccessCode.Completed);
            }
        }
예제 #2
0
        /// <summary>
        /// Update the RenderWindow or RenderBitmap with the updated tile from
        /// Cycles render progress.
        /// </summary>
        /// <param name="sessionId"></param>
        /// <param name="tx"></param>
        /// <param name="ty"></param>
        /// <param name="tw"></param>
        /// <param name="th"></param>
        public void DisplayBuffer(uint sessionId, uint tx, uint ty, uint tw, uint th, PassType passtype, ref float[] pixels, int pixlen, int stride)
        {
            if (IsStopped)
            {
                return;
            }
            //(var width, var height) =  RenderDimension;
            var width  = RenderDimension.Width;
            var height = RenderDimension.Height;

            if (RenderWindow != null)
            {
                using (RenderWindow.Channel channel = RenderWindow.OpenChannel(RenderWindow.StandardChannels.RGBA),
                       nx = RenderWindow.OpenChannel(RenderWindow.StandardChannels.NormalX),
                       ny = RenderWindow.OpenChannel(RenderWindow.StandardChannels.NormalY),
                       nz = RenderWindow.OpenChannel(RenderWindow.StandardChannels.NormalZ),
                       depth = RenderWindow.OpenChannel(RenderWindow.StandardChannels.DistanceFromCamera)
                       )
                {
                    if (channel != null)
                    {
                        var rect = new Rectangle((int)tx, (int)ty, (int)tw, (int)th);
                        for (var x = 0; x < (int)tw; x++)
                        {
                            for (var y = 0; y < (int)th; y++)
                            {
                                var i = y * tw * stride + x * stride;
                                var r = pixels[i];
                                var g = stride > 1 ? pixels[i + 1] : 1.0f;
                                var b = stride > 2 ? pixels[i + 2] : 1.0f;
                                var a = stride > 3 ? pixels[i + 3] : 1.0f;
                                if (stride == 1)
                                {
                                    g = b = r;
                                }
                                if (passtype != PassType.Combined)
                                {
                                    a = 1.0f;
                                }

                                var c4_f = new Color4f(r, g, b, a);

                                var cox = (int)tx + x;
                                var coy = height - ((int)ty + y + 1);
                                if (channel != null && passtype == PassType.Combined)
                                {
                                    channel.SetValue(cox, coy, c4_f);
                                }
                                else if (nx != null && ny != null && nz != null && passtype == PassType.Normal)
                                {
                                    nx.SetValue(cox, coy, r);
                                    ny.SetValue(cox, coy, g);
                                    nz.SetValue(cox, coy, b);
                                }
                                else if (depth != null && passtype == PassType.Depth)
                                {
                                    depth.SetValue(cox, coy, r);
                                }
                            }
                        }
                        RenderWindow.InvalidateArea(rect);
                    }
                }
            }
        }