// Description: Convenience function to set spotlight parameters. // // Arguments: light HW light ID. // cutoff Cut off angle. // spot_func Spot function characteristics. public Vector3 GetLightSpot(int frame) { float a0, a1, a2, r, d, cr; SpotFn spot_func = SpotFunction; float cutoff = _spotCut.GetFrameValue(frame); if (cutoff <= 0.0f || cutoff > 90.0f) { spot_func = SpotFn.Off; } r = cutoff * Maths._deg2radf; cr = (float)Math.Cos(r); switch (spot_func) { case SpotFn.Flat: a0 = -1000.0f * cr; a1 = 1000.0f; a2 = 0.0f; break; case SpotFn.Cos: a0 = -cr / (1.0f - cr); a1 = 1.0f / (1.0f - cr); a2 = 0.0f; break; case SpotFn.Cos2: a0 = 0.0f; a1 = -cr / (1.0f - cr); a2 = 1.0f / (1.0f - cr); break; case SpotFn.Sharp: d = (1.0f - cr) * (1.0f - cr); a0 = cr * (cr - 2.0f) / d; a1 = 2.0f / d; a2 = -1.0f / d; break; case SpotFn.Ring: d = (1.0f - cr) * (1.0f - cr); a0 = -4.0f * cr / d; a1 = 4.0f * (1.0f + cr) / d; a2 = -4.0f / d; break; case SpotFn.Ring2: d = (1.0f - cr) * (1.0f - cr); a0 = 1.0f - 2.0f * cr * cr / d; a1 = 4.0f * cr / d; a2 = -2.0f / d; break; case SpotFn.Off: default: a0 = 1.0f; a1 = 0.0f; a2 = 0.0f; break; } return(new Vector3(a0, a1, a2)); }
public static Vector3 GetLightSpotCoefs(float cutoff, SpotFn spotFunc) { //a2x^2 + a1x + a0 float a0, a1, a2, d, cr = (float)Math.Cos(cutoff * Maths._deg2radf); if (cutoff <= 0.0f || cutoff > 90.0f) { spotFunc = SpotFn.Off; } switch (spotFunc) { case SpotFn.Flat: a0 = -1000.0f * cr; a1 = 1000.0f; a2 = 0.0f; break; case SpotFn.Cos: a0 = -cr / (1.0f - cr); a1 = 1.0f / (1.0f - cr); a2 = 0.0f; break; case SpotFn.Cos2: a0 = 0.0f; a1 = -cr / (1.0f - cr); a2 = 1.0f / (1.0f - cr); break; case SpotFn.Sharp: d = (1.0f - cr) * (1.0f - cr); a0 = cr * (cr - 2.0f) / d; a1 = 2.0f / d; a2 = -1.0f / d; break; case SpotFn.Ring: d = (1.0f - cr) * (1.0f - cr); a0 = -4.0f * cr / d; a1 = 4.0f * (1.0f + cr) / d; a2 = -4.0f / d; break; case SpotFn.Ring2: d = (1.0f - cr) * (1.0f - cr); a0 = 1.0f - 2.0f * cr * cr / d; a1 = 4.0f * cr / d; a2 = -2.0f / d; break; case SpotFn.Off: default: a0 = 1.0f; a1 = 0.0f; a2 = 0.0f; break; } return(new Vector3(a0, a1, a2)); }