@@ -164,6 +164,100 @@ impl Mat3A {
164164 )
165165 }
166166
167+ /// Creates a 3x3 matrix from the minor of the given 4x4 matrix, discarding the `i`th column
168+ /// and `j`th row.
169+ ///
170+ /// # Panics
171+ ///
172+ /// Panics if `i` or `j` is greater than 3.
173+ #[ inline]
174+ #[ must_use]
175+ pub fn from_mat4_minor ( m : Mat4 , i : usize , j : usize ) -> Self {
176+ match ( i, j) {
177+ ( 0 , 0 ) => Self :: from_cols (
178+ Vec3A :: from_vec4 ( m. y_axis . yzww ( ) ) ,
179+ Vec3A :: from_vec4 ( m. z_axis . yzww ( ) ) ,
180+ Vec3A :: from_vec4 ( m. w_axis . yzww ( ) ) ,
181+ ) ,
182+ ( 0 , 1 ) => Self :: from_cols (
183+ Vec3A :: from_vec4 ( m. y_axis . xzww ( ) ) ,
184+ Vec3A :: from_vec4 ( m. z_axis . xzww ( ) ) ,
185+ Vec3A :: from_vec4 ( m. w_axis . xzww ( ) ) ,
186+ ) ,
187+ ( 0 , 2 ) => Self :: from_cols (
188+ Vec3A :: from_vec4 ( m. y_axis . xyww ( ) ) ,
189+ Vec3A :: from_vec4 ( m. z_axis . xyww ( ) ) ,
190+ Vec3A :: from_vec4 ( m. w_axis . xyww ( ) ) ,
191+ ) ,
192+ ( 0 , 3 ) => Self :: from_cols (
193+ Vec3A :: from_vec4 ( m. y_axis . xyzw ( ) ) ,
194+ Vec3A :: from_vec4 ( m. z_axis . xyzw ( ) ) ,
195+ Vec3A :: from_vec4 ( m. w_axis . xyzw ( ) ) ,
196+ ) ,
197+ ( 1 , 0 ) => Self :: from_cols (
198+ Vec3A :: from_vec4 ( m. x_axis . yzww ( ) ) ,
199+ Vec3A :: from_vec4 ( m. z_axis . yzww ( ) ) ,
200+ Vec3A :: from_vec4 ( m. w_axis . yzww ( ) ) ,
201+ ) ,
202+ ( 1 , 1 ) => Self :: from_cols (
203+ Vec3A :: from_vec4 ( m. x_axis . xzww ( ) ) ,
204+ Vec3A :: from_vec4 ( m. z_axis . xzww ( ) ) ,
205+ Vec3A :: from_vec4 ( m. w_axis . xzww ( ) ) ,
206+ ) ,
207+ ( 1 , 2 ) => Self :: from_cols (
208+ Vec3A :: from_vec4 ( m. x_axis . xyww ( ) ) ,
209+ Vec3A :: from_vec4 ( m. z_axis . xyww ( ) ) ,
210+ Vec3A :: from_vec4 ( m. w_axis . xyww ( ) ) ,
211+ ) ,
212+ ( 1 , 3 ) => Self :: from_cols (
213+ Vec3A :: from_vec4 ( m. x_axis . xyzw ( ) ) ,
214+ Vec3A :: from_vec4 ( m. z_axis . xyzw ( ) ) ,
215+ Vec3A :: from_vec4 ( m. w_axis . xyzw ( ) ) ,
216+ ) ,
217+ ( 2 , 0 ) => Self :: from_cols (
218+ Vec3A :: from_vec4 ( m. x_axis . yzww ( ) ) ,
219+ Vec3A :: from_vec4 ( m. y_axis . yzww ( ) ) ,
220+ Vec3A :: from_vec4 ( m. w_axis . yzww ( ) ) ,
221+ ) ,
222+ ( 2 , 1 ) => Self :: from_cols (
223+ Vec3A :: from_vec4 ( m. x_axis . xzww ( ) ) ,
224+ Vec3A :: from_vec4 ( m. y_axis . xzww ( ) ) ,
225+ Vec3A :: from_vec4 ( m. w_axis . xzww ( ) ) ,
226+ ) ,
227+ ( 2 , 2 ) => Self :: from_cols (
228+ Vec3A :: from_vec4 ( m. x_axis . xyww ( ) ) ,
229+ Vec3A :: from_vec4 ( m. y_axis . xyww ( ) ) ,
230+ Vec3A :: from_vec4 ( m. w_axis . xyww ( ) ) ,
231+ ) ,
232+ ( 2 , 3 ) => Self :: from_cols (
233+ Vec3A :: from_vec4 ( m. x_axis . xyzw ( ) ) ,
234+ Vec3A :: from_vec4 ( m. y_axis . xyzw ( ) ) ,
235+ Vec3A :: from_vec4 ( m. w_axis . xyzw ( ) ) ,
236+ ) ,
237+ ( 3 , 0 ) => Self :: from_cols (
238+ Vec3A :: from_vec4 ( m. x_axis . yzww ( ) ) ,
239+ Vec3A :: from_vec4 ( m. y_axis . yzww ( ) ) ,
240+ Vec3A :: from_vec4 ( m. z_axis . yzww ( ) ) ,
241+ ) ,
242+ ( 3 , 1 ) => Self :: from_cols (
243+ Vec3A :: from_vec4 ( m. x_axis . xzww ( ) ) ,
244+ Vec3A :: from_vec4 ( m. y_axis . xzww ( ) ) ,
245+ Vec3A :: from_vec4 ( m. z_axis . xzww ( ) ) ,
246+ ) ,
247+ ( 3 , 2 ) => Self :: from_cols (
248+ Vec3A :: from_vec4 ( m. x_axis . xyww ( ) ) ,
249+ Vec3A :: from_vec4 ( m. y_axis . xyww ( ) ) ,
250+ Vec3A :: from_vec4 ( m. z_axis . xyww ( ) ) ,
251+ ) ,
252+ ( 3 , 3 ) => Self :: from_cols (
253+ Vec3A :: from_vec4 ( m. x_axis . xyzw ( ) ) ,
254+ Vec3A :: from_vec4 ( m. y_axis . xyzw ( ) ) ,
255+ Vec3A :: from_vec4 ( m. z_axis . xyzw ( ) ) ,
256+ ) ,
257+ _ => panic ! ( "index out of bounds" ) ,
258+ }
259+ }
260+
167261 /// Creates a 3D rotation matrix from the given quaternion.
168262 ///
169263 /// # Panics
0 commit comments