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