math_utils.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #pragma once
  2. #include <QVector3D>
  3. #include <algorithm>
  4. #include <cmath>
  5. namespace Render::Geom {
  6. inline auto clamp01(float x) -> float {
  7. return std::max(0.0F, std::min(1.0F, x));
  8. }
  9. inline auto clamp_f(float x, float minVal, float maxVal) -> float {
  10. return std::max(minVal, std::min(maxVal, x));
  11. }
  12. inline auto clamp_vec_01(const QVector3D &c) -> QVector3D {
  13. return {clamp01(c.x()), clamp01(c.y()), clamp01(c.z())};
  14. }
  15. inline auto clamp_vec(const QVector3D &c, float minVal,
  16. float maxVal) -> QVector3D {
  17. return {clamp_f(c.x(), minVal, maxVal), clamp_f(c.y(), minVal, maxVal),
  18. clamp_f(c.z(), minVal, maxVal)};
  19. }
  20. constexpr auto lerp(float a, float b, float t) noexcept -> float {
  21. return a * (1.0F - t) + b * t;
  22. }
  23. inline auto lerp(const QVector3D &a, const QVector3D &b,
  24. float t) noexcept -> QVector3D {
  25. return a * (1.0F - t) + b * t;
  26. }
  27. constexpr auto ease_in_out_cubic(float t) noexcept -> float {
  28. const float clamped = (t < 0.0F) ? 0.0F : ((t > 1.0F) ? 1.0F : t);
  29. return clamped < 0.5F ? 4.0F * clamped * clamped * clamped
  30. : 1.0F - std::pow(-2.0F * clamped + 2.0F, 3.0F) / 2.0F;
  31. }
  32. constexpr auto smoothstep(float a, float b, float x) noexcept -> float {
  33. const float t = (x - a) / (b - a);
  34. const float clamped = (t < 0.0F) ? 0.0F : ((t > 1.0F) ? 1.0F : t);
  35. return clamped * clamped * (3.0F - 2.0F * clamped);
  36. }
  37. inline auto nlerp(const QVector3D &a, const QVector3D &b,
  38. float t) noexcept -> QVector3D {
  39. QVector3D v = a * (1.0F - t) + b * t;
  40. if (v.lengthSquared() > 1e-6F) {
  41. v.normalize();
  42. }
  43. return v;
  44. }
  45. } // namespace Render::Geom