/// <summary> /// Entry point for a new render process. This is to be done in a separate thread. /// </summary> public void Renderer() { var cyclesEngine = this; var client = cyclesEngine.Client; var rw = cyclesEngine.RenderWindow; if (rw == null) return; // we don't have a window to write to... var size = cyclesEngine.RenderDimension; var samples = cyclesEngine.Settings.Samples; maxSamples = samples; #region pick a render device var renderDevice = cyclesEngine.Settings.SelectedDevice == -1 ? Device.FirstCuda : Device.GetDevice(cyclesEngine.Settings.SelectedDevice); if (cyclesEngine.Settings.Verbose) sdd.WriteLine( $"Using device {renderDevice.Name + " " + renderDevice.Description}"); #endregion var scene = CreateScene(client, renderDevice, cyclesEngine); #region set up session parameters var sessionParams = new SessionParameters(client, renderDevice) { Experimental = false, Samples = samples, TileSize = renderDevice.IsGpu ? new Size(256, 256) : new Size(32, 32), TileOrder = TileOrder.Center, Threads = (uint)(renderDevice.IsGpu ? 0 : cyclesEngine.Settings.Threads), ShadingSystem = ShadingSystem.SVM, Background = false, DisplayBufferLinear = true, ProgressiveRefine = true, Progressive = true, }; #endregion if (cyclesEngine.CancelRender) return; #region create session for scene cyclesEngine.Session = new Session(client, sessionParams, scene); #endregion // register callbacks before starting any rendering cyclesEngine.SetCallbacks(); // main render loop, including restarts #region start the rendering thread, wait for it to complete, we're rendering now! //cyclesEngine.Database.OneShot(); cyclesEngine.m_flush = false; cyclesEngine.UploadData(); // lets first reset session cyclesEngine.Session.Reset((uint)size.Width, (uint)size.Height, (uint)samples); // then reset scene cyclesEngine.Session.Scene.Reset(); // and actually start // we're rendering again cyclesEngine.Session.Start(); // ... aaaaand we wait cyclesEngine.Session.Wait(); cyclesEngine.CancelRender = true; #endregion if (RcCore.It.EngineSettings.SaveDebugImages) { var tmpf = $"{Environment.GetEnvironmentVariable("TEMP")}\\RC_modal_renderer.png"; cyclesEngine.RenderWindow.SaveRenderImageAs(tmpf, true); } // we're done now, so lets clean up our session. cyclesEngine.Session.Destroy(); cyclesEngine.Database?.Dispose(); // set final status string and progress to 1.0f to signal completed render cyclesEngine.SetProgress(rw, $"Render ready {cyclesEngine.RenderedSamples + 1} samples, duration {cyclesEngine.TimeString}", 1.0f); cyclesEngine.CancelRender = true; // signal the render window we're done. rw.EndAsyncRender(RenderWindow.RenderSuccessCode.Completed); }
public void RenderScene(string scenename) { var dev = Device.FirstGpu; 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); var xml = new CSyclesXmlReader(Client, scenename); xml.Parse(false); 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, Progressive = false, TileOrder = TileOrder.HilbertSpiral }; var Session = new Session(Client, session_params, scene); Session.Reset(width, height, samples); g_write_render_tile_callback = WriteRenderTileCallback; Session.WriteTileCallback = g_write_render_tile_callback; /*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 ed.Bitmap((int)width, (int)height, Eto.Drawing.PixelFormat.Format32bppRgba); for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { var i = y * (int)width * 4 + x * 4; bmp.SetPixel(x, y, new ed.Color(Math.Min(pixels[i], 1.0f), Math.Min(pixels[i + 1], 1.0f), Math.Min(pixels[i + 2], 1.0f), Math.Min(pixels[i + 3], 1.0f))); } } bmp.Save("test.png", Eto.Drawing.ImageFormat.Png); Result = bmp; Session.Destroy(); Console.WriteLine("Cleaning up :)"); }
/// <summary> /// Renderer entry point for preview rendering /// </summary> /// <param name="oPipe"></param> public static void Renderer(object oPipe) { var cyclesEngine = (PreviewRenderEngine)oPipe; var client = cyclesEngine.Client; var size = cyclesEngine.RenderDimension; var samples = cyclesEngine.Settings.Samples; #region pick a render device var renderDevice = cyclesEngine.Settings.SelectedDevice == -1 ? Device.FirstCuda : Device.GetDevice(cyclesEngine.Settings.SelectedDevice); if (cyclesEngine.Settings.Verbose) sdd.WriteLine( $"Using device {renderDevice.Name + " " + renderDevice.Description}"); #endregion if (cyclesEngine.CancelRender) return; var scene = CreateScene(client, renderDevice, cyclesEngine); #region set up session parameters var sessionParams = new SessionParameters(client, renderDevice) { Experimental = false, Samples = samples, TileSize = renderDevice.IsCuda ? new Size(256, 256) : new Size(32, 32), TileOrder = TileOrder.HilbertSpiral, Threads = (uint)(renderDevice.IsCuda ? 0 : cyclesEngine.Settings.Threads), ShadingSystem = ShadingSystem.SVM, Background = true, DisplayBufferLinear = true, ProgressiveRefine = true, Progressive = true, }; #endregion if (cyclesEngine.CancelRender) return; #region create session for scene cyclesEngine.Session = new Session(client, sessionParams, scene); #endregion // register callbacks before starting any rendering cyclesEngine.SetCallbacks(); // main render loop cyclesEngine.m_flush = false; cyclesEngine.UploadData(); // lets first reset session cyclesEngine.Session.Reset((uint)size.Width, (uint)size.Height, (uint)samples); // then reset scene cyclesEngine.Session.Scene.Reset(); // and actually start // we're rendering again cyclesEngine.Session.Start(); // ... aaaaand we wait cyclesEngine.Session.Wait(); cyclesEngine.CancelRender = true; // we're done now, so lets clean up our session. cyclesEngine.Session.Destroy(); }
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, 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 = 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; }*/ 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"); }
/// <summary> /// Entry point for viewport interactive rendering /// </summary> public void Renderer() { var cyclesEngine = this; var client = cyclesEngine.Client; var rw = cyclesEngine.RenderWindow; if (rw == null) return; var samples = cyclesEngine.Settings.Samples; #region pick a render device var renderDevice = cyclesEngine.Settings.SelectedDevice == -1 ? Device.FirstCuda : Device.GetDevice(cyclesEngine.Settings.SelectedDevice); #endregion var scene = CreateScene(client, renderDevice, cyclesEngine); #region set up session parameters var sessionParams = new SessionParameters(client, renderDevice) { Experimental = false, Samples = samples, TileSize = renderDevice.IsCpu ? new Size(32, 32) : new Size(256, 256), TileOrder = TileOrder.Center, Threads = (uint)(renderDevice.IsCpu ? cyclesEngine.Settings.Threads : 0), ShadingSystem = ShadingSystem.SVM, StartResolution = renderDevice.IsCpu ? 16 : 64, SkipLinearToSrgbConversion = true, DisplayBufferLinear = true, Background = false, ProgressiveRefine = true, Progressive = true, }; #endregion if (cyclesEngine.CancelRender) return; #region create session for scene cyclesEngine.Session = new Session(client, sessionParams, scene); #endregion // register callbacks before starting any rendering cyclesEngine.SetCallbacks(); // main render loop, including restarts #region start the rendering thread, wait for it to complete, we're rendering now! cyclesEngine.CheckFlushQueue(); if (!cyclesEngine.CancelRender) { cyclesEngine.Synchronize(); } if (!cyclesEngine.CancelRender) { cyclesEngine.Session.Start(); } #endregion // We've got Cycles rendering now, notify anyone who cares cyclesEngine.RenderStarted?.Invoke(cyclesEngine, new RenderStartedEventArgs(!cyclesEngine.CancelRender)); while (!IsStopped) { Thread.Sleep(10); if(Flush) TriggerChangesReady(); } }