def Lighting(material, obj, light, point, eyev, normalv, inShadow=None): color = Color() if material.pattern != None: color = pattern_at_object(material.pattern, obj, point) else: color = material.color effective_color = Color.multiply(color, light.intensity) lightv = Vector3.Normalize(Tuples.sub(light.position, point)) ambient = Color.multiply(effective_color, material.ambient) light_dot_normal = Tuples.dot(lightv, normalv) if light_dot_normal < 0 or inShadow == True: diffuse = Color() specular = Color() else: diffuse = Color.multiply(effective_color, material.diffuse * light_dot_normal) reflectv = Tuples.reflect(Tuples.NegateTuple(lightv), normalv) reflect_dot_eye = Tuples.dot(reflectv, eyev) if reflect_dot_eye <= 0: specular = Color() else: factor = pow(reflect_dot_eye, material.shininess) specular = Color.multiply(light.intensity, material.specular * factor) return Color.add(Color.add(ambient, diffuse), specular)