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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llviewertextureanim.cpp
  3.  * @brief LLViewerTextureAnim class implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2003&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2003-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 "llviewerprecompiledheaders.h"
  33. #include "llviewertextureanim.h"
  34. #include "llmath.h"
  35. #include "llerror.h"
  36. LLViewerTextureAnim::LLViewerTextureAnim() : LLTextureAnim()
  37. {
  38. mLastFrame = -1.f; // Force an update initially
  39. mLastTime = 0.f;
  40. mOffS = mOffT = 0;
  41. mScaleS = mScaleT = 1;
  42. mRot = 0;
  43. }
  44. LLViewerTextureAnim::~LLViewerTextureAnim()
  45. {
  46. }
  47. void LLViewerTextureAnim::reset()
  48. {
  49. LLTextureAnim::reset();
  50. mTimer.reset();
  51. }
  52. S32 LLViewerTextureAnim::animateTextures(F32 &off_s, F32 &off_t,
  53. F32 &scale_s, F32 &scale_t,
  54. F32 &rot)
  55. {
  56. S32 result = 0;
  57. if (!(mMode & ON))
  58. {
  59. mLastTime = 0.f;
  60. mLastFrame = -1.f;
  61. return result;
  62. }
  63. F32 num_frames = 1.0;
  64. F32 full_length = 1.0;
  65. if (mLength)
  66. {
  67. num_frames = mLength;
  68. }
  69. else
  70. {
  71. num_frames = llmax(1.f, (F32)(mSizeX * mSizeY));
  72. }
  73. if (mMode & PING_PONG)
  74. {
  75. if (mMode & SMOOTH)
  76. {
  77. full_length = 2.f*num_frames;
  78. }
  79. else if (mMode & LOOP)
  80. {
  81. full_length = 2.f*num_frames - 2.f;
  82. full_length = llmax(1.f, full_length);
  83. }
  84. else
  85. {
  86. full_length = 2.f*num_frames - 1.f;
  87. full_length = llmax(1.f, full_length);
  88. }
  89. }
  90. else
  91. {
  92. full_length = num_frames;
  93. }
  94. F32 frame_counter;
  95. if (mMode & SMOOTH)
  96. {
  97. frame_counter = mTimer.getElapsedTimeAndResetF32() * mRate + (F32)mLastTime;
  98. }
  99. else
  100. {
  101. frame_counter = mTimer.getElapsedTimeF32() * mRate;
  102. }
  103. mLastTime = frame_counter;
  104. if (mMode & LOOP)
  105. {
  106. frame_counter  = fmod(frame_counter, full_length);
  107. }
  108. else
  109. {
  110. frame_counter = llmin(full_length - 1.f, frame_counter);
  111. }
  112. if (!(mMode & SMOOTH))
  113. {
  114. frame_counter = (F32)llfloor(frame_counter + 0.01f);
  115. }
  116. if (mMode & PING_PONG)
  117. {
  118. if (frame_counter >= num_frames)
  119. {
  120. if (mMode & SMOOTH)
  121. {
  122. frame_counter = num_frames - (frame_counter - num_frames);
  123. }
  124. else
  125. {
  126. frame_counter = (num_frames - 1.99f) - (frame_counter - num_frames);
  127. }
  128. }
  129. }
  130. if (mMode & REVERSE)
  131. {
  132. if (mMode & SMOOTH)
  133. {
  134. frame_counter = num_frames - frame_counter;
  135. }
  136. else
  137. {
  138. frame_counter = (num_frames - 0.99f) - frame_counter;
  139. }
  140. }
  141. frame_counter += mStart;
  142. if (!(mMode & SMOOTH))
  143. {
  144. frame_counter = (F32)llround(frame_counter);
  145. }
  146. //
  147. // Now that we've calculated the frame time, do an update.
  148. // Will we correctly update stuff if the texture anim has
  149. // changed, but not the frame counter?
  150. //
  151. if (mLastFrame != frame_counter)
  152. {
  153. mLastFrame = frame_counter;
  154. if (mMode & ROTATE)
  155. {
  156. result |= ROTATE;
  157. mRot = rot = frame_counter;
  158. }
  159. else if (mMode & SCALE)
  160. {
  161. result |= SCALE;
  162. mScaleS = scale_s = frame_counter;
  163. mScaleT = scale_t = frame_counter;
  164. }
  165. else
  166. {
  167. result |= TRANSLATE;
  168. F32 x_frame;
  169. S32 y_frame;
  170. F32 x_pos;
  171. F32 y_pos;
  172. if (  (mSizeX)
  173. &&(mSizeY))
  174. {
  175. result |= SCALE;
  176. mScaleS = scale_s = 1.f/mSizeX;
  177. mScaleT = scale_t = 1.f/mSizeY;
  178. x_frame = fmod(frame_counter, mSizeX);
  179. y_frame = (S32)(frame_counter / mSizeX);
  180. x_pos = x_frame * scale_s;
  181. y_pos = y_frame * scale_t;
  182. mOffS = off_s = (-0.5f + 0.5f*scale_s)+ x_pos;
  183. mOffT = off_t = (0.5f - 0.5f*scale_t) - y_pos;
  184. }
  185. else
  186. {
  187. mScaleS = scale_s = 1.f;
  188. mScaleT = scale_t = 1.f;
  189. x_pos = frame_counter * scale_s;
  190. mOffS = off_s = (-0.5f + 0.5f*scale_s)+ x_pos;
  191. mOffT = off_t = 0.f;
  192. }
  193. }
  194. }
  195. return result;
  196. }