Skip to content

Int rect properties #2482

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Jan 6, 2025
8 changes: 4 additions & 4 deletions arcade/camera/camera_2d.py
Original file line number Diff line number Diff line change
Expand Up @@ -262,8 +262,8 @@ def use(self) -> None:
_projection = generate_orthographic_matrix(self.projection_data, self.zoom)
_view = generate_view_matrix(self.view_data)

self._window.ctx.viewport = self.viewport.viewport
self._window.ctx.scissor = None if not self.scissor else self.scissor.viewport
self._window.ctx.viewport = self.viewport.lbwh_int
self._window.ctx.scissor = None if not self.scissor else self.scissor.lbwh_int
self._window.projection = _projection
self._window.view = _view

Expand Down Expand Up @@ -295,7 +295,7 @@ def project(self, world_coordinate: Point) -> Vec2:

return project_orthographic(
world_coordinate,
self.viewport.viewport,
self.viewport.lbwh_int,
_view,
_projection,
)
Expand All @@ -318,7 +318,7 @@ def unproject(self, screen_coordinate: Point) -> Vec3:

_projection = generate_orthographic_matrix(self.projection_data, self.zoom)
_view = generate_view_matrix(self.view_data)
return unproject_orthographic(screen_coordinate, self.viewport.viewport, _view, _projection)
return unproject_orthographic(screen_coordinate, self.viewport.lbwh_int, _view, _projection)

def equalise(self) -> None:
"""
Expand Down
4 changes: 2 additions & 2 deletions arcade/camera/default.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def use(self) -> None:
"""
self._ctx.current_camera = self

self._ctx.viewport = self.viewport.viewport # get the integer 4-tuple LBWH
self._ctx.viewport = self.viewport.lbwh_int # get the integer 4-tuple LBWH

self._ctx.view_matrix = Mat4()
self._ctx.projection_matrix = self._projection_matrix
Expand Down Expand Up @@ -121,7 +121,7 @@ def use(self) -> None:
cache's the window viewport to determine the projection matrix.
"""

viewport = self.viewport.viewport
viewport = self.viewport.lbwh_int
# If the viewport is correct and the default camera is in use,
# then don't waste time resetting the view and projection matrices
if self._ctx.viewport == viewport and self._ctx.current_camera == self:
Expand Down
8 changes: 4 additions & 4 deletions arcade/camera/orthographic.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,8 @@ def use(self) -> None:
_projection = generate_orthographic_matrix(self._projection, self._view.zoom)
_view = generate_view_matrix(self._view)

self._window.ctx.viewport = self.viewport.viewport
self._window.ctx.scissor = None if not self.scissor else self.scissor.viewport
self._window.ctx.viewport = self.viewport.lbwh_int
self._window.ctx.scissor = None if not self.scissor else self.scissor.lbwh_int
self._window.projection = _projection
self._window.view = _view

Expand Down Expand Up @@ -165,7 +165,7 @@ def project(self, world_coordinate: Point) -> Vec2:

return project_orthographic(
world_coordinate,
self.viewport.viewport,
self.viewport.lbwh_int,
_view,
_projection,
)
Expand All @@ -188,4 +188,4 @@ def unproject(self, screen_coordinate: Point) -> Vec3:

_projection = generate_orthographic_matrix(self._projection, self._view.zoom)
_view = generate_view_matrix(self._view)
return unproject_orthographic(screen_coordinate, self.viewport.viewport, _view, _projection)
return unproject_orthographic(screen_coordinate, self.viewport.lbwh_int, _view, _projection)
8 changes: 4 additions & 4 deletions arcade/camera/perspective.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,8 @@ def use(self) -> None:
_projection = generate_perspective_matrix(self._projection, self._view.zoom)
_view = generate_view_matrix(self._view)

self._window.ctx.viewport = self.viewport.viewport
self._window.ctx.scissor = None if not self.scissor else self.scissor.viewport
self._window.ctx.viewport = self.viewport.lbwh_int
self._window.ctx.scissor = None if not self.scissor else self.scissor.lbwh_int
self._window.projection = _projection
self._window.view = _view

Expand Down Expand Up @@ -196,7 +196,7 @@ def project(self, world_coordinate: Point) -> Vec2:
_projection = generate_perspective_matrix(self._projection, self._view.zoom)
_view = generate_view_matrix(self._view)

pos = project_perspective(Vec3(x, y, z), self.viewport.viewport, _view, _projection)
pos = project_perspective(Vec3(x, y, z), self.viewport.lbwh_int, _view, _projection)

return pos

Expand Down Expand Up @@ -228,5 +228,5 @@ def unproject(self, screen_coordinate: Point) -> Vec3:
_projection = generate_perspective_matrix(self._projection, self._view.zoom)
_view = generate_view_matrix(self._view)

pos = unproject_perspective(Vec3(x, y, z), self.viewport.viewport, _view, _projection)
pos = unproject_perspective(Vec3(x, y, z), self.viewport.lbwh_int, _view, _projection)
return pos
2 changes: 1 addition & 1 deletion arcade/gui/surface.py
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ def limit(self, rect: Rect | None = None):
round(w * self._pixel_ratio),
round(h * self._pixel_ratio),
)
self.fbo.viewport = viewport_rect.viewport
self.fbo.viewport = viewport_rect.lbwh_int

self._cam.projection.rect = LBWH(0, 0, w, h)
self._cam.viewport = viewport_rect
Expand Down
4 changes: 2 additions & 2 deletions arcade/types/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
from arcade.types.vector_like import AnchorPoint

# Rectangles
from arcade.types.rect import ViewportParams
from arcade.types.rect import IntRectParams
from arcade.types.rect import RectParams
from arcade.types.rect import RectKwargs

Expand All @@ -100,6 +100,7 @@
"AsFloat",
"BufferProtocol",
"Color",
"IntRectParams",
"IPoint",
"PathOr",
"PathOrTexture",
Expand All @@ -118,7 +119,6 @@
"XYWH",
"XYRR",
"Viewport",
"ViewportParams",
"RectParams",
"RectKwargs",
"Box",
Expand Down
23 changes: 19 additions & 4 deletions arcade/types/rect.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from arcade.types.vector_like import AnchorPoint, Point2

RectParams = tuple[AsFloat, AsFloat, AsFloat, AsFloat]
ViewportParams = tuple[int, int, int, int]
IntRectParams = tuple[int, int, int, int]


class RectKwargs(TypedDict):
Expand Down Expand Up @@ -624,10 +624,25 @@ def xyrr(self) -> RectParams:
return (self.x, self.y, self.width / 2, self.height / 2)

@property
def viewport(self) -> ViewportParams:
"""Provides a tuple in the format of (left, bottom, width, height), coerced to integers."""
def lbwh_int(self) -> IntRectParams:
"""Provides a tuple in the format of (left, bottom, width, height), casted to ints."""
return (int(self.left), int(self.bottom), int(self.width), int(self.height))

@property
def lrbt_int(self) -> IntRectParams:
"""Provides a tuple in the format of (left, right, bottom, top), casted to ints."""
return (int(self.left), int(self.right), int(self.bottom), int(self.top))

@property
def xywh_int(self) -> IntRectParams:
"""Provides a tuple in the format of (x, y, width, height), casted to ints."""
return (int(self.x), int(self.y), int(self.width), int(self.height))

@property
def xyrr_int(self) -> RectParams:
"""Provides a tuple in the format of (x, y, width / 2, height / 2), casted to ints."""
return (int(self.x), int(self.y), int(self.width) / 2, int(self.height) / 2)

@classmethod
def from_kwargs(cls, **kwargs: AsFloat) -> Rect:
"""Creates a new Rect from keyword arguments. Throws ValueError if not enough are provided.
Expand Down Expand Up @@ -803,7 +818,7 @@ def Viewport(left: int, bottom: int, width: int, height: int) -> Rect:


