00001 #region --- License ---
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #endregion
00024
00025 using System;
00026 using System.Runtime.InteropServices;
00027 using System.Xml.Serialization;
00028 namespace OpenTK
00029 {
00036 [Serializable]
00037 [StructLayout(LayoutKind.Sequential)]
00038 public struct Vector3 : IEquatable<Vector3>
00039 {
00040 #region Fields
00041
00045 public float X;
00046
00050 public float Y;
00051
00055 public float Z;
00056
00057 #endregion
00058
00059 #region Constructors
00060
00067 public Vector3(float x, float y, float z)
00068 {
00069 X = x;
00070 Y = y;
00071 Z = z;
00072 }
00073
00078 public Vector3(Vector2 v)
00079 {
00080 X = v.X;
00081 Y = v.Y;
00082 Z = 0.0f;
00083 }
00084
00089 public Vector3(Vector3 v)
00090 {
00091 X = v.X;
00092 Y = v.Y;
00093 Z = v.Z;
00094 }
00095
00100 public Vector3(Vector4 v)
00101 {
00102 X = v.X;
00103 Y = v.Y;
00104 Z = v.Z;
00105 }
00106
00107 #endregion
00108
00109 #region Public Members
00110
00111 #region Instance
00112
00113 #region public void Add()
00114
00117 [Obsolete("Use static Add() method instead.")]
00118 public void Add(Vector3 right)
00119 {
00120 this.X += right.X;
00121 this.Y += right.Y;
00122 this.Z += right.Z;
00123 }
00124
00127 [CLSCompliant(false)]
00128 [Obsolete("Use static Add() method instead.")]
00129 public void Add(ref Vector3 right)
00130 {
00131 this.X += right.X;
00132 this.Y += right.Y;
00133 this.Z += right.Z;
00134 }
00135
00136 #endregion public void Add()
00137
00138 #region public void Sub()
00139
00142 [Obsolete("Use static Subtract() method instead.")]
00143 public void Sub(Vector3 right)
00144 {
00145 this.X -= right.X;
00146 this.Y -= right.Y;
00147 this.Z -= right.Z;
00148 }
00149
00152 [CLSCompliant(false)]
00153 [Obsolete("Use static Subtract() method instead.")]
00154 public void Sub(ref Vector3 right)
00155 {
00156 this.X -= right.X;
00157 this.Y -= right.Y;
00158 this.Z -= right.Z;
00159 }
00160
00161 #endregion public void Sub()
00162
00163 #region public void Mult()
00164
00167 [Obsolete("Use static Multiply() method instead.")]
00168 public void Mult(float f)
00169 {
00170 this.X *= f;
00171 this.Y *= f;
00172 this.Z *= f;
00173 }
00174
00175 #endregion public void Mult()
00176
00177 #region public void Div()
00178
00181 [Obsolete("Use static Divide() method instead.")]
00182 public void Div(float f)
00183 {
00184 float mult = 1.0f / f;
00185 this.X *= mult;
00186 this.Y *= mult;
00187 this.Z *= mult;
00188 }
00189
00190 #endregion public void Div()
00191
00192 #region public float Length
00193
00199 public float Length
00200 {
00201 get
00202 {
00203 return (float)System.Math.Sqrt(X * X + Y * Y + Z * Z);
00204 }
00205 }
00206
00207 #endregion
00208
00209 #region public float LengthFast
00210
00220 public float LengthFast
00221 {
00222 get
00223 {
00224 return 1.0f / MathHelper.InverseSqrtFast(X * X + Y * Y + Z * Z);
00225 }
00226 }
00227
00228 #endregion
00229
00230 #region public float LengthSquared
00231
00241 public float LengthSquared
00242 {
00243 get
00244 {
00245 return X * X + Y * Y + Z * Z;
00246 }
00247 }
00248
00249 #endregion
00250
00251 #region public void Normalize()
00252
00256 public void Normalize()
00257 {
00258 float scale = 1.0f / this.Length;
00259 X *= scale;
00260 Y *= scale;
00261 Z *= scale;
00262 }
00263
00264 #endregion
00265
00266 #region public void NormalizeFast()
00267
00271 public void NormalizeFast()
00272 {
00273 float scale = MathHelper.InverseSqrtFast(X * X + Y * Y + Z * Z);
00274 X *= scale;
00275 Y *= scale;
00276 Z *= scale;
00277 }
00278
00279 #endregion
00280
00281 #region public void Scale()
00282
00289 [Obsolete("Use static Multiply() method instead.")]
00290 public void Scale(float sx, float sy, float sz)
00291 {
00292 this.X = X * sx;
00293 this.Y = Y * sy;
00294 this.Z = Z * sz;
00295 }
00296
00299 [Obsolete("Use static Multiply() method instead.")]
00300 public void Scale(Vector3 scale)
00301 {
00302 this.X *= scale.X;
00303 this.Y *= scale.Y;
00304 this.Z *= scale.Z;
00305 }
00306
00309 [CLSCompliant(false)]
00310 [Obsolete("Use static Multiply() method instead.")]
00311 public void Scale(ref Vector3 scale)
00312 {
00313 this.X *= scale.X;
00314 this.Y *= scale.Y;
00315 this.Z *= scale.Z;
00316 }
00317
00318 #endregion public void Scale()
00319
00320 #endregion
00321
00322 #region Static
00323
00324 #region Fields
00325
00329 public static readonly Vector3 UnitX = new Vector3(1, 0, 0);
00330
00334 public static readonly Vector3 UnitY = new Vector3(0, 1, 0);
00335
00339 public static readonly Vector3 UnitZ = new Vector3(0, 0, 1);
00340
00344 public static readonly Vector3 Zero = new Vector3(0, 0, 0);
00345
00349 public static readonly Vector3 One = new Vector3(1, 1, 1);
00350
00354 public static readonly int SizeInBytes = Marshal.SizeOf(new Vector3());
00355
00356 #endregion
00357
00358 #region Obsolete
00359
00360 #region Sub
00361
00368 [Obsolete("Use static Subtract() method instead.")]
00369 public static Vector3 Sub(Vector3 a, Vector3 b)
00370 {
00371 a.X -= b.X;
00372 a.Y -= b.Y;
00373 a.Z -= b.Z;
00374 return a;
00375 }
00376
00383 [Obsolete("Use static Subtract() method instead.")]
00384 public static void Sub(ref Vector3 a, ref Vector3 b, out Vector3 result)
00385 {
00386 result.X = a.X - b.X;
00387 result.Y = a.Y - b.Y;
00388 result.Z = a.Z - b.Z;
00389 }
00390
00391 #endregion
00392
00393 #region Mult
00394
00401 [Obsolete("Use static Multiply() method instead.")]
00402 public static Vector3 Mult(Vector3 a, float f)
00403 {
00404 a.X *= f;
00405 a.Y *= f;
00406 a.Z *= f;
00407 return a;
00408 }
00409
00416 [Obsolete("Use static Multiply() method instead.")]
00417 public static void Mult(ref Vector3 a, float f, out Vector3 result)
00418 {
00419 result.X = a.X * f;
00420 result.Y = a.Y * f;
00421 result.Z = a.Z * f;
00422 }
00423
00424 #endregion
00425
00426 #region Div
00427
00434 [Obsolete("Use static Divide() method instead.")]
00435 public static Vector3 Div(Vector3 a, float f)
00436 {
00437 float mult = 1.0f / f;
00438 a.X *= mult;
00439 a.Y *= mult;
00440 a.Z *= mult;
00441 return a;
00442 }
00443
00450 [Obsolete("Use static Divide() method instead.")]
00451 public static void Div(ref Vector3 a, float f, out Vector3 result)
00452 {
00453 float mult = 1.0f / f;
00454 result.X = a.X * mult;
00455 result.Y = a.Y * mult;
00456 result.Z = a.Z * mult;
00457 }
00458
00459 #endregion
00460
00461 #endregion
00462
00463 #region Add
00464
00471 public static Vector3 Add(Vector3 a, Vector3 b)
00472 {
00473 Add(ref a, ref b, out a);
00474 return a;
00475 }
00476
00483 public static void Add(ref Vector3 a, ref Vector3 b, out Vector3 result)
00484 {
00485 result = new Vector3(a.X + b.X, a.Y + b.Y, a.Z + b.Z);
00486 }
00487
00488 #endregion
00489
00490 #region Subtract
00491
00498 public static Vector3 Subtract(Vector3 a, Vector3 b)
00499 {
00500 Subtract(ref a, ref b, out a);
00501 return a;
00502 }
00503
00510 public static void Subtract(ref Vector3 a, ref Vector3 b, out Vector3 result)
00511 {
00512 result = new Vector3(a.X - b.X, a.Y - b.Y, a.Z - b.Z);
00513 }
00514
00515 #endregion
00516
00517 #region Multiply
00518
00525 public static Vector3 Multiply(Vector3 vector, float scale)
00526 {
00527 Multiply(ref vector, scale, out vector);
00528 return vector;
00529 }
00530
00537 public static void Multiply(ref Vector3 vector, float scale, out Vector3 result)
00538 {
00539 result = new Vector3(vector.X * scale, vector.Y * scale, vector.Z * scale);
00540 }
00541
00548 public static Vector3 Multiply(Vector3 vector, Vector3 scale)
00549 {
00550 Multiply(ref vector, ref scale, out vector);
00551 return vector;
00552 }
00553
00560 public static void Multiply(ref Vector3 vector, ref Vector3 scale, out Vector3 result)
00561 {
00562 result = new Vector3(vector.X * scale.X, vector.Y * scale.Y, vector.Z * scale.Z);
00563 }
00564
00565 #endregion
00566
00567 #region Divide
00568
00575 public static Vector3 Divide(Vector3 vector, float scale)
00576 {
00577 Divide(ref vector, scale, out vector);
00578 return vector;
00579 }
00580
00587 public static void Divide(ref Vector3 vector, float scale, out Vector3 result)
00588 {
00589 Multiply(ref vector, 1 / scale, out result);
00590 }
00591
00598 public static Vector3 Divide(Vector3 vector, Vector3 scale)
00599 {
00600 Divide(ref vector, ref scale, out vector);
00601 return vector;
00602 }
00603
00610 public static void Divide(ref Vector3 vector, ref Vector3 scale, out Vector3 result)
00611 {
00612 result = new Vector3(vector.X / scale.X, vector.Y / scale.Y, vector.Z / scale.Z);
00613 }
00614
00615 #endregion
00616
00617 #region ComponentMin
00618
00625 public static Vector3 ComponentMin(Vector3 a, Vector3 b)
00626 {
00627 a.X = a.X < b.X ? a.X : b.X;
00628 a.Y = a.Y < b.Y ? a.Y : b.Y;
00629 a.Z = a.Z < b.Z ? a.Z : b.Z;
00630 return a;
00631 }
00632
00639 public static void ComponentMin(ref Vector3 a, ref Vector3 b, out Vector3 result)
00640 {
00641 result.X = a.X < b.X ? a.X : b.X;
00642 result.Y = a.Y < b.Y ? a.Y : b.Y;
00643 result.Z = a.Z < b.Z ? a.Z : b.Z;
00644 }
00645
00646 #endregion
00647
00648 #region ComponentMax
00649
00656 public static Vector3 ComponentMax(Vector3 a, Vector3 b)
00657 {
00658 a.X = a.X > b.X ? a.X : b.X;
00659 a.Y = a.Y > b.Y ? a.Y : b.Y;
00660 a.Z = a.Z > b.Z ? a.Z : b.Z;
00661 return a;
00662 }
00663
00670 public static void ComponentMax(ref Vector3 a, ref Vector3 b, out Vector3 result)
00671 {
00672 result.X = a.X > b.X ? a.X : b.X;
00673 result.Y = a.Y > b.Y ? a.Y : b.Y;
00674 result.Z = a.Z > b.Z ? a.Z : b.Z;
00675 }
00676
00677 #endregion
00678
00679 #region Min
00680
00687 public static Vector3 Min(Vector3 left, Vector3 right)
00688 {
00689 return left.LengthSquared < right.LengthSquared ? left : right;
00690 }
00691
00692 #endregion
00693
00694 #region Max
00695
00702 public static Vector3 Max(Vector3 left, Vector3 right)
00703 {
00704 return left.LengthSquared >= right.LengthSquared ? left : right;
00705 }
00706
00707 #endregion
00708
00709 #region Clamp
00710
00718 public static Vector3 Clamp(Vector3 vec, Vector3 min, Vector3 max)
00719 {
00720 vec.X = vec.X < min.X ? min.X : vec.X > max.X ? max.X : vec.X;
00721 vec.Y = vec.Y < min.Y ? min.Y : vec.Y > max.Y ? max.Y : vec.Y;
00722 vec.Z = vec.Z < min.Z ? min.Z : vec.Z > max.Z ? max.Z : vec.Z;
00723 return vec;
00724 }
00725
00733 public static void Clamp(ref Vector3 vec, ref Vector3 min, ref Vector3 max, out Vector3 result)
00734 {
00735 result.X = vec.X < min.X ? min.X : vec.X > max.X ? max.X : vec.X;
00736 result.Y = vec.Y < min.Y ? min.Y : vec.Y > max.Y ? max.Y : vec.Y;
00737 result.Z = vec.Z < min.Z ? min.Z : vec.Z > max.Z ? max.Z : vec.Z;
00738 }
00739
00740 #endregion
00741
00742 #region Normalize
00743
00749 public static Vector3 Normalize(Vector3 vec)
00750 {
00751 float scale = 1.0f / vec.Length;
00752 vec.X *= scale;
00753 vec.Y *= scale;
00754 vec.Z *= scale;
00755 return vec;
00756 }
00757
00763 public static void Normalize(ref Vector3 vec, out Vector3 result)
00764 {
00765 float scale = 1.0f / vec.Length;
00766 result.X = vec.X * scale;
00767 result.Y = vec.Y * scale;
00768 result.Z = vec.Z * scale;
00769 }
00770
00771 #endregion
00772
00773 #region NormalizeFast
00774
00780 public static Vector3 NormalizeFast(Vector3 vec)
00781 {
00782 float scale = MathHelper.InverseSqrtFast(vec.X * vec.X + vec.Y * vec.Y + vec.Z * vec.Z);
00783 vec.X *= scale;
00784 vec.Y *= scale;
00785 vec.Z *= scale;
00786 return vec;
00787 }
00788
00794 public static void NormalizeFast(ref Vector3 vec, out Vector3 result)
00795 {
00796 float scale = MathHelper.InverseSqrtFast(vec.X * vec.X + vec.Y * vec.Y + vec.Z * vec.Z);
00797 result.X = vec.X * scale;
00798 result.Y = vec.Y * scale;
00799 result.Z = vec.Z * scale;
00800 }
00801
00802 #endregion
00803
00804 #region Dot
00805
00812 public static float Dot(Vector3 left, Vector3 right)
00813 {
00814 return left.X * right.X + left.Y * right.Y + left.Z * right.Z;
00815 }
00816
00823 public static void Dot(ref Vector3 left, ref Vector3 right, out float result)
00824 {
00825 result = left.X * right.X + left.Y * right.Y + left.Z * right.Z;
00826 }
00827
00828 #endregion
00829
00830 #region Cross
00831
00838 public static Vector3 Cross(Vector3 left, Vector3 right)
00839 {
00840 Vector3 result;
00841 Cross(ref left, ref right, out result);
00842 return result;
00843 }
00844
00852 public static void Cross(ref Vector3 left, ref Vector3 right, out Vector3 result)
00853 {
00854 result = new Vector3(left.Y * right.Z - left.Z * right.Y,
00855 left.Z * right.X - left.X * right.Z,
00856 left.X * right.Y - left.Y * right.X);
00857 }
00858
00859 #endregion
00860
00861 #region Lerp
00862
00870 public static Vector3 Lerp(Vector3 a, Vector3 b, float blend)
00871 {
00872 a.X = blend * (b.X - a.X) + a.X;
00873 a.Y = blend * (b.Y - a.Y) + a.Y;
00874 a.Z = blend * (b.Z - a.Z) + a.Z;
00875 return a;
00876 }
00877
00885 public static void Lerp(ref Vector3 a, ref Vector3 b, float blend, out Vector3 result)
00886 {
00887 result.X = blend * (b.X - a.X) + a.X;
00888 result.Y = blend * (b.Y - a.Y) + a.Y;
00889 result.Z = blend * (b.Z - a.Z) + a.Z;
00890 }
00891
00892 #endregion
00893
00894 #region Barycentric
00895
00905 public static Vector3 BaryCentric(Vector3 a, Vector3 b, Vector3 c, float u, float v)
00906 {
00907 return a + u * (b - a) + v * (c - a);
00908 }
00909
00917 public static void BaryCentric(ref Vector3 a, ref Vector3 b, ref Vector3 c, float u, float v, out Vector3 result)
00918 {
00919 result = a;
00920
00921 Vector3 temp = b;
00922 Subtract(ref temp, ref a, out temp);
00923 Multiply(ref temp, u, out temp);
00924 Add(ref result, ref temp, out result);
00925
00926 temp = c;
00927 Subtract(ref temp, ref a, out temp);
00928 Multiply(ref temp, v, out temp);
00929 Add(ref result, ref temp, out result);
00930 }
00931
00932 #endregion
00933
00934 #region Transform
00935
00942 public static Vector3 TransformVector(Vector3 vec, Matrix4 mat)
00943 {
00944 Vector3 v;
00945 v.X = Vector3.Dot(vec, new Vector3(mat.Column0));
00946 v.Y = Vector3.Dot(vec, new Vector3(mat.Column1));
00947 v.Z = Vector3.Dot(vec, new Vector3(mat.Column2));
00948 return v;
00949 }
00950
00957 public static void TransformVector(ref Vector3 vec, ref Matrix4 mat, out Vector3 result)
00958 {
00959 result.X = vec.X * mat.Row0.X +
00960 vec.Y * mat.Row1.X +
00961 vec.Z * mat.Row2.X;
00962
00963 result.Y = vec.X * mat.Row0.Y +
00964 vec.Y * mat.Row1.Y +
00965 vec.Z * mat.Row2.Y;
00966
00967 result.Z = vec.X * mat.Row0.Z +
00968 vec.Y * mat.Row1.Z +
00969 vec.Z * mat.Row2.Z;
00970 }
00971
00980 public static Vector3 TransformNormal(Vector3 norm, Matrix4 mat)
00981 {
00982 mat.Invert();
00983 return TransformNormalInverse(norm, mat);
00984 }
00985
00994 public static void TransformNormal(ref Vector3 norm, ref Matrix4 mat, out Vector3 result)
00995 {
00996 Matrix4 Inverse = Matrix4.Invert(mat);
00997 Vector3.TransformNormalInverse(ref norm, ref Inverse, out result);
00998 }
00999
01008 public static Vector3 TransformNormalInverse(Vector3 norm, Matrix4 invMat)
01009 {
01010 Vector3 n;
01011 n.X = Vector3.Dot(norm, new Vector3(invMat.Row0));
01012 n.Y = Vector3.Dot(norm, new Vector3(invMat.Row1));
01013 n.Z = Vector3.Dot(norm, new Vector3(invMat.Row2));
01014 return n;
01015 }
01016
01025 public static void TransformNormalInverse(ref Vector3 norm, ref Matrix4 invMat, out Vector3 result)
01026 {
01027 result.X = norm.X * invMat.Row0.X +
01028 norm.Y * invMat.Row0.Y +
01029 norm.Z * invMat.Row0.Z;
01030
01031 result.Y = norm.X * invMat.Row1.X +
01032 norm.Y * invMat.Row1.Y +
01033 norm.Z * invMat.Row1.Z;
01034
01035 result.Z = norm.X * invMat.Row2.X +
01036 norm.Y * invMat.Row2.Y +
01037 norm.Z * invMat.Row2.Z;
01038 }
01039
01044 public static Vector3 TransformPosition(Vector3 pos, Matrix4 mat)
01045 {
01046 Vector3 p;
01047 p.X = Vector3.Dot(pos, new Vector3(mat.Column0)) + mat.Row3.X;
01048 p.Y = Vector3.Dot(pos, new Vector3(mat.Column1)) + mat.Row3.Y;
01049 p.Z = Vector3.Dot(pos, new Vector3(mat.Column2)) + mat.Row3.Z;
01050 return p;
01051 }
01052
01057 public static void TransformPosition(ref Vector3 pos, ref Matrix4 mat, out Vector3 result)
01058 {
01059 result.X = pos.X * mat.Row0.X +
01060 pos.Y * mat.Row1.X +
01061 pos.Z * mat.Row2.X +
01062 mat.Row3.X;
01063
01064 result.Y = pos.X * mat.Row0.Y +
01065 pos.Y * mat.Row1.Y +
01066 pos.Z * mat.Row2.Y +
01067 mat.Row3.Y;
01068
01069 result.Z = pos.X * mat.Row0.Z +
01070 pos.Y * mat.Row1.Z +
01071 pos.Z * mat.Row2.Z +
01072 mat.Row3.Z;
01073 }
01074
01079 public static Vector3 Transform(Vector3 vec, Matrix4 mat)
01080 {
01081 Vector3 result;
01082 Transform(ref vec, ref mat, out result);
01083 return result;
01084 }
01085
01090 public static void Transform(ref Vector3 vec, ref Matrix4 mat, out Vector3 result)
01091 {
01092 Vector4 v4 = new Vector4(vec.X, vec.Y, vec.Z, 1.0f);
01093 Vector4.Transform(ref v4, ref mat, out v4);
01094 result = v4.Xyz;
01095 }
01096
01103 public static Vector3 Transform(Vector3 vec, Quaternion quat)
01104 {
01105 Vector3 result;
01106 Transform(ref vec, ref quat, out result);
01107 return result;
01108 }
01109
01116 public static void Transform(ref Vector3 vec, ref Quaternion quat, out Vector3 result)
01117 {
01118
01119
01120 Vector3 xyz = quat.Xyz, temp, temp2;
01121 Vector3.Cross(ref xyz, ref vec, out temp);
01122 Vector3.Multiply(ref vec, quat.W, out temp2);
01123 Vector3.Add(ref temp, ref temp2, out temp);
01124 Vector3.Cross(ref xyz, ref temp, out temp);
01125 Vector3.Multiply(ref temp, 2, out temp);
01126 Vector3.Add(ref vec, ref temp, out result);
01127 }
01128
01133 public static Vector3 TransformPerspective(Vector3 vec, Matrix4 mat)
01134 {
01135 Vector3 result;
01136 TransformPerspective(ref vec, ref mat, out result);
01137 return result;
01138 }
01139
01144 public static void TransformPerspective(ref Vector3 vec, ref Matrix4 mat, out Vector3 result)
01145 {
01146 Vector4 v = new Vector4(vec);
01147 Vector4.Transform(ref v, ref mat, out v);
01148 result.X = v.X / v.W;
01149 result.Y = v.Y / v.W;
01150 result.Z = v.Z / v.W;
01151 }
01152
01153 #endregion
01154
01155 #region CalculateAngle
01156
01164 public static float CalculateAngle(Vector3 first, Vector3 second)
01165 {
01166 return (float)System.Math.Acos((Vector3.Dot(first, second)) / (first.Length * second.Length));
01167 }
01168
01174 public static void CalculateAngle(ref Vector3 first, ref Vector3 second, out float result)
01175 {
01176 float temp;
01177 Vector3.Dot(ref first, ref second, out temp);
01178 result = (float)System.Math.Acos(temp / (first.Length * second.Length));
01179 }
01180
01181 #endregion
01182
01183 #endregion
01184
01185 #region Swizzle
01186
01190 [XmlIgnore]
01191 public Vector2 Xy { get { return new Vector2(X, Y); } set { X = value.X; Y = value.Y; } }
01192
01193 #endregion
01194
01195 #region Operators
01196
01203 public static Vector3 operator +(Vector3 left, Vector3 right)
01204 {
01205 left.X += right.X;
01206 left.Y += right.Y;
01207 left.Z += right.Z;
01208 return left;
01209 }
01210
01217 public static Vector3 operator -(Vector3 left, Vector3 right)
01218 {
01219 left.X -= right.X;
01220 left.Y -= right.Y;
01221 left.Z -= right.Z;
01222 return left;
01223 }
01224
01230 public static Vector3 operator -(Vector3 vec)
01231 {
01232 vec.X = -vec.X;
01233 vec.Y = -vec.Y;
01234 vec.Z = -vec.Z;
01235 return vec;
01236 }
01237
01244 public static Vector3 operator *(Vector3 vec, float scale)
01245 {
01246 vec.X *= scale;
01247 vec.Y *= scale;
01248 vec.Z *= scale;
01249 return vec;
01250 }
01251
01258 public static Vector3 operator *(float scale, Vector3 vec)
01259 {
01260 vec.X *= scale;
01261 vec.Y *= scale;
01262 vec.Z *= scale;
01263 return vec;
01264 }
01265
01272 public static Vector3 operator /(Vector3 vec, float scale)
01273 {
01274 float mult = 1.0f / scale;
01275 vec.X *= mult;
01276 vec.Y *= mult;
01277 vec.Z *= mult;
01278 return vec;
01279 }
01280
01287 public static bool operator ==(Vector3 left, Vector3 right)
01288 {
01289 return left.Equals(right);
01290 }
01291
01298 public static bool operator !=(Vector3 left, Vector3 right)
01299 {
01300 return !left.Equals(right);
01301 }
01302
01303 #endregion
01304
01305 #region Overrides
01306
01307 #region public override string ToString()
01308
01313 public override string ToString()
01314 {
01315 return String.Format("({0}, {1}, {2})", X, Y, Z);
01316 }
01317
01318 #endregion
01319
01320 #region public override int GetHashCode()
01321
01326 public override int GetHashCode()
01327 {
01328 return X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode();
01329 }
01330
01331 #endregion
01332
01333 #region public override bool Equals(object obj)
01334
01340 public override bool Equals(object obj)
01341 {
01342 if (!(obj is Vector3))
01343 return false;
01344
01345 return this.Equals((Vector3)obj);
01346 }
01347
01348 #endregion
01349
01350 #endregion
01351
01352 #endregion
01353
01354 #region IEquatable<Vector3> Members
01355
01359 public bool Equals(Vector3 other)
01360 {
01361 return
01362 X == other.X &&
01363 Y == other.Y &&
01364 Z == other.Z;
01365 }
01366
01367 #endregion
01368 }
01369 }