diff options
Diffstat (limited to 'modules/mono/glue/Managed/Files/Basis.cs')
-rw-r--r-- | modules/mono/glue/Managed/Files/Basis.cs | 687 |
1 files changed, 0 insertions, 687 deletions
diff --git a/modules/mono/glue/Managed/Files/Basis.cs b/modules/mono/glue/Managed/Files/Basis.cs deleted file mode 100644 index c5e62b77c8..0000000000 --- a/modules/mono/glue/Managed/Files/Basis.cs +++ /dev/null @@ -1,687 +0,0 @@ -using System; -using System.Runtime.InteropServices; -#if REAL_T_IS_DOUBLE -using real_t = System.Double; -#else -using real_t = System.Single; -#endif - -namespace Godot -{ - [Serializable] - [StructLayout(LayoutKind.Sequential)] - public struct Basis : IEquatable<Basis> - { - // NOTE: x, y and z are public-only. Use Column0, Column1 and Column2 internally. - - /// <summary> - /// Returns the basis matrix’s x vector. - /// This is equivalent to <see cref="Column0"/>. - /// </summary> - public Vector3 x - { - get => Column0; - set => Column0 = value; - } - - /// <summary> - /// Returns the basis matrix’s y vector. - /// This is equivalent to <see cref="Column1"/>. - /// </summary> - public Vector3 y - { - get => Column1; - set => Column1 = value; - } - - /// <summary> - /// Returns the basis matrix’s z vector. - /// This is equivalent to <see cref="Column2"/>. - /// </summary> - public Vector3 z - { - get => Column2; - set => Column2 = value; - } - - public Vector3 Row0; - public Vector3 Row1; - public Vector3 Row2; - - public Vector3 Column0 - { - get => new Vector3(Row0.x, Row1.x, Row2.x); - set - { - this.Row0.x = value.x; - this.Row1.x = value.y; - this.Row2.x = value.z; - } - } - public Vector3 Column1 - { - get => new Vector3(Row0.y, Row1.y, Row2.y); - set - { - this.Row0.y = value.x; - this.Row1.y = value.y; - this.Row2.y = value.z; - } - } - public Vector3 Column2 - { - get => new Vector3(Row0.z, Row1.z, Row2.z); - set - { - this.Row0.z = value.x; - this.Row1.z = value.y; - this.Row2.z = value.z; - } - } - - public Vector3 Scale - { - get - { - real_t detSign = Mathf.Sign(Determinant()); - return detSign * new Vector3 - ( - new Vector3(this.Row0[0], this.Row1[0], this.Row2[0]).Length(), - new Vector3(this.Row0[1], this.Row1[1], this.Row2[1]).Length(), - new Vector3(this.Row0[2], this.Row1[2], this.Row2[2]).Length() - ); - } - } - - public Vector3 this[int columnIndex] - { - get - { - switch (columnIndex) - { - case 0: - return Column0; - case 1: - return Column1; - case 2: - return Column2; - default: - throw new IndexOutOfRangeException(); - } - } - set - { - switch (columnIndex) - { - case 0: - Column0 = value; - return; - case 1: - Column1 = value; - return; - case 2: - Column2 = value; - return; - default: - throw new IndexOutOfRangeException(); - } - } - } - - public real_t this[int columnIndex, int rowIndex] - { - get - { - switch (columnIndex) - { - case 0: - return Column0[rowIndex]; - case 1: - return Column1[rowIndex]; - case 2: - return Column2[rowIndex]; - default: - throw new IndexOutOfRangeException(); - } - } - set - { - switch (columnIndex) - { - case 0: - { - var column0 = Column0; - column0[rowIndex] = value; - Column0 = column0; - return; - } - case 1: - { - var column1 = Column1; - column1[rowIndex] = value; - Column1 = column1; - return; - } - case 2: - { - var column2 = Column2; - column2[rowIndex] = value; - Column2 = column2; - return; - } - default: - throw new IndexOutOfRangeException(); - } - } - } - - internal Quat RotationQuat() - { - Basis orthonormalizedBasis = Orthonormalized(); - real_t det = orthonormalizedBasis.Determinant(); - if (det < 0) - { - // Ensure that the determinant is 1, such that result is a proper rotation matrix which can be represented by Euler angles. - orthonormalizedBasis = orthonormalizedBasis.Scaled(Vector3.NegOne); - } - - return orthonormalizedBasis.Quat(); - } - - internal void SetQuatScale(Quat quat, Vector3 scale) - { - SetDiagonal(scale); - Rotate(quat); - } - - private void Rotate(Quat quat) - { - this *= new Basis(quat); - } - - private void SetDiagonal(Vector3 diagonal) - { - Row0 = new Vector3(diagonal.x, 0, 0); - Row1 = new Vector3(0, diagonal.y, 0); - Row2 = new Vector3(0, 0, diagonal.z); - } - - public real_t Determinant() - { - real_t cofac00 = Row1[1] * Row2[2] - Row1[2] * Row2[1]; - real_t cofac10 = Row1[2] * Row2[0] - Row1[0] * Row2[2]; - real_t cofac20 = Row1[0] * Row2[1] - Row1[1] * Row2[0]; - - return Row0[0] * cofac00 + Row0[1] * cofac10 + Row0[2] * cofac20; - } - - public Vector3 GetEuler() - { - Basis m = Orthonormalized(); - - Vector3 euler; - euler.z = 0.0f; - - real_t mzy = m.Row1[2]; - - if (mzy < 1.0f) - { - if (mzy > -1.0f) - { - euler.x = Mathf.Asin(-mzy); - euler.y = Mathf.Atan2(m.Row0[2], m.Row2[2]); - euler.z = Mathf.Atan2(m.Row1[0], m.Row1[1]); - } - else - { - euler.x = Mathf.Pi * 0.5f; - euler.y = -Mathf.Atan2(-m.Row0[1], m.Row0[0]); - } - } - else - { - euler.x = -Mathf.Pi * 0.5f; - euler.y = -Mathf.Atan2(-m.Row0[1], m.Row0[0]); - } - - return euler; - } - - public Vector3 GetRow(int index) - { - switch (index) - { - case 0: - return Row0; - case 1: - return Row1; - case 2: - return Row2; - default: - throw new IndexOutOfRangeException(); - } - } - - public void SetRow(int index, Vector3 value) - { - switch (index) - { - case 0: - Row0 = value; - return; - case 1: - Row1 = value; - return; - case 2: - Row2 = value; - return; - default: - throw new IndexOutOfRangeException(); - } - } - - public Vector3 GetColumn(int index) - { - return this[index]; - } - - public void SetColumn(int index, Vector3 value) - { - this[index] = value; - } - - [Obsolete("GetAxis is deprecated. Use GetColumn instead.")] - public Vector3 GetAxis(int axis) - { - return new Vector3(this.Row0[axis], this.Row1[axis], this.Row2[axis]); - } - - public int GetOrthogonalIndex() - { - var orth = this; - - for (int i = 0; i < 3; i++) - { - for (int j = 0; j < 3; j++) - { - var row = orth.GetRow(i); - - real_t v = row[j]; - - if (v > 0.5f) - v = 1.0f; - else if (v < -0.5f) - v = -1.0f; - else - v = 0f; - - row[j] = v; - - orth.SetRow(i, row); - } - } - - for (int i = 0; i < 24; i++) - { - if (orth == _orthoBases[i]) - return i; - } - - return 0; - } - - public Basis Inverse() - { - real_t cofac00 = Row1[1] * Row2[2] - Row1[2] * Row2[1]; - real_t cofac10 = Row1[2] * Row2[0] - Row1[0] * Row2[2]; - real_t cofac20 = Row1[0] * Row2[1] - Row1[1] * Row2[0]; - - real_t det = Row0[0] * cofac00 + Row0[1] * cofac10 + Row0[2] * cofac20; - - if (det == 0) - throw new InvalidOperationException("Matrix determinant is zero and cannot be inverted."); - - real_t detInv = 1.0f / det; - - real_t cofac01 = Row0[2] * Row2[1] - Row0[1] * Row2[2]; - real_t cofac02 = Row0[1] * Row1[2] - Row0[2] * Row1[1]; - real_t cofac11 = Row0[0] * Row2[2] - Row0[2] * Row2[0]; - real_t cofac12 = Row0[2] * Row1[0] - Row0[0] * Row1[2]; - real_t cofac21 = Row0[1] * Row2[0] - Row0[0] * Row2[1]; - real_t cofac22 = Row0[0] * Row1[1] - Row0[1] * Row1[0]; - - return new Basis - ( - cofac00 * detInv, cofac01 * detInv, cofac02 * detInv, - cofac10 * detInv, cofac11 * detInv, cofac12 * detInv, - cofac20 * detInv, cofac21 * detInv, cofac22 * detInv - ); - } - - public Basis Orthonormalized() - { - Vector3 column0 = GetColumn(0); - Vector3 column1 = GetColumn(1); - Vector3 column2 = GetColumn(2); - - column0.Normalize(); - column1 = column1 - column0 * column0.Dot(column1); - column1.Normalize(); - column2 = column2 - column0 * column0.Dot(column2) - column1 * column1.Dot(column2); - column2.Normalize(); - - return new Basis(column0, column1, column2); - } - - public Basis Rotated(Vector3 axis, real_t phi) - { - return new Basis(axis, phi) * this; - } - - public Basis Scaled(Vector3 scale) - { - var b = this; - b.Row0 *= scale.x; - b.Row1 *= scale.y; - b.Row2 *= scale.z; - return b; - } - - public real_t Tdotx(Vector3 with) - { - return this.Row0[0] * with[0] + this.Row1[0] * with[1] + this.Row2[0] * with[2]; - } - - public real_t Tdoty(Vector3 with) - { - return this.Row0[1] * with[0] + this.Row1[1] * with[1] + this.Row2[1] * with[2]; - } - - public real_t Tdotz(Vector3 with) - { - return this.Row0[2] * with[0] + this.Row1[2] * with[1] + this.Row2[2] * with[2]; - } - - public Basis Transposed() - { - var tr = this; - - real_t temp = tr.Row0[1]; - tr.Row0[1] = tr.Row1[0]; - tr.Row1[0] = temp; - - temp = tr.Row0[2]; - tr.Row0[2] = tr.Row2[0]; - tr.Row2[0] = temp; - - temp = tr.Row1[2]; - tr.Row1[2] = tr.Row2[1]; - tr.Row2[1] = temp; - - return tr; - } - - public Vector3 Xform(Vector3 v) - { - return new Vector3 - ( - this.Row0.Dot(v), - this.Row1.Dot(v), - this.Row2.Dot(v) - ); - } - - public Vector3 XformInv(Vector3 v) - { - return new Vector3 - ( - this.Row0[0] * v.x + this.Row1[0] * v.y + this.Row2[0] * v.z, - this.Row0[1] * v.x + this.Row1[1] * v.y + this.Row2[1] * v.z, - this.Row0[2] * v.x + this.Row1[2] * v.y + this.Row2[2] * v.z - ); - } - - public Quat Quat() - { - real_t trace = Row0[0] + Row1[1] + Row2[2]; - - if (trace > 0.0f) - { - real_t s = Mathf.Sqrt(trace + 1.0f) * 2f; - real_t inv_s = 1f / s; - return new Quat( - (Row2[1] - Row1[2]) * inv_s, - (Row0[2] - Row2[0]) * inv_s, - (Row1[0] - Row0[1]) * inv_s, - s * 0.25f - ); - } - - if (Row0[0] > Row1[1] && Row0[0] > Row2[2]) - { - real_t s = Mathf.Sqrt(Row0[0] - Row1[1] - Row2[2] + 1.0f) * 2f; - real_t inv_s = 1f / s; - return new Quat( - s * 0.25f, - (Row0[1] + Row1[0]) * inv_s, - (Row0[2] + Row2[0]) * inv_s, - (Row2[1] - Row1[2]) * inv_s - ); - } - - if (Row1[1] > Row2[2]) - { - real_t s = Mathf.Sqrt(-Row0[0] + Row1[1] - Row2[2] + 1.0f) * 2f; - real_t inv_s = 1f / s; - return new Quat( - (Row0[1] + Row1[0]) * inv_s, - s * 0.25f, - (Row1[2] + Row2[1]) * inv_s, - (Row0[2] - Row2[0]) * inv_s - ); - } - else - { - real_t s = Mathf.Sqrt(-Row0[0] - Row1[1] + Row2[2] + 1.0f) * 2f; - real_t inv_s = 1f / s; - return new Quat( - (Row0[2] + Row2[0]) * inv_s, - (Row1[2] + Row2[1]) * inv_s, - s * 0.25f, - (Row1[0] - Row0[1]) * inv_s - ); - } - } - - private static readonly Basis[] _orthoBases = { - new Basis(1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f), - new Basis(0f, -1f, 0f, 1f, 0f, 0f, 0f, 0f, 1f), - new Basis(-1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f), - new Basis(0f, 1f, 0f, -1f, 0f, 0f, 0f, 0f, 1f), - new Basis(1f, 0f, 0f, 0f, 0f, -1f, 0f, 1f, 0f), - new Basis(0f, 0f, 1f, 1f, 0f, 0f, 0f, 1f, 0f), - new Basis(-1f, 0f, 0f, 0f, 0f, 1f, 0f, 1f, 0f), - new Basis(0f, 0f, -1f, -1f, 0f, 0f, 0f, 1f, 0f), - new Basis(1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, -1f), - new Basis(0f, 1f, 0f, 1f, 0f, 0f, 0f, 0f, -1f), - new Basis(-1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, -1f), - new Basis(0f, -1f, 0f, -1f, 0f, 0f, 0f, 0f, -1f), - new Basis(1f, 0f, 0f, 0f, 0f, 1f, 0f, -1f, 0f), - new Basis(0f, 0f, -1f, 1f, 0f, 0f, 0f, -1f, 0f), - new Basis(-1f, 0f, 0f, 0f, 0f, -1f, 0f, -1f, 0f), - new Basis(0f, 0f, 1f, -1f, 0f, 0f, 0f, -1f, 0f), - new Basis(0f, 0f, 1f, 0f, 1f, 0f, -1f, 0f, 0f), - new Basis(0f, -1f, 0f, 0f, 0f, 1f, -1f, 0f, 0f), - new Basis(0f, 0f, -1f, 0f, -1f, 0f, -1f, 0f, 0f), - new Basis(0f, 1f, 0f, 0f, 0f, -1f, -1f, 0f, 0f), - new Basis(0f, 0f, 1f, 0f, -1f, 0f, 1f, 0f, 0f), - new Basis(0f, 1f, 0f, 0f, 0f, 1f, 1f, 0f, 0f), - new Basis(0f, 0f, -1f, 0f, 1f, 0f, 1f, 0f, 0f), - new Basis(0f, -1f, 0f, 0f, 0f, -1f, 1f, 0f, 0f) - }; - - private static readonly Basis _identity = new Basis(1, 0, 0, 0, 1, 0, 0, 0, 1); - private static readonly Basis _flipX = new Basis(-1, 0, 0, 0, 1, 0, 0, 0, 1); - private static readonly Basis _flipY = new Basis(1, 0, 0, 0, -1, 0, 0, 0, 1); - private static readonly Basis _flipZ = new Basis(1, 0, 0, 0, 1, 0, 0, 0, -1); - - public static Basis Identity { get { return _identity; } } - public static Basis FlipX { get { return _flipX; } } - public static Basis FlipY { get { return _flipY; } } - public static Basis FlipZ { get { return _flipZ; } } - - public Basis(Quat quat) - { - real_t s = 2.0f / quat.LengthSquared; - - real_t xs = quat.x * s; - real_t ys = quat.y * s; - real_t zs = quat.z * s; - real_t wx = quat.w * xs; - real_t wy = quat.w * ys; - real_t wz = quat.w * zs; - real_t xx = quat.x * xs; - real_t xy = quat.x * ys; - real_t xz = quat.x * zs; - real_t yy = quat.y * ys; - real_t yz = quat.y * zs; - real_t zz = quat.z * zs; - - Row0 = new Vector3(1.0f - (yy + zz), xy - wz, xz + wy); - Row1 = new Vector3(xy + wz, 1.0f - (xx + zz), yz - wx); - Row2 = new Vector3(xz - wy, yz + wx, 1.0f - (xx + yy)); - } - - public Basis(Vector3 euler) - { - real_t c; - real_t s; - - c = Mathf.Cos(euler.x); - s = Mathf.Sin(euler.x); - var xmat = new Basis(1, 0, 0, 0, c, -s, 0, s, c); - - c = Mathf.Cos(euler.y); - s = Mathf.Sin(euler.y); - var ymat = new Basis(c, 0, s, 0, 1, 0, -s, 0, c); - - c = Mathf.Cos(euler.z); - s = Mathf.Sin(euler.z); - var zmat = new Basis(c, -s, 0, s, c, 0, 0, 0, 1); - - this = ymat * xmat * zmat; - } - - public Basis(Vector3 axis, real_t phi) - { - Vector3 axisSq = new Vector3(axis.x * axis.x, axis.y * axis.y, axis.z * axis.z); - real_t cosine = Mathf.Cos(phi); - Row0.x = axisSq.x + cosine * (1.0f - axisSq.x); - Row1.y = axisSq.y + cosine * (1.0f - axisSq.y); - Row2.z = axisSq.z + cosine * (1.0f - axisSq.z); - - real_t sine = Mathf.Sin(phi); - real_t t = 1.0f - cosine; - - real_t xyzt = axis.x * axis.y * t; - real_t zyxs = axis.z * sine; - Row0.y = xyzt - zyxs; - Row1.x = xyzt + zyxs; - - xyzt = axis.x * axis.z * t; - zyxs = axis.y * sine; - Row0.z = xyzt + zyxs; - Row2.x = xyzt - zyxs; - - xyzt = axis.y * axis.z * t; - zyxs = axis.x * sine; - Row1.z = xyzt - zyxs; - Row2.y = xyzt + zyxs; - } - - public Basis(Vector3 column0, Vector3 column1, Vector3 column2) - { - Row0 = new Vector3(column0.x, column1.x, column2.x); - Row1 = new Vector3(column0.y, column1.y, column2.y); - Row2 = new Vector3(column0.z, column1.z, column2.z); - // Same as: - // Column0 = column0; - // Column1 = column1; - // Column2 = column2; - // We need to assign the struct fields here first so we can't do it that way... - } - - // Arguments are named such that xy is equal to calling x.y - internal Basis(real_t xx, real_t yx, real_t zx, real_t xy, real_t yy, real_t zy, real_t xz, real_t yz, real_t zz) - { - Row0 = new Vector3(xx, yx, zx); - Row1 = new Vector3(xy, yy, zy); - Row2 = new Vector3(xz, yz, zz); - } - - public static Basis operator *(Basis left, Basis right) - { - return new Basis - ( - right.Tdotx(left.Row0), right.Tdoty(left.Row0), right.Tdotz(left.Row0), - right.Tdotx(left.Row1), right.Tdoty(left.Row1), right.Tdotz(left.Row1), - right.Tdotx(left.Row2), right.Tdoty(left.Row2), right.Tdotz(left.Row2) - ); - } - - public static bool operator ==(Basis left, Basis right) - { - return left.Equals(right); - } - - public static bool operator !=(Basis left, Basis right) - { - return !left.Equals(right); - } - - public override bool Equals(object obj) - { - if (obj is Basis) - { - return Equals((Basis)obj); - } - - return false; - } - - public bool Equals(Basis other) - { - return Row0.Equals(other.Row0) && Row1.Equals(other.Row1) && Row2.Equals(other.Row2); - } - - public bool IsEqualApprox(Basis other) - { - return Row0.IsEqualApprox(other.Row0) && Row1.IsEqualApprox(other.Row1) && Row2.IsEqualApprox(other.Row2); - } - - public override int GetHashCode() - { - return Row0.GetHashCode() ^ Row1.GetHashCode() ^ Row2.GetHashCode(); - } - - public override string ToString() - { - return String.Format("({0}, {1}, {2})", new object[] - { - Row0.ToString(), - Row1.ToString(), - Row2.ToString() - }); - } - - public string ToString(string format) - { - return String.Format("({0}, {1}, {2})", new object[] - { - Row0.ToString(format), - Row1.ToString(format), - Row2.ToString(format) - }); - } - } -} |