// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp)
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.
shader ComputeColorColorDodge : ComputeColor
{
    compose ComputeColor color1;
    compose ComputeColor color2;

    override float4 Compute()
    {
        float4 backColor = color1.Compute();
        float4 frontColor = color2.Compute();

        // From http://msdn.microsoft.com/en-us/library/windows/desktop/hh706313(v=vs.85).aspx
        //
        //  b = background, f = foreground, c = color, a = alpha, r = result color obtain with the above formula
        //
        //  ColorDodge:
        //      if (fc == 1) : r = ceiling(bc)
        //      if (fc != 1) : r = bc / (1 - fc) in[0,1]
        //
        //      color = (fa * ba) * r + (fa * (1-ba)) * fc + ((1-fa) * ba) * bc
        //      alpha = fa * (1-ba) + ba

        float3 interColor = lerp(saturate(backColor.rgb / (1.0f - frontColor.rgb)),
                                 ceil(backColor.rgb),
                                 BlendUtils.Equals(frontColor.rgb, 1.0f));

        return BlendUtils.BasicBlend(backColor, frontColor, interColor);
    }
};
