6 using System.Runtime.InteropServices;
15 [StructLayout(LayoutKind.Sequential, Pack = 4)]
16 public struct Int3 : IEquatable<Int3>, IFormattable
18 public static readonly
Int3 zero =
new Int3(0, 0, 0);
19 public static readonly
Int3 one =
new Int3(1, 1, 1);
21 public static readonly
Int3 forward =
new Int3(0, 0, 1);
22 public static readonly
Int3 back =
new Int3(0, 0, -1);
23 public static readonly
Int3 up =
new Int3(0, 1, 0);
24 public static readonly
Int3 down =
new Int3(0, -1, 0);
25 public static readonly
Int3 left =
new Int3(-1, 0, 0);
26 public static readonly
Int3 right =
new Int3(1, 0, 0);
32 public Int3(
int x,
int y,
int z)
48 var hashCode = x.GetHashCode();
49 hashCode = (hashCode * 397) ^ y.GetHashCode();
50 hashCode = (hashCode * 397) ^ z.GetHashCode();
54 public int this[
int index]
58 if (index == 0)
return x;
59 if (index == 1)
return y;
60 if (index == 2)
return z;
61 throw new ArgumentOutOfRangeException(
"Invalid Int3 index!");
65 if (index == 0) x = value;
66 if (index == 1) y = value;
67 if (index == 2) z = value;
68 throw new ArgumentOutOfRangeException(
"Invalid Int3 index!");
73 public static explicit operator Vector3(
Int3 v)
75 return new Vector3(v.
x, v.
y, v.
z);
78 public static explicit operator Vector2(
Int3 v)
80 return new Vector2(v.
x, v.
y);
84 #region math operations 85 public float magnitude
87 get {
return Magnitude(
this); }
90 public int sqrMagnitude
92 get {
return SqrMagnitude(
this); }
97 get {
return DotOne(
this); }
102 return Mathf.Sqrt(SqrMagnitude(v));
107 return v.
x * v.
x + v.
y * v.
y + v.
z * v.
z;
112 return new Int3(l.
x * r.
x, l.
y * r.
y, l.
z * r.
z);
117 return l.
x * r.
x + l.
y * r.
y + l.
z * r.
z;
122 return v.
x * v.
y * v.
z;
127 return new Int3(l.
y * r.
z - l.
z * r.
y,
128 l.
z * r.
x - l.
x * r.
z,
129 l.
x * r.
y - l.
y * r.
x);
134 return new Int3(Mathf.Min(l.
x, r.
x), Mathf.Min(l.
y, r.
y), Mathf.Min(l.
z, r.
z));
139 return new Int3(Mathf.Max(l.
x, r.
x), Mathf.Max(l.
y, r.
y), Mathf.Max(l.
z, r.
z));
144 return new Int3(Mathf.Clamp(v.
x, min.
x, max.
x),
145 Mathf.Clamp(v.
y, min.
y, max.
y),
146 Mathf.Clamp(v.
z, min.
z, max.
z));
151 return new Int3(Mathf.ClosestPowerOfTwo(v.
x), Mathf.ClosestPowerOfTwo(v.
y), Mathf.ClosestPowerOfTwo(v.
z));
158 (v.
z * size.
x * size.
y);
163 return new Int3(v % size.
x,
164 (v / size.
x) % size.
y,
165 (v / (size.
x * size.
y)) % size.
z);
167 #endregion math operations 169 #region math operators 172 return new Int3(l.
x + r.
x, l.
y + r.
y, l.
z + r.
z);
177 return new Int3(l.
x - r.
x, l.
y - r.
y, l.
z - r.
z);
182 return new Int3(-v.
x, -v.
y, -v.
z);
187 return new Int3(v.
x * d, v.
y * d, v.
z * d);
192 return new Int3(v.
x * d, v.
y * d, v.
z * d);
197 return new Int3(v.
x / d, v.
y / d, v.
z / d);
199 #endregion math operators 204 return x.Equals(other.
x) && y.Equals(other.
y) && z.Equals(other.
z);
217 public override bool Equals(
object value)
219 return (value is
Int3) ? Equals((Int3)value) :
false;
226 return ToString(CultureInfo.CurrentCulture);
229 public string ToString(IFormatProvider formatProvider)
231 return string.Format(formatProvider,
"X:{0} Y:{1} Z:{2}", x, y, z);
234 public string ToString(
string format, IFormatProvider formatProvider)
238 return ToString(formatProvider);
241 return string.Format(formatProvider,
243 x.ToString(format, formatProvider),
244 y.ToString(format, formatProvider),
245 z.ToString(format, formatProvider));