lltextureanim.cpp

Go to the documentation of this file.
00001 
00032 #include "linden_common.h"
00033 
00034 #include "lltextureanim.h"
00035 #include "message.h"
00036 #include "lldatapacker.h"
00037 
00038 const S32 TA_BLOCK_SIZE = 16;
00039 
00040 LLTextureAnim::LLTextureAnim()
00041 {
00042         reset();
00043 }
00044 
00045 
00046 LLTextureAnim::~LLTextureAnim()
00047 {
00048 }
00049 
00050 
00051 void LLTextureAnim::reset()
00052 {
00053         mMode = 0;
00054         mFace = -1;
00055         mSizeX = 4;
00056         mSizeY = 4;
00057         mStart = 0.f;
00058         mLength = 0.f;
00059         mRate = 1.f;
00060 }
00061 
00062 BOOL LLTextureAnim::equals(const LLTextureAnim &other) const
00063 {
00064         if (mMode != other.mMode)
00065         {
00066                 return FALSE;
00067         }
00068         if (mFace != other.mFace)
00069         {
00070                 return FALSE;
00071         }
00072         if (mSizeX != other.mSizeX)
00073         {
00074                 return FALSE;
00075         }
00076         if (mSizeY != other.mSizeY)
00077         {
00078                 return FALSE;
00079         }
00080         if (mStart != other.mStart)
00081         {
00082                 return FALSE;
00083         }
00084         if (mLength != other.mLength)
00085         {
00086                 return FALSE;
00087         }
00088         if (mRate != other.mRate)
00089         {
00090                 return FALSE;
00091         }
00092 
00093         return TRUE;
00094 }
00095 void LLTextureAnim::packTAMessage(LLMessageSystem *mesgsys) const
00096 {
00097         U8 data[TA_BLOCK_SIZE];
00098         data[0] = mMode;
00099         data[1] = mFace;
00100         data[2] = mSizeX;
00101         data[3] = mSizeY;
00102         htonmemcpy(data + 4, &mStart, MVT_F32, sizeof(F32));
00103         htonmemcpy(data + 8, &mLength, MVT_F32, sizeof(F32));
00104         htonmemcpy(data + 12, &mRate, MVT_F32, sizeof(F32));
00105 
00106         mesgsys->addBinaryDataFast(_PREHASH_TextureAnim, data, TA_BLOCK_SIZE);
00107 }
00108 
00109 
00110 void LLTextureAnim::packTAMessage(LLDataPacker &dp) const
00111 {
00112         U8 data[TA_BLOCK_SIZE];
00113         data[0] = mMode;
00114         data[1] = mFace;
00115         data[2] = mSizeX;
00116         data[3] = mSizeY;
00117         htonmemcpy(data + 4, &mStart, MVT_F32, sizeof(F32));
00118         htonmemcpy(data + 8, &mLength, MVT_F32, sizeof(F32));
00119         htonmemcpy(data + 12, &mRate, MVT_F32, sizeof(F32));
00120 
00121         dp.packBinaryData(data, TA_BLOCK_SIZE, "TextureAnimation");
00122 }
00123 
00124 
00125 void LLTextureAnim::unpackTAMessage(LLMessageSystem *mesgsys, const S32 block_num)
00126 {
00127         S32 size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_TextureAnim);
00128 
00129         if (size != TA_BLOCK_SIZE)
00130         {
00131                 if (size)
00132                 {
00133                         llwarns << "Bad size " << size << " for TA block, ignoring." << llendl;
00134                 }
00135                 mMode = 0;
00136                 return;
00137         }
00138 
00139         U8 data[TA_BLOCK_SIZE];
00140         mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextureAnim, data, TA_BLOCK_SIZE, block_num);
00141 
00142         mMode = data[0];
00143         mFace = data[1];
00144         if (mMode & LLTextureAnim::SMOOTH)
00145         {
00146                 mSizeX = llmax((U8)0, data[2]);
00147                 mSizeY = llmax((U8)0, data[3]);
00148         }
00149         else
00150         {
00151                 mSizeX = llmax((U8)1, data[2]);
00152                 mSizeY = llmax((U8)1, data[3]);
00153         }
00154         htonmemcpy(&mStart, data + 4, MVT_F32, sizeof(F32));
00155         htonmemcpy(&mLength, data + 8, MVT_F32, sizeof(F32));
00156         htonmemcpy(&mRate, data + 12, MVT_F32, sizeof(F32));
00157 }
00158 
00159 void LLTextureAnim::unpackTAMessage(LLDataPacker &dp)
00160 {
00161         S32 size;
00162         U8 data[TA_BLOCK_SIZE];
00163         dp.unpackBinaryData(data, size, "TextureAnimation");
00164         if (size != TA_BLOCK_SIZE)
00165         {
00166                 if (size)
00167                 {
00168                         llwarns << "Bad size " << size << " for TA block, ignoring." << llendl;
00169                 }
00170                 mMode = 0;
00171                 return;
00172         }
00173 
00174         mMode = data[0];
00175         mFace = data[1];
00176         mSizeX = llmax((U8)1, data[2]);
00177         mSizeY = llmax((U8)1, data[3]);
00178         htonmemcpy(&mStart, data + 4, MVT_F32, sizeof(F32));
00179         htonmemcpy(&mLength, data + 8, MVT_F32, sizeof(F32));
00180         htonmemcpy(&mRate, data + 12, MVT_F32, sizeof(F32));
00181 }
00182 
00183 LLSD LLTextureAnim::asLLSD() const
00184 {
00185         LLSD sd;
00186         sd["mode"] = mMode;
00187         sd["face"] = mFace;
00188         sd["sizeX"] = mSizeX;
00189         sd["sizeY"] = mSizeY;
00190         sd["start"] = mStart;
00191         sd["length"] = mLength;
00192         sd["rate"] = mRate;
00193         return sd;
00194 }
00195 
00196 bool LLTextureAnim::fromLLSD(LLSD& sd)
00197 {
00198         const char *w;
00199         w = "mode";
00200         if (sd.has(w))
00201         {
00202                 mMode = (U8)sd[w].asInteger();
00203         } else goto fail;
00204 
00205         w = "face";
00206         if (sd.has(w))
00207         {
00208                 mFace = (S8)sd[w].asInteger();
00209         } else goto fail;
00210 
00211         w = "sizeX";
00212         if (sd.has(w))
00213         {
00214                 mSizeX = (U8)sd[w].asInteger();
00215         } else goto fail;
00216 
00217         w = "sizeY";
00218         if (sd.has(w))
00219         {
00220                 mSizeY = (U8)sd[w].asInteger();
00221         } else goto fail;
00222 
00223         w = "start";
00224         if (sd.has(w))
00225         {
00226                 mStart = (F32)sd[w].asReal();
00227         } else goto fail;
00228 
00229         w = "length";
00230         if (sd.has(w))
00231         {
00232                 mLength = (F32)sd[w].asReal();
00233         } else goto fail;
00234 
00235         w = "rate";
00236         if (sd.has(w))
00237         {
00238                 mRate = (F32)sd[w].asReal();
00239         } else goto fail;
00240 
00241         return true;
00242 fail:
00243         return false;
00244 }

Generated on Fri May 16 08:32:47 2008 for SecondLife by  doxygen 1.5.5