void CyclesPassRendered(object sender, ViewportRenderEngine.PassRenderedEventArgs e) { if (_cycles?.IsRendering ?? false) { if (e.Sample <= 1) SetView(e.View); _frameAvailable = true; _available = true; SignalRedraw(); } }
void CyclesRenderStarted(object sender, ViewportRenderEngine.RenderStartedEventArgs e) { _available = false; }
public override bool StartRenderer(int w, int h, RhinoDoc doc, ViewInfo rhinoView, ViewportInfo viewportInfo, bool forCapture, RenderWindow renderWindow) { _started = true; if (forCapture) { ModalRenderEngine mre = new ModalRenderEngine(doc, PlugIn.IdFromName("RhinoCycles"), rhinoView, viewportInfo); _cycles = null; _modal = mre; mre.Settings = RcCore.It.EngineSettings; mre.Settings.UseInteractiveRenderer = false; mre.Settings.SetQuality(doc.RenderSettings.AntialiasLevel); var rs = new Size(w, h); mre.RenderWindow = renderWindow; mre.RenderDimension = rs; mre.Database.RenderDimension = rs; mre.Settings.Verbose = true; mre.StatusTextUpdated += Mre_StatusTextUpdated; mre.Database.LinearWorkflowChanged += DatabaseLinearWorkflowChanged; mre.SetFloatTextureAsByteTexture(false); // mre.Settings.RenderDeviceIsOpenCl); mre.CreateWorld(); // has to be done on main thread, so lets do this just before starting render session _modalThread = new Thread(RenderOffscreen) { Name = $"Cycles offscreen viewport rendering with ModalRenderEngine {_serial}" }; _modalThread.Start(mre); return true; } _available = false; // the renderer hasn't started yet. It'll tell us when it has. _frameAvailable = false; _cycles = new ViewportRenderEngine(doc.RuntimeSerialNumber, PlugIn.IdFromName("RhinoCycles"), rhinoView); _cycles.StatusTextUpdated += CyclesStatusTextUpdated; // render engine tells us status texts for the hud _cycles.RenderStarted += CyclesRenderStarted; // render engine tells us when it actually is rendering _cycles.StartSynchronizing += CyclesStartSynchronizing; _cycles.Synchronized += CyclesSynchronized; _cycles.PassRendered += CyclesPassRendered; _cycles.Database.LinearWorkflowChanged += DatabaseLinearWorkflowChanged; _cycles.SamplesChanged += CyclesSamplesChanged; _cycles.Settings = RcCore.It.EngineSettings; _cycles.Settings.SetQuality(doc.RenderSettings.AntialiasLevel); var renderSize = Rhino.Render.RenderPipeline.RenderSize(doc); _cycles.RenderWindow = renderWindow; _cycles.RenderDimension = renderSize; _cycles.Settings.Verbose = true; _maxSamples = _cycles.Settings.Samples; _cycles.SetFloatTextureAsByteTexture(false); // m_cycles.Settings.RenderDeviceIsOpenCl); _cycles.CreateWorld(); // has to be done on main thread, so lets do this just before starting render session _startTime = DateTime.UtcNow; _cycles.StartRenderThread(_cycles.Renderer, $"A cool Cycles viewport rendering thread {_serial}"); return true; }