llbbox.cpp

Go to the documentation of this file.
00001 
00032 #include "llviewerprecompiledheaders.h"
00033 
00034 // self include
00035 #include "llbbox.h"
00036 
00037 // library includes
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 );  // inverse rotation
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 );  // inverse rotation
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 LLBBox operator*(const LLBBox &a, const LLMatrix4 &b)
00158 {
00159         return LLBBox( a.mMin * b, a.mMax * b );
00160 }
00161 */

Generated on Thu Jul 1 06:08:19 2010 for Second Life Viewer by  doxygen 1.4.7