示例#1
0
        //  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));
        }
示例#2
0
        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));
        }