private Color TraceRay(Ray ray, Scene scene, int depth) { ISect isect = IntersectRay(ray, scene); if (isect == null) { return(Color.Background); } return(Shade(isect, scene, depth)); }
private double TestRay(Ray ray, Scene scene) { ISect isect = IntersectRay(ray, scene); if (isect == null) { return(0); } return(isect.Dist); }
private Color Shade(ISect isect, Scene scene, int depth) { var d = isect.Ray.Dir; var pos = Vector.Plus(Vector.Times(isect.Dist, isect.Ray.Dir), isect.Ray.Start); var normal = isect.Thing.Normal(pos); var reflectDir = Vector.Minus(d, Vector.Times(2 * Vector.Dot(normal, d), normal)); Color ret = Color.DefaultColor; ret = Color.Plus(ret, GetNaturalColor(isect.Thing, pos, normal, reflectDir, scene)); if (depth >= MaxDepth) { return(Color.Plus(ret, Color.Make(.5, .5, .5))); } return(Color.Plus(ret, GetReflectionColor(isect.Thing, Vector.Plus(pos, Vector.Times(.001, reflectDir)), normal, reflectDir, scene, depth))); }
private ISect IntersectRay(Ray ray, Scene scene) { ISect best = null; foreach (SceneObject obj in scene.Things) { ISect isect = obj.Intersect(ray); if (isect != null) { if (best == null || isect.Dist < best.Dist) { best = isect; } } } return(best); }