public VolumeFalloffEngineData ConvertToEngineData()
        {
            VolumeFalloffEngineData data = new VolumeFalloffEngineData();

            data.weight = weight;

            // Clamp to avoid NaNs.
            float3 fadePositive = this.fadePositive;
            float3 fadeNegative = this.fadeNegative;

            data.rcpFaceFadePos.x = (fadePositive.x < 1e-5f) ? float.MaxValue : (1.0f / fadePositive.x);
            data.rcpFaceFadePos.y = (fadePositive.y < 1e-5f) ? float.MaxValue : (1.0f / fadePositive.y);
            data.rcpFaceFadePos.z = (fadePositive.z < 1e-5f) ? float.MaxValue : (1.0f / fadePositive.z);

            data.rcpFaceFadeNeg.y = (fadeNegative.x < 1e-5f) ? float.MaxValue : (1.0f / fadeNegative.x);
            data.rcpFaceFadeNeg.x = (fadeNegative.y < 1e-5f) ? float.MaxValue : (1.0f / fadeNegative.y);
            data.rcpFaceFadeNeg.z = (fadeNegative.z < 1e-5f) ? float.MaxValue : (1.0f / fadeNegative.z);

            float distFadeLen = Mathf.Max(0.00001526f, distanceFadeEnd - distanceFadeStart);

            data.rcpDistFadeLen         = 1.0f / distFadeLen;
            data.endTimesRcpDistFadeLen = distanceFadeEnd * data.rcpDistFadeLen;

            return(data);
        }
        public static float Evaluate(ref VolumeFalloffEngineData falloff, ref OrientedBBox obb, float3 positionWS, float distanceWS)
        {
            float3x3 obbFrame   = new float3x3(obb.right, obb.up, math.cross(obb.up, obb.right));
            float3   obbExtents = new float3(obb.extentX, obb.extentY, obb.extentZ);

            float3 samplePositionBS  = math.mul(obbFrame, positionWS - obb.center);
            float3 samplePositionBCS = samplePositionBS / obbExtents;

            bool isInsideVolume = math.max(math.abs(samplePositionBCS.x), math.max(math.abs(samplePositionBCS.y), math.abs(samplePositionBCS.z))) < 1.0f;

            if (!isInsideVolume)
            {
                return(0.0f);
            }

            float3 samplePositionBNDC = samplePositionBCS * 0.5f + 0.5f;

            float volumeWeight = VolumeFalloff.ComputeVolumeFalloffWeight(
                samplePositionBNDC,
                distanceWS,
                falloff.rcpFaceFadePos,
                falloff.rcpFaceFadeNeg,
                falloff.rcpDistFadeLen,
                falloff.endTimesRcpDistFadeLen
                );

            volumeWeight *= falloff.weight;
            return(volumeWeight);
        }