/** * @file lltextureanim.cpp * @brief LLTextureAnim base class * * $LicenseInfo:firstyear=2001&license=viewergpl$ * * Copyright (c) 2001-2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement * ("Other License"), formally executed by you and Linden Lab. Terms of * the GPL can be found in doc/GPL-license.txt in this distribution, or * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 * * There are special exceptions to the terms and conditions of the GPL as * it is applied to this Source Code. View the full text of the exception * in the file doc/FLOSS-exception.txt in this software distribution, or * online at * http://secondlifegrid.net/programs/open_source/licensing/flossexception * * By copying, modifying or distributing this software, you acknowledge * that you have read and understood your obligations described above, * and agree to abide by those obligations. * * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, * COMPLETENESS OR PERFORMANCE. * $/LicenseInfo$ */ #include "linden_common.h" #include "lltextureanim.h" #include "llmessage.h" #include "lldatapacker.h" constexpr S32 TA_BLOCK_SIZE = 16; LLTextureAnim::LLTextureAnim() { reset(); } void LLTextureAnim::reset() { mMode = 0; mFace = -1; mSizeX = 4; mSizeY = 4; mStart = 0.f; mLength = 0.f; mRate = 1.f; } void LLTextureAnim::packTAMessage(LLMessageSystem* mesgsys) const { U8 data[TA_BLOCK_SIZE]; data[0] = mMode; data[1] = mFace; data[2] = mSizeX; data[3] = mSizeY; htonmemcpy(data + 4, &mStart, MVT_F32, sizeof(F32)); htonmemcpy(data + 8, &mLength, MVT_F32, sizeof(F32)); htonmemcpy(data + 12, &mRate, MVT_F32, sizeof(F32)); mesgsys->addBinaryDataFast(_PREHASH_TextureAnim, data, TA_BLOCK_SIZE); } void LLTextureAnim::packTAMessage(LLDataPacker& dp) const { U8 data[TA_BLOCK_SIZE]; data[0] = mMode; data[1] = mFace; data[2] = mSizeX; data[3] = mSizeY; htonmemcpy(data + 4, &mStart, MVT_F32, sizeof(F32)); htonmemcpy(data + 8, &mLength, MVT_F32, sizeof(F32)); htonmemcpy(data + 12, &mRate, MVT_F32, sizeof(F32)); dp.packBinaryData(data, TA_BLOCK_SIZE, "TextureAnimation"); } void LLTextureAnim::unpackTAMessage(LLMessageSystem* mesgsys, S32 block_num) { S32 size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_TextureAnim); if (size != TA_BLOCK_SIZE) { if (size) { llwarns << "Bad size " << size << " for TA block, ignoring." << llendl; } mMode = 0; return; } U8 data[TA_BLOCK_SIZE]; mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextureAnim, data, TA_BLOCK_SIZE, block_num); mMode = data[0]; mFace = data[1]; if (mMode & LLTextureAnim::SMOOTH) { mSizeX = llmax((U8)0, data[2]); mSizeY = llmax((U8)0, data[3]); } else { mSizeX = llmax((U8)1, data[2]); mSizeY = llmax((U8)1, data[3]); } htonmemcpy(&mStart, data + 4, MVT_F32, sizeof(F32)); htonmemcpy(&mLength, data + 8, MVT_F32, sizeof(F32)); htonmemcpy(&mRate, data + 12, MVT_F32, sizeof(F32)); } void LLTextureAnim::unpackTAMessage(LLDataPacker& dp) { S32 size; U8 data[TA_BLOCK_SIZE]; dp.unpackBinaryData(data, size, "TextureAnimation"); if (size != TA_BLOCK_SIZE) { if (size) { llwarns << "Bad size " << size << " for TA block, ignoring." << llendl; } mMode = 0; return; } mMode = data[0]; mFace = data[1]; mSizeX = data[2]; mSizeY = data[3]; htonmemcpy(&mStart, data + 4, MVT_F32, sizeof(F32)); htonmemcpy(&mLength, data + 8, MVT_F32, sizeof(F32)); htonmemcpy(&mRate, data + 12, MVT_F32, sizeof(F32)); } LLSD LLTextureAnim::asLLSD() const { LLSD sd; sd["mode"] = mMode; sd["face"] = mFace; sd["sizeX"] = mSizeX; sd["sizeY"] = mSizeY; sd["start"] = mStart; sd["length"] = mLength; sd["rate"] = mRate; return sd; } bool LLTextureAnim::fromLLSD(LLSD& sd) { const char* w; w = "mode"; if (sd.has(w)) { mMode = (U8)sd[w].asInteger(); } else { return false; } w = "face"; if (sd.has(w)) { mFace = (S8)sd[w].asInteger(); } else { return false; } w = "sizeX"; if (sd.has(w)) { mSizeX = (U8)sd[w].asInteger(); } else { return false; } w = "sizeY"; if (sd.has(w)) { mSizeY = (U8)sd[w].asInteger(); } else { return false; } w = "start"; if (sd.has(w)) { mStart = (F32)sd[w].asReal(); } else { return false; } w = "length"; if (sd.has(w)) { mLength = (F32)sd[w].asReal(); } else { return false; } w = "rate"; if (sd.has(w)) { mRate = (F32)sd[w].asReal(); } else { return false; } return true; }