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); } }
/// <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); } } } }