Skip to content

Commit 2de394e

Browse files
committed
Added do_clamp to vector lerping
1 parent d83b661 commit 2de394e

File tree

5 files changed

+26
-5
lines changed

5 files changed

+26
-5
lines changed

buildconfig/stubs/pygame/math.pyi

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,11 @@ class _GenericVector(Collection[float]):
8282
self: _TVec, other: Union[SequenceLike[float], _TVec], /
8383
) -> float: ...
8484
def lerp(
85-
self: _TVec, other: Union[SequenceLike[float], _TVec], value: float, /
85+
self: _TVec,
86+
other: Union[SequenceLike[float], _TVec],
87+
value: float,
88+
do_clamp: bool = True,
89+
/,
8690
) -> _TVec: ...
8791
def slerp(
8892
self: _TVec, other: Union[SequenceLike[float], _TVec], value: float, /

docs/reST/ref/math.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,12 +386,18 @@ Conversion can be combined with swizzling or slicing to create a new order
386386

387387
| :sl:`returns a linear interpolation to the given vector.`
388388
| :sg:`lerp(Vector2, float, /) -> Vector2`
389+
| :sg:`lerp(Vector2, float, bool, /) -> Vector2`
389390
390391
Returns a Vector which is a linear interpolation between self and the
391392
given Vector. The second parameter determines how far between self and
392393
other the result is going to be. It must be a value between ``0`` and ``1``
393394
where ``0`` means self and ``1`` means other will be returned.
394395

396+
.. versionchanged:: 2.5.7 The ``do_clamp`` parameter is added with a default
397+
value of ``True``. When it's ``True``, the second parameter is limited
398+
to the closed interval ``[0, 1]``. When it's ``False``, the second parameter
399+
is not limited and the lerp will extend beyond the original two vectors.
400+
395401
.. ## Vector2.lerp ##
396402
397403
.. method:: slerp

src_c/doc/math_doc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#define DOC_MATH_VECTOR2_DISTANCESQUAREDTO "distance_squared_to(Vector2, /) -> float\ncalculates the squared Euclidean distance to a given vector."
2323
#define DOC_MATH_VECTOR2_MOVETOWARDS "move_towards(Vector2, float, /) -> Vector2\nreturns a vector moved toward the target by a given distance."
2424
#define DOC_MATH_VECTOR2_MOVETOWARDSIP "move_towards_ip(Vector2, float, /) -> None\nmoves the vector toward its target at a given distance."
25-
#define DOC_MATH_VECTOR2_LERP "lerp(Vector2, float, /) -> Vector2\nreturns a linear interpolation to the given vector."
25+
#define DOC_MATH_VECTOR2_LERP "lerp(Vector2, float, /) -> Vector2\nlerp(Vector2, float, bool, /) -> Vector2\nreturns a linear interpolation to the given vector."
2626
#define DOC_MATH_VECTOR2_SLERP "slerp(Vector2, float, /) -> Vector2\nreturns a spherical interpolation to the given vector."
2727
#define DOC_MATH_VECTOR2_SMOOTHSTEP "smoothstep(Vector2, float, /) -> Vector2\nreturns a smooth interpolation to the given vector."
2828
#define DOC_MATH_VECTOR2_ELEMENTWISE "elementwise() -> VectorElementwiseProxy\nThe next operation will be performed elementwise."

src_c/math.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1708,16 +1708,19 @@ vector_lerp(pgVector *self, PyObject *args)
17081708
pgVector *ret;
17091709
double t;
17101710
double other_coords[VECTOR_MAX_SIZE];
1711+
int do_clamp = 1;
17111712

1712-
if (!PyArg_ParseTuple(args, "Od:Vector.lerp", &other, &t)) {
1713+
if (!PyArg_ParseTuple(args, "Od|p:Vector.lerp", &other, &t, &do_clamp)) {
17131714
return NULL;
17141715
}
17151716
if (!pg_VectorCoordsFromObjOldDontUseInNewCode(other, other_coords,
17161717
self->dim)) {
17171718
return RAISE(PyExc_TypeError, "Expected Vector as argument 1");
17181719
}
1719-
if (t < 0 || t > 1) {
1720-
return RAISE(PyExc_ValueError, "Argument 2 must be in range [0, 1]");
1720+
if ((t < 0 || t > 1) && do_clamp > 0) {
1721+
return RAISE(PyExc_ValueError,
1722+
"Argument 2 must be in range [0, 1] when do_clamp is set "
1723+
"to True (the default value)");
17211724
}
17221725

17231726
ret = _vector_subtype_new(self);

test/math_test.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1139,14 +1139,18 @@ def test_lerp(self):
11391139
v2 = Vector2(10, 10)
11401140
self.assertEqual(v1.lerp(v2, 0.5), (5, 5))
11411141
self.assertRaises(ValueError, lambda: v1.lerp(v2, 2.5))
1142+
self.assertEqual(v1.lerp(v2, 2.5, False), (25, 25))
1143+
self.assertEqual(v1.lerp(v2, -1, False), (-10, -10))
11421144

11431145
v1 = Vector2(0, 0)
11441146
v2 = Vector2(10, 10)
11451147
self.assertEqual(v1.lerp(v2, 0.1), (1, 1))
1148+
self.assertEqual(v1.lerp(v2, 10, False), (100, 100))
11461149

11471150
v1 = Vector2(-10, -5)
11481151
v2 = Vector2(10, 10)
11491152
self.assertEqual(v1.lerp(v2, 0.5), (0, 2.5))
1153+
self.assertEqual(v1.lerp(v2, -10, False), (-210, -155))
11501154

11511155
def test_smoothstep(self):
11521156
v1 = Vector2(0, 0)
@@ -2892,14 +2896,18 @@ def test_lerp(self):
28922896
v2 = Vector3(10, 10, 10)
28932897
self.assertEqual(v1.lerp(v2, 0.5), (5, 5, 5))
28942898
self.assertRaises(ValueError, lambda: v1.lerp(v2, 2.5))
2899+
self.assertEqual(v1.lerp(v2, 2.5, False), (25, 25, 25))
2900+
self.assertEqual(v1.lerp(v2, -1, False), (-10, -10, -10))
28952901

28962902
v1 = Vector3(0, 0, 0)
28972903
v2 = Vector3(10, 10, 10)
28982904
self.assertEqual(v1.lerp(v2, 0.1), (1, 1, 1))
2905+
self.assertEqual(v1.lerp(v2, 10, False), (100, 100, 100))
28992906

29002907
v1 = Vector3(-10, -5, -20)
29012908
v2 = Vector3(10, 10, -20)
29022909
self.assertEqual(v1.lerp(v2, 0.5), (0, 2.5, -20))
2910+
self.assertEqual(v1.lerp(v2, -10, False), (-210, -155, -20))
29032911

29042912
def test_smoothstep(self):
29052913
v1 = Vector3(0, 0, 0)

0 commit comments

Comments
 (0)