00001
00032 #include "linden_common.h"
00033
00034
00035 #include "v3math.h"
00036 #include "v4math.h"
00037 #include "m4math.h"
00038 #include "m3math.h"
00039 #include "llquaternion.h"
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 const LLVector4& LLVector4::rotVec(const LLMatrix4 &mat)
00067 {
00068 *this = *this * mat;
00069 return *this;
00070 }
00071
00072 const LLVector4& LLVector4::rotVec(const LLQuaternion &q)
00073 {
00074 *this = *this * q;
00075 return *this;
00076 }
00077
00078 const LLVector4& LLVector4::scaleVec(const LLVector4& vec)
00079 {
00080 mV[VX] *= vec.mV[VX];
00081 mV[VY] *= vec.mV[VY];
00082 mV[VZ] *= vec.mV[VZ];
00083 mV[VW] *= vec.mV[VW];
00084
00085 return *this;
00086 }
00087
00088
00089
00090 BOOL LLVector4::abs()
00091 {
00092 BOOL ret = FALSE;
00093
00094 if (mV[0] < 0.f) { mV[0] = -mV[0]; ret = TRUE; }
00095 if (mV[1] < 0.f) { mV[1] = -mV[1]; ret = TRUE; }
00096 if (mV[2] < 0.f) { mV[2] = -mV[2]; ret = TRUE; }
00097 if (mV[3] < 0.f) { mV[3] = -mV[3]; ret = TRUE; }
00098
00099 return ret;
00100 }
00101
00102
00103 std::ostream& operator<<(std::ostream& s, const LLVector4 &a)
00104 {
00105 s << "{ " << a.mV[VX] << ", " << a.mV[VY] << ", " << a.mV[VZ] << ", " << a.mV[VW] << " }";
00106 return s;
00107 }
00108
00109
00110
00111
00112 F32 angle_between( const LLVector4& a, const LLVector4& b )
00113 {
00114 LLVector4 an = a;
00115 LLVector4 bn = b;
00116 an.normVec();
00117 bn.normVec();
00118 F32 cosine = an * bn;
00119 F32 angle = (cosine >= 1.0f) ? 0.0f :
00120 (cosine <= -1.0f) ? F_PI :
00121 acos(cosine);
00122 return angle;
00123 }
00124
00125 BOOL are_parallel(const LLVector4 &a, const LLVector4 &b, F32 epsilon)
00126 {
00127 LLVector4 an = a;
00128 LLVector4 bn = b;
00129 an.normVec();
00130 bn.normVec();
00131 F32 dot = an * bn;
00132 if ( (1.0f - fabs(dot)) < epsilon)
00133 return TRUE;
00134 return FALSE;
00135 }
00136
00137
00138 LLVector3 vec4to3(const LLVector4 &vec)
00139 {
00140 return LLVector3( vec.mV[VX], vec.mV[VY], vec.mV[VZ] );
00141 }
00142
00143 LLVector4 vec3to4(const LLVector3 &vec)
00144 {
00145 return LLVector4(vec.mV[VX], vec.mV[VY], vec.mV[VZ]);
00146 }
00147