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 :)");
}