private void toolStripRenderer_SelectedIndexChanged(object sender, EventArgs e) { RenderType renderType = this.toolStripRenderer.SelectedItem != null ? (RenderType)this.toolStripRenderer.SelectedItem : RenderType.RayTracer; StrategyType strategyType = this.toolStripStrategy.SelectedItem != null ? (StrategyType)this.toolStripStrategy.SelectedItem : StrategyType.Progressive; RenderStrategy strategy = new ProgressiveRenderStrategy(); switch (strategyType) { case StrategyType.Scanline: strategy = new ScanlineRenderStrategy(); break; case StrategyType.Progressive: strategy = new ProgressiveRenderStrategy(); break; } switch (renderType) { case RenderType.RayTracer: this.tracer = new RayTracer(UnifiedScenesRepository.Scenes[this.TabText], strategy); break; case RenderType.PhotonTracer: this.tracer = new PhotonTracer(UnifiedScenesRepository.Scenes[this.TabText], strategy, 500000); break; case RenderType.DistributedRayTracer: this.tracer = new DistributedRayTracer(UnifiedScenesRepository.Scenes[this.TabText], strategy); break; } }
public abstract void Render(RayCasting rayCasting, IEnumerable<TiledBitmap.Tile> tiles);
private void DocumentWindow_FormClosed(object sender, FormClosedEventArgs e) { this.tracer = null; UnifiedScenesRepository.Scenes.Remove(this.TabText); GC.Collect(); GC.WaitForPendingFinalizers(); }
public override void Render(RayCasting caster, IEnumerable<TiledBitmap.Tile> tiles) { #region Progressive Render from http://www.cc.gatech.edu/~phlosoft/photon/ //float resX = caster.Scene.DefaultCamera.ResX; //g.VisibleClipBounds.Width; //float resY = caster.Scene.DefaultCamera.ResY; //g.VisibleClipBounds.Height; ManualResetEvent fineshedHandle = new ManualResetEvent(false); IEnumerable<TiledBitmap.Tile> imgTiles = tiles as IList<TiledBitmap.Tile> ?? tiles.ToList(); int numberOfWorkers = imgTiles.Count(); foreach (var imgTile in imgTiles) { caster = caster.Clone(); Tuple<RayCasting, TiledBitmap.Tile> casterTile = new Tuple<RayCasting, TiledBitmap.Tile>(caster, imgTile); ThreadPool.QueueUserWorkItem(state => { try { Tuple<RayCasting, TiledBitmap.Tile> localCasterAndTile = state as Tuple<RayCasting, TiledBitmap.Tile>; TiledBitmap.Tile tile = localCasterAndTile.Item2; RayCasting caster1 = localCasterAndTile.Item1; tile.CompleteCycle(TiledBitmap.RenderCycleType.Start); int iterations = 0; int pCol = 0, pRow = 0, pIteration = 1, pMax = 2; float resTotal = tile.Width * tile.Height; while (iterations < resTotal) { //Render Pixels Out of Order With Increasing Resolution: 2x2, 4x4, 16x16... 512x512 if (pCol >= pMax) { pRow++; pCol = 0; if (pRow >= pMax) { pIteration++; pRow = 0; pMax <<= 1; //Equals: pMax = (int)Math.Pow(2, pIteration); } } bool pNeedsDrawing = (pIteration == 1 || (pRow % 2 != 0) || (pRow % 2 == 0 && (pCol % 2 != 0))); float x = pCol * (tile.Width / pMax) + tile.X; float y = pRow * (tile.Height / pMax) + tile.Y; pCol++; if (pNeedsDrawing) { iterations++; Ray ray; RGBColor finalColor = RGBColor.Black; if (caster1.Scene.Sampler.NumberOfSamples > 1) { foreach (Point2D sample in caster1.Scene.Sampler.GetSamplesFor(x, y)) { //ray = this.scene.DefaultCamera.CreateRayFromScreen(x + sample.X, y + sample.Y); ray = caster1.Scene.DefaultCamera.CreateRayFromScreen(sample.X , sample.Y); ray.PrevRefractIndex = caster1.Scene.RefractIndex; finalColor += caster1.Trace(ray, 0); } //brush.Color = (finalColor * (1f / this.scene.Sampler.NumberOfSamples)).ToColor(); finalColor = (finalColor / caster1.Scene.Sampler.NumberOfSamples); //Graphics graphics = Graphics.FromImage(tile.Image); tile.Graphics.FillRectangle(new SolidBrush(finalColor.ToColor()), x - tile.X, y - tile.Y, (tile.Width / pMax), (tile.Height / pMax)); //graphics.Flush(); //graphics.Dispose(); } else { ray = caster1.Scene.DefaultCamera.CreateRayFromScreen(x , y ); finalColor = caster1.Trace(ray, 0); // Debug.WriteLine("Graphics: " + tile.Graphics.GetHashCode()); tile.Graphics.FillRectangle(new SolidBrush(finalColor.ToColor()), x - tile.X, y - tile.Y, (tile.Width / pMax), (tile.Height / pMax)); //tile.Graphics.Flush(FlushIntention.Sync); } tile.CompleteCycle(TiledBitmap.RenderCycleType.Partial); } } tile.CompleteCycle(TiledBitmap.RenderCycleType.Finish); } finally { if (Interlocked.Decrement(ref numberOfWorkers) == 0) { fineshedHandle.Set(); } } }, casterTile); }//); fineshedHandle.WaitOne(); #endregion }