__all__ = [
"ViewportParams",
"IntRectParams",
"RectParams",
"RectKwargs",
"Rect",
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/camera/test_camera2d.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ def test_camera2d_init_uses_render_target_size(window: Window, width, height):
assert ortho_camera.viewport_width == width
assert ortho_camera.viewport_height == height

assert ortho_camera.viewport.viewport == (0, 0, width, height)
assert ortho_camera.viewport.lbwh_int == (0, 0, width, height)
assert ortho_camera.viewport_left == 0
assert ortho_camera.viewport_right == width
assert ortho_camera.viewport_bottom == 0
Expand All @@ -116,7 +116,7 @@ def test_camera2d_from_camera_data_uses_render_target_size(window: Window, width
assert ortho_camera.viewport_width == width
assert ortho_camera.viewport_height == height

assert ortho_camera.viewport.viewport == (0, 0, width, height)
assert ortho_camera.viewport.lbwh_int == (0, 0, width, height)
assert ortho_camera.viewport_left == 0
assert ortho_camera.viewport_right == width
assert ortho_camera.viewport_bottom == 0
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/camera/test_viewport_projector.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,6 @@ def test_viewport_projector_unproject(window: Window, wrld_pos: Point):
@pytest.mark.parametrize("viewport", [LBWH(0.0, 0.0, 100, 200), LBWH(100, 100, 20, 40), LBWH(300, 20, 20, 700)])
def test_viewport_projector_viewport(window: Window, viewport: Rect):
cam = camera.default.ViewportProjector()
assert cam.viewport.viewport == window.ctx.viewport
assert cam.viewport.lbwh_int == window.ctx.viewport
cam.viewport = viewport
assert cam.viewport == viewport
2 changes: 1 addition & 1 deletion tests/unit/rect/test_rect_creation_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ def test_kwargtangle_none_args():
_ = Rect.from_kwargs(left=0, bottom=0, width=None, height=0)

with pytest.raises(ValueError):
_ = Rect.from_kwargs(left=0, botto=None, width=0, height=0)
_ = Rect.from_kwargs(left=0, bottom=None, width=0, height=0)

with pytest.raises(ValueError):
_ = Rect.from_kwargs(left=None, bottom=0, width=0, height=0)
Expand Down
1 change: 0 additions & 1 deletion tests/unit/rect/test_rect_instances.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,6 @@ def test_views():
assert A_RECT.lbwh == (10, 10, 10, 10)
assert A_RECT.xyrr == (15, 15, 5, 5)
assert A_RECT.xywh == (15, 15, 10, 10)
assert A_RECT.viewport == (10, 10, 10, 10)


class SubclassedRect(Rect):
Expand Down
Loading