231 float max01 = fmaxf( std::abs(mat_pkg[0]), std::abs(mat_pkg[1]) );
232 float max23 = fmaxf( std::abs(mat_pkg[2]), std::abs(mat_pkg[3]) );
233 float max45 = fmaxf( std::abs(mat_pkg[4]), std::abs(mat_pkg[5]) );
234 float m0123 = fmaxf( max01, max23);
235 float scale = fmaxf( max45, m0123);
237 if (scale <= std::numeric_limits<float>::min())
250 float c0 = m00() * m11() * m22()
251 + 2.f * m01() * m02() * m12()
252 - m00() * m12() * m12()
253 - m11() * m02() * m02()
254 - m22() * m01() * m01();
255 float c1 = m00() * m11() -
261 float c2 = m00() + m11() + m22();
265 if(evals.z - evals.x <= std::numeric_limits<float>::epsilon())
267 evecs[0] = make_float3(1.f, 0.f, 0.f);
268 evecs[1] = make_float3(0.f, 1.f, 0.f);
269 evecs[2] = make_float3(0.f, 0.f, 1.f);
271 else if (evals.y - evals.x <= std::numeric_limits<float>::epsilon() )
274 tmp[0] = row0(); tmp[1] = row1(); tmp[2] = row2();
275 tmp[0].x -= evals.z; tmp[1].y -= evals.z; tmp[2].z -= evals.z;
277 vec_tmp[0] =
cross(tmp[0], tmp[1]);
278 vec_tmp[1] =
cross(tmp[0], tmp[2]);
279 vec_tmp[2] =
cross(tmp[1], tmp[2]);
281 float len1 =
dot (vec_tmp[0], vec_tmp[0]);
282 float len2 =
dot (vec_tmp[1], vec_tmp[1]);
283 float len3 =
dot (vec_tmp[2], vec_tmp[2]);
285 if (len1 >= len2 && len1 >= len3)
287 evecs[2] = vec_tmp[0] * rsqrtf (len1);
289 else if (len2 >= len1 && len2 >= len3)
291 evecs[2] = vec_tmp[1] * rsqrtf (len2);
295 evecs[2] = vec_tmp[2] * rsqrtf (len3);
299 evecs[0] =
cross(evecs[1], evecs[2]);
301 else if (evals.z - evals.y <= std::numeric_limits<float>::epsilon() )
304 tmp[0] = row0(); tmp[1] = row1(); tmp[2] = row2();
305 tmp[0].x -= evals.x; tmp[1].y -= evals.x; tmp[2].z -= evals.x;
307 vec_tmp[0] =
cross(tmp[0], tmp[1]);
308 vec_tmp[1] =
cross(tmp[0], tmp[2]);
309 vec_tmp[2] =
cross(tmp[1], tmp[2]);
311 float len1 =
dot(vec_tmp[0], vec_tmp[0]);
312 float len2 =
dot(vec_tmp[1], vec_tmp[1]);
313 float len3 =
dot(vec_tmp[2], vec_tmp[2]);
315 if (len1 >= len2 && len1 >= len3)
317 evecs[0] = vec_tmp[0] * rsqrtf(len1);
319 else if (len2 >= len1 && len2 >= len3)
321 evecs[0] = vec_tmp[1] * rsqrtf(len2);
325 evecs[0] = vec_tmp[2] * rsqrtf(len3);
329 evecs[2] =
cross(evecs[0], evecs[1]);
334 tmp[0] = row0(); tmp[1] = row1(); tmp[2] = row2();
335 tmp[0].x -= evals.z; tmp[1].y -= evals.z; tmp[2].z -= evals.z;
337 vec_tmp[0] =
cross(tmp[0], tmp[1]);
338 vec_tmp[1] =
cross(tmp[0], tmp[2]);
339 vec_tmp[2] =
cross(tmp[1], tmp[2]);
341 float len1 =
dot(vec_tmp[0], vec_tmp[0]);
342 float len2 =
dot(vec_tmp[1], vec_tmp[1]);
343 float len3 =
dot(vec_tmp[2], vec_tmp[2]);
347 unsigned int min_el = 2;
348 unsigned int max_el = 2;
349 if (len1 >= len2 && len1 >= len3)
352 evecs[2] = vec_tmp[0] * rsqrtf (len1);
354 else if (len2 >= len1 && len2 >= len3)
357 evecs[2] = vec_tmp[1] * rsqrtf (len2);
362 evecs[2] = vec_tmp[2] * rsqrtf (len3);
365 tmp[0] = row0(); tmp[1] = row1(); tmp[2] = row2();
366 tmp[0].x -= evals.y; tmp[1].y -= evals.y; tmp[2].z -= evals.y;
368 vec_tmp[0] =
cross(tmp[0], tmp[1]);
369 vec_tmp[1] =
cross(tmp[0], tmp[2]);
370 vec_tmp[2] =
cross(tmp[1], tmp[2]);
372 len1 =
dot(vec_tmp[0], vec_tmp[0]);
373 len2 =
dot(vec_tmp[1], vec_tmp[1]);
374 len3 =
dot(vec_tmp[2], vec_tmp[2]);
376 if (len1 >= len2 && len1 >= len3)
379 evecs[1] = vec_tmp[0] * rsqrtf (len1);
380 min_el = len1 <= mmax[min_el] ? 1 : min_el;
381 max_el = len1 > mmax[max_el] ? 1 : max_el;
383 else if (len2 >= len1 && len2 >= len3)
386 evecs[1] = vec_tmp[1] * rsqrtf (len2);
387 min_el = len2 <= mmax[min_el] ? 1 : min_el;
388 max_el = len2 > mmax[max_el] ? 1 : max_el;
393 evecs[1] = vec_tmp[2] * rsqrtf (len3);
394 min_el = len3 <= mmax[min_el] ? 1 : min_el;
395 max_el = len3 > mmax[max_el] ? 1 : max_el;
398 tmp[0] = row0(); tmp[1] = row1(); tmp[2] = row2();
399 tmp[0].x -= evals.x; tmp[1].y -= evals.x; tmp[2].z -= evals.x;
401 vec_tmp[0] =
cross(tmp[0], tmp[1]);
402 vec_tmp[1] =
cross(tmp[0], tmp[2]);
403 vec_tmp[2] =
cross(tmp[1], tmp[2]);
405 len1 =
dot (vec_tmp[0], vec_tmp[0]);
406 len2 =
dot (vec_tmp[1], vec_tmp[1]);
407 len3 =
dot (vec_tmp[2], vec_tmp[2]);
410 if (len1 >= len2 && len1 >= len3)
413 evecs[0] = vec_tmp[0] * rsqrtf (len1);
414 min_el = len3 <= mmax[min_el] ? 0 : min_el;
415 max_el = len3 > mmax[max_el] ? 0 : max_el;
417 else if (len2 >= len1 && len2 >= len3)
420 evecs[0] = vec_tmp[1] * rsqrtf (len2);
421 min_el = len3 <= mmax[min_el] ? 0 : min_el;
422 max_el = len3 > mmax[max_el] ? 0 : max_el;
427 evecs[0] = vec_tmp[2] * rsqrtf (len3);
428 min_el = len3 <= mmax[min_el] ? 0 : min_el;
429 max_el = len3 > mmax[max_el] ? 0 : max_el;
432 unsigned mid_el = 3 - min_el - max_el;
433 evecs[min_el] =
normalized(
cross( evecs[(min_el+1) % 3], evecs[(min_el+2) % 3] ) );
434 evecs[mid_el] =
normalized(
cross( evecs[(mid_el+1) % 3], evecs[(mid_el+2) % 3] ) );