private bool IsVisible(HitRecord record, ILight light)
        {
            Vector3 lightDirection = light.GetLightDirection(record.IntersectionPoint);
            Vector3 hitPos         = record.IntersectionPoint;
            Vector3 offset         = record.RayDirection;

            offset  = -offset;
            offset *= 0.001f;
            hitPos += offset;
            Ray       shadowRay = new Ray(hitPos, lightDirection);
            HitRecord shadowHit = objects.Intersect(shadowRay);
            Vector3   distance  = Vector3.Subtract(light.Position, hitPos);

            return(shadowHit != null && (shadowHit.Distance > distance.Length));
        }
        public bool IsShadowed(ILight light, Tuple4 pointOverSurface)
        {
            var lightDir = light.GetLightDirection(pointOverSurface);

            if (!lightDir.Equals(Tuple4.ZeroVector))
            {
                var lh = CalculateIntersection(Tuple4.Add(pointOverSurface, Tuple4.Scale(lightDir, Constants.Epsilon)), lightDir);
                if (lh.IsHit)
                {
                    var distance = light.GetLightDistance(pointOverSurface);
                    if (lh.Distance < distance)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }