// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
#pragma once
#include "Engine/Core/Math/Math.h"
///
/// Alpha blending modes.
///
API_ENUM() enum class AlphaBlendMode : byte
{
///
/// Linear interpolation.
///
Linear = 0,
///
/// Cubic-in interpolation.
///
Cubic,
///
/// Hermite-Cubic.
///
HermiteCubic,
///
/// Sinusoidal interpolation.
///
Sinusoidal,
///
/// Quadratic in-out interpolation.
///
QuadraticInOut,
///
/// Cubic in-out interpolation.
///
CubicInOut,
///
/// Quartic in-out interpolation.
///
QuarticInOut,
///
/// Quintic in-out interpolation.
///
QuinticInOut,
///
/// Circular-in interpolation.
///
CircularIn,
///
/// Circular-out interpolation.
///
CircularOut,
///
/// Circular in-out interpolation.
///
CircularInOut,
///
/// Exponential-in interpolation.
///
ExpIn,
///
/// Exponential-Out interpolation.
///
ExpOut,
///
/// Exponential in-out interpolation.
///
ExpInOut,
};
///
/// Alpha blending utilities.
///
class AlphaBlend
{
public:
///
/// Converts the input alpha value from a linear 0-1 value into the output alpha described by blend mode.
///
/// The alpha (normalized to 0-1).
/// The mode.
/// The output alpha (normalized to 0-1).
static float Process(float alpha, AlphaBlendMode mode)
{
switch (mode)
{
case AlphaBlendMode::Sinusoidal:
alpha = (Math::Sin(alpha * PI - PI_HALF) + 1.0f) / 2.0f;
break;
case AlphaBlendMode::Cubic:
alpha = Math::CubicInterp(0.0f, 0.0f, 1.0f, 0.0f, alpha);
break;
case AlphaBlendMode::QuadraticInOut:
alpha = Math::InterpEaseInOut(0.0f, 1.0f, alpha, 2);
break;
case AlphaBlendMode::CubicInOut:
alpha = Math::InterpEaseInOut(0.0f, 1.0f, alpha, 3);
break;
case AlphaBlendMode::HermiteCubic:
alpha = Math::SmoothStep(0.0f, 1.0f, alpha);
break;
case AlphaBlendMode::QuarticInOut:
alpha = Math::InterpEaseInOut(0.0f, 1.0f, alpha, 4);
break;
case AlphaBlendMode::QuinticInOut:
alpha = Math::InterpEaseInOut(0.0f, 1.0f, alpha, 5);
break;
case AlphaBlendMode::CircularIn:
alpha = Math::InterpCircularIn(0.0f, 1.0f, alpha);
break;
case AlphaBlendMode::CircularOut:
alpha = Math::InterpCircularOut(0.0f, 1.0f, alpha);
break;
case AlphaBlendMode::CircularInOut:
alpha = Math::InterpCircularInOut(0.0f, 1.0f, alpha);
break;
case AlphaBlendMode::ExpIn:
alpha = Math::InterpExpoIn(0.0f, 1.0f, alpha);
break;
case AlphaBlendMode::ExpOut:
alpha = Math::InterpExpoOut(0.0f, 1.0f, alpha);
break;
case AlphaBlendMode::ExpInOut:
alpha = Math::InterpExpoInOut(0.0f, 1.0f, alpha);
break;
default: ;
}
return Math::Saturate(alpha);
}
};