public static void RenderTo(this Image <Rgba32> image, IViewportToWindowTransform v2w, float viewDistance, Matrix4x4 viewing, Vector3 eye, IEnumerable <Traceable> objects, IEnumerable <Light> lights, Color ambientLight) { var sw = new System.Diagnostics.Stopwatch(); sw.Start(); Parallel.For(0, image.Height, (y, state) => { Ray ray; Vector3 viewingPoint; Vector3 worldPoint; Color color; PointF viewportPoint; PointF windowPoint = new PointF(0, 0); for (var x = 0; x < image.Width; x++) { viewportPoint = new PointF(x, y); windowPoint = v2w.Transform(viewportPoint); viewingPoint = new Vector3(windowPoint.X, windowPoint.Y, viewDistance); worldPoint = viewing.Image(viewingPoint); ray = Ray.CreateFromPoints(eye, worldPoint); color = ray.Trace(objects, lights, eye, ambientLight); image[x, y] = new Rgba32(color.R, color.G, color.B); } }); Console.WriteLine("Elapsed: " + sw.Elapsed); }
public Ray GetLocalRay(Ray ray) { var worldOrigin = ray.Origin; var worldPoint = ray.PointAt(1); var localOrigin = Model.Inverse.Image(worldOrigin); var localPoint = Model.Inverse.Image(worldPoint); return(Ray.CreateFromPoints(localOrigin, localPoint)); }