private MyColor traceRay(Ray ray, int rayDepth, bool isInShape) { //Determine if we hit anything RayIntersectionResult intersectResult = scene.IntersectRay(ray); if (intersectResult == null) { return(scene.backgroundColor); } //Get the primary color (using the illumination model) of what we hit bool isInShadow = isPointInShadow(intersectResult.intersectionPoint); MyColor primaryColor = getColorAtPoint(intersectResult.intersectedShape, intersectResult.intersectionPoint, isInShadow); //If we've hit the max ray depth, stop. if (rayDepth >= MAX_RAY_DEPTH) { return(primaryColor); } MyColor reflectionColor = new MyColor(); MyColor refractionColor = new MyColor(); //Trace reflection ray if (intersectResult.intersectedShape.reflectionAmount > 0) { Ray reflectionRay = getReflectionRay(intersectResult.intersectedShape, intersectResult.intersectionPoint, ray); reflectionColor = traceRay(reflectionRay, rayDepth + 1, isInShape); } //Trace refraction ray if (intersectResult.intersectedShape.refractionAmount > 0) { Ray refractionRay = getRefractionRay(intersectResult.intersectedShape, intersectResult.intersectionPoint, ray, isInShape); refractionColor = traceRay(refractionRay, rayDepth + 1, !isInShape); } return(primaryColor * intersectResult.intersectedShape.ownColorAmount + reflectionColor * intersectResult.intersectedShape.reflectionAmount + refractionColor * intersectResult.intersectedShape.refractionAmount); }
public Scene() { shapes = new List <Shape>(); backgroundColor = new MyColor(); //Constructor defaults to black }
public static System.Drawing.Color ToSystemColor(MyColor c) { return(System.Drawing.Color.FromArgb(Convert.ToByte(c.red * 255), Convert.ToByte(c.green * 255), Convert.ToByte(c.blue * 255))); }