{"id":593,"date":"2016-11-18T18:00:11","date_gmt":"2016-11-18T17:00:11","guid":{"rendered":"http:\/\/piflik.de\/?p=593"},"modified":"2016-11-09T22:21:48","modified_gmt":"2016-11-09T21:21:48","slug":"utilities-integer-vectors","status":"publish","type":"post","link":"http:\/\/piflik.de\/?p=593","title":{"rendered":"Utilities: Integer Vectors"},"content":{"rendered":"<p>Another datatype, or two if you want. Integer Vectors in 2D and 3D. They work nearly identically to the standard Vector2 and Vector3 types, but use integers only. I did not write these myself. The original idea was a <a href=\"https:\/\/forum.unity3d.com\/threads\/optimize-this-struct-3d-integer-vector.438448\/\" target=\"_blank\">request in the Unity3D forums<\/a> and the original implementation was done there by Lysander. I only made some minor changes to it.<\/p>\n<p><!--more--><\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n&lt;pre&gt;using UnityEngine;\r\nusing System;\r\n\r\n\/\/ Integer Vector2\r\n\/\/ \u00a9 Lysander from the Unity3D Forums\r\n\r\nnamespace Utilities {\r\n\t[Serializable]\r\n\tpublic struct Int2 : IEquatable&lt;Int2&gt; {\r\n\t\t\/\/ Properties\r\n\t\tpublic int x { get; set; }\r\n\t\tpublic int y { get; set; }\r\n\r\n\t\tpublic Int2 normalized {\r\n\t\t\tget {\r\n\t\t\t\tInt2 newVector = new Int2(x, y);\r\n\t\t\t\tnewVector.Normalize();\r\n\t\t\t\treturn newVector;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic float magnitude { get { return Mathf.Sqrt(x * x + y * y); } }\r\n\r\n\t\tpublic float sqrMagnitude { get { return x * x + y * y; } }\r\n\r\n\t\t\/\/ Indexer\r\n\t\tpublic int this[int index] {\r\n\t\t\tget {\r\n\t\t\t\tswitch(index) {\r\n\t\t\t\t\tcase 0:\r\n\t\t\t\t\t\treturn x;\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\treturn y;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tthrow new IndexOutOfRangeException(&quot;Invalid Int2 index&quot;);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tset {\r\n\t\t\t\tswitch(index) {\r\n\t\t\t\t\tcase 0:\r\n\t\t\t\t\t\tx = value;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\ty = value;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tthrow new IndexOutOfRangeException(&quot;Invalid Int2 index&quot;);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t\/\/ Constructors\r\n\t\tpublic Int2(int vX, int vY) : this() {\r\n\t\t\tx = vX;\r\n\t\t\ty = vY;\r\n\t\t}\r\n\r\n\t\t\/\/ Static Conversions From Other Types\r\n\t\tpublic static Int2 FromVector2(Vector2 vector2) {\r\n\t\t\treturn new Int2 {\r\n\t\t\t\tx = Mathf.RoundToInt(vector2.x),\r\n\t\t\t\ty = Mathf.RoundToInt(vector2.y)\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tpublic static Int2 FromVector3(Vector3 vector3) {\r\n\t\t\treturn new Int2 {\r\n\t\t\t\tx = Mathf.RoundToInt(vector3.x),\r\n\t\t\t\ty = Mathf.RoundToInt(vector3.y)\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tpublic static Int2 FromInt3(Int3 int3) {\r\n\t\t\treturn new Int2 {\r\n\t\t\t\tx = int3.x,\r\n\t\t\t\ty = int3.y\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t\/\/ Conversions To Other Types\r\n\t\tpublic Vector2 ToVector2() { return new Vector2(x, y); }\r\n\r\n\t\tpublic Vector3 ToVector3() { return new Vector3(x, y, 0f); }\r\n\r\n\t\tpublic Int3 ToInt3() { return new Int3(x, y, 0); }\r\n\r\n\t\t\/\/ Static Int2 Values\r\n\t\tpublic static readonly Int2 zero = new Int2(0, 0);\r\n\r\n\t\tpublic static readonly Int2 up = new Int2(0, 1);\r\n\r\n\t\tpublic static readonly Int2 down = new Int2(0, -1);\r\n\r\n\t\tpublic static readonly Int2 right = new Int2(1, 0);\r\n\r\n\t\tpublic static readonly Int2 left = new Int2(-1, 0);\r\n\r\n\t\tpublic static readonly Int2 one = new Int2(1, 1);\r\n\r\n\t\t\/\/ Other Static Functions\r\n\t\tpublic static Int2 Scale(Int2 a, Int2 b) {\r\n\t\t\treturn new Int2(a.x * b.x, a.y * b.y);\r\n\t\t}\r\n\r\n\t\tpublic static Int2 Reflect(Int2 inDirection, Int2 inNormal) {\r\n\t\t\treturn -2f * Dot(inNormal, inDirection) * inNormal + inDirection;\r\n\t\t}\r\n\r\n\t\tpublic static float Dot(Int2 a, Int2 b) {\r\n\t\t\treturn a.x * b.x + a.y * b.y;\r\n\t\t}\r\n\r\n\t\tpublic static float Angle(Int2 from, Int2 to) {\r\n\t\t\treturn Mathf.Acos(Mathf.Clamp(Dot(from.normalized, to.normalized), -1f, 1f)) * 57.29578f;\r\n\t\t}\r\n\r\n\t\tpublic static float Distance(Int2 a, Int2 b) {\r\n\t\t\treturn (a - b).magnitude;\r\n\t\t}\r\n\r\n\t\tpublic static Int2 ClampMagnitude(Int2 vector, float maxLength) {\r\n\t\t\tif(vector.sqrMagnitude &gt; maxLength * maxLength) {\r\n\t\t\t\treturn vector.normalized * maxLength;\r\n\t\t\t}\r\n\t\t\treturn vector;\r\n\t\t}\r\n\r\n\t\tpublic static Int2 Min(Int2 a, Int2 b) {\r\n\t\t\treturn new Int2(Mathf.Min(a.x, b.x), Mathf.Min(a.y, b.y));\r\n\t\t}\r\n\r\n\t\tpublic static Int2 Max(Int2 a, Int2 b) {\r\n\t\t\treturn new Int2(Mathf.Max(a.x, b.x), Mathf.Max(a.y, b.y));\r\n\t\t}\r\n\r\n\t\t\/\/ Other Functions\r\n\t\tpublic void Set(int vX, int vY) {\r\n\t\t\tx = vX;\r\n\t\t\ty = vY;\r\n\t\t}\r\n\r\n\t\tpublic void Scale(Int2 scale) {\r\n\t\t\tx *= scale.x;\r\n\t\t\ty *= scale.y;\r\n\t\t}\r\n\r\n\t\tpublic void Normalize() {\r\n\t\t\tfloat num = magnitude;\r\n\t\t\tif(num &gt; 1E-05f)\r\n\t\t\t\tthis \/= num;\r\n\t\t\telse\r\n\t\t\t\tthis = zero;\r\n\t\t}\r\n\r\n\t\tpublic void ShiftAll(int amount) {\r\n\t\t\tx += amount;\r\n\t\t\ty += amount;\r\n\t\t}\r\n\r\n\t\tpublic void ShiftAll(float amount) {\r\n\t\t\tShiftAll(Mathf.RoundToInt(amount));\r\n\t\t}\r\n\r\n\t\t\/\/ Int2 &amp; Int2 Operator Overloads\r\n\t\tpublic static Int2 operator +(Int2 a, Int2 b) {\r\n\t\t\treturn new Int2(a.x + b.x, a.y + b.y);\r\n\t\t}\r\n\r\n\t\tpublic static Int2 operator -(Int2 a, Int2 b) {\r\n\t\t\treturn new Int2(a.x - b.x, a.y - b.y);\r\n\t\t}\r\n\r\n\t\tpublic static Int2 operator -(Int2 a) {\r\n\t\t\treturn new Int2(-a.x, -a.y);\r\n\t\t}\r\n\r\n\t\tpublic static Int2 operator *(Int2 a, Int2 b) {\r\n\t\t\treturn new Int2(a.x * b.x, a.y * b.y);\r\n\t\t}\r\n\r\n\t\tpublic static Int2 operator \/(Int2 a, Int2 b) {\r\n\t\t\treturn new Int2(a.x \/ b.x, a.y \/ b.y);\r\n\t\t}\r\n\r\n\t\t\/\/ Int2 &amp; Int Operator Overloads\r\n\t\tpublic static Int2 operator *(Int2 a, int d) {\r\n\t\t\treturn new Int2(a.x * d, a.y * d);\r\n\t\t}\r\n\r\n\t\tpublic static Int2 operator *(Int2 a, float d) {\r\n\t\t\treturn new Int2(Mathf.RoundToInt(a.x * d), Mathf.RoundToInt(a.y * d));\r\n\t\t}\r\n\r\n\t\tpublic static Int2 operator *(int d, Int2 a) {\r\n\t\t\treturn new Int2(a.x * d, a.y * d);\r\n\t\t}\r\n\r\n\t\tpublic static Int2 operator *(float d, Int2 a) {\r\n\t\t\treturn new Int2(Mathf.RoundToInt(a.x * d), Mathf.RoundToInt(a.y * d));\r\n\t\t}\r\n\r\n\t\tpublic static Int2 operator \/(Int2 a, int d) {\r\n\t\t\treturn new Int2(a.x \/ d, a.y \/ d);\r\n\t\t}\r\n\r\n\t\tpublic static Int2 operator \/(Int2 a, float d) {\r\n\t\t\treturn new Int2(Mathf.RoundToInt(a.x \/ d), Mathf.RoundToInt(a.y \/ d));\r\n\t\t}\r\n\r\n\t\t\/\/ Equality and Inequality Operator Overloads\r\n\t\tpublic static bool operator ==(Int2 i1, Int2 i2) {\r\n\t\t\treturn i1.x.Equals(i2.x) &amp;&amp; i1.y.Equals(i2.y);\r\n\t\t}\r\n\r\n\t\tpublic static bool operator !=(Int2 i1, Int2 i2) {\r\n\t\t\treturn !i1.x.Equals(i2.x) || !i1.y.Equals(i2.y);\r\n\t\t}\r\n\r\n\t\t\/\/ miscellaneous overrides\r\n\t\tpublic override bool Equals(object obj) {\r\n\t\t\tif(obj is Int2) {\r\n\t\t\t\tInt2 vector = (Int2)obj;\r\n\t\t\t\treturn x.Equals(vector.x) &amp;&amp; y.Equals(vector.y);\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic bool Equals(Int2 vector) {\r\n\t\t\treturn x.Equals(vector.x) &amp;&amp; y.Equals(vector.y);\r\n\t\t}\r\n\r\n\t\tpublic override int GetHashCode() {\r\n\t\t\treturn x.GetHashCode() ^ y.GetHashCode() &lt;&lt; 2;\r\n\t\t}\r\n\r\n\t\tpublic override string ToString() {\r\n\t\t\treturn &quot;(&quot; + x + &quot;, &quot; + y + &quot;)&quot;;\r\n\t\t}\r\n\r\n\t\tpublic static implicit operator Vector2(Int2 vector) {\r\n\t\t\treturn new Vector2(vector.x, vector.y);\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nusing UnityEngine;\r\nusing System;\r\n\r\n\/\/ Integer Vector3\r\n\/\/ \u00a9 Lysander from the Unity3D Forums\r\n\r\nnamespace Utilities {\r\n\t[Serializable]\r\n\tpublic struct Int3 : IEquatable&lt;Int3&gt; {\r\n\t\t\/\/ Properties\r\n\t\tpublic int x { get; set; }\r\n\t\tpublic int y { get; set; }\r\n\t\tpublic int z { get; set; }\r\n\r\n\t\tpublic Int3 normalized {\r\n\t\t\tget {\r\n\t\t\t\tInt3 newVector = new Int3(x, y, z);\r\n\t\t\t\tnewVector.Normalize();\r\n\t\t\t\treturn newVector;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic float magnitude { get { return Mathf.Sqrt(x * x + y * y + z * z); } }\r\n\r\n\t\tpublic float sqrMagnitude { get { return x * x + y * y + z * z; } }\r\n\r\n\t\t\/\/ Indexer\r\n\t\tpublic int this[int index] {\r\n\t\t\tget {\r\n\t\t\t\tswitch(index) {\r\n\t\t\t\t\tcase 0:\r\n\t\t\t\t\t\treturn x;\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\treturn y;\r\n\t\t\t\t\tcase 2:\r\n\t\t\t\t\t\treturn z;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tthrow new IndexOutOfRangeException(&quot;Invalid Int3 index!&quot;);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tset {\r\n\t\t\t\tswitch(index) {\r\n\t\t\t\t\tcase 0:\r\n\t\t\t\t\t\tx = value;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\ty = value;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 2:\r\n\t\t\t\t\t\tz = value;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tthrow new IndexOutOfRangeException(&quot;Invalid Int3 index!&quot;);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t\/\/ Constructors\r\n\t\tpublic Int3(int vX, int vY, int vZ) : this() {\r\n\t\t\tx = vX;\r\n\t\t\ty = vY;\r\n\t\t\tz = vZ;\r\n\t\t}\r\n\r\n\t\tpublic Int3(int vX, int vY) : this() {\r\n\t\t\tx = vX;\r\n\t\t\ty = vY;\r\n\t\t\tz = 0;\r\n\t\t}\r\n\r\n\t\t\/\/ Static Conversions From Other Types\r\n\t\tpublic static Int3 FromVector2(Vector2 vector2) {\r\n\t\t\treturn new Int3 {\r\n\t\t\t\tx = Mathf.RoundToInt(vector2.x),\r\n\t\t\t\ty = Mathf.RoundToInt(vector2.y)\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tpublic static Int3 FromVector3(Vector3 vector3) {\r\n\t\t\treturn new Int3 {\r\n\t\t\t\tx = Mathf.RoundToInt(vector3.x),\r\n\t\t\t\ty = Mathf.RoundToInt(vector3.y),\r\n\t\t\t\tz = Mathf.RoundToInt(vector3.z)\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tpublic static Int3 FromInt2(Int2 int2) {\r\n\t\t\treturn new Int3 {\r\n\t\t\t\tx = int2.x,\r\n\t\t\t\ty = int2.y\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t\/\/ Conversions To Other Types\r\n\t\tpublic Vector2 ToVector2() { return new Vector2(x, y); }\r\n\r\n\t\tpublic Vector3 ToVector3() { return new Vector3(x, y, z); }\r\n\r\n\t\tpublic Int2 ToInt2() { return new Int2(x, y); }\r\n\r\n\t\t\/\/ Static Int2 Values\r\n\t\tpublic static readonly Int3 zero = new Int3(0, 0, 0);\r\n\r\n\t\tpublic static readonly Int3 forward = new Int3(0, 0, 1);\r\n\r\n\t\tpublic static readonly Int3 back = new Int3(0, 0, -1);\r\n\r\n\t\tpublic static readonly Int3 up = new Int3(0, 1, 0);\r\n\r\n\t\tpublic static readonly Int3 down = new Int3(0, -1, 0);\r\n\r\n\t\tpublic static readonly Int3 right = new Int3(1, 0, 0);\r\n\r\n\t\tpublic static readonly Int3 left = new Int3(-1, 0, 0);\r\n\r\n\t\tpublic static readonly Int3 one = new Int3(1, 1, 1);\r\n\r\n\t\t\/\/ Other Static Functions\r\n\t\tpublic static Int3 Scale(Int3 a, Int3 b) {\r\n\t\t\treturn new Int3(a.x * b.x, a.y * b.y, a.z * b.z);\r\n\t\t}\r\n\r\n\t\tpublic static Int3 Cross(Int3 a, Int3 b) {\r\n\t\t\treturn new Int3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);\r\n\t\t}\r\n\r\n\t\tpublic static Int3 Reflect(Int3 inDirection, Int3 inNormal) {\r\n\t\t\treturn -2f * Dot(inNormal, inDirection) * inNormal + inDirection;\r\n\t\t}\r\n\r\n\t\tpublic static float Dot(Int3 a, Int3 b) {\r\n\t\t\treturn a.x * b.x + a.y * b.y + a.z * b.z;\r\n\t\t}\r\n\r\n\t\tpublic static float Angle(Int3 from, Int3 to) {\r\n\t\t\treturn Mathf.Acos(Mathf.Clamp(Dot(from.normalized, to.normalized), -1f, 1f)) * 57.29578f;\r\n\t\t}\r\n\r\n\t\tpublic static float Distance(Int3 a, Int3 b) {\r\n\t\t\tInt3 vector = new Int3(a.x - b.x, a.y - b.y, a.z - b.z);\r\n\t\t\treturn Mathf.Sqrt(vector.x * vector.x + vector.y * vector.y + vector.z * vector.z);\r\n\t\t}\r\n\r\n\t\tpublic static Int3 ClampMagnitude(Int3 vector, float maxLength) {\r\n\t\t\tif(vector.sqrMagnitude &gt; maxLength * maxLength) {\r\n\t\t\t\treturn vector.normalized * maxLength;\r\n\t\t\t}\r\n\t\t\treturn vector;\r\n\t\t}\r\n\r\n\t\tpublic static Int3 Min(Int3 a, Int3 b) {\r\n\t\t\treturn new Int3(Mathf.Min(a.x, b.x), Mathf.Min(a.y, b.y), Mathf.Min(a.z, b.z));\r\n\t\t}\r\n\r\n\t\tpublic static Int3 Max(Int3 a, Int3 b) {\r\n\t\t\treturn new Int3(Mathf.Max(a.x, b.x), Mathf.Max(a.y, b.y), Mathf.Max(a.z, b.z));\r\n\t\t}\r\n\r\n\t\t\/\/ Other Functions\r\n\t\tpublic void Set(int vX, int vY, int vZ) {\r\n\t\t\tx = vX;\r\n\t\t\ty = vY;\r\n\t\t\tz = vZ;\r\n\t\t}\r\n\r\n\t\tpublic void Scale(Int3 scale) {\r\n\t\t\tx *= scale.x;\r\n\t\t\ty *= scale.y;\r\n\t\t\tz *= scale.z;\r\n\t\t}\r\n\r\n\t\tpublic void Normalize() {\r\n\t\t\tfloat num = magnitude;\r\n\t\t\tif(num &gt; 1E-05f)\r\n\t\t\t\tthis \/= num;\r\n\t\t\telse\r\n\t\t\t\tthis = zero;\r\n\t\t}\r\n\r\n\t\tpublic void ShiftAll(int amount) {\r\n\t\t\tx += amount;\r\n\t\t\ty += amount;\r\n\t\t\tz += amount;\r\n\t\t}\r\n\r\n\t\tpublic void ShiftAll(float amount) {\r\n\t\t\tShiftAll(Mathf.RoundToInt(amount));\r\n\t\t}\r\n\r\n\t\t\/\/ Int2 &amp; Int2 Operator Overloads\r\n\t\tpublic static Int3 operator +(Int3 a, Int3 b) {\r\n\t\t\treturn new Int3(a.x + b.x, a.y + b.y, a.z + b.z);\r\n\t\t}\r\n\r\n\t\tpublic static Int3 operator -(Int3 a, Int3 b) {\r\n\t\t\treturn new Int3(a.x - b.x, a.y - b.y, a.z - b.z);\r\n\t\t}\r\n\r\n\t\tpublic static Int3 operator -(Int3 a) {\r\n\t\t\treturn new Int3(-a.x, -a.y, -a.z);\r\n\t\t}\r\n\r\n\t\tpublic static Int3 operator *(Int3 a, Int3 b) {\r\n\t\t\treturn new Int3(a.x * b.x, a.y * b.y, a.z * b.z);\r\n\t\t}\r\n\r\n\t\tpublic static Int3 operator \/(Int3 a, Int3 b) {\r\n\t\t\treturn new Int3(a.x \/ b.x, a.y \/ b.y, a.z \/ b.z);\r\n\t\t}\r\n\r\n\t\t\/\/ Int2 &amp; Int Operator Overloads\r\n\t\tpublic static Int3 operator *(Int3 a, int d) {\r\n\t\t\treturn new Int3(a.x * d, a.y * d, a.z * d);\r\n\t\t}\r\n\r\n\t\tpublic static Int3 operator *(Int3 a, float d) {\r\n\t\t\treturn new Int3(Mathf.RoundToInt(a.x * d), Mathf.RoundToInt(a.y * d), Mathf.RoundToInt(a.z * d));\r\n\t\t}\r\n\r\n\t\tpublic static Int3 operator *(int d, Int3 a) {\r\n\t\t\treturn new Int3(a.x * d, a.y * d, a.z * d);\r\n\t\t}\r\n\r\n\t\tpublic static Int3 operator *(float d, Int3 a) {\r\n\t\t\treturn new Int3(Mathf.RoundToInt(a.x * d), Mathf.RoundToInt(a.y * d), Mathf.RoundToInt(a.z * d));\r\n\t\t}\r\n\r\n\t\tpublic static Int3 operator \/(Int3 a, int d) {\r\n\t\t\treturn new Int3(a.x \/ d, a.y \/ d, a.z \/ d);\r\n\t\t}\r\n\r\n\t\tpublic static Int3 operator \/(Int3 a, float d) {\r\n\t\t\treturn new Int3(Mathf.RoundToInt(a.x \/ d), Mathf.RoundToInt(a.y \/ d), Mathf.RoundToInt(a.z \/ d));\r\n\t\t}\r\n\r\n\t\t\/\/ Equality and Inequality Operator Overloads\r\n\t\tpublic static bool operator ==(Int3 a, Int3 b) {\r\n\t\t\treturn a.x.Equals(b.x) &amp;&amp; a.y.Equals(b.y) &amp;&amp; a.z.Equals(b.z);\r\n\t\t}\r\n\r\n\t\tpublic static bool operator !=(Int3 a, Int3 b) {\r\n\t\t\treturn !a.x.Equals(b.x) || !a.y.Equals(b.y) || !a.z.Equals(b.z);\r\n\t\t}\r\n\r\n\t\t\/\/ Overrides &amp; Implementations\r\n\t\tpublic override bool Equals(object obj) {\r\n\t\t\tif(obj is Int3) {\r\n\t\t\t\tInt3 vector = (Int3)obj;\r\n\t\t\t\treturn x.Equals(vector.x) &amp;&amp; y.Equals(vector.y) &amp;&amp; z.Equals(vector.z);\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tpublic bool Equals(Int3 vector) {\r\n\t\t\treturn x.Equals(vector.x) &amp;&amp; y.Equals(vector.y) &amp;&amp; z.Equals(vector.z);\r\n\t\t}\r\n\r\n\t\tpublic override int GetHashCode() {\r\n\t\t\treturn x.GetHashCode() ^ y.GetHashCode() &lt;&lt; 2 ^ z.GetHashCode() &gt;&gt; 2;\r\n\t\t}\r\n\r\n\t\tpublic override string ToString() {\r\n\t\t\treturn &quot;(&quot; + x + &quot;, &quot; + y + &quot;, &quot; + z + &quot;)&quot;;\r\n\t\t}\r\n\r\n\t\tpublic static implicit operator Vector3(Int3 vector) {\r\n\t\t\treturn new Vector3(vector.x, vector.y, vector.z);\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Another datatype, or two if you want. Integer Vectors in 2D and 3D. They work nearly identically to the standard Vector2 and Vector3 types, but use integers only. I did not write these myself. The original idea was a request in the Unity3D forums and the original implementation was done there by Lysander. I only [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[13,12],"tags":[],"_links":{"self":[{"href":"http:\/\/piflik.de\/index.php?rest_route=\/wp\/v2\/posts\/593"}],"collection":[{"href":"http:\/\/piflik.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/piflik.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/piflik.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/piflik.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=593"}],"version-history":[{"count":4,"href":"http:\/\/piflik.de\/index.php?rest_route=\/wp\/v2\/posts\/593\/revisions"}],"predecessor-version":[{"id":597,"href":"http:\/\/piflik.de\/index.php?rest_route=\/wp\/v2\/posts\/593\/revisions\/597"}],"wp:attachment":[{"href":"http:\/\/piflik.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=593"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/piflik.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=593"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/piflik.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=593"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}