[
  {
    "path": ".gitignore",
    "content": "﻿################################################################################\n# This .gitignore file was automatically created by Microsoft(R) Visual Studio.\n################################################################################\n\n/Temp\n/.vs/2D-Deformable-body-in-Unity/v16\n/Library\n/Logs\n/obj/Debug\n"
  },
  {
    "path": "Assets/Common/Decomposition/Decomposition2x2d.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nusing Common.Core.LinearAlgebra;\r\n\r\nnamespace Common.Mathematics.Decomposition\r\n{\r\n    public static class Decomposition2x2d\r\n    {\r\n\r\n        public static Matrix2x2d QRDecomposition(Matrix2x2d m)\n        {\r\n            Vector2d a = m.GetColumn(0).Normalized;\r\n            Matrix2x2d q = new Matrix2x2d();\r\n\r\n            q.SetColumn(0, a);\n            q.SetColumn(1, a.PerpendicularCCW);\r\n\r\n            return q;\n        }\r\n\r\n        public static Matrix2x2d PolarDecomposition(Matrix2x2d m)\n        {\r\n            Matrix2x2d q = m + new Matrix2x2d(m.m11, -m.m10, -m.m01, m.m00);\r\n\r\n            Vector2d c0 = q.GetColumn(0);\r\n            Vector2d c1 = q.GetColumn(1);\r\n\r\n            double s = c0.Magnitude;\r\n            q.SetColumn(0, c0 / s);\r\n            q.SetColumn(1, c1 / s);\r\n\r\n            return q;\n        }\r\n\r\n        public static void EigenDecomposition(Matrix2x2d m, out double e1, out double e2)\r\n        {\r\n            // solve the characteristic polynomial\r\n            double a = 1.0;\r\n            double b = -(m.m00 + m.m11);\r\n            double c = m.m00 * m.m11 - m.m01 * m.m10;\r\n\r\n            SolveQuadratic(a, b, c, out e1, out e2);\r\n        }\r\n\r\n        private static bool SolveQuadratic(double a, double b, double c, out double min, out double max)\r\n        {\r\n            min = max = 0.0;\r\n\r\n            if (a == 0.0 && b == 0.0)\r\n                return true;\r\n\r\n            double discriminant = b * b - 4.0 * a * c;\r\n\r\n            if (discriminant < 0.0)\r\n                return false;\r\n\r\n            // numerical receipes 5.6 (this method ensures numerical accuracy is preserved)\r\n            double t = -0.5 * (b + Math.Sign(b) * Math.Sqrt(discriminant));\r\n            min = t / a;\r\n            max = c / t;\r\n\r\n            if (min > max)\r\n            {\r\n                double tmp = min;\r\n                min = max;\r\n                max = tmp;\r\n            }\r\n\r\n            return true;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "Assets/Common/Decomposition/Decomposition2x2d.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 60689437f1f73d04da8380919053e6e8\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/Decomposition/Decomposition2x2f.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nusing Common.Core.LinearAlgebra;\r\n\r\nnamespace Common.Mathematics.Decomposition\r\n{\r\n    public static class Decomposition2x2f\r\n    {\r\n\r\n        public static Matrix2x2f QRDecomposition(Matrix2x2f m)\n        {\r\n            Vector2f a = m.GetColumn(0).Normalized;\r\n            Matrix2x2f q = new Matrix2x2f();\r\n\r\n            q.SetColumn(0, a);\n            q.SetColumn(1, a.PerpendicularCCW);\r\n\r\n            return q;\n        }\r\n\r\n        public static Matrix2x2f PolarDecomposition(Matrix2x2f m)\n        {\r\n            Matrix2x2f q = m + new Matrix2x2f(m.m11, -m.m10, -m.m01, m.m00);\r\n\r\n            Vector2f c0 = q.GetColumn(0);\r\n            Vector2f c1 = q.GetColumn(1);\r\n\r\n            float s = c0.Magnitude;\r\n            q.SetColumn(0, c0 / s);\r\n            q.SetColumn(1, c1 / s);\r\n\r\n            return q;\n        }\r\n\r\n        public static void EigenDecomposition(Matrix2x2f m, out float e1, out float e2)\r\n        {\r\n            // solve the characteristic polynomial\r\n            float a = 1.0f;\r\n            float b = -(m.m00 + m.m11);\r\n            float c = m.m00 * m.m11 - m.m01 * m.m10;\r\n\r\n            SolveQuadratic(a, b, c, out e1, out e2);\r\n        }\r\n\r\n        private static bool SolveQuadratic(float a, float b, float c, out float min, out float max)\r\n        {\r\n            min = max = 0.0f;\r\n\r\n            if (a == 0.0f && b == 0.0f)\r\n                return true;\r\n\r\n            float discriminant = b * b - 4.0f * a * c;\r\n\r\n            if (discriminant < 0.0f)\r\n                return false;\r\n\r\n            // numerical receipes 5.6 (this method ensures numerical accuracy is preserved)\r\n            float t = (float)(-0.5 * (b + Math.Sign(b) * Math.Sqrt(discriminant)));\r\n            min = t / a;\r\n            max = c / t;\r\n\r\n            if (min > max)\r\n            {\r\n                float tmp = min;\r\n                min = max;\r\n                max = tmp;\r\n            }\r\n\r\n            return true;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "Assets/Common/Decomposition/Decomposition2x2f.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 677436b12b96e754eb23bb58733959f9\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/Decomposition/Decomposition3x3d.cs",
    "content": "﻿using System;\r\n\r\nusing Common.Core.LinearAlgebra;\r\n\r\nnamespace Common.Mathematics.Decomposition\r\n{\r\n\r\n    public static class Decomposition3x3d\r\n    {\r\n        /// <summary>\r\n        /// Rotates A through phi in pq-plane to set A(p,q) = 0\r\n\t    /// Rotation stored in R whose columns are eigenvectors of A\r\n        /// </summary>\r\n        public static void JacobiRotate(ref Matrix3x3d A, ref Matrix3x3d R, int p, int q)\r\n        {\r\n\r\n            if (A[p, q] == 0.0f)\r\n                return;\r\n\r\n            double d = (A[p, p] - A[q, q]) / (2.0f * A[p, q]);\r\n            double t = 1.0 / (Math.Abs(d) + Math.Sqrt(d * d + 1.0));\r\n            if (d < 0.0f) t = -t;\r\n            double c = 1.0 / Math.Sqrt(t * t + 1);\r\n            double s = t * c;\r\n\r\n            A[p, p] += t * A[p, q];\r\n            A[q, q] -= t * A[p, q];\r\n            A[p, q] = A[q, p] = 0.0f;\r\n\r\n            // transform A\r\n            int k;\r\n            for (k = 0; k < 3; k++)\r\n            {\r\n                if (k != p && k != q)\r\n                {\r\n                    double Akp = c * A[k, p] + s * A[k, q];\r\n                    double Akq = -s * A[k, p] + c * A[k, q];\r\n                    A[k, p] = A[p, k] = Akp;\r\n                    A[k, q] = A[q, k] = Akq;\r\n                }\r\n            }\r\n\r\n            // store rotation in R\r\n            for (k = 0; k < 3; k++)\r\n            {\r\n                double Rkp = c * R[k, p] + s * R[k, q];\r\n                double Rkq = -s * R[k, p] + c * R[k, q];\r\n                R[k, p] = Rkp;\r\n                R[k, q] = Rkq;\r\n            }\r\n        }\r\n\r\n        public static void EigenDecomposition(Matrix3x3d A, out Matrix3x3d eigenVecs, out Vector3d eigenVals)\r\n        {\r\n\r\n            const int numJacobiIterations = 10;\r\n            const double epsilon = 1e-15;\r\n\r\n            Matrix3x3d D = A;\r\n\r\n            // only for symmetric matrices!\r\n            eigenVecs = Matrix3x3d.Identity;    // unit matrix\r\n            int iter = 0;\r\n\r\n            while (iter < numJacobiIterations)\r\n            {\r\n                // 3 off diagonal elements\r\n                // find off diagonal element with maximum modulus\r\n                int p, q;\r\n                double a, max;\r\n                max = Math.Abs(D.m01);\r\n                p = 0; q = 1;\r\n                a = Math.Abs(D.m02);\r\n                if (a > max) { p = 0; q = 2; max = a; }\r\n                a = Math.Abs(D.m12);\r\n                if (a > max) { p = 1; q = 2; max = a; }\r\n                // all small enough -> done\r\n                if (max < epsilon) break;\r\n                // rotate matrix with respect to that element\r\n                JacobiRotate(ref D, ref eigenVecs, p, q);\r\n                iter++;\r\n            }\r\n\r\n            eigenVals = new Vector3d(D.m00, D.m11, D.m22);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Perform polar decomposition A = (U D U^T) R\r\n        /// </summary>\r\n        public static void PolarDecomposition(Matrix3x3d A, out Matrix3x3d R, out Matrix3x3d U, out Matrix3x3d D)\r\n        {\r\n            // A = SR, where S is symmetric and R is orthonormal\r\n            // -> S = (A A^T)^(1/2)\r\n\r\n            // A = U D U^T R\r\n\r\n            Matrix3x3d AAT = new Matrix3x3d();\r\n            AAT.m00 = A.m00 * A.m00 + A.m01 * A.m01 + A.m02 * A.m02;\r\n            AAT.m11 = A.m10 * A.m10 + A.m11 * A.m11 + A.m12 * A.m12;\r\n            AAT.m22 = A.m20 * A.m20 + A.m21 * A.m21 + A.m22 * A.m22;\r\n\r\n            AAT.m01 = A.m00 * A.m10 + A.m01 * A.m11 + A.m02 * A.m12;\r\n            AAT.m02 = A.m00 * A.m20 + A.m01 * A.m21 + A.m02 * A.m22;\r\n            AAT.m12 = A.m10 * A.m20 + A.m11 * A.m21 + A.m12 * A.m22;\r\n\r\n            AAT.m10 = AAT.m01;\r\n            AAT.m20 = AAT.m02;\r\n            AAT.m21 = AAT.m12;\r\n\r\n            R = Matrix3x3d.Identity;\r\n            Vector3d eigenVals;\r\n            EigenDecomposition(AAT, out U, out eigenVals);\r\n\r\n            double d0 = Math.Sqrt(eigenVals.x);\r\n            double d1 = Math.Sqrt(eigenVals.y);\r\n            double d2 = Math.Sqrt(eigenVals.z);\r\n\r\n            D = new Matrix3x3d();\r\n            D.m00 = d0;\r\n            D.m11 = d1;\r\n            D.m22 = d2;\r\n\r\n            const double eps = 1e-15;\r\n\r\n            double l0 = eigenVals.x; if (l0 <= eps) l0 = 0.0; else l0 = 1.0 / d0;\r\n            double l1 = eigenVals.y; if (l1 <= eps) l1 = 0.0; else l1 = 1.0 / d1;\r\n            double l2 = eigenVals.z; if (l2 <= eps) l2 = 0.0; else l2 = 1.0 / d2;\r\n\r\n            Matrix3x3d S1 = new Matrix3x3d();\r\n            S1.m00 = l0 * U.m00 * U.m00 + l1 * U.m01 * U.m01 + l2 * U.m02 * U.m02;\r\n            S1.m11 = l0 * U.m10 * U.m10 + l1 * U.m11 * U.m11 + l2 * U.m12 * U.m12;\r\n            S1.m22 = l0 * U.m20 * U.m20 + l1 * U.m21 * U.m21 + l2 * U.m22 * U.m22;\r\n\r\n            S1.m01 = l0 * U.m00 * U.m10 + l1 * U.m01 * U.m11 + l2 * U.m02 * U.m12;\r\n            S1.m02 = l0 * U.m00 * U.m20 + l1 * U.m01 * U.m21 + l2 * U.m02 * U.m22;\r\n            S1.m12 = l0 * U.m10 * U.m20 + l1 * U.m11 * U.m21 + l2 * U.m12 * U.m22;\r\n\r\n            S1.m10 = S1.m01;\r\n            S1.m20 = S1.m02;\r\n            S1.m21 = S1.m12;\r\n\r\n            R = S1 * A;\r\n\r\n            // stabilize\r\n            Vector3d c0, c1, c2;\r\n            c0 = R.GetColumn(0);\r\n            c1 = R.GetColumn(1);\r\n            c2 = R.GetColumn(2);\r\n\r\n            if (c0.SqrMagnitude < eps)\r\n                c0 = c1.Cross(c2);\r\n            else if (c1.SqrMagnitude < eps)\r\n                c1 = c2.Cross(c0);\r\n            else\r\n                c2 = c0.Cross(c1);\r\n\r\n            R.SetColumn(0, c0);\r\n            R.SetColumn(1, c1);\r\n            R.SetColumn(2, c2);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Return the one norm of the matrix.\r\n        /// </summary>\r\n        public static double OneNorm(Matrix3x3d A)\r\n        {\r\n            double sum1 = Math.Abs(A.m00) + Math.Abs(A.m10) + Math.Abs(A.m20);\r\n            double sum2 = Math.Abs(A.m01) + Math.Abs(A.m11) + Math.Abs(A.m21);\r\n            double sum3 = Math.Abs(A.m02) + Math.Abs(A.m12) + Math.Abs(A.m22);\r\n\r\n            double maxSum = sum1;\r\n\r\n            if (sum2 > maxSum)\r\n                maxSum = sum2;\r\n            if (sum3 > maxSum)\r\n                maxSum = sum3;\r\n\r\n            return maxSum;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Return the inf norm of the matrix.\r\n        /// </summary>\r\n        public static double InfNorm(Matrix3x3d A)\r\n        {\r\n            double sum1 = Math.Abs(A.m00) + Math.Abs(A.m01) + Math.Abs(A.m02);\r\n            double sum2 = Math.Abs(A.m10) + Math.Abs(A.m11) + Math.Abs(A.m12);\r\n            double sum3 = Math.Abs(A.m20) + Math.Abs(A.m21) + Math.Abs(A.m22);\r\n\r\n            double maxSum = sum1;\r\n\r\n            if (sum2 > maxSum)\r\n                maxSum = sum2;\r\n            if (sum3 > maxSum)\r\n                maxSum = sum3;\r\n\r\n            return maxSum;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Perform a polar decomposition of matrix M and return the rotation matrix R. This method handles the degenerated cases.\r\n        /// </summary>am>\r\n        public static void PolarDecompositionStable(Matrix3x3d M, double tolerance, out Matrix3x3d R)\r\n        {\r\n            Matrix3x3d Mt = M.Transpose;\r\n            double Mone = OneNorm(M);\r\n            double Minf = InfNorm(M);\r\n            double Eone;\r\n            Matrix3x3d MadjTt = new Matrix3x3d();\r\n            Matrix3x3d Et = new Matrix3x3d();\r\n\r\n            const double eps = 1.0e-15;\r\n\r\n            do\r\n            {\r\n                MadjTt.SetRow(0, Mt.GetRow(1).Cross(Mt.GetRow(2)));\r\n                MadjTt.SetRow(1, Mt.GetRow(2).Cross(Mt.GetRow(0)));\r\n                MadjTt.SetRow(2, Mt.GetRow(0).Cross(Mt.GetRow(1)));\r\n\r\n                double det = Mt.m00 * MadjTt.m00 + Mt.m01 * MadjTt.m01 + Mt.m02 * MadjTt.m02;\r\n\r\n                if (Math.Abs(det) < eps)\r\n                {\r\n                    int index = int.MaxValue;\r\n                    for (int i = 0; i < 3; i++)\r\n                    {\r\n                        double len = MadjTt.GetRow(i).SqrMagnitude;\r\n                        if (len > eps)\r\n                        {\r\n                            // index of valid cross product\r\n                            // => is also the index of the vector in Mt that must be exchanged\r\n                            index = i;\r\n                            break;\r\n                        }\r\n                    }\r\n\r\n                    if (index == int.MaxValue)\r\n                    {\r\n                        R = Matrix3x3d.Identity;\r\n                        return;\r\n                    }\r\n                    else\r\n                    {\r\n\r\n                        Mt.SetRow(index, Mt.GetRow((index + 1) % 3).Cross(Mt.GetRow((index + 2) % 3)));\r\n                        MadjTt.SetRow((index + 1) % 3, Mt.GetRow((index + 2) % 3).Cross(Mt.GetRow(index)));\r\n                        MadjTt.SetRow((index + 2) % 3, Mt.GetRow(index).Cross(Mt.GetRow((index + 1) % 3)));\r\n                        Matrix3x3d M2 = Mt.Transpose;\r\n\r\n                        Mone = OneNorm(M2);\r\n                        Minf = InfNorm(M2);\r\n\r\n                        det = Mt.m00 * MadjTt.m00 + Mt.m01 * MadjTt.m01 + Mt.m02 * MadjTt.m02;\r\n                    }\r\n                }\r\n\r\n                double MadjTone = OneNorm(MadjTt);\r\n                double MadjTinf = InfNorm(MadjTt);\r\n\r\n                double gamma = Math.Sqrt(Math.Sqrt((MadjTone * MadjTinf) / (Mone * Minf)) / Math.Abs(det));\r\n\r\n                double g1 = gamma * 0.5;\r\n                double g2 = 0.5 / (gamma * det);\r\n\r\n                for (int i = 0; i < 3; i++)\r\n                {\r\n                    for (int j = 0; j < 3; j++)\r\n                    {\r\n                        Et[i, j] = Mt[i, j];\r\n                        Mt[i, j] = g1 * Mt[i, j] + g2 * MadjTt[i, j];\r\n                        Et[i, j] -= Mt[i, j];\r\n                    }\r\n                }\r\n\r\n                Eone = OneNorm(Et);\r\n\r\n                Mone = OneNorm(Mt);\r\n                Minf = InfNorm(Mt);\r\n            }\r\n            while (Eone > Mone * tolerance);\r\n\r\n            // Q = Mt^T \r\n            R = Mt.Transpose;\r\n\r\n            //end of function\r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// Perform a singular value decomposition of matrix A: A = U * sigma * V^T.\r\n        /// This function returns two proper rotation matrices U and V^T which do not \r\n        /// contain a reflection. Reflections are corrected by the inversion handling\r\n        /// proposed by Irving et al. 2004.\r\n        /// </summary>\r\n        public static void SVDWithInversionHandling(Matrix3x3d A, out Vector3d sigma, out Matrix3x3d U, out Matrix3x3d VT)\r\n        {\r\n\r\n            Vector3d S;\r\n            Matrix3x3d AT_A, V;\r\n\r\n            AT_A = A.Transpose * A;\r\n\r\n            // Eigen decomposition of A^T * A\r\n            EigenDecomposition(AT_A, out V, out S);\r\n            int pos;\r\n            // Detect if V is a reflection .\r\n            // Make a rotation out of it by multiplying one column with -1.\r\n            double detV = V.Determinant;\r\n            if (detV < 0.0f)\r\n            {\r\n                double minLambda = double.PositiveInfinity;\r\n                pos = 0;\r\n                for (int l = 0; l < 3; l++)\r\n                {\r\n                    if (S[l] < minLambda)\r\n                    {\r\n                        pos = l;\r\n                        minLambda = S[l];\r\n                    }\r\n                }\r\n                V[0, pos] = -V[0, pos];\r\n                V[1, pos] = -V[1, pos];\r\n                V[2, pos] = -V[2, pos];\r\n            }\r\n\r\n            if (S.x < 0.0f) S.x = 0.0f;     // safety for sqrt\r\n            if (S.y < 0.0f) S.y = 0.0f;\r\n            if (S.z < 0.0f) S.z = 0.0f;\r\n\r\n            sigma.x = Math.Sqrt(S.x);\r\n            sigma.y = Math.Sqrt(S.y);\r\n            sigma.z = Math.Sqrt(S.z);\r\n\r\n            VT = V.Transpose;\r\n\r\n            // Check for values of hatF near zero\r\n            int chk = 0;\r\n            pos = 0;\r\n            for (int l = 0; l < 3; l++)\r\n            {\r\n                if (Math.Abs(sigma[l]) < 1.0e-4)\r\n                {\r\n                    pos = l;\r\n                    chk++;\r\n                }\r\n            }\r\n\r\n            if (chk > 0)\r\n            {\r\n\r\n                if (chk > 1)\r\n                {\r\n                    U = Matrix3x3d.Identity;\r\n                }\r\n                else\r\n                {\r\n                    U = A * V;\r\n                    for (int l = 0; l < 3; l++)\r\n                    {\r\n                        if (l != pos)\r\n                        {\r\n                            for (int m = 0; m < 3; m++)\r\n                            {\r\n                                U[m, l] *= 1.0f / sigma[l];\r\n\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    Vector3d[] v = new Vector3d[2];\r\n                    int index = 0;\r\n                    for (int l = 0; l < 3; l++)\r\n                    {\r\n                        if (l != pos)\r\n                        {\r\n                            v[index++] = new Vector3d(U[0, l], U[1, l], U[2, l]);\r\n                        }\r\n                    }\r\n\r\n                    Vector3d vec = v[0].Cross(v[1]);\r\n                    vec.Normalize();\r\n                    U[0, pos] = vec[0];\r\n                    U[1, pos] = vec[1];\r\n                    U[2, pos] = vec[2];\r\n                }\r\n\r\n            }\r\n            else\r\n            {\r\n                Vector3d sigmaInv = new Vector3d(1.0 / sigma.x, 1.0 / sigma.y, 1.0 / sigma.z);\r\n\r\n                U = A * V;\r\n                for (int l = 0; l < 3; l++)\r\n                {\r\n                    for (int m = 0; m < 3; m++)\r\n                    {\r\n                        U[m, l] *= sigmaInv[l];\r\n                    }\r\n                }\r\n            }\r\n\r\n            double detU = U.Determinant;\r\n\r\n            // U is a reflection => inversion\r\n            if (detU < 0.0)\r\n            {\r\n                //std::cout << \"Inversion!\\n\";\r\n                double minLambda = double.PositiveInfinity;\r\n                pos = 0;\r\n                for (int l = 0; l < 3; l++)\r\n                {\r\n                    if (sigma[l] < minLambda)\r\n                    {\r\n                        pos = l;\r\n                        minLambda = sigma[l];\r\n                    }\r\n                }\r\n\r\n                // invert values of smallest singular value\r\n                sigma[pos] = -sigma[pos];\r\n                U[0, pos] = -U[0, pos];\r\n                U[1, pos] = -U[1, pos];\r\n                U[2, pos] = -U[2, pos];\r\n            }\r\n\r\n            //end of function\r\n        }\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "Assets/Common/Decomposition/Decomposition3x3d.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 4c6eedd17e5c16345a731cb65b62ab3c\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/Decomposition/Decomposition3x3f.cs",
    "content": "using System;\r\n\r\nusing Common.Core.LinearAlgebra;\r\n\r\nnamespace Common.Mathematics.Decomposition\r\n{\r\n\r\n    public static class Decomposition3x3f\r\n    {\r\n        /// <summary>\r\n        /// Rotates A through phi in pq-plane to set A(p,q) = 0\r\n\t    /// Rotation stored in R whose columns are eigenvectors of A\r\n        /// </summary>\r\n        public static void JacobiRotate(ref Matrix3x3f A, ref Matrix3x3f R, int p, int q)\r\n        {\r\n\r\n\t        if (A[p, q] == 0.0f)\r\n\t\t        return;\r\n\r\n\t        float d = (A[p, p] - A[q, q]) / (2.0f*A[p, q]);\r\n\t        float t = 1.0f / (Math.Abs(d) + (float)Math.Sqrt(d*d + 1.0f));\r\n\t        if (d < 0.0f) t = -t;\r\n\t        float c = 1.0f / (float)Math.Sqrt(t*t + 1);\r\n\t        float s = t*c;\r\n\r\n\t        A[p, p] += t*A[p, q];\r\n\t        A[q, q] -= t*A[p, q];\r\n\t        A[p, q] = A[q, p] = 0.0f;\r\n\r\n\t        // transform A\r\n\t        int k;\r\n\t        for (k = 0; k < 3; k++) \r\n            {\r\n\t\t        if (k != p && k != q) \r\n                {\r\n\t\t\t        float Akp = c*A[k, p] + s*A[k, q];\r\n\t\t\t        float Akq = -s*A[k, p] + c*A[k, q];\r\n\t\t\t        A[k, p] = A[p, k] = Akp;\r\n\t\t\t        A[k, q] = A[q, k] = Akq;\r\n\t\t        }\r\n\t        }\r\n\r\n\t        // store rotation in R\r\n\t        for (k = 0; k < 3; k++) \r\n            {\r\n\t\t        float Rkp = c*R[k, p] + s*R[k, q];\r\n\t\t        float Rkq = -s*R[k, p] + c*R[k, q];\r\n\t\t        R[k, p] = Rkp;\r\n\t\t        R[k, q] = Rkq;\r\n\t        }\r\n        }\r\n\r\n        public static void EigenDecomposition(Matrix3x3f A, out Matrix3x3f eigenVecs, out Vector3f eigenVals)\r\n        {\r\n\r\n\t        const int numJacobiIterations = 10;\r\n\t        const float epsilon = 1e-15f;\r\n\r\n\t        Matrix3x3f D = A;\r\n\r\n\t        // only for symmetric matrices!\r\n\t        eigenVecs = Matrix3x3f.Identity;\t// unit matrix\r\n\t        int iter = 0;\r\n\r\n\t        while (iter < numJacobiIterations) \r\n            {\t\r\n                // 3 off diagonal elements\r\n\t\t        // find off diagonal element with maximum modulus\r\n\t\t        int p, q;\r\n\t\t        float a, max;\r\n\t\t        max = Math.Abs(D.m01);\r\n\t\t        p = 0; q = 1;\r\n\t\t        a = Math.Abs(D.m02);\r\n\t\t        if (a > max) { p = 0; q = 2; max = a; }\r\n\t\t        a = Math.Abs(D.m12);\r\n\t\t        if (a > max) { p = 1; q = 2; max = a; }\r\n\t\t        // all small enough -> done\r\n\t\t        if (max < epsilon) break;\r\n\t\t        // rotate matrix with respect to that element\r\n\t\t        JacobiRotate(ref D, ref eigenVecs, p, q);\r\n\t\t        iter++;\r\n\t        }\r\n\r\n\t        eigenVals = new Vector3f(D.m00, D.m11, D.m22);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Perform polar decomposition A = (U D U^T) R\r\n        /// </summary>\r\n        public static void PolarDecomposition(Matrix3x3f A, out Matrix3x3f R, out Matrix3x3f U, out Matrix3x3f D)\r\n        {\r\n\t        // A = SR, where S is symmetric and R is orthonormal\r\n\t        // -> S = (A A^T)^(1/2)\r\n\r\n\t        // A = U D U^T R\r\n\r\n\t        Matrix3x3f AAT = new Matrix3x3f();\r\n\t        AAT.m00 = A.m00*A.m00 + A.m01*A.m01 + A.m02*A.m02;\r\n\t        AAT.m11 = A.m10*A.m10 + A.m11*A.m11 + A.m12*A.m12;\r\n\t        AAT.m22 = A.m20*A.m20 + A.m21*A.m21 + A.m22*A.m22;\r\n\r\n\t        AAT.m01 = A.m00*A.m10 + A.m01*A.m11 + A.m02*A.m12;\r\n\t        AAT.m02 = A.m00*A.m20 + A.m01*A.m21 + A.m02*A.m22;\r\n\t        AAT.m12 = A.m10*A.m20 + A.m11*A.m21 + A.m12*A.m22;\r\n\r\n\t        AAT.m10 = AAT.m01;\r\n\t        AAT.m20 = AAT.m02;\r\n\t        AAT.m21 = AAT.m12;\r\n\r\n\t        R = Matrix3x3f.Identity;\r\n\t        Vector3f eigenVals;\r\n\t        EigenDecomposition(AAT, out U, out eigenVals);\r\n\r\n\t        float d0 = (float)Math.Sqrt(eigenVals.x);\r\n\t        float d1 = (float)Math.Sqrt(eigenVals.y);\r\n\t        float d2 = (float)Math.Sqrt(eigenVals.z);\r\n\r\n\t        D = new Matrix3x3f();\r\n\t        D.m00 = d0;\r\n\t        D.m11 = d1;\r\n\t        D.m22 = d2;\r\n\r\n\t        const float eps = 1e-15f;\r\n\r\n\t        float l0 = eigenVals.x; if (l0 <= eps) l0 = 0.0f; else l0 = 1.0f / d0;\r\n\t        float l1 = eigenVals.y; if (l1 <= eps) l1 = 0.0f; else l1 = 1.0f / d1;\r\n\t        float l2 = eigenVals.z; if (l2 <= eps) l2 = 0.0f; else l2 = 1.0f / d2;\r\n\r\n\t        Matrix3x3f S1 = new Matrix3x3f();\r\n\t        S1.m00 = l0*U.m00*U.m00 + l1*U.m01*U.m01 + l2*U.m02*U.m02;\r\n\t        S1.m11 = l0*U.m10*U.m10 + l1*U.m11*U.m11 + l2*U.m12*U.m12;\r\n\t        S1.m22 = l0*U.m20*U.m20 + l1*U.m21*U.m21 + l2*U.m22*U.m22;\r\n\r\n\t        S1.m01 = l0*U.m00*U.m10 + l1*U.m01*U.m11 + l2*U.m02*U.m12;\r\n\t        S1.m02 = l0*U.m00*U.m20 + l1*U.m01*U.m21 + l2*U.m02*U.m22;\r\n\t        S1.m12 = l0*U.m10*U.m20 + l1*U.m11*U.m21 + l2*U.m12*U.m22;\r\n\r\n\t        S1.m10 = S1.m01;\r\n\t        S1.m20 = S1.m02;\r\n\t        S1.m21 = S1.m12;\r\n\r\n\t        R = S1*A;\r\n\r\n\t        // stabilize\r\n\t        Vector3f c0, c1, c2;\r\n\t        c0 = R.GetColumn(0);\r\n\t        c1 = R.GetColumn(1);\r\n\t        c2 = R.GetColumn(2);\r\n\r\n\t        if (c0.SqrMagnitude < eps)\r\n\t\t        c0 = c1.Cross(c2);\r\n\t        else if (c1.SqrMagnitude < eps)\r\n\t\t        c1 = c2.Cross(c0);\r\n\t        else\r\n\t\t        c2 = c0.Cross(c1);\r\n\r\n\t        R.SetColumn(0, c0);\r\n\t        R.SetColumn(1, c1);\r\n\t        R.SetColumn(2, c2);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Return the one norm of the matrix.\r\n        /// </summary>\r\n        private static float OneNorm(Matrix3x3f A)\r\n        {\r\n\t        float sum1 = Math.Abs(A.m00) + Math.Abs(A.m10) + Math.Abs(A.m20);\r\n\t        float sum2 = Math.Abs(A.m01) + Math.Abs(A.m11) + Math.Abs(A.m21);\r\n\t        float sum3 = Math.Abs(A.m02) + Math.Abs(A.m12) + Math.Abs(A.m22);\r\n\r\n\t        float maxSum = sum1;\r\n\r\n\t        if (sum2 > maxSum)\r\n\t\t        maxSum = sum2;\r\n\t        if (sum3 > maxSum)\r\n\t\t        maxSum = sum3;\r\n\r\n\t        return maxSum;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Return the inf norm of the matrix.\r\n        /// </summary>\r\n        private static float InfNorm(Matrix3x3f A)\r\n        {\r\n\t        float sum1 = Math.Abs(A.m00) + Math.Abs(A.m01) + Math.Abs(A.m02);\r\n\t        float sum2 = Math.Abs(A.m10) + Math.Abs(A.m11) + Math.Abs(A.m12);\r\n\t        float sum3 = Math.Abs(A.m20) + Math.Abs(A.m21) + Math.Abs(A.m22);\r\n\r\n\t        float maxSum = sum1;\r\n\r\n\t        if (sum2 > maxSum)\r\n\t\t        maxSum = sum2;\r\n\t        if (sum3 > maxSum)\r\n\t\t     maxSum = sum3;\r\n\r\n\t        return maxSum;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Perform a polar decomposition of matrix M and return the rotation matrix R. This method handles the degenerated cases.\r\n        /// </summary>am>\r\n        public static void PolarDecompositionStable(Matrix3x3f M, float tolerance, out Matrix3x3f R)\r\n        {\r\n\t        Matrix3x3f Mt = M.Transpose;\r\n\t        float Mone = OneNorm(M);\r\n\t        float Minf = InfNorm(M);\r\n\t        float Eone;\r\n\t        Matrix3x3f MadjTt = new Matrix3x3f();\r\n\t\t\tMatrix3x3f Et = new Matrix3x3f();\r\n\r\n\t        do\r\n\t        {\r\n\t\t        MadjTt.SetRow(0, Mt.GetRow(1).Cross(Mt.GetRow(2)));\r\n\t\t        MadjTt.SetRow(1, Mt.GetRow(2).Cross(Mt.GetRow(0)));\r\n\t\t        MadjTt.SetRow(2, Mt.GetRow(0).Cross(Mt.GetRow(1)));\r\n\r\n\t\t        float det = Mt.m00 * MadjTt.m00 + Mt.m01 * MadjTt.m01 + Mt.m02 * MadjTt.m02;\r\n\r\n\t\t        if (Math.Abs(det) < 1.0e-12f)\r\n\t\t        {\r\n\t\t\t        int index = int.MaxValue;\r\n\t\t\t        for (int i = 0; i < 3; i++)\r\n\t\t\t        {\r\n\t\t\t\t        float len = MadjTt.GetRow(i).SqrMagnitude;\r\n\t\t\t\t        if (len > 1.0e-12f)\r\n\t\t\t\t        {\r\n\t\t\t\t\t        // index of valid cross product\r\n\t\t\t\t\t        // => is also the index of the vector in Mt that must be exchanged\r\n\t\t\t\t\t        index = i;\r\n\t\t\t\t\t        break;\r\n\t\t\t\t        }\r\n\t\t\t        }\r\n\r\n\t\t\t        if (index == int.MaxValue)\r\n\t\t\t        {\r\n\t\t\t\t        R = Matrix3x3f.Identity;\r\n\t\t\t\t        return;\r\n\t\t\t        }\r\n\t\t\t        else\r\n\t\t\t        {\r\n\t\r\n                        Mt.SetRow(index, Mt.GetRow((index + 1) % 3).Cross(Mt.GetRow((index + 2) % 3)));\r\n\t\t\t\t        MadjTt.SetRow((index + 1) % 3, Mt.GetRow((index + 2) % 3).Cross(Mt.GetRow(index)));\r\n\t\t\t\t        MadjTt.SetRow((index + 2) % 3, Mt.GetRow(index).Cross(Mt.GetRow((index + 1) % 3)));\r\n\t\t\t\t        Matrix3x3f M2 = Mt.Transpose;\r\n\r\n\t\t\t\t        Mone = OneNorm(M2);\r\n\t\t\t\t        Minf = InfNorm(M2);\r\n\r\n\t\t\t\t        det = Mt.m00 * MadjTt.m00 + Mt.m01 * MadjTt.m01 + Mt.m02 * MadjTt.m02;\r\n\t\t\t        }\r\n\t\t        }\r\n\r\n\t\t        float MadjTone = OneNorm(MadjTt);\r\n\t\t        float MadjTinf = InfNorm(MadjTt);\r\n\r\n\t\t        float gamma = (float)Math.Sqrt(Math.Sqrt((MadjTone*MadjTinf) / (Mone*Minf)) / Math.Abs(det));\r\n\r\n\t\t        float g1 = gamma*0.5f;\r\n\t\t        float g2 = 0.5f / (gamma*det);\r\n\r\n\t\t        for(int i = 0; i < 3; i++)\r\n\t\t        {\r\n\t\t\t        for(int j = 0; j < 3; j++)\r\n\t\t\t        {\r\n\t\t\t\t        Et[i,j] = Mt[i,j];\r\n\t\t\t\t        Mt[i,j] = g1*Mt[i,j] + g2*MadjTt[i,j];\r\n\t\t\t\t        Et[i,j] -= Mt[i,j];\r\n\t\t\t        }\r\n\t\t        }\r\n\r\n\t\t        Eone = OneNorm(Et);\r\n\r\n\t\t        Mone = OneNorm(Mt);\r\n\t\t        Minf = InfNorm(Mt);\r\n\t        } \r\n            while (Eone > Mone * tolerance);\r\n\r\n\t        // Q = Mt^T \r\n\t        R = Mt.Transpose;\r\n\r\n            //end of function\r\n        }\r\n\r\n\r\n        /// <summary>\r\n        /// Perform a singular value decomposition of matrix A: A = U * sigma * V^T.\r\n        /// This function returns two proper rotation matrices U and V^T which do not \r\n        /// contain a reflection. Reflections are corrected by the inversion handling\r\n        /// proposed by Irving et al. 2004.\r\n        /// </summary>\r\n        public static void SVDWithInversionHandling(Matrix3x3f A, out Vector3f sigma, out Matrix3x3f U, out Matrix3x3f VT)\r\n        {\r\n\r\n            Vector3f S;\r\n\t        Matrix3x3f AT_A, V;\r\n\r\n\t        AT_A = A.Transpose * A;\r\n\r\n\t        // Eigen decomposition of A^T * A\r\n\t        EigenDecomposition(AT_A, out V, out S);\r\n\t\t\tint pos;\r\n\t        // Detect if V is a reflection .\r\n\t        // Make a rotation out of it by multiplying one column with -1.\r\n\t        float detV = V.Determinant;\r\n\t        if (detV < 0.0f)\r\n\t        {\r\n\t\t        float minLambda = float.PositiveInfinity;\r\n\t\t        pos = 0;\r\n\t\t        for (int l = 0; l < 3; l++)\r\n\t\t        {\r\n\t\t\t        if (S[l] < minLambda)\r\n\t\t\t        {\r\n\t\t\t\t        pos = l;\r\n\t\t\t\t        minLambda = S[l];\r\n\t\t\t        }\r\n\t\t        }\r\n\t\t        V[0, pos] = -V[0, pos];\r\n\t\t        V[1, pos] = -V[1, pos];\r\n\t\t        V[2, pos] = -V[2, pos];\r\n\t        }\r\n\r\n\t        if (S.x < 0.0f) S.x = 0.0f;\t\t// safety for sqrt\r\n\t        if (S.y < 0.0f) S.y = 0.0f;\r\n\t        if (S.z < 0.0f) S.z = 0.0f;\r\n\r\n\t        sigma.x = (float)Math.Sqrt(S.x);\r\n\t        sigma.y = (float)Math.Sqrt(S.y);\r\n\t        sigma.z = (float)Math.Sqrt(S.z);\r\n\r\n\t        VT = V.Transpose;\r\n\t     \r\n\t        // Check for values of hatF near zero\r\n\t        int chk = 0;\r\n\t        pos = 0;\r\n\t        for (int l = 0; l < 3; l++)\r\n\t        {\r\n\t\t        if (Math.Abs(sigma[l]) < 1.0e-4f)\r\n\t\t        {\r\n\t\t\t        pos = l;\r\n\t\t\t        chk++;\r\n\t\t        }\r\n\t        }\r\n\r\n\t        if (chk > 0)\r\n\t        {\r\n                \r\n\t\t        if (chk > 1)\r\n\t\t        {\r\n\t\t\t        U = Matrix3x3f.Identity;\r\n\t\t        }\r\n\t\t        else\r\n\t\t        {\r\n\t\t\t        U = A * V;\r\n                    for (int l = 0; l < 3; l++)\r\n                    {\r\n                        if (l != pos)\r\n                        {\r\n                            for (int m = 0; m < 3; m++)\r\n                            {\r\n                                U[m, l] *= 1.0f / sigma[l];\r\n\r\n                            }\r\n                        }\r\n                    }\r\n\r\n\t\t\t        Vector3f[] v = new Vector3f[2];\r\n\t\t\t        int index = 0;\r\n\t\t\t        for (int l = 0; l < 3; l++)\r\n\t\t\t        {\r\n\t\t\t\t        if (l != pos)\r\n\t\t\t\t        {\r\n\t\t\t\t\t        v[index++] = new Vector3f(U[0, l], U[1, l], U[2, l]);\r\n\t\t\t\t        }\r\n\t\t\t        }\r\n\r\n\t\t\t        Vector3f vec = v[0].Cross(v[1]);\r\n\t\t\t        vec.Normalize();\r\n\t\t\t        U[0, pos] = vec[0];\r\n\t\t\t        U[1, pos] = vec[1];\r\n\t\t\t        U[2, pos] = vec[2];\r\n\t\t        }\r\n                 \r\n\t        }\r\n\t        else\r\n\t        {\r\n\t\t        Vector3f sigmaInv = new Vector3f(1.0f / sigma.x, 1.0f / sigma.y, 1.0f / sigma.z);\r\n\r\n\t\t        U = A * V;\r\n\t\t        for (int l = 0; l < 3; l++)\r\n\t\t        {\r\n\t\t\t        for (int m = 0; m < 3; m++)\r\n\t\t\t        {\r\n\t\t\t\t        U[m, l] *= sigmaInv[l];\r\n\t\t\t        }\r\n\t\t        }\r\n\t        }\r\n\r\n\t        float detU = U.Determinant;\r\n\r\n\t        // U is a reflection => inversion\r\n\t        if (detU < 0.0f)\r\n\t        {\r\n\t\t        //std::cout << \"Inversion!\\n\";\r\n\t\t        float minLambda = float.PositiveInfinity;\r\n\t\t        pos = 0;\r\n\t\t        for(int l = 0; l < 3; l++)\r\n\t\t        {\r\n\t\t\t        if (sigma[l] < minLambda)\r\n\t\t\t        {\r\n\t\t\t\t        pos = l;\r\n\t\t\t\t        minLambda = sigma[l];\r\n\t\t\t        }\r\n\t\t        }\r\n\r\n\t\t        // invert values of smallest singular value\r\n\t\t        sigma[pos] = -sigma[pos];\r\n\t\t        U[0, pos] = -U[0, pos];\r\n\t\t        U[1, pos] = -U[1, pos];\r\n\t\t        U[2, pos] = -U[2, pos];\r\n\t        }\r\n\r\n            //end of function\r\n        }\r\n\r\n    }\r\n\r\n}"
  },
  {
    "path": "Assets/Common/Decomposition/Decomposition3x3f.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c51f4ad5b0f26454b81446d12138e40d\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/Decomposition.meta",
    "content": "fileFormatVersion: 2\nguid: ca3a86e2d1148ce4a9d75690faa7ade4\nfolderAsset: yes\ntimeCreated: 1514536270\nlicenseType: Free\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Matrix2x2d.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\r\n\r\nnamespace Common.Core.LinearAlgebra\r\n{\r\n\r\n    /// <summary>\n    /// A single precision 2 dimension matrix\n    /// </summary>\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Matrix2x2d\n    {\n        /// <summary>\n        /// The matrix\n        /// </summary>\r\n        public double m00, m01, m10, m11;\r\n\r\n        /// <summary>\n        /// The Matrix Idenity.\n        /// </summary>\n        static readonly public Matrix2x2d Identity = new Matrix2x2d(1, 0, 0, 1);\n\n        /// <summary>\n        /// A matrix from the following varibles.\n        /// </summary>\n        public Matrix2x2d(double m00, double m01, double m10, double m11)\n        {\n\t\t\tthis.m00 = m00; this.m01 = m01;\n\t\t\tthis.m10 = m10; this.m11 = m11;\n        }\r\n\r\n        /// <summary>\r\n        /// A matrix from the following varibles.\r\n        /// </summary>\r\n        public Matrix2x2d(double v)\r\n        {\r\n            m00 = v; m01 = v;\r\n            m10 = v; m11 = v;\r\n        }\r\n\r\n        /// <summary>\r\n        /// A matrix copied from a array of varibles.\r\n        /// </summary>\r\n        public Matrix2x2d(double[,] m)\n        {\r\n            m00 = m[0,0]; m01 = m[0,1];\r\n            m10 = m[1,0]; m11 = m[1,1];\n        }\n\n\t\t/// <summary>\n\t\t/// A matrix copied from a array of varibles.\n\t\t/// </summary>\n\t\tpublic Matrix2x2d(double[] m)\n\t\t{\r\n            m00 = m[0 + 0 * 2]; m01 = m[0 + 1 * 2];\r\n            m10 = m[1 + 0 * 2]; m11 = m[1 + 1 * 2];\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Access the varible at index i\r\n        /// </summary>\r\n        public double this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return m00;\r\n                    case 1: return m10;\r\n                    case 2: return m01;\r\n                    case 3: return m11;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix2x2d index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: m00 = value; break;\r\n                    case 1: m10 = value; break;\r\n                    case 2: m01 = value; break;\r\n                    case 3: m11 = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix2x2d index out of range: \" + i);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Access the varible at index i,j.\r\n        /// </summary>\r\n        public double this[int i, int j]\r\n        {\r\n            get\r\n            {\r\n                int k = i + j * 2;\r\n                switch (k)\r\n                {\r\n                    case 0: return m00;\r\n                    case 1: return m10;\r\n                    case 2: return m01;\r\n                    case 3: return m11;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix2x2d index out of range: \" + k);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                int k = i + j * 2;\r\n                switch (k)\r\n                {\r\n                    case 0: m00 = value; break;\r\n                    case 1: m10 = value; break;\r\n                    case 2: m01 = value; break;\r\n                    case 3: m11 = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix2x2d index out of range: \" + k);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The transpose of the matrix. The rows and columns are flipped.\r\n        /// </summary>\r\n        public Matrix2x2d Transpose\r\n        {\r\n            get\r\n            {\r\n                Matrix2x2d kTranspose = new Matrix2x2d();\r\n                kTranspose.m00 = m00;\r\n                kTranspose.m10 = m01;\r\n                kTranspose.m01 = m10;\r\n                kTranspose.m11 = m11;\r\n\r\n                return kTranspose;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The determinate of a matrix. \r\n        /// </summary>\r\n        public double Determinant\r\n        {\r\n            get\r\n            {\r\n                return m00 * m11 - m10 * m01;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The inverse of the matrix.\r\n        /// A matrix multipled by its inverse is the idenity.\r\n        /// </summary>\r\n        public Matrix2x2d Inverse\r\n        {\r\n            get\r\n            {\r\n                Matrix2x2d kInverse = Identity;\r\n                TryInverse(ref kInverse);\r\n                return kInverse;\r\n            }\r\n        }\r\n\r\n        public double Trace\r\n        {\r\n            get\r\n            {\r\n                return m00 + m11;\r\n            }\r\n        }\n\n        /// <summary>\n        /// Add two matrices.\n        /// </summary>\n        public static Matrix2x2d operator +(Matrix2x2d m1, Matrix2x2d m2)\n        {\n            Matrix2x2d kSum = new Matrix2x2d();\r\n            kSum.m00 = m1.m00 + m2.m00;\r\n            kSum.m10 = m1.m10 + m2.m10;\r\n            kSum.m01 = m1.m01 + m2.m01;\r\n            kSum.m11 = m1.m11 + m2.m11;\n\n            return kSum;\n        }\n\n        /// <summary>\n        /// Subtract two matrices.\n        /// </summary>\n        public static Matrix2x2d operator -(Matrix2x2d m1, Matrix2x2d m2)\n        {\n            Matrix2x2d kSum = new Matrix2x2d();\r\n            kSum.m00 = m1.m00 - m2.m00;\r\n            kSum.m10 = m1.m10 - m2.m10;\r\n            kSum.m01 = m1.m01 - m2.m01;\r\n            kSum.m11 = m1.m11 - m2.m11;\n            return kSum;\n        }\n\n        /// <summary>\n        /// Multiply two matrices.\n        /// </summary>\n        public static Matrix2x2d operator *(Matrix2x2d m1, Matrix2x2d m2)\n        {\n            Matrix2x2d kProd = new Matrix2x2d();\r\n            kProd.m00 = m1.m00 * m2.m00 + m1.m01 * m2.m10;\r\n            kProd.m10 = m1.m10 * m2.m00 + m1.m11 * m2.m10;\r\n            kProd.m01 = m1.m00 * m2.m01 + m1.m01 * m2.m11;\r\n            kProd.m11 = m1.m10 * m2.m01 + m1.m11 * m2.m11;\n\n            return kProd;\n        }\n\n        /// <summary>\n        /// Multiply  a vector by a matrix.\n        /// </summary>\n        public static Vector2d operator *(Matrix2x2d m, Vector2d v)\n        {\n            Vector2d kProd = new Vector2d();\n\n\t\t\tkProd.x = m.m00 * v.x + m.m01 * v.y;\n\t\t\tkProd.y = m.m10 * v.x + m.m11 * v.y;\n\n            return kProd;\n        }\n\n        /// <summary>\n        /// Multiply a matrix by a scalar.\n        /// </summary>\n        public static Matrix2x2d operator *(Matrix2x2d m, double s)\n        {\n            Matrix2x2d kProd = new Matrix2x2d();\r\n            kProd.m00 = m.m00 * s;\r\n            kProd.m10 = m.m10 * s;\r\n            kProd.m01 = m.m01 * s;\r\n            kProd.m11 = m.m11 * s;\n\n            return kProd;\n        }\r\n\r\n        /// <summary>\n        /// Multiply a matrix by a scalar.\n        /// </summary>\n        public static Matrix2x2d operator *(double s, Matrix2x2d m)\n        {\n            Matrix2x2d kProd = new Matrix2x2d();\r\n            kProd.m00 = m.m00 * s;\r\n            kProd.m10 = m.m10 * s;\r\n            kProd.m01 = m.m01 * s;\r\n            kProd.m11 = m.m11 * s;\n\n            return kProd;\n        }\n\n        /// <summary>\n        /// Are these matrices equal.\n        /// </summary>\n        public static bool operator ==(Matrix2x2d m1, Matrix2x2d m2)\n        {\r\n\r\n            if (m1.m00 != m2.m00) return false;\r\n            if (m1.m10 != m2.m10) return false;\r\n            if (m1.m01 != m2.m01) return false;\r\n            if (m1.m11 != m2.m11) return false;\n\n            return true;\n        }\n\n        /// <summary>\n        /// Are these matrices not equal.\n        /// </summary>\n        public static bool operator !=(Matrix2x2d m1, Matrix2x2d m2)\n        {\r\n            if (m1.m00 != m2.m00) return true;\r\n            if (m1.m10 != m2.m10) return true;\r\n            if (m1.m01 != m2.m01) return true;\r\n            if (m1.m11 != m2.m11) return true;\n\n            return false;\n        }\n\n\t\t/// <summary>\n\t\t/// Are these matrices equal.\n\t\t/// </summary>\n\t\tpublic override bool Equals (object obj)\n\t\t{\n\t\t\tif(!(obj is Matrix2x2d)) return false;\n\t\t\t\n\t\t\tMatrix2x2d mat = (Matrix2x2d)obj;\n\t\t\t\n\t\t\treturn this == mat;\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Are these matrices equal.\r\n        /// </summary>\r\n        public bool Equals(Matrix2x2d mat)\r\n        {\r\n            return this == mat;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Are these matrices equal.\r\n        /// </summary>\r\n        public bool EqualsWithError(Matrix2x2d m, double eps)\r\n        {\r\n            if (Math.Abs(m00 - m.m00) > eps) return false;\r\n            if (Math.Abs(m10 - m.m10) > eps) return false;\r\n            if (Math.Abs(m01 - m.m01) > eps) return false;\r\n            if (Math.Abs(m11 - m.m11) > eps) return false;\r\n\r\n            return true;\r\n        }\n\t\t\n\t\t/// <summary>\n\t\t/// Matrices hash code. \n\t\t/// </summary>\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\tint hash = 0;\n\t\t\t\n\t\t\tfor(int i = 0; i < 4; i++)\n\t\t\t\thash ^= this[i].GetHashCode();\n\t\t\t\n\t\t\treturn hash;\n\t\t}\n\n        /// <summary>\n        /// A matrix as a string.\n        /// </summary>\n        public override string ToString()\n        {\n            return this[0, 0] + \",\" + this[0, 1] + \"\\n\" + this[1, 0] + \",\" + this[1, 1];\n        }\n\n        /// <summary>\n        /// The Inverse of the matrix copied into mInv.\n        /// Returns false if the matrix has no inverse.\n        /// A matrix multipled by its inverse is the idenity.\n        /// </summary>\n        public bool TryInverse(ref Matrix2x2d mInv)\n        {\n            double det = Determinant;\n\n            if (DMath.IsZero(det))\n                return false;\n\n            double invDet = 1.0 / det;\n\n\t\t\tmInv.m00 = m11 * invDet;\n\t\t\tmInv.m01 = -m01 * invDet;\n\t\t\tmInv.m10 = -m10 * invDet;\n\t\t\tmInv.m11 = m00 * invDet;\n            return true;\n        }\n\n        /// <summary>\n        /// Get the ith column as a vector.\n        /// </summary>\n        public Vector2d GetColumn(int iCol)\n        {\n\t\t\treturn new Vector2d(this[0, iCol], this[1, iCol]);\n        }\n\n        /// <summary>\n        /// Set the ith column from avector.\n        /// </summary>\n        public void SetColumn(int iCol, Vector2d v)\n        {\n\t\t\tthis[0, iCol] = v.x;\n\t\t\tthis[1, iCol] = v.y;\n        }\n\n        /// <summary>\n        /// Get the ith row as a vector.\n        /// </summar\n        public Vector2d GetRow(int iRow)\n        {\n\t\t\treturn new Vector2d(this[iRow, 0], this[iRow, 1]);\n        }\n\n        /// <summary>\n        /// Set the ith row from avector.\n        /// </summary>\n        public void SetRow(int iRow, Vector2d v)\n        {\n\t\t\tthis[iRow, 0] = v.x;\n\t\t\tthis[iRow, 1] = v.y;\n        }\r\n\r\n        /// <summary>\n        /// Create a rotation out of a angle.\n        /// </summary>\n        static public Matrix2x2d Rotate(double angle)\n        {\r\n            double ca = Math.Cos(angle * Math.PI / 180.0);\r\n            double sa = Math.Sin(angle * Math.PI / 180.0);\n\n            return new Matrix2x2d(ca, -sa,\n                                  sa, ca);\n        }\r\n\r\n        /// <summary>\r\n        /// Convert to a float precision 3 dimension matrix.\r\n        /// </summary>\r\n        public Matrix3x3d ToMatrix3x3d()\r\n        {\r\n\t\t\treturn new Matrix3x3d(m00, m01, 0.0,\r\n\t\t\t                      m10, m11, 0.0,\r\n                                  0.0, 0.0, 0.0);\r\n        }\r\n\r\n\t}\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Matrix2x2d.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 84b9e005a3c7e82429bbb49ae4ad0119\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Matrix2x2f.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\r\n\r\nnamespace Common.Core.LinearAlgebra\n{\n    /// <summary>\n    /// A single precision 2 dimension matrix\n    /// </summary>\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Matrix2x2f\n    {\n        /// <summary>\n        /// The matrix\n        /// </summary>\r\n        public float m00, m10, m01, m11;\n\n        /// <summary>\n        /// The Matrix Idenity.\n        /// </summary>\n        static readonly public Matrix2x2f Identity = new Matrix2x2f(1, 0, 0, 1);\n\n        /// <summary>\n        /// A matrix from the following varibles.\n        /// </summary>\n        public Matrix2x2f(float m00, float m01, float m10, float m11)\n        {\n\t\t\tthis.m00 = m00; this.m01 = m01;\n\t\t\tthis.m10 = m10; this.m11 = m11;\n        }\r\n\r\n        /// <summary>\r\n        /// A matrix from the following varibles.\r\n        /// </summary>\r\n        public Matrix2x2f(float v)\r\n        {\r\n            m00 = v; m01 = v;\r\n            m10 = v; m11 = v;\r\n        }\r\n\r\n        /// <summary>\r\n        /// A matrix copied from a array of varibles.\r\n        /// </summary>\r\n        public Matrix2x2f(float[,] m)\n        {\r\n            m00 = m[0,0]; m01 = m[0,1];\r\n            m10 = m[1,0]; m11 = m[1,1];\n        }\n\n\t\t/// <summary>\n\t\t/// A matrix copied from a array of varibles.\n\t\t/// </summary>\n\t\tpublic Matrix2x2f(float[] m)\n\t\t{\r\n            m00 = m[0 + 0 * 2]; m01 = m[0 + 1 * 2];\r\n            m10 = m[1 + 0 * 2]; m11 = m[1 + 1 * 2];\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Access the varible at index i\r\n        /// </summary>\r\n        public float this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return m00;\r\n                    case 1: return m10;\r\n                    case 2: return m01;\r\n                    case 3: return m11;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix2x2f index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: m00 = value; break;\r\n                    case 1: m10 = value; break;\r\n                    case 2: m01 = value; break;\r\n                    case 3: m11 = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix2x2f index out of range: \" + i);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The transpose of the matrix. The rows and columns are flipped.\r\n        /// </summary>\r\n        public Matrix2x2f Transpose\r\n        {\r\n            get\r\n            {\r\n                Matrix2x2f kTranspose = new Matrix2x2f();\r\n                kTranspose.m00 = m00;\r\n                kTranspose.m10 = m01;\r\n                kTranspose.m01 = m10;\r\n                kTranspose.m11 = m11;\r\n\r\n                return kTranspose;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The determinate of a matrix. \r\n        /// </summary>\r\n        public float Determinant\r\n        {\r\n            get\r\n            {\r\n                return m00 * m11 - m10 * m01;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The inverse of the matrix.\r\n        /// A matrix multipled by its inverse is the idenity.\r\n        /// </summary>\r\n        public Matrix2x2f Inverse\r\n        {\r\n            get\r\n            {\r\n                Matrix2x2f kInverse = Identity;\r\n                TryInverse(ref kInverse);\r\n                return kInverse;\r\n            }\r\n        }\r\n\r\n        public float Trace\r\n        {\r\n            get\r\n            {\r\n                return m00 + m11;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Access the varible at index i,j.\r\n        /// </summary>\r\n        public float this[int i, int j]\r\n        {\r\n            get\r\n            {\r\n                int k = i + j * 2;\r\n                switch (k)\r\n                {\r\n                    case 0: return m00;\r\n                    case 1: return m10;\r\n                    case 2: return m01;\r\n                    case 3: return m11;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix2x2f index out of range: \" + k);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                int k = i + j * 2;\r\n                switch (k)\r\n                {\r\n                    case 0: m00 = value; break;\r\n                    case 1: m10 = value; break;\r\n                    case 2: m01 = value; break;\r\n                    case 3: m11 = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix2x2f index out of range: \" + k);\r\n                }\r\n            }\r\n        }\n\n        /// <summary>\n        /// Add two matrices.\n        /// </summary>\n        public static Matrix2x2f operator +(Matrix2x2f m1, Matrix2x2f m2)\n        {\n            Matrix2x2f kSum = new Matrix2x2f();\r\n            kSum.m00 = m1.m00 + m2.m00;\r\n            kSum.m10 = m1.m10 + m2.m10;\r\n            kSum.m01 = m1.m01 + m2.m01;\r\n            kSum.m11 = m1.m11 + m2.m11;\n\n            return kSum;\n        }\n\n        /// <summary>\n        /// Subtract two matrices.\n        /// </summary>\n        public static Matrix2x2f operator -(Matrix2x2f m1, Matrix2x2f m2)\n        {\n            Matrix2x2f kSum = new Matrix2x2f();\r\n            kSum.m00 = m1.m00 - m2.m00;\r\n            kSum.m10 = m1.m10 - m2.m10;\r\n            kSum.m01 = m1.m01 - m2.m01;\r\n            kSum.m11 = m1.m11 - m2.m11;\n            return kSum;\n        }\n\n        /// <summary>\n        /// Multiply two matrices.\n        /// </summary>\n        public static Matrix2x2f operator *(Matrix2x2f m1, Matrix2x2f m2)\n        {\n            Matrix2x2f kProd = new Matrix2x2f();\r\n            kProd.m00 = m1.m00 * m2.m00 + m1.m01 * m2.m10;\r\n            kProd.m10 = m1.m10 * m2.m00 + m1.m11 * m2.m10;\r\n            kProd.m01 = m1.m00 * m2.m01 + m1.m01 * m2.m11;\r\n            kProd.m11 = m1.m10 * m2.m01 + m1.m11 * m2.m11;\n\n            return kProd;\n        }\n\n        /// <summary>\n        /// Multiply  a vector by a matrix.\n        /// </summary>\n        public static Vector2f operator *(Matrix2x2f m, Vector2f v)\n        {\n            Vector2f kProd = new Vector2f();\n\n\t\t\tkProd.x = m.m00 * v.x + m.m01 * v.y;\n\t\t\tkProd.y = m.m10 * v.x + m.m11 * v.y;\n\n            return kProd;\n        }\n\n        /// <summary>\n        /// Multiply a matrix by a scalar.\n        /// </summary>\n        public static Matrix2x2f operator *(Matrix2x2f m, float s)\n        {\n            Matrix2x2f kProd = new Matrix2x2f();\r\n            kProd.m00 = m.m00 * s;\r\n            kProd.m10 = m.m10 * s;\r\n            kProd.m01 = m.m01 * s;\r\n            kProd.m11 = m.m11 * s;\n\n            return kProd;\n        }\r\n\r\n        /// <summary>\n        /// Multiply a matrix by a scalar.\n        /// </summary>\n        public static Matrix2x2f operator *(float s, Matrix2x2f m)\n        {\n            Matrix2x2f kProd = new Matrix2x2f();\r\n            kProd.m00 = m.m00 * s;\r\n            kProd.m10 = m.m10 * s;\r\n            kProd.m01 = m.m01 * s;\r\n            kProd.m11 = m.m11 * s;\n\n            return kProd;\n        }\n\n        /// <summary>\n        /// Are these matrices equal.\n        /// </summary>\n        public static bool operator ==(Matrix2x2f m1, Matrix2x2f m2)\n        {\r\n\r\n            if (m1.m00 != m2.m00) return false;\r\n            if (m1.m10 != m2.m10) return false;\r\n            if (m1.m01 != m2.m01) return false;\r\n            if (m1.m11 != m2.m11) return false;\n\n            return true;\n        }\n\n        /// <summary>\n        /// Are these matrices not equal.\n        /// </summary>\n        public static bool operator !=(Matrix2x2f m1, Matrix2x2f m2)\n        {\r\n            if (m1.m00 != m2.m00) return true;\r\n            if (m1.m10 != m2.m10) return true;\r\n            if (m1.m01 != m2.m01) return true;\r\n            if (m1.m11 != m2.m11) return true;\n\n            return false;\n        }\n\n\t\t/// <summary>\n\t\t/// Are these matrices equal.\n\t\t/// </summary>\n\t\tpublic override bool Equals (object obj)\n\t\t{\n\t\t\tif(!(obj is Matrix2x2f)) return false;\n\t\t\t\n\t\t\tMatrix2x2f mat = (Matrix2x2f)obj;\n\t\t\t\n\t\t\treturn this == mat;\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Are these matrices equal.\r\n        /// </summary>\r\n        public bool Equals(Matrix2x2f mat)\r\n        {\r\n            return this == mat;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Are these matrices equal.\r\n        /// </summary>\r\n        public bool EqualsWithError(Matrix2x2f m, float eps)\r\n        {\r\n            if (Math.Abs(m00 - m.m00) > eps) return false;\r\n            if (Math.Abs(m10 - m.m10) > eps) return false;\r\n            if (Math.Abs(m01 - m.m01) > eps) return false;\r\n            if (Math.Abs(m11 - m.m11) > eps) return false;\r\n\r\n            return true;\r\n        }\n\t\t\n\t\t/// <summary>\n\t\t/// Matrices hash code. \n\t\t/// </summary>\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\tint hash = 0;\n\t\t\t\n\t\t\tfor(int i = 0; i < 4; i++)\n\t\t\t\thash ^= this[i].GetHashCode();\n\t\t\t\n\t\t\treturn hash;\n\t\t}\n\n        /// <summary>\n        /// A matrix as a string.\n        /// </summary>\n        public override string ToString()\n        {\n            return this[0, 0] + \",\" + this[0, 1] + \"\\n\" + this[1, 0] + \",\" + this[1, 1];\n        }\n\n        /// <summary>\n        /// The Inverse of the matrix copied into mInv.\n        /// Returns false if the matrix has no inverse.\n        /// A matrix multipled by its inverse is the idenity.\n        /// </summary>\n        public bool TryInverse(ref Matrix2x2f mInv)\n        {\n            float det = Determinant;\n\n            if (FMath.IsZero(det))\n                return false;\n\n            float invDet = 1.0f / det;\n\n\t\t\tmInv.m00 = m11 * invDet;\n\t\t\tmInv.m01 = -m01 * invDet;\n\t\t\tmInv.m10 = -m10 * invDet;\n\t\t\tmInv.m11 = m00 * invDet;\n            return true;\n        }\n\n        /// <summary>\n        /// Get the ith column as a vector.\n        /// </summary>\n        public Vector2f GetColumn(int iCol)\n        {\n\t\t\treturn new Vector2f(this[0, iCol], this[1, iCol]);\n        }\n\n        /// <summary>\n        /// Set the ith column from avector.\n        /// </summary>\n        public void SetColumn(int iCol, Vector2f v)\n        {\n\t\t\tthis[0, iCol] = v.x;\n\t\t\tthis[1, iCol] = v.y;\n        }\n\n        /// <summary>\n        /// Get the ith row as a vector.\n        /// </summary>\n        public Vector2f GetRow(int iRow)\n        {\n\t\t\treturn new Vector2f(this[iRow, 0], this[iRow, 1]);\n        }\n\n        /// <summary>\n        /// Set the ith row from avector.\n        /// </summary>\n        public void SetRow(int iRow, Vector2f v)\n        {\n\t\t\tthis[iRow, 0 ] = v.x;\n\t\t\tthis[iRow, 1 ] = v.y;\n        }\r\n\r\n        /// <summary>\n        /// Create a rotation out of a angle.\n        /// </summary>\n        static public Matrix2x2f Rotate(float angle)\n        {\r\n            float ca = (float)Math.Cos(angle * Math.PI / 180.0);\r\n            float sa = (float)Math.Sin(angle * Math.PI / 180.0);\n\n            return new Matrix2x2f(ca, -sa,\n                                  sa, ca);\n        }\n\n        /// <summary>\n        /// Convert to a single precision 3 dimension matrix.\n        /// </summary>\n        public Matrix3x3f ToMatrix3x3f()\n        {\n\t\t\treturn new Matrix3x3f(m00, m01, 0.0f,\n\t\t\t                      m10, m11, 0.0f,\n                                  0.0f, 0.0f, 0.0f);\n        }\n\n    }\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Matrix2x2f.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 5552436bd5f193c4c8a224e34dc6e321\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Matrix3x3d.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\r\n\r\nnamespace Common.Core.LinearAlgebra\r\n{\r\n    /// <summary>\r\n    /// A single precision 3 dimension matrix\r\n    /// </summary>\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Matrix3x3d\r\n    {\r\n        /// <summary>\r\n        /// The matrix\r\n        /// </summary>\r\n        public double m00, m01, m02;\r\n        public double m10, m11, m12;\r\n        public double m20, m21, m22;\r\n\r\n        /// <summary>\r\n        /// The Matrix Idenity.\r\n        /// </summary>\r\n        static readonly public Matrix3x3d Identity = new Matrix3x3d(1, 0, 0, 0, 1, 0, 0, 0, 1);\r\n\r\n        /// <summary>\r\n        /// A matrix from the following varibles.\r\n        /// </summary>\r\n        public Matrix3x3d(double m00, double m01, double m02,\r\n                          double m10, double m11, double m12,\r\n                          double m20, double m21, double m22)\r\n        {\r\n            this.m00 = m00; this.m01 = m01; this.m02 = m02;\r\n            this.m10 = m10; this.m11 = m11; this.m12 = m12;\r\n            this.m20 = m20; this.m21 = m21; this.m22 = m22;\r\n\r\n        }\r\n\r\n        /// <summary>\r\n        /// A matrix from the following varibles.\r\n        /// </summary>\r\n        public Matrix3x3d(double v)\r\n        {\r\n            m00 = v; m01 = v; m02 = v;\r\n            m10 = v; m11 = v; m12 = v;\r\n            m20 = v; m21 = v; m22 = v;\r\n        }\r\n\r\n        /// <summary>\r\n        /// A matrix copied from a array of varibles.\r\n        /// </summary>\r\n        public Matrix3x3d(double[,] m)\r\n        {\r\n            m00 = m[0, 0]; m01 = m[0, 1]; m02 = m[0, 2];\r\n            m10 = m[1, 0]; m11 = m[1, 1]; m12 = m[1, 2];\r\n            m20 = m[2, 0]; m21 = m[2, 1]; m22 = m[2, 2];\r\n        }\r\n\r\n        /// <summary>\r\n        /// A matrix copied from a array of varibles.\r\n        /// </summary>\r\n        public Matrix3x3d(double[] m)\r\n        {\r\n            m00 = m[0 + 0 * 3]; m01 = m[0 + 1 * 3]; m02 = m[0 + 2 * 3];\r\n            m10 = m[1 + 0 * 3]; m11 = m[1 + 1 * 3]; m12 = m[1 + 2 * 3];\r\n            m20 = m[2 + 0 * 3]; m21 = m[2 + 1 * 3]; m22 = m[2 + 2 * 3];\r\n        }\r\n\r\n        /// <summary>\r\n        /// Access the varible at index i\r\n        /// </summary>\r\n        public double this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return m00;\r\n                    case 1: return m10;\r\n                    case 2: return m20;\r\n                    case 3: return m01;\r\n                    case 4: return m11;\r\n                    case 5: return m21;\r\n                    case 6: return m02;\r\n                    case 7: return m12;\r\n                    case 8: return m22;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix3x3d index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: m00 = value; break;\r\n                    case 1: m10 = value; break;\r\n                    case 2: m20 = value; break;\r\n                    case 3: m01 = value; break;\r\n                    case 4: m11 = value; break;\r\n                    case 5: m21 = value; break;\r\n                    case 6: m02 = value; break;\r\n                    case 7: m12 = value; break;\r\n                    case 8: m22 = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix3x3d index out of range: \" + i);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Access the varible at index ij\r\n        /// </summary>\r\n        public double this[int i, int j]\r\n        {\r\n            get\r\n            {\r\n                int k = i + j * 3;\r\n                switch (k)\r\n                {\r\n                    case 0: return m00;\r\n                    case 1: return m10;\r\n                    case 2: return m20;\r\n                    case 3: return m01;\r\n                    case 4: return m11;\r\n                    case 5: return m21;\r\n                    case 6: return m02;\r\n                    case 7: return m12;\r\n                    case 8: return m22;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix3x3d index out of range: \" + k);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                int k = i + j * 3;\r\n                switch (k)\r\n                {\r\n                    case 0: m00 = value; break;\r\n                    case 1: m10 = value; break;\r\n                    case 2: m20 = value; break;\r\n                    case 3: m01 = value; break;\r\n                    case 4: m11 = value; break;\r\n                    case 5: m21 = value; break;\r\n                    case 6: m02 = value; break;\r\n                    case 7: m12 = value; break;\r\n                    case 8: m22 = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix3x3d index out of range: \" + k);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The transpose of the matrix. The rows and columns are flipped.\r\n        /// </summary>\r\n        public Matrix3x3d Transpose\r\n        {\r\n            get\r\n            {\r\n                Matrix3x3d transpose = new Matrix3x3d();\r\n\r\n                transpose.m00 = m00;\r\n                transpose.m01 = m10;\r\n                transpose.m02 = m20;\r\n\r\n                transpose.m10 = m01;\r\n                transpose.m11 = m11;\r\n                transpose.m12 = m21;\r\n\r\n                transpose.m20 = m02;\r\n                transpose.m21 = m12;\r\n                transpose.m22 = m22;\r\n\r\n                return transpose;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The determinate of a matrix. \r\n        /// </summary>\r\n        public double Determinant\r\n        {\r\n            get\r\n            {\r\n                double cofactor00 = m11 * m22 - m12 * m21;\r\n                double cofactor10 = m12 * m20 - m10 * m22;\r\n                double cofactor20 = m10 * m21 - m11 * m20;\r\n\r\n                double det = m00 * cofactor00 + m01 * cofactor10 + m02 * cofactor20;\r\n\r\n                return det;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The inverse of the matrix.\r\n        /// A matrix multipled by its inverse is the idenity.\r\n        /// </summary>\r\n        public Matrix3x3d Inverse\r\n        {\r\n            get\r\n            {\r\n                Matrix3x3d inverse = Identity;\r\n                TryInverse(out inverse);\r\n                return inverse;\r\n            }\r\n        }\r\n\r\n        public double Trace\r\n        {\r\n            get\r\n            {\r\n                return m00 + m11 + m22;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Add two matrices.\r\n        /// </summary>\r\n        public static Matrix3x3d operator +(Matrix3x3d m1, Matrix3x3d m2)\r\n        {\r\n            Matrix3x3d kSum = new Matrix3x3d();\r\n            kSum.m00 = m1.m00 + m2.m00;\r\n            kSum.m01 = m1.m01 + m2.m01;\r\n            kSum.m02 = m1.m02 + m2.m02;\r\n\r\n            kSum.m10 = m1.m10 + m2.m10;\r\n            kSum.m11 = m1.m11 + m2.m11;\r\n            kSum.m12 = m1.m12 + m2.m12;\r\n\r\n            kSum.m20 = m1.m20 + m2.m20;\r\n            kSum.m21 = m1.m21 + m2.m21;\r\n            kSum.m22 = m1.m22 + m2.m22;\r\n\r\n            return kSum;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Subtract two matrices.\r\n        /// </summary>\r\n        public static Matrix3x3d operator -(Matrix3x3d m1, Matrix3x3d m2)\r\n        {\r\n            Matrix3x3d kSum = new Matrix3x3d();\r\n            kSum.m00 = m1.m00 - m2.m00;\r\n            kSum.m01 = m1.m01 - m2.m01;\r\n            kSum.m02 = m1.m02 - m2.m02;\r\n\r\n            kSum.m10 = m1.m10 - m2.m10;\r\n            kSum.m11 = m1.m11 - m2.m11;\r\n            kSum.m12 = m1.m12 - m2.m12;\r\n\r\n            kSum.m20 = m1.m20 - m2.m20;\r\n            kSum.m21 = m1.m21 - m2.m21;\r\n            kSum.m22 = m1.m22 - m2.m22;\r\n            return kSum;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply two matrices.\r\n        /// </summary>\r\n        public static Matrix3x3d operator *(Matrix3x3d m1, Matrix3x3d m2)\r\n        {\r\n            Matrix3x3d kProd = new Matrix3x3d();\r\n\r\n            kProd.m00 = m1.m00 * m2.m00 + m1.m01 * m2.m10 + m1.m02 * m2.m20;\r\n            kProd.m01 = m1.m00 * m2.m01 + m1.m01 * m2.m11 + m1.m02 * m2.m21;\r\n            kProd.m02 = m1.m00 * m2.m02 + m1.m01 * m2.m12 + m1.m02 * m2.m22;\r\n\r\n            kProd.m10 = m1.m10 * m2.m00 + m1.m11 * m2.m10 + m1.m12 * m2.m20;\r\n            kProd.m11 = m1.m10 * m2.m01 + m1.m11 * m2.m11 + m1.m12 * m2.m21;\r\n            kProd.m12 = m1.m10 * m2.m02 + m1.m11 * m2.m12 + m1.m12 * m2.m22;\r\n\r\n            kProd.m20 = m1.m20 * m2.m00 + m1.m21 * m2.m10 + m1.m22 * m2.m20;\r\n            kProd.m21 = m1.m20 * m2.m01 + m1.m21 * m2.m11 + m1.m22 * m2.m21;\r\n            kProd.m22 = m1.m20 * m2.m02 + m1.m21 * m2.m12 + m1.m22 * m2.m22;\r\n\r\n            return kProd;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply  a vector by a matrix.\r\n        /// </summary>\r\n        public static Vector3d operator *(Matrix3x3d m, Vector3d v)\r\n        {\r\n            Vector3d kProd = new Vector3d();\r\n\r\n            kProd.x = m.m00 * v.x + m.m01 * v.y + m.m02 * v.z;\r\n            kProd.y = m.m10 * v.x + m.m11 * v.y + m.m12 * v.z;\r\n            kProd.z = m.m20 * v.x + m.m21 * v.y + m.m22 * v.z;\r\n\r\n            return kProd;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply a matrix by a scalar.\r\n        /// </summary>\r\n        public static Matrix3x3d operator *(Matrix3x3d m1, double s)\n        {\n            Matrix3x3d kProd = new Matrix3x3d();\r\n            kProd.m00 = m1.m00 * s;\r\n            kProd.m01 = m1.m01 * s;\r\n            kProd.m02 = m1.m02 * s;\r\n\r\n            kProd.m10 = m1.m10 * s;\r\n            kProd.m11 = m1.m11 * s;\r\n            kProd.m12 = m1.m12 * s;\r\n\r\n            kProd.m20 = m1.m20 * s;\r\n            kProd.m21 = m1.m21 * s;\r\n            kProd.m22 = m1.m22 * s;\n\n            return kProd;\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply a matrix by a scalar.\r\n        /// </summary>\r\n        public static Matrix3x3d operator *(double s, Matrix3x3d m1)\n        {\n            Matrix3x3d kProd = new Matrix3x3d();\r\n            kProd.m00 = m1.m00 * s;\r\n            kProd.m01 = m1.m01 * s;\r\n            kProd.m02 = m1.m02 * s;\r\n\r\n            kProd.m10 = m1.m10 * s;\r\n            kProd.m11 = m1.m11 * s;\r\n            kProd.m12 = m1.m12 * s;\r\n\r\n            kProd.m20 = m1.m20 * s;\r\n            kProd.m21 = m1.m21 * s;\r\n            kProd.m22 = m1.m22 * s;\n\n            return kProd;\n        }\r\n\r\n        /// <summary>\r\n        /// Are these matrices equal.\r\n        /// </summary>\r\n        public static bool operator ==(Matrix3x3d m1, Matrix3x3d m2)\r\n        {\r\n\r\n            if (m1.m00 != m2.m00) return false;\r\n            if (m1.m01 != m2.m01) return false;\r\n            if (m1.m02 != m2.m02) return false;\r\n\r\n            if (m1.m10 != m2.m10) return false;\r\n            if (m1.m11 != m2.m11) return false;\r\n            if (m1.m12 != m2.m12) return false;\r\n\r\n            if (m1.m20 != m2.m20) return false;\r\n            if (m1.m21 != m2.m21) return false;\r\n            if (m1.m22 != m2.m22) return false;\r\n\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Are these matrices not equal.\r\n        /// </summary>\r\n        public static bool operator !=(Matrix3x3d m1, Matrix3x3d m2)\r\n        {\r\n            if (m1.m00 != m2.m00) return true;\r\n            if (m1.m01 != m2.m01) return true;\r\n            if (m1.m02 != m2.m02) return true;\r\n\r\n            if (m1.m10 != m2.m10) return true;\r\n            if (m1.m11 != m2.m11) return true;\r\n            if (m1.m12 != m2.m12) return true;\r\n\r\n            if (m1.m20 != m2.m20) return true;\r\n            if (m1.m21 != m2.m21) return true;\r\n            if (m1.m22 != m2.m22) return true;\r\n\r\n            return false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Are these matrices equal.\r\n        /// </summary>\r\n        public override bool Equals(object obj)\r\n        {\r\n            if (!(obj is Matrix3x3d)) return false;\r\n\r\n\t\t\tMatrix3x3d mat = (Matrix3x3d)obj;\r\n\r\n            return this == mat;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Are these matrices equal.\r\n        /// </summary>\r\n        public bool Equals(Matrix3x3d mat)\r\n        {\r\n            return this == mat;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Are these matrices equal.\r\n        /// </summary>\r\n        public bool EqualsWithError(Matrix3x3d m, double eps)\r\n        {\r\n            if (Math.Abs(m00 - m.m00) > eps) return false;\r\n            if (Math.Abs(m10 - m.m10) > eps) return false;\r\n            if (Math.Abs(m20 - m.m20) > eps) return false;\r\n\r\n            if (Math.Abs(m01 - m.m01) > eps) return false;\r\n            if (Math.Abs(m11 - m.m11) > eps) return false;\r\n            if (Math.Abs(m21 - m.m21) > eps) return false;\r\n\r\n            if (Math.Abs(m02 - m.m02) > eps) return false;\r\n            if (Math.Abs(m12 - m.m12) > eps) return false;\r\n            if (Math.Abs(m22 - m.m22) > eps) return false;\r\n\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Matrices hash code. \r\n        /// </summary>\r\n        public override int GetHashCode()\r\n        {\r\n            int hash = 0;\r\n\r\n            for (int i = 0; i < 9; i++)\r\n                hash ^= this[i].GetHashCode();\r\n\r\n            return hash;\r\n        }\r\n\r\n        /// <summary>\r\n        /// A matrix as a string.\r\n        /// </summary>\r\n        public override string ToString()\r\n        {\r\n            return this[0, 0] + \",\" + this[0, 1] + \",\" + this[0, 2] + \"\\n\" +\r\n                    this[1, 0] + \",\" + this[1, 1] + \",\" + this[1, 2] + \"\\n\" +\r\n                    this[2, 0] + \",\" + this[2, 1] + \",\" + this[2, 2];\r\n        }\r\n\r\n        /// <summary>\r\n        /// The Inverse of the matrix copied into mInv.\r\n        /// Returns false if the matrix has no inverse.\r\n        /// A matrix multipled by its inverse is the idenity.\r\n        /// Invert a 3x3 using cofactors.  This is about 8 times faster than\r\n        /// the Numerical Recipes code which uses Gaussian elimination.\r\n        /// </summary>\r\n        public bool TryInverse(out Matrix3x3d mInv)\r\n        {\r\n            mInv.m00 = m11 * m22 - m12 * m21;\r\n            mInv.m01 = m02 * m21 - m01 * m22;\r\n            mInv.m02 = m01 * m12 - m02 * m11;\r\n            mInv.m10 = m12 * m20 - m10 * m22;\r\n            mInv.m11 = m00 * m22 - m02 * m20;\r\n            mInv.m12 = m02 * m10 - m00 * m12;\r\n            mInv.m20 = m10 * m21 - m11 * m20;\r\n            mInv.m21 = m01 * m20 - m00 * m21;\r\n            mInv.m22 = m00 * m11 - m01 * m10;\r\n\r\n            double det = m00 * mInv.m00 + m01 * mInv.m10 + m02 * mInv.m20;\r\n\r\n            if (DMath.IsZero(det))\r\n            {\r\n                mInv = Identity;\r\n                return false;\r\n            }\r\n\r\n            double invDet = 1.0 / det;\r\n\r\n            mInv.m00 *= invDet; mInv.m01 *= invDet; mInv.m02 *= invDet;\r\n            mInv.m10 *= invDet; mInv.m11 *= invDet; mInv.m12 *= invDet;\r\n            mInv.m20 *= invDet; mInv.m21 *= invDet; mInv.m22 *= invDet;\r\n\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the ith column as a vector.\r\n        /// </summary>\r\n        public Vector3d GetColumn(int iCol)\r\n        {\r\n\t\t\treturn new Vector3d(this[0, iCol], this[1, iCol], this[2, iCol]);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Set the ith column from avector.\r\n        /// </summary>\r\n        public void SetColumn(int iCol, Vector3d v)\r\n        {\r\n\t\t\tthis[0, iCol] = v.x;\r\n\t\t\tthis[1, iCol] = v.y;\r\n\t\t\tthis[2, iCol] = v.z;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Get the ith row as a vector.\r\n        /// </summary>\r\n        public Vector3d GetRow(int iRow)\r\n        {\r\n\t\t\treturn new Vector3d(this[iRow, 0], this[iRow, 1], this[iRow, 2]);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Set the ith row from avector.\r\n        /// </summary>\r\n        public void SetRow(int iRow, Vector3d v)\r\n        {\r\n\t\t\tthis[iRow, 0] = v.x;\r\n\t\t\tthis[iRow, 1] = v.y;\r\n\t\t\tthis[iRow, 2] = v.z;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert to a double precision 4 dimension matrix.\r\n        /// </summary>\r\n        public Matrix4x4d ToMatrix4x4d()\r\n        {\r\n            return new Matrix4x4d(m00, m01, m02, 0.0f,\r\n                                  m10, m11, m12, 0.0f,\r\n                                  m20, m21, m22, 0.0f,\r\n                                  0.0f, 0.0f, 0.0f, 0.0f);\r\n        }\r\n\r\n        /// <summary>\n        /// Create a translation out of a vector.\n        /// </summary>\n        static public Matrix3x3d Translate(Vector2d v)\n        {\n            return new Matrix3x3d(1, 0, v.x,\n                                  0, 1, v.y,\n                                  0, 0, 1);\n        }\n\n        /// <summary>\n        /// Create a scale out of a vector.\n        /// </summary>\n        static public Matrix3x3d Scale(Vector2d v)\n        {\n            return new Matrix3x3d(v.x, 0, 0,\n                                  0, v.y, 0,\r\n                                  0, 0, 1);\r\n\r\n        }\r\n\r\n        /// <summary>\r\n        /// Create a scale out of a vector.\r\n        /// </summary>\r\n        static public Matrix3x3d Scale(double s)\r\n        {\r\n            return new Matrix3x3d(s, 0, 0,\r\n                                  0, s, 0,\r\n                                  0, 0, 1);\r\n\r\n        }\r\n\r\n        /// <summary>\n        /// Create a rotation out of a angle.\n        /// </summary>\n        static public Matrix3x3d RotateX(double angle)\n        {\r\n            double ca = Math.Cos(angle * Math.PI / 180.0);\r\n            double sa = Math.Sin(angle * Math.PI / 180.0);\n\n            return new Matrix3x3d(1, 0, 0,\n                                  0, ca, -sa,\n                                  0, sa, ca);\n        }\n\n        /// <summary>\n        /// Create a rotation out of a angle.\n        /// </summary>\n        static public Matrix3x3d RotateY(double angle)\n        {\r\n            double ca = Math.Cos(angle * Math.PI / 180.0);\r\n            double sa = Math.Sin(angle * Math.PI / 180.0);\n\n            return new Matrix3x3d(ca, 0, sa,\n                                  0, 1, 0,\n                                  -sa, 0, ca);\n        }\n\n        /// <summary>\n        /// Create a rotation out of a angle.\n        /// </summary>\n        static public Matrix3x3d RotateZ(double angle)\n        {\r\n            double ca = Math.Cos(angle * Math.PI / 180.0);\r\n            double sa = Math.Sin(angle * Math.PI / 180.0);\n\n            return new Matrix3x3d(ca, -sa, 0,\n                                  sa, ca, 0,\n                                  0, 0, 1);\n        }\n\n        /// <summary>\n        /// Create a rotation out of a vector.\n        /// </summary>\n        static public Matrix3x3d Rotate(Vector3d euler)\n        {\r\n            return Quaternion3d.FromEuler(euler).ToMatrix3x3d();\n        }\r\n\r\n    }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Matrix3x3d.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e1ff789641c35454ebfd3d438dcc6189\ntimeCreated: 1514536271\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Matrix3x3f.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\r\n\r\nnamespace Common.Core.LinearAlgebra\n{\n    /// <summary>\n    /// A single precision 3 dimension matrix\n    /// </summary>\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Matrix3x3f\n    {\n        /// <summary>\n        /// The matrix\n        /// </summary>\n        public float m00, m01, m02;\r\n        public float m10, m11, m12;\r\n        public float m20, m21, m22;\n\n        /// <summary>\n        /// The Matrix Idenity.\n        /// </summary>\n        static readonly public Matrix3x3f Identity = new Matrix3x3f(1, 0, 0, 0, 1, 0, 0, 0, 1);\n\n        /// <summary>\n        /// A matrix from the following varibles.\n        /// </summary>\n        public Matrix3x3f(float m00, float m01, float m02,\n                          float m10, float m11, float m12,\n                          float m20, float m21, float m22)\n        {\n\t\t\tthis.m00 = m00; this.m01 = m01; this.m02 = m02;\n\t\t\tthis.m10 = m10; this.m11 = m11; this.m12 = m12;\n\t\t\tthis.m20 = m20; this.m21 = m21; this.m22 = m22;\n\n        }\n\n        /// <summary>\r\n        /// A matrix from the following varibles.\r\n        /// </summary>\r\n        public Matrix3x3f(float v)\r\n        {\r\n            m00 = v; m01 = v; m02 = v;\r\n            m10 = v; m11 = v; m12 = v;\r\n            m20 = v; m21 = v; m22 = v;\r\n        }\n\n        /// <summary>\n        /// A matrix copied from a array of varibles.\n        /// </summary>\n        public Matrix3x3f(float[,] m)\n        {\r\n            m00 = m[0, 0]; m01 = m[0, 1]; m02 = m[0, 2];\r\n            m10 = m[1, 0]; m11 = m[1, 1]; m12 = m[1, 2];\r\n            m20 = m[2, 0]; m21 = m[2, 1]; m22 = m[2, 2];\n        }\n\n\t\t/// <summary>\n\t\t/// A matrix copied from a array of varibles.\n\t\t/// </summary>\n\t\tpublic Matrix3x3f(float[] m)\n\t\t{\r\n            m00 = m[0 + 0 * 3]; m01 = m[0 + 1 * 3]; m02 = m[0 + 2 * 3];\r\n            m10 = m[1 + 0 * 3]; m11 = m[1 + 1 * 3]; m12 = m[1 + 2 * 3];\r\n            m20 = m[2 + 0 * 3]; m21 = m[2 + 1 * 3]; m22 = m[2 + 2 * 3];\n\t\t}\r\n\r\n        public float Trace\r\n        {\r\n            get\r\n            {\r\n                return m00 + m11 + m22;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Access the varible at index i\r\n        /// </summary>\r\n        public float this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return m00;\r\n                    case 1: return m10;\r\n                    case 2: return m20;\r\n                    case 3: return m01;\r\n                    case 4: return m11;\r\n                    case 5: return m21;\r\n                    case 6: return m02;\r\n                    case 7: return m12;\r\n                    case 8: return m22;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix3x3f index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: m00 = value; break;\r\n                    case 1: m10 = value; break;\r\n                    case 2: m20 = value; break;\r\n                    case 3: m01 = value; break;\r\n                    case 4: m11 = value; break;\r\n                    case 5: m21 = value; break;\r\n                    case 6: m02 = value; break;\r\n                    case 7: m12 = value; break;\r\n                    case 8: m22 = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix3x3f index out of range: \" + i);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Access the varible at index ij\r\n        /// </summary>\r\n        public float this[int i, int j]\r\n        {\r\n            get\r\n            {\r\n                int k = i + j * 3;\r\n                switch (k)\r\n                {\r\n                    case 0: return m00;\r\n                    case 1: return m10;\r\n                    case 2: return m20;\r\n                    case 3: return m01;\r\n                    case 4: return m11;\r\n                    case 5: return m21;\r\n                    case 6: return m02;\r\n                    case 7: return m12;\r\n                    case 8: return m22;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix3x3f index out of range: \" + k);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                int k = i + j * 3;\r\n                switch (k)\r\n                {\r\n                    case 0: m00 = value; break;\r\n                    case 1: m10 = value; break;\r\n                    case 2: m20 = value; break;\r\n                    case 3: m01 = value; break;\r\n                    case 4: m11 = value; break;\r\n                    case 5: m21 = value; break;\r\n                    case 6: m02 = value; break;\r\n                    case 7: m12 = value; break;\r\n                    case 8: m22 = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix3x3f index out of range: \" + k);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The transpose of the matrix. The rows and columns are flipped.\r\n        /// </summary>\r\n        public Matrix3x3f Transpose\r\n        {\r\n            get\r\n            {\r\n                Matrix3x3f transpose = new Matrix3x3f();\r\n\r\n                transpose.m00 = m00;\r\n                transpose.m01 = m10;\r\n                transpose.m02 = m20;\r\n\r\n                transpose.m10 = m01;\r\n                transpose.m11 = m11;\r\n                transpose.m12 = m21;\r\n\r\n                transpose.m20 = m02;\r\n                transpose.m21 = m12;\r\n                transpose.m22 = m22;\r\n\r\n                return transpose;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The determinate of a matrix. \r\n        /// </summary>\r\n        public float Determinant\r\n        {\r\n            get\r\n            {\r\n                float cofactor00 = m11 * m22 - m12 * m21;\r\n                float cofactor10 = m12 * m20 - m10 * m22;\r\n                float cofactor20 = m10 * m21 - m11 * m20;\r\n\r\n                float det = m00 * cofactor00 + m01 * cofactor10 + m02 * cofactor20;\r\n\r\n                return det;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The inverse of the matrix.\r\n        /// A matrix multipled by its inverse is the idenity.\r\n        /// </summary>\r\n        public Matrix3x3f Inverse\r\n        {\r\n            get\r\n            {\r\n                Matrix3x3f inverse = Identity;\r\n                TryInverse(out inverse);\r\n                return inverse;\r\n            }\r\n        }\n\n        /// <summary>\n        /// Add two matrices.\n        /// </summary>\n        public static Matrix3x3f operator +(Matrix3x3f m1, Matrix3x3f m2)\n        {\n            Matrix3x3f kSum = new Matrix3x3f();\r\n            kSum.m00 = m1.m00 + m2.m00;\r\n            kSum.m01 = m1.m01 + m2.m01;\r\n            kSum.m02 = m1.m02 + m2.m02;\r\n\r\n            kSum.m10 = m1.m10 + m2.m10;\r\n            kSum.m11 = m1.m11 + m2.m11;\r\n            kSum.m12 = m1.m12 + m2.m12;\r\n\r\n            kSum.m20 = m1.m20 + m2.m20;\r\n            kSum.m21 = m1.m21 + m2.m21;\r\n            kSum.m22 = m1.m22 + m2.m22;\n\n            return kSum;\n        }\n\n        /// <summary>\n        /// Subtract two matrices.\n        /// </summary>\n        public static Matrix3x3f operator -(Matrix3x3f m1, Matrix3x3f m2)\n        {\n            Matrix3x3f kSum = new Matrix3x3f();\r\n            kSum.m00 = m1.m00 - m2.m00;\r\n            kSum.m01 = m1.m01 - m2.m01;\r\n            kSum.m02 = m1.m02 - m2.m02;\r\n\r\n            kSum.m10 = m1.m10 - m2.m10;\r\n            kSum.m11 = m1.m11 - m2.m11;\r\n            kSum.m12 = m1.m12 - m2.m12;\r\n\r\n            kSum.m20 = m1.m20 - m2.m20;\r\n            kSum.m21 = m1.m21 - m2.m21;\r\n            kSum.m22 = m1.m22 - m2.m22;\n            return kSum;\n        }\n\n        /// <summary>\n        /// Multiply two matrices.\n        /// </summary>\n        public static Matrix3x3f operator *(Matrix3x3f m1, Matrix3x3f m2)\n        {\n            Matrix3x3f kProd = new Matrix3x3f();\r\n\r\n            kProd.m00 = m1.m00 * m2.m00 + m1.m01 * m2.m10 + m1.m02 * m2.m20;\r\n            kProd.m01 = m1.m00 * m2.m01 + m1.m01 * m2.m11 + m1.m02 * m2.m21;\r\n            kProd.m02 = m1.m00 * m2.m02 + m1.m01 * m2.m12 + m1.m02 * m2.m22;\r\n\r\n            kProd.m10 = m1.m10 * m2.m00 + m1.m11 * m2.m10 + m1.m12 * m2.m20;\r\n            kProd.m11 = m1.m10 * m2.m01 + m1.m11 * m2.m11 + m1.m12 * m2.m21;\r\n            kProd.m12 = m1.m10 * m2.m02 + m1.m11 * m2.m12 + m1.m12 * m2.m22;\r\n\r\n            kProd.m20 = m1.m20 * m2.m00 + m1.m21 * m2.m10 + m1.m22 * m2.m20;\r\n            kProd.m21 = m1.m20 * m2.m01 + m1.m21 * m2.m11 + m1.m22 * m2.m21;\r\n            kProd.m22 = m1.m20 * m2.m02 + m1.m21 * m2.m12 + m1.m22 * m2.m22;\n\n            return kProd;\n        }\n\n        /// <summary>\n        /// Multiply  a vector by a matrix.\n        /// </summary>\n        public static Vector3f operator *(Matrix3x3f m, Vector3f v)\n        {\n            Vector3f kProd = new Vector3f();\n\n\t\t\tkProd.x = m.m00 * v.x + m.m01 * v.y + m.m02 * v.z;\n\t\t\tkProd.y = m.m10 * v.x + m.m11 * v.y + m.m12 * v.z;\n\t\t\tkProd.z = m.m20 * v.x + m.m21 * v.y + m.m22 * v.z;\n\n            return kProd;\n        }\n\n        /// <summary>\n        /// Multiply a matrix by a scalar.\n        /// </summary>\n        public static Matrix3x3f operator *(Matrix3x3f m1, float s)\n        {\n            Matrix3x3f kProd = new Matrix3x3f();\r\n            kProd.m00 = m1.m00 * s;\r\n            kProd.m01 = m1.m01 * s;\r\n            kProd.m02 = m1.m02 * s;\r\n\r\n            kProd.m10 = m1.m10 * s;\r\n            kProd.m11 = m1.m11 * s;\r\n            kProd.m12 = m1.m12 * s;\r\n\r\n            kProd.m20 = m1.m20 * s;\r\n            kProd.m21 = m1.m21 * s;\r\n            kProd.m22 = m1.m22 * s;\n\n            return kProd;\n        }\r\n\r\n        /// <summary>\n        /// Multiply a matrix by a scalar.\n        /// </summary>\n        public static Matrix3x3f operator *(float s, Matrix3x3f m1)\n        {\n            Matrix3x3f kProd = new Matrix3x3f();\r\n            kProd.m00 = m1.m00 * s;\r\n            kProd.m01 = m1.m01 * s;\r\n            kProd.m02 = m1.m02 * s;\r\n\r\n            kProd.m10 = m1.m10 * s;\r\n            kProd.m11 = m1.m11 * s;\r\n            kProd.m12 = m1.m12 * s;\r\n\r\n            kProd.m20 = m1.m20 * s;\r\n            kProd.m21 = m1.m21 * s;\r\n            kProd.m22 = m1.m22 * s;\n\n            return kProd;\n        }\n\n        /// <summary>\n        /// Are these matrices equal.\n        /// </summary>\n        public static bool operator ==(Matrix3x3f m1, Matrix3x3f m2)\n        {\r\n\r\n            if (m1.m00 != m2.m00) return false;\r\n            if (m1.m01 != m2.m01) return false;\r\n            if (m1.m02 != m2.m02) return false;\r\n\r\n            if (m1.m10 != m2.m10) return false;\r\n            if (m1.m11 != m2.m11) return false;\r\n            if (m1.m12 != m2.m12) return false;\r\n\r\n            if (m1.m20 != m2.m20) return false;\r\n            if (m1.m21 != m2.m21) return false;\r\n            if (m1.m22 != m2.m22) return false;\n\n            return true;\n        }\n\n        /// <summary>\n        /// Are these matrices not equal.\n        /// </summary>\n        public static bool operator !=(Matrix3x3f m1, Matrix3x3f m2)\n        {\r\n            if (m1.m00 != m2.m00) return true;\r\n            if (m1.m01 != m2.m01) return true;\r\n            if (m1.m02 != m2.m02) return true;\r\n\r\n            if (m1.m10 != m2.m10) return true;\r\n            if (m1.m11 != m2.m11) return true;\r\n            if (m1.m12 != m2.m12) return true;\r\n\r\n            if (m1.m20 != m2.m20) return true;\r\n            if (m1.m21 != m2.m21) return true;\r\n            if (m1.m22 != m2.m22) return true;\n\n            return false;\n        }\n\n\t\t/// <summary>\n\t\t/// Are these matrices equal.\n\t\t/// </summary>\n\t\tpublic override bool Equals (object obj)\n\t\t{\n\t\t\tif(!(obj is Matrix3x3f)) return false;\n\t\t\t\n\t\t\tMatrix3x3f mat = (Matrix3x3f)obj;\n\t\t\t\n\t\t\treturn this == mat;\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Are these matrices equal.\r\n        /// </summary>\r\n        public bool Equals(Matrix3x3f mat)\r\n        {\r\n            return this == mat;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Are these matrices equal.\r\n        /// </summary>\r\n        public bool EqualsWithError(Matrix3x3f m, float eps)\r\n        {\r\n            if (Math.Abs(m00 - m.m00) > eps) return false;\r\n            if (Math.Abs(m10 - m.m10) > eps) return false;\r\n            if (Math.Abs(m20 - m.m20) > eps) return false;\r\n\r\n            if (Math.Abs(m01 - m.m01) > eps) return false;\r\n            if (Math.Abs(m11 - m.m11) > eps) return false;\r\n            if (Math.Abs(m21 - m.m21) > eps) return false;\r\n\r\n            if (Math.Abs(m02 - m.m02) > eps) return false;\r\n            if (Math.Abs(m12 - m.m12) > eps) return false;\r\n            if (Math.Abs(m22 - m.m22) > eps) return false;\r\n\r\n            return true;\r\n        }\n\t\t\n\t\t/// <summary>\n\t\t/// Matrices hash code. \n\t\t/// </summary>\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\tint hash = 0;\n\t\t\t\n\t\t\tfor(int i = 0; i < 9; i++)\n\t\t\t\thash ^= this[i].GetHashCode();\n\t\t\t\n\t\t\treturn hash;\n\t\t}\n\n        /// <summary>\n        /// A matrix as a string.\n        /// </summary>\n        public override string ToString()\n        {\n\t\t\treturn \tthis[0, 0] + \",\" + this[0, 1] + \",\" + this[0, 2] + \"\\n\" +\n\t\t\t\t\tthis[1, 0] + \",\" + this[1, 1] + \",\" + this[1, 2] + \"\\n\" +\n\t\t\t\t\tthis[2, 0] + \",\" + this[2, 1] + \",\" + this[2, 2];\n        }\n\n        /// <summary>\n        /// The Inverse of the matrix copied into mInv.\n        /// Returns false if the matrix has no inverse.\n        /// A matrix multipled by its inverse is the idenity.\r\n        /// Invert a 3x3 using cofactors.  This is about 8 times faster than\r\n        /// the Numerical Recipes code which uses Gaussian elimination.\n        /// </summary>\n        public bool TryInverse(out Matrix3x3f mInv)\n        {\n\t\t\tmInv.m00 = m11 * m22 - m12 * m21;\n\t\t\tmInv.m01 = m02 * m21 - m01 * m22;\n\t\t\tmInv.m02 = m01 * m12 - m02 * m11;\n\t\t\tmInv.m10 = m12 * m20 - m10 * m22;\n\t\t\tmInv.m11 = m00 * m22 - m02 * m20;\n\t\t\tmInv.m12 = m02 * m10 - m00 * m12;\n\t\t\tmInv.m20 = m10 * m21 - m11 * m20;\n\t\t\tmInv.m21 = m01 * m20 - m00 * m21;\n\t\t\tmInv.m22 = m00 * m11 - m01 * m10;\n\n\t\t\tfloat det = m00 * mInv.m00 + m01 * mInv.m10 + m02 * mInv.m20;\n\n            if (FMath.IsZero(det))\n            {\n                mInv = Identity;\n                return false;\n            }\n\n            float invDet = 1.0f / det;\r\n\r\n            mInv.m00 *= invDet; mInv.m01 *= invDet; mInv.m02 *= invDet;\r\n            mInv.m10 *= invDet; mInv.m11 *= invDet; mInv.m12 *= invDet;\r\n            mInv.m20 *= invDet; mInv.m21 *= invDet; mInv.m22 *= invDet;\n\n            return true;\n        }\n\n        /// <summary>\n        /// Get the ith column as a vector.\n        /// </summary>\n        public Vector3f GetColumn(int iCol)\n        {\n\t\t\treturn new Vector3f(this[0, iCol], this[1, iCol], this[2, iCol]);\n        }\n\n        /// <summary>\n        /// Set the ith column from avector.\n        /// </summary>\n        public void SetColumn(int iCol, Vector3f v)\n        {\n\t\t\tthis[0, iCol] = v.x;\n\t\t\tthis[1, iCol] = v.y;\n\t\t\tthis[2, iCol] = v.z;\n        }\n\n        /// <summary>\n        /// Get the ith row as a vector.\n        /// </summary>\n        public Vector3f GetRow(int iRow)\n        {\n\t\t\treturn new Vector3f(this[iRow, 0], this[iRow, 1], this[iRow, 2]);\n        }\n\n        /// <summary>\n        /// Set the ith row from avector.\n        /// </summary>\n        public void SetRow(int iRow, Vector3f v)\n        {\n\t\t\tthis[iRow, 0] = v.x;\n\t\t\tthis[iRow, 1] = v.y;\n\t\t\tthis[iRow, 2] = v.z;\n        }\n\n        /// <summary>\n        /// Convert to a single precision 4 dimension matrix.\n        /// </summary>\n        public Matrix4x4f ToMatrix4x4f()\n        {\n\t\t\treturn new Matrix4x4f(m00, m01, m02, 0.0f,\n\t\t\t                      m10, m11, m12, 0.0f,\n\t\t\t                      m20, m21, m22, 0.0f,\n                                  0.0f, 0.0f, 0.0f, 0.0f);\n        }\r\n\r\n        /// <summary>\n        /// Create a translation out of a vector.\n        /// </summary>\n        static public Matrix3x3f Translate(Vector2f v)\n        {\n            return new Matrix3x3f(1, 0, v.x,\n                                  0, 1, v.y,\n                                  0, 0, 1);\n        }\n\n        /// <summary>\n        /// Create a scale out of a vector.\n        /// </summary>\n        static public Matrix3x3f Scale(Vector2f v)\n        {\n            return new Matrix3x3f(v.x, 0, 0,\n                                  0, v.y, 0, \n                                  0, 0, 1);                      \n        }\r\n\r\n        /// <summary>\r\n        /// Create a scale out of a vector.\r\n        /// </summary>\r\n        static public Matrix3x3f Scale(float s)\r\n        {\r\n            return new Matrix3x3f(s, 0, 0,\r\n                                  0, s, 0,\r\n                                  0, 0, 1);\r\n        }\r\n\r\n        /// <summary>\n        /// Create a rotation out of a angle.\n        /// </summary>\n        static public Matrix3x3f RotateX(float angle)\n        {\r\n            float ca = (float)Math.Cos(angle * Math.PI / 180.0);\r\n            float sa = (float)Math.Sin(angle * Math.PI / 180.0);\n\n            return new Matrix3x3f(1, 0, 0,\n                                  0, ca, -sa,\n                                  0, sa, ca);\n        }\n\n        /// <summary>\n        /// Create a rotation out of a angle.\n        /// </summary>\n        static public Matrix3x3f RotateY(float angle)\n        {\r\n            float ca = (float)Math.Cos(angle * Math.PI / 180.0);\r\n            float sa = (float)Math.Sin(angle * Math.PI / 180.0);\n\n            return new Matrix3x3f(ca, 0, sa,\n                                  0, 1, 0,\n                                  -sa, 0, ca);\n        }\n\n        /// <summary>\n        /// Create a rotation out of a angle.\n        /// </summary>\n        static public Matrix3x3f RotateZ(float angle)\n        {\r\n            float ca = (float)Math.Cos(angle * Math.PI / 180.0);\r\n            float sa = (float)Math.Sin(angle * Math.PI / 180.0);\n\n            return new Matrix3x3f(ca, -sa, 0,\n                                  sa, ca, 0,\n                                  0, 0, 1);\n        }\n\n        /// <summary>\n        /// Create a rotation out of a vector.\n        /// </summary>\n        static public Matrix3x3f Rotate(Vector3f euler)\n        {\n            return Quaternion3f.FromEuler(euler).ToMatrix3x3f();\n        }\n\n    }\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Matrix3x3f.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 0d592915ed7730b46b7e07319de6f32c\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Matrix4x4d.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\r\n\r\nnamespace Common.Core.LinearAlgebra\n{\n    /// <summary>\n    /// A single precision 3 dimension matrix\n    /// </summary>\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Matrix4x4d\n\t{\n\n        /// <summary>\n        /// The matrix\n        /// </summary>\n        public double m00, m01, m02, m03;\r\n        public double m10, m11, m12, m13;\r\n        public double m20, m21, m22, m23;\n        public double m30, m31, m32, m33;\n\n        /// <summary>\n        /// The Matrix Idenity.\n        /// </summary>\n        static readonly public Matrix4x4d Identity = new Matrix4x4d(1, 0, 0, 0,\n                                                                    0, 1, 0, 0,\n                                                                    0, 0, 1, 0,\n                                                                    0, 0, 0, 1);\n\n        /// <summary>\n        /// A matrix from the following varibles.\n        /// </summary>\n        public Matrix4x4d(double m00, double m01, double m02, double m03,\n                          double m10, double m11, double m12, double m13,\n                          double m20, double m21, double m22, double m23,\n                          double m30, double m31, double m32, double m33)\n        {\n\t\t\tthis.m00 = m00; this.m01 = m01; this.m02 = m02; this.m03 = m03;\n\t\t\tthis.m10 = m10; this.m11 = m11; this.m12 = m12; this.m13 = m13;\n\t\t\tthis.m20 = m20; this.m21 = m21; this.m22 = m22; this.m23 = m23;\n\t\t\tthis.m30 = m30; this.m31 = m31; this.m32 = m32; this.m33 = m33;\n\n        }\n\n        /// <summary>\r\n        /// A matrix from the following varibles.\r\n        /// </summary>\r\n        public Matrix4x4d(double v)\r\n        {\r\n\t\t\tm00 = v; m01 = v; m02 = v; m03 = v;\n\t\t\tm10 = v; m11 = v; m12 = v; m13 = v;\n\t\t\tm20 = v; m21 = v; m22 = v; m23 = v;\n\t\t\tm30 = v; m31 = v; m32 = v; m33 = v;\r\n        }\n\n        /// <summary>\n        /// A matrix copied from a array of varibles.\n        /// </summary>\n        public Matrix4x4d(double[,] m)\n        {\n            m00 = m[0,0]; m01 = m[0,1]; m02 = m[0,2]; m03 = m[0,3];\n\t\t\tm10 = m[1,0]; m11 = m[1,1]; m12 = m[1,2]; m13 = m[1,3];\n\t\t\tm20 = m[2,0]; m21 = m[2,1]; m22 = m[2,2]; m23 = m[2,3];\n\t\t\tm30 = m[3,0]; m31 = m[3,1]; m32 = m[3,2]; m33 = m[3,3];\n        }\n\n\t\t/// <summary>\n\t\t/// A matrix copied from a array of varibles.\n\t\t/// </summary>\n\t\tpublic Matrix4x4d(double[] m)\n\t\t{\n\t\t\tm00 = m[0+0* 4]; m01 = m[0+1* 4]; m02 = m[0+2* 4]; m03 = m[0+3* 4];\n\t\t\tm10 = m[1+0* 4]; m11 = m[1+1* 4]; m12 = m[1+2* 4]; m13 = m[1+3* 4];\n\t\t\tm20 = m[2+0* 4]; m21 = m[2+1* 4]; m22 = m[2+2* 4]; m23 = m[2+3* 4];\n\t\t\tm30 = m[3+0* 4]; m31 = m[3+1* 4]; m32 = m[3+2* 4]; m33 = m[3+3* 4];\n\t\t}\n        \r\n        /// <summary>\r\n        /// Access the varible at index i\r\n        /// </summary>\r\n        public double this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return m00;\r\n                    case 1: return m10;\r\n                    case 2: return m20;\r\n                    case 3: return m30;\r\n\r\n                    case 4: return m01;\r\n                    case 5: return m11;\r\n                    case 6: return m21;\r\n                    case 7: return m31;\r\n\r\n                    case 8: return m02;\r\n                    case 9: return m12;\r\n                    case 10: return m22;\r\n                    case 11: return m32;\r\n\r\n                    case 12: return m03;\r\n                    case 13: return m13;\r\n                    case 14: return m23;\r\n                    case 15: return m33;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix4x4d index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: m00 = value; break;\r\n                    case 1: m10 = value; break;\r\n                    case 2: m20 = value; break;\r\n                    case 3: m30 = value; break;\r\n\r\n                    case 4: m01 = value; break;\r\n                    case 5: m11 = value; break;\r\n                    case 6: m21 = value; break;\r\n                    case 7: m31 = value; break;\r\n\r\n                    case 8: m02 = value; break;\r\n                    case 9: m12 = value; break;\r\n                    case 10: m22 = value; break;\r\n                    case 11: m32 = value; break;\r\n\r\n                    case 12: m03 = value; break;\r\n                    case 13: m13 = value; break;\r\n                    case 14: m23 = value; break;\r\n                    case 15: m33 = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix4x4d index out of range: \" + i);\r\n                }\r\n            }\r\n        }\n\n        /// <summary>\r\n        /// Access the varible at index ij\r\n        /// </summary>\r\n        public double this[int i, int j]\r\n        {\r\n            get\r\n            {\r\n                int k = i + j * 4;\r\n                switch (k)\r\n                {\r\n                    case 0: return m00;\r\n                    case 1: return m10;\r\n                    case 2: return m20;\r\n                    case 3: return m30;\r\n\r\n                    case 4: return m01;\r\n                    case 5: return m11;\r\n                    case 6: return m21;\r\n                    case 7: return m31;\r\n\r\n                    case 8: return m02;\r\n                    case 9: return m12;\r\n                    case 10: return m22;\r\n                    case 11: return m32;\r\n\r\n                    case 12: return m03;\r\n                    case 13: return m13;\r\n                    case 14: return m23;\r\n                    case 15: return m33;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix4x4d index out of range: \" + k);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                int k = i + j * 4;\r\n                switch (k)\r\n                {\r\n                    case 0: m00 = value; break;\r\n                    case 1: m10 = value; break;\r\n                    case 2: m20 = value; break;\r\n                    case 3: m30 = value; break;\r\n\r\n                    case 4: m01 = value; break;\r\n                    case 5: m11 = value; break;\r\n                    case 6: m21 = value; break;\r\n                    case 7: m31 = value; break;\r\n\r\n                    case 8: m02 = value; break;\r\n                    case 9: m12 = value; break;\r\n                    case 10: m22 = value; break;\r\n                    case 11: m32 = value; break;\r\n\r\n                    case 12: m03 = value; break;\r\n                    case 13: m13 = value; break;\r\n                    case 14: m23 = value; break;\r\n                    case 15: m33 = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix4x4d index out of range: \" + k);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The transpose of the matrix. The rows and columns are flipped.\r\n        /// </summary>\r\n        public Matrix4x4d Transpose\r\n        {\r\n            get\r\n            {\r\n                Matrix4x4d transpose = new Matrix4x4d();\r\n                transpose.m00 = m00;\r\n                transpose.m01 = m10;\r\n                transpose.m02 = m20;\r\n                transpose.m03 = m30;\r\n\r\n                transpose.m10 = m01;\r\n                transpose.m11 = m11;\r\n                transpose.m12 = m21;\r\n                transpose.m13 = m31;\r\n\r\n                transpose.m20 = m02;\r\n                transpose.m21 = m12;\r\n                transpose.m22 = m22;\r\n                transpose.m23 = m32;\r\n\r\n                transpose.m30 = m03;\r\n                transpose.m31 = m13;\r\n                transpose.m32 = m23;\r\n                transpose.m33 = m33;\r\n\r\n                return transpose;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The determinate of a matrix. \r\n        /// </summary>\r\n        public double Determinant\r\n        {\r\n            get\r\n            {\r\n                return (m00 * Minor(1, 2, 3, 1, 2, 3) -\r\n                        m01 * Minor(1, 2, 3, 0, 2, 3) +\r\n                        m02 * Minor(1, 2, 3, 0, 1, 3) -\r\n                        m03 * Minor(1, 2, 3, 0, 1, 2));\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The adjoint of a matrix. \r\n        /// </summary>\r\n        public Matrix4x4d Adjoint\r\n        {\r\n            get\r\n            {\r\n                return new Matrix4x4d(\r\n                        Minor(1, 2, 3, 1, 2, 3),\r\n                        -Minor(0, 2, 3, 1, 2, 3),\r\n                        Minor(0, 1, 3, 1, 2, 3),\r\n                        -Minor(0, 1, 2, 1, 2, 3),\r\n\r\n                        -Minor(1, 2, 3, 0, 2, 3),\r\n                        Minor(0, 2, 3, 0, 2, 3),\r\n                        -Minor(0, 1, 3, 0, 2, 3),\r\n                        Minor(0, 1, 2, 0, 2, 3),\r\n\r\n                        Minor(1, 2, 3, 0, 1, 3),\r\n                        -Minor(0, 2, 3, 0, 1, 3),\r\n                        Minor(0, 1, 3, 0, 1, 3),\r\n                        -Minor(0, 1, 2, 0, 1, 3),\r\n\r\n                        -Minor(1, 2, 3, 0, 1, 2),\r\n                        Minor(0, 2, 3, 0, 1, 2),\r\n                        -Minor(0, 1, 3, 0, 1, 2),\r\n                        Minor(0, 1, 2, 0, 1, 2));\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The inverse of the matrix.\r\n        /// A matrix multipled by its inverse is the idenity.\r\n        /// </summary>\r\n        public Matrix4x4d Inverse\r\n        {\r\n            get\r\n            {\r\n                return Adjoint * DMath.SafeInv(Determinant);\r\n            }\r\n        }\r\n\r\n        public double Trace\r\n        {\r\n            get\r\n            {\r\n                return m00 + m11 + m22 + m33;\r\n            }\r\n        }\n\n        /// <summary>\n        /// Add two matrices.\n        /// </summary>\n        public static Matrix4x4d operator +(Matrix4x4d m1, Matrix4x4d m2)\n        {\n            Matrix4x4d kSum = new Matrix4x4d();\n            kSum.m00 = m1.m00 + m2.m00;\n            kSum.m01 = m1.m01 + m2.m01;\n            kSum.m02 = m1.m02 + m2.m02;\n            kSum.m03 = m1.m03 + m2.m03;\n\n            kSum.m10 = m1.m10 + m2.m10;\n            kSum.m11 = m1.m11 + m2.m11;\n            kSum.m12 = m1.m12 + m2.m12;\n            kSum.m13 = m1.m13 + m2.m13;\n\n            kSum.m20 = m1.m20 + m2.m20;\n            kSum.m21 = m1.m21 + m2.m21;\n            kSum.m22 = m1.m22 + m2.m22;\n            kSum.m23 = m1.m23 + m2.m23;\n\n            kSum.m30 = m1.m30 + m2.m30;\n            kSum.m31 = m1.m31 + m2.m31;\n            kSum.m32 = m1.m32 + m2.m32;\n            kSum.m33 = m1.m33 + m2.m33;\n\n            return kSum;\n        }\n\n        /// <summary>\n        /// Subtract two matrices.\n        /// </summary>\n        public static Matrix4x4d operator -(Matrix4x4d m1, Matrix4x4d m2)\n        {\n            Matrix4x4d kSum = new Matrix4x4d();\n            kSum.m00 = m1.m00 - m2.m00;\n            kSum.m01 = m1.m01 - m2.m01;\n            kSum.m02 = m1.m02 - m2.m02;\n            kSum.m03 = m1.m03 - m2.m03;\n\n            kSum.m10 = m1.m10 - m2.m10;\n            kSum.m11 = m1.m11 - m2.m11;\n            kSum.m12 = m1.m12 - m2.m12;\n            kSum.m13 = m1.m13 - m2.m13;\n\n            kSum.m20 = m1.m20 - m2.m20;\n            kSum.m21 = m1.m21 - m2.m21;\n            kSum.m22 = m1.m22 - m2.m22;\n            kSum.m23 = m1.m23 - m2.m23;\n\n            kSum.m30 = m1.m30 - m2.m30;\n            kSum.m31 = m1.m31 - m2.m31;\n            kSum.m32 = m1.m32 - m2.m32;\n            kSum.m33 = m1.m33 - m2.m33;\n            return kSum;\n        }\n\n        /// <summary>\n        /// Multiply two matrices.\n        /// </summary>\n        public static Matrix4x4d operator *(Matrix4x4d m1, Matrix4x4d m2)\n        {\n            Matrix4x4d kProd = new Matrix4x4d();\n  \n            kProd.m00 = m1.m00 * m2.m00 + m1.m01 * m2.m10 + m1.m02 * m2.m20 + m1.m03 * m2.m30;\n            kProd.m01 = m1.m00 * m2.m01 + m1.m01 * m2.m11 + m1.m02 * m2.m21 + m1.m03 * m2.m31;\n            kProd.m02 = m1.m00 * m2.m02 + m1.m01 * m2.m12 + m1.m02 * m2.m22 + m1.m03 * m2.m32;\n            kProd.m03 = m1.m00 * m2.m03 + m1.m01 * m2.m13 + m1.m02 * m2.m23 + m1.m03 * m2.m33;\n\n            kProd.m10 = m1.m10 * m2.m00 + m1.m11 * m2.m10 + m1.m12 * m2.m20 + m1.m13 * m2.m30;\n            kProd.m11 = m1.m10 * m2.m01 + m1.m11 * m2.m11 + m1.m12 * m2.m21 + m1.m13 * m2.m31;\n            kProd.m12 = m1.m10 * m2.m02 + m1.m11 * m2.m12 + m1.m12 * m2.m22 + m1.m13 * m2.m32;\n            kProd.m13 = m1.m10 * m2.m03 + m1.m11 * m2.m13 + m1.m12 * m2.m23 + m1.m13 * m2.m33;\n\n            kProd.m20 = m1.m20 * m2.m00 + m1.m21 * m2.m10 + m1.m22 * m2.m20 + m1.m23 * m2.m30;\n            kProd.m21 = m1.m20 * m2.m01 + m1.m21 * m2.m11 + m1.m22 * m2.m21 + m1.m23 * m2.m31;\n            kProd.m22 = m1.m20 * m2.m02 + m1.m21 * m2.m12 + m1.m22 * m2.m22 + m1.m23 * m2.m32;\n            kProd.m23 = m1.m20 * m2.m03 + m1.m21 * m2.m13 + m1.m22 * m2.m23 + m1.m23 * m2.m33;\n\n            kProd.m30 = m1.m30 * m2.m00 + m1.m31 * m2.m10 + m1.m32 * m2.m20 + m1.m33 * m2.m30;\n            kProd.m31 = m1.m30 * m2.m01 + m1.m31 * m2.m11 + m1.m32 * m2.m21 + m1.m33 * m2.m31;\n            kProd.m32 = m1.m30 * m2.m02 + m1.m31 * m2.m12 + m1.m32 * m2.m22 + m1.m33 * m2.m32;\n            kProd.m33 = m1.m30 * m2.m03 + m1.m31 * m2.m13 + m1.m32 * m2.m23 + m1.m33 * m2.m33;\n            return kProd;\n        }\n\n        /// <summary>\n        /// Multiply  a vector by a matrix.\n        /// </summary>\n        public static Vector3d operator *(Matrix4x4d m, Vector3d v)\n        {\n            Vector3d kProd = new Vector3d();\n\n\t\t\tdouble invW = DMath.SafeInv(m.m30 * v.x + m.m31 * v.y + m.m32 * v.z + m.m33);\n\n\t\t\tkProd.x = (m.m00 * v.x + m.m01 * v.y + m.m02 * v.z + m.m03) * invW;\n\t\t\tkProd.y = (m.m10 * v.x + m.m11 * v.y + m.m12 * v.z + m.m13) * invW;\n\t\t\tkProd.z = (m.m20 * v.x + m.m21 * v.y + m.m22 * v.z + m.m23) * invW;\n\n            return kProd;\n        }\n\n        /// <summary>\n        /// Multiply  a vector by a matrix.\n        /// </summary>\n        public static Vector4d operator *(Matrix4x4d m, Vector4d v)\n        {\n            Vector4d kProd = new Vector4d();\n\n\t\t\tkProd.x = m.m00 * v.x + m.m01 * v.y + m.m02 * v.z + m.m03 * v.w;\n\t\t\tkProd.y = m.m10 * v.x + m.m11 * v.y + m.m12 * v.z + m.m13 * v.w;\n\t\t\tkProd.z = m.m20 * v.x + m.m21 * v.y + m.m22 * v.z + m.m23 * v.w;\n\t\t\tkProd.w = m.m30 * v.x + m.m31 * v.y + m.m32 * v.z + m.m33 * v.w;\n\n            return kProd;\n        }\n\n        /// <summary>\n        /// Multiply a matrix by a scalar.\n        /// </summary>\n        public static Matrix4x4d operator *(Matrix4x4d m1, double s)\n        {\n            Matrix4x4d kProd = new Matrix4x4d();\n            kProd.m00 = m1.m00 * s;\n            kProd.m01 = m1.m01 * s;\n            kProd.m02 = m1.m02 * s;\n            kProd.m03 = m1.m03 * s;\n\n            kProd.m10 = m1.m10 * s;\n            kProd.m11 = m1.m11 * s;\n            kProd.m12 = m1.m12 * s;\n            kProd.m13 = m1.m13 * s;\n\n            kProd.m20 = m1.m20 * s;\n            kProd.m21 = m1.m21 * s;\n            kProd.m22 = m1.m22 * s;\n            kProd.m23 = m1.m23 * s;\n\n            kProd.m30 = m1.m30 * s;\n            kProd.m31 = m1.m31 * s;\n            kProd.m32 = m1.m32 * s;\n            kProd.m33 = m1.m33 * s;\n            return kProd;\n        }\r\n\r\n        /// <summary>\n        /// Multiply a matrix by a scalar.\n        /// </summary>\n        public static Matrix4x4d operator *(double s, Matrix4x4d m1)\n        {\n            Matrix4x4d kProd = new Matrix4x4d();\n            kProd.m00 = m1.m00 * s;\n            kProd.m01 = m1.m01 * s;\n            kProd.m02 = m1.m02 * s;\n            kProd.m03 = m1.m03 * s;\n\n            kProd.m10 = m1.m10 * s;\n            kProd.m11 = m1.m11 * s;\n            kProd.m12 = m1.m12 * s;\n            kProd.m13 = m1.m13 * s;\n\n            kProd.m20 = m1.m20 * s;\n            kProd.m21 = m1.m21 * s;\n            kProd.m22 = m1.m22 * s;\n            kProd.m23 = m1.m23 * s;\n\n            kProd.m30 = m1.m30 * s;\n            kProd.m31 = m1.m31 * s;\n            kProd.m32 = m1.m32 * s;\n            kProd.m33 = m1.m33 * s;\n            return kProd;\n        }\n\n        /// <summary>\n        /// Are these matrices equal.\n        /// </summary>\n        public static bool operator ==(Matrix4x4d m1, Matrix4x4d m2)\n        {\n\n          if (m1.m00 != m2.m00) return false;\n          if (m1.m01 != m2.m01) return false;\n          if (m1.m02 != m2.m02) return false;\n          if (m1.m03 != m2.m03) return false;\n\n          if (m1.m10 != m2.m10) return false;\n          if (m1.m11 != m2.m11) return false;\n          if (m1.m12 != m2.m12) return false;\n          if (m1.m13 != m2.m13) return false;\n\n          if (m1.m20 != m2.m20) return false;\n          if (m1.m21 != m2.m21) return false;\n          if (m1.m22 != m2.m22) return false;\n          if (m1.m23 != m2.m23) return false;\n\n          if (m1.m30 != m2.m30) return false;\n          if (m1.m31 != m2.m31) return false;\n          if (m1.m32 != m2.m32) return false;\n          if (m1.m33 != m2.m33) return false;\n\n          return true;\n        }\n\n        /// <summary>\n        /// Are these matrices not equal.\n        /// </summary>\n        public static bool operator !=(Matrix4x4d m1, Matrix4x4d m2)\n        {\n          if (m1.m00 != m2.m00) return true;\n          if (m1.m01 != m2.m01) return true;\n          if (m1.m02 != m2.m02) return true;\n          if (m1.m03 != m2.m03) return true;\n\n          if (m1.m10 != m2.m10) return true;\n          if (m1.m11 != m2.m11) return true;\n          if (m1.m12 != m2.m12) return true;\n          if (m1.m13 != m2.m13) return true;\n\n          if (m1.m20 != m2.m20) return true;\n          if (m1.m21 != m2.m21) return true;\n          if (m1.m22 != m2.m22) return true;\n          if (m1.m23 != m2.m23) return true;\n\n          if (m1.m30 != m2.m30) return true;\n          if (m1.m31 != m2.m31) return true;\n          if (m1.m32 != m2.m32) return true;\n\n            return false;\n        }\n\n\t\t/// <summary>\n\t\t/// Are these matrices equal.\n\t\t/// </summary>\n\t\tpublic override bool Equals (object obj)\n\t\t{\n\t\t\tif(!(obj is Matrix4x4d)) return false;\n\n\t\t\tMatrix4x4d mat = (Matrix4x4d)obj;\n\n\t\t\treturn this == mat;\n\t\t}\n\n        /// <summary>\n\t\t/// Are these matrices equal.\n\t\t/// </summary>\n        public bool Equals (Matrix4x4d mat)\n\t\t{\n\t\t\treturn this == mat;\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Are these matrices equal.\r\n        /// </summary>\r\n        public bool EqualsWithError(Matrix4x4d m, double eps)\r\n        {\r\n            if (Math.Abs(m00 - m.m00) > eps) return false;\r\n            if (Math.Abs(m10 - m.m10) > eps) return false;\r\n            if (Math.Abs(m20 - m.m20) > eps) return false;\r\n            if (Math.Abs(m30 - m.m30) > eps) return false;\r\n\r\n            if (Math.Abs(m01 - m.m01) > eps) return false;\r\n            if (Math.Abs(m11 - m.m11) > eps) return false;\r\n            if (Math.Abs(m21 - m.m21) > eps) return false;\r\n            if (Math.Abs(m31 - m.m31) > eps) return false;\r\n\r\n            if (Math.Abs(m02 - m.m02) > eps) return false;\r\n            if (Math.Abs(m12 - m.m12) > eps) return false;\r\n            if (Math.Abs(m22 - m.m22) > eps) return false;\r\n            if (Math.Abs(m32 - m.m32) > eps) return false;\r\n\r\n            if (Math.Abs(m03 - m.m03) > eps) return false;\r\n            if (Math.Abs(m13 - m.m13) > eps) return false;\r\n            if (Math.Abs(m23 - m.m23) > eps) return false;\r\n            if (Math.Abs(m33 - m.m33) > eps) return false;\r\n\r\n            return true;\r\n        }\n\n\t\t/// <summary>\n\t\t/// Matrices hash code. \n\t\t/// </summary>\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\tint hash = 0;\n\n\t\t\tfor(int i = 0; i < 16; i++)\n\t\t\t\thash ^= this[i].GetHashCode();\n\n\t\t\treturn hash;\n\t\t}\n\n        /// <summary>\n        /// A matrix as a string.\n        /// </summary>\n        public override string ToString()\n        {\n            return  this[0, 0] + \",\" + this[0, 1] + \",\" + this[0, 2] + \",\" + this[0, 3] + \"\\n\" +\n                    this[1, 0] + \",\" + this[1, 1] + \",\" + this[1, 2] + \",\" + this[1, 3] + \"\\n\" +\n                    this[2, 0] + \",\" + this[2, 1] + \",\" + this[2, 2] + \",\" + this[2, 3] + \"\\n\" +\n\t\t\t\t\tthis[3, 0] + \",\" + this[3, 1] + \",\" + this[3, 2] + \",\" + this[3, 3];\n        }\n\n        /// <summary>\n        /// The minor of a matrix. \n        /// </summary>\n        private double Minor(int r0, int r1, int r2, int c0, int c1, int c2)\n        {\n\t\t\treturn \tthis[r0, c0] * (this[r1, c1] * this[r2, c2] - this[r2, c1] * this[r1, c2]) -\n\t\t\t\t\tthis[r0, c1] * (this[r1, c0] * this[r2, c2] - this[r2, c0] * this[r1, c2]) +\n\t\t\t\t\tthis[r0, c2] * (this[r1, c0] * this[r2, c1] - this[r2, c0] * this[r1, c1]);\n        }\r\n\r\n        /// <summary>\n        /// The inverse of the matrix.\n        /// A matrix multipled by its inverse is the idenity.\n        /// </summary>\n        public bool TryInverse(out Matrix4x4d mInv)\n        {\r\n            double det = Determinant;\r\n\r\n            if (DMath.IsZero(det))\n            {\n                mInv = Identity;\n                return false;\n            }\n\n            mInv = Adjoint * (1.0 / det);\n            return true;\n        }\r\n\r\n        /// <summary>\r\n        /// Get the ith column as a vector.\r\n        /// </summary>\r\n        public Vector4d GetColumn(int iCol)\r\n\t\t{\r\n\t\t\treturn new Vector4d(this[0, iCol], this[1, iCol], this[2, iCol], this[3, iCol]);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Set the ith column from a vector.\r\n\t\t/// </summary>\r\n\t\tpublic void SetColumn(int iCol, Vector4d v)\r\n\t\t{\r\n\t\t\tthis[0, iCol] = v.x;\r\n\t\t\tthis[1, iCol] = v.y;\r\n\t\t\tthis[2, iCol] = v.z;\r\n\t\t\tthis[3, iCol] = v.w;\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Flip the ith column.\r\n\t\t/// </summary>\r\n\t\tpublic void FlipColumn(int iCol)\r\n\t\t{\r\n\t\t\tthis[0, iCol] *= -1.0;\r\n\t\t\tthis[1, iCol] *= -1.0;\r\n\t\t\tthis[2, iCol] *= -1.0;\r\n\t\t\tthis[3, iCol] *= -1.0;\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Get the ith row as a vector.\r\n\t\t/// </summary>\r\n\t\tpublic Vector4d GetRow(int iRow)\r\n\t\t{\r\n\t\t\treturn new Vector4d(this[iRow, 0], this[iRow, 1], this[iRow, 2], this[iRow, 3]);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Set the ith row from a vector.\r\n\t\t/// </summary>\r\n\t\tpublic void SetRow(int iRow, Vector4d v)\r\n\t\t{\r\n\t\t\tthis[iRow, 0] = v.x;\r\n\t\t\tthis[iRow, 1] = v.y;\r\n\t\t\tthis[iRow, 2] = v.z;\r\n\t\t\tthis[iRow, 3] = v.w;\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Flip the ith row.\r\n\t\t/// </summary>\r\n\t\tpublic void FlipRow(int iRow)\r\n\t\t{\r\n\t\t\tthis[iRow, 0] *= -1.0f;\r\n\t\t\tthis[iRow, 1] *= -1.0f;\r\n\t\t\tthis[iRow, 2] *= -1.0f;\r\n\t\t\tthis[iRow, 3] *= -1.0f;\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Convert to a 3 dimension matrix.\r\n        /// </summary>\r\n        public Matrix3x3d ToMatrix3x3d()\r\n        {\r\n            Matrix3x3d mat = new Matrix3x3d();\r\n\r\n            mat.m00 = m00; mat.m01 = m01; mat.m02 = m02;\r\n            mat.m10 = m10; mat.m11 = m11; mat.m12 = m12;\r\n            mat.m20 = m20; mat.m21 = m21; mat.m22 = m22;\r\n\r\n            return mat;\r\n        }\r\n\r\n        /// <summary>\n        /// Create a translation, rotation and scale.\n        /// </summary>\n        static public Matrix4x4d TranslateRotateScale(Vector3d t, Quaternion3d r, Vector3d s)\n        {\n            Matrix4x4d T = Translate(t);\n            Matrix4x4d R = r.ToMatrix4x4d();\n            Matrix4x4d S = Scale(s);\n\n            return T * R * S;\n        }\r\n\r\n        /// <summary>\n        /// Create a translation and rotation.\n        /// </summary>\n        static public Matrix4x4d TranslateRotate(Vector3d t, Quaternion3d r)\n        {\n            Matrix4x4d T = Translate(t);\n            Matrix4x4d R = r.ToMatrix4x4d();\n\n            return T * R;\n        }\r\n\r\n        /// <summary>\n        /// Create a translation and scale.\n        /// </summary>\n        static public Matrix4x4d TranslateScale(Vector3d t, Vector3d s)\n        {\n            Matrix4x4d T = Translate(t);\n            Matrix4x4d S = Scale(s);\n\n            return T * S;\n        }\r\n\r\n        /// <summary>\n        /// Create a rotation and scale.\n        /// </summary>\n        static public Matrix4x4d RotateScale(Quaternion3d r, Vector3d s)\n        {\n            Matrix4x4d R = r.ToMatrix4x4d();\n            Matrix4x4d S = Scale(s);\n\n            return R * S;\n        }\n\n        /// <summary>\n        /// Create a translation out of a vector.\n        /// </summary>\n        static public Matrix4x4d Translate(Vector3d v)\n        {\n            return new Matrix4x4d(\t1, 0, 0, v.x,\n                                    0, 1, 0, v.y,\n                                    0, 0, 1, v.z,\n                                    0, 0, 0, 1);\n        }\n\n        /// <summary>\n        /// Create a scale out of a vector.\n        /// </summary>\n        static public Matrix4x4d Scale(Vector3d v)\n        {\n            return new Matrix4x4d(\tv.x, 0, 0, 0,\n                                    0, v.y, 0, 0,\n                                    0, 0, v.z, 0,\n                                    0, 0, 0, 1);\n        }\r\n\r\n        /// <summary>\r\n        /// Create a scale out of a vector.\r\n        /// </summary>\r\n        static public Matrix4x4d Scale(double s)\r\n        {\r\n            return new Matrix4x4d(s, 0, 0, 0,\r\n                                  0, s, 0, 0,\r\n                                  0, 0, s, 0,\r\n                                  0, 0, 0, 1);\r\n        }\n\n        /// <summary>\n        /// Create a rotation out of a angle.\n        /// </summary>\n        static public Matrix4x4d RotateX(double angle)\n        {\n\t\t\tdouble ca = Math.Cos(angle * Math.PI / 180.0);\n\t\t\tdouble sa = Math.Sin(angle * Math.PI / 180.0);\n\n            return new Matrix4x4d(\t1, 0, 0, 0,\n                                    0, ca, -sa, 0,\n                                    0, sa, ca, 0,\n                                    0, 0, 0, 1);\n        }\n\n        /// <summary>\n        /// Create a rotation out of a angle.\n        /// </summary>\n        static public Matrix4x4d RotateY(double angle)\n        {\n\t\t\tdouble ca = Math.Cos(angle * Math.PI / 180.0);\n\t\t\tdouble sa = Math.Sin(angle * Math.PI / 180.0);\n\n            return new Matrix4x4d(\tca, 0, sa, 0,\n                                    0, 1, 0, 0,\n                                    -sa, 0, ca, 0,\n                                    0, 0, 0, 1);\n        }\n\n        /// <summary>\n        /// Create a rotation out of a angle.\n        /// </summary>\n        static public Matrix4x4d RotateZ(double angle)\n        {\n\t\t\tdouble ca = Math.Cos(angle * Math.PI / 180.0);\n\t\t\tdouble sa = Math.Sin(angle * Math.PI / 180.0);\n\n            return new Matrix4x4d(\tca, -sa, 0, 0,\n                                    sa, ca, 0, 0,\n                                    0, 0, 1, 0,\n                                    0, 0, 0, 1);\n        }\n\n        /// <summary>\n        /// Create a rotation out of a vector.\n        /// </summary>\n        static public Matrix4x4d Rotate(Vector3d euler)\n        {\r\n            return Quaternion3d.FromEuler(euler).ToMatrix4x4d();\n        }\n\n        /// <summary>\n        /// Create a perspective matrix.\n        /// </summary>\n        static public Matrix4x4d Perspective(double fovy, double aspect, double zNear, double zFar)\n        {\n\t\t\tdouble f = 1.0 / Math.Tan((fovy * Math.PI / 180.0) / 2.0);\n            return new Matrix4x4d(\tf / aspect, 0, 0, 0,\n                                    0, f, 0, 0,\n                                    0, 0, (zFar + zNear) / (zNear - zFar), (2.0f * zFar * zNear) / (zNear - zFar),\n                                    0, 0, -1, 0);\n        }\n\n        /// <summary>\n        /// Create a ortho matrix.\n        /// </summary>\n        static public Matrix4x4d Ortho(double xRight, double xLeft, double yTop, double yBottom, double zNear, double zFar)\n        {\n            double tx, ty, tz;\n            tx = -(xRight + xLeft) / (xRight - xLeft);\n            ty = -(yTop + yBottom) / (yTop - yBottom);\n            tz = -(zFar + zNear) / (zFar - zNear);\n            return new Matrix4x4d(\t2.0 / (xRight - xLeft), 0, 0, tx,\n                                    0, 2.0 / (yTop - yBottom), 0, ty,\n                                    0, 0, -2.0 / (zFar - zNear), tz,\n                                    0, 0, 0, 1);\n        }\n\n\t\t/// <summary>\n\t\t/// Creates the matrix need to look at target from position.\n\t\t/// </summary>\n\t\tstatic public Matrix4x4d LookAt(Vector3d position, Vector3d target, Vector3d Up)\n\t\t{\n\t\t\t\n\t\t\tVector3d zaxis = (position - target).Normalized;\n\t\t\tVector3d xaxis = Up.Cross(zaxis).Normalized;\n\t\t\tVector3d yaxis = zaxis.Cross(xaxis);\n\t\t\t\n\t\t\treturn new Matrix4x4d(\txaxis.x, xaxis.y, xaxis.z, -Vector3d.Dot(xaxis, position),\n\t\t\t                      \tyaxis.x, yaxis.y, yaxis.z, -Vector3d.Dot(yaxis, position),\n\t\t\t                      \tzaxis.x, zaxis.y, zaxis.z, -Vector3d.Dot(zaxis, position),\n\t\t\t                      \t0, 0, 0, 1);\n\t\t}\n\n\n    }\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Matrix4x4d.cs.meta",
    "content": "fileFormatVersion: 2\nguid: deeb67b15435ece419f1249c52ba4c99\ntimeCreated: 1514536271\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Matrix4x4f.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\r\n\r\nnamespace Common.Core.LinearAlgebra\n{\n    /// <summary>\n    /// A single precision 3 dimension matrix\n    /// </summary>\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Matrix4x4f : IEquatable<Matrix4x4f>\n\t{\n\n        /// <summary>\n        /// The matrix\n        /// </summary>\n        public float m00, m01, m02, m03;\r\n        public float m10, m11, m12, m13;\r\n        public float m20, m21, m22, m23;\n        public float m30, m31, m32, m33;\n\n        /// <summary>\n        /// The Matrix Idenity.\n        /// </summary>\n        static readonly public Matrix4x4f Identity = new Matrix4x4f(1, 0, 0, 0,\n                                                                    0, 1, 0, 0,\n                                                                    0, 0, 1, 0,\n                                                                    0, 0, 0, 1);\n\n        /// <summary>\n        /// A matrix from the following varibles.\n        /// </summary>\n        public Matrix4x4f(float m00, float m01, float m02, float m03,\n                          float m10, float m11, float m12, float m13,\n                          float m20, float m21, float m22, float m23,\n                          float m30, float m31, float m32, float m33)\n        {\n\t\t\tthis.m00 = m00; this.m01 = m01; this.m02 = m02; this.m03 = m03;\n\t\t\tthis.m10 = m10; this.m11 = m11; this.m12 = m12; this.m13 = m13;\n\t\t\tthis.m20 = m20; this.m21 = m21; this.m22 = m22; this.m23 = m23;\n\t\t\tthis.m30 = m30; this.m31 = m31; this.m32 = m32; this.m33 = m33;\n\n        }\n\n        /// <summary>\r\n        /// A matrix from the following varibles.\r\n        /// </summary>\r\n        public Matrix4x4f(float v)\r\n        {\r\n\t\t\tm00 = v; m01 = v; m02 = v; m03 = v;\n\t\t\tm10 = v; m11 = v; m12 = v; m13 = v;\n\t\t\tm20 = v; m21 = v; m22 = v; m23 = v;\n\t\t\tm30 = v; m31 = v; m32 = v; m33 = v;\r\n        }\n\n        /// <summary>\n        /// A matrix copied from a array of varibles.\n        /// </summary>\n        public Matrix4x4f(float[,] m)\n        {\n            m00 = m[0,0]; m01 = m[0,1]; m02 = m[0,2]; m03 = m[0,3];\n\t\t\tm10 = m[1,0]; m11 = m[1,1]; m12 = m[1,2]; m13 = m[1,3];\n\t\t\tm20 = m[2,0]; m21 = m[2,1]; m22 = m[2,2]; m23 = m[2,3];\n\t\t\tm30 = m[3,0]; m31 = m[3,1]; m32 = m[3,2]; m33 = m[3,3];\n        }\n\n\t\t/// <summary>\n\t\t/// A matrix copied from a array of varibles.\n\t\t/// </summary>\n\t\tpublic Matrix4x4f(float[] m)\n\t\t{\n\t\t\tm00 = m[0+0* 4]; m01 = m[0+1* 4]; m02 = m[0+2* 4]; m03 = m[0+3* 4];\n\t\t\tm10 = m[1+0* 4]; m11 = m[1+1* 4]; m12 = m[1+2* 4]; m13 = m[1+3* 4];\n\t\t\tm20 = m[2+0* 4]; m21 = m[2+1* 4]; m22 = m[2+2* 4]; m23 = m[2+3* 4];\n\t\t\tm30 = m[3+0* 4]; m31 = m[3+1* 4]; m32 = m[3+2* 4]; m33 = m[3+3* 4];\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Access the varible at index i\r\n        /// </summary>\r\n        public float this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return m00;\r\n                    case 1: return m10;\r\n                    case 2: return m20;\r\n                    case 3: return m30;\r\n\r\n                    case 4: return m01;\r\n                    case 5: return m11;\r\n                    case 6: return m21;\r\n                    case 7: return m31;\r\n\r\n                    case 8: return m02;\r\n                    case 9: return m12;\r\n                    case 10: return m22;\r\n                    case 11: return m32;\r\n\r\n                    case 12: return m03;\r\n                    case 13: return m13;\r\n                    case 14: return m23;\r\n                    case 15: return m33;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix4x4f index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: m00 = value; break;\r\n                    case 1: m10 = value; break;\r\n                    case 2: m20 = value; break;\r\n                    case 3: m30 = value; break;\r\n\r\n                    case 4: m01 = value; break;\r\n                    case 5: m11 = value; break;\r\n                    case 6: m21 = value; break;\r\n                    case 7: m31 = value; break;\r\n\r\n                    case 8: m02 = value; break;\r\n                    case 9: m12 = value; break;\r\n                    case 10: m22 = value; break;\r\n                    case 11: m32 = value; break;\r\n\r\n                    case 12: m03 = value; break;\r\n                    case 13: m13 = value; break;\r\n                    case 14: m23 = value; break;\r\n                    case 15: m33 = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix4x4f index out of range: \" + i);\r\n                }\r\n            }\r\n        }\n\n        /// <summary>\r\n        /// Access the varible at index ij\r\n        /// </summary>\r\n        public float this[int i, int j]\r\n        {\r\n            get\r\n            {\r\n                int k = i + j * 4;\r\n                switch (k)\r\n                {\r\n                    case 0: return m00;\r\n                    case 1: return m10;\r\n                    case 2: return m20;\r\n                    case 3: return m30;\r\n\r\n                    case 4: return m01;\r\n                    case 5: return m11;\r\n                    case 6: return m21;\r\n                    case 7: return m31;\r\n\r\n                    case 8: return m02;\r\n                    case 9: return m12;\r\n                    case 10: return m22;\r\n                    case 11: return m32;\r\n\r\n                    case 12: return m03;\r\n                    case 13: return m13;\r\n                    case 14: return m23;\r\n                    case 15: return m33;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix4x4f index out of range: \" + k);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                int k = i + j * 4;\r\n                switch (k)\r\n                {\r\n                    case 0: m00 = value; break;\r\n                    case 1: m10 = value; break;\r\n                    case 2: m20 = value; break;\r\n                    case 3: m30 = value; break;\r\n\r\n                    case 4: m01 = value; break;\r\n                    case 5: m11 = value; break;\r\n                    case 6: m21 = value; break;\r\n                    case 7: m31 = value; break;\r\n\r\n                    case 8: m02 = value; break;\r\n                    case 9: m12 = value; break;\r\n                    case 10: m22 = value; break;\r\n                    case 11: m32 = value; break;\r\n\r\n                    case 12: m03 = value; break;\r\n                    case 13: m13 = value; break;\r\n                    case 14: m23 = value; break;\r\n                    case 15: m33 = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Matrix4x4f index out of range: \" + k);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The transpose of the matrix. The rows and columns are flipped.\r\n        /// </summary>\r\n        public Matrix4x4f Transpose\r\n        {\r\n            get\r\n            {\r\n                Matrix4x4f transpose = new Matrix4x4f();\r\n                transpose.m00 = m00;\r\n                transpose.m01 = m10;\r\n                transpose.m02 = m20;\r\n                transpose.m03 = m30;\r\n\r\n                transpose.m10 = m01;\r\n                transpose.m11 = m11;\r\n                transpose.m12 = m21;\r\n                transpose.m13 = m31;\r\n\r\n                transpose.m20 = m02;\r\n                transpose.m21 = m12;\r\n                transpose.m22 = m22;\r\n                transpose.m23 = m32;\r\n\r\n                transpose.m30 = m03;\r\n                transpose.m31 = m13;\r\n                transpose.m32 = m23;\r\n                transpose.m33 = m33;\r\n\r\n                return transpose;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The determinate of a matrix. \r\n        /// </summary>\r\n        public float Determinant\r\n        {\r\n            get\r\n            {\r\n                return (m00 * Minor(1, 2, 3, 1, 2, 3) -\r\n                        m01 * Minor(1, 2, 3, 0, 2, 3) +\r\n                        m02 * Minor(1, 2, 3, 0, 1, 3) -\r\n                        m03 * Minor(1, 2, 3, 0, 1, 2));\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The adjoint of a matrix. \r\n        /// </summary>\r\n        public Matrix4x4f Adjoint\r\n        {\r\n            get\r\n            {\r\n                return new Matrix4x4f(\r\n                        Minor(1, 2, 3, 1, 2, 3),\r\n                        -Minor(0, 2, 3, 1, 2, 3),\r\n                        Minor(0, 1, 3, 1, 2, 3),\r\n                        -Minor(0, 1, 2, 1, 2, 3),\r\n\r\n                        -Minor(1, 2, 3, 0, 2, 3),\r\n                        Minor(0, 2, 3, 0, 2, 3),\r\n                        -Minor(0, 1, 3, 0, 2, 3),\r\n                        Minor(0, 1, 2, 0, 2, 3),\r\n\r\n                        Minor(1, 2, 3, 0, 1, 3),\r\n                        -Minor(0, 2, 3, 0, 1, 3),\r\n                        Minor(0, 1, 3, 0, 1, 3),\r\n                        -Minor(0, 1, 2, 0, 1, 3),\r\n\r\n                        -Minor(1, 2, 3, 0, 1, 2),\r\n                        Minor(0, 2, 3, 0, 1, 2),\r\n                        -Minor(0, 1, 3, 0, 1, 2),\r\n                        Minor(0, 1, 2, 0, 1, 2));\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The inverse of the matrix.\r\n        /// A matrix multipled by its inverse is the idenity.\r\n        /// </summary>\r\n        public Matrix4x4f Inverse\r\n        {\r\n            get\r\n            {\r\n                return Adjoint * FMath.SafeInv(Determinant);\r\n            }\r\n        }\r\n\r\n        public float Trace\r\n        {\r\n            get\r\n            {\r\n                return m00 + m11 + m22 + m33;\r\n            }\r\n        }\n\n        /// <summary>\n        /// Add two matrices.\n        /// </summary>\n        public static Matrix4x4f operator +(Matrix4x4f m1, Matrix4x4f m2)\n        {\n            Matrix4x4f kSum = new Matrix4x4f();\n            kSum.m00 = m1.m00 + m2.m00;\n            kSum.m01 = m1.m01 + m2.m01;\n            kSum.m02 = m1.m02 + m2.m02;\n            kSum.m03 = m1.m03 + m2.m03;\n\n            kSum.m10 = m1.m10 + m2.m10;\n            kSum.m11 = m1.m11 + m2.m11;\n            kSum.m12 = m1.m12 + m2.m12;\n            kSum.m13 = m1.m13 + m2.m13;\n\n            kSum.m20 = m1.m20 + m2.m20;\n            kSum.m21 = m1.m21 + m2.m21;\n            kSum.m22 = m1.m22 + m2.m22;\n            kSum.m23 = m1.m23 + m2.m23;\n\n            kSum.m30 = m1.m30 + m2.m30;\n            kSum.m31 = m1.m31 + m2.m31;\n            kSum.m32 = m1.m32 + m2.m32;\n            kSum.m33 = m1.m33 + m2.m33;\n\n            return kSum;\n        }\n\n        /// <summary>\n        /// Subtract two matrices.\n        /// </summary>\n        public static Matrix4x4f operator -(Matrix4x4f m1, Matrix4x4f m2)\n        {\n            Matrix4x4f kSum = new Matrix4x4f();\n            kSum.m00 = m1.m00 - m2.m00;\n            kSum.m01 = m1.m01 - m2.m01;\n            kSum.m02 = m1.m02 - m2.m02;\n            kSum.m03 = m1.m03 - m2.m03;\n\n            kSum.m10 = m1.m10 - m2.m10;\n            kSum.m11 = m1.m11 - m2.m11;\n            kSum.m12 = m1.m12 - m2.m12;\n            kSum.m13 = m1.m13 - m2.m13;\n\n            kSum.m20 = m1.m20 - m2.m20;\n            kSum.m21 = m1.m21 - m2.m21;\n            kSum.m22 = m1.m22 - m2.m22;\n            kSum.m23 = m1.m23 - m2.m23;\n\n            kSum.m30 = m1.m30 - m2.m30;\n            kSum.m31 = m1.m31 - m2.m31;\n            kSum.m32 = m1.m32 - m2.m32;\n            kSum.m33 = m1.m33 - m2.m33;\n            return kSum;\n        }\n\n        /// <summary>\n        /// Multiply two matrices.\n        /// </summary>\n        public static Matrix4x4f operator *(Matrix4x4f m1, Matrix4x4f m2)\n        {\n            Matrix4x4f kProd = new Matrix4x4f();\n   \n            kProd.m00 = m1.m00 * m2.m00 + m1.m01 * m2.m10 + m1.m02 * m2.m20 + m1.m03 * m2.m30;\n            kProd.m01 = m1.m00 * m2.m01 + m1.m01 * m2.m11 + m1.m02 * m2.m21 + m1.m03 * m2.m31;\n            kProd.m02 = m1.m00 * m2.m02 + m1.m01 * m2.m12 + m1.m02 * m2.m22 + m1.m03 * m2.m32;\n            kProd.m03 = m1.m00 * m2.m03 + m1.m01 * m2.m13 + m1.m02 * m2.m23 + m1.m03 * m2.m33;\n\n            kProd.m10 = m1.m10 * m2.m00 + m1.m11 * m2.m10 + m1.m12 * m2.m20 + m1.m13 * m2.m30;\n            kProd.m11 = m1.m10 * m2.m01 + m1.m11 * m2.m11 + m1.m12 * m2.m21 + m1.m13 * m2.m31;\n            kProd.m12 = m1.m10 * m2.m02 + m1.m11 * m2.m12 + m1.m12 * m2.m22 + m1.m13 * m2.m32;\n            kProd.m13 = m1.m10 * m2.m03 + m1.m11 * m2.m13 + m1.m12 * m2.m23 + m1.m13 * m2.m33;\n\n            kProd.m20 = m1.m20 * m2.m00 + m1.m21 * m2.m10 + m1.m22 * m2.m20 + m1.m23 * m2.m30;\n            kProd.m21 = m1.m20 * m2.m01 + m1.m21 * m2.m11 + m1.m22 * m2.m21 + m1.m23 * m2.m31;\n            kProd.m22 = m1.m20 * m2.m02 + m1.m21 * m2.m12 + m1.m22 * m2.m22 + m1.m23 * m2.m32;\n            kProd.m23 = m1.m20 * m2.m03 + m1.m21 * m2.m13 + m1.m22 * m2.m23 + m1.m23 * m2.m33;\n\n            kProd.m30 = m1.m30 * m2.m00 + m1.m31 * m2.m10 + m1.m32 * m2.m20 + m1.m33 * m2.m30;\n            kProd.m31 = m1.m30 * m2.m01 + m1.m31 * m2.m11 + m1.m32 * m2.m21 + m1.m33 * m2.m31;\n            kProd.m32 = m1.m30 * m2.m02 + m1.m31 * m2.m12 + m1.m32 * m2.m22 + m1.m33 * m2.m32;\n            kProd.m33 = m1.m30 * m2.m03 + m1.m31 * m2.m13 + m1.m32 * m2.m23 + m1.m33 * m2.m33;\n            return kProd;\n        }\n\n        /// <summary>\n        /// Multiply  a vector by a matrix.\n        /// </summary>\n        public static Vector3f operator *(Matrix4x4f m, Vector3f v)\n        {\n            Vector3f kProd = new Vector3f();\n\n\t\t\tfloat invW = FMath.SafeInv(m.m30 * v.x + m.m31 * v.y + m.m32 * v.z + m.m33);\n\n\t\t\tkProd.x = (m.m00 * v.x + m.m01 * v.y + m.m02 * v.z + m.m03) * invW;\n\t\t\tkProd.y = (m.m10 * v.x + m.m11 * v.y + m.m12 * v.z + m.m13) * invW;\n\t\t\tkProd.z = (m.m20 * v.x + m.m21 * v.y + m.m22 * v.z + m.m23) * invW;\n\n            return kProd;\n        }\n\n        /// <summary>\n        /// Multiply  a vector by a matrix.\n        /// </summary>\n        public static Vector4f operator *(Matrix4x4f m, Vector4f v)\n        {\n            Vector4f kProd = new Vector4f();\n\n\t\t\tkProd.x = m.m00 * v.x + m.m01 * v.y + m.m02 * v.z + m.m03 * v.w;\n\t\t\tkProd.y = m.m10 * v.x + m.m11 * v.y + m.m12 * v.z + m.m13 * v.w;\n\t\t\tkProd.z = m.m20 * v.x + m.m21 * v.y + m.m22 * v.z + m.m23 * v.w;\n\t\t\tkProd.w = m.m30 * v.x + m.m31 * v.y + m.m32 * v.z + m.m33 * v.w;\n\n            return kProd;\n        }\n\n        /// <summary>\n        /// Multiply a matrix by a scalar.\n        /// </summary>\n        public static Matrix4x4f operator *(Matrix4x4f m1, float s)\n        {\n            Matrix4x4f kProd = new Matrix4x4f();\n            kProd.m00 = m1.m00 * s;\n            kProd.m01 = m1.m01 * s;\n            kProd.m02 = m1.m02 * s;\n            kProd.m03 = m1.m03 * s;\n\n            kProd.m10 = m1.m10 * s;\n            kProd.m11 = m1.m11 * s;\n            kProd.m12 = m1.m12 * s;\n            kProd.m13 = m1.m13 * s;\n\n            kProd.m20 = m1.m20 * s;\n            kProd.m21 = m1.m21 * s;\n            kProd.m22 = m1.m22 * s;\n            kProd.m23 = m1.m23 * s;\n\n            kProd.m30 = m1.m30 * s;\n            kProd.m31 = m1.m31 * s;\n            kProd.m32 = m1.m32 * s;\n            kProd.m33 = m1.m33 * s;\n            return kProd;\n        }\r\n\r\n        /// <summary>\n        /// Multiply a matrix by a scalar.\n        /// </summary>\n        public static Matrix4x4f operator *(float s, Matrix4x4f m1)\n        {\n            Matrix4x4f kProd = new Matrix4x4f();\n            kProd.m00 = m1.m00 * s;\n            kProd.m01 = m1.m01 * s;\n            kProd.m02 = m1.m02 * s;\n            kProd.m03 = m1.m03 * s;\n\n            kProd.m10 = m1.m10 * s;\n            kProd.m11 = m1.m11 * s;\n            kProd.m12 = m1.m12 * s;\n            kProd.m13 = m1.m13 * s;\n\n            kProd.m20 = m1.m20 * s;\n            kProd.m21 = m1.m21 * s;\n            kProd.m22 = m1.m22 * s;\n            kProd.m23 = m1.m23 * s;\n\n            kProd.m30 = m1.m30 * s;\n            kProd.m31 = m1.m31 * s;\n            kProd.m32 = m1.m32 * s;\n            kProd.m33 = m1.m33 * s;\n            return kProd;\n        }\n\n        /// <summary>\n        /// Are these matrices equal.\n        /// </summary>\n        public static bool operator ==(Matrix4x4f m1, Matrix4x4f m2)\n        {\n\n          if (m1.m00 != m2.m00) return false;\n          if (m1.m01 != m2.m01) return false;\n          if (m1.m02 != m2.m02) return false;\n          if (m1.m03 != m2.m03) return false;\n\n          if (m1.m10 != m2.m10) return false;\n          if (m1.m11 != m2.m11) return false;\n          if (m1.m12 != m2.m12) return false;\n          if (m1.m13 != m2.m13) return false;\n\n          if (m1.m20 != m2.m20) return false;\n          if (m1.m21 != m2.m21) return false;\n          if (m1.m22 != m2.m22) return false;\n          if (m1.m23 != m2.m23) return false;\n\n          if (m1.m30 != m2.m30) return false;\n          if (m1.m31 != m2.m31) return false;\n          if (m1.m32 != m2.m32) return false;\n          if (m1.m33 != m2.m33) return false;\n\n          return true;\n        }\n\n        /// <summary>\n        /// Are these matrices not equal.\n        /// </summary>\n        public static bool operator !=(Matrix4x4f m1, Matrix4x4f m2)\n        {\n          if (m1.m00 != m2.m00) return true;\n          if (m1.m01 != m2.m01) return true;\n          if (m1.m02 != m2.m02) return true;\n          if (m1.m03 != m2.m03) return true;\n\n          if (m1.m10 != m2.m10) return true;\n          if (m1.m11 != m2.m11) return true;\n          if (m1.m12 != m2.m12) return true;\n          if (m1.m13 != m2.m13) return true;\n\n          if (m1.m20 != m2.m20) return true;\n          if (m1.m21 != m2.m21) return true;\n          if (m1.m22 != m2.m22) return true;\n          if (m1.m23 != m2.m23) return true;\n\n          if (m1.m30 != m2.m30) return true;\n          if (m1.m31 != m2.m31) return true;\n          if (m1.m32 != m2.m32) return true;\n\n            return false;\n        }\n\n\t\t/// <summary>\n\t\t/// Are these matrices equal.\n\t\t/// </summary>\n\t\tpublic override bool Equals (object obj)\n\t\t{\n\t\t\tif(!(obj is Matrix4x4f)) return false;\n\n\t\t\tMatrix4x4f mat = (Matrix4x4f)obj;\n\n\t\t\treturn this == mat;\n\t\t}\n\n        /// <summary>\n\t\t/// Are these matrices equal.\n\t\t/// </summary>\n        public bool Equals (Matrix4x4f mat)\n\t\t{\n\t\t\treturn this == mat;\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Are these matrices equal.\r\n        /// </summary>\r\n        public bool EqualsWithError(Matrix4x4f m, float eps)\r\n        {\r\n            if (Math.Abs(m00 - m.m00) > eps) return false;\r\n            if (Math.Abs(m10 - m.m10) > eps) return false;\r\n            if (Math.Abs(m20 - m.m20) > eps) return false;\r\n            if (Math.Abs(m30 - m.m30) > eps) return false;\r\n\r\n            if (Math.Abs(m01 - m.m01) > eps) return false;\r\n            if (Math.Abs(m11 - m.m11) > eps) return false;\r\n            if (Math.Abs(m21 - m.m21) > eps) return false;\r\n            if (Math.Abs(m31 - m.m31) > eps) return false;\r\n\r\n            if (Math.Abs(m02 - m.m02) > eps) return false;\r\n            if (Math.Abs(m12 - m.m12) > eps) return false;\r\n            if (Math.Abs(m22 - m.m22) > eps) return false;\r\n            if (Math.Abs(m32 - m.m32) > eps) return false;\r\n\r\n            if (Math.Abs(m03 - m.m03) > eps) return false;\r\n            if (Math.Abs(m13 - m.m13) > eps) return false;\r\n            if (Math.Abs(m23 - m.m23) > eps) return false;\r\n            if (Math.Abs(m33 - m.m33) > eps) return false;\r\n\r\n            return true;\r\n        }\n\n\t\t/// <summary>\n\t\t/// Matrices hash code. \n\t\t/// </summary>\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\tint hash = 0;\n\n\t\t\tfor(int i = 0; i < 16; i++)\n\t\t\t\thash ^= this[i].GetHashCode();\n\n\t\t\treturn hash;\n\t\t}\n\n        /// <summary>\n        /// A matrix as a string.\n        /// </summary>\n        public override string ToString()\n        {\n            return  this[0, 0] + \",\" + this[0, 1] + \",\" + this[0, 2] + \",\" + this[0, 3] + \"\\n\" +\n                    this[1, 0] + \",\" + this[1, 1] + \",\" + this[1, 2] + \",\" + this[1, 3] + \"\\n\" +\n                    this[2, 0] + \",\" + this[2, 1] + \",\" + this[2, 2] + \",\" + this[2, 3] + \"\\n\" +\n\t\t\t\t\tthis[3, 0] + \",\" + this[3, 1] + \",\" + this[3, 2] + \",\" + this[3, 3];\n        }\n\n        /// <summary>\n        /// The minor of a matrix. \n        /// </summary>\n        private float Minor(int r0, int r1, int r2, int c0, int c1, int c2)\n        {\n\t\t\treturn \tthis[r0, c0] * (this[r1, c1] * this[r2, c2] - this[r2, c1] * this[r1, c2]) -\n\t\t\t\t\tthis[r0, c1] * (this[r1, c0] * this[r2, c2] - this[r2, c0] * this[r1, c2]) +\n\t\t\t\t\tthis[r0, c2] * (this[r1, c0] * this[r2, c1] - this[r2, c0] * this[r1, c1]);\n        }\r\n\r\n        /// <summary>\n        /// The inverse of the matrix.\n        /// A matrix multipled by its inverse is the idenity.\n        /// </summary>\n        public bool TryInverse(out Matrix4x4f mInv)\n        {\r\n\r\n            float det = Determinant;\r\n\r\n            if (FMath.IsZero(det))\n            {\n                mInv = Identity;\n                return false;\n            }\n\n            mInv = Adjoint * (1.0f / det);\n            return true;\n        }\n\n        /// <summary>\n        /// Get the ith column as a vector.\n        /// </summary>\n        public Vector4f GetColumn(int iCol)\n        {\n\t\t\treturn new Vector4f(this[0, iCol], this[1, iCol], this[2, iCol], this[3, iCol]);\n        }\n\n        /// <summary>\n        /// Set the ith column from a vector.\n        /// </summary>\n        public void SetColumn(int iCol, Vector4f v)\n        {\n\t\t\tthis[0, iCol] = v.x;\n\t\t\tthis[1, iCol] = v.y;\n\t\t\tthis[2, iCol] = v.z;\n\t\t\tthis[3, iCol] = v.w;\n        }\n\n\t\t/// <summary>\n\t\t/// Flip the ith column.\n\t\t/// </summary>\n\t\tpublic void FlipColumn(int iCol)\n\t\t{\n\t\t\tthis[0, iCol] *= -1.0f;\n\t\t\tthis[1, iCol] *= -1.0f;\n\t\t\tthis[2, iCol] *= -1.0f;\n\t\t\tthis[3, iCol] *= -1.0f;\n\t\t}\n\n        /// <summary>\n        /// Get the ith row as a vector.\n        /// </summary>\n        public Vector4f GetRow(int iRow)\n        {\n\t\t\treturn new Vector4f(this[iRow, 0], this[iRow, 1], this[iRow, 2], this[iRow, 3]);\n        }\n\n        /// <summary>\n        /// Set the ith row from a vector.\n        /// </summary>\n        public void SetRow(int iRow, Vector4f v)\n        {\n\t\t\tthis[iRow, 0] = v.x;\n\t\t\tthis[iRow, 1] = v.y;\n\t\t\tthis[iRow, 2] = v.z;\n\t\t\tthis[iRow, 3] = v.w;\n        }\n\n\t\t/// <summary>\n\t\t/// Flip the ith row.\n\t\t/// </summary>\n\t\tpublic void FlipRow(int iRow)\n\t\t{\n\t\t\tthis[iRow, 0] *= -1.0f;\n\t\t\tthis[iRow, 1] *= -1.0f;\n\t\t\tthis[iRow, 2] *= -1.0f;\n\t\t\tthis[iRow, 3] *= -1.0f;\n\t\t}\n\n        /// <summary>\n        /// Convert to a 3 dimension matrix.\n        /// </summary>\n        public Matrix3x3f ToMatrix3x3f()\n        {\n            Matrix3x3f mat = new Matrix3x3f();\n\n\t\t\tmat.m00 = m00; mat.m01 = m01; mat.m02 = m02;\n\t\t\tmat.m10 = m10; mat.m11 = m11; mat.m12 = m12;\n\t\t\tmat.m20 = m20; mat.m21 = m21; mat.m22 = m22;\n\n            return mat;\n        }\r\n\r\n        /// <summary>\n        /// Create a translation, rotation and scale.\n        /// </summary>\n        static public Matrix4x4f TranslateRotateScale(Vector3f t, Quaternion3f r, Vector3f s)\n        {\n            Matrix4x4f T = Translate(t);\n            Matrix4x4f R = r.ToMatrix4x4f();\n            Matrix4x4f S = Scale(s);\n\n            return T * R * S;\n        }\r\n\r\n        /// <summary>\n        /// Create a translation and rotation.\n        /// </summary>\n        static public Matrix4x4f TranslateRotate(Vector3f t, Quaternion3f r)\n        {\n            Matrix4x4f T = Translate(t);\n            Matrix4x4f R = r.ToMatrix4x4f();\n\n            return T * R;\n        }\r\n\r\n        /// <summary>\n        /// Create a translation and scale.\n        /// </summary>\n        static public Matrix4x4f TranslateScale(Vector3f t, Vector3f s)\n        {\n            Matrix4x4f T = Translate(t);\n            Matrix4x4f S = Scale(s);\n\n            return T * S;\n        }\r\n\r\n        /// <summary>\n        /// Create a rotation and scale.\n        /// </summary>\n        static public Matrix4x4f RotateScale(Quaternion3f r, Vector3f s)\n        {\n            Matrix4x4f R = r.ToMatrix4x4f();\n            Matrix4x4f S = Scale(s);\n\n            return R * S;\n        }\n\n        /// <summary>\n        /// Create a translation out of a vector.\n        /// </summary>\n        static public Matrix4x4f Translate(Vector3f v)\n        {\n            return new Matrix4x4f(\t1, 0, 0, v.x,\n                                    0, 1, 0, v.y,\n                                    0, 0, 1, v.z,\n                                    0, 0, 0, 1);\n        }\n\n        /// <summary>\n        /// Create a scale out of a vector.\n        /// </summary>\n        static public Matrix4x4f Scale(Vector3f v)\n        {\n            return new Matrix4x4f(\tv.x, 0, 0, 0,\n                                    0, v.y, 0, 0,\n                                    0, 0, v.z, 0,\n                                    0, 0, 0, 1);\n        }\r\n\r\n        /// <summary>\r\n        /// Create a scale out of a vector.\r\n        /// </summary>\r\n        static public Matrix4x4f Scale(float s)\r\n        {\r\n            return new Matrix4x4f(s, 0, 0, 0,\r\n                                  0, s, 0, 0,\r\n                                  0, 0, s, 0,\r\n                                  0, 0, 0, 1);\r\n        }\n\n        /// <summary>\n        /// Create a rotation out of a angle.\n        /// </summary>\n        static public Matrix4x4f RotateX(float angle)\n        {\n\t\t\tfloat ca = (float)Math.Cos(angle * Math.PI / 180.0);\n\t\t\tfloat sa = (float)Math.Sin(angle * Math.PI / 180.0);\n\n            return new Matrix4x4f(\t1, 0, 0, 0,\n                                    0, ca, -sa, 0,\n                                    0, sa, ca, 0,\n                                    0, 0, 0, 1);\n        }\n\n        /// <summary>\n        /// Create a rotation out of a angle.\n        /// </summary>\n        static public Matrix4x4f RotateY(float angle)\n        {\n\t\t\tfloat ca = (float)Math.Cos(angle * Math.PI / 180.0);\n\t\t\tfloat sa = (float)Math.Sin(angle * Math.PI / 180.0);\n\n            return new Matrix4x4f(\tca, 0, sa, 0,\n                                    0, 1, 0, 0,\n                                    -sa, 0, ca, 0,\n                                    0, 0, 0, 1);\n        }\n\n        /// <summary>\n        /// Create a rotation out of a angle.\n        /// </summary>\n        static public Matrix4x4f RotateZ(float angle)\n        {\n\t\t\tfloat ca = (float)Math.Cos(angle * Math.PI / 180.0);\n\t\t\tfloat sa = (float)Math.Sin(angle * Math.PI / 180.0);\n\n            return new Matrix4x4f(\tca, -sa, 0, 0,\n                                    sa, ca, 0, 0,\n                                    0, 0, 1, 0,\n                                    0, 0, 0, 1);\n        }\n\n        /// <summary>\n        /// Create a rotation out of a vector.\n        /// </summary>\n        static public Matrix4x4f Rotate(Vector3f euler)\n        {\r\n            return Quaternion3f.FromEuler(euler).ToMatrix4x4f();\n        }\n\n        /// <summary>\n        /// Create a perspective matrix.\n        /// </summary>\n        static public Matrix4x4f Perspective(float fovy, float aspect, float zNear, float zFar)\n        {\n\t\t\tfloat f = 1.0f / (float)Math.Tan((fovy * Math.PI / 180.0) / 2.0);\n            return new Matrix4x4f(\tf / aspect, 0, 0, 0,\n                                    0, f, 0, 0,\n                                    0, 0, (zFar + zNear) / (zNear - zFar), (2.0f * zFar * zNear) / (zNear - zFar),\n                                    0, 0, -1, 0);\n        }\n\n        /// <summary>\n        /// Create a ortho matrix.\n        /// </summary>\n        static public Matrix4x4f Ortho(float xRight, float xLeft, float yTop, float yBottom, float zNear, float zFar)\n        {\n            float tx, ty, tz;\n            tx = -(xRight + xLeft) / (xRight - xLeft);\n            ty = -(yTop + yBottom) / (yTop - yBottom);\n            tz = -(zFar + zNear) / (zFar - zNear);\n            return new Matrix4x4f(\t2.0f / (xRight - xLeft), 0, 0, tx,\n                                    0, 2.0f / (yTop - yBottom), 0, ty,\n                                    0, 0, -2.0f / (zFar - zNear), tz,\n                                    0, 0, 0, 1);\n        }\n\n\t\t/// <summary>\n\t\t/// Creates the matrix need to look at target from position.\n\t\t/// </summary>\n\t\tstatic public Matrix4x4f LookAt(Vector3f position, Vector3f target, Vector3f Up)\n\t\t{\n\t\t\t\n\t\t\tVector3f zaxis = (position - target).Normalized;\n\t\t\tVector3f xaxis = Up.Cross(zaxis).Normalized;\n\t\t\tVector3f yaxis = zaxis.Cross(xaxis);\n\t\t\t\n\t\t\treturn new Matrix4x4f(\txaxis.x, xaxis.y, xaxis.z, -Vector3f.Dot(xaxis, position),\n\t\t\t                      \tyaxis.x, yaxis.y, yaxis.z, -Vector3f.Dot(yaxis, position),\n\t\t\t                      \tzaxis.x, zaxis.y, zaxis.z, -Vector3f.Dot(zaxis, position),\n\t\t\t                      \t0, 0, 0, 1);\n\t\t}\n\n\n    }\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Matrix4x4f.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b23ff530d822b7145adbcab5a4583011\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/MatrixMxN.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\n\r\nusing Common.Core.Mathematics;\r\n\r\nnamespace Common.Core.LinearAlgebra\r\n{\r\n    public static class MatrixMxN\r\n    {\r\n\r\n        public static double[] MultiplyVector(double[,] matrix, double[] vector)\r\n        {\r\n            int M = matrix.GetLength(0);\r\n            int N = matrix.GetLength(1);\r\n\r\n            if (vector.Length != matrix.GetLength(1))\r\n                throw new ArgumentException(\"Matrix must have same number of columns as vectors length.\");\r\n\r\n            double[] multiplied = new double[M];\r\n\r\n            for (int i = 0; i < M; i++)\r\n            {\r\n                double sum = 0.0;\r\n                for (int j = 0; j < N; j++)\r\n                {\r\n                    sum += vector[j] * matrix[i, j];\r\n                }\r\n\r\n                multiplied[i] = sum;\r\n            }\r\n\r\n            return multiplied;\r\n        }\r\n\r\n        public static double[] MultiplyMatrix(double[] matrix1, double[,] matrix2)\r\n        {\r\n            int M = matrix1.Length;\r\n            int N = matrix2.GetLength(1);\r\n\r\n            if (matrix1.Length != matrix2.GetLength(0))\r\n                throw new ArgumentException(\"Matrix2 must have same number of rows as matrix1 has columns.\");\r\n\r\n            double[] multiplied = new double[N];\r\n\r\n            for (int j = 0; j < N; j++)\r\n            {\r\n                double sum = 0.0;\r\n                for (int i = 0; i < M; i++)\r\n                {\r\n                    sum += matrix1[i] * matrix2[i, j];\r\n                }\r\n\r\n                multiplied[j] = sum;\r\n            }\r\n\r\n            return multiplied;\r\n        }\r\n\r\n        public static double[,] MultiplyMatrix(double[,] matrix1, double[,] matrix2)\r\n        {\r\n            int M = matrix1.GetLength(0);\r\n            int N = matrix2.GetLength(1);\r\n\r\n            if (matrix1.GetLength(1) != matrix2.GetLength(0))\r\n                throw new ArgumentException(\"Matrix2 must have same number of rows as matrix1 has columns.\");\r\n\r\n            double[,] multiplied = new double[M, N];\r\n\r\n            for (int i = 0; i < M; i++)\r\n            {\r\n                for (int j = 0; j < N; j++)\r\n                {\r\n                    double sum = 0.0;\r\n                    for (int k = 0; k < matrix1.GetLength(1); k++)\r\n                    {\r\n                        sum += matrix1[i, k] * matrix2[k, j];\r\n                    }\r\n\r\n                    multiplied[i, j] = sum;\r\n                }\r\n            }\r\n\r\n            return multiplied;\r\n        }\r\n\r\n        public static double[,] MultiplyScalar(double[,] matrix, double v)\r\n        {\r\n            int M = matrix.GetLength(0);\r\n            int N = matrix.GetLength(1);\r\n\r\n            double[,] multiplied = new double[M, N];\r\n\r\n            for (int i = 0; i < M; i++)\r\n            {\r\n                for (int j = 0; j < N; j++)\r\n                    multiplied[i, j] = matrix[i, j] * v;\r\n            }\r\n\r\n            return multiplied;\r\n        }\r\n\r\n        public static double[,] Add(double[,] matrix1, double[,] matrix2)\r\n        {\r\n            int M = matrix1.GetLength(0);\r\n            int N = matrix1.GetLength(1);\r\n\r\n            if (M != matrix2.GetLength(0) || N != matrix2.GetLength(1))\r\n                throw new ArgumentException(\"Two matrices should be the same dimension to add.\");\r\n\r\n            double[,] sum = new double[M, N];\r\n            for (int i = 0; i < M; i++)\r\n            {\r\n                for (int j = 0; j < N; j++)\r\n                    sum[i, j] = matrix1[i, j] + matrix2[i, j];\r\n\r\n            }\r\n\r\n            return sum;\r\n        }\r\n\r\n        public static double[,] Subtract(double[,] matrix1, double[,] matrix2)\r\n        {\r\n            int M = matrix1.GetLength(0);\r\n            int N = matrix1.GetLength(1);\r\n\r\n            if (M != matrix2.GetLength(0) || N != matrix2.GetLength(1))\r\n                throw new ArgumentException(\"Two matrices should be the same dimension.\");\r\n\r\n            double[,] sum = new double[M, N];\r\n            for (int i = 0; i < M; i++)\r\n            {\r\n                for (int j = 0; j < N; j++)\r\n                    sum[i, j] = matrix1[i, j] - matrix2[i, j];\r\n\r\n            }\r\n\r\n            return sum;\r\n        }\r\n\r\n        public static double[,] Transpose(double[,] matrix)\r\n        {\r\n            int M = matrix.GetLength(0);\r\n            int N = matrix.GetLength(1);\r\n\r\n            double[,] transposed = new double[N, M];\r\n            for (int i = 0; i < M; i++)\r\n            {\r\n                for (int j = 0; j < N; j++)\r\n                {\r\n                    transposed[j, i] = matrix[i, j];\r\n                }\r\n            }\r\n            return transposed;\r\n        }\r\n\r\n        public static double[,] Inverse(double[,] matrix)\r\n        {\r\n\t\t    return MultiplyScalar(Transpose(Cofactor(matrix)), DMath.SafeInv(Determinant(matrix)));\r\n        }\r\n\r\n        public static double Determinant(double[,] matrix)\r\n        {\r\n            int M = matrix.GetLength(0);\r\n            int N = matrix.GetLength(1);\r\n\r\n            if (N != M)\r\n                throw new ArgumentException(\"Matrix need to be square to find determinant.\");\r\n\r\n            if (M == 1)\r\n                return matrix[0, 0];\r\n\r\n            if (M == 2)\r\n                return matrix[0, 0] * matrix[1, 1] - matrix[0, 1] * matrix[1, 0];\r\n\r\n            double sum = 0.0;\r\n            for (int i = 0; i < N; i++)\r\n                sum += ChangeSign(i) * matrix[0, i] * Determinant(SubMatrix(matrix, 0, i));\r\n            \r\n            return sum;\r\n        }\r\n\r\n        public static double[,] Cofactor(double[,] matrix)\r\n        {\r\n            int M = matrix.GetLength(0);\r\n            int N = matrix.GetLength(1);\r\n\r\n            double[,] mat = new double[M, N];\r\n\r\n            for (int i = 0; i < M; i++)\r\n            {\r\n                for (int j = 0; j < N; j++)\r\n                {\r\n                    mat[i, j] = ChangeSign(i) * ChangeSign(j) * Determinant(SubMatrix(matrix, i, j));\r\n                }\r\n            }\r\n\r\n            return mat;\r\n        }\r\n\r\n        public static double[,] SubMatrix(double[,] matrix, int excluding_row, int excluding_col)\r\n        {\r\n            int M = matrix.GetLength(0);\r\n            int N = matrix.GetLength(1);\r\n\r\n            double[,] mat = new double[M - 1, N - 1];\r\n            int r = -1;\r\n            for (int i = 0; i < M; i++)\r\n            {\r\n                if (i == excluding_row)\r\n                    continue;\r\n                r++;\r\n                int c = -1;\r\n                for (int j = 0; j < N; j++)\r\n                {\r\n                    if (j == excluding_col)\r\n                        continue;\r\n                    mat[r, ++c] = matrix[i, j];\r\n                }\r\n            }\r\n\r\n            return mat;\r\n        }\r\n\r\n        private static int ChangeSign(int i)\r\n        {\r\n            if (i % 2 == 0)\r\n                return 1;\r\n            return -1;\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/MatrixMxN.cs.meta",
    "content": "fileFormatVersion: 2\nguid: d64ab62afd178ca4f9b734695ee8f4e6\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Quaternion3d.cs",
    "content": "using System;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\r\n\r\nnamespace Common.Core.LinearAlgebra\r\n{\r\n    /// <summary>\r\n    /// A double precision quaternion.\r\n    /// </summary>\r\n\t[StructLayout(LayoutKind.Sequential)]\r\n    public struct Quaternion3d\r\n\t{\r\n\t\t\r\n\t\tpublic double x, y, z, w;\r\n\n        public readonly static Quaternion3d Identity = new Quaternion3d(0, 0, 0, 1);\r\n\r\n        public readonly static Quaternion3d Zero = new Quaternion3d(0, 0, 0, 0);\r\n\r\n        /// <summary>\r\n        /// A Quaternion from varibles.\r\n        /// </summary>\r\n        public Quaternion3d(double x, double y, double z, double w)\r\n\t\t{\r\n\t\t\tthis.x = x;\r\n\t\t    this.y = y;\r\n\t\t\tthis.z = z;\r\n\t\t\tthis.w = w;\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// A Quaternion copied from a array.\r\n        /// </summary>\r\n\t\tpublic Quaternion3d(double[] v)\r\n\t\t{\r\n\t\t\tthis.x = v[0];\r\n\t\t    this.y = v[1];\r\n\t\t\tthis.z = v[2];\r\n\t\t\tthis.w = v[3];\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// The inverse of the quaternion.\r\n        /// </summary>\r\n        public Quaternion3d Inverse\r\n        {\r\n            get\r\n            {\r\n                return new Quaternion3d(-x, -y, -z, w);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The length of the quaternion.\r\n        /// </summary>\r\n        double Length\r\n        {\r\n            get\r\n            {\r\n                double len = x * x + y * y + z * z + w * w;\r\n                return DMath.SafeSqrt(len);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The a normalized quaternion.\r\n        /// </summary>\r\n        public Quaternion3d Normalized\r\n        {\r\n            get\r\n            {\r\n                double inv = DMath.SafeInv(Length);\r\n                return new Quaternion3d(x * inv, y * inv, z * inv, w * inv);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Are these Quaternions equal.\r\n        /// </summary>\r\n        public static bool operator ==(Quaternion3d v1, Quaternion3d v2)\r\n\t\t{\r\n\t\t\treturn (v1.x == v2.x && v1.y == v2.y && v1.z == v2.z && v1.w == v2.w);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Are these Quaternions not equal.\r\n\t\t/// </summary>\r\n\t\tpublic static bool operator !=(Quaternion3d v1, Quaternion3d v2)\r\n\t\t{\r\n\t\t\treturn (v1.x != v2.x || v1.y != v2.y || v1.z != v2.z || v1.w != v2.w);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Are these Quaternions equal.\r\n\t\t/// </summary>\r\n\t\tpublic override bool Equals (object obj)\r\n\t\t{\r\n\t\t\tif(!(obj is Quaternion3d)) return false;\r\n\t\t\t\r\n\t\t\tQuaternion3d v = (Quaternion3d)obj;\r\n\t\t\t\r\n\t\t\treturn this == v;\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Quaternions hash code. \r\n\t\t/// </summary>\r\n\t\tpublic override int GetHashCode()\r\n\t\t{\r\n            double hashcode = 23;\r\n            hashcode = (hashcode * 37) + x;\r\n            hashcode = (hashcode * 37) + y;\r\n            hashcode = (hashcode * 37) + z;\r\n            hashcode = (hashcode * 37) + w;\r\n\r\n            return unchecked((int)hashcode);\r\n        }\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Quaternion as a string.\r\n\t\t/// </summary>\r\n\t\tpublic override string ToString()\r\n\t\t{\r\n\t\t\treturn \"(\" + x + \",\" + y + \",\" + z + \",\" + w + \")\";\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// A Quaternion from a vector axis and angle.\r\n        /// The axis is the up direction and the angle is the rotation.\r\n        /// </summary>\r\n\t\tpublic Quaternion3d(Vector3d axis, double angle)\r\n\t\t{\r\n\t\t    Vector3d axisN = axis.Normalized;\r\n\t\t    double a = angle * 0.5;\r\n\t\t    double sina = Math.Sin(a);\r\n\t\t    double cosa = Math.Cos(a);\r\n\t\t    x = axisN.x * sina;\r\n\t\t    y = axisN.y * sina;\r\n\t\t    z = axisN.z * sina;\r\n\t\t    w = cosa;\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// A quaternion with the rotation required to\r\n        /// rotation from the from direction to the to direction.\r\n        /// </summary>\r\n        public Quaternion3d(Vector3d to, Vector3d from)\r\n\t\t{\r\n\t\t    Vector3d f = from.Normalized;\r\n\t\t    Vector3d t = to.Normalized;\r\n\t\t\r\n\t\t    double dotProdPlus1 = 1.0 + Vector3d.Dot(f, t);\r\n\t\t\r\n\t\t    if (dotProdPlus1 < DMath.EPS) \r\n\t\t\t{\r\n\t\t        w = 0;\r\n\t\t        if (Math.Abs(f.x) < 0.6) \r\n\t\t\t\t{\r\n\t\t            double norm = Math.Sqrt(1 - f.x * f.x);\r\n\t\t            x = 0;\r\n\t\t            y = f.z / norm;\r\n\t\t            z = -f.y / norm;\r\n\t\t        } \r\n\t\t\t\telse if (Math.Abs(f.y) < 0.6) \r\n\t\t\t\t{\r\n\t\t            double norm = Math.Sqrt(1 - f.y * f.y);\r\n\t\t            x = -f.z / norm;\r\n\t\t            y = 0;\r\n\t\t            z = f.x / norm;\r\n\t\t        } \r\n\t\t\t\telse \r\n\t\t\t\t{\r\n\t\t            double norm = Math.Sqrt(1 - f.z * f.z);\r\n\t\t            x = f.y / norm;\r\n\t\t            y = -f.x / norm;\r\n\t\t            z = 0;\r\n\t\t        }\r\n\t\t    } \r\n\t\t\telse \r\n\t\t\t{\r\n\t\t        double s = Math.Sqrt(0.5 * dotProdPlus1);\r\n\t\t        Vector3d tmp = (f.Cross(t)) / (2.0 * s);\r\n\t\t        x = tmp.x;\r\n\t\t        y = tmp.y;\r\n\t\t        z = tmp.z;\r\n\t\t        w = s;\r\n\t\t    }\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Multiply two quaternions together.\r\n\t\t/// </summary>\r\n\t\tpublic static Quaternion3d operator*( Quaternion3d q1, Quaternion3d q2 )\r\n\t\t{\r\n\t\t\treturn new Quaternion3d(q2.w * q1.x  + q2.x * q1.w  + q2.y * q1.z  - q2.z * q1.y,\r\n\t\t                \t\t\tq2.w * q1.y  - q2.x * q1.z  + q2.y * q1.w  + q2.z * q1.x,\r\n\t\t                \t\t\tq2.w * q1.z  + q2.x * q1.y  - q2.y * q1.x  + q2.z * q1.w,\r\n\t\t                \t\t\tq2.w * q1.w  - q2.x * q1.x  - q2.y * q1.y  - q2.z * q1.z);\r\n\t\t}\r\n\t\t\r\n        /// <summary>\r\n        /// Multiply a quaternion and a vector together.\r\n        /// </summary>\r\n\t\tpublic static Vector3d operator*(Quaternion3d q, Vector3d v)\r\n\t\t{\r\n\t\t    return q.ToMatrix3x3d() * v;\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Convert to a double precision 3 dimension matrix.\r\n        /// </summary>\r\n\t\tpublic Matrix3x3d ToMatrix3x3d()\r\n\t\t{\r\n\t\t    double \txx = x * x,\r\n\t\t         \txy = x * y,\r\n\t\t        \txz = x * z,\r\n\t\t         \txw = x * w,\r\n\t\t         \tyy = y * y,\r\n\t\t         \tyz = y * z,\r\n\t\t         \tyw = y * w,\r\n\t\t         \tzz = z * z,\r\n\t\t         \tzw = z * w;\r\n\t\t\t\r\n\t\t\treturn new Matrix3x3d\r\n\t\t\t(\r\n\t\t\t \t1.0 - 2.0 * (yy + zz), 2.0 * (xy - zw), 2.0 * (xz + yw),\r\n\t\t\t \t2.0 * (xy + zw), 1.0 - 2.0 * (xx + zz), 2.0 * (yz - xw),\r\n\t\t\t \t2.0 * (xz - yw), 2.0 * (yz + xw), 1.0 - 2.0 * (xx + yy)\r\n\t\t\t);\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Convert to a double precision 4 dimension matrix.\r\n        /// </summary>\r\n\t\tpublic Matrix4x4d ToMatrix4x4d()\r\n\t\t{\r\n\t\t\tdouble \txx = x * x,\r\n\t\t\t\t\txy = x * y,\r\n\t\t\t\t\txz = x * z,\r\n\t\t\t\t\txw = x * w,\r\n\t\t\t\t\tyy = y * y,\r\n\t\t\t\t\tyz = y * z,\r\n\t\t\t\t\tyw = y * w,\r\n\t\t\t\t\tzz = z * z,\r\n\t\t\t\t\tzw = z * w;\r\n\t\t\t\r\n\t\t\treturn new Matrix4x4d\r\n\t\t\t(\r\n\t\t\t\t1.0 - 2.0 * (yy + zz), 2.0 * (xy - zw), 2.0 * (xz + yw), 0.0,\r\n\t\t\t\t2.0 * (xy + zw), 1.0 - 2.0 * (xx + zz), 2.0 * (yz - xw), 0.0,\r\n\t\t\t\t2.0 * (xz - yw), 2.0 * (yz + xw), 1.0 - 2.0 * (xx + yy), 0.0,\r\n\t\t\t\t0.0, 0.0, 0.0, 1.0\r\n\t\t\t);\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// The normalize the quaternion.\r\n        /// </summary>\r\n\t\tpublic void Normalize()\r\n\t\t{\r\n\t\t    double invLength = DMath.SafeInv(Length);\r\n\t\t    x *= invLength; \r\n\t\t\ty *= invLength; \r\n\t\t\tz *= invLength; \r\n\t\t\tw *= invLength;\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Slerp the quaternion by t.\r\n        /// </summary>\r\n\t\tpublic static Quaternion3d Slerp(Quaternion3d from, Quaternion3d to, double t)\r\n\t\t{\r\n            if (t <= 0.0) \r\n\t\t\t{\r\n                return from;\r\n\t\t    }\r\n            else if (t >= 1.0) \r\n\t\t\t{\r\n                return to;\r\n\t\t    } \r\n\t\t\telse \r\n\t\t\t{\r\n\t\t        double cosom = from.x * to.x + from.y * to.y + from.z * to.z + from.w * to.w;\r\n\t\t        double absCosom = Math.Abs(cosom);\r\n\t\t\r\n\t\t        double scale0;\r\n\t\t        double scale1;\r\n\t\t\r\n\t\t        if (1.0 - absCosom > DMath.EPS) \r\n\t\t\t\t{\r\n\t\t            double omega = DMath.SafeAcos(absCosom);\r\n\t\t            double sinom = 1.0 / Math.Sin( omega );\r\n\t\t            scale0 = Math.Sin( ( 1.0 - t ) * omega ) * sinom;\r\n\t\t            scale1 = Math.Sin( t * omega ) * sinom;\r\n\t\t        } \r\n\t\t\t\telse \r\n\t\t\t\t{\r\n                    scale0 = 1.0 - t;\r\n\t\t            scale1 = t;\r\n\t\t        }\r\n\r\n                Quaternion3d res = new Quaternion3d(scale0 * from.x + scale1 * to.x,\r\n\t                                                scale0 * from.y + scale1 * to.y,\r\n\t                                                scale0 * from.z + scale1 * to.z,\r\n\t                                                scale0 * from.w + scale1 * to.w);\r\n\t\t\t\t\r\n\t\t        return res.Normalized;\r\n\t\t    }\r\n\t\t}\r\n\r\n        /// <summary>\n        /// Create a rotation out of a vector.\n        /// </summary>\n        public static Quaternion3d FromEuler(Vector3d euler)\n        {\r\n            double degToRad = Math.PI / 180.0;\r\n\r\n            double yaw = euler.x * degToRad;\r\n            double pitch = euler.y * degToRad;\r\n            double roll = euler.z * degToRad;\r\n            double rollOver2 = roll * 0.5;\r\n            double sinRollOver2 = Math.Sin(rollOver2);\r\n            double cosRollOver2 = Math.Cos(rollOver2);\r\n            double pitchOver2 = pitch * 0.5;\r\n            double sinPitchOver2 = Math.Sin(pitchOver2);\r\n            double cosPitchOver2 = Math.Cos(pitchOver2);\r\n            double yawOver2 = yaw * 0.5;\r\n            double sinYawOver2 = Math.Sin(yawOver2);\r\n            double cosYawOver2 = Math.Cos(yawOver2);\r\n\r\n            Quaternion3d result;\r\n            result.x = cosYawOver2 * cosPitchOver2 * cosRollOver2 + sinYawOver2 * sinPitchOver2 * sinRollOver2;\r\n            result.y = cosYawOver2 * cosPitchOver2 * sinRollOver2 - sinYawOver2 * sinPitchOver2 * cosRollOver2;\r\n            result.z = cosYawOver2 * sinPitchOver2 * cosRollOver2 + sinYawOver2 * cosPitchOver2 * sinRollOver2;\r\n            result.w = sinYawOver2 * cosPitchOver2 * cosRollOver2 - cosYawOver2 * sinPitchOver2 * sinRollOver2;\r\n            return result;\n        }\r\n\r\n    }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Quaternion3d.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c2b4193eee97e4649ad3948f8e99a317\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Quaternion3f.cs",
    "content": "using System;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\r\n\r\nnamespace Common.Core.LinearAlgebra\r\n{\r\n    /// <summary>\r\n    /// A single precision quaternion.\r\n    /// </summary>\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Quaternion3f\r\n    {\r\n\r\n        public float x, y, z, w;\r\n\r\n        public readonly static Quaternion3f Identity = new Quaternion3f(0, 0, 0, 1);\r\n\r\n        public readonly static Quaternion3f Zero = new Quaternion3f(0, 0, 0, 0);\r\n\r\n        /// <summary>\r\n        /// A Quaternion from varibles.\r\n        /// </summary>\r\n        public Quaternion3f(float x, float y, float z, float w)\r\n        {\r\n            this.x = x;\r\n            this.y = y;\r\n            this.z = z;\r\n            this.w = w;\r\n        }\r\n\r\n        /// <summary>\r\n        /// A Quaternion copied from a array.\r\n        /// </summary>\r\n        public Quaternion3f(float[] v)\r\n        {\r\n            this.x = v[0];\r\n            this.y = v[1];\r\n            this.z = v[2];\r\n            this.w = v[3];\r\n        }\r\n\r\n        /// <summary>\r\n        /// The inverse of the quaternion.\r\n        /// </summary>\r\n        public Quaternion3f Inverse\r\n        {\r\n            get\r\n            {\r\n                return new Quaternion3f(-x, -y, -z, w);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The length of the quaternion.\r\n        /// </summary>\r\n        float Length\r\n        {\r\n            get\r\n            {\r\n                float len = x * x + y * y + z * z + w * w;\r\n                return FMath.SafeSqrt(len);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The a normalized quaternion.\r\n        /// </summary>\r\n        public Quaternion3f Normalized\r\n        {\r\n            get\r\n            {\r\n                float inv = FMath.SafeInv(Length);\r\n                return new Quaternion3f(x * inv, y * inv, z * inv, w * inv);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Are these Quaternions equal.\r\n        /// </summary>\r\n        public static bool operator ==(Quaternion3f v1, Quaternion3f v2)\r\n\t\t{\r\n\t\t\treturn (v1.x == v2.x && v1.y == v2.y && v1.z == v2.z && v1.w == v2.w);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Are these Quaternions not equal.\r\n\t\t/// </summary>\r\n\t\tpublic static bool operator !=(Quaternion3f v1, Quaternion3f v2)\r\n\t\t{\r\n\t\t\treturn (v1.x != v2.x || v1.y != v2.y || v1.z != v2.z || v1.w != v2.w);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Are these Quaternions equal.\r\n\t\t/// </summary>\r\n\t\tpublic override bool Equals (object obj)\r\n\t\t{\r\n\t\t\tif(!(obj is Quaternion3f)) return false;\r\n\t\t\t\r\n\t\t\tQuaternion3f v = (Quaternion3f)obj;\r\n\t\t\t\r\n\t\t\treturn this == v;\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Quaternions hash code. \r\n\t\t/// </summary>\r\n\t\tpublic override int GetHashCode()\r\n\t\t{\r\n            float hashcode = 23;\r\n            hashcode = (hashcode * 37) + x;\r\n            hashcode = (hashcode * 37) + y;\r\n            hashcode = (hashcode * 37) + z;\r\n            hashcode = (hashcode * 37) + w;\r\n\r\n            return unchecked((int)hashcode);\r\n        }\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Quaternion as a string.\r\n\t\t/// </summary>\r\n\t\tpublic override string ToString()\r\n\t\t{\r\n\t\t\treturn \"(\" + x + \",\" + y + \",\" + z + \",\" + w + \")\";\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// A Quaternion from a vector axis and angle.\r\n        /// The axis is the up direction and the angle is the rotation.\r\n        /// </summary>\r\n        public Quaternion3f(Vector3f axis, float angle)\r\n        {\r\n            Vector3f axisN = axis.Normalized;\r\n            float a = angle * 0.5f;\r\n\t\t\tfloat sina = (float)Math.Sin(a);\r\n\t\t\tfloat cosa = (float)Math.Cos(a);\r\n            x = axisN.x * sina;\r\n            y = axisN.y * sina;\r\n            z = axisN.z * sina;\r\n            w = cosa;\r\n        }\r\n\r\n        /// <summary>\r\n        /// A quaternion with the rotation required to\r\n        /// rotation from the from direction to the to direction.\r\n        /// </summary>\r\n        public Quaternion3f(Vector3f to, Vector3f from)\r\n        {\r\n            Vector3f f = from.Normalized;\r\n            Vector3f t = to.Normalized;\r\n\r\n            float dotProdPlus1 = 1.0f + Vector3f.Dot(f, t);\r\n\r\n            if (dotProdPlus1 < FMath.EPS)\r\n            {\r\n                w = 0;\r\n                if (Math.Abs(f.x) < 0.6f)\r\n                {\r\n\t\t\t\t\tfloat norm = (float)Math.Sqrt(1 - f.x * f.x);\r\n                    x = 0;\r\n                    y = f.z / norm;\r\n                    z = -f.y / norm;\r\n                }\r\n                else if (Math.Abs(f.y) < 0.6f)\r\n                {\r\n\t\t\t\t\tfloat norm = (float)Math.Sqrt(1 - f.y * f.y);\r\n                    x = -f.z / norm;\r\n                    y = 0;\r\n                    z = f.x / norm;\r\n                }\r\n                else\r\n                {\r\n\t\t\t\t\tfloat norm = (float)Math.Sqrt(1 - f.z * f.z);\r\n                    x = f.y / norm;\r\n                    y = -f.x / norm;\r\n                    z = 0;\r\n                }\r\n            }\r\n            else\r\n            {\r\n\t\t\t\tfloat s = (float)Math.Sqrt(0.5f * dotProdPlus1);\r\n                Vector3f tmp = (f.Cross(t)) / (2.0f * s);\r\n                x = tmp.x;\r\n                y = tmp.y;\r\n                z = tmp.z;\r\n                w = s;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply two quternions together.\r\n        /// </summary>\r\n\t\tpublic static Quaternion3f operator *(Quaternion3f q1, Quaternion3f q2)\r\n        {\r\n\t\t\treturn new Quaternion3f(q2.w * q1.x + q2.x * q1.w + q2.y * q1.z - q2.z * q1.y,\r\n                            \t\tq2.w * q1.y - q2.x * q1.z + q2.y * q1.w + q2.z * q1.x,\r\n                            \t\tq2.w * q1.z + q2.x * q1.y - q2.y * q1.x + q2.z * q1.w,\r\n                            \t\tq2.w * q1.w - q2.x * q1.x - q2.y * q1.y - q2.z * q1.z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply a quaternion and a vector together.\r\n        /// </summary>\r\n\t\tpublic static Vector3f operator *(Quaternion3f q, Vector3f v)\r\n        {\r\n            return q.ToMatrix3x3f() * v;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert to a single precision 3 dimension matrix.\r\n        /// </summary>\r\n        public Matrix3x3f ToMatrix3x3f()\r\n        {\r\n            float   xx = x * x,\r\n                    xy = x * y,\r\n                    xz = x * z,\r\n                    xw = x * w,\r\n                    yy = y * y,\r\n                    yz = y * z,\r\n                    yw = y * w,\r\n                    zz = z * z,\r\n                    zw = z * w;\r\n\r\n            return new Matrix3x3f\r\n            (\r\n                1.0f - 2.0f * (yy + zz), 2.0f * (xy - zw), 2.0f * (xz + yw),\r\n                2.0f * (xy + zw), 1.0f - 2.0f * (xx + zz), 2.0f * (yz - xw),\r\n                2.0f * (xz - yw), 2.0f * (yz + xw), 1.0f - 2.0f * (xx + yy)\r\n            );\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert to a single precision 4 dimension matrix.\r\n        /// </summary>\r\n        public Matrix4x4f ToMatrix4x4f()\r\n        {\r\n            float   xx = x * x,\r\n                    xy = x * y,\r\n                    xz = x * z,\r\n                    xw = x * w,\r\n                    yy = y * y,\r\n                    yz = y * z,\r\n                    yw = y * w,\r\n                    zz = z * z,\r\n                    zw = z * w;\r\n\r\n            return new Matrix4x4f\r\n            (\r\n                1.0f - 2.0f * (yy + zz), 2.0f * (xy - zw), 2.0f * (xz + yw), 0.0f,\r\n                2.0f * (xy + zw), 1.0f - 2.0f * (xx + zz), 2.0f * (yz - xw), 0.0f,\r\n                2.0f * (xz - yw), 2.0f * (yz + xw), 1.0f - 2.0f * (xx + yy), 0.0f,\r\n                0.0f, 0.0f, 0.0f, 1.0f\r\n            );\r\n        }\r\n\r\n        /// <summary>\r\n        /// The normalize the quaternion.\r\n        /// </summary>\r\n        public void Normalize()\r\n        {\r\n            float invLength = FMath.SafeInv(Length);\r\n            x *= invLength;\r\n            y *= invLength;\r\n            z *= invLength;\r\n            w *= invLength;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Slerp the quaternion from the from rotation to the to rotation by t.\r\n        /// </summary>\r\n\t\tpublic static Quaternion3f Slerp(Quaternion3f from, Quaternion3f to, float t)\r\n        {\r\n            if (t <= 0.0f)\r\n            {\r\n                return from;\r\n            }\r\n            else if (t >= 1.0f)\r\n            {\r\n                return to;\r\n            }\r\n            else\r\n            {\r\n                float cosom = from.x * to.x + from.y * to.y + from.z * to.z + from.w * to.w;\r\n                float absCosom = Math.Abs(cosom);\r\n\r\n                float scale0;\r\n                float scale1;\r\n\r\n                if ((1 - absCosom) > FMath.EPS)\r\n                {\r\n                    float omega = FMath.SafeAcos(absCosom);\r\n\t\t\t\t\tfloat sinom = 1.0f / (float)Math.Sin(omega);\r\n\t\t\t\t\tscale0 = (float)Math.Sin((1.0f - t) * omega) * sinom;\r\n\t\t\t\t\tscale1 = (float)Math.Sin(t * omega) * sinom;\r\n                }\r\n                else\r\n                {\r\n                    scale0 = 1 - t;\r\n                    scale1 = t;\r\n                }\r\n                Quaternion3f res = new Quaternion3f(scale0 * from.x + scale1 * to.x,\r\n                                                    scale0 * from.y + scale1 * to.y,\r\n                                                    scale0 * from.z + scale1 * to.z,\r\n                                                    scale0 * from.w + scale1 * to.w);\r\n\r\n                return res.Normalized;\r\n            }\r\n        }\r\n\r\n        /// <summary>\n        /// Create a rotation out of a vector.\n        /// </summary>\n        public static Quaternion3f FromEuler(Vector3f euler)\n        {\r\n \r\n            float degToRad = (float)(Math.PI / 180.0);\r\n\r\n            var yaw = euler.x * degToRad;\r\n            var pitch = euler.y * degToRad;\r\n            var roll = euler.z * degToRad;\r\n            float rollOver2 = roll * 0.5f;\r\n            float sinRollOver2 = (float)Math.Sin(rollOver2);\r\n            float cosRollOver2 = (float)Math.Cos(rollOver2);\r\n            float pitchOver2 = pitch * 0.5f;\r\n            float sinPitchOver2 = (float)Math.Sin(pitchOver2);\r\n            float cosPitchOver2 = (float)Math.Cos(pitchOver2);\r\n            float yawOver2 = yaw * 0.5f;\r\n            float sinYawOver2 = (float)Math.Sin(yawOver2);\r\n            float cosYawOver2 = (float)Math.Cos(yawOver2);\r\n\r\n            Quaternion3f result;\r\n            result.x = cosYawOver2 * cosPitchOver2 * cosRollOver2 + sinYawOver2 * sinPitchOver2 * sinRollOver2;\r\n            result.y = cosYawOver2 * cosPitchOver2 * sinRollOver2 - sinYawOver2 * sinPitchOver2 * cosRollOver2;\r\n            result.z = cosYawOver2 * sinPitchOver2 * cosRollOver2 + sinYawOver2 * cosPitchOver2 * sinRollOver2;\r\n            result.w = sinYawOver2 * cosPitchOver2 * cosRollOver2 - cosYawOver2 * sinPitchOver2 * sinRollOver2;\r\n            return result;\r\n\r\n        }\r\n\r\n\r\n    }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Quaternion3f.cs.meta",
    "content": "fileFormatVersion: 2\nguid: da6fc536acb153944a010e07ae652bf9\ntimeCreated: 1514536271\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector2d.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\n\nnamespace Common.Core.LinearAlgebra\n{\n    /// <summary>\n    /// A 2d double precision vector.\n    /// </summary>\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Vector2d\n\t{\n\t\tpublic double x, y;\n\n        /// <summary>\n        /// The unit x vector.\n        /// </summary>\n\t    public readonly static Vector2d UnitX = new Vector2d(1, 0);\n\n        /// <summary>\n        /// The unit y vector.\n        /// </summary>\n\t    public readonly static Vector2d UnitY = new Vector2d(0, 1);\n\n        /// <summary>\n        /// A vector of zeros.\n        /// </summary>\n\t    public readonly static Vector2d Zero = new Vector2d(0);\n\n        /// <summary>\n        /// A vector of ones.\n        /// </summary>\n\t    public readonly static Vector2d One = new Vector2d(1);\r\n\r\n        /// <summary>\r\n        /// A vector of positive infinity.\r\n        /// </summary>\r\n        public readonly static Vector2d PositiveInfinity = new Vector2d(double.PositiveInfinity);\r\n\r\n        /// <summary>\r\n        /// A vector of negative infinity.\r\n        /// </summary>\r\n        public readonly static Vector2d NegativeInfinity = new Vector2d(double.NegativeInfinity);\r\n\r\n        /// <summary>\r\n        /// Convert to a 3 dimension vector.\r\n        /// </summary>\r\n        public Vector3d x0z\r\n        {\r\n            get { return new Vector3d(x, 0, y); }\r\n        }\r\n\r\n        /// <summary>\n        /// A vector all with the value v.\n        /// </summary>\n        public Vector2d(double v) \n\t\t{\n\t\t\tthis.x = v; \n\t\t\tthis.y = v; \n\t\t}\n\n        /// <summary>\n        /// A vector from the varibles.\n        /// </summary>\n\t\tpublic Vector2d(double x, double y) \n\t\t{\n\t\t\tthis.x = x; \n\t\t\tthis.y = y; \n\t\t}\r\n\r\n        public double this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return x;\r\n                    case 1: return y;\r\n                    default: throw new IndexOutOfRangeException(\"Vector2d index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: x = value; break;\r\n                    case 1: y = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Vector2d index out of range: \" + i);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\n        /// The length of the vector.\n        /// </summary>\n        public double Magnitude\r\n        {\r\n            get\r\n            {\r\n                return DMath.SafeSqrt(SqrMagnitude);\r\n            }\r\n        }\n\n        /// <summary>\n        /// The length of the vector squared.\n        /// </summary>\n\t\tpublic double SqrMagnitude\r\n        {\r\n            get\r\n            {\r\n                return (x * x + y * y);\r\n            }\r\n        }\r\n\r\n        /// <summary>\n        /// The vector normalized.\n        /// </summary>\n        public Vector2d Normalized\r\n        {\r\n            get\r\n            {\r\n                double invLength = DMath.SafeInvSqrt(1.0, x * x + y * y);\r\n                return new Vector2d(x * invLength, y * invLength);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Counter clock-wise perpendicular.\r\n        /// </summary>\r\n        public Vector2d PerpendicularCCW\r\n        {\r\n            get\r\n            {\r\n                return new Vector2d(-y, x);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Clock-wise perpendicular.\r\n        /// </summary>\r\n        public Vector2d PerpendicularCW\r\n        {\r\n            get\r\n            {\r\n                return new Vector2d(y, -x);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The vectors absolute values.\r\n        /// </summary>\n        public Vector2d Absolute\r\n        {\r\n            get\r\n            {\r\n                return new Vector2d(Math.Abs(x), Math.Abs(y));\r\n            }\r\n        }\n\n        /// <summary>\n        /// Add two vectors.\n        /// </summary>\n        public static Vector2d operator +(Vector2d v1, Vector2d v2)\n        {\n            return new Vector2d(v1.x + v2.x, v1.y + v2.y);\n        }\n\n        /// <summary>\n        /// Add vector and scalar.\n        /// </summary>\n        public static Vector2d operator +(Vector2d v1, double s)\n        {\n            return new Vector2d(v1.x + s, v1.y + s);\n        }\r\n\r\n        /// <summary>\n        /// Add vector and scalar.\n        /// </summary>\n        public static Vector2d operator +(double s, Vector2d v1)\n        {\n            return new Vector2d(v1.x + s, v1.y + s);\n        }\n\n        /// <summary>\n        /// Subtract two vectors.\n        /// </summary>\n        public static Vector2d operator -(Vector2d v1, Vector2d v2)\n        {\n            return new Vector2d(v1.x - v2.x, v1.y - v2.y);\n        }\n\n        /// <summary>\n        /// Subtract vector and scalar.\n        /// </summary>\n        public static Vector2d operator -(Vector2d v1, double s)\n        {\n            return new Vector2d(v1.x - s, v1.y - s);\n        }\r\n\r\n        /// <summary>\n        /// Subtract vector and scalar.\n        /// </summary>\n        public static Vector2d operator -(double s, Vector2d v1)\n        {\n            return new Vector2d(v1.x - s, v1.y - s);\n        }\n\n        /// <summary>\n        /// Multiply two vectors.\n        /// </summary>\n        public static Vector2d operator *(Vector2d v1, Vector2d v2)\n        {\n            return new Vector2d(v1.x * v2.x, v1.y * v2.y);\n        }\n\n        /// <summary>\n        /// Multiply a vector and a scalar.\n        /// </summary>\n        public static Vector2d operator *(Vector2d v, double s)\n        {\n            return new Vector2d(v.x * s, v.y * s);\n        }\n\n        /// <summary>\n        /// Multiply a vector and a scalar.\n        /// </summary>\n        public static Vector2d operator *(double s, Vector2d v)\n        {\n            return new Vector2d(v.x * s, v.y * s);\n        }\n\n        /// <summary>\n        /// Divide two vectors.\n        /// </summary>\n        public static Vector2d operator /(Vector2d v1, Vector2d v2)\n        {\n            return new Vector2d(v1.x / v2.x, v1.y / v2.y);\n        }\n\n        /// <summary>\n        /// Divide a vector and a scalar.\n        /// </summary>\n        public static Vector2d operator /(Vector2d v, double s)\n        {\n            return new Vector2d(v.x / s, v.y / s);\n        }\n\n\t\t/// <summary>\n\t\t/// Are these vectors equal.\n\t\t/// </summary>\n\t\tpublic static bool operator ==(Vector2d v1, Vector2d v2)\n\t\t{\n\t\t\treturn (v1.x == v2.x && v1.y == v2.y);\n\t\t}\n\t\t\n\t\t/// <summary>\n\t\t/// Are these vectors not equal.\n\t\t/// </summary>\n\t\tpublic static bool operator !=(Vector2d v1, Vector2d v2)\n\t\t{\n\t\t\treturn (v1.x != v2.x || v1.y != v2.y);\n\t\t}\n\t\t\n\t\t/// <summary>\n\t\t/// Are these vectors equal.\n\t\t/// </summary>\n\t\tpublic override bool Equals (object obj)\n\t\t{\n\t\t\tif(!(obj is Vector2d)) return false;\n\t\t\t\n\t\t\tVector2d v = (Vector2d)obj;\n\t\t\t\n\t\t\treturn this == v;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Are these vectors equal given the error.\n\t\t/// </summary>\n\t\tpublic bool EqualsWithError(Vector2d v, double eps)\n\t\t{\n\t\t\tif(Math.Abs(x-v.x)> eps) return false;\n\t\t\tif(Math.Abs(y-v.y)> eps) return false;\n\t\t\treturn true;\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Are these vectors equal.\r\n        /// </summary>\r\n        public bool Equals(Vector2d v)\r\n        {\r\n            return this == v;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Vectors hash code. \r\n        /// </summary>\r\n        public override int GetHashCode()\r\n        {\r\n            double hashcode = 23;\r\n\r\n            hashcode = (hashcode * 37) + x;\r\n            hashcode = (hashcode * 37) + y;\r\n\r\n\t\t\treturn unchecked((int)hashcode);\r\n        }\n\t\t\n\t    /// <summary>\n\t    /// Vector as a string.\n\t    /// </summary>\n\t\tpublic override string ToString()\n\t   \t{\n\t\t\treturn x + \",\" + y;\n\t   \t}\r\n\r\n        /// <summary>\n        /// Vector from a string.\n        /// </summary>\n        static public Vector2d FromString(string s)\r\n        {\r\n            Vector2d v = new Vector2d();\r\n\r\n            try\r\n            {\r\n                string[] separators = new string[] { \",\" };\r\n                string[] result = s.Split(separators, StringSplitOptions.None);\r\n\r\n                v.x = double.Parse(result[0]);\r\n                v.y = double.Parse(result[1]);\r\n            }\r\n            catch { }\r\n\r\n            return v;\r\n        }\n\n\t\t/// <summary>\n\t\t/// The dot product of two vectors.\n\t\t/// </summary>\n\t\tpublic static double Dot(Vector2d v0, Vector2d v1)\n\t\t{\n\t\t\treturn (v0.x*v1.x + v0.y*v1.y);\n\t\t}\n\n        /// <summary>\n        /// Normalize the vector.\n        /// </summary>\n\t\tpublic void Normalize()\n\t\t{\n\t    \tdouble invLength = DMath.SafeInvSqrt(1.0, x*x + y*y);\n\t    \tx *= invLength;\n\t\t\ty *= invLength;\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Cross two vectors.\r\n        /// </summary>\r\n        public static double Cross(Vector2d v0, Vector2d v1)\r\n        {\r\n            return v0.x * v1.y - v0.y * v1.x;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Distance between two vectors.\r\n        /// </summary>\r\n        public static double Distance(Vector2d v0, Vector2d v1)\r\n        {\r\n            return DMath.SafeSqrt(SqrDistance(v0, v1));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Square distance between two vectors.\r\n        /// </summary>\r\n        public static double SqrDistance(Vector2d v0, Vector2d v1)\r\n        {\r\n            double x = v0.x - v1.x;\r\n            double y = v0.y - v1.y;\r\n            return x * x + y * y;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Angle between two vectors in degrees from 180 to -180.\r\n        /// </summary>\r\n        public static double Angle180(Vector2d a, Vector2d b)\r\n        {\r\n            double m = a.Magnitude * b.Magnitude;\r\n            if (m == 0.0) return 0;\r\n\r\n            double angle = Dot(a, b) / m;\r\n\r\n            return DMath.SafeAcos(angle) * DMath.Rad2Deg;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Angle between two vectors in degrees from 0 to 360;\r\n        /// </summary>\r\n        public static double AngleCCW(Vector2d a, Vector2d b)\r\n        {\r\n            double angle = Math.Atan2(a.y, a.x) - Math.Atan2(b.y, b.x);\r\n       \r\n            if (angle <= 0.0)\r\n                angle = Math.PI * 2.0 + angle;\r\n\r\n            return 360.0 - angle * DMath.Rad2Deg;\r\n        }\r\n\r\n        /// <summary>\n        /// The minimum value between s and each component in vector.\n        /// </summary>\n        public void Min(double s)\n\t\t{\n\t\t\tx = Math.Min(x, s);\n\t\t\ty = Math.Min(y, s);\n\t\t}\r\n\r\n        /// <summary>\r\n        /// The minimum value between each component in vectors.\r\n        /// </summary>\r\n        public void Min(Vector2d v)\r\n        {\r\n            x = Math.Min(x, v.x);\r\n            y = Math.Min(y, v.y);\r\n        }\n\t\t\n\t\t/// <summary>\n\t\t/// The maximum value between s and each component in vector.\n\t\t/// </summary>\n        public void Max(double s)\n\t\t{\n\t\t\tx = Math.Max(x, s);\n\t\t\ty = Math.Max(y, s);\n\t\t}\r\n\r\n        /// <summary>\r\n        /// The maximum value between each component in vectors.\r\n        /// </summary>\r\n        public void Max(Vector2d v)\r\n        {\r\n            x = Math.Max(x, v.x);\r\n            y = Math.Max(y, v.y);\r\n        }\r\n\r\n        /// <summary>\n        /// The absolute vector.\n        /// </summary>\n        public void Abs()\r\n        {\r\n            x = Math.Abs(x);\r\n            y = Math.Abs(y);\r\n        }\r\n\r\n        /// <summary>\n        /// Clamp the each component to specified min and max.\n        /// </summary>\n        public void Clamp(double min, double max)\n\t\t{\n\t\t\tx = Math.Max(Math.Min(x, max), min);\n\t\t\ty = Math.Max(Math.Min(y, max), min);\n\t\t}\r\n\r\n        /// <summary>\n        /// Clamp the each component to specified min and max.\n        /// </summary>\n        public void Clamp(Vector2d min, Vector2d max)\r\n        {\r\n            x = Math.Max(Math.Min(x, max.x), min.x);\r\n            y = Math.Max(Math.Min(y, max.y), min.y);\r\n        }\n\n        /// <summary>\n        /// Lerp between two vectors.\n        /// </summary>\n        public static Vector2d Lerp(Vector2d from, Vector2d to, double t)\n        {\r\n            if (t < 0.0) t = 0.0;\r\n            if (t > 1.0) t = 1.0;\r\n\r\n            if (t == 0.0) return from;\r\n            if (t == 1.0) return to;\n\n            double t1 = 1.0 - t;\r\n            Vector2d v = new Vector2d();\n            v.x = from.x * t1 + to.x * t;\n            v.y = from.y * t1 + to.y * t;\r\n            return v;\n        }\r\n\r\n        /// <summary>\n        /// Slerp between two vectors arc.\n        /// </summary>\r\n        public static Vector2d Slerp(Vector2d from, Vector2d to, double t)\r\n        {\r\n            if (t < 0.0) t = 0.0;\r\n            if (t > 1.0) t = 1.0;\r\n\r\n            if (t == 0.0) return from;\r\n            if (t == 1.0) return to;\r\n            if (to.x == from.x && to.y == from.y) return to;\r\n\r\n            double m = from.Magnitude * to.Magnitude;\r\n            if (DMath.IsZero(m)) return Vector2d.Zero;\r\n\r\n            double theta = Math.Acos(Dot(from, to) / m);\r\n\r\n            if (theta == 0.0) return to;\r\n\r\n            double sinTheta = Math.Sin(theta);\r\n            double st1 = Math.Sin((1.0 - t) * theta) / sinTheta;\r\n            double st = Math.Sin(t * theta) / sinTheta;\r\n\r\n            Vector2d v = new Vector2d();\n            v.x = from.x * st1 + to.x * st;\n            v.y = from.y * st1 + to.y * st;\r\n\r\n            return v;\r\n        }\r\n\r\n    }\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector2d.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c1b7dd742e9f9aa49957980a1f94d794\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector2f.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\n\nnamespace Common.Core.LinearAlgebra\n{\n    /// <summary>\n    /// A 2d single precision vector.\n    /// </summary>\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Vector2f\n    {\n        public float x, y;\r\n\r\n        /// <summary>\n        /// The unit x vector.\n        /// </summary>\n        public readonly static Vector2f UnitX = new Vector2f(1, 0);\n\n        /// <summary>\n        /// The unit y vector.\n        /// </summary>\n\t    public readonly static Vector2f UnitY = new Vector2f(0, 1);\n\n        /// <summary>\n        /// A vector of zeros.\n        /// </summary>\n\t    public readonly static Vector2f Zero = new Vector2f(0);\n\n        /// <summary>\n        /// A vector of ones.\n        /// </summary>\n\t    public readonly static Vector2f One = new Vector2f(1);\r\n\r\n        /// <summary>\r\n        /// A vector of positive infinity.\r\n        /// </summary>\r\n        public readonly static Vector2f PositiveInfinity = new Vector2f(float.PositiveInfinity);\r\n\r\n        /// <summary>\r\n        /// A vector of negative infinity.\r\n        /// </summary>\r\n        public readonly static Vector2f NegativeInfinity = new Vector2f(float.NegativeInfinity);\r\n\r\n        /// <summary>\r\n        /// Convert to a 3 dimension vector.\r\n        /// </summary>\r\n        public Vector3f x0z\r\n        {\r\n            get { return new Vector3f(x, 0, y); }\r\n        }\r\n\r\n        /// <summary>\n        /// A vector all with the value v.\n        /// </summary>\n        public Vector2f(float v)\n        {\n            this.x = v;\n            this.y = v;\n        }\n\n        /// <summary>\n        /// A vector from the varibles.\n        /// </summary>\n        public Vector2f(float x, float y)\n        {\n            this.x = x;\n            this.y = y;\n        }\r\n\r\n        public float this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return x;\r\n                    case 1: return y;\r\n                    default: throw new IndexOutOfRangeException(\"Vector2f index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: x = value; break;\r\n                    case 1: y = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Vector2f index out of range: \" + i);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\n        /// The length of the vector.\n        /// </summary>\n        public float Magnitude\r\n        {\r\n            get\r\n            {\r\n                return FMath.SafeSqrt(SqrMagnitude);\r\n            }\r\n        }\n\n        /// <summary>\n        /// The length of the vector squared.\n        /// </summary>\n\t\tpublic float SqrMagnitude\r\n        {\r\n            get\r\n            {\r\n                return (x * x + y * y);\r\n            }\r\n        }\r\n\r\n        /// <summary>\n        /// The vector normalized.\n        /// </summary>\n        public Vector2f Normalized\r\n        {\r\n            get\r\n            {\r\n                float invLength = FMath.SafeInvSqrt(1.0f, x * x + y * y);\r\n                return new Vector2f(x * invLength, y * invLength);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Counter clock-wise perpendicular.\r\n        /// </summary>\r\n        public Vector2f PerpendicularCCW\r\n        {\r\n            get\r\n            {\r\n                return new Vector2f(-y, x);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Clock-wise perpendicular.\r\n        /// </summary>\r\n        public Vector2f PerpendicularCW\r\n        {\r\n            get\r\n            {\r\n                return new Vector2f(y, -x);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The vectors absolute values.\r\n        /// </summary>\n        public Vector2f Absolute\r\n        {\r\n            get\r\n            {\r\n                return new Vector2f(Math.Abs(x), Math.Abs(y));\r\n            }\r\n        }\r\n\r\n        /// <summary>\n        /// Add two vectors.\n        /// </summary>\n        public static Vector2f operator +(Vector2f v1, Vector2f v2)\n        {\n            return new Vector2f(v1.x + v2.x, v1.y + v2.y);\n        }\n\n        /// <summary>\n        /// Add vector and scalar.\n        /// </summary>\n        public static Vector2f operator +(Vector2f v1, float s)\n        {\n            return new Vector2f(v1.x + s, v1.y + s);\n        }\r\n\r\n        /// <summary>\n        /// Add vector and scalar.\n        /// </summary>\n        public static Vector2f operator +(float s, Vector2f v1)\n        {\n            return new Vector2f(v1.x + s, v1.y + s);\n        }\n\n        /// <summary>\n        /// Subtract two vectors.\n        /// </summary>\n        public static Vector2f operator -(Vector2f v1, Vector2f v2)\n        {\n            return new Vector2f(v1.x - v2.x, v1.y - v2.y);\n        }\n\n        /// <summary>\n        /// Subtract vector and scalar.\n        /// </summary>\n        public static Vector2f operator -(Vector2f v1, float s)\n        {\n            return new Vector2f(v1.x - s, v1.y - s);\n        }\r\n\r\n        /// <summary>\n        /// Subtract vector and scalar.\n        /// </summary>\n        public static Vector2f operator -(float s, Vector2f v1)\n        {\n            return new Vector2f(v1.x - s, v1.y - s);\n        }\n\n        /// <summary>\n        /// Multiply two vectors.\n        /// </summary>\n        public static Vector2f operator *(Vector2f v1, Vector2f v2)\n        {\n            return new Vector2f(v1.x * v2.x, v1.y * v2.y);\n        }\n\n        /// <summary>\n        /// Multiply a vector and a scalar.\n        /// </summary>\n        public static Vector2f operator *(Vector2f v, float s)\n        {\n            return new Vector2f(v.x * s, v.y * s);\n        }\n\n        /// <summary>\n        /// Multiply a vector and a scalar.\n        /// </summary>\n        public static Vector2f operator *(float s, Vector2f v)\n        {\n            return new Vector2f(v.x * s, v.y * s);\n        }\n\n        /// <summary>\n        /// Divide two vectors.\n        /// </summary>\n        public static Vector2f operator /(Vector2f v1, Vector2f v2)\n        {\n            return new Vector2f(v1.x / v2.x, v1.y / v2.y);\n        }\n\n        /// <summary>\n        /// Divide a vector and a scalar.\n        /// </summary>\n        public static Vector2f operator /(Vector2f v, float s)\n        {\n            return new Vector2f(v.x / s, v.y / s);\n        }\n\n\t\t/// <summary>\n\t\t/// Are these vectors equal.\n\t\t/// </summary>\n\t\tpublic static bool operator ==(Vector2f v1, Vector2f v2)\n\t\t{\n\t\t\treturn (v1.x == v2.x && v1.y == v2.y);\n\t\t}\n\t\t\n\t\t/// <summary>\n\t\t/// Are these vectors not equal.\n\t\t/// </summary>\n\t\tpublic static bool operator !=(Vector2f v1, Vector2f v2)\n\t\t{\n\t\t\treturn (v1.x != v2.x || v1.y != v2.y);\n\t\t}\n\t\t\n\t\t/// <summary>\n\t\t/// Are these vectors equal.\n\t\t/// </summary>\n\t\tpublic override bool Equals (object obj)\n\t\t{\n\t\t\tif(!(obj is Vector2f)) return false;\n\t\t\t\n\t\t\tVector2f v = (Vector2f)obj;\n\t\t\t\n\t\t\treturn this == v;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Are these vectors equal given the error.\n\t\t/// </summary>\n\t\tpublic bool EqualsWithError(Vector2f v, float eps)\n\t\t{\n\t\t\tif(Math.Abs(x-v.x)> eps) return false;\n\t\t\tif(Math.Abs(y-v.y)> eps) return false;\n\t\t\treturn true;\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Are these vectors equal.\r\n        /// </summary>\r\n        public bool Equals(Vector2f v)\r\n        {\r\n            return this == v;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Vectors hash code. \r\n        /// </summary>\r\n        public override int GetHashCode()\r\n        {\r\n            float hashcode = 23;\r\n\r\n            hashcode = (hashcode * 37) + x;\r\n            hashcode = (hashcode * 37) + y;\r\n\r\n\t\t\treturn unchecked((int)hashcode);\r\n        }\n\n        /// <summary>\n        /// Vector as a string.\n        /// </summary>\n        public override string ToString()\n        {\n            return x + \",\" + y;\n        }\n\n\t\t/// <summary>\n\t\t/// Vector from a string.\n\t\t/// </summary>\n\t\tstatic public Vector2f FromString(string s)\n\t\t{\r\n            Vector2f v = new Vector2f();\r\n\r\n            try\r\n            {\r\n                string[] separators = new string[] { \",\" };\r\n                string[] result = s.Split(separators, StringSplitOptions.None);\r\n\r\n                v.x = float.Parse(result[0]);\r\n                v.y = float.Parse(result[1]);\r\n            }\r\n            catch { }\n\t\t\t\n\t\t\treturn v;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The dot product of two vectors.\n\t\t/// </summary>\n\t\tpublic static float Dot(Vector2f v0, Vector2f v1)\n\t\t{\n\t\t\treturn v0.x * v1.x + v0.y * v1.y;\n\t\t}\n\n        /// <summary>\n        /// Normalize the vector.\n        /// </summary>\n        public void Normalize()\n        {\r\n            float invLength = FMath.SafeInvSqrt(1.0f, x * x + y * y);\n            x *= invLength;\n            y *= invLength;\n        }\r\n\r\n        /// <summary>\r\n        /// Cross two vectors.\r\n        /// </summary>\r\n        public static float Cross(Vector2f v0, Vector2f v1)\r\n        {\r\n            return v0.x * v1.y - v0.y * v1.x;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Distance between two vectors.\r\n        /// </summary>\r\n        public static float Distance(Vector2f v0, Vector2f v1)\r\n        {\r\n            return FMath.SafeSqrt(SqrDistance(v0, v1));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Square distance between two vectors.\r\n        /// </summary>\r\n        public static float SqrDistance(Vector2f v0, Vector2f v1)\r\n        {\r\n            float x = v0.x - v1.x;\r\n            float y = v0.y - v1.y;\r\n            return x * x + y * y;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Angle between two vectors in degrees from 180 to -180.\r\n        /// </summary>\r\n        public static float Angle180(Vector2f a, Vector2f b)\r\n        {\r\n            float m = a.Magnitude * b.Magnitude;\r\n            if (m == 0.0f) return 0;\r\n\r\n            float angle = Dot(a, b) / m;\r\n\r\n            if (angle < -1.0f) angle = -1.0f;\r\n            if (angle > 1.0f) angle = 1.0f;\r\n\r\n            return FMath.SafeAcos(angle) * FMath.Rad2Deg;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Angle between two vectors in degrees from 0 to 360;\r\n        /// </summary>\r\n        public static float Angle360(Vector2f a, Vector2f b)\r\n        {\r\n            float angle = (float)(Math.Atan2(a.y, a.x) - Math.Atan2(b.y, b.x));\r\n            float PI = (float)Math.PI;\r\n\r\n            if (angle <= 0.0f)\r\n                angle = PI * 2.0f + angle;\r\n\r\n            return 360 - angle * FMath.Rad2Deg;\r\n        }\r\n\r\n        /// <summary>\r\n        /// The minimum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Min(float s)\r\n        {\r\n            x = Math.Min(x, s);\r\n            y = Math.Min(y, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The minimum value between each component in vectors.\r\n        /// </summary>\r\n        public void Min(Vector2f v)\r\n        {\r\n            x = Math.Min(x, v.x);\r\n            y = Math.Min(y, v.y);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Max(float s)\r\n        {\r\n            x = Math.Max(x, s);\r\n            y = Math.Max(y, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between each component in vectors.\r\n        /// </summary>\r\n        public void Max(Vector2f v)\r\n        {\r\n            x = Math.Max(x, v.x);\r\n            y = Math.Max(y, v.y);\r\n        }\r\n\r\n        /// <summary>\n        /// The absolute vector.\n        /// </summary>\n        public void Abs()\r\n        {\r\n            x = Math.Abs(x);\r\n            y = Math.Abs(y);\r\n        }\r\n\r\n        /// <summary>\n        /// Clamp the each component to specified min and max.\n        /// </summary>\n        public void Clamp(float min, float max)\n\t\t{\n\t\t\tx = Math.Max(Math.Min(x, max), min);\n\t\t\ty = Math.Max(Math.Min(y, max), min);\n\t\t}\r\n\r\n        /// <summary>\n        /// Clamp the each component to specified min and max.\n        /// </summary>\n        public void Clamp(Vector2f min, Vector2f max)\r\n        {\r\n            x = Math.Max(Math.Min(x, max.x), min.x);\r\n            y = Math.Max(Math.Min(y, max.y), min.y);\r\n        }\n\n        /// <summary>\n        /// Lerp between two vectors.\n        /// </summary>\n        public static Vector2f Lerp(Vector2f from, Vector2f to, float t)\n        {\r\n            if (t < 0.0f) t = 0.0f;\r\n            if (t > 1.0f) t = 1.0f;\r\n\r\n            if (t == 0.0f) return from;\r\n            if (t == 1.0f) return to;\n\n            float t1 = 1.0f - t;\n\t\t\tVector2f v = new Vector2f();\n            v.x = from.x * t1 + to.x * t;\n            v.y = from.y * t1 + to.y * t;\n\t\t\treturn v;\n        }\r\n\r\n        /// <summary>\n        /// Slerp between two vectors arc.\n        /// </summary>\r\n        public static Vector2f Slerp(Vector2f from, Vector2f to, float t)\r\n        {\r\n            if (t < 0.0f) t = 0.0f;\r\n            if (t > 1.0f) t = 1.0f;\r\n\r\n            if (t == 0.0f) return from;\r\n            if (t == 1.0f) return to;\r\n            if (to.x == from.x && to.y == from.y) return to;\r\n\r\n            float m = from.Magnitude * to.Magnitude;\r\n            if (FMath.IsZero(m)) return Vector2f.Zero;\r\n\r\n            double theta = Math.Acos(Dot(from, to) / m);\r\n\r\n            if (theta == 0.0) return to;\r\n\r\n            double sinTheta = Math.Sin(theta);\r\n            float st1 = (float)(Math.Sin((1.0 - t) * theta) / sinTheta);\r\n            float st = (float)(Math.Sin(t * theta) / sinTheta);\r\n\r\n            Vector2f v = new Vector2f();\n            v.x = from.x * st1 + to.x * st;\n            v.y = from.y * st1 + to.y * st;\r\n\r\n            return v;\r\n        }\n\n    }\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector2f.cs.meta",
    "content": "fileFormatVersion: 2\nguid: f2c52c29076b7bb40a45c08b61f46fd4\ntimeCreated: 1514536271\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector2i.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\r\n\r\nnamespace Common.Core.LinearAlgebra\r\n{\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Vector2i\r\n\t{\r\n\t\tpublic int x, y;\r\n\r\n        /// <summary>\n        /// The unit x vector.\n        /// </summary>\n        public readonly static Vector2i UnitX = new Vector2i(1, 0);\n\n        /// <summary>\n        /// The unit y vector.\n        /// </summary>\n\t    public readonly static Vector2i UnitY = new Vector2i(0, 1);\n\n        /// <summary>\n        /// A vector of zeros.\n        /// </summary>\n\t    public readonly static Vector2i Zero = new Vector2i(0);\n\n        /// <summary>\n        /// A vector of ones.\n        /// </summary>\n\t    public readonly static Vector2i One = new Vector2i(1);\r\n\r\n        /// <summary>\r\n        /// A vector of min int.\r\n        /// </summary>\r\n        public readonly static Vector2i MinInt = new Vector2i(int.MinValue);\r\n\r\n        /// <summary>\r\n        /// A vector of max int.\r\n        /// </summary>\r\n        public readonly static Vector2i MaxInt = new Vector2i(int.MaxValue);\r\n\r\n        /// <summary>\r\n        /// Convert to a 3 dimension vector.\r\n        /// </summary>\r\n        public Vector3i x0z\r\n        {\r\n            get { return new Vector3i(x, 0, y); }\r\n        }\r\n\r\n        public Vector2i(int v)\r\n        {\r\n            this.x = v;\r\n            this.y = v;\r\n        }\r\n\r\n        public Vector2i(int x, int y)\r\n\t\t{\r\n\t\t\tthis.x = x;\r\n\t\t\tthis.y = y;\r\n\t\t}\r\n\r\n        public int this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return x;\r\n                    case 1: return y;\r\n                    default: throw new IndexOutOfRangeException(\"Vector2i index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: x = value; break;\r\n                    case 1: y = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Vector2i index out of range: \" + i);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The length of the vector.\r\n        /// </summary>\r\n        public double Magnitude\r\n        {\r\n            get\r\n            {\r\n                return DMath.SafeSqrt(SqrMagnitude);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The length of the vector squared.\r\n        /// </summary>\r\n        public double SqrMagnitude\r\n        {\r\n            get\r\n            {\r\n                return (x * x + y * y);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The vectors absolute values.\r\n        /// </summary>\n        public Vector2i Absolute\r\n        {\r\n            get\r\n            {\r\n                return new Vector2i(Math.Abs(x), Math.Abs(y));\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Add two vectors.\r\n        /// </summary>\r\n        public static Vector2i operator +(Vector2i v1, Vector2i v2)\r\n        {\r\n            return new Vector2i(v1.x + v2.x, v1.y + v2.y);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Add vector and scalar.\r\n        /// </summary>\r\n        public static Vector2i operator +(Vector2i v1, int s)\r\n        {\r\n            return new Vector2i(v1.x + s, v1.y + s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Add vector and scalar.\r\n        /// </summary>\r\n        public static Vector2i operator +(int s, Vector2i v1)\r\n        {\r\n            return new Vector2i(v1.x + s, v1.y + s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Subtract two vectors.\r\n        /// </summary>\r\n        public static Vector2i operator -(Vector2i v1, Vector2i v2)\r\n        {\r\n            return new Vector2i(v1.x - v2.x, v1.y - v2.y);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Subtract vector and scalar.\r\n        /// </summary>\r\n        public static Vector2i operator -(Vector2i v1, int s)\r\n        {\r\n            return new Vector2i(v1.x - s, v1.y - s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Subtract vector and scalar.\r\n        /// </summary>\r\n        public static Vector2i operator -(int s, Vector2i v1)\r\n        {\r\n            return new Vector2i(v1.x - s, v1.y - s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply two vectors.\r\n        /// </summary>\r\n        public static Vector2i operator *(Vector2i v1, Vector2i v2)\r\n        {\r\n            return new Vector2i(v1.x * v2.x, v1.y * v2.y);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply a vector and a scalar.\r\n        /// </summary>\r\n        public static Vector2i operator *(Vector2i v, int s)\r\n        {\r\n            return new Vector2i(v.x * s, v.y * s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply a vector and a scalar.\r\n        /// </summary>\r\n        public static Vector2i operator *(int s, Vector2i v)\r\n        {\r\n            return new Vector2i(v.x * s, v.y * s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Divide two vectors.\r\n        /// </summary>\r\n        public static Vector2i operator /(Vector2i v1, Vector2i v2)\r\n        {\r\n            return new Vector2i(v1.x / v2.x, v1.y / v2.y);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Divide a vector and a scalar.\r\n        /// </summary>\r\n        public static Vector2i operator /(Vector2i v, int s)\r\n        {\r\n            return new Vector2i(v.x / s, v.y / s);\r\n        }\r\n\r\n\t\t/// <summary>\r\n\t\t/// Are these vectors equal.\r\n\t\t/// </summary>\r\n\t\tpublic static bool operator ==(Vector2i v1, Vector2i v2)\r\n\t\t{\r\n\t\t\treturn (v1.x == v2.x && v1.y == v2.y);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Are these vectors not equal.\r\n\t\t/// </summary>\r\n\t\tpublic static bool operator !=(Vector2i v1, Vector2i v2)\r\n\t\t{\r\n\t\t\treturn (v1.x != v2.x || v1.y != v2.y);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Are these vectors equal.\r\n\t\t/// </summary>\r\n\t\tpublic override bool Equals (object obj)\r\n\t\t{\r\n\t\t\tif(!(obj is Vector2i)) return false;\r\n\t\t\t\r\n\t\t\tVector2i v = (Vector2i)obj;\r\n\t\t\t\r\n\t\t\treturn this == v;\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Are these vectors equal.\r\n        /// </summary>\r\n        public bool Equals(Vector2i v)\r\n        {\r\n            return this == v;\r\n        }\r\n\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Vectors hash code. \r\n\t\t/// </summary>\r\n\t\tpublic override int GetHashCode()\r\n\t\t{\r\n\t\t\tint hashcode = 23;\r\n\r\n            unchecked\r\n            {\r\n                hashcode = (hashcode * 37) + x;\r\n                hashcode = (hashcode * 37) + y;\r\n            }\r\n\t\t\t\r\n\t\t\treturn hashcode;\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Vector as a string.\r\n\t\t/// </summary>\r\n\t\tpublic override string ToString()\r\n\t\t{\r\n\t\t\treturn x + \",\" + y;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Vector from a string.\r\n\t\t/// </summary>\r\n\t\tstatic public Vector2i FromString(string s)\r\n\t\t{\r\n\r\n            Vector2i v = new Vector2i();\r\n\r\n            try\r\n            {\r\n                string[] separators = new string[] { \",\" };\r\n                string[] result = s.Split(separators, StringSplitOptions.None);\r\n\r\n                v.x = int.Parse(result[0]);\r\n                v.y = int.Parse(result[1]);\r\n            }\r\n            catch { }\r\n\r\n\t\t\treturn v;\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// The dot product of two vectors.\r\n        /// </summary>\r\n        public static int Dot(Vector2i v0, Vector2i v1)\r\n        {\r\n            return (v0.x * v1.x + v0.y * v1.y);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Cross two vectors.\r\n        /// </summary>\r\n        public static int Cross(Vector2i v0, Vector2i v1)\r\n        {\r\n            return v0.x * v1.y - v0.y * v1.x;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Distance between two vectors.\r\n        /// </summary>\r\n        public static double Distance(Vector2i v0, Vector2i v1)\r\n        {\r\n            return DMath.SafeSqrt(SqrDistance(v0, v1));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Square distance between two vectors.\r\n        /// </summary>\r\n        public static double SqrDistance(Vector2i v0, Vector2i v1)\r\n        {\r\n            double x = v0.x - v1.x;\r\n            double y = v0.y - v1.y;\r\n            return x * x + y * y;\r\n        }\r\n\r\n        /// <summary>\r\n        /// The minimum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Min(int s)\r\n        {\r\n            x = Math.Min(x, s);\r\n            y = Math.Min(y, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The minimum value between each component in vectors.\r\n        /// </summary>\r\n        public void Min(Vector2i v)\r\n        {\r\n            x = Math.Min(x, v.x);\r\n            y = Math.Min(y, v.y);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Max(int s)\r\n        {\r\n            x = Math.Max(x, s);\r\n            y = Math.Max(y, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between each component in vectors.\r\n        /// </summary>\r\n        public void Max(Vector2i v)\r\n        {\r\n            x = Math.Max(x, v.x);\r\n            y = Math.Max(y, v.y);\r\n        }\r\n        /// <summary>\r\n        /// The absolute vector.\r\n        /// </summary>\r\n        public void Abs()\r\n        {\r\n            x = Math.Abs(x);\r\n            y = Math.Abs(y);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Clamp the each component to specified min and max.\r\n        /// </summary>\r\n        public void Clamp(int min, int max)\r\n        {\r\n            x = Math.Max(Math.Min(x, max), min);\r\n            y = Math.Max(Math.Min(y, max), min);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Clamp the each component to specified min and max.\r\n        /// </summary>\r\n        public void Clamp(Vector2i min, Vector2i max)\r\n        {\r\n            x = Math.Max(Math.Min(x, max.x), min.x);\r\n            y = Math.Max(Math.Min(y, max.y), min.y);\r\n        }\r\n\r\n    }\r\n\t\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector2i.cs.meta",
    "content": "fileFormatVersion: 2\nguid: fcce9ee7e2939b748bb7812d444e1375\ntimeCreated: 1514536271\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector3d.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\n\nnamespace Common.Core.LinearAlgebra\n{\n\n    /// <summary>\n    /// A 3d double precision vector.\n    /// </summary>\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Vector3d\n\t{\n\t\tpublic double x, y, z;\r\n\r\n        /// <summary>\n        /// The unit x vector.\n        /// </summary>\n        public readonly static Vector3d UnitX = new Vector3d(1, 0, 0);\n\n        /// <summary>\n        /// The unit y vector.\n        /// </summary>\n\t    public readonly static Vector3d UnitY = new Vector3d(0, 1, 0);\n\n        /// <summary>\n        /// The unit z vector.\n        /// </summary>\n\t    public readonly static Vector3d UnitZ = new Vector3d(0, 0, 1);\n\n        /// <summary>\n        /// A vector of zeros.\n        /// </summary>\n\t    public readonly static Vector3d Zero = new Vector3d(0);\r\n\r\n        /// <summary>\n        /// A vector of ones.\n        /// </summary>\n        public readonly static Vector3d One = new Vector3d(1);\r\n\r\n        /// <summary>\r\n        /// A vector of positive infinity.\r\n        /// </summary>\r\n        public readonly static Vector3d PositiveInfinity = new Vector3d(double.PositiveInfinity);\r\n\r\n        /// <summary>\r\n        /// A vector of negative infinity.\r\n        /// </summary>\r\n        public readonly static Vector3d NegativeInfinity = new Vector3d(double.NegativeInfinity);\n\n        /// <summary>\n        /// Convert to a 2 dimension vector.\n        /// </summary>\n\t    public Vector2d xy\n\t    {\n\t        get { return new Vector2d(x, y); }\n\t    }\r\n\r\n        /// <summary>\n        /// Convert to a 2 dimension vector.\n        /// </summary>\n        public Vector2d xz\r\n        {\r\n            get { return new Vector2d(x, z); }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert to a 4 dimension vector.\r\n        /// </summary>\r\n        public Vector4d xyz0\r\n        {\r\n            get { return new Vector4d(x, y, z, 0); }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert to a 4 dimension vector.\r\n        /// </summary>\r\n        public Vector4d xyz1\r\n        {\r\n            get { return new Vector4d(x, y, z, 1); }\r\n        }\n\n        /// <summary>\n        /// A vector all with the value v.\n        /// </summary>\n\t\tpublic Vector3d(double v) \n\t\t{\n\t\t\tthis.x = v; \n\t\t\tthis.y = v; \n\t\t\tthis.z = v;\n\t\t}\n\n        /// <summary>\n        /// A vector from the varibles.\n        /// </summary>\n\t\tpublic Vector3d(double x, double y, double z) \n\t\t{\n\t\t\tthis.x = x; \n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t}\n\n        /// <summary>\n        /// A vector from a 2d vector and the z varible.\n        /// </summary>\n\t\tpublic Vector3d(Vector2d v, double z) \n\t\t{ \n\t\t\tx = v.x; \n\t\t\ty = v.y; \n\t\t\tthis.z = z;\n\t\t}\r\n\r\n        public double this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return x;\r\n                    case 1: return y;\r\n                    case 2: return z;\r\n                    default: throw new IndexOutOfRangeException(\"Vector3d index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: x = value; break;\r\n                    case 1: y = value; break;\r\n                    case 2: z = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Vector3d index out of range: \" + i);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\n        /// The length of the vector.\n        /// </summary>\n        public double Magnitude\r\n        {\r\n            get\r\n            {\r\n                return DMath.SafeSqrt(SqrMagnitude);\r\n            }\r\n        }\n\n        /// <summary>\n        /// The length of the vector squared.\n        /// </summary>\n\t\tpublic double SqrMagnitude\r\n        {\r\n            get\r\n            {\r\n                return (x * x + y * y + z * z);\r\n            }\r\n        }\r\n\r\n        /// <summary>\n        /// The vector normalized.\n        /// </summary>\n        public Vector3d Normalized\r\n        {\r\n            get\r\n            {\r\n                double invLength = DMath.SafeInvSqrt(1.0, x * x + y * y + z * z);\r\n                return new Vector3d(x * invLength, y * invLength, z * invLength);\r\n            }\r\n        }\n\n        /// <summary>\r\n        /// The vectors absolute values.\r\n        /// </summary>\n        public Vector3d Absolute\r\n        {\r\n            get\r\n            {\r\n                return new Vector3d(Math.Abs(x), Math.Abs(y), Math.Abs(z));\r\n            }\r\n        }\n\n        /// <summary>\n        /// Add two vectors.\n        /// </summary>\n        public static Vector3d operator +(Vector3d v1, Vector3d v2)\n        {\n            return new Vector3d(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);\n        }\n\n        /// <summary>\n        /// Add vector and scalar.\n        /// </summary>\n        public static Vector3d operator +(Vector3d v1, double s)\n        {\n            return new Vector3d(v1.x + s, v1.y + s, v1.z + s);\n        }\r\n\r\n        /// <summary>\n        /// Add vector and scalar.\n        /// </summary>\n        public static Vector3d operator +(double s, Vector3d v1)\n        {\n            return new Vector3d(v1.x + s, v1.y + s, v1.z + s);\n        }\n\n        /// <summary>\n        /// Subtract two vectors.\n        /// </summary>\n        public static Vector3d operator -(Vector3d v1, Vector3d v2)\n        {\n            return new Vector3d(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);\n        }\n\n        /// <summary>\n        /// Subtract vector and scalar.\n        /// </summary>\n        public static Vector3d operator -(Vector3d v1, double s)\n        {\n            return new Vector3d(v1.x - s, v1.y - s, v1.z - s);\n        }\r\n\r\n        /// <summary>\n        /// Subtract vector and scalar.\n        /// </summary>\n        public static Vector3d operator -(double s, Vector3d v1)\n        {\n            return new Vector3d(v1.x - s, v1.y - s, v1.z - s);\n        }\n\n        /// <summary>\n        /// Multiply two vectors.\n        /// </summary>\n        public static Vector3d operator *(Vector3d v1, Vector3d v2)\n        {\n            return new Vector3d(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z);\n        }\n\n        /// <summary>\n        /// Multiply a vector and a scalar.\n        /// </summary>\n        public static Vector3d operator *(Vector3d v, double s)\n        {\n            return new Vector3d(v.x * s, v.y * s, v.z * s);\n        }\n\n        /// <summary>\n        /// Multiply a vector and a scalar.\n        /// </summary>\n        public static Vector3d operator *(double s, Vector3d v)\n        {\n            return new Vector3d(v.x * s, v.y * s, v.z * s);\n        }\n\n        /// <summary>\n        /// Divide two vectors.\n        /// </summary>\n        public static Vector3d operator /(Vector3d v1, Vector3d v2)\n        {\n            return new Vector3d(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z);\n        }\n\n        /// <summary>\n        /// Divide a vector and a scalar.\n        /// </summary>\n        public static Vector3d operator /(Vector3d v, double s)\n        {\n            return new Vector3d(v.x / s, v.y / s, v.z / s);\n        }\n\n\t\t/// <summary>\n\t\t/// Are these vectors equal.\n\t\t/// </summary>\n\t\tpublic static bool operator ==(Vector3d v1, Vector3d v2)\n\t\t{\n\t\t\treturn (v1.x == v2.x && v1.y == v2.y && v1.z == v2.z);\n\t\t}\n\t\t\n\t\t/// <summary>\n\t\t/// Are these vectors not equal.\n\t\t/// </summary>\n\t\tpublic static bool operator !=(Vector3d v1, Vector3d v2)\n\t\t{\n\t\t\treturn (v1.x != v2.x || v1.y != v2.y || v1.z != v2.z);\n\t\t}\n\t\t\n\t\t/// <summary>\n\t\t/// Are these vectors equal.\n\t\t/// </summary>\n\t\tpublic override bool Equals (object obj)\n\t\t{\n\t\t\tif(!(obj is Vector3d)) return false;\n\t\t\t\n\t\t\tVector3d v = (Vector3d)obj;\n\t\t\t\n\t\t\treturn this == v;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Are these vectors equal given the error.\n\t\t/// </summary>\n\t\tpublic bool EqualsWithError(Vector3d v, double eps)\n\t\t{\n\t\t\tif(Math.Abs(x-v.x)> eps) return false;\n\t\t\tif(Math.Abs(y-v.y)> eps) return false;\n\t\t\tif(Math.Abs(z-v.z)> eps) return false;\n\t\t\treturn true;\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Are these vectors equal.\r\n        /// </summary>\r\n        public bool Equals(Vector3d v)\r\n        {\r\n            return this == v;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Vectors hash code. \r\n        /// </summary>\r\n        public override int GetHashCode()\r\n        {\r\n            double hashcode = 23;\r\n            hashcode = (hashcode * 37) + x;\r\n            hashcode = (hashcode * 37) + y;\r\n            hashcode = (hashcode * 37) + z;\r\n\r\n\t\t\treturn unchecked((int)hashcode);\r\n        }\n\n        /// <summary>\n        /// Vector as a string.\n        /// </summary>\n\t\tpublic override string ToString()\n\t   \t{\n\t\t\treturn x + \",\" + y + \",\" + z;\n\t   \t}\n\n\t\t/// <summary>\n\t\t/// Vector from a string.\n\t\t/// </summary>\n\t\tstatic public Vector3d FromString(string s)\n\t\t{\r\n            Vector3d v = new Vector3d();\r\n\r\n            try\r\n            {\r\n                string[] separators = new string[] { \",\" };\r\n                string[] result = s.Split(separators, StringSplitOptions.None);\r\n\r\n                v.x = double.Parse(result[0]);\r\n                v.y = double.Parse(result[1]);\r\n                v.z = double.Parse(result[2]);\r\n            }\r\n            catch { }\n\t\t\t\n\t\t\treturn v;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The dot product of two vectors.\n\t\t/// </summary>\n\t\tpublic static double Dot(Vector3d v0, Vector3d v1)\n\t\t{\n\t\t\treturn (v0.x*v1.x + v0.y*v1.y + v0.z*v1.z);\n\t\t}\n\n        /// <summary>\n        /// Normalize the vector.\n        /// </summary>\n\t\tpublic void Normalize()\n\t\t{\r\n            double invLength = DMath.SafeInvSqrt(1.0, x * x + y * y + z * z);\n\t    \tx *= invLength;\n\t\t\ty *= invLength;\n\t\t\tz *= invLength;\n\t\t}\n\n        /// <summary>\n        /// Cross two vectors.\n        /// </summary>\n\t\tpublic Vector3d Cross(Vector3d v)\n\t\t{\n\t\t\treturn new Vector3d(y*v.z - z*v.y, z*v.x - x*v.z, x*v.y - y*v.x);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Cross two vectors.\n\t\t/// </summary>\n\t\tpublic static Vector3d Cross(Vector3d v0, Vector3d v1)\n\t\t{\n\t\t\treturn new Vector3d(v0.y*v1.z - v0.z*v1.y, v0.z*v1.x - v0.x*v1.z, v0.x*v1.y - v0.y*v1.x);\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Distance between two vectors.\r\n        /// </summary>\r\n        public static double Distance(Vector3d v0, Vector3d v1)\r\n        {\r\n            return DMath.SafeSqrt(SqrDistance(v0, v1));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Square distance between two vectors.\r\n        /// </summary>\r\n        public static double SqrDistance(Vector3d v0, Vector3d v1)\r\n        {\r\n            double x = v0.x - v1.x;\r\n            double y = v0.y - v1.y;\r\n            double z = v0.z - v1.z;\r\n            return x * x + y * y + z * z;\r\n        }\r\n\r\n        /// <summary>\r\n        /// The minimum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Min(double s)\r\n        {\r\n            x = Math.Min(x, s);\r\n            y = Math.Min(y, s);\r\n            z = Math.Min(z, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The minimum value between each component in vectors.\r\n        /// </summary>\r\n        public void Min(Vector3d v)\r\n        {\r\n            x = Math.Min(x, v.x);\r\n            y = Math.Min(y, v.y);\r\n            z = Math.Min(z, v.z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Max(double s)\r\n        {\r\n            x = Math.Max(x, s);\r\n            y = Math.Max(y, s);\r\n            z = Math.Max(z, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between each component in vectors.\r\n        /// </summary>\r\n        public void Max(Vector3d v)\r\n        {\r\n            x = Math.Max(x, v.x);\r\n            y = Math.Max(y, v.y);\r\n            z = Math.Max(z, v.z);\r\n        }\r\n\r\n        /// <summary>\n        /// The absolute vector.\n        /// </summary>\n        public void Abs()\r\n        {\r\n            x = Math.Abs(x);\r\n            y = Math.Abs(y);\r\n            z = Math.Abs(z);\r\n        }\r\n\r\n        /// <summary>\n        /// Clamp the each component to specified min and max.\n        /// </summary>\n        public void Clamp(double min, double max)\n\t\t{\n\t\t\tx = Math.Max(Math.Min(x, max), min);\n\t\t\ty = Math.Max(Math.Min(y, max), min);\n\t\t\tz = Math.Max(Math.Min(z, max), min);\n\t\t}\r\n\r\n        /// <summary>\n        /// Clamp the each component to specified min and max.\n        /// </summary>\n        public void Clamp(Vector3d min, Vector3d max)\r\n        {\r\n            x = Math.Max(Math.Min(x, max.x), min.x);\r\n            y = Math.Max(Math.Min(y, max.y), min.y);\r\n            z = Math.Max(Math.Min(z, max.z), min.z);\r\n        }\r\n\r\n        /// <summary>\n        /// Lerp between two vectors.\n        /// </summary>\n        public static Vector3d Lerp(Vector3d from, Vector3d to, double t)\n        {\r\n            if (t < 0.0) t = 0.0;\r\n            if (t > 1.0) t = 1.0;\r\n\r\n            if (t == 0.0) return from;\r\n            if (t == 1.0) return to;\n\n            double t1 = 1.0 - t;\r\n            Vector3d v = new Vector3d();\n            v.x = from.x * t1 + to.x * t;\n            v.y = from.y * t1 + to.y * t;\r\n            v.z = from.z * t1 + to.z * t;\r\n            return v;\n        }\r\n\r\n        /// <summary>\n        /// Slerp between two vectors arc.\n        /// </summary>\r\n        public static Vector3d Slerp(Vector3d from, Vector3d to, double t)\r\n        {\r\n            if (t < 0.0f) t = 0.0f;\r\n            if (t > 1.0f) t = 1.0f;\r\n\r\n            if (t == 0.0f) return from;\r\n            if (t == 1.0f) return to;\r\n            if (to.x == from.x && to.y == from.y && to.z == from.z) return to;\r\n\r\n            double m = from.Magnitude * to.Magnitude;\r\n            if (DMath.IsZero(m)) return Vector3d.Zero;\r\n\r\n            double theta = Math.Acos(Dot(from, to) / m);\r\n\r\n            if (theta == 0.0) return to;\r\n\r\n            double sinTheta = Math.Sin(theta);\r\n            double st1 = Math.Sin((1.0 - t) * theta) / sinTheta;\r\n            double st = Math.Sin(t * theta) / sinTheta;\r\n\r\n            Vector3d v = new Vector3d();\n            v.x = from.x * st1 + to.x * st;\n            v.y = from.y * st1 + to.y * st;\r\n            v.z = from.z * st1 + to.z * st;\r\n\r\n            return v;\r\n        }\r\n\r\n    }\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector3d.cs.meta",
    "content": "fileFormatVersion: 2\nguid: b9c045103d2bd44499952cd87cbdca3d\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector3f.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\r\n\r\nnamespace Common.Core.LinearAlgebra\r\n{\r\n\r\n    /// <summary>\r\n    /// A 3d single precision vector.\r\n    /// </summary>\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Vector3f\r\n    {\r\n        public float x, y, z;\r\n\r\n        /// <summary>\n        /// The unit x vector.\n        /// </summary>\n        public readonly static Vector3f UnitX = new Vector3f(1, 0, 0);\n\n        /// <summary>\n        /// The unit y vector.\n        /// </summary>\n\t    public readonly static Vector3f UnitY = new Vector3f(0, 1, 0);\n\n        /// <summary>\n        /// The unit z vector.\n        /// </summary>\n\t    public readonly static Vector3f UnitZ = new Vector3f(0, 0, 1);\n\n        /// <summary>\n        /// A vector of zeros.\n        /// </summary>\n\t    public readonly static Vector3f Zero = new Vector3f(0);\r\n\r\n        /// <summary>\n        /// A vector of ones.\n        /// </summary>\n        public readonly static Vector3f One = new Vector3f(1);\r\n\r\n        /// <summary>\r\n        /// A vector of positive infinity.\r\n        /// </summary>\r\n        public readonly static Vector3f PositiveInfinity = new Vector3f(float.PositiveInfinity);\r\n\r\n        /// <summary>\r\n        /// A vector of negative infinity.\r\n        /// </summary>\r\n        public readonly static Vector3f NegativeInfinity = new Vector3f(float.NegativeInfinity);\r\n\r\n        /// <summary>\r\n        /// Convert to a 2 dimension vector.\r\n        /// </summary>\r\n        public Vector2f xy\r\n        {\r\n            get { return new Vector2f(x, y); }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert to a 2 dimension vector.\r\n        /// </summary>\r\n        public Vector2f xz\r\n        {\r\n            get { return new Vector2f(x, z); }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert to a 4 dimension vector.\r\n        /// </summary>\r\n        public Vector4f xyz0\r\n        {\r\n            get { return new Vector4f(x, y, z, 0); }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Convert to a 4 dimension vector.\r\n        /// </summary>\r\n        public Vector4f xyz1\r\n        {\r\n            get { return new Vector4f(x, y, z, 1); }\r\n        }\r\n\r\n        /// <summary>\r\n        /// A vector all with the value v.\r\n        /// </summary>\r\n        public Vector3f(float v)\r\n        {\r\n            this.x = v;\r\n            this.y = v;\r\n            this.z = v;\r\n        }\r\n\r\n        /// <summary>\r\n        /// A vector from the varibles.\r\n        /// </summary>\r\n        public Vector3f(float x, float y, float z)\r\n        {\r\n            this.x = x;\r\n            this.y = y;\r\n            this.z = z;\r\n        }\r\n\r\n        /// <summary>\r\n        /// A vector from a 2d vector and the z varible.\r\n        /// </summary>\r\n        public Vector3f(Vector2f v, float z)\r\n        {\r\n            x = v.x;\r\n            y = v.y;\r\n            this.z = z;\r\n        }\r\n\r\n        public float this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return x;\r\n                    case 1: return y;\r\n                    case 2: return z;\r\n                    default: throw new IndexOutOfRangeException(\"Vector3f index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: x = value; break;\r\n                    case 1: y = value; break;\r\n                    case 2: z = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Vector3f index out of range: \" + i);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\n        /// The length of the vector.\n        /// </summary>\n        public float Magnitude\r\n        {\r\n            get\r\n            {\r\n                return FMath.SafeSqrt(SqrMagnitude);\r\n            }\r\n        }\n\n        /// <summary>\n        /// The length of the vector squared.\n        /// </summary>\n\t\tpublic float SqrMagnitude\r\n        {\r\n            get\r\n            {\r\n                return (x * x + y * y + z * z);\r\n            }\r\n        }\r\n\r\n        /// <summary>\n        /// The vector normalized.\n        /// </summary>\n        public Vector3f Normalized\r\n        {\r\n            get\r\n            {\r\n                float invLength = FMath.SafeInvSqrt(1.0f, x * x + y * y + z * z);\r\n                return new Vector3f(x * invLength, y * invLength, z * invLength);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The vectors absolute values.\r\n        /// </summary>\n        public Vector3f Absolute\r\n        {\r\n            get\r\n            {\r\n                return new Vector3f(Math.Abs(x), Math.Abs(y), Math.Abs(z));\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Add two vectors.\r\n        /// </summary>\r\n        public static Vector3f operator +(Vector3f v1, Vector3f v2)\r\n        {\r\n            return new Vector3f(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Add vector and scalar.\r\n        /// </summary>\r\n        public static Vector3f operator +(Vector3f v1, float s)\r\n        {\r\n            return new Vector3f(v1.x + s, v1.y + s, v1.z + s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Add vector and scalar.\r\n        /// </summary>\r\n        public static Vector3f operator +(float s, Vector3f v1)\r\n        {\r\n            return new Vector3f(v1.x + s, v1.y + s, v1.z + s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Subtract two vectors.\r\n        /// </summary>\r\n        public static Vector3f operator -(Vector3f v1, Vector3f v2)\r\n        {\r\n            return new Vector3f(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Subtract vector and scalar.\r\n        /// </summary>\r\n        public static Vector3f operator -(Vector3f v1, float s)\r\n        {\r\n            return new Vector3f(v1.x - s, v1.y - s, v1.z - s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Subtract vector and scalar.\r\n        /// </summary>\r\n        public static Vector3f operator -(float s, Vector3f v1)\r\n        {\r\n            return new Vector3f(v1.x - s, v1.y - s, v1.z - s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply two vectors.\r\n        /// </summary>\r\n        public static Vector3f operator *(Vector3f v1, Vector3f v2)\r\n        {\r\n            return new Vector3f(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply a vector and a scalar.\r\n        /// </summary>\r\n        public static Vector3f operator *(Vector3f v, float s)\r\n        {\r\n            return new Vector3f(v.x * s, v.y * s, v.z * s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply a vector and a scalar.\r\n        /// </summary>\r\n        public static Vector3f operator *(float s, Vector3f v)\r\n        {\r\n            return new Vector3f(v.x * s, v.y * s, v.z * s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Divide two vectors.\r\n        /// </summary>\r\n        public static Vector3f operator /(Vector3f v1, Vector3f v2)\r\n        {\r\n            return new Vector3f(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Divide a vector and a scalar.\r\n        /// </summary>\r\n        public static Vector3f operator /(Vector3f v, float s)\r\n        {\r\n            return new Vector3f(v.x / s, v.y / s, v.z / s);\r\n        }\r\n\r\n\t\t/// <summary>\r\n\t\t/// Are these vectors equal.\r\n\t\t/// </summary>\r\n\t\tpublic static bool operator ==(Vector3f v1, Vector3f v2)\r\n\t\t{\r\n\t\t\treturn (v1.x == v2.x && v1.y == v2.y && v1.z == v2.z);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Are these vectors not equal.\r\n\t\t/// </summary>\r\n\t\tpublic static bool operator !=(Vector3f v1, Vector3f v2)\r\n\t\t{\r\n\t\t\treturn (v1.x != v2.x || v1.y != v2.y || v1.z != v2.z);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Are these vectors equal.\r\n\t\t/// </summary>\r\n\t\tpublic override bool Equals (object obj)\r\n\t\t{\r\n\t\t\tif(!(obj is Vector3f)) return false;\r\n\t\t\t\r\n\t\t\tVector3f v = (Vector3f)obj;\r\n\t\t\t\r\n\t\t\treturn this == v;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Are these vectors equal given the error.\r\n\t\t/// </summary>\r\n\t\tpublic bool EqualsWithError(Vector3f v, float eps)\r\n\t\t{\r\n\t\t\tif(Math.Abs(x-v.x)> eps) return false;\r\n\t\t\tif(Math.Abs(y-v.y)> eps) return false;\r\n\t\t\tif(Math.Abs(z-v.z)> eps) return false;\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Are these vectors equal.\r\n        /// </summary>\r\n        public bool Equals(Vector3f v)\r\n        {\r\n            return this == v;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Vectors hash code. \r\n        /// </summary>\r\n        public override int GetHashCode()\r\n        {\r\n            float hashcode = 23;\r\n            hashcode = (hashcode * 37) + x;\r\n            hashcode = (hashcode * 37) + y;\r\n            hashcode = (hashcode * 37) + z;\r\n\r\n\t\t\treturn unchecked((int)hashcode);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Vector as a string.\r\n        /// </summary>\r\n        public override string ToString()\r\n        {\r\n            return x + \",\" + y + \",\" + z;\r\n        }\r\n\r\n\t\t/// <summary>\r\n\t\t/// Vector from a string.\r\n\t\t/// </summary>\r\n\t\tstatic public Vector3f FromString(string s)\r\n\t\t{\r\n            Vector3f v = new Vector3f();\r\n\r\n            try\r\n            {\r\n                string[] separators = new string[] { \",\" };\r\n                string[] result = s.Split(separators, StringSplitOptions.None);\r\n\r\n                v.x = float.Parse(result[0]);\r\n                v.y = float.Parse(result[1]);\r\n                v.z = float.Parse(result[2]);\r\n            }\r\n            catch { }\r\n\t\t\t\r\n\t\t\treturn v;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// The dot product of two vectors.\r\n\t\t/// </summary>\r\n\t\tpublic static float Dot(Vector3f v0, Vector3f v1)\r\n\t\t{\r\n\t\t\treturn (v0.x * v1.x + v0.y * v1.y + v0.z * v1.z);\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Normalize the vector.\r\n        /// </summary>\r\n        public void Normalize()\r\n        {\r\n            float invLength = FMath.SafeInvSqrt(1.0f, x * x + y * y + z * z);\r\n            x *= invLength;\r\n            y *= invLength;\r\n            z *= invLength;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Cross two vectors.\r\n        /// </summary>\r\n        public Vector3f Cross(Vector3f v)\r\n        {\r\n            return new Vector3f(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x);\r\n        }\r\n\r\n\t\t/// <summary>\r\n\t\t/// Cross two vectors.\r\n\t\t/// </summary>\r\n\t\tpublic static Vector3f Cross(Vector3f v0, Vector3f v1)\r\n\t\t{\r\n\t\t\treturn new Vector3f(v0.y * v1.z - v0.z * v1.y, v0.z * v1.x - v0.x * v1.z, v0.x * v1.y - v0.y * v1.x);\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Distance between two vectors.\r\n        /// </summary>\r\n        public static float Distance(Vector3f v0, Vector3f v1)\r\n        {\r\n            return FMath.SafeSqrt(SqrDistance(v0, v1));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Square distance between two vectors.\r\n        /// </summary>\r\n        public static float SqrDistance(Vector3f v0, Vector3f v1)\r\n        {\r\n            float x = v0.x - v1.x;\r\n            float y = v0.y - v1.y;\r\n            float z = v0.z - v1.z;\r\n            return x * x + y * y + z * z;\r\n        }\r\n\r\n        /// <summary>\r\n        /// The minimum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Min(float s)\r\n        {\r\n            x = Math.Min(x, s);\r\n            y = Math.Min(y, s);\r\n            z = Math.Min(z, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The minimum value between each component in vectors.\r\n        /// </summary>\r\n        public void Min(Vector3f v)\r\n        {\r\n            x = Math.Min(x, v.x);\r\n            y = Math.Min(y, v.y);\r\n            z = Math.Min(z, v.z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Max(float s)\r\n        {\r\n            x = Math.Max(x, s);\r\n            y = Math.Max(y, s);\r\n            z = Math.Max(z, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between each component in vectors.\r\n        /// </summary>\r\n        public void Max(Vector3f v)\r\n        {\r\n            x = Math.Max(x, v.x);\r\n            y = Math.Max(y, v.y);\r\n            z = Math.Max(z, v.z);\r\n        }\r\n\r\n        /// <summary>\n        /// The absolute vector.\n        /// </summary>\n        public void Abs()\r\n        {\r\n            x = Math.Abs(x);\r\n            y = Math.Abs(y);\r\n            z = Math.Abs(z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Clamp the each component to specified min and max.\r\n        /// </summary>\r\n        public void Clamp(float min, float max)\r\n\t\t{\r\n\t\t\tx = Math.Max(Math.Min(x, max), min);\r\n\t\t\ty = Math.Max(Math.Min(y, max), min);\r\n\t\t\tz = Math.Max(Math.Min(z, max), min);\r\n\t\t}\r\n\r\n        /// <summary>\n        /// Clamp the each component to specified min and max.\n        /// </summary>\n        public void Clamp(Vector3f min, Vector3f max)\r\n        {\r\n            x = Math.Max(Math.Min(x, max.x), min.x);\r\n            y = Math.Max(Math.Min(y, max.y), min.y);\r\n            z = Math.Max(Math.Min(z, max.z), min.z);\r\n        }\r\n\r\n        /// <summary>\n        /// Lerp between two vectors.\n        /// </summary>\n        public static Vector3f Lerp(Vector3f from, Vector3f to, float t)\n        {\r\n            if (t < 0.0f) t = 0.0f;\r\n            if (t > 1.0f) t = 1.0f;\r\n\r\n            if (t == 0.0f) return from;\r\n            if (t == 1.0f) return to;\n\n            float t1 = 1.0f - t;\r\n            Vector3f v = new Vector3f();\n            v.x = from.x * t1 + to.x * t;\n            v.y = from.y * t1 + to.y * t;\r\n            v.z = from.z * t1 + to.z * t;\r\n            return v;\n        }\r\n\r\n        /// <summary>\n        /// Slerp between two vectors arc.\n        /// </summary>\r\n        public static Vector3f Slerp(Vector3f from, Vector3f to, float t)\r\n        {\r\n            if (t < 0.0f) t = 0.0f;\r\n            if (t > 1.0f) t = 1.0f;\r\n\r\n            if (t == 0.0f) return from;\r\n            if (t == 1.0f) return to;\r\n            if (to.x == from.x && to.y == from.y && to.z == from.z) return to;\r\n\r\n            float m = from.Magnitude * to.Magnitude;\r\n            if (FMath.IsZero(m)) return Vector3f.Zero;\r\n\r\n            double theta = Math.Acos(Dot(from, to) / m);\r\n\r\n            if (theta == 0.0) return to;\r\n\r\n            double sinTheta = Math.Sin(theta);\r\n            float st1 = (float)(Math.Sin((1.0 - t) * theta) / sinTheta);\r\n            float st = (float)(Math.Sin(t * theta) / sinTheta);\r\n\r\n            Vector3f v = new Vector3f();\n            v.x = from.x * st1 + to.x * st;\n            v.y = from.y * st1 + to.y * st;\r\n            v.z = from.z * st1 + to.z * st;\r\n\r\n            return v;\r\n        }\r\n    }\r\n\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector3f.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 094df8240bc2a7c4db01c45a93d719d3\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector3i.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\r\n\r\nnamespace Common.Core.LinearAlgebra\r\n{\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Vector3i\r\n\t{\r\n\t\tpublic int x, y, z;\r\n\r\n        /// <summary>\n        /// The unit x vector.\n        /// </summary>\n\t    public readonly static Vector3i UnitX = new Vector3i(1, 0, 0);\n\n        /// <summary>\n        /// The unit y vector.\n        /// </summary>\n\t    public readonly static Vector3i UnitY = new Vector3i(0, 1, 0);\n\n        /// <summary>\n        /// The unit z vector.\n        /// </summary>\n\t    public readonly static Vector3i UnitZ = new Vector3i(0, 0, 1);\n\n        /// <summary>\n        /// A vector of zeros.\n        /// </summary>\n\t    public readonly static Vector3i Zero = new Vector3i(0);\r\n\r\n        /// <summary>\n        /// A vector of ones.\n        /// </summary>\n        public readonly static Vector3i One = new Vector3i(1);\r\n\r\n        /// <summary>\r\n        /// A vector of min int.\r\n        /// </summary>\r\n        public readonly static Vector3i MinInt = new Vector3i(int.MinValue);\r\n\r\n        /// <summary>\r\n        /// A vector of max int.\r\n        /// </summary>\r\n        public readonly static Vector3i MaxInt = new Vector3i(int.MaxValue);\r\n\r\n        public Vector3i(int v)\r\n        {\r\n            this.x = v;\r\n            this.y = v;\r\n            this.z = v;\r\n        }\r\n\r\n        public Vector3i(int x, int y, int z)\r\n\t\t{\r\n\t\t\tthis.x = x;\r\n\t\t\tthis.y = y;\r\n\t\t\tthis.z = z;\r\n\t\t}\r\n\r\n        public int this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return x;\r\n                    case 1: return y;\r\n                    case 2: return z;\r\n                    default: throw new IndexOutOfRangeException(\"Vector3i index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: x = value; break;\r\n                    case 1: y = value; break;\r\n                    case 2: z = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Vector3i index out of range: \" + i);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The length of the vector.\r\n        /// </summary>\r\n        public double Magnitude\r\n        {\r\n            get\r\n            {\r\n                return DMath.SafeSqrt(SqrMagnitude);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The length of the vector squared.\r\n        /// </summary>\r\n        public int SqrMagnitude\r\n        {\r\n            get\r\n            {\r\n                return (x * x + y * y + z * z);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The vectors absolute values.\r\n        /// </summary>\r\n        public Vector3i Absolute\r\n        {\r\n            get\r\n            {\r\n                return new Vector3i(Math.Abs(x), Math.Abs(y), Math.Abs(z));\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Add two vectors.\r\n        /// </summary>\r\n        public static Vector3i operator +(Vector3i v1, Vector3i v2)\r\n        {\r\n            return new Vector3i(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Add vector and scalar.\r\n        /// </summary>\r\n        public static Vector3i operator +(Vector3i v1, int s)\r\n        {\r\n            return new Vector3i(v1.x + s, v1.y + s, v1.z + s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Add vector and scalar.\r\n        /// </summary>\r\n        public static Vector3i operator +(int s, Vector3i v1)\r\n        {\r\n            return new Vector3i(v1.x + s, v1.y + s, v1.z + s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Subtract two vectors.\r\n        /// </summary>\r\n        public static Vector3i operator -(Vector3i v1, Vector3i v2)\r\n        {\r\n            return new Vector3i(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Subtract vector and scalar.\r\n        /// </summary>\r\n        public static Vector3i operator -(Vector3i v1, int s)\r\n        {\r\n            return new Vector3i(v1.x - s, v1.y - s, v1.z - s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Subtract vector and scalar.\r\n        /// </summary>\r\n        public static Vector3i operator -(int s, Vector3i v1)\r\n        {\r\n            return new Vector3i(v1.x - s, v1.y - s, v1.z - s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply two vectors.\r\n        /// </summary>\r\n        public static Vector3i operator *(Vector3i v1, Vector3i v2)\r\n        {\r\n            return new Vector3i(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply a vector and a scalar.\r\n        /// </summary>\r\n        public static Vector3i operator *(Vector3i v, int s)\r\n        {\r\n            return new Vector3i(v.x * s, v.y * s, v.z * s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply a vector and a scalar.\r\n        /// </summary>\r\n        public static Vector3i operator *(int s, Vector3i v)\r\n        {\r\n            return new Vector3i(v.x * s, v.y * s, v.z * s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Divide two vectors.\r\n        /// </summary>\r\n        public static Vector3i operator /(Vector3i v1, Vector3i v2)\r\n        {\r\n            return new Vector3i(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Divide a vector and a scalar.\r\n        /// </summary>\r\n        public static Vector3i operator /(Vector3i v, int s)\r\n        {\r\n            return new Vector3i(v.x / s, v.y / s, v.z / s);\r\n        }\r\n\r\n\t\t/// <summary>\r\n\t\t/// Are these vectors equal.\r\n\t\t/// </summary>\r\n\t\tpublic static bool operator ==(Vector3i v1, Vector3i v2)\r\n\t\t{\r\n\t\t\treturn (v1.x == v2.x && v1.y == v2.y && v1.z == v2.z);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Are these vectors not equal.\r\n\t\t/// </summary>\r\n\t\tpublic static bool operator !=(Vector3i v1, Vector3i v2)\r\n\t\t{\r\n\t\t\treturn (v1.x != v2.x || v1.y != v2.y || v1.z != v2.z);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Are these vectors equal.\r\n\t\t/// </summary>\r\n\t\tpublic override bool Equals (object obj)\r\n\t\t{\r\n\t\t\tif(!(obj is Vector3i)) return false;\r\n\t\t\t\r\n\t\t\tVector3i v = (Vector3i)obj;\r\n\t\t\t\r\n\t\t\treturn this == v;\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Are these vectors equal.\r\n        /// </summary>\r\n        public bool Equals(Vector3i v)\r\n        {\r\n            return this == v;\r\n        }\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Vectors hash code. \r\n\t\t/// </summary>\r\n\t\tpublic override int GetHashCode()\r\n\t\t{\r\n\t\t\tint hashcode = 23;\r\n\r\n            unchecked\r\n            {\r\n                hashcode = (hashcode * 37) + x;\r\n                hashcode = (hashcode * 37) + y;\r\n                hashcode = (hashcode * 37) + z;\r\n            }\r\n\t\t\t\r\n\t\t\treturn hashcode;\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Vector as a string.\r\n\t\t/// </summary>\r\n\t\tpublic override string ToString()\r\n\t\t{\r\n\t\t\treturn x + \",\" + y + \",\" + z;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Vector from a string.\r\n\t\t/// </summary>\r\n\t\tstatic public Vector3i FromString(string s)\r\n\t\t{\r\n            Vector3i v = new Vector3i();\r\n            try\r\n            {\r\n                string[] separators = new string[] { \",\" };\r\n                string[] result = s.Split(separators, StringSplitOptions.None);\r\n\r\n                v.x = int.Parse(result[0]);\r\n                v.y = int.Parse(result[1]);\r\n                v.z = int.Parse(result[2]);\r\n            }\r\n            catch { }\r\n\t\t\t\r\n\t\t\treturn v;\r\n\t\t}\r\n        \r\n        /// <summary>\r\n        /// The dot product of two vectors.\r\n        /// </summary>\r\n        public static int Dot(Vector3i v0, Vector3i v1)\r\n        {\r\n            return (v0.x * v1.x + v0.y * v1.y + v0.z * v1.z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Cross two vectors.\r\n        /// </summary>\r\n        public static Vector3i Cross(Vector3i v0, Vector3i v1)\r\n        {\r\n            return new Vector3i(v0.y * v1.z - v0.z * v1.y, v0.z * v1.x - v0.x * v1.z, v0.x * v1.y - v0.y * v1.x);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Distance between two vectors.\r\n        /// </summary>\r\n        public static double Distance(Vector3i v0, Vector3i v1)\r\n        {\r\n            return DMath.SafeSqrt(SqrDistance(v0, v1));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Square distance between two vectors.\r\n        /// </summary>\r\n        public static double SqrDistance(Vector3i v0, Vector3i v1)\r\n        {\r\n            double x = v0.x - v1.x;\r\n            double y = v0.y - v1.y;\r\n            double z = v0.z - v1.z;\r\n            return x * x + y * y + z * z;\r\n        }\r\n\r\n        /// <summary>\r\n        /// The minimum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Min(int s)\r\n        {\r\n            x = Math.Min(x, s);\r\n            y = Math.Min(y, s);\r\n            z = Math.Min(z, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The minimum value between each component in vectors.\r\n        /// </summary>\r\n        public void Min(Vector3i v)\r\n        {\r\n            x = Math.Min(x, v.x);\r\n            y = Math.Min(y, v.y);\r\n            z = Math.Min(z, v.z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Max(int s)\r\n        {\r\n            x = Math.Max(x, s);\r\n            y = Math.Max(y, s);\r\n            z = Math.Max(z, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between each component in vectors.\r\n        /// </summary>\r\n        public void Max(Vector3i v)\r\n        {\r\n            x = Math.Max(x, v.x);\r\n            y = Math.Max(y, v.y);\r\n            z = Math.Max(z, v.z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The absolute vector.\r\n        /// </summary>\r\n        public void Abs()\r\n        {\r\n            x = Math.Abs(x);\r\n            y = Math.Abs(y);\r\n            z = Math.Abs(z);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Clamp the each component to specified min and max.\r\n        /// </summary>\r\n        public void Clamp(int min, int max)\r\n        {\r\n            x = Math.Max(Math.Min(x, max), min);\r\n            y = Math.Max(Math.Min(y, max), min);\r\n            z = Math.Max(Math.Min(z, max), min);\r\n        }\r\n\r\n        /// <summary>\n        /// Clamp the each component to specified min and max.\n        /// </summary>\n        public void Clamp(Vector3i min, Vector3i max)\r\n        {\r\n            x = Math.Max(Math.Min(x, max.x), min.x);\r\n            y = Math.Max(Math.Min(y, max.y), min.y);\r\n            z = Math.Max(Math.Min(z, max.z), min.z);\r\n        }\r\n\r\n    }\r\n\t\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector3i.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c429b2b651bebc94387a8eadd602aaea\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector4d.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\n\nnamespace Common.Core.LinearAlgebra\n{\n\n    /// <summary>\n    /// A 4d double precision vector.\n    /// </summary>\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Vector4d\n\t{\n\t\n\t\tpublic double x, y, z, w;\r\n\r\n        /// <summary>\n        /// The unit x vector.\n        /// </summary>\n        public readonly static Vector4d UnitX = new Vector4d(1, 0, 0, 0);\n\n        /// <summary>\n        /// The unit y vector.\n        /// </summary>\n\t    public readonly static Vector4d UnitY = new Vector4d(0, 1, 0, 0);\n\n        /// <summary>\n        /// The unit z vector.\n        /// </summary>\n\t    public readonly static Vector4d UnitZ = new Vector4d(0, 0, 1, 0);\n\n        /// <summary>\n        /// The unit w vector.\n        /// </summary>\n\t    public readonly static Vector4d UnitW = new Vector4d(0, 0, 0, 1);\n\n        /// <summary>\n        /// A vector of zeros.\n        /// </summary>\n\t    public readonly static Vector4d Zero = new Vector4d(0);\n\n        /// <summary>\n        /// A vector of ones.\n        /// </summary>\n\t    public readonly static Vector4d One = new Vector4d(1);\r\n\r\n        /// <summary>\r\n        /// A vector of positive infinity.\r\n        /// </summary>\r\n        public readonly static Vector4d PositiveInfinity = new Vector4d(double.PositiveInfinity);\r\n\r\n        /// <summary>\r\n        /// A vector of negative infinity.\r\n        /// </summary>\r\n        public readonly static Vector4d NegativeInfinity = new Vector4d(double.NegativeInfinity);\n\n        /// <summary>\n        /// Convert to a 2 dimension vector.\n        /// </summary>\n\t    public Vector2d xy\n\t    {\n\t        get { return new Vector2d(x, y); }\n\t    }\n\n        /// <summary>\n        /// Convert to a 3 dimension vector.\n        /// </summary>\n\t    public Vector3d xyz\n\t    {\n\t        get { return new Vector3d(x, y, z); }\n\t    }\n\n        /// <summary>\n        /// A copy of the vector with w as 0.\n        /// </summary>\n        public Vector4d xyz0\n        {\n            get { return new Vector4d(x, y, z, 0); }\n        }\n\n        /// <summary>\n        /// A vector all with the value v.\n        /// </summary>\n\t\tpublic Vector4d(double v) \n\t\t{\n\t\t\tthis.x = v; \n\t\t\tthis.y = v; \n\t\t\tthis.z = v;\n\t\t\tthis.w = v;\n\t\t}\n\n        /// <summary>\n        /// A vector from the varibles.\n        /// </summary>\n\t\tpublic Vector4d(double x, double y, double z, double w) \n\t\t{\n\t\t\tthis.x = x; \n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\t\t}\n\n        /// <summary>\n        /// A vector from a 2d vector and the z and w varibles.\n        /// </summary>\n\t\tpublic Vector4d(Vector2d v, double z, double w) \n\t\t{ \n\t\t\tx = v.x; \n\t\t\ty = v.y; \n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\t\t}\n\n        /// <summary>\n        /// A vector from a 3d vector and the w varible.\n        /// </summary>\n\t\tpublic Vector4d(Vector3d v, double w) \n\t\t{ \n\t\t\tx = v.x; \n\t\t\ty = v.y; \n\t\t\tz = v.z;\n\t\t\tthis.w = w;\n\t\t}\r\n\r\n        public double this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return x;\r\n                    case 1: return y;\r\n                    case 2: return z;\r\n                    case 3: return w;\r\n                    default: throw new IndexOutOfRangeException(\"Vector4d index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: x = value; break;\r\n                    case 1: y = value; break;\r\n                    case 2: z = value; break;\r\n                    case 3: w = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Vector4d index out of range: \" + i);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\n        /// The length of the vector.\n        /// </summary>\n        public double Magnitude\r\n        {\r\n            get\r\n            {\r\n                return DMath.SafeSqrt(SqrMagnitude);\r\n            }\r\n        }\n\n        /// <summary>\n        /// The length of the vector squared.\n        /// </summary>\n\t\tpublic double SqrMagnitude\r\n        {\r\n            get\r\n            {\r\n                return (x * x + y * y + z * z + w * w);\r\n            }\r\n        }\r\n\r\n        /// <summary>\n        /// The vector normalized.\n        /// </summary>\n        public Vector4d Normalized\r\n        {\r\n            get\r\n            {\r\n                double invLength = DMath.SafeInvSqrt(1.0, x * x + y * y + z * z + w * w);\r\n                return new Vector4d(x * invLength, y * invLength, z * invLength, w * invLength);\r\n            }\r\n        }\n\n        /// <summary>\r\n        /// The vectors absolute values.\r\n        /// </summary>\n        public Vector4d Absolute\r\n        {\r\n            get\r\n            {\r\n                return new Vector4d(Math.Abs(x), Math.Abs(y), Math.Abs(z), Math.Abs(w));\r\n            }\r\n        }\n\n        /// <summary>\n        /// Add two vectors.\n        /// </summary>\n        public static Vector4d operator +(Vector4d v1, Vector4d v2)\n        {\n            return new Vector4d(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z, v1.w + v2.w);\n        }\n\n        /// <summary>\n        /// Add vector and scalar.\n        /// </summary>\n        public static Vector4d operator +(Vector4d v1, double s)\n        {\n            return new Vector4d(v1.x + s, v1.y + s, v1.z + s, v1.w + s);\n        }\r\n\r\n        /// <summary>\n        /// Add vector and scalar.\n        /// </summary>\n        public static Vector4d operator +(double s, Vector4d v1)\n        {\n            return new Vector4d(v1.x + s, v1.y + s, v1.z + s, v1.w + s);\n        }\n\n        /// <summary>\n        /// Subtract two vectors.\n        /// </summary>\n        public static Vector4d operator -(Vector4d v1, Vector4d v2)\n        {\n            return new Vector4d(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z, v1.w - v2.w);\n        }\n\n        /// <summary>\n        /// Subtract vector and scalar.\n        /// </summary>\n        public static Vector4d operator -(Vector4d v1, double s)\n        {\n            return new Vector4d(v1.x - s, v1.y - s, v1.z - s, v1.w - s);\n        }\r\n\r\n        /// <summary>\n        /// Subtract vector and scalar.\n        /// </summary>\n        public static Vector4d operator -(double s, Vector4d v1)\n        {\n            return new Vector4d(v1.x - s, v1.y - s, v1.z - s, v1.w - s);\n        }\n\n        /// <summary>\n        /// Multiply two vectors.\n        /// </summary>\n        public static Vector4d operator *(Vector4d v1, Vector4d v2)\n        {\n            return new Vector4d(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z, v1.w * v2.w);\n        }\n\n        /// <summary>\n        /// Multiply a vector and a scalar.\n        /// </summary>\n        public static Vector4d operator *(Vector4d v, double s)\n        {\n            return new Vector4d(v.x * s, v.y * s, v.z * s, v.w * s);\n        }\n\n        /// <summary>\n        /// Multiply a vector and a scalar.\n        /// </summary>\n        public static Vector4d operator *(double s, Vector4d v)\n        {\n            return new Vector4d(v.x * s, v.y * s, v.z * s, v.w * s);\n        }\n\n        /// <summary>\n        /// Divide two vectors.\n        /// </summary>\n        public static Vector4d operator /(Vector4d v1, Vector4d v2)\n        {\n            return new Vector4d(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z, v1.w / v2.w);\n        }\n\n        /// <summary>\n        /// Divide a vector and a scalar.\n        /// </summary>\n        public static Vector4d operator /(Vector4d v, double s)\n        {\n            return new Vector4d(v.x / s, v.y / s, v.z / s, v.w / s);\n        }\n\n\t\t/// <summary>\n\t\t/// Are these vectors equal.\n\t\t/// </summary>\n\t\tpublic static bool operator ==(Vector4d v1, Vector4d v2)\n\t\t{\n\t\t\treturn (v1.x == v2.x && v1.y == v2.y && v1.z == v2.z && v1.w == v2.w);\n\t\t}\n\t\t\n\t\t/// <summary>\n\t\t/// Are these vectors not equal.\n\t\t/// </summary>\n\t\tpublic static bool operator !=(Vector4d v1, Vector4d v2)\n\t\t{\n\t\t\treturn (v1.x != v2.x || v1.y != v2.y || v1.z != v2.z || v1.w != v2.w);\n\t\t}\n\t\t\n\t\t/// <summary>\n\t\t/// Are these vectors equal.\n\t\t/// </summary>\n\t\tpublic override bool Equals (object obj)\n\t\t{\n\t\t\tif(!(obj is Vector4d)) return false;\n\t\t\t\n\t\t\tVector4d v = (Vector4d)obj;\n\t\t\t\n\t\t\treturn this == v;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Are these vectors equal given the error.\n\t\t/// </summary>\n\t\tpublic bool EqualsWithError(Vector4d v, double eps)\n\t\t{\n\t\t\tif(Math.Abs(x-v.x)> eps) return false;\n\t\t\tif(Math.Abs(y-v.y)> eps) return false;\n\t\t\tif(Math.Abs(z-v.z)> eps) return false;\n\t\t\tif(Math.Abs(w-v.w)> eps) return false;\n\t\t\treturn true;\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Are these vectors equal.\r\n        /// </summary>\r\n        public bool Equals(Vector4d v)\r\n        {\r\n            return this == v;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Vectors hash code. \r\n        /// </summary>\r\n        public override int GetHashCode()\r\n        {\r\n            double hashcode = 23;\r\n            hashcode = (hashcode * 37) + x;\r\n            hashcode = (hashcode * 37) + y;\r\n            hashcode = (hashcode * 37) + z;\r\n            hashcode = (hashcode * 37) + w;\r\n\r\n\t\t\treturn unchecked((int)hashcode);\r\n        }\n\n        /// <summary>\n        /// Vector as a string.\n        /// </summary>\n\t\tpublic override string ToString() {\n\t\t\treturn x + \",\" + y + \",\" + z + \",\" + w;\n\t   \t}\n\n\t\t/// <summary>\n\t\t/// Vector from a string.\n\t\t/// </summary>\n\t\tstatic public Vector4d FromString(string s)\n\t\t{\r\n            Vector4d v = new Vector4d();\r\n            try\r\n            {\r\n                string[] separators = new string[] { \",\" };\r\n                string[] result = s.Split(separators, StringSplitOptions.None);\r\n\r\n                v.x = double.Parse(result[0]);\r\n                v.y = double.Parse(result[1]);\r\n                v.z = double.Parse(result[2]);\r\n                v.w = double.Parse(result[3]);\r\n            }\r\n            catch { }\n\t\t\t\n\t\t\treturn v;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The dot product of two vectors.\n\t\t/// </summary>\n\t\tpublic static double Dot(Vector4d v0, Vector4d v1) \n        {\n\t\t\treturn (v0.x*v1.x + v0.y*v1.y + v0.z*v1.z + v0.w*v1.w);\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Distance between two vectors.\r\n        /// </summary>\r\n        public static double Distance(Vector4d v0, Vector4d v1)\r\n        {\r\n            return DMath.SafeSqrt(SqrDistance(v0, v1));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Square distance between two vectors.\r\n        /// </summary>\r\n        public static double SqrDistance(Vector4d v0, Vector4d v1)\r\n        {\r\n            double x = v0.x - v1.x;\r\n            double y = v0.y - v1.y;\r\n            double z = v0.z - v1.z;\r\n            double w = v0.w - v1.w;\r\n            return x * x + y * y + z * z + w * w;\r\n        }\n\n        /// <summary>\n        /// Normalize the vector.\n        /// </summary>\n\t\tpublic void Normalize()\n\t\t{\r\n            double invLength = DMath.SafeInvSqrt(1.0, x * x + y * y + z * z + w * w);\n\t    \tx *= invLength;\n\t\t\ty *= invLength;\n\t\t\tz *= invLength;\n\t\t\tw *= invLength;\n\t\t}\r\n\r\n        /// <summary>\r\n        /// The minimum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Min(double s)\r\n        {\r\n            x = Math.Min(x, s);\r\n            y = Math.Min(y, s);\r\n            z = Math.Min(z, s);\r\n            w = Math.Min(w, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The minimum value between each component in vectors.\r\n        /// </summary>\r\n        public void Min(Vector4d v)\r\n        {\r\n            x = Math.Min(x, v.x);\r\n            y = Math.Min(y, v.y);\r\n            z = Math.Min(z, v.z);\r\n            w = Math.Min(w, v.w);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Max(double s)\r\n        {\r\n            x = Math.Max(x, s);\r\n            y = Math.Max(y, s);\r\n            z = Math.Max(z, s);\r\n            w = Math.Max(w, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between each component in vectors.\r\n        /// </summary>\r\n        public void Max(Vector4d v)\r\n        {\r\n            x = Math.Max(x, v.x);\r\n            y = Math.Max(y, v.y);\r\n            z = Math.Max(z, v.z);\r\n            w = Math.Max(w, v.w);\r\n        }\r\n\r\n        /// <summary>\n        /// The absolute vector.\n        /// </summary>\n        public void Abs()\n        {\n            x = Math.Abs(x);\n            y = Math.Abs(y);\n            z = Math.Abs(z);\n            w = Math.Abs(w);\n        }\n\n        /// <summary>\n        /// Clamp the each component to specified min and max.\n        /// </summary>\n        public void Clamp(double min, double max)\n        {\n            x = Math.Max(Math.Min(x, max), min);\n            y = Math.Max(Math.Min(y, max), min);\n            z = Math.Max(Math.Min(z, max), min);\n            w = Math.Max(Math.Min(w, max), min);\n        }\r\n\r\n        /// <summary>\n        /// Clamp the each component to specified min and max.\n        /// </summary>\n        public void Clamp(Vector4d min, Vector4d max)\r\n        {\r\n            x = Math.Max(Math.Min(x, max.x), min.x);\r\n            y = Math.Max(Math.Min(y, max.y), min.y);\r\n            z = Math.Max(Math.Min(z, max.z), min.z);\r\n            w = Math.Max(Math.Min(w, max.w), min.w);\r\n        }\n\n        /// <summary>\n        /// Lerp between two vectors.\n        /// </summary>\n        public static Vector4d Lerp(Vector4d from, Vector4d to, double t)\n        {\r\n            if (t < 0.0) t = 0.0;\r\n            if (t > 1.0) t = 1.0;\r\n\r\n            if (t == 0.0) return from;\r\n            if (t == 1.0) return to;\n\n            double t1 = 1.0 - t;\r\n            Vector4d v = new Vector4d();\n            v.x = from.x * t1 + to.x * t;\n            v.y = from.y * t1 + to.y * t;\r\n            v.z = from.z * t1 + to.z * t;\r\n            v.w = from.w * t1 + to.w * t;\r\n            return v;\n        }\r\n\r\n    }\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector4d.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2766e509106656041a199c994b986a25\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector4f.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\n\nnamespace Common.Core.LinearAlgebra\n{\n\n    /// <summary>\n    /// A 4d float precision vector.\n    /// </summary>\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Vector4f\n    {\n\n        public float x, y, z, w;\r\n\r\n        /// <summary>\n        /// The unit x vector.\n        /// </summary>\n        public readonly static Vector4f UnitX = new Vector4f(1, 0, 0, 0);\n\n        /// <summary>\n        /// The unit y vector.\n        /// </summary>\n\t    public readonly static Vector4f UnitY = new Vector4f(0, 1, 0, 0);\n\n        /// <summary>\n        /// The unit z vector.\n        /// </summary>\n\t    public readonly static Vector4f UnitZ = new Vector4f(0, 0, 1, 0);\n\n        /// <summary>\n        /// The unit w vector.\n        /// </summary>\n\t    public readonly static Vector4f UnitW = new Vector4f(0, 0, 0, 1);\n\n        /// <summary>\n        /// A vector of zeros.\n        /// </summary>\n\t    public readonly static Vector4f Zero = new Vector4f(0);\n\n        /// <summary>\n        /// A vector of ones.\n        /// </summary>\n\t    public readonly static Vector4f One = new Vector4f(1);\r\n\r\n        /// <summary>\r\n        /// A vector of positive infinity.\r\n        /// </summary>\r\n        public readonly static Vector4f PositiveInfinity = new Vector4f(float.PositiveInfinity);\r\n\r\n        /// <summary>\r\n        /// A vector of negative infinity.\r\n        /// </summary>\r\n        public readonly static Vector4f NegativeInfinity = new Vector4f(float.NegativeInfinity);\n\n        /// <summary>\n        /// Convert to a 2 dimension vector.\n        /// </summary>\n        public Vector2f xy\n        {\n            get { return new Vector2f(x, y); }\n        }\n\n        /// <summary>\n        /// Convert to a 3 dimension vector.\n        /// </summary>\n        public Vector3f xyz\n        {\n            get { return new Vector3f(x, y, z); }\n        }\n\n        /// <summary>\n        /// A copy of the vector with w as 0.\n        /// </summary>\n        public Vector4f xyz0\n        {\n            get { return new Vector4f(x, y, z, 0); }\n        }\n\n        /// <summary>\n        /// A vector all with the value v.\n        /// </summary>\n        public Vector4f(float v)\n        {\n            this.x = v;\n            this.y = v;\n            this.z = v;\n            this.w = v;\n        }\n\n        /// <summary>\n        /// A vector from the varibles.\n        /// </summary>\n        public Vector4f(float x, float y, float z, float w)\n        {\n            this.x = x;\n            this.y = y;\n            this.z = z;\n            this.w = w;\n        }\n\n        /// <summary>\n        /// A vector from a 2d vector and the z and w varibles.\n        /// </summary>\n        public Vector4f(Vector2f v, float z, float w)\n        {\n            x = v.x;\n            y = v.y;\n            this.z = z;\n            this.w = w;\n        }\n\n        /// <summary>\n        /// A vector from a 3d vector and the w varible.\n        /// </summary>\n        public Vector4f(Vector3f v, float w)\n        {\n            x = v.x;\n            y = v.y;\n            z = v.z;\n            this.w = w;\n        }\r\n\r\n        public float this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return x;\r\n                    case 1: return y;\r\n                    case 2: return z;\r\n                    case 3: return w;\r\n                    default: throw new IndexOutOfRangeException(\"Vector4f index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: x = value; break;\r\n                    case 1: y = value; break;\r\n                    case 2: z = value; break;\r\n                    case 3: w = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Vector4f index out of range: \" + i);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\n        /// The length of the vector.\n        /// </summary>\n        public float Magnitude\r\n        {\r\n            get\r\n            {\r\n                return FMath.SafeSqrt(SqrMagnitude);\r\n            }\r\n        }\n\n        /// <summary>\n        /// The length of the vector squared.\n        /// </summary>\n\t\tpublic float SqrMagnitude\r\n        {\r\n            get\r\n            {\r\n                return (x * x + y * y + z * z + w * w);\r\n            }\r\n        }\r\n\r\n        /// <summary>\n        /// The vector normalized.\n        /// </summary>\n        public Vector4f Normalized\r\n        {\r\n            get\r\n            {\r\n                float invLength = FMath.SafeInvSqrt(1.0f, x * x + y * y + z * z + w * w);\r\n                return new Vector4f(x * invLength, y * invLength, z * invLength, w * invLength);\r\n            }\r\n        }\n\n        /// <summary>\r\n        /// The vectors absolute values.\r\n        /// </summary>\n        public Vector4f Absolute\r\n        {\r\n            get\r\n            {\r\n                return new Vector4f(Math.Abs(x), Math.Abs(y), Math.Abs(z), Math.Abs(w));\r\n            }\r\n        }\n\n        /// <summary>\n        /// Add two vectors.\n        /// </summary>\n        public static Vector4f operator +(Vector4f v1, Vector4f v2)\n        {\n            return new Vector4f(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z, v1.w + v2.w);\n        }\n\n        /// <summary>\n        /// Add vector and scalar.\n        /// </summary>\n        public static Vector4f operator +(Vector4f v1, float s)\n        {\n            return new Vector4f(v1.x + s, v1.y + s, v1.z + s, v1.w + s);\n        }\r\n\r\n        /// <summary>\n        /// Add vector and scalar.\n        /// </summary>\n        public static Vector4f operator +(float s, Vector4f v1)\n        {\n            return new Vector4f(v1.x + s, v1.y + s, v1.z + s, v1.w + s);\n        }\n\n        /// <summary>\n        /// Subtract two vectors.\n        /// </summary>\n        public static Vector4f operator -(Vector4f v1, Vector4f v2)\n        {\n            return new Vector4f(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z, v1.w - v2.w);\n        }\n\n        /// <summary>\n        /// Subtract vector and scalar.\n        /// </summary>\n        public static Vector4f operator -(Vector4f v1, float s)\n        {\n            return new Vector4f(v1.x - s, v1.y - s, v1.z - s, v1.w - s);\n        }\r\n\r\n        /// <summary>\n        /// Subtract vector and scalar.\n        /// </summary>\n        public static Vector4f operator -(float s, Vector4f v1)\n        {\n            return new Vector4f(v1.x - s, v1.y - s, v1.z - s, v1.w - s);\n        }\n\n        /// <summary>\n        /// Multiply two vectors.\n        /// </summary>\n        public static Vector4f operator *(Vector4f v1, Vector4f v2)\n        {\n            return new Vector4f(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z, v1.w * v2.w);\n        }\n\n        /// <summary>\n        /// Multiply a vector and a scalar.\n        /// </summary>\n        public static Vector4f operator *(Vector4f v, float s)\n        {\n            return new Vector4f(v.x * s, v.y * s, v.z * s, v.w * s);\n        }\n\n        /// <summary>\n        /// Multiply a vector and a scalar.\n        /// </summary>\n        public static Vector4f operator *(float s, Vector4f v)\n        {\n            return new Vector4f(v.x * s, v.y * s, v.z * s, v.w * s);\n        }\n\n        /// <summary>\n        /// Divide two vectors.\n        /// </summary>\n        public static Vector4f operator /(Vector4f v1, Vector4f v2)\n        {\n            return new Vector4f(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z, v1.w / v2.w);\n        }\n\n        /// <summary>\n        /// Divide a vector and a scalar.\n        /// </summary>\n        public static Vector4f operator /(Vector4f v, float s)\n        {\n            return new Vector4f(v.x / s, v.y / s, v.z / s, v.w / s);\n        }\n\n\t\t/// <summary>\n\t\t/// Are these vectors equal.\n\t\t/// </summary>\n\t\tpublic static bool operator ==(Vector4f v1, Vector4f v2)\n\t\t{\n\t\t\treturn (v1.x == v2.x && v1.y == v2.y && v1.z == v2.z && v1.w == v2.w);\n\t\t}\n\t\t\n\t\t/// <summary>\n\t\t/// Are these vectors not equal.\n\t\t/// </summary>\n\t\tpublic static bool operator !=(Vector4f v1, Vector4f v2)\n\t\t{\n\t\t\treturn (v1.x != v2.x || v1.y != v2.y || v1.z != v2.z || v1.w != v2.w);\n\t\t}\n\t\t\n\t\t/// <summary>\n\t\t/// Are these vectors equal.\n\t\t/// </summary>\n\t\tpublic override bool Equals (object obj)\n\t\t{\n\t\t\tif(!(obj is Vector4f)) return false;\n\t\t\t\n\t\t\tVector4f v = (Vector4f)obj;\n\t\t\t\n\t\t\treturn this == v;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Are these vectors equal given the error.\n\t\t/// </summary>\n\t\tpublic bool EqualsWithError(Vector4f v, float eps)\n\t\t{\n\t\t\tif(Math.Abs(x-v.x)> eps) return false;\n\t\t\tif(Math.Abs(y-v.y)> eps) return false;\n\t\t\tif(Math.Abs(z-v.z)> eps) return false;\n\t\t\tif(Math.Abs(w-v.w)> eps) return false;\n\t\t\treturn true;\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Are these vectors equal.\r\n        /// </summary>\r\n        public bool Equals(Vector4f v)\r\n        {\r\n            return this == v;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Vectors hash code. \r\n        /// </summary>\r\n        public override int GetHashCode()\r\n        {\r\n            float hashcode = 23;\r\n            hashcode = (hashcode * 37) + x;\r\n            hashcode = (hashcode * 37) + y;\r\n            hashcode = (hashcode * 37) + z;\r\n            hashcode = (hashcode * 37) + w;\r\n\r\n\t\t\treturn unchecked((int)hashcode);\r\n        }\n\n        /// <summary>\n        /// Vector as a string.\n        /// </summary>\n        public override string ToString()\n        {\n            return x + \",\" + y + \",\" + z + \",\" + w;\n        }\n\n\t\t/// <summary>\n\t\t/// Vector from a string.\n\t\t/// </summary>\n\t\tstatic public Vector4f FromString(string s)\n\t\t{\r\n            Vector4f v = new Vector4f();\r\n            try\r\n            {\r\n                string[] separators = new string[] { \",\" };\r\n                string[] result = s.Split(separators, StringSplitOptions.None);\r\n\r\n                v.x = float.Parse(result[0]);\r\n                v.y = float.Parse(result[1]);\r\n                v.z = float.Parse(result[2]);\r\n                v.w = float.Parse(result[3]);\r\n            }\r\n            catch { }\n\t\t\t\n\t\t\treturn v;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The dot product of two vectors.\n\t\t/// </summary>\n\t\tpublic static float Dot(Vector4f v0, Vector4f v1)\n\t\t{\n\t\t\treturn (v0.x * v1.x + v0.y * v1.y + v0.z * v1.z + v0.w * v1.w);\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Distance between two vectors.\r\n        /// </summary>\r\n        public static float Distance(Vector4f v0, Vector4f v1)\r\n        {\r\n            return FMath.SafeSqrt(SqrDistance(v0, v1));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Square distance between two vectors.\r\n        /// </summary>\r\n        public static float SqrDistance(Vector4f v0, Vector4f v1)\r\n        {\r\n            float x = v0.x - v1.x;\r\n            float y = v0.y - v1.y;\r\n            float z = v0.z - v1.z;\r\n            float w = v0.w - v1.w;\r\n            return x * x + y * y + z * z + w*w;\r\n        }\n\n        /// <summary>\n        /// Normalize the vector.\n        /// </summary>\n        public void Normalize()\n        {\r\n            float invLength = FMath.SafeInvSqrt(1.0f, x * x + y * y + z * z + w * w);\n            x *= invLength;\n            y *= invLength;\n            z *= invLength;\n            w *= invLength;\n        }\r\n\r\n        /// <summary>\r\n        /// The minimum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Min(float s)\r\n        {\r\n            x = Math.Min(x, s);\r\n            y = Math.Min(y, s);\r\n            z = Math.Min(z, s);\r\n            w = Math.Min(w, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The minimum value between each component in vectors.\r\n        /// </summary>\r\n        public void Min(Vector4f v)\r\n        {\r\n            x = Math.Min(x, v.x);\r\n            y = Math.Min(y, v.y);\r\n            z = Math.Min(z, v.z);\r\n            w = Math.Min(w, v.w);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Max(float s)\r\n        {\r\n            x = Math.Max(x, s);\r\n            y = Math.Max(y, s);\r\n            z = Math.Max(z, s);\r\n            w = Math.Max(w, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between each component in vectors.\r\n        /// </summary>\r\n        public void Max(Vector4f v)\r\n        {\r\n            x = Math.Max(x, v.x);\r\n            y = Math.Max(y, v.y);\r\n            z = Math.Max(z, v.z);\r\n            w = Math.Max(w, v.w);\r\n        }\r\n\r\n        /// <summary>\n        /// The absolute vector.\n        /// </summary>\n        public void Abs()\r\n        {\r\n            x = Math.Abs(x);\r\n            y = Math.Abs(y);\r\n            z = Math.Abs(z);\r\n            w = Math.Abs(w);\r\n        }\r\n\r\n        /// <summary>\n        /// Clamp the each component to specified min and max.\n        /// </summary>\n        public void Clamp(float min, float max)\n\t\t{\n\t\t\tx = Math.Max(Math.Min(x, max), min);\n\t\t\ty = Math.Max(Math.Min(y, max), min);\n\t\t\tz = Math.Max(Math.Min(z, max), min);\n\t\t\tw = Math.Max(Math.Min(w, max), min);\n\t\t}\r\n\r\n        /// <summary>\n        /// Clamp the each component to specified min and max.\n        /// </summary>\n        public void Clamp(Vector4f min, Vector4f max)\r\n        {\r\n            x = Math.Max(Math.Min(x, max.x), min.x);\r\n            y = Math.Max(Math.Min(y, max.y), min.y);\r\n            z = Math.Max(Math.Min(z, max.z), min.z);\r\n            w = Math.Max(Math.Min(w, max.w), min.w);\r\n        }\n\n        /// <summary>\n        /// Lerp between two vectors.\n        /// </summary>\n        public static Vector4f Lerp(Vector4f from, Vector4f to, float t)\n        {\r\n            if (t < 0.0f) t = 0.0f;\r\n            if (t > 1.0f) t = 1.0f;\r\n\r\n            if (t == 0.0f) return from;\r\n            if (t == 1.0f) return to;\n\n            float t1 = 1.0f - t;\r\n            Vector4f v = new Vector4f();\n            v.x = from.x * t1 + to.x * t;\n            v.y = from.y * t1 + to.y * t;\r\n            v.z = from.z * t1 + to.z * t;\r\n            v.w = from.w * t1 + to.w * t;\r\n            return v;\n        }\n\n    }\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector4f.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 8ea49a7834165304c8ca5b1bc42aaf48\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector4i.cs",
    "content": "using System;\r\nusing System.Collections;\r\nusing System.Runtime.InteropServices;\r\n\r\nusing Common.Core.Mathematics;\r\n\r\nnamespace Common.Core.LinearAlgebra\r\n{\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct Vector4i\r\n\t{\r\n\t\tpublic int x, y, z, w;\r\n\r\n        /// <summary>\n        /// The unit x vector.\n        /// </summary>\n\t    public readonly static Vector4i UnitX = new Vector4i(1, 0, 0, 0);\n\n        /// <summary>\n        /// The unit y vector.\n        /// </summary>\n\t    public readonly static Vector4i UnitY = new Vector4i(0, 1, 0, 0);\n\n        /// <summary>\n        /// The unit z vector.\n        /// </summary>\n\t    public readonly static Vector4i UnitZ = new Vector4i(0, 0, 1, 0);\n\n        /// <summary>\n        /// The unit w vector.\n        /// </summary>\n\t    public readonly static Vector4i UnitW = new Vector4i(0, 0, 0, 1);\n\n        /// <summary>\n        /// A vector of zeros.\n        /// </summary>\n\t    public readonly static Vector4i Zero = new Vector4i(0);\n\n        /// <summary>\n        /// A vector of ones.\n        /// </summary>\n\t    public readonly static Vector4i One = new Vector4i(1);\r\n\r\n        /// <summary>\r\n        /// A vector of min int.\r\n        /// </summary>\r\n        public readonly static Vector4i MinInt = new Vector4i(int.MinValue);\r\n\r\n        /// <summary>\r\n        /// A vector of max int.\r\n        /// </summary>\r\n        public readonly static Vector4i MaxInt = new Vector4i(int.MaxValue);\r\n\r\n        public Vector4i(int v)\r\n        {\r\n            this.x = v;\r\n            this.y = v;\r\n            this.z = v;\r\n            this.w = v;\r\n        }\r\n\r\n        public Vector4i(int x, int y, int z, int w)\r\n\t\t{\r\n\t\t\tthis.x = x;\r\n\t\t\tthis.y = y;\r\n\t\t\tthis.z = z;\r\n\t\t\tthis.w = w;\r\n\t\t}\r\n\r\n        public int this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return x;\r\n                    case 1: return y;\r\n                    case 2: return z;\r\n                    case 3: return w;\r\n                    default: throw new IndexOutOfRangeException(\"Vector4i index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: x = value; break;\r\n                    case 1: y = value; break;\r\n                    case 2: z = value; break;\r\n                    case 3: w = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Vector4i index out of range: \" + i);\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The length of the vector.\r\n        /// </summary>\r\n        public double Magnitude\r\n        {\r\n            get\r\n            {\r\n                return DMath.SafeSqrt(SqrMagnitude);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The length of the vector squared.\r\n        /// </summary>\r\n        public int SqrMagnitude\r\n        {\r\n            get\r\n            {\r\n                return (x * x + y * y + z * z + w * w);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// The vectors absolute values.\r\n        /// </summary>\r\n        public Vector4i Absolute\r\n        {\r\n            get\r\n            {\r\n                return new Vector4i(Math.Abs(x), Math.Abs(y), Math.Abs(z), Math.Abs(w));\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Add two vectors.\r\n        /// </summary>\r\n        public static Vector4i operator +(Vector4i v1, Vector4i v2)\r\n        {\r\n            return new Vector4i(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z, v1.w + v2.w);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Add vector and scalar.\r\n        /// </summary>\r\n        public static Vector4i operator +(Vector4i v1, int s)\r\n        {\r\n            return new Vector4i(v1.x + s, v1.y + s, v1.z + s, v1.w + s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Add vector and scalar.\r\n        /// </summary>\r\n        public static Vector4i operator +(int s, Vector4i v1)\r\n        {\r\n            return new Vector4i(v1.x + s, v1.y + s, v1.z + s, v1.w + s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Subtract two vectors.\r\n        /// </summary>\r\n        public static Vector4i operator -(Vector4i v1, Vector4i v2)\r\n        {\r\n            return new Vector4i(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z, v1.w - v2.w);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Subtract vector and scalar.\r\n        /// </summary>\r\n        public static Vector4i operator -(Vector4i v1, int s)\r\n        {\r\n            return new Vector4i(v1.x - s, v1.y - s, v1.z - s, v1.w - s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Subtract vector and scalar.\r\n        /// </summary>\r\n        public static Vector4i operator -(int s, Vector4i v1)\r\n        {\r\n            return new Vector4i(v1.x - s, v1.y - s, v1.z - s, v1.w - s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply two vectors.\r\n        /// </summary>\r\n        public static Vector4i operator *(Vector4i v1, Vector4i v2)\r\n        {\r\n            return new Vector4i(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z, v1.w * v2.w);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply a vector and a scalar.\r\n        /// </summary>\r\n        public static Vector4i operator *(Vector4i v, int s)\r\n        {\r\n            return new Vector4i(v.x * s, v.y * s, v.z * s, v.w * s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Multiply a vector and a scalar.\r\n        /// </summary>\r\n        public static Vector4i operator *(int s, Vector4i v)\r\n        {\r\n            return new Vector4i(v.x * s, v.y * s, v.z * s, v.w * s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Divide two vectors.\r\n        /// </summary>\r\n        public static Vector4i operator /(Vector4i v1, Vector4i v2)\r\n        {\r\n            return new Vector4i(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z, v1.w / v2.w);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Divide a vector and a scalar.\r\n        /// </summary>\r\n        public static Vector4i operator /(Vector4i v, int s)\r\n        {\r\n            return new Vector4i(v.x / s, v.y / s, v.z / s, v.w / s);\r\n        }\r\n\r\n\t\t/// <summary>\r\n\t\t/// Are these vectors equal.\r\n\t\t/// </summary>\r\n\t\tpublic static bool operator ==(Vector4i v1, Vector4i v2)\r\n\t\t{\r\n\t\t\treturn (v1.x == v2.x && v1.y == v2.y && v1.z == v2.z && v1.w == v2.w);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Are these vectors not equal.\r\n\t\t/// </summary>\r\n\t\tpublic static bool operator !=(Vector4i v1, Vector4i v2)\r\n\t\t{\r\n\t\t\treturn (v1.x != v2.x || v1.y != v2.y || v1.z != v2.z || v1.w != v2.w);\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Are these vectors equal.\r\n\t\t/// </summary>\r\n\t\tpublic override bool Equals (object obj)\r\n\t\t{\r\n\t\t\tif(!(obj is Vector4i)) return false;\r\n\t\t\t\r\n\t\t\tVector4i v = (Vector4i)obj;\r\n\t\t\t\r\n\t\t\treturn this == v;\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// Are these vectors equal.\r\n        /// </summary>\r\n        public bool Equals(Vector4i v)\r\n        {\r\n            return this == v;\r\n        }\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Vectors hash code. \r\n\t\t/// </summary>\r\n\t\tpublic override int GetHashCode()\r\n\t\t{\r\n\t\t\tint hashcode = 23;\r\n\r\n            unchecked\r\n            {\r\n                hashcode = (hashcode * 37) + x;\r\n                hashcode = (hashcode * 37) + y;\r\n                hashcode = (hashcode * 37) + z;\r\n                hashcode = (hashcode * 37) + w;\r\n            }\r\n\t\t\t\r\n\t\t\treturn hashcode;\r\n\t\t}\r\n\t\t\r\n\t\t/// <summary>\r\n\t\t/// Vector as a string.\r\n\t\t/// </summary>\r\n\t\tpublic override string ToString()\r\n\t\t{\r\n\t\t\treturn x + \",\" + y + \",\" + z + \",\" + w;\r\n\t\t}\r\n\r\n\t\t/// <summary>\r\n\t\t/// Vector from a string.\r\n\t\t/// </summary>\r\n\t\tstatic public Vector4i FromString(string s)\r\n\t\t{\r\n            Vector4i v = new Vector4i();\r\n\r\n            try\r\n            {\r\n                string[] separators = new string[] { \",\" };\r\n                string[] result = s.Split(separators, StringSplitOptions.None);\r\n\r\n                v.x = int.Parse(result[0]);\r\n                v.y = int.Parse(result[1]);\r\n                v.z = int.Parse(result[2]);\r\n                v.w = int.Parse(result[3]);\r\n            }\r\n            catch { }\r\n\t\t\t\r\n\t\t\treturn v;\r\n\t\t}\r\n\r\n        /// <summary>\r\n        /// The dot product of two vectors.\r\n        /// </summary>\r\n        public static int Dot(Vector4i v0, Vector4i v1)\r\n        {\r\n            return (v0.x * v1.x + v0.y * v1.y + v0.z * v1.z + v0.w * v1.w);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Distance between two vectors.\r\n        /// </summary>\r\n        public static double Distance(Vector4i v0, Vector4i v1)\r\n        {\r\n            return DMath.SafeSqrt(SqrDistance(v0, v1));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Square distance between two vectors.\r\n        /// </summary>\r\n        public static double SqrDistance(Vector4i v0, Vector4i v1)\r\n        {\r\n            double x = v0.x - v1.x;\r\n            double y = v0.y - v1.y;\r\n            double z = v0.z - v1.z;\r\n            double w = v0.w - v1.w;\r\n            return x * x + y * y + z * z + w * w;\r\n        }\r\n\r\n        /// <summary>\r\n        /// The minimum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Min(int s)\r\n        {\r\n            x = Math.Min(x, s);\r\n            y = Math.Min(y, s);\r\n            z = Math.Min(z, s);\r\n            w = Math.Min(w, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The minimum value between each component in vectors.\r\n        /// </summary>\r\n        public void Min(Vector4i v)\r\n        {\r\n            x = Math.Min(x, v.x);\r\n            y = Math.Min(y, v.y);\r\n            z = Math.Min(z, v.z);\r\n            w = Math.Min(w, v.w);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between s and each component in vector.\r\n        /// </summary>\r\n        public void Max(int s)\r\n        {\r\n            x = Math.Max(x, s);\r\n            y = Math.Max(y, s);\r\n            z = Math.Max(z, s);\r\n            w = Math.Max(w, s);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The maximum value between each component in vectors.\r\n        /// </summary>\r\n        public void Max(Vector4i v)\r\n        {\r\n            x = Math.Max(x, v.x);\r\n            y = Math.Max(y, v.y);\r\n            z = Math.Max(z, v.z);\r\n            w = Math.Max(w, v.w);\r\n        }\r\n\r\n        /// <summary>\r\n        /// The absolute vector.\r\n        /// </summary>\r\n        public void Abs()\r\n        {\r\n            x = Math.Abs(x);\r\n            y = Math.Abs(y);\r\n            z = Math.Abs(z);\r\n            w = Math.Abs(w);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Clamp the each component to specified min and max.\r\n        /// </summary>\r\n        public void Clamp(int min, int max)\r\n        {\r\n            x = Math.Max(Math.Min(x, max), min);\r\n            y = Math.Max(Math.Min(y, max), min);\r\n            z = Math.Max(Math.Min(z, max), min);\r\n            w = Math.Max(Math.Min(w, max), min);\r\n        }\r\n\r\n        /// <summary>\n        /// Clamp the each component to specified min and max.\n        /// </summary>\n        public void Clamp(Vector4i min, Vector4i max)\r\n        {\r\n            x = Math.Max(Math.Min(x, max.x), min.x);\r\n            y = Math.Max(Math.Min(y, max.y), min.y);\r\n            z = Math.Max(Math.Min(z, max.z), min.z);\r\n            w = Math.Max(Math.Min(w, max.w), min.w);\r\n        }\r\n\r\n    }\r\n\t\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "Assets/Common/LinearAlgebra/Vector4i.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 76636d8a8f9545a43a7ca5a30de4b00e\ntimeCreated: 1514536270\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/LinearAlgebra.meta",
    "content": "fileFormatVersion: 2\nguid: dbcf441fe7fb93143a9acab04c44f587\nfolderAsset: yes\ntimeCreated: 1514536270\nlicenseType: Free\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/Mathematics/DMath.cs",
    "content": "using System;\r\n\r\nnamespace Common.Core.Mathematics\r\n{\r\n    public class DMath\r\n    {\r\n\r\n        public static readonly double EPS = 1e-18;\r\n\r\n        public static readonly double PI = Math.PI;\r\n\r\n        public static readonly double Rad2Deg = 180.0 / PI;\r\n\r\n        public static readonly double Deg2Rad = PI / 180.0;\r\n\r\n        public static double SafeAcos(double r)\r\n        {\r\n            return Math.Acos(Math.Min(1.0, Math.Max(-1.0, r)));\r\n        }\r\n\r\n        public static double SafeAsin(double r)\r\n        {\r\n            return Math.Asin(Math.Min(1.0, Math.Max(-1.0, r)));\r\n        }\r\n\r\n        public static double SafeSqrt(double v)\r\n        {\r\n            if (v <= 0.0) return 0.0;\r\n            return Math.Sqrt(v);\r\n        }\r\n\r\n        public static double SafeInvSqrt(double n, double d)\r\n        {\r\n            if (d <= 0.0) return 0.0;\r\n            d = Math.Sqrt(d);\r\n            if (d < EPS) return 0.0;\r\n            return n / d;\r\n        }\r\n\r\n        public static double SafeInv(double v)\r\n        {\r\n            if (Math.Abs(v) < EPS) return 0.0;\r\n            return 1.0 / v;\r\n        }\r\n\r\n        public static double SafeDiv(double n, double d)\r\n        {\r\n            if (Math.Abs(d) < EPS) return 0.0;\r\n            return n / d;\r\n        }\r\n\r\n        public static bool IsZero(double v)\r\n        {\r\n            return Math.Abs(v) < EPS;\r\n        }\r\n\r\n        public static bool IsFinite(double f)\r\n        {\r\n            return !(double.IsInfinity(f) || double.IsNaN(f));\r\n        }\r\n\r\n        public static double Clamp(double v, double min, double max)\r\n        {\r\n            if (v < min) v = min;\r\n            if (v > max) v = max;\r\n            return v;\r\n        }\r\n\r\n        public static double Clamp01(double v)\r\n        {\r\n            if (v < 0.0) v = 0.0;\r\n            if (v > 1.0) v = 1.0;\r\n            return v;\r\n        }\r\n\r\n        public static double SmoothStep(double edge0, double edge1, double x)\r\n        {\r\n            double t = Clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\r\n            return t * t * (3.0 - 2.0 * t);\r\n        }\r\n\r\n        public static double Frac(double x)\r\n        {\r\n            return x - Math.Floor(x);\r\n        }\r\n\r\n        public static double Lerp(double v0, double v1, double a)\r\n        {\r\n            return v0 * (1.0 - a) + v1 * a;\r\n        }\r\n    }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "Assets/Common/Mathematics/DMath.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e9811506d7286624cbaaa86bf5ea2ac2\ntimeCreated: 1514536310\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/Mathematics/FMath.cs",
    "content": "using System;\r\n\r\nnamespace Common.Core.Mathematics\r\n{\r\n    public class FMath\r\n    {\r\n        public static readonly float EPS = 1e-9f;\r\n\r\n        public static readonly float PI = (float)Math.PI;\r\n\r\n        public static readonly float Rad2Deg = 180.0f / PI;\r\n\r\n        public static readonly float Deg2Rad = PI / 180.0f;\r\n\r\n        public static float SafeAcos(float r)\r\n        {\r\n            return (float)Math.Acos(Math.Min(1.0f, Math.Max(-1.0f, r)));\r\n        }\r\n\r\n        public static float SafeAsin(float r)\r\n        {\r\n            return (float)Math.Asin(Math.Min(1.0f, Math.Max(-1.0f, r)));\r\n        }\r\n\r\n        public static float SafeSqrt(float v)\r\n        {\r\n            if (v <= 0.0f) return 0.0f;\r\n            return (float)Math.Sqrt(v);\r\n        }\r\n\r\n        public static float SafeInvSqrt(float n, float d)\r\n        {\r\n            if (d <= 0.0f) return 0.0f;\r\n            d = (float)Math.Sqrt(d);\r\n            if (d < EPS) return 0.0f;\r\n            return n / d;\r\n        }\r\n\r\n        public static float SafeInv(float v)\r\n        {\r\n            if (Math.Abs(v) < EPS) return 0.0f;\r\n            return 1.0f / v;\r\n        }\r\n\r\n        public static float SafeDiv(float n, float d)\r\n        {\r\n            if (Math.Abs(d) < EPS) return 0.0f;\r\n            return n / d;\r\n        }\r\n\r\n        public static bool IsZero(float v)\r\n        {\r\n            return Math.Abs(v) < EPS;\r\n        }\r\n\r\n        public static bool IsFinite(float f)\r\n        {\r\n            return !(float.IsInfinity(f) || float.IsNaN(f));\r\n        }\r\n\r\n        public static float Clamp(float v, float min, float max)\r\n        {\r\n            if (v < min) v = min;\r\n            if (v > max) v = max;\r\n            return v;\r\n        }\r\n\r\n        public static float Clamp01(float v)\r\n        {\r\n            if (v < 0.0f) v = 0.0f;\r\n            if (v > 1.0f) v = 1.0f;\r\n            return v;\r\n        }\r\n\r\n        public static float SmoothStep(float edge0, float edge1, float x)\r\n        {\r\n            float t = Clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f);\r\n            return t * t * (3.0f - 2.0f * t);\r\n        }\r\n\r\n        public static float Frac(float x)\r\n        {\r\n            return x - (float)Math.Floor(x);\r\n        }\r\n\r\n        public static float Lerp(float v0, float v1, float a)\r\n        {\r\n            return v0 * (1.0f - a) + v1 * a;\r\n        }\r\n\r\n    }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "Assets/Common/Mathematics/FMath.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 20b1889a7c1251b4b8ff543a0ebcb6d0\ntimeCreated: 1514536310\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/Mathematics/IMath.cs",
    "content": "using System;\n\nnamespace Common.Core.Mathematics\n{\n\tpublic class IMath \n\t{\r\n\r\n        public static int Clamp(int v, int min, int max)\r\n        {\r\n            if (v < min) v = min;\r\n            if (v > max) v = max;\r\n            return v;\r\n        }\n\n        public static bool IsPow2(int num)\r\n        {\r\n            int power = (int)(Math.Log(num) / Math.Log(2.0));\r\n\r\n            double result = Math.Pow(2.0, power);\r\n\r\n            return (result == num);\r\n        }\n\n\t\tpublic static int NearestPow2(int num)\n\t\t{\n\t\t\tint n = num > 0 ? num - 1 : 0;\n\t\t\t\n\t\t\tn |= n >> 1;\n\t\t\tn |= n >> 2;\n\t\t\tn |= n >> 4;\n\t\t\tn |= n >> 8;\n\t\t\tn |= n >> 16;\n\t\t\tn++;\n\t\t\t\n\t\t\treturn n;\n\t\t}\n\n\t\tpublic static int LowerPow2(int num)\n\t\t{\n\t\t\tint n = num > 0 ? num - 1 : 0;\n\n\t\t\tn |= n >> 1;\n\t\t\tn |= n >> 2;\n\t\t\tn |= n >> 4;\n\t\t\tn |= n >> 8;\n\t\t\tn |= n >> 16;\n\t\t\tn++;\n\n\t\t\treturn n - (n >> 1);\n\t\t}\r\n\r\n    }\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "Assets/Common/Mathematics/IMath.cs.meta",
    "content": "fileFormatVersion: 2\nguid: fd9b410d6fb0aeb4695a51db5bb1eaea\ntimeCreated: 1514536310\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common/Mathematics.meta",
    "content": "fileFormatVersion: 2\nguid: bc2beaf82238a5249a353d02afb0edca\nfolderAsset: yes\ntimeCreated: 1514536310\nlicenseType: Free\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/Common.meta",
    "content": "fileFormatVersion: 2\nguid: 0ad1543cd6efc234284c34aeefa1430a\nfolderAsset: yes\ntimeCreated: 1514536270\nlicenseType: Free\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Demo.unity",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!29 &1\nOcclusionCullingSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 2\n  m_OcclusionBakeSettings:\n    smallestOccluder: 5\n    smallestHole: 0.25\n    backfaceThreshold: 100\n  m_SceneGUID: 00000000000000000000000000000000\n  m_OcclusionCullingData: {fileID: 0}\n--- !u!104 &2\nRenderSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 9\n  m_Fog: 0\n  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}\n  m_FogMode: 3\n  m_FogDensity: 0.01\n  m_LinearFogStart: 0\n  m_LinearFogEnd: 300\n  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}\n  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}\n  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}\n  m_AmbientIntensity: 1\n  m_AmbientMode: 0\n  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}\n  m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}\n  m_HaloStrength: 0.5\n  m_FlareStrength: 1\n  m_FlareFadeSpeed: 3\n  m_HaloTexture: {fileID: 0}\n  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}\n  m_DefaultReflectionMode: 0\n  m_DefaultReflectionResolution: 128\n  m_ReflectionBounces: 1\n  m_ReflectionIntensity: 1\n  m_CustomReflection: {fileID: 0}\n  m_Sun: {fileID: 0}\n  m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1}\n  m_UseRadianceAmbientProbe: 0\n--- !u!157 &3\nLightmapSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 12\n  m_GIWorkflowMode: 0\n  m_GISettings:\n    serializedVersion: 2\n    m_BounceScale: 1\n    m_IndirectOutputScale: 1\n    m_AlbedoBoost: 1\n    m_EnvironmentLightingMode: 0\n    m_EnableBakedLightmaps: 1\n    m_EnableRealtimeLightmaps: 1\n  m_LightmapEditorSettings:\n    serializedVersion: 12\n    m_Resolution: 2\n    m_BakeResolution: 40\n    m_AtlasSize: 1024\n    m_AO: 0\n    m_AOMaxDistance: 1\n    m_CompAOExponent: 1\n    m_CompAOExponentDirect: 0\n    m_ExtractAmbientOcclusion: 0\n    m_Padding: 2\n    m_LightmapParameters: {fileID: 0}\n    m_LightmapsBakeMode: 1\n    m_TextureCompression: 1\n    m_FinalGather: 0\n    m_FinalGatherFiltering: 1\n    m_FinalGatherRayCount: 256\n    m_ReflectionCompression: 2\n    m_MixedBakeMode: 1\n    m_BakeBackend: 0\n    m_PVRSampling: 1\n    m_PVRDirectSampleCount: 32\n    m_PVRSampleCount: 500\n    m_PVRBounces: 2\n    m_PVREnvironmentSampleCount: 500\n    m_PVREnvironmentReferencePointCount: 2048\n    m_PVRFilteringMode: 0\n    m_PVRDenoiserTypeDirect: 0\n    m_PVRDenoiserTypeIndirect: 0\n    m_PVRDenoiserTypeAO: 0\n    m_PVRFilterTypeDirect: 0\n    m_PVRFilterTypeIndirect: 0\n    m_PVRFilterTypeAO: 0\n    m_PVREnvironmentMIS: 0\n    m_PVRCulling: 1\n    m_PVRFilteringGaussRadiusDirect: 1\n    m_PVRFilteringGaussRadiusIndirect: 5\n    m_PVRFilteringGaussRadiusAO: 2\n    m_PVRFilteringAtrousPositionSigmaDirect: 0.5\n    m_PVRFilteringAtrousPositionSigmaIndirect: 2\n    m_PVRFilteringAtrousPositionSigmaAO: 1\n    m_ExportTrainingData: 0\n    m_TrainingDataDestination: TrainingData\n    m_LightProbeSampleCountMultiplier: 4\n  m_LightingDataAsset: {fileID: 0}\n  m_LightingSettings: {fileID: 53020077}\n--- !u!196 &4\nNavMeshSettings:\n  serializedVersion: 2\n  m_ObjectHideFlags: 0\n  m_BuildSettings:\n    serializedVersion: 2\n    agentTypeID: 0\n    agentRadius: 0.5\n    agentHeight: 2\n    agentSlope: 45\n    agentClimb: 0.4\n    ledgeDropHeight: 0\n    maxJumpAcrossDistance: 0\n    minRegionArea: 2\n    manualCellSize: 0\n    cellSize: 0.16666667\n    manualTileSize: 0\n    tileSize: 256\n    accuratePlacement: 0\n    maxJobWorkers: 0\n    preserveTilesOutsideBounds: 0\n    debug:\n      m_Flags: 0\n  m_NavMeshData: {fileID: 0}\n--- !u!850595691 &53020077\nLightingSettings:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_Name: Settings.lighting\n  serializedVersion: 2\n  m_GIWorkflowMode: 0\n  m_EnableBakedLightmaps: 1\n  m_EnableRealtimeLightmaps: 1\n  m_RealtimeEnvironmentLighting: 1\n  m_BounceScale: 1\n  m_AlbedoBoost: 1\n  m_IndirectOutputScale: 1\n  m_UsingShadowmask: 0\n  m_BakeBackend: 0\n  m_LightmapMaxSize: 1024\n  m_BakeResolution: 40\n  m_Padding: 2\n  m_TextureCompression: 1\n  m_AO: 0\n  m_AOMaxDistance: 1\n  m_CompAOExponent: 1\n  m_CompAOExponentDirect: 0\n  m_ExtractAO: 0\n  m_MixedBakeMode: 1\n  m_LightmapsBakeMode: 1\n  m_FilterMode: 1\n  m_LightmapParameters: {fileID: 0}\n  m_ExportTrainingData: 0\n  m_TrainingDataDestination: TrainingData\n  m_RealtimeResolution: 2\n  m_ForceWhiteAlbedo: 0\n  m_ForceUpdates: 0\n  m_FinalGather: 0\n  m_FinalGatherRayCount: 256\n  m_FinalGatherFiltering: 1\n  m_PVRCulling: 1\n  m_PVRSampling: 1\n  m_PVRDirectSampleCount: 32\n  m_PVRSampleCount: 500\n  m_PVREnvironmentSampleCount: 500\n  m_PVREnvironmentReferencePointCount: 2048\n  m_LightProbeSampleCountMultiplier: 4\n  m_PVRBounces: 2\n  m_PVRRussianRouletteStartBounce: 2\n  m_PVREnvironmentMIS: 0\n  m_PVRFilteringMode: 0\n  m_PVRDenoiserTypeDirect: 0\n  m_PVRDenoiserTypeIndirect: 0\n  m_PVRDenoiserTypeAO: 0\n  m_PVRFilterTypeDirect: 0\n  m_PVRFilterTypeIndirect: 0\n  m_PVRFilterTypeAO: 0\n  m_PVRFilteringGaussRadiusDirect: 1\n  m_PVRFilteringGaussRadiusIndirect: 5\n  m_PVRFilteringGaussRadiusAO: 2\n  m_PVRFilteringAtrousPositionSigmaDirect: 0.5\n  m_PVRFilteringAtrousPositionSigmaIndirect: 2\n  m_PVRFilteringAtrousPositionSigmaAO: 1\n--- !u!1 &617497645\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 617497648}\n  - component: {fileID: 617497647}\n  - component: {fileID: 617497646}\n  m_Layer: 0\n  m_Name: Main Camera\n  m_TagString: MainCamera\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!114 &617497646\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 617497645}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 21b56fa4ac510b34d865a6cae689b006, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  option: 3\n  drawWireframe: 1\n  armadillo: {fileID: 2800000, guid: 8d4354cace070ef41a318c34670ff88a, type: 3}\n  bunny: {fileID: 2800000, guid: 689440ccb80c6a348afee121dd2fa9e3, type: 3}\n  donut: {fileID: 2800000, guid: 4df4a7e175870f94ca81a95b3d9c28f4, type: 3}\n  textureMaterial: {fileID: 2100000, guid: 716d33869f0597743928b3f83bbdbd52, type: 2}\n--- !u!20 &617497647\nCamera:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 617497645}\n  m_Enabled: 1\n  serializedVersion: 2\n  m_ClearFlags: 2\n  m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0}\n  m_projectionMatrixMode: 1\n  m_GateFitMode: 2\n  m_FOVAxisMode: 0\n  m_SensorSize: {x: 36, y: 24}\n  m_LensShift: {x: 0, y: 0}\n  m_FocalLength: 50\n  m_NormalizedViewPortRect:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1\n    height: 1\n  near clip plane: 0.3\n  far clip plane: 1000\n  field of view: 60\n  orthographic: 1\n  orthographic size: 2\n  m_Depth: -1\n  m_CullingMask:\n    serializedVersion: 2\n    m_Bits: 4294967295\n  m_RenderingPath: -1\n  m_TargetTexture: {fileID: 0}\n  m_TargetDisplay: 0\n  m_TargetEye: 3\n  m_HDR: 0\n  m_AllowMSAA: 1\n  m_AllowDynamicResolution: 0\n  m_ForceIntoRT: 0\n  m_OcclusionCulling: 1\n  m_StereoConvergence: 10\n  m_StereoSeparation: 0.022\n--- !u!4 &617497648\nTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 617497645}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: -1}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 0}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n--- !u!1 &958705224\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 958705226}\n  - component: {fileID: 958705225}\n  m_Layer: 0\n  m_Name: Directional Light\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!108 &958705225\nLight:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 958705224}\n  m_Enabled: 1\n  serializedVersion: 10\n  m_Type: 1\n  m_Shape: 0\n  m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}\n  m_Intensity: 1\n  m_Range: 10\n  m_SpotAngle: 30\n  m_InnerSpotAngle: 21.80208\n  m_CookieSize: 10\n  m_Shadows:\n    m_Type: 2\n    m_Resolution: -1\n    m_CustomResolution: -1\n    m_Strength: 1\n    m_Bias: 0.05\n    m_NormalBias: 0.4\n    m_NearPlane: 0.2\n    m_CullingMatrixOverride:\n      e00: 1\n      e01: 0\n      e02: 0\n      e03: 0\n      e10: 0\n      e11: 1\n      e12: 0\n      e13: 0\n      e20: 0\n      e21: 0\n      e22: 1\n      e23: 0\n      e30: 0\n      e31: 0\n      e32: 0\n      e33: 1\n    m_UseCullingMatrixOverride: 0\n  m_Cookie: {fileID: 0}\n  m_DrawHalo: 0\n  m_Flare: {fileID: 0}\n  m_RenderMode: 0\n  m_CullingMask:\n    serializedVersion: 2\n    m_Bits: 4294967295\n  m_RenderingLayerMask: 1\n  m_Lightmapping: 4\n  m_LightShadowCasterMode: 0\n  m_AreaSize: {x: 1, y: 1}\n  m_BounceIntensity: 1\n  m_ColorTemperature: 6570\n  m_UseColorTemperature: 0\n  m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}\n  m_UseBoundingSphereOverride: 0\n  m_ShadowRadius: 0\n  m_ShadowAngle: 0\n--- !u!4 &958705226\nTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 958705224}\n  m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}\n  m_LocalPosition: {x: 0, y: 3, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 0}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}\n"
  },
  {
    "path": "Assets/FEM2D/Demo.unity.meta",
    "content": "fileFormatVersion: 2\nguid: 0ab61520f30dba1468adadce55fe25dd\ntimeCreated: 1488699394\nlicenseType: Pro\nDefaultImporter:\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Materials/TextureMaterial.mat",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!21 &2100000\nMaterial:\n  serializedVersion: 6\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_Name: TextureMaterial\n  m_Shader: {fileID: 4800000, guid: e66837fa03fca10469cf24b483791e6d, type: 3}\n  m_ShaderKeywords: \n  m_LightmapFlags: 4\n  m_EnableInstancingVariants: 0\n  m_DoubleSidedGI: 0\n  m_CustomRenderQueue: -1\n  stringTagMap: {}\n  disabledShaderPasses: []\n  m_SavedProperties:\n    serializedVersion: 3\n    m_TexEnvs:\n    - _BumpMap:\n        m_Texture: {fileID: 0}\n        m_Scale: {x: 1, y: 1}\n        m_Offset: {x: 0, y: 0}\n    - _DetailAlbedoMap:\n        m_Texture: {fileID: 0}\n        m_Scale: {x: 1, y: 1}\n        m_Offset: {x: 0, y: 0}\n    - _DetailMask:\n        m_Texture: {fileID: 0}\n        m_Scale: {x: 1, y: 1}\n        m_Offset: {x: 0, y: 0}\n    - _DetailNormalMap:\n        m_Texture: {fileID: 0}\n        m_Scale: {x: 1, y: 1}\n        m_Offset: {x: 0, y: 0}\n    - _EmissionMap:\n        m_Texture: {fileID: 0}\n        m_Scale: {x: 1, y: 1}\n        m_Offset: {x: 0, y: 0}\n    - _MainTex:\n        m_Texture: {fileID: 2800000, guid: 4df4a7e175870f94ca81a95b3d9c28f4, type: 3}\n        m_Scale: {x: 1, y: 1}\n        m_Offset: {x: 0, y: 0}\n    - _MetallicGlossMap:\n        m_Texture: {fileID: 0}\n        m_Scale: {x: 1, y: 1}\n        m_Offset: {x: 0, y: 0}\n    - _OcclusionMap:\n        m_Texture: {fileID: 0}\n        m_Scale: {x: 1, y: 1}\n        m_Offset: {x: 0, y: 0}\n    - _ParallaxMap:\n        m_Texture: {fileID: 0}\n        m_Scale: {x: 1, y: 1}\n        m_Offset: {x: 0, y: 0}\n    m_Floats:\n    - _BumpScale: 1\n    - _Cutoff: 0.5\n    - _DetailNormalMapScale: 1\n    - _DstBlend: 0\n    - _GlossMapScale: 1\n    - _Glossiness: 0.5\n    - _GlossyReflections: 1\n    - _Metallic: 0\n    - _Mode: 0\n    - _OcclusionStrength: 1\n    - _Parallax: 0.02\n    - _SmoothnessTextureChannel: 0\n    - _SpecularHighlights: 1\n    - _SrcBlend: 1\n    - _UVSec: 0\n    - _ZWrite: 1\n    m_Colors:\n    - _Color: {r: 1, g: 1, b: 1, a: 1}\n    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}\n  m_BuildTextureStacks: []\n"
  },
  {
    "path": "Assets/FEM2D/Materials/TextureMaterial.mat.meta",
    "content": "fileFormatVersion: 2\nguid: 716d33869f0597743928b3f83bbdbd52\ntimeCreated: 1514631150\nlicenseType: Free\nNativeFormatImporter:\n  externalObjects: {}\n  mainObjectFileID: 2100000\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Materials/TextureShader.shader",
    "content": "﻿Shader \"Unlit/TextureShader\"\n{\n\tProperties\n\t{\n\t\t_MainTex (\"Texture\", 2D) = \"white\" {}\n\t}\n\tSubShader\n\t{\n\t\tTags { \"RenderType\"=\"Opaque\" }\n\t\tLOD 100\n\n\t\tPass\n\t\t{\n\t\t\tCGPROGRAM\n\t\t\t#pragma vertex vert\n\t\t\t#pragma fragment frag\n\t\t\t// make fog work\n\t\t\t#pragma multi_compile_fog\n\t\t\t\n\t\t\t#include \"UnityCG.cginc\"\n\n\t\t\tstruct appdata\n\t\t\t{\n\t\t\t\tfloat4 vertex : POSITION;\n\t\t\t\tfloat2 uv : TEXCOORD0;\n\t\t\t};\n\n\t\t\tstruct v2f\n\t\t\t{\n\t\t\t\tfloat2 uv : TEXCOORD0;\n\t\t\t\tUNITY_FOG_COORDS(1)\n\t\t\t\tfloat4 vertex : SV_POSITION;\n\t\t\t};\n\n\t\t\tsampler2D _MainTex;\n\t\t\tfloat4 _MainTex_ST;\n\t\t\t\n\t\t\tv2f vert (appdata v)\n\t\t\t{\n\t\t\t\tv2f o;\n\t\t\t\to.vertex = UnityObjectToClipPos(v.vertex);\n\t\t\t\to.uv = TRANSFORM_TEX(v.uv, _MainTex);\n\t\t\t\tUNITY_TRANSFER_FOG(o,o.vertex);\n\t\t\t\treturn o;\n\t\t\t}\n\t\t\t\n\t\t\tfixed4 frag (v2f i) : SV_Target\n\t\t\t{\n\t\t\t\t// sample the texture\n\t\t\t\tfixed4 col = tex2D(_MainTex, i.uv);\n\t\t\t\t// apply fog\n\t\t\t\tUNITY_APPLY_FOG(i.fogCoord, col);\n\t\t\t\treturn col;\n\t\t\t}\n\t\t\tENDCG\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Assets/FEM2D/Materials/TextureShader.shader.meta",
    "content": "fileFormatVersion: 2\nguid: e66837fa03fca10469cf24b483791e6d\ntimeCreated: 1514631092\nlicenseType: Free\nShaderImporter:\n  externalObjects: {}\n  defaultTextures: []\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Materials.meta",
    "content": "fileFormatVersion: 2\nguid: 6ccc40a7591015c4f914ee5ef5e031b1\nfolderAsset: yes\ntimeCreated: 1514632914\nlicenseType: Free\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Scripts/CreateCantileverBeam.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nusing Common.Core.LinearAlgebra;\n\nnamespace FEM2D\r\n{\r\n\r\n    public static class CreateCantileverBeam\r\n    {\r\n\r\n        public static FEMScene Create(Vector2f origin, float scale, int numPoints, bool weld)\r\n        {\r\n            FEMScene Scene = new FEMScene();\r\n\r\n            Scene.Substeps = 40;\r\n            Scene.Drag = 1.0f;\r\n            Scene.LameLambda = 4000.0f;\r\n            Scene.LameMu = 4000.0f;\r\n            Scene.Damping = 200.0f;\r\n            Scene.Friction = 0.5f;\r\n            Scene.Toughness = 8000.0f;\r\n\r\n            float u = scale / (numPoints-1.0f);\r\n\r\n            for (int i = 0; i < numPoints; ++i)\r\n            {\r\n                Scene.Particles.Add(new FEMParticle(origin + new Vector2f(i * u, 0.0f), 1.0f));\r\n                Scene.Particles.Add(new FEMParticle(origin + new Vector2f(i * u, u), 1.0f));\r\n\r\n                if (i != 0)\r\n                {\r\n                    // add quad\r\n                    int start = (i - 1) * 2;\r\n\r\n                    Scene.Triangles.Add(new Triangle(start + 0, start + 2, start + 1));\r\n                    Scene.Triangles.Add(new Triangle(start + 1, start + 2, start + 3));\r\n                }\r\n            }\r\n\r\n            if (weld)\r\n            {\r\n                Scene.Particles[0].invMass = 0.0f;\r\n                Scene.Particles[1].invMass = 0.0f;\r\n            }\r\n\r\n            // assign index to particles\r\n            for (int i = 0; i < Scene.Particles.Count; ++i)\r\n                Scene.Particles[i].index = i;\r\n\r\n            Scene.CreateElements();\r\n\r\n            return Scene;\r\n        }\r\n\r\n    }\r\n\r\n}\n"
  },
  {
    "path": "Assets/FEM2D/Scripts/CreateCantileverBeam.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 28cacb6d1b62dc240b8580f8e3b751c3\ntimeCreated: 1514597507\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Scripts/CreateFromImage.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nusing Common.Core.LinearAlgebra;\n\nnamespace FEM2D\r\n{\r\n\r\n    public static class CreateFromImage\r\n    {\r\n\r\n        private static float resolution = 0.08f;\r\n        private static float scale = 2.0f;\r\n        private static float density = 140f;\r\n        private static float aspect;\r\n\r\n        private static Vector2f ToWorldPos(Vector2f p)\r\n        {\r\n            float x = (p.x - 0.5f) * scale;\r\n            float y = (p.y - 0.5f) * scale * aspect;\r\n\r\n            return new Vector2f(x, y);\r\n        }\r\n\r\n        public static FEMScene Create(Texture2D img)\r\n        {\r\n            FEMScene Scene = new FEMScene();\r\n\r\n            if (img == null) return Scene;\r\n\r\n            Scene.Substeps = 80;\r\n            Scene.Drag = 0.1f;\r\n            Scene.LameLambda = 42000.0f;\r\n            Scene.LameMu = 42000.0f;\r\n            Scene.Damping = 250.0f;\r\n            Scene.Friction = 0.8f;\r\n            Scene.Toughness = 40000.0f;\r\n\r\n            List<Vector2f> points = new List<Vector2f>();\r\n            List<Vector2f> bpoints = new List<Vector2f>();\r\n\r\n            // controls how finely the object is sampled\r\n            aspect = (float)img.height / img.width;\r\n\r\n            float fw = img.width;\r\n            float fh = img.height;\r\n\r\n            int inc = Mathf.FloorToInt(img.width * resolution);\r\n            int margin = Mathf.Max((inc - 1) / 2, 1);\r\n\r\n            // distribute points interior to the object or near it's boundary\r\n            for (int y = 0; y < img.height; y += inc)\r\n            {\r\n                for (int x = 0; x < img.width; x += inc)\r\n                {\r\n                    // if value non-zero then add a point\r\n                    int n = Neighbours(img, x, y, margin);\r\n\r\n                    if (n > 0)\r\n                    {\r\n                        Vector2f uv = new Vector2f(x / fw, y / fh);\r\n                        points.Add(uv);\r\n                    }\r\n                }\r\n            }\r\n\r\n            // distribute points on the boundary\r\n            for (int y = 0; y < img.height; y++)\r\n            {\r\n                for (int x = 0; x < img.width; x++)\r\n                {\r\n                    if (EdgeDetect(img, x, y))\r\n                    {\r\n                        Vector2f uv = new Vector2f(x / fw, y / fh);\r\n                        bpoints.Add(uv);\r\n                    }\r\n                }\r\n            }\r\n\r\n            // triangulate\r\n            int iterations = 7;\r\n\r\n            List<Vector2f> verts;\r\n            List<int> tris;\r\n            Mesher.TriangulateVariational(points, bpoints, iterations, out verts, out tris);\r\n\r\n            //no longer used\r\n            points = null;\r\n            bpoints = null;\r\n\r\n            // discard triangles whose centroid is not inside the shape\r\n            for (int i = 0; i < tris.Count;)\r\n            {\r\n                Vector2f p = verts[tris[i + 0]];\r\n                Vector2f q = verts[tris[i + 1]];\r\n                Vector2f r = verts[tris[i + 2]];\r\n\r\n                Vector2f c = (p + q + r) / 3.0f;\r\n\r\n                //int x = Mathf.FloorToInt(c.x * fw);\r\n                //int y = Mathf.FloorToInt(c.y * fh);\r\n                //Color col = img.GetPixel(x, y);\r\n\r\n                Color col = img.GetPixelBilinear(c.x, c.y);\r\n\r\n                if (col.grayscale == 0.0f)\r\n                    tris.RemoveRange(i, 3);\r\n                else\r\n                    i += 3;\r\n            }\r\n\r\n            // generate particles\r\n            for (int i = 0; i < verts.Count; ++i)\r\n            {\r\n                Vector2f uv = verts[i];\r\n                Scene.Particles.Add(new FEMParticle(ToWorldPos(uv), uv, 0.0f));\r\n            }\r\n\r\n            // generate elements and assign mass based on connected area\r\n            for (int t = 0; t < tris.Count; t += 3)\r\n            {\r\n                int i = tris[t];\r\n                int j = tris[t + 1];\r\n                int k = tris[t + 2];\r\n\r\n                // calculate tri area\r\n                Vector2f a = Scene.Particles[i].p;\r\n                Vector2f b = Scene.Particles[j].p;\r\n                Vector2f c = Scene.Particles[k].p;\r\n\r\n                float area = 0.5f * Vector2f.Cross(b - a, c - a);\r\n                float mass = density * area / 3.0f;\r\n\r\n                Scene.Particles[i].invMass += mass;\r\n                Scene.Particles[j].invMass += mass;\r\n                Scene.Particles[k].invMass += mass;\r\n\r\n                Scene.Triangles.Add(new Triangle(i, j, k));\r\n            }\r\n\r\n            // convert mass to invmass\r\n            for (int i = 0; i < Scene.Particles.Count; ++i)\r\n            {\r\n                if (Scene.Particles[i].invMass > 0.0f)\r\n                    Scene.Particles[i].invMass = 1.0f / Scene.Particles[i].invMass;\r\n            }\r\n\r\n            // assign index to particles\r\n            for (int i = 0; i < Scene.Particles.Count; ++i)\r\n                Scene.Particles[i].index = i;\r\n\r\n            Scene.CreateElements();\r\n\r\n            return Scene;\r\n        }\r\n\r\n        /// <summary>\r\n        /// return true if any pixels in box are non-zero \r\n        /// </summary>\r\n        private static int Neighbours(Texture2D img, int cx, int cy, int margin)\r\n        {\r\n            int xmin = Mathf.Max(0, cx - margin);\r\n            int xmax = Mathf.Min(cx + margin, img.width - 1);\r\n            int ymin = Mathf.Max(0, cy - margin);\r\n            int ymax = Mathf.Min(cy + margin, img.height - 1);\r\n\r\n            int count = 0;\r\n            for (int y = ymin; y <= ymax; ++y)\r\n            {\r\n                for (int x = xmin; x <= xmax; ++x)\r\n                {\r\n                    Color col = img.GetPixel(x, y);\r\n\r\n                    if (col.grayscale > 0.0f)\r\n                    {\r\n                        ++count;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return count;\r\n        }\r\n\r\n        private static bool EdgeDetect(Texture2D img, int x, int y)\r\n        {\r\n            Color colp0 = img.GetPixel(x + 1, y);\r\n            Color coln0 = img.GetPixel(x - 1, y);\r\n\r\n            if ((colp0.grayscale > 0.0f) != (coln0.grayscale > 0.0f))\r\n                return true;\r\n\r\n            Color col0p = img.GetPixel(x, y + 1);\r\n            Color col0n = img.GetPixel(x, y - 1);\r\n\r\n            if ((col0p.grayscale > 0.0f) != (col0n.grayscale > 0.0f))\r\n                return true;\r\n\r\n            return false;\r\n        }\r\n\r\n    }\r\n\r\n}\n"
  },
  {
    "path": "Assets/FEM2D/Scripts/CreateFromImage.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9b53bb4644f88484687638a032f37ea1\ntimeCreated: 1514625832\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Scripts/CreateRandomConvex.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nusing Common.Core.LinearAlgebra;\n\nnamespace FEM2D\r\n{\r\n\r\n    public static class CreateRandomConvex\r\n    {\r\n\r\n        public static FEMScene Create(Vector2f origin, float scale, int numPoints)\r\n        {\r\n            FEMScene Scene = new FEMScene();\r\n\r\n            Scene.Substeps = 40;\r\n            Scene.Drag = 1.0f;\r\n            Scene.LameLambda = 10000.0f;\r\n            Scene.LameMu = 10000.0f;\r\n            Scene.Damping = 80.0f;\r\n            Scene.Friction = 0.95f;\r\n            Scene.Toughness = 20000.0f;\r\n\r\n            List<Vector2f> points = new List<Vector2f>();\r\n\r\n            //Random.InitState(0);\r\n\r\n            for (int i = 0; i < numPoints; ++i)\r\n            {\r\n                float rx = Random.Range(-scale, scale) * 0.5f;\r\n                float ry = Random.Range(-scale, scale) * 0.5f;\r\n\r\n                points.Add(origin + new Vector2f(rx, ry));\r\n            }\r\n\r\n            List<Vector2f> verts;\r\n            List<int> tris;\r\n            Mesher.TriangulateDelaunay(points, out verts, out tris);\r\n\r\n            // generate elements\r\n            for (int i = 0; i < verts.Count; ++i)\r\n                Scene.Particles.Add(new FEMParticle(verts[i], 1.0f));\r\n\r\n            for (int i = 0; i < tris.Count / 3; ++i)\r\n                Scene.Triangles.Add(new Triangle(tris[i * 3], tris[i * 3 + 1], tris[i * 3 + 2]));\r\n\r\n            // assign index to particles\r\n            for (int i = 0; i < Scene.Particles.Count; ++i)\r\n                Scene.Particles[i].index = i;\r\n\r\n            Scene.CreateElements();\r\n\r\n            return Scene;\r\n        }\r\n\r\n    }\r\n\r\n}\n"
  },
  {
    "path": "Assets/FEM2D/Scripts/CreateRandomConvex.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c42a9d7090e6ce74ea170a267ecd28b4\ntimeCreated: 1514601543\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Scripts/CreateTorus.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nusing Common.Core.LinearAlgebra;\n\nnamespace FEM2D\r\n{\r\n\r\n    public static class CreateTorus\r\n    {\r\n\r\n        public static FEMScene Create(Vector2f origin, float inner, float outer, int segments)\r\n        {\r\n            FEMScene Scene = new FEMScene();\r\n\r\n            Scene.Substeps = 40;\r\n            Scene.Drag = 1.0f;\r\n            Scene.LameLambda = 10000.0f;\r\n            Scene.LameMu = 10000.0f;\r\n            Scene.Damping = 80.0f;\r\n            Scene.Friction = 0.95f;\r\n            Scene.Toughness = 20000.0f;\r\n\r\n            List<Vector2f> verts = new List<Vector2f>();\r\n            List<int> tris = new List<int>();\r\n\r\n            Mesher.CreateTorus(verts, tris, inner, outer, segments);\r\n\r\n            // generate elements\r\n            for (int i = 0; i < verts.Count; ++i)\r\n                Scene.Particles.Add(new FEMParticle(origin + verts[i], 1.0f));\r\n\r\n            for (int i = 0; i < tris.Count / 3; ++i)\r\n                Scene.Triangles.Add(new Triangle(tris[i * 3], tris[i * 3 + 1], tris[i * 3 + 2]));\r\n\r\n            // assign index to particles\r\n            for (int i = 0; i < Scene.Particles.Count; ++i)\r\n                Scene.Particles[i].index = i;\r\n\r\n            Scene.CreateElements();\r\n\r\n            return Scene;\r\n        }\r\n\r\n    }\r\n\r\n}\n"
  },
  {
    "path": "Assets/FEM2D/Scripts/CreateTorus.cs.meta",
    "content": "fileFormatVersion: 2\nguid: a1f44a96f585d494c9f236e5ed6e9d11\ntimeCreated: 1514615740\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Scripts/DelaunayTriangulation.cs",
    "content": "﻿\nusing System;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nusing Common.Core.LinearAlgebra;\n\nnamespace FEM2D\r\n{\r\n\r\n    public class DelaunayTriangle\r\n    {\r\n        public int i0, i1, i2;\r\n\r\n        public Vector2f CircumCenter;\r\n\r\n        public float CircumRadius;\r\n\r\n        public DelaunayTriangle(int i, int j, int k)\r\n        {\r\n            i0 = i;\r\n            i1 = j;\r\n            i2 = k;\r\n        }\r\n\r\n        public void CalculateCircumcircle(IList<Vector2f> vertices)\n\t    {\n            Vector2f p = vertices[i0];\n            Vector2f q = vertices[i1];\r\n            Vector2f r = vertices[i2];\r\n\r\n            // calculate the intersection of two perpendicular bisectors\r\n            Vector2f pq = q - p;\r\n            Vector2f qr = r - q;\r\n\r\n            // check winding\r\n            if(Vector2f.Cross(pq, qr) < 0.0f)\r\n                throw new InvalidOperationException(\"Triangle winding order incorrect\");\r\n\r\n            // mid-points of  edges \r\n            Vector2f a = 0.5f * (p + q);\r\n            Vector2f b = 0.5f * (q + r);\r\n            Vector2f u = pq.PerpendicularCCW;\r\n\r\n            float d = Vector2f.Dot(u, qr);\r\n            float t = Vector2f.Dot(b - a, qr) / d;\r\n\r\n            CircumCenter = a + t* u;\r\n            CircumRadius = (CircumCenter-p).Magnitude;\n\t    }\r\n\r\n        public void MakeCCW(IList<Vector2f> vertices)\r\n        {\r\n            if(TriArea(vertices) < 0.0f)\r\n            {\r\n                int tmp = i0;\r\n                i0 = i2;\r\n                i2 = tmp;\r\n            }\r\n        }\r\n\r\n        public float TriArea(IList<Vector2f> vertices)\r\n        {\r\n\r\n            Vector2f a = vertices[i0];\n            Vector2f b = vertices[i1];\r\n            Vector2f c = vertices[i2];\r\n\r\n            return 0.5f * (Vector2f.Cross(b - a, c - a));\r\n        }\r\n\r\n        public int this[int i]\r\n        {\r\n            get\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: return i0;\r\n                    case 1: return i1;\r\n                    case 2: return i2;\r\n                    default: throw new IndexOutOfRangeException(\"Index out of range: \" + i);\r\n                }\r\n            }\r\n            set\r\n            {\r\n                switch (i)\r\n                {\r\n                    case 0: i0 = value; break;\r\n                    case 1: i1 = value; break;\r\n                    case 2: i2 = value; break;\r\n                    default: throw new IndexOutOfRangeException(\"Index out of range: \" + i);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    public class Edge\r\n    {\r\n        public int i0, i1;\r\n\r\n        public Edge(int i, int j)\r\n        {\r\n            i0 = i;\r\n            i1 = j;\r\n        }\n\t};\r\n\r\n    public class DelaunayTriangulation\r\n    {\r\n\r\n        public List<Vector2f> Vertices;\r\n\r\n        public List<DelaunayTriangle> Triangles;\r\n\r\n        public DelaunayTriangulation()\r\n        {\r\n            Vertices = new List<Vector2f>();\r\n\r\n            Triangles = new List<DelaunayTriangle>();\r\n        }\r\n\r\n        public void Triangulate(IList<Vector2f> points)\r\n        {\r\n\r\n            Vertices.Clear();\r\n            Triangles.Clear();\r\n\r\n            AddBoundingTriangle(points);\r\n\r\n            int numPoints = points.Count;\r\n            if (numPoints < 3) return;\r\n\r\n            for (int i = 0; i < numPoints; ++i)\r\n                Insert(points[i]);\r\n\r\n            //Remove bounding triangle;\r\n            Vertices.RemoveRange(0, 3);\r\n\r\n            for (int i = 0; i < Triangles.Count;)\r\n            {\r\n                var t =Triangles[i];\r\n\r\n                // throw away tris connected to the initial bounding box \r\n                if (t.i0 < 3 || t.i1 < 3 || t.i2 < 3)\r\n                {\r\n                    Triangles.Remove(t);\r\n                }\r\n                else\r\n                {\r\n                    t.i0 -= 3;\r\n                    t.i1 -= 3;\r\n                    t.i2 -= 3;\r\n                    i++;\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        private void AddBoundingTriangle(IList<Vector2f> points)\r\n        {\r\n            Vector2f lower = Vector2f.PositiveInfinity;\r\n            Vector2f upper = Vector2f.NegativeInfinity;\r\n\r\n            int numPoints = points.Count;\r\n\r\n            // find bounding box\r\n            for (int i = 0; i < numPoints; ++i)\r\n            {\r\n                if (points[i].x < lower.x) lower.x = points[i].x;\r\n                if (points[i].y < lower.y) lower.y = points[i].y;\r\n\r\n                if (points[i].x > upper.x) upper.x = points[i].x;\r\n                if (points[i].y > upper.y) upper.y = points[i].y;\r\n            }\r\n\r\n            Vector2f margin = upper - lower;\r\n            lower -= margin;\r\n            upper += margin;\r\n\r\n            Vector2f extents = upper - lower;\r\n\r\n            // initialize triangulation with a bounding triangle \r\n            Vertices.Add(lower);\r\n            Vertices.Add(lower + 2.0f * new Vector2f(extents.x, 0.0f));\r\n            Vertices.Add(lower + 2.0f * new Vector2f(0.0f, extents.y));\r\n\r\n            var tri = new DelaunayTriangle(0, 1, 2);\r\n\r\n            tri.MakeCCW(Vertices);\r\n            tri.CalculateCircumcircle(Vertices);\r\n\r\n            Triangles.Add(tri);\r\n        }\r\n\r\n        private int ContainsEdge(List<Edge> edges, Edge e)\r\n        {\r\n\r\n            for(int i = 0; i < edges.Count; i++)\r\n            {\r\n                if (edges[i].i0 == e.i0 && edges[i].i1 == e.i1) return i;\r\n                if (edges[i].i0 == e.i1 && edges[i].i1 == e.i0) return i;\r\n            }\r\n\r\n            return -1;\r\n        }\r\n\r\n        private void Insert(Vector2f p)\r\n        {\r\n            List<Edge> edges = new List<Edge>();\r\n\r\n            int i = Vertices.Count;\r\n            Vertices.Add(p);\n\r\n            // find all triangles for which inserting this point would\r\n            // violate the Delaunay condition, that is, which triangles\r\n            // circumcircles does this point lie inside\r\n            for (int j = 0; j < Triangles.Count;)\r\n            {\r\n                var t = Triangles[j];\r\n\r\n                Vector2f a = Vertices[t.i0];\r\n                Vector2f b = Vertices[t.i1];\r\n                Vector2f c = Vertices[t.i2];\n\r\n                if ((t.CircumCenter - p).Magnitude < t.CircumRadius)\r\n                {\r\n                    for (int e = 0; e < 3; ++e)\r\n                    {\r\n                        Edge edge = new Edge(t[e], t[(e + 1) % 3]);\r\n\r\n                        // if edge doesn't already exist add it\r\n                        int index = ContainsEdge(edges, edge);\r\n\r\n                        if (index == -1)\r\n                            edges.Add(edge);\r\n                        else\r\n                            edges.RemoveAt(index);\r\n                    }\r\n\r\n                    // remove triangle\r\n                    Triangles.RemoveAt(j);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\r\n                    // next triangle\r\n                    ++j;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// re-triangulate point to the enclosing set of edges\n\t\t\tfor (int e = 0; e < edges.Count; ++e)\n\t\t\t{\n\t\t\t\tvar t = new DelaunayTriangle(edges[e].i0, edges[e].i1, i);\r\n\r\n                t.MakeCCW(Vertices);\r\n                t.CalculateCircumcircle(Vertices);\r\n\r\n                Triangles.Add(t);\n\t\t\t}\n\n\t\t}\r\n\r\n    }\r\n\r\n}\n"
  },
  {
    "path": "Assets/FEM2D/Scripts/DelaunayTriangulation.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 20ef28c4aeb64764d857a7de84df261f\ntimeCreated: 1514598499\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Scripts/FEMDemo.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nusing Common.Core.LinearAlgebra;\n\nnamespace FEM2D\r\n{\r\n\r\n    public enum FEM_SCENE { BEAM, RANDOM_CONVEX, TORUS, ARMADILLO, BUNNY, DONUT };\r\n\r\n    public class FEMDemo : MonoBehaviour\r\n    {\r\n\r\n        public FEM_SCENE option = FEM_SCENE.ARMADILLO;\r\n\r\n        public bool drawWireframe = false;\r\n\r\n        [HideInInspector]\r\n        public Texture2D armadillo, bunny, donut;\r\n\r\n        [HideInInspector]\r\n        public Material textureMaterial;\r\n\r\n        private Texture2D texture;\r\n\r\n        private FEMScene Scene;\r\n\r\n        private Vector2f MousePos;\r\n\r\n        private int MouseIndex;\r\n\r\n        private bool drawTexture;\r\n\r\n        private float mouseStrength = 1000;\r\n\r\n        private Material m_colorMaterial;\r\n        private Material ColorMaterial\r\n        {\r\n            get\r\n            {\r\n                if (m_colorMaterial == null)\r\n                    m_colorMaterial = new Material(Shader.Find(\"Hidden/Internal-Colored\"));\r\n                return m_colorMaterial;\r\n            }\r\n        }\r\n\r\n        void Start()\r\n        {\r\n\r\n            switch(option)\r\n            {\r\n                case FEM_SCENE.BEAM:\r\n                    drawWireframe = true;\r\n                    drawTexture = false;\r\n                    mouseStrength = 200;\r\n                    Scene = CreateCantileverBeam.Create(new Vector2f(-0.5f, 0.5f), 1.0f, 6, true);\r\n                    break;\r\n\r\n                case FEM_SCENE.RANDOM_CONVEX:\r\n                    drawWireframe = true;\r\n                    drawTexture = false;\r\n                    mouseStrength = 200;\r\n                    Scene = CreateRandomConvex.Create(new Vector2f(0.0f, 0.5f), 1.0f, 10);\r\n                    break;\r\n\r\n                case FEM_SCENE.TORUS:\r\n                    drawWireframe = true;\r\n                    drawTexture = false;\r\n                    mouseStrength = 200;\r\n                    Scene = CreateTorus.Create(new Vector2f(0.0f, 0.5f), 0.2f, 0.5f, 12);\r\n                    break;\r\n\r\n                case FEM_SCENE.ARMADILLO:\r\n                    drawTexture = true;\r\n                    texture = armadillo;\r\n                    mouseStrength = 2000;\r\n                    Scene = CreateFromImage.Create(texture);\r\n                    break;\r\n\r\n                case FEM_SCENE.BUNNY:\r\n                    drawTexture = true;\r\n                    texture = bunny;\r\n                    mouseStrength = 2000;\r\n                    Scene = CreateFromImage.Create(texture);\r\n                    break;\r\n\r\n                case FEM_SCENE.DONUT:\r\n                    drawTexture = true;\r\n                    texture = donut;\r\n                    mouseStrength = 2000;\r\n                    Scene = CreateFromImage.Create(texture);\r\n                    break;\r\n            }\r\n\r\n            Scene.Planes.Add(new Vector3f(0.0f, 1.0f, 1.8f));\r\n            Scene.Planes.Add(new Vector3f(1.0f, 0.0f, 2.8f));\r\n            Scene.Planes.Add(new Vector3f(-1.0f, 0.0f, 2.8f));\r\n\r\n            if (textureMaterial != null)\r\n                textureMaterial.SetTexture(\"_MainTex\", texture);\r\n        }\r\n\r\n        void FixedUpdate()\r\n        {\r\n\r\n            if (Scene == null) return;\r\n\r\n            float dt = Time.fixedDeltaTime;\r\n            int steps = Scene.Substeps;\r\n\r\n            dt /= steps;\r\n\r\n            Vector3 p = Input.mousePosition;\r\n            p = Camera.main.ScreenToWorldPoint(p);\r\n\r\n            MousePos = new Vector2f(p.x, p.y);\r\n\r\n            MouseIndex = -1;\r\n            if (Input.GetMouseButton(0))\r\n                MouseIndex = FindClosestParticle();\r\n\r\n            for (int i = 0; i < steps; ++i)\r\n            {\r\n                MoveByMouseDrag(dt);\r\n                Scene.Update(dt);\r\n            }\r\n\r\n        }\r\n\r\n        int FindClosestParticle()\r\n        {\r\n            float minDistSq = float.PositiveInfinity;\r\n            int minIndex = -1;\r\n\r\n            for (int i = 0; i < Scene.Particles.Count; ++i)\r\n            {\r\n                float d = (MousePos - Scene.Particles[i].p).Magnitude;\r\n\r\n                if (d < minDistSq)\r\n                {\r\n                    minDistSq = d;\r\n                    minIndex = i;\r\n                }\r\n            }\r\n            return minIndex;\r\n        }\r\n\r\n        void MoveByMouseDrag(float dt)\r\n        {\r\n\r\n            float dampStrength = 10;\r\n\r\n            if (MouseIndex != -1)\r\n            {\r\n                Vector2f pq = MousePos - Scene.Particles[MouseIndex].p;\r\n\r\n                Vector2f damp = -dampStrength * Vector2f.Dot(pq.Normalized, Scene.Particles[MouseIndex].v) * pq.Normalized;\r\n                Vector2f stretch = mouseStrength * pq;\r\n\r\n                Scene.Particles[MouseIndex].f += stretch + damp;\r\n            }\r\n        }\r\n\r\n        private void OnPostRender()\r\n        {\r\n            Camera camera = Camera.current;\r\n            if (camera == null) return;\r\n            if (Scene == null) return;\r\n\r\n            GL.PushMatrix();\r\n\r\n            GL.LoadIdentity();\r\n            GL.MultMatrix(camera.worldToCameraMatrix);\r\n            GL.LoadProjectionMatrix(camera.projectionMatrix);\r\n\r\n            DrawTexturedTriangles();\r\n            DrawLineTriangles();\r\n\r\n            DrawMouseLine();\r\n\r\n            DrawScenePlanes();\r\n            //DrawFracturePlanes();\r\n\r\n            DrawMouseVert();\r\n\r\n            DrawModelVerts();\r\n\r\n            GL.PopMatrix();\r\n        }\r\n\r\n        private void DrawPoint(Vector2f p, float s)\r\n        {\r\n            GL.Vertex3(p.x + s, p.y + s, 0.0f);\r\n            GL.Vertex3(p.x + s, p.y - s, 0.0f);\r\n            GL.Vertex3(p.x - s, p.y - s, 0.0f);\r\n            GL.Vertex3(p.x - s, p.y + s, 0.0f);\r\n        }\r\n\r\n        private void DrawPoint(Vector2 p, float s)\r\n        {\r\n            GL.Vertex3(p.x + s, p.y + s, 0.0f);\r\n            GL.Vertex3(p.x + s, p.y - s, 0.0f);\r\n            GL.Vertex3(p.x - s, p.y - s, 0.0f);\r\n            GL.Vertex3(p.x - s, p.y + s, 0.0f);\r\n        }\r\n\r\n        private void DrawMouseLine()\r\n        {\r\n            ColorMaterial.SetPass(0);\r\n            GL.Begin(GL.LINES);\r\n            GL.Color(Color.red);\r\n\r\n            if (MouseIndex != -1)\r\n            {\r\n                Vector2f v0 = Scene.Particles[MouseIndex].p;\r\n                Vector2f v1 = MousePos;\r\n\r\n                GL.Vertex3(v0.x, v0.y, 0.0f);\r\n                GL.Vertex3(v1.x, v1.y, 0.0f);\r\n            }\r\n\r\n            GL.End();\r\n        }\r\n\r\n        private void DrawScenePlanes()\r\n        {\r\n            ColorMaterial.SetPass(0);\r\n            GL.Begin(GL.LINES);\r\n            GL.Color(Color.red);\r\n\r\n            for (int i = 0; i < Scene.Planes.Count; ++i)\r\n            {\r\n                Vector3f plane = Scene.Planes[i];\r\n                Vector2f n = plane.xy;\r\n                Vector2f c = -plane.z * n;\r\n\r\n                Vector2f v0 = c + n.PerpendicularCCW * 100.0f;\r\n                Vector2f v1 = c - n.PerpendicularCCW * 100.0f;\r\n\r\n                GL.Vertex3(v0.x, v0.y, 0.0f);\r\n                GL.Vertex3(v1.x, v1.y, 0.0f);\r\n            }\r\n\r\n            GL.End();\r\n        }\r\n\r\n        private void DrawFracturePlanes()\r\n        {\r\n            ColorMaterial.SetPass(0);\r\n            GL.Begin(GL.LINES);\r\n            GL.Color(Color.green);\r\n\r\n            for (int i = 0; i < Scene.Fractures.Count; ++i)\r\n            {\r\n                Vector3f plane = Scene.Fractures[i].Plane;\r\n                Vector2f n = plane.xy;\r\n                Vector2f c = -plane.z * n;\r\n\r\n                Vector2f v0 = c + n.PerpendicularCCW * 100.0f;\r\n                Vector2f v1 = c - n.PerpendicularCCW * 100.0f;\r\n\r\n                GL.Vertex3(v0.x, v0.y, 0.0f);\r\n                GL.Vertex3(v1.x, v1.y, 0.0f);\r\n            }\r\n\r\n            GL.End();\r\n        }\r\n\r\n        private void DrawTexturedTriangles()\r\n        {\r\n\r\n            if (!drawTexture) return;\r\n            if (textureMaterial == null) return;\r\n            if (texture == null) return;\r\n\r\n            textureMaterial.SetPass(0);\r\n            textureMaterial.SetTexture(\"_MainTex\", texture);\r\n\r\n            GL.Begin(GL.TRIANGLES);\r\n\r\n            for (int i = 0; i < Scene.Triangles.Count; i++)\r\n            {\r\n                int i0 = Scene.Triangles[i].i;\r\n                int i1 = Scene.Triangles[i].j;\r\n                int i2 = Scene.Triangles[i].k;\r\n\r\n                Vector2f v0 = Scene.Particles[i0].p;\r\n                Vector2f v1 = Scene.Particles[i1].p;\r\n                Vector2f v2 = Scene.Particles[i2].p;\r\n\r\n                Vector2f uv0 = Scene.Particles[i0].uv;\r\n                Vector2f uv1 = Scene.Particles[i1].uv;\r\n                Vector2f uv2 = Scene.Particles[i2].uv;\r\n\r\n                //triangles are ccw but should be cw for drawing so flip them\r\n\r\n                GL.TexCoord2(uv2.x, uv2.y);\r\n                GL.Vertex3(v2.x, v2.y, 0.0f);\r\n\r\n                GL.TexCoord2(uv1.x, uv1.y);\r\n                GL.Vertex3(v1.x, v1.y, 0.0f);\r\n\r\n                GL.TexCoord2(uv0.x, uv0.y);\r\n                GL.Vertex3(v0.x, v0.y, 0.0f);\r\n                \r\n            }\r\n\r\n            GL.End();\r\n\r\n        }\r\n\r\n        private void DrawLineTriangles()\r\n        {\r\n            if (!drawWireframe) return;\r\n\r\n            ColorMaterial.SetPass(0);\r\n            GL.Begin(GL.LINES);\r\n            GL.Color(Color.blue);\r\n\r\n            for (int i = 0; i < Scene.Triangles.Count; i++)\r\n            {\r\n                int i0 = Scene.Triangles[i].i;\r\n                int i1 = Scene.Triangles[i].j;\r\n                int i2 = Scene.Triangles[i].k;\r\n\r\n                Vector2f v0 = Scene.Particles[i0].p;\r\n                Vector2f v1 = Scene.Particles[i1].p;\r\n                Vector2f v2 = Scene.Particles[i2].p;\r\n\r\n                GL.Vertex3(v0.x, v0.y, 0.0f);\r\n                GL.Vertex3(v1.x, v1.y, 0.0f);\r\n\r\n                GL.Vertex3(v0.x, v0.y, 0.0f);\r\n                GL.Vertex3(v2.x, v2.y, 0.0f);\r\n\r\n                GL.Vertex3(v2.x, v2.y, 0.0f);\r\n                GL.Vertex3(v1.x, v1.y, 0.0f);\r\n            }\r\n\r\n            GL.End();\r\n        }\r\n\r\n        private void DrawMouseVert()\r\n        {\r\n            ColorMaterial.SetPass(0);\r\n            GL.Begin(GL.QUADS);\r\n            GL.Color(Color.yellow);\r\n\r\n            if (MouseIndex != -1)\r\n            {\r\n                DrawPoint(MousePos, 0.005f);\r\n            }\r\n\r\n            GL.End();\r\n        }\r\n\r\n        private void DrawModelVerts()\r\n        {\r\n            if (!drawWireframe) return;\r\n\r\n            ColorMaterial.SetPass(0);\r\n            GL.Begin(GL.QUADS);\r\n            GL.Color(Color.yellow);\r\n\r\n            for (int i = 0; i < Scene.Particles.Count; i++)\r\n            {\r\n                DrawPoint(Scene.Particles[i].p, 0.005f);\r\n            }\r\n\r\n            GL.End();\r\n        }\r\n\r\n    }\r\n\r\n\r\n}\n"
  },
  {
    "path": "Assets/FEM2D/Scripts/FEMDemo.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 21b56fa4ac510b34d865a6cae689b006\ntimeCreated: 1514697612\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences:\n  - armadillo: {fileID: 2800000, guid: 8d4354cace070ef41a318c34670ff88a, type: 3}\n  - bunny: {fileID: 2800000, guid: 689440ccb80c6a348afee121dd2fa9e3, type: 3}\n  - donut: {fileID: 2800000, guid: 4df4a7e175870f94ca81a95b3d9c28f4, type: 3}\n  - textureMaterial: {fileID: 2100000, guid: 716d33869f0597743928b3f83bbdbd52, type: 2}\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Scripts/FEMElement.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nusing Common.Core.LinearAlgebra;\n\nnamespace FEM2D\r\n{\r\n    public class FEMElement\r\n    {\r\n        public FEMElement(Vector2f[] x)\r\n        {\r\n            Vector2f e1 = x[1] - x[0];\r\n            Vector2f e2 = x[2] - x[0];\r\n            Vector2f e3 = x[2] - x[1];\r\n\r\n            Matrix2x2f m = new Matrix2x2f();\r\n            m.SetColumn(0, e1);\r\n            m.SetColumn(1, e2);\r\n\r\n            mInvDm = m.Inverse;\r\n\r\n            mB = new Vector2f[3];\r\n            mB[0] = e3.PerpendicularCCW;\r\n            mB[1] = e2.PerpendicularCW;\r\n            mB[2] = e1.PerpendicularCCW;\r\n        }\r\n\r\n        public Matrix2x2f mInvDm; // inverse rest configuration\r\n        public Matrix2x2f mEp;    // plastic strain\r\n\r\n        public Vector2f[] mB;       // area weighted normals in material space\r\n    }\n}\n"
  },
  {
    "path": "Assets/FEM2D/Scripts/FEMElement.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 29457e410e915114ebb5a9f738e34e06\ntimeCreated: 1514543113\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Scripts/FEMFractureEvent.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nusing Common.Core.LinearAlgebra;\n\nnamespace FEM2D\r\n{\r\n    public struct FEMFractureEvent\r\n    {\r\n        public int Tri;\r\n        public int Node;\r\n        public Vector3f Plane;\r\n    }\n}\n"
  },
  {
    "path": "Assets/FEM2D/Scripts/FEMFractureEvent.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 44af2fa5db0b53846894b4e1292f6fe9\ntimeCreated: 1514543146\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Scripts/FEMParticle.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nusing Common.Core.LinearAlgebra;\n\nnamespace FEM2D\r\n{\r\n\r\n    public class FEMParticle\r\n    {\r\n\r\n        public Vector2f p;\r\n        public Vector2f v;\r\n        public Vector2f f;\r\n        public Vector2f c;\r\n        public Vector2f uv;\r\n        public float invMass;\r\n        public int index;\r\n        public float max;\r\n\r\n        public FEMParticle(Vector2f pos, float im)\r\n        {\r\n            p = pos;\r\n            invMass = im;\r\n            index = 0;\r\n        }\r\n\r\n        public FEMParticle(Vector2f pos, Vector2f uv, float im)\r\n        {\r\n            p = pos;\r\n            this.uv = uv;\r\n            invMass = im;\r\n            index = 0;\r\n        }\r\n\r\n        public FEMParticle Copy()\r\n        {\r\n            FEMParticle particle = new FEMParticle(p, invMass);\r\n            particle.v = v;\r\n            particle.f = f;\r\n            particle.c = c;\r\n            particle.index = index;\r\n            particle.max = max;\r\n\r\n            return particle;\r\n        }\r\n\r\n    }\n\n}\n"
  },
  {
    "path": "Assets/FEM2D/Scripts/FEMParticle.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 6944fa5b6e65d92449bcb768b46dba06\ntimeCreated: 1514543104\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Scripts/FEMScene.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nusing Common.Core.LinearAlgebra;\nusing Common.Mathematics.Decomposition;\n\nnamespace FEM2D\r\n{\r\n\r\n    public class FEMScene\r\n    {\r\n\r\n        public Vector2f Gravity = new Vector2f(0, -9.8f);\r\n\r\n        public float LameLambda = 1000.0f;\r\n\r\n        public float LameMu = 1000.0f;\r\n\r\n        public float Yield = 0.5f;\r\n\r\n        public float Creep = 25.0f;\r\n\r\n        public float Damping = 10.0f;\r\n\r\n        public float Drag = 0.0f;\r\n\r\n        public float Friction = 0.5f;\r\n\r\n        public float Toughness = 500.0f;\r\n\r\n        public int Substeps = 1;\r\n\r\n        public List<FEMParticle> Particles;\r\n\r\n        public List<Triangle> Triangles;\r\n\r\n        public List<FEMElement> Elements;\r\n\r\n        public List<Vector3f> Planes;\r\n\r\n        public List<FEMFractureEvent> Fractures;\r\n\r\n        private System.Random Rnd;\r\n\r\n        public FEMScene()\r\n        {\r\n            Rnd = new System.Random(0);\r\n            Particles = new List<FEMParticle>();\r\n            Triangles = new List<Triangle>();\r\n            Planes = new List<Vector3f>();\r\n            Fractures = new List<FEMFractureEvent>();\r\n            Elements = new List<FEMElement>();\r\n        }\r\n\r\n        public void CreateElements()\r\n        {\r\n\r\n            // calculate inverse of the initial configuration\r\n            for (int i = 0; i < Triangles.Count; ++i)\r\n            {\r\n                Triangle t = Triangles[i];\r\n\r\n                // read particles into a local array\r\n                Vector2f[] x = new Vector2f[]\r\n                {\r\n                    Particles[t.i].p,\r\n                    Particles[t.j].p,\r\n                    Particles[t.k].p\r\n                };\r\n\r\n                Elements.Add(new FEMElement(x));\r\n            }\r\n\r\n        }\r\n\r\n        public void Update(float dt)\r\n        {\r\n\r\n            Fractures.Clear();\r\n\r\n            bool performFracture = true;\r\n\r\n            UpdateForces(dt, performFracture);\r\n\r\n            CollidePlanes();\r\n\r\n            IntegrateForces(dt);\r\n\r\n            if (performFracture)\r\n\t        {\r\n                //Not implemented\r\n            }\r\n\r\n        }\r\n\r\n        private void UpdateForces(float dt, bool performFracture)\r\n        {\r\n            \r\n            for (int i = 0; i < Particles.Count; ++i)\r\n            {\r\n\r\n                Particles[i].max = 0;\r\n\r\n                if (Particles[i].invMass > 0.0f)\r\n                    Particles[i].f += Gravity / Particles[i].invMass;\r\n                else\r\n                    Particles[i].f += Vector2f.Zero - Drag * Particles[i].v;\r\n            }\r\n\r\n            Vector2f[] x = new Vector2f[3];\r\n            Vector2f[] v = new Vector2f[3];\r\n\r\n            for (int i = 0; i < Triangles.Count; ++i)\r\n            {\r\n                Triangle tri = Triangles[i];\r\n                FEMElement elem = Elements[i];\r\n\r\n                x[0] = Particles[tri.i].p;\r\n                x[1] = Particles[tri.j].p;\r\n                x[2] = Particles[tri.k].p;\r\n\r\n                v[0] = Particles[tri.i].v;\r\n                v[1] = Particles[tri.j].v;\r\n                v[2] = Particles[tri.k].v;\r\n\r\n                if (performFracture)\r\n                {\r\n\t\t\t        Matrix2x2f f = CalcDeformation(x, elem.mInvDm);\r\n                    Matrix2x2f q = Decomposition2x2f.QRDecomposition(f);\r\n\r\n                    // strain \r\n                    Matrix2x2f e = CalcCauchyStrainTensor(q.Transpose * f);\r\n         \r\n                    // update plastic strain\r\n                    float ef = FrobeniusNorm(e);\r\n\t\t\r\n\t\t\t        if (ef > Yield)\r\n\t\t\t\t        elem.mEp +=  e * dt * Creep;\r\n\r\n                    const float epmax = 0.6f;\t\r\n\t\t\t        if (ef > epmax)\t\r\n\t\t\t\t        elem.mEp *= epmax / ef;  \r\n\r\n\t\t\t        // adjust strain\r\n\t\t\t        e -= elem.mEp;\r\n\r\n                    Matrix2x2f s = CalcStressTensor(e, LameLambda, LameMu);\r\n\r\n                    // damping forces\t\r\n                    Matrix2x2f dfdt = CalcDeformation(v, elem.mInvDm);\r\n                    Matrix2x2f dedt = CalcCauchyStrainTensorDt(q.Transpose * dfdt);\r\n                    Matrix2x2f dsdt = CalcStressTensor(dedt, Damping, Damping);\r\n\r\n                    Matrix2x2f p = s + dsdt;\r\n\r\n                    float e1, e2;\r\n                    Decomposition2x2f.EigenDecomposition(p, out e1, out e2);\r\n\r\n                    float me = Mathf.Max(e1, e2);\r\n\r\n\t\t\t        if (me > Toughness)\r\n\t\t\t        {\r\n\t\t\t\t        // calculate Eigenvector corresponding to max Eigenvalue\r\n\t\t\t\t        Vector2f ev = q * (new Vector2f(p.m01, me - p.m00)).Normalized;\r\n\r\n                        // pick a random vertex to split on\r\n                        int splitNode = Rnd.Next(0, 2);\r\n\r\n\t\t\t\t        // don't fracture immovable nodes\r\n\t\t\t\t        if (Particles[GetVertex(tri, splitNode)].invMass == 0.0f)\r\n\t\t\t\t\t        break;\r\n\r\n                        // fracture plane perpendicular to ev\r\n                        Vector3f plane = new Vector3f(ev.x, ev.y, -Vector2f.Dot(ev, Particles[GetVertex(tri, splitNode)].p));\r\n\r\n                        FEMFractureEvent fracture = new FEMFractureEvent();\r\n                        fracture.Tri = i;\r\n                        fracture.Node = splitNode;\r\n                        fracture.Plane = plane;\r\n\r\n                        //Fracture not implemented so these fracture planes are not used.\r\n                        Fractures.Add(fracture);\r\n\t\t\t        }\r\n\r\n                    // calculate force on each edge due to stress and distribute to the nodes\r\n                    Vector2f f1 = q * p * elem.mB[0];\r\n                    Vector2f f2 = q * p * elem.mB[1];\r\n                    Vector2f f3 = q * p * elem.mB[2];\r\n\r\n                    Particles[tri.i].f -= f1/3.0f;\r\n\t\t\t        Particles[tri.j].f -= f2/3.0f;\r\n\t\t\t        Particles[tri.k].f -= f3/3.0f;\r\n                }\r\n                else\r\n                {\r\n                    //This was the code used when fracturing was disabled\r\n                    //in the original. It seems very unstable for me. maybe\r\n                    //a bug or precision issue. Not used atm.\r\n\r\n                    Matrix2x2f f = CalcDeformation(x, elem.mInvDm);\r\n\r\n                    // elastic forces\r\n                    Matrix2x2f e = CalcGreenStrainTensor(f);\r\n                    Matrix2x2f s = CalcStressTensor(e, LameLambda, LameMu);\r\n\r\n                    // damping forces\t\r\n                    Matrix2x2f dfdt = CalcDeformation(v, elem.mInvDm);\r\n                    Matrix2x2f dedt = CalcGreenStrainTensorDt(f, dfdt);\r\n                    Matrix2x2f dsdt = CalcStressTensor(dedt, Damping, Damping);\r\n\r\n                    Matrix2x2f p = s + dsdt;\r\n\r\n                    float e1, e2;\r\n                    Decomposition2x2f.EigenDecomposition(p, out e1, out e2);\r\n                    float me = Mathf.Max(e1, e2);\r\n\r\n                    Matrix2x2f finv = f.Transpose.Inverse;\r\n\r\n                    Vector2f f1 = p * (finv * elem.mB[0]);\r\n                    Vector2f f2 = p * (finv * elem.mB[1]);\r\n                    Vector2f f3 = p * (finv * elem.mB[2]);\r\n\r\n                    Particles[tri.i].f -= f1 / 3.0f;\r\n                    Particles[tri.j].f -= f2 / 3.0f;\r\n                    Particles[tri.k].f -= f3 / 3.0f;\r\n\r\n                    Particles[tri.i].max += me / 3.0f;\r\n                    Particles[tri.j].max += me / 3.0f;\r\n                    Particles[tri.k].max += me / 3.0f;\r\n                }\r\n            }\r\n\r\n        }\r\n\r\n        private void IntegrateForces(float dt)\r\n        {\r\n            // integrate particles forward in time, symplectic Euler step \t\r\n            for (int i = 0; i < Particles.Count; ++i)\r\n            {\r\n                Particles[i].v += Particles[i].f * Particles[i].invMass * dt;\r\n                Particles[i].p += Particles[i].v * dt;\r\n                Particles[i].f = Vector2f.Zero;\r\n            }\r\n        }\r\n\r\n        private void CollidePlanes()\r\n        {\r\n\t        for (int i = 0; i < Particles.Count; ++i)\r\n\t        {\r\n\t\t        for (int p = 0; p < Planes.Count; ++p)\r\n\t\t        {\r\n                    Vector2f n = Planes[p].xy;\r\n                    float d = Vector2f.Dot(Particles[i].p, n) + Planes[p].z; \r\n\r\n\t\t\t        if (d < 0.0f)\r\n\t\t\t        {\r\n                        // push out of halfspace\r\n                        Particles[i].p -= d * n;\r\n\r\n                        // make relative velocity separating\r\n                        float rv = Vector2f.Dot(Particles[i].v, n);\r\n\r\n\t\t\t\t        if (rv< 0.0f)\r\n\t\t\t\t        {\r\n                            // zero normal velocity, material simulation will take care of restitution\r\n                            Vector2f nv = -rv * n;\r\n\r\n                            // friction\r\n                            Vector2f tv = (Particles[i].v + nv) * Friction;\r\n\r\n                            // update velocity\r\n                            Particles[i].v = tv;\r\n\t\t\t\t        }\r\n                    }\t\t\r\n\t\t        }\r\n\t        }\r\n        }\r\n\r\n        private int GetVertex(Triangle tri, int i)\r\n        {\r\n            if (i == 0)\r\n                return tri.i;\r\n            else if (i == 1)\r\n                return tri.j;\r\n            else if (i == 2)\r\n                return tri.k;\r\n            else\r\n                throw new IndexOutOfRangeException(\"Triangle index out of range\");\r\n        }\r\n\r\n        float FrobeniusNorm(Matrix2x2f m)\r\n        {\r\n            float f = 0.0f;\r\n\r\n            for (int i = 0; i < 2; ++i)\r\n                for (int j = 0; j < 2; ++j)\r\n                    f += m[i, j] * m[i, j];\r\n\r\n            return (float)Math.Sqrt(f);\r\n        }\r\n\r\n        /// <summary>\r\n        /// deformation gradient\r\n        /// </summary>\r\n        private Matrix2x2f CalcDeformation(Vector2f[] x, Matrix2x2f invM)\r\n        {\r\n            Vector2f e1 = x[1] - x[0];\r\n            Vector2f e2 = x[2] - x[0];\r\n\r\n            Matrix2x2f m = new Matrix2x2f();\r\n            m.SetColumn(0, e1);\r\n            m.SetColumn(1, e2);\r\n\r\n            // mapping from material coordinates to world coordinates\t\r\n            Matrix2x2f f = m * invM;\r\n            return f;\r\n        }\r\n\r\n        /// <summary>\r\n        /// calculate Green's non-linear strain tensor\r\n        /// </summary>\r\n        private Matrix2x2f CalcGreenStrainTensor(Matrix2x2f f)\r\n        {\r\n            Matrix2x2f e = (f.Transpose * f - Matrix2x2f.Identity) * 0.5f;\r\n            return e;\r\n        }\r\n\r\n        /// <summary>\r\n        /// calculate time derivative of Green's strain\r\n        /// </summary>\r\n        private Matrix2x2f CalcGreenStrainTensorDt(Matrix2x2f f, Matrix2x2f dfdt)\r\n        {\r\n            Matrix2x2f e = (f * dfdt.Transpose + dfdt * f.Transpose) * 0.5f;\r\n            return e;\r\n        }\r\n\r\n        /// <summary>\r\n        /// calculate Cauchy's linear strain tensor\r\n        /// </summary>\r\n        private Matrix2x2f CalcCauchyStrainTensor(Matrix2x2f f)\r\n        {\r\n            Matrix2x2f e = (f + f.Transpose) * 0.5f - Matrix2x2f.Identity;\r\n            return e;\r\n        }\r\n\r\n        /// <summary>\r\n        /// calculate time derivative of Cauchy's strain tensor\r\n        /// </summary>\r\n        private Matrix2x2f CalcCauchyStrainTensorDt(Matrix2x2f dfdt)\r\n        {\r\n            Matrix2x2f e = (dfdt + dfdt.Transpose) * 0.5f;\r\n            return e;\r\n        }\r\n\r\n        /// <summary>\r\n        /// calculate isotropic Hookean stress tensor, lambda and mu are the Lame parameters\r\n        /// </summary>\r\n        private Matrix2x2f CalcStressTensor(Matrix2x2f e, float lambda, float mu)\r\n        {\r\n            Matrix2x2f s = Matrix2x2f.Identity * e.Trace * lambda + e * mu * 2.0f;\r\n            return s;\r\n        }\r\n\r\n    }\r\n\r\n}\n"
  },
  {
    "path": "Assets/FEM2D/Scripts/FEMScene.cs.meta",
    "content": "fileFormatVersion: 2\nguid: da2457346ca976a47ba80cc04748d813\ntimeCreated: 1488701314\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Scripts/Mesher.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nusing Common.Core.LinearAlgebra;\n\nnamespace FEM2D\r\n{\r\n\r\n    public class Mesher\r\n    {\r\n\r\n        /// <summary>\r\n        /// incremental insert Delaunay triangulation based on Bowyer/Watson's algorithm\r\n        /// </summary>\r\n        public static void TriangulateDelaunay(List<Vector2f> points, out List<Vector2f> outPoints, out List<int> outTris)\n        {\n\n            var mesh = new DelaunayTriangulation();\n            mesh.Triangulate(points);\n\n            int vertCount = mesh.Vertices.Count;\n            int triCount = mesh.Triangles.Count;\n\n            outPoints = new List<Vector2f>(vertCount);\n            outTris = new List<int>(triCount * 3);\r\n\r\n            int offset = 0;\r\n\r\n            for (int i = offset; i < vertCount; ++i)\r\n            {\r\n                outPoints.Add(mesh.Vertices[i]);\r\n            }\r\n\r\n            for (int i = 0; i < triCount; ++i)\r\n            {\r\n                var t = mesh.Triangles[i];\r\n\r\n                // throw away tris connected to the initial bounding box \r\n                if (t.i0 < offset || t.i1 < offset || t.i2 < offset)\r\n                    continue;\r\n\r\n                outTris.Add(t.i0 - offset);\r\n                outTris.Add(t.i1 - offset);\r\n                outTris.Add(t.i2 - offset);\r\n            }\n\n        }\r\n\r\n        public static void CreateTorus(List<Vector2f> points, List<int> indices, float inner, float outer, int segments)\r\n        {\r\n\r\n            int b;\r\n\r\n            for (int i = 0; i < segments; ++i)\r\n            {\r\n                float theta = (float)i / segments * Mathf.PI * 2.0f;\r\n\r\n                float x = Mathf.Sin(theta);\r\n                float y = Mathf.Cos(theta);\r\n\r\n                points.Add(new Vector2f(x, y) * outer);\r\n                points.Add(new Vector2f(x, y) * inner);\r\n\r\n                if (i > 0)\r\n                {\r\n                    b = (i - 1) * 2;\r\n\r\n                    indices.Add(b + 0);\r\n                    indices.Add(b + 1);\r\n                    indices.Add(b + 2);\r\n\r\n                    indices.Add(b + 2);\r\n                    indices.Add(b + 1);\r\n                    indices.Add(b + 3);\r\n                }\r\n            }\r\n\r\n            b = points.Count - 2;\r\n\r\n            indices.Add(b + 0);\r\n            indices.Add(b + 1);\r\n            indices.Add(0);\r\n\r\n            indices.Add(0);\r\n            indices.Add(b + 1);\r\n            indices.Add(1);\r\n        }\r\n\r\n        /// <summary>\r\n        /// iterative optimisation algoirthm based on Variational Tetrahedral Meshing\r\n        /// </summary>\r\n        public static void TriangulateVariational(List<Vector2f> inPoints, List<Vector2f> bPoints, int iterations, out List<Vector2f> outPoints, out List<int> outTris)\n        {\r\n\r\n            Vector2f[] points = new Vector2f[inPoints.Count];\r\n            float[] weights = new float[inPoints.Count];\r\n\r\n            for (int i = 0; i < points.Length; ++i)\r\n                points[i] = inPoints[i];\r\n\r\n            var mesh = new DelaunayTriangulation();\r\n\r\n            for (int k = 0; k < iterations; ++k)\n\t        {\r\n                mesh.Triangulate(points);\r\n\r\n                Array.Clear(points, 0, points.Length);\r\n                Array.Clear(weights, 0, weights.Length);\r\n\r\n                // optimize boundary points\r\n                for (int i = 0; i < bPoints.Count; ++i)\n\t\t        {\n\t\t\t        int closest = 0;\r\n                    float closestDistSq = float.PositiveInfinity;\r\n\r\n                    Vector2f b = bPoints[i];\n\n\t\t\t        // find closest point (todo: use spatial hash)\n\t\t\t        for (int j = 0; j < mesh.Vertices.Count; ++j)\n\t\t\t        {\n\t\t\t\t        float dSq = (mesh.Vertices[j] - b).SqrMagnitude;\n\n\t\t\t\t        if (dSq < closestDistSq)\n\t\t\t\t        {\n\t\t\t\t\t        closest = j;\n\t\t\t\t\t        closestDistSq = dSq;\n\t\t\t\t        }\r\n                    }\r\n\r\n                    points[closest] -= b;\n\t\t\t        weights[closest] -= 1.0f;\n\t\t        }\r\n\r\n                // optimize interior points by moving them to the centroid of their 1-ring\r\n                for (int i = 0; i < mesh.Triangles.Count; ++i)\n\t\t        {\r\n                    var t = mesh.Triangles[i];\n\t\t\r\n                    float w = t.TriArea(mesh.Vertices);\n\n\t\t\t        for (int v = 0; v < 3; ++v)\t\n\t\t\t        {\n\t\t\t\t        int s = t[v];\n\n\t\t\t\t        if (weights[s] >= 0.0f)\n\t\t\t\t        {\n\t\t\t\t\t        points[s] += w * t.CircumCenter;\r\n                            weights[s] += w;\n\t\t\t\t        }\n\t\t\t        }\n\t\t        }\r\n\r\n                for (int i = 0; i < points.Length; ++i)\r\n                {\r\n                    points[i] /= weights[i];\r\n                }\r\n\r\n            }\r\n\r\n            mesh.Triangulate(points);\r\n\r\n            /*\r\n            points.resize(0);\n\t        points.assign(mesh.vertices.begin()+3, mesh.vertices.end());\n\n\t        // remove any sliver tris on the boundary\n\t        for (uint32_t i = 0; i<mesh.triangles.size();)\n\t        {\n\t\t        real q = mesh.TriangleQuality(i);\n\n\t\t        if (q > 3.0f)\n\t\t\t        mesh.triangles.erase(mesh.triangles.begin() + i);\n\t\t        else\n\t\t\t        ++i;\n\t        }\t\n            */\r\n\r\n            outPoints = new List<Vector2f>(mesh.Vertices);\n            outTris = new List<int>(mesh.Triangles.Count * 3);\r\n\n\t        for (int i = 0; i< mesh.Triangles.Count; ++i)\n\t        {\n\t\t        var t = mesh.Triangles[i];\r\n\r\n                outTris.Add(t.i0);\n\t\t        outTris.Add(t.i1);\n\t\t        outTris.Add(t.i2);\n\t        }\n\r\n        }\r\n    }\r\n\r\n}\n"
  },
  {
    "path": "Assets/FEM2D/Scripts/Mesher.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 0aec6e65a8759ea44b63d58e7680ddad\ntimeCreated: 1514598008\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Scripts/Triangle.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nusing Common.Core.LinearAlgebra;\n\nnamespace FEM2D\r\n{\r\n    public class Triangle\r\n    {\r\n        public int i, j, k;\r\n\r\n        public Triangle(int i, int j, int k)\r\n        {\r\n            this.i = i;\r\n            this.j = j;\r\n            this.k = k;\r\n        }\r\n    }\n}\n"
  },
  {
    "path": "Assets/FEM2D/Scripts/Triangle.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 35ec53c1f7d74e54fbf9b83612e93df7\ntimeCreated: 1514543471\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Scripts.meta",
    "content": "fileFormatVersion: 2\nguid: 6a97a42ecbc1e4149bb3100fd18cc420\nfolderAsset: yes\ntimeCreated: 1514543123\nlicenseType: Free\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Textures/armadillo.png.meta",
    "content": "fileFormatVersion: 2\nguid: 8d4354cace070ef41a318c34670ff88a\ntimeCreated: 1514625724\nlicenseType: Free\nTextureImporter:\n  fileIDToRecycleName: {}\n  externalObjects: {}\n  serializedVersion: 4\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 1\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: -1\n    aniso: -1\n    mipBias: -1\n    wrapU: 1\n    wrapV: 1\n    wrapW: 1\n  nPOTScale: 0\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaUsage: 1\n  alphaIsTransparency: 0\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  platformSettings:\n  - buildTarget: DefaultTexturePlatform\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n  - buildTarget: Standalone\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Textures/bunny.png.meta",
    "content": "fileFormatVersion: 2\nguid: 689440ccb80c6a348afee121dd2fa9e3\ntimeCreated: 1514625724\nlicenseType: Free\nTextureImporter:\n  fileIDToRecycleName: {}\n  externalObjects: {}\n  serializedVersion: 4\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 1\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: -1\n    aniso: -1\n    mipBias: -1\n    wrapU: 1\n    wrapV: 1\n    wrapW: 1\n  nPOTScale: 0\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaUsage: 1\n  alphaIsTransparency: 0\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  platformSettings:\n  - buildTarget: DefaultTexturePlatform\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n  - buildTarget: Standalone\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Textures/donut1.png.meta",
    "content": "fileFormatVersion: 2\nguid: 4df4a7e175870f94ca81a95b3d9c28f4\ntimeCreated: 1514625724\nlicenseType: Free\nTextureImporter:\n  fileIDToRecycleName: {}\n  externalObjects: {}\n  serializedVersion: 4\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 1\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: -1\n    aniso: -1\n    mipBias: -1\n    wrapU: 1\n    wrapV: 1\n    wrapW: 1\n  nPOTScale: 0\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spritePixelsToUnits: 100\n  alphaUsage: 1\n  alphaIsTransparency: 0\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  platformSettings:\n  - buildTarget: DefaultTexturePlatform\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n  - buildTarget: Standalone\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 0\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n  spritePackingTag: \n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D/Textures.meta",
    "content": "fileFormatVersion: 2\nguid: 7a3c443360e76cc4a856e4c16eaccd25\nfolderAsset: yes\ntimeCreated: 1514625721\nlicenseType: Free\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Assets/FEM2D.meta",
    "content": "fileFormatVersion: 2\nguid: 7abf378388cbc1e42a90855390a552b4\nfolderAsset: yes\ntimeCreated: 1514536684\nlicenseType: Free\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 Justin\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\nThe MIT License (MIT)\n\nCopyright (c) 2016 Miles Macklin\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Packages/manifest.json",
    "content": "{\n  \"dependencies\": {\n    \"com.unity.collab-proxy\": \"1.3.9\",\n    \"com.unity.ide.rider\": \"1.2.1\",\n    \"com.unity.ide.visualstudio\": \"2.0.2\",\n    \"com.unity.ide.vscode\": \"1.2.1\",\n    \"com.unity.test-framework\": \"1.1.16\",\n    \"com.unity.textmeshpro\": \"3.0.1\",\n    \"com.unity.timeline\": \"1.3.5\",\n    \"com.unity.ugui\": \"1.0.0\",\n    \"com.unity.modules.ai\": \"1.0.0\",\n    \"com.unity.modules.androidjni\": \"1.0.0\",\n    \"com.unity.modules.animation\": \"1.0.0\",\n    \"com.unity.modules.assetbundle\": \"1.0.0\",\n    \"com.unity.modules.audio\": \"1.0.0\",\n    \"com.unity.modules.cloth\": \"1.0.0\",\n    \"com.unity.modules.director\": \"1.0.0\",\n    \"com.unity.modules.imageconversion\": \"1.0.0\",\n    \"com.unity.modules.imgui\": \"1.0.0\",\n    \"com.unity.modules.jsonserialize\": \"1.0.0\",\n    \"com.unity.modules.particlesystem\": \"1.0.0\",\n    \"com.unity.modules.physics\": \"1.0.0\",\n    \"com.unity.modules.physics2d\": \"1.0.0\",\n    \"com.unity.modules.screencapture\": \"1.0.0\",\n    \"com.unity.modules.terrain\": \"1.0.0\",\n    \"com.unity.modules.terrainphysics\": \"1.0.0\",\n    \"com.unity.modules.tilemap\": \"1.0.0\",\n    \"com.unity.modules.ui\": \"1.0.0\",\n    \"com.unity.modules.uielements\": \"1.0.0\",\n    \"com.unity.modules.umbra\": \"1.0.0\",\n    \"com.unity.modules.unityanalytics\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestassetbundle\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestaudio\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequesttexture\": \"1.0.0\",\n    \"com.unity.modules.unitywebrequestwww\": \"1.0.0\",\n    \"com.unity.modules.vehicles\": \"1.0.0\",\n    \"com.unity.modules.video\": \"1.0.0\",\n    \"com.unity.modules.vr\": \"1.0.0\",\n    \"com.unity.modules.wind\": \"1.0.0\",\n    \"com.unity.modules.xr\": \"1.0.0\"\n  }\n}\n"
  },
  {
    "path": "Packages/packages-lock.json",
    "content": "{\n  \"dependencies\": {\n    \"com.unity.collab-proxy\": {\n      \"version\": \"1.3.9\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.com\"\n    },\n    \"com.unity.ext.nunit\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 1,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.com\"\n    },\n    \"com.unity.ide.rider\": {\n      \"version\": \"1.2.1\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.test-framework\": \"1.1.1\"\n      },\n      \"url\": \"https://packages.unity.com\"\n    },\n    \"com.unity.ide.visualstudio\": {\n      \"version\": \"2.0.2\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.com\"\n    },\n    \"com.unity.ide.vscode\": {\n      \"version\": \"1.2.1\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.com\"\n    },\n    \"com.unity.test-framework\": {\n      \"version\": \"1.1.16\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ext.nunit\": \"1.0.0\",\n        \"com.unity.modules.imgui\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.com\"\n    },\n    \"com.unity.textmeshpro\": {\n      \"version\": \"3.0.1\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {\n        \"com.unity.ugui\": \"1.0.0\"\n      },\n      \"url\": \"https://packages.unity.com\"\n    },\n    \"com.unity.timeline\": {\n      \"version\": \"1.3.5\",\n      \"depth\": 0,\n      \"source\": \"registry\",\n      \"dependencies\": {},\n      \"url\": \"https://packages.unity.com\"\n    },\n    \"com.unity.ugui\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.imgui\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.ai\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.androidjni\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.animation\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.assetbundle\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.audio\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.cloth\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.director\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.animation\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.imageconversion\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.imgui\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.jsonserialize\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.particlesystem\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.physics\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.physics2d\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.screencapture\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.imageconversion\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.subsystems\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 1,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.terrain\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.terrainphysics\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\",\n        \"com.unity.modules.terrain\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.tilemap\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics2d\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.ui\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.uielements\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.imgui\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\",\n        \"com.unity.modules.uielementsnative\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.uielementsnative\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 1,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.imgui\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.umbra\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.unityanalytics\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequest\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.unitywebrequestassetbundle\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.assetbundle\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequestaudio\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.audio\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequesttexture\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.imageconversion\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.unitywebrequestwww\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequestassetbundle\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequestaudio\": \"1.0.0\",\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.assetbundle\": \"1.0.0\",\n        \"com.unity.modules.imageconversion\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.vehicles\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.video\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.audio\": \"1.0.0\",\n        \"com.unity.modules.ui\": \"1.0.0\",\n        \"com.unity.modules.unitywebrequest\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.vr\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.jsonserialize\": \"1.0.0\",\n        \"com.unity.modules.physics\": \"1.0.0\",\n        \"com.unity.modules.xr\": \"1.0.0\"\n      }\n    },\n    \"com.unity.modules.wind\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {}\n    },\n    \"com.unity.modules.xr\": {\n      \"version\": \"1.0.0\",\n      \"depth\": 0,\n      \"source\": \"builtin\",\n      \"dependencies\": {\n        \"com.unity.modules.physics\": \"1.0.0\",\n        \"com.unity.modules.jsonserialize\": \"1.0.0\",\n        \"com.unity.modules.subsystems\": \"1.0.0\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "ProjectSettings/AudioManager.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!11 &1\nAudioManager:\n  m_ObjectHideFlags: 0\n  serializedVersion: 2\n  m_Volume: 1\n  Rolloff Scale: 1\n  Doppler Factor: 1\n  Default Speaker Mode: 2\n  m_SampleRate: 0\n  m_DSPBufferSize: 1024\n  m_VirtualVoiceCount: 512\n  m_RealVoiceCount: 32\n  m_SpatializerPlugin: \n  m_AmbisonicDecoderPlugin: \n  m_DisableAudio: 0\n  m_VirtualizeEffects: 1\n  m_RequestedDSPBufferSize: 0\n"
  },
  {
    "path": "ProjectSettings/ClusterInputManager.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!236 &1\nClusterInputManager:\n  m_ObjectHideFlags: 0\n  m_Inputs: []\n"
  },
  {
    "path": "ProjectSettings/DynamicsManager.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!55 &1\nPhysicsManager:\n  m_ObjectHideFlags: 0\n  serializedVersion: 13\n  m_Gravity: {x: 0, y: -9.81, z: 0}\n  m_DefaultMaterial: {fileID: 0}\n  m_BounceThreshold: 2\n  m_DefaultMaxDepenetrationVelocity: 10\n  m_SleepThreshold: 0.005\n  m_DefaultContactOffset: 0.01\n  m_DefaultSolverIterations: 6\n  m_DefaultSolverVelocityIterations: 1\n  m_QueriesHitBackfaces: 0\n  m_QueriesHitTriggers: 1\n  m_EnableAdaptiveForce: 0\n  m_ClothInterCollisionDistance: 0.1\n  m_ClothInterCollisionStiffness: 0.2\n  m_ContactsGeneration: 1\n  m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n  m_AutoSimulation: 1\n  m_AutoSyncTransforms: 0\n  m_ReuseCollisionCallbacks: 0\n  m_ClothInterCollisionSettingsToggle: 0\n  m_ClothGravity: {x: 0, y: -9.81, z: 0}\n  m_ContactPairsMode: 0\n  m_BroadphaseType: 0\n  m_WorldBounds:\n    m_Center: {x: 0, y: 0, z: 0}\n    m_Extent: {x: 250, y: 250, z: 250}\n  m_WorldSubdivisions: 8\n  m_FrictionType: 0\n  m_EnableEnhancedDeterminism: 0\n  m_EnableUnifiedHeightmaps: 1\n  m_SolverType: 0\n  m_DefaultMaxAngularSpeed: 50\n"
  },
  {
    "path": "ProjectSettings/EditorBuildSettings.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!1045 &1\nEditorBuildSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 2\n  m_Scenes: []\n  m_configObjects: {}\n"
  },
  {
    "path": "ProjectSettings/EditorSettings.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!159 &1\nEditorSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 11\n  m_SerializationMode: 2\n  m_LineEndingsForNewScripts: 2\n  m_DefaultBehaviorMode: 0\n  m_PrefabRegularEnvironment: {fileID: 0}\n  m_PrefabUIEnvironment: {fileID: 0}\n  m_SpritePackerMode: 0\n  m_SpritePackerPaddingPower: 1\n  m_EtcTextureCompressorBehavior: 1\n  m_EtcTextureFastCompressor: 1\n  m_EtcTextureNormalCompressor: 2\n  m_EtcTextureBestCompressor: 4\n  m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;asmref;rsp\n  m_ProjectGenerationRootNamespace: \n  m_EnableTextureStreamingInEditMode: 1\n  m_EnableTextureStreamingInPlayMode: 1\n  m_AsyncShaderCompilation: 1\n  m_CachingShaderPreprocessor: 0\n  m_EnterPlayModeOptionsEnabled: 0\n  m_EnterPlayModeOptions: 3\n  m_GameObjectNamingDigits: 1\n  m_GameObjectNamingScheme: 0\n  m_AssetNamingUsesSpace: 1\n  m_UseLegacyProbeSampleCount: 0\n  m_SerializeInlineMappingsOnOneLine: 1\n  m_DisableCookiesInLightmapper: 0\n  m_AssetPipelineMode: 1\n  m_CacheServerMode: 0\n  m_CacheServerEndpoint: \n  m_CacheServerNamespacePrefix: default\n  m_CacheServerEnableDownload: 1\n  m_CacheServerEnableUpload: 1\n  m_CacheServerEnableAuth: 0\n  m_CacheServerEnableTls: 0\n"
  },
  {
    "path": "ProjectSettings/GraphicsSettings.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!30 &1\nGraphicsSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 13\n  m_Deferred:\n    m_Mode: 1\n    m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0}\n  m_DeferredReflections:\n    m_Mode: 1\n    m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0}\n  m_ScreenSpaceShadows:\n    m_Mode: 1\n    m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0}\n  m_LegacyDeferred:\n    m_Mode: 1\n    m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0}\n  m_DepthNormals:\n    m_Mode: 1\n    m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0}\n  m_MotionVectors:\n    m_Mode: 1\n    m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0}\n  m_LightHalo:\n    m_Mode: 1\n    m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0}\n  m_LensFlare:\n    m_Mode: 1\n    m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0}\n  m_VideoShadersIncludeMode: 2\n  m_AlwaysIncludedShaders:\n  - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0}\n  - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0}\n  - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0}\n  - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0}\n  - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}\n  - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}\n  - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0}\n  m_PreloadedShaders: []\n  m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}\n  m_CustomRenderPipeline: {fileID: 0}\n  m_TransparencySortMode: 0\n  m_TransparencySortAxis: {x: 0, y: 0, z: 1}\n  m_DefaultRenderingPath: 1\n  m_DefaultMobileRenderingPath: 1\n  m_TierSettings: []\n  m_LightmapStripping: 0\n  m_FogStripping: 0\n  m_InstancingStripping: 0\n  m_LightmapKeepPlain: 1\n  m_LightmapKeepDirCombined: 1\n  m_LightmapKeepDynamicPlain: 1\n  m_LightmapKeepDynamicDirCombined: 1\n  m_LightmapKeepShadowMask: 1\n  m_LightmapKeepSubtractive: 1\n  m_FogKeepLinear: 1\n  m_FogKeepExp: 1\n  m_FogKeepExp2: 1\n  m_AlbedoSwatchInfos: []\n  m_LightsUseLinearIntensity: 0\n  m_LightsUseColorTemperature: 0\n  m_LogWhenShaderIsCompiled: 0\n"
  },
  {
    "path": "ProjectSettings/InputManager.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!13 &1\nInputManager:\n  m_ObjectHideFlags: 0\n  serializedVersion: 2\n  m_Axes:\n  - serializedVersion: 3\n    m_Name: Horizontal\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: left\n    positiveButton: right\n    altNegativeButton: a\n    altPositiveButton: d\n    gravity: 3\n    dead: 0.001\n    sensitivity: 3\n    snap: 1\n    invert: 0\n    type: 0\n    axis: 0\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Vertical\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: down\n    positiveButton: up\n    altNegativeButton: s\n    altPositiveButton: w\n    gravity: 3\n    dead: 0.001\n    sensitivity: 3\n    snap: 1\n    invert: 0\n    type: 0\n    axis: 0\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Fire1\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: left ctrl\n    altNegativeButton: \n    altPositiveButton: mouse 0\n    gravity: 1000\n    dead: 0.001\n    sensitivity: 1000\n    snap: 0\n    invert: 0\n    type: 0\n    axis: 0\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Fire2\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: left alt\n    altNegativeButton: \n    altPositiveButton: mouse 1\n    gravity: 1000\n    dead: 0.001\n    sensitivity: 1000\n    snap: 0\n    invert: 0\n    type: 0\n    axis: 0\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Fire3\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: left shift\n    altNegativeButton: \n    altPositiveButton: mouse 2\n    gravity: 1000\n    dead: 0.001\n    sensitivity: 1000\n    snap: 0\n    invert: 0\n    type: 0\n    axis: 0\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Jump\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: space\n    altNegativeButton: \n    altPositiveButton: \n    gravity: 1000\n    dead: 0.001\n    sensitivity: 1000\n    snap: 0\n    invert: 0\n    type: 0\n    axis: 0\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Mouse X\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: \n    altNegativeButton: \n    altPositiveButton: \n    gravity: 0\n    dead: 0\n    sensitivity: 0.1\n    snap: 0\n    invert: 0\n    type: 1\n    axis: 0\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Mouse Y\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: \n    altNegativeButton: \n    altPositiveButton: \n    gravity: 0\n    dead: 0\n    sensitivity: 0.1\n    snap: 0\n    invert: 0\n    type: 1\n    axis: 1\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Mouse ScrollWheel\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: \n    altNegativeButton: \n    altPositiveButton: \n    gravity: 0\n    dead: 0\n    sensitivity: 0.1\n    snap: 0\n    invert: 0\n    type: 1\n    axis: 2\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Horizontal\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: \n    altNegativeButton: \n    altPositiveButton: \n    gravity: 0\n    dead: 0.19\n    sensitivity: 1\n    snap: 0\n    invert: 0\n    type: 2\n    axis: 0\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Vertical\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: \n    altNegativeButton: \n    altPositiveButton: \n    gravity: 0\n    dead: 0.19\n    sensitivity: 1\n    snap: 0\n    invert: 1\n    type: 2\n    axis: 1\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Fire1\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: joystick button 0\n    altNegativeButton: \n    altPositiveButton: \n    gravity: 1000\n    dead: 0.001\n    sensitivity: 1000\n    snap: 0\n    invert: 0\n    type: 0\n    axis: 0\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Fire2\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: joystick button 1\n    altNegativeButton: \n    altPositiveButton: \n    gravity: 1000\n    dead: 0.001\n    sensitivity: 1000\n    snap: 0\n    invert: 0\n    type: 0\n    axis: 0\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Fire3\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: joystick button 2\n    altNegativeButton: \n    altPositiveButton: \n    gravity: 1000\n    dead: 0.001\n    sensitivity: 1000\n    snap: 0\n    invert: 0\n    type: 0\n    axis: 0\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Jump\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: joystick button 3\n    altNegativeButton: \n    altPositiveButton: \n    gravity: 1000\n    dead: 0.001\n    sensitivity: 1000\n    snap: 0\n    invert: 0\n    type: 0\n    axis: 0\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Submit\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: return\n    altNegativeButton: \n    altPositiveButton: joystick button 0\n    gravity: 1000\n    dead: 0.001\n    sensitivity: 1000\n    snap: 0\n    invert: 0\n    type: 0\n    axis: 0\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Submit\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: enter\n    altNegativeButton: \n    altPositiveButton: space\n    gravity: 1000\n    dead: 0.001\n    sensitivity: 1000\n    snap: 0\n    invert: 0\n    type: 0\n    axis: 0\n    joyNum: 0\n  - serializedVersion: 3\n    m_Name: Cancel\n    descriptiveName: \n    descriptiveNegativeName: \n    negativeButton: \n    positiveButton: escape\n    altNegativeButton: \n    altPositiveButton: joystick button 1\n    gravity: 1000\n    dead: 0.001\n    sensitivity: 1000\n    snap: 0\n    invert: 0\n    type: 0\n    axis: 0\n    joyNum: 0\n"
  },
  {
    "path": "ProjectSettings/NavMeshAreas.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!126 &1\nNavMeshProjectSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 2\n  areas:\n  - name: Walkable\n    cost: 1\n  - name: Not Walkable\n    cost: 1\n  - name: Jump\n    cost: 2\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  - name: \n    cost: 1\n  m_LastAgentTypeID: -887442657\n  m_Settings:\n  - serializedVersion: 2\n    agentTypeID: 0\n    agentRadius: 0.5\n    agentHeight: 2\n    agentSlope: 45\n    agentClimb: 0.75\n    ledgeDropHeight: 0\n    maxJumpAcrossDistance: 0\n    minRegionArea: 2\n    manualCellSize: 0\n    cellSize: 0.16666667\n    manualTileSize: 0\n    tileSize: 256\n    accuratePlacement: 0\n    maxJobWorkers: 0\n    preserveTilesOutsideBounds: 0\n    debug:\n      m_Flags: 0\n  m_SettingNames:\n  - Humanoid\n"
  },
  {
    "path": "ProjectSettings/PackageManagerSettings.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!114 &1\nMonoBehaviour:\n  m_ObjectHideFlags: 61\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 0}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_EnablePreviewPackages: 0\n  m_EnablePackageDependencies: 0\n  m_AdvancedSettingsExpanded: 1\n  m_ScopedRegistriesSettingsExpanded: 1\n  oneTimeWarningShown: 0\n  m_Registries:\n  - m_Id: main\n    m_Name: \n    m_Url: https://packages.unity.com\n    m_Scopes: []\n    m_IsDefault: 1\n    m_Capabilities: 7\n  m_UserSelectedRegistryName: \n  m_UserAddingNewScopedRegistry: 0\n  m_RegistryInfoDraft:\n    m_ErrorMessage: \n    m_Original:\n      m_Id: \n      m_Name: \n      m_Url: \n      m_Scopes: []\n      m_IsDefault: 0\n      m_Capabilities: 0\n    m_Modified: 0\n    m_Name: \n    m_Url: \n    m_Scopes:\n    - \n    m_SelectedScopeIndex: 0\n"
  },
  {
    "path": "ProjectSettings/Physics2DSettings.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!19 &1\nPhysics2DSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 5\n  m_Gravity: {x: 0, y: -9.81}\n  m_DefaultMaterial: {fileID: 0}\n  m_VelocityIterations: 8\n  m_PositionIterations: 3\n  m_VelocityThreshold: 1\n  m_MaxLinearCorrection: 0.2\n  m_MaxAngularCorrection: 8\n  m_MaxTranslationSpeed: 100\n  m_MaxRotationSpeed: 360\n  m_BaumgarteScale: 0.2\n  m_BaumgarteTimeOfImpactScale: 0.75\n  m_TimeToSleep: 0.5\n  m_LinearSleepTolerance: 0.01\n  m_AngularSleepTolerance: 2\n  m_DefaultContactOffset: 0.01\n  m_JobOptions:\n    serializedVersion: 2\n    useMultithreading: 0\n    useConsistencySorting: 0\n    m_InterpolationPosesPerJob: 100\n    m_NewContactsPerJob: 30\n    m_CollideContactsPerJob: 100\n    m_ClearFlagsPerJob: 200\n    m_ClearBodyForcesPerJob: 200\n    m_SyncDiscreteFixturesPerJob: 50\n    m_SyncContinuousFixturesPerJob: 50\n    m_FindNearestContactsPerJob: 100\n    m_UpdateTriggerContactsPerJob: 100\n    m_IslandSolverCostThreshold: 100\n    m_IslandSolverBodyCostScale: 1\n    m_IslandSolverContactCostScale: 10\n    m_IslandSolverJointCostScale: 10\n    m_IslandSolverBodiesPerJob: 50\n    m_IslandSolverContactsPerJob: 50\n  m_SimulationMode: 0\n  m_QueriesHitTriggers: 1\n  m_QueriesStartInColliders: 1\n  m_CallbacksOnDisable: 1\n  m_ReuseCollisionCallbacks: 0\n  m_AutoSyncTransforms: 0\n  m_AlwaysShowColliders: 0\n  m_ShowColliderSleep: 1\n  m_ShowColliderContacts: 0\n  m_ShowColliderAABB: 0\n  m_ContactArrowScale: 0.2\n  m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412}\n  m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432}\n  m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745}\n  m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804}\n  m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n"
  },
  {
    "path": "ProjectSettings/PresetManager.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!1386491679 &1\nPresetManager:\n  m_ObjectHideFlags: 0\n  serializedVersion: 2\n  m_DefaultPresets: {}\n"
  },
  {
    "path": "ProjectSettings/ProjectSettings.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!129 &1\nPlayerSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 20\n  productGUID: 3b3617942226a3b43be6a56804ede4ff\n  AndroidProfiler: 0\n  AndroidFilterTouchesWhenObscured: 0\n  AndroidEnableSustainedPerformanceMode: 0\n  defaultScreenOrientation: 4\n  targetDevice: 2\n  useOnDemandResources: 0\n  accelerometerFrequency: 60\n  companyName: DefaultCompany\n  productName: 2D-Deformable-body-in-Unity\n  defaultCursor: {fileID: 0}\n  cursorHotspot: {x: 0, y: 0}\n  m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1}\n  m_ShowUnitySplashScreen: 1\n  m_ShowUnitySplashLogo: 1\n  m_SplashScreenOverlayOpacity: 1\n  m_SplashScreenAnimation: 1\n  m_SplashScreenLogoStyle: 1\n  m_SplashScreenDrawMode: 0\n  m_SplashScreenBackgroundAnimationZoom: 1\n  m_SplashScreenLogoAnimationZoom: 1\n  m_SplashScreenBackgroundLandscapeAspect: 1\n  m_SplashScreenBackgroundPortraitAspect: 1\n  m_SplashScreenBackgroundLandscapeUvs:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1\n    height: 1\n  m_SplashScreenBackgroundPortraitUvs:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1\n    height: 1\n  m_SplashScreenLogos: []\n  m_VirtualRealitySplashScreen: {fileID: 0}\n  m_HolographicTrackingLossScreen: {fileID: 0}\n  defaultScreenWidth: 1024\n  defaultScreenHeight: 768\n  defaultScreenWidthWeb: 960\n  defaultScreenHeightWeb: 600\n  m_StereoRenderingPath: 0\n  m_ActiveColorSpace: 0\n  m_MTRendering: 1\n  mipStripping: 0\n  numberOfMipsStripped: 0\n  m_StackTraceTypes: 010000000100000001000000010000000100000001000000\n  iosShowActivityIndicatorOnLoading: -1\n  androidShowActivityIndicatorOnLoading: -1\n  iosUseCustomAppBackgroundBehavior: 0\n  iosAllowHTTPDownload: 1\n  allowedAutorotateToPortrait: 1\n  allowedAutorotateToPortraitUpsideDown: 1\n  allowedAutorotateToLandscapeRight: 1\n  allowedAutorotateToLandscapeLeft: 1\n  useOSAutorotation: 1\n  use32BitDisplayBuffer: 1\n  preserveFramebufferAlpha: 0\n  disableDepthAndStencilBuffers: 0\n  androidStartInFullscreen: 1\n  androidRenderOutsideSafeArea: 1\n  androidUseSwappy: 1\n  androidBlitType: 0\n  defaultIsNativeResolution: 1\n  macRetinaSupport: 1\n  runInBackground: 0\n  captureSingleScreen: 0\n  muteOtherAudioSources: 0\n  Prepare IOS For Recording: 0\n  Force IOS Speakers When Recording: 0\n  deferSystemGesturesMode: 0\n  hideHomeButton: 0\n  submitAnalytics: 1\n  usePlayerLog: 1\n  bakeCollisionMeshes: 0\n  forceSingleInstance: 0\n  useFlipModelSwapchain: 1\n  resizableWindow: 0\n  useMacAppStoreValidation: 0\n  macAppStoreCategory: public.app-category.games\n  gpuSkinning: 0\n  xboxPIXTextureCapture: 0\n  xboxEnableAvatar: 0\n  xboxEnableKinect: 0\n  xboxEnableKinectAutoTracking: 0\n  xboxEnableFitness: 0\n  visibleInBackground: 1\n  allowFullscreenSwitch: 1\n  fullscreenMode: 1\n  xboxSpeechDB: 0\n  xboxEnableHeadOrientation: 0\n  xboxEnableGuest: 0\n  xboxEnablePIXSampling: 0\n  metalFramebufferOnly: 0\n  xboxOneResolution: 0\n  xboxOneSResolution: 0\n  xboxOneXResolution: 3\n  xboxOneMonoLoggingLevel: 0\n  xboxOneLoggingLevel: 1\n  xboxOneDisableEsram: 0\n  xboxOneEnableTypeOptimization: 0\n  xboxOnePresentImmediateThreshold: 0\n  switchQueueCommandMemory: 1048576\n  switchQueueControlMemory: 16384\n  switchQueueComputeMemory: 262144\n  switchNVNShaderPoolsGranularity: 33554432\n  switchNVNDefaultPoolsGranularity: 16777216\n  switchNVNOtherPoolsGranularity: 16777216\n  switchNVNMaxPublicTextureIDCount: 0\n  switchNVNMaxPublicSamplerIDCount: 0\n  stadiaPresentMode: 0\n  stadiaTargetFramerate: 0\n  vulkanNumSwapchainBuffers: 3\n  vulkanEnableSetSRGBWrite: 0\n  m_SupportedAspectRatios:\n    4:3: 1\n    5:4: 1\n    16:10: 1\n    16:9: 1\n    Others: 1\n  bundleVersion: 1.0\n  preloadedAssets: []\n  metroInputSource: 0\n  wsaTransparentSwapchain: 0\n  m_HolographicPauseOnTrackingLoss: 1\n  xboxOneDisableKinectGpuReservation: 1\n  xboxOneEnable7thCore: 1\n  vrSettings:\n    cardboard:\n      depthFormat: 0\n      enableTransitionView: 0\n    daydream:\n      depthFormat: 0\n      useSustainedPerformanceMode: 0\n      enableVideoLayer: 0\n      useProtectedVideoMemory: 0\n      minimumSupportedHeadTracking: 0\n      maximumSupportedHeadTracking: 1\n    hololens:\n      depthFormat: 1\n      depthBufferSharingEnabled: 1\n    lumin:\n      depthFormat: 0\n      frameTiming: 2\n      enableGLCache: 0\n      glCacheMaxBlobSize: 524288\n      glCacheMaxFileSize: 8388608\n    oculus:\n      sharedDepthBuffer: 1\n      dashSupport: 1\n      lowOverheadMode: 0\n      protectedContext: 0\n      v2Signing: 1\n    enable360StereoCapture: 0\n  isWsaHolographicRemotingEnabled: 0\n  enableFrameTimingStats: 0\n  useHDRDisplay: 0\n  D3DHDRBitDepth: 0\n  m_ColorGamuts: 00000000\n  targetPixelDensity: 0\n  resolutionScalingMode: 0\n  androidSupportedAspectRatio: 1\n  androidMaxAspectRatio: 2.1\n  applicationIdentifier: {}\n  buildNumber: {}\n  AndroidBundleVersionCode: 1\n  AndroidMinSdkVersion: 19\n  AndroidTargetSdkVersion: 0\n  AndroidPreferredInstallLocation: 1\n  aotOptions: \n  stripEngineCode: 1\n  iPhoneStrippingLevel: 0\n  iPhoneScriptCallOptimization: 0\n  ForceInternetPermission: 0\n  ForceSDCardPermission: 0\n  CreateWallpaper: 0\n  APKExpansionFiles: 0\n  keepLoadedShadersAlive: 0\n  StripUnusedMeshComponents: 0\n  VertexChannelCompressionMask: 4054\n  iPhoneSdkVersion: 988\n  iOSTargetOSVersionString: \n  tvOSSdkVersion: 0\n  tvOSRequireExtendedGameController: 0\n  tvOSTargetOSVersionString: \n  uIPrerenderedIcon: 0\n  uIRequiresPersistentWiFi: 0\n  uIRequiresFullScreen: 1\n  uIStatusBarHidden: 1\n  uIExitOnSuspend: 0\n  uIStatusBarStyle: 0\n  appleTVSplashScreen: {fileID: 0}\n  appleTVSplashScreen2x: {fileID: 0}\n  tvOSSmallIconLayers: []\n  tvOSSmallIconLayers2x: []\n  tvOSLargeIconLayers: []\n  tvOSLargeIconLayers2x: []\n  tvOSTopShelfImageLayers: []\n  tvOSTopShelfImageLayers2x: []\n  tvOSTopShelfImageWideLayers: []\n  tvOSTopShelfImageWideLayers2x: []\n  iOSLaunchScreenType: 0\n  iOSLaunchScreenPortrait: {fileID: 0}\n  iOSLaunchScreenLandscape: {fileID: 0}\n  iOSLaunchScreenBackgroundColor:\n    serializedVersion: 2\n    rgba: 0\n  iOSLaunchScreenFillPct: 100\n  iOSLaunchScreenSize: 100\n  iOSLaunchScreenCustomXibPath: \n  iOSLaunchScreeniPadType: 0\n  iOSLaunchScreeniPadImage: {fileID: 0}\n  iOSLaunchScreeniPadBackgroundColor:\n    serializedVersion: 2\n    rgba: 0\n  iOSLaunchScreeniPadFillPct: 100\n  iOSLaunchScreeniPadSize: 100\n  iOSLaunchScreeniPadCustomXibPath: \n  iOSUseLaunchScreenStoryboard: 0\n  iOSLaunchScreenCustomStoryboardPath: \n  iOSDeviceRequirements: []\n  iOSURLSchemes: []\n  iOSBackgroundModes: 0\n  iOSMetalForceHardShadows: 0\n  metalEditorSupport: 1\n  metalAPIValidation: 1\n  iOSRenderExtraFrameOnPause: 0\n  appleDeveloperTeamID: \n  iOSManualSigningProvisioningProfileID: \n  tvOSManualSigningProvisioningProfileID: \n  iOSManualSigningProvisioningProfileType: 0\n  tvOSManualSigningProvisioningProfileType: 0\n  appleEnableAutomaticSigning: 0\n  iOSRequireARKit: 0\n  iOSAutomaticallyDetectAndAddCapabilities: 1\n  appleEnableProMotion: 0\n  clonedFromGUID: 00000000000000000000000000000000\n  templatePackageId: \n  templateDefaultScene: \n  AndroidTargetArchitectures: 1\n  AndroidSplashScreenScale: 0\n  androidSplashScreen: {fileID: 0}\n  AndroidKeystoreName: \n  AndroidKeyaliasName: \n  AndroidBuildApkPerCpuArchitecture: 0\n  AndroidTVCompatibility: 0\n  AndroidIsGame: 1\n  AndroidEnableTango: 0\n  androidEnableBanner: 1\n  androidUseLowAccuracyLocation: 0\n  androidUseCustomKeystore: 0\n  m_AndroidBanners:\n  - width: 320\n    height: 180\n    banner: {fileID: 0}\n  androidGamepadSupportLevel: 0\n  AndroidMinifyWithR8: 0\n  AndroidMinifyRelease: 0\n  AndroidMinifyDebug: 0\n  AndroidValidateAppBundleSize: 1\n  AndroidAppBundleSizeToValidate: 150\n  m_BuildTargetIcons: []\n  m_BuildTargetPlatformIcons: []\n  m_BuildTargetBatching: []\n  m_BuildTargetGraphicsJobs: []\n  m_BuildTargetGraphicsJobMode: []\n  m_BuildTargetGraphicsAPIs: []\n  m_BuildTargetVRSettings: []\n  openGLRequireES31: 0\n  openGLRequireES31AEP: 0\n  openGLRequireES32: 0\n  m_TemplateCustomTags: {}\n  mobileMTRendering:\n    Android: 1\n    iPhone: 1\n    tvOS: 1\n  m_BuildTargetGroupLightmapEncodingQuality: []\n  m_BuildTargetGroupLightmapSettings: []\n  playModeTestRunnerEnabled: 0\n  runPlayModeTestAsEditModeTest: 0\n  actionOnDotNetUnhandledException: 1\n  enableInternalProfiler: 0\n  logObjCUncaughtExceptions: 1\n  enableCrashReportAPI: 0\n  cameraUsageDescription: \n  locationUsageDescription: \n  microphoneUsageDescription: \n  switchNMETAOverride: \n  switchNetLibKey: \n  switchSocketMemoryPoolSize: 6144\n  switchSocketAllocatorPoolSize: 128\n  switchSocketConcurrencyLimit: 14\n  switchScreenResolutionBehavior: 2\n  switchUseCPUProfiler: 0\n  switchUseGOLDLinker: 0\n  switchApplicationID: 0x01004b9000490000\n  switchNSODependencies: \n  switchTitleNames_0: \n  switchTitleNames_1: \n  switchTitleNames_2: \n  switchTitleNames_3: \n  switchTitleNames_4: \n  switchTitleNames_5: \n  switchTitleNames_6: \n  switchTitleNames_7: \n  switchTitleNames_8: \n  switchTitleNames_9: \n  switchTitleNames_10: \n  switchTitleNames_11: \n  switchTitleNames_12: \n  switchTitleNames_13: \n  switchTitleNames_14: \n  switchPublisherNames_0: \n  switchPublisherNames_1: \n  switchPublisherNames_2: \n  switchPublisherNames_3: \n  switchPublisherNames_4: \n  switchPublisherNames_5: \n  switchPublisherNames_6: \n  switchPublisherNames_7: \n  switchPublisherNames_8: \n  switchPublisherNames_9: \n  switchPublisherNames_10: \n  switchPublisherNames_11: \n  switchPublisherNames_12: \n  switchPublisherNames_13: \n  switchPublisherNames_14: \n  switchIcons_0: {fileID: 0}\n  switchIcons_1: {fileID: 0}\n  switchIcons_2: {fileID: 0}\n  switchIcons_3: {fileID: 0}\n  switchIcons_4: {fileID: 0}\n  switchIcons_5: {fileID: 0}\n  switchIcons_6: {fileID: 0}\n  switchIcons_7: {fileID: 0}\n  switchIcons_8: {fileID: 0}\n  switchIcons_9: {fileID: 0}\n  switchIcons_10: {fileID: 0}\n  switchIcons_11: {fileID: 0}\n  switchIcons_12: {fileID: 0}\n  switchIcons_13: {fileID: 0}\n  switchIcons_14: {fileID: 0}\n  switchSmallIcons_0: {fileID: 0}\n  switchSmallIcons_1: {fileID: 0}\n  switchSmallIcons_2: {fileID: 0}\n  switchSmallIcons_3: {fileID: 0}\n  switchSmallIcons_4: {fileID: 0}\n  switchSmallIcons_5: {fileID: 0}\n  switchSmallIcons_6: {fileID: 0}\n  switchSmallIcons_7: {fileID: 0}\n  switchSmallIcons_8: {fileID: 0}\n  switchSmallIcons_9: {fileID: 0}\n  switchSmallIcons_10: {fileID: 0}\n  switchSmallIcons_11: {fileID: 0}\n  switchSmallIcons_12: {fileID: 0}\n  switchSmallIcons_13: {fileID: 0}\n  switchSmallIcons_14: {fileID: 0}\n  switchManualHTML: \n  switchAccessibleURLs: \n  switchLegalInformation: \n  switchMainThreadStackSize: 1048576\n  switchPresenceGroupId: \n  switchLogoHandling: 0\n  switchReleaseVersion: 0\n  switchDisplayVersion: 1.0.0\n  switchStartupUserAccount: 0\n  switchTouchScreenUsage: 0\n  switchSupportedLanguagesMask: 0\n  switchLogoType: 0\n  switchApplicationErrorCodeCategory: \n  switchUserAccountSaveDataSize: 0\n  switchUserAccountSaveDataJournalSize: 0\n  switchApplicationAttribute: 0\n  switchCardSpecSize: -1\n  switchCardSpecClock: -1\n  switchRatingsMask: 0\n  switchRatingsInt_0: 0\n  switchRatingsInt_1: 0\n  switchRatingsInt_2: 0\n  switchRatingsInt_3: 0\n  switchRatingsInt_4: 0\n  switchRatingsInt_5: 0\n  switchRatingsInt_6: 0\n  switchRatingsInt_7: 0\n  switchRatingsInt_8: 0\n  switchRatingsInt_9: 0\n  switchRatingsInt_10: 0\n  switchRatingsInt_11: 0\n  switchRatingsInt_12: 0\n  switchLocalCommunicationIds_0: \n  switchLocalCommunicationIds_1: \n  switchLocalCommunicationIds_2: \n  switchLocalCommunicationIds_3: \n  switchLocalCommunicationIds_4: \n  switchLocalCommunicationIds_5: \n  switchLocalCommunicationIds_6: \n  switchLocalCommunicationIds_7: \n  switchParentalControl: 0\n  switchAllowsScreenshot: 1\n  switchAllowsVideoCapturing: 1\n  switchAllowsRuntimeAddOnContentInstall: 0\n  switchDataLossConfirmation: 0\n  switchUserAccountLockEnabled: 0\n  switchSystemResourceMemory: 16777216\n  switchSupportedNpadStyles: 22\n  switchNativeFsCacheSize: 32\n  switchIsHoldTypeHorizontal: 0\n  switchSupportedNpadCount: 8\n  switchSocketConfigEnabled: 0\n  switchTcpInitialSendBufferSize: 32\n  switchTcpInitialReceiveBufferSize: 64\n  switchTcpAutoSendBufferSizeMax: 256\n  switchTcpAutoReceiveBufferSizeMax: 256\n  switchUdpSendBufferSize: 9\n  switchUdpReceiveBufferSize: 42\n  switchSocketBufferEfficiency: 4\n  switchSocketInitializeEnabled: 1\n  switchNetworkInterfaceManagerInitializeEnabled: 1\n  switchPlayerConnectionEnabled: 1\n  ps4NPAgeRating: 12\n  ps4NPTitleSecret: \n  ps4NPTrophyPackPath: \n  ps4ParentalLevel: 11\n  ps4ContentID: ED1633-NPXX51362_00-0000000000000000\n  ps4Category: 0\n  ps4MasterVersion: 01.00\n  ps4AppVersion: 01.00\n  ps4AppType: 0\n  ps4ParamSfxPath: \n  ps4VideoOutPixelFormat: 0\n  ps4VideoOutInitialWidth: 1920\n  ps4VideoOutBaseModeInitialWidth: 1920\n  ps4VideoOutReprojectionRate: 60\n  ps4PronunciationXMLPath: \n  ps4PronunciationSIGPath: \n  ps4BackgroundImagePath: \n  ps4StartupImagePath: \n  ps4StartupImagesFolder: \n  ps4IconImagesFolder: \n  ps4SaveDataImagePath: \n  ps4SdkOverride: \n  ps4BGMPath: \n  ps4ShareFilePath: \n  ps4ShareOverlayImagePath: \n  ps4PrivacyGuardImagePath: \n  ps4ExtraSceSysFile: \n  ps4NPtitleDatPath: \n  ps4RemotePlayKeyAssignment: -1\n  ps4RemotePlayKeyMappingDir: \n  ps4PlayTogetherPlayerCount: 0\n  ps4EnterButtonAssignment: 2\n  ps4ApplicationParam1: 0\n  ps4ApplicationParam2: 0\n  ps4ApplicationParam3: 0\n  ps4ApplicationParam4: 0\n  ps4DownloadDataSize: 0\n  ps4GarlicHeapSize: 2048\n  ps4ProGarlicHeapSize: 2560\n  playerPrefsMaxSize: 32768\n  ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ\n  ps4pnSessions: 1\n  ps4pnPresence: 1\n  ps4pnFriends: 1\n  ps4pnGameCustomData: 1\n  playerPrefsSupport: 0\n  enableApplicationExit: 0\n  resetTempFolder: 1\n  restrictedAudioUsageRights: 0\n  ps4UseResolutionFallback: 0\n  ps4ReprojectionSupport: 0\n  ps4UseAudio3dBackend: 0\n  ps4UseLowGarlicFragmentationMode: 1\n  ps4SocialScreenEnabled: 0\n  ps4ScriptOptimizationLevel: 2\n  ps4Audio3dVirtualSpeakerCount: 14\n  ps4attribCpuUsage: 0\n  ps4PatchPkgPath: \n  ps4PatchLatestPkgPath: \n  ps4PatchChangeinfoPath: \n  ps4PatchDayOne: 0\n  ps4attribUserManagement: 0\n  ps4attribMoveSupport: 0\n  ps4attrib3DSupport: 0\n  ps4attribShareSupport: 0\n  ps4attribExclusiveVR: 0\n  ps4disableAutoHideSplash: 0\n  ps4videoRecordingFeaturesUsed: 0\n  ps4contentSearchFeaturesUsed: 0\n  ps4CompatibilityPS5: 0\n  ps4GPU800MHz: 1\n  ps4attribEyeToEyeDistanceSettingVR: 0\n  ps4IncludedModules: []\n  ps4attribVROutputEnabled: 0\n  monoEnv: \n  splashScreenBackgroundSourceLandscape: {fileID: 0}\n  splashScreenBackgroundSourcePortrait: {fileID: 0}\n  blurSplashScreenBackground: 1\n  spritePackerPolicy: \n  webGLMemorySize: 32\n  webGLExceptionSupport: 1\n  webGLNameFilesAsHashes: 0\n  webGLDataCaching: 1\n  webGLDebugSymbols: 0\n  webGLEmscriptenArgs: \n  webGLModulesDirectory: \n  webGLTemplate: APPLICATION:Default\n  webGLAnalyzeBuildSize: 0\n  webGLUseEmbeddedResources: 0\n  webGLCompressionFormat: 0\n  webGLWasmArithmeticExceptions: 0\n  webGLLinkerTarget: 1\n  webGLThreadsSupport: 0\n  webGLDecompressionFallback: 0\n  scriptingDefineSymbols: {}\n  platformArchitecture: {}\n  scriptingBackend: {}\n  il2cppCompilerConfiguration: {}\n  managedStrippingLevel: {}\n  incrementalIl2cppBuild: {}\n  allowUnsafeCode: 0\n  useDeterministicCompilation: 1\n  additionalIl2CppArgs: \n  scriptingRuntimeVersion: 1\n  gcIncremental: 1\n  gcWBarrierValidation: 0\n  apiCompatibilityLevelPerPlatform: {}\n  m_RenderingPath: 1\n  m_MobileRenderingPath: 1\n  metroPackageName: 2D-Deformable-body-in-Unity\n  metroPackageVersion: \n  metroCertificatePath: \n  metroCertificatePassword: \n  metroCertificateSubject: \n  metroCertificateIssuer: \n  metroCertificateNotAfter: 0000000000000000\n  metroApplicationDescription: 2D-Deformable-body-in-Unity\n  wsaImages: {}\n  metroTileShortName: \n  metroTileShowName: 0\n  metroMediumTileShowName: 0\n  metroLargeTileShowName: 0\n  metroWideTileShowName: 0\n  metroSupportStreamingInstall: 0\n  metroLastRequiredScene: 0\n  metroDefaultTileSize: 1\n  metroTileForegroundText: 2\n  metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0}\n  metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1}\n  metroSplashScreenUseBackgroundColor: 0\n  platformCapabilities: {}\n  metroTargetDeviceFamilies: {}\n  metroFTAName: \n  metroFTAFileTypes: []\n  metroProtocolName: \n  XboxOneProductId: \n  XboxOneUpdateKey: \n  XboxOneSandboxId: \n  XboxOneContentId: \n  XboxOneTitleId: \n  XboxOneSCId: \n  XboxOneGameOsOverridePath: \n  XboxOnePackagingOverridePath: \n  XboxOneAppManifestOverridePath: \n  XboxOneVersion: 1.0.0.0\n  XboxOnePackageEncryption: 0\n  XboxOnePackageUpdateGranularity: 2\n  XboxOneDescription: \n  XboxOneLanguage:\n  - enus\n  XboxOneCapability: []\n  XboxOneGameRating: {}\n  XboxOneIsContentPackage: 0\n  XboxOneEnableGPUVariability: 1\n  XboxOneSockets: {}\n  XboxOneSplashScreen: {fileID: 0}\n  XboxOneAllowedProductIds: []\n  XboxOnePersistentLocalStorageSize: 0\n  XboxOneXTitleMemory: 8\n  XboxOneOverrideIdentityName: \n  XboxOneOverrideIdentityPublisher: \n  vrEditorSettings:\n    daydream:\n      daydreamIconForeground: {fileID: 0}\n      daydreamIconBackground: {fileID: 0}\n  cloudServicesEnabled: {}\n  luminIcon:\n    m_Name: \n    m_ModelFolderPath: \n    m_PortalFolderPath: \n  luminCert:\n    m_CertPath: \n    m_SignPackage: 1\n  luminIsChannelApp: 0\n  luminVersion:\n    m_VersionCode: 1\n    m_VersionName: \n  apiCompatibilityLevel: 6\n  cloudProjectId: \n  framebufferDepthMemorylessMode: 0\n  projectName: \n  organizationId: \n  cloudEnabled: 0\n  enableNativePlatformBackendsForNewInputSystem: 0\n  disableOldInputManagerSupport: 0\n  legacyClampBlendShapeWeights: 0\n  virtualTexturingSupportEnabled: 0\n"
  },
  {
    "path": "ProjectSettings/ProjectVersion.txt",
    "content": "m_EditorVersion: 2020.1.6f1\nm_EditorVersionWithRevision: 2020.1.6f1 (fc477ca6df10)\n"
  },
  {
    "path": "ProjectSettings/QualitySettings.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!47 &1\nQualitySettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 5\n  m_CurrentQuality: 5\n  m_QualitySettings:\n  - serializedVersion: 2\n    name: Very Low\n    pixelLightCount: 0\n    shadows: 0\n    shadowResolution: 0\n    shadowProjection: 1\n    shadowCascades: 1\n    shadowDistance: 15\n    shadowNearPlaneOffset: 3\n    shadowCascade2Split: 0.33333334\n    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}\n    shadowmaskMode: 0\n    skinWeights: 1\n    textureQuality: 1\n    anisotropicTextures: 0\n    antiAliasing: 0\n    softParticles: 0\n    softVegetation: 0\n    realtimeReflectionProbes: 0\n    billboardsFaceCameraPosition: 0\n    vSyncCount: 0\n    lodBias: 0.3\n    maximumLODLevel: 0\n    streamingMipmapsActive: 0\n    streamingMipmapsAddAllCameras: 1\n    streamingMipmapsMemoryBudget: 512\n    streamingMipmapsRenderersPerFrame: 512\n    streamingMipmapsMaxLevelReduction: 2\n    streamingMipmapsMaxFileIORequests: 1024\n    particleRaycastBudget: 4\n    asyncUploadTimeSlice: 2\n    asyncUploadBufferSize: 16\n    asyncUploadPersistentBuffer: 1\n    resolutionScalingFixedDPIFactor: 1\n    customRenderPipeline: {fileID: 0}\n    excludedTargetPlatforms: []\n  - serializedVersion: 2\n    name: Low\n    pixelLightCount: 0\n    shadows: 0\n    shadowResolution: 0\n    shadowProjection: 1\n    shadowCascades: 1\n    shadowDistance: 20\n    shadowNearPlaneOffset: 3\n    shadowCascade2Split: 0.33333334\n    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}\n    shadowmaskMode: 0\n    skinWeights: 2\n    textureQuality: 0\n    anisotropicTextures: 0\n    antiAliasing: 0\n    softParticles: 0\n    softVegetation: 0\n    realtimeReflectionProbes: 0\n    billboardsFaceCameraPosition: 0\n    vSyncCount: 0\n    lodBias: 0.4\n    maximumLODLevel: 0\n    streamingMipmapsActive: 0\n    streamingMipmapsAddAllCameras: 1\n    streamingMipmapsMemoryBudget: 512\n    streamingMipmapsRenderersPerFrame: 512\n    streamingMipmapsMaxLevelReduction: 2\n    streamingMipmapsMaxFileIORequests: 1024\n    particleRaycastBudget: 16\n    asyncUploadTimeSlice: 2\n    asyncUploadBufferSize: 16\n    asyncUploadPersistentBuffer: 1\n    resolutionScalingFixedDPIFactor: 1\n    customRenderPipeline: {fileID: 0}\n    excludedTargetPlatforms: []\n  - serializedVersion: 2\n    name: Medium\n    pixelLightCount: 1\n    shadows: 1\n    shadowResolution: 0\n    shadowProjection: 1\n    shadowCascades: 1\n    shadowDistance: 20\n    shadowNearPlaneOffset: 3\n    shadowCascade2Split: 0.33333334\n    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}\n    shadowmaskMode: 0\n    skinWeights: 2\n    textureQuality: 0\n    anisotropicTextures: 1\n    antiAliasing: 0\n    softParticles: 0\n    softVegetation: 0\n    realtimeReflectionProbes: 0\n    billboardsFaceCameraPosition: 0\n    vSyncCount: 1\n    lodBias: 0.7\n    maximumLODLevel: 0\n    streamingMipmapsActive: 0\n    streamingMipmapsAddAllCameras: 1\n    streamingMipmapsMemoryBudget: 512\n    streamingMipmapsRenderersPerFrame: 512\n    streamingMipmapsMaxLevelReduction: 2\n    streamingMipmapsMaxFileIORequests: 1024\n    particleRaycastBudget: 64\n    asyncUploadTimeSlice: 2\n    asyncUploadBufferSize: 16\n    asyncUploadPersistentBuffer: 1\n    resolutionScalingFixedDPIFactor: 1\n    customRenderPipeline: {fileID: 0}\n    excludedTargetPlatforms: []\n  - serializedVersion: 2\n    name: High\n    pixelLightCount: 2\n    shadows: 2\n    shadowResolution: 1\n    shadowProjection: 1\n    shadowCascades: 2\n    shadowDistance: 40\n    shadowNearPlaneOffset: 3\n    shadowCascade2Split: 0.33333334\n    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}\n    shadowmaskMode: 1\n    skinWeights: 2\n    textureQuality: 0\n    anisotropicTextures: 1\n    antiAliasing: 0\n    softParticles: 0\n    softVegetation: 1\n    realtimeReflectionProbes: 1\n    billboardsFaceCameraPosition: 1\n    vSyncCount: 1\n    lodBias: 1\n    maximumLODLevel: 0\n    streamingMipmapsActive: 0\n    streamingMipmapsAddAllCameras: 1\n    streamingMipmapsMemoryBudget: 512\n    streamingMipmapsRenderersPerFrame: 512\n    streamingMipmapsMaxLevelReduction: 2\n    streamingMipmapsMaxFileIORequests: 1024\n    particleRaycastBudget: 256\n    asyncUploadTimeSlice: 2\n    asyncUploadBufferSize: 16\n    asyncUploadPersistentBuffer: 1\n    resolutionScalingFixedDPIFactor: 1\n    customRenderPipeline: {fileID: 0}\n    excludedTargetPlatforms: []\n  - serializedVersion: 2\n    name: Very High\n    pixelLightCount: 3\n    shadows: 2\n    shadowResolution: 2\n    shadowProjection: 1\n    shadowCascades: 2\n    shadowDistance: 70\n    shadowNearPlaneOffset: 3\n    shadowCascade2Split: 0.33333334\n    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}\n    shadowmaskMode: 1\n    skinWeights: 4\n    textureQuality: 0\n    anisotropicTextures: 2\n    antiAliasing: 2\n    softParticles: 1\n    softVegetation: 1\n    realtimeReflectionProbes: 1\n    billboardsFaceCameraPosition: 1\n    vSyncCount: 1\n    lodBias: 1.5\n    maximumLODLevel: 0\n    streamingMipmapsActive: 0\n    streamingMipmapsAddAllCameras: 1\n    streamingMipmapsMemoryBudget: 512\n    streamingMipmapsRenderersPerFrame: 512\n    streamingMipmapsMaxLevelReduction: 2\n    streamingMipmapsMaxFileIORequests: 1024\n    particleRaycastBudget: 1024\n    asyncUploadTimeSlice: 2\n    asyncUploadBufferSize: 16\n    asyncUploadPersistentBuffer: 1\n    resolutionScalingFixedDPIFactor: 1\n    customRenderPipeline: {fileID: 0}\n    excludedTargetPlatforms: []\n  - serializedVersion: 2\n    name: Ultra\n    pixelLightCount: 4\n    shadows: 2\n    shadowResolution: 2\n    shadowProjection: 1\n    shadowCascades: 4\n    shadowDistance: 150\n    shadowNearPlaneOffset: 3\n    shadowCascade2Split: 0.33333334\n    shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}\n    shadowmaskMode: 1\n    skinWeights: 255\n    textureQuality: 0\n    anisotropicTextures: 2\n    antiAliasing: 2\n    softParticles: 1\n    softVegetation: 1\n    realtimeReflectionProbes: 1\n    billboardsFaceCameraPosition: 1\n    vSyncCount: 1\n    lodBias: 2\n    maximumLODLevel: 0\n    streamingMipmapsActive: 0\n    streamingMipmapsAddAllCameras: 1\n    streamingMipmapsMemoryBudget: 512\n    streamingMipmapsRenderersPerFrame: 512\n    streamingMipmapsMaxLevelReduction: 2\n    streamingMipmapsMaxFileIORequests: 1024\n    particleRaycastBudget: 4096\n    asyncUploadTimeSlice: 2\n    asyncUploadBufferSize: 16\n    asyncUploadPersistentBuffer: 1\n    resolutionScalingFixedDPIFactor: 1\n    customRenderPipeline: {fileID: 0}\n    excludedTargetPlatforms: []\n  m_PerPlatformDefaultQuality:\n    Android: 2\n    CloudRendering: 5\n    Lumin: 5\n    Nintendo Switch: 5\n    PS4: 5\n    Stadia: 5\n    Standalone: 5\n    WebGL: 3\n    Windows Store Apps: 5\n    XboxOne: 5\n    iPhone: 2\n    tvOS: 2\n"
  },
  {
    "path": "ProjectSettings/TagManager.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!78 &1\nTagManager:\n  serializedVersion: 2\n  tags: []\n  layers:\n  - Default\n  - TransparentFX\n  - Ignore Raycast\n  - \n  - Water\n  - UI\n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  - \n  m_SortingLayers:\n  - name: Default\n    uniqueID: 0\n    locked: 0\n"
  },
  {
    "path": "ProjectSettings/TimeManager.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!5 &1\nTimeManager:\n  m_ObjectHideFlags: 0\n  Fixed Timestep: 0.02\n  Maximum Allowed Timestep: 0.33333334\n  m_TimeScale: 1\n  Maximum Particle Timestep: 0.03\n"
  },
  {
    "path": "ProjectSettings/UnityConnectSettings.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!310 &1\nUnityConnectSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 1\n  m_Enabled: 0\n  m_TestMode: 0\n  m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events\n  m_EventUrl: https://cdp.cloud.unity3d.com/v1/events\n  m_ConfigUrl: https://config.uca.cloud.unity3d.com\n  m_TestInitMode: 0\n  CrashReportingSettings:\n    m_EventUrl: https://perf-events.cloud.unity3d.com\n    m_Enabled: 0\n    m_LogBufferSize: 10\n    m_CaptureEditorExceptions: 1\n  UnityPurchasingSettings:\n    m_Enabled: 0\n    m_TestMode: 0\n  UnityAnalyticsSettings:\n    m_Enabled: 0\n    m_TestMode: 0\n    m_InitializeOnStartup: 1\n  UnityAdsSettings:\n    m_Enabled: 0\n    m_InitializeOnStartup: 1\n    m_TestMode: 0\n    m_IosGameId: \n    m_AndroidGameId: \n    m_GameIds: {}\n    m_GameId: \n  PerformanceReportingSettings:\n    m_Enabled: 0\n"
  },
  {
    "path": "ProjectSettings/VFXManager.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!937362698 &1\nVFXManager:\n  m_ObjectHideFlags: 0\n  m_IndirectShader: {fileID: 0}\n  m_CopyBufferShader: {fileID: 0}\n  m_SortShader: {fileID: 0}\n  m_StripUpdateShader: {fileID: 0}\n  m_RenderPipeSettingsPath: \n  m_FixedTimeStep: 0.016666668\n  m_MaxDeltaTime: 0.05\n  m_CompiledVersion: 0\n  m_RuntimeVersion: 0\n"
  },
  {
    "path": "ProjectSettings/VersionControlSettings.asset",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!890905787 &1\nVersionControlSettings:\n  m_ObjectHideFlags: 0\n  m_Mode: Visible Meta Files\n  m_CollabEditorSettings:\n    inProgressEnabled: 1\n"
  },
  {
    "path": "ProjectSettings/XRSettings.asset",
    "content": "{\n    \"m_SettingKeys\": [\n        \"VR Device Disabled\",\n        \"VR Device User Alert\"\n    ],\n    \"m_SettingValues\": [\n        \"False\",\n        \"False\"\n    ]\n}"
  },
  {
    "path": "README.md",
    "content": "# 2D-Deformable-body-in-Unity\nA 2D Deformable body simulation in Unity using FEM\n\nThis a port of the 2D FEM project by [Miles Macklin](http://blog.mmacklin.com/) found [here](https://github.com/mmacklin/sandbox) from C++/OpenGL to C# Unity. The code is not that stable and the physics can break if pushed too far but its a nice introduction to deformable bodies using the Finite Element Method.\n\nThe original did also implement fracturing of the mesh but I have not fully ported that and probably wont. The project provides a few options to load the scene with various meshes and has some neat code that creates a mesh from a image.\n\nThere's a armadillo, bunny and a donut.\n\n![Armadillo](./Media/DeformableBody1.png)\n\n![Bunny](./Media/DeformableBody2.png)\n\nThere's also a few basic shapes created from code like a beam, torus and a random convex as shown below.\n\n![Randon Convex](./Media/DeformableBody3.png)\n\nAnd here's a GIF of the armadillo being thrown around.\n\n![Armadillo GIF](./Media/DeformableBody4.gif)\n\nList of physics projects\n\n[Position-Based-Dynamics](https://github.com/Scrawk/Position-Based-Dynamics)\\\n[PBD-Fluid-in-Unity](https://github.com/Scrawk/PBD-Fluid-in-Unity)\\\n[GPU-GEMS-NBody-Simulation](https://github.com/Scrawk/GPU-GEMS-NBody-Simulation)\\\n[GPU-GEMS-2D-Fluid-Simulation](https://github.com/Scrawk/GPU-GEMS-2D-Fluid-Simulation)\\\n[GPU-GEMS-3D-Fluid-Simulation](https://github.com/Scrawk/GPU-GEMS-3D-Fluid-Simulation)\\\n[CyclonePhysicsEngine](https://github.com/Scrawk/CyclonePhysicsEngine)\\\n[2D-Deformable-body-in-Unity](https://github.com/Scrawk/2D-Deformable-body-in-Unity)\n"
  }
]