Skip to content

Commit

Permalink
Merge pull request #20 from dmarx/fix_easing_again
Browse files Browse the repository at this point in the history
fix easing for realsies this time
  • Loading branch information
dmarx committed Jan 13, 2023
2 parents 222f1c6 + b4d4443 commit 22ff6c6
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 31 deletions.
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

setup(
name='keyframed',
version='0.2.0',
version='0.2.1',
author='David Marx',
long_description=README,
long_description_content_type='text/markdown',
Expand Down
50 changes: 27 additions & 23 deletions src/keyframed/curve.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,12 +169,24 @@ def get_ease_end_t(self) -> Number:
def use_easing(self, k) -> bool:
if self.f is None:
return False
return self.start_t < k < self.end_t

try:
start = self.start_t
end = self.end_t
except IndexError:
return False
if (start is None) or (end is None):
return False
return start < k < end
def __call__(self,k:Number) -> Number:
if not self.use_easing(k):
return k
span = self.end_t - self.start_t
t = (k-self.start_t) / span
#t = (self.end_t-k) / span
t_new = self.f(t)
k_new = self.start_t + t_new*span
return k_new

# NB: It's worrisome to me that I had to separately implement __call__ for EaseIn and EaseOut
# rather than just using a shared __call__ implementation on EasingFunction. I think I inverted
# some stuff in EaseOut maybe?

class EaseIn(EasingFunction):
def get_ease_start_t(self) -> Number:
Expand All @@ -189,15 +201,7 @@ def get_ease_end_t(self) -> Number:
for k in self.curve.keyframes:
if self.curve[k] != 0:
return k
def __call__(self,k:Number) -> Number:
if not self.use_easing(k):
return k
span = self.end_t - self.start_t
t = (k-self.start_t) / span
#t = (self.end_t-k) / span
t_new = self.f(t)
k_new = self.start_t + t_new*span
return k_new


class EaseOut(EasingFunction):
def get_ease_start_t(self) -> Number:
Expand All @@ -224,15 +228,15 @@ def get_ease_end_t(self) -> Number:
k_prev = k
else:
return self.curve.keyframes[-1]
def __call__(self,k:Number) -> Number:
if not self.use_easing(k):
return k
span = self.end_t - self.start_t
#t = (k-self.start_t) / span
t = (self.end_t-k) / span
t_new = self.f(t)
k_new = self.start_t + t_new*span
return k_new
# def __call__(self,k:Number) -> Number:
# if not self.use_easing(k):
# return k
# span = self.end_t - self.start_t
# #t = (k-self.start_t) / span
# t = (self.end_t-k) / span
# t_new = self.f(t)
# k_new = self.start_t + t_new*span
# return k_new

class Curve:
"""
Expand Down
28 changes: 21 additions & 7 deletions tests/test_easing.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,10 @@ def test_actual_use_case1():
import math
def sin2(t):
return math.sin(t * math.pi / 2) ** 2
def cos2(t):
return math.cos(t * math.pi / 2) ** 2
curve = Curve({0:1, 30:0.5, 50:0}, default_interpolation='linear', ease_in=sin2, ease_out=cos2)
#def cos2(t):
# return math.cos(t * math.pi / 2) ** 2
#curve = Curve({0:1, 30:0.5, 50:0}, default_interpolation='linear', ease_in=sin2, ease_out=cos2)
curve = Curve({0:1, 30:0.5, 50:0}, default_interpolation='linear', ease_in=sin2, ease_out=sin2)
#print(curve.ease_in.start_t, curve.ease_in.end_t)
#print(curve.ease_out.start_t, curve.ease_out.end_t)
#xs = list(range(50))
Expand All @@ -163,9 +164,10 @@ def test_actual_use_case2():
import math
def sin2(t):
return math.sin(t * math.pi / 2) ** 2
def cos2(t):
return math.cos(t * math.pi / 2) ** 2
curve = Curve({20:0, 40:1, 70:0}, default_interpolation='linear', ease_in=sin2, ease_out=cos2)
#def cos2(t):
# return math.cos(t * math.pi / 2) ** 2
#curve = Curve({20:0, 40:1, 70:0}, default_interpolation='linear', ease_in=sin2, ease_out=cos2)
curve = Curve({20:0, 40:1, 70:0}, default_interpolation='linear', ease_in=sin2, ease_out=sin2)
# print(curve.ease_in.start_t, curve.ease_in.end_t)
# print(curve.ease_out.start_t, curve.ease_out.end_t)
# xs = list(range(70))
Expand All @@ -183,4 +185,16 @@ def cos2(t):
assert abs(curve[55] - 0.5) < EPS
assert curve[70] == 0
# yeah I def need to do something about this.
assert curve[80] == 0 # throws an index error. probably not great.
assert curve[80] == 0 # throws an index error. probably not great.

###################

def test_easing_not_break_small_curve():
"""
current implementation of easing presumes Curve contains at least
two Keyframes. This is bad.
"""
curve = Curve(ease_in = lambda x:x)
curve[0]
curve[1]
curve[2]

0 comments on commit 22ff6c6

Please sign in to comment.