// Description: Convenience function for setting distance attenuation. // // Arguments: light HW light ID. // ref_dist Reference distance. // ref_br Reference brightness. // dist_func Attenuation characteristics. public Vector3 GetLightDistAttn(int frame) { float k0, k1, k2; float ref_dist = _refDist.GetFrameValue(frame); float ref_br = _refBright.GetFrameValue(frame); DistAttnFn dist_func = DistanceFunction; if (ref_dist < 0.0F || ref_br <= 0.0F || ref_br >= 1.0F) { dist_func = DistAttnFn.Off; } switch (dist_func) { case DistAttnFn.Gentle: k0 = 1.0F; k1 = (1.0F - ref_br) / (ref_br * ref_dist); k2 = 0.0F; break; case DistAttnFn.Medium: k0 = 1.0F; k1 = 0.5F * (1.0f - ref_br) / (ref_br * ref_dist); k2 = 0.5F * (1.0f - ref_br) / (ref_br * ref_dist * ref_dist); break; case DistAttnFn.Steep: k0 = 1.0F; k1 = 0.0F; k2 = (1.0F - ref_br) / (ref_br * ref_dist * ref_dist); break; case DistAttnFn.Off: default: k0 = 1.0F; k1 = 0.0F; k2 = 0.0F; break; } return(new Vector3(k0, k1, k2)); }
public static Vector3 GetLightDistCoefs(float distance, float brightness, DistAttnFn distFunc) { //constant attn, linear attn, quadratic attn //k2x^2 + k1x + k0 float k0, k1, k2; if (distance < 0.0F || brightness <= 0.0F || brightness >= 1.0F) { distFunc = DistAttnFn.Off; } switch (distFunc) { case DistAttnFn.Gentle: k0 = 1.0f; k1 = (1.0f - brightness) / (brightness * distance); k2 = 0.0f; break; case DistAttnFn.Medium: k0 = 1.0f; k1 = 0.5f * (1.0f - brightness) / (brightness * distance); k2 = 0.5f * (1.0f - brightness) / (brightness * distance * distance); break; case DistAttnFn.Steep: k0 = 1.0f; k1 = 0.0f; k2 = (1.0f - brightness) / (brightness * distance * distance); break; case DistAttnFn.Off: default: k0 = 1.0f; k1 = 0.0f; k2 = 0.0f; break; } return(new Vector3(k0, k1, k2)); }