Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

261 rinda
4.1 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 new(value: f64) -> Self;
  22. fn sin(self) -> Self;
  23. fn cos(self) -> Self;
  24. fn tan(self) -> Self;
  25. fn asin(self) -> Self;
  26. fn acos(self) -> Self;
  27. fn atan(self) -> Self;
  28. fn atan2(a: Self, b: Self) -> Self;
  29. fn ceil(self) -> Self;
  30. fn round(self) -> Self;
  31. fn floor(self) -> Self;
  32. }
  33. impl Numeric for gl::GLfloat {
  34. #[inline]
  35. fn one() -> Self {
  36. 1.0
  37. }
  38. #[inline]
  39. fn zero() -> Self {
  40. 0.0
  41. }
  42. #[inline]
  43. fn abs(self) -> Self {
  44. self.abs()
  45. }
  46. #[inline]
  47. fn sqrt(self) -> Self {
  48. f32::sqrt(self)
  49. }
  50. #[inline]
  51. fn is_zero(&self) -> bool {
  52. PartialEq::<f32>::eq(self, &0.0)
  53. }
  54. #[inline]
  55. fn to_degrees(self) -> Self {
  56. f32::to_degrees(self)
  57. }
  58. #[inline]
  59. fn to_radians(self) -> Self {
  60. f32::to_radians(self)
  61. }
  62. }
  63. impl Float for gl::GLfloat {
  64. #[inline]
  65. fn new(value: f64) -> Self {
  66. value as _
  67. }
  68. #[inline]
  69. fn sin(self) -> Self {
  70. f32::sin(self)
  71. }
  72. #[inline]
  73. fn cos(self) -> Self {
  74. f32::cos(self)
  75. }
  76. #[inline]
  77. fn tan(self) -> Self {
  78. f32::tan(self)
  79. }
  80. #[inline]
  81. fn asin(self) -> Self {
  82. f32::acos(self)
  83. }
  84. #[inline]
  85. fn acos(self) -> Self {
  86. f32::acos(self)
  87. }
  88. #[inline]
  89. fn atan(self) -> Self {
  90. f32::atan(self)
  91. }
  92. #[inline]
  93. fn atan2(a: Self, b: Self) -> Self {
  94. f32::atan2(a, b)
  95. }
  96. #[inline]
  97. fn ceil(self) -> Self {
  98. f32::ceil(self)
  99. }
  100. #[inline]
  101. fn round(self) -> Self {
  102. f32::round(self)
  103. }
  104. #[inline]
  105. fn floor(self) -> Self {
  106. f32::floor(self)
  107. }
  108. }
  109. impl Numeric for gl::GLdouble {
  110. #[inline]
  111. fn one() -> Self {
  112. 1.0
  113. }
  114. #[inline]
  115. fn zero() -> Self {
  116. 0.0
  117. }
  118. #[inline]
  119. fn abs(self) -> Self {
  120. self.abs()
  121. }
  122. #[inline]
  123. fn sqrt(self) -> Self {
  124. f64::sqrt(self)
  125. }
  126. #[inline]
  127. fn is_zero(&self) -> bool {
  128. PartialEq::<f64>::eq(self, &0.0)
  129. }
  130. #[inline]
  131. fn to_degrees(self) -> Self {
  132. f64::to_degrees(self)
  133. }
  134. #[inline]
  135. fn to_radians(self) -> Self {
  136. f64::to_radians(self)
  137. }
  138. }
  139. impl Float for gl::GLdouble {
  140. #[inline]
  141. fn new(value: f64) -> Self {
  142. value as _
  143. }
  144. #[inline]
  145. fn sin(self) -> Self {
  146. f64::sin(self)
  147. }
  148. #[inline]
  149. fn cos(self) -> Self {
  150. f64::cos(self)
  151. }
  152. #[inline]
  153. fn tan(self) -> Self {
  154. f64::tan(self)
  155. }
  156. #[inline]
  157. fn asin(self) -> Self {
  158. f64::acos(self)
  159. }
  160. #[inline]
  161. fn acos(self) -> Self {
  162. f64::acos(self)
  163. }
  164. #[inline]
  165. fn atan(self) -> Self {
  166. f64::atan(self)
  167. }
  168. #[inline]
  169. fn atan2(a: Self, b: Self) -> Self {
  170. f64::atan2(a, b)
  171. }
  172. #[inline]
  173. fn ceil(self) -> Self {
  174. f64::ceil(self)
  175. }
  176. #[inline]
  177. fn round(self) -> Self {
  178. f64::round(self)
  179. }
  180. #[inline]
  181. fn floor(self) -> Self {
  182. f64::floor(self)
  183. }
  184. }
  185. impl Numeric for gl::GLint {
  186. #[inline]
  187. fn one() -> Self {
  188. 1
  189. }
  190. #[inline]
  191. fn zero() -> Self {
  192. 0
  193. }
  194. #[inline]
  195. fn abs(self) -> Self {
  196. self.abs()
  197. }
  198. #[inline]
  199. fn sqrt(self) -> Self {
  200. f64::sqrt(self as f64) as i32
  201. }
  202. #[inline]
  203. fn is_zero(&self) -> bool {
  204. PartialEq::<i32>::eq(self, &0)
  205. }
  206. #[inline]
  207. fn to_degrees(self) -> Self {
  208. f32::to_degrees(self as f32) as i32
  209. }
  210. #[inline]
  211. fn to_radians(self) -> Self {
  212. f32::to_radians(self as f32) as i32
  213. }
  214. }