lltextureanim.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:5k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltextureanim.cpp
  3.  * @brief LLTextureAnim base class
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "linden_common.h"
  33. #include "lltextureanim.h"
  34. #include "message.h"
  35. #include "lldatapacker.h"
  36. const S32 TA_BLOCK_SIZE = 16;
  37. LLTextureAnim::LLTextureAnim()
  38. {
  39. reset();
  40. }
  41. LLTextureAnim::~LLTextureAnim()
  42. {
  43. }
  44. void LLTextureAnim::reset()
  45. {
  46. mMode = 0;
  47. mFace = -1;
  48. mSizeX = 4;
  49. mSizeY = 4;
  50. mStart = 0.f;
  51. mLength = 0.f;
  52. mRate = 1.f;
  53. }
  54. BOOL LLTextureAnim::equals(const LLTextureAnim &other) const
  55. {
  56. if (mMode != other.mMode)
  57. {
  58. return FALSE;
  59. }
  60. if (mFace != other.mFace)
  61. {
  62. return FALSE;
  63. }
  64. if (mSizeX != other.mSizeX)
  65. {
  66. return FALSE;
  67. }
  68. if (mSizeY != other.mSizeY)
  69. {
  70. return FALSE;
  71. }
  72. if (mStart != other.mStart)
  73. {
  74. return FALSE;
  75. }
  76. if (mLength != other.mLength)
  77. {
  78. return FALSE;
  79. }
  80. if (mRate != other.mRate)
  81. {
  82. return FALSE;
  83. }
  84. return TRUE;
  85. }
  86. void LLTextureAnim::packTAMessage(LLMessageSystem *mesgsys) const
  87. {
  88. U8 data[TA_BLOCK_SIZE];
  89. data[0] = mMode;
  90. data[1] = mFace;
  91. data[2] = mSizeX;
  92. data[3] = mSizeY;
  93. htonmemcpy(data + 4, &mStart, MVT_F32, sizeof(F32));
  94. htonmemcpy(data + 8, &mLength, MVT_F32, sizeof(F32));
  95. htonmemcpy(data + 12, &mRate, MVT_F32, sizeof(F32));
  96. mesgsys->addBinaryDataFast(_PREHASH_TextureAnim, data, TA_BLOCK_SIZE);
  97. }
  98. void LLTextureAnim::packTAMessage(LLDataPacker &dp) const
  99. {
  100. U8 data[TA_BLOCK_SIZE];
  101. data[0] = mMode;
  102. data[1] = mFace;
  103. data[2] = mSizeX;
  104. data[3] = mSizeY;
  105. htonmemcpy(data + 4, &mStart, MVT_F32, sizeof(F32));
  106. htonmemcpy(data + 8, &mLength, MVT_F32, sizeof(F32));
  107. htonmemcpy(data + 12, &mRate, MVT_F32, sizeof(F32));
  108. dp.packBinaryData(data, TA_BLOCK_SIZE, "TextureAnimation");
  109. }
  110. void LLTextureAnim::unpackTAMessage(LLMessageSystem *mesgsys, const S32 block_num)
  111. {
  112. S32 size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_TextureAnim);
  113. if (size != TA_BLOCK_SIZE)
  114. {
  115. if (size)
  116. {
  117. llwarns << "Bad size " << size << " for TA block, ignoring." << llendl;
  118. }
  119. mMode = 0;
  120. return;
  121. }
  122. U8 data[TA_BLOCK_SIZE];
  123. mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextureAnim, data, TA_BLOCK_SIZE, block_num);
  124. mMode = data[0];
  125. mFace = data[1];
  126. if (mMode & LLTextureAnim::SMOOTH)
  127. {
  128. mSizeX = llmax((U8)0, data[2]);
  129. mSizeY = llmax((U8)0, data[3]);
  130. }
  131. else
  132. {
  133. mSizeX = llmax((U8)1, data[2]);
  134. mSizeY = llmax((U8)1, data[3]);
  135. }
  136. htonmemcpy(&mStart, data + 4, MVT_F32, sizeof(F32));
  137. htonmemcpy(&mLength, data + 8, MVT_F32, sizeof(F32));
  138. htonmemcpy(&mRate, data + 12, MVT_F32, sizeof(F32));
  139. }
  140. void LLTextureAnim::unpackTAMessage(LLDataPacker &dp)
  141. {
  142. S32 size;
  143. U8 data[TA_BLOCK_SIZE];
  144. dp.unpackBinaryData(data, size, "TextureAnimation");
  145. if (size != TA_BLOCK_SIZE)
  146. {
  147. if (size)
  148. {
  149. llwarns << "Bad size " << size << " for TA block, ignoring." << llendl;
  150. }
  151. mMode = 0;
  152. return;
  153. }
  154. mMode = data[0];
  155. mFace = data[1];
  156. mSizeX = llmax((U8)1, data[2]);
  157. mSizeY = llmax((U8)1, data[3]);
  158. htonmemcpy(&mStart, data + 4, MVT_F32, sizeof(F32));
  159. htonmemcpy(&mLength, data + 8, MVT_F32, sizeof(F32));
  160. htonmemcpy(&mRate, data + 12, MVT_F32, sizeof(F32));
  161. }
  162. LLSD LLTextureAnim::asLLSD() const
  163. {
  164. LLSD sd;
  165. sd["mode"] = mMode;
  166. sd["face"] = mFace;
  167. sd["sizeX"] = mSizeX;
  168. sd["sizeY"] = mSizeY;
  169. sd["start"] = mStart;
  170. sd["length"] = mLength;
  171. sd["rate"] = mRate;
  172. return sd;
  173. }
  174. bool LLTextureAnim::fromLLSD(LLSD& sd)
  175. {
  176. const char *w;
  177. w = "mode";
  178. if (sd.has(w))
  179. {
  180. mMode = (U8)sd[w].asInteger();
  181. } else goto fail;
  182. w = "face";
  183. if (sd.has(w))
  184. {
  185. mFace = (S8)sd[w].asInteger();
  186. } else goto fail;
  187. w = "sizeX";
  188. if (sd.has(w))
  189. {
  190. mSizeX = (U8)sd[w].asInteger();
  191. } else goto fail;
  192. w = "sizeY";
  193. if (sd.has(w))
  194. {
  195. mSizeY = (U8)sd[w].asInteger();
  196. } else goto fail;
  197. w = "start";
  198. if (sd.has(w))
  199. {
  200. mStart = (F32)sd[w].asReal();
  201. } else goto fail;
  202. w = "length";
  203. if (sd.has(w))
  204. {
  205. mLength = (F32)sd[w].asReal();
  206. } else goto fail;
  207. w = "rate";
  208. if (sd.has(w))
  209. {
  210. mRate = (F32)sd[w].asReal();
  211. } else goto fail;
  212. return true;
  213. fail:
  214. return false;
  215. }