/// <summary> /// Renders the world on a single thread [deprecated, use RenderSceneMultiThreaded] /// </summary> /// <param name="world">World reference</param> public override void RenderScene(World worldRef) { RGBColor lightingSum; ViewPlane vp = worldRef.CurrentViewPlane; Ray ray = new Ray(_eye,new Vect3D(0,0,0)); int depth = 0; //Depth of recursion Point2D sp = new Point2D(); //Sample point on a unit square Point2D pp = new Point2D(); ; //Sample point translated into screen space worldRef.OpenWindow(vp.HorizontalResolution, vp.VerticalResolution); vp.PixelSize /= _zoom; for(int row = 0; row < vp.VerticalResolution; row++) { for(int column = 0; column < vp.HorizontalResolution; column++) { lightingSum = GlobalVars.COLOR_BLACK; //Start with no color, everything is additive for(int sample = 0; sample < vp.NumSamples; sample ++) { sp = worldRef.CurrentViewPlane.ViewPlaneSampler.SampleUnitSquare(); pp.coords.X = worldRef.CurrentViewPlane.PixelSize * (column - 0.5f * vp.HorizontalResolution + sp.coords.X); pp.coords.Y = worldRef.CurrentViewPlane.PixelSize * (row - 0.5f * vp.VerticalResolution + sp.coords.Y); ray.Direction = GetRayDirection(pp); lightingSum = lightingSum + worldRef.CurrentTracer.TraceRay(ray, depth); } lightingSum /= vp.NumSamples; lightingSum *= _exposureTime; worldRef.DisplayPixel(row, column, lightingSum); //Poll events in live render view worldRef.PollEvents(); } } }
static void Main(string[] args) { bool multithread = false; int threads = 2; int a = 0; int numArgs = args.Length; if(numArgs == 0) { Console.WriteLine("Usage: scsraytracer -I \"Input XML path\" -O \"Output bmp path\""); Console.WriteLine("Additional options:\n-V: Verbose output, default off\n-T #: Number of threads"); Console.ReadKey(); return; } try { //Cycle through all arguments while (a < numArgs) { string arg = args[a]; if (arg.Equals("-I") && GlobalVars.inFile == null) { if ((a + 1 < numArgs) && File.Exists(args[a+1])) { GlobalVars.inFile = args[a + 1]; a += 2; } else { throw new ArgumentException("Invalid input file location"); } } else if (arg.Equals("-O") && GlobalVars.outFile == null) { if ((a + 1 < numArgs)) { GlobalVars.outFile = args[a + 1]; a += 2; } else { throw new ArgumentException("Invalid output file location"); } } else if (arg.Equals("-V")) { GlobalVars.verbose = true; a++; } else if (arg.Equals("-T")) { multithread = true; threads = Convert.ToInt32(args[a + 1]); a += 2; } } if(GlobalVars.outFile == null) { throw new ArgumentException(); } if(File.Exists(GlobalVars.outFile)) { GetUserInput: Console.Write("File " + GlobalVars.outFile + " exists! Overwrite? (y/n): "); switch(Console.ReadKey().KeyChar) { case 'y': //do nothing break; case 'n': Console.WriteLine("\nOk, exiting now."); return; default: Console.Write("\n"); goto GetUserInput; } } } catch (ArgumentException e) { Console.WriteLine(e.ToString()); Console.WriteLine("Usage: scsraytracer -I \"Input XML path\" -O \"Output bmp path\""); Console.WriteLine("Additional options:\n-V: Verbose output, default off\n-T #: Number of threads"); Console.ReadKey(); return; } //Elevate process priority to high using (Process p = Process.GetCurrentProcess()) p.PriorityClass = ProcessPriorityClass.High; World w = new World(); GlobalVars.WORLD_REF = w; w.Build(); w.OpenWindow(w.CurrentViewPlane.HorizontalResolution, w.CurrentViewPlane.VerticalResolution); //GlobalVars.frameno = 120; //w.Animate(); //while (GlobalVars.frameno < 130) //{ //w.camera.setEye(new Point3D(200, 200, GlobalVars.cam_zcoord)); // w.camera.setLookat(new Point3D(0, 0, GlobalVars.lookat_zcoord)); // w.camera.compute_uvw(); switch (multithread) { case false: w.Camera.RenderSceneMultithreaded(w, 1); break; case true: w.Camera.RenderSceneMultithreaded(w, threads); break; } w.SaveDisplayedImage(GlobalVars.outFile); //w.SaveDisplayedImage("E:\\weird\\frame_" + GlobalVars.frameno + ".bmp"); // GlobalVars.cam_zcoord -= 10; // GlobalVars.lookat_zcoord -= 10; // GlobalVars.frameno += 1; //GlobalVars.frameno+=1; //w.Animate(); //} while(!GlobalVars.should_close) { w.PollEvents(); } }