public void inst_main (String[] argv, ILog ilog) { if (argv.Length >= 2) { width = Int32.Parse (argv [0]); height = Int32.Parse (argv [1]); } canvas = new Canvas (width, height); new Scene ().RenderScene (canvas, width, 0, 1); canvas.WriteDiag (ilog); }
/** * RenderScene */ public void RenderScene (Canvas canvas, int width, int section, int nsections) { Vector view = camera.GetViewDir (); Vector up = camera.GetOrthoUp (); Vector plane = new Vector (); Vector horIncr = new Vector (); Vector vertIncr = new Vector (); double ylen = camera.GetFocalDist () * (double)Math.Tan (0.5f * camera.GetFOV ()); double xlen = ylen * canvas.GetWidth () / canvas.GetHeight (); Point upleft = new Point (); Point upright = new Point (); Point lowleft = new Point (); Point basepoint = new Point (); Point current; Ray eyeRay = new Ray (); int ypixel, xpixel; RayID = 1; plane.Cross (view, up); view.Scale (camera.GetFocalDist ()); up.Scale (ylen); plane.Scale (-xlen); upleft.FindCorner (view, up, plane, camera.GetPosition ()); plane.Negate (); upright.FindCorner (view, up, plane, camera.GetPosition ()); up.Negate (); plane.Negate (); lowleft.FindCorner (view, up, plane, camera.GetPosition ()); horIncr.Sub (upright, upleft); horIncr.Scale (horIncr.Length () / ((double)canvas.GetWidth ())); vertIncr.Sub (lowleft, upleft); vertIncr.Scale (vertIncr.Length () / ((double)canvas.GetHeight ())); basepoint.Set (upleft.GetX () + 0.5f * (horIncr.GetX () + vertIncr.GetX ()), upleft.GetY () + 0.5f * (horIncr.GetY () + vertIncr.GetY ()), upleft.GetZ () + 0.5f * (horIncr.GetZ () + vertIncr.GetZ ())); eyeRay.SetOrigin (camera.GetPosition ()); int xstart = section * width / nsections; int xend = xstart + width / nsections; MainCL.logger.InfoFormat ("+" + xstart + " to " + (xend - 1) + " by " + canvas.GetHeight ()); for (ypixel = 0; ypixel < canvas.GetHeight (); ypixel++) { current = new Point (basepoint); for (xpixel = 0; xpixel < canvas.GetWidth (); xpixel++) { if (xpixel >= xstart && xpixel < xend) { Color color = new Color (0.0f, 0.0f, 0.0f); eyeRay.GetDirection ().Sub (current, eyeRay.GetOrigin ()); eyeRay.GetDirection ().Normalize (); eyeRay.SetID (RayID); this.RayID = this.RayID + 1; Shade (octree, eyeRay, color, 1.0f, 0, 0); canvas.Write (Brightness, xpixel, ypixel, color); } current.Add (horIncr); } basepoint.Add (vertIncr); } MainCL.logger.InfoFormat ("-" + xstart + " to " + (xend - 1) + " by " + canvas.GetHeight ()); }