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 }