| 216 | } |
| 217 | |
| 218 | function invert4(a) { |
| 219 | let b00 = a[0] * a[5] - a[1] * a[4]; |
| 220 | let b01 = a[0] * a[6] - a[2] * a[4]; |
| 221 | let b02 = a[0] * a[7] - a[3] * a[4]; |
| 222 | let b03 = a[1] * a[6] - a[2] * a[5]; |
| 223 | let b04 = a[1] * a[7] - a[3] * a[5]; |
| 224 | let b05 = a[2] * a[7] - a[3] * a[6]; |
| 225 | let b06 = a[8] * a[13] - a[9] * a[12]; |
| 226 | let b07 = a[8] * a[14] - a[10] * a[12]; |
| 227 | let b08 = a[8] * a[15] - a[11] * a[12]; |
| 228 | let b09 = a[9] * a[14] - a[10] * a[13]; |
| 229 | let b10 = a[9] * a[15] - a[11] * a[13]; |
| 230 | let b11 = a[10] * a[15] - a[11] * a[14]; |
| 231 | let det = |
| 232 | b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; |
| 233 | if (!det) return null; |
| 234 | return [ |
| 235 | (a[5] * b11 - a[6] * b10 + a[7] * b09) / det, |
| 236 | (a[2] * b10 - a[1] * b11 - a[3] * b09) / det, |
| 237 | (a[13] * b05 - a[14] * b04 + a[15] * b03) / det, |
| 238 | (a[10] * b04 - a[9] * b05 - a[11] * b03) / det, |
| 239 | (a[6] * b08 - a[4] * b11 - a[7] * b07) / det, |
| 240 | (a[0] * b11 - a[2] * b08 + a[3] * b07) / det, |
| 241 | (a[14] * b02 - a[12] * b05 - a[15] * b01) / det, |
| 242 | (a[8] * b05 - a[10] * b02 + a[11] * b01) / det, |
| 243 | (a[4] * b10 - a[5] * b08 + a[7] * b06) / det, |
| 244 | (a[1] * b08 - a[0] * b10 - a[3] * b06) / det, |
| 245 | (a[12] * b04 - a[13] * b02 + a[15] * b00) / det, |
| 246 | (a[9] * b02 - a[8] * b04 - a[11] * b00) / det, |
| 247 | (a[5] * b07 - a[4] * b09 - a[6] * b06) / det, |
| 248 | (a[0] * b09 - a[1] * b07 + a[2] * b06) / det, |
| 249 | (a[13] * b01 - a[12] * b03 - a[14] * b00) / det, |
| 250 | (a[8] * b03 - a[9] * b01 + a[10] * b00) / det, |
| 251 | ]; |
| 252 | } |
| 253 | |
| 254 | function rotate4(a, rad, x, y, z) { |
| 255 | let len = Math.hypot(x, y, z); |