Files
FlaxEngine/Source/Engine/Animations/AlphaBlend.h
2023-01-10 15:29:37 +01:00

144 lines
3.7 KiB
C++

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