00001
00032 #include "llviewerprecompiledheaders.h"
00033
00034
00035 #include "llbbox.h"
00036
00037
00038 #include "m4math.h"
00039
00040 void LLBBox::addPointLocal(const LLVector3& p)
00041 {
00042 if (mEmpty)
00043 {
00044 mMinLocal = p;
00045 mMaxLocal = p;
00046 mEmpty = FALSE;
00047 }
00048 else
00049 {
00050 mMinLocal.mV[VX] = llmin( p.mV[VX], mMinLocal.mV[VX] );
00051 mMinLocal.mV[VY] = llmin( p.mV[VY], mMinLocal.mV[VY] );
00052 mMinLocal.mV[VZ] = llmin( p.mV[VZ], mMinLocal.mV[VZ] );
00053 mMaxLocal.mV[VX] = llmax( p.mV[VX], mMaxLocal.mV[VX] );
00054 mMaxLocal.mV[VY] = llmax( p.mV[VY], mMaxLocal.mV[VY] );
00055 mMaxLocal.mV[VZ] = llmax( p.mV[VZ], mMaxLocal.mV[VZ] );
00056 }
00057 }
00058
00059 void LLBBox::addPointAgent( LLVector3 p)
00060 {
00061 p -= mPosAgent;
00062 p.rotVec( ~mRotation );
00063 addPointLocal( p );
00064 }
00065
00066
00067 void LLBBox::addBBoxAgent(const LLBBox& b)
00068 {
00069 if (mEmpty)
00070 {
00071 mPosAgent = b.mPosAgent;
00072 mRotation = b.mRotation;
00073 mMinLocal.clearVec();
00074 mMaxLocal.clearVec();
00075 }
00076 LLVector3 vertex[8];
00077 vertex[0].setVec( b.mMinLocal.mV[VX], b.mMinLocal.mV[VY], b.mMinLocal.mV[VZ] );
00078 vertex[1].setVec( b.mMinLocal.mV[VX], b.mMinLocal.mV[VY], b.mMaxLocal.mV[VZ] );
00079 vertex[2].setVec( b.mMinLocal.mV[VX], b.mMaxLocal.mV[VY], b.mMinLocal.mV[VZ] );
00080 vertex[3].setVec( b.mMinLocal.mV[VX], b.mMaxLocal.mV[VY], b.mMaxLocal.mV[VZ] );
00081 vertex[4].setVec( b.mMaxLocal.mV[VX], b.mMinLocal.mV[VY], b.mMinLocal.mV[VZ] );
00082 vertex[5].setVec( b.mMaxLocal.mV[VX], b.mMinLocal.mV[VY], b.mMaxLocal.mV[VZ] );
00083 vertex[6].setVec( b.mMaxLocal.mV[VX], b.mMaxLocal.mV[VY], b.mMinLocal.mV[VZ] );
00084 vertex[7].setVec( b.mMaxLocal.mV[VX], b.mMaxLocal.mV[VY], b.mMaxLocal.mV[VZ] );
00085
00086 LLMatrix4 m( b.mRotation );
00087 m.translate( b.mPosAgent );
00088 m.translate( -mPosAgent );
00089 m.rotate( ~mRotation );
00090
00091 for( S32 i=0; i<8; i++ )
00092 {
00093 addPointLocal( vertex[i] * m );
00094 }
00095 }
00096
00097
00098 void LLBBox::expand( F32 delta )
00099 {
00100 mMinLocal.mV[VX] -= delta;
00101 mMinLocal.mV[VY] -= delta;
00102 mMinLocal.mV[VZ] -= delta;
00103 mMaxLocal.mV[VX] += delta;
00104 mMaxLocal.mV[VY] += delta;
00105 mMaxLocal.mV[VZ] += delta;
00106 }
00107
00108 LLVector3 LLBBox::localToAgent(const LLVector3& v) const
00109 {
00110 LLMatrix4 m( mRotation );
00111 m.translate( mPosAgent );
00112 return v * m;
00113 }
00114
00115 LLVector3 LLBBox::agentToLocal(const LLVector3& v) const
00116 {
00117 LLMatrix4 m;
00118 m.translate( -mPosAgent );
00119 m.rotate( ~mRotation );
00120 return v * m;
00121 }
00122
00123 LLVector3 LLBBox::localToAgentBasis(const LLVector3& v) const
00124 {
00125 LLMatrix4 m( mRotation );
00126 return v * m;
00127 }
00128
00129 LLVector3 LLBBox::agentToLocalBasis(const LLVector3& v) const
00130 {
00131 LLMatrix4 m( ~mRotation );
00132 return v * m;
00133 }
00134
00135 BOOL LLBBox::containsPointLocal(const LLVector3& p) const
00136 {
00137 if ( (p.mV[VX] < mMinLocal.mV[VX])
00138 ||(p.mV[VX] > mMaxLocal.mV[VX])
00139 ||(p.mV[VY] < mMinLocal.mV[VY])
00140 ||(p.mV[VY] > mMaxLocal.mV[VY])
00141 ||(p.mV[VZ] < mMinLocal.mV[VZ])
00142 ||(p.mV[VZ] > mMaxLocal.mV[VZ]))
00143 {
00144 return FALSE;
00145 }
00146 return TRUE;
00147 }
00148
00149 BOOL LLBBox::containsPointAgent(const LLVector3& p) const
00150 {
00151 LLVector3 point_local = agentToLocal(p);
00152 return containsPointLocal(point_local);
00153 }
00154
00155
00156
00157
00158
00159
00160
00161