Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

813 строки
16 KiB

  1. #![allow(dead_code)]
  2. use std::convert::{AsMut, AsRef};
  3. use std::fmt::{Debug, Formatter, Result as FmtResult};
  4. use std::ops::{Add, Deref, DerefMut, Div, Mul, Neg, Sub};
  5. macro_rules! first_ptr {
  6. ($this:ident, $first:ident $(,$other:ident)*) => {
  7. unsafe { &$this.$first }
  8. };
  9. }
  10. macro_rules! define_vec {
  11. ($Name:ident, $size:tt, $($T:ident => $i:tt => $f:ident),*) => {
  12. #[repr(C, packed)]
  13. pub struct $Name<T> {
  14. $(pub $f: T,)+
  15. }
  16. impl<T> $Name<T> {
  17. #[inline]
  18. pub fn new($($f: T,)+) -> Self {
  19. Self { $($f,)+ }
  20. }
  21. #[inline]
  22. pub fn as_ptr(&self) -> * const T {
  23. first_ptr!(self $(, $f)+)
  24. }
  25. }
  26. impl<T> Default for $Name<T>
  27. where
  28. T: Default
  29. {
  30. #[inline]
  31. fn default() -> Self {
  32. Self {
  33. $($f: T::default(),)+
  34. }
  35. }
  36. }
  37. impl<T> Debug for $Name<T>
  38. where
  39. T: Debug
  40. {
  41. fn fmt(&self, fmt: &mut Formatter<'_>) -> FmtResult {
  42. fmt.debug_list().entries(self.as_ref().iter()).finish()
  43. }
  44. }
  45. impl<T, S> PartialEq<$Name<S>> for $Name<T>
  46. where
  47. S: PartialEq<T>,
  48. {
  49. fn eq(&self, other: &$Name<S>) -> bool {
  50. unsafe { true $(&& other.$f.eq(&self.$f))+ }
  51. }
  52. }
  53. impl<T> Eq for $Name<T>
  54. where
  55. T: Eq
  56. { }
  57. impl<T> Deref for $Name<T> {
  58. type Target = [T; $size];
  59. #[inline]
  60. fn deref(&self) -> &Self::Target {
  61. self.as_ref()
  62. }
  63. }
  64. impl<T> DerefMut for $Name<T> {
  65. #[inline]
  66. fn deref_mut(&mut self) -> &mut Self::Target {
  67. self.as_mut()
  68. }
  69. }
  70. impl<T> AsRef<[T; $size]> for $Name<T> {
  71. #[inline]
  72. fn as_ref(&self) -> &[T; $size] {
  73. unsafe {
  74. let raw: * const _ = self;
  75. let raw = raw as * const [T; $size];
  76. &*raw
  77. }
  78. }
  79. }
  80. impl<T> AsMut<[T; $size]> for $Name<T> {
  81. #[inline]
  82. fn as_mut(&mut self) -> &mut [T; $size] {
  83. unsafe {
  84. let raw: * mut _ = self;
  85. let raw = raw as * mut [T; $size];
  86. &mut *raw
  87. }
  88. }
  89. }
  90. impl<T> Clone for $Name<T>
  91. where
  92. T: Clone
  93. {
  94. #[inline]
  95. fn clone(&self) -> Self {
  96. unsafe {
  97. Self {
  98. $($f: self.$f.clone(),)+
  99. }
  100. }
  101. }
  102. }
  103. impl<T> Copy for $Name<T>
  104. where
  105. T: Copy
  106. { }
  107. impl<T> From<[T; $size]> for $Name<T>
  108. where
  109. T: Copy,
  110. {
  111. #[inline]
  112. fn from(arr: [T; $size]) -> Self {
  113. Self {
  114. $($f: arr[$i],)+
  115. }
  116. }
  117. }
  118. impl<T> From<($($T,)+)> for $Name<T> {
  119. #[inline]
  120. fn from(($($f,)+): ($($T,)+)) -> Self {
  121. Self {
  122. $($f,)+
  123. }
  124. }
  125. }
  126. };
  127. }
  128. define_vec!(Vector2, 2, T => 0 => x, T => 1 => y);
  129. define_vec!(Vector3, 3, T => 0 => x, T => 1 => y, T => 2 => z);
  130. define_vec!(Vector4, 4, T => 0 => x, T => 1 => y, T => 2 => z, T => 3 => w);
  131. pub type Vector2f = Vector2<gl::GLfloat>;
  132. pub type Vector3f = Vector3<gl::GLfloat>;
  133. pub type Vector4f = Vector4<gl::GLfloat>;
  134. pub type Vector2d = Vector2<gl::GLdouble>;
  135. pub type Vector3d = Vector3<gl::GLdouble>;
  136. pub type Vector4d = Vector4<gl::GLdouble>;
  137. pub type Vector2i = Vector2<gl::GLint>;
  138. pub type Vector3i = Vector3<gl::GLint>;
  139. pub type Vector4i = Vector4<gl::GLint>;
  140. /* Vector2 */
  141. impl<T> Vector2<T>
  142. where
  143. T: Element,
  144. {
  145. #[inline]
  146. pub fn multiply(mut self, v: T) -> Self {
  147. self.x = self.x * v;
  148. self.y = self.y * v;
  149. self
  150. }
  151. #[inline]
  152. pub fn length(&self) -> T {
  153. Element::sqrt(self.x * self.x + self.y * self.y)
  154. }
  155. #[inline]
  156. pub fn normalize(mut self) -> Self {
  157. let len = self.length();
  158. self.x = self.x / len;
  159. self.y = self.y / len;
  160. self
  161. }
  162. #[inline]
  163. pub fn scalar(&self, other: &Self) -> T {
  164. self.x * other.x + self.y * other.y
  165. }
  166. #[inline]
  167. pub fn angle(&self, other: &Self) -> T::AsFloat {
  168. let s = self.scalar(other);
  169. let l1 = self.length();
  170. let l2 = self.length();
  171. Element::acos(s / (l1 + l2))
  172. }
  173. #[inline]
  174. pub fn angle2(&self, other: &Self) -> T::AsFloat {
  175. T::atan2(
  176. other.x * self.y - other.y * self.x,
  177. other.x * self.x + other.y * self.y,
  178. )
  179. }
  180. }
  181. impl<T> Add for Vector2<T>
  182. where
  183. T: Element,
  184. {
  185. type Output = Self;
  186. #[inline]
  187. fn add(mut self, other: Self) -> Self::Output {
  188. self.x = self.x + other.x;
  189. self.y = self.y + other.y;
  190. self
  191. }
  192. }
  193. impl<T> Sub for Vector2<T>
  194. where
  195. T: Element,
  196. {
  197. type Output = Self;
  198. #[inline]
  199. fn sub(mut self, other: Self) -> Self::Output {
  200. self.x = self.x - other.x;
  201. self.y = self.y - other.y;
  202. self
  203. }
  204. }
  205. impl<T> Mul for Vector2<T>
  206. where
  207. T: Element,
  208. {
  209. type Output = T;
  210. #[inline]
  211. fn mul(self, rhs: Self) -> Self::Output {
  212. self.scalar(&rhs)
  213. }
  214. }
  215. /* Vector3 */
  216. impl<T> Vector3<T>
  217. where
  218. T: Element,
  219. {
  220. #[inline]
  221. pub fn multiply(mut self, v: T) -> Self {
  222. self.x = self.x * v;
  223. self.y = self.y * v;
  224. self.z = self.z * v;
  225. self
  226. }
  227. #[inline]
  228. pub fn length(&self) -> T {
  229. Element::sqrt(self.x * self.x + self.y * self.y + self.z * self.z)
  230. }
  231. #[inline]
  232. pub fn normalize(mut self) -> Self {
  233. let len = self.length();
  234. self.x = self.x / len;
  235. self.y = self.y / len;
  236. self.z = self.z / len;
  237. self
  238. }
  239. #[inline]
  240. pub fn scalar(&self, other: &Self) -> T {
  241. self.x * other.x + self.y * other.y + self.z * other.z
  242. }
  243. #[inline]
  244. pub fn cross(&self, other: &Self) -> Self {
  245. Self {
  246. x: self.y * other.z - self.z * other.y,
  247. y: self.z * other.x - self.x * other.z,
  248. z: self.x * other.y - self.y * other.x,
  249. }
  250. }
  251. #[inline]
  252. pub fn angle(&self, other: &Self) -> T::AsFloat {
  253. let s = self.scalar(other);
  254. let l1 = self.length();
  255. let l2 = self.length();
  256. Element::acos(s / (l1 + l2))
  257. }
  258. }
  259. impl<T> Add for Vector3<T>
  260. where
  261. T: Element,
  262. {
  263. type Output = Self;
  264. #[inline]
  265. fn add(mut self, other: Self) -> Self::Output {
  266. self.x = self.x + other.x;
  267. self.y = self.y + other.y;
  268. self.z = self.z + other.z;
  269. self
  270. }
  271. }
  272. impl<T> Sub for Vector3<T>
  273. where
  274. T: Element,
  275. {
  276. type Output = Self;
  277. #[inline]
  278. fn sub(mut self, other: Self) -> Self::Output {
  279. self.x = self.x - other.x;
  280. self.y = self.y - other.y;
  281. self.z = self.z - other.z;
  282. self
  283. }
  284. }
  285. impl<T> Mul for Vector3<T>
  286. where
  287. T: Element,
  288. {
  289. type Output = T;
  290. #[inline]
  291. fn mul(self, rhs: Self) -> Self::Output {
  292. self.scalar(&rhs)
  293. }
  294. }
  295. /* Vector4 */
  296. impl<T> Vector4<T>
  297. where
  298. T: Element,
  299. {
  300. #[inline]
  301. pub fn multiply(mut self, v: T) -> Self {
  302. self.x = self.x * v;
  303. self.y = self.y * v;
  304. self.z = self.z * v;
  305. self
  306. }
  307. #[inline]
  308. pub fn length(self) -> T {
  309. self.xyz().length()
  310. }
  311. #[inline]
  312. pub fn normalize(mut self) -> Self {
  313. let len = self.length();
  314. if unsafe { !Element::is_zero(&self.w) } {
  315. self.x = self.x / self.w;
  316. self.y = self.y / self.w;
  317. self.z = self.z / self.w;
  318. } else {
  319. self.x = Element::zero();
  320. self.y = Element::zero();
  321. self.z = Element::zero();
  322. }
  323. self.x = self.x / len;
  324. self.y = self.y / len;
  325. self.z = self.z / len;
  326. self.w = Element::one();
  327. self
  328. }
  329. #[inline]
  330. pub fn scalar(&self, other: &Self) -> T {
  331. self.xyz().scalar(&other.xyz())
  332. }
  333. #[inline]
  334. pub fn cross(&self, other: &Self) -> Self {
  335. (self.xyz().cross(&other.xyz()), Element::one()).into()
  336. }
  337. #[inline]
  338. pub fn angle(&self, other: &Self) -> T::AsFloat {
  339. self.xyz().angle(&other.xyz())
  340. }
  341. #[inline]
  342. pub fn xyz(self) -> Vector3<T> {
  343. if unsafe { Element::is_zero(&self.w) } {
  344. Vector3 {
  345. x: Element::zero(),
  346. y: Element::zero(),
  347. z: Element::zero(),
  348. }
  349. } else {
  350. Vector3 {
  351. x: self.x / self.w,
  352. y: self.y / self.w,
  353. z: self.z / self.w,
  354. }
  355. }
  356. }
  357. }
  358. impl<T> Add for Vector4<T>
  359. where
  360. T: Element,
  361. {
  362. type Output = Self;
  363. #[inline]
  364. fn add(self, other: Self) -> Self::Output {
  365. (self.xyz() + other.xyz(), T::one()).into()
  366. }
  367. }
  368. impl<T> Sub for Vector4<T>
  369. where
  370. T: Element,
  371. {
  372. type Output = Self;
  373. #[inline]
  374. fn sub(self, other: Self) -> Self::Output {
  375. (self.xyz() - other.xyz(), T::one()).into()
  376. }
  377. }
  378. impl<T> Mul for Vector4<T>
  379. where
  380. T: Element,
  381. {
  382. type Output = T;
  383. fn mul(self, rhs: Self) -> Self::Output {
  384. self.scalar(&rhs)
  385. }
  386. }
  387. impl<T> From<(Vector3<T>, T)> for Vector4<T> {
  388. fn from((vec3, w): (Vector3<T>, T)) -> Self {
  389. Self {
  390. x: vec3.x,
  391. y: vec3.y,
  392. z: vec3.z,
  393. w,
  394. }
  395. }
  396. }
  397. /* Element */
  398. pub trait Element:
  399. Sized
  400. + Neg<Output = Self>
  401. + Add<Self, Output = Self>
  402. + Sub<Self, Output = Self>
  403. + Mul<Self, Output = Self>
  404. + Div<Self, Output = Self>
  405. + Copy
  406. {
  407. type AsFloat: Element;
  408. fn one() -> Self;
  409. fn zero() -> Self;
  410. fn sin(self) -> Self;
  411. fn cos(self) -> Self;
  412. fn sqrt(self) -> Self;
  413. fn tan(self) -> Self::AsFloat;
  414. fn acos(self) -> Self::AsFloat;
  415. fn atan(self) -> Self::AsFloat;
  416. fn atan2(a: Self, b: Self) -> Self::AsFloat;
  417. fn is_zero(&self) -> bool;
  418. fn to_degrees(self) -> Self;
  419. fn to_radians(self) -> Self;
  420. }
  421. impl Element for gl::GLfloat {
  422. type AsFloat = f32;
  423. #[inline]
  424. fn one() -> Self {
  425. 1.0
  426. }
  427. #[inline]
  428. fn zero() -> Self {
  429. 0.0
  430. }
  431. #[inline]
  432. fn sin(self) -> Self {
  433. f32::sin(self)
  434. }
  435. #[inline]
  436. fn cos(self) -> Self {
  437. f32::cos(self)
  438. }
  439. #[inline]
  440. fn sqrt(self) -> Self {
  441. f32::sqrt(self)
  442. }
  443. #[inline]
  444. fn tan(self) -> Self::AsFloat {
  445. f32::tan(self)
  446. }
  447. #[inline]
  448. fn acos(self) -> Self::AsFloat {
  449. f32::acos(self)
  450. }
  451. #[inline]
  452. fn atan(self) -> Self::AsFloat {
  453. f32::atan(self)
  454. }
  455. #[inline]
  456. fn atan2(a: Self, b: Self) -> Self::AsFloat {
  457. f32::atan2(a, b)
  458. }
  459. #[inline]
  460. fn is_zero(&self) -> bool {
  461. PartialEq::<f32>::eq(self, &0.0)
  462. }
  463. #[inline]
  464. fn to_degrees(self) -> Self {
  465. f32::to_degrees(self)
  466. }
  467. #[inline]
  468. fn to_radians(self) -> Self {
  469. f32::to_radians(self)
  470. }
  471. }
  472. impl Element for gl::GLdouble {
  473. type AsFloat = f64;
  474. #[inline]
  475. fn one() -> Self {
  476. 1.0
  477. }
  478. #[inline]
  479. fn zero() -> Self {
  480. 0.0
  481. }
  482. #[inline]
  483. fn sin(self) -> Self {
  484. f64::sin(self)
  485. }
  486. #[inline]
  487. fn cos(self) -> Self {
  488. f64::cos(self)
  489. }
  490. #[inline]
  491. fn sqrt(self) -> Self {
  492. f64::sqrt(self)
  493. }
  494. #[inline]
  495. fn tan(self) -> Self::AsFloat {
  496. f64::tan(self)
  497. }
  498. #[inline]
  499. fn acos(self) -> Self::AsFloat {
  500. f64::acos(self)
  501. }
  502. #[inline]
  503. fn atan(self) -> Self::AsFloat {
  504. f64::atan(self)
  505. }
  506. #[inline]
  507. fn atan2(a: Self, b: Self) -> Self::AsFloat {
  508. f64::atan2(a, b)
  509. }
  510. #[inline]
  511. fn is_zero(&self) -> bool {
  512. PartialEq::<f64>::eq(self, &0.0)
  513. }
  514. #[inline]
  515. fn to_degrees(self) -> Self {
  516. f64::to_degrees(self)
  517. }
  518. #[inline]
  519. fn to_radians(self) -> Self {
  520. f64::to_radians(self)
  521. }
  522. }
  523. impl Element for gl::GLint {
  524. type AsFloat = f32;
  525. #[inline]
  526. fn one() -> Self {
  527. 1
  528. }
  529. #[inline]
  530. fn zero() -> Self {
  531. 0
  532. }
  533. #[inline]
  534. fn sin(self) -> Self {
  535. f32::sin(self as f32) as i32
  536. }
  537. #[inline]
  538. fn cos(self) -> Self {
  539. f32::cos(self as f32) as i32
  540. }
  541. #[inline]
  542. fn sqrt(self) -> Self {
  543. f64::sqrt(self as f64) as i32
  544. }
  545. #[inline]
  546. fn tan(self) -> Self::AsFloat {
  547. f32::tan(self as f32)
  548. }
  549. #[inline]
  550. fn acos(self) -> Self::AsFloat {
  551. f32::acos(self as f32)
  552. }
  553. #[inline]
  554. fn atan(self) -> Self::AsFloat {
  555. f32::atan(self as f32)
  556. }
  557. #[inline]
  558. fn atan2(a: Self, b: Self) -> Self::AsFloat {
  559. f32::atan2(a as f32, b as f32)
  560. }
  561. #[inline]
  562. fn is_zero(&self) -> bool {
  563. PartialEq::<i32>::eq(self, &0)
  564. }
  565. #[inline]
  566. fn to_degrees(self) -> Self {
  567. f32::to_degrees(self as f32) as i32
  568. }
  569. #[inline]
  570. fn to_radians(self) -> Self {
  571. f32::to_radians(self as f32) as i32
  572. }
  573. }
  574. #[cfg(test)]
  575. mod tests {
  576. use super::*;
  577. #[test]
  578. fn add() {
  579. let v1 = Vector2f::from((1.0, 0.0));
  580. let v2 = Vector2f::from((0.0, 1.0));
  581. let ex = Vector2f::from((1.0, 1.0));
  582. assert_eq!(ex, v1 + v2);
  583. let v1 = Vector3f::from((1.0, 0.0, 1.8));
  584. let v2 = Vector3f::from((0.0, 2.0, 1.2));
  585. let ex = Vector3f::from((1.0, 2.0, 3.0));
  586. assert_eq!(ex, v1 + v2);
  587. let v1 = Vector4f::from((1.0, 0.0, 1.8, 0.5));
  588. let v2 = Vector4f::from((0.0, 2.0, 1.2, 1.0));
  589. let ex = Vector4f::from((2.0, 2.0, 4.8, 1.0));
  590. assert_eq!(ex, v1 + v2);
  591. }
  592. #[test]
  593. fn sub() {
  594. let v1 = Vector2f::from((1.0, 0.0));
  595. let v2 = Vector2f::from((0.0, 1.0));
  596. let ex = Vector2f::from((1.0, -1.0));
  597. assert_eq!(ex, v1 - v2);
  598. let v1 = Vector3d::from((1.0, 0.0, 1.75));
  599. let v2 = Vector3d::from((0.0, 2.0, 1.0));
  600. let ex = Vector3d::from((1.0, -2.0, 0.75));
  601. assert_eq!(ex, v1 - v2);
  602. let v1 = Vector4d::from((1.0, 0.0, 1.0, 0.5));
  603. let v2 = Vector4d::from((0.0, 2.0, -2.0, 1.0));
  604. let ex = Vector4d::from((2.0, -2.0, 4.0, 1.0));
  605. assert_eq!(ex, v1 - v2);
  606. }
  607. #[test]
  608. fn multiply() {
  609. let v1 = Vector2f::from((1.0, 0.0)).multiply(2.0);
  610. let ex = Vector2f::from((2.0, 0.0));
  611. assert_eq!(ex, v1);
  612. let v1 = Vector3d::from((1.0, 0.0, 1.75)).multiply(2.0);
  613. let ex = Vector3d::from((2.0, 0.0, 3.5));
  614. assert_eq!(ex, v1);
  615. let v1 = Vector4d::from((1.0, 0.0, 0.5, 0.5)).multiply(3.0);
  616. let ex = Vector4d::from((3.0, 0.0, 1.5, 0.5));
  617. assert_eq!(ex, v1);
  618. }
  619. #[test]
  620. fn scalar() {
  621. let v1 = Vector2f::from((1.0, 0.0));
  622. let v2 = Vector2f::from((0.0, 1.0));
  623. assert_eq!(0.0, v1.scalar(&v2));
  624. let v1 = Vector3f::from((1.0, 0.0, 0.0));
  625. let v2 = Vector3f::from((0.0, 1.0, 0.0));
  626. assert_eq!(0.0, v1.scalar(&v2));
  627. let v1 = Vector4f::from((3.0, 0.0, 0.0, 1.0));
  628. let v2 = Vector4f::from((0.0, 2.0, 0.0, 0.8));
  629. assert_eq!(0.0, v1.scalar(&v2));
  630. }
  631. #[test]
  632. fn normalize() {
  633. let v1 = Vector2f::from((1.0, 0.0)).normalize();
  634. let ex = Vector2f::from((1.0, 0.0));
  635. assert_eq!(ex, v1);
  636. let v1 = Vector3d::from((1.0, 0.0, 1.75)).normalize();
  637. let ex = Vector3d::from((0.49613893835683387, 0.0, 0.8682431421244593));
  638. assert_eq!(ex, v1);
  639. let v1 = Vector4d::from((1.0, 0.0, 0.5, 0.5)).normalize();
  640. let ex = Vector4d::from((0.8944271909999159, 0.0, 0.4472135954999579, 1.0));
  641. assert_eq!(ex, v1);
  642. }
  643. #[test]
  644. fn cross() {
  645. let v1 = Vector3d::from((1.0, 0.0, 0.0));
  646. let v2 = Vector3d::from((0.0, 1.0, 0.0));
  647. let ex = Vector3d::from((0.0, 0.0, 1.0));
  648. assert_eq!(ex, v1.cross(&v2));
  649. let v1 = Vector4d::from((1.0, 0.0, 0.0, 0.5));
  650. let v2 = Vector4d::from((0.0, 3.0, 0.0, 1.0));
  651. let ex = Vector4d::from((0.0, 0.0, 6.0, 1.0));
  652. assert_eq!(ex, v1.cross(&v2));
  653. }
  654. }