TransformPrimitive.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #include "../../Include/RmlUi/Core/TransformPrimitive.h"
  2. #include "../../Include/RmlUi/Core/Element.h"
  3. #include "../../Include/RmlUi/Core/TypeConverter.h"
  4. namespace Rml {
  5. namespace Transforms {
  6. /// Returns the numeric value converted to 'base_unit'. Only accepts base units of 'Number' or 'Rad':
  7. /// 'Number' will pass-through the provided value.
  8. /// 'Rad' will convert {Rad, Deg, %} -> Rad.
  9. static float ResolvePrimitiveAbsoluteValue(NumericValue value, Unit base_unit) noexcept
  10. {
  11. RMLUI_ASSERT(base_unit == Unit::RAD || base_unit == Unit::NUMBER);
  12. if (base_unit == Unit::RAD)
  13. {
  14. switch (value.unit)
  15. {
  16. case Unit::RAD: return value.number;
  17. case Unit::DEG: return Math::DegreesToRadians(value.number);
  18. case Unit::PERCENT: return value.number * 0.01f * 2.0f * Math::RMLUI_PI;
  19. default: Log::Message(Log::LT_WARNING, "Trying to pass a non-angle unit to a property expecting an angle.");
  20. }
  21. }
  22. else if (base_unit == Unit::NUMBER && value.unit != Unit::NUMBER)
  23. {
  24. Log::Message(Log::LT_WARNING, "A unit was passed to a property which expected a unit-less number.");
  25. }
  26. return value.number;
  27. }
  28. template <size_t N>
  29. inline ResolvedPrimitive<N>::ResolvedPrimitive(const float* values) noexcept
  30. {
  31. for (size_t i = 0; i < N; ++i)
  32. this->values[i] = values[i];
  33. }
  34. template <size_t N>
  35. inline ResolvedPrimitive<N>::ResolvedPrimitive(const NumericValue* values) noexcept
  36. {
  37. for (size_t i = 0; i < N; ++i)
  38. this->values[i] = values[i].number;
  39. }
  40. template <size_t N>
  41. inline ResolvedPrimitive<N>::ResolvedPrimitive(const NumericValue* values, Array<Unit, N> base_units) noexcept
  42. {
  43. for (size_t i = 0; i < N; ++i)
  44. this->values[i] = ResolvePrimitiveAbsoluteValue(values[i], base_units[i]);
  45. }
  46. template <size_t N>
  47. inline ResolvedPrimitive<N>::ResolvedPrimitive(Array<NumericValue, N> values, Array<Unit, N> base_units) noexcept
  48. {
  49. for (size_t i = 0; i < N; ++i)
  50. this->values[i] = ResolvePrimitiveAbsoluteValue(values[i], base_units[i]);
  51. }
  52. template <size_t N>
  53. inline ResolvedPrimitive<N>::ResolvedPrimitive(Array<float, N> values) noexcept : values(values)
  54. {}
  55. template <size_t N>
  56. inline UnresolvedPrimitive<N>::UnresolvedPrimitive(const NumericValue* values) noexcept
  57. {
  58. for (size_t i = 0; i < N; ++i)
  59. this->values[i] = values[i];
  60. }
  61. template <size_t N>
  62. inline UnresolvedPrimitive<N>::UnresolvedPrimitive(Array<NumericValue, N> values) noexcept : values(values)
  63. {}
  64. Matrix2D::Matrix2D(const NumericValue* values) noexcept : ResolvedPrimitive(values) {}
  65. Matrix3D::Matrix3D(const NumericValue* values) noexcept : ResolvedPrimitive(values) {}
  66. Matrix3D::Matrix3D(const Matrix4f& matrix) noexcept : ResolvedPrimitive(matrix.data()) {}
  67. TranslateX::TranslateX(const NumericValue* values) noexcept : UnresolvedPrimitive(values) {}
  68. TranslateX::TranslateX(float x, Unit unit) noexcept : UnresolvedPrimitive({NumericValue(x, unit)}) {}
  69. TranslateY::TranslateY(const NumericValue* values) noexcept : UnresolvedPrimitive(values) {}
  70. TranslateY::TranslateY(float y, Unit unit) noexcept : UnresolvedPrimitive({NumericValue(y, unit)}) {}
  71. TranslateZ::TranslateZ(const NumericValue* values) noexcept : UnresolvedPrimitive(values) {}
  72. TranslateZ::TranslateZ(float z, Unit unit) noexcept : UnresolvedPrimitive({NumericValue(z, unit)}) {}
  73. Translate2D::Translate2D(const NumericValue* values) noexcept : UnresolvedPrimitive(values) {}
  74. Translate2D::Translate2D(float x, float y, Unit units) noexcept : UnresolvedPrimitive({NumericValue(x, units), NumericValue(y, units)}) {}
  75. Translate3D::Translate3D(const NumericValue* values) noexcept : UnresolvedPrimitive(values) {}
  76. Translate3D::Translate3D(NumericValue x, NumericValue y, NumericValue z) noexcept : UnresolvedPrimitive({x, y, z}) {}
  77. Translate3D::Translate3D(float x, float y, float z, Unit units) noexcept :
  78. UnresolvedPrimitive({NumericValue(x, units), NumericValue(y, units), NumericValue(z, units)})
  79. {}
  80. ScaleX::ScaleX(const NumericValue* values) noexcept : ResolvedPrimitive(values) {}
  81. ScaleX::ScaleX(float value) noexcept : ResolvedPrimitive({value}) {}
  82. ScaleY::ScaleY(const NumericValue* values) noexcept : ResolvedPrimitive(values) {}
  83. ScaleY::ScaleY(float value) noexcept : ResolvedPrimitive({value}) {}
  84. ScaleZ::ScaleZ(const NumericValue* values) noexcept : ResolvedPrimitive(values) {}
  85. ScaleZ::ScaleZ(float value) noexcept : ResolvedPrimitive({value}) {}
  86. Scale2D::Scale2D(const NumericValue* values) noexcept : ResolvedPrimitive(values) {}
  87. Scale2D::Scale2D(float xy) noexcept : ResolvedPrimitive({xy, xy}) {}
  88. Scale2D::Scale2D(float x, float y) noexcept : ResolvedPrimitive({x, y}) {}
  89. Scale3D::Scale3D(const NumericValue* values) noexcept : ResolvedPrimitive(values) {}
  90. Scale3D::Scale3D(float xyz) noexcept : ResolvedPrimitive({xyz, xyz, xyz}) {}
  91. Scale3D::Scale3D(float x, float y, float z) noexcept : ResolvedPrimitive({x, y, z}) {}
  92. RotateX::RotateX(const NumericValue* values) noexcept : ResolvedPrimitive(values, {Unit::RAD}) {}
  93. RotateX::RotateX(float angle, Unit unit) noexcept : ResolvedPrimitive({NumericValue{angle, unit}}, {Unit::RAD}) {}
  94. RotateY::RotateY(const NumericValue* values) noexcept : ResolvedPrimitive(values, {Unit::RAD}) {}
  95. RotateY::RotateY(float angle, Unit unit) noexcept : ResolvedPrimitive({NumericValue{angle, unit}}, {Unit::RAD}) {}
  96. RotateZ::RotateZ(const NumericValue* values) noexcept : ResolvedPrimitive(values, {Unit::RAD}) {}
  97. RotateZ::RotateZ(float angle, Unit unit) noexcept : ResolvedPrimitive({NumericValue{angle, unit}}, {Unit::RAD}) {}
  98. Rotate2D::Rotate2D(const NumericValue* values) noexcept : ResolvedPrimitive(values, {Unit::RAD}) {}
  99. Rotate2D::Rotate2D(float angle, Unit unit) noexcept : ResolvedPrimitive({NumericValue{angle, unit}}, {Unit::RAD}) {}
  100. Rotate3D::Rotate3D(const NumericValue* values) noexcept : ResolvedPrimitive(values, {Unit::NUMBER, Unit::NUMBER, Unit::NUMBER, Unit::RAD}) {}
  101. Rotate3D::Rotate3D(float x, float y, float z, float angle, Unit angle_unit) noexcept :
  102. ResolvedPrimitive(
  103. {NumericValue{x, Unit::NUMBER}, NumericValue{y, Unit::NUMBER}, NumericValue{z, Unit::NUMBER}, NumericValue{angle, angle_unit}},
  104. {Unit::NUMBER, Unit::NUMBER, Unit::NUMBER, Unit::RAD})
  105. {}
  106. SkewX::SkewX(const NumericValue* values) noexcept : ResolvedPrimitive(values, {Unit::RAD}) {}
  107. SkewX::SkewX(float angle, Unit unit) noexcept : ResolvedPrimitive({NumericValue{angle, unit}}, {Unit::RAD}) {}
  108. SkewY::SkewY(const NumericValue* values) noexcept : ResolvedPrimitive(values, {Unit::RAD}) {}
  109. SkewY::SkewY(float angle, Unit unit) noexcept : ResolvedPrimitive({NumericValue{angle, unit}}, {Unit::RAD}) {}
  110. Skew2D::Skew2D(const NumericValue* values) noexcept : ResolvedPrimitive(values, {Unit::RAD, Unit::RAD}) {}
  111. Skew2D::Skew2D(float x, float y, Unit unit) noexcept : ResolvedPrimitive({NumericValue{x, unit}, {NumericValue{y, unit}}}, {Unit::RAD, Unit::RAD})
  112. {}
  113. Perspective::Perspective(const NumericValue* values) noexcept : UnresolvedPrimitive(values) {}
  114. } // namespace Transforms
  115. } // namespace Rml