/// <summary> /// /// </summary> /// <param name="newQuality"></param> public void SetQuality(RenderingQuality newQuality) { if (newQuality == Quality) { return; } Quality = newQuality; if (newQuality == RenderingQuality.Fast) { RayTracer.MaxOctreeDepth = 0; } else if (newQuality == RenderingQuality.Best) { // TODO restore MaxOctreeDepth that was set before RayTracer.MaxOctreeDepth = 10; } }
/// <summary> /// initialization, shoud be called first (creates jobs, output buffers, ...) /// </summary> /// <param name="outputSize"></param> /// <param name="numberOfJobs"></param> /// <param name="numberOfThreads"></param> public void Initialize(Vector2i outputSize, Vector2i numberOfJobs, int?numberOfThreads) { Quality = RenderingQuality.Best; renderingJobs = new List <RenderingJob>(); frameRedrawnEvent = new ManualResetEvent(false); endOfRenderingEvent = new ManualResetEvent(false); OutputBufferSize = outputSize; CreateOutputBuffers(outputSize.X, outputSize.Y, sizeof(float)); Log.Instance.AddMsg(LogLevel.Info, string.Format("OutputWindow [size: {0}x{1} pixels]", outputSize.X, outputSize.Y)); var jobSize = new Vector2i(outputSize.X / numberOfJobs.X, outputSize.Y / numberOfJobs.Y); var jobBufferLength = (outputSize.X * outputSize.Y * 3 /*RGB*/) / (numberOfJobs.X * numberOfJobs.Y); #region create rendering jobs frameRenderedEvent = new CountdownEvent(numberOfJobs.X * numberOfJobs.Y); for (var y = 0; y < numberOfJobs.Y; y++) { for (var x = 0; x < numberOfJobs.X; x++) { var offset = IntPtr.Zero; unsafe { offset = (IntPtr)((ColorRGB *)outputBuffer + (x * jobSize.X + y * (jobSize.Y * OutputBufferSize.X))); } renderingJobs.Add(new RenderingJob(offset, new Vector2i(x * jobSize.X, y * jobSize.Y), new Vector2i(x, y), jobSize, OutputBufferSize.X - jobSize.X, Scene.Current.Camera, frameRenderedEvent)); } } #endregion #region set max number of threads in ThreadPool int wThreads, cThreads; if (numberOfThreads.HasValue) { // if numberOfThreads is 0, set max number of threads in thread pool to number of cores if (numberOfThreads.Value == 0) { numberOfThreads = Environment.ProcessorCount; } if (!ThreadPool.SetMaxThreads(numberOfThreads.Value, numberOfThreads.Value)) { throw new NotSupportedException(); } wThreads = cThreads = numberOfThreads.Value; } else { ThreadPool.GetMaxThreads(out wThreads, out cThreads); } int availableWThreads, availableCThreads; ThreadPool.GetAvailableThreads(out availableWThreads, out availableCThreads); #endregion Log.Instance.AddMsg(LogLevel.Info, string.Format("ThreadPool [available workerThreads: {0}/{1}; maxCompletionPortThreads: {2}/{3}]", availableWThreads, wThreads, availableCThreads, cThreads)); Log.Instance.AddMsg(LogLevel.Info, string.Format("RenderingJobs [count: {0}x{1}({2}); size: {3}x{4} pixels]", numberOfJobs.X.ToString(), numberOfJobs.Y, numberOfJobs.X * numberOfJobs.Y, jobSize.X, jobSize.Y)); }