llviewertextureanim.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:5k
源码类别:
游戏引擎
开发平台:
C++ Builder
- /**
- * @file llviewertextureanim.cpp
- * @brief LLViewerTextureAnim class implementation
- *
- * $LicenseInfo:firstyear=2003&license=viewergpl$
- *
- * Copyright (c) 2003-2010, 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 "llviewerprecompiledheaders.h"
- #include "llviewertextureanim.h"
- #include "llmath.h"
- #include "llerror.h"
- LLViewerTextureAnim::LLViewerTextureAnim() : LLTextureAnim()
- {
- mLastFrame = -1.f; // Force an update initially
- mLastTime = 0.f;
- mOffS = mOffT = 0;
- mScaleS = mScaleT = 1;
- mRot = 0;
- }
- LLViewerTextureAnim::~LLViewerTextureAnim()
- {
- }
- void LLViewerTextureAnim::reset()
- {
- LLTextureAnim::reset();
- mTimer.reset();
- }
- S32 LLViewerTextureAnim::animateTextures(F32 &off_s, F32 &off_t,
- F32 &scale_s, F32 &scale_t,
- F32 &rot)
- {
- S32 result = 0;
- if (!(mMode & ON))
- {
- mLastTime = 0.f;
- mLastFrame = -1.f;
- return result;
- }
- F32 num_frames = 1.0;
- F32 full_length = 1.0;
- if (mLength)
- {
- num_frames = mLength;
- }
- else
- {
- num_frames = llmax(1.f, (F32)(mSizeX * mSizeY));
- }
- if (mMode & PING_PONG)
- {
- if (mMode & SMOOTH)
- {
- full_length = 2.f*num_frames;
- }
- else if (mMode & LOOP)
- {
- full_length = 2.f*num_frames - 2.f;
- full_length = llmax(1.f, full_length);
- }
- else
- {
- full_length = 2.f*num_frames - 1.f;
- full_length = llmax(1.f, full_length);
- }
- }
- else
- {
- full_length = num_frames;
- }
- F32 frame_counter;
- if (mMode & SMOOTH)
- {
- frame_counter = mTimer.getElapsedTimeAndResetF32() * mRate + (F32)mLastTime;
- }
- else
- {
- frame_counter = mTimer.getElapsedTimeF32() * mRate;
- }
- mLastTime = frame_counter;
- if (mMode & LOOP)
- {
- frame_counter = fmod(frame_counter, full_length);
- }
- else
- {
- frame_counter = llmin(full_length - 1.f, frame_counter);
- }
- if (!(mMode & SMOOTH))
- {
- frame_counter = (F32)llfloor(frame_counter + 0.01f);
- }
- if (mMode & PING_PONG)
- {
- if (frame_counter >= num_frames)
- {
- if (mMode & SMOOTH)
- {
- frame_counter = num_frames - (frame_counter - num_frames);
- }
- else
- {
- frame_counter = (num_frames - 1.99f) - (frame_counter - num_frames);
- }
- }
- }
- if (mMode & REVERSE)
- {
- if (mMode & SMOOTH)
- {
- frame_counter = num_frames - frame_counter;
- }
- else
- {
- frame_counter = (num_frames - 0.99f) - frame_counter;
- }
- }
- frame_counter += mStart;
- if (!(mMode & SMOOTH))
- {
- frame_counter = (F32)llround(frame_counter);
- }
- //
- // Now that we've calculated the frame time, do an update.
- // Will we correctly update stuff if the texture anim has
- // changed, but not the frame counter?
- //
- if (mLastFrame != frame_counter)
- {
- mLastFrame = frame_counter;
- if (mMode & ROTATE)
- {
- result |= ROTATE;
- mRot = rot = frame_counter;
- }
- else if (mMode & SCALE)
- {
- result |= SCALE;
- mScaleS = scale_s = frame_counter;
- mScaleT = scale_t = frame_counter;
- }
- else
- {
- result |= TRANSLATE;
- F32 x_frame;
- S32 y_frame;
- F32 x_pos;
- F32 y_pos;
- if ( (mSizeX)
- &&(mSizeY))
- {
- result |= SCALE;
- mScaleS = scale_s = 1.f/mSizeX;
- mScaleT = scale_t = 1.f/mSizeY;
- x_frame = fmod(frame_counter, mSizeX);
- y_frame = (S32)(frame_counter / mSizeX);
- x_pos = x_frame * scale_s;
- y_pos = y_frame * scale_t;
- mOffS = off_s = (-0.5f + 0.5f*scale_s)+ x_pos;
- mOffT = off_t = (0.5f - 0.5f*scale_t) - y_pos;
- }
- else
- {
- mScaleS = scale_s = 1.f;
- mScaleT = scale_t = 1.f;
- x_pos = frame_counter * scale_s;
- mOffS = off_s = (-0.5f + 0.5f*scale_s)+ x_pos;
- mOffT = off_t = 0.f;
- }
- }
- }
- return result;
- }