You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

217 lines
3.4 KiB

  1. use std::ops::{Add, Div, Mul, Neg, Sub};
  2. /* Numeric */
  3. pub trait Numeric:
  4. Sized
  5. + Neg<Output = Self>
  6. + Add<Self, Output = Self>
  7. + Sub<Self, Output = Self>
  8. + Mul<Self, Output = Self>
  9. + Div<Self, Output = Self>
  10. + Copy
  11. {
  12. fn one() -> Self;
  13. fn zero() -> Self;
  14. fn abs(self) -> Self;
  15. fn sqrt(self) -> Self;
  16. fn is_zero(&self) -> bool;
  17. fn to_degrees(self) -> Self;
  18. fn to_radians(self) -> Self;
  19. }
  20. pub trait Float: Numeric {
  21. fn sin(self) -> Self;
  22. fn cos(self) -> Self;
  23. fn tan(self) -> Self;
  24. fn asin(self) -> Self;
  25. fn acos(self) -> Self;
  26. fn atan(self) -> Self;
  27. fn atan2(a: Self, b: Self) -> Self;
  28. }
  29. impl Numeric for gl::GLfloat {
  30. #[inline]
  31. fn one() -> Self {
  32. 1.0
  33. }
  34. #[inline]
  35. fn zero() -> Self {
  36. 0.0
  37. }
  38. #[inline]
  39. fn abs(self) -> Self {
  40. self.abs()
  41. }
  42. #[inline]
  43. fn sqrt(self) -> Self {
  44. f32::sqrt(self)
  45. }
  46. #[inline]
  47. fn is_zero(&self) -> bool {
  48. PartialEq::<f32>::eq(self, &0.0)
  49. }
  50. #[inline]
  51. fn to_degrees(self) -> Self {
  52. f32::to_degrees(self)
  53. }
  54. #[inline]
  55. fn to_radians(self) -> Self {
  56. f32::to_radians(self)
  57. }
  58. }
  59. impl Float for gl::GLfloat {
  60. #[inline]
  61. fn sin(self) -> Self {
  62. f32::sin(self)
  63. }
  64. #[inline]
  65. fn cos(self) -> Self {
  66. f32::cos(self)
  67. }
  68. #[inline]
  69. fn tan(self) -> Self {
  70. f32::tan(self)
  71. }
  72. #[inline]
  73. fn asin(self) -> Self {
  74. f32::acos(self)
  75. }
  76. #[inline]
  77. fn acos(self) -> Self {
  78. f32::acos(self)
  79. }
  80. #[inline]
  81. fn atan(self) -> Self {
  82. f32::atan(self)
  83. }
  84. #[inline]
  85. fn atan2(a: Self, b: Self) -> Self {
  86. f32::atan2(a, b)
  87. }
  88. }
  89. impl Numeric for gl::GLdouble {
  90. #[inline]
  91. fn one() -> Self {
  92. 1.0
  93. }
  94. #[inline]
  95. fn zero() -> Self {
  96. 0.0
  97. }
  98. #[inline]
  99. fn abs(self) -> Self {
  100. self.abs()
  101. }
  102. #[inline]
  103. fn sqrt(self) -> Self {
  104. f64::sqrt(self)
  105. }
  106. #[inline]
  107. fn is_zero(&self) -> bool {
  108. PartialEq::<f64>::eq(self, &0.0)
  109. }
  110. #[inline]
  111. fn to_degrees(self) -> Self {
  112. f64::to_degrees(self)
  113. }
  114. #[inline]
  115. fn to_radians(self) -> Self {
  116. f64::to_radians(self)
  117. }
  118. }
  119. impl Float for gl::GLdouble {
  120. #[inline]
  121. fn sin(self) -> Self {
  122. f64::sin(self)
  123. }
  124. #[inline]
  125. fn cos(self) -> Self {
  126. f64::cos(self)
  127. }
  128. #[inline]
  129. fn tan(self) -> Self {
  130. f64::tan(self)
  131. }
  132. #[inline]
  133. fn asin(self) -> Self {
  134. f64::acos(self)
  135. }
  136. #[inline]
  137. fn acos(self) -> Self {
  138. f64::acos(self)
  139. }
  140. #[inline]
  141. fn atan(self) -> Self {
  142. f64::atan(self)
  143. }
  144. #[inline]
  145. fn atan2(a: Self, b: Self) -> Self {
  146. f64::atan2(a, b)
  147. }
  148. }
  149. impl Numeric for gl::GLint {
  150. #[inline]
  151. fn one() -> Self {
  152. 1
  153. }
  154. #[inline]
  155. fn zero() -> Self {
  156. 0
  157. }
  158. #[inline]
  159. fn abs(self) -> Self {
  160. self.abs()
  161. }
  162. #[inline]
  163. fn sqrt(self) -> Self {
  164. f64::sqrt(self as f64) as i32
  165. }
  166. #[inline]
  167. fn is_zero(&self) -> bool {
  168. PartialEq::<i32>::eq(self, &0)
  169. }
  170. #[inline]
  171. fn to_degrees(self) -> Self {
  172. f32::to_degrees(self as f32) as i32
  173. }
  174. #[inline]
  175. fn to_radians(self) -> Self {
  176. f32::to_radians(self as f32) as i32
  177. }
  178. }