From 047cffea580b8ff3b27d1755952448d5812df39b Mon Sep 17 00:00:00 2001 From: pushfoo <36696816+pushfoo@users.noreply.github.com> Date: Sat, 27 Apr 2024 23:19:53 -0400 Subject: [PATCH 1/4] Add OrthoGraphicData.lrbt props --- arcade/camera/data_types.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/arcade/camera/data_types.py b/arcade/camera/data_types.py index d632ead067..7d2b4f94c9 100644 --- a/arcade/camera/data_types.py +++ b/arcade/camera/data_types.py @@ -20,6 +20,8 @@ 'ZeroProjectionDimension', ] +from arcade.types import AsFloat + class ZeroProjectionDimension(ValueError): """A projection's dimensions were zero along at least one axis. @@ -136,9 +138,26 @@ def __init__( # Viewport for setting which pixels to draw to self.viewport: Tuple[int, int, int, int] = viewport + @property + def lrbt(self) -> Tuple[float, float, float, float]: + """Get/set a tuple for ``(left, right, bottom, top)``. + + This will be wired into rectangle abstractions in future + commits. + """ + return self.left, self.right, self.bottom, self.top + + @lrbt.setter + def lrbt(self, new_lrbt: Tuple[AsFloat, AsFloat, AsFloat, AsFloat]) -> None: + left, right, bottom, top = new_lrbt + self.left = float(left) + self.right = float(right) + self.top = float(top) + self.bottom = float(bottom) + def __str__(self): return (f"OrthographicProjection<" - f"LRBT={(self.left, self.right, self.bottom, self.top)}, " + f"LRBT={self.lrbt}, " f"{self.near=}, " f"{self.far=}, " f"{self.viewport=}>") From bbc1413f71f7546500018bddf135c6ee6a213803 Mon Sep 17 00:00:00 2001 From: pushfoo <36696816+pushfoo@users.noreply.github.com> Date: Sat, 27 Apr 2024 23:27:55 -0400 Subject: [PATCH 2/4] Reduce number of . accesses via OrthographicProjectionData.lrbt property --- arcade/camera/camera_2d.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/arcade/camera/camera_2d.py b/arcade/camera/camera_2d.py index abcf66c991..05e699a938 100644 --- a/arcade/camera/camera_2d.py +++ b/arcade/camera/camera_2d.py @@ -12,6 +12,7 @@ ZeroProjectionDimension ) from arcade.gl import Framebuffer +from arcade.types import AsFloat from arcade.window_commands import get_window @@ -313,11 +314,10 @@ def projection(self) -> Tuple[float, float, float, float]: exception if any axis pairs are equal. You can handle this exception as a :py:class:`ValueError`. """ - _p = self._projection_data - return _p.left, _p.right, _p.bottom, _p.top + return self._projection_data.lrbt @projection.setter - def projection(self, value: Tuple[float, float, float, float]) -> None: + def projection(self, value: Tuple[AsFloat, AsFloat, AsFloat, AsFloat]) -> None: # Unpack and validate left, right, bottom, top = value @@ -331,11 +331,12 @@ def projection(self, value: Tuple[float, float, float, float]) -> None: f"and {top=}")) # Modify the projection data itself. - _p = self._projection_data - _p.left = left - _p.right = right - _p.bottom = bottom - _p.top = top + self._projection_data.lrbt = ( + float(left), + float(right), + float(bottom), + float(top) + ) @property def projection_width(self) -> float: From 5d29c8c11975e505c9be27d4cad3a4cb992168e0 Mon Sep 17 00:00:00 2001 From: pushfoo <36696816+pushfoo@users.noreply.github.com> Date: Sat, 27 Apr 2024 23:35:33 -0400 Subject: [PATCH 3/4] Attempt to use .lrbt in projection_width_scaled --- arcade/camera/camera_2d.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/arcade/camera/camera_2d.py b/arcade/camera/camera_2d.py index 05e699a938..5c433bd130 100644 --- a/arcade/camera/camera_2d.py +++ b/arcade/camera/camera_2d.py @@ -373,12 +373,14 @@ def projection_width_scaled(self) -> float: @projection_width_scaled.setter def projection_width_scaled(self, _width: float) -> None: - w = self.projection_width * self._camera_data.zoom - l = self.projection_left / w # Normalised Projection left - r = self.projection_right / w # Normalised Projection Right + _p = self._projection_data + left, right, bottom, top = _p.lrbt - self.projection_left = l * _width - self.projection_right = r * _width + width_scaled = (right - left) * self._camera_data.zoom + left_scaled = self.projection_left / width_scaled + right_scaled = self.projection_right / width_scaled + + _p.lrbt = left_scaled, right_scaled, bottom, top @property def projection_height(self) -> float: From f0a7fa55087e325d19172a5c42469a8249fea93a Mon Sep 17 00:00:00 2001 From: pushfoo <36696816+pushfoo@users.noreply.github.com> Date: Sat, 27 Apr 2024 23:38:00 -0400 Subject: [PATCH 4/4] projection_width_scaled --- arcade/camera/camera_2d.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/arcade/camera/camera_2d.py b/arcade/camera/camera_2d.py index 5c433bd130..8070f324a2 100644 --- a/arcade/camera/camera_2d.py +++ b/arcade/camera/camera_2d.py @@ -369,7 +369,9 @@ def projection_width_scaled(self) -> float: If this isn't what you want, use projection_width instead. """ - return (self._projection_data.right - self._projection_data.left) / self._camera_data.zoom + _p = self._projection_data + left, right, _, _ = _p.lrbt + return (right - left) / self._camera_data.zoom @projection_width_scaled.setter def projection_width_scaled(self, _width: float) -> None: