Commit c1655b4efb01e6522771fb337c85eb8dc6a3a784

Authored by Georg Hopp
1 parent c57ce571

Correct transformation matrix handling

Showing 1 changed file with 38 additions and 20 deletions
@@ -19,6 +19,7 @@ @@ -19,6 +19,7 @@
19 // along with this program. If not, see <http://www.gnu.org/licenses/>. 19 // along with this program. If not, see <http://www.gnu.org/licenses/>.
20 // 20 //
21 use std::ops::{Add, Sub, Neg, Mul, Div}; 21 use std::ops::{Add, Sub, Neg, Mul, Div};
  22 +use std::fmt::Debug;
22 23
23 use crate::Vector; 24 use crate::Vector;
24 use crate::trigonometry::Trig; 25 use crate::trigonometry::Trig;
@@ -28,30 +29,34 @@ pub struct TMatrix<T>( (T, T, T, T) @@ -28,30 +29,34 @@ pub struct TMatrix<T>( (T, T, T, T)
28 , (T, T, T, T) 29 , (T, T, T, T)
29 , (T, T, T, T) 30 , (T, T, T, T)
30 , (T, T, T, T) ) 31 , (T, T, T, T) )
31 - where T: Add + Sub + Neg + Mul + Div + Trig + From<i32> + Copy; 32 + where T: Add + Sub + Neg + Mul + Div + Debug + Trig + From<i32> + Copy;
32 33
33 pub fn unit<T>() -> TMatrix<T> 34 pub fn unit<T>() -> TMatrix<T>
34 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> 35 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
35 - + Mul<Output = T> + Div<Output = T> + Trig + From<i32> + Copy { 36 + + Mul<Output = T> + Div<Output = T>
  37 + + Debug + Trig + From<i32> + Copy {
36 TMatrix( (1.into(), 0.into(), 0.into(), 0.into()) 38 TMatrix( (1.into(), 0.into(), 0.into(), 0.into())
37 , (0.into(), 1.into(), 0.into(), 0.into()) 39 , (0.into(), 1.into(), 0.into(), 0.into())
38 , (0.into(), 0.into(), 1.into(), 0.into()) 40 , (0.into(), 0.into(), 1.into(), 0.into())
39 , (0.into(), 0.into(), 0.into(), 1.into()) ) 41 , (0.into(), 0.into(), 0.into(), 1.into()) )
40 } 42 }
  43 +
41 pub fn translate<T>(v :Vector<T>) -> TMatrix<T> 44 pub fn translate<T>(v :Vector<T>) -> TMatrix<T>
42 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> 45 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
43 - + Mul<Output = T> + Div<Output = T> + Trig + From<i32> + Copy {  
44 - let Vector(x, y, z) = v; 46 + + Mul<Output = T> + Div<Output = T>
  47 + + Debug + Trig + From<i32> + Copy {
  48 + let Vector(x, y, z) = v;
45 49
46 - TMatrix( (1.into(), 0.into(), 0.into(), 0.into())  
47 - , (0.into(), 1.into(), 0.into(), 0.into())  
48 - , (0.into(), 0.into(), 1.into(), 0.into())  
49 - , ( x, y, z, 1.into()) ) 50 + TMatrix( (1.into(), 0.into(), 0.into(), x)
  51 + , (0.into(), 1.into(), 0.into(), y)
  52 + , (0.into(), 0.into(), 1.into(), z)
  53 + , (0.into(), 0.into(), 0.into(), 1.into()) )
50 } 54 }
51 55
52 pub fn rotate_x<T>(a :i32) -> TMatrix<T> 56 pub fn rotate_x<T>(a :i32) -> TMatrix<T>
53 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> 57 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
54 - + Mul<Output = T> + Div<Output = T> + Trig + From<i32> + Copy { 58 + + Mul<Output = T> + Div<Output = T>
  59 + + Debug + Trig + From<i32> + Copy {
55 let sin :T = Trig::sin(a); 60 let sin :T = Trig::sin(a);
56 let cos :T = Trig::cos(a); 61 let cos :T = Trig::cos(a);
57 62
@@ -63,7 +68,8 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> @@ -63,7 +68,8 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
63 68
64 pub fn rotate_y<T>(a :i32) -> TMatrix<T> 69 pub fn rotate_y<T>(a :i32) -> TMatrix<T>
65 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> 70 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
66 - + Mul<Output = T> + Div<Output = T> + Trig + From<i32> + Copy { 71 + + Mul<Output = T> + Div<Output = T>
  72 + + Debug + Trig + From<i32> + Copy {
67 let sin :T = Trig::sin(a); 73 let sin :T = Trig::sin(a);
68 let cos :T = Trig::cos(a); 74 let cos :T = Trig::cos(a);
69 75
@@ -75,7 +81,8 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> @@ -75,7 +81,8 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
75 81
76 pub fn rotate_z<T>(a :i32) -> TMatrix<T> 82 pub fn rotate_z<T>(a :i32) -> TMatrix<T>
77 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> 83 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
78 - + Mul<Output = T> + Div<Output = T> + Trig + From<i32> + Copy { 84 + + Mul<Output = T> + Div<Output = T>
  85 + + Debug + Trig + From<i32> + Copy {
79 let sin :T = Trig::sin(a); 86 let sin :T = Trig::sin(a);
80 let cos :T = Trig::cos(a); 87 let cos :T = Trig::cos(a);
81 88
@@ -87,7 +94,8 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> @@ -87,7 +94,8 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
87 94
88 pub fn rotate_v<T>(v :&Vector<T>, a :i32) -> TMatrix<T> 95 pub fn rotate_v<T>(v :&Vector<T>, a :i32) -> TMatrix<T>
89 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> 96 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
90 - + Mul<Output = T> + Div<Output = T> + Trig + From<i32> + Copy { 97 + + Mul<Output = T> + Div<Output = T>
  98 + + Debug + Trig + From<i32> + Copy {
91 let Vector(x, y, z) = *v; 99 let Vector(x, y, z) = *v;
92 100
93 let sin :T = Trig::sin(a); 101 let sin :T = Trig::sin(a);
@@ -113,7 +121,8 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> @@ -113,7 +121,8 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
113 121
114 pub fn scale<T>(v :Vector<T>) -> TMatrix<T> 122 pub fn scale<T>(v :Vector<T>) -> TMatrix<T>
115 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> 123 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
116 - + Mul<Output = T> + Div<Output = T> + Trig + From<i32> + Copy { 124 + + Mul<Output = T> + Div<Output = T>
  125 + + Debug + Trig + From<i32> + Copy {
117 let Vector(x, y, z) = v; 126 let Vector(x, y, z) = v;
118 127
119 TMatrix( ( x, 0.into(), 0.into(), 0.into()) 128 TMatrix( ( x, 0.into(), 0.into(), 0.into())
@@ -124,11 +133,19 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> @@ -124,11 +133,19 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
124 133
125 impl<T> TMatrix<T> 134 impl<T> TMatrix<T>
126 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> 135 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
127 - + Mul<Output = T> + Div<Output = T> + Trig + From<i32> + Copy { 136 + + Mul<Output = T> + Div<Output = T>
  137 + + Debug + Trig + From<i32> + Copy {
  138 + pub fn new( r1 :(T, T, T, T)
  139 + , r2 :(T, T, T, T)
  140 + , r3 :(T, T, T, T)
  141 + , r4 :(T, T, T, T) ) -> TMatrix<T> {
  142 + TMatrix(r1, r2, r3, r4)
  143 + }
  144 +
128 pub fn combine<I>(mi :I) -> TMatrix<T> 145 pub fn combine<I>(mi :I) -> TMatrix<T>
129 where I: IntoIterator<Item = TMatrix<T>> { 146 where I: IntoIterator<Item = TMatrix<T>> {
130 147
131 - mi.into_iter().fold(unit(), |acc, x| acc * x) 148 + mi.into_iter().fold(unit(), |acc, x| x * acc)
132 } 149 }
133 150
134 pub fn apply(&self, v :&Vector<T>) -> Vector<T> { 151 pub fn apply(&self, v :&Vector<T>) -> Vector<T> {
@@ -138,10 +155,10 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> @@ -138,10 +155,10 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
138 , (a41, a42, a43, a44) ) = *self; 155 , (a41, a42, a43, a44) ) = *self;
139 let Vector(x, y, z) = *v; 156 let Vector(x, y, z) = *v;
140 157
141 - let v = Vector( a11 * x + a21 * y + a31 * z + a41  
142 - , a12 * x + a22 * y + a32 * z + a42  
143 - , a13 * x + a23 * y + a33 * z + a43 );  
144 - let w = a14 * x + a24 * y + a34 * z + a44; 158 + let v = Vector( a11 * x + a12 * y + a13 * z + a14
  159 + , a21 * x + a22 * y + a23 * z + a24
  160 + , a31 * x + a32 * y + a33 * z + a34 );
  161 + let w = a41 * x + a42 * y + a43 * z + a44;
145 162
146 v.mul(&w.recip()) 163 v.mul(&w.recip())
147 } 164 }
@@ -149,7 +166,8 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> @@ -149,7 +166,8 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
149 166
150 impl<T> Mul for TMatrix<T> 167 impl<T> Mul for TMatrix<T>
151 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> 168 where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T>
152 - + Mul<Output = T> + Div<Output = T> + Trig + From<i32> + Copy { 169 + + Mul<Output = T> + Div<Output = T>
  170 + + Debug + Trig + From<i32> + Copy {
153 type Output = Self; 171 type Output = Self;
154 172
155 // ATTENTION: This is not commutative, nor assoziative. 173 // ATTENTION: This is not commutative, nor assoziative.
Please register or login to post a comment