xform.cpp

Go to the documentation of this file.
00001 
00031 #include "linden_common.h"
00032 
00033 #include "xform.h"
00034 
00035 LLXform::LLXform()
00036 {
00037         init();
00038 }
00039 
00040 LLXform::~LLXform()
00041 {
00042 }
00043 
00044 
00045 LLXform* LLXform::getRoot() const
00046 {
00047         const LLXform* root = this;
00048         while(root->mParent)
00049         {
00050                 root = root->mParent;
00051         }
00052         return (LLXform*)root;
00053 }
00054 
00055 BOOL LLXform::isRoot() const
00056 {
00057         return (!mParent);
00058 }
00059 
00060 BOOL LLXform::isRootEdit() const
00061 {
00062         return (!mParent);
00063 }
00064 
00065 LLXformMatrix::~LLXformMatrix()
00066 {
00067 }
00068 
00069 void LLXformMatrix::update()
00070 {
00071         if (mParent) 
00072         {
00073                 mWorldPosition = mPosition;
00074                 if (mParent->getScaleChildOffset())
00075                 {
00076                         mWorldPosition.scaleVec(mParent->getScale());
00077                 }
00078                 mWorldPosition *= mParent->getWorldRotation();
00079                 mWorldPosition += mParent->getWorldPosition();
00080                 mWorldRotation = mRotation * mParent->getWorldRotation();
00081         }
00082         else
00083         {
00084                 mWorldPosition = mPosition;
00085                 mWorldRotation = mRotation;
00086         }
00087 }
00088 
00089 void LLXformMatrix::updateMatrix(BOOL update_bounds)
00090 {
00091         update();
00092 
00093         mWorldMatrix.initAll(mScale, mWorldRotation, mWorldPosition);
00094 
00095         if (update_bounds && (mChanged & MOVED))
00096         {
00097                 mMin.mV[0] = mMax.mV[0] = mWorldMatrix.mMatrix[3][0];
00098                 mMin.mV[1] = mMax.mV[1] = mWorldMatrix.mMatrix[3][1];
00099                 mMin.mV[2] = mMax.mV[2] = mWorldMatrix.mMatrix[3][2];
00100 
00101                 F32 f0 = (fabs(mWorldMatrix.mMatrix[0][0])+fabs(mWorldMatrix.mMatrix[1][0])+fabs(mWorldMatrix.mMatrix[2][0])) * 0.5f;
00102                 F32 f1 = (fabs(mWorldMatrix.mMatrix[0][1])+fabs(mWorldMatrix.mMatrix[1][1])+fabs(mWorldMatrix.mMatrix[2][1])) * 0.5f;
00103                 F32 f2 = (fabs(mWorldMatrix.mMatrix[0][2])+fabs(mWorldMatrix.mMatrix[1][2])+fabs(mWorldMatrix.mMatrix[2][2])) * 0.5f;
00104 
00105                 mMin.mV[0] -= f0; 
00106                 mMin.mV[1] -= f1; 
00107                 mMin.mV[2] -= f2; 
00108 
00109                 mMax.mV[0] += f0; 
00110                 mMax.mV[1] += f1; 
00111                 mMax.mV[2] += f2; 
00112         }
00113 }
00114 
00115 void LLXformMatrix::getMinMax(LLVector3& min, LLVector3& max) const
00116 {
00117         min = mMin;
00118         max = mMax;
00119 }

Generated on Thu Jul 1 06:10:03 2010 for Second Life Viewer by  doxygen 1.4.7