Skip to content

Commit 15d1fb6

Browse files
committed
added lerp_exponential_decay and slerp_exponential_decay functions as fram-rate indepented alternatives to lerping/slerping in update with delta time.
1 parent bfddf68 commit 15d1fb6

File tree

2 files changed

+24
-13
lines changed

2 files changed

+24
-13
lines changed

ursina/curve.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -226,10 +226,10 @@ def in_out_bounce(t):
226226
return (out_bounce((t * 2) - 1) * .5) + .5
227227

228228
def zero(t):
229-
return 0
229+
return 0
230230

231231
def one(t):
232-
return 1
232+
return 1
233233

234234
def combine(curve_a, curve_b, split_at):
235235
def _new_curve_func(t):
@@ -261,7 +261,6 @@ def {e}_boomerang(t):
261261
'''))
262262

263263

264-
# bezier code is translated from WebKit implementation
265264
class CubicBezier:
266265
__slots__ = ['a', 'b', 'c', 'd', 'cx', 'bx', 'ax', 'cy', 'by', 'ay']
267266

@@ -367,7 +366,7 @@ def render_curve(curve_function, name):
367366
# except:
368367
# pass
369368

370-
369+
371370

372371
c = CubicBezier(0, .5, 1, .5)
373372
print('-----------', c.calculate(.23))

ursina/ursinamath.py

+21-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from math import sqrt, sin, acos, pi, cos, floor
2+
from math import hypot
23
from panda3d.core import Vec4, LVector3f
34
from ursina.vec2 import Vec2
45
from ursina.vec3 import Vec3
@@ -71,6 +72,10 @@ def inverselerp(a, b, value): # get *where* between a and b, value is (0.0 - 1
7172
_test(lerp, (0, 100, .5), 50)
7273

7374

75+
def lerp_exponential_decay(a, b, decay_rate): # frame-rate independent lerp for use in update. use this instead of lerp(a, b, time.dt) in update.
76+
return lerp(a, b, 1 - pow(0.01, decay_rate))
77+
78+
7479
def lerp_angle(start_angle, end_angle, t):
7580
start_angle = start_angle % 360
7681
end_angle = end_angle % 360
@@ -82,12 +87,12 @@ def lerp_angle(start_angle, end_angle, t):
8287

8388
def slerp(q1, q2, t):
8489
costheta = q1.dot(q2)
85-
90+
8691
# ensure shortest path by flipping q2 if dot product is negative
8792
if costheta < 0.0:
8893
q2 = -q2
8994
costheta = -costheta
90-
95+
9196
costheta = clamp(costheta, -1.0, 1.0) # ensure valid range for acos
9297

9398
theta = acos(costheta)
@@ -103,6 +108,9 @@ def slerp(q1, q2, t):
103108
return (q1 * r1) + (q2 * r2)
104109

105110

111+
def slerp_exponential_decay(q1, q2, decay_rate): # frame-rate independent version of slerp for use in update.
112+
return slerp(q1, q2, 1 - pow(0.01, decay_rate))
113+
106114

107115
def clamp(value, floor, ceiling):
108116
return max(min(value, ceiling), floor)
@@ -175,15 +183,15 @@ def make_gradient(index_value_dict):
175183

176184
if __name__ == '__main__':
177185
_test(make_gradient, ({'0':color.hex('#ff0000ff'), '2':color.hex('#ffffffff')}, ), expected_result=[
178-
color.hex('#ff0000ff'),
179-
lerp(color.hex('#ff0000ff'), color.hex('#ffffffff'), .5),
186+
color.hex('#ff0000ff'),
187+
lerp(color.hex('#ff0000ff'), color.hex('#ffffffff'), .5),
180188
color.hex('#ffffffff'),
181189
])
182190
_test(make_gradient, ({'0':color.hex('#ff0000ff'), '4':color.hex('#ffffffff')}, ), expected_result=[
183-
color.hex('#ff0000ff'),
184-
lerp(color.hex('#ff0000ff'), color.hex('#ffffffff'), .25),
185-
lerp(color.hex('#ff0000ff'), color.hex('#ffffffff'), .5),
186-
lerp(color.hex('#ff0000ff'), color.hex('#ffffffff'), .75),
191+
color.hex('#ff0000ff'),
192+
lerp(color.hex('#ff0000ff'), color.hex('#ffffffff'), .25),
193+
lerp(color.hex('#ff0000ff'), color.hex('#ffffffff'), .5),
194+
lerp(color.hex('#ff0000ff'), color.hex('#ffffffff'), .75),
187195
color.hex('#ffffffff'),
188196
])
189197
_test(make_gradient, ({'0':16, '2':0}, ), expected_result=[16, 8, 0])
@@ -222,10 +230,14 @@ def __init__(self, start, end, center, size):
222230

223231
if __name__ == '__main__':
224232
from ursina import *
233+
from ursinastuff import _assert, _test
225234
app = Ursina()
226235
e1 = Entity(position = (0,0,0))
227236
e2 = Entity(position = (0,1,1))
228-
distance(e1, e2)
237+
_test(distance, (e1, e2), expected_result=1.4142135623730951)
238+
239+
_test(distance_2d, (Vec2(0,0), Vec2(1,1)), expected_result=1.4142135623730951)
240+
229241
distance_xz(e1, e2.position)
230242

231243
between_color = lerp(color.lime, color.magenta, .5)

0 commit comments

Comments
 (0)