aboutsummaryrefslogtreecommitdiff
path: root/KaplaDemo/samples/sampleViewer3/MathUtils.h
diff options
context:
space:
mode:
authorgit perforce import user <a@b>2016-10-25 12:29:14 -0600
committerSheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees>2016-10-25 18:56:37 -0500
commit3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch)
treefa6485c169e50d7415a651bf838f5bcd0fd3bfbd /KaplaDemo/samples/sampleViewer3/MathUtils.h
downloadphysx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz
physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip
Initial commit:
PhysX 3.4.0 Update @ 21294896 APEX 1.4.0 Update @ 21275617 [CL 21300167]
Diffstat (limited to 'KaplaDemo/samples/sampleViewer3/MathUtils.h')
-rw-r--r--KaplaDemo/samples/sampleViewer3/MathUtils.h102
1 files changed, 102 insertions, 0 deletions
diff --git a/KaplaDemo/samples/sampleViewer3/MathUtils.h b/KaplaDemo/samples/sampleViewer3/MathUtils.h
new file mode 100644
index 00000000..0051ff1e
--- /dev/null
+++ b/KaplaDemo/samples/sampleViewer3/MathUtils.h
@@ -0,0 +1,102 @@
+#ifndef MATH_UTILS
+#define MATH_UTILS
+
+#include "foundation/PxVec3.h"
+#include "foundation/PxQuat.h"
+#include "foundation/PxMath.h"
+
+using namespace physx;
+
+// ------------------------------------------------------------------------
+PX_FORCE_INLINE PxF32 randRange(const PxF32 a, const PxF32 b)
+{
+ return a + (b-a)*::rand()/RAND_MAX;
+}
+
+// ------------------------------------------------------------------------
+inline static float fastInvSqrt(float input)
+{
+ const float halfInput = 0.5f * input;
+ int i = *(int*)&input;
+
+ i = 0x5f375a86 - ( i >> 1 );
+ input = *(float*) & i;
+ input = input * ( 1.5f - halfInput * input * input);
+ return input;
+}
+
+// ------------------------------------------------------------------------
+inline static void fastNormalize(PxVec3 &v) {
+ v *= fastInvSqrt(v.magnitudeSquared());
+}
+
+// ------------------------------------------------------------------------
+inline static float fastLen(PxVec3 &v) {
+ return 1.0f / fastInvSqrt(v.magnitudeSquared());
+}
+
+// ------------------------------------------------------------------------
+inline static float fastNormalizeLen(PxVec3 &v) {
+ float inv = fastInvSqrt(v.magnitudeSquared());
+ v *= inv;
+ return 1.0f / inv;
+}
+
+// ------------------------------------------------------------------------
+inline static float fastAcos(float x) {
+ // MacLaurin series
+ if (x < -1.0f) x = -1.0f;
+ if (x > 1.0f) x = 1.0f;
+ float x2 = x*x;
+ float angle = (35.0f/1152.0f)*x2;
+ angle = (5.0f/112.0f) + angle*x2;
+ angle = (3.0f/40.0f) + angle*x2;
+ angle = (1.0f/6.0f) + angle*x2;
+ angle = 1 + angle*x2;
+ angle = 1.5707963267948966f - angle * x;
+ return angle;
+}
+
+// ------------------------------------------------------------------------
+inline static void quatFromVectors(const PxVec3 &n0, const PxVec3 &n1, PxQuat &q)
+{
+ // fast approximation
+ PxVec3 axis = n0.cross(n1) * 0.5f;
+ q = PxQuat(axis.x, axis.y, axis.z, PxSqrt(1.0f - axis.magnitudeSquared()));
+
+ // correct
+ //PxVec3 axis = n0 ^ n1;
+ //axis.normalize();
+ //float s = PxMath::sqrt(0.5f * (1.0f - n0.dot(n1)));
+ //q.x = axis.x * s;
+ //q.y = axis.y * s;
+ //q.z = axis.z * s;
+ //q.w = PxMath::sqrt(1.0f - s*s);
+}
+
+// ------------------------------------------------------------------------
+void polarDecomposition(const PxMat33 &A, PxMat33 &R);
+void polarDecompositionStabilized(const PxMat33 &A, PxMat33 &R);
+
+// ------------------------------------------------------------------------
+void eigenDecomposition(PxMat33 &A, PxMat33 &R);
+
+// ------------------------------------------------------------------------
+void eigenDecomposition22(const PxMat33 &A, PxMat33 &R, PxMat33 &D);
+
+// ------------------------------------------------------------------------
+PxMat33 outerProduct(const PxVec3 &v0, const PxVec3 &v1);
+
+// ------------------------------------------------------------------------
+PxQuat align(const PxVec3& v1, const PxVec3& v2);
+
+// ------------------------------------------------------------------------
+void decomposeTwistTimesSwing(const PxQuat& q, const PxVec3& v1,
+ PxQuat& twist, PxQuat& swing);
+
+// ------------------------------------------------------------------------
+void decomposeSwingTimesTwist(const PxQuat& q, const PxVec3& v1,
+ PxQuat& swing, PxQuat& twist);
+
+
+#endif \ No newline at end of file