+++ /dev/null
-#include "stdafx.h"\r
-/*\r
-* Copyright (c) 2007-2010 SlimDX Group\r
-* \r
-* Permission is hereby granted, free of charge, to any person obtaining a copy\r
-* of this software and associated documentation files (the "Software"), to deal\r
-* in the Software without restriction, including without limitation the rights\r
-* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
-* copies of the Software, and to permit persons to whom the Software is\r
-* furnished to do so, subject to the following conditions:\r
-* \r
-* The above copyright notice and this permission notice shall be included in\r
-* all copies or substantial portions of the Software.\r
-* \r
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
-* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
-* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
-* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
-* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
-* THE SOFTWARE.\r
-*/\r
-\r
-#include <d3dx9.h>\r
-\r
-#include "Matrix.h"\r
-#include "Quaternion.h"\r
-#include "Vector2.h"\r
-#include "Vector3.h"\r
-#include "Vector4.h"\r
-\r
-using namespace System;\r
-using namespace System::Globalization;\r
-\r
-namespace SlimDX\r
-{\r
- Vector4::Vector4( float value )\r
- {\r
- X = value;\r
- Y = value;\r
- Z = value;\r
- W = value;\r
- }\r
- \r
- Vector4::Vector4( Vector2 value, float z, float w )\r
- {\r
- X = value.X;\r
- Y = value.Y;\r
- Z = z;\r
- W = w;\r
- }\r
- \r
- Vector4::Vector4( Vector3 value, float w )\r
- {\r
- X = value.X;\r
- Y = value.Y;\r
- Z = value.Z;\r
- W = w;\r
- }\r
- \r
- Vector4::Vector4( float x, float y, float z, float w )\r
- {\r
- X = x;\r
- Y = y;\r
- Z = z;\r
- W = w;\r
- }\r
-\r
- float Vector4::default::get( int index )\r
- {\r
- switch( index )\r
- {\r
- case 0:\r
- return X;\r
-\r
- case 1:\r
- return Y;\r
-\r
- case 2:\r
- return Z;\r
-\r
- case 3:\r
- return W;\r
-\r
- default:\r
- throw gcnew ArgumentOutOfRangeException( "index", "Indices for Vector4 run from 0 to 3, inclusive." );\r
- }\r
- }\r
- \r
- void Vector4::default::set( int index, float value )\r
- {\r
- switch( index )\r
- {\r
- case 0:\r
- X = value;\r
- break;\r
-\r
- case 1:\r
- Y = value;\r
- break;\r
-\r
- case 2:\r
- Z = value;\r
- break;\r
-\r
- case 3:\r
- W = value;\r
- break;\r
-\r
- default:\r
- throw gcnew ArgumentOutOfRangeException( "index", "Indices for Vector4 run from 0 to 3, inclusive." );\r
- }\r
- }\r
- \r
- float Vector4::Length()\r
- {\r
- return static_cast<float>( Math::Sqrt( (X * X) + (Y * Y) + (Z * Z) + (W * W) ) );\r
- }\r
- \r
- float Vector4::LengthSquared()\r
- {\r
- return (X * X) + (Y * Y) + (Z * Z) + (W * W);\r
- }\r
- \r
- void Vector4::Normalize()\r
- {\r
- float length = Length();\r
- if( length == 0 )\r
- return;\r
- float num = 1 / length;\r
- X *= num;\r
- Y *= num;\r
- Z *= num;\r
- W *= num;\r
- }\r
- \r
- Vector4 Vector4::Add( Vector4 left, Vector4 right )\r
- {\r
- return Vector4( left.X + right.X, left.Y + right.Y, left.Z + right.Z, left.W + right.W );\r
- }\r
- \r
- void Vector4::Add( Vector4% left, Vector4% right, [Out] Vector4% result )\r
- {\r
- result = Vector4( left.X + right.X, left.Y + right.Y, left.Z + right.Z, left.W + right.W );\r
- }\r
- \r
- Vector4 Vector4::Subtract( Vector4 left, Vector4 right )\r
- {\r
- return Vector4( left.X - right.X, left.Y - right.Y, left.Z - right.Z, left.W - right.W );\r
- }\r
- \r
- void Vector4::Subtract( Vector4% left, Vector4% right, [Out] Vector4% result )\r
- {\r
- result = Vector4( left.X - right.X, left.Y - right.Y, left.Z - right.Z, left.W - right.W );\r
- }\r
- \r
- Vector4 Vector4::Modulate( Vector4 left, Vector4 right )\r
- {\r
- return Vector4( left.X * right.X, left.Y * right.Y, left.Z * right.Z, left.W * right.W );\r
- }\r
- \r
- void Vector4::Modulate( Vector4% left, Vector4% right, [Out] Vector4% result )\r
- {\r
- result = Vector4( left.X * right.X, left.Y * right.Y, left.Z * right.Z, left.W * right.W );\r
- }\r
- \r
- Vector4 Vector4::Multiply( Vector4 value, float scale )\r
- {\r
- return Vector4( value.X * scale, value.Y * scale, value.Z * scale, value.W * scale );\r
- }\r
- \r
- void Vector4::Multiply( Vector4% value, float scale, [Out] Vector4% result )\r
- {\r
- result = Vector4( value.X * scale, value.Y * scale, value.Z * scale, value.W * scale );\r
- }\r
- \r
- Vector4 Vector4::Divide( Vector4 value, float scale )\r
- {\r
- return Vector4( value.X / scale, value.Y / scale, value.Z / scale, value.W / scale );\r
- }\r
- \r
- void Vector4::Divide( Vector4% value, float scale, [Out] Vector4% result )\r
- {\r
- result = Vector4( value.X / scale, value.Y / scale, value.Z / scale, value.W / scale );\r
- }\r
- \r
- Vector4 Vector4::Negate( Vector4 value )\r
- {\r
- return Vector4( -value.X, -value.Y, -value.Z, -value.W );\r
- }\r
- \r
- void Vector4::Negate( Vector4% value, [Out] Vector4% result )\r
- {\r
- result = Vector4( -value.X, -value.Y, -value.Z, -value.W );\r
- }\r
- \r
- Vector4 Vector4::Barycentric( Vector4 value1, Vector4 value2, Vector4 value3, float amount1, float amount2 )\r
- {\r
- Vector4 vector;\r
- vector.X = (value1.X + (amount1 * (value2.X - value1.X))) + (amount2 * (value3.X - value1.X));\r
- vector.Y = (value1.Y + (amount1 * (value2.Y - value1.Y))) + (amount2 * (value3.Y - value1.Y));\r
- vector.Z = (value1.Z + (amount1 * (value2.Z - value1.Z))) + (amount2 * (value3.Z - value1.Z));\r
- vector.W = (value1.W + (amount1 * (value2.W - value1.W))) + (amount2 * (value3.W - value1.W));\r
- return vector;\r
- }\r
- \r
- void Vector4::Barycentric( Vector4% value1, Vector4% value2, Vector4% value3, float amount1, float amount2, [Out] Vector4% result )\r
- {\r
- result = Vector4((value1.X + (amount1 * (value2.X - value1.X))) + (amount2 * (value3.X - value1.X)),\r
- (value1.Y + (amount1 * (value2.Y - value1.Y))) + (amount2 * (value3.Y - value1.Y)),\r
- (value1.Z + (amount1 * (value2.Z - value1.Z))) + (amount2 * (value3.Z - value1.Z)),\r
- (value1.W + (amount1 * (value2.W - value1.W))) + (amount2 * (value3.W - value1.W)) );\r
- }\r
- \r
- Vector4 Vector4::CatmullRom( Vector4 value1, Vector4 value2, Vector4 value3, Vector4 value4, float amount )\r
- {\r
- Vector4 vector;\r
- float squared = amount * amount;\r
- float cubed = amount * squared;\r
-\r
- vector.X = 0.5f * ((((2.0f * value2.X) + ((-value1.X + value3.X) * amount)) + \r
- (((((2.0f * value1.X) - (5.0f * value2.X)) + (4.0f * value3.X)) - value4.X) * squared)) + \r
- ((((-value1.X + (3.0f * value2.X)) - (3.0f * value3.X)) + value4.X) * cubed));\r
-\r
- vector.Y = 0.5f * ((((2.0f * value2.Y) + ((-value1.Y + value3.Y) * amount)) + \r
- (((((2.0f * value1.Y) - (5.0f * value2.Y)) + (4.0f * value3.Y)) - value4.Y) * squared)) + \r
- ((((-value1.Y + (3.0f * value2.Y)) - (3.0f * value3.Y)) + value4.Y) * cubed));\r
-\r
- vector.Z = 0.5f * ((((2.0f * value2.Z) + ((-value1.Z + value3.Z) * amount)) + \r
- (((((2.0f * value1.Z) - (5.0f * value2.Z)) + (4.0f * value3.Z)) - value4.Z) * squared)) + \r
- ((((-value1.Z + (3.0f * value2.Z)) - (3.0f * value3.Z)) + value4.Z) * cubed));\r
-\r
- vector.W = 0.5f * ((((2.0f * value2.W) + ((-value1.W + value3.W) * amount)) + \r
- (((((2.0f * value1.W) - (5.0f * value2.W)) + (4.0f * value3.W)) - value4.W) * squared)) + \r
- ((((-value1.W + (3.0f * value2.W)) - (3.0f * value3.W)) + value4.W) * cubed));\r
-\r
- return vector;\r
- }\r
- \r
- void Vector4::CatmullRom( Vector4% value1, Vector4% value2, Vector4% value3, Vector4% value4, float amount, [Out] Vector4% result )\r
- {\r
- float squared = amount * amount;\r
- float cubed = amount * squared;\r
- \r
- Vector4 r;\r
-\r
- r.X = 0.5f * ((((2.0f * value2.X) + ((-value1.X + value3.X) * amount)) + \r
- (((((2.0f * value1.X) - (5.0f * value2.X)) + (4.0f * value3.X)) - value4.X) * squared)) + \r
- ((((-value1.X + (3.0f * value2.X)) - (3.0f * value3.X)) + value4.X) * cubed));\r
-\r
- r.Y = 0.5f * ((((2.0f * value2.Y) + ((-value1.Y + value3.Y) * amount)) + \r
- (((((2.0f * value1.Y) - (5.0f * value2.Y)) + (4.0f * value3.Y)) - value4.Y) * squared)) + \r
- ((((-value1.Y + (3.0f * value2.Y)) - (3.0f * value3.Y)) + value4.Y) * cubed));\r
-\r
- r.Z = 0.5f * ((((2.0f * value2.Z) + ((-value1.Z + value3.Z) * amount)) + \r
- (((((2.0f * value1.Z) - (5.0f * value2.Z)) + (4.0f * value3.Z)) - value4.Z) * squared)) + \r
- ((((-value1.Z + (3.0f * value2.Z)) - (3.0f * value3.Z)) + value4.Z) * cubed));\r
-\r
- r.W = 0.5f * ((((2.0f * value2.W) + ((-value1.W + value3.W) * amount)) + \r
- (((((2.0f * value1.W) - (5.0f * value2.W)) + (4.0f * value3.W)) - value4.W) * squared)) + \r
- ((((-value1.W + (3.0f * value2.W)) - (3.0f * value3.W)) + value4.W) * cubed));\r
-\r
- result = r;\r
- }\r
- \r
- Vector4 Vector4::Clamp( Vector4 value, Vector4 min, Vector4 max )\r
- {\r
- float x = value.X;\r
- x = (x > max.X) ? max.X : x;\r
- x = (x < min.X) ? min.X : x;\r
-\r
- float y = value.Y;\r
- y = (y > max.Y) ? max.Y : y;\r
- y = (y < min.Y) ? min.Y : y;\r
-\r
- float z = value.Z;\r
- z = (z > max.Z) ? max.Z : z;\r
- z = (z < min.Z) ? min.Z : z;\r
-\r
- float w = value.W;\r
- w = (w > max.W) ? max.W : w;\r
- w = (w < min.W) ? min.W : w;\r
-\r
- return Vector4( x, y, z, w );\r
- }\r
- \r
- void Vector4::Clamp( Vector4% value, Vector4% min, Vector4% max, [Out] Vector4% result )\r
- {\r
- float x = value.X;\r
- x = (x > max.X) ? max.X : x;\r
- x = (x < min.X) ? min.X : x;\r
-\r
- float y = value.Y;\r
- y = (y > max.Y) ? max.Y : y;\r
- y = (y < min.Y) ? min.Y : y;\r
-\r
- float z = value.Z;\r
- z = (z > max.Z) ? max.Z : z;\r
- z = (z < min.Z) ? min.Z : z;\r
-\r
- float w = value.W;\r
- w = (w > max.W) ? max.W : w;\r
- w = (w < min.W) ? min.W : w;\r
-\r
- result = Vector4( x, y, z, w );\r
- }\r
- \r
- Vector4 Vector4::Hermite( Vector4 value1, Vector4 tangent1, Vector4 value2, Vector4 tangent2, float amount )\r
- {\r
- Vector4 vector;\r
- float squared = amount * amount;\r
- float cubed = amount * squared;\r
- float part1 = ((2.0f * cubed) - (3.0f * squared)) + 1.0f;\r
- float part2 = (-2.0f * cubed) + (3.0f * squared);\r
- float part3 = (cubed - (2.0f * squared)) + amount;\r
- float part4 = cubed - squared;\r
-\r
- vector.X = (((value1.X * part1) + (value2.X * part2)) + (tangent1.X * part3)) + (tangent2.X * part4);\r
- vector.Y = (((value1.Y * part1) + (value2.Y * part2)) + (tangent1.Y * part3)) + (tangent2.Y * part4);\r
- vector.Z = (((value1.Z * part1) + (value2.Z * part2)) + (tangent1.Z * part3)) + (tangent2.Z * part4);\r
- vector.W = (((value1.W * part1) + (value2.W * part2)) + (tangent1.W * part3)) + (tangent2.W * part4);\r
-\r
- return vector;\r
- } \r
- \r
- void Vector4::Hermite( Vector4% value1, Vector4% tangent1, Vector4% value2, Vector4% tangent2, float amount, [Out] Vector4% result )\r
- {\r
- float squared = amount * amount;\r
- float cubed = amount * squared;\r
- float part1 = ((2.0f * cubed) - (3.0f * squared)) + 1.0f;\r
- float part2 = (-2.0f * cubed) + (3.0f * squared);\r
- float part3 = (cubed - (2.0f * squared)) + amount;\r
- float part4 = cubed - squared;\r
-\r
- result.X = (((value1.X * part1) + (value2.X * part2)) + (tangent1.X * part3)) + (tangent2.X * part4);\r
- result.Y = (((value1.Y * part1) + (value2.Y * part2)) + (tangent1.Y * part3)) + (tangent2.Y * part4);\r
- result.Z = (((value1.Z * part1) + (value2.Z * part2)) + (tangent1.Z * part3)) + (tangent2.Z * part4);\r
- result.W = (((value1.W * part1) + (value2.W * part2)) + (tangent1.W * part3)) + (tangent2.W * part4);\r
- }\r
- \r
- Vector4 Vector4::Lerp( Vector4 start, Vector4 end, float factor )\r
- {\r
- Vector4 vector;\r
-\r
- vector.X = start.X + ((end.X - start.X) * factor);\r
- vector.Y = start.Y + ((end.Y - start.Y) * factor);\r
- vector.Z = start.Z + ((end.Z - start.Z) * factor);\r
- vector.W = start.W + ((end.W - start.W) * factor);\r
-\r
- return vector;\r
- }\r
- \r
- void Vector4::Lerp( Vector4% start, Vector4% end, float factor, [Out] Vector4% result )\r
- {\r
- result.X = start.X + ((end.X - start.X) * factor);\r
- result.Y = start.Y + ((end.Y - start.Y) * factor);\r
- result.Z = start.Z + ((end.Z - start.Z) * factor);\r
- result.W = start.W + ((end.W - start.W) * factor);\r
- }\r
- \r
- Vector4 Vector4::SmoothStep( Vector4 start, Vector4 end, float amount )\r
- {\r
- Vector4 vector;\r
-\r
- amount = (amount > 1.0f) ? 1.0f : ((amount < 0.0f) ? 0.0f : amount);\r
- amount = (amount * amount) * (3.0f - (2.0f * amount));\r
-\r
- vector.X = start.X + ((end.X - start.X) * amount);\r
- vector.Y = start.Y + ((end.Y - start.Y) * amount);\r
- vector.Z = start.Z + ((end.Z - start.Z) * amount);\r
- vector.W = start.W + ((end.W - start.W) * amount);\r
-\r
- return vector;\r
- }\r
- \r
- void Vector4::SmoothStep( Vector4% start, Vector4% end, float amount, [Out] Vector4% result )\r
- {\r
- amount = (amount > 1.0f) ? 1.0f : ((amount < 0.0f) ? 0.0f : amount);\r
- amount = (amount * amount) * (3.0f - (2.0f * amount));\r
-\r
- result.X = start.X + ((end.X - start.X) * amount);\r
- result.Y = start.Y + ((end.Y - start.Y) * amount);\r
- result.Z = start.Z + ((end.Z - start.Z) * amount);\r
- result.W = start.W + ((end.W - start.W) * amount);\r
- }\r
- \r
- float Vector4::Distance( Vector4 value1, Vector4 value2 )\r
- {\r
- float x = value1.X - value2.X;\r
- float y = value1.Y - value2.Y;\r
- float z = value1.Z - value2.Z;\r
- float w = value1.W - value2.W;\r
-\r
- return static_cast<float>( Math::Sqrt( (x * x) + (y * y) + (z * z) + (w * w) ) );\r
- }\r
- \r
- float Vector4::DistanceSquared( Vector4 value1, Vector4 value2 )\r
- {\r
- float x = value1.X - value2.X;\r
- float y = value1.Y - value2.Y;\r
- float z = value1.Z - value2.Z;\r
- float w = value1.W - value2.W;\r
-\r
- return (x * x) + (y * y) + (z * z) + (w * w);\r
- }\r
- \r
- float Vector4::Dot( Vector4 left, Vector4 right )\r
- {\r
- return (left.X * right.X + left.Y * right.Y + left.Z * right.Z + left.W * right.W);\r
- }\r
-\r
- Vector4 Vector4::Normalize( Vector4 vector )\r
- {\r
- vector.Normalize();\r
- return vector;\r
- }\r
- \r
- void Vector4::Normalize( Vector4% vector, [Out] Vector4% result )\r
- {\r
- result = Vector4(vector);\r
- result.Normalize();\r
- }\r
- \r
- Vector4 Vector4::Transform( Vector4 vector, Matrix transform )\r
- {\r
- Vector4 result;\r
-\r
- result.X = (vector.X * transform.M11) + (vector.Y * transform.M21) + (vector.Z * transform.M31) + (vector.W * transform.M41);\r
- result.Y = (vector.X * transform.M12) + (vector.Y * transform.M22) + (vector.Z * transform.M32) + (vector.W * transform.M42);\r
- result.Z = (vector.X * transform.M13) + (vector.Y * transform.M23) + (vector.Z * transform.M33) + (vector.W * transform.M43);\r
- result.W = (vector.X * transform.M14) + (vector.Y * transform.M24) + (vector.Z * transform.M34) + (vector.W * transform.M44);\r
-\r
- return result;\r
- }\r
- \r
- void Vector4::Transform( Vector4% vector, Matrix% transform, [Out] Vector4% result )\r
- {\r
- Vector4 r;\r
- r.X = (vector.X * transform.M11) + (vector.Y * transform.M21) + (vector.Z * transform.M31) + (vector.W * transform.M41);\r
- r.Y = (vector.X * transform.M12) + (vector.Y * transform.M22) + (vector.Z * transform.M32) + (vector.W * transform.M42);\r
- r.Z = (vector.X * transform.M13) + (vector.Y * transform.M23) + (vector.Z * transform.M33) + (vector.W * transform.M43);\r
- r.W = (vector.X * transform.M14) + (vector.Y * transform.M24) + (vector.Z * transform.M34) + (vector.W * transform.M44);\r
- \r
- result = r;\r
- }\r
- \r
- array<Vector4>^ Vector4::Transform( array<Vector4>^ vectors, Matrix% transform )\r
- {\r
- if( vectors == nullptr )\r
- throw gcnew ArgumentNullException( "vectors" );\r
-\r
- int count = vectors->Length;\r
- array<Vector4>^ results = gcnew array<Vector4>( count );\r
-\r
- for( int i = 0; i < count; i++ )\r
- {\r
- Vector4 r;\r
- r.X = (vectors[i].X * transform.M11) + (vectors[i].Y * transform.M21) + (vectors[i].Z * transform.M31) + (vectors[i].W * transform.M41);\r
- r.Y = (vectors[i].X * transform.M12) + (vectors[i].Y * transform.M22) + (vectors[i].Z * transform.M32) + (vectors[i].W * transform.M42);\r
- r.Z = (vectors[i].X * transform.M13) + (vectors[i].Y * transform.M23) + (vectors[i].Z * transform.M33) + (vectors[i].W * transform.M43);\r
- r.W = (vectors[i].X * transform.M14) + (vectors[i].Y * transform.M24) + (vectors[i].Z * transform.M34) + (vectors[i].W * transform.M44);\r
- \r
- results[i] = r;\r
- }\r
-\r
- return results;\r
- }\r
- \r
- Vector4 Vector4::Transform( Vector4 value, Quaternion rotation )\r
- {\r
- Vector4 vector;\r
- float x = rotation.X + rotation.X;\r
- float y = rotation.Y + rotation.Y;\r
- float z = rotation.Z + rotation.Z;\r
- float wx = rotation.W * x;\r
- float wy = rotation.W * y;\r
- float wz = rotation.W * z;\r
- float xx = rotation.X * x;\r
- float xy = rotation.X * y;\r
- float xz = rotation.X * z;\r
- float yy = rotation.Y * y;\r
- float yz = rotation.Y * z;\r
- float zz = rotation.Z * z;\r
-\r
- vector.X = ((value.X * ((1.0f - yy) - zz)) + (value.Y * (xy - wz))) + (value.Z * (xz + wy));\r
- vector.Y = ((value.X * (xy + wz)) + (value.Y * ((1.0f - xx) - zz))) + (value.Z * (yz - wx));\r
- vector.Z = ((value.X * (xz - wy)) + (value.Y * (yz + wx))) + (value.Z * ((1.0f - xx) - yy));\r
- vector.W = value.W;\r
-\r
- return vector;\r
- }\r
- \r
- void Vector4::Transform( Vector4% value, Quaternion% rotation, [Out] Vector4% result )\r
- {\r
- float x = rotation.X + rotation.X;\r
- float y = rotation.Y + rotation.Y;\r
- float z = rotation.Z + rotation.Z;\r
- float wx = rotation.W * x;\r
- float wy = rotation.W * y;\r
- float wz = rotation.W * z;\r
- float xx = rotation.X * x;\r
- float xy = rotation.X * y;\r
- float xz = rotation.X * z;\r
- float yy = rotation.Y * y;\r
- float yz = rotation.Y * z;\r
- float zz = rotation.Z * z;\r
-\r
- Vector4 r;\r
- r.X = ((value.X * ((1.0f - yy) - zz)) + (value.Y * (xy - wz))) + (value.Z * (xz + wy));\r
- r.Y = ((value.X * (xy + wz)) + (value.Y * ((1.0f - xx) - zz))) + (value.Z * (yz - wx));\r
- r.Z = ((value.X * (xz - wy)) + (value.Y * (yz + wx))) + (value.Z * ((1.0f - xx) - yy));\r
- r.W = value.W;\r
-\r
- result = r;\r
- }\r
- \r
- array<Vector4>^ Vector4::Transform( array<Vector4>^ vectors, Quaternion% rotation )\r
- {\r
- if( vectors == nullptr )\r
- throw gcnew ArgumentNullException( "vectors" );\r
-\r
- int count = vectors->Length;\r
- array<Vector4>^ results = gcnew array<Vector4>( count );\r
-\r
- float x = rotation.X + rotation.X;\r
- float y = rotation.Y + rotation.Y;\r
- float z = rotation.Z + rotation.Z;\r
- float wx = rotation.W * x;\r
- float wy = rotation.W * y;\r
- float wz = rotation.W * z;\r
- float xx = rotation.X * x;\r
- float xy = rotation.X * y;\r
- float xz = rotation.X * z;\r
- float yy = rotation.Y * y;\r
- float yz = rotation.Y * z;\r
- float zz = rotation.Z * z;\r
-\r
- for( int i = 0; i < count; i++ )\r
- {\r
- Vector4 r;\r
- r.X = ((vectors[i].X * ((1.0f - yy) - zz)) + (vectors[i].Y * (xy - wz))) + (vectors[i].Z * (xz + wy));\r
- r.Y = ((vectors[i].X * (xy + wz)) + (vectors[i].Y * ((1.0f - xx) - zz))) + (vectors[i].Z * (yz - wx));\r
- r.Z = ((vectors[i].X * (xz - wy)) + (vectors[i].Y * (yz + wx))) + (vectors[i].Z * ((1.0f - xx) - yy));\r
- r.W = vectors[i].W;\r
-\r
- results[i] = r;\r
- }\r
-\r
- return results;\r
- }\r
-\r
- Vector4 Vector4::Minimize( Vector4 left, Vector4 right )\r
- {\r
- Vector4 vector;\r
- vector.X = (left.X < right.X) ? left.X : right.X;\r
- vector.Y = (left.Y < right.Y) ? left.Y : right.Y;\r
- vector.Z = (left.Z < right.Z) ? left.Z : right.Z;\r
- vector.W = (left.W < right.W) ? left.W : right.W;\r
- return vector;\r
- }\r
- \r
- void Vector4::Minimize( Vector4% left, Vector4% right, [Out] Vector4% result )\r
- {\r
- result.X = (left.X < right.X) ? left.X : right.X;\r
- result.Y = (left.Y < right.Y) ? left.Y : right.Y;\r
- result.Z = (left.Z < right.Z) ? left.Z : right.Z;\r
- result.W = (left.W < right.W) ? left.W : right.W;\r
- }\r
-\r
- Vector4 Vector4::Maximize( Vector4 left, Vector4 right )\r
- {\r
- Vector4 vector;\r
- vector.X = (left.X > right.X) ? left.X : right.X;\r
- vector.Y = (left.Y > right.Y) ? left.Y : right.Y;\r
- vector.Z = (left.Z > right.Z) ? left.Z : right.Z;\r
- vector.W = (left.W > right.W) ? left.W : right.W;\r
- return vector;\r
- }\r
- \r
- void Vector4::Maximize( Vector4% left, Vector4% right, [Out] Vector4% result )\r
- {\r
- result.X = (left.X > right.X) ? left.X : right.X;\r
- result.Y = (left.Y > right.Y) ? left.Y : right.Y;\r
- result.Z = (left.Z > right.Z) ? left.Z : right.Z;\r
- result.W = (left.W > right.W) ? left.W : right.W;\r
- }\r
-\r
- Vector4 Vector4::operator + ( Vector4 left, Vector4 right )\r
- {\r
- return Vector4( left.X + right.X, left.Y + right.Y, left.Z + right.Z, left.W + right.W );\r
- }\r
- \r
- Vector4 Vector4::operator - ( Vector4 left, Vector4 right )\r
- {\r
- return Vector4( left.X - right.X, left.Y - right.Y, left.Z - right.Z, left.W - right.W );\r
- }\r
- \r
- Vector4 Vector4::operator - ( Vector4 value )\r
- {\r
- return Vector4( -value.X, -value.Y, -value.Z, -value.W );\r
- }\r
- \r
- Vector4 Vector4::operator * ( Vector4 value, float scale )\r
- {\r
- return Vector4( value.X * scale, value.Y * scale, value.Z * scale, value.W * scale );\r
- }\r
- \r
- Vector4 Vector4::operator * ( float scale, Vector4 vec )\r
- {\r
- return vec * scale;\r
- }\r
- \r
- Vector4 Vector4::operator / ( Vector4 value, float scale )\r
- {\r
- return Vector4( value.X / scale, value.Y / scale, value.Z / scale, value.W / scale );\r
- }\r
-\r
- bool Vector4::operator == ( Vector4 left, Vector4 right )\r
- {\r
- return Vector4::Equals( left, right );\r
- }\r
-\r
- bool Vector4::operator != ( Vector4 left, Vector4 right )\r
- {\r
- return !Vector4::Equals( left, right );\r
- }\r
-\r
- String^ Vector4::ToString()\r
- {\r
- return String::Format( CultureInfo::CurrentCulture, "X:{0} Y:{1} Z:{2} W:{3}", X.ToString(CultureInfo::CurrentCulture), \r
- Y.ToString(CultureInfo::CurrentCulture), Z.ToString(CultureInfo::CurrentCulture),\r
- W.ToString(CultureInfo::CurrentCulture) );\r
- }\r
-\r
- int Vector4::GetHashCode()\r
- {\r
- return X.GetHashCode() + Y.GetHashCode() + Z.GetHashCode() + W.GetHashCode();\r
- }\r
-\r
- bool Vector4::Equals( Object^ value )\r
- {\r
- if( value == nullptr )\r
- return false;\r
-\r
- if( value->GetType() != GetType() )\r
- return false;\r
-\r
- return Equals( safe_cast<Vector4>( value ) );\r
- }\r
-\r
- bool Vector4::Equals( Vector4 value )\r
- {\r
- return ( X == value.X && Y == value.Y && Z == value.Z && W == value.W );\r
- }\r
-\r
- bool Vector4::Equals( Vector4% value1, Vector4% value2 )\r
- {\r
- return ( value1.X == value2.X && value1.Y == value2.Y && value1.Z == value2.Z && value1.W == value2.W );\r
- }\r
-}
\ No newline at end of file