// 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); } };