229 float max01 = fmaxf( std::abs(mat_pkg[0]), std::abs(mat_pkg[1]) );
230 float max23 = fmaxf( std::abs(mat_pkg[2]), std::abs(mat_pkg[3]) );
231 float max45 = fmaxf( std::abs(mat_pkg[4]), std::abs(mat_pkg[5]) );
232 float m0123 = fmaxf( max01, max23);
233 float scale = fmaxf( max45, m0123);
235 if (scale <= std::numeric_limits<float>::min())
248 float c0 = m00() * m11() * m22()
249 + 2.f * m01() * m02() * m12()
250 - m00() * m12() * m12()
251 - m11() * m02() * m02()
252 - m22() * m01() * m01();
253 float c1 = m00() * m11() -
259 float c2 = m00() + m11() + m22();
263 if(evals.z - evals.x <= std::numeric_limits<float>::epsilon())
265 evecs[0] = make_float3(1.f, 0.f, 0.f);
266 evecs[1] = make_float3(0.f, 1.f, 0.f);
267 evecs[2] = make_float3(0.f, 0.f, 1.f);
269 else if (evals.y - evals.x <= std::numeric_limits<float>::epsilon() )
272 tmp[0] = row0(); tmp[1] = row1(); tmp[2] = row2();
273 tmp[0].x -= evals.z; tmp[1].y -= evals.z; tmp[2].z -= evals.z;
275 vec_tmp[0] =
cross(tmp[0], tmp[1]);
276 vec_tmp[1] =
cross(tmp[0], tmp[2]);
277 vec_tmp[2] =
cross(tmp[1], tmp[2]);
279 float len1 =
dot (vec_tmp[0], vec_tmp[0]);
280 float len2 =
dot (vec_tmp[1], vec_tmp[1]);
281 float len3 =
dot (vec_tmp[2], vec_tmp[2]);
283 if (len1 >= len2 && len1 >= len3)
285 evecs[2] = vec_tmp[0] * rsqrtf (len1);
287 else if (len2 >= len1 && len2 >= len3)
289 evecs[2] = vec_tmp[1] * rsqrtf (len2);
293 evecs[2] = vec_tmp[2] * rsqrtf (len3);
297 evecs[0] =
cross(evecs[1], evecs[2]);
299 else if (evals.z - evals.y <= std::numeric_limits<float>::epsilon() )
302 tmp[0] = row0(); tmp[1] = row1(); tmp[2] = row2();
303 tmp[0].x -= evals.x; tmp[1].y -= evals.x; tmp[2].z -= evals.x;
305 vec_tmp[0] =
cross(tmp[0], tmp[1]);
306 vec_tmp[1] =
cross(tmp[0], tmp[2]);
307 vec_tmp[2] =
cross(tmp[1], tmp[2]);
309 float len1 =
dot(vec_tmp[0], vec_tmp[0]);
310 float len2 =
dot(vec_tmp[1], vec_tmp[1]);
311 float len3 =
dot(vec_tmp[2], vec_tmp[2]);
313 if (len1 >= len2 && len1 >= len3)
315 evecs[0] = vec_tmp[0] * rsqrtf(len1);
317 else if (len2 >= len1 && len2 >= len3)
319 evecs[0] = vec_tmp[1] * rsqrtf(len2);
323 evecs[0] = vec_tmp[2] * rsqrtf(len3);
327 evecs[2] =
cross(evecs[0], evecs[1]);
332 tmp[0] = row0(); tmp[1] = row1(); tmp[2] = row2();
333 tmp[0].x -= evals.z; tmp[1].y -= evals.z; tmp[2].z -= evals.z;
335 vec_tmp[0] =
cross(tmp[0], tmp[1]);
336 vec_tmp[1] =
cross(tmp[0], tmp[2]);
337 vec_tmp[2] =
cross(tmp[1], tmp[2]);
339 float len1 =
dot(vec_tmp[0], vec_tmp[0]);
340 float len2 =
dot(vec_tmp[1], vec_tmp[1]);
341 float len3 =
dot(vec_tmp[2], vec_tmp[2]);
345 unsigned int min_el = 2;
346 unsigned int max_el = 2;
347 if (len1 >= len2 && len1 >= len3)
350 evecs[2] = vec_tmp[0] * rsqrtf (len1);
352 else if (len2 >= len1 && len2 >= len3)
355 evecs[2] = vec_tmp[1] * rsqrtf (len2);
360 evecs[2] = vec_tmp[2] * rsqrtf (len3);
363 tmp[0] = row0(); tmp[1] = row1(); tmp[2] = row2();
364 tmp[0].x -= evals.y; tmp[1].y -= evals.y; tmp[2].z -= evals.y;
366 vec_tmp[0] =
cross(tmp[0], tmp[1]);
367 vec_tmp[1] =
cross(tmp[0], tmp[2]);
368 vec_tmp[2] =
cross(tmp[1], tmp[2]);
370 len1 =
dot(vec_tmp[0], vec_tmp[0]);
371 len2 =
dot(vec_tmp[1], vec_tmp[1]);
372 len3 =
dot(vec_tmp[2], vec_tmp[2]);
374 if (len1 >= len2 && len1 >= len3)
377 evecs[1] = vec_tmp[0] * rsqrtf (len1);
378 min_el = len1 <= mmax[min_el] ? 1 : min_el;
379 max_el = len1 > mmax[max_el] ? 1 : max_el;
381 else if (len2 >= len1 && len2 >= len3)
384 evecs[1] = vec_tmp[1] * rsqrtf (len2);
385 min_el = len2 <= mmax[min_el] ? 1 : min_el;
386 max_el = len2 > mmax[max_el] ? 1 : max_el;
391 evecs[1] = vec_tmp[2] * rsqrtf (len3);
392 min_el = len3 <= mmax[min_el] ? 1 : min_el;
393 max_el = len3 > mmax[max_el] ? 1 : max_el;
396 tmp[0] = row0(); tmp[1] = row1(); tmp[2] = row2();
397 tmp[0].x -= evals.x; tmp[1].y -= evals.x; tmp[2].z -= evals.x;
399 vec_tmp[0] =
cross(tmp[0], tmp[1]);
400 vec_tmp[1] =
cross(tmp[0], tmp[2]);
401 vec_tmp[2] =
cross(tmp[1], tmp[2]);
403 len1 =
dot (vec_tmp[0], vec_tmp[0]);
404 len2 =
dot (vec_tmp[1], vec_tmp[1]);
405 len3 =
dot (vec_tmp[2], vec_tmp[2]);
408 if (len1 >= len2 && len1 >= len3)
411 evecs[0] = vec_tmp[0] * rsqrtf (len1);
412 min_el = len3 <= mmax[min_el] ? 0 : min_el;
413 max_el = len3 > mmax[max_el] ? 0 : max_el;
415 else if (len2 >= len1 && len2 >= len3)
418 evecs[0] = vec_tmp[1] * rsqrtf (len2);
419 min_el = len3 <= mmax[min_el] ? 0 : min_el;
420 max_el = len3 > mmax[max_el] ? 0 : max_el;
425 evecs[0] = vec_tmp[2] * rsqrtf (len3);
426 min_el = len3 <= mmax[min_el] ? 0 : min_el;
427 max_el = len3 > mmax[max_el] ? 0 : max_el;
430 unsigned mid_el = 3 - min_el - max_el;
431 evecs[min_el] =
normalized(
cross( evecs[(min_el+1) % 3], evecs[(min_el+2) % 3] ) );
432 evecs[mid_el] =
normalized(
cross( evecs[(mid_el+1) % 3], evecs[(mid_el+2) % 3] ) );