diff --git a/src/palace.pyx b/src/palace.pyx index 8a3e18c..a95b93d 100644 --- a/src/palace.pyx +++ b/src/palace.pyx @@ -1444,7 +1444,7 @@ cdef class Source: @property def position(self) -> Vector3: """3D position of the source.""" - return from_vector3(self.impl.get_position()) + return tuple(from_vector3(self.impl.get_position())) @position.setter def position(self, value: Vector3) -> None: @@ -1458,7 +1458,7 @@ cdef class Source: position, and instead just alters the pitch as determined by the doppler effect. """ - return from_vector3(self.impl.get_velocity()) + return tuple(from_vector3(self.impl.get_velocity())) @velocity.setter def velocity(self, value: Vector3) -> None: @@ -1481,7 +1481,7 @@ cdef class Source: comes from, this also affects the facing direction. """ cdef pair[alure.Vector3, alure.Vector3] o = self.impl.get_orientation() - return from_vector3(o.first), from_vector3(o.second) + return tuple(from_vector3(o.first)), tuple(from_vector3(o.second)) @orientation.setter def orientation(self, value: Tuple[Vector3, Vector3]) -> None: @@ -2234,7 +2234,7 @@ cdef class ReverbEffect(BaseEffect): @property def reflections_pan(self) -> Vector3: """Reflections as 3D vector of magnitude between 0 and 1.""" - return self.properties.reflections_pan + return tuple(self.properties.reflections_pan) @reflections_pan.setter def reflections_pan(self, value: Vector3) -> None: @@ -2277,7 +2277,7 @@ cdef class ReverbEffect(BaseEffect): @property def late_reverb_pan(self) -> Vector3: """Late reverb as 3D vector of magnitude between 0 and 1.""" - return self.properties.late_reverb_pan + return tuple(self.properties.late_reverb_pan) @late_reverb_pan.setter def late_reverb_pan(self, value: Vector3) -> None: diff --git a/tests/unit/fmath.py b/tests/unit/fmath.py index 5760d29..3945639 100644 --- a/tests/unit/fmath.py +++ b/tests/unit/fmath.py @@ -22,7 +22,7 @@ for single-precision floating-point numbers. __all__ = ['FLT_MAX', 'allclose', 'isclose'] from math import isclose as _isclose -from typing import Sequence +from typing import Any, Callable, Sequence FLT_EPSILON: float = 2.0 ** -23 FLT_MAX: float = 2.0**128 - 2.0**104 @@ -42,7 +42,8 @@ def isclose(a: float, b: float) -> bool: return _isclose(a, b, rel_tol=FLT_EPSILON) -def allclose(a: Sequence[float], b: Sequence[float]) -> bool: +def allclose(a: Sequence[float], b: Sequence[float], + close: Callable[[Any, Any], bool] = isclose) -> bool: """Determine whether two sequences of single-precision floating-point numbers are close in value. @@ -53,4 +54,4 @@ def allclose(a: Sequence[float], b: Sequence[float]) -> bool: That is, NaN is not close to anything, even itself. inf and -inf are only close to themselves. """ - return all(map(isclose, a, b)) + return type(a) is type(b) and all(map(close, a, b)) diff --git a/tests/unit/test_source.py b/tests/unit/test_source.py index 70f1c2b..4c2c087 100644 --- a/tests/unit/test_source.py +++ b/tests/unit/test_source.py @@ -200,9 +200,9 @@ def test_velocity(context): def test_orientation(context): """Test read-write property orientation.""" with Source(context) as source: - assert all(map(allclose, source.orientation, ((0, 0, -1), (0, 1, 0)))) + assert allclose(source.orientation, ((0, 0, -1), (0, 1, 0)), allclose) source.orientation = (1, 1, -2), (3, -5, 8) - assert all(map(allclose, source.orientation, ((1, 1, -2), (3, -5, 8)))) + assert allclose(source.orientation, ((1, 1, -2), (3, -5, 8)), allclose) def test_cone_angles(context):