summaryrefslogtreecommitdiff
path: root/src/anim/EaseInOutAnim.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/anim/EaseInOutAnim.cpp')
-rw-r--r--src/anim/EaseInOutAnim.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/anim/EaseInOutAnim.cpp b/src/anim/EaseInOutAnim.cpp
new file mode 100644
index 0000000..c8a3cf7
--- /dev/null
+++ b/src/anim/EaseInOutAnim.cpp
@@ -0,0 +1,71 @@
+//
+// libavg - Media Playback Engine.
+// Copyright (C) 2003-2014 Ulrich von Zadow
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// Current versions can be found at www.libavg.de
+//
+
+#include "EaseInOutAnim.h"
+
+#include "../player/Player.h"
+#include "../base/MathHelper.h"
+
+#include <math.h>
+
+using namespace boost::python;
+using namespace std;
+
+namespace avg {
+
+EaseInOutAnim::EaseInOutAnim(const object& node, const string& sAttrName,
+ long long duration, const object& startValue, const object& endValue,
+ long long easeInDuration, long long easeOutDuration, bool bUseInt,
+ const object& startCallback, const object& stopCallback)
+ : SimpleAnim(node, sAttrName, duration, startValue, endValue, bUseInt, startCallback,
+ stopCallback),
+ m_EaseInDuration(float(easeInDuration)/duration),
+ m_EaseOutDuration(float(easeOutDuration)/duration)
+{
+}
+
+EaseInOutAnim::~EaseInOutAnim()
+{
+}
+
+float EaseInOutAnim::interpolate(float t)
+{
+ float accelDist = m_EaseInDuration*2/PI;
+ float decelDist = m_EaseOutDuration*2/PI;
+ float dist;
+ if (t<m_EaseInDuration) {
+ // Acceleration stage
+ float nt = t/m_EaseInDuration;
+ float s = sin(-PI/2+nt*PI/2)+1;
+ dist = s*accelDist;
+ } else if (t > 1-m_EaseOutDuration) {
+ // Deceleration stage
+ float nt = (t-(1-m_EaseOutDuration))/m_EaseOutDuration;
+ float s = sin(nt*PI/2);
+ dist = accelDist+(1-m_EaseInDuration-m_EaseOutDuration)+s*decelDist;
+ } else {
+ // Linear stage
+ dist = accelDist+t-m_EaseInDuration;
+ }
+ return dist/(accelDist+(1-m_EaseInDuration-m_EaseOutDuration)+decelDist);
+}
+
+}